ZGlmZiAtLWdpdCBhL2xpYnBuZy9BTk5PVU5DRSBiL2xpYnBuZy9BTk5PVU5DRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGFlNzgzCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL0FOTk9VTkNFCkBAIC0wLDAgKzEsNTIgQEAKK0xpYnBuZyAxLjYuMjAgLSBEZWNlbWJlciAzLCAyMDE1CisKK1RoaXMgaXMgYSBwdWJsaWMgcmVsZWFzZSBvZiBsaWJwbmcsIGludGVuZGVkIGZvciB1c2UgaW4gcHJvZHVjdGlvbiBjb2Rlcy4KKworRmlsZXMgYXZhaWxhYmxlIGZvciBkb3dubG9hZDoKKworU291cmNlIGZpbGVzIHdpdGggTEYgbGluZSBlbmRpbmdzIChmb3IgVW5peC9MaW51eCkgYW5kIHdpdGggYQorImNvbmZpZ3VyZSIgc2NyaXB0CisKKyAgIGxpYnBuZy0xLjYuMjAudGFyLnh6IChMWk1BLWNvbXByZXNzZWQsIHJlY29tbWVuZGVkKQorICAgbGlicG5nLTEuNi4yMC50YXIuZ3oKKworU291cmNlIGZpbGVzIHdpdGggQ1JMRiBsaW5lIGVuZGluZ3MgKGZvciBXaW5kb3dzKSwgd2l0aG91dCB0aGUKKyJjb25maWd1cmUiIHNjcmlwdAorCisgICAvc2NyYXRjaC9nbGVubnJwL0xpYnBuZzE2L2xwbmcxNjIwLjd6ICAoTFpNQS1jb21wcmVzc2VkLCByZWNvbW1lbmRlZCkKKyAgIC9zY3JhdGNoL2dsZW5ucnAvTGlicG5nMTYvbHBuZzE2MjAuemlwCisKK090aGVyIGluZm9ybWF0aW9uOgorCisgICBsaWJwbmctMS42LjIwLVJFQURNRS50eHQKKyAgIGxpYnBuZy0xLjYuMjAtTElDRU5TRS50eHQKKyAgIGxpYnBuZy0xLjYuMjAtKi5hc2MgKGFybW9yZWQgZGV0YWNoZWQgR1BHIHNpZ25hdHVyZXMpCisKK0NoYW5nZXMgc2luY2UgdGhlIGxhc3QgcHVibGljIHJlbGVhc2UgKDEuNi4xOSk6CisgIEF2b2lkIHBvdGVudGlhbCBwb2ludGVyIG92ZXJmbG93L3VuZGVyZmxvdyBpbiBwbmdfaGFuZGxlX3NQTFQoKSBhbmQKKyAgICBwbmdfaGFuZGxlX3BDQUwoKSAoQnVnIHJlcG9ydCBieSBKb2huIFJlZ2VocikuCisgIEZpeGVkIGluY29ycmVjdCBpbXBsZW1lbnRhdGlvbiBvZiBwbmdfc2V0X1BMVEUoKSB0aGF0IHVzZXMgcG5nX3B0cgorICAgIG5vdCBpbmZvX3B0ciwgdGhhdCBsZWZ0IHBuZ19zZXRfUExURSgpIG9wZW4gdG8gdGhlIENWRS0yMDE1LTgxMjYKKyAgICB2dWxuZXJhYmlsaXR5LgorICBCYWNrcG9ydGVkIHRlc3RzIGZyb20gbGlicG5nLTEuNy4wYmV0YTY5LgorICBGaXhlZCBhbiBlcnJvciBpbiBoYW5kbGluZyBvZiBiYWQgemxpYiBDTUlORk8gZmllbGQgaW4gcG5nZml4LCBmb3VuZCBieQorICAgIEFtZXJpY2FuIEZ1enp5IExvcCwgcmVwb3J0ZWQgYnkgQnJpYW4gQ2FycGVudGVyLiAgaW5mbGF0ZSgpIGRvZXNuJ3QKKyAgICBpbW1lZGlhdGVseSBmYXVsdCBhIGJhZCBDTUlORk8gZmllbGQ7IGluc3RlYWQgYSAndG9vIGZhciBiYWNrJyBlcnJvcgorICAgIGhhcHBlbnMgbGF0ZXIgKGF0IGxlYXN0IHNvbWUgdGltZXMpLiAgcG5nZml4IGZhaWxlZCB0byBsaW1pdCBDTUlORk8gdG8KKyAgICB0aGUgYWxsb3dlZCB2YWx1ZXMgYnV0IHRoZW4gYXNzdW1lZCB0aGF0IHdpbmRvd19iaXRzIHdhcyBpbiByYW5nZSwKKyAgICB0cmlnZ2VyaW5nIGFuIGFzc2VydC4gVGhlIGJ1ZyBpcyBtb3N0bHkgaGFybWxlc3M7IHRoZSBQTkcgZmlsZSBjYW5ub3QKKyAgICBiZSBmaXhlZC4KKyAgSW4gbGlicG5nIDEuNiB6bGliIGluaXRpYWxpemF0aW9uIHdhcyBjaGFuZ2VkIHRvIHVzZSB0aGUgd2luZG93IHNpemUKKyAgICBpbiB0aGUgemxpYiBzdHJlYW0sIG5vdCBhIGZpeGVkIHZhbHVlLiBUaGlzIGNhdXNlcyBzb21lIGludmFsaWQgaW1hZ2VzLAorICAgIHdoZXJlIENJTkZPIGlzIHRvbyBsYXJnZSwgdG8gZGlzcGxheSAnY29ycmVjdGx5JyBpZiB0aGUgcmVzdCBvZiB0aGUKKyAgICBkYXRhIGlzIHZhbGlkLiAgVGhpcyBwcm92aWRlcyBhIHdvcmthcm91bmQgZm9yIHpsaWIgdmVyc2lvbnMgd2hlcmUgdGhlCisgICAgZXJyb3IgYXJpc2VzIChvbmVzIHRoYXQgc3VwcG9ydCB0aGUgQVBJIGNoYW5nZSB0byB1c2UgdGhlIHdpbmRvdyBzaXplCisgICAgaW4gdGhlIHN0cmVhbSkuCisKK1NlbmQgY29tbWVudHMvY29ycmVjdGlvbnMvY29tbWVuZGF0aW9ucyB0byBwbmctbW5nLWltcGxlbWVudCBhdCBsaXN0cy5zZi5uZXQKKyhzdWJzY3JpcHRpb24gcmVxdWlyZWQ7IHZpc2l0CitodHRwczovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9wbmctbW5nLWltcGxlbWVudAordG8gc3Vic2NyaWJlKQorb3IgdG8gZ2xlbm5ycCBhdCB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQKKworR2xlbm4gUi1QCmRpZmYgLS1naXQgYS9saWJwbmcvQW5kcm9pZC5tayBiL2xpYnBuZy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1OWI3M2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvQW5kcm9pZC5tawpAQCAtMCwwICsxLDk4IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworIyBXZSBuZWVkIHRvIGJ1aWxkIHRoaXMgZm9yIGJvdGggdGhlIGRldmljZSAoYXMgYSBzaGFyZWQgbGlicmFyeSkKKyMgYW5kIHRoZSBob3N0IChhcyBhIHN0YXRpYyBsaWJyYXJ5IGZvciB0b29scyB0byB1c2UpLgorCitjb21tb25fU1JDX0ZJTEVTIDo9IFwKKwlwbmcuYyBcCisJcG5nZXJyb3IuYyBcCisJcG5nZ2V0LmMgXAorCXBuZ21lbS5jIFwKKwlwbmdwcmVhZC5jIFwKKwlwbmdyZWFkLmMgXAorCXBuZ3Jpby5jIFwKKwlwbmdydHJhbi5jIFwKKwlwbmdydXRpbC5jIFwKKwlwbmdzZXQuYyBcCisJcG5ndHJhbnMuYyBcCisJcG5nd2lvLmMgXAorCXBuZ3dyaXRlLmMgXAorCXBuZ3d0cmFuLmMgXAorCXBuZ3d1dGlsLmMgXAorCitpZmVxICgkKEFSQ0hfQVJNX0hBVkVfTkVPTiksdHJ1ZSkKK215X2NmbGFnc19hcm0gOj0gLURQTkdfQVJNX05FT05fT1BUPTIKK2VuZGlmCisKK215X2NmbGFnc19hcm02NCA6PSAtRFBOR19BUk1fTkVPTl9PUFQ9MgorCisjIEJVRzogaHR0cDovL2xsdm0ub3JnL1BSMTk0NzIgLSBTTFAgdmVjdG9yaXphdGlvbiAob24gQVJNIGF0IGxlYXN0KSBjcmFzaGVzCisjIHdoZW4gd2UgY2FuJ3QgbG93ZXIgYSB2ZWN0b3JpemVkIGJzd2FwLgorbXlfY2ZsYWdzX2FybSArPSAtZm5vLXNscC12ZWN0b3JpemUKKworbXlfc3JjX2ZpbGVzX2FybSA6PSBcCisJCQlhcm0vYXJtX2luaXQuYyBcCisJCQlhcm0vZmlsdGVyX25lb24uUyBcCisJCQlhcm0vZmlsdGVyX25lb25faW50cmluc2ljcy5jCisKKworY29tbW9uX0NGTEFHUyA6PSAtc3RkPWdudTg5ICMtZnZpc2liaWxpdHk9aGlkZGVuICMjIC1mb21pdC1mcmFtZS1wb2ludGVyCisKKyMgRm9yIHRoZSBob3N0CisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY29tbW9uX1NSQ19GSUxFUykKK0xPQ0FMX0NGTEFHUyArPSAkKGNvbW1vbl9DRkxBR1MpCitMT0NBTF9BU0ZMQUdTICs9ICQoY29tbW9uX0FTRkxBR1MpCitMT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gJChMT0NBTF9QQVRIKQorTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJ6CitMT0NBTF9NT0RVTEU6PSBsaWJwbmcKK2luY2x1ZGUgJChCVUlMRF9IT1NUX1NUQVRJQ19MSUJSQVJZKQorCisKKyMgRm9yIHRoZSBkZXZpY2UgKHN0YXRpYykKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9DTEFORyA6PSB0cnVlCitMT0NBTF9TUkNfRklMRVMgOj0gJChjb21tb25fU1JDX0ZJTEVTKQorTE9DQUxfQ0ZMQUdTICs9ICQoY29tbW9uX0NGTEFHUykgLWZ0cmFwdgorTE9DQUxfQ0ZMQUdTX2FybSA6PSAkKG15X2NmbGFnc19hcm0pCitMT0NBTF9BU0ZMQUdTICs9ICQoY29tbW9uX0FTRkxBR1MpCitMT0NBTF9TUkNfRklMRVNfYXJtIDo9ICQobXlfc3JjX2ZpbGVzX2FybSkKK0xPQ0FMX0NGTEFHU19hcm02NCA6PSAkKG15X2NmbGFnc19hcm02NCkKK0xPQ0FMX1NSQ19GSUxFU19hcm02NCA6PSAkKG15X3NyY19maWxlc19hcm0pCitMT0NBTF9BRERSRVNTX1NBTklUSVpFUiA6PSBmYWxzZQorTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9ICQoTE9DQUxfUEFUSCkKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliegorTE9DQUxfTU9EVUxFOj0gbGlicG5nCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKKyMgRm9yIHRoZSBkZXZpY2UgKHNoYXJlZCkKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9DTEFORyA6PSB0cnVlCitMT0NBTF9TUkNfRklMRVMgOj0gJChjb21tb25fU1JDX0ZJTEVTKQorTE9DQUxfQ0ZMQUdTICs9ICQoY29tbW9uX0NGTEFHUykgLWZ0cmFwdgorTE9DQUxfQ0ZMQUdTX2FybSA6PSAkKG15X2NmbGFnc19hcm0pCitMT0NBTF9BU0ZMQUdTICs9ICQoY29tbW9uX0FTRkxBR1MpCitMT0NBTF9TUkNfRklMRVNfYXJtIDo9ICQobXlfc3JjX2ZpbGVzX2FybSkKK0xPQ0FMX0NGTEFHU19hcm02NCA6PSAkKG15X2NmbGFnc19hcm02NCkKK0xPQ0FMX1NSQ19GSUxFU19hcm02NCA6PSAkKG15X3NyY19maWxlc19hcm0pCitMT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gJChMT0NBTF9QQVRIKQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJ6CitMT0NBTF9NT0RVTEU6PSBsaWJwbmcKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworIyBGb3IgdGVzdGluZworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX0NMQU5HIDo9IHRydWUKK0xPQ0FMX1NSQ19GSUxFUzo9IHBuZ3Rlc3QuYworTE9DQUxfTU9EVUxFIDo9IHBuZ3Rlc3QKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVM6PSBsaWJwbmcgbGliegorTE9DQUxfTU9EVUxFX1RBR1MgOj0gZGVidWcKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvbGlicG5nL0NIQU5HRVMgYi9saWJwbmcvQ0hBTkdFUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODA5NGZkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL0NIQU5HRVMKQEAgLTAsMCArMSw1NDU2IEBACisjaWYgMAorQ0hBTkdFUyAtIGNoYW5nZXMgZm9yIGxpYnBuZworCit2ZXJzaW9uIDAuMSBbTWFyY2ggMjksIDE5OTVdCisgIGluaXRpYWwgd29yay1pbi1wcm9ncmVzcyByZWxlYXNlCisKK3ZlcnNpb24gMC4yIFtBcHJpbCAxLCAxOTk1XQorICBhZGRlZCByZWFkZXIgaW50byBwbmcuaAorICBmaXhlZCBzbWFsbCBwcm9ibGVtcyBpbiBzdHViIGZpbGUKKwordmVyc2lvbiAwLjMgW0FwcmlsIDgsIDE5OTVdCisgIGFkZGVkIHB1bGwgcmVhZGVyCisgIHNwbGl0IHVwIHBuZ3dyaXRlLmMgdG8gc2V2ZXJhbCBmaWxlcworICBhZGRlZCBwbmdsaWIudHh0CisgIGFkZGVkIGV4YW1wbGUuYworICBjbGVhbmVkIHVwIHdyaXRlciwgYWRkaW5nIGEgZmV3IG5ldyB0cmFuc2Zvcm1hdGlvbnMKKyAgZml4ZWQgc29tZSBidWdzIGluIHdyaXRlcgorICBpbnRlcmZhY2VkIHdpdGggemxpYiAwLjUKKyAgYWRkZWQgSyZSIHN1cHBvcnQKKyAgYWRkZWQgY2hlY2sgZm9yIDY0IEtCIGJsb2NrcyBmb3IgMTYgYml0IG1hY2hpbmVzCisKK3ZlcnNpb24gMC40IFtBcHJpbCAyNiwgMTk5NV0KKyAgY2xlYW5lZCB1cCBjb2RlIGFuZCBjb21tZW50ZWQgY29kZQorICBzaW1wbGlmaWVkIHRpbWUgaGFuZGxpbmcgaW50byBwbmdfdGltZQorICBjcmVhdGVkIHBuZ19jb2xvcl8xNiBhbmQgcG5nX2NvbG9yXzggdG8gaGFuZGxlIGNvbG9yIG5lZWRzCisgIGNsZWFuZWQgdXAgY29sb3IgdHlwZSBkZWZpbmVzCisgIGZpeGVkIHZhcmlvdXMgYnVncworICBtYWRlIHZhcmlvdXMgbmFtZXMgbW9yZSBjb25zaXN0ZW50CisgIGludGVyZmFjZWQgd2l0aCB6bGliIDAuNzEKKyAgY2xlYW5lZCB1cCB6VFh0IHJlYWRlciBhbmQgd3JpdGVyICh1c2luZyB6bGliJ3MgUmVzZXQgZnVuY3Rpb25zKQorICBzcGxpdCB0cmFuc2Zvcm1hdGlvbnMgaW50byBwbmdydHJhbi5jIGFuZCBwbmd3dHJhbi5jCisKK3ZlcnNpb24gMC41IFtBcHJpbCAzMCwgMTk5NV0KKyAgaW50ZXJmYWNlZCB3aXRoIHpsaWIgMC44CisgIGZpeGVkIG1hbnkgcmVhZGluZyBhbmQgd3JpdGluZyBidWdzCisgIHNhdmVkIHVzaW5nIDMgc3BhY2VzIGluc3RlYWQgb2YgdGFicworCit2ZXJzaW9uIDAuNiBbTWF5IDEsIDE5OTVdCisgIGZpcnN0IGJldGEgcmVsZWFzZQorICBhZGRlZCBwbmdfbGFyZ2VfbWFsbG9jKCkgYW5kIHBuZ19sYXJnZV9mcmVlKCkKKyAgYWRkZWQgcG5nX3NpemVfdAorICBjbGVhbmVkIHVwIHNvbWUgY29tcGlsZXIgd2FybmluZ3MKKyAgYWRkZWQgcG5nX3N0YXJ0X3JlYWRfaW1hZ2UoKQorCit2ZXJzaW9uIDAuNyBbSnVuZSAyNCwgMTk5NV0KKyAgY2xlYW5lZCB1cCBsb3RzIG9mIGJ1Z3MKKyAgZmluaXNoZWQgZGl0aGVyaW5nIGFuZCBvdGhlciBzdHVmZgorICBhZGRlZCB0ZXN0IHByb2dyYW0KKyAgY2hhbmdlZCBuYW1lIGZyb20gcG5nbGliIHRvIGxpYnBuZworCit2ZXJzaW9uIDAuNzEgW0p1bmUgMjYsIDE5OTVdCisgIGNoYW5nZWQgcG5ndGVzdC5wbmcgZm9yIHpsaWIgMC45MworICBmaXhlZCBlcnJvciBpbiBsaWJwbmcudHh0IGFuZCBleGFtcGxlLmMKKwordmVyc2lvbiAwLjggW0F1Z3VzdCAyMCwgMTk5NV0KKyAgY2xlYW5lZCB1cCBzb21lIGJ1Z3MKKyAgYWRkZWQgcG5nX3NldF9maWxsZXIoKQorICBzcGxpdCB1cCBwbmdzdHViLmMgaW50byBwbmdtZW0uYywgcG5naW8uYywgYW5kIHBuZ2Vycm9yLmMKKyAgYWRkZWQgI2RlZmluZSdzIHRvIHJlbW92ZSB1bndhbnRlZCBjb2RlCisgIG1vdmVkIHBuZ19pbmZvX2luaXQoKSB0byBwbmcuYworICBhZGRlZCBvbGRfc2l6ZSBpbnRvIHBuZ19yZWFsbG9jKCkKKyAgYWRkZWQgZnVuY3Rpb25zIHRvIG1hbnVhbGx5IHNldCBmaWx0ZXJpbmcgYW5kIGNvbXByZXNzaW9uIGluZm8KKyAgY2hhbmdlZCBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGJhc2VkIG9uIGltYWdlIHR5cGUKKyAgb3B0aW1pemVkIGZpbHRlciBzZWxlY3Rpb24gY29kZQorICBhZGRlZCB2ZXJzaW9uIGluZm8KKyAgY2hhbmdlZCBleHRlcm5hbCBmdW5jdGlvbnMgcGFzc2luZyBmbG9hdHMgdG8gZG91YmxlcyAoayZyIHByb2JsZW1zPykKKyAgcHV0IGFsbCB0aGUgY29uZmlndXJhYmxlIHN0dWZmIGluIHBuZ2NvbmYuaAorICBlbmFibGVkIHBuZ19zZXRfc2hpZnQgdG8gd29yayB3aXRoIHBhbGV0dGVkIGltYWdlcyBvbiByZWFkCisgIGFkZGVkIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCkgLSB1cGRhdGVzIGluZm8gc3RydWN0dXJlIHdpdGggdHJhbnNmb3JtYXRpb25zCisKK1ZlcnNpb24gMC44MSBbQXVndXN0LCAxOTk1XQorICBpbmNvcnBvcmF0ZWQgVGltIFdlZ25lcidzIG1lZGl1bSBtb2RlbCBjb2RlICh0aGFua3MsIFRpbSkKKworVmVyc2lvbiAwLjgyIFtTZXB0ZW1iZXIsIDE5OTVdCisgIFt1bnNwZWNpZmllZCBjaGFuZ2VzXQorCitWZXJzaW9uIDAuODUgW0RlY2VtYmVyLCAxOTk1XQorICBhZGRlZCBtb3JlIG1lZGl1bSBtb2RlbCBjb2RlIChhbG1vc3QgZXZlcnl0aGluZydzIGEgZmFyKQorICBhZGRlZCBpL28sIGVycm9yLCBhbmQgbWVtb3J5IGNhbGxiYWNrIGZ1bmN0aW9ucworICBmaXhlZCBzb21lIGJ1Z3MgKDE2LWJpdCwgNC1iaXQgaW50ZXJsYWNlZCwgZXRjLikKKyAgYWRkZWQgZmlyc3QgcnVuIHByb2dyZXNzaXZlIHJlYWRlciAoYmFyZWx5IHRlc3RlZCkKKworVmVyc2lvbiAwLjg2IFtKYW51YXJ5LCAxOTk2XQorICBmaXhlZCBidWdzCisgIGltcHJvdmVkIGRvY3VtZW50YXRpb24KKworVmVyc2lvbiAwLjg3IFtKYW51YXJ5LCAxOTk2XQorICBmaXhlZCBtZWRpdW0gbW9kZWwgYnVncworICBmaXhlZCBvdGhlciBidWdzIGludHJvZHVjZWQgaW4gMC44NSBhbmQgMC44NgorICBhZGRlZCBzb21lIG1pbm9yIGRvY3VtZW50YXRpb24KKworVmVyc2lvbiAwLjg4IFtKYW51YXJ5LCAxOTk2XQorICBmaXhlZCBwcm9ncmVzc2l2ZSBidWdzCisgIHJlcGxhY2VkIHRhYnMgd2l0aCBzcGFjZXMKKyAgY2xlYW5lZCB1cCBkb2N1bWVudGF0aW9uCisgIGFkZGVkIGNhbGxiYWNrcyBmb3IgcmVhZC93cml0ZSBhbmQgd2FybmluZy9lcnJvciBmdW5jdGlvbnMKKworVmVyc2lvbiAwLjg5IFtKdW5lIDUsIDE5OTZdCisgIEFkZGVkIG5ldyBpbml0aWFsaXphdGlvbiBBUEkgdG8gbWFrZSBsaWJwbmcgd29yayBiZXR0ZXIgd2l0aCBzaGFyZWQgbGlicworICAgIHdlIG5vdyBoYXZlIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoKSwgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QoKSwKKyAgICBwbmdfY3JlYXRlX2luZm9fc3RydWN0KCksIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCksIGFuZAorICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgpIGluc3RlYWQgb2YgdGhlIHNlcGFyYXRlIGNhbGxzIHRvCisgICAgbWFsbG9jIGFuZCBwbmdfcmVhZF9pbml0KCksIHBuZ19pbmZvX2luaXQoKSwgYW5kIHBuZ193cml0ZV9pbml0KCkKKyAgQ2hhbmdlZCB3YXJuaW5nL2Vycm9yIGNhbGxiYWNrIGZ1bmN0aW9ucyB0byBmaXggYnVnIC0gdGhpcyBtZWFucyB5b3UKKyAgICBzaG91bGQgdXNlIHRoZSBuZXcgaW5pdGlhbGl6YXRpb24gQVBJIGlmIHlvdSB3ZXJlIHVzaW5nIHRoZSBvbGQKKyAgICBwbmdfc2V0X21lc3NhZ2VfZm4oKSBjYWxscywgYW5kIHRoYXQgdGhlIG9sZCBBUEkgbm8gbG9uZ2VyIGV4aXN0cworICAgIHNvIHRoYXQgcGVvcGxlIGFyZSBhd2FyZSB0aGF0IHRoZXkgbmVlZCB0byBjaGFuZ2UgdGhlaXIgY29kZQorICBDaGFuZ2VkIGZpbHRlciBzZWxlY3Rpb24gQVBJIHRvIGFsbG93IHNlbGVjdGlvbiBvZiBtdWx0aXBsZSBmaWx0ZXJzCisgICAgc2luY2UgaXQgZGlkbid0IHdvcmsgaW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgbGlicG5nIGFueXdheXMKKyAgT3B0aW1pemVkIGZpbHRlciBzZWxlY3Rpb24gY29kZQorICBGaXhlZCBwbmdfc2V0X2JhY2tncm91bmQoKSB0byBhbGxvdyB1c2luZyBhbiBhcmJpdHJhcnkgUkdCIGNvbG9yIGZvcgorICAgIHBhbGV0dGVkIGltYWdlcworICBGaXhlZCBnYW1tYSBhbmQgYmFja2dyb3VuZCBjb3JyZWN0aW9uIGZvciBwYWxldHRlZCBpbWFnZXMsIHNvCisgICAgcG5nX2NvcnJlY3RfcGFsZXR0ZSBpcyBub3QgbmVlZGVkIHVubGVzcyB5b3UgYXJlIGNvcnJlY3RpbmcgYW4KKyAgICBleHRlcm5hbCBwYWxldHRlICh5b3Ugd2lsbCBuZWVkIHRvICNkZWZpbmUgUE5HX0NPUlJFQ1RfUEFMRVRURV9TVVBQT1JURUQKKyAgICBpbiBwbmdjb25mLmgpIC0gaWYgbm9ib2R5IHVzZXMgdGhpcywgaXQgbWF5IGRpc2FwcGVhciBpbiB0aGUgZnV0dXJlLgorICBGaXhlZCBidWcgd2l0aCBCb3JsYW5kIDY0SyBtZW1vcnkgYWxsb2NhdGlvbiAoQWxleGFuZGVyIExlaG1hbm4pCisgIEZpeGVkIGJ1ZyBpbiBpbnRlcmxhY2UgaGFuZGxpbmcgKFNtYXJhc2RlcmFnZCwgSSB0aGluaykKKyAgQWRkZWQgbW9yZSBlcnJvciBjaGVja2luZyBmb3Igd3JpdGluZyBhbmQgaW1hZ2UgdG8gcmVkdWNlIGludmFsaWQgZmlsZXMKKyAgU2VwYXJhdGVkIHJlYWQgYW5kIHdyaXRlIGZ1bmN0aW9ucyBzbyB0aGF0IHRoZXkgd29uJ3QgYm90aCBiZSBsaW5rZWQKKyAgICBpbnRvIGEgYmluYXJ5IHdoZW4gb25seSByZWFkaW5nIG9yIHdyaXRpbmcgZnVuY3Rpb25hbGl0eSBpcyB1c2VkCisgIE5ldyBwbmd0ZXN0IGltYWdlIGFsc28gaGFzIGludGVybGFjaW5nIGFuZCB6VFh0CisgIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiB0byByZWZsZWN0IG5ldyBBUEkKKworVmVyc2lvbiAwLjg5YyBbSnVuZSAxNywgMTk5Nl0KKyAgQnVnIGZpeGVzLgorCitWZXJzaW9uIDAuOTAgW0phbnVhcnksIDE5OTddCisgIE1hZGUgQ1JDIGVycm9ycy93YXJuaW5ncyBvbiBjcml0aWNhbCBhbmQgYW5jaWxsYXJ5IGNodW5rcyBjb25maWd1cmFibGUKKyAgbGlicG5nIHdpbGwgdXNlIHRoZSB6bGliIENSQyByb3V0aW5lcyBieSAoY29tcGlsZS10aW1lKSBkZWZhdWx0CisgIENoYW5nZWQgRE9TIHNtYWxsL21lZGl1bSBtb2RlbCBtZW1vcnkgc3VwcG9ydCAtIG5lZWRzIHpsaWIgMS4wNCAoVGltIFdlZ25lcikKKyAgQWRkZWQgZXh0ZXJuYWwgQysrIHdyYXBwZXIgc3RhdGVtZW50cyB0byBwbmcuaCAoR2lsbGVzIERhdXBoaW4pCisgIEFsbG93IFBORyBmaWxlIHRvIGJlIHJlYWQgd2hlbiBzb21lIG9yIGFsbCBvZiBmaWxlIHNpZ25hdHVyZSBoYXMgYWxyZWFkeQorICAgIGJlZW4gcmVhZCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbS4gICoqKipUaGlzIGFmZmVjdHMgdGhlIHNpemUKKyAgICBvZiBpbmZvX3N0cnVjdCBhbmQgaW52YWxpZGF0ZXMgYWxsIHByb2dyYW1zIHRoYXQgdXNlIGEgc2hhcmVkIGxpYnBuZyoqKioKKyAgRml4ZWQgcG5nX2ZpbGxlcigpIGRlY2xhcmF0aW9ucworICBGaXhlZD8gYmFja2dyb3VuZCBjb2xvciBjb252ZXJzaW9ucworICBGaXhlZCBvcmRlciBvZiBlcnJvciBmdW5jdGlvbiBwb2ludGVycyB0byBtYXRjaCBkb2N1bWVudGF0aW9uCisgIEN1cnJlbnQgY2h1bmsgbmFtZSBpcyBub3cgYXZhaWxhYmxlIGluIHBuZ19zdHJ1Y3QgdG8gcmVkdWNlIHRoZSBudW1iZXIKKyAgICBvZiBuZWFybHkgaWRlbnRpY2FsIGVycm9yIG1lc3NhZ2VzICh3aWxsIHNpbXBsaWZ5IG11bHRpLWxpbmd1YWwKKyAgICBzdXBwb3J0IHdoZW4gYXZhaWxhYmxlKQorICBUcnkgdG8gZ2V0IHJlYWR5IGZvciB1bmtub3duLWNodW5rIGNhbGxiYWNrIGZ1bmN0aW9uczoKKyAgICAtIHByZXZpb3VzbHkgcmVhZCBjcml0aWNhbCBjaHVua3MgYXJlIGZsYWdnZWQsIHNvIHRoZSBjaHVuayBoYW5kbGluZworICAgICAgcm91dGluZXMgY2FuIGRldGVybWluZSBpZiB0aGUgY2h1bmsgaXMgaW4gdGhlIHJpZ2h0IHBsYWNlCisgICAgLSBhbGwgY2h1bmsgaGFuZGxpbmcgcm91dGluZXMgaGF2ZSB0aGUgc2FtZSBwcm90b3R5cGVzLCBzbyB3ZSB3aWxsCisgICAgICBiZSBhYmxlIHRvIGhhbmRsZSBhbGwgY2h1bmtzIHZpYSBhIGNhbGxiYWNrIG1lY2hhbmlzbQorICBUcnkgdG8gZml4IExpbnV4ICJzZXRqbXAiIGJ1ZmZlciBzaXplIHByb2JsZW1zCisgIFJlbW92ZWQgcG5nX2xhcmdlX21hbGxvYywgcG5nX2xhcmdlX2ZyZWUsIGFuZCBwbmdfcmVhbGxvYyBmdW5jdGlvbnMuCisKK1ZlcnNpb24gMC45NSBbTWFyY2gsIDE5OTddCisgIEZpeGVkIGJ1ZyBpbiBwbmd3dXRpbC5jIGFsbG9jYXRpbmcgInVwX3JvdyIgdHdpY2UgYW5kICJhdmdfcm93IiBuZXZlcgorICBGaXhlZCBidWcgaW4gUE5HIGZpbGUgc2lnbmF0dXJlIGNvbXBhcmVzIHdoZW4gc3RhcnQgIT0gMAorICBDaGFuZ2VkIHBhcmFtZXRlciB0eXBlIG9mIHBuZ19zZXRfZmlsbGVyKC4uLmZpbGxlci4uLikgZnJvbSBwbmdfYnl0ZQorICAgIHRvIHBuZ191aW50XzMyCisgIEFkZGVkIHRlc3QgZm9yIE1BQ09TIHRvIGVuc3VyZSB0aGF0IGJvdGggbWF0aC5oIGFuZCBmcC5oIGFyZSBub3QgI2luY2x1ZGVkCisgIEFkZGVkIG1hY3JvcyBmb3IgbGlicG5nIHRvIGJlIGNvbXBpbGVkIGFzIGEgV2luZG93cyBETEwgKEFuZHJlYXMgS3VwcmllcykKKyAgQWRkZWQgInBhY2tzd2FwIiB0cmFuc2Zvcm1hdGlvbiwgd2hpY2ggY2hhbmdlcyB0aGUgZW5kaWFubmVzcyBvZgorICAgIHBhY2tlZC1waXhlbCBieXRlcyAoS2V2aW4gQnJhY2V5KQorICBBZGRlZCAic3RyaXBfYWxwaGEiIHRyYW5zZm9ybWF0aW9uLCB3aGljaCByZW1vdmVzIHRoZSBhbHBoYSBjaGFubmVsIG9mCisgICAgaW5wdXQgaW1hZ2VzIHdpdGhvdXQgdXNpbmcgaXQgKG5vdCBuZWNlc3NhcmlseSBhIGdvb2QgaWRlYSkKKyAgQWRkZWQgInN3YXBfYWxwaGEiIHRyYW5zZm9ybWF0aW9uLCB3aGljaCBwdXRzIHRoZSBhbHBoYSBjaGFubmVsIGluIGZyb250CisgICAgb2YgdGhlIGNvbG9yIGJ5dGVzIGluc3RlYWQgb2YgYWZ0ZXIKKyAgUmVtb3ZlZCBhbGwgaW1wbGljaXQgdmFyaWFibGUgdGVzdHMgd2hpY2ggYXNzdW1lIE5VTEwgPT0gMCAoSSB0aGluaykKKyAgQ2hhbmdlZCBzZXZlcmFsIHZhcmlhYmxlcyB0byAicG5nX3NpemVfdCIgdG8gc2hvdyAxNi8zMi1iaXQgbGltaXRhdGlvbnMKKyAgQWRkZWQgbmV3IHBDQUwgY2h1bmsgcmVhZC93cml0ZSBzdXBwb3J0CisgIEFkZGVkIGV4cGVyaW1lbnRhbCBmaWx0ZXIgc2VsZWN0aW9uIHdlaWdodGluZyAoR3JlZyBSb2Vsb2ZzKQorICBSZW1vdmVkIG9sZCBwbmdfc2V0X3JnYngoKSBhbmQgcG5nX3NldF94cmdiKCkgZnVuY3Rpb25zIHRoYXQgaGF2ZSBiZWVuCisgICAgb2Jzb2xldGUgZm9yIGFib3V0IDIgeWVhcnMgbm93ICh1c2UgcG5nX3NldF9maWxsZXIoKSBpbnN0ZWFkKQorICBBZGRlZCBtYWNyb3MgdG8gcmVhZCAxNi0gYW5kIDMyLWJpdCBpbnRzIGRpcmVjdGx5IGZyb20gYnVmZmVyLCB0byBiZQorICAgIHVzZWQgb25seSBvbiB0aG9zZSBzeXN0ZW1zIHRoYXQgc3VwcG9ydCBpdCAobmFtZWx5IFBvd2VyUEMgYW5kIDY4MHgwKQorICAgIFdpdGggc29tZSB0ZXN0aW5nLCB0aGlzIG1heSBiZWNvbWUgdGhlIGRlZmF1bHQgZm9yIE1BQ09TL1BQQyBzeXN0ZW1zLgorICBPbmx5IGNhbGN1bGF0ZSBDUkMgb24gZGF0YSBpZiB3ZSBhcmUgZ29pbmcgdG8gdXNlIGl0CisgIEFkZGVkIG1hY3JvcyBmb3IgelRYdCBjb21wcmVzc2lvbiB0eXBlIFBOR196VFh0X0NPTVBSRVNTSU9OXz8/PworICBBZGRlZCBtYWNyb3MgZm9yIHNpbXBsZSBsaWJwbmcgZGVidWdnaW5nIG91dHB1dCBzZWxlY3RhYmxlIGF0IGNvbXBpbGUgdGltZQorICBSZW1vdmVkIFBOR19SRUFEX0VORF9NT0RFIGluIHByb2dyZXNzaXZlIHJlYWRlciAoU21hcmFzZGVyYWdkKQorICBNb3JlIGRlc2NyaXB0aW9uIG9mIGluZm9fc3RydWN0IGluIGxpYnBuZy50eHQgYW5kIHBuZy5oCisgIE1vcmUgaW5zdHJ1Y3Rpb25zIGluIGV4YW1wbGUuYworICBNb3JlIGNodW5rIHR5cGVzIHRlc3RlZCBpbiBwbmd0ZXN0LmMKKyAgUmVuYW1lZCBwbmdyY2IuYyB0byBwbmdzZXQuYywgYW5kIGFsbCBwbmdfcmVhZF88Y2h1bms+IGZ1bmN0aW9ucyB0byBiZQorICAgIHBuZ19zZXRfPGNodW5rPi4gIFdlIG5vdyBoYXZlIGNvcnJlc3BvbmRpbmcgcG5nX2dldF88Y2h1bms+CisgICAgZnVuY3Rpb25zIGluIHBuZ2dldC5jIHRvIGdldCBpbmZvcm1hdGlvbiBpbiBpbmZvX3B0ci4gIFRoaXMgaXNvbGF0ZXMKKyAgICB0aGUgYXBwbGljYXRpb24gZnJvbSB0aGUgaW50ZXJuYWwgb3JnYW5pemF0aW9uIG9mIHBuZ19pbmZvX3N0cnVjdAorICAgIChnb29kIGZvciBzaGFyZWQgbGlicmFyeSBpbXBsZW1lbnRhdGlvbnMpLgorCitWZXJzaW9uIDAuOTYgW01heSwgMTk5N10KKyAgRml4ZWQgc2VyaW91cyBidWcgd2l0aCA8IDhicHAgaW1hZ2VzIGludHJvZHVjZWQgaW4gMC45NQorICBGaXhlZCAyNTYtY29sb3IgdHJhbnNwYXJlbmN5IGJ1ZyAoR3JlZyBSb2Vsb2ZzKQorICBGaXhlZCB1cCBkb2N1bWVudGF0aW9uIChHcmVnIFJvZWxvZnMsIExhc3psbyBOeXVsKQorICBGaXhlZCAiZXJyb3IiIGluIHBuZ2NvbmYuaCBmb3IgTGludXggc2V0am1wKCkgYmVoYXZpb3IKKyAgRml4ZWQgRE9TIG1lZGl1bSBtb2RlbCBzdXBwb3J0IChUaW0gV2VnbmVyKQorICBGaXhlZCBwbmdfY2hlY2tfa2V5d29yZCgpIGZvciBjYXNlIHdpdGggZXJyb3IgaW4gc3RhdGljIHN0cmluZyB0ZXh0CisgIEFkZGVkIHJlYWQgb2YgQ1JDIGFmdGVyIElFTkQgY2h1bmsgZm9yIGVtYmVkZGVkIFBOR3MgKExhc3psbyBOeXVsKQorICBBZGRlZCB0eXBlY2FzdHMgdG8gcXVpZXQgY29tcGlsZXIgZXJyb3JzCisgIEFkZGVkIG1vcmUgZGVidWdnaW5nIGluZm8KKworVmVyc2lvbiAwLjk3IFtKYW51YXJ5LCAxOTk4XQorICBSZW1vdmVkIFBOR19VU0VfT1dOX0NSQyBjYXBhYmlsaXR5CisgIFJlbG9jYXRlZCBwbmdfc2V0X2NyY19hY3Rpb24gZnJvbSBwbmdydXRpbC5jIHRvIHBuZ3J0cmFuLmMKKyAgRml4ZWQgdHlwZWNhc3RzIG9mICJuZXdfa2V5IiwgZXRjLiAoQW5kcmVhcyBEaWxnZXIpCisgIEFkZGVkIFJGQyAxMTUyIFtzaWNdIGRhdGUgc3VwcG9ydAorICBGaXhlZCBidWcgaW4gZ2FtbWEgaGFuZGxpbmcgb2YgNC1iaXQgZ3JheXNjYWxlCisgIEFkZGVkIDItYml0IGdyYXlzY2FsZSBnYW1tYSBoYW5kbGluZyAoR2xlbm4gUi1QKQorICBBZGRlZCBtb3JlIHR5cGVjYXN0cy4gNjU1MzZMIGJlY29tZXMgKHBuZ191aW50XzMyKTY1NTM2TCwgZXRjLiAoR2xlbm4gUi1QKQorICBNaW5vciBjb3JyZWN0aW9ucyBpbiBsaWJwbmcudHh0CisgIEFkZGVkIHNpbXBsZSBzUkdCIHN1cHBvcnQgKEdsZW5uIFItUCkKKyAgRWFzaWVyIGNvbmRpdGlvbmFsIGNvbXBpbGluZywgZS5nLiwKKyAgICBkZWZpbmUgUE5HX1JFQUQvV1JJVEVfTk9UX0ZVTExZX1NVUFBPUlRFRDsKKyAgICBhbGwgY29uZmlndXJhYmxlIG9wdGlvbnMgY2FuIGJlIHNlbGVjdGVkIGZyb20gY29tbWFuZC1saW5lIGluc3RlYWQKKyAgICBvZiBoYXZpbmcgdG8gZWRpdCBwbmdjb25mLmggKEdsZW5uIFItUCkKKyAgRml4ZWQgbWVtb3J5IGxlYWsgaW4gcG5nd3JpdGUuYyAoZnJlZSBpbmZvX3B0ci0+dGV4dCkgKEdsZW5uIFItUCkKKyAgQWRkZWQgbW9yZSBjb25kaXRpb25zIGZvciBwbmdfZG9fYmFja2dyb3VuZCwgdG8gYXZvaWQgY2hhbmdpbmcKKyAgICBibGFjayBwaXhlbHMgdG8gYmFja2dyb3VuZCB3aGVuIGEgYmFja2dyb3VuZCBpcyBzdXBwbGllZCBhbmQKKyAgICBubyBwaXhlbHMgYXJlIHRyYW5zcGFyZW50CisgIFJlcGFpcmVkIFBOR19OT19TVERJTyBiZWhhdmlvcgorICBUZXN0ZWQgTk9ESVYgc3VwcG9ydCBhbmQgbWFkZSBpdCBkZWZhdWx0IGJlaGF2aW9yIChHcmVnIFJvZWxvZnMpCisgIEFkZGVkICItbSIgb3B0aW9uIGFuZCBQTkdURVNUX0RFQlVHX01FTU9SWSB0byBwbmd0ZXN0IChKb2huIEJvd2xlcikKKyAgUmVndWxhcml6ZWQgdmVyc2lvbiBudW1iZXJpbmcgc2NoZW1lIGFuZCBidW1wZWQgc2hhcmVkLWxpYnJhcnkgbWFqb3IKKyAgICB2ZXJzaW9uIG51bWJlciB0byAyIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggbGlicG5nIDAuODkgYXBwcworICAgIChHcmVnIFJvZWxvZnMpCisKK1ZlcnNpb24gMC45OCBbSmFudWFyeSwgMTk5OF0KKyAgQ2xlYW5lZCB1cCBzb21lIHR5cG9zIGluIGxpYnBuZy50eHQgYW5kIGluIGNvZGUgZG9jdW1lbnRhdGlvbgorICBGaXhlZCBtZW1vcnkgbGVha3MgaW4gcENBTCBjaHVuayBwcm9jZXNzaW5nIChHbGVubiBSLVAgYW5kIEpvaG4gQm93bGVyKQorICBDb3NtZXRpYyBjaGFuZ2UgImRpc3BsYXlfZ2FtbWEiIHRvICJzY3JlZW5fZ2FtbWEiIGluIHBuZ3J0cmFuLmMKKyAgQ2hhbmdlZCByZWNvbW1lbmRhdGlvbiBhYm91dCBmaWxlX2dhbW1hIGZvciBQQyBpbWFnZXMgdG8gLjUxIGZyb20gLjQ1LAorICAgIGluIGV4YW1wbGUuYyBhbmQgbGlicG5nLnR4dCwgYWRkZWQgY29tbWVudHMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbgorICAgIHNjcmVlbl9nYW1tYSwgdmlld2luZ19nYW1tYSwgYW5kIGRpc3BsYXlfZ2FtbWEuCisgIENoYW5nZWQgYWxsIHJlZmVyZW5jZXMgdG8gUkZDMTE1MiB0byByZWFkIFJGQzExMjMgYW5kIGNoYW5nZWQgdGhlCisgICAgUE5HX1RJTUVfUkZDMTE1Ml9TVVBQT1JURUQgbWFjcm8gdG8gUE5HX1RJTUVfUkZDMTEyM19TVVBQT1JURUQKKyAgQWRkZWQgcG5nX2ludmVydF9hbHBoYSBjYXBhYmlsaXR5IChHbGVubiBSLVAgLS0gc3VnZ2VzdGlvbiBieSBKb24gVmluY2VudCkKKyAgQ2hhbmdlZCBzcmdiX2ludGVudCBmcm9tIHBuZ19ieXRlIHRvIGludCB0byBhdm9pZCBjb21waWxlciBidWdzCisKK1ZlcnNpb24gMC45OSBbSmFudWFyeSAzMCwgMTk5OF0KKyAgRnJlZSBpbmZvX3B0ci0+dGV4dCBpbnN0ZWFkIG9mIGVuZF9pbmZvX3B0ci0+dGV4dCBpbiBwbmdyZWFkLmMgKEpvaG4gQm93bGVyKQorICBGaXhlZCBhIGxvbmdzdGFuZGluZyAicGFja3N3YXAiIGJ1ZyBpbiBwbmd0cmFucy5jCisgIEZpeGVkIHNvbWUgaW5jb25zaXN0ZW5jaWVzIGluIHBuZ2NvbmYuaCB0aGF0IHByZXZlbnRlZCBjb21waWxpbmcgd2l0aAorICAgIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCBhbmQgUE5HX1JFQURfaElTVF9TVVBQT1JURUQgdW5kZWZpbmVkCisgIEZpeGVkIHNvbWUgdHlwb3MgYW5kIG1hZGUgb3RoZXIgbWlub3IgcmVhcnJhbmdlbWVudCBvZiBsaWJwbmcudHh0IChBbmRyZWFzKQorICBDaGFuZ2VkIHJlY29tbWVuZGF0aW9uIGFib3V0IGZpbGVfZ2FtbWEgZm9yIFBDIGltYWdlcyB0byAuNTAgZnJvbSAuNTEgaW4KKyAgICBleGFtcGxlLmMgYW5kIGxpYnBuZy50eHQsIGFuZCBjaGFuZ2VkIGZpbGVfZ2FtbWEgZm9yIHNSR0IgaW1hZ2VzIHRvIC40NQorICBBZGRlZCBhIG51bWJlciBvZiBmdW5jdGlvbnMgdG8gYWNjZXNzIGluZm9ybWF0aW9uIGZyb20gdGhlIHBuZyBzdHJ1Y3R1cmUKKyAgICBwbmdfZ2V0X2ltYWdlX2hlaWdodCgpLCBldGMuIChHbGVubiBSLVAsIHN1Z2dlc3Rpb24gYnkgQnJhZCBQZXR0aXQpCisgIEFkZGVkIFRBUkdFVF9NQUNPUyBzaW1pbGFyIHRvIHpsaWItMS4wLjgKKyAgRGVmaW5lIFBOR19BTFdBWVNfRVhURVJOIHdoZW4gX19NV0VSS1NfXyAmJiBXSU4zMiBhcmUgZGVmaW5lZAorICBBZGRlZCB0eXBlIGNhc3RpbmcgdG8gYWxsIHBuZ19tYWxsb2MoKSBmdW5jdGlvbiBjYWxscworCitWZXJzaW9uIDAuOTlhIFtKYW51YXJ5IDMxLCAxOTk4XQorICBBZGRlZCB0eXBlIGNhc3RzIGFuZCBwYXJlbnRoZXNlcyB0byBhbGwgcmV0dXJucyB0aGF0IHJldHVybiBhIHZhbHVlLihUaW0gVy4pCisKK1ZlcnNpb24gMC45OWIgW0ZlYnJ1YXJ5IDQsIDE5OThdCisgIEFkZGVkIHR5cGUgY2FzdCBwbmdfdWludF8zMiBvbiBtYWxsb2MgZnVuY3Rpb24gY2FsbHMgd2hlcmUgbmVlZGVkLgorICBDaGFuZ2VkIHR5cGUgb2YgbnVtX2hpc3QgZnJvbSBwbmdfdWludF8zMiB0byBpbnQgKHNhbWUgYXMgbnVtX3BhbGV0dGUpLgorICBBZGRlZCBjaGVja3MgZm9yIHJvd2J5dGVzIG92ZXJmbG93LCBpbiBjYXNlIHBuZ19zaXplX3QgaXMgbGVzcyB0aGFuIDMyIGJpdHMuCisgIFJlbmFtZWQgbWFrZWZpbGUuZWxmIHRvIG1ha2VmaWxlLmxueC4KKworVmVyc2lvbiAwLjk5YyBbRmVicnVhcnkgNywgMTk5OF0KKyAgTW9yZSB0eXBlIGNhc3RpbmcuICBSZW1vdmVkIGVycm9uZW91cyBvdmVyZmxvdyB0ZXN0IGluIHBuZ21lbS5jLgorICBBZGRlZCBwbmdfYnVmZmVyZWRfbWVtY3B5KCkgYW5kIHBuZ19idWZmZXJlZF9tZW1zZXQoKSwgYXBwbHkgdGhlbSB0byByb3dieXRlcy4KKyAgQWRkZWQgVU5JWCBtYW51YWwgcGFnZXMgbGlicG5nLjMgKGluY29ycG9yYXRpbmcgbGlicG5nLnR4dCkgYW5kICBwbmcuNS4KKworVmVyc2lvbiAwLjk5ZCBbRmVicnVhcnkgMTEsIDE5OThdCisgIFJlbmFtZWQgImZhcl90b19uZWFyKCkiICJwbmdfZmFyX3RvX25lYXIoKSIKKyAgUmV2aXNlZCBsaWJwbmcuMworICBWZXJzaW9uIDk5YyAiYnVmZmVyZWQiIG9wZXJhdGlvbnMgZGlkbid0IHdvcmsgYXMgaW50ZW5kZWQuICBSZXBsYWNlZCB0aGVtCisgICAgd2l0aCBwbmdfbWVtY3B5X2NoZWNrKCkgYW5kIHBuZ19tZW1zZXRfY2hlY2soKS4KKyAgQWRkZWQgbWFueSAiaWYgKHBuZ19wdHIgPT0gTlVMTCkgcmV0dXJuIiB0byBxdWVsbCBjb21waWxlciB3YXJuaW5ncyBhYm91dAorICAgIHVudXNlZCBwbmdfcHRyLCBtb3N0bHkgaW4gcG5nZ2V0LmMgYW5kIHBuZ3NldC5jLgorICBDaGVjayBmb3Igb3Zlcmxlbmd0aCB0Uk5TIGNodW5rIHByZXNlbnQgd2hlbiBpbmRleGVkLWNvbG9yIFBMVEUgaXMgcmVhZC4KKyAgQ2xlYW5lZCB1cCBzcGVsbGluZyBlcnJvcnMgaW4gbGlicG5nLjMvbGlicG5nLnR4dAorICBDb3JyZWN0ZWQgYSBwcm9ibGVtIHdpdGggcG5nX2dldF90Uk5TKCkgd2hpY2ggcmV0dXJuZWQgdW5kZWZpbmVkIHRyYW5zIGFycmF5CisKK1ZlcnNpb24gMC45OWUgW0ZlYnJ1YXJ5IDI4LCAxOTk4XQorICBDb3JyZWN0ZWQgcG5nX2dldF90Uk5TKCkgYWdhaW4uCisgIEFkZCBwYXJlbnRoZXNlcyBmb3IgZWFzaWVyIHJlYWRpbmcgb2YgcG5nZ2V0LmMsIGZpeGVkICJ8fCIgc2hvdWxkIGJlICImJiIuCisgIFRvdWNoZWQgdXAgZXhhbXBsZS5jIHRvIG1ha2UgbW9yZSBvZiBpdCBjb21waWxlYWJsZSwgYWx0aG91Z2ggdGhlIGVudGlyZQorICAgIGZpbGUgc3RpbGwgY2FuJ3QgYmUgY29tcGlsZWQgKFdpbGxlbSB2YW4gU2NoYWlrKQorICBGaXhlZCBhIGJ1ZyBpbiBwbmdfZG9fc2hpZnQoKSAoQnJ5YW4gVHNhaSkKKyAgQWRkZWQgYSBzcGFjZSBpbiBwbmcuaCBwcm90b3R5cGUgZm9yIHBuZ193cml0ZV9jaHVua19zdGFydCgpCisgIFJlcGxhY2VkIHBuZ3Rlc3QucG5nIHdpdGggb25lIGNyZWF0ZWQgd2l0aCB6bGliIDEuMS4xCisgIENoYW5nZWQgcG5ndGVzdCB0byByZXBvcnQgUEFTUyBldmVuIHdoZW4gZmlsZSBzaXplIGlzIGRpZmZlcmVudCAoSmVhbi1sb3VwIEcuKQorICBDb3JyZWN0ZWQgc29tZSBsb2dpYyBlcnJvcnMgaW4gcG5nX2RvX2ludmVydF9hbHBoYSgpIChDaHJpcyBQYXR0ZXJzb24pCisKK1ZlcnNpb24gMC45OWYgW01hcmNoIDUsIDE5OThdCisgIENvcnJlY3RlZCBhIGJ1ZyBpbiBwbmdwcmVhZCgpIGludHJvZHVjZWQgaW4gdmVyc2lvbiA5OWMgKEtldmluIEJyYWNleSkKKyAgTW92ZWQgbWFrZWZpbGVzIGludG8gYSAic2NyaXB0cyIgZGlyZWN0b3J5LCBhbmQgYWRkZWQgSU5TVEFMTCBpbnN0cnVjdGlvbiBmaWxlCisgIEFkZGVkIG1ha2VmaWxlLm9zMiBhbmQgcG5nb3MyLmRlZiAoQS4gWmFib2xvdG55KSBhbmQgbWFrZWZpbGUuczJ4IChXLiBTZWJvaykKKyAgQWRkZWQgcG9pbnRlcnMgdG8gIm5vdGUgb24gbGlicG5nIHZlcnNpb25zIiBpbiBtYWtlZmlsZS5sbnggYW5kIFJFQURNRQorICBBZGRlZCByb3cgY2FsbGJhY2sgZmVhdHVyZSB3aGVuIHJlYWRpbmcgYW5kIHdyaXRpbmcgbm9ucHJvZ3Jlc3NpdmUgcm93cworICAgIGFuZCBhZGRlZCBhIHRlc3Qgb2YgdGhpcyBmZWF0dXJlIGluIHBuZ3Rlc3QuYworICBBZGRlZCB1c2VyIHRyYW5zZm9ybSBjYWxsYmFja3MsIHdpdGggdGVzdCBvZiB0aGUgZmVhdHVyZSBpbiBwbmd0ZXN0LmMKKworVmVyc2lvbiAwLjk5ZyBbTWFyY2ggNiwgMTk5OCwgbW9ybmluZ10KKyAgTWlub3IgY2hhbmdlcyB0byBwbmd0ZXN0LmMgdG8gc3VwcHJlc3MgY29tcGlsZXIgd2FybmluZ3MuCisgIFJlbW92ZWQgImJldGEiIGxhbmd1YWdlIGZyb20gZG9jdW1lbnRhdGlvbi4KKworVmVyc2lvbiAwLjk5aCBbTWFyY2ggNiwgMTk5OCwgZXZlbmluZ10KKyAgTWlub3IgY2hhbmdlcyB0byBwcmV2aW91cyBtaW5vciBjaGFuZ2VzIHRvIHBuZ3Rlc3QuYworICBDaGFuZ2VkIFBOR19SRUFEX05PVF9GVUxMWV9TVVBQT1JURUQgdG8gUE5HX1JFQURfVFJBTlNGT1JNU19OT1RfU1VQUE9SVEVECisgICAgYW5kIGFkZGVkIFBOR19QUk9HUkVTU0lWRV9SRUFEX05PVF9TVVBQT1JURUQgbWFjcm8KKyAgQWRkZWQgdXNlciB0cmFuc2Zvcm0gY2FwYWJpbGl0eQorCitWZXJzaW9uIDEuMDAgW01hcmNoIDcsIDE5OThdCisgIENoYW5nZWQgc2V2ZXJhbCB0eXBlZGVmcyBpbiBwbmdydXRpbC5jCisgIEFkZGVkIG1ha2VmaWxlLndhdCAoUGF3ZWwgTXJvY2hlbiksIHVwZGF0ZWQgbWFrZWZpbGUudGMzIChXaWxsZW0gdmFuIFNjaGFpaykKKyAgUmVwbGFjZWQgIndoaWxlKDEpIiB3aXRoICJmb3IoOzspIgorICBBZGRlZCBQTkdBUkcoKSB0byBwcm90b3R5cGVzIGluIHBuZ3Rlc3QuYyBhbmQgcmVtb3ZlZCBzb21lIHByb3RvdHlwZXMKKyAgVXBkYXRlZCBzb21lIG9mIHRoZSBtYWtlZmlsZXMgKFRvbSBMYW5lKQorICBDaGFuZ2VkIHNvbWUgdHlwZWRlZnMgKHNfc3RhcnQsIGV0Yy4pIGluIHBuZ3J1dGlsLmMKKyAgRml4ZWQgZGltZW5zaW9ucyBvZiAic2hvcnRfbW9udGhzIiBhcnJheSBpbiBwbmd3cml0ZS5jCisgIFJlcGxhY2VkIGFuc2kya25yLmMgd2l0aCB0aGUgb25lIGZyb20ganBlZy12NgorCitWZXJzaW9uIDEuMC4wIFtNYXJjaCA4LCAxOTk4XQorICBDaGFuZ2VkIG5hbWUgZnJvbSAxLjAwIHRvIDEuMC4wIChBZGFtIENvc3RlbGxvKQorICBBZGRlZCBzbWFrZWZpbGUucHBjICh3aXRoIFNDT1BUSU9OUy5wcGMpIGZvciBBbWlnYSBQUEMgKEFuZHJlYXMgS2xlaW5lcnQpCisKK1ZlcnNpb24gMS4wLjBhIFtNYXJjaCA5LCAxOTk4XQorICBGaXhlZCB0aHJlZSBidWdzIGluIHBuZ3J0cmFuLmMgdG8gbWFrZSBnYW1tYStiYWNrZ3JvdW5kIGhhbmRsaW5nIGNvbnNpc3RlbnQKKyAgICAoR3JlZyBSb2Vsb2ZzKQorICBDaGFuZ2VkIGZvcm1hdCBvZiB0aGUgUE5HX0xJQlBOR19WRVIgaW50ZWdlciB0byB4eXl6eiBpbnN0ZWFkIG9mIHh5egorICAgIGZvciBtYWpvciwgbWlub3IsIGFuZCBidWdmaXggcmVsZWFzZXMuICBUaGlzIGlzIDEwMDAxLiAoQWRhbSBDb3N0ZWxsbywKKyAgICBUb20gTGFuZSkKKyAgTWFrZSBtb250aHMgcmFuZ2UgZnJvbSAxLTEyIGluIHBuZ19jb252ZXJ0X3RvX3JmYzExMjMKKworVmVyc2lvbiAxLjAuMGIgW01hcmNoIDEzLCAxOTk4XQorICBRdWlldGVkIGNvbXBpbGVyIGNvbXBsYWludHMgYWJvdXQgdHdvIGVtcHR5ICJmb3IiIGxvb3BzIGluIHBuZ3J1dGlsLmMKKyAgTWlub3IgY2hhbmdlcyB0byBtYWtlZmlsZS5zMngKKyAgUmVtb3ZlZCAjaWZkZWYvI2VuZGlmIGFyb3VuZCBhIHBuZ19mcmVlKCkgaW4gcG5ncmVhZC5jCisKK1ZlcnNpb24gMS4wLjEgW01hcmNoIDE0LCAxOTk4XQorICBDaGFuZ2VkIG1ha2VmaWxlLnMyeCB0byByZWR1Y2Ugc2VjdXJpdHkgcmlzayBvZiB1c2luZyBhIHJlbGF0aXZlIHBhdGhuYW1lCisgIEZpeGVkIHNvbWUgdHlwb3MgaW4gdGhlIGRvY3VtZW50YXRpb24gKEdyZWcpLgorICBGaXhlZCBhIHByb2JsZW0gd2l0aCB2YWx1ZSBvZiAiY2hhbm5lbHMiIHJldHVybmVkIGJ5IHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCkKKworVmVyc2lvbiAxLjAuMWEgW0FwcmlsIDIxLCAxOTk4XQorICBPcHRpbWl6ZWQgUGFldGggY2FsY3VsYXRpb25zIGJ5IHJlcGxhY2luZyBhYnMoKSBmdW5jdGlvbiBjYWxscyB3aXRoIGludHJpbnNpY3MKKyAgcGx1cyBvdGhlciBsb29wIG9wdGltaXphdGlvbnMuIEltcHJvdmVzIGF2ZyBkZWNvZGluZyBzcGVlZCBieSBhYm91dCAyMCUuCisgIENvbW1lbnRlZCBvdXQgaTM4NmlzdGljICJhbGlnbiIgY29tcGlsZXIgZmxhZ3MgaW4gbWFrZWZpbGUubG54LgorICBSZWR1Y2VkIHRoZSBkZWZhdWx0IHdhcm5pbmcgbGV2ZWwgaW4gc29tZSBtYWtlZmlsZXMsIHRvIG1ha2UgdGhlbSBjb25zaXN0ZW50LgorICBSZW1vdmVkIHJlZmVyZW5jZXMgdG8gSUpHIGFuZCBKUEVHIGluIHRoZSBhbnNpMmtuci5jIGNvcHlyaWdodCBzdGF0ZW1lbnQuCisgIEZpeGVkIGEgYnVnIGluIHBuZ19kb19zdHJpcF9maWxsZXIgd2l0aCBYWFJSR0dCQiA9PiBSUkdHQkIgdHJhbnNmb3JtYXRpb24uCisgIEFkZGVkIGdyYXlzY2FsZSBhbmQgMTYtYml0IGNhcGFiaWxpdHkgdG8gcG5nX2RvX3JlYWRfZmlsbGVyKCkuCisgIEZpeGVkIGEgYnVnIGluIHBuZ3NldC5jLCBpbnRyb2R1Y2VkIGluIHZlcnNpb24gMC45OWMsIHRoYXQgc2V0cyByb3dieXRlcworICAgIHRvbyBsYXJnZSB3aGVuIHdyaXRpbmcgYW4gaW1hZ2Ugd2l0aCBiaXRfZGVwdGggPCA4IChCb2IgRGVsbGFjYSkuCisgIENvcnJlY3RlZCBzb21lIGJ1Z3MgaW4gdGhlIGV4cGVyaW1lbnRhbCB3ZWlnaHRlZCBmaWx0ZXJpbmcgaGV1cmlzdGljcy4KKyAgTW92ZWQgYSBtaXNwbGFjZWQgcG5ncnV0aWwgY29kZSBibG9jayB0aGF0IHRydW5jYXRlcyB0Uk5TIGlmIGl0IGhhcyBtb3JlCisgICAgdGhhbiBudW1fcGFsZXR0ZSBlbnRyaWVzIC0tIHRlc3Qgd2FzIGRvbmUgYmVmb3JlIG51bV9wYWxldHRlIHdhcyBkZWZpbmVkLgorICBGaXhlZCBhIHBuZ19jb252ZXJ0X3RvX3JmYzExMjMoKSBidWcgdGhhdCBjb252ZXJ0cyBkYXkgMzEgdG8gMCAoU3RldmUgRWRkaW5zKS4KKyAgQ2hhbmdlZCBjb21waWxlciBmbGFncyBpbiBtYWtlZmlsZS53YXQgZm9yIGJldHRlciBvcHRpbWl6YXRpb24KKyAgICAoUGF3ZWwgTXJvY2hlbikuCisKK1ZlcnNpb24gMS4wLjFiIFtNYXkgMiwgMTk5OF0KKyAgUmVsb2NhdGVkIHBuZ19kb19ncmF5X3RvX3JnYigpIHdpdGhpbiBwbmdfZG9fcmVhZF90cmFuc2Zvcm1hdGlvbnMoKSAoR3JlZykuCisgIFJlbG9jYXRlZCB0aGUgcG5nX2NvbXBvc2l0ZSBtYWNyb3MgZnJvbSBwbmdydHJhbi5jIHRvIHBuZy5oIChHcmVnKS4KKyAgQWRkZWQgbWFrZWZpbGUuc2NvIChjb250cmlidXRlZCBieSBNaWtlIEhvcGtpcmspLgorICBGaXhlZCB0d28gYnVncyAobWlzc2luZyBkZWZpbml0aW9ucyBvZiAiaXN0b3AiKSBpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjAuMWEuCisgIEZpeGVkIGEgYnVnIGluIHBuZ3J0cmFuLmMgdGhhdCB3b3VsZCBzZXQgY2hhbm5lbHM9NSB1bmRlciBzb21lIGNpcmN1bXN0YW5jZXMuCisgIE1vcmUgd29yayBvbiB0aGUgUGFldGgtZmlsdGVyaW5nLCBhY2hpZXZpbmcgaW1wZXJjZXB0aWJsZSBzcGVlZHVwCisgICAgKEEgS2xlaW5lcnQpLgorICBNb3JlIHdvcmsgb24gbG9vcCBvcHRpbWl6YXRpb24gd2hpY2ggbWF5IGhlbHAgd2hlbiBjb21waWxlZCB3aXRoIEMrKworICAgIGNvbXBpbGVycy4KKyAgQWRkZWQgd2FybmluZ3Mgd2hlbiBwZW9wbGUgdHJ5IHRvIHVzZSB0cmFuc2Zvcm1zIHRoZXkndmUgZGVmaW5lZCBvdXQuCisgIENvbGxhcHNlZCA0ICJpIiBhbmQgImMiIGxvb3BzIGludG8gc2luZ2xlICJpIiBsb29wcyBpbiBwbmdydHJhbiBhbmQgcG5nd3RyYW4uCisgIFJldmlzZWQgcGFyYWdyYXBoIGFib3V0IHBuZ19zZXRfZXhwYW5kKCkgaW4gbGlicG5nLnR4dCBhbmQgbGlicG5nLjMgKEdyZWcpCisKK1ZlcnNpb24gMS4wLjFjIFtNYXkgMTEsIDE5OThdCisgIEZpeGVkIGEgYnVnIGluIHBuZ3J0cmFuLmMgKGludHJvZHVjZWQgaW4gbGlicG5nLTEuMC4xYSkgd2hlcmUgdGhlIG1hc2tzIGZvcgorICAgIGZpbGxlciBieXRlcyBzaG91bGQgaGF2ZSBiZWVuIDB4ZmYgaW5zdGVhZCBvZiAweGYuCisgIEFkZGVkIG1heF9waXhlbF9kZXB0aD0zMiBpbiBwbmdydXRpbC5jIHdoZW4gdXNpbmcgRklMTEVSIHdpdGggcGFsZXR0ZSBpbWFnZXMuCisgIE1vdmVkIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVEIGFuZCBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVECisgICAgb3V0IG9mIHRoZSBQTkdfV1JJVEVfVFJBTlNGT1JNU19OT1RfU1VQUE9SVEVEIGJsb2NrIG9mIHBuZ2NvbmYuaAorICBBZGRlZCAiUE5HX05PX1dSSVRFX1RSQU5TRk9STVMiIGV0Yy4sIGFzIGFsdGVybmF0aXZlcyBmb3IgKl9OT1RfU1VQUE9SVEVELAorICAgIGZvciBjb25zaXN0ZW5jeSwgaW4gcG5nY29uZi5oCisgIEFkZGVkIGluZGl2aWR1YWwgImlmbmRlZiBQTkdfTk9fW0NBUEFCSUxJVFldIiBpbiBwbmdjb25mLmggdG8gbWFrZSBpdCBlYXNpZXIKKyAgICB0byByZW1vdmUgdW53YW50ZWQgY2FwYWJpbGl0aWVzIHZpYSB0aGUgY29tcGlsZSBsaW5lCisgIE1hZGUgc29tZSBjb3JyZWN0aW9ucyB0byBncmFtbWFyICh3aGljaCwgaXQncykgaW4gZG9jdW1lbnRhdGlvbiAoR3JlZykuCisgIENvcnJlY3RlZCBleGFtcGxlLmMsIHVzZSBvZiByb3dfcG9pbnRlcnMgaW4gcG5nX3dyaXRlX2ltYWdlKCkuCisKK1ZlcnNpb24gMS4wLjFkIFtNYXkgMjQsIDE5OThdCisgIENvcnJlY3RlZCBzZXZlcmFsIHN0YXRlbWVudHMgdGhhdCB1c2VkIHNpZGUgZWZmZWN0cyBpbGxlZ2FsbHkgaW4gcG5ncnV0aWwuYworICAgIGFuZCBwbmd0cmFucy5jLCB0aGF0IHdlcmUgaW50cm9kdWNlZCBpbiB2ZXJzaW9uIDEuMC4xYgorICBSZXZpc2VkIHBuZ19yZWFkX3Jvd3MoKSB0byBhdm9pZCByZXBlYXRlZCBpZi10ZXN0aW5nIGZvciBOVUxMIChBIEtsZWluZXJ0KQorICBNb3JlIGNvcnJlY3Rpb25zIHRvIGV4YW1wbGUuYywgdXNlIG9mIHJvd19wb2ludGVycyBpbiBwbmdfd3JpdGVfaW1hZ2UoKQorICAgIGFuZCBwbmdfcmVhZF9yb3dzKCkuCisgIEFkZGVkIHBuZ2RsbC5tYWsgYW5kIHBuZ2RlZi5wYXMgdG8gc2NyaXB0cyBkaXJlY3RvcnksIGNvbnRyaWJ1dGVkIGJ5CisgICAgQm9iIERlbGxhY2EsIHRvIG1ha2UgYSBwbmczMmJkLmRsbCB3aXRoIEJvcmxhbmQgQysrIDQuNQorICBGaXhlZCBlcnJvciBpbiBleGFtcGxlLmMgd2l0aCBwbmdfc2V0X3RleHQ6IG51bV90ZXh0IGlzIDMsIG5vdCAyIChHdWlkbyBWLikKKyAgQ2hhbmdlZCBzZXZlcmFsIGxvb3BzIGZyb20gY291bnQtZG93biB0byBjb3VudC11cCwgZm9yIGNvbnNpc3RlbmN5LgorCitWZXJzaW9uIDEuMC4xZSBbSnVuZSA2LCAxOTk4XQorICBSZXZpc2VkIGxpYnBuZy50eHQgYW5kIGxpYnBuZy4zIGRlc2NyaXB0aW9uIG9mIHBuZ19zZXRfcmVhZHx3cml0ZV9mbigpLCBhbmQKKyAgICBhZGRlZCB3YXJuaW5ncyB3aGVuIHBlb3BsZSB0cnkgdG8gc2V0IHBuZ19yZWFkX2ZuIGFuZCBwbmdfd3JpdGVfZm4gaW4KKyAgICB0aGUgc2FtZSBzdHJ1Y3R1cmUuCisgIEFkZGVkIGEgdGVzdCBzdWNoIHRoYXQgcG5nX2RvX2dhbW1hIHdpbGwgYmUgZG9uZSB3aGVuIG51bV90cmFucz09MAorICAgIGZvciB0cnVlY29sb3IgaW1hZ2VzIHRoYXQgaGF2ZSBkZWZpbmVkIGEgYmFja2dyb3VuZC4gIFRoaXMgY29ycmVjdHMgYW4KKyAgICBlcnJvciB0aGF0IHdhcyBpbnRyb2R1Y2VkIGluIGxpYnBuZy0wLjkwIHRoYXQgY2FuIGNhdXNlIGdhbW1hIHByb2Nlc3NpbmcKKyAgICB0byBiZSBza2lwcGVkLgorICBBZGRlZCB0ZXN0cyBpbiBwbmcuaCB0byBpbmNsdWRlICJ0cmFucyIgYW5kICJ0cmFuc192YWx1ZXMiIGluIHN0cnVjdHVyZXMKKyAgICB3aGVuIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEIG9yIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQgaXMgZGVmaW5lZC4KKyAgQWRkIHBuZ19mcmVlKHBuZ19wdHItPnRpbWVfYnVmZmVyKSBpbiBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgpCisgIE1vdmVkIHBuZ19jb252ZXJ0X3RvX3JmY18xMTIzKCkgZnJvbSBwbmd3cml0ZS5jIHRvIHBuZy5jCisgIEFkZGVkIGNhcGFiaWxpdHkgZm9yIHVzZXItcHJvdmlkZWQgbWFsbG9jX2ZuKCkgYW5kIGZyZWVfZm4oKSBmdW5jdGlvbnMsCisgICAgYW5kIHJldmlzZWQgcG5ndGVzdC5jIHRvIGRlbW9uc3RyYXRlIHRoZWlyIHVzZSwgcmVwbGFjaW5nIHRoZQorICAgIFBOR1RFU1RfREVCVUdfTUVNIGZlYXR1cmUuCisgIEFkZGVkIG1ha2VmaWxlLnczMiwgZm9yIE1pY3Jvc29mdCBDKysgNC4wIGFuZCBsYXRlciAoVGltIFdlZ25lcikuCisKK1ZlcnNpb24gMS4wLjIgW0p1bmUgMTQsIDE5OThdCisgIEZpeGVkIHR3byBidWdzIGluIG1ha2VmaWxlLmJvciAuCisKK1ZlcnNpb24gMS4wLjJhIFtEZWNlbWJlciAzMCwgMTk5OF0KKyAgUmVwbGFjZWQgYW5kIGV4dGVuZGVkIGNvZGUgdGhhdCB3YXMgcmVtb3ZlZCBmcm9tIHBuZ19zZXRfZmlsbGVyKCkgaW4gMS4wLjFhLgorICBGaXhlZCBhIGJ1ZyBpbiBwbmdfZG9fZmlsbGVyKCkgdGhhdCBtYWRlIGl0IGZhaWwgdG8gd3JpdGUgZmlsbGVyIGJ5dGVzIGluCisgICAgdGhlIGxlZnQtbW9zdCBwaXhlbCBvZiBlYWNoIHJvdyAoS2V2aW4gQnJhY2V5KS4KKyAgQ2hhbmdlZCAic3RhdGljIHBuZ2NoYXJwIHRJTUVfc3RyaW5nIiB0byAic3RhdGljIGNoYXIgdElNRV9zdHJpbmdbMzBdIgorICAgIGluIHBuZ3Rlc3QuYyAoRHVuY2FuIFNpbXBzb24pLgorICBGaXhlZCBhIGJ1ZyBpbiBwbmd0ZXN0LmMgdGhhdCBjYXVzZWQgcG5ndGVzdCB0byB0cnkgdG8gd3JpdGUgYSB0SU1FIGNodW5rCisgICAgZXZlbiB3aGVuIG5vIHRJTUUgY2h1bmsgd2FzIHByZXNlbnQgaW4gdGhlIHNvdXJjZSBmaWxlLgorICBGaXhlZCBhIHByb2JsZW0gaW4gcG5ncnV0aWwuYzogZ3JheV90b19yZ2IgZGlkbid0IGFsd2F5cyB3b3JrIHdpdGggMTYtYml0LgorICBGaXhlZCBhIHByb2JsZW0gaW4gcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KCksIHdoaWNoIHdvdWxkIG5vdCBza2lwIHNvbWUKKyAgICBwYXNzZXMgdGhhdCBpdCBzaG91bGQgc2tpcCwgZm9yIGltYWdlcyB0aGF0IGFyZSBsZXNzIHRoYW4gMyBwaXhlbHMgaGlnaC4KKyAgSW50ZXJjaGFuZ2VkIHRoZSBvcmRlciBvZiBjYWxscyB0byBwbmdfZG9fc3dhcCgpIGFuZCBwbmdfZG9fc2hpZnQoKQorICAgIGluIHBuZ3d0cmFuLmMgKEpvaG4gQ3JvbWVyKS4KKyAgQWRkZWQgI2lmZGVmIFBOR19ERUJVRy8jZW5kaWYgc3Vycm91bmRpbmcgdXNlIG9mIFBOR19ERUJVRyBpbiBwbmcuaCAuCisgIENoYW5nZWQgImJhZCBhZGFwdGl2ZSBmaWx0ZXIgdHlwZSIgZnJvbSBlcnJvciB0byB3YXJuaW5nIGluIHBuZ3J1dGlsLmMgLgorICBGaXhlZCBhIGRvY3VtZW50YXRpb24gZXJyb3IgYWJvdXQgZGVmYXVsdCBmaWx0ZXJpbmcgd2l0aCA4LWJpdCBpbmRleGVkLWNvbG9yLgorICBTZXBhcmF0ZWQgdGhlIFBOR19OT19TVERJTyBtYWNybyBpbnRvIFBOR19OT19TVERJTyBhbmQgUE5HX05PX0NPTlNPTEVfSU8KKyAgICAoTC4gUGV0ZXIgRGV1dHNjaCkuCisgIEFkZGVkIHBuZ19zZXRfcmdiX3RvX2dyYXkoKSBhbmQgcG5nX2dldF9yZ2JfdG9fZ3JheV9zdGF0dXMoKSBmdW5jdGlvbnMuCisgIEFkZGVkIHBuZ19nZXRfY29weXJpZ2h0KCkgYW5kIHBuZ19nZXRfaGVhZGVyX3ZlcnNpb24oKSBmdW5jdGlvbnMuCisgIFJldmlzZWQgY29tbWVudHMgb24gcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKCkgaW4gbGlicG5nLnR4dCBhbmQgZXhhbXBsZS5jCisgIEFkZGVkIGluZm9ybWF0aW9uIGFib3V0IGRlYnVnZ2luZyBpbiBsaWJwbmcudHh0IGFuZCBsaWJwbmcuMyAuCisgIENoYW5nZWQgImxuIC1zZiIgdG8gImxuIC1zIC1mIiBpbiBtYWtlZmlsZS5zMngsIG1ha2VmaWxlLmxueCwgYW5kCisgICAgbWFrZWZpbGUuc2NvLgorICBSZW1vdmVkIGxpbmVzIGFmdGVyIER5bmFtaWMgRGVwZW5kZW5jaWVzIiBpbiBtYWtlZmlsZS5hY28gLgorICBSZXZpc2VkIG1ha2VmaWxlLmRlYyB0byBtYWtlIGEgc2hhcmVkIGxpYnJhcnkgKEplcmVtaWUgUGV0aXQpLgorICBSZW1vdmVkIHRyYWlsaW5nIGJsYW5rcyBmcm9tIGFsbCBmaWxlcy4KKworVmVyc2lvbiAxLjAuMmEgW0phbnVhcnkgNiwgMTk5OV0KKyAgUmVtb3ZlZCBtaXNwbGFjZWQgI2VuZGlmIGFuZCAjaWZkZWYgUE5HX05PX0VYVEVSTiBuZWFyIHRoZSBlbmQgb2YgcG5nLmgKKyAgQWRkZWQgImlmIiB0ZXN0cyB0byBzaWxlbmNlIGNvbXBsYWludHMgYWJvdXQgdW51c2VkIHBuZ19wdHIgaW4gcG5nLmggYW5kIHBuZy5jCisgIENoYW5nZWQgImNoZWNrX2lmX3BuZyIgZnVuY3Rpb24gaW4gZXhhbXBsZS5jIHRvIHJldHVybiB0cnVlIChub256ZXJvKSBpZiBQTkcuCisgIENoYW5nZWQgbGlicG5nLnR4dCB0byBkZW1vbnN0cmF0ZSBwbmdfc2lnX2NtcCgpIGluc3RlYWQgb2YgcG5nX2NoZWNrX3NpZygpCisgICAgd2hpY2ggaXMgb2Jzb2xldGUuCisKK1ZlcnNpb24gMS4wLjMgW0phbnVhcnkgMTQsIDE5OTldCisgIEFkZGVkIG1ha2VmaWxlLmh1eCwgZm9yIEhld2xldHQgUGFja2FyZCBIUFVYIDEwLjIwIGFuZCAxMS4wMCAoSmltIFJpY2UpCisgIEFkZGVkIGEgc3RhdGVtZW50IG9mIFkySyBjb21wbGlhbmNlIGluIHBuZy5oLCBsaWJwbmcuMywgYW5kIFkyS0lORk8uCisKK1ZlcnNpb24gMS4wLjNhIFtBdWd1c3QgMTIsIDE5OTldCisgIEFkZGVkIGNoZWNrIGZvciBQTkdfUkVBRF9JTlRFUkxBQ0VfU1VQUE9SVEVEIGluIHBuZ3JlYWQuYzsgaXNzdWUgYSB3YXJuaW5nCisgICAgaWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHJlYWQgYW4gaW50ZXJsYWNlZCBpbWFnZSB3aGVuIGl0J3Mgbm90IHN1cHBvcnRlZC4KKyAgQWRkZWQgY2hlY2sgaWYgcG5nX3B0ci0+dHJhbnMgaXMgZGVmaW5lZCBiZWZvcmUgZnJlZWluZyBpdCBpbiBwbmdyZWFkLmMKKyAgTW9kaWZpZWQgdGhlIFkySyBzdGF0ZW1lbnQgdG8gaW5jbHVkZSB2ZXJzaW9ucyBiYWNrIHRvIHZlcnNpb24gMC43MQorICBGaXhlZCBhIGJ1ZyBpbiB0aGUgY2hlY2sgZm9yIHZhbGlkIElIRFIgYml0X2RlcHRoL2NvbG9yX3R5cGVzIGluIHBuZ3J1dGlsLmMKKyAgTW9kaWZpZWQgbWFrZWZpbGUud2F0IChhZGRlZCAtenA4IGZsYWcsICIuc3ltYm9saWMiLCBjaGFuZ2VkIHNvbWUgY29tbWVudHMpCisgIFJlcGxhY2VkIGxlYWRpbmcgYmxhbmtzIHdpdGggdGFiIGNoYXJhY3RlcnMgaW4gbWFrZWZpbGUuaHV4CisgIENoYW5nZWQgImR3b3JraW4ud3VzdGwuZWR1IiB0byAiY2NyYy53dXN0bC5lZHUiIGluIHZhcmlvdXMgZG9jdW1lbnRzLgorICBDaGFuZ2VkIChmbG9hdClyZWQgYW5kIChmbG9hdClncmVlbiB0byAoZG91YmxlKXJlZCwgKGRvdWJsZSlncmVlbgorICAgIGluIHBuZ19zZXRfcmdiX3RvX2dyYXkoKSB0byBhdm9pZCAicHJvbW90aW9uIiBwcm9ibGVtcyBpbiBBSVguCisgIEZpeGVkIGEgYnVnIGluIHBuZ2NvbmYuaCB0aGF0IG9taXR0ZWQgPHN0ZGlvLmg+IHdoZW4gUE5HX0RFQlVHPT0wIChLIEJyYWNleSkuCisgIFJlZm9ybWF0dGVkIGxpYnBuZy4zIGFuZCBsaWJwbmdwZi4zIHdpdGggcHJvcGVyIGZvbnRzIChzY3JpcHQgYnkgSi4gdmFuWmFuZHQpLgorICBVcGRhdGVkIGRvY3VtZW50YXRpb24gdG8gcmVmZXIgdG8gdGhlIFBORy0xLjIgc3BlY2lmaWNhdGlvbi4KKyAgUmVtb3ZlZCBhbnNpMmtuci5jIGFuZCBsZWZ0IHBvaW50ZXJzIHRvIHRoZSBsYXRlc3Qgc291cmNlIGZvciBhbnNpMmtuci5jCisgICAgaW4gbWFrZWZpbGUua25yLCBJTlNUQUxMLCBhbmQgUkVBRE1FIChMLiBQZXRlciBEZXV0c2NoKQorICBGaXhlZCBidWdzIGluIGNhbGN1bGF0aW9uIG9mIHRoZSBsZW5ndGggb2Ygcm93Ynl0ZXMgd2hlbiBhZGRpbmcgYWxwaGEKKyAgICBjaGFubmVscyB0byAxNi1iaXQgaW1hZ2VzLCBpbiBwbmdydHJhbi5jIChDaHJpcyBOb2tsZWJlcmcpCisgIEFkZGVkIGZ1bmN0aW9uIHBuZ19zZXRfdXNlcl90cmFuc2Zvcm1faW5mbygpIHRvIHN0b3JlIHVzZXJfdHJhbnNmb3JtX3B0ciwKKyAgICB1c2VyX2RlcHRoLCBhbmQgdXNlcl9jaGFubmVscyBpbnRvIHRoZSBwbmdfc3RydWN0LCBhbmQgYSBmdW5jdGlvbgorICAgIHBuZ19nZXRfdXNlcl90cmFuc2Zvcm1fcHRyKCkgdG8gcmV0cmlldmUgdGhlIHBvaW50ZXIgKENocmlzIE5va2xlYmVyZykKKyAgQWRkZWQgZnVuY3Rpb24gcG5nX3NldF9lbXB0eV9wbHRlX3Blcm1pdHRlZCgpIHRvIG1ha2UgbGlicG5nIHVzZWFibGUKKyAgICBpbiBNTkcgYXBwbGljYXRpb25zLgorICBDb3JyZWN0ZWQgdGhlIHR5cGVkZWYgZm9yIHBuZ19mcmVlX3B0ciBpbiBwbmcuaCAoSmVzc2UgSm9uZXMpLgorICBDb3JyZWN0IGdhbW1hIHdpdGggc3JnYiBpcyA0NTQ1NSBpbnN0ZWFkIG9mIDQ1MDAwIGluIHBuZ3J1dGlsLmMsIHRvIGJlCisgICAgY29uc2lzdGVudCB3aXRoIFBORy0xLjIsIGFuZCBhbGxvdyB2YXJpYW5jZSBvZiA1MDAgYmVmb3JlIGNvbXBsYWluaW5nLgorICBBZGRlZCBhc3NlbWJsZXIgY29kZSBjb250cmlidXRlZCBieSBJbnRlbCBpbiBmaWxlIHBuZ3ZjcmQuYyBhbmQgbW9kaWZpZWQKKyAgICBtYWtlZmlsZS53MzIgdG8gdXNlIGl0IChOaXJhdiBDaGhhdHJhcGF0aSwgSU5URUwgQ29ycG9yYXRpb24sCisgICAgR2lsbGVzIFZvbGxhbnQpCisgIENoYW5nZWQgImxuIC1zIC1mIiB0byAibG4gLWYgLXMiIGluIHRoZSBtYWtlZmlsZXMgdG8gbWFrZSBTb2xhcmlzIGhhcHB5LgorICBBZGRlZCBzb21lIGFsaWFzZXMgZm9yIHBuZ19zZXRfZXhwYW5kKCkgaW4gcG5ncnRyYW4uYywgbmFtZWx5CisgICAgcG5nX3NldF9leHBhbmRfUExURSgpLCBwbmdfc2V0X2V4cGFuZF9kZXB0aCgpLCBhbmQgcG5nX3NldF9leHBhbmRfdFJOUygpCisgICAgKEdyZWcgUm9lbG9mcywgaW4gIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUiKS4KKyAgQWRkZWQgbWFrZWZpbGUuYmVvIGZvciBCRU9TIG9uIFg4NiwgY29udHJpYnV0ZWQgYnkgU2FuZGVyIFN0b2suCisKK1ZlcnNpb24gMS4wLjNiIFtBdWd1c3QgMjYsIDE5OTldCisgIFJlcGxhY2VkIDIxNDc0ODM2NDdMIHNldmVyYWwgcGxhY2VzIHdpdGggUE5HX01BWF9VSU5UIG1hY3JvLCBkZWZpbmVkIGluIHBuZy5oCisgIENoYW5nZWQgbGVhZGluZyBibGFua3MgdG8gdGFicyBpbiBhbGwgbWFrZWZpbGVzLgorICBEZWZpbmUgUE5HX1VTRV9QTkdWQ1JEIGluIG1ha2VmaWxlLnczMiwgdG8gZ2V0IE1NWCBhc3NlbWJsZXIgY29kZS4KKyAgTWFkZSBhbHRlcm5hdGUgdmVyc2lvbnMgb2YgIHBuZ19zZXRfZXhwYW5kKCkgaW4gcG5ncnRyYW4uYywgbmFtZWx5CisgICAgcG5nX3NldF9ncmF5XzFfMl80X3RvXzgsIHBuZ19zZXRfcGFsZXR0ZV90b19yZ2IsIGFuZCBwbmdfc2V0X3RSTlNfdG9fYWxwaGEKKyAgICAoR3JlZyBSb2Vsb2ZzLCBpbiAiUE5HOiBUaGUgRGVmaW5pdGl2ZSBHdWlkZSIpLiAgRGVsZXRlZCB0aGUgMS4wLjNhIGFsaWFzZXMuCisgIFJlbG9jYXRlZCBzdGFydCBvZiAnZXh0ZXJuICJDIicgYmxvY2sgaW4gcG5nLmggc28gaXQgZG9lc24ndCBpbmNsdWRlIHBuZ2NvbmYuaAorICBSZXZpc2VkIGNhbGN1bGF0aW9uIG9mIG51bV9ibG9ja3MgaW4gcG5nbWVtLmMgdG8gYXZvaWQgYSBwb3RlbnRpYWxseQorICAgIG5lZ2F0aXZlIHNoaWZ0IGRpc3RhbmNlLCB3aG9zZSByZXN1bHRzIGFyZSB1bmRlZmluZWQgaW4gdGhlIEMgbGFuZ3VhZ2UuCisgIEFkZGVkIGEgY2hlY2sgaW4gcG5nc2V0LmMgdG8gcHJldmVudCB3cml0aW5nIG11bHRpcGxlIHRJTUUgY2h1bmtzLgorICBBZGRlZCBhIGNoZWNrIGluIHBuZ3dyaXRlLmMgdG8gZGV0ZWN0IGludmFsaWQgc21hbGwgd2luZG93X2JpdHMgc2l6ZXMuCisKK1ZlcnNpb24gMS4wLjNkIFtTZXB0ZW1iZXIgNCwgMTk5OV0KKyAgRml4ZWQgdHlwZSBjYXN0aW5nIG9mIGlnYW1tYSBpbiBwbmdydXRpbC5jCisgIEFkZGVkIG5ldyBwbmdfZXhwYW5kIGZ1bmN0aW9ucyB0byBzY3JpcHRzL3BuZ2RlZi5wYXMgYW5kIHBuZ29zMi5kZWYKKyAgQWRkZWQgYSBkZW1vIHJlYWRfdXNlcl90cmFuc2Zvcm1fZm4gdGhhdCBleGFtaW5lcyB0aGUgcm93IGZpbHRlcnMgaW4gcG5ndGVzdC5jCisKK1ZlcnNpb24gMS4wLjQgW1NlcHRlbWJlciAyNCwgMTk5OSwgbm90IGRpc3RyaWJ1dGVkIHB1YmxpY2x5XQorICBEZWZpbmUgUE5HX0FMV0FZU19FWFRFUk4gaW4gcG5nY29uZi5oIGlmIF9fU1REQ19fIGlzIGRlZmluZWQKKyAgRGVsZXRlICNkZWZpbmUgUE5HX0lOVEVSTkFMIGFuZCBpbmNsdWRlICJwbmcuaCIgZnJvbSBwbmdhc21yZC5oCisgIE1hZGUgc2V2ZXJhbCBtaW5vciBjb3JyZWN0aW9ucyB0byBwbmd0ZXN0LmMKKyAgUmVuYW1lZCB0aGUgbWFrZWZpbGVzIHdpdGggbG9uZ2VyIGJ1dCBtb3JlIHVzZXIgZnJpZW5kbHkgZXh0ZW5zaW9ucy4KKyAgQ29waWVkIHRoZSBQTkcgY29weXJpZ2h0IGFuZCBsaWNlbnNlIHRvIGEgc2VwYXJhdGUgTElDRU5TRSBmaWxlLgorICBSZXZpc2VkIGRvY3VtZW50YXRpb24sIHBuZy5oLCBhbmQgZXhhbXBsZS5jIHRvIHJlbW92ZSByZWZlcmVuY2UgdG8KKyAgICAidmlld2luZ19nYW1tYSIgd2hpY2ggbm8gbG9uZ2VyIGFwcGVhcnMgaW4gdGhlIFBORyBzcGVjaWZpY2F0aW9uLgorICBSZXZpc2VkIHBuZ3ZjcmQuYyB0byB1c2UgTU1YIGNvZGUgZm9yIGludGVybGFjaW5nIG9ubHkgb24gdGhlIGZpbmFsIHBhc3MuCisgIFVwZGF0ZWQgcG5ndmNyZC5jIHRvIHVzZSB0aGUgZmFzdGVyIEMgZmlsdGVyIGFsZ29yaXRobXMgZnJvbSBsaWJwbmctMS4wLjFhCisgIFNwbGl0IG1ha2VmaWxlLndpbjMydmMgaW50byB0d28gdmVyc2lvbnMsIG1ha2VmaWxlLnZjYXdpbjMyICh1c2VzIE1NWAorICAgIGFzc2VtYmxlciBjb2RlKSBhbmQgbWFrZWZpbGUudmN3aW4zMiAoZG9lc24ndCkuCisgIEFkZGVkIGEgQ1BVIHRpbWluZyByZXBvcnQgdG8gcG5ndGVzdC5jIChlbmFibGVkIGJ5IGRlZmluaW5nIFBOR1RFU1RfVElNSU5HKQorICBBZGRlZCBhIGNvcHkgb2YgcG5nbm93LnBuZyB0byB0aGUgZGlzdHJpYnV0aW9uLgorCitWZXJzaW9uIDEuMC40YSBbU2VwdGVtYmVyIDI1LCAxOTk5XQorICBJbmNyZWFzZSBtYXhfcGl4ZWxfZGVwdGggaW4gcG5ncnV0aWwuYyBpZiBhIHVzZXIgdHJhbnNmb3JtIG5lZWRzIGl0LgorICBDaGFuZ2VkIHNldmVyYWwgZGl2aXNpb24gb3BlcmF0aW9ucyB0byByaWdodC1zaGlmdHMgaW4gcG5ndmNyZC5jCisKK1ZlcnNpb24gMS4wLjRiIFtTZXB0ZW1iZXIgMzAsIDE5OTldCisgIEFkZGVkIHBhcmVudGhlc2VzIGluIGxpbmUgMzczMiBvZiBwbmd2Y3JkLmMKKyAgQWRkZWQgYSBjb21tZW50IGluIG1ha2VmaWxlLmxpbnV4IHdhcm5pbmcgYWJvdXQgYnVnZ3kgLU8zIGluIHBnY2MgMi45NS4xCisKK1ZlcnNpb24gMS4wLjRjIFtPY3RvYmVyIDEsIDE5OTldCisgIEFkZGVkIGEgInBuZ19jaGVja192ZXJzaW9uIiBmdW5jdGlvbiBpbiBwbmcuYyBhbmQgcG5ndGVzdC5jIHRoYXQgd2lsbCBnZW5lcmF0ZQorICAgIGEgaGVscGZ1bCBjb21waWxlciBlcnJvciBpZiBhbiBvbGQgcG5nLmggaXMgZm91bmQgaW4gdGhlIHNlYXJjaCBwYXRoLgorICBDaGFuZ2VkIHR5cGUgb2YgcG5nX3VzZXJfdHJhbnNmb3JtX2RlcHRofGNoYW5uZWxzIGZyb20gaW50IHRvIHBuZ19ieXRlLgorICBBZGRlZCAiTGlicG5nIGlzIE9TSSBDZXJ0aWZpZWQgT3BlbiBTb3VyY2UgU29mdHdhcmUiIHN0YXRlbWVudCB0byBwbmcuaAorCitWZXJzaW9uIDEuMC40ZCBbT2N0b2JlciA2LCAxOTk5XQorICBDaGFuZ2VkIDAuNDUgdG8gMC40NTQ1NSBpbiBwbmdfc2V0X3NSR0IoKQorICBSZW1vdmVkIHVudXNlZCBQTFRFIGVudHJpZXMgZnJvbSBwbmdub3cucG5nCisgIFJlLWVuYWJsZWQgc29tZSBwYXJ0cyBvZiBwbmd2Y3JkLmMgKHBuZ19jb21iaW5lX3JvdykgdGhhdCB3b3JrIHByb3Blcmx5LgorCitWZXJzaW9uIDEuMC40ZSBbT2N0b2JlciAxMCwgMTk5OV0KKyAgRml4ZWQgc2lnbiBlcnJvciBpbiBwbmd2Y3JkLmMgKEdyZWcgUm9lbG9mcykKKyAgUmVwbGFjZWQgc29tZSBpbnN0YW5jZXMgb2YgbWVtY3B5IHdpdGggc2ltcGxlIGFzc2lnbm1lbnRzIGluIHBuZ3ZjcmQgKEdSLVApCisKK1ZlcnNpb24gMS4wLjRmIFtPY3RvYmVyIDE1LCAxOTk5XQorICBTdXJyb3VuZGVkIGV4YW1wbGUuYyBjb2RlIHdpdGggI2lmIDAgLi4gI2VuZGlmIHRvIHByZXZlbnQgcGVvcGxlIGZyb20KKyAgICBpbmFkdmVydGVudGx5IHRyeWluZyB0byBjb21waWxlIGl0LgorICBDaGFuZ2VkIHBuZ19nZXRfaGVhZGVyX3ZlcnNpb24oKSBmcm9tIGEgZnVuY3Rpb24gdG8gYSBtYWNybyBpbiBwbmcuaAorICBBZGRlZCB0eXBlIGNhc3RpbmcgbW9zdGx5IGluIHBuZ3J0cmFuLmMgYW5kIHBuZ3d0cmFuLmMKKyAgUmVtb3ZlZCBzb21lIHBvaW50bGVzcyAicHRyID0gTlVMTCIgaW4gcG5nbWVtLmMKKyAgQWRkZWQgYSAiY29udHJpYiIgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBjb2RlIGZyb20gR3JlZydzIGJvb2suCisKK1ZlcnNpb24gMS4wLjUgW09jdG9iZXIgMTUsIDE5OTldCisgIE1pbm9yIGVkaXRpbmcgb2YgdGhlIElOU1RBTEwgYW5kIFJFQURNRSBmaWxlcy4KKworVmVyc2lvbiAxLjAuNWEgW09jdG9iZXIgMjMsIDE5OTldCisgIEFkZGVkIGNvbnRyaWIvcG5nc3VpdGUgYW5kIGNvbnRyaWIvcG5nbWludXMgKFdpbGxlbSB2YW4gU2NoYWlrKQorICBGaXhlZCBhIHR5cG8gaW4gdGhlIHBuZ19zZXRfc1JHQigpIGZ1bmN0aW9uIGNhbGwgaW4gZXhhbXBsZS5jIChKYW4gTmlqdG1hbnMpCisgIEZ1cnRoZXIgb3B0aW1pemF0aW9uIGFuZCBidWdmaXggb2YgcG5ndmNyZC5jCisgIFJldmlzZWQgcG5nc2V0LmMgc28gdGhhdCBpdCBkb2VzIG5vdCBhbGxvY2F0ZSBvciBmcmVlIG1lbW9yeSBpbiB0aGUgdXNlcidzCisgICAgdGV4dF9wdHIgc3RydWN0dXJlLiAgSW5zdGVhZCwgaXQgbWFrZXMgaXRzIG93biBjb3B5LgorICBDcmVhdGVkIHNlcGFyYXRlIHdyaXRlX2VuZF9pbmZvX3N0cnVjdCBpbiBwbmd0ZXN0LmMgZm9yIGEgbW9yZSBzZXZlcmUgdGVzdC4KKyAgQWRkZWQgY29kZSBpbiBwbmd3cml0ZS5jIHRvIGZyZWUgaW5mb19wdHItPnRleHRbaV0ua2V5IHRvIHN0b3AgYSBtZW1vcnkgbGVhay4KKworVmVyc2lvbiAxLjAuNWIgW05vdmVtYmVyIDIzLCAxOTk5XQorICBNb3ZlZCBQTkdfRkxBR19IQVZFX0NIVU5LX0hFQURFUiwgUE5HX0ZMQUdfQkFDS0dST1VORF9JU19HUkFZIGFuZAorICAgIFBOR19GTEFHX1dST1RFX3RJTUUgZnJvbSBmbGFncyB0byBtb2RlLgorICBBZGRlZCBwbmdfd3JpdGVfaW5mb19iZWZvcmVfUExURSgpIGZ1bmN0aW9uLgorICBGaXhlZCBzb21lIHR5cGVjYXN0aW5nIGluIGNvbnRyaWIvZ3JlZ2Jvb2svKi5jCisgIFVwZGF0ZWQgc2NyaXB0cy9tYWtldm1zLmNvbSBhbmQgYWRkZWQgbWFrZXZtcy5jb20gdG8gY29udHJpYi9ncmVnYm9vaworICAgIGFuZCBjb250cmliL3BuZ21pbnVzIChNYXJ0aW4gWmluc2VyKQorCitWZXJzaW9uIDEuMC41YyBbTm92ZW1iZXIgMjYsIDE5OTldCisgIE1vdmVkIHBuZ19nZXRfaGVhZGVyX3ZlcnNpb24gZnJvbSBwbmcuaCB0byBwbmcuYywgdG8gYWNjb21tb2RhdGUgYW5zaTJrbnIuCisgIFJlbW92ZWQgYWxsIGdsb2JhbCBhcnJheXMgKGFjY29yZGluZyB0byBQTkdfTk9fR0xPQkFMX0FSUkFZUyBtYWNybyksIHRvCisgICAgYWNjb21tb2RhdGUgbWFraW5nIERMTCdzOiBNb3ZlZCB1c3JfcG5nX3ZlciBmcm9tIGdsb2JhbCB2YXJpYWJsZSB0byBmdW5jdGlvbgorICAgIHBuZ19nZXRfaGVhZGVyX3ZlcigpIGluIHBuZy5jLiAgTW92ZWQgcG5nX3NpZyB0byBwbmdfc2lnX2J5dGVzIGluIHBuZy5jIGFuZAorICAgIGVsaW1pbmF0ZWQgdXNlIG9mIHBuZ19zaWcgaW4gcG5nd3V0aWwuYy4gIE1vdmVkIHRoZSB2YXJpb3VzIHBuZ19DSE5LIGFycmF5cworICAgIGludG8gcG5ndHlwZXMuaC4gIEVsaW1pbmF0ZWQgdXNlIG9mIGdsb2JhbCBwbmdfcGFzcyBhcnJheXMuICBEZWNsYXJlZCB0aGUKKyAgICBwbmdfQ0hOSyBhbmQgcG5nX3Bhc3MgYXJyYXlzIHRvIGJlICJjb25zdCIuICBNYWRlIHRoZSBnbG9iYWwgYXJyYXlzCisgICAgYXZhaWxhYmxlIHRvIGFwcGxpY2F0aW9ucyAoYWx0aG91Z2ggbm9uZSBhcmUgdXNlZCBpbiBsaWJwbmcgaXRzZWxmKSB3aGVuCisgICAgUE5HX05PX0dMT0JBTF9BUlJBWVMgaXMgbm90IGRlZmluZWQgb3Igd2hlbiBQTkdfR0xPQkFMX0FSUkFZUyBpcyBkZWZpbmVkLgorICBSZW1vdmVkIHNvbWUgZXh0cmFuZW91cyAiLUkiIGZyb20gY29udHJpYi9wbmdtaW51cy9tYWtlZmlsZS5zdGQKKyAgQ2hhbmdlZCB0aGUgUE5HX3NSR0JfSU5URU5UIG1hY3JvcyBpbiBwbmcuaCB0byBiZSBjb25zaXN0ZW50IHdpdGggUE5HLTEuMi4KKyAgQ2hhbmdlIFBOR19TUkdCX0lOVEVOVCB0byBQTkdfc1JHQl9JTlRFTlQgaW4gbGlicG5nLnR4dCBhbmQgbGlicG5nLjMKKworVmVyc2lvbiAxLjAuNWQgW05vdmVtYmVyIDI5LCAxOTk5XQorICBBZGQgdHlwZSBjYXN0IChwbmdfY29uc3RfY2hhcnApIHR3byBwbGFjZXMgaW4gcG5nLmMKKyAgRWxpbWluYXRlZCBwbmd0eXBlcy5oOyB1c2UgbWFjcm9zIGluc3RlYWQgdG8gZGVjbGFyZSBQTkdfQ0hOSyBhcnJheXMuCisgIFJlbmFtZWQgIlBOR19HTE9CQUxfQVJSQVlTIiB0byAiUE5HX1VTRV9HTE9CQUxfQVJSQVlTIiBhbmQgbWFkZSBhdmFpbGFibGUKKyAgICB0byBhcHBsaWNhdGlvbnMgYSBtYWNybyAiUE5HX1VTRV9MT0NBTF9BUlJBWVMiLgorICBjb21tZW50IG91dCAod2l0aCAjaWZkZWYpIGFsbCB0aGUgbmV3IGRlY2xhcmF0aW9ucyB3aGVuCisgICAgUE5HX1VTRV9HTE9CQUxfQVJSQVlTIGlzIGRlZmluZWQuCisgIEFkZGVkIFBOR19FWFBPUlRfVkFSIG1hY3JvIHRvIGFjY29tbW9kYXRlIG1ha2luZyBETEwncy4KKworVmVyc2lvbiAxLjAuNWUgW05vdmVtYmVyIDMwLCAxOTk5XQorICBBZGRlZCBpQ0NQLCBpVFh0LCBhbmQgc1BMVCBzdXBwb3J0OyBhZGRlZCAibGFuZyIgbWVtYmVyIHRvIHRoZSBwbmdfdGV4dAorICAgIHN0cnVjdHVyZTsgcmVmYWN0b3JlZCB0aGUgaW5mbGF0ZS9kZWZsYXRlIHN1cHBvcnQgdG8gbWFrZSBhZGRpbmcgbmV3IGNodW5rcworICAgIHdpdGggdHJhaWxpbmcgY29tcHJlc3NlZCBwYXJ0cyBlYXNpZXIgaW4gdGhlIGZ1dHVyZSwgYW5kIGFkZGVkIG5ldyBmdW5jdGlvbnMKKyAgICBwbmdfZnJlZV9pQ0NQLCBwbmdfZnJlZV9wQ0FMLCBwbmdfZnJlZV9zUExULCBwbmdfZnJlZV90ZXh0LCBwbmdfZ2V0X2lDQ1AsCisgICAgcG5nX2dldF9zcGFsZXR0ZXMsIHBuZ19zZXRfaUNDUCwgcG5nX3NldF9zcGFsZXR0ZXMgKEVyaWMgUy4gUmF5bW9uZCkuCisgIE5PVEU6IEFwcGxpY2F0aW9ucyB0aGF0IHdyaXRlIHRleHQgY2h1bmtzIE1VU1QgZGVmaW5lIHBuZ190ZXh0LT5sYW5nCisgICAgYmVmb3JlIGNhbGxpbmcgcG5nX3NldF90ZXh0KCkuIEl0IG11c3QgYmUgc2V0IHRvIE5VTEwgaWYgeW91IHdhbnQgdG8KKyAgICB3cml0ZSB0RVh0IG9yIHpUWHQgY2h1bmtzLiAgSWYgeW91IHdhbnQgeW91ciBhcHBsaWNhdGlvbiB0byBiZSBhYmxlIHRvCisgICAgcnVuIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgbGlicG5nLCB1c2UKKworICAgICAgI2lmZGVmIFBOR19pVFh0X1NVUFBPUlRFRAorICAgICAgICAgcG5nX3RleHRbaV0ubGFuZyA9IE5VTEw7CisgICAgICAjZW5kaWYKKworICBDaGFuZ2VkIHBuZ19nZXRfb0ZGcygpIGFuZCBwbmdfc2V0X29GRnMoKSB0byB1c2Ugc2lnbmVkIHJhdGhlciB0aGFuIHVuc2lnbmVkCisgICAgb2Zmc2V0cyAoRXJpYyBTLiBSYXltb25kKS4KKyAgQ29tYmluZWQgUE5HX1JFQURfY0hOS19TVVBQT1JURUQgYW5kIFBOR19XUklURV9jSE5LX1NVUFBPUlRFRCBtYWNyb3MgaW50bworICAgIFBOR19jSE5LX1NVUFBPUlRFRCBhbmQgY29tYmluZWQgdGhlIHRocmVlIHR5cGVzIG9mIFBOR190ZXh0X1NVUFBPUlRFRAorICAgIG1hY3JvcywgbGVhdmluZyB0aGUgc2VwYXJhdGUgbWFjcm9zIGFsc28gYXZhaWxhYmxlLgorICBSZW1vdmVkIGNvbW1lbnRzIG9uICNlbmRpZnMgYXQgdGhlIGVuZCBvZiBtYW55IHNob3J0LCBub24tbmVzdGVkICNpZi1ibG9ja3MuCisKK1ZlcnNpb24gMS4wLjVmIFtEZWNlbWJlciA2LCAxOTk5XQorICBDaGFuZ2VkIG1ha2VmaWxlLnNvbGFyaXMgdG8gaXNzdWUgYSB3YXJuaW5nIGFib3V0IHBvdGVudGlhbCBwcm9ibGVtcyB3aGVuCisgICAgdGhlIHVjYiAibGQiIGlzIGluIHRoZSBwYXRoIGFoZWFkIG9mIHRoZSBjY3MgImxkIi4KKyAgUmVtb3ZlZCAiLSBbZGF0ZV0iIGZyb20gdGhlICJzeW5vcHNpcyIgbGluZSBpbiBsaWJwbmcuMyBhbmQgbGlicG5ncGYuMy4KKyAgQWRkZWQgc0NBTCBjaHVuayBzdXBwb3J0IChFcmljIFMuIFJheW1vbmQpLgorCitWZXJzaW9uIDEuMC41ZyBbRGVjZW1iZXIgNywgMTk5OV0KKyAgRml4ZWQgInBuZ19mcmVlX3NwYWxsZXR0ZXMiIHR5cG8gaW4gcG5nLmgKKyAgQWRkZWQgY29kZSB0byBoYW5kbGUgbmV3IGNodW5rcyBpbiBwbmdwcmVhZC5jCisgIE1vdmVkIFBOR19DSE5LIHN0cmluZyBtYWNybyBkZWZpbml0aW9ucyBvdXRzaWRlIG9mIFBOR19OT19FWFRFUk4gYmxvY2sKKyAgQWRkZWQgInRyYW5zbGF0ZWRfa2V5IiB0byBwbmdfdGV4dCBzdHJ1Y3R1cmUgYW5kIHBuZ193cml0ZV9pVFh0KCkuCisgIEFkZGVkIGNvZGUgaW4gcG5nd3JpdGUuYyB0byB3b3JrIGFyb3VuZCBhIG5ld2x5IGRpc2NvdmVyZWQgemxpYiBidWcuCisKK1ZlcnNpb24gMS4wLjVoIFtEZWNlbWJlciAxMCwgMTk5OV0KKyAgTk9URTogcmVnYXJkaW5nIHRoZSBub3RlIGZvciB2ZXJzaW9uIDEuMC41ZSwgdGhlIGZvbGxvd2luZyBtdXN0IGFsc28KKyAgICBiZSBpbmNsdWRlZCBpbiB5b3VyIGNvZGU6CisgICAgICAgIHBuZ190ZXh0W2ldLnRyYW5zbGF0ZWRfa2V5ID0gTlVMTDsKKyAgVW5rbm93biBjaHVuayBoYW5kbGluZyBpcyBub3cgc3VwcG9ydGVkLgorICBPcHRpb24gdG8gZWxpbWluYXRlIGFsbCBmbG9hdGluZyBwb2ludCBzdXBwb3J0IHdhcyBhZGRlZC4gIFNvbWUgbmV3CisgICAgZml4ZWQtcG9pbnQgZnVuY3Rpb25zIHN1Y2ggYXMgcG5nX3NldF9nQU1BX2ZpeGVkKCkgd2VyZSBhZGRlZC4KKyAgRXhwYW5kZWQgdGFicyBhbmQgcmVtb3ZlZCB0cmFpbGluZyBibGFua3MgaW4gc291cmNlIGZpbGVzLgorCitWZXJzaW9uIDEuMC41aSBbRGVjZW1iZXIgMTMsIDE5OTldCisgIEFkZGVkIHNvbWUgdHlwZSBjYXN0cyB0byBzaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmdzLgorICBSZW5hbWVkICJwbmdfZnJlZV9zcGFsZXR0ZSIgdG8gInBuZ19mcmVlX3NwYWxldHRlcyIgZm9yIGNvbnNpc3RlbmN5LgorICBSZW1vdmVkIGxlYWRpbmcgYmxhbmtzIGZyb20gYSAjZGVmaW5lIGluIHBuZ3ZjcmQuYworICBBZGRlZCBzb21lIHBhcmFtZXRlcnMgdG8gdGhlIG5ldyBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MoKSBmdW5jdGlvbi4KKyAgQWRkZWQgYSB0ZXN0IGZvciB1cC0+bG9jYXRpb24gIT0gMCBpbiB0aGUgZmlyc3QgaW5zdGFuY2Ugb2Ygd3JpdGluZworICAgIHVua25vd24gY2h1bmtzIGluIHBuZ3dyaXRlLmMKKyAgQ2hhbmdlZCAibnVtIiB0byAiaSIgaW4gcG5nX2ZyZWVfc3BhbGV0dGVzKCkgYW5kIHBuZ19mcmVlX3Vua25vd25zKCkgdG8KKyAgICBwcmV2ZW50IHJlY3Vyc2lvbi4KKyAgQWRkZWQgcG5nX2ZyZWVfaElTVCgpIGZ1bmN0aW9uLgorICBWYXJpb3VzIHBhdGNoZXMgdG8gZml4IGJ1Z3MgaW4gdGhlIHNDQUwgYW5kIGludGVnZXIgY0hSTSBwcm9jZXNzaW5nLAorICAgIGFuZCB0byBhZGQgc29tZSBjb252ZW5pZW5jZSBtYWNyb3MgZm9yIHVzZSB3aXRoIHNDQUwuCisKK1ZlcnNpb24gMS4wLjVqIFtEZWNlbWJlciAyMSwgMTk5OV0KKyAgQ2hhbmdlZCAidW5pdCIgcGFyYW1ldGVyIG9mIHBuZ193cml0ZV9zQ0FMIGZyb20gcG5nX2J5dGUgdG8gaW50LCB0byB3b3JrCisgICAgYXJvdW5kIGJ1Z2d5IGNvbXBpbGVycy4KKyAgQWRkZWQgbmV3IHR5cGUgInBuZ19maXhlZF9wb2ludCIgZm9yIGludGVnZXJzIHRoYXQgaG9sZCBmbG9hdCoxMDAwMDAgdmFsdWVzCisgIFJlc3RvcmVkIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgb2YgdEVYdC96VFh0IGNodW5rIHByb2Nlc3Npbmc6CisgICAgUmVzdG9yZWQgdGhlIGZpcnN0IGZvdXIgbWVtYmVycyBvZiBwbmdfdGV4dCB0byB0aGUgc2FtZSBvcmRlciBhcyB2LjEuMC41ZC4KKyAgICBBZGRlZCBtZW1iZXJzICJsYW5nX2tleSIgYW5kICJpdHh0X2xlbmd0aCIgdG8gcG5nX3RleHQgc3RydWN0LiAgU2V0CisgICAgdGV4dF9sZW5ndGg9MCB3aGVuICJ0ZXh0IiBjb250YWlucyBpVFh0IGRhdGEuICBVc2UgdGhlICJjb21wcmVzc2lvbiIKKyAgICBtZW1iZXIgdG8gZGlzdGluZ3Vpc2ggYW1vbmcgdEVYdC96VFh0L2lUWHQgdHlwZXMuICBBZGRlZAorICAgIFBOR19JVFhUX0NPTVBSRVNTSU9OX05PTkUgKDEpIGFuZCBQTkdfSVRYVF9DT01QUkVTU0lPTl96VFh0KDIpIG1hY3Jvcy4KKyAgICBUaGUgIk5vdGUiIGFib3ZlLCBhYm91dCBiYWNrd2FyZCBpbmNvbXBhdGliaWxpdHkgb2YgbGlicG5nLTEuMC41ZSwgbm8KKyAgICBsb25nZXIgYXBwbGllcy4KKyAgRml4ZWQgcG5nX3JlYWR8d3JpdGVfaVRYdCgpIHRvIHJlYWR8d3JpdGUgcGFyYW1ldGVycyBpbiB0aGUgcmlnaHQgb3JkZXIsCisgICAgYW5kIHRvIHdyaXRlIHRoZSBpVFh0IGNodW5rIGFmdGVyIElEQVQgaWYgaXQgYXBwZWFycyBpbiB0aGUgZW5kX3B0ci4KKyAgQWRkZWQgcG5nZ2NjcmQuYywgdmVyc2lvbiBvZiBwbmd2Y3JkLmMgSW50ZWwgYXNzZW1ibGVyIGZvciBnY2MgKEdyZWcgUm9lbG9mcykKKyAgUmV2ZXJzZWQgdGhlIG9yZGVyIG9mIHRyeWluZyB0byB3cml0ZSBmbG9hdGluZy1wb2ludCBhbmQgZml4ZWQtcG9pbnQgZ0FNQS4KKworVmVyc2lvbiAxLjAuNWsgW0RlY2VtYmVyIDI3LCAxOTk5XQorICBBZGRlZCBtYW55IHBhcmVudGhlc2VzLCBlLmcuLCAiaWYgKGEgJiYgYiAmIGMpIiBiZWNvbWVzICJpZiAoYSAmJiAoYiAmIGMpKSIKKyAgQWRkZWQgcG5nX2hhbmRsZV9hc191bmtub3duKCkgZnVuY3Rpb24gKEdsZW5uKQorICBBZGRlZCBwbmdfZnJlZV9jaHVua19saXN0KCkgZnVuY3Rpb24gYW5kIGNodW5rX2xpc3QgYW5kIG51bV9jaHVua19saXN0IG1lbWJlcnMKKyAgICBvZiBwbmdfcHRyLgorICBFbGltaW5hdGVkIGVycm9uZW91cyB3YXJuaW5ncyBhYm91dCBtdWx0aXBsZSBzUExUIGNodW5rcyBhbmQgc1BMVC1hZnRlci1QTFRFLgorICBGaXhlZCBhIGxpYnBuZy0xLjAuNWggYnVnIGluIHBuZ3J1dGlsLmMgdGhhdCB3YXMgaXNzdWluZyBlcnJvbmVvdXMgd2FybmluZ3MKKyAgICBhYm91dCBpZ25vcmluZyBpbmNvcnJlY3QgZ0FNQSB3aXRoIHNSR0IgKGdBTUEgd2FzIGluIGZhY3Qgbm90IGlnbm9yZWQpCisgIEFkZGVkIHBuZ19mcmVlX3RSTlMoKTsgcG5nX3NldF90Uk5TKCkgbm93IG1hbGxvYydzIGl0cyBvd24gdHJhbnMgYXJyYXkgKEVTUikuCisgIERlZmluZSBwbmdfZ2V0X2ludF8zMiB3aGVuIG9GRnMgY2h1bmsgaXMgc3VwcG9ydGVkIGFzIHdlbGwgYXMgd2hlbiBwQ0FMIGlzLgorICBDaGFuZ2VkIHR5cGUgb2YgcHJvZmxlbiBmcm9tIHBuZ19pbnRfMzIgdG8gcG5nX3VpbnRfMzIgaW4gcG5nX2dldF9pQ0NQKCkuCisKK1ZlcnNpb24gMS4wLjVsIFtKYW51YXJ5IDEsIDIwMDBdCisgIEFkZGVkIGZ1bmN0aW9ucyBwbmdfc2V0X3JlYWRfdXNlcl9jaHVua19mbigpIGFuZCBwbmdfZ2V0X3VzZXJfY2h1bmtfcHRyKCkKKyAgICBmb3Igc2V0dGluZyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSB1bmtub3duIGNodW5rcyBhbmQgZm9yCisgICAgcmV0cmlldmluZyB0aGUgYXNzb2NpYXRlZCB1c2VyIHBvaW50ZXIgKEdsZW5uKS4KKworVmVyc2lvbiAxLjAuNW0gW0phbnVhcnkgNywgMjAwMF0KKyAgQWRkZWQgaGlnaC1sZXZlbCBmdW5jdGlvbnMgcG5nX3JlYWRfcG5nKCksIHBuZ193cml0ZV9wbmcoKSwgcG5nX2ZyZWVfcGl4ZWxzKCkuCisKK1ZlcnNpb24gMS4wLjVuIFtKYW51YXJ5IDksIDIwMDBdCisgIEFkZGVkIHBuZ19mcmVlX1BMVEUoKSBmdW5jdGlvbiwgYW5kIG1vZGlmaWVkIHBuZ19zZXRfUExURSgpIHRvIG1hbGxvYyBpdHMKKyAgICBvd24gbWVtb3J5IGZvciBpbmZvX3B0ci0+cGFsZXR0ZS4gIFRoaXMgbWFrZXMgaXQgc2FmZSBmb3IgdGhlIGNhbGxpbmcKKyAgICBhcHBsaWNhdGlvbiB0byBmcmVlIGl0cyBjb3B5IG9mIHRoZSBwYWxldHRlIGFueSB0aW1lIGFmdGVyIGl0IGNhbGxzCisgICAgcG5nX3NldF9QTFRFKCkuCisKK1ZlcnNpb24gMS4wLjVvIFtKYW51YXJ5IDIwLCAyMDAwXQorICBDb3NtZXRpYyBjaGFuZ2VzIG9ubHkgKHJlbW92ZWQgc29tZSB0cmFpbGluZyBibGFua3MgYW5kIFRBQnMpCisKK1ZlcnNpb24gMS4wLjVwIFtKYW51YXJ5IDMxLCAyMDAwXQorICBSZW5hbWVkIHBuZ2RsbC5tYWsgdG8gbWFrZWZpbGUuYmQzMgorICBDb3NtZXRpYyBjaGFuZ2VzIGluIHBuZ3Rlc3QuYworCitWZXJzaW9uIDEuMC41cSBbRmVicnVhcnkgNSwgMjAwMF0KKyAgUmVsb2NhdGVkIHRoZSBtYWtlZmlsZS5zb2xhcmlzIHdhcm5pbmcgYWJvdXQgUEFUSCBwcm9ibGVtcy4KKyAgRml4ZWQgcG5ndmNyZC5jIGJ1ZyBieSBwdXNoaW5nL3BvcHBpbmcgcmVnaXN0ZXJzIGluIG1teHN1cHBvcnQgKEJydWNlIE9iZXJnKQorICBSZXZpc2VkIG1ha2VmaWxlLmdjbW14CisgIEFkZGVkIFBOR19TRVRKTVBfU1VQUE9SVEVELCBQTkdfU0VUSk1QX05PVF9TVVBQT1JURUQsIGFuZCBQTkdfQUJPUlQoKSBtYWNyb3MKKworVmVyc2lvbiAxLjAuNXIgW0ZlYnJ1YXJ5IDcsIDIwMDBdCisgIFJlbW92ZWQgc3VwZXJmbHVvdXMgcHJvdG90eXBlIGZvciBwbmdfZ2V0X2l0eHQgZnJvbSBwbmcuaAorICBGaXhlZCBhIGJ1ZyBpbiBwbmdydHJhbi5jIHRoYXQgaW1wcm9wZXJseSBleHBhbmRlZCB0aGUgYmFja2dyb3VuZCBjb2xvci4KKyAgUmV0dXJuICpudW1fdGV4dD0wIGZyb20gcG5nX2dldF90ZXh0KCkgd2hlbiBhcHByb3ByaWF0ZSwgYW5kIGZpeCBkb2N1bWVudGF0aW9uCisgICAgb2YgcG5nX2dldF90ZXh0KCkgaW4gbGlicG5nLnR4dC9saWJwbmcuMy4KKworVmVyc2lvbiAxLjAuNXMgW0ZlYnJ1YXJ5IDE4LCAyMDAwXQorICBBZGRlZCAicG5nX2ptcF9lbnYoKSIgbWFjcm8gdG8gcG5nY29uZi5oLCB0byBoZWxwIHBlb3BsZSBtaWdyYXRlIHRvIHRoZQorICAgIG5ldyBlcnJvciBoYW5kbGVyIHRoYXQncyBwbGFubmVkIGZvciB0aGUgbmV4dCBsaWJwbmcgcmVsZWFzZSwgYW5kIGNoYW5nZWQKKyAgICBleGFtcGxlLmMsIHBuZ3Rlc3QuYywgYW5kIGNvbnRyaWIgcHJvZ3JhbXMgdG8gdXNlIHRoaXMgbWFjcm8uCisgIFJldmlzZWQgc29tZSBvZiB0aGUgRExMLWV4cG9ydCBtYWNyb3MgaW4gcG5nY29uZi5oIChHcmVnIFJvZWxvZnMpCisgIEZpeGVkIGEgYnVnIGluIHBuZ19yZWFkX3BuZygpIHRoYXQgY2F1c2VkIGl0IHRvIGZhaWwgdG8gZXhwYW5kIHNvbWUgaW1hZ2VzCisgICAgdGhhdCBpdCBzaG91bGQgaGF2ZSBleHBhbmRlZC4KKyAgRml4ZWQgc29tZSBtaXN0YWtlcyBpbiB0aGUgdW51c2VkIGFuZCB1bmRvY3VtZW50ZWQgSU5DSF9DT05WRVJTSU9OUyBmdW5jdGlvbnMKKyAgICBpbiBwbmdnZXQuYworICBDaGFuZ2VkIHRoZSBhbGxvY2F0aW9uIG9mIHBhbGV0dGUsIGhpc3RvcnksIGFuZCB0cmFucyBhcnJheXMgYmFjayB0bworICAgIHRoZSB2ZXJzaW9uIDEuMC41IG1ldGhvZCAobGlua2luZyBpbnN0ZWFkIG9mIGNvcHlpbmcpIHdoaWNoIHJlc3RvcmVzCisgICAgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHZlcnNpb24gMS4wLjUuICBBZGRlZCBzb21lIHJlbWFya3MgYWJvdXQKKyAgICB0aGF0IGluIGV4YW1wbGUuYy4gIEFkZGVkICJmcmVlX21lIiBtZW1iZXIgdG8gaW5mb19wdHIgYW5kIHBuZ19wdHIKKyAgICBhbmQgYWRkZWQgcG5nX2ZyZWVfZGF0YSgpIGZ1bmN0aW9uLgorICBVcGRhdGVkIG1ha2VmaWxlLmxpbnV4IGFuZCBtYWtlZmlsZS5nY2NtbXggdG8gbWFrZSBkaXJlY3RvcmllcyBjb25kaXRpb25hbGx5LgorICBNYWRlIGNvc21ldGljIGNoYW5nZXMgdG8gcG5nYXNtcmQuaAorICBBZGRlZCBwbmdfc2V0X3Jvd3MoKSBhbmQgcG5nX2dldF9yb3dzKCksIGZvciB1c2Ugd2l0aCBwbmdfcmVhZHx3cml0ZV9wbmcoKS4KKyAgTW9kaWZpZWQgcG5nX3JlYWRfcG5nKCkgdG8gYWxsb2NhdGUgaW5mb19wdHItPnJvd19wb2ludGVycyBvbmx5IGlmIGl0CisgICAgaGFzbid0IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQuCisKK1ZlcnNpb24gMS4wLjV0IFtNYXJjaCA0LCAyMDAwXQorICBDaGFuZ2VkIHBuZ19qbXBfZW52KCkgbWlncmF0aW9uIGFpZGluZyBtYWNybyB0byBwbmdfam1wYnVmKCkuCisgIEZpeGVkICJpbnRlcmxhY2UiIHR5cG8gKHNob3VsZCBiZSAiaW50ZXJsYWNlZCIpIGluIGNvbnRyaWIvZ3JlZ2Jvb2svcmVhZDIteC5jCisgIEZpeGVkIGJ1ZyB3aXRoIHVzZSBvZiBQTkdfQkVGT1JFX0lIRFIgYml0IGluIHBuZ19wdHItPm1vZGUsIGludHJvZHVjZWQgd2hlbgorICAgIFBOR19GTEFHX0hBVkVfQ0hVTktfSEVBREVSIHdhcyBtb3ZlZCBpbnRvIHBuZ19wdHItPm1vZGUgaW4gdmVyc2lvbiAxLjAuNWIKKyAgRmlsZXMgaW4gY29udHJpYi9ncmVnYm9vayB3ZXJlIHJldmlzZWQgdG8gdXNlIHBuZ19qbXBidWYoKSBhbmQgdG8gc2VsZWN0CisgICAgYSAyNC1iaXQgdmlzdWFsIGlmIG9uZSBpcyBhdmFpbGFibGUsIGFuZCB0byBhbGxvdyBhYmJyZXZpYXRlZCBvcHRpb25zLgorICBGaWxlcyBpbiBjb250cmliL3BuZ21pbnVzIHdlcmUgcmV2aXNlZCB0byB1c2UgdGhlIHBuZ19qbXBidWYoKSBtYWNyby4KKyAgUmVtb3ZlZCBzcGFjZXMgaW4gbWFrZWZpbGUubGludXggYW5kIG1ha2VmaWxlLmdjbW14LCBpbnRyb2R1Y2VkIGluIDEuMC41cworCitWZXJzaW9uIDEuMC41dSBbTWFyY2ggNSwgMjAwMF0KKyAgU2ltcGxpZmllZCB0aGUgY29kZSB0aGF0IGRldGVjdHMgb2xkIHBuZy5oIGluIHBuZy5jIGFuZCBwbmd0ZXN0LmMKKyAgUmVuYW1lZCBwbmdfc3BhbGV0dGUgKF9wLCBfcHApIHRvIHBuZ19zUExUX3QgKF90cCwgX3RwcCkKKyAgSW5jcmVhc2VkIHByZWNpc2lvbiBvZiByZ2JfdG9fZ3JheSBjYWxjdWxhdGlvbnMgZnJvbSA4IHRvIDE1IGJpdHMgYW5kCisgICAgYWRkZWQgcG5nX3NldF9yZ2JfdG9fZ3JheV9maXhlZCgpIGZ1bmN0aW9uLgorICBBZGRlZCBtYWtlZmlsZS5iYzMyICgzMi1iaXQgQm9ybGFuZCBDKyssIEMgbW9kZSkKKworVmVyc2lvbiAxLjAuNXYgW01hcmNoIDExLCAyMDAwXQorICBBZGRlZCBzb21lIHBhcmVudGhlc2VzIHRvIHRoZSBwbmdfam1wYnVmIG1hY3JvIGRlZmluaXRpb24uCisgIFVwZGF0ZWQgcmVmZXJlbmNlcyB0byB0aGUgemxpYiBob21lIHBhZ2UsIHdoaWNoIGhhcyBtb3ZlZCB0byBmcmVlc29mdHdhcmUuY29tLgorICBDb3JyZWN0ZWQgYnVncyBpbiBkb2N1bWVudGF0aW9uIHJlZ2FyZGluZyBwbmdfcmVhZF9yb3coKSBhbmQgcG5nX3dyaXRlX3JvdygpLgorICBVcGRhdGVkIGRvY3VtZW50YXRpb24gb2YgcG5nX3JnYl90b19ncmF5IGNhbGN1bGF0aW9ucyBpbiBsaWJwbmcuMy9saWJwbmcudHh0LgorICBSZW5hbWVkIG1ha2VmaWxlLmJvcmxhbmQsdHVyYm9jMyBiYWNrIHRvIG1ha2VmaWxlLmJvcix0YzMgYXMgaW4gdmVyc2lvbiAxLjAuMywKKyAgICByZXZpc2VkIGJvcmxhbmQgbWFrZWZpbGVzOyBhZGRlZCBtYWtlZmlsZS5pYm12YWMzIGFuZCBtYWtlZmlsZS5nY2MgKENvc21pbikKKworVmVyc2lvbiAxLjAuNiBbTWFyY2ggMjAsIDIwMDBdCisgIE1pbm9yIHJldmlzaW9ucyBvZiBtYWtlZmlsZS5ib3IsIGxpYnBuZy50eHQsIGFuZCBncmVnYm9vay9ycG5nMi13aW4uYworICBBZGRlZCBtYWtlZmlsZS5zZ2djYyAoU0dJIElSSVggd2l0aCBnY2MpCisKK1ZlcnNpb24gMS4wLjZkIFtBcHJpbCA3LCAyMDAwXQorICBDaGFuZ2VkIHNwcmludGYoKSB0byBzdHJjcHkoKSBpbiBwbmdfd3JpdGVfc0NBTF9zKCkgdG8gd29yayB3aXRob3V0IFNURElPCisgIEFkZGVkIGRhdGFfbGVuZ3RoIHBhcmFtZXRlciB0byBwbmdfZGVjb21wcmVzc19jaHVuaygpIGZ1bmN0aW9uCisgIFJldmlzZWQgZG9jdW1lbnRhdGlvbiB0byByZW1vdmUgcmVmZXJlbmNlIHRvIGFiYW5kb25lZCBwbmdfZnJlZV9jaG5rIGZ1bmN0aW9ucworICBGaXhlZCBhbiBlcnJvciBpbiBwbmdfcmdiX3RvX2dyYXlfZml4ZWQoKQorICBSZXZpc2VkIGV4YW1wbGUuYywgdXNhZ2Ugb2YgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCkuCisgIFJlbmFtZWQgbWFrZWZpbGUuaWJtdmFjMyB0byBtYWtlZmlsZS5pYm1jLCBhZGRlZCBsaWJwbmcuaWNjIElCTSBwcm9qZWN0IGZpbGUKKyAgQWRkZWQgYSBjaGVjayBmb3IgaW5mb19wdHItPmZyZWVfbWUmUE5HX0ZSRUVfVEVYVCB3aGVuIGZyZWVpbmcgdGV4dCBpbiBwbmcuYworICBTaW1wbGlmeSBwbmdfc2lnX2J5dGVzKCkgZnVuY3Rpb24gdG8gcmVtb3ZlIHVzZSBvZiBub24tSVNPLUMgc3RyZHVwKCkuCisKK1ZlcnNpb24gMS4wLjZlIFtBcHJpbCA5LCAyMDAwXQorICBBZGRlZCBwbmdfZGF0YV9mcmVlcigpIGZ1bmN0aW9uLgorICBJbiB0aGUgY29kZSB0aGF0IGNoZWNrcyBmb3Igb3Zlci1sZW5ndGggdFJOUyBjaHVua3MsIGFkZGVkIGNoZWNrIG9mCisgICAgaW5mb19wdHItPm51bV90cmFucyBhcyB3ZWxsIGFzIHBuZ19wdHItPm51bV90cmFucyAoTWF0dGhpYXMgQmVuY2ttYW5uKQorICBNaW5vciByZXZpc2lvbnMgb2YgbGlicG5nLnR4dC9saWJwbmcuMy4KKyAgQ2hlY2sgZm9yIGV4aXN0aW5nIGRhdGEgYW5kIGZyZWUgaXQgaWYgdGhlIGZyZWVfbWUgZmxhZyBpcyBzZXQsIGluIHBuZ19zZXRfKigpCisgICAgYW5kIHBuZ19oYW5kbGVfKigpLgorICBPbmx5IGRlZmluZSBQTkdfV0VJR0hURURfRklMVEVSU19TVVBQT1JURUQgd2hlbiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECisgICAgaXMgZGVmaW5lZC4KKyAgQ2hhbmdlZCBzZXZlcmFsIGluc3RhbmNlcyBvZiBQTkdfTk9fQ09OU09MRV9JRCB0byBQTkdfTk9fU1RESU8gaW4gcG5ncnV0aWwuYworICAgIGFuZCBtZW50aW9uZWQgdGhlIHB1cnBvc2VzIG9mIHRoZSB0d28gbWFjcm9zIGluIGxpYnBuZy50eHQvbGlicG5nLjMuCisKK1ZlcnNpb24gMS4wLjZmIFtBcHJpbCAxNCwgMjAwMF0KKyAgUmV2aXNlZCBwbmdfc2V0X2lDQ1AoKSBhbmQgcG5nX3NldF9yb3dzKCkgdG8gYXZvaWQgcHJlbWF0dXJlbHkgZnJlZWluZyBkYXRhLgorICBBZGQgY2hlY2tzIGluIHBuZ19zZXRfdGV4dCgpIGZvciBOVUxMIG1lbWJlcnMgb2YgdGhlIGlucHV0IHRleHQgc3RydWN0dXJlLgorICBSZXZpc2VkIGxpYnBuZy50eHQvbGlicG5nLjMuCisgIFJlbW92ZWQgc3VwZXJmbHVvdXMgcHJvdG90eXBlIGZvciBwbmdfc2V0X2lUWHQgZnJvbSBwbmcuaAorICBSZW1vdmVkICJlbHNlIiBmcm9tIHBuZ3JlYWQuYywgYWZ0ZXIgcG5nX2Vycm9yKCksIGFuZCBjaGFuZ2VkICIwIiB0byAibGVuZ3RoIi4KKyAgQ2hhbmdlZCBzZXZlcmFsIHBuZ19lcnJvcnMgYWJvdXQgbWFsZm9ybWVkIGFuY2lsbGFyeSBjaHVua3MgdG8gcG5nX3dhcm5pbmdzLgorCitWZXJzaW9uIDEuMC42ZyBbQXByaWwgMjQsIDIwMDBdCisgIEFkZGVkIHBuZ19wYXNzLSogYXJyYXlzIHRvIHBuZ2djY3JkLmMgd2hlbiBQTkdfVVNFX0xPQ0FMX0FSUkFZUyBpcyBkZWZpbmVkLgorICBSZWxvY2F0ZWQgcGFyYWdyYXBoIGFib3V0IHBuZ19zZXRfYmFja2dyb3VuZCgpIGluIGxpYnBuZy4zL2xpYnBuZy50eHQKKyAgICBhbmQgb3RoZXIgcmV2aXNpb25zIChNYXR0aGlhcyBCZW5ja21hbm4pCisgIFJlbG9jYXRlZCBpbmZvX3B0ci0+ZnJlZV9tZSwgcG5nX3B0ci0+ZnJlZV9tZSwgYW5kIG90aGVyIGluZm9fcHRyIGFuZAorICAgIHBuZ19wdHIgbWVtYmVycyB0byByZXN0b3JlIGJpbmFyeSBjb21wYXRpYmlsaXR5IHdpdGggbGlicG5nLTEuMC41CisgICAgKGJyZWFrcyBjb21wYXRpYmlsaXR5IHdpdGggbGlicG5nLTEuMC42KS4KKworVmVyc2lvbiAxLjAuNmggW0FwcmlsIDI0LCAyMDAwXQorICBDaGFuZ2VkIHNoYXJlZCBsaWJyYXJ5IHNvLW51bWJlciBwYXR0ZXJuIGZyb20gMi54LnkueiB0byB4eS56ICh0aGlzIGJ1aWxkcworICAgIGxpYnBuZy5zby4xMCAmIGxpYnBuZy5zby4xMC42aCBpbnN0ZWFkIG9mIGxpYnBuZy5zby4yICYgbGlicG5nLnNvLjIuMS4wLjZoKQorICAgIFRoaXMgaXMgYSB0ZW1wb3JhcnkgY2hhbmdlIGZvciB0ZXN0IHB1cnBvc2VzLgorCitWZXJzaW9uIDEuMC42aSBbTWF5IDIsIDIwMDBdCisgIFJlYXJyYW5nZWQgc29tZSBtZW1iZXJzIGF0IHRoZSBlbmQgb2YgcG5nX2luZm8gYW5kIHBuZ19zdHJ1Y3QsIHRvIHB1dAorICAgIHVua25vd25fY2h1bmtzX251bSBhbmQgZnJlZV9tZSB3aXRoaW4gdGhlIG9yaWdpbmFsIHNpemUgb2YgdGhlIHBuZ19zdHJ1Y3RzCisgICAgYW5kIGZyZWVfbWUsIHBuZ19yZWFkX3VzZXJfZm4sIGFuZCBwbmdfZnJlZV9mbiB3aXRoaW4gdGhlIG9yaWdpbmFsIHBuZ19pbmZvLAorICAgIGJlY2F1c2Ugc29tZSBvbGQgYXBwbGljYXRpb25zIGFsbG9jYXRlIHRoZSBzdHJ1Y3RzIGRpcmVjdGx5IGluc3RlYWQgb2YKKyAgICB1c2luZyBwbmdfY3JlYXRlXyooKS4KKyAgQWRkZWQgZG9jdW1lbnRhdGlvbiBvZiB1c2VyIG1lbW9yeSBmdW5jdGlvbnMgaW4gbGlicG5nLnR4dC9saWJwbmcuMworICBNb2RpZmllZCBwbmdfcmVhZF9wbmcgc28gdGhhdCBpdCB3aWxsIHVzZSB1c2VyX2FsbG9jYXRlZCByb3dfcG9pbnRlcnMKKyAgICBpZiBwcmVzZW50LCB1bmxlc3MgZnJlZV9tZSBkaXJlY3RzIHRoYXQgaXQgYmUgZnJlZWQsIGFuZCBhZGRlZCBkZXNjcmlwdGlvbgorICAgIG9mIHRoZSB1c2Ugb2YgcG5nX3NldF9yb3dzKCkgYW5kIHBuZ19nZXRfcm93cygpIGluIGxpYnBuZy50eHQvbGlicG5nLjMuCisgIEFkZGVkIFBOR19MRUdBQ1lfU1VQUE9SVEVEIG1hY3JvLCBhbmQgI2lmZGVmIG91dCBhbGwgbmV3IChzaW5jZSB2ZXJzaW9uCisgICAgMS4wMCkgbWVtYmVycyBvZiBwbmdfc3RydWN0IGFuZCBwbmdfaW5mbywgdG8gcmVnYWluIGJpbmFyeSBjb21wYXRpYmlsaXR5CisgICAgd2hlbiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8uICBDYXBhYmlsaXRpZXMgbG9zdCBpbiB0aGlzIGV2ZW50CisgICAgYXJlIHVzZXIgdHJhbnNmb3JtcyAobmV3IGluIHZlcnNpb24gMS4wLjApLHRoZSB1c2VyIHRyYW5zZm9ybSBwb2ludGVyCisgICAgKG5ldyBpbiB2ZXJzaW9uIDEuMC4yKSwgcmdiX3RvX2dyYXkgKG5ldyBpbiAxLjAuNSksIGlDQ1AsIHNDQUwsIHNQTFQsCisgICAgdGhlIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlLCBhbmQgdW5rbm93biBjaHVua3Mgc3VwcG9ydCAoYWxsIG5ldyBpbiAxLjAuNikuCisgICAgVGhpcyB3YXMgbmVjZXNzYXJ5IGJlY2F1c2Ugb2Ygb2xkIGFwcGxpY2F0aW9ucyB0aGF0IGFsbG9jYXRlIHRoZSBzdHJ1Y3RzCisgICAgZGlyZWN0bHkgYXMgYXV0aG9ycyB3ZXJlIGluc3RydWN0ZWQgdG8gZG8gaW4gbGlicG5nLTAuODggYW5kIGVhcmxpZXIsCisgICAgaW5zdGVhZCBvZiB1c2luZyBwbmdfY3JlYXRlXyooKS4KKyAgQWRkZWQgbW9kZXMgUE5HX0NSRUFURURfUkVBRF9TVFJVQ1QgYW5kIFBOR19DUkVBVEVEX1dSSVRFX1NUUlVDVCB3aGljaAorICAgIGNhbiBiZSB1c2VkIHRvIGRldGVjdCBjb2RlcyB0aGF0IGRpcmVjdGx5IGFsbG9jYXRlIHRoZSBzdHJ1Y3RzLCBhbmQKKyAgICBjb2RlIHRvIGNoZWNrIHRoZXNlIG1vZGVzIGluIHBuZ19yZWFkX2luaXQoKSBhbmQgcG5nX3dyaXRlX2luaXQoKSBhbmQKKyAgICBnZW5lcmF0ZSBhIGxpYnBuZyBlcnJvciBpZiB0aGUgbW9kZXMgYXJlbid0IHNldCBhbmQgUE5HX0xFR0FDWV9TVVBQT1JURUQKKyAgICB3YXMgbm90IGRlZmluZWQuCisgIEFkZGVkIG1ha2VmaWxlLmludGVsIGFuZCB1cGRhdGVkIG1ha2VmaWxlLndhdGNvbSAoUGF3ZWwgTXJvY2hlbikKKworVmVyc2lvbiAxLjAuNmogW01heSAzLCAyMDAwXQorICBPdmVybG9hZGVkIHBuZ19yZWFkX2luaXQoKSBhbmQgcG5nX3dyaXRlX2luaXQoKSB3aXRoIG1hY3JvcyB0aGF0IGNvbnZlcnQKKyAgICBjYWxscyB0byBwbmdfcmVhZF9pbml0XzIoKSBvciBwbmdfd3JpdGVfaW5pdF8yKCkgdGhhdCBjaGVjayB0aGUgdmVyc2lvbgorICAgIGFuZCBzdHJ1Y3R1cmUgc2l6ZXMuCisKK1ZlcnNpb24gMS4wLjdiZXRhMTEgW01heSA3LCAyMDAwXQorICBSZW1vdmVkIHRoZSBuZXcgUE5HX0NSRUFURURfUkVBRF9TVFJVQ1QgYW5kIFBOR19DUkVBVEVEX1dSSVRFX1NUUlVDVCBtb2RlcworICAgIHdoaWNoIGFyZSBubyBsb25nZXIgdXNlZC4KKyAgRWxpbWluYXRlZCB0aGUgdGhyZWUgbmV3IG1lbWJlcnMgb2YgcG5nX3RleHQgd2hlbiBQTkdfTEVHQUNZX1NVUFBPUlRFRCBpcworICAgIGRlZmluZWQgb3Igd2hlbiBuZWl0aGVyIFBOR19SRUFEX2lUWHRfU1VQUE9SVEVEIG5vciBQTkdfV1JJVEVfaVRYVF9TVVBQT1JURUQKKyAgICBpcyBkZWZpbmVkLgorICBNYWRlIFBOR19OT19SRUFEfFdSSVRFX2lUWHQgdGhlIGRlZmF1bHQgc2V0dGluZywgdG8gYXZvaWQgbWVtb3J5CisgICAgb3ZlcnJ1biB3aGVuIG9sZCBhcHBsaWNhdGlvbnMgZmlsbCB0aGUgaW5mb19wdHItPnRleHQgc3RydWN0dXJlIGRpcmVjdGx5LgorICBBZGRlZCBQTkdBUEkgbWFjcm8sIGFuZCBhZGRlZCBpdCB0byB0aGUgZGVmaW5pdGlvbnMgb2YgYWxsIGV4cG9ydGVkIGZ1bmN0aW9ucy4KKyAgUmVsb2NhdGVkIHZlcnNpb24gbWFjcm8gZGVmaW5pdGlvbnMgYWhlYWQgb2YgdGhlIGluY2x1ZGVzIG9mIHpsaWIuaCBhbmQKKyAgICBwbmdjb25mLmggaW4gcG5nLmguCisKK1ZlcnNpb24gMS4wLjdiZXRhMTIgW01heSAxMiwgMjAwMF0KKyAgUmV2aXNlZCBwbmdzZXQuYyB0byBhdm9pZCBhIHByb2JsZW0gd2l0aCBleHBhbmRpbmcgdGhlIHBuZ19kZWJ1ZyBtYWNyby4KKyAgRGVsZXRlZCBzb21lIGV4dHJhbmVvdXMgZGVmaW5lcyBmcm9tIHBuZ2NvbmYuaAorICBNYWRlIFBOR19OT19DT05TT0xFX0lPIHRoZSBkZWZhdWx0IGNvbmRpdGlvbiB3aGVuIFBOR19CVUlMRF9ETEwgaXMgZGVmaW5lZC4KKyAgVXNlIE1TQyBfUlBUbiBkZWJ1Z2dpbmcgaW5zdGVhZCBvZiBmcHJpbnRmIGlmIF9NU0NfVkVSIGlzIGRlZmluZWQuCisgIEFkZGVkIHBuZ19hY2Nlc3NfdmVyc2lvbl9udW1iZXIoKSBmdW5jdGlvbi4KKyAgQ2hlY2sgZm9yIG1hc2smUE5HX0ZSRUVfQ0hOSyAoZm9yIFRFWFQsIFNDQUwsIFBDQUwpIGluIHBuZ19mcmVlX2RhdGEoKS4KKyAgRXhwYW5kZWQgbGlicG5nLjMvbGlicG5nLnR4dCBpbmZvcm1hdGlvbiBhYm91dCBwbmdfZGF0YV9mcmVlcigpLgorCitWZXJzaW9uIDEuMC43YmV0YTE0IFtNYXkgMTcsIDIwMDBdIChiZXRhMTMgd2FzIG5vdCBwdWJsaXNoZWQpCisgIENoYW5nZWQgcG5nZ2NjcmQuYyBhbmQgcG5ndmNyZC5jIHRvIGhhbmRsZSBiYWQgYWRhcHRpdmUgZmlsdGVyIHR5cGVzIGFzCisgICAgd2FybmluZ3MgaW5zdGVhZCBvZiBlcnJvcnMsIGFzIHBuZ3J1dGlsLmMgZG9lcy4KKyAgU2V0IHRoZSBQTkdfSU5GT19JREFUIHZhbGlkIGZsYWcgaW4gcG5nX3NldF9yb3dzKCkgc28gcG5nX3dyaXRlX3BuZygpCisgICAgd2lsbCBhY3R1YWxseSB3cml0ZSBJREFUcy4KKyAgTWFkZSB0aGUgZGVmYXVsdCBQTkdfVVNFX0xPQ0FMX0FSUkFZUyBkZXBlbmQgb24gUE5HX0RMTCBpbnN0ZWFkIG9mIFdJTjMyLgorICBNYWtlIHBuZ19mcmVlX2RhdGEoKSBpZ25vcmUgaXRzIGZpbmFsIHBhcmFtZXRlciBleGNlcHQgd2hlbiBmcmVlaW5nIGRhdGEKKyAgICB0aGF0IGNhbiBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyAodGV4dCwgc1BMVCwgdW5rbm93bnMpLgorICBGaXhlZCBhIG5ldyBidWcgaW4gcG5nX3NldF9yb3dzKCkuCisgIFJlbW92ZWQgaW5mb19wdHItPnZhbGlkIHRlc3RzIGZyb20gcG5nX2ZyZWVfZGF0YSgpLCBhcyBpbiB2ZXJzaW9uIDEuMC41LgorICBBZGRlZCBwbmdfc2V0X2ludmFsaWQoKSBmdW5jdGlvbi4KKyAgRml4ZWQgaW5jb3JyZWN0IGlsbHVzdHJhdGlvbnMgb2YgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCkgaW4gZXhhbXBsZS5jLgorCitWZXJzaW9uIDEuMC43YmV0YTE1IFtNYXkgMzAsIDIwMDBdCisgIFJldmlzZWQgdGhlIGRlbGliZXJhdGVseSBlcnJvbmVvdXMgTGludXggc2V0am1wIGNvZGUgaW4gcG5nY29uZi5oIHRvIHByb2R1Y2UKKyAgICBmZXdlciBlcnJvciBtZXNzYWdlcy4KKyAgUmVhcnJhbmdlZCBjaGVja3MgZm9yIFpfT0sgdG8gY2hlY2sgdGhlIG1vc3QgbGlrZWx5IHBhdGggZmlyc3QgaW4gcG5ncHJlYWQuYworICAgIGFuZCBwbmd3dXRpbC5jLgorICBBZGRlZCBjaGVja3MgaW4gcG5ndGVzdC5jIGZvciBwbmdfY3JlYXRlXyooKSByZXR1cm5pbmcgTlVMTCwgYW5kIG1lbnRpb25lZAorICAgIGluIGxpYnBuZy50eHQvbGlicG5nLjMgdGhlIG5lZWQgZm9yIGFwcGxpY2F0aW9ucyB0byBjaGVjayB0aGlzLgorICBDaGFuZ2VkIG5hbWVzIG9mIHBuZ19kZWZhdWx0XyooKSBmdW5jdGlvbnMgaW4gcG5ndGVzdCB0byBwbmd0ZXN0XyooKS4KKyAgQ2hhbmdlZCByZXR1cm4gdHlwZSBvZiBwbmdfZ2V0X3h8eV9vZmZzZXRfKigpIGZyb20gcG5nX3VpbnRfMzIgdG8gcG5nX2ludF8zMi4KKyAgRml4ZWQgc29tZSBidWdzIGluIHRoZSB1bnVzZWQgUE5HX0lOQ0hfQ09OVkVSU0lPTlMgZnVuY3Rpb25zIGluIHBuZ2dldC5jCisgIFNldCBlYWNoIHBvaW50ZXIgdG8gTlVMTCBhZnRlciBmcmVlaW5nIGl0IGluIHBuZ19mcmVlX2RhdGEoKS4KKyAgV29ya2VkIGFyb3VuZCBhIHByb2JsZW0gaW4gcG5nY29uZi5oOyBBSVgncyBzdHJpbmdzLmggZGVmaW5lcyBhbiAiaW5kZXgiCisgICAgbWFjcm8gdGhhdCBjb25mbGljdHMgd2l0aCBsaWJwbmcncyBwbmdfY29sb3JfMTYuaW5kZXguIChEaW1pdHJpCisgICAgUGFwYWRhcG91bG9zKQorICBBZGRlZCAibXN2YyIgZGlyZWN0b3J5IHdpdGggTVNWQysrIHByb2plY3QgZmlsZXMgKFNpbW9uLVBpZXJyZSBDYWRpZXV4KS4KKworVmVyc2lvbiAxLjAuN2JldGExNiBbSnVuZSA0LCAyMDAwXQorICBSZXZpc2VkIHRoZSB3b3JrYXJvdW5kIG9mIEFJWCBzdHJpbmcuaCAiaW5kZXgiIGJ1Zy4KKyAgQWRkZWQgYSBjaGVjayBmb3Igb3Zlcmxlbmd0aCBQTFRFIGNodW5rIGluIHBuZ3J1dGlsLmMuCisgIEFkZGVkIFBOR19OT19QT0lOVEVSX0lOREVYSU5HIG1hY3JvIHRvIHVzZSBhcnJheS1pbmRleGluZyBpbnN0ZWFkIG9mIHBvaW50ZXIKKyAgICBpbmRleGluZyBpbiBwbmdydXRpbC5jIGFuZCBwbmd3dXRpbC5jIHRvIGFjY29tbW9kYXRlIGEgYnVnZ3kgY29tcGlsZXIuCisgIEFkZGVkIGEgd2FybmluZyBpbiBwbmdfZGVjb21wcmVzc19jaHVuaygpIHdoZW4gaXQgcnVucyBvdXQgb2YgZGF0YSwgZS5nLgorICAgIHdoZW4gaXQgdHJpZXMgdG8gcmVhZCBhbiBlcnJvbmVvdXMgUGhvdG9TaG9wIGlDQ1AgY2h1bmsuCisgIEFkZGVkIFBOR19VU0VfRExMIG1hY3JvLgorICBSZXZpc2VkIHRoZSBjb3B5cmlnaHQvZGlzY2xhaW1lci9saWNlbnNlIG5vdGljZS4KKyAgQWRkZWQgY29udHJpYi9tc3ZjdGVzdCBkaXJlY3RvcnkKKworVmVyc2lvbiAxLjAuN3JjMSBbSnVuZSA5LCAyMDAwXQorICBDb3JyZWN0ZWQgdGhlIGRlZmluaXRpb24gb2YgUE5HX1RSQU5TRk9STV9JTlZFUlRfQUxQSEEgICgweDA0MDAgbm90IDB4MDIwMCkKKyAgQWRkZWQgY29udHJpYi92aXN1cG5nIGRpcmVjdG9yeSAoV2lsbGVtIHZhbiBTY2hhaWspCisKK1ZlcnNpb24gMS4wLjdiZXRhMTggW0p1bmUgMjMsIDIwMDBdCisgIFJldmlzZWQgUE5HQVBJIGRlZmluaXRpb24sIGFuZCBwbmd2Y3JkLmMgdG8gd29yayB3aXRoIF9fR0NDX18KKyAgICBhbmQgZG8gbm90IHJlZGVmaW5lIFBOR0FQSSBpZiBpdCBpcyBwYXNzZWQgaW4gdmlhIGEgY29tcGlsZXIgZGlyZWN0aXZlLgorICBSZXZpc2VkIHZpc3VwbmcvUG5nRmlsZS5jIHRvIHJlbW92ZSByZXR1cm5zIGZyb20gd2l0aGluIHRoZSBUcnkgYmxvY2suCisgIFJlbW92ZWQgbGVhZGluZyB1bmRlcnNjb3JlcyBmcm9tICJfUE5HX0giIGFuZCAiX1BOR19TQVZFX0JTRF9TT1VSQ0UiIG1hY3Jvcy4KKyAgVXBkYXRlZCBjb250cmliL3Zpc3VwbmcvY2V4Y2VwdC5oIHRvIHZlcnNpb24gMS4wLjAuCisgIEZpeGVkIGJ1Z3MgaW4gcG5nd3JpdGUuYyBhbmQgcG5nd3V0aWwuYyB0aGF0IHByZXZlbnRlZCB3cml0aW5nIGlDQ1AgY2h1bmtzLgorCitWZXJzaW9uIDEuMC43cmMyIFtKdW5lIDI4LCAyMDAwXQorICBVcGRhdGVkIGxpY2Vuc2UgdG8gaW5jbHVkZSBkaXNjbGFpbWVycyByZXF1aXJlZCBieSBVQ0lUQS4KKyAgRml4ZWQgIkRKQlBQIiB0eXBvIGluIHBuZ2djY3JkLmMgaW50cm9kdWNlZCBpbiBiZXRhMTguCisKK1ZlcnNpb24gMS4wLjcgW0p1bHkgMSwgMjAwMF0KKyAgUmV2aXNlZCB0aGUgZGVmaW5pdGlvbiBvZiAidHJhbnNfdmFsdWVzIiBpbiBsaWJwbmcuMy9saWJwbmcudHh0CisKK1ZlcnNpb24gMS4wLjhiZXRhMSBbSnVseSA4LCAyMDAwXQorICBBZGRlZCBwbmdfZnJlZShwbmdfcHRyLCBrZXkpIHR3byBwbGFjZXMgaW4gcG5ncHJlYWQuYyB0byBzdG9wIG1lbW9yeSBsZWFrcy4KKyAgQ2hhbmdlZCBQTkdfTk9fU1RESU8gdG8gUE5HX05PX0NPTlNPTEVfSU8sIHNldmVyYWwgcGxhY2VzIGluIHBuZ3J1dGlsLmMgYW5kCisgICAgcG5nd3V0aWwuYy4KKyAgQ2hhbmdlZCBQTkdfRVhQT1JUX1ZBUiB0byB1c2UgUE5HX0lNUEVYUCwgaW4gcG5nY29uZi5oLgorICBSZW1vdmVkIHVudXNlZCAiI2luY2x1ZGUgPGFzc2VydC5oPiIgZnJvbSBwbmcuYworICBBZGRlZCBXaW5kb3dzQ0Ugc3VwcG9ydC4KKyAgUmV2aXNlZCBwbmdnY2NyZC5jIHRvIHdvcmsgd2l0aCBnY2MtMi45NS4yIGFuZCBpbiB0aGUgQ3lnd2luIGVudmlyb25tZW50LgorCitWZXJzaW9uIDEuMC44YmV0YTIgW0p1bHkgMTAsIDIwMDBdCisgIEFkZGVkIHByb2plY3QgZmlsZXMgdG8gdGhlIHdpbmNlIGRpcmVjdG9yeSBhbmQgbWFkZSBmdXJ0aGVyIHJldmlzaW9ucworICAgIG9mIHBuZ3Rlc3QuYywgcG5ncmlvLmMsIGFuZCBwbmd3aW8uYyBpbiBzdXBwb3J0IG9mIFdpbmRvd3NDRS4KKworVmVyc2lvbiAxLjAuOGJldGEzIFtKdWx5IDExLCAyMDAwXQorICBPbmx5IHNldCB0aGUgUE5HX0ZMQUdfRlJFRV9UUk5TIG9yIFBOR19GUkVFX1RSTlMgZmxhZyBpbiBwbmdfaGFuZGxlX3RSTlMoKQorICAgIGZvciBpbmRleGVkLWNvbG9yIGlucHV0IGZpbGVzIHRvIGF2b2lkIHBvdGVudGlhbCBkb3VibGUtZnJlZWluZyB0cmFucyBhcnJheQorICAgIHVuZGVyIHNvbWUgdW51c3VhbCBjb25kaXRpb25zOyBwcm9ibGVtIHdhcyBpbnRyb2R1Y2VkIGluIHZlcnNpb24gMS4wLjZmLgorICBGdXJ0aGVyIHJldmlzaW9ucyB0byBwbmd0ZXN0LmMgYW5kIGZpbGVzIGluIHRoZSB3aW5jZSBzdWJkaXJlY3RvcnkuCisKK1ZlcnNpb24gMS4wLjhiZXRhNCBbSnVseSAxNCwgMjAwMF0KKyAgQWRkZWQgdGhlIGZpbGVzIHBuZ2Jhci5wbmcgYW5kIHBuZ2Jhci5qcGcgdG8gdGhlIGRpc3RyaWJ1dGlvbi4KKyAgQWRkZWQgbWFrZWZpbGUuY3lnd2luLCBhbmQgY3lnd2luIHN1cHBvcnQgaW4gcG5nY29uZi5oCisgIEFkZGVkIFBOR19OT19aQUxMT0NfWkVSTyBtYWNybyAobWFrZXMgcG5nX3phbGxvYyBza2lwIHplcm9pbmcgbWVtb3J5KQorCitWZXJzaW9uIDEuMC44cmMxIFtKdWx5IDE2LCAyMDAwXQorICBSZXZpc2VkIHBuZ19kZWJ1ZygpIG1hY3JvcyBhbmQgc3RhdGVtZW50cyB0byBlbGltaW5hdGUgY29tcGlsZXIgd2FybmluZ3MuCisKK1ZlcnNpb24gMS4wLjggW0p1bHkgMjQsIDIwMDBdCisgIEFkZGVkIHBuZ19mbHVzaCgpIGluIHBuZ3dyaXRlLmMsIGFmdGVyIHBuZ193cml0ZV9JRU5EKCkuCisgIFVwZGF0ZWQgbWFrZWZpbGUuaHB1eCB0byBidWlsZCBhIHNoYXJlZCBsaWJyYXJ5LgorCitWZXJzaW9uIDEuMC45YmV0YTEgW05vdmVtYmVyIDEwLCAyMDAwXQorICBGaXhlZCB0eXBvIGluIHNjcmlwdHMvbWFrZWZpbGUuaHB1eAorICBVcGRhdGVkIG1ha2V2bXMuY29tIGluIHNjcmlwdHMgYW5kIGNvbnRyaWIvKiBhbmQgY29udHJpYi8qIChNYXJ0aW4gWmluc2VyKQorICBGaXhlZCBzZXFlbmNlLXBvaW50IGJ1ZyBpbiBjb250cmliL3BuZ21pbnVzL3BuZzJwbm0gKE1hcnRpbiBaaW5zZXIpCisgIENoYW5nZWQgImNkcm9tLmNvbSIgaW4gZG9jdW1lbnRhdGlvbiB0byAibGlicG5nLm9yZyIKKyAgUmV2aXNlZCBwbmdnY2NyZC5jIHRvIGdldCBpdCBhbGwgd29ya2luZywgYW5kIHVwZGF0ZWQgbWFrZWZpbGUuZ2NtbXggKEdyZWcpLgorICBDaGFuZ2VkIHR5cGUgb2YgInBhcmFtcyIgZnJvbSB2b2lkcCB0byBwbmdfdm9pZHAgaW4gcG5nX3JlYWR8d3JpdGVfcG5nKCkuCisgIE1ha2Ugc3VyZSBQTkdBUEkgYW5kIFBOR19JTVBFWFAgYXJlIGRlZmluZWQgaW4gcG5nY29uZi5oLgorICBSZXZpc2VkIHRoZSAzIGluc3RhbmNlcyBvZiBXUklURUZJTEUgaW4gcG5ndGVzdC5jLgorICBSZWxvY2F0ZWQgIm1zdmMiIGFuZCAid2luY2UiIHByb2plY3Qgc3ViZGlyZWN0b3JpZXMgaW50byAiZGxsIiBzdWJkaXJlY3RvcnkuCisgIFVwZGF0ZWQgcG5nLnJjIGluIGRsbC9tc3ZjIHByb2plY3QKKyAgUmV2aXNlZCBtYWtlZmlsZS5kZWMgdG8gZGVmaW5lIGFuZCB1c2UgTElCUEFUSCBhbmQgSU5DUEFUSAorICBJbmNyZWFzZWQgc2l6ZSBvZiBnbG9iYWwgcG5nX2xpYnBuZ192ZXJbXSBhcnJheSBmcm9tIDEyIHRvIDE4IGNoYXJzLgorICBNYWRlIGdsb2JhbCBwbmdfbGlicG5nX3ZlcltdLCBwbmdfc2lnW10gYW5kIHBuZ19wYXNzXypbXSBhcnJheXMgY29uc3QuCisgIFJlbW92ZWQgZHVwbGljYXRlIHBuZ19jcmNfZmluaXNoKCkgZnJvbSBwbmdfaGFuZGxlX2JLR0QoKSBmdW5jdGlvbi4KKyAgQWRkZWQgYSB3YXJuaW5nIHdoZW4gYXBwbGljYXRpb24gY2FsbHMgcG5nX3JlYWRfdXBkYXRlX2luZm8oKSBtdWx0aXBsZSB0aW1lcy4KKyAgUmV2aXNlZCBtYWtlZmlsZS5jeWd3aW4KKyAgRml4ZWQgYnVncyBpbiBpQ0NQIHN1cHBvcnQgaW4gcG5ncnV0aWwuYyBhbmQgcG5nd3V0aWwuYy4KKyAgUmVwbGFjZWQgcG5nX3NldF9lbXB0eV9wbHRlX3Blcm1pdHRlZCgpIHdpdGggcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMoKS4KKworVmVyc2lvbiAxLjAuOWJldGEyIFtOb3ZlbWJlciAxOSwgMjAwMF0KKyAgUmVuYW1lZCB0aGUgImRsbCIgc3ViZGlyZWN0b3J5ICJwcm9qZWN0cyIuCisgIEFkZGVkIGJvcmxhbmQgcHJvamVjdCBmaWxlcyB0byAicHJvamVjdHMiIHN1YmRpcmVjdG9yeS4KKyAgU2V0IFZTX0ZGX1BSRVJFTEVBU0UgYW5kIFZTX0ZGX1BBVENIRUQgZmxhZ3MgaW4gbXN2Yy9wbmcucmMgd2hlbiBhcHByb3ByaWF0ZS4KKyAgQWRkIGVycm9yIG1lc3NhZ2UgaW4gcG5nX3NldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZSgpIHdoZW4gbWFsbG9jIGZhaWxzLgorCitWZXJzaW9uIDEuMC45YmV0YTMgW05vdmVtYmVyIDIzLCAyMDAwXQorICBSZXZpc2VkIFBOR19MSUJQTkdfQlVJTERfVFlQRSBtYWNybyBpbiBwbmcuaCwgdXNlZCBpbiB0aGUgbXN2YyBwcm9qZWN0LgorICBSZW1vdmVkIHRoZSBwbmdfZmx1c2goKSBpbiBwbmd3cml0ZS5jIHRoYXQgY3Jhc2hlcyBzb21lIGFwcGxpY2F0aW9ucworICAgIHRoYXQgZG9uJ3Qgc2V0IHBuZ19vdXRwdXRfZmx1c2hfZm4uCisgIEFkZGVkIG1ha2VmaWxlLm1hY29zeCBhbmQgbWFrZWZpbGUuYWl4IHRvIHNjcmlwdHMgZGlyZWN0b3J5LgorCitWZXJzaW9uIDEuMC45YmV0YTQgW0RlY2VtYmVyIDEsIDIwMDBdCisgIENoYW5nZSBwbmdfY2h1bmtfd2FybmluZyB0byBwbmdfd2FybmluZyBpbiBwbmdfY2hlY2tfa2V5d29yZCgpLgorICBJbmNyZWFzZWQgdGhlIGZpcnN0IHBhcnQgb2YgbXNnIGJ1ZmZlciBmcm9tIDE2IHRvIDE4IGluIHBuZ19jaHVua19lcnJvcigpLgorCitWZXJzaW9uIDEuMC45YmV0YTUgW0RlY2VtYmVyIDE1LCAyMDAwXQorICBBZGRlZCBzdXBwb3J0IGZvciBmaWx0ZXIgbWV0aG9kIDY0IChmb3IgUE5HIGRhdGFzdHJlYW1zIGVtYmVkZGVkIGluIE1ORykuCisKK1ZlcnNpb24gMS4wLjliZXRhNiBbRGVjZW1iZXIgMTgsIDIwMDBdCisgIFJldmlzZWQgcG5nX3NldF9maWx0ZXIoKSB0byBhY2NlcHQgZmlsdGVyIG1ldGhvZCA2NCB3aGVuIGFwcHJvcHJpYXRlLgorICBBZGRlZCBuZXcgUE5HX0hBVkVfUE5HX1NJR05BVFVSRSBiaXQgdG8gcG5nX3B0ci0+bW9kZSBhbmQgdXNlIGl0IHRvCisgICAgaGVscCBwcmV2ZW50IGFwcGxpY2F0aW9ucyBmcm9tIHVzaW5nIE1ORyBmZWF0dXJlcyBpbiBQTkcgZGF0YXN0cmVhbXMuCisgIEFkZGVkIHBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzKCkgZnVuY3Rpb24uCisgIFJldmlzZWQgbGlicG5nLjMvbGlicG5nLnR4dC4gIENoYW5nZWQgImZpbHRlciB0eXBlIiB0byAiZmlsdGVyIG1ldGhvZCIuCisKK1ZlcnNpb24gMS4wLjlyYzEgW0RlY2VtYmVyIDIzLCAyMDAwXQorICBSZXZpc2VkIHRlc3QgZm9yIFBOR19IQVZFX1BOR19TSUdOQVRVUkUgaW4gcG5ncnV0aWwuYworICBGaXhlZCBlcnJvciBoYW5kbGluZyBvZiB1bmtub3duIGNvbXByZXNzaW9uIHR5cGUgaW4gcG5nX2RlY29tcHJlc3NfY2h1bmsoKS4KKyAgSW4gcG5nY29uZi5oLCBkZWZpbmUgX19jZGVjbCB3aGVuIF9NU0NfVkVSIGlzIGRlZmluZWQuCisKK1ZlcnNpb24gMS4wLjliZXRhNyBbRGVjZW1iZXIgMjgsIDIwMDBdCisgIENoYW5nZWQgUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdCB0byBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFIHNldmVyYWwgcGxhY2VzLgorICBSZXZpc2VkIG1lbW9yeSBtYW5hZ2VtZW50IGluIHBuZ19zZXRfaElTVCBhbmQgcG5nX2hhbmRsZV9oSVNUIGluIGEgYmFja3dhcmQKKyAgICBjb21wYXRpYmxlIG1hbm5lci4gIFBMVEUgYW5kIHRSTlMgd2VyZSByZXZpc2VkIHNpbWlsYXJseS4KKyAgUmV2aXNlZCB0aGUgaUNDUCBjaHVuayByZWFkZXIgdG8gaWdub3JlIHRyYWlsaW5nIGdhcmJhZ2UuCisKK1ZlcnNpb24gMS4wLjliZXRhOCBbSmFudWFyeSAxMiwgMjAwMV0KKyAgTW92ZWQgcG5nYXNtcmQuaCBpbnRvIHBuZ2NvbmYuaC4KKyAgSW1wcm92ZWQgaGFuZGxpbmcgb2Ygb3V0LW9mLXNwZWMgZ2FyYmFnZSBpQ0NQIGNodW5rcyBnZW5lcmF0ZWQgYnkgUGhvdG9TaG9wLgorCitWZXJzaW9uIDEuMC45YmV0YTkgW0phbnVhcnkgMTUsIDIwMDFdCisgIEFkZGVkIHBuZ19zZXRfaW52YWxpZCwgcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMsIGFuZCBwbmdfbW14X3N1cHBvcnRlZCB0bworICAgIHdpbmNlIGFuZCBtc3ZjIHByb2plY3QgbW9kdWxlIGRlZmluaXRpb24gZmlsZXMuCisgIE1pbm9yIHJldmlzaW9uIG9mIG1ha2VmaWxlLmN5Z3dpbi4KKyAgRml4ZWQgYnVnIHdpdGggcHJvZ3Jlc3NpdmUgcmVhZGluZyBvZiBuYXJyb3cgaW50ZXJsYWNlZCBpbWFnZXMgaW4gcG5ncHJlYWQuYworCitWZXJzaW9uIDEuMC45YmV0YTEwIFtKYW51YXJ5IDE2LCAyMDAxXQorICBEbyBub3QgdHlwZWRlZiBwbmdfRklMRV9wIGluIHBuZ2NvbmYuaCB3aGVuIFBOR19OT19TVERJTyBpcyBkZWZpbmVkLgorICBGaXhlZCAicG5nX21teF9zdXBwb3J0ZWQiIHR5cG8gaW4gcHJvamVjdCBkZWZpbml0aW9uIGZpbGVzLgorCitWZXJzaW9uIDEuMC45YmV0YTExIFtKYW51YXJ5IDE5LCAyMDAxXQorICBVcGRhdGVkIG1ha2VmaWxlLnNnaSB0byBtYWtlIHNoYXJlZCBsaWJyYXJ5LgorICBSZW1vdmVkIHBuZ19tbXhfc3VwcG9ydCgpIGZ1bmN0aW9uIGFuZCBkaXNhYmxlZCBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRAorICAgIGJ5IGRlZmF1bHQsIGZvciB0aGUgYmVuZWZpdCBvZiBETEwgZm9yd2FyZCBjb21wYXRpYmlsaXR5LiAgVGhlc2Ugd2lsbAorICAgIGJlIHJlLWVuYWJsZWQgaW4gdmVyc2lvbiAxLjIuMC4KKworVmVyc2lvbiAxLjAuOXJjMiBbSmFudWFyeSAyMiwgMjAwMV0KKyAgUmV2aXNlZCBjeWd3aW4gc3VwcG9ydC4KKworVmVyc2lvbiAxLjAuOSBbSmFudWFyeSAzMSwgMjAwMV0KKyAgQWRkZWQgY2hlY2sgb2YgY3lnd2luJ3MgQUxMX1NUQVRJQyBpbiBwbmdjb25mLmgKKyAgQWRkZWQgIi1ub21teCIgcGFyYW1ldGVyIHRvIGNvbnRyaWIvZ3JlZ2Jvb2svcnBuZzItd2luIGFuZCBycG5nMi14IGRlbW9zLgorCitWZXJzaW9uIDEuMC4xMGJldGExIFtNYXJjaCAxNCwgMjAwMV0KKyAgUmV2aXNlZCBtYWtlZmlsZS5kZWMsIG1ha2VmaWxlLnNnaSwgYW5kIG1ha2VmaWxlLnNnZ2NjOyBhZGRlZCBtYWtlZmlsZS5ocGdjYy4KKyAgUmVmb3JtYXR0ZWQgbGlicG5nLjMgdG8gZWxpbWluYXRlIGJhZCBsaW5lIGJyZWFrcy4KKyAgQWRkZWQgY2hlY2tzIGZvciBfbW14X3N1cHBvcnRlZCBpbiB0aGUgcmVhZF9maWx0ZXJfcm93IGZ1bmN0aW9uIG9mIHBuZ2djY3JkLmMKKyAgQWRkZWQgcHJvdG90eXBlIGZvciBwbmdfbW14X3N1cHBvcnQoKSBuZWFyIHRoZSB0b3Agb2YgcG5nZ2NjcmQuYworICBNb3ZlZCBzb21lIGVycm9yIGNoZWNraW5nIGZyb20gcG5nX2hhbmRsZV9JSERSIHRvIHBuZ19zZXRfSUhEUi4KKyAgQWRkZWQgUE5HX05PX1JFQURfU1VQUE9SVEVEIGFuZCBQTkdfTk9fV1JJVEVfU1VQUE9SVEVEIG1hY3Jvcy4KKyAgUmV2aXNlZCBwbmdfbW14X3N1cHBvcnQoKSBmdW5jdGlvbiBpbiBwbmdnY2NyZC5jCisgIFJlc3RvcmVkIHZlcnNpb24gMS4wLjggUE5HX1dSSVRFX0VNUFRZX1BMVEVfU1VQUE9SVEVEIGJlaGF2aW9yIGluIHBuZ3d1dGlsLmMKKyAgRml4ZWQgbWVtb3J5IGxlYWsgaW4gY29udHJpYi92aXN1cG5nL1BuZ0ZpbGUuYworICBGaXhlZCBidWdzIGluIHBuZ19jb21iaW5lX3JvdygpIGluIHBuZ2djY3JkLmMgYW5kIHBuZ3ZjcmQuYyAoQyB2ZXJzaW9uKQorICBBZGRlZCB3YXJuaW5ncyB3aGVuIHJldHJpZXZpbmcgb3Igc2V0dGluZyBnYW1tYT0wLgorICBJbmNyZWFzZWQgdGhlIGZpcnN0IHBhcnQgb2YgbXNnIGJ1ZmZlciBmcm9tIDE2IHRvIDE4IGluIHBuZ19jaHVua193YXJuaW5nKCkuCisKK1ZlcnNpb24gMS4wLjEwcmMxIFtNYXJjaCAyMywgMjAwMV0KKyAgQ2hhbmdlZCBhbGwgaW5zdGFuY2VzIG9mIG1lbWNweSwgc3RyY3B5LCBhbmQgc3RybGVuIHRvIHBuZ19tZW1jcHksIHBuZ19zdHJjcHksCisgICAgYW5kIHBuZ19zdHJsZW4uCisgIFJldmlzZWQgcG5nX21teF9zdXBwb3J0ZWQoKSBmdW5jdGlvbiBpbiBwbmdnY2NyZC5jIHRvIHJldHVybiBwcm9wZXIgdmFsdWUuCisgIEZpeGVkIGJ1ZyBpbiBwcm9ncmVzc2l2ZSByZWFkaW5nIChwbmdwcmVhZC5jKSB3aXRoIHNtYWxsIGltYWdlcyAoaGVpZ2h0IDwgOCkuCisKK1ZlcnNpb24gMS4wLjEwIFtNYXJjaCAzMCwgMjAwMV0KKyAgRGVsZXRlZCBleHRyYW5lb3VzIHNwYWNlIChpbnRyb2R1Y2VkIGluIDEuMC45KSBmcm9tIGxpbmUgNDIgb2YgbWFrZWZpbGUuY3lnd2luCisgIEFkZGVkIGJlb3MgcHJvamVjdCBmaWxlcyAoQ2hyaXMgSGVyYm9ydGgpCisKK1ZlcnNpb24gMS4wLjExYmV0YTEgW0FwcmlsIDMsIDIwMDFdCisgIEFkZGVkIHR5cGUgY2FzdHMgb24gc2V2ZXJhbCBwbmdfbWFsbG9jKCkgY2FsbHMgKERpbWl0cmkgUGFwYWRhcG91bG9zKS4KKyAgUmVtb3ZlZCBhIG5vLWxvbmdlciBuZWVkZWQgQUlYIHdvcmstYXJvdW5kIGZyb20gcG5nY29uZi5oCisgIENoYW5nZWQgc2V2ZXJhbCAiLy8iIHNpbmdsZS1saW5lIGNvbW1lbnRzIHRvIEMtc3R5bGUgaW4gcG5nZ2NjcmQuYworCitWZXJzaW9uIDEuMC4xMWJldGEyIFtBcHJpbCAxMSwgMjAwMV0KKyAgUmVtb3ZlZCBQTkdBUEkgZnJvbSBzZXZlcmFsIGZ1bmN0aW9ucyB3aG9zZSBwcm90b3R5cGVzIGRpZCBub3QgaGF2ZSBQTkdBUEkuCisgIFVwZGF0ZWQgc2NyaXB0cy9wbmdvczIuZGVmCisKK1ZlcnNpb24gMS4wLjExYmV0YTMgW0FwcmlsIDE0LCAyMDAxXQorICBBZGRlZCBjaGVja2luZyB0aGUgcmVzdWx0cyBvZiBtYW55IGluc3RhbmNlcyBvZiBwbmdfbWFsbG9jKCkgZm9yIE5VTEwKKworVmVyc2lvbiAxLjAuMTFiZXRhNCBbQXByaWwgMjAsIDIwMDFdCisgIFVuZGlkIHRoZSBjaGFuZ2VzIGZyb20gdmVyc2lvbiAxLjAuMTFiZXRhMy4gIEFkZGVkIGEgY2hlY2sgZm9yIE5VTEwgcmV0dXJuCisgICAgZnJvbSB1c2VyJ3MgbWFsbG9jX2ZuKCkuCisgIFJlbW92ZWQgc29tZSB1c2VsZXNzIHR5cGUgY2FzdHMgb2YgdGhlIE5VTEwgcG9pbnRlci4KKyAgQWRkZWQgbWFrZWZpbGUubmV0YnNkCisKK1ZlcnNpb24gMS4wLjExIFtBcHJpbCAyNywgMjAwMV0KKyAgUmV2aXNlZCBtYWtlZmlsZS5uZXRic2QKKworVmVyc2lvbiAxLjAuMTJiZXRhMSBbTWF5IDE0LCAyMDAxXQorICBUZXN0IGZvciBXaW5kb3dzIHBsYXRmb3JtIGluIHBuZ2NvbmYuaCB3aGVuIGluY2x1ZGluZyBtYWxsb2MuaCAoRW1tYW51ZWwgQmxvdCkKKyAgVXBkYXRlZCBtYWtlZmlsZS5jeWd3aW4gYW5kIGhhbmRsaW5nIG9mIEN5Z3dpbidzIEFMTF9TVEFUSUMgaW4gcG5nY29uZi5oCisgIEFkZGVkIHNvbWUgbmV2ZXItdG8tYmUtZXhlY3V0ZWQgY29kZSBpbiBwbmdnY2NyZC5jIHRvIHF1aWV0IGNvbXBpbGVyIHdhcm5pbmdzLgorICBFbGltaW5hdGVkIHRoZSBwbmdfZXJyb3IgYWJvdXQgYXBwcyB1c2luZyBwbmdfcmVhZHx3cml0ZV9pbml0KCkuICBJbnN0ZWFkLAorICAgIGxpYnBuZyB3aWxsIHJlYWxsb2NhdGUgdGhlIHBuZ19zdHJ1Y3QgYW5kIGluZm9fc3RydWN0IGlmIHRoZXkgYXJlIHRvbyBzbWFsbC4KKyAgICBUaGlzIHJldGFpbnMgZnV0dXJlIGJpbmFyeSBjb21wYXRpYmlsaXR5IGZvciBvbGQgYXBwbGljYXRpb25zIHdyaXR0ZW4gZm9yCisgICAgbGlicG5nLTAuODggYW5kIGVhcmxpZXIuCisKK1ZlcnNpb24gMS4yLjBiZXRhMSBbTWF5IDYsIDIwMDFdCisgIEJ1bXBlZCBETExOVU0gdG8gMi4KKyAgUmUtZW5hYmxlZCBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRCBhbmQgZW5hYmxlZCBQTkdfQVNTRU1CTEVSX0NPREVfU1VQUE9SVEVECisgICAgYnkgZGVmYXVsdC4KKyAgQWRkZWQgcnVudGltZSBzZWxlY3Rpb24gb2YgTU1YIGZlYXR1cmVzLgorICBBZGRlZCBwbmdfc2V0X3N0cmlwX2Vycm9yX251bWJlcnMgZnVuY3Rpb24gYW5kIHJlbGF0ZWQgbWFjcm9zLgorCitWZXJzaW9uIDEuMi4wYmV0YTIgW01heSA3LCAyMDAxXQorICBGaW5pc2hlZCBtZXJnaW5nIDEuMi4wYmV0YTEgd2l0aCB2ZXJzaW9uIDEuMC4xMQorICBBZGRlZCBhIGNoZWNrIGZvciBhdHRlbXB0cyB0byByZWFkIG9yIHdyaXRlIFBMVEUgaW4gZ3JheXNjYWxlIFBORyBkYXRhc3RyZWFtcy4KKworVmVyc2lvbiAxLjIuMGJldGEzIFtNYXkgMTcsIDIwMDFdCisgIEVuYWJsZWQgdXNlciBtZW1vcnkgZnVuY3Rpb24gYnkgZGVmYXVsdC4KKyAgTW9kaWZpZWQgcG5nX2NyZWF0ZV9zdHJ1Y3Qgc28gaXQgcGFzc2VzIHVzZXIgbWVtX3B0ciB0byB1c2VyIG1lbW9yeSBhbGxvY2F0b3IuCisgIEluY3JlYXNlZCBwbmdfbW5nX2ZlYXR1cmVzIGZsYWcgZnJvbSBwbmdfYnl0ZSB0byBwbmdfdWludF8zMi4KKyAgQnVtcGVkIHNoYXJlZC1saWJyYXJ5IChzby1udW1iZXIpIGFuZCBkbGwtbnVtYmVyIHRvIDMuCisKK1ZlcnNpb24gMS4yLjBiZXRhNCBbSnVuZSAyMywgMjAwMV0KKyAgQ2hlY2sgZm9yIG1pc3NpbmcgcHJvZmlsZSBsZW5ndGggZmllbGQgaW4gaUNDUCBjaHVuayBhbmQgZnJlZSBjaHVua19kYXRhCisgICAgaW4gY2FzZSBvZiB0cnVuY2F0ZWQgaUNDUCBjaHVuay4KKyAgQnVtcGVkIHNoYXJlZC1saWJyYXJ5IG51bWJlciB0byAzIGluIG1ha2VmaWxlLnNnaSBhbmQgbWFrZWZpbGUuc2dnY2MKKyAgQnVtcGVkIGRsbC1udW1iZXIgZnJvbSAyIHRvIDMgaW4gbWFrZWZpbGUuY3lnd2luCisgIFJldmlzZWQgY29udHJpYi9ncmVnYm9vay9ycG5nKi14LmMgdG8gYXZvaWQgYSBtZW1vcnkgbGVhayBhbmQgdG8gZXhpdCBjbGVhbmx5CisgICAgaWYgdXNlciBhdHRlbXB0cyB0byBydW4gaXQgb24gYW4gOC1iaXQgZGlzcGxheS4KKyAgVXBkYXRlZCBjb250cmliL2dyZWdib29rCisgIFVzZSBwbmdfbWFsbG9jIGluc3RlYWQgb2YgcG5nX3phbGxvYyB0byBhbGxvY2F0ZSBwYWxldHRlIGluIHBuZ3NldC5jCisgIFVwZGF0ZWQgbWFrZWZpbGUuaWJtYworICBBZGRlZCBzb21lIHR5cGVjYXN0cyB0byBlbGltaW5hdGUgZ2NjIDMuMCB3YXJuaW5ncy4gIENoYW5nZWQgcHJvdG90eXBlcworICAgIG9mIHBuZ193cml0ZV9vRkZTIHdpZHRoIGFuZCBoZWlnaHQgZnJvbSBwbmdfdWludF8zMiB0byBwbmdfaW50XzMyLgorICBVcGRhdGVkIGV4YW1wbGUuYworICBSZXZpc2VkIHByb3RvdHlwZXMgZm9yIHBuZ19kZWJ1Z19tYWxsb2MgYW5kIHBuZ19kZWJ1Z19mcmVlIGluIHBuZ3Rlc3QuYworCitWZXJzaW9uIDEuMi4wYmV0YTUgW0F1Z3VzdCA4LCAyMDAxXQorICBSZXZpc2VkIGNvbnRyaWIvZ3JlZ2Jvb2sKKyAgUmV2aXNlZCBtYWtlZmlsZS5nY21teAorICBSZXZpc2VkIHBuZ2djY3JkLmMgdG8gY29uZGl0aW9uYWxseSBjb21waWxlIHNvbWUgdGhyZWFkLXVuc2FmZSBjb2RlIG9ubHkKKyAgICB3aGVuIFBOR19USFJFQURfVU5TQUZFX09LIGlzIGRlZmluZWQuCisgIEFkZGVkIHRlc3RzIHRvIHByZXZlbnQgcG5nd3V0aWwuYyBmcm9tIHdyaXRpbmcgYSBiS0dEIG9yIHRSTlMgY2h1bmsgd2l0aAorICAgIHZhbHVlIGV4Y2VlZGluZyAyXmJpdF9kZXB0aC0xCisgIFJldmlzZWQgbWFrZWZpbGUuc2dpIGFuZCBtYWtlZmlsZS5zZ2djYworICBSZXBsYWNlZCBjYWxscyB0byBmcHJpbnRmKHN0ZGVyciwuLi4pIHdpdGggcG5nX3dhcm5pbmcoKSBpbiBwbmdnY2NyZC5jCisgIFJlbW92ZWQgcmVzdHJpY3Rpb24gdGhhdCBkb19pbnZlcnRfbW9ubyBvbmx5IG9wZXJhdGUgb24gMS1iaXQgb3BhcXVlIGZpbGVzCisKK1ZlcnNpb24gMS4yLjAgW1NlcHRlbWJlciAxLCAyMDAxXQorICBDaGFuZ2VkIGEgcG5nX3dhcm5pbmcoKSB0byBwbmdfZGVidWcoKSBpbiBwbmdnY2NyZC5jCisgIEZpeGVkIGNvbnRyaWIvZ3JlZ2Jvb2svcnBuZy14LmMsIHJwbmcyLXguYyB0byBhdm9pZCBjcmFzaCB3aXRoIFhGcmVlR0MoKS4KKworVmVyc2lvbiAxLjIuMWJldGExIFtPY3RvYmVyIDE5LCAyMDAxXQorICBSZXZpc2VkIG1ha2VmaWxlLnN0ZCBpbiBjb250cmliL3BuZ21pbnVzCisgIEluY2x1ZGUgYmFja2dyb3VuZF8xIGluIHBuZ19zdHJ1Y3QgcmVnYXJkbGVzcyBvZiBnYW1tYSBzdXBwb3J0LgorICBSZXZpc2VkIG1ha2VmaWxlLm5ldGJzZCBhbmQgbWFrZWZpbGUubWFjb3N4LCBhZGRlZCBtYWtlZmlsZS5kYXJ3aW4uCisgIFJldmlzZWQgZXhhbXBsZS5jIHRvIHByb3ZpZGUgbW9yZSBkZXRhaWxzIGFib3V0IHVzaW5nIHJvd19jYWxsYmFjaygpLgorCitWZXJzaW9uIDEuMi4xYmV0YTIgW09jdG9iZXIgMjUsIDIwMDFdCisgIEFkZGVkIHR5cGUgY2FzdCB0byBlYWNoIE5VTEwgYXBwZWFyaW5nIGluIGEgZnVuY3Rpb24gY2FsbCwgZXhjZXB0IGZvcgorICAgIFdJTkNFIGZ1bmN0aW9ucy4KKyAgQWRkZWQgbWFrZWZpbGUuc285LgorCitWZXJzaW9uIDEuMi4xYmV0YTMgW09jdG9iZXIgMjcsIDIwMDFdCisgIFJlbW92ZWQgdHlwZSBjYXN0cyBmcm9tIGFsbCBOVUxMcy4KKyAgU2ltcGxpZmllZCBwbmdfY3JlYXRlX3N0cnVjdF8yKCkuCisKK1ZlcnNpb24gMS4yLjFiZXRhNCBbTm92ZW1iZXIgNywgMjAwMV0KKyAgUmV2aXNlZCBwbmdfY3JlYXRlX2luZm9fc3RydWN0KCkgYW5kIHBuZ19jcmVhdF9zdHJ1Y3RfMigpLgorICBBZGRlZCBlcnJvciBtZXNzYWdlIGlmIHBuZ193cml0ZV9pbmZvKCkgd2FzIG9taXR0ZWQuCisgIFR5cGUgY2FzdCBOVUxMcyBhcHBlYXJpbmcgaW4gZnVuY3Rpb24gY2FsbHMgd2hlbiBfTk9fUFJPVE8gb3IKKyAgICBQTkdfVFlQRUNBU1RfTlVMTCBpcyBkZWZpbmVkLgorCitWZXJzaW9uIDEuMi4xcmMxIFtOb3ZlbWJlciAyNCwgMjAwMV0KKyAgVHlwZSBjYXN0IE5VTExzIGFwcGVhcmluZyBpbiBmdW5jdGlvbiBjYWxscyBleGNlcHQgd2hlbiBQTkdfTk9fVFlQRUNBU1RfTlVMTAorICAgIGlzIGRlZmluZWQuCisgIENoYW5nZWQgdHlwZWNhc3Qgb2YgInNpemUiIGFyZ3VtZW50IHRvIHBuZ19zaXplX3QgaW4gcG5nbWVtLmMgY2FsbHMgdG8KKyAgICB0aGUgdXNlciBtYWxsb2NfZm4sIHRvIGFncmVlIHdpdGggdGhlIHByb3RvdHlwZSBpbiBwbmcuaAorICBBZGRlZCBhIHBvcC9wdXNoIG9wZXJhdGlvbiB0byBwbmdnY2NyZC5jLCB0byBwcmVzZXJ2ZSBFZmxhZyAoTWF4aW0gU29ib2xldikKKyAgVXBkYXRlZCBtYWtlZmlsZS5zZ2kgdG8gcmVjb2duaXplIExJQlBBVEggYW5kIElOQ1BBVEguCisgIFVwZGF0ZWQgdmFyaW91cyBtYWtlZmlsZXMgc28gIm1ha2UgY2xlYW4iIGRvZXMgbm90IHJlbW92ZSBwcmV2aW91cyBtYWpvcgorICAgIHZlcnNpb24gb2YgdGhlIHNoYXJlZCBsaWJyYXJ5LgorCitWZXJzaW9uIDEuMi4xcmMyIFtEZWNlbWJlciA0LCAyMDAxXQorICBBbHdheXMgYWxsb2NhdGUgMjU2LWVudHJ5IGludGVybmFsIHBhbGV0dGUsIGhpc3QsIGFuZCB0cmFucyBhcnJheXMsIHRvCisgICAgYXZvaWQgb3V0LW9mLWJvdW5kcyBtZW1vcnkgcmVmZXJlbmNlIGNhdXNlZCBieSBpbnZhbGlkIFBORyBkYXRhc3RyZWFtcy4KKyAgQWRkZWQgYSBjaGVjayBmb3IgcHJlZml4X2xlbmd0aCA+IGRhdGFfbGVuZ3RoIGluIGlDQ1AgY2h1bmsgaGFuZGxlci4KKworVmVyc2lvbiAxLjIuMSBbRGVjZW1iZXIgNywgMjAwMV0KKyAgTm9uZS4KKworVmVyc2lvbiAxLjIuMmJldGExIFtGZWJydWFyeSAyMiwgMjAwMl0KKyAgRml4ZWQgYSBidWcgd2l0aCByZWFkaW5nIHRoZSBsZW5ndGggb2YgaUNDUCBwcm9maWxlcyAoTGFycnkgUmVldmVzKS4KKyAgUmV2aXNlZCBtYWtlZmlsZS5saW51eCwgbWFrZWZpbGUuZ2NtbXgsIGFuZCBtYWtlZmlsZS5zZ2kgdG8gZ2VuZXJhdGUKKyAgICBsaWJwbmcuYSwgbGlicG5nMTIuc28gKG5vdCBsaWJwbmcuc28uMyksIGFuZCBsaWJwbmcxMi9wbmcuaAorICBSZXZpc2VkIG1ha2VmaWxlLmRhcndpbiB0byByZW1vdmUgIi11bmRlZmluZWQgc3VwcHJlc3MiIG9wdGlvbi4KKyAgQWRkZWQgY2hlY2tzIGZvciBnYW1tYSBhbmQgY2hyb21hdGljaXR5IHZhbHVlcyBvdmVyIDIxNDc0LjgzLCB3aGljaCBleGNlZWQKKyAgICB0aGUgbGltaXQgZm9yIFBORyB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlcnMgd2hlbiBlbmNvZGVkLgorICBSZXZpc2VkIGNhbGxzIHRvIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoKSBhbmQgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QoKQorICAgIGZvciBzaW1wbGVyIGRlYnVnZ2luZy4KKyAgUmV2aXNlZCBwbmdfemFsbG9jKCkgc28gemxpYiBoYW5kbGVzIGVycm9ycyAodXNlcyBQTkdfRkxBR19NQUxMT0NfTlVMTF9NRU1fT0spCisKK1ZlcnNpb24gMS4yLjJiZXRhMiBbRmVicnVhcnkgMjMsIDIwMDJdCisgIENoZWNrIGNodW5rX2xlbmd0aCBhbmQgaWRhdF9zaXplIGZvciBpbnZhbGlkIChvdmVyIFBOR19NQVhfVUlOVCkgbGVuZ3Rocy4KKyAgQ2hlY2sgZm9yIGludmFsaWQgaW1hZ2UgZGltZW5zaW9ucyBpbiBwbmdfZ2V0X0lIRFIuCisgIEFkZGVkIG1pc3NpbmcgImZpOyIgaW4gdGhlIGluc3RhbGwgdGFyZ2V0IG9mIHRoZSBTR0kgbWFrZWZpbGVzLgorICBBZGRlZCBpbnN0YWxsLXN0YXRpYyB0byBhbGwgbWFrZWZpbGVzIHRoYXQgbWFrZSBzaGFyZWQgbGlicmFyaWVzLgorICBBbHdheXMgZG8gZ2FtbWEgY29tcGVuc2F0aW9uIHdoZW4gaW1hZ2UgaXMgcGFydGlhbGx5IHRyYW5zcGFyZW50LgorCitWZXJzaW9uIDEuMi4yYmV0YTMgW01hcmNoIDcsIDIwMDJdCisgIENvbXB1dGUgYmFja2dyb3VuZC5ncmF5IGFuZCBiYWNrZ3JvdW5kXzEuZ3JheSBldmVuIHdoZW4gY29sb3JfdHlwZSBpcyBSR0IKKyAgICBpbiBjYXNlIGltYWdlIGdldHMgcmVkdWNlZCB0byBncmF5IGxhdGVyLgorICBNb2RpZmllZCBzaGFyZWQtbGlicmFyeSBtYWtlZmlsZXMgdG8gaW5zdGFsbCBwa2djb25maWcvbGlicG5nTk4ucGMuCisgIEV4cG9ydCAod2l0aCBQTkdBUEkpIHBuZ196YWxsb2MsIHBuZ196ZnJlZSwgYW5kIHBuZ19oYW5kbGVfYXNfdW5rbm93bgorICBSZW1vdmVkIHVudXNlZCBwbmdfd3JpdGVfZGVzdHJveV9pbmZvIHByb3RvdHlwZSBmcm9tIHBuZy5oCisgIEVsaW1pbmF0ZWQgaW5jb3JyZWN0IHVzZSBvZiB3aWR0aF9tbXggZnJvbSBwbmdnY2NyZC5jIGluIHBpeGVsX2J5dGVzID09IDggY2FzZQorICBBZGRlZCBpbnN0YWxsLXNoYXJlZCB0YXJnZXQgdG8gYWxsIG1ha2VmaWxlcyB0aGF0IG1ha2Ugc2hhcmVkIGxpYnJhcmllcy4KKyAgU3RvcHBlZCBhIGRvdWJsZSBmcmVlIG9mIHBhbGV0dGUsIGhpc3QsIGFuZCB0cmFucyB3aGVuIG5vdCB1c2luZyBmcmVlX21lLgorICBBZGRlZCBtYWtlZmlsZS4zMnN1bnUgZm9yIFN1biBVbHRyYSAzMiBhbmQgbWFrZWZpbGUuNjRzdW51IGZvciBTdW4gVWx0cmEgNjQuCisKK1ZlcnNpb24gMS4yLjJiZXRhNCBbTWFyY2ggOCwgMjAwMl0KKyAgQ29tcHV0ZSBiYWNrZ3JvdW5kLmdyYXkgYW5kIGJhY2tncm91bmRfMS5ncmF5IGV2ZW4gd2hlbiBjb2xvcl90eXBlIGlzIFJHQgorICAgIGluIGNhc2UgaW1hZ2UgZ2V0cyByZWR1Y2VkIHRvIGdyYXkgbGF0ZXIgKEphc29uIFN1bW1lcnMpLgorICBSZWxvY2F0ZWQgYSBtaXNwbGFjZWQgL2Jpbi9ybSBpbiB0aGUgImluc3RhbGwtc2hhcmVkIiBtYWtlZmlsZSB0YXJnZXRzCisgIEFkZGVkIFBOR18xXzBfWCBtYWNybyB3aGljaCBjYW4gYmUgdXNlZCB0byBidWlsZCBhIDEuMC54LWNvbXBhdGlibGUgbGlicmFyeS4KKworVmVyc2lvbiAxLjIuMmJldGE1IFtNYXJjaCAyNiwgMjAwMl0KKyAgQWRkZWQgbWlzc2luZyBQTkdBUEkgdG8gc2V2ZXJhbCBmdW5jdGlvbiBkZWZpbml0aW9ucy4KKyAgQ2hlY2sgZm9yIGludmFsaWQgYml0X2RlcHRoIG9yIGNvbG9yX3R5cGUgaW4gcG5nX2dldF9JSERSKCksIGFuZAorICAgIGNoZWNrIGZvciBtaXNzaW5nIFBMVEUgb3IgSUhEUiBpbiBwbmdfcHVzaF9yZWFkX2NodW5rKCkgKE1hdHRoaWFzIENsYXNlbikuCisgIFJldmlzZWQgaVRYdCBzdXBwb3J0IHRvIGFjY2VwdCBOVUxMIGZvciBsYW5nIGFuZCBsYW5nX2tleS4KKyAgQ29tcHV0ZSBnYW1tYSBmb3IgY29sb3IgY29tcG9uZW50cyBvZiBiYWNrZ3JvdW5kIGV2ZW4gd2hlbiBjb2xvcl90eXBlIGlzIGdyYXkuCisgIENoYW5nZWQgIigpIiB0byAie30iIGluIHNjcmlwdHMvbGlicG5nLnBjLmluLgorICBSZXZpc2VkIG1ha2VmaWxlcyB0byBwdXQgcG5nLmggYW5kIHBuZ2NvbmYuaCBvbmx5IGluICRwcmVmaXgvaW5jbHVkZS9saWJwbmdOTgorICBSZXZpc2VkIG1ha2VmaWxlcyB0byBtYWtlIHN5bWxpbmsgdG8gbGlicG5nLnNvLk5OIGluIGFkZGl0aW9uIHRvIGxpYnBuZ05OLnNvCisKK1ZlcnNpb24gMS4yLjJiZXRhNiBbTWFyY2ggMzEsIDIwMDJdCisKK1ZlcnNpb24gMS4wLjEzYmV0YTEgW01hcmNoIDMxLCAyMDAyXQorICBQcmV2ZW50IHBuZ196YWxsb2MoKSBmcm9tIHRyeWluZyB0byBtZW1zZXQgbWVtb3J5IHRoYXQgaXQgZmFpbGVkIHRvIGFjcXVpcmUuCisgIEFkZCB0eXBlY2FzdHMgb2YgUE5HX01BWF9VSU5UIGluIHBuZ3NldF9jSFJNX2ZpeGVkKCkgKE1hdHQgSG9sZ2F0ZSkuCisgIEVuc3VyZSB0aGF0IHRoZSByaWdodCBmdW5jdGlvbiAodXNlciBvciBkZWZhdWx0KSBpcyB1c2VkIHRvIGZyZWUgdGhlCisgICAgcG5nX3N0cnVjdCBhZnRlciBhbiBlcnJvciBpbiBwbmdfY3JlYXRlX3JlYWRfc3RydWN0XzIoKS4KKworVmVyc2lvbiAxLjIuMnJjMSBbQXByaWwgNywgMjAwMl0KKworVmVyc2lvbiAxLjAuMTNyYzEgW0FwcmlsIDcsIDIwMDJdCisgIFNhdmUgdGhlIGVieCByZWdpc3RlciBpbiBwbmdnY2NyZC5jIChTYW1pIEZhcmluKQorICBBZGQgIm1lbV9wdHIgPSBwbmdfcHRyLT5tZW1fcHRyIiBpbiBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoKSAoUGF1bCBHYXJkbmVyKS4KKyAgVXBkYXRlZCBtYWtlZmlsZXMgdG8gcHV0IGhlYWRlcnMgaW4gaW5jbHVkZS9saWJwbmcgYW5kIHJlbW92ZSBvbGQgaW5jbHVkZS8qLmguCisKK1ZlcnNpb24gMS4yLjIgW0FwcmlsIDE1LCAyMDAyXQorCitWZXJzaW9uIDEuMC4xMyBbQXByaWwgMTUsIDIwMDJdCisgIFJldmlzZWQgZGVzY3JpcHRpb24gb2YgcG5nX3NldF9maWx0ZXIoKSBpbiBsaWJwbmcuMy9saWJwbmcudHh0LgorICBSZXZpc2VkIG1ha2VmaWxlLm5ldGJzZCBhbmQgYWRkZWQgbWFrZWZpbGUubmVOTmJzZCBhbmQgbWFrZWZpbGUuZnJlZWJzZAorCitWZXJzaW9uIDEuMC4xM3BhdGNoMDEgW0FwcmlsIDE3LCAyMDAyXQorCitWZXJzaW9uIDEuMi4ycGF0Y2gwMSBbQXByaWwgMTcsIDIwMDJdCisgIENoYW5nZWQgJHtQTkdNQUp9LiR7UE5HVkVSfSBidWcgdG8gJHtQTkdWRVJ9IGluIG1ha2VmaWxlLnNnaSBhbmQKKyAgICBtYWtlZmlsZS5zZ2djYworICBGaXhlZCBWRVIgLT4gUE5HVkVSIHR5cG8gaW4gbWFrZWZpbGUubWFjb3N4IGFuZCBhZGRlZCBpbnN0YWxsLXN0YXRpYyB0bworICAgIGluc3RhbGwKKyAgQWRkZWQgaW5zdGFsbDogdGFyZ2V0IHRvIG1ha2VmaWxlLjMyc3VudSBhbmQgbWFrZWZpbGUuNjRzdW51CisKK1ZlcnNpb24gMS4wLjEzcGF0Y2gwMyBbQXByaWwgMTgsIDIwMDJdCisKK1ZlcnNpb24gMS4yLjJwYXRjaDAzIFtBcHJpbCAxOCwgMjAwMl0KKyAgUmV2aXNlZCAxNSBtYWtlZmlsZXMgdG8gbGluayBsaWJwbmcuYSB0byBsaWJwbmdOTi5hIGFuZCB0aGUgaW5jbHVkZSBsaWJwbmcKKyAgc3ViZGlyZWN0b3J5IHRvIGxpYnBuZ05OIHN1YmRpcmVjdG9yeSB3aXRob3V0IHRoZSBmdWxsIHBhdGhuYW1lLgorICBNb3ZlZCBnZW5lcmF0aW9uIG9mIGxpYnBuZy5wYyBmcm9tICJpbnN0YWxsIiB0byAiYWxsIiBpbiAxNSBtYWtlZmlsZXMuCisKK1ZlcnNpb24gMS4yLjNyYzEgW0FwcmlsIDI4LCAyMDAyXQorICBBZGRlZCBpbnN0YWxsLW1hbiB0YXJnZXQgdG8gMTUgbWFrZWZpbGVzIChEaW1pdHJpIFBhcGFkb3BvbG91cy1PcmZhbm9zKS4KKyAgQWRkZWQgJChERVNURElSKSBmZWF0dXJlIHRvIDI0IG1ha2VmaWxlcyAoVGltIE1vb25leSkKKyAgRml4ZWQgYnVnIHdpdGggJHByZWZpeCwgc2hvdWxkIGJlICQocHJlZml4KSBpbiBtYWtlZmlsZS5ocHV4LgorICBVcGRhdGVkIGN5Z3dpbi1zcGVjaWZpYyBwb3J0aW9uIG9mIHBuZ2NvbmYuaCBhbmQgcmV2aXNlZCBtYWtlZmlsZS5jeWd3aW4KKyAgQWRkZWQgYSBsaW5rIGZyb20gbGlicG5nTk4ucGMgdG8gbGlicG5nLnBjIGluIDE1IG1ha2VmaWxlcy4KKyAgQWRkZWQgbGlua3MgZnJvbSBpbmNsdWRlL2xpYnBuZ05OLyouaCB0byBpbmNsdWRlLyouaCBpbiAyNCBtYWtlZmlsZXMuCisgIFJldmlzZWQgbWFrZWZpbGUuZGFyd2luIHRvIG1ha2UgcmVsYXRpdmUgbGlua3Mgd2l0aG91dCBmdWxsIHBhdGhuYW1lLgorICBBZGRlZCBzZXRqbXAoKSBhdCB0aGUgZW5kIG9mIHBuZ19jcmVhdGVfKl9zdHJ1Y3RfMigpIGluIGNhc2UgdXNlciBmb3JnZXRzCisgICAgdG8gcHV0IG9uZSBpbiB0aGVpciBhcHBsaWNhdGlvbi4KKyAgUmVzdG9yZWQgcG5nX3phbGxvYygpIGFuZCBwbmdfemZyZWUoKSBwcm90b3R5cGVzIHRvIHZlcnNpb24gMS4yLjEgYW5kCisgICAgcmVtb3ZlZCB0aGVtIGZyb20gbW9kdWxlIGRlZmluaXRpb24gZmlsZXMuCisKK1ZlcnNpb24gMS4yLjNyYzIgW01heSAxLCAyMDAyXQorICBGaXhlZCBidWcgaW4gcmVwb3J0aW5nIG51bWJlciBvZiBjaGFubmVscyBpbiBwbmdnZXQuYyBhbmQgcG5nc2V0LmMsCisgICAgdGhhdCB3YXMgaW50cm9kdWNlZCBpbiB2ZXJzaW9uIDEuMi4yYmV0YTUuCisgIEV4cG9ydGVkIHBuZ196YWxsb2MoKSwgcG5nX3pmcmVlKCksIHBuZ19kZWZhdWx0X3JlYWQoKSwgcG5nX2RlZmF1bHRfd3JpdGUoKSwKKyAgICBwbmdfZGVmYXVsdF9mbHVzaCgpLCBhbmQgcG5nX3B1c2hfZmlsbF9idWZmZXIoKSBhbmQgaW5jbHVkZWQgdGhlbSBpbgorICAgIG1vZHVsZSBkZWZpbml0aW9uIGZpbGVzLgorICBBZGRlZCAibGlicG5nLnBjIiBkZXBlbmRlbmN5IHRvIHRoZSAiaW5zdGFsbC1zaGFyZWQiIHRhcmdldCBpbiAxNSBtYWtlZmlsZXMuCisKK1ZlcnNpb24gMS4yLjNyYzMgW01heSAxLCAyMDAyXQorICBSZXZpc2VkIHByb3RvdHlwZSBmb3IgcG5nX2RlZmF1bHRfZmx1c2goKQorICBSZW1vdmUgb2xkIGxpYnBuZy5wYyBhbmQgbGlicG5nTk4ucGMgYmVmb3JlIGluc3RhbGxpbmcgbmV3IG9uZXMuCisKK1ZlcnNpb24gMS4yLjNyYzQgW01heSAyLCAyMDAyXQorICBUeXBvcyBpbiAqLmRlZiBmaWxlcyAocG5nX2RlZmF1bHRfcmVhZHx3cml0ZSAtPiBwbmdfZGVmYXVsdF9yZWFkfHdyaXRlX2RhdGEpCisgIEluIG1ha2VmaWxlcywgY2hhbmdlZCBybSBsaWJwbmcuTk4ucGMgdG8gcm0gbGlicG5nTk4ucGMKKyAgQWRkZWQgbGlicG5nLWNvbmZpZyBhbmQgbGlicG5nTk4tY29uZmlnIGFuZCBtb2RpZmllZCBtYWtlZmlsZXMgdG8gaW5zdGFsbAorICAgIHRoZW0uCisgIENoYW5nZWQgJChNQU5QQVRIKSB0byAkKERFU1RESVIpJChNQU5QQVRIKSBpbiBtYWtlZmlsZXMKKyAgQWRkZWQgIldpbjMyIERMTCBWQiIgY29uZmlndXJhdGlvbiB0byBwcm9qZWN0cy9tc3ZjL2xpYnBuZy5kc3AKKworVmVyc2lvbiAxLjIuM3JjNSBbTWF5IDExLCAyMDAyXQorICBDaGFuZ2VkICJlcnJvciIgYW5kICJtZXNzYWdlIiBpbiBwcm90b3R5cGVzIHRvICJlcnJvcl9tZXNzYWdlIiBhbmQKKyAgICAid2FybmluZ19tZXNzYWdlIiB0byBhdm9pZCBuYW1lc3BhY2UgY29uZmxpY3QuCisgIFJldmlzZWQgMTUgbWFrZWZpbGVzIHRvIGJ1aWxkIGxpYnBuZy1jb25maWcgZnJvbSBsaWJwbmctY29uZmlnLSouaW4KKyAgT25jZSBtb3JlIHJlc3RvcmVkIHBuZ196YWxsb2MgYW5kIHBuZ196ZnJlZSB0byByZWd1bGFyIG5vbmV4cG9ydGVkIGZvcm0uCisgIFJlc3RvcmVkIHBuZ19kZWZhdWx0X3JlYWR8d3JpdGVfZGF0YSwgcG5nX2RlZmF1bHRfZmx1c2gsIHBuZ19yZWFkX2ZpbGxfYnVmZmVyCisgICAgdG8gbm9uZXhwb3J0ZWQgZm9ybSwgYnV0IHdpdGggUE5HQVBJLCBhbmQgcmVtb3ZlZCB0aGVtIGZyb20gbW9kdWxlIGRlZgorICAgIGZpbGVzLgorCitWZXJzaW9uIDEuMi4zcmM2IFtNYXkgMTQsIDIwMDJdCisgIFJlbW92ZWQgIlBOR0FQSSIgZnJvbSBwbmdfemFsbG9jKCkgYW5kIHBuZ196ZnJlZSgpIGluIHBuZy5jCisgIENoYW5nZWQgIkd6IiB0byAiR2QiIGluIHByb2plY3RzL21zdmMvbGlicG5nLmRzcCBhbmQgemxpYi5kc3AuCisgIFJlbW92ZWQgbGVmdG92ZXIgbGlicG5nLWNvbmZpZyAic2VkIiBzY3JpcHQgZnJvbSBmb3VyIG1ha2VmaWxlcy4KKyAgUmV2aXNlZCBsaWJwbmctY29uZmlnIGNyZWF0aW5nIHNjcmlwdCBpbiAxNiBtYWtlZmlsZXMuCisKK1ZlcnNpb24gMS4yLjMgW01heSAyMiwgMjAwMl0KKyAgUmV2aXNlZCBsaWJwbmctY29uZmlnIHRhcmdldCBpbiBtYWtlZmlsZS5jeWd3aW4uCisgIFJlbW92ZWQgZGVzY3JpcHRpb24gb2YgcG5nX3NldF9tZW1fZm4oKSBmcm9tIGRvY3VtZW50YXRpb24uCisgIFJldmlzZWQgbWFrZWZpbGUuZnJlZWJzZC4KKyAgTWlub3IgY29zbWV0aWMgY2hhbmdlcyB0byAxNSBtYWtlZmlsZXMsIGUuZy4sICQoREkpID0gJChERVNURElSKS8kKElOQ0RJUikuCisgIFJldmlzZWQgcHJvamVjdHMvbXN2Yy9SRUFETUUudHh0CisgIENoYW5nZWQgLWxwbmcgdG8gLWxwbmdOTiBpbiBMREZMQUdTIGluIHNldmVyYWwgbWFrZWZpbGVzLgorCitWZXJzaW9uIDEuMi40YmV0YTEgW01heSAyNCwgMjAwMl0KKyAgQWRkZWQgbGlicG5nLnBjIGFuZCBsaWJwbmctY29uZmlnIHRvICJhbGw6IiB0YXJnZXQgaW4gMTYgbWFrZWZpbGVzLgorICBGaXhlZCBidWcgaW4gMTYgbWFrZWZpbGVzOiAkKERFU1RESVIpLyQoTElCUEFUSCkgdG8gJChERVNURElSKSQoTElCUEFUSCkKKyAgQWRkZWQgbWlzc2luZyAiXCIgYmVmb3JlIGNsb3NpbmcgZG91YmxlIHF1b3RlIGluIG1ha2VmaWxlLmdjbW14LgorICBQbHVnZ2VkIHZhcmlvdXMgbWVtb3J5IGxlYWtzOyBhZGRlZCBwbmdfbWFsbG9jX3dhcm4oKSBhbmQgcG5nX3NldF90ZXh0XzIoKQorICAgIGZ1bmN0aW9ucy4KKworVmVyc2lvbiAxLjIuNGJldGEyIFtKdW5lIDI1LCAyMDAyXQorICBQbHVnZ2VkIG1lbW9yeSBsZWFrIG9mIHBuZ19wdHItPmN1cnJlbnRfdGV4dCAoTWF0dCBIb2xnYXRlKS4KKyAgQ2hlY2sgZm9yIGJ1ZmZlciBvdmVyZmxvdyBiZWZvcmUgcmVhZGluZyBDUkMgaW4gcG5ncHJlYWQuYyAoV2Fyd2ljayBBbGxpc29uKQorICBBZGRlZCAtc29uYW1lIHRvIHRoZSBsb2FkZXIgZmxhZ3MgaW4gbWFrZWZpbGUuZGVjLCBtYWtlZmlsZS5zZ2ksIGFuZAorICAgIG1ha2VmaWxlLnNnZ2NjLgorICBBZGRlZCAidGVzdC1pbnN0YWxsZWQiIHRhcmdldCB0byBtYWtlZmlsZS5saW51eCwgbWFrZWZpbGUuZ2NtbXgsCisgICAgbWFrZWZpbGUuc2dpLCBhbmQgbWFrZWZpbGUuc2dnY2MuCisKK1ZlcnNpb24gMS4yLjRiZXRhMyBbSnVuZSAyOCwgMjAwMl0KKyAgUGx1Z2dlZCBtZW1vcnkgbGVhayBvZiByb3dfYnVmIGluIHBuZ3Rlc3QuYyB3aGVuIHRoZXJlIGlzIGEgcG5nX2Vycm9yKCkuCisgIERldGVjdCBidWZmZXIgb3ZlcmZsb3cgaW4gcG5ncHJlYWQuYyB3aGVuIElEQVQgaXMgY29ycnVwdGVkIHdpdGggZXh0cmEgZGF0YS4KKyAgQWRkZWQgInRlc3QtaW5zdGFsbGVkIiB0YXJnZXQgdG8gbWFrZWZpbGUuMzJzdW51LCBtYWtlZmlsZS42NHN1bnUsCisgICAgbWFrZWZpbGUuYmVvcywgbWFrZWZpbGUuZGFyd2luLCBtYWtlZmlsZS5kZWMsIG1ha2VmaWxlLm1hY29zeCwKKyAgICBtYWtlZmlsZS5zb2xhcmlzLCBtYWtlZmlsZS5ocHV4LCBtYWtlZmlsZS5ocGdjYywgYW5kIG1ha2VmaWxlLnNvOS4KKworVmVyc2lvbiAxLjIuNHJjMSBhbmQgMS4wLjE0cmMxIFtKdWx5IDIsIDIwMDJdCisgIEFkZGVkICJ0ZXN0LWluc3RhbGxlZCIgdGFyZ2V0IHRvIG1ha2VmaWxlLmN5Z3dpbiBhbmQgbWFrZWZpbGUuc2NvLgorICBSZXZpc2VkIHBuZ2djY3JkLmMgdG8gYmUgYWJsZSB0byBiYWNrIG91dCB2ZXJzaW9uIDEuMC54IHZpYSBQTkdfMV8wX1ggbWFjcm8uCisKK1ZlcnNpb24gMS4yLjQgYW5kIDEuMC4xNCBbSnVseSA4LCAyMDAyXQorICBDaGFuZ2VkIHBuZ193YXJuaW5nKCkgdG8gcG5nX2Vycm9yKCkgd2hlbiB3aWR0aCBpcyB0b28gbGFyZ2UgdG8gcHJvY2Vzcy4KKworVmVyc2lvbiAxLjIuNHBhdGNoMDEgW0p1bHkgMjAsIDIwMDJdCisgIFJldmlzZWQgbWFrZWZpbGUuY3lnd2luIHRvIHVzZSBETEwgbnVtYmVyIDEyIGluc3RlYWQgb2YgMTMuCisKK1ZlcnNpb24gMS4yLjViZXRhMSBbQXVndXN0IDYsIDIwMDJdCisgIEFkZGVkIGNvZGUgdG8gY29udHJpYi9ncmVnYm9vay9yZWFkcG5nMi5jIHRvIGlnbm9yZSB1bnVzZWQgY2h1bmtzLgorICBSZXBsYWNlZCB0b3VjYW4ucG5nIGluIGNvbnRyaWIvZ3JlZ2Jvb2sgKGl0IGhhcyBiZWVuIGNvcnJ1cHQgc2luY2UgMS4wLjExKQorICBSZW1vdmVkIHNvbWUgc3RyYXkgKi5vIGZpbGVzIGZyb20gY29udHJpYi9ncmVnYm9vay4KKyAgQ2hhbmdlZCBwbmdfZXJyb3IoKSB0byBwbmdfd2FybmluZygpIGFib3V0ICJUb28gbXVjaCBkYXRhIiBpbiBwbmdwcmVhZC5jCisgICAgYW5kIGFib3V0ICJFeHRyYSBjb21wcmVzc2VkIGRhdGEiIGluIHBuZ3J1dGlsLmMuCisgIFByZXZlbnQgcG5nX3B0ci0+cGFzcyBmcm9tIGV4Y2VlZGluZyA3IGluIHBuZ19wdXNoX2ZpbmlzaF9yb3coKS4KKyAgVXBkYXRlZCBtYWtlZmlsZS5ocGdjYworICBVcGRhdGVkIHBuZy5jIGFuZCBwbmdnY2NyZC5jIGhhbmRsaW5nIG9mIHJldHVybiBmcm9tIHBuZ19tbXhfc3VwcG9ydCgpCisKK1ZlcnNpb24gMS4yLjViZXRhMiBbQXVndXN0IDE1LCAyMDAyXQorICBPbmx5IGlzc3VlIHBuZ193YXJuaW5nKCkgYWJvdXQgIlRvbyBtdWNoIGRhdGEiIGluIHBuZ3ByZWFkLmMgd2hlbiBhdmFpbF9pbgorICAgIGlzIG5vbnplcm8uCisgIFVwZGF0ZWQgbWFrZWZpbGVzIHRvIGluc3RhbGwgYSBzZXBhcmF0ZSBsaWJwbmcuc28uMyB3aXRoIGl0cyBvd24gcnBhdGguCisKK1ZlcnNpb24gMS4yLjVyYzEgYW5kIDEuMC4xNXJjMSBbQXVndXN0IDI0LCAyMDAyXQorICBSZXZpc2VkIG1ha2VmaWxlcyB0byBub3QgcmVtb3ZlIHByZXZpb3VzIG1pbm9yIHZlcnNpb25zIG9mIHNoYXJlZCBsaWJyYXJpZXMuCisKK1ZlcnNpb24gMS4yLjVyYzIgYW5kIDEuMC4xNXJjMiBbU2VwdGVtYmVyIDE2LCAyMDAyXQorICBSZXZpc2VkIDEzIG1ha2VmaWxlcyB0byByZW1vdmUgIi1seiIgYW5kICItTCQoWkxJQkxJQikiLCBldGMuLCBmcm9tIHNoYXJlZAorICAgIGxpYnJhcnkgbG9hZGVyIGRpcmVjdGl2ZS4KKyAgQWRkZWQgbWlzc2luZyAiJE9CSlNETEwiIGxpbmUgdG8gbWFrZWZpbGUuZ2NtbXguCisgIEFkZGVkIG1pc3NpbmcgIjsgZmkiIHRvIG1ha2VmaWxlLjMyc3VudS4KKworVmVyc2lvbiAxLjIuNXJjMyBhbmQgMS4wLjE1cmMzIFtTZXB0ZW1iZXIgMTgsIDIwMDJdCisgIFJldmlzZWQgbGlicG5nLWNvbmZpZyBzY3JpcHQuCisKK1ZlcnNpb24gMS4yLjUgYW5kIDEuMC4xNSBbT2N0b2JlciAzLCAyMDAyXQorICBSZXZpc2VkIG1ha2VmaWxlLm1hY29zeCwgbWFrZWZpbGUuZGFyd2luLCBtYWtlZmlsZS5ocGdjYywgYW5kIG1ha2VmaWxlLmhwdXgsCisgICAgYW5kIG1ha2VmaWxlLmFpeC4KKyAgUmVsb2NhdGVkIHR3byBtaXNwbGFjZWQgUE5HQVBJIGxpbmVzIGluIHBuZ3Rlc3QuYworCitWZXJzaW9uIDEuMi42YmV0YTEgW09jdG9iZXIgMjIsIDIwMDJdCisgIENvbW1lbnRlZCBvdXQgd2FybmluZyBhYm91dCB1bmluaXRpYWxpemVkIG1teF9zdXBwb3J0IGluIHBuZ2djY3JkLmMuCisgIENoYW5nZWQgIklCTUNQUF9fIiBmbGFnIHRvICJfX0lCTUNQUF9fIiBpbiBwbmdjb25mLmguCisgIFJlbG9jYXRlZCB0d28gbW9yZSBtaXNwbGFjZWQgUE5HQVBJIGxpbmVzIGluIHBuZ3Rlc3QuYworICBGaXhlZCBtZW1vcnkgb3ZlcnJ1biBidWcgaW4gcG5nX2RvX3JlYWRfZmlsbGVyKCkgd2l0aCAxNi1iaXQgZGF0YXN0cmVhbXMsCisgICAgaW50cm9kdWNlZCBpbiB2ZXJzaW9uIDEuMC4yLgorICBSZXZpc2VkIG1ha2VmaWxlLm1hY29zeCwgbWFrZWZpbGUuZGVjLCBtYWtlZmlsZS5haXgsIGFuZCBtYWtlZmlsZS4zMnN1bnUuCisKK1ZlcnNpb24gMS4yLjZiZXRhMiBbTm92ZW1iZXIgMSwgMjAwMl0KKyAgQWRkZWQgbGlicG5nLWNvbmZpZyAiLS1sZG9wdHMiIG91dHB1dC4KKyAgQWRkZWQgIkFSPWFyIiBhbmQgIkFSRkxBR1M9cmMiIGFuZCBjaGFuZ2VkICJhciByYyIgdG8gIiQoQVIpICQoQVJGTEFHUykiCisgICAgaW4gbWFrZWZpbGVzLgorCitWZXJzaW9uIDEuMi42YmV0YTMgW0p1bHkgMTgsIDIwMDRdCisgIFJldmVydGVkIG1ha2VmaWxlIGNoYW5nZXMgZnJvbSB2ZXJzaW9uIDEuMi42YmV0YTIgYW5kIHNvbWUgb2YgdGhlIGNoYW5nZXMKKyAgICBmcm9tIHZlcnNpb24gMS4yLjZiZXRhMTsgdGhlc2Ugd2lsbCBiZSBwb3N0cG9uZWQgdW50aWwgdmVyc2lvbiAxLjIuNy4KKyAgICBWZXJzaW9uIDEuMi42IGlzIGdvaW5nIHRvIGJlIGEgc2ltcGxlIGJ1Z2ZpeCByZWxlYXNlLgorICBDaGFuZ2VkIHRoZSBvbmUgaW5zdGFuY2Ugb2YgImxuIC1zZiIgdG8gImxuIC1mIC1zIiBpbiBlYWNoIFN1biBtYWtlZmlsZS4KKyAgRml4ZWQgcG90ZW50aWFsIG92ZXJydW4gaW4gcG5nZXJyb3IuYyBieSB1c2luZyBzdHJuY3B5IGluc3RlYWQgb2YgbWVtY3B5LgorICBBZGRlZCAiIyEvYmluL3NoIiBhdCB0aGUgdG9wIG9mIGNvbmZpZ3VyZSwgZm9yIHJlY29nbml0aW9uIG9mIHRoZQorICAgICd4JyBmbGFnIHVuZGVyIEN5Z3dpbiAoQ29zbWluKS4KKyAgT3B0aW1pemVkIHZhY3VvdXMgdGVzdHMgdGhhdCBzaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmdzLCBpbiBwbmcuYyAoQ29zbWluKS4KKyAgQWRkZWQgc3VwcG9ydCBmb3IgUE5HX1VTRVJfQ09ORklHLCBpbiBwbmdjb25mLmggKENvc21pbikuCisgIEZpeGVkIHRoZSBzcGVjaWFsIG1lbW9yeSBoYW5kbGVyIGZvciBCb3JsYW5kIEMgdW5kZXIgRE9TLCBpbiBwbmdtZW0uYworICAgIChDb3NtaW4pLgorICBSZW1vdmVkIHNvbWUgc3B1cmlvdXMgYXNzaWdubWVudHMgaW4gcG5ncnV0aWwuYyAoQ29zbWluKS4KKyAgUmVwbGFjZWQgNjU1MzYgd2l0aCA2NTUzNkwsIGFuZCAweGZmZmYgd2l0aCAweGZmZmZMLCB0byBzaWxlbmNlIHdhcm5pbmdzCisgICAgb24gMTYtYml0IHBsYXRmb3JtcyAoQ29zbWluKS4KKyAgRW5jbG9zZWQgc2hpZnQgb3AgZXhwcmVzc2lvbnMgaW4gcGFyZW50aGVzZXMsIHRvIHNpbGVuY2Ugd2FybmluZ3MgKENvc21pbikuCisgIFVzZWQgcHJvcGVyIHR5cGUgcG5nX2ZpeGVkX3BvaW50LCB0byBhdm9pZCBwcm9ibGVtcyBvbiAxNi1iaXQgcGxhdGZvcm1zLAorICAgIGluIHBuZ19oYW5kbGVfc1JHQigpIChDb3NtaW4pLgorICBBZGRlZCBjb21wcmVzc2lvbl90eXBlIHRvIHBuZ19zdHJ1Y3QsIGFuZCBvcHRpbWl6ZWQgdGhlIHdpbmRvdyBzaXplCisgICAgaW5zaWRlIHRoZSBkZWZsYXRlIHN0cmVhbSAoQ29zbWluKS4KKyAgRml4ZWQgZGVmaW5pdGlvbiBvZiBpc25vbmFscGhhKCksIGluIHBuZ2Vycm9yLmMgYW5kIHBuZ3J1dGlsLmMgKENvc21pbikuCisgIEZpeGVkIGhhbmRsaW5nIG9mIHVua25vd24gY2h1bmtzIHRoYXQgY29tZSBhZnRlciBJREFUIChDb3NtaW4pLgorICBBbGxvd2VkIHBuZ19lcnJvcigpIGFuZCBwbmdfd2FybmluZygpIHRvIHdvcmsgZXZlbiBpZiBwbmdfcHRyID09IE5VTEwKKyAgICAoQ29zbWluKS4KKyAgUmVwbGFjZWQgcm93X2luZm8tPnJvd2J5dGVzIHdpdGggcm93X2J5dGVzIGluIHBuZ193cml0ZV9maW5kX2ZpbHRlcigpCisgICAgKENvc21pbikuCisgIEZpeGVkIGRlZmluaXRpb24gb2YgUE5HX0xJQlBOR19WRVJfRExMTlVNIChTaW1vbi1QaWVycmUpLgorICBVc2VkIFBOR19MSUJQTkdfVkVSIGFuZCBQTkdfTElCUE5HX1ZFUl9TVFJJTkcgaW5zdGVhZCBvZiB0aGUgaGFyZGNvZGVkCisgICAgdmFsdWVzIGluIHBuZy5jIChTaW1vbi1QaWVycmUsIENvc21pbikuCisgIEluaXRpYWxpemVkIHBuZ19saWJwbmdfdmVyW10gd2l0aCBQTkdfTElCUE5HX1ZFUl9TVFJJTkcgKFNpbW9uLVBpZXJyZSkuCisgIFJlcGxhY2VkIFBOR19MSUJQTkdfVkVSX01BSk9SIHdpdGggUE5HX0xJQlBOR19WRVJfRExMTlVNIGluIHBuZy5yYworICAgIChTaW1vbi1QaWVycmUpLgorICBNb3ZlZCB0aGUgZGVmaW5pdGlvbiBvZiBQTkdfSEVBREVSX1ZFUlNJT05fU1RSSU5HIG5lYXIgdGhlIGRlZmluaXRpb25zCisgICAgb2YgdGhlIG90aGVyIFBOR19MSUJQTkdfVkVSXy4uLiBzeW1ib2xzIGluIHBuZy5oIChDb3NtaW4pLgorICBSZWxvY2F0ZWQgI2lmbmRlZiBQTkdBUEkgZ3VhcmRzIGluIHBuZ2NvbmYuaCAoU2ltb24tUGllcnJlLCBDb3NtaW4pLgorICBVcGRhdGVkIHNjcmlwdHMvbWFrZWZpbGUudmMoYSl3aW4zMiAoQ29zbWluKS4KKyAgVXBkYXRlZCB0aGUgTVNWQyBwcm9qZWN0IChTaW1vbi1QaWVycmUsIENvc21pbikuCisgIFVwZGF0ZWQgdGhlIEJvcmxhbmQgQysrIEJ1aWxkZXIgcHJvamVjdCAoQ29zbWluKS4KKyAgQXZvaWRlZCBhY2Nlc3MgdG8gYXNtX2ZsYWdzIGluIHBuZ3ZjcmQuYywgaWYgUE5HXzFfMF9YIGlzIGRlZmluZWQgKENvc21pbikuCisgIENvbW1lbnRlZCBvdXQgd2FybmluZyBhYm91dCB1bmluaXRpYWxpemVkIG1teF9zdXBwb3J0IGluIHBuZ3ZjcmQuYyAoQ29zbWluKS4KKyAgUmVtb3ZlZCBzY3JpcHRzL21ha2VmaWxlLmJkMzIgYW5kIHNjcmlwdHMvcG5nZGVmLnBhcyAoQ29zbWluKS4KKyAgQWRkZWQgZXh0cmEgZ3VhcmQgYXJvdW5kIGluY2x1c2lvbiBvZiBUdXJibyBDIG1lbW9yeSBoZWFkZXJzLCBpbiBwbmdjb25mLmgKKyAgICAoQ29zbWluKS4KKyAgUmVuYW1lZCBwcm9qZWN0cy9tc3ZjLyB0byBwcm9qZWN0cy92aXN1YWxjNi8sIGFuZCBwcm9qZWN0cy9ib3JsYW5kLyB0bworICAgIHByb2plY3RzL2NidWlsZGVyNS8gKENvc21pbikuCisgIE1vdmVkIHByb2plY3RzL3Zpc3VhbGM2L3BuZzMybXMuZGVmIHRvIHNjcmlwdHMvcG5ndzMyLmRlZiwKKyAgICBhbmQgcHJvamVjdHMvdmlzdWFsYzYvcG5nLnJjIHRvIHNjcmlwdHMvcG5ndzMyLnJjIChDb3NtaW4pLgorICBBZGRlZCBwcm9qZWN0cy92aXN1YWxjNi9wbmd0ZXN0LmRzcDsgcmVtb3ZlZCBjb250cmliL21zdmN0ZXN0LyAoQ29zbWluKS4KKyAgQ2hhbmdlZCBsaW5lIGVuZGluZ3MgdG8gRE9TIHN0eWxlIGluIGNidWlsZGVyNSBhbmQgdmlzdWFsYzYgZmlsZXMsIGV2ZW4KKyAgICBpbiB0aGUgdGFyLiogZGlzdHJpYnV0aW9ucyAoQ29zbWluKS4KKyAgVXBkYXRlZCBjb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLmRzcCAoQ29zbWluKS4KKyAgVXBkYXRlZCBjb250cmliL3Zpc3VwbmcvY2V4Y2VwdC5oIHRvIHZlcnNpb24gMi4wLjAgKENvc21pbikuCisgIEFkZGVkIGEgc2VwYXJhdGUgZGlzdHJpYnV0aW9uIHdpdGggImNvbmZpZ3VyZSIgYW5kIHN1cHBvcnRpbmcgZmlsZXMgKEp1bmljaGkpLgorCitWZXJzaW9uIDEuMi42YmV0YTQgW0p1bHkgMjgsIDIwMDRdCisgIEFkZGVkIHVzZXIgYWJpbGl0eSB0byBjaGFuZ2UgcG5nX3NpemVfdCB2aWEgYSBQTkdfU0laRV9UIG1hY3JvLgorICBBZGRlZCBwbmdfc2l6ZW9mKCkgYW5kIHBuZ19jb252ZXJ0X3NpemUoKSBmdW5jdGlvbnMuCisgIEFkZGVkIFBOR19TSVpFX01BWCAobWF4aW11bSB2YWx1ZSBvZiBhIHBuZ19zaXplX3QgdmFyaWFibGUuCisgIEFkZGVkIGNoZWNrIGluIHBuZ19tYWxsb2NfZGVmYXVsdCgpIGZvciAoc2l6ZV90KXNpemUgIT0gKHBuZ191aW50XzMyKXNpemUKKyAgICB3aGljaCB3b3VsZCBpbmRpY2F0ZSBhbiBvdmVyZmxvdy4KKyAgQ2hhbmdlZCBzUExUIGZhaWx1cmUgYWN0aW9uIGZyb20gcG5nX2Vycm9yIHRvIHBuZ193YXJuaW5nIGFuZCBhYmFuZG9uIGNodW5rLgorICBDaGFuZ2VkIHNDQUwgYW5kIGlDQ1AgZmFpbHVyZXMgZnJvbSBwbmdfZXJyb3IgdG8gcG5nX3dhcm5pbmcgYW5kIGFiYW5kb24uCisgIEFkZGVkIHBuZ19nZXRfdWludF8zMShwbmdfcHRyLCBidWYpIGZ1bmN0aW9uLgorICBBZGRlZCBQTkdfVUlOVF8zMl9NQVggbWFjcm8uCisgIFJlbmFtZWQgUE5HX01BWF9VSU5UIHRvIFBOR19VSU5UXzMxX01BWC4KKyAgTWFkZSBwbmdfemFsbG9jKCkgaXNzdWUgYSBwbmdfd2FybmluZyBhbmQgcmV0dXJuIE5VTEwgb24gcG90ZW50aWFsCisgICAgb3ZlcmZsb3cuCisgIFR1cm4gb24gUE5HX05PX1pBTExPQ19aRVJPIGJ5IGRlZmF1bHQgaW4gdmVyc2lvbiAxLjIueAorICBSZXZpc2VkICJjbG9iYmVyIGxpc3QiIGluIHBuZ2djY3JkLmMgc28gaXQgd2lsbCBjb21waWxlIHVuZGVyIGdjYy0zLjQuCisgIFJldmlzZWQgQm9ybGFuZCBwb3J0aW9uIG9mIHBuZ19tYWxsb2MoKSB0byByZXR1cm4gTlVMTCBvciBpc3N1ZQorICAgIHBuZ19lcnJvcigpIGFjY29yZGluZyB0byBzZXR0aW5nIG9mIFBOR19GTEFHX01BTExPQ19OVUxMX01FTV9PSy4KKyAgQWRkZWQgUE5HX05PX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQgbWFjcm8gdG8gY29uZGl0aW9uYWxseSByZW1vdmUKKyAgICBzZXF1ZW50aWFsIHJlYWQgc3VwcG9ydC4KKyAgQWRkZWQgc29tZSAiI2lmIFBOR19XUklURV9TVVBQT1JURUQiIGJsb2Nrcy4KKyAgQWRkZWQgI2lmZGVmIHRvIHJlbW92ZSBzb21lIHJlZHVuZGFuY3kgaW4gcG5nX21hbGxvY19kZWZhdWx0KCkuCisgIFVzZSBwbmdfbWFsbG9jIGluc3RlYWQgb2YgcG5nX3phbGxvYyB0byBhbGxvY2F0ZSB0aGUgcGFsbGV0ZS4KKworVmVyc2lvbiAxLjAuMTZyYzEgYW5kIDEuMi42cmMxIFtBdWd1c3QgNCwgMjAwNF0KKyAgRml4ZWQgYnVmZmVyIG92ZXJmbG93IHZ1bG5lcmFiaWxpdHkgKENWRS0yMDA0LTA1OTcpIGluIHBuZ19oYW5kbGVfdFJOUygpLgorICBGaXhlZCBOVUxMIGRlcmVmZXJlbmNlIHZ1bG5lcmFiaWxpdHkgKENWRS0yMDA0LTA1OTgpIGluIHBuZ19oYW5kbGVfaUNDUCgpLgorICBGaXhlZCBpbnRlZ2VyIG92ZXJmbG93IHZ1bG5lcmFiaWxpdHkgKENWRS0yMDA0LTA1OTkpIGluIHBuZ19yZWFkX3BuZygpLgorICBGaXhlZCBzb21lIGhhcm1sZXNzIGJ1Z3MgaW4gcG5nX2hhbmRsZV9zQklULCBldGMsIHRoYXQgd291bGQgY2F1c2UKKyAgICBkdXBsaWNhdGUgY2h1bmsgdHlwZXMgdG8gZ28gdW5kZXRlY3RlZC4KKyAgRml4ZWQgc29tZSB0aW1lc3RhbXBzIGluIHRoZSAtY29uZmlnIHZlcnNpb24KKyAgUmVhcnJhbmdlZCBvcmRlciBvZiBwcm9jZXNzaW5nIG9mIGNvbG9yIHR5cGVzIGluIHBuZ19oYW5kbGVfdFJOUygpLgorICBBZGRlZCBST1dCWVRFUyBtYWNybyB0byBjYWxjdWxhdGUgcm93Ynl0ZXMgd2l0aG91dCBpbnRlZ2VyIG92ZXJmbG93LgorICBVcGRhdGVkIG1ha2VmaWxlLmRhcndpbiBhbmQgcmVtb3ZlZCBtYWtlZmlsZS5tYWNvc3ggZnJvbSBzY3JpcHRzIGRpcmVjdG9yeS4KKyAgSW1wb3NlZCBkZWZhdWx0IG9uZSBtaWxsaW9uIGNvbHVtbiwgb25lLW1pbGxpb24gcm93IGxpbWl0cyBvbiB0aGUgaW1hZ2UKKyAgICBkaW1lbnNpb25zLCBhbmQgYWRkZWQgcG5nX3NldF91c2VyX2xpbWl0cygpIGZ1bmN0aW9uIHRvIG92ZXJyaWRlIHRoZW0uCisgIFJldmlzZWQgdXNlIG9mIFBOR19TRVRfVVNFUl9MSU1JVFNfU1VQUE9SVEVEIG1hY3JvLgorICBGaXhlZCB3cm9uZyBjYXN0IG9mIHJldHVybnMgZnJvbSBwbmdfZ2V0X3VzZXJfd2lkdGh8aGVpZ2h0X21heCgpLgorICBDaGFuZ2VkIHNvbWUgImtlZXAgdGhlIGNvbXBpbGVyIGhhcHB5IiBmcm9tIGVtcHR5IHN0YXRlbWVudHMgdG8gcmV0dXJucywKKyAgUmV2aXNlZCBsaWJwbmcudHh0IHRvIHJlbW92ZSAxLjIueCBzdHVmZiBmcm9tIHRoZSAxLjAueCBkaXN0cmlidXRpb24KKworVmVyc2lvbiAxLjAuMTZyYzIgYW5kIDEuMi42cmMyIFtBdWd1c3QgNywgMjAwNF0KKyAgUmV2aXNlZCBtYWtlZmlsZS5kYXJ3aW4gYW5kIG1ha2VmaWxlLnNvbGFyaXMuICBSZW1vdmVkIG1ha2VmaWxlLm1hY29zeC4KKyAgUmV2aXNlZCBwbmd0ZXN0J3MgcG5nX2RlYnVnX21hbGxvYygpIHRvIHVzZSBwbmdfbWFsbG9jKCkgaW5zdGVhZCBvZgorICAgIHBuZ19tYWxsb2NfZGVmYXVsdCgpIHdoaWNoIGlzIG5vdCBzdXBwb3NlZCB0byBiZSBleHBvcnRlZC4KKyAgRml4ZWQgb2ZmLWJ5LW9uZSBlcnJvciBpbiBvbmUgb2YgdGhlIGNvbnZlcnNpb25zIHRvIFBOR19ST1dCWVRFUygpIGluCisgICAgcG5ncHJlYWQuYy4gIEJ1ZyB3YXMgaW50cm9kdWNlZCBpbiAxLjIuNnJjMS4KKyAgRml4ZWQgYnVnIGluIFJHQiB0byBSR0JYIHRyYW5zZm9ybWF0aW9uIGludHJvZHVjZWQgaW4gMS4yLjZyYzEuCisgIEZpeGVkIG9sZCBidWcgaW4gUkdCIHRvIEdyYXkgdHJhbnNmb3JtYXRpb24uCisgIEZpeGVkIHByb2JsZW0gd2l0aCA2NC1iaXQgY29tcGlsZXJzIGJ5IGNhc3RpbmcgYXJndW1lbnRzIHRvIGFicygpCisgICAgdG8gcG5nX2ludF8zMi4KKyAgQ2hhbmdlZCAibG4gLXNmIiB0byAibG4gLWYgLXMiIGluIHRocmVlIG1ha2VmaWxlcyAoc29sYXJpcywgc2NvLCBzbzkpLgorICBDaGFuZ2VkICJIQU5ETEVfQ0hVTktfKiIgdG8gIlBOR19IQU5ETEVfQ0hVTktfKiIgKENvc21pbikKKyAgQWRkZWQgIi1AL2Jpbi9ybSAtZiAkKERMKS8kKExJQk5BTUUpLnNvLiQoUE5HTUFKKSIgdG8gMTUgKk5JWCBtYWtlZmlsZXMuCisgIEFkZGVkIGNvZGUgdG8gdXBkYXRlIHRoZSByb3dfaW5mby0+Y29sb3J0eXBlIGluIHBuZ19kb19yZWFkX2ZpbGxlcigpIChNU0IpLgorCitWZXJzaW9uIDEuMC4xNnJjMyBhbmQgMS4yLjZyYzMgW0F1Z3VzdCA5LCAyMDA0XQorICBFbGltaW5hdGVkIHVzZSBvZiAiYWJzKCkiIGluIHRlc3RpbmcgY0hSTSBhbmQgZ0FNQSB2YWx1ZXMsIHRvIGF2b2lkCisgICAgdHJvdWJsZSB3aXRoIHNvbWUgNjQtYml0IGNvbXBpbGVycy4gIENyZWF0ZWQgUE5HX09VVF9PRl9SQU5HRSgpIG1hY3JvLgorICBSZXZpc2VkIGRvY3VtZW50YXRpb24gb2YgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKCkuCisgIENoZWNrIGhhbmRsZV9hc191bmtub3duIHN0YXR1cyBpbiBwbmdwcmVhZC5jLCBhcyBpbiBwbmdyZWFkLmMgcHJldmlvdXNseS4KKyAgTW92ZWQgICJQTkdfSEFORExFX0NIVU5LXyoiIG1hY3JvcyBvdXQgb2YgUE5HX0lOVEVSTkFMIHNlY3Rpb24gb2YgcG5nLmgKKyAgQWRkZWQgInJpbSIgZGVmaW5pdGlvbnMgZm9yIENPTlNUNCBhbmQgQ09OU1Q2IGluIHBuZ2djY3JkLmMKKworVmVyc2lvbiAxLjAuMTZyYzQgYW5kIDEuMi42cmM0IFtBdWd1c3QgMTAsIDIwMDRdCisgIEZpeGVkIG1pc3Rha2UgaW4gcG5ndGVzdC5jIGludHJvZHVjZWQgaW4gMS4yLjZyYzIgKGRlY2xhcmF0aW9uIG9mCisgICAgInBpbmZvIiB3YXMgb3V0IG9mIHBsYWNlKS4KKworVmVyc2lvbiAxLjAuMTZyYzUgYW5kIDEuMi42cmM1IFtBdWd1c3QgMTAsIDIwMDRdCisgIE1vdmVkICAiUE5HX0hBTkRMRV9DSFVOS18qIiBtYWNyb3Mgb3V0IG9mIFBOR19BU1NFTUJMRVJfQ09ERV9TVVBQT1JURUQKKyAgICBzZWN0aW9uIG9mIHBuZy5oIHdoZXJlIHRoZXkgd2VyZSBpbmFkdmVydGVudGx5IHBsYWNlZCBpbiB2ZXJzaW9uIHJjMy4KKworVmVyc2lvbiAxLjIuNiBhbmQgMS4wLjE2IFtBdWd1c3QgMTUsIDIwMDRdCisgIFJldmlzZWQgcG5ndGVzdCBzbyBtZW1vcnkgYWxsb2NhdGlvbiB0ZXN0aW5nIGlzIG9ubHkgZG9uZSB3aGVuIFBOR19ERUJVRz09MS4KKworVmVyc2lvbiAxLjIuN2JldGExIFtBdWd1c3QgMjYsIDIwMDRdCisgIFJlbW92ZWQgdW51c2VkIHBuZ2FzbXJkLmggZmlsZS4KKyAgUmVtb3ZlZCByZWZlcmVuY2VzIHRvIHV1Lm5ldCBmb3IgYXJjaGl2ZWQgZmlsZXMuICBBZGRlZCByZWZlcmVuY2VzIHRvCisgICAgUE5HIFNwZWMgKHNlY29uZCBlZGl0aW9uKSBhbmQgdGhlIFBORyBJU08vSUVDIFN0YW5kYXJkLgorICBBZGRlZCAidGVzdC1kZCIgdGFyZ2V0IGluIDE1IG1ha2VmaWxlcywgdG8gcnVuIHBuZ3Rlc3QgaW4gREVTVERJUi4KKyAgRml4ZWQgYnVnIHdpdGggIm9wdGltaXplZCB3aW5kb3cgc2l6ZSIgaW4gdGhlIElEQVQgZGF0YXN0cmVhbSwgdGhhdAorICAgIGNhdXNlcyBsaWJwbmcgdG8gd3JpdGUgUE5HIGZpbGVzIHdpdGggaW5jb3JyZWN0IHpsaWIgaGVhZGVyIGJ5dGVzLgorCitWZXJzaW9uIDEuMi43YmV0YTIgW0F1Z3VzdCAyOCwgMjAwNF0KKyAgRml4ZWQgYnVnIHdpdGggc0NBTCBjaHVuayBhbmQgYmlnLWVuZGlhbiBtYWNoaW5lcyAoRGF2aWQgTXVucm8pLgorICBVbmRpZCBuZXcgY29kZSBhZGRlZCBpbiAxLjIuNnJjMiB0byB1cGRhdGUgdGhlIGNvbG9yX3R5cGUgaW4KKyAgICBwbmdfc2V0X2ZpbGxlcigpLgorICBBZGRlZCBwbmdfc2V0X2FkZF9hbHBoYSgpIHRoYXQgdXBkYXRlcyBjb2xvciB0eXBlLgorCitWZXJzaW9uIDEuMC4xN3JjMSBhbmQgMS4yLjdyYzEgW1NlcHRlbWJlciA0LCAyMDA0XQorICBSZXZpc2VkIHBuZ19zZXRfc3RyaXBfZmlsbGVyKCkgdG8gbm90IHJlbW92ZSBhbHBoYSBpZiBjb2xvcl90eXBlIGhhcyBhbHBoYS4KKworVmVyc2lvbiAxLjIuNyBhbmQgMS4wLjE3IFtTZXB0ZW1iZXIgMTIsIDIwMDRdCisgIEFkZGVkIG1ha2VmaWxlLmhwNjQKKyAgQ2hhbmdlZCBwcm9qZWN0cy9tc3ZjL3BuZzMybXMuZGVmIHRvIHNjcmlwdHMvcG5nMzJtcy5kZWYgaW4gbWFrZWZpbGUuY3lnd2luCisKK1ZlcnNpb24gMS4yLjhiZXRhMSBbTm92ZW1iZXIgMSwgMjAwNF0KKyAgRml4ZWQgYnVnIGluIHBuZ190ZXh0X2NvbXByZXNzKCkgdGhhdCB3b3VsZCBmYWlsIHRvIGNvbXBsZXRlIGEgbGFyZ2UgYmxvY2suCisgIEZpeGVkIGJ1ZywgaW50cm9kdWNlZCBpbiBsaWJwbmctMS4yLjcsIHRoYXQgb3ZlcnJ1bnMgYSBidWZmZXIgZHVyaW5nCisgICAgc3RyaXAgYWxwaGEgb3BlcmF0aW9uIGluIHBuZ19kb19zdHJpcF9maWxsZXIoKS4KKyAgQWRkZWQgUE5HXzFfMl9YIGRlZmluaXRpb24gaW4gcG5nY29uZi5oCisgIFVzZSAjaWZkZWYgdG8gY29tbWVudCBvdXQgcG5nX2luZm9faW5pdCBpbiBwbmcuYyBhbmQgcG5nX3JlYWRfaW5pdCBpbgorICAgIHBuZ3JlYWQuYyAoYXMgb2YgMS4zLjApCisKK1ZlcnNpb24gMS4yLjhiZXRhMiBbTm92ZW1iZXIgMiwgMjAwNF0KKyAgUmVkdWNlIGNvbG9yX3R5cGUgdG8gYSBub25hbHBoYSB0eXBlIGFmdGVyIHN0cmlwIGFscGhhIG9wZXJhdGlvbiBpbgorICAgIHBuZ19kb19zdHJpcF9maWxsZXIoKS4KKworVmVyc2lvbiAxLjIuOGJldGEzIFtOb3ZlbWJlciAzLCAyMDA0XQorICBSZXZpc2VkIGRlZmluaXRpb25zIG9mIFBOR19NQVhfVUlOVF8zMiwgUE5HX01BWF9TSVpFLCBhbmQgUE5HX01BWFNVTQorCitWZXJzaW9uIDEuMi44YmV0YTQgW05vdmVtYmVyIDEyLCAyMDA0XQorICBGaXhlZCAoYWdhaW4pIGRlZmluaXRpb24gb2YgUE5HX0xJQlBOR19WRVJfRExMTlVNIGluIHBuZy5oIChDb3NtaW4pLgorICBBZGRlZCBQTkdfTElCUE5HX0JVSUxEX1BSSVZBVEUgaW4gcG5nLmggKENvc21pbikuCisgIFNldCBwbmdfcHRyLT56c3RyZWFtLmRhdGFfdHlwZSB0byBaX0JJTkFSWSwgdG8gYXZvaWQgdW5uZWNlc3NhcnkgZGV0ZWN0aW9uCisgICAgb2YgZGF0YSB0eXBlIGluIGRlZmxhdGUgKENvc21pbikuCisgIERlcHJlY2F0ZWQgYnV0IGNvbnRpbnVlIHRvIHN1cHBvcnQgU1BFQ0lBTEJVSUxEIGFuZCBQUklWQVRFQlVJTEQgaW4gZmF2b3Igb2YKKyAgICBQTkdfTElCUE5HX0JVSUxEX1NQRUNJQUxfU1RSSU5HIGFuZCBQTkdfTElCUE5HX0JVSUxEX1BSSVZBVEVfU1RSSU5HLgorCitWZXJzaW9uIDEuMi44YmV0YTUgW05vdmVtYmVyIDIwLCAyMDA0XQorICBVc2UgcG5nX3B0ci0+ZmxhZ3MgaW5zdGVhZCBvZiBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgdG8gcGFzcworICAgIFBOR19TVFJJUF9BTFBIQSBpbmZvIHRvIHBuZ19kb19zdHJpcF9maWxsZXIoKSwgdG8gcHJlc2VydmUgQUJJCisgICAgY29tcGF0aWJpbGl0eS4KKyAgUmV2aXNlZCBoYW5kbGluZyBvZiBTUEVDSUFMQlVJTEQsIFBSSVZBVEVCVUlMRCwKKyAgICBQTkdfTElCUE5HX0JVSUxEX1NQRUNJQUxfU1RSSU5HIGFuZCBQTkdfTElCUE5HX0JVSUxEX1BSSVZBVEVfU1RSSU5HLgorCitWZXJzaW9uIDEuMi44cmMxIFtOb3ZlbWJlciAyNCwgMjAwNF0KKyAgTW92ZWQgaGFuZGxpbmcgb2YgQlVJTEQgbWFjcm9zIGZyb20gcG5nY29uZi5oIHRvIHBuZy5oCisgIEFkZGVkIGRlZmluaXRpb24gb2YgUE5HX0xJQlBOR19CQVNFX1RZUEUgaW4gcG5nLmgsIGluYWR2ZXJ0ZW50bHkKKyAgICBvbWl0dGVkIGZyb20gYmV0YTUuCisgIFJldmlzZWQgc2NyaXB0cy9wbmd3MzIucmMKKyAgRGVzcGFtbWVkIG1haWxpbmcgYWRkcmVzc2VzIGJ5IG1hc2tpbmcgIkAiIHdpdGggImF0Ii4KKyAgSW5hZHZlcnRlbnRseSBpbnN0YWxsZWQgYSBzdXBwb3NlZGx5IGZhc3RlciB0ZXN0IHZlcnNpb24gb2YgcG5ncnV0aWwuYworCitWZXJzaW9uIDEuMi44cmMyIFtOb3ZlbWJlciAyNiwgMjAwNF0KKyAgQWRkZWQgdHdvIG1pc3NpbmcgIlwiIGluIHBuZy5oCisgIENoYW5nZSB0ZXN0cyBpbiBwbmdyZWFkLmMgYW5kIHBuZ3ByZWFkLmMgdG8KKyAgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHx8IChwbmdfcHRyLT5mbGFncyZQTkdfRkxBR19TVFJJUF9BTFBIQSkpCisgICAgICAgcG5nX2RvX3JlYWRfdHJhbnNmb3JtYXRpb25zKHBuZ19wdHIpOworCitWZXJzaW9uIDEuMi44cmMzIFtOb3ZlbWJlciAyOCwgMjAwNF0KKyAgUmV2ZXJ0ZWQgcG5ncnV0aWwuYyB0byB2ZXJzaW9uIGxpYnBuZy0xLjIuOGJldGE1LgorICBBZGRlZCBzY3JpcHRzL21ha2VmaWxlLmVsZiB3aXRoIHN1cHBvcnRpbmcgY29kZSBpbiBwbmdjb25mLmggZm9yIHN5bWJvbAorICAgIHZlcnNpb25pbmcgKEpvaG4gQm93bGVyKS4KKworVmVyc2lvbiAxLjIuOHJjNCBbTm92ZW1iZXIgMjksIDIwMDRdCisgIEFkZGVkIHByb2plY3RzL3Zpc3VhbGM3IChTaW1vbi1waWVycmUpLgorCitWZXJzaW9uIDEuMi44cmM1IFtOb3ZlbWJlciAyOSwgMjAwNF0KKyAgRml4ZWQgbmV3IHR5cG8gaW4gc2NyaXB0cy9wbmd3MzIucmMKKworVmVyc2lvbiAxLjIuOCBbRGVjZW1iZXIgMywgMjAwNF0KKyAgUmVtb3ZlZCBwcm9qZWN0cy92aXN1YWxjNywgYWRkZWQgcHJvamVjdHMvdmlzdWFsYzcxLgorCitWZXJzaW9uIDEuMi45YmV0YTEgW0ZlYnJ1YXJ5IDIxLCAyMDA2XQorICBJbml0aWFsaXplZCBzb21lIHN0cnVjdHVyZSBtZW1iZXJzIGluIHBuZ3d1dGlsLmMgdG8gYXZvaWQgZ2NjLTQuMC4wIGNvbXBsYWludHMKKyAgUmV2aXNlZCBtYW4gcGFnZSBhbmQgbGlicG5nLnR4dCB0byBtYWtlIGl0IGNsZWFyIHRoYXQgb25lIHNob3VsZCBub3QgY2FsbAorICAgIHBuZ19yZWFkX2VuZCBvciBwbmdfd3JpdGVfZW5kIGFmdGVyIHBuZ19yZWFkX3BuZyBvciBwbmdfd3JpdGVfcG5nLgorICBVcGRhdGVkIHJlZmVyZW5jZXMgdG8gcG5nLW1uZy1pbXBsZW1lbnQgbWFpbGluZyBsaXN0LgorICBGaXhlZCBhbiBpbmNvcnJlY3QgdHlwZWNhc3QgaW4gcG5ncnV0aWwuYworICBBZGRlZCBQTkdfTk9fUkVBRF9TVVBQT1JURUQgY29uZGl0aW9uYWwgZm9yIG1ha2luZyBhIHdyaXRlLW9ubHkgbGlicmFyeS4KKyAgQWRkZWQgUE5HX05PX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRCBjb25kaXRpb25hbC4KKyAgT3B0aW1pemVkIGFscGhhLWludmVyc2lvbiBsb29wcyBpbiBwbmd3dHJhbi5jCisgIE1vdmVkIHRlc3QgZm9yIG5vbnplcm8gZ2FtbWEgb3V0c2lkZSBvZiBwbmdfYnVpbGRfZ2FtbWFfdGFibGUoKSBpbiBwbmdydHJhbi5jCisgIE1ha2Ugc3VyZSBudW1fdHJhbnMgaXMgPD0gMjU2IGJlZm9yZSBjb3B5aW5nIGRhdGEgaW4gcG5nX3NldF90Uk5TKCkuCisgIE1ha2Ugc3VyZSBudW1fcGFsZXR0ZSBpcyA8PSAyNTYgYmVmb3JlIGNvcHlpbmcgZGF0YSBpbiBwbmdfc2V0X1BMVEUoKS4KKyAgSW50ZXJjaGFuZ2VkIG9yZGVyIG9mIHdyaXRlX3N3YXBfYWxwaGEgYW5kIHdyaXRlX2ludmVydF9hbHBoYSB0cmFuc2Zvcm1zLgorICBBZGRlZCBwYXJlbnRoZXNlcyBpbiB0aGUgZGVmaW5pdGlvbiBvZiBQTkdfTElCUE5HX0JVSUxEX1RZUEUgKENvc21pbikuCisgIE9wdGltaXplZCB6bGliIHdpbmRvdyBmbGFnIChDSU5GTykgaW4gY29udHJpYi9wbmdzdWl0ZS8qLnBuZyAoQ29zbWluKS4KKyAgVXBkYXRlZCBzY3JpcHRzL21ha2VmaWxlLmJjMzIgZm9yIEJvcmxhbmQgQysrIDUuNiAoQ29zbWluKS4KKyAgRXhwb3J0ZWQgcG5nX2dldF91aW50XzMyLCBwbmdfc2F2ZV91aW50XzMyLCBwbmdfZ2V0X3VpbnRfMTYsIHBuZ19zYXZlX3VpbnRfMTYsCisgICAgcG5nX2dldF9pbnRfMzIsIHBuZ19zYXZlX2ludF8zMiwgcG5nX2dldF91aW50XzMxIChDb3NtaW4pLgorICBBZGRlZCB0eXBlIGNhc3QgKHBuZ19ieXRlKSBpbiBwbmdfd3JpdGVfc0NBTCgpIChDb3NtaW4pLgorICBGaXhlZCBzY3JpcHRzL21ha2VmaWxlLmN5Z3dpbiAoQ2hyaXN0aWFuIEJpZXNpbmdlciwgQ29zbWluKS4KKyAgRGVmYXVsdCBpVFh0IHN1cHBvcnQgd2FzIGluYWR2ZXJ0ZW50bHkgZW5hYmxlZC4KKworVmVyc2lvbiAxLjIuOWJldGEyIFtGZWJydWFyeSAyMSwgMjAwNl0KKyAgQ2hlY2sgZm9yIHBuZ19yZ2JfdG9fZ3JheSBhbmQgcG5nX2dyYXlfdG9fcmdiIHJlYWQgdHJhbnNmb3JtYXRpb25zIGJlZm9yZQorICAgIGNoZWNraW5nIGZvciBwbmdfcmVhZF9kaXRoZXIgaW4gcG5ncnRyYW4uYworICBSZXZpc2VkIGNoZWNraW5nIG9mIGNocm9tYXRpY2l0eSBsaW1pdHMgdG8gYWNjb21tb2RhdGUgZXh0ZW5kZWQgUkdCCisgICAgY29sb3JzcGFjZSAoSm9obiBEZW5rZXIpLgorICBDaGFuZ2VkIGxpbmUgZW5kaW5ncyBpbiBzb21lIG9mIHRoZSBwcm9qZWN0IGZpbGVzIHRvIENSTEYsIGV2ZW4gaW4gdGhlCisgICAgIlVuaXgiIHRhciBkaXN0cmlidXRpb25zIChDb3NtaW4pLgorICBNYWRlIHBuZ19nZXRfaW50XzMyIGFuZCBwbmdfc2F2ZV9pbnRfMzIgYWx3YXlzIGF2YWlsYWJsZSAoQ29zbWluKS4KKyAgVXBkYXRlZCBzY3JpcHRzL3BuZ29zMi5kZWYsIHNjcmlwdHMvcG5ndzMyLmRlZiBhbmQgcHJvamVjdHMvd2luY2UvcG5nMzJjZS5kZWYKKyAgICB3aXRoIHRoZSBuZXdseSBleHBvcnRlZCBmdW5jdGlvbnMuCisgIEVsaW1pbmF0ZWQgZGlzdHJpYnV0aW9ucyB3aXRob3V0IHRoZSAiY29uZmlndXJlIiBzY3JpcHQuCisgIFVwZGF0ZWQgSU5TVEFMTCBpbnN0cnVjdGlvbnMuCisKK1ZlcnNpb24gMS4yLjliZXRhMyBbRmVicnVhcnkgMjQsIDIwMDZdCisgIEZpeGVkIENSQ1JMRiBsaW5lIGVuZGluZ3MgaW4gY29udHJpYi92aXN1cG5nL1Zpc3VhbFBuZy5kc3AKKyAgTWFkZSBsaWJwbmcucGMgcmVzcGVjdCBFWEVDX1BSRUZJWCAoRC4gUC4gS3JlaWwsIEouIEJvd2xlcikKKyAgUmVtb3ZlZCByZWZlcmVuY2UgdG8gcG5nYXNtcmQuaCBmcm9tIE1ha2VmaWxlLmFtCisgIFJlbmFtZWQgQ0hBTkdFUyB0byBDaGFuZ2VMb2cuCisgIFJlbmFtZWQgTElDRU5TRSB0byBDT1BZSU5HLgorICBSZW5hbWVkIEFOTk9VTkNFIHRvIE5FV1MuCisgIENyZWF0ZWQgQVVUSE9SUyBmaWxlLgorCitWZXJzaW9uIDEuMi45YmV0YTQgW01hcmNoIDMsIDIwMDZdCisgIENoYW5nZWQgZGVmaW5pdGlvbiBvZiBQS0dDT05GSUcgZnJvbSAkcHJlZml4L2xpYiB0byAkbGliZGlyIGluIGNvbmZpZ3VyZS5hYworICBSZXZlcnRlZCB0byBmaWxlbmFtZXMgTElDRU5TRSBhbmQgQU5OT1VOQ0U7IHJlbW92ZWQgQVVUSE9SUyBhbmQgQ09QWUlORy4KKyAgUmVtb3ZlZCBuZXdsaW5lIGZyb20gdGhlIGVuZCBvZiBzb21lIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzLgorICBSZW1vdmVkIHRlc3QgZm9yIHNxcnQoKSBmcm9tIGNvbmZpZ3VyZS5hYyBhbmQgY29uZmlndXJlLgorICBNYWRlIHN3YXAgdGFibGVzIGluIHBuZ3RyYW5zLmMgUE5HX0NPTlNUIChDYXJsbyBCcmFtaXgpLgorICBEaXNhYmxlZCBkZWZhdWx0IGlUWHQgc3VwcG9ydCB0aGF0IHdhcyBpbmFkdmVydGVudGx5IGVuYWJsZWQgaW4KKyAgICBsaWJwbmctMS4yLjliZXRhMS4KKyAgQWRkZWQgIk9TMiIgdG8gbGlzdCBvZiBzeXN0ZW1zIHRoYXQgZG9uJ3QgbmVlZCB1bmRlcnNjb3JlcywgaW4gcG5nZ2NjcmQuYworICBSZW1vdmVkIGxpYnBuZyB2ZXJzaW9uIGFuZCBkYXRlIGZyb20gKi5jIGZpbGVzLgorCitWZXJzaW9uIDEuMi45YmV0YTUgW01hcmNoIDQsIDIwMDZdCisgIFJlbW92ZWQgdHJhaWxpbmcgYmxhbmtzIGZyb20gc291cmNlIGZpbGVzLgorICBQdXQgdmVyc2lvbiBhbmQgZGF0ZSBvZiBsYXRlc3QgY2hhbmdlIGluIGVhY2ggc291cmNlIGZpbGUsIGFuZCBjaGFuZ2VkCisgICAgY29weXJpZ2h0IHllYXIgYWNjb3JkaW5nbHkuCisgIE1vcmUgY2xlYW51cCBvZiBjb25maWd1cmUuYWMsIE1ha2VmaWxlLmFtLCBhbmQgYXNzb2NpYXRlZCBzY3JpcHRzLgorICBSZXN0b3JlZCBzY3JpcHRzL21ha2VmaWxlLmVsZiB3aGljaCB3YXMgaW5hZHZlcnRlbnRseSBkZWxldGVkLgorCitWZXJzaW9uIDEuMi45YmV0YTYgW01hcmNoIDYsIDIwMDZdCisgIEZpeGVkIHR5cG8gKFJFTEVBU0UpIGluIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKK1ZlcnNpb24gMS4yLjliZXRhNyBbTWFyY2ggNywgMjAwNl0KKyAgUmVtb3ZlZCBsaWJwbmcudmVycyBhbmQgbGlicG5nLnN5bSBmcm9tIGxpYnBuZzEyX2xhX1NPVVJDRVMgaW4gTWFrZWZpbGUuYW0KKyAgRml4ZWQgaW5jb25zaXN0ZW50ICNpZmRlZidzIGFyb3VuZCBwbmdfc2lnX2J5dGVzKCkgYW5kIHBuZ19zZXRfc0NBTF9zKCkKKyAgICBpbiBwbmcuaC4KKyAgVXBkYXRlZCBtYWtlZmlsZS5lbGYgYXMgc3VnZ2VzdGVkIGJ5IGRlYmlhbi4KKyAgTWFkZSBjb3NtZXRpYyBjaGFuZ2VzIHRvIHNvbWUgbWFrZWZpbGVzLCBhZGRpbmcgTE5fU0YgYW5kIG90aGVyIG1hY3Jvcy4KKyAgTWFkZSBzb21lIG1ha2VmaWxlcyBhY2NlcHQgImV4ZWNfcHJlZml4Ii4KKworVmVyc2lvbiAxLjIuOWJldGE4IFtNYXJjaCA5LCAyMDA2XQorICBGaXhlZCBzb21lICIjaWYgZGVmaW5lZCAoLi4uIiB3aGljaCBzaG91bGQgYmUgIiNpZiBkZWZpbmVkKC4uLiIKKyAgICBCdWcgaW50cm9kdWNlZCBpbiBsaWJwbmctMS4yLjguCisgIEZpeGVkIGluY29uc2lzdGVuY3kgaW4gZGVmaW5pdGlvbiBvZiBwbmdfZGVmYXVsdF9yZWFkX2RhdGEoKQorICBSZXN0b3JlZCBibGFuayB0aGF0IHdhcyBsb3N0IGZyb20gbWFrZWZpbGUuc2dnY2MgImNsZWFuIiB0YXJnZXQgaW4gYmV0YTcuCisgIFJldmlzZWQgY2FsY3VsYXRpb24gb2YgImN1cnJlbnQiIGFuZCAibWFqb3IiIGZvciBpcml4IGluIGx0bWFpbi5zaAorICBDaGFuZ2VkICJta2RpciIgdG8gIk1LRElSX1AiIGluIHNvbWUgbWFrZWZpbGVzLgorICBTZXBhcmF0ZWQgUE5HX0VYUEFORCBhbmQgUE5HX0VYUEFORF90Uk5TLgorICBBZGRlZCBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgoKSBhbmQgZGVwcmVjYXRlZAorICAgIHBuZ19zZXRfZ3JheV8xXzJfNF90b184KCkgd2hpY2ggYWxzbyBleHBhbmRzIHRSTlMgdG8gYWxwaGEuCisKK1ZlcnNpb24gMS4yLjliZXRhOSBbTWFyY2ggMTAsIDIwMDZdCisgIEluY2x1ZGUgImNvbmZpZy5oIiBpbiBwbmdjb25mLmggd2hlbiBhdmFpbGFibGUuCisgIEFkZGVkIHNvbWUgY2hlY2tzIGZvciBOVUxMIHBuZ19wdHIgb3IgTlVMTCBpbmZvX3B0ciAodGltZWxlc3MpCisKK1ZlcnNpb24gMS4yLjliZXRhMTAgW01hcmNoIDIwLCAyMDA2XQorICBSZW1vdmVkIGV4dHJhIENSIGZyb20gY29udHJpYi92aXN1YWxwbmcvVmlzdWFsUG5nLmRzdyAoQ29zbWluKQorICBNYWRlIHBuZ2djY3JkLmMgUElDLWNvbXBsaWFudCAoQ2hyaXN0aWFuIEFpY2hpbmdlcikuCisgIEFkZGVkIG1ha2VmaWxlLm1pbmd3IChXb2xmZ2FuZyBHbGFzKS4KKyAgUmV2aXNlZCBwbmdjb25mLmggTU1YIGNoZWNraW5nLgorCitWZXJzaW9uIDEuMi45YmV0YTExIFtNYXJjaCAyMiwgMjAwNl0KKyAgRml4ZWQgb3V0LW9mLW9yZGVyIGRlY2xhcmF0aW9uIGluIHBuZ3dyaXRlLmMgdGhhdCB3YXMgaW50cm9kdWNlZCBpbiBiZXRhOQorICBTaW1wbGlmaWVkIHNvbWUgbWFrZWZpbGVzIGJ5IHVzaW5nIExJQlNPLCBMSUJTT01BSiwgYW5kIExJQlNPVkVSIG1hY3Jvcy4KKworVmVyc2lvbiAxLjIuOXJjMSBbTWFyY2ggMzEsIDIwMDZdCisgIERlZmluZWQgUE5HX1VTRVJfUFJJVkFURUJVSUxEIHdoZW4gaW5jbHVkaW5nICJwbmd1c3IuaCIgKENvc21pbikuCisgIFJlbW92ZWQgbm9uc2Vuc2ljYWwgYXNzZXJ0aW9uIGNoZWNrIGZyb20gcG5ndGVzdC5jIChDb3NtaW4pLgorCitWZXJzaW9uIDEuMi45IFtBcHJpbCAxNCwgMjAwNl0KKyAgUmV2aXNlZCBtYWtlZmlsZS5iZW9zIGFuZCBhZGRlZCAibm9uZSIgc2VsZWN0b3IgaW4gbHRtYWluLnNoCisKK1ZlcnNpb24gMS4yLjEwYmV0YTEgW0FwcmlsIDE1LCAyMDA2XQorICBSZW5hbWVkICJjb25maWcuaCIgdG8gInBuZ19jb25mLmgiIGFuZCByZXZpc2VkIE1ha2VmaWxlLmFtIHRvIGFkZAorICAgIC1EUE5HX0JVSUxESU5HX0xJQlBORyB0byBjb21waWxlIGRpcmVjdGl2ZSwgYW5kIG1vZGlmaWVkIHBuZ2NvbmYuaAorICAgIHRvIGluY2x1ZGUgcG5nX2NvbmYuaCBvbmx5IHdoZW4gUE5HX0JVSUxESU5HX0xJQlBORyBpcyBkZWZpbmVkLgorCitWZXJzaW9uIDEuMi4xMGJldGEyIFtBcHJpbCAxNSwgMjAwNl0KKyAgTWFudWFsbHkgdXBkYXRlZCBNYWtlZmlsZS5pbiBhbmQgY29uZmlndXJlLiAgQ2hhbmdlZCBwbmdfY29uZi5oLmluCisgICAgYmFjayB0byBjb25maWcuaC4KKworVmVyc2lvbiAxLjIuMTBiZXRhMyBbQXByaWwgMTUsIDIwMDZdCisgIENoYW5nZSBwbmdfY29uZi5oIGJhY2sgdG8gY29uZmlnLmggaW4gcG5nY29uZi5oLgorCitWZXJzaW9uIDEuMi4xMGJldGE0IFtBcHJpbCAxNiwgMjAwNl0KKyAgQ2hhbmdlIFBOR19CVUlMRElOR19MSUJQTkcgdG8gUE5HX0NPTkZJR1VSRV9MSUJQTkcgaW4gY29uZmlnL01ha2VmaWxlKi4KKworVmVyc2lvbiAxLjIuMTBiZXRhNSBbQXByaWwgMTYsIDIwMDZdCisgIEFkZGVkIGEgY29uZmlndXJlIGNoZWNrIGZvciBjb21waWxpbmcgYXNzZW1ibGVyIGNvZGUgaW4gcG5nZ2NjcmQuYworCitWZXJzaW9uIDEuMi4xMGJldGE2IFtBcHJpbCAxNywgMjAwNl0KKyAgUmV2aXNlZCB0aGUgY29uZmlndXJlIGNoZWNrIGZvciBwbmdnY2NyZC5jCisgIE1vdmVkIC1EUE5HX0NPTkZJR1VSRV9MSUJQTkcgaW50byBATElCUE5HX0RFRklORVNACisgIEFkZGVkIEBMSUJQTkdfREVGSU5FU0AgdG8gYXJndW1lbnRzIHdoZW4gYnVpbGRpbmcgbGlicG5nLnN5bQorCitWZXJzaW9uIDEuMi4xMGJldGE3IFtBcHJpbCAxOCwgMjAwNl0KKyAgQ2hhbmdlICJleGVjX3ByZWZpeD0kcHJlZml4IiB0byAiZXhlY19wcmVmaXg9JChwcmVmaXgpIiBpbiBtYWtlZmlsZXMuCisKK1ZlcnNpb24gMS4yLjEwcmMxIFtBcHJpbCAxOSwgMjAwNl0KKyAgRW5zdXJlIHBuZ2NvbmYuaCBkb2Vzbid0IGRlZmluZSBib3RoIFBOR19VU0VfUE5HR0NDUkQgYW5kIFBOR19VU0VfUE5HVkNSRAorICBGaXhlZCAiTE5fRlMiIHR5cG8gaW4gbWFrZWZpbGUuc2NvIGFuZCBtYWtlZmlsZS5zb2xhcmlzLgorCitWZXJzaW9uIDEuMi4xMHJjMiBbQXByaWwgMjAsIDIwMDZdCisgIEFkZGVkIGEgYmFja3NsYXNoIGJldHdlZW4gLURQTkdfQ09ORklHVVJFX0xJQlBORyBhbmQgLURQTkdfTk9fQVNTRU1CTEVSX0NPREUKKyAgIGluIGNvbmZpZ3VyZS5hYyBhbmQgY29uZmlndXJlCisgIE1hZGUgdGhlIGNvbmZpZ3VyZSB3YXJuaW5nIGFib3V0IHZlcnNpb25lZCBzeW1ib2xzIGxlc3MgYXJyb2dhbnQuCisKK1ZlcnNpb24gMS4yLjEwcmMzIFtBcHJpbCAyMSwgMjAwNl0KKyAgQWRkZWQgYSBub3RlIGluIGxpYnBuZy50eHQgdGhhdCBwbmdfc2V0X3NpZ19ieXRlcyg4KSBjYW4gYmUgdXNlZCB3aGVuCisgICAgd3JpdGluZyBhbiBlbWJlZGRlZCBQTkcgd2l0aG91dCB0aGUgOC1ieXRlIHNpZ25hdHVyZS4KKyAgUmV2aXNlZCBtYWtlZmlsZXMgYW5kIGNvbmZpZ3VyZSB0byBhdm9pZCBtYWtpbmcgbGlua3MgdG8gbGlicG5nLnNvLioKKworVmVyc2lvbiAxLjIuMTAgW0FwcmlsIDIzLCAyMDA2XQorICBSZXZlcnRlZCBjb25maWd1cmUgdG8gInJjMiIgc3RhdGUuCisKK1ZlcnNpb24gMS4yLjExYmV0YTEgW01heSAzMSwgMjAwNl0KKyAgc2NyaXB0cy9saWJwbmcucGMuaW4gY29udGFpbmVkICJjb25maWd1cmUiIHN0eWxlIHZlcnNpb24gaW5mbyBhbmQgd291bGQKKyAgICBub3Qgd29yayB3aXRoIG1ha2VmaWxlcy4KKyAgVGhlIHNoYXJlZC1saWJyYXJ5IG1ha2VmaWxlcyB3ZXJlIGxpbmtpbmcgdG8gbGlicG5nLnNvLjAgaW5zdGVhZCBvZgorICAgIGxpYnBuZy5zby4zIGNvbXBhdGliaWxpdHkgYXMgdGhlIGxpYnJhcnkuCisKK1ZlcnNpb24gMS4yLjExYmV0YTIgW0p1bmUgMiwgMjAwNl0KKyAgSW5jcmVhc2VkIHNwcmludGYgYnVmZmVyIGZyb20gNTAgdG8gNTIgY2hhcnMgaW4gcG5ncnV0aWwuYyB0byBhdm9pZAorICAgIGJ1ZmZlciBvdmVyZmxvdy4KKyAgRml4ZWQgYnVnIGluIGV4YW1wbGUuYyAocG5nX3NldF9wYWxldHRlX3JnYiAtPiBwbmdfc2V0X3BhbGV0dGVfdG9fcmdiKQorCitWZXJzaW9uIDEuMi4xMWJldGEzIFtKdW5lIDUsIDIwMDZdCisgIFByZXBlbmRlZCAiIyEgL2Jpbi9zaCIgdG8gbHRtYWlsLnNoIGFuZCBjb250cmliL3BuZ21pbnVzLyouc2ggKENvc21pbikuCisgIFJlbW92ZWQgdGhlIGFjY2lkZW50YWwgbGVmdG92ZXIgTWFrZWZpbGUuaW5+IChDb3NtaW4pLgorICBBdm9pZGVkIHBvdGVudGlhbCBidWZmZXIgb3ZlcmZsb3cgYW5kIG9wdGltaXplZCBidWZmZXIgaW4KKyAgICBwbmdfd3JpdGVfc0NBTCgpLCBwbmdfd3JpdGVfc0NBTF9zKCkgKENvc21pbikuCisgIFJlbW92ZWQgdGhlIGluY2x1ZGUgZGlyZWN0b3JpZXMgYW5kIGxpYnJhcmllcyBmcm9tIENGTEFHUyBhbmQgTERGTEFHUworICAgIGluIHNjcmlwdHMvbWFrZWZpbGUuZ2NjIChOZWxzb24gQS4gZGUgT2xpdmVpcmEsIENvc21pbikuCisKK1ZlcnNpb24gMS4yLjExYmV0YTQgW0p1bmUgNiwgMjAwNl0KKyAgQWxsb3cgemVyby1sZW5ndGggSURBVCBjaHVua3MgYWZ0ZXIgdGhlIGVudGlyZSB6bGliIGRhdGFzdHJlYW0sIGJ1dCBub3QKKyAgICBhZnRlciBhbm90aGVyIGludGVydmVuaW5nIGNodW5rIHR5cGUuCisKK1ZlcnNpb24gMS4wLjE5cmMxLCAxLjIuMTFyYzEgW0p1bmUgMTMsIDIwMDZdCisgIERlbGV0ZWQgZXh0cmFuZW91cyBzcXVhcmUgYnJhY2tldHMgZnJvbSBbY29uZmlnLmhdIGluIGNvbmZpZ3VyZS5hYworCitWZXJzaW9uIDEuMC4xOXJjMiwgMS4yLjExcmMyIFtKdW5lIDE0LCAyMDA2XQorICBBZGRlZCBwcm90b3R5cGVzIGZvciBQTkdfSU5DSF9DT05WRVJTSU9OUyBmdW5jdGlvbnMgdG8gcG5nLmgKKyAgUmV2aXNlZCBJTlNUQUxMIGFuZCBhdXRvZ2VuLnNoCisgIEZpeGVkIHR5cG8gaW4gc2V2ZXJhbCBtYWtlZmlsZXMgKC1XMSBzaG91bGQgYmUgLVdsKQorICBBZGRlZCB0eXBlZGVmIGZvciBwbmdfaW50XzMyIGFuZCBwbmdfdWludF8zMiBvbiA2NC1iaXQgc3lzdGVtcy4KKworVmVyc2lvbiAxLjAuMTlyYzMsIDEuMi4xMXJjMyBbSnVuZSAxNSwgMjAwNl0KKyAgUmVtb3ZlZCB0aGUgbmV3IHR5cGVkZWZzIGZvciA2NC1iaXQgc3lzdGVtcyAoZGVsYXkgdW50aWwgdmVyc2lvbiAxLjQuMCkKKyAgQWRkZWQgb25lIHplcm8gZWxlbWVudCB0byBwbmdfZ2FtbWFfc2hpZnRbXSBhcnJheSBpbiBwbmdydHJhbi5jIHRvIGF2b2lkCisgICAgcmVhZGluZyBvdXQgb2YgYm91bmRzLgorCitWZXJzaW9uIDEuMC4xOXJjNCwgMS4yLjExcmM0IFtKdW5lIDE1LCAyMDA2XQorICBSZWFsbHkgcmVtb3ZlZCB0aGUgbmV3IHR5cGVkZWZzIGZvciA2NC1iaXQgc3lzdGVtcy4KKworVmVyc2lvbiAxLjAuMTlyYzUsIDEuMi4xMXJjNSBbSnVuZSAyMiwgMjAwNl0KKyAgUmVtb3ZlZCBwbmdfc2lnX2J5dGVzIGVudHJ5IGZyb20gc2NyaXB0cy9wbmd3MzIuZGVmCisKK1ZlcnNpb24gMS4wLjE5LCAxLjIuMTEgW0p1bmUgMjYsIDIwMDZdCisgIE5vbmUuCisKK1ZlcnNpb24gMS4wLjIwLCAxLjIuMTIgW0p1bmUgMjcsIDIwMDZdCisgIFJlYWxseSBpbmNyZWFzZWQgc3ByaW50ZiBidWZmZXIgZnJvbSA1MCB0byA1MiBjaGFycyBpbiBwbmdydXRpbC5jIHRvIGF2b2lkCisgICAgYnVmZmVyIG92ZXJmbG93LgorCitWZXJzaW9uIDEuMi4xM2JldGExIFtPY3RvYmVyIDIsIDIwMDZdCisgIFJlbW92ZWQgQUNfRlVOQ19NQUxMT0MgZnJvbSBjb25maWd1cmUuYWMKKyAgV29yayBhcm91bmQgSW50ZWwtTWFjIGNvbXBpbGVyIGJ1ZyBieSBzZXR0aW5nIFBOR19OT19NTVhfQ09ERSBpbiBwbmdjb25mLmgKKyAgQ2hhbmdlICJsb2dpY2FsIiB0byAiYml0d2lzZSIgdGhyb3VnaG91dCBkb2N1bWVudGF0aW9uLgorICBEZXRlY3QgYW5kIGZpeCBhdHRlbXB0IHRvIHdyaXRlIHdyb25nIGlDQ1AgcHJvZmlsZSBsZW5ndGggKENWRS0yMDA2LTcyNDQpCisKK1ZlcnNpb24gMS4wLjIxLCAxLjIuMTMgW05vdmVtYmVyIDE0LCAyMDA2XQorICBGaXggcG90ZW50aWFsIGJ1ZmZlciBvdmVyZmxvdyBpbiBzUExUIGNodW5rIGhhbmRsZXIuCisgIEZpeCBNYWtlZmlsZS5hbSB0byBub3QgdHJ5IHRvIGxpbmsgdG8gbm9leGlzdGVudCBmaWxlcy4KKyAgQ2hlY2sgYWxsIGV4cG9ydGVkIGZ1bmN0aW9ucyBmb3IgTlVMTCBwbmdfcHRyLgorCitWZXJzaW9uIDEuMi4xNGJldGExIFtOb3ZlbWJlciAxNywgMjAwNl0KKyAgUmVsb2NhdGVkIHRocmVlIG1pc3BsYWNlZCB0ZXN0cyBmb3IgTlVMTCBwbmdfcHRyLgorICBCdWlsdCBNYWtlZmlsZS5pbiB3aXRoIGF1dG9tYWtlLTEuOS42IGluc3RlYWQgb2YgMS45LjIuCisgIEJ1aWxkIGNvbmZpZ3VyZSB3aXRoIGF1dG9jb25mLTIuNjAgaW5zdGVhZCBvZiAyLjU5CisKK1ZlcnNpb24gMS4yLjE0YmV0YTIgW05vdmVtYmVyIDE3LCAyMDA2XQorICBBZGRlZCBzb21lIHR5cGVjYXN0cyBpbiBwbmdfemFsbG9jKCkuCisKK1ZlcnNpb24gMS4yLjE0cmMxIFtOb3ZlbWJlciAyMCwgMjAwNl0KKyAgQ2hhbmdlZCAic3RydG9kIiB0byAicG5nX3N0cnRvZCIgaW4gcG5ncnV0aWwuYworCitWZXJzaW9uIDEuMC4yMiwgMS4yLjE0ICAgIFtOb3ZlbWJlciAyNywgMjAwNl0KKyAgQWRkZWQgbWlzc2luZyAiJChzcmNkaXIpIiBpbiBNYWtlZmlsZS5hbSBhbmQgTWFrZWZpbGUuaW4KKworVmVyc2lvbiAxLjIuMTViZXRhMSBbRGVjZW1iZXIgMywgMjAwNl0KKyAgR2VuZXJhdGVkIGNvbmZpZ3VyZSB3aXRoIGF1dG9jb25mLTIuNjEgaW5zdGVhZCBvZiAyLjYwCisgIFJldmlzZWQgY29uZmlndXJlLmFjIHRvIHVwZGF0ZSBsaWJwbmcucGMgYW5kIGxpYnBuZy1jb25maWcuCisKK1ZlcnNpb24gMS4yLjE1YmV0YTIgW0RlY2VtYmVyIDMsIDIwMDZdCisgIEFsd2F5cyBleHBvcnQgTU1YIGFzbSBmdW5jdGlvbnMsIGp1c3Qgc3R1YnMgaWYgbm90IGJ1aWxkaW5nIHBuZ2djY3JkLmMKKworVmVyc2lvbiAxLjIuMTViZXRhMyBbRGVjZW1iZXIgNCwgMjAwNl0KKyAgQWRkICJwbmdfYnl0ZXAiIHR5cGVjYXN0IHRvIHByb2ZpbGUgd2hpbGUgY2FsY3VsYXRpbmcgbGVuZ3RoIGluIHBuZ3d1dGlsLmMKKworVmVyc2lvbiAxLjIuMTViZXRhNCBbRGVjZW1iZXIgNywgMjAwNl0KKyAgQWRkZWQgc2NyaXB0cy9DTWFrZUxpc3RzLnR4dAorICBDaGFuZ2VkIFBOR19OT19BU1NFTUJMRVJfQ09ERSB0byBQTkdfTk9fTU1YX0NPREUgaW4gc2NyaXB0cywgbGlrZSAxLjQuMGJldGEKKworVmVyc2lvbiAxLjIuMTViZXRhNSBbRGVjZW1iZXIgNywgMjAwNl0KKyAgQ2hhbmdlZCBzb21lIGluc3RhbmNlcyBvZiBQTkdfQVNTRU1CTEVSXyogdG8gUE5HX01NWF8qIGluIHBuZ2djY3JkLmMKKyAgUmV2aXNlZCBzY3JpcHRzL0NNYWtlTGlzdHMudHh0CisKK1ZlcnNpb24gMS4yLjE1YmV0YTYgW0RlY2VtYmVyIDEzLCAyMDA2XQorICBSZXZpc2VkIHNjcmlwdHMvQ01ha2VMaXN0cy50eHQgYW5kIGNvbmZpZ3VyZS5hYworCitWZXJzaW9uIDEuMi4xNXJjMSBbRGVjZW1iZXIgMTgsIDIwMDZdCisgIFJldmlzZWQgc2NyaXB0cy9DTWFrZUxpc3RzLnR4dAorCitWZXJzaW9uIDEuMi4xNXJjMiBbRGVjZW1iZXIgMjEsIDIwMDZdCisgIEFkZGVkIGNvbmRpdGlvbmFsICN1bmRlZiBqbXBidWYgaW4gcG5ndGVzdC5jIHRvIHVuZG8gI2RlZmluZSBpbiBBSVggaGVhZGVycy4KKyAgQWRkZWQgc2NyaXB0cy9tYWtlZmlsZS5ub21teAorCitWZXJzaW9uIDEuMi4xNXJjMyBbRGVjZW1iZXIgMjUsIDIwMDZdCisgIEZpeGVkIHNoYXJlZCBsaWJyYXJ5IG51bWJlcmluZyBlcnJvciB0aGF0IHdhcyBpbnRyb2R1Y2VkIGluIDEuMi4xNWJldGE2LgorCitWZXJzaW9uIDEuMi4xNXJjNCBbRGVjZW1iZXIgMjcsIDIwMDZdCisgIEZpeGVkIGhhbmRsaW5nIG9mIHJnYl90b19ncmF5IHdoZW4gcG5nX3B0ci0+Y29sb3IuZ3JheSBpc24ndCBzZXQuCisKK1ZlcnNpb24gMS4yLjE1cmM1IFtEZWNlbWJlciAzMSwgMjAwNl0KKyAgUmV2aXNlZCBoYW5kbGluZyBvZiByZ2JfdG9fZ3JheS4KKworVmVyc2lvbiAxLjIuMTUgW0phbnVhcnkgNSwgMjAwN10KKyAgQWRkZWQgc29tZSAodW5zaWduZWQgbG9uZykgdHlwZWNhc3RzIGluIHBuZ3Rlc3QuYyB0byBhdm9pZCBwcmludGluZyBlcnJvcnMuCisKK1ZlcnNpb24gMS4yLjE2YmV0YTEgW0phbnVhcnkgNiwgMjAwN10KKyAgRml4IGJ1Z3MgaW4gbWFrZWZpbGUubm9tbXgKKworVmVyc2lvbiAxLjIuMTZiZXRhMiBbSmFudWFyeSAxNiwgMjAwN10KKyAgUmV2aXNlZCBzY3JpcHRzL0NNYWtlTGlzdHMudHh0CisKK1ZlcnNpb24gMS4yLjE2IFtKYW51YXJ5IDMxLCAyMDA3XQorICBObyBjaGFuZ2VzLgorCitWZXJzaW9uIDEuMi4xN2JldGExIFtNYXJjaCA2LCAyMDA3XQorICBSZXZpc2VkIHNjcmlwdHMvQ01ha2VMaXN0cy50eHQgdG8gaW5zdGFsbCBib3RoIHNoYXJlZCBhbmQgc3RhdGljIGxpYnJhcmllcy4KKyAgRGVsZXRlZCBhIHJlZHVuZGFudCBsaW5lIGZyb20gcG5nc2V0LmMuCisKK1ZlcnNpb24gMS4yLjE3YmV0YTIgW0FwcmlsIDI2LCAyMDA3XQorICBSZWxvY2F0ZWQgbWlzcGxhY2VkIHRlc3QgZm9yIHBuZ19wdHIgPT0gTlVMTCBpbiBwbmdwcmVhZC5jCisgIENoYW5nZSAiPT0iIHRvICImIiBmb3IgdGVzdGluZyBQTkdfUkdCX1RPX0dSQVlfRVJSICYgUE5HX1JHQl9UT19HUkFZX1dBUk4KKyAgICBmbGFncy4KKyAgQ2hhbmdlZCByZW1haW5pbmcgaW5zdGFuY2VzIG9mIFBOR19BU1NFTUJMRVJfKiB0byBQTkdfTU1YXyoKKyAgQWRkZWQgcG5nZXJyb3IoKSB3aGVuIHdyaXRlX0lIRFIgZmFpbHMgaW4gZGVmbGF0ZUluaXQyKCkuCisgIEFkZGVkICJjb25zdCIgdG8gc29tZSBhcnJheSBkZWNsYXJhdGlvbnMuCisgIE1lbnRpb24gZXhhbXBsZXMgb2YgbGlicG5nIHVzYWdlIGluIHRoZSBsaWJwbmcqLnR4dCBhbmQgbGlicG5nLjMgZG9jdW1lbnRzLgorCitWZXJzaW9uIDEuMi4xN3JjMSBbTWF5IDQsIDIwMDddCisgIE5vIGNoYW5nZXMuCisKK1ZlcnNpb24gMS4yLjE3cmMyIFtNYXkgOCwgMjAwN10KKyAgTW92ZWQgc2V2ZXJhbCBQTkdfSEFWRV8qIG1hY3JvcyBvdXQgb2YgUE5HX0lOVEVSTkFMIGJlY2F1c2UgYXBwbGljYXRpb25zCisgICAgY2FsbGluZyBzZXRfdW5rbm93bl9jaHVua19sb2NhdGlvbigpIG5lZWQgdGhlbS4KKyAgQ2hhbmdlZCB0cmFuc2Zvcm1hdGlvbiBmbGFnIGZyb20gUE5HX0VYUEFORF90Uk5TIHRvIFBOR19FWFBBTkQgaW4KKyAgICBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgoKS4KKyAgQWRkZWQgcG5nX3B0ci0+dW5rbm93bl9jaHVuayB0byBob2xkIHdvcmtpbmcgdW5rbm93biBjaHVuayBkYXRhLCBzbyBpdAorICAgIGNhbiBiZSBmcmVlJ2VkIGluIGNhc2Ugb2YgZXJyb3IuICBSZXZpc2VkIHVua25vd24gY2h1bmsgaGFuZGxpbmcgaW4KKyAgICBwbmdydXRpbC5jIGFuZCBwbmdwcmVhZC5jIHRvIHVzZSB0aGlzIHN0cnVjdHVyZS4KKworVmVyc2lvbiAxLjIuMTdyYzMgW01heSA4LCAyMDA3XQorICBSZXZpc2VkIHN5bWJvbC1oYW5kbGluZyBpbiBjb25maWd1cmUgc2NyaXB0LgorCitWZXJzaW9uIDEuMi4xN3JjNCBbTWF5IDEwLCAyMDA3XQorICBSZXZpc2VkIHVua25vd24gY2h1bmsgaGFuZGxpbmcgdG8gYXZvaWQgc3RvcmluZyB1bmtub3duIGNyaXRpY2FsIGNodW5rcy4KKworVmVyc2lvbiAxLjAuMjUgW01heSAxNSwgMjAwN10KK1ZlcnNpb24gMS4yLjE3IFtNYXkgMTUsIDIwMDddCisgIEFkZGVkICJwbmdfcHRyLT5udW1fdHJhbnM9MCIgYmVmb3JlIGVycm9yIHJldHVybiBpbiBwbmdfaGFuZGxlX3RSTlMsCisgICAgdG8gZWxpbWluYXRlIGEgdnVsbmVyYWJpbGl0eSAoQ1ZFLTIwMDctMjQ0NSwgQ0VSVCBWVSM2ODQ2NjQpCisKK1ZlcnNpb24gMS4wLjI2IFtNYXkgMTUsIDIwMDddCitWZXJzaW9uIDEuMi4xOCBbTWF5IDE1LCAyMDA3XQorICBSZXZlcnRlZCB0aGUgbGlicG5nLTEuMi4xN3JjMyBjaGFuZ2UgdG8gc3ltYm9sLWhhbmRsaW5nIGluIGNvbmZpZ3VyZSBzY3JpcHQKKworVmVyc2lvbiAxLjIuMTliZXRhMSBbTWF5IDE4LCAyMDA3XQorICBDaGFuZ2VkICJjb25zdCBzdGF0aWMiIHRvICJzdGF0aWMgUE5HX0NPTlNUIiBldmVyeXdoZXJlLCBtb3N0bHkgdW5kb2luZworICAgIGNoYW5nZSBvZiBsaWJwbmctMS4yLjE3YmV0YTIuICBDaGFuZ2VkIG90aGVyICJjb25zdCIgdG8gIlBOR19DT05TVCIKKyAgQ2hhbmdlZCBzb21lIGhhbmRsaW5nIG9mIHVudXNlZCBwYXJhbWV0ZXJzLCB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncy4KKyAgICAiaWYgKHVudXNlZCA9PSBOVUxMKSByZXR1cm47IiBiZWNvbWVzICJ1bnVzZWQgPSB1bnVzZWQiLgorCitWZXJzaW9uIDEuMi4xOWJldGEyIFtNYXkgMTgsIDIwMDddCisgIE9ubHkgdXNlIHRoZSB2YWxpZCBiaXRzIG9mIHRSTlMgdmFsdWUgaW4gcG5nX2RvX2V4cGFuZCgpIChCcmlhbiBDYXJ0aWVyKQorCitWZXJzaW9uIDEuMi4xOWJldGEzIFtNYXkgMTksIDIwMDddCisgIEFkZCBzb21lICJwbmdfYnl0ZSIgdHlwZWNhc3RzIGluIHBuZ19jaGVja19rZXl3b3JkKCkgYW5kIHdyaXRlIG5ld19rZXkKKyAgaW5zdGVhZCBvZiBrZXkgaW4gelRYdCBjaHVuayAoS2V2aW4gUnlkZSkuCisKK1ZlcnNpb24gMS4yLjE5YmV0YTQgW01heSAyMSwgMjAwN10KKyAgQWRkIHBuZ19zbnByaW50ZigpIGZ1bmN0aW9uIGFuZCB1c2UgaXQgaW4gcGxhY2Ugb2Ygc3ByaW50KCkgZm9yIGltcHJvdmVkCisgICAgZGVmZW5zZSBhZ2FpbnN0IGJ1ZmZlciBvdmVyZmxvd3MuCisKK1ZlcnNpb24gMS4yLjE5YmV0YTUgW01heSAyMSwgMjAwN10KKyAgRml4ZWQgcG5nX2hhbmRsZV90Uk5TKCkgdG8gb25seSB1c2UgdGhlIHZhbGlkIGJpdHMgb2YgdFJOUyB2YWx1ZS4KKyAgQ2hhbmdlZCBoYW5kbGluZyBvZiBtb3JlIHVudXNlZCBwYXJhbWV0ZXJzLCB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncy4KKyAgUmVtb3ZlZCBzb21lIFBOR19DT05TVCBpbiBwbmd3dXRpbC5jIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLgorCitWZXJzaW9uIDEuMi4xOWJldGE2IFtNYXkgMjIsIDIwMDddCisgIEFkZGVkIHNvbWUgI2lmZGVmIFBOR19NTVhfQ09ERV9TVVBQT1JURUQgd2hlcmUgbmVlZGVkIGluIHBuZ3ZjcmQuYworICBBZGRlZCBhIHNwZWNpYWwgIl9NU0NfVkVSIiBjYXNlIHRoYXQgZGVmaW5lcyBwbmdfc25wcmludGYgdG8gX3NucHJpbnRmCisKK1ZlcnNpb24gMS4yLjE5YmV0YTcgW01heSAyMiwgMjAwN10KKyAgU3F1ZWxjaGVkIHBuZ19zcXVlbGNoX3dhcm5pbmdzKCkgaW4gcG5nZ2NjcmQuYyBhbmQgYWRkZWQKKyAgICBhbiAjaWZkZWYgUE5HX01NWF9DT0RFX1NVUFBPUlRFRCBibG9jayBhcm91bmQgdGhlIGRlY2xhcmF0aW9ucyB0aGF0IGNhdXNlZAorICAgIHRoZSB3YXJuaW5ncyB0aGF0IHBuZ19zcXVlbGNoX3dhcm5pbmdzIHdhcyBzcXVlbGNoaW5nLgorCitWZXJzaW9uIDEuMi4xOWJldGE4IFtNYXkgMjIsIDIwMDddCisgIFJlbW92ZWQgX19NTVhfXyBmcm9tIHRlc3QgaW4gcG5nY29uZi5oLgorCitWZXJzaW9uIDEuMi4xOWJldGE5IFtNYXkgMjMsIDIwMDddCisgIE1hZGUgcG5nX3NxdWVsY2hfd2FybmluZ3MoKSBhdmFpbGFibGUgdmlhIFBOR19TUVVFTENIX1dBUk5JTkdTIG1hY3JvLgorICBSZXZpc2VkIHBuZ19zcXVlbGNoX3dhcm5pbmdzKCkgc28gaXQgbWlnaHQgd29yay4KKyAgVXBkYXRlZCBtYWtlZmlsZS5zZ2NjIGFuZCBtYWtlZmlsZS5zb2xhcmlzOyBhZGRlZCBtYWtlZmlsZS5zb2xhcmlzLXg4Ni4KKworVmVyc2lvbiAxLjIuMTliZXRhMTAgW01heSAyNCwgMjAwN10KKyAgUmVzcXVlbGNoZWQgcG5nX3NxdWVsY2hfd2FybmluZ3MoKSwgdXNlICJfX2F0dHJpYnV0ZV9fKCh1c2VkKSkiIGluc3RlYWQuCisKK1ZlcnNpb24gMS40LjBiZXRhMSBbQXByaWwgMjAsIDIwMDZdCisgIEVuYWJsZWQgaVRYdCBzdXBwb3J0IChjaGFuZ2VzIHBuZ19zdHJ1Y3QsIHRodXMgcmVxdWlyZXMgc28tbnVtYmVyIGNoYW5nZSkuCisgIENsZWFuZWQgdXAgUE5HX0FTU0VNQkxFUl9DT0RFX1NVUFBPUlRFRCB2cyBQTkdfTU1YX0NPREVfU1VQUE9SVEVECisgIEVsaW1pbmF0ZWQgUE5HXzFfMF9YIGFuZCBQTkdfMV8yX1ggbWFjcm9zLgorICBSZW1vdmVkIGRlcHJlY2F0ZWQgZnVuY3Rpb25zIHBuZ19yZWFkX2luaXQsIHBuZ193cml0ZV9pbml0LCBwbmdfaW5mb19pbml0LAorICAgIHBuZ19wZXJtaXRfZW1wdHlfcGx0ZSwgcG5nX3NldF9ncmF5XzFfMl80X3RvXzgsIHBuZ19jaGVja19zaWcsIGFuZAorICAgIHJlbW92ZWQgdGhlIGRlcHJlY2F0ZWQgbWFjcm8gUE5HX01BWF9VSU5ULgorICBNb3ZlZCAiUE5HX0lOVEVSTkFMIiBwYXJ0cyBvZiBwbmcuaCBhbmQgcG5nY29uZi5oIGludG8gcG5naW50cm4uaAorICBSZW1vdmVkIG1hbnkgV0lOMzJfV0NFICNpZmRlZnMgKENvc21pbikuCisgIFJlZHVjZWQgZGVwZW5kZW5jeSBvbiBDLXJ1bnRpbWUgbGlicmFyeSB3aGVuIG9uIFdpbmRvd3MgKFNpbW9uLVBpZXJyZSkKKyAgUmVwbGFjZWQgc3ByaW50ZigpIHdpdGggcG5nX3NwcmludGYoKSAoU2ltb24tUGllcnJlKQorCitWZXJzaW9uIDEuNC4wYmV0YTIgW0FwcmlsIDIwLCAyMDA2XQorICBSZXZpc2VkIG1ha2VmaWxlcyBhbmQgY29uZmlndXJlIHRvIGF2b2lkIG1ha2luZyBsaW5rcyB0byBsaWJwbmcuc28uKgorICBNb3ZlZCBzb21lIGxlZnRvdmVyIE1NWC1yZWxhdGVkIGRlZmluZXMgZnJvbSBwbmdjb25mLmggdG8gcG5naW50cm4uaAorICBVcGRhdGVkIHNjcmlwdHMvcG5nb3MyLmRlZiwgcG5ndzMyLmRlZiwgYW5kIHByb2plY3RzL3dpbmNlL3BuZzMyY2UuZGVmCisKK1ZlcnNpb24gMS40LjBiZXRhMyBbTWF5IDEwLCAyMDA2XQorICBVcGRhdGVkIHNjcmlwdHMvcG5ndzMyLmRlZiB0byBjb21tZW50IG91dCBNTVggZnVuY3Rpb25zLgorICBBZGRlZCBQTkdfTk9fR0VUX0lOVF8zMiBhbmQgUE5HX05PX1NBVkVfSU5UXzMyIG1hY3Jvcy4KKyAgU2NyaXB0cy9saWJwbmcucGMuaW4gY29udGFpbmVkICJjb25maWd1cmUiIHN0eWxlIHZlcnNpb24gaW5mbyBhbmQgd291bGQKKyAgICBub3Qgd29yayB3aXRoIG1ha2VmaWxlcy4KKyAgUmV2aXNlZCBwbmdjb25mLmggYW5kIGFkZGVkIHBuZ2NvbmYuaC5pbiwgc28gbWFrZWZpbGVzIGFuZCBjb25maWd1cmUgY2FuCisgICAgcGFzcyBkZWZpbmVzIHRvIGxpYnBuZyBhbmQgYXBwbGljYXRpb25zLgorCitWZXJzaW9uIDEuNC4wYmV0YTQgW01heSAxMSwgMjAwNl0KKyAgUmV2aXNlZCBjb25maWd1cmUuYWMsIE1ha2VmaWxlLmFtLCBhbmQgbWFueSBvZiB0aGUgbWFrZWZpbGVzIHRvIHdyaXRlCisgICAgdGhlaXIgZGVmaW5lcyBpbiBwbmdjb25mLmguCisKK1ZlcnNpb24gMS40LjBiZXRhNSBbTWF5IDE1LCAyMDA2XQorICBBZGRlZCBhIG1pc3Npbmcgc2VtaWNvbG9uIGluIE1ha2VmaWxlLmFtIGFuZCBNYWtlZmlsZS5pbgorICBEZWxldGVkIGV4dHJhbmVvdXMgc3F1YXJlIGJyYWNrZXRzIGZyb20gY29uZmlndXJlLmFjCisKK1ZlcnNpb24gMS40LjBiZXRhNiBbSnVuZSAyLCAyMDA2XQorICBJbmNyZWFzZWQgc3ByaW50ZiBidWZmZXIgZnJvbSA1MCB0byA1MiBjaGFycyBpbiBwbmdydXRpbC5jIHRvIGF2b2lkCisgICAgYnVmZmVyIG92ZXJmbG93LgorICBDaGFuZ2VkIHNvbnVtIGZyb20gMCB0byAxLgorICBSZW1vdmVkIHVudXNlZCBwcm90b3R5cGUgZm9yIHBuZ19jaGVja19zaWcoKSBmcm9tIHBuZy5oCisKK1ZlcnNpb24gMS40LjBiZXRhNyBbSnVuZSAxNiwgMjAwNl0KKyAgRXhwb3J0ZWQgcG5nX3dyaXRlX3NpZyAoQ29zbWluKS4KKyAgT3B0aW1pemVkIGJ1ZmZlciBpbiBwbmdfaGFuZGxlX2NIUk0oKSAoQ29zbWluKS4KKyAgU2V0IHBIWXMgPSAyODM1IHggMjgzNSBwaXhlbHMgcGVyIG1ldGVyLCBhbmQgYWRkZWQKKyAgICBzQ0FMID0gMC4zNTI3NzhlLTMgeCAwLjM1Mjc3OGUtMyBtZXRlcnMsIGluIHBuZ3Rlc3QucG5nIChDb3NtaW4pLgorICBBZGRlZCBwbmdfc2V0X2Jlbmlnbl9lcnJvcnMoKSwgcG5nX2Jlbmlnbl9lcnJvcigpLCBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKCkuCisgIEFkZGVkIHR5cGVkZWYgZm9yIHBuZ19pbnRfMzIgYW5kIHBuZ191aW50XzMyIG9uIDY0LWJpdCBzeXN0ZW1zLgorICBBZGRlZCAiKHVuc2lnbmVkIGxvbmcpIiB0eXBlY2FzdCBvbiBwbmdfdWludF8zMiB2YXJpYWJsZXMgaW4gcHJpbnRmIGxpc3RzLgorCitWZXJzaW9uIDEuNC4wYmV0YTggW0p1bmUgMjIsIDIwMDZdCisgIEFkZGVkIGRlbW9uc3RyYXRpb24gb2YgdXNlciBjaHVuayBzdXBwb3J0IGluIHBuZ3Rlc3QuYywgdG8gc3VwcG9ydCB0aGUKKyAgICBwdWJsaWMgc1RFUiBjaHVuayBhbmQgYSBwcml2YXRlIHZwQWcgY2h1bmsuCisKK1ZlcnNpb24gMS40LjBiZXRhOSBbSnVseSAzLCAyMDA2XQorICBSZW1vdmVkIG9yZGluYWxzIGZyb20gc2NyaXB0cy9wbmd3MzIuZGVmIGFuZCByZW1vdmVkIHBuZ19pbmZvX2ludCBhbmQKKyAgICBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCBlbnRyaWVzLgorICBJbmxpbmUgY2FsbCBvZiBwbmdfZ2V0X3VpbnRfMzIoKSBpbiBwbmdfZ2V0X3VpbnRfMzEoKS4KKyAgVXNlIHBuZ19nZXRfdWludF8zMSgpIHRvIGdldCB2cEFnIHdpZHRoIGFuZCBoZWlnaHQgaW4gcG5ndGVzdC5jCisgIFJlbW92ZWQgV0lOQ0UgYW5kIE5ldHdhcmUgcHJvamVjdHMuCisgIFJlbW92ZWQgc3RhbmRhbG9uZSBZMktJTkZPIGZpbGUuCisKK1ZlcnNpb24gMS40LjBiZXRhMTAgW0p1bHkgMTIsIDIwMDZdCisgIEVsaW1pbmF0ZWQgYXV0b21hdGljIGNvcHkgb2YgcG5nY29uZi5oIHRvIHBuZ2NvbmYuaC5pbiBmcm9tIGNvbmZpZ3VyZSBhbmQKKyAgICBzb21lIG1ha2VmaWxlcywgYmVjYXVzZSBpdCB3YXMgbm90IHdvcmtpbmcgcmVsaWFibHkuICBJbnN0ZWFkLCBkaXN0cmlidXRlCisgICAgcG5nY29uZi5oLmluIGFsb25nIHdpdGggcG5nY29uZi5oIGFuZCBjYXVzZSBjb25maWd1cmUgYW5kIHNvbWUgb2YgdGhlCisgICAgbWFrZWZpbGVzIHRvIHVwZGF0ZSBwbmdjb25mLmggZnJvbSBwbmdjb25mLmguaW4uCisgIEFkZGVkIHBuZ2NvbmYuaCB0byBERVBFTkRFTkNJRVMgaW4gTWFrZWZpbGUuYW0KKworVmVyc2lvbiAxLjQuMGJldGExMSBbQXVndXN0IDE5LCAyMDA2XQorICBSZW1vdmVkIEFDX0ZVTkNfTUFMTE9DIGZyb20gY29uZmlndXJlLmFjLgorICBBZGRlZCBhIHdhcm5pbmcgd2hlbiB3cml0aW5nIGlDQ1AgcHJvZmlsZSB3aXRoIG1pc21hdGNoZWQgcHJvZmlsZSBsZW5ndGguCisgIFBhdGNoZWQgcG5nZ2NjcmQuYyB0byBhc3NlbWJsZSBvbiB4ODZfNjQgcGxhdGZvcm1zLgorICBNb3ZlZCBjaHVuayBoZWFkZXIgcmVhZGluZyBpbnRvIGEgc2VwYXJhdGUgZnVuY3Rpb24gcG5nX3JlYWRfY2h1bmtfaGVhZGVyKCkKKyAgICBpbiBwbmdydXRpbC5jLiAgVGhlIGNodW5rIGhlYWRlciAobGVuK3NpZykgaXMgbm93IHNlcmlhbGl6ZWQgaW4gYSBzaW5nbGUKKyAgICBvcGVyYXRpb24gKENvc21pbikuCisgIEltcGxlbWVudGVkIHN1cHBvcnQgZm9yIEkvTyBzdGF0ZXMuIEFkZGVkIHBuZ19wdHIgbWVtYmVyIGlvX3N0YXRlLCBhbmQKKyAgICBmdW5jdGlvbnMgcG5nX2dldF9pb19jaHVua19uYW1lKCkgYW5kIHBuZ19nZXRfaW9fc3RhdGUoKSBpbiBwbmdnZXQuYworICAgIChDb3NtaW4pLgorICBBZGRlZCBwbmdfZ2V0X2lvX2NodW5rX25hbWUgYW5kIHBuZ19nZXRfaW9fc3RhdGUgdG8gc2NyaXB0cy8qLmRlZiAoQ29zbWluKS4KKyAgUmVuYW1lZCBzY3JpcHRzL3BuZ3czMi4qIHRvIHNjcmlwdHMvcG5nd2luLiogKENvc21pbikuCisgIFJlbW92ZWQgdGhlIGluY2x1ZGUgZGlyZWN0b3JpZXMgYW5kIGxpYnJhcmllcyBmcm9tIENGTEFHUyBhbmQgTERGTEFHUworICAgIGluIHNjcmlwdHMvbWFrZWZpbGUuZ2NjIChDb3NtaW4pLgorICBVc2VkIHBuZ19zYXZlX3VpbnRfMzIoKSB0byBzZXQgdnBBZyB3aWR0aCBhbmQgaGVpZ2h0IGluIHBuZ3Rlc3QuYyAoQ29zbWluKS4KKyAgQ2FzdCB0byBwcm9wZXIgdHlwZSB3aGVuIGdldHRpbmcvc2V0dGluZyB2cEFnIHVuaXRzIGluIHBuZ3Rlc3QuYyAoQ29zbWluKS4KKyAgQWRkZWQgcG5naW50cm4uaCB0byB0aGUgVmlzdWFsIEMrKyBwcm9qZWN0cyAoQ29zbWluKS4KKyAgUmVtb3ZlZCBzY3JpcHRzL2xpc3QgKENvc21pbikuCisgIFVwZGF0ZWQgY29weXJpZ2h0IHllYXIgaW4gc2NyaXB0cy9wbmd3aW4uZGVmIChDb3NtaW4pLgorICBSZW1vdmVkIFBOR19UWVBFQ0FTVF9OVUxMIGFuZCB1c2VkIHN0YW5kYXJkIE5VTEwgY29uc2lzdGVudGx5IChDb3NtaW4pLgorICBEaXNhbGxvd2VkIHRoZSB1c2VyIHRvIHJlZGVmaW5lIHBuZ19zaXplX3QsIGFuZCBlbmZvcmNlZCBhIGNvbnNpc3RlbnQgdXNlCisgICAgb2YgcG5nX3NpemVfdCBhY3Jvc3MgbGlicG5nIChDb3NtaW4pLgorICBDaGFuZ2VkIHRoZSB0eXBlIG9mIHBuZ19wdHItPnJvd2J5dGVzLCBQTkdfUk9XQllURVMoKSBhbmQgZnJpZW5kcworICAgIHRvIHBuZ19zaXplX3QgKENvc21pbikuCisgIFJlbW92ZWQgcG5nX2NvbnZlcnRfc2l6ZSgpIGFuZCByZXBsYWNlZCBwbmdfc2l6ZW9mIHdpdGggc2l6ZW9mIChDb3NtaW4pLgorICBSZW1vdmVkIHNvbWUgdW5uZWNlc3NhcnkgdHlwZSBjYXN0cyAoQ29zbWluKS4KKyAgQ2hhbmdlZCBwcm90b3R5cGUgb2YgcG5nX2dldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZSgpIGFuZAorICAgIHBuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUoKSB0byB3b3JrIHdpdGggcG5nX3NpemVfdCBpbnN0ZWFkIG9mCisgICAgcG5nX3VpbnRfMzIgKENvc21pbikuCisgIFJlbW92ZWQgcG5nX21lbWNweV9jaGVjaygpIGFuZCBwbmdfbWVtc2V0X2NoZWNrKCkgKENvc21pbikuCisgIEZpeGVkIGEgdHlwbyAocG5nX2J5dGUgLS0+IHBuZ19ieXRlcCkgaW4gbGlicG5nLjMgYW5kIGxpYnBuZy50eHQgKENvc21pbikuCisgIENsYXJpZmllZCB0aGF0IHBuZ196YWxsb2MoKSBkb2VzIG5vdCBjbGVhciB0aGUgYWxsb2NhdGVkIG1lbW9yeSwKKyAgICBhbmQgcG5nX3phbGxvYygpIGFuZCBwbmdfemZyZWUoKSBjYW5ub3QgYmUgUE5HQVBJIChDb3NtaW4pLgorICBSZW5hbWVkIHBuZ19tZW1fc2l6ZV90IHRvIHBuZ19hbGxvY19zaXplX3QsIGZpeGVkIGl0cyBkZWZpbml0aW9uIGluCisgICAgcG5nY29uZi5oLCBhbmQgdXNlZCBpdCBpbiBhbGwgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIChDb3NtaW4pLgorICBSZW5hbWVkIHBuZ2ludHJuLmggdG8gcG5ncHJpdi5oLCBhZGRlZCBhIGNvbW1lbnQgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZQorICAgIG1lbnRpb25pbmcgdGhhdCB0aGUgc3ltYm9scyBkZWNsYXJlZCBpbiB0aGF0IGZpbGUgYXJlIHByaXZhdGUsIGFuZAorICAgIHVwZGF0ZWQgdGhlIHNjcmlwdHMgYW5kIHRoZSBWaXN1YWwgQysrIHByb2plY3RzIGFjY29yZGluZ2x5IChDb3NtaW4pLgorICBSZW1vdmVkIGNpcmN1bGFyIHJlZmVyZW5jZXMgYmV0d2VlbiBwbmdjb25mLmggYW5kIHBuZ2NvbmYuaC5pbiBpbgorICAgIHNjcmlwdHMvbWFrZWZpbGUudmMqd2luMzIgKENvc21pbikuCisgIFJlbW92aW5nIHRyYWlsaW5nICcuJyBmcm9tIHRoZSB3YXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcyAoQ29zbWluKS4KKyAgQWRkZWQgcG5nZGVmcy5oIHRoYXQgaXMgYnVpbHQgYnkgbWFrZWZpbGUgb3IgY29uZmlndXJlLCBpbnN0ZWFkIG9mCisgICAgcG5nY29uZi5oLmluIChHbGVubikuCisgIERldGVjdCBhbmQgZml4IGF0dGVtcHQgdG8gd3JpdGUgd3JvbmcgaUNDUCBwcm9maWxlIGxlbmd0aC4KKworVmVyc2lvbiAxLjQuMGJldGExMiBbT2N0b2JlciAxOSwgMjAwNl0KKyAgQ2hhbmdlZCAibG9naWNhbCIgdG8gImJpdHdpc2UiIGluIHRoZSBkb2N1bWVudGF0aW9uLgorICBXb3JrIGFyb3VuZCBJbnRlbC1NYWMgY29tcGlsZXIgYnVnIGJ5IHNldHRpbmcgUE5HX05PX01NWF9DT0RFIGluIHBuZ2NvbmYuaAorICBBZGQgYSB0eXBlY2FzdCB0byBzdGlmbGUgY29tcGlsZXIgd2FybmluZyBpbiBwbmdydXRpbC5jCisKK1ZlcnNpb24gMS40LjBiZXRhMTMgW05vdmVtYmVyIDEwLCAyMDA2XQorICBGaXggcG90ZW50aWFsIGJ1ZmZlciBvdmVyZmxvdyBpbiBzUExUIGNodW5rIGhhbmRsZXIuCisgIEZpeCBNYWtlZmlsZS5hbSB0byBub3QgdHJ5IHRvIGxpbmsgdG8gbm9leGlzdGVudCBmaWxlcy4KKworVmVyc2lvbiAxLjQuMGJldGExNCBbTm92ZW1iZXIgMTUsIDIwMDZdCisgIENoZWNrIGFsbCBleHBvcnRlZCBmdW5jdGlvbnMgZm9yIE5VTEwgcG5nX3B0ci4KKworVmVyc2lvbiAxLjQuMGJldGExNSBbTm92ZW1iZXIgMTcsIDIwMDZdCisgIFJlbG9jYXRlZCB0d28gbWlzcGxhY2VkIHRlc3RzIGZvciBOVUxMIHBuZ19wdHIuCisgIEJ1aWx0IE1ha2VmaWxlLmluIHdpdGggYXV0b21ha2UtMS45LjYgaW5zdGVhZCBvZiAxLjkuMi4KKyAgQnVpbGQgY29uZmlndXJlIHdpdGggYXV0b2NvbmYtMi42MCBpbnN0ZWFkIG9mIDIuNTkKKyAgQWRkICJpbnN0YWxsOiBhbGwiIGluIE1ha2VmaWxlLmFtIHNvICJjb25maWd1cmU7IG1ha2UgaW5zdGFsbCIgd2lsbCB3b3JrLgorCitWZXJzaW9uIDEuNC4wYmV0YTE2IFtOb3ZlbWJlciAxNywgMjAwNl0KKyAgQWRkZWQgYSB0eXBlY2FzdCBpbiBwbmdfemFsbG9jKCkuCisKK1ZlcnNpb24gMS40LjBiZXRhMTcgW0RlY2VtYmVyIDQsIDIwMDZdCisgIENoYW5nZWQgIm5ld19rZXlbNzldID0gJ1wwJzsiIHRvICIoKm5ld19rZXkpWzc5XSA9ICdcMCc7IiBpbiBwbmd3dXRpbC5jCisgIEFkZCAicG5nX2J5dGVwIiB0eXBlY2FzdCB0byBwcm9maWxlIHdoaWxlIGNhbGN1bGF0aW5nIGxlbmd0aCBpbiBwbmd3dXRpbC5jCisKK1ZlcnNpb24gMS40LjBiZXRhMTggW0RlY2VtYmVyIDcsIDIwMDZdCisgIEFkZGVkIHNjcmlwdHMvQ01ha2VMaXN0cy50eHQKKworVmVyc2lvbiAxLjQuMGJldGExOSBbTWF5IDE2LCAyMDA3XQorICBSZXZpc2VkIHNjcmlwdHMvQ01ha2VMaXN0cy50eHQKKyAgUmVidWlsdCBjb25maWd1cmUgYW5kIE1ha2VmaWxlLmluIHdpdGggbmV3ZXIgdG9vbHMuCisgIEFkZGVkIGNvbmRpdGlvbmFsICN1bmRlZiBqbXBidWYgaW4gcG5ndGVzdC5jIHRvIHVuZG8gI2RlZmluZSBpbiBBSVggaGVhZGVycy4KKyAgQWRkZWQgc2NyaXB0cy9tYWtlZmlsZS5ub21teAorCitWZXJzaW9uIDEuNC4wYmV0YTIwIFtKdWx5IDksIDIwMDhdCisgIE1vdmVkIHNldmVyYWwgUE5HX0hBVkVfKiBtYWNyb3MgZnJvbSBwbmdwcml2LmggdG8gcG5nLmggYmVjYXVzZSBhcHBsaWNhdGlvbnMKKyAgICBjYWxsaW5nIHNldF91bmtub3duX2NodW5rX2xvY2F0aW9uKCkgbmVlZCB0aGVtLgorICBNb3ZlZCBzZXZlcmFsIG1hY3JvIGRlZmluaXRpb25zIGZyb20gcG5ncHJpdi5oIHRvIHBuZ2NvbmYuaAorICBNZXJnZSB3aXRoIGNoYW5nZXMgdG8gdGhlIDEuMi5YIGJyYW5jaCwgYXMgb2YgMS4yLjMwYmV0YTA0LgorICBEZWxldGVkIGFsbCB1c2Ugb2YgdGhlIE1NWCBhc3NlbWJsZXIgY29kZSBhbmQgSW50ZWwtbGljZW5zZWQgb3B0aW1pemF0aW9ucy4KKyAgUmV2aXNlZCBtYWtlZmlsZS5taW5ndworCitWZXJzaW9uIDEuNC4wYmV0YTIxIFtKdWx5IDIxLCAyMDA4XQorICBNb3ZlZCBsb2NhbCBhcnJheSAiY2h1bmtkYXRhIiBmcm9tIHBuZ3J1dGlsLmMgdG8gdGhlIHBuZ19zdHJ1Y3QsIHNvCisgICAgaXQgd2lsbCBiZSBmcmVlZCBieSBwbmdfcmVhZF9kZXN0cm95KCkgaW4gY2FzZSBvZiBhIHJlYWQgZXJyb3IgKEt1cnQKKyAgICBDaHJpc3RlbnNlbikuCisKK1ZlcnNpb24gMS40LjBiZXRhMjIgW0p1bHkgMjEsIDIwMDhdCisgIENoYW5nZSAicHVycG9zZSIgYW5kICJidWZmZXIiIHRvIHBuZ19wdHItPmNodW5rZGF0YSB0byBhdm9pZCBtZW1vcnkgbGVha2luZy4KKworVmVyc2lvbiAxLjQuMGJldGEyMyBbSnVseSAyMiwgMjAwOF0KKyAgQ2hhbmdlICJjaHVua2RhdGEgPSBOVUxMIiB0byAicG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTCIgc2V2ZXJhbCBwbGFjZXMgaW4KKyAgICBwbmdfZGVjb21wcmVzc19jaHVuaygpLgorCitWZXJzaW9uIDEuNC4wYmV0YTI0IFtKdWx5IDI1LCAyMDA4XQorICBDaGFuZ2UgYWxsIHJlbWFpbmluZyAiY2h1bmtkYXRhIiB0byAicG5nX3B0ci0+Y2h1bmtkYXRhIiBpbgorICAgIHBuZ19kZWNvbXByZXNzX2NodW5rKCksIGFuZCByZW1vdmUgImNodW5rZGF0YSIgZnJvbSBwYXJhbWV0ZXIgbGlzdC4KKyAgUHV0IGEgY2FsbCB0byBwbmdfY2hlY2tfY2h1bmtfbmFtZSgpIGluIHBuZ19yZWFkX2NodW5rX2hlYWRlcigpLgorICBSZXZpc2VkIHBuZ19jaGVja19jaHVua19uYW1lKCkgdG8gcmVqZWN0IGEgbmFtZSB3aXRoIGEgbG93ZXJjYXNlIDNyZCBieXRlLgorICBSZW1vdmVkIHR3byBjYWxscyB0byBwbmdfY2hlY2tfY2h1bmtfbmFtZSgpIG9jY3VycmluZyBsYXRlciBpbiB0aGUgcHJvY2Vzcy4KKyAgRGVmaW5lIFBOR19OT19FUlJPUl9OVU1CRVJTIGJ5IGRlZmF1bHQgaW4gcG5nY29uZi5oCisKK1ZlcnNpb24gMS40LjBiZXRhMjUgW0p1bHkgMzAsIDIwMDhdCisgIEFkZGVkIGEgY2FsbCB0byBwbmdfY2hlY2tfY2h1bmtfbmFtZSgpIGluIHBuZ3ByZWFkLmMKKyAgUmV2ZXJ0ZWQgcG5nX2NoZWNrX2NodW5rX25hbWUoKSB0byBhY2NlcHQgYSBuYW1lIHdpdGggYSBsb3dlcmNhc2UgM3JkIGJ5dGUuCisgIEFkZGVkIHBuZ19wdXNoX2hhdmVfYnVmZmVyKCkgZnVuY3Rpb24gdG8gcG5ncHJlYWQuYworICBFbGltaW5hdGVkIFBOR19CSUdfRU5ESUFOX1NVUFBPUlRFRCBhbmQgYXNzb2NpYXRlZCBwbmdfZ2V0XyogbWFjcm9zLgorICBNYWRlIGlubGluZSBleHBhbnNpb24gb2YgcG5nX2dldF8qKCkgb3B0aW9uYWwgd2l0aCBQTkdfVVNFX1JFQURfTUFDUk9TLgorICBFbGltaW5hdGVkIGFsbCBQTkdfVVNFTEVTU19URVNUUyBhbmQgUE5HX0NPUlJFQ1RfUEFMRVRURV9TVVBQT1JURUQgY29kZS4KKyAgU3luY2VkIGNvbnRyaWIgZGlyZWN0b3J5IGFuZCBjb25maWd1cmUgZmlsZXMgd2l0aCBsaWJwbmctMS4yLjMwYmV0YTA2LgorICBFbGltaW5hdGVkIG5vLWxvbmdlci11c2VkIHBuZ2RlZnMuaCAoYnV0IGl0J3Mgc3RpbGwgYnVpbHQgaW4gdGhlIG1ha2VmaWxlcykKKyAgUmVsb2NhdGVkIGEgbWlzcGxhY2VkICIjZW5kaWYgLyogUE5HX05PX1dSSVRFX0ZJTFRFUiAqLyIgaW4gcG5nd3V0aWwuYworCitWZXJzaW9uIDEuNC4wYmV0YTI2IFtBdWd1c3QgNCwgMjAwOF0KKyAgUmVtb3ZlZCBwbmdfcHVzaF9oYXZlX2J1ZmZlcigpIGZ1bmN0aW9uIGluIHBuZ3ByZWFkLmMuICBJdCBpbmNyZWFzZWQgdGhlCisgICAgY29tcGlsZWQgbGlicmFyeSBzaXplIHNsaWdodGx5LgorICBDaGFuZ2VkICItV2FsbCIgdG8gIi1XIC1XYWxsIiBpbiB0aGUgQ0ZMQUdTIGluIGFsbCBtYWtlZmlsZXMgKENvc21pbiBUcnV0YSkKKyAgRGVjbGFyZWQgcG5nX3B0ciAidm9sYXRpbGUiIGluIHBuZ3JlYWQuYyBhbmQgcG5nd3JpdGUuYyB0byBhdm9pZCB3YXJuaW5ncy4KKyAgVXBkYXRlZCBjb250cmliL3Zpc3VwbmcvY2V4Y2VwdC5oIHRvIHZlcnNpb24gMi4wLjEKKyAgQWRkZWQgUE5HX0xJVEVSQUxfQ0hBUkFDVEVSIG1hY3JvcyBmb3IgIywgWywgYW5kIF0uCisKK1ZlcnNpb24gMS40LjBiZXRhMjcgW0F1Z3VzdCA1LCAyMDA4XQorICBSZXZpc2VkIHVzYWdlIG9mIFBOR19MSVRFUkFMX1NIQVJQIGluIHBuZ2Vycm9yLmMuCisgIE1vdmVkIG5ld2xpbmUgY2hhcmFjdGVyIGZyb20gaW5kaXZpZHVhbCBwbmdfZGVidWcgbWVzc2FnZXMgaW50byB0aGUKKyAgICBwbmdfZGVidWcgbWFjcm9zLgorICBBbGxvdyB1c2VyIHRvICNkZWZpbmUgdGhlaXIgb3duIHBuZ19kZWJ1ZywgcG5nX2RlYnVnMSwgYW5kIHBuZ19kZWJ1ZzIuCisKK1ZlcnNpb24gMS40LjBiZXRhMjggW0F1Z3VzdCA1LCAyMDA4XQorICBSZXZpc2VkIHVzYWdlIG9mIFBOR19MSVRFUkFMX1NIQVJQIGluIHBuZ2Vycm9yLmMuCisgIEFkZGVkIFBOR19TVFJJTkdfTkVXTElORSBtYWNybworCitWZXJzaW9uIDEuNC4wYmV0YTI5IFtBdWd1c3QgOSwgMjAwOF0KKyAgUmV2aXNlZCB1c2FnZSBvZiBQTkdfU1RSSU5HX05FV0xJTkUgdG8gd29yayBvbiBub24tSVNPIGNvbXBpbGVycy4KKyAgQWRkZWQgUE5HX1NUUklOR19DT1BZUklHSFQgbWFjcm8uCisgIEFkZGVkIG5vbi1JU08gdmVyc2lvbnMgb2YgcG5nX2RlYnVnIG1hY3Jvcy4KKworVmVyc2lvbiAxLjQuMGJldGEzMCBbQXVndXN0IDE0LCAyMDA4XQorICBBZGRlZCBwcmVtdWx0aXBsaWVkIGFscGhhIGZlYXR1cmUgKFZvbGtlciBXaWVuZGwpLgorCitWZXJzaW9uIDEuNC4wYmV0YTMxIFtBdWd1c3QgMTgsIDIwMDhdCisgIE1vdmVkIHBuZ19zZXRfcHJlbXVsdGlwbHlfYWxwaGEgZnJvbSBwbmd0cmFucy5jIHRvIHBuZ3J0cmFuLmMKKyAgUmVtb3ZlZCBleHRyYSBjcmMgY2hlY2sgYXQgdGhlIGVuZCBvZiBwbmdfaGFuZGxlX2NIUk0oKS4gIEJ1ZyBpbnRyb2R1Y2VkCisgICAgaW4gbGlicG5nLTEuNC4wYmV0YTIwLgorCitWZXJzaW9uIDEuNC4wYmV0YTMyIFtBdWd1c3QgMTksIDIwMDhdCisgIEFkZGVkIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQgYmxvY2sgYXJvdW5kIG5ldyBwbmdfZmx1c2goKSBjYWxsLgorICBSZXZpc2VkIFBOR19OT19TVERJTyB2ZXJzaW9uIG9mIHBuZ193cml0ZV9mbHVzaCgpCisKK1ZlcnNpb24gMS40LjBiZXRhMzMgW0F1Z3VzdCAyMCwgMjAwOF0KKyAgQWRkZWQgcG5nX2dldHxzZXRfY2h1bmtfY2FjaGVfbWF4KCkgdG8gbGltaXQgdGhlIHRvdGFsIG51bWJlciBvZiBzUExULAorICAgIHRleHQsIGFuZCB1bmtub3duIGNodW5rcyB0aGF0IGNhbiBiZSBzdG9yZWQuCisKK1ZlcnNpb24gMS40LjBiZXRhMzQgW1NlcHRlbWJlciA2LCAyMDA4XQorICBTaG9ydGVuZWQgdElNRV9zdHJpbmcgdG8gMjkgYnl0ZXMgaW4gcG5ndGVzdC5jCisgIEZpeGVkIG9mZi1ieS1vbmUgZXJyb3IgaW50cm9kdWNlZCBpbiBwbmdfcHVzaF9yZWFkX3pUWHQoKSBmdW5jdGlvbiBpbgorICAgIGxpYnBuZy0xLjIuMzBiZXRhMDQvcG5ncHJlYWQuYyAoSGFyYWxkIHZhbiBEaWprKQorCitWZXJzaW9uIDEuNC4wYmV0YTM1IFtPY3RvYmVyIDYsIDIwMDhdCisgIENoYW5nZWQgInRyYW5zX3ZhbHVlcyIgdG8gInRyYW5zX2NvbG9yIi4KKyAgQ2hhbmdlZCBzby1udW1iZXIgZnJvbSAwIHRvIDE0LiAgU29tZSBPUyBkbyBub3QgbGlrZSAwLgorICBSZXZpc2VkIG1ha2VmaWxlLmRhcndpbiB0byBmaXggc2hhcmVkIGxpYnJhcnkgbnVtYmVyaW5nLgorICBDaGFuZ2UgcG5nX3NldF9ncmF5XzFfMl80X3RvXzgoKSB0byBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgoKQorICAgIGluIGV4YW1wbGUuYyAoZGViaWFuIGJ1ZyByZXBvcnQpCisKK1ZlcnNpb24gMS40LjBiZXRhMzYgW09jdG9iZXIgMjUsIDIwMDhdCisgIFN5bmMgd2l0aCB0RVh0IHZ1bG5lcmFiaWxpdHkgZml4IGluIGxpYnBuZy0xLjIuMzNyYzAyLgorCitWZXJzaW9uIDEuNC4wYmV0YTM3IFtOb3ZlbWJlciAxMywgMjAwOF0KKyAgQWRkZWQgcG5nX2NoZWNrX2NIUk0gaW4gcG5nLmMgYW5kIG1vdmVkIGNoZWNraW5nIGZyb20gcG5nZ2V0LmMsIHBuZ3J1dGlsLmMsCisgICAgYW5kIHBuZ3dyaXRlLmMKKworVmVyc2lvbiAxLjQuMGJldGEzOCBbTm92ZW1iZXIgMjIsIDIwMDhdCisgIEFkZGVkIGNoZWNrIGZvciB6ZXJvLWFyZWEgUkdCIGNIUk0gdHJpYW5nbGUgaW4gcG5nX2NoZWNrX2NIUk0oKSBhbmQKKyAgICBwbmdfY2hlY2tfY0hSTV9maXhlZCgpLgorCitWZXJzaW9uIDEuNC4wYmV0YTM5IFtOb3ZlbWJlciAyMywgMjAwOF0KKyAgUmV2aXNlZCBwbmdfd2FybmluZygpIHRvIHdyaXRlIGl0cyBtZXNzYWdlIG9uIHN0YW5kYXJkIG91dHB1dCBieSBkZWZhdWx0CisgICAgd2hlbiB3YXJuaW5nX2ZuIGlzIE5VTEwuCisKK1ZlcnNpb24gMS40LjBiZXRhNDAgW05vdmVtYmVyIDI0LCAyMDA4XQorICBFbGltaW5hdGVkIHBuZ19jaGVja19jSFJNKCkuICBJbnN0ZWFkLCBhbHdheXMgdXNlIHBuZ19jaGVja19jSFJNX2ZpeGVkKCkuCisgIEluIHBuZ19jaGVja19jSFJNX2ZpeGVkKCksIGVuc3VyZSB3aGl0ZV95IGlzID4gMCwgYW5kIHJlbW92ZWQgcmVkdW5kYW50CisgICAgY2hlY2sgZm9yIGFsbC16ZXJvIGNvb3JkaW5hdGVzIHRoYXQgaXMgZGV0ZWN0ZWQgYnkgdGhlIHRyaWFuZ2xlIGNoZWNrLgorCitWZXJzaW9uIDEuNC4wYmV0YTQxIFtOb3ZlbWJlciAyNiwgMjAwOF0KKyAgRml4ZWQgc3RyaW5nIHZzIHBvaW50ZXItdG8tc3RyaW5nIGVycm9yIGluIHBuZ19jaGVja19rZXl3b3JkKCkuCisgIFJlYXJyYW5nZWQgdGVzdCBleHByZXNzaW9ucyBpbiBwbmdfY2hlY2tfY0hSTV9maXhlZCgpIHRvIGF2b2lkIGludGVybmFsCisgICAgb3ZlcmZsb3dzLgorICBBZGRlZCBQTkdfTk9fQ0hFQ0tfY0hSTSBjb25kaXRpb25hbC4KKworVmVyc2lvbiAxLjQuMGJldGE0MiwgNDMgW0RlY2VtYmVyIDEsIDIwMDhdCisgIE1lcmdlIHBuZ19kZWJ1ZyB3aXRoIHZlcnNpb24gMS4yLjM0YmV0YTA0LgorCitWZXJzaW9uIDEuNC4wYmV0YTQ0IFtEZWNlbWJlciA2LCAyMDA4XQorICBSZW1vdmVkIHJlZHVuZGFudCBjaGVjayBmb3Iga2V5PT1OVUxMIGJlZm9yZSBjYWxsaW5nIHBuZ19jaGVja19rZXl3b3JkKCkKKyAgICB0byBlbnN1cmUgdGhhdCBuZXdfa2V5IGdldHMgaW5pdGlhbGl6ZWQgYW5kIHJlbW92ZWQgZXh0cmEgd2FybmluZworICAgIChNZXJnZSB3aXRoIHZlcnNpb24gMS4yLjM0YmV0YTA1IC0tIEFydmFuIFByaXRjaGFyZCkuCisKK1ZlcnNpb24gMS40LjBiZXRhNDUgW0RlY2VtYmVyIDksIDIwMDhdCisgIEluIHBuZ193cml0ZV9wbmcoKSwgcmVzcGVjdCB0aGUgcGxhY2VtZW50IG9mIHRoZSBmaWxsZXIgYnl0ZXMgaW4gYW4gZWFybGllcgorICAgIGNhbGwgdG8gcG5nX3NldF9maWxsZXIoKSAoSmltIEJhcnJ5KS4KKworVmVyc2lvbiAxLjQuMGJldGE0NiBbRGVjZW1iZXIgMTAsIDIwMDhdCisgIFVuZGlkIHByZXZpb3VzIGNoYW5nZSBhbmQgYWRkZWQgUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVJfQkVGT1JFIGFuZAorICAgIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSX0FGVEVSIGNvbmRpdGlvbmFscyBhbmQgZGVwcmVjYXRlZAorICAgIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSIChKaW0gQmFycnkpLgorCitWZXJzaW9uIDEuNC4wYmV0YTQ3IFtEZWNlbWJlciAxNSwgMjAwOF0KKyAgU3VwcG9ydCBmb3IgZGl0aGVyaW5nIHdhcyBkaXNhYmxlZCBieSBkZWZhdWx0LCBiZWNhdXNlIGl0IGhhcyBuZXZlcgorICAgIGJlZW4gd2VsbCB0ZXN0ZWQgYW5kIGRvZXNuJ3Qgd29yayB2ZXJ5IHdlbGwuICBUaGUgY29kZSBoYXMgbm90CisgICAgYmVlbiByZW1vdmVkLCBob3dldmVyLCBhbmQgY2FuIGJlIGVuYWJsZWQgYnkgYnVpbGRpbmcgbGlicG5nIHdpdGgKKyAgICBQTkdfUkVBRF9ESVRIRVJfU1VQUE9SVEVEIGRlZmluZWQuCisKK1ZlcnNpb24gMS40LjBiZXRhNDggW0ZlYnJ1YXJ5IDE0LCAyMDA5XQorICBBZGRlZCBuZXcgZXhwb3J0ZWQgZnVuY3Rpb24gcG5nX2NhbGxvYygpLgorICBDb21iaW5lZCBzZXZlcmFsIGluc3RhbmNlcyBvZiBwbmdfbWFsbG9jKCk7IHBuZ19tZW1zZXQoKSBpbnRvIHBuZ19jYWxsb2MoKS4KKyAgUmVtb3ZlZCBwcm90b3R5cGUgZm9yIHBuZ19mcmVlcHRyKCkgdGhhdCB3YXMgYWRkZWQgaW4gbGlicG5nLTEuNC4wYmV0YTI0CisgICAgYnV0IHdhcyBuZXZlciBkZWZpbmVkLgorCitWZXJzaW9uIDEuNC4wYmV0YTQ5IFtGZWJydWFyeSAyOCwgMjAwOV0KKyAgQWRkZWQgcG5nX2ZpbGVubygpIG1hY3JvIHRvIHBuZ2NvbmYuaCwgdXNlZCBpbiBwbmd3aW8uYworICBDb3JyZWN0ZWQgb3JkZXIgb2YgI2lmZGVmJ3MgaW4gcG5nX2RlYnVnIGRlZmluaXRpb24gaW4gcG5nLmgKKyAgRml4ZWQgYnVnIGludHJvZHVjZWQgaW4gbGlicG5nLTEuNC4wYmV0YTQ4IHdpdGggdGhlIG1lbXNldCBhcmd1bWVudHMKKyAgICBmb3IgcGNhbF9wYXJhbXMuCisgIEZpeGVkIG9yZGVyIG9mICNpZmRlZiBkaXJlY3RpdmVzIGluIHRoZSBwbmdfZGVidWcgZGVmaW5lcyBpbiBwbmcuaAorICAgIChidWcgaW50cm9kdWNlZCBpbiBsaWJwbmctMS4yLjM0LzEuNC4wYmV0YTI5KS4KKyAgUmV2aXNlZCBjb21tZW50cyBpbiBwbmdfc2V0X3JlYWRfZm4oKSBhbmQgcG5nX3NldF93cml0ZV9mbigpLgorCitWZXJzaW9uIDEuNC4wYmV0YTUwIFtNYXJjaCAxOCwgMjAwOV0KKyAgVXNlIHBuZ19jYWxsb2MoKSBpbnN0ZWFkIG9mIHBuZ19tYWxsb2MoKSB0byBhbGxvY2F0ZSBiaWdfcm93X2J1ZiB3aGVuCisgICAgcmVhZGluZyBhbiBpbnRlcmxhY2VkIGZpbGUsIHRvIGF2b2lkIGEgcG9zc2libGUgVU1SLgorICBVbmRpZCByZXZpc2lvbiBvZiBQTkdfTk9fU1RESU8gdmVyc2lvbiBvZiBwbmdfd3JpdGVfZmx1c2goKS4gIFVzZXJzCisgICAgaGF2aW5nIHRyb3VibGUgd2l0aCBmZmx1c2goKSBjYW4gYnVpbGQgd2l0aCBQTkdfTk9fV1JJVEVfRkxVU0ggZGVmaW5lZAorICAgIG9yIHN1cHBseSB0aGVpciBvd24gZmx1c2hfZm4oKSByZXBsYWNlbWVudC4KKyAgUmV2aXNlZCBsaWJwbmcqLnR4dCBhbmQgcG5nLmggZG9jdW1lbnRhdGlvbiBhYm91dCB1c2Ugb2YgcG5nX3dyaXRlX2ZsdXNoKCkKKyAgICBhbmQgcG5nX3NldF93cml0ZV9mbigpLgorICBSZW1vdmVkIGZmbHVzaCgpIGZyb20gcG5ndGVzdC5jLgorICBBZGRlZCAiI2RlZmluZSBQTkdfTk9fV1JJVEVfRkxVU0giIHRvIGNvbnRyaWIvcG5nbWluaW0vZW5jb2Rlci9wbmd1c3IuaAorCitWZXJzaW9uIDEuNC4wYmV0YTUxIFtNYXJjaCAyMSwgMjAwOV0KKyAgUmVtb3ZlZCBuZXcgcG5nX2ZpbGVubygpIG1hY3JvIGZyb20gcG5nY29uZi5oIC4KKworVmVyc2lvbiAxLjQuMGJldGE1MiBbTWFyY2ggMjcsIDIwMDldCisgIFJlbG9jYXRlZCBwbmdfZG9fY2hvcCgpIGFoZWFkIG9mIGJ1aWxkaW5nIGdhbW1hIHRhYmxlcyBpbiBwbmdydHJhbi5jCisgICAgVGhpcyBhdm9pZHMgYnVpbGRpbmcgMTYtYml0IGdhbW1hIHRhYmxlcyB1bm5lY2Vzc2FyaWx5LgorICBSZW1vdmVkIGZmbHVzaCgpIGZyb20gcG5ndGVzdC5jLgorICBBZGRlZCAiI2RlZmluZSBQTkdfTk9fV1JJVEVfRkxVU0giIHRvIGNvbnRyaWIvcG5nbWluaW0vZW5jb2Rlci9wbmd1c3IuaAorICBBZGRlZCBhIHNlY3Rpb24gb24gZGlmZmVyZW5jZXMgYmV0d2VlbiAxLjAueCBhbmQgMS4yLnggdG8gbGlicG5nLjMvbGlicG5nLnR4dAorCitWZXJzaW9uIDEuNC4wYmV0YTUzIFtBcHJpbCAxLCAyMDA5XQorICBSZW1vdmVkIHNvbWUgcmVtYWluaW5nIE1NWCBtYWNyb3MgZnJvbSBwbmdwcml2LmgKKyAgRml4ZWQgcG90ZW50aWFsIG1lbW9yeSBsZWFrIG9mICJuZXdfbmFtZSIgaW4gcG5nX3dyaXRlX2lDQ1AoKSAoUmFscGggR2lsZXMpCisKK1ZlcnNpb24gMS40LjBiZXRhNTQgW0FwcmlsIDEzLCAyMDA5XQorICBBZGRlZCAiaWZuZGVmIFBOR19TS0lQX1NFVEpNUF9DSEVDSyIgYmxvY2sgaW4gcG5nY29uZi5oIHRvIGFsbG93CisgICAgYXBwbGljYXRpb24gY29kZSB3cml0ZXJzIHRvIGJ5cGFzcyB0aGUgY2hlY2sgZm9yIG11bHRpcGxlIGluY2x1c2lvbgorICAgIG9mIHNldGptcC5oIHdoZW4gdGhleSBrbm93IHRoYXQgaXQgaXMgc2FmZSB0byBpZ25vcmUgdGhlIHNpdHVhdGlvbi4KKyAgRWxpbWluYXRlZCBpbnRlcm5hbCB1c2Ugb2Ygc2V0am1wKCkgaW4gcG5ncmVhZC5jIGFuZCBwbmd3cml0ZS5jCisgIFJlb3JkZXJlZCBhbmNpbGxhcnkgY2h1bmtzIGluIHBuZ3Rlc3QucG5nIHRvIGJlIHRoZSBzYW1lIGFzIHdoYXQKKyAgICBwbmd0ZXN0IG5vdyBwcm9kdWNlcywgYW5kIG1hZGUgc29tZSBjb3NtZXRpYyBjaGFuZ2VzIHRvIHBuZ3Rlc3Qgb3V0cHV0LgorICBFbGltaW5hdGVkIGRlcHJlY2F0ZWQgcG5nX3JlYWRfaW5pdF8zKCkgYW5kIHBuZ193cml0ZV9pbml0XzMoKSBmdW5jdGlvbnMuCisKK1ZlcnNpb24gMS40LjBiZXRhNTUgW0FwcmlsIDE1LCAyMDA5XQorICBTaW1wbGlmaWVkIGVycm9yIGhhbmRsaW5nIGluIHBuZ3JlYWQuYyBhbmQgcG5nd3JpdGUuYyBieSBwdXR0aW5nCisgICAgdGhlIG5ldyBwbmdfcmVhZF9jbGVhbnVwKCkgYW5kIHBuZ193cml0ZV9jbGVhbnVwKCkgZnVuY3Rpb25zIGlubGluZS4KKworVmVyc2lvbiAxLjQuMGJldGE1NiBbQXByaWwgMjUsIDIwMDldCisgIFJlbmFtZWQgInVzZXJfY2h1bmtfZGF0YSIgdG8gIm15X3VzZXJfY2h1bmtfZGF0YSIgaW4gcG5ndGVzdC5jIHRvIHN1cHByZXNzCisgICAgInNoYWRvd2VkIGRlY2xhcmF0aW9uIiB3YXJuaW5nIGZyb20gZ2NjLTQuMy4zLgorICBSZW5hbWVkICJnYW1tYSIgdG8gInBuZ19nYW1tYSIgaW4gcG5nc2V0LmMgdG8gYXZvaWQgInNoYWRvd2VkIGRlY2xhcmF0aW9uIgorICAgIHdhcm5pbmcgYWJvdXQgYSBnbG9iYWwgImdhbW1hIiB2YXJpYWJsZSBpbiBtYXRoLmggb24gc29tZSBwbGF0Zm9ybXMuCisKK1ZlcnNpb24gMS40LjBiZXRhNTcgW01heSAyLCAyMDA5XQorICBSZW1vdmVkIHByb3RvdHlwZSBmb3IgcG5nX2ZyZWVwdHIoKSB0aGF0IHdhcyBhZGRlZCBpbiBsaWJwbmctMS40LjBiZXRhMjQKKyAgICBidXQgd2FzIG5ldmVyIGRlZmluZWQgKGFnYWluKS4KKyAgUmVidWlsdCBjb25maWd1cmUgc2NyaXB0cyB3aXRoIGF1dG9jb25mLTIuNjMgaW5zdGVhZCBvZiAyLjYyCisgIFJlbW92ZWQgcG5ncHJlZnMuaCBhbmQgTU1YIGZyb20gbWFrZWZpbGVzCisKK1ZlcnNpb24gMS40LjBiZXRhNTggW01heSAxNCwgMjAwOV0KKyAgQ2hhbmdlZCBwbmd3MzIuZGVmIHRvIHBuZ3dpbi5kZWYgaW4gbWFrZWZpbGUubWluZ3cgKHR5cG8gd2FzIGludHJvZHVjZWQKKyAgICBpbiBiZXRhNTcpLgorICBDbGFyaWZpZWQgdXNhZ2Ugb2Ygc2lnX2JpdCB2ZXJzdXMgc2lnX2JpdF9wIGluIGV4YW1wbGUuYyAoVmluY2VudCBUb3JyaSkKKworVmVyc2lvbiAxLjQuMGJldGE1OSBbTWF5IDE1LCAyMDA5XQorICBSZWZvcm1hdGVkIHNvdXJjZXMgaW4gbGlicG5nIHN0eWxlICgzLXNwYWNlIGludGVudGF0aW9uLCBjb21tZW50IGZvcm1hdCkKKyAgRml4ZWQgdHlwbyBpbiBsaWJwbmcgZG9jcyAoUE5HX0ZJTFRFUl9BVkUgc2hvdWxkIGJlIFBOR19GSUxURVJfQVZHKQorICBBZGRlZCBzZWN0aW9ucyBhYm91dCB0aGUgZ2l0IHJlcG9zaXRvcnkgYW5kIG91ciBjb2Rpbmcgc3R5bGUgdG8gdGhlCisgICAgZG9jdW1lbnRhdGlvbgorICBSZWxvY2F0ZWQgbWlzcGxhY2VkICNlbmRpZiBpbiBwbmd3cml0ZS5jLCBzQ0FMIGNodW5rIGhhbmRsZXIuCisKK1ZlcnNpb24gMS40LjBiZXRhNjAgW01heSAxOSwgMjAwOV0KKyAgQ29uZGl0aW9uYWxseSBjb21waWxlIHBuZ19yZWFkX2ZpbmlzaF9yb3coKSB3aGljaCBpcyBub3QgdXNlZCBieQorICAgIHByb2dyZXNzaXZlIHJlYWRlcnMuCisgIEFkZGVkIGNvbnRyaWIvcG5nbWluaW0vcHJlYWRlciB0byBkZW1vbnN0cmF0ZSBidWlsZGluZyBtaW5pbWFsIHByb2dyZXNzaXZlCisgICAgZGVjb2RlciwgYmFzZWQgb24gY29udHJpYi9ncmVnYm9vayB3aXRoIGVtYmVkZGVkIGxpYnBuZyBhbmQgemxpYi4KKworVmVyc2lvbiAxLjQuMGJldGE2MSBbTWF5IDIwLCAyMDA5XQorICBJbiBjb250cmliL3BuZ21pbmltLyosIHJlbmFtZWQgIm1ha2VmaWxlLnN0ZCIgdG8gIm1ha2VmaWxlIiwgc2luY2UgdGhlcmUKKyAgICBpcyBvbmx5IG9uZSBtYWtlZmlsZSBpbiB0aG9zZSBkaXJlY3RvcmllcywgYW5kIHJldmlzZWQgdGhlIFJFQURNRSBmaWxlcworICAgIGFjY29yZGluZ2x5LgorICBNb3JlIHJlZm9ybWF0dGluZyBvZiBjb21tZW50cywgbW9zdGx5IHRvIGNhcGl0YWxpemUgc2VudGVuY2VzLgorCitWZXJzaW9uIDEuNC4wYmV0YTYyIFtKdW5lIDIsIDIwMDldCisgIEFkZGVkICIjZGVmaW5lIFBOR19OT19XUklURV9TV0FQIiB0byBjb250cmliL3BuZ21pbmltL2VuY29kZXIvcG5ndXNyLmgKKyAgICBhbmQgImRlZmluZSBQTkdfTk9fUkVBRF9TV0FQIiB0byBkZWNvZGVyL3BuZ3Vzci5oIGFuZCBwcmVhZGVyL3BuZ3Vzci5oCisgIFJlZm9ybWF0dGVkIHNldmVyYWwgcmVtYWluaW5nICJlbHNlIHN0YXRlbWVudCIgaW50byB0d28gbGluZXMuCisgIEFkZGVkIGEgc2VjdGlvbiB0byB0aGUgbGlicG5nIGRvY3VtZW50YXRpb24gYWJvdXQgdXNpbmcgcG5nX2dldF9pb19wdHIoKQorICAgIGluIGNvbmZpZ3VyZSBzY3JpcHRzIHRvIGRldGVjdCB0aGUgcHJlc2VuY2Ugb2YgbGlicG5nLgorCitWZXJzaW9uIDEuNC4wYmV0YTYzIFtKdW5lIDE1LCAyMDA5XQorICBSZXZpc2VkIGxpYnBuZyoudHh0IGFuZCBsaWJwbmcuMyB0byBtZW50aW9uIGNhbGxpbmcgcG5nX3NldF9JSERSKCkKKyAgICBtdWx0aXBsZSB0aW1lcyBhbmQgdG8gc3BlY2lmeSB0aGUgc2FtcGxlIG9yZGVyIGluIHRoZSB0Uk5TIGNodW5rLAorICAgIGJlY2F1c2UgdGhlIElTTyBQTkcgc3BlY2lmaWNhdGlvbiBoYXMgYSB0eXBvIGluIHRoZSB0Uk5TIHRhYmxlLgorICBDaGFuZ2VkIHNldmVyYWwgUE5HX1VOS05PV05fQ0hVTktfU1VQUE9SVEVEIHRvCisgICAgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRCwgdG8gbWFrZSB0aGUgcG5nX3NldF9rZWVwIG1lY2hhbmlzbQorICAgIGF2YWlsYWJsZSBmb3IgaWdub3Jpbmcga25vd24gY2h1bmtzIGV2ZW4gd2hlbiBub3Qgc2F2aW5nIHVua25vd24gY2h1bmtzLgorICBBZG9wdGVkIHByZWZlcmVuY2UgZm9yIGNvbnNpc3RlbnQgdXNlIG9mICIjaWZkZWYiIGFuZCAiI2lmbmRlZiIgdmVyc3VzCisgICAgIiNpZiBkZWZpbmVkKCkiIGFuZCAiaWYgIWRlZmluZWQoKSIgd2hlcmUgcG9zc2libGUuCisKK1ZlcnNpb24gMS40LjBiZXRhNjQgW0p1bmUgMjQsIDIwMDldCisgIEVsaW1pbmF0ZWQgUE5HX0xFR0FDWV9TVVBQT1JURUQgY29kZS4KKyAgTW92ZWQgdGhlIHZhcmlvdXMgdW5rbm93biBjaHVuayBtYWNybyBkZWZpbml0aW9ucyBvdXRzaWRlIG9mIHRoZQorICAgIFBOR19SRUFEfFdSSVRFX0FOQ0lMTEFSWV9DSFVOS19TVVBQT1JURUQgYmxvY2tzLgorCitWZXJzaW9uIDEuNC4wYmV0YTY1IFtKdW5lIDI2LCAyMDA5XQorICBBZGRlZCBhIHJlZmVyZW5jZSB0byB0aGUgbGlicG5nIGxpY2Vuc2UgaW4gZWFjaCBmaWxlLgorCitWZXJzaW9uIDEuNC4wYmV0YTY2IFtKdW5lIDI3LCAyMDA5XQorICBSZWZlciB0byB0aGUgbGlicG5nIGxpY2Vuc2UgaW5zdGVhZCBvZiB0aGUgbGlicG5nIGxpY2Vuc2UgaW4gZWFjaCBmaWxlLgorCitWZXJzaW9uIDEuNC4wYmV0YTY3IFtKdWx5IDYsIDIwMDldCisgIFJlbG9jYXRlZCBJTlZFUlRfQUxQSEEgd2l0aGluIHBuZ19yZWFkX3BuZygpIGFuZCBwbmdfd3JpdGVfcG5nKCkuCisgIEFkZGVkIGhpZ2gtbGV2ZWwgQVBJIHRyYW5zZm9ybSBQTkdfVFJBTlNGT1JNX0dSQVlfVE9fUkdCLgorICBBZGRlZCBhbiAieGNvZGUiIHByb2plY3QgdG8gdGhlIHByb2plY3RzIGRpcmVjdG9yeSAoQWxhbSBBcmlhcykuCisKK1ZlcnNpb24gMS40LjBiZXRhNjggW0p1bHkgMTksIDIwMDldCisgIEF2b2lkIHNvbWUgdGVzdHMgaW4gZmlsdGVyIHNlbGVjdGlvbiBpbiBwbmd3dXRpbC5jCisKK1ZlcnNpb24gMS40LjBiZXRhNjkgW0p1bHkgMjUsIDIwMDldCisgIFNpbXBsaWZpZWQgdGhlIG5ldyBmaWx0ZXItc2VsZWN0aW9uIHRlc3QuICBUaGlzIHJ1bnMgZmFzdGVyIGluIHRoZQorICAgIGNvbW1vbiAiUE5HX0FMTF9GSUxURVJTIiBhbmQgUE5HX0ZJTFRFUl9OT05FIGNhc2VzLgorICBSZW1vdmVkIGV4dHJhbmVvdXMgZGVjbGFyYXRpb24gZnJvbSB0aGUgbmV3IGNhbGwgdG8gcG5nX3JlYWRfZ3JheV90b19yZ2IoKQorICAgIChidWcgaW50cm9kdWNlZCBpbiBsaWJwbmctMS40LjBiZXRhNjcpLgorICBGaXhlZCB1cCB4Y29kZSBwcm9qZWN0IChBbGFtIEFyaWFzKQorICBBZGRlZCBhIHByb3RvdHlwZSBmb3IgcG5nXzY0Yml0X3Byb2R1Y3QoKSBpbiBwbmcuYworCitWZXJzaW9uIDEuNC4wYmV0YTcwIFtKdWx5IDI3LCAyMDA5XQorICBBdm9pZCBhIHBvc3NpYmxlIE5VTEwgZGVyZWZlcmVuY2UgaW4gZGVidWcgYnVpbGQsIGluIHBuZ19zZXRfdGV4dF8yKCkuCisgICAgKGJ1ZyBpbnRyb2R1Y2VkIGluIGxpYnBuZy0wLjk1LCBkaXNjb3ZlcmVkIGJ5IEV2YW4gUm91YXVsdCkKKworVmVyc2lvbiAxLjQuMGJldGE3MSBbSnVseSAyOSwgMjAwOV0KKyAgUmVidWlsdCBjb25maWd1cmUgc2NyaXB0cyB3aXRoIGF1dG9jb25mLTIuNjQuCisKK1ZlcnNpb24gMS40LjBiZXRhNzIgW0F1Z3VzdCAxLCAyMDA5XQorICBSZXBsYWNlZCAqLnRhci5sem1hIHdpdGggKi50YXIueHogaW4gZGlzdHJpYnV0aW9uLiAgR2V0IHRoZSB4eiBjb2RlYworICAgIGZyb20gPGh0dHA6Ly90dWthYW5pLm9yZy94ej4uCisKK1ZlcnNpb24gMS40LjBiZXRhNzMgW0F1Z3VzdCAxLCAyMDA5XQorICBSZWplY3QgYXR0ZW1wdCB0byB3cml0ZSBpQ0NQIGNodW5rIHdpdGggbmVnYXRpdmUgZW1iZWRkZWQgcHJvZmlsZSBsZW5ndGgKKyAgICAoSkQgQ2hlbikgKENWRS0yMDA5LTUwNjMpLgorCitWZXJzaW9uIDEuNC4wYmV0YTc0IFtBdWd1c3QgOCwgMjAwOV0KKyAgQ2hhbmdlZCBwbmdfcHRyIGFuZCBpbmZvX3B0ciBtZW1iZXIgInRyYW5zIiB0byAidHJhbnNfYWxwaGEiLgorCitWZXJzaW9uIDEuNC4wYmV0YTc1IFtBdWd1c3QgMjEsIDIwMDldCisgIFJlbW92ZWQgYW4gZXh0cmEgcG5nX2RlYnVnKCkgcmVjZW50bHkgYWRkZWQgdG8gcG5nX3dyaXRlX2ZpbmRfZmlsdGVyKCkuCisgIEZpeGVkIGluY29ycmVjdCAjaWZkZWYgaW4gcG5nc2V0LmMgcmVnYXJkaW5nIHVua25vd24gY2h1bmsgc3VwcG9ydC4KKworVmVyc2lvbiAxLjQuMGJldGE3NiBbQXVndXN0IDIyLCAyMDA5XQorICBNb3ZlZCBhbiBpbmNvcnJlY3RseSBsb2NhdGVkIHRlc3QgaW4gcG5nX3JlYWRfcm93KCkgaW4gcG5ncmVhZC5jCisKK1ZlcnNpb24gMS40LjBiZXRhNzcgW0F1Z3VzdCAyNywgMjAwOV0KKyAgUmVtb3ZlZCBscFhZWi50YXIuYnoyICh3aXRoIENSTEYpLCBLTk9XTkJVRywgbGlicG5nLXgueS56LUtOT1dOQlVHLnR4dCwKKyAgICBhbmQgdGhlICJub2NvbmZpZyIgZmlsZXMgZnJvbSB0aGUgZGlzdHJpYnV0aW9uLgorICBNb3ZlZCBDTWFrZUxpc3RzLnR4dCBmcm9tIHNjcmlwdHMgaW50byB0aGUgbWFpbiBsaWJwbmcgZGlyZWN0b3J5LgorICBWYXJpb3VzIGJ1Z2ZpeGVzIGFuZCBpbXByb3ZlbWVudHMgdG8gQ01ha2VMaXN0cy50eHQgKFBoaWxpcCBMb3dtYW4pCisKK1ZlcnNpb24gMS40LjBiZXRhNzggW0F1Z3VzdCAzMSwgMjAwOV0KKyAgQ29udmVydGVkIGFsbCBQTkdfTk9fKiB0ZXN0cyB0byBQTkdfKl9TVVBQT1JURUQgZXZlcnl3aGVyZSBleGNlcHQgcG5nY29uZi5oCisgIEVsaW1pbmF0ZWQgUE5HX05PX0ZSRUVfTUUgYW5kIFBOR19GUkVFX01FX1NVUFBPUlRFRCBtYWNyb3MuCisgIFVzZSBwbmdfbWFsbG9jIHBsdXMgYSBsb29wIGluc3RlYWQgb2YgcG5nX2NhbGxvYygpIHRvIGluaXRpYWxpemUKKyAgICByb3dfcG9pbnRlcnMgaW4gcG5nX3JlYWRfcG5nKCkuCisKK1ZlcnNpb24gMS40LjBiZXRhNzkgW1NlcHRlbWJlciAxLCAyMDA5XQorICBFbGltaW5hdGVkIFBOR19HTE9CQUxfQVJSQVlTIGFuZCBQTkdfTE9DQUxfQVJSQVlTOyBhbHdheXMgdXNlIGxvY2FsIGFycmF5cy4KKyAgRWxpbWluYXRlZCBQTkdfQ0FMTE9DX1NVUFBPUlRFRCBtYWNybyBhbmQgYWx3YXlzIHByb3ZpZGUgcG5nX2NhbGxvYygpLgorCitWZXJzaW9uIDEuNC4wYmV0YTgwIFtTZXB0ZW1iZXIgMTcsIDIwMDldCisgIFJlbW92ZWQgc2NyaXB0cy9saWJwbmcuaWNjCisgIENoYW5nZWQgdHlwZWNhc3Qgb2YgZmlsbGVyIGZyb20gcG5nX2J5dGUgdG8gcG5nX3VpbnRfMTYgaW4gcG5nX3NldF9maWxsZXIoKS4KKyAgICAoRGVubmlzIEd1c3RhZnNzb24pCisgIEZpeGVkIHR5cG8gaW50cm9kdWNlZCBpbiBiZXRhNzggaW4gcG5ndGVzdC5jICgiI2lmIGRlZiAiIHNob3VsZCBiZSAiI2lmZGVmICIpCisKK1ZlcnNpb24gMS40LjBiZXRhODEgW1NlcHRlbWJlciAyMywgMjAwOV0KKyAgRWxpbWluYXRlZCB1bnVzZWQgUE5HX0ZMQUdfRlJFRV8qIGRlZmluZXMgZnJvbSBwbmdwcml2LmgKKyAgRXhwYW5kZWQgVEFCIGNoYXJhY3RlcnMgaW4gcG5ncnRyYW4uYworICBSZW1vdmVkIFBOR19DT05TVCBmcm9tIGFsbCAiUE5HX0NPTlNUIFBOR19DSE5LIiBkZWNsYXJhdGlvbnMgdG8gYXZvaWQKKyAgICBjb21waWxlciBjb21wbGFpbnRzIGFib3V0IGRvdWJseSBkZWNsYXJpbmcgdGhpbmdzICJjb25zdCIuCisgIENoYW5nZWQgYWxsICIjaWYgWyFdZGVmaW5lZChYKSIgdG8gImlmW25dZGVmIFgiIHdoZXJlIHBvc3NpYmxlLgorICBFbGltaW5hdGVkIHVudXNlZCBwbmdfcHRyLT5yb3dfYnVmX3NpemUKKworVmVyc2lvbiAxLjQuMGJldGE4MiBbU2VwdGVtYmVyIDI1LCAyMDA5XQorICBNb3ZlZCByZWR1bmRhbnQgSUhEUiBjaGVja2luZyBpbnRvIG5ldyBwbmdfY2hlY2tfSUhEUigpIGluIHBuZy5jCisgICAgYW5kIHJlcG9ydCBhbGwgZXJyb3JzIGZvdW5kIGluIHRoZSBJSERSIGRhdGEuCisgIEVsaW1pbmF0ZWQgdXNlbGVzcyBjYWxsIHRvIHBuZ19jaGVja19jSFJNKCkgZnJvbSBwbmdzZXQuYworCitWZXJzaW9uIDEuNC4wYmV0YTgzIFtTZXB0ZW1iZXIgMjUsIDIwMDldCisgIFJldmlzZWQgcG5nX2NoZWNrX0lIRFIoKSB0byBlbGltaW5hdGUgYm9ndXMgY29tcGxhaW50IGFib3V0IGZpbHRlcl90eXBlLgorCitWZXJzaW9uIDEuNC4wYmV0YTg0IFtTZXB0ZW1iZXIgMzAsIDIwMDldCisgIEZpeGVkIHNvbWUgaW5jb25zaXN0ZW50IGluZGVudGF0aW9uIGluIHBuZ2NvbmYuaAorICBSZXZpc2VkIHBuZ19jaGVja19JSERSKCkgdG8gYWRkIGEgdGVzdCBmb3Igd2lkdGggdmFyaWFibGUgbGVzcyB0aGFuIDMyLWJpdC4KKworVmVyc2lvbiAxLjQuMGJldGE4NSBbT2N0b2JlciAxLCAyMDA5XQorICBSZXZpc2VkIHBuZ19jaGVja19JSERSKCkgYWdhaW4sIHRvIGNoZWNrIGluZm9fcHRyIG1lbWJlcnMgaW5zdGVhZCBvZgorICAgIHRoZSBjb250ZW50cyBvZiB0aGUgcmV0dXJuZWQgcGFyYW1ldGVycy4KKworVmVyc2lvbiAxLjQuMGJldGE4NiBbT2N0b2JlciA5LCAyMDA5XQorICBVcGRhdGVkIHRoZSAieGNvZGUiIHByb2plY3QgKEFsYW0gQXJpYXMpLgorICBFbGltaW5hdGVkIGEgc2hhZG93ZWQgZGVjbGFyYXRpb24gb2YgInBwIiBpbiBwbmdfaGFuZGxlX3NQTFQoKS4KKworVmVyc2lvbiAxLjQuMHJjMDEgW09jdG9iZXIgMTksIDIwMDldCisgIFRyaXZpYWwgY29zbWV0aWMgY2hhbmdlcy4KKworVmVyc2lvbiAxLjQuMGJldGE4NyBbT2N0b2JlciAzMCwgMjAwOV0KKyAgTW92ZWQgdmVyc2lvbiAxLjQuMCBiYWNrIGludG8gYmV0YS4KKworVmVyc2lvbiAxLjQuMGJldGE4OCBbT2N0b2JlciAzMCwgMjAwOV0KKyAgUmV2aXNlZCBsaWJwbmcqLnR4dCBzZWN0aW9uIGFib3V0IGRpZmZlcmVuY2VzIGJldHdlZW4gMS4yLnggYW5kIDEuNC4wCisgICAgYmVjYXVzZSBtb3N0IG9mIHRoZSBuZXcgZmVhdHVyZXMgaGF2ZSBub3cgYmVlbiBwb3J0ZWQgYmFjayB0byAxLjIuNDEKKworVmVyc2lvbiAxLjQuMGJldGE4OSBbTm92ZW1iZXIgMSwgMjAwOV0KKyAgTW9yZSBidWdmaXhlcyBhbmQgaW1wcm92ZW1lbnRzIHRvIENNYWtlTGlzdHMudHh0IChQaGlsaXAgTG93bWFuKQorICBSZW1vdmVkIGEgaGFybWxlc3MgZXh0cmEgcG5nX3NldF9pbnZlcnRfYWxwaGEoKSBmcm9tIHBuZ3dyaXRlLmMKKyAgQXBwbHkgcG5nX3VzZXJfY2h1bmtfY2FjaGVfbWF4IHdpdGhpbiBwbmdfZGVjb21wcmVzc19jaHVuaygpLgorICBNZXJnZWQgbGlicG5nLTEuMi40MS50eHQgd2l0aCBsaWJwbmctMS40LjAudHh0IHdoZXJlIGFwcHJvcHJpYXRlLgorCitWZXJzaW9uIDEuNC4wYmV0YTkwIFtOb3ZlbWJlciAyLCAyMDA5XQorICBSZW1vdmVkIGFsbCByZW1haW5pbmcgV0lOMzJfV0NFICNpZmRlZnMgZXhjZXB0IHRob3NlIGludm9sdmluZyB0aGUKKyAgICB0aW1lLmggInRtIiBzdHJ1Y3R1cmUKKworVmVyc2lvbiAxLjQuMGJldGE5MSBbTm92ZW1iZXIgMywgMjAwOV0KKyAgVXBkYXRlZCBzY3JpcHRzL3BuZ3czMi5kZWYgYW5kIHByb2plY3RzL3dpbmNlL3BuZzMyY2UuZGVmCisgIENvcGllZCBwcm9qZWN0cy93aW5jZS9wbmczMmNlLmRlZiB0byB0aGUgc2NyaXB0cyBkaXJlY3RvcnkuCisgIEFkZGVkIHNjcmlwdHMvbWFrZWZpbGUud2NlCisgIFBhdGNoZWQgbHRtYWluLnNoIGZvciB3aW5jZSBzdXBwb3J0LgorICBBZGRlZCBQTkdfQ09OVkVSVF90SU1FX1NVUFBPUlRFRCBtYWNyby4KKworVmVyc2lvbiAxLjQuMGJldGE5MiBbTm92ZW1iZXIgNCwgMjAwOV0KKyAgTWFrZSBpbmNsdXNpb24gb2YgdGltZS5oIGluIHBuZ2NvbmYuaCBkZXBlbmQgb24gUE5HX0NPTlZFUlRfdElNRV9TVVBQT1JURUQKKyAgTWFrZSAjZGVmaW5lIFBOR19DT05WRVJUX3RJTUVfU1VQUE9SVEVEIGRlcGVuZCBvbiBQTkdfV1JJVEVfdElNRV9TVVBQT1JURUQKKyAgUmV2aXNlZCBsaWJwbmcqLnR4dCB0byBkZXNjcmliZSBkaWZmZXJlbmNlcyBmcm9tIDEuMi40MCB0byAxLjQuMCAoaW5zdGVhZAorICAgIG9mIGRpZmZlcmVuY2VzIGZyb20gMS4yLjQxIHRvIDEuNC4wKQorCitWZXJzaW9uIDEuNC4wYmV0YTkzIFtOb3ZlbWJlciA3LCAyMDA5XQorICBBZGRlZCBQTkdfREVQU1RSVUNULCBQTkdfREVQUkVDQVRFRCwgUE5HX1VTRV9SRVNVTFQsIFBOR19OT1JFVFVSTiwgYW5kCisgICAgUE5HX0FMTE9DQVRFRCBtYWNyb3MgdG8gZGV0ZWN0IGRlcHJlY2F0ZWQgZGlyZWN0IGFjY2VzcyB0byB0aGUKKyAgICBwbmdfc3RydWN0IG9yIGluZm9fc3RydWN0IG1lbWJlcnMgYW5kIG90aGVyIGRlcHJlY2F0ZWQgdXNhZ2UgaW4KKyAgICBhcHBsaWNhdGlvbnMgKEpvaG4gQm93bGVyKS4KKyAgVXBkYXRlZCBzY3JpcHRzL21ha2VmaWxlKiB0byBhZGQgIi1EUE5HX0NPTkZJR1VSRV9MSUJQTkciIHRvIENGTEFHUywKKyAgICB0byBwcmV2ZW50IHdhcm5pbmdzIGFib3V0IGRpcmVjdCBhY2Nlc3MgdG8gcG5nIHN0cnVjdHMgYnkgbGlicG5nCisgICAgZnVuY3Rpb25zIHdoaWxlIGJ1aWxkaW5nIGxpYnBuZy4gIFRoZXkgbmVlZCB0byBiZSB0ZXN0ZWQsIGVzcGVjaWFsbHkKKyAgICB0aG9zZSB1c2luZyBjb21waWxlcnMgb3RoZXIgdGhhbiBnY2MuCisgIFVwZGF0ZWQgcHJvamVjdHMvdmlzdWFsYzYgYW5kIHZpc3VhbGM3MSB3aXRoICIvZCBQTkdfQ09ORklHVVJFX0xJQlBORyIuCisgICAgVGhleSBzaG91bGQgd29yayBidXQgc3RpbGwgbmVlZCB0byBiZSB1cGRhdGVkIHRvIHJlbW92ZQorICAgIHJlZmVyZW5jZXMgdG8gcG5nZ2NjcmQuYyBvciBwbmd2Y3JkLmMgYW5kIEFTTSBidWlsZGluZy4KKyAgQWRkZWQgUkVBRE1FLnR4dCB0byB0aGUgYmVvcywgY2J1aWxkZXI1LCBuZXR3YXJlLCBhbmQgeGNvZGUgcHJvamVjdHMgd2FybmluZworICAgIHRoYXQgdGhleSBuZWVkIHRvIGJlIHVwZGF0ZWQsIHRvIHJlbW92ZSByZWZlcmVuY2VzIHRvIHBuZ2djY3JkLmMgYW5kCisgICAgcG5ndmNyZC5jIGFuZCB0byBkZXBlbmQgb24gcG5ncHJpdi5oCisgIFJlbW92ZWQgdGhyZWUgZGlyZWN0IHJlZmVyZW5jZXMgdG8gcmVhZF9pbmZvX3B0ciBtZW1iZXJzIGluIHBuZ3Rlc3QuYworICAgIHRoYXQgd2VyZSBkZXRlY3RlZCBieSB0aGUgbmV3IFBOR19ERVBTVFJVQ1QgbWFjcm8uCisgIE1vdmVkIHRoZSBwbmdfZGVidWcgbWFjcm8gZGVmaW5pdGlvbnMgYW5kIHRoZSBwbmdfcmVhZF9kZXN0cm95KCksCisgICAgcG5nX3dyaXRlX2Rlc3Ryb3koKSBhbmQgcG5nX2Zhcl90b19uZWFyKCkgcHJvdG90eXBlcyBmcm9tIHBuZy5oCisgICAgdG8gcG5ncHJpdi5oIChKb2huIEJvd2xlcikKKyAgTW92ZWQgdGhlIHN5bm9wc2lzIGxpbmVzIGZvciBwbmdfcmVhZF9kZXN0cm95KCksIHBuZ193cml0ZV9kZXN0cm95KCkKKyAgICBwbmdfZGVidWcoKSwgcG5nX2RlYnVnMSgpLCBhbmQgcG5nX2RlYnVnMigpIGZyb20gbGlicG5nLjMgdG8gbGlicG5ncGYuMy4KKworVmVyc2lvbiAxLjQuMGJldGE5NCBbTm92ZW1iZXIgOSwgMjAwOV0KKyAgUmVtb3ZlZCB0aGUgb2Jzb2xldGUsIHVudXNlZCBwbmdnY2NyZC5jIGFuZCBwbmd2Y3JkLmMgZmlsZXMuCisgIFVwZGF0ZWQgQ01ha2VMaXN0cy50eHQgdG8gYWRkICItRFBOR19DT05GSUdVUkVfTElCUE5HIiB0byB0aGUgZGVmaW5pdGlvbnMuCisgIFJlbW92ZWQgZGVwZW5kZW5jeSBvZiBwbmd0ZXN0Lm8gb24gcG5ncHJpdi5oIGluIHRoZSBtYWtlZmlsZXMuCisgIE9ubHkgI2RlZmluZSBQTkdfREVQU1RSVUNULCBldGMuIGluIHBuZ2NvbmYuaCBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgorCitWZXJzaW9uIDEuNC4wYmV0YTk1IFtOb3ZlbWJlciAxMCwgMjAwOV0KKyAgQ2hhbmdlZCBwbmdfY2hlY2tfc2lnKCkgdG8gIXBuZ19zaWdfY21wKCkgaW4gY29udHJpYiBwcm9ncmFtcy4KKyAgQWRkZWQgLURQTkdfQ09ORklHVVJFX0xJQlBORyB0byBjb250cmliL3BuZ21pbm0vKi9tYWtlZmlsZQorICBDaGFuZ2VkIHBuZ19jaGVja19zaWcoKSB0byAhcG5nX3NpZ19jbXAoKSBpbiBjb250cmliIHByb2dyYW1zLgorICBDb3JyZWN0ZWQgdGhlIHBuZ19nZXRfSUhEUigpIGNhbGwgaW4gY29udHJpYi9ncmVnYm9vay9yZWFkcG5nMi5jCisgIENoYW5nZWQgcG5nbWluaW0vKi9nYXRoZXIuc2ggdG8gc3RvcCB0cnlpbmcgdG8gcmVtb3ZlIHBuZ2djY3JkLmMgYW5kIHBuZ3ZjcmQuYworICBBZGRlZCBkZXBlbmRlbmN5IG9uIHBuZ3ByaXYuaCBpbiBjb250cmliL3BuZ21pbmltLyovbWFrZWZpbGUKKworVmVyc2lvbiAxLjQuMGJldGE5NiBbTm92ZW1iZXIgMTIsIDIwMDldCisgIFJlbmFtZWQgc2NyaXB0cy9tYWtlZmlsZS53Y2UgdG8gc2NyaXB0cy9tYWtlZmlsZS5jZWdjYworICBSZXZpc2VkIE1ha2VmaWxlLmFtIHRvIHVzZSBsaWJwbmcuc3lzIHdoaWxlIGJ1aWxkaW5nIGxpYnBuZy5zbworICAgIHNvIHRoYXQgb25seSBQTkdfRVhQT1JUIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQuCisgIFJlbW92ZWQgdGhlIGRlcHJlY2F0ZWQgcG5nX2NoZWNrX3NpZygpIGZ1bmN0aW9uL21hY3JvLgorICBSZW1vdmVkIHJlY2VudGx5IHJlbW92ZWQgZnVuY3Rpb24gbmFtZXMgZnJvbSBzY3JpcHRzLyouZGVmCisgIFJldmlzZWQgcG5ndGVzdC5wbmcgdG8gcHV0IGNodW5rcyBpbiB0aGUgc2FtZSBvcmRlciB3cml0dGVuIGJ5IHBuZ3Rlc3QKKyAgICAoZXZpZGVudGx5IHRoZSBzYW1lIGNoYW5nZSBtYWRlIGluIGxpYnBuZy0xLjBiZXRhNTQgd2FzIGxvc3QpLgorICBBZGRlZCBQTkdfUFJJVkFURSBtYWNybyBkZWZpbml0aW9uIGluIHBuZ2NvbmYuaCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZS4KKworVmVyc2lvbiAxLjQuMGJldGE5NyBbTm92ZW1iZXIgMTMsIDIwMDldCisgIFJlc3RvcmVkIHBuZ3Rlc3QucG5nIHRvIHRoZSBsaWJwbmctMS40LjBiZXRhNyB2ZXJzaW9uLgorICBSZW1vdmVkIHByb2plY3RzL2Jlb3MgYW5kIG5ldHdhcmUudHh0OyBubyBvbmUgc2VlbXMgdG8gYmUgc3VwcG9ydGluZyB0aGVtLgorICBSZXZpc2VkIE1ha2VmaWxlLmluCisKK1ZlcnNpb24gMS40LjBiZXRhOTggW05vdmVtYmVyIDEzLCAyMDA5XQorICBBZGRlZCB0aGUgInhjb2RlIiBwcm9qZWN0IHRvIHppcCBkaXN0cmlidXRpb25zLAorICBGaXhlZCBhIHR5cG8gaW4gc2NyaXB0cy9wbmd3aW4uZGVmIGludHJvZHVjZWQgaW4gYmV0YTk3LgorCitWZXJzaW9uIDEuNC4wYmV0YTk5IFtOb3ZlbWJlciAxNCwgMjAwOV0KKyAgTW92ZWQgbGlicG5nLWNvbmZpZy5pbiBhbmQgbGlicG5nLnBjLWNvbmZpZ3VyZS5pbiBvdXQgb2YgdGhlIHNjcmlwdHMKKyAgICBkaXJlY3RvcnksIHRvIGxpYnBuZy1jb25maWcuaW4gYW5kIGxpYnBuZy1wYy5pbiwgcmVzcGVjdGl2ZWx5LCBhbmQKKyAgICBtb2RpZmllZCBNYWtlZmlsZS5hbSBhbmQgY29uZmlndXJlLmFjIGFjY29yZGluZ2x5LiAgTm93ICJjb25maWd1cmUiCisgICAgbmVlZHMgbm90aGluZyBmcm9tIHRoZSAic2NyaXB0cyIgZGlyZWN0b3J5LgorICBBdm9pZCByZWRlZmluaW5nIFBOR19DT05TVCBpbiBwbmdjb25mLmgKKworVmVyc2lvbiAxLjQuMGJldGExMDAgW05vdmVtYmVyIDE0LCAyMDA5XQorICBSZW1vdmVkIEFTTSBidWlsZHMgZnJvbSBwcm9qZWN0cy92aXN1YWxjNiBhbmQgcHJvamVjdHMvdmlzdWFsYzcxCisgIFJlbW92ZWQgc2NyaXB0cy9tYWtlZmlsZS5ub21teCBhbmQgbWFrZWZpbGUudmNhd2luMzIKKyAgUmV2aXNlZCBDTWFrZUxpc3RzLnR4dCB0byBhY2NvdW50IGZvciBuZXcgbG9jYXRpb24gb2YgbGlicG5nLWNvbmZpZy5pbgorICAgIGFuZCBsaWJwbmctcGMuaW4KKyAgVXBkYXRlZCBJTlNUQUxMIHRvIHJlZmxlY3QgcmVtb3ZhbCBhbmQgcmVsb2NhdGlvbiBvZiBmaWxlcy4KKworVmVyc2lvbiAxLjQuMGJldGExMDEgW05vdmVtYmVyIDE0LCAyMDA5XQorICBSZXN0b3JlZCB0aGUgYmluYXJ5IGZpbGVzICgqLmpwZywgKi5wbmcsIHNvbWUgcHJvamVjdCBmaWxlcykgdGhhdCB3ZXJlCisgICAgYWNjaWRlbnRhbGx5IGRlbGV0ZWQgZnJvbSB0aGUgemlwIGFuZCA3eiBkaXN0cmlidXRpb25zIHdoZW4gdGhlIHhjb2RlCisgICAgcHJvamVjdCB3YXMgYWRkZWQuCisKK1ZlcnNpb24gMS40LjBiZXRhMTAyIFtOb3ZlbWJlciAxOCwgMjAwOV0KKyAgQWRkZWQgbGlicG5nLWNvbmZpZy5pbiBhbmQgbGlicG5nLXBjLmluIHRvIHRoZSB6aXAgYW5kIDd6IGRpc3RyaWJ1dGlvbnMuCisgIEZpeGVkIGEgdHlwbyBpbiBwcm9qZWN0cy92aXN1YWxjNi9wbmd0ZXN0LmRzcCwgaW50cm9kdWNlZCBpbiBiZXRhMTAwLgorICBNb3ZlZCBkZXNjcmlwdGlvbnMgb2YgbWFrZWZpbGVzIGFuZCBvdGhlciBzY3JpcHRzIG91dCBvZiBJTlNUQUxMIGludG8KKyAgICBzY3JpcHRzL1JFQURNRS50eHQKKyAgVXBkYXRlZCB0aGUgY29weXJpZ2h0IHllYXIgaW4gc2NyaXB0cy9wbmd3aW4ucmMgZnJvbSAyMDA2IHRvIDIwMDkuCisKK1ZlcnNpb24gMS40LjBiZXRhMTAzIFtOb3ZlbWJlciAyMSwgMjAwOV0KKyAgUmVtb3ZlZCBvYnNvbGV0ZSBjb21tZW50cyBhYm91dCBBU00gZnJvbSBwcm9qZWN0cy92aXN1YWxjNzEvUkVBRE1FX3psaWIudHh0CisgIEFsaWduIHJvd19idWYgb24gMTYtYnl0ZSBib3VuZGFyeSBpbiBtZW1vcnkuCisgIFJlc3RvcmVkIHRoZSBQTkdfV1JJVEVfRkxVU0hfQUZURVJfSUVORF9TVVBQT1JURUQgZ3VhcmQgYXJvdW5kIHRoZSBjYWxsCisgICAgdG8gcG5nX2ZsdXNoKCkgYWZ0ZXIgcG5nX3dyaXRlX0lFTkQoKS4gIFNlZSAxLjQuMGJldGEzMiwgMS40LjBiZXRhNTAKKyAgICBjaGFuZ2VzIGFib3ZlIGFuZCAxLjIuMzAsIDEuMi4zMHJjMDEgYW5kIHJjMDMgaW4gMS4yLjQxIENIQU5HRVMuICBTb21lb25lCisgICAgbmVlZHMgdGhpcyBmZWF0dXJlLgorICBNYWtlIHRoZSAncG5nX2ptcGJ1ZicgbWFjcm8gZXhwYW5kIHRvIGEgY2FsbCB0aGF0IHJlY29yZHMgdGhlIGNvcnJlY3QKKyAgICBsb25nam1wIGZ1bmN0aW9uIGFzIHdlbGwgYXMgcmV0dXJuaW5nIGEgcG9pbnRlciB0byB0aGUgc2V0am1wCisgICAgam1wX2J1ZiBidWZmZXIsIGFuZCBtYXJrZWQgZGlyZWN0IGFjY2VzcyB0byBqbXBidWYgJ2RlcHJlY2F0ZWQnLgorICAgIChKb2huIEJvd2xlcikKKworVmVyc2lvbiAxLjQuMGJldGExMDQgW05vdmVtYmVyIDIyLCAyMDA5XQorICBSZW1vdmVkIHBuZ19sb25nam1wX3B0ciBmcm9tIHNjcmlwdHMvKi5kZWYgYW5kIGxpYnBuZy4zCisgIFJlYnVpbHQgY29uZmlndXJlIHNjcmlwdHMgd2l0aCBhdXRvY29uZi0yLjY1CisKK1ZlcnNpb24gMS40LjBiZXRhMTA1IFtOb3ZlbWJlciAyNSwgMjAwOV0KKyAgVXNlIGZhc3QgaW50ZWdlciBQTkdfRElWSURFX0JZXzI1NSgpIG9yIFBOR19ESVZJREVfQllfNjU1MzUoKQorICAgIHRvIGFjY29tcGxpc2ggYWxwaGEgcHJlbXVsdGlwbGljYXRpb24gd2hlbgorICAgIFBOR19SRUFEX0NPTVBPU0lURV9OT0RJVl9TVVBQT1JURUQgaXMgZGVmaW5lZC4KKyAgQ2hhbmdlZCAiLzI1NSIgdG8gIi8yNTUuMCIgaW4gYmFja2dyb3VuZCBjYWxjdWxhdGlvbnMgdG8gbWFrZSBpdCBjbGVhcgorICAgIHRoYXQgdGhlIDI1NSBpcyB1c2VkIGFzIGEgZG91YmxlLgorCitWZXJzaW9uIDEuNC4wYmV0YTEwNiBbTm92ZW1iZXIgMjcsIDIwMDldCisgIFJlbW92ZWQgcHJlbXVsdGlwbGllZCBhbHBoYSBmZWF0dXJlLgorCitWZXJzaW9uIDEuNC4wYmV0YTEwNyBbRGVjZW1iZXIgNCwgMjAwOV0KKyAgVXBkYXRlZCBSRUFETUUKKyAgQWRkZWQgIiNkZWZpbmUgUE5HX05PX1BFREFOVElDX1dBUk5JTkdTIiBpbiB0aGUgbGlicG5nIHNvdXJjZSBmaWxlcy4KKyAgUmVtb3ZlZCAiLURQTkdfQ09ORklHVVJFX0xJQlBORyIgZnJvbSB0aGUgbWFrZWZpbGVzIGFuZCBwcm9qZWN0cy4KKyAgUmV2aXNlZCBzY3JpcHRzL21ha2VmaWxlLm5ldGJzZCwgbWFrZWZpbGUub3BlbmJzZCwgYW5kIG1ha2VmaWxlLnNjbworICAgIHRvIHB1dCBwbmcuaCBhbmQgcG5nY29uZi5oIGluICRwcmVmaXgvaW5jbHVkZSwgbGlrZSB0aGUgb3RoZXIgc2NyaXB0cywKKyAgICBpbnN0ZWFkIG9mIGluICRwcmVmaXgvaW5jbHVkZS9saWJwbmcuICBBbHNvIHJldmlzZWQgbWFrZWZpbGUuc2NvCisgICAgdG8gcHV0IHRoZW0gaW4gJHByZWZpeC9pbmNsdWRlL2xpYnBuZzE1IGluc3RlYWQgb2YgaW4KKyAgICAkcHJlZml4L2luY2x1ZGUvbGlicG5nL2xpYnBuZzE1LgorCitWZXJzaW9uIDEuNC4wYmV0YTEwOCBbRGVjZW1iZXIgMTEsIDIwMDldCisgIFJlbW92ZWQgbGVmdG92ZXIgIi1EUE5HX0NPTkZJR1VSRV9MSUJQTkciIGZyb20gY29udHJpYi9wbmdtaW5pbS8qL21ha2VmaWxlCisgIFJlbG9jYXRlZCBwbmdfZG9fY2hvcCgpIHRvIGl0cyBvcmlnaW5hbCBwb3NpdGlvbiBpbiBwbmdydHJhbi5jOyB0aGUKKyAgICBjaGFuZ2UgaW4gdmVyc2lvbiAxLjIuNDFiZXRhMDggY2F1c2VkIHRyYW5zcGFyZW5jeSB0byBiZSBoYW5kbGVkIHdyb25nCisgICAgaW4gc29tZSAxNi1iaXQgZGF0YXN0cmVhbXMgKFl1c2FrdSBTdWdhaSkuCisKK1ZlcnNpb24gMS40LjBiZXRhMTA5IFtEZWNlbWJlciAxMywgMjAwOV0KKyAgQWRkZWQgImJpdF9kZXB0aCIgcGFyYW1ldGVyIHRvIHRoZSBwcml2YXRlIHBuZ19idWlsZF9nYW1tYV90YWJsZSgpIGZ1bmN0aW9uLgorICBQYXNzIGJpdF9kZXB0aD04IHRvIHBuZ19idWlsZF9nYW1tYV90YWJsZSgpIHdoZW4gYml0X2RlcHRoIGlzIDE2IGJ1dCB0aGUKKyAgICBQTkdfMTZfVE9fOCB0cmFuc2Zvcm0gaGFzIGJlZW4gc2V0LCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBidWlsZCBvZiAxNi1iaXQKKyAgICB0YWJsZXMuCisKK1ZlcnNpb24gMS40LjByYzAyIFtEZWNlbWJlciAyMCwgMjAwOV0KKyAgRGVjbGFyZWQgcG5nX2NsZWFudXBfbmVlZGVkICJ2b2xhdGlsZSIgaW4gcG5ncmVhZC5jIGFuZCBwbmd3cml0ZS5jCisKK1ZlcnNpb24gMS40LjByYzAzIFtEZWNlbWJlciAyMiwgMjAwOV0KKyAgUmVuYW1lZCBsaWJwbmctcGMuaW4gYmFjayB0byBsaWJwbmcucGMuaW4gYW5kIHJldmlzZWQgQ01ha2VMaXN0cy50eHQKKyAgICAocmV2aXNpbmcgdGhlIGNoYW5nZSBpbiAxLjQuMGJldGE5OSkKKworVmVyc2lvbiAxLjQuMHJjMDQgW0RlY2VtYmVyIDI1LCAyMDA5XQorICBTd2FwcGVkIFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQgYW5kIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQKKyAgICBpbiBwbmdzZXQuYyB0byBiZSBjb25zaXN0ZW50IHdpdGggb3RoZXIgY2hhbmdlcyBpbiB2ZXJzaW9uIDEuMi4zOC4KKworVmVyc2lvbiAxLjQuMHJjMDUgW0RlY2VtYmVyIDI1LCAyMDA5XQorICBDaGFuZ2VkICJsaWJwbmctcGMuaW4iIHRvICJsaWJwbmcucGMuaW4iIGluIGNvbmZpZ3VyZS5hYywgY29uZmlndXJlLCBhbmQKKyAgICBNYWtlZmlsZS5pbiB0byBiZSBjb25zaXN0ZW50IHdpdGggY2hhbmdlcyBpbiBsaWJwbmctMS40LjByYzAzCisKK1ZlcnNpb24gMS40LjByYzA2IFtEZWNlbWJlciAyOSwgMjAwOV0KKyAgUmV2ZXJ0ZWQgdGhlIGdhbW1hX3RhYmxlIGNoYW5nZXMgZnJvbSBsaWJwbmctMS40LjBiZXRhMTA5LgorICBGaXhlZCBzb21lIGluZGVudGF0aW9uIGVycm9ycy4KKworVmVyc2lvbiAxLjQuMHJjMDcgW0phbnVhcnkgMSwgMjAxMF0KKyAgUmV2aXNlZCBsaWJwbmcqLnR4dCBhbmQgbGlicG5nLjMgYWJvdXQgMS4yLngtPjEuNC54IGRpZmZlcmVuY2VzLgorICBVc2UgcG5nX2NhbGxvYygpIGluc3RlYWQgb2YgcG5nX21hbGxvYygpOyBwbmdfbWVtc2V0KCkgaW4gcG5ncnV0aWwuYworICBVcGRhdGUgY29weXJpZ2h0IHllYXIgdG8gMjAxMC4KKworVmVyc2lvbiAxLjQuMHJjMDggW0phbnVhcnkgMiwgMjAxMF0KKyAgQXZvaWQgZGVwcmVjYXRlZCByZWZlcmVuY2VzIHRvIHBuZ19wdHItaW9fcHRyIGFuZCBwbmdfcHRyLT5lcnJvcl9wdHIKKyAgICBpbiBwbmd0ZXN0LmMKKworVmVyc2lvbiAxLjQuMCBbSmFudWFyeSAzLCAyMDEwXQorICBObyBjaGFuZ2VzLgorCitWZXJzaW9uIDEuNC4xYmV0YTAxIFtKYW51YXJ5IDgsIDIwMTBdCisgIFVwZGF0ZWQgQ01ha2VMaXN0cy50eHQgZm9yIGNvbnNpc3RlbnQgaW5kZW50YXRpb24gYW5kIHRvIGF2b2lkIGFuCisgICAgdW5jbG9zZWQgaWYtc3RhdGVtZW50IHdhcm5pbmcgKFBoaWxpcCBMb3dtYW4pLgorICBSZXZpc2VkIE1ha2VmaWxlLmFtIGFuZCBNYWtlZmlsZS5pbiB0byByZW1vdmUgcmVmZXJlbmNlcyB0byBZMktJTkZPLAorICAgIEtOT1dOQlVHLCBhbmQgbGlicG5nLmxhIChSb2JlcnQgU2Nod2ViZWwpLgorICBSZXZpc2VkIHRoZSBtYWtlZmlsZXMgdG8gaW5zdGFsbCB0aGUgc2FtZSBmaWxlcyBhbmQgc3ltYm9saWMKKyAgICBsaW5rcyBhcyBjb25maWd1cmUsIGV4Y2VwdCBmb3IgbGlicG5nLmxhIGFuZCBsaWJwbmcxNC5sYS4KKyAgTWFrZSBwbmdfc2V0fGdldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZSgpIGF2YWlsYWJsZSBldmVuIHdoZW4KKyAgICBQTkdfV1JJVEVfU1VQUE9SVEVEIGlzIG5vdCBlbmFibGVkLgorICBSZXZpc2VkIE1ha2VmaWxlLmFtIGFuZCBNYWtlZmlsZS5pbiB0byBzaW1wbGlmeSB0aGVpciBtYWludGVuYW5jZS4KKyAgUmV2aXNlZCBzY3JpcHRzL21ha2VmaWxlLmxpbnV4IHRvIGluc3RhbGwgYSBsaW5rIHRvIGxpYnBuZzE0LnNvLjE0LjEKKworVmVyc2lvbiAxLjQuMWJldGEwMiBbSmFudWFyeSA5LCAyMDEwXQorICBSZXZpc2VkIHRoZSByZXN0IG9mIHRoZSBtYWtlZmlsZXMgdG8gaW5zdGFsbCBhIGxpbmsgdG8gbGlicG5nMTQuc28uMTQuMQorCitWZXJzaW9uIDEuNC4xYmV0YTAzIFtKYW51YXJ5IDEwLCAyMDEwXQorICBSZW1vdmVkIHBuZ19zZXRfcHJlbXVsdGlwbHlfYWxwaGEoKSBmcm9tIHNjcmlwdHMvKi5kZWYKKworVmVyc2lvbiAxLjQuMXJjMDEgW0phbnVhcnkgMTYsIDIwMTBdCisgIE5vIGNoYW5nZXMuCisKK1ZlcnNpb24gMS40LjFiZXRhMDQgW0phbnVhcnkgMjMsIDIwMTBdCisgIFJldmlzZWQgcG5nX2RlY29tcHJlc3NfY2h1bmsoKSB0byBpbXByb3ZlIHNwZWVkIGFuZCBtZW1vcnkgdXNhZ2Ugd2hlbgorICAgIGRlY29kaW5nIGxhcmdlIGNodW5rcy4KKyAgQWRkZWQgcG5nX3NldHxnZXRfY2h1bmtfbWFsbG9jX21heCgpIGZ1bmN0aW9ucy4KKworVmVyc2lvbiAxLjQuMWJldGEwNSBbSmFudWFyeSAyNiwgMjAxMF0KKyAgUmVsb2NhdGVkICJpbnQgayIgZGVjbGFyYXRpb24gaW4gcG5ndGVzdC5jIHRvIG1pbmltaXplIGl0cyBzY29wZS4KKworVmVyc2lvbiAxLjQuMWJldGEwNiBbSmFudWFyeSAyOCwgMjAxMF0KKyAgUmV2aXNlZCBwbmdfZGVjb21wcmVzc19jaHVuaygpIHRvIHVzZSBhIHR3by1wYXNzIG1ldGhvZCBzdWdnZXN0ZWQgYnkKKyAgICBKb2huIEJvd2xlci4KKworVmVyc2lvbiAxLjQuMWJldGEwNyBbRmVicnVhcnkgNiwgMjAxMF0KKyAgRm9sZGVkIHNvbWUgbG9uZyBsaW5lcyBpbiB0aGUgc291cmNlIGZpbGVzLgorICBBZGRlZCBkZWZpbmVhYmxlIFBOR19VU0VSX0NIVU5LX0NBQ0hFX01BWCwgUE5HX1VTRVJfQ0hVTktfTUFMTE9DX01BWCwKKyAgICBhbmQgYSBQTkdfVVNFUl9MSU1JVFNfU1VQUE9SVEVEIGZsYWcuCisgIEVsaW1pbmF0ZWQgdXNlIG9mIHBuZ19wdHItPmlyb3dieXRlcyBhbmQgcmV1c2VkIHRoZSBzbG90IGluIHBuZ19wdHIgYXMKKyAgICBwbmdfcHRyLT5wbmdfdXNlcl9jaHVua19tYWxsb2NfbWF4LgorICBSZXZpc2VkIHBuZ19wdXNoX3NhdmVfYnVmZmVyKCkgdG8gZG8gZmV3ZXIgYnV0IGxhcmdlciBwbmdfbWFsbG9jKCkgY2FsbHMuCisKK1ZlcnNpb24gMS40LjFiZXRhMDggW0ZlYnJ1YXJ5IDYsIDIwMTBdCisgIE1pbm9yIGNsZWFudXAgYW5kIHVwZGF0aW5nIG9mIGRhdGVzIGFuZCBjb3B5cmlnaHQgeWVhci4KKworVmVyc2lvbiAxLjUuMGJldGEwMSBbRmVicnVhcnkgNywgMjAxMF0KKyAgTW92ZWQgZGVjbGFyYXRpb24gb2YgcG5nX3N0cnVjdCBpbnRvIHByaXZhdGUgcG5nc3RydWN0LmggYW5kIHBuZ19pbmZvCisgICAgaW50byBwbmdpbmZvLmgKKworVmVyc2lvbiAxLjQuMWJldGEwOSBhbmQgMS41LjBiZXRhMDIgW0ZlYnJ1YXJ5IDcsIDIwMTBdCisgIFJldmVydGVkIHRvIG9yaWdpbmFsIHBuZ19wdXNoX3NhdmVfYnVmZmVyKCkgY29kZS4KKworVmVyc2lvbiAxLjQuMWJldGExMCBhbmQgMS41LjBiZXRhMDMgW0ZlYnJ1YXJ5IDgsIDIwMTBdCisgIFJldHVybiBhbGxvY2F0ZWQgIm9sZF9idWZmZXIiIGluIHBuZ19wdXNoX3NhdmVfYnVmZmVyKCkgYmVmb3JlCisgICAgY2FsbGluZyBwbmdfZXJyb3IoKSwgdG8gYXZvaWQgYSBwb3RlbnRpYWwgbWVtb3J5IGxlYWsuCisgIFVwZGF0ZWQgY29uZmlndXJlIHNjcmlwdCB0byB1c2UgU08gbnVtYmVyIDE1LgorCitWZXJzaW9uIDEuNS4wYmV0YTA0IFtGZWJydWFyeSA5LCAyMDEwXQorICBSZW1vdmVkIG1hbGZvcm1lZCAiaW5jb21wbGV0ZSBzdHJ1Y3QgZGVjbGFyYXRpb24iIG9mIHBuZ19pbmZvIGZyb20gcG5nLmgKKworVmVyc2lvbiAxLjUuMGJldGEwNSBbRmVicnVhcnkgMTIsIDIwMTBdCisgIFJlbW92ZWQgUE5HX0RFUFNUUlVDVCBtYXJrdXAgaW4gcG5nc3RydWN0LmggYW5kIHBuZ2luZm8uaCwgYW5kIHVuZGlkIHRoZQorICAgIGxpbmV3cmFwcGluZyB0aGF0IGl0IGVudGFpbGVkLgorICBSZXZpc2VkIGNvbW1lbnRzIGluIHBuZ3N0cnVjdC5oIGFuZCBwbmdpbmZvLmggYW5kIGFkZGVkIHBvaW50ZXJzIHRvCisgICAgdGhlIGxpYnBuZyBsaWNlbnNlLgorICBDaGFuZ2VkIFBOR19JTlRFUk5BTCB0byBQTkdfRVhQT1NFX0lOVEVSTkFMX1NUUlVDVFVSRVMKKyAgUmVtb3ZlZCB0aGUgY2J1aWxkZXI1IHByb2plY3QsIHdoaWNoIGhhcyBub3QgYmVlbiB1cGRhdGVkIHRvIDEuNC4wLgorCitWZXJzaW9uIDEuNC4xYmV0YTEyIGFuZCAxLjUuMGJldGEwNiBbRmVicnVhcnkgMTQsIDIwMTBdCisgIEZpeGVkIHR5cGUgZGVjbGFyYXRpb24gb2YgcG5nX2dldF9jaHVua19tYWxsb2NfbWF4KCkgaW4gcG5nZ2V0LmMgKERhaXN1a2UKKyAgICBOaXNoaWthd2EpCisKK1ZlcnNpb24gMS41LjBiZXRhMDcgW29taXR0ZWRdCisKK1ZlcnNpb24gMS41LjBiZXRhMDggW0ZlYnJ1YXJ5IDE5LCAyMDEwXQorICBDaGFuZ2VkICNpZmRlZiBQTkdfTk9fU1RESU9fU1VQUE9SVEVEIHRvICNpZmRlZiBQTkdfTk9fQ09OU09MRV9JT19TVVBQT1JURUQKKyAgICB3aGVyZXZlciBwbmdfc25wcmludGYoKSBpcyB1c2VkIHRvIGNvbnN0cnVjdCBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcy4KKyAgTm90ZWQgaW4gc2NyaXB0cy9tYWtlZmlsZS5taW5ndyB0aGF0IGl0IGV4cGVjdHMgdG8gYmUgcnVuIHVuZGVyIE1TWVMuCisgIFJlbW92ZWQgb2Jzb2xldGUgdW51c2VkIE1NWC1xdWVyeWluZyBzdXBwb3J0IGZyb20gY29udHJpYi9ncmVnYm9vaworICBBZGRlZCBleHBvcnRlZCBwbmdfbG9uZ2ptcCgpIGZ1bmN0aW9uLgorICBSZW1vdmVkIHRoZSBBSVggcmVkZWZpbml0aW9uIG9mIGptcGJ1ZiBpbiBwbmcuaAorICBBZGRlZCAtRF9BTExTT1VSQ0UgaW4gY29uZmlndXJlLmFjLCBtYWtlZmlsZS5haXgsIGFuZCBDTWFrZUxpc3RzLnR4dAorICAgIHdoZW4gYnVpbGRpbmcgb24gQUlYLgorCitWZXJzaW9uIDEuNS4wYmV0YTA5IFtGZWJydWFyeSAxOSwgMjAxMF0KKyAgUmVtb3ZlZCAtRF9BTExTT1VSQ0UgZnJvbSBjb25maWd1cmUuYWMsIG1ha2VmaWxlLmFpeCwgYW5kIENNYWtlTGlzdHMudHh0LgorICBDaGFuZ2VkIHRoZSBuYW1lIG9mIHBuZ19wdHItPmptcGJ1ZiB0byBwbmdfcHRyLT5wbmdfam1wYnVmIGluIHBuZ3N0cnVjdC5oCisKK1ZlcnNpb24gMS41LjBiZXRhMTAgW0ZlYnJ1YXJ5IDI1LCAyMDEwXQorICBSZW1vdmVkIHVudXNlZCBnemlvLmMgZnJvbSBjb250cmliL3BuZ21pbmltIGdhdGhlciBhbmQgbWFrZWZpbGUgc2NyaXB0cworICBSZW1vdmVkIHJlcGxhY2VtZW50IGVycm9yIGhhbmRsZXJzIGZyb20gY29udHJpYi9ncmVnYm9vay4gIEJlY2F1c2Ugb2YKKyAgICB0aGUgbmV3IHBuZ19sb25nam1wKCkgZnVuY3Rpb24gdGhleSBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4KKworVmVyc2lvbiAxLjUuMGJldGExMSBbTWFyY2ggNiwgMjAxMF0KKyAgUmVtb3ZlZCBjaGVja2luZyBmb3IgYWxyZWFkeS1pbmNsdWRlZCBzZXRqbXAuaCBmcm9tIHBuZ2NvbmYuaAorICBGaXhlZCBpbmNvbnNpc3RlbnQgaW5kZW50YXRpb25zIGFuZCBtYWRlIG51bWVyb3VzIGNvc21ldGljIGNoYW5nZXMuCisgIFJldmlzZWQgdGhlICJTRUUgQUxTTyIgc3R5bGUgb2YgbGlicG5nLjMsIGxpYnBuZ3BmLjMsIGFuZCBwbmcuNQorCitWZXJzaW9uIDEuNS4wYmV0YTEyIFtNYXJjaCA5LCAyMDEwXQorICBNb3ZlZCAiI2luY2x1ZGUgcG5nLmgiIGluc2lkZSBwbmdwcml2LmggYW5kIHJlbW92ZWQgIiNpbmNsdWRlIHBuZy5oIiBmcm9tCisgICAgdGhlIHNvdXJjZSBmaWxlcywgYWxvbmcgd2l0aCAiI2RlZmluZSBQTkdfRVhQT1NFX0lOVEVSTkFMX1NUUlVDVFVSRVMiCisgICAgYW5kICIjZGVmaW5lIFBOR19OT19QRURBTlRJQ19XQVJOSU5HUyIgKEpvaG4gQm93bGVyKS4KKyAgQ3JlYXRlZCBuZXcgcG5nZGVidWcuaCBhbmQgbW92ZWQgZGVidWcgZGVmaW5pdGlvbnMgdGhlcmUuCisKK1ZlcnNpb24gMS41LjBiZXRhMTMgW01hcmNoIDEwLCAyMDEwXQorICBQcm90ZWN0IHBuZ3N0cnVjdC5oLCBwbmdpbmZvLmgsIGFuZCBwbmdkZWJ1Zy5oIGZyb20gYmVpbmcgaW5jbHVkZWQgdHdpY2UuCisgIFJldmlzZSB0aGUgIiNpZmRlZiIgYmxvY2tzIGluIHBuZ19pbmZsYXRlKCkgc28gaXQgd2lsbCBjb21waWxlIHdoZW4gbmVpdGhlcgorICAgIFBOR19VU0VSX0NIVU5LX01BTExPQ19NQVggbm9yIFBOR19TRVRfQ0hVTktfTUFMTE9DX0xJTUlUX1NVUFBPUlRFRAorICAgIGlzIGRlZmluZWQuCisgIFJlbW92ZWQgdW51c2VkIHBuZ19tZWFzdXJlX2NvbXByZXNzZWRfY2h1bmsoKSBmcm9tIHBuZ3ByaXYuaCBhbmQgbGlicG5ncGYuMworICBNb3ZlZCB0aGUgJ2NvbmZpZy5oJyBzdXBwb3J0IGZyb20gcG5nY29uZi5oIHRvIHBuZ3ByaXYuaAorICBSZW1vdmVkIFBOR0FQSSBmcm9tIHRoZSBwbmdfbG9uZ2ptcF9wdHIgdHlwZWRlZi4KKyAgRWxpbWluYXRlZCBkZXBlbmRlbmNlIG9mIHBuZ3Rlc3QuYyBvbiB0aGUgcHJpdmF0ZSBwbmdkZWJ1Zy5oIGZpbGUuCisgIE1ha2UgYWxsIHBuZ19kZWJ1ZyBtYWNyb3MgaW50byAqdW50ZXJtaW5hdGVkKiBzdGF0ZW1lbnRzIG9yCisgICAgZXhwcmVzc2lvbnMgKGkuZS4gYSB0cmFpbGluZyAnOycgbXVzdCBhbHdheXMgYmUgYWRkZWQpIGFuZCBjb3JyZWN0CisgICAgdGhlIGZvcm1hdCBzdGF0ZW1lbnRzIGluIHZhcmlvdXMgcG5nX2RlYnVnIG1lc3NhZ2VzLgorCitWZXJzaW9uIDEuNS4wYmV0YTE0IFtNYXJjaCAxNCwgMjAxMF0KKyAgUmVtb3ZlZCBkaXJlY3QgYWNjZXNzIHRvIHBuZ19wdHItPmlvX3B0ciBmcm9tIHRoZSBXaW5kb3dzIGNvZGUgaW4gcG5ndGVzdC5jCisgIFJldmlzZWQgTWFrZWZpbGUuYW0gdG8gYWNjb3VudCBmb3IgcmVjZW50IGFkZGl0aW9ucyBhbmQgcmVwbGFjZW1lbnRzLgorICBDb3JyZWN0ZWQgQ0UgYW5kIE9TLzIgREVGIGZpbGVzIChzY3JpcHRzL3BuZypkZWYpIGZvciBzeW1ib2xzIHJlbW92ZWQgYW5kCisgICAgYWRkZWQgb3JkaW5hbCBudW1iZXJzIHRvIHRoZSBXaW5kb3dzIERFRiBmaWxlIGFuZCBjb3JyZWN0ZWQgdGhlIGR1cGxpY2F0ZWQKKyAgICBvcmRpbmFsIG51bWJlcnMgb24gQ0Ugc3ltYm9scyB0aGF0IGFyZSBjb21tZW50ZWQgb3V0LgorICBBZGRlZCBiYWNrIGluIGV4cG9ydCBzeW1ib2xzIHRoYXQgY2FuIGJlIHByZXNlbnQgaW4gdGhlIFdpbmRvd3MgYnVpbGQgYnV0CisgICAgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQuCisgIFBOR19FWFBPUlQgY2hhbmdlZCB0byBpbmNsdWRlIGFuICdvcmRpbmFsJyBmaWVsZCBmb3IgREVGIGZpbGUgZ2VuZXJhdGlvbi4KKyAgICBQTkdfQ0FMTEJBQ0sgYWRkZWQgdG8gbWFrZSBjYWxsYmFjayBkZWZpbml0aW9ucyB1bmlmb3JtLiAgUE5HQVBJIHNwbGl0CisgICAgaW50byBQTkdDQVBJIChiYXNlIEMgZm9ybSksIFBOR0FQSSAoZXhwb3J0cykgYW5kIFBOR0NCQVBJIChjYWxsYmFja3MpLAorICAgIGFuZCBhcHByb3ByaWF0ZSBjaGFuZ2VzIG1hZGUgdG8gYWxsIGZpbGVzLiAgQ3lnd2luIGJ1aWxkcyByZS1oaW5nZWQgdG8KKyAgICBhbGxvdyBwcm9jZWR1cmUgY2FsbCBzdGFuZGFyZCBjaGFuZ2VzIGFuZCB0byByZW1vdmUgdGhlIG5lZWQgZm9yIHRoZSBERUYKKyAgICBmaWxlIChmaXhlcyBidWlsZCBvbiBDeWd3aW4pLgorICBFbmFibGVkICdhdHRyaWJ1dGUnIHdhcm5pbmdzIHRoYXQgYXJlIHJlbGV2YW50IHRvIGxpYnJhcnkgQVBJcyBhbmQgY2FsbGJhY2tzLgorICBDaGFuZ2VkIHJ1bGVzIGZvciBnZW5lcmF0aW9uIG9mIHRoZSB2YXJpb3VzIHN5bWJvbCBmaWxlcyBhbmQgYWRkZWQgYSBuZXcKKyAgICBydWxlIGZvciBhIERFRiBmaWxlICh3aGljaCBpcyBhbHNvIGFkZGVkIHRvIHRoZSBkaXN0cmlidXRpb24pLgorICBVcGRhdGVkIHRoZSBzeW1ib2wgZmlsZSBnZW5lcmF0aW9uIHRvIHN0b3AgaXQgYWRkaW5nIHNwdXJpb3VzIHNwYWNlcworICAgIHRvIEVPTCAoY29taW5nIGZyb20gcHJlcHJvY2Vzc29yIG1hY3JvIGV4cGFuc2lvbikuICBBZGRlZCBhIGZhY2lsaXR5CisgICAgdG8gam9pbiB0b2tlbnMgaW4gdGhlIG91dHB1dCBhbmQgcmV3cml0ZSAqLmRmbiB0byB1c2UgdGhpcy4KKyAgRWxpbWluYXRlZCBzY3JpcHRzLyouZGVmIGluIGZhdm9yIG9mIGxpYnBuZy5kZWY7IHVwZGF0ZWQgcHJvamVjdHMvdmlzdWFsYzcxCisgICAgYW5kIHJlbW92ZWQgc2NyaXB0cy9tYWtlZmlsZS5jeWd3aW4uCisgIE1hZGUgUE5HX0JVSUxEX0RMTCBzYWZlOiBpdCBjYW4gYmUgc2V0IHdoZW5ldmVyIGEgRExMIGlzIGJlaW5nIGJ1aWx0LgorICBSZW1vdmVkIHRoZSBpbmNsdWRlIG9mIHN5cy90eXBlcy5oIC0gYXBwYXJlbnRseSB1bm5lY2Vzc2FyeSBub3cgb24gdGhlCisgICAgcGxhdGZvcm1zIG9uIHdoaWNoIGl0IGhhcHBlbmVkIChhbGwgYnV0IE1hYyBPUyBhbmQgUklTQyBPUykuCisgIE1vdmVkIHRoZSBNYWMgT1MgdGVzdCBpbnRvIHBuZ3ByaXYuaCAodGhlIG9ubHkgcGxhY2UgaXQgaXMgdXNlZC4pCisKK1ZlcnNpb24gMS41LjBiZXRhMTUgW01hcmNoIDE3LCAyMDEwXQorICBBZGRlZCBzeW1ib2xzLmNoayB0YXJnZXQgdG8gTWFrZWZpbGUuYW0gdG8gdmFsaWRhdGUgdGhlIHN5bWJvbHMgaW4gcG5nLmgKKyAgICBhZ2FpbnN0IHRoZSBuZXcgREVGIGZpbGUgc2NyaXB0cy9zeW1ib2xzLmRlZi4KKyAgQ2hhbmdlZCB0aGUgZGVmYXVsdCBERUYgZmlsZSBiYWNrIHRvIHBuZ3dpbi5kZWYuCisgIFJlbW92ZWQgbWFrZWZpbGUubWluZ3cuCisgIEVsaW1pbmF0ZWQgUE5HX05PX0VYVEVSTiBhbmQgUE5HX0FMTF9FWFRFUk4KKworVmVyc2lvbiAxLjUuMGJldGExNiBbQXByaWwgMSwgMjAxMF0KKyAgTWFrZSBwbmdfdGV4dF9zdHJ1Y3QgaW5kZXBlbmRlbnQgb2YgUE5HX2lUWHRfU1VQUE9SVEVELCBzbyB0aGF0CisgICAgZmllbGRzIGFyZSBpbml0aWFsaXplZCBpbiBhbGwgY29uZmlndXJhdGlvbnMuICBUaGUgUkVBRC9XUklURQorICAgIG1hY3JvcyAoUE5HXyhSRUFEfFdSSVRFKV9pVFh0X1NVUFBPUlRFRCkgc3RpbGwgZnVuY3Rpb24gYXMKKyAgICBiZWZvcmUgdG8gZGlzYWJsZSBjb2RlIHRvIGFjdHVhbGx5IHJlYWQgb3Igd3JpdGUgaVRYdCBjaHVua3MKKyAgICBhbmQgaVRYdF9TVVBQT1JURUQgY2FuIGJlIHVzZWQgdG8gZGV0ZWN0IHByZXNlbmNlIG9mIGVpdGhlcgorICAgIHJlYWQgb3Igd3JpdGUgc3VwcG9ydCAoYnV0IGl0IGlzIHByb2JhYmx5IGJldHRlciB0byBjaGVjayBmb3IKKyAgICB0aGUgb25lIGFjdHVhbGx5IHJlcXVpcmVkIC0gcmVhZCBvciB3cml0ZS4pCisgIENvbWJpbmVkIG11bHRpcGxlIHBuZ193YXJuaW5nKCkgY2FsbHMgZm9yIGEgc2luZ2xlIGVycm9yLgorICBSZXN0b3JlZCB0aGUgbWFjcm8gZGVmaW5pdGlvbiBvZiBwbmdfY2hlY2tfc2lnKCkuCisKK1ZlcnNpb24gMS41LjBiZXRhMTcgW0FwcmlsIDE3LCAyMDEwXQorICBBZGRlZCBzb21lICIobG9uZykiIHR5cGVjYXN0cyB0byBwcmludGYgY2FsbHMgaW4gcG5nX2hhbmRsZV9jSFJNKCkuCisgIERvY3VtZW50ZWQgdGhlIGZhY3QgdGhhdCBwbmdfc2V0X2RpdGhlcigpIHdhcyBkaXNhYmxlZCBzaW5jZSBsaWJwbmctMS40LjAuCisgIFJlZW5hYmxlZCBwbmdfc2V0X2RpdGhlcigpIGJ1dCByZW5hbWVkIGl0IHRvIHBuZ19zZXRfcXVhbnRpemUoKSB0byByZWZsZWN0CisgICAgbW9yZSBhY2N1cmF0ZWx5IHdoYXQgaXQgYWN0dWFsbHkgZG9lcy4gIEF0IHRoZSBzYW1lIHRpbWUsIHJlbmFtZWQKKyAgICB0aGUgUE5HX0RJVEhFUl9bUkVELEdSRUVOX0JMVUVdX0JJVFMgbWFjcm9zIHRvCisgICAgUE5HX1FVQU5USVpFX1tSRUQsR1JFRU4sQkxVRV1fQklUUy4KKyAgQWRkZWQgc29tZSAiKGxvbmcpIiB0eXBlY2FzdHMgdG8gcHJpbnRmIGNhbGxzIGluIHBuZ19oYW5kbGVfY0hSTSgpLgorICBGcmVlemUgYnVpbGQtdGltZSBvbmx5IGNvbmZpZ3VyYXRpb24gaW4gdGhlIGJ1aWxkLgorICAgIEluIGFsbCBwcmlvciB2ZXJzaW9ucyBvZiBsaWJwbmcgbW9zdCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyAgICBjb250cm9sbGVkIGJ5IGNvbXBpbGVyICNkZWZpbmVzIGhhZCB0byBiZSByZXBlYXRlZCBieSB0aGUKKyAgICBhcHBsaWNhdGlvbiBjb2RlIHRoYXQgdXNlZCBsaWJwbmcuICBUaGlzIHBhdGNoIGNoYW5nZXMgdGhpcworICAgIHNvIHRoYXQgY29tcGlsYXRpb24gb3B0aW9ucyB0aGF0IGNhbiBvbmx5IGJlIGNoYW5nZWQgYXQgYnVpbGQKKyAgICB0aW1lIGFyZSBmcm96ZW4gaW4gdGhlIGJ1aWxkLiAgT3B0aW9ucyB0aGF0IGFyZSBjb21waWxlcgorICAgIGRlcGVuZGVudCAoYW5kIHRob3NlIHRoYXQgYXJlIHN5c3RlbSBkZXBlbmRlbnQpIGFyZSBldmFsdWF0ZWQKKyAgICBlYWNoIHRpbWUgLSBwbmdjb25mLmggaG9sZHMgdGhlc2UuICBPcHRpb25zIHRoYXQgY2FuIGJlIGNoYW5nZWQKKyAgICBwZXItZmlsZSBpbiB0aGUgYXBwbGljYXRpb24gYXJlIGluIHBuZy5oLiAgRnJvemVuIG9wdGlvbnMgYXJlCisgICAgaW4gdGhlIG5ldyBpbnN0YWxsZWQgaGVhZGVyIGZpbGUgcG5nbGliY29uZi5oIChKb2huIEJvd2xlcikKKyAgUmVtb3ZlZCB0aGUgeGNvZGUgcHJvamVjdCBiZWNhdXNlIGl0IGhhcyBub3QgYmVlbiB1cGRhdGVkIHRvIHdvcmsKKyAgICB3aXRoIGxpYnBuZy0xLjUuMC4KKyAgUmVtb3ZlZCB0aGUgYWJpbGl0eSB0byBpbmNsdWRlIG9wdGlvbmFsIHBuZ3Vzci5oCisKK1ZlcnNpb24gMS41LjBiZXRhMTggW0FwcmlsIDE3LCAyMDEwXQorICBSZXN0b3JlZCB0aGUgYWJpbGl0eSB0byBpbmNsdWRlIG9wdGlvbmFsIHBuZ3Vzci5oCisgIE1vdmVkIHJlcGxhY2VtZW50cyBmb3IgcG5nX2Vycm9yKCkgYW5kIHBuZ193YXJuaW5nKCkgZnJvbSB0aGUKKyAgICBjb250cmliL3BuZ21pbmltIHByb2plY3QgdG8gcG5nZXJyb3IuYywgZm9yIHVzZSB3aGVuIHdhcm5pbmdzIG9yCisgICAgZXJyb3JzIGFyZSBkaXNhYmxlZCB2aWEgUE5HX05PX1dBUk4gb3IgUE5HX05PX0VSUk9SX1RFWFQsIHRvIGF2b2lkCisgICAgc3RvcmluZyB1bm5lZWRlZCBlcnJvci93YXJuaW5nIHRleHQuCisgIFVwZGF0ZWQgY29udHJpYi9wbmdtaW5pbSBwcm9qZWN0IHRvIHdvcmsgd2l0aCB0aGUgbmV3IHBuZ2xpYmNvbmYuaAorICBBZGRlZCBzb21lIFBOR19OT18qIGRlZmluZXMgdG8gY29udHJpYi9wbmdtaW5pbS8qL3BuZ3Vzci5oIHRvIHNhdmUgc3BhY2UuCisKK1ZlcnNpb24gMS41LjBiZXRhMTkgW0FwcmlsIDI0LCAyMDEwXQorICBBZGRlZCBQTkdfe1JFQUQsV1JJVEV9X0lOVF9GVU5DVElPTlNfU1VQUE9SVEVELiAgVGhpcyBhbGxvd3MgdGhlIGZ1bmN0aW9ucworICAgIHRvIHJlYWQgYW5kIHdyaXRlIGludHMgdG8gYmUgZGlzYWJsZWQgaW5kZXBlbmRlbnRseSBvZiBQTkdfVVNFX1JFQURfTUFDUk9TLAorICAgIHdoaWNoIGFsbG93cyBsaWJwbmcgdG8gYmUgYnVpbHQgd2l0aCB0aGUgZnVuY3Rpb25zIGV2ZW4gdGhvdWdoIHRoZSBkZWZhdWx0CisgICAgaXMgdG8gdXNlIHRoZSBtYWNyb3MgLSB0aGlzIGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gY2hvb3NlIGF0IGFwcCBidWlsZAorICAgIHRpbWUgd2hldGhlciBvciBub3QgdG8gdXNlIG1hY3JvcyAocHJldmlvdXNseSBpbXBvc3NpYmxlIGJlY2F1c2UgdGhlCisgICAgZnVuY3Rpb25zIHdlcmVuJ3QgaW4gdGhlIGRlZmF1bHQgYnVpbGQuKQorICBDaGFuZ2VkIFdpbmRvd3MgY2FsbGluZyBjb252ZW50aW9uIGJhY2sgdG8gX19jZGVjbCBmb3IgQVBJIGZ1bmN0aW9ucy4KKyAgICBGb3IgV2luZG93cy94ODYgcGxhdGZvcm1zIG9ubHk6CisgICAgICBfX3N0ZGNhbGwgaXMgbm8gbG9uZ2VyIG5lZWRlZCBmb3IgVmlzdWFsIEJhc2ljLCBzbyBsaWJwbmctMS41LjAgdXNlcworICAgICAgX19jZGVjbCB0aHJvdWdob3V0IChib3RoIEFQSSBmdW5jdGlvbnMgYW5kIGNhbGxiYWNrcykgb24gV2luZG93cy94ODYKKyAgICAgIHBsYXRmb3Jtcy4KKyAgUmVwbGFjZWQgdmlzdWFsYzYgYW5kIHZpc3VhbGM3MSBwcm9qZWN0cyB3aXRoIG5ldyB2c3R1ZGlvIHByb2plY3QKKyAgUmVsYXhlZCB0aGUgb3Zlcmx5LXJlc3RyaWN0aXZlIHBlcm1pc3Npb25zIG9mIHNvbWUgZmlsZXMuCisKK1ZlcnNpb24gMS41LjBiZXRhMjAgW0FwcmlsIDI0LCAyMDEwXQorICBSZWxheGVkIG1vcmUgb3Zlcmx5LXJlc3RyaWN0aXZlIHBlcm1pc3Npb25zIG9mIHNvbWUgZmlsZXMuCisKK1ZlcnNpb24gMS41LjBiZXRhMjEgW0FwcmlsIDI3LCAyMDEwXQorICBSZW1vdmVkIHNvbWUgdW53YW50ZWQgYmluYXJ5IGJ5dGVzIGFuZCBjaGFuZ2VkIENSTEYgdG8gTkVXTElORSBpbiB0aGUgbmV3CisgICAgdnN0dWRpbyBwcm9qZWN0IGZpbGVzLCBhbmQgc29tZSB0cml2aWFsIGVkaXRpbmcgb2Ygc29tZSBmaWxlcyBpbiB0aGUKKyAgICBzY3JpcHRzIGRpcmVjdG9yeS4KKyAgU2V0IFBOR19OT19SRUFEX0JHUiwgUE5HX05PX0lPX1NUQVRFLCBhbmQgUE5HX05PX1RJTUVfUkZDMTEyMyBpbgorICAgIGNvbnRyaWIvcG5nbWluaW0vZGVjb2Rlci9wbmd1c3IuaCB0byBtYWtlIGEgc21hbGxlciBkZWNvZGVyIGFwcGxpY2F0aW9uLgorCitWZXJzaW9uIDEuNS4wYmV0YTIyIFtBcHJpbCAyOCwgMjAxMF0KKyAgRml4ZWQgZGVwZW5kZW5jaWVzIG9mIEdFVF9JTlRfMzIgLSBpdCBkb2VzIG5vdCByZXF1aXJlIFJFQURfSU5UX0ZVTkNUSU9OUworICAgIGJlY2F1c2UgaXQgaGFzIGEgbWFjcm8gZXF1aXZhbGVudC4KKyAgSW1wcm92ZWQgdGhlIG9wdGlvbnMuYXdrIHNjcmlwdDsgYWRkZWQgYW4gImV2ZXJ5dGhpbmcgb2ZmIiBvcHRpb24uCisgIFJldmlzZWQgY29udHJpYi9wbmdtaW5pbSB0byB1c2UgdGhlICJldmVyeXRoaW5nIG9mZiIgb3B0aW9uIGluIHBuZ3Vzci5kZmEuCisKK1ZlcnNpb24gMS41LjBiZXRhMjMgW0FwcmlsIDI5LCAyMDEwXQorICBDb3JyZWN0ZWQgUE5HX1JFTU9WRUQgbWFjcm8gdG8gdGFrZSBmaXZlIGFyZ3VtZW50cy4KKyAgICBUaGUgbWFjcm8gd2FzIGRvY3VtZW50ZWQgd2l0aCB0d28gYXJndW1lbnRzIChuYW1lLG9yZGluYWwpLCBob3dldmVyCisgICAgdGhlIHN5bWJvbCBjaGVja2luZyAuZGZuIGZpbGVzIGFzc3VtZWQgZml2ZSBhcmd1bWVudHMuICBUaGUgZml2ZQorICAgIGFyZ3VtZW50IGZvcm0gc2VlbXMgbW9yZSB1c2VmdWwgc28gaXQgaXMgY2hhbmdlZCB0byB0aGF0LgorICBDb3JyZWN0ZWQgUE5HX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCB0byBQTkdfSEFORExFX0FTX1VOS05PV05fU1VQUE9SVEVECisgICAgaW4gZ3JlZ2Jvb2svcmVhZHBuZzIuYworICBDb3JyZWN0ZWQgcHJvdGVjdGlvbiBvZiBwbmdfZ2V0X3VzZXJfdHJhbnNmb3JtX3B0ci4gVGhlIEFQSSBkZWNsYXJhdGlvbiBpbgorICAgIHBuZy5oIGlzIHJlbW92ZWQgaWYgYm90aCBSRUFEIGFuZCBXUklURSBVU0VSX1RSQU5TRk9STSBhcmUgdHVybmVkIG9mZgorICAgIGJ1dCB3YXMgbGVmdCBkZWZpbmVkIGluIHBuZ3RyYW5zLmMKKyAgQWRkZWQgbG9ndW5zdXBwb3J0ZWQ9MSB0byBjYXVzZSBwbmdsaWJjb25mLmggdG8gZG9jdW1lbnQgZGlzYWJsZWQgb3B0aW9ucy4KKyAgICBUaGlzIG1ha2VzIHRoZSBpbnN0YWxsZWQgcG5nbGliY29uZi5oIG1vcmUgcmVhZGFibGUgYnV0IGNhdXNlcyBubworICAgIG90aGVyIGNoYW5nZS4gIFRoZSBpbnRlbnRpb24gaXMgdGhhdCB1c2VycyBvZiBsaWJwbmcgd2lsbCBmaW5kIGl0CisgICAgZWFzaWVyIHRvIHVuZGVyc3RhbmQgaWYgYW4gQVBJIHRoZXkgbmVlZCBpcyBtaXNzaW5nLgorICBJbmNsdWRlIHBuZ19yZXNldF96c3RyZWFtKCkgaW4gcG5nLmMgb25seSB3aGVuIFBOR19SRUFEX1NVUFBPUlRFRCBpcyBkZWZpbmVkLgorICBSZW1vdmVkIGR1bW15X2luZmxhdGUuYyBmcm9tIGNvbnRyaWIvcG5nbWluaW0vZW5jb2RlcgorICBSZW1vdmVkIGNvbnRyaWIvcG5nbWluaW0vKi9nYXRoZXIuc2g7IGdhdGhlcmluZyBpcyBub3cgZG9uZSBpbiB0aGUgbWFrZWZpbGUuCisKK1ZlcnNpb24gMS41LjBiZXRhMjQgW01heSA3LCAyMDEwXQorICBVc2UgYml0d2lzZSAiJiIgaW5zdGVhZCBvZiBhcml0aG1ldGljIG1vZCBpbiBwbmdydXRpbC5jIGNhbGN1bGF0aW9uIG9mIHRoZQorICAgIG9mZnNldCBvZiB0aGUgcG5nX3B0ci0+cm93YnVmIHBvaW50ZXIgaW50byBwbmdfcHRyLT5iaWdfcm93X2J1Zi4KKyAgQWRkZWQgbW9yZSBibGFuayBsaW5lcyBmb3IgcmVhZGFiaWxpdHkuCisKK1ZlcnNpb24gMS41LjBiZXRhMjUgW0p1bmUgMTgsIDIwMTBdCisgIEluIHBuZ3ByZWFkLmM6IHBuZ19wdXNoX2hhdmVfcm93KCkgYWRkIGNoZWNrIGZvciBuZXdfcm93ID4gaGVpZ2h0CisgIFJlbW92ZWQgdGhlIG5vdy1yZWR1bmRhbnQgY2hlY2sgZm9yIG91dC1vZi1ib3VuZHMgbmV3X3JvdyBmcm9tIGV4YW1wbGUuYworCitWZXJzaW9uIDEuNS4wYmV0YTI2IFtKdW5lIDE4LCAyMDEwXQorICBJbiBwbmdwcmVhZC5jOiBwbmdfcHVzaF9wcm9jZXNzX3JvdygpIGFkZCBjaGVjayBmb3IgdG9vIG1hbnkgcm93cy4KKworVmVyc2lvbiAxLjUuMGJldGEyNyBbSnVuZSAxOCwgMjAxMF0KKyAgUmVtb3ZlZCB0aGUgY2hlY2sgYWRkZWQgaW4gYmV0YTI1IGFzIGl0IGlzIG5vdyByZWR1bmRhbnQuCisKK1ZlcnNpb24gMS41LjBiZXRhMjggW0p1bmUgMjAsIDIwMTBdCisgIFJld3JvdGUgcG5nX3Byb2Nlc3NfSURBVF9kYXRhIHRvIGNvbnNpc3RlbnRseSB0cmVhdCBleHRyYSBkYXRhIGFzIHdhcm5pbmdzCisgICAgYW5kIGhhbmRsZSBlbmQgY29uZGl0aW9ucyBtb3JlIGNsZWFubHkuCisgIFJlbW92ZWQgdGhlIG5ldyAoYmV0YTI2KSBjaGVjayBpbiBwbmdfcHVzaF9wcm9jZXNzX3JvdygpLgorCitWZXJzaW9uIDEuNS4wYmV0YTI5IFtKdW5lIDIxLCAyMDEwXQorICBSZXZpc2VkIHNjcmlwdHMvb3B0aW9ucy5hd2sgdG8gd29yayBvbiBTdW5vcyAoYnV0IHN0aWxsIGRvZXNuJ3Qgd29yaykKKyAgQWRkZWQgY29tbWVudCB0byBvcHRpb25zLmF3ayBhbmQgY29udHJpYi9wbmdtaW5pbS8qL21ha2VmaWxlIHRvIHRyeSBuYXdrLgorCitWZXJzaW9uIDEuNS4wYmV0YTMwIFtKdW5lIDIyLCAyMDEwXQorICBTdG9wIG1lbW9yeSBsZWFrIHdoZW4gcmVhZGluZyBhIG1hbGZvcm1lZCBzQ0FMIGNodW5rLgorCitWZXJzaW9uIDEuNS4wYmV0YTMxIFtKdW5lIDI2LCAyMDEwXQorICBSZXZpc2VkIHBuZ3ByZWFkLmMgcGF0Y2ggb2YgYmV0YTI4IHRvIGF2b2lkIGFuIGVuZGxlc3MgbG9vcC4KKyAgUmVtb3ZlZCBzb21lIHRyYWlsaW5nIGJsYW5rcy4KKworVmVyc2lvbiAxLjUuMGJldGEzMiBbSnVuZSAyNiwgMjAxMF0KKyAgUmVtb3ZlZCBsZWZ0b3ZlciBzY3JpcHRzL29wdGlvbnMucGF0Y2ggYW5kIHNjcmlwdHMvb3B0aW9ucy5yZWoKKworVmVyc2lvbiAxLjUuMGJldGEzMyBbSnVseSA2LCAzMDEwXQorICBNYWRlIEZJWEVEIGFuZCBGTE9BVElORyBvcHRpb25zIGNvbnNpc3RlbnQgaW4gdGhlIEFQSXMgdGhleSBlbmFibGUgYW5kCisgICAgZGlzYWJsZS4gIENvcnJlY3RlZCBzY3JpcHRzL29wdGlvbnMuYXdrIHRvIGhhbmRsZSBib3RoIGNvbW1hbmQgbGluZQorICAgIG9wdGlvbnMgYW5kIG9wdGlvbnMgc3BlY2lmaWVkIGluIHRoZSAuZGZhIGZpbGVzLgorICBDaGFuZ2VkIGNoYXIgKm1zZyB0byBQTkdfQ09OU1QgY2hhciAqbXNnIGluIHBuZ3J1dGlsLmMKKyAgTWFrZSBwbmdfc2V0X3NSR0JfZ0FNQV9hbmRfY0hSTSBzZXQgdmFsdWVzIHVzaW5nIGVpdGhlciB0aGUgZml4ZWQgb3IKKyAgICBmbG9hdGluZyBwb2ludCBBUElzLCBidXQgbm90IGJvdGguCisgIFJldmVyc2VkIHBhdGNoIHRvIHJlbW92ZSBlcnJvciBoYW5kbGVyIHdoZW4gdGhlIGptcF9idWYgaXMgc3RvcmVkIGluIHRoZQorICAgIG1haW4gcHJvZ3JhbSBzdHJ1Y3R1cmUsIG5vdCB0aGUgcG5nX3N0cnVjdC4KKyAgICBUaGUgZXJyb3IgaGFuZGxlciBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgZGVmYXVsdCBoYW5kbGVyIGluIGxpYnBuZyB3aWxsCisgICAgYWx3YXlzIHVzZSB0aGUgam1wX2J1ZiBpbiB0aGUgbGlicmFyeSBjb250cm9sIHN0cnVjdHVyZTsgdGhpcyBpcyBuZXZlcgorICAgIHNldC4gIFRoZSBncmVnYm9vayBjb2RlIGlzIGEgdXNlZnVsIGV4YW1wbGUgYmVjYXVzZSwgZXZlbiB0aG91Z2ggaXQKKyAgICB1c2VzIHNldGptcC9sb25nam1wLCBpdCBzaG93cyBob3cgZXJyb3IgaGFuZGxpbmcgY2FuIGJlIGltcGxlbWVudGVkCisgICAgdXNpbmcgY29udHJvbCBtZWNoYW5pc21zIG5vdCBkaXJlY3RseSBzdXBwb3J0ZWQgYnkgbGlicG5nLiAgVGhlCisgICAgdGVjaG5pcXVlIHdpbGwgd29yayBjb3JyZWN0bHkgd2l0aCBtZWNoYW5pc21zIHN1Y2ggYXMgTWljcm9zb2Z0CisgICAgU3RydWN0dXJlIEV4Y2VwdGlvbnMgb3IgQysrIGV4Y2VwdGlvbnMgKGNvbXBpbGVyIHdpbGxpbmcgLSBub3RlIHRoYXQgZ2NjCisgICAgZG9lcyBub3QgYnkgZGVmYXVsdCBzdXBwb3J0IGludGVyd29ya2luZyBvZiBDIGFuZCBDKysgZXJyb3IgaGFuZGxpbmcuKQorICBSZXZlcnRlZCBjaGFuZ2VzIHRvIGNhbGwgcG5nX2xvbmdqbXAgaW4gY29udHJpYi9ncmVnYm9vayB3aGVyZSBpdCBpcyBub3QKKyAgICBhcHByb3ByaWF0ZS4gIElmIG1haW5wcm9nLT5qbXBidWYgaXMgdXNlZCBieSBzZXRqbXAsIHRoZW4gcG5nX2xvbmdqbXAKKyAgICBjYW5ub3QgYmUgdXNlZC4KKyAgQ2hhbmdlZCAiZXh0ZXJuIFBOR19FWFBPUlQiIHRvICJQTkdfRVhQT1JUIiBpbiBwbmcuaCAoSmFuIE5panRtYW5zKQorICBDaGFuZ2VkICJleHRlcm4iIHRvICJQTkdfRVhURVJOIiBpbiBwbmdwcml2LmggKGV4Y2VwdCBmb3IgdGhlICdleHRlcm4gIkMiIHsnKQorCitWZXJzaW9uIDEuNS4wYmV0YTM0IFtKdWx5IDEyLCAyMDEwXQorICBQdXQgI2lmbmRlZiBQTkdfRVhURVJOLCAjZW5kaWYgYXJvdW5kIHRoZSBkZWZpbmUgUE5HX0VYVEVSTiBpbiBwbmdwcml2LmgKKworVmVyc2lvbiAxLjUuMGJldGEzNSBbSnVseSAyNCwgMjAxMF0KKyAgUmVtb3ZlZCBzb21lIG5ld2x5LWFkZGVkIFRBQiBjaGFyYWN0ZXJzLgorICBBZGRlZCAtRE5PX1BOR19TTlBSSU5URiB0byBDRkxBR1MgaW4gc2NyaXB0cy9tYWtlZmlsZS5kajIKKyAgTW92ZWQgdGhlIGRlZmluaXRpb24gb2YgcG5nX3NucHJpbnRmKCkgb3V0c2lkZSBvZiB0aGUgZW5jbG9zaW5nCisgICAgI2lmZGVmIGJsb2NrcyBpbiBwbmdjb25mLmgKKworVmVyc2lvbiAxLjUuMGJldGEzNiBbSnVseSAyOSwgMjAxMF0KKyAgUGF0Y2hlcyBieSBKb2huIEJvd2xlcjoKKyAgRml4ZWQgcG9pbnQgQVBJcyBhcmUgbm93IHN1cHBvcnRlZCB0aHJvdWdob3V0IChubyBtaXNzaW5nIEFQSXMpLgorICBJbnRlcm5hbCBmaXhlZCBwb2ludCBhcml0aG1ldGljIHN1cHBvcnQgZXhpc3RzIGZvciBhbGwgaW50ZXJuYWwgZmxvYXRpbmcKKyAgICBwb2ludCBvcGVyYXRpb25zLgorICBzQ0FMIHZhbGlkYXRlcyB0aGUgZmxvYXRpbmcgcG9pbnQgc3RyaW5ncyBpdCBpcyBwYXNzZWQuCisgIFNhZmUsIGFsYmVpdCBydWRpbWVudGFyeSwgV2F0Y29tIHN1cHBvcnQgaXMgcHJvdmlkZWQgYnkgUE5HX0FQSV9SVUxFPT0yCisgIFR3byBuZXcgQVBJcyBleGlzdCB0byBnZXQgdGhlIG51bWJlciBvZiBwYXNzZXMgd2l0aG91dCB0dXJuaW5nIG9uIHRoZQorICAgIFBOR19JTlRFUkxBQ0UgdHJhbnNmb3JtIGFuZCB0byBnZXQgdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBjdXJyZW50CisgICAgcGFzcy4KKyAgQSBuZXcgdGVzdCBwcm9ncmFtLCBwbmd2YWxpZC5jLCB2YWxpZGF0ZXMgdGhlIGdhbW1hIGNvZGUuCisgIEVycm9ycyBpbiB0aGUgMTYtYml0IGdhbW1hIGNvcnJlY3Rpb24gKG92ZXJmbG93cykgaGF2ZSBiZWVuIGNvcnJlY3RlZC4KKyAgY0hSTSBjaHVuayB0ZXN0aW5nIGlzIGRvbmUgY29uc2lzdGVudGx5IChwcmV2aW91c2x5IHRoZSBmbG9hdGluZyBwb2ludAorICAgIEFQSSBieXBhc3NlZCBpdCwgYmVjYXVzZSB0aGUgdGVzdCByZWFsbHkgZGlkbid0IHdvcmsgb24gRlAsIG5vdyB0aGUgdGVzdAorICAgIGlzIHBlcmZvcm1lZCBvbiB0aGUgYWN0dWFsIHZhbHVlcyB0byBiZSBzdG9yZWQgaW4gdGhlIFBORyBmaWxlIHNvIGl0CisgICAgd29ya3MgaW4gdGhlIEZQIGNhc2UgdG9vLikKKyAgTW9zdCBmbG9hdGluZyBwb2ludCBBUElzIG5vdyBzaW1wbHkgY2FsbCB0aGUgZml4ZWQgcG9pbnQgQVBJcyBhZnRlcgorICAgIGNvbnZlcnRpbmcgdGhlIHZhbHVlcyB0byB0aGUgZml4ZWQgcG9pbnQgZm9ybSB1c2VkIGluIHRoZSBQTkcgZmlsZS4KKyAgVGhlIHN0YW5kYXJkIGhlYWRlcnMgbm8gbG9uZ2VyIGluY2x1ZGUgemxpYi5oLCB3aGljaCBpcyBjdXJyZW50bHkgb25seQorICAgIHJlcXVpcmVkIGZvciBwbmdzdHJ1Y3QuaCBhbmQgY2FuIHRoZXJlZm9yZSBiZSBpbnRlcm5hbC4KKyAgUmV2aXNlZCBwbmdfZ2V0X2ludF8zMiB0byB1bmRvIHRoZSBQTkcgdHdvJ3MgY29tcGxlbWVudCByZXByZXNlbnRhdGlvbiBvZgorICAgIG5lZ2F0aXZlIG51bWJlcnMuCisKK1ZlcnNpb24gMS41LjBiZXRhMzcgW0p1bHkgMzAsIDIwMTBdCisgIEFkZGVkIGEgdHlwZWNhc3QgaW4gcG5nX2dldF9pbnRfMzIoKSBpbiBwbmcuaCBhbmQgcG5ncnV0aWwuaCB0byBhdm9pZAorICAgIGEgY29tcGlsZXIgd2FybmluZy4KKyAgUmVwbGFjZWQgb0ZGcyAwLDAgd2l0aCBvRkZzIC0xMCwyMCBpbiBwbmd0ZXN0LnBuZworCitWZXJzaW9uIDEuNS4wYmV0YTM4IFtKdWx5IDMxLCAyMDEwXQorICBJbXBsZW1lbnRlZCByZW1haW5pbmcgIl9maXhlZCIgZnVuY3Rpb25zLgorICBDb3JyZWN0ZWQgYSBudW1iZXIgb2YgcmVjZW50bHkgaW50cm9kdWNlZCB3YXJuaW5ncyBtb3N0bHkgcmVzdWx0aW5nIGZyb20KKyAgICBzYWZlIGJ1dCB1bmNhc3QgYXNzaWdubWVudHMgdG8gc2hvcnRlciBpbnRlZ2Vycy4gIEFsc28gYWRkZWQgYSB6bGliCisgICAgVlN0dWRpbyByZWxlYXNlIGxpYnJhcnkgcHJvamVjdCBiZWNhdXNlIHRoZSBsYXRlc3QgemxpYiBPZmZpY2lhbCBXaW5kb3dzCisgICAgYnVpbGQgZG9lcyBub3QgaW5jbHVkZSBzdWNoIGEgdGhpbmcuCisgIFJldmlzZWQgcG5nX2dldF9pbnRfMTYoKSB0byBiZSBzaW1pbGFyIHRvIHBuZ19nZXRfaW50XzMyKCkuCisgIFJlc3RvcmVkIHByb2plY3RzL3Zpc3VhbGM3MS4KKworVmVyc2lvbiAxLjUuMGJldGEzOSBbQXVndXN0IDIsIDIwMTBdCisgIFZpc3VhbEMvR0NDIHdhcm5pbmcgZml4ZXMsIFZpc3VhbEMgYnVpbGQgZml4ZXMKKyAgVGhlIGNoYW5nZXMgaW5jbHVkZSBzdXBwb3J0IGZvciBmdW5jdGlvbiBhdHRyaWJ1dGVzIGluIFZDIGluIGFkZGl0aW9uIHRvCisgICAgdGhvc2UgYWxyZWFkeSBwcmVzZW50IGluIEdDQyAtIG5lY2Vzc2FyeSBiZWNhdXNlIHdpdGhvdXQgdGhlc2Ugc29tZQorICAgIHdhcm5pbmdzIGFyZSB1bmF2b2lkYWJsZS4gIEZpeGVzIGluY2x1ZGUgc2lnbmVkL3Vuc2lnbmVkIGZpeGVzIGluCisgICAgcG5ndmFsaWQgYW5kIGNoZWNrcyB3aXRoIGdjYyAtV2FsbCAtV2V4dHJhIC1XdW51c2VkLgorICBWQyByZXF1aXJlcyBmdW5jdGlvbiBhdHRyaWJ1dGVzIG9uIGZ1bmN0aW9uIGRlZmluaXRpb25zIGFzIHdlbGwgYXMKKyAgICBkZWNsYXJhdGlvbnMsIFBOR19GVU5DVElPTiBoYXMgYmVlbiBhZGRlZCB0byBlbmFibGUgdGhpcyBhbmQgdGhlCisgICAgcmVsZXZhbnQgZnVuY3Rpb24gZGVmaW5pdGlvbnMgY2hhbmdlZC4KKworVmVyc2lvbiAxLjUuMGJldGE0MCBbQXVndXN0IDYsIDIwMTBdCisgIENvcnJlY3QgdXNlIG9mIF9XSU5ET1dTXyBpbiBwbmdjb25mLmgKKyAgUmVtb3ZlZCBwbmdfbWVtXyAjZGVmaW5lczsgdGhleSBhcmUgbm8gbG9uZ2VyIHVzZWQuCisgIEFkZGVkIHRoZSBzUkdCIGNodW5rIHRvIHBuZ3Rlc3QucG5nCisKK1ZlcnNpb24gMS41LjBiZXRhNDEgW0F1Z3VzdCAxMSwgMjAxMF0KKyAgQWRkZWQgdGhlIGNIUk0gY2h1bmsgdG8gcG5ndGVzdC5wbmcKKyAgRG9uJ3QgdHJ5IHRvIHVzZSB2ZXJzaW9uLXNjcmlwdCB3aXRoIGN5Z3dpbi9taW5ndy4KKyAgUmV2aXNlZCBjb250cmliL2dyZWdib29rIHRvIHdvcmsgdW5kZXIgY3lnd2luL21pbmd3LgorCitWZXJzaW9uIDEuNS4wYmV0YTQyIFtBdWd1c3QgMTgsIDIwMTBdCisgIEFkZCAuZGxsLmEgdG8gdGhlIGxpc3Qgb2YgZXh0ZW5zaW9ucyB0byBiZSBzeW1saW5rZWQgYnkgTWFrZWZpbGUuYW0gKFlhYWtvdikKKyAgTWFkZSBhbGwgQVBJIGZ1bmN0aW9ucyB0aGF0IGhhdmUgY29uc3QgYXJndW1lbnRzIGFuZCBjb25zdGFudCBzdHJpbmcKKyAgICBsaXRlcmFsIHBvaW50ZXJzIGRlY2xhcmUgdGhlbSAoSm9obiBCb3dsZXIpLgorCitWZXJzaW9uIDEuNS4wYmV0YTQzIFtBdWd1c3QgMjAsIDIwMTBdCisgIFJlbW92ZWQgc3B1cmlvdXMgdGFicywgc2hvcnRlbiBsb25nIGxpbmVzIChubyBzb3VyY2UgY2hhbmdlKQorICAgIEFsc28gYWRkZWQgc2NyaXB0cy9jaGtmbXQgdG8gdmFsaWRhdGUgdGhlIGZvcm1hdCBvZiBhbGwgdGhlIGZpbGVzIHRoYXQgY2FuCisgICAgcmVhc29uYWJseSBiZSB2YWxpZGF0ZWQgKGl0IGlzIHN1Z2dlc3RlZCB0byBydW4gIm1ha2UgZGlzdGNsZWFuIiBiZWZvcmUKKyAgICBjaGVja2luZywgYmVjYXVzZSBzb21lIG1hY2hpbmUgZ2VuZXJhdGVkIGZpbGVzIGhhdmUgbG9uZyBsaW5lcy4pCisgIFJlZm9ybWF0dGVkIHRoZSBDSEFOR0VTIGZpbGUgdG8gYmUgbW9yZSBjb25zaXN0ZW50IHRocm91Z2hvdXQuCisgIE1hZGUgY2hhbmdlcyB0byBhZGRyZXNzIHZhcmlvdXMgaXNzdWVzIGlkZW50aWZpZWQgYnkgR0NDLCBtb3N0bHkKKyAgICBzaWduZWQvdW5zaWduZWQgYW5kIHNob3J0ZW5pbmcgcHJvYmxlbXMgb24gYXNzaWdubWVudCBidXQgYWxzbyBhIGZldworICAgIGRpZmZpY3VsdCB0byBvcHRpbWl6ZSAoZm9yIEdDQykgbG9vcHMuCisgIEZpeGVkIG5vbi1HQ0MgZml4ZWQgcG9pbnQgYnVpbGRzLiAgSW4gcG5nLmMgYSBkZWNsYXJhdGlvbiB3YXMgbWlzcGxhY2VkCisgICAgaW4gYW4gZWFybGllciB1cGRhdGUuICBGaXhlZCB0byBkZWNsYXJlIHRoZSBhdXRvIHZhcmlhYmxlcyBhdCB0aGUgaGVhZC4KKyAgVXNlIGNleGNlcHQuaCBpbiBwbmd2YWxpZC5jLgorCitWZXJzaW9uIDEuNS4wYmV0YTQ0IFtBdWd1c3QgMjQsIDIwMTBdCisgIFVwZGF0ZWQgQ01ha2VMaXN0cy50eHQgdG8gdXNlIENNQUtFX0lOU1RBTExfTElCRElSIHZhcmlhYmxlOyB1c2VmdWwgZm9yCisgICAgaW5zdGFsbGluZyBsaWJwbmcgaW4gL3Vzci9saWI2NCAoRnVuZGEgV2FuZykuCisgIFJldmlzZWQgQ01ha2VMaXN0cy50eHQgdG8gcHV0IHRoZSBtYW4gcGFnZXMgaW4gc2hhcmUvbWFuL21hbiogbm90IG1hbi9tYW4qCisgIFJldmlzZWQgQ01ha2VMaXN0cy50eHQgdG8gbWFrZSBzeW1saW5rcyBpbnN0ZWFkIG9mIGNvcGllcyB3aGVuIGluc3RhbGxpbmcuCisgIENoYW5nZWQgUE5HX0xJQl9OQU1FIGZyb20gcG5nTk4gdG8gbGlicG5nTk4gaW4gQ01ha2VMaXN0cy50eHQgKFBoaWxpcCBMb3dtYW4pCisgIEltcGxlbWVudGVkIG1lbW9yeSBjaGVja3Mgd2l0aGluIHBuZ3ZhbGlkCisgIFJlZm9ybWF0dGVkL3JlYXJyYW5nZWQgcG5ndmFsaWQuYyB0byBhc3Npc3QgdXNlIG9mIHByb2dyZXNzaXZlIHJlYWRlci4KKyAgQ2hlY2sgaW50ZXJsYWNlZCBpbWFnZXMgaW4gcG5ndmFsaWQKKyAgQ2xhcmlmaWVkIHBuZ3Vzci5oIGNvbW1lbnRzIGluIHBuZ2xpYmNvbmYuZGZhCisgIFNpbXBsaWZpZWQgdGhlIHBuZ3ZhbGlkIGVycm9yLWhhbmRsaW5nIGNvZGUgbm93IHRoYXQgY2V4Y2VwdC5oIGlzIGluIHBsYWNlLgorICBJbXBsZW1lbnRlZCBwcm9ncmVzc2l2ZSByZWFkZXIgaW4gcG5ndmFsaWQuYyBmb3Igc3RhbmRhcmQgdGVzdHMKKyAgSW1wbGVtZW50ZWQgcHJvZ3Jlc3NpdmUgcmVhZCBpbiBwbmd2YWxpZC5jIGdhbW1hIHRlc3RzCisgIFR1cm4gb24gcHJvZ3Jlc3NpdmUgcmVhZGVyIGluIHBuZ3ZhbGlkLmMgYnkgZGVmYXVsdCBhbmQgdGlkeSBjb2RlLgorCitWZXJzaW9uIDEuNS4wYmV0YTQ1IFtBdWd1c3QgMjYsIDIwMTBdCisgIEFkZGVkIGFuIGV4cGxpY2l0IG1ha2Ugc3RlcCB0byBwcm9qZWN0cy92c3R1ZGlvIGZvciBwbmdsaWJjb25mLmgKKyAgICBBbHNvIGNvcnJlY3RlZCB6bGliLnZjeHByb2ogaW50byB3aGljaCBWaXN1YWwgU3R1ZGlvIGhhZCBpbnRyb2R1Y2VkCisgICAgd2hhdCBpdCBjYWxscyBhbiAiYXV0aG9yaW5nIGVycm9yIi4gIFRoZSBjaGFuZ2UgdG8gbWFrZSBwbmdsaWJjb25mLmgKKyAgICBzaW1wbHkgY29waWVzIHRoZSBmaWxlOyBpbiB0aGUgZnV0dXJlIGl0IG1heSBhY3R1YWxseSBnZW5lcmF0ZSB0aGUKKyAgICBmaWxlIGZyb20gc2NyaXB0cy9wbmdsaWJjb25mLmRmYSBhcyB0aGUgb3RoZXIgYnVpbGQgc3lzdGVtcyBkby4KKyAgQ2hhbmdlZCBwbmd2YWxpZCB0byB3b3JrIHdoZW4gZmxvYXRpbmcgcG9pbnQgQVBJcyBhcmUgZGlzYWJsZWQKKyAgUmVuYW1lZCB0aGUgcHJlYnVpbHQgc2NyaXB0cy9wbmdsaWJjb25mLmggdG8gc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQKKyAgU3VwcGx5IGRlZmF1bHQgdmFsdWVzIGZvciBQTkdfVVNFUl9QUklWQVRFQlVJTEQgYW5kIFBOR19VU0VSX0RMTEZOQU1FX1BPU1RGSVgKKyAgICBpbiBwbmdwcml2LmggaW4gY2FzZSB0aGUgdXNlciBuZWdsZWN0ZWQgdG8gZGVmaW5lIHRoZW0gaW4gdGhlaXIgcG5ndXNyLmgKKworVmVyc2lvbiAxLjUuMGJldGE0NiBbQXVndXN0IDI4LCAyMDEwXQorICBBZGRlZCBuZXcgcHJpdmF0ZSBoZWFkZXIgZmlsZXMgdG8gbGlicG5nX3NvdXJjZXMgaW4gQ01ha2VMaXN0cy50eHQKKyAgQWRkZWQgUE5HX1JFQURfMTZCSVQsIFBOR19XUklURV8xNkJJVCwgYW5kIFBOR18xNkJJVCBvcHRpb25zLgorICBBZGRlZCByZWZlcmVuY2UgdG8gc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQgaW4gdGhlIHZpc3VhbGM3MSBwcm9qZWN0LgorCitWZXJzaW9uIDEuNS4wYmV0YTQ3IFtTZXB0ZW1iZXIgMTEsIDIwMTBdCisgIEZpeGVkIGEgbnVtYmVyIG9mIHByb2JsZW1zIHdpdGggNjQtYml0IGNvbXBpbGF0aW9uIHJlcG9ydGVkIGJ5IFZpc3VhbAorICAgIFN0dWRpbyAyMDEwIChKb2huIEJvd2xlcikuCisKK1ZlcnNpb24gMS41LjBiZXRhNDggW09jdG9iZXIgNCwgMjAxMF0KKyAgVXBkYXRlZCBDTWFrZUxpc3RzLnR4dCAoUGhpbGlwIExvd21hbikuCisgIFJldmlzZWQgYXV0b2dlbi5zaCB0byByZWNvZ25pemUgYW5kIHVzZSAkQVVUT0NPTkYsICRBVVRPTUFLRSwgJEFVVE9IRUFERVIsCisgICAgJEFVVE9QT0lOVCwgJEFDTE9DQUwgYW5kICRMSUJUT09MSVpFCisgIEZpeGVkIHByb2JsZW0gd2l0aCBzeW1ib2xzIGNyZWF0aW9uIGluIE1ha2VmaWxlLmFtIHdoaWNoIHdhcyBhc3N1bWluZyB0aGF0CisgICAgYWxsIHZlcnNpb25zIG9mIGNjcCB3cml0ZSB0byBzdGFuZGFyZCBvdXRwdXQgYnkgZGVmYXVsdCAoTWFydGluIEJhbmt5KS4gVGhlCisgICAgYnVnIHdhcyBpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjIuOWJldGE1LgorICBSZW1vdmVkIHVudXNlZCBta2luc3RhbGxkaXJzLgorCitWZXJzaW9uIDEuNS4wYmV0YTQ5IFtPY3RvYmVyIDgsIDIwMTBdCisgIFVuZGlkIE1ha2VmaWxlLmFtIHJldmlzaW9uIG9mIDEuNS4wYmV0YTQ4LgorCitWZXJzaW9uIDEuNS4wYmV0YTUwIFtPY3RvYmVyIDE0LCAyMDEwXQorICBSZXZpc2VkIE1ha2VmaWxlLmluIHRvIGFjY291bnQgZm9yIG1raW5zdGFsbGRpcnMgYmVpbmcgcmVtb3ZlZC4KKyAgQWRkZWQgc29tZSAiKHVuc2lnbmVkIGxvbmcpIiB0eXBlY2FzdHMgaW4gcHJpbnRmIHN0YXRlbWVudHMgaW4gcG5ndmFsaWQuYy4KKyAgU3VwcHJlc3NlZCBhIGNvbXBpbGVyIHdhcm5pbmcgaW4gcG5nX2hhbmRsZV9zUExUKCkuCisgIENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgdGV4dCBjb21wcmVzc2lvbiBtb2RlIGluIHBuZ19zZXRfdGV4dCgpLgorCitWZXJzaW9uIDEuNS4wYmV0YTUxIFtPY3RvYmVyIDE1LCAyMDEwXQorICBDaGFuZ2VkIGVtYmVkZGVkIGRhdGVzIHRvICIoUEVORElORyBSRUxFQVNFKSBpbiBiZXRhIHJlbGVhc2VzIChhbmQgZnV0dXJlCisgICAgcmMgcmVsZWFzZXMpIHRvIG1pbmltaXplIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gcmVsZWFzZXMuCisKK1ZlcnNpb24gMS41LjBiZXRhNTIgW09jdG9iZXIgMTYsIDIwMTBdCisgIFJlc3RvcmVkIHNvbWUgb2YgdGhlIGVtYmVkZGVkIGRhdGVzIChpbiBwbmcuaCwgcG5nLmMsIGRvY3VtZW50YXRpb24sIGV0Yy4pCisKK1ZlcnNpb24gMS41LjBiZXRhNTMgW09jdG9iZXIgMTgsIDIwMTBdCisgIFVwZGF0ZWQgSU5TVEFMTCB0byBtZW50aW9uIHVzaW5nICJtYWtlIG1haW50YWluZXItY2xlYW4iIGFuZCB0byByZW1vdmUKKyAgICBvYnNvbGV0ZSBzdGF0ZW1lbnQgYWJvdXQgYSBjdXN0b20gbHRtYWluLnNoCisgIERpc2FibGVkICJjb2xvci10ZXN0cyIgYnkgZGVmYXVsdCBpbiBNYWtlZmlsZS5hbSBzbyBpdCB3aWxsIHdvcmsgd2l0aAorICAgIGF1dG9tYWtlIHZlcnNpb25zIGVhcmxpZXIgdGhhbiAxLjExLjEKKyAgVXNlIGRvY3VtZW50IG5hbWUgImxpYnBuZy1tYW51YWwudHh0IiBpbnN0ZWFkIG9mICJsaWJwbmctPHZlcnNpb24+LnR4dCIKKyAgICB0byBzaW1wbGlmeSB2ZXJzaW9uIGRpZmZlcmVuY2VzLgorICBSZW1vdmVkIG9ic29sZXRlIHJlbWFya3MgYWJvdXQgc2V0am1wIGhhbmRsaW5nIGZyb20gSU5TVEFMTC4KKyAgUmV2aXNlZCBhbmQgcmVuYW1lZCB0aGUgdHlwZWRlZiBpbiBwbmcuaCBhbmQgcG5nLmMgdGhhdCB3YXMgZGVzaWduZWQKKyAgICB0byBjYXRjaCBsaWJyYXJ5IGFuZCBoZWFkZXIgbWlzbWF0Y2guCisKK1ZlcnNpb24gMS41LjBiZXRhNTQgW05vdmVtYmVyIDEwLCAyMDEwXQorICBSZXF1aXJlIDQ4IGJ5dGVzLCBub3QgNjQgYnl0ZXMsIGZvciBiaWdfcm93X2J1ZiBpbiBvdmVyZmxvdyBjaGVja3MuCisgIFVzZWQgYSBjb25zaXN0ZW50IHN0cnVjdHVyZSBmb3IgdGhlIHBuZ2dldC5jIGZ1bmN0aW9ucy4KKworVmVyc2lvbiAxLjUuMGJldGE1NSBbTm92ZW1iZXIgMjEsIDIwMTBdCisgIFJldmlzZWQgcG5nX2dldF91aW50XzMyLCBwbmdfZ2V0X2ludF8zMiwgcG5nX2dldF91aW50XzE2IChDb3NtaW4pCisgIE1vdmVkIHJlYWRpbmcgb2YgZmlsZSBzaWduYXR1cmUgaW50byBwbmdfcmVhZF9zaWcgKENvc21pbikKKyAgRml4ZWQgYXRvbWljaXR5IG9mIGNodW5rIGhlYWRlciBzZXJpYWxpemF0aW9uIChDb3NtaW4pCisgIEFkZGVkIHRlc3QgZm9yIGlvX3N0YXRlIGluIHBuZ3Rlc3QuYyAoQ29zbWluKQorICBBZGRlZCAiIyEvYmluL3NoIiBhdCB0aGUgdG9wIG9mIGNvbnRyaWIvcG5nbWluaW0vKi9nYXRoZXIuc2ggc2NyaXB0cy4KKyAgQ2hhbmdlcyB0byByZW1vdmUgZ2NjIHdhcm5pbmdzIChKb2huIEJvd2xlcikKKyAgICBDZXJ0YWluIG9wdGlvbmFsIGdjYyB3YXJuaW5nIGZsYWdzIHJlc3VsdGVkIGluIHdhcm5pbmdzIGluIGxpYnBuZyBjb2RlLgorICAgIFdpdGggdGhlc2UgY2hhbmdlcyBvbmx5IC1XY29udmVyc2lvbiBhbmQgLVdjYXN0LXF1YWwgY2Fubm90IGJlIHR1cm5lZCBvbi4KKyAgICBDaGFuZ2VzIGFyZSB0cml2aWFsIHJlYXJyYW5nZW1lbnRzIG9mIGNvZGUuICAtV2NvbnZlcnNpb24gaXMgbm90IHBvc3NpYmxlCisgICAgZm9yIHBuZ3J1dGlsLmMgKGJlY2F1c2Ugb2YgdGhlIHdpZGVzcHJlYWQgdXNlIG9mICs9IGV0IGFsIG9uIHZhcmlhYmxlcworICAgIHNtYWxsZXIgdGhhbiAoaW50KSBvciAodW5zaWduZWQgaW50KSkgYW5kIC1XY2FzdC1xdWFsIGlzIG5vdCBwb3NzaWJsZQorICAgIHdpdGggcG5nd2lvLmMgYW5kIHBuZ3d1dGlsLmMgYmVjYXVzZSB0aGUgJ3dyaXRlJyBjYWxsYmFjayBhbmQgemxpYgorICAgIGNvbXByZXNzaW9uIGJvdGggZmFpbCB0byBkZWNsYXJlIHRoZWlyIGlucHV0IGJ1ZmZlcnMgd2l0aCAnY29uc3QnLgorCitWZXJzaW9uIDEuNS4wYmV0YTU2IFtEZWNlbWJlciA3LCAyMDEwXQorICBBZGRlZCB0aGUgcHJpdmF0ZSBQTkdfVU5VU0VEKCkgbWFjcm8gZGVmaW5pdGlvbiBpbiBwbmdwcml2LmguCisgIEFkZGVkIHNvbWUgY29tbWVudGFyeSBhYm91dCBQTkdfRVhQT1JUIGluIHBuZy5oIGFuZCBwbmdjb25mLmgKKyAgUmV2aXNlZCBQTkdfRVhQT1JUKCkgbWFjcm8gYW5kIGFkZGVkIFBOR19FWFBPUlRBKCkgbWFjcm8sIHdpdGggdGhlCisgICAgb2JqZWN0aXZlIG9mIHNpbXBsaWZ5aW5nIGFuZCBpbXByb3ZpbmcgdGhlIGNvc21ldGljIGFwcGVhcmFuY2Ugb2YgcG5nLmguCisgIEZpeGVkIHNvbWUgaW5jb3JyZWN0ICI9IiBtYWNybyBuYW1lcyBpbiBwbmdsaWJjb25mLmRmYQorICBJbmNsdWRlZCBkb2N1bWVudGF0aW9uIG9mIGNoYW5nZXMgaW4gMS41LjAgZnJvbSAxLjQueCBpbiBsaWJwbmctbWFudWFsLnR4dAorCitWZXJzaW9uIDEuNS4wYmV0YTU3IFtEZWNlbWJlciA5LCAyMDEwXQorICBEb2N1bWVudGVkIHRoZSBwbmd2YWxpZCBnYW1tYSBlcnJvciBzdW1tYXJ5IHdpdGggYWRkaXRpb25hbCBjb21tZW50cyBhbmQKKyAgICBwcmludCBzdGF0ZW1lbnRzLgorICBJbXByb3ZlZCBtaXNzaW5nIHN5bWJvbCBoYW5kbGluZyBpbiBjaGVja3N5bS5hd2s7IHN5bWJvbHMgbWlzc2luZyBpbiBib3RoCisgICAgdGhlIG9sZCBhbmQgbmV3IGZpbGVzIGNhbiBub3cgYmUgb3B0aW9uYWxseSBpZ25vcmVkLCB0cmVhdGVkIGFzIGVycm9ycworICAgIG9yIHdhcm5pbmdzLgorICBSZW1vdmVkIHJlZmVyZW5jZXMgdG8gcG5ndmNyZC5jIGFuZCBwbmdnY2NyZC5jIGZyb20gdGhlIHZzdHVkaW8gcHJvamVjdC4KKyAgVXBkYXRlZCAibGlicG5nMTQiIHRvICJsaWJwbmcxNSIgaW4gdGhlIHZpc3VhbGM3MSBwcm9qZWN0LgorICBFbmFibGVkIHRoZSBzdHJpcDE2IHRlc3RzIGluIHBuZ3ZhbGlkLmAKKyAgRG9uJ3QgZGlzcGxheSB0ZXN0IHJlc3VsdHMgKGV4Y2VwdCBQQVNTL0ZBSUwpIHdoZW4gcnVubmluZyAibWFrZSB0ZXN0Ii4KKyAgICBJbnN0ZWFkIHB1dCB0aGVtIGluIHBuZ3Rlc3QtbG9nLnR4dAorICBBZGRlZCAiLS13aXRoLXpwcmVmaXg9PHN0cmluZz4iIHRvIGNvbmZpZ3VyZS5hYworICBVcGRhdGVkIHRoZSBwcmVidWlsdCBjb25maWd1cmF0aW9uIGZpbGVzIHRvIGF1dG9jb25mIHZlcnNpb24gMi42OAorCitWZXJzaW9uIDEuNS4wYmV0YTU4IFtEZWNlbWJlciAxOSwgMjAxMF0KKyAgRml4ZWQgaW50ZXJsYWNlIGltYWdlIGhhbmRsaW5nIGFuZCBhZGQgdGVzdCBjYXNlcyAoSm9obiBCb3dsZXIpCisgIEZpeGVkIHRoZSBjbGVhbiBydWxlIGluIE1ha2VmaWxlLmFtIHRvIHJlbW92ZSBwbmd0ZXN0LWxvZy50eHQKKyAgTWFkZSBtaW5vciBjaGFuZ2VzIHRvIHdvcmsgYXJvdW5kIHdhcm5pbmdzIGluIGdjYyAzLjQKKworVmVyc2lvbiAxLjUuMHJjMDEgW0RlY2VtYmVyIDI3LCAyMDEwXQorICBObyBjaGFuZ2VzLgorCitWZXJzaW9uIDEuNS4wcmMwMiBbRGVjZW1iZXIgMjcsIDIwMTBdCisgIEVsaW1pbmF0ZWQgcmVmZXJlbmNlcyB0byB0aGUgc2NyaXB0cy8qLmRlZiBmaWxlcyBpbiBwcm9qZWN0L3Zpc3VhbGM3MS4KKworVmVyc2lvbiAxLjUuMHJjMDMgW0RlY2VtYmVyIDI4LCAyMDEwXQorICBFbGltaW5hdGVkIHNjcmlwdHMvKi5kZWYgYW5kIHJldmlzZWQgTWFrZWZpbGUuYW0gYWNjb3JkaW5nbHkKKworVmVyc2lvbiAxLjUuMHJjMDQgW0RlY2VtYmVyIDI5LCAyMDEwXQorICBGaXhlZCBidWcgaW4gYmFja2dyb3VuZCB0cmFuc2Zvcm1hdGlvbiBoYW5kbGluZyBpbiBwbmdydHJhbi5jIChpdCB3YXMKKyAgICBsb29raW5nIGZvciB0aGUgZmxhZyBpbiBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgaW5zdGVhZCBvZiBpbgorICAgIHBuZ19wdHItPmZsYWdzKSAoRGF2aWQgUmF5bW9uZCkuCisKK1ZlcnNpb24gMS41LjByYzA1IFtEZWNlbWJlciAzMSwgMjAxMF0KKyAgRml4ZWQgdHlwbyBpbiBhIGNvbW1lbnQgaW4gQ01ha2VMaXN0cy50eHQgKGxpYnBuZzE0ID0+IGxpYnBuZzE1KSAoQ29zbWluKQorCitWZXJzaW9uIDEuNS4wcmMwNiBbSmFudWFyeSA0LCAyMDExXQorICBDaGFuZ2VkIHRoZSBuZXcgY29uZmlndXJlIG9wdGlvbiAienByZWZpeD1zdHJpbmciIHRvICJ6bGliLXByZWZpeD1zdHJpbmciCisKK1ZlcnNpb24gMS41LjByYzA3IFtKYW51YXJ5IDQsIDIwMTFdCisgIFVwZGF0ZWQgY29weXJpZ2h0IHllYXIuCisKK1ZlcnNpb24gMS41LjAgW0phbnVhcnkgNiwgMjAxMV0KKyAgTm8gY2hhbmdlcy4KKwordmVyc2lvbiAxLjUuMWJldGEwMSBbSmFudWFyeSA4LCAyMDExXQorICBBZGRlZCBkZXNjcmlwdGlvbiBvZiBwbmdfc2V0X2NyY19hY3Rpb24oKSB0byB0aGUgbWFudWFsLgorICBBZGRlZCBhIG5vdGUgaW4gdGhlIG1hbnVhbCB0aGF0IHRoZSB0eXBlIG9mIHRoZSBpQ0NQIHByb2ZpbGUgd2FzIGNoYW5nZWQKKyAgICBmcm9tIHBuZ19jaGFycHAgdG8gcG5nX2J5dGVwcCBpbiBwbmdfZ2V0X2lDQ1AoKS4gIFRoaXMgY2hhbmdlIGhhcHBlbmVkCisgICAgaW4gdmVyc2lvbiAxLjUuMGJldGEzNiBidXQgaXMgbm90IG5vdGVkIGluIHRoZSBDSEFOR0VTLiAgU2ltaWxhcmx5LAorICAgIGl0IHdhcyBjaGFuZ2VkIGZyb20gcG5nX2NoYXJwcCB0byBwbmdfY29uc3RfYnl0ZXBwIGluIHBuZ19zZXRfaUNDUCgpLgorICBFbnN1cmUgdGhhdCBwbmdfcmdiX3RvX2dyYXkgaWdub3JlcyBwYWxldHRlIG1hcHBlZCBpbWFnZXMsIGlmIGxpYnBuZworICAgIGludGVybmFsbHkgaGFwcGVucyB0byBjYWxsIGl0IHdpdGggb25lLCBhbmQgZml4ZWQgYSBmYWlsdXJlIHRvIGhhbmRsZQorICAgIHBhbGV0dGUgbWFwcGVkIGltYWdlcyBjb3JyZWN0bHkuICBUaGlzIGZpeGVzIENWRS0yNjkwLgorCitWZXJzaW9uIDEuNS4xYmV0YTAyIFtKYW51YXJ5IDE0LCAyMDExXQorICBGaXhlZCBhIGJ1ZyBpbiBoYW5kbGluZyBvZiBpbnRlcmxhY2VkIGltYWdlcyAoYmVybyBhdCBhcmtsaW51eC5vcmcpLgorICBVcGRhdGVkIENNYWtlTGlzdHMudHh0IChDbGlmZm9yZCBZYXBwKQorCitWZXJzaW9uIDEuNS4xYmV0YTAzIFtKYW51YXJ5IDE0LCAyMDExXQorICBGaXhlZCB0eXBlY2FzdGluZyBvZiBzb21lIHBuZ19kZWJ1ZygpIHN0YXRlbWVudHMgKENvc21pbikKKworVmVyc2lvbiAxLjUuMWJldGEwNCBbSmFudWFyeSAxNiwgMjAxMV0KKyAgVXBkYXRlZCBkb2N1bWVudGF0aW9uIG9mIHBuZ19zZXR8Z2V0X3RSTlMoKSAoVGhvbWFzIEtsYXVzbmVyKS4KKyAgTWVudGlvbmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIHRoYXQgYXBwbGljYXRpb25zIG11c3QgI2luY2x1ZGUgInpsaWIuaCIKKyAgICBpZiB0aGV5IG5lZWQgYWNjZXNzIHRvIGFueXRoaW5nIGluIHpsaWIuaCwgYW5kIHRoYXQgYSBudW1iZXIgb2YKKyAgICBtYWNyb3Mgc3VjaCBhcyBwbmdfbWVtc2V0KCkgYXJlIG5vIGxvbmdlciBhY2Nlc3NpYmxlIGJ5IGFwcGxpY2F0aW9ucy4KKyAgQ29ycmVjdGVkIHBuZ3ZhbGlkIGdhbW1hIHRlc3QgInNhbXBsZSIgZnVuY3Rpb24gdG8gYWNjZXNzIGFsbCBvZiB0aGUgY29sb3IKKyAgICBzYW1wbGVzIG9mIGVhY2ggcGl4ZWwsIGluc3RlYWQgb2Ygc2FtcGxpbmcgdGhlIHJlZCBjaGFubmVsIHRocmVlIHRpbWVzLgorICBQcmVmaXhlZCB2YXJpYWJsZSBuYW1lcyBpbmRleCwgZGl2LCBleHAsIGdhbW1hIHdpdGggInBuZ18iIHRvIGF2b2lkICJzaGFkb3ciCisgICAgd2FybmluZ3MsIGFuZCAobWlzdGFrZW5seSkgY2hhbmdlZCBwbmdfZXhwKCkgdG8gZXhwKCkuCisKK1ZlcnNpb24gMS41LjFiZXRhMDUgW0phbnVhcnkgMTYsIDIwMTFdCisgIENoYW5nZWQgdmFyaWFibGUgbmFtZXMgcG5nX2luZGV4LCBwbmdfZGl2LCBwbmdfZXhwLCBhbmQgcG5nX2dhbW1hIHRvCisgICAgY2hhcl9pbmRleCwgZGl2aXNvciwgZXhwX2IxMCwgYW5kIGdhbW1hX3ZhbCwgcmVzcGVjdGl2ZWx5LCBhbmQKKyAgICBjaGFuZ2VkIGV4cCgpIGJhY2sgdG8gcG5nX2V4cCgpLgorCitWZXJzaW9uIDEuNS4xYmV0YTA2IFtKYW51YXJ5IDIwLCAyMDExXQorICBQcmV2ZW50IHBuZ19wdXNoX2NyY19za2lwKCkgZnJvbSBoYW5naW5nIHdoaWxlIHJlYWRpbmcgYW4gdW5rbm93biBjaHVuaworICAgIG9yIGFuIG92ZXItbGFyZ2UgY29tcHJlc3NlZCB6VFh0IGNodW5rIHdpdGggdGhlIHByb2dyZXNzaXZlIHJlYWRlci4KKyAgRWxpbWluYXRlZCBtb3JlIEdDQyAic2hhZG93IiB3YXJuaW5ncy4KKyAgUmV2aXNlZCBwbmdfZml4ZWQoKSBpbiBwbmcuYyB0byBhdm9pZCBjb21waWxlciB3YXJuaW5nIGFib3V0IHJlYWNoaW5nIHRoZQorICAgIGVuZCB3aXRob3V0IHJldHVybmluZyBhbnl0aGluZy4KKworVmVyc2lvbiAxLjUuMWJldGEwNyBbSmFudWFyeSAyMiwgMjAxMV0KKyAgSW4gdGhlIG1hbnVhbCwgZGVzY3JpYmUgdGhlIHBuZ19nZXRfSUhEUigpIGFyZ3VtZW50cyBpbiB0aGUgY29ycmVjdCBvcmRlci4KKyAgQWRkZWQgY29uc3RfcG5nX3N0cnVjdHAgYW5kIGNvbnN0X3BuZ19pbmZvcCB0eXBlcywgYW5kIHVzZWQgdGhlbSBpbgorICAgIHByb3RvdHlwZXMgZm9yIG1vc3QgcG5nX2dldF8qKCkgZnVuY3Rpb25zLgorCitWZXJzaW9uIDEuNS4xYmV0YTA4IFtKYW51YXJ5IDIzLCAyMDExXQorICBBZGRlZCBwbmdfZ2V0X2lvX2NodW5rX3R5cGUoKSBhbmQgZGVwcmVjYXRlZCBwbmdfZ2V0X2lvX2NodW5rX25hbWUoKQorICBBZGRlZCBzeW5vcHNlcyBmb3IgdGhlIElPX1NUQVRFIGZ1bmN0aW9ucyBhbmQgb3RoZXIgbWlzc2luZyBzeW5vcHNlcworICAgIHRvIHRoZSBtYW51YWwuIFJlbW92ZWQgdGhlIHN5bm9wc2VzIGZyb20gbGlicG5ncGYuMyBiZWNhdXNlIHRoZXkKKyAgICB3ZXJlIG91dCBvZiBkYXRlIGFuZCBubyBsb25nZXIgdXNlZnVsLiAgQmV0dGVyIGluZm9ybWF0aW9uIGNhbiBiZQorICAgIG9idGFpbmVkIGJ5IHJlYWRpbmcgdGhlIHByb3RvdHlwZXMgYW5kIGNvbW1lbnRzIGluIHBuZ3ByaXYuaAorICBBdHRlbXB0ZWQgdG8gZml4IGNwcCBvbiBTb2xhcmlzIHdpdGggUy4gU3R1ZGlvIDEyIGNjLCBmaXggYnVpbGQKKyAgICBBZGRlZCBhIG1ha2UgbWFjcm8gREZOQ1BQIHRoYXQgaXMgYSBDUFAgdGhhdCB3aWxsIGFjY2VwdCB0aGUgdG9rZW5zIGluCisgICAgYSAuZGZuIGZpbGUgYW5kIGFkZHMgY29uZmlndXJlIHN0dWZmIHRvIHRlc3QgZm9yIHN1Y2ggYSBDUFAuICAuL2NvbmZpZ3VyZQorICAgIHNob3VsZCBmYWlsIGlmIG9uZSBpcyBub3QgYXZhaWxhYmxlLgorICBDb3JyZWN0ZWQgY29uc3RfcG5nXyBpbiBwbmcuaCB0byBwbmdfY29uc3RfIHRvIGF2b2lkIHBvbGx1dGluZyB0aGUgbmFtZXNwYWNlLgorICBBZGRlZCBwbmdfZ2V0X2N1cnJlbnRfcm93X251bWJlciBhbmQgcG5nX2dldF9jdXJyZW50X3Bhc3NfbnVtYmVyIGZvciB0aGUKKyAgICBiZW5lZml0IG9mIHRoZSB1c2VyIHRyYW5zZm9ybSBjYWxsYmFjay4KKyAgQWRkZWQgcG5nX3Byb2Nlc3NfZGF0YV9wYXVzZSBhbmQgcG5nX3Byb2Nlc3NfZGF0YV9za2lwIGZvciB0aGUgYmVuZWZpdCBvZgorICAgIHByb2dyZXNzaXZlIHJlYWRlcnMgdGhhdCBuZWVkIHRvIHN0b3AgZGF0YSBwcm9jZXNzaW5nIG9yIHdhbnQgdG8gb3B0aW1pemUKKyAgICBza2lwcGluZyBvZiB1bnJlYWQgZGF0YSAoZS5nLiwgaWYgdGhlIHJlYWRlciBtYXJrcyBhIGNodW5rIHRvIGJlIHNraXBwZWQuKQorCitWZXJzaW9uIDEuNS4xYmV0YTA5IFtKYW51YXJ5IDI0LCAyMDExXQorICBFbmhhbmNlZCBwbmd2YWxpZCwgY29ycmVjdGVkIGFuIGVycm9yIGluIGdyYXlfdG9fcmdiLCBjb3JyZWN0ZWQgZG9jIGVycm9yLgorICAgIHBuZ3ZhbGlkIGNvbnRhaW5zIHRlc3RzIG9mIHRyYW5zZm9ybXMsIHdoaWNoIHRlc3RzIGFyZSBjdXJyZW50bHkgZGlzYWJsZWQKKyAgICBiZWNhdXNlIHRoZXkgYXJlIGluY29tcGxldGVseSB0ZXN0ZWQuICBncmF5X3RvX3JnYiB3YXMgZmFpbGluZyB0byBleHBhbmQKKyAgICB0aGUgYml0IGRlcHRoIGZvciBzbWFsbGVyIGJpdCBkZXB0aCBpbWFnZXM7IHRoaXMgc2VlbXMgdG8gYmUgYSBsb25nCisgICAgc3RhbmRpbmcgZXJyb3IgYW5kIHJlc3VsdGVkLCBhcHBhcmVudGx5LCBpbiBpbnZhbGlkIG91dHB1dAorICAgIChDVkUtMjAxMS0wNDA4LCBDRVJUIFZVIzY0MzE0MCkuICBUaGUgZG9jdW1lbnRhdGlvbiBkaWQgbm90IGFjY3VyYXRlbHkKKyAgICBkZXNjcmliZSB3aGF0IGxpYnBuZyByZWFsbHkgZG9lcyB3aGVuIGNvbnZlcnRpbmcgUkdCIHRvIGdyYXkuCisKK1ZlcnNpb24gMS41LjFiZXRhMTAgW0phbnVhcnkgMjcsIDIwMTBdCisgIEZpeGVkIGluY29ycmVjdCBleGFtcGxlcyBvZiBjYWxsYmFjayBwcm90b3R5cGVzIGluIHRoZSBtYW51YWwsIHRoYXQgd2VyZQorICAgIGludHJvZHVjZWQgaW4gbGlicG5nLTEuMC4wLgorICBJbiBhZGRpdGlvbiB0aGUgb3JkZXIgb2YgdGhlIHBuZ19nZXRfdWludCBtYWNyb3Mgd2l0aCByZXNwZWN0IHRvIHRoZQorICAgIHJlbGV2YW50IGZ1bmN0aW9uIGRlZmluaXRpb25zIGhhcyBiZWVuIHJldmVyc2VkLiAgVGhpcyBoZWxwcyB0aGUKKyAgICBwcmVwcm9jZXNzaW5nIG9mIHRoZSBzeW1ib2wgZmlsZXMgYmUgbW9yZSByb2J1c3QuICBGdXJ0aGVybW9yZSwgdGhlCisgICAgc3ltYm9sIGZpbGUgcHJlcHJvY2Vzc2luZyBub3cgdXNlcyAtRFBOR19OT19VU0VfUkVBRF9NQUNST1MgZXZlbiB3aGVuCisgICAgdGhlIGxpYnJhcnkgbWF5IGFjdHVhbGx5IGJlIGJ1aWx0IHdpdGggUE5HX1VTRV9SRUFEX01BQ1JPUzsgdGhpcyBzdG9wcworICAgIHRoZSByZWFkIG1hY3JvcyBpbnRlcmZlcmluZyB3aXRoIHRoZSBzeW1ib2wgZmlsZSBmb3JtYXQuCisgIE1hZGUgdGhlIG1hbnVhbCwgc3lub3BzZXMsIGFuZCBmdW5jdGlvbiBwcm90b3R5cGVzIHVzZSB0aGUgZnVuY3Rpb24KKyAgICBhcmd1bWVudCBuYW1lcyBmaWxlX2dhbW1hLCBpbnRfZmlsZV9nYW1tYSwgYW5kIHNyZ2JfaW50ZW50IGNvbnNpc3RlbnRseS4KKworVmVyc2lvbiAxLjUuMWJldGExMSBbSmFudWFyeSAyOCwgMjAxMV0KKyAgQ2hhbmdlZCBQTkdfVU5VU0VEIGZyb20gInBhcmFtPXBhcmFtOyIgdG8gIntpZihwYXJhbSl7fX0iLgorICBDb3JyZWN0ZWQgbG9jYWwgdmFyaWFibGUgdHlwZSBpbiBuZXcgQVBJIHBuZ19wcm9jZXNzX2RhdGFfc2tpcCgpCisgICAgVGhlIHR5cGUgd2FzIHNlbGYtZXZpZGVudGx5IGluY29ycmVjdCBidXQgb25seSBjYXVzZXMgcHJvYmxlbXMgb24gNjQtYml0CisgICAgYXJjaGl0ZWN0dXJlcy4KKyAgQWRkZWQgdHJhbnNmb3JtIHRlc3RzIHRvIHBuZ3ZhbGlkIGFuZCBzaW1wbGlmaWVkIHRoZSBhcmd1bWVudHMuCisKK1ZlcnNpb24gMS41LjFyYzAxIFtKYW51YXJ5IDI5LCAyMDExXQorICBObyBjaGFuZ2VzLgorCitWZXJzaW9uIDEuNS4xcmMwMiBbSmFudWFyeSAzMSwgMjAxMV0KKyAgQWRkZWQgYSByZXF1ZXN0IGluIHRoZSBtYW51YWwgdGhhdCBhcHBsaWNhdGlvbnMgZG8gbm90IHVzZSAicG5nXyIgb3IKKyAgICAiUE5HXyIgdG8gYmVnaW4gYW55IG9mIHRoZWlyIG93biBzeW1ib2xzLgorICBDaGFuZ2VkIFBOR19VTlVTRUQgdG8gIih2b2lkKXBhcmFtOyIgYW5kIHVwZGF0ZWQgdGhlIGNvbW1lbnRhcnkgaW4gcG5ncHJpdi5oCisKK1ZlcnNpb24gMS41LjEgW0ZlYnJ1YXJ5IDMsIDIwMTFdCisgIE5vIGNoYW5nZXMuCisKK1ZlcnNpb24gMS41LjJiZXRhMDEgW0ZlYnJ1YXJ5IDEzLCAyMDExXQorICBNb3JlIC1Xc2hhZG93IGZpeGVzIGZvciBvbGRlciBnY2MgY29tcGlsZXJzLiAgT2xkZXIgZ2NjIHZlcnNpb25zIGFwcGFyZW50bHkKKyAgICBjaGVjayBmb3JtYWwgcGFyYW1ldGVycyBuYW1lcyBpbiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKGFzIHdlbGwgYXMKKyAgICBkZWZpbml0aW9ucykgdG8gc2VlIGlmIHRoZXkgbWF0Y2ggYSBuYW1lIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLgorICBSZXZpc2VkIFBOR19FWFBPUlRBIG1hY3JvIHRvIG5vdCB1c2UgYW4gZW1wdHkgcGFyYW1ldGVyLCB0byBhY2NvbW1vZGF0ZSB0aGUKKyAgICBvbGQgVmlzdWFsQysrIHByZXByb2Nlc3Nvci4KKyAgVHVybmVkIG9uIGludGVybGFjZSBoYW5kbGluZyBpbiBwbmdfcmVhZF9wbmcoKS4KKyAgRml4ZWQgZ2NjIHBlbmRhbnRpYyB3YXJuaW5ncy4KKyAgSGFuZGxlIGxvbmdqbXAgaW4gQ3lnd2luLgorICBGaXhlZCBwbmdfZ2V0X2N1cnJlbnRfcm93X251bWJlcigpIGluIHRoZSBpbnRlcmxhY2VkIGNhc2UuCisgIENsZWFuZWQgdXAgQUxQSEEgZmxhZ3MgYW5kIHRyYW5zZm9ybWF0aW9ucy4KKyAgSW1wbGVtZW50ZWQgZXhwYW5zaW9uIHRvIDE2IGJpdHMuCisKK1ZlcnNpb24gMS41LjJiZXRhMDIgW0ZlYnJ1YXJ5IDE5LCAyMDExXQorICBGaXhlZCBtaXN0YWtlIGluIHRoZSBkZXNjcmlwdGlvbnMgb2YgdXNlciByZWFkX3RyYW5zZm9ybSBhbmQgd3JpdGVfdHJhbnNmb3JtCisgICAgZnVuY3Rpb24gcHJvdG90eXBlcyBpbiB0aGUgbWFudWFsLiAgVGhlIHJvd19pbmZvIHN0cnVjdCBpcyBwbmdfcm93X2luZm9wLgorICBSZXZlcnRlZCBwbmdfZ2V0X2N1cnJlbnRfcm93X251bWJlcigpIHRvIHByZXZpb3VzICgxLjUuMmJldGEwMSkgYmVoYXZpb3IuCisgIENvcnJlY3RlZCBwbmdfZ2V0X2N1cnJlbnRfcm93X251bWJlciBkb2N1bWVudGF0aW9uCisgIEZpeGVkIHRoZSByZWFkL3dyaXRlIHJvdyBjYWxsYmFjayBkb2N1bWVudGF0aW9uLgorICAgIFRoaXMgZG9jdW1lbnRzIHRoZSBjdXJyZW50IGJlaGF2aW9yLCB3aGVyZSB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkIGFmdGVyCisgICAgZXZlcnkgcm93IHdpdGggaW5mb3JtYXRpb24gcGVydGFpbmluZyB0byB0aGUgbmV4dCByb3cuCisKK1ZlcnNpb24gMS41LjJiZXRhMDMgW01hcmNoIDMsIDIwMTFdCisgIEZpeGVkIHNjcmlwdHMvbWFrZWZpbGUudmN3aW4zMgorICBVcGRhdGVkIGNvbnRyaWIvcG5nc3VpdGUvUkVBRE1FIHRvIGFkZCB0aGUgd29yZCAibW9kaWZ5Ii4KKyAgRGVmaW5lIFBOR19BTExPQ0FURUQgdG8gYmxhbmsgd2hlbiBfTVNDX1ZFUjwxMzAwLgorCitWZXJzaW9uIDEuNS4ycmMwMSBbTWFyY2ggMTksIDIwMTFdCisgIERlZmluZSByZW1haW5pbmcgYXR0cmlidXRlcyB0byBibGFuayB3aGVuIE1TQ19WRVI8MTMwMC4KKyAgaWZkZWYgb3V0IG1hc2sgYXJyYXlzIGluIHBuZ3JlYWQuYyB3aGVuIGludGVybGFjaW5nIGlzIG5vdCBzdXBwb3J0ZWQuCisKK1ZlcnNpb24gMS41LjJyYzAyIFtNYXJjaCAyMiwgMjAxMV0KKyAgQWRkZWQgYSBoaW50IHRvIHRyeSBDUFA9L2Jpbi9jcHAgaWYgImNwcCAtRSIgZmFpbHMgaW4gc2NyaXB0cy9wbmdsaWJjb25mLm1haworICAgIGFuZCBpbiBjb250cmliL3BuZ21pbmltLyovbWFrZWZpbGUsIGVnLiwgb24gU3VuT1MgNS4xMCwgYW5kIHJlbW92ZWQgInN0cmlwIgorICAgIGZyb20gdGhlIG1ha2VmaWxlcy4KKyAgRml4ZWQgYSBidWcgKHByZXNlbnQgc2luY2UgbGlicG5nLTEuMC43KSB0aGF0IG1ha2VzIHBuZ19oYW5kbGVfc1BMVCgpIGZhaWwKKyAgICB0byBjb21waWxlIHdoZW4gUE5HX05PX1BPSU5URVJfSU5ERVhJTkcgaXMgZGVmaW5lZCAoQ2h1YmFub3YgS2lyaWxsKQorCitWZXJzaW9uIDEuNS4ycmMwMyBbTWFyY2ggMjQsIDIwMTFdCisgIERvbid0IGluY2x1ZGUgc3RhbmRhcmQgaGVhZGVyIGZpbGVzIGluIHBuZy5oIHdoaWxlIGJ1aWxkaW5nIHRoZSBzeW1ib2wgdGFibGUsCisgICAgdG8gYXZvaWQgY3BwIGZhaWx1cmUgb24gU3VuT1MgKGludHJvZHVjZWQgUE5HX0JVSUxESU5HX1NZTUJPTF9UQUJMRSBtYWNybykuCisKK1ZlcnNpb24gMS41LjIgW01hcmNoIDMxLCAyMDExXQorICBObyBjaGFuZ2VzLgorCitWZXJzaW9uIDEuNS4zYmV0YTAxIFtBcHJpbCAxLCAyMDExXQorICBSZS1pbml0aWFsaXplIHRoZSB6bGliIGNvbXByZXNzb3IgYmVmb3JlIGNvbXByZXNzaW5nIG5vbi1JREFUIGNodW5rcy4KKyAgQWRkZWQgQVBJIGZ1bmN0aW9ucyAocG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX2xldmVsKCkgYW5kIGZvdXIgb3RoZXJzKSB0bworICAgIHNldCBwYXJhbWV0ZXJzIGZvciB6bGliIGNvbXByZXNzaW9uIG9mIG5vbi1JREFUIGNodW5rcy4KKworVmVyc2lvbiAxLjUuM2JldGEwMiBbQXByaWwgMywgMjAxMV0KKyAgVXBkYXRlZCBzY3JpcHRzL3N5bWJvbHMuZGVmIHdpdGggbmV3IEFQSSBmdW5jdGlvbnMuCisgIE9ubHkgY29tcGlsZSB0aGUgbmV3IHpsaWIgcmUtaW5pdGlhbGl6aW5nIGNvZGUgd2hlbiB0ZXh0IG9yIGlDQ1AgaXMKKyAgICBzdXBwb3J0ZWQsIHVzaW5nIFBOR19XUklURV9DT01QUkVTU0VEX1RFWFRfU1VQUE9SVEVEIG1hY3JvLgorICBJbXByb3ZlZCB0aGUgb3B0aW1pemF0aW9uIG9mIHRoZSB6bGliIENNRiBieXRlIChzZWUgbGlicG5nLTEuMi42YmV0YTAzKS4KKyAgT3B0aW1pemUgdGhlIHpsaWIgQ01GIGJ5dGUgaW4gbm9uLUlEQVQgY29tcHJlc3NlZCBjaHVua3MKKworVmVyc2lvbiAxLjUuM2JldGEwMyBbQXByaWwgMTYsIDIwMTFdCisgIEZpeGVkIGdjYyAtYW5zaSAtcGVkYW50aWMgY29tcGlsZS4gQSBzdHJpY3QgQU5TSSBzeXN0ZW0gZG9lcyBub3QgaGF2ZQorICAgIHNucHJpbnRmLCBhbmQgdGhlICJfX1NUUklDVF9BTlNJX18iIGRldGVjdHMgdGhhdCBjb25kaXRpb24gbW9yZSByZWxpYWJseQorICAgIHRoYW4gX19TVERDX18gKEpvaG4gQm93bGVyKS4KKyAgUmVtb3ZlZCB0aGUgUE5HX1BUUl9OT1JFVFVSTiBhdHRyaWJ1dGUgYmVjYXVzZSBpdCB0b28gZGFuZ2Vyb3VzLiBJdCB0ZWxscworICAgIHRoZSBjb21waWxlciB0aGF0IGEgdXNlciBzdXBwbGllZCBjYWxsYmFjayAodGhlIGVycm9yIGhhbmRsZXIpIGRvZXMgbm90CisgICAgcmV0dXJuLCB5ZXQgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIGluIHByYWN0aWNlIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGNvZGUKKyAgICB3aWxsIGNvcnJlY3RseSBpbXBsZW1lbnQgdGhlIGVycm9yIGhhbmRsZXIgYmVjYXVzZSB0aGUgY29tcGlsZXIgb25seQorICAgIGlzc3VlcyBhIHdhcm5pbmcgaWYgdGhlcmUgaXMgYSBtaXN0YWtlIChKb2huIEJvd2xlcikuCisgIFJlbW92ZWQgdGhlIG5vLWxvbmdlci11c2VkIFBOR19ERVBTVFJVQ1QgbWFjcm8uCisgIFVwZGF0ZWQgdGhlIHpsaWIgdmVyc2lvbiB0byAxLjIuNSBpbiB0aGUgVlN0dWRpbyBwcm9qZWN0LgorICBGaXhlZCA2NC1iaXQgYnVpbGRzIHdoZXJlIHBuZ191aW50XzMyIGlzIHNtYWxsZXIgdGhhbiBwbmdfc2l6ZV90IGluCisgICAgcG5nd3V0aWwuYyAoSm9obiBCb3dsZXIpLgorICBGaXhlZCBidWcgd2l0aCBzdHJpcHBpbmcgdGhlIGZpbGxlciBvciBhbHBoYSBjaGFubmVsIHdoZW4gd3JpdGluZywgdGhhdAorICAgIHdhcyBpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjUuMmJldGEwMSAoYnVnIHJlcG9ydCBieSBBbmRyZXcgQ2h1cmNoKS4KKworVmVyc2lvbiAxLjUuM2JldGEwNCBbQXByaWwgMjcsIDIwMTFdCisgIFVwZGF0ZWQgcG5ndGVzdC5wbmcgd2l0aCB0aGUgbmV3IHpsaWIgQ01GIG9wdGltaXphdGlvbi4KKyAgQ2xlYW5lZCB1cCBjb25kaXRpb25hbCBjb21waWxhdGlvbiBjb2RlIGFuZCBvZiBiYWNrZ3JvdW5kL2dhbW1hIGhhbmRsaW5nCisgICAgSW50ZXJuYWwgY2hhbmdlcyBvbmx5IGV4Y2VwdCBhIG5ldyBvcHRpb24gdG8gYXZvaWQgY29tcGlsaW5nIHRoZQorICAgIHBuZ19idWlsZF9ncmF5c2NhbGVfcGFsZXR0ZSBBUEkgKHdoaWNoIGlzIG5vdCB1c2VkIGF0IGFsbCBpbnRlcm5hbGx5LikKKyAgICBUaGUgbWFpbiBjaGFuZ2UgaXMgdG8gbW92ZSB0aGUgdHJhbnNmb3JtIHRlc3RzIChSRUFEX1RSQU5TRk9STVMsCisgICAgV1JJVEVfVFJBTlNGT1JNUykgdXAgb25lIGxldmVsIHRvIHRoZSBjYWxsZXIgb2YgdGhlIEFQSXMuICBUaGlzIGF2b2lkcworICAgIGNhbGxzIHRvIHNwdXJpb3VzIGZ1bmN0aW9ucyBpZiBhbGwgdHJhbnNmb3JtcyBhcmUgZGlzYWJsZWQgYW5kIHNsaWdodGx5CisgICAgc2ltcGxpZmllcyB0aG9zZSBmdW5jdGlvbnMuICBQbmd2YWxpZCBtb2RpZmllZCB0byBoYW5kbGUgdGhpcy4KKyAgICBBIG1pbm9yIGNoYW5nZSBpcyB0byBzdG9wIHRoZSBzdHJpcF8xNiBhbmQgZXhwYW5kXzE2IGludGVyZmFjZXMgZnJvbQorICAgIGRpc2FibGluZyBlYWNoIG90aGVyOyB0aGlzIGFsbG93cyB0aGUgZnV0dXJlIGFscGhhIHByZW11bHRpcGxpY2F0aW9uCisgICAgY29kZSB0byB1c2UgMTYtYml0IGludGVybWVkaWF0ZSB2YWx1ZXMgd2hpbGUgc3RpbGwgcHJvZHVjaW5nIDgtYml0IG91dHB1dC4KKyAgICBwbmdfZG9fYmFja2dyb3VuZCBhbmQgcG5nX2RvX2dhbW1hIGhhdmUgYmVlbiBzaW1wbGlmaWVkIHRvIHRha2UgYSBzaW5nbGUKKyAgICBwb2ludGVyIHRvIHRoZSBwbmdfc3RydWN0IHJhdGhlciB0aGFuIHBvaW50ZXJzIHRvIGV2ZXJ5IGl0ZW0gcmVxdWlyZWQKKyAgICBmcm9tIHRoZSBwbmdfc3RydWN0LiBUaGlzIG1ha2VzIG5vIHByYWN0aWNhbCBkaWZmZXJlbmNlIHRvIHRoZSBpbnRlcm5hbAorICAgIGNvZGUuCisgIEEgc2VyaW91cyBidWcgaW4gdGhlIHBuZ3ZhbGlkIGludGVybmFsIHJvdXRpbmUgJ3N0YW5kYXJkX2Rpc3BsYXlfaW5pdCcgaGFzCisgICAgYmVlbiBmaXhlZCAtIHRoaXMgZmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIHJlZCBjaGFubmVsIGFuZCBhY2NpZGVudGFsbHkKKyAgICBpbml0aWFsaXplZCB0aGUgYWxwaGEgY2hhbm5lbCB0d2ljZS4KKyAgQ2hhbmdlZCBwbmdfc3RydWN0IGptcF9idWYgbWVtYmVyIG5hbWUgZnJvbSBwbmdfam1wYnVmIHRvIHRtcF9qbXBidWYgdG8KKyAgICBhdm9pZCBhIHBvc3NpYmxlIGNsYXNoIHdpdGggdGhlIHBuZ19qbXBidWYgbWFjcm8gb24gc29tZSBwbGF0Zm9ybXMuCisKK1ZlcnNpb24gMS41LjNiZXRhMDUgW01heSA2LCAyMDExXQorICBBZGRlZCB0aGUgIl9QT1NJWF9TT1VSQ0UiIGZlYXR1cmUgdGVzdCBtYWNybyB0byBlbnN1cmUgbGlicG5nIHNlZXMgdGhlCisgICAgY29ycmVjdCBBUEkuIF9QT1NJWF9TT1VSQ0UgaXMgZGVmaW5lZCBpbiBwbmdwcml2LmgsIHBuZ3Rlc3QuYyBhbmQKKyAgICBwbmd2YWxpZC5jIHRvIGVuc3VyZSB0aGF0IFBPU0lYIGNvbmZvcm1hbnQgc3lzdGVtcyBkaXNhYmxlIG5vbi1QT1NJWCBBUElzLgorICBSZW1vdmVkIHBuZ19zbnByaW50ZiBhbmQgYWRkZWQgZm9ybWF0dGVkIHdhcm5pbmcgbWVzc2FnZXMuICBUaGlzIGNoYW5nZSBhZGRzCisgICAgaW50ZXJuYWwgQVBJcyB0byBhbGxvdyBwbmdfd2FybmluZyBtZXNzYWdlcyB0byBoYXZlIHBhcmFtZXRlcnMgd2l0aG91dAorICAgIHJlcXVpcmluZyB0aGUgaG9zdCBPUyB0byBpbXBsZW1lbnQgc25wcmludGYuICBBcyBhIHNpZGUgZWZmZWN0IHRoZQorICAgIGRlcGVuZGVuY3kgb2YgdGhlIHRJTUUtc3VwcG9ydGluZyBSRkMxMTMyIGNvZGUgb24gc3RkaW8gaXMgcmVtb3ZlZCBhbmQKKyAgICBQTkdfTk9fV0FSTklOR1MgZG9lcyBhY3R1YWxseSB3b3JrIG5vdy4KKyAgUGFzcyAiIiBpbnN0ZWFkIG9mICdcMCcgdG8gcG5nX2RlZmF1bHRfZXJyb3IoKSBpbiBwbmdfZXJyKCkuICBUaGlzIG1pc3Rha2UKKyAgICB3YXMgaW50cm9kdWNlZCBpbiBsaWJwbmctMS4yLjIwYmV0YTAxLiAgVGhpcyBmaXhlcyBDVkUtMjAxMS0yNjkxLgorICBBZGRlZCBQTkdfV1JJVEVfT1BUSU1JWkVfQ01GX1NVUFBPUlRFRCBtYWNybyB0byBtYWtlIHRoZSB6bGliICJDTUYiIGJ5dGUKKyAgICBvcHRpbWl6YXRpb24gY29uZmlndXJlYWJsZS4KKyAgSURBVCBjb21wcmVzc2lvbiBmYWlsZWQgaWYgcHJlY2VkZWQgYnkgYSBjb21wcmVzc2VkIHRleHQgY2h1bmsgKGJ1ZworICAgIGludHJvZHVjZWQgaW4gbGlicG5nLTEuNS4zYmV0YTAxLTAyKS4gIFRoaXMgd2FzIGJlY2F1c2UgdGhlIGF0dGVtcHQgdG8KKyAgICByZXNldCB0aGUgemxpYiBzdHJlYW0gaW4gcG5nX3dyaXRlX0lEQVQgaGFwcGVuZWQgYWZ0ZXIgdGhlIGZpcnN0IElEQVQKKyAgICBjaHVuayBoYWQgYmVlbiBkZWZsYXRlZCAtIG11Y2ggdG9vIGxhdGUuICBJbiB0aGlzIGNoYW5nZSBpbnRlcm5hbAorICAgIGZ1bmN0aW9ucyB3ZXJlIGFkZGVkIHRvIGNsYWltL3JlbGVhc2UgdGhlIHpfc3RyZWFtIGFuZCwgaG9wZWZ1bGx5LCBtYWtlCisgICAgdGhlIGNvZGUgbW9yZSByb2J1c3QuICBBbHNvIGRlZmxhdGVFbmQgY2hlY2tpbmcgaXMgYWRkZWQgLSBwcmV2aW91c2x5CisgICAgbGlicG5nIHdvdWxkIGlnbm9yZSBhbiBlcnJvciBhdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uCisKK1ZlcnNpb24gMS41LjNiZXRhMDYgW01heSA4LCAyMDExXQorICBSZW1vdmVkIHRoZSAtRF9BTExfU09VUkNFIGZyb20gZGVmaW5pdGlvbnMgZm9yIEFJWCBpbiBDTWFrZUxpc3RzLnR4dAorICBJbXBsZW1lbnRlZCBwcmVtdWx0aXBsaWVkIGFscGhhIHN1cHBvcnQ6IHBuZ19zZXRfYWxwaGFfbW9kZSBBUEkKKworVmVyc2lvbiAxLjUuM2JldGEwNyBbTWF5IDExLCAyMDExXQorICBBZGRlZCBleHBhbmRfMTYgc3VwcG9ydCB0byB0aGUgaGlnaCBsZXZlbCBpbnRlcmZhY2UuCisgIEFkZGVkIG5hbWVkIHZhbHVlIGFuZCAnZmxhZycgZ2FtbWEgc3VwcG9ydCB0byBwbmdfc2V0X2dhbW1hLiAgTWFkZSBhIG1pbm9yCisgICAgY2hhbmdlIGZyb20gdGhlIHByZXZpb3VzICh1bnJlbGVhc2VkKSBBQkkvQVBJIHRvIGhpZGUgdGhlIGV4YWN0IHZhbHVlIHVzZWQKKyAgICBmb3IgTWFjcyAtIGl0J3Mgbm90IGEgZ29vZCBpZGVhIHRvIGVtYmVkIHRoaXMgaW4gdGhlIEFCSSEKKyAgTW92ZWQgbWFjcm8gZGVmaW5pdGlvbnMgZm9yIFBOR19IQVZFX0lIRFIsIFBOR19IQVZFX1BMVEUsIGFuZCBQTkdfQUZURVJfSURBVAorICAgIGZyb20gcG5ncHJpdi5oIHRvIHBuZy5oIGJlY2F1c2UgdGhleSBtdXN0IGJlIHZpc2libGUgdG8gYXBwbGljYXRpb25zCisgICAgdGhhdCBjYWxsIHBuZ19zZXRfdW5rbm93bl9jaHVua3MoKS4KKyAgQ2hlY2sgZm9yIHVwLT5sb2NhdGlvbiAhUE5HX0FGVEVSX0lEQVQgd2hlbiB3cml0aW5nIHVua25vd24gY2h1bmtzCisgICAgYmVmb3JlIElEQVQuCisKK1ZlcnNpb24gMS41LjNiZXRhMDggW01heSAxNiwgMjAxMV0KKyAgSW1wcm92ZWQgInBuZ3ZhbGlkIC0tc3BlZWQiIHRvIGV4Y2x1ZGUgbW9yZSBvZiBwbmd2YWxpZCBmcm9tIHRoZSB0aW1lLgorICBEb2N1bWVudGVkIHBuZ19zZXRfYWxwaGFfbW9kZSgpLCBvdGhlciBjaGFuZ2VzIGluIGxpYnBuZy4zL2xpYnBuZy1tYW51YWwudHh0CisgIFRoZSBjSFJNIGNodW5rIG5vdyBzZXRzIHRoZSBkZWZhdWx0cyBmb3IgcG5nX3NldF9yZ2JfdG9fZ3JheSgpICh3aGVuIG5lZ2F0aXZlCisgICAgcGFyYW1ldGVycyBhcmUgc3VwcGxpZWQgYnkgdGhlIGNhbGxlciksIHdoaWxlIGluIHRoZSBhYnNlbmNlIG9mIGNIUk0KKyAgICBzUkdCL1JlYyA3MDkgdmFsdWVzIGFyZSBzdGlsbCB1c2VkLiAgVGhpcyBpbnRyb2R1Y2VkIGEgZGl2aWRlLWJ5LXplcm8KKyAgICBidWcgaW4gcG5nX2hhbmRsZV9jSFJNKCkuCisgIFRoZSBiS0dEIGNodW5rIG5vIGxvbmdlciBvdmVyd3JpdGVzIHRoZSBiYWNrZ3JvdW5kIHZhbHVlIHNldCBieQorICAgIHBuZ19zZXRfYmFja2dyb3VuZCgpLCBhbGxvd2luZyB0aGUgbGF0dGVyIHRvIGJlIHVzZWQgYmVmb3JlIHRoZSBmaWxlCisgICAgaGVhZGVyIGlzIHJlYWQuIEl0IG5ldmVyIHBlcmZvcm1lZCBhbnkgdXNlZnVsIGZ1bmN0aW9uIHRvIG92ZXJyaWRlCisgICAgdGhlIGRlZmF1bHQgYW55d2F5LgorICBBZGRlZCBtZW1vcnkgb3ZlcndyaXRlIGFuZCBwYWxldHRlIGltYWdlIGNoZWNrcyB0byBwbmd2YWxpZC5jCisgICAgUHJldmlvdXNseSBwYWxldHRlIGltYWdlIGNvZGUgd2FzIHBvb3JseSBjaGVja2VkLiBTaW5jZSB0aGUgdHJhbnNmb3JtYXRpb24KKyAgICBjb2RlIGhhcyBhIHNwZWNpYWwgcGFsZXR0ZSBwYXRoIGluIG1vc3QgY2FzZXMgdGhpcyB3YXMgYSBzZXZlcmUgd2Vha25lc3MuCisgIE1pbm9yIGNsZWFudXAgYW5kIHNvbWUgZXh0cmEgY2hlY2tpbmcgaW4gcG5ncnV0aWwuYyBhbmQgcG5ncnRyYW4uYy4gV2hlbgorICAgIGV4cGFuZGluZyBhbiBpbmRleGVkIGltYWdlLCBhbHdheXMgZXhwYW5kIHRvIFJHQkEgaWYgdHJhbnNwYXJlbmN5IGlzCisgICAgcHJlc2VudC4KKworVmVyc2lvbiAxLjUuM2JldGEwOSBbTWF5IDE3LCAyMDExXQorICBSZXZlcnNlZCBlYXJsaWVyIDEuNS4zIGNoYW5nZSBvZiB0cmFuc2Zvcm1hdGlvbiBvcmRlcjsgbW92ZSBwbmdfZXhwYW5kXzE2CisgICAgYmFjayB3aGVyZSBpdCB3YXMuICBUaGUgY2hhbmdlIGRvZXNuJ3Qgd29yayBiZWNhdXNlIGl0IHJlcXVpcmVzIDE2LWJpdAorICAgIGdhbW1hIHRhYmxlcyB3aGVuIHRoZSBjb2RlIG9ubHkgZ2VuZXJhdGVzIDgtYml0IG9uZXMuICBUaGlzIGZhaWxzCisgICAgc2lsZW50bHk7IHRoZSBsaWJwbmcgY29kZSBqdXN0IGRvZXNuJ3QgZG8gYW55IGdhbW1hIGNvcnJlY3Rpb24uICBNb3ZpbmcKKyAgICB0aGUgdGVzdHMgYmFjayBsZWF2ZXMgdGhlIG9sZCwgaW5hY2N1cmF0ZSwgOC1iaXQgZ2FtbWEgY2FsY3VsYXRpb25zLCBidXQKKyAgICB0aGVzZSBhcmUgY2xlYXJseSBiZXR0ZXIgdGhhbiBub25lIQorCitWZXJzaW9uIDEuNS4zYmV0YTEwIFtNYXkgMjAsIDIwMTFdCisKKyAgcG5nX3NldF9iYWNrZ3JvdW5kKCkgYW5kIHBuZ19leHBhbmRfMTYoKSBkaWQgbm90IHdvcmsgdG9nZXRoZXIgY29ycmVjdGx5LgorICAgIFRoaXMgcHJvYmxlbSBpcyBwcmVzZW50IGluIDEuNS4yOyBpZiBwbmdfc2V0X2JhY2tncm91bmQgaXMgY2FsbGVkIHdpdGgKKyAgICBuZWVkX2V4cGFuZCBmYWxzZSBhbmQgdGhlIG1hdGNoaW5nIDE2IGJpdCBjb2xvciBsaWJwbmcgZXJyb25lb3VzbHkganVzdAorICAgIHRyZWF0cyBpdCBhcyBhbiA4LWJpdCBjb2xvciBiZWNhdXNlIG9mIHdoZXJlIHBuZ19kb19leHBhbmRfMTYgaXMgaW4gdGhlCisgICAgdHJhbnNmb3JtIGxpc3QuICBUaGlzIHNpbXBsZSBmaXggcmVkdWNlcyB0aGUgc3VwcGxpZWQgY29sb3VyIHRvIDgtYml0cywKKyAgICBzbyBpdCBnZXRzIHNtYXNoZWQsIGJ1dCB0aGlzIGlzIGJldHRlciB0aGFuIHRoZSBjdXJyZW50IGJlaGF2aW9yLgorICBBZGRlZCB0ZXN0cyBmb3IgZXhwYW5kMTYsIG1vcmUgZml4ZXMgZm9yIHBhbGV0dGUgaW1hZ2UgdGVzdHMgdG8gcG5ndmFsaWQuCisgICAgQ29ycmVjdHMgdGhlIGNvZGUgZm9yIHBhbGV0dGUgaW1hZ2UgdGVzdHMgYW5kIGRpc2FibGVzIGF0dGVtcHRzIHRvCisgICAgdmFsaWRhdGUgcGFsZXR0ZSBjb2xvcnMuCisKK1ZlcnNpb24gMS41LjNyYzAxIFtKdW5lIDMsIDIwMTFdCisgIE5vIGNoYW5nZXMuCisKK1ZlcnNpb24gMS41LjNyYzAyIFtKdW5lIDgsIDIwMTFdCisgIEZpeGVkIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWQgaW4gcG5nX2Zvcm1hdF9idWZmZXIoKSAoQnVnIHJlcG9ydCBieQorICAgIEZyYW5rIEJ1c3NlLCBDVkUtMjAxMS0yNTAxLCByZWxhdGVkIHRvIENWRS0yMDA0LTA0MjEpLgorCitWZXJzaW9uIDEuNS4zYmV0YTExIFtKdW5lIDExLCAyMDExXQorICBGaXhlZCBwbmdfaGFuZGxlX3NDQUwgd2hpY2ggaXMgYnJva2VuIGluIDEuNS4gVGhpcyBmaXhlcyBDVkUgMjAxMS0yNjkyLgorICBBZGRlZCBzQ0FMIHRvIHBuZ3Rlc3QucG5nCisgIFJldmlzZWQgZG9jdW1lbnRhdGlvbiBhYm91dCBwbmdfc2V0X3VzZXJfbGltaXRzKCkgdG8gc2F5IHRoYXQgaXQgYWxzbyBhZmZlY3RzCisgICAgcG5nIHdyaXRpbmcuCisgIFJldmlzZWQgaGFuZGxpbmcgb2YgcG5nX3NldF91c2VyX2xpbWl0cygpIHNvIHRoYXQgaXQgY2FuIGluY3JlYXNlIHRoZQorICAgIGxpbWl0IGJleW9uZCB0aGUgUE5HX1VTRVJfV0lEVEh8SEVJR0hUX01BWDsgcHJldmlvdXNseSBpdCBjb3VsZCBvbmx5CisgICAgcmVkdWNlIGl0LgorICBNYWtlIHRoZSAxNi10by04IHNjYWxpbmcgYWNjdXJhdGUuIERpdmlkaW5nIGJ5IDI1NiB3aXRoIG5vIHJvdW5kaW5nIGlzCisgICAgd3JvbmcgKGhpZ2ggYnkgb25lKSAyNSUgb2YgdGhlIHRpbWUuIERpdmlkaW5nIGJ5IDI1NyB3aXRoIHJvdW5kaW5nIGlzCisgICAgd3JvbmcgaW4gMTI4IG91dCBvZiA2NTUzNiBjYXNlcy4gR2V0dGluZyB0aGUgcmlnaHQgYW5zd2VyIGFsbCB0aGUgdGltZQorICAgIHdpdGhvdXQgZGl2aXNpb24gaXMgZWFzeS4KKyAgQWRkZWQgIl9TVVBQT1JURUQiIHRvIHRoZSBQTkdfV1JJVEVfQ1VTVE9NSVpFX1pUWFRfQ09NUFJFU1NJT04gbWFjcm8uCisgIEFkZGVkIHByb2plY3RzL293YXRjb20sIGFuIElERSBwcm9qZWN0IGZvciBPcGVuV2F0Y29tIHRvIHJlcGxhY2UKKyAgICBzY3JpcHRzL21ha2VmaWxlLndhdGNvbS4gIFRoaXMgcHJvamVjdCB3b3JrcyB3aXRoIE9wZW5XYXRjb20gMS45LiBUaGUKKyAgICBJREUgYXV0b2dlbmVyYXRlcyBhcHByb3ByaWF0ZSBtYWtlZmlsZXMgKGxpYnBuZy5taykgZm9yIGJhdGNoIHByb2Nlc3NpbmcuCisgICAgVGhlIHByb2plY3QgaXMgY29uZmlndXJhYmxlLCB1bmxpa2UgdGhlIFZpc3VhbCBTdHVkaW8gcHJvamVjdCwgc28gbG9uZworICAgIGFzIHRoZSBkZXZlbG9wZXIgaGFzIGFuIGF3ay4KKyAgQ2hhbmdlZCBwbmdfc2V0X2dBTUEgdG8gbGltaXQgdGhlIGdhbW1hIHZhbHVlIHJhbmdlIHNvIHRoYXQgdGhlIGludmVyc2UKKyAgICBvZiB0aGUgc3RvcmVkIHZhbHVlIGNhbm5vdCBvdmVyZmxvdyB0aGUgZml4ZWQgcG9pbnQgcmVwcmVzZW50YXRpb24sCisgICAgYW5kIGNoYW5nZWQgb3RoZXIgdGhpbmdzIE9wZW5XYXRjb20gd2FybnMgYWJvdXQuCisgIFJldmlzZWQgcG5ndmFsaWQuYyB0byB0ZXN0IFBOR19BTFBIQV9NT0RFX1NVUFBPUlRFRCBjb3JyZWN0bHkuIFRoaXMgYWxsb3dzCisgICAgcG5ndmFsaWQgdG8gYnVpbGQgd2hlbiBBTFBIQV9NT0RFIGlzIG5vdCBzdXBwb3J0ZWQsIHdoaWNoIGlzIHJlcXVpcmVkIGlmCisgICAgaXQgaXMgdG8gYnVpbGQgb24gbGlicG5nIDEuNC4KKyAgUmVtb3ZlZCBzdHJpbmcvbWVtb3J5IG1hY3JvcyB0aGF0IGFyZSBubyBsb25nZXIgdXNlZCBhbmQgYXJlIG5vdAorICAgIG5lY2Vzc2FyaWx5IGZ1bGx5IHN1cHBvcnRhYmxlLCBwYXJ0aWN1bGFybHkgcG5nX3N0cm5jcHkgYW5kIHBuZ19zbnByaW50Zi4KKyAgQWRkZWQgbG9nIG9wdGlvbiB0byBwbmd2YWxpZC5jIGFuZCBhdHRlbXB0ZWQgdG8gaW1wcm92ZSBnYW1tYSBtZXNzYWdlcy4KKworVmVyc2lvbiAxLjUuMyBbb21pdHRlZF0KKyAgUGVvcGxlIGZvdW5kIHRoZSBwcmVzZW5jZSBvZiBhIGJldGEgcmVsZWFzZSBmb2xsb3dpbmcgYW4gcmMgcmVsZWFzZQorICAgIHRvIGJlIGNvbmZ1c2luZzsgdGhlcmVmb3JlIHdlIGJ1bXAgdGhlIHZlcnNpb24gdG8gbGlicG5nLTEuNS40YmV0YTAxCisgICAgYW5kIHRoZXJlIHdpbGwgYmUgbm8gbGlicG5nLTEuNS4zIHJlbGVhc2UuCisKK1ZlcnNpb24gMS41LjRiZXRhMDEgW0p1bmUgMTQsIDIwMTFdCisgIE1hZGUgaXQgcG9zc2libGUgdG8gdW5kZWZpbmUgUE5HX1JFQURfMTZfVE9fOF9BQ0NVUkFURV9TQ0FMRV9TVVBQT1JURUQKKyAgICB0byBnZXQgdGhlIHNhbWUgKGluYWNjdXJhdGUpIG91dHB1dCBhcyBsaWJwbmctMS41LjIgYW5kIGVhcmxpZXIuCisgIE1vdmVkIGRlZmluaXRpb25zIG9mIFBOR19IQVZFX0lIRFIsIFBOR19BRlRFUl9JREFULCBhbmQgUE5HX0hBVkVfUExURQorICAgIG91dHNpZGUgb2YgYW4gdW5rbm93bi1jaHVuayBibG9jayBpbiBwbmcuaCBiZWNhdXNlIHRoZXkgYXJlIGFsc28KKyAgICBuZWVkZWQgZm9yIG90aGVyIHVzZXMuCisKK1ZlcnNpb24gMS41LjRiZXRhMDIgW0p1bmUgMTQsIDIwMTFdCisgIEZpeGVkIGFuZCBjbGFyaWZpZWQgTEVHQUNZIDE2LXRvLTggc2NhbGluZyBjb2RlLgorICBBZGRlZCBwbmdfc2V0X2Nob3BfMTYoKSBBUEksIHRvIG1hdGNoIGluYWNjdXJhdGUgcmVzdWx0cyBmcm9tIHByZXZpb3VzCisgICAgbGlicG5nIHZlcnNpb25zLgorICBSZW1vdmVkIHRoZSBBQ0NVUkFURSBhbmQgTEVHQUNZIG9wdGlvbnMgKHRoZXkgYXJlIG5vIGxvbmdlciB1c2VhYmxlKQorICBVc2UgdGhlIG9sZCBzY2FsaW5nIG1ldGhvZCBmb3IgYmFja2dyb3VuZCBpZiBwbmdfc2V0X2Nob3BfMTYoKSB3YXMKKyAgICBjYWxsZWQuCisgIE1hZGUgcG5nX3NldF9jaG9wXzE2KCkgQVBJIHJlbW92ZWFibGUgYnkgZGlzYWJsaW5nIFBOR19DSE9QXzE2X1RPXzhfU1VQUE9SVEVECisKK1ZlcnNpb24gMS41LjRiZXRhMDMgW0p1bmUgMTUsIDIwMTFdCisgIEZpeGVkIGEgcHJvYmxlbSBpbiBwbmdfZG9fZXhwYW5kX3BhbGV0dGUoKSBleHBvc2VkIGJ5IG9wdGltaXphdGlvbiBpbgorICAgIDEuNS4zYmV0YTA2CisgIEFsc28gcmVtb3ZlZCBhIHNwdXJpb3VzIGFuZCBjb25mdXNpbmcgInRyYW5zIiBtZW1iZXIgKCJ0cmFucyIpIGZyb20gcG5nX2luZm8uCisgIFRoZSBwYWxldHRlIGV4cGFuZCBvcHRpbWl6YXRpb24gcHJldmVudGVkIGV4cGFuc2lvbiB0byBhbiBpbnRlcm1lZGlhdGUgUkdCQQorICAgIGZvcm0gaWYgdFJOUyB3YXMgcHJlc2VudCBidXQgYWxwaGEgd2FzIG1hcmtlZCB0byBiZSBzdHJpcHBlZDsgdGhpcyBleHBvc2VkCisgICAgYSBjaGVjayBmb3IgdFJOUyBpbiBwbmdfZG9fZXhwYW5kX3BhbGV0dGUoKSB3aGljaCBpcyBpbmNvbnNpc3RlbnQgd2l0aCB0aGUKKyAgICBjb2RlIGVsc2V3aGVyZSBpbiBsaWJwbmcuCisgIENvcnJlY3Rpb24gdG8gdGhlIGV4cGFuZF8xNiBjb2RlOyByZW1vdmVkIGV4dHJhIGluc3RhbmNlIG9mCisgICAgcG5nX3NldF9zY2FsZV8xNl90b184IGZyb20gcG5ncHJpdi5oCisKK1ZlcnNpb24gMS41LjRiZXRhMDQgW0p1bmUgMTYsIDIwMTFdCisgIEFkZGVkIGEgbWlzc2luZyAiI2lmZGVmIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVELyNlbmRpZiIgaW4gcG5ncnRyYW4uYworICBBZGRlZCBQTkdfVFJBTlNGT1JNX0NIT1BfMTYgdG8gdGhlIGhpZ2gtbGV2ZWwgcmVhZCB0cmFuc2Zvcm1zLgorICBNYWRlIFBOR19SRUFEXzE2X1RPXzhfQUNDVVJBVEVfU0NBTEUgY29uZmlndXJhYmxlIGFnYWluLiAgSWYgdGhpcyBpcworICAgIG5vdCBlbmFibGVkLCBwbmdfc2V0X3N0cmlwXzE2KCkgYW5kIHBuZ19kb19zY2FsZV8xNl90b184KCkgYXJlbid0IGJ1aWx0LgorICBSZXZpc2VkIGNvbnRyaWIvdmlzdXBuZywgZ3JlZ2Jvb2ssIGFuZCBwbmdtaW5pbSB0byBkZW1vbnN0cmF0ZSBjaG9wXzE2X3RvXzgKKworVmVyc2lvbiAxLjUuNGJldGEwNSBbSnVuZSAxNiwgMjAxMV0KKyAgUmVuYW1lZCBwbmdfc2V0X3N0cmlwXzE2KCkgdG8gcG5nX3NldF9zY2FsZV8xNigpIGFuZCByZW5hbWVkCisgICAgcG5nX3NldF9jaG9wXzE2KCkgdG8gcG5nX3NldF9zdHJpcCgxNikgaW4gYW4gYXR0ZW1wdCB0byBtaW5pbWl6ZSB0aGUKKyAgICBiZWhhdmlvciBjaGFuZ2VzIGJldHdlZW4gbGlicG5nMTQgYW5kIGxpYnBuZzE1LgorCitWZXJzaW9uIDEuNS40YmV0YTA2IFtKdW5lIDE4LCAyMDExXQorICBGaXhlZCBuZXcgYnVnIHRoYXQgd2FzIGNhdXNpbmcgYm90aCBzdHJpcF8xNiBhbmQgc2NhbGVfMTYgdG8gYmUgYXBwbGllZC4KKworVmVyc2lvbiAxLjUuNGJldGEwNyBbSnVuZSAxOSwgMjAxMV0KKyAgRml4ZWQgcG5ndmFsaWQsIHNpbXBsaWZpZWQgbWFjcm9zLCBhZGRlZCBjaGVja2luZyBmb3IgMCBpbiBzQ0FMLgorICAgIFRoZSBBQ0NVUkFURSBzY2FsZSBtYWNybyBpcyBubyBsb25nZXIgZGVmaW5lZCBpbiAxLjUgLSBjYWxsIHRoZQorICAgIHBuZ19zY2FsZV8xNl90b184IEFQSS4gIE1hZGUgc3VyZSB0aGF0IFBOR19SRUFEXzE2X1RPXzggaXMgc3RpbGwgZGVmaW5lZAorICAgIGlmIHRoZSBwbmdfc3RyaXBfMTZfdG9fOCBBUEkgaXMgcHJlc2VudC4gIHBuZ19jaGVja19mcF9udW1iZXIgbm93CisgICAgbWFpbnRhaW5zIHNvbWUgc3RhdGUgc28gdGhhdCBwb3NpdGl2ZSwgbmVnYXRpdmUgYW5kIHplcm8gdmFsdWVzIGFyZQorICAgIGlkZW50aWZpZWQuICBzQ0FMIHVzZXMgdGhlc2UgdG8gYmUgc3RyaWN0bHkgc3BlYyBjb25mb3JtYW50LgorCitWZXJzaW9uIDEuNS40YmV0YTA4IFtKdW5lIDIzLCAyMDExXQorICBGaXhlZCBwbmd2YWxpZCBpZiBBQ0NVUkFURV9TQ0FMRSBpcyBkZWZpbmVkLgorICBVcGRhdGVkIHNjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0LgorCitWZXJzaW9uIDEuNS40cmMwMSBbSnVuZSAzMCwgMjAxMV0KKyAgRGVmaW5lIFBOR19BTExPQ0FURUQgdG8gInJlc3RyaWN0IiBvbmx5IGlmIE1TQ19WRVIgPj0gMTQwMC4KKworVmVyc2lvbiAxLjUuNCBbSnVseSA3LCAyMDExXQorICBObyBjaGFuZ2VzLgorCitWZXJzaW9uIDEuNS41YmV0YTAxIFtKdWx5IDEzLCAyMDExXQorICBGaXhlZCBzb21lIHR5cG9zIGFuZCBtYWRlIG90aGVyIG1pbm9yIGNoYW5nZXMgaW4gdGhlIG1hbnVhbC4KKyAgVXBkYXRlZCBjb250cmliL3BuZ21pbnVzL21ha2VmaWxlLnN0ZCAoU2FtdWxpIFNvdW1pbmVuKQorCitWZXJzaW9uIDEuNS41YmV0YTAyIFtKdWx5IDE0LCAyMDExXQorICBSZXZpc2VkIE1ha2VmaWxlLmFtIGFuZCBNYWtlZmlsZS5pbiB0byBsb29rIGluIHRoZSByaWdodCBkaXJlY3RvcnkgZm9yCisgICAgcG5nbGliY29uZi5oLnByZWJ1aWx0CisKK1ZlcnNpb24gMS41LjViZXRhMDMgW0p1bHkgMjcsIDIwMTFdCisgIEVuYWJsZWQgY29tcGlsYXRpb24gd2l0aCBnKysgY29tcGlsZXIuICBUaGlzIGNvbXBpbGVyIGRvZXMgbm90IHJlY29nbml6ZQorICAgIHRoZSBmaWxlIGV4dGVuc2lvbiwgc28gaXQgYWx3YXlzIGNvbXBpbGVzIHdpdGggQysrIHJ1bGVzLiAgTWFkZSBtaW5vcgorICAgIGNoYW5nZXMgdG8gcG5ncnV0aWwuYyB0byBjYXN0IHJlc3VsdHMgd2hlcmUgQysrIGV4cGVjdHMgaXQgYnV0IEMgZG9lcyBub3QuCisgIE1pbm9yIGVkaXRpbmcgb2YgbGlicG5nLjMgYW5kIGxpYnBuZy1tYW51YWwudHh0LgorCitWZXJzaW9uIDEuNS41YmV0YTA0IFtKdWx5IDI5LCAyMDExXQorICBSZXZpc2VkIENNYWtlTGlzdHMudHh0IChDbGlmZm9yZCBZYXBwKQorICBVcGRhdGVkIGNvbW1lbnRhcnkgYWJvdXQgdGhlIHBuZ19yZ2JfdG9fZ3JheSgpIGRlZmF1bHQgY29lZmZpY2llbnRzCisgICAgaW4gdGhlIG1hbnVhbCBhbmQgaW4gcG5ncnRyYW4uYworCitWZXJzaW9uIDEuNS41YmV0YTA1IFtBdWd1c3QgMTcsIDIwMTFdCisgIFByZXZlbnQgdW5leHBlY3RlZCBBUEkgZXhwb3J0cyBmcm9tIG5vbi1saWJwbmcgRExMcyBvbiBXaW5kb3dzLiAgVGhlICJfRExMIgorICAgIGlzIHJlbW92ZWQgZnJvbSB0aGUgdGVzdCBvZiB3aGV0aGVyIGEgRExMIGlzIGJlaW5nIGJ1aWx0ICh0aGlzIGVycm9uZW91c2x5CisgICAgY2F1c2VkIHRoZSBsaWJwbmcgQVBJcyB0byBiZSBtYXJrZWQgYXMgRExMIGV4cG9ydHMgaW4gc3RhdGljIGJ1aWxkcyB1bmRlcgorICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvKS4gIEFsbW9zdCBhbGwgb2YgdGhlIGxpYnBuZyBidWlsZGluZyBjb25maWd1cmF0aW9uCisgICAgaXMgbW92ZWQgZnJvbSBwbmdjb25mLmggdG8gcG5ncHJpdi5oLCBidXQgUE5HX0RMTF9FWFBPUlQgcmVtYWlucyBpbgorICAgIHBuZ2NvbmYuaCwgdGhvdWdoLCBzbyB0aGF0IGl0IGlzIGNvbG9jYXRlZCB3aXRoIHRoZSBpbXBvcnQgZGVmaW5pdGlvbiAoaXQKKyAgICBpcyBubyBsb25nZXIgdXNlZCBhbnl3aGVyZSBpbiB0aGUgaW5zdGFsbGVkIGhlYWRlcnMpLiAgVGhlIFZTdHVkaW8gcHJvamVjdAorICAgIGRlZmluaXRpb25zIGhhdmUgYmVlbiBjbGVhbmVkIHVwOiAiX1VTUkRMTCIgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZQorICAgIHN0YXRpYyBsaWJyYXJ5IGJ1aWxkcyAodGhpcyB3YXMgaW5jb3JyZWN0KSwgYW5kIFBOR19VU0VfRExMIGhhcyBiZWVuIGFkZGVkCisgICAgdG8gcG5ndmFsaWQgdG8gdGVzdCB0aGUgZnVuY3Rpb25hbGl0eSAocG5ndGVzdCBkb2VzIG5vdCBzdXBwbHkgaXQsCisgICAgZGVsaWJlcmF0ZWx5KS4gIFRoZSBzcHVyaW91cyAiX0VYUE9SVFMiIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUKKyAgICBsaWJwbmcgYnVpbGQgKGFsbCB0aGVzZSBlcnJvcnMgd2VyZSBhIHJlc3VsdCBvZiBjb3B5L3Bhc3RlIGJldHdlZW4gcHJvamVjdAorICAgIGNvbmZpZ3VyYXRpb25zLikKKyAgQWRkZWQgbmV3IHR5cGVzIGFuZCBpbnRlcm5hbCBmdW5jdGlvbnMgZm9yIENJRSBSR0IgZW5kIHBvaW50IGhhbmRsaW5nIHRvCisgICAgcG5ncHJpdi5oIChmdW5jdGlvbnMgeWV0IHRvIGJlIGltcGxlbWVudGVkKS4KKworVmVyc2lvbiAxLjUuNWJldGEwNiBbQXVndXN0IDI2LCAyMDExXQorICBFbnN1cmUgdGhlIENNQUtFX0xJQlJBUllfT1VUUFVUX0RJUkVDVE9SWSBpcyBzZXQgaW4gQ01ha2VMaXN0cy50eHQKKyAgICAoQ2xpZmZvcmQgWWFwKQorICBGaXhlcyB0byByZ2JfdG9fZ3JheSBhbmQgY0hSTSBYWVogQVBJcyAoSm9obiBCb3dsZXIpOgorICAgIFRoZSByZ2JfdG9fZ3JheSBjb2RlIGhhZCBlcnJvcnMgd2hlbiBjb21iaW5lZCB3aXRoIGdhbW1hIGNvcnJlY3Rpb24uCisgICAgU29tZSBwaXhlbHMgd2VyZSB0cmVhdGVkIGFzIHRydWUgZ3JleSB3aGVuIHRoZXkgd2VyZW4ndCBhbmQgc3VjaCBwaXhlbHMKKyAgICBhbmQgdHJ1ZSBncmV5IG9uZXMgd2VyZSBub3QgZ2FtbWEgY29ycmVjdGVkICh0aGUgb3JpZ2luYWwgdmFsdWUgb2YgdGhlCisgICAgcmVkIGNvbXBvbmVudCB3YXMgdXNlZCBpbnN0ZWFkKS4gIEFQSXMgdG8gZ2V0IGFuZCBzZXQgY0hSTSB1c2luZyBjb2xvcgorICAgIHNwYWNlIGVuZCBwb2ludHMgaGF2ZSBiZWVuIGFkZGVkIGFuZCB0aGUgcmdiX3RvX2dyYXkgY29kZSB0aGF0IGRlZmF1bHRzCisgICAgYmFzZWQgb24gY0hSTSwgYW5kIHRoZSBkaXZpZGUtYnktemVybyBidWcgaW4gcG5nX2hhbmRsZV9jSFJNIChDRVJUCisgICAgVlUjNDc3MDQ2LCBDVkUtMjAxMS0zMzI4LCBpbnRyb2R1Y2VkIGluIDEuNS40KSBoYXZlIGJlZW4gY29ycmVjdGVkLgorICBBIGNvbnNpZGVyYWJsZSBudW1iZXIgb2YgdGVzdHMgaGFzIGJlZW4gYWRkZWQgdG8gcG5ndmFsaWQgZm9yIHRoZQorICAgIHJnYl90b19ncmF5IHRyYW5zZm9ybS4KKyAgQXJpdGhtZXRpYyBlcnJvcnMgaW4gcmdiX3RvX2dyYXkgd2hlcmVieSB0aGUgY2FsY3VsYXRlZCBncmF5IHZhbHVlIHdhcworICAgIHRydW5jYXRlZCB0byB0aGUgYml0IGRlcHRoIHJhdGhlciB0aGFuIHJvdW5kZWQgaGF2ZSBiZWVuIGZpeGVkIGV4Y2VwdCBpbgorICAgIHRoZSA4LWJpdCBub24tZ2FtbWEtY29ycmVjdGVkIGNhc2UgKHdoZXJlIGNvbnNpc3RlbmN5IHNlZW1zIG1vcmUgaW1wb3J0YW50CisgICAgdGhhbiBjb3JyZWN0bmVzcy4pICBUaGUgY29kZSBzdGlsbCBoYXMgY29uc2lkZXJhYmxlIGluYWNjdXJhY2llcyBpbiB0aGUKKyAgICA4LWJpdCBjYXNlIGJlY2F1c2UgOC1iaXQgbGluZWFyIGFyaXRobWV0aWMgaXMgdXNlZC4KKworVmVyc2lvbiAxLjUuNWJldGEwNyBbU2VwdGVtYmVyIDcsIDIwMTFdCisgIEFkZGVkICIkKEFSQ0gpIiBvcHRpb24gdG8gbWFrZWZpbGUuZGFyd2luCisgIEFkZGVkIFN1bk9TIHN1cHBvcnQgdG8gY29uZmlndXJlLmFjIGFuZCBNYWtlZmlsZS5hbQorICBDaGFuZ2VkIHBuZ19jaHVua19iZW5pZ25fZXJyb3IoKSB0byBwbmdfd2FybmluZygpIGluIHBuZy5jLCBpbgorICAgIHBuZ19YWVpfZnJvbV94eV9jaGVja2VkKCkuCisKK1ZlcnNpb24gMS41LjViZXRhMDggW1NlcHRlbWJlciAxMCwgMjAxMV0KKyAgRml4ZWQgNjQtYml0IGNvbXBpbGF0aW9uIGVycm9ycyAoZ2NjKS4gVGhlIGVycm9ycyBmaXhlZCByZWxhdGUKKyAgICB0byBjb25kaXRpb25zIHdoZXJlIHR5cGVzIHRoYXQgYXJlIDMyIGJpdHMgaW4gdGhlIEdDQyAzMi1iaXQKKyAgICB3b3JsZCAodUxvbmcgYW5kIHBuZ19zaXplX3QpIGJlY29tZSA2NCBiaXRzIGluIHRoZSA2NC1iaXQKKyAgICB3b3JsZC4gIFRoaXMgcHJvZHVjZXMgcG90ZW50aWFsIHRydW5jYXRpb24gZXJyb3JzIHdoaWNoIHRoZQorICAgIGNvbXBpbGVyIGNvcnJlY3RseSBmbGFncy4KKyAgUmVsb2NhdGVkIG5ldyBIQVZFX1NPTEFSSVNfTEQgZGVmaW5pdGlvbiBpbiBjb25maWd1cmUuYWMKKyAgQ29uc3RhbnQgY2hhbmdlcyBmb3IgNjQtYml0IGNvbXBhdGliaWxpdHkgKHJlbW92YWwgb2YgTCBzdWZmaXhlcykuIFRoZQorICAgIDE2LWJpdCBjYXNlcyBzdGlsbCB1c2UgIkwiIGFzIHdlIGRvbid0IGhhdmUgYSAxNi1iaXQgdGVzdCBzeXN0ZW0uCisKK1ZlcnNpb24gMS41LjVyYzAxIFtTZXB0ZW1iZXIgMTUsIDIwMTFdCisgIFJlbW92ZWQgIkwiIHN1ZmZpeGVzIGluIHBuZ3ByaXYuaAorCitWZXJzaW9uIDEuNS41IFtTZXB0ZW1iZXIgMjIsIDIwMTFdCisgIE5vIGNoYW5nZXMuCisKK1ZlcnNpb24gMS41LjZiZXRhMDEgW1NlcHRlbWJlciAyMiwgMjAxMV0KKyAgRml4ZWQgc29tZSA2NC1iaXQgdHlwZSBjb252ZXJzaW9uIHdhcm5pbmdzIGluIHBuZ3J0cmFuLmMKKyAgTW92ZWQgcm93X2luZm8gZnJvbSBwbmdfc3RydWN0IHRvIGEgbG9jYWwgdmFyaWFibGUuCisgIFRoZSB2YXJpb3VzIGludGVybGFjZSBtYXNrIGFycmF5cyBoYXZlIGJlZW4gbWFkZSBpbnRvIGFycmF5cyBvZgorICAgIGJ5dGVzIGFuZCBtYWRlIFBOR19DT05TVCBhbmQgc3RhdGljIChwcmV2aW91c2x5IHNvbWUgYXJyYXlzIHdlcmUKKyAgICBtYXJrZWQgUE5HX0NPTlNUIGFuZCBzb21lIHdlcmVuJ3QpLgorICBBZGRpdGlvbmFsIGNoZWNrcyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIHRyYW5zZm9ybSBjb2RlIHRvIHZhbGlkYXRlIHRoZQorICAgIHBpeGVsIGRlcHRocyBhZnRlciB0aGUgdHJhbnNmb3JtcyBvbiBib3RoIHJlYWQgYW5kIHdyaXRlLgorICBSZW1vdmVkIHNvbWUgcmVkdW5kYW50IGNvZGUgZnJvbSBwbmd3cml0ZS5jLCBpbiBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoKS4KKyAgQ2hhbmdlZCBjaHVuayByZWFkaW5nL3dyaXRpbmcgY29kZSB0byB1c2UgcG5nX3VpbnRfMzIgaW5zdGVhZCBvZiBwbmdfYnl0ZVs0XS4KKyAgICBUaGlzIHJlbW92ZXMgdGhlIG5lZWQgdG8gYWxsb2NhdGUgdGVtcG9yYXJ5IHN0cmluZ3MgZm9yIGNodW5rIG5hbWVzIG9uCisgICAgdGhlIHN0YWNrIGluIHRoZSByZWFkL3dyaXRlIGNvZGUuICBVbmtub3duIGNodW5rIGhhbmRsaW5nIHN0aWxsIHVzZXMgdGhlCisgICAgc3RyaW5nIGZvcm0gYmVjYXVzZSB0aGlzIGlzIGV4cG9zZWQgaW4gdGhlIEFQSS4KKworVmVyc2lvbiAxLjUuNmJldGEwMiBbU2VwdGVtYmVyIDI2LCAyMDExXQorICBBZGRlZCBhIG5vdGUgaW4gdGhlIG1hbnVhbCB0aGUgcG5nX3JlYWRfdXBkYXRlX2luZm8oKSBtdXN0IGJlIGNhbGxlZCBvbmx5CisgICAgb25jZSB3aXRoIGEgcGFydGljdWxhciBpbmZvX3B0ci4KKyAgRml4ZWQgYSB0eXBvIGluIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBuZXcgUE5HX1NUUklOR19GUk9NX0NIVU5LKHMsYykgbWFjcm8uCisKK1ZlcnNpb24gMS41LjZiZXRhMDMgW1NlcHRlbWJlciAyOCwgMjAxMV0KKyAgUmV2aXNlZCB0ZXN0LXBuZ3Rlc3Quc2ggdG8gcmVwb3J0IEZBSUwgd2hlbiBwbmd0ZXN0IGZhaWxzLgorICBBZGRlZCAiLS1zdHJpY3QiIG9wdGlvbiB0byBwbmd0ZXN0LCB0byByZXBvcnQgRkFJTCB3aGVuIHRoZSBmYWlsdXJlIGlzCisgICAgb25seSBiZWNhdXNlIHRoZSByZXN1bHRpbmcgdmFsaWQgZmlsZXMgYXJlIGRpZmZlcmVudC4KKyAgUmV2aXNlZCBDTWFrZUxpc3RzLnR4dCB0byB3b3JrIHdpdGggbWluZ3cgYW5kIHJlbW92ZWQgc29tZSBtYXRlcmlhbCBmcm9tCisgICAgQ01ha2VMaXN0cy50eHQgdGhhdCBpcyBubyBsb25nZXIgdXNlZnVsIGluIGxpYnBuZy0xLjUuCisKK1ZlcnNpb24gMS41LjZiZXRhMDQgW09jdG9iZXIgNSwgMjAxMV0KKyAgRml4ZWQgdHlwbyBpbiBNYWtlZmlsZS5pbiBhbmQgTWFrZWZpbGUuYW0gKCItTSBXbCIgc2hvdWxkIGJlICItTSAtV2wiKS4iCisKK1ZlcnNpb24gMS41LjZiZXRhMDUgW09jdG9iZXIgMTIsIDIwMTFdCisgIFNwZWVkIHVwIHBuZ19jb21iaW5lX3JvdygpIGZvciBpbnRlcmxhY2VkIGltYWdlcy4gVGhpcyByZWR1Y2VzIHRoZSBnZW5lcmFsaXR5CisgICAgb2YgdGhlIGNvZGUsIGFsbG93aW5nIGl0IHRvIGJlIG9wdGltaXplZCBmb3IgQWRhbTcgaW50ZXJsYWNlLiAgVGhlIG1hc2tzCisgICAgcGFzc2VkIHRvIHBuZ19jb21iaW5lX3JvdygpIGFyZSBub3cgZ2VuZXJhdGVkIGludGVybmFsbHksIGF2b2lkaW5nCisgICAgc29tZSBjb2RlIGR1cGxpY2F0aW9uIGFuZCBsb2NhbGl6aW5nIHRoZSBpbnRlcmxhY2UgaGFuZGxpbmcgc29tZXdoYXQuCisgIEFsaWduIHBuZ19zdHJ1Y3Q6OnJvd19idWYgLSBwcmV2aW91c2x5IGl0IHdhcyBhbHdheXMgdW5hbGlnbmVkLCBjYXVzZWQgYnkKKyAgICBhIGJ1ZyBpbiB0aGUgY29kZSB0aGF0IGF0dGVtcHRlZCB0byBhbGlnbiBpdDsgdGhlIGNvZGUgbmVlZHMgdG8gc3VidHJhY3QKKyAgICBvbmUgZnJvbSB0aGUgcG9pbnRlciB0byB0YWtlIGFjY291bnQgb2YgdGhlIGZpbHRlciBieXRlIHByZXBlbmRlZCB0bworICAgIGVhY2ggcm93LgorICBPcHRpbWl6ZWQgcG5nX2NvbWJpbmVfcm93KCkgd2hlbiByb3dzIGFyZSBhbGlnbmVkLiBUaGlzIGdhaW5zIGEgc21hbGwKKyAgICBwZXJjZW50YWdlIGZvciAxNi1iaXQgYW5kIDMyLWJpdCBwaXhlbHMgaW4gdGhlIHR5cGljYWwgY2FzZSB3aGVyZSB0aGUKKyAgICBvdXRwdXQgcm93IGJ1ZmZlcnMgYXJlIGFwcHJvcHJpYXRlbHkgYWxpZ25lZC4gVGhlIG9wdGltaXphdGlvbiB3YXMgbm90CisgICAgcHJldmlvdXNseSBwb3NzaWJsZSBiZWNhdXNlIHRoZSBwbmdfc3RydWN0IGJ1ZmZlciB3YXMgYWx3YXlzIG1pc2FsaWduZWQuCisgIEZpeGVkIGJ1ZyBpbiBwbmdfd3JpdGVfY2h1bmtfaGVhZGVyKCkgZGVidWcgcHJpbnQsIGludHJvZHVjZWQgaW4gMS41LjZiZXRhMDEuCisKK1ZlcnNpb24gMS41LjZiZXRhMDYgW09jdG9iZXIgMTcsIDIwMTFdCisgIFJlbW92ZWQgdHdvIHJlZHVuZGFudCB0ZXN0cyBmb3IgdW5pdGlhbGl6ZWQgcm93LgorICBGaXhlZCBhIHJlbGF0aXZlbHkgaGFybWxlc3MgbWVtb3J5IG92ZXJ3cml0ZSBpbiBjb21wcmVzc2VkIHRleHQgd3JpdGluZworICAgIHdpdGggYSAxIGJ5dGUgemxpYiBidWZmZXIuCisgIEFkZCBhYmlsaXR5IHRvIGNhbGwgcG5nX3JlYWRfdXBkYXRlX2luZm8gbXVsdGlwbGUgdGltZXMgdG8gcG5ndmFsaWQuYy4KKyAgRml4ZXMgZm9yIG11bHRpcGxlIGNhbGxzIHRvIHBuZ19yZWFkX3VwZGF0ZV9pbmZvLiBUaGVzZSBmaXhlcyBhdHRlbmQgdG8KKyAgICBtb3N0IG9mIHRoZSBlcnJvcnMgcmV2ZWFsZWQgaW4gcG5ndmFsaWQsIGhvd2V2ZXIgZG9pbmcgdGhlIGdhbW1hIHdvcmsKKyAgICB0d2ljZSByZXN1bHRzIGluIGluYWNjdXJhY2llcyB0aGF0IGNhbid0IGJlIGVhc2lseSBmaXhlZC4gIFRoZXJlIGlzIG5vdworICAgIGEgd2FybmluZyBpbiB0aGUgY29kZSBpZiB0aGlzIGlzIGdvaW5nIHRvIGhhcHBlbi4KKyAgVHVybmVkIG9uIG11bHRpcGxlIHBuZ19yZWFkX3VwZGF0ZV9pbmZvIGluIHBuZ3ZhbGlkIHRyYW5zZm9ybSB0ZXN0cy4KKyAgUHJldmVudCBsaWJwbmcgZnJvbSBvdmVyd3JpdGluZyB1bnVzZWQgYml0cyBhdCB0aGUgZW5kIG9mIHRoZSBpbWFnZSB3aGVuCisgICAgaXQgaXMgbm90IGJ5dGUgYWxpZ25lZCwgd2hpbGUgcmVhZGluZy4gUHJpb3IgdG8gbGlicG5nLTEuNS42IGxpYnBuZyB3b3VsZAorICAgIG92ZXJ3cml0ZSB0aGUgcGFydGlhbCBieXRlIGF0IHRoZSBlbmQgb2YgZWFjaCByb3cgaWYgdGhlIHJvdyB3aWR0aCB3YXMgbm90CisgICAgYW4gZXhhY3QgbXVsdGlwbGUgb2YgOCBiaXRzIGFuZCB0aGUgaW1hZ2UgaXMgbm90IGludGVybGFjZWQuCisKK1ZlcnNpb24gMS41LjZiZXRhMDcgW09jdG9iZXIgMjEsIDIwMTFdCisgIE1hZGUgcG5nX3B0ci0+cHJldl9yb3cgYW4gYWxpZ25lZCBwb2ludGVyIGludG8gcG5nX3B0ci0+YmlnX3ByZXZfcm93CisgICAgKE1hbnMgUnVsbGdhcmQpLgorCitWZXJzaW9uIDEuNS42cmMwMSBbT2N0b2JlciAyNiwgMjAxMV0KKyAgQ2hhbmdlZCBtaXNsZWFkaW5nICJNaXNzaW5nIFBMVEUgYmVmb3JlIGNIUk0iIHdhcm5pbmcgdG8gIk91dCBvZiBwbGFjZSBjSFJNIgorCitWZXJzaW9uIDEuNS42cmMwMiBbT2N0b2JlciAyNywgMjAxMV0KKyAgQWRkZWQgTFNSKCkgbWFjcm8gdG8gZGVmZW5kIGFnYWluc3QgYnVnZ3kgY29tcGlsZXJzIHRoYXQgZXZhbHVhdGUgbm9uLXRha2VuCisgICAgY29kZSBicmFuY2hlcyBhbmQgY29tcGxhaW4gYWJvdXQgb3V0LW9mLXJhbmdlIHNoaWZ0cy4KKworVmVyc2lvbiAxLjUuNnJjMDMgW09jdG9iZXIgMjgsIDIwMTFdCisgIFJlbmFtZWQgdGhlIExTUigpIG1hY3JvIHRvIFBOR19MU1IoKSBhbmQgYWRkZWQgUE5HX0xTTCgpIG1hY3JvLgorICBGaXhlZCBjb21waWxlciB3YXJuaW5ncyB3aXRoIEludGVsIGFuZCBNU1lTIGNvbXBpbGVycy4gVGhlIGxvZ2ljYWwgc2hpZnQKKyAgICBmaXggZm9yIE1pY3Jvc29mdCBWaXN1YWwgQyBpcyByZXF1aXJlZCBieSBvdGhlciBjb21waWxlcnMsIHNvIHRoaXMKKyAgICBlbmFibGVzIHRoYXQgZml4IGZvciBhbGwgY29tcGlsZXJzIHdoZW4gdXNpbmcgY29tcGlsZS10aW1lIGNvbnN0YW50cy4KKyAgICBVbmRlciBNU1lTICdieXRlJyBpcyBhIG5hbWUgZGVjbGFyZWQgaW4gYSBzeXN0ZW0gaGVhZGVyIGZpbGUsIHNvIHdlCisgICAgY2hhbmdlZCB0aGUgbmFtZSBvZiBhIGxvY2FsIHZhcmlhYmxlIHRvIGF2b2lkIHRoZSB3YXJuaW5ncyB0aGF0IHJlc3VsdC4KKyAgQWRkZWQgI2RlZmluZSBQTkdfQUxJR05fVFlQRSBQTkdfQUxJR05fTk9ORSB0byBjb250cmliL3BuZ21pbmltLyovcG5ndXNyLmgKKworVmVyc2lvbiAxLjUuNiBbTm92ZW1iZXIgMywgMjAxMV0KKyAgTm8gY2hhbmdlcy4KKworVmVyc2lvbiAxLjUuN2JldGEwMSBbTm92ZW1iZXIgNCwgMjAxMV0KKyAgQWRkZWQgc3VwcG9ydCBmb3IgQVJNIHByb2Nlc3Nvciwgd2hlbiBkZWNvZGluZyBhbGwgUE5HIHVwLWZpbHRlcmVkIHJvd3MKKyAgICBhbmQgYW55IG90aGVyLWZpbHRlcmVkIHJvd3Mgd2l0aCAzIG9yIDQgYnl0ZXMgcGVyIHBpeGVsIChNYW5zIFJ1bGxnYXJkKS4KKyAgRml4ZWQgYnVnIGluIHBuZ3ZhbGlkIG9uIGVhcmx5IGFsbG9jYXRpb24gZmFpbHVyZTsgZml4ZWQgdHlwZSBjYXN0IGluCisgICAgcG5nbWVtLmM7IHBuZ3ZhbGlkIHdvdWxkIGF0dGVtcHQgdG8gY2FsbCBwbmdfZXJyb3IoKSBpZiB0aGUgYWxsb2NhdGlvbgorICAgIG9mIGEgcG5nX3N0cnVjdCBvciBwbmdfaW5mbyBmYWlsZWQuIFRoaXMgd291bGQgcHJvYmFibHkgaGF2ZSBsZWQgdG8gYQorICAgIGNyYXNoLiAgVGhlIHBuZ21lbS5jIGltcGxlbWVudGF0aW9uIG9mIHBuZ19tYWxsb2MoKSBpbmNsdWRlZCBhIGNhc3QKKyAgICB0byBwbmdfc2l6ZV90IHdoaWNoIHdvdWxkIGZhaWwgb24gbGFyZ2UgYWxsb2NhdGlvbnMgb24gMTYtYml0IHN5c3RlbXMuCisgIEZpeCBmb3IgdGhlIHByZXByb2Nlc3NvciBvZiB0aGUgSW50ZWwgQyBjb21waWxlci4gVGhlIHByZXByb2Nlc3NvcgorICAgIHNwbGl0cyBhZGphY2VudCBAIHNpZ25zIHdpdGggYSBzcGFjZTsgdGhpcyBjaGFuZ2VzIHRoZSBjb25jYXRlbnRhdGlvbgorICAgIHRva2VuIGZyb20gQC1ALUAgdG8gUE5HX0pPSU47IHRoYXQgc2hvdWxkIHdvcmsgd2l0aCBhbGwgY29tcGlsZXIKKyAgICBwcmVwcm9jZXNzb3JzLgorICBQYWV0aCBmaWx0ZXIgc3BlZWQgaW1wcm92ZW1lbnRzIGZyb20gd29yayBieSBTaWFyaGVpIFNpYW1hc2hrYS4gVGhpcworICAgIGNoYW5nZXMgdGhlICdQYWV0aCcgcmVjb25zdHJ1Y3Rpb24gZnVuY3Rpb24gdG8gaW1wcm92ZSB0aGUgR0NDIGNvZGUKKyAgICBnZW5lcmF0aW9uIG9uIHg4Ni4gVGhlIGNoYW5nZXMgYXJlIG9ubHkgcGFydCBvZiB0aGUgc3VnZ2VzdGVkIG9uZXM7CisgICAganVzdCB0aGUgY2hhbmdlcyB0aGF0IGRlZmluaXRlbHkgaW1wcm92ZSBzcGVlZCBhbmQgcmVtYWluIHNpbXBsZS4KKyAgICBUaGUgY2hhbmdlcyBhbHNvIHNsaWdodGx5IGluY3JlYXNlIHRoZSBjbGFyaXR5IG9mIHRoZSBjb2RlLgorCitWZXJzaW9uIDEuNS43YmV0YTAyIFtOb3ZlbWJlciAxMSwgMjAxMV0KKyAgQ2hlY2sgY29tcHJlc3Npb25fdHlwZSBwYXJhbWV0ZXIgaW4gcG5nX2dldF9pQ0NQIGFuZCByZW1vdmUgc3B1cmlvdXMKKyAgICBjYXN0cy4gVGhlIGNvbXByZXNzaW9uX3R5cGUgcGFyYW1ldGVyIGlzIGFsd2F5cyBhc3NpZ25lZCB0bywgc28gbXVzdAorICAgIGJlIG5vbi1OVUxMLiBUaGUgY2FzdCBvZiB0aGUgcHJvZmlsZSBsZW5ndGggcG90ZW50aWFsbHkgdHJ1bmNhdGVkIHRoZQorICAgIHZhbHVlIHVubmVjZXNzYXJpbHkgb24gYSAxNi1iaXQgaW50IHN5c3RlbSwgc28gdGhlIGNhc3Qgb2YgdGhlIChieXRlKQorICAgIGNvbXByZXNzaW9uIHR5cGUgdG8gKGludCkgaXMgc3BlY2lmaWVkIGJ5IEFOU0ktQyBhbnl3YXkuCisgIEZpeGVkIEZQIGRpdmlzaW9uIGJ5IHplcm8gaW4gcG5ndmFsaWQuYzsgdGhlICd0ZXN0X3BpeGVsJyBjb2RlIGxlZnQKKyAgICB0aGUgc0JJVCBmaWVsZHMgaW4gdGhlIHRlc3QgcGl4ZWwgYXMgMCwgd2hpY2ggcmVzdWx0ZWQgaW4gYSBmbG9hdGluZworICAgIHBvaW50IGRpdmlzaW9uIGJ5IHplcm8gd2hpY2ggd2FzIGlycmVsZXZhbnQgYnV0IGNhdXNlcyBzeXN0ZW1zIHdoZXJlCisgICAgRlAgZXhjZXB0aW9ucyBjYXVzZSBhIGNyYXNoLiBBZGRlZCBjb2RlIHRvIHBuZ3ZhbGlkIHRvIHR1cm4gb24gRlAKKyAgICBleGNlcHRpb25zIGlmIHRoZSBhcHByb3ByaWF0ZSBnbGliYyBzdXBwb3J0IGlzIHRoZXJlIHRvIGVuc3VyZSB0aGlzIGlzCisgICAgdGVzdGVkIGluIHRoZSBmdXR1cmUuCisgIFVwZGF0ZWQgc2NyaXB0cy9wbmdsaWJjb25mLm1hayBhbmQgc2NyaXB0cy9tYWtlZmlsZS5zdGQgdG8gaGFuZGxlIHRoZQorICAgIG5ldyBQTkdfSk9JTiBtYWNyby4KKyAgQWRkZWQgdmVyc2lvbmluZyB0byBwbmdsaWJjb25mLmggY29tbWVudHMuCisgIFNpbXBsaWZpZWQgcmVhZC93cml0ZSBBUEkgaW5pdGlhbCB2ZXJzaW9uOyBiYXNpYyByZWFkL3dyaXRlIHRlc3RlZCBvbgorICAgIGEgdmFyaWV0eSBvZiBpbWFnZXMsIGxpbWl0ZWQgZG9jdW1lbnRhdGlvbiAoaW4gdGhlIGhlYWRlciBmaWxlLikKKyAgSW5zdGFsbGVkIG1vcmUgYWNjdXJhdGUgbGluZWFyIHRvIHNSR0IgY29udmVyc2lvbiB0YWJsZXMuIFRoZSBzbGlnaHRseQorICAgIG1vZGlmaWVkIHRhYmxlcyByZWR1Y2UgdGhlIG51bWJlciBvZiAxNi1iaXQgdmFsdWVzIHRoYXQKKyAgICBjb252ZXJ0IHRvIGFuIG9mZi1ieS1vbmUgOC1iaXQgdmFsdWUuICBUaGUgIm1ha2VzUkdCLmMiIGNvZGUgdGhhdCB3YXMgdXNlZAorICAgIHRvIGdlbmVyYXRlIHRoZSB0YWJsZXMgaXMgbm93IGluIGEgY29udHJpYi9zUkdCdGFibGVzIHN1Yi1kaXJlY3RvcnkuCisKK1ZlcnNpb24gMS41LjdiZXRhMDMgW05vdmVtYmVyIDE3LCAyMDExXQorICBSZW1vdmVkIFBOR19DT05TVCBmcm9tIHRoZSBzUkdCIHRhYmxlIGRlY2xhcmF0aW9ucyBpbiBwbmdwcml2LmggYW5kIHBuZy5jCisgIEFkZGVkIHJ1bi10aW1lIGRldGVjdGlvbiBvZiBORU9OIHN1cHBvcnQuCisgIEFkZGVkIGNvbnRyaWIvbGlidGVzdHM7IGluY2x1ZGVzIHNpbXBsaWZpZWQgQVBJIHRlc3QgYW5kIHRpbWluZyB0ZXN0IGFuZAorICAgIGEgY29sb3IgY29udmVyc2lvbiB1dGlsaXR5IGZvciByYXBpZCBjaGVja2luZyBvZiBmYWlsZWQgJ3BuZ3N0ZXN0JyByZXN1bHRzLgorICBNdWx0aXBsZSB0cmFuc2Zvcm0gYnVnIGZpeGVzIHBsdXMgYSB3b3JrLXJvdW5kIGZvciBkb3VibGUgZ2FtbWEgY29ycmVjdGlvbi4KKyAgICBsaWJwbmcgZG9lcyBub3Qgc3VwcG9ydCBtb3JlIHRoYW4gb25lIHRyYW5zZm9ybSB0aGF0IHJlcXVpcmVzIGxpbmVhciBkYXRhCisgICAgYXQgb25jZSAtIGlmIHRoaXMgaXMgdHJpZWQgdHlwaWNhbGx5IHRoZSByZXN1bHRzIGlzIGRvdWJsZSBnYW1tYQorICAgIGNvcnJlY3Rpb24uIFNpbmNlIHRoZSBzaW1wbGlmaWVkIEFQSXMgY2FuIG5lZWQgcmdiIHRvIGdyYXkgY29tYmluZWQgd2l0aAorICAgIGEgY29tcG9zZSBvcGVyYXRpb24gaXQgaXMgbmVjZXNzYXJ5IHRvIGRvIG9uZSBvZiB0aGVzZSBvdXRzaWRlIHRoZSBtYWluCisgICAgbGlicG5nIHRyYW5zZm9ybSBjb2RlLiBUaGlzIGNoZWNrLWluIGFsc28gY29udGFpbnMgZml4ZXMgdG8gdmFyaW91cyBidWdzCisgICAgaW4gdGhlIHNpbXBsaWZpZWQgQVBJcyB0aGVtc2VsdmVzIGFuZCB0byBzb21lIGJ1Z3MgaW4gY29tcG9zZSBhbmQgcmdiIHRvCisgICAgZ3JheSAob24gcGFsZXR0ZSkgaXRzZWxmLgorICBGaXhlcyBmb3IgQysrIGNvbXBpbGF0aW9uIHVzaW5nIGcrKyBXaGVuIGxpYnBuZyBzb3VyY2UgaXMgY29tcGlsZWQKKyAgICB1c2luZyBnKysuIFRoZSBjb21waWxlciBpbXBvc2VzIEMrKyBydWxlcyBvbiB0aGUgQyBzb3VyY2U7IHRodXMgaXQKKyAgICBpcyBkZXNpcmVhYmxlIHRvIG1ha2UgdGhlIHNvdXJjZSB3b3JrIHdpdGggZWl0aGVyIEMgb3IgQysrIHJ1bGVzCisgICAgd2l0aG91dCB0aHJvd2luZyBhd2F5IHVzZWZ1bCBlcnJvciBpbmZvcm1hdGlvbi4gIFRoaXMgY2hhbmdlIGFkZHMKKyAgICBwbmdfdm9pZGNhc3QgdG8gYWxsb3cgQyBzZW1hbnRpYyAodm9pZCopIGNhc2VzIG9yIHRoZSBjb3JyZXNwb25kaW5nCisgICAgQysrIHN0YXRpY19jYXN0IG9wZXJhdGlvbiwgYXMgYXBwcm9wcmlhdGUuCisgIEFkZGVkIC0tbm9leGVjc3RhY2sgdG8gYXNzZW1ibGVyIGZpbGUgY29tcGlsYXRpb24uIEdDQyBkb2VzIG5vdCBzZXQKKyAgICB0aGlzIG9uIGFzc2VtYmxlciBjb21waWxhdGlvbiwgZXZlbiB0aG91Z2ggaXQgZG9lcyBvbiBDIGNvbXBpbGF0aW9uLgorICAgIFRoaXMgY3JlYXRlcyBzZWN1cml0eSBpc3N1ZXMgaWYgYXNzZW1ibGVyIGNvZGUgaXMgZW5hYmxlZDsgdGhlCisgICAgd29yay1hcm91bmQgaXMgdG8gc2V0IGl0IGJ5IGRlZmF1bHQgaW4gdGhlIGZsYWdzIGZvciAkKENDQVMpCisgIFdvcmsgYXJvdW5kIGNvbXBpbGVycyB0aGF0IGRvbid0IHN1cHBvcnQgZGVjbGFyYXRpb24gb2YgY29uc3QgZGF0YS4gU29tZQorICAgIGNvbXBpbGVycyBmYXVsdCAnZXh0ZXJuIGNvbnN0JyBkYXRhIGRlY2xhcmF0aW9ucyAoYmVjYXVzZSB0aGUgZGF0YSBpcworICAgIG5vdCBpbml0aWFsaXplZCk7IHRoaXMgdHVybnMgb24gY29uc3QtbmVzcyBvbmx5IGZvciBjb21waWxlcnMgd2hlcmUKKyAgICB0aGlzIGlzIGtub3duIHRvIHdvcmsuCisKK1ZlcnNpb24gMS41LjdiZXRhMDQgW05vdmVtYmVyIDE3LCAyMDExXQorICBTaW5jZSB0aGUgZ2NjIGRyaXZlciBkb2VzIG5vdCByZWNvZ25pemUgdGhlIC0tbm9leGVjc3RhY2sgZmxhZywgd2UgbXVzdAorICAgIHVzZSB0aGUgLVdhIHByZWZpeCB0byBoYXZlIGl0IHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBhc3NlbWJsZXIuCisgICAgQWxzbyByZW1vdmVkIGEgZHVwbGljYXRlIHNldHRpbmcgb2YgdGhpcyBmbGFnLgorICBBZGRlZCBmaWxlcyB0aGF0IHdlcmUgb21pdHRlZCBmcm9tIHRoZSBsaWJwbmctMS41LjdiZXRhMDMgemlwIGRpc3RyaWJ1dGlvbi4KKworVmVyc2lvbiAxLjUuN2JldGEwNSBbTm92ZW1iZXIgMjUsIDIwMTFdCisgIFJlbW92ZWQgInpUWHQiIGZyb20gd2FybmluZyBpbiBnZW5lcmljIGNodW5rIGRlY29tcHJlc3Npb24gZnVuY3Rpb24uCisgIFZhbGlkYXRlIHRpbWUgc2V0dGluZ3MgcGFzc2VkIHRvIHBuZ19zZXRfdElNRSgpIGFuZCBwbmdfY29udmVydF90b19yZmMxMTIzKCkKKyAgICAoRnJhbmsgQnVzc2UpLiBOb3RlOiBUaGlzIHByZXZlbnRlZCBDVkUtMjAxNS03OTgxIGZyb20gYWZmZWN0aW5nCisgICAgbGlicG5nLTEuNS43IGFuZCBsYXRlci4KKyAgQWRkZWQgTUlOR1cgc3VwcG9ydCB0byBDTWFrZUxpc3RzLnR4dAorICBSZWplY3QgaW52YWxpZCBjb21wcmVzc2lvbiBmbGFnIG9yIG1ldGhvZCB3aGVuIHJlYWRpbmcgdGhlIGlUWHQgY2h1bmsuCisgIEJhY2tlZCBvdXQgJ3NpbXBsaWZpZWQnIEFQSSBjaGFuZ2VzLiBUaGUgQVBJIHNlZW1zIHRvbyBjb21wbGV4IGFuZCB0aGVyZQorICAgIGlzIGEgbGFjayBvZiBjb25zZW5zdXMgb3IgZW50aHVzaWFzbSBmb3IgdGhlIHByb3Bvc2Fscy4gIFRoZSBBUEkgYWxzbworICAgIHJldmVhbHMgc2lnbmlmaWNhbnQgYnVncyBpbnNpZGUgbGlicG5nIChkb3VibGUgZ2FtbWEgY29ycmVjdGlvbiBhbmQgdGhlCisgICAga25vd24gYnVnIG9mIGJlaW5nIHVuYWJsZSB0byByZXRyaWV2ZSBhIGNvcnJlY3RlZCBwYWxldHRlKS4gSXQgc2VlbXMKKyAgICBiZXR0ZXIgdG8gd2FpdCB1bnRpbCB0aGUgYnVncywgYXQgbGVhc3QsIGFyZSBjb3JyZWN0ZWQuCisgIE1vdmVkIHBuZ3ZhbGlkLmMgaW50byBjb250cmliL2xpYnRlc3RzCisgIFJlYnVpbHQgTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZSwgZXRjLiwgd2l0aCBhdXRvY29uZi0yLjY4CisKK1ZlcnNpb24gMS41LjdyYzAxIFtEZWNlbWJlciAxLCAyMDExXQorICBSZXBsYWNlZCBhbiAiI2lmIiB3aXRoICIjaWZkZWYiIGluIHBuZ3J0cmFuLmMKKyAgUmV2aXNlZCAjaWYgUE5HX0RPX0JDIGJsb2NrIGluIHBuZy5jICh1c2UgI2lmZGVmIGFuZCBhZGQgI2Vsc2UpCisKK1ZlcnNpb24gMS41LjdyYzAyIFtEZWNlbWJlciA1LCAyMDExXQorICBSZXZpc2VkIHByb2plY3QgZmlsZXMgYW5kIGNvbnRyaWIvcG5ndmFsaWQvcG5ndmFsaWQuYyB0byBhY2NvdW50IGZvcgorICAgIHRoZSByZWxvY2F0aW9uIG9mIHBuZ3ZhbGlkIGludG8gY29udHJpYi9saWJ0ZXN0cy4KKyAgUmV2aXNlZCBwbmdjb25mLmggdG8gdXNlICIgX19kZWNsc3BlYyhyZXN0cmljdCkiIG9ubHkgd2hlbiBNU0NfVkVSID49IDE0MDAsCisgICAgYXMgaW4gbGlicG5nLTEuNS40LgorICBQdXQgQ1JMRiBsaW5lIGVuZGluZ3MgaW4gdGhlIG93YXRjb20gcHJvamVjdCBmaWxlcy4KKworVmVyc2lvbiAxLjUuN3JjMDMgW0RlY2VtYmVyIDcsIDIwMTFdCisgIFVwZGF0ZWQgQ01ha2VMaXN0cy50eHQgdG8gYWNjb3VudCBmb3IgdGhlIHJlbG9jYXRpb24gb2YgcG5ndmFsaWQuYworCitWZXJzaW9uIDEuNS43IFtEZWNlbWJlciAxNSwgMjAxMV0KKyAgTWlub3IgZml4ZXMgdG8gcG5ndmFsaWQuYyBmb3IgZ2NjIDQuNi4yIGNvbXBhdGliaWxpdHkgdG8gcmVtb3ZlIHdhcm5pbmdzCisgICAgcmVwb3J0ZWQgYnkgZWFybGllciB2ZXJzaW9ucy4KKyAgRml4ZWQgbWlub3IgbWVtc2V0L3NpemVvZiBlcnJvcnMgaW4gcG5ndmFsaWQuYy4KKworVmVyc2lvbiAxLjYuMGJldGEwMSBbRGVjZW1iZXIgMTUsIDIwMTFdCisgIFJlbW92ZWQgbWFjaGluZS1nZW5lcmF0ZWQgY29uZmlndXJlIGZpbGVzIGZyb20gdGhlIEdJVCByZXBvc2l0b3J5ICh0aGV5IHdpbGwKKyAgICBjb250aW51ZSB0byBhcHBlYXIgaW4gdGhlIHRhcmJhbGwgZGlzdHJpYnV0aW9ucyBhbmQgaW4gdGhlIGxpYnBuZzE1IGFuZAorICAgIGVhcmxpZXIgR0lUIGJyYW5jaGVzKS4KKyAgUmVzdG9yZWQgdGhlIG5ldyAnc2ltcGxpZmllZCcgQVBJLCB3aGljaCB3YXMgc3RhcnRlZCBpbiBsaWJwbmctMS41LjdiZXRhMDIKKyAgICBidXQgbGF0ZXIgZGVsZXRlZCBmcm9tIGxpYnBuZy0xLjUuN2JldGEwNS4KKyAgQWRkZWQgZXhhbXBsZSBwcm9ncmFtcyBmb3IgdGhlIG5ldyAnc2ltcGxpZmllZCcgQVBJLgorICBBZGRlZCBBTlNJLUMgKEM5MCkgaGVhZGVycyBhbmQgcmVxdWlyZSB0aGVtLCBhbmQgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlCisgICAgY2hhbmdlLiBBbHNvIGZpeGVkIHNvbWUgb2YgdGhlIHByb2plY3RzLyogYW5kIGNvbnRyaWIvKiBmaWxlcyB0aGF0IG5lZWRlZAorICAgIHVwZGF0ZXMgZm9yIGxpYnBuZzE2IGFuZCB0aGUgbW92ZSBvZiBwbmd2YWxpZC5jLgorICAgIFdpdGggdGhpcyBjaGFuZ2UgdGhlIHJlcXVpcmVkIEFOU0ktQyBoZWFkZXIgZmlsZXMgYXJlIGFzc3VtZWQgdG8gZXhpc3Q6IHRoZQorICAgIGltcGxlbWVudGF0aW9uIG11c3QgcHJvdmlkZSBmbG9hdC5oLCBsaW1pdHMuaCwgc3RkYXJnLmggYW5kIHN0ZGRlZi5oIGFuZAorICAgIGxpYnBuZyByZWxpZXMgb24gbGltaXRzLmggYW5kIHN0ZGRlZi5oIGV4aXN0aW5nIGFuZCBiZWhhdmluZyBhcyBkZWZpbmVkCisgICAgKHRoZSBvdGhlciB0d28gcmVxdWlyZWQgaGVhZGVycyBhcmVuJ3QgdXNlZCkuICBOb24tQU5TSSBzeXN0ZW1zIHRoYXQgZG9uJ3QKKyAgICBoYXZlIHN0ZGRlZi5oIG9yIGxpbWl0cy5oIHdpbGwgaGF2ZSB0byBwcm92aWRlIGFuIGFwcHJvcHJpYXRlIGZha2UKKyAgICBjb250YWluaW5nIHRoZSByZWxldmFudCB0eXBlcyBhbmQgI2RlZmluZXMuCisgIERyb3BwZWQgc3VwcG9ydCBmb3IgMTYtYml0IHBsYXRmb3Jtcy4gVGhlIHVzZSBvZiBGQVIvZmFyIGhhcyBiZWVuIGVsaW1pbmF0ZWQKKyAgICBhbmQgdGhlIGRlZmluaXRpb24gb2YgcG5nX2FsbG9jX3NpemVfdCBpcyBub3cgY29udHJvbGxlZCBieSBhIGZsYWcgc28KKyAgICB0aGF0ICdzbWFsbCBzaXplX3QnIHN5c3RlbXMgY2FuIHNlbGVjdCBpdCBpZiBuZWNlc3NhcnkuICBMaWJwbmcgMS42IG1heQorICAgIG5vdCBjdXJyZW50bHkgd29yayBvbiBzdWNoIHN5c3RlbXMgLS0gaXQgc2VlbXMgbGlrZWx5IHRoYXQgaXQgd2lsbAorICAgIGFzayAnbWFsbG9jJyBmb3IgbW9yZSB0aGFuIDY1NTM1IGJ5dGVzIHdpdGggYW55IGltYWdlIHRoYXQgaGFzIGEKKyAgICBzdWZmaWNpZW50bHkgbGFyZ2Ugcm93IHNpemUgKHJhdGhlciB0aGFuIHNpbXBseSBmYWlsaW5nIHRvIHJlYWQgc3VjaAorICAgIGltYWdlcykuCisgIE5ldyB0b29scyBkaXJlY3RvcnkgY29udGFpbmluZyB0b29scyB1c2VkIHRvIGdlbmVyYXRlIGxpYnBuZyBjb2RlLgorICBGaXhlZCByYWNlIGNvbmRpdGlvbnMgaW4gcGFyYWxsZWwgbWFrZSBidWlsZHMuIFdpdGggaGlnaGVyIGRlZ3JlZXMgb2YKKyAgICBwYXJhbGxlbGlzbSBkdXJpbmcgJ21ha2UnIHRoZSB1c2Ugb2YgdGhlIHNhbWUgdGVtcG9yYXJ5IGZpbGUgbmFtZXMgc3VjaAorICAgIGFzICdkZm4qJyBjYW4gcmVzdWx0IGluIGEgcmFjZSB3aGVyZSBhIHRlbXBvcmFyeSBmaWxlIGZyb20gb25lIGFybSBvZiB0aGUKKyAgICBidWlsZCBpcyBkZWxldGVkIG9yIG92ZXJ3cml0dGVuIGluIGFub3RoZXIgYXJtLiAgVGhpcyBjaGFuZ2VzIHRoZQorICAgIHRlbXBvcmFyeSBmaWxlcyBmb3Igc3VmZml4IHJ1bGVzIHRvIGFsd2F5cyB1c2UgJCogYW5kIGVuc3VyZXMgdGhhdCB0aGUKKyAgICBub24tc3VmZml4IHJ1bGVzIHVzZSB1bmlxdWUgZmlsZSBuYW1lcy4KKworVmVyc2lvbiAxLjYuMGJldGEwMiBbRGVjZW1iZXIgMjEsIDIwMTFdCisgIENvcnJlY3QgY29uZmlndXJlIGJ1aWxkcyB3aGVyZSBidWlsZCBhbmQgc291cmNlIGRpcmVjdG9yaWVzIGFyZSBzZXBhcmF0ZS4KKyAgICBUaGUgaW5jbHVkZSBwYXRoIG9mICdjb25maWcuaCcgd2FzIGVycm9uZW91c2x5IG1hZGUgcmVsYXRpdmUgaW4gcG5ndmFsaWQuYworICAgIGluIGxpYnBuZyAxLjUuNy4KKworVmVyc2lvbiAxLjYuMGJldGEwMyBbRGVjZW1iZXIgMjIsIDIwMTFdCisgIFN0YXJ0LXVwIGNvZGUgc2l6ZSBpbXByb3ZlbWVudHMsIGVycm9yIGhhbmRsZXIgZmxleGliaWxpdHkuIFRoZXNlIGNoYW5nZXMKKyAgICBhbHRlciBob3cgdGhlIHRyaWNreSBhbGxvY2F0aW9uIG9mIHRoZSBpbml0aWFsIHBuZ19zdHJ1Y3QgYW5kIHBuZ19pbmZvCisgICAgc3RydWN0dXJlcyBhcmUgaGFuZGxlZC4gcG5nX2luZm8gaXMgbm93IGhhbmRsZWQgaW4gcHJldHR5IG11Y2ggdGhlIHNhbWUKKyAgICB3YXkgYXMgZXZlcnl0aGluZyBlbHNlLCBleGNlcHQgdGhhdCB0aGUgYWxsb2NhdGlvbnMgaGFuZGxlIE5VTEwgcmV0dXJuCisgICAgc2lsZW50bHkuICBwbmdfc3RydWN0IGlzIGNoYW5nZWQgaW4gYSBzaW1pbGFyIHdheSBvbiBhbGxvY2F0aW9uIGFuZCBvbgorICAgIGRlYWxsb2NhdGlvbiBhICdzYWZldHknIGVycm9yIGhhbmRsZXIgaXMgcHV0IGluIHBsYWNlICh3aGljaCBzaG91bGQgbmV2ZXIKKyAgICBiZSByZXF1aXJlZCkuICBUaGUgZXJyb3IgaGFuZGxlciBpdHNlbGYgaXMgY2hhbmdlZCB0byBwZXJtaXQgbWlzbWF0Y2hlcworICAgIGluIHRoZSBhcHBsaWNhdGlvbiBhbmQgbGlicG5nIGVycm9yIGJ1ZmZlciBzaXplOyBob3dldmVyLCB0aGlzIG1lYW5zIGEKKyAgICBzaWxlbnQgY2hhbmdlIHRvIHRoZSBBUEkgdG8gcmV0dXJuIHRoZSBqbXBfYnVmIGlmIHRoZSBzaXplIGRvZXNuJ3QgbWF0Y2gKKyAgICB0aGUgc2l6ZSBmcm9tIHRoZSBsaWJwbmcgY29tcGlsYXRpb247IGxpYnBuZyBub3cgYWxsb2NhdGVzIHRoZSBtZW1vcnkgYW5kCisgICAgdGhpcyBtYXkgZmFpbC4gIE92ZXJhbGwgdGhlc2UgY2hhbmdlcyByZXN1bHQgaW4gc2xpZ2h0IGNvZGUgc2l6ZQorICAgIHJlZHVjdGlvbnM7IGhvd2V2ZXIsIHRoaXMgaXMgYSByZWR1Y3Rpb24gaW4gY29kZSB0aGF0IGlzIGFsd2F5cyBleGVjdXRlZAorICAgIHNvIGlzIHBhcnRpY3VsYXJseSB2YWx1YWJsZS4gIE92ZXJhbGwgb24gYSA2NC1iaXQgc3lzdGVtIHRoZSBsaWJwbmcgRExMCisgICAgZGVjcmVhc2VzIGluIGNvZGUgc2l6ZSBieSAxNzMzIGJ5dGVzLiAgcG5nZXJyb3IubyBpbmNyZWFzZXMgaW4gc2l6ZSBieQorICAgIGFib3V0IDQ2NSBieXRlcyBiZWNhdXNlIG9mIHRoZSBuZXcgZnVuY3Rpb25hbGl0eS4KKyAgQWRkZWQgcG5nX2NvbnZlcnRfdG9fcmZjMTEyM19idWZmZXIoKSBhbmQgZGVwcmVjYXRlZCBwbmdfY29udmVydF90b19yZmMxMTIzKCkKKyAgICB0byBhdm9pZCBpbmNsdWRpbmcgYSBzcHVyaW91cyBidWZmZXIgaW4gdGhlIHBuZ19zdHJ1Y3QuCisKK1ZlcnNpb24gMS42LjBiZXRhMDQgW0RlY2VtYmVyIDMwLCAyMDExXQorICBSZWdlbmVyYXRlZCBjb25maWd1cmUgc2NyaXB0cyB3aXRoIGF1dG9tYWtlLTEuMTEuMgorICBFbGltaW5hdGVkIHBuZ19pbmZvX2Rlc3Ryb3koKS4gSXQgaXMgbm93IHVzZWQgb25seSBpbiBwbmcuYyBhbmQgb25seSBjYWxscworICAgIG9uZSBvdGhlciBpbnRlcm5hbCBmdW5jdGlvbiBhbmQgbWVtc2V0KCkuCisgIEVuYWJsZWQgcG5nX2dldF9zQ0FMX2ZpeGVkKCkgaWYgZmxvYXRpbmcgcG9pbnQgQVBJcyBhcmUgZW5hYmxlZC4gUHJldmlvdXNseQorICAgIGl0IHdhcyBkaXNhYmxlZCB3aGVuZXZlciBpbnRlcm5hbCBmaXhlZCBwb2ludCBhcml0aG1ldGljIHdhcyBzZWxlY3RlZCwKKyAgICB3aGljaCBtZWFudCBpdCBkaWRuJ3QgZXhpc3QgZXZlbiBvbiBzeXN0ZW1zIHdoZXJlIEZQIHdhcyBhdmFpbGFibGUgYnV0IG5vdAorICAgIHByZWZlcnJlZC4KKyAgQWRkZWQgcG5ndmFsaWQuYyBjb21waWxlIHRpbWUgY2hlY2tzIGZvciBjb25zdCBBUElzLgorICBJbXBsZW1lbnRlZCAncmVzdHJpY3QnIGZvciBwbmdfaW5mbyBhbmQgcG5nX3N0cnVjdC4gQmVjYXVzZSBvZiB0aGUgd2F5CisgICAgbGlicG5nIHdvcmtzIGJvdGggcG5nX2luZm8gYW5kIHBuZ19zdHJ1Y3QgYXJlIGFsd2F5cyBhY2Nlc3NlZCB2aWEgYQorICAgIHNpbmdsZSBwb2ludGVyLiAgVGhpcyBtZWFucyBhZGRpbmcgQzk5ICdyZXN0cmljdCcgdG8gdGhlIHBvaW50ZXIgZ2l2ZXMKKyAgICB0aGUgY29tcGlsZXIgc29tZSBvcHBvcnR1bml0eSB0byBvcHRpbWl6ZSB0aGUgY29kZS4gIFRoaXMgY2hhbmdlIGFsbG93cworICAgIHRoYXQuCisgIE1vdmVkIEFDX01TR19DSEVDS0lORyhbaWYgbGlicmFyaWVzIGNhbiBiZSB2ZXJzaW9uZWRdKSBsYXRlciB0byB0aGUgcHJvcGVyCisgICAgbG9jYXRpb24gaW4gY29uZmlndXJlLmFjIChHaWxsZXMgRXNwaW5hc3NlKS4KKyAgQ2hhbmdlZCBwbmdfbWVtY3B5IHRvIEMgYXNzaWdubWVudCB3aGVyZSBhcHByb3ByaWF0ZS4gQ2hhbmdlZCBhbGwgdGhvc2UKKyAgICB1c2VzIG9mIHBuZ19tZW1jcHkgdGhhdCB3ZXJlIGRvaW5nIGEgc2ltcGxlIGFzc2lnbm1lbnQgdG8gYXNzaWdubWVudHMKKyAgICAoYWxsIHRob3NlIGNhc2VzIHdoZXJlIHRoZSB0aGluZyBiZWluZyBjb3BpZWQgaXMgYSBub24tYXJyYXkgQyBMLXZhbHVlKS4KKyAgQWRkZWQgc29tZSBlcnJvciBjaGVja2luZyB0byBwbmdfc2V0XyooKSByb3V0aW5lcy4KKyAgUmVtb3ZlZCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBub24tZXhwb3J0ZWQgZnVuY3Rpb24gcG5nX21lbWNweSgpIGZyb20KKyAgICBleGFtcGxlLmMuCisgIEZpeGVkIHRoZSBWaXN1YWwgQyA2NC1iaXQgYnVpbGQgLSBpdCByZXF1aXJlcyBqbXBfYnVmIHRvIGJlIGFsaWduZWQsIGJ1dAorICAgIGl0IGhhZCBiZWNvbWUgbWlzYWxpZ25lZC4KKyAgUmV2aXNlZCBjb250cmliL3BuZ21pbnVzL3BubTJwbmcuYyB0byBhdm9pZCB3YXJuaW5ncyB3aGVuIHBuZ191aW50XzMyCisgICAgYW5kIHVuc2lnbmVkIGxvbmcgYXJlIG9mIGRpZmZlcmVudCBzaXplcy4KKworVmVyc2lvbiAxLjYuMGJldGEwNSBbSmFudWFyeSAxNSwgMjAxMl0KKyAgVXBkYXRlZCBtYW51YWwgd2l0aCBkZXNjcmlwdGlvbiBvZiB0aGUgc2ltcGxpZmllZCBBUEkgKGNvcGllZCBmcm9tIHBuZy5oKQorICBGaXggYnVnIGluIHBuZ2Vycm9yLmM6IHNvbWUgbG9uZyB3YXJuaW5ncyB3ZXJlIGJlaW5nIGltcHJvcGVybHkgdHJ1bmNhdGVkCisgICAgKENWRS0yMDExLTM0NjQsIGJ1ZyBpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjUuM2JldGEwNSkuCisKK1ZlcnNpb24gMS42LjBiZXRhMDYgW0phbnVhcnkgMjQsIDIwMTJdCisgIEFkZGVkIHBhbGV0dGUgc3VwcG9ydCB0byB0aGUgc2ltcGxpZmllZCBBUElzLiBUaGlzIGNvbW1pdAorICAgIGNoYW5nZXMgc29tZSBvZiB0aGUgbWFjcm8gZGVmaW5pdGlvbnMgaW4gcG5nLmgsIGFwcCBjb2RlCisgICAgbWF5IG5lZWQgY29ycmVzcG9uZGluZyBjaGFuZ2VzLgorICBJbmNyZWFzZWQgdGhlIGZvcm1hdHRlZCB3YXJuaW5nIGJ1ZmZlciB0byAxOTIgYnl0ZXMuCisgIEFkZGVkIGNvbG9yLW1hcCBzdXBwb3J0IHRvIHNpbXBsaWZpZWQgQVBJLiBUaGlzIGlzIGFuIGluaXRpYWwgdmVyc2lvbiBmb3IKKyAgICByZXZpZXc7IHRoZSBkb2N1bWVudGF0aW9uIGhhcyBub3QgeWV0IGJlZW4gdXBkYXRlZC4KKyAgRml4ZWQgTWluL0dXIHVuaW5zdGFsbCB0byByZW1vdmUgbGlicG5nLmRsbC5hCisKK1ZlcnNpb24gMS42LjBiZXRhMDcgW0phbnVhcnkgMjgsIDIwMTJdCisgIEVsaW1pbmF0ZWQgSW50ZWwgaWNjL2ljbCBjb21waWxlciB3YXJuaW5ncy4gVGhlIEludGVsIChHQ0MgZGVyaXZlZCkKKyAgICBjb21waWxlciBpc3N1ZXMgc2xpZ2h0bHkgZGlmZmVyZW50IHdhcm5pbmdzIGZyb20gdGhvc2UgaXNzdWVkIGJ5IHRoZQorICAgIGN1cnJlbnQgdmVzaW9ucyBvZiBHQ0MuIFRoaXMgZWxpbWluYXRlcyB0aG9zZSB3YXJuaW5ncyBieQorICAgIGFkZGluZy9yZW1vdmluZyBjYXN0cyBhbmQgc21hbGwgY29kZSByZXdyaXRlcy4KKyAgVXBkYXRlZCBjb25maWd1cmUuYWMgZnJvbSBhdXRvdXBkYXRlOiBhZGRlZCAtLWVuYWJsZS13ZXJyb3Igb3B0aW9uLgorICAgIEFsc28gc29tZSBsYXlvdXQgcmVndWxhcml6YXRpb24gYW5kIHJlbW92YWwgb2YgaW50cm9kdWNlZCB0YWIgY2hhcmFjdGVycworICAgIChyZXBsYWNlZCB3aXRoIDMtY2hhcmFjdGVyIGluZGVudGF0aW9uKS4gIE9ic29sZXRlIG1hY3JvcyBpZGVudGlmaWVkIGJ5CisgICAgYXV0b3VwZGF0ZSBoYXZlIGJlZW4gcmVtb3ZlZDsgdGhlIHJlcGxhY2VtZW50cyBhcmUgYWxsIGluIDIuNTkgc28KKyAgICB0aGUgcHJlLXJlcSBoYXNuJ3QgYmVlbiBjaGFuZ2VkLiAgLS1lbmFibGUtd2Vycm9yIGNoZWNrcyBmb3Igc3VwcG9ydAorICAgIGZvciAtV2Vycm9yIChvciB0aGUgZ2l2ZW4gYXJndW1lbnQpIGluIHRoZSBjb21waWxlci4gIFRoaXMgbWltaWNzIHRoZQorICAgIGdjYyBjb25maWd1cmUgb3B0aW9uIGJ5IGFsbG93aW5nIC1XZXJyb3IgdG8gYmUgdHVybmVkIG9uIHNhZmVseTsgd2l0aG91dAorICAgIHRoZSBvcHRpb24gdGhlIHRlc3RzIHdyaXR0ZW4gaW4gY29uZmlndXJlIGl0c2VsZiBmYWlsIGNvbXBpbGF0aW9uIGJlY2F1c2UKKyAgICB0aGV5IGNhdXNlIGNvbXBpbGVyIHdhcm5pbmdzLgorICBSZXdyb3RlIGF1dG9nZW4uc2ggdG8gcnVuIGF1dG9yZWNvbmYgaW5zdGVhZCBvZiBydW5uaW5nIHRvb2xzIG9uZS1ieS1vbmUuCisgIENvbmRpdGlvbmFsaXplIHRoZSBpbnN0YWxsIHJ1bGVzIGZvciBNSU5HVyBhbmQgQ1lHV0lOIGluIENNYWtlTGlzdHMudHh0IGFuZAorICAgIHNldCBDTUFLRV9MSUJSQVJZX09VVFBVVF9ESVJFQ1RPUlkgdG8gImxpYiIgb24gYWxsIHBsYXRmb3JtcyAoQy4gWWFwcCkuCisgIEZyZWV6ZSBsaWJ0b29sIGZpbGVzIGluIHRoZSAnc2NyaXB0cycgZGlyZWN0b3J5LiBUaGlzIHZlcnNpb24gb2YgYXV0b2dlbi5zaAorICAgIGF0dGVtcHRzIHRvIGRpc3N1YWRlIHBlb3BsZSBmcm9tIHJ1bm5pbmcgaXQgd2hlbiBpdCBpcyBub3QsIG9yIHNob3VsZCBub3QsCisgICAgYmUgbmVjZXNzYXJ5LiAgSW4gZmFjdCwgYXV0b2dlbi5zaCBkb2VzIG5vdCB3b3JrIHdoZW4gcnVuIGluIGEgbGlicG5nCisgICAgZGlyZWN0b3J5IGV4dHJhY3RlZCBmcm9tIGEgdGFyIGRpc3RyaWJ1dGlvbiBhbnltb3JlLiBZb3UgbXVzdCBydW4gaXQgaW4KKyAgICBhIEdJVCBjbG9uZSBpbnN0ZWFkLgorICBBZGRlZCB0d28gaW1hZ2VzIHRvIGNvbnRyaWIvcG5nc3VpdGUgKDEtYml0IGFuZCAyLWJpdCB0cmFuc3BhcmVudCBncmF5c2NhbGUpLAorICAgIGFuZCByZW5hbWVkIHRocmVlIHdob3NlIG5hbWVzIHdlcmUgaW5jb25zaXN0ZW50IHdpdGggdGhvc2UgaW4KKyAgICBwbmdzdWl0ZS9SRUFETUUudHh0LgorCitWZXJzaW9uIDEuNi4wYmV0YTA4IFtGZWJydWFyeSAxLCAyMDEyXQorICBGaXhlZCBJbWFnZTo6Y29sb3JtYXAgbWlzYWxpZ25tZW50IGluIHBuZ3N0ZXN0LmMKKyAgQ2hlY2sgbGlidG9vbC9saWJ0b29saXplIHZlcnNpb24gbnVtYmVyICgyLjQuMikgaW4gY29uZmlndXJlLmFjCisgIERpdmlkZSB0ZXN0LXBuZ3N0ZXN0LnNoIGludG8gc2VwYXJhdGUgcG5nc3Rlc3QgcnVucyBmb3IgYmFzaWMgYW5kCisgICAgdHJhbnNwYXJlbnQgaW1hZ2VzLgorICBNb3ZlZCBhdXRvbWFrZSBvcHRpb25zIHRvIEFNX0lOSVRfQVVUT01BS0UgaW4gY29uZmlndXJlLmFjCisgIEFkZGVkIGNvbG9yLXRlc3RzLCBzaWxlbnQtcnVsZXMgKE5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gTWFrZWZpbGUuYW0pIGFuZAorICAgIHZlcnNpb24gY2hlY2tpbmcgdG8gY29uZmlndXJlLmFjCisgIEltcHJvdmVkIHBuZ3N0ZXN0IHNwZWVkIGJ5IG5vdCBkb2luZyByZWR1bmRhbnQgdGVzdHMgYW5kIGFkZCBjb25zdCB0bworICAgIHRoZSBiYWNrZ3JvdW5kIHBhcmFtZXRlciBvZiBwbmdfaW1hZ2VfZmluaXNoX3JlYWQuIFRoZSAtLWJhY2tncm91bmQKKyAgICBvcHRpb24gaXMgbm93IGRvbmUgYXV0b21hZ2ljYWxseSBvbmx5IHdoZW4gcmVxdWlyZWQsIHNvIHRoYXQgY29tbWFuZGxpbmUKKyAgICBvcHRpb24gbm8gbG9uZ2VyIGV4aXN0cy4KKyAgQ2xlYW5lZCB1cCBwbmdwcml2LmggdG8gY29uc2lzdGVudGx5IGRlY2xhcmUgYWxsIGZ1bmN0aW9ucyBhbmQgZGF0YS4KKyAgICBBbHNvIGVsaW1pbmF0ZWQgUE5HX0NPTlNUX0RBVEEsIHdoaWNoIGlzIGFwcGFyZW50bHkgbm90IG5lZWRlZCBidXQgd2UKKyAgICBjYW4ndCBiZSBzdXJlIHVudGlsIGl0IGlzIGdvbmUuCisgIEFkZGVkIHN5bWJvbCBwcmVmaXhpbmcgdGhhdCBhbGxvd3MgYWxsIHRoZSBsaWJwbmcgZXh0ZXJuYWwgc3ltYm9scworICAgIHRvIGJlIHByZWZpeGVkIChzdWdnZXN0ZWQgYnkgUmV1YmVuIEhhd2tpbnMpLgorICBVcGRhdGVkICJmdGJiKi5wbmciIGxpc3QgaW4gdGhlIG93YXRjb20gYW5kIHZzdHVkaW8gcHJvamVjdHMuCisgIEZpeGVkICdwcmVmaXgnIGJ1aWxkcyBvbiBjbGVhbiBzeXN0ZW1zLiBUaGUgZ2VuZXJhdGlvbiBvZiBwbmdwcmVmaXguaAorICAgIHNob3VsZCBub3QgcmVxdWlyZSBpdHNlbGYuCisgIFVwZGF0ZWQgSU5TVEFMTCB0byBleHBsYWluIHRoYXQgYXV0b2dlbi5zaCBtdXN0IGJlIHJ1biBpbiBhIEdJVCBjbG9uZSwKKyAgICBub3QgaW4gYSBsaWJwbmcgZGlyZWN0b3J5IGV4dHJhY3RlZCBmcm9tIGEgdGFyIGRpc3RyaWJ1dGlvbi4KKworVmVyc2lvbiAxLjYuMGJldGEwOSBbRmVicnVhcnkgMSwgMjAxMl0KKyAgUmV2ZXJ0ZWQgdGhlIHByZWJ1aWx0IGNvbmZpZ3VyZSBmaWxlcyB0byBsaWJwbmctMS42LjBiZXRhMDUgY29uZGl0aW9uLgorCitWZXJzaW9uIDEuNi4wYmV0YTEwIFtGZWJydWFyeSAzLCAyMDEyXQorICBBZGRlZCBaX1NPTE8gZm9yIHpsaWItMS4yLjYrIGFuZCBjb3JyZWN0IHBuZ3N0ZXN0IHRlc3RzCisgIFVwZGF0ZWQgbGlzdCBvZiB0ZXN0IGltYWdlcyBpbiBDTWFrZUxpc3RzLnR4dAorICBVcGRhdGVkIHRoZSBwcmVidWlsdCBjb25maWd1cmUgZmlsZXMgdG8gY3VycmVudCBjb25kaXRpb24uCisgIFJldmlzZWQgSU5TVEFMTCBpbmZvcm1hdGlvbiBhYm91dCBhdXRvZ2VuLnNoOyBpdCB3b3JrcyBpbiB0YXIgZGlzdHJpYnV0aW9ucy4KKworVmVyc2lvbiAxLjYuMGJldGExMSBbRmVicnVhcnkgMTYsIDIwMTJdCisgIEZpeCBjaGFyYWN0ZXIgY291bnQgaW4gcG5nc3Rlc3QgY29tbWFuZCBpbiBwcm9qZWN0cy9vd2F0Y29tL3BuZ3N0ZXN0LnRndAorICBSZXZpc2VkIHRlc3QtcG5nc3Rlc3Quc2ggdG8gcmVwb3J0IFBBU1MvRkFJTCBmb3IgZWFjaCBpbWFnZS4KKyAgVXBkYXRlZCBkb2N1bWVudGF0aW9uIGFib3V0IHRoZSBzaW1wbGlmaWVkIEFQSS4KKyAgQ29ycmVjdGVkIGVzdGltYXRlIG9mIGVycm9yIGluIGxpYnBuZyBwbmdfc2V0X3JnYl90b19ncmF5IEFQSS4gIFRoZSBBUEkgaXMKKyAgICBleHRyZW1lbHkgaW5hY2N1cmF0ZSBmb3Igc1JHQiBjb252ZXJzaW9ucyBiZWNhdXNlIGl0IHVzZXMgYW4gOC1iaXQKKyAgICBpbnRlcm1lZGlhdGUgbGluZWFyIHZhbHVlIGFuZCBpdCBkb2VzIG5vdCB1c2UgdGhlIHNSR0IgdHJhbnNmb3JtLCBzbyBpdAorICAgIHN1ZmZlcnMgZnJvbSB0aGUga25vd24gaW5zdGFiaWxpdHkgaW4gZ2FtbWEgdHJhbnNmb3JtcyBmb3IgdmFsdWVzIGNsb3NlCisgICAgdG8gMCAoc2VlIFBveW50b24pLiAgVGhlIG5ldCByZXN1bHQgaXMgdGhhdCB0aGUgY2FsY3VsYXRpb24gaGFzIGEgbWF4aW11bQorICAgIGVycm9yIG9mIDE0Ljk5LzI1NTsgMC41LzI1NV4oMS8yLjIpLiAgcG5nc3Rlc3Qgbm93IHVzZXMgMTUgZm9yIHRoZQorICAgIHBlcm1pdHRlZCA4LWJpdCBlcnJvci4gVGhpcyBtYXkgc3RpbGwgbm90IGJlIGVub3VnaCBiZWNhdXNlIG9mIGFyaXRobWV0aWMKKyAgICBlcnJvci4KKyAgUmVtb3ZlZCBzb21lIHVudXNlZCBhcnJheXMgKHdpdGggI2lmZGVmKSBmcm9tIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdygpLgorICBGaXhlZCBhIG1lbW9yeSBvdmVyd3JpdGUgYnVnIGluIHNpbXBsaWZpZWQgcmVhZCBvZiBSR0IgUE5HIHdpdGgKKyAgICBub24tbGluZWFyIGdhbW1hIEFsc28gYnVncyBpbiB0aGUgZXJyb3IgY2hlY2tpbmcgaW4gcG5ncmVhZC5jIGFuZCBjaGFuZ2VkCisgICAgcXVpdGUgYSBsb3Qgb2YgdGhlIGNoZWNrcyBpbiBwbmdzdGVzdC5jIHRvIGJlIGNvcnJlY3Q7IGVpdGhlciBjb3JyZWN0bHkKKyAgICB3cml0dGVuIG9yIG5vdCBvdmVyLW9wdGltaXN0aWMuICBUaGUgcG5nc3Rlc3QgY2hhbmdlcyBhcmUgaW5zdWZmaWNpZW50IHRvCisgICAgYWxsb3cgYWxsIHBvc3NpYmxlIFJHQiB0cmFuc2Zvcm1zIHRvIGJlIHBhc3NlZDsgcG5nc3Rlc3QgY21wcGl4ZWwgbmVlZHMKKyAgICB0byBiZSByZXdyaXR0ZW4gdG8gbWFrZSBpdCBjbGVhcmVyIHdoaWNoIGVycm9ycyBpdCBhbGxvd3MgYW5kIHRoZW4gY2hhbmdlZAorICAgIHRvIHBlcm1pdCBrbm93biBpbmFjY3VyYWNpZXMuCisgIFJlbW92ZWQgdGVzdHMgZm9yIG5vLWxvbmdlci11c2VkICpfRU1QVFlfUExURV9TVVBQT1JURUQgZnJvbSBwbmdzdHJ1Y3QuaAorICBGaXhlZCBmaXhlZC9mbG9hdCBBUEkgZXhwb3J0IGNvbmRpdGlvbmFscy4gMSkgSWYgRklYRURfUE9JTlQgb3IKKyAgICBGTE9BVElOR19QT0lOVCBvcHRpb25zIHdlcmUgc3dpdGNoZWQgb2ZmLCBwbmcuaCBlbmRlZCB1cCB3aXRoIGxvbmUgJzsnCisgICAgY2hhcmFjdGVycy4gIFRoaXMgaXMgbm90IHZhbGlkIEFOU0ktQyBvdXRzaWRlIGEgZnVuY3Rpb24uICBUaGUgJzsnCisgICAgY2hhcmFjdGVycyBoYXZlIGJlZW4gbW92ZWQgaW5zaWRlIHRoZSBkZWZpbml0aW9uIG9mIFBOR19GUF9FWFBPUlQgYW5kCisgICAgUE5HX0ZJWEVEX0VYUE9SVC4gMikgSWYgZWl0aGVyIG9wdGlvbiB3YXMgc3dpdGNoZWQgb2ZmLCB0aGUgZGVjbGFyYXRpb24KKyAgICBvZiB0aGUgY29ycmVzcG9uZGluZyBmdW5jdGlvbnMgd2VyZSBjb21wbGV0ZWx5IG9taXR0ZWQsIGV2ZW4gdGhvdWdoIHNvbWUKKyAgICBvZiB0aGVtIGFyZSBzdGlsbCB1c2VkIGludGVybmFsbHkuICBUaGUgcmVzdWx0IGlzIHN0aWxsIHZhbGlkLCBidXQKKyAgICBwcm9kdWNlcyB3YXJuaW5ncyBmcm9tIGdjYyB3aXRoIHNvbWUgd2FybmluZyBvcHRpb25zIChpbmNsdWRpbmcgLVdhbGwpLiBUaGUKKyAgICBmaXggaXMgdG8gY2F1c2UgcG5nLmggdG8gZGVjbGFyZSB0aGUgZnVuY3Rpb25zIHdpdGggUE5HX0lOVEVSTkFMX0ZVTkNUSU9OCisgICAgd2hlbiBwbmcuaCBpcyBpbmNsdWRlZCBmcm9tIHBuZ3ByaXYuaC4KKyAgQ2hlY2sgZm9yIGludmFsaWQgcGFsZXR0ZSBpbmRleCB3aGlsZSByZWFkaW5nIHBhbGV0dGVkIFBORy4gIFdoZW4gb25lIGlzCisgICAgZm91bmQsIGlzc3VlIGEgd2FybmluZyBhbmQgaW5jcmVhc2UgcG5nX3B0ci0+bnVtX3BhbGV0dGUgYWNjb3JkaW5nbHkuCisgICAgQXBwcyBhcmUgcmVzcG9uc2libGUgZm9yIGNoZWNraW5nIHRvIHNlZSBpZiB0aGF0IGhhcHBlbmVkLgorCitWZXJzaW9uIDEuNi4wYmV0YTEyIFtGZWJydWFyeSAxOCwgMjAxMl0KKyAgRG8gbm90IGluY3JlYXNlIG51bV9wYWxldHRlIG9uIGludmFsaWRfaW5kZXguCisgIFJlbG9jYXRlZCBjaGVjayBmb3IgaW52YWxpZCBwYWxldHRlIGluZGV4IHRvIHBuZ3J0cmFuLmMsIGFmdGVyIHVucGFja2luZworICAgIHRoZSBzdWItOC1iaXQgcGl4ZWxzLgorICBGaXhlZCBDVkUtMjAxMS0zMDI2IGJ1ZmZlciBvdmVycnVuIGJ1Zy4gIFRoaXMgYnVnIHdhcyBpbnRyb2R1Y2VkIHdoZW4KKyAgICBpQ0NQIGNodW5rIHN1cHBvcnQgd2FzIGFkZGVkIGF0IGxpYnBuZy0xLjAuNi4gRGVhbCBtb3JlIGNvcnJlY3RseSB3aXRoIHRoZQorICAgIHRlc3Qgb24gaUNDUCBjaHVuayBsZW5ndGguIEFsc28gcmVtb3ZlZCBzcHVyaW91cyBjYXN0cyB0aGF0IG1heSBoaWRlCisgICAgcHJvYmxlbXMgb24gMTYtYml0IHN5c3RlbXMuCisKK1ZlcnNpb24gMS42LjBiZXRhMTMgW0ZlYnJ1YXJ5IDI0LCAyMDEyXQorICBFbGltaW5hdGVkIHJlZHVuZGFudCBwbmdfcHVzaF9yZWFkX3RFWHR8elRYdHxpVFh0fHVua25vd24gY29kZSBmcm9tCisgICAgcG5ncHJlYWQuYyBhbmQgdXNlIHRoZSBzZXF1ZW50aWFsIHBuZ19oYW5kbGVfdEVYdCwgZXRjLiwgaW4gcG5ncnV0aWwuYzsKKyAgICBub3cgdGhhdCBwbmdfcHRyLT5idWZmZXIgaXMgaW5hY2Nlc3NpYmxlIHRvIGFwcGxpY2F0aW9ucywgdGhlIHNwZWNpYWwKKyAgICBoYW5kbGluZyBpcyBubyBsb25nZXIgdXNlZnVsLgorICBBZGRlZCBQTkdfU0FGRV9MSU1JVFMgZmVhdHVyZSB0byBwbmdsaWJjb25mLmRmYSwgcG5ncHJpdi5oLCBhbmQgbmV3CisgICAgcG5ndXNyLmRmYSB0byByZXNldCB0aGUgdXNlciBsaW1pdHMgdG8gc2FmZSBvbmVzIGlmIFBOR19TQUZFX0xJTUlUUyBpcworICAgIGRlZmluZWQuICBUbyBlbmFibGUsIHVzZSAiQ1BQRkxBR1M9LURQTkdfU0FGRV9MSU1JVFNfU1VQUE9SVEVEPTEiIG9uIHRoZQorICAgIGNvbmZpZ3VyZSBjb21tYW5kIG9yIHB1dCAjZGVmaW5lIFBOR19TQUZFX0xJTUlUU19TVVBQT1JURUQgaW4KKyAgICBwbmdsaWJjb25mLmgucHJlYnVpbHQgYW5kIHBuZ2xpYmNvbmYuaC4KKworVmVyc2lvbiAxLjYuMGJldGExNCBbRmVicnVhcnkgMjcsIDIwMTJdCisgIEFkZGVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBuZXcgbGltaXRzIGluIHRoZSBtYW51YWwuCisgIFVwZGF0ZWQgTWFrZWZpbGUuaW4KKworVmVyc2lvbiAxLjYuMGJldGExNSBbTWFyY2ggMiwgMjAxMl0KKyAgUmVtb3ZlZCB1bnVzZWQgImN1cnJlbnRfdGV4dCIgbWVtYmVycyBvZiBwbmdfc3RydWN0IGFuZCB0aGUgcG5nX2ZyZWUoKQorICAgIG9mIHBuZ19wdHItPmN1cnJlbnRfdGV4dCBmcm9tIHBuZ3JlYWQuYworICBSZXdyb3RlIHBuZ3N0ZXN0LmMgZm9yIHN1YnN0YW50aWFsIHNwZWVkIGltcHJvdmVtZW50LgorICBGaXhlZCB0cmFuc3BhcmVudCBwaXhlbCBhbmQgMTYtYml0IHJnYiB0ZXN0cyBpbiBwbmdzdGVzdCBhbmQgcmVtb3ZlZCBhCisgICAgc3B1cmlvdXMgY2hlY2sgaW4gcG5nd3JpdGUuYworICBBZGRlZCBQTkdfSU1BR0VfRkxBR19GQVNUIGZvciB0aGUgYmVuZWZpdCBvZiBhcHBsaWNhdGlvbnMgdGhhdCBzdG9yZQorICAgIGludGVybWVkaWF0ZSBmaWxlcywgb3IgaW50ZXJtZWRpYXRlIGluLW1lbW9yeSBkYXRhLCB3aGlsZSBwcm9jZXNzaW5nCisgICAgaW1hZ2UgZGF0YSB3aXRoIHRoZSBzaW1wbGlmaWVkIEFQSS4gIFRoZSBvcHRpb24gbWFrZXMgdGhlIGZpbGVzIGxhcmdlcgorICAgIGJ1dCBmYXN0ZXIgdG8gd3JpdGUgYW5kIHJlYWQuICBwbmdzdGVzdCBub3cgdXNlcyB0aGlzIGJ5IGRlZmF1bHQ7IHRoaXMKKyAgICBjYW4gYmUgZGlzYWJsZWQgd2l0aCB0aGUgLS1zbG93IG9wdGlvbi4KKyAgSW1wcm92ZWQgcG5nc3Rlc3QgZmluZSB0dW5pbmcgb2YgZXJyb3IgbnVtYmVycywgbmV3IHRlc3QgZmlsZSBnZW5lcmF0b3IuCisgICAgVGhlIGdlbmVyYXRvciBnZW5lcmF0ZXMgaW1hZ2VzIHRoYXQgdGVzdCB0aGUgZnVsbCByYW5nZSBvZiBzYW1wbGUgdmFsdWVzLAorICAgIGFsbG93IHRoZSBlcnJvciBudW1iZXJzIGluIHBuZ3N0ZXN0IHRvIGJlIHR1bmVkIGFuZCBjaGVja2VkLiAgbWFrZXBuZworICAgIGFsc28gYWxsb3dzIGdlbmVyYXRpb24gb2YgaW1hZ2VzIHdpdGggZXh0cmEgY2h1bmtzLCBhbHRob3VnaCB0aGlzIGlzCisgICAgc3RpbGwgd29yay1pbi1wcm9ncmVzcy4KKyAgQWRkZWQgY2hlY2sgZm9yIGludmFsaWQgcGFsZXR0ZSBpbmRleCB3aGlsZSByZWFkaW5nLgorICBGaXhlZCBzb21lIGJ1Z3MgaW4gSUNDIHByb2ZpbGUgd3JpdGluZy4gVGhlIGNvZGUgc2hvdWxkIG5vdyBhY2NlcHQKKyAgICBhbGwgcG90ZW50aWFsbHkgdmFsaWQgSUNDIHByb2ZpbGVzIGFuZCByZWplY3Qgb2J2aW91c2x5IGludmFsaWQgb25lcy4KKyAgICBJdCBub3cgdXNlcyBwbmdfZXJyb3IoKSB0byBkbyBzbyByYXRoZXIgdGhhbiBjYXN1YWxseSB3cml0aW5nIGEgUE5HCisgICAgd2l0aG91dCB0aGUgbmVjZXNzYXJ5IGNvbG9yIGRhdGEuCisgIFJlbW92ZWQgd2hpdGVzcGFjZSBmcm9tIHRoZSBlbmQgb2YgbGluZXMgaW4gYWxsIHNvdXJjZSBmaWxlcyBhbmQgc2NyaXB0cy4KKworVmVyc2lvbiAxLjYuMGJldGExNiBbTWFyY2ggNiwgMjAxMl0KKyAgUmVsb2NhdGVkIHBhbGV0dGUtaW5kZXggY2hlY2tpbmcgZnVuY3Rpb24gZnJvbSBwbmdydXRpbC5jIHRvIHBuZ3RyYW5zLmMKKyAgQWRkZWQgcGFsZXR0ZS1pbmRleCBjaGVja2luZyB3aGlsZSB3cml0aW5nLgorICBDaGFuZ2VkIHBuZ19pbmZsYXRlKCkgYW5kIGNhbGxpbmcgcm91dGluZXMgdG8gYXZvaWQgb3ZlcmZsb3cgcHJvYmxlbXMuCisgICAgVGhpcyBpcyBhbiBpbnRlcm1lZGlhdGUgY2hlY2staW4gdGhhdCBzb2x2ZXMgdGhlIGltbWVkaWF0ZSBwcm9ibGVtcyBhbmQKKyAgICBpbnRyb2R1Y2VzIG9uZSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCAoYXZvaWRpbmcgYSBjb3B5IHZpYSBwbmdfcHRyLT56YnVmLikKKyAgICBGdXJ0aGVyIGNoYW5nZXMgd2lsbCBiZSBtYWRlIHRvIG1ha2UgSUNDIHByb2ZpbGUgaGFuZGxpbmcgbW9yZSBzZWN1cmUuCisgIEZpeGVkIGJ1aWxkIHdhcm5pbmdzIChNU1ZDLCBHQ0MsIEdDQyB2MykuIEN5Z3dpbiBHQ0Mgd2l0aCBkZWZhdWx0IG9wdGlvbnMKKyAgICBkZWNsYXJlcyAnaW5kZXgnIGFzIGEgZ2xvYmFsLCBjYXVzaW5nIGEgd2FybmluZyBpZiBpdCBpcyB1c2VkIGFzIGEgbG9jYWwKKyAgICB2YXJpYWJsZS4gIEdDQyA2NC1iaXQgd2FybnMgYWJvdXQgYXNzaWduaW5nIGEgKHNpemVfdCkgKHVuc2lnbmVkIDY0LWJpdCkKKyAgICB0byBhbiAoaW50KSAoc2lnbmVkIDMyLWJpdCkuICBNU1ZDLCBob3dldmVyLCB3YXJucyBhYm91dCB1c2luZyB0aGUKKyAgICB1bmFyeSAnLScgb3BlcmF0b3Igb24gYW4gdW5zaWduZWQgdmFsdWUgKGV2ZW4gdGhvdWdoIGl0IGlzIHdlbGwgZGVmaW5lZAorICAgIGJ5IEFOU0ktQyB0byBiZSB+eCsxKS4gIFRoZSBwYWRkaW5nIGNhbGN1bGF0aW9uIHdhcyBjaGFuZ2VkIHRvIHVzZSBhCisgICAgZGlmZmVyZW50IG1ldGhvZC4gIFJlbW92ZWQgdGhlIHRlc3RzIG9uIHBuZ19wdHItPnBhc3MuCisgIEFkZGVkIGNvbnRyaWIvbGlidGVzdHMvdGFyaXRoLmMgdG8gdGVzdCBpbnRlcm5hbCBhcml0aG1ldGljIGZ1bmN0aW9ucyBmcm9tCisgICAgcG5nLmMuIFRoaXMgaXMgYSBsaWJwbmcgbWFpbnRhaW5lciBwcm9ncmFtIHVzZWQgdG8gdmFsaWRhdGUgY2hhbmdlcyB0byB0aGUKKyAgICBpbnRlcm5hbCBhcml0aG1ldGljIGZ1bmN0aW9ucy4KKyAgTWFkZSByZWFkICdpbmZsYXRlJyBoYW5kbGluZyBsaWtlIHdyaXRlICdkZWZsYXRlJyBoYW5kbGluZy4gVGhlIHJlYWQKKyAgICBjb2RlIG5vdyBjbGFpbXMgYW5kIHJlbGVhc2VzIHBuZ19wdHItPnpzdHJlYW0sIGxpa2UgdGhlIHdyaXRlIGNvZGUuCisgICAgVGhlIGJ1ZyB3aGVyZWJ5IHRoZSBwcm9ncmVzc2l2ZSByZWFkZXIgZmFpbGVkIHRvIHJlbGVhc2UgdGhlIHpzdHJlYW0KKyAgICBpcyBub3cgZml4ZWQsIGFsbCBpbml0aWFsaXphdGlvbiBpcyBkZWxheWVkLCBhbmQgdGhlIGNvZGUgY2hlY2tzIGZvcgorICAgIGNoYW5nZWQgcGFyYW1ldGVycyBvbiBkZWZsYXRlIHJhdGhlciB0aGFuIGFsd2F5cyBjYWxsaW5nCisgICAgZGVmbGF0ZWRFbmQvZGVmbGF0ZUluaXQuCisgIFZhbGlkYXRlIHRoZSB6VFh0IHN0cmluZ3MgaW4gcG5ndmFsaWQuCisgIEFkZGVkIGNvZGUgdG8gdmFsaWRhdGUgdGhlIHdpbmRvd0JpdHMgdmFsdWUgcGFzc2VkIHRvIGRlZmxhdGVJbml0MigpLgorICAgIElmIHRoZSBjYWxsIHRvIGRlZmxhdGVJbml0MigpIGlzIHdyb25nIGEgcG5nX3dhcm5pbmcgd2lsbCBiZSBpc3N1ZWQKKyAgICAoaW4gZmFjdCB0aGlzIGlzIGhhcm1sZXNzLCBidXQgdGhlIFBORyBkYXRhIHByb2R1Y2VkIG1heSBiZSBzdWItb3B0aW1hbCkuCisKK1ZlcnNpb24gMS42LjBiZXRhMTcgW01hcmNoIDEwLCAyMDEyXQorICBGaXhlZCBQTkdfTElCUE5HX0JVSUxEX0JBU0VfVFlQRSBkZWZpbml0aW9uLiAKKyAgUmVqZWN0IGFsbCBpQ0NQIGNodW5rcyBhZnRlciB0aGUgZmlyc3QsIGV2ZW4gaWYgdGhlIGZpcnN0IG9uZSBpcyBpbnZhbGlkLgorICBEZWZsYXRlL2luZmxhdGUgd2FzIHJld29ya2VkIHRvIG1vdmUgY29tbW9uIHpsaWIgY2FsbHMgaW50byBzaW5nbGUKKyAgICBmdW5jdGlvbnMgW3J3XXV0aWwuYy4gIEEgbmV3IHNoYXJlZCBrZXl3b3JkIGNoZWNrIHJvdXRpbmUgd2FzIGFsc28gYWRkZWQKKyAgICBhbmQgdGhlICd6YnVmJyBpcyBubyBsb25nZXIgYWxsb2NhdGVkIG9uIHByb2dyZXNzaXZlIHJlYWQuICBJdCBpcyBub3cKKyAgICBwb3NzaWJsZSB0byBjYWxsIHBuZ19pbmZsYXRlKCkgaW5jcmVtZW50YWxseS4gIEEgd2FybmluZyBpcyBubyBsb25nZXIKKyAgICBpc3N1ZWQgaWYgdGhlIGxhbmd1YWdlIHRhZyBvciB0cmFuc2xhdGVkIGtleXdvcmQgaW4gdGhlIGlUWHQgY2h1bmsKKyAgICBoYXMgemVybyBsZW5ndGguCisgIElmIGJlbmlnbiBlcnJvcnMgYXJlIGRpc2FibGVkIHVzZSBtYXhpbXVtIHdpbmRvdyBvbiBhbmNpbGxpYXJ5IGluZmxhdGUuCisgICAgVGhpcyB3b3JrcyByb3VuZCBhIGJ1ZyBpbnRyb2R1Y2VkIGluIDEuNS40IHdoZXJlIGNvbXByZXNzZWQgYW5jaWxsYXJ5CisgICAgY2h1bmtzIGNvdWxkIGVuZCB1cCB3aXRoIGEgdG9vLXNtYWxsIHdpbmRvd0JpdHMgdmFsdWUgaW4gdGhlIGRlZmxhdGUKKyAgICBoZWFkZXIuCisKK1ZlcnNpb24gMS42LjBiZXRhMTggW01hcmNoIDE2LCAyMDEyXQorICBJc3N1ZSBhIHBuZ19iZW5pZ25fZXJyb3IoKSBpbnN0ZWFkIG9mIHBuZ193YXJuaW5nKCkgYWJvdXQgYmFkIHBhbGV0dGUgaW5kZXguCisgIEluIHBuZ3Rlc3QsIHRyZWF0IGJlbmlnbiBlcnJvcnMgYXMgZXJyb3JzIGlmICItc3RyaWN0IiBpcyBwcmVzZW50LgorICBGaXhlZCBhbiBvZmYtYnktb25lIGVycm9yIGluIHRoZSBwYWxldHRlIGluZGV4IGNoZWNraW5nIGZ1bmN0aW9uLgorICBGaXhlZCBhIGNvbXBpbGVyIHdhcm5pbmcgdW5kZXIgQ3lnd2luIChXaW5kb3dzLTcsIDMyLWJpdCBzeXN0ZW0pCisgIFJldmlzZWQgZXhhbXBsZS5jIHRvIHB1dCB0ZXh0IHN0cmluZ3MgaW4gYSB0ZW1wb3JhcnkgY2hhcmFjdGVyIGFycmF5CisgICAgaW5zdGVhZCBvZiBkaXJlY3RseSBhc3NpZ25pbmcgc3RyaW5nIGNvbnN0YW50cyB0byBwbmdfdGV4dHAgbWVtYmVycy4KKyAgICBUaGlzIGF2b2lkcyBjb21waWxlciB3YXJuaW5ncyB3aGVuIC1Xd3JpdGUtc3RyaW5ncyBpcyBlbmFibGVkLgorICBBZGRlZCBvdXRwdXQgZmx1c2hpbmcgdG8gYWlkIGRlYnVnZ2luZyB1bmRlciBWaXN1YWwgU3R1ZGlvLiBVbmZvcnR1bmF0ZWx5CisgICAgdGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgVlMyMDEwIG91dHB1dCB3aW5kb3cgb3RoZXJ3aXNlIHNpbXBseSBsb3NlcworICAgIHRoZSBlcnJvciBtZXNzYWdlcyBvbiBlcnJvciAodGhleSB3ZXJlbid0IGZsdXNoZWQgdG8gdGhlIHdpbmRvdyBiZWZvcmUKKyAgICB0aGUgcHJvY2VzcyBleGl0ZWQsIGFwcGFyZW50bHkhKQorICBBZGRlZCBjb25maWd1cmF0aW9uIHN1cHBvcnQgZm9yIGJlbmlnbiBlcnJvcnMgYW5kIGNoYW5nZWQgdGhlIHJlYWQKKyAgICBkZWZhdWx0LiBBbHNvIGNoYW5nZWQgc29tZSB3YXJuaW5ncyBpbiB0aGUgaUNDUCBhbmQgc1JHQiBoYW5kbGluZworICAgIGZyb20gdG8gYmVuaWduIGVycm9ycy4gQ29uZmlndXJhdGlvbiBub3cgbWFrZXMgcmVhZCBiZW5pZ24KKyAgICBlcnJvcnMgd2FybmluZ3MgYW5kIHdyaXRlIGJlbmlnbiBlcnJvcnMgdG8gZXJyb3JzIGJ5IGRlZmF1bHQgKHRodXMKKyAgICBjaGFuZ2luZyB0aGUgYmVoYXZpb3Igb24gcmVhZCkuICBUaGUgc2ltcGxpZmllZCBBUEkgYWx3YXlzIGZvcmNlcworICAgIHJlYWQgYmVuaWduIGVycm9ycyB0byB3YXJuaW5ncyAocmVnYXJkbGVzcyBvZiB0aGUgc3lzdGVtIGRlZmF1bHQsIHVubGVzcworICAgIHRoaXMgaXMgZGlzYWJsZWQgaW4gd2hpY2ggY2FzZSB0aGUgc2ltcGxpZmllZCBBUEkgY2FuJ3QgYmUgYnVpbHQuKQorCitWZXJzaW9uIDEuNi4wYmV0YTE5IFtNYXJjaCAxOCwgMjAxMl0KKyAgV29yayBhcm91bmQgZm9yIGR1cGxpY2F0ZSByb3cgc3RhcnQgY2FsbHM7IGFkZGVkIHdhcm5pbmcgbWVzc2FnZXMuCisgICAgVGhpcyB0dXJucyBvbiBQTkdfRkxBR19ERVRFQ1RfVU5JTklUSUFMSVpFRCB0byBkZXRlY3QgYXBwIGNvZGUgdGhhdAorICAgIGZhaWxzIHRvIGNhbGwgb25lIG9mIHRoZSAnc3RhcnQnIHJvdXRpbmVzIChub3QgZW5hYmxlZCBpbiBsaWJwbmctMS41CisgICAgYmVjYXVzZSBpdCBpcyB0ZWNobmljYWxseSBhbiBBUEkgY2hhbmdlLCBzaW5jZSBpdCBkaWQgbm9ybWFsbHkgd29yaworICAgIGJlZm9yZS4pICBJdCBhbHNvIG1ha2VzIGR1cGxpY2F0ZSBjYWxscyB0byBwbmdfcmVhZF9zdGFydF9yb3cgKGFuCisgICAgaW50ZXJuYWwgZnVuY3Rpb24gY2FsbGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgaW1hZ2UgcmVhZCkgYmVuaWduLCBhcworICAgIHRoZXkgd2VyZSBiZWZvcmUgY2hhbmdlcyB0byB1c2UgcG5nX2luZmxhdGVfY2xhaW0uIFNvbWVob3cgd2Via2l0IGlzCisgICAgY2F1c2luZyB0aGlzIHRvIGhhcHBlbjsgdGhpcyBpcyBwcm9iYWJseSBhIG1pcy1mZWF0dXJlIGluIHRoZSB6bGliCisgICAgY2hhbmdlcyBzbyB0aGlzIGNvbW1pdCBpcyBvbmx5IGEgd29yay1yb3VuZC4KKyAgUmVtb3ZlZCBlcnJvbmVvdXMgc2V0dGluZyBvZiBERVRFQ1RfVU5JTklUSUFMSVpFRCBhbmQgYWRkZWQgbW9yZQorICAgIGNoZWNrcy4gVGhlIGNvZGUgbm93IGRvZXMgYSBwbmdfZXJyb3IgaWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGRvIHRoZQorICAgIHJvdyBpbml0aWFsaXphdGlvbiB0d2ljZTsgdGhpcyBpcyBhbiBhcHBsaWNhdGlvbiBlcnJvciBhbmQgaXQgaGFzCisgICAgc2VyaW91cyBjb25zZXF1ZW5jZXMgYmVjYXVzZSB0aGUgdHJhbnNmb3JtIGRhdGEgaW4gcG5nX3N0cnVjdCBpcworICAgIGNoYW5nZWQgYnkgZWFjaCBjYWxsLgorICBBZGRlZCBhcHBsaWNhdGlvbiBlcnJvciByZXBvcnRpbmcgYW5kIGFkZGVkIGNodW5rIG5hbWVzIHRvIHJlYWQKKyAgICBiZW5pZ24gZXJyb3JzOyBhbHNvIGFkZGVkIC0tc3RyaWN0IHRvIHBuZ3N0ZXN0IC0gbm90IGVuYWJsZWQKKyAgICB5ZXQgYmVjYXVzZSBhIHdhcm5pbmcgaXMgcHJvZHVjZWQuCisgIEF2b2lkIHRoZSBkb3VibGUgZ2FtbWEgY29ycmVjdGlvbiB3YXJuaW5nIGluIHRoZSBzaW1wbGlmaWVkIEFQSS4KKyAgICBUaGlzIGFsbG93cyB0aGUgLS1zdHJpY3Qgb3B0aW9uIHRvIHBhc3MgaW4gdGhlIHBuZ3N0ZXN0IGNoZWNrcworCitWZXJzaW9uIDEuNi4wYmV0YTIwIFtNYXJjaCAyOSwgMjAxMl0KKyAgQ2hhbmdlZCBjaHVuayBoYW5kbGVyIHdhcm5pbmdzIGludG8gYmVuaWduIGVycm9ycywgaW5jcmVtZW50YWxseSBsb2FkIGlDQ1AKKyAgQWRkZWQgY2hlY2tzdW0taWNjLmMgdG8gY29udHJpYi90b29scworICBQcmV2ZW50IFBOR19FWFBBTkQrUE5HX1NISUZUIGRvaW5nIHRoZSBzaGlmdCB0d2ljZS4KKyAgUmVjb2duaXplIGtub3duIHNSR0IgSUNDIHByb2ZpbGVzIHdoaWxlIHJlYWRpbmc7IHByZWZlciB3cml0aW5nIHRoZQorICAgIGlDQ1AgcHJvZmlsZSBvdmVyIHdyaXRpbmcgdGhlIHNSR0IgY2h1bmssIGNvbnRyb2xsZWQgYnkgdGhlCisgICAgUE5HX3NSR0JfUFJPRklMRV9DSEVDS1Mgb3B0aW9uLgorICBSZXZpc2VkIHBuZ19zZXRfdGV4dF8yKCkgdG8gYXZvaWQgcG90ZW50aWFsIG1lbW9yeSBjb3JydXB0aW9uIChmaXhlcworICAgIENWRS0yMDExLTMwNDgsIGFsc28ga25vd24gYXMgQ1ZFLTIwMTItMzQyNSkuCisKK1ZlcnNpb24gMS42LjBiZXRhMjEgW0FwcmlsIDI3LCAyMDEyXQorICBSZXZpc2VkIHNjcmlwdHMvbWFrZWZpbGUuZGFyd2luOiB1c2Ugc3lzdGVtIHpsaWI7IHJlbW92ZSBxdW90ZXMgYXJvdW5kCisgICAgYXJjaGl0ZWN0dXJlIGxpc3Q7IGFkZCBtaXNzaW5nIHBwYyBhcmNoaXRlY3R1cmU7IGFkZCBhcmNoaXRlY3R1cmUgb3B0aW9ucworICAgIHRvIHNoYXJlZCBsaWJyYXJ5IGxpbms7IGRvbid0IHRyeSB0byBjcmVhdGUgYSBzaGFyZWQgbGliIGJhc2VkIG9uIG1pc3NpbmcKKyAgICBSRUxFQVNFIHZhcmlhYmxlLgorICBFbmFibGUgcG5nX3NldF9jaGVja19mb3JfaW52YWxpZF9pbmRleCgpIGZvciBib3RoIHJlYWQgYW5kIHdyaXRlLgorICBSZW1vdmVkICNpZmRlZiBQTkdfSEFORExFX0FTX1VOS05PV05fU1VQUE9SVEVEIGluIHBuZ3ByaXYuaCBhcm91bmQKKyAgICBkZWNsYXJhdGlvbiBvZiBwbmdfaGFuZGxlX3Vua25vd24oKS4KKyAgQWRkZWQgLWxzc3Bfbm9uc2hhcmVkIGluIGEgY29tbWVudCBpbiBzY3JpcHRzL21ha2VmaWxlLmZyZWVic2QKKyAgICBhbmQgY2hhbmdlZCBkZXByZWNhdGVkIE5PT0JKIGFuZCBOT1BST0ZJTEUgdG8gTk9fT0JKIGFuZCBOT19QUk9GSUxFLgorCitWZXJzaW9uIDEuNi4wYmV0YTIyIFtNYXkgMjMsIDIwMTJdCisgIFJlbW92ZWQgbmVlZCBmb3IgLVduby1jYXN0LWFsaWduIHdpdGggY2xhbmcuICBjbGFuZyBjb3JyZWN0bHkgd2FybnMgb24KKyAgICBhbGlnbm1lbnQgaW5jcmVhc2luZyBwb2ludGVyIGNhc3RzIHdoZW4gLVdjYXN0LWFsaWduIGlzIHBhc3NlZC4gVGhpcworICAgIGZpeGVzIHRoZSBjYXNlcyB0aGF0IGNsYW5nIHdhcm5zIGFib3V0IGVpdGhlciBieSBlbGltaW5hdGluZyB0aGUKKyAgICBjYXN0cyBmcm9tIHBuZ19ieXRlcCB0byBwbmdfdWludF8xNnAgKHBuZ3JlYWQuYyksIG9yLCBmb3IgcG5ncnV0aWwuYworICAgIHdoZXJlIHRoZSBjYXN0IGlzIHByZXZpb3VzbHkgdmVyaWZpZWQgb3IgcG5nc3Rlc3QuYyB3aGVyZSBpdCBpcyBPSywgYnkKKyAgICBpbnRyb2R1Y2luZyBuZXcgcG5nX2FsaWduY2FzdCBtYWNyb3MgdG8gZG8gdGhlIGNhc3QgaW4gYSB3YXkgdGhhdCBjbGFuZworICAgIGFjY2VwdHMuCisKK1ZlcnNpb24gMS42LjBiZXRhMjMgW0p1bmUgNiwgMjAxMl0KKyAgUmV2aXNlZCBDTWFrZUxpc3RzLnR4dCB0byBub3QgYXR0ZW1wdCB0byBtYWtlIGEgc3ltbGluayB1bmRlciBtaW5ndy4KKyAgTWFkZSBmaXhlcyBmb3IgbmV3IG9wdGltaXphdGlvbiB3YXJuaW5ncyBmcm9tIGdjYyA0LjcuMC4gVGhlIGNvbXBpbGVyCisgICAgcGVyZm9ybXMgYW4gb3B0aW1pemF0aW9uIHdoaWNoIGlzIHNhZmU7IGhvd2V2ZXIgaXQgdGhlbiB3YXJucyBhYm91dCBpdC4KKyAgICBDaGFuZ2luZyB0aGUgdHlwZSBvZiAncGFsZXR0ZV9udW1iZXInIGluIHBuZ3ZhbGlkLmMgcmVtb3ZlcyB0aGUgd2FybmluZy4KKyAgRG8gbm90IGRlcGVuZCB1cG9uIGEgR0NDIGZlYXR1cmUgbWFjcm8gYmVpbmcgYXZhaWxhYmxlIGZvciB1c2UgaW4gZ2VuZXJhdGluZworICAgIHRoZSBsaW5rZXIgbWFwZmlsZSBzeW1ib2wgcHJlZml4LgorICBJbXByb3ZlZCBwZXJmb3JtYW5jZSBvZiBuZXcgZG9fY2hlY2tfcGFsZXR0ZV9pbmRleGVzKCkgZnVuY3Rpb24gKG9ubHkKKyAgICB1cGRhdGUgdGhlIHZhbHVlIHdoZW4gaXQgYWN0dWFsbHkgaW5jcmVhc2VzLCBtb3ZlIHRlc3QgZm9yIHdoZXRoZXIKKyAgICB0aGUgY2hlY2sgaXMgd2FudGVkIG91dCBvZiB0aGUgZnVuY3Rpb24uCisKK1ZlcnNpb24gMS42LjBiZXRhMjQgW0p1bmUgNywgMjAxMl0KKyAgRG9uJ3QgY2hlY2sgcGFsZXR0ZSBpbmRleGVzIGlmIG51bV9wYWxldHRlIGlzIDAgKGFzIGl0IGNhbiBiZSBpbiBNTkcgZmlsZXMpLgorCitWZXJzaW9uIDEuNi4wYmV0YTI1IFtKdW5lIDE2LCAyMDEyXQorICBSZXZpc2VkIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcygpIHNvIG51bV9jaHVua3MgPCAwIG1lYW5zIGlnbm9yZSBhbGwKKyAgICB1bmtub3duIGNodW5rcyBhbmQgYWxsIGtub3duIGNodW5rcyBleGNlcHQgZm9yIElIRFIsIFBMVEUsIHRSTlMsIElEQVQsCisgICAgYW5kIElFTkQuICBQcmV2aW91c2x5IGl0IG9ubHkgbWVhbnQgaWdub3JlIGFsbCB1bmtub3duIGNodW5rcywgdGhlCisgICAgc2FtZSBhcyBudW1fY2h1bmtzID09IDAuIFJldmlzZWQgcG5nX2ltYWdlX3NraXBfdW51c2VkX2NodW5rcygpIHRvCisgICAgcHJvdmlkZSBhIGxpc3Qgb2YgY2h1bmtzIHRvIGJlIHByb2Nlc3NlZCBpbnN0ZWFkIG9mIGEgbGlzdCBvZiBjaHVua3MgdG8KKyAgICBpZ25vcmUuICBSZXZpc2VkIGNvbnRyaWIvZ3JlZ2Jvb2svcmVhZHBuZzIuYyBhY2NvcmRpbmdseS4KKworVmVyc2lvbiAxLjYuMGJldGEyNiBbSnVseSAxMCwgMjAxMl0KKyAgUmVtb3ZlZCBzY3JpcHRzL21ha2VmaWxlLmNlZ2NjIGZyb20gdGhlICouemlwIGFuZCAqLjd6IGRpc3RyaWJ1dGlvbnM7IGl0CisgICAgZGVwZW5kcyBvbiBjb25maWd1cmUsIHdoaWNoIGlzIG5vdCBpbmNsdWRlZCBpbiB0aG9zZSBhcmNoaXZlcy4KKyAgTW92ZWQgc2NyaXB0cy9jaGtmbXQgdG8gY29udHJpYi90b29scy4KKyAgQ2hhbmdlZCAiYSt3IiB0byAidSt3IiBpbiBNYWtlZmlsZS5pbiB0byBmaXggQ1ZFLTIwMTItMzM4Ni4KKworVmVyc2lvbiAxLjYuMGJldGEyNyBbQXVndXN0IDExLCAyMDEyXQorICBEbyBub3QgY29tcGlsZSBQTkdfREVQUkVDQVRFRCwgUE5HX0FMTE9DIGFuZCBQTkdfUFJJVkFURSB3aGVuIF9fR05VQ19fIDwgMy4KKyAgRG8gbm90IHVzZSBfX3Jlc3RyaWN0IHdoZW4gR05VQyBpcyA8PSAzLjEKKyAgUmVtb3ZlZCByZWZlcmVuY2VzIHRvIHBuZ196YWxsb2MoKSBhbmQgcG5nX3pmcmVlKCkgZnJvbSB0aGUgbWFudWFsLgorICBGaXhlZCBjb25maWd1cmF0aW9ucyB3aGVyZSBmbG9hdGluZyBwb2ludCBpcyBjb21wbGV0ZWx5IGRpc2FibGVkLiAgQmVjYXVzZQorICAgIG9mIHRoZSBjaGFuZ2VzIHRvIHN1cHBvcnQgc3ltYm9sIHByZWZpeGluZyBQTkdfSU5URVJOQUxfRlVOQ1RJT04gZGVjbGFyZXMKKyAgICBmbG9hdGluZyBwb2ludCBBUElzIGR1cmluZyBsaWJwbmcgYnVpbGRzIGV2ZW4gaWYgdGhleSBhcmUgY29tcGxldGVseQorICAgIGRpc2FibGVkLiBUaGlzIHJlcXVpcmVzIHRoZSBwbmcgZmxvYXRpbmcgcG9pbnQgdHlwZXMgKHBuZ19kb3VibGUqKSB0byBiZQorICAgIGRlY2xhcmVkIGV2ZW4gdGhvdWdoIHRoZSBmdW5jdGlvbnMgYXJlIG5ldmVyIGFjdHVhbGx5IGRlZmluZWQuICBUaGlzCisgICAgY2hhbmdlIHByb3ZpZGVzIGEgZHVtbXkgZGVmaW5pdGlvbiBzbyB0aGF0IHRoZSBkZWNsYXJhdGlvbnMgd29yaywgeWV0IGFueQorICAgIGltcGxlbWVudGF0aW9uIHdpbGwgZmFpbCB0byBjb21waWxlIGJlY2F1c2Ugb2YgYW4gaW5jb21wbGV0ZSB0eXBlLgorICBSZS1lbGltaW5hdGVkIHRoZSB1c2Ugb2Ygc3RyY3B5KCkgaW4gcG5ndGVzdC5jLiAgQW4gdW5uY2Vzc2FyeSB1c2Ugb2YKKyAgICBzdHJjcHkoKSB3YXMgYWNjaWRlbnRhbGx5IHJlLWludHJvZHVjZWQgaW4gbGlicG5nMTY7IHRoaXMgY2hhbmdlIHJlcGxhY2VzCisgICAgaXQgd2l0aCBzdHJuY3B5KCkuCisgIEVsaW1pbmF0ZWQgdXNlIG9mIHBuZ19zaXplb2YoKTsgdXNlIHNpemVvZigpIGluc3RlYWQuCisgIFVzZSBhIGNvbnNpc3RlbnQgc3R5bGUgZm9yIChzaXplb2YgdHlwZSkgYW5kIChzaXplb2YgKGFycmF5KSkKKyAgQ2xlYW51cCBvZiBwbmdfc2V0X2ZpbGxlcigpLiAgVGhpcyBmdW5jdGlvbiBkb2VzIHZlcnkgZGlmZmVyZW50IHRoaW5ncyBvbgorICAgIHJlYWQgYW5kIHdyaXRlLiAgSW4gbGlicG5nIDEuNiB0aGUgdHdvIGNhc2VzIGNhbiBiZSBkaXN0aW5ndWlzaGVkIGFuZAorICAgIGNvbnNpZGVyYWJsZSBjb2RlIGNsZWFudXAsIGFuZCBleHRyYSBlcnJvciBjaGVja2luZywgaXMgcG9zc2libGUuICBUaGlzCisgICAgbWFrZXMgY2FsbHMgb24gdGhlIHdyaXRlIHNpZGUgdGhhdCBoYXZlIG5vIGVmZmVjdCBiZSBpZ25vcmVkIHdpdGggYQorICAgIHBuZ19hcHBfZXJyb3IoKSwgd2hpY2ggY2FuIGJlIGRpc2FibGVkIGluIHRoZSBhcHAgdXNpbmcKKyAgICBwbmdfc2V0X2Jlbmlnbl9lcnJvcnMoKSwgYW5kIHJlbW92ZXMgdGhlIHNwdXJpb3VzIHVzZSBvZiB1c3JfY2hhbm5lbHMKKyAgICBvbiB0aGUgcmVhZCBzaWRlLgorICBJbnNpc3Qgb24gYXV0b3Rvb2xzIDEuMTIuMSBmb3IgZ2l0IGJ1aWxkcyBiZWNhdXNlIHRoZXJlIGFyZSBzZWN1cml0eSBpc3N1ZXMKKyAgICB3aXRoIDEuMTIgYW5kIGluc2lzdGluZyBvbiBhbnl0aGluZyBsZXNzIHdvdWxkIGFsbG93IDEuMTIgdG8gYmUgdXNlZC4KKyAgUmVtb3ZlZCBpbmZvX3B0ci0+c2lnbmF0dXJlWzhdIGZyb20gV1JJVEUtb25seSBidWlsZHMuCisgIEFkZCBzb21lIGNvbmRpdGlvbnMgZm9yIGNvbXBpbGluZyBwbmdfZml4ZWQoKS4gIFRoaXMgaXMgYSBzbWFsbCBmdW5jdGlvbgorICAgIGJ1dCBpdCByZXF1aXJlcyAiLWxtIiBvbiBzb21lIHBsYXRmb3Jtcy4KKyAgQ2F1c2UgcG5ndGVzdCAtLXN0cmljdCB0byBmYWlsIG9uIGFueSB3YXJuaW5nIGZyb20gbGlicG5nIChub3QganVzdCBlcnJvcnMpCisgICAgYW5kIGNhdXNlIGl0IG5vdCB0byBmYWlsIGF0IHRoZSBjb21wYXJpc29uIHN0ZXAgaWYgbGlicG5nIGxhY2tzIHN1cHBvcnQKKyAgICBmb3Igd3JpdGluZyBjaHVua3MgdGhhdCBpdCByZWFkcyBmcm9tIHRoZSBpbnB1dCAoY3VycmVudGx5IG9ubHkgaW1wbGVtZW50ZWQKKyAgICBmb3IgY29tcHJlc3NlZCB0ZXh0IGNodW5rcykuCisgIE1ha2UgYWxsIHRocmVlICJtYWtlIGNoZWNrIiB0ZXN0IHByb2dyYW1zIHdvcmsgd2l0aG91dCBSRUFEIG9yIFdSSVRFIHN1cHBvcnQuCisgICAgTm93ICJtYWtlIGNoZWNrIiB3aWxsIHN1Y2NlZWQgZXZlbiBpZiBsaWJwbmcgaXMgY29tcGlsZWQgd2l0aCAtRFBOR19OT19SRUFECisgICAgb3IgLURQTkdfTk9fV1JJVEUuICBUaGUgdGVzdHMgcGVyZm9ybWVkIGFyZSByZWR1Y2VkLCBidXQgdGhlIGJhc2ljIHJlYWRpbmcKKyAgICBhbmQgd3JpdGluZyBvZiBhIFBORyBmaWxlIGlzIGFsd2F5cyB0ZXN0ZWQgYnkgb25lIG9yIG1vcmUgb2YgdGhlIHRlc3RzLgorICBDb25zaXN0ZW50bHkgdXNlIHN0cmxlbigpLCBtZW1zZXQoKSwgbWVtY3B5KCksIGFuZCBtZW1jbXAoKSBpbnN0ZWFkIG9mIHRoZQorICAgIHBuZ19zdHJsZW4oKSwgcG5nX21lbXNldCgpLCBwbmdfbWVtY3B5KCksIGFuZCBwbmdfbWVtY21wKCkgbWFjcm9zLgorICBSZW1vdmVkIHRoZSBwbmdfc2l6ZW9mKCksIHBuZ19zdHJsZW4oKSwgcG5nX21lbXNldCgpLCBwbmdfbWVtY3B5KCksIGFuZAorICAgIHBuZ19tZW1jbXAoKSBtYWNyb3MuCisgIFdvcmsgYXJvdW5kIGdjYyAzLnggYW5kIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDIwMTAgY29tcGxhaW50cy4gQm90aCBvYmplY3QKKyAgICB0byB0aGUgc3BsaXQgaW5pdGlhbGl6YXRpb24gb2YgbnVtX2NodW5rcy4KKworVmVyc2lvbiAxLjYuMGJldGEyOCBbQXVndXN0IDI5LCAyMDEyXQorICBVbmtub3duIGhhbmRsaW5nIGZpeGVzIGFuZCBjbGVhbiB1cC4gVGhpcyBhZGRzIG1vcmUgY29ycmVjdCBvcHRpb24KKyAgICBjb250cm9sIG9mIHRoZSB1bmtub3duIGhhbmRsaW5nLCBjb3JyZWN0cyB0aGUgcHJlLWV4aXN0aW5nIGJ1ZyB3aGVyZQorICAgIHRoZSBwZXItY2h1bmsgJ2tlZXAnIHNldHRpbmcgaXMgaWdub3JlZCBhbmQgbWFrZXMgaXQgcG9zc2libGUgdG8gc2tpcAorICAgIElEQVQgY2h1bmtzIGluIHRoZSBzZXF1ZW50aWFsIHJlYWRlciAoYnJva2VuIGluIGVhcmxpZXIgMS42IHZlcnNpb25zKS4KKyAgICBUaGVyZSBpcyBhIG5ldyB0ZXN0IHByb2dyYW0sIHRlc3QtdW5rbm93bi5jLCB3aGljaCBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MKKyAgICAobm90IGN1cnJlbnRseSBwYXJ0IG9mIHRoZSB0ZXN0IHN1aXRlKS4gIENvbW1lbnRzIGluIHRoZSBoZWFkZXIgZmlsZXMgbm93CisgICAgZXhwbGFpbiBob3cgdGhlIHVua25vd24gaGFuZGxpbmcgd29ya3MuCisgIEFsbG93IGZpbmUgZ3JhaW4gY29udHJvbCBvZiB1bmtub3duIGNodW5rIEFQSXMuIFRoaXMgY2hhbmdlIGFsbG93cworICAgIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcygpIHRvIGJlIHR1cm5lZCBvZmYgaWYgbm90IHJlcXVpcmVkIGFuZCBjYXVzZXMKKyAgICBib3RoIHJlYWQgYW5kIHdyaXRlIHRvIGJlaGF2ZSBhcHByb3ByaWF0ZWx5IChvbiByZWFkIHRoaXMgaXMgb25seSBwb3NzaWJsZQorICAgIGlmIHRoZSB1c2VyIGNhbGxiYWNrIGlzIHVzZWQgdG8gaGFuZGxlIHVua25vd24gY2h1bmtzKS4gIFRoZSBjaGFuZ2UKKyAgICBhbHNvIHJlbW92ZXMgdGhlIHN1cHBvcnQgZm9yIHN0b3JpbmcgdW5rbm93biBjaHVua3MgaW4gdGhlIGluZm9fc3RydWN0CisgICAgaWYgdGhlIG9ubHkgdW5rbm93biBoYW5kbGluZyBlbmFibGVkIGlzIHZpYSB0aGUgY2FsbGJhY2ssIGFsbG93aW5nIGxpYnBuZworICAgIHRvIGJlIGNvbmZpZ3VyZWQgd2l0aCBjYWxsYmFjayByZWFkaW5nIGFuZCBub25lIG9mIHRoZSB1bm5lY2Vzc2FyeSBjb2RlLgorICBDb3JyZWN0ZWQgZml4IGZvciB1bmtub3duIGhhbmRsaW5nIGluIHBuZ3Rlc3QuIFRoaXMgcmVpbnN0YXRlcyB0aGUKKyAgICBsaWJwbmcgaGFuZGxpbmcgb2YgdW5rbm93biBjaHVua3Mgb3RoZXIgdGhhbiB2cEFnIGFuZCBzVEVSIChpbmNsdWRpbmcKKyAgICB1bnNhZmUtdG8tY29weSBjaHVua3Mgd2hpY2ggd2VyZSBkcm9wcGVkIGJlZm9yZSkgYW5kIGVsaW1pbmF0ZXMgdGhlCisgICAgcmVwb3NpdGlvbmluZyBvZiB2cEFnIGFuZCBzVEVSIGluIHBuZ3Rlc3QucG5nIGJ5IGNoYW5naW5nIHBuZ3Rlc3QucG5nCisgICAgKHNvIHRoZSBjaHVua3MgYXJlIHdoZXJlIGxpYnBuZyB3b3VsZCBwdXQgdGhlbSkuCisgIEFkZGVkICJ0dW5rbm93biIgdGVzdCBhbmQgY29ycmVjdGVkIGEgbG9naWMgZXJyb3IgaW4gcG5nX2hhbmRsZV91bmtub3duKCkKKyAgICB3aGVuIFNBVkUgc3VwcG9ydCBpcyBhYnNlbnQuICBNb3ZlZCB0aGUgc2hlbGwgdGVzdCBzY3JpcHRzIGZvcgorICAgIGNvbnRyaWIvbGlidGVzdHMgZnJvbSB0aGUgbGlicG5nIHRvcCBkaXJlY3RvcnkgdG8gY29udHJpYi9saWJ0ZXN0cy4KKyAgICBwbmdfaGFuZGxlX3Vua25vd24oKSBtdXN0IGFsd2F5cyByZWFkIG9yIHNraXAgdGhlIGNodW5rLCBpZgorICAgIFNBVkVfVU5LTk9XTl9DSFVOS1MgaXMgdHVybmVkIG9mZiAqYW5kKiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgc2V0CisgICAgYSB1c2VyIGNhbGxiYWNrIGFuIHVua25vd24gY2h1bmsgd2lsbCBub3QgYmUgcmVhZCwgbGVhZGluZyB0byBhIHJlYWQKKyAgICBlcnJvciwgd2hpY2ggd2FzIHJldmVhbGVkIGJ5IHRoZSAidHVua25vd24iIHRlc3QuCisgIENsZWFuZWQgdXAgYW5kIGNvcnJlY3RlZCBJQ0MgcHJvZmlsZSBoYW5kbGluZy4KKyAgICBjb250cmliL2xpYnRlc3RzL21ha2Vwbmc6IGNvcnJlY3RlZCAncmdiJyBhbmQgJ2dyYXknIGNhc2VzLiAgcHJvZmlsZV9lcnJvcgorICAgIG1lc3NhZ2VzIGNvdWxkIGJlIHRydW5jYXRlZDsgbWFkZSBhIGNvcnJlY3QgYnVmZmVyIHNpemUgY2FsY3VsYXRpb24gYW5kCisgICAgYWRqdXN0ZWQgcG5nZXJyb3IuYyBhcHByb3ByaWF0ZWx5LiBwbmdfaWNjX2NoZWNrXyogY2hlY2tpbmcgaW1wcm92ZWQ7CisgICAgY2hhbmdlZCB0aGUgZnVuY3Rpb25zIHRvIHJlY2VpdmUgdGhlIGNvcnJlY3QgY29sb3IgdHlwZSBvZiB0aGUgUE5HIG9uIHJlYWQKKyAgICBvciB3cml0ZSBhbmQgY2hlY2sgdGhhdCBpdCBtYXRjaGVzIHRoZSBjb2xvciBzcGFjZSBvZiB0aGUgcHJvZmlsZSAoZGVzcGl0ZQorICAgIHdoYXQgdGhlIGNvbW1lbnRzIHNhaWQgYmVmb3JlLCB0aGVyZSBpcyBkYW5nZXIgaW4gYXNzdW1pbmcgdGhlIGFwcCB3aWxsCisgICAgY29wZSBjb3JyZWN0bHkgd2l0aCBhbiBSR0IgcHJvZmlsZSBvbiBhIGdyYXlzY2FsZSBpbWFnZSBhbmQsIHNpbmNlIGl0CisgICAgdmlvbGF0ZXMgdGhlIFBORyBzcGVjLCBhbGxvd2luZyBpdCBpcyBjZXJ0YWluIHRvIHByb2R1Y2UgaW5jb25zaXN0ZW50CisgICAgYXBwIGJlaGF2aW9yIGFuZCBtaWdodCBldmVuIGNhdXNlIGFwcCBjcmFzaGVzLikgQ2hlY2sgdGhhdCBwcm9maWxlcworICAgIGNvbnRhaW4gdGhlIHRhZ3MgbmVlZGVkIHRvIHByb2Nlc3MgdGhlIFBORyAodGFncyBhbGwgcmVxdWlyZWQgYnkgdGhlIElDQworICAgIHNwZWMpLiBSZW1vdmVkIHVudXNlZCBQTkdfU1RBVElDIGZyb20gcG5ncHJpdi5oLgorCitWZXJzaW9uIDEuNi4wYmV0YTI5IFtTZXB0ZW1iZXIgNCwgMjAxMl0KKyAgRml4ZWQgdGhlIHNpbXBsaWZpZWQgQVBJIGV4YW1wbGUgcHJvZ3JhbXMgdG8gYWRkIHRoZSAqY29sb3JtYXAgcGFyYW1ldGVyCisgICAgdG8gc2V2ZXJhbCBvZiBoZSBBUEkgYW5kIGltcHJvdmVkIHRoZSBlcnJvciBtZXNzYWdlIGlmIHRoZSB2ZXJzaW9uIGZpZWxkCisgICAgaXMgbm90IHNldC4KKyAgQWRkZWQgY29udHJpYi9leGFtcGxlcy8qIHRvIHRoZSAqLnppcCBhbmQgKi43eiBkaXN0cmlidXRpb25zLgorICBVcGRhdGVkIHNpbXBsaWZpZWQgQVBJIHN5bm9wc2VzIGFuZCBkZXNjcmlwdGlvbiBvZiB0aGUgcG5nX2ltYWdlIHN0cnVjdHVyZQorICAgIGluIHRoZSBtYW51YWwuCisgIE1hZGUgbWFrZXBuZyBhbmQgcG5ndGVzdCBwcm9kdWNlIGlkZW50aWNhbCBQTkdzLCBhZGQgIi0tcmVsYXhlZCIgb3B0aW9uCisgICAgdG8gcG5ndGVzdC4gVGhlICItLXJlbGF4ZWQiIG9wdGlvbiB0dXJucyBvZmYgdGhlIGJlbmlnbiBlcnJvcnMgdGhhdCBhcmUKKyAgICBlbmFibGVkIGJ5IGRlZmF1bHQgaW4gcHJlLVJDIGJ1aWxkcy4gbWFrZXBuZyBjYW4gbm93IHdyaXRlIElDQyBwcm9maWxlcworICAgIHdoZXJlIHRoZSBsZW5ndGggaGFzIG5vdCBiZWVuIGV4dGVuZGVkIHRvIGEgbXVsdGlwbGUgb2YgNCwgYW5kIHBuZ3Rlc3QKKyAgICBub3cgaW50ZXJjZXB0cyBhbGwgbGlicG5nIGVycm9ycywgYWxsb3dpbmcgdGhlIHByZXZpb3VzbHktaW50cm9kdWNlZAorICAgICItLXN0cmljdCB0ZXN0IiBvbiBubyB3YXJuaW5ncyB0byBhY3R1YWxseSB3b3JrLgorICBJbXByb3ZlZCBJQ0MgcHJvZmlsZSBoYW5kbGluZyBpbmNsdWRpbmcgY0hSTSBjaHVuayBnZW5lcmF0aW9uIGFuZCBmaXhlZAorICAgIEN5Z3dpbitNU1ZDIGJ1aWxkIGVycm9ycy4gVGhlIElDQyBwcm9maWxlIGhhbmRsaW5nIG5vdyBpbmNsdWRlcyBtb3JlCisgICAgY2hlY2tpbmcuICBTZXZlcmFsIGVycm9ycyB0aGF0IGNhdXNlZCByZWplY3Rpb24gb2YgdGhlIHByb2ZpbGUgYXJlIG5vdworICAgIGhhbmRsZWQgd2l0aCBhIHdhcm5pbmcgaW4gc3VjaCBhIHdheSB0aGF0IHRoZSBpbnZhbGlkIHByb2ZpbGVzIHdpbGwgYmUKKyAgICByZWFkIGJ5IGRlZmF1bHQgaW4gcmVsZWFzZSAoYnV0IG5vdCBwcmUtUkMpIGJ1aWxkcyBidXQgd2lsbCBub3QgYmUKKyAgICB3cml0dGVuIGJ5IGRlZmF1bHQuICBUaGUgZWFzeSBwYXJ0IG9mIGhhbmRsaW5nIHRoZSBjSFJNIGNodW5rIGlzIHdyaXR0ZW4sCisgICAgd2hlcmUgdGhlIElDQyBwcm9maWxlIGNvbnRhaW5zIHRoZSByZXF1aXJlZCBkYXRhLiAgVGhlIG1vcmUgZGlmZmljdWx0CisgICAgcGFydCBwbHVzIGd1ZXNzaW5nIGEgZ0FNQSB2YWx1ZSByZXF1aXJlcyBjb2RlIHRvIHBhc3Mgc2VsZWN0ZWQgUkdCIHZhbHVlcworICAgIHRocm91Z2ggdGhlIHByb2ZpbGUuCisKK1ZlcnNpb24gMS42LjBiZXRhMzAgW09jdG9iZXIgMjQsIDIwMTJdCisgIENoYW5nZWQgSUNDIHByb2ZpbGUgbWF0cml4L3ZlY3RvciB0eXBlcyB0byBub3QgZGVwZW5kIG9uIGFycmF5IHR5cGUgcnVsZXMuCisgICAgQnkgdGhlIEFOU0ktQyBzdGFuZGFyZCB0aGUgbmV3IHR5cGVzIHNob3VsZCBiZSBpZGVudGljYWwgdG8gdGhlIHByZXZpb3VzCisgICAgdmVyc2lvbnMsIGFuZCBhbGwga25vd24gdmVyc2lvbnMgb2YgZ2NjIHRlc3RlZCB3aXRoIHRoZSBwcmV2aW91cyB2ZXJzaW9ucworICAgIGV4Y2VwdCBmb3IgR0NDLTQuMi4xIHdvcmsgd2l0aCB0aGlzIHZlcnNpb24uICBUaGUgY2hhbmdlIG1ha2VzIHRoZSBBTlNJLUMKKyAgICBydWxlIHRoYXQgY29uc3QgYXBwbGllZCB0byBhbiBhcnJheSBvZiBlbGVtZW50cyBhcHBsaWVzIGluc3RlYWQgdG8gdGhlCisgICAgZWxlbWVudHMgaW4gdGhlIGFycmF5IG1vb3QgYnkgZXhwbGljaXRseSBhcHBseWluZyBjb25zdCB0byB0aGUgYmFzZQorICAgIGVsZW1lbnRzIG9mIHRoZSBwbmdfaWNjX21hdHJpeCBhbmQgcG5nX2ljY192ZWN0b3IgdHlwZXMuIFRoZSBhY2NpZGVudGFsCisgICAgKGhhcm1sZXNzKSAnY29uc3QnIHByZXZpb3VzbHkgYXBwbGllZCB0byB0aGUgcGFyYW1ldGVycyBvZiB0d28gb2YgdGhlCisgICAgZnVuY3Rpb25zIGhhdmUgYWxzbyBiZWVuIHJlbW92ZWQuCisgIEFkZGVkIGEgd29yayBhcm91bmQgZm9yIEdDQyA0LjIgb3B0aW1pemF0aW9uIGJ1Zy4KKyAgTWFya2VkIHRoZSBicm9rZW4gKGJhZCB3aGl0ZSBwb2ludCkgb3JpZ2luYWwgSFAgc1JHQiBwcm9maWxlcyBjb3JyZWN0bHkgYW5kCisgICAgY29ycmVjdCBjb21tZW50cy4KKyAgQWRkZWQgLURaX1NPTE8gdG8gY29udHJpYi9wbmdtaW5pbS8qL21ha2VmaWxlIHRvIHdvcmsgd2l0aCB6bGliLTEuMi43CisgIFVzZSAvTURkIGZvciB2c3R1ZGlvIGRlYnVnIGJ1aWxkcy4gQWxzbyBhZGRlZCBwbmd1bmtvd24gdG8gdGhlIHZzdHVkaW8KKyAgICBidWlsZHMsIGZpeGVkIGJ1aWxkIGVycm9ycyBhbmQgY29ycmVjdGVkIGEgbWlub3IgZXhpdCBjb2RlIGVycm9yIGluCisgICAgcG5ndmFsaWQgaWYgdGhlICd0b3VjaCcgZmlsZSBuYW1lIGlzIGludmFsaWQuCisgIEFkZCB1cGRhdGVkIFdBUk5JTkcgZmlsZSB0byBwcm9qZWN0cy92c3R1ZGlvIGZyb20gbGlicG5nIDEuNS92c3R1ZGlvCisgIEZpeGVkIGJ1aWxkIHdoZW4gdXNpbmcgI2RlZmluZSBQTkdfTk9fUkVBRF9HQU1NQSBpbiBwbmdfZG9fY29tcG9zZSgpIGluCisgICAgcG5ncnRyYW4uYyAoRG9tYW5pIEhhbm5lcykuCisKK1ZlcnNpb24gMS42LjBiZXRhMzEgW05vdmVtYmVyIDEsIDIwMTJdCisgIFVuZGlkIHRoZSBlcnJvbmVvdXMgY2hhbmdlIHRvIHZzdHVkaW8vcG5ndmFsaWQgYnVpbGQgaW4gbGlicG5nLTEuNi4wYmV0YTMwLgorICBNYWRlIHBuZ3ZhbGlkIHNvIHRoYXQgaXQgd2lsbCBidWlsZCBvdXRzaWRlIHRoZSBsaWJwbmcgc291cmNlIHRyZWUuCisgIE1hZGUgYnVpbGRzIC1EUE5HX05PX1JFQURfR0FNTUEgY29tcGlsZSAodGhlIHVuaXQgdGVzdHMgc3RpbGwgZmFpbCkuCisgIE1hZGUgUE5HX05PX1JFQURfR0FNTUEgc3dpdGNoIG9mZiBpbnRlcmZhY2VzIHRoYXQgZGVwZW5kIG9uIFJFQURfR0FNTUEuCisgICAgUHJpb3IgdG8gMS42LjAgc3dpdGNoaW5nIG9mZiBSRUFEX0dBTU1BIGRpZCB1bnByZWRpY3RhYmxlIHRoaW5ncyB0byB0aGUKKyAgICBpbnRlcmZhY2VzIHRoYXQgdXNlIGl0IChzcGVjaWZpY2FsbHksIHBuZ19kb19iYWNrZ3JvdW5kIGluIDEuNCB3b3VsZAorICAgIHNpbXBseSBkaXNwbGF5IGNvbXBvc2l0ZSBmb3IgZ3JheXNjYWxlIGltYWdlcyBidXQgZG8gY29tcG9zaXRpb24KKyAgICB3aXRoIHRoZSBpbmNvcnJlY3QgYXJpdGhtZXRpYyBmb3IgY29sb3Igb25lcykuIEluIDEuNiB0aGUgc2VtYW50aWMKKyAgICBvZiAtRFBOR19OT19SRUFEX0dBTU1BIGlzIGNoYW5nZWQgdG8gc2ltcGx5IGRpc2FibGUgYW55IGludGVyZmFjZSB0aGF0CisgICAgZGVwZW5kcyBvbiBpdDsgdGhpcyBvYmxpZ2VzIHBlb3BsZSB3aG8gc2V0IGl0IHRvIGNvbnNpZGVyIHdoZXRoZXIgdGhleQorICAgIHJlYWxseSB3YW50IGl0IG9mZiBpZiB0aGV5IGhhcHBlbiB0byB1c2UgYW55IG9mIHRoZSBpbnRlcmZhY2VzIGluCisgICAgcXVlc3Rpb24gKHR5cGljYWxseSBtb3N0IHVzZXJzIHdobyBkaXNhYmxlIGl0IHdvbid0KS4KKyAgRml4ZWQgR1VJRHMgaW4gcHJvamVjdHMvdnN0dWRpby4gU29tZSB3ZXJlIGR1cGxpY2F0ZWQgb3IgbWlzc2luZywKKyAgICByZXN1bHRpbmcgaW4gVlMyMDEwIGhhdmluZyB0byB1cGRhdGUgdGhlIGZpbGVzLgorICBSZW1vdmVkIG5vbi13b3JraW5nIElDQyBwcm9maWxlIHN1cHBvcnQgY29kZSB0aGF0IHdhcyBtb3N0bHkgYWRkZWQgdG8KKyAgICBsaWJwbmctMS42LjBiZXRhMjkgYW5kIGJldGEzMC4gVGhlcmUgd2FzIHRvbyBtdWNoIGNvZGUgZm9yIHRvbyBsaXR0bGUKKyAgICBnYWluOyBpbXBsZW1lbnRpbmcgZnVsbCBJQ0MgY29sb3IgY29ycmVjdGlvbiBtYXkgYmUgZGVzaXJlYWJsZSBidXQgaXMgbGVmdAorICAgIHVwIHRvIGFwcGxpY2F0aW9ucy4KKworVmVyc2lvbiAxLjYuMGJldGEzMiBbTm92ZW1iZXIgMjUsIDIwMTJdCisgIEZpeGVkIGFuIGludGVybWl0dGVudCBTRUdWIGluIHBuZ3N0ZXN0IGR1ZSB0byBhbiB1bmluaXRpYWxpemVkIGFycmF5IGVsZW1lbnQuCisgIEFkZGVkIHRoZSBhYmlsaXR5IGZvciBjb250cmliL2xpYnRlc3RzL21ha2VwbmcuYyB0byBtYWtlIGEgUE5HIHdpdGgganVzdCBvbmUKKyAgICBjb2xvci4gVGhpcyBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBwbmdzdGVzdCBjb2xvciBpbmFjY3VyYWN5IHJlcG9ydHMuCisgIEZpeGVkIGVycm9yIGNoZWNraW5nIGluIHRoZSBzaW1wbGlmaWVkIHdyaXRlIEFQSSAoT2xhZiB2YW4gZGVyIFNwZWspCisgIE1hZGUgcG5nX3VzZXJfdmVyc2lvbl9jaGVjaygpIG9rIHRvIHVzZSB3aXRoIGxpYnBuZyB2ZXJzaW9uIDEuMTAueCBhbmQgbGF0ZXIuCisKK1ZlcnNpb24gMS42LjBiZXRhMzMgW0RlY2VtYmVyIDE1LCAyMDEyXQorICBGaXhlZCB0eXBvIGluIHBuZy5jIChQTkdfU0VUX0NIVU5LX01BTExPQ19NQVggc2hvdWxkIGJlIFBOR19DSFVOS19NQUxMT0NfTUFYKQorICAgIHRoYXQgY2F1c2VzIHRoZSBNQUxMT0NfTUFYIGxpbWl0IG5vdCB0byB3b3JrIChKb2huIEJvd2xlcikKKyAgQ2hhbmdlIHBuZ193YXJuaW5nKCkgdG8gcG5nX2FwcF9lcnJvcigpIGluIHBuZ3dyaXRlLmMgYW5kIGNvbW1lbnQgdGhlCisgICAgZmFsbC10aHJvdWdoIGNvbmRpdGlvbi4KKyAgQ2hhbmdlIHBuZ193YXJuaW5nKCkgdG8gcG5nX2FwcF93YXJuaW5nKCkgaW4gcG5nX3dyaXRlX3RSTlMoKS4KKyAgUmVhcnJhbmdlZCB0aGUgQVJNLU5FT04gb3B0aW1pemF0aW9uczogSXNvbGF0ZWQgdGhlIG1hY2hpbmUgc3BlY2lmaWMgY29kZQorICAgIHRvIHRoZSBoYXJkd2FyZSBzdWJkaXJlY3RvcnkgYW5kIGFkZGVkIGNvbW1lbnRzIHRvIHBuZ3J1dGlsLmMgc28gdGhhdAorICAgIGltcGxlbWVudG9ycyBvZiBvdGhlciBvcHRpbWl6YXRpb25zIGtub3cgd2hhdCB0byBkby4KKyAgRml4ZWQgY2FzZXMgb2YgdW5xdW90ZWQgREVTVERJUiBpbiBNYWtlZmlsZS5hbQorICBSZWJ1aWx0IE1ha2VmaWxlLmluLCBldGMuLCB3aXRoIGF1dG9jb25mLTIuNjkgYW5kIGF1dG9tYWtlLTEuMTIuNS4KKworVmVyc2lvbiAxLjYuMGJldGEzNCBbRGVjZW1iZXIgMTksIDIwMTJdCisgIENsZWFuZWQgdXAgd2hpdGVzcGFjZSBpbiB0aGUgc3lub3BzaXMgcG9ydGlvbiBvZiB0aGUgbWFucGFnZSAibGlicG5nLjMiCisgIERpc2Fzc2VtYmxlZCB0aGUgdmVyc2lvbiBudW1iZXIgaW4gc2NyaXB0cy9vcHRpb25zLmF3ayAobmVjZXNzYXJ5IGZvcgorICAgIGJ1aWxkaW5nIG9uIFN1bk9zKS4KKworVmVyc2lvbiAxLjYuMGJldGEzNSBbRGVjZW1iZXIgMjMsIDIwMTJdCisgIE1hZGUgZGVmYXVsdCBabGliIGNvbXByZXNzaW9uIHNldHRpbmdzIGJlIGNvbmZpZ3VyYWJsZS4gVGhpcyBhZGRzICNkZWZpbmVzIHRvCisgICAgcG5nbGliY29uZi5oIHRvIGNvbnRyb2wgdGhlIGRlZmF1bHRzLgorICBGaXhlZCBXaW5kb3dzIGJ1aWxkIGlzc3VlcywgZW5hYmxlZCBBUk0gY29tcGlsYXRpb24uIFZhcmlvdXMgd2FybmluZ3MgaXNzdWVkCisgICAgYnkgZWFybGllciB2ZXJzaW9ucyBvZiBHQ0MgZml4ZWQgZm9yIEN5Z3dpbiBhbmQgTWluL0dXICh3aGljaCBib3RoIHVzZSBvbGQKKyAgICBHQ0NzLikgQVJNIHN1cHBvcnQgaXMgZW5hYmxlZCBieSBkZWZhdWx0IGluIHpsaWIucHJvcHMgKHVuc3VwcG9ydGVkIGJ5CisgICAgTWljcm9zb2Z0KSBhbmQgQVJNIGNvbXBpbGF0aW9uIGlzIG1hZGUgcG9zc2libGUgYnkgZGVsZXRpbmcgdGhlIGNoZWNrIGZvcgorICAgIHg4Ni4gVGhlIHRlc3QgcHJvZ3JhbXMgY2Fubm90IGJlIHJ1biBiZWNhdXNlIHRoZXkgYXJlIG5vdCBzaWduZWQuCisKK1ZlcnNpb24gMS42LjBiZXRhMzYgW0phbnVhcnkgMiwgMjAxM10KKyAgRGlzY29udGludWVkIGRpc3RyaWJ1dGluZyBsaWJwbmctMS54LngudGFyLmJ6Mi4KKyAgRGlzY29udGludWVkIGRpc3RyaWJ1dGluZyBsaWJwbmctMS43LjAtMS42LjAtZGlmZi50eHQgYW5kIHNpbWlsYXIuCisgIFJlYnVpbHQgY29uZmlndXJlIHdpdGggYXV0b2NvbmYtMi42OSAoaW5hZHZlcnRlbnRseSBub3QgZG9uZSBpbiBiZXRhMzMpCisgIEZpeGVkICdtYWtlIGRpc3RjaGVjaycgb24gU1VOIE9TIC0gbGlicG5nLnNvIHdhcyBub3QgYmVpbmcgcmVtb3ZlZAorCitWZXJzaW9uIDEuNi4wYmV0YTM3IFtKYW51YXJ5IDEwLCAyMDEzXQorICBGaXhlZCBjb25jZWl2YWJsZSBidXQgZGlmZmljdWx0IHRvIHJlcHJvIG92ZXJmbG93LiBBbHNvIGFkZGVkIHR3byB0ZXN0CisgICAgcHJvZ3JhbXMgdG8gZ2VuZXJhdGUgYW5kIHRlc3QgYSBQTkcgd2hpY2ggc2hvdWxkIGhhdmUgdGhlIHByb2JsZW0uCisKK1ZlcnNpb24gMS42LjBiZXRhMzkgW0phbnVhcnkgMTksIDIwMTNdCisgIEFnYWluIGNvcnJlY3RlZCBhdHRlbXB0IGF0IG92ZXJmbG93IGRldGVjdGlvbiBpbiBwbmdfc2V0X3Vua25vd25fY2h1bmtzKCkKKyAgKENWRS0yMDEzLTczNTMpLiAgQWRkZWQgb3ZlcmZsb3cgZGV0ZWN0aW9uIGluIHBuZ19zZXRfc1BMVCgpIGFuZAorICBwbmdfc2V0X3RleHRfMigpIChDVkUtMjAxMy03MzU0KS4KKworVmVyc2lvbiAxLjYuMGJldGE0MCBbSmFudWFyeSAyMCwgMjAxM10KKyAgVXNlIGNvbnNpc3RlbnQgaGFuZGxpbmcgb2Ygb3ZlcmZsb3dzIGluIHRleHQsIHNQTFQgYW5kIHVua25vd24gcG5nX3NldF8qIEFQSXMKKworVmVyc2lvbiAxLjYuMHJjMDEgW0phbnVhcnkgMjYsIDIwMTNdCisgIE5vIGNoYW5nZXMuCisKK1ZlcnNpb24gMS42LjByYzAyIFtGZWJydWFyeSA0LCAyMDEzXQorICBBZGRlZCBwbmdfZ2V0X3BhbGV0dGVfbWF4KCkgZnVuY3Rpb24uCisKK1ZlcnNpb24gMS42LjByYzAzIFtGZWJydWFyeSA1LCAyMDEzXQorICBGaXhlZCB0aGUgcG5nX2dldF9wYWxldHRlX21heCBBUEkuCisKK1ZlcnNpb24gMS42LjByYzA0IFtGZWJydWFyeSA3LCAyMDEzXQorICBUdXJuIHNlcmlhbCB0ZXN0cyBiYWNrIG9uIChyZWNlbnRseSB0dXJuZWQgb2ZmIGJ5IGF1dG90b29scyB1cGdyYWRlKS4KKworVmVyc2lvbiAxLjYuMHJjMDUgW0ZlYnJ1YXJ5IDgsIDIwMTNdCisgIFVwZGF0ZSBtYW51YWwgYWJvdXQgcG5nX2dldF9wYWxldHRlX21heCgpLgorCitWZXJzaW9uIDEuNi4wcmMwNiBbRmVicnVhcnkgOSwgMjAxM10KKyAgRml4ZWQgbWlzc2luZyBkZXBlbmRlbmN5IGluIC0tcHJlZml4IGJ1aWxkcyBUaGUgaW50ZXJtZWRpYXRlCisgICAgaW50ZXJuYWwgJ3ByZWZpeC5oJyBmaWxlIGNhbiBvbmx5IGJlIGdlbmVyYXRlZCBjb3JyZWN0bHkgYWZ0ZXIKKyAgICBwbmdsaWJjb25mLmgsIGhvd2V2ZXIgdGhlIGRlcGVuZGVuY3kgd2FzIG5vdCBpbiBNYWtlZmlsZS5hbS4gIFRoZQorICAgIHN5bXB0b21zIGFyZSB1bnByZWRpY3RhYmxlIGRlcGVuZGluZyBvbiB0aGUgb3JkZXIgbWFrZSBjaG9vc2VzIHRvCisgICAgYnVpbGQgcG5ncHJlZml4LmggYW5kIHBuZ2xpYmNvbmYuaCwgb2Z0ZW4gdGhlIGVycm9yIGdvZXMgdW5ub3RpY2VkCisgICAgYmVjYXVzZSB0aGVyZSBpcyBhIHN5c3RlbSBwbmdsaWJjb25mLmggdG8gdXNlIGluc3RlYWQuCisKK1ZlcnNpb24gMS42LjByYzA3IFtGZWJydWFyeSAxMCwgMjAxM10KKyAgRW5jbG9zZWQgdGhlIG5ldyBwbmdfZ2V0X3BhbGV0dGVfbWF4IGluICNpZmRlZiBQTkdfR0VUX1BBTEVUVEVfTUFYX1NVUFBPUlRFRAorICAgIGJsb2NrLCBhbmQgcmV2aXNlZCBwbmdsaWJjb25mLmggYW5kIHBuZ2xpYmNvbmYuaC5wcmVidWlsdCBhY2NvcmRpbmdseS4KKworVmVyc2lvbiAxLjYuMHJjMDggW0ZlYnJ1YXJ5IDEwLCAyMDEzXQorICBGaXggdHlwbyBpbiBwbmcuaCAjaWZkZWYKKworVmVyc2lvbiAxLjYuMCBbRmVicnVhcnkgMTQsIDIwMTNdCisgIE5vIGNoYW5nZXMuCisKK1ZlcnNpb24gMS42LjFiZXRhMDEgW0ZlYnJ1YXJ5IDE2LCAyMDEzXQorICBNYWRlIHN5bWJvbCBwcmVmaXhpbmcgd29yayB3aXRoIHRoZSBBUk0gbmVvbiBvcHRpbWl6YXRpb25zLiBBbHNvIGFsbG93CisgICAgcG5ncHJpdi5oIHRvIGJlIGluY2x1ZGVkIGZvciBwcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgb25seSwgc28gaXQgY2FuCisgICAgYmUgdXNlZCBpbiBub24tQy9DKysgZmlsZXMuIEJhY2sgcG9ydGVkIGZyb20gbGlicG5nIDEuNy4KKyAgTWFkZSBzUkdCIGNoZWNrIG51bWJlcnMgY29uc2lzdGVudC4KKyAgUG9ydGVkIGxpYnBuZyAxLjUgb3B0aW9ucy5hd2svZGZuIGZpbGUgaGFuZGxpbmcgdG8gMS42LCBmaXhlZCBvbmUgYnVnLgorICBSZW1vdmVkIGNjIC1FIHdvcmtyb3VuZCwgY29ycmVjdGVkIHBuZ19nZXRfcGFsZXR0ZV9tYXggQVBJIFRlc3RlZCBvbgorICAgIFNVTiBPUyBjYyA1LjksIHdoaWNoIGRlbW9uc3RyYXRlcyB0aGUgdG9rZW5pemF0aW9uIHByb2JsZW0gcHJldmlvdXNseQorICAgIGF2b2lkZWQgYnkgdXNpbmcgL2xpYi9jcHAuICBTaW5jZSBhbGwgLmRmbiBvdXRwdXQgaXMgbm93IHByb3RlY3RlZCBpbgorICAgIGRvdWJsZSBxdW90ZXMgdW5sZXNzIGl0IGlzIHRvIGJlIG1hY3JvIHN1YnN0aXR1dGVkIHRoZSBmaXggc2hvdWxkCisgICAgd29yayBldmVyeXdoZXJlLgorICBFbmFibGVkIHBhcmFsbGVsIHRlc3RzIC0gYmFjayBwb3J0ZWQgZnJvbSBsaWJwbmctMS43LgorICBzY3JpcHRzL3BuZ2xpYmNvbmYuZGZhIGZvcm1hdHRpbmcgaW1wcm92ZW1lbnRzIGJhY2sgcG9ydGVkIGZyb20gbGlicG5nMTcuCisgIEZpeGVkIGEgcmFjZSBjb25kaXRpb24gaW4gdGhlIGNyZWF0aW9uIG9mIHRoZSBidWlsZCAnc2NyaXB0cycgZGlyZWN0b3J5CisgICAgd2hpbGUgYnVpbGRpbmcgd2l0aCBhIHBhcmFsbGVsIG1ha2UuCisgIFVzZSBhcHByb3ZlZC9zdXBwb3J0ZWQgQW5kcm9pZCBtZXRob2QgdG8gY2hlY2sgZm9yIE5FT04sIHVzZSBMaW51eC9QT1NJWAorICAgIDEwMDMuMSBBUEkgdG8gY2hlY2sgL3Byb2Mvc2VsZi9hdXh2IGF2b2lkaW5nIGJ1ZmZlciBhbGxvY2F0aW9uIGFuZCBvdGhlcgorICAgIGxpYnJhcnkgY2FsbHMgKHBvcnRlZCBmcm9tIGxpYnBuZzE1KS4KKworVmVyc2lvbiAxLjYuMWJldGEwMiBbRmVicnVhcnkgMTksIDIwMTNdCisgIFVzZSBwYXJlbnRoZXNlcyBtb3JlIGNvbnNpc3RlbnRseSBpbiAiI2lmIGRlZmluZWQoTUFDUk8pIiB0ZXN0cy4KKyAgRm9sZGVkIGxvbmcgbGluZXMuCisgIFJlZW5hYmxlZCBjb2RlIHRvIGFsbG93IHplcm8gbGVuZ3RoIFBMVEUgY2h1bmtzIGZvciBNTkcuCisKK1ZlcnNpb24gMS42LjFiZXRhMDMgW0ZlYnJ1YXJ5IDIyLCAyMDEzXQorICBGaXhlZCBBTElHTkVEX01FTU9SWSBzdXBwb3J0LgorICBBZGRlZCBhIG5ldyBjb25maWd1cmUgb3B0aW9uOgorICAgIC0tZW5hYmxlLWFybS1uZW9uPWFsd2F5cyB3aWxsIHN0b3AgdGhlIHJ1bi10aW1lIGNoZWNrcy4gTmV3IGNoZWNrcworICAgIHdpdGhpbiBhcm0vYXJtX2luaXQuYyB3aWxsIGNhdXNlIHRoZSBjb2RlIG5vdCB0byBiZSBjb21waWxlZCB1bmxlc3MKKyAgICBfX0FSTV9ORU9OX18gaXMgc2V0LiBUaGlzIHNob3VsZCBtYWtlIGl0IGZhaWwgc2FmZSAoaWYgc29tZW9uZSBhc2tzCisgICAgZm9yIGl0IG9uIHRoZW4gdGhlIGJ1aWxkIHdpbGwgZmFpbCBpZiBpdCBjYW4ndCBiZSBkb25lLikKKyAgVXBkYXRlZCB0aGUgSU5TVEFMTCBkb2N1bWVudC4KKworVmVyc2lvbiAxLjYuMWJldGEwNCBbRmVicnVhcnkgMjcsIDIwMTNdCisgIFJldmlzZWQgSU5TVEFMTCB0byByZWNvbW1lbmQgdXNpbmcgQ1BQRkxBR1MgaW5zdGVhZCBvZiBJTkNMVURFUy4KKyAgUmV2aXNlZCBzY3JpcHRzL21ha2VmaWxlLmZyZWVic2QgdG8gcmVzcGVjdCBaTElCTElCIGFuZCBaTElCSU5DLgorICBSZXZpc2VkIHNjcmlwdHMvZGZuLmF3ayB0byB3b3JrIHdpdGggdGhlIGJ1Z2d5IE1TWVMgYXdrIHRoYXQgaGFzIHRyb3VibGUKKyAgICB3aXRoIENSTEYgbGluZSBlbmRpbmdzLgorCitWZXJzaW9uIDEuNi4xYmV0YTA1IFtNYXJjaCAxLCAyMDEzXQorICBBdm9pZCBhIHBvc3NpYmxlIG1lbW9yeSBsZWFrIGluIGNvbnRyaWIvZ3JlZ2Jvb2svcmVhZHBuZy5jCisKK1ZlcnNpb24gMS42LjFiZXRhMDYgW01hcmNoIDQsIDIwMTNdCisgIEJldHRlciBkb2N1bWVudGF0aW9uIG9mIHVua25vd24gaGFuZGxpbmcgQVBJIGludGVyYWN0aW9ucy4KKyAgQ29ycmVjdGVkIEFuZHJvaWQgYnVpbGRzIGFuZCBjb3JyZWN0ZWQgbGlicG5nLnZlcnMgd2l0aCBzeW1ib2wKKyAgICBwcmVmaXhpbmcuICBJdCBhbHNvIG1ha2VzIHRob3NlIHRlc3RzIGNvbXBpbGUgYW5kIGxpbmsgb24gQW5kcm9pZC4KKyAgQWRkZWQgYW4gQVBJIHBuZ19zZXRfb3B0aW9uKCkgdG8gc2V0IG9wdGltaXphdGlvbiBvcHRpb25zIGV4dGVybmFsbHksCisgICAgcHJvdmlkaW5nIGFuIGFsdGVybmF0aXZlIGFuZCBnZW5lcmFsIHNvbHV0aW9uIGZvciB0aGUgbm9uLXBvcnRhYmxlCisgICAgcnVuLXRpbWUgdGVzdHMgdXNlZCBieSB0aGUgQVJNIE5lb24gY29kZSwgdXNpbmcgdGhlIFBOR19BUk1fTkVPTiBvcHRpb24uCisgIFRoZSBvcmRlciBvZiBzZXR0aW5ncyB2cyBvcHRpb25zIGluIHBuZ2xpYmNvbmYuaCBpcyByZXZlcnNlZCB0byBhbGxvdworICAgIHNldHRpbmdzIHRvIGRlcGVuZCBvbiBvcHRpb25zIGFuZCBvcHRpb25zIGNhbiBub3cgc2V0IChvciBvdmVycmlkZSkgdGhlCisgICAgZGVmYXVsdHMgZm9yIHNldHRpbmdzLgorCitWZXJzaW9uIDEuNi4xYmV0YTA3IFtNYXJjaCA3LCAyMDEzXQorICBDb3JyZWN0ZWQgc2ltcGxpZmllZCBBUEkgZGVmYXVsdCBnYW1tYSBmb3IgY29sb3ItbWFwcGVkIG91dHB1dCwgYWRkZWQKKyAgICBhIGZsYWcgdG8gY2hhbmdlIGRlZmF1bHQuIEluIDEuNi4wIHdoZW4gdGhlIHNpbXBsaWZpZWQgQVBJIHdhcyB1c2VkCisgICAgdG8gcHJvZHVjZSBjb2xvci1tYXBwZWQgb3V0cHV0IGZyb20gYW4gaW5wdXQgaW1hZ2Ugd2l0aCBubyBnYW1tYQorICAgIGluZm9ybWF0aW9uIHRoZSBnYW1tYSBhc3N1bWVkIGZvciB0aGUgaW5wdXQgY291bGQgYmUgZGlmZmVyZW50IGZyb20KKyAgICB0aGF0IGFzc3VtZWQgZm9yIG5vbi1jb2xvci1tYXBwZWQgb3V0cHV0LiAgSW4gcGFydGljdWxhciAxNi1iaXQgZGVwdGgKKyAgICBpbnB1dCBmaWxlcyB3ZXJlIGFzc3VtZWQgdG8gYmUgc1JHQiBlbmNvZGVkLCB3aGVyZWFzIGluIHRoZSAnZGlyZWN0JworICAgIGNhc2UgdGhleSB3ZXJlIGFzc3VtZWQgdG8gaGF2ZSBsaW5lYXIgZGF0YS4gIFRoaXMgd2FzIGFuIGVycm9yLiAgVGhlCisgICAgZml4IG1ha2VzIHRoZSBzaW1wbGlmaWVkIEFQSSB0cmVhdCBhbGwgaW5wdXQgZmlsZXMgdGhlIHNhbWUgd2F5IGFuZAorICAgIGFkZHMgYSBuZXcgZmxhZyB0byB0aGUgcG5nX2ltYWdlOjpmbGFncyBtZW1iZXIgdG8gYWxsb3cgdGhlCisgICAgYXBwbGljYXRpb24vdXNlciB0byBzcGVjaWZ5IHRoYXQgMTYtYml0IGZpbGVzIGNvbnRhaW4gc1JHQiBkYXRhCisgICAgcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQgbGluZWFyLgorICBGaXhlZCBidWdzIGluIHRoZSBwbmdwaXhlbCBhbmQgbWFrZXBuZyB0ZXN0IHByb2dyYW1zLgorCitWZXJzaW9uIDEuNi4xYmV0YTA4IFtNYXJjaCA3LCAyMDEzXQorICBGaXhlZCBDTWFrZWxpc3RzLnR4dCB0byBhbGxvdyBidWlsZGluZyBhIHNpbmdsZSB2YXJpYW50IG9mIHRoZSBsaWJyYXJ5CisgICAgKENsYXVkaW8gQmxleSk6CisgIEludHJvZHVjZWQgYSBQTkdfTElCX1RBUkdFVFMgdmFyaWFibGUgdGhhdCBsaXN0cyBhbGwgYWN0aXZhdGVkIGxpYnJhcnkKKyAgICB0YXJnZXRzLiAgSXQgaXMgYW4gZXJyb3IgaWYgdGhpcyB2YXJpYWJsZSBlbmRzIHVwIGVtcHR5LCBpZS4geW91IGhhdmUKKyAgICB0byBidWlsZCBhdCBsZWFzdCBvbmUgbGlicmFyeSB2YXJpYW50LgorICBNYWRlIHRoZSAqX0NPUFkgdGFyZ2V0cyBvbmx5IGRlcGVuZCBvbiBsaWJyYXJ5IHRhcmdldHMgYWN0dWFsbHkgYmVpbmcgYnVpbGQuCisgIFVzZSBQTkdfTElCX1RBUkdFVFMgdG8gdW5pZnkgYSBjb2RlIHBhdGguCisgIENoYW5nZWQgdGhlIENSRUFURV9TWU1MSU5LIG1hY3JvIHRvIGV4cGVjdCB0aGUgZnVsbCBwYXRoIHRvIGEgZmlsZSBhcyB0aGUKKyAgICBmaXJzdCBhcmd1bWVudC4gV2hlbiBzeW1saW5raW5nIHRoZSBmaWxlbmFtZSBjb21wb25lbnQgb2YgdGhhdCBwYXRoIGlzCisgICAgZGV0ZXJtaW5lZCBhbmQgdXNlZCBhcyB0aGUgbGluayB0YXJnZXQuCisgIFVzZSBjb3B5X2lmX2RpZmZlcmVudCBpbiB0aGUgQ1JFQVRFX1NZTUxJTksgbWFjcm8uCisKK1ZlcnNpb24gMS42LjFiZXRhMDkgW01hcmNoIDEzLCAyMDEzXQorICBFbGltaW5hdGVkIHR3byB3YXJuaW5ncyBmcm9tIHRoZSBJbnRlbCBDIGNvbXBpbGVyLiBUaGUgd2FybmluZ3MgYXJlCisgICAgdGVjaG5pY2FsbHkgdmFsaWQsIGFsdGhvdWdoIGEgcmVhc29uYWJsZSB0cmVhdG1lbnQgb2YgZGl2aXNpb24gd291bGQKKyAgICBzaG93IGl0IHRvIGJlIGluY29ycmVjdC4KKworVmVyc2lvbiAxLjYuMXJjMDEgW01hcmNoIDIxLCAyMDEzXQorICBObyBjaGFuZ2VzLgorCitWZXJzaW9uIDEuNi4xIFtNYXJjaCAyOCwgMjAxM10KKyAgTm8gY2hhbmdlcy4KKworVmVyc2lvbiAxLjYuMmJldGEwMSBbQXByaWwgMTQsIDIwMTNdCisgIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiBvZiAxLjUueCB0byAxLjYueCBjaGFuZ2VzIGluIGlDQ1AgY2h1bmsgaGFuZGxpbmcuCisgIEZpeGVkIGluY29ycmVjdCB3YXJuaW5nIG9mIGV4Y2VzcyBkZWZsYXRlIGRhdGEuIEVuZCBjb25kaXRpb24gLSB0aGUKKyAgICB3YXJuaW5nIHdvdWxkIGJlIHByb2R1Y2VkIGlmIHRoZSBlbmQgb2YgdGhlIGRlZmxhdGUgc3RyZWFtIHdhc24ndCByZWFkCisgICAgaW4gdGhlIGxhc3Qgcm93LiAgVGhlIHdhcm5pbmcgaXMgaGFybWxlc3MuCisgIENvcnJlY3RlZCB0aGUgdGVzdCBvbiB1c2VyIHRyYW5zZm9ybSBjaGFuZ2VzIG9uIHJlYWQuIEl0IHdhcyBpbiB0aGUKKyAgICBwbmdfc2V0IG9mIHRoZSB0cmFuc2Zvcm0gZnVuY3Rpb24sIGJ1dCB0aGF0IGRvZXNuJ3QgbWF0dGVyIHVubGVzcyB0aGUKKyAgICB0cmFuc2Zvcm0gZnVuY3Rpb24gY2hhbmdlcyB0aGUgcm93YnVmIHNpemUsIGFuZCB0aGF0IGlzIG9ubHkgdmFsaWQgaWYKKyAgICB0cmFuc2Zvcm1faW5mbyBpcyBjYWxsZWQuCisgIENvcnJlY3RlZCBhIG1pc3BsYWNlZCBjbG9zaW5nIGJyYWNrZXQgaW4gY29udHJpYi9saWJ0ZXN0cy9wbmd2YWxpZC5jCisgICAgKEZsYXZpbyBNZWRlaXJvcykuCisgIENvcnJlY3RlZCBsZW5ndGggd3JpdHRlbiB0byB1bmNvbXByZXNzZWQgaVRYdCBjaHVua3MgKFNhbXVsaSBTdW9taW5lbikuCisgICAgQnVnIHdhcyBpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjYuMC4KKworVmVyc2lvbiAxLjYuMnJjMDEgW0FwcmlsIDE4LCAyMDEzXQorICBBZGRlZCBjb250cmliL3Rvb2xzL2ZpeGl0eHQuYywgdG8gcmVwYWlyIHRoZSBlcnJvbmVvdXMgaVRYdCBjaHVuayBsZW5ndGgKKyAgICB3cml0dGVuIGJ5IGxpYnBuZy0xLjYuMCBhbmQgMS42LjEuCisgIERpc2FsbG93IHN0b3Jpbmcgc1JHQiBpbmZvcm1hdGlvbiB3aGVuIHRoZSBzUkdCIGlzIG5vdCBzdXBwb3J0ZWQuCisKK1ZlcnNpb24gMS42LjJyYzAyIFtBcHJpbCAxOCwgMjAxM10KKyAgTWVyZ2UgcG5ndGVzdC5jIHdpdGggbGlicG5nLTEuNy4wCisKK1ZlcnNpb24gMS42LjJyYzAzIFtBcHJpbCAyMiwgMjAxM10KKyAgVHJpdmlhbCBzcGVsbGluZyBjbGVhbnVwLgorCitWZXJzaW9uIDEuNi4ycmMwNCBhbmQgMS42LjJyYzA1IFtvbWl0dGVkXQorCitWZXJzaW9uIDEuNi4ycmMwNiBbQXByaWwgMjQsIDIwMTNdCisgIFJldmVydGVkIHRvIHZlcnNpb24gMS42LjJyYzAzLiAgUmVjZW50IGNoYW5nZXMgdG8gYXJtL25lb24gc3VwcG9ydAorICAgIGhhdmUgYmVlbiBwb3J0ZWQgdG8gbGlicG5nLTEuNy4wYmV0YTA5IGFuZCB3aWxsIHJlYXBwZWFyIGluIHZlcnNpb24KKyAgICAxLjYuM2JldGEwMS4KKworVmVyc2lvbiAxLjYuMiBbQXByaWwgMjUsIDIwMTNdCisgIE5vIGNoYW5nZXMuCisKK1ZlcnNpb24gMS42LjNiZXRhMDEgW0FwcmlsIDI1LCAyMDEzXQorICBSZXZpc2VkIHN0YWNrIG1hcmtpbmcgaW4gYXJtL2ZpbHRlcl9uZW9uLlMgYW5kIGNvbmZpZ3VyZS5hYy4KKyAgRW5zdXJlIHRoYXQgTkVPTiBmaWx0ZXIgc3R1ZmYgaXMgY29tcGxldGVseSBkaXNhYmxlZCB3aGVuIHN3aXRjaGVkICdvZmYnLgorICAgIFByZXZpb3VzbHkgdGhlIEFSTSBORU9OIHNwZWNpZmljIGZpbGVzIHdlcmUgc3RpbGwgYnVpbHQgaWYgdGhlIG9wdGlvbgorICAgIHdhcyBzd2l0Y2hlZCAnb2ZmJyBhcyBvcHBvc2VkIHRvIGJlaW5nIGV4cGxpY2l0bHkgZGlzYWJsZWQuCisKK1ZlcnNpb24gMS42LjNiZXRhMDIgW0FwcmlsIDI2LCAyMDEzXQorICBUZXN0IGZvciAnYXJtKicgbm90IGp1c3QgJ2FybScgaW4gdGhlIGhvc3RfY3B1IGNvbmZpZ3VyZSB2YXJpYWJsZS4KKyAgUmVidWlsdCB0aGUgY29uZmlndXJlIHNjcmlwdHMuCisKK1ZlcnNpb24gMS42LjNiZXRhMDMgW0FwcmlsIDMwLCAyMDEzXQorICBFeHBhbmRlZCBtYW51YWwgcGFyYWdyYXBoIGFib3V0IHdyaXRpbmcgcHJpdmF0ZSBjaHVua3MsIHBhcnRpY3VsYXJseQorICAgIHRoZSBuZWVkIHRvIGNhbGwgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKCkgd2hlbiB3cml0aW5nIHRoZW0uCisgIEF2b2lkIGRlcmVmZXJlbmNpbmcgTlVMTCBwb2ludGVyIHBvc3NpYmx5IHJldHVybmVkIGZyb20KKyAgICBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCgpIChBbmRyZXcgQ2h1cmNoKS4KKworVmVyc2lvbiAxLjYuM2JldGEwNSBbTWF5IDksIDIwMTNdCisgIENhbGN1bGF0ZSBvdXIgb3duIHpsaWIgd2luZG93Qml0cyB3aGVuIGRlY29kaW5nIHJhdGhlciB0aGFuIHRydXN0aW5nIHRoZQorICAgIENNRiBieXRlcyBpbiB0aGUgUE5HIGRhdGFzdHJlYW0uCisgIEFkZGVkIGFuIG9wdGlvbiB0byBmb3JjZSBtYXhpbXVtIHdpbmRvdyBzaXplIGZvciBpbmZsYXRpbmcsIHdoaWNoIHdhcworICAgIHRoZSBiZWhhdmlvciBvZiBsaWJwbmcxNSBhbmQgZWFybGllciwgdmlhIGEgbmV3IFBOR19NQVhJTVVNX0lORkxBVEVfV0lORE9XCisgICAgb3B0aW9uIGZvciBwbmdfc2V0X29wdGlvbnMoKS4KKyAgQWRkZWQgcG5nLWZpeC1pdHh0IGFuZCBwbmctZml4LXRvby1mYXItYmFjayB0byB0aGUgYnVpbHQgcHJvZ3JhbXMgYW5kCisgICAgcmVtb3ZlZCB3YXJuaW5ncyBmcm9tIHRoZSBzb3VyY2UgY29kZSBhbmQgdGltZXBuZyB0aGF0IGFyZSByZXZlYWxlZCBhcworICAgIGEgcmVzdWx0LgorICBEZXRlY3Qgd3JvbmcgbGlicG5nIHZlcnNpb25zIGxpbmtlZCB0byBwbmctZml4LXRvby1mYXItYmFjaywgd2hpY2ggY3VycmVudGx5CisgICAgb25seSB3b3JrcyB3aXRoIGxpYnBuZyB2ZXJzaW9ucyB0aGF0IGNhbiBiZSBtYWRlIHRvIHJlbGlhYmx5IGZhaWwgd2hlbgorICAgIHRoZSBkZWZsYXRlIGRhdGEgY29udGFpbnMgYW4gb3V0LW9mLXdpbmRvdyByZWZlcmVuY2UuICBUaGlzIG1lYW5zIG9ubHkKKyAgICAxLjYgYW5kIGxhdGVyLgorICBGaXhlZCBnbnUgaXNzdWVzOiBnKysgbmVlZHMgYSBzdGF0aWNfY2FzdCwgZ2NjIDQuNC43IGhhcyBhIGJyb2tlbiB3YXJuaW5nCisgICAgbWVzc2FnZSB3aGljaCBpdCBpcyBlYXNpZXIgdG8gd29yayByb3VuZCB0aGFuIGlnbm9yZS4KKyAgVXBkYXRlZCBjb250cmliL3BuZ21pbnVzL3BubTJwbmcuYyAoUGF1bCBTdGV3YXJ0KToKKyAgICBDaGVjayBmb3IgRU9GCisgICAgSWdub3JlICIjIiBkZWxpbWl0ZWQgY29tbWVudHMgaW4gaW5wdXQgZmlsZSB0byBwbm0ycG5nLmMuCisgICAgRml4ZWQgd2hpdGVzcGFjZSBoYW5kbGluZworICAgIEFkZGVkIGEgY2FsbCB0byBwbmdfc2V0X3BhY2tpbmcoKQorICAgIEluaXRpYWxpemUgZGltZW5zaW9uIHZhbHVlcyBzbyBpZiBzc2NhbmYgZmFpbHMgYXQgbGVhc3Qgd2UgaGF2ZSBrbm93bgorICAgICAgaW52YWxpZCB2YWx1ZXMuCisgIEF0dGVtcHQgdG8gZGV0ZWN0IGNvbmZpZ3VyYXRpb24gaXNzdWVzIHdpdGggcG5nLWZpeC10b28tZmFyLWJhY2ssIHdoaWNoCisgICAgcmVxdWlyZXMgYm90aCB0aGUgY29ycmVjdCBsaWJwbmcgYW5kIHRoZSBjb3JyZWN0IHpsaWIgdG8gZnVuY3Rpb24KKyAgICBjb3JyZWN0bHkuCisgIENoZWNrIFpMSUJfVkVSTlVNIGZvciBtaXNtYXRjaGVzLCBlbmNsb3NlICNlcnJvciBpbiBxdW90ZXMKKyAgQWRkZWQgaW5mb3JtYXRpb24gaW4gdGhlIGRvY3VtZW50YXRpb24gYWJvdXQgcHJvYmxlbXMgd2l0aCBhbmQgZml4ZXMgZm9yCisgICAgdGhlIGJhZCBDUkMgYW5kIGJhZCBpVFh0IGNodW5rIHNpdHVhdGlvbnMuCisKK1ZlcnNpb24gMS42LjNiZXRhMDYgW01heSAxMiwgMjAxM10KKyAgQWxsb3cgY29udHJpYi9wbmdtaW51cy9wbm0ycG5nLmMgdG8gY29tcGlsZSB3aXRob3V0IFdSSVRFX0lOVkVSVCBhbmQKKyAgICBXUklURV9QQUNLIHN1cHBvcnRlZCAod3JpdGVzIGVycm9yIG1lc3NhZ2UgdGhhdCBpdCBjYW4ndCByZWFkIFAxIG9yCisgICAgUDQgUEJNIGZpbGVzKS4KKyAgSW1wcm92ZWQgcG5nLWZpeC10b28tZmFyLWJhY2sgdXNhZ2UgbWVzc2FnZSwgYWRkZWQgLS1zdWZmaXggb3B0aW9uLgorICBSZXZpc2VkIGNvbnRyaWIvcG5nbWluaW0vKi9tYWtlZmlsZSB0byBnZW5lcmF0ZSBwbmdsaWJjb25mLmggd2l0aCB0aGUKKyAgICByaWdodCB6bGliIGhlYWRlciBmaWxlcy4KKyAgU2VwYXJhdGVkIENQUEZMQUdTIGFuZCBDRkxBR1MgaW4gY29udHJpYi9wbmdtaW5pbS8qL21ha2VmaWxlCisKK1ZlcnNpb24gMS42LjNiZXRhMDcgW0p1bmUgOCwgMjAxM10KKyAgUmVtb3ZlZCBhIHJlZHVuZGFudCB0ZXN0IGluIHBuZ19zZXRfSUhEUigpLgorICBBZGRlZCBzZXQoQ01BS0VfQ09ORklHVVJBVElPTl9UWVBFUyAuLi4pIHRvIENNYWtlTGlzdHMudHh0IChBbmRyZXcgSHVuZHQpCisgIERlbGV0ZWQgc2V0KENNQUtFX0JVSUxEX1RZUEUpIGJsb2NrIGZyb20gQ01ha2VMaXN0cy50eHQKKyAgRW5jbG9zZSB0aGUgcHJvdG90eXBlcyBmb3IgdGhlIHNpbXBsaWZpZWQgd3JpdGUgQVBJIGluCisgICAgI2lmZGVmIFBOR19TVERJT19TVVBQT1JURUQvI2VuZGlmCisgIE1ha2UgQVJNIE5FT04gc3VwcG9ydCB3b3JrIGF0IGNvbXBpbGUgdGltZSAobm90IGp1c3QgY29uZmlndXJlIHRpbWUpLgorICAgIFRoaXMgbW92ZXMgdGhlIHRlc3Qgb24gX19BUk1fTkVPTl9fIGludG8gcG5nY29uZi5oIHRvIGF2b2lkIGlzc3VlcyB3aGVuCisgICAgdXNpbmcgYSBjb21waWxlciB0aGF0IGNvbXBpbGVzIGZvciBtdWx0aXBsZSBhcmNoaXRlY3R1cmVzIGF0IG9uZSB0aW1lLgorICBSZW1vdmVkIFBOR19GSUxURVJfT1BUSU1JWkFUSU9OUyBhbmQgUE5HX0FSTV9ORU9OX1NVUFBPUlRFRCBmcm9tCisgICAgcG5nbGliY29uZi5oLCBhbGxvd2luZyBtb3JlIG9mIHRoZSBkZWNpc2lvbnMgdG8gYmUgbWFkZSBpbnRlcm5hbGx5CisgICAgKHBuZ3ByaXYuaCkgZHVyaW5nIHRoZSBjb21waWxlLiAgV2l0aG91dCB0aGlzLCBzeW1ib2wgcHJlZml4aW5nIGlzIGJyb2tlbgorICAgIHVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcyBvbiBBUk0gcGxhdGZvcm1zLiAgTm93IG9ubHkgdGhlIEFQSSBwYXJ0cyBvZgorICAgIHRoZSBvcHRpbWl6YXRpb25zICgnY2hlY2snIHZzICdhcGknKSBhcmUgZXhwb3NlZCBpbiB0aGUgcHVibGljIGhlYWRlciBmaWxlcworICAgIGV4Y2VwdCB0aGF0IHRoZSBuZXcgc2V0dGluZyBQTkdfQVJNX05FT05fT1BUIGRvY3VtZW50cyBob3cgbGlicG5nIG1ha2VzIHRoZQorICAgIGRlY2lzaW9uIGFib3V0IHdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgb3B0aW1pemF0aW9ucy4KKyAgUHJvdGVjdCBzeW1ib2wgcHJlZml4aW5nIGFnYWluc3QgQ0MvQ1BQRkxBR1MvQ0ZMQUdTIHVzZWFnZS4KKyAgICBQcmV2aW91cyBpT1MvWGNvZGUgZml4ZXMgZm9yIHRoZSBBUk0gTkVPTiBvcHRpbWl6YXRpb25zIG1vdmVkIHRoZSB0ZXN0CisgICAgb24gX19BUk1fTkVPTl9fIGZyb20gY29uZmlndXJlIHRpbWUgdG8gY29tcGlsZSB0aW1lLiAgVGhpcyBicmVha3Mgc3ltYm9sCisgICAgcHJlZml4aW5nIGJlY2F1c2UgdGhlIGRlZmluaXRpb24gb2YgdGhlIHNwZWNpYWwgcG5nX2luaXRfZmlsdGVyX2Z1bmN0aW9ucworICAgIGNhbGwgd2FzIGhpZGRlbiBhdCBjb25maWd1cmUgdGltZSBpZiB0aGUgcmVsZXZhbnQgY29tcGlsZXIgYXJndW1lbnRzIGFyZQorICAgIHBhc3NlZCBpbiBDRkxBR1MgYXMgb3Bwb3NlZCB0byBDQy4gIFRoaXMgY2hhbmdlIGF0dGVtcHRzIHRvIGF2b2lkIGFsbAorICAgIHRoZSBjb25mdXNpb24gdGhhdCB3b3VsZCByZXN1bHQgYnkgZGVjbGFyaW5nIHRoZSBpbml0IGZ1bmN0aW9uIGV2ZW4gd2hlbgorICAgIGl0IGlzIG5vdCB1c2VkLCBzbyB0aGF0IGl0IHdpbGwgYWx3YXlzIGdldCBwcmVmaXhlZC4KKworVmVyc2lvbiAxLjYuM2JldGEwOCBbSnVuZSAxOCwgMjAxM10KKyAgUmV2aXNlZCBsaWJwbmcuMyBzbyB0aGF0ICJkb2NsaWZ0ZXIiIGNhbiBwcm9jZXNzIGl0LgorCitWZXJzaW9uIDEuNi4zYmV0YTA5IFtKdW5lIDI3LCAyMDEzXQorICBSZXZpc2VkIGV4YW1wbGUuYyB0byBpbGx1c3RyYXRlIHVzZSBvZiBQTkdfREVGQVVMVF9zUkdCIGFuZCBQTkdfR0FNTUFfTUFDXzE4CisgICAgYXMgcGFyYW1ldGVycyBmb3IgcG5nX3NldF9nYW1tYSgpLiAgVGhlc2UgaGF2ZSBiZWVuIGF2YWlsYWJsZSBzaW5jZQorICAgIGxpYnBuZy0xLjUuNC4KKyAgUmVuYW1lZCBjb250cmliL3Rvb2xzL3BuZy1maXgtdG9vLWZhci1iYWNrLmMgdG8gcG5nZml4LmMgYW5kIHJldmlzZWQgaXQKKyAgICB0byBjaGVjayBhbGwgY29tcHJlc3NlZCBjaHVua3Mga25vd24gdG8gbGlicG5nLgorCitWZXJzaW9uIDEuNi4zYmV0YTEwIFtKdWx5IDUsIDIwMTNdCisgIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiB0byBzaG93IGRlZmF1bHQgYmVoYXZpb3Igb2YgYmVuaWduIGVycm9ycyBjb3JyZWN0bHkuCisgIE9ubHkgY29tcGlsZSBBUk0gY29kZSB3aGVuIFBOR19SRUFEX1NVUFBPUlRFRCBpcyBkZWZpbmVkLgorICBGaXhlZCB1bmRlZmluZWQgYmVoYXZpb3IgaW4gY29udHJpYi90b29scy9wbmdmaXguYyBhbmQgYWRkZWQgbmV3IHN0cmlwCisgICAgb3B0aW9uLiBwbmdmaXggcmVsaWVkIG9uIHVuZGVmaW5lZCBiZWhhdmlvciBhbmQgZXZlbiBhIHNpbXBsZSBjaGFuZ2UgZnJvbQorICAgIGdjYyB0byBnKysgY2F1c2VkIGl0IHRvIGZhaWwuICBUaGUgbmV3IHN0cmlwIG9wdGlvbiAndW5zYWZlJyBoYXMgYmVlbgorICAgIGltcGxlbWVudGVkIGFuZCBpcyB0aGUgZGVmYXVsdCBpZiAtLW1heCBpcyBnaXZlbi4gIE9wdGlvbiBuYW1lcyBoYXZlCisgICAgYmVlbiBjbGFyaWZpZWQsIHdpdGggLS1zdHJpcD10cmFuc2Zvcm0gbm93IHN0cmlwcGluZyB0aGUgYktHRCBjaHVuaywKKyAgICB3aGljaCB3YXMgc3RyaXBwZWQgcHJldmlvdXNseSB3aXRoIC0tc3RyaXA9dW51c2VkLgorICBBZGRlZCBhbGwgZG9jdW1lbnRlZCBjaHVuayB0eXBlcyB0byBwbmdwcml2LmgKKyAgVW5pZmllZCBwbmdmaXguYyBzb3VyY2Ugd2l0aCBsaWJwbmcxNy4KKworVmVyc2lvbiAxLjYuM3JjMDEgW0p1bHkgMTEsIDIwMTNdCisgIE5vIGNoYW5nZXMuCisKK1ZlcnNpb24gMS42LjMgW0p1bHkgMTgsIDIwMTNdCisgIFJldmlzZWQgbWFudWFsIGFib3V0IGNoYW5nZXMgaW4gaVRYdCBjaHVuayBoYW5kbGluZyBtYWRlIGluIGxpYnBuZy0xLjYuMC4KKyAgQWRkZWQgIi8qIFNBRkUgKi8iIGNvbW1lbnRzIGluIHBuZ3J1dGlsLmMgYW5kIHBuZ3J0cmFuLmMgd2hlcmUgd2FybmluZ3MKKyAgICBtYXkgYmUgZXJyb25lb3VzbHkgaXNzdWVkIGJ5IGNvZGUtY2hlY2tpbmcgYXBwbGljYXRpb25zLgorCitWZXJzaW9uIDEuNi40YmV0YTAxIFtBdWd1c3QgMjEsIDIwMTNdCisgIEFkZGVkIGluZm9ybWF0aW9uIGFib3V0IHBuZ19zZXRfb3B0aW9ucygpIHRvIHRoZSBtYW51YWwuCisgIERlbGF5IGNhbGxpbmcgcG5nX2luaXRfZmlsdGVyX2Z1bmN0aW9ucygpIHVudGlsIGEgcm93IHdpdGggbm9uemVybyBmaWx0ZXIKKyAgICBpcyBmb3VuZC4KKworVmVyc2lvbiAxLjYuNGJldGEwMiBbQXVndXN0IDMwLCAyMDEzXQorICBGaXhlZCBpbmNvbnNpc3RlbnQgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gb2YgcG5nX2NodW5rX3Vua25vd25faGFuZGxpbmcoKQorICAgIHByb3RvdHlwZSwgZGVmaW5pdGlvbiwgYW5kIHVzYWdlLiAgTWFkZSBpdCBkZXBlbmQgb24KKyAgICBQTkdfSEFORExFX0FTX1VOS05PV05fU1VQUE9SVEVEIGV2ZXJ5d2hlcmUuCisKK1ZlcnNpb24gMS42LjRyYzAxIFtTZXB0ZW1iZXIgNSwgMjAxM10KKyAgTm8gY2hhbmdlcy4KKworVmVyc2lvbiAxLjYuNCBbU2VwdGVtYmVyIDEyLCAyMDEzXQorICBObyBjaGFuZ2VzLgorCitWZXJzaW9uIDEuNi41IFtTZXB0ZW1iZXIgMTQsIDIwMTNdCisgIFJlbW92ZWQgdHdvIHN0cmF5IGxpbmVzIG9mIGNvZGUgZnJvbSBhcm0vYXJtX2luaXQuYy4KKworVmVyc2lvbiAxLjYuNiBbU2VwdGVtYmVyIDE2LCAyMDEzXQorICBSZW1vdmVkIHR3byBzdHJheSBsaW5lcyBvZiBjb2RlIGZyb20gYXJtL2FybV9pbml0LmMsIGFnYWluLgorCitWZXJzaW9uIDEuNi43YmV0YTAxIFtTZXB0ZW1iZXIgMzAsIDIwMTNdCisgIFJldmlzZWQgdW5rbm93biBjaHVuayBjb2RlIHRvIGNvcnJlY3Qgc2V2ZXJhbCBidWdzIGluIHRoZSBOT19TQVZFXy9OT19XUklURQorICAgIGNvbWJpbmF0aW9uCisgIEFsbG93IEhBTkRMRV9BU19VTktOT1dOIHRvIHdvcmsgd2hlbiBvdGhlciBvcHRpb25zIGFyZSBjb25maWd1cmVkIG9mZi4gQWxzbworICAgIGZpeGVkIHRoZSBwbmdtaW5pbSBtYWtlZmlsZXMgdG8gd29yayB3aGVuICQoTUFLRUZMQUdTKSBjb250YWlucyBzdHVmZgorICAgIHdoaWNoIHRlcm1pbmF0ZXMgdGhlIG1ha2Ugb3B0aW9ucyAoYXMgYnkgZGVmYXVsdCBpbiByZWNlbnQgdmVyc2lvbnMgb2YKKyAgICBHZW50b28pLgorICBBdm9pZCB1cC1jYXN0IHdhcm5pbmdzIGluIHBuZ3ZhbGlkLmMuIE9uIEFSTSB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBvZgorICAgIHBuZ19tb2RpZmllciBhcmUgZ3JlYXRlciB0aGFuIHRoYXQgb2YgcG5nX3N0b3JlIGFuZCBhcyBhIGNvbnNlcXVlbmNlCisgICAgY29tcGlsYXRpb24gb2YgcG5ndmFsaWQuYyByZXN1bHRzIGluIGEgd2FybmluZyBhYm91dCBpbmNyZWFzZWQgYWxpZ25tZW50CisgICAgcmVxdWlyZW1lbnRzIGJlY2F1c2Ugb2YgdGhlIGJhcmUgY2FzdCB0byAocG5nX21vZGlmaWVyKikuIFRoZSBjb2RlIGlzIHNhZmUsCisgICAgYmVjYXVzZSB0aGUgcG9pbnRlciBpcyBrbm93biB0byBwb2ludCB0byBhIHN0YWNrIGFsbG9jYXRlZCBwbmdfbW9kaWZpZXIsCisgICAgYnV0IHRoaXMgY2hhbmdlIGF2b2lkcyB0aGUgd2FybmluZy4KKyAgRml4ZWQgZGVmYXVsdCBiZWhhdmlvciBvZiBBUk1fTkVPTl9BUEkuIElmIHRoZSBBUk0gTkVPTiBBUEkgb3B0aW9uIHdhcworICAgIGNvbXBpbGVkIHdpdGhvdXQgdGhlIENIRUNLIG9wdGlvbiBpdCBkZWZhdWx0ZWQgdG8gb24sIG5vdCBvZmYuCisgIENoZWNrIHVzZXIgY2FsbGJhY2sgYmVoYXZpb3IgaW4gcG5ndW5rbm93bi5jLiBQcmV2aW91cyB2ZXJzaW9ucyBjb21waWxlZAorICAgIGlmIFNBVkVfVU5LTk9XTiB3YXMgbm90IGF2YWlsYWJsZSBidXQgZGlkIG5vdGhpbmcgc2luY2UgdGhlIGNhbGxiYWNrCisgICAgd2FzIG5ldmVyIGltcGxlbWVudGVkLgorICBNZXJnZWQgcG5ndW5rbm93bi5jIHdpdGggMS43IHZlcnNpb24gYW5kIGJhY2sgcG9ydGVkIDEuNyBpbXByb3ZlbWVudHMvZml4ZXMKKworVmVyc2lvbiAxLjYuN2JldGEwMiBbT2N0b2JlciAxMiwgMjAxM10KKyAgTWFkZSBjaGFuZ2VzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggYXV0b21ha2UgMS4xNDoKKyAgICAxKSBBZGRlZCB0aGUgJ2NvbXBpbGUnIHByb2dyYW0gdG8gdGhlIGxpc3Qgb2YgcHJvZ3JhbXMgdGhhdCBtdXN0IGJlIGNsZWFuZWQKKyAgICAgICBpbiBhdXRvZ2VuLnNoCisgICAgMikgQWRkZWQgJ3N1YmRpci1vYmplY3RzJyB3aGljaCBjYXVzZXMgLmMgZmlsZXMgaW4gc3ViLWRpcmVjdG9yaWVzIHRvIGJlCisgICAgICAgY29tcGlsZWQgc3VjaCB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIC5vIGZpbGVzIGFyZSBhbHNvIGluIHRoZQorICAgICAgIHN1Yi1kaXJlY3RvcnkuICBUaGlzIGlzIGJlY2F1c2UgYXV0b21ha2UgMS4xNCB3YXJucyB0aGF0IHRoZQorICAgICAgIGN1cnJlbnQgYmVoYXZpb3Igb2YgY29tcGlsaW5nIHRvIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IG1heSBiZSByZW1vdmVkCisgICAgICAgaW4gdGhlIGZ1dHVyZS4KKyAgICAzKSBVcGRhdGVkIGRlcGVuZGVuY2llcyBvbiBwbmdsaWJjb25mLmggdG8gbWF0Y2ggdGhlIG5ldyAubyBsb2NhdGlvbnMgYW5kCisgICAgICAgYWRkZWQgYWxsIHRoZSBmaWxlcyBpbiBjb250cmliL2xpYnRlc3RzIGFuZCBjb250cmliL3Rvb2xzIHRoYXQgZGVwZW5kCisgICAgICAgb24gcG5nbGliY29uZi5oCisgICAgNCkgQWRkZWQgJ0JVSUxEX1NPVVJDRVMgPSBwbmdsaWJjb25mLmgnOyB0aGlzIGlzIHRoZSBhdXRvbWFrZSByZWNvbW1lbmRlZAorICAgICAgIHdheSBvZiBoYW5kbGluZyB0aGUgZGVwZW5kZW5jaWVzIG9mIHNvdXJjZXMgdGhhdCBhcmUgbWFjaGluZSBnZW5lcmF0ZWQ7CisgICAgICAgdW5mb3J0dW5hdGVseSBpdCBvbmx5IHdvcmtzIGlmIHRoZSB1c2VyIGRvZXMgJ21ha2UgYWxsJyBvciAnbWFrZSBjaGVjaycsCisgICAgICAgc28gdGhlIGRlcGVuZGVuY2llcyAoMykgYXJlIHN0aWxsIHJlcXVpcmVkLgorICBDbGVhbmVkIHVwIChjaGFyKikgY2FzdHMgb2YgemxpYiBtZXNzYWdlcy4gVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBJbnRlbCBDCisgICAgY29tcGlsZXIgY29tcGxhaW5zIGFib3V0IGNhc3RpbmcgYSBzdHJpbmcgbGl0ZXJhbCBhcyAoY2hhciopLCBzbyBjb3BpZWQgdGhlCisgICAgdHJlYXRtZW50IG9mIHpfY29uc3QgZnJvbSB0aGUgbGlicmFyeSBjb2RlIGludG8gcG5nZml4LmMKKyAgU2ltcGxpZmllZCBlcnJvciBtZXNzYWdlIGNvZGUgaW4gcG5ndW5rbm93bi4gVGhlIHNpbXBsaWZpY2F0aW9uIGhhcyB0aGUKKyAgICB1c2VmdWwgc2lkZSBlZmZlY3Qgb2YgYXZvaWRpbmcgYSBib2d1cyB3YXJuaW5nIGdlbmVyYXRlZCBieSB0aGUgbGF0ZXN0CisgICAgdmVyc2lvbiBvZiB0aGUgSW50ZWwgQyBjb21waWxlciAoaXQgb2JqZWN0cyB0bworICAgIGNvbmRpdGlvbiA/IHN0cmluZy1saXRlcmFsIDogc3RyaW5nLWxpdGVyYWwpLgorICBNYWtlIGF1dG9nZW4uc2ggd29yayB3aXRoIGF1dG9tYWtlIDEuMTMgYXMgd2VsbCBhcyAxLjE0LiBEbyB0aGlzIGJ5IGFsd2F5cworICAgIHJlbW92aW5nIHRoZSAxLjE0ICdjb21waWxlJyBzY3JpcHQgYnV0IG5ldmVyIGNoZWNraW5nIGZvciBpdC4KKworVmVyc2lvbiAxLjYuN2JldGEwMyBbT2N0b2JlciAxOSwgMjAxM10KKyAgQWRkZWQgQVJNdjggc3VwcG9ydCAoSmFtZXMgWXUgPGphbWVzLnl1IGF0IGxpbmFyby5vcmc+KS4gIEFkZGVkIGZpbGUKKyAgICBhcm0vZmlsdGVyX25lb25faW50cmluc2ljcy5jOyBlbmFibGUgd2l0aCAtbWZwdT1uZW9uLgorICBSZXZpc2VkIHBuZ3ZhbGlkIHRvIGdlbmVyYXRlIHNpemUgaW1hZ2VzIHdpdGggYXMgbWFueSBmaWx0ZXJzIGFzIGl0IGNhbgorICAgIG1hbmFnZSwgbGltaXRlZCBieSB0aGUgbnVtYmVyIG9mIHJvd3MuCisgIENsZWFuZWQgdXAgQVJNIE5FT04gY29tcGlsYXRpb24gaGFuZGxpbmcuIFRoZSB0ZXN0cyBhcmUgbm93IGluIHBuZ3ByaXYuaAorICAgIGFuZCBkZXRlY3QgdGhlIGJyb2tlbiBHQ0MgY29tcGlsZXJzLgorCitWZXJzaW9uIDEuNi43YmV0YTA0IFtPY3RvYmVyIDI2LCAyMDEzXQorICBBbGxvdyBjbGFuZyBkZXJpdmVkIGZyb20gb2xkZXIgR0NDIHZlcnNpb25zIHRvIHVzZSBBUk0gaW50cmluc2ljcy4gVGhpcworICAgIGNhdXNlcyBhbGwgY2xhbmcgYnVpbGRzIHRoYXQgdXNlIC1tZnB1PW5lb24gdG8gdXNlIHRoZSBpbnRyaW5zaWNzIGNvZGUsCisgICAgbm90IHRoZSBhc3NlbWJsZXIgY29kZS4gIFRoaXMgaGFzIG9ubHkgYmVlbiB0ZXN0ZWQgb24gaU9TIDcuIEl0IG1heSBiZQorICAgIG5lY2Vzc2FyeSB0byBleGNsdWRlIHNvbWUgZWFybGllciBjbGFuZyB2ZXJzaW9ucyBidXQgdGhpcyBzZWVtcyB1bmxpa2VseS4KKyAgQ2hhbmdlZCBORU9OIGltcGxlbWVudGF0aW9uIHNlbGVjdGlvbiBtZWNoYW5pc20uIFRoaXMgYWxsb3dzIGFzc2VtYmxlcgorICAgIG9yIGludHJpbnNpY3MgdG8gYmUgdHVybmVkIG9uIGF0IGNvbXBpbGUgdGltZSBkdXJpbmcgdGhlIGJ1aWxkIGJ5IGRlZmluaW5nCisgICAgUE5HX0FSTV9ORU9OX0lNUExFTUVOVEFUSU9OIHRvIHRoZSBjb3JyZWN0IHZhbHVlICgyIG9yIDEpLiAgVGhpcyBtYWNybworICAgIGlzIHVuZGVmaW5lZCBieSBkZWZhdWx0IGFuZCB0aGUgYnVpbGQgdHlwZSBpcyBzZWxlY3RlZCBpbiBwbmdwcml2LmguCisKK1ZlcnNpb24gMS42LjdyYzAxIFtOb3ZlbWJlciAyLCAyMDEzXQorICBObyBjaGFuZ2VzLgorCitWZXJzaW9uIDEuNi43cmMwMiBbTm92ZW1iZXIgNywgMjAxM10KKyAgRml4ZWQgI2luY2x1ZGUgaW4gZmlsdGVyX25lb25faW50cmluc2ljcy5jIGFuZCBjdHlwZSBtYWNyb3MuIFRoZSBjdHlwZSBjaGFyCisgICAgY2hlY2tpbmcgbWFjcm9zIHRha2UgYW4gdW5zaWduZWQgY2hhciBhcmd1bWVudCwgbm90IGEgc2lnbmVkIGNoYXIuCisKK1ZlcnNpb24gMS42LjcgW05vdmVtYmVyIDE0LCAyMDEzXQorICBObyBjaGFuZ2VzLgorCitWZXJzaW9uIDEuNi44YmV0YTAxIFtOb3ZlbWJlciAyNCwgMjAxM10KKyAgTW92ZWQgcHJvdG90eXBlIGZvciBwbmdfaGFuZGxlX3Vua25vd24oKSBpbiBwbmdwcml2Lmggb3V0c2lkZSBvZgorICAgIHRoZSAjaWZkZWYgUE5HX1NFVF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQvI2VuZGlmIGJsb2NrLgorICBBZGRlZCAiLVdhbGwiIHRvIENGTEFHUyBpbiBjb250cmliL3BuZ21pbmltLyovbWFrZWZpbGUKKyAgQ29uZGl0aW9uYWxseSBjb21waWxlIHNvbWUgdW51c2VkIGZ1bmN0aW9ucyByZXBvcnRlZCBieSAtV2FsbCBpbgorICAgIHBuZ21pbmltLgorICBGaXhlZCAnbWluaW1hbCcgYnVpbGRzLiBWYXJpb3VzIG9idmlvdXNseSB1c2VmdWwgbWluaW1hbCBjb25maWd1cmF0aW9ucworICAgIGRvbid0IGJ1aWxkIGJlY2F1c2Ugb2YgbWlzc2luZyBjb250cmliL2xpYnRlc3RzIHRlc3QgcHJvZ3JhbXMgYW5kCisgICAgb3Zlcmx5IGNvbXBsZXggZGVwZW5kZW5jaWVzIGluIHNjcmlwdHMvcG5nbGliY29uZi5kZmEuIFRoaXMgY2hhbmdlCisgICAgYWRkcyBjb250cmliL2NvbmZ0ZXN0LyouZGZhIGZpbGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYXV0b21hdGljIGJ1aWxkCisgICAgc2NyaXB0cyB0byBlbnN1cmUgdGhhdCB0aGVzZSBjb25maWd1cmF0aW9ucyBjb250aW51ZSB0byBidWlsZC4KKyAgRW5hYmxlZCBXUklURV9JTlZFUlQgYW5kIFdSSVRFX1BBQ0sgaW4gY29udHJpYi9wbmdtaW5pbS9lbmNvZGVyLgorICBGaXhlZCBwbmd2YWxpZCAnZmFpbCcgZnVuY3Rpb24gZGVjbGFyYXRpb24gb24gdGhlIEludGVsIEMgQ29tcGlsZXIuCisgICAgVGhpcyByZXZlcnRzIHRvIHRoZSBwcmV2aW91cyAnc3RhdGljJyBpbXBsZW1lbnRhdGlvbiBhbmQgd29ya3Mgcm91bmQKKyAgICB0aGUgJ3VudXNlZCBzdGF0aWMgZnVuY3Rpb24nIHdhcm5pbmcgYnkgdXNpbmcgUE5HX1VOVVNFRCgpLgorCitWZXJzaW9uIDEuNi44YmV0YTAyIFtOb3ZlbWJlciAzMCwgMjAxM10KKyAgUmVtb3ZlZCBvciBtYXJrZWQgUE5HX1VOVVNFRCBzb21lIGhhcm1sZXNzICJkZWFkIGFzc2lnbm1lbnRzIiByZXBvcnRlZAorICAgIGJ5IGNsYW5nIHNjYW4tYnVpbGQuCisgIENoYW5nZWQgdGFicyB0byAzIHNwYWNlcyBpbiBwbmdfZGVidWcgbWFjcm9zIGFuZCBjaGFuZ2VkICciJXMibScKKyAgICB0byAnIiVzIiBtJyB0byBpbXByb3ZlIHBvcnRhYmlsaXR5IGFtb25nIGNvbXBpbGVycy4KKyAgQ2hhbmdlZCBwbmdfZnJlZV9kZWZhdWx0KCkgdG8gZnJlZSgpIGluIHBuZ3Rlc3QuYworCitWZXJzaW9uIDEuNi44cmMwMSBbRGVjZW1iZXIgMTIsIDIwMTNdCisgIFRpZGllZCB1cCBwbmdmaXggaW5pdHMgYW5kIGZpeGVkIHBuZ3Rlc3Qgbm8td3JpdGUgYnVpbGRzLgorCitWZXJzaW9uIDEuNi44cmMwMiBbRGVjZW1iZXIgMTQsIDIwMTNdCisgIEhhbmRsZSB6ZXJvLWxlbmd0aCBQTFRFIGNodW5rIG9yIE5VTEwgcGFsZXR0ZSB3aXRoIHBuZ19lcnJvcigpCisgICAgaW5zdGVhZCBvZiBwbmdfY2h1bmtfcmVwb3J0KCksIHdoaWNoIGJ5IGRlZmF1bHQgaXNzdWVzIGEgd2FybmluZworICAgIHJhdGhlciB0aGFuIGFuIGVycm9yLCBsZWFkaW5nIHRvIGxhdGVyIHJlYWRpbmcgZnJvbSBhIE5VTEwgcG9pbnRlcgorICAgIChwbmdfcHRyLT5wYWxldHRlKSBpbiBwbmdfZG9fZXhwYW5kX3BhbGV0dGUoKS4gVGhpcyBpcyBDVkUtMjAxMy02OTU0CisgICAgYW5kIFZVIzY1MDE0Mi4gIExpYnBuZy0xLjYuMSB0aHJvdWdoIDEuNi43IGFyZSB2dWxuZXJhYmxlLgorICAgIExpYnBuZy0xLjYuMCBhbmQgZWFybGllciBkbyBub3QgaGF2ZSB0aGlzIGJ1Zy4KKworVmVyc2lvbiAxLjYuOCBbRGVjZW1iZXIgMTksIDIwMTNdCisgIE5vIGNoYW5nZXMuCisKK1ZlcnNpb24gMS42LjliZXRhMDEgW0RlY2VtYmVyIDI2LCAyMDEzXQorICBCb29ra2VlcGluZzogTW92ZWQgZnVuY3Rpb25zIGFyb3VuZCAobm8gY2hhbmdlcykuIE1vdmVkIHRyYW5zZm9ybQorICAgIGZ1bmN0aW9uIGRlZmluaXRpb25zIGJlZm9yZSB0aGUgcGxhY2Ugd2hlcmUgdGhleSBhcmUgY2FsbGVkIHNvIHRoYXQKKyAgICB0aGV5IGNhbiBiZSBtYWRlIHN0YXRpYy4gTW92ZSB0aGUgaW50cmFwaXhlbCBmdW5jdGlvbnMgYW5kIHRoZQorICAgIGdyYXlzY2FsZSBwYWxldHRlIGJ1aWxkZXIgb3V0IG9mIHRoZSBwbmc/dHJhbi5jIGZpbGVzLiBUaGUgbGF0dGVyCisgICAgaXNuJ3QgYSB0cmFuc2Zvcm0gZnVuY3Rpb24gYW5kIGlzIG5vIGxvbmdlciB1c2VkIGludGVybmFsbHksIGFuZCB0aGUKKyAgICBmb3JtZXIgTU5HIHNwZWNpZmljIGZ1bmN0aW9ucyBhcmUgYmV0dGVyIHBsYWNlZCBpbiBwbmdyZWFkL3BuZ3dyaXRlLmMKKyAgTWFkZSB0cmFuc2Zvcm0gaW1wbGVtZW50YXRpb24gZnVuY3Rpb25zIHN0YXRpYy4gVGhpcyBtYWtlcyB0aGUgaW50ZXJuYWwKKyAgICBmdW5jdGlvbnMgY2FsbGVkIGJ5IHBuZ19kb197cmVhZHx3cml0ZX1fdHJhbnNmb3JtYXRpb25zIHN0YXRpYy4gT24gYW4KKyAgICB4ODYtNjQgRExMIGJ1aWxkIChHZW50b28gTGludXgpIHRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgdGV4dAorICAgIHNlZ21lbnQgb2YgdGhlIERMTCBieSAxMjA4IGJ5dGVzLCBhYm91dCAwLjYlLiBJdCBhbHNvIHNpbXBsaWZpZXMKKyAgICBtYWludGVuYW5jZSBieSByZW1vdmluZyB0aGUgZGVjbGFyYXRpb25zIGZyb20gcG5ncHJpdi5oIGFuZCBhbGxvd2luZworICAgIGVhc2llciBjaGFuZ2VzIHRvIHRoZSBpbnRlcm5hbCBpbnRlcmZhY2VzLgorICBSZWJ1aWx0IGNvbmZpZ3VyZSBzY3JpcHRzIHdpdGggYXV0b21ha2UtMS4xNC4xIGFuZCBhdXRvY29uZi0yLjY5CisgICAgaW4gdGhlIHRhciBkaXN0cmlidXRpb25zLgorCitWZXJzaW9uIDEuNi45YmV0YTAyIFtKYW51YXJ5IDEsIDIwMTRdCisgIEFkZGVkIGNoZWNrcyBmb3IgbGlicG5nIDEuNSB0byBwbmd2YWxpZC5jLiAgVGhpcyBzdXBwb3J0cyB0aGUgdXNlIG9mCisgICAgdGhpcyB2ZXJzaW9uIG9mIHBuZ3ZhbGlkIGluIGxpYnBuZyAxLjUKKyAgTWVyZ2VkIHdpdGggcG5ndmFsaWQuYyBmcm9tIGxpYnBuZy0xLjcgY2hhbmdlcyB0byBjcmVhdGUgYSBzaW5nbGUKKyAgICBwbmd2YWxpZC5jCisgIFJlbW92ZWQgI2Vycm9yIG1hY3JvIGZyb20gY29udHJpYi90b29scy9wbmdmaXguYyAoVGhvbWFzIEtsYXVzbmVyKS4KKyAgTWVyZ2VkIHBuZ3Jpby5jLCBwbmd0cmFucy5jLCBwbmd3aW8uYywgYW5kIHBuZ2Vycm9yLmMgd2l0aCBsaWJwbmctMS43LjAKKyAgTWVyZ2VkIGxpYnBuZy0xLjcuMCBjaGFuZ2VzIHRvIG1ha2Ugbm8taW50ZXJsYWNlIGNvbmZpZ3VyYXRpb25zIHdvcmsKKyAgICB3aXRoIHRlc3QgcHJvZ3JhbXMuCisgIFJldmlzZWQgcG5ndmFsaWQuYyB0byBzdXBwb3J0IGxpYnBuZyAxLjUsIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgdGhlCisgICAgUE5HX01BWElNVU1fSU5GTEFURV9XSU5ET1cgb3B0aW9uLCBzbyAjZGVmaW5lIGl0IG91dCB3aGVuIGFwcHJvcHJpYXRlIGluCisgICAgcG5ndmFsaWQuYworICBBbGxvdyB1bnZlcnNpb25lZCBsaW5rcyBjcmVhdGVkIG9uIGluc3RhbGwgdG8gYmUgZGlzYWJsZWQgaW4gY29uZmlndXJlLgorICAgIEluIGNvbmZpZ3VyZSBidWlsZHMgJ21ha2UgaW5zdGFsbCcgY2hhbmdlcy9hZGRzIGxpbmtzIGxpa2UgcG5nLmgKKyAgICBhbmQgbGlicG5nLmEgdG8gcG9pbnQgdG8gdGhlIG5ld2x5IGluc3RhbGxlZCwgdmVyc2lvbmVkLCBmaWxlcyAoZS5nLgorICAgIGxpYnBuZzE3L3BuZy5oIGFuZCBsaWJwbmcxNy5hKS4gVGhyZWUgbmV3IGNvbmZpZ3VyZSBvcHRpb25zIGFuZCBzb21lCisgICAgcmVhcnJhbmdlbWVudCBvZiBNYWtlZmlsZS5hbSBhbGxvdyBjcmVhdGlvbiBvZiB0aGVzZSBsaW5rcyB0byBiZSBkaXNhYmxlZC4KKworVmVyc2lvbiAxLjYuOWJldGEwMyBbSmFudWFyeSAxMCwgMjAxNF0KKyAgUmVtb3ZlZCBwb3RlbnRpYWxseSBtaXNsZWFkaW5nIHdhcm5pbmcgZnJvbSBwbmdfY2hlY2tfSUhEUigpLgorCitWZXJzaW9uIDEuNi45YmV0YTA0IFtKYW51YXJ5IDIwLCAyMDE0XQorICBVcGRhdGVkIHNjcmlwdHMvbWFrZWZpbGUuKiB0byB1c2UgQ1BQRkxBR1MgKENvc21pbikuCisgIEFkZGVkIGNsYW5nIGF0dHJpYnV0ZSBzdXBwb3J0IChDb3NtaW4pLgorCitWZXJzaW9uIDEuNi45cmMwMSBbSmFudWFyeSAyOCwgMjAxNF0KKyAgTm8gY2hhbmdlcy4KKworVmVyc2lvbiAxLjYuOXJjMDIgW0phbnVhcnkgMzAsIDIwMTRdCisgIFF1aWV0IGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHdhcm5pbmcgZnJvbSBWQzIwMTMgaW4gcG5nX2dldF9wbmcoKS4KKworVmVyc2lvbiAxLjYuOSBbRmVicnVhcnkgNiwgMjAxNF0KKworVmVyc2lvbiAxLjYuMTBiZXRhMDEgW0ZlYnJ1YXJ5IDksIDIwMTRdCisgIEJhY2twb3J0ZWQgY2hhbmdlcyBmcm9tIGxpYnBuZy0xLjcuMGJldGEzMCBhbmQgYmV0YTMxOgorICBGaXhlZCBhIGxhcmdlIG51bWJlciBvZiBpbnN0YW5jZXMgd2hlcmUgUE5HQ0JBUEkgd2FzIG9taXR0ZWQgZnJvbQorICAgIGZ1bmN0aW9uIGRlZmluaXRpb25zLgorICBBZGRlZCBwbmdpbWFnZSB0ZXN0IHByb2dyYW0gZm9yIHBuZ19yZWFkX3BuZygpIGFuZCBwbmdfd3JpdGVfcG5nKCkKKyAgICB3aXRoIHR3byBuZXcgdGVzdCBzY3JpcHRzLgorICBSZW1vdmVkIGRlcGVuZGVuY2Ugb24gIVBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQgZm9yIGNhbGxpbmcKKyAgICBwbmdfc2V0X3BhY2tpbmcoKSBpbiBwbmdfcmVhZF9wbmcoKS4KKyAgRml4ZWQgY29tYmluYXRpb24gb2YgfmFscGhhIHdpdGggc2hpZnQuIE9uIHJlYWQgaW52ZXJ0IGFscGhhLCBwcm9jZXNzaW5nCisgICAgb2NjdXJyZWQgYWZ0ZXIgc2hpZnQgcHJvY2Vzc2luZywgd2hpY2ggY2F1c2VzIHRoZSBmaW5hbCB2YWx1ZXMgdG8gYmUKKyAgICBvdXRzaWRlIHRoZSByYW5nZSB0aGF0IHNob3VsZCBiZSBwcm9kdWNlZCBieSB0aGUgc2hpZnQuIFJldmVyc2luZyB0aGUKKyAgICBvcmRlciBvbiByZWFkIG1ha2VzIHRoZSB0d28gdHJhbnNmb3JtcyB3b3JrIHRvZ2V0aGVyIGNvcnJlY3RseSBhbmQgbWlycm9ycworICAgIHRoZSBvcmRlciB1c2VkIG9uIHdyaXRlLgorICBEbyBub3QgcmVhZCBpbnZhbGlkIHNCSVQgY2h1bmtzLiBQcmV2aW91c2x5IGxpYnBuZyBvbmx5IGNoZWNrZWQgc0JJVAorICAgIHZhbHVlcyBvbiB3cml0ZSwgc28gYSBtYWxpY2lvdXMgUE5HIHdyaXRlciBjb3VsZCB0aGVyZWZvcmUgY2F1c2UKKyAgICB0aGUgcmVhZCBjb2RlIHRvIHJldHVybiBhbiBpbnZhbGlkIHNCSVQgY2h1bmssIHdoaWNoIG1pZ2h0IGxlYWQgdG8KKyAgICBhcHBsaWNhdGlvbiBlcnJvcnMgb3IgY3Jhc2hlcy4gIFN1Y2ggY2h1bmtzIGFyZSBub3cgc2tpcHBlZCAod2l0aAorICAgIGNodW5rX2Jlbmlnbl9lcnJvcikuCisgIE1ha2UgcG5nX3JlYWRfcG5nKCkgYW5kIHBuZ193cml0ZV9wbmcoKSBwcm90b3R5cGVzIGluIHBuZy5oIGRlcGVuZAorICAgIHVwb24gUE5HX1JFQURfU1VQUE9SVEVEIGFuZCBQTkdfV1JJVEVfU1VQUE9SVEVELgorICBTdXBwb3J0IGJ1aWxkcyB3aXRoIHVuc3VwcG9ydGVkIFBOR19UUkFOU0ZPUk1fKiB2YWx1ZXMuICBBbGwgb2YgdGhlCisgICAgUE5HX1RSQU5TRk9STV8qIHZhbHVlcyBhcmUgYWx3YXlzIGRlZmluZWQgaW4gcG5nLmggYW5kLCBiZWNhdXNlIHRoZXkKKyAgICBhcmUgdXNlZCBmb3IgYm90aCByZWFkIGFuZCB3cml0ZSBpbiBzb21lIGNhc2VzLCBpdCBpcyBub3QgcmVsaWFibGUKKyAgICB0byAjaWYgb3V0IG9uZXMgdGhhdCBhcmUgdG90YWxseSB1bnN1cHBvcnRlZC4gVGhpcyBjaGFuZ2UgYWRkcyBlcnJvcgorICAgIGRldGVjdGlvbiBpbiBwbmdfcmVhZF9pbWFnZSgpIGFuZCBwbmdfd3JpdGVfaW1hZ2UoKSB0byBkbyBhCisgICAgcG5nX2FwcF9lcnJvcigpIGlmIHRoZSBhcHAgcmVxdWVzdHMgc29tZXRoaW5nIHRoYXQgY2Fubm90IGJlIGRvbmUKKyAgICBhbmQgaXQgYWRkcyBjb3JyZXNwb25kaW5nIGNvZGUgdG8gcG5naW1hZ2UuYyB0byBoYW5kbGUgc3VjaCBvcHRpb25zCisgICAgYnkgbm90IGF0dGVtcHRpbmcgdG8gdGVzdCB0aGVtLgorCitWZXJzaW9uIDEuNi4xMGJldGEwMiBbRmVicnVhcnkgMjMsIDIwMTRdCisgIE1vdmVkIHJlZGVmaW5lcyBvZiBwbmdfZXJyb3IoKSwgcG5nX3dhcm5pbmcoKSwgcG5nX2NodW5rX2Vycm9yKCksCisgICAgYW5kIHBuZ19jaHVua193YXJuaW5nKCkgZnJvbSBwbmdwcml2LmggdG8gcG5nLmggdG8gbWFrZSB0aGVtIHZpc2libGUKKyAgICB0byBsaWJwbmctY2FsbGluZyBhcHBsaWNhdGlvbnMuCisgIE1vdmVkIE9TIGRlcGVuZGVudCBjb2RlIGZyb20gYXJtL2FybV9pbml0LmMsIHRvIGFsbG93IHRoZSBpbmNsdWRlZAorICAgIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBUk0gTkVPTiBkaXNjb3ZlcnkgZnVuY3Rpb24gdG8gYmUgc2V0IGF0CisgICAgYnVpbGQtdGltZSBhbmQgcHJvdmlkZSBzYW1wbGUgaW1wbGVtZW50YXRpb25zIGZyb20gdGhlIGN1cnJlbnQgY29kZSBpbiB0aGUKKyAgICBjb250cmliL2FybS1uZW9uIHN1YmRpcmVjdG9yeS4gVGhlIF9fbGludXhfXyBjb2RlIGhhcyBhbHNvIGJlZW4gY2hhbmdlZCB0bworICAgIGNvbXBpbGUgYW5kIGxpbmsgb24gQW5kcm9pZCBieSB1c2luZyAvcHJvYy9jcHVpbmZvLCBhbmQgdGhlIG9sZCBsaW51eCBjb2RlCisgICAgaXMgaW4gY29udHJpYi9hcm0tbmVvbi9saW51eC1hdXh2LmMuICBUaGUgbmV3IGNvZGUgYXZvaWRzIFBPU0lYIGFuZCBMaW51eAorICAgIGRlcGVuZGVuY2llcyBhcGFydCBmcm9tIG9wZW5pbmcgL3Byb2MvY3B1aW5mbyBhbmQgaXMgQzkwIGNvbXBsaWFudC4KKyAgQ2hlY2sgZm9yIGluZm9fcHRyID09IE5VTEwgZWFybHkgaW4gcG5nX3JlYWRfZW5kKCkgc28gd2UgZG9uJ3QgbmVlZCB0bworICAgIHJ1biBhbGwgdGhlIHBuZ19oYW5kbGVfKigpIGFuZCBkZXBlbmQgb24gdGhlbSB0byByZXR1cm4gaWYgaW5mb19wdHIgPT0gTlVMTC4KKyAgICBUaGlzIGltcHJvdmVzIHRoZSBwZXJmb3JtYW5jZSBvZiBwbmdfcmVhZF9lbmQocG5nX3B0ciwgTlVMTCkgYW5kIG1ha2VzCisgICAgaXQgbW9yZSByb2J1c3QgYWdhaW5zdCBmdXR1cmUgcHJvZ3JhbW1pbmcgZXJyb3JzLgorICBDaGVjayBmb3IgX19oYXNfZXh0ZW5zaW9uIGJlZm9yZSB1c2luZyBpdCBpbiBwbmdjb25mLmgsIHRvCisgICAgc3VwcG9ydCBvbGRlciBDbGFuZyB2ZXJzaW9ucyAoSmVyZW15IFNlcXVvaWEpLgorICBUcmVhdCBDUkMgZXJyb3IgaGFuZGxpbmcgd2l0aCBwbmdfc2V0X2NyY19hY3Rpb24oKSwgaW5zdGVhZCBvZiB3aXRoCisgICAgcG5nX3NldF9iZW5pZ25fZXJyb3JzKCksIHdoaWNoIGhhcyBiZWVuIHRoZSBjYXNlIHNpbmNlIGxpYnBuZy0xLjYuMGJldGExOC4KKyAgVXNlIGEgdXNlciB3YXJuaW5nIGhhbmRsZXIgaW4gY29udHJpYi9ncmVnYm9vay9yZWFkcG5nMi5jIGluc3RlYWQgb2YgZGVmYXVsdCwKKyAgICBzbyB3YXJuaW5ncyB3aWxsIGJlIHB1dCBvbiBzdGRlcnIgZXZlbiBpZiBsaWJwbmcgaGFzIENPTlNPTEVfSU8gZGlzYWJsZWQuCisgIEFkZGVkIHBuZ19wdHItPnByb2Nlc3NfbW9kZSA9IFBOR19SRUFEX0lEQVRfTU9ERSBpbiBwbmdfcHVzaF9yZWFkX2NodW5rCisgICAgYWZ0ZXIgcmVjb2duaXppbmcgdGhlIElEQVQgY2h1bmssIHdoaWNoIGF2b2lkcyBhbiBpbmZpbml0ZSBsb29wIHdoaWxlCisgICAgcmVhZGluZyBhIGRhdGFzdHJlYW0gd2hvc2UgZmlyc3QgSURBVCBjaHVuayBpcyBvZiB6ZXJvLWxlbmd0aC4KKyAgICBUaGlzIGZpeGVzIENFUlQgVlUjNjg0NDEyIGFuZCBDVkUtMjAxNC0wMzMzLgorICBEb24ndCByZWNvZ25pemUga25vd24gc1JHQiBwcm9maWxlcyBhcyBzUkdCIGlmIHRoZXkgaGF2ZSBiZWVuIGhhY2tlZCwKKyAgICBidXQgZG9uJ3QgcmVqZWN0IHRoZW0gYW5kIGRvbid0IGlzc3VlIGEgY29weXJpZ2h0IHZpb2xhdGlvbiB3YXJuaW5nLgorCitWZXJzaW9uIDEuNi4xMGJldGEwMyBbRmVicnVhcnkgMjUsIDIwMTRdCisgIE1vdmVkIHNvbWUgZG9jdW1lbnRhdGlvbiBmcm9tIHBuZy5oIHRvIGxpYnBuZy4zIGFuZCBsaWJwbmctbWFudWFsLnR4dAorICBNaW5vciBlZGl0aW5nIG9mIGNvbnRyaWIvYXJtLW5lb24vUkVBRE1FIGFuZCBjb250cmliL2V4YW1wbGVzLyouYworCitWZXJzaW9uIDEuNi4xMHJjMDEgW0ZlYnJ1YXJ5IDI3LCAyMDE0XQorICBGaXhlZCB0eXBvcyBpbiB0aGUgbWFudWFsIGFuZCBpbiBzY3JpcHRzL3BuZ2xpYmNvbmYuZGZhIChDRkxBR1MgLT4gQ1BQRkxBR1MKKyAgICBhbmQgUE5HX1VTUl9DT05GSUcgLT4gUE5HX1VTRVJfQ09ORklHKS4KKworVmVyc2lvbiAxLjYuMTByYzAyIFtGZWJydWFyeSAyOCwgMjAxNF0KKyAgUmVtb3ZlZCB1bnJlYWNoYWJsZSByZXR1cm4gc3RhdGVtZW50IGFmdGVyIHBuZ19jaHVua19lcnJvcigpCisgICAgaW4gcG5ncnV0aWwuYworCitWZXJzaW9uIDEuNi4xMHJjMDMgW01hcmNoIDQsIDIwMTRdCisgIFVuLWRlcHJlY2F0ZWQgcG5nX2RhdGFfZnJlZXIoKS4KKworVmVyc2lvbiAxLjYuMTAgW01hcmNoIDYsIDIwMTRdCisgIE5vIGNoYW5nZXMuCisKK1ZlcnNpb24gMS42LjExYmV0YTAxIFtNYXJjaCAxNywgMjAxNF0KKyAgVXNlICJpZiAodmFsdWUgIT0gMCkiIGluc3RlYWQgb2YgImlmICh2YWx1ZSkiIGNvbnNpc3RlbnRseS4KKyAgQ2hhbmdlZCBabGliU3JjRGlyIGZyb20gMS4yLjUgdG8gMS4yLjggaW4gcHJvamVjdHMvdnN0dWRpby4KKyAgTW92ZWQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBtYW51YWwgdG8gdGhlIElOU1RBTEwgZmlsZS4KKworVmVyc2lvbiAxLjYuMTFiZXRhMDIgW0FwcmlsIDYsIDIwMTRdCisgIFJlbW92ZWQgI2lmLyNlbHNlLyNlbmRpZiBmcm9tIGluc2lkZSB0d28gcG93KCkgY2FsbHMgaW4gcG5ndmFsaWQuYyBiZWNhdXNlCisgICAgdGhleSB3ZXJlIGhhbmRsZWQgaW1wcm9wZXJseSBieSBQb3J0bGFuZCBHcm91cCdzIFBHSS0xNC4xIC0gUEdJLTE0LjMKKyAgICB3aGVuIHVzaW5nIGl0cyAiX19idWlsdGluX3BvdygpIiBmdW5jdGlvbi4KKyAgU2lsZW5jZSAndW51c2VkIHBhcmFtZXRlcicgYnVpbGQgd2FybmluZ3MgKENvc21pbiBUcnV0YSkuCisgICQoQ1ApIGlzIG5vdyB1c2VkIGFsb25nc2lkZSAkKFJNX0YpLiAgQWxzbywgdXNlICdjb3B5JyBpbnN0ZWFkIG9mICdjcCcKKyAgICB3aGVyZSBhcHBsaWNhYmxlLCBhbmQgYXBwbGllZCBvdGhlciBtaW5vciBtYWtlZmlsZSBjaGFuZ2VzIChDb3NtaW4pLgorICBEb24ndCB3YXJuIGFib3V0IGludmFsaWQgZGltZW5zaW9ucyBleGNlZWRpbmcgdXNlciBsaW1pdHMgKENvc21pbikuCisgIEFsbG93IGFuIGVhc3kgcmVwbGFjZW1lbnQgb2YgdGhlIGRlZmF1bHQgcHJlLWJ1aWx0IGNvbmZpZ3VyYXRpb24KKyAgICBoZWFkZXIgd2l0aCBhIGN1c3RvbSBoZWFkZXIsIHZpYSB0aGUgbWFrZSBQTkdMSUJDT05GX0hfUFJFQlVJTFQKKyAgICBtYWNybyAoQ29zbWluKS4KKworVmVyc2lvbiAxLjYuMTFiZXRhMDMgW0FwcmlsIDYsIDIwMTRdCisgIEZpeGVkIGEgdHlwbyBpbiBwbmdydXRpbC5jLCBpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjUuNiwgdGhhdCBpbnRlcmZlcmVzCisgICAgd2l0aCAiYmxvY2t5IiBleHBhbnNpb24gb2Ygc3ViLTgtYml0IGludGVybGFjZWQgUE5HIGZpbGVzIChFcmljIEh1c3MpLgorICBPcHRpb25hbGx5IHVzZSAgX19idWlsdGluX2Jzd2FwMTYoKSBpbiBwbmdfZG9fc3dhcCgpLgorCitWZXJzaW9uIDEuNi4xMWJldGEwNCBbQXByaWwgMTksIDIwMTRdCisgIE1hZGUgcHJvZ3Jlc3NpdmUgcmVhZGluZyBvZiBpbnRlcmxhY2VkIGltYWdlcyBjb25zaXN0ZW50IHdpdGggdGhlCisgICAgYmVoYXZpb3Igb2YgdGhlIHNlcXVlbnRpYWwgcmVhZGVyIGFuZCBjb25zaXN0ZW50IHdpdGggdGhlIG1hbnVhbCwgYnkKKyAgICBtb3Zpbmcgc29tZSBjb2RlIG91dCBvZiB0aGUgUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVEIGJsb2Nrcy4gVGhlCisgICAgcm93X2NhbGxiYWNrIG5vdyByZWNlaXZlcyB0aGUgcHJvcGVyIHBhc3MgbnVtYmVyIGFuZCB1bmV4cGFuZGVkIHJvd3MsIHdoZW4KKyAgICBwbmdfY29tYmluZV9yb3coKSBpc24ndCBidWlsdCBvciB1c2VkLCBhbmQgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcoKQorICAgIGlzIG5vdCBjYWxsZWQuCisgIEFsbG93IFBOR19zUkdCX1BST0ZJTEVfQ0hFQ0tJTkcgPSAoLTEpIHRvIG1lYW4gbm8gc1JHQiBwcm9maWxlIGNoZWNraW5nLgorCitWZXJzaW9uIDEuNi4xMWJldGEwNSBbQXByaWwgMjYsIDIwMTRdCisgIERvIG5vdCByZWplY3QgSUNDIFYyIHByb2ZpbGVzIHRoYXQgbGFjayBwYWRkaW5nIChLYWktVXdlIEJlaHJtYW5uKS4KKyAgUmVsb2NhdGVkIGNsb3NpbmcgYnJhY2tldCBvZiB0aGUgc1JHQiBwcm9maWxlIHRlc3QgbG9vcCB0byBhdm9pZCBnZXR0aW5nCisgICAgIk5vdCByZWNvZ25pemluZyBrbm93biBzUkdCIHByb2ZpbGUgdGhhdCBoYXMgYmVlbiBlZGl0ZWQiIHdhcm5pbmcgZm9yCisgICAgSUNDIFYyIHByb2ZpbGVzIHRoYXQgbGFjayB0aGUgTUQ1IHNpZ25hdHVyZSBpbiB0aGUgcHJvZmlsZSBoZWFkZXIuCisKK1ZlcnNpb24gMS42LjExYmV0YTA2IFtNYXkgMTksIDIwMTRdCisgIEFkZGVkIFBOR19TS0lQX3NSR0JfQ0hFQ0tfUFJPRklMRSBjaG9pY2UgZm9yIHBuZ19zZXRfb3B0aW9uKCkuCisKK1ZlcnNpb24gMS42LjExcmMwMSBbTWF5IDI3LCAyMDE0XQorICBObyBjaGFuZ2VzLgorCitWZXJzaW9uIDEuNi4xMXJjMDIgW0p1bmUgMywgMjAxNF0KKyAgVGVzdCBaTElCX1ZFUk5VTSBpbnN0ZWFkIG9mIFBOR19aTElCX1ZFUk5VTSBpbiBjb250cmliL3Rvb2xzL3BuZ2ZpeC5jCisKK1ZlcnNpb24gMS42LjExIFtKdW5lIDUsIDIwMTRdCisgIE5vIGNoYW5nZXMuCisKK1ZlcnNpb24gMS42LjEycmMwMSBbSnVuZSA2LCAyMDE0XQorICBSZWxvY2F0ZWQgbmV3IGNvZGUgZnJvbSAxLjYuMTFiZXRhMDYgaW4gcG5nLmMgdG8gYSBwb2ludCBhZnRlciB0aGUKKyAgICBkZWNsYXJhdGlvbnMgKE1heCBTdGVwaW4pLgorCitWZXJzaW9uIDEuNi4xMnJjMDIgW0p1bmUgNywgMjAxNF0KKyAgQ2hhbmdlZCBmaWxlIHBlcm1pc3Npb25zIG9mIGNvbnRyaWIvdG9vbHMvaW50Z2FtbWEuc2gsCisgICAgdGVzdC1kcml2ZXIsIGFuZCBjb21waWxlIGZyb20gMDY0NCB0byAwNzU1IChDb3NtaW4pLgorCitWZXJzaW9uIDEuNi4xMnJjMDMgW0p1bmUgOCwgMjAxNF0KKyAgRW5zdXJlICJfX2hhc19hdHRyaWJ1dGUoKSIgbWFjcm8gZXhpc3RzIGJlZm9yZSB0cnlpbmcgdG8gdXNlIGl0IHdpdGgKKyAgICBvbGQgY2xhbmcgY29tcGlsZXJzIChNYWNQb3J0cyBUaWNrZXQgIzQzOTM5KS4KKworVmVyc2lvbiAxLjYuMTIgW0p1bmUgMTIsIDIwMTRdCisgIE5vIGNoYW5nZXMuCisKK1ZlcnNpb24gMS42LjEzYmV0YTAxIFtKdWx5IDQsIDIwMTRdCisgIFF1aWV0ZWQgLVdzaWduLWNvbXBhcmUgYW5kIC1XY2xvYmJlciBjb21waWxlciB3YXJuaW5ncyBpbgorICAgIGNvbnRyaWIvcG5nbWludXMvKi5jCisgIEFkZGVkICIodm9pZCkgcG5nX3B0cjsiIHdoZXJlIG5lZWRlZCBpbiBjb250cmliL2dyZWdib29rIHRvIHF1aWV0CisgICAgY29tcGlsZXIgY29tcGxhaW50cyBhYm91dCB1bnVzZWQgcG9pbnRlcnMuCisgIFNwbGl0IGEgbG9uZyBvdXRwdXQgc3RyaW5nIGluIGNvbnRyaWIvZ3JlZ2Jvb2svcnBuZzIteC5jLgorICBBZGRlZCAiUE5HX1NFVF9PUFRJT04iIHJlcXVpcmVtZW50IGZvciBzUkdCIGNodW5rIHN1cHBvcnQgdG8gcG5nbGliY29uZi5kZmEsCisgICAgTmVlZGVkIGZvciB3cml0ZS1vbmx5IHN1cHBvcnQgKEpvaG4gQm93bGVyKS4KKyAgQ2hhbmdlZCAiaWYgZGVmaW5lZChfX0FSTV9ORU9OX18pIiB0bworICAgICJpZiAoZGVmaW5lZChfX0FSTV9ORU9OX18pIHx8IGRlZmluZWQoX19BUk1fTkVPTikpIiAoSmFtZXMgV3UpLgorICBGaXhlZCBjbGFuZyBuby13YXJuaW5nIGJ1aWxkczogcG5nX2RpZ2l0IHdhcyBkZWZpbmVkIGJ1dCBuZXZlciB1c2VkLgorICAgIAorVmVyc2lvbiAxLjYuMTNiZXRhMDIgW0p1bHkgMjEsIDIwMTRdCisgIEZpeGVkIGFuIGluY29ycmVjdCBzZXBhcmF0b3IgKCIvIiBzaG91bGQgYmUgIlwiKSBpbiBzY3JpcHRzL21ha2VmaWxlLnZjd2luMzIKKyAgICAoYnVnIHJlcG9ydCBmcm9tIFdvbGZnYW5nIFMuIEtlY2hlbCkuICBCdWcgd2FzIGludHJvZHVjZWQgaW4gbGlicG5nLTEuNi4xMS4KKyAgICBBbHNvIGZpeGVkIG1ha2VmaWxlLmJjMzIsIG1ha2VmaWxlLmJvciwgbWFrZWZpbGUubXNjLCBtYWtlZmlsZS5pbnRlbCwgYW5kCisgICAgbWFrZWZpbGUudGMzIHNpbWlsYXJseS4KKworVmVyc2lvbiAxLjYuMTNiZXRhMDMgW0F1Z3VzdCAzLCAyMDE0XQorICBSZW1vdmVkIHNjcmlwdHMvbWFrZWZpbGUuZWxmLiBJdCBoYXMgbm90IHdvcmtlZCBzaW5jZSBsaWJwbmctMS41LjBiZXRhMTQKKyAgICBkdWUgdG8gZWxpbWluYXRpb24gb2YgdGhlIFBOR19GVU5DVElPTl9FWFBPUlQgYW5kIFBOR19EQVRBX0VYUE9SVAorICAgIGRlZmluaXRpb25zIGZyb20gcG5nY29uZi5oLgorICBFbnN1cmUgdGhhdCBDTWFrZUxpc3RzLnR4dCBtYWtlcyB0aGUgdGFyZ2V0ICJsaWIiIGRpcmVjdG9yeSBiZWZvcmUgbWFraW5nCisgICAgc3ltYm9saWMgbGluayBpbnRvIGl0IChTb3VyY2VGb3JnZSBidWcgcmVwb3J0ICMyMjYgYnkgUm9sZiBUaW1tZXJtYW5zKS4KKworVmVyc2lvbiAxLjYuMTNiZXRhMDQgW0F1Z3VzdCA4LCAyMDE0XQorICBBZGRlZCBvcGluaW9uIHRoYXQgdGhlIEVDQ04gKEV4cG9ydCBDb250cm9sIENsYXNzaWZpY2F0aW9uIE51bWJlcikgZm9yCisgICAgbGlicG5nIGlzIEVBUjk5IHRvIHRoZSBSRUFETUUgZmlsZS4KKyAgRWxpbWluYXRlZCB1c2Ugb2YgIiQ8IiBpbiBtYWtlZmlsZSBleHBsaWNpdCBydWxlcywgd2hlbiBjb3B5aW5nCisgICAgJFBOR0xJQkNPTkZfSF9QUkVCVUlMVC4gIFRoaXMgZG9lcyBub3Qgd29yayBvbiBzb21lIHZlcnNpb25zIG9mIG1ha2U7CisgICAgYnVnIGludHJvZHVjZWQgaW4gbGlicG5nIHZlcnNpb24gMS42LjExLgorCitWZXJzaW9uIDEuNi4xM3JjMDEgW0F1Z3VzdCAxNCwgMjAxNF0KKyAgTWFkZSAiY2NvcHRzIiBhZ3JlZSB3aXRoICJDRkxBR1MiIGluIHNjcmlwdHMvbWFrZWZpbGUuaHAqIGFuZCBtYWtlZmlsZS4qc3VudQorCitWZXJzaW9uIDEuNi4xMyBbQXVndXN0IDIxLCAyMDE0XQorICBObyBjaGFuZ2VzLgorCitWZXJzaW9uIDEuNi4xNGJldGEwMSBbU2VwdGVtYmVyIDE0LCAyMDE0XQorICBHdWFyZCB1c2FnZSBvZiBwbmdfcHRyLT5vcHRpb25zIHdpdGggI2lmZGVmIFBOR19TRVRfT1BUSU9OX1NVUFBPUlRFRC4KKyAgRG8gbm90IGJ1aWxkIGNvbnRyaWIvdG9vbHMvcG5nZml4LmMgd2hlbiBQTkdfU0VUSk1QX05PVF9TVVBQT1JURUQsCisgICAgdG8gYWxsb3cgIm1ha2UiIHRvIGNvbXBsZXRlIHdpdGhvdXQgc2V0am1wIHN1cHBvcnQgKGJ1ZyByZXBvcnQgYnkKKyAgICBDbGF1ZGlvIEZvbnRhbmEpCisgIEFkZCAiI2luY2x1ZGUgPHNldGptcC5oPiIgdG8gY29udHJpYi90b29scy9wbmdmaXguYyAoSm9obiBCb3dsZXIpCisKK1ZlcnNpb24gMS42LjE0YmV0YTAyIFtTZXB0ZW1iZXIgMTgsIDIwMTRdCisgIFVzZSBuYW5vc2xlZXAoKSBpbnN0ZWFkIG9mIHVzbGVlcCgpIGluIGNvbnRyaWIvZ3JlZ2Jvb2svcnBuZzIteC5jCisgICAgYmVjYXVzZSB1c2xlZXAoKSBpcyBkZXByZWNhdGVkLgorICBEZWZpbmUgdXNsZWVwKCkgaW4gY29udHJpYi9ncmVnYm9vay9ycG5nMi14LmMgaWYgbm90IGFscmVhZHkgZGVmaW5lZAorICAgIGluIHVuaXN0ZC5oIGFuZCBuYW5vc2xlZXAoKSBpcyBub3QgYXZhaWxhYmxlOyBmaXhlcyBlcnJvciBpbnRyb2R1Y2VkCisgICAgaW4gbGlicG5nLTEuNi4xMy4KKyAgRGlzYWJsZSBmbG9hdGluZyBwb2ludCBleGNlcHRpb24gaGFuZGxpbmcgaW4gcG5ndmFsaWQuYyB3aGVuCisgICAgUE5HX0ZMT0FUSU5HX0FSSVRITUVUSUMgaXMgbm90IHN1cHBvcnRlZCAoYnVnIHJlcG9ydCBieSAiem9vdHVzCisgICAgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0IikuCisKK1ZlcnNpb24gMS42LjE0YmV0YTAzIFtTZXB0ZW1iZXIgMTksIDIwMTRdCisgIERlZmluZSBGRV9ESVZCWVpFUk8sIEZFX0lOVkFMSUQsIGFuZCBGRV9PVkVSRkxPVyBpbiBwbmd2YWxpZC5jIGlmIG5vdAorICAgIGFscmVhZHkgZGVmaW5lZC4gIFJldmVydCBmbG9hdGluZyBwb2ludCBleGNlcHRpb24gaGFuZGxpbmcgaW4gcG5ndmFsaWQuYworICAgIHRvIHZlcnNpb24gMS42LjE0YmV0YTAxIGJlaGF2aW9yLgorCitWZXJzaW9uIDEuNi4xNGJldGEwNCBbU2VwdGVtYmVyIDI3LCAyMDE0XQorICBGaXhlZCBpbmNvcnJlY3QgaGFuZGxpbmcgb2YgdGhlIGlUWHQgY29tcHJlc3Npb24gZmxhZyBpbiBwbmdydXRpbC5jCisgICAgKGJ1ZyByZXBvcnQgYnkgU2h1bnNha3UgSGlyYXRhKS4gIEJ1ZyB3YXMgaW50cm9kdWNlZCBpbiBsaWJwbmctMS42LjAuCisKK1ZlcnNpb24gMS42LjE0YmV0YTA1IFtPY3RvYmVyIDEsIDIwMTRdCisgIEFkZGVkICJvcHRpb24gUkVBRF9pQ0NQIGVuYWJsZXMgUkVBRF9DT01QUkVTU0VEX1RFWFQiIHRvIHBuZ2xpYmNvbmYuZGZhCisKK1ZlcnNpb24gMS42LjE0YmV0YTA2IFtPY3RvYmVyIDUsIDIwMTRdCisgIFJlbW92ZWQgdW51c2VkICJ0ZXh0X2xlbiIgcGFyYW1ldGVyIGZyb20gcHJpdmF0ZSBmdW5jdGlvbiBwbmdfd3JpdGVfelRYdCgpLgorICBDb25kaXRpb25hbGx5IGNvbXBpbGUgc29tZSBjb2RlIGluIHBuZ19kZWZsYXRlX2NsYWltKCksIHdoZW4KKyAgICBQTkdfV0FSTklOR1NfU1VQUE9SVEVEIGFuZCBQTkdfRVJST1JfVEVYVF9TVVBQT1JURUQgYXJlIGRpc2FibGVkLgorICBSZXBsYWNlZCByZXBlYXRlZCBjb2RlIGluIHBuZ3ByZWFkLmMgd2l0aCBQTkdfUFVTSF9TQVZFX0JVRkZFUl9JRl9GVUxMLgorICBBZGRlZCAiY2h1bmsgaVRYdCBlbmFibGVzIFRFWFQiIGFuZCAiY2h1bmsgelRYdCBlbmFibGVzIFRFWFQiCisgICAgdG8gcG5nbGliY29uZi5kZmEuCisgIFJlbW92ZWQgIm9wdGlvbiBSRUFEX0NPTVBSRVNTRURfVEVYVCBlbmFibGVzIFJFQURfVEVYVCIgZnJvbSBwbmdsaWJjb25mLmRmYSwKKyAgICB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIGNvbmZpZ3VyZSBhIGxpYnBuZyB0aGF0IHN1cHBvcnRzIGlDQ1AgYnV0IG5vdCBURVhULgorCitWZXJzaW9uIDEuNi4xNGJldGEwNyBbT2N0b2JlciA3LCAyMDE0XQorICBSZW1vdmVkICJvcHRpb24gV1JJVEVfQ09NUFJFU1NFRF9URVhUIGVuYWJsZXMgV1JJVEVfVEVYVCIgZnJvbSBwbmdsaWJjb25mLmRmYQorICBPbmx5IG1hcmsgdGV4dCBjaHVua3MgYXMgd3JpdHRlbiBhZnRlciBzdWNjZXNzZnVsbHkgd3JpdGluZyB0aGVtLgorCitWZXJzaW9uIDEuNi4xNHJjMDEgW09jdG9iZXIgMTUsIDIwMTRdCisgIEZpeGVkIHNvbWUgdHlwb3MgaW4gY29tbWVudHMuCisKK1ZlcnNpb24gMS42LjE0cmMwMiBbT2N0b2JlciAxNywgMjAxNF0KKyAgQ2hhbmdlZCBwbmdfY29udmVydF90b19yZmNfMTEyMygpIHRvIHBuZ19jb252ZXJ0X3RvX3JmY18xMTIzX2J1ZmZlcigpCisgICAgaW4gdGhlIG1hbnVhbCwgdG8gcmVmbGVjdCB0aGUgY2hhbmdlIG1hZGUgaW4gbGlicG5nLTEuNi4wLgorICBVcGRhdGVkIFJFQURNRSBmaWxlIHRvIGV4cGxhaW4gdGhhdCBkaXJlY3QgYWNjZXNzIHRvIHRoZSBwbmdfc3RydWN0CisgICAgYW5kIGluZm9fc3RydWN0IG1lbWJlcnMgaGFzIG5vdCBiZWVuIHBlcm1pdHRlZCBzaW5jZSBsaWJwbmctMS41LjAuCisKK1ZlcnNpb24gMS42LjE0IFtPY3RvYmVyIDIzLCAyMDE0XQorICBObyBjaGFuZ2VzLgorCitWZXJzaW9uIDEuNi4xNWJldGEwMSBbT2N0b2JlciAyOSwgMjAxNF0KKyAgQ2hhbmdlZCAiaWYgKCF4KSIgdG8gImlmICh4ID09IDApIiBhbmQgImlmICh4KSIgdG8gImlmICh4ICE9IDApIgorICBTaW1wbGlmaWVkIHBuZ19mcmVlX2RhdGEoKS4KKyAgQWRkZWQgbWlzc2luZyAicHRyID0gTlVMTCIgYWZ0ZXIgc29tZSBpbnN0YW5jZXMgb2YgcG5nX2ZyZWUoKS4KKworVmVyc2lvbiAxLjYuMTViZXRhMDIgW05vdmVtYmVyIDEsIDIwMTRdCisgIENoYW5nZWQgcmVtYWluaW5nICJpZiAoIXgpIiB0byAiaWYgKHggPT0gMCkiIGFuZCAiaWYgKHgpIiB0byAiaWYgKHggIT0gMCkiCisKK1ZlcnNpb24gMS42LjE1YmV0YTAzIFtOb3ZlbWJlciAzLCAyMDE0XQorICBBZGRlZCBQTkdfVVNFX0FSTV9ORU9OIGNvbmZpZ3VyYXRpb24gZmxhZyAoTWFyY2luIEp1c3praWV3aWN6KS4KKworVmVyc2lvbiAxLjYuMTViZXRhMDQgW05vdmVtYmVyIDQsIDIwMTRdCisgIFJlbW92ZWQgbmV3IFBOR19VU0VfQVJNX05FT04gY29uZmlndXJhdGlvbiBmbGFnIGFuZCBtYWRlIGEgb25lLWxpbmUKKyAgICByZXZpc2lvbiB0byBjb25maWd1cmUuYWMgdG8gc3VwcG9ydCBBUk0gb24gYWFyY2g2NCBpbnN0ZWFkIChKb2huIEJvd2xlcikuCisKK1ZlcnNpb24gMS42LjE1YmV0YTA1IFtOb3ZlbWJlciA1LCAyMDE0XQorICBVc2UgcG5nX2dldF9saWJwbmdfdmVyKE5VTEwpIGluc3RlYWQgb2YgUE5HX0xJQlBOR19WRVJfU1RSSU5HIGluCisgICAgZXhhbXBsZS5jLCBwbmd0ZXN0LmMsIGFuZCBhcHBsaWNhdGlvbnMgaW4gdGhlIGNvbnRyaWIgZGlyZWN0b3J5LgorICBBdm9pZCBvdXQtb2YtYm91bmRzIG1lbW9yeSBhY2Nlc3MgaW4gcG5nX3VzZXJfdmVyc2lvbl9jaGVjaygpLgorICBTaW1wbGlmaWVkIGFuZCBmdXR1cmUtcHJvb2ZlZCBwbmdfdXNlcl92ZXJzaW9uX2NoZWNrKCkuCisgIEZpeGVkIEdDQyB1bnNpZ25lZCBpbnQtPmZsb2F0IHdhcm5pbmdzLiBWYXJpb3VzIHZlcnNpb25zIG9mIEdDQworICAgIHNlZW0gdG8gZ2VuZXJhdGUgd2FybmluZ3Mgd2hlbiBhbiB1bnNpZ25lZCB2YWx1ZSBpcyBpbXBsaWNpdGx5CisgICAgY29udmVydGVkIHRvIGRvdWJsZS4gVGhpcyBpcyBwcm9iYWJseSBhIEdDQyBidWcgYnV0IHRoaXMgY2hhbmdlCisgICAgYXZvaWRzIHRoZSBpc3N1ZSBieSBleHBsaWNpdGx5IGNvbnZlcnRpbmcgdG8gKGludCkgd2hlcmUgc2FmZS4KKyAgRnJlZSBhbGwgYWxsb2NhdGVkIG1lbW9yeSBpbiBwbmdpbWFnZS4gVGhlIGZpbGUgYnVmZmVyIGNhY2hlIHdhcyBsZWZ0CisgICAgYWxsb2NhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIHByb2dyYW0sIGhhcm1sZXNzIGJ1dCBpdCBjYXVzZXMgbWVtb3J5CisgICAgbGVhayByZXBvcnRzIGZyb20gY2xhbmcuCisgIEZpeGVkIGFycmF5IHNpemUgY2FsY3VsYXRpb25zIHRvIGF2b2lkIHdhcm5pbmdzLiBBdCB2YXJpb3VzIHBvaW50cworICAgIGluIHRoZSBjb2RlIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYW4gYXJyYXkgaXMgY2FsY3VsYXRlZCB1c2luZworICAgIHNpemVvZi4gIFRoaXMgZ2VuZXJhdGVzIGEgY29tcGlsZSB0aW1lIGNvbnN0YW50IG9mIHR5cGUgKHNpemVfdCkgd2hpY2gKKyAgICBpcyB0aGVuIHR5cGljYWxseSBhc3NpZ25lZCB0byBhbiAodW5zaWduZWQgaW50KSBvciAoaW50KS4gU29tZSB2ZXJzaW9ucworICAgIG9mIEdDQyBvbiA2NC1iaXQgc3lzdGVtcyB3YXJuIGFib3V0IHRoZSBhcHBhcmVudCBuYXJyb3dpbmcsIGV2ZW4gdGhvdWdoCisgICAgdGhlIHNhbWUgY29tcGlsZXIgZG9lcyBhcHBhcmVudGx5IGdlbmVyYXRlIHRoZSBjb3JyZWN0LCBpbi1yYW5nZSwKKyAgICBudW1lcmljIGNvbnN0YW50LiAgVGhpcyBhZGRzIGFwcHJvcHJpYXRlLCBzYWZlLCBjYXN0cyB0byBtYWtlIHRoZQorICAgIHdhcm5pbmdzIGdvIGF3YXkuCisKK1ZlcnNpb24gMS42LjE1YmV0YTA2IFtOb3ZlbWJlciA2LCAyMDE0XQorICBSZXZlcnRlZCB1c2UgcG5nX2dldF9saWJwbmdfdmVyKE5VTEwpIGluc3RlYWQgb2YgUE5HX0xJQlBOR19WRVJfU1RSSU5HCisgICAgaW4gdGhlIG1hbnVhbCwgZXhhbXBsZS5jLCBwbmd0ZXN0LmMsIGFuZCBhcHBsaWNhdGlvbnMgaW4gdGhlIGNvbnRyaWIKKyAgICBkaXJlY3RvcnkuICBJdCB3YXMgaW5jb3JyZWN0IGFkdmljZS4KKworVmVyc2lvbiAxLjYuMTViZXRhMDcgW05vdmVtYmVyIDcsIDIwMTRdCisgIFJlbW92ZWQgI2lmZGVmIFBOR18xNkJJVF9TVVBQT1JURUQvI2VuZGlmIGFyb3VuZCBwbmdfcHJvZHVjdDIoKTsgaXQgaXMKKyAgICBuZWVkZWQgYnkgcG5nX3JlY2lwcm9jYWwyKCkuCisgIEFkZGVkICNpZmRlZiBQTkdfMTZCSVRfU1VQUE9SVEVELyNlbmRpZiBhcm91bmQgcG5nX2xvZzE2Yml0KCkgYW5kCisgICAgcG5nX2RvX3N3YXAoKS4KKyAgQ2hhbmdlZCBhbGwgIiNlbmRpZiAvKiBQTkdfRkVBVFVSRV9TVVBQT1JURUQgKi8iIHRvICIjZW5kaWYgLyogRkVBVFVSRSAqLyIKKworVmVyc2lvbiAxLjYuMTViZXRhMDggW05vdmVtYmVyIDgsIDIwMTRdCisgIE1vcmUgaG91c2VjbGVhbmluZyBpbiAqLmgKKworVmVyc2lvbiAxLjYuMTVyYzAxIFtOb3ZlbWJlciAxMywgMjAxNF0KKworVmVyc2lvbiAxLjYuMTVyYzAyIFtOb3ZlbWJlciAxNCwgMjAxNF0KKyAgVGhlIG1hY3JvcyBwYXNzZWQgaW4gdGhlIGNvbW1hbmQgbGluZSB0byBCb3JsYW5kIG1ha2Ugd2VyZSBpZ25vcmVkIGlmCisgICAgc2ltaWxhcmx5LW5hbWVkIG1hY3JvcyB3ZXJlIGFscmVhZHkgZGVmaW5lZCBpbiBtYWtlZmlsZXMuIFRoaXMgYmVoYXZpb3IKKyAgICBpcyBkaWZmZXJlbnQgZnJvbSBQT1NJWCBtYWtlIGFuZCBvdGhlciBtYWtlIHByb2dyYW1zLiAgU3Vycm91bmQgdGhlCisgICAgbWFjcm8gZGVmaW5pdGlvbnMgd2l0aCBpZm5kZWYgZ3VhcmRzIChDb3NtaW4pLgorCitWZXJzaW9uIDEuNi4xNXJjMDMgW05vdmVtYmVyIDE2LCAyMDE0XQorICBBZGRlZCAiLURfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyIgdG8gQ0ZMQUdTIGluIHNjcmlwdHMvbWFrZWZpbGUudmN3aW4zMi4KKyAgUmVtb3ZlZCB0aGUgb2Jzb2xldGUgJEFSQ0ggdmFyaWFibGUgZnJvbSBzY3JpcHRzL21ha2VmaWxlLmRhcndpbi4KKworVmVyc2lvbiAxLjYuMTUgW05vdmVtYmVyIDIwLCAyMDE0XQorICBObyBjaGFuZ2VzLgorCitWZXJzaW9uIDEuNi4xNmJldGEwMSBbRGVjZW1iZXIgMTQsIDIwMTRdCisgIEFkZGVkICIuYWxpZ24gMiIgdG8gYXJtL2ZpbHRlcl9uZW9uLlMgdG8gc3VwcG9ydCBvbGQgR0FTIGFzc2VtYmxlcnMgdGhhdAorICAgIGRvbid0IGRvIGFsaWdubWVudCBjb3JyZWN0bHkuCisgIFJldmlzZWQgTWFrZWZpbGUuYW0gYW5kIHNjcmlwdHMvc3ltYm9scy5kZm4gdG8gd29yayB3aXRoIE1pbkdXL01TWVMKKyAgICAoQm9iIEZyaWVzZW5oYWhuKS4KKworVmVyc2lvbiAxLjYuMTZiZXRhMDIgW0RlY2VtYmVyIDE1LCAyMDE0XQorICBSZXZpc2VkIE1ha2VmaWxlLmFtIGFuZCBzY3JpcHRzLyouZGZuIGFnYWluIHRvIHdvcmsgd2l0aCBNaW5HVy9NU1lTOworICAgIHJlbmFtZWQgc2NyaXB0cy8qLmRmbiB0byBzY3JpcHRzLyouYyAoSm9obiBCb3dsZXIpLgorCitWZXJzaW9uIDEuNi4xNmJldGEwMyBbRGVjZW1iZXIgMjEsIDIwMTRdCisgIFF1aWV0IGEgImNvbXBhcmlzb24gYWx3YXlzIHRydWUiIHdhcm5pbmcgaW4gcG5nc3Rlc3QuYyAoSm9obiBCb3dsZXIpLgorCitWZXJzaW9uIDEuNi4xNnJjMDEgW0RlY2VtYmVyIDIxLCAyMDE0XQorICBSZXN0b3JlZCBhIHRlc3Qgb24gd2lkdGggdGhhdCB3YXMgcmVtb3ZlZCBmcm9tIHBuZy5jIGF0IGxpYnBuZy0xLjYuOQorICAgIChCdWcgcmVwb3J0IGJ5IEFsZXggRXViYW5rcywgQ1ZFLTIwMTUtMDk3MykuCisKK1ZlcnNpb24gMS42LjE2cmMwMiBbRGVjZW1iZXIgMjEsIDIwMTRdCisgIFVuZGlkIHRoZSB1cGRhdGUgdG8gcG5ncnV0aWwuYyBpbiAxLjYuMTZyYzAxLgorCitWZXJzaW9uIDEuNi4xNnJjMDMgW0RlY2VtYmVyIDIxLCAyMDE0XQorICBGaXhlZCBhbiBvdmVyZmxvdyBpbiBwbmdfY29tYmluZV9yb3coKSB3aXRoIHZlcnkgd2lkZSBpbnRlcmxhY2VkIGltYWdlcworICAgIChCdWcgcmVwb3J0IGFuZCBmaXggYnkgSm9obiBCb3dsZXIsIENWRS0yMDE0LTk0OTUpLgorCitWZXJzaW9uIDEuNi4xNiBbRGVjZW1iZXIgMjIsIDIwMTRdCisgIE5vIGNoYW5nZXMuCisKK1ZlcnNpb24gMS42LjE3YmV0YTAxIFtKYW51YXJ5IDI5LCAyMDE1XQorICBSZW1vdmVkIGR1cGxpY2F0ZSBQTkdfU0FGRV9MSU1JVFNfU1VQUE9SVEVEIGhhbmRsaW5nIGZyb20gcG5nY29uZi5oCisgIENvcnJlY3RlZCB0aGUgd2lkdGggbGltaXQgY2FsY3VsYXRpb24gaW4gcG5nX2NoZWNrX0lIRFIoKS4KKyAgUmVtb3ZlZCB1c2VyIGxpbWl0cyBmcm9tIHBuZ2ZpeC4gQWxzbyBwYXNzIE5VTEwgcG9pbnRlcnMgdG8KKyAgICBwbmdfcmVhZF9yb3cgdG8gc2tpcCB0aGUgdW5uZWNlc3Nhcnkgcm93IGRlLWludGVybGFjZSBzdHVmZi4KKyAgQWRkZWQgdGVzdGluZyBvZiBwbmdfc2V0X3BhY2tpbmcoKSB0byBwbmd2YWxpZC5jCisgIFJlZ2VuZXJhdGVkIGNvbmZpZ3VyZSBzY3JpcHRzIGluIHRoZSAqLnRhciBkaXN0cmlidXRpb25zIHdpdGggbGlidG9vbC0yLjQuNAorICBJbXBsZW1lbnQgcHJldmlvdXNseSB1bnRlc3RlZCBjYXNlcyBvZiBsaWJwbmcgdHJhbnNmb3JtcyBpbiBwbmd2YWxpZC5jCisgIEZpeGVkIGJ5dGUgb3JkZXIgaW4gcG5nX2RvX3JlYWRfZmlsbGVyKCkgd2l0aCAxNi1iaXQgaW5wdXQuIFByZXZpb3VzbHkKKyAgICB0aGUgaGlnaCBhbmQgbG93IGJ5dGVzIG9mIHRoZSBmaWxsZXIsIGZyb20gcG5nX3NldF9maWxsZXIoKSBvciBmcm9tCisgICAgcG5nX3NldF9hZGRfYWxwaGEoKSwgd2VyZSByZWFkIGluIHRoZSB3cm9uZyBvcmRlci4KKyAgTWFkZSB0aGUgY2hlY2sgZm9yIG91dC1vZi1yYW5nZSB2YWx1ZXMgaW4gcG5nX3NldF90Uk5TKCkgZGV0ZWN0CisgICAgdmFsdWVzIHRoYXQgYXJlIGV4YWN0bHkgMl5iaXRfZGVwdGgsIGFuZCB3b3JrIG9uIDE2LWJpdCBwbGF0Zm9ybXMuCisgIE1lcmdlZCBzb21lIHBhcnRzIG9mIGxpYnBuZy0xLjYuMTdiZXRhMDEgYW5kIGxpYnBuZy0xLjcuMGJldGE0Ny4KKyAgQWRkZWQgI2lmbmRlZiBfX0NPVkVSSVRZX18gd2hlcmUgbmVlZGVkIGluIHBuZy5jLCBwbmdydXRpbC5jIGFuZAorICAgIHBuZ3NldC5jIHRvIGF2b2lkIHdhcm5pbmdzIGFib3V0IGRlYWQgY29kZS4KKyAgQWRkZWQgIiYgMHhmZiIgdG8gbWFueSBpbnN0YW5jZXMgb2YgZXhwcmVzc2lvbnMgdGhhdCBhcmUgdHlwZWNhc3QKKyAgICB0byAocG5nX2J5dGUpLCB0byBhdm9pZCBDb3Zlcml0eSB3YXJuaW5ncy4KKworVmVyc2lvbiAxLjYuMTdiZXRhMDIgW0ZlYnJ1YXJ5IDcsIDIwMTVdCisgIFdvcmsgYXJvdW5kIG9uZSBtb3JlIENvdmVyaXR5LXNjYW4gZGVhZC1jb2RlIHdhcm5pbmcuCisgIERvIG5vdCBidWlsZCBwbmdfcHJvZHVjdDIoKSB3aGVuIGl0IGlzIHVudXNlZC4KKworVmVyc2lvbiAxLjYuMTdiZXRhMDMgW0ZlYnJ1YXJ5IDE3LCAyMDE1XQorICBEaXNwbGF5IHVzZXIgbGltaXRzIGluIHRoZSBvdXRwdXQgZnJvbSBwbmd0ZXN0LgorICBFbGltaW5hdGVkIHRoZSBQTkdfU0FGRV9MSU1JVFMgbWFjcm8gYW5kIHJlc3RvcmVkIHRoZSAxLW1pbGxpb24tY29sdW1uCisgICAgYW5kIDEtbWlsbGlvbi1yb3cgZGVmYXVsdCBsaW1pdHMgaW4gcG5nbGliY29uZi5kZmEsIHRoYXQgY2FuIGJlIHJlc2V0CisgICAgYnkgdGhlIHVzZXIgYXQgYnVpbGQgdGltZSBvciBydW4gdGltZS4gIFRoaXMgcHJvdmlkZXMgYSBtb3JlIHJvYnVzdAorICAgIGRlZmVuc2UgYWdhaW5zdCBET1MgYW5kIGFzLXlldCB1bmRpc2NvdmVyZWQgb3ZlcmZsb3dzLgorCitWZXJzaW9uIDEuNi4xN2JldGEwNCBbRmVicnVhcnkgMjEsIDIwMTVdCisgIEFkZGVkIFBOR19XUklURV9DVVNUT01JWkVfQ09NUFJFU1NJT05fU1VQUE9SVEVEIG1hY3JvLCBvbiBieSBkZWZhdWx0LgorICBBbGxvdyB1c2VyIHRvIGNhbGwgcG5nX2dldF9JSERSKCkgd2l0aCBOVUxMIGFyZ3VtZW50cyAoUmV1YmVuIEhhd2tpbnMpLgorICBSZWJ1aWx0IGNvbmZpZ3VyZSBzY3JpcHRzIHdpdGggYXV0b21ha2UtMS4xNSBhbmQgbGlidG9vbC0yLjQuNgorCitWZXJzaW9uIDEuNi4xN2JldGEwNSBbRmVicnVhcnkgMjUsIDIwMTVdCisgIFJlc3RvcmVkIGNvbXBpbGluZyBvZiBwbmdfcmVjaXByb2NhbDIgd2l0aCBQTkdfTk9fMTZCSVQuCisKK1ZlcnNpb24gMS42LjE3YmV0YTA2IFtGZWJydWFyeSAyNywgMjAxNV0KKyAgTW92ZWQgcG5nX3NldF9maWx0ZXIoKSBwcm90b3R5cGUgaW50byBhIFBOR19XUklURV9TVVBQT1JURUQgYmxvY2sKKyAgICBvZiBwbmcuaC4KKyAgQXZvaWQgcnVudGltZSBjaGVja3Mgd2hlbiBjb252ZXJ0aW5nIGludGVnZXIgdG8gcG5nX2J5dGUgd2l0aAorICAgIFZpc3VhbCBTdHVkaW8gKFNlcmdleSBLb3NhcmV2c2t5KQorCitWZXJzaW9uIDEuNi4xN3JjMDEgW01hcmNoIDQsIDIwMTVdCisgIE5vIGNoYW5nZXMuCisKK1ZlcnNpb24gMS42LjE3cmMwMiBbTWFyY2ggOSwgMjAxNV0KKyAgUmVtb3ZlZCBzb21lIGNvbW1lbnRzIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZGlkIG5vdCBoYW5kbGUKKyAgICBwcm9wZXJseSBmcm9tIHNjcmlwdHMvcG5nbGliY29uZi5kZmEgYW5kIHBuZ2xpYmNvbmYuaC5wcmVidWlsdC4KKyAgRnJlZSB0aGUgdW5rbm93bl9jaHVua3Mgc3RydWN0dXJlIGV2ZW4gd2hlbiBpdCBjb250YWlucyBubyBkYXRhLgorCitWZXJzaW9uIDEuNi4xN3JjMDMgW01hcmNoIDEyLCAyMDE1XQorICBVcGRhdGVkIENNYWtlTGlzdHMudHh0IHRvIGFkZCBPU1ggZnJhbWV3b3JrLCBjaGFuZ2UgWUVTL05PIHRvIE9OL09GRgorICAgIGZvciBjb25zaXN0ZW5jeSwgYW5kIHJlbW92ZSBzb21lIHVzZWxlc3MgdGVzdHMgKEFsZXhleSBQZXRydWNoaWspLgorCitWZXJzaW9uIDEuNi4xN3JjMDQgW01hcmNoIDE2LCAyMDE1XQorICBSZW1vdmUgcG5nbGliY29uZi5oLCBwbmdsaWJjb25mLmMsIGFuZCBwbmdsaWJjb25mLm91dCBpbnN0ZWFkIG9mCisgICAgcG5nbGliY29uZi4qIGluICJtYWtlIGNsZWFuIiAoQ29zbWluKS4KKyAgRml4IGJ1ZyBpbiBjYWxjdWxhdGlvbiBvZiBtYXhiaXRzLCBpbiBwbmdfd3JpdGVfc0JJVCwgaW50cm9kdWNlZAorICAgIGluIGxpYnBuZy0xLjYuMTdiZXRhMDEgKEpvaG4gQm93bGVyKS4KKworVmVyc2lvbiAxLjYuMTdyYzA1IFtNYXJjaCAyMSwgMjAxNV0KKyAgRGVmaW5lIFBOR19GSUxURVJfKiBhbmQgUE5HX0ZJTFRFUl9WQUxVRV8qIGluIHBuZy5oIGV2ZW4gd2hlbiBXUklURQorICAgIGlzIG5vdCBzdXBwb3J0ZWQgKEpvaG4gQm93bGVyKS4gIFRoaXMgZml4ZXMgYW4gZXJyb3IgaW50cm9kdWNlZCBpbgorICAgIGxpYnBuZy0xLjYuMTdiZXRhMDYuCisgIFJldmVydGVkICImIDB4ZmYiIGFkZGl0aW9ucyBvZiB2ZXJzaW9uIDEuNi4xN2JldGEwMS4gTGlicG5nIHBhc3NlcworICAgIHRoZSBDb3Zlcml0eSBzY2FuIHdpdGhvdXQgdGhlbS4KKworVmVyc2lvbiAxLjYuMTdyYzA2IFtNYXJjaCAyMywgMjAxNV0KKyAgUmVtb3ZlIHBuZ2xpYmNvbmYuZGZuIGFuZCBwbmdsaWJjb25mLnByZSB3aXRoICJtYWtlIGNsZWFuIi4KKyAgUmVmb3JtYXR0ZWQgc29tZSAiJjB4ZmYiIGluc3RhbmNlcyB0byAiJiAweGZmIi4KKyAgRml4ZWQgc2ltcGxpZmllZCA4LWJpdC1saW5lYXIgdG8gc1JHQiBhbHBoYS4gVGhlIGNhbGN1bGF0ZWQgYWxwaGEKKyAgICB2YWx1ZSB3YXMgd3JvbmcuICBJdCdzIG5vdCBjbGVhciBpZiB0aGlzIGFmZmVjdGVkIHRoZSBmaW5hbCBzdG9yZWQKKyAgICB2YWx1ZTsgaW4gdGhlIG9idmlvdXMgY29kZSBwYXRoIHRoZSB1cHBlciBhbmQgbG93ZXIgOC1iaXRzIG9mIHRoZQorICAgIGFscGhhIHZhbHVlIHdlcmUgaWRlbnRpY2FsIGFuZCB0aGUgYWxwaGEgd2FzIHRydW5jYXRlZCB0byA4LWJpdHMKKyAgICByYXRoZXIgdGhhbiBkaXZpZGluZyBieSAyNTcgKEpvaG4gQm93bGVyKS4KKworVmVyc2lvbiAxLjYuMTcgW01hcmNoIDI2LCAyMDE1XQorICBObyBjaGFuZ2VzLgorCitWZXJzaW9uIDEuNi4xOGJldGEwMSBbQXByaWwgMSwgMjAxNV0KKyAgUmVtb3ZlZCBQTkdfU0VUX0NIVU5LX1tDQUNIRXxNQUxMT0NdX0xJTUlUX1NVUFBPUlRFRCBtYWNyb3MuICBUaGV5CisgICAgaGF2ZSBiZWVuIGNvbWJpbmVkIHdpdGggUE5HX1NFVF9VU0VSX0xJTUlUU19TVVBQT1JURUQgKHJlc29sdmVzCisgICAgYnVnIHJlcG9ydCBieSBBbmRyZXcgQ2h1cmNoKS4KKyAgRml4ZWQgcmdiX3RvX2dyYXkgY2hlY2tzIGFuZCBhZGRlZCB0Uk5TIGNoZWNrcyB0byBwbmd2YWxpZC5jLiAgVGhpcworICAgIGZpeGVzIHNvbWUgYXJpdGhtZXRpYyBlcnJvcnMgdGhhdCBjYXVzZWQgc29tZSB0ZXN0cyB0byBmYWlsIG9uCisgICAgc29tZSAzMi1iaXQgcGxhdGZvcm1zIChCdWcgcmVwb3J0cyBieSBQZXRlciBCcmVpdGVubG9obmVyIFtpNjg2XQorICAgIGFuZCBQZXRyIEdhamRvcyBbaTU4Nl0pLgorCitWZXJzaW9uIDEuNi4xOGJldGEwMiBbQXByaWwgMjYsIDIwMTVdCisgIFN1cHByZXNzZWQgc29tZSB3YXJuaW5ncyBmcm9tIHRoZSBCb3JsYW5kIEMrKyA1LjUuMS81LjgyIGNvbXBpbGVyCisgICAgKEJ1ZyByZXBvcnQgYnkgVmlrdG9yIFN6YWthdHMpLgorCitWZXJzaW9uIDEuNi4xOGJldGEwMyBbTWF5IDYsIDIwMTVdCisgIFJlcGxhY2VkICJ1bmV4cGVjdGVkIiB3aXRoIGFuIGludGVnZXIgKDB4YWJhZGNhMTEpIGluIHBuZ3NldC5jCisgICAgd2hlcmUgYSBsb25nIHdhcyBleHBlY3RlZCwgdG8gYXZvaWQgYSBjb21waWxlciB3YXJuaW5nIHdoZW4gUE5HX0RFQlVHID4gMS4KKyAgQWRkZWQgY29udHJpYi9leGFtcGxlcy9zaW1wbGVvdmVyLmMsIHRvIGRlbW9uc3RyYXRlIGhvdyB0byBoYW5kbGUKKyAgICBhbHBoYSBjb21wb3NpdGluZyBvZiBtdWx0aXBsZSBpbWFnZXMsIHVzaW5nIHRoZSAic2ltcGxpZmllZCBBUEkiCisgICAgYW5kIGFuIGV4YW1wbGUgUE5HIGdlbmVyYXRpb24gdG9vbCwgY29udHJpYi9leGFtcGxlcy9nZW5wbmcuYworICAgIChKb2huIEJvd2xlcikuCisKK1ZlcnNpb24gMS42LjE4YmV0YTA0IFtNYXkgMjAsIDIwMTVdCisgIFBOR19SRUxFQVNFX0JVSUxEIHJlcGxhY2VzIHRlc3RzIHdoZXJlIHRoZSBjb2RlIGRlcGVuZGVkIG9uIHRoZSBidWlsZCBiYXNlCisgICAgdHlwZSBhbmQgY2FuIGJlIGRlZmluZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgYWxsb3dpbmcgdGVzdGluZyBpbiBiZXRhCisgICAgYnVpbGRzIChKb2huIEJvd2xlcikuCisgIEF2b2lkIENvdmVyaXR5IGlzc3VlIDgwODU4IChSRVZFUlNFIE5VTEwpIGluIHBuZ3Rlc3QuYyBQTkdfREVCVUcgYnVpbGRzLgorICBBdm9pZCBhIGhhcm1sZXNzIHBvdGVudGlhbCBpbnRlZ2VyIG92ZXJmbG93IGluIHBuZ19YWVpfZnJvbV94eSgpIChCdWcKKyAgICByZXBvcnQgZnJvbSBDaHJpc3RvcGhlciBGZXJyaXMpLgorCitWZXJzaW9uIDEuNi4xOGJldGEwNSBbTWF5IDMxLCAyMDE1XQorICBCYWNrcG9ydCBmaWx0ZXIgc2VsZWN0aW9uIGNvZGUgZnJvbSBsaWJwbmctMS43LjBiZXRhNTEsIHRvIGNvbWJpbmUKKyAgICBzdWJfcm93LCB1cF9yb3csIGF2Z19yb3csIGFuZCBwYWV0aF9yb3cgaW50byB0cnlfcm93IGFuZCB0c3Rfcm93LgorICBDaGFuZ2VkIHBuZ192b2lkY2FzdCgpLCBldGMuLCB0byB2b2lkY2FzdCgpLCBldGMuLCBpbiBjb250cmliL3Rvb2xzL3BuZ2ZpeC5jCisgICAgdG8gYXZvaWQgY29uZnVzaW9uIHdpdGggdGhlIGxpYnBuZyBwcml2YXRlIG1hY3Jvcy4KKyAgRml4ZWQgb2xkIGN1dCZwYXN0ZSBidWcgaW4gdGhlIHdlaWdodGVkIGZpbHRlciBzZWxlY3Rpb24gY29kZSBpbgorICAgIHBuZ3d1dGlsLmMsIGludHJvZHVjZWQgaW4gbGlicG5nLTAuOTUsIE1hcmNoIDE5OTcuCisKK1ZlcnNpb24gMS42LjE4YmV0YTA2IFtKdW5lIDEsIDIwMTVdCisgIFJlbW92ZWQgV1JJVEVfV0VJR0hURURfRklMVEVSRUQgY29kZSwgdG8gc2F2ZSBhIGZldyBrYnl0ZXMgb2YgdGhlCisgICAgY29tcGlsZWQgbGlicmFyeSBzaXplLiBJdCBuZXZlciB3b3JrZWQgcHJvcGVybHkgYW5kIGFzIGZhciBhcyB3ZSBjYW4KKyAgICB0ZWxsLCBubyBvbmUgdXNlcyBpdC4gVGhlIHBuZ19zZXRfZmlsdGVyX2hldXJpc3RpY3MoKSBhbmQKKyAgICBwbmdfc2V0X2ZpbHRlcl9oZXVyaXN0aWNzX2ZpeGVkKCkgQVBJcyBhcmUgcmV0YWluZWQgYnV0IGRlcHJlY2F0ZWQKKyAgICBhbmQgZG8gbm90aGluZy4KKworVmVyc2lvbiAxLjYuMThiZXRhMDcgW0p1bmUgNiwgMjAxNV0KKyAgUmVtb3ZlZCBub24td29ya2luZyBwcm9ncmVzc2l2ZSByZWFkZXIgJ3NraXAnIGZ1bmN0aW9uLiBUaGlzCisgICAgZnVuY3Rpb24gaGFzIGFwcGFyZW50bHkgbmV2ZXIgYmVlbiB1c2VkLiBJdCB3YXMgaW1wbGVtZW50ZWQKKyAgICB0byBzdXBwb3J0IGJhY2stZG9vciBtb2RpZmljYXRpb24gb2YgcG5nX3N0cnVjdCBpbiBsaWJwbmctMS40LngKKyAgICBidXQgKGJlY2F1c2UgaXQgZG9lcyBub3RoaW5nIGFuZCBjYW5ub3QgZG8gYW55dGhpbmcpIHdhcyBhcHBhcmVudGx5CisgICAgbmV2ZXIgdGVzdGVkIChKb2huIEJvd2xlcikuCisgIEZpeGVkIGNleGNlcHQuaCBpbiB3aGljaCBHQ0MgNSBub3cgcmVwb3J0cyB0aGF0IG9uZSBvZiB0aGUgYXV0bworICAgIHZhcmlhYmxlcyBpbiB0aGUgVHJ5IG1hY3JvIG5lZWRzIHRvIGJlIHZvbGF0aWxlIHRvIHByZXZlbnQgdmFsdWUKKyAgICBiZWluZyBsb3N0IG92ZXIgdGhlIHNldGptcCAoSm9obiBCb3dsZXIpLgorICBGaXhlZCBOT19XUklURV9GSUxURVIgYW5kIC1XY29udmVyc2lvbiBidWlsZCBicmVha3MgKEpvaG4gQm93bGVyKS4KKyAgRml4IGcrKyBidWlsZCBicmVha3MgKEpvaG4gQm93bGVyKS4KKyAgUXVpZXRlZCBzb21lIENvdmVyaXR5IGlzc3VlcyBpbiBwbmdmaXguYywgcG5nLWZpeC1pdHh0LmMsIHBuZ3ZhbGlkLmMsCisgICAgcG5nc3Rlc3QuYywgYW5kIHBuZ2ltYWdlLmMuIE1vc3Qgc2VlbSBoYXJtbGVzcywgYnV0IHBuZy1maXgtaXR4dAorICAgIHdvdWxkIG9ubHkgd29yayB3aXRoIGlUWHQgY2h1bmtzIHdpdGggbGVuZ3RoIDI1NSBvciBsZXNzLgorICBBZGRlZCAjaWZkZWYncyB0byBjb250cmliL2V4YW1wbGVzIHByb2dyYW1zIHNvIHBlb3BsZSBkb24ndCB0cnkKKyAgICB0byBjb21waWxlIHRoZW0gd2l0aG91dCB0aGUgbWluaW11bSByZXF1aXJlZCBzdXBwb3J0IGVuYWJsZWQKKyAgICAoc3VnZ2VzdGVkIGJ5IEZsYXZpbyBNZWRlaXJvcykuCisKK1ZlcnNpb24gMS42LjE4YmV0YTA4IFtKdW5lIDMwLCAyMDE1XQorICBFbGltaW5hdGVkIHRoZSBmaW5hbCB0d28gQ292ZXJpdHkgZGVmZWN0cyAoaW5zZWN1cmUgdGVtcG9yYXJ5IGZpbGUKKyAgICBoYW5kbGluZyBpbiBjb250cmliL2xpYnRlc3RzL3BuZ3N0ZXN0LmM7IHBvc3NpYmxlIG92ZXJmbG93IG9mCisgICAgdW5zaWduZWQgY2hhciBpbiBjb250cmliL3Rvb2xzL3BuZy1maXgtaXR4dC5jKS4gVG8gdXNlIHRoZSAic2VjdXJlIgorICAgIGZpbGUgaGFuZGxpbmcsIGRlZmluZSBQTkdfVVNFX01LU1RFTVAsIG90aGVyd2lzZSAidG1wZmlsZSgpIiB3aWxsCisgICAgYmUgdXNlZC4KKyAgUmVtb3ZlZCBzb21lIHVudXNlZCBXRUlHSFRFRF9GSUxURVIgbWFjcm9zIGZyb20gcG5nLmggYW5kIHBuZ3N0cnVjdC5oCisKK1ZlcnNpb24gMS42LjE4YmV0YTA5IFtKdWx5IDUsIDIwMTVdCisgIFJlbW92ZWQgc29tZSB1c2VsZXNzIHR5cGVjYXN0cyBmcm9tIGNvbnRyaWIvdG9vbHMvcG5nLWZpeC1pdHh0LmMKKyAgRml4ZWQgYSBuZXcgc2lnbmVkLXVuc2lnbmVkIGNvbXBhcmlzb24gaW4gcG5ncnRyYW4uYyAoTWF4IFN0ZXBpbikuCisgIFJlcGxhY2VkIGFyYml0cmFyeSB1c2Ugb2YgJ2V4dGVybicgd2l0aCAjZGVmaW5lIFBOR19MSU5LQUdFXyouICBUbworICAgIHByZXNlcnZlIEFQSSBjb21wYXRpYmlsaXR5LCB0aGUgbmV3IGRlZmluZXMgYWxsIGRlZmF1bHQgdG8gImV4dGVybiIKKyAgICAocmVxdWVzdGVkIGJ5IEphbiBOaWp0bWFucykuCisKK1ZlcnNpb24gMS42LjE4cmMwMSBbSnVseSA5LCAyMDE1XQorICBCZWxhdGVkbHkgYWRkZWQgTWFucyBSdWxsZ2FyZCBhbmQgSmFtZXMgWXUgdG8gdGhlIGxpc3Qgb2YgQ29udHJpYnV0aW5nCisgICAgQXV0aG9ycy4KKworVmVyc2lvbiAxLjYuMThyYzAyIFtKdWx5IDEyLCAyMDE1XQorICBSZXN0b3JlZCB1bnVzZWQgRklMVEVSX0hFVVJJU1RJQyBtYWNyb3MgcmVtb3ZlZCBhdCBsaWJwbmctMS42LjE4YmV0YTA4CisgICAgdG8gcG5nLmggdG8gYXZvaWQgY29tcGF0aWJpbGl0eSB3YXJuaW5ncy4KKworVmVyc2lvbiAxLjYuMThyYzAzIFtKdWx5IDE1LCAyMDE1XQorICBNaW5vciBjaGFuZ2VzIHRvIHRoZSBtYW4gcGFnZQorCitWZXJzaW9uIDEuNi4xOCBbSnVseSAyMywgMjAxNV0KKyAgTm8gY2hhbmdlcy4KKworVmVyc2lvbiAxLjYuMTliZXRhMDEgW0p1bHkgMzAsIDIwMTVdCisgIFVwZGF0ZWQgb2Jzb2xldGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNpbXBsaWZpZWQgQVBJIG1hY3JvcyBpbiB0aGUKKyAgICBtYW51YWwgcGFnZXMgKEJ1ZyByZXBvcnQgYnkgQXJjIFJpbGV5KS4KKyAgQXZvaWQgcG90ZW50aWFsbHkgZGVyZWZlcmVuY2luZyBOVUxMIGluZm9fcHRyIGluIHBuZ19pbmZvX2luaXRfMygpLgorICBSZWFycmFuZ2VkIHBuZy5oIHRvIHB1dCB0aGUgbWFqb3Igc2VjdGlvbnMgaW4gdGhlIHNhbWUgb3JkZXIgYXMKKyAgICBpbiBsaWJwbmcxNy4KKyAgRWxpbWluYXRlZCB1bnVzZWQgUE5HX0NPU1RfU0hJRlQsIFBOR19XRUlHSFRfU0hJRlQsIFBOR19DT1NUX0ZBQ1RPUiwgYW5kCisgICAgUE5HX1dFSUdIVF9GQUNUT1IgbWFjcm9zLgorICBTdXBwcmVzc2VkIHNvbWUgd2FybmluZ3MgZnJvbSB0aGUgQm9ybGFuZCBDKysgNS41LjEvNS44MiBjb21waWxlcgorICAgIChCdWcgcmVwb3J0IGJ5IFZpa3RvciBTemFrYXRzKS4gIFNldmVyYWwgd2FybmluZ3MgcmVtYWluIGFuZCBhcmUKKyAgICB1bmF2b2lkYWJsZSwgd2hlcmUgd2UgdGVzdCBmb3Igb3ZlcmZsb3cuCisgIEZpeGVkIHBvdGVudGlhbCBsZWFrIG9mIHBuZ19waXhlbHMgaW4gY29udHJpYi9wbmdtaW51cy9wbm0ycG5nLmMKKyAgRml4ZWQgdW5pbml0aWFsaXplZCB2YXJpYWJsZSBpbiBjb250cmliL2dyZWdib29rL3JwbmcyLXguYworCitWZXJzaW9uIDEuNi4xOWJldGEwMiBbQXVndXN0IDE5LCAyMDE1XQorICBNb3ZlZCBjb25maWcuaC5pbn4gZnJvbSB0aGUgImxpYnBuZ19hdXRvdG9vbHNfZmlsZXMiIGxpc3QgdG8gdGhlCisgICAgImxpYnBuZ19hdXRvdG9vbHNfZXh0cmEiIGxpc3QgaW4gYXV0b2dlbi5zaCBiZWNhdXNlIGl0IHdhcyBjYXVzaW5nIGEKKyAgICBmYWxzZSBwb3NpdGl2ZSBmb3IgbWlzc2luZyBmaWxlcyAoYnVnIHJlcG9ydCBieSBSb2JlcnQgQy4gU2VhY29yZCkuCisgIFJlbW92ZWQgdW5yZWFjaGFibGUgImJyZWFrIiBzdGF0ZW1lbnRzIGluIHBuZy5jLCBwbmdyZWFkLmMsIGFuZCBwbmdydHJhbi5jCisgICAgdG8gc3VwcHJlc3MgY2xhbmcgd2FybmluZ3MgKEJ1ZyByZXBvcnQgYnkgVmlrdG9yIFN6YWthdHMpLgorICBGaXhlZCBzb21lIGJhZCBsaW5rcyBpbiB0aGUgbWFuIHBhZ2UuCisgIENoYW5nZWQgIm4gYml0IiB0byAibi1iaXQiIGluIGNvbW1lbnRzLgorICBBZGRlZCBzaWduZWQvdW5zaWduZWQgMTYtYml0IHNhZmV0eSBuZXQuIFRoaXMgcmVtb3ZlcyB0aGUgZHViaW91cworICAgIDB4ODAwMCBmbGFnIGRlZmluaXRpb25zIG9uIDE2LWJpdCBzeXN0ZW1zLiBUaGV5IGFyZW4ndCBzdXBwb3J0ZWQKKyAgICB5ZXQgdGhlIGRlZnMgKnByb2JhYmx5KiB3b3JrLCBob3dldmVyIGl0IHNlZW1zIG11Y2ggc2FmZXIgdG8gZG8gdGhpcworICAgIGFuZCBiZSBhZHZpc2VkIGlmIGFueW9uZSwgY29udHJhcnkgdG8gYWR2aWNlLCBpcyBidWlsZGluZyBsaWJwbmcgMS42CisgICAgb24gYSAxNi1iaXQgc3lzdGVtLiBJdCBhbHNvIGFkZHMgYmFjayB2YXJpb3VzIHN3aXRjaCBkZWZhdWx0IGNsYXVzZXMKKyAgICBmb3IgR0NDOyBHQ0MgZXJyb3JzIG91dCBpZiB0aGV5IGFyZSBub3QgcHJlc2VudCAod2l0aCBhbiBhcHByb3ByaWF0ZWx5CisgICAgaGlnaCBsZXZlbCBvZiB3YXJuaW5ncykuCisgIFNhZmVseSBjb252ZXJ0IG51bV9ieXRlcyB0byBhIHBuZ19ieXRlIGluIHBuZ19zZXRfc2lnX2J5dGVzKCkgKFJvYmVydAorICAgIFNlYWNvcmQpLgorICBGaXhlZCB0aGUgcmVjZW50bHkgcmVwb3J0ZWQgMSdzIGNvbXBsZW1lbnQgc2VjdXJpdHkgaXNzdWUgYnkgcmVwbGFjaW5nCisgICAgdGhlIHZhbHVlIHRoYXQgaXMgaWxsZWdhbCBpbiB0aGUgUE5HIHNwZWMsIGluIGJvdGggc2lnbmVkIGFuZCB1bnNpZ25lZAorICAgIHZhbHVlcywgd2l0aCAwLiBJbGxlZ2FsIHVuc2lnbmVkIHZhbHVlcyAoYW55dGhpbmcgZ3JlYXRlciB0aGFuIG9yIGVxdWFsCisgICAgdG8gIDB4ODAwMDAwMDApIGNhbiBzdGlsbCBwYXNzIHRocm91Z2gsIGJ1dCBzaW5jZSB0aGVzZSBhcmUgbm90IGlsbGVnYWwKKyAgICBpbiBBTlNJLUMgKHVubGlrZSAweDgwMDAwMDAwIGluIHRoZSBzaWduZWQgY2FzZSkgdGhlIGNoZWNraW5nIHRoYXQKKyAgICBvY2N1cnMgbGF0ZXIgY2FuIGNhdGNoIHRoZW0gKEpvaG4gQm93bGVyKS4KKworVmVyc2lvbiAxLjYuMTliZXRhMDMgW1NlcHRlbWJlciAyNiwgMjAxNV0KKyAgRml4ZWQgcG5nX3NhdmVfaW50XzMyIHdoZW4gaW50IGlzIG5vdCAyJ3MgY29tcGxlbWVudCAoSm9obiBCb3dsZXIpLgorICBVcGRhdGVkIGxpYnBuZzE2IHdpdGggYWxsIHRoZSByZWNlbnQgdGVzdCBjaGFuZ2VzIGZyb20gbGlicG5nMTcsCisgICAgaW5jbHVkaW5nIGNoYW5nZXMgdG8gcG5ndmFsaWQuYyB0byBlbnN1cmUgdGhhdCB0aGUgb3JpZ2luYWwsCisgICAgZGlzdHJpYnV0ZWQsIHZlcnNpb24gb2YgY29udHJpYi92aXN1cG5nL2NleGNlcHQuaCBjYW4gYmUgdXNlZAorICAgIChKb2huIEJvd2xlcikuCisgIHBuZ3ZhbGlkIGNvbnRhaW5zIHRoZSBjb3JyZWN0aW9uIHRvIHRoZSB1c2Ugb2YgU0FWRS9TVE9SRV8KKyAgICBVTktOT1dOX0NIVU5LUzsgYSBidWcgcmV2ZWFsZWQgYnkgY2hhbmdlcyBpbiBsaWJwbmcgMS43LiBNb3JlCisgICAgdGVzdHMgY29udGFpbiB0aGUgLS1zdHJpY3Qgb3B0aW9uIHRvIGRldGVjdCB3YXJuaW5ncyBhbmQgdGhlCisgICAgcG5ndmFsaWQtc3RhbmRhcmQgdGVzdCBoYXMgYmVlbiBjb3JyZWN0ZWQgc28gdGhhdCBpdCBkb2VzIG5vdAorICAgIHR1cm4gb24gcHJvZ3Jlc3NpdmUtcmVhZC4gVGhlcmUgaXMgYSBzZXBhcmF0ZSB0ZXN0IHdoaWNoIGRvZXMKKyAgICB0aGF0LiAoSm9obiBCb3dsZXIpCisgIEFsc28gbWFkZSBzb21lIHNpZ25lZC91bnNpZ25lZCBmaXhlcy4KKyAgTWFrZSBwbmdzdGVzdCBlcnJvciBsaW1pdHMgdmVyc2lvbiBzcGVjaWZpYy4gU3BsaXR0aW5nIHRoZSBtYWNoaW5lCisgICAgZ2VuZXJhdGVkIGVycm9yIHN0cnVjdHMgb3V0IHRvIGEgZmlsZSBhbGxvd3MgdGhlIHZhbHVlcyB0byBiZSB1cGRhdGVkCisgICAgd2l0aG91dCBjaGFuZ2luZyBwbmdzdGVzdC5jIGl0c2VsZi4gU2luY2UgbGlicG5nIDEuNiBhbmQgMS43IGhhdmUKKyAgICBzbGlnaHRseSBkaWZmZXJlbnQgZXJyb3IgbGltaXRzIHRoaXMgc2ltcGxpZmllcyBtYWludGVuYW5jZS4gVGhlCisgICAgbWFrZXBuZ3Muc2ggc2NyaXB0IGhhcyBhbHNvIGJlZW4gdXBkYXRlZCB0byBtb3JlIGFjY3VyYXRlbHkgcmVmbGVjdAorICAgIGN1cnJlbnQgcHJvYmxlbXMgaW4gbGlicG5nIDEuNyAoSm9obiBCb3dsZXIpLgorICBJbmNvcnBvcmF0ZWQgbmV3IHRlc3QgUE5HIGZpbGVzIGludG8gbWFrZSBjaGVjay4gIHRlc3RzL3BuZ3N0ZXN0LSoKKyAgICBhcmUgY2hhbmdlZCBzbyB0aGF0IHRoZSBuZXcgdGVzdCBmaWxlcyBhcmUgZGl2aWRlZCBpbnRvIDggZ3JvdXBzIGJ5CisgICAgZ2FtbWEgYW5kIGFscGhhIGNoYW5uZWwuICBUaGVzZSB0ZXN0cyBoYXZlIGNvbnNpZGVyYWJseSBiZXR0ZXIgY29kZQorICAgIGFuZCBwaXhlbC12YWx1ZSBjb3ZlcmFnZSB0aGFuIGNvbnRyaWIvcG5nc3VpdGU7IGhvd2V2ZXIsY292ZXJhZ2UgaXMKKyAgICBzdGlsbCBpbmNvbXBsZXRlIChKb2huIEJvd2xlcikuCisgIFJlbW92ZWQgdGhlICctLXN0cmljdCcgaW4gMS42IGJlY2F1c2Ugb2YgdGhlIGRvdWJsZS1nYW1tYS1jb3JyZWN0aW9uCisgICAgd2FybmluZywgdXBkYXRlZCBwbmdzdGVzdC1lcnJvcnMuaCBmb3IgdGhlIGVycm9ycyBkZXRlY3RlZCB3aXRoIHRoZQorICAgIG5ldyBjb250cmliL3Rlc3RzcG5ncyBQTkcgdGVzdCBmaWxlcyAoSm9obiBCb3dsZXIpLgorCitWZXJzaW9uIDEuNi4xOWJldGEwNCBbT2N0b2JlciAxNSwgMjAxNV0KKyAgV29ya2VkIGFyb3VuZCByZ2ItdG8tZ3JheSBpc3N1ZXMgaW4gbGlicG5nIDEuNi4gIFRoZSBwcmV2aW91cworICAgIGF0dGVtcHRzIHRvIGlnbm9yZSB0aGUgZXJyb3JzIGluIHRoZSBjb2RlIGFyZW4ndCBxdWl0ZSBlbm91Z2ggdG8KKyAgICBkZWFsIHdpdGggdGhlICdjaGFubmVsIHNlbGVjdGlvbicgZW5jb2RpbmcgYWRkZWQgdG8gbGlicG5nIDEuNzsgYWJvcnQuCisgICAgcG5ndmFsaWQuYyBpcyBjaGFuZ2VkIHRvIGRyb3AgdGhpcyBlbmNvZGluZyBpbiBwcmlvciB2ZXJzaW9ucy4KKyAgRml4ZWQgJ3BvdycgbWFjcm9zIGluIHBuZ3ZhbGlkLmMuIEl0IGlzIGxlZ2FsIGZvciAncG93JyB0byBiZSBhCisgICAgbWFjcm8sIHRoZXJlZm9yZSB0aGUgYXJndW1lbnQgbGlzdCBjYW5ub3QgY29udGFpbiBwcmVwcm9jZXNzaW5nCisgICAgZGlyZWN0aXZlcy4gIE1ha2Ugc3VyZSBwb3cgaXMgYSBmdW5jdGlvbiB3aGVyZSB0aGlzIGhhcHBlbnMuIFRoaXMgaXMKKyAgICBhIG1pbmltYWwgc2FmZSBmaXgsIHRoZSBpc3N1ZSBvbmx5IGFyaXNlcyBpbiBub24tcGVyZm9ybWFuY2UtY3JpdGljYWwKKyAgICBjb2RlIChidWcgcmVwb3J0IGJ5IEN1cnRpcyBMZWFjaCwgZml4IGJ5IEpvaG4gQm93bGVyKS4KKyAgQWRkZWQgc1BMVCBzdXBwb3J0IHRvIHBuZ3Rlc3QuYworCitWZXJzaW9uIDEuNi4xOXJjMDEgW09jdG9iZXIgMjMsIDIwMTVdCisgIE5vIGNoYW5nZXMuCisKK1ZlcnNpb24gMS42LjE5cmMwMiBbT2N0b2JlciAzMSwgMjAxNV0KKyAgUHJldmVudCBzZXR0aW5nIG9yIHdyaXRpbmcgb3Zlci1sZW5ndGggUExURSBjaHVuayAoQ29zbWluIFRydXRhKS4KKyAgU2lsZW50bHkgdHJ1bmNhdGUgb3Zlci1sZW5ndGggUExURSBjaHVuayB3aGlsZSByZWFkaW5nLgorICBMaWJwbmcgaW5jb3JyZWN0bHkgY2FsY3VsYXRlZCB0aGUgb3V0cHV0IHJvd2J5dGVzIHdoZW4gdGhlIGFwcGxpY2F0aW9uCisgICAgZGVjcmVhc2VkIGVpdGhlciB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIG9yIHRoZSBiaXQgZGVwdGggKG9yIGJvdGgpIGluCisgICAgYSB1c2VyIHRyYW5zZm9ybS4gIFRoaXMgd2FzIHNhZmU7IGxpYnBuZyBvdmVyYWxsb2NhdGVkIGJ1ZmZlciBzcGFjZQorICAgKHBvdGVudGlhbGx5IGJ5IHF1aXRlIGEgbG90OyB1cCB0byA0IHRpbWVzIHRoZSBhbW91bnQgcmVxdWlyZWQpIGJ1dCwKKyAgIGZyb20gMS41LjQgb24sIHJlc3VsdGVkIGluIGEgcG5nX2Vycm9yIChKb2huIEJvd2xlcikuCisKK1ZlcnNpb24gMS42LjE5cmMwMyBbTm92ZW1iZXIgMywgMjAxNV0KKyAgRml4ZWQgc29tZSBpbmNvbnNlcXVlbnRpYWwgY3V0LWFuZC1wYXN0ZSB0eXBvcyBpbiBwbmdfc2V0X2NIUk1fWFlaX2ZpeGVkKCkuCisgIENsYXJpZmllZCBDT1BZUklHSFQgaW5mb3JtYXRpb24gdG8gc3RhdGUgZXhwbGljaXRseSB0aGF0IHZlcnNpb25zCisgICAgYXJlIGRlcml2ZWQgZnJvbSBwcmV2aW91cyB2ZXJzaW9ucy4KKyAgUmVtb3ZlZCBtdWNoIG9mIHRoZSBsb25nIGxpc3Qgb2YgcHJldmlvdXMgdmVyc2lvbnMgZnJvbSBwbmcuaCBhbmQKKyAgICBsaWJwbmcuMy4KKworVmVyc2lvbiAxLjYuMTlyYzA0IFtOb3ZlbWJlciA1LCAyMDE1XQorICBGaXhlZCBuZXcgYnVnIHdpdGggQ1JDIGVycm9yIGFmdGVyIHJlYWRpbmcgYW4gb3Zlci1sZW5ndGggcGFsZXR0ZQorICAgIChidWcgcmVwb3J0IGJ5IENvc21pbiBUcnV0YSkgKENWRS0yMDE1LTgxMjYpLgorCitWZXJzaW9uIDEuNi4xOSBbTm92ZW1iZXIgMTIsIDIwMTVdCisgIENsZWFuZWQgdXAgY29kaW5nIHN0eWxlIGluIHBuZ19oYW5kbGVfUExURSgpLgorCitWZXJzaW9uIDEuNi4yMGJldGEwMSBbTm92ZW1iZXIgMjAsIDIwMTVdCisgIEF2b2lkIHBvdGVudGlhbCBwb2ludGVyIG92ZXJmbG93L3VuZGVyZmxvdyBpbiBwbmdfaGFuZGxlX3NQTFQoKSBhbmQKKyAgICBwbmdfaGFuZGxlX3BDQUwoKSAoQnVnIHJlcG9ydCBieSBKb2huIFJlZ2VocikuCisKK1ZlcnNpb24gMS42LjIwYmV0YTAyIFtOb3ZlbWJlciAyMywgMjAxNV0KKyAgRml4ZWQgaW5jb3JyZWN0IGltcGxlbWVudGF0aW9uIG9mIHBuZ19zZXRfUExURSgpIHRoYXQgdXNlcyBwbmdfcHRyCisgICAgbm90IGluZm9fcHRyLCB0aGF0IGxlZnQgcG5nX3NldF9QTFRFKCkgb3BlbiB0byB0aGUgQ1ZFLTIwMTUtODEyNgorICAgIHZ1bG5lcmFiaWxpdHkuCisKK1ZlcnNpb24gMS42LjIwYmV0YTAzIFtOb3ZlbWJlciAyNCwgMjAxNV0KKyAgQmFja3BvcnRlZCB0ZXN0cyBmcm9tIGxpYnBuZy0xLjcuMGJldGE2OS4KKworVmVyc2lvbiAxLjYuMjByYzAxIFtOb3ZlbWJlciAyNiwgMjAxNV0KKyAgRml4ZWQgYW4gZXJyb3IgaW4gaGFuZGxpbmcgb2YgYmFkIHpsaWIgQ01JTkZPIGZpZWxkIGluIHBuZ2ZpeCwgZm91bmQgYnkKKyAgICBBbWVyaWNhbiBGdXp6eSBMb3AsIHJlcG9ydGVkIGJ5IEJyaWFuIENhcnBlbnRlci4gIGluZmxhdGUoKSBkb2Vzbid0CisgICAgaW1tZWRpYXRlbHkgZmF1bHQgYSBiYWQgQ01JTkZPIGZpZWxkOyBpbnN0ZWFkIGEgJ3RvbyBmYXIgYmFjaycgZXJyb3IKKyAgICBoYXBwZW5zIGxhdGVyIChhdCBsZWFzdCBzb21lIHRpbWVzKS4gIHBuZ2ZpeCBmYWlsZWQgdG8gbGltaXQgQ01JTkZPIHRvCisgICAgdGhlIGFsbG93ZWQgdmFsdWVzIGJ1dCB0aGVuIGFzc3VtZWQgdGhhdCB3aW5kb3dfYml0cyB3YXMgaW4gcmFuZ2UsCisgICAgdHJpZ2dlcmluZyBhbiBhc3NlcnQuIFRoZSBidWcgaXMgbW9zdGx5IGhhcm1sZXNzOyB0aGUgUE5HIGZpbGUgY2Fubm90CisgICAgYmUgZml4ZWQuCisKK1ZlcnNpb24gMS42LjIwcmMwMiBbTm92ZW1iZXIgMjksIDIwMTVdCisgIEluIGxpYnBuZyAxLjYgemxpYiBpbml0aWFsaXphdGlvbiB3YXMgY2hhbmdlZCB0byB1c2UgdGhlIHdpbmRvdyBzaXplCisgICAgaW4gdGhlIHpsaWIgc3RyZWFtLCBub3QgYSBmaXhlZCB2YWx1ZS4gVGhpcyBjYXVzZXMgc29tZSBpbnZhbGlkIGltYWdlcywKKyAgICB3aGVyZSBDSU5GTyBpcyB0b28gbGFyZ2UsIHRvIGRpc3BsYXkgJ2NvcnJlY3RseScgaWYgdGhlIHJlc3Qgb2YgdGhlCisgICAgZGF0YSBpcyB2YWxpZC4gIFRoaXMgcHJvdmlkZXMgYSB3b3JrYXJvdW5kIGZvciB6bGliIHZlcnNpb25zIHdoZXJlIHRoZQorICAgIGVycm9yIGFyaXNlcyAob25lcyB0aGF0IHN1cHBvcnQgdGhlIEFQSSBjaGFuZ2UgdG8gdXNlIHRoZSB3aW5kb3cgc2l6ZQorICAgIGluIHRoZSBzdHJlYW0pLgorCitWZXJzaW9uIDEuNi4yMCBbRGVjZW1iZXIgMywgMjAxNV0KKyAgTm8gY2hhbmdlcy4KKworU2VuZCBjb21tZW50cy9jb3JyZWN0aW9ucy9jb21tZW5kYXRpb25zIHRvIHBuZy1tbmctaW1wbGVtZW50IGF0IGxpc3RzLnNmLm5ldAorKHN1YnNjcmlwdGlvbiByZXF1aXJlZDsgdmlzaXQKK2h0dHBzOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL3BuZy1tbmctaW1wbGVtZW50Cit0byBzdWJzY3JpYmUpCitvciB0byBnbGVubnJwIGF0IHVzZXJzLnNvdXJjZWZvcmdlLm5ldAorCitHbGVubiBSLVAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicG5nL0NNYWtlTGlzdHMudHh0IGIvbGlicG5nL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYzQ5YzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwzNzQgQEAKKyMgQ01ha2VMaXN0cy50eHQKKworIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxNSBHbGVubiBSYW5kZXJzLVBlaHJzb24KKworIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisjIGFuZCBsaWNlbnNlIGluIHBuZy5oCisKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjQuNCkKK3NldChDTUFLRV9BTExPV19MT09TRV9MT09QX0NPTlNUUlVDVFMgdHJ1ZSkKKworc2V0KENNQUtFX0NPTkZJR1VSQVRJT05fVFlQRVMgIlJlbGVhc2U7RGVidWc7TWluU2l6ZVJlbDtSZWxXaXRoRGViSW5mbyIpCisKK3Byb2plY3QobGlicG5nIEMpCitlbmFibGVfdGVzdGluZygpCisKK3NldChQTkdMSUJfTUFKT1IgMSkKK3NldChQTkdMSUJfTUlOT1IgNikKK3NldChQTkdMSUJfUkVMRUFTRSAyMCkKK3NldChQTkdMSUJfTkFNRSBsaWJwbmcke1BOR0xJQl9NQUpPUn0ke1BOR0xJQl9NSU5PUn0pCitzZXQoUE5HTElCX1ZFUlNJT04gJHtQTkdMSUJfTUFKT1J9LiR7UE5HTElCX01JTk9SfS4ke1BOR0xJQl9SRUxFQVNFfSkKKworIyBuZWVkZWQgcGFja2FnZXMKK2ZpbmRfcGFja2FnZShaTElCIFJFUVVJUkVEKQoraW5jbHVkZV9kaXJlY3Rvcmllcygke1pMSUJfSU5DTFVERV9ESVJ9KQorCitpZihOT1QgV0lOMzIpCisgIGZpbmRfbGlicmFyeShNX0xJQlJBUlkKKyAgICBOQU1FUyBtCisgICAgUEFUSFMgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIKKyAgKQorICBpZihOT1QgTV9MSUJSQVJZKQorICAgIG1lc3NhZ2UoU1RBVFVTICJtYXRoIGxpYiAnbGlibScgbm90IGZvdW5kOyBmbG9hdGluZyBwb2ludCBzdXBwb3J0IGRpc2FibGVkIikKKyAgZW5kaWYoKQorZWxzZSgpCisgICMgbm90IG5lZWRlZCBvbiB3aW5kb3dzCisgIHNldChNX0xJQlJBUlkgIiIpCitlbmRpZigpCisKKyMgQ09NTUFORCBMSU5FIE9QVElPTlMKK29wdGlvbihQTkdfU0hBUkVEICJCdWlsZCBzaGFyZWQgbGliIiBPTikKK29wdGlvbihQTkdfU1RBVElDICJCdWlsZCBzdGF0aWMgbGliIiBPTikKK29wdGlvbihQTkdfVEVTVFMgICJCdWlsZCBsaWJwbmcgdGVzdHMiIE9OKQorCisjIE1hbnkgbW9yZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgY291bGQgYmUgYWRkZWQgaGVyZQorb3B0aW9uKFBOR19GUkFNRVdPUksgIkJ1aWxkIE9TIFggZnJhbWV3b3JrIiBPRkYpCitvcHRpb24oUE5HX0RFQlVHICAgICAiQnVpbGQgd2l0aCBkZWJ1ZyBvdXRwdXQiIE9GRikKK29wdGlvbihQTkdBUkcgICAgICAgICJEaXNhYmxlIEFOU0ktQyBwcm90b3R5cGVzIiBPRkYpCisKKyMgU0VUIExJQk5BTUUKK3NldChQTkdfTElCX05BTUUgcG5nJHtQTkdMSUJfTUFKT1J9JHtQTkdMSUJfTUlOT1J9KQorCisjIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gZGVidWcgYW5kIHJlbGVhc2UgbGliCitzZXQoQ01BS0VfREVCVUdfUE9TVEZJWCAiZCIpCisKKyMgVXNlIHRoZSBwcmVidWlsdCBwbmdsaWJjb25mLmggZmlsZSBmcm9tIHRoZSBzY3JpcHRzIGZvbGRlcgorIyBUT0RPOiBmaXggdGhpcyBieSBidWlsZGluZyB3aXRoIGF3azsgd2l0aG91dCB0aGlzIG5vIGNtYWtlIGJ1aWxkIGNhbiBiZQorIyBjb25maWd1cmVkIGRpcmVjdGx5ICh0byBkbyBzbyBpbmRpcmVjdGx5IHVzZSB5b3VyIGxvY2FsIGF3ayB0byBidWlsZCBhCisjIHBuZ2xpYmNvbmYuaCBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5LikKK2NvbmZpZ3VyZV9maWxlKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdAorICAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3BuZ2xpYmNvbmYuaCkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQorCisjIE9VUiBTT1VSQ0VTCitzZXQobGlicG5nX3B1YmxpY19oZHJzCisgIHBuZy5oCisgIHBuZ2NvbmYuaAorICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vcG5nbGliY29uZi5oCispCitzZXQobGlicG5nX3NvdXJjZXMKKyAgJHtsaWJwbmdfcHVibGljX2hkcnN9CisgIHBuZ2RlYnVnLmgKKyAgcG5naW5mby5oCisgIHBuZ3ByaXYuaAorICBwbmdzdHJ1Y3QuaAorICBwbmcuYworICBwbmdlcnJvci5jCisgIHBuZ2dldC5jCisgIHBuZ21lbS5jCisgIHBuZ3ByZWFkLmMKKyAgcG5ncmVhZC5jCisgIHBuZ3Jpby5jCisgIHBuZ3J0cmFuLmMKKyAgcG5ncnV0aWwuYworICBwbmdzZXQuYworICBwbmd0cmFucy5jCisgIHBuZ3dpby5jCisgIHBuZ3dyaXRlLmMKKyAgcG5nd3RyYW4uYworICBwbmd3dXRpbC5jCispCitzZXQocG5ndGVzdF9zb3VyY2VzCisgIHBuZ3Rlc3QuYworKQorc2V0KHBuZ3ZhbGlkX3NvdXJjZXMKKyAgY29udHJpYi9saWJ0ZXN0cy9wbmd2YWxpZC5jCispCitzZXQocG5nc3Rlc3Rfc291cmNlcworICBjb250cmliL2xpYnRlc3RzL3BuZ3N0ZXN0LmMKKykKKyMgU09NRSBORUVERUQgREVGSU5JVElPTlMKKworaWYoTVNWQykKKyAgYWRkX2RlZmluaXRpb25zKC1EX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFKQorZW5kaWYoTVNWQykKKworaWYoUE5HX0RFQlVHKQorICBhZGRfZGVmaW5pdGlvbnMoLURQTkdfREVCVUcpCitlbmRpZigpCisKKyMgTk9XIEJVSUxEIE9VUiBUQVJHRVQKK2luY2x1ZGVfZGlyZWN0b3JpZXMoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9ICR7WkxJQl9JTkNMVURFX0RJUn0pCisKK3Vuc2V0KFBOR19MSUJfVEFSR0VUUykKKworaWYoUE5HX1NIQVJFRCkKKyAgYWRkX2xpYnJhcnkoJHtQTkdfTElCX05BTUV9IFNIQVJFRCAke2xpYnBuZ19zb3VyY2VzfSkKKyAgc2V0KFBOR19MSUJfVEFSR0VUUyAke1BOR19MSUJfTkFNRX0pCisgIGlmKE1TVkMpCisgICAgIyBtc3ZjIGRvZXMgbm90IGFwcGVuZCAnbGliJyAtIGRvIGl0IGhlcmUgdG8gaGF2ZSBjb25zaXN0ZW50IG5hbWUKKyAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHtQTkdfTElCX05BTUV9IFBST1BFUlRJRVMgUFJFRklYICJsaWIiKQorICAgIHNldF90YXJnZXRfcHJvcGVydGllcygke1BOR19MSUJfTkFNRX0gUFJPUEVSVElFUyBJTVBPUlRfUFJFRklYICJsaWIiKQorICBlbmRpZigpCisgIHRhcmdldF9saW5rX2xpYnJhcmllcygke1BOR19MSUJfTkFNRX0gJHtaTElCX0xJQlJBUll9ICR7TV9MSUJSQVJZfSkKK2VuZGlmKCkKKworaWYoUE5HX1NUQVRJQykKKyAgIyBkb2VzIG5vdCB3b3JrIHdpdGhvdXQgY2hhbmdpbmcgbmFtZQorICBzZXQoUE5HX0xJQl9OQU1FX1NUQVRJQyAke1BOR19MSUJfTkFNRX1fc3RhdGljKQorICBhZGRfbGlicmFyeSgke1BOR19MSUJfTkFNRV9TVEFUSUN9IFNUQVRJQyAke2xpYnBuZ19zb3VyY2VzfSkKKyAgbGlzdChBUFBFTkQgUE5HX0xJQl9UQVJHRVRTICR7UE5HX0xJQl9OQU1FX1NUQVRJQ30pCisgIGlmKE1TVkMpCisgICAgIyBtc3ZjIGRvZXMgbm90IGFwcGVuZCAnbGliJyAtIGRvIGl0IGhlcmUgdG8gaGF2ZSBjb25zaXN0ZW50IG5hbWUKKyAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHtQTkdfTElCX05BTUVfU1RBVElDfSBQUk9QRVJUSUVTIFBSRUZJWCAibGliIikKKyAgZW5kaWYoKQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHtQTkdfTElCX05BTUVfU1RBVElDfSAke1pMSUJfTElCUkFSWX0gJHtNX0xJQlJBUll9KQorZW5kaWYoKQorCitpZihQTkdfRlJBTUVXT1JLKQorICBzZXQoUE5HX0xJQl9OQU1FX0ZSQU1FV09SSyAke1BOR19MSUJfTkFNRX1fZnJhbWV3b3JrKQorICBhZGRfbGlicmFyeSgke1BOR19MSUJfTkFNRV9GUkFNRVdPUkt9IFNIQVJFRCAke2xpYnBuZ19zb3VyY2VzfSkKKyAgbGlzdChBUFBFTkQgUE5HX0xJQl9UQVJHRVRTICR7UE5HX0xJQl9OQU1FX0ZSQU1FV09SS30pCisgIHNldF90YXJnZXRfcHJvcGVydGllcygke1BOR19MSUJfTkFNRV9GUkFNRVdPUkt9IFBST1BFUlRJRVMKKyAgICBGUkFNRVdPUksgVFJVRQorICAgIEZSQU1FV09SS19WRVJTSU9OICR7UE5HTElCX1ZFUlNJT059CisgICAgTUFDT1NYX0ZSQU1FV09SS19TSE9SVF9WRVJTSU9OX1NUUklORyAke1BOR0xJQl9NQUpPUn0uJHtQTkdMSUJfTUlOT1J9CisgICAgTUFDT1NYX0ZSQU1FV09SS19CVU5ETEVfVkVSU0lPTiAke1BOR0xJQl9WRVJTSU9OfQorICAgIE1BQ09TWF9GUkFNRVdPUktfSURFTlRJRklFUiBvcmcubGlicG5nLmxpYnBuZworICAgIFhDT0RFX0FUVFJJQlVURV9JTlNUQUxMX1BBVEggIkBycGF0aCIKKyAgICBQVUJMSUNfSEVBREVSICIke2xpYnBuZ19wdWJsaWNfaGRyc30iCisgICAgT1VUUFVUX05BTUUgcG5nKQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHtQTkdfTElCX05BTUVfRlJBTUVXT1JLfSAke1pMSUJfTElCUkFSWX0gJHtNX0xJQlJBUll9KQorZW5kaWYoKQorCitpZihOT1QgUE5HX0xJQl9UQVJHRVRTKQorICBtZXNzYWdlKFNFTkRfRVJST1IKKyAgICAiTm8gbGlicmFyeSB2YXJpYW50IHNlbGVjdGVkIHRvIGJ1aWxkLiAiCisgICAgIlBsZWFzZSBlbmFibGUgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczogIgorICAgICIgUE5HX1NUQVRJQywgUE5HX1NIQVJFRCwgUE5HX0ZSQU1FV09SSyIpCitlbmRpZigpCisKK2lmKFBOR19TSEFSRUQgQU5EIFdJTjMyKQorICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHtQTkdfTElCX05BTUV9IFBST1BFUlRJRVMgREVGSU5FX1NZTUJPTCBQTkdfQlVJTERfRExMKQorZW5kaWYoKQorCitpZihQTkdfVEVTVFMgQU5EIFBOR19TSEFSRUQpCisgICMgZG9lcyBub3Qgd29yayB3aXRoIG1zdmMgZHVlIHRvIHBuZ19saWJfdmVyIGlzc3VlCisgIGFkZF9leGVjdXRhYmxlKHBuZ3Rlc3QgJHtwbmd0ZXN0X3NvdXJjZXN9KQorICB0YXJnZXRfbGlua19saWJyYXJpZXMocG5ndGVzdCAke1BOR19MSUJfTkFNRX0pCisgIGFkZF90ZXN0KHBuZ3Rlc3QgLi9wbmd0ZXN0ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9wbmd0ZXN0LnBuZykKKyAgIworICBhZGRfZXhlY3V0YWJsZShwbmd2YWxpZCAke3BuZ3ZhbGlkX3NvdXJjZXN9KQorICB0YXJnZXRfbGlua19saWJyYXJpZXMocG5ndmFsaWQgJHtQTkdfTElCX05BTUV9KQorICBhZGRfdGVzdChwbmd2YWxpZCAuL3BuZ3ZhbGlkKQorICBhZGRfZXhlY3V0YWJsZShwbmdzdGVzdCAke3BuZ3N0ZXN0X3NvdXJjZXN9KQorICB0YXJnZXRfbGlua19saWJyYXJpZXMocG5nc3Rlc3QgJHtQTkdfTElCX05BTUV9KQorICBhZGRfdGVzdChwbmdzdGVzdCAuL3BuZ3N0ZXN0CisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbnRyaWIvcG5nc3VpdGUvYmFzbjBnMDEucG5nCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbnRyaWIvcG5nc3VpdGUvYmFzbjBnMDIucG5nCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbnRyaWIvcG5nc3VpdGUvYmFzbjBnMDQucG5nCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbnRyaWIvcG5nc3VpdGUvYmFzbjBnMDgucG5nCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbnRyaWIvcG5nc3VpdGUvYmFzbjBnMTYucG5nCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbnRyaWIvcG5nc3VpdGUvYmFzbjJjMDgucG5nCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbnRyaWIvcG5nc3VpdGUvYmFzbjJjMTYucG5nCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbnRyaWIvcG5nc3VpdGUvYmFzbjNwMDEucG5nCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbnRyaWIvcG5nc3VpdGUvYmFzbjNwMDIucG5nCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbnRyaWIvcG5nc3VpdGUvYmFzbjNwMDQucG5nCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbnRyaWIvcG5nc3VpdGUvYmFzbjNwMDgucG5nCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbnRyaWIvcG5nc3VpdGUvYmFzbjRhMDgucG5nCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbnRyaWIvcG5nc3VpdGUvYmFzbjRhMTYucG5nCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbnRyaWIvcG5nc3VpdGUvYmFzbjZhMDgucG5nCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbnRyaWIvcG5nc3VpdGUvYmFzbjZhMTYucG5nCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4wZzAxLnBuZworICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jb250cmliL3BuZ3N1aXRlL2Z0YmJuMGcwMi5wbmcKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY29udHJpYi9wbmdzdWl0ZS9mdGJibjBnMDQucG5nCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4yYzE2LnBuZworICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jb250cmliL3BuZ3N1aXRlL2Z0YmJuM3AwOC5wbmcKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY29udHJpYi9wbmdzdWl0ZS9mdGJnbjJjMTYucG5nCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbnRyaWIvcG5nc3VpdGUvZnRiZ24zcDA4LnBuZworICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jb250cmliL3BuZ3N1aXRlL2Z0YnJuMmMwOC5wbmcKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY29udHJpYi9wbmdzdWl0ZS9mdGJ3bjBnMTYucG5nCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbnRyaWIvcG5nc3VpdGUvZnRid24zcDA4LnBuZworICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jb250cmliL3BuZ3N1aXRlL2Z0YnluM3AwOC5wbmcKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY29udHJpYi9wbmdzdWl0ZS9mdHAwbjBnMDgucG5nCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbnRyaWIvcG5nc3VpdGUvZnRwMG4yYzA4LnBuZworICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jb250cmliL3BuZ3N1aXRlL2Z0cDBuM3AwOC5wbmcKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY29udHJpYi9wbmdzdWl0ZS9mdHAxbjNwMDgucG5nCisgICkKK2VuZGlmKCkKKworIyBFbnN1cmUgdGhlIENNQUtFX0xJQlJBUllfT1VUUFVUX0RJUkVDVE9SWSBpcyBzZXQKK0lGKE5PVCBDTUFLRV9MSUJSQVJZX09VVFBVVF9ESVJFQ1RPUlkpCisgIFNFVChDTUFLRV9MSUJSQVJZX09VVFBVVF9ESVJFQ1RPUlkgImxpYiIpCitFTkRJRihOT1QgQ01BS0VfTElCUkFSWV9PVVRQVVRfRElSRUNUT1JZKQorCisjIFNldCBhIHZhcmlhYmxlIHdpdGggQ01ha2UgY29kZSB3aGljaDoKKyMgQ3JlYXRlcyBhIHN5bWxpbmsgZnJvbSBzcmMgdG8gZGVzdCAoaWYgcG9zc2libGUpIG9yIGFsdGVybmF0aXZlbHkKKyMgY29waWVzIGlmIGRpZmZlcmVudC4KK21hY3JvKENSRUFURV9TWU1MSU5LIFNSQ19GSUxFIERFU1RfRklMRSkKKyAgRklMRShSRU1PVkUgJHtDTUFLRV9MSUJSQVJZX09VVFBVVF9ESVJFQ1RPUll9LyR7REVTVF9GSUxFfSkKKyAgaWYoV0lOMzIgQU5EIE5PVCBDWUdXSU4gQU5EIE5PVCBNU1lTKQorICAgIEFERF9DVVNUT01fQ09NTUFORCgKKyAgICAgICAgT1VUUFVUICR7Q01BS0VfTElCUkFSWV9PVVRQVVRfRElSRUNUT1JZfS8ke0RFU1RfRklMRX0gICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtERVNUX0ZJTEV9CisgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5X2lmX2RpZmZlcmVudCAgIiR7U1JDX0ZJTEV9IiAke0NNQUtFX0xJQlJBUllfT1VUUFVUX0RJUkVDVE9SWX0vJHtERVNUX0ZJTEV9CisgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5X2lmX2RpZmZlcmVudCAgIiR7U1JDX0ZJTEV9IiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtERVNUX0ZJTEV9CisgICAgICAgIERFUEVORFMgJHtQTkdfTElCX1RBUkdFVFN9CisgICAgICAgICkKKyAgICBBRERfQ1VTVE9NX1RBUkdFVCgke0RFU1RfRklMRX1fQ09QWSBBTEwgREVQRU5EUyAke0NNQUtFX0xJQlJBUllfT1VUUFVUX0RJUkVDVE9SWX0vJHtERVNUX0ZJTEV9KQorICBlbHNlKFdJTjMyIEFORCBOT1QgQ1lHV0lOIEFORCBOT1QgTVNZUykKKyAgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KExJTktfVEFSR0VUICIke1NSQ19GSUxFfSIgTkFNRSkKKyAgICBleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIG1ha2VfZGlyZWN0b3J5ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8ke0NNQUtFX0xJQlJBUllfT1VUUFVUX0RJUkVDVE9SWX0pCisgICAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjcmVhdGVfc3ltbGluayAiJHtMSU5LX1RBUkdFVH0iICR7Q01BS0VfTElCUkFSWV9PVVRQVVRfRElSRUNUT1JZfS8ke0RFU1RfRklMRX0gV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQorICAgIGV4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY3JlYXRlX3N5bWxpbmsgIiR7TElOS19UQVJHRVR9IiAke0RFU1RfRklMRX0gV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQorICBlbmRpZihXSU4zMiBBTkQgTk9UIENZR1dJTiBBTkQgTk9UIE1TWVMpCitlbmRtYWNybygpCisKKyMgbGlicG5nIGlzIGEgbGlicmFyeSBzbyBkZWZhdWx0IHRvICdsaWInCitpZihOT1QgREVGSU5FRCBDTUFLRV9JTlNUQUxMX0xJQkRJUikKKyAgc2V0KENNQUtFX0lOU1RBTExfTElCRElSIGxpYikKK2VuZGlmKE5PVCBERUZJTkVEIENNQUtFX0lOU1RBTExfTElCRElSKQorCisjIENSRUFURSBQS0dDT05GSUcgRklMRVMKKyMgd2UgdXNlIHRoZSBzYW1lIGZpbGVzIGxpa2UgLi9jb25maWd1cmUsIHNvIHdlIGhhdmUgdG8gc2V0IGl0cyB2YXJzCisjIE9ubHkgZG8gdGhpcyBvbiBXaW5kb3dzIGZvciBDeWd3aW4gLSB0aGUgZmlsZXMgZG9uJ3QgbWFrZSBtdWNoIHNlbnNlIG91dHNpZGUKKyMgYSBVTklYIGxvb2sgYWxpa2UKK2lmKE5PVCBXSU4zMiBPUiBDWUdXSU4gT1IgTUlOR1cpCisgIHNldChwcmVmaXggICAgICAke0NNQUtFX0lOU1RBTExfUFJFRklYfSkKKyAgc2V0KGV4ZWNfcHJlZml4ICR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9KQorICBzZXQobGliZGlyICAgICAgJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vJHtDTUFLRV9JTlNUQUxMX0xJQkRJUn0pCisgIHNldChpbmNsdWRlZGlyICAke0NNQUtFX0lOU1RBTExfUFJFRklYfS9pbmNsdWRlKQorICBzZXQoTElCUyAgICAgICAgIi1seiAtbG0iKQorICBjb25maWd1cmVfZmlsZSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbGlicG5nLnBjLmluCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7UE5HTElCX05BTUV9LnBjIEBPTkxZKQorICBDUkVBVEVfU1lNTElOSygke1BOR0xJQl9OQU1FfS5wYyBsaWJwbmcucGMpCisKKyAgY29uZmlndXJlX2ZpbGUoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2xpYnBuZy1jb25maWcuaW4KKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtQTkdMSUJfTkFNRX0tY29uZmlnIEBPTkxZKQorICBDUkVBVEVfU1lNTElOSygke1BOR0xJQl9OQU1FfS1jb25maWcgbGlicG5nLWNvbmZpZykKK2VuZGlmKE5PVCBXSU4zMiBPUiBDWUdXSU4gT1IgTUlOR1cpCisKKyMgU0VUIFVQIExJTktTCitpZihQTkdfU0hBUkVEKQorICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHtQTkdfTElCX05BTUV9IFBST1BFUlRJRVMKKyMgICBWRVJTSU9OIDE2LiR7UE5HTElCX1JFTEVBU0V9LjEuNi4yMAorICAgIFZFUlNJT04gMTYuJHtQTkdMSUJfUkVMRUFTRX0uMAorICAgIFNPVkVSU0lPTiAxNgorICAgIENMRUFOX0RJUkVDVF9PVVRQVVQgMSkKK2VuZGlmKCkKK2lmKFBOR19TVEFUSUMpCisgICMgTVNWQyBkb2Vzbid0IHVzZSBhIGRpZmZlcmVudCBmaWxlIGV4dGVuc2lvbiBmb3Igc2hhcmVkIHZzLiBzdGF0aWMKKyAgIyBsaWJzLiAgV2UgYXJlIGFibGUgdG8gY2hhbmdlIE9VVFBVVF9OQU1FIHRvIHJlbW92ZSB0aGUgX3N0YXRpYworICAjIGZvciBhbGwgb3RoZXIgcGxhdGZvcm1zLgorICBpZihOT1QgTVNWQykKKyAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHtQTkdfTElCX05BTUVfU1RBVElDfSBQUk9QRVJUSUVTCisgICAgICBPVVRQVVRfTkFNRSAke1BOR19MSUJfTkFNRX0KKyAgICAgIENMRUFOX0RJUkVDVF9PVVRQVVQgMSkKKyAgZW5kaWYoKQorZW5kaWYoKQorCisjIElmIENNYWtlID4gMi40LngsIHdlIHNldCBhIHZhcmlhYmxlIHVzZWQgYmVsb3cgdG8gZXhwb3J0CisjIHRhcmdldHMgdG8gYW4gZXhwb3J0IGZpbGUuCisjIFRPRE86IFVzZSBWRVJTSU9OX0dSRUFURVIgYWZ0ZXIgb3VyIGNtYWtlX21pbmltdW1fcmVxdWlyZWQgPj0gMi42LjIKK2lmKENNQUtFX01BSk9SX1ZFUlNJT04gR1JFQVRFUiAxIEFORCBDTUFLRV9NSU5PUl9WRVJTSU9OIEdSRUFURVIgNCkKKyAgc2V0KFBOR19FWFBPUlRfUlVMRSBFWFBPUlQgbGlicG5nKQorZWxzZWlmKENNQUtFX01BSk9SX1ZFUlNJT04gR1JFQVRFUiAyKSAjIGZ1dHVyZSBwcm9vZgorICBzZXQoUE5HX0VYUE9SVF9SVUxFIEVYUE9SVCBsaWJwbmcpCitlbmRpZigpCisKKyMgSU5TVEFMTAoraWYoTk9UIFNLSVBfSU5TVEFMTF9MSUJSQVJJRVMgQU5EIE5PVCBTS0lQX0lOU1RBTExfQUxMICkKKyAgaW5zdGFsbChUQVJHRVRTICR7UE5HX0xJQl9UQVJHRVRTfQorICAgICAgJHtQTkdfRVhQT1JUX1JVTEV9CisgICAgICBSVU5USU1FIERFU1RJTkFUSU9OIGJpbgorICAgICAgTElCUkFSWSBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfTElCRElSfQorICAgICAgQVJDSElWRSBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfTElCRElSfQorICAgICAgRlJBTUVXT1JLIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9MSUJESVJ9KQorCisgIGlmKFBOR19TSEFSRUQpCisgICAgIyBDcmVhdGUgYSBzeW1saW5rIGZvciBsaWJwbmcuZGxsLmEgPT4gbGlicG5nMTYuZGxsLmEgb24gQ3lnd2luCisgICAgaWYoQ1lHV0lOIE9SIE1JTkdXKQorICAgICAgIGdldF90YXJnZXRfcHJvcGVydHkoQlVJTERfVEFSR0VUX0xPQ0FUSU9OICR7UE5HX0xJQl9OQU1FfSBMT0NBVElPTl8ke0NNQUtFX0JVSUxEX1RZUEV9KQorICAgICAgIENSRUFURV9TWU1MSU5LKCR7QlVJTERfVEFSR0VUX0xPQ0FUSU9OfSBsaWJwbmcke0NNQUtFX0lNUE9SVF9MSUJSQVJZX1NVRkZJWH0pCisgICAgICAgaW5zdGFsbChGSUxFUyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbGlicG5nJHtDTUFLRV9JTVBPUlRfTElCUkFSWV9TVUZGSVh9CisgICAgICAgICBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfTElCRElSfSkKKyAgICBlbmRpZihDWUdXSU4gT1IgTUlOR1cpCisKKyAgICBpZihOT1QgV0lOMzIpCisgICAgICBnZXRfdGFyZ2V0X3Byb3BlcnR5KEJVSUxEX1RBUkdFVF9MT0NBVElPTiAke1BOR19MSUJfTkFNRX0gTE9DQVRJT05fJHtDTUFLRV9CVUlMRF9UWVBFfSkKKyAgICAgIENSRUFURV9TWU1MSU5LKCR7QlVJTERfVEFSR0VUX0xPQ0FUSU9OfSBsaWJwbmcke0NNQUtFX1NIQVJFRF9MSUJSQVJZX1NVRkZJWH0pCisgICAgICBpbnN0YWxsKEZJTEVTICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9saWJwbmcke0NNQUtFX1NIQVJFRF9MSUJSQVJZX1NVRkZJWH0KKyAgICAgICAgIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9MSUJESVJ9KQorICAgIGVuZGlmKE5PVCBXSU4zMikKKyAgZW5kaWYoUE5HX1NIQVJFRCkKKworICBpZihQTkdfU1RBVElDKQorICAgIGlmKE5PVCBXSU4zMiBPUiBDWUdXSU4gT1IgTUlOR1cpCisgICAgICBnZXRfdGFyZ2V0X3Byb3BlcnR5KEJVSUxEX1RBUkdFVF9MT0NBVElPTiAke1BOR19MSUJfTkFNRV9TVEFUSUN9IExPQ0FUSU9OXyR7Q01BS0VfQlVJTERfVFlQRX0pCisgICAgICBDUkVBVEVfU1lNTElOSygke0JVSUxEX1RBUkdFVF9MT0NBVElPTn0gbGlicG5nJHtDTUFLRV9TVEFUSUNfTElCUkFSWV9TVUZGSVh9KQorICAgICAgaW5zdGFsbChGSUxFUyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbGlicG5nJHtDTUFLRV9TVEFUSUNfTElCUkFSWV9TVUZGSVh9CisgICAgICAgICBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfTElCRElSfSkKKyAgICBlbmRpZihOT1QgV0lOMzIgT1IgQ1lHV0lOIE9SIE1JTkdXKQorIGVuZGlmKCkKK2VuZGlmKCkKKworaWYoTk9UIFNLSVBfSU5TVEFMTF9IRUFERVJTIEFORCBOT1QgU0tJUF9JTlNUQUxMX0FMTCApCisgIGluc3RhbGwoRklMRVMgJHtsaWJwbmdfcHVibGljX2hkcnN9ICAgREVTVElOQVRJT04gaW5jbHVkZSkKKyAgaW5zdGFsbChGSUxFUyAke2xpYnBuZ19wdWJsaWNfaGRyc30gICBERVNUSU5BVElPTiBpbmNsdWRlLyR7UE5HTElCX05BTUV9KQorZW5kaWYoKQoraWYoTk9UIFNLSVBfSU5TVEFMTF9FWEVDVVRBQkxFUyBBTkQgTk9UIFNLSVBfSU5TVEFMTF9BTEwgKQorICBpZihOT1QgV0lOMzIgT1IgQ1lHV0lOIE9SIE1JTkdXKQorICAgIGluc3RhbGwoUFJPR1JBTVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xpYnBuZy1jb25maWcgREVTVElOQVRJT04gYmluKQorICAgIGluc3RhbGwoUFJPR1JBTVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7UE5HTElCX05BTUV9LWNvbmZpZworICAgICAgICAgICAgREVTVElOQVRJT04gYmluKQorICBlbmRpZihOT1QgV0lOMzIgT1IgQ1lHV0lOIE9SIE1JTkdXKQorZW5kaWYoKQorCitpZihOT1QgU0tJUF9JTlNUQUxMX0ZJTEVTIEFORCBOT1QgU0tJUF9JTlNUQUxMX0FMTCApCisgICMgSW5zdGFsbCBtYW4gcGFnZXMKKyAgaWYoTk9UIFBOR19NQU5fRElSKQorICAgIHNldChQTkdfTUFOX0RJUiAic2hhcmUvbWFuIikKKyAgZW5kaWYoKQorICBpbnN0YWxsKEZJTEVTIGxpYnBuZy4zIGxpYnBuZ3BmLjMgICAgICBERVNUSU5BVElPTiAke1BOR19NQU5fRElSfS9tYW4zKQorICBpbnN0YWxsKEZJTEVTIHBuZy41ICAgICAgICAgICAgICAgICAgICBERVNUSU5BVElPTiAke1BOR19NQU5fRElSfS9tYW41KQorICAjIEluc3RhbGwgcGtnLWNvbmZpZyBmaWxlcworICBpZihOT1QgV0lOMzIgT1IgQ1lHV0lOIE9SIE1JTkdXKQorICAgIGluc3RhbGwoRklMRVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xpYnBuZy5wYworICAgICAgICAgICAgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0xJQkRJUn0vcGtnY29uZmlnKQorICAgIGluc3RhbGwoUFJPR1JBTVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xpYnBuZy1jb25maWcKKyAgICAgICAgICAgIERFU1RJTkFUSU9OIGJpbikKKyAgICBpbnN0YWxsKEZJTEVTICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8ke1BOR0xJQl9OQU1FfS5wYworICAgICAgICAgICAgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0xJQkRJUn0vcGtnY29uZmlnKQorICAgIGluc3RhbGwoUFJPR1JBTVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7UE5HTElCX05BTUV9LWNvbmZpZworICAgICAgICAgICAgREVTVElOQVRJT04gYmluKQorICBlbmRpZihOT1QgV0lOMzIgT1IgQ1lHV0lOIE9SIE1JTkdXKQorZW5kaWYoKQorCisjIE9uIHZlcnNpb25zIG9mIENNYWtlIHRoYXQgc3VwcG9ydCBpdCwgY3JlYXRlIGFuIGV4cG9ydCBmaWxlIENNYWtlCisjIHVzZXJzIGNhbiBpbmNsdWRlKCkgdG8gaW1wb3J0IG91ciB0YXJnZXRzCitpZihQTkdfRVhQT1JUX1JVTEUgQU5EIE5PVCBTS0lQX0lOU1RBTExfRVhQT1JUIEFORCBOT1QgU0tJUF9JTlNUQUxMX0FMTCApCisgIGluc3RhbGwoRVhQT1JUIGxpYnBuZyBERVNUSU5BVElPTiBsaWIvbGlicG5nIEZJTEUgbGliJHtQTkdfTElCX05BTUV9LmNtYWtlKQorZW5kaWYoKQorCisjIHdoYXQncyB3aXRoIGxpYnBuZy1tYW51YWwudHh0IGFuZCBhbGwgdGhlIGV4dHJhIGZpbGVzPworCisjIFVOSU5TVEFMTAorIyBkbyB3ZSBuZWVkIHRoaXM/CisKKyMgRElTVAorIyBkbyB3ZSBuZWVkIHRoaXM/CisKKyMgdG8gY3JlYXRlIG1zdmMgaW1wb3J0IGxpYiBmb3IgbWluZ3cgY29tcGlsZWQgc2hhcmVkIGxpYgorIyBwZXhwb3J0cyBsaWJwbmcuZGxsID4gbGlicG5nLmRlZgorIyBsaWIgL2RlZjpsaWJwbmcuZGVmIC9tYWNoaW5lOng4NgorCmRpZmYgLS1naXQgYS9saWJwbmcvQ2xlYW5TcGVjLm1rIGIvbGlicG5nL0NsZWFuU3BlYy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODRlMWI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL0NsZWFuU3BlYy5tawpAQCAtMCwwICsxLDQ5IEBACisjIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIElmIHlvdSBkb24ndCBuZWVkIHRvIGRvIGEgZnVsbCBjbGVhbiBidWlsZCBidXQgd291bGQgbGlrZSB0byB0b3VjaAorIyBhIGZpbGUgb3IgZGVsZXRlIHNvbWUgaW50ZXJtZWRpYXRlIGZpbGVzLCBhZGQgYSBjbGVhbiBzdGVwIHRvIHRoZSBlbmQKKyMgb2YgdGhlIGxpc3QuICBUaGVzZSBzdGVwcyB3aWxsIG9ubHkgYmUgcnVuIG9uY2UsIGlmIHRoZXkgaGF2ZW4ndCBiZWVuCisjIHJ1biBiZWZvcmUuCisjCisjIEUuZy46CisjICAgICAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHRvdWNoIC1jIGV4dGVybmFsL3NxbGl0ZS9zcWxpdGUzLmgpCisjICAgICAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU1RBVElDX0xJQlJBUklFUy9saWJ6X2ludGVybWVkaWF0ZXMpCisjCisjIEFsd2F5cyB1c2UgInRvdWNoIC1jIiBhbmQgInJtIC1mIiBvciAicm0gLXJmIiB0byBncmFjZWZ1bGx5IGRlYWwgd2l0aAorIyBmaWxlcyB0aGF0IGFyZSBtaXNzaW5nIG9yIGhhdmUgYmVlbiBtb3ZlZC4KKyMKKyMgVXNlICQoUFJPRFVDVF9PVVQpIHRvIGdldCB0byB0aGUgIm91dC90YXJnZXQvcHJvZHVjdC9ibGFoLyIgZGlyZWN0b3J5LgorIyBVc2UgJChPVVRfRElSKSB0byByZWZlciB0byB0aGUgIm91dCIgZGlyZWN0b3J5LgorIworIyBJZiB5b3UgbmVlZCB0byByZS1kbyBzb21ldGhpbmcgdGhhdCdzIGFscmVhZHkgbWVudGlvbmVkLCBqdXN0IGNvcHkKKyMgdGhlIGNvbW1hbmQgYW5kIGFkZCBpdCB0byB0aGUgYm90dG9tIG9mIHRoZSBsaXN0LiAgRS5nLiwgaWYgYSBjaGFuZ2UKKyMgdGhhdCB5b3UgbWFkZSBsYXN0IHdlZWsgcmVxdWlyZWQgdG91Y2hpbmcgYSBmaWxlIGFuZCBhIGNoYW5nZSB5b3UKKyMgbWFkZSB0b2RheSByZXF1aXJlcyB0b3VjaGluZyB0aGUgc2FtZSBmaWxlLCBqdXN0IGNvcHkgdGhlIG9sZAorIyB0b3VjaCBzdGVwIGFuZCBhZGQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4KKyMKKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIE5FV0VSIENMRUFOIFNURVBTIE1VU1QgQkUgQVQgVEhFIEVORCBPRiBUSEUgTElTVAorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIyBGb3IgZXhhbXBsZToKKyMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqL0FQUFMvQW5kcm9pZFRlc3RzX2ludGVybWVkaWF0ZXMpCisjJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9jb3JlX2ludGVybWVkaWF0ZXMpCisjJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBmaW5kICQoT1VUX0RJUikgLXR5cGUgZiAtbmFtZSAiSUdUYWxrU2Vzc2lvbioiIC1wcmludDAgfCB4YXJncyAtMCBybSAtZikKKyMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9kYXRhLyopCisKKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIE5FV0VSIENMRUFOIFNURVBTIE1VU1QgQkUgQVQgVEhFIEVORCBPRiBUSEUgTElTVAorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2xpYnBuZy9JTlNUQUxMIGIvbGlicG5nL0lOU1RBTEwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI5NGZmZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9JTlNUQUxMCkBAIC0wLDAgKzEsNDA3IEBACisKK0luc3RhbGxpbmcgbGlicG5nCisKK0NvbnRlbnRzCisKKyAgIEkuIFNpbXBsZSBpbnN0YWxsYXRpb24KKyAgSUkuIFJlYnVpbGRpbmcgdGhlIGNvbmZpZ3VyZSBzY3JpcHRzCisgSUlJLiBVc2luZyBzY3JpcHRzL21ha2VmaWxlKgorICBJVi4gVXNpbmcgY21ha2UKKyAgIFYuIERpcmVjdG9yeSBzdHJ1Y3R1cmUKKyAgVkkuIEJ1aWxkaW5nIHdpdGggcHJvamVjdCBmaWxlcworIFZJSS4gQnVpbGRpbmcgd2l0aCBtYWtlZmlsZXMKK1ZJSUkuIENvbmZpZ3VyaW5nIGxpYnBuZyBmb3IgMTYtYml0IHBsYXRmb3JtcworICBJWC4gQ29uZmlndXJpbmcgZm9yIERPUworICAgWC4gQ29uZmlndXJpbmcgZm9yIE1lZGl1bSBNb2RlbAorICBYSS4gUHJlcGVuZGluZyBhIHByZWZpeCB0byBleHBvcnRlZCBzeW1ib2xzCisgWElJLiBDb25maWd1cmluZyBmb3IgY29tcGlsZXIgeHh4OgorWElJSS4gUmVtb3ZpbmcgdW53YW50ZWQgb2JqZWN0IGNvZGUKKyBYSVYuIENoYW5nZXMgdG8gdGhlIGJ1aWxkIGFuZCBjb25maWd1cmF0aW9uIG9mIGxpYnBuZyBpbiBsaWJwbmctMS41LngKKyAgWFYuIFNldGptcC9sb25nam1wIGlzc3VlcworIFhWSS4gT3RoZXIgc291cmNlcyBvZiBpbmZvcm1hdGlvbiBhYm91dCBsaWJwbmcKKworSS4gU2ltcGxlIGluc3RhbGxhdGlvbgorCitPbiBVbml4L0xpbnV4IGFuZCBzaW1pbGFyIHN5c3RlbXMsIHlvdSBjYW4gc2ltcGx5IHR5cGUKKworICAgIC4vY29uZmlndXJlIFstLXByZWZpeD0vcGF0aF0KKyAgICBtYWtlIGNoZWNrCisgICAgbWFrZSBpbnN0YWxsCisKK2FuZCBpZ25vcmUgdGhlIHJlc3Qgb2YgdGhpcyBkb2N1bWVudC4gICIvcGF0aCIgaXMgdGhlIHBhdGggdG8gdGhlIGRpcmVjdG9yeQord2hlcmUgeW91IHdhbnQgdG8gaW5zdGFsbCB0aGUgbGlicG5nICJsaWIiLCAiaW5jbHVkZSIsIGFuZCAiYmluIgorc3ViZGlyZWN0b3JpZXMuCisKK0lmIHlvdSBkb3dubG9hZGVkIGEgR0lUIGNsb25lLCB5b3Ugd2lsbCBuZWVkIHRvIHJ1biAuL2F1dG9nZW4uc2ggYmVmb3JlCitydW5uaW5nIC4vY29uZmlndXJlLCB0byBjcmVhdGUgImNvbmZpZ3VyZSIgYW5kICJNYWtlZmlsZS5pbiIgd2hpY2ggYXJlCitub3QgaW5jbHVkZWQgaW4gdGhlIEdJVCByZXBvc2l0b3J5LgorCitOb3RlIHRoYXQgImNvbmZpZ3VyZSIgaXMgb25seSBpbmNsdWRlZCBpbiB0aGUgIioudGFyIiBkaXN0cmlidXRpb25zIGFuZCBub3QKK2luIHRoZSAiKi56aXAiIG9yICIqLjd6IiBkaXN0cmlidXRpb25zLiBJZiB5b3UgZG93bmxvYWRlZCBvbmUgb2YgdGhvc2UKK2Rpc3RyaWJ1dGlvbnMsIHNlZSAiQnVpbGRpbmcgd2l0aCBwcm9qZWN0IGZpbGVzIiBvciAiQnVpbGRpbmcgd2l0aCBtYWtlZmlsZXMiLAorYmVsb3cuCisKK0lJLiBSZWJ1aWxkaW5nIHRoZSBjb25maWd1cmUgc2NyaXB0cworCitJZiBjb25maWd1cmUgZG9lcyBub3Qgd29yayBvbiB5b3VyIHN5c3RlbSwgb3IgaWYgeW91IGhhdmUgYSBuZWVkIHRvCitjaGFuZ2UgY29uZmlndXJlLmFjIG9yIE1ha2VmaWxlLmFtLCBhbmQgeW91IGhhdmUgYSByZWFzb25hYmx5Cit1cC10by1kYXRlIHNldCBvZiB0b29scywgcnVubmluZyAuL2F1dG9nZW4uc2ggaW4gYSBnaXQgY2xvbmUgYmVmb3JlCitydW5uaW5nIC4vY29uZmlndXJlIG1heSBmaXggdGhlIHByb2JsZW0uICBUbyBiZSByZWFsbHkgc3VyZSB0aGF0IHlvdQorYXJlbid0IHVzaW5nIGFueSBvZiB0aGUgaW5jbHVkZWQgcHJlLWJ1aWx0IHNjcmlwdHMsIHlvdSBjYW4gZG8gdGhpczoKKworICAgIC4vY29uZmlndXJlIC0tZW5hYmxlLW1haW50YWluZXItbW9kZQorICAgIG1ha2UgbWFpbnRhaW5lci1jbGVhbgorICAgIC4vYXV0b2dlbi5zaCAtLW1haW50YWluZXIgLS1jbGVhbgorICAgIC4vYXV0b2dlbi5zaCAtLW1haW50YWluZXIKKyAgICAuL2NvbmZpZ3VyZSBbLS1wcmVmaXg9L3BhdGhdIFtvdGhlciBvcHRpb25zXQorICAgIG1ha2UKKyAgICBtYWtlIGluc3RhbGwKKyAgICBtYWtlIGNoZWNrCisKK0lJSS4gVXNpbmcgc2NyaXB0cy9tYWtlZmlsZSoKKworSW5zdGVhZCwgeW91IGNhbiB1c2Ugb25lIG9mIHRoZSBjdXN0b20tYnVpbHQgbWFrZWZpbGVzIGluIHRoZQorInNjcmlwdHMiIGRpcmVjdG9yeQorCisgICAgY3Agc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQgcG5nbGliY29uZi5oCisgICAgY3Agc2NyaXB0cy9tYWtlZmlsZS5zeXN0ZW0gbWFrZWZpbGUKKyAgICBtYWtlIHRlc3QKKyAgICBtYWtlIGluc3RhbGwKKworVGhlIGZpbGVzIHRoYXQgYXJlIHByZXNlbnRseSBhdmFpbGFibGUgaW4gdGhlIHNjcmlwdHMgZGlyZWN0b3J5CithcmUgbGlzdGVkIGFuZCBkZXNjcmliZWQgaW4gc2NyaXB0cy9SRUFETUUudHh0LgorCitPciB5b3UgY2FuIHVzZSBvbmUgb2YgdGhlICJwcm9qZWN0cyIgaW4gdGhlICJwcm9qZWN0cyIgZGlyZWN0b3J5LgorCitCZWZvcmUgaW5zdGFsbGluZyBsaWJwbmcsIHlvdSBtdXN0IGZpcnN0IGluc3RhbGwgemxpYiwgaWYgaXQKK2lzIG5vdCBhbHJlYWR5IG9uIHlvdXIgc3lzdGVtLiAgemxpYiBjYW4gdXN1YWxseSBiZSBmb3VuZAord2hlcmV2ZXIgeW91IGdvdCBsaWJwbmc7IG90aGVyd2lzZSBnbyB0byBodHRwOi8vemxpYi5uZXQuICBZb3UgY2FuIHBsYWNlCit6bGliIGluIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyBsaWJwbmcgb3IgaW4gYW5vdGhlciBkaXJlY3RvcnkuCisKK0lmIHlvdXIgc3lzdGVtIGFscmVhZHkgaGFzIGEgcHJlaW5zdGFsbGVkIHpsaWIgeW91IHdpbGwgc3RpbGwgbmVlZAordG8gaGF2ZSBhY2Nlc3MgdG8gdGhlIHpsaWIuaCBhbmQgemNvbmYuaCBpbmNsdWRlIGZpbGVzIHRoYXQKK2NvcnJlc3BvbmQgdG8gdGhlIHZlcnNpb24gb2YgemxpYiB0aGF0J3MgaW5zdGFsbGVkLgorCitJZiB5b3Ugd2lzaCB0byB0ZXN0IHdpdGggYSBwYXJ0aWN1bGFyIHpsaWIgdGhhdCBpcyBub3QgZmlyc3QgaW4gdGhlCitzdGFuZGFyZCBsaWJyYXJ5IHNlYXJjaCBwYXRoLCBwdXQgWkxJQkxJQiwgWkxJQklOQywgQ1BQRkxBR1MsIExERkxBR1MsCithbmQgTERfTElCUkFSWV9QQVRIIGluIHlvdXIgZW52aXJvbm1lbnQgYmVmb3JlIHJ1bm5pbmcgIm1ha2UgdGVzdCIKK29yICJtYWtlIGRpc3RjaGVjayI6CisKK1pMSUJMSUI9L3BhdGgvdG8vbGliIGV4cG9ydCBaTElCTElCCitaTElCSU5DPS9wYXRoL3RvL2luY2x1ZGUgZXhwb3J0IFpMSUJJTkMKK0NQUEZMQUdTPSItSSRaTElCSU5DIiBleHBvcnQgQ1BQRkxBR1MKK0xERkxBR1M9Ii1MJFpMSUJMSUIiIGV4cG9ydCBMREZMQUdTCitMRF9MSUJSQVJZX1BBVEg9IiRaTElCTElCOiRMRF9MSUJSQVJZX1BBVEgiIGV4cG9ydCBMRF9MSUJSQVJZX1BBVEgKKworSWYgeW91IGFyZSB1c2luZyBvbmUgb2YgdGhlIG1ha2VmaWxlIHNjcmlwdHMsIHB1dCBaTElCTElCIGFuZCBaTElCSU5DCitpbiB5b3VyIGVudmlyb25tZW50IGFuZCB0eXBlICJtYWtlIFpMSUJMSUI9JFpMSUJMSUIgWkxJQklOQz0kWkxJQklOQyB0ZXN0Ii4KKworSVYuIFVzaW5nIGNtYWtlCisKK0lmIHlvdSB3YW50IHRvIHVzZSAiY21ha2UiIChzZWUgd3d3LmNtYWtlLm9yZyksIHR5cGUKKworICAgY21ha2UgLiAtRENNQUtFX0lOU1RBTExfUFJFRklYPS9wYXRoCisgICBtYWtlCisgICBtYWtlIGluc3RhbGwKKworQXMgd2hlbiB1c2luZyB0aGUgc2ltcGxlIGNvbmZpZ3VyZSBtZXRob2QgZGVzY3JpYmVkIGFib3ZlLCAiL3BhdGgiIHBvaW50cyB0bwordGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgd2hlcmUgeW91IHdhbnQgdG8gcHV0IHRoZSBsaWJwbmcgImxpYiIsICJpbmNsdWRlIiwKK2FuZCAiYmluIiBzdWJkaXJlY3Rvcmllcy4KKworVi4gRGlyZWN0b3J5IHN0cnVjdHVyZQorCitZb3UgY2FuIHJlbmFtZSB0aGUgZGlyZWN0b3JpZXMgdGhhdCB5b3UgZG93bmxvYWRlZCAodGhleQorbWlnaHQgYmUgY2FsbGVkICJsaWJwbmcteC55LnoiIG9yICJsaWJwbmdOTiIgYW5kICJ6bGliLTEuMi44Igorb3IgInpsaWIxMjgiKSBzbyB0aGF0IHlvdSBoYXZlIGRpcmVjdG9yaWVzIGNhbGxlZCAiemxpYiIgYW5kICJsaWJwbmciLgorCitZb3VyIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgc2hvdWxkIGxvb2sgbGlrZSB0aGlzOgorCisgICAuLiAgICAgICAodGhlIHBhcmVudCBkaXJlY3RvcnkpCisgICAgICBsaWJwbmcgICh0aGlzIGRpcmVjdG9yeSkKKyAgICAgICAgICBJTlNUQUxMICh0aGlzIGZpbGUpCisgICAgICAgICAgUkVBRE1FCisgICAgICAgICAgKi5oLCAqLmMgID0+IGxpYnBuZyBzb3VyY2UgZmlsZXMKKyAgICAgICAgICBDTWFrZUxpc3RzLnR4dCAgICA9PiAgImNtYWtlIiBzY3JpcHQKKyAgICAgICAgICBjb25maWd1cmF0aW9uIGZpbGVzOgorICAgICAgICAgICAgIGNvbmZpZ3VyZS5hYywgY29uZmlndXJlLCBNYWtlZmlsZS5hbSwgTWFrZWZpbGUuaW4sCisgICAgICAgICAgICAgYXV0b2dlbi5zaCwgY29uZmlnLmd1ZXNzLCBsdG1haW4uc2gsIG1pc3NpbmcsIGxpYnBuZy5wYy5pbiwKKyAgICAgICAgICAgICBsaWJwbmctY29uZmlnLmluLCBhY2xvY2FsLm00LCBjb25maWcuaC5pbiwgY29uZmlnLnN1YiwKKyAgICAgICAgICAgICBkZXBjb21wLCBpbnN0YWxsLXNoLCBta2luc3RhbGxkaXJzLCB0ZXN0LXBuZ3Rlc3Quc2gKKyAgICAgICAgICBjb250cmliCisgICAgICAgICAgICAgYXJtLW5lb24sIGNvbmZ0ZXN0LCBleGFtcGxlcywgZ3JlZ2Jvb2ssIGxpYnRlc3RzLCBwbmdtaW5pbSwKKyAgICAgICAgICAgICBwbmdtaW51cywgcG5nc3VpdGUsIHRvb2xzLCB2aXN1cG5nCisgICAgICAgICAgcHJvamVjdHMKKyAgICAgICAgICAgICBjYnVpbGRlcjUsIG93YXRjb20sIHZpc3VhbGM3MSwgdnN0dWRpbywgeGNvZGUKKyAgICAgICAgICBzY3JpcHRzCisgICAgICAgICAgICAgbWFrZWZpbGUuKgorICAgICAgICAgICAgICouZGVmIChtb2R1bGUgZGVmaW5pdGlvbiBmaWxlcykKKyAgICAgICAgICAgICBldGMuCisgICAgICAgICAgcG5ndGVzdC5wbmcKKyAgICAgICAgICBldGMuCisgICAgICB6bGliCisgICAgICAgICAgUkVBRE1FLCAqLmgsICouYyBjb250cmliLCBldGMuCisKK0lmIHRoZSBsaW5lIGVuZGluZ3MgaW4gdGhlIGZpbGVzIGxvb2sgZnVubnksIHlvdSBtYXkgd2lzaCB0byBnZXQgdGhlIG90aGVyCitkaXN0cmlidXRpb24gb2YgbGlicG5nLiAgSXQgaXMgYXZhaWxhYmxlIGluIGJvdGggdGFyLmd6IChVTklYIHN0eWxlIGxpbmUKK2VuZGluZ3MpIGFuZCB6aXAgKERPUyBzdHlsZSBsaW5lIGVuZGluZ3MpIGZvcm1hdHMuCisKK1ZJLiBCdWlsZGluZyB3aXRoIHByb2plY3QgZmlsZXMKKworSWYgeW91IGFyZSBidWlsZGluZyBsaWJwbmcgd2l0aCBNU1ZDLCB5b3UgY2FuIGVudGVyIHRoZQorbGlicG5nIHByb2plY3RzXHZpc3VhbGM3MSBvciB2c3R1ZGlvIGRpcmVjdG9yeSBhbmQgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMKK2luIFJFQURNRS50eHQuCisKK090aGVyd2lzZSBlbnRlciB0aGUgemxpYiBkaXJlY3RvcnkgYW5kIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGluIHpsaWIvUkVBRE1FLAordGhlbiBjb21lIGJhY2sgaGVyZSBhbmQgcnVuICJjb25maWd1cmUiIG9yIGNob29zZSB0aGUgYXBwcm9wcmlhdGUKK21ha2VmaWxlLnN5cyBpbiB0aGUgc2NyaXB0cyBkaXJlY3RvcnkuCisKK1ZJSS4gQnVpbGRpbmcgd2l0aCBtYWtlZmlsZXMKKworQ29weSB0aGUgZmlsZSAob3IgZmlsZXMpIHRoYXQgeW91IG5lZWQgZnJvbSB0aGUKK3NjcmlwdHMgZGlyZWN0b3J5IGludG8gdGhpcyBkaXJlY3RvcnksIGZvciBleGFtcGxlCisKKyAgIE1TRE9TIGV4YW1wbGU6IGNvcHkgc2NyaXB0c1xtYWtlZmlsZS5tc2MgbWFrZWZpbGUKKyAgICAgICAgICAgICAgICAgIGNvcHkgc2NyaXB0c1xwbmdsaWJjb25mLmgucHJlYnVpbHQgcG5nbGliY29uZi5oCisgICBVTklYIGV4YW1wbGU6ICBjcCBzY3JpcHRzL21ha2VmaWxlLnN0ZCBtYWtlZmlsZQorICAgICAgICAgICAgICAgICAgY3Agc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQgcG5nbGliY29uZi5oCisKK1JlYWQgdGhlIG1ha2VmaWxlIHRvIHNlZSBpZiB5b3UgbmVlZCB0byBjaGFuZ2UgYW55IHNvdXJjZSBvcgordGFyZ2V0IGRpcmVjdG9yaWVzIHRvIG1hdGNoIHlvdXIgcHJlZmVyZW5jZXMuCisKK1RoZW4gcmVhZCBwbmdsaWJjb25mLmRmYSB0byBzZWUgaWYgeW91IHdhbnQgdG8gbWFrZSBhbnkgY29uZmlndXJhdGlvbgorY2hhbmdlcy4KKworVGhlbiBqdXN0IHJ1biAibWFrZSIgd2hpY2ggd2lsbCBjcmVhdGUgdGhlIGxpYnBuZyBsaWJyYXJ5IGluCit0aGlzIGRpcmVjdG9yeSBhbmQgIm1ha2UgdGVzdCIgd2hpY2ggd2lsbCBydW4gYSBxdWljayB0ZXN0IHRoYXQgcmVhZHMKK3RoZSAicG5ndGVzdC5wbmciIGZpbGUgYW5kIHdyaXRlcyBhICJwbmdvdXQucG5nIiBmaWxlIHRoYXQgc2hvdWxkIGJlCitpZGVudGljYWwgdG8gaXQuICBMb29rIGZvciAiOTc4MiB6ZXJvIHNhbXBsZXMiIGluIHRoZSBvdXRwdXQgb2YgdGhlCit0ZXN0LiAgRm9yIG1vcmUgY29uZmlkZW5jZSwgeW91IGNhbiBydW4gYW5vdGhlciB0ZXN0IGJ5IHR5cGluZworInBuZ3Rlc3QgcG5nbm93LnBuZyIgYW5kIGxvb2tpbmcgZm9yICIyODkgemVybyBzYW1wbGVzIiBpbiB0aGUgb3V0cHV0LgorQWxzbywgeW91IGNhbiBydW4gInBuZ3Rlc3QgLW0gY29udHJpYi9wbmdzdWl0ZS8qLnBuZyIgYW5kIGNvbXBhcmUKK3lvdXIgb3V0cHV0IHdpdGggdGhlIHJlc3VsdCBzaG93biBpbiBjb250cmliL3BuZ3N1aXRlL1JFQURNRS4KKworTW9zdCBvZiB0aGUgbWFrZWZpbGVzIHdpbGwgYWxsb3cgeW91IHRvIHJ1biAibWFrZSBpbnN0YWxsIiB0bworcHV0IHRoZSBsaWJyYXJ5IGluIGl0cyBmaW5hbCByZXN0aW5nIHBsYWNlIChpZiB5b3Ugd2FudCB0bworZG8gdGhhdCwgcnVuICJtYWtlIGluc3RhbGwiIGluIHRoZSB6bGliIGRpcmVjdG9yeSBmaXJzdCBpZiBuZWNlc3NhcnkpLgorU29tZSBhbHNvIGFsbG93IHlvdSB0byBydW4gIm1ha2UgdGVzdC1pbnN0YWxsZWQiIGFmdGVyIHlvdSBoYXZlCitydW4gIm1ha2UgaW5zdGFsbCIuCisKK1ZJSUkuIENvbmZpZ3VyaW5nIGxpYnBuZyBmb3IgMTYtYml0IHBsYXRmb3JtcworCitZb3Ugd2lsbCB3YW50IHRvIGxvb2sgaW50byB6Y29uZi5oIHRvIHRlbGwgemxpYiAoYW5kIHRodXMgbGlicG5nKSB0aGF0CitpdCBjYW5ub3QgYWxsb2NhdGUgbW9yZSB0aGFuIDY0SyBhdCBhIHRpbWUuICBFdmVuIGlmIHlvdSBjYW4sIHRoZSBtZW1vcnkKK3dvbid0IGJlIGFjY2Vzc2libGUuICBTbyBsaW1pdCB6bGliIGFuZCBsaWJwbmcgdG8gNjRLIGJ5IGRlZmluaW5nIE1BWFNFR182NEsuCisKK0lYLiBDb25maWd1cmluZyBmb3IgRE9TCisKK0ZvciBET1MgdXNlcnMgd2hvIG9ubHkgaGF2ZSBhY2Nlc3MgdG8gdGhlIGxvd2VyIDY0MEssIHlvdSB3aWxsCitoYXZlIHRvIGxpbWl0IHpsaWIncyBtZW1vcnkgdXNhZ2UgdmlhIGEgcG5nX3NldF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwoKQorY2FsbC4gIFNlZSB6bGliLmggb3IgemNvbmYuaCBpbiB0aGUgemxpYiBsaWJyYXJ5IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitYLiBDb25maWd1cmluZyBmb3IgTWVkaXVtIE1vZGVsCisKK0xpYnBuZydzIHN1cHBvcnQgZm9yIG1lZGl1bSBtb2RlbCBoYXMgYmVlbiB0ZXN0ZWQgb24gbW9zdCBvZiB0aGUgcG9wdWxhcgorY29tcGlsZXJzLiAgTWFrZSBzdXJlIE1BWFNFR182NEsgZ2V0cyBkZWZpbmVkLCBVU0VfRkFSX0tFWVdPUkQgZ2V0cworZGVmaW5lZCwgYW5kIEZBUiBnZXRzIGRlZmluZWQgdG8gZmFyIGluIHBuZ2NvbmYuaCwgYW5kIHlvdSBzaG91bGQgYmUKK2FsbCBzZXQuICBFdmVyeXRoaW5nIGluIHRoZSBsaWJyYXJ5IChleGNlcHQgZm9yIHpsaWIncyBzdHJ1Y3R1cmUpIGlzCitleHBlY3RpbmcgZmFyIGRhdGEuICBZb3UgbXVzdCB1c2UgdGhlIHR5cGVkZWZzIHdpdGggdGhlIHAgb3IgcHAgb24KK3RoZSBlbmQgZm9yIHBvaW50ZXJzIChvciBhdCBsZWFzdCBsb29rIGF0IHRoZW0gYW5kIGJlIGNhcmVmdWwpLiAgTWFrZQorbm90ZSB0aGF0IHRoZSByb3dzIG9mIGRhdGEgYXJlIGRlZmluZWQgYXMgcG5nX2J5dGVwcCwgd2hpY2ggaXMKK2FuICJ1bnNpZ25lZCBjaGFyIGZhciAqIGZhciAqIi4KKworWEkuIFByZXBlbmRpbmcgYSBwcmVmaXggdG8gZXhwb3J0ZWQgc3ltYm9scworCitTdGFydGluZyB3aXRoIGxpYnBuZy0xLjYuMCwgeW91IGNhbiBjb25maWd1cmUgbGlicG5nICh3aGVuIHVzaW5nIHRoZQorImNvbmZpZ3VyZSIgc2NyaXB0KSB0byBwcmVmaXggYWxsIGV4cG9ydGVkIHN5bWJvbHMgYnkgbWVhbnMgb2YgdGhlCitjb25maWd1cmF0aW9uIG9wdGlvbiAiLS13aXRoLWxpYnBuZy1wcmVmaXg9Rk9PXyIsIHdoZXJlIEZPT18gY2FuIGJlIGFueQorc3RyaW5nIGJlZ2lubmluZyB3aXRoIGEgbGV0dGVyIGFuZCBjb250YWluaW5nIG9ubHkgdXBwZXJjYXNlCithbmQgbG93ZXJjYXNlIGxldHRlcnMsIGRpZ2l0cywgYW5kIHRoZSB1bmRlcnNjb3JlIChpLmUuLCBhIEMgbGFuZ3VhZ2UKK2lkZW50aWZpZXIpLiAgVGhpcyBjcmVhdGVzIGEgc2V0IG9mIG1hY3JvcyBpbiBwbmdsaWJjb25mLmgsIHNvIHRoaXMgaXMKK3RyYW5zcGFyZW50IHRvIGFwcGxpY2F0aW9uczsgdGhlaXIgZnVuY3Rpb24gY2FsbHMgZ2V0IHRyYW5zZm9ybWVkIGJ5Cit0aGUgbWFjcm9zIHRvIHVzZSB0aGUgbW9kaWZpZWQgbmFtZXMuCisKK1hJSS4gQ29uZmlndXJpbmcgZm9yIGNvbXBpbGVyIHh4eDoKKworQWxsIGluY2x1ZGVzIGZvciBsaWJwbmcgYXJlIGluIHBuZ2NvbmYuaC4gIElmIHlvdSBuZWVkIHRvIGFkZCwgY2hhbmdlCitvciBkZWxldGUgYW4gaW5jbHVkZSwgdGhpcyBpcyB0aGUgcGxhY2UgdG8gZG8gaXQuCitUaGUgaW5jbHVkZXMgdGhhdCBhcmUgbm90IG5lZWRlZCBvdXRzaWRlIGxpYnBuZyBhcmUgcGxhY2VkIGluIHBuZ3ByaXYuaCwKK3doaWNoIGlzIG9ubHkgdXNlZCBieSB0aGUgcm91dGluZXMgaW5zaWRlIGxpYnBuZyBpdHNlbGYuCitUaGUgZmlsZXMgaW4gbGlicG5nIHByb3BlciBvbmx5IGluY2x1ZGUgcG5ncHJpdi5oIGFuZCBwbmcuaCwgd2hpY2gKK2luIHR1cm4gaW5jbHVkZXMgcG5nY29uZi5oIGFuZCwgYXMgb2YgbGlicG5nLTEuNS4wLCBwbmdsaWJjb25mLmguCitBcyBvZiBsaWJwbmctMS41LjAsIHBuZ3ByaXYuaCBhbHNvIGluY2x1ZGVzIHRocmVlIG90aGVyIHByaXZhdGUgaGVhZGVyCitmaWxlcywgcG5nc3RydWN0LmgsIHBuZ2luZm8uaCwgYW5kIHBuZ2RlYnVnLmgsIHdoaWNoIGNvbnRhaW4gbWF0ZXJpYWwKK3RoYXQgcHJldmlvdXNseSBhcHBlYXJlZCBpbiB0aGUgcHVibGljIGhlYWRlcnMuCisKK1hJSUkuIFJlbW92aW5nIHVud2FudGVkIG9iamVjdCBjb2RlCisKK1RoZXJlIGFyZSBhIGJ1bmNoIG9mICNkZWZpbmUncyBpbiBwbmdjb25mLmggdGhhdCBjb250cm9sIHdoYXQgcGFydHMgb2YKK2xpYnBuZyBhcmUgY29tcGlsZWQuICBBbGwgdGhlIGRlZmluZXMgZW5kIGluIF9TVVBQT1JURUQuICBJZiB5b3UgYXJlCituZXZlciBnb2luZyB0byB1c2UgYSBjYXBhYmlsaXR5LCB5b3UgY2FuIGNoYW5nZSB0aGUgI2RlZmluZSB0byAjdW5kZWYKK2JlZm9yZSByZWNvbXBpbGluZyBsaWJwbmcgYW5kIHNhdmUgeW91cnNlbGYgY29kZSBhbmQgZGF0YSBzcGFjZSwgb3IKK3lvdSBjYW4gdHVybiBvZmYgaW5kaXZpZHVhbCBjYXBhYmlsaXRpZXMgd2l0aCBkZWZpbmVzIHRoYXQgYmVnaW4gd2l0aAorUE5HX05PXy4KKworSW4gbGlicG5nLTEuNS4wIGFuZCBsYXRlciwgdGhlICNkZWZpbmUncyBhcmUgaW4gcG5nbGliY29uZi5oIGluc3RlYWQuCisKK1lvdSBjYW4gYWxzbyB0dXJuIGFsbCBvZiB0aGUgdHJhbnNmb3JtcyBhbmQgYW5jaWxsYXJ5IGNodW5rIGNhcGFiaWxpdGllcworb2ZmIGVuIG1hc3NlIHdpdGggY29tcGlsZXIgZGlyZWN0aXZlcyB0aGF0IGRlZmluZQorUE5HX05PX1JFQURbb3IgV1JJVEVdX1RSQU5TRk9STVMsIG9yIFBOR19OT19SRUFEW29yIFdSSVRFXV9BTkNJTExBUllfQ0hVTktTLAorb3IgYWxsIGZvdXIsIGFsb25nIHdpdGggZGlyZWN0aXZlcyB0byB0dXJuIG9uIGFueSBvZiB0aGUgY2FwYWJpbGl0aWVzIHRoYXQKK3lvdSBkbyB3YW50LiAgVGhlIFBOR19OT19SRUFEW29yIFdSSVRFXV9UUkFOU0ZPUk1TIGRpcmVjdGl2ZXMgZGlzYWJsZSB0aGUKK2V4dHJhIHRyYW5zZm9ybWF0aW9ucyBidXQgc3RpbGwgbGVhdmUgdGhlIGxpYnJhcnkgZnVsbHkgY2FwYWJsZSBvZiByZWFkaW5nCithbmQgd3JpdGluZyBQTkcgZmlsZXMgd2l0aCBhbGwga25vd24gcHVibGljIGNodW5rcy4gVXNlIG9mIHRoZQorUE5HX05PX1JFQURbb3IgV1JJVEVdX0FOQ0lMTEFSWV9DSFVOS1MgZGlyZWN0aXZlIHByb2R1Y2VzIGEgbGlicmFyeQordGhhdCBpcyBpbmNhcGFibGUgb2YgcmVhZGluZyBvciB3cml0aW5nIGFuY2lsbGFyeSBjaHVua3MuICBJZiB5b3UgYXJlCitub3QgdXNpbmcgdGhlIHByb2dyZXNzaXZlIHJlYWRpbmcgY2FwYWJpbGl0eSwgeW91IGNhbiB0dXJuIHRoYXQgb2ZmCit3aXRoIFBOR19OT19QUk9HUkVTU0lWRV9SRUFEIChkb24ndCBjb25mdXNlIHRoaXMgd2l0aCB0aGUgSU5URVJMQUNJTkcKK2NhcGFiaWxpdHksIHdoaWNoIHlvdSdsbCBzdGlsbCBoYXZlKS4KKworQWxsIHRoZSByZWFkaW5nIGFuZCB3cml0aW5nIHNwZWNpZmljIGNvZGUgYXJlIGluIHNlcGFyYXRlIGZpbGVzLCBzbyB0aGUKK2xpbmtlciBzaG91bGQgb25seSBncmFiIHRoZSBmaWxlcyBpdCBuZWVkcy4gIEhvd2V2ZXIsIGlmIHlvdSB3YW50IHRvCittYWtlIHN1cmUsIG9yIGlmIHlvdSBhcmUgYnVpbGRpbmcgYSBzdGFuZCBhbG9uZSBsaWJyYXJ5LCBhbGwgdGhlCityZWFkaW5nIGZpbGVzIHN0YXJ0IHdpdGggInBuZ3IiIGFuZCBhbGwgdGhlIHdyaXRpbmcgZmlsZXMgc3RhcnQgd2l0aCAicG5ndyIuCitUaGUgZmlsZXMgdGhhdCBkb24ndCBtYXRjaCBlaXRoZXIgKGxpa2UgcG5nLmMsIHBuZ3RyYW5zLmMsIGV0Yy4pCithcmUgdXNlZCBmb3IgYm90aCByZWFkaW5nIGFuZCB3cml0aW5nLCBhbmQgYWx3YXlzIG5lZWQgdG8gYmUgaW5jbHVkZWQuCitUaGUgcHJvZ3Jlc3NpdmUgcmVhZGVyIGlzIGluIHBuZ3ByZWFkLmMKKworSWYgeW91IGFyZSBjcmVhdGluZyBvciBkaXN0cmlidXRpbmcgYSBkeW5hbWljYWxseSBsaW5rZWQgbGlicmFyeSAoYSAuc28KK29yIERMTCBmaWxlKSwgeW91IHNob3VsZCBub3QgcmVtb3ZlIG9yIGRpc2FibGUgYW55IHBhcnRzIG9mIHRoZSBsaWJyYXJ5LAorYXMgdGhpcyB3aWxsIGNhdXNlIGFwcGxpY2F0aW9ucyBsaW5rZWQgd2l0aCBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlCitsaWJyYXJ5IHRvIGZhaWwgaWYgdGhleSBjYWxsIGZ1bmN0aW9ucyBub3QgYXZhaWxhYmxlIGluIHlvdXIgbGlicmFyeS4KK1RoZSBzaXplIG9mIHRoZSBsaWJyYXJ5IGl0c2VsZiBzaG91bGQgbm90IGJlIGFuIGlzc3VlLCBiZWNhdXNlIG9ubHkKK3Rob3NlIHNlY3Rpb25zIHRoYXQgYXJlIGFjdHVhbGx5IHVzZWQgd2lsbCBiZSBsb2FkZWQgaW50byBtZW1vcnkuCisKK1hJVi4gQ2hhbmdlcyB0byB0aGUgYnVpbGQgYW5kIGNvbmZpZ3VyYXRpb24gb2YgbGlicG5nIGluIGxpYnBuZy0xLjUueAorCitEZXRhaWxzIG9mIGludGVybmFsIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgY29kZSBjYW4gYmUgZm91bmQgaW4gdGhlIENIQU5HRVMKK2ZpbGUgYW5kIGluIHRoZSBHSVQgcmVwb3NpdG9yeSBsb2dzLiAgVGhlc2Ugd2lsbCBiZSBvZiBubyBjb25jZXJuIHRvIHRoZSB2YXN0CittYWpvcml0eSBvZiBsaWJyYXJ5IHVzZXJzIG9yIGJ1aWxkZXJzOyBob3dldmVyLCB0aGUgZmV3IHdobyBjb25maWd1cmUgbGlicG5nCit0byBhIG5vbi1kZWZhdWx0IGZlYXR1cmUgc2V0IG1heSBuZWVkIHRvIGNoYW5nZSBob3cgdGhpcyBpcyBkb25lLgorCitUaGVyZSBzaG91bGQgYmUgbm8gbmVlZCBmb3IgbGlicmFyeSBidWlsZGVycyB0byBhbHRlciBidWlsZCBzY3JpcHRzIGlmCit0aGVzZSB1c2UgdGhlIGRpc3RyaWJ1dGVkIGJ1aWxkIHN1cHBvcnQgLSBjb25maWd1cmUgb3IgdGhlIG1ha2VmaWxlcyAtCitob3dldmVyLCB1c2VycyBvZiB0aGUgbWFrZWZpbGVzIG1heSBjYXJlIHRvIHVwZGF0ZSB0aGVpciBidWlsZCBzY3JpcHRzCit0byBidWlsZCBwbmdsaWJjb25mLmggd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcgbWFrZWZpbGUgZG9lcyBub3QgZG8gc28uCisKK0J1aWxkaW5nIGxpYnBuZyB3aXRoIGEgbm9uLWRlZmF1bHQgY29uZmlndXJhdGlvbiBoYXMgY2hhbmdlZCBjb21wbGV0ZWx5LgorVGhlIG9sZCBtZXRob2QgdXNpbmcgcG5ndXNyLmggc2hvdWxkIHN0aWxsIHdvcmsgY29ycmVjdGx5IGV2ZW4gdGhvdWdoIHRoZQord2F5IHBuZ3Vzci5oIGlzIHVzZWQgaW4gdGhlIGJ1aWxkIGhhcyBiZWVuIGNoYW5nZWQ7IGhvd2V2ZXIsIGxpYnJhcnkKK2J1aWxkZXJzIHdpbGwgcHJvYmFibHkgd2FudCB0byBleGFtaW5lIHRoZSBjaGFuZ2VzIHRvIHRha2UgYWR2YW50YWdlIG9mCituZXcgY2FwYWJpbGl0aWVzIGFuZCB0byBzaW1wbGlmeSB0aGVpciBidWlsZCBzeXN0ZW0uCisKK0EuIFNwZWNpZmljIGNoYW5nZXMgdG8gbGlicmFyeSBjb25maWd1cmF0aW9uIGNhcGFiaWxpdGllcworCitUaGUgZXhhY3QgbWVjaGFuaXNtIHVzZWQgdG8gY29udHJvbCBhdHRyaWJ1dGVzIG9mIEFQSSBmdW5jdGlvbnMgaGFzCitjaGFuZ2VkLiAgQSBzaW5nbGUgc2V0IG9mIG9wZXJhdGluZyBzeXN0ZW0gaW5kZXBlbmRlbnQgbWFjcm8gZGVmaW5pdGlvbnMKK2lzIHVzZWQgYW5kIG9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWMgZGlyZWN0aXZlcyBhcmUgZGVmaW5lZCBpbgorcG5nbGliY29uZi5oCisKK0FzIHBhcnQgb2YgdGhpcyB0aGUgbWVjaGFuaXNtIHVzZWQgdG8gY2hvb3NlIHByb2NlZHVyZSBjYWxsIHN0YW5kYXJkcyBvbgordGhvc2Ugc3lzdGVtcyB0aGF0IGFsbG93IGEgY2hvaWNlIGhhcyBiZWVuIGNoYW5nZWQuICBBdCBwcmVzZW50IHRoaXMgb25seQorYWZmZWN0cyBjZXJ0YWluIE1pY3Jvc29mdCAoRE9TLCBXaW5kb3dzKSBhbmQgSUJNIChPUy8yKSBvcGVyYXRpbmcgc3lzdGVtcworcnVubmluZyBvbiBJbnRlbCBwcm9jZXNzb3JzLiAgQXMgYmVmb3JlLCBQTkdBUEkgaXMgZGVmaW5lZCB3aGVyZSByZXF1aXJlZAordG8gY29udHJvbCB0aGUgZXhwb3J0ZWQgQVBJIGZ1bmN0aW9uczsgaG93ZXZlciwgdHdvIG5ldyBtYWNyb3MsIFBOR0NCQVBJCithbmQgUE5HQ0FQSSwgYXJlIHVzZWQgaW5zdGVhZCBmb3IgY2FsbGJhY2sgZnVuY3Rpb25zIChQTkdDQkFQSSkgYW5kCisoUE5HQ0FQSSkgZm9yIGZ1bmN0aW9ucyB0aGF0IG11c3QgbWF0Y2ggYSBDIGxpYnJhcnkgcHJvdG90eXBlIChjdXJyZW50bHkKK29ubHkgcG5nX2xvbmdqbXBfcHRyLCB3aGljaCBtdXN0IG1hdGNoIHRoZSBDIGxvbmdqbXAgZnVuY3Rpb24uKSAgVGhlIG5ldworYXBwcm9hY2ggaXMgZG9jdW1lbnRlZCBpbiBwbmdjb25mLmgKKworRGVzcGl0ZSB0aGVzZSBjaGFuZ2VzLCBsaWJwbmcgMS41LjAgb25seSBzdXBwb3J0cyB0aGUgbmF0aXZlIEMgZnVuY3Rpb24KK2NhbGxpbmcgc3RhbmRhcmQgb24gdGhvc2UgcGxhdGZvcm1zIHRlc3RlZCBzbyBmYXIgKF9fY2RlY2wgb24gTWljcm9zb2Z0CitXaW5kb3dzKS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgc3VwcG9ydCByZXF1aXJlbWVudHMgZm9yIGFsdGVybmF0aXZlCitjYWxsaW5nIGNvbnZlbnRpb25zIHNlZW0gdG8gbm8gbG9uZ2VyIGV4aXN0LiAgRGV2ZWxvcGVycyB3aG8gZmluZCBpdAorbmVjZXNzYXJ5IHRvIHNldCBQTkdfQVBJX1JVTEUgdG8gMSBzaG91bGQgYWR2aXNlIHRoZSBtYWlsaW5nIGxpc3QKKyhwbmctbW5nLWltcGxlbWVudCkgb2YgdGhpcyBhbmQgbGlicmFyeSBidWlsZGVycyB3aG8gdXNlIE9wZW53YXRjb20gYW5kCit0aGVyZWZvcmUgc2V0IFBOR19BUElfUlVMRSB0byAyIHNob3VsZCBhbHNvIGNvbnRhY3QgdGhlIG1haWxpbmcgbGlzdC4KKworQi4gQ2hhbmdlcyB0byB0aGUgY29uZmlndXJhdGlvbiBtZWNoYW5pc20KKworUHJpb3IgdG8gbGlicG5nLTEuNS4wIGxpYnJhcnkgYnVpbGRlcnMgd2hvIG5lZWRlZCB0byBjb25maWd1cmUgbGlicG5nCitoYWQgZWl0aGVyIHRvIG1vZGlmeSB0aGUgZXhwb3J0ZWQgcG5nY29uZi5oIGhlYWRlciBmaWxlIHRvIGFkZCBzeXN0ZW0KK3NwZWNpZmljIGNvbmZpZ3VyYXRpb24gb3IgaGFkIHRvIHdyaXRlIGZlYXR1cmUgc2VsZWN0aW9uIG1hY3JvcyBpbnRvCitwbmd1c3IuaCBhbmQgY2F1c2UgdGhpcyB0byBiZSBpbmNsdWRlZCBpbnRvIHBuZ2NvbmYuaCBieSBkZWZpbmluZworUE5HX1VTRVJfQ09ORklHLiBUaGUgbGF0dGVyIG1lY2hhbmlzbSBoYWQgdGhlIGRpc2FkdmFudGFnZSB0aGF0IGFuCithcHBsaWNhdGlvbiBidWlsdCB3aXRob3V0IFBOR19VU0VSX0NPTkZJRyBkZWZpbmVkIHdvdWxkIHNlZSB0aGUKK3VubW9kaWZpZWQsIGRlZmF1bHQsIGxpYnBuZyBBUEkgYW5kIHRodXMgd291bGQgcHJvYmFibHkgZmFpbCB0byBsaW5rLgorCitUaGVzZSBtZWNoYW5pc21zIHN0aWxsIHdvcmsgaW4gdGhlIGNvbmZpZ3VyZSBidWlsZCBhbmQgaW4gYW55IG1ha2VmaWxlCitidWlsZCB0aGF0IGJ1aWxkcyBwbmdsaWJjb25mLmgsIGFsdGhvdWdoIHRoZSBmZWF0dXJlIHNlbGVjdGlvbiBtYWNyb3MKK2hhdmUgY2hhbmdlZCBzb21ld2hhdCBhcyBkZXNjcmliZWQgYWJvdmUuICBJbiAxLjUuMCwgaG93ZXZlciwgcG5ndXNyLmggaXMKK3Byb2Nlc3NlZCBvbmx5IG9uY2UsIGF0IHRoZSB0aW1lIHRoZSBleHBvcnRlZCBoZWFkZXIgZmlsZSBwbmdsaWJjb25mLmggaXMKK2J1aWx0LiAgcG5nY29uZi5oIG5vIGxvbmdlciBpbmNsdWRlcyBwbmd1c3IuaDsgdGhlcmVmb3JlLCBwbmd1c3IuaCBpcyBpZ25vcmVkCithZnRlciB0aGUgYnVpbGQgb2YgcG5nbGliY29uZi5oIGFuZCBpdCBpcyBuZXZlciBpbmNsdWRlZCBpbiBhbiBhcHBsaWNhdGlvbgorYnVpbGQuCisKK1RoZSBmb3JtZXJseSB1c2VkIGFsdGVybmF0aXZlIG9mIGFkZGluZyBhIGxpc3Qgb2YgZmVhdHVyZSBtYWNyb3MgdG8gdGhlCitDUFBGTEFHUyBzZXR0aW5nIGluIHRoZSBidWlsZCBhbHNvIHN0aWxsIHdvcmtzOyBob3dldmVyLCB0aGUgbWFjcm9zIHdpbGwgYmUKK2NvcGllZCB0byBwbmdsaWJjb25mLmggYW5kIHRoaXMgbWF5IHByb2R1Y2UgbWFjcm8gcmVkZWZpbml0aW9uIHdhcm5pbmdzCit3aGVuIHRoZSBpbmRpdmlkdWFsIEMgZmlsZXMgYXJlIGNvbXBpbGVkLgorCitBbGwgY29uZmlndXJhdGlvbiBub3cgb25seSB3b3JrcyBpZiBwbmdsaWJjb25mLmggaXMgYnVpbHQgZnJvbQorc2NyaXB0cy9wbmdsaWJjb25mLmRmYS4gIFRoaXMgcmVxdWlyZXMgdGhlIHByb2dyYW0gYXdrLiAgQnJpYW4gS2VybmlnaGFuCisodGhlIG9yaWdpbmFsIGF1dGhvciBvZiBhd2spIG1haW50YWlucyBDIHNvdXJjZSBjb2RlIG9mIHRoYXQgYXdrIGFuZCB0aGlzCithbmQgYWxsIGtub3duIGxhdGVyIGltcGxlbWVudGF0aW9ucyAob2Z0ZW4gY2FsbGVkIGJ5IHN1YnRseSBkaWZmZXJlbnQKK25hbWVzIC0gbmF3ayBhbmQgZ2F3ayBmb3IgZXhhbXBsZSkgYXJlIGFkZXF1YXRlIHRvIGJ1aWxkIHBuZ2xpYmNvbmYuaC4KK1RoZSBTdW4gTWljcm9zeXN0ZW1zIChub3cgT3JhY2xlKSBwcm9ncmFtICdhd2snIGlzIGFuIGVhcmxpZXIgdmVyc2lvbgorYW5kIGRvZXMgbm90IHdvcms7IHRoaXMgbWF5IGFsc28gYXBwbHkgdG8gb3RoZXIgc3lzdGVtcyB0aGF0IGhhdmUgYQorZnVuY3Rpb25pbmcgYXdrIGNhbGxlZCAnbmF3aycuCisKK0NvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgbm93IGRvY3VtZW50ZWQgaW4gc2NyaXB0cy9wbmdsaWJjb25mLmRmYS4gIFRoaXMKK2ZpbGUgYWxzbyBpbmNsdWRlcyBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIHRoYXQgZW5zdXJlcyBhIGNvbmZpZ3VyYXRpb24gaXMKK2NvbnNpc3RlbnQ7IHRoYXQgaXMsIGlmIGEgZmVhdHVyZSBpcyBzd2l0Y2hlZCBvZmYsIGRlcGVuZGVudCBmZWF0dXJlcyBhcmUKK2Fsc28gc3dpdGNoZWQgb2ZmLiAgQXMgYSByZWNvbW1lbmRlZCBhbHRlcm5hdGl2ZSB0byB1c2luZyBmZWF0dXJlIG1hY3JvcyBpbgorcG5ndXNyLmggYSBzeXN0ZW0gYnVpbGRlciBtYXkgYWxzbyBkZWZpbmUgZXF1aXZhbGVudCBvcHRpb25zIGluIHBuZ3Vzci5kZmEKKyhvciwgaW5kZWVkLCBhbnkgZmlsZSkgYW5kIGFkZCB0aGF0IHRvIHRoZSBjb25maWd1cmF0aW9uIGJ5IHNldHRpbmcKK0RGQV9YVFJBIHRvIHRoZSBmaWxlIG5hbWUuICBUaGUgbWFrZWZpbGVzIGluIGNvbnRyaWIvcG5nbWluaW0gaWxsdXN0cmF0ZQoraG93IHRvIGRvIHRoaXMsIGFuZCBhbHNvIGlsbHVzdHJhdGUgYSBjYXNlIHdoZXJlIHBuZ3Vzci5oIGlzIHN0aWxsIHJlcXVpcmVkLgorCitBZnRlciB5b3UgaGF2ZSBidWlsdCBsaWJwbmcsIHRoZSBkZWZpbml0aW9ucyB0aGF0IHdlcmUgcmVjb3JkZWQgaW4KK3BuZ2xpYmNvbmYuaCBhcmUgYXZhaWxhYmxlIHRvIHlvdXIgYXBwbGljYXRpb24gKHBuZ2xpYmNvbmYuaCBpcyBpbmNsdWRlZAoraW4gcG5nLmggYW5kIGdldHMgaW5zdGFsbGVkIGFsb25nc2lkZSBwbmcuaCBhbmQgcG5nY29uZi5oIGluIHlvdXIKKyRQUkVGSVgvaW5jbHVkZSBkaXJlY3RvcnkpLiAgRG8gbm90IGVkaXQgcG5nbGliY29uZi5oIGFmdGVyIHlvdSBoYXZlIGJ1aWx0CitsaWJwbmcsIGJlY2F1c2UgdGhhbiB0aGUgc2V0dGluZ3Mgd291bGQgbm90IGFjY3VyYXRlbHkgcmVmbGVjdCB0aGUgc2V0dGluZ3MKK3RoYXQgd2VyZSB1c2VkIHRvIGJ1aWxkIGxpYnBuZy4KKworWFYuIFNldGptcC9sb25nam1wIGlzc3VlcworCitMaWJwbmcgdXNlcyBzZXRqbXAoKS9sb25nam1wKCkgZm9yIGVycm9yIGhhbmRsaW5nLiAgVW5mb3J0dW5hdGVseSBzZXRqbXAoKQoraXMga25vd24gdG8gYmUgbm90IHRocmVhZC1zYWZlIG9uIHNvbWUgcGxhdGZvcm1zIGFuZCB3ZSBkb24ndCBrbm93IG9mCithbnkgcGxhdGZvcm0gd2hlcmUgaXQgaXMgZ3VhcmFudGVlZCB0byBiZSB0aHJlYWQtc2FmZS4gIFRoZXJlZm9yZSwgaWYKK3lvdXIgYXBwbGljYXRpb24gaXMgZ29pbmcgdG8gYmUgdXNpbmcgbXVsdGlwbGUgdGhyZWFkcywgeW91IHNob3VsZAorY29uZmlndXJlIGxpYnBuZyB3aXRoIFBOR19OT19TRVRKTVAgaW4geW91ciBwbmd1c3IuZGZhIGZpbGUsIHdpdGgKKy1EUE5HX05PX1NFVEpNUCBvbiB5b3VyIGNvbXBpbGUgbGluZSwgb3Igd2l0aAorCisgICN1bmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRAorCitpbiB5b3VyIHBuZ2xpYmNvbmYuaCBvciBwbmd1c3IuaC4KKworU3RhcnRpbmcgd2l0aCBsaWJwbmctMS42LjAsIHRoZSBsaWJyYXJ5IGluY2x1ZGVkIGEgInNpbXBsaWZpZWQgQVBJIi4KK1RoaXMgcmVxdWlyZXMgc2V0am1wL2xvbmdqbXAsIHNvIHlvdSBtdXN0IGVpdGhlciBidWlsZCB0aGUgbGlicmFyeQord2l0aCBQTkdfU0VUSk1QX1NVUFBPUlRFRCBkZWZpbmVkLCBvciB3aXRoIFBOR19TSU1QTElGSUVEX1JFQURfU1VQUE9SVEVECithbmQgUE5HX1NJTVBMSUZJRURfV1JJVEVfU1VQUE9SVEVEIHVuZGVmaW5lZC4KKworWFZJLiBPdGhlciBzb3VyY2VzIG9mIGluZm9ybWF0aW9uIGFib3V0IGxpYnBuZzoKKworRnVydGhlciBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gdGhlIFJFQURNRSBhbmQgbGlicG5nLW1hbnVhbC50eHQKK2ZpbGVzLCBpbiB0aGUgaW5kaXZpZHVhbCBtYWtlZmlsZXMsIGluIHBuZy5oLCBhbmQgdGhlIG1hbnVhbCBwYWdlcworbGlicG5nLjMgYW5kIHBuZy41LgorCitVc2luZyB0aGUgLi9jb25maWd1cmUgc2NyaXB0IC0tIDE2IERlY2VtYmVyIDIwMDIuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSAuL2NvbmZpZ3VyZSBzY3JpcHQgc2hvdWxkIHdvcmsgY29tcGF0aWJseSB3aXRoIHdoYXQgc2NyaXB0cy9tYWtlZmlsZS4qCitkaWQsIGhvd2V2ZXIgdGhlcmUgYXJlIHNvbWUgb3B0aW9ucyB5b3UgbWlnaHQgbmVlZCB0byBhZGQgdG8gY29uZmlndXJlCitleHBsaWNpdGx5LCB3aGljaCBwcmV2aW91c2x5IHdhcyBkb25lIHNlbWktYXV0b21hdGljYWxseSAoaWYgeW91IGRpZG4ndCBlZGl0CitzY3JpcHRzL21ha2VmaWxlLiogeW91cnNlbGYsIHRoYXQgaXMpCisKK0NGTEFHUz0iLVdhbGwgLU8gLWZ1bnJvbGwtbG9vcHMgXAorLW1hbGlnbi1sb29wcz0yIC1tYWxpZ24tZnVuY3Rpb25zPTIiIC4vY29uZmlndXJlIC0tcHJlZml4PS91c3IvaW5jbHVkZSBcCistLXdpdGgtcGtnY29uZmlnZGlyPS91c3IvbGliL3BrZ2NvbmZpZyAtLWluY2x1ZGVkaXI9L3Vzci9pbmNsdWRlCisKK1lvdSBjYW4gYWx0ZXJuYXRpdmVseSBzcGVjaWZ5IC0taW5jbHVkZWRpcj0vdXNyL2luY2x1ZGUsIC91c3IvbG9jYWwvaW5jbHVkZSwKKy91c3IvaW5jbHVkZS9saWJwbmcxNiwgb3Igd2hhdGV2ZXIuCisKK0lmIHlvdSBmaW5kIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgaXMgb3V0LW9mLWRhdGUgb3IgaXMgbm90IHN1cHBvcnRpbmcKK3lvdXIgcGxhdGZvcm0gcHJvcGVybHksIHRyeSBydW5uaW5nIGF1dG9nZW4uc2ggdG8gcmVnZW5lcmF0ZSAiY29uZmlndXJlIiwKKyJNYWtlZmlsZS5pbiIsIGFuZCB0aGUgb3RoZXIgY29uZmlndXJhdGlvbiBmaWxlcy4gVGhlbiB0cnkgY29uZmlndXJlIGFnYWluLgorCmRpZmYgLS1naXQgYS9saWJwbmcvTElDRU5TRSBiL2xpYnBuZy9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZGJlMTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvTElDRU5TRQpAQCAtMCwwICsxLDExMiBAQAorCitUaGlzIGNvcHkgb2YgdGhlIGxpYnBuZyBub3RpY2VzIGlzIHByb3ZpZGVkIGZvciB5b3VyIGNvbnZlbmllbmNlLiAgSW4gY2FzZSBvZgorYW55IGRpc2NyZXBhbmN5IGJldHdlZW4gdGhpcyBjb3B5IGFuZCB0aGUgbm90aWNlcyBpbiB0aGUgZmlsZSBwbmcuaCB0aGF0IGlzCitpbmNsdWRlZCBpbiB0aGUgbGlicG5nIGRpc3RyaWJ1dGlvbiwgdGhlIGxhdHRlciBzaGFsbCBwcmV2YWlsLgorCitDT1BZUklHSFQgTk9USUNFLCBESVNDTEFJTUVSLCBhbmQgTElDRU5TRToKKworSWYgeW91IG1vZGlmeSBsaWJwbmcgeW91IG1heSBpbnNlcnQgYWRkaXRpb25hbCBub3RpY2VzIGltbWVkaWF0ZWx5IGZvbGxvd2luZwordGhpcyBzZW50ZW5jZS4KKworVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKworbGlicG5nIHZlcnNpb25zIDEuMC43LCBKdWx5IDEsIDIwMDAsIHRocm91Z2ggMS42LjIwLCBEZWNlbWJlciAzLCAyMDE1LCBhcmUKK0NvcHlyaWdodCAoYykgMjAwMC0yMDAyLCAyMDA0LCAyMDA2LTIwMTUgR2xlbm4gUmFuZGVycy1QZWhyc29uLCBhcmUKK2Rlcml2ZWQgZnJvbSBsaWJwbmctMS4wLjYsIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzYW1lCitkaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzIGxpYnBuZy0xLjAuNiB3aXRoIHRoZSBmb2xsb3dpbmcgaW5kaXZpZHVhbHMKK2FkZGVkIHRvIHRoZSBsaXN0IG9mIENvbnRyaWJ1dGluZyBBdXRob3JzOgorCisgICBTaW1vbi1QaWVycmUgQ2FkaWV1eAorICAgRXJpYyBTLiBSYXltb25kCisgICBNYW5zIFJ1bGxnYXJkCisgICBDb3NtaW4gVHJ1dGEKKyAgIEdpbGxlcyBWb2xsYW50CisgICBKYW1lcyBZdQorCithbmQgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGl0aW9ucyB0byB0aGUgZGlzY2xhaW1lcjoKKworICAgVGhlcmUgaXMgbm8gd2FycmFudHkgYWdhaW5zdCBpbnRlcmZlcmVuY2Ugd2l0aCB5b3VyIGVuam95bWVudCBvZiB0aGUKKyAgIGxpYnJhcnkgb3IgYWdhaW5zdCBpbmZyaW5nZW1lbnQuICBUaGVyZSBpcyBubyB3YXJyYW50eSB0aGF0IG91cgorICAgZWZmb3J0cyBvciB0aGUgbGlicmFyeSB3aWxsIGZ1bGZpbGwgYW55IG9mIHlvdXIgcGFydGljdWxhciBwdXJwb3NlcworICAgb3IgbmVlZHMuICBUaGlzIGxpYnJhcnkgaXMgcHJvdmlkZWQgd2l0aCBhbGwgZmF1bHRzLCBhbmQgdGhlIGVudGlyZQorICAgcmlzayBvZiBzYXRpc2ZhY3RvcnkgcXVhbGl0eSwgcGVyZm9ybWFuY2UsIGFjY3VyYWN5LCBhbmQgZWZmb3J0IGlzIHdpdGgKKyAgIHRoZSB1c2VyLgorCitsaWJwbmcgdmVyc2lvbnMgMC45NywgSmFudWFyeSAxOTk4LCB0aHJvdWdoIDEuMC42LCBNYXJjaCAyMCwgMjAwMCwgYXJlCitDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMCBHbGVubiBSYW5kZXJzLVBlaHJzb24sIGFyZSBkZXJpdmVkIGZyb20KK2xpYnBuZy0wLjk2LCBhbmQgYXJlIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZAorbGljZW5zZSBhcyBsaWJwbmctMC45Niwgd2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWxzIGFkZGVkIHRvIHRoZSBsaXN0CitvZiBDb250cmlidXRpbmcgQXV0aG9yczoKKworICAgVG9tIExhbmUKKyAgIEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICAgV2lsbGVtIHZhbiBTY2hhaWsKKworbGlicG5nIHZlcnNpb25zIDAuODksIEp1bmUgMTk5NiwgdGhyb3VnaCAwLjk2LCBNYXkgMTk5NywgYXJlCitDb3B5cmlnaHQgKGMpIDE5OTYtMTk5NyBBbmRyZWFzIERpbGdlciwgYXJlIGRlcml2ZWQgZnJvbSBsaWJwbmctMC44OCwKK2FuZCBhcmUgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzYW1lIGRpc2NsYWltZXIgYW5kIGxpY2Vuc2UgYXMKK2xpYnBuZy0wLjg4LCB3aXRoIHRoZSBmb2xsb3dpbmcgaW5kaXZpZHVhbHMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YKK0NvbnRyaWJ1dGluZyBBdXRob3JzOgorCisgICBKb2huIEJvd2xlcgorICAgS2V2aW4gQnJhY2V5CisgICBTYW0gQnVzaGVsbAorICAgTWFnbnVzIEhvbG1ncmVuCisgICBHcmVnIFJvZWxvZnMKKyAgIFRvbSBUYW5uZXIKKworbGlicG5nIHZlcnNpb25zIDAuNSwgTWF5IDE5OTUsIHRocm91Z2ggMC44OCwgSmFudWFyeSAxOTk2LCBhcmUKK0NvcHlyaWdodCAoYykgMTk5NS0xOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgorCitGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgY29weXJpZ2h0IGFuZCBsaWNlbnNlLCAiQ29udHJpYnV0aW5nIEF1dGhvcnMiCitpcyBkZWZpbmVkIGFzIHRoZSBmb2xsb3dpbmcgc2V0IG9mIGluZGl2aWR1YWxzOgorCisgICBBbmRyZWFzIERpbGdlcgorICAgRGF2ZSBNYXJ0aW5kYWxlCisgICBHdXkgRXJpYyBTY2hhbG5hdAorICAgUGF1bCBTY2htaWR0CisgICBUaW0gV2VnbmVyCisKK1RoZSBQTkcgUmVmZXJlbmNlIExpYnJhcnkgaXMgc3VwcGxpZWQgIkFTIElTIi4gIFRoZSBDb250cmlidXRpbmcgQXV0aG9ycworYW5kIEdyb3VwIDQyLCBJbmMuIGRpc2NsYWltIGFsbCB3YXJyYW50aWVzLCBleHByZXNzZWQgb3IgaW1wbGllZCwKK2luY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGUgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIG9mCitmaXRuZXNzIGZvciBhbnkgcHVycG9zZS4gIFRoZSBDb250cmlidXRpbmcgQXV0aG9ycyBhbmQgR3JvdXAgNDIsIEluYy4KK2Fzc3VtZSBubyBsaWFiaWxpdHkgZm9yIGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgd2hpY2ggbWF5IHJlc3VsdCBmcm9tIHRoZSB1c2Ugb2YgdGhlIFBORworUmVmZXJlbmNlIExpYnJhcnksIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKK3NvdXJjZSBjb2RlLCBvciBwb3J0aW9ucyBoZXJlb2YsIGZvciBhbnkgcHVycG9zZSwgd2l0aG91dCBmZWUsIHN1YmplY3QKK3RvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCisgIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb3VyY2UgY29kZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZC4KKworICAyLiBBbHRlcmVkIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCBhbmQgbXVzdCBub3QKKyAgICAgYmUgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvdXJjZS4KKworICAzLiBUaGlzIENvcHlyaWdodCBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkKKyAgICAgc291cmNlIG9yIGFsdGVyZWQgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworVGhlIENvbnRyaWJ1dGluZyBBdXRob3JzIGFuZCBHcm91cCA0MiwgSW5jLiBzcGVjaWZpY2FsbHkgcGVybWl0LCB3aXRob3V0CitmZWUsIGFuZCBlbmNvdXJhZ2UgdGhlIHVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGFzIGEgY29tcG9uZW50IHRvCitzdXBwb3J0aW5nIHRoZSBQTkcgZmlsZSBmb3JtYXQgaW4gY29tbWVyY2lhbCBwcm9kdWN0cy4gIElmIHlvdSB1c2UgdGhpcworc291cmNlIGNvZGUgaW4gYSBwcm9kdWN0LCBhY2tub3dsZWRnbWVudCBpcyBub3QgcmVxdWlyZWQgYnV0IHdvdWxkIGJlCithcHByZWNpYXRlZC4KKworRU5EIE9GIENPUFlSSUdIVCBOT1RJQ0UsIERJU0NMQUlNRVIsIGFuZCBMSUNFTlNFLgorCitBICJwbmdfZ2V0X2NvcHlyaWdodCIgZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCBmb3IgY29udmVuaWVudCB1c2UgaW4gImFib3V0IgorYm94ZXMgYW5kIHRoZSBsaWtlOgorCisgICBwcmludGYoIiVzIiwgcG5nX2dldF9jb3B5cmlnaHQoTlVMTCkpOworCitBbHNvLCB0aGUgUE5HIGxvZ28gKGluIFBORyBmb3JtYXQsIG9mIGNvdXJzZSkgaXMgc3VwcGxpZWQgaW4gdGhlCitmaWxlcyAicG5nYmFyLnBuZyIgYW5kICJwbmdiYXIuanBnICg4OHgzMSkgYW5kICJwbmdub3cucG5nIiAoOTh4MzEpLgorCitMaWJwbmcgaXMgT1NJIENlcnRpZmllZCBPcGVuIFNvdXJjZSBTb2Z0d2FyZS4gIE9TSSBDZXJ0aWZpZWQgT3BlbiBTb3VyY2UgaXMKK2EgY2VydGlmaWNhdGlvbiBtYXJrIG9mIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLiBPU0kgaGFzIG5vdCBhZGRyZXNzZWQKK3RoZSBhZGRpdGlvbmFsIGRpc2NsYWltZXJzIGluc2VydGVkIGF0IHZlcnNpb24gMS4wLjcuCisKK0dsZW5uIFJhbmRlcnMtUGVocnNvbgorZ2xlbm5ycCBhdCB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQKK0RlY2VtYmVyIDMsIDIwMTUKZGlmZiAtLWdpdCBhL2xpYnBuZy9NT0RVTEVfTElDRU5TRV9CU0RfTElLRSBiL2xpYnBuZy9NT0RVTEVfTElDRU5TRV9CU0RfTElLRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL01PRFVMRV9MSUNFTlNFX0JTRF9MSUtFCmRpZmYgLS1naXQgYS9saWJwbmcvTWFrZWZpbGUuYW0gYi9saWJwbmcvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMwOTdkYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDM2MSBAQAorIyBNYWtlZmlsZS5hbToKKyMgICBTb3VyY2UgZmlsZSBmb3IgTWFrZWZpbGUuaW4gKGFuZCBoZW5jZSBNYWtlZmlsZSkKKyMKKworUE5HTElCX0JBU0VOQU1FPSBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JACisKK0FDTE9DQUxfQU1GTEFHUyA9IC1JIHNjcmlwdHMKKworIyB0ZXN0IHByb2dyYW1zIC0gcnVuIG9uIG1ha2UgY2hlY2ssIG1ha2UgZGlzdGNoZWNrCitjaGVja19QUk9HUkFNUz0gcG5ndGVzdCBwbmd1bmtub3duIHBuZ3N0ZXN0IHBuZ3ZhbGlkIHBuZ2ltYWdlCisKKyMgVXRpbGl0aWVzIC0gaW5zdGFsbGVkCitiaW5fUFJPR1JBTVM9IHBuZ2ZpeCBwbmctZml4LWl0eHQKKworIyBUaGlzIGVuc3VyZXMgdGhhdCBwbmdsaWJjb25mLmggZ2V0cyBidWlsdCBhdCB0aGUgc3RhcnQgb2YgJ21ha2UgYWxsJyBvcgorIyAnbWFrZSBjaGVjaycsIGJ1dCBpdCBkb2VzIG5vdCBhZGQgZGVwZW5kZW5jaWVzIHRvIHRoZSBpbmRpdmlkdWFsIHByb2dyYW1zLAorIyB0aGlzIGlzIGRvbmUgYmVsb3cuCisjCisjIElNUE9SVEFOVDogYWx3YXlzIGFkZCB0aGUgb2JqZWN0IG1vZHVsZXMgb2YgbmV3IHByb2dyYW1zIHRvIHRoZSBsaXN0IGJlbG93CisjIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBzZXF1ZW5jZSAnY29uZmlndXJlOyBtYWtlIG5ldy1wcm9ncmFtJyB3aWxsICpzb21ldGltZXMqCisjIHJlc3VsdCBpbiB0aGUgaW5zdGFsbGVkIChzeXN0ZW0pIHBuZ2xpYmNvbmYuaCBiZWluZyB1c2VkIGFuZCB0aGUgcmVzdWx0IGlzCisjIGFsd2F5cyB3cm9uZyBhbmQgYWx3YXlzIHZlcnkgY29uZnVzaW5nLgorQlVJTFRfU09VUkNFUyA9IHBuZ2xpYmNvbmYuaAorCitwbmd0ZXN0X1NPVVJDRVMgPSBwbmd0ZXN0LmMKK3BuZ3Rlc3RfTERBREQgPSBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JALmxhCisKK3BuZ3ZhbGlkX1NPVVJDRVMgPSBjb250cmliL2xpYnRlc3RzL3BuZ3ZhbGlkLmMKK3BuZ3ZhbGlkX0xEQUREID0gbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQC5sYQorCitwbmdzdGVzdF9TT1VSQ0VTID0gY29udHJpYi9saWJ0ZXN0cy9wbmdzdGVzdC5jCitwbmdzdGVzdF9MREFERCA9IGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAubGEKKworcG5ndW5rbm93bl9TT1VSQ0VTID0gY29udHJpYi9saWJ0ZXN0cy9wbmd1bmtub3duLmMKK3BuZ3Vua25vd25fTERBREQgPSBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JALmxhCisKK3BuZ2ltYWdlX1NPVVJDRVMgPSBjb250cmliL2xpYnRlc3RzL3BuZ2ltYWdlLmMKK3BuZ2ltYWdlX0xEQUREID0gbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQC5sYQorCitwbmdmaXhfU09VUkNFUyA9IGNvbnRyaWIvdG9vbHMvcG5nZml4LmMKK3BuZ2ZpeF9MREFERCA9IGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAubGEKKworcG5nX2ZpeF9pdHh0X1NPVVJDRVMgPSBjb250cmliL3Rvb2xzL3BuZy1maXgtaXR4dC5jCisKKyMgR2VuZXJhbGx5IHRoZXNlIGFyZSBzaW5nbGUgbGluZSBzaGVsbCBzY3JpcHRzIHRvIHJ1biBhIHRlc3Qgd2l0aCBhIHBhcnRpY3VsYXIKKyMgc2V0IG9mIHBhcmFtZXRlcnM6CitURVNUUyA9XAorICAgdGVzdHMvcG5ndGVzdFwKKyAgIHRlc3RzL3BuZ3ZhbGlkLWdhbW1hLTE2LXRvLTggdGVzdHMvcG5ndmFsaWQtZ2FtbWEtYWxwaGEtbW9kZVwKKyAgIHRlc3RzL3BuZ3ZhbGlkLWdhbW1hLWJhY2tncm91bmQgdGVzdHMvcG5ndmFsaWQtZ2FtbWEtZXhwYW5kMTYtYWxwaGEtbW9kZVwKKyAgIHRlc3RzL3BuZ3ZhbGlkLWdhbW1hLWV4cGFuZDE2LWJhY2tncm91bmRcCisgICB0ZXN0cy9wbmd2YWxpZC1nYW1tYS1leHBhbmQxNi10cmFuc2Zvcm0gdGVzdHMvcG5ndmFsaWQtZ2FtbWEtc2JpdFwKKyAgIHRlc3RzL3BuZ3ZhbGlkLWdhbW1hLXRocmVzaG9sZCB0ZXN0cy9wbmd2YWxpZC1nYW1tYS10cmFuc2Zvcm1cCisgICB0ZXN0cy9wbmd2YWxpZC1wcm9ncmVzc2l2ZS1zaXplXAorICAgdGVzdHMvcG5ndmFsaWQtcHJvZ3Jlc3NpdmUtaW50ZXJsYWNlLXN0YW5kYXJkXAorICAgdGVzdHMvcG5ndmFsaWQtdHJhbnNmb3JtXAorICAgdGVzdHMvcG5ndmFsaWQtcHJvZ3Jlc3NpdmUtc3RhbmRhcmQgdGVzdHMvcG5ndmFsaWQtc3RhbmRhcmRcCisgICB0ZXN0cy9wbmdzdGVzdC0xLjggdGVzdHMvcG5nc3Rlc3QtMS44LWFscGhhIHRlc3RzL3BuZ3N0ZXN0LWxpbmVhclwKKyAgIHRlc3RzL3BuZ3N0ZXN0LWxpbmVhci1hbHBoYSB0ZXN0cy9wbmdzdGVzdC1ub25lIHRlc3RzL3BuZ3N0ZXN0LW5vbmUtYWxwaGFcCisgICB0ZXN0cy9wbmdzdGVzdC1zUkdCIHRlc3RzL3BuZ3N0ZXN0LXNSR0ItYWxwaGEgdGVzdHMvcG5ndW5rbm93bi1JREFUXAorICAgdGVzdHMvcG5ndW5rbm93bi1kaXNjYXJkIHRlc3RzL3BuZ3Vua25vd24taWYtc2FmZSB0ZXN0cy9wbmd1bmtub3duLXNBUElcCisgICB0ZXN0cy9wbmd1bmtub3duLXNURVIgdGVzdHMvcG5ndW5rbm93bi1zYXZlIHRlc3RzL3BuZ3Vua25vd24tdnBBZ1wKKyAgIHRlc3RzL3BuZ2ltYWdlLXF1aWNrIHRlc3RzL3BuZ2ltYWdlLWZ1bGwKKworIyBtYW4gcGFnZXMKK2Rpc3RfbWFuX01BTlM9IGxpYnBuZy4zIGxpYnBuZ3BmLjMgcG5nLjUKKworIyBnZW5lcmF0ZSB0aGUgLWNvbmZpZyBzY3JpcHRzIGlmIHJlcXVpcmVkCitiaW5jb25maWdzPSBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JALWNvbmZpZworRVhUUkFfU0NSSVBUUz0gbGlicG5nLWNvbmZpZyBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JALWNvbmZpZworYmluX1NDUklQVFM9IEBiaW5jb25maWdzQAorCisjIHJ1bGVzIHRvIGJ1aWxkIGxpYnBuZywgb25seSBidWlsZCB0aGUgb2xkIGxpYnJhcnkgb24gcmVxdWVzdAorbGliX0xUTElCUkFSSUVTPWxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAubGEKKyMgRVhUUkFfTFRMSUJSQVJJRVM9IGxpYnBuZy5sYQorbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9TT1VSQ0VTID0gcG5nLmMgcG5nZXJyb3IuY1wKKwlwbmdnZXQuYyBwbmdtZW0uYyBwbmdwcmVhZC5jIHBuZ3JlYWQuYyBwbmdyaW8uYyBwbmdydHJhbi5jIHBuZ3J1dGlsLmNcCisJcG5nc2V0LmMgcG5ndHJhbnMuYyBwbmd3aW8uYyBwbmd3cml0ZS5jIHBuZ3d0cmFuLmMgcG5nd3V0aWwuY1wKKwlwbmcuaCBwbmdjb25mLmggcG5nZGVidWcuaCBwbmdpbmZvLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ3Vzci5kZmEKKworaWYgUE5HX0FSTV9ORU9OCitsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhX1NPVVJDRVMgKz0gYXJtL2FybV9pbml0LmNcCisJYXJtL2ZpbHRlcl9uZW9uLlMgYXJtL2ZpbHRlcl9uZW9uX2ludHJpbnNpY3MuYworZW5kaWYKKworbm9kaXN0X2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGFfU09VUkNFUyA9IHBuZ2xpYmNvbmYuaAorCitsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhX0xERkxBR1MgPSAtbm8tdW5kZWZpbmVkIC1leHBvcnQtZHluYW1pYyBcCisJLXZlcnNpb24tbnVtYmVyIEBQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkA6QFBOR0xJQl9SRUxFQVNFQDowCisKK2lmIEhBVkVfTERfVkVSU0lPTl9TQ1JJUFQKKyMgICBWZXJzaW9uZWQgc3ltYm9scyBhbmQgcmVzdHJpY3RlZCBleHBvcnRzCitpZiBIQVZFX1NPTEFSSVNfTEQKKyAgbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9MREZMQUdTICs9IC1XbCwtTSAtV2wsbGlicG5nLnZlcnMKK2Vsc2UKKyAgbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9MREZMQUdTICs9IC1XbCwtLXZlcnNpb24tc2NyaXB0PWxpYnBuZy52ZXJzCitlbmRpZgorCisgIGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGFfREVQRU5ERU5DSUVTID0gbGlicG5nLnZlcnMKK2Vsc2UKKyMgICBPbmx5IHJlc3RyaWN0ZWQgZXhwb3J0cyB3aGVuIHBvc3NpYmxlCisgIGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGFfTERGTEFHUyArPSAtZXhwb3J0LXN5bWJvbHMgbGlicG5nLnN5bQorICBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhX0RFUEVOREVOQ0lFUyA9IGxpYnBuZy5zeW0KK2VuZGlmCisKKyNkaXN0cmlidXRlIGhlYWRlcnMgaW4gL3Vzci9pbmNsdWRlL2xpYnBuZy8qCitwa2dpbmNsdWRlZGlyPSAkKGluY2x1ZGVkaXIpLyQoUE5HTElCX0JBU0VOQU1FKQorcGtnaW5jbHVkZV9IRUFERVJTPSBwbmcuaCBwbmdjb25mLmgKK25vZGlzdF9wa2dpbmNsdWRlX0hFQURFUlM9IHBuZ2xpYmNvbmYuaAorCisjIHBrZy1jb25maWcgc3R1ZmYsIG5vdGUgdGhhdCBsaWJwbmcucGMgaXMgYWx3YXlzIHJlcXVpcmVkIGluIG9yZGVyCisjIHRvIGdldCB0aGUgY29ycmVjdCBsaWJyYXJ5Citwa2djb25maWdkaXIgPSBAcGtnY29uZmlnZGlyQAorcGtnY29uZmlnX0RBVEEgPSBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JALnBjCisKKyMgRXh0cmEgc291cmNlIGRpc3RyaWJ1dGlvbiBmaWxlcywgJyR7c3JjZGlyfScgaXMgdXNlZCBiZWxvdyB0byBzdG9wIGJ1aWxkIGZpbGVzCisjIGZyb20gdGhvc2UgZGlyZWN0b3JpZXMgYmVpbmcgaW5jbHVkZWQuICBUaGlzIG9ubHkgd29ya3MgaWYgdGhlIGNvbmZpZ3VyZSBpcworIyBub3QgZG9uZSBpbiB0aGUgc291cmNlIGRpcmVjdG9yeSEKK0VYVFJBX0RJU1Q9IFwKKwlBTk5PVU5DRSBDSEFOR0VTIElOU1RBTEwgTElDRU5TRSBSRUFETUUgVE9ETyBcCisJcG5ndGVzdC5wbmcgcG5nYmFyLnBuZyBwbmdub3cucG5nIHBuZ2Jhci5qcGcgYXV0b2dlbi5zaCBcCisJJHtzcmNkaXJ9L2NvbnRyaWIgJHtzcmNkaXJ9L3Byb2plY3RzICR7c3JjZGlyfS9zY3JpcHRzIFwKKwkkKFRFU1RTKSAkKFhGQUlMX1RFU1RTKSB0ZXN0cy9wbmdzdGVzdCBcCisJQ01ha2VMaXN0cy50eHQgZXhhbXBsZS5jIGxpYnBuZy1tYW51YWwudHh0CisKK1NDUklQVF9DTEVBTkZJTEVTPXNjcmlwdHMvKi5vdXQgc2NyaXB0cy8qLmNoaworCitDTEVBTkZJTEVTPSAqLnRmPyBwbmdvdXQucG5nIGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAucGMgXAorCWxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAtY29uZmlnIGxpYnBuZy52ZXJzIGxpYnBuZy5zeW0gXAorCWNoZWNrLm5ldyBwbmdsaWJjb25mLmggcG5ncHJlZml4Lmggc3ltYm9scy5uZXcgcG5ndGVzdC1sb2cudHh0IFwKKwlwbmdsaWJjb25mLm91dCBwbmdsaWJjb25mLmMgcG5nbGliY29uZi5wcmUgcG5nbGliY29uZi5kZm4gXAorCSQoU0NSSVBUX0NMRUFORklMRVMpCisKK01BSU5UQUlORVJDTEVBTkZJTEVTID0gTWFrZWZpbGUuaW4gYWNsb2NhbC5tNCBjb25maWcuZ3Vlc3MgY29uZmlnLmguaW4gXAorY29uZmlnLnN1YiBjb25maWd1cmUgZGVwY29tcCBpbnN0YWxsLXNoIGx0bWFpbi5zaCBtaXNzaW5nCisKKyMgUE5HX0NPUFRTIGdpdmUgZXh0cmEgb3B0aW9ucyBmb3IgdGhlIEMgY29tcGlsZXIgdG8gYmUgdXNlZCBvbiBhbGwgY29tcGlsYXRpb24KKyMgc3RlcHMgKHVubGVzcyB0YXJnZV9DRkxBR1MgaXMgc3BlY2lmaWVkOyB0aGF0IHdpbGwgdGFrZSBwcmVjZWRlbmNlIG92ZXIKKyMgQU1fQ0ZMQUdTKQorUE5HX0NPUFRTID0gQFBOR19DT1BUU0AKK0FNX0NGTEFHUyA9ICR7UE5HX0NPUFRTfQorCisjIERGTkNQUCBpcyBub3JtYWxseSBqdXN0IENQUCAtIHRoZSBDIHByZXByb2Nlc3NvciAtIGJ1dCBvbiBTb2xhcmlzIGFuZCBtYXliZQorIyBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcyAoTmVYVD8pIHRoZSBDIHByZXByb2Nlc3NvciBzZWxlY3RlZCBieSBjb25maWd1cmUKKyMgY2hlY2tzIGlucHV0IHRva2VucyBmb3IgdmFsaWRpdHkgLSBlZmZlY3RpdmVseSBpdCBwZXJmb3JtcyBwYXJ0IG9mIHRoZSBBTlNJLUMKKyMgcGFyc2luZyAtIGFuZCB0aGVyZWZvcmUgZmFpbHMgd2l0aCB0aGUgLmRmIGZpbGVzLiAgY29uZmlndXJlLmFjIGhhcyBzcGVjaWFsCisjIGNoZWNrcyBmb3IgdGhpcyBhbmQgc2V0cyBERk5DUFAgYXBwcm9wcmlhdGVseS4KK0RGTkNQUCA9IEBERk5DUFBACisKK1NVRkZJWEVTID0gLmNoayAub3V0CisKKyQoUE5HTElCX0JBU0VOQU1FKS5wYzogbGlicG5nLnBjCisJY3AgbGlicG5nLnBjICRACisKKyQoUE5HTElCX0JBU0VOQU1FKS1jb25maWc6IGxpYnBuZy1jb25maWcKKwljcCBsaWJwbmctY29uZmlnICRACisKK3NjcmlwdHMvc3ltLm91dCBzY3JpcHRzL3ZlcnMub3V0OiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCitzY3JpcHRzL3ByZWZpeC5vdXQ6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLm91dAorc2NyaXB0cy9zeW1ib2xzLm91dDogcG5nLmggcG5nY29uZi5oICQoc3JjZGlyKS9zY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdAorc2NyaXB0cy9pbnRwcmVmaXgub3V0OiBwbmdsaWJjb25mLmgKKworbGlicG5nLnN5bTogc2NyaXB0cy9zeW0ub3V0CisJcm0gLWYgJEAKKwljcCAkPyAkQAorbGlicG5nLnZlcnM6IHNjcmlwdHMvdmVycy5vdXQKKwlybSAtZiAkQAorCWNwICQ/ICRACisKK2lmIERPX1BOR19QUkVGSVgKKyMgUmVuYW1lIGZ1bmN0aW9ucyBpbiBzY3JpcHRzL3ByZWZpeC5vdXQgd2l0aCBhIFBOR19QUkVGSVggcHJlZml4LgorIyBSZW5hbWUgbWFjcm9zIGluIHNjcmlwdHMvbWFjcm8ubHN0IGZyb20gUE5HX1BSRUZJWHBuZ18gdG8gUE5HXyAodGhlIGFjdHVhbAorIyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbWFjcm8pLgorcG5nbGliY29uZi5oOiBwbmdsaWJjb25mLm91dCBzY3JpcHRzL3ByZWZpeC5vdXQgc2NyaXB0cy9tYWNyby5sc3QKKwlybSAtZiAkQAorCSQoQVdLKSAncz09MCAmJiBOUj4xe3ByaW50IHByZXZ9XAorCSAgIHM9PTB7cHJldj0kJDB9XAorCSAgIHM9PTF7cHJpbnQgIiNkZWZpbmUiLCAkJDEsICJAUE5HX1BSRUZJWEAiICQkMX1cCisJICAgcz09MntwcmludCAiI2RlZmluZSBAUE5HX1BSRUZJWEBwbmdfIiAkJDEsICJQTkdfIiAkJDF9XAorCSAgIEVORHtwcmludCBwcmV2fScgcz0wIHBuZ2xpYmNvbmYub3V0IHM9MSBzY3JpcHRzL3ByZWZpeC5vdXRcCisJICAgcz0yICR7c3JjZGlyfS9zY3JpcHRzL21hY3JvLmxzdCA+cG5nbGliY29uZi50ZjgKKwltdiBwbmdsaWJjb25mLnRmOCAkQAorCitwbmdwcmVmaXguaDogc2NyaXB0cy9pbnRwcmVmaXgub3V0CisJcm0gLWYgcG5ncHJlZml4LnRmMQorCSQoQVdLKSAne3ByaW50ICIjZGVmaW5lIiwgJCQxLCAiQFBOR19QUkVGSVhAIiAkJDF9JyAkPyA+cG5ncHJlZml4LnRmMQorCW12IHBuZ3ByZWZpeC50ZjEgJEAKK2Vsc2UKK3BuZ2xpYmNvbmYuaDogcG5nbGliY29uZi5vdXQKKwlybSAtZiAkQAorCWNwICQ/ICRACisKK3BuZ3ByZWZpeC5oOiAjIGlzIGVtcHR5CisJOj4kQAorZW5kaWYKKworJChzcmNkaXIpL3NjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0OgorCUBlY2hvICJBdHRlbXB0aW5nIHRvIGJ1aWxkICRAIiA+JjIKKwlAZWNobyAiVGhpcyBpcyBhIG1hY2hpbmUgZ2VuZXJhdGVkIGZpbGUsIGJ1dCBpZiB5b3Ugd2FudCB0byBtYWtlIiA+JjIKKwlAZWNobyAiYSBuZXcgb25lIHNpbXBseSBtYWtlICdzY3JpcHRzL3BuZ2xpYmNvbmYub3V0JywgY29weSB0aGF0IiA+JjIKKwlAZWNobyAiQU5EIHNldCBQTkdfWkxJQl9WRVJOVU0gdG8gMCAoeW91IE1VU1QgZG8gdGhpcykiID4mMgorCUBleGl0IDEKKworIyBUaGUgZm9sbG93aW5nIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhhdCB0aGUgbG9jYWwgcG5nbGliY29uZi5oIGlzIHVzZWQsIG5vdAorIyBhbiBpbnN0YWxsZWQgb25lICh0aGlzIGNhbiBoYXBwZW4gaW1tZWRpYXRlbHkgYWZ0ZXIgb24gYSBjbGVhbiBzeXN0ZW0gaWYKKyMgJ21ha2UgdGVzdCcgaXMgdGhlIGZpcnN0IHRoaW5nIHRoZSB1c2VyIGRvZXMuKSAgT25seSBmaWxlcyB3aGljaCBpbmNsdWRlCisjIG9uZSBvZiB0aGUgcG5nIHNvdXJjZSBmaWxlcyAodHlwaWNhbGx5IHBuZy5oIG9yIHBuZ3ByaXYuaCkgbmVlZCB0byBiZSBsaXN0ZWQKKyMgaGVyZToKK3BuZ3Rlc3QubzogcG5nbGliY29uZi5oCisKK2NvbnRyaWIvbGlidGVzdHMvbWFrZXBuZy5vOiBwbmdsaWJjb25mLmgKK2NvbnRyaWIvbGlidGVzdHMvcG5nc3Rlc3QubzogcG5nbGliY29uZi5oCitjb250cmliL2xpYnRlc3RzL3BuZ3Vua25vd24ubzogcG5nbGliY29uZi5oCitjb250cmliL2xpYnRlc3RzL3BuZ2ltYWdlLm86IHBuZ2xpYmNvbmYuaAorY29udHJpYi9saWJ0ZXN0cy9wbmd2YWxpZC5vOiBwbmdsaWJjb25mLmgKK2NvbnRyaWIvbGlidGVzdHMvcmVhZHBuZy5vOiBwbmdsaWJjb25mLmgKK2NvbnRyaWIvbGlidGVzdHMvdGFyaXRoLm86IHBuZ2xpYmNvbmYuaAorY29udHJpYi9saWJ0ZXN0cy90aW1lcG5nLm86IHBuZ2xpYmNvbmYuaAorCitjb250cmliL3Rvb2xzL21ha2VzUkdCLm86IHBuZ2xpYmNvbmYuaAorY29udHJpYi90b29scy9wbmdmaXgubzogcG5nbGliY29uZi5oCisKKyMgV2UgbXVzdCB1c2UgLURQTkdfTk9fVVNFX1JFQURfTUFDUk9TIGhlcmUgZXZlbiB3aGVuIHRoZSBsaWJyYXJ5IG1heSBhY3R1YWxseQorIyBiZSBidWlsdCB3aXRoIFBOR19VU0VfUkVBRF9NQUNST1M7IHRoaXMgcHJldmVudHMgdGhlIHJlYWQgbWFjcm9zIGZyb20KKyMgaW50ZXJmZXJpbmcgd2l0aCB0aGUgc3ltYm9sIGZpbGUgZm9ybWF0LgorU1lNQk9MX0NGTEFHUyA9IC1EUE5HTElCX0xJQk5BTUU9J1BOR0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfMCdcCisJCS1EUE5HTElCX1ZFUlNJT049J0BQTkdMSUJfVkVSU0lPTkAnXAorCQktRFNZTUJPTF9QUkVGSVg9JyQoU1lNQk9MX1BSRUZJWCknXAorCQktRFBOR19OT19VU0VfUkVBRF9NQUNST1MgLURQTkdfQlVJTERJTkdfU1lNQk9MX1RBQkxFCisKK2lmIERPX1BOR19QUkVGSVgKK1NZTUJPTF9DRkxBR1MgKz0gLURQTkdfUFJFRklYPSdAUE5HX1BSRUZJWEAnCitlbmRpZgorCisuYy5vdXQ6CisJcm0gLWYgJEAgJCoudGZbMTJdCisJdGVzdCAtZCBzY3JpcHRzIHx8IG1rZGlyIHNjcmlwdHMgfHwgdGVzdCAtZCBzY3JpcHRzCisJJChERk5DUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKVwKKwkgICAgJChDUFBGTEFHUykgJChTWU1CT0xfQ0ZMQUdTKSAkPCA+ICQqLnRmMQorCSQoQVdLKSAtZiAiJHtzcmNkaXJ9L3NjcmlwdHMvZGZuLmF3ayIgb3V0PSIkKi50ZjIiICQqLnRmMSAxPiYyCisJcm0gLWYgJCoudGYxCisJbXYgJCoudGYyICRACisKKyMgVGhlIC5jIGZpbGUgZm9yIHBuZ2xpYmNvbmYuaCBpcyBtYWNoaW5lIGdlbmVyYXRlZAorcG5nbGliY29uZi5jOiBzY3JpcHRzL3BuZ2xpYmNvbmYuZGZhIHNjcmlwdHMvb3B0aW9ucy5hd2sgcG5nY29uZi5oIHBuZ3Vzci5kZmEgJChERkFfWFRSQSkKKwlybSAtZiAkQCAkKi50Zls0NV0KKwkkKEFXSykgLWYgJHtzcmNkaXJ9L3NjcmlwdHMvb3B0aW9ucy5hd2sgb3V0PSQqLnRmNCB2ZXJzaW9uPXNlYXJjaFwKKwkgICAgJHtzcmNkaXJ9L3BuZ2NvbmYuaCAke3NyY2Rpcn0vc2NyaXB0cy9wbmdsaWJjb25mLmRmYVwKKwkgICAgJHtzcmNkaXJ9L3BuZ3Vzci5kZmEgJChERkFfWFRSQSkgMT4mMgorCSQoQVdLKSAtZiAke3NyY2Rpcn0vc2NyaXB0cy9vcHRpb25zLmF3ayBvdXQ9JCoudGY1ICQqLnRmNCAxPiYyCisJcm0gJCoudGY0CisJbXYgJCoudGY1ICRACisKKyMgU3ltYm9sIGNoZWNrcyAoLmRlZiBhbmQgLm91dCBmaWxlcyBzaG91bGQgbWF0Y2gpCitzY3JpcHRzL3N5bWJvbHMuY2hrOiBzY3JpcHRzL2NoZWNrc3ltLmF3ayBzY3JpcHRzL3N5bWJvbHMuZGVmIHNjcmlwdHMvc3ltYm9scy5vdXQKKworLm91dC5jaGs6CisJcm0gLWYgJEAgJCoubmV3CisJJChBV0spIC1mICR7c3JjZGlyfS9zY3JpcHRzL2NoZWNrc3ltLmF3ayAke3NyY2Rpcn0vc2NyaXB0cy8keypGfS5kZWZcCisJICAgIG9mPSIkKi5uZXciICQ8ID4mMgorCW12ICQqLm5ldyAkQAorCisjIHVzZWQgb24gZGVtYW5kIHRvIHJlZ2VuZXJhdGUgdGhlIHN0YW5kYXJkIGhlYWRlciwgQ1BQRkxBR1Mgc2hvdWxkCisjIGJlIGVtcHR5IC0gbm8gbm9uLXN0YW5kYXJkIGRlZmluZXMKK3NjcmlwdHMvcG5nbGliY29uZi5jOiBzY3JpcHRzL3BuZ2xpYmNvbmYuZGZhIHNjcmlwdHMvb3B0aW9ucy5hd2sgcG5nY29uZi5oCisJcm0gLWYgJEAgcG5nbGliY29uZi50Zls2N10KKwl0ZXN0IC16ICIkKENQUEZMQUdTKSIKKwllY2hvICJjb20gQFBOR0xJQl9WRVJTSU9OQCBTVEFOREFSRCBBUEkgREVGSU5JVElPTiIgfFwKKwkkKEFXSykgLWYgJHtzcmNkaXJ9L3NjcmlwdHMvb3B0aW9ucy5hd2sgb3V0PXBuZ2xpYmNvbmYudGY2XAorCSAgICBsb2d1bnN1cHBvcnRlZD0xIHZlcnNpb249c2VhcmNoICR7c3JjZGlyfS9wbmdjb25mLmggLVwKKwkgICAgJHtzcmNkaXJ9L3NjcmlwdHMvcG5nbGliY29uZi5kZmEgMT4mMgorCSQoQVdLKSAtZiAke3NyY2Rpcn0vc2NyaXB0cy9vcHRpb25zLmF3ayBvdXQ9cG5nbGliY29uZi50ZjdcCisJICAgIHBuZ2xpYmNvbmYudGY2IDE+JjIKKwlybSBwbmdsaWJjb25mLnRmNgorCW12IHBuZ2xpYmNvbmYudGY3ICRACisKKyQobGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9PQkpFQ1RTKTogcG5nLmggcG5nY29uZi5oIFwKKwlwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ2RlYnVnLmggcG5naW5mby5oIHBuZ3N0cnVjdC5oIHBuZ3ByZWZpeC5oCisKK3Rlc3Q6IGNoZWNrLWFtCisKKyMgRXh0cmEgY2hlY2tzCitjaGVjazogc2NyaXB0cy9zeW1ib2xzLmNoaworCisjIERvbid0IGRpc3RyaWJ1dGUgdGhlIGdlbmVyYXRlZCBzY3JpcHQgZmlsZXMKK2Rpc3QtaG9vazoKKwljZCAnJCh0b3BfZGlzdGRpciknOyBybSAtZiAkKFNDUklQVF9DTEVBTkZJTEVTKQorCisjIE1ha2UgbGlua3MgYmV0d2VlbiBpbnN0YWxsZWQgZmlsZXMgd2l0aCByZWxlYXNlLXNwZWNpZmljIG5hbWVzIGFuZCB0aGUgZ2VuZXJpYworIyBmaWxlIG5hbWVzLiAgSWYgdGhpcyBpbnN0YWxsIHJ1bGUgaXMgcnVuIHRoZSBnZW5lcmljIG5hbWVzIHdpbGwgYmUgZGVsZXRlZCBhbmQKKyMgcmVjcmVhdGVkIC0gdGhpcyBoYXMgb2J2aW91cyBpc3N1ZXMgZm9yIHN5c3RlbXMgd2l0aCBtdWx0aXBsZSBpbnN0YWxsYXRpb25zLgorCitpbnN0YWxsLWhlYWRlci1saW5rczoKKwlAc2V0IC1leDsgY2QgJyQoREVTVERJUikkKGluY2x1ZGVkaXIpJzsgZm9yIGYgaW4gJChIRUFERVJTKTsgZG8gXAorCSAgIHJtIC1mICIkJGYiOyAkKExOX1MpICIkKFBOR0xJQl9CQVNFTkFNRSkvJCRmIiAiJCRmIjsgZG9uZQorCit1bmluc3RhbGwtaGVhZGVyLWxpbmtzOgorCWNkICckKERFU1RESVIpJChpbmNsdWRlZGlyKSc7IHJtIC1mICQoSEVBREVSUykKKworaW5zdGFsbC1saWJwbmctcGM6CisJQHNldCAtZXg7IGNkICckKERFU1RESVIpJChwa2djb25maWdkaXIpJzsgcm0gLWYgbGlicG5nLnBjOyBcCisJICAgJChMTl9TKSAnJChQTkdMSUJfQkFTRU5BTUUpLnBjJyBsaWJwbmcucGMKKwordW5pbnN0YWxsLWxpYnBuZy1wYzoKKwlybSAtZiAnJChERVNURElSKSQocGtnY29uZmlnZGlyKS9saWJwbmcucGMnCisKKyMgRVhUX0xJU1QgaXMgYSBsaXN0IG9mIHRoZSBwb3NzaWJseSBsaWJyYXJ5IGRpcmVjdG9yeSBleHRlbnNpb25zLCB0aGlzIGV4aXN0cworIyBiZWNhdXNlIHdlIGNhbid0IGZpbmQgYSBnb29kIHdheSBvZiBkaXNjb3ZlcmluZyB0aGUgZmlsZSBleHRlbnNpb25zIHRoYXQgYXJlCisjIGFjdHVhbGx5IGluc3RhbGxlZCBvbiBhIGdpdmVuIHN5c3RlbSwgc28gaW5zdGVhZCB3ZSBjaGVjayBmb3IgZXZlcnkgZXh0ZW5zaW9uCisjIHdlIGhhdmUgc2Vlbi4KKworRVhUX0xJU1QgPSBhIGRsbC5hIHNvIHNvLkBQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAuQFBOR0xJQl9SRUxFQVNFQCBsYSBzbCBkeWxpYgorCitpbnN0YWxsLWxpYnJhcnktbGlua3M6CisJQHNldCAteDsgY2QgJyQoREVTVERJUikkKGxpYmRpciknO1wKKwlmb3IgZXh0IGluICQoRVhUX0xJU1QpOyBkb1wKKwkgICBybSAtZiAibGlicG5nLiQkZXh0IjtcCisgICAgICAgICAgIGlmIHRlc3QgLWYgIiQoUE5HTElCX0JBU0VOQU1FKS4kJGV4dCI7IHRoZW5cCisgICAgICAgICAgICAgICQoTE5fUykgIiQoUE5HTElCX0JBU0VOQU1FKS4kJGV4dCIgImxpYnBuZy4kJGV4dCIgfHwgZXhpdCAxO1wKKyAgICAgICAgICAgZmk7XAorCWRvbmUKKwordW5pbnN0YWxsLWxpYnJhcnktbGlua3M6CisJQHNldCAteDsgY2QgJyQoREVTVERJUikkKGxpYmRpciknOyBmb3IgZXh0IGluICQoRVhUX0xJU1QpOyBkb1wKKwkgICBybSAtZiAibGlicG5nLiQkZXh0IjsgZG9uZQorCitpbnN0YWxsLWxpYnBuZy1jb25maWc6CisJQHNldCAtZXg7IGNkICckKERFU1RESVIpJChiaW5kaXIpJzsgcm0gLWYgbGlicG5nLWNvbmZpZzsgXAorCSAgICQoTE5fUykgJyQoUE5HTElCX0JBU0VOQU1FKS1jb25maWcnIGxpYnBuZy1jb25maWcKKwordW5pbnN0YWxsLWxpYnBuZy1jb25maWc6CisJcm0gLWYgJyQoREVTVERJUikkKGJpbmRpcikvbGlicG5nLWNvbmZpZycKKworaWYgRE9fSU5TVEFMTF9MSU5LUworIyBJZiAtLWVuYWJsZS11bnZlcnNpb25lZC1saW5rcyBpcyBzcGVjaWZpZWQgdGhlIGhlYWRlciBhbmQgbGliIGZpbGUgbGlua3MKKyMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IG1hZGUgb24gYSAnbWFrZSBpbnN0YWxsJzoKKworaW5zdGFsbC1kYXRhLWhvb2s6IGluc3RhbGwtaGVhZGVyLWxpbmtzCit1bmluc3RhbGwtaG9vazogdW5pbnN0YWxsLWhlYWRlci1saW5rcworaW5zdGFsbC1leGVjLWhvb2s6IGluc3RhbGwtbGlicmFyeS1saW5rcwordW5pbnN0YWxsLWhvb2s6IHVuaW5zdGFsbC1saWJyYXJ5LWxpbmtzCitlbmRpZgorCitpZiBET19JTlNUQUxMX0xJQlBOR19QQworIyBMaWtld2lzZSwgLS1pbnN0YWxsLXBjIGNhdXNlcyBsaWJwbmcucGMgdG8gYmUgY29uc3RydWN0ZWQ6CisKK2luc3RhbGwtZGF0YS1ob29rOiBpbnN0YWxsLWxpYnBuZy1wYwordW5pbnN0YWxsLWhvb2s6IHVuaW5zdGFsbC1saWJwbmctcGMKK2VuZGlmCisKK2lmIERPX0lOU1RBTExfTElCUE5HX0NPTkZJRworIyBBbmQgLS1pbnN0YWxsLWNvbmZpZzoKKworaW5zdGFsbC1leGVjLWhvb2s6IGluc3RhbGwtbGlicG5nLWNvbmZpZwordW5pbnN0YWxsLWhvb2s6IHVuaW5zdGFsbC1saWJwbmctY29uZmlnCitlbmRpZgorCisjIFRoZSBmb2xsb3dpbmcgYWRkaXRpb24gZW5zdXJlcyB0aGF0ICdtYWtlIGFsbCcgYWx3YXlzIGJ1aWxkcyB0aGUgdGVzdCBwcm9ncmFtcworIyB0b28uICBJdCB1c2VkIHRvLCBidXQgc29tZSBjaGFuZ2UgZWl0aGVyIGluIGxpYnBuZyBvciBjb25maWd1cmUgc3RvcHBlZCB0aGlzCisjIHdvcmtpbmcuCithbGwtYW06ICQoY2hlY2tfUFJPR1JBTVMpCmRpZmYgLS1naXQgYS9saWJwbmcvTk9USUNFIGIvbGlicG5nL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWY2ZmZlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL05PVElDRQpAQCAtMCwwICsxLDExMiBAQAorCitUaGlzIGNvcHkgb2YgdGhlIGxpYnBuZyBub3RpY2VzIGlzIHByb3ZpZGVkIGZvciB5b3VyIGNvbnZlbmllbmNlLiAgSW4gY2FzZSBvZgorYW55IGRpc2NyZXBhbmN5IGJldHdlZW4gdGhpcyBjb3B5IGFuZCB0aGUgbm90aWNlcyBpbiB0aGUgZmlsZSBwbmcuaCB0aGF0IGlzCitpbmNsdWRlZCBpbiB0aGUgbGlicG5nIGRpc3RyaWJ1dGlvbiwgdGhlIGxhdHRlciBzaGFsbCBwcmV2YWlsLgorCitDT1BZUklHSFQgTk9USUNFLCBESVNDTEFJTUVSLCBhbmQgTElDRU5TRToKKworSWYgeW91IG1vZGlmeSBsaWJwbmcgeW91IG1heSBpbnNlcnQgYWRkaXRpb25hbCBub3RpY2VzIGltbWVkaWF0ZWx5IGZvbGxvd2luZwordGhpcyBzZW50ZW5jZS4KKworVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKworbGlicG5nIHZlcnNpb25zIDEuMC43LCBKdWx5IDEsIDIwMDAsIHRocm91Z2ggMS42LjE5LCBOb3ZlbWJlciAxMiwgMjAxNSwgYXJlCitDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiwgMjAwNCwgMjAwNi0yMDE1IEdsZW5uIFJhbmRlcnMtUGVocnNvbiwgYXJlCitkZXJpdmVkIGZyb20gbGlicG5nLTEuMC42LCBhbmQgYXJlIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZQorZGlzY2xhaW1lciBhbmQgbGljZW5zZSBhcyBsaWJwbmctMS4wLjYgd2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWxzCithZGRlZCB0byB0aGUgbGlzdCBvZiBDb250cmlidXRpbmcgQXV0aG9yczoKKworICAgU2ltb24tUGllcnJlIENhZGlldXgKKyAgIEVyaWMgUy4gUmF5bW9uZAorICAgTWFucyBSdWxsZ2FyZAorICAgQ29zbWluIFRydXRhCisgICBHaWxsZXMgVm9sbGFudAorICAgSmFtZXMgWXUKKworYW5kIHdpdGggdGhlIGZvbGxvd2luZyBhZGRpdGlvbnMgdG8gdGhlIGRpc2NsYWltZXI6CisKKyAgIFRoZXJlIGlzIG5vIHdhcnJhbnR5IGFnYWluc3QgaW50ZXJmZXJlbmNlIHdpdGggeW91ciBlbmpveW1lbnQgb2YgdGhlCisgICBsaWJyYXJ5IG9yIGFnYWluc3QgaW5mcmluZ2VtZW50LiAgVGhlcmUgaXMgbm8gd2FycmFudHkgdGhhdCBvdXIKKyAgIGVmZm9ydHMgb3IgdGhlIGxpYnJhcnkgd2lsbCBmdWxmaWxsIGFueSBvZiB5b3VyIHBhcnRpY3VsYXIgcHVycG9zZXMKKyAgIG9yIG5lZWRzLiAgVGhpcyBsaWJyYXJ5IGlzIHByb3ZpZGVkIHdpdGggYWxsIGZhdWx0cywgYW5kIHRoZSBlbnRpcmUKKyAgIHJpc2sgb2Ygc2F0aXNmYWN0b3J5IHF1YWxpdHksIHBlcmZvcm1hbmNlLCBhY2N1cmFjeSwgYW5kIGVmZm9ydCBpcyB3aXRoCisgICB0aGUgdXNlci4KKworbGlicG5nIHZlcnNpb25zIDAuOTcsIEphbnVhcnkgMTk5OCwgdGhyb3VnaCAxLjAuNiwgTWFyY2ggMjAsIDIwMDAsIGFyZQorQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgR2xlbm4gUmFuZGVycy1QZWhyc29uLCBhcmUgZGVyaXZlZCBmcm9tCitsaWJwbmctMC45NiwgYW5kIGFyZSBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNhbWUgZGlzY2xhaW1lciBhbmQKK2xpY2Vuc2UgYXMgbGlicG5nLTAuOTYsIHdpdGggdGhlIGZvbGxvd2luZyBpbmRpdmlkdWFscyBhZGRlZCB0byB0aGUgbGlzdAorb2YgQ29udHJpYnV0aW5nIEF1dGhvcnM6CisKKyAgIFRvbSBMYW5lCisgICBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAgIFdpbGxlbSB2YW4gU2NoYWlrCisKK2xpYnBuZyB2ZXJzaW9ucyAwLjg5LCBKdW5lIDE5OTYsIHRocm91Z2ggMC45NiwgTWF5IDE5OTcsIGFyZQorQ29weXJpZ2h0IChjKSAxOTk2LTE5OTcgQW5kcmVhcyBEaWxnZXIsIGFyZSBkZXJpdmVkIGZyb20gbGlicG5nLTAuODgsCithbmQgYXJlIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzCitsaWJwbmctMC44OCwgd2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWxzIGFkZGVkIHRvIHRoZSBsaXN0IG9mCitDb250cmlidXRpbmcgQXV0aG9yczoKKworICAgSm9obiBCb3dsZXIKKyAgIEtldmluIEJyYWNleQorICAgU2FtIEJ1c2hlbGwKKyAgIE1hZ251cyBIb2xtZ3JlbgorICAgR3JlZyBSb2Vsb2ZzCisgICBUb20gVGFubmVyCisKK2xpYnBuZyB2ZXJzaW9ucyAwLjUsIE1heSAxOTk1LCB0aHJvdWdoIDAuODgsIEphbnVhcnkgMTk5NiwgYXJlCitDb3B5cmlnaHQgKGMpIDE5OTUtMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KKworRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGNvcHlyaWdodCBhbmQgbGljZW5zZSwgIkNvbnRyaWJ1dGluZyBBdXRob3JzIgoraXMgZGVmaW5lZCBhcyB0aGUgZm9sbG93aW5nIHNldCBvZiBpbmRpdmlkdWFsczoKKworICAgQW5kcmVhcyBEaWxnZXIKKyAgIERhdmUgTWFydGluZGFsZQorICAgR3V5IEVyaWMgU2NoYWxuYXQKKyAgIFBhdWwgU2NobWlkdAorICAgVGltIFdlZ25lcgorCitUaGUgUE5HIFJlZmVyZW5jZSBMaWJyYXJ5IGlzIHN1cHBsaWVkICJBUyBJUyIuICBUaGUgQ29udHJpYnV0aW5nIEF1dGhvcnMKK2FuZCBHcm91cCA0MiwgSW5jLiBkaXNjbGFpbSBhbGwgd2FycmFudGllcywgZXhwcmVzc2VkIG9yIGltcGxpZWQsCitpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBvZgorZml0bmVzcyBmb3IgYW55IHB1cnBvc2UuICBUaGUgQ29udHJpYnV0aW5nIEF1dGhvcnMgYW5kIEdyb3VwIDQyLCBJbmMuCithc3N1bWUgbm8gbGlhYmlsaXR5IGZvciBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHdoaWNoIG1heSByZXN1bHQgZnJvbSB0aGUgdXNlIG9mIHRoZSBQTkcKK1JlZmVyZW5jZSBMaWJyYXJ5LCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCitzb3VyY2UgY29kZSwgb3IgcG9ydGlvbnMgaGVyZW9mLCBmb3IgYW55IHB1cnBvc2UsIHdpdGhvdXQgZmVlLCBzdWJqZWN0Cit0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKworICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc291cmNlIGNvZGUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQuCisKKyAgMi4gQWx0ZXJlZCB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2ggYW5kIG11c3Qgbm90CisgICAgIGJlIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb3VyY2UuCisKKyAgMy4gVGhpcyBDb3B5cmlnaHQgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55CisgICAgIHNvdXJjZSBvciBhbHRlcmVkIHNvdXJjZSBkaXN0cmlidXRpb24uCisKK1RoZSBDb250cmlidXRpbmcgQXV0aG9ycyBhbmQgR3JvdXAgNDIsIEluYy4gc3BlY2lmaWNhbGx5IHBlcm1pdCwgd2l0aG91dAorZmVlLCBhbmQgZW5jb3VyYWdlIHRoZSB1c2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBhcyBhIGNvbXBvbmVudCB0bworc3VwcG9ydGluZyB0aGUgUE5HIGZpbGUgZm9ybWF0IGluIGNvbW1lcmNpYWwgcHJvZHVjdHMuICBJZiB5b3UgdXNlIHRoaXMKK3NvdXJjZSBjb2RlIGluIGEgcHJvZHVjdCwgYWNrbm93bGVkZ21lbnQgaXMgbm90IHJlcXVpcmVkIGJ1dCB3b3VsZCBiZQorYXBwcmVjaWF0ZWQuCisKK0VORCBPRiBDT1BZUklHSFQgTk9USUNFLCBESVNDTEFJTUVSLCBhbmQgTElDRU5TRS4KKworQSAicG5nX2dldF9jb3B5cmlnaHQiIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgZm9yIGNvbnZlbmllbnQgdXNlIGluICJhYm91dCIKK2JveGVzIGFuZCB0aGUgbGlrZToKKworICAgcHJpbnRmKCIlcyIsIHBuZ19nZXRfY29weXJpZ2h0KE5VTEwpKTsKKworQWxzbywgdGhlIFBORyBsb2dvIChpbiBQTkcgZm9ybWF0LCBvZiBjb3Vyc2UpIGlzIHN1cHBsaWVkIGluIHRoZQorZmlsZXMgInBuZ2Jhci5wbmciIGFuZCAicG5nYmFyLmpwZyAoODh4MzEpIGFuZCAicG5nbm93LnBuZyIgKDk4eDMxKS4KKworTGlicG5nIGlzIE9TSSBDZXJ0aWZpZWQgT3BlbiBTb3VyY2UgU29mdHdhcmUuICBPU0kgQ2VydGlmaWVkIE9wZW4gU291cmNlIGlzCithIGNlcnRpZmljYXRpb24gbWFyayBvZiB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4gT1NJIGhhcyBub3QgYWRkcmVzc2VkCit0aGUgYWRkaXRpb25hbCBkaXNjbGFpbWVycyBpbnNlcnRlZCBhdCB2ZXJzaW9uIDEuMC43LgorCitHbGVubiBSYW5kZXJzLVBlaHJzb24KK2dsZW5ucnAgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0CitOb3ZlbWJlciAxMiwgMjAxNQpkaWZmIC0tZ2l0IGEvbGlicG5nL1JFQURNRSBiL2xpYnBuZy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlmMWY5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9SRUFETUUKQEAgLTAsMCArMSwyMTUgQEAKK1JFQURNRSBmb3IgbGlicG5nIHZlcnNpb24gMS42LjIwIC0gRGVjZW1iZXIgMywgMjAxNSAoc2hhcmVkIGxpYnJhcnkgMTYuMCkKK1NlZSB0aGUgbm90ZSBhYm91dCB2ZXJzaW9uIG51bWJlcnMgbmVhciB0aGUgdG9wIG9mIHBuZy5oCisKK1NlZSBJTlNUQUxMIGZvciBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGluc3RhbGwgbGlicG5nLgorCitMaWJwbmcgY29tZXMgaW4gc2V2ZXJhbCBkaXN0cmlidXRpb24gZm9ybWF0cy4gIEdldCBsaWJwbmctKi50YXIuZ3ogb3IKK2xpYnBuZy0qLnRhci54eiBvciBpZiB5b3Ugd2FudCBVTklYLXN0eWxlIGxpbmUgZW5kaW5ncyBpbiB0aGUgdGV4dCBmaWxlcywKK29yIGxwbmcqLjd6IG9yIGxwbmcqLnppcCBpZiB5b3Ugd2FudCBET1Mtc3R5bGUgbGluZSBlbmRpbmdzLgorCitWZXJzaW9uIDAuODkgd2FzIHRoZSBmaXJzdCBvZmZpY2lhbCByZWxlYXNlIG9mIGxpYnBuZy4gIERvbid0IGxldCB0aGUKK2ZhY3QgdGhhdCBpdCdzIHRoZSBmaXJzdCByZWxlYXNlIGZvb2wgeW91LiAgVGhlIGxpYnBuZyBsaWJyYXJ5IGhhcyBiZWVuIGluCitleHRlbnNpdmUgdXNlIGFuZCB0ZXN0aW5nIHNpbmNlIG1pZC0xOTk1LiAgQnkgbGF0ZSAxOTk3IGl0IGhhZAorZmluYWxseSBnb3R0ZW4gdG8gdGhlIHN0YWdlIHdoZXJlIHRoZXJlIGhhZG4ndCBiZWVuIHNpZ25pZmljYW50CitjaGFuZ2VzIHRvIHRoZSBBUEkgaW4gc29tZSB0aW1lLCBhbmQgcGVvcGxlIGhhdmUgYSBiYWQgZmVlbGluZyBhYm91dAorbGlicmFyaWVzIHdpdGggdmVyc2lvbnMgPCAxLjAuICBWZXJzaW9uIDEuMC4wIHdhcyByZWxlYXNlZCBpbgorTWFyY2ggMTk5OC4KKworKioqKgorTm90ZSB0aGF0IHNvbWUgb2YgdGhlIGNoYW5nZXMgdG8gdGhlIHBuZ19pbmZvIHN0cnVjdHVyZSByZW5kZXIgdGhpcwordmVyc2lvbiBvZiB0aGUgbGlicmFyeSBiaW5hcnkgaW5jb21wYXRpYmxlIHdpdGggbGlicG5nLTAuODkgb3IKK2VhcmxpZXIgdmVyc2lvbnMgaWYgeW91IGFyZSB1c2luZyBhIHNoYXJlZCBsaWJyYXJ5LiAgVGhlIHR5cGUgb2YgdGhlCisiZmlsbGVyIiBwYXJhbWV0ZXIgZm9yIHBuZ19zZXRfZmlsbGVyKCkgaGFzIGNoYW5nZWQgZnJvbSBwbmdfYnl0ZSB0bworcG5nX3VpbnRfMzIsIHdoaWNoIHdpbGwgYWZmZWN0IHNoYXJlZC1saWJyYXJ5IGFwcGxpY2F0aW9ucyB0aGF0IHVzZQordGhpcyBmdW5jdGlvbi4KKworVG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBjaGFuZ2VzIHRvIHRoZSBpbnRlcm5hbHMgb2YgcG5nIGluZm9fc3RydWN0LAorbmV3IEFQSXMgaGF2ZSBiZWVuIG1hZGUgYXZhaWxhYmxlIGluIDAuOTUgdG8gYXZvaWQgZGlyZWN0IGFwcGxpY2F0aW9uCithY2Nlc3MgdG8gaW5mb19wdHIuICBUaGVzZSBmdW5jdGlvbnMgYXJlIHRoZSBwbmdfc2V0XzxjaHVuaz4gYW5kCitwbmdfZ2V0XzxjaHVuaz4gZnVuY3Rpb25zLiAgVGhlc2UgZnVuY3Rpb25zIHNob3VsZCBiZSB1c2VkIHdoZW4KK2FjY2Vzc2luZy9zdG9yaW5nIHRoZSBpbmZvX3N0cnVjdCBkYXRhLCByYXRoZXIgdGhhbiBtYW5pcHVsYXRpbmcgaXQKK2RpcmVjdGx5LCB0byBhdm9pZCBzdWNoIHByb2JsZW1zIGluIHRoZSBmdXR1cmUuCisKK0l0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlIEFQSXMgZGlkIG5vdCBtYWtlIGN1cnJlbnQgcHJvZ3JhbXMKK3RoYXQgYWNjZXNzIHRoZSBpbmZvIHN0cnVjdCBkaXJlY3RseSBpbmNvbXBhdGlibGUgd2l0aCB0aGUgbmV3CitsaWJyYXJ5LCB0aHJvdWdoIGxpYnBuZy0xLjIueC4gIEluIGxpYnBuZy0xLjQueCwgd2hpY2ggd2FzIG1lYW50IHRvCitiZSBhIHRyYW5zaXRpb25hbCByZWxlYXNlLCBtZW1iZXJzIG9mIHRoZSBwbmdfc3RydWN0IGFuZCB0aGUKK2luZm9fc3RydWN0IGNhbiBzdGlsbCBiZSBhY2Nlc3NlZCwgYnV0IHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGEKK3dhcm5pbmcgYWJvdXQgZGVwcmVjYXRlZCB1c2FnZS4gIFNpbmNlIGxpYnBuZy0xLjUuMCwgZGlyZWN0IGFjY2VzcwordG8gdGhlc2Ugc3RydWN0cyBpcyBub3QgYWxsb3dlZCwgYW5kIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgc3RydWN0cworcmVzaWRlIGluIHByaXZhdGUgcG5nc3RydWN0LmggYW5kIHBuZ2luZm8uaCBoZWFkZXIgZmlsZXMgdGhhdCBhcmUgbm90CithY2Nlc3NpYmxlIHRvIGFwcGxpY2F0aW9ucy4gIEl0IGlzIHN0cm9uZ2x5IHN1Z2dlc3RlZCB0aGF0IG5ldworcHJvZ3JhbXMgdXNlIHRoZSBuZXcgQVBJcyAoYXMgc2hvd24gaW4gZXhhbXBsZS5jIGFuZCBwbmd0ZXN0LmMpLCBhbmQKK29sZGVyIHByb2dyYW1zIGJlIGNvbnZlcnRlZCB0byB0aGUgbmV3IGZvcm1hdCwgdG8gZmFjaWxpdGF0ZSB1cGdyYWRlcworaW4gdGhlIGZ1dHVyZS4KKyoqKioKKworQWRkaXRpb25zIHNpbmNlIDAuOTAgaW5jbHVkZSB0aGUgYWJpbGl0eSB0byBjb21waWxlIGxpYnBuZyBhcyBhCitXaW5kb3dzIERMTCwgYW5kIG5ldyBBUElzIGZvciBhY2Nlc3NpbmcgZGF0YSBpbiB0aGUgaW5mbyBzdHJ1Y3QuCitFeHBlcmltZW50YWwgZnVuY3Rpb25zIGluY2x1ZGUgdGhlIGFiaWxpdHkgdG8gc2V0IHdlaWdodGluZyBhbmQgY29zdAorZmFjdG9ycyBmb3Igcm93IGZpbHRlciBzZWxlY3Rpb24sIGRpcmVjdCByZWFkcyBvZiBpbnRlZ2VycyBmcm9tIGJ1ZmZlcnMKK29uIGJpZy1lbmRpYW4gcHJvY2Vzc29ycyB0aGF0IHN1cHBvcnQgbWlzYWxpZ25lZCBkYXRhIGFjY2VzcywgZmFzdGVyCittZXRob2RzIG9mIGRvaW5nIGFscGhhIGNvbXBvc2l0aW9uLCBhbmQgbW9yZSBhY2N1cmF0ZSAxNi0+OCBiaXQgY29sb3IKK2NvbnZlcnNpb24uCisKK1RoZSBhZGRpdGlvbnMgc2luY2UgMC44OSBpbmNsdWRlIHRoZSBhYmlsaXR5IHRvIHJlYWQgZnJvbSBhIFBORyBzdHJlYW0KK3doaWNoIGhhcyBoYWQgc29tZSAob3IgYWxsKSBvZiB0aGUgc2lnbmF0dXJlIGJ5dGVzIHJlYWQgYnkgdGhlIGNhbGxpbmcKK2FwcGxpY2F0aW9uLiAgVGhpcyBhbHNvIGFsbG93cyB0aGUgcmVhZGluZyBvZiBlbWJlZGRlZCBQTkcgc3RyZWFtcyB0aGF0CitkbyBub3QgaGF2ZSB0aGUgUE5HIGZpbGUgc2lnbmF0dXJlLiAgQXMgd2VsbCwgaXQgaXMgbm93IHBvc3NpYmxlIHRvIHNldAordGhlIGxpYnJhcnkgYWN0aW9uIG9uIHRoZSBkZXRlY3Rpb24gb2YgY2h1bmsgQ1JDIGVycm9ycy4gIEl0IGlzIHBvc3NpYmxlCit0byBzZXQgZGlmZmVyZW50IGFjdGlvbnMgYmFzZWQgb24gd2hldGhlciB0aGUgQ1JDIGVycm9yIG9jY3VycmVkIGluIGEKK2NyaXRpY2FsIG9yIGFuIGFuY2lsbGFyeSBjaHVuay4KKworVGhlIGNoYW5nZXMgbWFkZSB0byB0aGUgbGlicmFyeSwgYW5kIGJ1Z3MgZml4ZWQgYXJlIGJhc2VkIG9uIGRpc2N1c3Npb25zCitvbiB0aGUgUE5HLWltcGxlbWVudCBtYWlsaW5nIGxpc3QgYW5kIG5vdCBvbiBtYXRlcmlhbCBzdWJtaXR0ZWQKK3ByaXZhdGVseSB0byBHdXksIEFuZHJlYXMsIG9yIEdsZW5uLiAgVGhleSB3aWxsIGZvcndhcmQgYW55IGdvb2QKK3N1Z2dlc3Rpb25zIHRvIHRoZSBsaXN0LgorCitGb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvbiB1c2luZyBsaWJwbmcsIHJlYWQgbGlicG5nLW1hbnVhbC50eHQuICBGb3IKK2V4YW1wbGVzIG9mIGxpYnBuZyBpbiBhIHByb2dyYW0sIHNlZSBleGFtcGxlLmMgYW5kIHBuZ3Rlc3QuYy4gIEZvciB1c2FnZQoraW5mb3JtYXRpb24gYW5kIHJlc3RyaWN0aW9ucyAod2hhdCBsaXR0bGUgdGhleSBhcmUpIG9uIGxpYnBuZywgc2VlCitwbmcuaC4gIEZvciBhIGRlc2NyaXB0aW9uIG9uIHVzaW5nIHpsaWIgKHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IHVzZWQgYnkKK2xpYnBuZykgYW5kIHpsaWIncyByZXN0cmljdGlvbnMsIHNlZSB6bGliLmgKKworSSBoYXZlIGluY2x1ZGVkIGEgZ2VuZXJhbCBtYWtlZmlsZSwgYXMgd2VsbCBhcyBzZXZlcmFsIG1hY2hpbmUgYW5kCitjb21waWxlciBzcGVjaWZpYyBvbmVzLCBidXQgeW91IG1heSBoYXZlIHRvIG1vZGlmeSBvbmUgZm9yIHlvdXIgb3duIG5lZWRzLgorCitZb3Ugc2hvdWxkIHVzZSB6bGliIDEuMC40IG9yIGxhdGVyIHRvIHJ1biB0aGlzLCBidXQgaXQgTUFZIHdvcmsgd2l0aAordmVyc2lvbnMgYXMgb2xkIGFzIHpsaWIgMC45NS4gIEV2ZW4gc28sIHRoZXJlIGFyZSBidWdzIGluIG9sZGVyIHpsaWIKK3ZlcnNpb25zIHdoaWNoIGNhbiBjYXVzZSB0aGUgb3V0cHV0IG9mIGludmFsaWQgY29tcHJlc3Npb24gc3RyZWFtcyBmb3IKK3NvbWUgaW1hZ2VzLiAgWW91IHdpbGwgZGVmaW5pdGVseSBuZWVkIHpsaWIgMS4wLjQgb3IgbGF0ZXIgaWYgeW91IGFyZQordGFraW5nIGFkdmFudGFnZSBvZiB0aGUgTVMtRE9TICJmYXIiIHN0cnVjdHVyZSBhbGxvY2F0aW9uIGZvciB0aGUgc21hbGwKK2FuZCBtZWRpdW0gbWVtb3J5IG1vZGVscy4gIFlvdSBzaG91bGQgYWxzbyBub3RlIHRoYXQgemxpYiBpcyBhCitjb21wcmVzc2lvbiBsaWJyYXJ5IHRoYXQgaXMgdXNlZnVsIGZvciBtb3JlIHRoaW5ncyB0aGFuIGp1c3QgUE5HIGZpbGVzLgorWW91IGNhbiB1c2UgemxpYiBhcyBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIGZyZWFkKCkgYW5kIGZ3cml0ZSgpIGlmCit5b3UgYXJlIHNvIGluY2xpbmVkLgorCit6bGliIHNob3VsZCBiZSBhdmFpbGFibGUgYXQgdGhlIHNhbWUgcGxhY2UgdGhhdCBsaWJwbmcgaXMsIG9yIGF0IHpsaWIubmV0LgorCitZb3UgbWF5IGFsc28gd2FudCBhIGNvcHkgb2YgdGhlIFBORyBzcGVjaWZpY2F0aW9uLiAgSXQgaXMgYXZhaWxhYmxlCithcyBhbiBSRkMsIGEgVzNDIFJlY29tbWVuZGF0aW9uLCBhbmQgYW4gSVNPL0lFQyBTdGFuZGFyZC4gIFlvdSBjYW4gZmluZAordGhlc2UgYXQgaHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9wbmcvZG9jdW1lbnRzLworCitUaGlzIGNvZGUgaXMgY3VycmVudGx5IGJlaW5nIGFyY2hpdmVkIGF0IGxpYnBuZy5zZi5uZXQgaW4gdGhlCitbRE9XTkxPQURdIGFyZWEsIGFuZCBhdCBmdHA6Ly9mdHAuc2ltcGxlc3lzdGVtcy5vcmcuICBJZiB5b3UgY2FuJ3QgZmluZCBpdAoraW4gYW55IG9mIHRob3NlIHBsYWNlcywgZS1tYWlsIG1lLCBhbmQgSSdsbCBoZWxwIHlvdSBmaW5kIGl0LgorCitJIGFtIG5vdCBhIGxhd3llciwgYnV0IEkgYmVsaWV2ZSB0aGF0IHRoZSBFeHBvcnQgQ29udHJvbCBDbGFzc2lmaWNhdGlvbgorTnVtYmVyIChFQ0NOKSBmb3IgbGlicG5nIGlzIEVBUjk5LCB3aGljaCBtZWFucyBub3Qgc3ViamVjdCB0byBleHBvcnQKK2NvbnRyb2xzIG9yIEludGVybmF0aW9uYWwgVHJhZmZpYyBpbiBBcm1zIFJlZ3VsYXRpb25zIChJVEFSKSBiZWNhdXNlIGl0CitpcyBvcGVuIHNvdXJjZSwgcHVibGljbHkgYXZhaWxhYmxlIHNvZnR3YXJlLCB0aGF0IGRvZXMgbm90IGNvbnRhaW4gYW55CitlbmNyeXB0aW9uIHNvZnR3YXJlLiAgU2VlIHRoZSBFQVIsIHBhcmFncmFwaHMgNzM0LjMoYikoMykgYW5kIDczNC43KGIpLgorCitJZiB5b3UgaGF2ZSBhbnkgY29kZSBjaGFuZ2VzLCByZXF1ZXN0cywgcHJvYmxlbXMsIGV0Yy4sIHBsZWFzZSBlLW1haWwKK3RoZW0gdG8gbWUuICBBbHNvLCBJJ2QgYXBwcmVjaWF0ZSBhbnkgbWFrZSBmaWxlcyBvciBwcm9qZWN0IGZpbGVzLAorYW5kIGFueSBtb2RpZmljYXRpb25zIHlvdSBuZWVkZWQgdG8gbWFrZSB0byBnZXQgbGlicG5nIHRvIGNvbXBpbGUsCithbG9uZyB3aXRoIGEgI2RlZmluZSB2YXJpYWJsZSB0byB0ZWxsIHdoYXQgY29tcGlsZXIvc3lzdGVtIHlvdSBhcmUgb24uCitJZiB5b3UgbmVlZGVkIHRvIGFkZCB0cmFuc2Zvcm1hdGlvbnMgdG8gbGlicG5nLCBvciB3aXNoIGxpYnBuZyB3b3VsZAorcHJvdmlkZSB0aGUgaW1hZ2UgaW4gYSBkaWZmZXJlbnQgd2F5LCBkcm9wIG1lIGEgbm90ZSAoYW5kIGNvZGUsIGlmCitwb3NzaWJsZSksIHNvIEkgY2FuIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHRyYW5zZm9ybWF0aW9uLgorRmluYWxseSwgaWYgeW91IGdldCBhbnkgd2FybmluZyBtZXNzYWdlcyB3aGVuIGNvbXBpbGluZyBsaWJwbmcKKyhub3RlOiBub3QgemxpYiksIGFuZCB0aGV5IGFyZSBlYXN5IHRvIGZpeCwgSSdkIGFwcHJlY2lhdGUgdGhlCitmaXguICBQbGVhc2UgbWVudGlvbiAibGlicG5nIiBzb21ld2hlcmUgaW4gdGhlIHN1YmplY3QgbGluZS4gIFRoYW5rcy4KKworVGhpcyByZWxlYXNlIHdhcyBjcmVhdGVkIGFuZCB3aWxsIGJlIHN1cHBvcnRlZCBieSBteXNlbGYgKG9mIGNvdXJzZQorYmFzZWQgaW4gYSBsYXJnZSB3YXkgb24gR3V5J3MgYW5kIEFuZHJlYXMnIGVhcmxpZXIgd29yayksIGFuZCB0aGUgUE5HCitkZXZlbG9wbWVudCBncm91cC4KKworU2VuZCBjb21tZW50cy9jb3JyZWN0aW9ucy9jb21tZW5kYXRpb25zIHRvIHBuZy1tbmctaW1wbGVtZW50IGF0CitsaXN0cy5zb3VyY2Vmb3JnZS5uZXQgKHN1YnNjcmlwdGlvbiByZXF1aXJlZDsgdmlzaXQKK2h0dHBzOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL3BuZy1tbmctaW1wbGVtZW50Cit0byBzdWJzY3JpYmUpIG9yIHRvIGdsZW5ucnAgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0CisKK1lvdSBjYW4ndCByZWFjaCBHdXksIHRoZSBvcmlnaW5hbCBsaWJwbmcgYXV0aG9yLCBhdCB0aGUgYWRkcmVzc2VzCitnaXZlbiBpbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGlzIGRvY3VtZW50LiAgSGUgYW5kIEFuZHJlYXMgd2lsbAorcmVhZCBtYWlsIGFkZHJlc3NlZCB0byB0aGUgcG5nLWltcGxlbWVudCBsaXN0LCBob3dldmVyLgorCitQbGVhc2UgZG8gbm90IHNlbmQgZ2VuZXJhbCBxdWVzdGlvbnMgYWJvdXQgUE5HLiAgU2VuZCB0aGVtIHRvCitwbmctbW5nLW1pc2MgYXQgbGlzdHMuc2YubmV0IChzdWJzY3JpcHRpb24gcmVxdWlyZWQ7IHZpc2l0CitodHRwczovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9wbmctbW5nLW1pc2MgdG8KK3N1YnNjcmliZSkuICBJZiB5b3UgaGF2ZSBhIHF1ZXN0aW9uIGFib3V0IHNvbWV0aGluZworaW4gdGhlIFBORyBzcGVjaWZpY2F0aW9uIHRoYXQgaXMgcmVsYXRlZCB0byB1c2luZyBsaWJwbmcsIHNlbmQgaXQKK3RvIG1lLiAgU2VuZCBtZSBhbnkgcXVlc3Rpb25zIHRoYXQgc3RhcnQgd2l0aCAiSSB3YXMgdXNpbmcgbGlicG5nLAorYW5kIC4uLiIuICBJZiBpbiBkb3VidCwgc2VuZCBxdWVzdGlvbnMgdG8gbWUuICBJJ2xsIGJvdW5jZSB0aGVtCit0byBvdGhlcnMsIGlmIG5lY2Vzc2FyeS4KKworUGxlYXNlIGRvIG5vdCBzZW5kIHN1Z2dlc3Rpb25zIG9uIGhvdyB0byBjaGFuZ2UgUE5HLiAgV2UgaGF2ZQorYmVlbiBkaXNjdXNzaW5nIFBORyBmb3IgdHdlbnR5IHllYXJzIG5vdywgYW5kIGl0IGlzIG9mZmljaWFsIGFuZAorZmluaXNoZWQuICBJZiB5b3UgaGF2ZSBzdWdnZXN0aW9ucyBmb3IgbGlicG5nLCBob3dldmVyLCBJJ2xsCitnbGFkbHkgbGlzdGVuLiAgRXZlbiBpZiB5b3VyIHN1Z2dlc3Rpb24gaXMgbm90IHVzZWQgaW1tZWRpYXRlbHksCitpdCBtYXkgYmUgdXNlZCBsYXRlci4KKworRmlsZXMgaW4gdGhpcyBkaXN0cmlidXRpb246CisKKyAgICAgIEFOTk9VTkNFICAgICAgPT4gIEFubm91bmNlbWVudCBvZiB0aGlzIHZlcnNpb24sIHdpdGggcmVjZW50IGNoYW5nZXMKKyAgICAgIENIQU5HRVMgICAgICAgPT4gIERlc2NyaXB0aW9uIG9mIGNoYW5nZXMgYmV0d2VlbiBsaWJwbmcgdmVyc2lvbnMKKyAgICAgIEtOT1dOQlVHICAgICAgPT4gIExpc3Qgb2Yga25vd24gYnVncyBhbmQgZGVmaWNpZW5jaWVzCisgICAgICBMSUNFTlNFICAgICAgID0+ICBMaWNlbnNlIHRvIHVzZSBhbmQgcmVkaXN0cmlidXRlIGxpYnBuZworICAgICAgUkVBRE1FICAgICAgICA9PiAgVGhpcyBmaWxlCisgICAgICBUT0RPICAgICAgICAgID0+ICBUaGluZ3Mgbm90IGltcGxlbWVudGVkIGluIHRoZSBjdXJyZW50IGxpYnJhcnkKKyAgICAgIFkyS0lORk8gICAgICAgPT4gIFN0YXRlbWVudCBvZiBZMksgY29tcGxpYW5jZQorICAgICAgZXhhbXBsZS5jICAgICA9PiAgRXhhbXBsZSBjb2RlIGZvciB1c2luZyBsaWJwbmcgZnVuY3Rpb25zCisgICAgICBsaWJwbmcuMyAgICAgID0+ICBtYW51YWwgcGFnZSBmb3IgbGlicG5nIChpbmNsdWRlcyBsaWJwbmctbWFudWFsLnR4dCkKKyAgICAgIGxpYnBuZy1tYW51YWwudHh0ICA9PiAgRGVzY3JpcHRpb24gb2YgbGlicG5nIGFuZCBpdHMgZnVuY3Rpb25zCisgICAgICBsaWJwbmdwZi4zICAgID0+ICBtYW51YWwgcGFnZSBmb3IgbGlicG5nJ3MgcHJpdmF0ZSBmdW5jdGlvbnMKKyAgICAgIHBuZy41ICAgICAgICAgPT4gIG1hbnVhbCBwYWdlIGZvciB0aGUgUE5HIGZvcm1hdAorICAgICAgcG5nLmMgICAgICAgICA9PiAgQmFzaWMgaW50ZXJmYWNlIGZ1bmN0aW9ucyBjb21tb24gdG8gbGlicmFyeQorICAgICAgcG5nLmggICAgICAgICA9PiAgTGlicmFyeSBmdW5jdGlvbiBhbmQgaW50ZXJmYWNlIGRlY2xhcmF0aW9ucyAocHVibGljKQorICAgICAgcG5ncHJpdi5oICAgICA9PiAgTGlicmFyeSBmdW5jdGlvbiBhbmQgaW50ZXJmYWNlIGRlY2xhcmF0aW9ucyAocHJpdmF0ZSkKKyAgICAgIHBuZ2NvbmYuaCAgICAgPT4gIFN5c3RlbSBzcGVjaWZpYyBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gKHB1YmxpYykKKyAgICAgIHBuZ3N0cnVjdC5oICAgPT4gIHBuZ19zdHJ1Y3QgZGVjbGFyYXRpb24gKHByaXZhdGUpCisgICAgICBwbmdpbmZvLmggICAgID0+ICBwbmdfaW5mbyBzdHJ1Y3QgZGVjbGFyYXRpb24gKHByaXZhdGUpCisgICAgICBwbmdkZWJ1Zy5oICAgID0+ICBkZWJ1Z2dpbmcgbWFjcm9zIChwcml2YXRlKQorICAgICAgcG5nZXJyb3IuYyAgICA9PiAgRXJyb3Ivd2FybmluZyBtZXNzYWdlIEkvTyBmdW5jdGlvbnMKKyAgICAgIHBuZ2dldC5jICAgICAgPT4gIEZ1bmN0aW9ucyBmb3IgcmV0cmlldmluZyBpbmZvIGZyb20gc3RydWN0CisgICAgICBwbmdtZW0uYyAgICAgID0+ICBNZW1vcnkgaGFuZGxpbmcgZnVuY3Rpb25zCisgICAgICBwbmdiYXIucG5nICAgID0+ICBQTkcgbG9nbywgODh4MzEKKyAgICAgIHBuZ25vdy5wbmcgICAgPT4gIFBORyBsb2dvLCA5OHgzMQorICAgICAgcG5ncHJlYWQuYyAgICA9PiAgUHJvZ3Jlc3NpdmUgcmVhZGluZyBmdW5jdGlvbnMKKyAgICAgIHBuZ3JlYWQuYyAgICAgPT4gIFJlYWQgZGF0YS9oZWxwZXIgaGlnaC1sZXZlbCBmdW5jdGlvbnMKKyAgICAgIHBuZ3Jpby5jICAgICAgPT4gIExvd2VzdC1sZXZlbCBkYXRhIHJlYWQgSS9PIGZ1bmN0aW9ucworICAgICAgcG5ncnRyYW4uYyAgICA9PiAgUmVhZCBkYXRhIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucworICAgICAgcG5ncnV0aWwuYyAgICA9PiAgUmVhZCBkYXRhIHV0aWxpdHkgZnVuY3Rpb25zCisgICAgICBwbmdzZXQuYyAgICAgID0+ICBGdW5jdGlvbnMgZm9yIHN0b3JpbmcgZGF0YSBpbnRvIHRoZSBpbmZvX3N0cnVjdAorICAgICAgcG5ndGVzdC5jICAgICA9PiAgTGlicmFyeSB0ZXN0IHByb2dyYW0KKyAgICAgIHBuZ3Rlc3QucG5nICAgPT4gIExpYnJhcnkgdGVzdCBzYW1wbGUgaW1hZ2UKKyAgICAgIHBuZ3RyYW5zLmMgICAgPT4gIENvbW1vbiBkYXRhIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucworICAgICAgcG5nd2lvLmMgICAgICA9PiAgTG93ZXN0LWxldmVsIHdyaXRlIEkvTyBmdW5jdGlvbnMKKyAgICAgIHBuZ3dyaXRlLmMgICAgPT4gIEhpZ2gtbGV2ZWwgd3JpdGUgZnVuY3Rpb25zCisgICAgICBwbmd3dHJhbi5jICAgID0+ICBXcml0ZSBkYXRhIHRyYW5zZm9ybWF0aW9ucworICAgICAgcG5nd3V0aWwuYyAgICA9PiAgV3JpdGUgdXRpbGl0eSBmdW5jdGlvbnMKKyAgICAgIGFybSAgICAgICAgICAgPT4gIENvbnRhaW5zIG9wdGltaXplZCBjb2RlIGZvciB0aGUgQVJNIHBsYXRmb3JtCisgICAgICBjb250cmliICAgICAgID0+ICBDb250cmlidXRpb25zCisgICAgICAgZXhhbXBsZXMgICAgICAgICA9PiAgRXhhbXBsZSBwcm9ncmFtcworICAgICAgIGdyZWdib29rICAgICAgICAgPT4gIHNvdXJjZSBjb2RlIGZvciBQTkcgcmVhZGluZyBhbmQgd3JpdGluZywgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyZWcgUm9lbG9mcycgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8nUmVpbGx5LCAxOTk5CisgICAgICAgbGlidGVzdHMgICAgICAgICA9PiAgVGVzdCBwcm9ncmFtcworICAgICAgIHBuZ21pbmltICAgICAgICAgPT4gIE1pbmltYWwgZGVjb2RlciwgZW5jb2RlciwgYW5kIHByb2dyZXNzaXZlIGRlY29kZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtcyBkZW1vbnN0cmF0aW5nIHVzZSBvZiBwbmd1c3IuZGZhCisgICAgICAgcG5nbWludXMgICAgICAgICA9PiAgU2ltcGxlIHBubTJwbmcgYW5kIHBuZzJwbm0gcHJvZ3JhbXMKKyAgICAgICBwbmdzdWl0ZSAgICAgICAgID0+ICBUZXN0IGltYWdlcworICAgICAgIHRvb2xzICAgICAgICAgICAgPT4gIFZhcmlvdXMgdG9vbHMKKyAgICAgICB2aXN1cG5nICAgICAgICAgID0+ICBDb250YWlucyBhIE1TVkMgd29ya3NwYWNlIGZvciBWaXN1YWxQbmcKKyAgICAgIHByb2plY3RzICAgICAgPT4gIENvbnRhaW5zIHByb2plY3QgZmlsZXMgYW5kIHdvcmtzcGFjZXMgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGluZyBhIERMTAorICAgICAgIG93YXRjb20gICAgICAgICAgPT4gIENvbnRhaW5zIGEgV0FUQ09NIHByb2plY3QgZm9yIGJ1aWxkaW5nIGxpYnBuZworICAgICAgIHZpc3VhbGM3MSAgICAgICAgPT4gIENvbnRhaW5zIGEgTWljcm9zb2Z0IFZpc3VhbCBDKysgKE1TVkMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3NwYWNlIGZvciBidWlsZGluZyBsaWJwbmcgYW5kIHpsaWIKKyAgICAgICB2c3R1ZGlvICAgICAgICAgID0+ICBDb250YWlucyBhIE1pY3Jvc29mdCBWaXN1YWwgQysrIChNU1ZDKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzcGFjZSBmb3IgYnVpbGRpbmcgbGlicG5nIGFuZCB6bGliCisgICAgICBzY3JpcHRzICAgICAgID0+ICBEaXJlY3RvcnkgY29udGFpbmluZyBzY3JpcHRzIGZvciBidWlsZGluZyBsaWJwbmc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlZSBzY3JpcHRzL1JFQURNRS50eHQgZm9yIHRoZSBsaXN0IG9mIHNjcmlwdHMpCisKK0dvb2QgbHVjaywgYW5kIGhhcHB5IGNvZGluZy4KKworLUdsZW5uIFJhbmRlcnMtUGVocnNvbiAoY3VycmVudCBtYWludGFpbmVyLCBzaW5jZSAxOTk4KQorIEludGVybmV0OiBnbGVubnJwIGF0IHVzZXJzLnNvdXJjZWZvcmdlLm5ldAorCistQW5kcmVhcyBFcmljIERpbGdlciAoZm9ybWVyIG1haW50YWluZXIsIDE5OTYtMTk5NykKKyBJbnRlcm5ldDogYWRpbGdlciBhdCBlbmVsLnVjYWxnYXJ5LmNhCisgV2ViOiBodHRwOi8vd3d3LW1kZHNwLmVuZWwudWNhbGdhcnkuY2EvUGVvcGxlL2FkaWxnZXIvCisKKy1HdXkgRXJpYyBTY2hhbG5hdCAob3JpZ2luYWwgYXV0aG9yIGFuZCBmb3JtZXIgbWFpbnRhaW5lciwgMTk5NS0xOTk2KQorIChmb3JtZXJseSBvZiBHcm91cCA0MiwgSW5jKQorIEludGVybmV0OiBnc2NoYWwgYXQgaW5maW5ldC5jb20KZGlmZiAtLWdpdCBhL2xpYnBuZy9SRUFETUUuYW5kcm9pZCBiL2xpYnBuZy9SRUFETUUuYW5kcm9pZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTgyY2E1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL1JFQURNRS5hbmRyb2lkCkBAIC0wLDAgKzEsMTkgQEAKK0FueSBBbmRyb2lkIHNwZWNpZmljIG1vZGlmaWNhdGlvbnMgdG8gdXBzdHJlYW0gbGlicG5nICgxLjYuMjApIHNob3VsZAorYmUgbGlzdGVkIGhlcmU6CisKKygxKSBBbmRyb2lkIGhhcyBhZGRlZCB0aGUgZm9sbG93aW5nIGZpbGVzLgorICAgIHBuZ3Vzci5oCisgICAgQW5kcm9pZC5taworICAgIENsZWFuU3BlYy5taworICAgIE1PRFVMRV9MSUNFTlNFX0JTRF9MSUtFCisgICAgUkVBRE1FLnZlcnNpb24KKworKDIpIHBuZ2xpYmNvbmYuaAorICAgIFRoaXMgaXMgY29waWVkIGZyb20gc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQuCisgICAgQW5kcm9pZCBoYXMgdW5kZWZpbmVkIFBOR19XQVJOSU5HU19TVVBQT1JURUQuCisKKygzKSBSZW1vdmVkIGNvbnRyaWIvdGVzdHBuZ3MvCisgICAgVGhlcmUgaXMgbm8gcmVhc29uIHRvIGNoZWNrIGluIGFsbCBvZiB0aGVzZSBmaWxlcyBpZiB3ZSB3b24ndAorICAgIGJlIHVzaW5nIHRoZW0uCisKKyg0KSBQTkdfSU5ERVhfU1VQUE9SVEVEIG9wdGltaXphdGlvbnMuCmRpZmYgLS1naXQgYS9saWJwbmcvUkVBRE1FLnZlcnNpb24gYi9saWJwbmcvUkVBRE1FLnZlcnNpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4OTBkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9SRUFETUUudmVyc2lvbgpAQCAtMCwwICsxLDMgQEAKK1VSTDogaHR0cDovL3ByZG93bmxvYWRzLnNvdXJjZWZvcmdlLm5ldC9saWJwbmcvbGlicG5nLTEuNi4yMC50YXIuZ3o/ZG93bmxvYWQKK1ZlcnNpb246IDEuNi4yMAorQnVnQ29tcG9uZW50OiA4Nzg5NgpkaWZmIC0tZ2l0IGEvbGlicG5nL1RPRE8gYi9saWJwbmcvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjYzMzc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL1RPRE8KQEAgLTAsMCArMSwyOSBAQAorLyoKK1RPRE8gLSBsaXN0IG9mIHRoaW5ncyB0byBkbyBmb3IgbGlicG5nOgorCitGaW5hbCBidWcgZml4ZXMuCitCZXR0ZXIgQysrIHdyYXBwZXIvZnVsbCBDKysgaW1wbGVtZW50YXRpb24/CitGaXggcHJvYmxlbSB3aXRoIEMrKyBhbmQgRVhURVJOICJDIi4KK2NIUk0gdHJhbnNmb3JtYXRpb24uCitSZW1vdmUgc2V0am1wL2xvbmdqbXAgdXNhZ2UgaW4gZmF2b3Igb2YgcmV0dXJuaW5nIGVycm9yIGNvZGVzLgorUGFsZXR0ZSBjcmVhdGlvbi4KK0FkZCAiZ3JheXNjYWxlLT5wYWxldHRlIiB0cmFuc2Zvcm1hdGlvbiBhbmQgInBhbGV0dGUtPmdyYXlzY2FsZSIgZGV0ZWN0aW9uLgorSW1wcm92ZWQgZGl0aGVyaW5nLgorTXVsdGktbGluZ3VhbCBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlIHN1cHBvcnQuCitDb21wbGV0ZSBzUkdCIHRyYW5zZm9ybWF0aW9uIChwcmVzZW50bHkgaXQgc2ltcGx5IHVzZXMgZ2FtbWE9MC40NTQ1NSkuCitNYWtlIHByb2ZpbGUgY2hlY2tpbmcgb3B0aW9uYWwgdmlhIGEgcG5nX3NldF9zb21ldGhpbmcoKSBjYWxsLgorTWFuIHBhZ2VzIGZvciBmdW5jdGlvbiBjYWxscy4KK0JldHRlciBkb2N1bWVudGF0aW9uLgorQmV0dGVyIGZpbHRlciBzZWxlY3Rpb24KKyAgIChjb3VudGluZyBodWZmbWFuIGJpdHMvcHJlY29tcHJlc3Npb24/ICBmaWx0ZXIgaW5lcnRpYT8gIGZpbHRlciBjb3N0cz8pLgorSGlzdG9ncmFtIGNyZWF0aW9uLgorVGV4dCBjb252ZXJzaW9uIGJldHdlZW4gZGlmZmVyZW50IGNvZGUgcGFnZXMgKExhdGluLTEgLT4gTWFjIGFuZCBET1MpLgorQXZvaWQgYnVpbGRpbmcgZ2FtbWEgdGFibGVzIHdoZW5ldmVyIHBvc3NpYmxlLgorVXNlIGdyZWF0ZXIgcHJlY2lzaW9uIHdoZW4gY2hhbmdpbmcgdG8gbGluZWFyIGdhbW1hIGZvciBjb21wb3NpdGluZyBhZ2FpbnN0CisgIGJhY2tncm91bmQgYW5kIGRvaW5nIHJnYi10by1ncmF5IHRyYW5zZm9ybWF0aW9uLgorSW52ZXN0aWdhdGUgcHJlLWluY3JlbWVudGVkIGxvb3AgY291bnRlcnMgYW5kIG90aGVyIGxvb3AgY29uc3RydWN0aW9ucy4KK0FkZCBpbnRlcnBvbGF0ZWQgbWV0aG9kIG9mIGhhbmRsaW5nIGludGVybGFjaW5nLgorU3dpdGNoIHRvIHRoZSBzaW1wbGVyIHpsaWIgKHpsaWIvbGlicG5nKSBsaWNlbnNlIGlmIGxlZ2FsbHkgcG9zc2libGUuCitFeHRlbmQgcG5ndmFsaWQuYyB0byB2YWxpZGF0ZSBtb3JlIG9mIHRoZSBsaWJwbmcgdHJhbnNmb3JtYXRpb25zLgorCisqLwpkaWZmIC0tZ2l0IGEvbGlicG5nL2FybS9hcm1faW5pdC5jIGIvbGlicG5nL2FybS9hcm1faW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiM2Q1MGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvYXJtL2FybV9pbml0LmMKQEAgLTAsMCArMSwxMzQgQEAKKworLyogYXJtX2luaXQuYyAtIE5FT04gb3B0aW1pc2VkIGZpbHRlciBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKiBXcml0dGVuIGJ5IE1hbnMgUnVsbGdhcmQsIDIwMTEuCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4xNiBbRGVjZW1iZXIgMjIsIDIwMTRdCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCisgKi8KKy8qIEJlbG93LCBhZnRlciBjaGVja2luZyBfX2xpbnV4X18sIHZhcmlvdXMgbm9uLUM5MCBQT1NJWCAxMDAzLjEgZnVuY3Rpb25zIGFyZQorICogY2FsbGVkLgorICovCisjZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQorCisjaW5jbHVkZSAiLi4vcG5ncHJpdi5oIgorCisjaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECisKKyNpZiBQTkdfQVJNX05FT05fT1BUID4gMAorI2lmZGVmIFBOR19BUk1fTkVPTl9DSEVDS19TVVBQT1JURUQgLyogRG8gcnVuLXRpbWUgY2hlY2tzICovCisvKiBXQVJOSU5HOiBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBkbyBub3QgYnVpbGQgbGlicG5nIHdpdGgKKyAqIHJ1bi10aW1lIGNoZWNrcyBmb3IgQ1BVIGZlYXR1cmVzIGlmIGF0IGFsbCBwb3NzaWJsZS4gIEluIHRoZSBjYXNlIG9mIHRoZSBBUk0KKyAqIE5FT04gaW5zdHJ1Y3Rpb25zIHRoZXJlIGlzIG5vIHByb2Nlc3Nvci1zcGVjaWZpYyB3YXkgb2YgZGV0ZWN0aW5nIHRoZQorICogcHJlc2VuY2Ugb2YgdGhlIHJlcXVpcmVkIHN1cHBvcnQsIHRoZXJlZm9yZSBydW4tdGltZSBkZXRlY3Rpb24gaXMgZXh0cmVtZWx5CisgKiBPUyBzcGVjaWZpYy4KKyAqCisgKiBZb3UgbWF5IHNldCB0aGUgbWFjcm8gUE5HX0FSTV9ORU9OX0ZJTEUgdG8gdGhlIGZpbGUgbmFtZSBvZiBmaWxlIGNvbnRhaW5pbmcKKyAqIGEgZnJhZ21lbnQgb2YgQyBzb3VyY2UgY29kZSB3aGljaCBkZWZpbmVzIHRoZSBwbmdfaGF2ZV9uZW9uIGZ1bmN0aW9uLiAgVGhlcmUKKyAqIGFyZSBhIG51bWJlciBvZiBpbXBsZW1lbnRhdGlvbnMgaW4gY29udHJpYi9hcm0tbmVvbiwgYnV0IHRoZSBvbmx5IG9uZSB0aGF0CisgKiBoYXMgcGFydGlhbCBzdXBwb3J0IGlzIGNvbnRyaWIvYXJtLW5lb24vbGludXguYyAtIGEgZ2VuZXJpYyBMaW51eAorICogaW1wbGVtZW50YXRpb24gd2hpY2ggcmVhZHMgL3Byb2MvY3B1Zmluby4KKyAqLworI2lmbmRlZiBQTkdfQVJNX05FT05fRklMRQorIyAgaWZkZWYgX19saW51eF9fCisjICAgICBkZWZpbmUgUE5HX0FSTV9ORU9OX0ZJTEUgImNvbnRyaWIvYXJtLW5lb24vbGludXguYyIKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFBOR19BUk1fTkVPTl9GSUxFCisKKyNpbmNsdWRlIDxzaWduYWwuaD4gLyogZm9yIHNpZ19hdG9taWNfdCAqLworc3RhdGljIGludCBwbmdfaGF2ZV9uZW9uKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpOworI2luY2x1ZGUgUE5HX0FSTV9ORU9OX0ZJTEUKKworI2Vsc2UgIC8qIFBOR19BUk1fTkVPTl9GSUxFICovCisjICBlcnJvciAiUE5HX0FSTV9ORU9OX0ZJTEUgdW5kZWZpbmVkOiBubyBzdXBwb3J0IGZvciBydW4tdGltZSBBUk0gTkVPTiBjaGVja3MiCisjZW5kaWYgLyogUE5HX0FSTV9ORU9OX0ZJTEUgKi8KKyNlbmRpZiAvKiBQTkdfQVJNX05FT05fQ0hFQ0tfU1VQUE9SVEVEICovCisKKyNpZm5kZWYgUE5HX0FMSUdORURfTUVNT1JZX1NVUFBPUlRFRAorIyAgZXJyb3IgIkFMSUdORURfTUVNT1JZIGlzIHJlcXVpcmVkOyBzZXQ6IC1EUE5HX0FMSUdORURfTUVNT1JZX1NVUFBPUlRFRCIKKyNlbmRpZgorCit2b2lkCitwbmdfaW5pdF9maWx0ZXJfZnVuY3Rpb25zX25lb24ocG5nX3N0cnVjdHAgcHAsIHVuc2lnbmVkIGludCBicHApCit7CisgICAvKiBUaGUgc3dpdGNoIHN0YXRlbWVudCBpcyBjb21waWxlZCBpbiBmb3IgQVJNX05FT05fQVBJLCB0aGUgY2FsbCB0bworICAgICogcG5nX2hhdmVfbmVvbiBpcyBjb21waWxlZCBpbiBmb3IgQVJNX05FT05fQ0hFQ0suICBJZiBib3RoIGFyZSBkZWZpbmVkCisgICAgKiB0aGUgY2hlY2sgaXMgb25seSBwZXJmb3JtZWQgaWYgdGhlIEFQSSBoYXMgbm90IHNldCB0aGUgTkVPTiBvcHRpb24gb24KKyAgICAqIG9yIG9mZiBleHBsaWNpdGx5LiAgSW4gdGhpcyBjYXNlIHRoZSBjaGVjayBjb250cm9scyB3aGF0IGhhcHBlbnMuCisgICAgKgorICAgICogSWYgdGhlIENIRUNLIGlzIG5vdCBjb21waWxlZCBpbiBhbmQgdGhlIG9wdGlvbiBpcyBVTlNFVCB0aGUgYmVoYXZpb3IgcHJpb3IKKyAgICAqIHRvIDEuNi43IHdhcyB0byB1c2UgdGhlIE5FT04gY29kZSAtIHRoaXMgd2FzIGEgYnVnIGNhdXNlZCBieSBoYXZpbmcgdGhlCisgICAgKiB3cm9uZyBvcmRlciBvZiB0aGUgJ09OJyBhbmQgJ2RlZmF1bHQnIGNhc2VzLiAgVU5TRVQgbm93IGRlZmF1bHRzIHRvIE9GRiwKKyAgICAqIGFzIGRvY3VtZW50ZWQgaW4gcG5nLmgKKyAgICAqLworI2lmZGVmIFBOR19BUk1fTkVPTl9BUElfU1VQUE9SVEVECisgICBzd2l0Y2ggKChwcC0+b3B0aW9ucyA+PiBQTkdfQVJNX05FT04pICYgMykKKyAgIHsKKyAgICAgIGNhc2UgUE5HX09QVElPTl9VTlNFVDoKKyAgICAgICAgIC8qIEFsbG93IHRoZSBydW4tdGltZSBjaGVjayB0byBleGVjdXRlIGlmIGl0IGhhcyBiZWVuIGVuYWJsZWQgLQorICAgICAgICAgICogdGh1cyBib3RoIEFQSSBhbmQgQ0hFQ0sgY2FuIGJlIHR1cm5lZCBvbi4gIElmIGl0IGlzbid0IHN1cHBvcnRlZAorICAgICAgICAgICogdGhpcyBjYXNlIHdpbGwgZmFsbCB0aHJvdWdoIHRvIHRoZSAnZGVmYXVsdCcgYmVsb3csIHdoaWNoIGp1c3QKKyAgICAgICAgICAqIHJldHVybnMuCisgICAgICAgICAgKi8KKyNlbmRpZiAvKiBQTkdfQVJNX05FT05fQVBJX1NVUFBPUlRFRCAqLworI2lmZGVmIFBOR19BUk1fTkVPTl9DSEVDS19TVVBQT1JURUQKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3Qgbm9fbmVvbiA9IC0xOyAvKiBub3QgY2hlY2tlZCAqLworCisgICAgICAgICAgICBpZiAobm9fbmVvbiA8IDApCisgICAgICAgICAgICAgICBub19uZW9uID0gIXBuZ19oYXZlX25lb24ocHApOworCisgICAgICAgICAgICBpZiAobm9fbmVvbikKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgIH0KKyNpZmRlZiBQTkdfQVJNX05FT05fQVBJX1NVUFBPUlRFRAorICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNlbmRpZiAvKiBQTkdfQVJNX05FT05fQ0hFQ0tfU1VQUE9SVEVEICovCisKKyNpZmRlZiBQTkdfQVJNX05FT05fQVBJX1NVUFBPUlRFRAorICAgICAgZGVmYXVsdDogLyogT0ZGIG9yIElOVkFMSUQgKi8KKyAgICAgICAgIHJldHVybjsKKworICAgICAgY2FzZSBQTkdfT1BUSU9OX09OOgorICAgICAgICAgLyogT3B0aW9uIHR1cm5lZCBvbiAqLworICAgICAgICAgYnJlYWs7CisgICB9CisjZW5kaWYKKworICAgLyogSU1QT1JUQU5UOiBhbnkgbmV3IGV4dGVybmFsIGZ1bmN0aW9ucyB1c2VkIGhlcmUgbXVzdCBiZSBkZWNsYXJlZCB1c2luZworICAgICogUE5HX0lOVEVSTkFMX0ZVTkNUSU9OIGluIC4uL3BuZ3ByaXYuaC4gIFRoaXMgaXMgcmVxdWlyZWQgc28gdGhhdCB0aGUKKyAgICAqICdwcmVmaXgnIG9wdGlvbiB0byBjb25maWd1cmUgd29ya3M6CisgICAgKgorICAgICogICAgLi9jb25maWd1cmUgLS13aXRoLWxpYnBuZy1wcmVmaXg9Zm9vYmFyXworICAgICoKKyAgICAqIFZlcmlmeSB5b3UgaGF2ZSBnb3QgdGhpcyByaWdodCBieSBydW5uaW5nIHRoZSBhYm92ZSBjb21tYW5kLCBkb2luZyBhIGJ1aWxkCisgICAgKiBhbmQgZXhhbWluaW5nIHBuZ3ByZWZpeC5oOyBpdCBtdXN0IGNvbnRhaW4gYSAjZGVmaW5lIGZvciBldmVyeSBleHRlcm5hbAorICAgICogZnVuY3Rpb24geW91IGFkZC4gIChOb3RpY2UgdGhhdCB0aGlzIGhhcHBlbnMgYXV0b21hdGljYWxseSBmb3IgdGhlCisgICAgKiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4pCisgICAgKi8KKyAgIHBwLT5yZWFkX2ZpbHRlcltQTkdfRklMVEVSX1ZBTFVFX1VQLTFdID0gcG5nX3JlYWRfZmlsdGVyX3Jvd191cF9uZW9uOworCisgICBpZiAoYnBwID09IDMpCisgICB7CisgICAgICBwcC0+cmVhZF9maWx0ZXJbUE5HX0ZJTFRFUl9WQUxVRV9TVUItMV0gPSBwbmdfcmVhZF9maWx0ZXJfcm93X3N1YjNfbmVvbjsKKyAgICAgIHBwLT5yZWFkX2ZpbHRlcltQTkdfRklMVEVSX1ZBTFVFX0FWRy0xXSA9IHBuZ19yZWFkX2ZpbHRlcl9yb3dfYXZnM19uZW9uOworICAgICAgcHAtPnJlYWRfZmlsdGVyW1BOR19GSUxURVJfVkFMVUVfUEFFVEgtMV0gPQorICAgICAgICAgcG5nX3JlYWRfZmlsdGVyX3Jvd19wYWV0aDNfbmVvbjsKKyAgIH0KKworICAgZWxzZSBpZiAoYnBwID09IDQpCisgICB7CisgICAgICBwcC0+cmVhZF9maWx0ZXJbUE5HX0ZJTFRFUl9WQUxVRV9TVUItMV0gPSBwbmdfcmVhZF9maWx0ZXJfcm93X3N1YjRfbmVvbjsKKyAgICAgIHBwLT5yZWFkX2ZpbHRlcltQTkdfRklMVEVSX1ZBTFVFX0FWRy0xXSA9IHBuZ19yZWFkX2ZpbHRlcl9yb3dfYXZnNF9uZW9uOworICAgICAgcHAtPnJlYWRfZmlsdGVyW1BOR19GSUxURVJfVkFMVUVfUEFFVEgtMV0gPQorICAgICAgICAgIHBuZ19yZWFkX2ZpbHRlcl9yb3dfcGFldGg0X25lb247CisgICB9Cit9CisjZW5kaWYgLyogUE5HX0FSTV9ORU9OX09QVCA+IDAgKi8KKyNlbmRpZiAvKiBSRUFEICovCmRpZmYgLS1naXQgYS9saWJwbmcvYXJtL2ZpbHRlcl9uZW9uLlMgYi9saWJwbmcvYXJtL2ZpbHRlcl9uZW9uLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IwNjFkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9hcm0vZmlsdGVyX25lb24uUwpAQCAtMCwwICsxLDI1MyBAQAorCisvKiBmaWx0ZXJfbmVvbi5TIC0gTkVPTiBvcHRpbWlzZWQgZmlsdGVyIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAqIFdyaXR0ZW4gYnkgTWFucyBSdWxsZ2FyZCwgMjAxMS4KKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS42LjE2IFtEZWNlbWJlciAyMiwgMjAxNF0KKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKyAqLworCisvKiBUaGlzIGlzIHJlcXVpcmVkIHRvIGdldCB0aGUgc3ltYm9sIHJlbmFtZXMsIHdoaWNoIGFyZSAjZGVmaW5lcywgYW5kIHRoZQorICogZGVmaW5pdGlvbnMgKG9yIG5vdCkgb2YgUE5HX0FSTV9ORU9OX09QVCBhbmQgUE5HX0FSTV9ORU9OX0lNUExFTUVOVEFUSU9OLgorICovCisjZGVmaW5lIFBOR19WRVJTSU9OX0lORk9fT05MWQorI2luY2x1ZGUgIi4uL3BuZ3ByaXYuaCIKKworI2lmIGRlZmluZWQoX19saW51eF9fKSAmJiBkZWZpbmVkKF9fRUxGX18pCisuc2VjdGlvbiAubm90ZS5HTlUtc3RhY2ssIiIsJXByb2diaXRzIC8qIG1hcmsgc3RhY2sgYXMgbm9uLWV4ZWN1dGFibGUgKi8KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECisKKy8qIEFzc2VtYmxlciBORU9OIHN1cHBvcnQgLSBvbmx5IHdvcmtzIGZvciAzMi1iaXQgQVJNIChpLmUuIGl0IGRvZXMgbm90IHdvcmsgZm9yCisgKiBBUk02NCkuICBUaGUgY29kZSBpbiBhcm0vZmlsdGVyX25lb25faW50cmluc2ljcy5jIHN1cHBvcnRzIEFSTTY0LCBob3dldmVyIGl0CisgKiBvbmx5IHdvcmtzIGlmIC1tZnB1PW5lb24gaXMgc3BlY2lmaWVkIG9uIHRoZSBHQ0MgY29tbWFuZCBsaW5lLiAgU2VlIHBuZ3ByaXYuaAorICogZm9yIHRoZSBsb2dpYyB3aGljaCBzZXRzIFBOR19VU0VfQVJNX05FT05fQVNNOgorICovCisjaWYgUE5HX0FSTV9ORU9OX0lNUExFTUVOVEFUSU9OID09IDIgLyogaGFuZC1jb2RlZCBhc3NlbWJsZXIgKi8KKworI2lmIFBOR19BUk1fTkVPTl9PUFQgPiAwCisKKyNpZmRlZiBfX0VMRl9fCisjICAgZGVmaW5lIEVMRgorI2Vsc2UKKyMgICBkZWZpbmUgRUxGIEAKKyNlbmRpZgorCisgICAgICAgIC5hcmNoIGFybXY3LWEKKyAgICAgICAgLmZwdSAgbmVvbgorCisubWFjcm8gIGZ1bmMgICAgbmFtZSwgZXhwb3J0PTAKKyAgICAubWFjcm8gZW5kZnVuYworRUxGICAgICAuc2l6ZSAgIFxuYW1lLCAuIC0gXG5hbWUKKyAgICAgICAgLmVuZGZ1bmMKKyAgICAgICAgLnB1cmdlbSBlbmRmdW5jCisgICAgLmVuZG0KKyAgICAgICAgLnRleHQKKworICAgICAgICAvKiBFeHBsaWNpdGx5IHNwZWNpZnlpbmcgYWxpZ25tZW50IGhlcmUgYmVjYXVzZSBzb21lIHZlcnNpb25zIG9mCisgICAgICAgICAqIEdBUyBkb24ndCBhbGlnbiBjb2RlIGNvcnJlY3RseS4gIFRoaXMgaXMgaGFybWxlc3MgaW4gY29ycmVjdGx5CisgICAgICAgICAqIHdyaXR0ZW4gdmVyc2lvbnMgb2YgR0FTLgorICAgICAgICAgKi8KKyAgICAgICAgLmFsaWduIDIKKworICAgIC5pZiBcZXhwb3J0CisgICAgICAgIC5nbG9iYWwgXG5hbWUKKyAgICAuZW5kaWYKK0VMRiAgICAgLnR5cGUgICBcbmFtZSwgU1RUX0ZVTkMKKyAgICAgICAgLmZ1bmMgICBcbmFtZQorXG5hbWU6CisuZW5kbQorCitmdW5jICAgIHBuZ19yZWFkX2ZpbHRlcl9yb3dfc3ViNF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBsZHIgICAgICAgICAgICAgcjMsICBbcjAsICM0XSAgICAgICAgICAgQCByb3dieXRlcworICAgICAgICB2bW92Lmk4ICAgICAgICAgZDMsICAjMAorMToKKyAgICAgICAgdmxkNC4zMiAgICAgICAgIHtkNFtdLGQ1W10sZDZbXSxkN1tdfSwgICAgW3IxLDoxMjhdCisgICAgICAgIHZhZGQudTggICAgICAgICBkMCwgIGQzLCAgZDQKKyAgICAgICAgdmFkZC51OCAgICAgICAgIGQxLCAgZDAsICBkNQorICAgICAgICB2YWRkLnU4ICAgICAgICAgZDIsICBkMSwgIGQ2CisgICAgICAgIHZhZGQudTggICAgICAgICBkMywgIGQyLCAgZDcKKyAgICAgICAgdnN0NC4zMiAgICAgICAgIHtkMFswXSxkMVswXSxkMlswXSxkM1swXX0sW3IxLDoxMjhdIQorICAgICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICMxNgorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKworICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuYyAgICBwbmdfcmVhZF9maWx0ZXJfcm93X3N1YjNfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIzLCAgW3IwLCAjNF0gICAgICAgICAgIEAgcm93Ynl0ZXMKKyAgICAgICAgdm1vdi5pOCAgICAgICAgIGQzLCAgIzAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIwLCAgcjEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIyLCAgIzMKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgIzEyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTExfSwgICAgW3IwXSwgcjEyCisxOgorICAgICAgICB2ZXh0LjggICAgICAgICAgZDUsICBkMjIsIGQyMywgIzMKKyAgICAgICAgdmFkZC51OCAgICAgICAgIGQwLCAgZDMsICBkMjIKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQ2LCAgZDIyLCBkMjMsICM2CisgICAgICAgIHZhZGQudTggICAgICAgICBkMSwgIGQwLCAgZDUKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQ3LCAgZDIzLCBkMjMsICMxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTExfSwgICAgW3IwXSwgcjEyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDBbMF19LCAgW3IxLDozMl0sIHIyCisgICAgICAgIHZhZGQudTggICAgICAgICBkMiwgIGQxLCAgZDYKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMVswXX0sICBbcjFdLCByMgorICAgICAgICB2YWRkLnU4ICAgICAgICAgZDMsICBkMiwgIGQ3CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDJbMF19LCAgW3IxXSwgcjIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkM1swXX0sICBbcjFdLCByMgorICAgICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICMxMgorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKworICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuYyAgICBwbmdfcmVhZF9maWx0ZXJfcm93X3VwX25lb24sIGV4cG9ydD0xCisgICAgICAgIGxkciAgICAgICAgICAgICByMywgIFtyMCwgIzRdICAgICAgICAgICBAIHJvd2J5dGVzCisxOgorICAgICAgICB2bGQxLjggICAgICAgICAge3EwfSwgW3IxLDoxMjhdCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTF9LCBbcjIsOjEyOF0hCisgICAgICAgIHZhZGQudTggICAgICAgICBxMCwgIHEwLCAgcTEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtxMH0sIFtyMSw6MTI4XSEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMTYKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmMgICAgcG5nX3JlYWRfZmlsdGVyX3Jvd19hdmc0X25lb24sIGV4cG9ydD0xCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtyMCwgIzRdICAgICAgICAgICBAIHJvd2J5dGVzCisgICAgICAgIHZtb3YuaTggICAgICAgICBkMywgICMwCisxOgorICAgICAgICB2bGQ0LjMyICAgICAgICAge2Q0W10sZDVbXSxkNltdLGQ3W119LCAgICBbcjEsOjEyOF0KKyAgICAgICAgdmxkNC4zMiAgICAgICAgIHtkMTZbXSxkMTdbXSxkMThbXSxkMTlbXX0sW3IyLDoxMjhdIQorICAgICAgICB2aGFkZC51OCAgICAgICAgZDAsICBkMywgIGQxNgorICAgICAgICB2YWRkLnU4ICAgICAgICAgZDAsICBkMCwgIGQ0CisgICAgICAgIHZoYWRkLnU4ICAgICAgICBkMSwgIGQwLCAgZDE3CisgICAgICAgIHZhZGQudTggICAgICAgICBkMSwgIGQxLCAgZDUKKyAgICAgICAgdmhhZGQudTggICAgICAgIGQyLCAgZDEsICBkMTgKKyAgICAgICAgdmFkZC51OCAgICAgICAgIGQyLCAgZDIsICBkNgorICAgICAgICB2aGFkZC51OCAgICAgICAgZDMsICBkMiwgIGQxOQorICAgICAgICB2YWRkLnU4ICAgICAgICAgZDMsICBkMywgIGQ3CisgICAgICAgIHZzdDQuMzIgICAgICAgICB7ZDBbMF0sZDFbMF0sZDJbMF0sZDNbMF19LFtyMSw6MTI4XSEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMTYKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmMgICAgcG5nX3JlYWRfZmlsdGVyX3Jvd19hdmczX25lb24sIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQsbHJ9CisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtyMCwgIzRdICAgICAgICAgICBAIHJvd2J5dGVzCisgICAgICAgIHZtb3YuaTggICAgICAgICBkMywgICMwCisgICAgICAgIG1vdiAgICAgICAgICAgICByMCwgIHIxCisgICAgICAgIG1vdiAgICAgICAgICAgICByNCwgICMzCisgICAgICAgIG1vdiAgICAgICAgICAgICBsciwgICMxMgorICAgICAgICB2bGQxLjggICAgICAgICAge3ExMX0sICAgIFtyMF0sIGxyCisxOgorICAgICAgICB2bGQxLjggICAgICAgICAge3ExMH0sICAgIFtyMl0sIGxyCisgICAgICAgIHZleHQuOCAgICAgICAgICBkNSwgIGQyMiwgZDIzLCAjMworICAgICAgICB2aGFkZC51OCAgICAgICAgZDAsICBkMywgIGQyMAorICAgICAgICB2ZXh0LjggICAgICAgICAgZDE3LCBkMjAsIGQyMSwgIzMKKyAgICAgICAgdmFkZC51OCAgICAgICAgIGQwLCAgZDAsICBkMjIKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQ2LCAgZDIyLCBkMjMsICM2CisgICAgICAgIHZoYWRkLnU4ICAgICAgICBkMSwgIGQwLCAgZDE3CisgICAgICAgIHZleHQuOCAgICAgICAgICBkMTgsIGQyMCwgZDIxLCAjNgorICAgICAgICB2YWRkLnU4ICAgICAgICAgZDEsICBkMSwgIGQ1CisgICAgICAgIHZleHQuOCAgICAgICAgICBkNywgIGQyMywgZDIzLCAjMQorICAgICAgICB2bGQxLjggICAgICAgICAge3ExMX0sICAgIFtyMF0sIGxyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDBbMF19LCAgW3IxLDozMl0sIHI0CisgICAgICAgIHZoYWRkLnU4ICAgICAgICBkMiwgIGQxLCAgZDE4CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDFbMF19LCAgW3IxXSwgcjQKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQxOSwgZDIxLCBkMjEsICMxCisgICAgICAgIHZhZGQudTggICAgICAgICBkMiwgIGQyLCAgZDYKKyAgICAgICAgdmhhZGQudTggICAgICAgIGQzLCAgZDIsICBkMTkKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMlswXX0sICBbcjFdLCByNAorICAgICAgICB2YWRkLnU4ICAgICAgICAgZDMsICBkMywgIGQ3CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDNbMF19LCAgW3IxXSwgcjQKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMTIKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNCxwY30KK2VuZGZ1bmMKKworLm1hY3JvICBwYWV0aCAgICAgICAgICAgcngsICByYSwgIHJiLCAgcmMKKyAgICAgICAgdmFkZGwudTggICAgICAgIHExMiwgXHJhLCBccmIgICAgICAgICAgIEAgYSArIGIKKyAgICAgICAgdmFkZGwudTggICAgICAgIHExNSwgXHJjLCBccmMgICAgICAgICAgIEAgMipjCisgICAgICAgIHZhYmRsLnU4ICAgICAgICBxMTMsIFxyYiwgXHJjICAgICAgICAgICBAIHBhCisgICAgICAgIHZhYmRsLnU4ICAgICAgICBxMTQsIFxyYSwgXHJjICAgICAgICAgICBAIHBiCisgICAgICAgIHZhYmQudTE2ICAgICAgICBxMTUsIHExMiwgcTE1ICAgICAgICAgICBAIHBjCisgICAgICAgIHZjbGUudTE2ICAgICAgICBxMTIsIHExMywgcTE0ICAgICAgICAgICBAIHBhIDw9IHBiCisgICAgICAgIHZjbGUudTE2ICAgICAgICBxMTMsIHExMywgcTE1ICAgICAgICAgICBAIHBhIDw9IHBjCisgICAgICAgIHZjbGUudTE2ICAgICAgICBxMTQsIHExNCwgcTE1ICAgICAgICAgICBAIHBiIDw9IHBjCisgICAgICAgIHZhbmQgICAgICAgICAgICBxMTIsIHExMiwgcTEzICAgICAgICAgICBAIHBhIDw9IHBiICYmIHBhIDw9IHBjCisgICAgICAgIHZtb3ZuLnUxNiAgICAgICBkMjgsIHExNAorICAgICAgICB2bW92bi51MTYgICAgICAgXHJ4LCBxMTIKKyAgICAgICAgdmJzbCAgICAgICAgICAgIGQyOCwgXHJiLCBccmMKKyAgICAgICAgdmJzbCAgICAgICAgICAgIFxyeCwgXHJhLCBkMjgKKy5lbmRtCisKK2Z1bmMgICAgcG5nX3JlYWRfZmlsdGVyX3Jvd19wYWV0aDRfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3IwLCAjNF0gICAgICAgICAgIEAgcm93Ynl0ZXMKKyAgICAgICAgdm1vdi5pOCAgICAgICAgIGQzLCAgIzAKKyAgICAgICAgdm1vdi5pOCAgICAgICAgIGQyMCwgIzAKKzE6CisgICAgICAgIHZsZDQuMzIgICAgICAgICB7ZDRbXSxkNVtdLGQ2W10sZDdbXX0sICAgIFtyMSw6MTI4XQorICAgICAgICB2bGQ0LjMyICAgICAgICAge2QxNltdLGQxN1tdLGQxOFtdLGQxOVtdfSxbcjIsOjEyOF0hCisgICAgICAgIHBhZXRoICAgICAgICAgICBkMCwgIGQzLCAgZDE2LCBkMjAKKyAgICAgICAgdmFkZC51OCAgICAgICAgIGQwLCAgZDAsICBkNAorICAgICAgICBwYWV0aCAgICAgICAgICAgZDEsICBkMCwgIGQxNywgZDE2CisgICAgICAgIHZhZGQudTggICAgICAgICBkMSwgIGQxLCAgZDUKKyAgICAgICAgcGFldGggICAgICAgICAgIGQyLCAgZDEsICBkMTgsIGQxNworICAgICAgICB2YWRkLnU4ICAgICAgICAgZDIsICBkMiwgIGQ2CisgICAgICAgIHBhZXRoICAgICAgICAgICBkMywgIGQyLCAgZDE5LCBkMTgKKyAgICAgICAgdm1vdiAgICAgICAgICAgIGQyMCwgZDE5CisgICAgICAgIHZhZGQudTggICAgICAgICBkMywgIGQzLCAgZDcKKyAgICAgICAgdnN0NC4zMiAgICAgICAgIHtkMFswXSxkMVswXSxkMlswXSxkM1swXX0sW3IxLDoxMjhdIQorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxNgorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKworICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuYyAgICBwbmdfcmVhZF9maWx0ZXJfcm93X3BhZXRoM19uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LGxyfQorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbcjAsICM0XSAgICAgICAgICAgQCByb3dieXRlcworICAgICAgICB2bW92Lmk4ICAgICAgICAgZDMsICAjMAorICAgICAgICB2bW92Lmk4ICAgICAgICAgZDQsICAjMAorICAgICAgICBtb3YgICAgICAgICAgICAgcjAsICByMQorICAgICAgICBtb3YgICAgICAgICAgICAgcjQsICAjMworICAgICAgICBtb3YgICAgICAgICAgICAgbHIsICAjMTIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxMTF9LCAgICBbcjBdLCBscgorMToKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxMTB9LCAgICBbcjJdLCBscgorICAgICAgICBwYWV0aCAgICAgICAgICAgZDAsICBkMywgIGQyMCwgZDQKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQ1LCAgZDIyLCBkMjMsICMzCisgICAgICAgIHZhZGQudTggICAgICAgICBkMCwgIGQwLCAgZDIyCisgICAgICAgIHZleHQuOCAgICAgICAgICBkMTcsIGQyMCwgZDIxLCAjMworICAgICAgICBwYWV0aCAgICAgICAgICAgZDEsICBkMCwgIGQxNywgZDIwCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDBbMF19LCAgW3IxLDozMl0sIHI0CisgICAgICAgIHZleHQuOCAgICAgICAgICBkNiwgIGQyMiwgZDIzLCAjNgorICAgICAgICB2YWRkLnU4ICAgICAgICAgZDEsICBkMSwgIGQ1CisgICAgICAgIHZleHQuOCAgICAgICAgICBkMTgsIGQyMCwgZDIxLCAjNgorICAgICAgICBwYWV0aCAgICAgICAgICAgZDIsICBkMSwgIGQxOCwgZDE3CisgICAgICAgIHZleHQuOCAgICAgICAgICBkNywgIGQyMywgZDIzLCAjMQorICAgICAgICB2bGQxLjggICAgICAgICAge3ExMX0sICAgIFtyMF0sIGxyCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDFbMF19LCAgW3IxXSwgcjQKKyAgICAgICAgdmFkZC51OCAgICAgICAgIGQyLCAgZDIsICBkNgorICAgICAgICB2ZXh0LjggICAgICAgICAgZDE5LCBkMjEsIGQyMSwgIzEKKyAgICAgICAgcGFldGggICAgICAgICAgIGQzLCAgZDIsICBkMTksIGQxOAorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyWzBdfSwgIFtyMV0sIHI0CisgICAgICAgIHZtb3YgICAgICAgICAgICBkNCwgIGQxOQorICAgICAgICB2YWRkLnU4ICAgICAgICAgZDMsICBkMywgIGQ3CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDNbMF19LCAgW3IxXSwgcjQKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMTIKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNCxwY30KK2VuZGZ1bmMKKyNlbmRpZiAvKiBQTkdfQVJNX05FT05fT1BUID4gMCAqLworI2VuZGlmIC8qIFBOR19BUk1fTkVPTl9JTVBMRU1FTlRBVElPTiA9PSAyIChhc3NlbWJsZXIpICovCisjZW5kaWYgLyogUkVBRCAqLwpkaWZmIC0tZ2l0IGEvbGlicG5nL2FybS9maWx0ZXJfbmVvbl9pbnRyaW5zaWNzLmMgYi9saWJwbmcvYXJtL2ZpbHRlcl9uZW9uX2ludHJpbnNpY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDJjNzg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2FybS9maWx0ZXJfbmVvbl9pbnRyaW5zaWNzLmMKQEAgLTAsMCArMSwzNzMgQEAKKworLyogZmlsdGVyX25lb25faW50cmluc2ljcy5jIC0gTkVPTiBvcHRpbWlzZWQgZmlsdGVyIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAqIFdyaXR0ZW4gYnkgSmFtZXMgWXUgPGphbWVzLnl1IGF0IGxpbmFyby5vcmc+LCBPY3RvYmVyIDIwMTMuCisgKiBCYXNlZCBvbiBmaWx0ZXJfbmVvbi5TLCB3cml0dGVuIGJ5IE1hbnMgUnVsbGdhcmQsIDIwMTEuCisgKgorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMTYgW0RlY2VtYmVyIDIyLCAyMDE0XQorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisgKiBhbmQgbGljZW5zZSBpbiBwbmcuaAorICovCisKKyNpbmNsdWRlICIuLi9wbmdwcml2LmgiCisKKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKKworLyogVGhpcyBjb2RlIHJlcXVpcmVzIC1tZnB1PW5lb24gb24gdGhlIGNvbW1hbmQgbGluZTogKi8KKyNpZiBQTkdfQVJNX05FT05fSU1QTEVNRU5UQVRJT04gPT0gMSAvKiBpbnRyaW5zaWNzIGNvZGUgZnJvbSBwbmdwcml2LmggKi8KKworI2luY2x1ZGUgPGFybV9uZW9uLmg+CisKKy8qIGxpYnBuZyByb3cgcG9pbnRlcnMgYXJlIG5vdCBuZWNlc3NhcmlseSBhbGlnbmVkIHRvIGFueSBwYXJ0aWN1bGFyIGJvdW5kYXJ5LAorICogaG93ZXZlciB0aGlzIGNvZGUgd2lsbCBvbmx5IHdvcmsgd2l0aCBhcHByb3ByaWF0ZSBhbGlnbm1lbnQuICBhcm0vYXJtX2luaXQuYworICogY2hlY2tzIGZvciB0aGlzIChhbmQgd2lsbCBub3QgY29tcGlsZSB1bmxlc3MgaXQgaXMgZG9uZSkuIFRoaXMgY29kZSB1c2VzCisgKiB2YXJpYW50cyBvZiBwbmdfYWxpZ25jYXN0IHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLgorICovCisjZGVmaW5lIHBuZ19wdHIodHlwZSxwb2ludGVyKSBwbmdfYWxpZ25jYXN0KHR5cGUgKixwb2ludGVyKQorI2RlZmluZSBwbmdfcHRyYyh0eXBlLHBvaW50ZXIpIHBuZ19hbGlnbmNhc3Rjb25zdChjb25zdCB0eXBlICoscG9pbnRlcikKKworLyogVGhlIGZvbGxvd2luZyByZWxpZXMgb24gYSB2YXJpYWJsZSAndGVtcF9wb2ludGVyJyBiZWluZyBkZWNsYXJlZCB3aXRoIHR5cGUKKyAqICd0eXBlJy4gIFRoaXMgaXMgd3JpdHRlbiB0aGlzIHdheSBqdXN0IHRvIGhpZGUgdGhlIEdDQyBzdHJpY3QgYWxpYXNpbmcKKyAqIHdhcm5pbmc7IG5vdGUgdGhhdCB0aGUgY29kZSBpcyBzYWZlIGJlY2F1c2UgdGhlcmUgbmV2ZXIgaXMgYW4gYWxpYXMgYmV0d2VlbgorICogdGhlIGlucHV0IGFuZCBvdXRwdXQgcG9pbnRlcnMuCisgKi8KKyNkZWZpbmUgcG5nX2xkcih0eXBlLHBvaW50ZXIpXAorICAgKHRlbXBfcG9pbnRlciA9IHBuZ19wdHIodHlwZSxwb2ludGVyKSwgKnRlbXBfcG9pbnRlcikKKworI2lmIFBOR19BUk1fTkVPTl9PUFQgPiAwCisKK3ZvaWQKK3BuZ19yZWFkX2ZpbHRlcl9yb3dfdXBfbmVvbihwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LAorICAgcG5nX2NvbnN0X2J5dGVwIHByZXZfcm93KQoreworICAgcG5nX2J5dGVwIHJwID0gcm93OworICAgcG5nX2J5dGVwIHJwX3N0b3AgPSByb3cgKyByb3dfaW5mby0+cm93Ynl0ZXM7CisgICBwbmdfY29uc3RfYnl0ZXAgcHAgPSBwcmV2X3JvdzsKKworICAgZm9yICg7IHJwIDwgcnBfc3RvcDsgcnAgKz0gMTYsIHBwICs9IDE2KQorICAgeworICAgICAgdWludDh4MTZfdCBxcnAsIHFwcDsKKworICAgICAgcXJwID0gdmxkMXFfdTgocnApOworICAgICAgcXBwID0gdmxkMXFfdTgocHApOworICAgICAgcXJwID0gdmFkZHFfdTgocXJwLCBxcHApOworICAgICAgdnN0MXFfdTgocnAsIHFycCk7CisgICB9Cit9CisKK3ZvaWQKK3BuZ19yZWFkX2ZpbHRlcl9yb3dfc3ViM19uZW9uKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csCisgICBwbmdfY29uc3RfYnl0ZXAgcHJldl9yb3cpCit7CisgICBwbmdfYnl0ZXAgcnAgPSByb3c7CisgICBwbmdfYnl0ZXAgcnBfc3RvcCA9IHJvdyArIHJvd19pbmZvLT5yb3dieXRlczsKKworICAgdWludDh4MTZfdCB2dG1wID0gdmxkMXFfdTgocnApOworICAgdWludDh4OHgyX3QgKnZycHQgPSBwbmdfcHRyKHVpbnQ4eDh4Ml90LCAmdnRtcCk7CisgICB1aW50OHg4eDJfdCB2cnAgPSAqdnJwdDsKKworICAgdWludDh4OHg0X3QgdmRlc3Q7CisgICB2ZGVzdC52YWxbM10gPSB2ZHVwX25fdTgoMCk7CisKKyAgIGZvciAoOyBycCA8IHJwX3N0b3A7KQorICAgeworICAgICAgdWludDh4OF90IHZ0bXAxLCB2dG1wMjsKKyAgICAgIHVpbnQzMngyX3QgKnRlbXBfcG9pbnRlcjsKKworICAgICAgdnRtcDEgPSB2ZXh0X3U4KHZycC52YWxbMF0sIHZycC52YWxbMV0sIDMpOworICAgICAgdmRlc3QudmFsWzBdID0gdmFkZF91OCh2ZGVzdC52YWxbM10sIHZycC52YWxbMF0pOworICAgICAgdnRtcDIgPSB2ZXh0X3U4KHZycC52YWxbMF0sIHZycC52YWxbMV0sIDYpOworICAgICAgdmRlc3QudmFsWzFdID0gdmFkZF91OCh2ZGVzdC52YWxbMF0sIHZ0bXAxKTsKKworICAgICAgdnRtcDEgPSB2ZXh0X3U4KHZycC52YWxbMV0sIHZycC52YWxbMV0sIDEpOworICAgICAgdmRlc3QudmFsWzJdID0gdmFkZF91OCh2ZGVzdC52YWxbMV0sIHZ0bXAyKTsKKyAgICAgIHZkZXN0LnZhbFszXSA9IHZhZGRfdTgodmRlc3QudmFsWzJdLCB2dG1wMSk7CisKKyAgICAgIHZ0bXAgPSB2bGQxcV91OChycCArIDEyKTsKKyAgICAgIHZycHQgPSBwbmdfcHRyKHVpbnQ4eDh4Ml90LCAmdnRtcCk7CisgICAgICB2cnAgPSAqdnJwdDsKKworICAgICAgdnN0MV9sYW5lX3UzMihwbmdfcHRyKHVpbnQzMl90LHJwKSwgcG5nX2xkcih1aW50MzJ4Ml90LCZ2ZGVzdC52YWxbMF0pLCAwKTsKKyAgICAgIHJwICs9IDM7CisgICAgICB2c3QxX2xhbmVfdTMyKHBuZ19wdHIodWludDMyX3QscnApLCBwbmdfbGRyKHVpbnQzMngyX3QsJnZkZXN0LnZhbFsxXSksIDApOworICAgICAgcnAgKz0gMzsKKyAgICAgIHZzdDFfbGFuZV91MzIocG5nX3B0cih1aW50MzJfdCxycCksIHBuZ19sZHIodWludDMyeDJfdCwmdmRlc3QudmFsWzJdKSwgMCk7CisgICAgICBycCArPSAzOworICAgICAgdnN0MV9sYW5lX3UzMihwbmdfcHRyKHVpbnQzMl90LHJwKSwgcG5nX2xkcih1aW50MzJ4Ml90LCZ2ZGVzdC52YWxbM10pLCAwKTsKKyAgICAgIHJwICs9IDM7CisgICB9CisKKyAgIFBOR19VTlVTRUQocHJldl9yb3cpCit9CisKK3ZvaWQKK3BuZ19yZWFkX2ZpbHRlcl9yb3dfc3ViNF9uZW9uKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csCisgICBwbmdfY29uc3RfYnl0ZXAgcHJldl9yb3cpCit7CisgICBwbmdfYnl0ZXAgcnAgPSByb3c7CisgICBwbmdfYnl0ZXAgcnBfc3RvcCA9IHJvdyArIHJvd19pbmZvLT5yb3dieXRlczsKKworICAgdWludDh4OHg0X3QgdmRlc3Q7CisgICB2ZGVzdC52YWxbM10gPSB2ZHVwX25fdTgoMCk7CisKKyAgIGZvciAoOyBycCA8IHJwX3N0b3A7IHJwICs9IDE2KQorICAgeworICAgICAgdWludDMyeDJ4NF90IHZ0bXAgPSB2bGQ0X3UzMihwbmdfcHRyKHVpbnQzMl90LHJwKSk7CisgICAgICB1aW50OHg4eDRfdCAqdnJwdCA9IHBuZ19wdHIodWludDh4OHg0X3QsJnZ0bXApOworICAgICAgdWludDh4OHg0X3QgdnJwID0gKnZycHQ7CisgICAgICB1aW50MzJ4Mng0X3QgKnRlbXBfcG9pbnRlcjsKKworICAgICAgdmRlc3QudmFsWzBdID0gdmFkZF91OCh2ZGVzdC52YWxbM10sIHZycC52YWxbMF0pOworICAgICAgdmRlc3QudmFsWzFdID0gdmFkZF91OCh2ZGVzdC52YWxbMF0sIHZycC52YWxbMV0pOworICAgICAgdmRlc3QudmFsWzJdID0gdmFkZF91OCh2ZGVzdC52YWxbMV0sIHZycC52YWxbMl0pOworICAgICAgdmRlc3QudmFsWzNdID0gdmFkZF91OCh2ZGVzdC52YWxbMl0sIHZycC52YWxbM10pOworICAgICAgdnN0NF9sYW5lX3UzMihwbmdfcHRyKHVpbnQzMl90LHJwKSwgcG5nX2xkcih1aW50MzJ4Mng0X3QsJnZkZXN0KSwgMCk7CisgICB9CisKKyAgIFBOR19VTlVTRUQocHJldl9yb3cpCit9CisKK3ZvaWQKK3BuZ19yZWFkX2ZpbHRlcl9yb3dfYXZnM19uZW9uKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csCisgICBwbmdfY29uc3RfYnl0ZXAgcHJldl9yb3cpCit7CisgICBwbmdfYnl0ZXAgcnAgPSByb3c7CisgICBwbmdfY29uc3RfYnl0ZXAgcHAgPSBwcmV2X3JvdzsKKyAgIHBuZ19ieXRlcCBycF9zdG9wID0gcm93ICsgcm93X2luZm8tPnJvd2J5dGVzOworCisgICB1aW50OHgxNl90IHZ0bXA7CisgICB1aW50OHg4eDJfdCAqdnJwdDsKKyAgIHVpbnQ4eDh4Ml90IHZycDsKKyAgIHVpbnQ4eDh4NF90IHZkZXN0OworICAgdmRlc3QudmFsWzNdID0gdmR1cF9uX3U4KDApOworCisgICB2dG1wID0gdmxkMXFfdTgocnApOworICAgdnJwdCA9IHBuZ19wdHIodWludDh4OHgyX3QsJnZ0bXApOworICAgdnJwID0gKnZycHQ7CisKKyAgIGZvciAoOyBycCA8IHJwX3N0b3A7IHBwICs9IDEyKQorICAgeworICAgICAgdWludDh4OF90IHZ0bXAxLCB2dG1wMiwgdnRtcDM7CisKKyAgICAgIHVpbnQ4eDh4Ml90ICp2cHB0OworICAgICAgdWludDh4OHgyX3QgdnBwOworCisgICAgICB1aW50MzJ4Ml90ICp0ZW1wX3BvaW50ZXI7CisKKyAgICAgIHZ0bXAgPSB2bGQxcV91OChwcCk7CisgICAgICB2cHB0ID0gcG5nX3B0cih1aW50OHg4eDJfdCwmdnRtcCk7CisgICAgICB2cHAgPSAqdnBwdDsKKworICAgICAgdnRtcDEgPSB2ZXh0X3U4KHZycC52YWxbMF0sIHZycC52YWxbMV0sIDMpOworICAgICAgdmRlc3QudmFsWzBdID0gdmhhZGRfdTgodmRlc3QudmFsWzNdLCB2cHAudmFsWzBdKTsKKyAgICAgIHZkZXN0LnZhbFswXSA9IHZhZGRfdTgodmRlc3QudmFsWzBdLCB2cnAudmFsWzBdKTsKKworICAgICAgdnRtcDIgPSB2ZXh0X3U4KHZwcC52YWxbMF0sIHZwcC52YWxbMV0sIDMpOworICAgICAgdnRtcDMgPSB2ZXh0X3U4KHZycC52YWxbMF0sIHZycC52YWxbMV0sIDYpOworICAgICAgdmRlc3QudmFsWzFdID0gdmhhZGRfdTgodmRlc3QudmFsWzBdLCB2dG1wMik7CisgICAgICB2ZGVzdC52YWxbMV0gPSB2YWRkX3U4KHZkZXN0LnZhbFsxXSwgdnRtcDEpOworCisgICAgICB2dG1wMiA9IHZleHRfdTgodnBwLnZhbFswXSwgdnBwLnZhbFsxXSwgNik7CisgICAgICB2dG1wMSA9IHZleHRfdTgodnJwLnZhbFsxXSwgdnJwLnZhbFsxXSwgMSk7CisKKyAgICAgIHZ0bXAgPSB2bGQxcV91OChycCArIDEyKTsKKyAgICAgIHZycHQgPSBwbmdfcHRyKHVpbnQ4eDh4Ml90LCZ2dG1wKTsKKyAgICAgIHZycCA9ICp2cnB0OworCisgICAgICB2ZGVzdC52YWxbMl0gPSB2aGFkZF91OCh2ZGVzdC52YWxbMV0sIHZ0bXAyKTsKKyAgICAgIHZkZXN0LnZhbFsyXSA9IHZhZGRfdTgodmRlc3QudmFsWzJdLCB2dG1wMyk7CisKKyAgICAgIHZ0bXAyID0gdmV4dF91OCh2cHAudmFsWzFdLCB2cHAudmFsWzFdLCAxKTsKKworICAgICAgdmRlc3QudmFsWzNdID0gdmhhZGRfdTgodmRlc3QudmFsWzJdLCB2dG1wMik7CisgICAgICB2ZGVzdC52YWxbM10gPSB2YWRkX3U4KHZkZXN0LnZhbFszXSwgdnRtcDEpOworCisgICAgICB2c3QxX2xhbmVfdTMyKHBuZ19wdHIodWludDMyX3QscnApLCBwbmdfbGRyKHVpbnQzMngyX3QsJnZkZXN0LnZhbFswXSksIDApOworICAgICAgcnAgKz0gMzsKKyAgICAgIHZzdDFfbGFuZV91MzIocG5nX3B0cih1aW50MzJfdCxycCksIHBuZ19sZHIodWludDMyeDJfdCwmdmRlc3QudmFsWzFdKSwgMCk7CisgICAgICBycCArPSAzOworICAgICAgdnN0MV9sYW5lX3UzMihwbmdfcHRyKHVpbnQzMl90LHJwKSwgcG5nX2xkcih1aW50MzJ4Ml90LCZ2ZGVzdC52YWxbMl0pLCAwKTsKKyAgICAgIHJwICs9IDM7CisgICAgICB2c3QxX2xhbmVfdTMyKHBuZ19wdHIodWludDMyX3QscnApLCBwbmdfbGRyKHVpbnQzMngyX3QsJnZkZXN0LnZhbFszXSksIDApOworICAgICAgcnAgKz0gMzsKKyAgIH0KK30KKwordm9pZAorcG5nX3JlYWRfZmlsdGVyX3Jvd19hdmc0X25lb24ocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywKKyAgIHBuZ19jb25zdF9ieXRlcCBwcmV2X3JvdykKK3sKKyAgIHBuZ19ieXRlcCBycCA9IHJvdzsKKyAgIHBuZ19ieXRlcCBycF9zdG9wID0gcm93ICsgcm93X2luZm8tPnJvd2J5dGVzOworICAgcG5nX2NvbnN0X2J5dGVwIHBwID0gcHJldl9yb3c7CisKKyAgIHVpbnQ4eDh4NF90IHZkZXN0OworICAgdmRlc3QudmFsWzNdID0gdmR1cF9uX3U4KDApOworCisgICBmb3IgKDsgcnAgPCBycF9zdG9wOyBycCArPSAxNiwgcHAgKz0gMTYpCisgICB7CisgICAgICB1aW50MzJ4Mng0X3QgdnRtcDsKKyAgICAgIHVpbnQ4eDh4NF90ICp2cnB0LCAqdnBwdDsKKyAgICAgIHVpbnQ4eDh4NF90IHZycCwgdnBwOworICAgICAgdWludDMyeDJ4NF90ICp0ZW1wX3BvaW50ZXI7CisKKyAgICAgIHZ0bXAgPSB2bGQ0X3UzMihwbmdfcHRyKHVpbnQzMl90LHJwKSk7CisgICAgICB2cnB0ID0gcG5nX3B0cih1aW50OHg4eDRfdCwmdnRtcCk7CisgICAgICB2cnAgPSAqdnJwdDsKKyAgICAgIHZ0bXAgPSB2bGQ0X3UzMihwbmdfcHRyYyh1aW50MzJfdCxwcCkpOworICAgICAgdnBwdCA9IHBuZ19wdHIodWludDh4OHg0X3QsJnZ0bXApOworICAgICAgdnBwID0gKnZwcHQ7CisKKyAgICAgIHZkZXN0LnZhbFswXSA9IHZoYWRkX3U4KHZkZXN0LnZhbFszXSwgdnBwLnZhbFswXSk7CisgICAgICB2ZGVzdC52YWxbMF0gPSB2YWRkX3U4KHZkZXN0LnZhbFswXSwgdnJwLnZhbFswXSk7CisgICAgICB2ZGVzdC52YWxbMV0gPSB2aGFkZF91OCh2ZGVzdC52YWxbMF0sIHZwcC52YWxbMV0pOworICAgICAgdmRlc3QudmFsWzFdID0gdmFkZF91OCh2ZGVzdC52YWxbMV0sIHZycC52YWxbMV0pOworICAgICAgdmRlc3QudmFsWzJdID0gdmhhZGRfdTgodmRlc3QudmFsWzFdLCB2cHAudmFsWzJdKTsKKyAgICAgIHZkZXN0LnZhbFsyXSA9IHZhZGRfdTgodmRlc3QudmFsWzJdLCB2cnAudmFsWzJdKTsKKyAgICAgIHZkZXN0LnZhbFszXSA9IHZoYWRkX3U4KHZkZXN0LnZhbFsyXSwgdnBwLnZhbFszXSk7CisgICAgICB2ZGVzdC52YWxbM10gPSB2YWRkX3U4KHZkZXN0LnZhbFszXSwgdnJwLnZhbFszXSk7CisKKyAgICAgIHZzdDRfbGFuZV91MzIocG5nX3B0cih1aW50MzJfdCxycCksIHBuZ19sZHIodWludDMyeDJ4NF90LCZ2ZGVzdCksIDApOworICAgfQorfQorCitzdGF0aWMgdWludDh4OF90CitwYWV0aCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIsIHVpbnQ4eDhfdCBjKQoreworICAgdWludDh4OF90IGQsIGU7CisgICB1aW50MTZ4OF90IHAxLCBwYSwgcGIsIHBjOworCisgICBwMSA9IHZhZGRsX3U4KGEsIGIpOyAvKiBhICsgYiAqLworICAgcGMgPSB2YWRkbF91OChjLCBjKTsgLyogYyAqIDIgKi8KKyAgIHBhID0gdmFiZGxfdTgoYiwgYyk7IC8qIHBhICovCisgICBwYiA9IHZhYmRsX3U4KGEsIGMpOyAvKiBwYiAqLworICAgcGMgPSB2YWJkcV91MTYocDEsIHBjKTsgLyogcGMgKi8KKworICAgcDEgPSB2Y2xlcV91MTYocGEsIHBiKTsgLyogcGEgPD0gcGIgKi8KKyAgIHBhID0gdmNsZXFfdTE2KHBhLCBwYyk7IC8qIHBhIDw9IHBjICovCisgICBwYiA9IHZjbGVxX3UxNihwYiwgcGMpOyAvKiBwYiA8PSBwYyAqLworCisgICBwMSA9IHZhbmRxX3UxNihwMSwgcGEpOyAvKiBwYSA8PSBwYiAmJiBwYSA8PSBwYyAqLworCisgICBkID0gdm1vdm5fdTE2KHBiKTsKKyAgIGUgPSB2bW92bl91MTYocDEpOworCisgICBkID0gdmJzbF91OChkLCBiLCBjKTsKKyAgIGUgPSB2YnNsX3U4KGUsIGEsIGQpOworCisgICByZXR1cm4gZTsKK30KKwordm9pZAorcG5nX3JlYWRfZmlsdGVyX3Jvd19wYWV0aDNfbmVvbihwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LAorICAgcG5nX2NvbnN0X2J5dGVwIHByZXZfcm93KQoreworICAgcG5nX2J5dGVwIHJwID0gcm93OworICAgcG5nX2NvbnN0X2J5dGVwIHBwID0gcHJldl9yb3c7CisgICBwbmdfYnl0ZXAgcnBfc3RvcCA9IHJvdyArIHJvd19pbmZvLT5yb3dieXRlczsKKworICAgdWludDh4MTZfdCB2dG1wOworICAgdWludDh4OHgyX3QgKnZycHQ7CisgICB1aW50OHg4eDJfdCB2cnA7CisgICB1aW50OHg4X3Qgdmxhc3QgPSB2ZHVwX25fdTgoMCk7CisgICB1aW50OHg4eDRfdCB2ZGVzdDsKKyAgIHZkZXN0LnZhbFszXSA9IHZkdXBfbl91OCgwKTsKKworICAgdnRtcCA9IHZsZDFxX3U4KHJwKTsKKyAgIHZycHQgPSBwbmdfcHRyKHVpbnQ4eDh4Ml90LCZ2dG1wKTsKKyAgIHZycCA9ICp2cnB0OworCisgICBmb3IgKDsgcnAgPCBycF9zdG9wOyBwcCArPSAxMikKKyAgIHsKKyAgICAgIHVpbnQ4eDh4Ml90ICp2cHB0OworICAgICAgdWludDh4OHgyX3QgdnBwOworICAgICAgdWludDh4OF90IHZ0bXAxLCB2dG1wMiwgdnRtcDM7CisgICAgICB1aW50MzJ4Ml90ICp0ZW1wX3BvaW50ZXI7CisKKyAgICAgIHZ0bXAgPSB2bGQxcV91OChwcCk7CisgICAgICB2cHB0ID0gcG5nX3B0cih1aW50OHg4eDJfdCwmdnRtcCk7CisgICAgICB2cHAgPSAqdnBwdDsKKworICAgICAgdmRlc3QudmFsWzBdID0gcGFldGgodmRlc3QudmFsWzNdLCB2cHAudmFsWzBdLCB2bGFzdCk7CisgICAgICB2ZGVzdC52YWxbMF0gPSB2YWRkX3U4KHZkZXN0LnZhbFswXSwgdnJwLnZhbFswXSk7CisKKyAgICAgIHZ0bXAxID0gdmV4dF91OCh2cnAudmFsWzBdLCB2cnAudmFsWzFdLCAzKTsKKyAgICAgIHZ0bXAyID0gdmV4dF91OCh2cHAudmFsWzBdLCB2cHAudmFsWzFdLCAzKTsKKyAgICAgIHZkZXN0LnZhbFsxXSA9IHBhZXRoKHZkZXN0LnZhbFswXSwgdnRtcDIsIHZwcC52YWxbMF0pOworICAgICAgdmRlc3QudmFsWzFdID0gdmFkZF91OCh2ZGVzdC52YWxbMV0sIHZ0bXAxKTsKKworICAgICAgdnRtcDEgPSB2ZXh0X3U4KHZycC52YWxbMF0sIHZycC52YWxbMV0sIDYpOworICAgICAgdnRtcDMgPSB2ZXh0X3U4KHZwcC52YWxbMF0sIHZwcC52YWxbMV0sIDYpOworICAgICAgdmRlc3QudmFsWzJdID0gcGFldGgodmRlc3QudmFsWzFdLCB2dG1wMywgdnRtcDIpOworICAgICAgdmRlc3QudmFsWzJdID0gdmFkZF91OCh2ZGVzdC52YWxbMl0sIHZ0bXAxKTsKKworICAgICAgdnRtcDEgPSB2ZXh0X3U4KHZycC52YWxbMV0sIHZycC52YWxbMV0sIDEpOworICAgICAgdnRtcDIgPSB2ZXh0X3U4KHZwcC52YWxbMV0sIHZwcC52YWxbMV0sIDEpOworCisgICAgICB2dG1wID0gdmxkMXFfdTgocnAgKyAxMik7CisgICAgICB2cnB0ID0gcG5nX3B0cih1aW50OHg4eDJfdCwmdnRtcCk7CisgICAgICB2cnAgPSAqdnJwdDsKKworICAgICAgdmRlc3QudmFsWzNdID0gcGFldGgodmRlc3QudmFsWzJdLCB2dG1wMiwgdnRtcDMpOworICAgICAgdmRlc3QudmFsWzNdID0gdmFkZF91OCh2ZGVzdC52YWxbM10sIHZ0bXAxKTsKKworICAgICAgdmxhc3QgPSB2dG1wMjsKKworICAgICAgdnN0MV9sYW5lX3UzMihwbmdfcHRyKHVpbnQzMl90LHJwKSwgcG5nX2xkcih1aW50MzJ4Ml90LCZ2ZGVzdC52YWxbMF0pLCAwKTsKKyAgICAgIHJwICs9IDM7CisgICAgICB2c3QxX2xhbmVfdTMyKHBuZ19wdHIodWludDMyX3QscnApLCBwbmdfbGRyKHVpbnQzMngyX3QsJnZkZXN0LnZhbFsxXSksIDApOworICAgICAgcnAgKz0gMzsKKyAgICAgIHZzdDFfbGFuZV91MzIocG5nX3B0cih1aW50MzJfdCxycCksIHBuZ19sZHIodWludDMyeDJfdCwmdmRlc3QudmFsWzJdKSwgMCk7CisgICAgICBycCArPSAzOworICAgICAgdnN0MV9sYW5lX3UzMihwbmdfcHRyKHVpbnQzMl90LHJwKSwgcG5nX2xkcih1aW50MzJ4Ml90LCZ2ZGVzdC52YWxbM10pLCAwKTsKKyAgICAgIHJwICs9IDM7CisgICB9Cit9CisKK3ZvaWQKK3BuZ19yZWFkX2ZpbHRlcl9yb3dfcGFldGg0X25lb24ocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywKKyAgIHBuZ19jb25zdF9ieXRlcCBwcmV2X3JvdykKK3sKKyAgIHBuZ19ieXRlcCBycCA9IHJvdzsKKyAgIHBuZ19ieXRlcCBycF9zdG9wID0gcm93ICsgcm93X2luZm8tPnJvd2J5dGVzOworICAgcG5nX2NvbnN0X2J5dGVwIHBwID0gcHJldl9yb3c7CisKKyAgIHVpbnQ4eDhfdCB2bGFzdCA9IHZkdXBfbl91OCgwKTsKKyAgIHVpbnQ4eDh4NF90IHZkZXN0OworICAgdmRlc3QudmFsWzNdID0gdmR1cF9uX3U4KDApOworCisgICBmb3IgKDsgcnAgPCBycF9zdG9wOyBycCArPSAxNiwgcHAgKz0gMTYpCisgICB7CisgICAgICB1aW50MzJ4Mng0X3QgdnRtcDsKKyAgICAgIHVpbnQ4eDh4NF90ICp2cnB0LCAqdnBwdDsKKyAgICAgIHVpbnQ4eDh4NF90IHZycCwgdnBwOworICAgICAgdWludDMyeDJ4NF90ICp0ZW1wX3BvaW50ZXI7CisKKyAgICAgIHZ0bXAgPSB2bGQ0X3UzMihwbmdfcHRyKHVpbnQzMl90LHJwKSk7CisgICAgICB2cnB0ID0gcG5nX3B0cih1aW50OHg4eDRfdCwmdnRtcCk7CisgICAgICB2cnAgPSAqdnJwdDsKKyAgICAgIHZ0bXAgPSB2bGQ0X3UzMihwbmdfcHRyYyh1aW50MzJfdCxwcCkpOworICAgICAgdnBwdCA9IHBuZ19wdHIodWludDh4OHg0X3QsJnZ0bXApOworICAgICAgdnBwID0gKnZwcHQ7CisKKyAgICAgIHZkZXN0LnZhbFswXSA9IHBhZXRoKHZkZXN0LnZhbFszXSwgdnBwLnZhbFswXSwgdmxhc3QpOworICAgICAgdmRlc3QudmFsWzBdID0gdmFkZF91OCh2ZGVzdC52YWxbMF0sIHZycC52YWxbMF0pOworICAgICAgdmRlc3QudmFsWzFdID0gcGFldGgodmRlc3QudmFsWzBdLCB2cHAudmFsWzFdLCB2cHAudmFsWzBdKTsKKyAgICAgIHZkZXN0LnZhbFsxXSA9IHZhZGRfdTgodmRlc3QudmFsWzFdLCB2cnAudmFsWzFdKTsKKyAgICAgIHZkZXN0LnZhbFsyXSA9IHBhZXRoKHZkZXN0LnZhbFsxXSwgdnBwLnZhbFsyXSwgdnBwLnZhbFsxXSk7CisgICAgICB2ZGVzdC52YWxbMl0gPSB2YWRkX3U4KHZkZXN0LnZhbFsyXSwgdnJwLnZhbFsyXSk7CisgICAgICB2ZGVzdC52YWxbM10gPSBwYWV0aCh2ZGVzdC52YWxbMl0sIHZwcC52YWxbM10sIHZwcC52YWxbMl0pOworICAgICAgdmRlc3QudmFsWzNdID0gdmFkZF91OCh2ZGVzdC52YWxbM10sIHZycC52YWxbM10pOworCisgICAgICB2bGFzdCA9IHZwcC52YWxbM107CisKKyAgICAgIHZzdDRfbGFuZV91MzIocG5nX3B0cih1aW50MzJfdCxycCksIHBuZ19sZHIodWludDMyeDJ4NF90LCZ2ZGVzdCksIDApOworICAgfQorfQorCisjZW5kaWYgLyogUE5HX0FSTV9ORU9OX09QVCA+IDAgKi8KKyNlbmRpZiAvKiBQTkdfQVJNX05FT05fSU1QTEVNRU5UQVRJT04gPT0gMSAoaW50cmluc2ljcykgKi8KKyNlbmRpZiAvKiBSRUFEICovCmRpZmYgLS1naXQgYS9saWJwbmcvYXV0b2dlbi5zaCBiL2xpYnBuZy9hdXRvZ2VuLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkxNjA3MTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvYXV0b2dlbi5zaApAQCAtMCwwICsxLDIyNSBAQAorIyEgL2Jpbi9zaAorIworIyBSdW4gJ2F1dG9yZWNvbmYnIHRvIGJ1aWxkICdjb25maWd1cmUnLCAnTWFrZWZpbGUuaW4nIGFuZCBvdGhlciBjb25maWd1cmUKKyMgY29udHJvbCBmaWxlcy4KKyMKKyMgVGhlIGZpcnN0IHRpbWUgdGhpcyBpcyBydW4gb24gYSBHSVQgY2hlY2tvdXQgdGhlIG9ubHkgZmlsZXMgdGhhdCBleGlzdCBhcmUKKyMgY29uZmlndXJlLmFjIGFuZCBNYWtlZmlsZS5hbTsgYWxsIG9mIHRoZSBhdXRvdG9vbHMgc3VwcG9ydCBzY3JpcHRzIGFyZQorIyBtaXNzaW5nLiAgVGhleSBhcmUgaW5zdGFudGlhdGVkIHdpdGggYXV0b3JlY29uZiAtLWZvcmNlIC0taW5zdGFsbC4KKyMKKyMgRm9yIHJlZ3VsYXIgKCJ0YXJiYWxsIikgZGlzdHJpYnV0aW9ucyBhbGwgdGhlIGZpbGVzIHNob3VsZCBleGlzdC4gIFdlIGRvIG5vdAorIyB3YW50IHRoZW0gdG8gYmUgdXBkYXRlZCAqdW5kZXIgYW55IGNpcmN1bXN0YW5jZXMqLiAgSXQgc2hvdWxkIG5ldmVyIGJlCisjIG5lY2Vzc2FyeSB0byBydW4gYXV0b2dlbi5zaCBiZWNhdXNlIC4vY29uZmlndXJlIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBzYXlzCisjIHdoYXQgdG8gZG8gaWYgTWFrZWZpbGUuYW0gb3IgY29uZmlndXJlLmFjIGFyZSBjaGFuZ2VkLgorIworIyBJdCBpcyAqcHJvYmFibHkqIE9LIHRvIHVwZGF0ZSB0aGUgZmlsZXMgb24gYSBHSVQgY2hlY2tvdXQsIGJlY2F1c2UgdGhleSBoYXZlCisjIGNvbWUgZnJvbSB0aGUgbG9jYWwgdG9vbHMsIGJ1dCBsZWF2ZSB0aGF0IHRvIHRoZSB1c2VyIHdobyBpcyBhc3N1bWVkIHRvIGtub3cKKyMgd2hldGhlciBpdCBpcyBvayBvciByZXF1aXJlZC4KKyMKKyMgVGhpcyBzY3JpcHQgaXMgaW50ZW5kZWQgdG8gd29yayB3aXRob3V0IGFyZ3VtZW50cywgdGhlcmUgYXJlLCBob3dldmVyLCBoaWRkZW4KKyMgYXJndW1lbnRzIChhKSBmb3IgdXNlIHdoaWxlIHRlc3RpbmcgdGhlIHNjcmlwdCBhbmQgKGIpIHRvIGZpeCB1cCBzeXN0ZW1zIHRoYXQKKyMgaGF2ZSBiZWVuIGJyb2tlbi4gIElmIChiKSBpcyByZXF1aXJlZCB0aGUgc2NyaXB0IHByb21wdHMgZm9yIHRoZSBjb3JyZWN0CisjIG9wdGlvbnMuICBGb3IgdGhpcyByZWFzb24gdGhlIG9wdGlvbnMgYXJlICpOT1QqIGRvY3VtZW50ZWQgaW4gdGhlIGhlbHA7IHRoaXMKKyMgaXMgZGVsaWJlcmF0ZTsgVVRTTC4KKyMKK2NsZWFuPQorbWFpbnRhaW5lcj0KK3doaWxlIHRlc3QgJCMgLWd0IDAKK2RvCisgICBjYXNlICIkMSIgaW4KKyAgICAgIC0tbWFpbnRhaW5lcikKKyAgICAgICAgIG1haW50YWluZXI9MTs7CisKKyAgICAgIC0tY2xlYW4pCisgICAgICAgICBjbGVhbj0xOzsKKworICAgICAgKikKKyAgICAgICAgIGV4ZWMgPiYyCisgICAgICAgICBlY2hvICIkMDogdXNhZ2U6IC4vYXV0b2dlbi5zaCIKKyAgICAgICAgIGlmIHRlc3QgLWQgLmdpdAorICAgICAgICAgdGhlbgorICAgICAgICAgICAgZWNobyAiICAuL2F1dG9nZW4uc2ggZ2VuZXJhdGVzIHRoZSBjb25maWd1cmUgc2NyaXB0IGFuZCIKKyAgICAgICAgICAgIGVjaG8gIiAgTWFrZWZpbGUuaW4sIG9yIHJlZnJlc2hlcyB0aGVtIGFmdGVyIGNoYW5nZXMgdG8gTWFrZWZpbGUuYW0iCisgICAgICAgICAgICBlY2hvICIgIG9yIGNvbmZpZ3VyZS5hYy4gIFlvdSBtYXkgcHJlZmVyIHRvIGp1c3QgcnVuIGF1dG9yZWNvbmYuIgorICAgICAgICAgZWxpZiB0ZXN0IC16ICIkbWFpbnRhaW5lciIKKyAgICAgICAgIHRoZW4KKyAgICAgICAgICAgIGVjaG8gIiAgRE8gTk9UIFJVTiBUSElTIFNDUklQVC4iCisgICAgICAgICAgICBlY2hvICIgIElmIHlvdSBuZWVkIHRvIGNoYW5nZSBNYWtlZmlsZS5hbSBvciBjb25maWd1cmUuYWMgdGhlbiB5b3UiCisgICAgICAgICAgICBlY2hvICIgIGFsc28gbmVlZCB0byBydW4gLi9jb25maWd1cmUgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGFuZCIKKyAgICAgICAgICAgIGVjaG8gIiAgdXNlIHRoZSBhcHByb3ByaWF0ZSBhdXRvdG9vbHMsICpOT1QqIHRoaXMgc2NyaXB0LCB0byB1cGRhdGUiCisgICAgICAgICAgICBlY2hvICIgIGV2ZXJ5dGhpbmcsIHBsZWFzZSBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhdXRvcmVjb25mLiIKKyAgICAgICAgICAgIGVjaG8gIiAgV0FSTklORzogbGlicG5nIGlzIGludGVudGlvbmFsbHkgZ2VuZXJhdGVkIHdpdGggYSBrbm93biwiCisgICAgICAgICAgICBlY2hvICIgIGZpeGVkLCBzZXQgb2YgYXV0b3Rvb2xzLiAgSXQgaXMga25vd24gKk5PVCogdG8gd29yayB3aXRoIgorICAgICAgICAgICAgZWNobyAiICB0aGUgY29sbGVjdGlvbiBvZiBhdXRvdG9vbHMgZGlzdHJpYnV0ZWQgb24gaGlnaGx5IHJlcHV0YWJsZSIKKyAgICAgICAgICAgIGVjaG8gIiAgb3BlcmF0aW5nIHN5c3RlbXMuIgorICAgICAgICAgICAgZWNobyAiICBSZW1lbWJlcjogYXV0b3Rvb2xzIGlzIEdOVSBzb2Z0d2FyZSwgeW91IGFyZSBleHBlY3RlZCB0byIKKyAgICAgICAgICAgIGVjaG8gIiAgcGF5IGZvciBzdXBwb3J0LiIKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIiAgWW91IGhhdmUgcnVuIGF1dG9nZW4uc2ggd2l0aCAtLW1haW50YWluZXIgZW5hYmxlZCBhbmQgeW91IgorICAgICAgICAgICAgZWNobyAiICBhcmUgbm90IHVzaW5nIGEgR0lUIGRpc3RyaWJ1dGlvbiwgdGhlbiB5b3UgaGF2ZSBnaXZlbiBhbiIKKyAgICAgICAgICAgIGVjaG8gIiAgdW5yZWNvZ25pemVkIGFyZ3VtZW50LiAgVGhpcyBpcyBub3QgZ29vZC4gLS1tYWludGFpbmVyIgorICAgICAgICAgICAgZWNobyAiICBzd2l0Y2hlcyBvZmYgYW55IGFzc3VtcHRpb25zIHRoYXQgeW91IG1pZ2h0IG5vdCBrbm93IHdoYXQiCisgICAgICAgICAgICBlY2hvICIgIHlvdSBhcmUgZG9pbmcuIgorICAgICAgICAgZmkKKyAgICAgICAgIGV4aXQgMTs7CisgICBlc2FjCisKKyAgIHNoaWZ0Citkb25lCisjCisjIEZpcnN0IGNoZWNrIGZvciBhIHNldCBvZiB0aGUgYXV0b3Rvb2xzIGZpbGVzOyBpZiBhYnNlbnQgdGhlbiB0aGlzIGlzIGFzc3VtZWQKKyMgdG8gYmUgYSBHSVQgdmVyc2lvbiBhbmQgdGhlIGxvY2FsIGF1dG90b29scyBtdXN0IGJlIHVzZWQuICBJZiBwcmVzZW50IHRoaXMKKyMgaXMgYSB0YXJiYWxsIGRpc3RyaWJ1dGlvbiBhbmQgdGhlIHNjcmlwdCBzaG91bGQgbm90IGJlIHVzZWQuICBJZiBwYXJ0aWFsbHkKKyMgcHJlc2VudCBiYWQgdGhpbmdzIGFyZSBoYXBwZW5pbmcuCisjCisjIFRoZSBhdXRvdG9vbHMgZ2VuZXJhdGVkIGZpbGVzOgorbGlicG5nX2F1dG90b29sc19maWxlcz0iTWFrZWZpbGUuaW4gYWNsb2NhbC5tNCBjb25maWcuZ3Vlc3MgY29uZmlnLmguaW4KKyAgIGNvbmZpZy5zdWIgY29uZmlndXJlIGRlcGNvbXAgaW5zdGFsbC1zaCBsdG1haW4uc2ggbWlzc2luZ1wKKyAgIHRlc3QtZHJpdmVyIgorIworIyBGaWxlcyBnZW5lcmF0ZWQgYnkgdmVyc2lvbnMgb2YgY29uZmlndWUgPjIuNjggb3IgYXV0b21ha2UgPjEuMTMgKGkuZS4gbGF0ZXIKKyMgdmVyc2lvbnMgdGhhbiB0aG9zZSByZXF1aXJlZCBieSBjb25maWd1cmUuYWMpOgorbGlicG5nX2F1dG90b29sc19leHRyYT0iY29tcGlsZSBjb25maWcuaC5pbn4iCisjCisjIFRoZXNlIGFyZSBzZXBhcmF0ZSBiZWNhdXNlICdtYWludGFpbmVyLWNsZWFuJyBkb2VzIG5vdCByZW1vdmUgdGhlbS4KK2xpYnBuZ19saWJ0b29sX2ZpbGVzPSJzY3JpcHRzL2xpYnRvb2wubTQgc2NyaXB0cy9sdG9wdGlvbnMubTRcCisgICBzY3JpcHRzL2x0c3VnYXIubTQgc2NyaXB0cy9sdHZlcnNpb24ubTQgc2NyaXB0cy9sdH5vYnNvbGV0ZS5tNCIKKworbGlicG5nX2F1dG90b29sc19kaXJzPSJhdXRvbTR0ZS5jYWNoZSIgIyBub3QgcmVxdWlyZWQKKyMKKyMgVGhlIGNvbmZpZ3VyZSBnZW5lcmF0ZWQgZmlsZXM6CitsaWJwbmdfY29uZmlndXJlX2ZpbGVzPSJNYWtlZmlsZSBjb25maWcuaCBjb25maWcubG9nIGNvbmZpZy5zdGF0dXNcCisgICBsaWJwbmctY29uZmlnIGxpYnBuZy5wYyBsaWJ0b29sIHN0YW1wLWgxIgorCitsaWJwbmdfY29uZmlndXJlX2RpcnM9Ii5kZXBzIgorIworIyBXZSBtdXN0IHJlbW92ZSB0aGUgY29uZmlndXJlIGdlbmVyYXRlZCBmaWxlcyBhcyB3ZWxsIGFzIHRoZSBhdXRvdG9vbHMKKyMgZ2VuZXJhdGVkIGZpbGVzIGlmIGF1dG90b29scyBhcmUgcmVnZW5lcmF0ZWQgYmVjYXVzZSBvdGhlcndpc2UgaWYgY29uZmlndXJlCisjIGhhcyBiZWVuIHJ1biB3aXRob3V0ICItLWVuYWJsZS1tYWludGFpbmVyLW1vZGUiIG1ha2UgY2FuIGRvIGEgcGFydGlhbCB1cGRhdGUKKyMgb2YgTWFrZWZpbGUuICBUaGVzZSBmdW5jdGlvbnMgZG8gdGhlIHR3byBiaXRzIG9mIGNsZWFuaW5nLgorY2xlYW5fYXV0b3Rvb2xzKCl7CisgICBybSAtcmYgJGxpYnBuZ19hdXRvdG9vbHNfZmlsZXMgJGxpYnBuZ19saWJ0b29sX2ZpbGVzICRsaWJwbmdfYXV0b3Rvb2xzX2RpcnMKKyAgIHJtIC1yZiAkbGlicG5nX2F1dG90b29sc19leHRyYQorfQorCitjbGVhbl9jb25maWd1cmUoKXsKKyAgIHJtIC1yZiAkbGlicG5nX2NvbmZpZ3VyZV9maWxlcyAkbGlicG5nX2NvbmZpZ3VyZV9kaXJzCit9CisjCisjIENsZWFuOiByZW1vdmUgZXZlcnl0aGluZyAodGhpcyBpcyB0byBoZWxwIHdpdGggdGVzdGluZykKK2lmIHRlc3QgLW4gIiRjbGVhbiIKK3RoZW4KKyAgIGNsZWFuX2NvbmZpZ3VyZQorICAgaWYgdGVzdCAtbiAiJG1haW50YWluZXIiCisgICB0aGVuCisgICAgICBjbGVhbl9hdXRvdG9vbHMKKyAgIGZpCisKKyAgIGV4aXQgMAorZmkKKyMKKyMgVmFsaWRhdGUgdGhlIGRpc3RyaWJ1dGlvbi4KK2xpYnBuZ19hdXRvdG9vbHNfZmlsZV9mb3VuZD0KK2xpYnBuZ19hdXRvdG9vbHNfZmlsZV9taXNzaW5nPQorZm9yIGZpbGUgaW4gJGxpYnBuZ19hdXRvdG9vbHNfZmlsZXMKK2RvCisgICBpZiB0ZXN0IC1mICAiJGZpbGUiCisgICB0aGVuCisgICAgICBsaWJwbmdfYXV0b3Rvb2xzX2ZpbGVfZm91bmQ9MQorICAgZWxzZQorICAgICAgbGlicG5nX2F1dG90b29sc19maWxlX21pc3Npbmc9MQorICAgZmkKK2RvbmUKKyMKKyMgUHJlc2VuY2Ugb2Ygb25lIG9mIHRoZXNlIGRvZXMgbm90ICppbnZhbGlkYXRlKiBtaXNzaW5nLCBidXQgYWJzZW5jZQorIyBpbnZhbGlkYXRlcyBmb3VuZC4KK2ZvciBmaWxlIGluICRsaWJwbmdfbGlidG9vbF9maWxlcworZG8KKyAgIGlmIHRlc3QgISAtZiAiJGZpbGUiCisgICB0aGVuCisgICAgICBsaWJwbmdfYXV0b3Rvb2xzX2ZpbGVfbWlzc2luZz0xCisgICBmaQorZG9uZQorIworIyBUaGUgY2FjaGUgZGlyZWN0b3J5IGRvZXNuJ3QgbWF0dGVyIC0gaXQgd2lsbCBiZSByZWdlbmVyYXRlZCBhbmQgZG9lcyBub3QgZXhpc3QKKyMgYW55d2F5IGluIGEgdGFyYmFsbC4KKyMKKyMgRWl0aGVyIGV2ZXJ5dGhpbmcgaXMgbWlzc2luZyBvciBldmVyeXRoaW5nIGlzIHRoZXJlLCB0aGUgLS1tYWludGFpbmVyIG9wdGlvbgorIyBqdXN0IGNoYW5nZXMgdGhpcyBzbyB0aGF0IHRoZSBtb2RlIGlzIHNldCB0byBnZW5lcmF0ZSBhbGwgdGhlIGZpbGVzLgorbW9kZT0KK2lmIHRlc3QgLXogIiRsaWJwbmdfYXV0b3Rvb2xzX2ZpbGVfZm91bmQiIC1vIC1uICIkbWFpbnRhaW5lciIKK3RoZW4KKyAgIG1vZGU9ImF1dG9yZWNvbmYiCitlbHNlCisgICBpZiB0ZXN0IC1uICIkbGlicG5nX2F1dG90b29sc19maWxlX21pc3NpbmciCisgICB0aGVuCisgICAgICBtb2RlPSJicm9rZW4iCisgICBlbHNlCisgICAgICBtb2RlPSJjb25maWd1cmUiCisgICBmaQorZmkKKyMKKyMgU286CitjYXNlICIkbW9kZSIgaW4KKyAgIGF1dG9yZWNvbmYpCisgICAgICAjIENsZWFuIGluIGNhc2UgY29uZmlndXJlIGZpbGVzIGV4aXN0CisgICAgICBjbGVhbl9jb25maWd1cmUKKyAgICAgIGNsZWFuX2F1dG90b29scworICAgICAgIyBFdmVyeXRoaW5nIG11c3QgYmUgaW5pdGlhbGl6ZWQsIHNvIHVzZSAtLWZvcmNlCisgICAgICBpZiBhdXRvcmVjb25mIC0td2FybmluZ3M9YWxsIC0tZm9yY2UgLS1pbnN0YWxsCisgICAgICB0aGVuCisgICAgICAgICBtaXNzaW5nPQorICAgICAgICAgZm9yIGZpbGUgaW4gJGxpYnBuZ19hdXRvdG9vbHNfZmlsZXMKKyAgICAgICAgIGRvCisgICAgICAgICAgICB0ZXN0IC1mICIkZmlsZSIgfHwgbWlzc2luZz0xCisgICAgICAgICBkb25lCisgICAgICAgICAjIGlnbm9yZSB0aGUgY2FjaGUgZGlyZWN0b3J5CisgICAgICAgICB0ZXN0IC16ICIkbWlzc2luZyIgfHwgeworICAgICAgICAgICAgZXhlYyA+JjIKKyAgICAgICAgICAgIGVjaG8gImF1dG9yZWNvbmYgd2FzIHJ1biwgYnV0IGRpZCBub3QgcHJvZHVjZSBhbGwgdGhlIGV4cGVjdGVkIgorICAgICAgICAgICAgZWNobyAiZmlsZXMuICBJdCBpcyBsaWtlbHkgdGhhdCB5b3VyIGF1dG90b29scyBpbnN0YWxsYXRpb24gaXMiCisgICAgICAgICAgICBlY2hvICJub3QgY29tcGF0aWJsZSB3aXRoIHRoYXQgZXhwZWN0ZWQgYnkgbGlicG5nLiIKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICAgZXhlYyA+JjIKKyAgICAgICAgIGVjaG8gImF1dG9yZWNvbmYgZmFpbGVkOiB5b3VyIHZlcnNpb24gb2YgYXV0b3Rvb2xzIGlzIGluY29tcGF0aWJsZSIKKyAgICAgICAgIGVjaG8gIndpdGggdGhpcyBsaWJwbmcgdmVyc2lvbi4gIFBsZWFzZSB1c2UgYSBkaXN0cmlidXRlZCBhcmNoaXZlIgorICAgICAgICAgZWNobyAiKHdoaWNoIGluY2x1ZGVzIHRoZSBhdXRvdG9vbHMgZ2VuZXJhdGVkIGZpbGVzKSBhbmQgcnVuIGNvbmZpZ3VyZSIKKyAgICAgICAgIGVjaG8gImluc3RlYWQuIgorICAgICAgICAgZXhpdCAxCisgICAgICBmaTs7CisKKyAgIGNvbmZpZ3VyZSkKKyAgICAgIGlmIHRlc3QgLWQgLmdpdAorICAgICAgdGhlbgorICAgICAgICAgZXhlYyA+JjIKKyAgICAgICAgIGVjaG8gIkVSUk9SOiBydW5uaW5nIGF1dG9yZWNvbmYgb24gYW4gaW5pdGlhbGl6ZWQgc3l0ZW0iCisgICAgICAgICBlY2hvICIgIFRoaXMgaXMgbm90IG5lY2Vzc2FyeTsgaXQgaXMgb25seSBuZWNlc3NhcnkgdG8gcmVtYWtlIHRoZSIKKyAgICAgICAgIGVjaG8gIiAgYXV0b3Rvb2xzIGdlbmVyYXRlZCBmaWxlcyBpZiBNYWtlZmlsZS5hbSBvciBjb25maWd1cmUuYWMiCisgICAgICAgICBlY2hvICIgIGNoYW5nZSBhbmQgbWFrZSBkb2VzIHRoZSByaWdodCB0aGluZyB3aXRoOiIKKyAgICAgICAgIGVjaG8KKyAgICAgICAgIGVjaG8gIiAgICAgLi9jb25maWd1cmUgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlLiIKKyAgICAgICAgIGVjaG8KKyAgICAgICAgIGVjaG8gIiAgWW91IGNhbiBydW4gYXV0b3JlY29uZiB5b3Vyc2VsZiBpZiB5b3UgZG9uJ3QgbGlrZSBtYWludGFpbmVyIgorICAgICAgICAgZWNobyAiICBtb2RlIGFuZCB5b3UgY2FuIGFsc28ganVzdCBydW4gYXV0b3JlY29uZiAtZiAtaSB0byBpbml0aWFsaXplIgorICAgICAgICAgZWNobyAiICBldmVyeXRoaW5nIGluIHRoZSBmaXJzdCBwbGFjZTsgdGhpcyBzY3JpcHQgaXMgb25seSBmb3IiCisgICAgICAgICBlY2hvICIgIGNvbXBhdGliaWxpdHkgd2l0aCBwcmlvciByZWxlYXNlcy4iCisgICAgICAgICBleGl0IDEKKyAgICAgIGVsc2UKKyAgICAgICAgIGV4ZWMgPiYyCisgICAgICAgICBlY2hvICJhdXRvZ2VuLnNoIGlzIGludGVuZGVkIG9ubHkgdG8gZ2VuZXJhdGUgJ2NvbmZpZ3VyZScgb24gc3lzdGVtcyIKKyAgICAgICAgIGVjaG8gInRoYXQgZG8gbm90IGhhdmUgaXQuICBZb3UgaGF2ZSBhIGNvbXBsZXRlICdjb25maWd1cmUnLCBpZiB5b3UiCisgICAgICAgICBlY2hvICJuZWVkIHRvIGNoYW5nZSBNYWtlZmlsZS5hbSBvciBjb25maWd1cmUuYWMgeW91IGFsc28gbmVlZCB0byIKKyAgICAgICAgIGVjaG8gInJ1biBjb25maWd1cmUgd2l0aCB0aGUgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9wdGlvbi4iCisgICAgICAgICBleGl0IDEKKyAgICAgIGZpOzsKKworICAgYnJva2VuKQorICAgICAgZXhlYyA+JjIKKyAgICAgIGVjaG8gIllvdXIgc3lzdGVtIGhhcyBhIHBhcnRpYWwgc2V0IG9mIGF1dG90b29scyBnZW5lcmF0ZWQgZmlsZXMuIgorICAgICAgZWNobyAiYXV0b2dlbi5zaCBpcyB1bmFibGUgdG8gcHJvY2VlZC4gIFRoZSBmdWxsIHNldCBvZiBmaWxlcyBpcyIKKyAgICAgIGVjaG8gImNvbnRhaW5lZCBpbiB0aGUgbGlicG5nICd0YXInIGRpc3RyaWJ1dGlvbiBhcmNoaXZlIGFuZCB5b3UgZG8iCisgICAgICBlY2hvICJub3QgbmVlZCB0byBydW4gYXV0b2dlbi5zaCBpZiB5b3UgdXNlIGl0LiIKKyAgICAgIGV4aXQgMTs7Citlc2FjCmRpZmYgLS1naXQgYS9saWJwbmcvY29uZmlndXJlLmFjIGIvbGlicG5nL2NvbmZpZ3VyZS5hYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDVhZTFjCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbmZpZ3VyZS5hYwpAQCAtMCwwICsxLDMyNCBAQAorIyBjb25maWd1cmUuYWMKKworZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCitkbmwKK2RubCBNaW5vciB1cGdyYWRlcyAoY29tcGF0aWJsZSBBQkkpOiBpbmNyZW1lbnQgdGhlIHBhY2thZ2UgdmVyc2lvbgorZG5sICh0aGlyZCBmaWVsZCBpbiB0d28gcGxhY2VzIGJlbG93KSBhbmQgc2V0IHRoZSBQTkdMSUJfUkVMRUFTRQorZG5sIHZhcmlhYmxlLgorZG5sCitkbmwgTWFqb3IgdXBncmFkZXMgKGluY29tcGF0aWJsZSBBQkkpOiBpbmNyZW1lbnQgdGhlIHBhY2thZ2UgbWFqb3IKK2RubCB2ZXJzaW9uIChzZWNvbmQgZmllbGQsIG9yIGZpcnN0IGlmIGRlc2lyZWQpLCBzZXQgdGhlIG1pbm9yCitkbmwgdG8gMCwgc2V0IFBOR0xJQl9NQUpPUiBiZWxvdyAqYW5kKiBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBpbgorZG5sIE1ha2VmaWxlLmFtIHRvIHVwZ3JhZGUgdGhlIHBhY2thZ2UgbmFtZS4KKworZG5sIFRoaXMgaXMgaGVyZSB0byBwcmV2ZW50IGVhcmxpZXIgYXV0b2NvbmYgZnJvbSBiZWluZyB1c2VkLCBpdAorZG5sIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IHRvIHJlZ2VuZXJhdGUgY29uZmlndXJlIGlmIHRoZSB0aW1lCitkbmwgc3RhbXBzIGFyZSBjb3JyZWN0CitBQ19QUkVSRVEoWzIuNjhdKQorCitkbmwgVmVyc2lvbiBudW1iZXIgc3R1ZmYgaGVyZToKKworQUNfSU5JVChbbGlicG5nXSxbMS42LjIwXSxbcG5nLW1uZy1pbXBsZW1lbnRAbGlzdHMuc291cmNlZm9yZ2UubmV0XSkKK0FDX0NPTkZJR19NQUNST19ESVIoW3NjcmlwdHNdKQorCisjIGxpYnBuZyBkb2VzIG5vdCBmb2xsb3cgR05VIGZpbGUgbmFtZSBjb252ZW50aW9ucyAoaGVuY2UgJ2ZvcmVpZ24nKQorIyBjb2xvci10ZXN0cyByZXF1aXJlcyBhdXRvbWFrZSAxLjExIG9yIGxhdGVyCisjIHNpbGVudC1ydWxlcyByZXF1aXJlcyBhdXRvbWFrZSAxLjExIG9yIGxhdGVyCisjIGRpc3QteHogcmVxdWlyZXMgYXV0b21ha2UgMS4xMSBvciBsYXRlcgorIyAxLjEyLjIgZml4ZXMgYSBzZWN1cml0eSBpc3N1ZSBpbiAxLjExLjIgYW5kIDEuMTIuMQorIyAxLjEzIGlzIHJlcXVpcmVkIGZvciBwYXJhbGxlbCB0ZXN0cworQU1fSU5JVF9BVVRPTUFLRShbMS4xMyBmb3JlaWduIGRpc3QteHogY29sb3ItdGVzdHMgc2lsZW50LXJ1bGVzIHN1YmRpci1vYmplY3RzXSkKKyMgVGhlIGZvbGxvd2luZyBsaW5lIGNhdXNlcyAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHRvIGJlIHRoZSBkZWZhdWx0IHRvCisjIGNvbmZpZ3VyZSwgdGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBsaWJwbmcgZGlzdHJpYnV0aW9ucyBjYW5ub3QgcmVseSBvbiB0aGUKKyMgdGltZSBzdGFtcHMgb2YgdGhlIGF1dG90b29scyBnZW5lcmF0ZWQgZmlsZXMgYmVpbmcgY29ycmVjdAorQU1fTUFJTlRBSU5FUl9NT0RFCisKK2RubCBjb25maWd1cmUuYWMgYW5kIE1ha2VmaWxlLmFtIGV4cGVjdCBhdXRvbWFrZSAxLjExLjIgb3IgYSBjb21wYXRpYmxlIGxhdGVyCitkbmwgdmVyc2lvbjsgYWNsb2NhbC5tNCB3aWxsIGdlbmVyYXRlIGEgZmFpbHVyZSBpZiB5b3UgdXNlIGEgcHJpb3IgdmVyc2lvbiBvZgorZG5sIGF1dG9tYWtlLCBzbyB0aGUgZm9sbG93aW5nIGlzIG5vdCBuZWNlc3NhcnkgKGFuZCBpcyBub3QgZGVmaW5lZCBhbnl3YXkpOgorZG5sIEFNX1BSRVJFUShbMS4xMS4yXSkKK2RubCBzdG9wIGNvbmZpZ3VyZSBmcm9tIGF1dG9tYWdpY2FsbHkgcnVubmluZyBhdXRvbWFrZQorCitQTkdMSUJfVkVSU0lPTj0xLjYuMjAKK1BOR0xJQl9NQUpPUj0xCitQTkdMSUJfTUlOT1I9NgorUE5HTElCX1JFTEVBU0U9MjAKKworZG5sIEVuZCBvZiB2ZXJzaW9uIG51bWJlciBzdHVmZgorCitBQ19DT05GSUdfU1JDRElSKFtwbmdnZXQuY10pCitBQ19DT05GSUdfSEVBREVSUyhbY29uZmlnLmhdKQorCisjIENoZWNrcyBmb3IgcHJvZ3JhbXMuCitBQ19MQU5HKFtDXSkKK0FDX1BST0dfQ0MKK0FNX1BST0dfQVMKK0xUX1BBVEhfTEQKK0FDX1BST0dfQ1BQCitBQ19QUk9HX0FXSworQUNfUFJPR19JTlNUQUxMCitBQ19QUk9HX0xOX1MKK0FDX1BST0dfTUFLRV9TRVQKKworZG5sIGxpYnRvb2wvbGlidG9vbGl6ZTsgdmVyc2lvbiAyLjQuMiBpcyB0aGUgdGVzdGVkIHZlcnNpb24sIHRoaXMgb3IgYW55CitkbmwgY29tcGF0aWJsZSBsYXRlciB2ZXJzaW9uIG1heSBiZSB1c2VkCitMVF9JTklUKFt3aW4zMi1kbGxdKQorTFRfUFJFUkVRKFsyLjQuMl0pCisKKyMgU29tZSBhd2tzIGNyYXNoIHdoZW4gY29uZnJvbnRlZCB3aXRoIHBuZ2xpYmNvbmYuZGZhLCBkbyBhIHRlc3QgcnVuIG5vdworIyB0byBtYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGhhcHBlbgorQUNfTVNHX0NIRUNLSU5HKFt0aGF0IEFXSyB3b3Jrc10pCitpZiAke0FXS30gLWYgJHtzcmNkaXJ9L3NjcmlwdHMvb3B0aW9ucy5hd2sgb3V0PSIvZGV2L251bGwiIHZlcnNpb249c2VhcmNoXAorICAgJHtzcmNkaXJ9L3BuZ2NvbmYuaCAke3NyY2Rpcn0vc2NyaXB0cy9wbmdsaWJjb25mLmRmYVwKKyAgICR7c3JjZGlyfS9wbmd1c3IuZGZhIDE+JjIKK3RoZW4KKyAgIEFDX01TR19SRVNVTFQoW29rXSkKK2Vsc2UKKyAgIEFDX01TR19GQUlMVVJFKFtmYWlsZWRdLCAxKQorZmkKKworIyBUaGlzIGlzIGEgcmVtbmFudCBvZiB0aGUgb2xkIGNjIC1FIHZhbGlkYXRpb24sIHdoZXJlIGl0IG1heSBoYXZlIGJlZW4KKyMgbmVjZXNzYXJ5IHRvIHVzZSBhIGRpZmZlcmVudCBwcmVwcm9jZXNzb3IgZm9yIC5kZm4gZmlsZXMKK0RGTkNQUD0iJENQUCIKK0FDX1NVQlNUKERGTkNQUCkKKworIyAtV2Vycm9yIGNhbm5vdCBiZSBwYXNzZWQgdG8gR0NDIGluIENGTEFHUyBiZWNhdXNlIGNvbmZpZ3VyZSB3aWxsIGZhaWwgKGl0CisjIGNoZWNrcyB0aGUgY29tcGlsZXIgd2l0aCBhIHByb2dyYW0gdGhhdCBnZW5lcmF0ZXMgYSB3YXJuaW5nKSwgYWRkIHRoZQorIyBmb2xsb3dpbmcgb3B0aW9uIHRvIGRlYWwgd2l0aCB0aGlzCitBQ19BUkdfVkFSKFBOR19DT1BUUywKKyAgIFthZGRpdGlvbmFsIGZsYWdzIGZvciB0aGUgQyBjb21waWxlciwgdXNlIHRoaXMgZm9yIG9wdGlvbnMgdGhhdCB3b3VsZF0KKyAgIFtjYXVzZSBjb25maWd1cmUgaXRzZWxmIHRvIGZhaWxdKQorQUNfQVJHX0VOQUJMRSh3ZXJyb3IsCisgICBBU19IRUxQX1NUUklORyhbW1stLWVuYWJsZS13ZXJyb3JbPU9QVF1dXV0sCisgICAgICBbUGFzcyAtV2Vycm9yIG9yIHRoZSBnaXZlbiBhcmd1bWVudCB0byB0aGUgY29tcGlsZXIgaWYgaXQgaXMgc3VwcG9ydGVkXSksCisgICBbdGVzdCAiJGVuYWJsZV93ZXJyb3IiID0gInllcyIgJiYgZW5hYmxlX3dlcnJvcj0iLVdlcnJvciIKKyAgICBpZiB0ZXN0ICIkZW5hYmxlX3dlcnJvciIgIT0gIm5vIjsgdGhlbgorICAgICAgc2F2X0NGTEFHUz0iJENGTEFHUyIKKyAgICAgIENGTEFHUz0iJGVuYWJsZV93ZXJyb3IgJENGTEFHUyIKKyAgICAgIEFDX01TR19DSEVDS0lORyhbaWYgdGhlIGNvbXBpbGVyIGFsbG93cyAkZW5hYmxlX3dlcnJvcl0pCisgICAgICBBQ19DT01QSUxFX0lGRUxTRSgKKyAgICAgICAgIFtBQ19MQU5HX1NPVVJDRShbCisgICAgICAgICAgICBbaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KXtdCisgICAgICAgICAgICBbcmV0dXJuIGFyZ3ZbYXJnYy0xXVswXTtdCisgICAgICAgICAgICBbfV1dKV0sCisgICAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKKyAgICAgICAgIFBOR19DT1BUUz0iJFBOR19DT1BUUyAkZW5hYmxlX3dlcnJvciIsCisgICAgICAgICBBQ19NU0dfUkVTVUxUKG5vKSkKKyAgICAgIENGTEFHUz0iJHNhdl9DRkxBR1MiCisgICAgZmldLCkKKworIyBDaGVja3MgZm9yIGhlYWRlciBmaWxlcy4KK0FDX0hFQURFUl9TVERDCisKKyMgQ2hlY2tzIGZvciB0eXBlZGVmcywgc3RydWN0dXJlcywgYW5kIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcy4KK0FDX0NfQ09OU1QKK0FDX1RZUEVfU0laRV9UCitBQ19TVFJVQ1RfVE0KK0FDX0NfUkVTVFJJQ1QKKworIyBDaGVja3MgZm9yIGxpYnJhcnkgZnVuY3Rpb25zLgorQUNfRlVOQ19TVFJUT0QKK0FDX0NIRUNLX0ZVTkNTKFttZW1zZXRdLCAsIEFDX01TR19FUlJPUihtZW1zZXQgbm90IGZvdW5kIGluIGxpYmMpKQorQUNfQ0hFQ0tfRlVOQ1MoW3Bvd10sICwgQUNfQ0hFQ0tfTElCKG0sIHBvdywgLCBBQ19NU0dfRVJST1IoY2Fubm90IGZpbmQgcG93KSkgKQorQUNfQVJHX1dJVEgoemxpYi1wcmVmaXgsCisgICBBU19IRUxQX1NUUklORyhbW1stLXdpdGgtemxpYi1wcmVmaXhdXV0sCisgICAgICBbcHJlZml4IHRoYXQgbWF5IGhhdmUgYmVlbiB1c2VkIGluIGluc3RhbGxlZCB6bGliXSksCisgICAgICBbWlBSRUZJWD0ke3dpdGh2YWx9XSwKKyAgICAgIFtaUFJFRklYPSd6XyddKQorQUNfQ0hFQ0tfTElCKHosIHpsaWJWZXJzaW9uLCAsCisgICAgQUNfQ0hFQ0tfTElCKHosICR7WlBSRUZJWH16bGliVmVyc2lvbiwgLCBBQ19NU0dfRVJST1IoemxpYiBub3QgaW5zdGFsbGVkKSkpCisKKyMgVGhlIGZvbGxvd2luZyBpcyBmb3IgcG5ndmFsaWQsIHRvIGVuc3VyZSBpdCBjYXRjaGVzIEZQIGVycm9ycyBldmVuIG9uCisjIHBsYXRmb3JtcyB0aGF0IGRvbid0IGVuYWJsZSBGUCBleGNlcHRpb25zLCB0aGUgZnVuY3Rpb24gYXBwZWFycyBpbiB0aGUgbWF0aAorIyBsaWJyYXJ5ICh0eXBpY2FsbHkpLCBpdCdzIG5vdCBhbiBlcnJvciBpZiBpdCBpcyBub3QgZm91bmQuCitBQ19DSEVDS19MSUIoW21dLCBbZmVlbmFibGVleGNlcHRdKQorQUNfQ0hFQ0tfRlVOQ1MoW2ZlZW5hYmxlZXhjZXB0XSkKKworQUNfTVNHX0NIRUNLSU5HKFtpZiB1c2luZyBTb2xhcmlzIGxpbmtlcl0pCitTTEQ9YCRMRCAtLXZlcnNpb24gMj4mMSB8IGdyZXAgU29sYXJpc2AKK2lmIHRlc3QgIiRTTEQiOyB0aGVuCisgICAgaGF2ZV9zb2xhcmlzX2xkPXllcworICAgIEFDX01TR19SRVNVTFQoeWVzKQorZWxzZQorICAgIGhhdmVfc29sYXJpc19sZD1ubworICAgIEFDX01TR19SRVNVTFQobm8pCitmaQorQU1fQ09ORElUSU9OQUwoSEFWRV9TT0xBUklTX0xELCB0ZXN0ICIkaGF2ZV9zb2xhcmlzX2xkIiA9ICJ5ZXMiKQorCitBQ19NU0dfQ0hFQ0tJTkcoW2lmIGxpYnJhcmllcyBjYW4gYmUgdmVyc2lvbmVkXSkKKyMgU3BlY2lhbCBjYXNlIGZvciBQRS9DT0ZGIHBsYXRmb3JtczogbGQgcmVwb3J0cworIyBzdXBwb3J0IGZvciB2ZXJzaW9uLXNjcmlwdCwgYnV0IGRvZXNuJ3QgYWN0dWFsbHkKKyMgRE8gYW55dGhpbmcgd2l0aCBpdC4KK2Nhc2UgJGhvc3QgaW4KKypjeWd3aW4qIHwgKm1pbmd3MzIqIHwgKmludGVyaXgqICkKKyAgICBoYXZlX2xkX3ZlcnNpb25fc2NyaXB0PW5vCisgICAgQUNfTVNHX1JFU1VMVChubykKKzs7CisqICkKKworaWYgdGVzdCAiJGhhdmVfc29sYXJpc19sZCIgPSAieWVzIjsgdGhlbgorICAgIEdMRD1gJExEIC0taGVscCA8IC9kZXYvbnVsbCAyPiYxIHwgZ3JlcCAnTSBtYXBmaWxlJ2AKK2Vsc2UKKyAgICBHTEQ9YCRMRCAtLWhlbHAgPCAvZGV2L251bGwgMj4vZGV2L251bGwgfCBncmVwIHZlcnNpb24tc2NyaXB0YAorZmkKKworaWYgdGVzdCAiJEdMRCI7IHRoZW4KKyAgICBoYXZlX2xkX3ZlcnNpb25fc2NyaXB0PXllcworICAgIEFDX01TR19SRVNVTFQoeWVzKQorZWxzZQorICAgIGhhdmVfbGRfdmVyc2lvbl9zY3JpcHQ9bm8KKyAgICBBQ19NU0dfUkVTVUxUKG5vKQorICAgIEFDX01TR19XQVJOKCoqKiBZb3UgaGF2ZSBub3QgZW5hYmxlZCB2ZXJzaW9uZWQgc3ltYm9scy4pCitmaQorOzsKK2VzYWMKKworQU1fQ09ORElUSU9OQUwoSEFWRV9MRF9WRVJTSU9OX1NDUklQVCwgdGVzdCAiJGhhdmVfbGRfdmVyc2lvbl9zY3JpcHQiID0gInllcyIpCisKK2lmIHRlc3QgIiRoYXZlX2xkX3ZlcnNpb25fc2NyaXB0IiA9ICJ5ZXMiOyB0aGVuCisgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igc3ltYm9sIHByZWZpeF0pCisgICAgU1lNQk9MX1BSRUZJWD1gZWNobyAiUFJFRklYPV9fVVNFUl9MQUJFTF9QUkVGSVhfXyIgXAorICAgICAgICAgICAgICAgICAgfCAke0NQUC0ke0NDLWdjY30gLUV9IC0gMj4mMSBcCisgICAgICAgICAgICAgICAgICB8ICR7RUdSRVAtZ3JlcH0gIl5QUkVGSVg9IiBcCisgICAgICAgICAgICAgICAgICB8ICR7U0VELXNlZH0gLWUgInM6XlBSRUZJWD06OiIgLWUgInM6X19VU0VSX0xBQkVMX1BSRUZJWF9fOjoiYAorICAgIEFDX1NVQlNUKFNZTUJPTF9QUkVGSVgpCisgICAgQUNfTVNHX1JFU1VMVCgkU1lNQk9MX1BSRUZJWCkKK2ZpCisKKyMgU3Vic3RpdHV0aW9ucyBmb3IgLmluIGZpbGVzCitBQ19TVUJTVChQTkdMSUJfVkVSU0lPTikKK0FDX1NVQlNUKFBOR0xJQl9NQUpPUikKK0FDX1NVQlNUKFBOR0xJQl9NSU5PUikKK0FDX1NVQlNUKFBOR0xJQl9SRUxFQVNFKQorCisjIEFkZGl0aW9uYWwgYXJndW1lbnRzIChhbmQgc3Vic3RpdHV0aW9ucykKKyMgQWxsb3cgdGhlIHBrZy1jb25maWcgZGlyZWN0b3J5IHRvIGJlIHNldAorQUNfQVJHX1dJVEgocGtnY29uZmlnZGlyLAorICAgQVNfSEVMUF9TVFJJTkcoW1tbLS13aXRoLXBrZ2NvbmZpZ2Rpcl1dXSwKKyAgICAgIFtVc2UgdGhlIHNwZWNpZmllZCBwa2djb25maWcgZGlyIChkZWZhdWx0IGlzIGxpYmRpci9wa2djb25maWcpXSksCisgICBbcGtnY29uZmlnZGlyPSR7d2l0aHZhbH1dLAorICAgW3BrZ2NvbmZpZ2Rpcj0nJHtsaWJkaXJ9L3BrZ2NvbmZpZyddKQorCitBQ19TVUJTVChbcGtnY29uZmlnZGlyXSkKK0FDX01TR19OT1RJQ0UoW1twa2djb25maWcgZGlyZWN0b3J5IGlzICR7cGtnY29uZmlnZGlyfV1dKQorCisjIE1ha2UgdGhlICotY29uZmlnIGJpbmFyeSBjb25maWcgc2NyaXB0cyBvcHRpb25hbAorQUNfQVJHX1dJVEgoYmluY29uZmlncywKKyAgIEFTX0hFTFBfU1RSSU5HKFtbWy0td2l0aC1iaW5jb25maWdzXV1dLAorICAgICAgW0dlbmVyYXRlIHNoZWxsIGxpYnBuZy1jb25maWcgc2NyaXB0cyBhcyB3ZWxsIGFzIHBrZy1jb25maWcgZGF0YV0KKyAgICAgIFtAPDpAZGVmYXVsdD15ZXNAOj5AXSksCisgICBbaWYgdGVzdCAiJHt3aXRodmFsfSIgPSBubzsgdGhlbgorICAgICAgYmluY29uZmlncz0KKyAgICAgIEFDX01TR19OT1RJQ0UoW1tsaWJwbmctY29uZmlnIHNjcmlwdHMgd2lsbCBub3QgYmUgYnVpbHRdXSkKKyAgICBlbHNlCisgICAgICBiaW5jb25maWdzPScke2JpbmNvbmZpZ3N9JworICAgIGZpXSwKKyAgIFtiaW5jb25maWdzPScke2JpbmNvbmZpZ3N9J10pCitBQ19TVUJTVChbYmluY29uZmlnc10pCisKKyMgU3VwcG9ydCBmb3IgcHJlZml4ZXMgdG8gdGhlIEFQSSBmdW5jdGlvbiBuYW1lczsgdGhpcyB3aWxsIGdlbmVyYXRlIGRlZmluZXMKKyMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBidWlsZCB0byByZW5hbWUgZXhwb3J0ZWQgbGlicmFyeSBmdW5jdGlvbnMKK0FDX0FSR19XSVRIKGxpYnBuZy1wcmVmaXgsCisgICBBU19IRUxQX1NUUklORyhbW1stLXdpdGgtbGlicG5nLXByZWZpeF1dXSwKKyAgICAgIFtwcmVmaXggbGlicG5nIGV4cG9ydGVkIGZ1bmN0aW9uIChBUEkpIG5hbWVzIHdpdGggdGhlIGdpdmVuIHZhbHVlXSksCisgICBbaWYgdGVzdCAiJHt3aXRodmFsOi1ub30iICE9ICJubyI7IHRoZW4KKyAgICAgIEFDX1NVQlNUKFtQTkdfUFJFRklYXSwgWyR7d2l0aHZhbH1dKQorICAgIGZpXSkKK0FNX0NPTkRJVElPTkFMKFtET19QTkdfUFJFRklYXSwgW3Rlc3QgIiR7d2l0aF9saWJwbmdfcHJlZml4Oi1ub30iICE9ICJubyJdKQorCisjIENvbnRyb2wgb3ZlciB3aGF0IGxpbmtzIGFyZSBtYWRlIGZvciBpbnN0YWxsZWQgZmlsZXMuICBWZXJzaW9uZWQgZmlsZXMgYXJlCisjIGFsd2F5cyBpbnN0YWxsZWQsIHdoZW4gdGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSB0dXJuZWQgb24gY29ycmVzcG9uZGluZworIyB1bnZlcnNpb25lZCBsaW5rcyBhcmUgYWxzbyBjcmVhdGVkIChub3JtYWxseSBhcyBzeW1ib2xpYyBsaW5rcyk6CitBQ19BUkdfRU5BQkxFKFt1bnZlcnNpb25lZC1saW5rc10sCisgICBBU19IRUxQX1NUUklORyhbW1stLWVuYWJsZS11bnZlcnNpb25lZC1saW5rc11dXSwKKyAgICAgIFtJbnN0YWxsZWQgbGlicG5nIGhlYWRlciBmaWxlcyBhcmUgcGxhY2VkIGluIGEgdmVyc2lvbmVkIHN1YmRpcmVjdG9yeV0KKyAgICAgIFthbmQgaW5zdGFsbGVkIGxpYnBuZyBsaWJyYXJ5IChpbmNsdWRpbmcgRExMKSBmaWxlcyBhcmUgdmVyc2lvbmVkLl0KKyAgICAgIFtJZiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkIHVudmVyc2lvbmVkIGxpbmtzIHdpbGwgYmUgY3JlYXRlZCBwb2ludGluZyB0b10KKyAgICAgIFt0aGUgY29ycmVzcG9uZGluZyBpbnN0YWxsZWQgZmlsZXMuICBJZiB5b3UgdXNlIGxpYnBuZy5wYyBvcl0KKyAgICAgIFtsaWJwbmctY29uZmlnIGZvciBhbGwgYnVpbGRzIHlvdSBkbyBub3QgbmVlZCB0aGVzZSBsaW5rcywgYnV0IGlmIHlvdV0KKyAgICAgIFtjb21waWxlIHByb2dyYW1zIGRpcmVjdGx5IHRoZXkgd2lsbCB0eXBpY2FsbHkgI2luY2x1ZGUgPHBuZy5oPiBhbmRdCisgICAgICBbbGluayB3aXRoIC1scG5nOyBpbiB0aGF0IGNhc2UgeW91IG5lZWQgdGhlIGxpbmtzLl0KKyAgICAgIFtUaGUgbGlua3MgY2FuIGJlIGluc3RhbGxlZCBtYW51YWxseSB1c2luZyAnbWFrZSBpbnN0YWxsLWhlYWRlci1saW5rcyddCisgICAgICBbYW5kICdtYWtlIGluc3RhbGwtbGlicmFyeS1saW5rcycgYW5kIGNhbiBiZSByZW1vdmVkIHVzaW5nIHRoZV0KKyAgICAgIFtjb3JyZXNwb25kaW5nIHVuaW5zdGFsbC0gdGFyZ2V0cy4gIElmIHlvdSBkbyBlbmFibGUgdGhpcyBvcHRpb24gZXZlcnldCisgICAgICBbbGlicG5nICdtYWtlIGluc3RhbGwnIHdpbGwgcmVjcmVhdGUgdGhlIGxpbmtzIHRvIHBvaW50IHRvIHRoZSBqdXN0XQorICAgICAgW2luc3RhbGxlZCB2ZXJzaW9uIG9mIGxpYnBuZy4gIFRoZSBkZWZhdWx0IGlzIHRvIGNyZWF0ZSB0aGUgbGlua3M7XQorICAgICAgW3VzZSAtLWRpc2FibGUtdW52ZXJzaW9uZWQtbGlua3MgdG8gY2hhbmdlIHRoaXNdKSkKKworIyBUaGUgQU1fQ09ORElUSU9OQUwgdGVzdCBpcyB3cml0dGVuIHNvIHRoYXQgdGhlIGRlZmF1bHQgaXMgZW5hYmxlZDsKKyMgLS1kaXNhYmxlLXVudmVyc2lvbmVkLWxpbmtzIG11c3QgYmUgZ2l2ZW4gdG8gdHVybiB0aGUgb3B0aW9uIG9mZi4KK0FNX0NPTkRJVElPTkFMKFtET19JTlNUQUxMX0xJTktTXSxbdGVzdCAiJGVuYWJsZV91bnZlcnNpb25lZF9saW5rcyIgIT0gIm5vIl0pCisKK0FDX0FSR19FTkFCTEUoW3VudmVyc2lvbmVkLWxpYnBuZy1wY10sCisgICBBU19IRUxQX1NUUklORyhbW1stLWVuYWJsZS11bnZlcnNpb25lZC1saWJwbmctcGNdXV0sCisgICAgICBbSW5zdGFsbCB0aGUgY29uZmlndXJhdGlvbiBmaWxlICdsaWJwbmcucGMnIGFzIGEgbGluayB0byB0aGUgdmVyc2lvbmVkXQorICAgICAgW3ZlcnNpb24uICBUaGlzIGlzIGRvbmUgYnkgZGVmYXVsdCAtIHVzZSAtLWRpc2FibGUtdW52ZXJzaW9uZWQtbGlicG5nLXBjXQorICAgICAgW3RvIGNoYW5nZSB0aGlzLl0pKQorQU1fQ09ORElUSU9OQUwoW0RPX0lOU1RBTExfTElCUE5HX1BDXSwKKyAgIFt0ZXN0ICIkZW5hYmxlX3VudmVyc2lvbmVkX2xpYnBuZ19wYyIgIT0gIm5vIl0pCisKK0FDX0FSR19FTkFCTEUoW3VudmVyc2lvbmVkLWxpYnBuZy1jb25maWddLAorICAgQVNfSEVMUF9TVFJJTkcoW1tbLS1lbmFibGUtdW52ZXJzaW9uZWQtbGlicG5nLWNvbmZpZ11dXSwKKyAgICAgIFtJbnN0YWxsIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgJ2xpYnBuZy1jb25maWcnIGFzIGEgbGluayB0byB0aGVdCisgICAgICBbdmVyc2lvbmVkIHZlcnNpb24uICBUaGlzIGlzIGRvbmUgYnkgZGVmYXVsdCAtIHVzZV0KKyAgICAgIFstLWRpc2FibGUtdW52ZXJzaW9uZWQtbGlicG5nLWNvbmZpZyB0byBjaGFuZ2UgdGhpcy5dKSkKK0FNX0NPTkRJVElPTkFMKFtET19JTlNUQUxMX0xJQlBOR19DT05GSUddLAorICAgW3Rlc3QgIiRlbmFibGVfdW52ZXJzaW9uZWRfbGlicG5nX2NvbmZpZyIgIT0gIm5vIl0pCisKKyMgSE9TVCBTUEVDSUZJQyBPUFRJT05TCisjID09PT09PT09PT09PT09PT09PT09PQorIworIyBBUk0KKyMgPT09CisjCisjIEFSTSBORU9OIChTSU1EKSBzdXBwb3J0LgorCitBQ19BUkdfRU5BQkxFKFthcm0tbmVvbl0sCisgICBBU19IRUxQX1NUUklORyhbW1stLWVuYWJsZS1hcm0tbmVvbl1dXSwKKyAgICAgIFtFbmFibGUgQVJNIE5FT04gb3B0aW1pemF0aW9uczogPW5vL29mZiwgY2hlY2ssIGFwaSwgeWVzL29uOl0KKyAgICAgIFtuby9vZmY6IGRpc2FibGUgdGhlIG9wdGltaXphdGlvbnM7IGNoZWNrOiB1c2UgaW50ZXJuYWwgY2hlY2tpbmcgY29kZV0KKyAgICAgIFsoZGVwcmVjYXRlZCBhbmQgcG9vcmx5IHN1cHBvcnRlZCk7IGFwaTogZGlzYWJsZSBieSBkZWZhdWx0LCBlbmFibGUgYnldCisgICAgICBbYSBjYWxsIHRvIHBuZ19zZXRfb3B0aW9uOyB5ZXMvb246IHR1cm4gb24gdW5jb25kaXRpb25hbGx5Ll0KKyAgICAgIFtJZiBub3Qgc3BlY2lmaWVkOiBkZXRlcm1pbmVkIGJ5IHRoZSBjb21waWxlci5dKSwKKyAgIFtjYXNlICIkZW5hYmxldmFsIiBpbgorICAgICAgbm98b2ZmKQorICAgICAgICAgIyBkaXNhYmxlIHRoZSBkZWZhdWx0IGVuYWJsaW5nIG9uIF9fQVJNX05FT05fXyBzeXN0ZW1zOgorICAgICAgICAgQUNfREVGSU5FKFtQTkdfQVJNX05FT05fT1BUXSwgWzBdLAorICAgICAgICAgICAgICAgICAgIFtEaXNhYmxlIEFSTSBOZW9uIG9wdGltaXphdGlvbnNdKQorICAgICAgICAgIyBQcmV2ZW50IGluY2x1c2lvbiBvZiB0aGUgYXNzZW1ibGVyIGZpbGVzIGJlbG93OgorICAgICAgICAgZW5hYmxlX2FybV9uZW9uPW5vOzsKKyAgICAgIGNoZWNrKQorICAgICAgICAgQUNfREVGSU5FKFtQTkdfQVJNX05FT05fQ0hFQ0tfU1VQUE9SVEVEXSwgW10sCisgICAgICAgICAgICAgICAgICAgW0NoZWNrIGZvciBBUk0gTmVvbiBzdXBwb3J0IGF0IHJ1bi10aW1lXSk7OworICAgICAgYXBpKQorICAgICAgICAgQUNfREVGSU5FKFtQTkdfQVJNX05FT05fQVBJX1NVUFBPUlRFRF0sIFtdLAorICAgICAgICAgICAgICAgICAgIFtUdXJuIG9uIEFSTSBOZW9uIG9wdGltaXphdGlvbnMgYXQgcnVuLXRpbWVdKTs7CisgICAgICB5ZXN8b24pCisgICAgICAgICBBQ19ERUZJTkUoW1BOR19BUk1fTkVPTl9PUFRdLCBbMl0sCisgICAgICAgICAgICAgICAgICAgW0VuYWJsZSBBUk0gTmVvbiBvcHRpbWl6YXRpb25zXSkKKyAgICAgICAgIEFDX01TR19XQVJOKFstLWVuYWJsZS1hcm0tbmVvbjogcGxlYXNlIHNwZWNpZnkgJ2NoZWNrJyBvciAnYXBpJywgaWZdCisgICAgICAgICAgICBbeW91IHdhbnQgdGhlIG9wdGltaXphdGlvbnMgdW5jb25kaXRpb25hbGx5IHBhc3MgLW1mcHU9bmVvbl0KKyAgICAgICAgICAgIFt0byB0aGUgY29tcGlsZXIuXSk7OworICAgICAgKikKKyAgICAgICAgIEFDX01TR19FUlJPUihbLS1lbmFibGUtYXJtLW5lb249JHtlbmFibGVfYXJtX25lb259OiBpbnZhbGlkIHZhbHVlXSkKKyAgIGVzYWNdKQorCisjIEFkZCBBUk0gc3BlY2lmaWMgZmlsZXMgdG8gYWxsIGJ1aWxkcyB3aGVyZSB0aGUgaG9zdF9jcHUgaXMgYXJtICgnYXJtKicpIG9yCisjIHdoZXJlIEFSTSBvcHRpbWl6YXRpb25zIHdlcmUgZXhwbGljaXRseSByZXF1ZXN0ZWQgKHRoaXMgYWxsb3dzIGEgZmFsbGJhY2sgaWYgYQorIyBmdXR1cmUgaG9zdCBDUFUgZG9lcyBub3QgbWF0Y2ggJ2FybSonKQorCitBTV9DT05ESVRJT05BTChbUE5HX0FSTV9ORU9OXSwKKyAgIFt0ZXN0ICIkZW5hYmxlX2FybV9uZW9uIiAhPSAnbm8nICYmCisgICAgY2FzZSAiJGhvc3RfY3B1IiBpbgorICAgICAgYXJtKnxhYXJjaDY0KikgOjs7CisgICAgICAqKSAgICB0ZXN0ICIkZW5hYmxlX2FybV9uZW9uIiAhPSAnJzs7CisgICAgZXNhY10pCisKK0FDX01TR19OT1RJQ0UoW1tFeHRyYSBvcHRpb25zIGZvciBjb21waWxlcjogJFBOR19DT1BUU11dKQorCisjIENvbmZpZyBmaWxlcywgc3Vic3RpdHV0aW5nIGFzIGFib3ZlCitBQ19DT05GSUdfRklMRVMoW01ha2VmaWxlIGxpYnBuZy5wYzpsaWJwbmcucGMuaW5dKQorQUNfQ09ORklHX0ZJTEVTKFtsaWJwbmctY29uZmlnOmxpYnBuZy1jb25maWcuaW5dLAorICAgW2NobW9kICt4IGxpYnBuZy1jb25maWddKQorCitBQ19PVVRQVVQKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL1JFQURNRS50eHQgYi9saWJwbmcvY29udHJpYi9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3OTYzYzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9SRUFETUUudHh0CkBAIC0wLDAgKzEsNSBAQAorCitUaGlzICJjb250cmliIiBkaXJlY3RvcnkgY29udGFpbnMgY29udHJpYnV0aW9ucyB3aGljaCBhcmUgbm90IG5lY2Vzc2FyaWx5IHVuZGVyCit0aGUgbGlicG5nIGxpY2Vuc2UsIGFsdGhvdWdoIGFsbCBhcmUgb3BlbiBzb3VyY2UuICBUaGV5IGFyZSBub3QgcGFydCBvZgorbGlicG5nIHByb3BlciBhbmQgYXJlIG5vdCB1c2VkIGZvciBidWlsZGluZyB0aGUgbGlicmFyeSwgYWx0aG91Z2ggc29tZSBhcmUgdXNlZAorZm9yIHRlc3RpbmcgdGhlIGxpYnJhcnkgdmlhICJtYWtlIGNoZWNrIi4KZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL2FybS1uZW9uL1JFQURNRSBiL2xpYnBuZy9jb250cmliL2FybS1uZW9uL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDI0OGNmCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvYXJtLW5lb24vUkVBRE1FCkBAIC0wLDAgKzEsODMgQEAKK09QRVJBVElORyBTWVNURU0gU1BFQ0lGSUMgQVJNIE5FT04gREVURUNUSU9OCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitEZXRlY3Rpb24gb2YgdGhlIGFiaWxpdHkgdG8gZXhlY3V0ZSBBUk0gTkVPTiBvbiBhbiBBUk0gcHJvY2Vzc29yIHJlcXVpcmVzCitvcGVyYXRpbmcgc3lzdGVtIHN1cHBvcnQuICAoVGhlIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgaW4gdXNlciBtb2RlLikKKworSE9XIFRPIFVTRSBUSElTCistLS0tLS0tLS0tLS0tLS0KKworVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgQyBjb2RlIGZyYWdtZW50cyB0aGF0IGNhbiBiZSBpbmNsdWRlZCBpbiBhcm0vYXJtX2luaXQuYworYnkgc2V0dGluZyB0aGUgbWFjcm8gUE5HX0FSTV9ORU9OX0ZJTEUgdG8gdGhlIGZpbGUgbmFtZSBpbiAiIiBvciA8PiBhdCBidWlsZAordGltZS4gIFRoaXMgc2V0dGluZyBpcyBub3QgcmVjb3JkZWQgaW4gcG5nbGliY29uZi5oIGFuZCBjYW4gYmUgY2hhbmdlZCBzaW1wbHkgYnkKK3JlYnVpbGRpbmcgYXJtL2FybV9pbml0Lm8gd2l0aCB0aGUgcmVxdWlyZWQgbWFjcm8gZGVmaW5pdGlvbi4KKworRm9yIGFueSBvZiB0aGlzIGNvZGUgdG8gYmUgdXNlZCB0aGUgQVJNIE5FT04gY29kZSBtdXN0IGJlIGVuYWJsZWQgYW5kIHJ1biB0aW1lCitjaGVja3MgbXVzdCBiZSBzdXBwb3J0ZWQuICBJLmUuOgorCisjaWYgUE5HX0FSTV9ORU9OX09QVCA+IDAKKyNpZmRlZiBQTkdfQVJNX05FT05fQ0hFQ0tfU1VQUE9SVEVECisKK1RoaXMgaXMgZG9uZSBpbiBhICdjb25maWd1cmUnIGJ1aWxkIGJ5IHBhc3NpbmcgY29uZmlndXJlIHRoZSBhcmd1bWVudDoKKworICAgLS1lbmFibGUtYXJtLW5lb249Y2hlY2sKKworQXBhcnQgZnJvbSB0aGUgYmFzaWMgTGludXggaW1wbGVtZW50YXRpb24gaW4gY29udHJpYi9hcm0tbmVvbi9saW51eC5jIHRoaXMgY29kZQoraXMgdW5zdXBwb3J0ZWQuICBUaGF0IG1lYW5zIHRoYXQgaXQgaXMgbm90IGV2ZW4gY29tcGlsZWQgb24gYSByZWd1bGFyIGJhc2lzIGFuZAorbWF5IGJlIGJyb2tlbiBpbiBhbnkgZ2l2ZW4gbWlub3IgcmVsZWFzZS4KKworRklMRSBGT1JNQVQKKy0tLS0tLS0tLS0tCisKK0VhY2ggZmlsZSBkb2N1bWVudHMgaXRzIHRlc3Rpbmcgc3RhdHVzIGFzIG9mIHRoZSBsYXN0IHRpbWUgaXQgd2FzIHRlc3RlZCAod2hpY2gKK21heSBoYXZlIGJlZW4gYSBsb25nIHRpbWUgYWdvKToKKworU1RBVFVTOiBvbmUgb2Y6CisgICBTVVBQT1JURUQ6IFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGZpbGUgaXMgaW5jbHVkZWQgaW4gdGhlIHJlZ3VsYXJseQorICAgICAgICAgcGVyZm9ybWVkIHRlc3QgYnVpbGRzIGFuZCBidWdzIGFyZSBmaXhlZCB3aGVuIGRpc2NvdmVyZWQuCisgICBDT01QSUxFRDogVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgY29kZSBkaWQgY29tcGlsZSBhdCBsZWFzdCBvbmNlLiAgU2VlIHRoZQorICAgICAgICAgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBmb3IgdGhlIGV4dGVudCB0byB3aGljaCB0aGUgcmVzdWx0IHdhcworICAgICAgICAgc3VjY2Vzc2Z1bC4KKyAgIFRFU1RFRDogVGhpcyBtZWFucyB0aGUgY29kZSB3YXMgZnVsbHkgY29tcGlsZWQgaW50byB0aGUgbGlicG5nIHRlc3QgcHJvZ3JhbXMKKyAgICAgICAgIGFuZCB0aGVzZSB3ZXJlIHJ1biBhdCBsZWFzdCBvbmNlLgorCitCVUcgUkVQT1JUUzogYW4gZW1haWwgYWRkcmVzcyB0byB3aGljaCB0byBzZW5kIHJlcG9ydHMgb2YgcHJvYmxlbXMKKworVGhlIGZpbGUgaXMgYSBmcmFnbWVudCBvZiBDIGNvZGUuIEl0IHNob3VsZCBub3QgZGVmaW5lIGFueSAnZXh0ZXJuJyBzeW1ib2xzOworZXZlcnl0aGluZyBzaG91bGQgYmUgc3RhdGljLiAgSXQgbXVzdCBkZWZpbmUgdGhlIGZ1bmN0aW9uOgorCitzdGF0aWMgaW50IHBuZ19oYXZlX25lb24ocG5nX3N0cnVjdHAgcG5nX3B0cik7CisKK1RoYXQgZnVuY3Rpb24gbXVzdCByZXR1cm4gMSBpZiBBUk0gTkVPTiBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZCwgMCBpZiBub3QuCitJdCBtdXN0IG5vdCBleGVjdXRlIHBuZ19lcnJvciB1bmxlc3MgaXQgZGV0ZWN0cyBhIGJ1Zy4gIEEgcG5nX2Vycm9yIHdpbGwgcHJldmVudAordGhlIHJlYWRpbmcgb2YgdGhlIFBORyBhbmQgaW4gdGhlIGZ1dHVyZSwgd3JpdGluZyB0b28uCisKK0JVRyBSRVBPUlRTCistLS0tLS0tLS0tLQorCitJZiB5b3UgbWFpbCBhIGJ1ZyByZXBvcnQgZm9yIGFueSBmaWxlIHRoYXQgaXMgbm90IFNVUFBPUlRFRCB0aGVyZSBtYXkgb25seSBiZQorbGltaXRlZCByZXNwb25zZS4gIENvbnNpZGVyIGZpeGluZyBpdCBhbmQgc2VuZGluZyBhIHBhdGNoIHRvIGZpeCB0aGUgcHJvYmxlbSAtCit0aGlzIGlzIG1vcmUgbGlrZWx5IHRvIHJlc3VsdCBpbiBhY3Rpb24uCisKK0NPTlRSSUJVVElPTlMKKy0tLS0tLS0tLS0tLS0KKworWW91IG1heSBzZW5kIGNvbnRyaWJ1dGlvbnMgb2YgbmV3IGltcGxlbWVudGF0aW9ucyB0bworcG5nLW1uZy1pbXBsZW1lbnRAc291cmNlZm9yZ2UubmV0LiAgUGxlYXNlIHdyaXRlIGNvZGUgaW4gc3RyaWN0IEM5MCBDIHdoZXJlCitwb3NzaWJsZS4gIE9idmlvdXNseSBPUyBkZXBlbmRlbmNpZXMgYXJlIHRvIGJlIGV4cGVjdGVkLiAgSWYgeW91IHN1Ym1pdCBjb2RlIHlvdQorbXVzdCBoYXZlIHRoZSBhdXRob3JzIHBlcm1pc3Npb24gYW5kIGl0IG11c3QgaGF2ZSBhIGxpY2Vuc2UgdGhhdCBpcyBhY2NlcHRhYmxlCit0byB0aGUgY3VycmVudCBtYWludGFpbmVyOyBpbiBwYXJ0aWN1bGFyIHRoYXQgbGljZW5zZSBtdXN0IHBlcm1pdCBtb2RpZmljYXRpb24KK2FuZCByZWRpc3RyaWJ1dGlvbi4KKworUGxlYXNlIHRyeSB0byBtYWtlIHRoZSBjb250cmlidXRpb24gYSBzaW5nbGUgZmlsZSBhbmQgZ2l2ZSB0aGUgZmlsZSBhIGNsZWFyIGFuZAordW5hbWJpZ3VvdXMgbmFtZSB0aGF0IGlkZW50aWZpZXMgdGhlIHRhcmdldCBPUy4gIElmIG11bHRpcGxlIGZpbGVzIHJlYWxseSBhcmUKK3JlcXVpcmVkIHB1dCB0aGVtIGFsbCBpbiBhIHN1Yi1kaXJlY3RvcnkuCisKK1lvdSBtdXN0IGFsc28gYmUgcHJlcGFyZWQgdG8gaGFuZGxlIGJ1ZyByZXBvcnRzIGZyb20gdXNlcnMgb2YgdGhlIGNvZGUsIGVpdGhlcgorYnkgam9pbmluZyB0aGUgcG5nLW1uZy1pbXBsZW1lbnQgbWFpbGluZyBsaXN0IG9yIGJ5IHByb3ZpZGluZyBhbiBlbWFpbCBmb3IgdGhlCisiQlVHIFJFUE9SVFMiIGVudHJ5IG9yIGJvdGguICBQbGVhc2UgbWFrZSBzdXJlIHRoYXQgdGhlIGhlYWRlciBvZiB0aGUgZmlsZQorY29udGFpbnMgdGhlIFNUQVRVUyBhbmQgQlVHIFJFUE9SVFMgZmllbGRzIGFzIGFib3ZlLgorCitQbGVhc2UgbGlzdCB0aGUgT1MgcmVxdWlyZW1lbnRzIGFzIHByZWNpc2VseSBhcyBwb3NzaWJsZS4gIElkZWFsbHkgeW91IHNob3VsZAorYWxzbyBsaXN0IHRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCB0aGUgY29kZSBoYXMgYmVlbiB0ZXN0ZWQgYW5kIGNlcnRhaW5seSBsaXN0CithbnkgZW52aXJvbm1lbnRzIHdoZXJlIHlvdSBzdXNwZWN0IGl0IG1pZ2h0IG5vdCB3b3JrLgpkaWZmIC0tZ2l0IGEvbGlicG5nL2NvbnRyaWIvYXJtLW5lb24vYW5kcm9pZC1uZGsuYyBiL2xpYnBuZy9jb250cmliL2FybS1uZW9uL2FuZHJvaWQtbmRrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI0MDEyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL2FybS1uZW9uL2FuZHJvaWQtbmRrLmMKQEAgLTAsMCArMSwzOSBAQAorLyogY29udHJpYi9hcm0tbmVvbi9hbmRyb2lkLW5kay5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogV3JpdHRlbiBieSBKb2huIEJvd2xlciwgMjAxNC4KKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS42LjEwIFtNYXJjaCA2LCAyMDE0XQorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisgKiBhbmQgbGljZW5zZSBpbiBwbmcuaAorICoKKyAqIFNFRSBjb250cmliL2FybS1uZW9uL1JFQURNRSBiZWZvcmUgcmVwb3J0aW5nIGJ1Z3MKKyAqCisgKiBTVEFUVVM6IENPTVBJTEVELCBVTlRFU1RFRAorICogQlVHIFJFUE9SVFM6IHBuZy1tbmctaW1wbGVtZW50QHNvdXJjZWZvcmdlLm5ldAorICoKKyAqIHBuZ19oYXZlX25lb24gaW1wbGVtZW50ZWQgZm9yIHRoZSBBbmRyb2lkIE5ESywgc2VlOgorICoKKyAqIERvY3VtZW50YXRpb246CisgKiAgICBodHRwOi8vd3d3LmthbmRyb2lkLm9yZy9uZGsvZG9jcy9DUFUtQVJNLU5FT04uaHRtbAorICogICAgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2FuZHJvaWQvaXNzdWVzL2RldGFpbD9pZD00OTA2NQorICoKKyAqIE5PVEU6IHRoaXMgcmVxdWlyZXMgdGhhdCBsaWJwbmcgaXMgYnVpbHQgYWdhaW5zdCB0aGUgQW5kcm9pZCBOREsgYW5kIGxpbmtlZAorICogd2l0aCBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQW5kcm9pZCBBUk0gJ2NwdS1mZWF0dXJlcycgbGlicmFyeS4gIFRoZSBjb2RlCisgKiBoYXMgYmVlbiBjb21waWxlZCBvbmx5LCBub3QgbGlua2VkOiBubyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IGhhcyBiZWVuIGZvdW5kLAorICogb25seSB0aGUgaGVhZGVyIGZpbGVzIGV4aXN0IGluIHRoZSBOREsuCisgKi8KKyNpbmNsdWRlIDxjcHUtZmVhdHVyZXMuaD4KKworc3RhdGljIGludAorcG5nX2hhdmVfbmVvbihwbmdfc3RydWN0cCBwbmdfcHRyKQoreworICAgLyogVGhpcyBpcyBhIHdob2xlIGxvdCBlYXNpZXIgdGhhbiB0aGUgbGludXggY29kZSwgaG93ZXZlciBpdCBpcyBwcm9iYWJseQorICAgICogaW1wbGVtZW50ZWQgYXMgYmVsb3csIHRoZXJlZm9yZSBpdCBpcyBiZXR0ZXIgdG8gY2FjaGUgdGhlIHJlc3VsdCAodGhlc2UKKyAgICAqIGZ1bmN0aW9uIGNhbGxzIG1heSBiZSBzbG93ISkKKyAgICAqLworICAgUE5HX1VOVVNFRChwbmdfcHRyKQorICAgcmV0dXJuIGFuZHJvaWRfZ2V0Q3B1RmFtaWx5KCkgPT0gQU5EUk9JRF9DUFVfRkFNSUxZX0FSTSAmJgorICAgICAgKGFuZHJvaWRfZ2V0Q3B1RmVhdHVyZXMoKSAmIEFORFJPSURfQ1BVX0FSTV9GRUFUVVJFX05FT04pICE9IDA7Cit9CmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9hcm0tbmVvbi9saW51eC1hdXh2LmMgYi9saWJwbmcvY29udHJpYi9hcm0tbmVvbi9saW51eC1hdXh2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQyNmJkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL2FybS1uZW9uL2xpbnV4LWF1eHYuYwpAQCAtMCwwICsxLDEyMCBAQAorLyogY29udHJpYi9hcm0tbmVvbi9saW51eC1hdXh2LmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKiBXcml0dGVuIGJ5IE1hbnMgUnVsbGdhcmQsIDIwMTEuCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4xMCBbTWFyY2ggNiwgMjAxNF0KKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKyAqCisgKiBTRUUgY29udHJpYi9hcm0tbmVvbi9SRUFETUUgYmVmb3JlIHJlcG9ydGluZyBidWdzCisgKgorICogU1RBVFVTOiBDT01QSUxFRCwgVEVTVEVECisgKiBCVUcgUkVQT1JUUzogcG5nLW1uZy1pbXBsZW1lbnRAc291cmNlZm9yZ2UubmV0CisgKgorICogcG5nX2hhdmVfbmVvbiBpbXBsZW1lbnRlZCBmb3IgTGludXggdmVyc2lvbnMgd2hpY2ggYWxsb3cgYWNjZXNzIHRvCisgKiAvcHJvYy9zZWxmL2F1eHYuICBUaGlzIGlzIHByb2JhYmx5IGZhc3RlciwgY2xlYW5lciBhbmQgc2FmZXIgdGhhbiB0aGUgY29kZSB0bworICogcmVhZCAvcHJvYy9jcHVpbmZvIGluIGNvbnRyaWIvYXJtLW5lb24vbGludXgsIGhvd2V2ZXIgaXQgaXMgeWV0IGFub3RoZXIgcGllY2UKKyAqIG9mIHBvdGVudGlhbGx5IHVudGVzdGVkIGNvZGUgYW5kIGhhcyBtb3JlIGNvbXBsZXggZGVwZW5kZW5jaWVzIHRoYW4gdGhlIGNvZGUKKyAqIHRvIHJlYWQgY3B1aW5mby4KKyAqCisgKiBUaGlzIGdlbmVyaWMgX19saW51eF9fIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHJlYWRpbmcgL3Byb2Mvc2VsZi9hdXh2IGFuZAorICogbG9va2luZyBhdCBlYWNoIGVsZW1lbnQgZm9yIG9uZSB0aGF0IHJlY29yZHMgTkVPTiBjYXBhYmlsaXRpZXMuCisgKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4gLyogZm9yIFBPU0lYIDEwMDMuMSAqLworI2luY2x1ZGUgPGVycm5vLmg+ICAvKiBmb3IgRUlOVFIgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlbGYuaD4KKyNpbmNsdWRlIDxhc20vaHdjYXAuaD4KKworLyogQSByZWFkIGNhbGwgbWF5IGJlIGludGVycnVwdGVkLCBpbiB3aGljaCBjYXNlIGl0IHJldHVybnMgLTEgYW5kIHNldHMgZXJybm8gdG8KKyAqIEVJTlRSIGlmIG5vdGhpbmcgd2FzIGRvbmUsIG90aGVyd2lzZSAoaWYgc29tZXRoaW5nIHdhcyBkb25lKSBhIHBhcnRpYWwgcmVhZAorICogbWF5IHJlc3VsdC4KKyAqLworc3RhdGljIHNpemVfdAorc2FmZV9yZWFkKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGludCBmZCwgdm9pZCAqYnVmZmVyX2luLCBzaXplX3QgbmJ5dGVzKQoreworICAgc2l6ZV90IG50b3RhbCA9IDA7CisgICBjaGFyICpidWZmZXIgPSBwbmdfdm9pZGNhc3QoY2hhciosIGJ1ZmZlcl9pbik7CisKKyAgIHdoaWxlIChuYnl0ZXMgPiAwKQorICAgeworICAgICAgdW5zaWduZWQgaW50IG5yZWFkOworICAgICAgaW50IGlyZWFkOworCisgICAgICAvKiBQYXNzaW5nIG5yZWFkID4gSU5UX01BWCB0byByZWFkIGlzIGltcGxlbWVudGF0aW9uIGRlZmluZWQgaW4gUE9TSVgKKyAgICAgICAqIDEwMDMuMSwgdGhlcmVmb3JlIGRlc3BpdGUgdGhlIHVuc2lnbmVkIGFyZ3VtZW50IHBvcnRhYmxlIGNvZGUgbXVzdAorICAgICAgICogbGltaXQgdGhlIHZhbHVlIHRvIElOVF9NQVghCisgICAgICAgKi8KKyAgICAgIGlmIChuYnl0ZXMgPiBJTlRfTUFYKQorICAgICAgICAgbnJlYWQgPSBJTlRfTUFYOworCisgICAgICBlbHNlCisgICAgICAgICBucmVhZCA9ICh1bnNpZ25lZCBpbnQpLypTQUZFKi9uYnl0ZXM7CisKKyAgICAgIGlyZWFkID0gcmVhZChmZCwgYnVmZmVyLCBucmVhZCk7CisKKyAgICAgIGlmIChpcmVhZCA9PSAtMSkKKyAgICAgIHsKKyAgICAgICAgIC8qIFRoaXMgaXMgdGhlIGRldmlsIGluIHRoZSBkZXRhaWxzLCBhIHJlYWQgY2FuIHRlcm1pbmF0ZSBlYXJseSB3aXRoIDAKKyAgICAgICAgICAqIGJ5dGVzIHJlYWQgYmVjYXVzZSBvZiBFSU5UUiwgeWV0IGl0IHN0aWxsIHJldHVybnMgLTEgb3RoZXJ3aXNlIGVuZAorICAgICAgICAgICogb2YgZmlsZSBjYW5ub3QgYmUgZGlzdGluZ3Vpc2hlZC4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKGVycm5vICE9IEVJTlRSKQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIi9wcm9jIHJlYWQgZmFpbGVkIik7CisgICAgICAgICAgICByZXR1cm4gMDsgLyogSS5lLiwgYSBwZXJtYW5lbnQgZmFpbHVyZSAqLworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBlbHNlIGlmIChpcmVhZCA8IDApCisgICAgICB7CisgICAgICAgICAvKiBOb3QgYSB2YWxpZCAncmVhZCcgcmVzdWx0OiAqLworICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk9TIC9wcm9jIHJlYWQgYnVnIik7CisgICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgZWxzZSBpZiAoaXJlYWQgPiAwKQorICAgICAgeworICAgICAgICAgLyogQ29udGludWUgcmVhZGluZyB1bnRpbCBhIHBlcm1hbmVudCBmYWlsdXJlLCBvciBFT0YgKi8KKyAgICAgICAgIGJ1ZmZlciArPSBpcmVhZDsKKyAgICAgICAgIG5ieXRlcyAtPSAodW5zaWduZWQgaW50KS8qU0FGRSovaXJlYWQ7CisgICAgICAgICBudG90YWwgKz0gKHVuc2lnbmVkIGludCkvKlNBRkUqL2lyZWFkOworICAgICAgfQorCisgICAgICBlbHNlCisgICAgICAgICByZXR1cm4gbnRvdGFsOworICAgfQorCisgICByZXR1cm4gbnRvdGFsOyAvKiBuYnl0ZXMgPT0gMCAqLworfQorCitzdGF0aWMgaW50CitwbmdfaGF2ZV9uZW9uKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCit7CisgICBpbnQgZmQgPSBvcGVuKCIvcHJvYy9zZWxmL2F1eHYiLCBPX1JET05MWSk7CisgICBFbGYzMl9hdXh2X3QgYXV4OworCisgICAvKiBGYWlsc2FmZTogZmFpbHVyZSB0byBvcGVuIG1lYW5zIG5vIE5FT04gKi8KKyAgIGlmIChmZCA9PSAtMSkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICIvcHJvYy9zZWxmL2F1eHYgb3BlbiBmYWlsZWQiKTsKKyAgICAgIHJldHVybiAwOworICAgfQorCisgICB3aGlsZSAoc2FmZV9yZWFkKHBuZ19wdHIsIGZkLCAmYXV4LCBzaXplb2YgYXV4KSA9PSBzaXplb2YgYXV4KQorICAgeworICAgICAgaWYgKGF1eC5hX3R5cGUgPT0gQVRfSFdDQVAgJiYgKGF1eC5hX3VuLmFfdmFsICYgSFdDQVBfTkVPTikgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgfQorCisgICBjbG9zZShmZCk7CisgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL2FybS1uZW9uL2xpbnV4LmMgYi9saWJwbmcvY29udHJpYi9hcm0tbmVvbi9saW51eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZjliYjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9hcm0tbmVvbi9saW51eC5jCkBAIC0wLDAgKzEsMTYxIEBACisvKiBjb250cmliL2FybS1uZW9uL2xpbnV4LmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKiBXcml0dGVuIGJ5IEpvaG4gQm93bGVyLCAyMDE0LgorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMTYgW0RlY2VtYmVyIDIyLCAyMDE0XQorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisgKiBhbmQgbGljZW5zZSBpbiBwbmcuaAorICoKKyAqIFNFRSBjb250cmliL2FybS1uZW9uL1JFQURNRSBiZWZvcmUgcmVwb3J0aW5nIGJ1Z3MKKyAqCisgKiBTVEFUVVM6IFNVUFBPUlRFRAorICogQlVHIFJFUE9SVFM6IHBuZy1tbmctaW1wbGVtZW50QHNvdXJjZWZvcmdlLm5ldAorICoKKyAqIHBuZ19oYXZlX25lb24gaW1wbGVtZW50ZWQgZm9yIExpbnV4IGJ5IHJlYWRpbmcgdGhlIHdpZGVseSBhdmFpbGFibGUKKyAqIHBzZXVkby1maWxlIC9wcm9jL2NwdWluZm8uCisgKgorICogVGhpcyBjb2RlIGlzIHN0cmljdCBBTlNJLUMgYW5kIGlzIHByb2JhYmx5IG1vZGVyYXRlbHkgcG9ydGFibGU7IGl0IGRvZXMKKyAqIGhvd2V2ZXIgdXNlIDxzdGRpby5oPiBhbmQgaXQgYXNzdW1lcyB0aGF0IC9wcm9jL2NwdWluZm8gaXMgbmV2ZXIgbG9jYWxpemVkLgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIGludAorcG5nX2hhdmVfbmVvbihwbmdfc3RydWN0cCBwbmdfcHRyKQoreworICAgRklMRSAqZiA9IGZvcGVuKCIvcHJvYy9jcHVpbmZvIiwgInJiIik7CisKKyAgIGlmIChmICE9IE5VTEwpCisgICB7CisgICAgICAvKiBUaGlzIGlzIGEgc2ltcGxlIHN0YXRlIG1hY2hpbmUgd2hpY2ggcmVhZHMgdGhlIGlucHV0IGJ5dGUtYnktYnl0ZSB1bnRpbAorICAgICAgICogaXQgZ2V0cyBhIG1hdGNoIG9uIHRoZSAnbmVvbicgZmVhdHVyZSBvciByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4KKyAgICAgICAqLworICAgICAgc3RhdGljIGNvbnN0IGNoYXIgY2hfZmVhdHVyZVtdID0geyA3MCwgNjksIDY1LCA4NCwgODUsIDgyLCA2OSwgODMgfTsKKyAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGNoX25lb25bXSA9IHsgNzgsIDY5LCA3OSwgNzggfTsKKworICAgICAgZW51bQorICAgICAgeworICAgICAgICAgU3RhcnRMaW5lLCBGZWF0dXJlLCBDb2xvbiwgU3RhcnRUYWcsIE5lb24sIEhhdmVOZW9uLCBTa2lwVGFnLCBTa2lwTGluZQorICAgICAgfSAgc3RhdGU7CisgICAgICBpbnQgY291bnRlcjsKKworICAgICAgZm9yIChzdGF0ZT1TdGFydExpbmUsIGNvdW50ZXI9MDs7KQorICAgICAgeworICAgICAgICAgaW50IGNoID0gZmdldGMoZik7CisKKyAgICAgICAgIGlmIChjaCA9PSBFT0YpCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBFT0YgbWVhbnMgZXJyb3Igb3IgZW5kLW9mLWZpbGUsIHJldHVybiBmYWxzZTsgbmVvbiBhdCBFT0YgaXMKKyAgICAgICAgICAgICAqIGFzc3VtZWQgdG8gYmUgYSBtaXN0YWtlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBmY2xvc2UoZik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgIH0KKworICAgICAgICAgc3dpdGNoIChzdGF0ZSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgU3RhcnRMaW5lOgorICAgICAgICAgICAgICAgLyogTWF0Y2ggc3BhY2VzIGF0IHRoZSBzdGFydCBvZiBsaW5lICovCisgICAgICAgICAgICAgICBpZiAoY2ggPD0gMzIpIC8qIHNraXAgY29udHJvbCBjaGFyYWN0ZXJzIGFuZCBzcGFjZSAqLworICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgIGNvdW50ZXI9MDsKKyAgICAgICAgICAgICAgIHN0YXRlID0gRmVhdHVyZTsKKyAgICAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLworCisgICAgICAgICAgICBjYXNlIEZlYXR1cmU6CisgICAgICAgICAgICAgICAvKiBNYXRjaCAnRkVBVFVSRScsIEFTQ0lJIGNhc2UgaW5zZW5zaXRpdmUuICovCisgICAgICAgICAgICAgICBpZiAoKGNoICYgfjB4MjApID09IGNoX2ZlYXR1cmVbY291bnRlcl0pCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoKytjb3VudGVyID09IChzaXplb2YgY2hfZmVhdHVyZSkpCisgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IENvbG9uOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIC8qIGRpZCBub3QgbWF0Y2ggJ2ZlYXR1cmUnICovCisgICAgICAgICAgICAgICBzdGF0ZSA9IFNraXBMaW5lOworICAgICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgICAgIGNhc2UgU2tpcExpbmU6CisgICAgICAgICAgICBza2lwTGluZToKKyAgICAgICAgICAgICAgIC8qIFNraXAgZXZlcnl0aGluZyB1bnRpbCB3ZSBzZWUgbGluZWZlZWQgb3IgY2FycmlhZ2UgcmV0dXJuICovCisgICAgICAgICAgICAgICBpZiAoY2ggIT0gMTAgJiYgY2ggIT0gMTMpCisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgc3RhdGUgPSBTdGFydExpbmU7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBDb2xvbjoKKyAgICAgICAgICAgICAgIC8qIE1hdGNoIGFueSBudW1iZXIgb2Ygc3BhY2Ugb3IgdGFiIGZvbGxvd2VkIGJ5ICc6JyAqLworICAgICAgICAgICAgICAgaWYgKGNoID09IDMyIHx8IGNoID09IDkpCisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgaWYgKGNoID09IDU4KSAvKiBpLmUuICc6JyAqLworICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGFydFRhZzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAvKiBFaXRoZXIgYSBiYWQgbGluZSBmb3JtYXQgb3IgYSAnZmVhdHVyZScgcHJlZml4IGZvbGxvd2VkIGJ5CisgICAgICAgICAgICAgICAgKiBvdGhlciBjaGFyYWN0ZXJzLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICBzdGF0ZSA9IFNraXBMaW5lOworICAgICAgICAgICAgICAgZ290byBza2lwTGluZTsKKworICAgICAgICAgICAgY2FzZSBTdGFydFRhZzoKKyAgICAgICAgICAgICAgIC8qIFNraXAgc3BhY2UgY2hhcmFjdGVycyBiZWZvcmUgYSB0YWcgKi8KKyAgICAgICAgICAgICAgIGlmIChjaCA9PSAzMiB8fCBjaCA9PSA5KQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgIHN0YXRlID0gTmVvbjsKKyAgICAgICAgICAgICAgIGNvdW50ZXIgPSAwOworICAgICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgICAgIGNhc2UgTmVvbjoKKyAgICAgICAgICAgICAgIC8qIExvb2sgZm9yICduZW9uJyB0YWcgKi8KKyAgICAgICAgICAgICAgIGlmICgoY2ggJiB+MHgyMCkgPT0gY2hfbmVvbltjb3VudGVyXSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICgrK2NvdW50ZXIgPT0gKHNpemVvZiBjaF9uZW9uKSkKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gSGF2ZU5lb247CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgc3RhdGUgPSBTa2lwVGFnOworICAgICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgICAgIGNhc2UgU2tpcFRhZzoKKyAgICAgICAgICAgICAgIC8qIFNraXAgbm9uLXNwYWNlIGNoYXJhY3RlcnMgKi8KKyAgICAgICAgICAgICAgIGlmIChjaCA9PSAxMCB8fCBjaCA9PSAxMykKKyAgICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhcnRMaW5lOworCisgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAzMiB8fCBjaCA9PSA5KQorICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGFydFRhZzsKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEhhdmVOZW9uOgorICAgICAgICAgICAgICAgLyogSGF2ZSBzZWVuIGEgJ25lb24nIHByZWZpeCwgYnV0IHRoZXJlIG11c3QgYmUgYSBzcGFjZSBvciBuZXcKKyAgICAgICAgICAgICAgICAqIGxpbmUgY2hhcmFjdGVyIHRvIHRlcm1pbmF0ZSBpdC4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgaWYgKGNoID09IDEwIHx8IGNoID09IDEzIHx8IGNoID09IDMyIHx8IGNoID09IDkpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBmY2xvc2UoZik7CisgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgc3RhdGUgPSBTa2lwVGFnOworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInBuZ19oYXZlX25lb246IGludGVybmFsIGVycm9yIChidWcpIik7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyNpZmRlZiBQTkdfV0FSTklOR1NfU1VQUE9SVEVECisgICBlbHNlCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiL3Byb2MvY3B1aW5mbyBvcGVuIGZhaWxlZCIpOworI2VuZGlmCisKKyAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGlicG5nL2NvbnRyaWIvY29uZnRlc3QvUkVBRE1FIGIvbGlicG5nL2NvbnRyaWIvY29uZnRlc3QvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNDcyNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9jb25mdGVzdC9SRUFETUUKQEAgLTAsMCArMSw0OSBAQAorVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGVzdCBjb25maWd1cmF0aW9uIGZpbGVzLCBjdXJyZW50bHkgYWx3YXlzICcuZGZhJyBmaWxlcworaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiB0aGUgYnVpbGQgYnkgc2V0dGluZyB0aGUgbWFrZSBtYWNybyBERkFfWFRSQSB0byB0aGUgbmFtZQorb2YgdGhlIGZpbGUuCisKK1RoZXNlIGZpbGVzIGFyZSB1c2VkIGluIHJlbGVhc2UgdmFsaWRhdGlvbiBvZiB0aGUgJ2NvbmZpZ3VyZScgYnVpbGRzIG9mIGxpYnBuZworYnkgYnVpbGRpbmcgJ21ha2UgY2hlY2snLCBvciAnbWFrZSBhbGwtYW0nIGZvciBjcm9zcy1idWlsZHMsIHdpdGggZWFjaCAuZGZhCitmaWxlLgorCitUaGUgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgbWF5IGNoYW5nZSBiZXR3ZWVuIG1pbm9yIHJlbGVhc2VzLCBob3dldmVyCitjb250cmlidXRpb25zIGRlc2NyaWJpbmcgc3BlY2lmaWMgYnVpbGRzIG9mIGxpYnBuZyBhcmUgd2VsY29tZWQuICBUaGVyZSBpcyBubworZ3VhcmFudGVlIHRoYXQgbGlicG5nIHdpbGwgY29udGludWUgdG8gYnVpbGQgd2l0aCBzdWNoIGNvbmZpZ3VyYXRpb25zOyBzdXBwb3J0Citmb3IgZ2l2ZW4gY29uZmlndXJhdGlvbnMgY2FuIGJlLCBhbmQgaGFzIGJlZW4sIGRyb3BwZWQgYmV0d2VlbiBzdWNjZXNzaXZlIG1pbm9yCityZWxlYXNlcy4gIEhvd2V2ZXIgaWYgYSAuZGZhIGZpbGUgZGVzY3JpYmluZyBhIGNvbmZpZ3VyYXRpb24gaXMgbm90IGluIHRoaXMKK2RpcmVjdG9yeSBpdCBpcyB2ZXJ5IHVubGlrZWx5IHRoYXQgaXQgd2lsbCBiZSB0ZXN0ZWQgYmVmb3JlIGEgbWlub3IgcmVsZWFzZSEKKworWW91IGNhbiB1c2UgdGhlc2UgLmRmYSBmaWxlcyBhcyB0aGUgYmFzaXMgb2YgbmV3IGNvbmZpZ3VyYXRpb25zLiAgRmlsZXMgaW4gdGhpcworZGlyZWN0b3J5IHNob3VsZCBub3QgaGF2ZSBhbnkgdXNlIHJlc3RyaWN0aW9ucyBvciByZXN0cmljdGl2ZSBsaWNlbnNlcy4KKworVGhpcyBkaXJlY3RvcnkgaXMgbm90IGluY2x1ZGVkIGluIHRoZSAuemlwIGFuZCAuN3ogZGlzdHJpYnV0aW9ucywgd2hpY2ggZG8KK25vdCBjb250YWluICdjb25maWd1cmUnIHNjcmlwdHMuCisKK0RPQ1VNRU5UQVRJT04KKz09PT09PT09PT09PT0KKworRXhhbXBsZXM6CisgICAke3NyY2Rpcn0vcG5ndXNyLmRmYQorICAgJHtzcmNkaXJ9L2NvbnRyaWIvcG5nbWluaW0vKi9wbmd1c3IuZGZhCisKK0RvY3VtZW50YXRpb24gb2YgdGhlIG9wdGlvbnM6CisgICAke3NyY2Rpcn0vc2NyaXB0cy9wbmdsaWJjb25mLmRmYQorCitEb2N1bWVudGF0aW9uIG9mIHRoZSBmaWxlIGZvcm1hdDoKKyAgICR7c3JjZGlyfS9zY3JpcHRzL29wdGlvbnMuYXdrCisKK0ZJTEUgTkFNSU5HCis9PT09PT09PT09PQorCitGaWxlIG5hbWVzIGluIHRoaXMgZGlyZWN0b3J5IG1heSBOT1QgY29udGFpbiBhbnkgb2YgdGhlIGZpdmUgY2hhcmFjdGVyczoKKworICAgLSAsICsgKiA/CisKK05laXRoZXIgbWF5IHRoZXkgY29udGFpbiBhbnkgc3BhY2UgY2hhcmFjdGVyLgorCitXaGlsZSBvdGhlciBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIGl0IGlzIHN0cm9uZ2x5IHN1Z2dlc3RlZCB0aGF0IGZpbGUgbmFtZXMgYmUKK2xpbWl0ZWQgdG8gbG93ZXIgY2FzZSBMYXRpaW4gYWxwaGFiZXRpYyBjaGFyYWN0ZXJzIChhLXopLCBkaWdpdHMgKDAtOSkgYW5kLCBpZgorbmVjZXNzYXJ5IHRoZSB1bmRlcnNjb3JlIChfKSBjaGFyYWN0ZXIuICBGaWxlIG5hbWVzIHNob3VsZCBiZSBhYm91dCA4IGNoYXJhY3RlcnMKK2xvbmcgKGV4Y2x1ZGluZyB0aGUgLmRmYSBleHRlbnNpb24pLiAgU3VibWl0dGVkIC5kZmEgZmlsZXMgc2hvdWxkIGhhdmUgbmFtZXMKK2JldHdlZW4gNyBhbmQgMTYgY2hhcmFjdGVycyBsb25nLCBzaG9ydGVyIG5hbWVzICg2IGNoYXJhY3RlcnMgb3IgbGVzcykgYXJlCityZXNlcnZlZCBmb3Igc3RhbmRhcmQgdGVzdHMuCmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9jb25mdGVzdC9yZWFkLmRmYSBiL2xpYnBuZy9jb250cmliL2NvbmZ0ZXN0L3JlYWQuZGZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZTg4ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9jb25mdGVzdC9yZWFkLmRmYQpAQCAtMCwwICsxLDU4IEBACisjIHJlYWQuZGZhCisjICBCdWlsZCB0aW1lIGNvbmZpZ3VyYXRpb24gb2YgbGlicG5nCisjCisjIEF1dGhvcjogSm9obiBCb3dsZXIKKyMgQ29weXJpZ2h0OiAoYykgSm9obiBCb3dsZXIsIDIwMTMKKyMgVXNhZ2UgcmlnaHRzOgorIyAgVG8gdGhlIGV4dGVudCBwb3NzaWJsZSB1bmRlciBsYXcsIHRoZSBhdXRob3IgaGFzIHdhaXZlZCBhbGwgY29weXJpZ2h0IGFuZAorIyAgcmVsYXRlZCBvciBuZWlnaGJvcmluZyByaWdodHMgdG8gdGhpcyB3b3JrLiAgVGhpcyB3b3JrIGlzIHB1Ymxpc2hlZCBmcm9tOgorIyAgVW5pdGVkIFN0YXRlcy4KKyMKKyMgQnVpbGQgbGlicG5nIHdpdGggYmFzaWMgcmVhZCBzdXBwb3J0LiAgVGhpcyBlbmFibGVzIHRoZSBsb3dlc3QgbGV2ZWwgbGlicG5nCisjIHJlYWQgQVBJIC0gdGhlIG9uZSB3aGVyZSB0aGUgY2FsbGluZyBjb2RlIGhhcyB0byB1c2UgYSBsb29wIHRvIHJlYWQgZWFjaCByb3cuCisjIEF0IHByZXNlbnQgdGhpcyBpcyB0aGUgQVBJIHVzZWQgYnkgbW9zdCBwcm9ncmFtcy4KKyMKKyMgU3VwcG9ydCBpcyBlbmFibGVkIG9ubHkgZm9yIHRob3NlIGNodW5rcyBhbmQgdHJhbnNmb3JtYXRpb25zIHRoYXQgYXJlCisjIHR5cGljYWxseSByZXF1aXJlZCAtIG90aGVycyBjYW4gYmUgYWRkZWQgZWFzaWx5LgorIworCitldmVyeXRoaW5nID0gb2ZmCisKKyMgVGhlIHNlcXVlbnRpYWwgcmVhZCBjb2RlIGlzIGVuYWJsZWQgaGVyZTsgdGhlIHByb2dyZXNzaXZlIGNvZGUgY2FuIGJlIHVzZWQKKyMgaW5zdGVhZCBidXQgdGhlcmUgaXMgbm8gcG9pbnQgZW5hYmxpbmcgYm90aC4KKworb3B0aW9uIFNFUVVFTlRJQUxfUkVBRCBvbgorCisjIExpa2V3aXNlIGl0IGlzIHBvaW50bGVzcyBlbmFibGluZyBib3RoIGZpeGVkIGFuZCBmbG9hdGluZyBwb2ludCBBUElzLiAgQ2hvb3NlCisjIG9uZSBvciB0aGUgb3RoZXIgZm9yIGJvdGggdGhlIEFQSSBhbmQgdGhlIGludGVybmFsIG1hdGguCisKKyNGaXhlZCBwb2ludDoKKyNvcHRpb24gRklYRURfUE9JTlQgb24KKyNvcHRpb24gRkxPQVRJTkdfQVJJVEhNRVRJQyBvZmYKKworI0Zsb2F0aW5nIHBvaW50Ogorb3B0aW9uIEZMT0FUSU5HX1BPSU5UIG9uCitvcHRpb24gRkxPQVRJTkdfQVJJVEhNRVRJQyBvbgorCisjIEJhc2ljIGVycm9yIGhhbmRsaW5nLCBJTyBhbmQgdXNlciBtZW1vcnkgc3VwcG9ydC4gIFRoZSBsYXR0ZXIgYWxsb3dzIHRoZQorIyBhcHBsaWNhdGlvbiBwcm9ncmFtIHRvIHByb3ZpZGUgaXRzIG93biBpbXBsZW1lbnRhdGlvbnMgb2YgJ21hbGxvYycgYW5kICdmcmVlJy4KK29wdGlvbiBTRVRKTVAgb24KK29wdGlvbiBTVERJTyBvbgorb3B0aW9uIFVTRVJfTUVNIG9uCisKKyMgVG8gcmVhZCB0aGUgZnVsbCBzZXQgb2YgUE5HIGltYWdlcyBjb3JyZWN0bHkgaW50ZXJsYWNlLCB0cmFuc3BhcmVuY3kgYW5kCisjIDE2LWJpdCBzdXBwb3J0IGlzIHJlcXVpcmVkLiAgVGhlIGFwcGxpY2F0aW9uIGNhbiBpbXBsZW1lbnQgaW50ZXJsYWNlIGl0c2VsZiwKKyMgYnV0IHZlcnkgZmV3IGRvIGFuZCBpdCdzIG5vIGxvbmdlciBwb3NzaWJsZSB0byBkaXNhYmxlIGl0IHdoZW4gUkVBRCBpcworIyBlbmFibGVkLgorb3B0aW9uIFJFQURfdFJOUyBvbgorb3B0aW9uIFJFQURfMTZCSVQgb24KKworIyBFdmVyeXRoaW5nIGVsc2UgaXMgYXBwbGljYXRpb24gZGVwZW5kZW50LiAgVGhpcyBmaWxlIGFzc3VtZXMgdGhlIGFwcCBoYW5kbGVzCisjIGFsbCB0aGUgbmF0aXZlIFBORyBiaXQgbGF5b3V0cywgc28gaXQgZG9lc24ndCBuZWVkIGFueSBvZiBsYXlvdXQgY2hhbmdlCisjIHRyYW5zZm9ybXMsIGJ1dCBuZWVkcyBsaWJwbmcgdG8gcGVyZm9ybSBnYW1tYSBjb3JyZWN0aW9uLiAgSXQgZG9lc24ndCBkbyBhbnkKKyMgY29sb3JzcGFjZSBzdHVmZiBhbmQgaWdub3JlcyB0aGUgJ3NpZ25pZmljYW50IGJpdCcgaW5mb3JtYXRpb24uCisjCisjIElmIHlvdXIgYXBwIGFsd2F5cyBleHBhbmRzIHRoZSBpbWFnZSB0byBhIGxpbWl0ZWQgc2V0IG9mIGJpdCBsYXlvdXRzIHlvdQorIyBwcm9iYWJseSB3YW50IHRvIGNvbnNpZGVyIHVzaW5nIHRoZSBzaW1wbGlmaWVkIEFQSSBpbnN0ZWFkIG9mIHRoZSBsb3cgbGV2ZWwKKyMgb25lIC0gc2VlIHBuZy5oIGFuZCBzX3JlYWQuZGZhLgorb3B0aW9uIFJFQURfR0FNTUEgb24KZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL2NvbmZ0ZXN0L3NfcmVhZC5kZmEgYi9saWJwbmcvY29udHJpYi9jb25mdGVzdC9zX3JlYWQuZGZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMWNlMGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9jb25mdGVzdC9zX3JlYWQuZGZhCkBAIC0wLDAgKzEsMzUgQEAKKyMgc19yZWFkLmRmYQorIyAgQnVpbGQgdGltZSBjb25maWd1cmF0aW9uIG9mIGxpYnBuZworIworIyBBdXRob3I6IEpvaG4gQm93bGVyCisjIENvcHlyaWdodDogKGMpIEpvaG4gQm93bGVyLCAyMDEzCisjIFVzYWdlIHJpZ2h0czoKKyMgIFRvIHRoZSBleHRlbnQgcG9zc2libGUgdW5kZXIgbGF3LCB0aGUgYXV0aG9yIGhhcyB3YWl2ZWQgYWxsIGNvcHlyaWdodCBhbmQKKyMgIHJlbGF0ZWQgb3IgbmVpZ2hib3JpbmcgcmlnaHRzIHRvIHRoaXMgd29yay4gIFRoaXMgd29yayBpcyBwdWJsaXNoZWQgZnJvbToKKyMgIFVuaXRlZCBTdGF0ZXMuCisjCisjIEJ1aWxkIGxpYnBuZyB3aXRoIHNpbXBsaWZpZWQgcmVhZCBzdXBwb3J0IChvbmx5KS4gIFRoaXMgYnVpbGRzIGEgbWluaW1hbAorIyBsaWJwbmcgYWJsZSB0byByZWFkIGFsbCBQTkcgZm9ybWF0cyBhbmQgY29udmVydCB0aGVtIGludG8gYSBzbWFsbCBudW1iZXIgb2YKKyMgd2VsbCB1bmRlcnN0b29kIG1lbW9yeSBmb3JtYXRzLgorIworCitldmVyeXRoaW5nID0gb2ZmCisKK29wdGlvbiBTSU1QTElGSUVEX1JFQUQgb24KKworIyBJdCBpc24ndCBuZWNlc3NhcnkgdG8gY2hvc2UgZml4ZWQgb3IgZmxvYXRpbmcgcG9pbnQgZm9yIHRoZSBBUElzIGJlY2F1c2UgdGhlCisjIHNpbXBsaWZpZWQgQVBJIGRvZXNuJ3QgbmVlZCBmaXhlZCBvciBmbG9hdGluZyBwb2ludCBudW1iZXJzLiAgSXQgaXMgbmVjZXNzYXJ5CisjIHRvIGNob3NlIGFuIGludGVybmFsIG1hdGggaW1wbGVtZW50YXRpb24uICBUaGUgZGVmYXVsdCAoYmVjYXVzZSBvZiAnZXZlcnl0aGluZworIyA9IG9mZicpIGlzIGZpeGVkIHBvaW50IC0gdHVybiB0aGUgZmxvYXRpbmcgcG9pbnQgaW1wbGVtZW50YXRpb24gb24gaWYgeW91IGhhdmUKKyMgaGFyZHdhcmUgZmxvYXRpbmcgcG9pbnQgb3IgcHJlZmVyIHlvdXIgc29mdHdhcmUgZmxvYXRpbmcgcG9pbnQgaW1wbGVtZW50YXRpb24uCitvcHRpb24gRkxPQVRJTkdfQVJJVEhNRVRJQyBvbgorCisjIFRoaXMgaXMgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSwgYnV0IHdpdGhvdXQgaXQgdGhlIG1lc3NhZ2Ugc3RyaW5ncyBpbiB0aGUgQVBJCisjIHdpbGwgbm90IGJlIGZpbGxlZCBpbgorb3B0aW9uIEVSUk9SX1RFWFQgb24KKworIyBTd2l0Y2hpbmcgdGhlc2Ugb3B0aW9ucyBvbiBlbmFibGVzIHRoZSAnQUZJUlNUJyBhbmQgJ0JHUicgZm9ybWF0cyAtIHlvdSBkb24ndAorIyBuZWVkIHRoaXMgaWYgeW91IGRvbid0IHVzZSB0aGVtLCB0aGV5IGp1c3QgYWxsb3cgdGhlIGluLW1lbW9yeSBsYXlvdXQgdG8gYmUKKyMgY2hhbmdlZCB0byBtYXRjaCBjb21tb24gaGFyZHdhcmUgZm9ybWF0cy4KK29wdGlvbiBTSU1QTElGSUVEX1JFQURfQUZJUlNUIG9uCitvcHRpb24gU0lNUExJRklFRF9SRUFEX0JHUiBvbgpkaWZmIC0tZ2l0IGEvbGlicG5nL2NvbnRyaWIvY29uZnRlc3Qvc193cml0ZS5kZmEgYi9saWJwbmcvY29udHJpYi9jb25mdGVzdC9zX3dyaXRlLmRmYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTQwYTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvY29uZnRlc3Qvc193cml0ZS5kZmEKQEAgLTAsMCArMSwzMyBAQAorIyBzX3dyaXRlLmRmYQorIyAgQnVpbGQgdGltZSBjb25maWd1cmF0aW9uIG9mIGxpYnBuZworIworIyBBdXRob3I6IEpvaG4gQm93bGVyCisjIENvcHlyaWdodDogKGMpIEpvaG4gQm93bGVyLCAyMDEzCisjIFVzYWdlIHJpZ2h0czoKKyMgIFRvIHRoZSBleHRlbnQgcG9zc2libGUgdW5kZXIgbGF3LCB0aGUgYXV0aG9yIGhhcyB3YWl2ZWQgYWxsIGNvcHlyaWdodCBhbmQKKyMgIHJlbGF0ZWQgb3IgbmVpZ2hib3JpbmcgcmlnaHRzIHRvIHRoaXMgd29yay4gIFRoaXMgd29yayBpcyBwdWJsaXNoZWQgZnJvbToKKyMgIFVuaXRlZCBTdGF0ZXMuCisjCisjIEJ1aWxkIGxpYnBuZyB3aXRoIChqdXN0KSBzaW1wbGlmaWVkIHdyaXRlIHN1cHBvcnQKKyMKKworZXZlcnl0aGluZyA9IG9mZgorCitvcHRpb24gU0lNUExJRklFRF9XUklURSBvbgorCisjIEl0IGlzbid0IG5lY2Vzc2FyeSB0byBjaG9zZSBmaXhlZCBvciBmbG9hdGluZyBwb2ludCBmb3IgdGhlIEFQSXMgYmVjYXVzZSB0aGUKKyMgc2ltcGxpZmllZCBBUEkgZG9lc24ndCBuZWVkIGZpeGVkIG9yIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuICBJdCBpcyBuZWNlc3NhcnkKKyMgdG8gY2hvc2UgYW4gaW50ZXJuYWwgbWF0aCBpbXBsZW1lbnRhdGlvbi4gIFRoZSBkZWZhdWx0IChiZWNhdXNlIG9mICdldmVyeXRoaW5nCisjID0gb2ZmJykgaXMgZml4ZWQgcG9pbnQgLSB0dXJuIHRoZSBmbG9hdGluZyBwb2ludCBpbXBsZW1lbnRhdGlvbiBvbiBpZiB5b3UgaGF2ZQorIyBoYXJkd2FyZSBmbG9hdGluZyBwb2ludCBvciBwcmVmZXIgeW91ciBzb2Z0d2FyZSBmbG9hdGluZyBwb2ludCBpbXBsZW1lbnRhdGlvbi4KK29wdGlvbiBGTE9BVElOR19BUklUSE1FVElDIG9uCisKKyMgVGhpcyBpcyBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5LCBidXQgd2l0aG91dCBpdCB0aGUgbWVzc2FnZSBzdHJpbmdzIGluIHRoZSBBUEkKKyMgd2lsbCBub3QgYmUgZmlsbGVkIGluCitvcHRpb24gRVJST1JfVEVYVCBvbgorCisjIFN3aXRjaGluZyB0aGVzZSBvcHRpb25zIG9uIGVuYWJsZXMgdGhlICdBRklSU1QnIGFuZCAnQkdSJyBmb3JtYXRzIC0geW91IGRvbid0CisjIG5lZWQgdGhpcyBpZiB5b3UgZG9uJ3QgdXNlIHRoZW0sIHRoZXkganVzdCBhbGxvdyB0aGUgaW4tbWVtb3J5IGxheW91dCB0byBiZQorIyBjaGFuZ2VkIHRvIG1hdGNoIGNvbW1vbiBoYXJkd2FyZSBmb3JtYXRzLgorb3B0aW9uIFNJTVBMSUZJRURfV1JJVEVfQUZJUlNUIG9uCitvcHRpb24gU0lNUExJRklFRF9XUklURV9CR1Igb24KZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL2NvbmZ0ZXN0L3NpbXBsZS5kZmEgYi9saWJwbmcvY29udHJpYi9jb25mdGVzdC9zaW1wbGUuZGZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MTkzMzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9jb25mdGVzdC9zaW1wbGUuZGZhCkBAIC0wLDAgKzEsMzYgQEAKKyMgc2ltcGxlLmRmYQorIyAgQnVpbGQgdGltZSBjb25maWd1cmF0aW9uIG9mIGxpYnBuZworIworIyBBdXRob3I6IEpvaG4gQm93bGVyCisjIENvcHlyaWdodDogKGMpIEpvaG4gQm93bGVyLCAyMDEzCisjIFVzYWdlIHJpZ2h0czoKKyMgIFRvIHRoZSBleHRlbnQgcG9zc2libGUgdW5kZXIgbGF3LCB0aGUgYXV0aG9yIGhhcyB3YWl2ZWQgYWxsIGNvcHlyaWdodCBhbmQKKyMgIHJlbGF0ZWQgb3IgbmVpZ2hib3JpbmcgcmlnaHRzIHRvIHRoaXMgd29yay4gIFRoaXMgd29yayBpcyBwdWJsaXNoZWQgZnJvbToKKyMgIFVuaXRlZCBTdGF0ZXMuCisjCisjIEJ1aWxkIGxpYnBuZyB3aXRoIGp1c3QgdGhlIHNpbXBsaWZpZWQgQVBJcyAocmVhZCBhbmQgd3JpdGUpLgorIworCitldmVyeXRoaW5nID0gb2ZmCisKK29wdGlvbiBTSU1QTElGSUVEX1dSSVRFIG9uCitvcHRpb24gU0lNUExJRklFRF9SRUFEIG9uCisKKyMgSXQgaXNuJ3QgbmVjZXNzYXJ5IHRvIGNob3NlIGZpeGVkIG9yIGZsb2F0aW5nIHBvaW50IGZvciB0aGUgQVBJcyBiZWNhdXNlIHRoZQorIyBzaW1wbGlmaWVkIEFQSSBkb2Vzbid0IG5lZWQgZml4ZWQgb3IgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gIEl0IGlzIG5lY2Vzc2FyeQorIyB0byBjaG9zZSBhbiBpbnRlcm5hbCBtYXRoIGltcGxlbWVudGF0aW9uLiAgVGhlIGRlZmF1bHQgKGJlY2F1c2Ugb2YgJ2V2ZXJ5dGhpbmcKKyMgPSBvZmYnKSBpcyBmaXhlZCBwb2ludCAtIHR1cm4gdGhlIGZsb2F0aW5nIHBvaW50IGltcGxlbWVudGF0aW9uIG9uIGlmIHlvdSBoYXZlCisjIGhhcmR3YXJlIGZsb2F0aW5nIHBvaW50IG9yIHByZWZlciB5b3VyIHNvZnR3YXJlIGZsb2F0aW5nIHBvaW50IGltcGxlbWVudGF0aW9uLgorb3B0aW9uIEZMT0FUSU5HX0FSSVRITUVUSUMgb24KKworIyBUaGlzIGlzIG5vdCBzdHJpY3RseSBuZWNlc3NhcnksIGJ1dCB3aXRob3V0IGl0IHRoZSBtZXNzYWdlIHN0cmluZ3MgaW4gdGhlIEFQSQorIyB3aWxsIG5vdCBiZSBmaWxsZWQgaW4KK29wdGlvbiBFUlJPUl9URVhUIG9uCisKKyMgU3dpdGNoaW5nIHRoZXNlIG9wdGlvbnMgb24gZW5hYmxlcyB0aGUgJ0FGSVJTVCcgYW5kICdCR1InIGZvcm1hdHMgLSB5b3UgZG9uJ3QKKyMgbmVlZCB0aGlzIGlmIHlvdSBkb24ndCB1c2UgdGhlbSwgdGhleSBqdXN0IGFsbG93IHRoZSBpbi1tZW1vcnkgbGF5b3V0IHRvIGJlCisjIGNoYW5nZWQgdG8gbWF0Y2ggY29tbW9uIGhhcmR3YXJlIGZvcm1hdHMuCitvcHRpb24gU0lNUExJRklFRF9SRUFEX0FGSVJTVCBvbgorb3B0aW9uIFNJTVBMSUZJRURfUkVBRF9CR1Igb24KK29wdGlvbiBTSU1QTElGSUVEX1dSSVRFX0FGSVJTVCBvbgorb3B0aW9uIFNJTVBMSUZJRURfV1JJVEVfQkdSIG9uCmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9jb25mdGVzdC93cml0ZS5kZmEgYi9saWJwbmcvY29udHJpYi9jb25mdGVzdC93cml0ZS5kZmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMxOWFhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL2NvbmZ0ZXN0L3dyaXRlLmRmYQpAQCAtMCwwICsxLDQ1IEBACisjIHdyaXRlLmRmYQorIyAgQnVpbGQgdGltZSBjb25maWd1cmF0aW9uIG9mIGxpYnBuZworIworIyBBdXRob3I6IEpvaG4gQm93bGVyCisjIENvcHlyaWdodDogKGMpIEpvaG4gQm93bGVyLCAyMDEzCisjIFVzYWdlIHJpZ2h0czoKKyMgIFRvIHRoZSBleHRlbnQgcG9zc2libGUgdW5kZXIgbGF3LCB0aGUgYXV0aG9yIGhhcyB3YWl2ZWQgYWxsIGNvcHlyaWdodCBhbmQKKyMgIHJlbGF0ZWQgb3IgbmVpZ2hib3JpbmcgcmlnaHRzIHRvIHRoaXMgd29yay4gIFRoaXMgd29yayBpcyBwdWJsaXNoZWQgZnJvbToKKyMgIFVuaXRlZCBTdGF0ZXMuCisjCisjIEJ1aWxkIGxpYnBuZyB3aXRoIG5vIHJlYWQgc3VwcG9ydCBhbmQgbWluaW1hbCB3cml0ZSBzdXBwb3J0LgorIworCitldmVyeXRoaW5nID0gb2ZmCisKKyMgU3dpdGNoIG9uIHRoZSB3cml0ZSBjb2RlIC0gdGhpcyBtYWtlcyBhIG1pbmltYWxpc3QgZW5jb2RlcgorCitvcHRpb24gV1JJVEUgb24KKworIyBDaG9vc2UgZml4ZWQgb3IgZmxvYXRpbmcgcG9pbnQgQVBJcyBhbmQgYXJpdGhtZXRpYy4gIFRoZSBjaG9pY2VzIGFyZQorIyBpbmRlcGVuZGVudCBidXQgbm9ybWFsbHkgdGhleSB3aWxsIG1hdGNoLiAgSXQgaXMgdHlwaWNhbGx5IGJldHRlciB0byB1c2UgdGhlCisjIGZsb2F0aW5nIHBvaW50IGlmIHlvdSBoYXZlIGZsb2F0aW5nIHBvaW50IGhhcmR3YXJlLiAgSWYgeW91IGRvbid0IGtub3csIG9yCisjIChwZXJoYXBzKSB0byBtYWtlIGxpYnBuZyBzbWFsbGVyIHVzZWQgZml4ZWQgcG9pbnQgdGhyb3VnaG91dC4KKworI0ZpeGVkIHBvaW50OgorI29wdGlvbiBGSVhFRF9QT0lOVCBvbgorI29wdGlvbiBGTE9BVElOR19BUklUSE1FVElDIG9mZgorCisjRmxvYXRpbmcgcG9pbnQ6CitvcHRpb24gRkxPQVRJTkdfUE9JTlQgb24KK29wdGlvbiBGTE9BVElOR19BUklUSE1FVElDIG9uCisKKyMgQmFzaWMgZXJyb3IgaGFuZGxpbmcsIElPIGFuZCB1c2VyIG1lbW9yeSBzdXBwb3J0LiAgVGhlIGxhdHRlciBhbGxvd3MgdGhlCisjIGFwcGxpY2F0aW9uIHByb2dyYW0gdG8gcHJvdmlkZSBpdHMgb3duIGltcGxlbWVudGF0aW9ucyBvZiAnbWFsbG9jJyBhbmQgJ2ZyZWUnLgorb3B0aW9uIFNFVEpNUCBvbgorb3B0aW9uIFNURElPIG9uCitvcHRpb24gVVNFUl9NRU0gb24KKworIyBFdmVyeXRoaW5nIGVsc2UgaXMgb3B0aW9uYWwuICBVbmxpa2UgdGhlIHJlYWQgY29kZSBpbiBsaWJwbmcgdGhlIHdyaXRlIGNvZGUKKyMgZG9lcyBub3QgbmVlZCB0byBkZWFsIHdpdGggYXJiaXRyYXJ5IGZvcm1hdHMsIHNvIG9ubHkgYWRkIHN1cHBvcnQgZm9yIHRoaW5ncworIyB5b3UgcmVhbGx5IGRvIHdyaXRlISAgRm9yIGV4YW1wbGUgeW91IG1pZ2h0IG9ubHkgd3JpdGUgc1JHQiBpbWFnZXMsIHNvbWV0aW1lcworIyB3aXRoIHRyYW5zcGFyZW5jeSBhbmQgbmV2ZXIgd3JpdGUgMTYgYml0IGltYWdlcywgc286CitvcHRpb24gV1JJVEVfc1JHQiBvbgorb3B0aW9uIFdSSVRFX3RSTlMgb24KKyNvcHRpb24gV1JJVEVfMTZCSVQgb2ZmICh0aGlzIGlzIHRoZSBkZWZhdWx0IHdpdGggJ2V2ZXJ5dGhpbmcgPSBvZmYnKQpkaWZmIC0tZ2l0IGEvbGlicG5nL2NvbnRyaWIvZXhhbXBsZXMvUkVBRE1FLnR4dCBiL2xpYnBuZy9jb250cmliL2V4YW1wbGVzL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUyNWM5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL2V4YW1wbGVzL1JFQURNRS50eHQKQEAgLTAsMCArMSwyNCBAQAorCitUaGlzIGRpcmVjdG9yeSAoY29udHJpYi9leGFtcGxlcykgY29udGFpbnMgZXhhbXBsZXMgb2YgbGlicG5nIHVzYWdlLgorCitOTyBDT1BZUklHSFQgUklHSFRTIEFSRSBDTEFJTUVEIFRPIEFOWSBPRiBUSEUgRklMRVMgSU4gVEhJUyBESVJFQ1RPUlkuCisKK1RvIHRoZSBleHRlbnQgcG9zc2libGUgdW5kZXIgbGF3LCB0aGUgYXV0aG9ycyBoYXZlIHdhaXZlZCBhbGwgY29weXJpZ2h0IGFuZAorcmVsYXRlZCBvciBuZWlnaGJvcmluZyByaWdodHMgdG8gdGhpcyB3b3JrLiAgVGhpcyB3b3JrIGlzIHB1Ymxpc2hlZCBmcm9tOgorVW5pdGVkIFN0YXRlcy4KKworVGhlIGZpbGVzIG1heSBiZSB1c2VkIGZyZWVseSBpbiBhbnkgd2F5LiAgVGhlIGludGVudGlvbiBpcyB0aGF0IGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgZmlsZXMgYmUgdXNlZCBpbiBvdGhlciBsaWJwbmctdXNpbmcgcHJvZ3JhbXMgd2l0aG91dCBhbnkgbmVlZCBmb3IKK3RoZSBhdXRob3JzIG9mIHRoZSB1c2luZyBjb2RlIHRvIHNlZWsgY29weXJpZ2h0IG9yIGxpY2Vuc2UgZnJvbSB0aGUgb3JpZ2luYWwKK2F1dGhvcnMuCisKK1RoZSBzb3VyY2UgY29kZSBhbmQgY29tbWVudHMgaW4gdGhpcyBkaXJlY3RvcnkgYXJlIHRoZSBvcmlnaW5hbCB3b3JrIG9mIHRoZQorcGVvcGxlIG5hbWVkIGJlbG93LiAgTm8gb3RoZXIgcGVyc29uIG9yIG9yZ2FuaXphdGlvbiBoYXMgbWFkZSBjb250cmlidXRpb25zIHRvCit0aGUgd29yayBpbiB0aGlzIGRpcmVjdG9yeS4KKworT1JJR0lOQUwgQVVUSE9SUworICAgIFRoZSBmb2xsb3dpbmcgcGVvcGxlIGhhdmUgY29udHJpYnV0ZWQgdG8gdGhlIGNvZGUgaW4gdGhpcyBkaXJlY3RvcnkuICBOb25lCisgICAgb2YgdGhlIHBlb3BsZSBiZWxvdyBjbGFpbSBhbnkgcmlnaHRzIHdpdGggcmVnYXJkIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzCisgICAgZGlyZWN0b3J5LgorCisgICAgSm9obiBCb3dsZXIgPGpib3dsZXJAYWNtLm9yZz4KZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL2V4YW1wbGVzL2ljY2Zyb21wbmcuYyBiL2xpYnBuZy9jb250cmliL2V4YW1wbGVzL2ljY2Zyb21wbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDMwMzdlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvZXhhbXBsZXMvaWNjZnJvbXBuZy5jCkBAIC0wLDAgKzEsMTg1IEBACisvKi0gaWNjZnJvbXBuZworICoKKyAqIENPUFlSSUdIVDogV3JpdHRlbiBieSBKb2huIEN1bm5pbmdoYW0gQm93bGVyLCAyMDExLgorICogVG8gdGhlIGV4dGVudCBwb3NzaWJsZSB1bmRlciBsYXcsIHRoZSBhdXRob3IgaGFzIHdhaXZlZCBhbGwgY29weXJpZ2h0IGFuZAorICogcmVsYXRlZCBvciBuZWlnaGJvcmluZyByaWdodHMgdG8gdGhpcyB3b3JrLiAgVGhpcyB3b3JrIGlzIHB1Ymxpc2hlZCBmcm9tOgorICogVW5pdGVkIFN0YXRlcy4KKyAqCisgKiBFeHRyYWN0IGFueSBpY2MgcHJvZmlsZXMgZm91bmQgaW4gdGhlIGdpdmVuIFBORyBmaWxlcy4gIFRoaXMgaXMgYSBzaW1wbGUKKyAqIGV4YW1wbGUgb2YgYSBwcm9ncmFtIHRoYXQgZXh0cmFjdHMgaW5mb3JtYXRpb24gZnJvbSB0aGUgaGVhZGVyIG9mIGEgUE5HIGZpbGUKKyAqIHdpdGhvdXQgcHJvY2Vzc2luZyB0aGUgaW1hZ2UuICBOb3RpY2UgdGhhdCBzb21lIGhlYWRlciBpbmZvcm1hdGlvbiBtYXkgb2NjdXIKKyAqIGFmdGVyIHRoZSBpbWFnZSBkYXRhLiBUZXh0dWFsIGRhdGEgYW5kIGNvbW1lbnRzIGFyZSBhbiBleGFtcGxlOyB0aGUgYXBwcm9hY2gKKyAqIGluIHRoaXMgZmlsZSB3b24ndCB3b3JrIHJlbGlhYmx5IGZvciBzdWNoIGRhdGEgYmVjYXVzZSBpdCBvbmx5IGxvb2tzIGZvciB0aGUKKyAqIGluZm9ybWF0aW9uIGluIHRoZSBzZWN0aW9uIG9mIHRoZSBmaWxlIHRoYXQgcHJlY2VlZHMgdGhlIGltYWdlIGRhdGEuCisgKgorICogQ29tcGlsZSBhbmQgbGluayBhZ2FpbnN0IGxpYnBuZyBhbmQgemxpYiwgcGx1cyBhbnl0aGluZyBlbHNlIHJlcXVpcmVkIG9uIHRoZQorICogc3lzdGVtIHlvdSB1c2UuCisgKgorICogVG8gdXNlIHN1cHBseSBhIGxpc3Qgb2YgUE5HIGZpbGVzIGNvbnRhaW5pbmcgaUNDUCBjaHVua3MsIHRoZSBjaHVua3Mgd2lsbCBiZQorICogZXh0cmFjdGVkIHRvIGEgc2ltaWxhcmx5IG5hbWVkIGZpbGUgd2l0aCB0aGUgZXh0ZW5zaW9uIHJlcGxhY2VkIGJ5ICdpY2MnLAorICogd2hpY2ggd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRob3V0IHdhcm5pbmcuCisgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8cG5nLmg+CisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfU1RESU9fU1VQUE9SVEVEKSAmJiBcCisgICAgZGVmaW5lZCAoUE5HX2lDQ1BfU1VQUE9SVEVEKQorCisKK3N0YXRpYyBpbnQgdmVyYm9zZSA9IDE7CitzdGF0aWMgcG5nX2J5dGUgbm9fcHJvZmlsZVtdID0gIm5vIHByb2ZpbGUiOworCitzdGF0aWMgcG5nX2J5dGVwCitleHRyYWN0KEZJTEUgKmZwLCBwbmdfdWludF8zMiAqcHJvZmxlbikKK3sKKyAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NUUklORywwLDAsMCk7CisgICBwbmdfaW5mb3AgaW5mb19wdHIgPSBOVUxMOworICAgcG5nX2J5dGVwIHJlc3VsdCA9IE5VTEw7CisKKyAgIC8qIEluaXRpYWxpemUgZm9yIGVycm9yIG9yIG5vIHByb2ZpbGU6ICovCisgICAqcHJvZmxlbiA9IDA7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgImljY2Zyb21wbmc6IHZlcnNpb24gbGlicmFyeSBtaXNtYXRjaD9cbiIpOworICAgICAgcmV0dXJuIDA7CisgICB9CisKKyAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpCisgICB7CisgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLCBOVUxMKTsKKyAgICAgIHJldHVybiAwOworICAgfQorCisgICBwbmdfaW5pdF9pbyhwbmdfcHRyLCBmcCk7CisKKyAgIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKKyAgIGlmIChpbmZvX3B0ciA9PSBOVUxMKQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJPT00gYWxsb2NhdGluZyBpbmZvIHN0cnVjdHVyZSIpOworCisgICBwbmdfcmVhZF9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKKworICAgeworICAgICAgcG5nX2NoYXJwIG5hbWU7CisgICAgICBpbnQgY29tcHJlc3Npb25fdHlwZTsKKyAgICAgIHBuZ19ieXRlcCBwcm9maWxlOworCisgICAgICBpZiAocG5nX2dldF9pQ0NQKHBuZ19wdHIsIGluZm9fcHRyLCAmbmFtZSwgJmNvbXByZXNzaW9uX3R5cGUsICZwcm9maWxlLAorICAgICAgICAgcHJvZmxlbikgJiBQTkdfSU5GT19pQ0NQKQorICAgICAgeworICAgICAgICAgcmVzdWx0ID0gbWFsbG9jKCpwcm9mbGVuKTsKKyAgICAgICAgIGlmIChyZXN1bHQgIT0gTlVMTCkKKyAgICAgICAgICAgIG1lbWNweShyZXN1bHQsIHByb2ZpbGUsICpwcm9mbGVuKTsKKworICAgICAgICAgZWxzZQorICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJPT00gYWxsb2NhdGluZyBwcm9maWxlIGJ1ZmZlciIpOworICAgICAgfQorCisgICAgICBlbHNlCisJcmVzdWx0ID0gbm9fcHJvZmlsZTsKKyAgIH0KKworICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7CisgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50CitleHRyYWN0X29uZV9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgaW50IHJlc3VsdCA9IDA7CisgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVuYW1lLCAicmIiKTsKKworICAgaWYgKGZwICE9IE5VTEwpCisgICB7CisgICAgICBwbmdfdWludF8zMiBwcm9mbGVuID0gMDsKKyAgICAgIHBuZ19ieXRlcCBwcm9maWxlID0gZXh0cmFjdChmcCwgJnByb2ZsZW4pOworCisgICAgICBpZiAocHJvZmlsZSAhPSBOVUxMICYmIHByb2ZpbGUgIT0gbm9fcHJvZmlsZSkKKyAgICAgIHsKKyAgICAgICAgIHNpemVfdCBsZW47CisgICAgICAgICBjaGFyICpvdXRwdXQ7CisKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVwID0gc3RycmNocihmaWxlbmFtZSwgJy4nKTsKKworICAgICAgICAgICAgaWYgKGVwICE9IE5VTEwpCisgICAgICAgICAgICAgICBsZW4gPSBlcC1maWxlbmFtZTsKKworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgbGVuID0gc3RybGVuKGZpbGVuYW1lKTsKKyAgICAgICAgIH0KKworICAgICAgICAgb3V0cHV0ID0gbWFsbG9jKGxlbiArIDUpOworICAgICAgICAgaWYgKG91dHB1dCAhPSBOVUxMKQorICAgICAgICAgeworICAgICAgICAgICAgRklMRSAqb2Y7CisKKyAgICAgICAgICAgIG1lbWNweShvdXRwdXQsIGZpbGVuYW1lLCBsZW4pOworICAgICAgICAgICAgc3RyY3B5KG91dHB1dCtsZW4sICIuaWNjIik7CisKKyAgICAgICAgICAgIG9mID0gZm9wZW4ob3V0cHV0LCAid2IiKTsKKyAgICAgICAgICAgIGlmIChvZiAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKGZ3cml0ZShwcm9maWxlLCBwcm9mbGVuLCAxLCBvZikgPT0gMSAmJgorICAgICAgICAgICAgICAgICAgZmZsdXNoKG9mKSA9PSAwICYmCisgICAgICAgICAgICAgICAgICBmY2xvc2Uob2YpID09IDApCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMgLT4gJXNcbiIsIGZpbGVuYW1lLCBvdXRwdXQpOworICAgICAgICAgICAgICAgICAgLyogU3VjY2VzcyByZXR1cm4gKi8KKyAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDE7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGVycm9yIHdyaXRpbmcgcHJvZmlsZVxuIiwgb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgIGlmIChyZW1vdmUob3V0cHV0KSkKKyAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNvdWxkIG5vdCByZW1vdmUgZmlsZVxuIiwgb3V0cHV0KTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogZmFpbGVkIHRvIG9wZW4gb3V0cHV0IGZpbGVcbiIsIG91dHB1dCk7CisKKyAgICAgICAgICAgIGZyZWUob3V0cHV0KTsKKyAgICAgICAgIH0KKworICAgICAgICAgZWxzZQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogT09NIGFsbG9jYXRpbmcgc3RyaW5nIVxuIiwgZmlsZW5hbWUpOworCisgICAgICAgICBmcmVlKHByb2ZpbGUpOworICAgICAgfQorCisgICAgICBlbHNlIGlmICh2ZXJib3NlICYmIHByb2ZpbGUgPT0gbm9fcHJvZmlsZSkKKwlwcmludGYoIiVzIGhhcyBubyBwcm9maWxlXG4iLCBmaWxlbmFtZSk7CisgICB9CisKKyAgIGVsc2UKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNvdWxkIG5vdCBvcGVuIGZpbGVcbiIsIGZpbGVuYW1lKTsKKworICAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgIGludCBpOworICAgaW50IGV4dHJhY3RlZCA9IDA7CisKKyAgIGZvciAoaT0xOyBpPGFyZ2M7ICsraSkKKyAgIHsKKyAgICAgIGlmIChzdHJjbXAoYXJndltpXSwgIi1xIikgPT0gMCkKKyAgICAgICAgIHZlcmJvc2UgPSAwOworCisgICAgICBlbHNlIGlmIChleHRyYWN0X29uZV9maWxlKGFyZ3ZbaV0pKQorICAgICAgICAgZXh0cmFjdGVkID0gMTsKKyAgIH0KKworICAgLyogRXhpdCBjb2RlIGlzIHRydWUgaWYgYW55IGV4dHJhY3Qgc3VjY2VlZHMgKi8KKyAgIHJldHVybiBleHRyYWN0ZWQgPT0gMDsKK30KKyNlbmRpZiAvKiBSRUFEICYmIFNURElPICYmIGlDQ1AgKi8KZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL2V4YW1wbGVzL3BuZ3BpeGVsLmMgYi9saWJwbmcvY29udHJpYi9leGFtcGxlcy9wbmdwaXhlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NjIzNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9leGFtcGxlcy9wbmdwaXhlbC5jCkBAIC0wLDAgKzEsMzcxIEBACisvKi0gcG5ncGl4ZWwKKyAqCisgKiBDT1BZUklHSFQ6IFdyaXR0ZW4gYnkgSm9obiBDdW5uaW5naGFtIEJvd2xlciwgMjAxMS4KKyAqIFRvIHRoZSBleHRlbnQgcG9zc2libGUgdW5kZXIgbGF3LCB0aGUgYXV0aG9yIGhhcyB3YWl2ZWQgYWxsIGNvcHlyaWdodCBhbmQKKyAqIHJlbGF0ZWQgb3IgbmVpZ2hib3JpbmcgcmlnaHRzIHRvIHRoaXMgd29yay4gIFRoaXMgd29yayBpcyBwdWJsaXNoZWQgZnJvbToKKyAqIFVuaXRlZCBTdGF0ZXMuCisgKgorICogUmVhZCBhIHNpbmdsZSBwaXhlbCB2YWx1ZSBmcm9tIGEgUE5HIGZpbGUuCisgKgorICogVGhpcyBjb2RlIGlsbHVzdHJhdGVzIGJhc2ljICdieS1yb3cnIHJlYWRpbmcgb2YgYSBQTkcgZmlsZSB1c2luZyBsaWJwbmcuCisgKiBSb3dzIGFyZSByZWFkIHVudGlsIGEgcGFydGljdWxhciBwaXhlbCBpcyBmb3VuZDsgdGhlIHZhbHVlIG9mIHRoaXMgcGl4ZWwgaXMKKyAqIHRoZW4gcHJpbnRlZCBvbiBzdGRvdXQuCisgKgorICogVGhlIGNvZGUgaWxsdXN0cmF0ZXMgaG93IHRvIGRvIHRoaXMgb24gaW50ZXJsYWNlZCBhcyB3ZWxsIGFzIG5vbi1pbnRlcmxhY2VkCisgKiBpbWFnZXMuICBOb3JtYWxseSB5b3Ugd291bGQgY2FsbCBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZygpIHRvIGhhdmUgbGlicG5nCisgKiBkZWFsIHdpdGggdGhlIGludGVybGFjZSBmb3IgeW91LCBidXQgdGhhdCBvYmxpZ2VzIHlvdSB0byBidWZmZXIgaGFsZiBvZiB0aGUKKyAqIGltYWdlIHRvIGFzc2VtYmxlIHRoZSBpbnRlcmxhY2VkIHJvd3MuICBJbiB0aGlzIGNvZGUKKyAqIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKCkgaXMgbm90IGNhbGxlZCBhbmQsIGluc3RlYWQsIHRoZSBjb2RlIGhhbmRsZXMgdGhlCisgKiBpbnRlcmxhY2UgcGFzc2VzIGRpcmVjdGx5IGxvb2tpbmcgZm9yIHRoZSByZXF1aXJlZCBwaXhlbC4KKyAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+IC8qIHJlcXVpcmVkIGZvciBlcnJvciBoYW5kbGluZyAqLworCisvKiBOb3JtYWxseSB1c2UgPHBuZy5oPiBoZXJlIHRvIGdldCB0aGUgaW5zdGFsbGVkIGxpYnBuZywgYnV0IHRoaXMgaXMgZG9uZSB0bworICogZW5zdXJlIHRoZSBjb2RlIHBpY2tzIHVwIHRoZSBsb2NhbCBsaWJwbmcgaW1wbGVtZW50YXRpb246CisgKi8KKyNpbmNsdWRlICIuLi8uLi9wbmcuaCIKKworI2lmIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVEKQorCisvKiBSZXR1cm4gY29tcG9uZW50ICdjJyBvZiBwaXhlbCAneCcgZnJvbSB0aGUgZ2l2ZW4gcm93LiAqLworc3RhdGljIHVuc2lnbmVkIGludAorY29tcG9uZW50KHBuZ19jb25zdF9ieXRlcCByb3csIHBuZ191aW50XzMyIHgsIHVuc2lnbmVkIGludCBjLAorICAgdW5zaWduZWQgaW50IGJpdF9kZXB0aCwgdW5zaWduZWQgaW50IGNoYW5uZWxzKQoreworICAgLyogUE5HIGltYWdlcyBjYW4gYmUgdXAgdG8gMl4zMSBwaXhlbHMgd2lkZSwgYnV0IHRoaXMgbWVhbnMgdGhleSBjYW4gYmUgdXAgdG8KKyAgICAqIDJeMzcgYml0cyB3aWRlIChmb3IgYSA2NC1iaXQgcGl4ZWwgLSB0aGUgbGFyZ2VzdCBwb3NzaWJsZSkgYW5kIGhlbmNlIDJeMzQKKyAgICAqIGJ5dGVzIHdpZGUuICBTaW5jZSB0aGUgcm93IGZpdHRlZCBpbnRvIG1lbW9yeSwgaG93ZXZlciwgdGhlIGZvbGxvd2luZyBtdXN0CisgICAgKiB3b3JrOgorICAgICovCisgICBwbmdfdWludF8zMiBiaXRfb2Zmc2V0X2hpID0gYml0X2RlcHRoICogKCh4ID4+IDYpICogY2hhbm5lbHMpOworICAgcG5nX3VpbnRfMzIgYml0X29mZnNldF9sbyA9IGJpdF9kZXB0aCAqICgoeCAmIDB4M2YpICogY2hhbm5lbHMgKyBjKTsKKworICAgcm93ID0gKHBuZ19jb25zdF9ieXRlcCkoKChQTkdfQ09OU1QgcG5nX2J5dGUgKCopWzhdKXJvdykgKyBiaXRfb2Zmc2V0X2hpKTsKKyAgIHJvdyArPSBiaXRfb2Zmc2V0X2xvID4+IDM7CisgICBiaXRfb2Zmc2V0X2xvICY9IDB4MDc7CisKKyAgIC8qIFBORyBwaXhlbHMgYXJlIHBhY2tlZCBpbnRvIGJ5dGVzIHRvIHB1dCB0aGUgZmlyc3QgcGl4ZWwgaW4gdGhlIGhpZ2hlc3QKKyAgICAqIGJpdHMgb2YgdGhlIGJ5dGUgYW5kIGludG8gdHdvIGJ5dGVzIGZvciAxNi1iaXQgdmFsdWVzIHdpdGggdGhlIGhpZ2ggOCBiaXRzCisgICAgKiBmaXJzdCwgc286CisgICAgKi8KKyAgIHN3aXRjaCAoYml0X2RlcHRoKQorICAgeworICAgICAgY2FzZSAxOiByZXR1cm4gKHJvd1swXSA+PiAoNy1iaXRfb2Zmc2V0X2xvKSkgJiAweDAxOworICAgICAgY2FzZSAyOiByZXR1cm4gKHJvd1swXSA+PiAoNi1iaXRfb2Zmc2V0X2xvKSkgJiAweDAzOworICAgICAgY2FzZSA0OiByZXR1cm4gKHJvd1swXSA+PiAoNC1iaXRfb2Zmc2V0X2xvKSkgJiAweDBmOworICAgICAgY2FzZSA4OiByZXR1cm4gcm93WzBdOworICAgICAgY2FzZSAxNjogcmV0dXJuIChyb3dbMF0gPDwgOCkgKyByb3dbMV07CisgICAgICBkZWZhdWx0OgorICAgICAgICAgLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuOyBpdCBpbmRpY2F0ZXMgYSBidWcgaW4gdGhpcyBwcm9ncmFtIG9yIGluCisgICAgICAgICAgKiBsaWJwbmcgaXRzZWxmOgorICAgICAgICAgICovCisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInBuZ3BpeGVsOiBpbnZhbGlkIGJpdCBkZXB0aCAldVxuIiwgYml0X2RlcHRoKTsKKyAgICAgICAgIGV4aXQoMSk7CisgICB9Cit9CisKKy8qIFByaW50IGEgcGl4ZWwgZnJvbSBhIHJvdyByZXR1cm5lZCBieSBsaWJwbmc7IGRldGVybWluZSB0aGUgcm93IGZvcm1hdCwgZmluZAorICogdGhlIHBpeGVsLCBhbmQgcHJpbnQgdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uIHRvIHN0ZG91dC4KKyAqLworc3RhdGljIHZvaWQKK3ByaW50X3BpeGVsKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX2NvbnN0X2J5dGVwIHJvdywKKyAgIHBuZ191aW50XzMyIHgpCit7CisgICBQTkdfQ09OU1QgdW5zaWduZWQgaW50IGJpdF9kZXB0aCA9IHBuZ19nZXRfYml0X2RlcHRoKHBuZ19wdHIsIGluZm9fcHRyKTsKKworICAgc3dpdGNoIChwbmdfZ2V0X2NvbG9yX3R5cGUocG5nX3B0ciwgaW5mb19wdHIpKQorICAgeworICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkFZOgorICAgICAgICAgcHJpbnRmKCJHUkFZICV1XG4iLCBjb21wb25lbnQocm93LCB4LCAwLCBiaXRfZGVwdGgsIDEpKTsKKyAgICAgICAgIHJldHVybjsKKworICAgICAgLyogVGhlIHBhbGV0dGUgY2FzZSBpcyBzbGlnaHRseSBtb3JlIGRpZmZpY3VsdCAtIHRoZSBwYWxldHRlIGFuZCwgaWYKKyAgICAgICAqIHByZXNlbnQsIHRoZSB0Uk5TICgndHJhbnNwYXJlbmN5JywgdGhvdWdoIHRoZSB2YWx1ZXMgYXJlIHJlYWxseQorICAgICAgICogb3BhY2l0eSkgZGF0YSBtdXN0IGJlIHJlYWQgdG8gZ2l2ZSB0aGUgZnVsbCBwaWN0dXJlOgorICAgICAgICovCisgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1BBTEVUVEU6CisgICAgICAgICB7CisgICAgICAgICAgICBQTkdfQ09OU1QgaW50IGluZGV4ID0gY29tcG9uZW50KHJvdywgeCwgMCwgYml0X2RlcHRoLCAxKTsKKyAgICAgICAgICAgIHBuZ19jb2xvcnAgcGFsZXR0ZSA9IE5VTEw7CisgICAgICAgICAgICBpbnQgbnVtX3BhbGV0dGUgPSAwOworCisgICAgICAgICAgICBpZiAoKHBuZ19nZXRfUExURShwbmdfcHRyLCBpbmZvX3B0ciwgJnBhbGV0dGUsICZudW1fcGFsZXR0ZSkgJgorICAgICAgICAgICAgICAgUE5HX0lORk9fUExURSkgJiYgbnVtX3BhbGV0dGUgPiAwICYmIHBhbGV0dGUgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19ieXRlcCB0cmFuc19hbHBoYSA9IE5VTEw7CisgICAgICAgICAgICAgICBpbnQgbnVtX3RyYW5zID0gMDsKKyAgICAgICAgICAgICAgIGlmICgocG5nX2dldF90Uk5TKHBuZ19wdHIsIGluZm9fcHRyLCAmdHJhbnNfYWxwaGEsICZudW1fdHJhbnMsCisgICAgICAgICAgICAgICAgICBOVUxMKSAmIFBOR19JTkZPX3RSTlMpICYmIG51bV90cmFucyA+IDAgJiYKKyAgICAgICAgICAgICAgICAgIHRyYW5zX2FscGhhICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICBwcmludGYoIklOREVYRUQgJXUgPSAlZCAlZCAlZCAlZFxuIiwgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICBwYWxldHRlW2luZGV4XS5yZWQsIHBhbGV0dGVbaW5kZXhdLmdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZVtpbmRleF0uYmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGluZGV4IDwgbnVtX3RyYW5zID8gdHJhbnNfYWxwaGFbaW5kZXhdIDogMjU1KTsKKworICAgICAgICAgICAgICAgZWxzZSAvKiBubyB0cmFuc3BhcmVuY3kgKi8KKyAgICAgICAgICAgICAgICAgIHByaW50ZigiSU5ERVhFRCAldSA9ICVkICVkICVkXG4iLCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGVbaW5kZXhdLnJlZCwgcGFsZXR0ZVtpbmRleF0uZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgICBwYWxldHRlW2luZGV4XS5ibHVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgcHJpbnRmKCJJTkRFWEVEICV1ID0gaW52YWxpZCBpbmRleFxuIiwgaW5kZXgpOworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuOworCisgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1JHQjoKKyAgICAgICAgIHByaW50ZigiUkdCICV1ICV1ICV1XG4iLCBjb21wb25lbnQocm93LCB4LCAwLCBiaXRfZGVwdGgsIDMpLAorICAgICAgICAgICAgY29tcG9uZW50KHJvdywgeCwgMSwgYml0X2RlcHRoLCAzKSwKKyAgICAgICAgICAgIGNvbXBvbmVudChyb3csIHgsIDIsIGJpdF9kZXB0aCwgMykpOworICAgICAgICAgcmV0dXJuOworCisgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEE6CisgICAgICAgICBwcmludGYoIkdSQVkrQUxQSEEgJXUgJXVcbiIsIGNvbXBvbmVudChyb3csIHgsIDAsIGJpdF9kZXB0aCwgMiksCisgICAgICAgICAgICBjb21wb25lbnQocm93LCB4LCAxLCBiaXRfZGVwdGgsIDIpKTsKKyAgICAgICAgIHJldHVybjsKKworICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEE6CisgICAgICAgICBwcmludGYoIlJHQkEgJXUgJXUgJXUgJXVcbiIsIGNvbXBvbmVudChyb3csIHgsIDAsIGJpdF9kZXB0aCwgNCksCisgICAgICAgICAgICBjb21wb25lbnQocm93LCB4LCAxLCBiaXRfZGVwdGgsIDQpLAorICAgICAgICAgICAgY29tcG9uZW50KHJvdywgeCwgMiwgYml0X2RlcHRoLCA0KSwKKyAgICAgICAgICAgIGNvbXBvbmVudChyb3csIHgsIDMsIGJpdF9kZXB0aCwgNCkpOworICAgICAgICAgcmV0dXJuOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJwbmdwaXhlbDogaW52YWxpZCBjb2xvciB0eXBlIik7CisgICB9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKyAgIC8qIFRoaXMgcHJvZ3JhbSB1c2VzIHRoZSBkZWZhdWx0LCA8c2V0am1wLmg+IGJhc2VkLCBsaWJwbmcgZXJyb3IgaGFuZGxpbmcKKyAgICAqIG1lY2hhbmlzbSwgdGhlcmVmb3JlIGFueSBsb2NhbCB2YXJpYWJsZSB0aGF0IGV4aXN0cyBiZWZvcmUgdGhlIGNhbGwgdG8KKyAgICAqIHNldGptcCBhbmQgaXMgY2hhbmdlZCBhZnRlciB0aGUgY2FsbCB0byBzZXRqbXAgcmV0dXJucyBzdWNjZXNzZnVsbHkgbXVzdAorICAgICogYmUgZGVjbGFyZWQgd2l0aCAndm9sYXRpbGUnIHRvIGVuc3VyZSB0aGF0IHRoZWlyIHZhbHVlcyBkb24ndCBnZXQKKyAgICAqIGRlc3Ryb3llZCBieSBsb25nam1wOgorICAgICovCisgICB2b2xhdGlsZSBpbnQgcmVzdWx0ID0gMS8qZmFpbCovOworCisgICBpZiAoYXJnYyA9PSA0KQorICAgeworICAgICAgbG9uZyB4ID0gYXRvbChhcmd2WzFdKTsKKyAgICAgIGxvbmcgeSA9IGF0b2woYXJndlsyXSk7CisgICAgICBGSUxFICpmID0gZm9wZW4oYXJndlszXSwgInJiIik7CisgICAgICB2b2xhdGlsZSBwbmdfYnl0ZXAgcm93ID0gTlVMTDsKKworICAgICAgaWYgKGYgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIC8qIGxpYnBuZyByZXF1aXJlcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBoYW5kbGluZyBlcnJvcnM7IHRoaXMKKyAgICAgICAgICAqIGNhbGxiYWNrIG11c3Qgbm90IHJldHVybi4gIFRoZSBkZWZhdWx0IGNhbGxiYWNrIGZ1bmN0aW9uIHVzZXMgYQorICAgICAgICAgICogc3RvcmVkIDxzZXRqbXAuaD4gc3R5bGUgam1wX2J1ZiB3aGljaCBpcyBoZWxkIGluIGEgcG5nX3N0cnVjdCBhbmQKKyAgICAgICAgICAqIHdyaXRlcyBlcnJvciBtZXNzYWdlcyB0byBzdGRlcnIuICBDcmVhdGluZyB0aGUgcG5nX3N0cnVjdCBpcyBhCisgICAgICAgICAgKiBsaXR0bGUgdHJpY2t5OyBqdXN0IGNvcHkgdGhlIGZvbGxvd2luZyBjb2RlLgorICAgICAgICAgICovCisgICAgICAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsCisgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKworICAgICAgICAgaWYgKHBuZ19wdHIgIT0gTlVMTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19pbmZvcCBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7CisKKyAgICAgICAgICAgIGlmIChpbmZvX3B0ciAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLyogRGVjbGFyZSBzdGFjayB2YXJpYWJsZXMgdG8gaG9sZCBwb2ludGVycyB0byBsb2NhbGx5IGFsbG9jYXRlZAorICAgICAgICAgICAgICAgICogZGF0YS4KKyAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBlcnJvciBjb250cm9sIGJ1ZmZlcjogKi8KKyAgICAgICAgICAgICAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkgPT0gMCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBuZ191aW50XzMyIHdpZHRoLCBoZWlnaHQ7CisgICAgICAgICAgICAgICAgICBpbnQgYml0X2RlcHRoLCBjb2xvcl90eXBlLCBpbnRlcmxhY2VfbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb25fbWV0aG9kLCBmaWx0ZXJfbWV0aG9kOworICAgICAgICAgICAgICAgICAgcG5nX2J5dGVwIHJvd190bXA7CisKKyAgICAgICAgICAgICAgICAgIC8qIE5vdyBhc3NvY2lhdGUgdGhlIHJlY2VudGx5IG9wZW5lZCAoRklMRSopIHdpdGggdGhlIGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAqIGxpYnBuZyBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMuICBTb21ldGltZXMgbGlicG5nIGlzCisgICAgICAgICAgICAgICAgICAgKiBjb21waWxlZCB3aXRob3V0IHN0ZGlvIHN1cHBvcnQgKGl0IGNhbiBiZSBkaWZmaWN1bHQgdG8gZG8KKyAgICAgICAgICAgICAgICAgICAqIGluIHNvbWUgZW52aXJvbm1lbnRzKTsgaW4gdGhhdCBjYXNlIHlvdSB3aWxsIGhhdmUgdG8gd3JpdGUKKyAgICAgICAgICAgICAgICAgICAqIHlvdXIgb3duIHJlYWQgY2FsbGJhY2sgdG8gcmVhZCBkYXRhIGZyb20gdGhlIChGSUxFKikuCisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIHBuZ19pbml0X2lvKHBuZ19wdHIsIGYpOworCisgICAgICAgICAgICAgICAgICAvKiBBbmQgcmVhZCB0aGUgZmlyc3QgcGFydCBvZiB0aGUgUE5HIGZpbGUgLSB0aGUgaGVhZGVyIGFuZAorICAgICAgICAgICAgICAgICAgICogYWxsIHRoZSBpbmZvcm1hdGlvbiB1cCB0byB0aGUgZmlyc3QgcGl4ZWwuCisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIHBuZ19yZWFkX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOworCisgICAgICAgICAgICAgICAgICAvKiBUaGlzIGZpbGxzIGluIGVub3VnaCBpbmZvcm1hdGlvbiB0byB0ZWxsIHVzIHRoZSB3aWR0aCBvZgorICAgICAgICAgICAgICAgICAgICogZWFjaCByb3cgaW4gYnl0ZXMsIGFsbG9jYXRlIHRoZSBhcHByb3ByaWF0ZSBhbW91bnQgb2YKKyAgICAgICAgICAgICAgICAgICAqIHNwYWNlLiAgSW4gdGhpcyBjYXNlIHBuZ19tYWxsb2MgaXMgdXNlZCAtIGl0IHdpbGwgbm90CisgICAgICAgICAgICAgICAgICAgKiByZXR1cm4gaWYgbWVtb3J5IGlzbid0IGF2YWlsYWJsZS4KKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgcm93ID0gcG5nX21hbGxvYyhwbmdfcHRyLCBwbmdfZ2V0X3Jvd2J5dGVzKHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0cikpOworCisgICAgICAgICAgICAgICAgICAvKiBUbyBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YgdXNpbmcgYSB2b2xhdGlsZSBhdXRvIGNvcHkgcm93X3RtcAorICAgICAgICAgICAgICAgICAgICogdG8gYSBsb2NhbCBoZXJlIC0ganVzdCB1c2Ugcm93IGZvciB0aGUgcG5nX2ZyZWUgYmVsb3cuCisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIHJvd190bXAgPSByb3c7CisKKyAgICAgICAgICAgICAgICAgIC8qIEFsbCB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZCBpcyBpbiB0aGUgaGVhZGVyIGlzIHJldHVybmVkIGJ5CisgICAgICAgICAgICAgICAgICAgKiBwbmdfZ2V0X0lIRFIsIGlmIHRoaXMgZmFpbHMgd2UgY2FuIG5vdyB1c2UgJ3BuZ19lcnJvcicgdG8KKyAgICAgICAgICAgICAgICAgICAqIHNpZ25hbCB0aGUgZXJyb3IgYW5kIHJldHVybiBjb250cm9sIHRvIHRoZSBzZXRqbXAgYWJvdmUuCisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChwbmdfZ2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsICZ3aWR0aCwgJmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICZiaXRfZGVwdGgsICZjb2xvcl90eXBlLCAmaW50ZXJsYWNlX21ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc2lvbl9tZXRob2QsICZmaWx0ZXJfbWV0aG9kKSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIGludCBwYXNzZXMsIHBhc3M7CisKKyAgICAgICAgICAgICAgICAgICAgIC8qIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nIHJldHVybnMgdGhlIG51bWJlciBvZgorICAgICAgICAgICAgICAgICAgICAgICogcGFzc2VzIHJlcXVpcmVkIGFzIHdlbGwgYXMgdHVybmluZyBvbiBsaWJwbmcncworICAgICAgICAgICAgICAgICAgICAgICogaGFuZGxpbmcsIGJ1dCBzaW5jZSB3ZSBkbyBpdCBvdXJzZWx2ZXMgdGhpcyBpcworICAgICAgICAgICAgICAgICAgICAgICogbmVjZXNzYXJ5OgorICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGludGVybGFjZV9tZXRob2QpCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBOR19JTlRFUkxBQ0VfTk9ORToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlcyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQTkdfSU5URVJMQUNFX0FEQU03OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VzID0gUE5HX0lOVEVSTEFDRV9BREFNN19QQVNTRVM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAicG5ncGl4ZWw6IHVua25vd24gaW50ZXJsYWNlIik7CisgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgIC8qIE5vdyByZWFkIHRoZSBwaXhlbHMsIHBhc3MtYnktcGFzcywgcm93LWJ5LXJvdzogKi8KKyAgICAgICAgICAgICAgICAgICAgIHBuZ19zdGFydF9yZWFkX2ltYWdlKHBuZ19wdHIpOworCisgICAgICAgICAgICAgICAgICAgICBmb3IgKHBhc3M9MDsgcGFzczxwYXNzZXM7ICsrcGFzcykKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzMyIHlzdGFydCwgeHN0YXJ0LCB5c3RlcCwgeHN0ZXA7CisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8zMiBweTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVybGFjZV9tZXRob2QgPT0gUE5HX0lOVEVSTEFDRV9BREFNNykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvbWV0aW1lcyB0aGUgd2hvbGUgcGFzcyBpcyBlbXB0eSBiZWNhdXNlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaW1hZ2UgaXMgdG9vIG5hcnJvdyBvciB0b28gc2hvcnQuICBsaWJwbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGV4cGVjdHMgdG8gYmUgY2FsbGVkIGZvciBlYWNoIHJvdyB0aGF0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwcmVzZW50IGluIHRoZSBwYXNzLCBzbyBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBza2lwIHRoZSBsb29wIGJlbG93IChvdmVyIHB5KSBpZiB0aGUgaW1hZ2UgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvbyBuYXJyb3cuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQTkdfUEFTU19DT0xTKHdpZHRoLCBwYXNzKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdGhlIHN0YXJ0aW5nIHBpeGVsIGFuZCB0aGUgb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBiZXR3ZWVuIGVhY2ggcGl4ZWwgaW4gdGhpcyBwYXNzOyB1c2UgdGhlIG1hY3JvcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaW4gcG5nLmg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzdGFydCA9IFBOR19QQVNTX1NUQVJUX0NPTChwYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHlzdGFydCA9IFBOR19QQVNTX1NUQVJUX1JPVyhwYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzdGVwID0gUE5HX1BBU1NfQ09MX09GRlNFVChwYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHlzdGVwID0gUE5HX1BBU1NfUk9XX09GRlNFVChwYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgeXN0YXJ0ID0geHN0YXJ0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHlzdGVwID0geHN0ZXAgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUbyBmaW5kIHRoZSBwaXhlbCwgbG9vcCBvdmVyICdweScgZm9yIGVhY2ggcGFzcworICAgICAgICAgICAgICAgICAgICAgICAgICogcmVhZGluZyBhIHJvdyBhbmQgdGhlbiBjaGVja2luZyB0byBzZWUgaWYgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGNvbnRhaW5zIHRoZSBwaXhlbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChweSA9IHlzdGFydDsgcHkgPCBoZWlnaHQ7IHB5ICs9IHlzdGVwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgcHgsIHBweDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG5nX3JlYWRfcm93IHRha2VzIHR3byBwb2ludGVycy4gIFdoZW4gbGlicG5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBoYW5kbGVzIHRoZSBpbnRlcmxhY2UgdGhlIGZpcnN0IGlzIGZpbGxlZCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcGl4ZWwtYnktcGl4ZWwsIGFuZCB0aGUgc2Vjb25kIHJlY2VpdmVzIHRoZSBzYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwaXhlbHMgYnV0IHRoZXkgYXJlIHJlcGxpY2F0ZWQgYWNyb3NzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdW53cml0dGVuIHBpeGVscyBzbyBmYXIgZm9yIGVhY2ggcGFzcy4gIFdoZW4gd2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGRvIHRoZSBpbnRlcmxhY2UsIGhvd2V2ZXIsIHRoZXkganVzdCBjb250YWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgcGl4ZWxzIGZyb20gdGhlIGludGVybGFjZSBwYXNzIC0gZ2l2aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBib3RoIGlzIHdhc3RlZnVsIGFuZCBwb2ludGxlc3MsIHNvIHdlIHBhc3MgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICogTlVMTCBwb2ludGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcmVhZF9yb3cocG5nX3B0ciwgcm93X3RtcCwgTlVMTCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdyBmaW5kIHRoZSBwaXhlbCBpZiBpdCBpcyBpbiB0aGlzIHJvdzsgdGhlcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFyZSwgb2YgY291cnNlLCBtdWNoIGJldHRlciB3YXlzIG9mIGRvaW5nIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoYW4gdXNpbmcgYSBmb3IgbG9vcDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHkgPT0gcHkpIGZvciAocHggPSB4c3RhcnQsIHBweCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweCA8IHdpZHRoOyBweCArPSB4c3RlcCwgKytwcHgpIGlmICh4ID09IHB4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogJ3BweCcgaXMgdGhlIGluZGV4IG9mIHRoZSBwaXhlbCBpbiB0aGUgcm93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBidWZmZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3BpeGVsKHBuZ19wdHIsIGluZm9fcHRyLCByb3dfdG1wLCBwcHgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3cgdGVybWluYXRlIHRoZSBsb29wcyBlYXJseSAtIHdlIGhhdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZvdW5kIGFuZCBoYW5kbGVkIHRoZSByZXF1aXJlZCBkYXRhLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHBhc3NfbG9vcF9lbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8qIHggbG9vcCAqLworICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiB5IGxvb3AgKi8KKyAgICAgICAgICAgICAgICAgICAgIH0gLyogcGFzcyBsb29wICovCisKKyAgICAgICAgICAgICAgICAgICAgIC8qIEZpbmFsbHkgZnJlZSB0aGUgdGVtcG9yYXJ5IGJ1ZmZlcjogKi8KKyAgICAgICAgICAgICAgICAgIHBhc3NfbG9vcF9lbmQ6CisgICAgICAgICAgICAgICAgICAgICByb3cgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcm93X3RtcCk7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAicG5ncGl4ZWw6IHBuZ19nZXRfSUhEUiBmYWlsZWQiKTsKKworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiBFbHNlIGxpYnBuZyBoYXMgcmFpc2VkIGFuIGVycm9yLiAgQW4gZXJyb3IgbWVzc2FnZSBoYXMKKyAgICAgICAgICAgICAgICAgICAqIGFscmVhZHkgYmVlbiBvdXRwdXQsIHNvIGl0IGlzIG9ubHkgbmVjZXNzYXJ5IHRvIGNsZWFuIHVwCisgICAgICAgICAgICAgICAgICAgKiBsb2NhbGx5IGFsbG9jYXRlZCBkYXRhOgorICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBpZiAocm93ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBwbmdfZnJlZSBuZXZlciBlcnJvcnMgb3V0CisgICAgICAgICAgICAgICAgICAgICAgKiAoaXQganVzdCBjcmFzaGVzIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nKSwgYnV0IHRoZSBzYWZlCisgICAgICAgICAgICAgICAgICAgICAgKiB3YXkgb2YgdXNpbmcgaXQgaXMgc3RpbGwgdG8gY2xlYXIgJ3JvdycgYmVmb3JlIGNhbGxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAqIHBuZ19mcmVlOgorICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICBwbmdfYnl0ZXAgcm93X3RtcCA9IHJvdzsKKyAgICAgICAgICAgICAgICAgICAgIHJvdyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCByb3dfdG1wKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgcG5nX2Rlc3Ryb3lfaW5mb19zdHJ1Y3QocG5nX3B0ciwgJmluZm9fcHRyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJwbmdwaXhlbDogb3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIHBuZ19pbmZvXG4iKTsKKworICAgICAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsIE5VTEwsIE5VTEwpOworICAgICAgICAgfQorCisgICAgICAgICBlbHNlCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInBuZ3BpeGVsOiBvdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgcG5nX3N0cnVjdFxuIik7CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicG5ncGl4ZWw6ICVzOiBjb3VsZCBub3Qgb3BlbiBmaWxlXG4iLCBhcmd2WzNdKTsKKyAgIH0KKworICAgZWxzZQorICAgICAgLyogV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLworICAgICAgZnByaW50ZihzdGRlcnIsICJwbmdwaXhlbDogdXNhZ2U6IHBuZ3BpeGVsIHggeSBwbmctZmlsZVxuIik7CisKKyAgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLyogUkVBRCAmJiBTRVFVRU5USUFMX1JFQUQgKi8KZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL2V4YW1wbGVzL3BuZ3RvcG5nLmMgYi9saWJwbmcvY29udHJpYi9leGFtcGxlcy9wbmd0b3BuZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhY2Y2YjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9leGFtcGxlcy9wbmd0b3BuZy5jCkBAIC0wLDAgKzEsOTUgQEAKKy8qLSBwbmd0b3BuZworICoKKyAqIENPUFlSSUdIVDogV3JpdHRlbiBieSBKb2huIEN1bm5pbmdoYW0gQm93bGVyLCAyMDExLgorICogVG8gdGhlIGV4dGVudCBwb3NzaWJsZSB1bmRlciBsYXcsIHRoZSBhdXRob3IgaGFzIHdhaXZlZCBhbGwgY29weXJpZ2h0IGFuZAorICogcmVsYXRlZCBvciBuZWlnaGJvcmluZyByaWdodHMgdG8gdGhpcyB3b3JrLiAgVGhpcyB3b3JrIGlzIHB1Ymxpc2hlZCBmcm9tOgorICogVW5pdGVkIFN0YXRlcy4KKyAqCisgKiBSZWFkIGEgUE5HIGFuZCB3cml0ZSBpdCBvdXQgaW4gYSBmaXhlZCBmb3JtYXQsIHVzaW5nIHRoZSAnc2ltcGxpZmllZCBBUEknCisgKiB0aGF0IHdhcyBpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjYuMC4KKyAqCisgKiBUaGlzIHNhbXBsZSBjb2RlIGlzIGp1c3QgdGhlIGNvZGUgZnJvbSB0aGUgdG9wIG9mICdleGFtcGxlLmMnIHdpdGggc29tZSBlcnJvcgorICogaGFuZGxpbmcgYWRkZWQuICBTZWUgZXhhbXBsZS5jIGZvciBtb3JlIGNvbW1lbnRzLgorICovCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyogTm9ybWFsbHkgdXNlIDxwbmcuaD4gaGVyZSB0byBnZXQgdGhlIGluc3RhbGxlZCBsaWJwbmcsIGJ1dCB0aGlzIGlzIGRvbmUgdG8KKyAqIGVuc3VyZSB0aGUgY29kZSBwaWNrcyB1cCB0aGUgbG9jYWwgbGlicG5nIGltcGxlbWVudGF0aW9uOgorICovCisjaW5jbHVkZSAiLi4vLi4vcG5nLmgiCisjaWYgZGVmaW5lZChQTkdfU0lNUExJRklFRF9SRUFEX1NVUFBPUlRFRCkgJiYgXAorICAgIGRlZmluZWQoUE5HX1NJTVBMSUZJRURfV1JJVEVfU1VQUE9SVEVEKQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCit7CisgICBpbnQgcmVzdWx0ID0gMTsKKworICAgaWYgKGFyZ2MgPT0gMykKKyAgIHsKKyAgICAgIHBuZ19pbWFnZSBpbWFnZTsKKworICAgICAgLyogT25seSB0aGUgaW1hZ2Ugc3RydWN0dXJlIHZlcnNpb24gbnVtYmVyIG5lZWRzIHRvIGJlIHNldC4gKi8KKyAgICAgIG1lbXNldCgmaW1hZ2UsIDAsIHNpemVvZiBpbWFnZSk7CisgICAgICBpbWFnZS52ZXJzaW9uID0gUE5HX0lNQUdFX1ZFUlNJT047CisKKyAgICAgIGlmIChwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX2ZpbGUoJmltYWdlLCBhcmd2WzFdKSkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19ieXRlcCBidWZmZXI7CisKKyAgICAgICAgIC8qIENoYW5nZSB0aGlzIHRvIHRyeSBkaWZmZXJlbnQgZm9ybWF0cyEgIElmIHlvdSBzZXQgYSBjb2xvcm1hcCBmb3JtYXQKKyAgICAgICAgICAqIHRoZW4geW91IG11c3QgYWxzbyBzdXBwbHkgYSBjb2xvcm1hcCBiZWxvdy4KKyAgICAgICAgICAqLworICAgICAgICAgaW1hZ2UuZm9ybWF0ID0gUE5HX0ZPUk1BVF9SR0JBOworCisgICAgICAgICBidWZmZXIgPSBtYWxsb2MoUE5HX0lNQUdFX1NJWkUoaW1hZ2UpKTsKKworICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKHBuZ19pbWFnZV9maW5pc2hfcmVhZCgmaW1hZ2UsIE5VTEwvKmJhY2tncm91bmQqLywgYnVmZmVyLAorICAgICAgICAgICAgICAgMC8qcm93X3N0cmlkZSovLCBOVUxMLypjb2xvcm1hcCBmb3IgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQICovKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmIChwbmdfaW1hZ2Vfd3JpdGVfdG9fZmlsZSgmaW1hZ2UsIGFyZ3ZbMl0sCisgICAgICAgICAgICAgICAgICAwLypjb252ZXJ0X3RvXzhiaXQqLywgYnVmZmVyLCAwLypyb3dfc3RyaWRlKi8sCisgICAgICAgICAgICAgICAgICBOVUxMLypjb2xvcm1hcCovKSkKKyAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDA7CisKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicG5ndG9wbmc6IHdyaXRlICVzOiAlc1xuIiwgYXJndlsyXSwKKyAgICAgICAgICAgICAgICAgICAgICBpbWFnZS5tZXNzYWdlKTsKKworICAgICAgICAgICAgICAgZnJlZShidWZmZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInBuZ3RvcG5nOiByZWFkICVzOiAlc1xuIiwgYXJndlsxXSwKKyAgICAgICAgICAgICAgICAgICBpbWFnZS5tZXNzYWdlKTsKKworICAgICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgb25seSBwbGFjZSB3aGVyZSBhICdmcmVlJyBpcyByZXF1aXJlZDsgbGlicG5nIGRvZXMKKyAgICAgICAgICAgICAgICAqIHRoZSBjbGVhbnVwIG9uIGVycm9yIGFuZCBzdWNjZXNzLCBidXQgaW4gdGhpcyBjYXNlIHdlIGNvdWxkbid0CisgICAgICAgICAgICAgICAgKiBjb21wbGV0ZSB0aGUgcmVhZCBiZWNhdXNlIG9mIHJ1bm5pbmcgb3V0IG9mIG1lbW9yeS4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgcG5nX2ltYWdlX2ZyZWUoJmltYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICAgZWxzZQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJwbmd0b3BuZzogb3V0IG9mIG1lbW9yeTogJWx1IGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpUE5HX0lNQUdFX1NJWkUoaW1hZ2UpKTsKKyAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgICAgLyogRmFpbGVkIHRvIHJlYWQgdGhlIGZpcnN0IGFyZ3VtZW50OiAqLworICAgICAgICAgZnByaW50ZihzdGRlcnIsICJwbmd0b3BuZzogJXM6ICVzXG4iLCBhcmd2WzFdLCBpbWFnZS5tZXNzYWdlKTsKKyAgIH0KKworICAgZWxzZQorICAgICAgLyogV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLworICAgICAgZnByaW50ZihzdGRlcnIsICJwbmd0b3BuZzogdXNhZ2U6IHBuZ3RvcG5nIGlucHV0LWZpbGUgb3V0cHV0LWZpbGVcbiIpOworCisgICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8qIFJFQUQgJiYgV1JJVEUgKi8KZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL2V4YW1wbGVzL3NpbXBsZW92ZXIuYyBiL2xpYnBuZy9jb250cmliL2V4YW1wbGVzL3NpbXBsZW92ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWRkMzEzCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvZXhhbXBsZXMvc2ltcGxlb3Zlci5jCkBAIC0wLDAgKzEsNjQ4IEBACisvKi0gc2ltcGxlb3ZlcgorICoKKyAqIENPUFlSSUdIVDogV3JpdHRlbiBieSBKb2huIEN1bm5pbmdoYW0gQm93bGVyLCAyMDE1LgorICogVG8gdGhlIGV4dGVudCBwb3NzaWJsZSB1bmRlciBsYXcsIHRoZSBhdXRob3IgaGFzIHdhaXZlZCBhbGwgY29weXJpZ2h0IGFuZAorICogcmVsYXRlZCBvciBuZWlnaGJvcmluZyByaWdodHMgdG8gdGhpcyB3b3JrLiAgVGhpcyB3b3JrIGlzIHB1Ymxpc2hlZCBmcm9tOgorICogVW5pdGVkIFN0YXRlcy4KKyAqCisgKiBSZWFkIHNldmVyYWwgUE5HIGZpbGVzLCB3aGljaCBzaG91bGQgaGF2ZSBhbiBhbHBoYSBjaGFubmVsIG9yIHRyYW5zcGFyZW5jeQorICogaW5mb3JtYXRpb24sIGFuZCBjb21wb3NpdGUgdGhlbSB0b2dldGhlciB0byBwcm9kdWNlIG9uZSBvciBtb3JlIDE2LWJpdCBsaW5lYXIKKyAqIFJHQkEgaW50ZXJtZWRpYXRlcy4gIFRoaXMgaW52b2x2ZXMgZG9pbmcgdGhlIGNvcnJlY3QgJ292ZXInIGNvbXBvc2l0aW9uIHRvCisgKiBjb21iaW5lIHRoZSBhbHBoYSBjaGFubmVscyBhbmQgY29ycmVzcG9uZGluZyBkYXRhLgorICoKKyAqIEZpbmFsbHkgcmVhZCBhbiBvdXRwdXQgKGJhY2tncm91bmQpIFBORyB1c2luZyB0aGUgMjQtYml0IFJHQiBmb3JtYXQgKHRoZQorICogUE5HIHdpbGwgYmUgY29tcG9zaXRlZCBvbiBncmVlbiAoIzAwZmYwMCkgYnkgZGVmYXVsdCBpZiBpdCBoYXMgYW4gYWxwaGEKKyAqIGNoYW5uZWwpLCBhbmQgYXBwbHkgdGhlIGludGVybWVkaWF0ZSBpbWFnZSBnZW5lcmF0ZWQgYWJvdmUgdG8gc3BlY2lmaWVkCisgKiBsb2NhdGlvbnMgaW4gdGhlIGltYWdlLgorICoKKyAqIFRoZSBjb21tYW5kIGxpbmUgaGFzIHRoZSBnZW5lcmFsIGZvcm1hdDoKKyAqCisgKiAgICBzaW1wbGVvdmVyIDxiYWNrZ3JvdW5kLnBuZz4gW291dHB1dC5wbmddCisgKiAgICAgICAgey0tc3ByaXRlPXdpZHRoLGhlaWdodCxuYW1lIHtbLS1hdD14LHldIHtzcHJpdGUucG5nfX19CisgKiAgICAgICAgey0tYWRkPW5hbWUge3gseX19CisgKgorICogVGhlIC0tc3ByaXRlIGFuZCAtLWFkZCBvcHRpb25zIG1heSBvY2N1ciBtdWx0aXBsZSB0aW1lcy4gVGhleSBhcmUgZXhlY3V0ZWQKKyAqIGluIG9yZGVyLiAgLS1hZGQgbWF5IHJlZmVyIHRvIGFueSBzcHJpdGUgYWxyZWFkeSByZWFkLgorICoKKyAqIFRoaXMgY29kZSBpcyBpbnRlbmRlZCB0byBzaG93IGhvdyB0byBjb21wb3NpdGUgbXVsdGlwbGUgaW1hZ2VzIHRvZ2V0aGVyCisgKiBjb3JyZWN0bHkuICBBcGFydCBmcm9tIHRoZSBsaWJwbmcgU2ltcGxpZmllZCBBUEkgdGhlIG9ubHkgd29yayBkb25lIGluIGhlcmUKKyAqIGlzIHRvIGNvbWJpbmUgbXVsdGlwbGUgaW5wdXQgUE5HIGltYWdlcyBpbnRvIGEgc2luZ2xlIHNwcml0ZTsgdGhpcyBpbnZvbHZlcworICogYSBQb3J0ZXItRHVmZiAnb3Zlcicgb3BlcmF0aW9uIGFuZCB0aGUgaW5wdXQgUE5HIGltYWdlcyBtYXksIGFzIGEgcmVzdWx0LAorICogYmUgcmVnYXJkZWQgYXMgYmVpbmcgbGF5ZXJlZCBvbmUgb24gdG9wIG9mIHRoZSBvdGhlciB3aXRoIHRoZSBmaXJzdCAobGVmdG1vc3QKKyAqIG9uIHRoZSBjb21tYW5kIGxpbmUpIGJlaW5nIGF0IHRoZSBib3R0b20gYW5kIHRoZSBsYXN0IG9uIHRoZSB0b3AuCisgKi8KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKy8qIE5vcm1hbGx5IHVzZSA8cG5nLmg+IGhlcmUgdG8gZ2V0IHRoZSBpbnN0YWxsZWQgbGlicG5nLCBidXQgdGhpcyBpcyBkb25lIHRvCisgKiBlbnN1cmUgdGhlIGNvZGUgcGlja3MgdXAgdGhlIGxvY2FsIGxpYnBuZyBpbXBsZW1lbnRhdGlvbiwgc28gbG9uZyBhcyB0aGlzCisgKiBmaWxlIGlzIGxpbmtlZCBhZ2FpbnN0IGEgc3VmZmljaWVudGx5IHJlY2VudCBsaWJwbmcgKDEuNispIGl0IGlzIG9rIHRvCisgKiBjaGFuZ2UgdGhpcyB0byA8cG5nLmg+OgorICovCisjaW5jbHVkZSAiLi4vLi4vcG5nLmgiCisKKyNpZmRlZiBQTkdfU0lNUExJRklFRF9SRUFEX1NVUFBPUlRFRAorCisjZGVmaW5lIHNwcml0ZV9uYW1lX2NoYXJzIDE1CitzdHJ1Y3Qgc3ByaXRlIHsKKyAgIEZJTEUgICAgICAgICAqZmlsZTsKKyAgIHBuZ191aW50XzE2cCAgYnVmZmVyOworICAgdW5zaWduZWQgaW50ICB3aWR0aDsKKyAgIHVuc2lnbmVkIGludCAgaGVpZ2h0OworICAgY2hhciAgICAgICAgICBuYW1lW3Nwcml0ZV9uYW1lX2NoYXJzKzFdOworfTsKKworI2lmIDAgLyogZGl2IGJ5IDY1NTM1IHRlc3QgcHJvZ3JhbSAqLworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgbWFpbih2b2lkKSB7CisgICBkb3VibGUgZXJyID0gMDsKKyAgIHVuc2lnbmVkIGludCB4ZXJyID0gMDsKKyAgIHVuc2lnbmVkIGludCByID0gMzI3Njk7CisgICB7CisgICAgICB1bnNpZ25lZCBpbnQgeCA9IDA7CisKKyAgICAgIGRvIHsKKyAgICAgICAgIHVuc2lnbmVkIGludCB0ID0geCArICh4ID4+IDE2KSAvKisgKHggPj4gMzEpKi8gKyByOworICAgICAgICAgZG91YmxlIHYgPSB4LCBlcnJ0ZXN0OworCisgICAgICAgICBpZiAodCA8IHgpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAib3ZlcmZsb3c6ICV1KyV1IC0+ICV1XG4iLCB4LCByLCB0KTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgfQorCisgICAgICAgICB2IC89IDY1NTM1OworICAgICAgICAgZXJydGVzdCA9IHY7CisgICAgICAgICB0ID4+PSAxNjsKKyAgICAgICAgIGVycnRlc3QgLT0gdDsKKworICAgICAgICAgaWYgKGVycnRlc3QgPiBlcnIpIHsKKyAgICAgICAgICAgIGVyciA9IGVycnRlc3Q7CisgICAgICAgICAgICB4ZXJyID0geDsKKworICAgICAgICAgICAgaWYgKGVycnRlc3QgPj0gLjUpIHsKKyAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3I6ICV1LzY1NTM1ID0gJWYsIG5vdCAldSwgZXJyb3IgJWZcbiIsCisgICAgICAgICAgICAgICAgICAgICB4LCB2LCB0LCBlcnJ0ZXN0KTsKKyAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfSB3aGlsZSAoKyt4IDw9IDY1NTM1VSo2NTUzNVUpOworICAgfQorCisgICBwcmludGYoImVycm9yICVmIEAgJXVcbiIsIGVyciwgeGVycik7CisKKyAgIHJldHVybiAwOworfQorI2VuZGlmIC8qIGRpdiBieSA2NTUzNSB0ZXN0IHByb2dyYW0gKi8KKworc3RhdGljIHZvaWQKK3Nwcml0ZV9vcChjb25zdCBzdHJ1Y3Qgc3ByaXRlICpzcHJpdGUsIGludCB4X29mZnNldCwgaW50IHlfb2Zmc2V0LAorICAgcG5nX2ltYWdlcCBpbWFnZSwgY29uc3QgcG5nX3VpbnRfMTYgKmJ1ZmZlcikKK3sKKyAgIC8qIFRoaXMgaXMgd2hlcmUgdGhlIFBvcnRlci1EdWZmICdPdmVyJyBvcGVyYXRvciBpcyBldmFsdWF0ZWQ7IGNoYW5nZSB0aGlzCisgICAgKiBjb2RlIHRvIGNoYW5nZSB0aGUgb3BlcmF0b3IgKHRoaXMgY291bGQgYmUgcGFyYW1ldGVyaXplZCkuICBBbnkgb3RoZXIKKyAgICAqIGltYWdlIHByb2Nlc3Npbmcgb3BlcmF0aW9uIGNvdWxkIGJlIHVzZWQgaGVyZS4KKyAgICAqLworCisKKyAgIC8qIENoZWNrIGZvciBhbiB4IG9yIHkgb2Zmc2V0IHRoYXQgcHVzaGVzIGFueSBwYXJ0IG9mIHRoZSBpbWFnZSBiZXlvbmQgdGhlCisgICAgKiByaWdodCBvciBib3R0b20gb2YgdGhlIHNwcml0ZToKKyAgICAqLworICAgaWYgKCh5X29mZnNldCA8IDAgfHwgKHVuc2lnbmVkKS8qU0FGRSoveV9vZmZzZXQgPCBzcHJpdGUtPmhlaWdodCkgJiYKKyAgICAgICAoeF9vZmZzZXQgPCAwIHx8ICh1bnNpZ25lZCkvKlNBRkUqL3hfb2Zmc2V0IDwgc3ByaXRlLT53aWR0aCkpCisgICB7CisgICAgICB1bnNpZ25lZCBpbnQgeSA9IDA7CisKKyAgICAgIGlmICh5X29mZnNldCA8IDApCisgICAgICAgICB5ID0gLXlfb2Zmc2V0OyAvKiBTa2lwIHRvIGZpcnN0IHZpc2libGUgcm93ICovCisKKyAgICAgIGRvCisgICAgICB7CisgICAgICAgICB1bnNpZ25lZCBpbnQgeCA9IDA7CisKKyAgICAgICAgIGlmICh4X29mZnNldCA8IDApCisgICAgICAgICAgICB4ID0gLXhfb2Zmc2V0OworCisgICAgICAgICBkbworICAgICAgICAgeworICAgICAgICAgICAgLyogSW4gYW5kIG91dCBhcmUgUkdCQSB2YWx1ZXMsIHNvOiAqLworICAgICAgICAgICAgY29uc3QgcG5nX3VpbnRfMTYgKmluX3BpeGVsID0gYnVmZmVyICsgKHkgKiBpbWFnZS0+d2lkdGggKyB4KSo0OworICAgICAgICAgICAgcG5nX3VpbnRfMzIgaW5fYWxwaGEgPSBpbl9waXhlbFszXTsKKworICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgb3B0aW1pemVkIFBvcnRlci1EdWZmICdPdmVyJyBvcGVyYXRpb24sIHdoZW4gdGhlCisgICAgICAgICAgICAgKiBpbnB1dCBhbHBoYSBpcyAwIHRoZSBvdXRwdXQgaXMgbm90IGNoYW5nZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChpbl9hbHBoYSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfdWludF8xNiAqb3V0X3BpeGVsID0gc3ByaXRlLT5idWZmZXIgKworICAgICAgICAgICAgICAgICAgKCh5K3lfb2Zmc2V0KSAqIHNwcml0ZS0+d2lkdGggKyAoeCt4X29mZnNldCkpKjQ7CisKKyAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgdGhlIHdlaWdodCB0byBhcHBseSB0byB0aGUgb3V0cHV0OiAqLworICAgICAgICAgICAgICAgaW5fYWxwaGEgPSA2NTUzNS1pbl9hbHBoYTsKKworICAgICAgICAgICAgICAgaWYgKGluX2FscGhhID4gMCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIFRoZSBpbnB1dCBtdXN0IGJlIGNvbXBvc2VkIG9udG8gdGhlIG91dHB1dC4gVGhpcyBtZWFucworICAgICAgICAgICAgICAgICAgICogbXVsdGlwbHlpbmcgdGhlIGN1cnJlbnQgb3V0cHV0IHBpeGVsIHZhbHVlIGJ5IHRoZSBpbnZlcnNlCisgICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgaW5wdXQgYWxwaGEgKDEtYWxwaGEpLiBBIGRpdmlzaW9uIGlzIHJlcXVpcmVkIGJ1dAorICAgICAgICAgICAgICAgICAgICogaXQgaXMgYnkgdGhlIGNvbnN0YW50IDY1NTM1LiAgQXBwcm94aW1hdGUgdGhpcyBhczoKKyAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAgKiAgICAgKHggKyAoeCA+PiAxNikgKyAzMjc2OSkgPj4gMTY7CisgICAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAgICogVGhpcyBpcyBleGFjdCAoYW5kIGRvZXMgbm90IG92ZXJmbG93KSBmb3IgYWxsIHZhbHVlcyBvZgorICAgICAgICAgICAgICAgICAgICogeCBpbiB0aGUgcmFuZ2UgMC4uNjU1MzUqNjU1MzUuICAoTm90ZSB0aGF0IHRoZSBjYWxjdWxhdGlvbgorICAgICAgICAgICAgICAgICAgICogcHJvZHVjZXMgdGhlIGNsb3Nlc3QgaW50ZWdlcjsgdGhlIG1heGltdW0gZXJyb3IgaXMgPDAuNSkuCisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIHBuZ191aW50XzMyIHRtcDsKKworIyAgICAgICAgICAgICAgICAgZGVmaW5lIGNvbXBvc2UoYylcCisgICAgICAgICAgICAgICAgICAgICB0bXAgPSBvdXRfcGl4ZWxbY10gKiBpbl9hbHBoYTtcCisgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wICsgKHRtcCA+PiAxNikgKyAzMjc2OSkgPj4gMTY7XAorICAgICAgICAgICAgICAgICAgICAgb3V0X3BpeGVsW2NdID0gdG1wICsgaW5fcGl4ZWxbY10KKworICAgICAgICAgICAgICAgICAgLyogVGhlIGZvbGxvd2luZyBpcyB2ZXJ5IHZlY3Rvcml6YWJsZS4uLiAqLworICAgICAgICAgICAgICAgICAgY29tcG9zZSgwKTsKKyAgICAgICAgICAgICAgICAgIGNvbXBvc2UoMSk7CisgICAgICAgICAgICAgICAgICBjb21wb3NlKDIpOworICAgICAgICAgICAgICAgICAgY29tcG9zZSgzKTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgb3V0X3BpeGVsWzBdID0gaW5fcGl4ZWxbMF0sCisgICAgICAgICAgICAgICAgICBvdXRfcGl4ZWxbMV0gPSBpbl9waXhlbFsxXSwKKyAgICAgICAgICAgICAgICAgIG91dF9waXhlbFsyXSA9IGluX3BpeGVsWzJdLAorICAgICAgICAgICAgICAgICAgb3V0X3BpeGVsWzNdID0gaW5fcGl4ZWxbM107CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICB3aGlsZSAoKyt4IDwgaW1hZ2UtPndpZHRoKTsKKyAgICAgIH0KKyAgICAgIHdoaWxlICgrK3kgPCBpbWFnZS0+aGVpZ2h0KTsKKyAgIH0KK30KKworc3RhdGljIGludAorY3JlYXRlX3Nwcml0ZShzdHJ1Y3Qgc3ByaXRlICpzcHJpdGUsIGludCAqYXJnYywgY29uc3QgY2hhciAqKiphcmd2KQoreworICAgLyogUmVhZCB0aGUgYXJndW1lbnRzIGFuZCBjcmVhdGUgdGhpcyBzcHJpdGUuIFRoZSBzcHJpdGUgYnVmZmVyIGhhcyBhbHJlYWR5CisgICAgKiBiZWVuIGFsbG9jYXRlZC4gVGhpcyByZWFkcyB0aGUgaW5wdXQgUE5HcyBvbmUgYnkgb25lIGluIGxpbmVhciBmb3JtYXQsCisgICAgKiBjb21wb3NlcyB0aGVtIG9udG8gdGhlIHNwcml0ZSBidWZmZXIgKHRoZSBjb2RlIGluIHRoZSBmdW5jdGlvbiBhYm92ZSkKKyAgICAqIHRoZW4gc2F2ZXMgdGhlIHJlc3VsdCwgY29udmVydGluZyBpdCBvbiB0aGUgZmx5IHRvIFBORyBSR0JBIDgtYml0IGZvcm1hdC4KKyAgICAqLworICAgd2hpbGUgKCphcmdjID4gMCkKKyAgIHsKKyAgICAgIGNoYXIgdG9tYnN0b25lOworICAgICAgaW50IHggPSAwLCB5ID0gMDsKKworICAgICAgaWYgKCgqYXJndilbMF1bMF0gPT0gJy0nICYmICgqYXJndilbMF1bMV0gPT0gJy0nKQorICAgICAgeworICAgICAgICAgLyogVGhlIG9ubHkgc3VwcG9ydGVkIG9wdGlvbiBpcyAtLWF0LiAqLworICAgICAgICAgaWYgKHNzY2FuZigoKmFyZ3YpWzBdLCAiLS1hdD0lZCwlZCVjIiwgJngsICZ5LCAmdG9tYnN0b25lKSAhPSAyKQorICAgICAgICAgICAgYnJlYWs7IC8qIHN1Y2Nlc3M7IGNhbGxlciB3aWxsIHBhcnNlIHRoaXMgb3B0aW9uICovCisKKyAgICAgICAgICsrKmFyZ3YsIC0tKmFyZ2M7CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIC8qIFRoZSBhcmd1bWVudCBoYXMgdG8gYmUgYSBmaWxlIG5hbWUgKi8KKyAgICAgICAgIHBuZ19pbWFnZSBpbWFnZTsKKworICAgICAgICAgaW1hZ2UudmVyc2lvbiA9IFBOR19JTUFHRV9WRVJTSU9OOworICAgICAgICAgaW1hZ2Uub3BhcXVlID0gTlVMTDsKKworICAgICAgICAgaWYgKHBuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fZmlsZSgmaW1hZ2UsICgqYXJndilbMF0pKQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX3VpbnRfMTZwIGJ1ZmZlcjsKKworICAgICAgICAgICAgaW1hZ2UuZm9ybWF0ID0gUE5HX0ZPUk1BVF9MSU5FQVJfUkdCX0FMUEhBOworCisgICAgICAgICAgICBidWZmZXIgPSBtYWxsb2MoUE5HX0lNQUdFX1NJWkUoaW1hZ2UpKTsKKworICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKHBuZ19pbWFnZV9maW5pc2hfcmVhZCgmaW1hZ2UsIE5VTEwvKmJhY2tncm91bmQqLywgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgMC8qcm93X3N0cmlkZSovLAorICAgICAgICAgICAgICAgICAgTlVMTC8qY29sb3JtYXAgZm9yIFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCovKSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgdGhlIHBsYWNlIHdoZXJlIHRoZSBQb3J0ZXItRHVmZiAnT3Zlcicgb3BlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAqIG5lZWRzIHRvIGJlIGRvbmUgYnkgdGhpcyBjb2RlLiAgSW4gZmFjdCwgYW55IGltYWdlCisgICAgICAgICAgICAgICAgICAgKiBwcm9jZXNzaW5nIHJlcXVpcmVkIGNhbiBiZSBkb25lIGhlcmU7IHRoZSBkYXRhIGlzIGluCisgICAgICAgICAgICAgICAgICAgKiB0aGUgY29ycmVjdCBmb3JtYXQgKGxpbmVhciwgMTYtYml0KSBhbmQgc291cmNlIGFuZAorICAgICAgICAgICAgICAgICAgICogZGVzdGluYXRpb24gYXJlIGluIG1lbW9yeS4KKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgc3ByaXRlX29wKHNwcml0ZSwgeCwgeSwgJmltYWdlLCBidWZmZXIpOworICAgICAgICAgICAgICAgICAgZnJlZShidWZmZXIpOworICAgICAgICAgICAgICAgICAgKysqYXJndiwgLS0qYXJnYzsKKyAgICAgICAgICAgICAgICAgIC8qIEFuZCBjb250aW51ZSB0byB0aGUgbmV4dCBhcmd1bWVudCAqLworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGZyZWUoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic2ltcGxlb3ZlcjogcmVhZCAlczogJXNcbiIsICgqYXJndilbMF0sCisgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UubWVzc2FnZSk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic2ltcGxlb3Zlcjogb3V0IG9mIG1lbW9yeTogJWx1IGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpUE5HX0lNQUdFX1NJWkUoaW1hZ2UpKTsKKworICAgICAgICAgICAgICAgLyogcG5nX2ltYWdlX2ZyZWUgbXVzdCBiZSBjYWxsZWQgaWYgd2UgYWJvcnQgdGhlIFNpbXBsaWZpZWQgQVBJCisgICAgICAgICAgICAgICAgKiByZWFkIGJlY2F1c2Ugb2YgYSBwcm9ibGVtIGRldGVjdGVkIGluIHRoaXMgY29kZS4gIElmIHByb2JsZW1zCisgICAgICAgICAgICAgICAgKiBhcmUgZGV0ZWN0ZWQgaW4gdGhlIFNpbXBsaWZpZWQgQVBJIGl0IGNsZWFucyB1cCBpdHNlbGYuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIHBuZ19pbWFnZV9mcmVlKCZpbWFnZSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZhaWxlZCB0byByZWFkIHRoZSBmaXJzdCBhcmd1bWVudDogKi8KKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic2ltcGxlb3ZlcjogJXM6ICVzXG4iLCAoKmFyZ3YpWzBdLCBpbWFnZS5tZXNzYWdlKTsKKyAgICAgICAgIH0KKworICAgICAgICAgcmV0dXJuIDA7IC8qIGZhaWx1cmUgKi8KKyAgICAgIH0KKyAgIH0KKworICAgLyogQWxsIHRoZSBzcHJpdGUgb3BlcmF0aW9ucyBoYXZlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIFNhdmUgdGhlIFJHQkEKKyAgICAqIGJ1ZmZlciBhcyBhIFBORyB1c2luZyB0aGUgc2ltcGxpZmllZCB3cml0ZSBBUEkuCisgICAgKi8KKyAgIHNwcml0ZS0+ZmlsZSA9IHRtcGZpbGUoKTsKKworICAgaWYgKHNwcml0ZS0+ZmlsZSAhPSBOVUxMKQorICAgeworICAgICAgcG5nX2ltYWdlIHNhdmU7CisKKyAgICAgIG1lbXNldCgmc2F2ZSwgMCwgc2l6ZW9mIHNhdmUpOworICAgICAgc2F2ZS52ZXJzaW9uID0gUE5HX0lNQUdFX1ZFUlNJT047CisgICAgICBzYXZlLm9wYXF1ZSA9IE5VTEw7CisgICAgICBzYXZlLndpZHRoID0gc3ByaXRlLT53aWR0aDsKKyAgICAgIHNhdmUuaGVpZ2h0ID0gc3ByaXRlLT5oZWlnaHQ7CisgICAgICBzYXZlLmZvcm1hdCA9IFBOR19GT1JNQVRfTElORUFSX1JHQl9BTFBIQTsKKyAgICAgIHNhdmUuZmxhZ3MgPSBQTkdfSU1BR0VfRkxBR19GQVNUOworICAgICAgc2F2ZS5jb2xvcm1hcF9lbnRyaWVzID0gMDsKKworICAgICAgaWYgKHBuZ19pbWFnZV93cml0ZV90b19zdGRpbygmc2F2ZSwgc3ByaXRlLT5maWxlLCAxLypjb252ZXJ0X3RvXzhfYml0Ki8sCisgICAgICAgICAgc3ByaXRlLT5idWZmZXIsIDAvKnJvd19zdHJpZGUqLywgTlVMTC8qY29sb3JtYXAqLykpCisgICAgICB7CisgICAgICAgICAvKiBTdWNjZXNzOyB0aGUgYnVmZmVyIGlzIG5vIGxvbmdlciBuZWVkZWQ6ICovCisgICAgICAgICBmcmVlKHNwcml0ZS0+YnVmZmVyKTsKKyAgICAgICAgIHNwcml0ZS0+YnVmZmVyID0gTlVMTDsKKyAgICAgICAgIHJldHVybiAxOyAvKiBvayAqLworICAgICAgfQorCisgICAgICBlbHNlCisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNpbXBsZW92ZXI6IHdyaXRlIHNwcml0ZSAlczogJXNcbiIsIHNwcml0ZS0+bmFtZSwKKyAgICAgICAgICAgIHNhdmUubWVzc2FnZSk7CisgICB9CisKKyAgIGVsc2UKKyAgICAgIGZwcmludGYoc3RkZXJyLCAic2ltcGxlb3Zlcjogc3ByaXRlICVzOiBjb3VsZCBub3QgYWxsb2NhdGUgdG1wZmlsZTogJXNcbiIsCisgICAgICAgICBzcHJpdGUtPm5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisKKyAgIHJldHVybiAwOyAvKiBmYWlsICovCit9CisKK3N0YXRpYyBpbnQKK2FkZF9zcHJpdGUocG5nX2ltYWdlcCBvdXRwdXQsIHBuZ19ieXRlcCBvdXRfYnVmLCBzdHJ1Y3Qgc3ByaXRlICpzcHJpdGUsCisgICBpbnQgKmFyZ2MsIGNvbnN0IGNoYXIgKioqYXJndikKK3sKKyAgIC8qIEdpdmVuIGEgLS1hZGQgYXJndW1lbnQgbmFtaW5nIHRoaXMgc3ByaXRlLCBwZXJmb3JtIHRoZSBvcGVyYXRpb25zIGxpc3RlZAorICAgICogaW4gdGhlIGZvbGxvd2luZyBhcmd1bWVudHMuICBUaGUgYXJndW1lbnRzIGFyZSBleHBlY3RlZCB0byBoYXZlIHRoZSBmb3JtCisgICAgKiAoeCx5KSwgd2hpY2ggaXMganVzdCBhbiBvZmZzZXQgYXQgd2hpY2ggdG8gYWRkIHRoZSBzcHJpdGUgdG8gdGhlCisgICAgKiBvdXRwdXQuCisgICAgKi8KKyAgIHdoaWxlICgqYXJnYyA+IDApCisgICB7CisgICAgICBjaGFyIHRvbWJzdG9uZTsKKyAgICAgIGludCB4LCB5OworCisgICAgICBpZiAoKCphcmd2KVswXVswXSA9PSAnLScgJiYgKCphcmd2KVswXVsxXSA9PSAnLScpCisgICAgICAgICByZXR1cm4gMTsgLyogc3VjY2VzcyAqLworCisgICAgICBpZiAoc3NjYW5mKCgqYXJndilbMF0sICIlZCwlZCVjIiwgJngsICZ5LCAmdG9tYnN0b25lKSA9PSAyKQorICAgICAgeworICAgICAgICAgLyogTm93IGFkZCB0aGUgbmV3IGltYWdlIGludG8gdGhlIHNwcml0ZSBkYXRhLCBidXQgb25seSBpZiBpdAorICAgICAgICAgICogd2lsbCBmaXQuCisgICAgICAgICAgKi8KKyAgICAgICAgIGlmICh4IDwgMCB8fCB5IDwgMCB8fAorICAgICAgICAgICAgICh1bnNpZ25lZCkvKlNBRkUqL3ggPj0gb3V0cHV0LT53aWR0aCB8fAorICAgICAgICAgICAgICh1bnNpZ25lZCkvKlNBRkUqL3kgPj0gb3V0cHV0LT5oZWlnaHQgfHwKKyAgICAgICAgICAgICBzcHJpdGUtPndpZHRoID4gb3V0cHV0LT53aWR0aC14IHx8CisgICAgICAgICAgICAgc3ByaXRlLT5oZWlnaHQgPiBvdXRwdXQtPmhlaWdodC15KQorICAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzaW1wbGVvdmVyOiBzcHJpdGUgJXMgQCAoJWQsJWQpIG91dHNpZGUgaW1hZ2VcbiIsCisgICAgICAgICAgICAgICBzcHJpdGUtPm5hbWUsIHgsIHkpOworICAgICAgICAgICAgLyogQ291bGQganVzdCBza2lwIHRoaXMsIGJ1dCBmb3IgdGhlIG1vbWVudCBpdCBpcyBhbiBlcnJvciAqLworICAgICAgICAgICAgcmV0dXJuIDA7IC8qIGVycm9yICovCisgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNpbmNlIHdlIGtub3cgdGhlIHNwcml0ZSBmaXRzIHdlIGNhbiBqdXN0IHJlYWQgaXQgaW50byB0aGUKKyAgICAgICAgICAgICAqIG91dHB1dCB1c2luZyB0aGUgc2ltcGxpZmllZCBBUEkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHBuZ19pbWFnZSBpbjsKKworICAgICAgICAgICAgaW4udmVyc2lvbiA9IFBOR19JTUFHRV9WRVJTSU9OOworICAgICAgICAgICAgcmV3aW5kKHNwcml0ZS0+ZmlsZSk7CisKKyAgICAgICAgICAgIGlmIChwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX3N0ZGlvKCZpbiwgc3ByaXRlLT5maWxlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGluLmZvcm1hdCA9IFBOR19GT1JNQVRfUkdCOyAvKiBmb3JjZSBjb21wb3NlICovCisKKyAgICAgICAgICAgICAgIGlmIChwbmdfaW1hZ2VfZmluaXNoX3JlYWQoJmluLCBOVUxMLypiYWNrZ3JvdW5kKi8sCisgICAgICAgICAgICAgICAgICBvdXRfYnVmICsgKHkqb3V0cHV0LT53aWR0aCArIHgpKjMvKlJHQiovLAorICAgICAgICAgICAgICAgICAgb3V0cHV0LT53aWR0aCozLypyb3dfc3RyaWRlKi8sCisgICAgICAgICAgICAgICAgICBOVUxMLypjb2xvcm1hcCBmb3IgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQKi8pKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgKysqYXJndiwgLS0qYXJnYzsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBUaGUgcmVhZCBmYWlsZWQ6ICovCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNpbXBsZW92ZXI6IGFkZCBzcHJpdGUgJXM6ICVzXG4iLCBzcHJpdGUtPm5hbWUsCisgICAgICAgICAgICAgICAgaW4ubWVzc2FnZSk7CisgICAgICAgICAgICByZXR1cm4gMDsgLyogZXJyb3IgKi8KKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzaW1wbGVvdmVyOiAtLWFkZD0nJXMnOiBpbnZhbGlkIHBvc2l0aW9uICVzXG4iLAorICAgICAgICAgICAgICAgc3ByaXRlLT5uYW1lLCAoKmFyZ3YpWzBdKTsKKyAgICAgICAgIHJldHVybiAwOyAvKiBlcnJvciAqLworICAgICAgfQorICAgfQorCisgICByZXR1cm4gMTsgLyogb2sgKi8KK30KKworc3RhdGljIGludAorc2ltcGxlb3Zlcl9wcm9jZXNzKHBuZ19pbWFnZXAgb3V0cHV0LCBwbmdfYnl0ZXAgb3V0X2J1ZiwgaW50IGFyZ2MsCisgICBjb25zdCBjaGFyICoqYXJndikKK3sKKyAgIGludCByZXN1bHQgPSAxOyAvKiBzdWNjZXNzICovCisjICBkZWZpbmUgY3Nwcml0ZXMgMTAvKmxpbWl0Ki8KKyMgIGRlZmluZSBzdHIoYSkgI2EKKyAgIGludCBuc3ByaXRlcyA9IDA7CisgICBzdHJ1Y3Qgc3ByaXRlIHNwcml0ZXNbY3Nwcml0ZXNdOworCisgICB3aGlsZSAoYXJnYyA+IDApCisgICB7CisgICAgICByZXN1bHQgPSAwOyAvKiBmYWlsICovCisKKyAgICAgIGlmIChzdHJuY21wKGFyZ3ZbMF0sICItLXNwcml0ZT0iLCA5KSA9PSAwKQorICAgICAgeworICAgICAgICAgY2hhciB0b21ic3RvbmU7CisKKyAgICAgICAgIGlmIChuc3ByaXRlcyA8IGNzcHJpdGVzKQorICAgICAgICAgeworICAgICAgICAgICAgaW50IG47CisKKyAgICAgICAgICAgIHNwcml0ZXNbbnNwcml0ZXNdLndpZHRoID0gc3ByaXRlc1tuc3ByaXRlc10uaGVpZ2h0ID0gMDsKKyAgICAgICAgICAgIHNwcml0ZXNbbnNwcml0ZXNdLm5hbWVbMF0gPSAwOworCisgICAgICAgICAgICBuID0gc3NjYW5mKGFyZ3ZbMF0sICItLXNwcml0ZT0ldSwldSwlIiBzdHIoc3ByaXRlX25hbWVfY2hhcnMpICJzJWMiLAorICAgICAgICAgICAgICAgICZzcHJpdGVzW25zcHJpdGVzXS53aWR0aCwgJnNwcml0ZXNbbnNwcml0ZXNdLmhlaWdodCwKKyAgICAgICAgICAgICAgICBzcHJpdGVzW25zcHJpdGVzXS5uYW1lLCAmdG9tYnN0b25lKTsKKworICAgICAgICAgICAgaWYgKChuID09IDIgfHwgbiA9PSAzKSAmJgorICAgICAgICAgICAgICAgIHNwcml0ZXNbbnNwcml0ZXNdLndpZHRoID4gMCAmJiBzcHJpdGVzW25zcHJpdGVzXS5oZWlnaHQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc2l6ZV90IGJ1Zl9zaXplLCB0bXA7CisKKyAgICAgICAgICAgICAgIC8qIERlZmF1bHQgYSBuYW1lIGlmIG5vdCBnaXZlbi4gKi8KKyAgICAgICAgICAgICAgIGlmIChzcHJpdGVzW25zcHJpdGVzXS5uYW1lWzBdID09IDApCisgICAgICAgICAgICAgICAgICBzcHJpbnRmKHNwcml0ZXNbbnNwcml0ZXNdLm5hbWUsICJzcHJpdGUtJWQiLCBuc3ByaXRlcysxKTsKKworICAgICAgICAgICAgICAgLyogQWxsb2NhdGUgYSBidWZmZXIgZm9yIHRoZSBzcHJpdGUgYW5kIGNhbGN1bGF0ZSB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgKiBzaXplOgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICBidWZfc2l6ZSA9IHNpemVvZiAocG5nX3VpbnRfMTYgWzRdKTsKKyAgICAgICAgICAgICAgIGJ1Zl9zaXplICo9IHNwcml0ZXNbbnNwcml0ZXNdLndpZHRoOworICAgICAgICAgICAgICAgYnVmX3NpemUgKj0gc3ByaXRlc1tuc3ByaXRlc10uaGVpZ2h0OworCisgICAgICAgICAgICAgICAvKiBUaGlzIGNhbiBvdmVyZmxvdyBhIChzaXplX3QpOyBjaGVjayBmb3IgdGhpczogKi8KKyAgICAgICAgICAgICAgIHRtcCA9IGJ1Zl9zaXplOworICAgICAgICAgICAgICAgdG1wIC89IHNwcml0ZXNbbnNwcml0ZXNdLndpZHRoOworICAgICAgICAgICAgICAgdG1wIC89IHNwcml0ZXNbbnNwcml0ZXNdLmhlaWdodDsKKworICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBzaXplb2YgKHBuZ191aW50XzE2IFs0XSkpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzcHJpdGVzW25zcHJpdGVzXS5idWZmZXIgPSBtYWxsb2MoYnVmX3NpemUpOworICAgICAgICAgICAgICAgICAgLyogVGhpcyBidWZmZXIgbXVzdCBiZSBpbml0aWFsaXplZCB0byB0cmFuc3BhcmVudDogKi8KKyAgICAgICAgICAgICAgICAgIG1lbXNldChzcHJpdGVzW25zcHJpdGVzXS5idWZmZXIsIDAsIGJ1Zl9zaXplKTsKKworICAgICAgICAgICAgICAgICAgaWYgKHNwcml0ZXNbbnNwcml0ZXNdLmJ1ZmZlciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgc3ByaXRlc1tuc3ByaXRlc10uZmlsZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICArK2FyZ3YsIC0tYXJnYzsKKworICAgICAgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZV9zcHJpdGUoc3ByaXRlcytuc3ByaXRlcysrLCAmYXJnYywgJmFyZ3YpKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMTsgLyogc3RpbGwgb2sgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICBicmVhazsgLyogZXJyb3IgKi8KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgLyogT3ZlcmZsb3csIG9yIE9PTSAqLworICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzaW1wbGVvdmVyOiAlczogc3ByaXRlIHRvbyBsYXJnZVxuIiwgYXJndlswXSk7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzaW1wbGVvdmVyOiAlczogaW52YWxpZCBzcHJpdGUgKCV1LCV1KVxuIiwKKyAgICAgICAgICAgICAgICAgIGFyZ3ZbMF0sIHNwcml0ZXNbbnNwcml0ZXNdLndpZHRoLCBzcHJpdGVzW25zcHJpdGVzXS5oZWlnaHQpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic2ltcGxlb3ZlcjogJXM6IHRvbyBtYW55IHNwcml0ZXNcbiIsIGFyZ3ZbMF0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGVsc2UgaWYgKHN0cm5jbXAoYXJndlswXSwgIi0tYWRkPSIsIDYpID09IDApCisgICAgICB7CisgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gYXJndlswXSs2OworICAgICAgICAgaW50IGlzcHJpdGUgPSBuc3ByaXRlczsKKworICAgICAgICAgKythcmd2LCAtLWFyZ2M7CisKKyAgICAgICAgIHdoaWxlICgtLWlzcHJpdGUgPj0gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJjbXAoc3ByaXRlc1tpc3ByaXRlXS5uYW1lLCBuYW1lKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKCFhZGRfc3ByaXRlKG91dHB1dCwgb3V0X2J1Ziwgc3ByaXRlcytpc3ByaXRlLCAmYXJnYywgJmFyZ3YpKQorICAgICAgICAgICAgICAgICAgZ290byBvdXQ7IC8qIGVycm9yIGluIGFkZF9zcHJpdGUgKi8KKworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIGlmIChpc3ByaXRlIDwgMCkgLyogc3ByaXRlIG5vdCBmb3VuZCAqLworICAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzaW1wbGVvdmVyOiAtLWFkZD0nJXMnOiBzcHJpdGUgbm90IGZvdW5kXG4iLCBuYW1lKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNpbXBsZW92ZXI6ICVzOiB1bnJlY29nbml6ZWQgb3BlcmF0aW9uXG4iLCBhcmd2WzBdKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICByZXN1bHQgPSAxOyAvKiBvayAgKi8KKyAgIH0KKworICAgLyogQ2xlYW4gdXAgdGhlIGNhY2hlIG9mIHNwcml0ZXM6ICovCitvdXQ6CisgICB3aGlsZSAoLS1uc3ByaXRlcyA+PSAwKQorICAgeworICAgICAgaWYgKHNwcml0ZXNbbnNwcml0ZXNdLmJ1ZmZlciAhPSBOVUxMKQorICAgICAgICAgZnJlZShzcHJpdGVzW25zcHJpdGVzXS5idWZmZXIpOworCisgICAgICBpZiAoc3ByaXRlc1tuc3ByaXRlc10uZmlsZSAhPSBOVUxMKQorICAgICAgICAgKHZvaWQpZmNsb3NlKHNwcml0ZXNbbnNwcml0ZXNdLmZpbGUpOworICAgfQorCisgICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCit7CisgICBpbnQgcmVzdWx0ID0gMTsgLyogZGVmYXVsdCB0byBmYWlsICovCisKKyAgIGlmIChhcmdjID49IDIpCisgICB7CisgICAgICBpbnQgYXJnaSA9IDI7CisgICAgICBjb25zdCBjaGFyICpvdXRwdXQgPSBOVUxMOworICAgICAgcG5nX2ltYWdlIGltYWdlOworCisgICAgICBpZiAoYXJnYyA+IDIgJiYgYXJndlsyXVswXSAhPSAnLScvKmFuIG9wZXJhdGlvbiovKQorICAgICAgeworICAgICAgICAgb3V0cHV0ID0gYXJndlsyXTsKKyAgICAgICAgIGFyZ2kgPSAzOworICAgICAgfQorCisgICAgICBpbWFnZS52ZXJzaW9uID0gUE5HX0lNQUdFX1ZFUlNJT047CisgICAgICBpbWFnZS5vcGFxdWUgPSBOVUxMOworCisgICAgICBpZiAocG5nX2ltYWdlX2JlZ2luX3JlYWRfZnJvbV9maWxlKCZpbWFnZSwgYXJndlsxXSkpCisgICAgICB7CisgICAgICAgICBwbmdfYnl0ZXAgYnVmZmVyOworCisgICAgICAgICBpbWFnZS5mb3JtYXQgPSBQTkdfRk9STUFUX1JHQjsgLyogMjQtYml0IFJHQiAqLworCisgICAgICAgICBidWZmZXIgPSBtYWxsb2MoUE5HX0lNQUdFX1NJWkUoaW1hZ2UpKTsKKworICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2NvbG9yIGJhY2tncm91bmQgPSB7MCwgMHhmZiwgMH07IC8qIGZ1bGx5IHNhdHVyYXRlZCBncmVlbiAqLworCisgICAgICAgICAgICBpZiAocG5nX2ltYWdlX2ZpbmlzaF9yZWFkKCZpbWFnZSwgJmJhY2tncm91bmQsIGJ1ZmZlciwKKyAgICAgICAgICAgICAgIDAvKnJvd19zdHJpZGUqLywgTlVMTC8qY29sb3JtYXAgZm9yIFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCAqLykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvKiBBdCB0aGlzIHBvaW50IHBuZ19pbWFnZV9maW5pc2hfcmVhZCBoYXMgY2xlYW5lZCB1cCB0aGUKKyAgICAgICAgICAgICAgICAqIGFsbG9jYXRlZCBkYXRhIGluIHBuZ19pbWFnZSwgYW5kIG9ubHkgdGhlIGJ1ZmZlciBuZWVkcyB0byBiZQorICAgICAgICAgICAgICAgICogZnJlZWQuCisgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICogUGVyZm9ybSB0aGUgcmVtYWluaW5nIG9wZXJhdGlvbnM6CisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIGlmIChzaW1wbGVvdmVyX3Byb2Nlc3MoJmltYWdlLCBidWZmZXIsIGFyZ2MtYXJnaSwgYXJndithcmdpKSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIFdyaXRlIHRoZSBvdXRwdXQ6ICovCisgICAgICAgICAgICAgICAgICBpZiAoKG91dHB1dCAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgICAgICAgIHBuZ19pbWFnZV93cml0ZV90b19maWxlKCZpbWFnZSwgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgMC8qY29udmVydF90b184Yml0Ki8sIGJ1ZmZlciwgMC8qcm93X3N0cmlkZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTC8qY29sb3JtYXAqLykpIHx8CisgICAgICAgICAgICAgICAgICAgICAgKG91dHB1dCA9PSBOVUxMICYmCisgICAgICAgICAgICAgICAgICAgICAgIHBuZ19pbWFnZV93cml0ZV90b19zdGRpbygmaW1hZ2UsIHN0ZG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAvKmNvbnZlcnRfdG9fOGJpdCovLCBidWZmZXIsIDAvKnJvd19zdHJpZGUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwvKmNvbG9ybWFwKi8pKSkKKyAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDA7CisKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic2ltcGxlb3Zlcjogd3JpdGUgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID09IE5VTEwgPyAic3Rkb3V0IiA6IG91dHB1dCwgaW1hZ2UubWVzc2FnZSk7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIC8qIGVsc2Ugc2ltcGxlb3Zlcl9wcm9jZXNzIHdyaXRlcyBhbiBlcnJvciBtZXNzYWdlICovCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic2ltcGxlb3ZlcjogcmVhZCAlczogJXNcbiIsIGFyZ3ZbMV0sCisgICAgICAgICAgICAgICAgICAgaW1hZ2UubWVzc2FnZSk7CisKKyAgICAgICAgICAgIGZyZWUoYnVmZmVyKTsKKyAgICAgICAgIH0KKworICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzaW1wbGVvdmVyOiBvdXQgb2YgbWVtb3J5OiAlbHUgYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylQTkdfSU1BR0VfU0laRShpbWFnZSkpOworCisgICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSBvbmx5IHBsYWNlIHdoZXJlIGEgJ2ZyZWUnIGlzIHJlcXVpcmVkOyBsaWJwbmcgZG9lcworICAgICAgICAgICAgICogdGhlIGNsZWFudXAgb24gZXJyb3IgYW5kIHN1Y2Nlc3MsIGJ1dCBpbiB0aGlzIGNhc2Ugd2UgY291bGRuJ3QKKyAgICAgICAgICAgICAqIGNvbXBsZXRlIHRoZSByZWFkIGJlY2F1c2Ugb2YgcnVubmluZyBvdXQgb2YgbWVtb3J5LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwbmdfaW1hZ2VfZnJlZSgmaW1hZ2UpOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICAvKiBGYWlsZWQgdG8gcmVhZCB0aGUgZmlyc3QgYXJndW1lbnQ6ICovCisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNpbXBsZW92ZXI6ICVzOiAlc1xuIiwgYXJndlsxXSwgaW1hZ2UubWVzc2FnZSk7CisgICAgICB9CisgICB9CisKKyAgIGVsc2UKKyAgIHsKKyAgICAgIC8qIFVzYWdlIG1lc3NhZ2UgKi8KKyAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgInNpbXBsZW92ZXI6IHVzYWdlOiBzaW1wbGVvdmVyIGJhY2tncm91bmQucG5nIFtvdXRwdXQucG5nXVxuIgorICAgICAgICAgIiAgT3V0cHV0ICdiYWNrZ3JvdW5kLnBuZycgYXMgYSAyNC1iaXQgUkdCIFBORyBmaWxlIGluICdvdXRwdXQucG5nJ1xuIgorICAgICAgICAgIiAgIG9yLCBpZiBub3QgZ2l2ZW4sIHN0ZG91dC4gICdiYWNrZ3JvdW5kLnBuZycgd2lsbCBiZSBjb21wb3NpdGVkXG4iCisgICAgICAgICAiICAgb24gZnVsbHkgc2F0dXJhdGVkIGdyZWVuLlxuIgorICAgICAgICAgIlxuIgorICAgICAgICAgIiAgT3B0aW9uYWxseSwgYmVmb3JlIG91dHB1dCwgcHJvY2VzcyBhZGRpdGlvbmFsIFBORyBmaWxlczpcbiIKKyAgICAgICAgICJcbiIKKyAgICAgICAgICIgICAtLXNwcml0ZT13aWR0aCxoZWlnaHQsbmFtZSB7Wy0tYXQ9eCx5XSB7c3ByaXRlLnBuZ319XG4iCisgICAgICAgICAiICAgIFByb2R1Y2UgYSB0cmFuc3BhcmVudCBzcHJpdGUgb2Ygc2l6ZSAod2lkdGgsaGVpZ2h0KSBhbmQgd2l0aFxuIgorICAgICAgICAgIiAgICAgbmFtZSAnbmFtZScuXG4iCisgICAgICAgICAiICAgIEZvciBlYWNoIHNwcml0ZS5wbmcgY29tcG9zaXRlIGl0IHVzaW5nIGEgUG9ydGVyLUR1ZmYgJ092ZXInXG4iCisgICAgICAgICAiICAgICBvcGVyYXRpb24gYXQgb2Zmc2V0ICh4LHkpIGluIHRoZSBzcHJpdGUgKGRlZmF1bHRpbmcgdG8gKDAsMCkpLlxuIgorICAgICAgICAgIiAgICAgSW5wdXQgUE5HcyB3aWxsIGJlIHRydW5jYXRlZCB0byB0aGUgYXJlYSBvZiB0aGUgc3ByaXRlLlxuIgorICAgICAgICAgIlxuIgorICAgICAgICAgIiAgIC0tYWRkPSduYW1lJyB7eCx5fVxuIgorICAgICAgICAgIiAgICBPcHRpb25hbGx5LCBiZWZvcmUgb3V0cHV0LCBjb21wb3NpdGUgYSBzcHJpdGUsICduYW1lJywgd2hpY2hcbiIKKyAgICAgICAgICIgICAgIG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgcHJvZHVjZWQgdXNpbmcgLS1zcHJpdGUsIGF0IGVhY2hcbiIKKyAgICAgICAgICIgICAgIG9mZnNldCAoeCx5KSBpbiB0aGUgb3V0cHV0IGltYWdlLiAgRWFjaCBzcHJpdGUgbXVzdCBmaXRcbiIKKyAgICAgICAgICIgICAgIGNvbXBsZXRlbHkgd2l0aGluIHRoZSBvdXRwdXQgaW1hZ2UuXG4iCisgICAgICAgICAiXG4iCisgICAgICAgICAiICBQTkcgZmlsZXMgYXJlIHByb2Nlc3NlZCBpbiB0aGUgb3JkZXIgdGhleSBvY2N1ciBvbiB0aGUgY29tbWFuZFxuIgorICAgICAgICAgIiAgbGluZSBhbmQgdGh1cyB0aGUgZmlyc3QgUE5HIHByb2Nlc3NlZCBhcHBlYXJzIGFzIHRoZSBib3R0b21tb3N0XG4iCisgICAgICAgICAiICBpbiB0aGUgb3V0cHV0IGltYWdlLlxuIik7CisgICB9CisKKyAgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLyogU0lNUExJRklFRF9SRUFEICovCmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9ncmVnYm9vay9DT1BZSU5HIGIvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svQ09QWUlORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2U5Nzc0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svQ09QWUlORwpAQCAtMCwwICsxLDM0MCBAQAorICAgICAgICAgICAgICAgICAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQorCisgQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCitzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcworR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KK3VzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKK3RoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bworeW91ciBwcm9ncmFtcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAoraWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCithbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCitUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQorZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKK2dyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoreW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKK3NvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKK3JpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCisoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAorZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KKworICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgordGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKK3NvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQord2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KK3RoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCithdXRob3JzJyByZXB1dGF0aW9ucy4KKworICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQorcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQorcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQorcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55CitwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LgorDAorICAgICAgICAgICAgICAgICAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucworYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKK3JlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgorbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKK3RoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCitlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgorbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgordGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKK0FjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCitpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KK1doZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncworc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Citjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCitjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCitub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7CithbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgorICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQorICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCisgICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQorICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKKyAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCisgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCisgICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCisgICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgorICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCisgICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKKyAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCisgICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCisMCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCit3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAordW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQorICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCisgICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQorICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCisgICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKKyAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKK2NvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Cithc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KK2NvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKK3NwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQorYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKK2Zvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAoraXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCithY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50CithY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKwwKKyAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0CitvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKK3ZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KK0hvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAorcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KK3RoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwordGhpcyBMaWNlbnNlLgorCisgIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KK2FwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCitjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKwwKKyAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQorbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCit0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCitjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKK3RoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CitsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCitlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgordGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4KKworICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCit0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcworbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKK29mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKK29mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk8gV0FSUkFOVFkKKworICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKK0ZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgorT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUworUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKK09SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCitUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCitQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKK1JFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKK1JFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCitJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKK09VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQorWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKK1BST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCisgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKyAgICAgICAgICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIHllYXIgIG5hbWUgb2YgYXV0aG9yCisgICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQorYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCisgIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Citjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKK2xpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9ncmVnYm9vay9MSUNFTlNFIGIvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTU2NzE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svTElDRU5TRQpAQCAtMCwwICsxLDUwIEBACisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwOCBHcmVnIFJvZWxvZnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcywiIHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQsCisgICAgICBleHByZXNzIG9yIGltcGxpZWQuICBJbiBubyBldmVudCBzaGFsbCB0aGUgYXV0aG9yIG9yIGNvbnRyaWJ1dG9ycworICAgICAgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgaW4gYW55IHdheSBmcm9tIHRoZSB1c2Ugb2YKKyAgICAgIHRoaXMgc29mdHdhcmUuCisKKyAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIERVQUwtTElDRU5TRUQuICBZb3UgbWF5IG1vZGlmeSBhbmQvb3IKKyAgICAgIHJlZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2Ygb25lIG9mIHRoZQorICAgICAgZm9sbG93aW5nIHR3byBsaWNlbnNlcyAoYXQgeW91ciBvcHRpb24pOgorCisKKyAgICAgIExJQ0VOU0UgMSAoIkJTRC1saWtlIHdpdGggYWR2ZXJ0aXNpbmcgY2xhdXNlIik6CisKKyAgICAgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICAgICAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZQorICAgICAgaXQgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCisgICAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgICAgbm90aWNlLCBkaXNjbGFpbWVyLCBhbmQgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMuCisgICAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgICAgbm90aWNlLCBkaXNjbGFpbWVyLCBhbmQgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YS0KKyAgICAgICAgIHRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAgICAgICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorCisgICAgICAgICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEdyZWcgUm9lbG9mcworICAgICAgICAgICAgYW5kIGNvbnRyaWJ1dG9ycyBmb3IgdGhlIGJvb2ssICJQTkc6IFRoZSBEZWZpbml0aXZlIEd1aWRlLCIKKyAgICAgICAgICAgIHB1Ymxpc2hlZCBieSBPJ1JlaWxseSBhbmQgQXNzb2NpYXRlcy4KKworCisgICAgICBMSUNFTlNFIDIgKEdOVSBHUEwgdjIgb3IgbGF0ZXIpOgorCisgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgICAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL2dyZWdib29rL01ha2VmaWxlLm1pbmd3MzIgYi9saWJwbmcvY29udHJpYi9ncmVnYm9vay9NYWtlZmlsZS5taW5ndzMyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhM2ZmNjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9ncmVnYm9vay9NYWtlZmlsZS5taW5ndzMyCkBAIC0wLDAgKzEsMTMxIEBACisjIFNhbXBsZSBtYWtlZmlsZSBmb3IgcnBuZy13aW4gLyBycG5nMi13aW4gLyB3cG5nIHVzaW5nIG1pbmd3MzItZ2NjIGFuZCBtYWtlLgorIyBHcmVnIFJvZWxvZnMKKyMgTGFzdCBtb2RpZmllZDogIDIgSnVuZSAyMDA3CisjCisjCVRoZSBwcm9ncmFtcyBidWlsdCBieSB0aGlzIG1ha2VmaWxlIGFyZSBkZXNjcmliZWQgaW4gdGhlIGJvb2ssCisjCSJQTkc6ICBUaGUgRGVmaW5pdGl2ZSBHdWlkZSwiIGJ5IEdyZWcgUm9lbG9mcyAoTydSZWlsbHkgYW5kCisjCUFzc29jaWF0ZXMsIDE5OTkpLiAgR28gYnV5IGEgY29weSwgZWg/ICBXZWxsLCBPSywgaXQncyBub3QKKyMJZ2VuZXJhbGx5IGZvciBzYWxlIGFueW1vcmUsIGJ1dCBpdCdzIHRoZSB0aG91Z2h0IHRoYXQgY291bnRzLAorIwlyaWdodD8gIChIaW50OiAgaHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9wbmcvYm9vay8gKQorIworIyBJbnZva2UgdGhpcyBtYWtlZmlsZSBmcm9tIGEgRE9TLXByb21wdCB3aW5kb3cgdmlhOgorIworIwltYWtlIC1mIE1ha2VmaWxlLm1pbmd3MzIKKyMKKyMgVGhpcyBtYWtlZmlsZSBhc3N1bWVzIGxpYnBuZyBhbmQgemxpYiBoYXZlIGFscmVhZHkgYmVlbiBidWlsdCBvciBkb3dubG9hZGVkCisjIGFuZCBhcmUgaW4gc3ViZGlyZWN0b3JpZXMgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIGN1cnJlbnQgc3ViZGlyZWN0b3J5CisjIChhcyBpbmRpY2F0ZWQgYnkgdGhlIFBOR0RJUiBhbmQgWkRJUiBtYWNyb3MgYmVsb3cpLiAgSXQgbWFrZXMgbm8gYXNzdW1wdGlvbnMKKyMgYXQgYWxsIGFib3V0IHRoZSBtaW5ndzMyIGluc3RhbGxhdGlvbiB0cmVlIChXMzJESVIpLiAgRWRpdCBhcyBhcHByb3ByaWF0ZS4KKyMKKyMgTm90ZSB0aGF0IHRoZSBuYW1lcyBvZiB0aGUgZHluYW1pYyBhbmQgc3RhdGljIGxpYnBuZyBhbmQgemxpYiBsaWJyYXJpZXMKKyMgdXNlZCBiZWxvdyBtYXkgY2hhbmdlIGluIGxhdGVyIHJlbGVhc2VzIG9mIHRoZSBsaWJyYXJpZXMuICBUaGlzIG1ha2VmaWxlCisjIGJ1aWxkcyBib3RoIHN0YXRpY2FsbHkgYW5kIGR5bmFtaWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlcyBieSBkZWZhdWx0LgorIyAoWW91IG5lZWQgb25seSBvbmUgc2V0LCBidXQgZm9yIHRlc3RpbmcgaXQgY2FuIGJlIGhhbmR5IHRvIGhhdmUgYm90aC4pCisKKworIyBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI1BOR0RJUiA9IC4uLy4uIwkJZm9yIGxpYnBuZy14Lnkuei9jb250cmliL2dyZWdib29rIGJ1aWxkcworUE5HRElSID0gLi4vbGlicG5nLXdpbjMyCitQTkdJTkMgPSAtSSQoUE5HRElSKQorUE5HTElCZCA9ICQoUE5HRElSKS9saWJwbmcuZGxsLmEJIyBkeW5hbWljYWxseSBsaW5rZWQKK1BOR0xJQnMgPSAkKFBOR0RJUikvbGlicG5nLmEJCSMgc3RhdGljYWxseSBsaW5rZWQsIGxvY2FsIGxpYnBuZworCisjWkRJUiA9IC4uLy4uLy4uL3psaWItd2luMzIjCWZvciBsaWJwbmcteC55LnovY29udHJpYi9ncmVnYm9vayBidWlsZHMKK1pESVIgPSAuLi96bGliLXdpbjMyCitaSU5DID0gLUkkKFpESVIpCitaTElCZCA9ICQoWkRJUikvbGliemRsbC5hCitaTElCcyA9ICQoWkRJUikvbGliei5hCisKKyMgY2hhbmdlIHRoaXMgdG8gYmUgdGhlIHBhdGggd2hlcmUgbWluZ3czMiBpbnN0YWxscyBpdHMgc3R1ZmY6CitXMzJESVIgPQorI1czMkRJUiA9IC91c3IvbG9jYWwvY3Jvc3MtdG9vbHMvaTM4Ni1taW5ndzMybXN2YworVzMySU5DID0gLUkkKFczMkRJUikvaW5jbHVkZQorVzMyTElCID0gJChXMzJESVIpL2xpYi9saWJ1c2VyMzIuYSAkKFczMkRJUikvbGliL2xpYmdkaTMyLmEKKworQ0MgPSBnY2MKKyNDQyA9IGkzODYtbWluZ3czMm1zdmMtZ2NjICMJZS5nLiwgTGludXggLT4gV2luMzIgY3Jvc3MtY29tcGlsYXRpb24KK0xEID0gJChDQykKK1JNID0gcm0gLWYKK0NQUEZMQUdTID0gJChJTkNTKQorQ0ZMQUdTID0gLU8gLVdhbGwgJChNSU5HV19DQ0ZMQUdTKQorIyBbbm90ZSB0aGF0IC1XYWxsIGlzIGEgZ2NjLXNwZWNpZmljIGNvbXBpbGF0aW9uIGZsYWcgKCJtb3N0IHdhcm5pbmdzIG9uIildCisjIFstYW5zaSwgLXBlZGFudGljIGFuZCAtVyBjYW4gYWxzbyBiZSB1c2VkXQorTERGTEFHUyA9ICQoTUlOR1dfTERGTEFHUykKK08gPSAubworRSA9IC5leGUKKworSU5DUyA9ICQoUE5HSU5DKSAkKFpJTkMpICQoVzMySU5DKQorUkxJQlNkID0gJChQTkdMSUJkKSAkKFpMSUJkKSAkKFczMkxJQikgLWxtCitSTElCU3MgPSAkKFBOR0xJQnMpICQoWkxJQnMpICQoVzMyTElCKSAtbG0KK1dMSUJTZCA9ICQoUE5HTElCZCkgJChaTElCZCkKK1dMSUJTcyA9ICQoUE5HTElCcykgJChaTElCcykKKworUlBORyAgID0gcnBuZy13aW4KK1JQTkcyICA9IHJwbmcyLXdpbgorV1BORyAgID0gd3BuZworCitST0JKU2QgID0gJChSUE5HKSQoTykgcmVhZHBuZy5waWMkKE8pCitST0JKUzJkID0gJChSUE5HMikkKE8pIHJlYWRwbmcyLnBpYyQoTykKK1dPQkpTZCAgPSAkKFdQTkcpJChPKSB3cml0ZXBuZy5waWMkKE8pCisKK1JQTkdzICA9ICQoUlBORyktc3RhdGljCitSUE5HMnMgPSAkKFJQTkcyKS1zdGF0aWMKK1dQTkdzICA9ICQoV1BORyktc3RhdGljCisKK1JPQkpTcyAgPSAkKFJQTkcpJChPKSByZWFkcG5nJChPKQorUk9CSlMycyA9ICQoUlBORzIpJChPKSByZWFkcG5nMiQoTykKK1dPQkpTcyAgPSAkKFdQTkcpJChPKSB3cml0ZXBuZyQoTykKKworU1RBVElDX0VYRVMgID0gJChSUE5HcykkKEUpICQoUlBORzJzKSQoRSkgJChXUE5HcykkKEUpCitEWU5BTUlDX0VYRVMgPSAkKFJQTkcpJChFKSAkKFJQTkcyKSQoRSkgJChXUE5HKSQoRSkKKworRVhFUyA9ICQoU1RBVElDX0VYRVMpICQoRFlOQU1JQ19FWEVTKQorCisKKyMgaW1wbGljaXQgbWFrZSBydWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy5jJChPKToKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJDwKKworJS5waWMkKE8pOiAlLmMKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgLURQTkdfQlVJTERfRExMIC1vICRAICQ8CisKKworIyBkZXBlbmRlbmNpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYWxsOiAgJChFWEVTKQorCiskKFJQTkdzKSQoRSk6ICQoUk9CSlNzKQorCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChST0JKU3MpICQoUkxJQlNzKQorCiskKFJQTkcpJChFKTogJChST0JKU2QpCisJJChMRCkgJChMREZMQUdTKSAtbyAkQCAkKFJPQkpTZCkgJChSTElCU2QpCisKKyQoUlBORzJzKSQoRSk6ICQoUk9CSlMycykKKwkkKExEKSAkKExERkxBR1MpIC1vICRAICQoUk9CSlMycykgJChSTElCU3MpCisKKyQoUlBORzIpJChFKTogJChST0JKUzJkKQorCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChST0JKUzJkKSAkKFJMSUJTZCkKKworJChXUE5HcykkKEUpOiAkKFdPQkpTcykKKwkkKExEKSAkKExERkxBR1MpIC1vICRAICQoV09CSlNzKSAkKFdMSUJTcykKKworJChXUE5HKSQoRSk6ICQoV09CSlNkKQorCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChXT0JKU2QpICQoV0xJQlNkKQorCiskKFJQTkcpJChPKToJJChSUE5HKS5jIHJlYWRwbmcuaAorJChSUE5HMikkKE8pOgkkKFJQTkcyKS5jIHJlYWRwbmcyLmgKKyQoV1BORykkKE8pOgkkKFdQTkcpLmMgd3JpdGVwbmcuaAorCityZWFkcG5nJChPKSByZWFkcG5nLnBpYyQoTyk6CXJlYWRwbmcuYyByZWFkcG5nLmgKK3JlYWRwbmcyJChPKSByZWFkcG5nMi5waWMkKE8pOglyZWFkcG5nMi5jIHJlYWRwbmcyLmgKK3dyaXRlcG5nJChPKSB3cml0ZXBuZy5waWMkKE8pOgl3cml0ZXBuZy5jIHdyaXRlcG5nLmgKKworCisjIG1haW50ZW5hbmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGVhbjoKKwkkKFJNKSAkKEVYRVMpCisJJChSTSkgJChST0JKU3MpICQoUk9CSlMycykgJChXT0JKU3MpCisJJChSTSkgJChST0JKU2QpICQoUk9CSlMyZCkgJChXT0JKU2QpCmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9ncmVnYm9vay9NYWtlZmlsZS5zZ2kgYi9saWJwbmcvY29udHJpYi9ncmVnYm9vay9NYWtlZmlsZS5zZ2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRkNjFiNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL2dyZWdib29rL01ha2VmaWxlLnNnaQpAQCAtMCwwICsxLDEwNSBAQAorIyBTYW1wbGUgbWFrZWZpbGUgZm9yIHJwbmcteCAvIHJwbmcyLXggLyB3cG5nIGZvciBTR0kgdXNpbmcgY2MgYW5kIG1ha2UuCisjIEdyZWcgUm9lbG9mcworIyBMYXN0IG1vZGlmaWVkOiAgNyBNYXJjaCAyMDAyCisjCisjCVRoZSBwcm9ncmFtcyBidWlsdCBieSB0aGlzIG1ha2VmaWxlIGFyZSBkZXNjcmliZWQgaW4gdGhlIGJvb2ssCisjCSJQTkc6ICBUaGUgRGVmaW5pdGl2ZSBHdWlkZSwiIGJ5IEdyZWcgUm9lbG9mcyAoTydSZWlsbHkgYW5kCisjCUFzc29jaWF0ZXMsIDE5OTkpLiAgR28gYnV5IGEgY29weSwgZWg/ICBCdXkgc29tZSBmb3IgZnJpZW5kcworIwlhbmQgZmFtaWx5LCB0b28uICAoTm90IHRoYXQgdGhpcyBpcyBhIGJsYXRhbnQgcGx1ZyBvciBhbnl0aGluZy4pCisjCisjIEludm9rZSB0aGlzIG1ha2VmaWxlIGZyb20gYSBzaGVsbCBwcm9tcHQgaW4gdGhlIHVzdWFsIHdheTsgZm9yIGV4YW1wbGU6CisjCisjCW1ha2UgLWYgTWFrZWZpbGUuc2dpCisjCisjIFRoaXMgbWFrZWZpbGUgYXNzdW1lcyBsaWJwbmcgYW5kIHpsaWIgaGF2ZSBhbHJlYWR5IGJlZW4gYnVpbHQgb3IgZG93bmxvYWRlZAorIyBhbmQgYXJlIGJvdGggaW5zdGFsbGVkIGluIC91c3IvbG9jYWwve2luY2x1ZGUsbGlifSAoYXMgaW5kaWNhdGVkIGJ5IHRoZQorIyBQTkcqIGFuZCBaKiBtYWNyb3MgYmVsb3cpLiAgRWRpdCBhcyBhcHByb3ByaWF0ZS0tY2hvb3NlIG9ubHkgT05FIGVhY2ggb2YKKyMgdGhlIFBOR0lOQywgUE5HTElCLCBaSU5DIGFuZCBaTElCIGxpbmVzLgorIworIyBUaGlzIG1ha2VmaWxlIGJ1aWxkcyBkeW5hbWljYWxseSBsaW5rZWQgZXhlY3V0YWJsZXMgKGFnYWluc3QgbGlicG5nIGFuZCB6bGliLAorIyB0aGF0IGlzKSwgYnV0IHRoYXQgY2FuIGJlIGNoYW5nZWQgYnkgdW5jb21tZW50aW5nIHRoZSBhcHByb3ByaWF0ZSBQTkdMSUIgYW5kCisjIFpMSUIgbGluZXMuCisKKworIyBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUE5HSU5DID0gLUkvdXNyL2xvY2FsL2luY2x1ZGUvbGlicG5nMTYKK1BOR0xJQiA9IC1ML3Vzci9sb2NhbC9saWIgLWxwbmcxNgkgICMgZHluYW1pY2FsbHkgbGlua2VkIGFnYWluc3QgbGlicG5nCisjUE5HTElCID0gL3Vzci9sb2NhbC9saWIvbGlicG5nMTYuYSAjIHN0YXRpY2FsbHkgbGlua2VkIGFnYWluc3QgbGlicG5nCisjIG9yOgorI1BOR0lOQyA9IC1JLi4vLi4KKyNQTkdMSUIgPSAtTC4uLy4uIC1scG5nCisjUE5HTElCID0gLi4vLi4vbGlicG5nLmEKKworWklOQyA9IC1JL3Vzci9sb2NhbC9pbmNsdWRlCitaTElCID0gLUwvdXNyL2xvY2FsL2xpYiAtbHoJCSMgZHluYW1pY2FsbHkgbGlua2VkIGFnYWluc3QgemxpYgorI1pMSUIgPSAvdXNyL2xvY2FsL2xpYi9saWJ6LmEJCSMgc3RhdGljYWxseSBsaW5rZWQgYWdhaW5zdCB6bGliCisjWklOQyA9IC1JLi4vemxpYgorI1pMSUIgPSAtTC4uL3psaWIgLWx6CisjWkxJQiA9IC4uLy4uLy4uL3psaWIvbGliei5hCisKK1hJTkMgPSAtSS91c3IvaW5jbHVkZS9YMTEJCSMgb2xkLXN0eWxlLCBzdG9jayBYIGRpc3RyaWJ1dGlvbnMKK1hMSUIgPSAtTC91c3IvbGliL1gxMSAtbFgxMQorI1hJTkMgPSAtSS91c3Ivb3Blbndpbi9pbmNsdWRlICAgIAkjIFN1biB3b3Jrc3RhdGlvbnMgKE9wZW5XaW5kb3dzKQorI1hMSUIgPSAtTC91c3Ivb3Blbndpbi9saWIgLWxYMTEKKyNYSU5DID0gLUkvdXNyL1gxMVI2L2luY2x1ZGUJCSMgbmV3IFggZGlzdHJpYnV0aW9ucyAoWEZyZWU4NiwgZXRjLikKKyNYTElCID0gLUwvdXNyL1gxMVI2L2xpYiAtbFgxMQorCitJTkNTID0gJChQTkdJTkMpICQoWklOQykgJChYSU5DKQorUkxJQlMgPSAkKFBOR0xJQikgJChaTElCKSAkKFhMSUIpIC1sbQorV0xJQlMgPSAkKFBOR0xJQikgJChaTElCKQorCitDQyA9IGNjCitMRCA9IGNjCitSTSA9IHJtIC1mCisjIEFCSSBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoYXQgdXNlZCB0byBidWlsZCBsaWJwbmcuCitBQkkgPQorQ1BQRkxBR1MgPQorQ0ZMQUdTID0gJChBQkkpIC1PIC1mdWxsd2FybiAkKElOQ1MpCitMREZMQUdTID0gJChBQkkpCitPID0gLm8KK0UgPQorCitSUE5HICA9IHJwbmcteAorUlBORzIgPSBycG5nMi14CitXUE5HICA9IHdwbmcKKworUk9CSlMgID0gJChSUE5HKSQoTykgcmVhZHBuZyQoTykKK1JPQkpTMiA9ICQoUlBORzIpJChPKSByZWFkcG5nMiQoTykKK1dPQkpTICA9ICQoV1BORykkKE8pIHdyaXRlcG5nJChPKQorCitFWEVTID0gJChSUE5HKSQoRSkgJChSUE5HMikkKEUpICQoV1BORykkKEUpCisKKworIyBpbXBsaWNpdCBtYWtlIHJ1bGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLmMkKE8pOgorCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkPAorCisKKyMgZGVwZW5kZW5jaWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FsbDogICQoRVhFUykKKworJChSUE5HKSQoRSk6ICQoUk9CSlMpCisJJChMRCkgJChMREZMQUdTKSAtbyAkQCAkKFJPQkpTKSAkKFJMSUJTKQorCiskKFJQTkcyKSQoRSk6ICQoUk9CSlMyKQorCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChST0JKUzIpICQoUkxJQlMpCisKKyQoV1BORykkKEUpOiAkKFdPQkpTKQorCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChXT0JKUykgJChXTElCUykKKworJChSUE5HKSQoTyk6CSQoUlBORykuYyByZWFkcG5nLmgKKyQoUlBORzIpJChPKToJJChSUE5HMikuYyByZWFkcG5nMi5oCiskKFdQTkcpJChPKToJJChXUE5HKS5jIHdyaXRlcG5nLmgKKworcmVhZHBuZyQoTyk6CXJlYWRwbmcuYyByZWFkcG5nLmgKK3JlYWRwbmcyJChPKToJcmVhZHBuZzIuYyByZWFkcG5nMi5oCit3cml0ZXBuZyQoTyk6CXdyaXRlcG5nLmMgd3JpdGVwbmcuaAorCisKKyMgbWFpbnRlbmFuY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsZWFuOgorCSQoUk0pICQoRVhFUykgJChST0JKUykgJChST0JKUzIpICQoV09CSlMpCmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9ncmVnYm9vay9NYWtlZmlsZS51bnggYi9saWJwbmcvY29udHJpYi9ncmVnYm9vay9NYWtlZmlsZS51bngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE3M2UwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL2dyZWdib29rL01ha2VmaWxlLnVueApAQCAtMCwwICsxLDEzNCBAQAorIyBTYW1wbGUgbWFrZWZpbGUgZm9yIHJwbmcteCAvIHJwbmcyLXggLyB3cG5nIHVzaW5nIGdjYyBhbmQgbWFrZS4KKyMgR3JlZyBSb2Vsb2ZzCisjIExhc3QgbW9kaWZpZWQ6ICAyIEp1bmUgMjAwNworIworIwlUaGUgcHJvZ3JhbXMgYnVpbHQgYnkgdGhpcyBtYWtlZmlsZSBhcmUgZGVzY3JpYmVkIGluIHRoZSBib29rLAorIwkiUE5HOiAgVGhlIERlZmluaXRpdmUgR3VpZGUsIiBieSBHcmVnIFJvZWxvZnMgKE8nUmVpbGx5IGFuZAorIwlBc3NvY2lhdGVzLCAxOTk5KS4gIEdvIGJ1eSBhIGNvcHksIGVoPyAgV2VsbCwgT0ssIGl0J3Mgbm90CisjCWdlbmVyYWxseSBmb3Igc2FsZSBhbnltb3JlLCBidXQgaXQncyB0aGUgdGhvdWdodCB0aGF0IGNvdW50cywKKyMJcmlnaHQ/ICAoSGludDogIGh0dHA6Ly93d3cubGlicG5nLm9yZy9wdWIvcG5nL2Jvb2svICkKKyMKKyMgSW52b2tlIHRoaXMgbWFrZWZpbGUgZnJvbSBhIHNoZWxsIHByb21wdCBpbiB0aGUgdXN1YWwgd2F5OyBmb3IgZXhhbXBsZToKKyMKKyMJbWFrZSAtZiBNYWtlZmlsZS51bngKKyMKKyMgVGhpcyBtYWtlZmlsZSBhc3N1bWVzIGxpYnBuZyBhbmQgemxpYiBoYXZlIGFscmVhZHkgYmVlbiBidWlsdCBvciBkb3dubG9hZGVkCisjIGFuZCBhcmUgaW5zdGFsbGVkIGluIC91c3IvbG9jYWwve2luY2x1ZGUsbGlifSBvciBhcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJ5CisjIHRoZSBQTkcqIGFuZCBaKiBtYWNyb3MgYmVsb3cuICBFZGl0IGFzIGFwcHJvcHJpYXRlLS1jaG9vc2Ugb25seSBPTkUgZWFjaCBvZgorIyB0aGUgUE5HSU5DLCBQTkdMSUJkLCBQTkdMSUJzLCBaSU5DLCBaTElCZCBhbmQgWkxJQnMgbGluZXMuCisjCisjIFRoaXMgbWFrZWZpbGUgYnVpbGRzIGJvdGggZHluYW1pY2FsbHkgYW5kIHN0YXRpY2FsbHkgbGlua2VkIGV4ZWN1dGFibGVzCisjIChhZ2FpbnN0IGxpYnBuZyBhbmQgemxpYiwgdGhhdCBpcyksIGJ1dCB0aGF0IGNhbiBiZSBjaGFuZ2VkIGJ5IG1vZGlmeWluZworIyB0aGUgIkVYRVMgPSIgbGluZS4gIChZb3UgbmVlZCBvbmx5IG9uZSBzZXQsIGJ1dCBmb3IgdGVzdGluZyBpdCBjYW4gYmUgaGFuZHkKKyMgdG8gaGF2ZSBib3RoLikKKworCisjIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjUE5HRElSID0gL3Vzci9sb2NhbC9saWIKKyNQTkdJTkMgPSAtSS91c3IvbG9jYWwvaW5jbHVkZS9saWJwbmcxNgorI1BOR0xJQmQgPSAtTCQoUE5HRElSKSAtbHBuZzE2ICMgZHluYW1pY2FsbHkgbGlua2VkLCBpbnN0YWxsZWQgbGlicG5nCisjUE5HTElCcyA9ICQoUE5HRElSKS9saWJwbmcxNi5hICMgc3RhdGljYWxseSBsaW5rZWQsIGluc3RhbGxlZCBsaWJwbmcKKyMgb3I6CitQTkdESVIgPSAuLi8uLiMJdGhpcyBvbmUgaXMgZm9yIGxpYnBuZy14Lnkuei9jb250cmliL2dyZWdib29rIGJ1aWxkcworI1BOR0RJUiA9IC4uL2xpYnBuZworUE5HSU5DID0gLUkkKFBOR0RJUikKK1BOR0xJQmQgPSAtV2wsLXJwYXRoLCQoUE5HRElSKSAtTCQoUE5HRElSKSAtbHBuZzE2CSMgZHluYW1pY2FsbHkgbGlua2VkCitQTkdMSUJzID0gJChQTkdESVIpL2xpYnBuZy5hCQkjIHN0YXRpY2FsbHkgbGlua2VkLCBsb2NhbCBsaWJwbmcKKworWkRJUiA9IC91c3IvbG9jYWwvbGliCisjWkRJUiA9IC91c3IvbGliNjQKK1pJTkMgPSAtSS91c3IvbG9jYWwvaW5jbHVkZQorWkxJQmQgPSAtTCQoWkRJUikgLWx6CQkJIyBkeW5hbWljYWxseSBsaW5rZWQgYWdhaW5zdCB6bGliCitaTElCcyA9ICQoWkRJUikvbGliei5hCQkJIyBzdGF0aWNhbGx5IGxpbmtlZCBhZ2FpbnN0IHpsaWIKKyMgb3I6CisjWkRJUiA9IC4uL3psaWIKKyNaSU5DID0gLUkkKFpESVIpCisjWkxJQmQgPSAtV2wsLXJwYXRoLCQoWkRJUikgLUwkKFpESVIpIC1seiAgIyAtcnBhdGggYWxsb3dzIGluLXBsYWNlIHRlc3RpbmcKKyNaTElCcyA9ICQoWkRJUikvbGliei5hCisKKyNYSU5DID0gLUkvdXNyL2luY2x1ZGUJCQkjIG9sZC1zdHlsZSwgc3RvY2sgWCBkaXN0cmlidXRpb25zCisjWExJQiA9IC1ML3Vzci9saWIvWDExIC1sWDExCQkjICAoaW5jbHVkaW5nIFNHSSBJUklYKQorI1hJTkMgPSAtSS91c3Ivb3Blbndpbi9pbmNsdWRlCQkjIFN1biB3b3Jrc3RhdGlvbnMgKE9wZW5XaW5kb3dzKQorI1hMSUIgPSAtTC91c3Ivb3Blbndpbi9saWIgLWxYMTEKK1hJTkMgPSAtSS91c3IvWDExUjYvaW5jbHVkZQkJIyBuZXcgWCBkaXN0cmlidXRpb25zIChYLm9yZywgZXRjLikKK1hMSUIgPSAtTC91c3IvWDExUjYvbGliIC1sWDExCisjWExJQiA9IC1ML3Vzci9YMTFSNi9saWI2NCAtbFgxMQkjIGUuZy4sIFJlZCBIYXQgb24gQU1ENjQKKworSU5DUyA9ICQoUE5HSU5DKSAkKFpJTkMpICQoWElOQykKK1JMSUJTZCA9ICQoUE5HTElCZCkgJChaTElCZCkgJChYTElCKSAtbG0KK1JMSUJTcyA9ICQoUE5HTElCcykgJChaTElCcykgJChYTElCKSAtbG0KK1dMSUJTZCA9ICQoUE5HTElCZCkgJChaTElCZCkgLWxtCitXTElCU3MgPSAkKFBOR0xJQnMpICQoWkxJQnMpIC1sbQorCitDQyA9IGdjYworTEQgPSBnY2MKK1JNID0gcm0gLWYKK0NQUEZMQUdTID0gJChJTkNTKSAtREZFQVRVUkVfTE9PUAorQ0ZMQUdTID0gLU8gLVdhbGwKKyNDRkxBR1MgPSAtTyAtVyAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYyAtYW5zaQorIyBbbm90ZSB0aGF0IC1XYWxsIGlzIGEgZ2NjLXNwZWNpZmljIGNvbXBpbGF0aW9uIGZsYWcgKCJtb3N0IHdhcm5pbmdzIG9uIildCisjIFstYW5zaSwgLXBlZGFudGljLCAtV2V4dHJhLCBhbmQgLVcgY2FuIGFsc28gYmUgdXNlZF0KK0xERkxBR1MgPQorTyA9IC5vCitFID0KKworUlBORyAgID0gcnBuZy14CitSUE5HMiAgPSBycG5nMi14CitXUE5HICAgPSB3cG5nCisKK1JQTkdzICA9ICQoUlBORyktc3RhdGljCitSUE5HMnMgPSAkKFJQTkcyKS1zdGF0aWMKK1dQTkdzICA9ICQoV1BORyktc3RhdGljCisKK1JPQkpTICA9ICQoUlBORykkKE8pIHJlYWRwbmckKE8pCitST0JKUzIgPSAkKFJQTkcyKSQoTykgcmVhZHBuZzIkKE8pCitXT0JKUyAgPSAkKFdQTkcpJChPKSB3cml0ZXBuZyQoTykKKworU1RBVElDX0VYRVMgID0gJChSUE5HcykkKEUpICQoUlBORzJzKSQoRSkgJChXUE5HcykkKEUpCitEWU5BTUlDX0VYRVMgPSAkKFJQTkcpJChFKSAkKFJQTkcyKSQoRSkgJChXUE5HKSQoRSkKKworRVhFUyA9ICQoU1RBVElDX0VYRVMpICQoRFlOQU1JQ19FWEVTKQorCisKKyMgaW1wbGljaXQgbWFrZSBydWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy5jJChPKToKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJDwKKworCisjIGRlcGVuZGVuY2llcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbGw6ICAkKEVYRVMpCisKKyQoUlBOR3MpJChFKTogJChST0JKUykKKwkkKExEKSAkKExERkxBR1MpIC1vICRAICQoUk9CSlMpICQoUkxJQlNzKQorCiskKFJQTkcpJChFKTogJChST0JKUykKKwkkKExEKSAkKExERkxBR1MpIC1vICRAICQoUk9CSlMpICQoUkxJQlNkKQorCiskKFJQTkcycykkKEUpOiAkKFJPQkpTMikKKwkkKExEKSAkKExERkxBR1MpIC1vICRAICQoUk9CSlMyKSAkKFJMSUJTcykKKworJChSUE5HMikkKEUpOiAkKFJPQkpTMikKKwkkKExEKSAkKExERkxBR1MpIC1vICRAICQoUk9CSlMyKSAkKFJMSUJTZCkKKworJChXUE5HcykkKEUpOiAkKFdPQkpTKQorCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChXT0JKUykgJChXTElCU3MpCisKKyQoV1BORykkKEUpOiAkKFdPQkpTKQorCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChXT0JKUykgJChXTElCU2QpCisKKyQoUlBORykkKE8pOgkkKFJQTkcpLmMgcmVhZHBuZy5oCiskKFJQTkcyKSQoTyk6CSQoUlBORzIpLmMgcmVhZHBuZzIuaAorJChXUE5HKSQoTyk6CSQoV1BORykuYyB3cml0ZXBuZy5oCisKK3JlYWRwbmckKE8pOglyZWFkcG5nLmMgcmVhZHBuZy5oCityZWFkcG5nMiQoTyk6CXJlYWRwbmcyLmMgcmVhZHBuZzIuaAord3JpdGVwbmckKE8pOgl3cml0ZXBuZy5jIHdyaXRlcG5nLmgKKworCisjIG1haW50ZW5hbmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGVhbjoKKwkkKFJNKSAkKEVYRVMpICQoUk9CSlMpICQoUk9CSlMyKSAkKFdPQkpTKQpkaWZmIC0tZ2l0IGEvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svTWFrZWZpbGUudzMyIGIvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svTWFrZWZpbGUudzMyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiN2RjZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9ncmVnYm9vay9NYWtlZmlsZS53MzIKQEAgLTAsMCArMSwxMTQgQEAKKyMgU2FtcGxlIG1ha2VmaWxlIGZvciBycG5nLXdpbiAvIHJwbmcyLXdpbiAvIHdwbmcgdXNpbmcgTVNWQyBhbmQgTk1BS0UuCisjIEdyZWcgUm9lbG9mcworIyBMYXN0IG1vZGlmaWVkOiAgMiBKdW5lIDIwMDcKKyMKKyMJVGhlIHByb2dyYW1zIGJ1aWx0IGJ5IHRoaXMgbWFrZWZpbGUgYXJlIGRlc2NyaWJlZCBpbiB0aGUgYm9vaywKKyMJIlBORzogIFRoZSBEZWZpbml0aXZlIEd1aWRlLCIgYnkgR3JlZyBSb2Vsb2ZzIChPJ1JlaWxseSBhbmQKKyMJQXNzb2NpYXRlcywgMTk5OSkuICBHbyBidXkgYSBjb3B5LCBlaD8gIFdlbGwsIE9LLCBpdCdzIG5vdAorIwlnZW5lcmFsbHkgZm9yIHNhbGUgYW55bW9yZSwgYnV0IGl0J3MgdGhlIHRob3VnaHQgdGhhdCBjb3VudHMsCisjCXJpZ2h0PyAgKEhpbnQ6ICBodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9ib29rLyApCisjCisjIEludm9rZSB0aGlzIG1ha2VmaWxlIGZyb20gYSBET1MgcHJvbXB0IHdpbmRvdyB2aWE6CisjCisjCSVkZXZzdHVkaW8lXHZjXGJpblx2Y3ZhcnMzMi5iYXQKKyMJbm1ha2UgLW5vbG9nbyAtZiBNYWtlZmlsZS53MzIKKyMKKyMgd2hlcmUgJWRldnN0dWRpbyUgaXMgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgZm9yIE1TVkMgLyBEZXZTdHVkaW8uICBJZgorIyB5b3UgZ2V0ICJlbnZpcm9ubWVudCBvdXQgb2Ygc3BhY2UiIGVycm9ycywgY3JlYXRlIGEgZGVza3RvcCBzaG9ydGN1dCB3aXRoCisjICJjOlx3aW5kb3dzXGNvbW1hbmQuY29tIC9lOjQwOTYiIGFzIHRoZSBwcm9ncmFtIGNvbW1hbmQgbGluZSBhbmQgc2V0IHRoZQorIyB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGlzIGRpcmVjdG9yeS4gIFRoZW4gZG91YmxlLWNsaWNrIHRvIG9wZW4gdGhlIG5ldworIyBET1MtcHJvbXB0IHdpbmRvdyB3aXRoIGEgYmlnZ2VyIGVudmlyb25tZW50IGFuZCByZXRyeSB0aGUgY29tbWFuZHMgYWJvdmUuCisjCisjIFRoaXMgbWFrZWZpbGUgYXNzdW1lcyBsaWJwbmcgYW5kIHpsaWIgaGF2ZSBhbHJlYWR5IGJlZW4gYnVpbHQgb3IgZG93bmxvYWRlZAorIyBhbmQgYXJlIGluIHN1YmRpcmVjdG9yaWVzIGF0IHRoZSBzYW1lIGxldmVsIGFzIHRoZSBjdXJyZW50IHN1YmRpcmVjdG9yeQorIyAoYXMgaW5kaWNhdGVkIGJ5IHRoZSBQTkdQQVRIIGFuZCBaUEFUSCBtYWNyb3MgYmVsb3cpLiAgRWRpdCBhcyBhcHByb3ByaWF0ZS4KKyMKKyMgTm90ZSB0aGF0IHRoZSBuYW1lcyBvZiB0aGUgZHluYW1pYyBhbmQgc3RhdGljIGxpYnBuZyBhbmQgemxpYiBsaWJyYXJpZXMKKyMgdXNlZCBiZWxvdyBtYXkgY2hhbmdlIGluIGxhdGVyIHJlbGVhc2VzIG9mIHRoZSBsaWJyYXJpZXMuICBUaGlzIG1ha2VmaWxlCisjIGJ1aWxkcyBzdGF0aWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlcywgYnV0IHRoYXQgY2FuIGJlIGNoYW5nZWQgYnkgdW5jb20tCisjIG1lbnRpbmcgdGhlIGFwcHJvcHJpYXRlIFBOR0xJQiBhbmQgWkxJQiBsaW5lcy4KKworIWluY2x1ZGUgPG50d2luMzIubWFrPgorCisKKyMgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1BOR1BBVEggPSAuLi9saWJwbmcKK1BOR0lOQyA9IC1JJChQTkdQQVRIKQorI1BOR0xJQiA9ICQoUE5HUEFUSCkvcG5nZGxsLmxpYgorUE5HTElCID0gJChQTkdQQVRIKS9saWJwbmcubGliCisKK1pQQVRIID0gLi4vemxpYgorWklOQyA9IC1JJChaUEFUSCkKKyNaTElCID0gJChaUEFUSCkvemxpYmRsbC5saWIKK1pMSUIgPSAkKFpQQVRIKS96bGlic3RhdC5saWIKKworV0lOTElCUyA9IC1kZWZhdWx0bGliOnVzZXIzMi5saWIgZ2RpMzIubGliCisjIFsicmVhbCIgYXBwcyBtYXkgYWxzbyBuZWVkIGNvbWN0bDMyLmxpYiwgY29tZGxnMzIubGliLCB3aW5tbS5saWIsIGV0Yy5dCisKK0lOQ1MgPSAkKFBOR0lOQykgJChaSU5DKQorUkxJQlMgPSAkKFBOR0xJQikgJChaTElCKSAkKFdJTkxJQlMpCitXTElCUyA9ICQoUE5HTElCKSAkKFpMSUIpCisKK0NDID0gY2wKK0xEID0gbGluaworUk0gPSBkZWwKK0NQUEZMQUdTID0gJChJTkNTKQorQ0ZMQUdTID0gLW5vbG9nbyAtTyAtVzMgJChjdmFycykKKyMgW25vdGUgdGhhdCAtVzMgaXMgYW4gTVNWQy1zcGVjaWZpYyBjb21waWxhdGlvbiBmbGFnICgiYWxsIHdhcm5pbmdzIG9uIildCisjIFtzZWUgJWRldnN0dWRpbyVcdmNcaW5jbHVkZVx3aW4zMi5tYWsgZm9yIGN2YXJzIG1hY3JvIGRlZmluaXRpb25dCitPID0gLm9iagorRSA9IC5leGUKKworUkxERkxBR1MgPSAtbm9sb2dvIC1zdWJzeXN0ZW06d2luZG93cworV0xERkxBR1MgPSAtbm9sb2dvCisKK1JQTkcgID0gcnBuZy13aW4KK1JQTkcyID0gcnBuZzItd2luCitXUE5HICA9IHdwbmcKKworUk9CSlMgID0gJChSUE5HKSQoTykgcmVhZHBuZyQoTykKK1JPQkpTMiA9ICQoUlBORzIpJChPKSByZWFkcG5nMiQoTykKK1dPQkpTICA9ICQoV1BORykkKE8pIHdyaXRlcG5nJChPKQorCitFWEVTID0gJChSUE5HKSQoRSkgJChSUE5HMikkKEUpICQoV1BORykkKEUpCisKKworIyBpbXBsaWNpdCBtYWtlIHJ1bGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLmMkKE8pOgorCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkPAorCisKKyMgZGVwZW5kZW5jaWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FsbDogICQoRVhFUykKKworJChSUE5HKSQoRSk6ICQoUk9CSlMpCisJJChMRCkgJChSTERGTEFHUykgLW91dDokQCAkKFJPQkpTKSAkKFJMSUJTKQorCiskKFJQTkcyKSQoRSk6ICQoUk9CSlMyKQorCSQoTEQpICQoUkxERkxBR1MpIC1vdXQ6JEAgJChST0JKUzIpICQoUkxJQlMpCisKKyQoV1BORykkKEUpOiAkKFdPQkpTKQorCSQoTEQpICQoV0xERkxBR1MpIC1vdXQ6JEAgJChXT0JKUykgJChXTElCUykKKworJChSUE5HKSQoTyk6CSQoUlBORykuYyByZWFkcG5nLmgKKyQoUlBORzIpJChPKToJJChSUE5HMikuYyByZWFkcG5nMi5oCiskKFdQTkcpJChPKToJJChXUE5HKS5jIHdyaXRlcG5nLmgKKworcmVhZHBuZyQoTyk6CXJlYWRwbmcuYyByZWFkcG5nLmgKK3JlYWRwbmcyJChPKToJcmVhZHBuZzIuYyByZWFkcG5nMi5oCit3cml0ZXBuZyQoTyk6CXdyaXRlcG5nLmMgd3JpdGVwbmcuaAorCisKKyMgbWFpbnRlbmFuY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsZWFuOgorIwlpZGVhbGx5IHdlIGNvdWxkIGp1c3QgZG8gdGhpczoKKyMJJChSTSkgJChFWEVTKSAkKFJPQkpTKSAkKFJPQkpTMikgJChXT0JKUykKKyMJLi4uYnV0IHRoZSBXaW5kb3dzICJERUwiIGNvbW1hbmQgaXMgbm9uZSB0b28gYnJpZ2h0LCBzbzoKKwkkKFJNKSByKiQoRSkKKwkkKFJNKSB3KiQoRSkKKwkkKFJNKSByKiQoTykKKwkkKFJNKSB3KiQoTykKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL2dyZWdib29rL1JFQURNRSBiL2xpYnBuZy9jb250cmliL2dyZWdib29rL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjFmNmEzCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svUkVBRE1FCkBAIC0wLDAgKzEsMTg2IEBACisgICAgICAgICAgICAgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICBQTkc6IFRoZSBEZWZpbml0aXZlIEd1aWRlCisgICAgICAgICAgICAgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2UgQ29kZQorCitDaGFwdGVycyAxMywgMTQgYW5kIDE1IG9mICJQTkc6IFRoZSBEZWZpbml0aXZlIEd1aWRlIiBkaXNjdXNzIHRocmVlIGZyZWUsCitjcm9zcy1wbGF0Zm9ybSBkZW1vIHByb2dyYW1zIHRoYXQgc2hvdyBob3cgdG8gdXNlIHRoZSBsaWJwbmcgcmVmZXJlbmNlCitsaWJyYXJ5OiAgcnBuZywgcnBuZzIgYW5kIHdwbmcuICBycG5nIGFuZCBycG5nMiBhcmUgdmlld2VyczsgdGhlIGZpcnN0IGlzCithIHZlcnkgc2ltcGxlIGV4YW1wbGUgdGhhdCB0aGF0IHNob3dzIGhvdyBhIHN0YW5kYXJkIGZpbGUtdmlld2VyIG1pZ2h0IHVzZQorbGlicG5nLCB3aGlsZSB0aGUgc2Vjb25kIGlzIGRlc2lnbmVkIHRvIHByb2Nlc3Mgc3RyZWFtaW5nIGRhdGEgYW5kIHNob3dzCitob3cgYSB3ZWIgYnJvd3NlciBtaWdodCBiZSB3cml0dGVuLiAgd3BuZyBpcyBhIHNpbXBsZSBjb21tYW5kLWxpbmUgcHJvZ3JhbQordGhhdCByZWFkcyBiaW5hcnkgUEdNIGFuZCBQUE0gZmlsZXMgKHRoZSBgYHJhdycnIGdyYXlzY2FsZSBhbmQgUkdCIHN1YnNldHMKK29mIFBCTVBMVVMvTmV0UEJNKSBhbmQgY29udmVydHMgdGhlbSB0byBQTkcuCisKK1RoZSBzb3VyY2UgY29kZSBmb3IgYWxsIHRocmVlIGRlbW8gcHJvZ3JhbXMgY3VycmVudGx5IGNvbXBpbGVzIHVuZGVyCitVbml4LCBPcGVuVk1TLCBhbmQgMzItYml0IFdpbmRvd3MuICAoU3BlY2lhbCB0aGFua3MgdG8gTWFydGluIFppbnNlciwKK3ppbnNlckBkZWN1cy5kZSwgZm9yIG1ha2luZyB0aGUgbmVjZXNzYXJ5IGNoYW5nZXMgZm9yIE9wZW5WTVMgYW5kIGZvcgorcHJvdmlkaW5nIGFuIGFwcHJvcHJpYXRlIGJ1aWxkIHNjcmlwdC4pICBCdWlsZCBpbnN0cnVjdGlvbnMgY2FuIGJlIGZvdW5kCitiZWxvdy4KKworRmlsZXM6CisKKyAgIFJFQURNRSAgICAgICAgICAgICB0aGlzIGZpbGUKKyAgIExJQ0VOU0UgICAgICAgICAgICB0ZXJtcyBvZiBkaXN0cmlidXRpb24gYW5kIHJldXNlIChCU0QtbGlrZSBvciBHTlUgR1BMKQorICAgQ09QWUlORyAgICAgICAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpCisKKyAgIE1ha2VmaWxlLnVueCAgICAgICBVbml4IG1ha2VmaWxlCisgICBNYWtlZmlsZS53MzIgICAgICAgV2luZG93cyAoTVNWQykgbWFrZWZpbGUKKyAgIG1ha2V2bXMuY29tICAgICAgICBPcGVuVk1TIGJ1aWxkIHNjcmlwdAorCisgICBycG5nLXdpbi5jICAgICAgICAgV2luZG93cyBmcm9udCBlbmQgZm9yIHRoZSBiYXNpYyB2aWV3ZXIKKyAgIHJwbmcteC5jICAgICAgICAgICBYIFdpbmRvdyBTeXN0ZW0gKFVuaXgsIE9wZW5WTVMpIGZyb250IGVuZAorICAgcmVhZHBuZy5jICAgICAgICAgIGdlbmVyaWMgYmFjayBlbmQgZm9yIHRoZSBiYXNpYyB2aWV3ZXIKKyAgIHJlYWRwbmcuaCAgICAgICAgICBoZWFkZXIgZmlsZSBmb3IgdGhlIGJhc2ljIHZpZXdlcgorCisgICBycG5nMi13aW4uYyAgICAgICAgV2luZG93cyBmcm9udCBlbmQgZm9yIHRoZSBwcm9ncmVzc2l2ZSB2aWV3ZXIKKyAgIHJwbmcyLXguYyAgICAgICAgICBYIGZyb250IGVuZCBmb3IgdGhlIHByb2dyZXNzaXZlIHZpZXdlcgorICAgcmVhZHBuZzIuYyAgICAgICAgIGdlbmVyaWMgYmFjayBlbmQgZm9yIHRoZSBwcm9ncmVzc2l2ZSB2aWV3ZXIKKyAgIHJlYWRwbmcyLmggICAgICAgICBoZWFkZXIgZmlsZSBmb3IgdGhlIHByb2dyZXNzaXZlIHZpZXdlcgorCisgICB3cG5nLmMgICAgICAgICAgICAgZ2VuZXJpYyAodGV4dCkgZnJvbnQgZW5kIGZvciB0aGUgY29udmVydGVyCisgICB3cml0ZXBuZy5jICAgICAgICAgZ2VuZXJpYyBiYWNrIGVuZCBmb3IgdGhlIGNvbnZlcnRlcgorICAgd3JpdGVwbmcuaCAgICAgICAgIGhlYWRlciBmaWxlIGZvciB0aGUgY29udmVydGVyCisKKyAgIHRvdWNhbi5wbmcgICAgICAgICB0cmFuc3BhcmVudCBQTkcgZm9yIHRlc3RpbmcgKGJ5IFN0ZWZhbiBTY2huZWlkZXIpCisKK05vdGUgdGhhdCwgYWx0aG91Z2ggdGhlIHByb2dyYW1zIGFyZSBkZXNpZ25lZCB0byBiZSBmdW5jdGlvbmFsLCB0aGVpcgorcHJpbWFyeSBwdXJwb3NlIGlzIHRvIGlsbHVzdHJhdGUgaG93IHRvIHVzZSBsaWJwbmcgdG8gYWRkIFBORyBzdXBwb3J0IHRvCitvdGhlciBwcm9ncmFtcy4gIEFzIHN1Y2gsIHRoZWlyIHVzZXIgaW50ZXJmYWNlcyBhcmUgY3J1ZGUgYW5kIGRlZmluaXRlbHkKK2FyZSBub3QgaW50ZW5kZWQgZm9yIGV2ZXJ5ZGF5IHVzZS4KKworUGxlYXNlIHNlZSBodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9wbmdib29rLmh0bWwgZm9yIGZ1cnRoZXIgaW5mb3ItCittYXRpb24gYW5kIGxpbmtzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgc291cmNlIGNvZGUsIGFuZCBDaGFwdGVycworMTMtMTUgb2YgdGhlIGJvb2sgZm9yIGRldGFpbGVkIGRpc2N1c3Npb24gb2YgdGhlIHRocmVlIHByb2dyYW1zLgorCitHcmVnIFJvZWxvZnMKK2h0dHA6Ly9wb2JveC5jb20vfm5ld3QvZ3JlZ19jb250YWN0Lmh0bWwKKzE2IE1hcmNoIDIwMDgKKworCitCVUlMRCBJTlNUUlVDVElPTlMKKworIC0gUHJlcmVxdWlzaXRlcyAoaW4gb3JkZXIgb2YgY29tcGlsYXRpb24pOgorCisgICAgICAtIHpsaWIgICAgICAgICAgICBodHRwOi8vemxpYi5uZXQvCisgICAgICAtIGxpYnBuZyAgICAgICAgICBodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9saWJwbmcuaHRtbAorICAgICAgLSBwbmdib29rICAgICAgICAgaHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9wbmcvYm9vay9zb3VyY2VzLmh0bWwKKworICAgICBUaGUgcG5nYm9vayBkZW1vIHByb2dyYW1zIGFyZSBleHBsaWNpdGx5IGRlc2lnbmVkIHRvIGRlbW9uc3RyYXRlIHByb3BlcgorICAgICBjb2RpbmcgdGVjaG5pcXVlcyBmb3IgdXNpbmcgdGhlIGxpYnBuZyByZWZlcmVuY2UgbGlicmFyeS4gIEFzIGEgcmVzdWx0LAorICAgICB5b3UgbmVlZCB0byBkb3dubG9hZCBhbmQgYnVpbGQgYm90aCB6bGliIChvbiB3aGljaCBsaWJwbmcgZGVwZW5kcykgYW5kCisgICAgIGxpYnBuZy4gIEEgY29tbW9uIGJ1aWxkIHNldHVwIGlzIHRvIHBsYWNlIHRoZSB6bGliLCBsaWJwbmcgYW5kIHBuZ2Jvb2sKKyAgICAgc3ViZGlyZWN0b3J5IHRyZWVzICgiZm9sZGVycyIpIGluIHRoZSBzYW1lIHBhcmVudCBkaXJlY3RvcnkuICBUaGVuIHRoZQorICAgICBsaWJwbmcgYnVpbGQgY2FuIHJlZmVyIHRvIGZpbGVzIGluIC4uL3psaWIgKG9yIC4uXHpsaWIgb3IgWy0uemxpYl0pLAorICAgICBhbmQgc2ltaWxhcmx5IGZvciB0aGUgcG5nYm9vayBidWlsZC4KKworICAgICBOb3RlIHRoYXQgYWxsIHRocmVlIHBhY2thZ2VzIGFyZSBkZXNpZ25lZCB0byBiZSBidWlsdCBmcm9tIGEgY29tbWFuZAorICAgICBsaW5lIGJ5IGRlZmF1bHQ7IHRob3NlIHdobyB3aXNoIHRvIHVzZSBhIGdyYXBoaWNhbCBvciBvdGhlciBpbnRlZ3JhdGVkCisgICAgIGRldmVsb3BtZW50IGVudmlyb25tZW50cyBhcmUgb24gdGhlaXIgb3duLgorCisKKyAtIFVuaXg6CisKKyAgICAgVW5wYWNrIHRoZSBsYXRlc3QgcG5nYm9vayBzb3VyY2VzICh3aGljaCBzaG91bGQgY29ycmVzcG9uZCB0byB0aGlzCisgICAgIFJFQURNRSBmaWxlKSBpbnRvIGEgZGlyZWN0b3J5IGFuZCBjaGFuZ2UgaW50byB0aGF0IGRpcmVjdG9yeS4KKworICAgICBDb3B5IE1ha2VmaWxlLnVueCB0byBNYWtlZmlsZSBhbmQgZWRpdCB0aGUgUE5HKiBhbmQgWiogdmFyaWFibGVzCisgICAgIGFwcHJvcHJpYXRlbHkgKHBvc3NpYmx5IGFsc28gdGhlIFgqIHZhcmlhYmxlcyBpZiBuZWNlc3NhcnkpLgorCisgICAgIG1ha2UKKworICAgICBUaGVyZSBpcyBubyAiaW5zdGFsbCIgdGFyZ2V0LCBzbyBjb3B5IHRoZSB0aHJlZSBleGVjdXRhYmxlcyBzb21ld2hlcmUKKyAgICAgaW4geW91ciBwYXRoIG9yIHJ1biB0aGVtIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgQWxsIHRocmVlIHdpbGwKKyAgICAgcHJpbnQgYSBiYXNpYyB1c2FnZSBzY3JlZW4gd2hlbiBydW4gd2l0aG91dCBhbnkgY29tbWFuZC1saW5lIGFyZ3VtZW50czsKKyAgICAgc2VlIHRoZSBib29rIGZvciBtb3JlIGRldGFpbHMuCisKKworIC0gV2luZG93czoKKworICAgICBVbnBhY2sgdGhlIGxhdGVzdCBwbmdib29rIHNvdXJjZXMgKHdoaWNoIHNob3VsZCBjb3JyZXNwb25kIHRvIHRoaXMKKyAgICAgUkVBRE1FIGZpbGUpIGludG8gYSBmb2xkZXIsIG9wZW4gYSAiRE9TIHNoZWxsIiBvciAiY29tbWFuZCBwcm9tcHQiCisgICAgIG9yIGVxdWl2YWxlbnQgY29tbWFuZC1saW5lIHdpbmRvdywgYW5kIGNkIGludG8gdGhlIGZvbGRlciB3aGVyZSB5b3UKKyAgICAgdW5wYWNrZWQgdGhlIHNvdXJjZSBjb2RlLgorCisgICAgIEZvciBNU1ZDLCBzZXQgdXAgdGhlIG5lY2Vzc2FyeSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYnkgaW52b2tpbmcKKworICAgICAgICAlZGV2c3R1ZGlvJVx2Y1xiaW5cdmN2YXJzMzIuYmF0CisKKyAgICAgd2hlcmUgd2hlcmUgJWRldnN0dWRpbyUgaXMgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgZm9yIE1TVkMgLworICAgICBEZXZTdHVkaW8uICBJZiB5b3UgZ2V0ICJlbnZpcm9ubWVudCBvdXQgb2Ygc3BhY2UiIGVycm9ycyB1bmRlciA5NS85OCwKKyAgICAgY3JlYXRlIGEgZGVza3RvcCBzaG9ydGN1dCB3aXRoICJjOlx3aW5kb3dzXGNvbW1hbmQuY29tIC9lOjQwOTYiIGFzCisgICAgIHRoZSBwcm9ncmFtIGNvbW1hbmQgbGluZSBhbmQgc2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgcG5nYm9vaworICAgICBkaXJlY3RvcnkuICBUaGVuIGRvdWJsZS1jbGljayB0byBvcGVuIHRoZSBuZXcgRE9TLXByb21wdCB3aW5kb3cgd2l0aAorICAgICBhIGJpZ2dlciBlbnZpcm9ubWVudCBhbmQgcmV0cnkgdGhlIGNvbW1hbmRzIGFib3ZlLgorCisgICAgIENvcHkgTWFrZWZpbGUudzMyIHRvIE1ha2VmaWxlIGFuZCBlZGl0IHRoZSBQTkdQQVRIIGFuZCBaUEFUSCB2YXJpYWJsZXMKKyAgICAgYXBwcm9wcmlhdGVseSAocG9zc2libHkgYWxzbyB0aGUgIklOQyIgYW5kICJMSUIiIHZhcmlhYmxlcyBpZiBuZWVkZWQpLgorICAgICBOb3RlIHRoYXQgdGhlIG5hbWVzIG9mIHRoZSBkeW5hbWljIGFuZCBzdGF0aWMgbGlicG5nIGFuZCB6bGliIGxpYnJhcmllcworICAgICB1c2VkIGluIHRoZSBtYWtlZmlsZSBtYXkgY2hhbmdlIGluIGxhdGVyIHJlbGVhc2VzIG9mIHRoZSBsaWJyYXJpZXMuCisgICAgIEFsc28gbm90ZSB0aGF0LCBhcyBvZiBsaWJwbmcgdmVyc2lvbiAxLjAuNSwgTVNWQyBETEwgYnVpbGRzIGRvIG5vdCB3b3JrLgorICAgICBUaGlzIG1ha2VmaWxlIHRoZXJlZm9yZSBidWlsZHMgc3RhdGljYWxseSBsaW5rZWQgZXhlY3V0YWJsZXMsIGJ1dCBpZgorICAgICB0aGUgRExMIHByb2JsZW1zIGV2ZXIgZ2V0IGZpeGVkLCB1bmNvbW1lbnRpbmcgdGhlIGFwcHJvcHJpYXRlIFBOR0xJQgorICAgICBhbmQgWkxJQiBsaW5lcyB3aWxsIGJ1aWxkIGR5bmFtaWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlcyBpbnN0ZWFkLgorCisgICAgIERvIHRoZSBidWlsZCBieSB0eXBpbmcKKworICAgICAgICBubWFrZQorCisgICAgIFRoZSByZXN1bHQgc2hvdWxkIGJlIHRocmVlIGV4ZWN1dGFibGVzOiAgcnBuZy13aW4uZXhlLCBycG5nMi13aW4uZXhlLAorICAgICBhbmQgd3BuZy5leGUuICBDb3B5IHRoZW0gc29tZXdoZXJlIGluIHlvdXIgUEFUSCBvciBydW4gdGhlbSBmcm9tIHRoZQorICAgICBjdXJyZW50IGZvbGRlci4gIExpa2UgdGhlIFVuaXggdmVyc2lvbnMsIHRoZSB0d28gd2luZG93ZWQgcHJvZ3JhbXMKKyAgICAgKHJwbmcgYW5kIHJwbmcyKSBub3cgZGlzcGxheSBhIHVzYWdlIHNjcmVlbiBpbiBhIGNvbnNvbGUgd2luZG93IHdoZW4KKyAgICAgaW52b2tlZCB3aXRob3V0IGNvbW1hbmQtbGluZSBhcmd1bWVudHM7IHRoaXMgaXMgbmV3IGJlaGF2aW9yIGFzIG9mCisgICAgIHRoZSBKdW5lIDIwMDEgcmVsZWFzZS4gIE5vdGUgdGhhdCB0aGUgcHJvZ3JhbXMgdXNlIHRoZSBVbml4LXN0eWxlICItIgorICAgICBjaGFyYWN0ZXIgdG8gc3BlY2lmeSBvcHRpb25zLCBpbnN0ZWFkIG9mIHRoZSBtb3JlIGNvbW1vbiBET1MvV2luZG93cworICAgICAiLyIgY2hhcmFjdGVyLiAgKEZvciBleGFtcGxlOiAgInJwbmcyLXdpbiAtYmdwYXQgNCBmb28ucG5nIiwgbm90CisgICAgICJycG5nMi13aW4gL2JncGF0IDQgZm9vLnBuZyIpCisKKworIC0gT3BlblZNUzoKKworICAgICBVbnBhY2sgdGhlIHBuZ2Jvb2sgc291cmNlcyBpbnRvIGEgc3ViZGlyZWN0b3J5IGFuZCBjaGFuZ2UgaW50byB0aGF0CisgICAgIHN1YmRpcmVjdG9yeS4KKworICAgICBFZGl0IG1ha2V2bXMuY29tIGFwcHJvcHJpYXRlbHksIHNwZWNpZmljYWxseSB0aGUgenBhdGggYW5kIHBuZ3BhdGgKKyAgICAgdmFyaWFibGVzLgorCisgICAgIEBtYWtldm1zCisKKyAgICAgVG8gcnVuIHRoZSBwcm9ncmFtcywgdGhleSBwcm9iYWJseSBmaXJzdCBuZWVkIHRvIGJlIHNldCB1cCBhcyAiZm9yZWlnbgorICAgICBzeW1ib2xzLCIgd2l0aCAiZGlzayIgYW5kICJkaXIiIHNldCBhcHByb3ByaWF0ZWx5OgorCisgICAgICQgcnBuZyAgPT0gIiRkaXNrOltkaXJdcnBuZy14LmV4ZSIKKyAgICAgJCBycG5nMiA9PSAiJGRpc2s6W2Rpcl1ycG5nMi14LmV4ZSIKKyAgICAgJCB3cG5nICA9PSAiJGRpc2s6W2Rpcl13cG5nLmV4ZSIKKworICAgICBBbGwgdGhyZWUgd2lsbCBwcmludCBhIGJhc2ljIHVzYWdlIHNjcmVlbiB3aGVuIHJ1biB3aXRob3V0IGFueSBjb21tYW5kLQorICAgICBsaW5lIGFyZ3VtZW50czsgc2VlIHRoZSBib29rIGZvciBtb3JlIGRldGFpbHMuICBOb3RlIHRoYXQgdGhlIG9wdGlvbnMKKyAgICAgc3R5bGUgaXMgVW5peC1saWtlLCBpLmUuLCBwcmVjZWRlZCBieSAiLSIgcmF0aGVyIHRoYW4gIi8iLgorCisKK1JVTk5JTkcgVEhFIFBST0dSQU1TOiAgKFZFUlkpIEJSSUVGIElOVFJPCisKKyAgICAgcnBuZyBpcyBhIHNpbXBsZSBQTkcgdmlld2VyIHRoYXQgY2FuIGRpc3BsYXkgdHJhbnNwYXJlbnQgUE5HcyB3aXRoIGEKKyAgICAgc3BlY2lmaWVkIGJhY2tncm91bmQgY29sb3I7IGZvciBleGFtcGxlLAorCisgICAgICAgIHJwbmcgLWJnY29sb3IgXCNmZjAwMDAgdG91Y2FuLnBuZworCisgICAgIHdvdWxkIGRpc3BsYXkgdGhlIGltYWdlIHdpdGggYSByZWQgYmFja2dyb3VuZC4gIHJwbmcyIGlzIGEgcHJvZ3Jlc3NpdmUKKyAgICAgdmlld2VyIHRoYXQgc2ltdWxhdGVzIGEgd2ViIGJyb3dzZXIgaW4gc29tZSByZXNwZWN0czsgaXQgY2FuIGRpc3BsYXkKKyAgICAgaW1hZ2VzIGFnYWluc3QgZWl0aGVyIGEgYmFja2dyb3VuZCBjb2xvciBvciBhIGR5bmFtaWNhbGx5IGdlbmVyYXRlZAorICAgICBiYWNrZ3JvdW5kIGltYWdlLiAgRm9yIGV4YW1wbGU6CisKKyAgICAgICAgcnBuZzIgLWJncGF0IDE2IHRvdWNhbi5wbmcKKworICAgICB3cG5nIGlzIGEgcHVyZWx5IGNvbW1hbmQtbGluZSBpbWFnZSBjb252ZXJ0ZXIgZnJvbSBiaW5hcnkgUEJNUExVUy9OZXRQQk0KKyAgICAgZm9ybWF0ICgucGdtIG9yIC5wcG0pIHRvIFBORzsgZm9yIGV4YW1wbGUsCisKKyAgICAgICAgd3BuZyAtdGltZSA8IHRvdWNhbi1ub3RyYW5zLnBwbSA+IHRvdWNhbi1ub3RyYW5zLnBuZworCisgICAgIHdvdWxkIGNvbnZlcnQgdGhlIHNwZWNpZmllZCBQUE0gZmlsZSAodXNpbmcgcmVkaXJlY3Rpb24pIHRvIFBORywgYXV0by0KKyAgICAgbWF0aWNhbGx5IHNldHRpbmcgdGhlIFBORyBtb2RpZmljYXRpb24tdGltZSBjaHVuay4KKworICAgICBBbGwgb3B0aW9ucyBjYW4gYmUgYWJicmV2aWF0ZWQgdG8gdGhlIHNob3J0ZXN0IHVuaXF1ZSB2YWx1ZTsgZm9yIGV4YW1wbGUsCisgICAgICItYmdjIiBmb3IgLWJnY29sb3IgKHZlcnN1cyAiLWJncCIgZm9yIC1iZ3BhdCksIG9yICItZyIgZm9yIC1nYW1tYS4KZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL2dyZWdib29rL21ha2V2bXMuY29tIGIvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svbWFrZXZtcy5jb20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMyYmNhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL2dyZWdib29rL21ha2V2bXMuY29tCkBAIC0wLDAgKzEsMTMyIEBACiskIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCEgbWFrZSAiUE5HOiBUaGUgRGVmaW5pdGl2ZSBHdWlkZSIgZGVtbyBwcm9ncmFtcyAoZm9yIFgpIHVuZGVyIE9wZW5WTVMKKyQhCiskISBTY3JpcHQgY3JlYXRlZCBieSBNYXJ0aW4gWmluc2VyIGZvciBsaWJwbmc7IG1vZGlmaWVkIGJ5IEdyZWcgUm9lbG9mcworJCEgZm9yIHN0YW5kYWxvbmUgcG5nYm9vayBzb3VyY2UgZGlzdHJpYnV0aW9uLgorJCEKKyQhCiskISAgICBTZXQgbG9jYXRpb25zIHdoZXJlIHpsaWIgYW5kIGxpYnBuZyBzb3VyY2VzIGxpdmUuCiskIQorJCB6cGF0aCAgID0gIiIKKyQgcG5ncGF0aCA9ICIiCiskIQorJCBpZiBmJHNlYXJjaCgiWy0tLS56bGliXXpsaWIuaCIpLm5lcy4iIiB0aGVuIHpwYXRoID0gIlstLS0uemxpYl0iCiskIGlmIGYkc2VhcmNoKCJbLS1dcG5nLmgiKS5uZXMuIiIgdGhlbiBwbmdwYXRoID0gIlstLV0iCiskIQorJCBpZiBmJHNlYXJjaCgiWy0uemxpYl16bGliLmgiKS5uZXMuIiIgdGhlbiB6cGF0aCA9ICJbLS56bGliXSIKKyQgaWYgZiRzZWFyY2goIlstLmxpYnBuZ11wbmcuaCIpLm5lcy4iIiB0aGVuIHBuZ3BhdGggPSAiWy0ubGlicG5nXSIKKyQhCiskIGlmIHpwYXRoIC5lcXMuICIiCiskIHRoZW4KKyQgICB3cml0ZSBzeXMkb3V0cHV0ICJ6bGliIGluY2x1ZGUgbm90IGZvdW5kLiBFeGl0aW5nLi4uIgorJCAgIGV4aXQgMgorJCBlbmRpZgorJCEKKyQgaWYgcG5ncGF0aCAuZXFzLiAiIgorJCB0aGVuCiskICAgd3JpdGUgc3lzJG91dHB1dCAibGlicG5nIGluY2x1ZGUgbm90IGZvdW5kLiBFeGl0aW5nLi4uIgorJCAgIGV4aXQgMgorJCBlbmRpZgorJCEKKyQhICAgIExvb2sgZm9yIHRoZSBjb21waWxlciB1c2VkLgorJCEKKyQgY2NvcHQ9Ii9pbmNsdWRlPSgnJ3pwYXRoJywnJ3BuZ3BhdGgnKSIKKyQgaWYgZiRnZXRzeWkoIkhXX01PREVMIikuZ2UuMTAyNAorJCB0aGVuCiskICBjY29wdCA9ICIvcHJlZml4PWFsbCIrY2NvcHQKKyQgIGNvbXAgID0gIl9fZGVjY19fPTEiCiskICBpZiBmJHRybmxubSgiU1lTIikuZXFzLiIiIHRoZW4gZGVmaW5lIHN5cyBzeXMkbGlicmFyeToKKyQgZWxzZQorJCAgaWYgZiRzZWFyY2goIlNZUyRTWVNURU06REVDQyRDT01QSUxFUi5FWEUiKS5lcXMuIiIKKyQgICB0aGVuCiskICAgIGlmIGYkdHJubG5tKCJTWVMiKS5lcXMuIiIgdGhlbiBkZWZpbmUgc3lzIHN5cyRsaWJyYXJ5OgorJCAgICBpZiBmJHNlYXJjaCgiU1lTJFNZU1RFTTpWQVhDLkVYRSIpLmVxcy4iIgorJCAgICAgdGhlbgorJCAgICAgIGNvbXAgID0gIl9fZ2NjX189MSIKKyQgICAgICBDQyA6PT0gR0NDCiskICAgICBlbHNlCiskICAgICAgY29tcCA9ICJfX3ZheGNfXz0xIgorJCAgICAgZW5kaWYKKyQgICBlbHNlCiskICAgIGlmIGYkdHJubG5tKCJTWVMiKS5lcXMuIiIgdGhlbiBkZWZpbmUgc3lzIGRlY2MkbGlicmFyeV9pbmNsdWRlOgorJCAgICBjY29wdCA9ICIvZGVjYy9wcmVmaXg9YWxsIitjY29wdAorJCAgICBjb21wICA9ICJfX2RlY2NfXz0xIgorJCAgZW5kaWYKKyQgZW5kaWYKKyQgb3Blbi93cml0ZSBsb3B0IGxpYi5vcHQKKyQgd3JpdGUgbG9wdCAiJydwbmdwYXRoJ2xpYnBuZy5vbGIvbGliIgorJCB3cml0ZSBsb3B0ICInJ3pwYXRoJ2xpYnoub2xiL2xpYiIKKyQgY2xvc2UgbG9wdAorJCBvcGVuL3dyaXRlIHhvcHQgeDExLm9wdAorJCB3cml0ZSB4b3B0ICJzeXMkbGlicmFyeTpkZWN3JHhsaWJzaHIuZXhlL3NoYXJlIgorJCBjbG9zZSB4b3B0CiskIQorJCEgICAgQnVpbGQgJ2VtLgorJCEKKyQgd3JpdGUgc3lzJG91dHB1dCAiQ29tcGlsaW5nIFBORyBib29rIHByb2dyYW1zIC4uLiIKKyQgICBDQUxMIE1BS0UgcmVhZHBuZy5PQkogImNjICcnQ0NPUFQnIHJlYWRwbmciIC0KKwlyZWFkcG5nLmMgcmVhZHBuZy5oCiskICAgQ0FMTCBNQUtFIHJlYWRwbmcyLk9CSiAiY2MgJydDQ09QVCcgcmVhZHBuZzIiIC0KKwlyZWFkcG5nMi5jIHJlYWRwbmcyLmgKKyQgICBDQUxMIE1BS0Ugd3JpdGVwbmcuT0JKICJjYyAnJ0NDT1BUJyB3cml0ZXBuZyIgLQorCXdyaXRlcG5nLmMgd3JpdGVwbmcuaAorJCAgIHdyaXRlIHN5cyRvdXRwdXQgIkJ1aWxkaW5nIHJwbmcteC4uLiIKKyQgICBDQUxMIE1BS0UgcnBuZy14Lk9CSiAiY2MgJydDQ09QVCcgcnBuZy14IiAtCisJcnBuZy14LmMgcmVhZHBuZy5oCiskICAgY2FsbCBtYWtlIHJwbmcteC5leGUgLQorCSJMSU5LIHJwbmcteCxyZWFkcG5nLGxpYi5vcHQvb3B0LHgxMS5vcHQvb3B0IiAtCisJcnBuZy14Lm9iaiByZWFkcG5nLm9iagorJCAgIHdyaXRlIHN5cyRvdXRwdXQgIkJ1aWxkaW5nIHJwbmcyLXguLi4iCiskICAgQ0FMTCBNQUtFIHJwbmcyLXguT0JKICJjYyAnJ0NDT1BUJyBycG5nMi14IiAtCisJcnBuZzIteC5jIHJlYWRwbmcyLmgKKyQgICBjYWxsIG1ha2UgcnBuZzIteC5leGUgLQorCSJMSU5LIHJwbmcyLXgscmVhZHBuZzIsbGliLm9wdC9vcHQseDExLm9wdC9vcHQiIC0KKwlycG5nMi14Lm9iaiByZWFkcG5nMi5vYmoKKyQgICB3cml0ZSBzeXMkb3V0cHV0ICJCdWlsZGluZyB3cG5nLi4uIgorJCAgIENBTEwgTUFLRSB3cG5nLk9CSiAiY2MgJydDQ09QVCcgd3BuZyIgLQorCXdwbmcuYyB3cml0ZXBuZy5oCiskICAgY2FsbCBtYWtlIHdwbmcuZXhlIC0KKwkiTElOSyB3cG5nLHdyaXRlcG5nLGxpYi5vcHQvb3B0IiAtCisJd3BuZy5vYmogd3JpdGVwbmcub2JqCiskIGV4aXQKKyQhCiskIQorJE1BS0U6IFNVQlJPVVRJTkUgICAhU1VCUk9VVElORSBUTyBDSEVDSyBERVBFTkRFTkNJRVMKKyQgViA9ICdGJFZlcmlmeSgwKQorJCEgUDEgPSBXaGF0IHdlIGFyZSB0cnlpbmcgdG8gbWFrZQorJCEgUDIgPSBDb21tYW5kIHRvIG1ha2UgaXQKKyQhIFAzIC0gUDggIFdoYXQgaXQgZGVwZW5kcyBvbgorJAorJCBJZiBGJFNlYXJjaChQMSkgLkVxcy4gIiIgVGhlbiBHb3RvIE1ha2VpdAorJCBUaW1lID0gRiRDdlRpbWUoRiRGaWxlKFAxLCJSRFQiKSkKKyRhcmc9MworJExvb3A6CiskICAgICAgIEFyZ3VtZW50ID0gUCdhcmcKKyQgICAgICAgSWYgQXJndW1lbnQgLkVxcy4gIiIgVGhlbiBHb3RvIEV4aXQKKyQgICAgICAgRWw9MAorJExvb3AyOgorJCAgICAgICBGaWxlID0gRiRFbGVtZW50KEVsLCIgIixBcmd1bWVudCkKKyQgICAgICAgSWYgRmlsZSAuRXFzLiAiICIgVGhlbiBHb3RvIEVuZGwKKyQgICAgICAgQUZpbGUgPSAiIgorJExvb3AzOgorJCAgICAgICBPRmlsZSA9IEFGaWxlCiskICAgICAgIEFGaWxlID0gRiRTZWFyY2goRmlsZSkKKyQgICAgICAgSWYgQUZpbGUgLkVxcy4gIiIgLk9yLiBBRmlsZSAuRXFzLiBPRmlsZSBUaGVuIEdvdG8gTmV4dEVsCiskICAgICAgIElmIEYkQ3ZUaW1lKEYkRmlsZShBRmlsZSwiUkRUIikpIC5HZXMuIFRpbWUgVGhlbiBHb3RvIE1ha2VpdAorJCAgICAgICBHb3RvIExvb3AzCiskTmV4dEVMOgorJCAgICAgICBFbCA9IEVsICsgMQorJCAgICAgICBHb3RvIExvb3AyCiskRW5kTDoKKyQgYXJnPWFyZysxCiskIElmIGFyZyAuTGUuIDggVGhlbiBHb3RvIExvb3AKKyQgR290byBFeGl0CiskCiskTWFrZWl0OgorJCBWVj1GJFZFUklGWSgwKQorJCB3cml0ZSBzeXMkb3V0cHV0IFAyCiskICdQMgorJCBWVj0nRiRWZXJpZnkoVlYpCiskRXhpdDoKKyQgSWYgViBUaGVuIFNldCBWZXJpZnkKKyRFTkRTVUJST1VUSU5FCmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9ncmVnYm9vay9yZWFkcG5nLmMgYi9saWJwbmcvY29udHJpYi9ncmVnYm9vay9yZWFkcG5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE2NzQwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL2dyZWdib29rL3JlYWRwbmcuYwpAQCAtMCwwICsxLDMxNyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgcnBuZyAtIHNpbXBsZSBQTkcgZGlzcGxheSBwcm9ncmFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZHBuZy5jCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDA3IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzLCIgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZCwKKyAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCisgICAgICBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBpbiBhbnkgd2F5IGZyb20gdGhlIHVzZSBvZgorICAgICAgdGhpcyBzb2Z0d2FyZS4KKworICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgRFVBTC1MSUNFTlNFRC4gIFlvdSBtYXkgbW9kaWZ5IGFuZC9vcgorICAgICAgcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiBvbmUgb2YgdGhlCisgICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6CisKKworICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKKworICAgICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCisgICAgICBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucy4KKyAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQorICAgICAgICAgdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisKKyAgICAgICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgR3JlZyBSb2Vsb2ZzCisgICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgorICAgICAgICAgICAgcHVibGlzaGVkIGJ5IE8nUmVpbGx5IGFuZCBBc3NvY2lhdGVzLgorCisKKyAgICAgIExJQ0VOU0UgMiAoR05VIEdQTCB2MiBvciBsYXRlcik6CisKKyAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHpsaWIuaD4KKworI2luY2x1ZGUgInBuZy5oIiAgICAgICAgLyogbGlicG5nIGhlYWRlciAqLworI2luY2x1ZGUgInJlYWRwbmcuaCIgICAgLyogdHlwZWRlZnMsIGNvbW1vbiBtYWNyb3MsIHB1YmxpYyBwcm90b3R5cGVzICovCisKKy8qIGZ1dHVyZSB2ZXJzaW9ucyBvZiBsaWJwbmcgd2lsbCBwcm92aWRlIHRoaXMgbWFjcm86ICovCisjaWZuZGVmIHBuZ19qbXBidWYKKyMgIGRlZmluZSBwbmdfam1wYnVmKHBuZ19wdHIpICAgKChwbmdfcHRyKS0+am1wYnVmKQorI2VuZGlmCisKKworc3RhdGljIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBOVUxMOworc3RhdGljIHBuZ19pbmZvcCBpbmZvX3B0ciA9IE5VTEw7CisKK3BuZ191aW50XzMyICB3aWR0aCwgaGVpZ2h0OworaW50ICBiaXRfZGVwdGgsIGNvbG9yX3R5cGU7Cit1Y2ggICppbWFnZV9kYXRhID0gTlVMTDsKKworCit2b2lkIHJlYWRwbmdfdmVyc2lvbl9pbmZvKHZvaWQpCit7CisgICAgZnByaW50ZihzdGRlcnIsICIgICBDb21waWxlZCB3aXRoIGxpYnBuZyAlczsgdXNpbmcgbGlicG5nICVzLlxuIiwKKyAgICAgIFBOR19MSUJQTkdfVkVSX1NUUklORywgcG5nX2xpYnBuZ192ZXIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgQ29tcGlsZWQgd2l0aCB6bGliICVzOyB1c2luZyB6bGliICVzLlxuIiwKKyAgICAgIFpMSUJfVkVSU0lPTiwgemxpYl92ZXJzaW9uKTsKK30KKworCisvKiByZXR1cm4gdmFsdWUgPSAwIGZvciBzdWNjZXNzLCAxIGZvciBiYWQgc2lnLCAyIGZvciBiYWQgSUhEUiwgNCBmb3Igbm8gbWVtICovCisKK2ludCByZWFkcG5nX2luaXQoRklMRSAqaW5maWxlLCB1bGcgKnBXaWR0aCwgdWxnICpwSGVpZ2h0KQoreworICAgIHVjaCBzaWdbOF07CisKKworICAgIC8qIGZpcnN0IGRvIGEgcXVpY2sgY2hlY2sgdGhhdCB0aGUgZmlsZSByZWFsbHkgaXMgYSBQTkcgaW1hZ2U7IGNvdWxkCisgICAgICogaGF2ZSB1c2VkIHNsaWdodGx5IG1vcmUgZ2VuZXJhbCBwbmdfc2lnX2NtcCgpIGZ1bmN0aW9uIGluc3RlYWQgKi8KKworICAgIGZyZWFkKHNpZywgMSwgOCwgaW5maWxlKTsKKyAgICBpZiAocG5nX3NpZ19jbXAoc2lnLCAwLCA4KSkKKyAgICAgICAgcmV0dXJuIDE7ICAgLyogYmFkIHNpZ25hdHVyZSAqLworCisKKyAgICAvKiBjb3VsZCBwYXNzIHBvaW50ZXJzIHRvIHVzZXItZGVmaW5lZCBlcnJvciBoYW5kbGVycyBpbnN0ZWFkIG9mIE5VTExzOiAqLworCisgICAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QocG5nX2dldF9saWJwbmdfdmVyKE5VTEwpLCBOVUxMLCBOVUxMLAorICAgICAgICBOVUxMKTsKKyAgICBpZiAoIXBuZ19wdHIpCisgICAgICAgIHJldHVybiA0OyAgIC8qIG91dCBvZiBtZW1vcnkgKi8KKworICAgIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKKyAgICBpZiAoIWluZm9fcHRyKSB7CisgICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuIDQ7ICAgLyogb3V0IG9mIG1lbW9yeSAqLworICAgIH0KKworCisgICAgLyogd2UgY291bGQgY3JlYXRlIGEgc2Vjb25kIGluZm8gc3RydWN0IGhlcmUgKGVuZF9pbmZvKSwgYnV0IGl0J3Mgb25seQorICAgICAqIHVzZWZ1bCBpZiB3ZSB3YW50IHRvIGtlZXAgcHJlLSBhbmQgcG9zdC1JREFUIGNodW5rIGluZm8gc2VwYXJhdGVkCisgICAgICogKG1haW5seSBmb3IgUE5HLWF3YXJlIGltYWdlIGVkaXRvcnMgYW5kIGNvbnZlcnRlcnMpICovCisKKworICAgIC8qIHNldGptcCgpIG11c3QgYmUgY2FsbGVkIGluIGV2ZXJ5IGZ1bmN0aW9uIHRoYXQgY2FsbHMgYSBQTkctcmVhZGluZworICAgICAqIGxpYnBuZyBmdW5jdGlvbiAqLworCisgICAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZ19wdHIpKSkgeworICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorCisKKyAgICBwbmdfaW5pdF9pbyhwbmdfcHRyLCBpbmZpbGUpOworICAgIHBuZ19zZXRfc2lnX2J5dGVzKHBuZ19wdHIsIDgpOyAgLyogd2UgYWxyZWFkeSByZWFkIHRoZSA4IHNpZ25hdHVyZSBieXRlcyAqLworCisgICAgcG5nX3JlYWRfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7ICAvKiByZWFkIGFsbCBQTkcgaW5mbyB1cCB0byBpbWFnZSBkYXRhICovCisKKworICAgIC8qIGFsdGVybmF0aXZlbHksIGNvdWxkIG1ha2Ugc2VwYXJhdGUgY2FsbHMgdG8gcG5nX2dldF9pbWFnZV93aWR0aCgpLAorICAgICAqIGV0Yy4sIGJ1dCB3YW50IGJpdF9kZXB0aCBhbmQgY29sb3JfdHlwZSBmb3IgbGF0ZXIgW2Rvbid0IGNhcmUgYWJvdXQKKyAgICAgKiBjb21wcmVzc2lvbl90eXBlIGFuZCBmaWx0ZXJfdHlwZSA9PiBOVUxMc10gKi8KKworICAgIHBuZ19nZXRfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwgJndpZHRoLCAmaGVpZ2h0LCAmYml0X2RlcHRoLCAmY29sb3JfdHlwZSwKKyAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICpwV2lkdGggPSB3aWR0aDsKKyAgICAqcEhlaWdodCA9IGhlaWdodDsKKworCisgICAgLyogT0ssIHRoYXQncyBhbGwgd2UgbmVlZCBmb3Igbm93OyByZXR1cm4gaGFwcHkgKi8KKworICAgIHJldHVybiAwOworfQorCisKKworCisvKiByZXR1cm5zIDAgaWYgc3VjY2VlZHMsIDEgaWYgZmFpbHMgZHVlIHRvIG5vIGJLR0QgY2h1bmssIDIgaWYgbGlicG5nIGVycm9yOworICogc2NhbGVzIHZhbHVlcyB0byA4LWJpdCBpZiBuZWNlc3NhcnkgKi8KKworaW50IHJlYWRwbmdfZ2V0X2JnY29sb3IodWNoICpyZWQsIHVjaCAqZ3JlZW4sIHVjaCAqYmx1ZSkKK3sKKyAgICBwbmdfY29sb3JfMTZwIHBCYWNrZ3JvdW5kOworCisKKyAgICAvKiBzZXRqbXAoKSBtdXN0IGJlIGNhbGxlZCBpbiBldmVyeSBmdW5jdGlvbiB0aGF0IGNhbGxzIGEgUE5HLXJlYWRpbmcKKyAgICAgKiBsaWJwbmcgZnVuY3Rpb24gKi8KKworICAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpIHsKKyAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKworCisgICAgaWYgKCFwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfSU5GT19iS0dEKSkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICAvKiBpdCBpcyBub3Qgb2J2aW91cyBmcm9tIHRoZSBsaWJwbmcgZG9jdW1lbnRhdGlvbiwgYnV0IHRoaXMgZnVuY3Rpb24KKyAgICAgKiB0YWtlcyBhIHBvaW50ZXIgdG8gYSBwb2ludGVyLCBhbmQgaXQgYWx3YXlzIHJldHVybnMgdmFsaWQgcmVkLCBncmVlbgorICAgICAqIGFuZCBibHVlIHZhbHVlcywgcmVnYXJkbGVzcyBvZiBjb2xvcl90eXBlOiAqLworCisgICAgcG5nX2dldF9iS0dEKHBuZ19wdHIsIGluZm9fcHRyLCAmcEJhY2tncm91bmQpOworCisKKyAgICAvKiBob3dldmVyLCBpdCBhbHdheXMgcmV0dXJucyB0aGUgcmF3IGJLR0QgZGF0YSwgcmVnYXJkbGVzcyBvZiBhbnkKKyAgICAgKiBiaXQtZGVwdGggdHJhbnNmb3JtYXRpb25zLCBzbyBjaGVjayBkZXB0aCBhbmQgYWRqdXN0IGlmIG5lY2Vzc2FyeSAqLworCisgICAgaWYgKGJpdF9kZXB0aCA9PSAxNikgeworICAgICAgICAqcmVkICAgPSBwQmFja2dyb3VuZC0+cmVkICAgPj4gODsKKyAgICAgICAgKmdyZWVuID0gcEJhY2tncm91bmQtPmdyZWVuID4+IDg7CisgICAgICAgICpibHVlICA9IHBCYWNrZ3JvdW5kLT5ibHVlICA+PiA4OworICAgIH0gZWxzZSBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZICYmIGJpdF9kZXB0aCA8IDgpIHsKKyAgICAgICAgaWYgKGJpdF9kZXB0aCA9PSAxKQorICAgICAgICAgICAgKnJlZCA9ICpncmVlbiA9ICpibHVlID0gcEJhY2tncm91bmQtPmdyYXk/IDI1NSA6IDA7CisgICAgICAgIGVsc2UgaWYgKGJpdF9kZXB0aCA9PSAyKQorICAgICAgICAgICAgKnJlZCA9ICpncmVlbiA9ICpibHVlID0gKDI1NS8zKSAqIHBCYWNrZ3JvdW5kLT5ncmF5OworICAgICAgICBlbHNlIC8qIGJpdF9kZXB0aCA9PSA0ICovCisgICAgICAgICAgICAqcmVkID0gKmdyZWVuID0gKmJsdWUgPSAoMjU1LzE1KSAqIHBCYWNrZ3JvdW5kLT5ncmF5OworICAgIH0gZWxzZSB7CisgICAgICAgICpyZWQgICA9ICh1Y2gpcEJhY2tncm91bmQtPnJlZDsKKyAgICAgICAgKmdyZWVuID0gKHVjaClwQmFja2dyb3VuZC0+Z3JlZW47CisgICAgICAgICpibHVlICA9ICh1Y2gpcEJhY2tncm91bmQtPmJsdWU7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworCisKKy8qIGRpc3BsYXlfZXhwb25lbnQgPT0gTFVUX2V4cG9uZW50ICogQ1JUX2V4cG9uZW50ICovCisKK3VjaCAqcmVhZHBuZ19nZXRfaW1hZ2UoZG91YmxlIGRpc3BsYXlfZXhwb25lbnQsIGludCAqcENoYW5uZWxzLCB1bGcgKnBSb3dieXRlcykKK3sKKyAgICBkb3VibGUgIGdhbW1hOworICAgIHBuZ191aW50XzMyICBpLCByb3dieXRlczsKKyAgICBwbmdfYnl0ZXBwICByb3dfcG9pbnRlcnMgPSBOVUxMOworCisKKyAgICAvKiBzZXRqbXAoKSBtdXN0IGJlIGNhbGxlZCBpbiBldmVyeSBmdW5jdGlvbiB0aGF0IGNhbGxzIGEgUE5HLXJlYWRpbmcKKyAgICAgKiBsaWJwbmcgZnVuY3Rpb24gKi8KKworICAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpIHsKKyAgICAgICAgZnJlZShpbWFnZV9kYXRhKTsKKyAgICAgICAgaW1hZ2VfZGF0YSA9IE5VTEw7CisgICAgICAgIGZyZWUocm93X3BvaW50ZXJzKTsKKyAgICAgICAgcm93X3BvaW50ZXJzID0gTlVMTDsKKyAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworCisgICAgLyogZXhwYW5kIHBhbGV0dGUgaW1hZ2VzIHRvIFJHQiwgbG93LWJpdC1kZXB0aCBncmF5c2NhbGUgaW1hZ2VzIHRvIDggYml0cywKKyAgICAgKiB0cmFuc3BhcmVuY3kgY2h1bmtzIHRvIGZ1bGwgYWxwaGEgY2hhbm5lbDsgc3RyaXAgMTYtYml0LXBlci1zYW1wbGUKKyAgICAgKiBpbWFnZXMgdG8gOCBiaXRzIHBlciBzYW1wbGU7IGFuZCBjb252ZXJ0IGdyYXlzY2FsZSB0byBSR0JbQV0gKi8KKworICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCisgICAgICAgIHBuZ19zZXRfZXhwYW5kKHBuZ19wdHIpOworICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgJiYgYml0X2RlcHRoIDwgOCkKKyAgICAgICAgcG5nX3NldF9leHBhbmQocG5nX3B0cik7CisgICAgaWYgKHBuZ19nZXRfdmFsaWQocG5nX3B0ciwgaW5mb19wdHIsIFBOR19JTkZPX3RSTlMpKQorICAgICAgICBwbmdfc2V0X2V4cGFuZChwbmdfcHRyKTsKKyNpZmRlZiBQTkdfUkVBRF8xNl9UT184X1NVUFBPUlRFRAorICAgIGlmIChiaXRfZGVwdGggPT0gMTYpCisjICBpZmRlZiBQTkdfUkVBRF9TQ0FMRV8xNl9UT184X1NVUFBPUlRFRAorICAgICAgICBwbmdfc2V0X3NjYWxlXzE2KHBuZ19wdHIpOworIyAgZWxzZQorICAgICAgICBwbmdfc2V0X3N0cmlwXzE2KHBuZ19wdHIpOworIyAgZW5kaWYKKyNlbmRpZgorICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgfHwKKyAgICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQorICAgICAgICBwbmdfc2V0X2dyYXlfdG9fcmdiKHBuZ19wdHIpOworCisKKyAgICAvKiB1bmxpa2UgdGhlIGV4YW1wbGUgaW4gdGhlIGxpYnBuZyBkb2N1bWVudGF0aW9uLCB3ZSBoYXZlICpubyogaWRlYSB3aGVyZQorICAgICAqIHRoaXMgZmlsZSBtYXkgaGF2ZSBjb21lIGZyb20tLXNvIGlmIGl0IGRvZXNuJ3QgaGF2ZSBhIGZpbGUgZ2FtbWEsIGRvbid0CisgICAgICogZG8gYW55IGNvcnJlY3Rpb24gKCJkbyBubyBoYXJtIikgKi8KKworICAgIGlmIChwbmdfZ2V0X2dBTUEocG5nX3B0ciwgaW5mb19wdHIsICZnYW1tYSkpCisgICAgICAgIHBuZ19zZXRfZ2FtbWEocG5nX3B0ciwgZGlzcGxheV9leHBvbmVudCwgZ2FtbWEpOworCisKKyAgICAvKiBhbGwgdHJhbnNmb3JtYXRpb25zIGhhdmUgYmVlbiByZWdpc3RlcmVkOyBub3cgdXBkYXRlIGluZm9fcHRyIGRhdGEsCisgICAgICogZ2V0IHJvd2J5dGVzIGFuZCBjaGFubmVscywgYW5kIGFsbG9jYXRlIGltYWdlIG1lbW9yeSAqLworCisgICAgcG5nX3JlYWRfdXBkYXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOworCisgICAgKnBSb3dieXRlcyA9IHJvd2J5dGVzID0gcG5nX2dldF9yb3dieXRlcyhwbmdfcHRyLCBpbmZvX3B0cik7CisgICAgKnBDaGFubmVscyA9IChpbnQpcG5nX2dldF9jaGFubmVscyhwbmdfcHRyLCBpbmZvX3B0cik7CisKKyAgICBpZiAoKGltYWdlX2RhdGEgPSAodWNoICopbWFsbG9jKHJvd2J5dGVzKmhlaWdodCkpID09IE5VTEwpIHsKKyAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoKHJvd19wb2ludGVycyA9IChwbmdfYnl0ZXBwKW1hbGxvYyhoZWlnaHQqc2l6ZW9mKHBuZ19ieXRlcCkpKSA9PSBOVUxMKSB7CisgICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsIE5VTEwpOworICAgICAgICBmcmVlKGltYWdlX2RhdGEpOworICAgICAgICBpbWFnZV9kYXRhID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgVHJhY2UoKHN0ZGVyciwgInJlYWRwbmdfZ2V0X2ltYWdlOiAgY2hhbm5lbHMgPSAlZCwgcm93Ynl0ZXMgPSAlbGQsIGhlaWdodCA9ICVsZFxuIiwKKyAgICAgICAgKnBDaGFubmVscywgcm93Ynl0ZXMsIGhlaWdodCkpOworCisKKyAgICAvKiBzZXQgdGhlIGluZGl2aWR1YWwgcm93X3BvaW50ZXJzIHRvIHBvaW50IGF0IHRoZSBjb3JyZWN0IG9mZnNldHMgKi8KKworICAgIGZvciAoaSA9IDA7ICBpIDwgaGVpZ2h0OyAgKytpKQorICAgICAgICByb3dfcG9pbnRlcnNbaV0gPSBpbWFnZV9kYXRhICsgaSpyb3dieXRlczsKKworCisgICAgLyogbm93IHdlIGNhbiBnbyBhaGVhZCBhbmQganVzdCByZWFkIHRoZSB3aG9sZSBpbWFnZSAqLworCisgICAgcG5nX3JlYWRfaW1hZ2UocG5nX3B0ciwgcm93X3BvaW50ZXJzKTsKKworCisgICAgLyogYW5kIHdlJ3JlIGRvbmUhICAocG5nX3JlYWRfZW5kKCkgY2FuIGJlIG9taXR0ZWQgaWYgbm8gcHJvY2Vzc2luZyBvZgorICAgICAqIHBvc3QtSURBVCB0ZXh0L3RpbWUvZXRjLiBpcyBkZXNpcmVkKSAqLworCisgICAgZnJlZShyb3dfcG9pbnRlcnMpOworICAgIHJvd19wb2ludGVycyA9IE5VTEw7CisKKyAgICBwbmdfcmVhZF9lbmQocG5nX3B0ciwgTlVMTCk7CisKKyAgICByZXR1cm4gaW1hZ2VfZGF0YTsKK30KKworCit2b2lkIHJlYWRwbmdfY2xlYW51cChpbnQgZnJlZV9pbWFnZV9kYXRhKQoreworICAgIGlmIChmcmVlX2ltYWdlX2RhdGEgJiYgaW1hZ2VfZGF0YSkgeworICAgICAgICBmcmVlKGltYWdlX2RhdGEpOworICAgICAgICBpbWFnZV9kYXRhID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAocG5nX3B0ciAmJiBpbmZvX3B0cikgeworICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLCBOVUxMKTsKKyAgICAgICAgcG5nX3B0ciA9IE5VTEw7CisgICAgICAgIGluZm9fcHRyID0gTlVMTDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9ncmVnYm9vay9yZWFkcG5nLmggYi9saWJwbmcvY29udHJpYi9ncmVnYm9vay9yZWFkcG5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFkOWZlMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL2dyZWdib29rL3JlYWRwbmcuaApAQCAtMCwwICsxLDg4IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBycG5nIC0gc2ltcGxlIFBORyBkaXNwbGF5IHByb2dyYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkcG5nLmgKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDcgR3JlZyBSb2Vsb2ZzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgICAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMsIiB3aXRob3V0IHdhcnJhbnR5IG9mIGFueSBraW5kLAorICAgICAgZXhwcmVzcyBvciBpbXBsaWVkLiAgSW4gbm8gZXZlbnQgc2hhbGwgdGhlIGF1dGhvciBvciBjb250cmlidXRvcnMKKyAgICAgIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIGluIGFueSB3YXkgZnJvbSB0aGUgdXNlIG9mCisgICAgICB0aGlzIHNvZnR3YXJlLgorCisgICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBEVUFMLUxJQ0VOU0VELiAgWW91IG1heSBtb2RpZnkgYW5kL29yCisgICAgICByZWRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIG9uZSBvZiB0aGUKKyAgICAgIGZvbGxvd2luZyB0d28gbGljZW5zZXMgKGF0IHlvdXIgb3B0aW9uKToKKworCisgICAgICBMSUNFTlNFIDEgKCJCU0QtbGlrZSB3aXRoIGFkdmVydGlzaW5nIGNsYXVzZSIpOgorCisgICAgICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAgICAgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUKKyAgICAgIGl0IGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKworICAgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLgorICAgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGEtCisgICAgICAgICB0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgICAgICAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKworICAgICAgICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBHcmVnIFJvZWxvZnMKKyAgICAgICAgICAgIGFuZCBjb250cmlidXRvcnMgZm9yIHRoZSBib29rLCAiUE5HOiBUaGUgRGVmaW5pdGl2ZSBHdWlkZSwiCisgICAgICAgICAgICBwdWJsaXNoZWQgYnkgTydSZWlsbHkgYW5kIEFzc29jaWF0ZXMuCisKKworICAgICAgTElDRU5TRSAyIChHTlUgR1BMIHYyIG9yIGxhdGVyKToKKworICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICAgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBUUlVFCisjICBkZWZpbmUgVFJVRSAxCisjICBkZWZpbmUgRkFMU0UgMAorI2VuZGlmCisKKyNpZm5kZWYgTUFYCisjICBkZWZpbmUgTUFYKGEsYikgICgoYSkgPiAoYik/IChhKSA6IChiKSkKKyMgIGRlZmluZSBNSU4oYSxiKSAgKChhKSA8IChiKT8gKGEpIDogKGIpKQorI2VuZGlmCisKKyNpZmRlZiBERUJVRworIyAgZGVmaW5lIFRyYWNlKHgpICB7ZnByaW50ZiB4IDsgZmZsdXNoKHN0ZGVycik7IGZmbHVzaChzdGRvdXQpO30KKyNlbHNlCisjICBkZWZpbmUgVHJhY2UoeCkgIDsKKyNlbmRpZgorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1Y2g7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1c2g7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICB1bGc7CisKKworLyogcHJvdG90eXBlcyBmb3IgcHVibGljIGZ1bmN0aW9ucyBpbiByZWFkcG5nLmMgKi8KKwordm9pZCByZWFkcG5nX3ZlcnNpb25faW5mbyh2b2lkKTsKKworaW50IHJlYWRwbmdfaW5pdChGSUxFICppbmZpbGUsIHVsZyAqcFdpZHRoLCB1bGcgKnBIZWlnaHQpOworCitpbnQgcmVhZHBuZ19nZXRfYmdjb2xvcih1Y2ggKmJnX3JlZCwgdWNoICpiZ19ncmVlbiwgdWNoICpiZ19ibHVlKTsKKwordWNoICpyZWFkcG5nX2dldF9pbWFnZShkb3VibGUgZGlzcGxheV9leHBvbmVudCwgaW50ICpwQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgIHVsZyAqcFJvd2J5dGVzKTsKKwordm9pZCByZWFkcG5nX2NsZWFudXAoaW50IGZyZWVfaW1hZ2VfZGF0YSk7CmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9ncmVnYm9vay9yZWFkcG5nMi5jIGIvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svcmVhZHBuZzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWU3YmE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svcmVhZHBuZzIuYwpAQCAtMCwwICsxLDUyMCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgcnBuZzIgLSBwcm9ncmVzc2l2ZS1tb2RlbCBQTkcgZGlzcGxheSBwcm9ncmFtICAgICAgICAgICAgICAgICByZWFkcG5nMi5jCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDE1IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzLCIgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZCwKKyAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCisgICAgICBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBpbiBhbnkgd2F5IGZyb20gdGhlIHVzZSBvZgorICAgICAgdGhpcyBzb2Z0d2FyZS4KKworICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgRFVBTC1MSUNFTlNFRC4gIFlvdSBtYXkgbW9kaWZ5IGFuZC9vcgorICAgICAgcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiBvbmUgb2YgdGhlCisgICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6CisKKworICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKKworICAgICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCisgICAgICBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucy4KKyAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQorICAgICAgICAgdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisKKyAgICAgICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgR3JlZyBSb2Vsb2ZzCisgICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgorICAgICAgICAgICAgcHVibGlzaGVkIGJ5IE8nUmVpbGx5IGFuZCBBc3NvY2lhdGVzLgorCisKKyAgICAgIExJQ0VOU0UgMiAoR05VIEdQTCB2MiBvciBsYXRlcik6CisKKyAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBDaGFuZ2Vsb2c6CisgICAgICVSREFURSUgLSBDaGVjayByZXR1cm4gdmFsdWUgb2YgcG5nX2dldF9iS0dEKCkgKEdsZW5uIFItUCkKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4gICAgIC8qIGZvciBleGl0KCkgcHJvdG90eXBlICovCisjaW5jbHVkZSA8c2V0am1wLmg+CisKKyNpbmNsdWRlIDx6bGliLmg+CisjaW5jbHVkZSAicG5nLmgiICAgICAgICAvKiBsaWJwbmcgaGVhZGVyIGZyb20gdGhlIGxvY2FsIGRpcmVjdG9yeSAqLworI2luY2x1ZGUgInJlYWRwbmcyLmgiICAgLyogdHlwZWRlZnMsIGNvbW1vbiBtYWNyb3MsIHB1YmxpYyBwcm90b3R5cGVzICovCisKKworLyogbG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgdm9pZCByZWFkcG5nMl9pbmZvX2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cik7CitzdGF0aWMgdm9pZCByZWFkcG5nMl9yb3dfY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIG5ld19yb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8zMiByb3dfbnVtLCBpbnQgcGFzcyk7CitzdGF0aWMgdm9pZCByZWFkcG5nMl9lbmRfY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKTsKK3N0YXRpYyB2b2lkIHJlYWRwbmcyX2Vycm9yX2hhbmRsZXIocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIG1zZyk7CitzdGF0aWMgdm9pZCByZWFkcG5nMl93YXJuaW5nX2hhbmRsZXIocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIG1zZyk7CisKKworCisKK3ZvaWQgcmVhZHBuZzJfdmVyc2lvbl9pbmZvKHZvaWQpCit7CisgICAgZnByaW50ZihzdGRlcnIsICIgICBDb21waWxlZCB3aXRoIGxpYnBuZyAlczsgdXNpbmcgbGlicG5nICVzXG4iLAorICAgICAgUE5HX0xJQlBOR19WRVJfU1RSSU5HLCBwbmdfbGlicG5nX3Zlcik7CisKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgIGFuZCB3aXRoIHpsaWIgJXM7IHVzaW5nIHpsaWIgJXMuXG4iLAorICAgICAgWkxJQl9WRVJTSU9OLCB6bGliX3ZlcnNpb24pOworfQorCisKKworCitpbnQgcmVhZHBuZzJfY2hlY2tfc2lnKHVjaCAqc2lnLCBpbnQgbnVtKQoreworICAgIHJldHVybiAhcG5nX3NpZ19jbXAoc2lnLCAwLCBudW0pOworfQorCisKKworCisvKiByZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIDIgZm9yIGxpYnBuZyBwcm9ibGVtLCA0IGZvciBvdXQgb2YgbWVtb3J5ICovCisKK2ludCByZWFkcG5nMl9pbml0KG1haW5wcm9nX2luZm8gKm1haW5wcm9nX3B0cikKK3sKKyAgICBwbmdfc3RydWN0cCAgcG5nX3B0cjsgICAgICAgLyogbm90ZTogIHRlbXBvcmFyeSB2YXJpYWJsZXMhICovCisgICAgcG5nX2luZm9wICBpbmZvX3B0cjsKKworCisgICAgLyogY291bGQgYWxzbyByZXBsYWNlIGxpYnBuZyB3YXJuaW5nLWhhbmRsZXIgKGZpbmFsIE5VTEwpLCBidXQgbm8gbmVlZDogKi8KKworICAgIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KHBuZ19nZXRfbGlicG5nX3ZlcihOVUxMKSwgbWFpbnByb2dfcHRyLAorICAgICAgcmVhZHBuZzJfZXJyb3JfaGFuZGxlciwgcmVhZHBuZzJfd2FybmluZ19oYW5kbGVyKTsKKyAgICBpZiAoIXBuZ19wdHIpCisgICAgICAgIHJldHVybiA0OyAgIC8qIG91dCBvZiBtZW1vcnkgKi8KKworICAgIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKKyAgICBpZiAoIWluZm9fcHRyKSB7CisgICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuIDQ7ICAgLyogb3V0IG9mIG1lbW9yeSAqLworICAgIH0KKworCisgICAgLyogd2UgY291bGQgY3JlYXRlIGEgc2Vjb25kIGluZm8gc3RydWN0IGhlcmUgKGVuZF9pbmZvKSwgYnV0IGl0J3Mgb25seQorICAgICAqIHVzZWZ1bCBpZiB3ZSB3YW50IHRvIGtlZXAgcHJlLSBhbmQgcG9zdC1JREFUIGNodW5rIGluZm8gc2VwYXJhdGVkCisgICAgICogKG1haW5seSBmb3IgUE5HLWF3YXJlIGltYWdlIGVkaXRvcnMgYW5kIGNvbnZlcnRlcnMpICovCisKKworICAgIC8qIHNldGptcCgpIG11c3QgYmUgY2FsbGVkIGluIGV2ZXJ5IGZ1bmN0aW9uIHRoYXQgY2FsbHMgYSBQTkctcmVhZGluZworICAgICAqIGxpYnBuZyBmdW5jdGlvbiwgdW5sZXNzIGFuIGFsdGVybmF0ZSBlcnJvciBoYW5kbGVyIHdhcyBpbnN0YWxsZWQtLQorICAgICAqIGJ1dCBjb21wYXRpYmxlIGVycm9yIGhhbmRsZXJzIG11c3QgZWl0aGVyIHVzZSBsb25nam1wKCkgdGhlbXNlbHZlcworICAgICAqIChhcyBpbiB0aGlzIHByb2dyYW0pIG9yIGV4aXQgaW1tZWRpYXRlbHksIHNvIGhlcmUgd2UgYXJlOiAqLworCisgICAgaWYgKHNldGptcChtYWlucHJvZ19wdHItPmptcGJ1ZikpIHsKKyAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKworCisjaWZkZWYgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRAorICAgIC8qIHByZXBhcmUgdGhlIHJlYWRlciB0byBpZ25vcmUgYWxsIHJlY29nbml6ZWQgY2h1bmtzIHdob3NlIGRhdGEgd29uJ3QgYmUKKyAgICAgKiB1c2VkLCBpLmUuLCBhbGwgY2h1bmtzIHJlY29nbml6ZWQgYnkgbGlicG5nIGV4Y2VwdCBmb3IgSUhEUiwgUExURSwgSURBVCwKKyAgICAgKiBJRU5ELCB0Uk5TLCBiS0dELCBnQU1BLCBhbmQgc1JHQiAoc21hbGwgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQpICovCisgICAgeworICAgICAgICAvKiBUaGVzZSBieXRlIHN0cmluZ3Mgd2VyZSBjb3BpZWQgZnJvbSBwbmcuaC4gIElmIGEgZnV0dXJlIHZlcnNpb24KKyAgICAgICAgICogb2YgcmVhZHBuZzIuYyByZWNvZ25pemVzIG1vcmUgY2h1bmtzLCBhZGQgdGhlbSB0byB0aGlzIGxpc3QuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgUE5HX0NPTlNUIHBuZ19ieXRlIGNodW5rc190b19wcm9jZXNzW10gPSB7CisgICAgICAgICAgICA5OCwgIDc1LCAgNzEsICA2OCwgJ1wwJywgIC8qIGJLR0QgKi8KKyAgICAgICAgICAgMTAzLCAgNjUsICA3NywgIDY1LCAnXDAnLCAgLyogZ0FNQSAqLworICAgICAgICAgICAxMTUsICA4MiwgIDcxLCAgNjYsICdcMCcsICAvKiBzUkdCICovCisgICAgICAgICAgIH07CisKKyAgICAgICAvKiBJZ25vcmUgYWxsIGNodW5rcyBleGNlcHQgZm9yIElIRFIsIFBMVEUsIHRSTlMsIElEQVQsIGFuZCBJRU5EICovCisgICAgICAgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKHBuZ19wdHIsIC0xIC8qIFBOR19IQU5ETEVfQ0hVTktfTkVWRVIgKi8sCisgICAgICAgICAgTlVMTCwgLTEpOworCisgICAgICAgLyogQnV0IGRvIG5vdCBpZ25vcmUgY2h1bmtzIGluIHRoZSAiY2h1bmtzX3RvX3Byb2Nlc3MiIGxpc3QgKi8KKyAgICAgICBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MocG5nX3B0ciwKKyAgICAgICAgICAwIC8qIFBOR19IQU5ETEVfQ0hVTktfQVNfREVGQVVMVCAqLywgY2h1bmtzX3RvX3Byb2Nlc3MsCisgICAgICAgICAgc2l6ZW9mKGNodW5rc190b19wcm9jZXNzKS81KTsKKyAgICB9CisjZW5kaWYgLyogUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRCAqLworCisKKyAgICAvKiBpbnN0ZWFkIG9mIGRvaW5nIHBuZ19pbml0X2lvKCkgaGVyZSwgbm93IHdlIHNldCB1cCBvdXIgY2FsbGJhY2sKKyAgICAgKiBmdW5jdGlvbnMgZm9yIHByb2dyZXNzaXZlIGRlY29kaW5nICovCisKKyAgICBwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4ocG5nX3B0ciwgbWFpbnByb2dfcHRyLAorICAgICAgcmVhZHBuZzJfaW5mb19jYWxsYmFjaywgcmVhZHBuZzJfcm93X2NhbGxiYWNrLCByZWFkcG5nMl9lbmRfY2FsbGJhY2spOworCisKKyAgICAvKiBtYWtlIHN1cmUgd2Ugc2F2ZSBvdXIgcG9pbnRlcnMgZm9yIHVzZSBpbiByZWFkcG5nMl9kZWNvZGVfZGF0YSgpICovCisKKyAgICBtYWlucHJvZ19wdHItPnBuZ19wdHIgPSBwbmdfcHRyOworICAgIG1haW5wcm9nX3B0ci0+aW5mb19wdHIgPSBpbmZvX3B0cjsKKworCisgICAgLyogYW5kIHRoYXQncyBhbGwgdGhlcmUgaXMgdG8gaW5pdGlhbGl6YXRpb24gKi8KKworICAgIHJldHVybiAwOworfQorCisKKworCisvKiByZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIDIgZm9yIGxpYnBuZyAobG9uZ2ptcCkgcHJvYmxlbSAqLworCitpbnQgcmVhZHBuZzJfZGVjb2RlX2RhdGEobWFpbnByb2dfaW5mbyAqbWFpbnByb2dfcHRyLCB1Y2ggKnJhd2J1ZiwgdWxnIGxlbmd0aCkKK3sKKyAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gKHBuZ19zdHJ1Y3RwKW1haW5wcm9nX3B0ci0+cG5nX3B0cjsKKyAgICBwbmdfaW5mb3AgaW5mb19wdHIgPSAocG5nX2luZm9wKW1haW5wcm9nX3B0ci0+aW5mb19wdHI7CisKKworICAgIC8qIHNldGptcCgpIG11c3QgYmUgY2FsbGVkIGluIGV2ZXJ5IGZ1bmN0aW9uIHRoYXQgY2FsbHMgYSBQTkctcmVhZGluZworICAgICAqIGxpYnBuZyBmdW5jdGlvbiAqLworCisgICAgaWYgKHNldGptcChtYWlucHJvZ19wdHItPmptcGJ1ZikpIHsKKyAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7CisgICAgICAgIG1haW5wcm9nX3B0ci0+cG5nX3B0ciA9IE5VTEw7CisgICAgICAgIG1haW5wcm9nX3B0ci0+aW5mb19wdHIgPSBOVUxMOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisKKworICAgIC8qIGhhbmQgb2ZmIHRoZSBuZXh0IGNodW5rIG9mIGlucHV0IGRhdGEgdG8gbGlicG5nIGZvciBkZWNvZGluZyAqLworCisgICAgcG5nX3Byb2Nlc3NfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgcmF3YnVmLCBsZW5ndGgpOworCisgICAgcmV0dXJuIDA7Cit9CisKKworCisKK3N0YXRpYyB2b2lkIHJlYWRwbmcyX2luZm9fY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQoreworICAgIG1haW5wcm9nX2luZm8gICptYWlucHJvZ19wdHI7CisgICAgaW50ICBjb2xvcl90eXBlLCBiaXRfZGVwdGg7CisgICAgcG5nX3VpbnRfMzIgd2lkdGgsIGhlaWdodDsKKyNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECisgICAgZG91YmxlICBnYW1tYTsKKyNlbHNlCisgICAgcG5nX2ZpeGVkX3BvaW50IGdhbW1hOworI2VuZGlmCisKKworICAgIC8qIHNldGptcCgpIGRvZXNuJ3QgbWFrZSBzZW5zZSBoZXJlLCBiZWNhdXNlIHdlJ2QgZWl0aGVyIGhhdmUgdG8gZXhpdCgpLAorICAgICAqIGxvbmdqbXAoKSBvdXJzZWx2ZXMsIG9yIHJldHVybiBjb250cm9sIHRvIGxpYnBuZywgd2hpY2ggZG9lc24ndCB3YW50CisgICAgICogdG8gc2VlIHVzIGFnYWluLiAgQnkgbm90IGRvaW5nIGFueXRoaW5nIGhlcmUsIGxpYnBuZyB3aWxsIGluc3RlYWQganVtcAorICAgICAqIHRvIHJlYWRwbmcyX2RlY29kZV9kYXRhKCksIHdoaWNoIGNhbiByZXR1cm4gYW4gZXJyb3IgdmFsdWUgdG8gdGhlIG1haW4KKyAgICAgKiBwcm9ncmFtLiAqLworCisKKyAgICAvKiByZXRyaWV2ZSB0aGUgcG9pbnRlciB0byBvdXIgc3BlY2lhbC1wdXJwb3NlIHN0cnVjdCwgdXNpbmcgdGhlIHBuZ19wdHIKKyAgICAgKiB0aGF0IGxpYnBuZyBwYXNzZWQgYmFjayB0byB1cyAoaS5lLiwgbm90IGEgZ2xvYmFsIHRoaXMgdGltZS0tdGhlcmUncworICAgICAqIG5vIHJlYWwgZGlmZmVyZW5jZSBmb3IgYSBzaW5nbGUgaW1hZ2UsIGJ1dCBmb3IgYSBtdWx0aXRocmVhZGVkIGJyb3dzZXIKKyAgICAgKiBkZWNvZGluZyBzZXZlcmFsIFBORyBpbWFnZXMgYXQgdGhlIHNhbWUgdGltZSwgb25lIG5lZWRzIHRvIGF2b2lkIG1peGluZworICAgICAqIHVwIGRpZmZlcmVudCBpbWFnZXMnIHN0cnVjdHMpICovCisKKyAgICBtYWlucHJvZ19wdHIgPSBwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0cihwbmdfcHRyKTsKKworICAgIGlmIChtYWlucHJvZ19wdHIgPT0gTlVMTCkgeyAgICAgICAgIC8qIHdlIGJlIGhvc2VkICovCisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICJyZWFkcG5nMiBlcnJvcjogIG1haW4gc3RydWN0IG5vdCByZWNvdmVyYWJsZSBpbiBpbmZvX2NhbGxiYWNrLlxuIik7CisgICAgICAgIGZmbHVzaChzdGRlcnIpOworICAgICAgICByZXR1cm47CisgICAgICAgIC8qCisgICAgICAgICAqIEFsdGVybmF0aXZlbHksIHdlIGNvdWxkIGNhbGwgb3VyIGVycm9yLWhhbmRsZXIganVzdCBsaWtlIGxpYnBuZworICAgICAgICAgKiBkb2VzLCB3aGljaCB3b3VsZCBlZmZlY3RpdmVseSB0ZXJtaW5hdGUgdGhlIHByb2dyYW0uICBTaW5jZSB0aGlzCisgICAgICAgICAqIGNhbiBvbmx5IGhhcHBlbiBpZiBwbmdfcHRyIGdldHMgcmVkaXJlY3RlZCBzb21ld2hlcmUgb2RkIG9yIHRoZQorICAgICAgICAgKiBtYWluIFBORyBzdHJ1Y3QgZ2V0cyB3aXBlZCwgd2UncmUgcHJvYmFibHkgdG9hc3QgYW55d2F5LiAgKElmCisgICAgICAgICAqIHBuZ19wdHIgaXRzZWxmIGlzIE5VTEwsIHdlIHdvdWxkIG5vdCBoYXZlIGJlZW4gY2FsbGVkLikKKyAgICAgICAgICovCisgICAgfQorCisKKyAgICAvKiB0aGlzIGlzIGp1c3QgbGlrZSBpbiB0aGUgbm9uLXByb2dyZXNzaXZlIGNhc2UgKi8KKworICAgIHBuZ19nZXRfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwgJndpZHRoLCAmaGVpZ2h0LCAmYml0X2RlcHRoLCAmY29sb3JfdHlwZSwKKyAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBtYWlucHJvZ19wdHItPndpZHRoID0gKHVsZyl3aWR0aDsKKyAgICBtYWlucHJvZ19wdHItPmhlaWdodCA9ICh1bGcpaGVpZ2h0OworCisKKyAgICAvKiBzaW5jZSB3ZSBrbm93IHdlJ3ZlIHJlYWQgYWxsIG9mIHRoZSBQTkcgZmlsZSdzICJoZWFkZXIiIChpLmUuLCB1cAorICAgICAqIHRvIElEQVQpLCB3ZSBjYW4gY2hlY2sgZm9yIGEgYmFja2dyb3VuZCBjb2xvciBoZXJlICovCisKKyAgICBpZiAobWFpbnByb2dfcHRyLT5uZWVkX2JnY29sb3IpCisgICAgeworICAgICAgICBwbmdfY29sb3JfMTZwIHBCYWNrZ3JvdW5kOworCisgICAgICAgIC8qIGl0IGlzIG5vdCBvYnZpb3VzIGZyb20gdGhlIGxpYnBuZyBkb2N1bWVudGF0aW9uLCBidXQgdGhpcyBmdW5jdGlvbgorICAgICAgICAgKiB0YWtlcyBhIHBvaW50ZXIgdG8gYSBwb2ludGVyLCBhbmQgaXQgYWx3YXlzIHJldHVybnMgdmFsaWQgcmVkLAorICAgICAgICAgKiBncmVlbiBhbmQgYmx1ZSB2YWx1ZXMsIHJlZ2FyZGxlc3Mgb2YgY29sb3JfdHlwZTogKi8KKyAgICAgICAgaWYgKHBuZ19nZXRfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgJnBCYWNrZ3JvdW5kKSkKKyAgICAgICAgeworCisgICAgICAgICAgIC8qIGhvd2V2ZXIsIGl0IGFsd2F5cyByZXR1cm5zIHRoZSByYXcgYktHRCBkYXRhLCByZWdhcmRsZXNzIG9mIGFueQorICAgICAgICAgICAgKiBiaXQtZGVwdGggdHJhbnNmb3JtYXRpb25zLCBzbyBjaGVjayBkZXB0aCBhbmQgYWRqdXN0IGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgaWYgKGJpdF9kZXB0aCA9PSAxNikgeworICAgICAgICAgICAgICAgbWFpbnByb2dfcHRyLT5iZ19yZWQgICA9IHBCYWNrZ3JvdW5kLT5yZWQgICA+PiA4OworICAgICAgICAgICAgICAgbWFpbnByb2dfcHRyLT5iZ19ncmVlbiA9IHBCYWNrZ3JvdW5kLT5ncmVlbiA+PiA4OworICAgICAgICAgICAgICAgbWFpbnByb2dfcHRyLT5iZ19ibHVlICA9IHBCYWNrZ3JvdW5kLT5ibHVlICA+PiA4OworICAgICAgICAgICB9IGVsc2UgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSAmJiBiaXRfZGVwdGggPCA4KSB7CisgICAgICAgICAgICAgICBpZiAoYml0X2RlcHRoID09IDEpCisgICAgICAgICAgICAgICAgICAgbWFpbnByb2dfcHRyLT5iZ19yZWQgPSBtYWlucHJvZ19wdHItPmJnX2dyZWVuID0KKyAgICAgICAgICAgICAgICAgICAgIG1haW5wcm9nX3B0ci0+YmdfYmx1ZSA9IHBCYWNrZ3JvdW5kLT5ncmF5PyAyNTUgOiAwOworICAgICAgICAgICAgICAgZWxzZSBpZiAoYml0X2RlcHRoID09IDIpCisgICAgICAgICAgICAgICAgICAgbWFpbnByb2dfcHRyLT5iZ19yZWQgPSBtYWlucHJvZ19wdHItPmJnX2dyZWVuID0KKyAgICAgICAgICAgICAgICAgICAgIG1haW5wcm9nX3B0ci0+YmdfYmx1ZSA9ICgyNTUvMykgKiBwQmFja2dyb3VuZC0+Z3JheTsKKyAgICAgICAgICAgICAgIGVsc2UgLyogYml0X2RlcHRoID09IDQgKi8KKyAgICAgICAgICAgICAgICAgICBtYWlucHJvZ19wdHItPmJnX3JlZCA9IG1haW5wcm9nX3B0ci0+YmdfZ3JlZW4gPQorICAgICAgICAgICAgICAgICAgICAgbWFpbnByb2dfcHRyLT5iZ19ibHVlID0gKDI1NS8xNSkgKiBwQmFja2dyb3VuZC0+Z3JheTsKKyAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgIG1haW5wcm9nX3B0ci0+YmdfcmVkICAgPSAodWNoKXBCYWNrZ3JvdW5kLT5yZWQ7CisgICAgICAgICAgICAgICBtYWlucHJvZ19wdHItPmJnX2dyZWVuID0gKHVjaClwQmFja2dyb3VuZC0+Z3JlZW47CisgICAgICAgICAgICAgICBtYWlucHJvZ19wdHItPmJnX2JsdWUgID0gKHVjaClwQmFja2dyb3VuZC0+Ymx1ZTsKKyAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKiBhcyBiZWZvcmUsIGxldCBsaWJwbmcgZXhwYW5kIHBhbGV0dGUgaW1hZ2VzIHRvIFJHQiwgbG93LWJpdC1kZXB0aAorICAgICAqIGdyYXlzY2FsZSBpbWFnZXMgdG8gOCBiaXRzLCB0cmFuc3BhcmVuY3kgY2h1bmtzIHRvIGZ1bGwgYWxwaGEgY2hhbm5lbDsKKyAgICAgKiBzdHJpcCAxNi1iaXQtcGVyLXNhbXBsZSBpbWFnZXMgdG8gOCBiaXRzIHBlciBzYW1wbGU7IGFuZCBjb252ZXJ0CisgICAgICogZ3JheXNjYWxlIHRvIFJHQltBXSAqLworCisgICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgICAgICAgcG5nX3NldF9leHBhbmQocG5nX3B0cik7CisgICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSAmJiBiaXRfZGVwdGggPCA4KQorICAgICAgICBwbmdfc2V0X2V4cGFuZChwbmdfcHRyKTsKKyAgICBpZiAocG5nX2dldF92YWxpZChwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0lORk9fdFJOUykpCisgICAgICAgIHBuZ19zZXRfZXhwYW5kKHBuZ19wdHIpOworI2lmZGVmIFBOR19SRUFEXzE2X1RPXzhfU1VQUE9SVEVECisgICAgaWYgKGJpdF9kZXB0aCA9PSAxNikKKyMgIGlmZGVmIFBOR19SRUFEX1NDQUxFXzE2X1RPXzhfU1VQUE9SVEVECisgICAgICAgIHBuZ19zZXRfc2NhbGVfMTYocG5nX3B0cik7CisjICBlbHNlCisgICAgICAgIHBuZ19zZXRfc3RyaXBfMTYocG5nX3B0cik7CisjICBlbmRpZgorI2VuZGlmCisgICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSB8fAorICAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpCisgICAgICAgIHBuZ19zZXRfZ3JheV90b19yZ2IocG5nX3B0cik7CisKKworICAgIC8qIFVubGlrZSB0aGUgYmFzaWMgdmlld2VyLCB3aGljaCB3YXMgZGVzaWduZWQgdG8gb3BlcmF0ZSBvbiBsb2NhbCBmaWxlcywKKyAgICAgKiB0aGlzIHByb2dyYW0gaXMgaW50ZW5kZWQgdG8gc2ltdWxhdGUgYSB3ZWIgYnJvd3Nlci0tZXZlbiB0aG91Z2ggd2UKKyAgICAgKiBhY3R1YWxseSByZWFkIGZyb20gYSBsb2NhbCBmaWxlLCB0b28uICBCdXQgYmVjYXVzZSB3ZSBhcmUgcHJldGVuZGluZworICAgICAqIHRoYXQgbW9zdCBvZiB0aGUgaW1hZ2VzIG9yaWdpbmF0ZSBvbiB0aGUgSW50ZXJuZXQsIHdlIGZvbGxvdyB0aGUgcmVjb20tCisgICAgICogbWVuZGF0aW9uIG9mIHRoZSBzUkdCIHByb3Bvc2FsIGFuZCB0cmVhdCB1bmxhYmVsbGVkIGltYWdlcyAobm8gZ0FNQQorICAgICAqIGNodW5rKSBhcyBleGlzdGluZyBpbiB0aGUgc1JHQiBjb2xvciBzcGFjZS4gIFRoYXQgaXMsIHdlIGFzc3VtZSB0aGF0CisgICAgICogc3VjaCBpbWFnZXMgaGF2ZSBhIGZpbGUgZ2FtbWEgb2YgMC40NTQ1NSwgd2hpY2ggY29ycmVzcG9uZHMgdG8gYSBQQy1saWtlCisgICAgICogZGlzcGxheSBzeXN0ZW0uICBUaGlzIGNoYW5nZSBpbiBhc3N1bXB0aW9ucyB3aWxsIGhhdmUgbm8gZWZmZWN0IG9uIGEKKyAgICAgKiBQQy1saWtlIHN5c3RlbSwgYnV0IG9uIGEgTWFjLCBTR0ksIE5lWFQgb3Igb3RoZXIgc3lzdGVtIHdpdGggYSBub24tCisgICAgICogaWRlbnRpdHkgbG9va3VwIHRhYmxlLCBpdCB3aWxsIGRhcmtlbiB1bmxhYmVsbGVkIGltYWdlcywgd2hpY2ggZWZmZWMtCisgICAgICogdGl2ZWx5IGZhdm9ycyBpbWFnZXMgZnJvbSBQQy1saWtlIHN5c3RlbXMgb3ZlciB0aG9zZSBvcmlnaW5hdGluZyBvbgorICAgICAqIHRoZSBsb2NhbCBwbGF0Zm9ybS4gIE5vdGUgdGhhdCBtYWlucHJvZ19wdHItPmRpc3BsYXlfZXhwb25lbnQgaXMgdGhlCisgICAgICogImdhbW1hIiB2YWx1ZSBmb3IgdGhlIGVudGlyZSBkaXNwbGF5IHN5c3RlbSwgaS5lLiwgdGhlIHByb2R1Y3Qgb2YKKyAgICAgKiBMVVRfZXhwb25lbnQgYW5kIENSVF9leHBvbmVudC4gKi8KKworI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKKyAgICBpZiAocG5nX2dldF9nQU1BKHBuZ19wdHIsIGluZm9fcHRyLCAmZ2FtbWEpKQorICAgICAgICBwbmdfc2V0X2dhbW1hKHBuZ19wdHIsIG1haW5wcm9nX3B0ci0+ZGlzcGxheV9leHBvbmVudCwgZ2FtbWEpOworICAgIGVsc2UKKyAgICAgICAgcG5nX3NldF9nYW1tYShwbmdfcHRyLCBtYWlucHJvZ19wdHItPmRpc3BsYXlfZXhwb25lbnQsIDAuNDU0NTUpOworI2Vsc2UKKyAgICBpZiAocG5nX2dldF9nQU1BX2ZpeGVkKHBuZ19wdHIsIGluZm9fcHRyLCAmZ2FtbWEpKQorICAgICAgICBwbmdfc2V0X2dhbW1hX2ZpeGVkKHBuZ19wdHIsCisgICAgICAgICAgICAocG5nX2ZpeGVkX3BvaW50KSgxMDAwMDAqbWFpbnByb2dfcHRyLT5kaXNwbGF5X2V4cG9uZW50Ky41KSwgZ2FtbWEpOworICAgIGVsc2UKKyAgICAgICAgcG5nX3NldF9nYW1tYV9maXhlZChwbmdfcHRyLAorICAgICAgICAgICAgKHBuZ19maXhlZF9wb2ludCkoMTAwMDAwKm1haW5wcm9nX3B0ci0+ZGlzcGxheV9leHBvbmVudCsuNSksIDQ1NDU1KTsKKyNlbmRpZgorCisgICAgLyogd2UnbGwgbGV0IGxpYnBuZyBleHBhbmQgaW50ZXJsYWNlZCBpbWFnZXMsIHRvbyAqLworCisgICAgbWFpbnByb2dfcHRyLT5wYXNzZXMgPSBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyhwbmdfcHRyKTsKKworCisgICAgLyogYWxsIHRyYW5zZm9ybWF0aW9ucyBoYXZlIGJlZW4gcmVnaXN0ZXJlZDsgbm93IHVwZGF0ZSBpbmZvX3B0ciBkYXRhIGFuZAorICAgICAqIHRoZW4gZ2V0IHJvd2J5dGVzIGFuZCBjaGFubmVscyAqLworCisgICAgcG5nX3JlYWRfdXBkYXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOworCisgICAgbWFpbnByb2dfcHRyLT5yb3dieXRlcyA9IChpbnQpcG5nX2dldF9yb3dieXRlcyhwbmdfcHRyLCBpbmZvX3B0cik7CisgICAgbWFpbnByb2dfcHRyLT5jaGFubmVscyA9IHBuZ19nZXRfY2hhbm5lbHMocG5nX3B0ciwgaW5mb19wdHIpOworCisKKyAgICAvKiBDYWxsIHRoZSBtYWluIHByb2dyYW0gdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW1hZ2UgYnVmZmVyIGFuZAorICAgICAqIGluaXRpYWxpemUgd2luZG93cyBhbmQgd2hhdG5vdC4gIChUaGUgb2xkLXN0eWxlIGZ1bmN0aW9uLXBvaW50ZXIKKyAgICAgKiBpbnZvY2F0aW9uIGlzIHVzZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBhIGZldyBzdXBwb3NlZGx5IEFOU0kKKyAgICAgKiBjb21waWxlcnMgdGhhdCBuZXZlcnRoZWxlc3MgYmFyZiBvbiAiZm5fcHRyKCkiLXN0eWxlIHN5bnRheC4pICovCisKKyAgICAoKm1haW5wcm9nX3B0ci0+bWFpbnByb2dfaW5pdCkoKTsKKworCisgICAgLyogYW5kIHRoYXQgdGFrZXMgY2FyZSBvZiBpbml0aWFsaXphdGlvbiAqLworCisgICAgcmV0dXJuOworfQorCisKKworCisKK3N0YXRpYyB2b2lkIHJlYWRwbmcyX3Jvd19jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgbmV3X3JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8zMiByb3dfbnVtLCBpbnQgcGFzcykKK3sKKyAgICBtYWlucHJvZ19pbmZvICAqbWFpbnByb2dfcHRyOworCisKKyAgICAvKiBmaXJzdCBjaGVjayB3aGV0aGVyIHRoZSByb3cgZGlmZmVycyBmcm9tIHRoZSBwcmV2aW91cyBwYXNzOyBpZiBub3QsCisgICAgICogbm90aGluZyB0byBjb21iaW5lIG9yIGRpc3BsYXkgKi8KKworICAgIGlmICghbmV3X3JvdykKKyAgICAgICAgcmV0dXJuOworCisKKyAgICAvKiByZXRyaWV2ZSB0aGUgcG9pbnRlciB0byBvdXIgc3BlY2lhbC1wdXJwb3NlIHN0cnVjdCBzbyB3ZSBjYW4gYWNjZXNzCisgICAgICogdGhlIG9sZCByb3dzIGFuZCBpbWFnZS1kaXNwbGF5IGNhbGxiYWNrIGZ1bmN0aW9uICovCisKKyAgICBtYWlucHJvZ19wdHIgPSBwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0cihwbmdfcHRyKTsKKworCisgICAgLyogc2F2ZSB0aGUgcGFzcyBudW1iZXIgZm9yIG9wdGlvbmFsIHVzZSBieSB0aGUgZnJvbnQgZW5kICovCisKKyAgICBtYWlucHJvZ19wdHItPnBhc3MgPSBwYXNzOworCisKKyAgICAvKiBoYXZlIGxpYnBuZyBlaXRoZXIgY29tYmluZSB0aGUgbmV3IHJvdyBkYXRhIHdpdGggdGhlIGV4aXN0aW5nIHJvdyBkYXRhCisgICAgICogZnJvbSBwcmV2aW91cyBwYXNzZXMgKGlmIGludGVybGFjZWQpIG9yIGVsc2UganVzdCBjb3B5IHRoZSBuZXcgcm93CisgICAgICogaW50byB0aGUgbWFpbiBwcm9ncmFtJ3MgaW1hZ2UgYnVmZmVyICovCisKKyAgICBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3cocG5nX3B0ciwgbWFpbnByb2dfcHRyLT5yb3dfcG9pbnRlcnNbcm93X251bV0sCisgICAgICBuZXdfcm93KTsKKworCisgICAgLyogZmluYWxseSwgY2FsbCB0aGUgZGlzcGxheSByb3V0aW5lIGluIHRoZSBtYWluIHByb2dyYW0gd2l0aCB0aGUgbnVtYmVyCisgICAgICogb2YgdGhlIHJvdyB3ZSBqdXN0IHVwZGF0ZWQgKi8KKworICAgICgqbWFpbnByb2dfcHRyLT5tYWlucHJvZ19kaXNwbGF5X3Jvdykocm93X251bSk7CisKKworICAgIC8qIGFuZCB3ZSdyZSByZWFkeSBmb3IgbW9yZSAqLworCisgICAgcmV0dXJuOworfQorCisKKworCisKK3N0YXRpYyB2b2lkIHJlYWRwbmcyX2VuZF9jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCit7CisgICAgbWFpbnByb2dfaW5mbyAgKm1haW5wcm9nX3B0cjsKKworCisgICAgLyogcmV0cmlldmUgdGhlIHBvaW50ZXIgdG8gb3VyIHNwZWNpYWwtcHVycG9zZSBzdHJ1Y3QgKi8KKworICAgIG1haW5wcm9nX3B0ciA9IHBuZ19nZXRfcHJvZ3Jlc3NpdmVfcHRyKHBuZ19wdHIpOworCisKKyAgICAvKiBsZXQgdGhlIG1haW4gcHJvZ3JhbSBrbm93IHRoYXQgaXQgc2hvdWxkIGZsdXNoIGFueSBidWZmZXJlZCBpbWFnZQorICAgICAqIGRhdGEgdG8gdGhlIGRpc3BsYXkgbm93IGFuZCBzZXQgYSAiZG9uZSIgZmxhZyBvciB3aGF0ZXZlciwgYnV0IG5vdGUKKyAgICAgKiB0aGF0IGl0IFNIT1VMRCBOT1QgREVTVFJPWSBUSEUgUE5HIFNUUlVDVFMgWUVULS1pbiBvdGhlciB3b3JkcywgZG8KKyAgICAgKiBOT1QgY2FsbCByZWFkcG5nMl9jbGVhbnVwKCkgZWl0aGVyIGhlcmUgb3IgaW4gdGhlIGZpbmlzaF9kaXNwbGF5KCkKKyAgICAgKiByb3V0aW5lOyB3YWl0IHVudGlsIGNvbnRyb2wgcmV0dXJucyB0byB0aGUgbWFpbiBwcm9ncmFtIHZpYQorICAgICAqIHJlYWRwbmcyX2RlY29kZV9kYXRhKCkgKi8KKworICAgICgqbWFpbnByb2dfcHRyLT5tYWlucHJvZ19maW5pc2hfZGlzcGxheSkoKTsKKworCisgICAgLyogYWxsIGRvbmUgKi8KKworICAgICh2b2lkKWluZm9fcHRyOyAvKiBVbnVzZWQgKi8KKworICAgIHJldHVybjsKK30KKworCisKKworCit2b2lkIHJlYWRwbmcyX2NsZWFudXAobWFpbnByb2dfaW5mbyAqbWFpbnByb2dfcHRyKQoreworICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSAocG5nX3N0cnVjdHApbWFpbnByb2dfcHRyLT5wbmdfcHRyOworICAgIHBuZ19pbmZvcCBpbmZvX3B0ciA9IChwbmdfaW5mb3ApbWFpbnByb2dfcHRyLT5pbmZvX3B0cjsKKworICAgIGlmIChwbmdfcHRyICYmIGluZm9fcHRyKQorICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLCBOVUxMKTsKKworICAgIG1haW5wcm9nX3B0ci0+cG5nX3B0ciA9IE5VTEw7CisgICAgbWFpbnByb2dfcHRyLT5pbmZvX3B0ciA9IE5VTEw7Cit9CisKKworc3RhdGljIHZvaWQgcmVhZHBuZzJfd2FybmluZ19oYW5kbGVyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBtc2cpCit7CisgICAgZnByaW50ZihzdGRlcnIsICJyZWFkcG5nMiBsaWJwbmcgd2FybmluZzogJXNcbiIsIG1zZyk7CisgICAgZmZsdXNoKHN0ZGVycik7CisgICAgKHZvaWQpcG5nX3B0cjsgLyogVW51c2VkICovCit9CisKKworc3RhdGljIHZvaWQgcmVhZHBuZzJfZXJyb3JfaGFuZGxlcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgbXNnKQoreworICAgIG1haW5wcm9nX2luZm8gICptYWlucHJvZ19wdHI7CisKKyAgICAvKiBUaGlzIGZ1bmN0aW9uLCBhc2lkZSBmcm9tIHRoZSBleHRyYSBzdGVwIG9mIHJldHJpZXZpbmcgdGhlICJlcnJvcgorICAgICAqIHBvaW50ZXIiIChiZWxvdykgYW5kIHRoZSBmYWN0IHRoYXQgaXQgZXhpc3RzIHdpdGhpbiB0aGUgYXBwbGljYXRpb24KKyAgICAgKiByYXRoZXIgdGhhbiB3aXRoaW4gbGlicG5nLCBpcyBlc3NlbnRpYWxseSBpZGVudGljYWwgdG8gbGlicG5nJ3MKKyAgICAgKiBkZWZhdWx0IGVycm9yIGhhbmRsZXIuICBUaGUgc2Vjb25kIHBvaW50IGlzIGNyaXRpY2FsOiAgc2luY2UgYm90aAorICAgICAqIHNldGptcCgpIGFuZCBsb25nam1wKCkgYXJlIGNhbGxlZCBmcm9tIHRoZSBzYW1lIGNvZGUsIHRoZXkgYXJlCisgICAgICogZ3VhcmFudGVlZCB0byBoYXZlIGNvbXBhdGlibGUgbm90aW9ucyBvZiBob3cgYmlnIGEgam1wX2J1ZiBpcywKKyAgICAgKiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgX0JTRF9TT1VSQ0Ugb3IgYW55dGhpbmcgZWxzZSBoYXMgKG9yIGhhcyBub3QpCisgICAgICogYmVlbiBkZWZpbmVkLiAqLworCisgICAgZnByaW50ZihzdGRlcnIsICJyZWFkcG5nMiBsaWJwbmcgZXJyb3I6ICVzXG4iLCBtc2cpOworICAgIGZmbHVzaChzdGRlcnIpOworCisgICAgbWFpbnByb2dfcHRyID0gcG5nX2dldF9lcnJvcl9wdHIocG5nX3B0cik7CisgICAgaWYgKG1haW5wcm9nX3B0ciA9PSBOVUxMKSB7ICAgICAgICAgLyogd2UgYXJlIGNvbXBsZXRlbHkgaG9zZWQgbm93ICovCisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICJyZWFkcG5nMiBzZXZlcmUgZXJyb3I6ICBqbXBidWYgbm90IHJlY292ZXJhYmxlOyB0ZXJtaW5hdGluZy5cbiIpOworICAgICAgICBmZmx1c2goc3RkZXJyKTsKKyAgICAgICAgZXhpdCg5OSk7CisgICAgfQorCisgICAgLyogTm93IHdlIGhhdmUgb3VyIGRhdGEgc3RydWN0dXJlIHdlIGNhbiB1c2UgdGhlIGluZm9ybWF0aW9uIGluIGl0CisgICAgICogdG8gcmV0dXJuIGNvbnRyb2wgdG8gb3VyIG93biBoaWdoZXIgbGV2ZWwgY29kZSAoYWxsIHRoZSBwb2ludHMKKyAgICAgKiB3aGVyZSAnc2V0am1wJyBpcyBjYWxsZWQgaW4gdGhpcyBmaWxlLikgIFRoaXMgd2lsbCB3b3JrIHdpdGggb3RoZXIKKyAgICAgKiBlcnJvciBoYW5kbGluZyBtZWNoYW5pc21zIGFzIHdlbGwgLSBsaWJwbmcgYWx3YXlzIGNhbGxzIHBuZ19lcnJvcgorICAgICAqIHdoZW4gaXQgY2FuIHByb2NlZWQgbm8gZnVydGhlciwgdGh1cywgc28gbG9uZyBhcyB0aGUgZXJyb3IgaGFuZGxlcgorICAgICAqIGlzIGludGVyY2VwdGVkLCBhcHBsaWNhdGlvbiBjb2RlIGNhbiBkbyBpdHMgb3duIGVycm9yIHJlY292ZXJ5LgorICAgICAqLworICAgIGxvbmdqbXAobWFpbnByb2dfcHRyLT5qbXBidWYsIDEpOworfQpkaWZmIC0tZ2l0IGEvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svcmVhZHBuZzIuaCBiL2xpYnBuZy9jb250cmliL2dyZWdib29rL3JlYWRwbmcyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIzNjYwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL2dyZWdib29rL3JlYWRwbmcyLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIHJwbmcyIC0gcHJvZ3Jlc3NpdmUtbW9kZWwgUE5HIGRpc3BsYXkgcHJvZ3JhbSAgICAgICAgICAgICAgICAgcmVhZHBuZzIuaAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwOCBHcmVnIFJvZWxvZnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcywiIHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQsCisgICAgICBleHByZXNzIG9yIGltcGxpZWQuICBJbiBubyBldmVudCBzaGFsbCB0aGUgYXV0aG9yIG9yIGNvbnRyaWJ1dG9ycworICAgICAgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgaW4gYW55IHdheSBmcm9tIHRoZSB1c2Ugb2YKKyAgICAgIHRoaXMgc29mdHdhcmUuCisKKyAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIERVQUwtTElDRU5TRUQuICBZb3UgbWF5IG1vZGlmeSBhbmQvb3IKKyAgICAgIHJlZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2Ygb25lIG9mIHRoZQorICAgICAgZm9sbG93aW5nIHR3byBsaWNlbnNlcyAoYXQgeW91ciBvcHRpb24pOgorCisKKyAgICAgIExJQ0VOU0UgMSAoIkJTRC1saWtlIHdpdGggYWR2ZXJ0aXNpbmcgY2xhdXNlIik6CisKKyAgICAgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICAgICAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZQorICAgICAgaXQgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCisgICAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgICAgbm90aWNlLCBkaXNjbGFpbWVyLCBhbmQgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMuCisgICAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgICAgbm90aWNlLCBkaXNjbGFpbWVyLCBhbmQgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YS0KKyAgICAgICAgIHRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAgICAgICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorCisgICAgICAgICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEdyZWcgUm9lbG9mcworICAgICAgICAgICAgYW5kIGNvbnRyaWJ1dG9ycyBmb3IgdGhlIGJvb2ssICJQTkc6IFRoZSBEZWZpbml0aXZlIEd1aWRlLCIKKyAgICAgICAgICAgIHB1Ymxpc2hlZCBieSBPJ1JlaWxseSBhbmQgQXNzb2NpYXRlcy4KKworCisgICAgICBMSUNFTlNFIDIgKEdOVSBHUEwgdjIgb3IgbGF0ZXIpOgorCisgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgICAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIFRSVUUKKyMgIGRlZmluZSBUUlVFIDEKKyMgIGRlZmluZSBGQUxTRSAwCisjZW5kaWYKKworI2lmbmRlZiBNQVgKKyMgIGRlZmluZSBNQVgoYSxiKSAgKChhKSA+IChiKT8gKGEpIDogKGIpKQorIyAgZGVmaW5lIE1JTihhLGIpICAoKGEpIDwgKGIpPyAoYSkgOiAoYikpCisjZW5kaWYKKworI2lmZGVmIERFQlVHCisjICBkZWZpbmUgVHJhY2UoeCkgIHtmcHJpbnRmIHggOyBmZmx1c2goc3RkZXJyKTsgZmZsdXNoKHN0ZG91dCk7fQorI2Vsc2UKKyMgIGRlZmluZSBUcmFjZSh4KSAgOworI2VuZGlmCisKK2VudW0gcnBuZzJfc3RhdGVzIHsKKyAgICBrUHJlSW5pdCA9IDAsCisgICAga1dpbmRvd0luaXQsCisgICAga0RvbmUKK307CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgIHVjaDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHVzaDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgIHVsZzsKKwordHlwZWRlZiBzdHJ1Y3QgX21haW5wcm9nX2luZm8geworICAgIGRvdWJsZSBkaXNwbGF5X2V4cG9uZW50OworICAgIHVsZyB3aWR0aDsKKyAgICB1bGcgaGVpZ2h0OworICAgIHZvaWQgKnBuZ19wdHI7CisgICAgdm9pZCAqaW5mb19wdHI7CisgICAgdm9pZCAoKm1haW5wcm9nX2luaXQpKHZvaWQpOworICAgIHZvaWQgKCptYWlucHJvZ19kaXNwbGF5X3JvdykodWxnIHJvd19udW0pOworICAgIHZvaWQgKCptYWlucHJvZ19maW5pc2hfZGlzcGxheSkodm9pZCk7CisgICAgdWNoICppbWFnZV9kYXRhOworICAgIHVjaCAqKnJvd19wb2ludGVyczsKKyAgICBqbXBfYnVmIGptcGJ1ZjsKKyAgICBpbnQgcGFzc2VzOyAgICAgICAgICAgICAgLyogbm90IHVzZWQgKi8KKyAgICBpbnQgcGFzczsKKyAgICBpbnQgcm93Ynl0ZXM7CisgICAgaW50IGNoYW5uZWxzOworICAgIGludCBuZWVkX2JnY29sb3I7CisgICAgaW50IHN0YXRlOworICAgIHVjaCBiZ19yZWQ7CisgICAgdWNoIGJnX2dyZWVuOworICAgIHVjaCBiZ19ibHVlOworfSBtYWlucHJvZ19pbmZvOworCisKKy8qIHByb3RvdHlwZXMgZm9yIHB1YmxpYyBmdW5jdGlvbnMgaW4gcmVhZHBuZzIuYyAqLworCit2b2lkIHJlYWRwbmcyX3ZlcnNpb25faW5mbyh2b2lkKTsKKworaW50IHJlYWRwbmcyX2NoZWNrX3NpZyh1Y2ggKnNpZywgaW50IG51bSk7CisKK2ludCByZWFkcG5nMl9pbml0KG1haW5wcm9nX2luZm8gKm1haW5wcm9nX3B0cik7CisKK2ludCByZWFkcG5nMl9kZWNvZGVfZGF0YShtYWlucHJvZ19pbmZvICptYWlucHJvZ19wdHIsIHVjaCAqcmF3YnVmLCB1bGcgbGVuZ3RoKTsKKwordm9pZCByZWFkcG5nMl9jbGVhbnVwKG1haW5wcm9nX2luZm8gKm1haW5wcm9nX3B0cik7CmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9ncmVnYm9vay9yZWFkcHBtLmMgYi9saWJwbmcvY29udHJpYi9ncmVnYm9vay9yZWFkcHBtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZlZmMzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL2dyZWdib29rL3JlYWRwcG0uYwpAQCAtMCwwICsxLDE4MyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgcnBuZyAtIHNpbXBsZSBQTkcgZGlzcGxheSBwcm9ncmFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZHBwbS5jCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIFRoaXMgaXMgYSBzcGVjaWFsLXB1cnBvc2UgcmVwbGFjZW1lbnQgZm9yIHJlYWRwbmcuYyB0aGF0IGFsbG93cyBiaW5hcnkKKyAgIFBQTSBmaWxlcyB0byBiZSB1c2VkIGluIHBsYWNlIG9mIFBORyBpbWFnZXMuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDA3IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzLCIgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZCwKKyAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCisgICAgICBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBpbiBhbnkgd2F5IGZyb20gdGhlIHVzZSBvZgorICAgICAgdGhpcyBzb2Z0d2FyZS4KKworICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgRFVBTC1MSUNFTlNFRC4gIFlvdSBtYXkgbW9kaWZ5IGFuZC9vcgorICAgICAgcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiBvbmUgb2YgdGhlCisgICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6CisKKworICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKKworICAgICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCisgICAgICBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucy4KKyAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQorICAgICAgICAgdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisKKyAgICAgICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgR3JlZyBSb2Vsb2ZzCisgICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgorICAgICAgICAgICAgcHVibGlzaGVkIGJ5IE8nUmVpbGx5IGFuZCBBc3NvY2lhdGVzLgorCisKKyAgICAgIExJQ0VOU0UgMiAoR05VIEdQTCB2MiBvciBsYXRlcik6CisKKyAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAicmVhZHBuZy5oIiAgICAvKiB0eXBlZGVmcywgY29tbW9uIG1hY3JvcywgcHVibGljIHByb3RvdHlwZXMgKi8KKworCit1bGcgIHdpZHRoLCBoZWlnaHQ7CitpbnQgIGJpdF9kZXB0aCwgY29sb3JfdHlwZSwgY2hhbm5lbHM7Cit1Y2ggICppbWFnZV9kYXRhID0gTlVMTDsKK0ZJTEUgKnNhdmVkX2luZmlsZTsKKworCit2b2lkIHJlYWRwbmdfdmVyc2lvbl9pbmZvKCkKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgIENvbXBpbGVkIHdpdGhvdXQgbGlicG5nLCB6bGliIG9yIFBCTVBMVVMvTmV0UEJNLlxuIik7Cit9CisKKworLyogcmV0dXJuIHZhbHVlID0gMCBmb3Igc3VjY2VzcywgMSBmb3IgYmFkIHNpZywgMiBmb3IgYmFkIElIRFIsIDQgZm9yIG5vIG1lbSAqLworCitpbnQgcmVhZHBuZ19pbml0KEZJTEUgKmluZmlsZSwgdWxnICpwV2lkdGgsIHVsZyAqcEhlaWdodCkKK3sKKyAgICBzdGF0aWMgdWNoIHBwbWxpbmVbMjU2XTsKKyAgICBpbnQgbWF4dmFsOworCisKKyAgICBzYXZlZF9pbmZpbGUgPSBpbmZpbGU7CisKKyAgICBmZ2V0cyhwcG1saW5lLCAyNTYsIGluZmlsZSk7CisgICAgaWYgKHBwbWxpbmVbMF0gIT0gJ1AnIHx8IHBwbWxpbmVbMV0gIT0gJzYnKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6ICBub3QgYSBQUE0gZmlsZVxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICAvKiBwb3NzaWJsZSBjb2xvciB0eXBlczogIFA1ID0gZ3JheXNjYWxlICgwKSwgUDYgPSBSR0IgKDIpLCBQOCA9IFJHQkEgKDYpICovCisgICAgaWYgKHBwbWxpbmVbMV0gPT0gJzYnKSB7CisgICAgICAgIGNvbG9yX3R5cGUgPSAyOworICAgICAgICBjaGFubmVscyA9IDM7CisgICAgfSBlbHNlIGlmIChwcG1saW5lWzFdID09ICc4JykgeworICAgICAgICBjb2xvcl90eXBlID0gNjsKKyAgICAgICAgY2hhbm5lbHMgPSA0OworICAgIH0gZWxzZSAvKiBpZiAocHBtbGluZVsxXSA9PSAnNScpICovIHsKKyAgICAgICAgY29sb3JfdHlwZSA9IDA7CisgICAgICAgIGNoYW5uZWxzID0gMTsKKyAgICB9CisKKyAgICBkbyB7CisgICAgICAgIGZnZXRzKHBwbWxpbmUsIDI1NiwgaW5maWxlKTsKKyAgICB9IHdoaWxlIChwcG1saW5lWzBdID09ICcjJyk7CisgICAgc3NjYW5mKHBwbWxpbmUsICIlbHUgJWx1IiwgJndpZHRoLCAmaGVpZ2h0KTsKKworICAgIGRvIHsKKyAgICAgICAgZmdldHMocHBtbGluZSwgMjU2LCBpbmZpbGUpOworICAgIH0gd2hpbGUgKHBwbWxpbmVbMF0gPT0gJyMnKTsKKyAgICBzc2NhbmYocHBtbGluZSwgIiVkIiwgJm1heHZhbCk7CisgICAgaWYgKG1heHZhbCAhPSAyNTUpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogIG1heHZhbCA9ICVkXG4iLCBtYXh2YWwpOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgYml0X2RlcHRoID0gODsKKworICAgICpwV2lkdGggPSB3aWR0aDsKKyAgICAqcEhlaWdodCA9IGhlaWdodDsKKworICAgIHJldHVybiAwOworfQorCisKKworCisvKiByZXR1cm5zIDAgaWYgc3VjY2VlZHMsIDEgaWYgZmFpbHMgZHVlIHRvIG5vIGJLR0QgY2h1bmssIDIgaWYgbGlicG5nIGVycm9yOworICogc2NhbGVzIHZhbHVlcyB0byA4LWJpdCBpZiBuZWNlc3NhcnkgKi8KKworaW50IHJlYWRwbmdfZ2V0X2JnY29sb3IodWNoICpyZWQsIHVjaCAqZ3JlZW4sIHVjaCAqYmx1ZSkKK3sKKyAgICByZXR1cm4gMTsKK30KKworCisKKworLyogZGlzcGxheV9leHBvbmVudCA9PSBMVVRfZXhwb25lbnQgKiBDUlRfZXhwb25lbnQgKi8KKwordWNoICpyZWFkcG5nX2dldF9pbWFnZShkb3VibGUgZGlzcGxheV9leHBvbmVudCwgaW50ICpwQ2hhbm5lbHMsIHVsZyAqcFJvd2J5dGVzKQoreworICAgIHVsZyAgcm93Ynl0ZXM7CisKKworICAgIC8qIGV4cGFuZCBwYWxldHRlIGltYWdlcyB0byBSR0IsIGxvdy1iaXQtZGVwdGggZ3JheXNjYWxlIGltYWdlcyB0byA4IGJpdHMsCisgICAgICogdHJhbnNwYXJlbmN5IGNodW5rcyB0byBmdWxsIGFscGhhIGNoYW5uZWw7IHN0cmlwIDE2LWJpdC1wZXItc2FtcGxlCisgICAgICogaW1hZ2VzIHRvIDggYml0cyBwZXIgc2FtcGxlOyBhbmQgY29udmVydCBncmF5c2NhbGUgdG8gUkdCW0FdICovCisKKyAgICAvKiBHUlIgV0FSTklORzogIGdyYXlzY2FsZSBuZWVkcyB0byBiZSBleHBhbmRlZCBhbmQgY2hhbm5lbHMgcmVzZXQhICovCisKKyAgICAqcFJvd2J5dGVzID0gcm93Ynl0ZXMgPSBjaGFubmVscyp3aWR0aDsKKyAgICAqcENoYW5uZWxzID0gY2hhbm5lbHM7CisKKyAgICBpZiAoKGltYWdlX2RhdGEgPSAodWNoICopbWFsbG9jKHJvd2J5dGVzKmhlaWdodCkpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgVHJhY2UoKHN0ZGVyciwgInJlYWRwbmdfZ2V0X2ltYWdlOiAgcm93Ynl0ZXMgPSAlbGQsIGhlaWdodCA9ICVsZFxuIiwgcm93Ynl0ZXMsIGhlaWdodCkpOworCisKKyAgICAvKiBub3cgd2UgY2FuIGdvIGFoZWFkIGFuZCBqdXN0IHJlYWQgdGhlIHdob2xlIGltYWdlICovCisKKyAgICBpZiAoZnJlYWQoaW1hZ2VfZGF0YSwgMUwsIHJvd2J5dGVzKmhlaWdodCwgc2F2ZWRfaW5maWxlKSA8CisgICAgICAgcm93Ynl0ZXMqaGVpZ2h0KSB7CisgICAgICAgIGZyZWUgKGltYWdlX2RhdGEpOworICAgICAgICBpbWFnZV9kYXRhID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGltYWdlX2RhdGE7Cit9CisKKwordm9pZCByZWFkcG5nX2NsZWFudXAoaW50IGZyZWVfaW1hZ2VfZGF0YSkKK3sKKyAgICBpZiAoZnJlZV9pbWFnZV9kYXRhICYmIGltYWdlX2RhdGEpIHsKKyAgICAgICAgZnJlZShpbWFnZV9kYXRhKTsKKyAgICAgICAgaW1hZ2VfZGF0YSA9IE5VTEw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svcnBuZy13aW4uYyBiL2xpYnBuZy9jb250cmliL2dyZWdib29rL3Jwbmctd2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUzZGRjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL2dyZWdib29rL3Jwbmctd2luLmMKQEAgLTAsMCArMSw3MjggQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIHJwbmcgLSBzaW1wbGUgUE5HIGRpc3BsYXkgcHJvZ3JhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnBuZy13aW4uYworCisgICBUaGlzIHByb2dyYW0gZGVjb2RlcyBhbmQgZGlzcGxheXMgUE5HIGltYWdlcywgd2l0aCBnYW1tYSBjb3JyZWN0aW9uIGFuZAorICAgb3B0aW9uYWxseSB3aXRoIGEgdXNlci1zcGVjaWZpZWQgYmFja2dyb3VuZCBjb2xvciAoaW4gY2FzZSB0aGUgaW1hZ2UgaGFzCisgICB0cmFuc3BhcmVuY3kpLiAgSXQgaXMgdmVyeSBuZWFybHkgdGhlIG1vc3QgYmFzaWMgUE5HIHZpZXdlciBwb3NzaWJsZS4KKyAgIFRoaXMgdmVyc2lvbiBpcyBmb3IgMzItYml0IFdpbmRvd3M7IGl0IG1heSBjb21waWxlIHVuZGVyIDE2LWJpdCBXaW5kb3dzCisgICB3aXRoIGEgbGl0dGxlIHR3ZWFraW5nIChvciBtYXliZSBub3QpLgorCisgICB0byBkbzoKKyAgICAtIGhhbmRsZSBxdW90ZWQgY29tbWFuZC1saW5lIGFyZ3MgKGVzcGVjaWFsbHkgZmlsZW5hbWVzIHdpdGggc3BhY2VzKQorICAgIC0gaGF2ZSBtaW5pbXVtIHdpbmRvdyB3aWR0aDogIG9oIHdlbGwKKyAgICAtIHVzZSAlLjEwMjNzIHRvIHNpbXBsaWZ5IHRydW5jYXRpb24gb2YgdGl0bGUtYmFyIHN0cmluZz8KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgQ2hhbmdlbG9nOgorICAgIC0gMS4wMDogIGluaXRpYWwgcHVibGljIHJlbGVhc2UKKyAgICAtIDEuMDE6ICBtb2RpZmllZCB0byBhbGxvdyBhYmJyZXZpYXRlZCBvcHRpb25zOyBmaXhlZCBsb25nL3Vsb25nIG1pcy0KKyAgICAgICAgICAgICAgbWF0Y2g7IHN3aXRjaGVkIHRvIHBuZ19qbXBidWYoKSBtYWNybworICAgIC0gMS4wMjogIGFkZGVkIGV4dHJhIHNldCBvZiBwYXJlbnRoZXNlcyB0byBwbmdfam1wYnVmKCkgbWFjcm87IGZpeGVkCisgICAgICAgICAgICAgIGNvbW1hbmQtbGluZSBwYXJzaW5nIGJ1ZworICAgIC0gMS4xMDogIGVuYWJsZWQgIm1lc3NhZ2Ugd2luZG93Ii9jb25zb2xlICh0aGFua3MgdG8gRGF2aWQgR2VsZHJlaWNoKQorICAgIC0gMi4wMDogIGR1YWwtbGljZW5zZWQgKGFkZGVkIEdOVSBHUEwpCisgICAgLSAyLjAxOiAgZml4ZWQgaW1wcm9wZXIgZGlzcGxheSBvZiB1c2FnZSBzY3JlZW4gb24gUE5HIGVycm9yKHMpCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDA4IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzLCIgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZCwKKyAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCisgICAgICBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBpbiBhbnkgd2F5IGZyb20gdGhlIHVzZSBvZgorICAgICAgdGhpcyBzb2Z0d2FyZS4KKworICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgRFVBTC1MSUNFTlNFRC4gIFlvdSBtYXkgbW9kaWZ5IGFuZC9vcgorICAgICAgcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiBvbmUgb2YgdGhlCisgICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6CisKKworICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKKworICAgICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCisgICAgICBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucy4KKyAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQorICAgICAgICAgdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisKKyAgICAgICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgR3JlZyBSb2Vsb2ZzCisgICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgorICAgICAgICAgICAgcHVibGlzaGVkIGJ5IE8nUmVpbGx5IGFuZCBBc3NvY2lhdGVzLgorCisKKyAgICAgIExJQ0VOU0UgMiAoR05VIEdQTCB2MiBvciBsYXRlcik6CisKKyAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgUFJPR05BTUUgICJycG5nLXdpbiIKKyNkZWZpbmUgTE9OR05BTUUgICJTaW1wbGUgUE5HIFZpZXdlciBmb3IgV2luZG93cyIKKyNkZWZpbmUgVkVSU0lPTiAgICIyLjAxIG9mIDE2IE1hcmNoIDIwMDgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaWZkZWYgX19DWUdXSU5fXworLyogZ2V0Y2ggcmVwbGFjZW1lbnQuIFR1cm5zIG91dCwgd2UgZG9uJ3QgcmVhbGx5IG5lZWQgdGhpcywKKyAqIGJ1dCBsZWF2ZSBpdCBoZXJlIGlmIHdlIGV2ZXIgZW5hYmxlIGFueSBvZiB0aGUgdXNlcyBvZgorICogX2dldGNoIGluIHRoZSBtYWluIGNvZGUKKyAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHRlcm1pby5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgoraW50IHJlcGxfZ2V0Y2goIHZvaWQgKQoreworICBjaGFyIGNoOworICBpbnQgZmQgPSBmaWxlbm8oc3RkaW4pOworICBzdHJ1Y3QgdGVybWlvIG9sZF90dHksIG5ld190dHk7CisKKyAgaW9jdGwoZmQsIFRDR0VUQSwgJm9sZF90dHkpOworICBuZXdfdHR5ID0gb2xkX3R0eTsKKyAgbmV3X3R0eS5jX2xmbGFnICY9IH4oSUNBTk9OIHwgRUNITyB8IElTSUcpOworICBpb2N0bChmZCwgVENTRVRBLCAmbmV3X3R0eSk7CisgIGZyZWFkKCZjaCwgMSwgc2l6ZW9mKGNoKSwgc3RkaW4pOworICBpb2N0bChmZCwgVENTRVRBLCAmb2xkX3R0eSk7CisKKyAgcmV0dXJuIGNoOworfQorI2RlZmluZSBfZ2V0Y2ggcmVwbF9nZXRjaAorI2Vsc2UKKyNpbmNsdWRlIDxjb25pby5oPiAgICAgIC8qIG9ubHkgZm9yIF9nZXRjaCgpICovCisjZW5kaWYKKworLyogI2RlZmluZSBERUJVRyAgOiAgdGhpcyBlbmFibGVzIHRoZSBUcmFjZSgpIG1hY3JvcyAqLworCisjaW5jbHVkZSAicmVhZHBuZy5oIiAgICAvKiB0eXBlZGVmcywgY29tbW9uIG1hY3JvcywgcmVhZHBuZyBwcm90b3R5cGVzICovCisKKworLyogY291bGQganVzdCBpbmNsdWRlIHBuZy5oLCBidXQgdGhpcyBtYWNybyBpcyB0aGUgb25seSB0aGluZyB3ZSBuZWVkCisgKiAobmFtZSBhbmQgdHlwZWRlZnMgY2hhbmdlZCB0byBsb2NhbCB2ZXJzaW9ucyk7IG5vdGUgdGhhdCBzaWRlIGVmZmVjdHMKKyAqIG9ubHkgaGFwcGVuIHdpdGggYWxwaGEgKHdoaWNoIGNvdWxkIGVhc2lseSBiZSBhdm9pZGVkIHdpdGgKKyAqICJ1c2ggYWNvcHkgPSAoYWxwaGEpOyIpICovCisKKyNkZWZpbmUgYWxwaGFfY29tcG9zaXRlKGNvbXBvc2l0ZSwgZmcsIGFscGhhLCBiZykgeyAgICAgICAgICAgICAgIFwKKyAgICB1c2ggdGVtcCA9ICgodXNoKShmZykqKHVzaCkoYWxwaGEpICsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAodXNoKShiZykqKHVzaCkoMjU1IC0gKHVzaCkoYWxwaGEpKSArICh1c2gpMTI4KTsgIFwKKyAgICAoY29tcG9zaXRlKSA9ICh1Y2gpKCh0ZW1wICsgKHRlbXAgPj4gOCkpID4+IDgpOyAgICAgICAgICAgICAgIFwKK30KKworCisvKiBsb2NhbCBwcm90b3R5cGVzICovCitzdGF0aWMgaW50ICAgICAgICBycG5nX3dpbl9jcmVhdGVfd2luZG93KEhJTlNUQU5DRSBoSW5zdCwgaW50IHNob3dtb2RlKTsKK3N0YXRpYyBpbnQgICAgICAgIHJwbmdfd2luX2Rpc3BsYXlfaW1hZ2Uodm9pZCk7CitzdGF0aWMgdm9pZCAgICAgICBycG5nX3dpbl9jbGVhbnVwKHZvaWQpOworTFJFU1VMVCBDQUxMQkFDSyAgcnBuZ193aW5fd25kcHJvYyhIV05ELCBVSU5ULCBXUEFSQU0sIExQQVJBTSk7CisKKworc3RhdGljIGNoYXIgdGl0bGViYXJbMTAyNF07CitzdGF0aWMgY2hhciAqcHJvZ25hbWUgPSBQUk9HTkFNRTsKK3N0YXRpYyBjaGFyICphcHBuYW1lID0gTE9OR05BTUU7CitzdGF0aWMgY2hhciAqZmlsZW5hbWU7CitzdGF0aWMgRklMRSAqaW5maWxlOworCitzdGF0aWMgY2hhciAqYmdzdHI7CitzdGF0aWMgdWNoIGJnX3JlZD0wLCBiZ19ncmVlbj0wLCBiZ19ibHVlPTA7CisKK3N0YXRpYyBkb3VibGUgZGlzcGxheV9leHBvbmVudDsKKworc3RhdGljIHVsZyBpbWFnZV93aWR0aCwgaW1hZ2VfaGVpZ2h0LCBpbWFnZV9yb3dieXRlczsKK3N0YXRpYyBpbnQgaW1hZ2VfY2hhbm5lbHM7CitzdGF0aWMgdWNoICppbWFnZV9kYXRhOworCisvKiBXaW5kb3dzLXNwZWNpZmljIHZhcmlhYmxlcyAqLworc3RhdGljIHVsZyB3aW1hZ2Vfcm93Ynl0ZXM7CitzdGF0aWMgdWNoICpkaWI7CitzdGF0aWMgdWNoICp3aW1hZ2VfZGF0YTsKK3N0YXRpYyBCSVRNQVBJTkZPSEVBREVSICpibWloOworCitzdGF0aWMgSFdORCBnbG9iYWxfaHduZDsKKworCisKKworaW50IFdJTkFQSSBXaW5NYWluKEhJTlNUQU5DRSBoSW5zdCwgSElOU1RBTkNFIGhQcmV2SW5zdCwgUFNUUiBjbWQsIGludCBzaG93bW9kZSkKK3sKKyAgICBjaGFyICphcmdzWzEwMjRdOyAgICAgICAgICAgICAgICAgLyogYXJiaXRyYXJ5IGxpbWl0LCBidXQgc2hvdWxkIHN1ZmZpY2UgKi8KKyAgICBjaGFyICpwLCAqcSwgKiphcmd2ID0gYXJnczsKKyAgICBpbnQgYXJnYyA9IDA7CisgICAgaW50IHJjLCBhbGVuLCBmbGVuOworICAgIGludCBlcnJvciA9IDA7CisgICAgaW50IGhhdmVfYmcgPSBGQUxTRTsKKyAgICBkb3VibGUgTFVUX2V4cG9uZW50OyAgICAgICAgICAgICAgLyoganVzdCB0aGUgbG9va3VwIHRhYmxlICovCisgICAgZG91YmxlIENSVF9leHBvbmVudCA9IDIuMjsgICAgICAgIC8qIGp1c3QgdGhlIG1vbml0b3IgKi8KKyAgICBkb3VibGUgZGVmYXVsdF9kaXNwbGF5X2V4cG9uZW50OyAgLyogd2hvbGUgZGlzcGxheSBzeXN0ZW0gKi8KKyAgICBNU0cgbXNnOworCisKKyAgICBmaWxlbmFtZSA9IChjaGFyICopTlVMTDsKKworI2lmbmRlZiBfX0NZR1dJTl9fCisgICAgLyogRmlyc3QgcmVlbmFibGUgY29uc29sZSBvdXRwdXQsIHdoaWNoIG5vcm1hbGx5IGdvZXMgdG8gdGhlIGJpdCBidWNrZXQKKyAgICAgKiBmb3Igd2luZG93ZWQgYXBwcy4gIENsb3NpbmcgdGhlIGNvbnNvbGUgd2luZG93IHdpbGwgdGVybWluYXRlIHRoZQorICAgICAqIGFwcC4gIFRoYW5rcyB0byBEYXZpZC5HZWxkcmVpY2hAcmVhbHZpei5jb20gZm9yIHN1cHBseWluZyB0aGUgbWFnaWNhbAorICAgICAqIGluY2FudGF0aW9uLiAqLworCisgICAgQWxsb2NDb25zb2xlKCk7CisgICAgZnJlb3BlbigiQ09OT1VUJCIsICJhIiwgc3RkZXJyKTsKKyAgICBmcmVvcGVuKCJDT05PVVQkIiwgImEiLCBzdGRvdXQpOworI2VuZGlmCisKKworICAgIC8qIE5leHQgc2V0IHRoZSBkZWZhdWx0IHZhbHVlIGZvciBvdXIgZGlzcGxheS1zeXN0ZW0gZXhwb25lbnQsIGkuZS4sCisgICAgICogdGhlIHByb2R1Y3Qgb2YgdGhlIENSVCBleHBvbmVudCBhbmQgdGhlIGV4cG9uZW50IGNvcnJlc3BvbmRpbmcgdG8KKyAgICAgKiB0aGUgZnJhbWUtYnVmZmVyJ3MgbG9va3VwIHRhYmxlIChMVVQpLCBpZiBhbnkuICBUaGlzIGlzIG5vdCBhbgorICAgICAqIGV4aGF1c3RpdmUgbGlzdCBvZiBMVVQgdmFsdWVzIChlLmcuLCBPcGVuU3RlcCBoYXMgYSBsb3Qgb2Ygd2VpcmQKKyAgICAgKiBvbmVzKSwgYnV0IGl0IHNob3VsZCBjb3ZlciA5OSUgb2YgdGhlIGN1cnJlbnQgcG9zc2liaWxpdGllcy4gIEFuZAorICAgICAqIHllcywgdGhlc2UgaWZkZWZzIGFyZSBjb21wbGV0ZWx5IHdhc3RlZCBpbiBhIFdpbmRvd3MgcHJvZ3JhbS4uLiAqLworCisjaWYgZGVmaW5lZChOZVhUKQorICAgIExVVF9leHBvbmVudCA9IDEuMCAvIDIuMjsKKyAgICAvKgorICAgIGlmIChzb21lX25leHRfZnVuY3Rpb25fdGhhdF9yZXR1cm5zX2dhbW1hKCZuZXh0X2dhbW1hKSkKKyAgICAgICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gbmV4dF9nYW1tYTsKKyAgICAgKi8KKyNlbGlmIGRlZmluZWQoc2dpKQorICAgIExVVF9leHBvbmVudCA9IDEuMCAvIDEuNzsKKyAgICAvKiB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYW55IGRvY3VtZW50ZWQgZnVuY3Rpb24gdG8gZ2V0IHRoZQorICAgICAqICJnYW1tYSIgdmFsdWUsIHNvIHdlIGRvIGl0IHRoZSBoYXJkIHdheSAqLworICAgIGluZmlsZSA9IGZvcGVuKCIvZXRjL2NvbmZpZy9zeXN0ZW0uZ2xHYW1tYVZhbCIsICJyIik7CisgICAgaWYgKGluZmlsZSkgeworICAgICAgICBkb3VibGUgc2dpX2dhbW1hOworCisgICAgICAgIGZnZXRzKHRtcGxpbmUsIDgwLCBpbmZpbGUpOworICAgICAgICBmY2xvc2UoaW5maWxlKTsKKyAgICAgICAgc2dpX2dhbW1hID0gYXRvZih0bXBsaW5lKTsKKyAgICAgICAgaWYgKHNnaV9nYW1tYSA+IDAuMCkKKyAgICAgICAgICAgIExVVF9leHBvbmVudCA9IDEuMCAvIHNnaV9nYW1tYTsKKyAgICB9CisjZWxpZiBkZWZpbmVkKE1hY2ludG9zaCkKKyAgICBMVVRfZXhwb25lbnQgPSAxLjggLyAyLjYxOworICAgIC8qCisgICAgaWYgKHNvbWVfbWFjX2Z1bmN0aW9uX3RoYXRfcmV0dXJuc19nYW1tYSgmbWFjX2dhbW1hKSkKKyAgICAgICAgTFVUX2V4cG9uZW50ID0gbWFjX2dhbW1hIC8gMi42MTsKKyAgICAgKi8KKyNlbHNlCisgICAgTFVUX2V4cG9uZW50ID0gMS4wOyAgIC8qIGFzc3VtZSBubyBMVVQ6ICBtb3N0IFBDcyAqLworI2VuZGlmCisKKyAgICAvKiB0aGUgZGVmYXVsdHMgYWJvdmUgZ2l2ZSAxLjAsIDEuMywgMS41IGFuZCAyLjIsIHJlc3BlY3RpdmVseTogKi8KKyAgICBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQgPSBMVVRfZXhwb25lbnQgKiBDUlRfZXhwb25lbnQ7CisKKworICAgIC8qIElmIHRoZSB1c2VyIGhhcyBzZXQgdGhlIFNDUkVFTl9HQU1NQSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhcyBzdWdnZXN0ZWQKKyAgICAgKiAoc29tZXdoYXQgaW1wcmVjaXNlbHkpIGluIHRoZSBsaWJwbmcgZG9jdW1lbnRhdGlvbiwgdXNlIHRoYXQ7IG90aGVyd2lzZQorICAgICAqIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSB3ZSBqdXN0IGNhbGN1bGF0ZWQuICBFaXRoZXIgd2F5LCB0aGUgdXNlciBtYXkKKyAgICAgKiBvdmVycmlkZSB0aGlzIHZpYSBhIGNvbW1hbmQtbGluZSBvcHRpb24uICovCisKKyAgICBpZiAoKHAgPSBnZXRlbnYoIlNDUkVFTl9HQU1NQSIpKSAhPSBOVUxMKQorICAgICAgICBkaXNwbGF5X2V4cG9uZW50ID0gYXRvZihwKTsKKyAgICBlbHNlCisgICAgICAgIGRpc3BsYXlfZXhwb25lbnQgPSBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQ7CisKKworICAgIC8qIFdpbmRvd3MgcmVhbGx5IGhhdGVzIGNvbW1hbmQgbGluZXMsIHNvIHdlIGhhdmUgdG8gc2V0IHVwIG91ciBvd24gYXJndi4KKyAgICAgKiBOb3RlIHRoYXQgd2UgZG8gTk9UIGJvdGhlciB3aXRoIHF1b3RlZCBhcmd1bWVudHMgaGVyZSwgc28gZG9uJ3QgdXNlCisgICAgICogZmlsZW5hbWVzIHdpdGggc3BhY2VzIGluICdlbSEgKi8KKworICAgIGFyZ3ZbYXJnYysrXSA9IFBST0dOQU1FOworICAgIHAgPSBjbWQ7CisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoKnAgPT0gJyAnKQorICAgICAgICAgICAgd2hpbGUgKCorK3AgPT0gJyAnKQorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgLyogbm93IHAgcG9pbnRzIGF0IHRoZSBmaXJzdCBub24tc3BhY2UgYWZ0ZXIgc29tZSBzcGFjZXMgKi8KKyAgICAgICAgaWYgKCpwID09ICdcMCcpCisgICAgICAgICAgICBicmVhazsgICAgLyogbm90aGluZyBhZnRlciB0aGUgc3BhY2VzOiAgZG9uZSAqLworICAgICAgICBhcmd2W2FyZ2MrK10gPSBxID0gcDsKKyAgICAgICAgd2hpbGUgKCpxICYmICpxICE9ICcgJykKKyAgICAgICAgICAgICsrcTsKKyAgICAgICAgLyogbm93IHEgcG9pbnRzIGF0IGEgc3BhY2Ugb3IgdGhlIGVuZCBvZiB0aGUgc3RyaW5nICovCisgICAgICAgIGlmICgqcSA9PSAnXDAnKQorICAgICAgICAgICAgYnJlYWs7ICAgIC8qIGxhc3QgYXJndiBhbHJlYWR5IHRlcm1pbmF0ZWQ7IHF1aXQgKi8KKyAgICAgICAgKnEgPSAnXDAnOyAgICAvKiBjaGFuZ2Ugc3BhY2UgdG8gdGVybWluYXRvciAqLworICAgICAgICBwID0gcSArIDE7CisgICAgfQorICAgIGFyZ3ZbYXJnY10gPSBOVUxMOyAgIC8qIHRlcm1pbmF0ZSB0aGUgYXJndiBhcnJheSBpdHNlbGYgKi8KKworCisgICAgLyogTm93IHBhcnNlIHRoZSBjb21tYW5kIGxpbmUgZm9yIG9wdGlvbnMgYW5kIHRoZSBQTkcgZmlsZW5hbWUuICovCisKKyAgICB3aGlsZSAoKisrYXJndiAmJiAhZXJyb3IpIHsKKyAgICAgICAgaWYgKCFzdHJuY21wKCphcmd2LCAiLWdhbW1hIiwgMikpIHsKKyAgICAgICAgICAgIGlmICghKisrYXJndikKKyAgICAgICAgICAgICAgICArK2Vycm9yOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgZGlzcGxheV9leHBvbmVudCA9IGF0b2YoKmFyZ3YpOworICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5X2V4cG9uZW50IDw9IDAuMCkKKyAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1iZ2NvbG9yIiwgMikpIHsKKyAgICAgICAgICAgIGlmICghKisrYXJndikKKyAgICAgICAgICAgICAgICArK2Vycm9yOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYmdzdHIgPSAqYXJndjsKKyAgICAgICAgICAgICAgICBpZiAoc3RybGVuKGJnc3RyKSAhPSA3IHx8IGJnc3RyWzBdICE9ICcjJykKKyAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGhhdmVfYmcgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCoqYXJndiAhPSAnLScpIHsKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9ICphcmd2OworICAgICAgICAgICAgICAgIGlmIChhcmd2WzFdKSAgIC8qIHNob3VsZG4ndCBiZSBhbnkgbW9yZSBhcmdzIGFmdGVyIGZpbGVuYW1lICovCisgICAgICAgICAgICAgICAgICAgICsrZXJyb3I7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICArK2Vycm9yOyAgIC8qIG5vdCBleHBlY3RpbmcgYW55IG90aGVyIG9wdGlvbnMgKi8KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghZmlsZW5hbWUpCisgICAgICAgICsrZXJyb3I7CisKKworICAgIC8qIHByaW50IHVzYWdlIHNjcmVlbiBpZiBhbnkgZXJyb3JzIHVwIHRvIHRoaXMgcG9pbnQgKi8KKworICAgIGlmIChlcnJvcikgeworI2lmbmRlZiBfX0NZR1dJTl9fCisgICAgICAgIGludCBjaDsKKyNlbmRpZgorCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4lcyAlczogICVzXG5cbiIsIFBST0dOQU1FLCBWRVJTSU9OLCBhcHBuYW1lKTsKKyAgICAgICAgcmVhZHBuZ192ZXJzaW9uX2luZm8oKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIKKyAgICAgICAgICAiVXNhZ2U6ICAlcyBbLWdhbW1hIGV4cF0gWy1iZ2NvbG9yIGJnXSBmaWxlLnBuZ1xuIgorICAgICAgICAgICIgICAgZXhwIFx0dHJhbnNmZXItZnVuY3Rpb24gZXhwb25lbnQgKGBgZ2FtbWEnJykgb2YgdGhlIGRpc3BsYXlcbiIKKyAgICAgICAgICAiXHRcdCAgc3lzdGVtIGluIGZsb2F0aW5nLXBvaW50IGZvcm1hdCAoZS5nLiwgYGAlLjFmJycpOyBlcXVhbFxuIgorICAgICAgICAgICJcdFx0ICB0byB0aGUgcHJvZHVjdCBvZiB0aGUgbG9va3VwLXRhYmxlIGV4cG9uZW50ICh2YXJpZXMpXG4iCisgICAgICAgICAgIlx0XHQgIGFuZCB0aGUgQ1JUIGV4cG9uZW50ICh1c3VhbGx5IDIuMik7IG11c3QgYmUgcG9zaXRpdmVcbiIKKyAgICAgICAgICAiICAgIGJnICBcdGRlc2lyZWQgYmFja2dyb3VuZCBjb2xvciBpbiA3LWNoYXJhY3RlciBoZXggUkdCIGZvcm1hdFxuIgorICAgICAgICAgICJcdFx0ICAoZS5nLiwgYGAjZmY3NzAwJycgZm9yIG9yYW5nZTogIHNhbWUgYXMgSFRNTCBjb2xvcnMpO1xuIgorICAgICAgICAgICJcdFx0ICB1c2VkIHdpdGggdHJhbnNwYXJlbnQgaW1hZ2VzXG4iCisgICAgICAgICAgIlxuUHJlc3MgUSwgRXNjIG9yIG1vdXNlIGJ1dHRvbiAxIGFmdGVyIGltYWdlIGlzIGRpc3BsYXllZCB0byBxdWl0LlxuIgorI2lmbmRlZiBfX0NZR1dJTl9fCisgICAgICAgICAgIlByZXNzIFEgb3IgRXNjIHRvIHF1aXQgdGhpcyB1c2FnZSBzY3JlZW4uXG4iCisjZW5kaWYKKyAgICAgICAgICAiXG4iLCBQUk9HTkFNRSwgZGVmYXVsdF9kaXNwbGF5X2V4cG9uZW50KTsKKyNpZm5kZWYgX19DWUdXSU5fXworICAgICAgICBkbworICAgICAgICAgICAgY2ggPSBfZ2V0Y2goKTsKKyAgICAgICAgd2hpbGUgKGNoICE9ICdxJyAmJiBjaCAhPSAnUScgJiYgY2ggIT0gMHgxQik7CisjZW5kaWYKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKworICAgIGlmICghKGluZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAicmIiKSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBjYW4ndCBvcGVuIFBORyBmaWxlIFslc11cbiIsIGZpbGVuYW1lKTsKKyAgICAgICAgKytlcnJvcjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKHJjID0gcmVhZHBuZ19pbml0KGluZmlsZSwgJmltYWdlX3dpZHRoLCAmaW1hZ2VfaGVpZ2h0KSkgIT0gMCkgeworICAgICAgICAgICAgc3dpdGNoIChyYykgeworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCisgICAgICAgICAgICAgICAgICAgICAgIjogIFslc10gaXMgbm90IGEgUE5HIGZpbGU6IGluY29ycmVjdCBzaWduYXR1cmVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQorICAgICAgICAgICAgICAgICAgICAgICI6ICBbJXNdIGhhcyBiYWQgSUhEUiAobGlicG5nIGxvbmdqbXApXG4iLCBmaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBpbnN1ZmZpY2llbnQgbWVtb3J5XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCisgICAgICAgICAgICAgICAgICAgICAgIjogIHVua25vd24gcmVhZHBuZ19pbml0KCkgZXJyb3JcbiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVycm9yKQorICAgICAgICAgICAgZmNsb3NlKGluZmlsZSk7CisgICAgfQorCisKKyAgICBpZiAoZXJyb3IpIHsKKyNpZm5kZWYgX19DWUdXSU5fXworICAgICAgICBpbnQgY2g7CisjZW5kaWYKKworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGFib3J0aW5nLlxuIik7CisjaWZuZGVmIF9fQ1lHV0lOX18KKyAgICAgICAgZG8KKyAgICAgICAgICAgIGNoID0gX2dldGNoKCk7CisgICAgICAgIHdoaWxlIChjaCAhPSAncScgJiYgY2ggIT0gJ1EnICYmIGNoICE9IDB4MUIpOworI2VuZGlmCisgICAgICAgIGV4aXQoMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiVzICVzOiAgJXNcbiIsIFBST0dOQU1FLCBWRVJTSU9OLCBhcHBuYW1lKTsKKyNpZm5kZWYgX19DWUdXSU5fXworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAiXG4gICBbY29uc29sZSB3aW5kb3c6ICBjbG9zaW5nIHRoaXMgd2luZG93IHdpbGwgdGVybWluYXRlICVzXVxuXG4iLAorICAgICAgICAgIFBST0dOQU1FKTsKKyNlbmRpZgorICAgIH0KKworCisgICAgLyogc2V0IHRoZSB0aXRsZS1iYXIgc3RyaW5nLCBidXQgbWFrZSBzdXJlIGJ1ZmZlciBkb2Vzbid0IG92ZXJmbG93ICovCisKKyAgICBhbGVuID0gc3RybGVuKGFwcG5hbWUpOworICAgIGZsZW4gPSBzdHJsZW4oZmlsZW5hbWUpOworICAgIGlmIChhbGVuICsgZmxlbiArIDMgPiAxMDIzKQorICAgICAgICBzcHJpbnRmKHRpdGxlYmFyLCAiJXM6ICAuLi4lcyIsIGFwcG5hbWUsIGZpbGVuYW1lKyhhbGVuK2ZsZW4rNi0xMDIzKSk7CisgICAgZWxzZQorICAgICAgICBzcHJpbnRmKHRpdGxlYmFyLCAiJXM6ICAlcyIsIGFwcG5hbWUsIGZpbGVuYW1lKTsKKworCisgICAgLyogaWYgdGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgYSBiYWNrZ3JvdW5kIGNvbG9yIG9uIHRoZSBjb21tYW5kIGxpbmUsCisgICAgICogY2hlY2sgZm9yIG9uZSBpbiB0aGUgUE5HIGZpbGUtLWlmIG5vdCwgdGhlIGluaXRpYWxpemVkIHZhbHVlcyBvZiAwCisgICAgICogKGJsYWNrKSB3aWxsIGJlIHVzZWQgKi8KKworICAgIGlmIChoYXZlX2JnKSB7CisgICAgICAgIHVuc2lnbmVkIHIsIGcsIGI7ICAgLyogdGhpcyBhcHByb2FjaCBxdWlldHMgY29tcGlsZXIgd2FybmluZ3MgKi8KKworICAgICAgICBzc2NhbmYoYmdzdHIrMSwgIiUyeCUyeCUyeCIsICZyLCAmZywgJmIpOworICAgICAgICBiZ19yZWQgICA9ICh1Y2gpcjsKKyAgICAgICAgYmdfZ3JlZW4gPSAodWNoKWc7CisgICAgICAgIGJnX2JsdWUgID0gKHVjaCliOworICAgIH0gZWxzZSBpZiAocmVhZHBuZ19nZXRfYmdjb2xvcigmYmdfcmVkLCAmYmdfZ3JlZW4sICZiZ19ibHVlKSA+IDEpIHsKKyAgICAgICAgcmVhZHBuZ19jbGVhbnVwKFRSVUUpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKKyAgICAgICAgICAiOiAgbGlicG5nIGVycm9yIHdoaWxlIGNoZWNraW5nIGZvciBiYWNrZ3JvdW5kIGNvbG9yXG4iKTsKKyAgICAgICAgZXhpdCgyKTsKKyAgICB9CisKKworICAgIC8qIGRvIHRoZSBiYXNpYyBXaW5kb3dzIGluaXRpYWxpemF0aW9uIHN0dWZmLCBtYWtlIHRoZSB3aW5kb3cgYW5kIGZpbGwgaXQKKyAgICAgKiB3aXRoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yICovCisKKyAgICBpZiAocnBuZ193aW5fY3JlYXRlX3dpbmRvdyhoSW5zdCwgc2hvd21vZGUpKQorICAgICAgICBleGl0KDIpOworCisKKyAgICAvKiBkZWNvZGUgdGhlIGltYWdlLCBhbGwgYXQgb25jZSAqLworCisgICAgVHJhY2UoKHN0ZGVyciwgImNhbGxpbmcgcmVhZHBuZ19nZXRfaW1hZ2UoKVxuIikpCisgICAgaW1hZ2VfZGF0YSA9IHJlYWRwbmdfZ2V0X2ltYWdlKGRpc3BsYXlfZXhwb25lbnQsICZpbWFnZV9jaGFubmVscywKKyAgICAgICZpbWFnZV9yb3dieXRlcyk7CisgICAgVHJhY2UoKHN0ZGVyciwgImRvbmUgd2l0aCByZWFkcG5nX2dldF9pbWFnZSgpXG4iKSkKKworCisgICAgLyogZG9uZSB3aXRoIFBORyBmaWxlLCBzbyBjbGVhbiB1cCB0byBtaW5pbWl6ZSBtZW1vcnkgdXNhZ2UgKGJ1dCBkbyBOT1QKKyAgICAgKiBudWtlIGltYWdlX2RhdGEhKSAqLworCisgICAgcmVhZHBuZ19jbGVhbnVwKEZBTFNFKTsKKyAgICBmY2xvc2UoaW5maWxlKTsKKworICAgIGlmICghaW1hZ2VfZGF0YSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIHVuYWJsZSB0byBkZWNvZGUgUE5HIGltYWdlXG4iKTsKKyAgICAgICAgZXhpdCgzKTsKKyAgICB9CisKKworICAgIC8qIGRpc3BsYXkgaW1hZ2UgKGNvbXBvc2l0ZSB3aXRoIGJhY2tncm91bmQgaWYgcmVxdWVzdGVkKSAqLworCisgICAgVHJhY2UoKHN0ZGVyciwgImNhbGxpbmcgcnBuZ193aW5fZGlzcGxheV9pbWFnZSgpXG4iKSkKKyAgICBpZiAocnBuZ193aW5fZGlzcGxheV9pbWFnZSgpKSB7CisgICAgICAgIGZyZWUoaW1hZ2VfZGF0YSk7CisgICAgICAgIGV4aXQoNCk7CisgICAgfQorICAgIFRyYWNlKChzdGRlcnIsICJkb25lIHdpdGggcnBuZ193aW5fZGlzcGxheV9pbWFnZSgpXG4iKSkKKworCisgICAgLyogd2FpdCBmb3IgdGhlIHVzZXIgdG8gdGVsbCB1cyB3aGVuIHRvIHF1aXQgKi8KKworICAgIHByaW50ZigKKyNpZm5kZWYgX19DWUdXSU5fXworICAgICAgIkRvbmUuICBQcmVzcyBRLCBFc2Mgb3IgbW91c2UgYnV0dG9uIDEgKHdpdGhpbiBpbWFnZSB3aW5kb3cpIHRvIHF1aXQuXG4iCisjZWxzZQorICAgICAgIkRvbmUuICBQcmVzcyBtb3VzZSBidXR0b24gMSAod2l0aGluIGltYWdlIHdpbmRvdykgdG8gcXVpdC5cbiIKKyNlbmRpZgorICAgICk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisKKyAgICB3aGlsZSAoR2V0TWVzc2FnZSgmbXNnLCBOVUxMLCAwLCAwKSkgeworICAgICAgICBUcmFuc2xhdGVNZXNzYWdlKCZtc2cpOworICAgICAgICBEaXNwYXRjaE1lc3NhZ2UoJm1zZyk7CisgICAgfQorCisKKyAgICAvKiBPSywgd2UncmUgZG9uZTogIGNsZWFuIHVwIGFsbCBpbWFnZSBhbmQgV2luZG93cyByZXNvdXJjZXMgYW5kIGdvIGF3YXkgKi8KKworICAgIHJwbmdfd2luX2NsZWFudXAoKTsKKworICAgIHJldHVybiBtc2cud1BhcmFtOworfQorCisKKworCisKK3N0YXRpYyBpbnQgcnBuZ193aW5fY3JlYXRlX3dpbmRvdyhISU5TVEFOQ0UgaEluc3QsIGludCBzaG93bW9kZSkKK3sKKyAgICB1Y2ggKmRlc3Q7CisgICAgaW50IGV4dHJhX3dpZHRoLCBleHRyYV9oZWlnaHQ7CisgICAgdWxnIGksIGo7CisgICAgV05EQ0xBU1NFWCB3bmRjbGFzczsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGRpc3BsYXktc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgaW1hZ2UgKHJvdW5kIHVwCisgICAgdG8gbXVsdGlwbGUgb2YgNCBmb3IgV2luZG93cyBESUIpLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgd2ltYWdlX3Jvd2J5dGVzID0gKCgzKmltYWdlX3dpZHRoICsgM0wpID4+IDIpIDw8IDI7CisKKyAgICBpZiAoIShkaWIgPSAodWNoICopbWFsbG9jKHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW1hZ2Vfcm93Ynl0ZXMqaW1hZ2VfaGVpZ2h0KSkpCisgICAgeworICAgICAgICByZXR1cm4gNDsgICAvKiBmYWlsICovCisgICAgfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEluaXRpYWxpemUgdGhlIERJQi4gIE5lZ2F0aXZlIGhlaWdodCBtZWFucyB0byB1c2UgdG9wLWRvd24gQk1QIG9yZGVyaW5nCisgICAgKG11c3QgYmUgdW5jb21wcmVzc2VkLCBidXQgdGhhdCdzIHdoYXQgd2Ugd2FudCkuICBCaXQgY291bnQgb2YgMSwgNCBvciA4CisgICAgaW1wbGllcyBhIGNvbG9ybWFwIG9mIFJHQlggcXVhZHMsIGJ1dCAyNC1iaXQgQk1QcyBqdXN0IHVzZSBCLEcsUiB2YWx1ZXMKKyAgICBkaXJlY3RseSA9PiB3aW1hZ2VfZGF0YSBiZWdpbnMgaW1tZWRpYXRlbHkgYWZ0ZXIgQk1QIGhlYWRlci4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIG1lbXNldChkaWIsIDAsIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSk7CisgICAgYm1paCA9IChCSVRNQVBJTkZPSEVBREVSICopZGliOworICAgIGJtaWgtPmJpU2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKKyAgICBibWloLT5iaVdpZHRoID0gaW1hZ2Vfd2lkdGg7CisgICAgYm1paC0+YmlIZWlnaHQgPSAtKChsb25nKWltYWdlX2hlaWdodCk7CisgICAgYm1paC0+YmlQbGFuZXMgPSAxOworICAgIGJtaWgtPmJpQml0Q291bnQgPSAyNDsKKyAgICBibWloLT5iaUNvbXByZXNzaW9uID0gMDsKKyAgICB3aW1hZ2VfZGF0YSA9IGRpYiArIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaWxsIGluIGJhY2tncm91bmQgY29sb3IgKGJsYWNrIGJ5IGRlZmF1bHQpOyBkYXRhIGFyZSBpbiBCR1Igb3JkZXIuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBmb3IgKGogPSAwOyAgaiA8IGltYWdlX2hlaWdodDsgICsraikgeworICAgICAgICBkZXN0ID0gd2ltYWdlX2RhdGEgKyBqKndpbWFnZV9yb3dieXRlczsKKyAgICAgICAgZm9yIChpID0gaW1hZ2Vfd2lkdGg7ICBpID4gMDsgIC0taSkgeworICAgICAgICAgICAgKmRlc3QrKyA9IGJnX2JsdWU7CisgICAgICAgICAgICAqZGVzdCsrID0gYmdfZ3JlZW47CisgICAgICAgICAgICAqZGVzdCsrID0gYmdfcmVkOworICAgICAgICB9CisgICAgfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNldCB0aGUgd2luZG93IHBhcmFtZXRlcnMuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBtZW1zZXQoJnduZGNsYXNzLCAwLCBzaXplb2Yod25kY2xhc3MpKTsKKworICAgIHduZGNsYXNzLmNiU2l6ZSA9IHNpemVvZih3bmRjbGFzcyk7CisgICAgd25kY2xhc3Muc3R5bGUgPSBDU19IUkVEUkFXIHwgQ1NfVlJFRFJBVzsKKyAgICB3bmRjbGFzcy5scGZuV25kUHJvYyA9IHJwbmdfd2luX3duZHByb2M7CisgICAgd25kY2xhc3MuaEluc3RhbmNlID0gaEluc3Q7CisgICAgd25kY2xhc3MuaEljb24gPSBMb2FkSWNvbihOVUxMLCBJRElfQVBQTElDQVRJT04pOworICAgIHduZGNsYXNzLmhDdXJzb3IgPSBMb2FkQ3Vyc29yKE5VTEwsIElEQ19BUlJPVyk7CisgICAgd25kY2xhc3MuaGJyQmFja2dyb3VuZCA9IChIQlJVU0gpR2V0U3RvY2tPYmplY3QoREtHUkFZX0JSVVNIKTsKKyAgICB3bmRjbGFzcy5scHN6TWVudU5hbWUgPSBOVUxMOworICAgIHduZGNsYXNzLmxwc3pDbGFzc05hbWUgPSBwcm9nbmFtZTsKKyAgICB3bmRjbGFzcy5oSWNvblNtID0gTG9hZEljb24oTlVMTCwgSURJX0FQUExJQ0FUSU9OKTsKKworICAgIFJlZ2lzdGVyQ2xhc3NFeCgmd25kY2xhc3MpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZpbmFsbHksIGNyZWF0ZSB0aGUgd2luZG93LgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgZXh0cmFfd2lkdGggID0gMiooR2V0U3lzdGVtTWV0cmljcyhTTV9DWEJPUkRFUikgKworICAgICAgICAgICAgICAgICAgICAgIEdldFN5c3RlbU1ldHJpY3MoU01fQ1hETEdGUkFNRSkpOworICAgIGV4dHJhX2hlaWdodCA9IDIqKEdldFN5c3RlbU1ldHJpY3MoU01fQ1lCT1JERVIpICsKKyAgICAgICAgICAgICAgICAgICAgICBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZRExHRlJBTUUpKSArCisgICAgICAgICAgICAgICAgICAgICAgR2V0U3lzdGVtTWV0cmljcyhTTV9DWUNBUFRJT04pOworCisgICAgZ2xvYmFsX2h3bmQgPSBDcmVhdGVXaW5kb3cocHJvZ25hbWUsIHRpdGxlYmFyLCBXU19PVkVSTEFQUEVEV0lORE9XLAorICAgICAgQ1dfVVNFREVGQVVMVCwgQ1dfVVNFREVGQVVMVCwgaW1hZ2Vfd2lkdGgrZXh0cmFfd2lkdGgsCisgICAgICBpbWFnZV9oZWlnaHQrZXh0cmFfaGVpZ2h0LCBOVUxMLCBOVUxMLCBoSW5zdCwgTlVMTCk7CisKKyAgICBTaG93V2luZG93KGdsb2JhbF9od25kLCBzaG93bW9kZSk7CisgICAgVXBkYXRlV2luZG93KGdsb2JhbF9od25kKTsKKworICAgIHJldHVybiAwOworCit9IC8qIGVuZCBmdW5jdGlvbiBycG5nX3dpbl9jcmVhdGVfd2luZG93KCkgKi8KKworCisKKworCitzdGF0aWMgaW50IHJwbmdfd2luX2Rpc3BsYXlfaW1hZ2UoKQoreworICAgIHVjaCAqc3JjLCAqZGVzdDsKKyAgICB1Y2ggciwgZywgYiwgYTsKKyAgICB1bGcgaSwgcm93LCBsYXN0cm93OworICAgIFJFQ1QgcmVjdDsKKworCisgICAgVHJhY2UoKHN0ZGVyciwgImJlZ2lubmluZyBkaXNwbGF5IGxvb3AgKGltYWdlX2NoYW5uZWxzID09ICVkKVxuIiwKKyAgICAgIGltYWdlX2NoYW5uZWxzKSkKKyAgICBUcmFjZSgoc3RkZXJyLCAiKHdpZHRoID0gJWxkLCByb3dieXRlcyA9ICVsZCwgd2ltYWdlX3Jvd2J5dGVzID0gJWQpXG4iLAorICAgICAgaW1hZ2Vfd2lkdGgsIGltYWdlX3Jvd2J5dGVzLCB3aW1hZ2Vfcm93Ynl0ZXMpKQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQmxhc3QgaW1hZ2UgZGF0YSB0byBidWZmZXIuICBUaGlzIHdob2xlIHJvdXRpbmUgdGFrZXMgcGxhY2UgYmVmb3JlIHRoZQorICAgIG1lc3NhZ2UgbG9vcCBiZWdpbnMsIHNvIHRoZXJlJ3Mgbm8gcmVhbCBwb2ludCBpbiBhbnkgcHNldWRvLXByb2dyZXNzaXZlCisgICAgZGlzcGxheS4uLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgZm9yIChsYXN0cm93ID0gcm93ID0gMDsgIHJvdyA8IGltYWdlX2hlaWdodDsgICsrcm93KSB7CisgICAgICAgIHNyYyA9IGltYWdlX2RhdGEgKyByb3cqaW1hZ2Vfcm93Ynl0ZXM7CisgICAgICAgIGRlc3QgPSB3aW1hZ2VfZGF0YSArIHJvdyp3aW1hZ2Vfcm93Ynl0ZXM7CisgICAgICAgIGlmIChpbWFnZV9jaGFubmVscyA9PSAzKSB7CisgICAgICAgICAgICBmb3IgKGkgPSBpbWFnZV93aWR0aDsgIGkgPiAwOyAgLS1pKSB7CisgICAgICAgICAgICAgICAgciA9ICpzcmMrKzsKKyAgICAgICAgICAgICAgICBnID0gKnNyYysrOworICAgICAgICAgICAgICAgIGIgPSAqc3JjKys7CisgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGI7CisgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGc7ICAgLyogbm90ZSByZXZlcnNlIG9yZGVyICovCisgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSAvKiBpZiAoaW1hZ2VfY2hhbm5lbHMgPT0gNCkgKi8geworICAgICAgICAgICAgZm9yIChpID0gaW1hZ2Vfd2lkdGg7ICBpID4gMDsgIC0taSkgeworICAgICAgICAgICAgICAgIHIgPSAqc3JjKys7CisgICAgICAgICAgICAgICAgZyA9ICpzcmMrKzsKKyAgICAgICAgICAgICAgICBiID0gKnNyYysrOworICAgICAgICAgICAgICAgIGEgPSAqc3JjKys7CisgICAgICAgICAgICAgICAgaWYgKGEgPT0gMjU1KSB7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiOworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHI7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGJnX2JsdWU7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiZ19ncmVlbjsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGJnX3JlZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIG1hY3JvIChjb3BpZWQgZnJvbSBwbmcuaCkgY29tcG9zaXRlcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICogZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCB2YWx1ZXMgYW5kIHB1dHMgdGhlCisgICAgICAgICAgICAgICAgICAgICAqIHJlc3VsdCBpbnRvIHRoZSBmaXJzdCBhcmd1bWVudDsgdGhlcmUgYXJlIG5vCisgICAgICAgICAgICAgICAgICAgICAqIHNpZGUgZWZmZWN0cyB3aXRoIHRoZSBmaXJzdCBhcmd1bWVudCAqLworICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoKmRlc3QrKywgYiwgYSwgYmdfYmx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZSgqZGVzdCsrLCBnLCBhLCBiZ19ncmVlbik7CisgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZSgqZGVzdCsrLCByLCBhLCBiZ19yZWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBkaXNwbGF5IGFmdGVyIGV2ZXJ5IDE2IGxpbmVzICovCisgICAgICAgIGlmICgoKHJvdysxKSAmIDB4ZikgPT0gMCkgeworICAgICAgICAgICAgcmVjdC5sZWZ0ID0gMEw7CisgICAgICAgICAgICByZWN0LnRvcCA9IChMT05HKWxhc3Ryb3c7CisgICAgICAgICAgICByZWN0LnJpZ2h0ID0gKExPTkcpaW1hZ2Vfd2lkdGg7ICAgICAgLyogcG9zc2libHkgb2ZmIGJ5IG9uZT8gKi8KKyAgICAgICAgICAgIHJlY3QuYm90dG9tID0gKExPTkcpbGFzdHJvdyArIDE2TDsgICAvKiBwb3NzaWJseSBvZmYgYnkgb25lPyAqLworICAgICAgICAgICAgSW52YWxpZGF0ZVJlY3QoZ2xvYmFsX2h3bmQsICZyZWN0LCBGQUxTRSk7CisgICAgICAgICAgICBVcGRhdGVXaW5kb3coZ2xvYmFsX2h3bmQpOyAgICAgLyogc2ltaWxhciB0byBYRmx1c2goKSAqLworICAgICAgICAgICAgbGFzdHJvdyA9IHJvdyArIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBUcmFjZSgoc3RkZXJyLCAiY2FsbGluZyBmaW5hbCBpbWFnZS1mbHVzaCByb3V0aW5lXG4iKSkKKyAgICBpZiAobGFzdHJvdyA8IGltYWdlX2hlaWdodCkgeworICAgICAgICByZWN0LmxlZnQgPSAwTDsKKyAgICAgICAgcmVjdC50b3AgPSAoTE9ORylsYXN0cm93OworICAgICAgICByZWN0LnJpZ2h0ID0gKExPTkcpaW1hZ2Vfd2lkdGg7ICAgICAgLyogcG9zc2libHkgb2ZmIGJ5IG9uZT8gKi8KKyAgICAgICAgcmVjdC5ib3R0b20gPSAoTE9ORylpbWFnZV9oZWlnaHQ7ICAgIC8qIHBvc3NpYmx5IG9mZiBieSBvbmU/ICovCisgICAgICAgIEludmFsaWRhdGVSZWN0KGdsb2JhbF9od25kLCAmcmVjdCwgRkFMU0UpOworICAgICAgICBVcGRhdGVXaW5kb3coZ2xvYmFsX2h3bmQpOyAgICAgLyogc2ltaWxhciB0byBYRmx1c2goKSAqLworICAgIH0KKworLyoKKyAgICBsYXN0IHBhcmFtIGRldGVybWluZXMgd2hldGhlciBvciBub3QgYmFja2dyb3VuZCBpcyB3aXBlZCBiZWZvcmUgcGFpbnQKKyAgICBJbnZhbGlkYXRlUmVjdChnbG9iYWxfaHduZCwgTlVMTCwgVFJVRSk7CisgICAgVXBkYXRlV2luZG93KGdsb2JhbF9od25kKTsKKyAqLworCisgICAgcmV0dXJuIDA7Cit9CisKKworCisKKworc3RhdGljIHZvaWQgcnBuZ193aW5fY2xlYW51cCgpCit7CisgICAgaWYgKGltYWdlX2RhdGEpIHsKKyAgICAgICAgZnJlZShpbWFnZV9kYXRhKTsKKyAgICAgICAgaW1hZ2VfZGF0YSA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKGRpYikgeworICAgICAgICBmcmVlKGRpYik7CisgICAgICAgIGRpYiA9IE5VTEw7CisgICAgfQorfQorCisKKworCisKK0xSRVNVTFQgQ0FMTEJBQ0sgcnBuZ193aW5fd25kcHJvYyhIV05EIGh3bmQsIFVJTlQgaU1zZywgV1BBUkFNIHdQLCBMUEFSQU0gbFApCit7CisgICAgSERDICAgICAgICAgaGRjOworICAgIFBBSU5UU1RSVUNUIHBzOworICAgIGludCByYzsKKworICAgIHN3aXRjaCAoaU1zZykgeworICAgICAgICBjYXNlIFdNX0NSRUFURToKKyAgICAgICAgICAgIC8qIG9uZS10aW1lIHByb2Nlc3NpbmcgaGVyZSwgaWYgYW55ICovCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjYXNlIFdNX1BBSU5UOgorICAgICAgICAgICAgaGRjID0gQmVnaW5QYWludChod25kLCAmcHMpOworICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgZGVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJjID0gU3RyZXRjaERJQml0cyhoZGMsIDAsIDAsIGltYWdlX3dpZHRoLCBpbWFnZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgaW1hZ2Vfd2lkdGgsIGltYWdlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbWFnZV9kYXRhLCAoQklUTUFQSU5GTyAqKWJtaWgsCisgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICBpVXNhZ2U6IG5vIGNsdWUgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgU1JDQ09QWSk7CisgICAgICAgICAgICBFbmRQYWludChod25kLCAmcHMpOworICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgLyogd2FpdCBmb3IgdGhlIHVzZXIgdG8gdGVsbCB1cyB3aGVuIHRvIHF1aXQgKi8KKyAgICAgICAgY2FzZSBXTV9DSEFSOgorICAgICAgICAgICAgc3dpdGNoICh3UCkgeyAgICAgIC8qIG9ubHkgbmVlZCBvbmUsIHNvIGlnbm9yZSByZXBlYXQgY291bnQgKi8KKyAgICAgICAgICAgICAgICBjYXNlICdxJzoKKyAgICAgICAgICAgICAgICBjYXNlICdRJzoKKyAgICAgICAgICAgICAgICBjYXNlIDB4MUI6ICAgICAvKiBFc2Mga2V5ICovCisgICAgICAgICAgICAgICAgICAgIFBvc3RRdWl0TWVzc2FnZSgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGNhc2UgV01fTEJVVFRPTkRPV046ICAgLyogYW5vdGhlciB3YXkgb2YgcXVpdHRpbmcgKi8KKyAgICAgICAgY2FzZSBXTV9ERVNUUk9ZOgorICAgICAgICAgICAgUG9zdFF1aXRNZXNzYWdlKDApOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIERlZldpbmRvd1Byb2MoaHduZCwgaU1zZywgd1AsIGxQKTsKK30KZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL2dyZWdib29rL3JwbmcteC5jIGIvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svcnBuZy14LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRkN2M1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL2dyZWdib29rL3JwbmcteC5jCkBAIC0wLDAgKzEsOTEwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBycG5nIC0gc2ltcGxlIFBORyBkaXNwbGF5IHByb2dyYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnBuZy14LmMKKworICAgVGhpcyBwcm9ncmFtIGRlY29kZXMgYW5kIGRpc3BsYXlzIFBORyBpbWFnZXMsIHdpdGggZ2FtbWEgY29ycmVjdGlvbiBhbmQKKyAgIG9wdGlvbmFsbHkgd2l0aCBhIHVzZXItc3BlY2lmaWVkIGJhY2tncm91bmQgY29sb3IgKGluIGNhc2UgdGhlIGltYWdlIGhhcworICAgdHJhbnNwYXJlbmN5KS4gIEl0IGlzIHZlcnkgbmVhcmx5IHRoZSBtb3N0IGJhc2ljIFBORyB2aWV3ZXIgcG9zc2libGUuCisgICBUaGlzIHZlcnNpb24gaXMgZm9yIHRoZSBYIFdpbmRvdyBTeXN0ZW0gKHRlc3RlZCBieSBhdXRob3IgdW5kZXIgVW5peCBhbmQKKyAgIGJ5IE1hcnRpbiBaaW5zZXIgdW5kZXIgT3BlblZNUzsgbWF5IHdvcmsgdW5kZXIgT1MvMiB3aXRoIHNvbWUgdHdlYWtpbmcpLgorCisgICB0byBkbzoKKyAgICAtIDgtYml0IChjb2xvcm1hcHBlZCkgWCBzdXBwb3J0CisgICAgLSB1c2UgJS4xMDIzcyB0byBzaW1wbGlmeSB0cnVuY2F0aW9uIG9mIHRpdGxlLWJhciBzdHJpbmc/CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIENoYW5nZWxvZzoKKyAgICAtIDEuMDE6ICBpbml0aWFsIHB1YmxpYyByZWxlYXNlCisgICAgLSAxLjAyOiAgbW9kaWZpZWQgdG8gYWxsb3cgYWJicmV2aWF0ZWQgb3B0aW9uczsgZml4ZWQgbG9uZy91bG9uZyBtaXMtCisgICAgICAgICAgICAgIG1hdGNoOyBzd2l0Y2hlZCB0byBwbmdfam1wYnVmKCkgbWFjcm8KKyAgICAtIDEuMTA6ICBhZGRlZCBzdXBwb3J0IGZvciBub24tZGVmYXVsdCB2aXN1YWxzOyBmaXhlZCBYIHBpeGVsLWNvbnZlcnNpb24KKyAgICAtIDEuMTE6ICBhZGRlZCBleHRyYSBzZXQgb2YgcGFyZW50aGVzZXMgdG8gcG5nX2ptcGJ1ZigpIG1hY3JvOyBmaXhlZAorICAgICAgICAgICAgICBjb21tYW5kLWxpbmUgcGFyc2luZyBidWcKKyAgICAtIDEuMTI6ICBmaXhlZCBzb21lIHNtYWxsIFggbWVtb3J5IGxlYWtzICh0aGFua3MgdG8gRnJhbudvaXMgUGV0aXRqZWFuKQorICAgIC0gMS4xMzogIGZpeGVkIFhGcmVlR0MoKSBjcmFzaCBidWcgKHRoYW5rcyB0byBQYXRyaWNrIFdlbGNoZSkKKyAgICAtIDEuMTQ6ICBhZGRlZCBzdXBwb3J0IGZvciBYIHJlc291cmNlcyAodGhhbmtzIHRvIEdlcmhhcmQgTmlrbGFzY2gpCisgICAgLSAyLjAwOiAgZHVhbC1saWNlbnNlZCAoYWRkZWQgR05VIEdQTCkKKyAgICAtIDIuMDE6ICBmaXhlZCBpbXByb3BlciBkaXNwbGF5IG9mIHVzYWdlIHNjcmVlbiBvbiBQTkcgZXJyb3IocykKKyAgICAtIDIuMDI6ICBBZGRlZCAidm9pZChhcmdjKTsiIHN0YXRlbWVudCB0byBxdWlldCBwZWRhbnRpYyBjb21waWxlciB3YXJuaW5ncworICAgICAgICAgICAgIGFib3V0IHVudXNlZCB2YXJpYWJsZSAoR1ItUCkKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDggR3JlZyBSb2Vsb2ZzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgICAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMsIiB3aXRob3V0IHdhcnJhbnR5IG9mIGFueSBraW5kLAorICAgICAgZXhwcmVzcyBvciBpbXBsaWVkLiAgSW4gbm8gZXZlbnQgc2hhbGwgdGhlIGF1dGhvciBvciBjb250cmlidXRvcnMKKyAgICAgIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIGluIGFueSB3YXkgZnJvbSB0aGUgdXNlIG9mCisgICAgICB0aGlzIHNvZnR3YXJlLgorCisgICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBEVUFMLUxJQ0VOU0VELiAgWW91IG1heSBtb2RpZnkgYW5kL29yCisgICAgICByZWRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIG9uZSBvZiB0aGUKKyAgICAgIGZvbGxvd2luZyB0d28gbGljZW5zZXMgKGF0IHlvdXIgb3B0aW9uKToKKworCisgICAgICBMSUNFTlNFIDEgKCJCU0QtbGlrZSB3aXRoIGFkdmVydGlzaW5nIGNsYXVzZSIpOgorCisgICAgICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAgICAgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUKKyAgICAgIGl0IGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKworICAgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLgorICAgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGEtCisgICAgICAgICB0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgICAgICAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKworICAgICAgICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBHcmVnIFJvZWxvZnMKKyAgICAgICAgICAgIGFuZCBjb250cmlidXRvcnMgZm9yIHRoZSBib29rLCAiUE5HOiBUaGUgRGVmaW5pdGl2ZSBHdWlkZSwiCisgICAgICAgICAgICBwdWJsaXNoZWQgYnkgTydSZWlsbHkgYW5kIEFzc29jaWF0ZXMuCisKKworICAgICAgTElDRU5TRSAyIChHTlUgR1BMIHYyIG9yIGxhdGVyKToKKworICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICAgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBQUk9HTkFNRSAgInJwbmcteCIKKyNkZWZpbmUgTE9OR05BTUUgICJTaW1wbGUgUE5HIFZpZXdlciBmb3IgWCIKKyNkZWZpbmUgVkVSU0lPTiAgICIyLjAyIG9mIDE1IEp1bmUgMjAxNCIKKyNkZWZpbmUgUkVTTkFNRSAgICJycG5nIiAgICAgICAgLyogb3VyIFggcmVzb3VyY2UgYXBwbGljYXRpb24gbmFtZSAqLworI2RlZmluZSBSRVNDTEFTUyAgIlJwbmciICAgICAgICAvKiBvdXIgWCByZXNvdXJjZSBjbGFzcyBuYW1lICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgorI2luY2x1ZGUgPFgxMS9Yb3MuaD4KKyNpbmNsdWRlIDxYMTEva2V5c3ltLmg+CisKKy8qICNkZWZpbmUgREVCVUcgIDogIHRoaXMgZW5hYmxlcyB0aGUgVHJhY2UoKSBtYWNyb3MgKi8KKworI2luY2x1ZGUgInJlYWRwbmcuaCIgICAvKiB0eXBlZGVmcywgY29tbW9uIG1hY3JvcywgcmVhZHBuZyBwcm90b3R5cGVzICovCisKKworLyogY291bGQganVzdCBpbmNsdWRlIHBuZy5oLCBidXQgdGhpcyBtYWNybyBpcyB0aGUgb25seSB0aGluZyB3ZSBuZWVkCisgKiAobmFtZSBhbmQgdHlwZWRlZnMgY2hhbmdlZCB0byBsb2NhbCB2ZXJzaW9ucyk7IG5vdGUgdGhhdCBzaWRlIGVmZmVjdHMKKyAqIG9ubHkgaGFwcGVuIHdpdGggYWxwaGEgKHdoaWNoIGNvdWxkIGVhc2lseSBiZSBhdm9pZGVkIHdpdGgKKyAqICJ1c2ggYWNvcHkgPSAoYWxwaGEpOyIpICovCisKKyNkZWZpbmUgYWxwaGFfY29tcG9zaXRlKGNvbXBvc2l0ZSwgZmcsIGFscGhhLCBiZykgeyAgICAgICAgICAgICAgIFwKKyAgICB1c2ggdGVtcCA9ICgodXNoKShmZykqKHVzaCkoYWxwaGEpICsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAodXNoKShiZykqKHVzaCkoMjU1IC0gKHVzaCkoYWxwaGEpKSArICh1c2gpMTI4KTsgIFwKKyAgICAoY29tcG9zaXRlKSA9ICh1Y2gpKCh0ZW1wICsgKHRlbXAgPj4gOCkpID4+IDgpOyAgICAgICAgICAgICAgIFwKK30KKworCisvKiBsb2NhbCBwcm90b3R5cGVzICovCitzdGF0aWMgaW50ICBycG5nX3hfY3JlYXRlX3dpbmRvdyh2b2lkKTsKK3N0YXRpYyBpbnQgIHJwbmdfeF9kaXNwbGF5X2ltYWdlKHZvaWQpOworc3RhdGljIHZvaWQgcnBuZ194X2NsZWFudXAodm9pZCk7CitzdGF0aWMgaW50ICBycG5nX3hfbXNiKHVsZyB1MzJ2YWwpOworCisKK3N0YXRpYyBjaGFyIHRpdGxlYmFyWzEwMjRdLCAqd2luZG93X25hbWUgPSB0aXRsZWJhcjsKK3N0YXRpYyBjaGFyICphcHBuYW1lID0gTE9OR05BTUU7CitzdGF0aWMgY2hhciAqaWNvbl9uYW1lID0gUFJPR05BTUU7CitzdGF0aWMgY2hhciAqcmVzX25hbWUgPSBSRVNOQU1FOworc3RhdGljIGNoYXIgKnJlc19jbGFzcyA9IFJFU0NMQVNTOworc3RhdGljIGNoYXIgKmZpbGVuYW1lOworc3RhdGljIEZJTEUgKmluZmlsZTsKKworc3RhdGljIGNoYXIgKmJnc3RyOworc3RhdGljIHVjaCBiZ19yZWQ9MCwgYmdfZ3JlZW49MCwgYmdfYmx1ZT0wOworCitzdGF0aWMgZG91YmxlIGRpc3BsYXlfZXhwb25lbnQ7CisKK3N0YXRpYyB1bGcgaW1hZ2Vfd2lkdGgsIGltYWdlX2hlaWdodCwgaW1hZ2Vfcm93Ynl0ZXM7CitzdGF0aWMgaW50IGltYWdlX2NoYW5uZWxzOworc3RhdGljIHVjaCAqaW1hZ2VfZGF0YTsKKworLyogWC1zcGVjaWZpYyB2YXJpYWJsZXMgKi8KK3N0YXRpYyBjaGFyICpkaXNwbGF5bmFtZTsKK3N0YXRpYyBYSW1hZ2UgKnhpbWFnZTsKK3N0YXRpYyBEaXNwbGF5ICpkaXNwbGF5Oworc3RhdGljIGludCBkZXB0aDsKK3N0YXRpYyBWaXN1YWwgKnZpc3VhbDsKK3N0YXRpYyBYVmlzdWFsSW5mbyAqdmlzdWFsX2xpc3Q7CitzdGF0aWMgaW50IFJTaGlmdCwgR1NoaWZ0LCBCU2hpZnQ7CitzdGF0aWMgdWxnIFJNYXNrLCBHTWFzaywgQk1hc2s7CitzdGF0aWMgV2luZG93IHdpbmRvdzsKK3N0YXRpYyBHQyBnYzsKK3N0YXRpYyBDb2xvcm1hcCBjb2xvcm1hcDsKKworc3RhdGljIGludCBoYXZlX25vbmRlZmF1bHRfdmlzdWFsID0gRkFMU0U7CitzdGF0aWMgaW50IGhhdmVfY29sb3JtYXAgPSBGQUxTRTsKK3N0YXRpYyBpbnQgaGF2ZV93aW5kb3cgPSBGQUxTRTsKK3N0YXRpYyBpbnQgaGF2ZV9nYyA9IEZBTFNFOworLyoKK3VsZyBudW1jb2xvcnM9MCwgcGl4ZWxzWzI1Nl07Cit1c2ggcmVkc1syNTZdLCBncmVlbnNbMjU2XSwgYmx1ZXNbMjU2XTsKKyAqLworCisKKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisjaWZkZWYgc2dpCisgICAgY2hhciB0bXBsaW5lWzgwXTsKKyNlbmRpZgorICAgIGNoYXIgKnA7CisgICAgaW50IHJjLCBhbGVuLCBmbGVuOworICAgIGludCBlcnJvciA9IDA7CisgICAgaW50IGhhdmVfYmcgPSBGQUxTRTsKKyAgICBkb3VibGUgTFVUX2V4cG9uZW50OyAgICAgICAgICAgICAgIC8qIGp1c3QgdGhlIGxvb2t1cCB0YWJsZSAqLworICAgIGRvdWJsZSBDUlRfZXhwb25lbnQgPSAyLjI7ICAgICAgICAgLyoganVzdCB0aGUgbW9uaXRvciAqLworICAgIGRvdWJsZSBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQ7ICAgLyogd2hvbGUgZGlzcGxheSBzeXN0ZW0gKi8KKyAgICBYRXZlbnQgZTsKKyAgICBLZXlTeW0gazsKKworCisgICAgZGlzcGxheW5hbWUgPSAoY2hhciAqKU5VTEw7CisgICAgZmlsZW5hbWUgPSAoY2hhciAqKU5VTEw7CisKKworICAgIC8qIEZpcnN0IHNldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3Igb3VyIGRpc3BsYXktc3lzdGVtIGV4cG9uZW50LCBpLmUuLAorICAgICAqIHRoZSBwcm9kdWN0IG9mIHRoZSBDUlQgZXhwb25lbnQgYW5kIHRoZSBleHBvbmVudCBjb3JyZXNwb25kaW5nIHRvCisgICAgICogdGhlIGZyYW1lLWJ1ZmZlcidzIGxvb2t1cCB0YWJsZSAoTFVUKSwgaWYgYW55LiAgVGhpcyBpcyBub3QgYW4KKyAgICAgKiBleGhhdXN0aXZlIGxpc3Qgb2YgTFVUIHZhbHVlcyAoZS5nLiwgT3BlblN0ZXAgaGFzIGEgbG90IG9mIHdlaXJkCisgICAgICogb25lcyksIGJ1dCBpdCBzaG91bGQgY292ZXIgOTklIG9mIHRoZSBjdXJyZW50IHBvc3NpYmlsaXRpZXMuICovCisKKyNpZiBkZWZpbmVkKE5lWFQpCisgICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gMi4yOworICAgIC8qCisgICAgaWYgKHNvbWVfbmV4dF9mdW5jdGlvbl90aGF0X3JldHVybnNfZ2FtbWEoJm5leHRfZ2FtbWEpKQorICAgICAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyBuZXh0X2dhbW1hOworICAgICAqLworI2VsaWYgZGVmaW5lZChzZ2kpCisgICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gMS43OworICAgIC8qIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhbnkgZG9jdW1lbnRlZCBmdW5jdGlvbiB0byBnZXQgdGhlCisgICAgICogImdhbW1hIiB2YWx1ZSwgc28gd2UgZG8gaXQgdGhlIGhhcmQgd2F5ICovCisgICAgaW5maWxlID0gZm9wZW4oIi9ldGMvY29uZmlnL3N5c3RlbS5nbEdhbW1hVmFsIiwgInIiKTsKKyAgICBpZiAoaW5maWxlKSB7CisgICAgICAgIGRvdWJsZSBzZ2lfZ2FtbWE7CisKKyAgICAgICAgZmdldHModG1wbGluZSwgODAsIGluZmlsZSk7CisgICAgICAgIGZjbG9zZShpbmZpbGUpOworICAgICAgICBzZ2lfZ2FtbWEgPSBhdG9mKHRtcGxpbmUpOworICAgICAgICBpZiAoc2dpX2dhbW1hID4gMC4wKQorICAgICAgICAgICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gc2dpX2dhbW1hOworICAgIH0KKyNlbGlmIGRlZmluZWQoTWFjaW50b3NoKQorICAgIExVVF9leHBvbmVudCA9IDEuOCAvIDIuNjE7CisgICAgLyoKKyAgICBpZiAoc29tZV9tYWNfZnVuY3Rpb25fdGhhdF9yZXR1cm5zX2dhbW1hKCZtYWNfZ2FtbWEpKQorICAgICAgICBMVVRfZXhwb25lbnQgPSBtYWNfZ2FtbWEgLyAyLjYxOworICAgICAqLworI2Vsc2UKKyAgICBMVVRfZXhwb25lbnQgPSAxLjA7ICAgLyogYXNzdW1lIG5vIExVVDogIG1vc3QgUENzICovCisjZW5kaWYKKworICAgIC8qIHRoZSBkZWZhdWx0cyBhYm92ZSBnaXZlIDEuMCwgMS4zLCAxLjUgYW5kIDIuMiwgcmVzcGVjdGl2ZWx5OiAqLworICAgIGRlZmF1bHRfZGlzcGxheV9leHBvbmVudCA9IExVVF9leHBvbmVudCAqIENSVF9leHBvbmVudDsKKworCisgICAgLyogSWYgdGhlIHVzZXIgaGFzIHNldCB0aGUgU0NSRUVOX0dBTU1BIGVudmlyb25tZW50IHZhcmlhYmxlIGFzIHN1Z2dlc3RlZAorICAgICAqIChzb21ld2hhdCBpbXByZWNpc2VseSkgaW4gdGhlIGxpYnBuZyBkb2N1bWVudGF0aW9uLCB1c2UgdGhhdDsgb3RoZXJ3aXNlCisgICAgICogdXNlIHRoZSBkZWZhdWx0IHZhbHVlIHdlIGp1c3QgY2FsY3VsYXRlZC4gIEVpdGhlciB3YXksIHRoZSB1c2VyIG1heQorICAgICAqIG92ZXJyaWRlIHRoaXMgdmlhIGEgY29tbWFuZC1saW5lIG9wdGlvbi4gKi8KKworICAgIGlmICgocCA9IGdldGVudigiU0NSRUVOX0dBTU1BIikpICE9IE5VTEwpCisgICAgICAgIGRpc3BsYXlfZXhwb25lbnQgPSBhdG9mKHApOworICAgIGVsc2UKKyAgICAgICAgZGlzcGxheV9leHBvbmVudCA9IGRlZmF1bHRfZGlzcGxheV9leHBvbmVudDsKKworCisgICAgLyogTm93IHBhcnNlIHRoZSBjb21tYW5kIGxpbmUgZm9yIG9wdGlvbnMgYW5kIHRoZSBQTkcgZmlsZW5hbWUuICovCisKKyAgICB3aGlsZSAoKisrYXJndiAmJiAhZXJyb3IpIHsKKyAgICAgICAgaWYgKCFzdHJuY21wKCphcmd2LCAiLWRpc3BsYXkiLCAyKSkgeworICAgICAgICAgICAgaWYgKCEqKythcmd2KQorICAgICAgICAgICAgICAgICsrZXJyb3I7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZGlzcGxheW5hbWUgPSAqYXJndjsKKyAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1nYW1tYSIsIDIpKSB7CisgICAgICAgICAgICBpZiAoISorK2FyZ3YpCisgICAgICAgICAgICAgICAgKytlcnJvcjsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGRpc3BsYXlfZXhwb25lbnQgPSBhdG9mKCphcmd2KTsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcGxheV9leHBvbmVudCA8PSAwLjApCisgICAgICAgICAgICAgICAgICAgICsrZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItYmdjb2xvciIsIDIpKSB7CisgICAgICAgICAgICBpZiAoISorK2FyZ3YpCisgICAgICAgICAgICAgICAgKytlcnJvcjsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGJnc3RyID0gKmFyZ3Y7CisgICAgICAgICAgICAgICAgaWYgKHN0cmxlbihiZ3N0cikgIT0gNyB8fCBiZ3N0clswXSAhPSAnIycpCisgICAgICAgICAgICAgICAgICAgICsrZXJyb3I7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBoYXZlX2JnID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgqKmFyZ3YgIT0gJy0nKSB7CisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSAqYXJndjsKKyAgICAgICAgICAgICAgICBpZiAoYXJndlsxXSkgICAvKiBzaG91bGRuJ3QgYmUgYW55IG1vcmUgYXJncyBhZnRlciBmaWxlbmFtZSAqLworICAgICAgICAgICAgICAgICAgICArK2Vycm9yOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgKytlcnJvcjsgICAvKiBub3QgZXhwZWN0aW5nIGFueSBvdGhlciBvcHRpb25zICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWZpbGVuYW1lKQorICAgICAgICArK2Vycm9yOworCisKKyAgICAvKiBwcmludCB1c2FnZSBzY3JlZW4gaWYgYW55IGVycm9ycyB1cCB0byB0aGlzIHBvaW50ICovCisKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiVzICVzOiAgJXNcbiIsIFBST0dOQU1FLCBWRVJTSU9OLCBhcHBuYW1lKTsKKyAgICAgICAgcmVhZHBuZ192ZXJzaW9uX2luZm8oKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIKKyAgICAgICAgICAiVXNhZ2U6ICAlcyBbLWRpc3BsYXkgeGRweV0gWy1nYW1tYSBleHBdIFstYmdjb2xvciBiZ10gZmlsZS5wbmdcbiIKKyAgICAgICAgICAiICAgIHhkcHlcdG5hbWUgb2YgdGhlIHRhcmdldCBYIGRpc3BsYXkgKGUuZy4sIGBgaG9zdG5hbWU6MCcnKVxuIgorICAgICAgICAgICIgICAgZXhwIFx0dHJhbnNmZXItZnVuY3Rpb24gZXhwb25lbnQgKGBgZ2FtbWEnJykgb2YgdGhlIGRpc3BsYXlcbiIKKyAgICAgICAgICAiXHRcdCAgc3lzdGVtIGluIGZsb2F0aW5nLXBvaW50IGZvcm1hdCAoZS5nLiwgYGAlLjFmJycpOyBlcXVhbFxuIiwKKyAgICAgICAgICBQUk9HTkFNRSwgZGVmYXVsdF9kaXNwbGF5X2V4cG9uZW50KTsKKworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIgorICAgICAgICAgICJcdFx0ICB0byB0aGUgcHJvZHVjdCBvZiB0aGUgbG9va3VwLXRhYmxlIGV4cG9uZW50ICh2YXJpZXMpXG4iCisgICAgICAgICAgIlx0XHQgIGFuZCB0aGUgQ1JUIGV4cG9uZW50ICh1c3VhbGx5IDIuMik7IG11c3QgYmUgcG9zaXRpdmVcbiIKKyAgICAgICAgICAiICAgIGJnICBcdGRlc2lyZWQgYmFja2dyb3VuZCBjb2xvciBpbiA3LWNoYXJhY3RlciBoZXggUkdCIGZvcm1hdFxuIgorICAgICAgICAgICJcdFx0ICAoZS5nLiwgYGAjZmY3NzAwJycgZm9yIG9yYW5nZTogIHNhbWUgYXMgSFRNTCBjb2xvcnMpO1xuIgorICAgICAgICAgICJcdFx0ICB1c2VkIHdpdGggdHJhbnNwYXJlbnQgaW1hZ2VzXG4iCisgICAgICAgICAgIlxuUHJlc3MgUSwgRXNjIG9yIG1vdXNlIGJ1dHRvbiAxICh3aXRoaW4gaW1hZ2Ugd2luZG93LCBhZnRlciBpbWFnZVxuIgorICAgICAgICAgICJpcyBkaXNwbGF5ZWQpIHRvIHF1aXQuXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKworICAgIGlmICghKGluZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAicmIiKSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBjYW4ndCBvcGVuIFBORyBmaWxlIFslc11cbiIsIGZpbGVuYW1lKTsKKyAgICAgICAgKytlcnJvcjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKHJjID0gcmVhZHBuZ19pbml0KGluZmlsZSwgJmltYWdlX3dpZHRoLCAmaW1hZ2VfaGVpZ2h0KSkgIT0gMCkgeworICAgICAgICAgICAgc3dpdGNoIChyYykgeworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCisgICAgICAgICAgICAgICAgICAgICAgIjogIFslc10gaXMgbm90IGEgUE5HIGZpbGU6IGluY29ycmVjdCBzaWduYXR1cmVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQorICAgICAgICAgICAgICAgICAgICAgICI6ICBbJXNdIGhhcyBiYWQgSUhEUiAobGlicG5nIGxvbmdqbXApXG4iLCBmaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBpbnN1ZmZpY2llbnQgbWVtb3J5XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCisgICAgICAgICAgICAgICAgICAgICAgIjogIHVua25vd24gcmVhZHBuZ19pbml0KCkgZXJyb3JcbiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrZXJyb3I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkaXNwbGF5ID0gWE9wZW5EaXNwbGF5KGRpc3BsYXluYW1lKTsKKyAgICAgICAgICAgIGlmICghZGlzcGxheSkgeworICAgICAgICAgICAgICAgIHJlYWRwbmdfY2xlYW51cChUUlVFKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGNhbid0IG9wZW4gWCBkaXNwbGF5IFslc11cbiIsCisgICAgICAgICAgICAgICAgICBkaXNwbGF5bmFtZT8gZGlzcGxheW5hbWUgOiAiZGVmYXVsdCIpOworICAgICAgICAgICAgICAgICsrZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVycm9yKQorICAgICAgICAgICAgZmNsb3NlKGluZmlsZSk7CisgICAgfQorCisKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBhYm9ydGluZy5cbiIpOworICAgICAgICBleGl0KDIpOworICAgIH0KKworCisgICAgLyogc2V0IHRoZSB0aXRsZS1iYXIgc3RyaW5nLCBidXQgbWFrZSBzdXJlIGJ1ZmZlciBkb2Vzbid0IG92ZXJmbG93ICovCisKKyAgICBhbGVuID0gc3RybGVuKGFwcG5hbWUpOworICAgIGZsZW4gPSBzdHJsZW4oZmlsZW5hbWUpOworICAgIGlmIChhbGVuICsgZmxlbiArIDMgPiAxMDIzKQorICAgICAgICBzcHJpbnRmKHRpdGxlYmFyLCAiJXM6ICAuLi4lcyIsIGFwcG5hbWUsIGZpbGVuYW1lKyhhbGVuK2ZsZW4rNi0xMDIzKSk7CisgICAgZWxzZQorICAgICAgICBzcHJpbnRmKHRpdGxlYmFyLCAiJXM6ICAlcyIsIGFwcG5hbWUsIGZpbGVuYW1lKTsKKworCisgICAgLyogaWYgdGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgYSBiYWNrZ3JvdW5kIGNvbG9yIG9uIHRoZSBjb21tYW5kIGxpbmUsCisgICAgICogY2hlY2sgZm9yIG9uZSBpbiB0aGUgUE5HIGZpbGUtLWlmIG5vdCwgdGhlIGluaXRpYWxpemVkIHZhbHVlcyBvZiAwCisgICAgICogKGJsYWNrKSB3aWxsIGJlIHVzZWQgKi8KKworICAgIGlmIChoYXZlX2JnKSB7CisgICAgICAgIHVuc2lnbmVkIHIsIGcsIGI7ICAgLyogdGhpcyBhcHByb2FjaCBxdWlldHMgY29tcGlsZXIgd2FybmluZ3MgKi8KKworICAgICAgICBzc2NhbmYoYmdzdHIrMSwgIiUyeCUyeCUyeCIsICZyLCAmZywgJmIpOworICAgICAgICBiZ19yZWQgICA9ICh1Y2gpcjsKKyAgICAgICAgYmdfZ3JlZW4gPSAodWNoKWc7CisgICAgICAgIGJnX2JsdWUgID0gKHVjaCliOworICAgIH0gZWxzZSBpZiAocmVhZHBuZ19nZXRfYmdjb2xvcigmYmdfcmVkLCAmYmdfZ3JlZW4sICZiZ19ibHVlKSA+IDEpIHsKKyAgICAgICAgcmVhZHBuZ19jbGVhbnVwKFRSVUUpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKKyAgICAgICAgICAiOiAgbGlicG5nIGVycm9yIHdoaWxlIGNoZWNraW5nIGZvciBiYWNrZ3JvdW5kIGNvbG9yXG4iKTsKKyAgICAgICAgZXhpdCgyKTsKKyAgICB9CisKKworICAgIC8qIGRvIHRoZSBiYXNpYyBYIGluaXRpYWxpemF0aW9uIHN0dWZmLCBtYWtlIHRoZSB3aW5kb3cgYW5kIGZpbGwgaXQKKyAgICAgKiB3aXRoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yICovCisKKyAgICBpZiAocnBuZ194X2NyZWF0ZV93aW5kb3coKSkKKyAgICAgICAgZXhpdCgyKTsKKworCisgICAgLyogZGVjb2RlIHRoZSBpbWFnZSwgYWxsIGF0IG9uY2UgKi8KKworICAgIFRyYWNlKChzdGRlcnIsICJjYWxsaW5nIHJlYWRwbmdfZ2V0X2ltYWdlKClcbiIpKQorICAgIGltYWdlX2RhdGEgPSByZWFkcG5nX2dldF9pbWFnZShkaXNwbGF5X2V4cG9uZW50LCAmaW1hZ2VfY2hhbm5lbHMsCisgICAgICAmaW1hZ2Vfcm93Ynl0ZXMpOworICAgIFRyYWNlKChzdGRlcnIsICJkb25lIHdpdGggcmVhZHBuZ19nZXRfaW1hZ2UoKVxuIikpCisKKworICAgIC8qIGRvbmUgd2l0aCBQTkcgZmlsZSwgc28gY2xlYW4gdXAgdG8gbWluaW1pemUgbWVtb3J5IHVzYWdlIChidXQgZG8gTk9UCisgICAgICogbnVrZSBpbWFnZV9kYXRhISkgKi8KKworICAgIHJlYWRwbmdfY2xlYW51cChGQUxTRSk7CisgICAgZmNsb3NlKGluZmlsZSk7CisKKyAgICBpZiAoIWltYWdlX2RhdGEpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICB1bmFibGUgdG8gZGVjb2RlIFBORyBpbWFnZVxuIik7CisgICAgICAgIGV4aXQoMyk7CisgICAgfQorCisKKyAgICAvKiBkaXNwbGF5IGltYWdlIChjb21wb3NpdGUgd2l0aCBiYWNrZ3JvdW5kIGlmIHJlcXVlc3RlZCkgKi8KKworICAgIFRyYWNlKChzdGRlcnIsICJjYWxsaW5nIHJwbmdfeF9kaXNwbGF5X2ltYWdlKClcbiIpKQorICAgIGlmIChycG5nX3hfZGlzcGxheV9pbWFnZSgpKSB7CisgICAgICAgIGZyZWUoaW1hZ2VfZGF0YSk7CisgICAgICAgIGV4aXQoNCk7CisgICAgfQorICAgIFRyYWNlKChzdGRlcnIsICJkb25lIHdpdGggcnBuZ194X2Rpc3BsYXlfaW1hZ2UoKVxuIikpCisKKworICAgIC8qIHdhaXQgZm9yIHRoZSB1c2VyIHRvIHRlbGwgdXMgd2hlbiB0byBxdWl0ICovCisKKyAgICBwcmludGYoCisgICAgICAiRG9uZS4gIFByZXNzIFEsIEVzYyBvciBtb3VzZSBidXR0b24gMSAod2l0aGluIGltYWdlIHdpbmRvdykgdG8gcXVpdC5cbiIpOworICAgIGZmbHVzaChzdGRvdXQpOworCisgICAgZG8KKyAgICAgICAgWE5leHRFdmVudChkaXNwbGF5LCAmZSk7CisgICAgd2hpbGUgKCEoZS50eXBlID09IEJ1dHRvblByZXNzICYmIGUueGJ1dHRvbi5idXR0b24gPT0gQnV0dG9uMSkgJiYKKyAgICAgICAgICAgIShlLnR5cGUgPT0gS2V5UHJlc3MgJiYgICAgLyogIHYtLS0gb3IgMSBmb3Igc2hpZnRlZCBrZXlzICovCisgICAgICAgICAgICAgKChrID0gWExvb2t1cEtleXN5bSgmZS54a2V5LCAwKSkgPT0gWEtfcSB8fCBrID09IFhLX0VzY2FwZSkgKSk7CisKKworICAgIC8qIE9LLCB3ZSdyZSBkb25lOiAgY2xlYW4gdXAgYWxsIGltYWdlIGFuZCBYIHJlc291cmNlcyBhbmQgZ28gYXdheSAqLworCisgICAgcnBuZ194X2NsZWFudXAoKTsKKworICAgICh2b2lkKWFyZ2M7IC8qIFVudXNlZCAqLworCisgICAgcmV0dXJuIDA7Cit9CisKKworCisKKworc3RhdGljIGludCBycG5nX3hfY3JlYXRlX3dpbmRvdyh2b2lkKQoreworICAgIHVjaCAqeGRhdGE7CisgICAgaW50IG5lZWRfY29sb3JtYXAgPSBGQUxTRTsKKyAgICBpbnQgc2NyZWVuLCBwYWQ7CisgICAgdWxnIGJnX3BpeGVsID0gMEw7CisgICAgdWxnIGF0dHJtYXNrOworICAgIFdpbmRvdyByb290OworICAgIFhFdmVudCBlOworICAgIFhHQ1ZhbHVlcyBnY3ZhbHVlczsKKyAgICBYU2V0V2luZG93QXR0cmlidXRlcyBhdHRyOworICAgIFhUZXh0UHJvcGVydHkgd2luZG93TmFtZSwgKnBXaW5kb3dOYW1lID0gJndpbmRvd05hbWU7CisgICAgWFRleHRQcm9wZXJ0eSBpY29uTmFtZSwgKnBJY29uTmFtZSA9ICZpY29uTmFtZTsKKyAgICBYVmlzdWFsSW5mbyB2aXN1YWxfaW5mbzsKKyAgICBYU2l6ZUhpbnRzICpzaXplX2hpbnRzOworICAgIFhXTUhpbnRzICp3bV9oaW50czsKKyAgICBYQ2xhc3NIaW50ICpjbGFzc19oaW50czsKKworCisgICAgc2NyZWVuID0gRGVmYXVsdFNjcmVlbihkaXNwbGF5KTsKKyAgICBkZXB0aCA9IERpc3BsYXlQbGFuZXMoZGlzcGxheSwgc2NyZWVuKTsKKyAgICByb290ID0gUm9vdFdpbmRvdyhkaXNwbGF5LCBzY3JlZW4pOworCisjaWZkZWYgREVCVUcKKyAgICBYU3luY2hyb25pemUoZGlzcGxheSwgVHJ1ZSk7CisjZW5kaWYKKworI2lmIDAKKy8qIEdSUjogIGFkZCA4LWJpdCBzdXBwb3J0ICovCisgICAgaWYgKC8qIGRlcHRoICE9IDggJiYgKi8gZGVwdGggIT0gMTYgJiYgZGVwdGggIT0gMjQgJiYgZGVwdGggIT0gMzIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgInNjcmVlbiBkZXB0aCAlZCBub3Qgc3VwcG9ydGVkIChvbmx5IDE2LSwgMjQtIG9yIDMyLWJpdCBUcnVlQ29sb3IpXG4iLAorICAgICAgICAgIGRlcHRoKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorCisgICAgWE1hdGNoVmlzdWFsSW5mbyhkaXNwbGF5LCBzY3JlZW4sIGRlcHRoLAorICAgICAgKGRlcHRoID09IDgpPyBQc2V1ZG9Db2xvciA6IFRydWVDb2xvciwgJnZpc3VhbF9pbmZvKTsKKyAgICB2aXN1YWwgPSB2aXN1YWxfaW5mby52aXN1YWw7CisjZWxzZQorICAgIGlmIChkZXB0aCAhPSAxNiAmJiBkZXB0aCAhPSAyNCAmJiBkZXB0aCAhPSAzMikgeworICAgICAgICBpbnQgdmlzdWFsc19tYXRjaGVkID0gMDsKKworICAgICAgICBUcmFjZSgoc3RkZXJyLCAiZGVmYXVsdCBkZXB0aCBpcyAlZDogIGNoZWNraW5nIG90aGVyIHZpc3VhbHNcbiIsCisgICAgICAgICAgZGVwdGgpKQorCisgICAgICAgIC8qIDI0LWJpdCBmaXJzdCAqLworICAgICAgICB2aXN1YWxfaW5mby5zY3JlZW4gPSBzY3JlZW47CisgICAgICAgIHZpc3VhbF9pbmZvLmRlcHRoID0gMjQ7CisgICAgICAgIHZpc3VhbF9saXN0ID0gWEdldFZpc3VhbEluZm8oZGlzcGxheSwKKyAgICAgICAgICBWaXN1YWxTY3JlZW5NYXNrIHwgVmlzdWFsRGVwdGhNYXNrLCAmdmlzdWFsX2luZm8sICZ2aXN1YWxzX21hdGNoZWQpOworICAgICAgICBpZiAodmlzdWFsc19tYXRjaGVkID09IDApIHsKKy8qIEdSUjogIGFkZCAxNS0sIDE2LSBhbmQgMzItYml0IFRydWVDb2xvciB2aXN1YWxzIChhbHNvIERpcmVjdENvbG9yPykgKi8KKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZGVmYXVsdCBzY3JlZW4gZGVwdGggJWQgbm90IHN1cHBvcnRlZCwgYW5kIG5vIgorICAgICAgICAgICAgICAiIDI0LWJpdCB2aXN1YWxzIGZvdW5kXG4iLCBkZXB0aCk7CisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfQorICAgICAgICBUcmFjZSgoc3RkZXJyLCAiWEdldFZpc3VhbEluZm8oKSByZXR1cm5lZCAlZCAyNC1iaXQgdmlzdWFsc1xuIiwKKyAgICAgICAgICB2aXN1YWxzX21hdGNoZWQpKQorICAgICAgICB2aXN1YWwgPSB2aXN1YWxfbGlzdFswXS52aXN1YWw7CisgICAgICAgIGRlcHRoID0gdmlzdWFsX2xpc3RbMF0uZGVwdGg7CisvKgorICAgICAgICBjb2xvcm1hcF9zaXplID0gdmlzdWFsX2xpc3RbMF0uY29sb3JtYXBfc2l6ZTsKKyAgICAgICAgdmlzdWFsX2NsYXNzID0gdmlzdWFsLT5jbGFzczsKKyAgICAgICAgdmlzdWFsSUQgPSBYVmlzdWFsSURGcm9tVmlzdWFsKHZpc3VhbCk7CisgKi8KKyAgICAgICAgaGF2ZV9ub25kZWZhdWx0X3Zpc3VhbCA9IFRSVUU7CisgICAgICAgIG5lZWRfY29sb3JtYXAgPSBUUlVFOworICAgIH0gZWxzZSB7CisgICAgICAgIFhNYXRjaFZpc3VhbEluZm8oZGlzcGxheSwgc2NyZWVuLCBkZXB0aCwgVHJ1ZUNvbG9yLCAmdmlzdWFsX2luZm8pOworICAgICAgICB2aXN1YWwgPSB2aXN1YWxfaW5mby52aXN1YWw7CisgICAgfQorI2VuZGlmCisKKyAgICBSTWFzayA9IHZpc3VhbC0+cmVkX21hc2s7CisgICAgR01hc2sgPSB2aXN1YWwtPmdyZWVuX21hc2s7CisgICAgQk1hc2sgPSB2aXN1YWwtPmJsdWVfbWFzazsKKworLyogR1JSOiAgYWRkL2NoZWNrIDgtYml0IHN1cHBvcnQgKi8KKyAgICBpZiAoZGVwdGggPT0gOCB8fCBuZWVkX2NvbG9ybWFwKSB7CisgICAgICAgIGNvbG9ybWFwID0gWENyZWF0ZUNvbG9ybWFwKGRpc3BsYXksIHJvb3QsIHZpc3VhbCwgQWxsb2NOb25lKTsKKyAgICAgICAgaWYgKCFjb2xvcm1hcCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJYQ3JlYXRlQ29sb3JtYXAoKSBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KKyAgICAgICAgaGF2ZV9jb2xvcm1hcCA9IFRSVUU7CisgICAgfQorICAgIGlmIChkZXB0aCA9PSAxNSB8fCBkZXB0aCA9PSAxNikgeworICAgICAgICBSU2hpZnQgPSAxNSAtIHJwbmdfeF9tc2IoUk1hc2spOyAgICAvKiB0aGVzZSBhcmUgcmlnaHQtc2hpZnRzICovCisgICAgICAgIEdTaGlmdCA9IDE1IC0gcnBuZ194X21zYihHTWFzayk7CisgICAgICAgIEJTaGlmdCA9IDE1IC0gcnBuZ194X21zYihCTWFzayk7CisgICAgfSBlbHNlIGlmIChkZXB0aCA+IDE2KSB7CisjZGVmaW5lIE5PXzI0QklUX01BU0tTCisjaWZkZWYgTk9fMjRCSVRfTUFTS1MKKyAgICAgICAgUlNoaWZ0ID0gcnBuZ194X21zYihSTWFzaykgLSA3OyAgICAgLyogdGhlc2UgYXJlIGxlZnQtc2hpZnRzICovCisgICAgICAgIEdTaGlmdCA9IHJwbmdfeF9tc2IoR01hc2spIC0gNzsKKyAgICAgICAgQlNoaWZ0ID0gcnBuZ194X21zYihCTWFzaykgLSA3OworI2Vsc2UKKyAgICAgICAgUlNoaWZ0ID0gNyAtIHJwbmdfeF9tc2IoUk1hc2spOyAgICAgLyogdGhlc2UgYXJlIHJpZ2h0LXNoaWZ0cywgdG9vICovCisgICAgICAgIEdTaGlmdCA9IDcgLSBycG5nX3hfbXNiKEdNYXNrKTsKKyAgICAgICAgQlNoaWZ0ID0gNyAtIHJwbmdfeF9tc2IoQk1hc2spOworI2VuZGlmCisgICAgfQorICAgIGlmIChkZXB0aCA+PSAxNSAmJiAoUlNoaWZ0IDwgMCB8fCBHU2hpZnQgPCAwIHx8IEJTaGlmdCA8IDApKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAicnBuZyBpbnRlcm5hbCBsb2dpYyBlcnJvcjogIG5lZ2F0aXZlIFggc2hpZnQocykhXG4iKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZpbmFsbHksIGNyZWF0ZSB0aGUgd2luZG93LgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgYXR0ci5iYWNraW5nX3N0b3JlID0gQWx3YXlzOworICAgIGF0dHIuZXZlbnRfbWFzayA9IEV4cG9zdXJlTWFzayB8IEtleVByZXNzTWFzayB8IEJ1dHRvblByZXNzTWFzazsKKyAgICBhdHRybWFzayA9IENXQmFja2luZ1N0b3JlIHwgQ1dFdmVudE1hc2s7CisgICAgaWYgKGhhdmVfbm9uZGVmYXVsdF92aXN1YWwpIHsKKyAgICAgICAgYXR0ci5jb2xvcm1hcCA9IGNvbG9ybWFwOworICAgICAgICBhdHRyLmJhY2tncm91bmRfcGl4ZWwgPSAwOworICAgICAgICBhdHRyLmJvcmRlcl9waXhlbCA9IDE7CisgICAgICAgIGF0dHJtYXNrIHw9IENXQ29sb3JtYXAgfCBDV0JhY2tQaXhlbCB8IENXQm9yZGVyUGl4ZWw7CisgICAgfQorCisgICAgd2luZG93ID0gWENyZWF0ZVdpbmRvdyhkaXNwbGF5LCByb290LCAwLCAwLCBpbWFnZV93aWR0aCwgaW1hZ2VfaGVpZ2h0LCAwLAorICAgICAgZGVwdGgsIElucHV0T3V0cHV0LCB2aXN1YWwsIGF0dHJtYXNrLCAmYXR0cik7CisKKyAgICBpZiAod2luZG93ID09IE5vbmUpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJYQ3JlYXRlV2luZG93KCkgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfSBlbHNlCisgICAgICAgIGhhdmVfd2luZG93ID0gVFJVRTsKKworICAgIGlmIChkZXB0aCA9PSA4KQorICAgICAgICBYU2V0V2luZG93Q29sb3JtYXAoZGlzcGxheSwgd2luZG93LCBjb2xvcm1hcCk7CisKKyAgICBpZiAoIVhTdHJpbmdMaXN0VG9UZXh0UHJvcGVydHkoJndpbmRvd19uYW1lLCAxLCBwV2luZG93TmFtZSkpCisgICAgICAgIHBXaW5kb3dOYW1lID0gTlVMTDsKKyAgICBpZiAoIVhTdHJpbmdMaXN0VG9UZXh0UHJvcGVydHkoJmljb25fbmFtZSwgMSwgcEljb25OYW1lKSkKKyAgICAgICAgcEljb25OYW1lID0gTlVMTDsKKworICAgIC8qIE9LIGlmIGFueSBoaW50cyBhbGxvY2F0aW9uIGZhaWxzOyBYU2V0V01Qcm9wZXJ0aWVzKCkgYWxsb3dzIE5VTExzICovCisKKyAgICBpZiAoKHNpemVfaGludHMgPSBYQWxsb2NTaXplSGludHMoKSkgIT0gTlVMTCkgeworICAgICAgICAvKiB3aW5kb3cgd2lsbCBub3QgYmUgcmVzaXphYmxlICovCisgICAgICAgIHNpemVfaGludHMtPmZsYWdzID0gUE1pblNpemUgfCBQTWF4U2l6ZTsKKyAgICAgICAgc2l6ZV9oaW50cy0+bWluX3dpZHRoID0gc2l6ZV9oaW50cy0+bWF4X3dpZHRoID0gKGludClpbWFnZV93aWR0aDsKKyAgICAgICAgc2l6ZV9oaW50cy0+bWluX2hlaWdodCA9IHNpemVfaGludHMtPm1heF9oZWlnaHQgPSAoaW50KWltYWdlX2hlaWdodDsKKyAgICB9CisKKyAgICBpZiAoKHdtX2hpbnRzID0gWEFsbG9jV01IaW50cygpKSAhPSBOVUxMKSB7CisgICAgICAgIHdtX2hpbnRzLT5pbml0aWFsX3N0YXRlID0gTm9ybWFsU3RhdGU7CisgICAgICAgIHdtX2hpbnRzLT5pbnB1dCA9IFRydWU7CisgICAgIC8qIHdtX2hpbnRzLT5pY29uX3BpeG1hcCA9IGljb25fcGl4bWFwOyAqLworICAgICAgICB3bV9oaW50cy0+ZmxhZ3MgPSBTdGF0ZUhpbnQgfCBJbnB1dEhpbnQgIC8qIHwgSWNvblBpeG1hcEhpbnQgKi8gOworICAgIH0KKworICAgIGlmICgoY2xhc3NfaGludHMgPSBYQWxsb2NDbGFzc0hpbnQoKSkgIT0gTlVMTCkgeworICAgICAgICBjbGFzc19oaW50cy0+cmVzX25hbWUgPSByZXNfbmFtZTsKKyAgICAgICAgY2xhc3NfaGludHMtPnJlc19jbGFzcyA9IHJlc19jbGFzczsKKyAgICB9CisKKyAgICBYU2V0V01Qcm9wZXJ0aWVzKGRpc3BsYXksIHdpbmRvdywgcFdpbmRvd05hbWUsIHBJY29uTmFtZSwgTlVMTCwgMCwKKyAgICAgIHNpemVfaGludHMsIHdtX2hpbnRzLCBjbGFzc19oaW50cyk7CisKKyAgICAvKiB2YXJpb3VzIHByb3BlcnRpZXMgYW5kIGhpbnRzIG5vIGxvbmdlciBuZWVkZWQ7IGZyZWUgbWVtb3J5ICovCisgICAgaWYgKHBXaW5kb3dOYW1lKQorICAgICAgIFhGcmVlKHBXaW5kb3dOYW1lLT52YWx1ZSk7CisgICAgaWYgKHBJY29uTmFtZSkKKyAgICAgICBYRnJlZShwSWNvbk5hbWUtPnZhbHVlKTsKKyAgICBpZiAoc2l6ZV9oaW50cykKKyAgICAgICAgWEZyZWUoc2l6ZV9oaW50cyk7CisgICAgaWYgKHdtX2hpbnRzKQorICAgICAgIFhGcmVlKHdtX2hpbnRzKTsKKyAgICBpZiAoY2xhc3NfaGludHMpCisgICAgICAgWEZyZWUoY2xhc3NfaGludHMpOworCisgICAgWE1hcFdpbmRvdyhkaXNwbGF5LCB3aW5kb3cpOworCisgICAgZ2MgPSBYQ3JlYXRlR0MoZGlzcGxheSwgd2luZG93LCAwLCAmZ2N2YWx1ZXMpOworICAgIGhhdmVfZ2MgPSBUUlVFOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZpbGwgd2luZG93IHdpdGggdGhlIHNwZWNpZmllZCBiYWNrZ3JvdW5kIGNvbG9yLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgaWYgKGRlcHRoID09IDI0IHx8IGRlcHRoID09IDMyKSB7CisgICAgICAgIGJnX3BpeGVsID0gKCh1bGcpYmdfcmVkICAgPDwgUlNoaWZ0KSB8CisgICAgICAgICAgICAgICAgICAgKCh1bGcpYmdfZ3JlZW4gPDwgR1NoaWZ0KSB8CisgICAgICAgICAgICAgICAgICAgKCh1bGcpYmdfYmx1ZSAgPDwgQlNoaWZ0KTsKKyAgICB9IGVsc2UgaWYgKGRlcHRoID09IDE2KSB7CisgICAgICAgIGJnX3BpeGVsID0gKCgoKHVsZyliZ19yZWQgICA8PCA4KSA+PiBSU2hpZnQpICYgUk1hc2spIHwKKyAgICAgICAgICAgICAgICAgICAoKCgodWxnKWJnX2dyZWVuIDw8IDgpID4+IEdTaGlmdCkgJiBHTWFzaykgfAorICAgICAgICAgICAgICAgICAgICgoKCh1bGcpYmdfYmx1ZSAgPDwgOCkgPj4gQlNoaWZ0KSAmIEJNYXNrKTsKKyAgICB9IGVsc2UgLyogZGVwdGggPT0gOCAqLyB7CisKKyAgICAgICAgLyogR1JSOiAgYWRkIDgtYml0IHN1cHBvcnQgKi8KKworICAgIH0KKworICAgIFhTZXRGb3JlZ3JvdW5kKGRpc3BsYXksIGdjLCBiZ19waXhlbCk7CisgICAgWEZpbGxSZWN0YW5nbGUoZGlzcGxheSwgd2luZG93LCBnYywgMCwgMCwgaW1hZ2Vfd2lkdGgsIGltYWdlX2hlaWdodCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgV2FpdCBmb3IgZmlyc3QgRXhwb3NlIGV2ZW50IHRvIGRvIGFueSBkcmF3aW5nLCB0aGVuIGZsdXNoLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgZG8KKyAgICAgICAgWE5leHRFdmVudChkaXNwbGF5LCAmZSk7CisgICAgd2hpbGUgKGUudHlwZSAhPSBFeHBvc2UgfHwgZS54ZXhwb3NlLmNvdW50KTsKKworICAgIFhGbHVzaChkaXNwbGF5KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBYLSBhbmQgZGlzcGxheS1zcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBpbWFnZS4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIGlmIChkZXB0aCA9PSAyNCB8fCBkZXB0aCA9PSAzMikgeworICAgICAgICB4ZGF0YSA9ICh1Y2ggKiltYWxsb2MoNCppbWFnZV93aWR0aCppbWFnZV9oZWlnaHQpOworICAgICAgICBwYWQgPSAzMjsKKyAgICB9IGVsc2UgaWYgKGRlcHRoID09IDE2KSB7CisgICAgICAgIHhkYXRhID0gKHVjaCAqKW1hbGxvYygyKmltYWdlX3dpZHRoKmltYWdlX2hlaWdodCk7CisgICAgICAgIHBhZCA9IDE2OworICAgIH0gZWxzZSAvKiBkZXB0aCA9PSA4ICovIHsKKyAgICAgICAgeGRhdGEgPSAodWNoICopbWFsbG9jKGltYWdlX3dpZHRoKmltYWdlX2hlaWdodCk7CisgICAgICAgIHBhZCA9IDg7CisgICAgfQorCisgICAgaWYgKCF4ZGF0YSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIHVuYWJsZSB0byBhbGxvY2F0ZSBpbWFnZSBtZW1vcnlcbiIpOworICAgICAgICByZXR1cm4gNDsKKyAgICB9CisKKyAgICB4aW1hZ2UgPSBYQ3JlYXRlSW1hZ2UoZGlzcGxheSwgdmlzdWFsLCBkZXB0aCwgWlBpeG1hcCwgMCwKKyAgICAgIChjaGFyICopeGRhdGEsIGltYWdlX3dpZHRoLCBpbWFnZV9oZWlnaHQsIHBhZCwgMCk7CisKKyAgICBpZiAoIXhpbWFnZSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIFhDcmVhdGVJbWFnZSgpIGZhaWxlZFxuIik7CisgICAgICAgIGZyZWUoeGRhdGEpOworICAgICAgICByZXR1cm4gMzsKKyAgICB9CisKKyAgICAvKiB0byBhdm9pZCB0ZXN0aW5nIHRoZSBieXRlIG9yZGVyIGV2ZXJ5IHBpeGVsIChvciBkb3VibGluZyB0aGUgc2l6ZSBvZgorICAgICAqIHRoZSBkcmF3aW5nIHJvdXRpbmUgd2l0aCBhIGdpYW50IGlmLXRlc3QpLCB3ZSBhcmJpdHJhcmlseSBzZXQgdGhlIGJ5dGUKKyAgICAgKiBvcmRlciB0byBNU0JGaXJzdCBhbmQgbGV0IFhsaWIgd29ycnkgYWJvdXQgaW52ZXJ0aW5nIHRoaW5ncyBvbiBsaXR0bGUtCisgICAgICogZW5kaWFuIG1hY2hpbmVzIChsaWtlIExpbnV4L3g4Niwgb2xkIFZBWGVuLCBldGMuKS0tdGhpcyBpcyBub3QgdGhlIG1vc3QKKyAgICAgKiBlZmZpY2llbnQgYXBwcm9hY2ggKHRoZSBnaWFudCBpZi10ZXN0IHdvdWxkIGJlIGJldHRlciksIGJ1dCBpbiB0aGUKKyAgICAgKiBpbnRlcmVzdCBvZiBjbGFyaXR5LCB3ZSB0YWtlIHRoZSBlYXN5IHdheSBvdXQuLi4gKi8KKworICAgIHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0OworCisgICAgcmV0dXJuIDA7CisKK30gLyogZW5kIGZ1bmN0aW9uIHJwbmdfeF9jcmVhdGVfd2luZG93KCkgKi8KKworCisKKworCitzdGF0aWMgaW50IHJwbmdfeF9kaXNwbGF5X2ltYWdlKHZvaWQpCit7CisgICAgdWNoICpzcmM7CisgICAgY2hhciAqZGVzdDsKKyAgICB1Y2ggciwgZywgYiwgYTsKKyAgICB1bGcgaSwgcm93LCBsYXN0cm93ID0gMDsKKyAgICB1bGcgcGl4ZWw7CisgICAgaW50IHhpbWFnZV9yb3dieXRlcyA9IHhpbWFnZS0+Ynl0ZXNfcGVyX2xpbmU7CisvKiAgaW50IGJwcCA9IHhpbWFnZS0+Yml0c19wZXJfcGl4ZWw7ICAqLworCisKKyAgICBUcmFjZSgoc3RkZXJyLCAiYmVnaW5uaW5nIGRpc3BsYXkgbG9vcCAoaW1hZ2VfY2hhbm5lbHMgPT0gJWQpXG4iLAorICAgICAgaW1hZ2VfY2hhbm5lbHMpKQorICAgIFRyYWNlKChzdGRlcnIsICIgICAod2lkdGggPSAlbGQsIHJvd2J5dGVzID0gJWxkLCB4aW1hZ2Vfcm93Ynl0ZXMgPSAlZClcbiIsCisgICAgICBpbWFnZV93aWR0aCwgaW1hZ2Vfcm93Ynl0ZXMsIHhpbWFnZV9yb3dieXRlcykpCisgICAgVHJhY2UoKHN0ZGVyciwgIiAgIChicHAgPSAlZClcbiIsIHhpbWFnZS0+Yml0c19wZXJfcGl4ZWwpKQorICAgIFRyYWNlKChzdGRlcnIsICIgICAoYnl0ZV9vcmRlciA9ICVzKVxuIiwgeGltYWdlLT5ieXRlX29yZGVyID09IE1TQkZpcnN0PworICAgICAgIk1TQkZpcnN0IiA6ICh4aW1hZ2UtPmJ5dGVfb3JkZXIgPT0gTFNCRmlyc3Q/ICJMU0JGaXJzdCIgOiAidW5rbm93biIpKSkKKworICAgIGlmIChkZXB0aCA9PSAyNCB8fCBkZXB0aCA9PSAzMikgeworICAgICAgICB1bGcgcmVkLCBncmVlbiwgYmx1ZTsKKworICAgICAgICBmb3IgKGxhc3Ryb3cgPSByb3cgPSAwOyAgcm93IDwgaW1hZ2VfaGVpZ2h0OyAgKytyb3cpIHsKKyAgICAgICAgICAgIHNyYyA9IGltYWdlX2RhdGEgKyByb3cqaW1hZ2Vfcm93Ynl0ZXM7CisgICAgICAgICAgICBkZXN0ID0geGltYWdlLT5kYXRhICsgcm93KnhpbWFnZV9yb3dieXRlczsKKyAgICAgICAgICAgIGlmIChpbWFnZV9jaGFubmVscyA9PSAzKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gaW1hZ2Vfd2lkdGg7ICBpID4gMDsgIC0taSkgeworICAgICAgICAgICAgICAgICAgICByZWQgICA9ICpzcmMrKzsKKyAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAqc3JjKys7CisgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKnNyYysrOworI2lmZGVmIE5PXzI0QklUX01BU0tTCisgICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAgIDw8IFJTaGlmdCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncmVlbiA8PCBHU2hpZnQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1ZSAgPDwgQlNoaWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCisgICAgICAgICAgICAgICAgICAgIC8qIEdSUiBCVUc6ICB0aGlzIGFzc3VtZXMgYnBwID09IDMyLCBidXQgbWF5IGJlIDI0OiAqLworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKFJTaGlmdCA8IDApPyByZWQgICA8PCAoLVJTaGlmdCkgOiByZWQgICA+PiBSU2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKEdTaGlmdCA8IDApPyBncmVlbiA8PCAoLUdTaGlmdCkgOiBncmVlbiA+PiBHU2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKEJTaGlmdCA8IDApPyBibHVlICA8PCAoLUJTaGlmdCkgOiBibHVlICA+PiBCU2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAmIFJNYXNrKSB8IChncmVlbiAmIEdNYXNrKSB8IChibHVlICYgQk1hc2spOworICAgICAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgLyogaWYgKGltYWdlX2NoYW5uZWxzID09IDQpICovIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBpbWFnZV93aWR0aDsgIGkgPiAwOyAgLS1pKSB7CisgICAgICAgICAgICAgICAgICAgIHIgPSAqc3JjKys7CisgICAgICAgICAgICAgICAgICAgIGcgPSAqc3JjKys7CisgICAgICAgICAgICAgICAgICAgIGIgPSAqc3JjKys7CisgICAgICAgICAgICAgICAgICAgIGEgPSAqc3JjKys7CisgICAgICAgICAgICAgICAgICAgIGlmIChhID09IDI1NSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVkICAgPSByOworICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSBnOworICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSBiOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVkICAgPSBiZ19yZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBncmVlbiA9IGJnX2dyZWVuOworICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSBiZ19ibHVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBtYWNybyAoZnJvbSBwbmcuaCkgY29tcG9zaXRlcyB0aGUgZm9yZWdyb3VuZAorICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIGJhY2tncm91bmQgdmFsdWVzIGFuZCBwdXRzIHRoZSByZXN1bHQgaW50byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGZpcnN0IGFyZ3VtZW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUocmVkLCAgIHIsIGEsIGJnX3JlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoZ3JlZW4sIGcsIGEsIGJnX2dyZWVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShibHVlLCAgYiwgYSwgYmdfYmx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSAocmVkICAgPDwgUlNoaWZ0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdyZWVuIDw8IEdTaGlmdCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVlICA8PCBCU2hpZnQpOworICAgICAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZGlzcGxheSBhZnRlciBldmVyeSAxNiBsaW5lcyAqLworICAgICAgICAgICAgaWYgKCgocm93KzEpICYgMHhmKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgWFB1dEltYWdlKGRpc3BsYXksIHdpbmRvdywgZ2MsIHhpbWFnZSwgMCwgKGludClsYXN0cm93LCAwLAorICAgICAgICAgICAgICAgICAgKGludClsYXN0cm93LCBpbWFnZV93aWR0aCwgMTYpOworICAgICAgICAgICAgICAgIFhGbHVzaChkaXNwbGF5KTsKKyAgICAgICAgICAgICAgICBsYXN0cm93ID0gcm93ICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfSBlbHNlIGlmIChkZXB0aCA9PSAxNikgeworICAgICAgICB1c2ggcmVkLCBncmVlbiwgYmx1ZTsKKworICAgICAgICBmb3IgKGxhc3Ryb3cgPSByb3cgPSAwOyAgcm93IDwgaW1hZ2VfaGVpZ2h0OyAgKytyb3cpIHsKKyAgICAgICAgICAgIHNyYyA9IGltYWdlX2RhdGEgKyByb3cqaW1hZ2Vfcm93Ynl0ZXM7CisgICAgICAgICAgICBkZXN0ID0geGltYWdlLT5kYXRhICsgcm93KnhpbWFnZV9yb3dieXRlczsKKyAgICAgICAgICAgIGlmIChpbWFnZV9jaGFubmVscyA9PSAzKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gaW1hZ2Vfd2lkdGg7ICBpID4gMDsgIC0taSkgeworICAgICAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKSgqc3JjKSA8PCA4KTsKKyAgICAgICAgICAgICAgICAgICAgKytzcmM7CisgICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpKCpzcmMpIDw8IDgpOworICAgICAgICAgICAgICAgICAgICArK3NyYzsKKyAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCkoKnNyYykgPDwgOCk7CisgICAgICAgICAgICAgICAgICAgICsrc3JjOworICAgICAgICAgICAgICAgICAgICBwaXhlbCA9ICgocmVkICAgPj4gUlNoaWZ0KSAmIFJNYXNrKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChncmVlbiA+PiBHU2hpZnQpICYgR01hc2spIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJsdWUgID4+IEJTaGlmdCkgJiBCTWFzayk7CisgICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIC8qIGlmIChpbWFnZV9jaGFubmVscyA9PSA0KSAqLyB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gaW1hZ2Vfd2lkdGg7ICBpID4gMDsgIC0taSkgeworICAgICAgICAgICAgICAgICAgICByID0gKnNyYysrOworICAgICAgICAgICAgICAgICAgICBnID0gKnNyYysrOworICAgICAgICAgICAgICAgICAgICBiID0gKnNyYysrOworICAgICAgICAgICAgICAgICAgICBhID0gKnNyYysrOworICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PSAyNTUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpciA8PCA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpZyA8PCA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpYiA8PCA4KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpYmdfcmVkICAgPDwgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKWJnX2dyZWVuIDw8IDgpOworICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCliZ19ibHVlICA8PCA4KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgbWFjcm8gKGZyb20gcG5nLmgpIGNvbXBvc2l0ZXMgdGhlIGZvcmVncm91bmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCBiYWNrZ3JvdW5kIHZhbHVlcyBhbmQgcHV0cyB0aGUgcmVzdWx0IGJhY2sgaW50bworICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIGZpcnN0IGFyZ3VtZW50ICg9PSBmZyBieXRlIGhlcmU6ICBzYWZlKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKHIsIHIsIGEsIGJnX3JlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoZywgZywgYSwgYmdfZ3JlZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKGIsIGIsIGEsIGJnX2JsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaClyIDw8IDgpOworICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaClnIDw8IDgpOworICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCliIDw8IDgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKChyZWQgICA+PiBSU2hpZnQpICYgUk1hc2spIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGdyZWVuID4+IEdTaGlmdCkgJiBHTWFzaykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYmx1ZSAgPj4gQlNoaWZ0KSAmIEJNYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBkaXNwbGF5IGFmdGVyIGV2ZXJ5IDE2IGxpbmVzICovCisgICAgICAgICAgICBpZiAoKChyb3crMSkgJiAweGYpID09IDApIHsKKyAgICAgICAgICAgICAgICBYUHV0SW1hZ2UoZGlzcGxheSwgd2luZG93LCBnYywgeGltYWdlLCAwLCAoaW50KWxhc3Ryb3csIDAsCisgICAgICAgICAgICAgICAgICAoaW50KWxhc3Ryb3csIGltYWdlX3dpZHRoLCAxNik7CisgICAgICAgICAgICAgICAgWEZsdXNoKGRpc3BsYXkpOworICAgICAgICAgICAgICAgIGxhc3Ryb3cgPSByb3cgKyAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9IGVsc2UgLyogZGVwdGggPT0gOCAqLyB7CisKKyAgICAgICAgLyogR1JSOiAgYWRkIDgtYml0IHN1cHBvcnQgKi8KKworICAgIH0KKworICAgIFRyYWNlKChzdGRlcnIsICJjYWxsaW5nIGZpbmFsIFhQdXRJbWFnZSgpXG4iKSkKKyAgICBpZiAobGFzdHJvdyA8IGltYWdlX2hlaWdodCkgeworICAgICAgICBYUHV0SW1hZ2UoZGlzcGxheSwgd2luZG93LCBnYywgeGltYWdlLCAwLCAoaW50KWxhc3Ryb3csIDAsCisgICAgICAgICAgKGludClsYXN0cm93LCBpbWFnZV93aWR0aCwgaW1hZ2VfaGVpZ2h0LWxhc3Ryb3cpOworICAgICAgICBYRmx1c2goZGlzcGxheSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworCisKK3N0YXRpYyB2b2lkIHJwbmdfeF9jbGVhbnVwKHZvaWQpCit7CisgICAgaWYgKGltYWdlX2RhdGEpIHsKKyAgICAgICAgZnJlZShpbWFnZV9kYXRhKTsKKyAgICAgICAgaW1hZ2VfZGF0YSA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKHhpbWFnZSkgeworICAgICAgICBpZiAoeGltYWdlLT5kYXRhKSB7CisgICAgICAgICAgICBmcmVlKHhpbWFnZS0+ZGF0YSk7ICAgICAgICAgICAvKiB3ZSBhbGxvY2F0ZWQgaXQsIHNvIHdlIGZyZWUgaXQgKi8KKyAgICAgICAgICAgIHhpbWFnZS0+ZGF0YSA9IChjaGFyICopTlVMTDsgIC8qICBpbnN0ZWFkIG9mIFhEZXN0cm95SW1hZ2UoKSAqLworICAgICAgICB9CisgICAgICAgIFhEZXN0cm95SW1hZ2UoeGltYWdlKTsKKyAgICAgICAgeGltYWdlID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoaGF2ZV9nYykKKyAgICAgICAgWEZyZWVHQyhkaXNwbGF5LCBnYyk7CisKKyAgICBpZiAoaGF2ZV93aW5kb3cpCisgICAgICAgIFhEZXN0cm95V2luZG93KGRpc3BsYXksIHdpbmRvdyk7CisKKyAgICBpZiAoaGF2ZV9jb2xvcm1hcCkKKyAgICAgICAgWEZyZWVDb2xvcm1hcChkaXNwbGF5LCBjb2xvcm1hcCk7CisKKyAgICBpZiAoaGF2ZV9ub25kZWZhdWx0X3Zpc3VhbCkKKyAgICAgICAgWEZyZWUodmlzdWFsX2xpc3QpOworfQorCisKKworCisKK3N0YXRpYyBpbnQgcnBuZ194X21zYih1bGcgdTMydmFsKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMzE7ICBpID49IDA7ICAtLWkpIHsKKyAgICAgICAgaWYgKHUzMnZhbCAmIDB4ODAwMDAwMDBMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHUzMnZhbCA8PD0gMTsKKyAgICB9CisgICAgcmV0dXJuIGk7Cit9CmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9ncmVnYm9vay9ycG5nMi13aW4uYyBiL2xpYnBuZy9jb250cmliL2dyZWdib29rL3JwbmcyLXdpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YjlkZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9ncmVnYm9vay9ycG5nMi13aW4uYwpAQCAtMCwwICsxLDEyNTUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIHJwbmcyIC0gcHJvZ3Jlc3NpdmUtbW9kZWwgUE5HIGRpc3BsYXkgcHJvZ3JhbSAgICAgICAgICAgICAgICBycG5nMi13aW4uYworCisgICBUaGlzIHByb2dyYW0gZGVjb2RlcyBhbmQgZGlzcGxheXMgUE5HIGZpbGVzIHByb2dyZXNzaXZlbHksIGFzIGlmIGl0IHdlcmUKKyAgIGEgd2ViIGJyb3dzZXIgKHRob3VnaCB0aGUgZnJvbnQgZW5kIGlzIG9ubHkgc2V0IHVwIHRvIHJlYWQgZnJvbSBmaWxlcykuCisgICBJdCBzdXBwb3J0cyBnYW1tYSBjb3JyZWN0aW9uLCB1c2VyLXNwZWNpZmllZCBiYWNrZ3JvdW5kIGNvbG9ycywgYW5kIHVzZXItCisgICBzcGVjaWZpZWQgYmFja2dyb3VuZCBwYXR0ZXJucyAoZm9yIHRyYW5zcGFyZW50IGltYWdlcykuICBUaGlzIHZlcnNpb24gaXMKKyAgIGZvciAzMi1iaXQgV2luZG93czsgaXQgbWF5IGNvbXBpbGUgdW5kZXIgMTYtYml0IFdpbmRvd3Mgd2l0aCBhIGxpdHRsZQorICAgdHdlYWtpbmcgKG9yIG1heWJlIG5vdCkuICBUaGFua3MgdG8gQWRhbSBDb3N0ZWxsbyBhbmQgUGlldGVyIFMuIHZhbiBkZXIKKyAgIE1ldWxlbiBmb3IgdGhlICJkaWFtb25kIiBhbmQgInJhZGlhbCB3YXZlcyIgcGF0dGVybnMsIHJlc3BlY3RpdmVseS4KKworICAgdG8gZG8gKHNvbWVkYXksIG1heWJlKToKKyAgICAtIGhhbmRsZSBxdW90ZWQgY29tbWFuZC1saW5lIGFyZ3MgKGVzcGVjaWFsbHkgZmlsZW5hbWVzIHdpdGggc3BhY2VzKQorICAgIC0gZmluaXNoIHJlc2l6YWJsZSBjaGVja2VyYm9hcmQtZ3JhZGllbnQgKHNpemVzIDQtMTI4PykKKyAgICAtIHVzZSAlLjEwMjNzIHRvIHNpbXBsaWZ5IHRydW5jYXRpb24gb2YgdGl0bGUtYmFyIHN0cmluZz8KKyAgICAtIGhhdmUgbWluaW11bSB3aW5kb3cgd2lkdGg6ICBvaCB3ZWxsCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIENoYW5nZWxvZzoKKyAgICAtIDEuMDE6ICBpbml0aWFsIHB1YmxpYyByZWxlYXNlCisgICAgLSAxLjAyOiAgZml4ZWQgY3V0LWFuZC1wYXN0ZSBlcnJvciBpbiB1c2FnZSBzY3JlZW4gKG9vcHMuLi4pCisgICAgLSAxLjAzOiAgbW9kaWZpZWQgdG8gYWxsb3cgYWJicmV2aWF0ZWQgb3B0aW9ucworICAgIC0gMS4wNDogIHJlbW92ZWQgYm9ndXMgZXh0cmEgYXJndW1lbnQgZnJvbSB1c2FnZSBmcHJpbnRmKCkgW0dsZW5uIFItUD9dOworICAgICAgICAgICAgICBmaXhlZCBjb21tYW5kLWxpbmUgcGFyc2luZyBidWcKKyAgICAtIDEuMTA6ICBlbmFibGVkICJtZXNzYWdlIHdpbmRvdyIvY29uc29sZSAodGhhbmtzIHRvIERhdmlkIEdlbGRyZWljaCkKKyAgICAtIDEuMjA6ICBhZGRlZCBydW50aW1lIE1NWC1lbmFibGluZy9kaXNhYmxpbmcgYW5kIG5ldyAtbW14KiBvcHRpb25zCisgICAgLSAxLjIxOiAgbWFkZSBtaW5vciB0d2VhayB0byB1c2FnZSBzY3JlZW4gdG8gZml0IHdpdGhpbiAyNS1saW5lIGNvbnNvbGUKKyAgICAtIDEuMjI6ICBhZGRlZCBBTUQ2NC9FTTY0VCBzdXBwb3J0IChfX3g4Nl82NF9fKQorICAgIC0gMi4wMDogIGR1YWwtbGljZW5zZWQgKGFkZGVkIEdOVSBHUEwpCisgICAgLSAyLjAxOiAgZml4ZWQgNjQtYml0IHR5cG8gaW4gcmVhZHBuZzIuYworICAgIC0gMi4wMjogIGZpeGVkIGltcHJvcGVyIGRpc3BsYXkgb2YgdXNhZ2Ugc2NyZWVuIG9uIFBORyBlcnJvcihzKTsgZml4ZWQKKyAgICAgICAgICAgICAgdW5leHBlY3RlZC1FT0YgYW5kIGZpbGUtcmVhZC1lcnJvciBjYXNlcworICAgIC0gMi4wMzogIHJlbW92ZWQgcnVudGltZSBNTVgtZW5hYmxpbmcvZGlzYWJsaW5nIGFuZCBvYnNvbGV0ZSAtbW14KiBvcHRpb25zCisgICAgLSAyLjA0OgorICAgICAgICAgICAgIChHUi1QKQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwOCBHcmVnIFJvZWxvZnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcywiIHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQsCisgICAgICBleHByZXNzIG9yIGltcGxpZWQuICBJbiBubyBldmVudCBzaGFsbCB0aGUgYXV0aG9yIG9yIGNvbnRyaWJ1dG9ycworICAgICAgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgaW4gYW55IHdheSBmcm9tIHRoZSB1c2Ugb2YKKyAgICAgIHRoaXMgc29mdHdhcmUuCisKKyAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIERVQUwtTElDRU5TRUQuICBZb3UgbWF5IG1vZGlmeSBhbmQvb3IKKyAgICAgIHJlZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2Ygb25lIG9mIHRoZQorICAgICAgZm9sbG93aW5nIHR3byBsaWNlbnNlcyAoYXQgeW91ciBvcHRpb24pOgorCisKKyAgICAgIExJQ0VOU0UgMSAoIkJTRC1saWtlIHdpdGggYWR2ZXJ0aXNpbmcgY2xhdXNlIik6CisKKyAgICAgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICAgICAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZQorICAgICAgaXQgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCisgICAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgICAgbm90aWNlLCBkaXNjbGFpbWVyLCBhbmQgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMuCisgICAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgICAgbm90aWNlLCBkaXNjbGFpbWVyLCBhbmQgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YS0KKyAgICAgICAgIHRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAgICAgICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorCisgICAgICAgICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEdyZWcgUm9lbG9mcworICAgICAgICAgICAgYW5kIGNvbnRyaWJ1dG9ycyBmb3IgdGhlIGJvb2ssICJQTkc6IFRoZSBEZWZpbml0aXZlIEd1aWRlLCIKKyAgICAgICAgICAgIHB1Ymxpc2hlZCBieSBPJ1JlaWxseSBhbmQgQXNzb2NpYXRlcy4KKworCisgICAgICBMSUNFTlNFIDIgKEdOVSBHUEwgdjIgb3IgbGF0ZXIpOgorCisgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgICAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFBST0dOQU1FICAicnBuZzItd2luIgorI2RlZmluZSBMT05HTkFNRSAgIlByb2dyZXNzaXZlIFBORyBWaWV3ZXIgZm9yIFdpbmRvd3MiCisjZGVmaW5lIFZFUlNJT04gICAiMi4wMiBvZiAxNiBNYXJjaCAyMDA4IgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4gICAgLyogZm9yIGptcGJ1ZiBkZWNsYXJhdGlvbiBpbiByZWFkcG5nMi5oICovCisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG1hdGguaD4gICAgICAvKiBvbmx5IGZvciBQdmRNIGJhY2tncm91bmQgY29kZSAqLworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpZmRlZiBfX0NZR1dJTl9fCisvKiBnZXRjaCByZXBsYWNlbWVudC4gVHVybnMgb3V0LCB3ZSBkb24ndCByZWFsbHkgbmVlZCB0aGlzLAorICogYnV0IGxlYXZlIGl0IGhlcmUgaWYgd2UgZXZlciBlbmFibGUgYW55IG9mIHRoZSB1c2VzIG9mCisgKiBfZ2V0Y2ggaW4gdGhlIG1haW4gY29kZQorICovCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dGVybWlvLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CitpbnQgcmVwbF9nZXRjaCggdm9pZCApCit7CisgIGNoYXIgY2g7CisgIGludCBmZCA9IGZpbGVubyhzdGRpbik7CisgIHN0cnVjdCB0ZXJtaW8gb2xkX3R0eSwgbmV3X3R0eTsKKworICBpb2N0bChmZCwgVENHRVRBLCAmb2xkX3R0eSk7CisgIG5ld190dHkgPSBvbGRfdHR5OworICBuZXdfdHR5LmNfbGZsYWcgJj0gfihJQ0FOT04gfCBFQ0hPIHwgSVNJRyk7CisgIGlvY3RsKGZkLCBUQ1NFVEEsICZuZXdfdHR5KTsKKyAgZnJlYWQoJmNoLCAxLCBzaXplb2YoY2gpLCBzdGRpbik7CisgIGlvY3RsKGZkLCBUQ1NFVEEsICZvbGRfdHR5KTsKKworICByZXR1cm4gY2g7Cit9CisjZGVmaW5lIF9nZXRjaCByZXBsX2dldGNoCisjZWxzZQorI2luY2x1ZGUgPGNvbmlvLmg+ICAgICAvKiBvbmx5IGZvciBfZ2V0Y2goKSAqLworI2VuZGlmCisKKy8qIGFsbCBmb3IgUHZkTSBiYWNrZ3JvdW5kIGNvZGU6ICovCisjaWZuZGVmIFBJCisjICBkZWZpbmUgUEkgICAgICAgICAgICAgMy4xNDE1OTI2NTM1ODk3OTMyMzgKKyNlbmRpZgorI2RlZmluZSBQSV8yICAgICAgICAgICAgIChQSSowLjUpCisjZGVmaW5lIElOVl9QSV8zNjAgICAgICAgKDM2MC4wIC8gUEkpCisjZGVmaW5lIE1BWChhLGIpICAgICAgICAgKGE+Yj9hOmIpCisjZGVmaW5lIE1JTihhLGIpICAgICAgICAgKGE8Yj9hOmIpCisjZGVmaW5lIENMSVAoYSxtaW4sbWF4KSAgTUFYKG1pbixNSU4oKGEpLG1heCkpCisjZGVmaW5lIEFCUyhhKSAgICAgICAgICAgKChhKTwwPy0oYSk6KGEpKQorI2RlZmluZSBDTElQOFAoYykgICAgICAgIE1BWCgwLChNSU4oKGMpLDI1NSkpKSAgIC8qIDgtYml0IHBvcy4gaW50ZWdlciAodWNoKSAqLworI2RlZmluZSBST1VOREYoZikgICAgICAgICgoaW50KShmICsgMC41KSkKKworI2RlZmluZSByZ2IxX21heCAgIGJnX2ZyZXEKKyNkZWZpbmUgcmdiMV9taW4gICBiZ19ncmF5CisjZGVmaW5lIHJnYjJfbWF4ICAgYmdfYnNhdAorI2RlZmluZSByZ2IyX21pbiAgIGJnX2Jyb3QKKworLyogI2RlZmluZSBERUJVRyAqLyAgICAgLyogdGhpcyBlbmFibGVzIHRoZSBUcmFjZSgpIG1hY3JvcyAqLworCisjaW5jbHVkZSAicmVhZHBuZzIuaCIgICAvKiB0eXBlZGVmcywgY29tbW9uIG1hY3JvcywgcmVhZHBuZzIgcHJvdG90eXBlcyAqLworCisKKy8qIGNvdWxkIGp1c3QgaW5jbHVkZSBwbmcuaCwgYnV0IHRoaXMgbWFjcm8gaXMgdGhlIG9ubHkgdGhpbmcgd2UgbmVlZAorICogKG5hbWUgYW5kIHR5cGVkZWZzIGNoYW5nZWQgdG8gbG9jYWwgdmVyc2lvbnMpOyBub3RlIHRoYXQgc2lkZSBlZmZlY3RzCisgKiBvbmx5IGhhcHBlbiB3aXRoIGFscGhhICh3aGljaCBjb3VsZCBlYXNpbHkgYmUgYXZvaWRlZCB3aXRoCisgKiAidXNoIGFjb3B5ID0gKGFscGhhKTsiKSAqLworCisjZGVmaW5lIGFscGhhX2NvbXBvc2l0ZShjb21wb3NpdGUsIGZnLCBhbHBoYSwgYmcpIHsgICAgICAgICAgICAgICBcCisgICAgdXNoIHRlbXAgPSAoKHVzaCkoZmcpKih1c2gpKGFscGhhKSArICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKHVzaCkoYmcpKih1c2gpKDI1NSAtICh1c2gpKGFscGhhKSkgKyAodXNoKTEyOCk7ICBcCisgICAgKGNvbXBvc2l0ZSkgPSAodWNoKSgodGVtcCArICh0ZW1wID4+IDgpKSA+PiA4KTsgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBJTkJVRlNJWkUgNDA5NiAgIC8qIHdpdGggcHNldWRvLXRpbWluZyBvbiAoMSBzZWMgZGVsYXkvYmxvY2spLCB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICogIGJsb2NrIHNpemUgY29ycmVzcG9uZHMgcm91Z2hseSB0byBhIGRvd25sb2FkCisgICAgICAgICAgICAgICAgICAgICAgICAgICogIHNwZWVkIDEwJSBmYXN0ZXIgdGhhbiB0aGVvcmV0aWNhbCAzMy42SyBtYXhpbXVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICogIChhc3N1bWluZyA4IGRhdGEgYml0cywgMSBzdG9wIGJpdCBhbmQgbm8gb3RoZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgb3ZlcmhlYWQpICovCisKKy8qIGxvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyB2b2lkICAgICAgIHJwbmcyX3dpbl9pbml0KHZvaWQpOworc3RhdGljIGludCAgICAgICAgcnBuZzJfd2luX2NyZWF0ZV93aW5kb3codm9pZCk7CitzdGF0aWMgaW50ICAgICAgICBycG5nMl93aW5fbG9hZF9iZ19pbWFnZSh2b2lkKTsKK3N0YXRpYyB2b2lkICAgICAgIHJwbmcyX3dpbl9kaXNwbGF5X3Jvdyh1bGcgcm93KTsKK3N0YXRpYyB2b2lkICAgICAgIHJwbmcyX3dpbl9maW5pc2hfZGlzcGxheSh2b2lkKTsKK3N0YXRpYyB2b2lkICAgICAgIHJwbmcyX3dpbl9jbGVhbnVwKHZvaWQpOworTFJFU1VMVCBDQUxMQkFDSyAgcnBuZzJfd2luX3duZHByb2MoSFdORCwgVUlOVCwgV1BBUkFNLCBMUEFSQU0pOworCisKK3N0YXRpYyBjaGFyIHRpdGxlYmFyWzEwMjRdOworc3RhdGljIGNoYXIgKnByb2duYW1lID0gUFJPR05BTUU7CitzdGF0aWMgY2hhciAqYXBwbmFtZSA9IExPTkdOQU1FOworc3RhdGljIGNoYXIgKmZpbGVuYW1lOworc3RhdGljIEZJTEUgKmluZmlsZTsKKworc3RhdGljIG1haW5wcm9nX2luZm8gcnBuZzJfaW5mbzsKKworc3RhdGljIHVjaCBpbmJ1ZltJTkJVRlNJWkVdOworc3RhdGljIGludCBpbmNvdW50OworCitzdGF0aWMgaW50IHBhdCA9IDY7ICAgICAgICAgLyogbXVzdCBiZSBsZXNzIHRoYW4gbnVtX2JncGF0ICovCitzdGF0aWMgaW50IGJnX2ltYWdlID0gMDsKK3N0YXRpYyBpbnQgYmdzY2FsZSA9IDE2Oworc3RhdGljIHVsZyBiZ19yb3dieXRlczsKK3N0YXRpYyB1Y2ggKmJnX2RhdGE7CisKK3N0YXRpYyBzdHJ1Y3QgcmdiX2NvbG9yIHsKKyAgICB1Y2ggciwgZywgYjsKK30gcmdiW10gPSB7CisgICAgeyAgMCwgICAwLCAgIDB9LCAgICAvKiAgMDogIGJsYWNrICovCisgICAgezI1NSwgMjU1LCAyNTV9LCAgICAvKiAgMTogIHdoaXRlICovCisgICAgezE3MywgMTMyLCAgNTd9LCAgICAvKiAgMjogIHRhbiAqLworICAgIHsgNjQsIDEzMiwgICAwfSwgICAgLyogIDM6ICBtZWRpdW0gZ3JlZW4gKi8KKyAgICB7MTg5LCAxMTcsICAgMX0sICAgIC8qICA0OiAgZ29sZCAqLworICAgIHsyNTMsIDI0OSwgICAxfSwgICAgLyogIDU6ICB5ZWxsb3cgKi8KKyAgICB7ICAwLCAgIDAsIDI1NX0sICAgIC8qICA2OiAgYmx1ZSAqLworICAgIHsgIDAsICAgMCwgMTIwfSwgICAgLyogIDc6ICBtZWRpdW0gYmx1ZSAqLworICAgIHsyNTUsICAgMCwgMjU1fSwgICAgLyogIDg6ICBtYWdlbnRhICovCisgICAgeyA2NCwgICAwLCAgNjR9LCAgICAvKiAgOTogIGRhcmsgbWFnZW50YSAqLworICAgIHsyNTUsICAgMCwgICAwfSwgICAgLyogMTA6ICByZWQgKi8KKyAgICB7IDY0LCAgIDAsICAgMH0sICAgIC8qIDExOiAgZGFyayByZWQgKi8KKyAgICB7MjU1LCAxMjcsICAgMH0sICAgIC8qIDEyOiAgb3JhbmdlICovCisgICAgezE5MiwgIDk2LCAgIDB9LCAgICAvKiAxMzogIGRhcmtlciBvcmFuZ2UgKi8KKyAgICB7IDI0LCAgNjAsICAgMH0sICAgIC8qIDE0OiAgZGFyayBncmVlbi15ZWxsb3cgKi8KKyAgICB7IDg1LCAxMjUsIDIwMH0gICAgIC8qIDE1OiAgaWNlIGJsdWUgKi8KK307CisvKiBub3QgdXNlZCBmb3Igbm93LCBidXQgc2hvdWxkIGJlIGZvciBlcnJvci1jaGVja2luZzoKK3N0YXRpYyBpbnQgbnVtX3JnYiA9IHNpemVvZihyZ2IpIC8gc2l6ZW9mKHN0cnVjdCByZ2JfY29sb3IpOworICovCisKKy8qCisgICAgVGhpcyB3aG9sZSBzdHJ1Y3QgaXMgYSBmYWlybHkgY2hlZXN5IHdheSB0byBrZWVwIHRoZSBudW1iZXIgb2YKKyAgICBjb21tYW5kLWxpbmUgb3B0aW9ucyB0byBhIG1pbmltdW0uICBUaGUgcmFkaWFsLXdhdmVzIGJhY2tncm91bmQKKyAgICB0eXBlIGlzIGEgcGFydGljdWxhcmx5IHBvb3IgZml0IHRvIHRoZSBpbnRlZ2VyIGVsZW1lbnRzIG9mIHRoZQorICAgIHN0cnVjdC4uLmJ1dCBhIGZldyBtYWNyb3MgYW5kIGEgbGl0dGxlIGZpeGVkLXBvaW50IG1hdGggd2lsbCBkbworICAgIHdvbmRlcnMgZm9yIHlhLgorCisgICAgdHlwZSBiaXRzOgorICAgICAgIEYgRSBEIEMgQiBBIDkgOCA3IDYgNSA0IDMgMiAxIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwgfCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCArLSstKy0tIDAgPSBzaGFycC1lZGdlZCBjaGVja2VyYm9hcmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8ICAgICAgICAgMSA9IHNvZnQgZGlhbW9uZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8ICAgICAgICAgMiA9IHJhZGlhbCB3YXZlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgICAgICAgMy03ID0gdW5kZWZpbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKy0tIGdyYWRpZW50ICMyIGludmVydGVkPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0gYWx0ZXJuYXRpbmcgY29sdW1ucyBpbnZlcnRlZD8KKyAqLworc3RhdGljIHN0cnVjdCBiYWNrZ3JvdW5kX3BhdHRlcm4geworICAgIHVzaCB0eXBlOworICAgIGludCByZ2IxX21heCwgcmdiMV9taW47ICAgICAvKiBvciBiZ19mcmVxLCBiZ19ncmF5ICovCisgICAgaW50IHJnYjJfbWF4LCByZ2IyX21pbjsgICAgIC8qIG9yIGJnX2JzYXQsIGJnX2Jyb3QgKGJvdGggc2NhbGVkIGJ5IDEwKSovCit9IGJnW10gPSB7CisgICAgezArOCwgICAyLDAsICAxLDE1fSwgICAgICAgIC8qIGNoZWNrZXJlZDogIHRhbi9ibGFjayB2cy4gd2hpdGUvaWNlIGJsdWUgKi8KKyAgICB7MCsyNCwgIDIsMCwgIDEsMH0sICAgICAgICAgLyogY2hlY2tlcmVkOiAgdGFuL2JsYWNrIHZzLiB3aGl0ZS9ibGFjayAqLworICAgIHswKzgsICAgNCw1LCAgMCwyfSwgICAgICAgICAvKiBjaGVja2VyZWQ6ICBnb2xkL3llbGxvdyB2cy4gYmxhY2svdGFuICovCisgICAgezArOCwgICA0LDUsICAwLDZ9LCAgICAgICAgIC8qIGNoZWNrZXJlZDogIGdvbGQveWVsbG93IHZzLiBibGFjay9ibHVlICovCisgICAgezAsICAgICA3LDAsICA4LDl9LCAgICAgICAgIC8qIGNoZWNrZXJlZDogIGRlZXAgYmx1ZS9ibGFjayB2cy4gbWFnZW50YSAqLworICAgIHswKzgsICAxMywwLCAgNSwxNH0sICAgICAgICAvKiBjaGVja2VyZWQ6ICBvcmFuZ2UvYmxhY2sgdnMuIHllbGxvdyAqLworICAgIHswKzgsICAxMiwwLCAxMCwxMX0sICAgICAgICAvKiBjaGVja2VyZWQ6ICBvcmFuZ2UvYmxhY2sgdnMuIHJlZCAqLworICAgIHsxLCAgICAgNywwLCAgOCwwfSwgICAgICAgICAvKiBkaWFtb25kczogIGRlZXAgYmx1ZS9ibGFjayB2cy4gbWFnZW50YSAqLworICAgIHsxLCAgICAxMiwwLCAxMSwwfSwgICAgICAgICAvKiBkaWFtb25kczogIG9yYW5nZSB2cy4gZGFyayByZWQgKi8KKyAgICB7MSwgICAgMTAsMCwgIDcsMH0sICAgICAgICAgLyogZGlhbW9uZHM6ICByZWQgdnMuIG1lZGl1bSBibHVlICovCisgICAgezEsICAgICA0LDAsICA1LDB9LCAgICAgICAgIC8qIGRpYW1vbmRzOiAgZ29sZCB2cy4geWVsbG93ICovCisgICAgezEsICAgICAzLDAsICAwLDB9LCAgICAgICAgIC8qIGRpYW1vbmRzOiAgbWVkaXVtIGdyZWVuIHZzLiBibGFjayAqLworICAgIHsyLCAgICAxNiwgMTAwLCAgMjAsICAgMH0sICAvKiByYWRpYWw6ICB+aGFyZCByYWRpYWwgY29sb3ItYmVhbXMgKi8KKyAgICB7MiwgICAgMTgsIDEwMCwgIDEwLCAgIDJ9LCAgLyogcmFkaWFsOiAgc29mdCwgY3VydmVkIHJhZGlhbCBjb2xvci1iZWFtcyAqLworICAgIHsyLCAgICAxNiwgMjU2LCAxMDAsIDI1MH0sICAvKiByYWRpYWw6ICB2ZXJ5IHRpZ2h0IHNwaXJhbCAqLworICAgIHsyLCAxMDAwMCwgMjU2LCAgMTEsICAgMH0gICAvKiByYWRpYWw6ICBkaXBvbGUtbW9pcmUnIChhbG1vc3QgZnJhY3RhbCkgKi8KK307CitzdGF0aWMgaW50IG51bV9iZ3BhdCA9IHNpemVvZihiZykgLyBzaXplb2Yoc3RydWN0IGJhY2tncm91bmRfcGF0dGVybik7CisKKworLyogV2luZG93cy1zcGVjaWZpYyBnbG9iYWwgdmFyaWFibGVzIChjb3VsZCBnbyBpbiBzdHJ1Y3QsIGJ1dCBtZXNzeS4uLikgKi8KK3N0YXRpYyB1bGcgd2ltYWdlX3Jvd2J5dGVzOworc3RhdGljIHVjaCAqZGliOworc3RhdGljIHVjaCAqd2ltYWdlX2RhdGE7CitzdGF0aWMgQklUTUFQSU5GT0hFQURFUiAqYm1paDsKKworc3RhdGljIEhXTkQgZ2xvYmFsX2h3bmQ7CitzdGF0aWMgSElOU1RBTkNFIGdsb2JhbF9oSW5zdDsKK3N0YXRpYyBpbnQgZ2xvYmFsX3Nob3dtb2RlOworCisKKworCitpbnQgV0lOQVBJIFdpbk1haW4oSElOU1RBTkNFIGhJbnN0LCBISU5TVEFOQ0UgaFByZXZJbnN0LCBQU1RSIGNtZCwgaW50IHNob3dtb2RlKQoreworICAgIGNoYXIgKmFyZ3NbMTAyNF07ICAgICAgICAgICAgICAgICAvKiBhcmJpdHJhcnkgbGltaXQsIGJ1dCBzaG91bGQgc3VmZmljZSAqLworICAgIGNoYXIgKiphcmd2ID0gYXJnczsKKyAgICBjaGFyICpwLCAqcSwgKmJnc3RyID0gTlVMTDsKKyAgICBpbnQgYXJnYyA9IDA7CisgICAgaW50IHJjLCBhbGVuLCBmbGVuOworICAgIGludCBlcnJvciA9IDA7CisgICAgaW50IHRpbWluZyA9IEZBTFNFOworICAgIGludCBoYXZlX2JnID0gRkFMU0U7CisgICAgZG91YmxlIExVVF9leHBvbmVudDsgICAgICAgICAgICAgIC8qIGp1c3QgdGhlIGxvb2t1cCB0YWJsZSAqLworICAgIGRvdWJsZSBDUlRfZXhwb25lbnQgPSAyLjI7ICAgICAgICAvKiBqdXN0IHRoZSBtb25pdG9yICovCisgICAgZG91YmxlIGRlZmF1bHRfZGlzcGxheV9leHBvbmVudDsgIC8qIHdob2xlIGRpc3BsYXkgc3lzdGVtICovCisgICAgTVNHIG1zZzsKKworCisgICAgLyogRmlyc3QgaW5pdGlhbGl6ZSBhIGZldyB0aGluZ3MsIGp1c3QgdG8gYmUgc3VyZS0tbWVtc2V0IHRha2VzIGNhcmUgb2YKKyAgICAgKiBkZWZhdWx0IGJhY2tncm91bmQgY29sb3IgKGJsYWNrKSwgYm9vbGVhbnMgKEZBTFNFKSwgcG9pbnRlcnMgKE5VTEwpLAorICAgICAqIGV0Yy4gKi8KKworICAgIGdsb2JhbF9oSW5zdCA9IGhJbnN0OworICAgIGdsb2JhbF9zaG93bW9kZSA9IHNob3dtb2RlOworICAgIGZpbGVuYW1lID0gKGNoYXIgKilOVUxMOworICAgIG1lbXNldCgmcnBuZzJfaW5mbywgMCwgc2l6ZW9mKG1haW5wcm9nX2luZm8pKTsKKworI2lmbmRlZiBfX0NZR1dJTl9fCisgICAgLyogTmV4dCByZWVuYWJsZSBjb25zb2xlIG91dHB1dCwgd2hpY2ggbm9ybWFsbHkgZ29lcyB0byB0aGUgYml0IGJ1Y2tldAorICAgICAqIGZvciB3aW5kb3dlZCBhcHBzLiAgQ2xvc2luZyB0aGUgY29uc29sZSB3aW5kb3cgd2lsbCB0ZXJtaW5hdGUgdGhlCisgICAgICogYXBwLiAgVGhhbmtzIHRvIERhdmlkLkdlbGRyZWljaEByZWFsdml6LmNvbSBmb3Igc3VwcGx5aW5nIHRoZSBtYWdpY2FsCisgICAgICogaW5jYW50YXRpb24uICovCisKKyAgICBBbGxvY0NvbnNvbGUoKTsKKyAgICBmcmVvcGVuKCJDT05PVVQkIiwgImEiLCBzdGRlcnIpOworICAgIGZyZW9wZW4oIkNPTk9VVCQiLCAiYSIsIHN0ZG91dCk7CisjZW5kaWYKKworICAgIC8qIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3Igb3VyIGRpc3BsYXktc3lzdGVtIGV4cG9uZW50LCBpLmUuLCB0aGUKKyAgICAgKiBwcm9kdWN0IG9mIHRoZSBDUlQgZXhwb25lbnQgYW5kIHRoZSBleHBvbmVudCBjb3JyZXNwb25kaW5nIHRvCisgICAgICogdGhlIGZyYW1lLWJ1ZmZlcidzIGxvb2t1cCB0YWJsZSAoTFVUKSwgaWYgYW55LiAgVGhpcyBpcyBub3QgYW4KKyAgICAgKiBleGhhdXN0aXZlIGxpc3Qgb2YgTFVUIHZhbHVlcyAoZS5nLiwgT3BlblN0ZXAgaGFzIGEgbG90IG9mIHdlaXJkCisgICAgICogb25lcyksIGJ1dCBpdCBzaG91bGQgY292ZXIgOTklIG9mIHRoZSBjdXJyZW50IHBvc3NpYmlsaXRpZXMuICBBbmQKKyAgICAgKiB5ZXMsIHRoZXNlIGlmZGVmcyBhcmUgY29tcGxldGVseSB3YXN0ZWQgaW4gYSBXaW5kb3dzIHByb2dyYW0uLi4gKi8KKworI2lmIGRlZmluZWQoTmVYVCkKKyAgICAvKiB0aGlyZC1wYXJ0eSB1dGlsaXRpZXMgY2FuIG1vZGlmeSB0aGUgZGVmYXVsdCBMVVQgZXhwb25lbnQgKi8KKyAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyAyLjI7CisgICAgLyoKKyAgICBpZiAoc29tZV9uZXh0X2Z1bmN0aW9uX3RoYXRfcmV0dXJuc19nYW1tYSgmbmV4dF9nYW1tYSkpCisgICAgICAgIExVVF9leHBvbmVudCA9IDEuMCAvIG5leHRfZ2FtbWE7CisgICAgICovCisjZWxpZiBkZWZpbmVkKHNnaSkKKyAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyAxLjc7CisgICAgLyogdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGFueSBkb2N1bWVudGVkIGZ1bmN0aW9uIHRvCisgICAgICogZ2V0IHRoZSAiZ2FtbWEiIHZhbHVlLCBzbyB3ZSBkbyBpdCB0aGUgaGFyZCB3YXkgKi8KKyAgICBpbmZpbGUgPSBmb3BlbigiL2V0Yy9jb25maWcvc3lzdGVtLmdsR2FtbWFWYWwiLCAiciIpOworICAgIGlmIChpbmZpbGUpIHsKKyAgICAgICAgZG91YmxlIHNnaV9nYW1tYTsKKworICAgICAgICBmZ2V0cyh0bXBsaW5lLCA4MCwgaW5maWxlKTsKKyAgICAgICAgZmNsb3NlKGluZmlsZSk7CisgICAgICAgIHNnaV9nYW1tYSA9IGF0b2YodG1wbGluZSk7CisgICAgICAgIGlmIChzZ2lfZ2FtbWEgPiAwLjApCisgICAgICAgICAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyBzZ2lfZ2FtbWE7CisgICAgfQorI2VsaWYgZGVmaW5lZChNYWNpbnRvc2gpCisgICAgTFVUX2V4cG9uZW50ID0gMS44IC8gMi42MTsKKyAgICAvKgorICAgIGlmIChzb21lX21hY19mdW5jdGlvbl90aGF0X3JldHVybnNfZ2FtbWEoJm1hY19nYW1tYSkpCisgICAgICAgIExVVF9leHBvbmVudCA9IG1hY19nYW1tYSAvIDIuNjE7CisgICAgICovCisjZWxzZQorICAgIExVVF9leHBvbmVudCA9IDEuMDsgICAvKiBhc3N1bWUgbm8gTFVUOiAgbW9zdCBQQ3MgKi8KKyNlbmRpZgorCisgICAgLyogdGhlIGRlZmF1bHRzIGFib3ZlIGdpdmUgMS4wLCAxLjMsIDEuNSBhbmQgMi4yLCByZXNwZWN0aXZlbHk6ICovCisgICAgZGVmYXVsdF9kaXNwbGF5X2V4cG9uZW50ID0gTFVUX2V4cG9uZW50ICogQ1JUX2V4cG9uZW50OworCisKKyAgICAvKiBJZiB0aGUgdXNlciBoYXMgc2V0IHRoZSBTQ1JFRU5fR0FNTUEgZW52aXJvbm1lbnQgdmFyaWFibGUgYXMgc3VnZ2VzdGVkCisgICAgICogKHNvbWV3aGF0IGltcHJlY2lzZWx5KSBpbiB0aGUgbGlicG5nIGRvY3VtZW50YXRpb24sIHVzZSB0aGF0OyBvdGhlcndpc2UKKyAgICAgKiB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgd2UganVzdCBjYWxjdWxhdGVkLiAgRWl0aGVyIHdheSwgdGhlIHVzZXIgbWF5CisgICAgICogb3ZlcnJpZGUgdGhpcyB2aWEgYSBjb21tYW5kLWxpbmUgb3B0aW9uLiAqLworCisgICAgaWYgKChwID0gZ2V0ZW52KCJTQ1JFRU5fR0FNTUEiKSkgIT0gTlVMTCkKKyAgICAgICAgcnBuZzJfaW5mby5kaXNwbGF5X2V4cG9uZW50ID0gYXRvZihwKTsKKyAgICBlbHNlCisgICAgICAgIHJwbmcyX2luZm8uZGlzcGxheV9leHBvbmVudCA9IGRlZmF1bHRfZGlzcGxheV9leHBvbmVudDsKKworCisgICAgLyogV2luZG93cyByZWFsbHkgaGF0ZXMgY29tbWFuZCBsaW5lcywgc28gd2UgaGF2ZSB0byBzZXQgdXAgb3VyIG93biBhcmd2LgorICAgICAqIE5vdGUgdGhhdCB3ZSBkbyBOT1QgYm90aGVyIHdpdGggcXVvdGVkIGFyZ3VtZW50cyBoZXJlLCBzbyBkb24ndCB1c2UKKyAgICAgKiBmaWxlbmFtZXMgd2l0aCBzcGFjZXMgaW4gJ2VtISAqLworCisgICAgYXJndlthcmdjKytdID0gUFJPR05BTUU7CisgICAgcCA9IGNtZDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmICgqcCA9PSAnICcpCisgICAgICAgICAgICB3aGlsZSAoKisrcCA9PSAnICcpCisgICAgICAgICAgICAgICAgOworICAgICAgICAvKiBub3cgcCBwb2ludHMgYXQgdGhlIGZpcnN0IG5vbi1zcGFjZSBhZnRlciBzb21lIHNwYWNlcyAqLworICAgICAgICBpZiAoKnAgPT0gJ1wwJykKKyAgICAgICAgICAgIGJyZWFrOyAgICAvKiBub3RoaW5nIGFmdGVyIHRoZSBzcGFjZXM6ICBkb25lICovCisgICAgICAgIGFyZ3ZbYXJnYysrXSA9IHEgPSBwOworICAgICAgICB3aGlsZSAoKnEgJiYgKnEgIT0gJyAnKQorICAgICAgICAgICAgKytxOworICAgICAgICAvKiBub3cgcSBwb2ludHMgYXQgYSBzcGFjZSBvciB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgKi8KKyAgICAgICAgaWYgKCpxID09ICdcMCcpCisgICAgICAgICAgICBicmVhazsgICAgLyogbGFzdCBhcmd2IGFscmVhZHkgdGVybWluYXRlZDsgcXVpdCAqLworICAgICAgICAqcSA9ICdcMCc7ICAgIC8qIGNoYW5nZSBzcGFjZSB0byB0ZXJtaW5hdG9yICovCisgICAgICAgIHAgPSBxICsgMTsKKyAgICB9CisgICAgYXJndlthcmdjXSA9IE5VTEw7ICAgLyogdGVybWluYXRlIHRoZSBhcmd2IGFycmF5IGl0c2VsZiAqLworCisKKyAgICAvKiBOb3cgcGFyc2UgdGhlIGNvbW1hbmQgbGluZSBmb3Igb3B0aW9ucyBhbmQgdGhlIFBORyBmaWxlbmFtZS4gKi8KKworICAgIHdoaWxlICgqKythcmd2ICYmICFlcnJvcikgeworICAgICAgICBpZiAoIXN0cm5jbXAoKmFyZ3YsICItZ2FtbWEiLCAyKSkgeworICAgICAgICAgICAgaWYgKCEqKythcmd2KQorICAgICAgICAgICAgICAgICsrZXJyb3I7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBycG5nMl9pbmZvLmRpc3BsYXlfZXhwb25lbnQgPSBhdG9mKCphcmd2KTsKKyAgICAgICAgICAgICAgICBpZiAocnBuZzJfaW5mby5kaXNwbGF5X2V4cG9uZW50IDw9IDAuMCkKKyAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1iZ2NvbG9yIiwgNCkpIHsKKyAgICAgICAgICAgIGlmICghKisrYXJndikKKyAgICAgICAgICAgICAgICArK2Vycm9yOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYmdzdHIgPSAqYXJndjsKKyAgICAgICAgICAgICAgICBpZiAoc3RybGVuKGJnc3RyKSAhPSA3IHx8IGJnc3RyWzBdICE9ICcjJykKKyAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaGF2ZV9iZyA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGJnX2ltYWdlID0gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKCphcmd2LCAiLWJncGF0IiwgNCkpIHsKKyAgICAgICAgICAgIGlmICghKisrYXJndikKKyAgICAgICAgICAgICAgICArK2Vycm9yOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcGF0ID0gYXRvaSgqYXJndikgLSAxOworICAgICAgICAgICAgICAgIGlmIChwYXQgPCAwIHx8IHBhdCA+PSBudW1fYmdwYXQpCisgICAgICAgICAgICAgICAgICAgICsrZXJyb3I7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJnX2ltYWdlID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgaGF2ZV9iZyA9IEZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi10aW1pbmciLCAyKSkgeworICAgICAgICAgICAgdGltaW5nID0gVFJVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgqKmFyZ3YgIT0gJy0nKSB7CisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSAqYXJndjsKKyAgICAgICAgICAgICAgICBpZiAoYXJndlsxXSkgICAvKiBzaG91bGRuJ3QgYmUgYW55IG1vcmUgYXJncyBhZnRlciBmaWxlbmFtZSAqLworICAgICAgICAgICAgICAgICAgICArK2Vycm9yOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgKytlcnJvcjsgICAvKiBub3QgZXhwZWN0aW5nIGFueSBvdGhlciBvcHRpb25zICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWZpbGVuYW1lKQorICAgICAgICArK2Vycm9yOworCisKKyAgICAvKiBwcmludCB1c2FnZSBzY3JlZW4gaWYgYW55IGVycm9ycyB1cCB0byB0aGlzIHBvaW50ICovCisKKyAgICBpZiAoZXJyb3IpIHsKKyNpZm5kZWYgX19DWUdXSU5fXworICAgICAgICBpbnQgY2g7CisjZW5kaWYKKworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuJXMgJXM6ICAlc1xuXG4iLCBQUk9HTkFNRSwgVkVSU0lPTiwgYXBwbmFtZSk7CisgICAgICAgIHJlYWRwbmcyX3ZlcnNpb25faW5mbygpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIgorICAgICAgICAgICJVc2FnZTogICVzIFstZ2FtbWEgZXhwXSBbLWJnY29sb3IgYmcgfCAtYmdwYXQgcGF0XSBbLXRpbWluZ11cbiIKKyAgICAgICAgICAiICAgICAgICAlKnMgZmlsZS5wbmdcblxuIgorICAgICAgICAgICIgICAgZXhwIFx0dHJhbnNmZXItZnVuY3Rpb24gZXhwb25lbnQgKGBgZ2FtbWEnJykgb2YgdGhlIGRpc3BsYXlcbiIKKyAgICAgICAgICAiXHRcdCAgc3lzdGVtIGluIGZsb2F0aW5nLXBvaW50IGZvcm1hdCAoZS5nLiwgYGAlLjFmJycpOyBlcXVhbFxuIgorICAgICAgICAgICJcdFx0ICB0byB0aGUgcHJvZHVjdCBvZiB0aGUgbG9va3VwLXRhYmxlIGV4cG9uZW50ICh2YXJpZXMpXG4iCisgICAgICAgICAgIlx0XHQgIGFuZCB0aGUgQ1JUIGV4cG9uZW50ICh1c3VhbGx5IDIuMik7IG11c3QgYmUgcG9zaXRpdmVcbiIKKyAgICAgICAgICAiICAgIGJnICBcdGRlc2lyZWQgYmFja2dyb3VuZCBjb2xvciBpbiA3LWNoYXJhY3RlciBoZXggUkdCIGZvcm1hdFxuIgorICAgICAgICAgICJcdFx0ICAoZS5nLiwgYGAjZmY3NzAwJycgZm9yIG9yYW5nZTogIHNhbWUgYXMgSFRNTCBjb2xvcnMpO1xuIgorICAgICAgICAgICJcdFx0ICB1c2VkIHdpdGggdHJhbnNwYXJlbnQgaW1hZ2VzOyBvdmVycmlkZXMgLWJncGF0IG9wdGlvblxuIgorICAgICAgICAgICIgICAgcGF0IFx0ZGVzaXJlZCBiYWNrZ3JvdW5kIHBhdHRlcm4gbnVtYmVyICgxLSVkKTsgdXNlZCB3aXRoXG4iCisgICAgICAgICAgIlx0XHQgIHRyYW5zcGFyZW50IGltYWdlczsgb3ZlcnJpZGVzIC1iZ2NvbG9yIG9wdGlvblxuIgorICAgICAgICAgICIgICAgLXRpbWluZ1x0ZW5hYmxlcyBkZWxheSBmb3IgZXZlcnkgYmxvY2sgcmVhZCwgdG8gc2ltdWxhdGUgbW9kZW1cbiIKKyAgICAgICAgICAiXHRcdCAgZG93bmxvYWQgb2YgaW1hZ2UgKH4zNiBLYnBzKVxuIgorICAgICAgICAgICJcblByZXNzIFEsIEVzYyBvciBtb3VzZSBidXR0b24gMSBhZnRlciBpbWFnZSBpcyBkaXNwbGF5ZWQgdG8gcXVpdC5cbiIKKyNpZm5kZWYgX19DWUdXSU5fXworICAgICAgICAgICJQcmVzcyBRIG9yIEVzYyB0byBxdWl0IHRoaXMgdXNhZ2Ugc2NyZWVuLiAiLAorI2Vsc2UKKyAgICAgICAgICAsCisjZW5kaWYKKyAgICAgICAgICBQUk9HTkFNRSwKKyNpZiAoZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfTV9JWDg2KSB8fCBkZWZpbmVkKF9feDg2XzY0X18pKSAmJiBcCisgICAgIShkZWZpbmVkKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQoX19NSU5HVzMyX18pKQorICAgICAgICAgIChpbnQpc3RybGVuKFBST0dOQU1FKSwgIiAiLAorI2VuZGlmCisgICAgICAgICAgKGludClzdHJsZW4oUFJPR05BTUUpLCAiICIsIGRlZmF1bHRfZGlzcGxheV9leHBvbmVudCwgbnVtX2JncGF0KTsKKyAgICAgICAgZmZsdXNoKHN0ZGVycik7CisjaWZuZGVmIF9fQ1lHV0lOX18KKyAgICAgICAgZG8KKyAgICAgICAgICAgIGNoID0gX2dldGNoKCk7CisgICAgICAgIHdoaWxlIChjaCAhPSAncScgJiYgY2ggIT0gJ1EnICYmIGNoICE9IDB4MUIpOworI2VuZGlmCisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisKKyAgICBpZiAoIShpbmZpbGUgPSBmb3BlbihmaWxlbmFtZSwgInJiIikpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgY2FuJ3Qgb3BlbiBQTkcgZmlsZSBbJXNdXG4iLCBmaWxlbmFtZSk7CisgICAgICAgICsrZXJyb3I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5jb3VudCA9IGZyZWFkKGluYnVmLCAxLCBJTkJVRlNJWkUsIGluZmlsZSk7CisgICAgICAgIGlmIChpbmNvdW50IDwgOCB8fCAhcmVhZHBuZzJfY2hlY2tfc2lnKGluYnVmLCA4KSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCisgICAgICAgICAgICAgICI6ICBbJXNdIGlzIG5vdCBhIFBORyBmaWxlOiBpbmNvcnJlY3Qgc2lnbmF0dXJlXG4iLAorICAgICAgICAgICAgICBmaWxlbmFtZSk7CisgICAgICAgICAgICArK2Vycm9yOworICAgICAgICB9IGVsc2UgaWYgKChyYyA9IHJlYWRwbmcyX2luaXQoJnJwbmcyX2luZm8pKSAhPSAwKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHJjKSB7CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKKyAgICAgICAgICAgICAgICAgICAgICAiOiAgWyVzXSBoYXMgYmFkIElIRFIgKGxpYnBuZyBsb25nam1wKVxuIiwgZmlsZW5hbWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgaW5zdWZmaWNpZW50IG1lbW9yeVxuIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQorICAgICAgICAgICAgICAgICAgICAgICI6ICB1bmtub3duIHJlYWRwbmcyX2luaXQoKSBlcnJvclxuIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyb3IpCisgICAgICAgICAgICBmY2xvc2UoaW5maWxlKTsKKyAgICB9CisKKworICAgIGlmIChlcnJvcikgeworI2lmbmRlZiBfX0NZR1dJTl9fCisgICAgICAgIGludCBjaDsKKyNlbmRpZgorCisgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgYWJvcnRpbmcuXG4iKTsKKyNpZm5kZWYgX19DWUdXSU5fXworICAgICAgICBkbworICAgICAgICAgICAgY2ggPSBfZ2V0Y2goKTsKKyAgICAgICAgd2hpbGUgKGNoICE9ICdxJyAmJiBjaCAhPSAnUScgJiYgY2ggIT0gMHgxQik7CisjZW5kaWYKKyAgICAgICAgZXhpdCgyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuJXMgJXM6ICAlc1xuIiwgUFJPR05BTUUsIFZFUlNJT04sIGFwcG5hbWUpOworI2lmbmRlZiBfX0NZR1dJTl9fCisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICJcbiAgIFtjb25zb2xlIHdpbmRvdzogIGNsb3NpbmcgdGhpcyB3aW5kb3cgd2lsbCB0ZXJtaW5hdGUgJXNdXG5cbiIsCisgICAgICAgICAgUFJPR05BTUUpOworI2VuZGlmCisgICAgICAgIGZmbHVzaChzdGRlcnIpOworICAgIH0KKworCisgICAgLyogc2V0IHRoZSB0aXRsZS1iYXIgc3RyaW5nLCBidXQgbWFrZSBzdXJlIGJ1ZmZlciBkb2Vzbid0IG92ZXJmbG93ICovCisKKyAgICBhbGVuID0gc3RybGVuKGFwcG5hbWUpOworICAgIGZsZW4gPSBzdHJsZW4oZmlsZW5hbWUpOworICAgIGlmIChhbGVuICsgZmxlbiArIDMgPiAxMDIzKQorICAgICAgICBzcHJpbnRmKHRpdGxlYmFyLCAiJXM6ICAuLi4lcyIsIGFwcG5hbWUsIGZpbGVuYW1lKyhhbGVuK2ZsZW4rNi0xMDIzKSk7CisgICAgZWxzZQorICAgICAgICBzcHJpbnRmKHRpdGxlYmFyLCAiJXM6ICAlcyIsIGFwcG5hbWUsIGZpbGVuYW1lKTsKKworCisgICAgLyogc2V0IHNvbWUgZmluYWwgcnBuZzJfaW5mbyB2YXJpYWJsZXMgYmVmb3JlIGVudGVyaW5nIG1haW4gZGF0YSBsb29wICovCisKKyAgICBpZiAoaGF2ZV9iZykgeworICAgICAgICB1bnNpZ25lZCByLCBnLCBiOyAgIC8qIHRoaXMgYXBwcm9hY2ggcXVpZXRzIGNvbXBpbGVyIHdhcm5pbmdzICovCisKKyAgICAgICAgc3NjYW5mKGJnc3RyKzEsICIlMnglMnglMngiLCAmciwgJmcsICZiKTsKKyAgICAgICAgcnBuZzJfaW5mby5iZ19yZWQgICA9ICh1Y2gpcjsKKyAgICAgICAgcnBuZzJfaW5mby5iZ19ncmVlbiA9ICh1Y2gpZzsKKyAgICAgICAgcnBuZzJfaW5mby5iZ19ibHVlICA9ICh1Y2gpYjsKKyAgICB9IGVsc2UKKyAgICAgICAgcnBuZzJfaW5mby5uZWVkX2JnY29sb3IgPSBUUlVFOworCisgICAgcnBuZzJfaW5mby5zdGF0ZSA9IGtQcmVJbml0OworICAgIHJwbmcyX2luZm8ubWFpbnByb2dfaW5pdCA9IHJwbmcyX3dpbl9pbml0OworICAgIHJwbmcyX2luZm8ubWFpbnByb2dfZGlzcGxheV9yb3cgPSBycG5nMl93aW5fZGlzcGxheV9yb3c7CisgICAgcnBuZzJfaW5mby5tYWlucHJvZ19maW5pc2hfZGlzcGxheSA9IHJwbmcyX3dpbl9maW5pc2hfZGlzcGxheTsKKworCisgICAgLyogT0ssIHRoaXMgaXMgdGhlIGZ1biBwYXJ0OiAgY2FsbCByZWFkcG5nMl9kZWNvZGVfZGF0YSgpIGF0IHRoZSBzdGFydCBvZgorICAgICAqIHRoZSBsb29wIHRvIGRlYWwgd2l0aCBvdXIgZmlyc3QgYnVmZmVyIG9mIGRhdGEgKHJlYWQgaW4gYWJvdmUgdG8gdmVyaWZ5CisgICAgICogdGhhdCB0aGUgZmlsZSBpcyBhIFBORyBpbWFnZSksIHRoZW4gbG9vcCB0aHJvdWdoIHRoZSBmaWxlIGFuZCBjb250aW51ZQorICAgICAqIGNhbGxpbmcgdGhlIHNhbWUgcm91dGluZSB0byBoYW5kbGUgZWFjaCBjaHVuayBvZiBkYXRhLiAgSXQgaW4gdHVybgorICAgICAqIHBhc3NlcyB0aGUgZGF0YSB0byBsaWJwbmcsIHdoaWNoIHdpbGwgaW52b2tlIG9uZSBvciBtb3JlIG9mIG91ciBjYWxsLQorICAgICAqIGJhY2tzIGFzIGRlY29kZWQgZGF0YSBiZWNvbWUgYXZhaWxhYmxlLiAgV2Ugb3B0aW9uYWxseSBjYWxsIFNsZWVwKCkgZm9yCisgICAgICogb25lIHNlY29uZCBwZXIgaXRlcmF0aW9uIHRvIHNpbXVsYXRlIGRvd25sb2FkaW5nIHRoZSBpbWFnZSB2aWEgYW4gYW5hbG9nCisgICAgICogbW9kZW0uICovCisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIFRyYWNlKChzdGRlcnIsICJhYm91dCB0byBjYWxsIHJlYWRwbmcyX2RlY29kZV9kYXRhKClcbiIpKQorICAgICAgICBpZiAocmVhZHBuZzJfZGVjb2RlX2RhdGEoJnJwbmcyX2luZm8sIGluYnVmLCBpbmNvdW50KSkKKyAgICAgICAgICAgICsrZXJyb3I7CisgICAgICAgIFRyYWNlKChzdGRlcnIsICJkb25lIHdpdGggcmVhZHBuZzJfZGVjb2RlX2RhdGEoKVxuIikpCisKKyAgICAgICAgaWYgKGVycm9yIHx8IGluY291bnQgIT0gSU5CVUZTSVpFIHx8IHJwbmcyX2luZm8uc3RhdGUgPT0ga0RvbmUpIHsKKyAgICAgICAgICAgIGlmIChycG5nMl9pbmZvLnN0YXRlID09IGtEb25lKSB7CisgICAgICAgICAgICAgICAgVHJhY2UoKHN0ZGVyciwgImRvbmUgZGVjb2RpbmcgUE5HIGltYWdlXG4iKSkKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmVycm9yKGluZmlsZSkpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKKyAgICAgICAgICAgICAgICAgICI6ICBlcnJvciB3aGlsZSByZWFkaW5nIFBORyBpbWFnZSBmaWxlXG4iKTsKKyAgICAgICAgICAgICAgICBleGl0KDMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChmZW9mKGluZmlsZSkpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGVuZCBvZiBmaWxlIHJlYWNoZWQgIgorICAgICAgICAgICAgICAgICAgIih1bmV4cGVjdGVkbHkpIHdoaWxlIHJlYWRpbmcgUE5HIGltYWdlIGZpbGVcbiIpOworICAgICAgICAgICAgICAgIGV4aXQoMyk7CisgICAgICAgICAgICB9IGVsc2UgLyogaWYgKGVycm9yKSAqLyB7CisgICAgICAgICAgICAgICAgLyogd2lsbCBwcmludCBlcnJvciBtZXNzYWdlIGJlbG93ICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aW1pbmcpCisgICAgICAgICAgICBTbGVlcCgxMDAwTCk7CisKKyAgICAgICAgaW5jb3VudCA9IGZyZWFkKGluYnVmLCAxLCBJTkJVRlNJWkUsIGluZmlsZSk7CisgICAgfQorCisKKyAgICAvKiBjbGVhbiB1cCBQTkcgc3R1ZmYgYW5kIHJlcG9ydCBhbnkgZGVjb2RpbmcgZXJyb3JzICovCisKKyAgICBmY2xvc2UoaW5maWxlKTsKKyAgICBUcmFjZSgoc3RkZXJyLCAiYWJvdXQgdG8gY2FsbCByZWFkcG5nMl9jbGVhbnVwKClcbiIpKQorICAgIHJlYWRwbmcyX2NsZWFudXAoJnJwbmcyX2luZm8pOworCisgICAgaWYgKGVycm9yKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgbGlicG5nIGVycm9yIHdoaWxlIGRlY29kaW5nIFBORyBpbWFnZVxuIik7CisgICAgICAgIGV4aXQoMyk7CisgICAgfQorCisKKyAgICAvKiB3YWl0IGZvciB0aGUgdXNlciB0byB0ZWxsIHVzIHdoZW4gdG8gcXVpdCAqLworCisgICAgd2hpbGUgKEdldE1lc3NhZ2UoJm1zZywgTlVMTCwgMCwgMCkpIHsKKyAgICAgICAgVHJhbnNsYXRlTWVzc2FnZSgmbXNnKTsKKyAgICAgICAgRGlzcGF0Y2hNZXNzYWdlKCZtc2cpOworICAgIH0KKworCisgICAgLyogd2UncmUgZG9uZTogIGNsZWFuIHVwIGFsbCBpbWFnZSBhbmQgV2luZG93cyByZXNvdXJjZXMgYW5kIGdvIGF3YXkgKi8KKworICAgIFRyYWNlKChzdGRlcnIsICJhYm91dCB0byBjYWxsIHJwbmcyX3dpbl9jbGVhbnVwKClcbiIpKQorICAgIHJwbmcyX3dpbl9jbGVhbnVwKCk7CisKKyAgICByZXR1cm4gbXNnLndQYXJhbTsKK30KKworCisKKworCisvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSByZWFkcG5nMl9pbmZvX2NhbGxiYWNrKCkgaW4gcmVhZHBuZzIuYywgd2hpY2gKKyAqIGluIHR1cm4gaXMgY2FsbGVkIGJ5IGxpYnBuZyBhZnRlciBhbGwgb2YgdGhlIHByZS1JREFUIGNodW5rcyBoYXZlIGJlZW4KKyAqIHJlYWQgYW5kIHByb2Nlc3NlZC0taS5lLiwgd2Ugbm93IGhhdmUgZW5vdWdoIGluZm8gdG8gZmluaXNoIGluaXRpYWxpemluZyAqLworCitzdGF0aWMgdm9pZCBycG5nMl93aW5faW5pdCgpCit7CisgICAgdWxnIGk7CisgICAgdWxnIHJvd2J5dGVzID0gcnBuZzJfaW5mby5yb3dieXRlczsKKworICAgIFRyYWNlKChzdGRlcnIsICJiZWdpbm5pbmcgcnBuZzJfd2luX2luaXQoKVxuIikpCisgICAgVHJhY2UoKHN0ZGVyciwgIiAgcm93Ynl0ZXMgPSAlZFxuIiwgcnBuZzJfaW5mby5yb3dieXRlcykpCisgICAgVHJhY2UoKHN0ZGVyciwgIiAgd2lkdGggID0gJWxkXG4iLCBycG5nMl9pbmZvLndpZHRoKSkKKyAgICBUcmFjZSgoc3RkZXJyLCAiICBoZWlnaHQgPSAlbGRcbiIsIHJwbmcyX2luZm8uaGVpZ2h0KSkKKworICAgIHJwbmcyX2luZm8uaW1hZ2VfZGF0YSA9ICh1Y2ggKiltYWxsb2Mocm93Ynl0ZXMgKiBycG5nMl9pbmZvLmhlaWdodCk7CisgICAgaWYgKCFycG5nMl9pbmZvLmltYWdlX2RhdGEpIHsKKyAgICAgICAgcmVhZHBuZzJfY2xlYW51cCgmcnBuZzJfaW5mbyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBycG5nMl9pbmZvLnJvd19wb2ludGVycyA9ICh1Y2ggKiopbWFsbG9jKHJwbmcyX2luZm8uaGVpZ2h0ICogc2l6ZW9mKHVjaCAqKSk7CisgICAgaWYgKCFycG5nMl9pbmZvLnJvd19wb2ludGVycykgeworICAgICAgICBmcmVlKHJwbmcyX2luZm8uaW1hZ2VfZGF0YSk7CisgICAgICAgIHJwbmcyX2luZm8uaW1hZ2VfZGF0YSA9IE5VTEw7CisgICAgICAgIHJlYWRwbmcyX2NsZWFudXAoJnJwbmcyX2luZm8pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChpID0gMDsgIGkgPCBycG5nMl9pbmZvLmhlaWdodDsgICsraSkKKyAgICAgICAgcnBuZzJfaW5mby5yb3dfcG9pbnRlcnNbaV0gPSBycG5nMl9pbmZvLmltYWdlX2RhdGEgKyBpKnJvd2J5dGVzOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIERvIHRoZSBiYXNpYyBXaW5kb3dzIGluaXRpYWxpemF0aW9uIHN0dWZmLCBtYWtlIHRoZSB3aW5kb3csIGFuZCBmaWxsIGl0CisgICAgd2l0aCB0aGUgdXNlci1zcGVjaWZpZWQsIGZpbGUtc3BlY2lmaWVkIG9yIGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvci4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIGlmIChycG5nMl93aW5fY3JlYXRlX3dpbmRvdygpKSB7CisgICAgICAgIHJlYWRwbmcyX2NsZWFudXAoJnJwbmcyX2luZm8pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcnBuZzJfaW5mby5zdGF0ZSA9IGtXaW5kb3dJbml0OworfQorCisKKworCisKK3N0YXRpYyBpbnQgcnBuZzJfd2luX2NyZWF0ZV93aW5kb3coKQoreworICAgIHVjaCBiZ19yZWQgICA9IHJwbmcyX2luZm8uYmdfcmVkOworICAgIHVjaCBiZ19ncmVlbiA9IHJwbmcyX2luZm8uYmdfZ3JlZW47CisgICAgdWNoIGJnX2JsdWUgID0gcnBuZzJfaW5mby5iZ19ibHVlOworICAgIHVjaCAqZGVzdDsKKyAgICBpbnQgZXh0cmFfd2lkdGgsIGV4dHJhX2hlaWdodDsKKyAgICB1bGcgaSwgajsKKyAgICBXTkRDTEFTU0VYIHduZGNsYXNzOworICAgIFJFQ1QgcmVjdDsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGRpc3BsYXktc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgaW1hZ2UgKHJvdW5kIHVwCisgICAgdG8gbXVsdGlwbGUgb2YgNCBmb3IgV2luZG93cyBESUIpLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgd2ltYWdlX3Jvd2J5dGVzID0gKCgzKnJwbmcyX2luZm8ud2lkdGggKyAzTCkgPj4gMikgPDwgMjsKKworICAgIGlmICghKGRpYiA9ICh1Y2ggKiltYWxsb2Moc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbWFnZV9yb3dieXRlcypycG5nMl9pbmZvLmhlaWdodCkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDQ7ICAgLyogZmFpbCAqLworICAgIH0KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBJbml0aWFsaXplIHRoZSBESUIuICBOZWdhdGl2ZSBoZWlnaHQgbWVhbnMgdG8gdXNlIHRvcC1kb3duIEJNUCBvcmRlcmluZworICAgIChtdXN0IGJlIHVuY29tcHJlc3NlZCwgYnV0IHRoYXQncyB3aGF0IHdlIHdhbnQpLiAgQml0IGNvdW50IG9mIDEsIDQgb3IgOAorICAgIGltcGxpZXMgYSBjb2xvcm1hcCBvZiBSR0JYIHF1YWRzLCBidXQgMjQtYml0IEJNUHMganVzdCB1c2UgQixHLFIgdmFsdWVzCisgICAgZGlyZWN0bHkgPT4gd2ltYWdlX2RhdGEgYmVnaW5zIGltbWVkaWF0ZWx5IGFmdGVyIEJNUCBoZWFkZXIuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBtZW1zZXQoZGliLCAwLCBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpOworICAgIGJtaWggPSAoQklUTUFQSU5GT0hFQURFUiAqKWRpYjsKKyAgICBibWloLT5iaVNpemUgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7CisgICAgYm1paC0+YmlXaWR0aCA9IHJwbmcyX2luZm8ud2lkdGg7CisgICAgYm1paC0+YmlIZWlnaHQgPSAtKChsb25nKXJwbmcyX2luZm8uaGVpZ2h0KTsKKyAgICBibWloLT5iaVBsYW5lcyA9IDE7CisgICAgYm1paC0+YmlCaXRDb3VudCA9IDI0OworICAgIGJtaWgtPmJpQ29tcHJlc3Npb24gPSAwOworICAgIHdpbWFnZV9kYXRhID0gZGliICsgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZpbGwgd2luZG93IHdpdGggdGhlIHNwZWNpZmllZCBiYWNrZ3JvdW5kIGNvbG9yIChkZWZhdWx0IGlzIGJsYWNrKSwgYnV0CisgICAgZGVmZXIgbG9hZGluZyBmYWtlZCAiYmFja2dyb3VuZCBpbWFnZSIgdW50aWwgd2luZG93IGlzIGRpc3BsYXllZCAobWF5IGJlCisgICAgc2xvdyB0byBjb21wdXRlKS4gIERhdGEgYXJlIGluIEJHUiBvcmRlci4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIGlmIChiZ19pbWFnZSkgeyAgIC8qIGp1c3QgZmlsbCB3aXRoIGJsYWNrIGZvciBub3cgKi8KKyAgICAgICAgbWVtc2V0KHdpbWFnZV9kYXRhLCAwLCB3aW1hZ2Vfcm93Ynl0ZXMqcnBuZzJfaW5mby5oZWlnaHQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaiA9IDA7ICBqIDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK2opIHsKKyAgICAgICAgICAgIGRlc3QgPSB3aW1hZ2VfZGF0YSArIGoqd2ltYWdlX3Jvd2J5dGVzOworICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7CisgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGJnX2JsdWU7CisgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGJnX2dyZWVuOworICAgICAgICAgICAgICAgICpkZXN0KysgPSBiZ19yZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2V0IHRoZSB3aW5kb3cgcGFyYW1ldGVycy4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIG1lbXNldCgmd25kY2xhc3MsIDAsIHNpemVvZih3bmRjbGFzcykpOworCisgICAgd25kY2xhc3MuY2JTaXplID0gc2l6ZW9mKHduZGNsYXNzKTsKKyAgICB3bmRjbGFzcy5zdHlsZSA9IENTX0hSRURSQVcgfCBDU19WUkVEUkFXOworICAgIHduZGNsYXNzLmxwZm5XbmRQcm9jID0gcnBuZzJfd2luX3duZHByb2M7CisgICAgd25kY2xhc3MuaEluc3RhbmNlID0gZ2xvYmFsX2hJbnN0OworICAgIHduZGNsYXNzLmhJY29uID0gTG9hZEljb24oTlVMTCwgSURJX0FQUExJQ0FUSU9OKTsKKyAgICB3bmRjbGFzcy5oQ3Vyc29yID0gTG9hZEN1cnNvcihOVUxMLCBJRENfQVJST1cpOworICAgIHduZGNsYXNzLmhickJhY2tncm91bmQgPSAoSEJSVVNIKUdldFN0b2NrT2JqZWN0KERLR1JBWV9CUlVTSCk7CisgICAgd25kY2xhc3MubHBzek1lbnVOYW1lID0gTlVMTDsKKyAgICB3bmRjbGFzcy5scHN6Q2xhc3NOYW1lID0gcHJvZ25hbWU7CisgICAgd25kY2xhc3MuaEljb25TbSA9IExvYWRJY29uKE5VTEwsIElESV9BUFBMSUNBVElPTik7CisKKyAgICBSZWdpc3RlckNsYXNzRXgoJnduZGNsYXNzKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaW5hbGx5LCBjcmVhdGUgdGhlIHdpbmRvdy4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIGV4dHJhX3dpZHRoICA9IDIqKEdldFN5c3RlbU1ldHJpY3MoU01fQ1hCT1JERVIpICsKKyAgICAgICAgICAgICAgICAgICAgICBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYRExHRlJBTUUpKTsKKyAgICBleHRyYV9oZWlnaHQgPSAyKihHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZQk9SREVSKSArCisgICAgICAgICAgICAgICAgICAgICAgR2V0U3lzdGVtTWV0cmljcyhTTV9DWURMR0ZSQU1FKSkgKworICAgICAgICAgICAgICAgICAgICAgIEdldFN5c3RlbU1ldHJpY3MoU01fQ1lDQVBUSU9OKTsKKworICAgIGdsb2JhbF9od25kID0gQ3JlYXRlV2luZG93KHByb2duYW1lLCB0aXRsZWJhciwgV1NfT1ZFUkxBUFBFRFdJTkRPVywKKyAgICAgIENXX1VTRURFRkFVTFQsIENXX1VTRURFRkFVTFQsIHJwbmcyX2luZm8ud2lkdGgrZXh0cmFfd2lkdGgsCisgICAgICBycG5nMl9pbmZvLmhlaWdodCtleHRyYV9oZWlnaHQsIE5VTEwsIE5VTEwsIGdsb2JhbF9oSW5zdCwgTlVMTCk7CisKKyAgICBTaG93V2luZG93KGdsb2JhbF9od25kLCBnbG9iYWxfc2hvd21vZGUpOworICAgIFVwZGF0ZVdpbmRvdyhnbG9iYWxfaHduZCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgTm93IGNvbXB1dGUgdGhlIGJhY2tncm91bmQgaW1hZ2UgYW5kIGRpc3BsYXkgaXQuICBJZiBpdCBmYWlscyAobWVtb3J5CisgICAgYWxsb2NhdGlvbiksIHJldmVydCB0byBhIHBsYWluIGJhY2tncm91bmQgY29sb3IuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBpZiAoYmdfaW1hZ2UpIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKm1zZyA9ICJDb21wdXRpbmcgYmFja2dyb3VuZCBpbWFnZS4uLiI7CisgICAgICAgIGludCB4LCB5LCBsZW4gPSBzdHJsZW4obXNnKTsKKyAgICAgICAgSERDIGhkYyA9IEdldERDKGdsb2JhbF9od25kKTsKKyAgICAgICAgVEVYVE1FVFJJQyB0bTsKKworICAgICAgICBHZXRUZXh0TWV0cmljcyhoZGMsICZ0bSk7CisgICAgICAgIHggPSAocnBuZzJfaW5mby53aWR0aCAtIGxlbip0bS50bUF2ZUNoYXJXaWR0aCkvMjsKKyAgICAgICAgeSA9IChycG5nMl9pbmZvLmhlaWdodCAtIHRtLnRtSGVpZ2h0KS8yOworICAgICAgICBTZXRCa01vZGUoaGRjLCBUUkFOU1BBUkVOVCk7CisgICAgICAgIFNldFRleHRDb2xvcihoZGMsIEdldFN5c0NvbG9yKENPTE9SX0hJR0hMSUdIVFRFWFQpKTsKKyAgICAgICAgLyogdGhpcyBjYW4gc3RpbGwgYmVnaW4gb3V0IG9mIGJvdW5kcyBldmVuIGlmIHggaXMgcG9zaXRpdmUgKD8/Pyk6ICovCisgICAgICAgIFRleHRPdXQoaGRjLCAoKHggPCAwKT8gMCA6IHgpLCAoKHkgPCAwKT8gMCA6IHkpLCBtc2csIGxlbik7CisgICAgICAgIFJlbGVhc2VEQyhnbG9iYWxfaHduZCwgaGRjKTsKKworICAgICAgICBycG5nMl93aW5fbG9hZF9iZ19pbWFnZSgpOyAgIC8qIHJlc2V0cyBiZ19pbWFnZSBpZiBmYWlscyAqLworICAgIH0KKworICAgIGlmICghYmdfaW1hZ2UpIHsKKyAgICAgICAgZm9yIChqID0gMDsgIGogPCBycG5nMl9pbmZvLmhlaWdodDsgICsraikgeworICAgICAgICAgICAgZGVzdCA9IHdpbWFnZV9kYXRhICsgaip3aW1hZ2Vfcm93Ynl0ZXM7CisgICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKKyAgICAgICAgICAgICAgICAqZGVzdCsrID0gYmdfYmx1ZTsKKyAgICAgICAgICAgICAgICAqZGVzdCsrID0gYmdfZ3JlZW47CisgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGJnX3JlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJlY3QubGVmdCA9IDBMOworICAgIHJlY3QudG9wID0gMEw7CisgICAgcmVjdC5yaWdodCA9IChMT05HKXJwbmcyX2luZm8ud2lkdGg7ICAgICAgIC8qIHBvc3NpYmx5IG9mZiBieSBvbmU/ICovCisgICAgcmVjdC5ib3R0b20gPSAoTE9ORylycG5nMl9pbmZvLmhlaWdodDsgICAgIC8qIHBvc3NpYmx5IG9mZiBieSBvbmU/ICovCisgICAgSW52YWxpZGF0ZVJlY3QoZ2xvYmFsX2h3bmQsICZyZWN0LCBGQUxTRSk7CisgICAgVXBkYXRlV2luZG93KGdsb2JhbF9od25kKTsgICAgICAgICAgICAgICAgIC8qIHNpbWlsYXIgdG8gWEZsdXNoKCkgKi8KKworICAgIHJldHVybiAwOworCit9IC8qIGVuZCBmdW5jdGlvbiBycG5nMl93aW5fY3JlYXRlX3dpbmRvdygpICovCisKKworCisKKworc3RhdGljIGludCBycG5nMl93aW5fbG9hZF9iZ19pbWFnZSgpCit7CisgICAgdWNoICpzcmMsICpkZXN0OworICAgIHVjaCByMSwgcjIsIGcxLCBnMiwgYjEsIGIyOworICAgIHVjaCByMV9pbnYsIHIyX2ludiwgZzFfaW52LCBnMl9pbnYsIGIxX2ludiwgYjJfaW52OworICAgIGludCBrLCBobWF4LCBtYXg7CisgICAgaW50IHhpZHgsIHlpZHgsIHlpZHhfbWF4ID0gKGJnc2NhbGUtMSk7CisgICAgaW50IGV2ZW5fb2RkX3ZlcnQsIGV2ZW5fb2RkX2hvcml6LCBldmVuX29kZDsKKyAgICBpbnQgaW52ZXJ0X2dyYWRpZW50MiA9IChiZ1twYXRdLnR5cGUgJiAweDA4KTsKKyAgICBpbnQgaW52ZXJ0X2NvbHVtbjsKKyAgICB1bGcgaSwgcm93OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEFsbG9jYXRlIGJ1ZmZlciBmb3IgZmFrZSBiYWNrZ3JvdW5kIGltYWdlIHRvIGJlIHVzZWQgd2l0aCB0cmFuc3BhcmVudAorICAgIGltYWdlczsgaWYgdGhpcyBmYWlscywgcmV2ZXJ0IHRvIHBsYWluIGJhY2tncm91bmQgY29sb3IuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBiZ19yb3dieXRlcyA9IDMgKiBycG5nMl9pbmZvLndpZHRoOworICAgIGJnX2RhdGEgPSAodWNoICopbWFsbG9jKGJnX3Jvd2J5dGVzICogcnBuZzJfaW5mby5oZWlnaHQpOworICAgIGlmICghYmdfZGF0YSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKKyAgICAgICAgICAiOiAgdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgYmFja2dyb3VuZCBpbWFnZVxuIik7CisgICAgICAgIGJnX2ltYWdlID0gMDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFZlcnRpY2FsIGdyYWRpZW50cyAocmFtcHMpIGluIE54TiBzcXVhcmVzLCBhbHRlcm5hdGluZyBkaXJlY3Rpb24gYW5kCisgICAgY29sb3JzIChOID09IGJnc2NhbGUpLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgaWYgKChiZ1twYXRdLnR5cGUgJiAweDA3KSA9PSAwKSB7CisgICAgICAgIHVjaCByMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLnI7CisgICAgICAgIHVjaCBnMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLmc7CisgICAgICAgIHVjaCBiMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLmI7CisgICAgICAgIHVjaCByMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLnI7CisgICAgICAgIHVjaCBnMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLmc7CisgICAgICAgIHVjaCBiMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLmI7CisgICAgICAgIGludCByMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLnIgLSByMV9taW47CisgICAgICAgIGludCBnMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLmcgLSBnMV9taW47CisgICAgICAgIGludCBiMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLmIgLSBiMV9taW47CisgICAgICAgIGludCByMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLnIgLSByMl9taW47CisgICAgICAgIGludCBnMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLmcgLSBnMl9taW47CisgICAgICAgIGludCBiMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLmIgLSBiMl9taW47CisKKyAgICAgICAgZm9yIChyb3cgPSAwOyAgcm93IDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK3JvdykgeworICAgICAgICAgICAgeWlkeCA9IHJvdyAlIGJnc2NhbGU7CisgICAgICAgICAgICBldmVuX29kZF92ZXJ0ID0gKHJvdyAvIGJnc2NhbGUpICYgMTsKKworICAgICAgICAgICAgcjEgPSByMV9taW4gKyAocjFfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7CisgICAgICAgICAgICBnMSA9IGcxX21pbiArIChnMV9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKKyAgICAgICAgICAgIGIxID0gYjFfbWluICsgKGIxX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OworICAgICAgICAgICAgcjFfaW52ID0gcjFfbWluICsgKHIxX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7CisgICAgICAgICAgICBnMV9pbnYgPSBnMV9taW4gKyAoZzFfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKKyAgICAgICAgICAgIGIxX2ludiA9IGIxX21pbiArIChiMV9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OworCisgICAgICAgICAgICByMiA9IHIyX21pbiArIChyMl9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKKyAgICAgICAgICAgIGcyID0gZzJfbWluICsgKGcyX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OworICAgICAgICAgICAgYjIgPSBiMl9taW4gKyAoYjJfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7CisgICAgICAgICAgICByMl9pbnYgPSByMl9taW4gKyAocjJfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKKyAgICAgICAgICAgIGcyX2ludiA9IGcyX21pbiArIChnMl9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OworICAgICAgICAgICAgYjJfaW52ID0gYjJfbWluICsgKGIyX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7CisKKyAgICAgICAgICAgIGRlc3QgPSBiZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOworICAgICAgICAgICAgZm9yIChpID0gMDsgIGkgPCBycG5nMl9pbmZvLndpZHRoOyAgKytpKSB7CisgICAgICAgICAgICAgICAgZXZlbl9vZGRfaG9yaXogPSAoaSAvIGJnc2NhbGUpICYgMTsKKyAgICAgICAgICAgICAgICBldmVuX29kZCA9IGV2ZW5fb2RkX3ZlcnQgXiBldmVuX29kZF9ob3JpejsKKyAgICAgICAgICAgICAgICBpbnZlcnRfY29sdW1uID0KKyAgICAgICAgICAgICAgICAgIChldmVuX29kZF9ob3JpeiAmJiAoYmdbcGF0XS50eXBlICYgMHgxMCkpOworICAgICAgICAgICAgICAgIGlmIChldmVuX29kZCA9PSAwKSB7ICAgICAgICAgLyogZ3JhZGllbnQgIzEgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGludmVydF9jb2x1bW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSByMV9pbnY7CisgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzFfaW52OworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGIxX2ludjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSByMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgLyogZ3JhZGllbnQgIzIgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKChpbnZlcnRfY29sdW1uICYmIGludmVydF9ncmFkaWVudDIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoIWludmVydF9jb2x1bW4gJiYgIWludmVydF9ncmFkaWVudDIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjI7ICAgICAgICAvKiBub3QgaW52ZXJ0ZWQgb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnMjsgICAgICAgIC8qICBkb3VibHkgaW52ZXJ0ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSByMl9pbnY7CisgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzJfaW52OyAgICAvKiBzaW5nbHkgaW52ZXJ0ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMl9pbnY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTb2Z0IGdyYWRpZW50LWRpYW1vbmRzIHdpdGggc2NhbGUgPSBiZ3NjYWxlLiAgQ29kZSBjb250cmlidXRlZCBieSBBZGFtCisgICAgTS4gQ29zdGVsbG8uCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICB9IGVsc2UgaWYgKChiZ1twYXRdLnR5cGUgJiAweDA3KSA9PSAxKSB7CisKKyAgICAgICAgaG1heCA9IChiZ3NjYWxlLTEpLzI7ICAgLyogaGFsZiB0aGUgbWF4IHdlaWdodCBvZiBhIGNvbG9yICovCisgICAgICAgIG1heCA9IDIqaG1heDsgICAgICAgICAgIC8qIHRoZSBtYXggd2VpZ2h0IG9mIGEgY29sb3IgKi8KKworICAgICAgICByMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5yOworICAgICAgICBnMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5nOworICAgICAgICBiMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5iOworICAgICAgICByMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5yOworICAgICAgICBnMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5nOworICAgICAgICBiMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5iOworCisgICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKKyAgICAgICAgICAgIHlpZHggPSByb3cgJSBiZ3NjYWxlOworICAgICAgICAgICAgaWYgKHlpZHggPiBobWF4KQorICAgICAgICAgICAgICAgIHlpZHggPSBiZ3NjYWxlLTEgLSB5aWR4OworICAgICAgICAgICAgZGVzdCA9IGJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IHJwbmcyX2luZm8ud2lkdGg7ICArK2kpIHsKKyAgICAgICAgICAgICAgICB4aWR4ID0gaSAlIGJnc2NhbGU7CisgICAgICAgICAgICAgICAgaWYgKHhpZHggPiBobWF4KQorICAgICAgICAgICAgICAgICAgICB4aWR4ID0gYmdzY2FsZS0xIC0geGlkeDsKKyAgICAgICAgICAgICAgICBrID0geGlkeCArIHlpZHg7CisgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChrKnIxICsgKG1heC1rKSpyMikgLyBtYXg7CisgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChrKmcxICsgKG1heC1rKSpnMikgLyBtYXg7CisgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChrKmIxICsgKG1heC1rKSpiMikgLyBtYXg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBSYWRpYWwgInN0YXJidXJzdCIgd2l0aCBhemltdXRoYWwgc2ludXNvaWRzOyBbZXZlbnR1YWxseSBudW1iZXIgb2Ygc2ludS0KKyAgICBzb2lkcyB3aWxsIGVxdWFsIGJnc2NhbGU/XS4gIFRoaXMgb25lIGlzIHNsb3cgYnV0IHZlcnkgY29vbC4gIENvZGUgY29uLQorICAgIHRyaWJ1dGVkIGJ5IFBpZXRlciBTLiB2YW4gZGVyIE1ldWxlbiAob3JpZ2luYWxseSBpbiBTbWFsbHRhbGspLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgfSBlbHNlIGlmICgoYmdbcGF0XS50eXBlICYgMHgwNykgPT0gMikgeworICAgICAgICB1Y2ggY2g7CisgICAgICAgIGludCBpaSwgeCwgeSwgaHcsIGhoLCBncmF5c3BvdDsKKyAgICAgICAgZG91YmxlIGZyZXEsIHJvdGF0ZSwgc2F0dXJhdGUsIGdyYXksIGludGVuc2l0eTsKKyAgICAgICAgZG91YmxlIGFuZ2xlPTAuMCwgYW9mZnNldD0wLjAsIG1heERpc3QsIGRpc3Q7CisgICAgICAgIGRvdWJsZSByZWQ9MC4wLCBncmVlbj0wLjAsIGJsdWU9MC4wLCBodWUsIHMsIHYsIGYsIHAsIHEsIHQ7CisKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogIGNvbXB1dGluZyByYWRpYWwgYmFja2dyb3VuZC4uLiIsCisgICAgICAgICAgUFJPR05BTUUpOworICAgICAgICBmZmx1c2goc3RkZXJyKTsKKworICAgICAgICBoaCA9IHJwbmcyX2luZm8uaGVpZ2h0IC8gMjsKKyAgICAgICAgaHcgPSBycG5nMl9pbmZvLndpZHRoIC8gMjsKKworICAgICAgICAvKiB2YXJpYWJsZXMgZm9yIHJhZGlhbCB3YXZlczoKKyAgICAgICAgICogICBhb2Zmc2V0OiAgbnVtYmVyIG9mIGRlZ3JlZXMgdG8gcm90YXRlIGh1ZSBbQ1VSUkVOVExZIE5PVCBVU0VEXQorICAgICAgICAgKiAgIGZyZXE6ICBudW1iZXIgb2YgY29sb3IgYmVhbXMgb3JpZ2luYXRpbmcgZnJvbSB0aGUgY2VudGVyCisgICAgICAgICAqICAgZ3JheXNwb3Q6ICBzaXplIG9mIHRoZSBncmF5aW5nIGNlbnRlciBhcmVhIChhbnRpLWFsaWFzKQorICAgICAgICAgKiAgIHJvdGF0ZTogIHJvdGF0aW9uIG9mIHRoZSBiZWFtcyBhcyBhIGZ1bmN0aW9uIG9mIHJhZGl1cworICAgICAgICAgKiAgIHNhdHVyYXRlOiAgc2F0dXJhdGlvbiBvZiBiZWFtcycgc2hhcGUgYXppbXV0aGFsbHkKKyAgICAgICAgICovCisgICAgICAgIGFuZ2xlID0gQ0xJUChhbmdsZSwgMC4wLCAzNjAuMCk7CisgICAgICAgIGdyYXlzcG90ID0gQ0xJUChiZ1twYXRdLmJnX2dyYXksIDEsIChoaCArIGh3KSk7CisgICAgICAgIGZyZXEgPSBNQVgoKGRvdWJsZSliZ1twYXRdLmJnX2ZyZXEsIDAuMCk7CisgICAgICAgIHNhdHVyYXRlID0gKGRvdWJsZSliZ1twYXRdLmJnX2JzYXQgKiAwLjE7CisgICAgICAgIHJvdGF0ZSA9IChkb3VibGUpYmdbcGF0XS5iZ19icm90ICogMC4xOworICAgICAgICBncmF5ID0gMC4wOworICAgICAgICBpbnRlbnNpdHkgPSAwLjA7CisgICAgICAgIG1heERpc3QgPSAoZG91YmxlKSgoaHcqaHcpICsgKGhoKmhoKSk7CisKKyAgICAgICAgZm9yIChyb3cgPSAwOyAgcm93IDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK3JvdykgeworICAgICAgICAgICAgeSA9IHJvdyAtIGhoOworICAgICAgICAgICAgZGVzdCA9IGJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IHJwbmcyX2luZm8ud2lkdGg7ICArK2kpIHsKKyAgICAgICAgICAgICAgICB4ID0gaSAtIGh3OworICAgICAgICAgICAgICAgIGFuZ2xlID0gKHggPT0gMCk/IFBJXzIgOiBhdGFuKChkb3VibGUpeSAvIChkb3VibGUpeCk7CisgICAgICAgICAgICAgICAgZ3JheSA9IChkb3VibGUpTUFYKEFCUyh5KSwgQUJTKHgpKSAvIGdyYXlzcG90OworICAgICAgICAgICAgICAgIGdyYXkgPSBNSU4oMS4wLCBncmF5KTsKKyAgICAgICAgICAgICAgICBkaXN0ID0gKGRvdWJsZSkoKHgqeCkgKyAoeSp5KSkgLyBtYXhEaXN0OworICAgICAgICAgICAgICAgIGludGVuc2l0eSA9IGNvcygoYW5nbGUrKHJvdGF0ZSpkaXN0KlBJKSkgKiBmcmVxKSAqCisgICAgICAgICAgICAgICAgICBncmF5ICogc2F0dXJhdGU7CisgICAgICAgICAgICAgICAgaW50ZW5zaXR5ID0gKE1BWChNSU4oaW50ZW5zaXR5LDEuMCksLTEuMCkgKyAxLjApICogMC41OworICAgICAgICAgICAgICAgIGh1ZSA9IChhbmdsZSArIFBJKSAqIElOVl9QSV8zNjAgKyBhb2Zmc2V0OworICAgICAgICAgICAgICAgIHMgPSBncmF5ICogKChkb3VibGUpKEFCUyh4KStBQlMoeSkpIC8gKGRvdWJsZSkoaHcgKyBoaCkpOworICAgICAgICAgICAgICAgIHMgPSBNSU4oTUFYKHMsMC4wKSwgMS4wKTsKKyAgICAgICAgICAgICAgICB2ID0gTUlOKE1BWChpbnRlbnNpdHksMC4wKSwgMS4wKTsKKworICAgICAgICAgICAgICAgIGlmIChzID09IDAuMCkgeworICAgICAgICAgICAgICAgICAgICBjaCA9ICh1Y2gpKHYgKiAyNTUuMCk7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBjaDsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGNoOworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gY2g7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChodWUgPCAwLjApIHx8IChodWUgPj0gMzYwLjApKQorICAgICAgICAgICAgICAgICAgICAgICAgaHVlIC09ICgoKGludCkoaHVlIC8gMzYwLjApKSAqIDM2MC4wKTsKKyAgICAgICAgICAgICAgICAgICAgaHVlIC89IDYwLjA7CisgICAgICAgICAgICAgICAgICAgIGlpID0gKGludClodWU7CisgICAgICAgICAgICAgICAgICAgIGYgPSBodWUgLSAoZG91YmxlKWlpOworICAgICAgICAgICAgICAgICAgICBwID0gKDEuMCAtIHMpICogdjsKKyAgICAgICAgICAgICAgICAgICAgcSA9ICgxLjAgLSAocyAqIGYpKSAqIHY7CisgICAgICAgICAgICAgICAgICAgIHQgPSAoMS4wIC0gKHMgKiAoMS4wIC0gZikpKSAqIHY7CisgICAgICAgICAgICAgICAgICAgIGlmICAgICAgKGlpID09IDApIHsgcmVkID0gdjsgZ3JlZW4gPSB0OyBibHVlID0gcDsgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSAxKSB7IHJlZCA9IHE7IGdyZWVuID0gdjsgYmx1ZSA9IHA7IH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gMikgeyByZWQgPSBwOyBncmVlbiA9IHY7IGJsdWUgPSB0OyB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlpID09IDMpIHsgcmVkID0gcDsgZ3JlZW4gPSBxOyBibHVlID0gdjsgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSA0KSB7IHJlZCA9IHQ7IGdyZWVuID0gcDsgYmx1ZSA9IHY7IH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gNSkgeyByZWQgPSB2OyBncmVlbiA9IHA7IGJsdWUgPSBxOyB9CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAodWNoKShyZWQgKiAyNTUuMCk7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAodWNoKShncmVlbiAqIDI1NS4wKTsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9ICh1Y2gpKGJsdWUgKiAyNTUuMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZG9uZS5cbiIpOworICAgICAgICBmZmx1c2goc3RkZXJyKTsKKyAgICB9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQmxhc3QgYmFja2dyb3VuZCBpbWFnZSB0byBkaXNwbGF5IGJ1ZmZlciBiZWZvcmUgYmVnaW5uaW5nIFBORyBkZWNvZGU7CisgICAgY2FsbGluZyBmdW5jdGlvbiB3aWxsIGhhbmRsZSBpbnZhbGlkYXRpb24gYW5kIFVwZGF0ZVdpbmRvdygpIGNhbGwuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBmb3IgKHJvdyA9IDA7ICByb3cgPCBycG5nMl9pbmZvLmhlaWdodDsgICsrcm93KSB7CisgICAgICAgIHNyYyA9IGJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7CisgICAgICAgIGRlc3QgPSB3aW1hZ2VfZGF0YSArIHJvdyp3aW1hZ2Vfcm93Ynl0ZXM7CisgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgeworICAgICAgICAgICAgcjEgPSAqc3JjKys7CisgICAgICAgICAgICBnMSA9ICpzcmMrKzsKKyAgICAgICAgICAgIGIxID0gKnNyYysrOworICAgICAgICAgICAgKmRlc3QrKyA9IGIxOworICAgICAgICAgICAgKmRlc3QrKyA9IGcxOyAgIC8qIG5vdGUgcmV2ZXJzZSBvcmRlciAqLworICAgICAgICAgICAgKmRlc3QrKyA9IHIxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7CisKK30gLyogZW5kIGZ1bmN0aW9uIHJwbmcyX3dpbl9sb2FkX2JnX2ltYWdlKCkgKi8KKworCisKKworCitzdGF0aWMgdm9pZCBycG5nMl93aW5fZGlzcGxheV9yb3codWxnIHJvdykKK3sKKyAgICB1Y2ggYmdfcmVkICAgPSBycG5nMl9pbmZvLmJnX3JlZDsKKyAgICB1Y2ggYmdfZ3JlZW4gPSBycG5nMl9pbmZvLmJnX2dyZWVuOworICAgIHVjaCBiZ19ibHVlICA9IHJwbmcyX2luZm8uYmdfYmx1ZTsKKyAgICB1Y2ggKnNyYywgKnNyYzI9TlVMTCwgKmRlc3Q7CisgICAgdWNoIHIsIGcsIGIsIGE7CisgICAgdWxnIGk7CisgICAgc3RhdGljIGludCByb3dzPTA7CisgICAgc3RhdGljIHVsZyBmaXJzdHJvdzsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICByb3dzIGFuZCBmaXJzdHJvdyBzaW1wbHkgdHJhY2sgaG93IG1hbnkgcm93cyAoYW5kIHdoaWNoIG9uZXMpIGhhdmUgbm90CisgICAgeWV0IGJlZW4gZGlzcGxheWVkOyBhbHRlcm5hdGl2ZWx5LCB3ZSBjb3VsZCBjYWxsIEludmFsaWRhdGVSZWN0KCkgZm9yCisgICAgZXZlcnkgcm93IGFuZCBub3QgYm90aGVyIHdpdGggdGhlIHJlY29yZHMta2VlcGluZy4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIFRyYWNlKChzdGRlcnIsICJiZWdpbm5pbmcgcnBuZzJfd2luX2Rpc3BsYXlfcm93KClcbiIpKQorCisgICAgaWYgKHJvd3MgPT0gMCkKKyAgICAgICAgZmlyc3Ryb3cgPSByb3c7ICAgLyogZmlyc3Qgcm93IG5vdCB5ZXQgZGlzcGxheWVkICovCisKKyAgICArK3Jvd3M7ICAgLyogY291bnQgb2Ygcm93cyByZWNlaXZlZCBidXQgbm90IHlldCBkaXNwbGF5ZWQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBc2lkZSBmcm9tIHRoZSB1c2Ugb2YgdGhlIHJwbmcyX2luZm8gc3RydWN0IGFuZCB0aGUgbGFjayBvZiBhbiBvdXRlcgorICAgIGxvb3AgKG92ZXIgcm93cyksIHRoaXMgcm91dGluZSBpcyBpZGVudGljYWwgdG8gcnBuZ193aW5fZGlzcGxheV9pbWFnZSgpCisgICAgaW4gdGhlIG5vbi1wcm9ncmVzc2l2ZSB2ZXJzaW9uIG9mIHRoZSBwcm9ncmFtLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgc3JjID0gcnBuZzJfaW5mby5pbWFnZV9kYXRhICsgcm93KnJwbmcyX2luZm8ucm93Ynl0ZXM7CisgICAgaWYgKGJnX2ltYWdlKQorICAgICAgICBzcmMyID0gYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKKyAgICBkZXN0ID0gd2ltYWdlX2RhdGEgKyByb3cqd2ltYWdlX3Jvd2J5dGVzOworCisgICAgaWYgKHJwbmcyX2luZm8uY2hhbm5lbHMgPT0gMykgeworICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKKyAgICAgICAgICAgIHIgPSAqc3JjKys7CisgICAgICAgICAgICBnID0gKnNyYysrOworICAgICAgICAgICAgYiA9ICpzcmMrKzsKKyAgICAgICAgICAgICpkZXN0KysgPSBiOworICAgICAgICAgICAgKmRlc3QrKyA9IGc7ICAgLyogbm90ZSByZXZlcnNlIG9yZGVyICovCisgICAgICAgICAgICAqZGVzdCsrID0gcjsKKyAgICAgICAgfQorICAgIH0gZWxzZSAvKiBpZiAocnBuZzJfaW5mby5jaGFubmVscyA9PSA0KSAqLyB7CisgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgeworICAgICAgICAgICAgciA9ICpzcmMrKzsKKyAgICAgICAgICAgIGcgPSAqc3JjKys7CisgICAgICAgICAgICBiID0gKnNyYysrOworICAgICAgICAgICAgYSA9ICpzcmMrKzsKKyAgICAgICAgICAgIGlmIChiZ19pbWFnZSkgeworICAgICAgICAgICAgICAgIGJnX3JlZCAgID0gKnNyYzIrKzsKKyAgICAgICAgICAgICAgICBiZ19ncmVlbiA9ICpzcmMyKys7CisgICAgICAgICAgICAgICAgYmdfYmx1ZSAgPSAqc3JjMisrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGEgPT0gMjU1KSB7CisgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGI7CisgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGc7CisgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT0gMCkgeworICAgICAgICAgICAgICAgICpkZXN0KysgPSBiZ19ibHVlOworICAgICAgICAgICAgICAgICpkZXN0KysgPSBiZ19ncmVlbjsKKyAgICAgICAgICAgICAgICAqZGVzdCsrID0gYmdfcmVkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiB0aGlzIG1hY3JvIChjb3BpZWQgZnJvbSBwbmcuaCkgY29tcG9zaXRlcyB0aGUKKyAgICAgICAgICAgICAgICAgKiBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIHZhbHVlcyBhbmQgcHV0cyB0aGUKKyAgICAgICAgICAgICAgICAgKiByZXN1bHQgaW50byB0aGUgZmlyc3QgYXJndW1lbnQ7IHRoZXJlIGFyZSBubworICAgICAgICAgICAgICAgICAqIHNpZGUgZWZmZWN0cyB3aXRoIHRoZSBmaXJzdCBhcmd1bWVudCAqLworICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZSgqZGVzdCsrLCBiLCBhLCBiZ19ibHVlKTsKKyAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoKmRlc3QrKywgZywgYSwgYmdfZ3JlZW4pOworICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZSgqZGVzdCsrLCByLCBhLCBiZ19yZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIERpc3BsYXkgYWZ0ZXIgZXZlcnkgMTYgcm93cyBvciB3aGVuIG9uIGxhc3Qgcm93LiAgKFJlZ2lvbiBtYXkgaW5jbHVkZQorICAgIHByZXZpb3VzbHkgZGlzcGxheWVkIGxpbmVzIGR1ZSB0byBpbnRlcmxhY2luZy0taS5lLiwgbm90IGNvbnRpZ3VvdXMuKQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgaWYgKChyb3dzICYgMHhmKSA9PSAwIHx8IHJvdyA9PSBycG5nMl9pbmZvLmhlaWdodC0xKSB7CisgICAgICAgIFJFQ1QgcmVjdDsKKworICAgICAgICByZWN0LmxlZnQgPSAwTDsKKyAgICAgICAgcmVjdC50b3AgPSAoTE9ORylmaXJzdHJvdzsKKyAgICAgICAgcmVjdC5yaWdodCA9IChMT05HKXJwbmcyX2luZm8ud2lkdGg7ICAgICAgIC8qIHBvc3NpYmx5IG9mZiBieSBvbmU/ICovCisgICAgICAgIHJlY3QuYm90dG9tID0gKExPTkcpcm93ICsgMUw7ICAgICAgICAgICAgICAvKiBwb3NzaWJseSBvZmYgYnkgb25lPyAqLworICAgICAgICBJbnZhbGlkYXRlUmVjdChnbG9iYWxfaHduZCwgJnJlY3QsIEZBTFNFKTsKKyAgICAgICAgVXBkYXRlV2luZG93KGdsb2JhbF9od25kKTsgICAgICAgICAgICAgICAgIC8qIHNpbWlsYXIgdG8gWEZsdXNoKCkgKi8KKyAgICAgICAgcm93cyA9IDA7CisgICAgfQorCit9IC8qIGVuZCBmdW5jdGlvbiBycG5nMl93aW5fZGlzcGxheV9yb3coKSAqLworCisKKworCisKK3N0YXRpYyB2b2lkIHJwbmcyX3dpbl9maW5pc2hfZGlzcGxheSgpCit7CisgICAgVHJhY2UoKHN0ZGVyciwgImJlZ2lubmluZyBycG5nMl93aW5fZmluaXNoX2Rpc3BsYXkoKVxuIikpCisKKyAgICAvKiBsYXN0IHJvdyBoYXMgYWxyZWFkeSBiZWVuIGRpc3BsYXllZCBieSBycG5nMl93aW5fZGlzcGxheV9yb3coKSwgc28KKyAgICAgKiB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8gaGVyZSBleGNlcHQgc2V0IGEgZmxhZyBhbmQgbGV0IHRoZSB1c2VyIGtub3cKKyAgICAgKiB0aGF0IHRoZSBpbWFnZSBpcyBkb25lICovCisKKyAgICBycG5nMl9pbmZvLnN0YXRlID0ga0RvbmU7CisgICAgcHJpbnRmKAorI2lmbmRlZiBfX0NZR1dJTl9fCisgICAgICAiRG9uZS4gIFByZXNzIFEsIEVzYyBvciBtb3VzZSBidXR0b24gMSAod2l0aGluIGltYWdlIHdpbmRvdykgdG8gcXVpdC5cbiIKKyNlbHNlCisgICAgICAiRG9uZS4gIFByZXNzIG1vdXNlIGJ1dHRvbiAxICh3aXRoaW4gaW1hZ2Ugd2luZG93KSB0byBxdWl0LlxuIgorI2VuZGlmCisgICAgKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKK30KKworCisKKworCitzdGF0aWMgdm9pZCBycG5nMl93aW5fY2xlYW51cCgpCit7CisgICAgaWYgKGJnX2ltYWdlICYmIGJnX2RhdGEpIHsKKyAgICAgICAgZnJlZShiZ19kYXRhKTsKKyAgICAgICAgYmdfZGF0YSA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKHJwbmcyX2luZm8uaW1hZ2VfZGF0YSkgeworICAgICAgICBmcmVlKHJwbmcyX2luZm8uaW1hZ2VfZGF0YSk7CisgICAgICAgIHJwbmcyX2luZm8uaW1hZ2VfZGF0YSA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKHJwbmcyX2luZm8ucm93X3BvaW50ZXJzKSB7CisgICAgICAgIGZyZWUocnBuZzJfaW5mby5yb3dfcG9pbnRlcnMpOworICAgICAgICBycG5nMl9pbmZvLnJvd19wb2ludGVycyA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKGRpYikgeworICAgICAgICBmcmVlKGRpYik7CisgICAgICAgIGRpYiA9IE5VTEw7CisgICAgfQorfQorCisKKworCisKK0xSRVNVTFQgQ0FMTEJBQ0sgcnBuZzJfd2luX3duZHByb2MoSFdORCBod25kLCBVSU5UIGlNc2csIFdQQVJBTSB3UCwgTFBBUkFNIGxQKQoreworICAgIEhEQyAgICAgICAgIGhkYzsKKyAgICBQQUlOVFNUUlVDVCBwczsKKyAgICBpbnQgcmM7CisKKyAgICBzd2l0Y2ggKGlNc2cpIHsKKyAgICAgICAgY2FzZSBXTV9DUkVBVEU6CisgICAgICAgICAgICAvKiBvbmUtdGltZSBwcm9jZXNzaW5nIGhlcmUsIGlmIGFueSAqLworICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBXTV9QQUlOVDoKKyAgICAgICAgICAgIGhkYyA9IEJlZ2luUGFpbnQoaHduZCwgJnBzKTsKKyAgICAgICAgICAgIHJjID0gU3RyZXRjaERJQml0cyhoZGMsIDAsIDAsIHJwbmcyX2luZm8ud2lkdGgsIHJwbmcyX2luZm8uaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgcnBuZzJfaW5mby53aWR0aCwgcnBuZzJfaW5mby5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW1hZ2VfZGF0YSwgKEJJVE1BUElORk8gKilibWloLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgU1JDQ09QWSk7CisgICAgICAgICAgICBFbmRQYWludChod25kLCAmcHMpOworICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgLyogd2FpdCBmb3IgdGhlIHVzZXIgdG8gdGVsbCB1cyB3aGVuIHRvIHF1aXQgKi8KKyAgICAgICAgY2FzZSBXTV9DSEFSOgorICAgICAgICAgICAgc3dpdGNoICh3UCkgeyAgICAgICAvKiBvbmx5IG5lZWQgb25lLCBzbyBpZ25vcmUgcmVwZWF0IGNvdW50ICovCisgICAgICAgICAgICAgICAgY2FzZSAncSc6CisgICAgICAgICAgICAgICAgY2FzZSAnUSc6CisgICAgICAgICAgICAgICAgY2FzZSAweDFCOiAgICAgIC8qIEVzYyBrZXkgKi8KKyAgICAgICAgICAgICAgICAgICAgUG9zdFF1aXRNZXNzYWdlKDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBXTV9MQlVUVE9ORE9XTjogICAgLyogYW5vdGhlciB3YXkgb2YgcXVpdHRpbmcgKi8KKyAgICAgICAgY2FzZSBXTV9ERVNUUk9ZOgorICAgICAgICAgICAgUG9zdFF1aXRNZXNzYWdlKDApOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIERlZldpbmRvd1Byb2MoaHduZCwgaU1zZywgd1AsIGxQKTsKK30KZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL2dyZWdib29rL3JwbmcyLXguYyBiL2xpYnBuZy9jb250cmliL2dyZWdib29rL3JwbmcyLXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzhkZGViCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svcnBuZzIteC5jCkBAIC0wLDAgKzEsMjEzNCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgcnBuZzIgLSBwcm9ncmVzc2l2ZS1tb2RlbCBQTkcgZGlzcGxheSBwcm9ncmFtICAgICAgICAgICAgICAgICAgcnBuZzIteC5jCisKKyAgIFRoaXMgcHJvZ3JhbSBkZWNvZGVzIGFuZCBkaXNwbGF5cyBQTkcgZmlsZXMgcHJvZ3Jlc3NpdmVseSwgYXMgaWYgaXQgd2VyZQorICAgYSB3ZWIgYnJvd3NlciAodGhvdWdoIHRoZSBmcm9udCBlbmQgaXMgb25seSBzZXQgdXAgdG8gcmVhZCBmcm9tIGZpbGVzKS4KKyAgIEl0IHN1cHBvcnRzIGdhbW1hIGNvcnJlY3Rpb24sIHVzZXItc3BlY2lmaWVkIGJhY2tncm91bmQgY29sb3JzLCBhbmQgdXNlci0KKyAgIHNwZWNpZmllZCBiYWNrZ3JvdW5kIHBhdHRlcm5zIChmb3IgdHJhbnNwYXJlbnQgaW1hZ2VzKS4gIFRoaXMgdmVyc2lvbiBpcworICAgZm9yIHRoZSBYIFdpbmRvdyBTeXN0ZW0gKHRlc3RlZCBieSB0aGUgYXV0aG9yIHVuZGVyIFVuaXggYW5kIGJ5IE1hcnRpbgorICAgWmluc2VyIHVuZGVyIE9wZW5WTVM7IG1heSB3b3JrIHVuZGVyIE9TLzIgd2l0aCBhIGxpdHRsZSB0d2Vha2luZykuCisKKyAgIFRoYW5rcyB0byBBZGFtIENvc3RlbGxvIGFuZCBQaWV0ZXIgUy4gdmFuIGRlciBNZXVsZW4gZm9yIHRoZSAiZGlhbW9uZCIKKyAgIGFuZCAicmFkaWFsIHdhdmVzIiBwYXR0ZXJucywgcmVzcGVjdGl2ZWx5LgorCisgICB0byBkbyAoc29tZWRheSwgbWF5YmUpOgorICAgIC0gZml4IGV4cG9zZS9yZWRyYXcgY29kZTogIGRvbid0IGRyYXcgZW50aXJlIHJvdyBpZiBvbmx5IHBhcnQgZXhwb3NlZAorICAgIC0gOC1iaXQgKGNvbG9ybWFwcGVkKSBYIHN1cHBvcnQKKyAgICAtIGZpbmlzaCByZXNpemFibGUgY2hlY2tlcmJvYXJkLWdyYWRpZW50IChzaXplcyA0LTEyOD8pCisgICAgLSB1c2UgJS4xMDIzcyB0byBzaW1wbGlmeSB0cnVuY2F0aW9uIG9mIHRpdGxlLWJhciBzdHJpbmc/CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIENoYW5nZWxvZzoKKyAgICAtIDEuMDE6ICBpbml0aWFsIHB1YmxpYyByZWxlYXNlCisgICAgLSAxLjAyOiAgbW9kaWZpZWQgdG8gYWxsb3cgYWJicmV2aWF0ZWQgb3B0aW9uczsgZml4ZWQgY2hhci91Y2hhciBtaXNtYXRjaAorICAgIC0gMS4xMDogIGFkZGVkIHN1cHBvcnQgZm9yIG5vbi1kZWZhdWx0IHZpc3VhbHM7IGZpeGVkIFggcGl4ZWwtY29udmVyc2lvbgorICAgIC0gMS4xMTogIGFkZGVkIC11c2xlZXAgb3B0aW9uIGZvciBkZW1vczsgZml4ZWQgY29tbWFuZC1saW5lIHBhcnNpbmcgYnVnCisgICAgLSAxLjEyOiAgYWRkZWQgLXBhdXNlIG9wdGlvbiBmb3IgZGVtb3MgYW5kIHRlc3RpbmcKKyAgICAtIDEuMjA6ICBhZGRlZCBydW50aW1lIE1NWC1lbmFibGluZy9kaXNhYmxpbmcgYW5kIG5ldyAtbW14KiBvcHRpb25zCisgICAgLSAxLjIxOiAgZml4ZWQgc29tZSBzbWFsbCBYIG1lbW9yeSBsZWFrcyAodGhhbmtzIHRvIEZyYW7nb2lzIFBldGl0amVhbikKKyAgICAtIDEuMjI6ICBmaXhlZCBYRnJlZUdDKCkgY3Jhc2ggYnVnICh0aGFua3MgdG8gUGF0cmljayBXZWxjaGUpCisgICAgLSAxLjIzOiAgYWRkZWQgLWJncGF0IDAgbW9kZSAoc3RkIHdoaXRlL2dyYXkgY2hlY2tlcmJvYXJkLCA4eDggc3F1YXJlcykKKyAgICAtIDEuMzA6ICBhZGRlZCAtbG9vcCBvcHRpb24gZm9yIC1iZ3BhdCAoaWZkZWYgRkVBVFVSRV9MT09QKTsgZml4ZWQgYnBwID0KKyAgICAgICAgICAgICAgMjQ7IGFkZGVkIHN1cHBvcnQgZm9yIFggcmVzb3VyY2VzICh0aGFua3MgdG8gR2VyaGFyZCBOaWtsYXNjaCkKKyAgICAtIDEuMzE6ICBhZGRlZCBjb2RlIHRvIHNraXAgdW51c2VkIGNodW5rcyAodGhhbmtzIHRvIEdsZW5uIFJhbmRlcnMtUGVocnNvbikKKyAgICAtIDEuMzI6ICBhZGRlZCBBTUQ2NC9FTTY0VCBzdXBwb3J0IChfX3g4Nl82NF9fKTsgYWRkZWQgYmFzaWMgZXhwb3NlL3JlZHJhdworICAgICAgICAgICAgICBoYW5kbGluZworICAgIC0gMi4wMDogIGR1YWwtbGljZW5zZWQgKGFkZGVkIEdOVSBHUEwpCisgICAgLSAyLjAxOiAgZml4ZWQgNjQtYml0IHR5cG8gaW4gcmVhZHBuZzIuYzsgZml4ZWQgLXBhdXNlIHVzYWdlIGRlc2NyaXB0aW9uCisgICAgLSAyLjAyOiAgZml4ZWQgaW1wcm9wZXIgZGlzcGxheSBvZiB1c2FnZSBzY3JlZW4gb24gUE5HIGVycm9yKHMpOyBmaXhlZAorICAgICAgICAgICAgICB1bmV4cGVjdGVkLUVPRiBhbmQgZmlsZS1yZWFkLWVycm9yIGNhc2VzOyBmaXhlZCBUcmFjZSgpIGN1dC1hbmQtCisgICAgICAgICAgICAgIHBhc3RlIGJ1Z3MKKyAgICAtIDIuMDM6ICBkZWxldGVkIHJ1bnRpbWUgTU1YLWVuYWJsaW5nL2Rpc2FibGluZyBhbmQgb2Jzb2xldGUgLW1teCogb3B0aW9ucworICAgIC0gMi4wNDogIEFkZGVkICJ2b2lkKGZvbyk7IiBzdGF0ZW1lbnRzIHRvIHF1aWV0IHBlZGFudGljIGNvbXBpbGVyIHdhcm5pbmdzCisgICAgICAgICAgICAgYWJvdXQgdW51c2VkIHZhcmlhYmxlcyAoR1ItUCkKKyAgICAtIDIuMDU6ICBVc2UgbmFub3NsZWVwKCkgaW5zdGVhZCBvZiB1c2xlZXAoKSwgd2hpY2ggaXMgZGVwcmVjYXRlZCAoR1ItUCkuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMCwgMjAxNC0yMDE1IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzLCIgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZCwKKyAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCisgICAgICBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBpbiBhbnkgd2F5IGZyb20gdGhlIHVzZSBvZgorICAgICAgdGhpcyBzb2Z0d2FyZS4KKworICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgRFVBTC1MSUNFTlNFRC4gIFlvdSBtYXkgbW9kaWZ5IGFuZC9vcgorICAgICAgcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiBvbmUgb2YgdGhlCisgICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6CisKKworICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKKworICAgICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCisgICAgICBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucy4KKyAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQorICAgICAgICAgdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisKKyAgICAgICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgR3JlZyBSb2Vsb2ZzCisgICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgorICAgICAgICAgICAgcHVibGlzaGVkIGJ5IE8nUmVpbGx5IGFuZCBBc3NvY2lhdGVzLgorCisKKyAgICAgIExJQ0VOU0UgMiAoR05VIEdQTCB2MiBvciBsYXRlcik6CisKKyAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgUFJPR05BTUUgICJycG5nMi14IgorI2RlZmluZSBMT05HTkFNRSAgIlByb2dyZXNzaXZlIFBORyBWaWV3ZXIgZm9yIFgiCisjZGVmaW5lIFZFUlNJT04gICAiMi4wNCBvZiAxNSBKdW5lIDIwMTQiCisjZGVmaW5lIFJFU05BTUUgICAicnBuZzIiICAgICAgIC8qIG91ciBYIHJlc291cmNlIGFwcGxpY2F0aW9uIG5hbWUgKi8KKyNkZWZpbmUgUkVTQ0xBU1MgICJScG5nIiAgICAgICAvKiBvdXIgWCByZXNvdXJjZSBjbGFzcyBuYW1lICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+ICAgICAgIC8qIGZvciBqbXBidWYgZGVjbGFyYXRpb24gaW4gcmVhZHBuZzIuaCAqLworI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxtYXRoLmg+ICAgICAgICAgLyogb25seSBmb3IgUHZkTSBiYWNrZ3JvdW5kIGNvZGUgKi8KKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgorI2luY2x1ZGUgPFgxMS9Yb3MuaD4KKyNpbmNsdWRlIDxYMTEva2V5c3ltLmg+ICAgLyogZGVmaW5lcyBYS18qIG1hY3JvcyAqLworCisjaWYgX1BPU0lYX0NfU09VUkNFID49IDE5OTMwOUwgLyogaGF2ZSBuYW5vc2xlZXAoKSAqLworIyB1bmRlZiB1c2xlZXAKKyMgZGVmaW5lIHVzbGVlcCh1c2VjKSB7ICAgICAgICBcCisgICBzdHJ1Y3QgdGltZXNwZWMgdHM7ICAgICAgICAgXAorICAgdHMudHZfc2VjID0gMDsgICAgICAgICAgICAgIFwKKyAgIHRzLnR2X25zZWMgPSAodXNlYykgKiAxMDAwOyBcCisgICBuYW5vc2xlZXAoJnRzLCBOVUxMKTsgfQorIyAgZW5kaWYKKworI2lmbmRlZiB1c2xlZXAgLyogaGF2ZSBuZWl0aGVyIG5hbm9zbGVlcCgpIG5vciB1c2xlZXAoKSAqLworIyAgZGVmaW5lIHVzbGVlcCh4KSBzbGVlcCgoKHgpKzQ5OTk5OSkvMTAwMDAwMCkKKyNlbmRpZgorCisjaWZkZWYgVk1TCisjICBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisvKiBhbGwgZm9yIFB2ZE0gYmFja2dyb3VuZCBjb2RlOiAqLworI2lmbmRlZiBQSQorIyAgZGVmaW5lIFBJICAgICAgICAgICAgIDMuMTQxNTkyNjUzNTg5NzkzMjM4CisjZW5kaWYKKyNkZWZpbmUgUElfMiAgICAgICAgICAgICAoUEkqMC41KQorI2RlZmluZSBJTlZfUElfMzYwICAgICAgICgzNjAuMCAvIFBJKQorI2RlZmluZSBNQVgoYSxiKSAgICAgICAgIChhPmI/YTpiKQorI2RlZmluZSBNSU4oYSxiKSAgICAgICAgIChhPGI/YTpiKQorI2RlZmluZSBDTElQKGEsbWluLG1heCkgIE1BWChtaW4sTUlOKChhKSxtYXgpKQorI2RlZmluZSBBQlMoYSkgICAgICAgICAgICgoYSk8MD8tKGEpOihhKSkKKyNkZWZpbmUgQ0xJUDhQKGMpICAgICAgICBNQVgoMCwoTUlOKChjKSwyNTUpKSkgICAvKiA4LWJpdCBwb3MuIGludGVnZXIgKHVjaCkgKi8KKyNkZWZpbmUgUk9VTkRGKGYpICAgICAgICAoKGludCkoZiArIDAuNSkpCisKKyNkZWZpbmUgUVVJVChlLGspICgoZS50eXBlID09IEJ1dHRvblByZXNzICYmIGUueGJ1dHRvbi5idXR0b24gPT0gQnV0dG9uMSkgfHwgIFwKKyAgICAgICAgICAgICAgICAgIChlLnR5cGUgPT0gS2V5UHJlc3MgJiYgICAvKiAgdi0tLSBvciAxIGZvciBzaGlmdGVkIGtleXMgKi8gIFwKKyAgICAgICAgICAgICAgICAgICgoayA9IFhMb29rdXBLZXlzeW0oJmUueGtleSwgMCkpID09IFhLX3EgfHwgayA9PSBYS19Fc2NhcGUpKSkKKworI2RlZmluZSBOT18yNEJJVF9NQVNLUyAvKiB1bmRlZiBjYXNlIG5vdCBmdWxseSB3cml0dGVuLS1vbmx5IGZvciByZWRpc3BsYXkoKSAqLworCisjZGVmaW5lIHJnYjFfbWF4ICAgYmdfZnJlcQorI2RlZmluZSByZ2IxX21pbiAgIGJnX2dyYXkKKyNkZWZpbmUgcmdiMl9tYXggICBiZ19ic2F0CisjZGVmaW5lIHJnYjJfbWluICAgYmdfYnJvdAorCisvKiAjZGVmaW5lIERFQlVHICovICAgICAvKiB0aGlzIGVuYWJsZXMgdGhlIFRyYWNlKCkgbWFjcm9zICovCisKKyNpbmNsdWRlICJyZWFkcG5nMi5oIiAgIC8qIHR5cGVkZWZzLCBjb21tb24gbWFjcm9zLCByZWFkcG5nMiBwcm90b3R5cGVzICovCisKKworLyogY291bGQganVzdCBpbmNsdWRlIHBuZy5oLCBidXQgdGhpcyBtYWNybyBpcyB0aGUgb25seSB0aGluZyB3ZSBuZWVkCisgKiAobmFtZSBhbmQgdHlwZWRlZnMgY2hhbmdlZCB0byBsb2NhbCB2ZXJzaW9ucyk7IG5vdGUgdGhhdCBzaWRlIGVmZmVjdHMKKyAqIG9ubHkgaGFwcGVuIHdpdGggYWxwaGEgKHdoaWNoIGNvdWxkIGVhc2lseSBiZSBhdm9pZGVkIHdpdGgKKyAqICJ1c2ggYWNvcHkgPSAoYWxwaGEpOyIpICovCisKKyNkZWZpbmUgYWxwaGFfY29tcG9zaXRlKGNvbXBvc2l0ZSwgZmcsIGFscGhhLCBiZykgeyAgICAgICAgICAgICAgIFwKKyAgICB1c2ggdGVtcCA9ICgodXNoKShmZykqKHVzaCkoYWxwaGEpICsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAodXNoKShiZykqKHVzaCkoMjU1IC0gKHVzaCkoYWxwaGEpKSArICh1c2gpMTI4KTsgIFwKKyAgICAoY29tcG9zaXRlKSA9ICh1Y2gpKCh0ZW1wICsgKHRlbXAgPj4gOCkpID4+IDgpOyAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElOQlVGU0laRSA0MDk2ICAgLyogd2l0aCBwc2V1ZG8tdGltaW5nIG9uICgxIHNlYyBkZWxheS9ibG9jayksIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgYmxvY2sgc2l6ZSBjb3JyZXNwb25kcyByb3VnaGx5IHRvIGEgZG93bmxvYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgc3BlZWQgMTAlIGZhc3RlciB0aGFuIHRoZW9yZXRpY2FsIDMzLjZLIG1heGltdW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgKGFzc3VtaW5nIDggZGF0YSBiaXRzLCAxIHN0b3AgYml0IGFuZCBubyBvdGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAqICBvdmVyaGVhZCkgKi8KKworLyogbG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIHZvaWQgcnBuZzJfeF9pbml0ICh2b2lkKTsKK3N0YXRpYyBpbnQgIHJwbmcyX3hfY3JlYXRlX3dpbmRvdyAodm9pZCk7CitzdGF0aWMgaW50ICBycG5nMl94X2xvYWRfYmdfaW1hZ2UgKHZvaWQpOworc3RhdGljIHZvaWQgcnBuZzJfeF9kaXNwbGF5X3JvdyAodWxnIHJvdyk7CitzdGF0aWMgdm9pZCBycG5nMl94X2ZpbmlzaF9kaXNwbGF5ICh2b2lkKTsKK3N0YXRpYyB2b2lkIHJwbmcyX3hfcmVkaXNwbGF5X2ltYWdlICh1bGcgc3RhcnRjb2wsIHVsZyBzdGFydHJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bGcgd2lkdGgsIHVsZyBoZWlnaHQpOworI2lmZGVmIEZFQVRVUkVfTE9PUAorc3RhdGljIHZvaWQgcnBuZzJfeF9yZWxvYWRfYmdfaW1hZ2UgKHZvaWQpOworc3RhdGljIGludCAgaXNfbnVtYmVyIChjaGFyICpwKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgcnBuZzJfeF9jbGVhbnVwICh2b2lkKTsKK3N0YXRpYyBpbnQgIHJwbmcyX3hfbXNiICh1bGcgdTMydmFsKTsKKworCitzdGF0aWMgY2hhciB0aXRsZWJhclsxMDI0XSwgKndpbmRvd19uYW1lID0gdGl0bGViYXI7CitzdGF0aWMgY2hhciAqYXBwbmFtZSA9IExPTkdOQU1FOworc3RhdGljIGNoYXIgKmljb25fbmFtZSA9IFBST0dOQU1FOworc3RhdGljIGNoYXIgKnJlc19uYW1lID0gUkVTTkFNRTsKK3N0YXRpYyBjaGFyICpyZXNfY2xhc3MgPSBSRVNDTEFTUzsKK3N0YXRpYyBjaGFyICpmaWxlbmFtZTsKK3N0YXRpYyBGSUxFICppbmZpbGU7CisKK3N0YXRpYyBtYWlucHJvZ19pbmZvIHJwbmcyX2luZm87CisKK3N0YXRpYyB1Y2ggaW5idWZbSU5CVUZTSVpFXTsKK3N0YXRpYyBpbnQgaW5jb3VudDsKKworc3RhdGljIGludCBwYXQgPSA2OyAgICAgICAgLyogbXVzdCBiZSBsZXNzIHRoYW4gbnVtX2JncGF0ICovCitzdGF0aWMgaW50IGJnX2ltYWdlID0gMDsKK3N0YXRpYyBpbnQgYmdzY2FsZSwgYmdzY2FsZV9kZWZhdWx0ID0gMTY7CitzdGF0aWMgdWxnIGJnX3Jvd2J5dGVzOworc3RhdGljIHVjaCAqYmdfZGF0YTsKKworaW50IHBhdXNlX2FmdGVyX3Bhc3MgPSBGQUxTRTsKK2ludCBkZW1vX3RpbWluZyA9IEZBTFNFOwordWxnIHVzbGVlcF9kdXJhdGlvbiA9IDBMOworCitzdGF0aWMgc3RydWN0IHJnYl9jb2xvciB7CisgICAgdWNoIHIsIGcsIGI7Cit9IHJnYltdID0geworICAgIHsgIDAsICAgMCwgICAwfSwgICAgLyogIDA6ICBibGFjayAqLworICAgIHsyNTUsIDI1NSwgMjU1fSwgICAgLyogIDE6ICB3aGl0ZSAqLworICAgIHsxNzMsIDEzMiwgIDU3fSwgICAgLyogIDI6ICB0YW4gKi8KKyAgICB7IDY0LCAxMzIsICAgMH0sICAgIC8qICAzOiAgbWVkaXVtIGdyZWVuICovCisgICAgezE4OSwgMTE3LCAgIDF9LCAgICAvKiAgNDogIGdvbGQgKi8KKyAgICB7MjUzLCAyNDksICAgMX0sICAgIC8qICA1OiAgeWVsbG93ICovCisgICAgeyAgMCwgICAwLCAyNTV9LCAgICAvKiAgNjogIGJsdWUgKi8KKyAgICB7ICAwLCAgIDAsIDEyMH0sICAgIC8qICA3OiAgbWVkaXVtIGJsdWUgKi8KKyAgICB7MjU1LCAgIDAsIDI1NX0sICAgIC8qICA4OiAgbWFnZW50YSAqLworICAgIHsgNjQsICAgMCwgIDY0fSwgICAgLyogIDk6ICBkYXJrIG1hZ2VudGEgKi8KKyAgICB7MjU1LCAgIDAsICAgMH0sICAgIC8qIDEwOiAgcmVkICovCisgICAgeyA2NCwgICAwLCAgIDB9LCAgICAvKiAxMTogIGRhcmsgcmVkICovCisgICAgezI1NSwgMTI3LCAgIDB9LCAgICAvKiAxMjogIG9yYW5nZSAqLworICAgIHsxOTIsICA5NiwgICAwfSwgICAgLyogMTM6ICBkYXJrZXIgb3JhbmdlICovCisgICAgeyAyNCwgIDYwLCAgIDB9LCAgICAvKiAxNDogIGRhcmsgZ3JlZW4teWVsbG93ICovCisgICAgeyA4NSwgMTI1LCAyMDB9LCAgICAvKiAxNTogIGljZSBibHVlICovCisgICAgezE5MiwgMTkyLCAxOTJ9ICAgICAvKiAxNjogIE5ldHNjYXBlL01vc2FpYyBncmF5ICovCit9OworLyogbm90IHVzZWQgZm9yIG5vdywgYnV0IHNob3VsZCBiZSBmb3IgZXJyb3ItY2hlY2tpbmc6CitzdGF0aWMgaW50IG51bV9yZ2IgPSBzaXplb2YocmdiKSAvIHNpemVvZihzdHJ1Y3QgcmdiX2NvbG9yKTsKKyAqLworCisvKgorICAgIFRoaXMgd2hvbGUgc3RydWN0IGlzIGEgZmFpcmx5IGNoZWVzeSB3YXkgdG8ga2VlcCB0aGUgbnVtYmVyIG9mCisgICAgY29tbWFuZC1saW5lIG9wdGlvbnMgdG8gYSBtaW5pbXVtLiAgVGhlIHJhZGlhbC13YXZlcyBiYWNrZ3JvdW5kCisgICAgdHlwZSBpcyBhIHBhcnRpY3VsYXJseSBwb29yIGZpdCB0byB0aGUgaW50ZWdlciBlbGVtZW50cyBvZiB0aGUKKyAgICBzdHJ1Y3QuLi5idXQgYSBmZXcgbWFjcm9zIGFuZCBhIGxpdHRsZSBmaXhlZC1wb2ludCBtYXRoIHdpbGwgZG8KKyAgICB3b25kZXJzIGZvciB5YS4KKworICAgIHR5cGUgYml0czoKKyAgICAgICBGIEUgRCBDIEIgQSA5IDggNyA2IDUgNCAzIDIgMSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8IHwgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgKy0rLSstLSAwID0gc2hhcnAtZWRnZWQgY2hlY2tlcmJvYXJkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCAgICAgICAgIDEgPSBzb2Z0IGRpYW1vbmRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCAgICAgICAgIDIgPSByYWRpYWwgd2F2ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8ICAgICAgIDMtNyA9IHVuZGVmaW5lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICstLSBncmFkaWVudCAjMiBpbnZlcnRlZD8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tIGFsdGVybmF0aW5nIGNvbHVtbnMgaW52ZXJ0ZWQ/CisgKi8KK3N0YXRpYyBzdHJ1Y3QgYmFja2dyb3VuZF9wYXR0ZXJuIHsKKyAgICB1c2ggdHlwZTsKKyAgICBpbnQgcmdiMV9tYXgsIHJnYjFfbWluOyAgICAgLyogb3IgYmdfZnJlcSwgYmdfZ3JheSAqLworICAgIGludCByZ2IyX21heCwgcmdiMl9taW47ICAgICAvKiBvciBiZ19ic2F0LCBiZ19icm90IChib3RoIHNjYWxlZCBieSAxMCkqLworfSBiZ1tdID0geworICAgIHswLCAgICAgMSwxLCAxNiwxNn0sICAgICAgICAvKiBjaGVja2VyZWQ6ICB3aGl0ZSB2cy4gbGlnaHQgZ3JheSAoYmFzaWMpICovCisgICAgezArOCwgICAyLDAsICAxLDE1fSwgICAgICAgIC8qIGNoZWNrZXJlZDogIHRhbi9ibGFjayB2cy4gd2hpdGUvaWNlIGJsdWUgKi8KKyAgICB7MCsyNCwgIDIsMCwgIDEsMH0sICAgICAgICAgLyogY2hlY2tlcmVkOiAgdGFuL2JsYWNrIHZzLiB3aGl0ZS9ibGFjayAqLworICAgIHswKzgsICAgNCw1LCAgMCwyfSwgICAgICAgICAvKiBjaGVja2VyZWQ6ICBnb2xkL3llbGxvdyB2cy4gYmxhY2svdGFuICovCisgICAgezArOCwgICA0LDUsICAwLDZ9LCAgICAgICAgIC8qIGNoZWNrZXJlZDogIGdvbGQveWVsbG93IHZzLiBibGFjay9ibHVlICovCisgICAgezAsICAgICA3LDAsICA4LDl9LCAgICAgICAgIC8qIGNoZWNrZXJlZDogIGRlZXAgYmx1ZS9ibGFjayB2cy4gbWFnZW50YSAqLworICAgIHswKzgsICAxMywwLCAgNSwxNH0sICAgICAgICAvKiBjaGVja2VyZWQ6ICBvcmFuZ2UvYmxhY2sgdnMuIHllbGxvdyAqLworICAgIHswKzgsICAxMiwwLCAxMCwxMX0sICAgICAgICAvKiBjaGVja2VyZWQ6ICBvcmFuZ2UvYmxhY2sgdnMuIHJlZCAqLworICAgIHsxLCAgICAgNywwLCAgOCwwfSwgICAgICAgICAvKiBkaWFtb25kczogIGRlZXAgYmx1ZS9ibGFjayB2cy4gbWFnZW50YSAqLworICAgIHsxLCAgICAxMiwwLCAxMSwwfSwgICAgICAgICAvKiBkaWFtb25kczogIG9yYW5nZSB2cy4gZGFyayByZWQgKi8KKyAgICB7MSwgICAgMTAsMCwgIDcsMH0sICAgICAgICAgLyogZGlhbW9uZHM6ICByZWQgdnMuIG1lZGl1bSBibHVlICovCisgICAgezEsICAgICA0LDAsICA1LDB9LCAgICAgICAgIC8qIGRpYW1vbmRzOiAgZ29sZCB2cy4geWVsbG93ICovCisgICAgezEsICAgICAzLDAsICAwLDB9LCAgICAgICAgIC8qIGRpYW1vbmRzOiAgbWVkaXVtIGdyZWVuIHZzLiBibGFjayAqLworICAgIHsyLCAgICAxNiwgMTAwLCAgMjAsICAgMH0sICAvKiByYWRpYWw6ICB+aGFyZCByYWRpYWwgY29sb3ItYmVhbXMgKi8KKyAgICB7MiwgICAgMTgsIDEwMCwgIDEwLCAgIDJ9LCAgLyogcmFkaWFsOiAgc29mdCwgY3VydmVkIHJhZGlhbCBjb2xvci1iZWFtcyAqLworICAgIHsyLCAgICAxNiwgMjU2LCAxMDAsIDI1MH0sICAvKiByYWRpYWw6ICB2ZXJ5IHRpZ2h0IHNwaXJhbCAqLworICAgIHsyLCAxMDAwMCwgMjU2LCAgMTEsICAgMH0gICAvKiByYWRpYWw6ICBkaXBvbGUtbW9pcmUnIChhbG1vc3QgZnJhY3RhbCkgKi8KK307CitzdGF0aWMgaW50IG51bV9iZ3BhdCA9IHNpemVvZihiZykgLyBzaXplb2Yoc3RydWN0IGJhY2tncm91bmRfcGF0dGVybik7CisKKworLyogWC1zcGVjaWZpYyB2YXJpYWJsZXMgKi8KK3N0YXRpYyBjaGFyICpkaXNwbGF5bmFtZTsKK3N0YXRpYyBYSW1hZ2UgKnhpbWFnZTsKK3N0YXRpYyBEaXNwbGF5ICpkaXNwbGF5Oworc3RhdGljIGludCBkZXB0aDsKK3N0YXRpYyBWaXN1YWwgKnZpc3VhbDsKK3N0YXRpYyBYVmlzdWFsSW5mbyAqdmlzdWFsX2xpc3Q7CitzdGF0aWMgaW50IFJTaGlmdCwgR1NoaWZ0LCBCU2hpZnQ7CitzdGF0aWMgdWxnIFJNYXNrLCBHTWFzaywgQk1hc2s7CitzdGF0aWMgV2luZG93IHdpbmRvdzsKK3N0YXRpYyBHQyBnYzsKK3N0YXRpYyBDb2xvcm1hcCBjb2xvcm1hcDsKKworc3RhdGljIGludCBoYXZlX25vbmRlZmF1bHRfdmlzdWFsID0gRkFMU0U7CitzdGF0aWMgaW50IGhhdmVfY29sb3JtYXAgPSBGQUxTRTsKK3N0YXRpYyBpbnQgaGF2ZV93aW5kb3cgPSBGQUxTRTsKK3N0YXRpYyBpbnQgaGF2ZV9nYyA9IEZBTFNFOworCisKKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisjaWZkZWYgc2dpCisgICAgY2hhciB0bXBsaW5lWzgwXTsKKyNlbmRpZgorICAgIGNoYXIgKnAsICpiZ3N0ciA9IE5VTEw7CisgICAgaW50IHJjLCBhbGVuLCBmbGVuOworICAgIGludCBlcnJvciA9IDA7CisgICAgaW50IHRpbWluZyA9IEZBTFNFOworICAgIGludCBoYXZlX2JnID0gRkFMU0U7CisjaWZkZWYgRkVBVFVSRV9MT09QCisgICAgaW50IGxvb3AgPSBGQUxTRTsKKyAgICBsb25nIGxvb3BfaW50ZXJ2YWwgPSAtMTsgICAgICAgICAgICAvKiBzZWNvbmRzICgxMDAsMDAwIG1heCkgKi8KKyNlbmRpZgorICAgIGRvdWJsZSBMVVRfZXhwb25lbnQ7ICAgICAgICAgICAgICAgIC8qIGp1c3QgdGhlIGxvb2t1cCB0YWJsZSAqLworICAgIGRvdWJsZSBDUlRfZXhwb25lbnQgPSAyLjI7ICAgICAgICAgIC8qIGp1c3QgdGhlIG1vbml0b3IgKi8KKyAgICBkb3VibGUgZGVmYXVsdF9kaXNwbGF5X2V4cG9uZW50OyAgICAvKiB3aG9sZSBkaXNwbGF5IHN5c3RlbSAqLworICAgIFhFdmVudCBlOworICAgIEtleVN5bSBrOworCisKKyAgICAvKiBGaXJzdCBpbml0aWFsaXplIGEgZmV3IHRoaW5ncywganVzdCB0byBiZSBzdXJlLS1tZW1zZXQgdGFrZXMgY2FyZSBvZgorICAgICAqIGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvciAoYmxhY2spLCBib29sZWFucyAoRkFMU0UpLCBwb2ludGVycyAoTlVMTCksCisgICAgICogZXRjLiAqLworCisgICAgZGlzcGxheW5hbWUgPSAoY2hhciAqKU5VTEw7CisgICAgZmlsZW5hbWUgPSAoY2hhciAqKU5VTEw7CisgICAgbWVtc2V0KCZycG5nMl9pbmZvLCAwLCBzaXplb2YobWFpbnByb2dfaW5mbykpOworCisKKyAgICAvKiBTZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIG91ciBkaXNwbGF5LXN5c3RlbSBleHBvbmVudCwgaS5lLiwgdGhlCisgICAgICogcHJvZHVjdCBvZiB0aGUgQ1JUIGV4cG9uZW50IGFuZCB0aGUgZXhwb25lbnQgY29ycmVzcG9uZGluZyB0bworICAgICAqIHRoZSBmcmFtZS1idWZmZXIncyBsb29rdXAgdGFibGUgKExVVCksIGlmIGFueS4gIFRoaXMgaXMgbm90IGFuCisgICAgICogZXhoYXVzdGl2ZSBsaXN0IG9mIExVVCB2YWx1ZXMgKGUuZy4sIE9wZW5TdGVwIGhhcyBhIGxvdCBvZiB3ZWlyZAorICAgICAqIG9uZXMpLCBidXQgaXQgc2hvdWxkIGNvdmVyIDk5JSBvZiB0aGUgY3VycmVudCBwb3NzaWJpbGl0aWVzLiAqLworCisjaWYgZGVmaW5lZChOZVhUKQorICAgIC8qIHRoaXJkLXBhcnR5IHV0aWxpdGllcyBjYW4gbW9kaWZ5IHRoZSBkZWZhdWx0IExVVCBleHBvbmVudCAqLworICAgIExVVF9leHBvbmVudCA9IDEuMCAvIDIuMjsKKyAgICAvKgorICAgIGlmIChzb21lX25leHRfZnVuY3Rpb25fdGhhdF9yZXR1cm5zX2dhbW1hKCZuZXh0X2dhbW1hKSkKKyAgICAgICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gbmV4dF9nYW1tYTsKKyAgICAgKi8KKyNlbGlmIGRlZmluZWQoc2dpKQorICAgIExVVF9leHBvbmVudCA9IDEuMCAvIDEuNzsKKyAgICAvKiB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYW55IGRvY3VtZW50ZWQgZnVuY3Rpb24gdG8KKyAgICAgKiBnZXQgdGhlICJnYW1tYSIgdmFsdWUsIHNvIHdlIGRvIGl0IHRoZSBoYXJkIHdheSAqLworICAgIGluZmlsZSA9IGZvcGVuKCIvZXRjL2NvbmZpZy9zeXN0ZW0uZ2xHYW1tYVZhbCIsICJyIik7CisgICAgaWYgKGluZmlsZSkgeworICAgICAgICBkb3VibGUgc2dpX2dhbW1hOworCisgICAgICAgIGZnZXRzKHRtcGxpbmUsIDgwLCBpbmZpbGUpOworICAgICAgICBmY2xvc2UoaW5maWxlKTsKKyAgICAgICAgc2dpX2dhbW1hID0gYXRvZih0bXBsaW5lKTsKKyAgICAgICAgaWYgKHNnaV9nYW1tYSA+IDAuMCkKKyAgICAgICAgICAgIExVVF9leHBvbmVudCA9IDEuMCAvIHNnaV9nYW1tYTsKKyAgICB9CisjZWxpZiBkZWZpbmVkKE1hY2ludG9zaCkKKyAgICBMVVRfZXhwb25lbnQgPSAxLjggLyAyLjYxOworICAgIC8qCisgICAgaWYgKHNvbWVfbWFjX2Z1bmN0aW9uX3RoYXRfcmV0dXJuc19nYW1tYSgmbWFjX2dhbW1hKSkKKyAgICAgICAgTFVUX2V4cG9uZW50ID0gbWFjX2dhbW1hIC8gMi42MTsKKyAgICAgKi8KKyNlbHNlCisgICAgTFVUX2V4cG9uZW50ID0gMS4wOyAgIC8qIGFzc3VtZSBubyBMVVQ6ICBtb3N0IFBDcyAqLworI2VuZGlmCisKKyAgICAvKiB0aGUgZGVmYXVsdHMgYWJvdmUgZ2l2ZSAxLjAsIDEuMywgMS41IGFuZCAyLjIsIHJlc3BlY3RpdmVseTogKi8KKyAgICBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQgPSBMVVRfZXhwb25lbnQgKiBDUlRfZXhwb25lbnQ7CisKKworICAgIC8qIElmIHRoZSB1c2VyIGhhcyBzZXQgdGhlIFNDUkVFTl9HQU1NQSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhcyBzdWdnZXN0ZWQKKyAgICAgKiAoc29tZXdoYXQgaW1wcmVjaXNlbHkpIGluIHRoZSBsaWJwbmcgZG9jdW1lbnRhdGlvbiwgdXNlIHRoYXQ7IG90aGVyd2lzZQorICAgICAqIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSB3ZSBqdXN0IGNhbGN1bGF0ZWQuICBFaXRoZXIgd2F5LCB0aGUgdXNlciBtYXkKKyAgICAgKiBvdmVycmlkZSB0aGlzIHZpYSBhIGNvbW1hbmQtbGluZSBvcHRpb24uICovCisKKyAgICBpZiAoKHAgPSBnZXRlbnYoIlNDUkVFTl9HQU1NQSIpKSAhPSBOVUxMKQorICAgICAgICBycG5nMl9pbmZvLmRpc3BsYXlfZXhwb25lbnQgPSBhdG9mKHApOworICAgIGVsc2UKKyAgICAgICAgcnBuZzJfaW5mby5kaXNwbGF5X2V4cG9uZW50ID0gZGVmYXVsdF9kaXNwbGF5X2V4cG9uZW50OworCisKKyAgICAvKiBOb3cgcGFyc2UgdGhlIGNvbW1hbmQgbGluZSBmb3Igb3B0aW9ucyBhbmQgdGhlIFBORyBmaWxlbmFtZS4gKi8KKworICAgIHdoaWxlICgqKythcmd2ICYmICFlcnJvcikgeworICAgICAgICBpZiAoIXN0cm5jbXAoKmFyZ3YsICItZGlzcGxheSIsIDIpKSB7CisgICAgICAgICAgICBpZiAoISorK2FyZ3YpCisgICAgICAgICAgICAgICAgKytlcnJvcjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkaXNwbGF5bmFtZSA9ICphcmd2OworICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKCphcmd2LCAiLWdhbW1hIiwgMikpIHsKKyAgICAgICAgICAgIGlmICghKisrYXJndikKKyAgICAgICAgICAgICAgICArK2Vycm9yOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcnBuZzJfaW5mby5kaXNwbGF5X2V4cG9uZW50ID0gYXRvZigqYXJndik7CisgICAgICAgICAgICAgICAgaWYgKHJwbmcyX2luZm8uZGlzcGxheV9leHBvbmVudCA8PSAwLjApCisgICAgICAgICAgICAgICAgICAgICsrZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItYmdjb2xvciIsIDQpKSB7CisgICAgICAgICAgICBpZiAoISorK2FyZ3YpCisgICAgICAgICAgICAgICAgKytlcnJvcjsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGJnc3RyID0gKmFyZ3Y7CisgICAgICAgICAgICAgICAgaWYgKHN0cmxlbihiZ3N0cikgIT0gNyB8fCBiZ3N0clswXSAhPSAnIycpCisgICAgICAgICAgICAgICAgICAgICsrZXJyb3I7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGhhdmVfYmcgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBiZ19pbWFnZSA9IEZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1iZ3BhdCIsIDQpKSB7CisgICAgICAgICAgICBpZiAoISorK2FyZ3YpCisgICAgICAgICAgICAgICAgKytlcnJvcjsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHBhdCA9IGF0b2koKmFyZ3YpOworICAgICAgICAgICAgICAgIGlmIChwYXQgPj0gMCAmJiBwYXQgPCBudW1fYmdwYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgYmdfaW1hZ2UgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBoYXZlX2JnID0gRkFMU0U7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICsrZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItdXNsZWVwIiwgMikpIHsKKyAgICAgICAgICAgIGlmICghKisrYXJndikKKyAgICAgICAgICAgICAgICArK2Vycm9yOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdXNsZWVwX2R1cmF0aW9uID0gKHVsZylhdG9sKCphcmd2KTsKKyAgICAgICAgICAgICAgICBkZW1vX3RpbWluZyA9IFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItcGF1c2UiLCAyKSkgeworICAgICAgICAgICAgcGF1c2VfYWZ0ZXJfcGFzcyA9IFRSVUU7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItdGltaW5nIiwgMikpIHsKKyAgICAgICAgICAgIHRpbWluZyA9IFRSVUU7CisjaWZkZWYgRkVBVFVSRV9MT09QCisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItbG9vcCIsIDIpKSB7CisgICAgICAgICAgICBsb29wID0gVFJVRTsKKyAgICAgICAgICAgIGlmICghYXJndlsxXSB8fCAhaXNfbnVtYmVyKGFyZ3ZbMV0pKQorICAgICAgICAgICAgICAgIGxvb3BfaW50ZXJ2YWwgPSAyOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgKythcmd2OworICAgICAgICAgICAgICAgIGxvb3BfaW50ZXJ2YWwgPSBhdG9sKCphcmd2KTsKKyAgICAgICAgICAgICAgICBpZiAobG9vcF9pbnRlcnZhbCA8IDApCisgICAgICAgICAgICAgICAgICAgIGxvb3BfaW50ZXJ2YWwgPSAyOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxvb3BfaW50ZXJ2YWwgPiAxMDAwMDApICAgLyogYml0IG1vcmUgdGhhbiBvbmUgZGF5ICovCisgICAgICAgICAgICAgICAgICAgIGxvb3BfaW50ZXJ2YWwgPSAxMDAwMDA7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgqKmFyZ3YgIT0gJy0nKSB7CisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSAqYXJndjsKKyAgICAgICAgICAgICAgICBpZiAoYXJndlsxXSkgICAvKiBzaG91bGRuJ3QgYmUgYW55IG1vcmUgYXJncyBhZnRlciBmaWxlbmFtZSAqLworICAgICAgICAgICAgICAgICAgICArK2Vycm9yOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgKytlcnJvcjsgICAvKiBub3QgZXhwZWN0aW5nIGFueSBvdGhlciBvcHRpb25zICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWZpbGVuYW1lKQorICAgICAgICArK2Vycm9yOworCisKKyAgICAvKiBwcmludCB1c2FnZSBzY3JlZW4gaWYgYW55IGVycm9ycyB1cCB0byB0aGlzIHBvaW50ICovCisKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiVzICVzOiAgJXNcblxuIiwgUFJPR05BTUUsIFZFUlNJT04sIGFwcG5hbWUpOworICAgICAgICByZWFkcG5nMl92ZXJzaW9uX2luZm8oKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIKKyAgICAgICAgICAiVXNhZ2U6ICAgIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICIlcyBbLWRpc3BsYXkgeGRweV0gWy1nYW1tYSBleHBdIFstYmdjb2xvciBiZyB8IC1iZ3BhdCBwYXRdXG4iCisgICAgICAgICAgIiAgICAgICAgJSpzIFstdXNsZWVwIGR1ciB8IC10aW1pbmddIFstcGF1c2VdXG4iLAorICAgICAgICAgIFBST0dOQU1FLCAoaW50KXN0cmxlbihQUk9HTkFNRSksICIgIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorI2lmZGVmIEZFQVRVUkVfTE9PUAorICAgICAgICAgICIgICAgICAgIFstbG9vcCBbc2VjXV0iCisjZW5kaWYKKyAgICAgICAgICAiIGZpbGUucG5nXG5cbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAiICAgIHhkcHlcdG5hbWUgb2YgdGhlIHRhcmdldCBYIGRpc3BsYXkgKGUuZy4sIGBgaG9zdG5hbWU6MCcnKVxuIgorICAgICAgICAgICIgICAgZXhwIFx0dHJhbnNmZXItZnVuY3Rpb24gZXhwb25lbnQgKGBgZ2FtbWEnJykgb2YgdGhlIGRpc3BsYXlcbiIKKyAgICAgICAgICAiXHRcdCAgc3lzdGVtIGluIGZsb2F0aW5nLXBvaW50IGZvcm1hdCAoZS5nLiwgYGAlLjFmJycpOyBlcXVhbFxuIgorICAgICAgICAgICJcdFx0ICB0byB0aGUgcHJvZHVjdCBvZiB0aGUgbG9va3VwLXRhYmxlIGV4cG9uZW50ICh2YXJpZXMpXG4iLAorICAgICAgICAgIGRlZmF1bHRfZGlzcGxheV9leHBvbmVudCk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICJcdFx0ICBhbmQgdGhlIENSVCBleHBvbmVudCAodXN1YWxseSAyLjIpOyBtdXN0IGJlIHBvc2l0aXZlXG4iCisgICAgICAgICAgIiAgICBiZyAgXHRkZXNpcmVkIGJhY2tncm91bmQgY29sb3IgaW4gNy1jaGFyYWN0ZXIgaGV4IFJHQiBmb3JtYXRcbiIKKyAgICAgICAgICAiXHRcdCAgKGUuZy4sIGBgI2ZmNzcwMCcnIGZvciBvcmFuZ2U6ICBzYW1lIGFzIEhUTUwgY29sb3JzKTtcbiIKKyAgICAgICAgICAiXHRcdCAgdXNlZCB3aXRoIHRyYW5zcGFyZW50IGltYWdlczsgb3ZlcnJpZGVzIC1iZ3BhdFxuIgorICAgICAgICAgICIgICAgcGF0IFx0ZGVzaXJlZCBiYWNrZ3JvdW5kIHBhdHRlcm4gbnVtYmVyICgwLSVkKTsgdXNlZCB3aXRoXG4iCisgICAgICAgICAgIlx0XHQgIHRyYW5zcGFyZW50IGltYWdlczsgb3ZlcnJpZGVzIC1iZ2NvbG9yXG4iLAorICAgICAgICAgIG51bV9iZ3BhdC0xKTsKKyNpZmRlZiBGRUFUVVJFX0xPT1AKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgIiAgICAtbG9vcFx0bG9vcHMgdGhyb3VnaCBiYWNrZ3JvdW5kIGltYWdlcyBhZnRlciBpbml0aWFsIGRpc3BsYXlcbiIKKyAgICAgICAgICAiXHRcdCAgaXMgY29tcGxldGUgKGRlcGVuZHMgb24gLWJncGF0KVxuIgorICAgICAgICAgICIgICAgc2VjIFx0c2Vjb25kcyB0byBkaXNwbGF5IGVhY2ggYmFja2dyb3VuZCBpbWFnZSAoZGVmYXVsdCA9IDIpXG4iKTsKKyNlbmRpZgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAiICAgIGR1ciBcdGR1cmF0aW9uIGluIG1pY3Jvc2Vjb25kcyB0byB3YWl0IGFmdGVyIGRpc3BsYXlpbmcgZWFjaFxuIgorICAgICAgICAgICJcdFx0ICByb3cgKGZvciBkZW1vIHB1cnBvc2VzKVxuIgorICAgICAgICAgICIgICAgLXRpbWluZ1x0ZW5hYmxlcyBkZWxheSBmb3IgZXZlcnkgYmxvY2sgcmVhZCwgdG8gc2ltdWxhdGUgbW9kZW1cbiIKKyAgICAgICAgICAiXHRcdCAgZG93bmxvYWQgb2YgaW1hZ2UgKH4zNiBLYnBzKVxuIgorICAgICAgICAgICIgICAgLXBhdXNlXHRwYXVzZXMgYWZ0ZXIgZGlzcGxheWluZyBlYWNoIHBhc3MgdW50aWwgbW91c2UgY2xpY2tlZFxuIgorICAgICAgICAgICJcblByZXNzIFEsIEVzYyBvciBtb3VzZSBidXR0b24gMSAod2l0aGluIGltYWdlIHdpbmRvdywgYWZ0ZXIgaW1hZ2VcbiIKKyAgICAgICAgICAiaXMgZGlzcGxheWVkKSB0byBxdWl0LlxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgaWYgKCEoaW5maWxlID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGNhbid0IG9wZW4gUE5HIGZpbGUgWyVzXVxuIiwgZmlsZW5hbWUpOworICAgICAgICArK2Vycm9yOworICAgIH0gZWxzZSB7CisgICAgICAgIGluY291bnQgPSBmcmVhZChpbmJ1ZiwgMSwgSU5CVUZTSVpFLCBpbmZpbGUpOworICAgICAgICBpZiAoaW5jb3VudCA8IDggfHwgIXJlYWRwbmcyX2NoZWNrX3NpZyhpbmJ1ZiwgOCkpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQorICAgICAgICAgICAgICAiOiAgWyVzXSBpcyBub3QgYSBQTkcgZmlsZTogaW5jb3JyZWN0IHNpZ25hdHVyZVxuIiwKKyAgICAgICAgICAgICAgZmlsZW5hbWUpOworICAgICAgICAgICAgKytlcnJvcjsKKyAgICAgICAgfSBlbHNlIGlmICgocmMgPSByZWFkcG5nMl9pbml0KCZycG5nMl9pbmZvKSkgIT0gMCkgeworICAgICAgICAgICAgc3dpdGNoIChyYykgeworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCisgICAgICAgICAgICAgICAgICAgICAgIjogIFslc10gaGFzIGJhZCBJSERSIChsaWJwbmcgbG9uZ2ptcClcbiIsIGZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGluc3VmZmljaWVudCBtZW1vcnlcbiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKKyAgICAgICAgICAgICAgICAgICAgICAiOiAgdW5rbm93biByZWFkcG5nMl9pbml0KCkgZXJyb3JcbiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrZXJyb3I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUcmFjZSgoc3RkZXJyLCAiYWJvdXQgdG8gY2FsbCBYT3BlbkRpc3BsYXkoKVxuIikpCisgICAgICAgICAgICBkaXNwbGF5ID0gWE9wZW5EaXNwbGF5KGRpc3BsYXluYW1lKTsKKyAgICAgICAgICAgIGlmICghZGlzcGxheSkgeworICAgICAgICAgICAgICAgIHJlYWRwbmcyX2NsZWFudXAoJnJwbmcyX2luZm8pOworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgY2FuJ3Qgb3BlbiBYIGRpc3BsYXkgWyVzXVxuIiwKKyAgICAgICAgICAgICAgICAgIGRpc3BsYXluYW1lPyBkaXNwbGF5bmFtZSA6ICJkZWZhdWx0Iik7CisgICAgICAgICAgICAgICAgKytlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyb3IpCisgICAgICAgICAgICBmY2xvc2UoaW5maWxlKTsKKyAgICB9CisKKworICAgIGlmIChlcnJvcikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGFib3J0aW5nLlxuIik7CisgICAgICAgIGV4aXQoMik7CisgICAgfQorCisKKyAgICAvKiBzZXQgdGhlIHRpdGxlLWJhciBzdHJpbmcsIGJ1dCBtYWtlIHN1cmUgYnVmZmVyIGRvZXNuJ3Qgb3ZlcmZsb3cgKi8KKworICAgIGFsZW4gPSBzdHJsZW4oYXBwbmFtZSk7CisgICAgZmxlbiA9IHN0cmxlbihmaWxlbmFtZSk7CisgICAgaWYgKGFsZW4gKyBmbGVuICsgMyA+IDEwMjMpCisgICAgICAgIHNwcmludGYodGl0bGViYXIsICIlczogIC4uLiVzIiwgYXBwbmFtZSwgZmlsZW5hbWUrKGFsZW4rZmxlbis2LTEwMjMpKTsKKyAgICBlbHNlCisgICAgICAgIHNwcmludGYodGl0bGViYXIsICIlczogICVzIiwgYXBwbmFtZSwgZmlsZW5hbWUpOworCisKKyAgICAvKiBzZXQgc29tZSBmaW5hbCBycG5nMl9pbmZvIHZhcmlhYmxlcyBiZWZvcmUgZW50ZXJpbmcgbWFpbiBkYXRhIGxvb3AgKi8KKworICAgIGlmIChoYXZlX2JnKSB7CisgICAgICAgIHVuc2lnbmVkIHIsIGcsIGI7ICAgLyogdGhpcyBhcHByb2FjaCBxdWlldHMgY29tcGlsZXIgd2FybmluZ3MgKi8KKworICAgICAgICBzc2NhbmYoYmdzdHIrMSwgIiUyeCUyeCUyeCIsICZyLCAmZywgJmIpOworICAgICAgICBycG5nMl9pbmZvLmJnX3JlZCAgID0gKHVjaClyOworICAgICAgICBycG5nMl9pbmZvLmJnX2dyZWVuID0gKHVjaClnOworICAgICAgICBycG5nMl9pbmZvLmJnX2JsdWUgID0gKHVjaCliOworICAgIH0gZWxzZQorICAgICAgICBycG5nMl9pbmZvLm5lZWRfYmdjb2xvciA9IFRSVUU7CisKKyAgICBycG5nMl9pbmZvLnN0YXRlID0ga1ByZUluaXQ7CisgICAgcnBuZzJfaW5mby5tYWlucHJvZ19pbml0ID0gcnBuZzJfeF9pbml0OworICAgIHJwbmcyX2luZm8ubWFpbnByb2dfZGlzcGxheV9yb3cgPSBycG5nMl94X2Rpc3BsYXlfcm93OworICAgIHJwbmcyX2luZm8ubWFpbnByb2dfZmluaXNoX2Rpc3BsYXkgPSBycG5nMl94X2ZpbmlzaF9kaXNwbGF5OworCisKKyAgICAvKiBPSywgdGhpcyBpcyB0aGUgZnVuIHBhcnQ6ICBjYWxsIHJlYWRwbmcyX2RlY29kZV9kYXRhKCkgYXQgdGhlIHN0YXJ0IG9mCisgICAgICogdGhlIGxvb3AgdG8gZGVhbCB3aXRoIG91ciBmaXJzdCBidWZmZXIgb2YgZGF0YSAocmVhZCBpbiBhYm92ZSB0byB2ZXJpZnkKKyAgICAgKiB0aGF0IHRoZSBmaWxlIGlzIGEgUE5HIGltYWdlKSwgdGhlbiBsb29wIHRocm91Z2ggdGhlIGZpbGUgYW5kIGNvbnRpbnVlCisgICAgICogY2FsbGluZyB0aGUgc2FtZSByb3V0aW5lIHRvIGhhbmRsZSBlYWNoIGNodW5rIG9mIGRhdGEuICBJdCBpbiB0dXJuCisgICAgICogcGFzc2VzIHRoZSBkYXRhIHRvIGxpYnBuZywgd2hpY2ggd2lsbCBpbnZva2Ugb25lIG9yIG1vcmUgb2Ygb3VyIGNhbGwtCisgICAgICogYmFja3MgYXMgZGVjb2RlZCBkYXRhIGJlY29tZSBhdmFpbGFibGUuICBXZSBvcHRpb25hbGx5IGNhbGwgc2xlZXAoKSBmb3IKKyAgICAgKiBvbmUgc2Vjb25kIHBlciBpdGVyYXRpb24gdG8gc2ltdWxhdGUgZG93bmxvYWRpbmcgdGhlIGltYWdlIHZpYSBhbiBhbmFsb2cKKyAgICAgKiBtb2RlbS4gKi8KKworICAgIGZvciAoOzspIHsKKyAgICAgICAgVHJhY2UoKHN0ZGVyciwgImFib3V0IHRvIGNhbGwgcmVhZHBuZzJfZGVjb2RlX2RhdGEoKVxuIikpCisgICAgICAgIGlmIChyZWFkcG5nMl9kZWNvZGVfZGF0YSgmcnBuZzJfaW5mbywgaW5idWYsIGluY291bnQpKQorICAgICAgICAgICAgKytlcnJvcjsKKyAgICAgICAgVHJhY2UoKHN0ZGVyciwgImRvbmUgd2l0aCByZWFkcG5nMl9kZWNvZGVfZGF0YSgpXG4iKSkKKworICAgICAgICBpZiAoZXJyb3IgfHwgaW5jb3VudCAhPSBJTkJVRlNJWkUgfHwgcnBuZzJfaW5mby5zdGF0ZSA9PSBrRG9uZSkgeworICAgICAgICAgICAgaWYgKHJwbmcyX2luZm8uc3RhdGUgPT0ga0RvbmUpIHsKKyAgICAgICAgICAgICAgICBUcmFjZSgoc3RkZXJyLCAiZG9uZSBkZWNvZGluZyBQTkcgaW1hZ2VcbiIpKQorICAgICAgICAgICAgfSBlbHNlIGlmIChmZXJyb3IoaW5maWxlKSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQorICAgICAgICAgICAgICAgICAgIjogIGVycm9yIHdoaWxlIHJlYWRpbmcgUE5HIGltYWdlIGZpbGVcbiIpOworICAgICAgICAgICAgICAgIGV4aXQoMyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZlb2YoaW5maWxlKSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgZW5kIG9mIGZpbGUgcmVhY2hlZCAiCisgICAgICAgICAgICAgICAgICAiKHVuZXhwZWN0ZWRseSkgd2hpbGUgcmVhZGluZyBQTkcgaW1hZ2UgZmlsZVxuIik7CisgICAgICAgICAgICAgICAgZXhpdCgzKTsKKyAgICAgICAgICAgIH0gZWxzZSAvKiBpZiAoZXJyb3IpICovIHsKKyAgICAgICAgICAgICAgICAvKiB3aWxsIHByaW50IGVycm9yIG1lc3NhZ2UgYmVsb3cgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRpbWluZykKKyAgICAgICAgICAgIHNsZWVwKDEpOworCisgICAgICAgIGluY291bnQgPSBmcmVhZChpbmJ1ZiwgMSwgSU5CVUZTSVpFLCBpbmZpbGUpOworICAgIH0KKworCisgICAgLyogY2xlYW4gdXAgUE5HIHN0dWZmIGFuZCByZXBvcnQgYW55IGRlY29kaW5nIGVycm9ycyAqLworCisgICAgZmNsb3NlKGluZmlsZSk7CisgICAgVHJhY2UoKHN0ZGVyciwgImFib3V0IHRvIGNhbGwgcmVhZHBuZzJfY2xlYW51cCgpXG4iKSkKKyAgICByZWFkcG5nMl9jbGVhbnVwKCZycG5nMl9pbmZvKTsKKworICAgIGlmIChlcnJvcikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGxpYnBuZyBlcnJvciB3aGlsZSBkZWNvZGluZyBQTkcgaW1hZ2VcbiIpOworICAgICAgICBleGl0KDMpOworICAgIH0KKworCisjaWZkZWYgRkVBVFVSRV9MT09QCisKKyAgICBpZiAobG9vcCAmJiBiZ19pbWFnZSkgeworICAgICAgICBUcmFjZSgoc3RkZXJyLCAiZW50ZXJpbmcgLWxvb3AgbG9vcCAoRkVBVFVSRV9MT09QKVxuIikpCisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIGludCBpLCB1c2Vfc2xlZXA7CisgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCBub3csIHRoZW47CisKKyAgICAgICAgICAgIC8qIGdldCBjdXJyZW50IHRpbWUgYW5kIGFkZCBsb29wX2ludGVydmFsIHRvIGdldCB0YXJnZXQgdGltZSAqLworICAgICAgICAgICAgaWYgKGdldHRpbWVvZmRheSgmdGhlbiwgTlVMTCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHRoZW4udHZfc2VjICs9IGxvb3BfaW50ZXJ2YWw7CisgICAgICAgICAgICAgICAgdXNlX3NsZWVwID0gRkFMU0U7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICB1c2Vfc2xlZXAgPSBUUlVFOworCisgICAgICAgICAgICAvKiBkbyBxdWljayBjaGVjayBmb3IgYSBxdWl0IGV2ZW50IGJ1dCBkb24ndCB3YWl0IGZvciBpdCAqLworICAgICAgICAgICAgLyogR1JSIEJVRzogIHNob3VsZCBhbHNvIGNoZWNrIGZvciBFeHBvc2UgZXZlbnRzIGFuZCByZWRyYXcuLi4gKi8KKyAgICAgICAgICAgIGlmIChYQ2hlY2tNYXNrRXZlbnQoZGlzcGxheSwgS2V5UHJlc3NNYXNrIHwgQnV0dG9uUHJlc3NNYXNrLCAmZSkpCisgICAgICAgICAgICAgICAgaWYgKFFVSVQoZSxrKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8qIGdlbmVyYXRlIG5leHQgYmFja2dyb3VuZCBpbWFnZSAqLworICAgICAgICAgICAgaWYgKCsrcGF0ID49IG51bV9iZ3BhdCkKKyAgICAgICAgICAgICAgICBwYXQgPSAwOworICAgICAgICAgICAgcnBuZzJfeF9yZWxvYWRfYmdfaW1hZ2UoKTsKKworICAgICAgICAgICAgLyogd2FpdCBmb3IgdGltZW91dCwgdXNpbmcgd2hhdGV2ZXIgbWVhbnMgYXJlIGF2YWlsYWJsZSAqLworICAgICAgICAgICAgaWYgKHVzZV9zbGVlcCB8fCBnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IGxvb3BfaW50ZXJ2YWw7ICBpID4gMDsgIC0taSkgeworICAgICAgICAgICAgICAgICAgICBzbGVlcCgxKTsKKyAgICAgICAgICAgICAgICAgICAgLyogR1JSIEJVRzogIGFsc28gbmVlZCB0byBjaGVjayBmb3IgRXhwb3NlIChhbmQgcmVkcmF3ISkgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKFhDaGVja01hc2tFdmVudChkaXNwbGF5LCBLZXlQcmVzc01hc2sgfCBCdXR0b25QcmVzc01hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAmZSkgJiYgUVVJVChlLGspKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBZMjAzOCBCVUchICovCisgICAgICAgICAgICAgICAgaWYgKG5vdy50dl9zZWMgPCB0aGVuLnR2X3NlYyB8fAorICAgICAgICAgICAgICAgICAgICAobm93LnR2X3NlYyA9PSB0aGVuLnR2X3NlYyAmJiBub3cudHZfdXNlYyA8IHRoZW4udHZfdXNlYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgcXVpdCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBsb25nIHNlY29uZHNfdG9fZ28gPSB0aGVuLnR2X3NlYyAtIG5vdy50dl9zZWM7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgdXNsZWVwX3VzZWM7CisKKyAgICAgICAgICAgICAgICAgICAgLyogYmFzaWNhbGx5IGNoZXcgdXAgbW9zdCBvZiByZW1haW5pbmcgbG9vcC1pbnRlcnZhbCB3aXRoCisgICAgICAgICAgICAgICAgICAgICAqICBjYWxscyB0byBzbGVlcCgxKSBpbnRlcmxlYXZlZCB3aXRoIGNoZWNrcyBmb3IgcXVpdAorICAgICAgICAgICAgICAgICAgICAgKiAgZXZlbnRzLCBidXQgYWxzbyByZWNhbGMgdGltZS10by1nbyBwZXJpb2RpY2FsbHk7IHdoZW4KKyAgICAgICAgICAgICAgICAgICAgICogIGRvbmUsIGNsZWFuIHVwIGFueSByZW1haW5pbmcgdGltZSB3aXRoIHVzbGVlcCgpIGNhbGwKKyAgICAgICAgICAgICAgICAgICAgICogIChjb3VsZCBhbHNvIHVzZSBTSUdBTFJNLCBidXQgc2lnbmFscyBhcmUgYSBwYWluLi4uKSAqLworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc2Vjb25kc190b19nby0tID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlY29uZHNfZG9uZSA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IHNlY29uZHNfdG9fZ287ICBpID4gMCAmJiAhcXVpdDsgIC0taSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdSUiBCVUc6ICBuZWVkIHRvIGNoZWNrIGZvciBFeHBvc2UgYW5kIHJlZHJhdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChYQ2hlY2tNYXNrRXZlbnQoZGlzcGxheSwgS2V5UHJlc3NNYXNrIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnV0dG9uUHJlc3NNYXNrLCAmZSkgJiYgUVVJVChlLGspKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWl0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKytzZWNvbmRzX2RvbmUgPiAxMDAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAvKiB0aW1lIHRvIHJlZG8gc2Vjb25kc190b19nbyBtZWFzLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1aXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9LLCBtb3JlIHRoYW4gMTAwMCBzZWNvbmRzIHNpbmNlIGxhc3QgY2hlY2s6CisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgY29ycmVjdCB0aGUgdGltZS10by1nbyBtZWFzdXJlbWVudCBmb3IgZHJpZnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3cudHZfc2VjID49IHRoZW4udHZfc2VjKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzX3RvX2dvID0gdGhlbi50dl9zZWMgLSBub3cudHZfc2VjOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytzZWNvbmRzX3RvX2dvOyAgLyogcmVzdG9yZSB3aGF0IHdlIHN1YnRyYWN0ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocXVpdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgIC8qIGJyZWFrcyBvdXRlciBkby1sb29wLCBza2lwcyByZWRpc3BsYXkgKi8KKworICAgICAgICAgICAgICAgICAgICAvKiBzaW5jZSBkaWZmZXJlbmNlIGJldHdlZW4gIm5vdyIgYW5kICJ0aGVuIiBpcyBhbHJlYWR5CisgICAgICAgICAgICAgICAgICAgICAqICBlYXRlbiB1cCB0byB3aXRoaW4gYSBjb3VwbGUgb2Ygc2Vjb25kcywgZG9uJ3QgbmVlZCB0bworICAgICAgICAgICAgICAgICAgICAgKiAgd29ycnkgYWJvdXQgb3ZlcmZsb3ctLWJ1dCBtaWdodCBoYXZlIG92ZXJzaG90IChuZWcuKSAqLworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzbGVlcF91c2VjID0gMTAwMDAwMEwqKHRoZW4udHZfc2VjIC0gbm93LnR2X3NlYykgKworICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuLnR2X3VzZWMgLSBub3cudHZfdXNlYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2xlZXBfdXNlYyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNsZWVwKCh1bGcpdXNsZWVwX3VzZWMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBjb21wb3NpdGUgaW1hZ2UgYWdhaW5zdCBuZXcgYmFja2dyb3VuZCBhbmQgZGlzcGxheSAobm90ZSB0aGF0CisgICAgICAgICAgICAgKiAgd2UgZG8gbm90IHRha2UgaW50byBhY2NvdW50IHRoZSB0aW1lIHNwZW50IGRvaW5nIHRoaXMuLi4pICovCisgICAgICAgICAgICBycG5nMl94X3JlZGlzcGxheV9pbWFnZSAoMCwgMCwgcnBuZzJfaW5mby53aWR0aCwgcnBuZzJfaW5mby5oZWlnaHQpOworICAgICAgICB9CisKKyAgICB9IGVsc2UgLyogRkFMTCBUSFJPVUdIIGFuZCBkbyB0aGUgbm9ybWFsIHRoaW5nICovCisKKyNlbmRpZiAvKiBGRUFUVVJFX0xPT1AgKi8KKworICAgIC8qIHdhaXQgZm9yIHRoZSB1c2VyIHRvIHRlbGwgdXMgd2hlbiB0byBxdWl0ICovCisKKyAgICBpZiAocnBuZzJfaW5mby5zdGF0ZSA+PSBrV2luZG93SW5pdCkgeworICAgICAgICBUcmFjZSgoc3RkZXJyLCAiZW50ZXJpbmcgZmluYWwgd2FpdC1mb3ItcXVpdC1ldmVudCBsb29wXG4iKSkKKyAgICAgICAgZG8geworICAgICAgICAgICAgWE5leHRFdmVudChkaXNwbGF5LCAmZSk7CisgICAgICAgICAgICBpZiAoZS50eXBlID09IEV4cG9zZSkgeworICAgICAgICAgICAgICAgIFhFeHBvc2VFdmVudCAqZXggPSAoWEV4cG9zZUV2ZW50ICopJmU7CisgICAgICAgICAgICAgICAgcnBuZzJfeF9yZWRpc3BsYXlfaW1hZ2UgKGV4LT54LCBleC0+eSwgZXgtPndpZHRoLCBleC0+aGVpZ2h0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoIVFVSVQoZSxrKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBpbml0IGNhbGxiYWNrIG5ldmVyIGNhbGxlZDogIHByb2JhYmxlICIKKyAgICAgICAgICAibGlicG5nIGVycm9yIHdoaWxlIGRlY29kaW5nIFBORyBtZXRhZGF0YVxuIik7CisgICAgICAgIGV4aXQoNCk7CisgICAgfQorCisKKyAgICAvKiB3ZSdyZSBkb25lOiAgY2xlYW4gdXAgYWxsIGltYWdlIGFuZCBYIHJlc291cmNlcyBhbmQgZ28gYXdheSAqLworCisgICAgVHJhY2UoKHN0ZGVyciwgImFib3V0IHRvIGNhbGwgcnBuZzJfeF9jbGVhbnVwKClcbiIpKQorICAgIHJwbmcyX3hfY2xlYW51cCgpOworCisgICAgKHZvaWQpYXJnYzsgLyogVW51c2VkICovCisKKyAgICByZXR1cm4gMDsKK30KKworCisKKworCisvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSByZWFkcG5nMl9pbmZvX2NhbGxiYWNrKCkgaW4gcmVhZHBuZzIuYywgd2hpY2gKKyAqIGluIHR1cm4gaXMgY2FsbGVkIGJ5IGxpYnBuZyBhZnRlciBhbGwgb2YgdGhlIHByZS1JREFUIGNodW5rcyBoYXZlIGJlZW4KKyAqIHJlYWQgYW5kIHByb2Nlc3NlZC0taS5lLiwgd2Ugbm93IGhhdmUgZW5vdWdoIGluZm8gdG8gZmluaXNoIGluaXRpYWxpemluZyAqLworCitzdGF0aWMgdm9pZCBycG5nMl94X2luaXQodm9pZCkKK3sKKyAgICB1bGcgaTsKKyAgICB1bGcgcm93Ynl0ZXMgPSBycG5nMl9pbmZvLnJvd2J5dGVzOworCisgICAgVHJhY2UoKHN0ZGVyciwgImJlZ2lubmluZyBycG5nMl94X2luaXQoKVxuIikpCisgICAgVHJhY2UoKHN0ZGVyciwgIiAgcm93Ynl0ZXMgPSAlZFxuIiwgcnBuZzJfaW5mby5yb3dieXRlcykpCisgICAgVHJhY2UoKHN0ZGVyciwgIiAgd2lkdGggID0gJWxkXG4iLCBycG5nMl9pbmZvLndpZHRoKSkKKyAgICBUcmFjZSgoc3RkZXJyLCAiICBoZWlnaHQgPSAlbGRcbiIsIHJwbmcyX2luZm8uaGVpZ2h0KSkKKworICAgIHJwbmcyX2luZm8uaW1hZ2VfZGF0YSA9ICh1Y2ggKiltYWxsb2Mocm93Ynl0ZXMgKiBycG5nMl9pbmZvLmhlaWdodCk7CisgICAgaWYgKCFycG5nMl9pbmZvLmltYWdlX2RhdGEpIHsKKyAgICAgICAgcmVhZHBuZzJfY2xlYW51cCgmcnBuZzJfaW5mbyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBycG5nMl9pbmZvLnJvd19wb2ludGVycyA9ICh1Y2ggKiopbWFsbG9jKHJwbmcyX2luZm8uaGVpZ2h0ICogc2l6ZW9mKHVjaCAqKSk7CisgICAgaWYgKCFycG5nMl9pbmZvLnJvd19wb2ludGVycykgeworICAgICAgICBmcmVlKHJwbmcyX2luZm8uaW1hZ2VfZGF0YSk7CisgICAgICAgIHJwbmcyX2luZm8uaW1hZ2VfZGF0YSA9IE5VTEw7CisgICAgICAgIHJlYWRwbmcyX2NsZWFudXAoJnJwbmcyX2luZm8pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChpID0gMDsgIGkgPCBycG5nMl9pbmZvLmhlaWdodDsgICsraSkKKyAgICAgICAgcnBuZzJfaW5mby5yb3dfcG9pbnRlcnNbaV0gPSBycG5nMl9pbmZvLmltYWdlX2RhdGEgKyBpKnJvd2J5dGVzOworCisKKyAgICAvKiBkbyB0aGUgYmFzaWMgWCBpbml0aWFsaXphdGlvbiBzdHVmZiwgbWFrZSB0aGUgd2luZG93LCBhbmQgZmlsbCBpdCB3aXRoCisgICAgICogdGhlIHVzZXItc3BlY2lmaWVkLCBmaWxlLXNwZWNpZmllZCBvciBkZWZhdWx0IGJhY2tncm91bmQgY29sb3Igb3IKKyAgICAgKiBwYXR0ZXJuICovCisKKyAgICBpZiAocnBuZzJfeF9jcmVhdGVfd2luZG93KCkpIHsKKworICAgICAgICAvKiBHUlIgVEVNUE9SQVJZIEhBQ0s6ICB0aGlzIGlzIGZ1bmRhbWVudGFsbHkgbm8gZGlmZmVyZW50IGZyb20gY2FzZXMKKyAgICAgICAgICogYWJvdmU7IGxpYnBuZyBzaG91bGQgY2FsbCBvdXIgZXJyb3IgaGFuZGxlciB0byBsb25nam1wKCkgYmFjayB0byB1cworICAgICAgICAgKiB3aGVuIHBuZ19wdHIgZ29lcyBhd2F5LiAgSWYgd2UvaXQgc2VnZmF1bHQgaW5zdGVhZCwgc2VlbXMgbGlrZSBhCisgICAgICAgICAqIGxpYnBuZyBidWcuLi4gKi8KKworICAgICAgICAvKiB3ZSdyZSBoZXJlIHZpYSBsaWJwbmcgY2FsbGJhY2ssIHNvIGlmIHdpbmRvdyBmYWlscywgY2xlYW4gYW5kIGJhaWwgKi8KKyAgICAgICAgcmVhZHBuZzJfY2xlYW51cCgmcnBuZzJfaW5mbyk7CisgICAgICAgIHJwbmcyX3hfY2xlYW51cCgpOworICAgICAgICBleGl0KDIpOworICAgIH0KKworICAgIHJwbmcyX2luZm8uc3RhdGUgPSBrV2luZG93SW5pdDsKK30KKworCisKKworCitzdGF0aWMgaW50IHJwbmcyX3hfY3JlYXRlX3dpbmRvdyh2b2lkKQoreworICAgIHVsZyBiZ19yZWQgICA9IHJwbmcyX2luZm8uYmdfcmVkOworICAgIHVsZyBiZ19ncmVlbiA9IHJwbmcyX2luZm8uYmdfZ3JlZW47CisgICAgdWxnIGJnX2JsdWUgID0gcnBuZzJfaW5mby5iZ19ibHVlOworICAgIHVsZyBiZ19waXhlbCA9IDBMOworICAgIHVsZyBhdHRybWFzazsKKyAgICBpbnQgbmVlZF9jb2xvcm1hcCA9IEZBTFNFOworICAgIGludCBzY3JlZW4sIHBhZDsKKyAgICB1Y2ggKnhkYXRhOworICAgIFdpbmRvdyByb290OworICAgIFhFdmVudCBlOworICAgIFhHQ1ZhbHVlcyBnY3ZhbHVlczsKKyAgICBYU2V0V2luZG93QXR0cmlidXRlcyBhdHRyOworICAgIFhUZXh0UHJvcGVydHkgd2luZG93TmFtZSwgKnBXaW5kb3dOYW1lID0gJndpbmRvd05hbWU7CisgICAgWFRleHRQcm9wZXJ0eSBpY29uTmFtZSwgKnBJY29uTmFtZSA9ICZpY29uTmFtZTsKKyAgICBYVmlzdWFsSW5mbyB2aXN1YWxfaW5mbzsKKyAgICBYU2l6ZUhpbnRzICpzaXplX2hpbnRzOworICAgIFhXTUhpbnRzICp3bV9oaW50czsKKyAgICBYQ2xhc3NIaW50ICpjbGFzc19oaW50czsKKworCisgICAgVHJhY2UoKHN0ZGVyciwgImJlZ2lubmluZyBycG5nMl94X2NyZWF0ZV93aW5kb3coKVxuIikpCisKKyAgICBzY3JlZW4gPSBEZWZhdWx0U2NyZWVuKGRpc3BsYXkpOworICAgIGRlcHRoID0gRGlzcGxheVBsYW5lcyhkaXNwbGF5LCBzY3JlZW4pOworICAgIHJvb3QgPSBSb290V2luZG93KGRpc3BsYXksIHNjcmVlbik7CisKKyNpZmRlZiBERUJVRworICAgIFhTeW5jaHJvbml6ZShkaXNwbGF5LCBUcnVlKTsKKyNlbmRpZgorCisgICAgaWYgKGRlcHRoICE9IDE2ICYmIGRlcHRoICE9IDI0ICYmIGRlcHRoICE9IDMyKSB7CisgICAgICAgIGludCB2aXN1YWxzX21hdGNoZWQgPSAwOworCisgICAgICAgIFRyYWNlKChzdGRlcnIsICJkZWZhdWx0IGRlcHRoIGlzICVkOiAgY2hlY2tpbmcgb3RoZXIgdmlzdWFsc1xuIiwKKyAgICAgICAgICBkZXB0aCkpCisKKyAgICAgICAgLyogMjQtYml0IGZpcnN0ICovCisgICAgICAgIHZpc3VhbF9pbmZvLnNjcmVlbiA9IHNjcmVlbjsKKyAgICAgICAgdmlzdWFsX2luZm8uZGVwdGggPSAyNDsKKyAgICAgICAgdmlzdWFsX2xpc3QgPSBYR2V0VmlzdWFsSW5mbyhkaXNwbGF5LAorICAgICAgICAgIFZpc3VhbFNjcmVlbk1hc2sgfCBWaXN1YWxEZXB0aE1hc2ssICZ2aXN1YWxfaW5mbywgJnZpc3VhbHNfbWF0Y2hlZCk7CisgICAgICAgIGlmICh2aXN1YWxzX21hdGNoZWQgPT0gMCkgeworLyogR1JSOiAgYWRkIDE1LSwgMTYtIGFuZCAzMi1iaXQgVHJ1ZUNvbG9yIHZpc3VhbHMgKGFsc28gRGlyZWN0Q29sb3I/KSAqLworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJkZWZhdWx0IHNjcmVlbiBkZXB0aCAlZCBub3Qgc3VwcG9ydGVkLCBhbmQgbm8iCisgICAgICAgICAgICAgICIgMjQtYml0IHZpc3VhbHMgZm91bmRcbiIsIGRlcHRoKTsKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9CisgICAgICAgIFRyYWNlKChzdGRlcnIsICJYR2V0VmlzdWFsSW5mbygpIHJldHVybmVkICVkIDI0LWJpdCB2aXN1YWxzXG4iLAorICAgICAgICAgIHZpc3VhbHNfbWF0Y2hlZCkpCisgICAgICAgIHZpc3VhbCA9IHZpc3VhbF9saXN0WzBdLnZpc3VhbDsKKyAgICAgICAgZGVwdGggPSB2aXN1YWxfbGlzdFswXS5kZXB0aDsKKy8qCisgICAgICAgIGNvbG9ybWFwX3NpemUgPSB2aXN1YWxfbGlzdFswXS5jb2xvcm1hcF9zaXplOworICAgICAgICB2aXN1YWxfY2xhc3MgPSB2aXN1YWwtPmNsYXNzOworICAgICAgICB2aXN1YWxJRCA9IFhWaXN1YWxJREZyb21WaXN1YWwodmlzdWFsKTsKKyAqLworICAgICAgICBoYXZlX25vbmRlZmF1bHRfdmlzdWFsID0gVFJVRTsKKyAgICAgICAgbmVlZF9jb2xvcm1hcCA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgWE1hdGNoVmlzdWFsSW5mbyhkaXNwbGF5LCBzY3JlZW4sIGRlcHRoLCBUcnVlQ29sb3IsICZ2aXN1YWxfaW5mbyk7CisgICAgICAgIHZpc3VhbCA9IHZpc3VhbF9pbmZvLnZpc3VhbDsKKyAgICB9CisKKyAgICBSTWFzayA9IHZpc3VhbC0+cmVkX21hc2s7CisgICAgR01hc2sgPSB2aXN1YWwtPmdyZWVuX21hc2s7CisgICAgQk1hc2sgPSB2aXN1YWwtPmJsdWVfbWFzazsKKworLyogR1JSOiAgYWRkL2NoZWNrIDgtYml0IHN1cHBvcnQgKi8KKyAgICBpZiAoZGVwdGggPT0gOCB8fCBuZWVkX2NvbG9ybWFwKSB7CisgICAgICAgIGNvbG9ybWFwID0gWENyZWF0ZUNvbG9ybWFwKGRpc3BsYXksIHJvb3QsIHZpc3VhbCwgQWxsb2NOb25lKTsKKyAgICAgICAgaWYgKCFjb2xvcm1hcCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJYQ3JlYXRlQ29sb3JtYXAoKSBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KKyAgICAgICAgaGF2ZV9jb2xvcm1hcCA9IFRSVUU7CisgICAgICAgIGlmIChkZXB0aCA9PSA4KQorICAgICAgICAgICAgYmdfaW1hZ2UgPSBGQUxTRTsgICAvKiBncmFkaWVudCBqdXN0IHdhc3RlcyBwYWxldHRlIGVudHJpZXMgKi8KKyAgICB9CisgICAgaWYgKGRlcHRoID09IDE1IHx8IGRlcHRoID09IDE2KSB7CisgICAgICAgIFJTaGlmdCA9IDE1IC0gcnBuZzJfeF9tc2IoUk1hc2spOyAgICAvKiB0aGVzZSBhcmUgcmlnaHQtc2hpZnRzICovCisgICAgICAgIEdTaGlmdCA9IDE1IC0gcnBuZzJfeF9tc2IoR01hc2spOworICAgICAgICBCU2hpZnQgPSAxNSAtIHJwbmcyX3hfbXNiKEJNYXNrKTsKKyAgICB9IGVsc2UgaWYgKGRlcHRoID4gMTYpIHsKKyAgICAgICAgUlNoaWZ0ID0gcnBuZzJfeF9tc2IoUk1hc2spIC0gNzsgICAgIC8qIHRoZXNlIGFyZSBsZWZ0LXNoaWZ0cyAqLworICAgICAgICBHU2hpZnQgPSBycG5nMl94X21zYihHTWFzaykgLSA3OworICAgICAgICBCU2hpZnQgPSBycG5nMl94X21zYihCTWFzaykgLSA3OworICAgIH0KKyAgICBpZiAoZGVwdGggPj0gMTUgJiYgKFJTaGlmdCA8IDAgfHwgR1NoaWZ0IDwgMCB8fCBCU2hpZnQgPCAwKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInJwbmcyIGludGVybmFsIGxvZ2ljIGVycm9yOiAgbmVnYXRpdmUgWCBzaGlmdChzKSFcbiIpOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmluYWxseSwgY3JlYXRlIHRoZSB3aW5kb3cuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBhdHRyLmJhY2tpbmdfc3RvcmUgPSBBbHdheXM7CisgICAgYXR0ci5ldmVudF9tYXNrID0gRXhwb3N1cmVNYXNrIHwgS2V5UHJlc3NNYXNrIHwgQnV0dG9uUHJlc3NNYXNrOworICAgIGF0dHJtYXNrID0gQ1dCYWNraW5nU3RvcmUgfCBDV0V2ZW50TWFzazsKKyAgICBpZiAoaGF2ZV9ub25kZWZhdWx0X3Zpc3VhbCkgeworICAgICAgICBhdHRyLmNvbG9ybWFwID0gY29sb3JtYXA7CisgICAgICAgIGF0dHIuYmFja2dyb3VuZF9waXhlbCA9IDA7CisgICAgICAgIGF0dHIuYm9yZGVyX3BpeGVsID0gMTsKKyAgICAgICAgYXR0cm1hc2sgfD0gQ1dDb2xvcm1hcCB8IENXQmFja1BpeGVsIHwgQ1dCb3JkZXJQaXhlbDsKKyAgICB9CisKKyAgICB3aW5kb3cgPSBYQ3JlYXRlV2luZG93KGRpc3BsYXksIHJvb3QsIDAsIDAsIHJwbmcyX2luZm8ud2lkdGgsCisgICAgICBycG5nMl9pbmZvLmhlaWdodCwgMCwgZGVwdGgsIElucHV0T3V0cHV0LCB2aXN1YWwsIGF0dHJtYXNrLCAmYXR0cik7CisKKyAgICBpZiAod2luZG93ID09IE5vbmUpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJYQ3JlYXRlV2luZG93KCkgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfSBlbHNlCisgICAgICAgIGhhdmVfd2luZG93ID0gVFJVRTsKKworICAgIGlmIChkZXB0aCA9PSA4KQorICAgICAgICBYU2V0V2luZG93Q29sb3JtYXAoZGlzcGxheSwgd2luZG93LCBjb2xvcm1hcCk7CisKKyAgICBpZiAoIVhTdHJpbmdMaXN0VG9UZXh0UHJvcGVydHkoJndpbmRvd19uYW1lLCAxLCBwV2luZG93TmFtZSkpCisgICAgICAgIHBXaW5kb3dOYW1lID0gTlVMTDsKKyAgICBpZiAoIVhTdHJpbmdMaXN0VG9UZXh0UHJvcGVydHkoJmljb25fbmFtZSwgMSwgcEljb25OYW1lKSkKKyAgICAgICAgcEljb25OYW1lID0gTlVMTDsKKworICAgIC8qIE9LIGlmIGVpdGhlciBoaW50cyBhbGxvY2F0aW9uIGZhaWxzOyBYU2V0V01Qcm9wZXJ0aWVzKCkgYWxsb3dzIE5VTExzICovCisKKyAgICBpZiAoKHNpemVfaGludHMgPSBYQWxsb2NTaXplSGludHMoKSkgIT0gTlVMTCkgeworICAgICAgICAvKiB3aW5kb3cgd2lsbCBub3QgYmUgcmVzaXphYmxlICovCisgICAgICAgIHNpemVfaGludHMtPmZsYWdzID0gUE1pblNpemUgfCBQTWF4U2l6ZTsKKyAgICAgICAgc2l6ZV9oaW50cy0+bWluX3dpZHRoID0gc2l6ZV9oaW50cy0+bWF4X3dpZHRoID0gKGludClycG5nMl9pbmZvLndpZHRoOworICAgICAgICBzaXplX2hpbnRzLT5taW5faGVpZ2h0ID0gc2l6ZV9oaW50cy0+bWF4X2hlaWdodCA9CisgICAgICAgICAgKGludClycG5nMl9pbmZvLmhlaWdodDsKKyAgICB9CisKKyAgICBpZiAoKHdtX2hpbnRzID0gWEFsbG9jV01IaW50cygpKSAhPSBOVUxMKSB7CisgICAgICAgIHdtX2hpbnRzLT5pbml0aWFsX3N0YXRlID0gTm9ybWFsU3RhdGU7CisgICAgICAgIHdtX2hpbnRzLT5pbnB1dCA9IFRydWU7CisgICAgIC8qIHdtX2hpbnRzLT5pY29uX3BpeG1hcCA9IGljb25fcGl4bWFwOyAqLworICAgICAgICB3bV9oaW50cy0+ZmxhZ3MgPSBTdGF0ZUhpbnQgfCBJbnB1dEhpbnQgIC8qIHwgSWNvblBpeG1hcEhpbnQgKi8gOworICAgIH0KKworICAgIGlmICgoY2xhc3NfaGludHMgPSBYQWxsb2NDbGFzc0hpbnQoKSkgIT0gTlVMTCkgeworICAgICAgICBjbGFzc19oaW50cy0+cmVzX25hbWUgPSByZXNfbmFtZTsKKyAgICAgICAgY2xhc3NfaGludHMtPnJlc19jbGFzcyA9IHJlc19jbGFzczsKKyAgICB9CisKKyAgICBYU2V0V01Qcm9wZXJ0aWVzKGRpc3BsYXksIHdpbmRvdywgcFdpbmRvd05hbWUsIHBJY29uTmFtZSwgTlVMTCwgMCwKKyAgICAgIHNpemVfaGludHMsIHdtX2hpbnRzLCBjbGFzc19oaW50cyk7CisKKyAgICAvKiB2YXJpb3VzIHByb3BlcnRpZXMgYW5kIGhpbnRzIG5vIGxvbmdlciBuZWVkZWQ7IGZyZWUgbWVtb3J5ICovCisgICAgaWYgKHBXaW5kb3dOYW1lKQorICAgICAgIFhGcmVlKHBXaW5kb3dOYW1lLT52YWx1ZSk7CisgICAgaWYgKHBJY29uTmFtZSkKKyAgICAgICBYRnJlZShwSWNvbk5hbWUtPnZhbHVlKTsKKyAgICBpZiAoc2l6ZV9oaW50cykKKyAgICAgICAgWEZyZWUoc2l6ZV9oaW50cyk7CisgICAgaWYgKHdtX2hpbnRzKQorICAgICAgIFhGcmVlKHdtX2hpbnRzKTsKKyAgICBpZiAoY2xhc3NfaGludHMpCisgICAgICAgWEZyZWUoY2xhc3NfaGludHMpOworCisgICAgWE1hcFdpbmRvdyhkaXNwbGF5LCB3aW5kb3cpOworCisgICAgZ2MgPSBYQ3JlYXRlR0MoZGlzcGxheSwgd2luZG93LCAwLCAmZ2N2YWx1ZXMpOworICAgIGhhdmVfZ2MgPSBUUlVFOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIFgtIGFuZCBkaXNwbGF5LXNwZWNpZmljIHZlcnNpb24gb2YgdGhlIGltYWdlLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgaWYgKGRlcHRoID09IDI0IHx8IGRlcHRoID09IDMyKSB7CisgICAgICAgIHhkYXRhID0gKHVjaCAqKW1hbGxvYyg0KnJwbmcyX2luZm8ud2lkdGgqcnBuZzJfaW5mby5oZWlnaHQpOworICAgICAgICBwYWQgPSAzMjsKKyAgICB9IGVsc2UgaWYgKGRlcHRoID09IDE2KSB7CisgICAgICAgIHhkYXRhID0gKHVjaCAqKW1hbGxvYygyKnJwbmcyX2luZm8ud2lkdGgqcnBuZzJfaW5mby5oZWlnaHQpOworICAgICAgICBwYWQgPSAxNjsKKyAgICB9IGVsc2UgLyogZGVwdGggPT0gOCAqLyB7CisgICAgICAgIHhkYXRhID0gKHVjaCAqKW1hbGxvYyhycG5nMl9pbmZvLndpZHRoKnJwbmcyX2luZm8uaGVpZ2h0KTsKKyAgICAgICAgcGFkID0gODsKKyAgICB9CisKKyAgICBpZiAoIXhkYXRhKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgdW5hYmxlIHRvIGFsbG9jYXRlIGltYWdlIG1lbW9yeVxuIik7CisgICAgICAgIHJldHVybiA0OworICAgIH0KKworICAgIHhpbWFnZSA9IFhDcmVhdGVJbWFnZShkaXNwbGF5LCB2aXN1YWwsIGRlcHRoLCBaUGl4bWFwLCAwLAorICAgICAgKGNoYXIgKil4ZGF0YSwgcnBuZzJfaW5mby53aWR0aCwgcnBuZzJfaW5mby5oZWlnaHQsIHBhZCwgMCk7CisKKyAgICBpZiAoIXhpbWFnZSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIFhDcmVhdGVJbWFnZSgpIGZhaWxlZFxuIik7CisgICAgICAgIGZyZWUoeGRhdGEpOworICAgICAgICByZXR1cm4gMzsKKyAgICB9CisKKyAgICAvKiB0byBhdm9pZCB0ZXN0aW5nIHRoZSBieXRlIG9yZGVyIGV2ZXJ5IHBpeGVsIChvciBkb3VibGluZyB0aGUgc2l6ZSBvZgorICAgICAqIHRoZSBkcmF3aW5nIHJvdXRpbmUgd2l0aCBhIGdpYW50IGlmLXRlc3QpLCB3ZSBhcmJpdHJhcmlseSBzZXQgdGhlIGJ5dGUKKyAgICAgKiBvcmRlciB0byBNU0JGaXJzdCBhbmQgbGV0IFhsaWIgd29ycnkgYWJvdXQgaW52ZXJ0aW5nIHRoaW5ncyBvbiBsaXR0bGUtCisgICAgICogZW5kaWFuIG1hY2hpbmVzIChlLmcuLCBMaW51eC94ODYsIG9sZCBWQVhlbiwgZXRjLiktLXRoaXMgaXMgbm90IHRoZQorICAgICAqIG1vc3QgZWZmaWNpZW50IGFwcHJvYWNoICh0aGUgZ2lhbnQgaWYtdGVzdCB3b3VsZCBiZSBiZXR0ZXIpLCBidXQgaW4KKyAgICAgKiB0aGUgaW50ZXJlc3Qgb2YgY2xhcml0eSwgd2UnbGwgdGFrZSB0aGUgZWFzeSB3YXkgb3V0Li4uICovCisKKyAgICB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaWxsIHdpbmRvdyB3aXRoIHRoZSBzcGVjaWZpZWQgYmFja2dyb3VuZCBjb2xvciAoZGVmYXVsdCBpcyBibGFjaykgb3IKKyAgICBmYWtlZCAiYmFja2dyb3VuZCBpbWFnZSIgKGJ1dCBsYXR0ZXIgaXMgZGlzYWJsZWQgaWYgOC1iaXQ7IGdyYWRpZW50cworICAgIGp1c3Qgd2FzdGUgcGFsZXR0ZSBlbnRyaWVzKS4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIGlmIChiZ19pbWFnZSkKKyAgICAgICAgcnBuZzJfeF9sb2FkX2JnX2ltYWdlKCk7ICAgIC8qIHJlc2V0cyBiZ19pbWFnZSBpZiBmYWlscyAqLworCisgICAgaWYgKCFiZ19pbWFnZSkgeworICAgICAgICBpZiAoZGVwdGggPT0gMjQgfHwgZGVwdGggPT0gMzIpIHsKKyAgICAgICAgICAgIGJnX3BpeGVsID0gKGJnX3JlZCAgIDw8IFJTaGlmdCkgfAorICAgICAgICAgICAgICAgICAgICAgICAoYmdfZ3JlZW4gPDwgR1NoaWZ0KSB8CisgICAgICAgICAgICAgICAgICAgICAgIChiZ19ibHVlICA8PCBCU2hpZnQpOworICAgICAgICB9IGVsc2UgaWYgKGRlcHRoID09IDE2KSB7CisgICAgICAgICAgICBiZ19waXhlbCA9ICgoKGJnX3JlZCAgIDw8IDgpID4+IFJTaGlmdCkgJiBSTWFzaykgfAorICAgICAgICAgICAgICAgICAgICAgICAoKChiZ19ncmVlbiA8PCA4KSA+PiBHU2hpZnQpICYgR01hc2spIHwKKyAgICAgICAgICAgICAgICAgICAgICAgKCgoYmdfYmx1ZSAgPDwgOCkgPj4gQlNoaWZ0KSAmIEJNYXNrKTsKKyAgICAgICAgfSBlbHNlIC8qIGRlcHRoID09IDggKi8geworCisgICAgICAgICAgICAvKiBHUlI6ICBhZGQgOC1iaXQgc3VwcG9ydCAqLworCisgICAgICAgIH0KKyAgICAgICAgWFNldEZvcmVncm91bmQoZGlzcGxheSwgZ2MsIGJnX3BpeGVsKTsKKyAgICAgICAgWEZpbGxSZWN0YW5nbGUoZGlzcGxheSwgd2luZG93LCBnYywgMCwgMCwgcnBuZzJfaW5mby53aWR0aCwKKyAgICAgICAgICBycG5nMl9pbmZvLmhlaWdodCk7CisgICAgfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFdhaXQgZm9yIGZpcnN0IEV4cG9zZSBldmVudCB0byBkbyBhbnkgZHJhd2luZywgdGhlbiBmbHVzaCBhbmQgcmV0dXJuLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgZG8KKyAgICAgICAgWE5leHRFdmVudChkaXNwbGF5LCAmZSk7CisgICAgd2hpbGUgKGUudHlwZSAhPSBFeHBvc2UgfHwgZS54ZXhwb3NlLmNvdW50KTsKKworICAgIFhGbHVzaChkaXNwbGF5KTsKKworICAgIHJldHVybiAwOworCit9IC8qIGVuZCBmdW5jdGlvbiBycG5nMl94X2NyZWF0ZV93aW5kb3coKSAqLworCisKKworCisKK3N0YXRpYyBpbnQgcnBuZzJfeF9sb2FkX2JnX2ltYWdlKHZvaWQpCit7CisgICAgdWNoICpzcmM7CisgICAgY2hhciAqZGVzdDsKKyAgICB1Y2ggcjEsIHIyLCBnMSwgZzIsIGIxLCBiMjsKKyAgICB1Y2ggcjFfaW52LCByMl9pbnYsIGcxX2ludiwgZzJfaW52LCBiMV9pbnYsIGIyX2ludjsKKyAgICBpbnQgaywgaG1heCwgbWF4OworICAgIGludCB4aWR4LCB5aWR4LCB5aWR4X21heDsKKyAgICBpbnQgZXZlbl9vZGRfdmVydCwgZXZlbl9vZGRfaG9yaXosIGV2ZW5fb2RkOworICAgIGludCBpbnZlcnRfZ3JhZGllbnQyID0gKGJnW3BhdF0udHlwZSAmIDB4MDgpOworICAgIGludCBpbnZlcnRfY29sdW1uOworICAgIGludCB4aW1hZ2Vfcm93Ynl0ZXMgPSB4aW1hZ2UtPmJ5dGVzX3Blcl9saW5lOworICAgIHVsZyBpLCByb3c7CisgICAgdWxnIHBpeGVsOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEFsbG9jYXRlIGJ1ZmZlciBmb3IgZmFrZSBiYWNrZ3JvdW5kIGltYWdlIHRvIGJlIHVzZWQgd2l0aCB0cmFuc3BhcmVudAorICAgIGltYWdlczsgaWYgdGhpcyBmYWlscywgcmV2ZXJ0IHRvIHBsYWluIGJhY2tncm91bmQgY29sb3IuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBiZ19yb3dieXRlcyA9IDMgKiBycG5nMl9pbmZvLndpZHRoOworICAgIGJnX2RhdGEgPSAodWNoICopbWFsbG9jKGJnX3Jvd2J5dGVzICogcnBuZzJfaW5mby5oZWlnaHQpOworICAgIGlmICghYmdfZGF0YSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKKyAgICAgICAgICAiOiAgdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgYmFja2dyb3VuZCBpbWFnZVxuIik7CisgICAgICAgIGJnX2ltYWdlID0gMDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgYmdzY2FsZSA9IChwYXQgPT0gMCk/IDggOiBiZ3NjYWxlX2RlZmF1bHQ7CisgICAgeWlkeF9tYXggPSBiZ3NjYWxlIC0gMTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBWZXJ0aWNhbCBncmFkaWVudHMgKHJhbXBzKSBpbiBOeE4gc3F1YXJlcywgYWx0ZXJuYXRpbmcgZGlyZWN0aW9uIGFuZAorICAgIGNvbG9ycyAoTiA9PSBiZ3NjYWxlKS4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIGlmICgoYmdbcGF0XS50eXBlICYgMHgwNykgPT0gMCkgeworICAgICAgICB1Y2ggcjFfbWluICA9IHJnYltiZ1twYXRdLnJnYjFfbWluXS5yOworICAgICAgICB1Y2ggZzFfbWluICA9IHJnYltiZ1twYXRdLnJnYjFfbWluXS5nOworICAgICAgICB1Y2ggYjFfbWluICA9IHJnYltiZ1twYXRdLnJnYjFfbWluXS5iOworICAgICAgICB1Y2ggcjJfbWluICA9IHJnYltiZ1twYXRdLnJnYjJfbWluXS5yOworICAgICAgICB1Y2ggZzJfbWluICA9IHJnYltiZ1twYXRdLnJnYjJfbWluXS5nOworICAgICAgICB1Y2ggYjJfbWluICA9IHJnYltiZ1twYXRdLnJnYjJfbWluXS5iOworICAgICAgICBpbnQgcjFfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5yIC0gcjFfbWluOworICAgICAgICBpbnQgZzFfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5nIC0gZzFfbWluOworICAgICAgICBpbnQgYjFfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5iIC0gYjFfbWluOworICAgICAgICBpbnQgcjJfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5yIC0gcjJfbWluOworICAgICAgICBpbnQgZzJfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5nIC0gZzJfbWluOworICAgICAgICBpbnQgYjJfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5iIC0gYjJfbWluOworCisgICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKKyAgICAgICAgICAgIHlpZHggPSAoaW50KShyb3cgJSBiZ3NjYWxlKTsKKyAgICAgICAgICAgIGV2ZW5fb2RkX3ZlcnQgPSAoaW50KSgocm93IC8gYmdzY2FsZSkgJiAxKTsKKworICAgICAgICAgICAgcjEgPSByMV9taW4gKyAocjFfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7CisgICAgICAgICAgICBnMSA9IGcxX21pbiArIChnMV9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKKyAgICAgICAgICAgIGIxID0gYjFfbWluICsgKGIxX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OworICAgICAgICAgICAgcjFfaW52ID0gcjFfbWluICsgKHIxX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7CisgICAgICAgICAgICBnMV9pbnYgPSBnMV9taW4gKyAoZzFfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKKyAgICAgICAgICAgIGIxX2ludiA9IGIxX21pbiArIChiMV9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OworCisgICAgICAgICAgICByMiA9IHIyX21pbiArIChyMl9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKKyAgICAgICAgICAgIGcyID0gZzJfbWluICsgKGcyX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OworICAgICAgICAgICAgYjIgPSBiMl9taW4gKyAoYjJfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7CisgICAgICAgICAgICByMl9pbnYgPSByMl9taW4gKyAocjJfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKKyAgICAgICAgICAgIGcyX2ludiA9IGcyX21pbiArIChnMl9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OworICAgICAgICAgICAgYjJfaW52ID0gYjJfbWluICsgKGIyX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7CisKKyAgICAgICAgICAgIGRlc3QgPSAoY2hhciAqKWJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IHJwbmcyX2luZm8ud2lkdGg7ICArK2kpIHsKKyAgICAgICAgICAgICAgICBldmVuX29kZF9ob3JpeiA9IChpbnQpKChpIC8gYmdzY2FsZSkgJiAxKTsKKyAgICAgICAgICAgICAgICBldmVuX29kZCA9IGV2ZW5fb2RkX3ZlcnQgXiBldmVuX29kZF9ob3JpejsKKyAgICAgICAgICAgICAgICBpbnZlcnRfY29sdW1uID0KKyAgICAgICAgICAgICAgICAgIChldmVuX29kZF9ob3JpeiAmJiAoYmdbcGF0XS50eXBlICYgMHgxMCkpOworICAgICAgICAgICAgICAgIGlmIChldmVuX29kZCA9PSAwKSB7ICAgICAgICAvKiBncmFkaWVudCAjMSAqLworICAgICAgICAgICAgICAgICAgICBpZiAoaW52ZXJ0X2NvbHVtbikgeworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHIxX2ludjsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnMV9pbnY7CisgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjFfaW52OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHIxOworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGcxOworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGIxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgIC8qIGdyYWRpZW50ICMyICovCisgICAgICAgICAgICAgICAgICAgIGlmICgoaW52ZXJ0X2NvbHVtbiAmJiBpbnZlcnRfZ3JhZGllbnQyKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKCFpbnZlcnRfY29sdW1uICYmICFpbnZlcnRfZ3JhZGllbnQyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHIyOyAgICAgICAvKiBub3QgaW52ZXJ0ZWQgb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnMjsgICAgICAgLyogIGRvdWJseSBpbnZlcnRlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGIyOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHIyX2ludjsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnMl9pbnY7ICAgLyogc2luZ2x5IGludmVydGVkICovCisgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjJfaW52OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU29mdCBncmFkaWVudC1kaWFtb25kcyB3aXRoIHNjYWxlID0gYmdzY2FsZS4gIENvZGUgY29udHJpYnV0ZWQgYnkgQWRhbQorICAgIE0uIENvc3RlbGxvLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgfSBlbHNlIGlmICgoYmdbcGF0XS50eXBlICYgMHgwNykgPT0gMSkgeworCisgICAgICAgIGhtYXggPSAoYmdzY2FsZS0xKS8yOyAgIC8qIGhhbGYgdGhlIG1heCB3ZWlnaHQgb2YgYSBjb2xvciAqLworICAgICAgICBtYXggPSAyKmhtYXg7ICAgICAgICAgICAvKiB0aGUgbWF4IHdlaWdodCBvZiBhIGNvbG9yICovCisKKyAgICAgICAgcjEgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0ucjsKKyAgICAgICAgZzEgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0uZzsKKyAgICAgICAgYjEgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0uYjsKKyAgICAgICAgcjIgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0ucjsKKyAgICAgICAgZzIgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0uZzsKKyAgICAgICAgYjIgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0uYjsKKworICAgICAgICBmb3IgKHJvdyA9IDA7ICByb3cgPCBycG5nMl9pbmZvLmhlaWdodDsgICsrcm93KSB7CisgICAgICAgICAgICB5aWR4ID0gKGludCkocm93ICUgYmdzY2FsZSk7CisgICAgICAgICAgICBpZiAoeWlkeCA+IGhtYXgpCisgICAgICAgICAgICAgICAgeWlkeCA9IGJnc2NhbGUtMSAtIHlpZHg7CisgICAgICAgICAgICBkZXN0ID0gKGNoYXIgKiliZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOworICAgICAgICAgICAgZm9yIChpID0gMDsgIGkgPCBycG5nMl9pbmZvLndpZHRoOyAgKytpKSB7CisgICAgICAgICAgICAgICAgeGlkeCA9IChpbnQpKGkgJSBiZ3NjYWxlKTsKKyAgICAgICAgICAgICAgICBpZiAoeGlkeCA+IGhtYXgpCisgICAgICAgICAgICAgICAgICAgIHhpZHggPSBiZ3NjYWxlLTEgLSB4aWR4OworICAgICAgICAgICAgICAgIGsgPSB4aWR4ICsgeWlkeDsKKyAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGsqcjEgKyAobWF4LWspKnIyKSAvIG1heDsKKyAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGsqZzEgKyAobWF4LWspKmcyKSAvIG1heDsKKyAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGsqYjEgKyAobWF4LWspKmIyKSAvIG1heDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFJhZGlhbCAic3RhcmJ1cnN0IiB3aXRoIGF6aW11dGhhbCBzaW51c29pZHM7IFtldmVudHVhbGx5IG51bWJlciBvZiBzaW51LQorICAgIHNvaWRzIHdpbGwgZXF1YWwgYmdzY2FsZT9dLiAgVGhpcyBvbmUgaXMgc2xvdyBidXQgdmVyeSBjb29sLiAgQ29kZSBjb24tCisgICAgdHJpYnV0ZWQgYnkgUGlldGVyIFMuIHZhbiBkZXIgTWV1bGVuIChvcmlnaW5hbGx5IGluIFNtYWxsdGFsaykuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICB9IGVsc2UgaWYgKChiZ1twYXRdLnR5cGUgJiAweDA3KSA9PSAyKSB7CisgICAgICAgIHVjaCBjaDsKKyAgICAgICAgaW50IGlpLCB4LCB5LCBodywgaGgsIGdyYXlzcG90OworICAgICAgICBkb3VibGUgZnJlcSwgcm90YXRlLCBzYXR1cmF0ZSwgZ3JheSwgaW50ZW5zaXR5OworICAgICAgICBkb3VibGUgYW5nbGU9MC4wLCBhb2Zmc2V0PTAuMCwgbWF4RGlzdCwgZGlzdDsKKyAgICAgICAgZG91YmxlIHJlZD0wLjAsIGdyZWVuPTAuMCwgYmx1ZT0wLjAsIGh1ZSwgcywgdiwgZiwgcCwgcSwgdDsKKworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAgY29tcHV0aW5nIHJhZGlhbCBiYWNrZ3JvdW5kLi4uIiwKKyAgICAgICAgICBQUk9HTkFNRSk7CisgICAgICAgIGZmbHVzaChzdGRlcnIpOworCisgICAgICAgIGhoID0gKGludCkocnBuZzJfaW5mby5oZWlnaHQgLyAyKTsKKyAgICAgICAgaHcgPSAoaW50KShycG5nMl9pbmZvLndpZHRoIC8gMik7CisKKyAgICAgICAgLyogdmFyaWFibGVzIGZvciByYWRpYWwgd2F2ZXM6CisgICAgICAgICAqICAgYW9mZnNldDogIG51bWJlciBvZiBkZWdyZWVzIHRvIHJvdGF0ZSBodWUgW0NVUlJFTlRMWSBOT1QgVVNFRF0KKyAgICAgICAgICogICBmcmVxOiAgbnVtYmVyIG9mIGNvbG9yIGJlYW1zIG9yaWdpbmF0aW5nIGZyb20gdGhlIGNlbnRlcgorICAgICAgICAgKiAgIGdyYXlzcG90OiAgc2l6ZSBvZiB0aGUgZ3JheWluZyBjZW50ZXIgYXJlYSAoYW50aS1hbGlhcykKKyAgICAgICAgICogICByb3RhdGU6ICByb3RhdGlvbiBvZiB0aGUgYmVhbXMgYXMgYSBmdW5jdGlvbiBvZiByYWRpdXMKKyAgICAgICAgICogICBzYXR1cmF0ZTogIHNhdHVyYXRpb24gb2YgYmVhbXMnIHNoYXBlIGF6aW11dGhhbGx5CisgICAgICAgICAqLworICAgICAgICBhbmdsZSA9IENMSVAoYW5nbGUsIDAuMCwgMzYwLjApOworICAgICAgICBncmF5c3BvdCA9IENMSVAoYmdbcGF0XS5iZ19ncmF5LCAxLCAoaGggKyBodykpOworICAgICAgICBmcmVxID0gTUFYKChkb3VibGUpYmdbcGF0XS5iZ19mcmVxLCAwLjApOworICAgICAgICBzYXR1cmF0ZSA9IChkb3VibGUpYmdbcGF0XS5iZ19ic2F0ICogMC4xOworICAgICAgICByb3RhdGUgPSAoZG91YmxlKWJnW3BhdF0uYmdfYnJvdCAqIDAuMTsKKyAgICAgICAgZ3JheSA9IDAuMDsKKyAgICAgICAgaW50ZW5zaXR5ID0gMC4wOworICAgICAgICBtYXhEaXN0ID0gKGRvdWJsZSkoKGh3Kmh3KSArIChoaCpoaCkpOworCisgICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKKyAgICAgICAgICAgIHkgPSAoaW50KShyb3cgLSBoaCk7CisgICAgICAgICAgICBkZXN0ID0gKGNoYXIgKiliZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOworICAgICAgICAgICAgZm9yIChpID0gMDsgIGkgPCBycG5nMl9pbmZvLndpZHRoOyAgKytpKSB7CisgICAgICAgICAgICAgICAgeCA9IChpbnQpKGkgLSBodyk7CisgICAgICAgICAgICAgICAgYW5nbGUgPSAoeCA9PSAwKT8gUElfMiA6IGF0YW4oKGRvdWJsZSl5IC8gKGRvdWJsZSl4KTsKKyAgICAgICAgICAgICAgICBncmF5ID0gKGRvdWJsZSlNQVgoQUJTKHkpLCBBQlMoeCkpIC8gZ3JheXNwb3Q7CisgICAgICAgICAgICAgICAgZ3JheSA9IE1JTigxLjAsIGdyYXkpOworICAgICAgICAgICAgICAgIGRpc3QgPSAoZG91YmxlKSgoeCp4KSArICh5KnkpKSAvIG1heERpc3Q7CisgICAgICAgICAgICAgICAgaW50ZW5zaXR5ID0gY29zKChhbmdsZSsocm90YXRlKmRpc3QqUEkpKSAqIGZyZXEpICoKKyAgICAgICAgICAgICAgICAgIGdyYXkgKiBzYXR1cmF0ZTsKKyAgICAgICAgICAgICAgICBpbnRlbnNpdHkgPSAoTUFYKE1JTihpbnRlbnNpdHksMS4wKSwtMS4wKSArIDEuMCkgKiAwLjU7CisgICAgICAgICAgICAgICAgaHVlID0gKGFuZ2xlICsgUEkpICogSU5WX1BJXzM2MCArIGFvZmZzZXQ7CisgICAgICAgICAgICAgICAgcyA9IGdyYXkgKiAoKGRvdWJsZSkoQUJTKHgpK0FCUyh5KSkgLyAoZG91YmxlKShodyArIGhoKSk7CisgICAgICAgICAgICAgICAgcyA9IE1JTihNQVgocywwLjApLCAxLjApOworICAgICAgICAgICAgICAgIHYgPSBNSU4oTUFYKGludGVuc2l0eSwwLjApLCAxLjApOworCisgICAgICAgICAgICAgICAgaWYgKHMgPT0gMC4wKSB7CisgICAgICAgICAgICAgICAgICAgIGNoID0gKHVjaCkodiAqIDI1NS4wKTsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGNoOworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gY2g7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBjaDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoKGh1ZSA8IDAuMCkgfHwgKGh1ZSA+PSAzNjAuMCkpCisgICAgICAgICAgICAgICAgICAgICAgICBodWUgLT0gKCgoaW50KShodWUgLyAzNjAuMCkpICogMzYwLjApOworICAgICAgICAgICAgICAgICAgICBodWUgLz0gNjAuMDsKKyAgICAgICAgICAgICAgICAgICAgaWkgPSAoaW50KWh1ZTsKKyAgICAgICAgICAgICAgICAgICAgZiA9IGh1ZSAtIChkb3VibGUpaWk7CisgICAgICAgICAgICAgICAgICAgIHAgPSAoMS4wIC0gcykgKiB2OworICAgICAgICAgICAgICAgICAgICBxID0gKDEuMCAtIChzICogZikpICogdjsKKyAgICAgICAgICAgICAgICAgICAgdCA9ICgxLjAgLSAocyAqICgxLjAgLSBmKSkpICogdjsKKyAgICAgICAgICAgICAgICAgICAgaWYgICAgICAoaWkgPT0gMCkgeyByZWQgPSB2OyBncmVlbiA9IHQ7IGJsdWUgPSBwOyB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlpID09IDEpIHsgcmVkID0gcTsgZ3JlZW4gPSB2OyBibHVlID0gcDsgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSAyKSB7IHJlZCA9IHA7IGdyZWVuID0gdjsgYmx1ZSA9IHQ7IH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gMykgeyByZWQgPSBwOyBncmVlbiA9IHE7IGJsdWUgPSB2OyB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlpID09IDQpIHsgcmVkID0gdDsgZ3JlZW4gPSBwOyBibHVlID0gdjsgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSA1KSB7IHJlZCA9IHY7IGdyZWVuID0gcDsgYmx1ZSA9IHE7IH0KKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9ICh1Y2gpKHJlZCAqIDI1NS4wKTsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9ICh1Y2gpKGdyZWVuICogMjU1LjApOworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKHVjaCkoYmx1ZSAqIDI1NS4wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJkb25lLlxuIik7CisgICAgICAgIGZmbHVzaChzdGRlcnIpOworICAgIH0KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBCbGFzdCBiYWNrZ3JvdW5kIGltYWdlIHRvIGRpc3BsYXkgYnVmZmVyIGJlZm9yZSBiZWdpbm5pbmcgUE5HIGRlY29kZS4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIGlmIChkZXB0aCA9PSAyNCB8fCBkZXB0aCA9PSAzMikgeworICAgICAgICB1bGcgcmVkLCBncmVlbiwgYmx1ZTsKKyAgICAgICAgaW50IGJwcCA9IHhpbWFnZS0+Yml0c19wZXJfcGl4ZWw7CisKKyAgICAgICAgZm9yIChyb3cgPSAwOyAgcm93IDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK3JvdykgeworICAgICAgICAgICAgc3JjID0gYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKKyAgICAgICAgICAgIGRlc3QgPSB4aW1hZ2UtPmRhdGEgKyByb3cqeGltYWdlX3Jvd2J5dGVzOworICAgICAgICAgICAgaWYgKGJwcCA9PSAzMikgeyAgICAvKiBzbGlnaHRseSBvcHRpbWl6ZWQgdmVyc2lvbiAqLworICAgICAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgeworICAgICAgICAgICAgICAgICAgICByZWQgICA9ICpzcmMrKzsKKyAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAqc3JjKys7CisgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKnNyYysrOworICAgICAgICAgICAgICAgICAgICBwaXhlbCA9IChyZWQgICA8PCBSU2hpZnQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3JlZW4gPDwgR1NoaWZ0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdWUgIDw8IEJTaGlmdCk7CisgICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgeworICAgICAgICAgICAgICAgICAgICByZWQgICA9ICpzcmMrKzsKKyAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAqc3JjKys7CisgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKnNyYysrOworICAgICAgICAgICAgICAgICAgICBwaXhlbCA9IChyZWQgICA8PCBSU2hpZnQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3JlZW4gPDwgR1NoaWZ0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdWUgIDw8IEJTaGlmdCk7CisgICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLworICAgICAgICAgICAgICAgICAgICAvKiBHUlIgQlVHPyAgdGhpcyBhc3N1bWVzIGJwcCA9PSAyNCAmIGJpdHMgYXJlIHBhY2tlZCBsb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgIChwcm9iYWJseSBuZWVkIHRvIHVzZSBSU2hpZnQsIFJNYXNrLCBldGMuKSAqLworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfSBlbHNlIGlmIChkZXB0aCA9PSAxNikgeworICAgICAgICB1c2ggcmVkLCBncmVlbiwgYmx1ZTsKKworICAgICAgICBmb3IgKHJvdyA9IDA7ICByb3cgPCBycG5nMl9pbmZvLmhlaWdodDsgICsrcm93KSB7CisgICAgICAgICAgICBzcmMgPSBiZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOworICAgICAgICAgICAgZGVzdCA9IHhpbWFnZS0+ZGF0YSArIHJvdyp4aW1hZ2Vfcm93Ynl0ZXM7CisgICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKKyAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKSgqc3JjKSA8PCA4KTsgICsrc3JjOworICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpKCpzcmMpIDw8IDgpOyAgKytzcmM7CisgICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCkoKnNyYykgPDwgOCk7ICArK3NyYzsKKyAgICAgICAgICAgICAgICBwaXhlbCA9ICgocmVkICAgPj4gUlNoaWZ0KSAmIFJNYXNrKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAoKGdyZWVuID4+IEdTaGlmdCkgJiBHTWFzaykgfAorICAgICAgICAgICAgICAgICAgICAgICAgKChibHVlICA+PiBCU2hpZnQpICYgQk1hc2spOworICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLworICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9IGVsc2UgLyogZGVwdGggPT0gOCAqLyB7CisKKyAgICAgICAgLyogR1JSOiAgYWRkIDgtYml0IHN1cHBvcnQgKi8KKworICAgIH0KKworICAgIFhQdXRJbWFnZShkaXNwbGF5LCB3aW5kb3csIGdjLCB4aW1hZ2UsIDAsIDAsIDAsIDAsIHJwbmcyX2luZm8ud2lkdGgsCisgICAgICBycG5nMl9pbmZvLmhlaWdodCk7CisKKyAgICByZXR1cm4gMDsKKworfSAvKiBlbmQgZnVuY3Rpb24gcnBuZzJfeF9sb2FkX2JnX2ltYWdlKCkgKi8KKworCisKKworCitzdGF0aWMgdm9pZCBycG5nMl94X2Rpc3BsYXlfcm93KHVsZyByb3cpCit7CisgICAgdWNoIGJnX3JlZCAgID0gcnBuZzJfaW5mby5iZ19yZWQ7CisgICAgdWNoIGJnX2dyZWVuID0gcnBuZzJfaW5mby5iZ19ncmVlbjsKKyAgICB1Y2ggYmdfYmx1ZSAgPSBycG5nMl9pbmZvLmJnX2JsdWU7CisgICAgdWNoICpzcmMsICpzcmMyPU5VTEw7CisgICAgY2hhciAqZGVzdDsKKyAgICB1Y2ggciwgZywgYiwgYTsKKyAgICBpbnQgeGltYWdlX3Jvd2J5dGVzID0geGltYWdlLT5ieXRlc19wZXJfbGluZTsKKyAgICB1bGcgaSwgcGl4ZWw7CisgICAgc3RhdGljIGludCByb3dzPTAsIHByZXZwYXNzPSgtMSk7CisgICAgc3RhdGljIHVsZyBmaXJzdHJvdzsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICByb3dzIGFuZCBmaXJzdHJvdyBzaW1wbHkgdHJhY2sgaG93IG1hbnkgcm93cyAoYW5kIHdoaWNoIG9uZXMpIGhhdmUgbm90CisgICAgeWV0IGJlZW4gZGlzcGxheWVkOyBhbHRlcm5hdGl2ZWx5LCB3ZSBjb3VsZCBjYWxsIFhQdXRJbWFnZSgpIGZvciBldmVyeQorICAgIHJvdyBhbmQgbm90IGJvdGhlciB3aXRoIHRoZSByZWNvcmRzLWtlZXBpbmcuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBUcmFjZSgoc3RkZXJyLCAiYmVnaW5uaW5nIHJwbmcyX3hfZGlzcGxheV9yb3coKVxuIikpCisKKyAgICBpZiAocnBuZzJfaW5mby5wYXNzICE9IHByZXZwYXNzKSB7CisgICAgICAgIGlmIChwYXVzZV9hZnRlcl9wYXNzICYmIHJwbmcyX2luZm8ucGFzcyA+IDApIHsKKyAgICAgICAgICAgIFhFdmVudCBlOworICAgICAgICAgICAgS2V5U3ltIGs7CisKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAiJXM6ICBlbmQgb2YgcGFzcyAlZCBvZiA3OyBjbGljayBpbiBpbWFnZSB3aW5kb3cgdG8gY29udGludWVcbiIsCisgICAgICAgICAgICAgIFBST0dOQU1FLCBwcmV2cGFzcyArIDEpOworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICBYTmV4dEV2ZW50KGRpc3BsYXksICZlKTsKKyAgICAgICAgICAgIHdoaWxlICghUVVJVChlLGspKTsKKyAgICAgICAgfQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAgcGFzcyAlZCBvZiA3XHIiLCBQUk9HTkFNRSwgcnBuZzJfaW5mby5wYXNzICsgMSk7CisgICAgICAgIGZmbHVzaChzdGRlcnIpOworICAgICAgICBwcmV2cGFzcyA9IHJwbmcyX2luZm8ucGFzczsKKyAgICB9CisKKyAgICBpZiAocm93cyA9PSAwKQorICAgICAgICBmaXJzdHJvdyA9IHJvdzsgICAvKiBmaXJzdCByb3cgdGhhdCBpcyBub3QgeWV0IGRpc3BsYXllZCAqLworCisgICAgKytyb3dzOyAgIC8qIGNvdW50IG9mIHJvd3MgcmVjZWl2ZWQgYnV0IG5vdCB5ZXQgZGlzcGxheWVkICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQXNpZGUgZnJvbSB0aGUgdXNlIG9mIHRoZSBycG5nMl9pbmZvIHN0cnVjdCwgdGhlIGxhY2sgb2YgYW4gb3V0ZXIgbG9vcAorICAgIChvdmVyIHJvd3MpIGFuZCBtb3ZpbmcgdGhlIFhQdXRJbWFnZSgpIGNhbGwgb3V0c2lkZSB0aGUgImlmIChkZXB0aCkiCisgICAgdGVzdHMsIHRoaXMgcm91dGluZSBpcyBpZGVudGljYWwgdG8gcnBuZ194X2Rpc3BsYXlfaW1hZ2UoKSBpbiB0aGUgbm9uLQorICAgIHByb2dyZXNzaXZlIHZlcnNpb24gb2YgdGhlIHByb2dyYW0uCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBpZiAoZGVwdGggPT0gMjQgfHwgZGVwdGggPT0gMzIpIHsKKyAgICAgICAgdWxnIHJlZCwgZ3JlZW4sIGJsdWU7CisgICAgICAgIGludCBicHAgPSB4aW1hZ2UtPmJpdHNfcGVyX3BpeGVsOworCisgICAgICAgIHNyYyA9IHJwbmcyX2luZm8uaW1hZ2VfZGF0YSArIHJvdypycG5nMl9pbmZvLnJvd2J5dGVzOworICAgICAgICBpZiAoYmdfaW1hZ2UpCisgICAgICAgICAgICBzcmMyID0gYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKKyAgICAgICAgZGVzdCA9IHhpbWFnZS0+ZGF0YSArIHJvdyp4aW1hZ2Vfcm93Ynl0ZXM7CisgICAgICAgIGlmIChycG5nMl9pbmZvLmNoYW5uZWxzID09IDMpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgeworICAgICAgICAgICAgICAgIHJlZCAgID0gKnNyYysrOworICAgICAgICAgICAgICAgIGdyZWVuID0gKnNyYysrOworICAgICAgICAgICAgICAgIGJsdWUgID0gKnNyYysrOworICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAgIDw8IFJTaGlmdCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgKGdyZWVuIDw8IEdTaGlmdCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgKGJsdWUgIDw8IEJTaGlmdCk7CisgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCisgICAgICAgICAgICAgICAgaWYgKGJwcCA9PSAzMikgeworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBHUlIgQlVHPyAgdGhpcyBhc3N1bWVzIGJwcCA9PSAyNCAmIGJpdHMgYXJlIHBhY2tlZCBsb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgIChwcm9iYWJseSBuZWVkIHRvIHVzZSBSU2hpZnQsIFJNYXNrLCBldGMuKSAqLworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIC8qIGlmIChycG5nMl9pbmZvLmNoYW5uZWxzID09IDQpICovIHsKKyAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgeworICAgICAgICAgICAgICAgIHIgPSAqc3JjKys7CisgICAgICAgICAgICAgICAgZyA9ICpzcmMrKzsKKyAgICAgICAgICAgICAgICBiID0gKnNyYysrOworICAgICAgICAgICAgICAgIGEgPSAqc3JjKys7CisgICAgICAgICAgICAgICAgaWYgKGJnX2ltYWdlKSB7CisgICAgICAgICAgICAgICAgICAgIGJnX3JlZCAgID0gKnNyYzIrKzsKKyAgICAgICAgICAgICAgICAgICAgYmdfZ3JlZW4gPSAqc3JjMisrOworICAgICAgICAgICAgICAgICAgICBiZ19ibHVlICA9ICpzcmMyKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhID09IDI1NSkgeworICAgICAgICAgICAgICAgICAgICByZWQgICA9IHI7CisgICAgICAgICAgICAgICAgICAgIGdyZWVuID0gZzsKKyAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSBiOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gYmdfcmVkOworICAgICAgICAgICAgICAgICAgICBncmVlbiA9IGJnX2dyZWVuOworICAgICAgICAgICAgICAgICAgICBibHVlICA9IGJnX2JsdWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBtYWNybyAoZnJvbSBwbmcuaCkgY29tcG9zaXRlcyB0aGUgZm9yZWdyb3VuZAorICAgICAgICAgICAgICAgICAgICAgKiBhbmQgYmFja2dyb3VuZCB2YWx1ZXMgYW5kIHB1dHMgdGhlIHJlc3VsdCBpbnRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgKiBmaXJzdCBhcmd1bWVudCAqLworICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUocmVkLCAgIHIsIGEsIGJnX3JlZCk7CisgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShncmVlbiwgZywgYSwgYmdfZ3JlZW4pOworICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoYmx1ZSwgIGIsIGEsIGJnX2JsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwaXhlbCA9IChyZWQgICA8PCBSU2hpZnQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChncmVlbiA8PCBHU2hpZnQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChibHVlICA8PCBCU2hpZnQpOworICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLworICAgICAgICAgICAgICAgIGlmIChicHAgPT0gMzIpIHsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogR1JSIEJVRz8gIHRoaXMgYXNzdW1lcyBicHAgPT0gMjQgJiBiaXRzIGFyZSBwYWNrZWQgbG93ICovCisgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAocHJvYmFibHkgbmVlZCB0byB1c2UgUlNoaWZ0LCBSTWFzaywgZXRjLikgKi8KKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMTYpIHsKKyAgICAgICAgdXNoIHJlZCwgZ3JlZW4sIGJsdWU7CisKKyAgICAgICAgc3JjID0gcnBuZzJfaW5mby5yb3dfcG9pbnRlcnNbcm93XTsKKyAgICAgICAgaWYgKGJnX2ltYWdlKQorICAgICAgICAgICAgc3JjMiA9IGJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7CisgICAgICAgIGRlc3QgPSB4aW1hZ2UtPmRhdGEgKyByb3cqeGltYWdlX3Jvd2J5dGVzOworICAgICAgICBpZiAocnBuZzJfaW5mby5jaGFubmVscyA9PSAzKSB7CisgICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKKyAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKSgqc3JjKSA8PCA4KTsKKyAgICAgICAgICAgICAgICArK3NyYzsKKyAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKSgqc3JjKSA8PCA4KTsKKyAgICAgICAgICAgICAgICArK3NyYzsKKyAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKSgqc3JjKSA8PCA4KTsKKyAgICAgICAgICAgICAgICArK3NyYzsKKyAgICAgICAgICAgICAgICBwaXhlbCA9ICgocmVkICAgPj4gUlNoaWZ0KSAmIFJNYXNrKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAoKGdyZWVuID4+IEdTaGlmdCkgJiBHTWFzaykgfAorICAgICAgICAgICAgICAgICAgICAgICAgKChibHVlICA+PiBCU2hpZnQpICYgQk1hc2spOworICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLworICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgLyogaWYgKHJwbmcyX2luZm8uY2hhbm5lbHMgPT0gNCkgKi8geworICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7CisgICAgICAgICAgICAgICAgciA9ICpzcmMrKzsKKyAgICAgICAgICAgICAgICBnID0gKnNyYysrOworICAgICAgICAgICAgICAgIGIgPSAqc3JjKys7CisgICAgICAgICAgICAgICAgYSA9ICpzcmMrKzsKKyAgICAgICAgICAgICAgICBpZiAoYmdfaW1hZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgYmdfcmVkICAgPSAqc3JjMisrOworICAgICAgICAgICAgICAgICAgICBiZ19ncmVlbiA9ICpzcmMyKys7CisgICAgICAgICAgICAgICAgICAgIGJnX2JsdWUgID0gKnNyYzIrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGEgPT0gMjU1KSB7CisgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpciA8PCA4KTsKKyAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaClnIDw8IDgpOworICAgICAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKWIgPDwgOCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaCliZ19yZWQgICA8PCA4KTsKKyAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaCliZ19ncmVlbiA8PCA4KTsKKyAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCliZ19ibHVlICA8PCA4KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIG1hY3JvIChmcm9tIHBuZy5oKSBjb21wb3NpdGVzIHRoZSBmb3JlZ3JvdW5kCisgICAgICAgICAgICAgICAgICAgICAqIGFuZCBiYWNrZ3JvdW5kIHZhbHVlcyBhbmQgcHV0cyB0aGUgcmVzdWx0IGJhY2sgaW50bworICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZmlyc3QgYXJndW1lbnQgKD09IGZnIGJ5dGUgaGVyZTogIHNhZmUpICovCisgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShyLCByLCBhLCBiZ19yZWQpOworICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoZywgZywgYSwgYmdfZ3JlZW4pOworICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoYiwgYiwgYSwgYmdfYmx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpciA8PCA4KTsKKyAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaClnIDw8IDgpOworICAgICAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKWIgPDwgOCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBpeGVsID0gKChyZWQgICA+PiBSU2hpZnQpICYgUk1hc2spIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoZ3JlZW4gPj4gR1NoaWZ0KSAmIEdNYXNrKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAoKGJsdWUgID4+IEJTaGlmdCkgJiBCTWFzayk7CisgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCisgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0gZWxzZSAvKiBkZXB0aCA9PSA4ICovIHsKKworICAgICAgICAvKiBHUlI6ICBhZGQgOC1iaXQgc3VwcG9ydCAqLworCisgICAgfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRGlzcGxheSBhZnRlciBldmVyeSAxNiByb3dzIG9yIHdoZW4gb24gb25lIG9mIGxhc3QgdHdvIHJvd3MuICAoUmVnaW9uCisgICAgbWF5IGluY2x1ZGUgcHJldmlvdXNseSBkaXNwbGF5ZWQgbGluZXMgZHVlIHRvIGludGVybGFjaW5nLS1pLmUuLCBub3QKKyAgICBjb250aWd1b3VzLiAgQWxzbywgc2Vjb25kLXRvLWxhc3Qgcm93IGlzIGZpbmFsIG9uZSBpbiBpbnRlcmxhY2VkIGltYWdlcworICAgIHdpdGggb2RkIG51bWJlciBvZiByb3dzLikgIEZvciBkZW1vcywgZmx1c2ggKGFuZCBkZWxheSkgYWZ0ZXIgZXZlcnkgMTZ0aAorICAgIHJvdyBzbyAic3BhcnNlIiBwYXNzZXMgZG9uJ3QgZ28gdHdpY2UgYXMgZmFzdC4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIGlmIChkZW1vX3RpbWluZyAmJiAocm93IC0gZmlyc3Ryb3cgPj0gMTYgfHwgcm93ID49IHJwbmcyX2luZm8uaGVpZ2h0LTIpKSB7CisgICAgICAgIFhQdXRJbWFnZShkaXNwbGF5LCB3aW5kb3csIGdjLCB4aW1hZ2UsIDAsIChpbnQpZmlyc3Ryb3csIDAsCisgICAgICAgICAgKGludClmaXJzdHJvdywgcnBuZzJfaW5mby53aWR0aCwgcm93IC0gZmlyc3Ryb3cgKyAxKTsKKyAgICAgICAgWEZsdXNoKGRpc3BsYXkpOworICAgICAgICByb3dzID0gMDsKKyAgICAgICAgdXNsZWVwKHVzbGVlcF9kdXJhdGlvbik7CisgICAgfSBlbHNlCisgICAgaWYgKCFkZW1vX3RpbWluZyAmJiAoKHJvd3MgJiAweGYpID09IDAgfHwgcm93ID49IHJwbmcyX2luZm8uaGVpZ2h0LTIpKSB7CisgICAgICAgIFhQdXRJbWFnZShkaXNwbGF5LCB3aW5kb3csIGdjLCB4aW1hZ2UsIDAsIChpbnQpZmlyc3Ryb3csIDAsCisgICAgICAgICAgKGludClmaXJzdHJvdywgcnBuZzJfaW5mby53aWR0aCwgcm93IC0gZmlyc3Ryb3cgKyAxKTsKKyAgICAgICAgWEZsdXNoKGRpc3BsYXkpOworICAgICAgICByb3dzID0gMDsKKyAgICB9CisKK30KKworCisKKworCitzdGF0aWMgdm9pZCBycG5nMl94X2ZpbmlzaF9kaXNwbGF5KHZvaWQpCit7CisgICAgVHJhY2UoKHN0ZGVyciwgImJlZ2lubmluZyBycG5nMl94X2ZpbmlzaF9kaXNwbGF5KClcbiIpKQorCisgICAgLyogbGFzdCByb3cgaGFzIGFscmVhZHkgYmVlbiBkaXNwbGF5ZWQgYnkgcnBuZzJfeF9kaXNwbGF5X3JvdygpLCBzbyB3ZQorICAgICAqIGhhdmUgbm90aGluZyB0byBkbyBoZXJlIGV4Y2VwdCBzZXQgYSBmbGFnIGFuZCBsZXQgdGhlIHVzZXIga25vdyB0aGF0CisgICAgICogdGhlIGltYWdlIGlzIGRvbmUgKi8KKworICAgIHJwbmcyX2luZm8uc3RhdGUgPSBrRG9uZTsKKyAgICBwcmludGYoCisgICAgICAiRG9uZS4gIFByZXNzIFEsIEVzYyBvciBtb3VzZSBidXR0b24gMSAod2l0aGluIGltYWdlIHdpbmRvdykgdG8gcXVpdC5cbiIpOworICAgIGZmbHVzaChzdGRvdXQpOworfQorCisKKworCisKK3N0YXRpYyB2b2lkIHJwbmcyX3hfcmVkaXNwbGF5X2ltYWdlKHVsZyBzdGFydGNvbCwgdWxnIHN0YXJ0cm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxnIHdpZHRoLCB1bGcgaGVpZ2h0KQoreworICAgIHVjaCBiZ19yZWQgICA9IHJwbmcyX2luZm8uYmdfcmVkOworICAgIHVjaCBiZ19ncmVlbiA9IHJwbmcyX2luZm8uYmdfZ3JlZW47CisgICAgdWNoIGJnX2JsdWUgID0gcnBuZzJfaW5mby5iZ19ibHVlOworICAgIHVjaCAqc3JjLCAqc3JjMj1OVUxMOworICAgIGNoYXIgKmRlc3Q7CisgICAgdWNoIHIsIGcsIGIsIGE7CisgICAgdWxnIGksIHJvdywgbGFzdHJvdyA9IDA7CisgICAgdWxnIHBpeGVsOworICAgIGludCB4aW1hZ2Vfcm93Ynl0ZXMgPSB4aW1hZ2UtPmJ5dGVzX3Blcl9saW5lOworCisKKyAgICBUcmFjZSgoc3RkZXJyLCAiYmVnaW5uaW5nIGRpc3BsYXkgbG9vcCAoaW1hZ2VfY2hhbm5lbHMgPT0gJWQpXG4iLAorICAgICAgcnBuZzJfaW5mby5jaGFubmVscykpCisgICAgVHJhY2UoKHN0ZGVyciwgIiAgICh3aWR0aCA9ICVsZCwgcm93Ynl0ZXMgPSAlZCwgeGltYWdlX3Jvd2J5dGVzID0gJWQpXG4iLAorICAgICAgcnBuZzJfaW5mby53aWR0aCwgcnBuZzJfaW5mby5yb3dieXRlcywgeGltYWdlX3Jvd2J5dGVzKSkKKyAgICBUcmFjZSgoc3RkZXJyLCAiICAgKGJwcCA9ICVkKVxuIiwgeGltYWdlLT5iaXRzX3Blcl9waXhlbCkpCisgICAgVHJhY2UoKHN0ZGVyciwgIiAgIChieXRlX29yZGVyID0gJXMpXG4iLCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPT0gTVNCRmlyc3Q/CisgICAgICAiTVNCRmlyc3QiIDogKHhpbWFnZS0+Ynl0ZV9vcmRlciA9PSBMU0JGaXJzdD8gIkxTQkZpcnN0IiA6ICJ1bmtub3duIikpKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEFzaWRlIGZyb20gdGhlIHVzZSBvZiB0aGUgcnBuZzJfaW5mbyBzdHJ1Y3QgYW5kIG9mIHNyYzIgKGZvciBiYWNrZ3JvdW5kCisgICAgaW1hZ2UpLCB0aGlzIHJvdXRpbmUgaXMgaWRlbnRpY2FsIHRvIHJwbmdfeF9kaXNwbGF5X2ltYWdlKCkgaW4gdGhlIG5vbi0KKyAgICBwcm9ncmVzc2l2ZSB2ZXJzaW9uIG9mIHRoZSBwcm9ncmFtLS1mb3IgdGhlIHNpbXBsZSByZWFzb24gdGhhdCByZWRpc3BsYXkKKyAgICBvZiB0aGUgaW1hZ2UgYWdhaW5zdCBhIG5ldyBiYWNrZ3JvdW5kIGhhcHBlbnMgYWZ0ZXIgdGhlIGltYWdlIGlzIGZ1bGx5CisgICAgZGVjb2RlZCBhbmQgdGhlcmVmb3JlIGlzLCBieSBkZWZpbml0aW9uLCBub24tcHJvZ3Jlc3NpdmUuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBpZiAoZGVwdGggPT0gMjQgfHwgZGVwdGggPT0gMzIpIHsKKyAgICAgICAgdWxnIHJlZCwgZ3JlZW4sIGJsdWU7CisgICAgICAgIGludCBicHAgPSB4aW1hZ2UtPmJpdHNfcGVyX3BpeGVsOworCisgICAgICAgIGZvciAobGFzdHJvdyA9IHJvdyA9IHN0YXJ0cm93OyAgcm93IDwgc3RhcnRyb3craGVpZ2h0OyAgKytyb3cpIHsKKyAgICAgICAgICAgIHNyYyA9IHJwbmcyX2luZm8uaW1hZ2VfZGF0YSArIHJvdypycG5nMl9pbmZvLnJvd2J5dGVzOworICAgICAgICAgICAgaWYgKGJnX2ltYWdlKQorICAgICAgICAgICAgICAgIHNyYzIgPSBiZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOworICAgICAgICAgICAgZGVzdCA9IHhpbWFnZS0+ZGF0YSArIHJvdyp4aW1hZ2Vfcm93Ynl0ZXM7CisgICAgICAgICAgICBpZiAocnBuZzJfaW5mby5jaGFubmVscyA9PSAzKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKnNyYysrOworICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICpzcmMrKzsKKyAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAqc3JjKys7CisjaWZkZWYgTk9fMjRCSVRfTUFTS1MKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSAocmVkICAgPDwgUlNoaWZ0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdyZWVuIDw8IEdTaGlmdCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVlICA8PCBCU2hpZnQpOworICAgICAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJwcCA9PSAzMikgeworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIGFzc3VtZXMgYnBwID09IDI0ICYgYml0cyBhcmUgcGFja2VkIGxvdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogKHByb2JhYmx5IG5lZWQgdG8gdXNlIFJTaGlmdCwgUk1hc2ssIGV0Yy4pICovCisgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKFJTaGlmdCA8IDApPyByZWQgICA8PCAoLVJTaGlmdCkgOiByZWQgICA+PiBSU2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKEdTaGlmdCA8IDApPyBncmVlbiA8PCAoLUdTaGlmdCkgOiBncmVlbiA+PiBHU2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKEJTaGlmdCA8IDApPyBibHVlICA8PCAoLUJTaGlmdCkgOiBibHVlICA+PiBCU2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAmIFJNYXNrKSB8IChncmVlbiAmIEdNYXNrKSB8IChibHVlICYgQk1hc2spOworICAgICAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJwcCA9PSAzMikgeworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBHUlIgQlVHICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIGFzc3VtZXMgYnBwID09IDI0ICYgYml0cyBhcmUgcGFja2VkIGxvdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogKHByb2JhYmx5IG5lZWQgdG8gdXNlIFJTaGlmdC9STWFzay9ldGMuIGhlcmUsIHRvbykgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgLyogaWYgKHJwbmcyX2luZm8uY2hhbm5lbHMgPT0gNCkgKi8geworICAgICAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgeworICAgICAgICAgICAgICAgICAgICByID0gKnNyYysrOworICAgICAgICAgICAgICAgICAgICBnID0gKnNyYysrOworICAgICAgICAgICAgICAgICAgICBiID0gKnNyYysrOworICAgICAgICAgICAgICAgICAgICBhID0gKnNyYysrOworICAgICAgICAgICAgICAgICAgICBpZiAoYmdfaW1hZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJnX3JlZCAgID0gKnNyYzIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJnX2dyZWVuID0gKnNyYzIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJnX2JsdWUgID0gKnNyYzIrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PSAyNTUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuID0gZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gYjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gYmdfcmVkOworICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSBiZ19ncmVlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gYmdfYmx1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgbWFjcm8gKGZyb20gcG5nLmgpIGNvbXBvc2l0ZXMgdGhlIGZvcmVncm91bmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCBiYWNrZ3JvdW5kIHZhbHVlcyBhbmQgcHV0cyB0aGUgcmVzdWx0IGludG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBmaXJzdCBhcmd1bWVudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKHJlZCwgICByLCBhLCBiZ19yZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKGdyZWVuLCBnLCBhLCBiZ19ncmVlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoYmx1ZSwgIGIsIGEsIGJnX2JsdWUpOworICAgICAgICAgICAgICAgICAgICB9CisjaWZkZWYgTk9fMjRCSVRfTUFTS1MKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSAocmVkICAgPDwgUlNoaWZ0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdyZWVuIDw8IEdTaGlmdCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVlICA8PCBCU2hpZnQpOworICAgICAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJwcCA9PSAzMikgeworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIGFzc3VtZXMgYnBwID09IDI0ICYgYml0cyBhcmUgcGFja2VkIGxvdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogKHByb2JhYmx5IG5lZWQgdG8gdXNlIFJTaGlmdCwgUk1hc2ssIGV0Yy4pICovCisgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKFJTaGlmdCA8IDApPyByZWQgICA8PCAoLVJTaGlmdCkgOiByZWQgICA+PiBSU2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKEdTaGlmdCA8IDApPyBncmVlbiA8PCAoLUdTaGlmdCkgOiBncmVlbiA+PiBHU2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKEJTaGlmdCA8IDApPyBibHVlICA8PCAoLUJTaGlmdCkgOiBibHVlICA+PiBCU2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAmIFJNYXNrKSB8IChncmVlbiAmIEdNYXNrKSB8IChibHVlICYgQk1hc2spOworICAgICAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJwcCA9PSAzMikgeworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBHUlIgQlVHICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIGFzc3VtZXMgYnBwID09IDI0ICYgYml0cyBhcmUgcGFja2VkIGxvdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogKHByb2JhYmx5IG5lZWQgdG8gdXNlIFJTaGlmdC9STWFzay9ldGMuIGhlcmUsIHRvbykgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZGlzcGxheSBhZnRlciBldmVyeSAxNiBsaW5lcyAqLworICAgICAgICAgICAgaWYgKCgocm93KzEpICYgMHhmKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgWFB1dEltYWdlKGRpc3BsYXksIHdpbmRvdywgZ2MsIHhpbWFnZSwgMCwgKGludClsYXN0cm93LCAwLAorICAgICAgICAgICAgICAgICAgKGludClsYXN0cm93LCBycG5nMl9pbmZvLndpZHRoLCAxNik7CisgICAgICAgICAgICAgICAgWEZsdXNoKGRpc3BsYXkpOworICAgICAgICAgICAgICAgIGxhc3Ryb3cgPSByb3cgKyAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9IGVsc2UgaWYgKGRlcHRoID09IDE2KSB7CisgICAgICAgIHVzaCByZWQsIGdyZWVuLCBibHVlOworCisgICAgICAgIGZvciAobGFzdHJvdyA9IHJvdyA9IHN0YXJ0cm93OyAgcm93IDwgc3RhcnRyb3craGVpZ2h0OyAgKytyb3cpIHsKKyAgICAgICAgICAgIHNyYyA9IHJwbmcyX2luZm8ucm93X3BvaW50ZXJzW3Jvd107CisgICAgICAgICAgICBpZiAoYmdfaW1hZ2UpCisgICAgICAgICAgICAgICAgc3JjMiA9IGJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7CisgICAgICAgICAgICBkZXN0ID0geGltYWdlLT5kYXRhICsgcm93KnhpbWFnZV9yb3dieXRlczsKKyAgICAgICAgICAgIGlmIChycG5nMl9pbmZvLmNoYW5uZWxzID09IDMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaCkoKnNyYykgPDwgOCk7CisgICAgICAgICAgICAgICAgICAgICsrc3JjOworICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKSgqc3JjKSA8PCA4KTsKKyAgICAgICAgICAgICAgICAgICAgKytzcmM7CisgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpKCpzcmMpIDw8IDgpOworICAgICAgICAgICAgICAgICAgICArK3NyYzsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSAoKHJlZCAgID4+IFJTaGlmdCkgJiBSTWFzaykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZ3JlZW4gPj4gR1NoaWZ0KSAmIEdNYXNrKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChibHVlICA+PiBCU2hpZnQpICYgQk1hc2spOworICAgICAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSAvKiBpZiAocnBuZzJfaW5mby5jaGFubmVscyA9PSA0KSAqLyB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7CisgICAgICAgICAgICAgICAgICAgIHIgPSAqc3JjKys7CisgICAgICAgICAgICAgICAgICAgIGcgPSAqc3JjKys7CisgICAgICAgICAgICAgICAgICAgIGIgPSAqc3JjKys7CisgICAgICAgICAgICAgICAgICAgIGEgPSAqc3JjKys7CisgICAgICAgICAgICAgICAgICAgIGlmIChiZ19pbWFnZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYmdfcmVkICAgPSAqc3JjMisrOworICAgICAgICAgICAgICAgICAgICAgICAgYmdfZ3JlZW4gPSAqc3JjMisrOworICAgICAgICAgICAgICAgICAgICAgICAgYmdfYmx1ZSAgPSAqc3JjMisrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChhID09IDI1NSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaClyIDw8IDgpOworICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaClnIDw8IDgpOworICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCliIDw8IDgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaCliZ19yZWQgICA8PCA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpYmdfZ3JlZW4gPDwgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKWJnX2JsdWUgIDw8IDgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBtYWNybyAoZnJvbSBwbmcuaCkgY29tcG9zaXRlcyB0aGUgZm9yZWdyb3VuZAorICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIGJhY2tncm91bmQgdmFsdWVzIGFuZCBwdXRzIHRoZSByZXN1bHQgYmFjayBpbnRvCisgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZmlyc3QgYXJndW1lbnQgKD09IGZnIGJ5dGUgaGVyZTogIHNhZmUpICovCisgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUociwgciwgYSwgYmdfcmVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShnLCBnLCBhLCBiZ19ncmVlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoYiwgYiwgYSwgYmdfYmx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKXIgPDwgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKWcgPDwgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKWIgPDwgOCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSAoKHJlZCAgID4+IFJTaGlmdCkgJiBSTWFzaykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZ3JlZW4gPj4gR1NoaWZ0KSAmIEdNYXNrKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChibHVlICA+PiBCU2hpZnQpICYgQk1hc2spOworICAgICAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGRpc3BsYXkgYWZ0ZXIgZXZlcnkgMTYgbGluZXMgKi8KKyAgICAgICAgICAgIGlmICgoKHJvdysxKSAmIDB4ZikgPT0gMCkgeworICAgICAgICAgICAgICAgIFhQdXRJbWFnZShkaXNwbGF5LCB3aW5kb3csIGdjLCB4aW1hZ2UsIDAsIChpbnQpbGFzdHJvdywgMCwKKyAgICAgICAgICAgICAgICAgIChpbnQpbGFzdHJvdywgcnBuZzJfaW5mby53aWR0aCwgMTYpOworICAgICAgICAgICAgICAgIFhGbHVzaChkaXNwbGF5KTsKKyAgICAgICAgICAgICAgICBsYXN0cm93ID0gcm93ICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfSBlbHNlIC8qIGRlcHRoID09IDggKi8geworCisgICAgICAgIC8qIEdSUjogIGFkZCA4LWJpdCBzdXBwb3J0ICovCisKKyAgICB9CisKKyAgICBUcmFjZSgoc3RkZXJyLCAiY2FsbGluZyBmaW5hbCBYUHV0SW1hZ2UoKVxuIikpCisgICAgaWYgKGxhc3Ryb3cgPCBzdGFydHJvdytoZWlnaHQpIHsKKyAgICAgICAgWFB1dEltYWdlKGRpc3BsYXksIHdpbmRvdywgZ2MsIHhpbWFnZSwgMCwgKGludClsYXN0cm93LCAwLAorICAgICAgICAgIChpbnQpbGFzdHJvdywgcnBuZzJfaW5mby53aWR0aCwgcnBuZzJfaW5mby5oZWlnaHQtbGFzdHJvdyk7CisgICAgICAgIFhGbHVzaChkaXNwbGF5KTsKKyAgICB9CisKKyAgICAodm9pZClzdGFydGNvbDsKKyAgICAodm9pZCl3aWR0aDsKKworfSAvKiBlbmQgZnVuY3Rpb24gcnBuZzJfeF9yZWRpc3BsYXlfaW1hZ2UoKSAqLworCisKKworCisKKyNpZmRlZiBGRUFUVVJFX0xPT1AKKworc3RhdGljIHZvaWQgcnBuZzJfeF9yZWxvYWRfYmdfaW1hZ2Uodm9pZCkKK3sKKyAgICBjaGFyICpkZXN0OworICAgIHVjaCByMSwgcjIsIGcxLCBnMiwgYjEsIGIyOworICAgIHVjaCByMV9pbnYsIHIyX2ludiwgZzFfaW52LCBnMl9pbnYsIGIxX2ludiwgYjJfaW52OworICAgIGludCBrLCBobWF4LCBtYXg7CisgICAgaW50IHhpZHgsIHlpZHgsIHlpZHhfbWF4OworICAgIGludCBldmVuX29kZF92ZXJ0LCBldmVuX29kZF9ob3JpeiwgZXZlbl9vZGQ7CisgICAgaW50IGludmVydF9ncmFkaWVudDIgPSAoYmdbcGF0XS50eXBlICYgMHgwOCk7CisgICAgaW50IGludmVydF9jb2x1bW47CisgICAgdWxnIGksIHJvdzsKKworCisgICAgYmdzY2FsZSA9IChwYXQgPT0gMCk/IDggOiBiZ3NjYWxlX2RlZmF1bHQ7CisgICAgeWlkeF9tYXggPSBiZ3NjYWxlIC0gMTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBWZXJ0aWNhbCBncmFkaWVudHMgKHJhbXBzKSBpbiBOeE4gc3F1YXJlcywgYWx0ZXJuYXRpbmcgZGlyZWN0aW9uIGFuZAorICAgIGNvbG9ycyAoTiA9PSBiZ3NjYWxlKS4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIGlmICgoYmdbcGF0XS50eXBlICYgMHgwNykgPT0gMCkgeworICAgICAgICB1Y2ggcjFfbWluICA9IHJnYltiZ1twYXRdLnJnYjFfbWluXS5yOworICAgICAgICB1Y2ggZzFfbWluICA9IHJnYltiZ1twYXRdLnJnYjFfbWluXS5nOworICAgICAgICB1Y2ggYjFfbWluICA9IHJnYltiZ1twYXRdLnJnYjFfbWluXS5iOworICAgICAgICB1Y2ggcjJfbWluICA9IHJnYltiZ1twYXRdLnJnYjJfbWluXS5yOworICAgICAgICB1Y2ggZzJfbWluICA9IHJnYltiZ1twYXRdLnJnYjJfbWluXS5nOworICAgICAgICB1Y2ggYjJfbWluICA9IHJnYltiZ1twYXRdLnJnYjJfbWluXS5iOworICAgICAgICBpbnQgcjFfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5yIC0gcjFfbWluOworICAgICAgICBpbnQgZzFfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5nIC0gZzFfbWluOworICAgICAgICBpbnQgYjFfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5iIC0gYjFfbWluOworICAgICAgICBpbnQgcjJfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5yIC0gcjJfbWluOworICAgICAgICBpbnQgZzJfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5nIC0gZzJfbWluOworICAgICAgICBpbnQgYjJfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5iIC0gYjJfbWluOworCisgICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKKyAgICAgICAgICAgIHlpZHggPSAoaW50KShyb3cgJSBiZ3NjYWxlKTsKKyAgICAgICAgICAgIGV2ZW5fb2RkX3ZlcnQgPSAoaW50KSgocm93IC8gYmdzY2FsZSkgJiAxKTsKKworICAgICAgICAgICAgcjEgPSByMV9taW4gKyAocjFfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7CisgICAgICAgICAgICBnMSA9IGcxX21pbiArIChnMV9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKKyAgICAgICAgICAgIGIxID0gYjFfbWluICsgKGIxX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OworICAgICAgICAgICAgcjFfaW52ID0gcjFfbWluICsgKHIxX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7CisgICAgICAgICAgICBnMV9pbnYgPSBnMV9taW4gKyAoZzFfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKKyAgICAgICAgICAgIGIxX2ludiA9IGIxX21pbiArIChiMV9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OworCisgICAgICAgICAgICByMiA9IHIyX21pbiArIChyMl9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKKyAgICAgICAgICAgIGcyID0gZzJfbWluICsgKGcyX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OworICAgICAgICAgICAgYjIgPSBiMl9taW4gKyAoYjJfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7CisgICAgICAgICAgICByMl9pbnYgPSByMl9taW4gKyAocjJfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKKyAgICAgICAgICAgIGcyX2ludiA9IGcyX21pbiArIChnMl9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OworICAgICAgICAgICAgYjJfaW52ID0gYjJfbWluICsgKGIyX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7CisKKyAgICAgICAgICAgIGRlc3QgPSAoY2hhciAqKWJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IHJwbmcyX2luZm8ud2lkdGg7ICArK2kpIHsKKyAgICAgICAgICAgICAgICBldmVuX29kZF9ob3JpeiA9IChpbnQpKChpIC8gYmdzY2FsZSkgJiAxKTsKKyAgICAgICAgICAgICAgICBldmVuX29kZCA9IGV2ZW5fb2RkX3ZlcnQgXiBldmVuX29kZF9ob3JpejsKKyAgICAgICAgICAgICAgICBpbnZlcnRfY29sdW1uID0KKyAgICAgICAgICAgICAgICAgIChldmVuX29kZF9ob3JpeiAmJiAoYmdbcGF0XS50eXBlICYgMHgxMCkpOworICAgICAgICAgICAgICAgIGlmIChldmVuX29kZCA9PSAwKSB7ICAgICAgICAvKiBncmFkaWVudCAjMSAqLworICAgICAgICAgICAgICAgICAgICBpZiAoaW52ZXJ0X2NvbHVtbikgeworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHIxX2ludjsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnMV9pbnY7CisgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjFfaW52OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHIxOworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGcxOworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGIxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgIC8qIGdyYWRpZW50ICMyICovCisgICAgICAgICAgICAgICAgICAgIGlmICgoaW52ZXJ0X2NvbHVtbiAmJiBpbnZlcnRfZ3JhZGllbnQyKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKCFpbnZlcnRfY29sdW1uICYmICFpbnZlcnRfZ3JhZGllbnQyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHIyOyAgICAgICAvKiBub3QgaW52ZXJ0ZWQgb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnMjsgICAgICAgLyogIGRvdWJseSBpbnZlcnRlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGIyOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHIyX2ludjsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnMl9pbnY7ICAgLyogc2luZ2x5IGludmVydGVkICovCisgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjJfaW52OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU29mdCBncmFkaWVudC1kaWFtb25kcyB3aXRoIHNjYWxlID0gYmdzY2FsZS4gIENvZGUgY29udHJpYnV0ZWQgYnkgQWRhbQorICAgIE0uIENvc3RlbGxvLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgfSBlbHNlIGlmICgoYmdbcGF0XS50eXBlICYgMHgwNykgPT0gMSkgeworCisgICAgICAgIGhtYXggPSAoYmdzY2FsZS0xKS8yOyAgIC8qIGhhbGYgdGhlIG1heCB3ZWlnaHQgb2YgYSBjb2xvciAqLworICAgICAgICBtYXggPSAyKmhtYXg7ICAgICAgICAgICAvKiB0aGUgbWF4IHdlaWdodCBvZiBhIGNvbG9yICovCisKKyAgICAgICAgcjEgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0ucjsKKyAgICAgICAgZzEgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0uZzsKKyAgICAgICAgYjEgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0uYjsKKyAgICAgICAgcjIgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0ucjsKKyAgICAgICAgZzIgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0uZzsKKyAgICAgICAgYjIgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0uYjsKKworICAgICAgICBmb3IgKHJvdyA9IDA7ICByb3cgPCBycG5nMl9pbmZvLmhlaWdodDsgICsrcm93KSB7CisgICAgICAgICAgICB5aWR4ID0gKGludCkocm93ICUgYmdzY2FsZSk7CisgICAgICAgICAgICBpZiAoeWlkeCA+IGhtYXgpCisgICAgICAgICAgICAgICAgeWlkeCA9IGJnc2NhbGUtMSAtIHlpZHg7CisgICAgICAgICAgICBkZXN0ID0gKGNoYXIgKiliZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOworICAgICAgICAgICAgZm9yIChpID0gMDsgIGkgPCBycG5nMl9pbmZvLndpZHRoOyAgKytpKSB7CisgICAgICAgICAgICAgICAgeGlkeCA9IChpbnQpKGkgJSBiZ3NjYWxlKTsKKyAgICAgICAgICAgICAgICBpZiAoeGlkeCA+IGhtYXgpCisgICAgICAgICAgICAgICAgICAgIHhpZHggPSBiZ3NjYWxlLTEgLSB4aWR4OworICAgICAgICAgICAgICAgIGsgPSB4aWR4ICsgeWlkeDsKKyAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGsqcjEgKyAobWF4LWspKnIyKSAvIG1heDsKKyAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGsqZzEgKyAobWF4LWspKmcyKSAvIG1heDsKKyAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGsqYjEgKyAobWF4LWspKmIyKSAvIG1heDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFJhZGlhbCAic3RhcmJ1cnN0IiB3aXRoIGF6aW11dGhhbCBzaW51c29pZHM7IFtldmVudHVhbGx5IG51bWJlciBvZiBzaW51LQorICAgIHNvaWRzIHdpbGwgZXF1YWwgYmdzY2FsZT9dLiAgVGhpcyBvbmUgaXMgc2xvdyBidXQgdmVyeSBjb29sLiAgQ29kZSBjb24tCisgICAgdHJpYnV0ZWQgYnkgUGlldGVyIFMuIHZhbiBkZXIgTWV1bGVuIChvcmlnaW5hbGx5IGluIFNtYWxsdGFsaykuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICB9IGVsc2UgaWYgKChiZ1twYXRdLnR5cGUgJiAweDA3KSA9PSAyKSB7CisgICAgICAgIHVjaCBjaDsKKyAgICAgICAgaW50IGlpLCB4LCB5LCBodywgaGgsIGdyYXlzcG90OworICAgICAgICBkb3VibGUgZnJlcSwgcm90YXRlLCBzYXR1cmF0ZSwgZ3JheSwgaW50ZW5zaXR5OworICAgICAgICBkb3VibGUgYW5nbGU9MC4wLCBhb2Zmc2V0PTAuMCwgbWF4RGlzdCwgZGlzdDsKKyAgICAgICAgZG91YmxlIHJlZD0wLjAsIGdyZWVuPTAuMCwgYmx1ZT0wLjAsIGh1ZSwgcywgdiwgZiwgcCwgcSwgdDsKKworICAgICAgICBoaCA9IChpbnQpKHJwbmcyX2luZm8uaGVpZ2h0IC8gMik7CisgICAgICAgIGh3ID0gKGludCkocnBuZzJfaW5mby53aWR0aCAvIDIpOworCisgICAgICAgIC8qIHZhcmlhYmxlcyBmb3IgcmFkaWFsIHdhdmVzOgorICAgICAgICAgKiAgIGFvZmZzZXQ6ICBudW1iZXIgb2YgZGVncmVlcyB0byByb3RhdGUgaHVlIFtDVVJSRU5UTFkgTk9UIFVTRURdCisgICAgICAgICAqICAgZnJlcTogIG51bWJlciBvZiBjb2xvciBiZWFtcyBvcmlnaW5hdGluZyBmcm9tIHRoZSBjZW50ZXIKKyAgICAgICAgICogICBncmF5c3BvdDogIHNpemUgb2YgdGhlIGdyYXlpbmcgY2VudGVyIGFyZWEgKGFudGktYWxpYXMpCisgICAgICAgICAqICAgcm90YXRlOiAgcm90YXRpb24gb2YgdGhlIGJlYW1zIGFzIGEgZnVuY3Rpb24gb2YgcmFkaXVzCisgICAgICAgICAqICAgc2F0dXJhdGU6ICBzYXR1cmF0aW9uIG9mIGJlYW1zJyBzaGFwZSBhemltdXRoYWxseQorICAgICAgICAgKi8KKyAgICAgICAgYW5nbGUgPSBDTElQKGFuZ2xlLCAwLjAsIDM2MC4wKTsKKyAgICAgICAgZ3JheXNwb3QgPSBDTElQKGJnW3BhdF0uYmdfZ3JheSwgMSwgKGhoICsgaHcpKTsKKyAgICAgICAgZnJlcSA9IE1BWCgoZG91YmxlKWJnW3BhdF0uYmdfZnJlcSwgMC4wKTsKKyAgICAgICAgc2F0dXJhdGUgPSAoZG91YmxlKWJnW3BhdF0uYmdfYnNhdCAqIDAuMTsKKyAgICAgICAgcm90YXRlID0gKGRvdWJsZSliZ1twYXRdLmJnX2Jyb3QgKiAwLjE7CisgICAgICAgIGdyYXkgPSAwLjA7CisgICAgICAgIGludGVuc2l0eSA9IDAuMDsKKyAgICAgICAgbWF4RGlzdCA9IChkb3VibGUpKChodypodykgKyAoaGgqaGgpKTsKKworICAgICAgICBmb3IgKHJvdyA9IDA7ICByb3cgPCBycG5nMl9pbmZvLmhlaWdodDsgICsrcm93KSB7CisgICAgICAgICAgICB5ID0gKGludCkocm93IC0gaGgpOworICAgICAgICAgICAgZGVzdCA9IChjaGFyICopYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7ICBpIDwgcnBuZzJfaW5mby53aWR0aDsgICsraSkgeworICAgICAgICAgICAgICAgIHggPSAoaW50KShpIC0gaHcpOworICAgICAgICAgICAgICAgIGFuZ2xlID0gKHggPT0gMCk/IFBJXzIgOiBhdGFuKChkb3VibGUpeSAvIChkb3VibGUpeCk7CisgICAgICAgICAgICAgICAgZ3JheSA9IChkb3VibGUpTUFYKEFCUyh5KSwgQUJTKHgpKSAvIGdyYXlzcG90OworICAgICAgICAgICAgICAgIGdyYXkgPSBNSU4oMS4wLCBncmF5KTsKKyAgICAgICAgICAgICAgICBkaXN0ID0gKGRvdWJsZSkoKHgqeCkgKyAoeSp5KSkgLyBtYXhEaXN0OworICAgICAgICAgICAgICAgIGludGVuc2l0eSA9IGNvcygoYW5nbGUrKHJvdGF0ZSpkaXN0KlBJKSkgKiBmcmVxKSAqCisgICAgICAgICAgICAgICAgICBncmF5ICogc2F0dXJhdGU7CisgICAgICAgICAgICAgICAgaW50ZW5zaXR5ID0gKE1BWChNSU4oaW50ZW5zaXR5LDEuMCksLTEuMCkgKyAxLjApICogMC41OworICAgICAgICAgICAgICAgIGh1ZSA9IChhbmdsZSArIFBJKSAqIElOVl9QSV8zNjAgKyBhb2Zmc2V0OworICAgICAgICAgICAgICAgIHMgPSBncmF5ICogKChkb3VibGUpKEFCUyh4KStBQlMoeSkpIC8gKGRvdWJsZSkoaHcgKyBoaCkpOworICAgICAgICAgICAgICAgIHMgPSBNSU4oTUFYKHMsMC4wKSwgMS4wKTsKKyAgICAgICAgICAgICAgICB2ID0gTUlOKE1BWChpbnRlbnNpdHksMC4wKSwgMS4wKTsKKworICAgICAgICAgICAgICAgIGlmIChzID09IDAuMCkgeworICAgICAgICAgICAgICAgICAgICBjaCA9ICh1Y2gpKHYgKiAyNTUuMCk7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBjaDsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGNoOworICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gY2g7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChodWUgPCAwLjApIHx8IChodWUgPj0gMzYwLjApKQorICAgICAgICAgICAgICAgICAgICAgICAgaHVlIC09ICgoKGludCkoaHVlIC8gMzYwLjApKSAqIDM2MC4wKTsKKyAgICAgICAgICAgICAgICAgICAgaHVlIC89IDYwLjA7CisgICAgICAgICAgICAgICAgICAgIGlpID0gKGludClodWU7CisgICAgICAgICAgICAgICAgICAgIGYgPSBodWUgLSAoZG91YmxlKWlpOworICAgICAgICAgICAgICAgICAgICBwID0gKDEuMCAtIHMpICogdjsKKyAgICAgICAgICAgICAgICAgICAgcSA9ICgxLjAgLSAocyAqIGYpKSAqIHY7CisgICAgICAgICAgICAgICAgICAgIHQgPSAoMS4wIC0gKHMgKiAoMS4wIC0gZikpKSAqIHY7CisgICAgICAgICAgICAgICAgICAgIGlmICAgICAgKGlpID09IDApIHsgcmVkID0gdjsgZ3JlZW4gPSB0OyBibHVlID0gcDsgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSAxKSB7IHJlZCA9IHE7IGdyZWVuID0gdjsgYmx1ZSA9IHA7IH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gMikgeyByZWQgPSBwOyBncmVlbiA9IHY7IGJsdWUgPSB0OyB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlpID09IDMpIHsgcmVkID0gcDsgZ3JlZW4gPSBxOyBibHVlID0gdjsgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSA0KSB7IHJlZCA9IHQ7IGdyZWVuID0gcDsgYmx1ZSA9IHY7IH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gNSkgeyByZWQgPSB2OyBncmVlbiA9IHA7IGJsdWUgPSBxOyB9CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAodWNoKShyZWQgKiAyNTUuMCk7CisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAodWNoKShncmVlbiAqIDI1NS4wKTsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9ICh1Y2gpKGJsdWUgKiAyNTUuMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9IC8qIGVuZCBmdW5jdGlvbiBycG5nMl94X3JlbG9hZF9iZ19pbWFnZSgpICovCisKKworCisKKworc3RhdGljIGludCBpc19udW1iZXIoY2hhciAqcCkKK3sKKyAgICB3aGlsZSAoKnApIHsKKyAgICAgICAgaWYgKCFpc2RpZ2l0KCpwKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgKytwOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qIEZFQVRVUkVfTE9PUCAqLworCisKKworCisKK3N0YXRpYyB2b2lkIHJwbmcyX3hfY2xlYW51cCh2b2lkKQoreworICAgIGlmIChiZ19pbWFnZSAmJiBiZ19kYXRhKSB7CisgICAgICAgIGZyZWUoYmdfZGF0YSk7CisgICAgICAgIGJnX2RhdGEgPSBOVUxMOworICAgIH0KKworICAgIGlmIChycG5nMl9pbmZvLmltYWdlX2RhdGEpIHsKKyAgICAgICAgZnJlZShycG5nMl9pbmZvLmltYWdlX2RhdGEpOworICAgICAgICBycG5nMl9pbmZvLmltYWdlX2RhdGEgPSBOVUxMOworICAgIH0KKworICAgIGlmIChycG5nMl9pbmZvLnJvd19wb2ludGVycykgeworICAgICAgICBmcmVlKHJwbmcyX2luZm8ucm93X3BvaW50ZXJzKTsKKyAgICAgICAgcnBuZzJfaW5mby5yb3dfcG9pbnRlcnMgPSBOVUxMOworICAgIH0KKworICAgIGlmICh4aW1hZ2UpIHsKKyAgICAgICAgaWYgKHhpbWFnZS0+ZGF0YSkgeworICAgICAgICAgICAgZnJlZSh4aW1hZ2UtPmRhdGEpOyAgICAgICAgICAgLyogd2UgYWxsb2NhdGVkIGl0LCBzbyB3ZSBmcmVlIGl0ICovCisgICAgICAgICAgICB4aW1hZ2UtPmRhdGEgPSAoY2hhciAqKU5VTEw7ICAvKiAgaW5zdGVhZCBvZiBYRGVzdHJveUltYWdlKCkgKi8KKyAgICAgICAgfQorICAgICAgICBYRGVzdHJveUltYWdlKHhpbWFnZSk7CisgICAgICAgIHhpbWFnZSA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKGhhdmVfZ2MpCisgICAgICAgIFhGcmVlR0MoZGlzcGxheSwgZ2MpOworCisgICAgaWYgKGhhdmVfd2luZG93KQorICAgICAgICBYRGVzdHJveVdpbmRvdyhkaXNwbGF5LCB3aW5kb3cpOworCisgICAgaWYgKGhhdmVfY29sb3JtYXApCisgICAgICAgIFhGcmVlQ29sb3JtYXAoZGlzcGxheSwgY29sb3JtYXApOworCisgICAgaWYgKGhhdmVfbm9uZGVmYXVsdF92aXN1YWwpCisgICAgICAgIFhGcmVlKHZpc3VhbF9saXN0KTsKK30KKworCisKKworCitzdGF0aWMgaW50IHJwbmcyX3hfbXNiKHVsZyB1MzJ2YWwpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAzMTsgIGkgPj0gMDsgIC0taSkgeworICAgICAgICBpZiAodTMydmFsICYgMHg4MDAwMDAwMEwpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgdTMydmFsIDw8PSAxOworICAgIH0KKyAgICByZXR1cm4gaTsKK30KZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL2dyZWdib29rL3RvdWNhbi5wbmcgYi9saWJwbmcvY29udHJpYi9ncmVnYm9vay90b3VjYW4ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOTYwZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9ncmVnYm9vay90b3VjYW4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL2dyZWdib29rL3dwbmcuYyBiL2xpYnBuZy9jb250cmliL2dyZWdib29rL3dwbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDZlMzUyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svd3BuZy5jCkBAIC0wLDAgKzEsODUzIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICB3cG5nIC0gc2ltcGxlIFBORy13cml0aW5nIHByb2dyYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cG5nLmMKKworICAgVGhpcyBwcm9ncmFtIGNvbnZlcnRzIGNlcnRhaW4gTmV0UEJNIGJpbmFyeSBmaWxlcyAoZ3JheXNjYWxlIGFuZCBSR0IsCisgICBtYXh2YWwgPSAyNTUpIHRvIFBORy4gIE5vbi1pbnRlcmxhY2VkIFBOR3MgYXJlIHdyaXR0ZW4gcHJvZ3Jlc3NpdmVseTsKKyAgIGludGVybGFjZWQgUE5HcyBhcmUgcmVhZCBhbmQgd3JpdHRlbiBpbiBvbmUgbWVtb3J5LWludGVuc2l2ZSBibGFzdC4KKworICAgVGhhbmtzIHRvIEplYW4tbG91cCBHYWlsbHkgZm9yIHByb3ZpZGluZyB0aGUgbmVjZXNzYXJ5IHRyaWNrIHRvIHJlYWQKKyAgIGludGVyYWN0aXZlIHRleHQgZnJvbSB0aGUga2V5Ym9hcmQgd2hpbGUgc3RkaW4gaXMgcmVkaXJlY3RlZC4gIFRoYW5rcworICAgdG8gQ29zbWluIFRydXRhIGZvciBDeWd3aW4gZml4ZXMuCisKKyAgIE5PVEU6ICBpbmNsdWRlcyBwcm92aXNpb25hbCBzdXBwb3J0IGZvciBQTk0gdHlwZSAiOCIgKHBvcnRhYmxlIGFscGhhbWFwKQorICAgICAgICAgIGltYWdlcywgcHJlc3VtZWQgdG8gYmUgYSAzMi1iaXQgaW50ZXJsZWF2ZWQgUkdCQSBmb3JtYXQ7IG5vIHByby0KKyAgICAgICAgICB2aXNpb24gZm9yIHBvc3NpYmxlIGludGVybGVhdmVkIGdyYXlzY2FsZSthbHBoYSAoMTYtYml0KSBmb3JtYXQuCisgICAgICAgICAgVEhJUyBJUyBVTkxJS0VMWSBUTyBCRUNPTUUgQU4gT0ZGSUNJQUwgTkVUUEJNIEFMUEhBIEZPUk1BVCEKKworICAgdG8gZG86CisgICAgLSBkZWxldGUgb3V0cHV0IGZpbGUgaWYgcXVpdCBiZWZvcmUgY2FsbGluZyBhbnkgd3JpdGVwbmcgcm91dGluZXMKKyAgICAtIHByb2Nlc3MgYmFja3NwYWNlIHdpdGggLXRleHQgb3B0aW9uIHVuZGVyIERPUy9XaW4/IChjdXJyZW50bHkgZ2V0IF5IKQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBDaGFuZ2Vsb2c6CisgICAgLSAxLjAxOiAgaW5pdGlhbCBwdWJsaWMgcmVsZWFzZQorICAgIC0gMS4wMjogIG1vZGlmaWVkIHRvIGFsbG93IGFiYnJldmlhdGVkIG9wdGlvbnMKKyAgICAtIDEuMDM6ICByZW1vdmVkIGV4dHJhbmVvdXMgY2hhcmFjdGVyIGZyb20gdXNhZ2Ugc2NyZWVuOyBmaXhlZCBidWcgaW4KKyAgICAgICAgICAgICAgY29tbWFuZC1saW5lIHBhcnNpbmcKKyAgICAtIDEuMDQ6ICBmaXhlZCBET1MvT1MyL1dpbjMyIGRldGVjdGlvbiwgaW5jbHVkaW5nIHBhcnRpYWwgQ3lnd2luIGZpeAorICAgICAgICAgICAgICAoc2VlIGh0dHA6Ly9ob21lLmF0dC5uZXQvfnBlcmxzcGluci9kaWZmcy9HcmVnQm9va19jeWd3aW4uZGlmZikKKyAgICAtIDIuMDA6ICBkdWFsLWxpY2Vuc2VkIChhZGRlZCBHTlUgR1BMKQorCisgICAgICAgIFtSRVBPUlRFRCBCVUcgKHdpbjMyIG9ubHkpOiAgImNvbnRyaWIvZ3JlZ2Jvb2svd3BuZy5jIC0gY21kIGxpbmUKKyAgICAgICAgIGRvc2Ugbm90IHdvcmshICBJbiBvcmRlciB0byBkbyBzb21ldGhpbmcgdXNlZnVsIEkgbmVlZGVkIHRvIHJlZGlyZWN0CisgICAgICAgICBib3RoIGlucHV0IGFuZCBvdXRwdXQsIHdpdGggY3lnd2luIGFuZCB3aXRoIGJjYzMyIGFzIHdlbGwuICBVbmRlcgorICAgICAgICAgTGludXgsIHRoZSBzYW1lIHdwbmcgYXBwZWFycyB0byB3b3JrIGZpbmUuICBJIGRvbid0IGtub3cgd2hhdCBpcworICAgICAgICAgdGhlIHByb2JsZW0uIl0KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDcgR3JlZyBSb2Vsb2ZzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgICAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMsIiB3aXRob3V0IHdhcnJhbnR5IG9mIGFueSBraW5kLAorICAgICAgZXhwcmVzcyBvciBpbXBsaWVkLiAgSW4gbm8gZXZlbnQgc2hhbGwgdGhlIGF1dGhvciBvciBjb250cmlidXRvcnMKKyAgICAgIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIGluIGFueSB3YXkgZnJvbSB0aGUgdXNlIG9mCisgICAgICB0aGlzIHNvZnR3YXJlLgorCisgICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBEVUFMLUxJQ0VOU0VELiAgWW91IG1heSBtb2RpZnkgYW5kL29yCisgICAgICByZWRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIG9uZSBvZiB0aGUKKyAgICAgIGZvbGxvd2luZyB0d28gbGljZW5zZXMgKGF0IHlvdXIgb3B0aW9uKToKKworCisgICAgICBMSUNFTlNFIDEgKCJCU0QtbGlrZSB3aXRoIGFkdmVydGlzaW5nIGNsYXVzZSIpOgorCisgICAgICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAgICAgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUKKyAgICAgIGl0IGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKworICAgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLgorICAgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGEtCisgICAgICAgICB0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgICAgICAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKworICAgICAgICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBHcmVnIFJvZWxvZnMKKyAgICAgICAgICAgIGFuZCBjb250cmlidXRvcnMgZm9yIHRoZSBib29rLCAiUE5HOiBUaGUgRGVmaW5pdGl2ZSBHdWlkZSwiCisgICAgICAgICAgICBwdWJsaXNoZWQgYnkgTydSZWlsbHkgYW5kIEFzc29jaWF0ZXMuCisKKworICAgICAgTElDRU5TRSAyIChHTlUgR1BMIHYyIG9yIGxhdGVyKToKKworICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICAgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBQUk9HTkFNRSAgIndwbmciCisjZGVmaW5lIFZFUlNJT04gICAiMi4wMCBvZiAyIEp1bmUgMjAwNyIKKyNkZWZpbmUgQVBQTkFNRSAgICJTaW1wbGUgUEdNL1BQTS9QQU0gdG8gUE5HIENvbnZlcnRlciIKKworI2lmIGRlZmluZWQoX19NU0RPU19fKSB8fCBkZWZpbmVkKF9fT1MyX18pCisjICBkZWZpbmUgRE9TX09TMl9XMzIKKyNlbGlmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykKKyMgIGlmbmRlZiBfX0dOVUNfXyAgIC8qIHRyZWF0IFdpbjMyIG5hdGl2ZSBwb3J0cyBvZiBnY2MgYXMgVW5peCBlbnZpcm9ubWVudHMgKi8KKyMgICAgZGVmaW5lIERPU19PUzJfVzMyCisjICBlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNldGptcC5oPiAgICAgLyogZm9yIGptcGJ1ZiBkZWNsYXJhdGlvbiBpbiB3cml0ZXBuZy5oICovCisjaW5jbHVkZSA8dGltZS5oPgorCisjaWZkZWYgRE9TX09TMl9XMzIKKyMgIGluY2x1ZGUgPGlvLmg+ICAgICAgIC8qIGZvciBpc2F0dHkoKSwgc2V0bW9kZSgpIHByb3RvdHlwZXMgKi8KKyMgIGluY2x1ZGUgPGZjbnRsLmg+ICAgIC8qIE9fQklOQVJZIGZvciBmZG9wZW4oKSB3aXRob3V0IHRleHQgdHJhbnNsYXRpb24gKi8KKyMgIGlmZGVmIF9fRU1YX18KKyMgICAgaWZuZGVmIGdldGNoCisjICAgICAgZGVmaW5lIGdldGNoKCkgX3JlYWRfa2JkKDAsIDEsIDApICAgIC8qIG5lZWQgZ2V0Y2hlKCkgKi8KKyMgICAgZW5kaWYKKyMgIGVsc2UgLyogIV9fRU1YX18gKi8KKyMgICAgaWZkZWYgX19HTzMyX18KKyMgICAgICBpbmNsdWRlIDxwYy5oPgorIyAgICAgIGRlZmluZSBnZXRjaCgpIGdldGtleSgpICAvKiBHUlI6ICBuZWVkIGdldGNoZSgpICovCisjICAgIGVsc2UKKyMgICAgICBpbmNsdWRlIDxjb25pby5oPiAgICAgICAgLyogZm9yIGdldGNoZSgpIGNvbnNvbGUgaW5wdXQgKi8KKyMgICAgZW5kaWYKKyMgIGVuZGlmIC8qID9fX0VNWF9fICovCisjICBkZWZpbmUgRkdFVFMoYnVmLGxlbixzdHJlYW0pICBkb3Nfa2JkX2dldHMoYnVmLGxlbikKKyNlbHNlCisjICBpbmNsdWRlIDx1bmlzdGQuaD4gICAgICAgICAgIC8qIGZvciBpc2F0dHkoKSBwcm90b3R5cGUgKi8KKyMgIGRlZmluZSBGR0VUUyBmZ2V0cworI2VuZGlmCisKKy8qICNkZWZpbmUgREVCVUcgIDogIHRoaXMgZW5hYmxlcyB0aGUgVHJhY2UoKSBtYWNyb3MgKi8KKworLyogI2RlZmluZSBGT1JCSURfTEFUSU4xX0NUUkwgIDogIHRoaXMgcmVxdWlyZXMgdGhlIHVzZXIgdG8gcmUtZW50ZXIgYW55CisgICB0ZXh0IHRoYXQgaW5jbHVkZXMgY29udHJvbCBjaGFyYWN0ZXJzIGRpc2NvdXJhZ2VkIGJ5IHRoZSBQTkcgc3BlYzsgdGV4dAorICAgdGhhdCBpbmNsdWRlcyBhbiBlc2NhcGUgY2hhcmFjdGVyICgyNykgbXVzdCBiZSByZS1lbnRlcmVkIHJlZ2FyZGxlc3MgKi8KKworI2luY2x1ZGUgIndyaXRlcG5nLmgiICAgLyogdHlwZWRlZnMsIGNvbW1vbiBtYWNyb3MsIHdyaXRlcG5nIHByb3RvdHlwZXMgKi8KKworCisKKy8qIGxvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIGludCAgd3BuZ19pc3ZhbGlkX2xhdGluMSh1Y2ggKnAsIGludCBsZW4pOworc3RhdGljIHZvaWQgd3BuZ19jbGVhbnVwKHZvaWQpOworCisjaWZkZWYgRE9TX09TMl9XMzIKKyAgIHN0YXRpYyBjaGFyICpkb3Nfa2JkX2dldHMoY2hhciAqYnVmLCBpbnQgbGVuKTsKKyNlbmRpZgorCisKKworc3RhdGljIG1haW5wcm9nX2luZm8gd3BuZ19pbmZvOyAgIC8qIGxvbmUgZ2xvYmFsICovCisKKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisjaWZuZGVmIERPU19PUzJfVzMyCisgICAgRklMRSAqa2V5YmQ7CisjZW5kaWYKKyNpZmRlZiBzZ2kKKyAgICBGSUxFICp0bXBmaWxlOyAgICAgIC8qIG9yIHdlIGNvdWxkIGp1c3QgdXNlIGtleWJkLCBzaW5jZSBubyBvdmVybGFwICovCisgICAgY2hhciB0bXBsaW5lWzgwXTsKKyNlbmRpZgorICAgIGNoYXIgKmlubmFtZSA9IE5VTEwsIG91dG5hbWVbMjU2XTsKKyAgICBjaGFyICpwLCBwbm1jaGFyLCBwbm1saW5lWzI1Nl07CisgICAgY2hhciAqYmdzdHIsICp0ZXh0YnVmID0gTlVMTDsKKyAgICB1bGcgcm93Ynl0ZXM7CisgICAgaW50IHJjLCBsZW4gPSAwOworICAgIGludCBlcnJvciA9IDA7CisgICAgaW50IHRleHQgPSBGQUxTRTsKKyAgICBpbnQgbWF4dmFsOworICAgIGRvdWJsZSBMVVRfZXhwb25lbnQ7ICAgICAgICAgICAgICAgIC8qIGp1c3QgdGhlIGxvb2t1cCB0YWJsZSAqLworICAgIGRvdWJsZSBDUlRfZXhwb25lbnQgPSAyLjI7ICAgICAgICAgIC8qIGp1c3QgdGhlIG1vbml0b3IgKi8KKyAgICBkb3VibGUgZGVmYXVsdF9kaXNwbGF5X2V4cG9uZW50OyAgICAvKiB3aG9sZSBkaXNwbGF5IHN5c3RlbSAqLworICAgIGRvdWJsZSBkZWZhdWx0X2dhbW1hID0gMC4wOworCisKKyAgICB3cG5nX2luZm8uaW5maWxlID0gTlVMTDsKKyAgICB3cG5nX2luZm8ub3V0ZmlsZSA9IE5VTEw7CisgICAgd3BuZ19pbmZvLmltYWdlX2RhdGEgPSBOVUxMOworICAgIHdwbmdfaW5mby5yb3dfcG9pbnRlcnMgPSBOVUxMOworICAgIHdwbmdfaW5mby5maWx0ZXIgPSBGQUxTRTsKKyAgICB3cG5nX2luZm8uaW50ZXJsYWNlZCA9IEZBTFNFOworICAgIHdwbmdfaW5mby5oYXZlX2JnID0gRkFMU0U7CisgICAgd3BuZ19pbmZvLmhhdmVfdGltZSA9IEZBTFNFOworICAgIHdwbmdfaW5mby5oYXZlX3RleHQgPSAwOworICAgIHdwbmdfaW5mby5nYW1tYSA9IDAuMDsKKworCisgICAgLyogRmlyc3QgZ2V0IHRoZSBkZWZhdWx0IHZhbHVlIGZvciBvdXIgZGlzcGxheS1zeXN0ZW0gZXhwb25lbnQsIGkuZS4sCisgICAgICogdGhlIHByb2R1Y3Qgb2YgdGhlIENSVCBleHBvbmVudCBhbmQgdGhlIGV4cG9uZW50IGNvcnJlc3BvbmRpbmcgdG8KKyAgICAgKiB0aGUgZnJhbWUtYnVmZmVyJ3MgbG9va3VwIHRhYmxlIChMVVQpLCBpZiBhbnkuICBJZiB0aGUgUE5NIGltYWdlCisgICAgICogbG9va3MgY29ycmVjdCBvbiB0aGUgdXNlcidzIGRpc3BsYXkgc3lzdGVtLCBpdHMgZmlsZSBnYW1tYSBpcyB0aGUKKyAgICAgKiBpbnZlcnNlIG9mIHRoaXMgdmFsdWUuICAoTm90ZSB0aGF0IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdAorICAgICAqIG9mIExVVCB2YWx1ZXMtLWUuZy4sIE9wZW5TdGVwIGhhcyBhIGxvdCBvZiB3ZWlyZCBvbmVzLS1idXQgaXQgc2hvdWxkCisgICAgICogY292ZXIgOTklIG9mIHRoZSBjdXJyZW50IHBvc3NpYmlsaXRpZXMuICBUaGlzIHNlY3Rpb24gbXVzdCBlbnN1cmUKKyAgICAgKiB0aGF0IGRlZmF1bHRfZGlzcGxheV9leHBvbmVudCBpcyBwb3NpdGl2ZS4pICovCisKKyNpZiBkZWZpbmVkKE5lWFQpCisgICAgLyogdGhpcmQtcGFydHkgdXRpbGl0aWVzIGNhbiBtb2RpZnkgdGhlIGRlZmF1bHQgTFVUIGV4cG9uZW50ICovCisgICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gMi4yOworICAgIC8qCisgICAgaWYgKHNvbWVfbmV4dF9mdW5jdGlvbl90aGF0X3JldHVybnNfZ2FtbWEoJm5leHRfZ2FtbWEpKQorICAgICAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyBuZXh0X2dhbW1hOworICAgICAqLworI2VsaWYgZGVmaW5lZChzZ2kpCisgICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gMS43OworICAgIC8qIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhbnkgZG9jdW1lbnRlZCBmdW5jdGlvbiB0bworICAgICAqIGdldCB0aGUgImdhbW1hIiB2YWx1ZSwgc28gd2UgZG8gaXQgdGhlIGhhcmQgd2F5ICovCisgICAgdG1wZmlsZSA9IGZvcGVuKCIvZXRjL2NvbmZpZy9zeXN0ZW0uZ2xHYW1tYVZhbCIsICJyIik7CisgICAgaWYgKHRtcGZpbGUpIHsKKyAgICAgICAgZG91YmxlIHNnaV9nYW1tYTsKKworICAgICAgICBmZ2V0cyh0bXBsaW5lLCA4MCwgdG1wZmlsZSk7CisgICAgICAgIGZjbG9zZSh0bXBmaWxlKTsKKyAgICAgICAgc2dpX2dhbW1hID0gYXRvZih0bXBsaW5lKTsKKyAgICAgICAgaWYgKHNnaV9nYW1tYSA+IDAuMCkKKyAgICAgICAgICAgIExVVF9leHBvbmVudCA9IDEuMCAvIHNnaV9nYW1tYTsKKyAgICB9CisjZWxpZiBkZWZpbmVkKE1hY2ludG9zaCkKKyAgICBMVVRfZXhwb25lbnQgPSAxLjggLyAyLjYxOworICAgIC8qCisgICAgaWYgKHNvbWVfbWFjX2Z1bmN0aW9uX3RoYXRfcmV0dXJuc19nYW1tYSgmbWFjX2dhbW1hKSkKKyAgICAgICAgTFVUX2V4cG9uZW50ID0gbWFjX2dhbW1hIC8gMi42MTsKKyAgICAgKi8KKyNlbHNlCisgICAgTFVUX2V4cG9uZW50ID0gMS4wOyAgIC8qIGFzc3VtZSBubyBMVVQ6ICBtb3N0IFBDcyAqLworI2VuZGlmCisKKyAgICAvKiB0aGUgZGVmYXVsdHMgYWJvdmUgZ2l2ZSAxLjAsIDEuMywgMS41IGFuZCAyLjIsIHJlc3BlY3RpdmVseTogKi8KKyAgICBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQgPSBMVVRfZXhwb25lbnQgKiBDUlRfZXhwb25lbnQ7CisKKworICAgIC8qIElmIHRoZSB1c2VyIGhhcyBzZXQgdGhlIFNDUkVFTl9HQU1NQSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhcyBzdWdnZXN0ZWQKKyAgICAgKiAoc29tZXdoYXQgaW1wcmVjaXNlbHkpIGluIHRoZSBsaWJwbmcgZG9jdW1lbnRhdGlvbiwgdXNlIHRoYXQ7IG90aGVyd2lzZQorICAgICAqIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSB3ZSBqdXN0IGNhbGN1bGF0ZWQuICBFaXRoZXIgd2F5LCB0aGUgdXNlciBtYXkKKyAgICAgKiBvdmVycmlkZSB0aGlzIHZpYSBhIGNvbW1hbmQtbGluZSBvcHRpb24uICovCisKKyAgICBpZiAoKHAgPSBnZXRlbnYoIlNDUkVFTl9HQU1NQSIpKSAhPSBOVUxMKSB7CisgICAgICAgIGRvdWJsZSBleHBvbmVudCA9IGF0b2YocCk7CisKKyAgICAgICAgaWYgKGV4cG9uZW50ID4gMC4wKQorICAgICAgICAgICAgZGVmYXVsdF9nYW1tYSA9IDEuMCAvIGV4cG9uZW50OworICAgIH0KKworICAgIGlmIChkZWZhdWx0X2dhbW1hID09IDAuMCkKKyAgICAgICAgZGVmYXVsdF9nYW1tYSA9IDEuMCAvIGRlZmF1bHRfZGlzcGxheV9leHBvbmVudDsKKworCisgICAgLyogTm93IHBhcnNlIHRoZSBjb21tYW5kIGxpbmUgZm9yIG9wdGlvbnMgYW5kIHRoZSBQTk0gZmlsZW5hbWUuICovCisKKyAgICB3aGlsZSAoKisrYXJndiAmJiAhZXJyb3IpIHsKKyAgICAgICAgaWYgKCFzdHJuY21wKCphcmd2LCAiLWkiLCAyKSkgeworICAgICAgICAgICAgd3BuZ19pbmZvLmludGVybGFjZWQgPSBUUlVFOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKCphcmd2LCAiLXRpbWUiLCAzKSkgeworICAgICAgICAgICAgd3BuZ19pbmZvLm1vZHRpbWUgPSB0aW1lKE5VTEwpOworICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfdGltZSA9IFRSVUU7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItdGV4dCIsIDMpKSB7CisgICAgICAgICAgICB0ZXh0ID0gVFJVRTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1nYW1tYSIsIDIpKSB7CisgICAgICAgICAgICBpZiAoISorK2FyZ3YpCisgICAgICAgICAgICAgICAgKytlcnJvcjsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHdwbmdfaW5mby5nYW1tYSA9IGF0b2YoKmFyZ3YpOworICAgICAgICAgICAgICAgIGlmICh3cG5nX2luZm8uZ2FtbWEgPD0gMC4wKQorICAgICAgICAgICAgICAgICAgICArK2Vycm9yOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdwbmdfaW5mby5nYW1tYSA+IDEuMDEpCisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQorICAgICAgICAgICAgICAgICAgICAgICIgd2FybmluZzogIGZpbGUgZ2FtbWFzIGFyZSB1c3VhbGx5IGxlc3MgdGhhbiAxLjBcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKCphcmd2LCAiLWJnY29sb3IiLCA0KSkgeworICAgICAgICAgICAgaWYgKCEqKythcmd2KQorICAgICAgICAgICAgICAgICsrZXJyb3I7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBiZ3N0ciA9ICphcmd2OworICAgICAgICAgICAgICAgIGlmIChzdHJsZW4oYmdzdHIpICE9IDcgfHwgYmdzdHJbMF0gIT0gJyMnKQorICAgICAgICAgICAgICAgICAgICArK2Vycm9yOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCByLCBnLCBiOyAgLyogdGhpcyB3YXkgcXVpZXRzIGNvbXBpbGVyIHdhcm5pbmdzICovCisKKyAgICAgICAgICAgICAgICAgICAgc3NjYW5mKGJnc3RyKzEsICIlMnglMnglMngiLCAmciwgJmcsICZiKTsKKyAgICAgICAgICAgICAgICAgICAgd3BuZ19pbmZvLmJnX3JlZCAgID0gKHVjaClyOworICAgICAgICAgICAgICAgICAgICB3cG5nX2luZm8uYmdfZ3JlZW4gPSAodWNoKWc7CisgICAgICAgICAgICAgICAgICAgIHdwbmdfaW5mby5iZ19ibHVlICA9ICh1Y2gpYjsKKyAgICAgICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfYmcgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgqKmFyZ3YgIT0gJy0nKSB7CisgICAgICAgICAgICAgICAgaW5uYW1lID0gKmFyZ3Y7CisgICAgICAgICAgICAgICAgaWYgKGFyZ3ZbMV0pICAgLyogc2hvdWxkbid0IGJlIGFueSBtb3JlIGFyZ3MgYWZ0ZXIgZmlsZW5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICsrZXJyb3I7ICAgLyogbm90IGV4cGVjdGluZyBhbnkgb3RoZXIgb3B0aW9ucyAqLworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKiBvcGVuIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzLCBvciByZWdpc3RlciBhbiBlcnJvciBhbmQgYWJvcnQgKi8KKworICAgIGlmICghaW5uYW1lKSB7CisgICAgICAgIGlmIChpc2F0dHkoMCkpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQorICAgICAgICAgICAgICAiOiAgbXVzdCBnaXZlIGlucHV0IGZpbGVuYW1lIG9yIHByb3ZpZGUgaW1hZ2UgZGF0YSB2aWEgc3RkaW5cbiIpOworICAgICAgICAgICAgKytlcnJvcjsKKyAgICAgICAgfSBlbHNlIHsKKyNpZmRlZiBET1NfT1MyX1czMgorICAgICAgICAgICAgLyogc29tZSBidWdneSBDIGxpYnJhcmllcyByZXF1aXJlIEJPVEggc2V0bW9kZSgpIGFuZCBmZG9wZW4oYmluKSAqLworICAgICAgICAgICAgc2V0bW9kZShmaWxlbm8oc3RkaW4pLCBPX0JJTkFSWSk7CisgICAgICAgICAgICBzZXRtb2RlKGZpbGVubyhzdGRvdXQpLCBPX0JJTkFSWSk7CisjZW5kaWYKKyAgICAgICAgICAgIGlmICgod3BuZ19pbmZvLmluZmlsZSA9IGZkb3BlbihmaWxlbm8oc3RkaW4pLCAicmIiKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQorICAgICAgICAgICAgICAgICAgIjogIHVuYWJsZSB0byByZW9wZW4gc3RkaW4gaW4gYmluYXJ5IG1vZGVcbiIpOworICAgICAgICAgICAgICAgICsrZXJyb3I7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGlmICgod3BuZ19pbmZvLm91dGZpbGUgPSBmZG9wZW4oZmlsZW5vKHN0ZG91dCksICJ3YiIpKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCisgICAgICAgICAgICAgICAgICAiOiAgdW5hYmxlIHRvIHJlb3BlbiBzdGRvdXQgaW4gYmluYXJ5IG1vZGVcbiIpOworICAgICAgICAgICAgICAgIGZjbG9zZSh3cG5nX2luZm8uaW5maWxlKTsKKyAgICAgICAgICAgICAgICArK2Vycm9yOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgd3BuZ19pbmZvLmZpbHRlciA9IFRSVUU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKChsZW4gPSBzdHJsZW4oaW5uYW1lKSkgPiAyNTApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBpbnB1dCBmaWxlbmFtZSBpcyB0b28gbG9uZyBbJWQgY2hhcnNdXG4iLAorICAgICAgICAgIGxlbik7CisgICAgICAgICsrZXJyb3I7CisgICAgfSBlbHNlIGlmICghKHdwbmdfaW5mby5pbmZpbGUgPSBmb3Blbihpbm5hbWUsICJyYiIpKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGNhbid0IG9wZW4gaW5wdXQgZmlsZSBbJXNdXG4iLCBpbm5hbWUpOworICAgICAgICArK2Vycm9yOworICAgIH0KKworICAgIGlmICghZXJyb3IpIHsKKyAgICAgICAgZmdldHMocG5tbGluZSwgMjU2LCB3cG5nX2luZm8uaW5maWxlKTsKKyAgICAgICAgaWYgKHBubWxpbmVbMF0gIT0gJ1AnIHx8ICgocG5tY2hhciA9IHBubWxpbmVbMV0pICE9ICc1JyAmJgorICAgICAgICAgICAgcG5tY2hhciAhPSAnNicgJiYgcG5tY2hhciAhPSAnOCcpKQorICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKKyAgICAgICAgICAgICAgIjogIGlucHV0IGZpbGUgWyVzXSBpcyBub3QgYSBiaW5hcnkgUEdNLCBQUE0gb3IgUEFNIGZpbGVcbiIsCisgICAgICAgICAgICAgIGlubmFtZSk7CisgICAgICAgICAgICArK2Vycm9yOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3BuZ19pbmZvLnBubXR5cGUgPSAoaW50KShwbm1jaGFyIC0gJzAnKTsKKyAgICAgICAgICAgIGlmICh3cG5nX2luZm8ucG5tdHlwZSAhPSA4KQorICAgICAgICAgICAgICAgIHdwbmdfaW5mby5oYXZlX2JnID0gRkFMU0U7ICAvKiBubyBuZWVkIGZvciBiZyBpZiBvcGFxdWUgKi8KKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBmZ2V0cyhwbm1saW5lLCAyNTYsIHdwbmdfaW5mby5pbmZpbGUpOyAgLyogbG9zZSBhbnkgY29tbWVudHMgKi8KKyAgICAgICAgICAgIH0gd2hpbGUgKHBubWxpbmVbMF0gPT0gJyMnKTsKKyAgICAgICAgICAgIHNzY2FuZihwbm1saW5lLCAiJWxkICVsZCIsICZ3cG5nX2luZm8ud2lkdGgsICZ3cG5nX2luZm8uaGVpZ2h0KTsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBmZ2V0cyhwbm1saW5lLCAyNTYsIHdwbmdfaW5mby5pbmZpbGUpOyAgLyogbW9yZSBjb21tZW50IGxpbmVzICovCisgICAgICAgICAgICB9IHdoaWxlIChwbm1saW5lWzBdID09ICcjJyk7CisgICAgICAgICAgICBzc2NhbmYocG5tbGluZSwgIiVkIiwgJm1heHZhbCk7CisgICAgICAgICAgICBpZiAod3BuZ19pbmZvLndpZHRoIDw9IDBMIHx8IHdwbmdfaW5mby5oZWlnaHQgPD0gMEwgfHwKKyAgICAgICAgICAgICAgICBtYXh2YWwgIT0gMjU1KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQorICAgICAgICAgICAgICAgICAgIjogIG9ubHkgcG9zaXRpdmUgd2lkdGgvaGVpZ2h0LCBtYXh2YWwgPT0gMjU1IGFsbG93ZWQgXG4iKTsKKyAgICAgICAgICAgICAgICArK2Vycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3BuZ19pbmZvLnNhbXBsZV9kZXB0aCA9IDg7ICAvKiA8PT0+IG1heHZhbCAyNTUgKi8KKworICAgICAgICAgICAgaWYgKCF3cG5nX2luZm8uZmlsdGVyKSB7CisgICAgICAgICAgICAgICAgLyogbWFrZSBvdXRuYW1lIGZyb20gaW5uYW1lICovCisgICAgICAgICAgICAgICAgaWYgKChwID0gc3RycmNocihpbm5hbWUsICcuJykpID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgKHAgLSBpbm5hbWUpICE9IChsZW4gLSA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmNweShvdXRuYW1lLCBpbm5hbWUpOworICAgICAgICAgICAgICAgICAgICBzdHJjcHkob3V0bmFtZStsZW4sICIucG5nIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuIC09IDQ7CisgICAgICAgICAgICAgICAgICAgIHN0cm5jcHkob3V0bmFtZSwgaW5uYW1lLCBsZW4pOworICAgICAgICAgICAgICAgICAgICBzdHJjcHkob3V0bmFtZStsZW4sICIucG5nIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIGNoZWNrIGlmIG91dG5hbWUgYWxyZWFkeSBleGlzdHM7IGlmIG5vdCwgb3BlbiAqLworICAgICAgICAgICAgICAgIGlmICgod3BuZ19pbmZvLm91dGZpbGUgPSBmb3BlbihvdXRuYW1lLCAicmIiKSkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIG91dHB1dCBmaWxlIGV4aXN0cyBbJXNdXG4iLAorICAgICAgICAgICAgICAgICAgICAgIG91dG5hbWUpOworICAgICAgICAgICAgICAgICAgICBmY2xvc2Uod3BuZ19pbmZvLm91dGZpbGUpOworICAgICAgICAgICAgICAgICAgICArK2Vycm9yOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoISh3cG5nX2luZm8ub3V0ZmlsZSA9IGZvcGVuKG91dG5hbWUsICJ3YiIpKSkgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGNhbid0IG9wZW4gb3V0cHV0IGZpbGUgWyVzXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBvdXRuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgICBmY2xvc2Uod3BuZ19pbmZvLmluZmlsZSk7CisgICAgICAgICAgICB3cG5nX2luZm8uaW5maWxlID0gTlVMTDsKKyAgICAgICAgICAgIGlmICh3cG5nX2luZm8uZmlsdGVyKSB7CisgICAgICAgICAgICAgICAgZmNsb3NlKHdwbmdfaW5mby5vdXRmaWxlKTsKKyAgICAgICAgICAgICAgICB3cG5nX2luZm8ub3V0ZmlsZSA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qIGlmIHdlIGhhZCBhbnkgZXJyb3JzLCBwcmludCB1c2FnZSBhbmQgZGllIGhvcnJpYmxlIGRlYXRoLi4uYXJyciEgKi8KKworICAgIGlmIChlcnJvcikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuJXMgJXM6ICAlc1xuIiwgUFJPR05BTUUsIFZFUlNJT04sIEFQUE5BTUUpOworICAgICAgICB3cml0ZXBuZ192ZXJzaW9uX2luZm8oKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIKKyJVc2FnZTogICVzIFstZ2FtbWEgZXhwXSBbLWJnY29sb3IgYmddIFstdGV4dF0gWy10aW1lXSBbLWludGVybGFjZV0gcG5tZmlsZVxuIgorIm9yOiAuLi4gfCAlcyBbLWdhbW1hIGV4cF0gWy1iZ2NvbG9yIGJnXSBbLXRleHRdIFstdGltZV0gWy1pbnRlcmxhY2VdIHwgLi4uXG4iCisgICAgICAgICAiICAgIGV4cCBcdHRyYW5zZmVyLWZ1bmN0aW9uIGV4cG9uZW50IChgYGdhbW1hJycpIG9mIHRoZSBpbWFnZSBpblxuIgorICAgICAgICAgIlx0XHQgIGZsb2F0aW5nLXBvaW50IGZvcm1hdCAoZS5nLiwgYGAlLjVmJycpOyBpZiBpbWFnZSBsb29rc1xuIgorICAgICAgICAgIlx0XHQgIGNvcnJlY3Qgb24gZ2l2ZW4gZGlzcGxheSBzeXN0ZW0sIGltYWdlIGdhbW1hIGlzIGVxdWFsIHRvXG4iCisgICAgICAgICAiXHRcdCAgaW52ZXJzZSBvZiBkaXNwbGF5LXN5c3RlbSBleHBvbmVudCwgaS5lLiwgMSAvIChMVVQgKiBDUlQpXG4iCisgICAgICAgICAiXHRcdCAgKHdoZXJlIExVVCA9IGxvb2t1cC10YWJsZSBleHBvbmVudCBhbmQgQ1JUID0gQ1JUIGV4cG9uZW50O1xuIgorICAgICAgICAgIlx0XHQgIGZpcnN0IHZhcmllcywgc2Vjb25kIGlzIHVzdWFsbHkgMi4yLCBhbGwgYXJlIHBvc2l0aXZlKVxuIgorICAgICAgICAgIiAgICBiZyAgXHRkZXNpcmVkIGJhY2tncm91bmQgY29sb3IgZm9yIGFscGhhLWNoYW5uZWwgaW1hZ2VzLCBpblxuIgorICAgICAgICAgIlx0XHQgIDctY2hhcmFjdGVyIGhleCBSR0IgZm9ybWF0IChlLmcuLCBgYCNmZjc3MDAnJyBmb3Igb3JhbmdlOlxuIgorICAgICAgICAgIlx0XHQgIHNhbWUgYXMgSFRNTCBjb2xvcnMpXG4iCisgICAgICAgICAiICAgIC10ZXh0XHRwcm9tcHQgaW50ZXJhY3RpdmVseSBmb3IgdGV4dCBpbmZvICh0RVh0IGNodW5rcylcbiIKKyAgICAgICAgICIgICAgLXRpbWVcdGluY2x1ZGUgYSB0SU1FIGNodW5rIChsYXN0IG1vZGlmaWNhdGlvbiB0aW1lKVxuIgorICAgICAgICAgIiAgICAtaW50ZXJsYWNlXHR3cml0ZSBpbnRlcmxhY2VkIFBORyBpbWFnZVxuIgorICAgICAgICAgIlxuIgorInBubWZpbGUgb3Igc3RkaW4gbXVzdCBiZSBhIGJpbmFyeSBQR00gKGBQNScpLCBQUE0gKGBQNicpIG9yIChleHRyZW1lbHlcbiIKKyJ1bm9mZmljaWFsIGFuZCB1bnN1cHBvcnRlZCEpIFBBTSAoYFA4JykgZmlsZS4gIEN1cnJlbnRseSBpdCBpcyByZXF1aXJlZFxuIgorInRvIGhhdmUgbWF4dmFsID09IDI1NSAoaS5lLiwgbm8gc2NhbGluZykuICBJZiBwbm1maWxlIGlzIHNwZWNpZmllZCwgaXRcbiIKKyJpcyBjb252ZXJ0ZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgUE5HIGZpbGUgd2l0aCB0aGUgc2FtZSBiYXNlIG5hbWUgYnV0IGFcbiIKKyJgYC5wbmcnJyBleHRlbnNpb247IGZpbGVzIHJlYWQgZnJvbSBzdGRpbiBhcmUgY29udmVydGVkIGFuZCBzZW50IHRvIHN0ZG91dC5cbiIKKyJUaGUgY29udmVyc2lvbiBpcyBwcm9ncmVzc2l2ZSAobG93IG1lbW9yeSB1c2FnZSkgdW5sZXNzIGludGVybGFjaW5nIGlzXG4iCisicmVxdWVzdGVkOyBpbiB0aGF0IGNhc2UgdGhlIHdob2xlIGltYWdlIHdpbGwgYmUgYnVmZmVyZWQgaW4gbWVtb3J5IGFuZFxuIgorIndyaXR0ZW4gaW4gb25lIGNhbGwuXG4iCisgICAgICAgICAiXG4iLCBQUk9HTkFNRSwgUFJPR05BTUUsIGRlZmF1bHRfZ2FtbWEpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworCisgICAgLyogcHJlcGFyZSB0aGUgdGV4dCBidWZmZXJzIGZvciBsaWJwbmcncyB1c2U7IG5vdGUgdGhhdCBldmVuIHRob3VnaAorICAgICAqIFBORydzIHBuZ190ZXh0IHN0cnVjdCBpbmNsdWRlcyBhIGxlbmd0aCBmaWVsZCwgd2UgZG9uJ3QgaGF2ZSB0byBmaWxsCisgICAgICogaXQgb3V0ICovCisKKyAgICBpZiAodGV4dCAmJgorI2lmbmRlZiBET1NfT1MyX1czMgorICAgICAgICAoa2V5YmQgPSBmZG9wZW4oZmlsZW5vKHN0ZGVyciksICJyIikpICE9IE5VTEwgJiYKKyNlbmRpZgorICAgICAgICAodGV4dGJ1ZiA9IChjaGFyICopbWFsbG9jKCg1ICsgOSkqNzUpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50IGksIHZhbGlkLCByZXN1bHQ7CisKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgIkVudGVyIHRleHQgaW5mbyAobm8gbW9yZSB0aGFuIDcyIGNoYXJhY3RlcnMgcGVyIGxpbmUpO1xuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAidG8gc2tpcCBhIGZpZWxkLCBoaXQgdGhlIDxFbnRlcj4ga2V5LlxuIik7CisgICAgICAgIC8qIG5vdGU6ICBqdXN0IDxFbnRlcj4gbGVhdmVzIGxlbiA9PSAxICovCisKKyAgICAgICAgZG8geworICAgICAgICAgICAgdmFsaWQgPSBUUlVFOworICAgICAgICAgICAgcCA9IHRleHRidWYgKyBURVhUX1RJVExFX09GRlNFVDsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICBUaXRsZTogIik7CisgICAgICAgICAgICBmZmx1c2goc3RkZXJyKTsKKyAgICAgICAgICAgIGlmIChGR0VUUyhwLCA3NCwga2V5YmQpICYmIChsZW4gPSBzdHJsZW4ocCkpID4gMSkgeworICAgICAgICAgICAgICAgIGlmIChwW2xlbi0xXSA9PSAnXG4nKQorICAgICAgICAgICAgICAgICAgICBwWy0tbGVuXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgd3BuZ19pbmZvLnRpdGxlID0gcDsKKyAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV90ZXh0IHw9IFRFWFRfVElUTEU7CisgICAgICAgICAgICAgICAgaWYgKChyZXN1bHQgPSB3cG5nX2lzdmFsaWRfbGF0aW4xKCh1Y2ggKilwLCBsZW4pKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgICIgUFJPR05BTUUgIiB3YXJuaW5nOiAgY2hhcmFjdGVyIGNvZGUiCisgICAgICAgICAgICAgICAgICAgICAgIiAldSBpcyAlc2Rpc2NvdXJhZ2VkIGJ5IHRoZSBQTkdcbiAgICBzcGVjaWZpY2F0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAiW2ZpcnN0IG9jY3VycmVuY2Ugd2FzIGF0IGNoYXJhY3RlciBwb3NpdGlvbiAjJWRdXG4iLAorICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClwW3Jlc3VsdF0sIChwW3Jlc3VsdF0gPT0gMjcpPyAic3Ryb25nbHkgIiA6ICIiLAorICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCsxKTsKKyAgICAgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZGVycik7CisjaWZkZWYgRk9SQklEX0xBVElOMV9DVFJMCisgICAgICAgICAgICAgICAgICAgIHdwbmdfaW5mby5oYXZlX3RleHQgJj0gflRFWFRfVElUTEU7CisgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gRkFMU0U7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICBpZiAocFtyZXN1bHRdID09IDI3KSB7ICAgIC8qIGVzY2FwZSBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHdwbmdfaW5mby5oYXZlX3RleHQgJj0gflRFWFRfVElUTEU7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKCF2YWxpZCk7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgdmFsaWQgPSBUUlVFOworICAgICAgICAgICAgcCA9IHRleHRidWYgKyBURVhUX0FVVEhPUl9PRkZTRVQ7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgQXV0aG9yOiAiKTsKKyAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOworICAgICAgICAgICAgaWYgKEZHRVRTKHAsIDc0LCBrZXliZCkgJiYgKGxlbiA9IHN0cmxlbihwKSkgPiAxKSB7CisgICAgICAgICAgICAgICAgaWYgKHBbbGVuLTFdID09ICdcbicpCisgICAgICAgICAgICAgICAgICAgIHBbLS1sZW5dID0gJ1wwJzsKKyAgICAgICAgICAgICAgICB3cG5nX2luZm8uYXV0aG9yID0gcDsKKyAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV90ZXh0IHw9IFRFWFRfQVVUSE9SOworICAgICAgICAgICAgICAgIGlmICgocmVzdWx0ID0gd3BuZ19pc3ZhbGlkX2xhdGluMSgodWNoICopcCwgbGVuKSkgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAiIFBST0dOQU1FICIgd2FybmluZzogIGNoYXJhY3RlciBjb2RlIgorICAgICAgICAgICAgICAgICAgICAgICIgJXUgaXMgJXNkaXNjb3VyYWdlZCBieSB0aGUgUE5HXG4gICAgc3BlY2lmaWNhdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgIltmaXJzdCBvY2N1cnJlbmNlIHdhcyBhdCBjaGFyYWN0ZXIgcG9zaXRpb24gIyVkXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcFtyZXN1bHRdLCAocFtyZXN1bHRdID09IDI3KT8gInN0cm9uZ2x5ICIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICByZXN1bHQrMSk7CisgICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOworI2lmZGVmIEZPUkJJRF9MQVRJTjFfQ1RSTAorICAgICAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV90ZXh0ICY9IH5URVhUX0FVVEhPUjsKKyAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBGQUxTRTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIGlmIChwW3Jlc3VsdF0gPT0gMjcpIHsgICAgLyogZXNjYXBlIGNoYXJhY3RlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfdGV4dCAmPSB+VEVYVF9BVVRIT1I7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKCF2YWxpZCk7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgdmFsaWQgPSBUUlVFOworICAgICAgICAgICAgcCA9IHRleHRidWYgKyBURVhUX0RFU0NfT0ZGU0VUOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgIERlc2NyaXB0aW9uICh1cCB0byA5IGxpbmVzKTpcbiIpOworICAgICAgICAgICAgZm9yIChpID0gMTsgIGkgPCAxMDsgICsraSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgIFslZF0gIiwgaSk7CisgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZGVycik7CisgICAgICAgICAgICAgICAgaWYgKEZHRVRTKHAsIDc0LCBrZXliZCkgJiYgKGxlbiA9IHN0cmxlbihwKSkgPiAxKQorICAgICAgICAgICAgICAgICAgICBwICs9IGxlbjsgICAvKiBub3cgcG9pbnRzIGF0IE5VTEw7IGNoYXIgYmVmb3JlIGlzIG5ld2xpbmUgKi8KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChsZW4gPSBwIC0gKHRleHRidWYgKyBURVhUX0RFU0NfT0ZGU0VUKSkgPiAxKSB7CisgICAgICAgICAgICAgICAgaWYgKHBbLTFdID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgcFstMV0gPSAnXDAnOworICAgICAgICAgICAgICAgICAgICAtLWxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3BuZ19pbmZvLmRlc2MgPSB0ZXh0YnVmICsgVEVYVF9ERVNDX09GRlNFVDsKKyAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV90ZXh0IHw9IFRFWFRfREVTQzsKKyAgICAgICAgICAgICAgICBwID0gdGV4dGJ1ZiArIFRFWFRfREVTQ19PRkZTRVQ7CisgICAgICAgICAgICAgICAgaWYgKChyZXN1bHQgPSB3cG5nX2lzdmFsaWRfbGF0aW4xKCh1Y2ggKilwLCBsZW4pKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgICIgUFJPR05BTUUgIiB3YXJuaW5nOiAgY2hhcmFjdGVyIGNvZGUiCisgICAgICAgICAgICAgICAgICAgICAgIiAldSBpcyAlc2Rpc2NvdXJhZ2VkIGJ5IHRoZSBQTkdcbiAgICBzcGVjaWZpY2F0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAiW2ZpcnN0IG9jY3VycmVuY2Ugd2FzIGF0IGNoYXJhY3RlciBwb3NpdGlvbiAjJWRdXG4iLAorICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClwW3Jlc3VsdF0sIChwW3Jlc3VsdF0gPT0gMjcpPyAic3Ryb25nbHkgIiA6ICIiLAorICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCsxKTsKKyAgICAgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZGVycik7CisjaWZkZWYgRk9SQklEX0xBVElOMV9DVFJMCisgICAgICAgICAgICAgICAgICAgIHdwbmdfaW5mby5oYXZlX3RleHQgJj0gflRFWFRfREVTQzsKKyAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBGQUxTRTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIGlmIChwW3Jlc3VsdF0gPT0gMjcpIHsgICAgLyogZXNjYXBlIGNoYXJhY3RlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfdGV4dCAmPSB+VEVYVF9ERVNDOworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlICghdmFsaWQpOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHZhbGlkID0gVFJVRTsKKyAgICAgICAgICAgIHAgPSB0ZXh0YnVmICsgVEVYVF9DT1BZX09GRlNFVDsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICBDb3B5cmlnaHQ6ICIpOworICAgICAgICAgICAgZmZsdXNoKHN0ZGVycik7CisgICAgICAgICAgICBpZiAoRkdFVFMocCwgNzQsIGtleWJkKSAmJiAobGVuID0gc3RybGVuKHApKSA+IDEpIHsKKyAgICAgICAgICAgICAgICBpZiAocFtsZW4tMV0gPT0gJ1xuJykKKyAgICAgICAgICAgICAgICAgICAgcFstLWxlbl0gPSAnXDAnOworICAgICAgICAgICAgICAgIHdwbmdfaW5mby5jb3B5cmlnaHQgPSBwOworICAgICAgICAgICAgICAgIHdwbmdfaW5mby5oYXZlX3RleHQgfD0gVEVYVF9DT1BZOworICAgICAgICAgICAgICAgIGlmICgocmVzdWx0ID0gd3BuZ19pc3ZhbGlkX2xhdGluMSgodWNoICopcCwgbGVuKSkgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAiIFBST0dOQU1FICIgd2FybmluZzogIGNoYXJhY3RlciBjb2RlIgorICAgICAgICAgICAgICAgICAgICAgICIgJXUgaXMgJXNkaXNjb3VyYWdlZCBieSB0aGUgUE5HXG4gICAgc3BlY2lmaWNhdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgIltmaXJzdCBvY2N1cnJlbmNlIHdhcyBhdCBjaGFyYWN0ZXIgcG9zaXRpb24gIyVkXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcFtyZXN1bHRdLCAocFtyZXN1bHRdID09IDI3KT8gInN0cm9uZ2x5ICIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICByZXN1bHQrMSk7CisgICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOworI2lmZGVmIEZPUkJJRF9MQVRJTjFfQ1RSTAorICAgICAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV90ZXh0ICY9IH5URVhUX0NPUFk7CisgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gRkFMU0U7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICBpZiAocFtyZXN1bHRdID09IDI3KSB7ICAgIC8qIGVzY2FwZSBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHdwbmdfaW5mby5oYXZlX3RleHQgJj0gflRFWFRfQ09QWTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoIXZhbGlkKTsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICB2YWxpZCA9IFRSVUU7CisgICAgICAgICAgICBwID0gdGV4dGJ1ZiArIFRFWFRfRU1BSUxfT0ZGU0VUOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgIEUtbWFpbDogIik7CisgICAgICAgICAgICBmZmx1c2goc3RkZXJyKTsKKyAgICAgICAgICAgIGlmIChGR0VUUyhwLCA3NCwga2V5YmQpICYmIChsZW4gPSBzdHJsZW4ocCkpID4gMSkgeworICAgICAgICAgICAgICAgIGlmIChwW2xlbi0xXSA9PSAnXG4nKQorICAgICAgICAgICAgICAgICAgICBwWy0tbGVuXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgd3BuZ19pbmZvLmVtYWlsID0gcDsKKyAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV90ZXh0IHw9IFRFWFRfRU1BSUw7CisgICAgICAgICAgICAgICAgaWYgKChyZXN1bHQgPSB3cG5nX2lzdmFsaWRfbGF0aW4xKCh1Y2ggKilwLCBsZW4pKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgICIgUFJPR05BTUUgIiB3YXJuaW5nOiAgY2hhcmFjdGVyIGNvZGUiCisgICAgICAgICAgICAgICAgICAgICAgIiAldSBpcyAlc2Rpc2NvdXJhZ2VkIGJ5IHRoZSBQTkdcbiAgICBzcGVjaWZpY2F0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAiW2ZpcnN0IG9jY3VycmVuY2Ugd2FzIGF0IGNoYXJhY3RlciBwb3NpdGlvbiAjJWRdXG4iLAorICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClwW3Jlc3VsdF0sIChwW3Jlc3VsdF0gPT0gMjcpPyAic3Ryb25nbHkgIiA6ICIiLAorICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCsxKTsKKyAgICAgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZGVycik7CisjaWZkZWYgRk9SQklEX0xBVElOMV9DVFJMCisgICAgICAgICAgICAgICAgICAgIHdwbmdfaW5mby5oYXZlX3RleHQgJj0gflRFWFRfRU1BSUw7CisgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gRkFMU0U7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICBpZiAocFtyZXN1bHRdID09IDI3KSB7ICAgIC8qIGVzY2FwZSBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHdwbmdfaW5mby5oYXZlX3RleHQgJj0gflRFWFRfRU1BSUw7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKCF2YWxpZCk7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgdmFsaWQgPSBUUlVFOworICAgICAgICAgICAgcCA9IHRleHRidWYgKyBURVhUX1VSTF9PRkZTRVQ7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgVVJMOiAiKTsKKyAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOworICAgICAgICAgICAgaWYgKEZHRVRTKHAsIDc0LCBrZXliZCkgJiYgKGxlbiA9IHN0cmxlbihwKSkgPiAxKSB7CisgICAgICAgICAgICAgICAgaWYgKHBbbGVuLTFdID09ICdcbicpCisgICAgICAgICAgICAgICAgICAgIHBbLS1sZW5dID0gJ1wwJzsKKyAgICAgICAgICAgICAgICB3cG5nX2luZm8udXJsID0gcDsKKyAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV90ZXh0IHw9IFRFWFRfVVJMOworICAgICAgICAgICAgICAgIGlmICgocmVzdWx0ID0gd3BuZ19pc3ZhbGlkX2xhdGluMSgodWNoICopcCwgbGVuKSkgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAiIFBST0dOQU1FICIgd2FybmluZzogIGNoYXJhY3RlciBjb2RlIgorICAgICAgICAgICAgICAgICAgICAgICIgJXUgaXMgJXNkaXNjb3VyYWdlZCBieSB0aGUgUE5HXG4gICAgc3BlY2lmaWNhdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgIltmaXJzdCBvY2N1cnJlbmNlIHdhcyBhdCBjaGFyYWN0ZXIgcG9zaXRpb24gIyVkXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcFtyZXN1bHRdLCAocFtyZXN1bHRdID09IDI3KT8gInN0cm9uZ2x5ICIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICByZXN1bHQrMSk7CisgICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOworI2lmZGVmIEZPUkJJRF9MQVRJTjFfQ1RSTAorICAgICAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV90ZXh0ICY9IH5URVhUX1VSTDsKKyAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBGQUxTRTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIGlmIChwW3Jlc3VsdF0gPT0gMjcpIHsgICAgLyogZXNjYXBlIGNoYXJhY3RlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfdGV4dCAmPSB+VEVYVF9VUkw7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKCF2YWxpZCk7CisKKyNpZm5kZWYgRE9TX09TMl9XMzIKKyAgICAgICAgZmNsb3NlKGtleWJkKTsKKyNlbmRpZgorCisgICAgfSBlbHNlIGlmICh0ZXh0KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGV4dFxuIik7CisgICAgICAgIHRleHQgPSBGQUxTRTsKKyAgICAgICAgd3BuZ19pbmZvLmhhdmVfdGV4dCA9IDA7CisgICAgfQorCisKKyAgICAvKiBhbGxvY2F0ZSBsaWJwbmcgc3R1ZmYsIGluaXRpYWxpemUgdHJhbnNmb3JtYXRpb25zLCB3cml0ZSBwcmUtSURBVCBkYXRhICovCisKKyAgICBpZiAoKHJjID0gd3JpdGVwbmdfaW5pdCgmd3BuZ19pbmZvKSkgIT0gMCkgeworICAgICAgICBzd2l0Y2ggKHJjKSB7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCisgICAgICAgICAgICAgICAgICAiOiAgbGlicG5nIGluaXRpYWxpemF0aW9uIHByb2JsZW0gKGxvbmdqbXApXG4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGluc3VmZmljaWVudCBtZW1vcnlcbiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKKyAgICAgICAgICAgICAgICAgICI6ICBpbnRlcm5hbCBsb2dpYyBlcnJvciAodW5leHBlY3RlZCBQTk0gdHlwZSlcbiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKKyAgICAgICAgICAgICAgICAgICI6ICB1bmtub3duIHdyaXRlcG5nX2luaXQoKSBlcnJvclxuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZXhpdChyYyk7CisgICAgfQorCisKKyAgICAvKiBmcmVlIHRleHRidWYsIHNpbmNlIGl0J3MgYSBjb21wbGV0ZWx5IGxvY2FsIHZhcmlhYmxlIGFuZCBhbGwgdGV4dCBpbmZvCisgICAgICogaGFzIGp1c3QgYmVlbiB3cml0dGVuIHRvIHRoZSBQTkcgZmlsZSAqLworCisgICAgaWYgKHRleHQgJiYgdGV4dGJ1ZikgeworICAgICAgICBmcmVlKHRleHRidWYpOworICAgICAgICB0ZXh0YnVmID0gTlVMTDsKKyAgICB9CisKKworICAgIC8qIGNhbGN1bGF0ZSByb3dieXRlcyBvbiBiYXNpcyBvZiBpbWFnZSB0eXBlOyBub3RlIHRoYXQgdGhpcyBiZWNvbWVzIG11Y2gKKyAgICAgKiBtb3JlIGNvbXBsaWNhdGVkIGlmIHdlIGNob29zZSB0byBzdXBwb3J0IFBCTSB0eXBlLCBBU0NJSSBQTk0gdHlwZXMsIG9yCisgICAgICogMTYtYml0LXBlci1zYW1wbGUgYmluYXJ5IGRhdGEgW2N1cnJlbnRseSBub3QgYW4gb2ZmaWNpYWwgTmV0UEJNIHR5cGVdICovCisKKyAgICBpZiAod3BuZ19pbmZvLnBubXR5cGUgPT0gNSkKKyAgICAgICAgcm93Ynl0ZXMgPSB3cG5nX2luZm8ud2lkdGg7CisgICAgZWxzZSBpZiAod3BuZ19pbmZvLnBubXR5cGUgPT0gNikKKyAgICAgICAgcm93Ynl0ZXMgPSB3cG5nX2luZm8ud2lkdGggKiAzOworICAgIGVsc2UgLyogaWYgKHdwbmdfaW5mby5wbm10eXBlID09IDgpICovCisgICAgICAgIHJvd2J5dGVzID0gd3BuZ19pbmZvLndpZHRoICogNDsKKworCisgICAgLyogcmVhZCBhbmQgd3JpdGUgdGhlIGltYWdlLCBlaXRoZXIgaW4gaXRzIGVudGlyZXR5IChpZiB3cml0aW5nIGludGVybGFjZWQKKyAgICAgKiBQTkcpIG9yIHJvdyBieSByb3cgKGlmIG5vbi1pbnRlcmxhY2VkKSAqLworCisgICAgZnByaW50ZihzdGRlcnIsICJFbmNvZGluZyBpbWFnZSBkYXRhLi4uXG4iKTsKKyAgICBmZmx1c2goc3RkZXJyKTsKKworICAgIGlmICh3cG5nX2luZm8uaW50ZXJsYWNlZCkgeworICAgICAgICBsb25nIGk7CisgICAgICAgIHVsZyBieXRlczsKKyAgICAgICAgdWxnIGltYWdlX2J5dGVzID0gcm93Ynl0ZXMgKiB3cG5nX2luZm8uaGVpZ2h0OyAgIC8qIG92ZXJmbG93PyAqLworCisgICAgICAgIHdwbmdfaW5mby5pbWFnZV9kYXRhID0gKHVjaCAqKW1hbGxvYyhpbWFnZV9ieXRlcyk7CisgICAgICAgIHdwbmdfaW5mby5yb3dfcG9pbnRlcnMgPSAodWNoICoqKW1hbGxvYyh3cG5nX2luZm8uaGVpZ2h0KnNpemVvZih1Y2ggKikpOworICAgICAgICBpZiAod3BuZ19pbmZvLmltYWdlX2RhdGEgPT0gTlVMTCB8fCB3cG5nX2luZm8ucm93X3BvaW50ZXJzID09IE5VTEwpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgaW5zdWZmaWNpZW50IG1lbW9yeSBmb3IgaW1hZ2UgZGF0YVxuIik7CisgICAgICAgICAgICB3cml0ZXBuZ19jbGVhbnVwKCZ3cG5nX2luZm8pOworICAgICAgICAgICAgd3BuZ19jbGVhbnVwKCk7CisgICAgICAgICAgICBleGl0KDUpOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7ICBpIDwgd3BuZ19pbmZvLmhlaWdodDsgICsraSkKKyAgICAgICAgICAgIHdwbmdfaW5mby5yb3dfcG9pbnRlcnNbaV0gPSB3cG5nX2luZm8uaW1hZ2VfZGF0YSArIGkqcm93Ynl0ZXM7CisgICAgICAgIGJ5dGVzID0gZnJlYWQod3BuZ19pbmZvLmltYWdlX2RhdGEsIDEsIGltYWdlX2J5dGVzLCB3cG5nX2luZm8uaW5maWxlKTsKKyAgICAgICAgaWYgKGJ5dGVzICE9IGltYWdlX2J5dGVzKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGV4cGVjdGVkICVsdSBieXRlcywgZ290ICVsdSBieXRlc1xuIiwKKyAgICAgICAgICAgICAgaW1hZ2VfYnl0ZXMsIGJ5dGVzKTsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAoY29udGludWluZyBhbnl3YXkpXG4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod3JpdGVwbmdfZW5jb2RlX2ltYWdlKCZ3cG5nX2luZm8pICE9IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQorICAgICAgICAgICAgICAiOiAgbGlicG5nIHByb2JsZW0gKGxvbmdqbXApIHdoaWxlIHdyaXRpbmcgaW1hZ2UgZGF0YVxuIik7CisgICAgICAgICAgICB3cml0ZXBuZ19jbGVhbnVwKCZ3cG5nX2luZm8pOworICAgICAgICAgICAgd3BuZ19jbGVhbnVwKCk7CisgICAgICAgICAgICBleGl0KDIpOworICAgICAgICB9CisKKyAgICB9IGVsc2UgLyogbm90IGludGVybGFjZWQ6ICB3cml0ZSBwcm9ncmVzc2l2ZWx5IChyb3cgYnkgcm93KSAqLyB7CisgICAgICAgIGxvbmcgajsKKyAgICAgICAgdWxnIGJ5dGVzOworCisgICAgICAgIHdwbmdfaW5mby5pbWFnZV9kYXRhID0gKHVjaCAqKW1hbGxvYyhyb3dieXRlcyk7CisgICAgICAgIGlmICh3cG5nX2luZm8uaW1hZ2VfZGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGluc3VmZmljaWVudCBtZW1vcnkgZm9yIHJvdyBkYXRhXG4iKTsKKyAgICAgICAgICAgIHdyaXRlcG5nX2NsZWFudXAoJndwbmdfaW5mbyk7CisgICAgICAgICAgICB3cG5nX2NsZWFudXAoKTsKKyAgICAgICAgICAgIGV4aXQoNSk7CisgICAgICAgIH0KKyAgICAgICAgZXJyb3IgPSAwOworICAgICAgICBmb3IgKGogPSB3cG5nX2luZm8uaGVpZ2h0OyAgaiA+IDBMOyAgLS1qKSB7CisgICAgICAgICAgICBieXRlcyA9IGZyZWFkKHdwbmdfaW5mby5pbWFnZV9kYXRhLCAxLCByb3dieXRlcywgd3BuZ19pbmZvLmluZmlsZSk7CisgICAgICAgICAgICBpZiAoYnl0ZXMgIT0gcm93Ynl0ZXMpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKKyAgICAgICAgICAgICAgICAgICI6ICBleHBlY3RlZCAlbHUgYnl0ZXMsIGdvdCAlbHUgYnl0ZXMgKHJvdyAlbGQpXG4iLCByb3dieXRlcywKKyAgICAgICAgICAgICAgICAgIGJ5dGVzLCB3cG5nX2luZm8uaGVpZ2h0LWopOworICAgICAgICAgICAgICAgICsrZXJyb3I7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAod3JpdGVwbmdfZW5jb2RlX3Jvdygmd3BuZ19pbmZvKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCisgICAgICAgICAgICAgICAgICAiOiAgbGlicG5nIHByb2JsZW0gKGxvbmdqbXApIHdoaWxlIHdyaXRpbmcgcm93ICVsZFxuIiwKKyAgICAgICAgICAgICAgICAgIHdwbmdfaW5mby5oZWlnaHQtaik7CisgICAgICAgICAgICAgICAgKytlcnJvcjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgICAgIHdyaXRlcG5nX2NsZWFudXAoJndwbmdfaW5mbyk7CisgICAgICAgICAgICB3cG5nX2NsZWFudXAoKTsKKyAgICAgICAgICAgIGV4aXQoMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdyaXRlcG5nX2VuY29kZV9maW5pc2goJndwbmdfaW5mbykgIT0gMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBlcnJvciBvbiBmaW5hbCBsaWJwbmcgY2FsbFxuIik7CisgICAgICAgICAgICB3cml0ZXBuZ19jbGVhbnVwKCZ3cG5nX2luZm8pOworICAgICAgICAgICAgd3BuZ19jbGVhbnVwKCk7CisgICAgICAgICAgICBleGl0KDIpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKiBPSywgd2UncmUgZG9uZSAoc3VjY2Vzc2Z1bGx5KTogIGNsZWFuIHVwIGFsbCByZXNvdXJjZXMgYW5kIHF1aXQgKi8KKworICAgIGZwcmludGYoc3RkZXJyLCAiRG9uZS5cbiIpOworICAgIGZmbHVzaChzdGRlcnIpOworCisgICAgd3JpdGVwbmdfY2xlYW51cCgmd3BuZ19pbmZvKTsKKyAgICB3cG5nX2NsZWFudXAoKTsKKworICAgIHJldHVybiAwOworfQorCisKKworCisKK3N0YXRpYyBpbnQgd3BuZ19pc3ZhbGlkX2xhdGluMSh1Y2ggKnAsIGludCBsZW4pCit7CisgICAgaW50IGksIHJlc3VsdCA9IC0xOworCisgICAgZm9yIChpID0gMDsgIGkgPCBsZW47ICArK2kpIHsKKyAgICAgICAgaWYgKHBbaV0gPT0gMTAgfHwgKHBbaV0gPiAzMSAmJiBwW2ldIDwgMTI3KSB8fCBwW2ldID4gMTYwKQorICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAvKiBjaGFyYWN0ZXIgaXMgY29tcGxldGVseSBPSyAqLworICAgICAgICBpZiAocmVzdWx0IDwgMCB8fCAocFtyZXN1bHRdICE9IDI3ICYmIHBbaV0gPT0gMjcpKQorICAgICAgICAgICAgcmVzdWx0ID0gaTsgICAgICAgICAvKiBtYXJrIGxvY2F0aW9uIG9mIGZpcnN0IHF1ZXN0aW9uYWJsZSBvbmUgKi8KKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIG9yIG9mIGZpcnN0IGVzY2FwZSBjaGFyYWN0ZXIgKGJhZCkgKi8KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworCisKKworc3RhdGljIHZvaWQgd3BuZ19jbGVhbnVwKHZvaWQpCit7CisgICAgaWYgKHdwbmdfaW5mby5vdXRmaWxlKSB7CisgICAgICAgIGZjbG9zZSh3cG5nX2luZm8ub3V0ZmlsZSk7CisgICAgICAgIHdwbmdfaW5mby5vdXRmaWxlID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAod3BuZ19pbmZvLmluZmlsZSkgeworICAgICAgICBmY2xvc2Uod3BuZ19pbmZvLmluZmlsZSk7CisgICAgICAgIHdwbmdfaW5mby5pbmZpbGUgPSBOVUxMOworICAgIH0KKworICAgIGlmICh3cG5nX2luZm8uaW1hZ2VfZGF0YSkgeworICAgICAgICBmcmVlKHdwbmdfaW5mby5pbWFnZV9kYXRhKTsKKyAgICAgICAgd3BuZ19pbmZvLmltYWdlX2RhdGEgPSBOVUxMOworICAgIH0KKworICAgIGlmICh3cG5nX2luZm8ucm93X3BvaW50ZXJzKSB7CisgICAgICAgIGZyZWUod3BuZ19pbmZvLnJvd19wb2ludGVycyk7CisgICAgICAgIHdwbmdfaW5mby5yb3dfcG9pbnRlcnMgPSBOVUxMOworICAgIH0KK30KKworCisKKworI2lmZGVmIERPU19PUzJfVzMyCisKK3N0YXRpYyBjaGFyICpkb3Nfa2JkX2dldHMoY2hhciAqYnVmLCBpbnQgbGVuKQoreworICAgIGludCBjaCwgY291bnQ9MDsKKworICAgIGRvIHsKKyAgICAgICAgYnVmW2NvdW50KytdID0gY2ggPSBnZXRjaGUoKTsKKyAgICB9IHdoaWxlIChjaCAhPSAnXHInICYmIGNvdW50IDwgbGVuLTEpOworCisgICAgYnVmW2NvdW50LS1dID0gJ1wwJzsgICAgICAgIC8qIHRlcm1pbmF0ZSBzdHJpbmcgKi8KKyAgICBpZiAoYnVmW2NvdW50XSA9PSAnXHInKSAgICAgLyogRW50ZXIga2V5IG1ha2VzIENSLCBzbyBjaGFuZ2UgdG8gbmV3bGluZSAqLworICAgICAgICBidWZbY291bnRdID0gJ1xuJzsKKworICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsgICAgICAvKiBFbnRlciBrZXkgZG9lcyAqbm90KiBjYXVzZSBhIG5ld2xpbmUgKi8KKyAgICBmZmx1c2goc3RkZXJyKTsKKworICAgIHJldHVybiBidWY7Cit9CisKKyNlbmRpZiAvKiBET1NfT1MyX1czMiAqLwpkaWZmIC0tZ2l0IGEvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svd3JpdGVwbmcuYyBiL2xpYnBuZy9jb250cmliL2dyZWdib29rL3dyaXRlcG5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVjOTUzNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL2dyZWdib29rL3dyaXRlcG5nLmMKQEAgLTAsMCArMSw0MDEgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIHdwbmcgLSBzaW1wbGUgUE5HLXdyaXRpbmcgcHJvZ3JhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVwbmcuYworCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNyBHcmVnIFJvZWxvZnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcywiIHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQsCisgICAgICBleHByZXNzIG9yIGltcGxpZWQuICBJbiBubyBldmVudCBzaGFsbCB0aGUgYXV0aG9yIG9yIGNvbnRyaWJ1dG9ycworICAgICAgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgaW4gYW55IHdheSBmcm9tIHRoZSB1c2Ugb2YKKyAgICAgIHRoaXMgc29mdHdhcmUuCisKKyAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIERVQUwtTElDRU5TRUQuICBZb3UgbWF5IG1vZGlmeSBhbmQvb3IKKyAgICAgIHJlZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2Ygb25lIG9mIHRoZQorICAgICAgZm9sbG93aW5nIHR3byBsaWNlbnNlcyAoYXQgeW91ciBvcHRpb24pOgorCisKKyAgICAgIExJQ0VOU0UgMSAoIkJTRC1saWtlIHdpdGggYWR2ZXJ0aXNpbmcgY2xhdXNlIik6CisKKyAgICAgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICAgICAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZQorICAgICAgaXQgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCisgICAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgICAgbm90aWNlLCBkaXNjbGFpbWVyLCBhbmQgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMuCisgICAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgICAgbm90aWNlLCBkaXNjbGFpbWVyLCBhbmQgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YS0KKyAgICAgICAgIHRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAgICAgICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorCisgICAgICAgICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEdyZWcgUm9lbG9mcworICAgICAgICAgICAgYW5kIGNvbnRyaWJ1dG9ycyBmb3IgdGhlIGJvb2ssICJQTkc6IFRoZSBEZWZpbml0aXZlIEd1aWRlLCIKKyAgICAgICAgICAgIHB1Ymxpc2hlZCBieSBPJ1JlaWxseSBhbmQgQXNzb2NpYXRlcy4KKworCisgICAgICBMSUNFTlNFIDIgKEdOVSBHUEwgdjIgb3IgbGF0ZXIpOgorCisgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgICAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4gICAgIC8qIGZvciBleGl0KCkgcHJvdG90eXBlICovCisjaW5jbHVkZSA8emxpYi5oPgorCisjaW5jbHVkZSAicG5nLmgiICAgICAgICAvKiBsaWJwbmcgaGVhZGVyLCBpbmNsdWRlcyBzZXRqbXAuaCAqLworI2luY2x1ZGUgIndyaXRlcG5nLmgiICAgLyogdHlwZWRlZnMsIGNvbW1vbiBtYWNyb3MsIHB1YmxpYyBwcm90b3R5cGVzICovCisKKworLyogbG9jYWwgcHJvdG90eXBlICovCisKK3N0YXRpYyB2b2lkIHdyaXRlcG5nX2Vycm9yX2hhbmRsZXIocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIG1zZyk7CisKKworCit2b2lkIHdyaXRlcG5nX3ZlcnNpb25faW5mbyh2b2lkKQoreworICBmcHJpbnRmKHN0ZGVyciwgIiAgIENvbXBpbGVkIHdpdGggbGlicG5nICVzOyB1c2luZyBsaWJwbmcgJXMuXG4iLAorICAgIFBOR19MSUJQTkdfVkVSX1NUUklORywgcG5nX2xpYnBuZ192ZXIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgIENvbXBpbGVkIHdpdGggemxpYiAlczsgdXNpbmcgemxpYiAlcy5cbiIsCisgICAgWkxJQl9WRVJTSU9OLCB6bGliX3ZlcnNpb24pOworfQorCisKKworCisvKiByZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIDIgZm9yIGxpYnBuZyBwcm9ibGVtLCA0IGZvciBvdXQgb2YgbWVtb3J5LCAxMSBmb3IKKyAqICB1bmV4cGVjdGVkIHBubXR5cGU7IG5vdGUgdGhhdCBvdXRmaWxlIG1pZ2h0IGJlIHN0ZG91dCAqLworCitpbnQgd3JpdGVwbmdfaW5pdChtYWlucHJvZ19pbmZvICptYWlucHJvZ19wdHIpCit7CisgICAgcG5nX3N0cnVjdHAgIHBuZ19wdHI7ICAgICAgIC8qIG5vdGU6ICB0ZW1wb3JhcnkgdmFyaWFibGVzISAqLworICAgIHBuZ19pbmZvcCAgaW5mb19wdHI7CisgICAgaW50IGNvbG9yX3R5cGUsIGludGVybGFjZV90eXBlOworCisKKyAgICAvKiBjb3VsZCBhbHNvIHJlcGxhY2UgbGlicG5nIHdhcm5pbmctaGFuZGxlciAoZmluYWwgTlVMTCksIGJ1dCBubyBuZWVkOiAqLworCisgICAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KHBuZ19nZXRfbGlicG5nX3ZlcihOVUxMKSwgbWFpbnByb2dfcHRyLAorICAgICAgd3JpdGVwbmdfZXJyb3JfaGFuZGxlciwgTlVMTCk7CisgICAgaWYgKCFwbmdfcHRyKQorICAgICAgICByZXR1cm4gNDsgICAvKiBvdXQgb2YgbWVtb3J5ICovCisKKyAgICBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7CisgICAgaWYgKCFpbmZvX3B0cikgeworICAgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsIE5VTEwpOworICAgICAgICByZXR1cm4gNDsgICAvKiBvdXQgb2YgbWVtb3J5ICovCisgICAgfQorCisKKyAgICAvKiBzZXRqbXAoKSBtdXN0IGJlIGNhbGxlZCBpbiBldmVyeSBmdW5jdGlvbiB0aGF0IGNhbGxzIGEgUE5HLXdyaXRpbmcKKyAgICAgKiBsaWJwbmcgZnVuY3Rpb24sIHVubGVzcyBhbiBhbHRlcm5hdGUgZXJyb3IgaGFuZGxlciB3YXMgaW5zdGFsbGVkLS0KKyAgICAgKiBidXQgY29tcGF0aWJsZSBlcnJvciBoYW5kbGVycyBtdXN0IGVpdGhlciB1c2UgbG9uZ2ptcCgpIHRoZW1zZWx2ZXMKKyAgICAgKiAoYXMgaW4gdGhpcyBwcm9ncmFtKSBvciBzb21lIG90aGVyIG1ldGhvZCB0byByZXR1cm4gY29udHJvbCB0bworICAgICAqIGFwcGxpY2F0aW9uIGNvZGUsIHNvIGhlcmUgd2UgZ286ICovCisKKyAgICBpZiAoc2V0am1wKG1haW5wcm9nX3B0ci0+am1wYnVmKSkgeworICAgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0cik7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKworCisgICAgLyogbWFrZSBzdXJlIG91dGZpbGUgaXMgKHJlKW9wZW5lZCBpbiBCSU5BUlkgbW9kZSAqLworCisgICAgcG5nX2luaXRfaW8ocG5nX3B0ciwgbWFpbnByb2dfcHRyLT5vdXRmaWxlKTsKKworCisgICAgLyogc2V0IHRoZSBjb21wcmVzc2lvbiBsZXZlbHMtLWluIGdlbmVyYWwsIGFsd2F5cyB3YW50IHRvIGxlYXZlIGZpbHRlcmluZworICAgICAqIHR1cm5lZCBvbiAoZXhjZXB0IGZvciBwYWxldHRlIGltYWdlcykgYW5kIGFsbG93IGFsbCBvZiB0aGUgZmlsdGVycywKKyAgICAgKiB3aGljaCBpcyB0aGUgZGVmYXVsdDsgd2FudCAzMksgemxpYiB3aW5kb3csIHVubGVzcyBlbnRpcmUgaW1hZ2UgYnVmZmVyCisgICAgICogaXMgMTZLIG9yIHNtYWxsZXIgKHVua25vd24gaGVyZSktLWFsc28gdGhlIGRlZmF1bHQ7IHVzdWFsbHkgd2FudCBtYXgKKyAgICAgKiBjb21wcmVzc2lvbiAoTk9UIHRoZSBkZWZhdWx0KTsgYW5kIHJlbWFpbmluZyBjb21wcmVzc2lvbiBmbGFncyBzaG91bGQKKyAgICAgKiBiZSBsZWZ0IGFsb25lICovCisKKyAgICBwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsKHBuZ19wdHIsIFpfQkVTVF9DT01QUkVTU0lPTik7CisvKgorICAgID4+IHRoaXMgaXMgZGVmYXVsdCBmb3Igbm8gZmlsdGVyaW5nOyBaX0ZJTFRFUkVEIGlzIGRlZmF1bHQgb3RoZXJ3aXNlOgorICAgIHBuZ19zZXRfY29tcHJlc3Npb25fc3RyYXRlZ3kocG5nX3B0ciwgWl9ERUZBVUxUX1NUUkFURUdZKTsKKyAgICA+PiB0aGVzZSBhcmUgYWxsIGRlZmF1bHRzOgorICAgIHBuZ19zZXRfY29tcHJlc3Npb25fbWVtX2xldmVsKHBuZ19wdHIsIDgpOworICAgIHBuZ19zZXRfY29tcHJlc3Npb25fd2luZG93X2JpdHMocG5nX3B0ciwgMTUpOworICAgIHBuZ19zZXRfY29tcHJlc3Npb25fbWV0aG9kKHBuZ19wdHIsIDgpOworICovCisKKworICAgIC8qIHNldCB0aGUgaW1hZ2UgcGFyYW1ldGVycyBhcHByb3ByaWF0ZWx5ICovCisKKyAgICBpZiAobWFpbnByb2dfcHRyLT5wbm10eXBlID09IDUpCisgICAgICAgIGNvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9HUkFZOworICAgIGVsc2UgaWYgKG1haW5wcm9nX3B0ci0+cG5tdHlwZSA9PSA2KQorICAgICAgICBjb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUkdCOworICAgIGVsc2UgaWYgKG1haW5wcm9nX3B0ci0+cG5tdHlwZSA9PSA4KQorICAgICAgICBjb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBOworICAgIGVsc2UgeworICAgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0cik7CisgICAgICAgIHJldHVybiAxMTsKKyAgICB9CisKKyAgICBpbnRlcmxhY2VfdHlwZSA9IG1haW5wcm9nX3B0ci0+aW50ZXJsYWNlZD8gUE5HX0lOVEVSTEFDRV9BREFNNyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19JTlRFUkxBQ0VfTk9ORTsKKworICAgIHBuZ19zZXRfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwgbWFpbnByb2dfcHRyLT53aWR0aCwgbWFpbnByb2dfcHRyLT5oZWlnaHQsCisgICAgICBtYWlucHJvZ19wdHItPnNhbXBsZV9kZXB0aCwgY29sb3JfdHlwZSwgaW50ZXJsYWNlX3R5cGUsCisgICAgICBQTkdfQ09NUFJFU1NJT05fVFlQRV9ERUZBVUxULCBQTkdfRklMVEVSX1RZUEVfREVGQVVMVCk7CisKKyAgICBpZiAobWFpbnByb2dfcHRyLT5nYW1tYSA+IDAuMCkKKyAgICAgICAgcG5nX3NldF9nQU1BKHBuZ19wdHIsIGluZm9fcHRyLCBtYWlucHJvZ19wdHItPmdhbW1hKTsKKworICAgIGlmIChtYWlucHJvZ19wdHItPmhhdmVfYmcpIHsgICAvKiB3ZSBrbm93IGl0J3MgUkdCQSwgbm90IGdyYXkrYWxwaGEgKi8KKyAgICAgICAgcG5nX2NvbG9yXzE2ICBiYWNrZ3JvdW5kOworCisgICAgICAgIGJhY2tncm91bmQucmVkID0gbWFpbnByb2dfcHRyLT5iZ19yZWQ7CisgICAgICAgIGJhY2tncm91bmQuZ3JlZW4gPSBtYWlucHJvZ19wdHItPmJnX2dyZWVuOworICAgICAgICBiYWNrZ3JvdW5kLmJsdWUgPSBtYWlucHJvZ19wdHItPmJnX2JsdWU7CisgICAgICAgIHBuZ19zZXRfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgJmJhY2tncm91bmQpOworICAgIH0KKworICAgIGlmIChtYWlucHJvZ19wdHItPmhhdmVfdGltZSkgeworICAgICAgICBwbmdfdGltZSAgbW9kdGltZTsKKworICAgICAgICBwbmdfY29udmVydF9mcm9tX3RpbWVfdCgmbW9kdGltZSwgbWFpbnByb2dfcHRyLT5tb2R0aW1lKTsKKyAgICAgICAgcG5nX3NldF90SU1FKHBuZ19wdHIsIGluZm9fcHRyLCAmbW9kdGltZSk7CisgICAgfQorCisgICAgaWYgKG1haW5wcm9nX3B0ci0+aGF2ZV90ZXh0KSB7CisgICAgICAgIHBuZ190ZXh0ICB0ZXh0WzZdOworICAgICAgICBpbnQgIG51bV90ZXh0ID0gMDsKKworICAgICAgICBpZiAobWFpbnByb2dfcHRyLT5oYXZlX3RleHQgJiBURVhUX1RJVExFKSB7CisgICAgICAgICAgICB0ZXh0W251bV90ZXh0XS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkU7CisgICAgICAgICAgICB0ZXh0W251bV90ZXh0XS5rZXkgPSAiVGl0bGUiOworICAgICAgICAgICAgdGV4dFtudW1fdGV4dF0udGV4dCA9IG1haW5wcm9nX3B0ci0+dGl0bGU7CisgICAgICAgICAgICArK251bV90ZXh0OworICAgICAgICB9CisgICAgICAgIGlmIChtYWlucHJvZ19wdHItPmhhdmVfdGV4dCAmIFRFWFRfQVVUSE9SKSB7CisgICAgICAgICAgICB0ZXh0W251bV90ZXh0XS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkU7CisgICAgICAgICAgICB0ZXh0W251bV90ZXh0XS5rZXkgPSAiQXV0aG9yIjsKKyAgICAgICAgICAgIHRleHRbbnVtX3RleHRdLnRleHQgPSBtYWlucHJvZ19wdHItPmF1dGhvcjsKKyAgICAgICAgICAgICsrbnVtX3RleHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1haW5wcm9nX3B0ci0+aGF2ZV90ZXh0ICYgVEVYVF9ERVNDKSB7CisgICAgICAgICAgICB0ZXh0W251bV90ZXh0XS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkU7CisgICAgICAgICAgICB0ZXh0W251bV90ZXh0XS5rZXkgPSAiRGVzY3JpcHRpb24iOworICAgICAgICAgICAgdGV4dFtudW1fdGV4dF0udGV4dCA9IG1haW5wcm9nX3B0ci0+ZGVzYzsKKyAgICAgICAgICAgICsrbnVtX3RleHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1haW5wcm9nX3B0ci0+aGF2ZV90ZXh0ICYgVEVYVF9DT1BZKSB7CisgICAgICAgICAgICB0ZXh0W251bV90ZXh0XS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkU7CisgICAgICAgICAgICB0ZXh0W251bV90ZXh0XS5rZXkgPSAiQ29weXJpZ2h0IjsKKyAgICAgICAgICAgIHRleHRbbnVtX3RleHRdLnRleHQgPSBtYWlucHJvZ19wdHItPmNvcHlyaWdodDsKKyAgICAgICAgICAgICsrbnVtX3RleHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1haW5wcm9nX3B0ci0+aGF2ZV90ZXh0ICYgVEVYVF9FTUFJTCkgeworICAgICAgICAgICAgdGV4dFtudW1fdGV4dF0uY29tcHJlc3Npb24gPSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FOworICAgICAgICAgICAgdGV4dFtudW1fdGV4dF0ua2V5ID0gIkUtbWFpbCI7CisgICAgICAgICAgICB0ZXh0W251bV90ZXh0XS50ZXh0ID0gbWFpbnByb2dfcHRyLT5lbWFpbDsKKyAgICAgICAgICAgICsrbnVtX3RleHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1haW5wcm9nX3B0ci0+aGF2ZV90ZXh0ICYgVEVYVF9VUkwpIHsKKyAgICAgICAgICAgIHRleHRbbnVtX3RleHRdLmNvbXByZXNzaW9uID0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORTsKKyAgICAgICAgICAgIHRleHRbbnVtX3RleHRdLmtleSA9ICJVUkwiOworICAgICAgICAgICAgdGV4dFtudW1fdGV4dF0udGV4dCA9IG1haW5wcm9nX3B0ci0+dXJsOworICAgICAgICAgICAgKytudW1fdGV4dDsKKyAgICAgICAgfQorICAgICAgICBwbmdfc2V0X3RleHQocG5nX3B0ciwgaW5mb19wdHIsIHRleHQsIG51bV90ZXh0KTsKKyAgICB9CisKKworICAgIC8qIHdyaXRlIGFsbCBjaHVua3MgdXAgdG8gKGJ1dCBub3QgaW5jbHVkaW5nKSBmaXJzdCBJREFUICovCisKKyAgICBwbmdfd3JpdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7CisKKworICAgIC8qIGlmIHdlIHdhbnRlZCB0byB3cml0ZSBhbnkgbW9yZSB0ZXh0IGluZm8gKmFmdGVyKiB0aGUgaW1hZ2UgZGF0YSwgd2UKKyAgICAgKiB3b3VsZCBzZXQgdXAgdGV4dCBzdHJ1Y3QocykgaGVyZSBhbmQgY2FsbCBwbmdfc2V0X3RleHQoKSBhZ2Fpbiwgd2l0aAorICAgICAqIGp1c3QgdGhlIG5ldyBkYXRhOyBwbmdfc2V0X3RJTUUoKSBjb3VsZCBhbHNvIGdvIGhlcmUsIGJ1dCBpdCB3b3VsZAorICAgICAqIGhhdmUgbm8gZWZmZWN0IHNpbmNlIHdlIGFscmVhZHkgY2FsbGVkIGl0IGFib3ZlIChvbmx5IG9uZSB0SU1FIGNodW5rCisgICAgICogYWxsb3dlZCkgKi8KKworCisgICAgLyogc2V0IHVwIHRoZSB0cmFuc2Zvcm1hdGlvbnM6ICBmb3Igbm93LCBqdXN0IHBhY2sgbG93LWJpdC1kZXB0aCBwaXhlbHMKKyAgICAgKiBpbnRvIGJ5dGVzIChvbmUsIHR3byBvciBmb3VyIHBpeGVscyBwZXIgYnl0ZSkgKi8KKworICAgIHBuZ19zZXRfcGFja2luZyhwbmdfcHRyKTsKKy8qICBwbmdfc2V0X3NoaWZ0KHBuZ19wdHIsICZzaWdfYml0KTsgIHRvIHNjYWxlIGxvdy1iaXQtZGVwdGggdmFsdWVzICovCisKKworICAgIC8qIG1ha2Ugc3VyZSB3ZSBzYXZlIG91ciBwb2ludGVycyBmb3IgdXNlIGluIHdyaXRlcG5nX2VuY29kZV9pbWFnZSgpICovCisKKyAgICBtYWlucHJvZ19wdHItPnBuZ19wdHIgPSBwbmdfcHRyOworICAgIG1haW5wcm9nX3B0ci0+aW5mb19wdHIgPSBpbmZvX3B0cjsKKworCisgICAgLyogT0ssIHRoYXQncyBhbGwgd2UgbmVlZCB0byBkbyBmb3Igbm93OyByZXR1cm4gaGFwcHkgKi8KKworICAgIHJldHVybiAwOworfQorCisKKworCisKKy8qIHJldHVybnMgMCBmb3Igc3VjY2VzcywgMiBmb3IgbGlicG5nIChsb25nam1wKSBwcm9ibGVtICovCisKK2ludCB3cml0ZXBuZ19lbmNvZGVfaW1hZ2UobWFpbnByb2dfaW5mbyAqbWFpbnByb2dfcHRyKQoreworICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSAocG5nX3N0cnVjdHApbWFpbnByb2dfcHRyLT5wbmdfcHRyOworICAgIHBuZ19pbmZvcCBpbmZvX3B0ciA9IChwbmdfaW5mb3ApbWFpbnByb2dfcHRyLT5pbmZvX3B0cjsKKworCisgICAgLyogYXMgYWx3YXlzLCBzZXRqbXAoKSBtdXN0IGJlIGNhbGxlZCBpbiBldmVyeSBmdW5jdGlvbiB0aGF0IGNhbGxzIGEKKyAgICAgKiBQTkctd3JpdGluZyBsaWJwbmcgZnVuY3Rpb24gKi8KKworICAgIGlmIChzZXRqbXAobWFpbnByb2dfcHRyLT5qbXBidWYpKSB7CisgICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyKTsKKyAgICAgICAgbWFpbnByb2dfcHRyLT5wbmdfcHRyID0gTlVMTDsKKyAgICAgICAgbWFpbnByb2dfcHRyLT5pbmZvX3B0ciA9IE5VTEw7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKworCisgICAgLyogYW5kIG5vdyB3ZSBqdXN0IHdyaXRlIHRoZSB3aG9sZSBpbWFnZTsgbGlicG5nIHRha2VzIGNhcmUgb2YgaW50ZXJsYWNpbmcKKyAgICAgKiBmb3IgdXMgKi8KKworICAgIHBuZ193cml0ZV9pbWFnZShwbmdfcHRyLCBtYWlucHJvZ19wdHItPnJvd19wb2ludGVycyk7CisKKworICAgIC8qIHNpbmNlIHRoYXQncyBpdCwgd2UgYWxzbyBjbG9zZSBvdXQgdGhlIGVuZCBvZiB0aGUgUE5HIGZpbGUgbm93LS1pZiB3ZQorICAgICAqIGhhZCBhbnkgdGV4dCBvciB0aW1lIGluZm8gdG8gd3JpdGUgYWZ0ZXIgdGhlIElEQVRzLCBzZWNvbmQgYXJndW1lbnQKKyAgICAgKiB3b3VsZCBiZSBpbmZvX3B0ciwgYnV0IHdlIG9wdGltaXplIHNsaWdodGx5IGJ5IHNlbmRpbmcgTlVMTCBwb2ludGVyOiAqLworCisgICAgcG5nX3dyaXRlX2VuZChwbmdfcHRyLCBOVUxMKTsKKworICAgIHJldHVybiAwOworfQorCisKKworCisKKy8qIHJldHVybnMgMCBpZiBzdWNjZWVkcywgMiBpZiBsaWJwbmcgcHJvYmxlbSAqLworCitpbnQgd3JpdGVwbmdfZW5jb2RlX3JvdyhtYWlucHJvZ19pbmZvICptYWlucHJvZ19wdHIpICAvKiBOT04taW50ZXJsYWNlZCBvbmx5ISAqLworeworICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSAocG5nX3N0cnVjdHApbWFpbnByb2dfcHRyLT5wbmdfcHRyOworICAgIHBuZ19pbmZvcCBpbmZvX3B0ciA9IChwbmdfaW5mb3ApbWFpbnByb2dfcHRyLT5pbmZvX3B0cjsKKworCisgICAgLyogYXMgYWx3YXlzLCBzZXRqbXAoKSBtdXN0IGJlIGNhbGxlZCBpbiBldmVyeSBmdW5jdGlvbiB0aGF0IGNhbGxzIGEKKyAgICAgKiBQTkctd3JpdGluZyBsaWJwbmcgZnVuY3Rpb24gKi8KKworICAgIGlmIChzZXRqbXAobWFpbnByb2dfcHRyLT5qbXBidWYpKSB7CisgICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyKTsKKyAgICAgICAgbWFpbnByb2dfcHRyLT5wbmdfcHRyID0gTlVMTDsKKyAgICAgICAgbWFpbnByb2dfcHRyLT5pbmZvX3B0ciA9IE5VTEw7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKworCisgICAgLyogaW1hZ2VfZGF0YSBwb2ludHMgYXQgb3VyIG9uZSByb3cgb2YgaW1hZ2UgZGF0YSAqLworCisgICAgcG5nX3dyaXRlX3JvdyhwbmdfcHRyLCBtYWlucHJvZ19wdHItPmltYWdlX2RhdGEpOworCisgICAgcmV0dXJuIDA7Cit9CisKKworCisKKworLyogcmV0dXJucyAwIGlmIHN1Y2NlZWRzLCAyIGlmIGxpYnBuZyBwcm9ibGVtICovCisKK2ludCB3cml0ZXBuZ19lbmNvZGVfZmluaXNoKG1haW5wcm9nX2luZm8gKm1haW5wcm9nX3B0cikgICAvKiBOT04taW50ZXJsYWNlZCEgKi8KK3sKKyAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gKHBuZ19zdHJ1Y3RwKW1haW5wcm9nX3B0ci0+cG5nX3B0cjsKKyAgICBwbmdfaW5mb3AgaW5mb19wdHIgPSAocG5nX2luZm9wKW1haW5wcm9nX3B0ci0+aW5mb19wdHI7CisKKworICAgIC8qIGFzIGFsd2F5cywgc2V0am1wKCkgbXVzdCBiZSBjYWxsZWQgaW4gZXZlcnkgZnVuY3Rpb24gdGhhdCBjYWxscyBhCisgICAgICogUE5HLXdyaXRpbmcgbGlicG5nIGZ1bmN0aW9uICovCisKKyAgICBpZiAoc2V0am1wKG1haW5wcm9nX3B0ci0+am1wYnVmKSkgeworICAgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0cik7CisgICAgICAgIG1haW5wcm9nX3B0ci0+cG5nX3B0ciA9IE5VTEw7CisgICAgICAgIG1haW5wcm9nX3B0ci0+aW5mb19wdHIgPSBOVUxMOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisKKworICAgIC8qIGNsb3NlIG91dCBQTkcgZmlsZTsgaWYgd2UgaGFkIGFueSB0ZXh0IG9yIHRpbWUgaW5mbyB0byB3cml0ZSBhZnRlcgorICAgICAqIHRoZSBJREFUcywgc2Vjb25kIGFyZ3VtZW50IHdvdWxkIGJlIGluZm9fcHRyOiAqLworCisgICAgcG5nX3dyaXRlX2VuZChwbmdfcHRyLCBOVUxMKTsKKworICAgIHJldHVybiAwOworfQorCisKKworCisKK3ZvaWQgd3JpdGVwbmdfY2xlYW51cChtYWlucHJvZ19pbmZvICptYWlucHJvZ19wdHIpCit7CisgICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IChwbmdfc3RydWN0cCltYWlucHJvZ19wdHItPnBuZ19wdHI7CisgICAgcG5nX2luZm9wIGluZm9fcHRyID0gKHBuZ19pbmZvcCltYWlucHJvZ19wdHItPmluZm9fcHRyOworCisgICAgaWYgKHBuZ19wdHIgJiYgaW5mb19wdHIpCisgICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyKTsKK30KKworCisKKworCitzdGF0aWMgdm9pZCB3cml0ZXBuZ19lcnJvcl9oYW5kbGVyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBtc2cpCit7CisgICAgbWFpbnByb2dfaW5mbyAgKm1haW5wcm9nX3B0cjsKKworICAgIC8qIFRoaXMgZnVuY3Rpb24sIGFzaWRlIGZyb20gdGhlIGV4dHJhIHN0ZXAgb2YgcmV0cmlldmluZyB0aGUgImVycm9yCisgICAgICogcG9pbnRlciIgKGJlbG93KSBhbmQgdGhlIGZhY3QgdGhhdCBpdCBleGlzdHMgd2l0aGluIHRoZSBhcHBsaWNhdGlvbgorICAgICAqIHJhdGhlciB0aGFuIHdpdGhpbiBsaWJwbmcsIGlzIGVzc2VudGlhbGx5IGlkZW50aWNhbCB0byBsaWJwbmcncworICAgICAqIGRlZmF1bHQgZXJyb3IgaGFuZGxlci4gIFRoZSBzZWNvbmQgcG9pbnQgaXMgY3JpdGljYWw6ICBzaW5jZSBib3RoCisgICAgICogc2V0am1wKCkgYW5kIGxvbmdqbXAoKSBhcmUgY2FsbGVkIGZyb20gdGhlIHNhbWUgY29kZSwgdGhleSBhcmUKKyAgICAgKiBndWFyYW50ZWVkIHRvIGhhdmUgY29tcGF0aWJsZSBub3Rpb25zIG9mIGhvdyBiaWcgYSBqbXBfYnVmIGlzLAorICAgICAqIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBfQlNEX1NPVVJDRSBvciBhbnl0aGluZyBlbHNlIGhhcyAob3IgaGFzIG5vdCkKKyAgICAgKiBiZWVuIGRlZmluZWQuICovCisKKyAgICBmcHJpbnRmKHN0ZGVyciwgIndyaXRlcG5nIGxpYnBuZyBlcnJvcjogJXNcbiIsIG1zZyk7CisgICAgZmZsdXNoKHN0ZGVycik7CisKKyAgICBtYWlucHJvZ19wdHIgPSBwbmdfZ2V0X2Vycm9yX3B0cihwbmdfcHRyKTsKKyAgICBpZiAobWFpbnByb2dfcHRyID09IE5VTEwpIHsgICAgICAgICAvKiB3ZSBhcmUgY29tcGxldGVseSBob3NlZCBub3cgKi8KKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgIndyaXRlcG5nIHNldmVyZSBlcnJvcjogIGptcGJ1ZiBub3QgcmVjb3ZlcmFibGU7IHRlcm1pbmF0aW5nLlxuIik7CisgICAgICAgIGZmbHVzaChzdGRlcnIpOworICAgICAgICBleGl0KDk5KTsKKyAgICB9CisKKyAgICAvKiBOb3cgd2UgaGF2ZSBvdXIgZGF0YSBzdHJ1Y3R1cmUgd2UgY2FuIHVzZSB0aGUgaW5mb3JtYXRpb24gaW4gaXQKKyAgICAgKiB0byByZXR1cm4gY29udHJvbCB0byBvdXIgb3duIGhpZ2hlciBsZXZlbCBjb2RlIChhbGwgdGhlIHBvaW50cworICAgICAqIHdoZXJlICdzZXRqbXAnIGlzIGNhbGxlZCBpbiB0aGlzIGZpbGUuKSAgVGhpcyB3aWxsIHdvcmsgd2l0aCBvdGhlcgorICAgICAqIGVycm9yIGhhbmRsaW5nIG1lY2hhbmlzbXMgYXMgd2VsbCAtIGxpYnBuZyBhbHdheXMgY2FsbHMgcG5nX2Vycm9yCisgICAgICogd2hlbiBpdCBjYW4gcHJvY2VlZCBubyBmdXJ0aGVyLCB0aHVzLCBzbyBsb25nIGFzIHRoZSBlcnJvciBoYW5kbGVyCisgICAgICogaXMgaW50ZXJjZXB0ZWQsIGFwcGxpY2F0aW9uIGNvZGUgY2FuIGRvIGl0cyBvd24gZXJyb3IgcmVjb3ZlcnkuCisgICAgICovCisgICAgbG9uZ2ptcChtYWlucHJvZ19wdHItPmptcGJ1ZiwgMSk7Cit9CmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9ncmVnYm9vay93cml0ZXBuZy5oIGIvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svd3JpdGVwbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGI5NjZiCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svd3JpdGVwbmcuaApAQCAtMCwwICsxLDEzMyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgd3BuZyAtIHNpbXBsZSBQTkctd3JpdGluZyBwcm9ncmFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXBuZy5oCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDA3IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzLCIgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZCwKKyAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCisgICAgICBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBpbiBhbnkgd2F5IGZyb20gdGhlIHVzZSBvZgorICAgICAgdGhpcyBzb2Z0d2FyZS4KKworICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgRFVBTC1MSUNFTlNFRC4gIFlvdSBtYXkgbW9kaWZ5IGFuZC9vcgorICAgICAgcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiBvbmUgb2YgdGhlCisgICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6CisKKworICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKKworICAgICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCisgICAgICBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucy4KKyAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQorICAgICAgICAgdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisKKyAgICAgICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgR3JlZyBSb2Vsb2ZzCisgICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgorICAgICAgICAgICAgcHVibGlzaGVkIGJ5IE8nUmVpbGx5IGFuZCBBc3NvY2lhdGVzLgorCisKKyAgICAgIExJQ0VOU0UgMiAoR05VIEdQTCB2MiBvciBsYXRlcik6CisKKyAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgVFJVRQorIyAgZGVmaW5lIFRSVUUgMQorIyAgZGVmaW5lIEZBTFNFIDAKKyNlbmRpZgorCisjaWZuZGVmIE1BWAorIyAgZGVmaW5lIE1BWChhLGIpICAoKGEpID4gKGIpPyAoYSkgOiAoYikpCisjICBkZWZpbmUgTUlOKGEsYikgICgoYSkgPCAoYik/IChhKSA6IChiKSkKKyNlbmRpZgorCisjaWZkZWYgREVCVUcKKyMgIGRlZmluZSBUcmFjZSh4KSAge2ZwcmludGYgeCA7IGZmbHVzaChzdGRlcnIpOyBmZmx1c2goc3Rkb3V0KTt9CisjZWxzZQorIyAgZGVmaW5lIFRyYWNlKHgpICA7CisjZW5kaWYKKworI2RlZmluZSBURVhUX1RJVExFICAgIDB4MDEKKyNkZWZpbmUgVEVYVF9BVVRIT1IgICAweDAyCisjZGVmaW5lIFRFWFRfREVTQyAgICAgMHgwNAorI2RlZmluZSBURVhUX0NPUFkgICAgIDB4MDgKKyNkZWZpbmUgVEVYVF9FTUFJTCAgICAweDEwCisjZGVmaW5lIFRFWFRfVVJMICAgICAgMHgyMAorCisjZGVmaW5lIFRFWFRfVElUTEVfT0ZGU0VUICAgICAgICAwCisjZGVmaW5lIFRFWFRfQVVUSE9SX09GRlNFVCAgICAgIDcyCisjZGVmaW5lIFRFWFRfQ09QWV9PRkZTRVQgICAgICgyKjcyKQorI2RlZmluZSBURVhUX0VNQUlMX09GRlNFVCAgICAoMyo3MikKKyNkZWZpbmUgVEVYVF9VUkxfT0ZGU0VUICAgICAgKDQqNzIpCisjZGVmaW5lIFRFWFRfREVTQ19PRkZTRVQgICAgICg1KjcyKQorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1Y2g7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1c2g7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICB1bGc7CisKK3R5cGVkZWYgc3RydWN0IF9tYWlucHJvZ19pbmZvIHsKKyAgICBkb3VibGUgZ2FtbWE7CisgICAgbG9uZyB3aWR0aDsKKyAgICBsb25nIGhlaWdodDsKKyAgICB0aW1lX3QgbW9kdGltZTsKKyAgICBGSUxFICppbmZpbGU7CisgICAgRklMRSAqb3V0ZmlsZTsKKyAgICB2b2lkICpwbmdfcHRyOworICAgIHZvaWQgKmluZm9fcHRyOworICAgIHVjaCAqaW1hZ2VfZGF0YTsKKyAgICB1Y2ggKipyb3dfcG9pbnRlcnM7CisgICAgY2hhciAqdGl0bGU7CisgICAgY2hhciAqYXV0aG9yOworICAgIGNoYXIgKmRlc2M7CisgICAgY2hhciAqY29weXJpZ2h0OworICAgIGNoYXIgKmVtYWlsOworICAgIGNoYXIgKnVybDsKKyAgICBpbnQgZmlsdGVyOyAgICAvKiBjb21tYW5kLWxpbmUtZmlsdGVyIGZsYWcsIG5vdCBQTkcgcm93IGZpbHRlciEgKi8KKyAgICBpbnQgcG5tdHlwZTsKKyAgICBpbnQgc2FtcGxlX2RlcHRoOworICAgIGludCBpbnRlcmxhY2VkOworICAgIGludCBoYXZlX2JnOworICAgIGludCBoYXZlX3RpbWU7CisgICAgaW50IGhhdmVfdGV4dDsKKyAgICBqbXBfYnVmIGptcGJ1ZjsKKyAgICB1Y2ggYmdfcmVkOworICAgIHVjaCBiZ19ncmVlbjsKKyAgICB1Y2ggYmdfYmx1ZTsKK30gbWFpbnByb2dfaW5mbzsKKworCisvKiBwcm90b3R5cGVzIGZvciBwdWJsaWMgZnVuY3Rpb25zIGluIHdyaXRlcG5nLmMgKi8KKwordm9pZCB3cml0ZXBuZ192ZXJzaW9uX2luZm8odm9pZCk7CisKK2ludCB3cml0ZXBuZ19pbml0KG1haW5wcm9nX2luZm8gKm1haW5wcm9nX3B0cik7CisKK2ludCB3cml0ZXBuZ19lbmNvZGVfaW1hZ2UobWFpbnByb2dfaW5mbyAqbWFpbnByb2dfcHRyKTsKKworaW50IHdyaXRlcG5nX2VuY29kZV9yb3cobWFpbnByb2dfaW5mbyAqbWFpbnByb2dfcHRyKTsKKworaW50IHdyaXRlcG5nX2VuY29kZV9maW5pc2gobWFpbnByb2dfaW5mbyAqbWFpbnByb2dfcHRyKTsKKwordm9pZCB3cml0ZXBuZ19jbGVhbnVwKG1haW5wcm9nX2luZm8gKm1haW5wcm9nX3B0cik7CmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9saWJ0ZXN0cy9mYWtlcG5nLmMgYi9saWJwbmcvY29udHJpYi9saWJ0ZXN0cy9mYWtlcG5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUxMmMxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL2xpYnRlc3RzL2Zha2VwbmcuYwpAQCAtMCwwICsxLDY1IEBACisvKiBGYWtlIGEgUE5HIC0ganVzdCB3cml0ZSBpdCBvdXQgZGlyZWN0bHkuCisgKgorICogQ09QWVJJR0hUOiBXcml0dGVuIGJ5IEpvaG4gQ3VubmluZ2hhbSBCb3dsZXIsIDIwMTQuCisgKiBUbyB0aGUgZXh0ZW50IHBvc3NpYmxlIHVuZGVyIGxhdywgdGhlIGF1dGhvciBoYXMgd2FpdmVkIGFsbCBjb3B5cmlnaHQgYW5kCisgKiByZWxhdGVkIG9yIG5laWdoYm9yaW5nIHJpZ2h0cyB0byB0aGlzIHdvcmsuICBUaGlzIHdvcmsgaXMgcHVibGlzaGVkIGZyb206CisgKiBVbml0ZWQgU3RhdGVzLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx6bGliLmg+IC8qIGZvciBjcmMzMiAqLworCit2b2lkCitwdXRfdUxvbmcodUxvbmcgdmFsKQoreworICAgcHV0Y2hhcih2YWwgPj4gMjQpOworICAgcHV0Y2hhcih2YWwgPj4gMTYpOworICAgcHV0Y2hhcih2YWwgPj4gIDgpOworICAgcHV0Y2hhcih2YWwgPj4gIDApOworfQorCit2b2lkCitwdXRfY2h1bmsoY29uc3QgdW5zaWduZWQgY2hhciAqY2h1bmssIHVJbnQgbGVuZ3RoKQoreworICAgdUxvbmcgY3JjOworCisgICBwdXRfdUxvbmcobGVuZ3RoLTQpOyAvKiBFeGNsdWRlIHRoZSB0YWcgKi8KKworICAgZndyaXRlKGNodW5rLCBsZW5ndGgsIDEsIHN0ZG91dCk7CisKKyAgIGNyYyA9IGNyYzMyKDAsIFpfTlVMTCwgMCk7CisgICBwdXRfdUxvbmcoY3JjMzIoY3JjLCBjaHVuaywgbGVuZ3RoKSk7Cit9CisKK2NvbnN0IHVuc2lnbmVkIGNoYXIgc2lnbmF0dXJlW10gPQoreworICAgMTM3LCA4MCwgNzgsIDcxLCAxMywgMTAsIDI2LCAxMAorfTsKKworY29uc3QgdW5zaWduZWQgY2hhciBJSERSW10gPQoreworICAgNzMsIDcyLCA2OCwgODIsIC8qIElIRFIgKi8KKyAgIDAsIDAsIDAsIDEsIC8qIHdpZHRoICovCisgICAwLCAwLCAwLCAxLCAvKiBoZWlnaHQgKi8KKyAgIDEsIC8qIGJpdCBkZXB0aCAqLworICAgMCwgLyogY29sb3IgdHlwZTogZ3JleXNjYWxlICovCisgICAwLCAvKiBjb21wcmVzc2lvbiBtZXRob2QgKi8KKyAgIDAsIC8qIGZpbHRlciBtZXRob2QgKi8KKyAgIDAgIC8qIGludGVybGFjZSBtZXRob2Q6IG5vbmUgKi8KK307CisKK2NvbnN0IHVuc2lnbmVkIGNoYXIgdW5rbm93bltdID0KK3sKKyAgICd1JywgJ24nLCAnSycsICduJyAvKiAidW5LbiIgLSBwcml2YXRlIHNhZmUgdG8gY29weSAqLworfTsKKworaW50CittYWluKHZvaWQpCit7CisgICBmd3JpdGUoc2lnbmF0dXJlLCBzaXplb2Ygc2lnbmF0dXJlLCAxLCBzdGRvdXQpOworICAgcHV0X2NodW5rKElIRFIsIHNpemVvZiBJSERSKTsKKworICAgZm9yICg7OykKKyAgICAgIHB1dF9jaHVuayh1bmtub3duLCBzaXplb2YgdW5rbm93bik7Cit9CmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9saWJ0ZXN0cy9nZW50ZXN0cy5zaCBiL2xpYnBuZy9jb250cmliL2xpYnRlc3RzL2dlbnRlc3RzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYwZjhkMjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9saWJ0ZXN0cy9nZW50ZXN0cy5zaApAQCAtMCwwICsxLDEwMiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAxMyBKb2huIEN1bm5pbmdoYW0gQm93bGVyCisjCisjIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS42LjAgW0ZlYnJ1YXJ5IDE0LCAyMDEzXQorIworIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisjIGFuZCBsaWNlbnNlIGluIHBuZy5oCisjCisjIEdlbmVyYXRlIGEgc2V0IG9mIFBORyB0ZXN0IGltYWdlcy4gIFRoZSBpbWFnZXMgYXJlIGdlbmVyYXRlZCBpbiBhCisjIHN1Yi1kaXJlY3RvcnkgY2FsbGVkICd0ZXN0cycgYnkgZGVmYXVsdCwgaG93ZXZlciBhIGNvbW1hbmQgbGluZSBhcmd1bWVudCB3aWxsCisjIGNoYW5nZSB0aGF0IG5hbWUuICBUaGUgZ2VuZXJhdGlvbiByZXF1aXJlcyBhIGJ1aWx0IHZlcnNpb24gb2YgbWFrZXBuZyBpbiB0aGUKKyMgY3VycmVudCBkaXJlY3RvcnkuCisjCit1c2FnZSgpeworICAgZXhlYyA+JjIKKyAgIGVjaG8gIiQwIFs8ZGlyZWN0b3J5Pl0iCisgICBlY2hvICcgIEdlbmVyYXRlIGEgc2V0IG9mIFBORyB0ZXN0IGZpbGVzIGluICJkaXJlY3RvcnkiICgidGVzdHMiIGJ5IGRlZmF1bHQpJworICAgZXhpdCAxCit9CisKK21wPSIkUFdEL21ha2VwbmciCit0ZXN0IC14ICIkbXAiIHx8IHsKKyAgIGV4ZWMgPiYyCisgICBlY2hvICIkMDogdGhlICdtYWtlcG5nJyBwcm9ncmFtIG11c3QgZXhpc3QiCisgICBlY2hvICIgIGluIHRoZSBkaXJlY3Rvcnkgd2l0aGluIHdoaWNoIHRoaXMgcHJvZ3JhbToiCisgICBlY2hvICIgICAgJG1wIgorICAgZWNobyAiICBpcyBleGVjdXRlZCIKKyAgIHVzYWdlCit9CisKKyMgSnVzdCBvbmUgYXJndW1lbnQ6IHRoZSBkaXJlY3RvcnkKK3Rlc3RkaXI9InRlc3RzIgordGVzdCAkIyAtZ3QgMSAmJiB7CisgICB0ZXN0ZGlyPSIkMSIKKyAgIHNoaWZ0Cit9Cit0ZXN0ICQjIC1lcSAwIHx8IHVzYWdlCisKKyMgVGFrZSBjYXJlIG5vdCB0byBjbG9iYmVyIHNvbWV0aGluZworaWYgdGVzdCAtZSAiJHRlc3RkaXIiCit0aGVuCisgICB0ZXN0IC1kICIkdGVzdGRpciIgfHwgdXNhZ2UKK2Vsc2UKKyAgICMgbWtkaXIgLXAgaXNuJ3QgcG9ydGFibGUsIHNvIGRvIHRoZSBmb2xsb3dpbmcKKyAgIG1rZGlyICIkdGVzdGRpciIgMj4vZGV2L251bGwgfHwgbWtkaXIgLXAgIiR0ZXN0ZGlyIiB8fCB1c2FnZQorZmkKKworIyBUaGlzIGZhaWxzIGluIGEgdmVyeSBzYXRpc2ZhY3Rvcnkgd2F5IGlmIGl0J3Mgbm90IGFjY2Vzc2libGUKK2NkICIkdGVzdGRpciIKKzo+InRlc3QkJC5wbmciIHx8IHsKKyAgIGV4ZWMgPiYyCisgICBlY2hvICIkdGVzdGRpcjogZGlyZWN0b3J5IG5vdCB3cml0YWJsZSIKKyAgIHVzYWdlCit9CitybSAidGVzdCQkLnBuZyIgfHwgeworICAgZXhlYyA+JjIKKyAgIGVjaG8gIiR0ZXN0ZGlyOiB5b3UgaGF2ZSBjcmVhdGUgYnV0IG5vdCB3cml0ZSBwcml2aWxlZ2VzIGhlcmUuIgorICAgZWNobyAiICBUaGlzIGlzIHVuZXhwZWN0ZWQuICBZb3UgaGF2ZSBhIHNwdXJpb247ICInIicidGVzdCQkLnBuZyInIiciLiIKKyAgIGVjaG8gIiAgWW91IG5lZWQgdG8gcmVtb3ZlIHRoaXMgeW91cnNlbGYuICBUcnkgYSBkaWZmZXJlbnQgZGlyZWN0b3J5LiIKKyAgIGV4aXQgMQorfQorCisjIE5vdyBjYWxsIG1ha2VwbmcgKCRtcCkgdG8gY3JlYXRlIGV2ZXJ5IGZpbGUgd2UgY2FuIHRoaW5rIG9mIHdpdGggYQorIyByZWFzb25hYmxlIG5hbWUKK2RvaXQoKXsKKyAgIGZvciBnYW1tYSBpbiAiIiAtLXNSR0IgLS1saW5lYXIgLS0xLjgKKyAgIGRvCisgICAgICBjYXNlICIkZ2FtbWEiIGluCisgICAgICAgICAiIikKKyAgICAgICAgICAgIGduYW1lPTs7CisgICAgICAgICAtLXNSR0IpCisgICAgICAgICAgICBnbmFtZT0iLXNyZ2IiOzsKKyAgICAgICAgIC0tbGluZWFyKQorICAgICAgICAgICAgZ25hbWU9Ii1saW4iOzsKKyAgICAgICAgIC0tMS44KQorICAgICAgICAgICAgZ25hbWU9Ii0xOCI7OworICAgICAgICAgKikKKyAgICAgICAgICAgIGduYW1lPSItJGdhbW1hIjs7CisgICAgICBlc2FjCisgICAgICAiJG1wIiAkZ2FtbWEgIiQxIiAiJDIiICJ0ZXN0LSQxLSQyJGduYW1lLnBuZyIKKyAgIGRvbmUKK30KKyMKK2ZvciBjdCBpbiBncmF5IHBhbGV0dGUKK2RvCisgICBmb3IgYmQgaW4gMSAyIDQgOAorICAgZG8KKyAgICAgIGRvaXQgIiRjdCIgIiRiZCIKKyAgIGRvbmUKK2RvbmUKKyMKK2RvaXQgImdyYXkiICIxNiIKKyMKK2ZvciBjdCBpbiBncmF5LWFscGhhIHJnYiByZ2ItYWxwaGEKK2RvCisgICBmb3IgYmQgaW4gOCAxNgorICAgZG8KKyAgICAgIGRvaXQgIiRjdCIgIiRiZCIKKyAgIGRvbmUKK2RvbmUKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL2xpYnRlc3RzL21ha2VwbmcuYyBiL2xpYnBuZy9jb250cmliL2xpYnRlc3RzL21ha2VwbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGQ5NmQxCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvbGlidGVzdHMvbWFrZXBuZy5jCkBAIC0wLDAgKzEsMTk0MSBAQAorLyogbWFrZXBuZy5jICovCisjZGVmaW5lIF9JU09DOTlfU09VUkNFCisvKiBDb3B5cmlnaHQ6ICovCisjZGVmaW5lIENPUFlSSUdIVCAiXDI1MSAyMDEzLDIwMTUgSm9obiBDdW5uaW5naGFtIEJvd2xlciIKKy8qCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNy4wIFsoUEVORElORyBSRUxFQVNFKV0KKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKyAqCisgKiBNYWtlIGEgdGVzdCBQTkcgaW1hZ2UuICBUaGUgYXJndW1lbnRzIGFyZSBhcyBmb2xsb3dzOgorICoKKyAqICAgIG1ha2VwbmcgWy0tc1JHQnwtLWxpbmVhcnwtLTEuOF0gWy0tdFJOU10gWy0tbm9maWx0ZXJzXSBcCisgKiAgICAgICBjb2xvci10eXBlIGJpdC1kZXB0aCBbZmlsZS1uYW1lXQorICoKKyAqIFRoZSBjb2xvci10eXBlIG1heSBiZSBudW1lcmljIChhbmQgbXVzdCBtYXRjaCB0aGUgbnVtYmVycyB1c2VkIGJ5IHRoZSBQTkcKKyAqIHNwZWNpZmljYXRpb24pIG9yIG9uZSBvZiB0aGUgZm9ybWF0IG5hbWVzIGxpc3RlZCBiZWxvdy4gIFRoZSBiaXQtZGVwdGggaXMgdGhlCisgKiBjb21wb25lbnQgYml0IGRlcHRoLCBvciB0aGUgcGl4ZWwgYml0LWRlcHRoIGZvciBhIGNvbG9yLW1hcHBlZCBpbWFnZS4KKyAqCisgKiBXaXRob3V0IGFueSBvcHRpb25zIG5vIGNvbG9yLXNwYWNlIGluZm9ybWF0aW9uIGlzIHdyaXR0ZW4sIHdpdGggdGhlIG9wdGlvbnMKKyAqIGFuIHNSR0Igb3IgdGhlIGFwcHJvcHJpYXRlIGdBTUEgY2h1bmsgaXMgd3JpdHRlbi4gICIxLjgiIHJlZmVycyB0byB0aGUKKyAqIGRpc3BsYXkgc3lzdGVtIHVzZWQgb24gb2xkZXIgQXBwbGUgY29tcHV0ZXJzIHRvIGNvcnJlY3QgZm9yIGhpZ2ggYW1iaWVudAorICogbGlnaHQgbGV2ZWxzIGluIHRoZSB2aWV3aW5nIGVudmlyb25tZW50OyBpdCBhcHBsaWVzIGEgdHJhbnNmb3JtIG9mCisgKiBhcHByb3hpbWF0ZWx5IHZhbHVlXigxLzEuNDUpIHRvIHRoZSBjb2xvciB2YWx1ZXMgYW5kIHNvIGEgZ0FNQSBjaHVuayBvZiA2NTkwOQorICogaXMgd3JpdHRlbiAoMS40NS8yLjIpLgorICoKKyAqIFRoZSBpbWFnZSBkYXRhIGlzIGdlbmVyYXRlZCBpbnRlcm5hbGx5LiAgVW5sZXNzIC0tY29sb3IgaXMgZ2l2ZW4gdGhlIGltYWdlcworICogdXNlZCBhcmUgYXMgZm9sbG93czoKKyAqCisgKiAxIGNoYW5uZWw6IGEgc3F1YXJlIGltYWdlIHdpdGggYSBkaWFtb25kLCB0aGUgbGVhc3QgbHVtaW5vdXMgY29sb3JzIGFyZSBvbgorICogICAgdGhlIGVkZ2Ugb2YgdGhlIGltYWdlLCB0aGUgbW9zdCBsdW1pbm91cyBpbiB0aGUgY2VudGVyLgorICoKKyAqIDIgY2hhbm5lbHM6IHRoZSBjb2xvciBjaGFubmVsIGluY3JlYXNlcyBpbiBsdW1pbm9zaXR5IGZyb20gdG9wIHRvIGJvdHRvbSwgdGhlCisgKiAgICBhbHBoYSBjaGFubmVsIGluY3JlYXNlcyBpbiBvcGFjaXR5IGZyb20gbGVmdCB0byByaWdodC4KKyAqCisgKiAzIGNoYW5uZWxzOiBsaW5lYXIgY29tYmluYXRpb25zIG9mLCBmcm9tIHRoZSB0b3AtbGVmdCBjb3JuZXIgY2xvY2t3aXNlLAorICogICAgYmxhY2ssIGdyZWVuLCB3aGl0ZSwgcmVkLgorICoKKyAqIDQgY2hhbm5lbHM6IGxpbmVhciBjb21iaW5hdGlvbnMgb2YsIGZyb20gdGhlIHRvcC1sZWZ0IGNvcm5lciBjbG9ja3dpc2UsCisgKiAgICB0cmFuc3BhcmVudCwgcmVkLCBncmVlbiwgYmx1ZS4KKyAqCisgKiBGb3IgY29sb3ItbWFwcGVkIGltYWdlcyBhIGZvdXIgY2hhbm5lbCBjb2xvci1tYXAgaXMgdXNlZCBhbmQgaWYgLS10Uk5TIGlzCisgKiBnaXZlbiB0aGUgUE5HIGZpbGUgaGFzIGEgdFJOUyBjaHVuaywgYXMgZm9sbG93czoKKyAqCisgKiAxLWJpdDogZW50cnkgMCBpcyB0cmFuc3BhcmVudC1yZWQsIGVudHJ5IDEgaXMgb3BhcXVlLXdoaXRlCisgKiAyLWJpdDogZW50cnkgMDogdHJhbnNwYXJlbnQtZ3JlZW4KKyAqICAgICAgICBlbnRyeSAxOiA0MCUtcmVkCisgKiAgICAgICAgZW50cnkgMjogODAlLWJsdWUKKyAqICAgICAgICBlbnRyeSAzOiBvcGFxdWUtd2hpdGUKKyAqIDQtYml0OiB0aGUgMTYgY29tYmluYXRpb25zIG9mIHRoZSAyLWJpdCBjYXNlCisgKiA4LWJpdDogdGhlIDI1NiBjb21iaW5hdGlvbnMgb2YgdGhlIDQtYml0IGNhc2UKKyAqCisgKiBUaGUgcGFsZXR0ZSBhbHdheXMgaGFzIDJeYml0LWRlcHRoIGVudHJpZXMgYW5kIHRoZSB0Uk5TIGNodW5rIG9uZSBmZXdlci4gIFRoZQorICogaW1hZ2UgaXMgdGhlIDEtY2hhbm5lbCBkaWFtb25kLCBidXQgdXNpbmcgcGFsZXR0ZSBpbmRleCwgbm90IGx1bWlub3NpdHkuCisgKgorICogRm9yIGZvcm1hdHMgb3RoZXIgdGhhbiBjb2xvci1tYXBwZWQgb25lcyBpZiAtLXRSTlMgaXMgc3BlY2lmaWVkIGEgdFJOUyBjaHVuaworICogaXMgZ2VuZXJhdGVkIHdpdGggYWxsIGNoYW5uZWxzIGVxdWFsIHRvIHRoZSBsb3cgYml0cyBvZiAweDAxMDEuCisgKgorICogSW1hZ2Ugc2l6ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaW5hbCBwaXhlbCBkZXB0aCBpbiBiaXRzLCBpLmUuIGNoYW5uZWxzIHgKKyAqIGJpdC1kZXB0aCwgYXMgZm9sbG93czoKKyAqCisgKiA4IGJpdHMgb3IgbGVzczogICAgNjR4NjQKKyAqIDE2IGJpdHM6ICAgICAgICAgICAyNTZ4MjU2CisgKiBNb3JlIHRoYW4gMTYgYml0czogMTAyNHgxMDI0CisgKgorICogUm93IGZpbHRlcmluZyBpcyB0aGUgbGlicG5nIGRlZmF1bHQgYnV0IG1heSBiZSB0dXJuZWQgb2ZmICh0aGUgJ25vbmUnIGZpbHRlcgorICogaXMgdXNlZCBvbiBldmVyeSByb3cpIHdpdGggdGhlIC0tbm9maWx0ZXJzIG9wdGlvbi4KKyAqCisgKiBUaGUgaW1hZ2VzIGFyZSBub3QgaW50ZXJsYWNlZC4KKyAqCisgKiBJZiBmaWxlLW5hbWUgaXMgZ2l2ZW4gdGhlbiB0aGUgUE5HIGlzIHdyaXR0ZW4gdG8gdGhhdCBmaWxlLCBlbHNlIGl0IGlzCisgKiB3cml0dGVuIHRvIHN0ZG91dC4gIE5vdGljZSB0aGF0IHN0ZG91dCBpcyBub3Qgc3VwcG9ydGVkIG9uIHN5c3RlbXMgd2hlcmUsIGJ5CisgKiBkZWZhdWx0LCBpdCBhc3N1bWVzIHRleHQgb3V0cHV0OyB0aGlzIHByb2dyYW0gbWFrZXMgbm8gYXR0ZW1wdCB0byBjaGFuZ2UgdGhlCisgKiB0ZXh0IG1vZGUgb2Ygc3Rkb3V0IQorICoKKyAqICAgIG1ha2VwbmcgLS1jb2xvcj08Y29sb3I+IC4uLgorICoKKyAqIElmIC0tY29sb3IgaXMgZ2l2ZW4gdGhlbiB0aGUgd2hvbGUgaW1hZ2UgaGFzIHRoYXQgY29sb3IsIGNvbG9yLW1hcHBlZCBpbWFnZXMKKyAqIHdpbGwgaGF2ZSBleGFjdGx5IG9uZSBwYWxldHRlIGVudHJ5IGFuZCBhbGwgaW1hZ2UgZmlsZXMgd2l0aCBiZSAxNngxNiBpbgorICogc2l6ZS4gIFRoZSBjb2xvciB2YWx1ZSBpcyAxIHRvIDQgZGVjaW1hbCBudW1iZXJzIGFzIGFwcHJvcHJpYXRlIGZvciB0aGUgY29sb3IKKyAqIHR5cGUuCisgKgorICogICAgbWFrZXBuZyAtLXNtYWxsIC4uLgorICoKKyAqIElmIC0tc21hbGwgaXMgZ2l2ZW4gdGhlIGltYWdlcyBhcmUgbm8gbGFyZ2VyIHRoYW4gcmVxdWlyZWQgdG8gaW5jbHVkZSBldmVyeQorICogcG9zc2libGUgcGl4ZWwgdmFsdWUgZm9yIHRoZSBmb3JtYXQuCisgKgorICogRm9yIGZvcm1hdHMgd2l0aCBwaXhlbHMgOCBiaXRzIG9yIGZld2VyIGluIHNpemUgdGhlIGltYWdlcyBjb25zaXN0IG9mIGEKKyAqIHNpbmdsZSByb3cgd2l0aCAyXnBpeGVsLWRlcHRoIHBpeGVscywgb25lIG9mIGV2ZXJ5IHBvc3NpYmxlIHZhbHVlLgorICoKKyAqIEZvciBmb3JtYXRzIHdpdGggMTYtYml0IHBpeGVscyBhIDI1NngyNTYgaW1hZ2UgaXMgZ2VuZXJhdGVkIGNvbnRhaW5pbmcgZXZlcnkKKyAqIHBvc3NpYmxlIHBpeGVsIHZhbHVlLgorICoKKyAqIEZvciBsYXJnZXIgcGl4ZWwgc2l6ZXMgYSAyNTZ4MjU2IGltYWdlIGlzIGdlbmVyYXRlZCB3aGVyZSB0aGUgZmlyc3Qgcm93CisgKiBjb25zaXN0cyBvZiBlYWNoIHBpeGVsIHRoYXQgaGFzIGlkZW50aWNhbCBieXRlIHZhbHVlcyB0aHJvdWdob3V0IHRoZSBwaXhlbAorICogZm9sbG93ZWQgYnkgcm93cyB3aGVyZSB0aGUgYnl0ZSB2YWx1ZXMgZGlmZmVyIHdpdGhpbiB0aGUgcGl4ZWwuCisgKgorICogSW4gYWxsIGNhc2VzIHRoZSBwaXhlbCB2YWx1ZXMgYXJlIGFycmFuZ2VkIGluIHN1Y2ggYSB3YXkgdGhhdCB0aGUgU1VCIGFuZCBVUAorICogZmlsdGVycyBnaXZlIGJ5dGUgc2VxdWVuY2VzIGZvciBtYXhpbWFsIHpsaWIgY29tcHJlc3Npb24uICBCeSBkZWZhdWx0IChpZgorICogLS1ub2ZpbHRlcnMgaXMgbm90IGdpdmVuKSB0aGUgU1VCIGZpbHRlciBpcyB1c2VkIG9uIHRoZSBmaXJzdCByb3cgYW5kIHRoZSBVUAorICogZmlsdGVyIG9uIGFsbCBmb2xsb3dpbmcgcm93cy4KKyAqCisgKiBUaGUgLS1zbWFsbCBvcHRpb24gaXMgbWVhbnQgdG8gcHJvdmlkZSBnb29kIHRlc3QtY2FzZSBjb3ZlcmFnZSwgaG93ZXZlciB0aGUKKyAqIGltYWdlcyBhcmUgbm90IGVhc3kgdG8gZXhhbWluZSB2aXN1YWxseS4gIFdpdGhvdXQgdGhlIC0tc21hbGwgb3B0aW9uIHRoZQorICogaW1hZ2VzIGNvbnRhaW4gaWRlbnRpY2FsIGNvbG9yIHZhbHVlczsgdGhlIHBpeGVsIHZhbHVlcyBhcmUgYWRqdXN0ZWQKKyAqIGFjY29yZGluZyB0byB0aGUgZ2FtbWEgZW5jb2Rpbmcgd2l0aCBubyBnYW1tYSBlbmNvZGluZyBiZWluZyBpbnRlcnByZXRlZCBhcworICogc1JHQi4KKyAqCisgKiBMSUNFTlNJTkcKKyAqID09PT09PT09PQorICoKKyAqIFRoaXMgY29kZSBpcyBjb3B5cmlnaHQgb2YgdGhlIGF1dGhvcnMsIHNlZSB0aGUgQ09QWVJJR0hUIGRlZmluZSBhYm92ZS4gIFRoZQorICogY29kZSBpcyBsaWNlbnNlZCBhcyBhYm92ZSwgdXNpbmcgdGhlIGxpYnBuZyBsaWNlbnNlLiAgVGhlIGNvZGUgZ2VuZXJhdGVzCisgKiBpbWFnZXMgd2hpY2ggYXJlIHNvbGVseSB0aGUgcHJvZHVjdCBvZiB0aGUgY29kZTsgdGhlIG9wdGlvbnMgY2hvb3NlIHdoaWNoIG9mCisgKiB0aGUgbWFueSBwb3NzaWJpbGl0aWVzIHRvIGdlbmVyYXRlLiAgVGhlIGltYWdlcyB0aGF0IHJlc3VsdCAoYnV0IG5vdCB0aGUgY29kZQorICogd2hpY2ggZ2VuZXJhdGVzIHRoZW0pIGFyZSBsaWNlbnNlZCBhcyBkZWZpbmVkIGhlcmU6CisgKgorICogSU1QT1JUQU5UOiB0aGUgQ09QWVJJR0hUICNkZWZpbmUgbXVzdCBjb250YWluIElTTy1MYXRpbi0xIGNoYXJhY3RlcnMsIHRoZQorICogSU1BR0VfTElDRU5TSU5HICNkZWZpbmUgbXVzdCBjb250YWluIFVURi04IGNoYXJhY3RlcnMuICBUaGUgJ2NvcHlyaWdodCcKKyAqIHN5bWJvbCAweEE5VSAoXDI1MSkgaW4gSVNPLUxhdGluLTEgZW5jb2RpbmcgYW5kIDB4QzIweEE5IChcMzAyXDI1MSkgaW4gVVRGLTguCisgKi8KKyNkZWZpbmUgSU1BR0VfTElDRU5TSU5HICJEZWRpY2F0ZWQgdG8gdGhlIHB1YmxpYyBkb21haW4gcGVyIENyZWF0aXZlIENvbW1vbnMgIlwKKyAgICAibGljZW5zZSBcIkNDMCAxLjBcIjsgaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMC8iCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4gLyogZm9yIG9mZnNldG9mICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaWYgZGVmaW5lZChIQVZFX0NPTkZJR19IKSAmJiAhZGVmaW5lZChQTkdfTk9fQ09ORklHX0gpCisjICBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisvKiBEZWZpbmUgdGhlIGZvbGxvd2luZyB0byB1c2UgdGhpcyB0ZXN0IGFnYWluc3QgeW91ciBpbnN0YWxsZWQgbGlicG5nLCByYXRoZXIKKyAqIHRoYW4gdGhlIG9uZSBiZWluZyBidWlsdCBoZXJlOgorICovCisjaWZkZWYgUE5HX0ZSRUVTVEFORElOR19URVNUUworIyAgaW5jbHVkZSA8cG5nLmg+CisjZWxzZQorIyAgaW5jbHVkZSAiLi4vLi4vcG5nLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHpsaWIuaD4KKworLyogV29yayByb3VuZCBmb3IgR0NDIGNvbXBsYWludHMgYWJvdXQgY2FzdGluZyBhIChkb3VibGUpIGZ1bmN0aW9uIHJlc3VsdCB0bworICogYW4gdW5zaWduZWQ6CisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2Zsb29ydShkb3VibGUgZCkKK3sKKyAgIGQgPSBmbG9vcihkKTsKKyAgIHJldHVybiAodW5zaWduZWQgaW50KWQ7Cit9CisKK3N0YXRpYyBwbmdfYnl0ZQorZmxvb3JiKGRvdWJsZSBkKQoreworICAgZCA9IGZsb29yKGQpOworICAgcmV0dXJuIChwbmdfYnl0ZSlkOworfQorCisvKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBpbnNlcnRpbmcgZXh0cmEgY2h1bmtzICh0aGUgLS1pbnNlcnQgYXJndW1lbnQsIG5vdAorICogZG9jdW1lbnRlZCBhYm92ZS4pCisgKi8KK3R5cGVkZWYgc3RydWN0IGNodW5rX2luc2VydAoreworICAgc3RydWN0IGNodW5rX2luc2VydCAqbmV4dDsKKyAgIHZvaWQgICAgICAgICAgICAgICAoKmluc2VydCkocG5nX3N0cnVjdHAsIHBuZ19pbmZvcCwgaW50LCBwbmdfY2hhcnBwKTsKKyAgIGludCAgICAgICAgICAgICAgICAgIG5wYXJhbXM7CisgICBwbmdfY2hhcnAgICAgICAgICAgICBwYXJhbWV0ZXJzWzFdOworfSBjaHVua19pbnNlcnQ7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2NoYW5uZWxzX29mX3R5cGUoaW50IGNvbG9yX3R5cGUpCit7CisgICBpZiAoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX1BBTEVUVEUpCisgICAgICByZXR1cm4gMTsKKworICAgZWxzZQorICAgeworICAgICAgaW50IGNoYW5uZWxzID0gMTsKKworICAgICAgaWYgKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikKKyAgICAgICAgIGNoYW5uZWxzID0gMzsKKworICAgICAgaWYgKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkKKyAgICAgICAgIHJldHVybiBjaGFubmVscyArIDE7CisKKyAgICAgIGVsc2UKKyAgICAgICAgIHJldHVybiBjaGFubmVsczsKKyAgIH0KK30KKworc3RhdGljIHVuc2lnbmVkIGludAorcGl4ZWxfZGVwdGhfb2ZfdHlwZShpbnQgY29sb3JfdHlwZSwgaW50IGJpdF9kZXB0aCkKK3sKKyAgIHJldHVybiBjaGFubmVsc19vZl90eXBlKGNvbG9yX3R5cGUpICogYml0X2RlcHRoOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CitpbWFnZV9zaXplX29mX3R5cGUoaW50IGNvbG9yX3R5cGUsIGludCBiaXRfZGVwdGgsIHVuc2lnbmVkIGludCAqY29sb3JzLAorICAgaW50IHNtYWxsKQoreworICAgaWYgKCpjb2xvcnMpCisgICAgICByZXR1cm4gMTY7CisKKyAgIGVsc2UKKyAgIHsKKyAgICAgIGludCBwaXhlbF9kZXB0aCA9IHBpeGVsX2RlcHRoX29mX3R5cGUoY29sb3JfdHlwZSwgYml0X2RlcHRoKTsKKworICAgICAgaWYgKHNtYWxsKQorICAgICAgeworICAgICAgICAgaWYgKHBpeGVsX2RlcHRoIDw9IDgpIC8qIHRoZXJlIHdpbGwgYmUgb25lIHJvdyAqLworICAgICAgICAgICAgcmV0dXJuIDEgPDwgcGl4ZWxfZGVwdGg7CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAyNTY7CisgICAgICB9CisKKyAgICAgIGVsc2UgaWYgKHBpeGVsX2RlcHRoIDwgOCkKKyAgICAgICAgIHJldHVybiA2NDsKKworICAgICAgZWxzZSBpZiAocGl4ZWxfZGVwdGggPiAxNikKKyAgICAgICAgIHJldHVybiAxMDI0OworCisgICAgICBlbHNlCisgICAgICAgICByZXR1cm4gMjU2OworICAgfQorfQorCitzdGF0aWMgdm9pZAorc2V0X2NvbG9yKHBuZ19jb2xvcnAgY29sb3IsIHBuZ19ieXRlcCB0cmFucywgdW5zaWduZWQgaW50IHJlZCwKKyAgIHVuc2lnbmVkIGludCBncmVlbiwgdW5zaWduZWQgaW50IGJsdWUsIHVuc2lnbmVkIGludCBhbHBoYSwKKyAgIHBuZ19jb25zdF9ieXRlcCBnYW1tYV90YWJsZSkKK3sKKyAgIGNvbG9yLT5yZWQgPSBnYW1tYV90YWJsZVtyZWRdOworICAgY29sb3ItPmdyZWVuID0gZ2FtbWFfdGFibGVbZ3JlZW5dOworICAgY29sb3ItPmJsdWUgPSBnYW1tYV90YWJsZVtibHVlXTsKKyAgICp0cmFucyA9IChwbmdfYnl0ZSlhbHBoYTsKK30KKworc3RhdGljIGludAorZ2VuZXJhdGVfcGFsZXR0ZShwbmdfY29sb3JwIHBhbGV0dGUsIHBuZ19ieXRlcCB0cmFucywgaW50IGJpdF9kZXB0aCwKKyAgIHBuZ19jb25zdF9ieXRlcCBnYW1tYV90YWJsZSwgdW5zaWduZWQgaW50ICpjb2xvcnMpCit7CisgICAvKgorICAgICogMS1iaXQ6IGVudHJ5IDAgaXMgdHJhbnNwYXJlbnQtcmVkLCBlbnRyeSAxIGlzIG9wYXF1ZS13aGl0ZQorICAgICogMi1iaXQ6IGVudHJ5IDA6IHRyYW5zcGFyZW50LWdyZWVuCisgICAgKiAgICAgICAgZW50cnkgMTogNDAlLXJlZAorICAgICogICAgICAgIGVudHJ5IDI6IDgwJS1ibHVlCisgICAgKiAgICAgICAgZW50cnkgMzogb3BhcXVlLXdoaXRlCisgICAgKiA0LWJpdDogdGhlIDE2IGNvbWJpbmF0aW9ucyBvZiB0aGUgMi1iaXQgY2FzZQorICAgICogOC1iaXQ6IHRoZSAyNTYgY29tYmluYXRpb25zIG9mIHRoZSA0LWJpdCBjYXNlCisgICAgKi8KKyAgIHN3aXRjaCAoY29sb3JzWzBdKQorICAgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWFrZXBuZzogLS1jb2xvcnM9Li4uOiBpbnZhbGlkIGNvdW50ICV1XG4iLAorICAgICAgICAgICAgY29sb3JzWzBdKTsKKyAgICAgICAgIGV4aXQoMSk7CisKKyAgICAgIGNhc2UgMToKKyAgICAgICAgIHNldF9jb2xvcihwYWxldHRlKzAsIHRyYW5zKzAsIGNvbG9yc1sxXSwgY29sb3JzWzFdLCBjb2xvcnNbMV0sIDI1NSwKKyAgICAgICAgICAgIGdhbW1hX3RhYmxlKTsKKyAgICAgICAgIHJldHVybiAxOworCisgICAgICBjYXNlIDI6CisgICAgICAgICBzZXRfY29sb3IocGFsZXR0ZSswLCB0cmFucyswLCBjb2xvcnNbMV0sIGNvbG9yc1sxXSwgY29sb3JzWzFdLAorICAgICAgICAgICAgY29sb3JzWzJdLCBnYW1tYV90YWJsZSk7CisgICAgICAgICByZXR1cm4gMTsKKworICAgICAgY2FzZSAzOgorICAgICAgICAgc2V0X2NvbG9yKHBhbGV0dGUrMCwgdHJhbnMrMCwgY29sb3JzWzFdLCBjb2xvcnNbMl0sIGNvbG9yc1szXSwgMjU1LAorICAgICAgICAgICAgZ2FtbWFfdGFibGUpOworICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgIHNldF9jb2xvcihwYWxldHRlKzAsIHRyYW5zKzAsIGNvbG9yc1sxXSwgY29sb3JzWzJdLCBjb2xvcnNbM10sCisgICAgICAgICAgICBjb2xvcnNbNF0sIGdhbW1hX3RhYmxlKTsKKyAgICAgICAgIHJldHVybiAxOworCisgICAgICBjYXNlIDA6CisgICAgICAgICBpZiAoYml0X2RlcHRoID09IDEpCisgICAgICAgICB7CisgICAgICAgICAgICBzZXRfY29sb3IocGFsZXR0ZSswLCB0cmFucyswLCAyNTUsIDAsIDAsIDAsIGdhbW1hX3RhYmxlKTsKKyAgICAgICAgICAgIHNldF9jb2xvcihwYWxldHRlKzEsIHRyYW5zKzEsIDI1NSwgMjU1LCAyNTUsIDI1NSwgZ2FtbWFfdGFibGUpOworICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBzaXplID0gMVUgPDwgKGJpdF9kZXB0aC8yKTsgLyogMiwgNCBvciAxNiAqLworICAgICAgICAgICAgdW5zaWduZWQgaW50IHgsIHk7CisgICAgICAgICAgICB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgaXAgPSAwOworCisgICAgICAgICAgICBmb3IgKHg9MDsgeDxzaXplOyArK3gpIGZvciAoeT0wOyB5PHNpemU7ICsreSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlwID0geCArIChzaXplICogeSk7CisKKyAgICAgICAgICAgICAgIC8qIHNpemUgaXMgYXQgbW9zdCAxNiwgc28gdGhlIHNjYWxlZCB2YWx1ZSBiZWxvdyBmaXRzIGluIDE2IGJpdHMKKyAgICAgICAgICAgICAgICAqLworIyAgICAgICAgICAgICAgZGVmaW5lIGludGVycChwb3MsIGMxLCBjMikgKChwb3MgKiBjMSkgKyAoKHNpemUtcG9zKSAqIGMyKSkKKyMgICAgICAgICAgICAgIGRlZmluZSB4eWludGVycCh4LCB5LCBjMSwgYzIsIGMzLCBjNCkgKCgoc2l6ZSAqIHNpemUgLyAyKSArXAorICAgICAgICAgICAgICAgICAgKGludGVycCh4LCBjMSwgYzIpICogeSArIChzaXplLXkpICogaW50ZXJwKHgsIGMzLCBjNCkpKSAvXAorICAgICAgICAgICAgICAgICAgKHNpemUqc2l6ZSkpCisKKyAgICAgICAgICAgICAgIHNldF9jb2xvcihwYWxldHRlK2lwLCB0cmFucytpcCwKKyAgICAgICAgICAgICAgICAgIC8qIGNvbG9yOiAgICBncmVlbiwgcmVkLGJsdWUsd2hpdGUgKi8KKyAgICAgICAgICAgICAgICAgIHh5aW50ZXJwKHgsIHksICAgMCwgMjU1LCAgIDAsIDI1NSksCisgICAgICAgICAgICAgICAgICB4eWludGVycCh4LCB5LCAyNTUsICAgMCwgICAwLCAyNTUpLAorICAgICAgICAgICAgICAgICAgeHlpbnRlcnAoeCwgeSwgICAwLCAgIDAsIDI1NSwgMjU1KSwKKyAgICAgICAgICAgICAgICAgIC8qIGFscGhhOiAgICAgICAgMCwgMTAyLCAyMDQsIDI1NSkgKi8KKyAgICAgICAgICAgICAgICAgIHh5aW50ZXJwKHgsIHksICAgMCwgMTAyLCAyMDQsIDI1NSksCisgICAgICAgICAgICAgICAgICBnYW1tYV90YWJsZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBpcCsxOworICAgICAgICAgfQorICAgfQorfQorCitzdGF0aWMgdm9pZAorc2V0X3ZhbHVlKHBuZ19ieXRlcCByb3csIHNpemVfdCByb3dieXRlcywgcG5nX3VpbnRfMzIgeCwgdW5zaWduZWQgaW50IGJpdF9kZXB0aCwKKyAgIHBuZ191aW50XzMyIHZhbHVlLCBwbmdfY29uc3RfYnl0ZXAgZ2FtbWFfdGFibGUsIGRvdWJsZSBjb252KQoreworICAgdW5zaWduZWQgaW50IG1hc2sgPSAoMVUgPDwgYml0X2RlcHRoKS0xOworCisgICB4ICo9IGJpdF9kZXB0aDsgIC8qIE1heGltdW0geCBpcyA0KjEwMjQsIG1heGltdW0gYml0X2RlcHRoIGlzIDE2ICovCisKKyAgIGlmICh2YWx1ZSA8PSBtYXNrKQorICAgeworICAgICAgcG5nX3VpbnRfMzIgb2Zmc2V0ID0geCA+PiAzOworCisgICAgICBpZiAob2Zmc2V0IDwgcm93Ynl0ZXMgJiYgKGJpdF9kZXB0aCA8IDE2IHx8IG9mZnNldCsxIDwgcm93Ynl0ZXMpKQorICAgICAgeworICAgICAgICAgcm93ICs9IG9mZnNldDsKKworICAgICAgICAgc3dpdGNoIChiaXRfZGVwdGgpCisgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAvKiBEb24ndCBnYW1tYSBjb3JyZWN0IC0gdmFsdWVzIGdldCBzbWFzaGVkICovCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2hpZnQgPSAoOCAtIGJpdF9kZXB0aCkgLSAoeCAmIDB4N1UpOworCisgICAgICAgICAgICAgICAgICBtYXNrIDw8PSBzaGlmdDsKKyAgICAgICAgICAgICAgICAgIHZhbHVlID0gKHZhbHVlIDw8IHNoaWZ0KSAmIG1hc2s7CisgICAgICAgICAgICAgICAgICAqcm93ID0gKHBuZ19ieXRlKSgoKnJvdyAmIH5tYXNrKSB8IHZhbHVlKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWFrZXBuZzogYmFkIGJpdCBkZXB0aCAoaW50ZXJuYWwgZXJyb3IpXG4iKTsKKyAgICAgICAgICAgICAgIGV4aXQoMSk7CisKKyAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICB2YWx1ZSA9IGZsb29ydSg2NTUzNSpwb3codmFsdWUvNjU1MzUuLGNvbnYpKy41KTsKKyAgICAgICAgICAgICAgICpyb3crKyA9IChwbmdfYnl0ZSkodmFsdWUgPj4gOCk7CisgICAgICAgICAgICAgICAqcm93ID0gKHBuZ19ieXRlKXZhbHVlOworICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAqcm93ID0gZ2FtbWFfdGFibGVbdmFsdWVdOworICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1ha2Vwbmc6IHJvdyBidWZmZXIgb3ZlcmZsb3cgKGludGVybmFsIGVycm9yKVxuIik7CisgICAgICAgICBleGl0KDEpOworICAgICAgfQorICAgfQorCisgICBlbHNlCisgICB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1ha2Vwbmc6IGNvbXBvbmVudCBvdmVyZmxvdyAoaW50ZXJuYWwgZXJyb3IpXG4iKTsKKyAgICAgIGV4aXQoMSk7CisgICB9Cit9CisKK3N0YXRpYyBpbnQgLyogZmlsdGVyIG1hc2sgZm9yIHJvdyAqLworZ2VuZXJhdGVfcm93KHBuZ19ieXRlcCByb3csIHNpemVfdCByb3dieXRlcywgdW5zaWduZWQgaW50IHksIGludCBjb2xvcl90eXBlLAorICAgaW50IGJpdF9kZXB0aCwgcG5nX2NvbnN0X2J5dGVwIGdhbW1hX3RhYmxlLCBkb3VibGUgY29udiwKKyAgIHVuc2lnbmVkIGludCAqY29sb3JzLCBpbnQgc21hbGwpCit7CisgICBpbnQgZmlsdGVycyA9IDA7IC8qIGZpbGUgKk1BU0sqLCAwIG1lYW5zIHRoZSBkZWZhdWx0LCBub3QgTk9ORSAqLworICAgcG5nX3VpbnRfMzIgc2l6ZV9tYXggPQorICAgICAgaW1hZ2Vfc2l6ZV9vZl90eXBlKGNvbG9yX3R5cGUsIGJpdF9kZXB0aCwgY29sb3JzLCBzbWFsbCktMTsKKyAgIHBuZ191aW50XzMyIGRlcHRoX21heCA9ICgxVSA8PCBiaXRfZGVwdGgpLTE7IC8qIHVwIHRvIDY1NTM2ICovCisKKyAgIGlmIChjb2xvcnNbMF0gPT0gMCkgaWYgKHNtYWxsKQorICAgeworICAgICAgdW5zaWduZWQgaW50IHBpeGVsX2RlcHRoID0gcGl4ZWxfZGVwdGhfb2ZfdHlwZShjb2xvcl90eXBlLCBiaXRfZGVwdGgpOworCisgICAgICAvKiBGb3IgcGl4ZWwgZGVwdGhzIGxlc3MgdGhhbiAxNiBnZW5lcmF0ZSBhIHNpbmdsZSByb3cgY29udGFpbmluZyBhbGwgdGhlCisgICAgICAgKiBwb3NzaWJsZSBwaXhlbCB2YWx1ZXMuICBGb3IgMTYgZ2VuZXJhdGUgYWxsIDY1NTM2IGJ5dGUgcGFpcgorICAgICAgICogY29tYmluYXRpb25zIGluIGEgMjU2eDI1NiBwaXhlbCBhcnJheS4KKyAgICAgICAqLworICAgICAgc3dpdGNoIChwaXhlbF9kZXB0aCkKKyAgICAgIHsKKyAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGFzc2VydCh5ID09IDAgJiYgcm93Ynl0ZXMgPT0gMSAmJiBzaXplX21heCA9PSAxKTsKKyAgICAgICAgICAgIHJvd1swXSA9IDB4NkNVOyAvKiBiaW5hcnk6IDAxMTAxMTAwLCBvbmx5IHRvcCAyIGJpdHMgdXNlZCAqLworICAgICAgICAgICAgZmlsdGVycyA9IFBOR19GSUxURVJfTk9ORTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBhc3NlcnQoeSA9PSAwICYmIHJvd2J5dGVzID09IDEgJiYgc2l6ZV9tYXggPT0gMyk7CisgICAgICAgICAgICByb3dbMF0gPSAweDFCVTsgLyogYmluYXJ5IDAwMDExMDExLCBhbGwgYml0cyB1c2VkICovCisgICAgICAgICAgICBmaWx0ZXJzID0gUE5HX0ZJTFRFUl9OT05FOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGFzc2VydCh5ID09IDAgJiYgcm93Ynl0ZXMgPT0gOCAmJiBzaXplX21heCA9PSAxNSk7CisgICAgICAgICAgICByb3dbMF0gPSAweDAxVTsKKyAgICAgICAgICAgIHJvd1sxXSA9IDB4MjNVOyAvKiBTVUIgZ2l2ZXMgMHgyMlUgZm9yIGFsbCBmb2xsb3dpbmcgYnl0ZXMgKi8KKyAgICAgICAgICAgIHJvd1syXSA9IDB4NDVVOworICAgICAgICAgICAgcm93WzNdID0gMHg2N1U7CisgICAgICAgICAgICByb3dbNF0gPSAweDg5VTsKKyAgICAgICAgICAgIHJvd1s1XSA9IDB4QUJVOworICAgICAgICAgICAgcm93WzZdID0gMHhDRFU7CisgICAgICAgICAgICByb3dbN10gPSAweEVGVTsKKyAgICAgICAgICAgIGZpbHRlcnMgPSBQTkdfRklMVEVSX1NVQjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAvKiBUaGUgcm93IHdpbGwgaGF2ZSBhbGwgdGhlIHBpeGVsIHZhbHVlcyBpbiBvcmRlciBzdGFydGluZyB3aXRoCisgICAgICAgICAgICAgKiAnMScsIHRoZSBTVUIgZmlsdGVyIHdpbGwgY2hhbmdlIGV2ZXJ5IGJ5dGUgaW50byAnMScgKGluY2x1ZGluZworICAgICAgICAgICAgICogdGhlIGxhc3QsIHdoaWNoIGdlbmVyYXRlcyBwaXhlbCB2YWx1ZSAnMCcpLiAgU2luY2UgdGhlIFNVQiBmaWx0ZXIKKyAgICAgICAgICAgICAqIGhhcyB2YWx1ZSAxIHRoaXMgc2hvdWxkIHJlc3VsdCBpbiBtYXhpbXVtIGNvbXByZXNzaW9uLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBhc3NlcnQoeSA9PSAwICYmIHJvd2J5dGVzID09IDI1NiAmJiBzaXplX21heCA9PSAyNTUpOworICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHJvd1tzaXplX21heF0gPSAweEZGVSAmIChzaXplX21heCsxKTsKKyAgICAgICAgICAgICAgIGlmIChzaXplX21heCA9PSAwKQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAtLXNpemVfbWF4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlsdGVycyA9IFBOR19GSUxURVJfU1VCOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAvKiBSb3dzIGFyZSBnZW5lcmF0ZWQgc3VjaCB0aGF0IGVhY2ggcm93IGhhcyBhIGNvbnN0YW50IGRpZmZlcmVuY2UKKyAgICAgICAgICAgICAqIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBzZWNvbmQgYnl0ZSBvZiBlYWNoIHBpeGVsIGFuZCBzbyB0aGF0IHRoZQorICAgICAgICAgICAgICogZGlmZmVyZW5jZSBpbmNyZWFzZXMgYnkgMSBhdCBlYWNoIHJvdy4gIFRoZSByb3dzIHN0YXJ0IHdpdGggdGhlCisgICAgICAgICAgICAgKiBmaXJzdCBieXRlIHZhbHVlIG9mIDAgYW5kIHRoZSB2YWx1ZSBpbmNyZWFzZXMgdG8gMjU1IGFjcm9zcyB0aGUKKyAgICAgICAgICAgICAqIHJvdy4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBUaGUgZGlmZmVyZW5jZSBzdGFydHMgYXQgMSwgc28gdGhlIGZpcnN0IHJvdyBpczoKKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiAgICAgMCAxIDEgMiAyIDMgMyA0IC4uLiAyNTQgMjU1IDI1NSAwCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhpcyBtZWFucyB0aGF0IHJ1bm5pbmcgdGhlIFNVQiBmaWx0ZXIgb24gdGhlIGZpcnN0IHJvdyBwcm9kdWNlczoKKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiAgIFtTVUI9PTFdIDAgMSAwIDEgMCAxLi4uCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhlbiB0aGUgZGlmZmVyZW5jZSBpcyAyIG9uIHRoZSBuZXh0IHJvdywgZ2l2aW5nOgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqICAgIDAgMiAxIDMgMiA0IDMgNSAuLi4gMjU0IDAgMjU1IDEKKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBXaGVuIHRoZSBVUCBmaWx0ZXIgaXMgcnVuIG9uIHRoaXMgbGlicG5nIHByb2R1Y2VzOgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqICAgW1VQID09Ml0gMCAxIDAgMSAwIDEuLi4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBBbmQgc28gb24gZm9yIGFsbCB0aGUgcmVtYWluIHJvd3MgdG8gdGhlIGZpbmFsIHR3byAqIHJvd3M6CisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogICAgcm93IDI1NDogMCAyNTUgMSAwIDIgMSAzIDIgNCAzIC4uLiAyNTQgMjUzIDI1NSAyNTQKKyAgICAgICAgICAgICAqICAgIHJvdyAyNTU6IDAgICAwIDEgMSAyIDIgMyAzIDQgNCAuLi4gMjU0IDI1NCAyNTUgMjU1CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGFzc2VydChyb3dieXRlcyA9PSA1MTIgJiYgc2l6ZV9tYXggPT0gMjU1KTsKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICByb3dbMipzaXplX21heCAgXSA9IDB4RkZVICYgc2l6ZV9tYXg7CisgICAgICAgICAgICAgICByb3dbMipzaXplX21heCsxXSA9IDB4RkZVICYgKHNpemVfbWF4K3krMSk7CisgICAgICAgICAgICAgICBpZiAoc2l6ZV9tYXggPT0gMCkKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgLS1zaXplX21heDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFRoZSBmaXJzdCByb3cgbXVzdCBpbmNsdWRlIFBOR19GSUxURVJfVVAgc28gdGhhdCBsaWJwbmcga25vd3Mgd2UKKyAgICAgICAgICAgICAqIG5lZWQgdG8ga2VlcCBpdCBmb3IgdGhlIGZvbGxvd2luZyByb3c6CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGZpbHRlcnMgPSAoeSA9PSAwID8gUE5HX0ZJTFRFUl9TVUIrUE5HX0ZJTFRFUl9VUCA6IFBOR19GSUxURVJfVVApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgY2FzZSA0ODoKKyAgICAgICAgIGNhc2UgNjQ6CisgICAgICAgICAgICAvKiBUaGUgcm93cyBhcmUgZmlsbGVkIGJ5IGFuIGFsb2dvcml0aG0gc2ltaWxhciB0byB0aGUgYWJvdmUsIGluIHRoZQorICAgICAgICAgICAgICogZmlyc3Qgcm93IHBpeGVsIGJ5dGVzIGFyZSBhbGwgZXF1YWwsIGluY3JlYXNpbmcgZnJvbSAwIGJ5IDEgZm9yCisgICAgICAgICAgICAgKiBlYWNoIHBpeGVsLiAgSW4gdGhlIHNlY29uZCByb3cgdGhlIGJ5dGVzIHdpdGhpbiBhIHBpeGVsIGFyZQorICAgICAgICAgICAgICogaW5jcmVtZW50ZWQgMSwzLDUsNywuLi4gZnJvbSB0aGUgcHJldmlvdXMgcm93IGJ5dGUuICBVc2luZyBhbiBvZGQKKyAgICAgICAgICAgICAqIG51bWJlciBlbnN1cmVzIGFsbCB0aGUgcG9zc2libGUgYnl0ZSB2YWx1ZXMgYXJlIHVzZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGFzc2VydChzaXplX21heCA9PSAyNTUgJiYgcm93Ynl0ZXMgPT0gMjU2KihwaXhlbF9kZXB0aD4+MykpOworICAgICAgICAgICAgcGl4ZWxfZGVwdGggPj49IDM7IC8qIG5vdyBpbiBieXRlcyAqLworICAgICAgICAgICAgd2hpbGUgKHJvd2J5dGVzID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBwaXhlbF9pbmRleCA9IC0tcm93Ynl0ZXMvcGl4ZWxfZGVwdGg7CisKKyAgICAgICAgICAgICAgIGlmICh5ID09IDApCisgICAgICAgICAgICAgICAgICByb3dbcm93Ynl0ZXNdID0gMHhGRlUgJiBwaXhlbF9pbmRleDsKKworICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGJ5dGVfb2Zmc2V0ID0KKyAgICAgICAgICAgICAgICAgICAgIHJvd2J5dGVzIC0gcGl4ZWxfaW5kZXggKiBwaXhlbF9kZXB0aDsKKworICAgICAgICAgICAgICAgICAgcm93W3Jvd2J5dGVzXSA9CisgICAgICAgICAgICAgICAgICAgICAweEZGVSAmIChwaXhlbF9pbmRleCArIChieXRlX29mZnNldCAqIDIqeSkgKyAxKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbHRlcnMgPSAoeSA9PSAwID8gUE5HX0ZJTFRFUl9TVUIrUE5HX0ZJTFRFUl9VUCA6IFBOR19GSUxURVJfVVApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhc3NlcnQoMC8qTk9UIFJFQUNIRUQqLyk7CisgICAgICB9CisgICB9CisKKyAgIGVsc2Ugc3dpdGNoIChjaGFubmVsc19vZl90eXBlKGNvbG9yX3R5cGUpKQorICAgeworICAgLyogMSBjaGFubmVsOiBhIHNxdWFyZSBpbWFnZSB3aXRoIGEgZGlhbW9uZCwgdGhlIGxlYXN0IGx1bWlub3VzIGNvbG9ycyBhcmUgb24KKyAgICAqICAgIHRoZSBlZGdlIG9mIHRoZSBpbWFnZSwgdGhlIG1vc3QgbHVtaW5vdXMgaW4gdGhlIGNlbnRlci4KKyAgICAqLworICAgICAgY2FzZSAxOgorICAgICAgICAgeworICAgICAgICAgICAgcG5nX3VpbnRfMzIgeDsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIGJhc2UgPSAyKnNpemVfbWF4IC0gYWJzKDIqeS1zaXplX21heCk7CisKKyAgICAgICAgICAgIGZvciAoeD0wOyB4PD1zaXplX21heDsgKyt4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgbHVtYSA9IGJhc2UgLSBhYnMoMip4LXNpemVfbWF4KTsKKworICAgICAgICAgICAgICAgLyogJ2x1bWEnIGlzIG5vdyBpbiB0aGUgcmFuZ2UgMC4uMipzaXplX21heCwgd2UgbmVlZAorICAgICAgICAgICAgICAgICogMC4uZGVwdGhfbWF4CisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIGx1bWEgPSAobHVtYSpkZXB0aF9tYXggKyBzaXplX21heCkgLyAoMipzaXplX21heCk7CisgICAgICAgICAgICAgICBzZXRfdmFsdWUocm93LCByb3dieXRlcywgeCwgYml0X2RlcHRoLCBsdW1hLCBnYW1tYV90YWJsZSwgY29udik7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKworICAgLyogMiBjaGFubmVsczogdGhlIGNvbG9yIGNoYW5uZWwgaW5jcmVhc2VzIGluIGx1bWlub3NpdHkgZnJvbSB0b3AgdG8gYm90dG9tLAorICAgICogICAgdGhlIGFscGhhIGNoYW5uZWwgaW5jcmVhc2VzIGluIG9wYWNpdHkgZnJvbSBsZWZ0IHRvIHJpZ2h0LgorICAgICovCisgICAgICBjYXNlIDI6CisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfdWludF8zMiBhbHBoYSA9IChkZXB0aF9tYXggKiB5ICogMiArIHNpemVfbWF4KSAvICgyICogc2l6ZV9tYXgpOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgeDsKKworICAgICAgICAgICAgZm9yICh4PTA7IHg8PXNpemVfbWF4OyArK3gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzZXRfdmFsdWUocm93LCByb3dieXRlcywgMip4LCBiaXRfZGVwdGgsCisgICAgICAgICAgICAgICAgICAoZGVwdGhfbWF4ICogeCAqIDIgKyBzaXplX21heCkgLyAoMiAqIHNpemVfbWF4KSwgZ2FtbWFfdGFibGUsCisgICAgICAgICAgICAgICAgICBjb252KTsKKyAgICAgICAgICAgICAgIHNldF92YWx1ZShyb3csIHJvd2J5dGVzLCAyKngrMSwgYml0X2RlcHRoLCBhbHBoYSwgZ2FtbWFfdGFibGUsCisgICAgICAgICAgICAgICAgICBjb252KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworCisgICAvKiAzIGNoYW5uZWxzOiBsaW5lYXIgY29tYmluYXRpb25zIG9mLCBmcm9tIHRoZSB0b3AtbGVmdCBjb3JuZXIgY2xvY2t3aXNlLAorICAgICogICAgYmxhY2ssIGdyZWVuLCB3aGl0ZSwgcmVkLgorICAgICovCisgICAgICBjYXNlIDM6CisgICAgICAgICB7CisgICAgICAgICAgICAvKiB4MDogdGhlIGJsYWNrLT5yZWQgc2NhbGUgKHRoZSB2YWx1ZSBvZiB0aGUgcmVkIGNvbXBvbmVudCkgYXQgdGhlCisgICAgICAgICAgICAgKiAgICAgc3RhcnQgb2YgdGhlIHJvdyAoYmx1ZSBhbmQgZ3JlZW4gYXJlIDApLgorICAgICAgICAgICAgICogeDE6IHRoZSBncmVlbi0+d2hpdGUgc2NhbGUgKHRoZSB2YWx1ZSBvZiB0aGUgcmVkIGFuZCBibHVlCisgICAgICAgICAgICAgKiAgICAgY29tcG9uZW50cyBhdCB0aGUgZW5kIG9mIHRoZSByb3c7IGdyZWVuIGlzIGRlcHRoX21heCkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHBuZ191aW50XzMyIFkgPSAoZGVwdGhfbWF4ICogeSAqIDIgKyBzaXplX21heCkgLyAoMiAqIHNpemVfbWF4KTsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIHg7CisKKyAgICAgICAgICAgIC8qIEludGVycG9sYXRlIHgvZGVwdGhfbWF4IGZyb20gc3RhcnQgdG8gZW5kOgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqICAgICAgICBzdGFydCBlbmQgICAgICAgICBkaWZmZXJlbmNlCisgICAgICAgICAgICAgKiByZWQ6ICAgICBZICAgIFkgICAgICAgICAgICAwCisgICAgICAgICAgICAgKiBncmVlbjogICAwICAgZGVwdGhfbWF4ICAgZGVwdGhfbWF4CisgICAgICAgICAgICAgKiBibHVlOiAgICAwICAgIFkgICAgICAgICAgICBZCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGZvciAoeD0wOyB4PD1zaXplX21heDsgKyt4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc2V0X3ZhbHVlKHJvdywgcm93Ynl0ZXMsIDMqeCswLCBiaXRfZGVwdGgsIC8qIHJlZCAqLyBZLAorICAgICAgICAgICAgICAgICAgICAgZ2FtbWFfdGFibGUsIGNvbnYpOworICAgICAgICAgICAgICAgc2V0X3ZhbHVlKHJvdywgcm93Ynl0ZXMsIDMqeCsxLCBiaXRfZGVwdGgsIC8qIGdyZWVuICovCisgICAgICAgICAgICAgICAgICAoZGVwdGhfbWF4ICogeCAqIDIgKyBzaXplX21heCkgLyAoMiAqIHNpemVfbWF4KSwKKyAgICAgICAgICAgICAgICAgIGdhbW1hX3RhYmxlLCBjb252KTsKKyAgICAgICAgICAgICAgIHNldF92YWx1ZShyb3csIHJvd2J5dGVzLCAzKngrMiwgYml0X2RlcHRoLCAvKiBibHVlICovCisgICAgICAgICAgICAgICAgICAoWSAqIHggKiAyICsgc2l6ZV9tYXgpIC8gKDIgKiBzaXplX21heCksCisgICAgICAgICAgICAgICAgICBnYW1tYV90YWJsZSwgY29udik7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKworICAgLyogNCBjaGFubmVsczogbGluZWFyIGNvbWJpbmF0aW9ucyBvZiwgZnJvbSB0aGUgdG9wLWxlZnQgY29ybmVyIGNsb2Nrd2lzZSwKKyAgICAqICAgIHRyYW5zcGFyZW50LCByZWQsIGdyZWVuLCBibHVlLgorICAgICovCisgICAgICBjYXNlIDQ6CisgICAgICAgICB7CisgICAgICAgICAgICAvKiB4MDogdGhlIHRyYW5zcGFyZW50LT5ibHVlIHNjYWxlICh0aGUgdmFsdWUgb2YgdGhlIGJsdWUgYW5kIGFscGhhCisgICAgICAgICAgICAgKiAgICAgY29tcG9uZW50cykgYXQgdGhlIHN0YXJ0IG9mIHRoZSByb3cgKHJlZCBhbmQgZ3JlZW4gYXJlIDApLgorICAgICAgICAgICAgICogeDE6IHRoZSByZWQtPmdyZWVuIHNjYWxlICh0aGUgdmFsdWUgb2YgdGhlIHJlZCBhbmQgZ3JlZW4KKyAgICAgICAgICAgICAqICAgICBjb21wb25lbnRzIGF0IHRoZSBlbmQgb2YgdGhlIHJvdzsgYmx1ZSBpcyAwIGFuZCBhbHBoYSBpcworICAgICAgICAgICAgICogICAgIGRlcHRoX21heCkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHBuZ191aW50XzMyIFkgPSAoZGVwdGhfbWF4ICogeSAqIDIgKyBzaXplX21heCkgLyAoMiAqIHNpemVfbWF4KTsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIHg7CisKKyAgICAgICAgICAgIC8qIEludGVycG9sYXRlIHgvZGVwdGhfbWF4IGZyb20gc3RhcnQgdG8gZW5kOgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqICAgICAgICBzdGFydCAgICBlbmQgICAgICAgZGlmZmVyZW5jZQorICAgICAgICAgICAgICogcmVkOiAgICAgMCAgIGRlcHRoX21heC1ZIGRlcHRoX21heC1ZCisgICAgICAgICAgICAgKiBncmVlbjogICAwICAgICAgIFkgICAgICAgICAgICAgWQorICAgICAgICAgICAgICogYmx1ZTogICAgWSAgICAgICAwICAgICAgICAgICAgLVkKKyAgICAgICAgICAgICAqIGFscGhhOiAgIFkgICAgZGVwdGhfbWF4ICBkZXB0aF9tYXgtWQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBmb3IgKHg9MDsgeDw9c2l6ZV9tYXg7ICsreCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNldF92YWx1ZShyb3csIHJvd2J5dGVzLCA0KngrMCwgYml0X2RlcHRoLCAvKiByZWQgKi8KKyAgICAgICAgICAgICAgICAgICgoZGVwdGhfbWF4LVkpICogeCAqIDIgKyBzaXplX21heCkgLyAoMiAqIHNpemVfbWF4KSwKKyAgICAgICAgICAgICAgICAgIGdhbW1hX3RhYmxlLCBjb252KTsKKyAgICAgICAgICAgICAgIHNldF92YWx1ZShyb3csIHJvd2J5dGVzLCA0KngrMSwgYml0X2RlcHRoLCAvKiBncmVlbiAqLworICAgICAgICAgICAgICAgICAgKFkgKiB4ICogMiArIHNpemVfbWF4KSAvICgyICogc2l6ZV9tYXgpLAorICAgICAgICAgICAgICAgICAgZ2FtbWFfdGFibGUsIGNvbnYpOworICAgICAgICAgICAgICAgc2V0X3ZhbHVlKHJvdywgcm93Ynl0ZXMsIDQqeCsyLCBiaXRfZGVwdGgsIC8qIGJsdWUgKi8KKyAgICAgICAgICAgICAgICAgIFkgLSAoWSAqIHggKiAyICsgc2l6ZV9tYXgpIC8gKDIgKiBzaXplX21heCksCisgICAgICAgICAgICAgICAgICBnYW1tYV90YWJsZSwgY29udik7CisgICAgICAgICAgICAgICBzZXRfdmFsdWUocm93LCByb3dieXRlcywgNCp4KzMsIGJpdF9kZXB0aCwgLyogYWxwaGEgKi8KKyAgICAgICAgICAgICAgICAgIFkgKyAoKGRlcHRoX21heC1ZKSAqIHggKiAyICsgc2l6ZV9tYXgpIC8gKDIgKiBzaXplX21heCksCisgICAgICAgICAgICAgICAgICBnYW1tYV90YWJsZSwgY29udik7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWFrZXBuZzogaW50ZXJuYWwgYmFkIGNoYW5uZWwgY291bnRcbiIpOworICAgICAgICAgZXhpdCgyKTsKKyAgIH0KKworICAgZWxzZSBpZiAoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX1BBTEVUVEUpCisgICB7CisgICAgICAvKiBQYWxldHRlIHdpdGggZml4ZWQgY29sb3I6IHRoZSBpbWFnZSByb3dzIGFyZSBhbGwgMCBhbmQgdGhlIGltYWdlIHdpZHRoCisgICAgICAgKiBpcyAxNi4KKyAgICAgICAqLworICAgICAgbWVtc2V0KHJvdywgMCwgcm93Ynl0ZXMpOworICAgfQorCisgICBlbHNlIGlmIChjb2xvcnNbMF0gPT0gY2hhbm5lbHNfb2ZfdHlwZShjb2xvcl90eXBlKSkKKyAgICAgIHN3aXRjaCAoY2hhbm5lbHNfb2ZfdHlwZShjb2xvcl90eXBlKSkKKyAgICAgIHsKKyAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGNvbnN0IHBuZ191aW50XzMyIGx1bWEgPSBjb2xvcnNbMV07CisgICAgICAgICAgICAgICBwbmdfdWludF8zMiB4OworCisgICAgICAgICAgICAgICBmb3IgKHg9MDsgeDw9c2l6ZV9tYXg7ICsreCkKKyAgICAgICAgICAgICAgICAgIHNldF92YWx1ZShyb3csIHJvd2J5dGVzLCB4LCBiaXRfZGVwdGgsIGx1bWEsIGdhbW1hX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgY29udik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgY29uc3QgcG5nX3VpbnRfMzIgbHVtYSA9IGNvbG9yc1sxXTsKKyAgICAgICAgICAgICAgIGNvbnN0IHBuZ191aW50XzMyIGFscGhhID0gY29sb3JzWzJdOworICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgeDsKKworICAgICAgICAgICAgICAgZm9yICh4PTA7IHg8c2l6ZV9tYXg7ICsreCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHNldF92YWx1ZShyb3csIHJvd2J5dGVzLCAyKngsIGJpdF9kZXB0aCwgbHVtYSwgZ2FtbWFfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICBjb252KTsKKyAgICAgICAgICAgICAgICAgIHNldF92YWx1ZShyb3csIHJvd2J5dGVzLCAyKngrMSwgYml0X2RlcHRoLCBhbHBoYSwgZ2FtbWFfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICBjb252KTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBjb25zdCBwbmdfdWludF8zMiByZWQgPSBjb2xvcnNbMV07CisgICAgICAgICAgICAgICBjb25zdCBwbmdfdWludF8zMiBncmVlbiA9IGNvbG9yc1syXTsKKyAgICAgICAgICAgICAgIGNvbnN0IHBuZ191aW50XzMyIGJsdWUgPSBjb2xvcnNbM107CisgICAgICAgICAgICAgICBwbmdfdWludF8zMiB4OworCisgICAgICAgICAgICAgICBmb3IgKHg9MDsgeDw9c2l6ZV9tYXg7ICsreCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHNldF92YWx1ZShyb3csIHJvd2J5dGVzLCAzKngrMCwgYml0X2RlcHRoLCByZWQsIGdhbW1hX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgY29udik7CisgICAgICAgICAgICAgICAgICBzZXRfdmFsdWUocm93LCByb3dieXRlcywgMyp4KzEsIGJpdF9kZXB0aCwgZ3JlZW4sIGdhbW1hX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgY29udik7CisgICAgICAgICAgICAgICAgICBzZXRfdmFsdWUocm93LCByb3dieXRlcywgMyp4KzIsIGJpdF9kZXB0aCwgYmx1ZSwgZ2FtbWFfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICBjb252KTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBjb25zdCBwbmdfdWludF8zMiByZWQgPSBjb2xvcnNbMV07CisgICAgICAgICAgICAgICBjb25zdCBwbmdfdWludF8zMiBncmVlbiA9IGNvbG9yc1syXTsKKyAgICAgICAgICAgICAgIGNvbnN0IHBuZ191aW50XzMyIGJsdWUgPSBjb2xvcnNbM107CisgICAgICAgICAgICAgICBjb25zdCBwbmdfdWludF8zMiBhbHBoYSA9IGNvbG9yc1s0XTsKKyAgICAgICAgICAgICAgIHBuZ191aW50XzMyIHg7CisKKyAgICAgICAgICAgICAgIGZvciAoeD0wOyB4PD1zaXplX21heDsgKyt4KQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc2V0X3ZhbHVlKHJvdywgcm93Ynl0ZXMsIDQqeCswLCBiaXRfZGVwdGgsIHJlZCwgZ2FtbWFfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICBjb252KTsKKyAgICAgICAgICAgICAgICAgIHNldF92YWx1ZShyb3csIHJvd2J5dGVzLCA0KngrMSwgYml0X2RlcHRoLCBncmVlbiwgZ2FtbWFfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICBjb252KTsKKyAgICAgICAgICAgICAgICAgIHNldF92YWx1ZShyb3csIHJvd2J5dGVzLCA0KngrMiwgYml0X2RlcHRoLCBibHVlLCBnYW1tYV90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnYpOworICAgICAgICAgICAgICAgICAgc2V0X3ZhbHVlKHJvdywgcm93Ynl0ZXMsIDQqeCszLCBiaXRfZGVwdGgsIGFscGhhLCBnYW1tYV90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnYpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1ha2Vwbmc6IGludGVybmFsIGJhZCBjaGFubmVsIGNvdW50XG4iKTsKKyAgICAgICAgICAgIGV4aXQoMik7CisgICAgICB9CisKKyAgIGVsc2UKKyAgIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgIm1ha2Vwbmc6IC0tY29sb3I6IGNvdW50KCV1KSBkb2VzIG5vdCBtYXRjaCBjaGFubmVscygldSlcbiIsCisgICAgICAgICBjb2xvcnNbMF0sIGNoYW5uZWxzX29mX3R5cGUoY29sb3JfdHlwZSkpOworICAgICAgZXhpdCgxKTsKKyAgIH0KKworICAgcmV0dXJuIGZpbHRlcnM7Cit9CisKKworc3RhdGljIHZvaWQgUE5HQ0JBUEkKK21ha2Vwbmdfd2FybmluZyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgbWVzc2FnZSkKK3sKKyAgIGNvbnN0IGNoYXIgKiplcCA9IHBuZ19nZXRfZXJyb3JfcHRyKHBuZ19wdHIpOworICAgY29uc3QgY2hhciAqbmFtZTsKKworICAgaWYgKGVwICE9IE5VTEwgJiYgKmVwICE9IE5VTEwpCisgICAgICBuYW1lID0gKmVwOworCisgICBlbHNlCisgICAgICBuYW1lID0gIm1ha2VwbmciOworCisgIGZwcmludGYoc3RkZXJyLCAiJXM6IHdhcm5pbmc6ICVzXG4iLCBuYW1lLCBtZXNzYWdlKTsKK30KKworc3RhdGljIHZvaWQgUE5HQ0JBUEkKK21ha2VwbmdfZXJyb3IocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIG1lc3NhZ2UpCit7CisgICBtYWtlcG5nX3dhcm5pbmcocG5nX3B0ciwgbWVzc2FnZSk7CisgICBwbmdfbG9uZ2ptcChwbmdfcHRyLCAxKTsKK30KKworc3RhdGljIGludCAvKiAwIG9uIHN1Y2Nlc3MsIGVsc2UgYW4gZXJyb3IgY29kZSAqLword3JpdGVfcG5nKGNvbnN0IGNoYXIgKipuYW1lLCBGSUxFICpmcCwgaW50IGNvbG9yX3R5cGUsIGludCBiaXRfZGVwdGgsCisgICB2b2xhdGlsZSBwbmdfZml4ZWRfcG9pbnQgZ2FtbWEsIGNodW5rX2luc2VydCAqIHZvbGF0aWxlIGluc2VydCwKKyAgIHVuc2lnbmVkIGludCBmaWx0ZXJzLCB1bnNpZ25lZCBpbnQgKmNvbG9ycywgaW50IHNtYWxsLCBpbnQgdFJOUykKK3sKKyAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsCisgICAgICBuYW1lLCBtYWtlcG5nX2Vycm9yLCBtYWtlcG5nX3dhcm5pbmcpOworICAgdm9sYXRpbGUgcG5nX2luZm9wIGluZm9fcHRyID0gTlVMTDsKKyAgIHZvbGF0aWxlIHBuZ19ieXRlcCByb3cgPSBOVUxMOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgeworICAgICAgZnByaW50ZihzdGRlcnIsICJtYWtlcG5nOiBPT00gYWxsb2NhdGluZyB3cml0ZSBzdHJ1Y3R1cmVcbiIpOworICAgICAgcmV0dXJuIDE7CisgICB9CisKKyAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpCisgICB7CisgICAgICBwbmdfc3RydWN0cCBudl9wdHIgPSBwbmdfcHRyOworICAgICAgcG5nX2luZm9wIG52X2luZm8gPSBpbmZvX3B0cjsKKworICAgICAgcG5nX3B0ciA9IE5VTEw7CisgICAgICBpbmZvX3B0ciA9IE5VTEw7CisgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJm52X3B0ciwgJm52X2luZm8pOworICAgICAgaWYgKHJvdyAhPSBOVUxMKSBmcmVlKHJvdyk7CisgICAgICByZXR1cm4gMTsKKyAgIH0KKworICAgLyogQWxsb3cgYmVuaWduIGVycm9ycyBzbyB0aGF0IHdlIGNhbiB3cml0ZSBQTkdzIHdpdGggZXJyb3JzICovCisgICBwbmdfc2V0X2Jlbmlnbl9lcnJvcnMocG5nX3B0ciwgMS8qYWxsb3dlZCovKTsKKworICAgLyogTWF4IG91dCB0aGUgdGV4dCBjb21wcmVzc2lvbiBsZXZlbCBpbiBhbiBhdHRlbXB0IHRvIG1ha2UgdGhlIGxpY2Vuc2UKKyAgICAqIHNtYWxsLiAgIElmIC0tc21hbGwgdGhlbiBkbyB0aGUgc2FtZSBmb3IgdGhlIElEQVQuCisgICAgKi8KKyAgIGlmIChzbWFsbCkKKyAgICAgIHBuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwocG5nX3B0ciwgWl9CRVNUX0NPTVBSRVNTSU9OKTsKKworICAgcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX2xldmVsKHBuZ19wdHIsIFpfQkVTVF9DT01QUkVTU0lPTik7CisKKyAgIHBuZ19pbml0X2lvKHBuZ19wdHIsIGZwKTsKKworICAgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOworICAgaWYgKGluZm9fcHRyID09IE5VTEwpCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk9PTSBhbGxvY2F0aW5nIGluZm8gc3RydWN0dXJlIik7CisKKyAgIHsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBzaXplID0KKyAgICAgICAgIGltYWdlX3NpemVfb2ZfdHlwZShjb2xvcl90eXBlLCBiaXRfZGVwdGgsIGNvbG9ycywgc21hbGwpOworICAgICAgdW5zaWduZWQgaW50IHlzaXplOworICAgICAgcG5nX2ZpeGVkX3BvaW50IHJlYWxfZ2FtbWEgPSA0NTQ1NTsgLyogRm9yIHNSR0IgKi8KKyAgICAgIHBuZ19ieXRlIGdhbW1hX3RhYmxlWzI1Nl07CisgICAgICBkb3VibGUgY29udjsKKworICAgICAgLyogTm9ybWFsbHkgaW1hZ2VzIGFyZSBzcXVhcmUsIGJ1dCB3aXRoICdzbWFsbCcgd2Ugd2FudCB0byBzaW1wbHkgZ2VuZXJhdGUKKyAgICAgICAqIGFsbCB0aGUgcGl4ZWwgdmFsdWVzLCBvciBhbGwgdGhhdCB3ZSByZWFzb25hYmx5IGNhbjoKKyAgICAgICAqLworICAgICAgaWYgKHNtYWxsKQorICAgICAgeworICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IHBpeGVsX2RlcHRoID0KKyAgICAgICAgICAgIHBpeGVsX2RlcHRoX29mX3R5cGUoY29sb3JfdHlwZSwgYml0X2RlcHRoKTsKKworICAgICAgICAgaWYgKHBpeGVsX2RlcHRoIDw9IDhVKQorICAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0KHNpemUgPT0gKDFVPDxwaXhlbF9kZXB0aCkpOworICAgICAgICAgICAgeXNpemUgPSAxVTsKKyAgICAgICAgIH0KKworICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0KHNpemUgPT0gMjU2VSk7CisgICAgICAgICAgICB5c2l6ZSA9IDI1NlU7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgICAgIHlzaXplID0gc2l6ZTsKKworICAgICAgLyogVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBsaWJwbmcgdmFsdWVzIHVzZWQgb24gcmVhZCB0byBjYXJyeSBleHRyYQorICAgICAgICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGdhbW1hOgorICAgICAgICovCisgICAgICBpZiAoZ2FtbWEgPT0gUE5HX0dBTU1BX01BQ18xOCkKKyAgICAgICAgIGdhbW1hID0gNjU5MDk7CisKKyAgICAgIGVsc2UgaWYgKGdhbW1hID4gMCAmJiBnYW1tYSA8IDEwMDApCisgICAgICAgICBnYW1tYSA9IFBOR19GUF8xOworCisgICAgICBpZiAoZ2FtbWEgPiAwKQorICAgICAgICAgcmVhbF9nYW1tYSA9IGdhbW1hOworCisgICAgICB7CisgICAgICAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgICAgICAgaWYgKHJlYWxfZ2FtbWEgPT0gNDU0NTUpIGZvciAoaT0wOyBpPDI1NjsgKytpKQorICAgICAgICAgeworICAgICAgICAgICAgZ2FtbWFfdGFibGVbaV0gPSAocG5nX2J5dGUpaTsKKyAgICAgICAgICAgIGNvbnYgPSAxLjsKKyAgICAgICAgIH0KKworICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgLyogQ29udmVydCAnaScgZnJvbSBzUkdCICg0NTQ1NSkgdG8gcmVhbF9nYW1tYSwgdGhpcyBtYWtlcworICAgICAgICAgICAgICogdGhlIGltYWdlcyBsb29rIHRoZSBzYW1lIHJlZ2FyZGxlc3Mgb2YgdGhlIGdBTUEgY2h1bmsuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNvbnYgPSByZWFsX2dhbW1hOworICAgICAgICAgICAgY29udiAvPSA0NTQ1NTsKKworICAgICAgICAgICAgZ2FtbWFfdGFibGVbMF0gPSAwOworCisgICAgICAgICAgICBmb3IgKGk9MTsgaTwyNTU7ICsraSkKKyAgICAgICAgICAgICAgIGdhbW1hX3RhYmxlW2ldID0gZmxvb3JiKHBvdyhpLzI1NS4sY29udikgKiAyNTUgKyAuNSk7CisKKyAgICAgICAgICAgIGdhbW1hX3RhYmxlWzI1NV0gPSAyNTU7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHBuZ19zZXRfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwgc2l6ZSwgeXNpemUsIGJpdF9kZXB0aCwgY29sb3JfdHlwZSwKKyAgICAgICAgIFBOR19JTlRFUkxBQ0VfTk9ORSwgUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSwgUE5HX0ZJTFRFUl9UWVBFX0JBU0UpOworCisgICAgICBpZiAoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX1BBTEVUVEUpCisgICAgICB7CisgICAgICAgICBpbnQgbnBhbGV0dGU7CisgICAgICAgICBwbmdfY29sb3IgcGFsZXR0ZVsyNTZdOworICAgICAgICAgcG5nX2J5dGUgdHJhbnNbMjU2XTsKKworICAgICAgICAgbnBhbGV0dGUgPSBnZW5lcmF0ZV9wYWxldHRlKHBhbGV0dGUsIHRyYW5zLCBiaXRfZGVwdGgsIGdhbW1hX3RhYmxlLAorICAgICAgICAgICAgY29sb3JzKTsKKyAgICAgICAgIHBuZ19zZXRfUExURShwbmdfcHRyLCBpbmZvX3B0ciwgcGFsZXR0ZSwgbnBhbGV0dGUpOworCisgICAgICAgICBpZiAodFJOUykKKyAgICAgICAgICAgIHBuZ19zZXRfdFJOUyhwbmdfcHRyLCBpbmZvX3B0ciwgdHJhbnMsIG5wYWxldHRlLTEsCisgICAgICAgICAgICAgICBOVUxMLyp0cmFuc3BhcmVudCBjb2xvciovKTsKKworICAgICAgICAgLyogUmVzZXQgZ2FtbWFfdGFibGUgdG8gcHJldmVudCB0aGUgaW1hZ2Ugcm93cyBiZWluZyBjaGFuZ2VkICovCisgICAgICAgICBmb3IgKG5wYWxldHRlPTA7IG5wYWxldHRlPDI1NjsgKytucGFsZXR0ZSkKKyAgICAgICAgICAgIGdhbW1hX3RhYmxlW25wYWxldHRlXSA9IChwbmdfYnl0ZSlucGFsZXR0ZTsKKyAgICAgIH0KKworICAgICAgZWxzZSBpZiAodFJOUykKKyAgICAgIHsKKyAgICAgICAgIHBuZ19jb2xvcl8xNiBjb2w7CisKKyAgICAgICAgIGNvbC5yZWQgPSBjb2wuZ3JlZW4gPSBjb2wuYmx1ZSA9IGNvbC5ncmF5ID0KKyAgICAgICAgICAgIDB4MDEwMVUgJiAoKDFVPDxiaXRfZGVwdGgpLTFVKTsKKyAgICAgICAgIGNvbC5pbmRleCA9IDBVOworICAgICAgICAgcG5nX3NldF90Uk5TKHBuZ19wdHIsIGluZm9fcHRyLCBOVUxMLyp0cmFucyovLCAxVSwgJmNvbCk7CisgICAgICB9CisKKyAgICAgIGlmIChnYW1tYSA9PSBQTkdfREVGQVVMVF9zUkdCKQorICAgICAgICAgcG5nX3NldF9zUkdCKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfc1JHQl9JTlRFTlRfQUJTT0xVVEUpOworCisgICAgICBlbHNlIGlmIChnYW1tYSA+IDApIC8qIEVsc2UgZG9uJ3Qgc2V0IGNvbG9yIHNwYWNlIGluZm9ybWF0aW9uICovCisgICAgICB7CisgICAgICAgICBwbmdfc2V0X2dBTUFfZml4ZWQocG5nX3B0ciwgaW5mb19wdHIsIHJlYWxfZ2FtbWEpOworCisgICAgICAgICAvKiBKdXN0IHVzZSB0aGUgc1JHQiB2YWx1ZXMgaGVyZS4gKi8KKyAgICAgICAgIHBuZ19zZXRfY0hSTV9maXhlZChwbmdfcHRyLCBpbmZvX3B0ciwKKyAgICAgICAgICAgIC8qIGNvbG9yICAgICAgeCAgICAgICB5ICovCisgICAgICAgICAgICAvKiB3aGl0ZSAqLyAzMTI3MCwgMzI5MDAsCisgICAgICAgICAgICAvKiByZWQgICAqLyA2NDAwMCwgMzMwMDAsCisgICAgICAgICAgICAvKiBncmVlbiAqLyAzMDAwMCwgNjAwMDAsCisgICAgICAgICAgICAvKiBibHVlICAqLyAxNTAwMCwgIDYwMDAKKyAgICAgICAgICk7CisgICAgICB9CisKKyAgICAgIC8qIEluc2VydCBleHRyYSBpbmZvcm1hdGlvbi4gKi8KKyAgICAgIHdoaWxlIChpbnNlcnQgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIGluc2VydC0+aW5zZXJ0KHBuZ19wdHIsIGluZm9fcHRyLCBpbnNlcnQtPm5wYXJhbXMsIGluc2VydC0+cGFyYW1ldGVycyk7CisgICAgICAgICBpbnNlcnQgPSBpbnNlcnQtPm5leHQ7CisgICAgICB9CisKKyAgICAgIC8qIFdyaXRlIHRoZSBmaWxlIGhlYWRlci4gKi8KKyAgICAgIHBuZ193cml0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKKworICAgICAgLyogUmVzdHJpY3QgdGhlIGZpbHRlcnMgKi8KKyAgICAgIHBuZ19zZXRfZmlsdGVyKHBuZ19wdHIsIFBOR19GSUxURVJfVFlQRV9CQVNFLCBmaWx0ZXJzKTsKKworICAgICAgeworIyAgICAgICAgaWZkZWYgUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAorICAgICAgICAgICAgaW50IHBhc3NlcyA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOworIyAgICAgICAgZWxzZSAvKiAhV1JJVEVfSU5URVJMQUNJTkcgKi8KKyAgICAgICAgICAgIGludCBwYXNzZXMgPSAxOworIyAgICAgICAgZW5kaWYgLyogIVdSSVRFX0lOVEVSTEFDSU5HICovCisgICAgICAgICBpbnQgcGFzczsKKyAgICAgICAgIHBuZ19zaXplX3Qgcm93Ynl0ZXMgPSBwbmdfZ2V0X3Jvd2J5dGVzKHBuZ19wdHIsIGluZm9fcHRyKTsKKworICAgICAgICAgcm93ID0gbWFsbG9jKHJvd2J5dGVzKTsKKworICAgICAgICAgaWYgKHJvdyA9PSBOVUxMKQorICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJPT00gYWxsb2NhdGluZyByb3cgYnVmZmVyIik7CisKKyAgICAgICAgIGZvciAocGFzcyA9IDA7IHBhc3MgPCBwYXNzZXM7ICsrcGFzcykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB5OworCisgICAgICAgICAgICBmb3IgKHk9MDsgeTx5c2l6ZTsgKyt5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJvd19maWx0ZXJzID0KKyAgICAgICAgICAgICAgICAgIGdlbmVyYXRlX3Jvdyhyb3csIHJvd2J5dGVzLCB5LCBjb2xvcl90eXBlLCBiaXRfZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBnYW1tYV90YWJsZSwgY29udiwgY29sb3JzLCBzbWFsbCk7CisKKyAgICAgICAgICAgICAgIGlmIChyb3dfZmlsdGVycyAhPSAwICYmIGZpbHRlcnMgPT0gUE5HX0FMTF9GSUxURVJTKQorICAgICAgICAgICAgICAgICAgcG5nX3NldF9maWx0ZXIocG5nX3B0ciwgUE5HX0ZJTFRFUl9UWVBFX0JBU0UsIHJvd19maWx0ZXJzKTsKKworICAgICAgICAgICAgICAgcG5nX3dyaXRlX3JvdyhwbmdfcHRyLCByb3cpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICAvKiBGaW5pc2ggd3JpdGluZyB0aGUgZmlsZS4gKi8KKyAgIHBuZ193cml0ZV9lbmQocG5nX3B0ciwgaW5mb19wdHIpOworCisgICB7CisgICAgICBwbmdfc3RydWN0cCBudl9wdHIgPSBwbmdfcHRyOworICAgICAgcG5nX2luZm9wIG52X2luZm8gPSBpbmZvX3B0cjsKKworICAgICAgcG5nX3B0ciA9IE5VTEw7CisgICAgICBpbmZvX3B0ciA9IE5VTEw7CisgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJm52X3B0ciwgJm52X2luZm8pOworICAgfQorICAgZnJlZShyb3cpOworICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHNpemVfdAorbG9hZF9maWxlKHBuZ19jb25zdF9jaGFycCBuYW1lLCBwbmdfYnl0ZXBwIHJlc3VsdCkKK3sKKyAgIEZJTEUgKmZwID0gdG1wZmlsZSgpOworCisgICBpZiAoZnAgIT0gTlVMTCkKKyAgIHsKKyAgICAgIEZJTEUgKmlwID0gZm9wZW4obmFtZSwgInJiIik7CisKKyAgICAgIGlmIChpcCAhPSBOVUxMKQorICAgICAgeworICAgICAgICAgc2l6ZV90IHRvdGFsID0gMDsKKyAgICAgICAgIGludCBjaDsKKworICAgICAgICAgZm9yICg7OykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGNoID0gZ2V0YyhpcCk7CisgICAgICAgICAgICBpZiAoY2ggPT0gRU9GKSBicmVhazsKKyAgICAgICAgICAgIHB1dGMoY2gsIGZwKTsKKyAgICAgICAgICAgICsrdG90YWw7CisgICAgICAgICB9CisKKyAgICAgICAgIGlmIChmZXJyb3IoaXApKQorICAgICAgICAgeworICAgICAgICAgICAgcGVycm9yKG5hbWUpOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogcmVhZCBlcnJvclxuIiwgbmFtZSk7CisgICAgICAgICAgICAodm9pZClmY2xvc2UoaXApOworICAgICAgICAgfQorCisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICAodm9pZClmY2xvc2UoaXApOworCisgICAgICAgICAgICBpZiAoZmVycm9yKGZwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBlcnJvcigidGVtcG9yYXJ5IGZpbGUiKTsKKyAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidGVtcG9yYXJ5IGZpbGUgd3JpdGUgZXJyb3JcbiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICByZXdpbmQoZnApOworCisgICAgICAgICAgICAgICBpZiAodG90YWwgPiAwKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyogUm91bmQgdXAgdG8gYSBtdWx0aXBsZSBvZiA0IGhlcmUgdG8gYWxsb3cgYW4gaUNDUCBwcm9maWxlCisgICAgICAgICAgICAgICAgICAgKiB0byBiZSBwYWRkZWQgdG8gYSA0eCBib3VuZGFyeS4KKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgcG5nX2J5dGVwIGRhdGEgPSBtYWxsb2MoKHRvdGFsKzMpJn4zKTsKKworICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuZXdfc2l6ZSA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IGdldGMoZnApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09IEVPRikgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhW25ld19zaXplKytdID0gKHBuZ19ieXRlKWNoOworICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICBpZiAoZmVycm9yKGZwKSB8fCBuZXdfc2l6ZSAhPSB0b3RhbCkKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlcnJvcigidGVtcG9yYXJ5IGZpbGUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidGVtcG9yYXJ5IGZpbGUgcmVhZCBlcnJvclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZClmY2xvc2UoZnApOworICAgICAgICAgICAgICAgICAgICAgICAgKnJlc3VsdCA9IGRhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG90YWw7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG91dCBvZiBtZW1vcnkgbG9hZGluZyBmaWxlXG4iLCBuYW1lKTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogZW1wdHkgZmlsZVxuIiwgbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHBlcnJvcihuYW1lKTsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG9wZW4gZmFpbGVkXG4iLCBuYW1lKTsKKyAgICAgIH0KKworICAgICAgZmNsb3NlKGZwKTsKKyAgIH0KKworICAgZWxzZQorICAgICAgZnByaW50ZihzdGRlcnIsICJtYWtlcG5nOiAlczogY291bGQgbm90IG9wZW4gdGVtcG9yYXJ5IGZpbGVcbiIsIG5hbWUpOworCisgICBleGl0KDEpOworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBwbmdfc2l6ZV90Citsb2FkX2Zha2UocG5nX2NoYXJwIHBhcmFtLCBwbmdfYnl0ZXBwIHByb2ZpbGUpCit7CisgICBjaGFyICplbmRwdHIgPSBOVUxMOworICAgdWludDY0X3Qgc2l6ZSA9IHN0cnRvdWxsKHBhcmFtLCAmZW5kcHRyLCAwLypiYXNlKi8pOworCisgICAvKiBUaGUgJ2Zha2UnIGZvcm1hdCBpcyA8bnVtYmVyPipbc3RyaW5nXSAqLworICAgaWYgKGVuZHB0ciAhPSBOVUxMICYmICplbmRwdHIgPT0gJyonKQorICAgeworICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbigrK2VuZHB0cik7CisgICAgICBzaXplX3QgcmVzdWx0ID0gKHNpemVfdClzaXplOworCisgICAgICBpZiAobGVuID09IDApIGxlbiA9IDE7IC8qIGNhcHR1cmUgdGhlIHRlcm1pbmF0aW5nICdcMCcgKi8KKworICAgICAgLyogTm93IHJlcGVhdCB0aGF0IHN0cmluZyB0byBmaWxsICdzaXplJyBieXRlcy4gKi8KKyAgICAgIGlmIChyZXN1bHQgPT0gc2l6ZSAmJiAoKnByb2ZpbGUgPSBtYWxsb2MocmVzdWx0KSkgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19ieXRlcCBvdXQgPSAqcHJvZmlsZTsKKworICAgICAgICAgaWYgKGxlbiA9PSAxKQorICAgICAgICAgICAgbWVtc2V0KG91dCwgKmVuZHB0ciwgcmVzdWx0KTsKKworICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKHNpemUgPj0gbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgbWVtY3B5KG91dCwgZW5kcHRyLCBsZW4pOworICAgICAgICAgICAgICAgb3V0ICs9IGxlbjsKKyAgICAgICAgICAgICAgIHNpemUgLT0gbGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtY3B5KG91dCwgZW5kcHRyLCBzaXplKTsKKyAgICAgICAgIH0KKworICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogc2l6ZSBleGNlZWRzIHN5c3RlbSBsaW1pdHNcbiIsIHBhcmFtKTsKKyAgICAgICAgIGV4aXQoMSk7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfcGFyYW1fY291bnQoaW50IG5wYXJhbXMsIGludCBleHBlY3QpCit7CisgICBpZiAobnBhcmFtcyAhPSBleHBlY3QpCisgICB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgImJhZCBwYXJhbWV0ZXIgY291bnQgKGludGVybmFsIGVycm9yKVxuIik7CisgICAgICBleGl0KDEpOworICAgfQorfQorCitzdGF0aWMgdm9pZAoraW5zZXJ0X2lDQ1AocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBpbnQgbnBhcmFtcywKKyAgIHBuZ19jaGFycHAgcGFyYW1zKQoreworICAgcG5nX2J5dGVwIHByb2ZpbGUgPSBOVUxMOworICAgcG5nX3VpbnRfMzIgcHJvZmxlbiA9IDA7CisgICBpbnQgcmVzdWx0OworCisgICBjaGVja19wYXJhbV9jb3VudChucGFyYW1zLCAyKTsKKworICAgc3dpdGNoIChwYXJhbXNbMV1bMF0pCisgICB7CisgICAgICBjYXNlICc8JzoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19zaXplX3QgZmlsZWxlbiA9IGxvYWRfZmlsZShwYXJhbXNbMV0rMSwgJnByb2ZpbGUpOworICAgICAgICAgICAgaWYgKGZpbGVsZW4gPiAweGZmZmZmZmZjKSAvKiBNYXhpbXVtIHByb2ZpbGUgbGVuZ3RoICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBmaWxlIHRvbyBsb25nICglbHUpIGZvciBhbiBJQ0MgcHJvZmlsZVxuIiwKKyAgICAgICAgICAgICAgICAgIHBhcmFtc1sxXSsxLCAodW5zaWduZWQgbG9uZylmaWxlbGVuKTsKKyAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByb2ZsZW4gPSAocG5nX3VpbnRfMzIpZmlsZWxlbjsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6CisgICAgICBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6CisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfc2l6ZV90IGZha2VfbGVuID0gbG9hZF9mYWtlKHBhcmFtc1sxXSwgJnByb2ZpbGUpOworCisgICAgICAgICAgICBpZiAoZmFrZV9sZW4gPiAwKSAvKiBlbHNlIGEgc2ltcGxlIHBhcmFtZXRlciAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKGZha2VfbGVuID4gMHhmZmZmZmZmZikgLyogTWF4aW11bSBwcm9maWxlIGxlbmd0aCAqLworICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAiJXM6IGZha2UgZGF0YSB0b28gbG9uZyAoJWx1KSBmb3IgYW4gSUNDIHByb2ZpbGVcbiIsCisgICAgICAgICAgICAgICAgICAgICBwYXJhbXNbMV0sICh1bnNpZ25lZCBsb25nKWZha2VfbGVuKTsKKyAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBwcm9mbGVuID0gKHBuZ191aW50XzMyKShmYWtlX2xlbiAmIH4zVSk7CisgICAgICAgICAgICAgICAvKiBBbHdheXMgZml4IHVwIHRoZSBwcm9maWxlIGxlbmd0aC4gKi8KKyAgICAgICAgICAgICAgIHBuZ19zYXZlX3VpbnRfMzIocHJvZmlsZSwgcHJvZmxlbik7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiLS1pbnNlcnQgaUNDUCBcIiVzXCI6IHVucmVjb2duaXplZFxuIiwgcGFyYW1zWzFdKTsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICB1c2UgJzwnIHRvIHJlYWQgYSBmaWxlOiBcIjxmaWxlbmFtZVwiXG4iKTsKKyAgICAgICAgIGV4aXQoMSk7CisgICB9CisKKyAgIHJlc3VsdCA9IDE7CisKKyAgIGlmIChwcm9mbGVuICYgMykKKyAgIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgIm1ha2Vwbmc6IC0taW5zZXJ0IGlDQ1AgJXM6IHByb2ZpbGUgbGVuZ3RoIG1hZGUgYSBtdWx0aXBsZSBvZiA0XG4iLAorICAgICAgICAgcGFyYW1zWzFdKTsKKworICAgICAgLyogbG9hZF9maWxlIGFsbG9jYXRlcyBleHRyYSBzcGFjZSBmb3IgdGhpcyBwYWRkaW5nLCB0aGUgSUNDIHNwZWMgcmVxdWlyZXMKKyAgICAgICAqIHBhZGRpbmcgd2l0aCB6ZXJvIGJ5dGVzLgorICAgICAgICovCisgICAgICB3aGlsZSAocHJvZmxlbiAmIDMpCisgICAgICAgICBwcm9maWxlW3Byb2ZsZW4rK10gPSAwOworICAgfQorCisgICBpZiAocHJvZmlsZSAhPSBOVUxMICYmIHByb2ZsZW4gPiAzKQorICAgeworICAgICAgcG5nX3VpbnRfMzIgcHJvZl9oZWFkZXIgPSBwbmdfZ2V0X3VpbnRfMzIocHJvZmlsZSk7CisKKyAgICAgIGlmIChwcm9mX2hlYWRlciAhPSBwcm9mbGVuKQorICAgICAgeworICAgICAgICAgZnByaW50ZihzdGRlcnIsICItLWluc2VydCBpQ0NQICVzOiBwcm9maWxlIGxlbmd0aCBmaWVsZCB3cm9uZzpcbiIsCisgICAgICAgICAgICBwYXJhbXNbMV0pOworICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgIGFjdHVhbCAlbHUsIHJlY29yZGVkIHZhbHVlICVsdSAoY29ycmVjdGVkKVxuIiwKKyAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXByb2ZsZW4sICh1bnNpZ25lZCBsb25nKXByb2ZfaGVhZGVyKTsKKyAgICAgICAgIHBuZ19zYXZlX3VpbnRfMzIocHJvZmlsZSwgcHJvZmxlbik7CisgICAgICB9CisgICB9CisKKyAgIGlmIChyZXN1bHQgJiYgcHJvZmlsZSAhPSBOVUxMICYmIHByb2ZsZW4gPj00KQorICAgICAgcG5nX3NldF9pQ0NQKHBuZ19wdHIsIGluZm9fcHRyLCBwYXJhbXNbMF0sIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UsCisgICAgICAgICBwcm9maWxlLCBwcm9mbGVuKTsKKworICAgaWYgKHByb2ZpbGUpCisgICAgICBmcmVlKHByb2ZpbGUpOworCisgICBpZiAoIXJlc3VsdCkKKyAgICAgIGV4aXQoMSk7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhcl90ZXh0KHBuZ190ZXh0ICp0ZXh0LCBwbmdfY2hhcnAga2V5d29yZCkKK3sKKyAgIHRleHQtPmNvbXByZXNzaW9uID0gLTE7IC8qIG5vbmUgKi8KKyAgIHRleHQtPmtleSA9IGtleXdvcmQ7CisgICB0ZXh0LT50ZXh0ID0gTlVMTDsKKyAgIHRleHQtPnRleHRfbGVuZ3RoID0gMDsgLyogbGlicG5nIGNhbGN1bGF0ZXMgdGhpcyAqLworICAgdGV4dC0+aXR4dF9sZW5ndGggPSAwOyAvKiBsaWJwbmcgY2FsY3VsYXRlcyB0aGlzICovCisgICB0ZXh0LT5sYW5nID0gTlVMTDsKKyAgIHRleHQtPmxhbmdfa2V5ID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK3NldF90ZXh0KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3RleHRwIHRleHQsCisgICBwbmdfY2hhcnAgcGFyYW0pCit7CisgICBzd2l0Y2ggKHBhcmFtWzBdKQorICAgeworICAgICAgY2FzZSAnPCc6CisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgZmlsZSA9IE5VTEw7CisKKyAgICAgICAgICAgIHRleHQtPnRleHRfbGVuZ3RoID0gbG9hZF9maWxlKHBhcmFtKzEsICZmaWxlKTsKKyAgICAgICAgICAgIHRleHQtPnRleHQgPSAocG5nX2NoYXJwKWZpbGU7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgorICAgICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIGRhdGEgPSBOVUxMOworICAgICAgICAgICAgcG5nX3NpemVfdCBmYWtlX2xlbiA9IGxvYWRfZmFrZShwYXJhbSwgJmRhdGEpOworCisgICAgICAgICAgICBpZiAoZmFrZV9sZW4gPiAwKSAvKiBlbHNlIGEgc2ltcGxlIHBhcmFtZXRlciAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgdGV4dC0+dGV4dF9sZW5ndGggPSBmYWtlX2xlbjsKKyAgICAgICAgICAgICAgIHRleHQtPnRleHQgPSAocG5nX2NoYXJwKWRhdGE7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHRleHQtPnRleHQgPSBwYXJhbTsKKyAgICAgICAgIGJyZWFrOworICAgfQorCisgICBwbmdfc2V0X3RleHQocG5nX3B0ciwgaW5mb19wdHIsIHRleHQsIDEpOworCisgICBpZiAodGV4dC0+dGV4dCAhPSBwYXJhbSkKKyAgICAgIGZyZWUodGV4dC0+dGV4dCk7Cit9CisKK3N0YXRpYyB2b2lkCitpbnNlcnRfdEVYdChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIGludCBucGFyYW1zLAorICAgcG5nX2NoYXJwcCBwYXJhbXMpCit7CisgICBwbmdfdGV4dCB0ZXh0OworCisgICBjaGVja19wYXJhbV9jb3VudChucGFyYW1zLCAyKTsKKyAgIGNsZWFyX3RleHQoJnRleHQsIHBhcmFtc1swXSk7CisgICBzZXRfdGV4dChwbmdfcHRyLCBpbmZvX3B0ciwgJnRleHQsIHBhcmFtc1sxXSk7Cit9CisKK3N0YXRpYyB2b2lkCitpbnNlcnRfelRYdChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIGludCBucGFyYW1zLAorICAgcG5nX2NoYXJwcCBwYXJhbXMpCit7CisgICBwbmdfdGV4dCB0ZXh0OworCisgICBjaGVja19wYXJhbV9jb3VudChucGFyYW1zLCAyKTsKKyAgIGNsZWFyX3RleHQoJnRleHQsIHBhcmFtc1swXSk7CisgICB0ZXh0LmNvbXByZXNzaW9uID0gMDsgLyogZGVmbGF0ZSAqLworICAgc2V0X3RleHQocG5nX3B0ciwgaW5mb19wdHIsICZ0ZXh0LCBwYXJhbXNbMV0pOworfQorCitzdGF0aWMgdm9pZAoraW5zZXJ0X2lUWHQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBpbnQgbnBhcmFtcywKKyAgIHBuZ19jaGFycHAgcGFyYW1zKQoreworICAgcG5nX3RleHQgdGV4dDsKKworICAgY2hlY2tfcGFyYW1fY291bnQobnBhcmFtcywgNCk7CisgICBjbGVhcl90ZXh0KCZ0ZXh0LCBwYXJhbXNbMF0pOworICAgdGV4dC5jb21wcmVzc2lvbiA9IDI7IC8qIGlUWHQgKyBkZWZsYXRlICovCisgICB0ZXh0LmxhbmcgPSBwYXJhbXNbMV07LyogbGFuZ3VhZ2UgdGFnICovCisgICB0ZXh0Lmxhbmdfa2V5ID0gcGFyYW1zWzJdOyAvKiB0cmFuc2xhdGVkIGtleXdvcmQgKi8KKyAgIHNldF90ZXh0KHBuZ19wdHIsIGluZm9fcHRyLCAmdGV4dCwgcGFyYW1zWzNdKTsKK30KKworc3RhdGljIHZvaWQKK2luc2VydF9oSVNUKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgaW50IG5wYXJhbXMsCisgICAgICBwbmdfY2hhcnBwIHBhcmFtcykKK3sKKyAgIGludCBpOworICAgcG5nX3VpbnRfMTYgZnJlcVsyNTZdOworCisgICAvKiBsaWJwbmcgdGFrZXMgdGhlIGNvdW50IGZyb20gdGhlIFBMVEUgY291bnQ7IHdlIGRvbid0IGNoZWNrIGl0IGhlcmUgYnV0IHdlCisgICAgKiBkbyBzZXQgdGhlIGFycmF5IHRvIDAgZm9yIHVuc3BlY2lmaWVkIGVudHJpZXMuCisgICAgKi8KKyAgIG1lbXNldChmcmVxLCAwLCBzaXplb2YgZnJlcSk7CisgICBmb3IgKGk9MDsgaTxucGFyYW1zOyArK2kpCisgICB7CisgICAgICBjaGFyICplbmRwdHIgPSBOVUxMOworICAgICAgdW5zaWduZWQgbG9uZyBpbnQgbCA9IHN0cnRvdWwocGFyYW1zW2ldLCAmZW5kcHRyLCAwLypiYXNlKi8pOworCisgICAgICBpZiAocGFyYW1zW2ldWzBdICYmICplbmRwdHIgPT0gMCAmJiBsIDw9IDY1NTM1KQorICAgICAgICAgZnJlcVtpXSA9IChwbmdfdWludF8xNilsOworCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImhJU1RbJWRdOiAlczogaW52YWxpZCBmcmVxdWVuY3lcbiIsIGksIHBhcmFtc1tpXSk7CisgICAgICAgICBleGl0KDEpOworICAgICAgfQorICAgfQorCisgICBwbmdfc2V0X2hJU1QocG5nX3B0ciwgaW5mb19wdHIsIGZyZXEpOworfQorCitzdGF0aWMgcG5nX2J5dGUKK2J2YWwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jaGFycCBwYXJhbSwgdW5zaWduZWQgaW50IG1heHZhbCkKK3sKKyAgIGNoYXIgKmVuZHB0ciA9IE5VTEw7CisgICB1bnNpZ25lZCBsb25nIGludCBsID0gc3RydG91bChwYXJhbSwgJmVuZHB0ciwgMC8qYmFzZSovKTsKKworICAgaWYgKHBhcmFtWzBdICYmICplbmRwdHIgPT0gMCAmJiBsIDw9IG1heHZhbCkKKyAgICAgIHJldHVybiAocG5nX2J5dGUpbDsKKworICAgZWxzZQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJzQklUOiBpbnZhbGlkIHNCSVQgdmFsdWUiKTsKK30KKworc3RhdGljIHZvaWQKK2luc2VydF9zQklUKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgaW50IG5wYXJhbXMsCisgICAgICBwbmdfY2hhcnBwIHBhcmFtcykKK3sKKyAgIGNvbnN0IGludCBjdCA9IHBuZ19nZXRfY29sb3JfdHlwZShwbmdfcHRyLCBpbmZvX3B0cik7CisgICBjb25zdCBpbnQgYyA9IChjdCAmIFBOR19DT0xPUl9NQVNLX0NPTE9SID8gMyA6IDEpICsKKyAgICAgIChjdCAmIFBOR19DT0xPUl9NQVNLX0FMUEhBID8gMSA6IDApOworICAgY29uc3QgdW5zaWduZWQgaW50IG1heHZhbCA9CisgICAgICBjdCAmIFBOR19DT0xPUl9NQVNLX1BBTEVUVEUgPyA4VSA6IHBuZ19nZXRfYml0X2RlcHRoKHBuZ19wdHIsIGluZm9fcHRyKTsKKyAgIHBuZ19jb2xvcl84IHNCSVQ7CisKKyAgIGlmIChucGFyYW1zICE9IGMpCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInNCSVQ6IGluY29ycmVjdCBwYXJhbWV0ZXIgY291bnQiKTsKKworICAgaWYgKGN0ICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpCisgICB7CisgICAgICBzQklULnJlZCA9IGJ2YWwocG5nX3B0ciwgcGFyYW1zWzBdLCBtYXh2YWwpOworICAgICAgc0JJVC5ncmVlbiA9IGJ2YWwocG5nX3B0ciwgcGFyYW1zWzFdLCBtYXh2YWwpOworICAgICAgc0JJVC5ibHVlID0gYnZhbChwbmdfcHRyLCBwYXJhbXNbMl0sIG1heHZhbCk7CisgICAgICBzQklULmdyYXkgPSA0MjsKKyAgIH0KKworICAgZWxzZQorICAgeworICAgICAgc0JJVC5yZWQgPSBzQklULmdyZWVuID0gc0JJVC5ibHVlID0gNDI7CisgICAgICBzQklULmdyYXkgPSBidmFsKHBuZ19wdHIsIHBhcmFtc1swXSwgbWF4dmFsKTsKKyAgIH0KKworICAgaWYgKGN0ICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpCisgICAgICBzQklULmFscGhhID0gYnZhbChwbmdfcHRyLCBwYXJhbXNbbnBhcmFtcy0xXSwgbWF4dmFsKTsKKworICAgZWxzZQorICAgICAgc0JJVC5hbHBoYSA9IDQyOworCisgICBwbmdfc2V0X3NCSVQocG5nX3B0ciwgaW5mb19wdHIsICZzQklUKTsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkCitpbnNlcnRfc1BMVChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIGludCBucGFyYW1zLCBwbmdfY2hhcnBwIHBhcmFtcykKK3sKKyAgIGZwcmludGYoc3RkZXJyLCAiaW5zZXJ0IHNQTFQ6IE5ZSVxuIik7Cit9CisjZW5kaWYKKworc3RhdGljIGludAorZmluZF9wYXJhbWV0ZXJzKHBuZ19jb25zdF9jaGFycCB3aGF0LCBwbmdfY2hhcnAgcGFyYW0sIHBuZ19jaGFycCAqbGlzdCwKKyAgIGludCBucGFyYW1zKQoreworICAgLyogUGFyYW1ldGVycyBhcmUgc2VwYXJhdGVkIGJ5ICdcbicgb3IgJzonIGNoYXJhY3RlcnMsIHVwIHRvIG5wYXJhbXMgYXJlCisgICAgKiBhY2NlcHRlZCAobW9yZSBpcyBhbiBlcnJvcikgYW5kIHRoZSBudW1iZXIgZm91bmQgaXMgcmV0dXJuZWQuCisgICAgKi8KKyAgIGludCBpOworICAgZm9yIChpPTA7ICpwYXJhbSAmJiBpPG5wYXJhbXM7ICsraSkKKyAgIHsKKyAgICAgIGxpc3RbaV0gPSBwYXJhbTsKKyAgICAgIHdoaWxlICgqKytwYXJhbSkgaWYgKCpwYXJhbSA9PSAnXG4nIHx8ICpwYXJhbSA9PSAnOicpCisgICAgICB7CisgICAgICAgICAqcGFyYW0rKyA9IDA7IC8qIFRlcm1pbmF0ZSBsYXN0IHBhcmFtZXRlciAqLworICAgICAgICAgYnJlYWs7ICAgICAgICAvKiBBbmQgc3RhcnQgYSBuZXcgb25lLiAqLworICAgICAgfQorICAgfQorCisgICBpZiAoKnBhcmFtKQorICAgeworICAgICAgZnByaW50ZihzdGRlcnIsICItLWluc2VydCAlczogdG9vIG1hbnkgcGFyYW1ldGVycyAoJXMpXG4iLCB3aGF0LCBwYXJhbSk7CisgICAgICBleGl0KDEpOworICAgfQorCisgICBsaXN0W2ldID0gTlVMTDsgLyogdGVybWluYXRlcyBsaXN0ICovCisgICByZXR1cm4gaTsgLyogbnVtYmVyIG9mIHBhcmFtZXRlcnMgZmlsbGVkIGluICovCit9CisKK3N0YXRpYyB2b2lkCitiYWRfcGFyYW1ldGVyX2NvdW50KHBuZ19jb25zdF9jaGFycCB3aGF0LCBpbnQgbnBhcmFtcykKK3sKKyAgIGZwcmludGYoc3RkZXJyLCAiLS1pbnNlcnQgJXM6IGJhZCBwYXJhbWV0ZXIgY291bnQgJWRcbiIsIHdoYXQsIG5wYXJhbXMpOworICAgZXhpdCgxKTsKK30KKworc3RhdGljIGNodW5rX2luc2VydCAqCittYWtlX2luc2VydChwbmdfY29uc3RfY2hhcnAgd2hhdCwKKyAgIHZvaWQgKCppbnNlcnQpKHBuZ19zdHJ1Y3RwLCBwbmdfaW5mb3AsIGludCwgcG5nX2NoYXJwcCksCisgICBpbnQgbnBhcmFtcywgcG5nX2NoYXJwcCBsaXN0KQoreworICAgaW50IGk7CisgICBjaHVua19pbnNlcnQgKmNpcDsKKworICAgY2lwID0gbWFsbG9jKG9mZnNldG9mKGNodW5rX2luc2VydCxwYXJhbWV0ZXJzKSArCisgICAgICBucGFyYW1zICogc2l6ZW9mIChwbmdfY2hhcnApKTsKKworICAgaWYgKGNpcCA9PSBOVUxMKQorICAgeworICAgICAgZnByaW50ZihzdGRlcnIsICItLWluc2VydCAlczogb3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nICVkIHBhcmFtZXRlcnNcbiIsCisgICAgICAgICB3aGF0LCBucGFyYW1zKTsKKyAgICAgIGV4aXQoMSk7CisgICB9CisKKyAgIGNpcC0+bmV4dCA9IE5VTEw7CisgICBjaXAtPmluc2VydCA9IGluc2VydDsKKyAgIGNpcC0+bnBhcmFtcyA9IG5wYXJhbXM7CisgICBmb3IgKGk9MDsgaTxucGFyYW1zOyArK2kpCisgICAgICBjaXAtPnBhcmFtZXRlcnNbaV0gPSBsaXN0W2ldOworCisgICByZXR1cm4gY2lwOworfQorCitzdGF0aWMgY2h1bmtfaW5zZXJ0ICoKK2ZpbmRfaW5zZXJ0KHBuZ19jb25zdF9jaGFycCB3aGF0LCBwbmdfY2hhcnAgcGFyYW0pCit7CisgICBwbmdfdWludF8zMiBjaHVuayA9IDA7CisgICBwbmdfY2hhcnAgcGFyYW1ldGVyX2xpc3RbMTAyNF07CisgICBpbnQgaSwgbnBhcmFtczsKKworICAgLyogQXNzZW1ibGUgdGhlIGNodW5rIG5hbWUgKi8KKyAgIGZvciAoaT0wOyBpPDQ7ICsraSkKKyAgIHsKKyAgICAgIGNoYXIgY2ggPSB3aGF0W2ldOworCisgICAgICBpZiAoKGNoID49IDY1ICYmIGNoIDw9IDkwKSB8fCAoY2ggPj0gOTcgJiYgY2ggPD0gMTIyKSkKKyAgICAgICAgIGNodW5rID0gKGNodW5rIDw8IDgpICsgd2hhdFtpXTsKKworICAgICAgZWxzZQorICAgICAgICAgYnJlYWs7CisgICB9CisKKyAgIGlmIChpIDwgNCB8fCB3aGF0WzRdICE9IDApCisgICB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1ha2VwbmcgLS1pbnNlcnQgXCIlc1wiOiBpbnZhbGlkIGNodW5rIG5hbWVcbiIsIHdoYXQpOworICAgICAgZXhpdCgxKTsKKyAgIH0KKworICAgLyogQXNzZW1ibGUgdGhlIHBhcmFtZXRlciBsaXN0LiAqLworICAgbnBhcmFtcyA9IGZpbmRfcGFyYW1ldGVycyh3aGF0LCBwYXJhbSwgcGFyYW1ldGVyX2xpc3QsIDEwMjQpOworCisjICBkZWZpbmUgQ0hVTksoYSxiLGMsZCkgKCgoYSk8PDI0KSsoKGIpPDwxNikrKChjKTw8OCkrKGQpKQorCisgICBzd2l0Y2ggKGNodW5rKQorICAgeworICAgICAgY2FzZSBDSFVOSygxMDUsNjcsNjcsODApOiAgLyogaUNDUCAqLworICAgICAgICAgaWYgKG5wYXJhbXMgPT0gMikKKyAgICAgICAgICAgIHJldHVybiBtYWtlX2luc2VydCh3aGF0LCBpbnNlcnRfaUNDUCwgbnBhcmFtcywgcGFyYW1ldGVyX2xpc3QpOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ0hVTksoMTE2LDY5LDg4LDExNik6IC8qIHRFWHQgKi8KKyAgICAgICAgIGlmIChucGFyYW1zID09IDIpCisgICAgICAgICAgICByZXR1cm4gbWFrZV9pbnNlcnQod2hhdCwgaW5zZXJ0X3RFWHQsIG5wYXJhbXMsIHBhcmFtZXRlcl9saXN0KTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIENIVU5LKDEyMiw4NCw4OCwxMTYpOiAvKiB6VFh0ICovCisgICAgICAgICBpZiAobnBhcmFtcyA9PSAyKQorICAgICAgICAgICAgcmV0dXJuIG1ha2VfaW5zZXJ0KHdoYXQsIGluc2VydF96VFh0LCBucGFyYW1zLCBwYXJhbWV0ZXJfbGlzdCk7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDSFVOSygxMDUsODQsODgsMTE2KTogLyogaVRYdCAqLworICAgICAgICAgaWYgKG5wYXJhbXMgPT0gNCkKKyAgICAgICAgICAgIHJldHVybiBtYWtlX2luc2VydCh3aGF0LCBpbnNlcnRfaVRYdCwgbnBhcmFtcywgcGFyYW1ldGVyX2xpc3QpOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ0hVTksoMTA0LDczLDgzLDg0KTogIC8qIGhJU1QgKi8KKyAgICAgICAgIGlmIChucGFyYW1zIDw9IDI1NikKKyAgICAgICAgICAgIHJldHVybiBtYWtlX2luc2VydCh3aGF0LCBpbnNlcnRfaElTVCwgbnBhcmFtcywgcGFyYW1ldGVyX2xpc3QpOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ0hVTksoMTE1LDY2LDczLDg0KTogLyogc0JJVCAqLworICAgICAgICAgaWYgKG5wYXJhbXMgPD0gNCkKKyAgICAgICAgICAgIHJldHVybiBtYWtlX2luc2VydCh3aGF0LCBpbnNlcnRfc0JJVCwgbnBhcmFtcywgcGFyYW1ldGVyX2xpc3QpOworICAgICAgICAgYnJlYWs7CisKKyNpZiAwCisgICAgICBjYXNlIENIVU5LKDExNSw4MCw3Niw4NCk6ICAvKiBzUExUICovCisgICAgICAgICByZXR1cm4gbWFrZV9pbnNlcnQod2hhdCwgaW5zZXJ0X3NQTFQsIG5wYXJhbXMsIHBhcmFtZXRlcl9saXN0KTsKKyNlbmRpZgorCisgICAgICBkZWZhdWx0OgorICAgICAgICAgZnByaW50ZihzdGRlcnIsICJtYWtlcG5nIC0taW5zZXJ0IFwiJXNcIjogdW5yZWNvZ25pemVkIGNodW5rIG5hbWVcbiIsCisgICAgICAgICAgICB3aGF0KTsKKyAgICAgICAgIGV4aXQoMSk7CisgICB9CisKKyAgIGJhZF9wYXJhbWV0ZXJfY291bnQod2hhdCwgbnBhcmFtcyk7CisgICByZXR1cm4gTlVMTDsKK30KKworLyogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBsaWJwbmcgZXhwZWN0cyB3cml0ZWFibGUgc3RyaW5ncyBmb3IgdGhpbmdzIGxpa2UKKyAqIHRleHQgY2h1bmtzIChtYXliZSB0aGlzIHNob3VsZCBiZSBmaXhlZC4uLikKKyAqLworc3RhdGljIHBuZ19jaGFycAorc3Ryc3Rhc2gocG5nX2NvbnN0X2NoYXJwIGZvbykKK3sKKyAgIC8qIFRoZSBwcm9ncmFtIGluZGljYXRlcyBhIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yIGJ5IGNyYXNoaW5nLCB0aGlzIGlzIGJ5CisgICAgKiBkZXNpZ24uCisgICAgKi8KKyAgIGlmIChmb28gIT0gTlVMTCkKKyAgIHsKKyAgICAgIHBuZ19jaGFycCBiYXIgPSBtYWxsb2Moc3RybGVuKGZvbykrMSk7CisgICAgICByZXR1cm4gc3RyY3B5KGJhciwgZm9vKTsKKyAgIH0KKworICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBwbmdfY2hhcnAKK3N0cnN0YXNoX2xpc3QoY29uc3QgcG5nX2NvbnN0X2NoYXJwICp0ZXh0KQoreworICAgc2l6ZV90IGZvbyA9IDA7CisgICBwbmdfY2hhcnAgcmVzdWx0LCBiYXI7CisgICBjb25zdCBwbmdfY29uc3RfY2hhcnAgKmxpbmUgPSB0ZXh0OworCisgICB3aGlsZSAoKmxpbmUgIT0gTlVMTCkKKyAgICAgIGZvbyArPSBzdHJsZW4oKmxpbmUrKyk7CisKKyAgIHJlc3VsdCA9IGJhciA9IG1hbGxvYyhmb28rMSk7CisKKyAgIGxpbmUgPSB0ZXh0OworICAgd2hpbGUgKCpsaW5lICE9IE5VTEwpCisgICB7CisgICAgICBmb28gPSBzdHJsZW4oKmxpbmUpOworICAgICAgbWVtY3B5KGJhciwgKmxpbmUrKywgZm9vKTsKKyAgICAgIGJhciArPSBmb287CisgICB9CisKKyAgICpiYXIgPSAwOworICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogVGhlc2UgYXJlIHVzZWQgdG8gaW5zZXJ0IENvcHlyaWdodCBhbmQgTGljZW5jZSBmaWVsZHMsIHRoZXkgYWxsb3cgdGhlIHRleHQgdG8KKyAqIGhhdmUgXG4gdW5saWtlIHRoZSAtLWluc2VydCBvcHRpb24uCisgKi8KK3N0YXRpYyBjaHVua19pbnNlcnQgKgorYWRkX3RFWHQoY29uc3QgY2hhciAqa2V5LCBjb25zdCBwbmdfY29uc3RfY2hhcnAgKnRleHQpCit7CisgICBzdGF0aWMgY2hhciB3aGF0WzVdID0geyAxMTYsIDY5LCA4OCwgMTE2LCAwIH07CisgICBwbmdfY2hhcnAgcGFyYW1ldGVyX2xpc3RbM107CisKKyAgIHBhcmFtZXRlcl9saXN0WzBdID0gc3Ryc3Rhc2goa2V5KTsKKyAgIHBhcmFtZXRlcl9saXN0WzFdID0gc3Ryc3Rhc2hfbGlzdCh0ZXh0KTsKKyAgIHBhcmFtZXRlcl9saXN0WzJdID0gTlVMTDsKKworICAgcmV0dXJuIG1ha2VfaW5zZXJ0KHdoYXQsIGluc2VydF90RVh0LCAyLCBwYXJhbWV0ZXJfbGlzdCk7Cit9CisKK3N0YXRpYyBjaHVua19pbnNlcnQgKgorYWRkX2lUWHQoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICpsYW5ndWFnZSwgY29uc3QgY2hhciAqbGFuZ3VhZ2Vfa2V5LAorICAgICAgY29uc3QgcG5nX2NvbnN0X2NoYXJwICp0ZXh0KQoreworICAgc3RhdGljIGNoYXIgd2hhdFs1XSA9IHsgMTA1LCA4NCwgODgsIDExNiwgMCB9OworICAgcG5nX2NoYXJwIHBhcmFtZXRlcl9saXN0WzVdOworCisgICBwYXJhbWV0ZXJfbGlzdFswXSA9IHN0cnN0YXNoKGtleSk7CisgICBwYXJhbWV0ZXJfbGlzdFsxXSA9IHN0cnN0YXNoKGxhbmd1YWdlKTsKKyAgIHBhcmFtZXRlcl9saXN0WzJdID0gc3Ryc3Rhc2gobGFuZ3VhZ2Vfa2V5KTsKKyAgIHBhcmFtZXRlcl9saXN0WzNdID0gc3Ryc3Rhc2hfbGlzdCh0ZXh0KTsKKyAgIHBhcmFtZXRlcl9saXN0WzRdID0gTlVMTDsKKworICAgcmV0dXJuIG1ha2VfaW5zZXJ0KHdoYXQsIGluc2VydF9pVFh0LCA0LCBwYXJhbWV0ZXJfbGlzdCk7Cit9CisKKy8qIFRoaXMgaXMgYSBub3QtdmVyeS1nb29kIHBhcnNlciBmb3IgYSBzZXF1ZW5jZSBvZiBudW1iZXJzIChpbmNsdWRpbmcgMCkuICBJdAorICogZG9lc24ndCBhY2NlcHQgc29tZSBhcHBhcmVudGx5IHZhbGlkIHRoaW5ncywgYnV0IGl0IGFjY2VwdHMgYWxsIHRoZSBzZW5zaWJsZQorICogY29tYmluYXRpb25zLgorICovCitzdGF0aWMgdm9pZAorcGFyc2VfY29sb3IoY2hhciAqYXJnLCB1bnNpZ25lZCBpbnQgKmNvbG9ycykKK3sKKyAgIHVuc2lnbmVkIGludCBuY29sb3JzID0gMDsKKworICAgd2hpbGUgKCphcmcgJiYgbmNvbG9ycyA8IDQpCisgICB7CisgICAgICBjaGFyICplcCA9IGFyZzsKKworICAgICAgdW5zaWduZWQgbG9uZyB1bCA9IHN0cnRvdWwoYXJnLCAmZXAsIDApOworCisgICAgICBpZiAodWwgPiA2NTUzNSkKKyAgICAgIHsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWFrZXBuZyAtLWNvbG9yPS4uLiclcyc6IHRvbyBiaWdcbiIsIGFyZyk7CisgICAgICAgICBleGl0KDEpOworICAgICAgfQorCisgICAgICBpZiAoZXAgPT0gYXJnKQorICAgICAgeworICAgICAgICAgZnByaW50ZihzdGRlcnIsICJtYWtlcG5nIC0tY29sb3I9Li4uJyVzJzogbm90IGEgdmFsaWQgY29sb3JcbiIsIGFyZyk7CisgICAgICAgICBleGl0KDEpOworICAgICAgfQorCisgICAgICBpZiAoKmVwKSArK2VwOyAvKiBza2lwIGEgc2VwYXJhdG9yICovCisgICAgICBhcmcgPSBlcDsKKworICAgICAgY29sb3JzWysrbmNvbG9yc10gPSAodW5zaWduZWQgaW50KXVsOyAvKiBjaGVja2VkIGFib3ZlICovCisgICB9CisKKyAgIGlmICgqYXJnKQorICAgeworICAgICAgZnByaW50ZihzdGRlcnIsICJtYWtlcG5nIC0tY29sb3I9Li4uJyVzJzogdG9vIG1hbnkgdmFsdWVzXG4iLCBhcmcpOworICAgICAgZXhpdCgxKTsKKyAgIH0KKworICAgKmNvbG9ycyA9IG5jb2xvcnM7Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICBGSUxFICpmcCA9IHN0ZG91dDsKKyAgIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSA9IE5VTEw7CisgICBpbnQgY29sb3JfdHlwZSA9IDg7IC8qIGludmFsaWQgKi8KKyAgIGludCBiaXRfZGVwdGggPSAzMjsgLyogaW52YWxpZCAqLworICAgaW50IHNtYWxsID0gMDsgLyogbWFrZSBmdWxsIHNpemUgaW1hZ2VzICovCisgICBpbnQgdFJOUyA9IDA7IC8qIGRvbid0IG91dHB1dCBhIHRSTlMgY2h1bmsgKi8KKyAgIHVuc2lnbmVkIGludCBjb2xvcnNbNV07CisgICB1bnNpZ25lZCBpbnQgZmlsdGVycyA9IFBOR19BTExfRklMVEVSUzsKKyAgIHBuZ19maXhlZF9wb2ludCBnYW1tYSA9IDA7IC8qIG5vdCBzZXQgKi8KKyAgIGNodW5rX2luc2VydCAqaGVhZF9pbnNlcnQgPSBOVUxMOworICAgY2h1bmtfaW5zZXJ0ICoqaW5zZXJ0X3B0ciA9ICZoZWFkX2luc2VydDsKKworICAgbWVtc2V0KGNvbG9ycywgMCwgc2l6ZW9mIGNvbG9ycyk7CisKKyAgIHdoaWxlICgtLWFyZ2MgPiAwKQorICAgeworICAgICAgY2hhciAqYXJnID0gKisrYXJndjsKKworICAgICAgaWYgKHN0cmNtcChhcmcsICItLXNtYWxsIikgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgIHNtYWxsID0gMTsKKyAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoc3RyY21wKGFyZywgIi0tdFJOUyIpID09IDApCisgICAgICB7CisgICAgICAgICB0Uk5TID0gMTsKKyAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoc3RyY21wKGFyZywgIi0tc1JHQiIpID09IDApCisgICAgICB7CisgICAgICAgICBnYW1tYSA9IFBOR19ERUZBVUxUX3NSR0I7CisgICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKHN0cmNtcChhcmcsICItLWxpbmVhciIpID09IDApCisgICAgICB7CisgICAgICAgICBnYW1tYSA9IFBOR19GUF8xOworICAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChzdHJjbXAoYXJnLCAiLS0xLjgiKSA9PSAwKQorICAgICAgeworICAgICAgICAgZ2FtbWEgPSBQTkdfR0FNTUFfTUFDXzE4OworICAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChzdHJjbXAoYXJnLCAiLS1ub2ZpbHRlcnMiKSA9PSAwKQorICAgICAgeworICAgICAgICAgZmlsdGVycyA9IFBOR19GSUxURVJfTk9ORTsKKyAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoc3RybmNtcChhcmcsICItLWNvbG9yPSIsIDgpID09IDApCisgICAgICB7CisgICAgICAgICAgcGFyc2VfY29sb3IoYXJnKzgsIGNvbG9ycyk7CisgICAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChhcmdjID49IDMgJiYgc3RyY21wKGFyZywgIi0taW5zZXJ0IikgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19jb25zdF9jaGFycCB3aGF0ID0gKisrYXJndjsKKyAgICAgICAgIHBuZ19jaGFycCBwYXJhbSA9ICorK2FyZ3Y7CisgICAgICAgICBjaHVua19pbnNlcnQgKm5ld19pbnNlcnQ7CisKKyAgICAgICAgIGFyZ2MgLT0gMjsKKworICAgICAgICAgbmV3X2luc2VydCA9IGZpbmRfaW5zZXJ0KHdoYXQsIHBhcmFtKTsKKworICAgICAgICAgaWYgKG5ld19pbnNlcnQgIT0gTlVMTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgICppbnNlcnRfcHRyID0gbmV3X2luc2VydDsKKyAgICAgICAgICAgIGluc2VydF9wdHIgPSAmbmV3X2luc2VydC0+bmV4dDsKKyAgICAgICAgIH0KKworICAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChhcmdbMF0gPT0gJy0nKQorICAgICAgeworICAgICAgICAgZnByaW50ZihzdGRlcnIsICJtYWtlcG5nOiAlczogaW52YWxpZCBvcHRpb25cbiIsIGFyZyk7CisgICAgICAgICBleGl0KDEpOworICAgICAgfQorCisgICAgICBpZiAoc3RyY21wKGFyZywgInBhbGV0dGUiKSA9PSAwKQorICAgICAgeworICAgICAgICAgY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEU7CisgICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKHN0cm5jbXAoYXJnLCAiZ3JheSIsIDQpID09IDApCisgICAgICB7CisgICAgICAgICBpZiAoYXJnWzRdID09IDApCisgICAgICAgICB7CisgICAgICAgICAgICBjb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfR1JBWTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgfQorCisgICAgICAgICBlbHNlIGlmIChzdHJjbXAoYXJnKzQsICJhIikgPT0gMCB8fAorICAgICAgICAgICAgc3RyY21wKGFyZys0LCAiYWxwaGEiKSA9PSAwIHx8CisgICAgICAgICAgICBzdHJjbXAoYXJnKzQsICItYWxwaGEiKSA9PSAwKQorICAgICAgICAgeworICAgICAgICAgICAgY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEE7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHN0cm5jbXAoYXJnLCAicmdiIiwgMykgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgIGlmIChhcmdbM10gPT0gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9SR0I7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgIH0KKworICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZyszLCAiYSIpID09IDAgfHwKKyAgICAgICAgICAgIHN0cmNtcChhcmcrMywgImFscGhhIikgPT0gMCB8fAorICAgICAgICAgICAgc3RyY21wKGFyZyszLCAiLWFscGhhIikgPT0gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEE7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGNvbG9yX3R5cGUgPT0gOCAmJiBpc2RpZ2l0KGFyZ1swXSkpCisgICAgICB7CisgICAgICAgICBjb2xvcl90eXBlID0gYXRvaShhcmcpOworICAgICAgICAgaWYgKGNvbG9yX3R5cGUgPCAwIHx8IGNvbG9yX3R5cGUgPiA2IHx8IGNvbG9yX3R5cGUgPT0gMSB8fAorICAgICAgICAgICAgY29sb3JfdHlwZSA9PSA1KQorICAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJtYWtlcG5nOiAlczogbm90IGEgdmFsaWQgY29sb3IgdHlwZVxuIiwgYXJnKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICB9CisKKyAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoYml0X2RlcHRoID09IDMyICYmIGlzZGlnaXQoYXJnWzBdKSkKKyAgICAgIHsKKyAgICAgICAgIGJpdF9kZXB0aCA9IGF0b2koYXJnKTsKKyAgICAgICAgIGlmIChiaXRfZGVwdGggPD0gMCB8fCBiaXRfZGVwdGggPiAxNiB8fAorICAgICAgICAgICAgKGJpdF9kZXB0aCAmIC1iaXRfZGVwdGgpICE9IGJpdF9kZXB0aCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWFrZXBuZzogJXM6IG5vdCBhIHZhbGlkIGJpdCBkZXB0aFxuIiwgYXJnKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICB9CisKKyAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoYXJnYyA9PSAxKSAvKiBJdCdzIHRoZSBmaWxlIG5hbWUgKi8KKyAgICAgIHsKKyAgICAgICAgIGZwID0gZm9wZW4oYXJnLCAid2IiKTsKKyAgICAgICAgIGlmIChmcCA9PSBOVUxMKQorICAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogJXM6IGNvdWxkIG5vdCBvcGVuXG4iLCBhcmcsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgfQorCisgICAgICAgICBmaWxlX25hbWUgPSBhcmc7CisgICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgZnByaW50ZihzdGRlcnIsICJtYWtlcG5nOiAlczogdW5rbm93biBhcmd1bWVudFxuIiwgYXJnKTsKKyAgICAgIGV4aXQoMSk7CisgICB9IC8qIGFyZ3VtZW50IHdoaWxlIGxvb3AgKi8KKworICAgaWYgKGNvbG9yX3R5cGUgPT0gOCB8fCBiaXRfZGVwdGggPT0gMzIpCisgICB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiBtYWtlcG5nIFstLXNtYWxsXSBbLS1zUkdCfC0tbGluZWFyfC0tMS44XSAiCisgICAgICAgICAiWy0tY29sb3I9Li4uXSBjb2xvci10eXBlIGJpdC1kZXB0aCBbZmlsZS1uYW1lXVxuIgorICAgICAgICAgIiAgTWFrZSBhIHRlc3QgUE5HIGZpbGUsIGJ5IGRlZmF1bHQgd3JpdGVzIHRvIHN0ZG91dC5cbiIKKyAgICAgICAgICIgIE90aGVyIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSwgVVRTTC5cbiIpOworICAgICAgZXhpdCgxKTsKKyAgIH0KKworICAgLyogQ2hlY2sgdGhlIGNvbG9ycyAqLworICAgeworICAgICAgY29uc3QgdW5zaWduZWQgaW50IGxpbSA9IChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgPyAyNTVVIDoKKyAgICAgICAgICgxVTw8Yml0X2RlcHRoKS0xKTsKKyAgICAgIHVuc2lnbmVkIGludCBpOworCisgICAgICBmb3IgKGk9MTsgaTw9Y29sb3JzWzBdOyArK2kpCisgICAgICAgICBpZiAoY29sb3JzW2ldID4gbGltKQorICAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJtYWtlcG5nOiAtLWNvbG9yPS4uLjogJXUgb3V0IG9mIHJhbmdlIFswLi4ldV1cbiIsCisgICAgICAgICAgICAgICBjb2xvcnNbaV0sIGxpbSk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgfQorICAgfQorCisgICAvKiBzbWFsbCBhbmQgY29sb3JzIGFyZSBpbmNvbXBhcmlibGUgKHdpbGwgcHJvYmFibHkgY3Jhc2ggaWYgYm90aCBhcmUgdXNlZCBhdAorICAgICogdGhlIHNhbWUgdGltZSEpCisgICAgKi8KKyAgIGlmIChzbWFsbCAmJiBjb2xvcnNbMF0gIT0gMCkKKyAgIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAibWFrZXBuZzogLS1jb2xvciAtLXNtYWxsOiBvbmx5IG9uZSBhdCBhIHRpbWUhXG4iKTsKKyAgICAgIGV4aXQoMSk7CisgICB9CisKKyAgIC8qIFJlc3RyaWN0IHRoZSBmaWx0ZXJzIGZvciBtb3JlIHNwZWVkIHRvIHRob3NlIHdlIGtub3cgYXJlIHVzZWQgZm9yIHRoZQorICAgICogZ2VuZXJhdGVkIGltYWdlcy4KKyAgICAqLworICAgaWYgKGZpbHRlcnMgPT0gUE5HX0FMTF9GSUxURVJTICYmICFzbWFsbC8qc21hbGwgcHJvdmlkZXMgZGVmYXVsdHMqLykKKyAgIHsKKyAgICAgIGlmICgoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX1BBTEVUVEUpICE9IDAgfHwgYml0X2RlcHRoIDwgOCkKKyAgICAgICAgIGZpbHRlcnMgPSBQTkdfRklMVEVSX05PTkU7CisKKyAgICAgIGVsc2UgaWYgKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikgLyogcmdiICovCisgICAgICB7CisgICAgICAgICBpZiAoYml0X2RlcHRoID09IDgpCisgICAgICAgICAgICBmaWx0ZXJzICY9IH4oUE5HX0ZJTFRFUl9OT05FIHwgUE5HX0ZJTFRFUl9BVkcpOworCisgICAgICAgICBlbHNlCisgICAgICAgICAgICBmaWx0ZXJzID0gUE5HX0ZJTFRFUl9TVUIgfCBQTkdfRklMVEVSX1BBRVRIOworICAgICAgfQorCisgICAgICBlbHNlIC8qIGdyYXkgOCBvciAxNi1iaXQgKi8KKyAgICAgICAgIGZpbHRlcnMgJj0gflBOR19GSUxURVJfTk9ORTsKKyAgIH0KKworICAgLyogSW5zZXJ0IHN0YW5kYXJkIGNvcHlyaWdodCBhbmQgbGljZW5jZSB0ZXh0LiAqLworICAgeworICAgICAgc3RhdGljIHBuZ19jb25zdF9jaGFycCBjb3B5cmlnaHRbXSA9CisgICAgICB7CisgICAgICAgICBDT1BZUklHSFQsIC8qIElTTy1MYXRpbi0xICovCisgICAgICAgICBOVUxMCisgICAgICB9OworICAgICAgc3RhdGljIHBuZ19jb25zdF9jaGFycCBsaWNlbnNpbmdbXSA9CisgICAgICB7CisgICAgICAgICBJTUFHRV9MSUNFTlNJTkcsIC8qIFVURi04ICovCisgICAgICAgICBOVUxMCisgICAgICB9OworCisgICAgICBjaHVua19pbnNlcnQgKm5ld19pbnNlcnQ7CisKKyAgICAgIG5ld19pbnNlcnQgPSBhZGRfdEVYdCgiQ29weXJpZ2h0IiwgY29weXJpZ2h0KTsKKyAgICAgIGlmIChuZXdfaW5zZXJ0ICE9IE5VTEwpCisgICAgICB7CisgICAgICAgICAqaW5zZXJ0X3B0ciA9IG5ld19pbnNlcnQ7CisgICAgICAgICBpbnNlcnRfcHRyID0gJm5ld19pbnNlcnQtPm5leHQ7CisgICAgICB9CisKKyAgICAgIG5ld19pbnNlcnQgPSBhZGRfaVRYdCgiTGljZW5zaW5nIiwgImVuIiwgTlVMTCwgbGljZW5zaW5nKTsKKyAgICAgIGlmIChuZXdfaW5zZXJ0ICE9IE5VTEwpCisgICAgICB7CisgICAgICAgICAqaW5zZXJ0X3B0ciA9IG5ld19pbnNlcnQ7CisgICAgICAgICBpbnNlcnRfcHRyID0gJm5ld19pbnNlcnQtPm5leHQ7CisgICAgICB9CisgICB9CisKKyAgIHsKKyAgICAgIGludCByZXQgPSB3cml0ZV9wbmcoJmZpbGVfbmFtZSwgZnAsIGNvbG9yX3R5cGUsIGJpdF9kZXB0aCwgZ2FtbWEsCisgICAgICAgICBoZWFkX2luc2VydCwgZmlsdGVycywgY29sb3JzLCBzbWFsbCwgdFJOUyk7CisKKyAgICAgIGlmIChyZXQgIT0gMCAmJiBmaWxlX25hbWUgIT0gTlVMTCkKKyAgICAgICAgIHJlbW92ZShmaWxlX25hbWUpOworCisgICAgICByZXR1cm4gcmV0OworICAgfQorfQpkaWZmIC0tZ2l0IGEvbGlicG5nL2NvbnRyaWIvbGlidGVzdHMvcG5naW1hZ2UuYyBiL2xpYnBuZy9jb250cmliL2xpYnRlc3RzL3BuZ2ltYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQyYjJmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL2xpYnRlc3RzL3BuZ2ltYWdlLmMKQEAgLTAsMCArMSwxNjg3IEBACisvKiBwbmdpbWFnZS5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE1IEpvaG4gQ3VubmluZ2hhbSBCb3dsZXIKKyAqCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4yMCBbRGVjZW1iZXIgMywgMjAxNV0KKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKyAqCisgKiBUZXN0IHRoZSBwbmdfcmVhZF9wbmcgYW5kIHBuZ193cml0ZV9wbmcgaW50ZXJmYWNlcy4gIEdpdmVuIGEgUE5HIGZpbGUgbG9hZCBpdAorICogdXNpbmcgcG5nX3JlYWRfcG5nIGFuZCB0aGVuIHdyaXRlIHdpdGggcG5nX3dyaXRlX3BuZy4gIFRlc3QgYWxsIHBvc3NpYmxlCisgKiB0cmFuc2Zvcm1zLgorICovCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaWYgZGVmaW5lZChIQVZFX0NPTkZJR19IKSAmJiAhZGVmaW5lZChQTkdfTk9fQ09ORklHX0gpCisjICBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisvKiBEZWZpbmUgdGhlIGZvbGxvd2luZyB0byB1c2UgdGhpcyB0ZXN0IGFnYWluc3QgeW91ciBpbnN0YWxsZWQgbGlicG5nLCByYXRoZXIKKyAqIHRoYW4gdGhlIG9uZSBiZWluZyBidWlsdCBoZXJlOgorICovCisjaWZkZWYgUE5HX0ZSRUVTVEFORElOR19URVNUUworIyAgaW5jbHVkZSA8cG5nLmg+CisjZWxzZQorIyAgaW5jbHVkZSAiLi4vLi4vcG5nLmgiCisjZW5kaWYKKworI2lmbmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRAorIyAgaW5jbHVkZSA8c2V0am1wLmg+IC8qIGJlY2F1c2UgcG5nLmggZGlkICpub3QqIGluY2x1ZGUgdGhpcyAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19JTkZPX0lNQUdFX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRClcCisgICAgJiYgKGRlZmluZWQoUE5HX1JFQURfUE5HX1NVUFBPUlRFRCkgfHwgUE5HX0xJQlBOR19WRVIgPCAxMDcwMCkKKy8qIElmIGEgdHJhbnNmb3JtIGlzIHZhbGlkIG9uIGJvdGggcmVhZCBhbmQgd3JpdGUgdGhpcyBpbXBsaWVzIHRoYXQgaWYgdGhlCisgKiB0cmFuc2Zvcm0gaXMgYXBwbGllZCB0byByZWFkIGl0IG11c3QgYWxzbyBiZSBhcHBsaWVkIG9uIHdyaXRlIHRvIHByb2R1Y2UKKyAqIG1lYW5pbmdmdWwgZGF0YS4gIFRoaXMgaXMgYmVjYXVzZSB0aGVzZSB0cmFuc2Zvcm1zIHdoZW4gcGVyZm9ybWVkIG9uIHJlYWQKKyAqIHByb2R1Y2UgZGF0YSB3aXRoIGEgbWVtb3J5IGZvcm1hdCB0aGF0IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBQTkcgZm9ybWF0LgorICoKKyAqIE1vc3Qgb2YgdGhlc2UgdHJhbnNmb3JtcyBhcmUgaW52ZXJ0aWJsZTsgYWZ0ZXIgYXBwbHlpbmcgdGhlIHRyYW5zZm9ybSBvbgorICogd3JpdGUgdGhlIHJlc3VsdCBpcyB0aGUgb3JpZ2luYWwgUE5HIGRhdGEgdGhhdCB3b3VsZCBoYXZlIHdvdWxkIGhhdmUgYmVlbgorICogcmVhZCBpZiBubyB0cmFuc2Zvcm0gd2VyZSBhcHBsaWVkLgorICoKKyAqIFRoZSBleGNlcHRpb24gaXMgX1NISUZULCB3aGljaCBkZXN0cm95cyB0aGUgbG93IG9yZGVyIGJpdHMgbWFya2VkIGFzIG5vdAorICogc2lnbmlmaWNhbnQgaW4gYSBQTkcgd2l0aCB0aGUgc0JJVCBjaHVuay4KKyAqCisgKiBUaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzLCBmb3IgZWFjaCB0cmFuc2Zvcm0sIHRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIGl0CisgKiBpcyBleHBlY3RlZCB0byBkbyBhbnl0aGluZy4gIENvbmRpdGlvbnMgYXJlIGRlZmluZWQgYXMgZm9sbG93czoKKyAqCisgKiAxKSBDb2xvciBtYXNrIGJpdHMgcmVxdWlyZWQgLSBzaW1wbHkgYSBtYXNrIHRvIEFORCB3aXRoIGNvbG9yX3R5cGU7IG9uZSBvZgorICogICAgdGhlc2UgbXVzdCBiZSBwcmVzZW50IGZvciB0aGUgdHJhbnNmb3JtIHRvIGZpcmUsIGV4Y2VwdCB0aGF0IDAgbWVhbnMKKyAqICAgICdhbHdheXMnLgorICogMikgQ29sb3IgbWFzayBiaXRzIHdoaWNoIG11c3QgYmUgYWJzZW50IC0gYW5vdGhlciBtYXNrIC0gbm9uZSBvZiB0aGVzZSBtdXN0CisgKiAgICBiZSBwcmVzZW50LgorICogMykgQml0IGRlcHRocyAtIGEgbWFzayBvZiBjb21wb25lbnQgYml0IGRlcHRocyBmb3IgdGhlIHRyYW5zZm9ybSB0byBmaXJlLgorICogNCkgJ3JlYWQnIC0gdGhlIHRyYW5zZm9ybSB3b3JrcyBpbiBwbmdfcmVhZF9wbmcuCisgKiA1KSAnd3JpdGUnIC0gdGhlIHRyYW5zZm9ybSB3b3JrcyBpbiBwbmdfd3JpdGVfcG5nLgorICogNikgUE5HX0lORk9fY2h1bms7IGEgbWFzayBvZiB0aGUgY2h1bmtzIHRoYXQgbXVzdCBiZSBwcmVzZW50IGZvciB0aGUKKyAqICAgIHRyYW5zZm9ybSB0byBmaXJlLiAgQWxsIG11c3QgYmUgcHJlc2VudCAtIHRoZSByZXF1aXJlbWVudCBpcyB0aGF0CisgKiAgICBwbmdfZ2V0X3ZhbGlkKCkgJiBtYXNrID09IG1hc2ssIHNvIGlmIG1hc2sgaXMgMCB0aGVyZSBpcyBubyByZXF1aXJlbWVudC4KKyAqCisgKiBUaGUgY29uZGl0aW9uIHJlZmVycyB0byB0aGUgb3JpZ2luYWwgaW1hZ2Ugc3RhdGUgLSBpZiBtdWx0aXBsZSB0cmFuc2Zvcm1zIGFyZQorICogdXNlZCB0b2dldGhlciBpdCBpcyBwb3NzaWJsZSB0byBjYXVzZSBhIHRyYW5zZm9ybSB0aGF0IHdvdWxkbid0IGZpcmUgb24gdGhlCisgKiBvcmlnaW5hbCBpbWFnZSB0byBmaXJlLgorICovCitzdGF0aWMgc3RydWN0IHRyYW5zZm9ybV9pbmZvCit7CisgICBjb25zdCBjaGFyICpuYW1lOworICAgaW50ICAgICAgICAgdHJhbnNmb3JtOworICAgcG5nX3VpbnRfMzIgdmFsaWRfY2h1bmtzOworIyAgICAgZGVmaW5lIENIVU5LX05PTkUgMAorIyAgICAgZGVmaW5lIENIVU5LX3NCSVQgUE5HX0lORk9fc0JJVAorIyAgICAgZGVmaW5lIENIVU5LX3RSTlMgUE5HX0lORk9fdFJOUworICAgcG5nX2J5dGUgICAgY29sb3JfbWFza19yZXF1aXJlZDsKKyAgIHBuZ19ieXRlICAgIGNvbG9yX21hc2tfYWJzZW50OworIyAgICAgZGVmaW5lIENPTE9SX01BU0tfWCAgIDAKKyMgICAgIGRlZmluZSBDT0xPUl9NQVNLX1AgICBQTkdfQ09MT1JfTUFTS19QQUxFVFRFCisjICAgICBkZWZpbmUgQ09MT1JfTUFTS19DICAgUE5HX0NPTE9SX01BU0tfQ09MT1IKKyMgICAgIGRlZmluZSBDT0xPUl9NQVNLX0EgICBQTkdfQ09MT1JfTUFTS19BTFBIQQorIyAgICAgZGVmaW5lIENPTE9SX01BU0tfQUxMIChQQUxFVFRFK0NPTE9SK0FMUEhBKSAgLyogYWJzZW50ID0gZ3JheSwgbm8gYWxwaGEgKi8KKyAgIHBuZ19ieXRlICAgIGJpdF9kZXB0aHM7CisjICAgICBkZWZpbmUgQkRfQUxMICAoMSArIDIgKyA0ICsgOCArIDE2KQorIyAgICAgZGVmaW5lIEJEX1BBTCAgKDEgKyAyICsgNCArIDgpCisjICAgICBkZWZpbmUgQkRfTE9XICAoMSArIDIgKyA0KQorIyAgICAgZGVmaW5lIEJEXzE2ICAgMTYKKyMgICAgIGRlZmluZSBCRF9UUlVFICg4KzE2KSAvKiBpLmUuIHRydWUtY29sb3IgZGVwdGhzICovCisgICBwbmdfYnl0ZSAgICB3aGVuOworIyAgICAgZGVmaW5lIFRSQU5TRk9STV9SICAxCisjICAgICBkZWZpbmUgVFJBTlNGT1JNX1cgIDIKKyMgICAgIGRlZmluZSBUUkFOU0ZPUk1fUlcgMworICAgcG5nX2J5dGUgICAgdGVzdGVkOyAvKiB0aGUgdHJhbnNmb3JtIHdhcyB0ZXN0ZWQgc29tZXdoZXJlICovCit9IHRyYW5zZm9ybV9pbmZvW10gPQoreworICAgLyogTGlzdCBBTEwgdGhlIFBOR19UUkFOU0ZPUk1fIG1hY3JvcyBoZXJlLiAgQ2hlY2sgZm9yIHN1cHBvcnQgdXNpbmcgdGhlIFJFQUQKKyAgICAqIG1hY3JvczsgZXZlbiBpZiB0aGUgdHJhbnNmb3JtIGlzIHN1cHBvcnRlZCBvbiB3cml0ZSBpdCBjYW5ub3QgYmUgdGVzdGVkCisgICAgKiB3aXRob3V0IHRoZSByZWFkIHN1cHBvcnQuCisgICAgKi8KKyMgIGRlZmluZSBUKG5hbWUsY2h1bmssY21fcmVxdWlyZWQsY21fYWJzZW50LGJkLHdoZW4pXAorICAgeyAgI25hbWUsIFBOR19UUkFOU0ZPUk1fICMjIG5hbWUsIENIVU5LXyAjIyBjaHVuayxcCisgICAgICBDT0xPUl9NQVNLXyAjIyBjbV9yZXF1aXJlZCwgQ09MT1JfTUFTS18gIyMgY21fYWJzZW50LCBCRF8gIyMgYmQsXAorICAgICAgVFJBTlNGT1JNXyAjIyB3aGVuLCAwLyohdGVzdGVkKi8gfQorCisjaWZkZWYgUE5HX1JFQURfU1RSSVBfMTZfVE9fOF9TVVBQT1JURUQKKyAgIFQoU1RSSVBfMTYsICAgICAgICAgICAgTk9ORSwgWCwgICBYLCAgIDE2LCAgUiksCisgICAgICAvKiBkcm9wcyB0aGUgYm90dG9tIDggYml0cyB3aGVuIGJpdCBkZXB0aCBpcyAxNiAqLworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfU1RSSVBfQUxQSEFfU1VQUE9SVEVECisgICBUKFNUUklQX0FMUEhBLCAgICAgICAgIE5PTkUsIEEsICAgWCwgIEFMTCwgIFIpLAorICAgICAgLyogcmVtb3ZlcyB0aGUgYWxwaGEgY2hhbm5lbCBpZiBwcmVzZW50ICovCisjZW5kaWYKKyNpZmRlZiBQTkdfV1JJVEVfUEFDS19TVVBQT1JURUQKKyMgIGRlZmluZSBUUkFOU0ZPUk1fUldfUEFDSyBUUkFOU0ZPUk1fUlcKKyNlbHNlCisjICBkZWZpbmUgVFJBTlNGT1JNX1JXX1BBQ0sgVFJBTlNGT1JNX1IKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX1BBQ0tfU1VQUE9SVEVECisgICBUKFBBQ0tJTkcsICAgICAgICAgICAgIE5PTkUsIFgsICAgWCwgIExPVywgUldfUEFDSyksCisgICAgICAvKiB1bnBhY2tzIGxvdy1iaXQtZGVwdGggY29tcG9uZW50cyBpbnRvIDEgYnl0ZSBwZXIgY29tcG9uZW50IG9uIHJlYWQsCisgICAgICAgKiByZXZlcnNlcyB0aGlzIG9uIHdyaXRlLgorICAgICAgICovCisjZW5kaWYKKyNpZmRlZiBQTkdfV1JJVEVfUEFDS1NXQVBfU1VQUE9SVEVECisjICBkZWZpbmUgVFJBTlNGT1JNX1JXX1BBQ0tTV0FQIFRSQU5TRk9STV9SVworI2Vsc2UKKyMgIGRlZmluZSBUUkFOU0ZPUk1fUldfUEFDS1NXQVAgVFJBTlNGT1JNX1IKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRAorICAgVChQQUNLU1dBUCwgICAgICAgICAgICBOT05FLCBYLCAgIFgsICBMT1csIFJXX1BBQ0tTV0FQKSwKKyAgICAgIC8qIHJldmVyc2VzIHRoZSBvcmRlciBvZiBsb3ctYml0LWRlcHRoIGNvbXBvbmVudHMgcGFja2VkIGludG8gYSBieXRlICovCisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVECisgICBUKEVYUEFORCwgICAgICAgICAgICAgIE5PTkUsIFAsICAgWCwgIEFMTCwgIFIpLAorICAgICAgLyogZXhwYW5kcyBQTFRFIFBORyBmaWxlcyB0byBSR0IgKG5vIHRSTlMpIG9yIFJHQkEgKHRSTlMpICoKKyAgICAgICAqIE5vdGUgdGhhdCB0aGUgJ0VYUEFORCcgdHJhbnNmb3JtIGRvZXMgbG90cyBvZiBkaWZmZXJlbnQgdGhpbmdzOiAqLworICAgVChFWFBBTkQsICAgICAgICAgICAgICBOT05FLCBYLCAgIEMsICBBTEwsICBSKSwKKyAgICAgIC8qIGV4cGFuZHMgZ3JheXNjYWxlIFBORyBmaWxlcyB0byBSR0IsIG9yIFJHQkEgKi8KKyAgIFQoRVhQQU5ELCAgICAgICAgICAgICAgdFJOUywgWCwgICBBLCAgQUxMLCAgUiksCisgICAgICAvKiBleHBhbmRzIHRoZSB0Uk5TIGNodW5rIGluIGZpbGVzIHdpdGhvdXQgYWxwaGEgKi8KKyNlbmRpZgorI2lmZGVmIFBOR19XUklURV9JTlZFUlRfU1VQUE9SVEVECisjICBkZWZpbmUgVFJBTlNGT1JNX1JXX0lOVkVSVCBUUkFOU0ZPUk1fUlcKKyNlbHNlCisjICBkZWZpbmUgVFJBTlNGT1JNX1JXX0lOVkVSVCBUUkFOU0ZPUk1fUgorI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfSU5WRVJUX1NVUFBPUlRFRAorICAgVChJTlZFUlRfTU9OTywgICAgICAgICBOT05FLCBYLCAgIEMsICBBTEwsIFJXX0lOVkVSVCksCisgICAgICAvKiBjb252ZXJ0cyBncmF5LXNjYWxlIGNvbXBvbmVudHMgdG8gMS4uMCBmcm9tIDAuLjEgKi8KKyNlbmRpZgorI2lmZGVmIFBOR19XUklURV9TSElGVF9TVVBQT1JURUQKKyMgIGRlZmluZSBUUkFOU0ZPUk1fUldfU0hJRlQgVFJBTlNGT1JNX1JXCisjZWxzZQorIyAgZGVmaW5lIFRSQU5TRk9STV9SV19TSElGVCBUUkFOU0ZPUk1fUgorI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfU0hJRlRfU1VQUE9SVEVECisgICBUKFNISUZULCAgICAgICAgICAgICAgIHNCSVQsIFgsICAgWCwgIEFMTCwgUldfU0hJRlQpLAorICAgICAgLyogcmVkdWNlcyBjb21wb25lbnQgdmFsdWVzIHRvIHRoZSBvcmlnaW5hbCByYW5nZSBiYXNlZCBvbiB0aGUgc0JJVCBjaHVuaywKKyAgICAgICAqIHRoaXMgaXMgb25seSBwYXJ0aWFsbHkgcmV2ZXJzaWJsZSAtIHRoZSBsb3cgYml0cyBhcmUgbG9zdCBhbmQgY2Fubm90IGJlCisgICAgICAgKiByZWNvdmVyZWQgb24gd3JpdGUuICBJbiBmYWN0IHdyaXRlIGNvZGUgcmVwbGljYXRlcyB0aGUgYml0cyB0byBnZW5lcmF0ZQorICAgICAgICogbmV3IGxvdy1vcmRlciBiaXRzLgorICAgICAgICovCisjZW5kaWYKKyNpZmRlZiBQTkdfV1JJVEVfQkdSX1NVUFBPUlRFRAorIyAgZGVmaW5lIFRSQU5TRk9STV9SV19CR1IgVFJBTlNGT1JNX1JXCisjZWxzZQorIyAgZGVmaW5lIFRSQU5TRk9STV9SV19CR1IgVFJBTlNGT1JNX1IKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX0JHUl9TVVBQT1JURUQKKyAgIFQoQkdSLCAgICAgICAgICAgICAgICAgTk9ORSwgQywgICBQLCBUUlVFLCBSV19CR1IpLAorICAgICAgLyogcmV2ZXJzZXMgdGhlIHJnYiBjb21wb25lbnQgdmFsdWVzIG9mIHRydWUtY29sb3IgcGl4ZWxzICovCisjZW5kaWYKKyNpZmRlZiBQTkdfV1JJVEVfU1dBUF9BTFBIQV9TVVBQT1JURUQKKyMgIGRlZmluZSBUUkFOU0ZPUk1fUldfU1dBUF9BTFBIQSBUUkFOU0ZPUk1fUlcKKyNlbHNlCisjICBkZWZpbmUgVFJBTlNGT1JNX1JXX1NXQVBfQUxQSEEgVFJBTlNGT1JNX1IKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX1NXQVBfQUxQSEFfU1VQUE9SVEVECisgICBUKFNXQVBfQUxQSEEsICAgICAgICAgIE5PTkUsIEEsICAgWCwgVFJVRSwgUldfU1dBUF9BTFBIQSksCisgICAgICAvKiBzd2FwcyB0aGUgYWxwaGEgY2hhbm5lbCBvZiBSR0JBIG9yIEdBIHBpeGVscyB0byB0aGUgZnJvbnQgLSBBUkdCIG9yCisgICAgICAgKiBBRywgb24gd3JpdGUgcmV2ZXJzZXMgdGhlIHByb2Nlc3MuCisgICAgICAgKi8KKyNlbmRpZgorI2lmZGVmIFBOR19XUklURV9TV0FQX1NVUFBPUlRFRAorIyAgZGVmaW5lIFRSQU5TRk9STV9SV19TV0FQIFRSQU5TRk9STV9SVworI2Vsc2UKKyMgIGRlZmluZSBUUkFOU0ZPUk1fUldfU1dBUCBUUkFOU0ZPUk1fUgorI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfU1dBUF9TVVBQT1JURUQKKyAgIFQoU1dBUF9FTkRJQU4sICAgICAgICAgTk9ORSwgWCwgICBQLCAgIDE2LCBSV19TV0FQKSwKKyAgICAgIC8qIGJ5dGUtc3dhcHMgMTYtYml0IGNvbXBvbmVudCB2YWx1ZXMgKi8KKyNlbmRpZgorI2lmZGVmIFBOR19XUklURV9JTlZFUlRfQUxQSEFfU1VQUE9SVEVECisjICBkZWZpbmUgVFJBTlNGT1JNX1JXX0lOVkVSVF9BTFBIQSBUUkFOU0ZPUk1fUlcKKyNlbHNlCisjICBkZWZpbmUgVFJBTlNGT1JNX1JXX0lOVkVSVF9BTFBIQSBUUkFOU0ZPUk1fUgorI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRAorICAgVChJTlZFUlRfQUxQSEEsICAgICAgICBOT05FLCBBLCAgIFgsIFRSVUUsIFJXX0lOVkVSVF9BTFBIQSksCisgICAgICAvKiBjb252ZXJ0cyBhbiBhbHBoYSBjaGFubmVsIGZyb20gMC4uMSB0byAxLi4wICovCisjZW5kaWYKKyNpZmRlZiBQTkdfV1JJVEVfRklMTEVSX1NVUFBPUlRFRAorICAgVChTVFJJUF9GSUxMRVJfQkVGT1JFLCBOT05FLCBBLCAgIFAsIFRSVUUsICBXKSwgLyogJ0EnIGZvciBhIGZpbGxlciEgKi8KKyAgICAgIC8qIG9uIHdyaXRlIHNraXBzIGEgbGVhZGluZyBmaWxsZXIgY2hhbm5lbDsgdGVzdGluZyByZXF1aXJlcyBkYXRhIHdpdGggYQorICAgICAgICogZmlsbGVyIGNoYW5uZWwgc28gdGhpcyBpcyBwcm9kdWNlZCBmcm9tIFJHQkEgb3IgR0EgaW1hZ2VzIGJ5IHJlbW92aW5nCisgICAgICAgKiB0aGUgJ2FscGhhJyBmbGFnIGZyb20gdGhlIGNvbG9yIHR5cGUgaW4gcGxhY2UuCisgICAgICAgKi8KKyAgIFQoU1RSSVBfRklMTEVSX0FGVEVSLCAgTk9ORSwgQSwgICBQLCBUUlVFLCAgVyksCisgICAgICAvKiBvbiB3cml0ZSBzdHJpcHMgYSB0cmFpbGluZyBmaWxsZXIgY2hhbm5lbCAqLworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfR1JBWV9UT19SR0JfU1VQUE9SVEVECisgICBUKEdSQVlfVE9fUkdCLCAgICAgICAgIE5PTkUsIFgsICAgQywgIEFMTCwgIFIpLAorICAgICAgLyogZXhwYW5kcyBncmF5c2NhbGUgaW1hZ2VzIHRvIFJHQiwgYWxzbyBjYXVzZXMgdGhlIHBhbGV0dGUgcGFydCBvZgorICAgICAgICogJ0VYUEFORCcgdG8gaGFwcGVuLiAgTG93IGJpdCBkZXB0aCBncmF5c2NhbGUgaW1hZ2VzIGFyZSBleHBhbmRlZCB0bworICAgICAgICogOC1iaXRzIHBlciBjb21wb25lbnQgYW5kIG5vIGF0dGVtcHQgaXMgbWFkZSB0byBjb252ZXJ0IHRoZSBpbWFnZSB0byBhCisgICAgICAgKiBwYWxldHRlIGltYWdlLiAgV2hpbGUgdGhpcyB0cmFuc2Zvcm0gaXMgcGFydGlhbGx5IHJldmVyc2libGUKKyAgICAgICAqIHBuZ193cml0ZV9wbmcgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgdGhpcy4KKyAgICAgICAqLworICAgVChHUkFZX1RPX1JHQiwgICAgICAgICBOT05FLCBQLCAgIFgsICBBTEwsICBSKSwKKyAgICAgIC8qIFRoZSAncGFsZXR0ZScgc2lkZSBlZmZlY3QgbWVudGlvbmVkIGFib3ZlOyBhIGJpdCBib2d1cyBidXQgdGhpcyBpcyB0aGUKKyAgICAgICAqIHdheSB0aGUgbGlicG5nIGNvZGUgd29ya3MuCisgICAgICAgKi8KKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX0VYUEFORF8xNl9TVVBQT1JURUQKKyAgIFQoRVhQQU5EXzE2LCAgICAgICAgICAgTk9ORSwgWCwgICBYLCAgUEFMLCAgUiksCisgICAgICAvKiBleHBhbmRzIGltYWdlcyB0byAxNi1iaXRzIHBlciBjb21wb25lbnQsIGFzIGEgc2lkZSBlZmZlY3QgZXhwYW5kcworICAgICAgICogcGFsZXR0ZSBpbWFnZXMgdG8gUkdCIGFuZCBleHBhbmRzIHRoZSB0Uk5TIGNodW5rIGlmIHByZXNlbnQsIHNvIGl0IGNhbgorICAgICAgICogbW9kaWZ5IDE2LWJpdCBwZXIgY29tcG9uZW50IGltYWdlcyBhcyB3ZWxsOgorICAgICAgICovCisgICBUKEVYUEFORF8xNiwgICAgICAgICAgIHRSTlMsIFgsICAgQSwgICAxNiwgIFIpLAorICAgICAgLyogc2lkZSBlZmZlY3Qgb2YgRVhQQU5EXzE2IC0gZXhwYW5kcyB0aGUgdFJOUyBjaHVuayBpbiBhbiBSR0Igb3IgRyAxNi1iaXQKKyAgICAgICAqIGltYWdlLgorICAgICAgICovCisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9TQ0FMRV8xNl9UT184X1NVUFBPUlRFRAorICAgVChTQ0FMRV8xNiwgICAgICAgICAgICBOT05FLCBYLCAgIFgsICAgMTYsICBSKSwKKyAgICAgIC8qIHNjYWxlcyAxNi1iaXQgY29tcG9uZW50cyB0byA4LWJpdHMuICovCisjZW5kaWYKKworICAgeyBOVUxMIC8qbmFtZSovLCAwLCAwLCAwLCAwLCAwLCAwLCAwLyohdGVzdGVkKi8gfQorCisjdW5kZWYgVAorfTsKKworI2RlZmluZSBBUlJBWV9TSVpFKGEpICgoc2l6ZW9mIGEpLyhzaXplb2YgYVswXSkpCisjZGVmaW5lIFRUQUJMRV9TSVpFIEFSUkFZX1NJWkUodHJhbnNmb3JtX2luZm8pCisKKy8qIFNvbWUgY29tYmluYXRpb25zIG9mIG9wdGlvbnMgdGhhdCBzaG91bGQgYmUgcmV2ZXJzaWJsZSBhcmUgbm90OyB0aGVzZSBjYXNlcworICogYXJlIGJ1Z3MuCisgKi8KK3N0YXRpYyBpbnQga25vd25fYmFkX2NvbWJvc1tdWzJdID0KK3sKKyAgIC8qIHByb2JsZW0sIGFudGlkb3RlICovCisgICB7IFBOR19UUkFOU0ZPUk1fU0hJRlQgfCBQTkdfVFJBTlNGT1JNX0lOVkVSVF9BTFBIQSwgMC8qYW50aWRvdGUqLyB9Cit9OworCitzdGF0aWMgaW50Citpc19jb21ibyhpbnQgdHJhbnNmb3JtcykKK3sKKyAgIHJldHVybiB0cmFuc2Zvcm1zICYgKHRyYW5zZm9ybXMtMSk7IC8qIG5vbi16ZXJvIGlmIG1vcmUgdGhhbiBvbmUgc2V0IGJpdCAqLworfQorCitzdGF0aWMgaW50CitmaXJzdF90cmFuc2Zvcm0oaW50IHRyYW5zZm9ybXMpCit7CisgICByZXR1cm4gdHJhbnNmb3JtcyAmIC10cmFuc2Zvcm1zOyAvKiBsb3dlc3Qgc2V0IGJpdCAqLworfQorCitzdGF0aWMgaW50Citpc19iYWRfY29tYm8oaW50IHRyYW5zZm9ybXMpCit7CisgICB1bnNpZ25lZCBpbnQgaTsKKworICAgZm9yIChpPTA7IGk8QVJSQVlfU0laRShrbm93bl9iYWRfY29tYm9zKTsgKytpKQorICAgeworICAgICAgaW50IGNvbWJvID0ga25vd25fYmFkX2NvbWJvc1tpXVswXTsKKworICAgICAgaWYgKChjb21ibyAmIHRyYW5zZm9ybXMpID09IGNvbWJvICYmCisgICAgICAgICAodHJhbnNmb3JtcyAmIGtub3duX2JhZF9jb21ib3NbaV1bMV0pID09IDApCisgICAgICAgICByZXR1cm4gMTsKKyAgIH0KKworICAgcmV0dXJuIDA7IC8qIGNvbWJvIGlzIG9rICovCit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3RyYW5zZm9ybV9uYW1lKGludCB0KQorICAgLyogVGhlIG5hbWUsIGlmICd0JyBoYXMgbXVsdGlwbGUgYml0cyBzZXQgdGhlIG5hbWUgb2YgdGhlIGxvd2VzdCBzZXQgYml0IGlzCisgICAgKiByZXR1cm5lZC4KKyAgICAqLworeworICAgdW5zaWduZWQgaW50IGk7CisKKyAgIHQgJj0gLXQ7IC8qIGZpcnN0IHNldCBiaXQgKi8KKworICAgZm9yIChpPTA7IGk8VFRBQkxFX1NJWkU7ICsraSkgaWYgKHRyYW5zZm9ybV9pbmZvW2ldLm5hbWUgIT0gTlVMTCkKKyAgIHsKKyAgICAgIGlmICgodHJhbnNmb3JtX2luZm9baV0udHJhbnNmb3JtICYgdCkgIT0gMCkKKyAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1faW5mb1tpXS5uYW1lOworICAgfQorCisgICByZXR1cm4gImludmFsaWQgdHJhbnNmb3JtIjsKK30KKworLyogVmFyaWFibGVzIGNhbGN1bGF0ZWQgYnkgdmFsaWRhdGVfVCBiZWxvdyBhbmQgdXNlZCB0byByZWNvcmQgYWxsIHRoZSBzdXBwb3J0ZWQKKyAqIHRyYW5zZm9ybXMuICBOZWVkICh1bnNpZ25lZCBpbnQpIGhlcmUgYmVjYXVzZSBvZiB0aGUgcGxhY2VzIHdoZXJlIHRoZXNlCisgKiB2YWx1ZXMgYXJlIHVzZWQgKHVuc2lnbmVkIGNvbXBhcmVzIGluIHRoZSAnZXhoYXVzdGl2ZScgaXRlcmF0b3IuKQorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHJlYWRfdHJhbnNmb3Jtcywgd3JpdGVfdHJhbnNmb3JtcywgcndfdHJhbnNmb3JtczsKKworc3RhdGljIHZvaWQKK3ZhbGlkYXRlX1Qodm9pZCkKKyAgIC8qIFZhbGlkYXRlIHRoZSBhYm92ZSB0YWJsZSAtIHRoaXMganVzdCBidWlsZHMgdGhlIGFib3ZlIHZhbHVlcyAqLworeworICAgdW5zaWduZWQgaW50IGk7CisKKyAgIGZvciAoaT0wOyBpPFRUQUJMRV9TSVpFOyArK2kpIGlmICh0cmFuc2Zvcm1faW5mb1tpXS5uYW1lICE9IE5VTEwpCisgICB7CisgICAgICBpZiAodHJhbnNmb3JtX2luZm9baV0ud2hlbiAmIFRSQU5TRk9STV9SKQorICAgICAgICAgcmVhZF90cmFuc2Zvcm1zIHw9IHRyYW5zZm9ybV9pbmZvW2ldLnRyYW5zZm9ybTsKKworICAgICAgaWYgKHRyYW5zZm9ybV9pbmZvW2ldLndoZW4gJiBUUkFOU0ZPUk1fVykKKyAgICAgICAgIHdyaXRlX3RyYW5zZm9ybXMgfD0gdHJhbnNmb3JtX2luZm9baV0udHJhbnNmb3JtOworICAgfQorCisgICAvKiBSZXZlcnNpYmxlIHRyYW5zZm9ybXMgYXJlIHRob3NlIHdoaWNoIGFyZSBzdXBwb3J0ZWQgb24gYm90aCByZWFkIGFuZAorICAgICogd3JpdGUuCisgICAgKi8KKyAgIHJ3X3RyYW5zZm9ybXMgPSByZWFkX3RyYW5zZm9ybXMgJiB3cml0ZV90cmFuc2Zvcm1zOworfQorCisvKiBGSUxFIERBVEEgSEFORExJTkcKKyAqICAgIFRoZSBvcmlnaW5hbCBmaWxlIGlzIGNhY2hlZCBpbiBtZW1vcnkuICBEdXJpbmcgd3JpdGUgdGhlIG91dHB1dCBmaWxlIGlzCisgKiAgICB3cml0dGVuIHRvIG1lbW9yeS4KKyAqCisgKiAgICBJbiBib3RoIGNhc2VzIHRoZSBmaWxlIGRhdGEgaXMgaGVsZCBpbiBhIGxpbmtlZCBsaXN0IG9mIGJ1ZmZlcnMgLSBub3QgYWxsCisgKiAgICBvZiB0aGVzZSBhcmUgaW4gdXNlIGF0IGFueSB0aW1lLgorICovCisjZGVmaW5lIE5FVyh0eXBlKSAoKHR5cGUgKiltYWxsb2Moc2l6ZW9mICh0eXBlKSkpCisjZGVmaW5lIERFTEVURShwdHIpIChmcmVlKHB0cikpCisKK3N0cnVjdCBidWZmZXJfbGlzdAoreworICAgc3RydWN0IGJ1ZmZlcl9saXN0ICpuZXh0OyAgICAgICAgIC8qIG5leHQgYnVmZmVyIGluIGxpc3QgKi8KKyAgIHBuZ19ieXRlICAgICAgICAgICAgYnVmZmVyWzEwMjRdOyAvKiB0aGUgYWN0dWFsIGJ1ZmZlciAqLworfTsKKworc3RydWN0IGJ1ZmZlcgoreworICAgc3RydWN0IGJ1ZmZlcl9saXN0ICAqbGFzdDsgICAgICAgLyogbGFzdCBidWZmZXIgaW4gdXNlICovCisgICBzaXplX3QgICAgICAgICAgICAgICBlbmRfY291bnQ7ICAvKiBieXRlcyBpbiB0aGUgbGFzdCBidWZmZXIgKi8KKyAgIHN0cnVjdCBidWZmZXJfbGlzdCAgKmN1cnJlbnQ7ICAgIC8qIGN1cnJlbnQgYnVmZmVyIGJlaW5nIHJlYWQgKi8KKyAgIHNpemVfdCAgICAgICAgICAgICAgIHJlYWRfY291bnQ7IC8qIGNvdW50IG9mIGJ5dGVzIHJlYWQgZnJvbSBjdXJyZW50ICovCisgICBzdHJ1Y3QgYnVmZmVyX2xpc3QgICBmaXJzdDsgICAgICAvKiB0aGUgdmVyeSBmaXJzdCBidWZmZXIgKi8KK307CisKK3N0YXRpYyB2b2lkCitidWZmZXJfaW5pdChzdHJ1Y3QgYnVmZmVyICpidWZmZXIpCisgICAvKiBDYWxsIHRoaXMgb25seSBvbmNlIGZvciBhIGdpdmVuIGJ1ZmZlciAqLworeworICAgYnVmZmVyLT5maXJzdC5uZXh0ID0gTlVMTDsKKyAgIGJ1ZmZlci0+bGFzdCA9IE5VTEw7CisgICBidWZmZXItPmN1cnJlbnQgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorYnVmZmVyX2Rlc3Ryb3lfbGlzdChzdHJ1Y3QgYnVmZmVyX2xpc3QgKmxpc3QpCit7CisgICBpZiAobGlzdCAhPSBOVUxMKQorICAgeworICAgICAgc3RydWN0IGJ1ZmZlcl9saXN0ICpuZXh0ID0gbGlzdC0+bmV4dDsKKyAgICAgIERFTEVURShsaXN0KTsKKyAgICAgIGJ1ZmZlcl9kZXN0cm95X2xpc3QobmV4dCk7CisgICB9Cit9CisKK3N0YXRpYyB2b2lkCitidWZmZXJfZGVzdHJveShzdHJ1Y3QgYnVmZmVyICpidWZmZXIpCit7CisgICBzdHJ1Y3QgYnVmZmVyX2xpc3QgKmxpc3QgPSBidWZmZXItPmZpcnN0Lm5leHQ7CisgICBidWZmZXJfaW5pdChidWZmZXIpOworICAgYnVmZmVyX2Rlc3Ryb3lfbGlzdChsaXN0KTsKK30KKworI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKK3N0YXRpYyB2b2lkCitidWZmZXJfc3RhcnRfd3JpdGUoc3RydWN0IGJ1ZmZlciAqYnVmZmVyKQoreworICAgYnVmZmVyLT5sYXN0ID0gJmJ1ZmZlci0+Zmlyc3Q7CisgICBidWZmZXItPmVuZF9jb3VudCA9IDA7CisgICBidWZmZXItPmN1cnJlbnQgPSBOVUxMOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitidWZmZXJfc3RhcnRfcmVhZChzdHJ1Y3QgYnVmZmVyICpidWZmZXIpCit7CisgICBidWZmZXItPmN1cnJlbnQgPSAmYnVmZmVyLT5maXJzdDsKKyAgIGJ1ZmZlci0+cmVhZF9jb3VudCA9IDA7Cit9CisKKyNpZmRlZiBFTk9NRU0gLyogcmVxdWlyZWQgYnkgUE9TSVggMTAwMy4xICovCisjICBkZWZpbmUgTUVNT1JZIEVOT01FTQorI2Vsc2UKKyMgIGRlZmluZSBNRU1PUlkgRVJBTkdFIC8qIHJlcXVpcmVkIGJ5IEFOU0ktQyAqLworI2VuZGlmCitzdGF0aWMgc3RydWN0IGJ1ZmZlciAqCitnZXRfYnVmZmVyKHBuZ19zdHJ1Y3RwIHBwKQorICAgLyogVXNlZCBmcm9tIGxpYnBuZyBjYWxsYmFja3MgdG8gZ2V0IHRoZSBjdXJyZW50IGJ1ZmZlciAqLworeworICAgcmV0dXJuIChzdHJ1Y3QgYnVmZmVyKilwbmdfZ2V0X2lvX3B0cihwcCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2xpc3QgKgorYnVmZmVyX2V4dGVuZChzdHJ1Y3QgYnVmZmVyX2xpc3QgKmN1cnJlbnQpCit7CisgICBzdHJ1Y3QgYnVmZmVyX2xpc3QgKmFkZDsKKworICAgYXNzZXJ0KGN1cnJlbnQtPm5leHQgPT0gTlVMTCk7CisKKyAgIGFkZCA9IE5FVyhzdHJ1Y3QgYnVmZmVyX2xpc3QpOworICAgaWYgKGFkZCA9PSBOVUxMKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIGFkZC0+bmV4dCA9IE5VTEw7CisgICBjdXJyZW50LT5uZXh0ID0gYWRkOworCisgICByZXR1cm4gYWRkOworfQorCisvKiBMb2FkIGEgYnVmZmVyIGZyb20gYSBmaWxlOyBkb2VzIHRoZSBlcXVpdmFsZW50IG9mIGJ1ZmZlcl9zdGFydF93cml0ZS4gIE9uIGEKKyAqIHJlYWQgZXJyb3IgcmV0dXJucyBhbiBlcnJubyB2YWx1ZSwgZWxzZSByZXR1cm5zIDAuCisgKi8KK3N0YXRpYyBpbnQKK2J1ZmZlcl9mcm9tX2ZpbGUoc3RydWN0IGJ1ZmZlciAqYnVmZmVyLCBGSUxFICpmcCkKK3sKKyAgIHN0cnVjdCBidWZmZXJfbGlzdCAqbGFzdCA9ICZidWZmZXItPmZpcnN0OworICAgc2l6ZV90IGNvdW50ID0gMDsKKworICAgZm9yICg7OykKKyAgIHsKKyAgICAgIHNpemVfdCByID0gZnJlYWQobGFzdC0+YnVmZmVyK2NvdW50LCAxLypzaXplKi8sCisgICAgICAgICAoc2l6ZW9mIGxhc3QtPmJ1ZmZlciktY291bnQsIGZwKTsKKworICAgICAgaWYgKHIgPiAwKQorICAgICAgeworICAgICAgICAgY291bnQgKz0gcjsKKworICAgICAgICAgaWYgKGNvdW50ID49IHNpemVvZiBsYXN0LT5idWZmZXIpCisgICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQoY291bnQgPT0gc2l6ZW9mIGxhc3QtPmJ1ZmZlcik7CisgICAgICAgICAgICBjb3VudCA9IDA7CisKKyAgICAgICAgICAgIGlmIChsYXN0LT5uZXh0ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBsYXN0ID0gYnVmZmVyX2V4dGVuZChsYXN0KTsKKyAgICAgICAgICAgICAgIGlmIChsYXN0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICByZXR1cm4gTUVNT1JZOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICBsYXN0ID0gbGFzdC0+bmV4dDsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZWxzZSAvKiBmcmVhZCBmYWlsZWQgLSBwcm9iYWJseSBlbmQgb2YgZmlsZSAqLworICAgICAgeworICAgICAgICAgaWYgKGZlb2YoZnApKQorICAgICAgICAgeworICAgICAgICAgICAgYnVmZmVyLT5sYXN0ID0gbGFzdDsKKyAgICAgICAgICAgIGJ1ZmZlci0+ZW5kX2NvdW50ID0gY291bnQ7CisgICAgICAgICAgICByZXR1cm4gMDsgLyogbm8gZXJyb3IgKi8KKyAgICAgICAgIH0KKworICAgICAgICAgLyogU29tZSBraW5kIG9mIGZ1bmt5IGVycm9yOyBlcnJubyBzaG91bGQgYmUgbm9uLXplcm8gKi8KKyAgICAgICAgIHJldHVybiBlcnJubyA9PSAwID8gRVJBTkdFIDogZXJybm87CisgICAgICB9CisgICB9Cit9CisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gY29udHJvbCB0aGUgdGVzdCBvZiBhIHNpbmdsZSBmaWxlLiAqLwordHlwZWRlZiBlbnVtCit7CisgICBWRVJCT1NFLCAgICAgICAgLyogc3dpdGNoZXMgb24gYWxsIG1lc3NhZ2VzICovCisgICBJTkZPUk1BVElPTiwKKyAgIFdBUk5JTkdTLCAgICAgICAvKiBzd2l0Y2hlcyBvbiB3YXJuaW5ncyAqLworICAgTElCUE5HX1dBUk5JTkcsCisgICBBUFBfV0FSTklORywKKyAgIEVSUk9SUywgICAgICAgICAvKiBqdXN0IGVycm9ycyAqLworICAgQVBQX0ZBSUwsICAgICAgIC8qIGNvbnRpbnVhYmxlIGVycm9yIC0gbm8gbmVlZCB0byBsb25nam1wICovCisgICBMSUJQTkdfRVJST1IsICAgLyogdGhpcyBhbmQgaGlnaGVyIGNhdXNlIGEgbG9uZ2ptcCAqLworICAgTElCUE5HX0JVRywgICAgIC8qIGVycm9uZW91cyBiZWhhdmlvciBpbiBsaWJwbmcgKi8KKyAgIEFQUF9FUlJPUiwgICAgICAvKiBzdWNoIGFzIG91dC1vZi1tZW1vcnkgaW4gYSBjYWxsYmFjayAqLworICAgUVVJRVQsICAgICAgICAgIC8qIG5vIG5vcm1hbCBtZXNzYWdlcyAqLworICAgVVNFUl9FUlJPUiwgICAgIC8qIHN1Y2ggYXMgZmlsZS1ub3QtZm91bmQgKi8KKyAgIElOVEVSTkFMX0VSUk9SCit9IGVycm9yX2xldmVsOworI2RlZmluZSBMRVZFTF9NQVNLICAgICAgMHhmICAgLyogd2hlcmUgdGhlIGxldmVsIGlzIGluICdvcHRpb25zJyAqLworCisjZGVmaW5lIEVYSEFVU1RJVkUgICAgICAweDAxMCAvKiBUZXN0IGFsbCBjb21iaW5hdGlvbnMgb2YgYWN0aXZlIG9wdGlvbnMgKi8KKyNkZWZpbmUgU1RSSUNUICAgICAgICAgIDB4MDIwIC8qIEZhaWwgb24gd2FybmluZ3MgYXMgd2VsbCBhcyBlcnJvcnMgKi8KKyNkZWZpbmUgTE9HICAgICAgICAgICAgIDB4MDQwIC8qIExvZyBwYXNzL2ZhaWwgdG8gc3Rkb3V0ICovCisjZGVmaW5lIENPTlRJTlVFICAgICAgICAweDA4MCAvKiBDb250aW51ZSBvbiBBUFBfRkFJTCBlcnJvcnMgKi8KKyNkZWZpbmUgU0tJUF9CVUdTICAgICAgIDB4MTAwIC8qIFNraXAgb3ZlciBrbm93biBidWdzICovCisjZGVmaW5lIExPR19TS0lQUEVEICAgICAweDIwMCAvKiBMb2cgc2tpcHBlZCBidWdzICovCisjZGVmaW5lIEZJTkRfQkFEX0NPTUJPUyAweDQwMCAvKiBBdHRlbXB0IHRvIGRlZHVjZSBiYWQgY29tYm9zICovCisjZGVmaW5lIExJU1RfQ09NQk9TICAgICAweDgwMCAvKiBMaXN0IGNvbWJvcyBieSBuYW1lICovCisKKy8qIFJlc3VsdCBtYXNrcyBhcHBseSB0byB0aGUgcmVzdWx0IGJpdHMgaW4gdGhlICdyZXN1bHRzJyBmaWVsZCBiZWxvdzsgdGhlc2UKKyAqIGJpdHMgYXJlIHNpbXBsZSAxVTw8ZXJyb3JfbGV2ZWwuICBBIHBhc3MgcmVxdWlyZXMgZWl0aGVyIG5vdGhpbmcgd29yc2UgdGhhbgorICogd2FybmluZ3MgKC0tcmVsYXhlcykgb3Igbm90aGluZyB3b3JzZSB0aGFuIGluZm9ybWF0aW9uICgtLXN0cmljdCkKKyAqLworI2RlZmluZSBSRVNVTFRfU1RSSUNUKHIpICAgKCgocikgJiB+KCgxVTw8V0FSTklOR1MpLTEpKSA9PSAwKQorI2RlZmluZSBSRVNVTFRfUkVMQVhFRChyKSAgKCgocikgJiB+KCgxVTw8RVJST1JTKS0xKSkgPT0gMCkKKworc3RydWN0IGRpc3BsYXkKK3sKKyAgIGptcF9idWYgICAgICAgIGVycm9yX3JldHVybjsgICAgICAvKiBXaGVyZSB0byBnbyB0byBvbiBlcnJvciAqLworCisgICBjb25zdCBjaGFyICAgICpmaWxlbmFtZTsgICAgICAgICAgLyogVGhlIG5hbWUgb2YgdGhlIG9yaWdpbmFsIGZpbGUgKi8KKyAgIGNvbnN0IGNoYXIgICAgKm9wZXJhdGlvbjsgICAgICAgICAvKiBPcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkICovCisgICBpbnQgICAgICAgICAgICB0cmFuc2Zvcm1zOyAgICAgICAgLyogVHJhbnNmb3JtIHVzZWQgaW4gb3BlcmF0aW9uICovCisgICBwbmdfdWludF8zMiAgICBvcHRpb25zOyAgICAgICAgICAgLyogU2VlIGRpc3BsYXlfbG9nIGJlbG93ICovCisgICBwbmdfdWludF8zMiAgICByZXN1bHRzOyAgICAgICAgICAgLyogQSBtYXNrIG9mIGVycm9ycyBzZWVuICovCisKKworICAgcG5nX3N0cnVjdHAgICAgb3JpZ2luYWxfcHA7ICAgICAgIC8qIHVzZWQgb24gdGhlIG9yaWdpbmFsIHJlYWQgKi8KKyAgIHBuZ19pbmZvcCAgICAgIG9yaWdpbmFsX2lwOyAgICAgICAvKiBzZXQgYnkgdGhlIG9yaWdpbmFsIHJlYWQgKi8KKworICAgcG5nX3NpemVfdCAgICAgb3JpZ2luYWxfcm93Ynl0ZXM7IC8qIG9mIHRoZSBvcmlnaW5hbCByb3dzOiAqLworICAgcG5nX2J5dGVwcCAgICAgb3JpZ2luYWxfcm93czsgICAgIC8qIGZyb20gdGhlIG9yaWdpbmFsIHJlYWQgKi8KKworICAgLyogT3JpZ2luYWwgY2h1bmtzIHZhbGlkICovCisgICBwbmdfdWludF8zMiAgICBjaHVua3M7CisKKyAgIC8qIE9yaWdpbmFsIElIRFIgaW5mb3JtYXRpb24gKi8KKyAgIHBuZ191aW50XzMyICAgIHdpZHRoOworICAgcG5nX3VpbnRfMzIgICAgaGVpZ2h0OworICAgaW50ICAgICAgICAgICAgYml0X2RlcHRoOworICAgaW50ICAgICAgICAgICAgY29sb3JfdHlwZTsKKyAgIGludCAgICAgICAgICAgIGludGVybGFjZV9tZXRob2Q7CisgICBpbnQgICAgICAgICAgICBjb21wcmVzc2lvbl9tZXRob2Q7CisgICBpbnQgICAgICAgICAgICBmaWx0ZXJfbWV0aG9kOworCisgICAvKiBEZXJpdmVkIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYWwgaW1hZ2UuICovCisgICBpbnQgICAgICAgICAgICBhY3RpdmVfdHJhbnNmb3JtczsgIC8qIHRyYW5zZm9ybXMgdGhhdCBkbyBzb21ldGhpbmcgb24gcmVhZCAqLworICAgaW50ICAgICAgICAgICAgaWdub3JlZF90cmFuc2Zvcm1zOyAvKiB0cmFuc2Zvcm1zIHRoYXQgc2hvdWxkIGRvIG5vdGhpbmcgKi8KKworICAgLyogVXNlZCBvbiBhIHJlYWQsIGJvdGggdGhlIG9yaWdpbmFsIHJlYWQgYW5kIHdoZW4gdmFsaWRhdGluZyBhIHdyaXR0ZW4KKyAgICAqIGltYWdlLgorICAgICovCisgICBwbmdfc3RydWN0cCAgICByZWFkX3BwOworICAgcG5nX2luZm9wICAgICAgcmVhZF9pcDsKKworIyAgaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAorICAgICAgLyogVXNlZCB0byB3cml0ZSBhIG5ldyBpbWFnZSAodGhlIG9yaWdpbmFsIGluZm9fcHRyIGlzIHVzZWQpICovCisgICAgICBwbmdfc3RydWN0cCAgIHdyaXRlX3BwOworICAgICAgc3RydWN0IGJ1ZmZlciB3cml0dGVuX2ZpbGU7ICAgLyogd2hlcmUgdGhlIGZpbGUgZ2V0cyB3cml0dGVuICovCisjICBlbmRpZgorCisgICBzdHJ1Y3QgYnVmZmVyICBvcmlnaW5hbF9maWxlOyAgICAgLyogRGF0YSByZWFkIGZyb20gdGhlIG9yaWdpbmFsIGZpbGUgKi8KK307CisKK3N0YXRpYyB2b2lkCitkaXNwbGF5X2luaXQoc3RydWN0IGRpc3BsYXkgKmRwKQorICAgLyogQ2FsbCB0aGlzIG9ubHkgb25jZSByaWdodCBhdCB0aGUgc3RhcnQgdG8gaW5pdGlhbGl6ZSB0aGUgY29udHJvbAorICAgICogc3RydWN0dXJlLCB0aGUgKHN0cnVjdCBidWZmZXIpIGxpc3RzIGFyZSBtYWludGFpbmVkIGFjcm9zcyBjYWxscyAtIHRoZQorICAgICogbWVtb3J5IGlzIG5vdCBmcmVlZC4KKyAgICAqLworeworICAgbWVtc2V0KGRwLCAwLCBzaXplb2YgKmRwKTsKKyAgIGRwLT5vcHRpb25zID0gV0FSTklOR1M7IC8qIGRlZmF1bHQgdG8gIXZlcmJvc2UsICFxdWlldCAqLworICAgZHAtPmZpbGVuYW1lID0gTlVMTDsKKyAgIGRwLT5vcGVyYXRpb24gPSBOVUxMOworICAgZHAtPm9yaWdpbmFsX3BwID0gTlVMTDsKKyAgIGRwLT5vcmlnaW5hbF9pcCA9IE5VTEw7CisgICBkcC0+b3JpZ2luYWxfcm93cyA9IE5VTEw7CisgICBkcC0+cmVhZF9wcCA9IE5VTEw7CisgICBkcC0+cmVhZF9pcCA9IE5VTEw7CisgICBidWZmZXJfaW5pdCgmZHAtPm9yaWdpbmFsX2ZpbGUpOworCisjICBpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECisgICAgICBkcC0+d3JpdGVfcHAgPSBOVUxMOworICAgICAgYnVmZmVyX2luaXQoJmRwLT53cml0dGVuX2ZpbGUpOworIyAgZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2Rpc3BsYXlfY2xlYW5fcmVhZChzdHJ1Y3QgZGlzcGxheSAqZHApCit7CisgICBpZiAoZHAtPnJlYWRfcHAgIT0gTlVMTCkKKyAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZkcC0+cmVhZF9wcCwgJmRwLT5yZWFkX2lwLCBOVUxMKTsKK30KKworI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKK3N0YXRpYyB2b2lkCitkaXNwbGF5X2NsZWFuX3dyaXRlKHN0cnVjdCBkaXNwbGF5ICpkcCkKK3sKKyAgICAgIGlmIChkcC0+d3JpdGVfcHAgIT0gTlVMTCkKKyAgICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmZHAtPndyaXRlX3BwLCBOVUxMKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorZGlzcGxheV9jbGVhbihzdHJ1Y3QgZGlzcGxheSAqZHApCit7CisjICBpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECisgICAgICBkaXNwbGF5X2NsZWFuX3dyaXRlKGRwKTsKKyMgIGVuZGlmCisgICBkaXNwbGF5X2NsZWFuX3JlYWQoZHApOworCisgICBkcC0+b3JpZ2luYWxfcm93Ynl0ZXMgPSAwOworICAgZHAtPm9yaWdpbmFsX3Jvd3MgPSBOVUxMOworICAgZHAtPmNodW5rcyA9IDA7CisKKyAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZkcC0+b3JpZ2luYWxfcHAsICZkcC0+b3JpZ2luYWxfaXAsIE5VTEwpOworICAgLyogbGVhdmUgdGhlIGZpbGVuYW1lIGZvciBlcnJvciBkZXRlY3Rpb24gKi8KKyAgIGRwLT5yZXN1bHRzID0gMDsgLyogcmVzZXQgZm9yIG5leHQgdGltZSAqLworfQorCitzdGF0aWMgdm9pZAorZGlzcGxheV9kZXN0cm95KHN0cnVjdCBkaXNwbGF5ICpkcCkKK3sKKyAgICAvKiBSZWxlYXNlIGFueSBtZW1vcnkgaGVsZCBpbiB0aGUgZGlzcGxheS4gKi8KKyMgIGlmZGVmIFBOR19XUklURV9TVVBQT1JURUQKKyAgICAgIGJ1ZmZlcl9kZXN0cm95KCZkcC0+d3JpdHRlbl9maWxlKTsKKyMgIGVuZGlmCisKKyAgIGJ1ZmZlcl9kZXN0cm95KCZkcC0+b3JpZ2luYWxfZmlsZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGlzcGxheSAqCitnZXRfZHAocG5nX3N0cnVjdHAgcHApCisgICAvKiBUaGUgZGlzcGxheSBwb2ludGVyIGlzIGFsd2F5cyBzdG9yZWQgaW4gdGhlIHBuZ19zdHJ1Y3QgZXJyb3IgcG9pbnRlciAqLworeworICAgc3RydWN0IGRpc3BsYXkgKmRwID0gKHN0cnVjdCBkaXNwbGF5KilwbmdfZ2V0X2Vycm9yX3B0cihwcCk7CisKKyAgIGlmIChkcCA9PSBOVUxMKQorICAgeworICAgICAgZnByaW50ZihzdGRlcnIsICJwbmdpbWFnZTogaW50ZXJuYWwgZXJyb3IgKG5vIGRpc3BsYXkpXG4iKTsKKyAgICAgIGV4aXQoOTkpOyAvKiBwcmV2ZW50cyBhIGNyYXNoICovCisgICB9CisKKyAgIHJldHVybiBkcDsKK30KKworLyogZXJyb3IgaGFuZGxpbmcgKi8KKyNpZmRlZiBfX0dOVUNfXworIyAgZGVmaW5lIFZHQVRUUiBfX2F0dHJpYnV0ZV9fKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLDMsNCkpKQorICAgLyogUmVxdWlyZWQgdG8gcXVpZXQgR05VQyB3YXJuaW5ncyB3aGVuIHRoZSBjb21waWxlciBzZWVzIGEgc3RkYXJnIGZ1bmN0aW9uCisgICAgKiB0aGF0IGNhbGxzIG9uZSBvZiB0aGUgc3RkaW8gdiBBUElzLgorICAgICovCisjZWxzZQorIyAgZGVmaW5lIFZHQVRUUgorI2VuZGlmCitzdGF0aWMgdm9pZCBWR0FUVFIKK2Rpc3BsYXlfbG9nKHN0cnVjdCBkaXNwbGF5ICpkcCwgZXJyb3JfbGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorICAgLyogJ2xldmVsJyBpcyBhcyBhYm92ZSwgZm10IGlzIGEgc3RkaW8gc3R5bGUgZm9ybWF0IHN0cmluZy4gIFRoaXMgcm91dGluZQorICAgICogZG9lcyBub3QgcmV0dXJuIGlmIGxldmVsIGlzIGFib3ZlIExJQlBOR19XQVJOSU5HCisgICAgKi8KK3sKKyAgIGRwLT5yZXN1bHRzIHw9IDFVIDw8IGxldmVsOworCisgICBpZiAobGV2ZWwgPiAoZXJyb3JfbGV2ZWwpKGRwLT5vcHRpb25zICYgTEVWRUxfTUFTSykpCisgICB7CisgICAgICBjb25zdCBjaGFyICpscDsKKyAgICAgIHZhX2xpc3QgYXA7CisKKyAgICAgIHN3aXRjaCAobGV2ZWwpCisgICAgICB7CisgICAgICAgICBjYXNlIElORk9STUFUSU9OOiAgICBscCA9ICJpbmZvcm1hdGlvbiI7IGJyZWFrOworICAgICAgICAgY2FzZSBMSUJQTkdfV0FSTklORzogbHAgPSAid2FybmluZyhsaWJwbmcpIjsgYnJlYWs7CisgICAgICAgICBjYXNlIEFQUF9XQVJOSU5HOiAgICBscCA9ICJ3YXJuaW5nKHBuZ2ltYWdlKSI7IGJyZWFrOworICAgICAgICAgY2FzZSBBUFBfRkFJTDogICAgICAgbHAgPSAiZXJyb3IoY29udGludWFibGUpIjsgYnJlYWs7CisgICAgICAgICBjYXNlIExJQlBOR19FUlJPUjogICBscCA9ICJlcnJvcihsaWJwbmcpIjsgYnJlYWs7CisgICAgICAgICBjYXNlIExJQlBOR19CVUc6ICAgICBscCA9ICJidWcobGlicG5nKSI7IGJyZWFrOworICAgICAgICAgY2FzZSBBUFBfRVJST1I6ICAgICAgbHAgPSAiZXJyb3IocG5naW1hZ2UpIjsgYnJlYWs7CisgICAgICAgICBjYXNlIFVTRVJfRVJST1I6ICAgICBscCA9ICJlcnJvcih1c2VyKSI7IGJyZWFrOworCisgICAgICAgICBjYXNlIElOVEVSTkFMX0VSUk9SOiAvKiBhbnl0aGluZyB1bmV4cGVjdGVkIGlzIGFuIGludGVybmFsIGVycm9yOiAqLworICAgICAgICAgY2FzZSBWRVJCT1NFOiBjYXNlIFdBUk5JTkdTOiBjYXNlIEVSUk9SUzogY2FzZSBRVUlFVDoKKyAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgIGxwID0gImJ1ZyhwbmdpbWFnZSkiOyBicmVhazsKKyAgICAgIH0KKworICAgICAgZnByaW50ZihzdGRlcnIsICIlczogJXM6ICVzIiwKKyAgICAgICAgIGRwLT5maWxlbmFtZSAhPSBOVUxMID8gZHAtPmZpbGVuYW1lIDogIjxzdGRpbj4iLCBscCwgZHAtPm9wZXJhdGlvbik7CisKKyAgICAgIGlmIChkcC0+dHJhbnNmb3JtcyAhPSAwKQorICAgICAgeworICAgICAgICAgaW50IHRyID0gZHAtPnRyYW5zZm9ybXM7CisKKyAgICAgICAgIGlmIChpc19jb21ibyh0cikpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAoZHAtPm9wdGlvbnMgJiBMSVNUX0NPTUJPUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGludCB0cnggPSB0cjsKKworICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIoIik7CisgICAgICAgICAgICAgICBpZiAodHJ4KQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gMDsKKworICAgICAgICAgICAgICAgICAgd2hpbGUgKHRyeCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIGludCB0cnogPSB0cnggJiAtdHJ4OworCisgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQpIGZwcmludGYoc3RkZXJyLCAiKyIpOworICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyIsIHRyYW5zZm9ybV9uYW1lKHRyeikpOworICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAxOworICAgICAgICAgICAgICAgICAgICAgdHJ4ICY9IH50cno7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiLSIpOworICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIpIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiKDB4JXgpIiwgdHIpOworICAgICAgICAgfQorCisgICAgICAgICBlbHNlCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiglcykiLCB0cmFuc2Zvcm1fbmFtZSh0cikpOworICAgICAgfQorCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIjogIik7CisKKyAgICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgICAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKKyAgICAgIHZhX2VuZChhcCk7CisKKyAgICAgIGZwdXRjKCdcbicsIHN0ZGVycik7CisgICB9CisgICAvKiBlbHNlIGRvIG5vdCBvdXRwdXQgYW55IG1lc3NhZ2UgKi8KKworICAgLyogRXJyb3JzIGNhdXNlIHRoaXMgcm91dGluZSB0byBleGl0IHRvIHRoZSBmYWlsIGNvZGUgKi8KKyAgIGlmIChsZXZlbCA+IEFQUF9GQUlMIHx8IChsZXZlbCA+IEVSUk9SUyAmJiAhKGRwLT5vcHRpb25zICYgQ09OVElOVUUpKSkKKyAgICAgIGxvbmdqbXAoZHAtPmVycm9yX3JldHVybiwgbGV2ZWwpOworfQorCisvKiBlcnJvciBoYW5kbGVyIGNhbGxiYWNrcyBmb3IgbGlicG5nICovCitzdGF0aWMgdm9pZCBQTkdDQkFQSQorZGlzcGxheV93YXJuaW5nKHBuZ19zdHJ1Y3RwIHBwLCBwbmdfY29uc3RfY2hhcnAgd2FybmluZykKK3sKKyAgIGRpc3BsYXlfbG9nKGdldF9kcChwcCksIExJQlBOR19XQVJOSU5HLCAiJXMiLCB3YXJuaW5nKTsKK30KKworc3RhdGljIHZvaWQgUE5HQ0JBUEkKK2Rpc3BsYXlfZXJyb3IocG5nX3N0cnVjdHAgcHAsIHBuZ19jb25zdF9jaGFycCBlcnJvcikKK3sKKyAgIHN0cnVjdCBkaXNwbGF5ICpkcCA9IGdldF9kcChwcCk7CisKKyAgIGRpc3BsYXlfbG9nKGRwLCBMSUJQTkdfRVJST1IsICIlcyIsIGVycm9yKTsKK30KKworc3RhdGljIHZvaWQKK2Rpc3BsYXlfY2FjaGVfZmlsZShzdHJ1Y3QgZGlzcGxheSAqZHAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQorICAgLyogRG9lcyB0aGUgaW5pdGlhbCBjYWNoZSBvZiB0aGUgZmlsZS4gKi8KK3sKKyAgIEZJTEUgKmZwOworICAgaW50IHJldDsKKworICAgZHAtPmZpbGVuYW1lID0gZmlsZW5hbWU7CisKKyAgIGlmIChmaWxlbmFtZSAhPSBOVUxMKQorICAgeworICAgICAgZnAgPSBmb3BlbihmaWxlbmFtZSwgInJiIik7CisgICAgICBpZiAoZnAgPT0gTlVMTCkKKyAgICAgICAgIGRpc3BsYXlfbG9nKGRwLCBVU0VSX0VSUk9SLCAib3BlbiBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgIH0KKworICAgZWxzZQorICAgICAgZnAgPSBzdGRpbjsKKworICAgcmV0ID0gYnVmZmVyX2Zyb21fZmlsZSgmZHAtPm9yaWdpbmFsX2ZpbGUsIGZwKTsKKworICAgZmNsb3NlKGZwKTsKKworICAgaWYgKHJldCAhPSAwKQorICAgICAgZGlzcGxheV9sb2coZHAsIEFQUF9FUlJPUiwgInJlYWQgZmFpbGVkOiAlcyIsIHN0cmVycm9yKHJldCkpOworfQorCitzdGF0aWMgdm9pZAorYnVmZmVyX3JlYWQoc3RydWN0IGRpc3BsYXkgKmRwLCBzdHJ1Y3QgYnVmZmVyICpicCwgcG5nX2J5dGVwIGRhdGEsCisgICBwbmdfc2l6ZV90IHNpemUpCit7CisgICBzdHJ1Y3QgYnVmZmVyX2xpc3QgKmxhc3QgPSBicC0+Y3VycmVudDsKKyAgIHNpemVfdCByZWFkX2NvdW50ID0gYnAtPnJlYWRfY291bnQ7CisKKyAgIHdoaWxlIChzaXplID4gMCkKKyAgIHsKKyAgICAgIHNpemVfdCBhdmFpbDsKKworICAgICAgaWYgKGxhc3QgPT0gTlVMTCB8fAorICAgICAgICAgKGxhc3QgPT0gYnAtPmxhc3QgJiYgcmVhZF9jb3VudCA+PSBicC0+ZW5kX2NvdW50KSkKKyAgICAgIHsKKyAgICAgICAgIGRpc3BsYXlfbG9nKGRwLCBVU0VSX0VSUk9SLCAiZmlsZSB0cnVuY2F0ZWQgKCVsdSBieXRlcykiLAorICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpc2l6ZSk7CisgICAgICAgICAvKk5PVFJFQUNIRUQqLworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGVsc2UgaWYgKHJlYWRfY291bnQgPj0gc2l6ZW9mIGxhc3QtPmJ1ZmZlcikKKyAgICAgIHsKKyAgICAgICAgIC8qIE1vdmUgdG8gdGhlIG5leHQgYnVmZmVyOiAqLworICAgICAgICAgbGFzdCA9IGxhc3QtPm5leHQ7CisgICAgICAgICByZWFkX2NvdW50ID0gMDsKKyAgICAgICAgIGJwLT5jdXJyZW50ID0gbGFzdDsgLyogQXZvaWQgdXBkYXRlIG91dHNpZGUgdGhlIGxvb3AgKi8KKworICAgICAgICAgLyogQW5kIGRvIGEgc2FuaXR5IGNoZWNrICh0aGUgRU9GIGNhc2UgaXMgY2F1Z2h0IGFib3ZlKSAqLworICAgICAgICAgaWYgKGxhc3QgPT0gTlVMTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGRpc3BsYXlfbG9nKGRwLCBJTlRFUk5BTF9FUlJPUiwgImRhbWFnZWQgYnVmZmVyIGxpc3QiKTsKKyAgICAgICAgICAgIC8qTk9UUkVBQ0hFRCovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgYXZhaWwgPSAoc2l6ZW9mIGxhc3QtPmJ1ZmZlcikgLSByZWFkX2NvdW50OworICAgICAgaWYgKGF2YWlsID4gc2l6ZSkKKyAgICAgICAgIGF2YWlsID0gc2l6ZTsKKworICAgICAgbWVtY3B5KGRhdGEsIGxhc3QtPmJ1ZmZlciArIHJlYWRfY291bnQsIGF2YWlsKTsKKyAgICAgIHJlYWRfY291bnQgKz0gYXZhaWw7CisgICAgICBzaXplIC09IGF2YWlsOworICAgICAgZGF0YSArPSBhdmFpbDsKKyAgIH0KKworICAgYnAtPnJlYWRfY291bnQgPSByZWFkX2NvdW50OworfQorCitzdGF0aWMgdm9pZCBQTkdDQkFQSQorcmVhZF9mdW5jdGlvbihwbmdfc3RydWN0cCBwcCwgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3Qgc2l6ZSkKK3sKKyAgIGJ1ZmZlcl9yZWFkKGdldF9kcChwcCksIGdldF9idWZmZXIocHApLCBkYXRhLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQKK3JlYWRfcG5nKHN0cnVjdCBkaXNwbGF5ICpkcCwgc3RydWN0IGJ1ZmZlciAqYnAsIGNvbnN0IGNoYXIgKm9wZXJhdGlvbiwKKyAgIGludCB0cmFuc2Zvcm1zKQoreworICAgcG5nX3N0cnVjdHAgcHA7CisgICBwbmdfaW5mb3AgICBpcDsKKworICAgLyogVGhpcyBjbGVhbnMgb3V0IGFueSBwcmV2aW91cyByZWFkIGFuZCBzZXRzIG9wZXJhdGlvbiBhbmQgdHJhbnNmb3JtcyB0bworICAgICogZW1wdHkuCisgICAgKi8KKyAgIGRpc3BsYXlfY2xlYW5fcmVhZChkcCk7CisKKyAgIGlmIChvcGVyYXRpb24gIT0gTlVMTCkgLyogZWxzZSB0aGlzIGlzIGEgdmVyaWZ5IGFuZCBkbyBub3Qgb3ZlcndyaXRlIGluZm8gKi8KKyAgIHsKKyAgICAgIGRwLT5vcGVyYXRpb24gPSBvcGVyYXRpb247CisgICAgICBkcC0+dHJhbnNmb3JtcyA9IHRyYW5zZm9ybXM7CisgICB9CisKKyAgIGRwLT5yZWFkX3BwID0gcHAgPSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NUUklORywgZHAsCisgICAgICBkaXNwbGF5X2Vycm9yLCBkaXNwbGF5X3dhcm5pbmcpOworICAgaWYgKHBwID09IE5VTEwpCisgICAgICBkaXNwbGF5X2xvZyhkcCwgTElCUE5HX0VSUk9SLCAiZmFpbGVkIHRvIGNyZWF0ZSByZWFkIHN0cnVjdCIpOworCisgICAvKiBUaGUgcG5nX3JlYWRfcG5nIEFQSSByZXF1aXJlcyB1cyB0byBtYWtlIHRoZSBpbmZvIHN0cnVjdCwgYnV0IGl0IGRvZXMgdGhlCisgICAgKiBjYWxsIHRvIHBuZ19yZWFkX2luZm8uCisgICAgKi8KKyAgIGRwLT5yZWFkX2lwID0gaXAgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBwKTsKKyAgIGlmIChpcCA9PSBOVUxMKQorICAgICAgZGlzcGxheV9sb2coZHAsIExJQlBOR19FUlJPUiwgImZhaWxlZCB0byBjcmVhdGUgaW5mbyBzdHJ1Y3QiKTsKKworIyAgaWZkZWYgUE5HX1NFVF9VU0VSX0xJTUlUU19TVVBQT1JURUQKKyAgICAgIC8qIFJlbW92ZSB0aGUgdXNlciBsaW1pdHMsIGlmIGFueSAqLworICAgICAgcG5nX3NldF91c2VyX2xpbWl0cyhwcCwgMHg3ZmZmZmZmZiwgMHg3ZmZmZmZmZik7CisjICBlbmRpZgorCisgICAvKiBTZXQgdGhlIElPIGhhbmRsaW5nICovCisgICBidWZmZXJfc3RhcnRfcmVhZChicCk7CisgICBwbmdfc2V0X3JlYWRfZm4ocHAsIGJwLCByZWFkX2Z1bmN0aW9uKTsKKworICAgcG5nX3JlYWRfcG5nKHBwLCBpcCwgdHJhbnNmb3JtcywgTlVMTC8qcGFyYW1zKi8pOworCisjaWYgMCAvKiBjcmF6eSBkZWJ1Z2dpbmcgKi8KKyAgIHsKKyAgICAgIHBuZ19ieXRlcCBwciA9IHBuZ19nZXRfcm93cyhwcCwgaXApWzBdOworICAgICAgc2l6ZV90IHJiID0gcG5nX2dldF9yb3dieXRlcyhwcCwgaXApOworICAgICAgc2l6ZV90IGNiOworICAgICAgY2hhciBjID0gJyAnOworCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiUuNHggJTJkICglM2x1IGJ5dGVzKToiLCB0cmFuc2Zvcm1zLCBwbmdfZ2V0X2JpdF9kZXB0aChwcCxpcCksICh1bnNpZ25lZCBsb25nKXJiKTsKKworICAgICAgZm9yIChjYj0wOyBjYjxyYjsgKytjYikKKyAgICAgICAgIGZwdXRjKGMsIHN0ZGVyciksIGZwcmludGYoc3RkZXJyLCAiJS4yeCIsIHByW2NiXSksIGM9Jy4nOworCisgICAgICBmcHV0YygnXG4nLCBzdGRlcnIpOworICAgfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCit1cGRhdGVfZGlzcGxheShzdHJ1Y3QgZGlzcGxheSAqZHApCisgICAvKiBjYWxsZWQgb25jZSBhZnRlciB0aGUgZmlyc3QgcmVhZCB0byB1cGRhdGUgYWxsIHRoZSBpbmZvLCBvcmlnaW5hbF9wcCBhbmQKKyAgICAqIG9yaWdpbmFsX2lwIG11c3QgaGF2ZSBiZWVuIGZpbGxlZCBpbi4KKyAgICAqLworeworICAgcG5nX3N0cnVjdHAgcHA7CisgICBwbmdfaW5mb3AgICBpcDsKKworICAgLyogTm93IHBlcmZvcm0gdGhlIGluaXRpYWwgcmVhZCB3aXRoIGEgMCB0cmFuZm9ybS4gKi8KKyAgIHJlYWRfcG5nKGRwLCAmZHAtPm9yaWdpbmFsX2ZpbGUsICJvcmlnaW5hbCByZWFkIiwgMC8qbm8gdHJhbnNmb3JtKi8pOworCisgICAvKiBNb3ZlIHRoZSByZXN1bHQgdG8gdGhlICdvcmlnaW5hbCcgZmllbGRzICovCisgICBkcC0+b3JpZ2luYWxfcHAgPSBwcCA9IGRwLT5yZWFkX3BwLCBkcC0+cmVhZF9wcCA9IE5VTEw7CisgICBkcC0+b3JpZ2luYWxfaXAgPSBpcCA9IGRwLT5yZWFkX2lwLCBkcC0+cmVhZF9pcCA9IE5VTEw7CisKKyAgIGRwLT5vcmlnaW5hbF9yb3dieXRlcyA9IHBuZ19nZXRfcm93Ynl0ZXMocHAsIGlwKTsKKyAgIGlmIChkcC0+b3JpZ2luYWxfcm93Ynl0ZXMgPT0gMCkKKyAgICAgIGRpc3BsYXlfbG9nKGRwLCBMSUJQTkdfQlVHLCAicG5nX2dldF9yb3dieXRlcyByZXR1cm5lZCAwIik7CisKKyAgIGRwLT5jaHVua3MgPSBwbmdfZ2V0X3ZhbGlkKHBwLCBpcCwgMHhmZmZmZmZmZik7CisgICBpZiAoKGRwLT5jaHVua3MgJiBQTkdfSU5GT19JREFUKSA9PSAwKSAvKiBzZXQgYnkgcG5nX3JlYWRfcG5nICovCisgICAgICBkaXNwbGF5X2xvZyhkcCwgTElCUE5HX0JVRywgInBuZ19yZWFkX3BuZyBkaWQgbm90IHNldCBJREFUIGZsYWciKTsKKworICAgZHAtPm9yaWdpbmFsX3Jvd3MgPSBwbmdfZ2V0X3Jvd3MocHAsIGlwKTsKKyAgIGlmIChkcC0+b3JpZ2luYWxfcm93cyA9PSBOVUxMKQorICAgICAgZGlzcGxheV9sb2coZHAsIExJQlBOR19CVUcsICJwbmdfcmVhZF9wbmcgZGlkIG5vdCBjcmVhdGUgcm93IGJ1ZmZlcnMiKTsKKworICAgaWYgKCFwbmdfZ2V0X0lIRFIocHAsIGlwLAorICAgICAgJmRwLT53aWR0aCwgJmRwLT5oZWlnaHQsICZkcC0+Yml0X2RlcHRoLCAmZHAtPmNvbG9yX3R5cGUsCisgICAgICAmZHAtPmludGVybGFjZV9tZXRob2QsICZkcC0+Y29tcHJlc3Npb25fbWV0aG9kLCAmZHAtPmZpbHRlcl9tZXRob2QpKQorICAgICAgZGlzcGxheV9sb2coZHAsIExJQlBOR19CVUcsICJwbmdfZ2V0X0lIRFIgZmFpbGVkIik7CisKKyAgIC8qICdhY3RpdmUnIHRyYW5zZm9ybXMgYXJlIGRpc2NvdmVyZWQgYmFzZWQgb24gdGhlIG9yaWdpbmFsIGltYWdlIGZvcm1hdDsKKyAgICAqIHJ1bm5pbmcgb25lIGFjdGl2ZSB0cmFuc2Zvcm0gY2FuIGFjdGl2YXRlIG90aGVycy4gIEF0IHByZXNlbnQgdGhlIGNvZGUKKyAgICAqIGRvZXMgbm90IGF0dGVtcHQgdG8gZGV0ZXJtaW5lIHRoZSBjbG9zdXJlLgorICAgICovCisgICB7CisgICAgICBwbmdfdWludF8zMiBjaHVua3MgPSBkcC0+Y2h1bmtzOworICAgICAgaW50IGFjdGl2ZSA9IDAsIGluYWN0aXZlID0gMDsKKyAgICAgIGludCBjdCA9IGRwLT5jb2xvcl90eXBlOworICAgICAgaW50IGJkID0gZHAtPmJpdF9kZXB0aDsKKyAgICAgIHVuc2lnbmVkIGludCBpOworCisgICAgICBmb3IgKGk9MDsgaTxUVEFCTEVfU0laRTsgKytpKSBpZiAodHJhbnNmb3JtX2luZm9baV0ubmFtZSAhPSBOVUxMKQorICAgICAgeworICAgICAgICAgaW50IHRyYW5zZm9ybSA9IHRyYW5zZm9ybV9pbmZvW2ldLnRyYW5zZm9ybTsKKworICAgICAgICAgaWYgKCh0cmFuc2Zvcm1faW5mb1tpXS52YWxpZF9jaHVua3MgPT0gMCB8fAorICAgICAgICAgICAgICAgKHRyYW5zZm9ybV9pbmZvW2ldLnZhbGlkX2NodW5rcyAmIGNodW5rcykgIT0gMCkgJiYKKyAgICAgICAgICAgICh0cmFuc2Zvcm1faW5mb1tpXS5jb2xvcl9tYXNrX3JlcXVpcmVkICYgY3QpID09CisgICAgICAgICAgICAgICB0cmFuc2Zvcm1faW5mb1tpXS5jb2xvcl9tYXNrX3JlcXVpcmVkICYmCisgICAgICAgICAgICAodHJhbnNmb3JtX2luZm9baV0uY29sb3JfbWFza19hYnNlbnQgJiBjdCkgPT0gMCAmJgorICAgICAgICAgICAgKHRyYW5zZm9ybV9pbmZvW2ldLmJpdF9kZXB0aHMgJiBiZCkgIT0gMCAmJgorICAgICAgICAgICAgKHRyYW5zZm9ybV9pbmZvW2ldLndoZW4gJiBUUkFOU0ZPUk1fUikgIT0gMCkKKyAgICAgICAgICAgIGFjdGl2ZSB8PSB0cmFuc2Zvcm07CisKKyAgICAgICAgIGVsc2UgaWYgKCh0cmFuc2Zvcm1faW5mb1tpXS53aGVuICYgVFJBTlNGT1JNX1IpICE9IDApCisgICAgICAgICAgICBpbmFjdGl2ZSB8PSB0cmFuc2Zvcm07CisgICAgICB9CisKKyAgICAgIC8qIFNvbWUgdHJhbnNmb3JtcyBhcHBlYXIgbXVsdGlwbGUgdGltZXMgaW4gdGhlIHRhYmxlOyB0aGUgJ2FjdGl2ZScgc3RhdHVzCisgICAgICAgKiBpcyB0aGUgbG9naWNhbCBPUiBvZiB0aGVzZSBhbmQgdGhlIGluYWN0aXZlIHN0YXR1cyBtdXN0IGJlIGFkanVzdGVkIHRvCisgICAgICAgKiB0YWtlIHRoaXMgaW50byBhY2NvdW50LgorICAgICAgICovCisgICAgICBpbmFjdGl2ZSAmPSB+YWN0aXZlOworCisgICAgICBkcC0+YWN0aXZlX3RyYW5zZm9ybXMgPSBhY3RpdmU7CisgICAgICBkcC0+aWdub3JlZF90cmFuc2Zvcm1zID0gaW5hY3RpdmU7IC8qIGV4Y2x1ZGluZyB3cml0ZS1vbmx5IHRyYW5zZm9ybXMgKi8KKyAgIH0KK30KKworc3RhdGljIGludAorY29tcGFyZV9yZWFkKHN0cnVjdCBkaXNwbGF5ICpkcCwgaW50IGFwcGxpZWRfdHJhbnNmb3JtcykKK3sKKyAgIC8qIENvbXBhcmUgdGhlIHBuZ19pbmZvIGZyb20gcmVhZF9pcCB3aXRoIG9yaWdpbmFsX2luZm8gKi8KKyAgIHNpemVfdCByb3dieXRlczsKKyAgIHBuZ191aW50XzMyIHdpZHRoLCBoZWlnaHQ7CisgICBpbnQgYml0X2RlcHRoLCBjb2xvcl90eXBlOworICAgaW50IGludGVybGFjZV9tZXRob2QsIGNvbXByZXNzaW9uX21ldGhvZCwgZmlsdGVyX21ldGhvZDsKKyAgIGNvbnN0IGNoYXIgKmUgPSBOVUxMOworCisgICBwbmdfZ2V0X0lIRFIoZHAtPnJlYWRfcHAsIGRwLT5yZWFkX2lwLCAmd2lkdGgsICZoZWlnaHQsICZiaXRfZGVwdGgsCisgICAgICAmY29sb3JfdHlwZSwgJmludGVybGFjZV9tZXRob2QsICZjb21wcmVzc2lvbl9tZXRob2QsICZmaWx0ZXJfbWV0aG9kKTsKKworIyAgZGVmaW5lIEMoaXRlbSkgaWYgKGl0ZW0gIT0gZHAtPml0ZW0pIFwKKyAgICAgIGRpc3BsYXlfbG9nKGRwLCBBUFBfV0FSTklORywgIklIRFIgIiAjaXRlbSAiKCVsdSkgY2hhbmdlZCB0byAlbHUiLFwKKyAgICAgICAgICh1bnNpZ25lZCBsb25nKWRwLT5pdGVtLCAodW5zaWduZWQgbG9uZylpdGVtKSwgZSA9ICNpdGVtCisKKyAgIC8qIFRoZSBJSERSIHNob3VsZCBiZSBpZGVudGljYWw6ICovCisgICBDKHdpZHRoKTsKKyAgIEMoaGVpZ2h0KTsKKyAgIEMoYml0X2RlcHRoKTsKKyAgIEMoY29sb3JfdHlwZSk7CisgICBDKGludGVybGFjZV9tZXRob2QpOworICAgQyhjb21wcmVzc2lvbl9tZXRob2QpOworICAgQyhmaWx0ZXJfbWV0aG9kKTsKKworICAgLyogJ2UnIHJlbWFpbnMgc2V0IHRvIHRoZSBuYW1lIG9mIHRoZSBsYXN0IHRoaW5nIGNoYW5nZWQ6ICovCisgICBpZiAoZSkKKyAgICAgIGRpc3BsYXlfbG9nKGRwLCBBUFBfRVJST1IsICJJSERSIGNoYW5nZWQgKCVzKSIsIGUpOworCisgICAvKiBBbGwgdGhlIGNodW5rcyBmcm9tIHRoZSBvcmlnaW5hbCBQTkcgc2hvdWxkIGJlIHByZXNlcnZlZCBpbiB0aGUgb3V0cHV0IFBORworICAgICogYmVjYXVzZSB0aGUgUE5HIGZvcm1hdCBoYXMgbm90IGJlZW4gY2hhbmdlZC4KKyAgICAqLworICAgeworICAgICAgdW5zaWduZWQgbG9uZyBjaHVua3MgPQorICAgICAgICAgcG5nX2dldF92YWxpZChkcC0+cmVhZF9wcCwgZHAtPnJlYWRfaXAsIDB4ZmZmZmZmZmYpOworCisgICAgICBpZiAoY2h1bmtzICE9IGRwLT5jaHVua3MpCisgICAgICAgICBkaXNwbGF5X2xvZyhkcCwgQVBQX0ZBSUwsICJQTkcgY2h1bmtzIGNoYW5nZWQgZnJvbSAweCVseCB0byAweCVseCIsCisgICAgICAgICAgICAodW5zaWduZWQgbG9uZylkcC0+Y2h1bmtzLCBjaHVua3MpOworICAgfQorCisgICAvKiByb3dieXRlcyBzaG91bGQgYmUgdGhlIHNhbWUgKi8KKyAgIHJvd2J5dGVzID0gcG5nX2dldF9yb3dieXRlcyhkcC0+cmVhZF9wcCwgZHAtPnJlYWRfaXApOworCisgICAvKiBOT1RFOiBvbiA2NC1iaXQgc3lzdGVtcyB0aGlzIG1heSB0cmFzaCB0aGUgdG9wIGJpdHMgb2Ygcm93Ynl0ZXMsCisgICAgKiB3aGljaCBjb3VsZCBsZWFkIHRvIHdlaXJkIGVycm9yIG1lc3NhZ2VzLgorICAgICovCisgICBpZiAocm93Ynl0ZXMgIT0gZHAtPm9yaWdpbmFsX3Jvd2J5dGVzKQorICAgICAgZGlzcGxheV9sb2coZHAsIEFQUF9FUlJPUiwgIlBORyByb3dieXRlcyBjaGFuZ2VkIGZyb20gJWx1IHRvICVsdSIsCisgICAgICAgICAodW5zaWduZWQgbG9uZylkcC0+b3JpZ2luYWxfcm93Ynl0ZXMsICh1bnNpZ25lZCBsb25nKXJvd2J5dGVzKTsKKworICAgLyogVGhlIHJvd3Mgc2hvdWxkIGJlIHRoZSBzYW1lIHRvbywgdW5sZXNzIHRoZSBhcHBsaWVkIHRyYW5zZm9ybXMgaW5jbHVkZXMKKyAgICAqIHRoZSBzaGlmdCB0cmFuc2Zvcm0sIGluIHdoaWNoIGNhc2UgbG93IGJpdHMgbWF5IGhhdmUgYmVlbiBsb3N0LgorICAgICovCisgICB7CisgICAgICBwbmdfYnl0ZXBwIHJvd3MgPSBwbmdfZ2V0X3Jvd3MoZHAtPnJlYWRfcHAsIGRwLT5yZWFkX2lwKTsKKyAgICAgIHVuc2lnbmVkIGludCBtYXNrOyAgLyogbWFzayAoaWYgbm90IHplcm8pIGZvciB0aGUgZmluYWwgYnl0ZSAqLworCisgICAgICBpZiAoYml0X2RlcHRoIDwgOCkKKyAgICAgIHsKKyAgICAgICAgIC8qIE5lZWQgdGhlIHN0cmF5IGJpdHMgYXQgdGhlIGVuZCwgdGhpcyBkZXBlbmRzIG9ubHkgb24gdGhlIGxvdyBiaXRzCisgICAgICAgICAgKiBvZiB0aGUgaW1hZ2Ugd2lkdGg7IG92ZXJmbG93IGRvZXMgbm90IG1hdHRlci4gIElmIHRoZSB3aWR0aCBpcyBhbgorICAgICAgICAgICogZXhhY3QgbXVsdGlwbGUgb2YgOCBiaXRzIHRoaXMgZ2l2ZXMgYSBtYXNrIG9mIDAsIG5vdCAweGZmLgorICAgICAgICAgICovCisgICAgICAgICBtYXNrID0gMHhmZiAmICgweGZmMDAgPj4gKChiaXRfZGVwdGggKiB3aWR0aCkgJiA3KSk7CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgICAgIG1hc2sgPSAwOworCisgICAgICBpZiAocm93cyA9PSBOVUxMKQorICAgICAgICAgZGlzcGxheV9sb2coZHAsIExJQlBOR19CVUcsICJwbmdfZ2V0X3Jvd3MgcmV0dXJuZWQgTlVMTCIpOworCisgICAgICBpZiAoKGFwcGxpZWRfdHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fU0hJRlQpID09IDAgfHwKKyAgICAgICAgIChkcC0+YWN0aXZlX3RyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX1NISUZUKSA9PSAwIHx8CisgICAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCisgICAgICB7CisgICAgICAgICB1bnNpZ25lZCBsb25nIHk7CisKKyAgICAgICAgIGZvciAoeT0wOyB5PGhlaWdodDsgKyt5KQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIHJvdyA9IHJvd3NbeV07CisgICAgICAgICAgICBwbmdfYnl0ZXAgb3JpZyA9IGRwLT5vcmlnaW5hbF9yb3dzW3ldOworCisgICAgICAgICAgICBpZiAobWVtY21wKHJvdywgb3JpZywgcm93Ynl0ZXMtKG1hc2sgIT0gMCkpICE9IDAgfHwgKG1hc2sgIT0gMCAmJgorICAgICAgICAgICAgICAgKChyb3dbcm93Ynl0ZXMtMV0gJiBtYXNrKSAhPSAob3JpZ1tyb3dieXRlcy0xXSAmIG1hc2spKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzaXplX3QgeDsKKworICAgICAgICAgICAgICAgLyogRmluZCB0aGUgZmlyc3QgZXJyb3IgKi8KKyAgICAgICAgICAgICAgIGZvciAoeD0wOyB4PHJvd2J5dGVzLTE7ICsreCkgaWYgKHJvd1t4XSAhPSBvcmlnW3hdKQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgIGRpc3BsYXlfbG9nKGRwLCBBUFBfRkFJTCwKKyAgICAgICAgICAgICAgICAgICJieXRlKCVsdSwlbHUpIGNoYW5nZWQgMHglLjJ4IC0+IDB4JS4yeCIsCisgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyl4LCAodW5zaWduZWQgbG9uZyl5LCBvcmlnW3hdLCByb3dbeF0pOworICAgICAgICAgICAgICAgcmV0dXJuIDA7IC8qIGRvbid0IGtlZXAgcmVwb3J0aW5nIGZhaWxlZCByb3dzIG9uICdjb250aW51ZScgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgdW5zaWduZWQgbG9uZyB5OworICAgICAgICAgaW50IGJwcDsgICAvKiBiaXRzLXBlci1waXhlbCB0aGVuIGJ5dGVzLXBlci1waXhlbCAqLworICAgICAgICAgLyogY29tcG9uZW50cyBhcmUgdXAgdG8gOCBieXRlcyBpbiBzaXplICovCisgICAgICAgICBwbmdfYnl0ZSBzaWdfYml0c1s4XTsKKyAgICAgICAgIHBuZ19jb2xvcl84cCBzQklUOworCisgICAgICAgICBpZiAocG5nX2dldF9zQklUKGRwLT5yZWFkX3BwLCBkcC0+cmVhZF9pcCwgJnNCSVQpICE9IFBOR19JTkZPX3NCSVQpCisgICAgICAgICAgICBkaXNwbGF5X2xvZyhkcCwgSU5URVJOQUxfRVJST1IsCisgICAgICAgICAgICAgICAiYWN0aXZlIHNoaWZ0IHRyYW5zZm9ybSBidXQgbm8gc0JJVCBpbiBmaWxlIik7CisKKyAgICAgICAgIHN3aXRjaCAoY29sb3JfdHlwZSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfR1JBWToKKyAgICAgICAgICAgICAgIHNpZ19iaXRzWzBdID0gc0JJVC0+Z3JheTsKKyAgICAgICAgICAgICAgIGJwcCA9IGJpdF9kZXB0aDsKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX0dBOgorICAgICAgICAgICAgICAgc2lnX2JpdHNbMF0gPSBzQklULT5ncmF5OworICAgICAgICAgICAgICAgc2lnX2JpdHNbMV0gPSBzQklULT5hbHBoYTsKKyAgICAgICAgICAgICAgIGJwcCA9IDIgKiBiaXRfZGVwdGg7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9SR0I6CisgICAgICAgICAgICAgICBzaWdfYml0c1swXSA9IHNCSVQtPnJlZDsKKyAgICAgICAgICAgICAgIHNpZ19iaXRzWzFdID0gc0JJVC0+Z3JlZW47CisgICAgICAgICAgICAgICBzaWdfYml0c1syXSA9IHNCSVQtPmJsdWU7CisgICAgICAgICAgICAgICBicHAgPSAzICogYml0X2RlcHRoOworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUkdCQToKKyAgICAgICAgICAgICAgIHNpZ19iaXRzWzBdID0gc0JJVC0+cmVkOworICAgICAgICAgICAgICAgc2lnX2JpdHNbMV0gPSBzQklULT5ncmVlbjsKKyAgICAgICAgICAgICAgIHNpZ19iaXRzWzJdID0gc0JJVC0+Ymx1ZTsKKyAgICAgICAgICAgICAgIHNpZ19iaXRzWzNdID0gc0JJVC0+YWxwaGE7CisgICAgICAgICAgICAgICBicHAgPSA0ICogYml0X2RlcHRoOworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICBkaXNwbGF5X2xvZyhkcCwgTElCUE5HX0VSUk9SLCAiaW52YWxpZCBjb2xvdXIgdHlwZSAlZCIsCisgICAgICAgICAgICAgICAgICBjb2xvcl90eXBlKTsKKyAgICAgICAgICAgICAgIC8qTk9UUkVBQ0hFRCovCisgICAgICAgICAgICAgICBicHAgPSAwOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGludCBiOworCisgICAgICAgICAgICBmb3IgKGI9MDsgOCpiPGJwcDsgKytiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLyogbGlicG5nIHNob3VsZCBjYXRjaCB0aGlzOyBpZiBub3QgdGhlcmUgaXMgYSBzZWN1cml0eSBpc3N1ZQorICAgICAgICAgICAgICAgICogYmVjYXVzZSBhbiBhcHAgKGxpa2UgdGhpcyBvbmUpIG1heSBvdmVyZmxvdyBhbiBhcnJheS4gSW4gZmFjdAorICAgICAgICAgICAgICAgICogbGlicG5nIGRvZXNuJ3QgY2F0Y2ggdGhpcyBhdCBwcmVzZW50LgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICBpZiAoc2lnX2JpdHNbYl0gPT0gMCB8fCBzaWdfYml0c1tiXSA+IGJpdF9kZXB0aC8qIXBhbGV0dGUqLykKKyAgICAgICAgICAgICAgICAgIGRpc3BsYXlfbG9nKGRwLCBMSUJQTkdfQlVHLAorICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgc0JJVFsldV0gIHZhbHVlICVkIHJldHVybmVkIGZvciBQTkcgYml0IGRlcHRoICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIGIsIHNpZ19iaXRzW2JdLCBiaXRfZGVwdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICBpZiAoYnBwIDwgOCAmJiBicHAgIT0gYml0X2RlcHRoKQorICAgICAgICAgeworICAgICAgICAgICAgLyogc2FuaXR5IGNoZWNrOyB0aGlzIGlzIGEgZ3JheXNjYWxlIFBORzsgc29tZXRoaW5nIGlzIHdyb25nIGluIHRoZQorICAgICAgICAgICAgICogY29kZSBhYm92ZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZGlzcGxheV9sb2coZHAsIElOVEVSTkFMX0VSUk9SLCAiaW52YWxpZCBicHAgJXUgZm9yIGJpdF9kZXB0aCAldSIsCisgICAgICAgICAgICAgICBicHAsIGJpdF9kZXB0aCk7CisgICAgICAgICB9CisKKyAgICAgICAgIHN3aXRjaCAoYml0X2RlcHRoKQorICAgICAgICAgeworICAgICAgICAgICAgaW50IGI7CisKKyAgICAgICAgICAgIGNhc2UgMTY6IC8qIFR3byBieXRlcyBwZXIgY29tcG9uZW50LCBiaWctZW5kaWFuICovCisgICAgICAgICAgICAgICBmb3IgKGIgPSAoYnBwID4+IDQpOyBiID4gMDsgLS1iKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNpZyA9ICh1bnNpZ25lZCBpbnQpKDB4ZmZmZjAwMDAgPj4gc2lnX2JpdHNbYl0pOworCisgICAgICAgICAgICAgICAgICBzaWdfYml0c1syKmIrMV0gPSAocG5nX2J5dGUpc2lnOworICAgICAgICAgICAgICAgICAgc2lnX2JpdHNbMipiKzBdID0gKHBuZ19ieXRlKShzaWcgPj4gOCk7IC8qIGJpZy1lbmRpYW4gKi8KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDg6IC8qIE9uZSBieXRlIHBlciBjb21wb25lbnQgKi8KKyAgICAgICAgICAgICAgIGZvciAoYj0wOyBiKjggPCBicHA7ICsrYikKKyAgICAgICAgICAgICAgICAgIHNpZ19iaXRzW2JdID0gKHBuZ19ieXRlKSgweGZmMDAgPj4gc2lnX2JpdHNbYl0pOworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMTogLyogYWxsb3dlZCwgYnV0IGR1bWIgKi8KKyAgICAgICAgICAgICAgIC8qIFZhbHVlIGlzIDEgKi8KKyAgICAgICAgICAgICAgIHNpZ19iaXRzWzBdID0gMHhmZjsKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDI6IC8qIFJlcGxpY2F0ZSA0IHRpbWVzICovCisgICAgICAgICAgICAgICAvKiBWYWx1ZSBpcyAxIG9yIDIgKi8KKyAgICAgICAgICAgICAgIGIgPSAweDMgJiAoKDB4Mzw8MikgPj4gc2lnX2JpdHNbMF0pOworICAgICAgICAgICAgICAgYiB8PSBiIDw8IDI7CisgICAgICAgICAgICAgICBiIHw9IGIgPDwgNDsKKyAgICAgICAgICAgICAgIHNpZ19iaXRzWzBdID0gKHBuZ19ieXRlKWI7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSA0OiAvKiBSZWxpY2F0ZSB0d2ljZSAqLworICAgICAgICAgICAgICAgLyogVmFsdWUgaXMgMSwgMiwgMyBvciA0ICovCisgICAgICAgICAgICAgICBiID0gMHhmICYgKCgweGYgPDwgNCkgPj4gc2lnX2JpdHNbMF0pOworICAgICAgICAgICAgICAgYiB8PSBiIDw8IDQ7CisgICAgICAgICAgICAgICBzaWdfYml0c1swXSA9IChwbmdfYnl0ZSliOworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICBkaXNwbGF5X2xvZyhkcCwgTElCUE5HX0JVRywgImludmFsaWQgYml0IGRlcHRoICVkIiwgYml0X2RlcHRoKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICAvKiBDb252ZXJ0IGJwcCB0byBieXRlczsgdGhpcyBnaXZlcyAnMScgZm9yIGxvdy1iaXQgZGVwdGggZ3JheXNjYWxlLAorICAgICAgICAgICogd2hlcmUgdGhlcmUgYXJlIG11bHRpcGxlIHBpeGVscyBwZXIgYnl0ZS4KKyAgICAgICAgICAqLworICAgICAgICAgYnBwID0gKGJwcCs3KSA+PiAzOworCisgICAgICAgICAvKiBUaGUgbWFzayBjYW4gYmUgY29tYmluZWQgd2l0aCBzaWdfYml0c1swXSAqLworICAgICAgICAgaWYgKG1hc2sgIT0gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIG1hc2sgJj0gc2lnX2JpdHNbMF07CisKKyAgICAgICAgICAgIGlmIChicHAgIT0gMSB8fCBtYXNrID09IDApCisgICAgICAgICAgICAgICBkaXNwbGF5X2xvZyhkcCwgSU5URVJOQUxfRVJST1IsICJtYXNrIGNhbGN1bGF0aW9uIGVycm9yICV1LCAldSIsCisgICAgICAgICAgICAgICAgICBicHAsIG1hc2spOworICAgICAgICAgfQorCisgICAgICAgICBmb3IgKHk9MDsgeTxoZWlnaHQ7ICsreSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19ieXRlcCByb3cgPSByb3dzW3ldOworICAgICAgICAgICAgcG5nX2J5dGVwIG9yaWcgPSBkcC0+b3JpZ2luYWxfcm93c1t5XTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgeDsKKworICAgICAgICAgICAgZm9yICh4PTA7IHg8KHdpZHRoLShtYXNrIT0wKSk7ICsreCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGludCBiOworCisgICAgICAgICAgICAgICBmb3IgKGI9MDsgYjxicHA7ICsrYikKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICgoKnJvdysrICYgc2lnX2JpdHNbYl0pICE9ICgqb3JpZysrICYgc2lnX2JpdHNbYl0pKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9sb2coZHAsIEFQUF9GQUlMLAorICAgICAgICAgICAgICAgICAgICAgICAgInNpZ25pZmljYW50IGJpdHMgYXQgKCVsdVsldV0sJWx1KSBjaGFuZ2VkICUuMngtPiUuMngiLAorICAgICAgICAgICAgICAgICAgICAgICAgeCwgYiwgeSwgb3JpZ1stMV0sIHJvd1stMV0pOworICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtYXNrICE9IDAgJiYgKCpyb3cgJiBtYXNrKSAhPSAoKm9yaWcgJiBtYXNrKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGRpc3BsYXlfbG9nKGRwLCBBUFBfRkFJTCwKKyAgICAgICAgICAgICAgICAgICJzaWduaWZpY2FudCBiaXRzIGF0ICglbHVbZW5kXSwlbHUpIGNoYW5nZWQiLCB4LCB5KTsKKyAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgfSAvKiBmb3IgeSAqLworICAgICAgfQorICAgfQorCisgICByZXR1cm4gMTsgLyogY29tcGFyZSBzdWNjZWVkZWQgKi8KK30KKworI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKK3N0YXRpYyB2b2lkCitidWZmZXJfd3JpdGUoc3RydWN0IGRpc3BsYXkgKmRwLCBzdHJ1Y3QgYnVmZmVyICpidWZmZXIsIHBuZ19ieXRlcCBkYXRhLAorICAgcG5nX3NpemVfdCBzaXplKQorICAgLyogR2VuZXJpYyB3cml0ZSBmdW5jdGlvbiB1c2VkIGJvdGggZnJvbSB0aGUgd3JpdGUgY2FsbGJhY2sgcHJvdmlkZWQgdG8KKyAgICAqIGxpYnBuZyBhbmQgZnJvbSB0aGUgZ2VuZXJpYyByZWFkIGNvZGUuCisgICAgKi8KK3sKKyAgIC8qIFdyaXRlIHRoZSBkYXRhIGludG8gdGhlIGJ1ZmZlciwgYWRkaW5nIGJ1ZmZlcnMgYXMgcmVxdWlyZWQgKi8KKyAgIHN0cnVjdCBidWZmZXJfbGlzdCAqbGFzdCA9IGJ1ZmZlci0+bGFzdDsKKyAgIHNpemVfdCBlbmRfY291bnQgPSBidWZmZXItPmVuZF9jb3VudDsKKworICAgd2hpbGUgKHNpemUgPiAwKQorICAgeworICAgICAgc2l6ZV90IGF2YWlsOworCisgICAgICBpZiAoZW5kX2NvdW50ID49IHNpemVvZiBsYXN0LT5idWZmZXIpCisgICAgICB7CisgICAgICAgICBpZiAobGFzdC0+bmV4dCA9PSBOVUxMKQorICAgICAgICAgeworICAgICAgICAgICAgbGFzdCA9IGJ1ZmZlcl9leHRlbmQobGFzdCk7CisKKyAgICAgICAgICAgIGlmIChsYXN0ID09IE5VTEwpCisgICAgICAgICAgICAgICBkaXNwbGF5X2xvZyhkcCwgQVBQX0VSUk9SLCAib3V0IG9mIG1lbW9yeSBzYXZpbmcgZmlsZSIpOworICAgICAgICAgfQorCisgICAgICAgICBlbHNlCisgICAgICAgICAgICBsYXN0ID0gbGFzdC0+bmV4dDsKKworICAgICAgICAgYnVmZmVyLT5sYXN0ID0gbGFzdDsgLyogYXZvaWQgdGhlIG5lZWQgdG8gcmV3cml0ZSBldmVyeSB0aW1lICovCisgICAgICAgICBlbmRfY291bnQgPSAwOworICAgICAgfQorCisgICAgICBhdmFpbCA9IChzaXplb2YgbGFzdC0+YnVmZmVyKSAtIGVuZF9jb3VudDsKKyAgICAgIGlmIChhdmFpbCA+IHNpemUpCisgICAgICAgICBhdmFpbCA9IHNpemU7CisKKyAgICAgIG1lbWNweShsYXN0LT5idWZmZXIgKyBlbmRfY291bnQsIGRhdGEsIGF2YWlsKTsKKyAgICAgIGVuZF9jb3VudCArPSBhdmFpbDsKKyAgICAgIHNpemUgLT0gYXZhaWw7CisgICAgICBkYXRhICs9IGF2YWlsOworICAgfQorCisgICBidWZmZXItPmVuZF9jb3VudCA9IGVuZF9jb3VudDsKK30KKworc3RhdGljIHZvaWQgUE5HQ0JBUEkKK3dyaXRlX2Z1bmN0aW9uKHBuZ19zdHJ1Y3RwIHBwLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBzaXplKQoreworICAgYnVmZmVyX3dyaXRlKGdldF9kcChwcCksIGdldF9idWZmZXIocHApLCBkYXRhLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQKK3dyaXRlX3BuZyhzdHJ1Y3QgZGlzcGxheSAqZHAsIHBuZ19pbmZvcCBpcCwgaW50IHRyYW5zZm9ybXMpCit7CisgICBkaXNwbGF5X2NsZWFuX3dyaXRlKGRwKTsgLyogc2FmZXR5ICovCisKKyAgIGJ1ZmZlcl9zdGFydF93cml0ZSgmZHAtPndyaXR0ZW5fZmlsZSk7CisgICBkcC0+b3BlcmF0aW9uID0gIndyaXRlIjsKKyAgIGRwLT50cmFuc2Zvcm1zID0gdHJhbnNmb3JtczsKKworICAgZHAtPndyaXRlX3BwID0gcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCBkcCwKKyAgICAgIGRpc3BsYXlfZXJyb3IsIGRpc3BsYXlfd2FybmluZyk7CisKKyAgIGlmIChkcC0+d3JpdGVfcHAgPT0gTlVMTCkKKyAgICAgIGRpc3BsYXlfbG9nKGRwLCBBUFBfRVJST1IsICJmYWlsZWQgdG8gY3JlYXRlIHdyaXRlIHBuZ19zdHJ1Y3QiKTsKKworICAgcG5nX3NldF93cml0ZV9mbihkcC0+d3JpdGVfcHAsICZkcC0+d3JpdHRlbl9maWxlLCB3cml0ZV9mdW5jdGlvbiwKKyAgICAgIE5VTEwvKmZsdXNoKi8pOworCisjICBpZmRlZiBQTkdfU0VUX1VTRVJfTElNSVRTX1NVUFBPUlRFRAorICAgICAgLyogUmVtb3ZlIHRoZSB1c2VyIGxpbWl0cywgaWYgYW55ICovCisgICAgICBwbmdfc2V0X3VzZXJfbGltaXRzKGRwLT53cml0ZV9wcCwgMHg3ZmZmZmZmZiwgMHg3ZmZmZmZmZik7CisjICBlbmRpZgorCisgICAvKiBDZXJ0YWluIHRyYW5zZm9ybXMgcmVxdWlyZSB0aGUgcG5nX2luZm8gdG8gYmUgemFwcGVkIHRvIGFsbG93IHRoZQorICAgICogdHJhbnNmb3JtIHRvIHdvcmsgY29ycmVjdGx5LgorICAgICovCisgICBpZiAodHJhbnNmb3JtcyAmIChQTkdfVFJBTlNGT1JNX1BBQ0tJTkd8CisgICAgICAgICAgICAgICAgICAgICBQTkdfVFJBTlNGT1JNX1NUUklQX0ZJTExFUnwKKyAgICAgICAgICAgICAgICAgICAgIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSX0JFRk9SRSkpCisgICB7CisgICAgICBpbnQgY3QgPSBkcC0+Y29sb3JfdHlwZTsKKworICAgICAgaWYgKHRyYW5zZm9ybXMgJiAoUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVJ8CisgICAgICAgICAgICAgICAgICAgICAgICBQTkdfVFJBTlNGT1JNX1NUUklQX0ZJTExFUl9CRUZPUkUpKQorICAgICAgICAgY3QgJj0gflBOR19DT0xPUl9NQVNLX0FMUEhBOworCisgICAgICBwbmdfc2V0X0lIRFIoZHAtPndyaXRlX3BwLCBpcCwgZHAtPndpZHRoLCBkcC0+aGVpZ2h0LCBkcC0+Yml0X2RlcHRoLCBjdCwKKyAgICAgICAgIGRwLT5pbnRlcmxhY2VfbWV0aG9kLCBkcC0+Y29tcHJlc3Npb25fbWV0aG9kLCBkcC0+ZmlsdGVyX21ldGhvZCk7CisgICB9CisKKyAgIHBuZ193cml0ZV9wbmcoZHAtPndyaXRlX3BwLCBpcCwgdHJhbnNmb3JtcywgTlVMTC8qcGFyYW1zKi8pOworCisgICAvKiBDbGVhbiBpdCBvbiB0aGUgd2F5IG91dCAtIGlmIGNvbnRyb2wgcmV0dXJucyB0byB0aGUgY2FsbGVyIHRoZW4gdGhlCisgICAgKiB3cml0dGVuX2ZpbGUgY29udGFpbnMgdGhlIHJlcXVpcmVkIGRhdGEuCisgICAgKi8KKyAgIGRpc3BsYXlfY2xlYW5fd3JpdGUoZHApOworfQorI2VuZGlmIC8qIFdSSVRFX1NVUFBPUlRFRCAqLworCitzdGF0aWMgaW50Citza2lwX3RyYW5zZm9ybShzdHJ1Y3QgZGlzcGxheSAqZHAsIGludCB0cikKKyAgIC8qIEhlbHBlciB0byB0ZXN0IGZvciBhIGJhZCBjb21ibyBhbmQgbG9nIGl0IGlmIGl0IGlzIHNraXBwZWQgKi8KK3sKKyAgIGlmICgoZHAtPm9wdGlvbnMgJiBTS0lQX0JVR1MpICE9IDAgJiYgaXNfYmFkX2NvbWJvKHRyKSkKKyAgIHsKKyAgICAgIC8qIExvZyB0aGlzIHRvIHN0ZG91dCBpZiBsb2dnaW5nIGlzIG9uLCBvdGhlcndpc2UganVzdCBkbyBhbiBpbmZvcm1hdGlvbgorICAgICAgICogZGlzcGxheV9sb2cuCisgICAgICAgKi8KKyAgICAgIGlmICgoZHAtPm9wdGlvbnMgJiBMT0dfU0tJUFBFRCkgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgIHByaW50ZigiU0tJUDogJXMgdHJhbnNmb3JtcyAiLCBkcC0+ZmlsZW5hbWUpOworCisgICAgICAgICB3aGlsZSAodHIgIT0gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGludCBuZXh0ID0gZmlyc3RfdHJhbnNmb3JtKHRyKTsKKyAgICAgICAgICAgIHRyICY9IH5uZXh0OworCisgICAgICAgICAgICBwcmludGYoIiVzIiwgdHJhbnNmb3JtX25hbWUobmV4dCkpOworICAgICAgICAgICAgaWYgKHRyICE9IDApCisgICAgICAgICAgICAgICBwdXRjaGFyKCcrJyk7CisgICAgICAgICB9CisKKyAgICAgICAgIHB1dGNoYXIoJ1xuJyk7CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgICAgIGRpc3BsYXlfbG9nKGRwLCBJTkZPUk1BVElPTiwgIiVzOiBza2lwcGVkIGtub3duIGJhZCBjb21ibyAweCV4IiwKKyAgICAgICAgICAgIGRwLT5maWxlbmFtZSwgdHIpOworCisgICAgICByZXR1cm4gMTsgLyogc2tpcCAqLworICAgfQorCisgICByZXR1cm4gMDsgLyogZG9uJ3Qgc2tpcCAqLworfQorCitzdGF0aWMgdm9pZAordGVzdF9vbmVfZmlsZShzdHJ1Y3QgZGlzcGxheSAqZHAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgLyogRmlyc3QgY2FjaGUgdGhlIGZpbGUgYW5kIHVwZGF0ZSB0aGUgZGlzcGxheSBvcmlnaW5hbCBmaWxlCisgICAgKiBpbmZvcm1hdGlvbiBmb3IgdGhlIG5ldyBmaWxlLgorICAgICovCisgICBkcC0+b3BlcmF0aW9uID0gImNhY2hlIGZpbGUiOworICAgZHAtPnRyYW5zZm9ybXMgPSAwOworICAgZGlzcGxheV9jYWNoZV9maWxlKGRwLCBmaWxlbmFtZSk7CisgICB1cGRhdGVfZGlzcGxheShkcCk7CisKKyAgIC8qIEZpcnN0IHRlc3Q6IGlmIHRoZXJlIGFyZSBvcHRpb25zIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQgZm9yIHRoaXMgZmlsZQorICAgICogdmVyaWZ5IHRoYXQgdGhleSByZWFsbHkgYXJlIGlnbm9yZWQuCisgICAgKi8KKyAgIGlmIChkcC0+aWdub3JlZF90cmFuc2Zvcm1zICE9IDApCisgICB7CisgICAgICByZWFkX3BuZyhkcCwgJmRwLT5vcmlnaW5hbF9maWxlLCAiaWdub3JlZCB0cmFuc2Zvcm1zIiwKKyAgICAgICAgIGRwLT5pZ25vcmVkX3RyYW5zZm9ybXMpOworCisgICAgICAvKiBUaGUgcmVzdWx0IHNob3VsZCBiZSBpZGVudGljYWwgdG8gdGhlIG9yaWdpbmFsX3Jvd3MgKi8KKyAgICAgIGlmICghY29tcGFyZV9yZWFkKGRwLCAwLyp0cmFuc2Zvcm1zIGFwcGxpZWQqLykpCisgICAgICAgICByZXR1cm47IC8qIG5vIHBvaW50IHRlc3RpbmcgbW9yZSAqLworICAgfQorCisjaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAorICAgLyogU2Vjb25kIHRlc3Q6IHdyaXRlIHRoZSBvcmlnaW5hbCBQTkcgZGF0YSBvdXQgdG8gYSBuZXcgZmlsZSAodG8gdGVzdCB0aGUKKyAgICAqIHdyaXRlIHNpZGUpIHRoZW4gcmVhZCB0aGUgcmVzdWx0IGJhY2sgaW4gYW5kIG1ha2Ugc3VyZSB0aGF0IGl0IGhhc24ndAorICAgICogY2hhbmdlZC4KKyAgICAqLworICAgZHAtPm9wZXJhdGlvbiA9ICJ3cml0ZSI7CisgICB3cml0ZV9wbmcoZHAsIGRwLT5vcmlnaW5hbF9pcCwgMC8qdHJhbnNmb3JtcyovKTsKKyAgIHJlYWRfcG5nKGRwLCAmZHAtPndyaXR0ZW5fZmlsZSwgTlVMTCwgMC8qdHJhbnNmb3JtcyovKTsKKyAgIGlmICghY29tcGFyZV9yZWFkKGRwLCAwLyp0cmFuc2Zvcm1zIGFwcGxpZWQqLykpCisgICAgICByZXR1cm47CisjZW5kaWYKKworICAgLyogVGhpcmQgdGVzdDogdGhlIGFjdGl2ZSBvcHRpb25zLiAgVGVzdCBlYWNoIGluIHR1cm4sIG9yLCB3aXRoIHRoZQorICAgICogRVhIQVVTVElWRSBvcHRpb24sIHRlc3QgYWxsIHBvc3NpYmxlIGNvbWJpbmF0aW9ucy4KKyAgICAqLworICAgeworICAgICAgLyogVXNlIHVuc2lnbmVkIGludCBoZXJlIGJlY2F1c2UgdGhlIGNvZGUgYmVsb3cgdG8gaW5jcmVtZW50IHRocm91Z2ggYWxsCisgICAgICAgKiB0aGUgcG9zc2liaWxpdGllcyBleGhhdXN0aXZlbHkgaGFzIHRvIHVzZSBhIGNvbXBhcmUgYW5kIHRoYXQgbXVzdCBiZQorICAgICAgICogdW5zaWduZWQsIGJlY2F1c2Ugc29tZSB0cmFuc2Zvcm1zIGFyZSBuZWdhdGl2ZSBvbiBhIDE2LWJpdCBzeXN0ZW0uCisgICAgICAgKi8KKyAgICAgIHVuc2lnbmVkIGludCBhY3RpdmUgPSBkcC0+YWN0aXZlX3RyYW5zZm9ybXM7CisgICAgICBjb25zdCBpbnQgZXhoYXVzdGl2ZSA9IChkcC0+b3B0aW9ucyAmIEVYSEFVU1RJVkUpICE9IDA7CisgICAgICB1bnNpZ25lZCBpbnQgY3VycmVudCA9IGZpcnN0X3RyYW5zZm9ybShhY3RpdmUpOworICAgICAgdW5zaWduZWQgaW50IGJhZF90cmFuc2Zvcm1zID0gMDsKKyAgICAgIHVuc2lnbmVkIGludCBiYWRfY29tYm8gPSB+MFU7ICAgIC8qIGJpdHdpc2UgQU5EIG9mIGZhaWxpbmcgdHJhbnNmb3JtcyAqLworICAgICAgdW5zaWduZWQgaW50IGJhZF9jb21ib19saXN0ID0gMDsgLyogYml0d2lzZSBPUiBvZiBmYWlsdXJlcyAqLworCisgICAgICBmb3IgKDs7KQorICAgICAgeworICAgICAgICAgcmVhZF9wbmcoZHAsICZkcC0+b3JpZ2luYWxfZmlsZSwgImFjdGl2ZSB0cmFuc2Zvcm1zIiwgY3VycmVudCk7CisKKyAgICAgICAgIC8qIElmIHRoaXMgaW52b2x2ZWQgYW55IGlycmV2ZXJzaWJsZSB0cmFuc2Zvcm1hdGlvbnMgdGhlbiBpZiB3ZSB3cml0ZQorICAgICAgICAgICogaXQgb3V0IHdpdGgganVzdCB0aGUgcmV2ZXJzaWJsZSB0cmFuc2Zvcm1hdGlvbnMgYW5kIHJlYWQgaXQgaW4gYWdhaW4KKyAgICAgICAgICAqIHdpdGggdGhlIHNhbWUgdHJhbnNmb3JtcyB3ZSBzaG91bGQgZ2V0IHRoZSBzYW1lIHRoaW5nLiAgQXQgcHJlc2VudAorICAgICAgICAgICogdGhpcyBpc24ndCBkb25lIC0gaXQganVzdCBzZWVtcyBsaWtlIGEgd2FzdGUgb2YgdGltZSBhbmQgaXQgd291bGQKKyAgICAgICAgICAqIHJlcXVpcmUgdHdvIHNldHMgb2YgcmVhZCBwbmdfc3RydWN0L3BuZ19pbmZvLgorICAgICAgICAgICoKKyAgICAgICAgICAqIElmIHRoZXJlIHdlcmUgbm8gaXJyZXZlcnNpYmxlIHRyYW5zZm9ybWF0aW9ucyB0aGVuIGlmIHdlIHdyaXRlIGl0CisgICAgICAgICAgKiBvdXQgYW5kIHJlYWQgaXQgYmFjayBpbiBhZ2FpbiAod2l0aG91dCB0aGUgcmV2ZXJzaWJsZSB0cmFuc2Zvcm1zKQorICAgICAgICAgICogd2Ugc2hvdWxkIGdldCBiYWNrIHRvIHRoZSBwbGFjZSB3aGVyZSB3ZSBzdGFydGVkLgorICAgICAgICAgICovCisjaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAorICAgICAgICAgaWYgKChjdXJyZW50ICYgd3JpdGVfdHJhbnNmb3JtcykgPT0gY3VycmVudCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEFsbCB0cmFuc2Zvcm1zIHJldmVyc2libGU6IHdyaXRlIHRoZSBQTkcgd2l0aCB0aGUgdHJhbnNmb3JtYXRpb25zCisgICAgICAgICAgICAgKiByZXZlcnNlZCwgdGhlbiByZWFkIGl0IGJhY2sgaW4gd2l0aCBubyB0cmFuc2Zvcm1hdGlvbnMuICBUaGUKKyAgICAgICAgICAgICAqIHJlc3VsdCBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIG9yaWdpbmFsIGFwYXJ0IGZyb20gdGhlIGxvc3Mgb2YKKyAgICAgICAgICAgICAqIGxvdyBvcmRlciBiaXRzIGJlY2F1c2Ugb2YgdGhlIFNISUZUL3NCSVQgdHJhbnNmb3JtLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBkcC0+b3BlcmF0aW9uID0gInJldmVyc2libGUgdHJhbnNmb3JtcyI7CisgICAgICAgICAgICB3cml0ZV9wbmcoZHAsIGRwLT5yZWFkX2lwLCBjdXJyZW50KTsKKworICAgICAgICAgICAgLyogQW5kIGlmIHRoaXMgaXMgcmVhZCBiYWNrIGluLCBiZWNhdXNlIGFsbCB0aGUgdHJhbnNmb3JtYXRpb25zIHdlcmUKKyAgICAgICAgICAgICAqIHJldmVyc2libGUsIHRoZSByZXN1bHQgc2hvdWxkIGJlIHRoZSBzYW1lLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICByZWFkX3BuZyhkcCwgJmRwLT53cml0dGVuX2ZpbGUsIE5VTEwsIDApOworICAgICAgICAgICAgaWYgKCFjb21wYXJlX3JlYWQoZHAsIGN1cnJlbnQvKmZvciB0aGUgU0hJRlQvc0JJVCB0cmFuc2Zvcm0qLykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvKiBUaGlzIHNldCBvZiB0cmFuc2Zvcm1zIGZhaWxlZC4gIElmIGEgc2luZ2xlIGJpdCBpcyBzZXQgLSBpZgorICAgICAgICAgICAgICAgICogdGhlcmUgaXMganVzdCBvbmUgdHJhbnNmb3JtIC0gZG9uJ3QgaW5jbHVkZSB0aGlzIGluIGZ1cnRoZXIKKyAgICAgICAgICAgICAgICAqICdleGhhdXN0aXZlJyB0ZXN0cy4gIE5vdGljZSB0aGF0IGVhY2ggdHJhbnNmb3JtIGlzIHRlc3RlZCBvbgorICAgICAgICAgICAgICAgICogaXRzIG93biBiZWZvcmUgdGVzdGluZyBjb21ib3MgaW4gdGhlIGV4aGF1c3RpdmUgY2FzZS4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgaWYgKGlzX2NvbWJvKGN1cnJlbnQpKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgYmFkX2NvbWJvICY9IGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICBiYWRfY29tYm9fbGlzdCB8PSBjdXJyZW50OworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBiYWRfdHJhbnNmb3JtcyB8PSBjdXJyZW50OworICAgICAgICAgICAgfQorICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgIC8qIE5vdyBtb3ZlIHRvIHRoZSBuZXh0IHRyYW5zZm9ybSAqLworICAgICAgICAgaWYgKGV4aGF1c3RpdmUpIC8qIGFsbCBjb21iaW5hdGlvbnMgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBuZXh0ID0gY3VycmVudDsKKworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmIChuZXh0ID09IHJlYWRfdHJhbnNmb3JtcykgLyogRXZlcnl0aGluZyB0ZXN0ZWQgKi8KKyAgICAgICAgICAgICAgICAgIGdvdG8gY29tYm87CisKKyAgICAgICAgICAgICAgICsrbmV4dDsKKyAgICAgICAgICAgIH0gIC8qIHNraXAga25vd24gYmFkIGNvbWJvcyBpZiB0aGUgcmVsZXZhbnQgb3B0aW9uIGlzIHNldDsgc2tpcAorICAgICAgICAgICAgICAgICogY29tYm9zIGludm9sdmluZyBrbm93biBiYWQgc2luZ2xlIHRyYW5zZm9ybXMgaW4gYWxsIGNhc2VzLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICB3aGlsZSAoICAobmV4dCAmIHJlYWRfdHJhbnNmb3JtcykgPD0gY3VycmVudAorICAgICAgICAgICAgICAgICAgfHwgKG5leHQgJiBhY3RpdmUpID09IDAgLyogc2tpcCBjYXNlcyB0aGF0IGRvIG5vdGhpbmcgKi8KKyAgICAgICAgICAgICAgICAgIHx8IChuZXh0ICYgYmFkX3RyYW5zZm9ybXMpICE9IDAKKyAgICAgICAgICAgICAgICAgIHx8IHNraXBfdHJhbnNmb3JtKGRwLCBuZXh0KSk7CisKKyAgICAgICAgICAgIGFzc2VydCgobmV4dCAmIHJlYWRfdHJhbnNmb3JtcykgPT0gbmV4dCk7CisgICAgICAgICAgICBjdXJyZW50ID0gbmV4dDsKKyAgICAgICAgIH0KKworICAgICAgICAgZWxzZSAvKiBvbmUgYXQgYSB0aW1lICovCisgICAgICAgICB7CisgICAgICAgICAgICBhY3RpdmUgJj0gfmN1cnJlbnQ7CisKKyAgICAgICAgICAgIGlmIChhY3RpdmUgPT0gMCkKKyAgICAgICAgICAgICAgIGdvdG8gY29tYm87CisKKyAgICAgICAgICAgIGN1cnJlbnQgPSBmaXJzdF90cmFuc2Zvcm0oYWN0aXZlKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworY29tYm86CisgICAgICBpZiAoZHAtPm9wdGlvbnMgJiBGSU5EX0JBRF9DT01CT1MpCisgICAgICB7CisgICAgICAgICAvKiBiYWRfY29tYm9zIGlkZW50aWZpZXMgdGhlIGNvbWJvcyB0aGF0IG9jY3VyIGluIGFsbCBmYWlsaW5nIGNhc2VzOworICAgICAgICAgICogYmFkX2NvbWJvX2xpc3QgaWRlbnRpZmllcyB0cmFuc2Zvcm1zIHRoYXQgZG8gbm90IHByZXZlbnQgdGhlCisgICAgICAgICAgKiBmYWlsdXJlLgorICAgICAgICAgICovCisgICAgICAgICBpZiAoYmFkX2NvbWJvICE9IH4wVSkKKyAgICAgICAgICAgIHByaW50ZigiJXNbMHgleF06IFBST0JMRU06IDB4JXhbMHgleF0gQU5USURPVEU6IDB4JXhcbiIsCisgICAgICAgICAgICAgICBkcC0+ZmlsZW5hbWUsIGFjdGl2ZSwgYmFkX2NvbWJvLCBiYWRfY29tYm9fbGlzdCwKKyAgICAgICAgICAgICAgIHJ3X3RyYW5zZm9ybXMgJiB+YmFkX2NvbWJvX2xpc3QpOworCisgICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGYoIiVzOiBubyAlc2JhZCBjb21ib3MgZm91bmRcbiIsIGRwLT5maWxlbmFtZSwKKyAgICAgICAgICAgICAgIChkcC0+b3B0aW9ucyAmIFNLSVBfQlVHUykgPyAiYWRkaXRpb25hbCAiIDogIiIpOworICAgICAgfQorICAgfQorfQorCitzdGF0aWMgaW50Citkb190ZXN0KHN0cnVjdCBkaXNwbGF5ICpkcCwgY29uc3QgY2hhciAqZmlsZSkKKyAgIC8qIEV4aXN0cyBzb2xlbHkgdG8gaXNvbGF0ZSB0aGUgc2V0am1wIGNsb2JiZXJzICovCit7CisgICBpbnQgcmV0ID0gc2V0am1wKGRwLT5lcnJvcl9yZXR1cm4pOworCisgICBpZiAocmV0ID09IDApCisgICB7CisgICAgICB0ZXN0X29uZV9maWxlKGRwLCBmaWxlKTsKKyAgICAgIHJldHVybiAwOworICAgfQorCisgICBlbHNlIGlmIChyZXQgPCBFUlJPUlMpIC8qIHNob3VsZG4ndCBsb25nam1wIG9uIHdhcm5pbmdzICovCisgICAgICBkaXNwbGF5X2xvZyhkcCwgSU5URVJOQUxfRVJST1IsICJ1bmV4cGVjdGVkIHJldHVybiBjb2RlICVkIiwgcmV0KTsKKworICAgcmV0dXJuIHJldDsKK30KKworaW50CittYWluKGNvbnN0IGludCBhcmdjLCBjb25zdCBjaGFyICogY29uc3QgKiBjb25zdCBhcmd2KQoreworICAgLyogRm9yIGVhY2ggZmlsZSBvbiB0aGUgY29tbWFuZCBsaW5lIHRlc3QgaXQgd2l0aCBhIHJhbmdlIG9mIHRyYW5zZm9ybXMgKi8KKyAgIGludCBvcHRpb25fZW5kLCBpbG9nID0gMDsKKyAgIHN0cnVjdCBkaXNwbGF5IGQ7CisKKyAgIHZhbGlkYXRlX1QoKTsKKyAgIGRpc3BsYXlfaW5pdCgmZCk7CisKKyAgIGZvciAob3B0aW9uX2VuZD0xOyBvcHRpb25fZW5kPGFyZ2M7ICsrb3B0aW9uX2VuZCkKKyAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBhcmd2W29wdGlvbl9lbmRdOworCisgICAgICBpZiAoc3RyY21wKG5hbWUsICItLXZlcmJvc2UiKSA9PSAwKQorICAgICAgICAgZC5vcHRpb25zID0gKGQub3B0aW9ucyAmIH5MRVZFTF9NQVNLKSB8IFZFUkJPU0U7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcChuYW1lLCAiLS13YXJuaW5ncyIpID09IDApCisgICAgICAgICBkLm9wdGlvbnMgPSAoZC5vcHRpb25zICYgfkxFVkVMX01BU0spIHwgV0FSTklOR1M7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcChuYW1lLCAiLS1lcnJvcnMiKSA9PSAwKQorICAgICAgICAgZC5vcHRpb25zID0gKGQub3B0aW9ucyAmIH5MRVZFTF9NQVNLKSB8IEVSUk9SUzsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKG5hbWUsICItLXF1aWV0IikgPT0gMCkKKyAgICAgICAgIGQub3B0aW9ucyA9IChkLm9wdGlvbnMgJiB+TEVWRUxfTUFTSykgfCBRVUlFVDsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKG5hbWUsICItLWV4aGF1c3RpdmUiKSA9PSAwKQorICAgICAgICAgZC5vcHRpb25zIHw9IEVYSEFVU1RJVkU7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcChuYW1lLCAiLS1mYXN0IikgPT0gMCkKKyAgICAgICAgIGQub3B0aW9ucyAmPSB+RVhIQVVTVElWRTsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKG5hbWUsICItLXN0cmljdCIpID09IDApCisgICAgICAgICBkLm9wdGlvbnMgfD0gU1RSSUNUOworCisgICAgICBlbHNlIGlmIChzdHJjbXAobmFtZSwgIi0tcmVsYXhlZCIpID09IDApCisgICAgICAgICBkLm9wdGlvbnMgJj0gflNUUklDVDsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKG5hbWUsICItLWxvZyIpID09IDApCisgICAgICB7CisgICAgICAgICBpbG9nID0gb3B0aW9uX2VuZDsgLyogcHJldmVudCBkaXNwbGF5ICovCisgICAgICAgICBkLm9wdGlvbnMgfD0gTE9HOworICAgICAgfQorCisgICAgICBlbHNlIGlmIChzdHJjbXAobmFtZSwgIi0tbm9sb2ciKSA9PSAwKQorICAgICAgICAgZC5vcHRpb25zICY9IH5MT0c7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcChuYW1lLCAiLS1jb250aW51ZSIpID09IDApCisgICAgICAgICBkLm9wdGlvbnMgfD0gQ09OVElOVUU7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcChuYW1lLCAiLS1zdG9wIikgPT0gMCkKKyAgICAgICAgIGQub3B0aW9ucyAmPSB+Q09OVElOVUU7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcChuYW1lLCAiLS1za2lwLWJ1Z3MiKSA9PSAwKQorICAgICAgICAgZC5vcHRpb25zIHw9IFNLSVBfQlVHUzsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKG5hbWUsICItLXRlc3QtYWxsIikgPT0gMCkKKyAgICAgICAgIGQub3B0aW9ucyAmPSB+U0tJUF9CVUdTOworCisgICAgICBlbHNlIGlmIChzdHJjbXAobmFtZSwgIi0tbG9nLXNraXBwZWQiKSA9PSAwKQorICAgICAgICAgZC5vcHRpb25zIHw9IExPR19TS0lQUEVEOworCisgICAgICBlbHNlIGlmIChzdHJjbXAobmFtZSwgIi0tbm9sb2ctc2tpcHBlZCIpID09IDApCisgICAgICAgICBkLm9wdGlvbnMgJj0gfkxPR19TS0lQUEVEOworCisgICAgICBlbHNlIGlmIChzdHJjbXAobmFtZSwgIi0tZmluZC1iYWQtY29tYm9zIikgPT0gMCkKKyAgICAgICAgIGQub3B0aW9ucyB8PSBGSU5EX0JBRF9DT01CT1M7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcChuYW1lLCAiLS1ub2ZpbmQtYmFkLWNvbWJvcyIpID09IDApCisgICAgICAgICBkLm9wdGlvbnMgJj0gfkZJTkRfQkFEX0NPTUJPUzsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKG5hbWUsICItLWxpc3QtY29tYm9zIikgPT0gMCkKKyAgICAgICAgIGQub3B0aW9ucyB8PSBMSVNUX0NPTUJPUzsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKG5hbWUsICItLW5vbGlzdC1jb21ib3MiKSA9PSAwKQorICAgICAgICAgZC5vcHRpb25zICY9IH5MSVNUX0NPTUJPUzsKKworICAgICAgZWxzZSBpZiAobmFtZVswXSA9PSAnLScgJiYgbmFtZVsxXSA9PSAnLScpCisgICAgICB7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInBuZ2ltYWdlOiAlczogdW5rbm93biBvcHRpb25cbiIsIG5hbWUpOworICAgICAgICAgcmV0dXJuIDk5OworICAgICAgfQorCisgICAgICBlbHNlCisgICAgICAgICBicmVhazsgLyogTm90IGFuIG9wdGlvbiAqLworICAgfQorCisgICB7CisgICAgICBpbnQgaTsKKyAgICAgIGludCBlcnJvcnMgPSAwOworCisgICAgICBmb3IgKGk9b3B0aW9uX2VuZDsgaTxhcmdjOyArK2kpCisgICAgICB7CisgICAgICAgICB7CisgICAgICAgICAgICBpbnQgcmV0ID0gZG9fdGVzdCgmZCwgYXJndltpXSk7CisKKyAgICAgICAgICAgIGlmIChyZXQgPiBRVUlFVCkgLyogYWJvcnQgb24gdXNlciBvciBpbnRlcm5hbCBlcnJvciAqLworICAgICAgICAgICAgICAgcmV0dXJuIDk5OworICAgICAgICAgfQorCisgICAgICAgICAvKiBIZXJlIG9uIGFueSByZXR1cm4sIGluY2x1ZGluZyBmYWlsdXJlcywgZXhjZXB0IHVzZXIvaW50ZXJuYWwgaXNzdWVzCisgICAgICAgICAgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBwYXNzID0gKGQub3B0aW9ucyAmIFNUUklDVCkgPworICAgICAgICAgICAgICAgUkVTVUxUX1NUUklDVChkLnJlc3VsdHMpIDogUkVTVUxUX1JFTEFYRUQoZC5yZXN1bHRzKTsKKworICAgICAgICAgICAgaWYgKCFwYXNzKQorICAgICAgICAgICAgICAgKytlcnJvcnM7CisKKyAgICAgICAgICAgIGlmIChkLm9wdGlvbnMgJiBMT0cpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpbnQgajsKKworICAgICAgICAgICAgICAgcHJpbnRmKCIlczogcG5naW1hZ2UgIiwgcGFzcyA/ICJQQVNTIiA6ICJGQUlMIik7CisKKyAgICAgICAgICAgICAgIGZvciAoaj0xOyBqPG9wdGlvbl9lbmQ7ICsraikgaWYgKGogIT0gaWxvZykKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIiwgYXJndltqXSk7CisKKyAgICAgICAgICAgICAgIHByaW50ZigiJXNcbiIsIGQuZmlsZW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICBkaXNwbGF5X2NsZWFuKCZkKTsKKyAgICAgIH0KKworICAgICAgLyogUmVsZWFzZSBhbGxvY2F0ZWQgbWVtb3J5ICovCisgICAgICBkaXNwbGF5X2Rlc3Ryb3koJmQpOworCisgICAgICByZXR1cm4gZXJyb3JzICE9IDA7CisgICB9Cit9CisjZWxzZSAvKiAhSU5GT19JTUFHRSB8fCAhU0VRVUVOVElBTF9SRUFEIHx8ICFSRUFEX1BORyovCitpbnQKK21haW4odm9pZCkKK3sKKyAgIGZwcmludGYoc3RkZXJyLCAicG5naW1hZ2U6IG5vIHN1cHBvcnQgZm9yIHBuZ19yZWFkL3dyaXRlX2ltYWdlXG4iKTsKKyAgIHJldHVybiA3NzsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicG5nL2NvbnRyaWIvbGlidGVzdHMvcG5nc3Rlc3QtZXJyb3JzLmggYi9saWJwbmcvY29udHJpYi9saWJ0ZXN0cy9wbmdzdGVzdC1lcnJvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzU2ZjFjCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvbGlidGVzdHMvcG5nc3Rlc3QtZXJyb3JzLmgKQEAgLTAsMCArMSwxNjUgQEAKKy8qIGNvbnRyaWIvbGlidGVzdHMvcG5nc3Rlc3QtZXJyb3JzLmgKKyAqCisgKiBCVUlMVCBVU0lORzogbGlicG5nIHZlcnNpb24gMS42LjE5YmV0YTAzIC0gU2VwdGVtYmVyIDI1LCAyMDE1CisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCisgKgorICogVEhJUyBJUyBBIE1BQ0hJTkUgR0VORVJBVEVEIEZJTEU6IGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5IQorICogSW5zdGVhZCBydW46CisgKgorICogICAgcG5nc3Rlc3QgLS1hY2N1bXVsYXRlCisgKgorICogb24gYXMgbWFueSBQTkcgZmlsZXMgYXMgcG9zc2libGU7IGF0IGxlYXN0IFBOR1N1aXRlIGFuZAorICogY29udHJpYi9saWJ0ZXN0cy90ZXN0cG5ncy4KKyAqLworc3RhdGljIHBuZ191aW50XzE2IGdwY19lcnJvclsxNi8qaW4qL11bMTYvKm91dCovXVs0LyphKi9dID0KK3sKKyB7IC8qIGlucHV0OiBzUkdCLWdyYXkgKi8KKyAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sCisgIHsgMCwgMCwgMzcyLCAwIH0sIHsgMCwgMCwgMzcyLCAwIH0sIHsgMCwgMCwgMzcyLCAwIH0sIHsgMCwgMCwgMzcyLCAwIH0sCisgIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LAorICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfQorIH0sIHsgLyogaW5wdXQ6IHNSR0ItZ3JheSthbHBoYSAqLworICB7IDAsIDE5LCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDIwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LAorICB7IDAsIDg5NywgNzg4LCAwIH0sIHsgMCwgODk3LCA3ODgsIDAgfSwgeyAwLCA4OTcsIDc4OCwgMCB9LCB7IDAsIDg5NywgNzg4LCAwIH0sCisgIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LAorICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfQorIH0sIHsgLyogaW5wdXQ6IHNSR0ItcmdiICovCisgIHsgMCwgMCwgMTksIDAgfSwgeyAwLCAwLCAxOSwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sCisgIHsgMCwgMCwgODkzLCAwIH0sIHsgMCwgMCwgODkzLCAwIH0sIHsgMCwgMCwgODExLCAwIH0sIHsgMCwgMCwgODExLCAwIH0sCisgIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LAorICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfQorIH0sIHsgLyogaW5wdXQ6IHNSR0ItcmdiK2FscGhhICovCisgIHsgMCwgMTYsIDE3LCAwIH0sIHsgMCwgMTcsIDE3LCAwIH0sIHsgMCwgMTksIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sCisgIHsgMCwgODUwLCA4NzUsIDAgfSwgeyAwLCA4NTAsIDg3NSwgMCB9LCB7IDAsIDg5NywgNzg4LCAwIH0sIHsgMCwgODk3LCA3ODgsIDAgfSwKKyAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sCisgIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9CisgfSwgeyAvKiBpbnB1dDogbGluZWFyLWdyYXkgKi8KKyAgeyAwLCAwLCA5LCAwIH0sIHsgMCwgMCwgOSwgMCB9LCB7IDAsIDAsIDksIDAgfSwgeyAwLCAwLCA5LCAwIH0sCisgIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LAorICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwKKyAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0KKyB9LCB7IC8qIGlucHV0OiBsaW5lYXItZ3JheSthbHBoYSAqLworICB7IDAsIDc0LCA5LCAwIH0sIHsgMCwgMjAsIDksIDAgfSwgeyAwLCA3NCwgOSwgMCB9LCB7IDAsIDIwLCA5LCAwIH0sCisgIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDEsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMSwgMCwgMCB9LAorICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwKKyAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0KKyB9LCB7IC8qIGlucHV0OiBsaW5lYXItcmdiICovCisgIHsgMCwgMCwgOSwgMCB9LCB7IDAsIDAsIDksIDAgfSwgeyAwLCAwLCA5LCAwIH0sIHsgMCwgMCwgOSwgMCB9LAorICB7IDAsIDAsIDQsIDAgfSwgeyAwLCAwLCA0LCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwKKyAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sCisgIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9CisgfSwgeyAvKiBpbnB1dDogbGluZWFyLXJnYithbHBoYSAqLworICB7IDAsIDEyNiwgMTQzLCAwIH0sIHsgMCwgMTEsIDcsIDAgfSwgeyAwLCA3NCwgOSwgMCB9LCB7IDAsIDE3LCA5LCAwIH0sCisgIHsgMCwgNCwgNCwgMCB9LCB7IDAsIDUsIDQsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMSwgMCwgMCB9LAorICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwKKyAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0KKyB9LCB7IC8qIGlucHV0OiBjb2xvci1tYXBwZWQtc1JHQi1ncmF5ICovCisgIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LAorICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwKKyAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sCisgIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9CisgfSwgeyAvKiBpbnB1dDogY29sb3ItbWFwcGVkLXNSR0ItZ3JheSthbHBoYSAqLworICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwKKyAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sCisgIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LAorICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfQorIH0sIHsgLyogaW5wdXQ6IGNvbG9yLW1hcHBlZC1zUkdCLXJnYiAqLworICB7IDAsIDAsIDEzLCAwIH0sIHsgMCwgMCwgMTMsIDAgfSwgeyAwLCAwLCA5LCAwIH0sIHsgMCwgMCwgOSwgMCB9LAorICB7IDAsIDAsIDY3MywgMCB9LCB7IDAsIDAsIDY3MywgMCB9LCB7IDAsIDAsIDY3NCwgMCB9LCB7IDAsIDAsIDY3NCwgMCB9LAorICB7IDAsIDAsIDEsIDAgfSwgeyAwLCAwLCAxLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwKKyAgeyAwLCAwLCA0NjAsIDAgfSwgeyAwLCAwLCA0NjAsIDAgfSwgeyAwLCAwLCAyNjMsIDAgfSwgeyAwLCAwLCAyNjMsIDAgfQorIH0sIHsgLyogaW5wdXQ6IGNvbG9yLW1hcHBlZC1zUkdCLXJnYithbHBoYSAqLworICB7IDAsIDYsIDgsIDAgfSwgeyAwLCA3LCA4LCAwIH0sIHsgMCwgNzUsIDksIDAgfSwgeyAwLCA5LCA5LCAwIH0sCisgIHsgMCwgNTg1LCA0MjcsIDAgfSwgeyAwLCA1ODUsIDQyNywgMCB9LCB7IDAsIDcxNywgNTE0LCAwIH0sIHsgMCwgNzE3LCA1MTQsIDAgfSwKKyAgeyAwLCAxLCAxLCAwIH0sIHsgMCwgMSwgMSwgMCB9LCB7IDAsIDEsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sCisgIHsgMCwgMTMzMjMsIDQ2MCwgMCB9LCB7IDAsIDQyNywgNDYwLCAwIH0sIHsgMCwgMTY0ODAsIDI2MywgMCB9LCB7IDAsIDI0MywgMjYzLCAwIH0KKyB9LCB7IC8qIGlucHV0OiBjb2xvci1tYXBwZWQtbGluZWFyLWdyYXkgKi8KKyAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sCisgIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LAorICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwKKyAgeyAwLCAwLCAyODIsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfQorIH0sIHsgLyogaW5wdXQ6IGNvbG9yLW1hcHBlZC1saW5lYXItZ3JheSthbHBoYSAqLworICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwKKyAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sCisgIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LAorICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAyNTMsIDI4MiwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0KKyB9LCB7IC8qIGlucHV0OiBjb2xvci1tYXBwZWQtbGluZWFyLXJnYiAqLworICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwKKyAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sCisgIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LAorICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMjY1LCAwIH0sIHsgMCwgMCwgMCwgMCB9CisgfSwgeyAvKiBpbnB1dDogY29sb3ItbWFwcGVkLWxpbmVhci1yZ2IrYWxwaGEgKi8KKyAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sCisgIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LAorICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwKKyAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAyNDMsIDI2NSwgMCB9CisgfQorfTsKK3N0YXRpYyBwbmdfdWludF8xNiBncGNfZXJyb3JfdmlhX2xpbmVhclsxNl1bNC8qb3V0Ki9dWzRdID0KK3sKKyB7IC8qIGlucHV0OiBzUkdCLWdyYXkgKi8KKyAgeyAwLCAwLCA3LCAwIH0sIHsgMCwgMCwgNywgMCB9LCB7IDAsIDAsIDcsIDAgfSwgeyAwLCAwLCA3LCAwIH0KKyB9LCB7IC8qIGlucHV0OiBzUkdCLWdyYXkrYWxwaGEgKi8KKyAgeyAwLCAxNSwgMTUsIDAgfSwgeyAwLCAxODYsIDE1LCAwIH0sIHsgMCwgMTUsIDE1LCAwIH0sIHsgMCwgMTg2LCAxNSwgMCB9CisgfSwgeyAvKiBpbnB1dDogc1JHQi1yZ2IgKi8KKyAgeyAwLCAwLCAyMCwgMCB9LCB7IDAsIDAsIDIwLCAwIH0sIHsgMCwgMCwgMTUsIDAgfSwgeyAwLCAwLCAxNSwgMCB9CisgfSwgeyAvKiBpbnB1dDogc1JHQi1yZ2IrYWxwaGEgKi8KKyAgeyAwLCAxNiwgMTcsIDAgfSwgeyAwLCAxODcsIDE3LCAwIH0sIHsgMCwgMTUsIDE1LCAwIH0sIHsgMCwgMTg2LCAxNSwgMCB9CisgfSwgeyAvKiBpbnB1dDogbGluZWFyLWdyYXkgKi8KKyAgeyAwLCAwLCAxLCAwIH0sIHsgMCwgMCwgMSwgMCB9LCB7IDAsIDAsIDEsIDAgfSwgeyAwLCAwLCAxLCAwIH0KKyB9LCB7IC8qIGlucHV0OiBsaW5lYXItZ3JheSthbHBoYSAqLworICB7IDAsIDEsIDEsIDAgfSwgeyAwLCAxLCAxLCAwIH0sIHsgMCwgMSwgMSwgMCB9LCB7IDAsIDEsIDEsIDAgfQorIH0sIHsgLyogaW5wdXQ6IGxpbmVhci1yZ2IgKi8KKyAgeyAwLCAwLCAxLCAwIH0sIHsgMCwgMCwgMSwgMCB9LCB7IDAsIDAsIDEsIDAgfSwgeyAwLCAwLCAxLCAwIH0KKyB9LCB7IC8qIGlucHV0OiBsaW5lYXItcmdiK2FscGhhICovCisgIHsgMCwgMSwgMSwgMCB9LCB7IDAsIDksIDEsIDAgfSwgeyAwLCAxLCAxLCAwIH0sIHsgMCwgMSwgMSwgMCB9CisgfSwgeyAvKiBpbnB1dDogY29sb3ItbWFwcGVkLXNSR0ItZ3JheSAqLworICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfQorIH0sIHsgLyogaW5wdXQ6IGNvbG9yLW1hcHBlZC1zUkdCLWdyYXkrYWxwaGEgKi8KKyAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0KKyB9LCB7IC8qIGlucHV0OiBjb2xvci1tYXBwZWQtc1JHQi1yZ2IgKi8KKyAgeyAwLCAwLCAxMywgMCB9LCB7IDAsIDAsIDEzLCAwIH0sIHsgMCwgMCwgMTQsIDAgfSwgeyAwLCAwLCAxNCwgMCB9CisgfSwgeyAvKiBpbnB1dDogY29sb3ItbWFwcGVkLXNSR0ItcmdiK2FscGhhICovCisgIHsgMCwgNCwgOCwgMCB9LCB7IDAsIDksIDgsIDAgfSwgeyAwLCA5LCA1LCAwIH0sIHsgMCwgMzIsIDUsIDAgfQorIH0sIHsgLyogaW5wdXQ6IGNvbG9yLW1hcHBlZC1saW5lYXItZ3JheSAqLworICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfQorIH0sIHsgLyogaW5wdXQ6IGNvbG9yLW1hcHBlZC1saW5lYXItZ3JheSthbHBoYSAqLworICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfQorIH0sIHsgLyogaW5wdXQ6IGNvbG9yLW1hcHBlZC1saW5lYXItcmdiICovCisgIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9CisgfSwgeyAvKiBpbnB1dDogY29sb3ItbWFwcGVkLWxpbmVhci1yZ2IrYWxwaGEgKi8KKyAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0KKyB9Cit9Oworc3RhdGljIHBuZ191aW50XzE2IGdwY19lcnJvcl90b19jb2xvcm1hcFs4LyppKi9dWzgvKm8qL11bNF0gPQoreworIHsgLyogaW5wdXQ6IHNSR0ItZ3JheSAqLworICB7IDAsIDAsIDksIDAgfSwgeyAwLCAwLCA5LCAwIH0sIHsgMCwgMCwgOSwgMCB9LCB7IDAsIDAsIDksIDAgfSwKKyAgeyAwLCAwLCA1NjAsIDAgfSwgeyAwLCAwLCA1NjAsIDAgfSwgeyAwLCAwLCA1NjAsIDAgfSwgeyAwLCAwLCA1NjAsIDAgfQorIH0sIHsgLyogaW5wdXQ6IHNSR0ItZ3JheSthbHBoYSAqLworICB7IDAsIDE5LCA5LCAwIH0sIHsgMCwgMjU1LCA5LCAyNSB9LCB7IDAsIDg4LCA5LCAwIH0sIHsgMCwgMjU1LCA5LCAyNSB9LAorICB7IDAsIDEwMTIsIDkyOCwgMCB9LCB7IDAsIDE2MDI2LCA5MjgsIDY0MjUgfSwgeyAwLCAxMDEyLCA5MjgsIDAgfSwgeyAwLCAxNjAyNiwgOTI4LCA2NDI1IH0KKyB9LCB7IC8qIGlucHV0OiBzUkdCLXJnYiAqLworICB7IDAsIDAsIDE5LCAwIH0sIHsgMCwgMCwgMTksIDAgfSwgeyAwLCAwLCAyNSwgMCB9LCB7IDAsIDAsIDI1LCAwIH0sCisgIHsgMCwgMCwgOTYyLCAwIH0sIHsgMCwgMCwgOTYyLCAwIH0sIHsgMCwgMCwgMTM2NzcsIDAgfSwgeyAwLCAwLCAxMzY3NywgMCB9CisgfSwgeyAvKiBpbnB1dDogc1JHQi1yZ2IrYWxwaGEgKi8KKyAgeyAwLCA2MywgNzcsIDAgfSwgeyAwLCAyNTUsIDE5LCAyNSB9LCB7IDAsIDIyNSwgMjUsIDAgfSwgeyAwLCAyNTUsIDI1LCA2NyB9LAorICB7IDAsIDE3NTM0LCAxODQ5MSwgMCB9LCB7IDAsIDE1NzM2LCAyODI0LCA2NDI1IH0sIHsgMCwgMTQwMTksIDEzNjc3LCAwIH0sIHsgMCwgNTAxMTUsIDEzNjc3LCAxNzIxOSB9CisgfSwgeyAvKiBpbnB1dDogbGluZWFyLWdyYXkgKi8KKyAgeyAwLCAwLCA3MywgMCB9LCB7IDAsIDAsIDczLCAwIH0sIHsgMCwgMCwgNzMsIDAgfSwgeyAwLCAwLCA3MywgMCB9LAorICB7IDAsIDAsIDE4ODE3LCAwIH0sIHsgMCwgMCwgMTg4MTcsIDAgfSwgeyAwLCAwLCAxODgxNywgMCB9LCB7IDAsIDAsIDE4ODE3LCAwIH0KKyB9LCB7IC8qIGlucHV0OiBsaW5lYXItZ3JheSthbHBoYSAqLworICB7IDAsIDc0LCA3NCwgMCB9LCB7IDAsIDI1NSwgNzQsIDI1IH0sIHsgMCwgOTksIDc0LCAwIH0sIHsgMCwgMjU1LCA3NCwgMjUgfSwKKyAgeyAwLCAxODkxOSwgMTg5MDcsIDAgfSwgeyAwLCAyNDU0OSwgMTg5MDcsIDY1NTMgfSwgeyAwLCAxODkxOSwgMTg5MDcsIDAgfSwgeyAwLCAyNDU0OSwgMTg5MDcsIDY1NTMgfQorIH0sIHsgLyogaW5wdXQ6IGxpbmVhci1yZ2IgKi8KKyAgeyAwLCAwLCA3MywgMCB9LCB7IDAsIDAsIDczLCAwIH0sIHsgMCwgMCwgOTgsIDAgfSwgeyAwLCAwLCA5OCwgMCB9LAorICB7IDAsIDAsIDE4NjY0LCAwIH0sIHsgMCwgMCwgMTg2NjQsIDAgfSwgeyAwLCAwLCAyNDk5OCwgMCB9LCB7IDAsIDAsIDI0OTk4LCAwIH0KKyB9LCB7IC8qIGlucHV0OiBsaW5lYXItcmdiK2FscGhhICovCisgIHsgMCwgMTgxLCAxOTYsIDAgfSwgeyAwLCAyNTUsIDYxLCAyNSB9LCB7IDIwNiwgMTg3LCA5OCwgMCB9LCB7IDAsIDI1NSwgOTgsIDY3IH0sCisgIHsgMCwgMTgxNDEsIDE4MTM3LCAwIH0sIHsgMCwgMTc0OTQsIDE3NTA0LCA2NTUzIH0sIHsgMCwgMjQ5NzksIDI0OTkyLCAwIH0sIHsgMCwgNDkxNzIsIDI0OTkyLCAxNzM0NyB9CisgfQorfTsKKy8qIEVORCBNQUNISU5FIEdFTkVSQVRFRCAqLwpkaWZmIC0tZ2l0IGEvbGlicG5nL2NvbnRyaWIvbGlidGVzdHMvcG5nc3Rlc3QuYyBiL2xpYnBuZy9jb250cmliL2xpYnRlc3RzL3BuZ3N0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM3NGM3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL2xpYnRlc3RzL3BuZ3N0ZXN0LmMKQEAgLTAsMCArMSwzNzIyIEBACisvKi0KKyAqIHBuZ3N0ZXN0LmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSBKb2huIEN1bm5pbmdoYW0gQm93bGVyCisgKgorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMTkgWyhQRU5ESU5HIFJFTEVBU0UpXQorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisgKiBhbmQgbGljZW5zZSBpbiBwbmcuaAorICoKKyAqIFRlc3QgZm9yIHRoZSBQTkcgJ3NpbXBsaWZpZWQnIEFQSXMuCisgKi8KKyNkZWZpbmUgX0lTT0M5MF9TT1VSQ0UgMQorI2RlZmluZSBNQUxMT0NfQ0hFQ0tfIDIvKmdsaWJjIGZhY2lsaXR5OiB0dXJuIG9uIGRlYnVnZ2luZyovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpZiBkZWZpbmVkKEhBVkVfQ09ORklHX0gpICYmICFkZWZpbmVkKFBOR19OT19DT05GSUdfSCkKKyMgIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKy8qIERlZmluZSB0aGUgZm9sbG93aW5nIHRvIHVzZSB0aGlzIHRlc3QgYWdhaW5zdCB5b3VyIGluc3RhbGxlZCBsaWJwbmcsIHJhdGhlcgorICogdGhhbiB0aGUgb25lIGJlaW5nIGJ1aWx0IGhlcmU6CisgKi8KKyNpZmRlZiBQTkdfRlJFRVNUQU5ESU5HX1RFU1RTCisjICBpbmNsdWRlIDxwbmcuaD4KKyNlbHNlCisjICBpbmNsdWRlICIuLi8uLi9wbmcuaCIKKyNlbmRpZgorCisjaWZkZWYgUE5HX1NJTVBMSUZJRURfUkVBRF9TVVBQT1JURUQgLyogRWxzZSBub3RoaW5nIGNhbiBiZSBkb25lICovCisjaW5jbHVkZSAiLi4vdG9vbHMvc1JHQi5oIgorCisvKiBLTk9XTiBJU1NVRVMKKyAqCisgKiBUaGVzZSBkZWZpbmVzIHN3aXRjaCBvbiBhbHRlcm5hdGUgYWxnb3JpdGhtcyBmb3IgZm9ybWF0IGNvbnZlcnNpb25zIHRvIG1hdGNoCisgKiB0aGUgY3VycmVudCBsaWJwbmcgaW1wbGVtZW50YXRpb247IHRoZXkgYXJlIHNldCB0byBhbGxvdyBwbmdzdGVzdCB0byBwYXNzCisgKiBldmVuIHRob3VnaCBsaWJwbmcgaXMgcHJvZHVjaW5nIGFuc3dlcnMgdGhhdCBhcmUgbm90IGFzIGNvcnJlY3QgYXMgdGhleQorICogc2hvdWxkIGJlLgorICovCisjZGVmaW5lIEFMTE9XX1VOVVNFRF9HUEMgMAorICAgLyogSWYgdHJ1ZSBpbmNsdWRlIHVudXNlZCBzdGF0aWMgR1BDIGZ1bmN0aW9ucyBhbmQgZGVjbGFyZSBhbiBleHRlcm5hbCBhcnJheQorICAgICogb2YgdGhlbSB0byBoaWRlIHRoZSBmYWN0IHRoYXQgdGhleSBhcmUgdW51c2VkLiAgVGhpcyBpcyBmb3IgZGV2ZWxvcG1lbnQKKyAgICAqIHVzZSB3aGlsZSB0ZXN0aW5nIHRoZSBjb3JyZWN0IGZ1bmN0aW9uIHRvIHVzZSB0byB0YWtlIGludG8gYWNjb3VudCBsaWJwbmcKKyAgICAqIG1pc2JlaGF2aW9yLCBzdWNoIGFzIHVzaW5nIGEgc2ltcGxlIHBvd2VyIGxhdyB0byBjb3JyZWN0IHNSR0IgdG8gbGluZWFyLgorICAgICovCisKKy8qIFRoZSBmb2xsb3dpbmcgaXMgdG8gc3VwcG9ydCBkaXJlY3QgY29tcGlsYXRpb24gb2YgdGhpcyBmaWxlIGFzIEMrKyAqLworI2lmZGVmIF9fY3BsdXNwbHVzCisjICBkZWZpbmUgdm9pZGNhc3QodHlwZSwgdmFsdWUpIHN0YXRpY19jYXN0PHR5cGU+KHZhbHVlKQorIyAgZGVmaW5lIGFsaWduY2FzdGNvbnN0KHR5cGUsIHZhbHVlKSBcCisgICAgICBzdGF0aWNfY2FzdDx0eXBlPihzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4odmFsdWUpKQorI2Vsc2UKKyMgIGRlZmluZSB2b2lkY2FzdCh0eXBlLCB2YWx1ZSkgKHZhbHVlKQorIyAgZGVmaW5lIGFsaWduY2FzdGNvbnN0KHR5cGUsIHZhbHVlKSAoKGNvbnN0IHZvaWQqKSh2YWx1ZSkpCisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyogRHVyaW5nIHBhcmFsbGVsIHJ1bnMgb2YgcG5nc3Rlc3QgZWFjaCB0ZW1wb3JhcnkgZmlsZSBuZWVkcyBhIHVuaXF1ZSBuYW1lLAorICogdGhpcyBpcyB1c2VkIHRvIHBlcm1pdCB1bmlxdWVuZXNzIHVzaW5nIGEgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHdoaWNoIGNhbiBiZQorICogdXAgdG8gMjIgY2hhcmFjdGVycyBsb25nLgorICovCitzdGF0aWMgY2hhciB0bXBmWzIzXSA9ICJUTVAiOworCisvKiBHZW5lcmF0ZSByYW5kb20gYnl0ZXMuICBUaGlzIHVzZXMgYSBib3JpbmcgcmVwZWF0YWJsZSBhbGdvcml0aG0gYW5kIGl0CisgKiBpcyBpbXBsZW1lbnRlZCBoZXJlIHNvIHRoYXQgaXQgZ2l2ZXMgdGhlIHNhbWUgc2V0IG9mIG51bWJlcnMgb24gZXZlcnkKKyAqIGFyY2hpdGVjdHVyZS4gIEl0J3MgYSBsaW5lYXIgY29uZ3J1ZW50aWFsIGdlbmVyYXRvciAoS251dGggb3IgU2VkZ2V3aWNrCisgKiAiQWxnb3JpdGhtcyIpIGJ1dCBpdCBjb21lcyBmcm9tIHRoZSAnZmVlZGJhY2sgdGFwcycgdGFibGUgaW4gSG9yb3dpdHogYW5kCisgKiBIaWxsLCAiVGhlIEFydCBvZiBFbGVjdHJvbmljcyIuCisgKi8KK3N0YXRpYyB2b2lkCittYWtlX3JhbmRvbV9ieXRlcyhwbmdfdWludF8zMiogc2VlZCwgdm9pZCogcHYsIHNpemVfdCBzaXplKQoreworICAgcG5nX3VpbnRfMzIgdTAgPSBzZWVkWzBdLCB1MSA9IHNlZWRbMV07CisgICBwbmdfYnl0ZXAgYnl0ZXMgPSB2b2lkY2FzdChwbmdfYnl0ZXAsIHB2KTsKKworICAgLyogVGhlcmUgYXJlIHRoaXJ0eSB0aHJlZSBiaXRzLCB0aGUgbmV4dCBiaXQgaW4gdGhlIHNlcXVlbmNlIGlzIGJpdC0zMyBYT1IKKyAgICAqIGJpdC0yMC4gIFRoZSB0b3AgMSBiaXQgaXMgaW4gdTEsIHRoZSBib3R0b20gMzIgYXJlIGluIHUwLgorICAgICovCisgICBzaXplX3QgaTsKKyAgIGZvciAoaT0wOyBpPHNpemU7ICsraSkKKyAgIHsKKyAgICAgIC8qIEZpcnN0IGdlbmVyYXRlIDggbmV3IGJpdHMgdGhlbiBzaGlmdCB0aGVtIGluIGF0IHRoZSBlbmQuICovCisgICAgICBwbmdfdWludF8zMiB1ID0gKCh1MCA+PiAoMjAtOCkpIF4gKCh1MSA8PCA3KSB8ICh1MCA+PiAoMzItNykpKSkgJiAweGZmOworICAgICAgdTEgPDw9IDg7CisgICAgICB1MSB8PSB1MCA+PiAyNDsKKyAgICAgIHUwIDw8PSA4OworICAgICAgdTAgfD0gdTsKKyAgICAgICpieXRlcysrID0gKHBuZ19ieXRlKXU7CisgICB9CisKKyAgIHNlZWRbMF0gPSB1MDsKKyAgIHNlZWRbMV0gPSB1MTsKK30KKworc3RhdGljIHZvaWQKK3JhbmRvbV9jb2xvcihwbmdfY29sb3JwIGNvbG9yKQoreworICAgc3RhdGljIHBuZ191aW50XzMyIGNvbG9yX3NlZWRbMl0gPSB7IDB4MTIzNDU2NzgsIDB4OWFiY2RlZiB9OworICAgbWFrZV9yYW5kb21fYnl0ZXMoY29sb3Jfc2VlZCwgY29sb3IsIHNpemVvZiAqY29sb3IpOworfQorCisvKiBNYXRoIHN1cHBvcnQgLSBuZWl0aGVyIEN5Z3dpbiBub3IgVmlzdWFsIFN0dWRpbyBoYXZlIEM5OSBzdXBwb3J0IGFuZCB3ZSBuZWVkCisgKiBhIHByZWRpY3RhYmxlIHJvdW5kaW5nIGZ1bmN0aW9uLCBzbyBtYWtlIG9uZSBoZXJlOgorICovCitzdGF0aWMgZG91YmxlCitjbG9zZXN0aW50ZWdlcihkb3VibGUgeCkKK3sKKyAgIHJldHVybiBmbG9vcih4ICsgLjUpOworfQorCisvKiBDYXN0IHN1cHBvcnQ6IHJlbW92ZSBHQ0Mgd2hpbmVzLiAqLworc3RhdGljIHBuZ19ieXRlCit1OGQoZG91YmxlIGQpCit7CisgICBkID0gY2xvc2VzdGludGVnZXIoZCk7CisgICByZXR1cm4gKHBuZ19ieXRlKWQ7Cit9CisKK3N0YXRpYyBwbmdfdWludF8xNgordTE2ZChkb3VibGUgZCkKK3sKKyAgIGQgPSBjbG9zZXN0aW50ZWdlcihkKTsKKyAgIHJldHVybiAocG5nX3VpbnRfMTYpZDsKK30KKworLyogc1JHQiBzdXBwb3J0OiB1c2UgZXhhY3QgY2FsY3VsYXRpb25zIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgaW50LCBzZWUgdGhlCisgKiBmZXNldHJvdW5kKCkgY2FsbCBpbiBtYWluKCkuICBzUkdCX3RvX2Qgb3B0aW1pemVzIHRoZSA4IHRvIDE2LWJpdCBjb252ZXJzaW9uLgorICovCitzdGF0aWMgZG91YmxlIHNSR0JfdG9fZFsyNTZdOworc3RhdGljIGRvdWJsZSBnMjJfdG9fZFsyNTZdOworCitzdGF0aWMgdm9pZAoraW5pdF9zUkdCX3RvX2Qodm9pZCkKK3sKKyAgIGludCBpOworCisgICBzUkdCX3RvX2RbMF0gPSAwOworICAgZm9yIChpPTE7IGk8MjU1OyArK2kpCisgICAgICBzUkdCX3RvX2RbaV0gPSBsaW5lYXJfZnJvbV9zUkdCKGkvMjU1Lik7CisgICBzUkdCX3RvX2RbMjU1XSA9IDE7CisKKyAgIGcyMl90b19kWzBdID0gMDsKKyAgIGZvciAoaT0xOyBpPDI1NTsgKytpKQorICAgICAgZzIyX3RvX2RbaV0gPSBwb3coaS8yNTUuLCAxLy40NTQ1NSk7CisgICBnMjJfdG9fZFsyNTVdID0gMTsKK30KKworc3RhdGljIHBuZ19ieXRlCitzUkdCKGRvdWJsZSBsaW5lYXIgLypyYW5nZSAwLjAgLi4gMS4wKi8pCit7CisgICByZXR1cm4gdThkKDI1NSAqIHNSR0JfZnJvbV9saW5lYXIobGluZWFyKSk7Cit9CisKK3N0YXRpYyBwbmdfYnl0ZQoraXNSR0IoaW50IGZpeGVkX2xpbmVhcikKK3sKKyAgIHJldHVybiBzUkdCKGZpeGVkX2xpbmVhciAvIDY1NTM1Lik7Cit9CisKKyNpZiAwIC8qIG5vdCB1c2VkICovCitzdGF0aWMgcG5nX2J5dGUKK3VucHJlbXVsdGlwbHkoaW50IGNvbXBvbmVudCwgaW50IGFscGhhKQoreworICAgaWYgKGFscGhhIDw9IGNvbXBvbmVudCkKKyAgICAgIHJldHVybiAyNTU7IC8qIEFyYml0cmFyeSwgYnV0IGNvbnNpc3RlbnQgd2l0aCB0aGUgbGlicG5nIGNvZGUgKi8KKworICAgZWxzZSBpZiAoYWxwaGEgPj0gNjU1MzUpCisgICAgICByZXR1cm4gaXNSR0IoY29tcG9uZW50KTsKKworICAgZWxzZQorICAgICAgcmV0dXJuIHNSR0IoKGRvdWJsZSljb21wb25lbnQgLyBhbHBoYSk7Cit9CisjZW5kaWYKKworc3RhdGljIHBuZ191aW50XzE2CitpbGluZWFyKGludCBmaXhlZF9zcmdiKQoreworICAgcmV0dXJuIHUxNmQoNjU1MzUgKiBzUkdCX3RvX2RbZml4ZWRfc3JnYl0pOworfQorCitzdGF0aWMgcG5nX3VpbnRfMTYKK2lsaW5lYXJhKGludCBmaXhlZF9zcmdiLCBpbnQgYWxwaGEpCit7CisgICByZXR1cm4gdTE2ZCgoMjU3ICogYWxwaGEpICogc1JHQl90b19kW2ZpeGVkX3NyZ2JdKTsKK30KKworc3RhdGljIHBuZ191aW50XzE2CitpbGluZWFyX2cyMihpbnQgZml4ZWRfc3JnYikKK3sKKyAgIHJldHVybiB1MTZkKDY1NTM1ICogZzIyX3RvX2RbZml4ZWRfc3JnYl0pOworfQorCisjaWYgQUxMT1dfVU5VU0VEX0dQQworc3RhdGljIHBuZ191aW50XzE2CitpbGluZWFyYV9nMjIoaW50IGZpeGVkX3NyZ2IsIGludCBhbHBoYSkKK3sKKyAgIHJldHVybiB1MTZkKCgyNTcgKiBhbHBoYSkgKiBnMjJfdG9fZFtmaXhlZF9zcmdiXSk7Cit9CisjZW5kaWYKKworc3RhdGljIGRvdWJsZQorWWZyb21SR0JpbnQoaW50IGlyLCBpbnQgaWcsIGludCBpYikKK3sKKyAgIGRvdWJsZSByID0gaXI7CisgICBkb3VibGUgZyA9IGlnOworICAgZG91YmxlIGIgPSBpYjsKKyAgIHJldHVybiBZZnJvbVJHQihyLCBnLCBiKTsKK30KKworI2lmIDAgLyogdW51c2VkICovCisvKiBUaGUgZXJyb3IgdGhhdCByZXN1bHRzIGZyb20gdXNpbmcgYSAyLjIgcG93ZXIgbGF3IGluIHBsYWNlIG9mIHRoZSBjb3JyZWN0CisgKiBzUkdCIHRyYW5zZm9ybSwgZ2l2ZW4gYW4gOC1iaXQgdmFsdWUgd2hpY2ggbWlnaHQgYmUgZWl0aGVyIHNSR0Igb3IgcG93ZXItbGF3LgorICovCitzdGF0aWMgaW50Citwb3dlcl9sYXdfZXJyb3I4KGludCB2YWx1ZSkKK3sKKyAgIGlmICh2YWx1ZSA+IDAgJiYgdmFsdWUgPCAyNTUpCisgICB7CisgICAgICBkb3VibGUgdmQgPSB2YWx1ZSAvIDI1NS47CisgICAgICBkb3VibGUgZSA9IGZhYnMoCisgICAgICAgICBwb3coc1JHQl90b19kW3ZhbHVlXSwgMS8yLjIpIC0gc1JHQl9mcm9tX2xpbmVhcihwb3codmQsIDIuMikpKTsKKworICAgICAgLyogQWx3YXlzIGFsbG93IGFuIGV4dHJhIDEgaGVyZSBmb3Igcm91bmRpbmcgZXJyb3JzICovCisgICAgICBlID0gMStmbG9vcigyNTUgKiBlKTsKKyAgICAgIHJldHVybiAoaW50KWU7CisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVycm9yX2luX3NSR0Jfcm91bmR0cmlwID0gNTY7IC8qIGJ5IGV4cGVyaW1lbnQgKi8KK3N0YXRpYyBpbnQKK3Bvd2VyX2xhd19lcnJvcjE2KGludCB2YWx1ZSkKK3sKKyAgIGlmICh2YWx1ZSA+IDAgJiYgdmFsdWUgPCA2NTUzNSkKKyAgIHsKKyAgICAgIC8qIFJvdW5kIHRyaXAgdGhlIHZhbHVlIHRocm91Z2ggYW4gOC1iaXQgcmVwcmVzZW50YXRpb24gYnV0IHVzaW5nCisgICAgICAgKiBub24tbWF0Y2hpbmcgdG8vZnJvbSBjb252ZXJzaW9ucy4KKyAgICAgICAqLworICAgICAgZG91YmxlIHZkID0gdmFsdWUgLyA2NTUzNS47CisgICAgICBkb3VibGUgZSA9IGZhYnMoCisgICAgICAgICBwb3coc1JHQl9mcm9tX2xpbmVhcih2ZCksIDIuMikgLSBsaW5lYXJfZnJvbV9zUkdCKHBvdyh2ZCwgMS8yLjIpKSk7CisKKyAgICAgIC8qIEFsd2F5cyBhbGxvdyBhbiBleHRyYSAxIGhlcmUgZm9yIHJvdW5kaW5nIGVycm9ycyAqLworICAgICAgZSA9IGVycm9yX2luX3NSR0Jfcm91bmR0cmlwK2Zsb29yKDY1NTM1ICogZSk7CisgICAgICByZXR1cm4gKGludCllOworICAgfQorCisgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorY29tcGFyZV84Yml0KGludCB2MSwgaW50IHYyLCBpbnQgZXJyb3JfbGltaXQsIGludCBtdWx0aXBsZV9hbGdvcml0aG1zKQoreworICAgaW50IGUgPSBhYnModjEtdjIpOworICAgaW50IGV2MSwgZXYyOworCisgICBpZiAoZSA8PSBlcnJvcl9saW1pdCkKKyAgICAgIHJldHVybiAxOworCisgICBpZiAoIW11bHRpcGxlX2FsZ29yaXRobXMpCisgICAgICByZXR1cm4gMDsKKworICAgZXYxID0gcG93ZXJfbGF3X2Vycm9yOCh2MSk7CisgICBpZiAoZSA8PSBldjEpCisgICAgICByZXR1cm4gMTsKKworICAgZXYyID0gcG93ZXJfbGF3X2Vycm9yOCh2Mik7CisgICBpZiAoZSA8PSBldjIpCisgICAgICByZXR1cm4gMTsKKworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2NvbXBhcmVfMTZiaXQoaW50IHYxLCBpbnQgdjIsIGludCBlcnJvcl9saW1pdCwgaW50IG11bHRpcGxlX2FsZ29yaXRobXMpCit7CisgICBpbnQgZSA9IGFicyh2MS12Mik7CisgICBpbnQgZXYxLCBldjI7CisKKyAgIGlmIChlIDw9IGVycm9yX2xpbWl0KQorICAgICAgcmV0dXJuIDE7CisKKyAgIC8qICJtdWx0aXBsZV9hbGdvcml0aG1zIiBpbiB0aGlzIGNhc2UgbWVhbnMgdGhhdCBhIGNvbG9yLW1hcCBoYXMgYmVlbgorICAgICogaW52b2x2ZWQgc29tZXdoZXJlLCBzbyB3ZSBjYW4gZGVkdWNlIHRoYXQgdGhlIHZhbHVlcyB3ZXJlIGZvcmNlZCB0byA4LWJpdAorICAgICogKGxpa2UgdGhlIHZpYV9saW5lYXIgY2FzZSBmb3IgOC1iaXQuKQorICAgICovCisgICBpZiAoIW11bHRpcGxlX2FsZ29yaXRobXMpCisgICAgICByZXR1cm4gMDsKKworICAgZXYxID0gcG93ZXJfbGF3X2Vycm9yMTYodjEpOworICAgaWYgKGUgPD0gZXYxKQorICAgICAgcmV0dXJuIDE7CisKKyAgIGV2MiA9IHBvd2VyX2xhd19lcnJvcjE2KHYyKTsKKyAgIGlmIChlIDw9IGV2MikKKyAgICAgIHJldHVybiAxOworCisgICByZXR1cm4gMDsKK30KKyNlbmRpZiAvKiB1bnVzZWQgKi8KKworI2RlZmluZSBSRUFEX0ZJTEUgMSAgICAgIC8qIGVsc2UgbWVtb3J5ICovCisjZGVmaW5lIFVTRV9TVERJTyAyICAgICAgLyogZWxzZSB1c2UgZmlsZSBuYW1lICovCisjZGVmaW5lIFNUUklDVCA0ICAgICAgICAgLyogZmFpbCBvbiB3YXJuaW5ncyB0b28gKi8KKyNkZWZpbmUgVkVSQk9TRSA4CisjZGVmaW5lIEtFRVBfVE1QRklMRVMgMTYgLyogZWxzZSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzICovCisjZGVmaW5lIEtFRVBfR09JTkcgMzIKKyNkZWZpbmUgQUNDVU1VTEFURSA2NAorI2RlZmluZSBGQVNUX1dSSVRFIDEyOAorI2RlZmluZSBzUkdCXzE2QklUIDI1NgorCitzdGF0aWMgdm9pZAorcHJpbnRfb3B0cyhwbmdfdWludF8zMiBvcHRzKQoreworICAgaWYgKG9wdHMgJiBSRUFEX0ZJTEUpCisgICAgICBwcmludGYoIiAtLWZpbGUiKTsKKyAgIGlmIChvcHRzICYgVVNFX1NURElPKQorICAgICAgcHJpbnRmKCIgLS1zdGRpbyIpOworICAgaWYgKG9wdHMgJiBTVFJJQ1QpCisgICAgICBwcmludGYoIiAtLXN0cmljdCIpOworICAgaWYgKG9wdHMgJiBWRVJCT1NFKQorICAgICAgcHJpbnRmKCIgLS12ZXJib3NlIik7CisgICBpZiAob3B0cyAmIEtFRVBfVE1QRklMRVMpCisgICAgICBwcmludGYoIiAtLXByZXNlcnZlIik7CisgICBpZiAob3B0cyAmIEtFRVBfR09JTkcpCisgICAgICBwcmludGYoIiAtLWtlZXAtZ29pbmciKTsKKyAgIGlmIChvcHRzICYgQUNDVU1VTEFURSkKKyAgICAgIHByaW50ZigiIC0tYWNjdW11bGF0ZSIpOworICAgaWYgKCEob3B0cyAmIEZBU1RfV1JJVEUpKSAvKiAtLWZhc3QgaXMgY3VycmVudGx5IHRoZSBkZWZhdWx0ICovCisgICAgICBwcmludGYoIiAtLXNsb3ciKTsKKyAgIGlmIChvcHRzICYgc1JHQl8xNkJJVCkKKyAgICAgIHByaW50ZigiIC0tc1JHQi0xNmJpdCIpOworfQorCisjZGVmaW5lIEZPUk1BVF9OT19DSEFOR0UgMHg4MDAwMDAwMCAvKiBhZGRpdGlvbmFsIGZsYWcgKi8KKworLyogQSBuYW1lIHRhYmxlIGZvciBhbGwgdGhlIGZvcm1hdHMgLSBkZWZpbmVzIHRoZSBmb3JtYXQgb2YgdGhlICcrJyBhcmd1bWVudHMgdG8KKyAqIHBuZ3N0ZXN0LgorICovCisjZGVmaW5lIEZPUk1BVF9DT1VOVCA2NAorI2RlZmluZSBGT1JNQVRfTUFTSyAweDNmCitzdGF0aWMgUE5HX0NPTlNUIGNoYXIgKiBQTkdfQ09OU1QgZm9ybWF0X25hbWVzW0ZPUk1BVF9DT1VOVF0gPQoreworICAgInNSR0ItZ3JheSIsCisgICAic1JHQi1ncmF5K2FscGhhIiwKKyAgICJzUkdCLXJnYiIsCisgICAic1JHQi1yZ2IrYWxwaGEiLAorICAgImxpbmVhci1ncmF5IiwKKyAgICJsaW5lYXItZ3JheSthbHBoYSIsCisgICAibGluZWFyLXJnYiIsCisgICAibGluZWFyLXJnYithbHBoYSIsCisKKyAgICJjb2xvci1tYXBwZWQtc1JHQi1ncmF5IiwKKyAgICJjb2xvci1tYXBwZWQtc1JHQi1ncmF5K2FscGhhIiwKKyAgICJjb2xvci1tYXBwZWQtc1JHQi1yZ2IiLAorICAgImNvbG9yLW1hcHBlZC1zUkdCLXJnYithbHBoYSIsCisgICAiY29sb3ItbWFwcGVkLWxpbmVhci1ncmF5IiwKKyAgICJjb2xvci1tYXBwZWQtbGluZWFyLWdyYXkrYWxwaGEiLAorICAgImNvbG9yLW1hcHBlZC1saW5lYXItcmdiIiwKKyAgICJjb2xvci1tYXBwZWQtbGluZWFyLXJnYithbHBoYSIsCisKKyAgICJzUkdCLWdyYXkiLAorICAgInNSR0ItZ3JheSthbHBoYSIsCisgICAic1JHQi1iZ3IiLAorICAgInNSR0ItYmdyK2FscGhhIiwKKyAgICJsaW5lYXItZ3JheSIsCisgICAibGluZWFyLWdyYXkrYWxwaGEiLAorICAgImxpbmVhci1iZ3IiLAorICAgImxpbmVhci1iZ3IrYWxwaGEiLAorCisgICAiY29sb3ItbWFwcGVkLXNSR0ItZ3JheSIsCisgICAiY29sb3ItbWFwcGVkLXNSR0ItZ3JheSthbHBoYSIsCisgICAiY29sb3ItbWFwcGVkLXNSR0ItYmdyIiwKKyAgICJjb2xvci1tYXBwZWQtc1JHQi1iZ3IrYWxwaGEiLAorICAgImNvbG9yLW1hcHBlZC1saW5lYXItZ3JheSIsCisgICAiY29sb3ItbWFwcGVkLWxpbmVhci1ncmF5K2FscGhhIiwKKyAgICJjb2xvci1tYXBwZWQtbGluZWFyLWJnciIsCisgICAiY29sb3ItbWFwcGVkLWxpbmVhci1iZ3IrYWxwaGEiLAorCisgICAic1JHQi1ncmF5IiwKKyAgICJhbHBoYStzUkdCLWdyYXkiLAorICAgInNSR0ItcmdiIiwKKyAgICJhbHBoYStzUkdCLXJnYiIsCisgICAibGluZWFyLWdyYXkiLAorICAgImFscGhhK2xpbmVhci1ncmF5IiwKKyAgICJsaW5lYXItcmdiIiwKKyAgICJhbHBoYStsaW5lYXItcmdiIiwKKworICAgImNvbG9yLW1hcHBlZC1zUkdCLWdyYXkiLAorICAgImNvbG9yLW1hcHBlZC1hbHBoYStzUkdCLWdyYXkiLAorICAgImNvbG9yLW1hcHBlZC1zUkdCLXJnYiIsCisgICAiY29sb3ItbWFwcGVkLWFscGhhK3NSR0ItcmdiIiwKKyAgICJjb2xvci1tYXBwZWQtbGluZWFyLWdyYXkiLAorICAgImNvbG9yLW1hcHBlZC1hbHBoYStsaW5lYXItZ3JheSIsCisgICAiY29sb3ItbWFwcGVkLWxpbmVhci1yZ2IiLAorICAgImNvbG9yLW1hcHBlZC1hbHBoYStsaW5lYXItcmdiIiwKKworICAgInNSR0ItZ3JheSIsCisgICAiYWxwaGErc1JHQi1ncmF5IiwKKyAgICJzUkdCLWJnciIsCisgICAiYWxwaGErc1JHQi1iZ3IiLAorICAgImxpbmVhci1ncmF5IiwKKyAgICJhbHBoYStsaW5lYXItZ3JheSIsCisgICAibGluZWFyLWJnciIsCisgICAiYWxwaGErbGluZWFyLWJnciIsCisKKyAgICJjb2xvci1tYXBwZWQtc1JHQi1ncmF5IiwKKyAgICJjb2xvci1tYXBwZWQtYWxwaGErc1JHQi1ncmF5IiwKKyAgICJjb2xvci1tYXBwZWQtc1JHQi1iZ3IiLAorICAgImNvbG9yLW1hcHBlZC1hbHBoYStzUkdCLWJnciIsCisgICAiY29sb3ItbWFwcGVkLWxpbmVhci1ncmF5IiwKKyAgICJjb2xvci1tYXBwZWQtYWxwaGErbGluZWFyLWdyYXkiLAorICAgImNvbG9yLW1hcHBlZC1saW5lYXItYmdyIiwKKyAgICJjb2xvci1tYXBwZWQtYWxwaGErbGluZWFyLWJnciIsCit9OworCisvKiBEZWNvZGUgYW4gYXJndW1lbnQgdG8gYSBmb3JtYXQgbnVtYmVyLiAqLworc3RhdGljIHBuZ191aW50XzMyCitmb3JtYXRvZihjb25zdCBjaGFyICphcmcpCit7CisgICBjaGFyICplcDsKKyAgIHVuc2lnbmVkIGxvbmcgZm9ybWF0ID0gc3RydG91bChhcmcsICZlcCwgMCk7CisKKyAgIGlmIChlcCA+IGFyZyAmJiAqZXAgPT0gMCAmJiBmb3JtYXQgPCBGT1JNQVRfQ09VTlQpCisgICAgICByZXR1cm4gKHBuZ191aW50XzMyKWZvcm1hdDsKKworICAgZWxzZSBmb3IgKGZvcm1hdD0wOyBmb3JtYXQgPCBGT1JNQVRfQ09VTlQ7ICsrZm9ybWF0KQorICAgeworICAgICAgaWYgKHN0cmNtcChmb3JtYXRfbmFtZXNbZm9ybWF0XSwgYXJnKSA9PSAwKQorICAgICAgICAgcmV0dXJuIChwbmdfdWludF8zMilmb3JtYXQ7CisgICB9CisKKyAgIGZwcmludGYoc3RkZXJyLCAicG5nc3Rlc3Q6IGZvcm1hdCBuYW1lICclcycgaW52YWxpZFxuIiwgYXJnKTsKKyAgIHJldHVybiBGT1JNQVRfQ09VTlQ7Cit9CisKKy8qIEJpdHNldC90ZXN0IGZ1bmN0aW9ucyBmb3IgZm9ybWF0cyAqLworI2RlZmluZSBGT1JNQVRfU0VUX0NPVU5UIChGT1JNQVRfQ09VTlQgLyAzMikKK3R5cGVkZWYgc3RydWN0Cit7CisgICBwbmdfdWludF8zMiBiaXRzW0ZPUk1BVF9TRVRfQ09VTlRdOworfQorZm9ybWF0X2xpc3Q7CisKK3N0YXRpYyB2b2lkIGZvcm1hdF9pbml0KGZvcm1hdF9saXN0ICpwZikKK3sKKyAgIGludCBpOworICAgZm9yIChpPTA7IGk8Rk9STUFUX1NFVF9DT1VOVDsgKytpKQorICAgICAgcGYtPmJpdHNbaV0gPSAwOyAvKiBBbGwgb2ZmICovCit9CisKKyNpZiAwIC8qIGN1cnJlbnRseSB1bnVzZWQgKi8KK3N0YXRpYyB2b2lkIGZvcm1hdF9jbGVhcihmb3JtYXRfbGlzdCAqcGYpCit7CisgICBpbnQgaTsKKyAgIGZvciAoaT0wOyBpPEZPUk1BVF9TRVRfQ09VTlQ7ICsraSkKKyAgICAgIHBmLT5iaXRzW2ldID0gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGZvcm1hdF9pc19pbml0aWFsKGZvcm1hdF9saXN0ICpwZikKK3sKKyAgIGludCBpOworICAgZm9yIChpPTA7IGk8Rk9STUFUX1NFVF9DT1VOVDsgKytpKQorICAgICAgaWYgKHBmLT5iaXRzW2ldICE9IDApCisgICAgICAgICByZXR1cm4gMDsKKworICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZm9ybWF0X3NldChmb3JtYXRfbGlzdCAqcGYsIHBuZ191aW50XzMyIGZvcm1hdCkKK3sKKyAgIGlmIChmb3JtYXQgPCBGT1JNQVRfQ09VTlQpCisgICAgICByZXR1cm4gcGYtPmJpdHNbZm9ybWF0ID4+IDVdIHw9ICgocG5nX3VpbnRfMzIpMSkgPDwgKGZvcm1hdCAmIDMxKTsKKworICAgcmV0dXJuIDA7Cit9CisKKyNpZiAwIC8qIGN1cnJlbnRseSB1bnVzZWQgKi8KK3N0YXRpYyBpbnQgZm9ybWF0X3Vuc2V0KGZvcm1hdF9saXN0ICpwZiwgcG5nX3VpbnRfMzIgZm9ybWF0KQoreworICAgaWYgKGZvcm1hdCA8IEZPUk1BVF9DT1VOVCkKKyAgICAgIHJldHVybiBwZi0+Yml0c1tmb3JtYXQgPj4gNV0gJj0gfigocG5nX3VpbnRfMzIpMSkgPDwgKGZvcm1hdCAmIDMxKTsKKworICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBmb3JtYXRfaXNzZXQoZm9ybWF0X2xpc3QgKnBmLCBwbmdfdWludF8zMiBmb3JtYXQpCit7CisgICByZXR1cm4gZm9ybWF0IDwgRk9STUFUX0NPVU5UICYmCisgICAgICAocGYtPmJpdHNbZm9ybWF0ID4+IDVdICYgKCgocG5nX3VpbnRfMzIpMSkgPDwgKGZvcm1hdCAmIDMxKSkpICE9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGZvcm1hdF9kZWZhdWx0KGZvcm1hdF9saXN0ICpwZiwgaW50IHJlZHVuZGFudCkKK3sKKyAgIGlmIChyZWR1bmRhbnQpCisgICB7CisgICAgICBpbnQgaTsKKworICAgICAgLyogc2V0IGV2ZXJ5dGhpbmcsIGluY2x1ZGluZyBmbGFncyB0aGF0IGFyZSBwb2ludGxlc3MgKi8KKyAgICAgIGZvciAoaT0wOyBpPEZPUk1BVF9TRVRfQ09VTlQ7ICsraSkKKyAgICAgICAgIHBmLT5iaXRzW2ldID0gfihwbmdfdWludF8zMikwOworICAgfQorCisgICBlbHNlCisgICB7CisgICAgICBwbmdfdWludF8zMiBmOworCisgICAgICBmb3IgKGY9MDsgZjxGT1JNQVRfQ09VTlQ7ICsrZikKKyAgICAgIHsKKyAgICAgICAgIC8qIEVsaW1pbmF0ZSByZWR1bmRhbnQgYW5kIHVuc3VwcG9ydGVkIHNldHRpbmdzLiAqLworIyAgICAgICAgaWZkZWYgUE5HX0ZPUk1BVF9CR1JfU1VQUE9SVEVECisgICAgICAgICAgICAvKiBCR1IgaXMgbWVhbmluZ2xlc3MgaWYgbm8gY29sb3I6ICovCisgICAgICAgICAgICBpZiAoKGYgJiBQTkdfRk9STUFUX0ZMQUdfQ09MT1IpID09IDAgJiYKKyAgICAgICAgICAgICAgIChmICYgUE5HX0ZPUk1BVF9GTEFHX0JHUikgIT0gMCkKKyMgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmICgoZiAmIDB4MTBVLypIQUNLOiBmaXhlZCB2YWx1ZSovKSAhPSAwKQorIyAgICAgICAgZW5kaWYKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAvKiBBRklSU1QgaXMgbWVhbmluZ2xlc3MgaWYgbm8gYWxwaGE6ICovCisjICAgICAgICBpZmRlZiBQTkdfRk9STUFUX0FGSVJTVF9TVVBQT1JURUQKKyAgICAgICAgICAgIGlmICgoZiAmIFBOR19GT1JNQVRfRkxBR19BTFBIQSkgPT0gMCAmJgorICAgICAgICAgICAgICAgKGYgJiBQTkdfRk9STUFUX0ZMQUdfQUZJUlNUKSAhPSAwKQorIyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgKChmICYgMHgyMFUvKkhBQ0s6IGZpeGVkIHZhbHVlKi8pICE9IDApCisjICAgICAgICBlbmRpZgorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgIGZvcm1hdF9zZXQocGYsIGYpOworICAgICAgfQorICAgfQorfQorCisvKiBUSEUgSW1hZ2UgU1RSVUNUVVJFICovCisvKiBUaGUgc3VwZXItY2xhc3Mgb2YgYSBwbmdfaW1hZ2UsIGNvbnRhaW5zIHRoZSBkZWNvZGVkIGltYWdlIHBsdXMgdGhlIGlucHV0CisgKiBkYXRhIG5lY2Vzc2FyeSB0byByZS1yZWFkIHRoZSBmaWxlIHdpdGggYSBkaWZmZXJlbnQgZm9ybWF0LgorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgcG5nX2ltYWdlICAgaW1hZ2U7CisgICBwbmdfdWludF8zMiBvcHRzOworICAgY29uc3QgY2hhciAqZmlsZV9uYW1lOworICAgaW50ICAgICAgICAgc3RyaWRlX2V4dHJhOworICAgRklMRSAgICAgICAqaW5wdXRfZmlsZTsKKyAgIHBuZ192b2lkcCAgIGlucHV0X21lbW9yeTsKKyAgIHBuZ19zaXplX3QgIGlucHV0X21lbW9yeV9zaXplOworICAgcG5nX2J5dGVwICAgYnVmZmVyOworICAgcHRyZGlmZl90ICAgc3RyaWRlOworICAgcG5nX3NpemVfdCAgYnVmc2l6ZTsKKyAgIHBuZ19zaXplX3QgIGFsbG9jc2l6ZTsKKyAgIGNoYXIgICAgICAgIHRtcGZpbGVfbmFtZVszMl07CisgICBwbmdfdWludF8xNiBjb2xvcm1hcFsyNTYqNF07Cit9CitJbWFnZTsKKworLyogSW5pdGlhbGl6ZXI6IGFsc28gc2V0cyB0aGUgcGVybWl0dGVkIGVycm9yIGxpbWl0IGZvciAxNi1iaXQgb3BlcmF0aW9ucy4gKi8KK3N0YXRpYyB2b2lkCituZXdpbWFnZShJbWFnZSAqaW1hZ2UpCit7CisgICBtZW1zZXQoaW1hZ2UsIDAsIHNpemVvZiAqaW1hZ2UpOworfQorCisvKiBSZXNldCB0aGUgaW1hZ2UgdG8gYmUgcmVhZCBhZ2FpbiAtIG9ubHkgbmVlZHMgdG8gcmV3aW5kIHRoZSBGSUxFKiBhdCBwcmVzZW50LgorICovCitzdGF0aWMgdm9pZAorcmVzZXRpbWFnZShJbWFnZSAqaW1hZ2UpCit7CisgICBpZiAoaW1hZ2UtPmlucHV0X2ZpbGUgIT0gTlVMTCkKKyAgICAgIHJld2luZChpbWFnZS0+aW5wdXRfZmlsZSk7Cit9CisKKy8qIEZyZWUgdGhlIGltYWdlIGJ1ZmZlcjsgdGhlIGJ1ZmZlciBpcyByZS11c2VkIG9uIGEgcmUtcmVhZCwgdGhpcyBpcyBqdXN0IGZvcgorICogY2xlYW51cC4KKyAqLworc3RhdGljIHZvaWQKK2ZyZWVidWZmZXIoSW1hZ2UgKmltYWdlKQoreworICAgaWYgKGltYWdlLT5idWZmZXIpIGZyZWUoaW1hZ2UtPmJ1ZmZlcik7CisgICBpbWFnZS0+YnVmZmVyID0gTlVMTDsKKyAgIGltYWdlLT5idWZzaXplID0gMDsKKyAgIGltYWdlLT5hbGxvY3NpemUgPSAwOworfQorCisvKiBEZWxldGUgZnVuY3Rpb247IGNsZWFucyBvdXQgYWxsIHRoZSBhbGxvY2F0ZWQgZGF0YSBhbmQgdGhlIHRlbXBvcmFyeSBmaWxlIGluCisgKiB0aGUgaW1hZ2UuCisgKi8KK3N0YXRpYyB2b2lkCitmcmVlaW1hZ2UoSW1hZ2UgKmltYWdlKQoreworICAgZnJlZWJ1ZmZlcihpbWFnZSk7CisgICBwbmdfaW1hZ2VfZnJlZSgmaW1hZ2UtPmltYWdlKTsKKworICAgaWYgKGltYWdlLT5pbnB1dF9maWxlICE9IE5VTEwpCisgICB7CisgICAgICBmY2xvc2UoaW1hZ2UtPmlucHV0X2ZpbGUpOworICAgICAgaW1hZ2UtPmlucHV0X2ZpbGUgPSBOVUxMOworICAgfQorCisgICBpZiAoaW1hZ2UtPmlucHV0X21lbW9yeSAhPSBOVUxMKQorICAgeworICAgICAgZnJlZShpbWFnZS0+aW5wdXRfbWVtb3J5KTsKKyAgICAgIGltYWdlLT5pbnB1dF9tZW1vcnkgPSBOVUxMOworICAgICAgaW1hZ2UtPmlucHV0X21lbW9yeV9zaXplID0gMDsKKyAgIH0KKworICAgaWYgKGltYWdlLT50bXBmaWxlX25hbWVbMF0gIT0gMCAmJiAoaW1hZ2UtPm9wdHMgJiBLRUVQX1RNUEZJTEVTKSA9PSAwKQorICAgeworICAgICAgKHZvaWQpcmVtb3ZlKGltYWdlLT50bXBmaWxlX25hbWUpOworICAgICAgaW1hZ2UtPnRtcGZpbGVfbmFtZVswXSA9IDA7CisgICB9Cit9CisKKy8qIFRoaXMgaXMgYWN0dWFsbHkgYSByZS1pbml0aWFsaXplcjsgYWxsb3dzIGFuIGltYWdlIHN0cnVjdHVyZSB0byBiZSByZS11c2VkIGJ5CisgKiBmcmVlaW5nIGV2ZXJ5dGhpbmcgdGhhdCByZWxhdGVzIHRvIGFuIG9sZCBpbWFnZS4KKyAqLworc3RhdGljIHZvaWQgaW5pdGltYWdlKEltYWdlICppbWFnZSwgcG5nX3VpbnRfMzIgb3B0cywgY29uc3QgY2hhciAqZmlsZV9uYW1lLAorICAgaW50IHN0cmlkZV9leHRyYSkKK3sKKyAgIGZyZWVpbWFnZShpbWFnZSk7CisgICBtZW1zZXQoJmltYWdlLT5pbWFnZSwgMCwgc2l6ZW9mIGltYWdlLT5pbWFnZSk7CisgICBpbWFnZS0+b3B0cyA9IG9wdHM7CisgICBpbWFnZS0+ZmlsZV9uYW1lID0gZmlsZV9uYW1lOworICAgaW1hZ2UtPnN0cmlkZV9leHRyYSA9IHN0cmlkZV9leHRyYTsKK30KKworLyogTWFrZSBzdXJlIHRoZSBpbWFnZSBidWZmZXIgaXMgYmlnIGVub3VnaDsgYWxsb3dzIHJlLXVzZSBvZiB0aGUgYnVmZmVyIGlmIHRoZQorICogaW1hZ2UgaXMgcmUtcmVhZC4KKyAqLworI2RlZmluZSBCVUZGRVJfSU5JVDggNzMKK3N0YXRpYyB2b2lkCithbGxvY2J1ZmZlcihJbWFnZSAqaW1hZ2UpCit7CisgICBwbmdfc2l6ZV90IHNpemUgPSBQTkdfSU1BR0VfQlVGRkVSX1NJWkUoaW1hZ2UtPmltYWdlLCBpbWFnZS0+c3RyaWRlKTsKKworICAgaWYgKHNpemUrMzIgPiBpbWFnZS0+YnVmc2l6ZSkKKyAgIHsKKyAgICAgIGZyZWVidWZmZXIoaW1hZ2UpOworICAgICAgaW1hZ2UtPmJ1ZmZlciA9IHZvaWRjYXN0KHBuZ19ieXRlcCwgbWFsbG9jKHNpemUrMzIpKTsKKyAgICAgIGlmIChpbWFnZS0+YnVmZmVyID09IE5VTEwpCisgICAgICB7CisgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgInNpbXBsZXRlc3Q6IG91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyAlbHUoKzMyKSBieXRlIGJ1ZmZlclxuIiwKKyAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXNpemUpOworICAgICAgICAgZXhpdCgxKTsKKyAgICAgIH0KKyAgICAgIGltYWdlLT5idWZzaXplID0gc2l6ZSszMjsKKyAgIH0KKworICAgbWVtc2V0KGltYWdlLT5idWZmZXIsIDk1LCBpbWFnZS0+YnVmc2l6ZSk7CisgICBtZW1zZXQoaW1hZ2UtPmJ1ZmZlcisxNiwgQlVGRkVSX0lOSVQ4LCBzaXplKTsKKyAgIGltYWdlLT5hbGxvY3NpemUgPSBzaXplOworfQorCisvKiBNYWtlIHN1cmUgMTYgYnl0ZXMgbWF0Y2ggdGhlIGdpdmVuIGJ5dGUuICovCitzdGF0aWMgaW50CitjaGVjazE2KHBuZ19jb25zdF9ieXRlcCBicCwgaW50IGIpCit7CisgICBpbnQgaSA9IDE2OworCisgICBkbworICAgICAgaWYgKCpicCAhPSBiKSByZXR1cm4gMTsKKyAgIHdoaWxlICgtLWkpOworCisgICByZXR1cm4gMDsKK30KKworLyogQ2hlY2sgZm9yIG92ZXJ3cml0ZSBpbiB0aGUgaW1hZ2UgYnVmZmVyLiAqLworc3RhdGljIHZvaWQKK2NoZWNrYnVmZmVyKEltYWdlICppbWFnZSwgY29uc3QgY2hhciAqYXJnKQoreworICAgaWYgKGNoZWNrMTYoaW1hZ2UtPmJ1ZmZlciwgOTUpKQorICAgeworICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBvdmVyd3JpdGUgYXQgc3RhcnQgb2YgaW1hZ2UgYnVmZmVyXG4iLCBhcmcpOworICAgICAgZXhpdCgxKTsKKyAgIH0KKworICAgaWYgKGNoZWNrMTYoaW1hZ2UtPmJ1ZmZlcisxNitpbWFnZS0+YWxsb2NzaXplLCA5NSkpCisgICB7CisgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG92ZXJ3cml0ZSBhdCBlbmQgb2YgaW1hZ2UgYnVmZmVyXG4iLCBhcmcpOworICAgICAgZXhpdCgxKTsKKyAgIH0KK30KKworLyogRVJST1IgSEFORExJTkcgKi8KKy8qIExvZyBhIHRlcm1pbmFsIGVycm9yLCBhbHNvIGZyZWVzIHRoZSBsaWJwbmcgcGFydCBvZiB0aGUgaW1hZ2UgaWYgbmVjZXNzYXJ5LgorICovCitzdGF0aWMgaW50Citsb2dlcnJvcihJbWFnZSAqaW1hZ2UsIGNvbnN0IGNoYXIgKmExLCBjb25zdCBjaGFyICphMiwgY29uc3QgY2hhciAqYTMpCit7CisgICBmZmx1c2goc3Rkb3V0KTsKKyAgIGlmIChpbWFnZS0+aW1hZ2Uud2FybmluZ19vcl9lcnJvcikKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMlcyVzOiAlc1xuIiwgYTEsIGEyLCBhMywgaW1hZ2UtPmltYWdlLm1lc3NhZ2UpOworCisgICBlbHNlCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzJXMlc1xuIiwgYTEsIGEyLCBhMyk7CisKKyAgIGlmIChpbWFnZS0+aW1hZ2Uub3BhcXVlICE9IE5VTEwpCisgICB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBpbWFnZSBvcGFxdWUgcG9pbnRlciBub24tTlVMTCBvbiBlcnJvclxuIiwKKyAgICAgICAgIGltYWdlLT5maWxlX25hbWUpOworICAgICAgcG5nX2ltYWdlX2ZyZWUoJmltYWdlLT5pbWFnZSk7CisgICB9CisKKyAgIHJldHVybiAwOworfQorCisvKiBMb2cgYW4gZXJyb3IgYW5kIGNsb3NlIGEgZmlsZSAoanVzdCBhIHV0aWxpdHkgdG8gZG8gYm90aCB0aGluZ3MgaW4gb25lCisgKiBmdW5jdGlvbiBjYWxsLikKKyAqLworc3RhdGljIGludAorbG9nY2xvc2UoSW1hZ2UgKmltYWdlLCBGSUxFICpmLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpvcGVyYXRpb24pCit7CisgICBpbnQgZSA9IGVycm5vOworCisgICBmY2xvc2UoZik7CisgICByZXR1cm4gbG9nZXJyb3IoaW1hZ2UsIG5hbWUsIG9wZXJhdGlvbiwgc3RyZXJyb3IoZSkpOworfQorCisvKiBNYWtlIHN1cmUgdGhlIHBuZ19pbWFnZSBoYXMgYmVlbiBmcmVlZCAtIHZhbGlkYXRlcyB0aGF0IGxpYnBuZyBpcyBkb2luZyB3aGF0CisgKiB0aGUgc3BlYyBzYXlzIGFuZCBmcmVlaW5nIHRoZSBpbWFnZS4KKyAqLworc3RhdGljIGludAorY2hlY2tvcGFxdWUoSW1hZ2UgKmltYWdlKQoreworICAgaWYgKGltYWdlLT5pbWFnZS5vcGFxdWUgIT0gTlVMTCkKKyAgIHsKKyAgICAgIHBuZ19pbWFnZV9mcmVlKCZpbWFnZS0+aW1hZ2UpOworICAgICAgcmV0dXJuIGxvZ2Vycm9yKGltYWdlLCBpbWFnZS0+ZmlsZV9uYW1lLCAiOiBvcGFxdWUgbm90IE5VTEwiLCAiIik7CisgICB9CisKKyAgIGVsc2UgaWYgKGltYWdlLT5pbWFnZS53YXJuaW5nX29yX2Vycm9yICE9IDAgJiYgKGltYWdlLT5vcHRzICYgU1RSSUNUKSAhPSAwKQorICAgICAgcmV0dXJuIGxvZ2Vycm9yKGltYWdlLCBpbWFnZS0+ZmlsZV9uYW1lLCAiIC0tc3RyaWN0IiwgIiIpOworCisgICBlbHNlCisgICAgICByZXR1cm4gMTsKK30KKworLyogSU1BR0UgQ09NUEFSSVNPTi9DSEVDS0lORyAqLworLyogQ29tcGFyZSB0aGUgcGl4ZWxzIG9mIHR3byBpbWFnZXMsIHdoaWNoIHNob3VsZCBiZSB0aGUgc2FtZSBidXQgYXJlbid0LiAgVGhlCisgKiBpbWFnZXMgbXVzdCBoYXZlIGJlZW4gY2hlY2tlZCBmb3IgYSBzaXplIG1hdGNoLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgLyogVGhlIGNvbXBvbmVudHMsIGZvciBncmF5c2NhbGUgaW1hZ2VzIHRoZSBncmF5IHZhbHVlIGlzIGluICdnJyBhbmQgaWYgYWxwaGEKKyAgICAqIGlzIG5vdCBwcmVzZW50ICdhJyBpcyBzZXQgdG8gMjU1IG9yIDY1NTM1IGFjY29yZGluZyB0byBmb3JtYXQuCisgICAgKi8KKyAgIGludCAgICAgICAgIHIsIGcsIGIsIGE7Cit9IFBpeGVsOworCit0eXBlZGVmIHN0cnVjdAoreworICAgLyogVGhlIGJhY2tncm91bmQgYXMgdGhlIG9yaWdpbmFsIHNSR0IgOC1iaXQgdmFsdWUgY29udmVydGVkIHRvIHRoZSBmaW5hbAorICAgICogaW50ZWdlciBmb3JtYXQgYW5kIGFzIGEgZG91YmxlIHByZWNpc2lvbiBsaW5lYXIgdmFsdWUgaW4gdGhlIHJhbmdlIDAuLjEKKyAgICAqIGZvciB3aXRoIHBhcnRpYWxseSB0cmFuc3BhcmVudCBwaXhlbHMuCisgICAgKi8KKyAgIGludCBpciwgaWcsIGliOworICAgZG91YmxlIGRyLCBkZywgZGI7IC8qIGxpbmVhciByLGcsYiBzY2FsZWQgdG8gMC4uMSAqLworfSBCYWNrZ3JvdW5kOworCisvKiBCYXNpYyBpbWFnZSBmb3JtYXRzOyBjb250cm9sIHRoZSBkYXRhIGJ1dCBub3QgdGhlIGxheW91dCB0aGVyZW9mLiAqLworI2RlZmluZSBCQVNFX0ZPUk1BVFNcCisgICAoUE5HX0ZPUk1BVF9GTEFHX0FMUEhBfFBOR19GT1JNQVRfRkxBR19DT0xPUnxQTkdfRk9STUFUX0ZMQUdfTElORUFSKQorCisvKiBSZWFkIGEgUGl4ZWwgZnJvbSBhIGJ1ZmZlci4gIFRoZSBjb2RlIGJlbG93IHN0b3JlcyB0aGUgY29ycmVjdCByb3V0aW5lIGZvcgorICogdGhlIGZvcm1hdCBpbiBhIGZ1bmN0aW9uIHBvaW50ZXIsIHRoZXNlIGFyZSB0aGUgcm91dGluZXM6CisgKi8KK3N0YXRpYyB2b2lkCitncF9nOChQaXhlbCAqcCwgcG5nX2NvbnN0X3ZvaWRwIHBiKQoreworICAgcG5nX2NvbnN0X2J5dGVwIHBwID0gdm9pZGNhc3QocG5nX2NvbnN0X2J5dGVwLCBwYik7CisKKyAgIHAtPnIgPSBwLT5nID0gcC0+YiA9IHBwWzBdOworICAgcC0+YSA9IDI1NTsKK30KKworc3RhdGljIHZvaWQKK2dwX2dhOChQaXhlbCAqcCwgcG5nX2NvbnN0X3ZvaWRwIHBiKQoreworICAgcG5nX2NvbnN0X2J5dGVwIHBwID0gdm9pZGNhc3QocG5nX2NvbnN0X2J5dGVwLCBwYik7CisKKyAgIHAtPnIgPSBwLT5nID0gcC0+YiA9IHBwWzBdOworICAgcC0+YSA9IHBwWzFdOworfQorCisjaWZkZWYgUE5HX0ZPUk1BVF9BRklSU1RfU1VQUE9SVEVECitzdGF0aWMgdm9pZAorZ3BfYWc4KFBpeGVsICpwLCBwbmdfY29uc3Rfdm9pZHAgcGIpCit7CisgICBwbmdfY29uc3RfYnl0ZXAgcHAgPSB2b2lkY2FzdChwbmdfY29uc3RfYnl0ZXAsIHBiKTsKKworICAgcC0+ciA9IHAtPmcgPSBwLT5iID0gcHBbMV07CisgICBwLT5hID0gcHBbMF07Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK2dwX3JnYjgoUGl4ZWwgKnAsIHBuZ19jb25zdF92b2lkcCBwYikKK3sKKyAgIHBuZ19jb25zdF9ieXRlcCBwcCA9IHZvaWRjYXN0KHBuZ19jb25zdF9ieXRlcCwgcGIpOworCisgICBwLT5yID0gcHBbMF07CisgICBwLT5nID0gcHBbMV07CisgICBwLT5iID0gcHBbMl07CisgICBwLT5hID0gMjU1OworfQorCisjaWZkZWYgUE5HX0ZPUk1BVF9CR1JfU1VQUE9SVEVECitzdGF0aWMgdm9pZAorZ3BfYmdyOChQaXhlbCAqcCwgcG5nX2NvbnN0X3ZvaWRwIHBiKQoreworICAgcG5nX2NvbnN0X2J5dGVwIHBwID0gdm9pZGNhc3QocG5nX2NvbnN0X2J5dGVwLCBwYik7CisKKyAgIHAtPnIgPSBwcFsyXTsKKyAgIHAtPmcgPSBwcFsxXTsKKyAgIHAtPmIgPSBwcFswXTsKKyAgIHAtPmEgPSAyNTU7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK2dwX3JnYmE4KFBpeGVsICpwLCBwbmdfY29uc3Rfdm9pZHAgcGIpCit7CisgICBwbmdfY29uc3RfYnl0ZXAgcHAgPSB2b2lkY2FzdChwbmdfY29uc3RfYnl0ZXAsIHBiKTsKKworICAgcC0+ciA9IHBwWzBdOworICAgcC0+ZyA9IHBwWzFdOworICAgcC0+YiA9IHBwWzJdOworICAgcC0+YSA9IHBwWzNdOworfQorCisjaWZkZWYgUE5HX0ZPUk1BVF9CR1JfU1VQUE9SVEVECitzdGF0aWMgdm9pZAorZ3BfYmdyYTgoUGl4ZWwgKnAsIHBuZ19jb25zdF92b2lkcCBwYikKK3sKKyAgIHBuZ19jb25zdF9ieXRlcCBwcCA9IHZvaWRjYXN0KHBuZ19jb25zdF9ieXRlcCwgcGIpOworCisgICBwLT5yID0gcHBbMl07CisgICBwLT5nID0gcHBbMV07CisgICBwLT5iID0gcHBbMF07CisgICBwLT5hID0gcHBbM107Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19GT1JNQVRfQUZJUlNUX1NVUFBPUlRFRAorc3RhdGljIHZvaWQKK2dwX2FyZ2I4KFBpeGVsICpwLCBwbmdfY29uc3Rfdm9pZHAgcGIpCit7CisgICBwbmdfY29uc3RfYnl0ZXAgcHAgPSB2b2lkY2FzdChwbmdfY29uc3RfYnl0ZXAsIHBiKTsKKworICAgcC0+ciA9IHBwWzFdOworICAgcC0+ZyA9IHBwWzJdOworICAgcC0+YiA9IHBwWzNdOworICAgcC0+YSA9IHBwWzBdOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19GT1JNQVRfQUZJUlNUX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfRk9STUFUX0JHUl9TVVBQT1JURUQpCitzdGF0aWMgdm9pZAorZ3BfYWJncjgoUGl4ZWwgKnAsIHBuZ19jb25zdF92b2lkcCBwYikKK3sKKyAgIHBuZ19jb25zdF9ieXRlcCBwcCA9IHZvaWRjYXN0KHBuZ19jb25zdF9ieXRlcCwgcGIpOworCisgICBwLT5yID0gcHBbM107CisgICBwLT5nID0gcHBbMl07CisgICBwLT5iID0gcHBbMV07CisgICBwLT5hID0gcHBbMF07Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK2dwX2cxNihQaXhlbCAqcCwgcG5nX2NvbnN0X3ZvaWRwIHBiKQoreworICAgcG5nX2NvbnN0X3VpbnRfMTZwIHBwID0gdm9pZGNhc3QocG5nX2NvbnN0X3VpbnRfMTZwLCBwYik7CisKKyAgIHAtPnIgPSBwLT5nID0gcC0+YiA9IHBwWzBdOworICAgcC0+YSA9IDY1NTM1OworfQorCitzdGF0aWMgdm9pZAorZ3BfZ2ExNihQaXhlbCAqcCwgcG5nX2NvbnN0X3ZvaWRwIHBiKQoreworICAgcG5nX2NvbnN0X3VpbnRfMTZwIHBwID0gdm9pZGNhc3QocG5nX2NvbnN0X3VpbnRfMTZwLCBwYik7CisKKyAgIHAtPnIgPSBwLT5nID0gcC0+YiA9IHBwWzBdOworICAgcC0+YSA9IHBwWzFdOworfQorCisjaWZkZWYgUE5HX0ZPUk1BVF9BRklSU1RfU1VQUE9SVEVECitzdGF0aWMgdm9pZAorZ3BfYWcxNihQaXhlbCAqcCwgcG5nX2NvbnN0X3ZvaWRwIHBiKQoreworICAgcG5nX2NvbnN0X3VpbnRfMTZwIHBwID0gdm9pZGNhc3QocG5nX2NvbnN0X3VpbnRfMTZwLCBwYik7CisKKyAgIHAtPnIgPSBwLT5nID0gcC0+YiA9IHBwWzFdOworICAgcC0+YSA9IHBwWzBdOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitncF9yZ2IxNihQaXhlbCAqcCwgcG5nX2NvbnN0X3ZvaWRwIHBiKQoreworICAgcG5nX2NvbnN0X3VpbnRfMTZwIHBwID0gdm9pZGNhc3QocG5nX2NvbnN0X3VpbnRfMTZwLCBwYik7CisKKyAgIHAtPnIgPSBwcFswXTsKKyAgIHAtPmcgPSBwcFsxXTsKKyAgIHAtPmIgPSBwcFsyXTsKKyAgIHAtPmEgPSA2NTUzNTsKK30KKworI2lmZGVmIFBOR19GT1JNQVRfQkdSX1NVUFBPUlRFRAorc3RhdGljIHZvaWQKK2dwX2JncjE2KFBpeGVsICpwLCBwbmdfY29uc3Rfdm9pZHAgcGIpCit7CisgICBwbmdfY29uc3RfdWludF8xNnAgcHAgPSB2b2lkY2FzdChwbmdfY29uc3RfdWludF8xNnAsIHBiKTsKKworICAgcC0+ciA9IHBwWzJdOworICAgcC0+ZyA9IHBwWzFdOworICAgcC0+YiA9IHBwWzBdOworICAgcC0+YSA9IDY1NTM1OworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitncF9yZ2JhMTYoUGl4ZWwgKnAsIHBuZ19jb25zdF92b2lkcCBwYikKK3sKKyAgIHBuZ19jb25zdF91aW50XzE2cCBwcCA9IHZvaWRjYXN0KHBuZ19jb25zdF91aW50XzE2cCwgcGIpOworCisgICBwLT5yID0gcHBbMF07CisgICBwLT5nID0gcHBbMV07CisgICBwLT5iID0gcHBbMl07CisgICBwLT5hID0gcHBbM107Cit9CisKKyNpZmRlZiBQTkdfRk9STUFUX0JHUl9TVVBQT1JURUQKK3N0YXRpYyB2b2lkCitncF9iZ3JhMTYoUGl4ZWwgKnAsIHBuZ19jb25zdF92b2lkcCBwYikKK3sKKyAgIHBuZ19jb25zdF91aW50XzE2cCBwcCA9IHZvaWRjYXN0KHBuZ19jb25zdF91aW50XzE2cCwgcGIpOworCisgICBwLT5yID0gcHBbMl07CisgICBwLT5nID0gcHBbMV07CisgICBwLT5iID0gcHBbMF07CisgICBwLT5hID0gcHBbM107Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19GT1JNQVRfQUZJUlNUX1NVUFBPUlRFRAorc3RhdGljIHZvaWQKK2dwX2FyZ2IxNihQaXhlbCAqcCwgcG5nX2NvbnN0X3ZvaWRwIHBiKQoreworICAgcG5nX2NvbnN0X3VpbnRfMTZwIHBwID0gdm9pZGNhc3QocG5nX2NvbnN0X3VpbnRfMTZwLCBwYik7CisKKyAgIHAtPnIgPSBwcFsxXTsKKyAgIHAtPmcgPSBwcFsyXTsKKyAgIHAtPmIgPSBwcFszXTsKKyAgIHAtPmEgPSBwcFswXTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfRk9STUFUX0FGSVJTVF9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX0ZPUk1BVF9CR1JfU1VQUE9SVEVEKQorc3RhdGljIHZvaWQKK2dwX2FiZ3IxNihQaXhlbCAqcCwgcG5nX2NvbnN0X3ZvaWRwIHBiKQoreworICAgcG5nX2NvbnN0X3VpbnRfMTZwIHBwID0gdm9pZGNhc3QocG5nX2NvbnN0X3VpbnRfMTZwLCBwYik7CisKKyAgIHAtPnIgPSBwcFszXTsKKyAgIHAtPmcgPSBwcFsyXTsKKyAgIHAtPmIgPSBwcFsxXTsKKyAgIHAtPmEgPSBwcFswXTsKK30KKyNlbmRpZgorCisvKiBHaXZlbiBhIGZvcm1hdCwgcmV0dXJuIHRoZSBjb3JyZWN0IG9uZSBvZiB0aGUgYWJvdmUgZnVuY3Rpb25zLiAqLworc3RhdGljIHZvaWQgKCoKK2dldF9waXhlbChwbmdfdWludF8zMiBmb3JtYXQpKShQaXhlbCAqcCwgcG5nX2NvbnN0X3ZvaWRwIHBiKQoreworICAgLyogVGhlIGNvbG9yLW1hcCBmbGFnIGlzIGlycmVsZXZhbnQgaGVyZSAtIHRoZSBjYWxsZXIgb2YgdGhlIGZ1bmN0aW9uCisgICAgKiByZXR1cm5lZCBtdXN0IGVpdGhlciBwYXNzIHRoZSBidWZmZXIgb3IsIGZvciBhIGNvbG9yLW1hcHBlZCBpbWFnZSwgdGhlCisgICAgKiBjb3JyZWN0IGVudHJ5IGluIHRoZSBjb2xvci1tYXAuCisgICAgKi8KKyAgIGlmIChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfTElORUFSKQorICAgeworICAgICAgaWYgKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19DT0xPUikKKyAgICAgIHsKKyMgICAgICAgIGlmZGVmIFBOR19GT1JNQVRfQkdSX1NVUFBPUlRFRAorICAgICAgICAgICAgaWYgKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19CR1IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZiAoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FMUEhBKQorICAgICAgICAgICAgICAgeworIyAgICAgICAgICAgICAgICAgaWZkZWYgUE5HX0ZPUk1BVF9BRklSU1RfU1VQUE9SVEVECisgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FGSVJTVCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncF9hYmdyMTY7CisKKyAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyMgICAgICAgICAgICAgICAgIGVuZGlmCisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3BfYmdyYTE2OworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICByZXR1cm4gZ3BfYmdyMTY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsc2UKKyMgICAgICAgIGVuZGlmCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FMUEhBKQorICAgICAgICAgICAgeworIyAgICAgICAgICAgICAgaWZkZWYgUE5HX0ZPUk1BVF9BRklSU1RfU1VQUE9SVEVECisgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FGSVJTVCkKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncF9hcmdiMTY7CisKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyMgICAgICAgICAgICAgIGVuZGlmCisgICAgICAgICAgICAgICAgICByZXR1cm4gZ3BfcmdiYTE2OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICByZXR1cm4gZ3BfcmdiMTY7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGlmIChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQUxQSEEpCisgICAgICAgICB7CisjICAgICAgICAgICBpZmRlZiBQTkdfRk9STUFUX0FGSVJTVF9TVVBQT1JURUQKKyAgICAgICAgICAgICAgIGlmIChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQUZJUlNUKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwX2FnMTY7CisKKyAgICAgICAgICAgICAgIGVsc2UKKyMgICAgICAgICAgIGVuZGlmCisgICAgICAgICAgICAgICByZXR1cm4gZ3BfZ2ExNjsKKyAgICAgICAgIH0KKworICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGdwX2cxNjsKKyAgICAgIH0KKyAgIH0KKworICAgZWxzZQorICAgeworICAgICAgaWYgKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19DT0xPUikKKyAgICAgIHsKKyMgICAgICAgIGlmZGVmIFBOR19GT1JNQVRfQkdSX1NVUFBPUlRFRAorICAgICAgICAgICAgaWYgKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19CR1IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZiAoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FMUEhBKQorICAgICAgICAgICAgICAgeworIyAgICAgICAgICAgICAgICAgaWZkZWYgUE5HX0ZPUk1BVF9BRklSU1RfU1VQUE9SVEVECisgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FGSVJTVCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncF9hYmdyODsKKworICAgICAgICAgICAgICAgICAgICAgZWxzZQorIyAgICAgICAgICAgICAgICAgZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncF9iZ3JhODsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwX2Jncjg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsc2UKKyMgICAgICAgIGVuZGlmCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FMUEhBKQorICAgICAgICAgICAgeworIyAgICAgICAgICAgICAgaWZkZWYgUE5HX0ZPUk1BVF9BRklSU1RfU1VQUE9SVEVECisgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FGSVJTVCkKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncF9hcmdiODsKKworICAgICAgICAgICAgICAgICAgZWxzZQorIyAgICAgICAgICAgICAgZW5kaWYKKyAgICAgICAgICAgICAgICAgIHJldHVybiBncF9yZ2JhODsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgcmV0dXJuIGdwX3JnYjg7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGlmIChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQUxQSEEpCisgICAgICAgICB7CisjICAgICAgICAgICBpZmRlZiBQTkdfRk9STUFUX0FGSVJTVF9TVVBQT1JURUQKKyAgICAgICAgICAgICAgIGlmIChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQUZJUlNUKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwX2FnODsKKworICAgICAgICAgICAgICAgZWxzZQorIyAgICAgICAgICAgZW5kaWYKKyAgICAgICAgICAgICAgIHJldHVybiBncF9nYTg7CisgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBncF9nODsKKyAgICAgIH0KKyAgIH0KK30KKworLyogQ29udmVydGlvbiBiZXR3ZWVuIHBpeGVsIGZvcm1hdHMuICBUaGUgY29kZSBhYm92ZSBlZmZlY3RpdmVseSBlbGltaW5hdGVzIHRoZQorICogY29tcG9uZW50IG9yZGVyaW5nIGNoYW5nZXMgbGVhdmluZyB0aHJlZSBiYXNpYyBjaGFuZ2VzOgorICoKKyAqIDEpIFJlbW92ZSBhbiBhbHBoYSBjaGFubmVsIGJ5IHByZS1tdWx0aXBsaWNhdGlvbiBvciBjb21wb3NpdGluZyBvbiBhCisgKiAgICBiYWNrZ3JvdW5kIGNvbG9yLiAgKEFkZGluZyBhbiBhbHBoYSBjaGFubmVsIGlzIGEgbm8tb3AuKQorICoKKyAqIDIpIFJlbW92ZSBjb2xvciBieSBtYXBwaW5nIHRvIGdyYXlzY2FsZS4gIChHcmF5c2NhbGUgdG8gY29sb3IgaXMgYSBuby1vcC4pCisgKgorICogMykgQ29udmVydCBiZXR3ZWVuIDgtYml0IGFuZCAxNi1iaXQgY29tcG9uZW50cy4gIChCb3RoIGRpcmVjdHRpb25zIGFyZQorICogICAgcmVsZXZhbnQuKQorICoKKyAqIFRoaXMgZ2l2ZXMgdGhlIGZvbGxvd2luZyBiYXNlIGZvcm1hdCBjb252ZXJzaW9uIG1hdHJpeDoKKyAqCisgKiAgIE9VVDogICAgLS0tLS0gOC1iaXQgLS0tLS0gICAgLS0tLS0gMTYtYml0IC0tLS0tCisgKiAgIElOICAgICBHICAgIEdBICAgUkdCICBSR0JBICBHICAgIEdBICAgUkdCICBSR0JBCisgKiAgOCBHICAgICAuICAgIC4gICAgLiAgICAuICAgICBsaW4gIGxpbiAgbGluICBsaW4KKyAqICA4IEdBICAgIGJja2cgLiAgICBiY2tjIC4gICAgIHByZScgcHJlICBwcmUnIHByZQorICogIDggUkdCICAgZzggICBnOCAgIC4gICAgLiAgICAgZ2xpbiBnbGluIGxpbiAgbGluCisgKiAgOCBSR0JBICBnOGIgIGc4ICAgYmNrYyAuICAgICBncHInIGdwcmUgcHJlJyBwcmUKKyAqIDE2IEcgICAgIHNSR0Igc1JHQiBzUkdCIHNSR0IgIC4gICAgLiAgICAuICAgIC4KKyAqIDE2IEdBICAgIGIxNmcgdW5wZyBiMTZjIHVucGMgIEEgICAgLiAgICBBICAgIC4KKyAqIDE2IFJHQiAgIHNHICAgc0cgICBzUkdCIHNSR0IgIGcxNiAgZzE2ICAuICAgIC4KKyAqIDE2IFJHQkEgIGdiMTYgc0dwICBjYjE2IHNDcCAgIGcxNiAgZzE2JyBBICAgIC4KKyAqCisgKiAgOC1iaXQgdG8gOC1iaXQ6CisgKiBiY2tnOiBjb21wb3NpdGUgb24gZ3JheSBiYWNrZ3JvdW5kCisgKiBiY2tjOiBjb21wb3NpdGUgb24gY29sb3IgYmFja2dyb3VuZAorICogZzg6ICAgY29udmVydCBzUkdCIGNvbXBvbmVudHMgdG8gc1JHQiBncmF5c2NhbGUKKyAqIGc4YjogIGNvbnZlcnQgc1JHQiBjb21wb25lbnRzIHRvIGdyYXlzY2FsZSBhbmQgY29tcG9zaXRlIG9uIGdyYXkgYmFja2dyb3VuZAorICoKKyAqICA4LWJpdCB0byAxNi1iaXQ6CisgKiBsaW46ICBtYWtlIHNSR0IgY29tcG9uZW50cyBsaW5lYXIsIGFscGhhIDo9IDY1NTM1CisgKiBwcmU6ICBtYWtlIHNSR0IgY29tcG9uZW50cyBsaW5lYXIgYW5kIHByZW11bHRpcGx5IGJ5IGFscGhhICAoc2NhbGUgYWxwaGEpCisgKiBwcmUnOiBhcyAncHJlJyBidXQgYWxwaGEgOj0gNjU1MzUKKyAqIGdsaW46IG1ha2Ugc1JHQiBjb21wb25lbnRzIGxpbmVhciwgY29udmVydCB0byBncmF5c2NhbGUsIGFscGhhIDo9IDY1NTM1CisgKiBncHJlOiBtYWtlIHNSR0IgY29tcG9uZW50cyBncmF5c2NhbGUgYW5kIGxpbmVhciBhbmQgcHJlbXVsdGlwbHkgYnkgYWxwaGEKKyAqIGdwcic6IGFzICdncHJlJyBidXQgYWxwaGEgOj0gNjU1MzUKKyAqCisgKiAgMTYtYml0IHRvIDgtYml0OgorICogc1JHQjogY29udmVydCBsaW5lYXIgY29tcG9uZW50cyB0byBzUkdCLCBhbHBoYSA6PSAyNTUKKyAqIHVucGc6IHVucHJlbXVsdGlwbHkgZ3JheSBjb21wb25lbnQgYW5kIGNvbnZlcnQgdG8gc1JHQiAoc2NhbGUgYWxwaGEpCisgKiB1bnBjOiB1bnByZW11bHRpcGx5IGNvbG9yIGNvbXBvbmVudHMgYW5kIGNvbnZlcnQgdG8gc1JHQiAoc2NhbGUgYWxwaGEpCisgKiBiMTZnOiBjb21wb3NpdGUgbGluZWFyIG9udG8gZ3JheSBiYWNrZ3JvdW5kIGFuZCBjb252ZXJ0IHRoZSByZXN1bHQgdG8gc1JHQgorICogYjE2YzogY29tcG9zaXRlIGxpbmVhciBvbnRvIGNvbG9yIGJhY2tncm91bmQgYW5kIGNvbnZlcnQgdGhlIHJlc3VsdCB0byBzUkdCCisgKiBzRzogICBjb252ZXJ0IGxpbmVhciBSR0IgdG8gc1JHQiBncmF5c2NhbGUKKyAqIHNHcDogIHVucHJlbXVsdGlwbHkgUkdCIHRoZW4gY29udmVydCB0byBzUkdCIGdyYXlzY2FsZQorICogc0NwOiAgdW5wcmVtdWx0aXBseSBSR0IgdGhlbiBjb252ZXJ0IHRvIHNSR0IKKyAqIGdiMTY6IGNvbXBvc2l0ZSBsaW5lYXIgb250byBiYWNrZ3JvdW5kIGFuZCBjb252ZXJ0IHRvIHNSR0IgZ3JheXNjYWxlCisgKiAgICAgICAob3JkZXIgZG9lc24ndCBtYXR0ZXIsIHRoZSBjb21wb3NpdGUgYW5kIGdyYXlzY2FsZSBvcGVyYXRpb25zIHBlcm11dGUpCisgKiBjYjE2OiBjb21wb3NpdGUgbGluZWFyIG9udG8gYmFja2dyb3VuZCBhbmQgY29udmVydCB0byBzUkdCCisgKgorICogIDE2LWJpdCB0byAxNi1iaXQ6CisgKiBBOiAgICBzZXQgYWxwaGEgdG8gNjU1MzUKKyAqIGcxNjogIGNvbnZlcnQgbGluZWFyIFJHQiB0byBsaW5lYXIgZ3JheXNjYWxlIChhbHBoYSA6PSA2NTUzNSkKKyAqIGcxNic6IGFzICdnMTYnIGJ1dCBhbHBoYSBpcyB1bmNoYW5nZWQKKyAqLworLyogU2ltcGxlIGNvcHk6ICovCitzdGF0aWMgdm9pZAorZ3BjX25vb3AoUGl4ZWwgKm91dCwgY29uc3QgUGl4ZWwgKmluLCBjb25zdCBCYWNrZ3JvdW5kICpiYWNrKQoreworICAgKHZvaWQpYmFjazsKKyAgIG91dC0+ciA9IGluLT5yOworICAgb3V0LT5nID0gaW4tPmc7CisgICBvdXQtPmIgPSBpbi0+YjsKKyAgIG91dC0+YSA9IGluLT5hOworfQorCisjaWYgQUxMT1dfVU5VU0VEX0dQQworc3RhdGljIHZvaWQKK2dwY19ub3A4KFBpeGVsICpvdXQsIGNvbnN0IFBpeGVsICppbiwgY29uc3QgQmFja2dyb3VuZCAqYmFjaykKK3sKKyAgICh2b2lkKWJhY2s7CisgICBpZiAoaW4tPmEgPT0gMCkKKyAgICAgIG91dC0+ciA9IG91dC0+ZyA9IG91dC0+YiA9IDI1NTsKKworICAgZWxzZQorICAgeworICAgICAgb3V0LT5yID0gaW4tPnI7CisgICAgICBvdXQtPmcgPSBpbi0+ZzsKKyAgICAgIG91dC0+YiA9IGluLT5iOworICAgfQorCisgICBvdXQtPmEgPSBpbi0+YTsKK30KKyNlbmRpZgorCisjaWYgQUxMT1dfVU5VU0VEX0dQQworc3RhdGljIHZvaWQKK2dwY19ub3A2KFBpeGVsICpvdXQsIGNvbnN0IFBpeGVsICppbiwgY29uc3QgQmFja2dyb3VuZCAqYmFjaykKK3sKKyAgICh2b2lkKWJhY2s7CisgICBpZiAoaW4tPmEgPT0gMCkKKyAgICAgIG91dC0+ciA9IG91dC0+ZyA9IG91dC0+YiA9IDY1NTM1OworCisgICBlbHNlCisgICB7CisgICAgICBvdXQtPnIgPSBpbi0+cjsKKyAgICAgIG91dC0+ZyA9IGluLT5nOworICAgICAgb3V0LT5iID0gaW4tPmI7CisgICB9CisKKyAgIG91dC0+YSA9IGluLT5hOworfQorI2VuZGlmCisKKy8qIDgtYml0IHRvIDgtYml0IGNvbnZlcnNpb25zICovCisvKiBiY2tnOiBjb21wb3NpdGUgb24gZ3JheSBiYWNrZ3JvdW5kICovCitzdGF0aWMgdm9pZAorZ3BjX2Jja2coUGl4ZWwgKm91dCwgY29uc3QgUGl4ZWwgKmluLCBjb25zdCBCYWNrZ3JvdW5kICpiYWNrKQoreworICAgaWYgKGluLT5hIDw9IDApCisgICAgICBvdXQtPnIgPSBvdXQtPmcgPSBvdXQtPmIgPSBiYWNrLT5pZzsKKworICAgZWxzZSBpZiAoaW4tPmEgPj0gMjU1KQorICAgICAgb3V0LT5yID0gb3V0LT5nID0gb3V0LT5iID0gaW4tPmc7CisKKyAgIGVsc2UKKyAgIHsKKyAgICAgIGRvdWJsZSBhID0gaW4tPmEgLyAyNTUuOworCisgICAgICBvdXQtPnIgPSBvdXQtPmcgPSBvdXQtPmIgPSBzUkdCKHNSR0JfdG9fZFtpbi0+Z10gKiBhICsgYmFjay0+ZGcgKiAoMS1hKSk7CisgICB9CisKKyAgIG91dC0+YSA9IDI1NTsKK30KKworLyogYmNrYzogY29tcG9zaXRlIG9uIGNvbG9yIGJhY2tncm91bmQgKi8KK3N0YXRpYyB2b2lkCitncGNfYmNrYyhQaXhlbCAqb3V0LCBjb25zdCBQaXhlbCAqaW4sIGNvbnN0IEJhY2tncm91bmQgKmJhY2spCit7CisgICBpZiAoaW4tPmEgPD0gMCkKKyAgIHsKKyAgICAgIG91dC0+ciA9IGJhY2stPmlyOworICAgICAgb3V0LT5nID0gYmFjay0+aWc7CisgICAgICBvdXQtPmIgPSBiYWNrLT5pYjsKKyAgIH0KKworICAgZWxzZSBpZiAoaW4tPmEgPj0gMjU1KQorICAgeworICAgICAgb3V0LT5yID0gaW4tPnI7CisgICAgICBvdXQtPmcgPSBpbi0+ZzsKKyAgICAgIG91dC0+YiA9IGluLT5iOworICAgfQorCisgICBlbHNlCisgICB7CisgICAgICBkb3VibGUgYSA9IGluLT5hIC8gMjU1LjsKKworICAgICAgb3V0LT5yID0gc1JHQihzUkdCX3RvX2RbaW4tPnJdICogYSArIGJhY2stPmRyICogKDEtYSkpOworICAgICAgb3V0LT5nID0gc1JHQihzUkdCX3RvX2RbaW4tPmddICogYSArIGJhY2stPmRnICogKDEtYSkpOworICAgICAgb3V0LT5iID0gc1JHQihzUkdCX3RvX2RbaW4tPmJdICogYSArIGJhY2stPmRiICogKDEtYSkpOworICAgfQorCisgICBvdXQtPmEgPSAyNTU7Cit9CisKKy8qIGc4OiBjb252ZXJ0IHNSR0IgY29tcG9uZW50cyB0byBzUkdCIGdyYXlzY2FsZSAqLworc3RhdGljIHZvaWQKK2dwY19nOChQaXhlbCAqb3V0LCBjb25zdCBQaXhlbCAqaW4sIGNvbnN0IEJhY2tncm91bmQgKmJhY2spCit7CisgICAodm9pZCliYWNrOworCisgICBpZiAoaW4tPnIgPT0gaW4tPmcgJiYgaW4tPmcgPT0gaW4tPmIpCisgICAgICBvdXQtPnIgPSBvdXQtPmcgPSBvdXQtPmIgPSBpbi0+ZzsKKworICAgZWxzZQorICAgICAgb3V0LT5yID0gb3V0LT5nID0gb3V0LT5iID0KKyAgICAgICAgIHNSR0IoWWZyb21SR0Ioc1JHQl90b19kW2luLT5yXSwgc1JHQl90b19kW2luLT5nXSwgc1JHQl90b19kW2luLT5iXSkpOworCisgICBvdXQtPmEgPSBpbi0+YTsKK30KKworLyogZzhiOiBjb252ZXJ0IHNSR0IgY29tcG9uZW50cyB0byBncmF5c2NhbGUgYW5kIGNvbXBvc2l0ZSBvbiBncmF5IGJhY2tncm91bmQgKi8KK3N0YXRpYyB2b2lkCitncGNfZzhiKFBpeGVsICpvdXQsIGNvbnN0IFBpeGVsICppbiwgY29uc3QgQmFja2dyb3VuZCAqYmFjaykKK3sKKyAgIGlmIChpbi0+YSA8PSAwKQorICAgICAgb3V0LT5yID0gb3V0LT5nID0gb3V0LT5iID0gYmFjay0+aWc7CisKKyAgIGVsc2UgaWYgKGluLT5hID49IDI1NSkKKyAgIHsKKyAgICAgIGlmIChpbi0+ciA9PSBpbi0+ZyAmJiBpbi0+ZyA9PSBpbi0+YikKKyAgICAgICAgIG91dC0+ciA9IG91dC0+ZyA9IG91dC0+YiA9IGluLT5nOworCisgICAgICBlbHNlCisgICAgICAgICBvdXQtPnIgPSBvdXQtPmcgPSBvdXQtPmIgPSBzUkdCKFlmcm9tUkdCKAorICAgICAgICAgICAgc1JHQl90b19kW2luLT5yXSwgc1JHQl90b19kW2luLT5nXSwgc1JHQl90b19kW2luLT5iXSkpOworICAgfQorCisgICBlbHNlCisgICB7CisgICAgICBkb3VibGUgYSA9IGluLT5hLzI1NS47CisKKyAgICAgIG91dC0+ciA9IG91dC0+ZyA9IG91dC0+YiA9IHNSR0IoYSAqIFlmcm9tUkdCKHNSR0JfdG9fZFtpbi0+cl0sCisgICAgICAgICBzUkdCX3RvX2RbaW4tPmddLCBzUkdCX3RvX2RbaW4tPmJdKSArIGJhY2stPmRnICogKDEtYSkpOworICAgfQorCisgICBvdXQtPmEgPSAyNTU7Cit9CisKKy8qIDgtYml0IHRvIDE2LWJpdCBjb252ZXJzaW9ucyAqLworLyogbGluOiBtYWtlIHNSR0IgY29tcG9uZW50cyBsaW5lYXIsIGFscGhhIDo9IDY1NTM1ICovCitzdGF0aWMgdm9pZAorZ3BjX2xpbihQaXhlbCAqb3V0LCBjb25zdCBQaXhlbCAqaW4sIGNvbnN0IEJhY2tncm91bmQgKmJhY2spCit7CisgICAodm9pZCliYWNrOworCisgICBvdXQtPnIgPSBpbGluZWFyKGluLT5yKTsKKworICAgaWYgKGluLT5nID09IGluLT5yKQorICAgeworICAgICAgb3V0LT5nID0gb3V0LT5yOworCisgICAgICBpZiAoaW4tPmIgPT0gaW4tPnIpCisgICAgICAgICBvdXQtPmIgPSBvdXQtPnI7CisKKyAgICAgIGVsc2UKKyAgICAgICAgIG91dC0+YiA9IGlsaW5lYXIoaW4tPmIpOworICAgfQorCisgICBlbHNlCisgICB7CisgICAgICBvdXQtPmcgPSBpbGluZWFyKGluLT5nKTsKKworICAgICAgaWYgKGluLT5iID09IGluLT5yKQorICAgICAgICAgb3V0LT5iID0gb3V0LT5yOworCisgICAgICBlbHNlIGlmIChpbi0+YiA9PSBpbi0+ZykKKyAgICAgICAgIG91dC0+YiA9IG91dC0+ZzsKKworICAgICAgZWxzZQorICAgICAgICAgb3V0LT5iID0gaWxpbmVhcihpbi0+Yik7CisgICB9CisKKyAgIG91dC0+YSA9IDY1NTM1OworfQorCisvKiBwcmU6IG1ha2Ugc1JHQiBjb21wb25lbnRzIGxpbmVhciBhbmQgcHJlbXVsdGlwbHkgYnkgYWxwaGEgKHNjYWxlIGFscGhhKSAqLworc3RhdGljIHZvaWQKK2dwY19wcmUoUGl4ZWwgKm91dCwgY29uc3QgUGl4ZWwgKmluLCBjb25zdCBCYWNrZ3JvdW5kICpiYWNrKQoreworICAgKHZvaWQpYmFjazsKKworICAgb3V0LT5yID0gaWxpbmVhcmEoaW4tPnIsIGluLT5hKTsKKworICAgaWYgKGluLT5nID09IGluLT5yKQorICAgeworICAgICAgb3V0LT5nID0gb3V0LT5yOworCisgICAgICBpZiAoaW4tPmIgPT0gaW4tPnIpCisgICAgICAgICBvdXQtPmIgPSBvdXQtPnI7CisKKyAgICAgIGVsc2UKKyAgICAgICAgIG91dC0+YiA9IGlsaW5lYXJhKGluLT5iLCBpbi0+YSk7CisgICB9CisKKyAgIGVsc2UKKyAgIHsKKyAgICAgIG91dC0+ZyA9IGlsaW5lYXJhKGluLT5nLCBpbi0+YSk7CisKKyAgICAgIGlmIChpbi0+YiA9PSBpbi0+cikKKyAgICAgICAgIG91dC0+YiA9IG91dC0+cjsKKworICAgICAgZWxzZSBpZiAoaW4tPmIgPT0gaW4tPmcpCisgICAgICAgICBvdXQtPmIgPSBvdXQtPmc7CisKKyAgICAgIGVsc2UKKyAgICAgICAgIG91dC0+YiA9IGlsaW5lYXJhKGluLT5iLCBpbi0+YSk7CisgICB9CisKKyAgIG91dC0+YSA9IGluLT5hICogMjU3OworfQorCisvKiBwcmUnOiBhcyAncHJlJyBidXQgYWxwaGEgOj0gNjU1MzUgKi8KK3N0YXRpYyB2b2lkCitncGNfcHJlcShQaXhlbCAqb3V0LCBjb25zdCBQaXhlbCAqaW4sIGNvbnN0IEJhY2tncm91bmQgKmJhY2spCit7CisgICAodm9pZCliYWNrOworCisgICBvdXQtPnIgPSBpbGluZWFyYShpbi0+ciwgaW4tPmEpOworCisgICBpZiAoaW4tPmcgPT0gaW4tPnIpCisgICB7CisgICAgICBvdXQtPmcgPSBvdXQtPnI7CisKKyAgICAgIGlmIChpbi0+YiA9PSBpbi0+cikKKyAgICAgICAgIG91dC0+YiA9IG91dC0+cjsKKworICAgICAgZWxzZQorICAgICAgICAgb3V0LT5iID0gaWxpbmVhcmEoaW4tPmIsIGluLT5hKTsKKyAgIH0KKworICAgZWxzZQorICAgeworICAgICAgb3V0LT5nID0gaWxpbmVhcmEoaW4tPmcsIGluLT5hKTsKKworICAgICAgaWYgKGluLT5iID09IGluLT5yKQorICAgICAgICAgb3V0LT5iID0gb3V0LT5yOworCisgICAgICBlbHNlIGlmIChpbi0+YiA9PSBpbi0+ZykKKyAgICAgICAgIG91dC0+YiA9IG91dC0+ZzsKKworICAgICAgZWxzZQorICAgICAgICAgb3V0LT5iID0gaWxpbmVhcmEoaW4tPmIsIGluLT5hKTsKKyAgIH0KKworICAgb3V0LT5hID0gNjU1MzU7Cit9CisKKy8qIGdsaW46IG1ha2Ugc1JHQiBjb21wb25lbnRzIGxpbmVhciwgY29udmVydCB0byBncmF5c2NhbGUsIGFscGhhIDo9IDY1NTM1ICovCitzdGF0aWMgdm9pZAorZ3BjX2dsaW4oUGl4ZWwgKm91dCwgY29uc3QgUGl4ZWwgKmluLCBjb25zdCBCYWNrZ3JvdW5kICpiYWNrKQoreworICAgKHZvaWQpYmFjazsKKworICAgaWYgKGluLT5yID09IGluLT5nICYmIGluLT5nID09IGluLT5iKQorICAgICAgb3V0LT5yID0gb3V0LT5nID0gb3V0LT5iID0gaWxpbmVhcihpbi0+Zyk7CisKKyAgIGVsc2UKKyAgICAgIG91dC0+ciA9IG91dC0+ZyA9IG91dC0+YiA9IHUxNmQoNjU1MzUgKgorICAgICAgICAgWWZyb21SR0Ioc1JHQl90b19kW2luLT5yXSwgc1JHQl90b19kW2luLT5nXSwgc1JHQl90b19kW2luLT5iXSkpOworCisgICBvdXQtPmEgPSA2NTUzNTsKK30KKworLyogZ3ByZTogbWFrZSBzUkdCIGNvbXBvbmVudHMgZ3JheXNjYWxlIGFuZCBsaW5lYXIgYW5kIHByZW11bHRpcGx5IGJ5IGFscGhhICovCitzdGF0aWMgdm9pZAorZ3BjX2dwcmUoUGl4ZWwgKm91dCwgY29uc3QgUGl4ZWwgKmluLCBjb25zdCBCYWNrZ3JvdW5kICpiYWNrKQoreworICAgKHZvaWQpYmFjazsKKworICAgaWYgKGluLT5yID09IGluLT5nICYmIGluLT5nID09IGluLT5iKQorICAgICAgb3V0LT5yID0gb3V0LT5nID0gb3V0LT5iID0gaWxpbmVhcmEoaW4tPmcsIGluLT5hKTsKKworICAgZWxzZQorICAgICAgb3V0LT5yID0gb3V0LT5nID0gb3V0LT5iID0gdTE2ZChpbi0+YSAqIDI1NyAqCisgICAgICAgICBZZnJvbVJHQihzUkdCX3RvX2RbaW4tPnJdLCBzUkdCX3RvX2RbaW4tPmddLCBzUkdCX3RvX2RbaW4tPmJdKSk7CisKKyAgIG91dC0+YSA9IDI1NyAqIGluLT5hOworfQorCisvKiBncHInOiBhcyAnZ3ByZScgYnV0IGFscGhhIDo9IDY1NTM1ICovCitzdGF0aWMgdm9pZAorZ3BjX2dwcnEoUGl4ZWwgKm91dCwgY29uc3QgUGl4ZWwgKmluLCBjb25zdCBCYWNrZ3JvdW5kICpiYWNrKQoreworICAgKHZvaWQpYmFjazsKKworICAgaWYgKGluLT5yID09IGluLT5nICYmIGluLT5nID09IGluLT5iKQorICAgICAgb3V0LT5yID0gb3V0LT5nID0gb3V0LT5iID0gaWxpbmVhcmEoaW4tPmcsIGluLT5hKTsKKworICAgZWxzZQorICAgICAgb3V0LT5yID0gb3V0LT5nID0gb3V0LT5iID0gdTE2ZChpbi0+YSAqIDI1NyAqCisgICAgICAgICBZZnJvbVJHQihzUkdCX3RvX2RbaW4tPnJdLCBzUkdCX3RvX2RbaW4tPmddLCBzUkdCX3RvX2RbaW4tPmJdKSk7CisKKyAgIG91dC0+YSA9IDY1NTM1OworfQorCisvKiA4LWJpdCB0byAxNi1iaXQgY29udmVyc2lvbnMgZm9yIGdBTUEgNDU0NTUgZW5jb2RlZCB2YWx1ZXMgKi8KKy8qIExpbjogbWFrZSBnQU1BIDQ1NDU1IGNvbXBvbmVudHMgbGluZWFyLCBhbHBoYSA6PSA2NTUzNSAqLworc3RhdGljIHZvaWQKK2dwY19MaW4oUGl4ZWwgKm91dCwgY29uc3QgUGl4ZWwgKmluLCBjb25zdCBCYWNrZ3JvdW5kICpiYWNrKQoreworICAgKHZvaWQpYmFjazsKKworICAgb3V0LT5yID0gaWxpbmVhcl9nMjIoaW4tPnIpOworCisgICBpZiAoaW4tPmcgPT0gaW4tPnIpCisgICB7CisgICAgICBvdXQtPmcgPSBvdXQtPnI7CisKKyAgICAgIGlmIChpbi0+YiA9PSBpbi0+cikKKyAgICAgICAgIG91dC0+YiA9IG91dC0+cjsKKworICAgICAgZWxzZQorICAgICAgICAgb3V0LT5iID0gaWxpbmVhcl9nMjIoaW4tPmIpOworICAgfQorCisgICBlbHNlCisgICB7CisgICAgICBvdXQtPmcgPSBpbGluZWFyX2cyMihpbi0+Zyk7CisKKyAgICAgIGlmIChpbi0+YiA9PSBpbi0+cikKKyAgICAgICAgIG91dC0+YiA9IG91dC0+cjsKKworICAgICAgZWxzZSBpZiAoaW4tPmIgPT0gaW4tPmcpCisgICAgICAgICBvdXQtPmIgPSBvdXQtPmc7CisKKyAgICAgIGVsc2UKKyAgICAgICAgIG91dC0+YiA9IGlsaW5lYXJfZzIyKGluLT5iKTsKKyAgIH0KKworICAgb3V0LT5hID0gNjU1MzU7Cit9CisKKyNpZiBBTExPV19VTlVTRURfR1BDCisvKiBQcmU6IG1ha2UgZ0FNQSA0NTQ1NSBjb21wb25lbnRzIGxpbmVhciBhbmQgcHJlbXVsdGlwbHkgYnkgYWxwaGEgKHNjYWxlIGFscGhhKQorICovCitzdGF0aWMgdm9pZAorZ3BjX1ByZShQaXhlbCAqb3V0LCBjb25zdCBQaXhlbCAqaW4sIGNvbnN0IEJhY2tncm91bmQgKmJhY2spCit7CisgICAodm9pZCliYWNrOworCisgICBvdXQtPnIgPSBpbGluZWFyYV9nMjIoaW4tPnIsIGluLT5hKTsKKworICAgaWYgKGluLT5nID09IGluLT5yKQorICAgeworICAgICAgb3V0LT5nID0gb3V0LT5yOworCisgICAgICBpZiAoaW4tPmIgPT0gaW4tPnIpCisgICAgICAgICBvdXQtPmIgPSBvdXQtPnI7CisKKyAgICAgIGVsc2UKKyAgICAgICAgIG91dC0+YiA9IGlsaW5lYXJhX2cyMihpbi0+YiwgaW4tPmEpOworICAgfQorCisgICBlbHNlCisgICB7CisgICAgICBvdXQtPmcgPSBpbGluZWFyYV9nMjIoaW4tPmcsIGluLT5hKTsKKworICAgICAgaWYgKGluLT5iID09IGluLT5yKQorICAgICAgICAgb3V0LT5iID0gb3V0LT5yOworCisgICAgICBlbHNlIGlmIChpbi0+YiA9PSBpbi0+ZykKKyAgICAgICAgIG91dC0+YiA9IG91dC0+ZzsKKworICAgICAgZWxzZQorICAgICAgICAgb3V0LT5iID0gaWxpbmVhcmFfZzIyKGluLT5iLCBpbi0+YSk7CisgICB9CisKKyAgIG91dC0+YSA9IGluLT5hICogMjU3OworfQorI2VuZGlmCisKKyNpZiBBTExPV19VTlVTRURfR1BDCisvKiBQcmUnOiBhcyAnUHJlJyBidXQgYWxwaGEgOj0gNjU1MzUgKi8KK3N0YXRpYyB2b2lkCitncGNfUHJlcShQaXhlbCAqb3V0LCBjb25zdCBQaXhlbCAqaW4sIGNvbnN0IEJhY2tncm91bmQgKmJhY2spCit7CisgICAodm9pZCliYWNrOworCisgICBvdXQtPnIgPSBpbGluZWFyYV9nMjIoaW4tPnIsIGluLT5hKTsKKworICAgaWYgKGluLT5nID09IGluLT5yKQorICAgeworICAgICAgb3V0LT5nID0gb3V0LT5yOworCisgICAgICBpZiAoaW4tPmIgPT0gaW4tPnIpCisgICAgICAgICBvdXQtPmIgPSBvdXQtPnI7CisKKyAgICAgIGVsc2UKKyAgICAgICAgIG91dC0+YiA9IGlsaW5lYXJhX2cyMihpbi0+YiwgaW4tPmEpOworICAgfQorCisgICBlbHNlCisgICB7CisgICAgICBvdXQtPmcgPSBpbGluZWFyYV9nMjIoaW4tPmcsIGluLT5hKTsKKworICAgICAgaWYgKGluLT5iID09IGluLT5yKQorICAgICAgICAgb3V0LT5iID0gb3V0LT5yOworCisgICAgICBlbHNlIGlmIChpbi0+YiA9PSBpbi0+ZykKKyAgICAgICAgIG91dC0+YiA9IG91dC0+ZzsKKworICAgICAgZWxzZQorICAgICAgICAgb3V0LT5iID0gaWxpbmVhcmFfZzIyKGluLT5iLCBpbi0+YSk7CisgICB9CisKKyAgIG91dC0+YSA9IDY1NTM1OworfQorI2VuZGlmCisKKyNpZiBBTExPV19VTlVTRURfR1BDCisvKiBHbGluOiBtYWtlIGdBTUEgNDU0NTUgY29tcG9uZW50cyBsaW5lYXIsIGNvbnZlcnQgdG8gZ3JheXNjYWxlLCBhbHBoYSA6PSA2NTUzNQorICovCitzdGF0aWMgdm9pZAorZ3BjX0dsaW4oUGl4ZWwgKm91dCwgY29uc3QgUGl4ZWwgKmluLCBjb25zdCBCYWNrZ3JvdW5kICpiYWNrKQoreworICAgKHZvaWQpYmFjazsKKworICAgaWYgKGluLT5yID09IGluLT5nICYmIGluLT5nID09IGluLT5iKQorICAgICAgb3V0LT5yID0gb3V0LT5nID0gb3V0LT5iID0gaWxpbmVhcl9nMjIoaW4tPmcpOworCisgICBlbHNlCisgICAgICBvdXQtPnIgPSBvdXQtPmcgPSBvdXQtPmIgPSB1MTZkKDY1NTM1ICoKKyAgICAgICAgIFlmcm9tUkdCKGcyMl90b19kW2luLT5yXSwgZzIyX3RvX2RbaW4tPmddLCBnMjJfdG9fZFtpbi0+Yl0pKTsKKworICAgb3V0LT5hID0gNjU1MzU7Cit9CisjZW5kaWYKKworI2lmIEFMTE9XX1VOVVNFRF9HUEMKKy8qIEdwcmU6IG1ha2UgZ0FNQSA0NTQ1NSBjb21wb25lbnRzIGdyYXlzY2FsZSBhbmQgbGluZWFyIGFuZCBwcmVtdWx0aXBseSBieQorICogYWxwaGEuCisgKi8KK3N0YXRpYyB2b2lkCitncGNfR3ByZShQaXhlbCAqb3V0LCBjb25zdCBQaXhlbCAqaW4sIGNvbnN0IEJhY2tncm91bmQgKmJhY2spCit7CisgICAodm9pZCliYWNrOworCisgICBpZiAoaW4tPnIgPT0gaW4tPmcgJiYgaW4tPmcgPT0gaW4tPmIpCisgICAgICBvdXQtPnIgPSBvdXQtPmcgPSBvdXQtPmIgPSBpbGluZWFyYV9nMjIoaW4tPmcsIGluLT5hKTsKKworICAgZWxzZQorICAgICAgb3V0LT5yID0gb3V0LT5nID0gb3V0LT5iID0gdTE2ZChpbi0+YSAqIDI1NyAqCisgICAgICAgICBZZnJvbVJHQihnMjJfdG9fZFtpbi0+cl0sIGcyMl90b19kW2luLT5nXSwgZzIyX3RvX2RbaW4tPmJdKSk7CisKKyAgIG91dC0+YSA9IDI1NyAqIGluLT5hOworfQorI2VuZGlmCisKKyNpZiBBTExPV19VTlVTRURfR1BDCisvKiBHcHInOiBhcyAnR3ByZScgYnV0IGFscGhhIDo9IDY1NTM1ICovCitzdGF0aWMgdm9pZAorZ3BjX0dwcnEoUGl4ZWwgKm91dCwgY29uc3QgUGl4ZWwgKmluLCBjb25zdCBCYWNrZ3JvdW5kICpiYWNrKQoreworICAgKHZvaWQpYmFjazsKKworICAgaWYgKGluLT5yID09IGluLT5nICYmIGluLT5nID09IGluLT5iKQorICAgICAgb3V0LT5yID0gb3V0LT5nID0gb3V0LT5iID0gaWxpbmVhcmFfZzIyKGluLT5nLCBpbi0+YSk7CisKKyAgIGVsc2UKKyAgICAgIG91dC0+ciA9IG91dC0+ZyA9IG91dC0+YiA9IHUxNmQoaW4tPmEgKiAyNTcgKgorICAgICAgICAgWWZyb21SR0IoZzIyX3RvX2RbaW4tPnJdLCBnMjJfdG9fZFtpbi0+Z10sIGcyMl90b19kW2luLT5iXSkpOworCisgICBvdXQtPmEgPSA2NTUzNTsKK30KKyNlbmRpZgorCisvKiAxNi1iaXQgdG8gOC1iaXQgY29udmVyc2lvbnMgKi8KKy8qIHNSR0I6IGNvbnZlcnQgbGluZWFyIGNvbXBvbmVudHMgdG8gc1JHQiwgYWxwaGEgOj0gMjU1ICovCitzdGF0aWMgdm9pZAorZ3BjX3NSR0IoUGl4ZWwgKm91dCwgY29uc3QgUGl4ZWwgKmluLCBjb25zdCBCYWNrZ3JvdW5kICpiYWNrKQoreworICAgKHZvaWQpYmFjazsKKworICAgb3V0LT5yID0gaXNSR0IoaW4tPnIpOworCisgICBpZiAoaW4tPmcgPT0gaW4tPnIpCisgICB7CisgICAgICBvdXQtPmcgPSBvdXQtPnI7CisKKyAgICAgIGlmIChpbi0+YiA9PSBpbi0+cikKKyAgICAgICAgIG91dC0+YiA9IG91dC0+cjsKKworICAgICAgZWxzZQorICAgICAgICAgb3V0LT5iID0gaXNSR0IoaW4tPmIpOworICAgfQorCisgICBlbHNlCisgICB7CisgICAgICBvdXQtPmcgPSBpc1JHQihpbi0+Zyk7CisKKyAgICAgIGlmIChpbi0+YiA9PSBpbi0+cikKKyAgICAgICAgIG91dC0+YiA9IG91dC0+cjsKKworICAgICAgZWxzZSBpZiAoaW4tPmIgPT0gaW4tPmcpCisgICAgICAgICBvdXQtPmIgPSBvdXQtPmc7CisKKyAgICAgIGVsc2UKKyAgICAgICAgIG91dC0+YiA9IGlzUkdCKGluLT5iKTsKKyAgIH0KKworICAgb3V0LT5hID0gMjU1OworfQorCisvKiB1bnBnOiB1bnByZW11bHRpcGx5IGdyYXkgY29tcG9uZW50IGFuZCBjb252ZXJ0IHRvIHNSR0IgKHNjYWxlIGFscGhhKSAqLworc3RhdGljIHZvaWQKK2dwY191bnBnKFBpeGVsICpvdXQsIGNvbnN0IFBpeGVsICppbiwgY29uc3QgQmFja2dyb3VuZCAqYmFjaykKK3sKKyAgICh2b2lkKWJhY2s7CisKKyAgIGlmIChpbi0+YSA8PSAxMjgpCisgICB7CisgICAgICBvdXQtPnIgPSBvdXQtPmcgPSBvdXQtPmIgPSAyNTU7CisgICAgICBvdXQtPmEgPSAwOworICAgfQorCisgICBlbHNlCisgICB7CisgICAgICBvdXQtPnIgPSBvdXQtPmcgPSBvdXQtPmIgPSBzUkdCKChkb3VibGUpaW4tPmcgLyBpbi0+YSk7CisgICAgICBvdXQtPmEgPSB1OGQoaW4tPmEgLyAyNTcuKTsKKyAgIH0KK30KKworLyogdW5wYzogdW5wcmVtdWx0aXBseSBjb2xvciBjb21wb25lbnRzIGFuZCBjb252ZXJ0IHRvIHNSR0IgKHNjYWxlIGFscGhhKSAqLworc3RhdGljIHZvaWQKK2dwY191bnBjKFBpeGVsICpvdXQsIGNvbnN0IFBpeGVsICppbiwgY29uc3QgQmFja2dyb3VuZCAqYmFjaykKK3sKKyAgICh2b2lkKWJhY2s7CisKKyAgIGlmIChpbi0+YSA8PSAxMjgpCisgICB7CisgICAgICBvdXQtPnIgPSBvdXQtPmcgPSBvdXQtPmIgPSAyNTU7CisgICAgICBvdXQtPmEgPSAwOworICAgfQorCisgICBlbHNlCisgICB7CisgICAgICBvdXQtPnIgPSBzUkdCKChkb3VibGUpaW4tPnIgLyBpbi0+YSk7CisgICAgICBvdXQtPmcgPSBzUkdCKChkb3VibGUpaW4tPmcgLyBpbi0+YSk7CisgICAgICBvdXQtPmIgPSBzUkdCKChkb3VibGUpaW4tPmIgLyBpbi0+YSk7CisgICAgICBvdXQtPmEgPSB1OGQoaW4tPmEgLyAyNTcuKTsKKyAgIH0KK30KKworLyogYjE2ZzogY29tcG9zaXRlIGxpbmVhciBvbnRvIGdyYXkgYmFja2dyb3VuZCBhbmQgY29udmVydCB0aGUgcmVzdWx0IHRvIHNSR0IgKi8KK3N0YXRpYyB2b2lkCitncGNfYjE2ZyhQaXhlbCAqb3V0LCBjb25zdCBQaXhlbCAqaW4sIGNvbnN0IEJhY2tncm91bmQgKmJhY2spCit7CisgICBpZiAoaW4tPmEgPD0gMCkKKyAgICAgIG91dC0+ciA9IG91dC0+ZyA9IG91dC0+YiA9IGJhY2stPmlnOworCisgICBlbHNlCisgICB7CisgICAgICBkb3VibGUgYSA9IGluLT5hLzY1NTM1LjsKKyAgICAgIGRvdWJsZSBhMSA9IDEtYTsKKworICAgICAgYSAvPSA2NTUzNTsKKyAgICAgIG91dC0+ciA9IG91dC0+ZyA9IG91dC0+YiA9IHNSR0IoaW4tPmcgKiBhICsgYmFjay0+ZGcgKiBhMSk7CisgICB9CisKKyAgIG91dC0+YSA9IDI1NTsKK30KKworLyogYjE2YzogY29tcG9zaXRlIGxpbmVhciBvbnRvIGNvbG9yIGJhY2tncm91bmQgYW5kIGNvbnZlcnQgdGhlIHJlc3VsdCB0byBzUkdCKi8KK3N0YXRpYyB2b2lkCitncGNfYjE2YyhQaXhlbCAqb3V0LCBjb25zdCBQaXhlbCAqaW4sIGNvbnN0IEJhY2tncm91bmQgKmJhY2spCit7CisgICBpZiAoaW4tPmEgPD0gMCkKKyAgIHsKKyAgICAgIG91dC0+ciA9IGJhY2stPmlyOworICAgICAgb3V0LT5nID0gYmFjay0+aWc7CisgICAgICBvdXQtPmIgPSBiYWNrLT5pYjsKKyAgIH0KKworICAgZWxzZQorICAgeworICAgICAgZG91YmxlIGEgPSBpbi0+YS82NTUzNS47CisgICAgICBkb3VibGUgYTEgPSAxLWE7CisKKyAgICAgIGEgLz0gNjU1MzU7CisgICAgICBvdXQtPnIgPSBzUkdCKGluLT5yICogYSArIGJhY2stPmRyICogYTEpOworICAgICAgb3V0LT5nID0gc1JHQihpbi0+ZyAqIGEgKyBiYWNrLT5kZyAqIGExKTsKKyAgICAgIG91dC0+YiA9IHNSR0IoaW4tPmIgKiBhICsgYmFjay0+ZGIgKiBhMSk7CisgICB9CisKKyAgIG91dC0+YSA9IDI1NTsKK30KKworLyogc0c6IGNvbnZlcnQgbGluZWFyIFJHQiB0byBzUkdCIGdyYXlzY2FsZSAqLworc3RhdGljIHZvaWQKK2dwY19zRyhQaXhlbCAqb3V0LCBjb25zdCBQaXhlbCAqaW4sIGNvbnN0IEJhY2tncm91bmQgKmJhY2spCit7CisgICAodm9pZCliYWNrOworCisgICBvdXQtPnIgPSBvdXQtPmcgPSBvdXQtPmIgPSBzUkdCKFlmcm9tUkdCaW50KGluLT5yLCBpbi0+ZywgaW4tPmIpLzY1NTM1KTsKKyAgIG91dC0+YSA9IDI1NTsKK30KKworLyogc0dwOiB1bnByZW11bHRpcGx5IFJHQiB0aGVuIGNvbnZlcnQgdG8gc1JHQiBncmF5c2NhbGUgKi8KK3N0YXRpYyB2b2lkCitncGNfc0dwKFBpeGVsICpvdXQsIGNvbnN0IFBpeGVsICppbiwgY29uc3QgQmFja2dyb3VuZCAqYmFjaykKK3sKKyAgICh2b2lkKWJhY2s7CisKKyAgIGlmIChpbi0+YSA8PSAxMjgpCisgICB7CisgICAgICBvdXQtPnIgPSBvdXQtPmcgPSBvdXQtPmIgPSAyNTU7CisgICAgICBvdXQtPmEgPSAwOworICAgfQorCisgICBlbHNlCisgICB7CisgICAgICBvdXQtPnIgPSBvdXQtPmcgPSBvdXQtPmIgPSBzUkdCKFlmcm9tUkdCaW50KGluLT5yLCBpbi0+ZywgaW4tPmIpL2luLT5hKTsKKyAgICAgIG91dC0+YSA9IHU4ZChpbi0+YSAvIDI1Ny4pOworICAgfQorfQorCisvKiBzQ3A6IHVucHJlbXVsdGlwbHkgUkdCIHRoZW4gY29udmVydCB0byBzUkdCICovCitzdGF0aWMgdm9pZAorZ3BjX3NDcChQaXhlbCAqb3V0LCBjb25zdCBQaXhlbCAqaW4sIGNvbnN0IEJhY2tncm91bmQgKmJhY2spCit7CisgICAodm9pZCliYWNrOworCisgICBpZiAoaW4tPmEgPD0gMTI4KQorICAgeworICAgICAgb3V0LT5yID0gb3V0LT5nID0gb3V0LT5iID0gMjU1OworICAgICAgb3V0LT5hID0gMDsKKyAgIH0KKworICAgZWxzZQorICAgeworICAgICAgb3V0LT5yID0gc1JHQigoZG91YmxlKWluLT5yIC8gaW4tPmEpOworICAgICAgb3V0LT5nID0gc1JHQigoZG91YmxlKWluLT5nIC8gaW4tPmEpOworICAgICAgb3V0LT5iID0gc1JHQigoZG91YmxlKWluLT5iIC8gaW4tPmEpOworICAgICAgb3V0LT5hID0gdThkKGluLT5hIC8gMjU3Lik7CisgICB9Cit9CisKKy8qIGdiMTY6IGNvbXBvc2l0ZSBsaW5lYXIgb250byBiYWNrZ3JvdW5kIGFuZCBjb252ZXJ0IHRvIHNSR0IgZ3JheXNjYWxlICovCisvKiAgKG9yZGVyIGRvZXNuJ3QgbWF0dGVyLCB0aGUgY29tcG9zaXRlIGFuZCBncmF5c2NhbGUgb3BlcmF0aW9ucyBwZXJtdXRlKSAqLworc3RhdGljIHZvaWQKK2dwY19nYjE2KFBpeGVsICpvdXQsIGNvbnN0IFBpeGVsICppbiwgY29uc3QgQmFja2dyb3VuZCAqYmFjaykKK3sKKyAgIGlmIChpbi0+YSA8PSAwKQorICAgICAgb3V0LT5yID0gb3V0LT5nID0gb3V0LT5iID0gYmFjay0+aWc7CisKKyAgIGVsc2UgaWYgKGluLT5hID49IDY1NTM1KQorICAgICAgb3V0LT5yID0gb3V0LT5nID0gb3V0LT5iID0gaXNSR0IoaW4tPmcpOworCisgICBlbHNlCisgICB7CisgICAgICBkb3VibGUgYSA9IGluLT5hIC8gNjU1MzUuOworICAgICAgZG91YmxlIGExID0gMS1hOworCisgICAgICBhIC89IDY1NTM1OworICAgICAgb3V0LT5yID0gb3V0LT5nID0gb3V0LT5iID0gc1JHQihpbi0+ZyAqIGEgKyBiYWNrLT5kZyAqIGExKTsKKyAgIH0KKworICAgb3V0LT5hID0gMjU1OworfQorCisvKiBjYjE2OiBjb21wb3NpdGUgbGluZWFyIG9udG8gYmFja2dyb3VuZCBhbmQgY29udmVydCB0byBzUkdCICovCitzdGF0aWMgdm9pZAorZ3BjX2NiMTYoUGl4ZWwgKm91dCwgY29uc3QgUGl4ZWwgKmluLCBjb25zdCBCYWNrZ3JvdW5kICpiYWNrKQoreworICAgaWYgKGluLT5hIDw9IDApCisgICB7CisgICAgICBvdXQtPnIgPSBiYWNrLT5pcjsKKyAgICAgIG91dC0+ZyA9IGJhY2stPmlnOworICAgICAgb3V0LT5iID0gYmFjay0+aWI7CisgICB9CisKKyAgIGVsc2UgaWYgKGluLT5hID49IDY1NTM1KQorICAgeworICAgICAgb3V0LT5yID0gaXNSR0IoaW4tPnIpOworICAgICAgb3V0LT5nID0gaXNSR0IoaW4tPmcpOworICAgICAgb3V0LT5iID0gaXNSR0IoaW4tPmIpOworICAgfQorCisgICBlbHNlCisgICB7CisgICAgICBkb3VibGUgYSA9IGluLT5hIC8gNjU1MzUuOworICAgICAgZG91YmxlIGExID0gMS1hOworCisgICAgICBhIC89IDY1NTM1OworICAgICAgb3V0LT5yID0gc1JHQihpbi0+ciAqIGEgKyBiYWNrLT5kciAqIGExKTsKKyAgICAgIG91dC0+ZyA9IHNSR0IoaW4tPmcgKiBhICsgYmFjay0+ZGcgKiBhMSk7CisgICAgICBvdXQtPmIgPSBzUkdCKGluLT5iICogYSArIGJhY2stPmRiICogYTEpOworICAgfQorCisgICBvdXQtPmEgPSAyNTU7Cit9CisKKy8qIDE2LWJpdCB0byAxNi1iaXQgY29udmVyc2lvbnMgKi8KKy8qIEE6ICAgIHNldCBhbHBoYSB0byA2NTUzNSAqLworc3RhdGljIHZvaWQKK2dwY19BKFBpeGVsICpvdXQsIGNvbnN0IFBpeGVsICppbiwgY29uc3QgQmFja2dyb3VuZCAqYmFjaykKK3sKKyAgICh2b2lkKWJhY2s7CisgICBvdXQtPnIgPSBpbi0+cjsKKyAgIG91dC0+ZyA9IGluLT5nOworICAgb3V0LT5iID0gaW4tPmI7CisgICBvdXQtPmEgPSA2NTUzNTsKK30KKworLyogZzE2OiAgY29udmVydCBsaW5lYXIgUkdCIHRvIGxpbmVhciBncmF5c2NhbGUgKGFscGhhIDo9IDY1NTM1KSAqLworc3RhdGljIHZvaWQKK2dwY19nMTYoUGl4ZWwgKm91dCwgY29uc3QgUGl4ZWwgKmluLCBjb25zdCBCYWNrZ3JvdW5kICpiYWNrKQoreworICAgKHZvaWQpYmFjazsKKyAgIG91dC0+ciA9IG91dC0+ZyA9IG91dC0+YiA9IHUxNmQoWWZyb21SR0JpbnQoaW4tPnIsIGluLT5nLCBpbi0+YikpOworICAgb3V0LT5hID0gNjU1MzU7Cit9CisKKy8qIGcxNic6IGFzICdnMTYnIGJ1dCBhbHBoYSBpcyB1bmNoYW5nZWQgKi8KK3N0YXRpYyB2b2lkCitncGNfZzE2cShQaXhlbCAqb3V0LCBjb25zdCBQaXhlbCAqaW4sIGNvbnN0IEJhY2tncm91bmQgKmJhY2spCit7CisgICAodm9pZCliYWNrOworICAgb3V0LT5yID0gb3V0LT5nID0gb3V0LT5iID0gdTE2ZChZZnJvbVJHQmludChpbi0+ciwgaW4tPmcsIGluLT5iKSk7CisgICBvdXQtPmEgPSBpbi0+YTsKK30KKworI2lmIEFMTE9XX1VOVVNFRF9HUEMKKy8qIFVudXNlZCBmdW5jdGlvbnMgKHRvIGhpZGUgdGhlbSBmcm9tIEdDQyB1bnVzZWQgZnVuY3Rpb24gd2FybmluZ3MpICovCit2b2lkICgqIGNvbnN0IGdwY191bnVzZWRbXSkKKyAgIChQaXhlbCAqb3V0LCBjb25zdCBQaXhlbCAqaW4sIGNvbnN0IEJhY2tncm91bmQgKmJhY2spID0KK3sKKyAgIGdwY19QcmUsIGdwY19QcmVxLCBncGNfR2xpbiwgZ3BjX0dwcmUsIGdwY19HcHJxLCBncGNfbm9wOCwgZ3BjX25vcDYKK307CisjZW5kaWYKKworLyogICBPVVQ6ICAgIC0tLS0tIDgtYml0IC0tLS0tICAgIC0tLS0tIDE2LWJpdCAtLS0tLQorICogICBJTiAgICAgRyAgICBHQSAgIFJHQiAgUkdCQSAgRyAgICBHQSAgIFJHQiAgUkdCQQorICogIDggRyAgICAgLiAgICAuICAgIC4gICAgLiAgICAgbGluICBsaW4gIGxpbiAgbGluCisgKiAgOCBHQSAgICBiY2tnIC4gICAgYmNrYyAuICAgICBwcmUnIHByZSAgcHJlJyBwcmUKKyAqICA4IFJHQiAgIGc4ICAgZzggICAuICAgIC4gICAgIGdsaW4gZ2xpbiBsaW4gIGxpbgorICogIDggUkdCQSAgZzhiICBnOCAgIGJja2MgLiAgICAgZ3ByJyBncHJlIHByZScgcHJlCisgKiAxNiBHICAgICBzUkdCIHNSR0Igc1JHQiBzUkdCICAuICAgIC4gICAgLiAgICAuCisgKiAxNiBHQSAgICBiMTZnIHVucGcgYjE2YyB1bnBjICBBICAgIC4gICAgQSAgICAuCisgKiAxNiBSR0IgICBzRyAgIHNHICAgc1JHQiBzUkdCICBnMTYgIGcxNiAgLiAgICAuCisgKiAxNiBSR0JBICBnYjE2IHNHcCAgY2IxNiBzQ3AgICBnMTYgIGcxNicgQSAgICAuCisgKgorICogVGhlIG1hdHJpeCBpcyBoZWxkIGluIGFuIGFycmF5IGluZGV4ZWQgdGh1czoKKyAqCisgKiAgIGdwY19mbltvdXRfZm9ybWF0ICYgQkFTRV9GT1JNQVRTXVtpbl9mb3JtYXQgJiBCQVNFX0ZPUk1BVFNdOworICovCisvKiBUaGlzIHdpbGwgcHJvZHVjZSBhIGNvbXBpbGUgdGltZSBlcnJvciBpZiB0aGUgRk9STUFUX0ZMQUcgdmFsdWVzIGRvbid0CisgKiBtYXRjaCB0aGUgYWJvdmUgbWF0cml4IQorICovCisjaWYgUE5HX0ZPUk1BVF9GTEFHX0FMUEhBID09IDEgJiYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9SID09IDIgJiZcCisgICBQTkdfRk9STUFUX0ZMQUdfTElORUFSID09IDQKK3N0YXRpYyB2b2lkICgqIGNvbnN0IGdwY19mbls4LyppbiovXVs4LypvdXQqL10pCisgICAoUGl4ZWwgKm91dCwgY29uc3QgUGl4ZWwgKmluLCBjb25zdCBCYWNrZ3JvdW5kICpiYWNrKSA9Cit7CisvKm91dDogRy04ICAgICBHQS04ICAgICBSR0ItOCAgICBSR0JBLTggICAgRy0xNiAgICAgR0EtMTYgICBSR0ItMTYgIFJHQkEtMTYgKi8KKyAgIHtncGNfbm9vcCxncGNfbm9vcCxncGNfbm9vcCxncGNfbm9vcCwgZ3BjX0xpbiwgZ3BjX0xpbiwgZ3BjX0xpbiwgZ3BjX0xpbiB9LAorICAge2dwY19iY2tnLGdwY19ub29wLGdwY19iY2tjLGdwY19ub29wLCBncGNfcHJlcSxncGNfcHJlLCBncGNfcHJlcSxncGNfcHJlIH0sCisgICB7Z3BjX2c4LCAgZ3BjX2c4LCAgZ3BjX25vb3AsZ3BjX25vb3AsIGdwY19nbGluLGdwY19nbGluLGdwY19saW4sIGdwY19saW4gfSwKKyAgIHtncGNfZzhiLCBncGNfZzgsICBncGNfYmNrYyxncGNfbm9vcCwgZ3BjX2dwcnEsZ3BjX2dwcmUsZ3BjX3ByZXEsZ3BjX3ByZSB9LAorICAge2dwY19zUkdCLGdwY19zUkdCLGdwY19zUkdCLGdwY19zUkdCLCBncGNfbm9vcCxncGNfbm9vcCxncGNfbm9vcCxncGNfbm9vcH0sCisgICB7Z3BjX2IxNmcsZ3BjX3VucGcsZ3BjX2IxNmMsZ3BjX3VucGMsIGdwY19BLCAgIGdwY19ub29wLGdwY19BLCAgIGdwY19ub29wfSwKKyAgIHtncGNfc0csICBncGNfc0csICBncGNfc1JHQixncGNfc1JHQiwgZ3BjX2cxNiwgZ3BjX2cxNiwgZ3BjX25vb3AsZ3BjX25vb3B9LAorICAge2dwY19nYjE2LGdwY19zR3AsIGdwY19jYjE2LGdwY19zQ3AsICBncGNfZzE2LCBncGNfZzE2cSxncGNfQSwgICBncGNfbm9vcH0KK307CisKKy8qIFRoZSBhcnJheSBpcyByZXBlYXRlZCBmb3IgdGhlIGNhc2VzIHdoZXJlIGJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgYXJlIGNvbG9yCisgKiBtYXBwZWQgYmVjYXVzZSB0aGVuIGRpZmZlcmVudCBhbGdvcml0aG1zIGFyZSB1c2VkLgorICovCitzdGF0aWMgdm9pZCAoKiBjb25zdCBncGNfZm5fY29sb3JtYXBwZWRbOC8qaW4qL11bOC8qb3V0Ki9dKQorICAgKFBpeGVsICpvdXQsIGNvbnN0IFBpeGVsICppbiwgY29uc3QgQmFja2dyb3VuZCAqYmFjaykgPQoreworLypvdXQ6IEctOCAgICAgR0EtOCAgICAgUkdCLTggICAgUkdCQS04ICAgIEctMTYgICAgIEdBLTE2ICAgUkdCLTE2ICBSR0JBLTE2ICovCisgICB7Z3BjX25vb3AsZ3BjX25vb3AsZ3BjX25vb3AsZ3BjX25vb3AsIGdwY19saW4sIGdwY19saW4sIGdwY19saW4sIGdwY19saW4gfSwKKyAgIHtncGNfYmNrZyxncGNfbm9vcCxncGNfYmNrYyxncGNfbm9vcCwgZ3BjX3ByZXEsZ3BjX3ByZSwgZ3BjX3ByZXEsZ3BjX3ByZSB9LAorICAge2dwY19nOCwgIGdwY19nOCwgIGdwY19ub29wLGdwY19ub29wLCBncGNfZ2xpbixncGNfZ2xpbixncGNfbGluLCBncGNfbGluIH0sCisgICB7Z3BjX2c4YiwgZ3BjX2c4LCAgZ3BjX2Jja2MsZ3BjX25vb3AsIGdwY19ncHJxLGdwY19ncHJlLGdwY19wcmVxLGdwY19wcmUgfSwKKyAgIHtncGNfc1JHQixncGNfc1JHQixncGNfc1JHQixncGNfc1JHQiwgZ3BjX25vb3AsZ3BjX25vb3AsZ3BjX25vb3AsZ3BjX25vb3B9LAorICAge2dwY19iMTZnLGdwY191bnBnLGdwY19iMTZjLGdwY191bnBjLCBncGNfQSwgICBncGNfbm9vcCxncGNfQSwgICBncGNfbm9vcH0sCisgICB7Z3BjX3NHLCAgZ3BjX3NHLCAgZ3BjX3NSR0IsZ3BjX3NSR0IsIGdwY19nMTYsIGdwY19nMTYsIGdwY19ub29wLGdwY19ub29wfSwKKyAgIHtncGNfZ2IxNixncGNfc0dwLCBncGNfY2IxNixncGNfc0NwLCAgZ3BjX2cxNiwgZ3BjX2cxNnEsZ3BjX0EsICAgZ3BjX25vb3B9Cit9OworCisvKiBUaGUgZXJyb3IgYXJyYXlzIHJlY29yZCB0aGUgZXJyb3IgaW4gdGhlIHNhbWUgbWF0cml4OyA2NCBlbnRyaWVzLCBob3dldmVyCisgKiB0aGUgZGlmZmVyZW50IGFsZ29yaXRobXMgdXNlZCBpbiBsaWJwbmcgZm9yIGNvbG9ybWFwIGFuZCBkaXJlY3QgY29udmVyc2lvbnMKKyAqIG1lYW4gdGhhdCBmb3VyIHNlcGFyYXRlIG1hdHJpY2VzIGFyZSB1c2VkIChmb3IgZWFjaCBjb21iaW5hdGlvbiBvZgorICogY29sb3JtYXBwZWQgYW5kIGRpcmVjdC4pCisgKgorICogSW4gc29tZSBjYXNlcyB0aGUgY29udmVyc2lvbiBiZXR3ZWVuIHNSR0IgZm9ybWF0cyBnb2VzIHZpYSBhIGxpbmVhcgorICogaW50ZXJtZWRpYXRlOyBhbiBzUkdCIHRvIGxpbmVhciBjb252ZXJzaW9uIChhcyBhYm92ZSkgaXMgZm9sbG93ZWQgYnkgYSBzaW1wbGUKKyAqIGxpbmVhciB0byBzUkdCIHN0ZXAgd2l0aCBubyBvdGhlciBjb252ZXJzaW9ucy4gIFRoaXMgaXMgZG9uZSBieSBhIHNlcGFyYXRlCisgKiBlcnJvciBhcnJheSBmcm9tIGFuIGFyYml0cmFyeSAnaW4nIGZvcm1hdCB0byBvbmUgb2YgdGhlIGZvdXIgYmFzaWMgb3V0cHV0cworICogKHNpbmNlIGZpbmFsIG91dHB1dCBpcyBhbHdheXMgc1JHQiBub3QgY29sb3JtYXBwZWQpLgorICoKKyAqIFRoZXNlIGFycmF5cyBtYXkgYmUgbW9kaWZpZWQgaWYgdGhlIC0tYWNjdW11bGF0ZSBmbGFnIGlzIHNldCBkdXJpbmcgdGhlIHJ1bjsKKyAqIHRoZW4gaW5zdGVhZCBvZiBsb2dnaW5nIGVycm9ycyB0aGV5IGFyZSBzaW1wbHkgYWRkZWQgaW4uCisgKgorICogVGhlIHRocmVlIGVudHJpZXMgYXJlIGN1cnJlbnRseSBmb3IgdHJhbnNwYXJlbnQsIHBhcnRpYWxseSB0cmFuc3BhcmVudCBhbmQKKyAqIG9wYXF1ZSBpbnB1dCBwaXhlbCB2YWx1ZXMuICBOb3RpY2UgdGhhdCBhbHBoYSBzaG91bGQgYmUgZXhhY3QgaW4gZWFjaCBjYXNlLgorICoKKyAqIEVycm9ycyBpbiBhbHBoYSBzaG91bGQgb25seSBvY2N1ciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBhIGRpcmVjdCBmb3JtYXQKKyAqIHRvIGEgY29sb3JtYXBwZWQgZm9ybWF0LCB3aGVuIGFscGhhIGlzIGVmZmVjdGl2ZWx5IHNtYXNoZWQgKHNvIGxhcmdlCisgKiBlcnJvcnMgY2FuIG9jY3VyLikgIFRoZXJlIHNob3VsZCBiZSBubyBlcnJvciBpbiB0aGUgJzAnIGFuZCAnb3BhcXVlJworICogdmFsdWVzLiAgVGhlIGZvdXJ0aCBlbnRyeSBpbiB0aGUgYXJyYXkgaXMgdXNlZCBmb3IgdGhlIGFscGhhIGVycm9yIChhbmQgaXQKKyAqIHNob3VsZCBhbHdheXMgYmUgemVybyBmb3IgdGhlICd2aWEgbGluZWFyJyBjYXNlIHNpbmNlIHRoaXMgaXMgbmV2ZXIgY29sb3IKKyAqIG1hcHBlZC4pCisgKgorICogTWFwcGluZyB0byBhIGNvbG9ybWFwIHNtYXNoZXMgdGhlIGNvbG9ycywgaXQgaXMgbmVjZXNzYXJ5IHRvIGhhdmUgc2VwYXJhdGUKKyAqIHZhbHVlcyBmb3IgdGhlc2UgY2FzZXMgYmVjYXVzZSB0aGV5IGFyZSBtdWNoIGxhcmdlcjsgaXQgaXMgdmVyeSBtdWNoCisgKiBpbXBvc3NpYmxlIHRvIG9idGFpbiBhIHJlYXNvbmFibGUgcmVzdWx0LCB0aGVzZSBhcmUgaGVsZCBpbgorICogZ3BjX2Vycm9yX3RvX2NvbG9ybWFwLgorICovCisjaWYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQID09IDggLyogZXh0cmEgY2hlY2sgYWxzbyByZXF1aXJlZCAqLworIyAgaW5jbHVkZSAicG5nc3Rlc3QtZXJyb3JzLmgiIC8qIG1hY2hpbmUgZ2VuZXJhdGVkICovCisjZW5kaWYgLyogQ09MT1JNQVAgZmxhZyBjaGVjayAqLworI2VuZGlmIC8qIGZsYWcgY2hlY2tzICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAvKiBCYXNpYyBwaXhlbCBpbmZvcm1hdGlvbjogKi8KKyAgIEltYWdlKiAgICAgICBpbl9pbWFnZTsgICAvKiBJbnB1dCBpbWFnZSAqLworICAgY29uc3QgSW1hZ2UqIG91dF9pbWFnZTsgIC8qIE91dHB1dCBpbWFnZSAqLworCisgICAvKiAnYmFja2dyb3VuZCcgaXMgdGhlIHZhbHVlIHBhc3NlZCB0byB0aGUgZ3BjXyByb3V0aW5lcywgaXQgbWF5IGJlIE5VTEwgaWYKKyAgICAqIGl0IHNob3VsZCBub3QgYmUgdXNlZCAoKnRoaXMqIHByb2dyYW0gaGFzIGFuIGVycm9yIGlmIGl0IGNyYXNoZXMgYXMgYQorICAgICogcmVzdWx0ISkKKyAgICAqLworICAgQmFja2dyb3VuZCAgICAgICAgYmFja2dyb3VuZF9jb2xvcjsKKyAgIGNvbnN0IEJhY2tncm91bmQqIGJhY2tncm91bmQ7CisKKyAgIC8qIFByZWNhbGN1bGF0ZWQgdmFsdWVzOiAqLworICAgaW50ICAgICAgICAgIGluX29wYXF1ZTsgICAvKiBWYWx1ZSBvZiBpbnB1dCBhbHBoYSB0aGF0IGlzIG9wYXF1ZSAqLworICAgaW50ICAgICAgICAgIGlzX3BhbGV0dGU7ICAvKiBTYW1wbGUgdmFsdWVzIGNvbWUgZnJvbSB0aGUgcGFsZXR0ZSAqLworICAgaW50ICAgICAgICAgIGFjY3VtdWxhdGU7ICAvKiBBY2N1bWxhdGUgY29tcG9uZW50IGVycm9ycyAoZG9uJ3QgbG9nKSAqLworICAgaW50ICAgICAgICAgIG91dHB1dF84Yml0OyAvKiBPdXRwdXQgaXMgOC1iaXQgKGVsc2UgMTYtYml0KSAqLworCisgICB2b2lkICgqaW5fZ3ApKFBpeGVsKiwgcG5nX2NvbnN0X3ZvaWRwKTsKKyAgIHZvaWQgKCpvdXRfZ3ApKFBpeGVsKiwgcG5nX2NvbnN0X3ZvaWRwKTsKKworICAgdm9pZCAoKnRyYW5zZm9ybSkoUGl4ZWwgKm91dCwgY29uc3QgUGl4ZWwgKmluLCBjb25zdCBCYWNrZ3JvdW5kICpiYWNrKTsKKyAgICAgIC8qIEEgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgcmVxdWlyZWQgdHJhbnNmb3JtICovCisKKyAgIHZvaWQgKCpmcm9tX2xpbmVhcikoUGl4ZWwgKm91dCwgY29uc3QgUGl4ZWwgKmluLCBjb25zdCBCYWNrZ3JvdW5kICpiYWNrKTsKKyAgICAgIC8qIEZvciAndmlhX2xpbmVhcicgdHJhbnNmb3JtcyB0aGUgZmluYWwsIGZyb20gbGluZWFyLCBzdGVwLCBlbHNlIE5VTEwgKi8KKworICAgcG5nX3VpbnRfMTYgZXJyb3JbNF07CisgICAgICAvKiBUaHJlZSBlcnJvciB2YWx1ZXMgZm9yIHRyYW5zcGFyZW50LCBwYXJ0aWFsbHkgdHJhbnNwYXJlbnQgYW5kIG9wYXF1ZQorICAgICAgICogaW5wdXQgcGl4ZWxzIChpbiB0dXJuKS4KKyAgICAgICAqLworCisgICBwbmdfdWludF8xNiAqZXJyb3JfcHRyOworICAgICAgLyogV2hlcmUgdGhlc2UgYXJlIHN0b3JlZCBpbiB0aGUgc3RhdGljIGFycmF5IChmb3IgJ2FjY3VtdWxhdGUnKSAqLworfQorVHJhbnNmb3JtOworCisvKiBSZXR1cm4gYSAndHJhbnNmb3JtJyBhcyBhYm92ZSBmb3IgdGhlIGdpdmVuIGZvcm1hdCBjb252ZXJzaW9uLiAqLworc3RhdGljIHZvaWQKK3RyYW5zZm9ybV9mcm9tX2Zvcm1hdHMoVHJhbnNmb3JtICpyZXN1bHQsIEltYWdlICppbl9pbWFnZSwKKyAgIGNvbnN0IEltYWdlICpvdXRfaW1hZ2UsIHBuZ19jb25zdF9jb2xvcnAgYmFja2dyb3VuZCwgaW50IHZpYV9saW5lYXIpCit7CisgICBwbmdfdWludF8zMiBpbl9mb3JtYXQsIG91dF9mb3JtYXQ7CisgICBwbmdfdWludF8zMiBpbl9iYXNlLCBvdXRfYmFzZTsKKworICAgbWVtc2V0KHJlc3VsdCwgMCwgc2l6ZW9mICpyZXN1bHQpOworCisgICAvKiBTdG9yZSB0aGUgb3JpZ2luYWwgaW1hZ2VzIGZvciBlcnJvciBtZXNzYWdlcyAqLworICAgcmVzdWx0LT5pbl9pbWFnZSA9IGluX2ltYWdlOworICAgcmVzdWx0LT5vdXRfaW1hZ2UgPSBvdXRfaW1hZ2U7CisKKyAgIGluX2Zvcm1hdCA9IGluX2ltYWdlLT5pbWFnZS5mb3JtYXQ7CisgICBvdXRfZm9ybWF0ID0gb3V0X2ltYWdlLT5pbWFnZS5mb3JtYXQ7CisKKyAgIGlmIChpbl9mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfTElORUFSKQorICAgICAgcmVzdWx0LT5pbl9vcGFxdWUgPSA2NTUzNTsKKyAgIGVsc2UKKyAgICAgIHJlc3VsdC0+aW5fb3BhcXVlID0gMjU1OworCisgICByZXN1bHQtPm91dHB1dF84Yml0ID0gKG91dF9mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfTElORUFSKSA9PSAwOworCisgICByZXN1bHQtPmlzX3BhbGV0dGUgPSAwOyAvKiBzZXQgYnkgY2FsbGVyIGlmIHJlcXVpcmVkICovCisgICByZXN1bHQtPmFjY3VtdWxhdGUgPSAoaW5faW1hZ2UtPm9wdHMgJiBBQ0NVTVVMQVRFKSAhPSAwOworCisgICAvKiBUaGUgbG9hZGVycyAod2hpY2ggbmVlZCB0aGUgb3JkZXJpbmcgaW5mb3JtYXRpb24pICovCisgICByZXN1bHQtPmluX2dwID0gZ2V0X3BpeGVsKGluX2Zvcm1hdCk7CisgICByZXN1bHQtPm91dF9ncCA9IGdldF9waXhlbChvdXRfZm9ybWF0KTsKKworICAgLyogUmVtb3ZlIHRoZSBvcmRlcmluZyBpbmZvcm1hdGlvbjogKi8KKyAgIGluX2Zvcm1hdCAmPSBCQVNFX0ZPUk1BVFMgfCBQTkdfRk9STUFUX0ZMQUdfQ09MT1JNQVA7CisgICBpbl9iYXNlID0gaW5fZm9ybWF0ICYgQkFTRV9GT1JNQVRTOworICAgb3V0X2Zvcm1hdCAmPSBCQVNFX0ZPUk1BVFMgfCBQTkdfRk9STUFUX0ZMQUdfQ09MT1JNQVA7CisgICBvdXRfYmFzZSA9IG91dF9mb3JtYXQgJiBCQVNFX0ZPUk1BVFM7CisKKyAgIGlmICh2aWFfbGluZWFyKQorICAgeworICAgICAgLyogQ2hlY2sgZm9yIGFuIGVycm9yIGluIHRoaXMgcHJvZ3JhbTogKi8KKyAgICAgIGlmIChvdXRfZm9ybWF0ICYgKFBOR19GT1JNQVRfRkxBR19MSU5FQVJ8UE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQKSkKKyAgICAgIHsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW50ZXJuYWwgdHJhbnNmb3JtIHZpYSBsaW5lYXIgZXJyb3IgMHgleC0+MHgleFxuIiwKKyAgICAgICAgICAgIGluX2Zvcm1hdCwgb3V0X2Zvcm1hdCk7CisgICAgICAgICBleGl0KDEpOworICAgICAgfQorCisgICAgICByZXN1bHQtPnRyYW5zZm9ybSA9IGdwY19mbltpbl9iYXNlXVtvdXRfYmFzZSB8IFBOR19GT1JNQVRfRkxBR19MSU5FQVJdOworICAgICAgcmVzdWx0LT5mcm9tX2xpbmVhciA9IGdwY19mbltvdXRfYmFzZSB8IFBOR19GT1JNQVRfRkxBR19MSU5FQVJdW291dF9iYXNlXTsKKyAgICAgIHJlc3VsdC0+ZXJyb3JfcHRyID0gZ3BjX2Vycm9yX3ZpYV9saW5lYXJbaW5fZm9ybWF0XVtvdXRfZm9ybWF0XTsKKyAgIH0KKworICAgZWxzZSBpZiAofmluX2Zvcm1hdCAmIG91dF9mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQ09MT1JNQVApCisgICB7CisgICAgICAvKiBUaGUgaW5wdXQgaXMgbm90IGNvbG9ybWFwcGVkIGJ1dCB0aGUgb3V0cHV0IGlzLCB0aGUgZXJyb3JzIHdpbGwKKyAgICAgICAqIHR5cGljYWxseSBiZSBsYXJnZSAob25seSB0aGUgZ3JheXNjYWxlLW5vLWFscGhhIGNhc2UgcGVybWl0cyBwcmVzZXJ2aW5nCisgICAgICAgKiBldmVuIDgtYml0IHZhbHVlcy4pCisgICAgICAgKi8KKyAgICAgIHJlc3VsdC0+dHJhbnNmb3JtID0gZ3BjX2ZuW2luX2Jhc2VdW291dF9iYXNlXTsKKyAgICAgIHJlc3VsdC0+ZnJvbV9saW5lYXIgPSBOVUxMOworICAgICAgcmVzdWx0LT5lcnJvcl9wdHIgPSBncGNfZXJyb3JfdG9fY29sb3JtYXBbaW5fYmFzZV1bb3V0X2Jhc2VdOworICAgfQorCisgICBlbHNlCisgICB7CisgICAgICAvKiBUaGUgY2FsbGVyIGhhbmRsZXMgdGhlIGNvbG9ybWFwLT5waXhlbCB2YWx1ZSBjb252ZXJzaW9uLCBzbyB0aGUKKyAgICAgICAqIHRyYW5zZm9ybSBmdW5jdGlvbiBqdXN0IGdldHMgYSBwaXhlbCB2YWx1ZSwgaG93ZXZlciBiZWNhdXNlIGxpYnBuZworICAgICAgICogY3VycmVudGx5IGNvbnRhaW5zIGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIGZvciBtYXBwaW5nIGEgY29sb3JtYXAgaWYKKyAgICAgICAqIGJvdGggaW5wdXQgYW5kIG91dHB1dCBhcmUgY29sb3JtYXBwZWQgd2UgbmVlZCBkaWZmZXJlbnQgY29udmVyc2lvbgorICAgICAgICogZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBlcnJvcnMgaW4gdGhlIGxpYnBuZyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAqLworICAgICAgaWYgKGluX2Zvcm1hdCAmIG91dF9mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQ09MT1JNQVApCisgICAgICAgICByZXN1bHQtPnRyYW5zZm9ybSA9IGdwY19mbl9jb2xvcm1hcHBlZFtpbl9iYXNlXVtvdXRfYmFzZV07CisgICAgICBlbHNlCisgICAgICAgICByZXN1bHQtPnRyYW5zZm9ybSA9IGdwY19mbltpbl9iYXNlXVtvdXRfYmFzZV07CisgICAgICByZXN1bHQtPmZyb21fbGluZWFyID0gTlVMTDsKKyAgICAgIHJlc3VsdC0+ZXJyb3JfcHRyID0gZ3BjX2Vycm9yW2luX2Zvcm1hdF1bb3V0X2Zvcm1hdF07CisgICB9CisKKyAgIC8qIEZvbGxvdyB0aGUgbGlicG5nIHNpbXBsaWZpZWQgQVBJIHJ1bGVzIHRvIHdvcmsgb3V0IHdoYXQgdG8gcGFzcyB0byB0aGUgZ3BjCisgICAgKiByb3V0aW5lcyBhcyBhIGJhY2tncm91bmQgdmFsdWUsIGlmIG9uZSBpcyBub3QgcmVxdWlyZWQgcGFzcyBOVUxMIHNvIHRoYXQKKyAgICAqIHRoaXMgcHJvZ3JhbSBjcmFzaGVzIGluIHRoZSBldmVuIG9mIGEgcHJvZ3JhbW1pbmcgZXJyb3IuCisgICAgKi8KKyAgIHJlc3VsdC0+YmFja2dyb3VuZCA9IE5VTEw7IC8qIGRlZmF1bHQ6IG5vdCByZXF1aXJlZCAqLworCisgICAvKiBSdWxlIDE6IGJhY2tncm91bmQgb25seSBuZWVkIGJlIHN1cHBsaWVkIGlmIGFscGhhIGlzIHRvIGJlIHJlbW92ZWQgKi8KKyAgIGlmIChpbl9mb3JtYXQgJiB+b3V0X2Zvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BTFBIQSkKKyAgIHsKKyAgICAgIC8qIFRoZSBpbnB1dCB2YWx1ZSBpcyAnTlVMTCcgdG8gdXNlIHRoZSBiYWNrZ3JvdW5kIGFuZCAob3RoZXJ3aXNlKSBhbiBzUkdCCisgICAgICAgKiBiYWNrZ3JvdW5kIGNvbG9yICh0byB1c2UgYSBzb2xpZCBjb2xvcikuICBUaGUgY29kZSBhYm92ZSB1c2VzIGEgZml4ZWQKKyAgICAgICAqIGJ5dGUgdmFsdWUsIEJVRkZFUl9JTklUOCwgZm9yIGJ1ZmZlciBldmVuIGZvciAxNi1iaXQgb3V0cHV0LiAgRm9yCisgICAgICAgKiBsaW5lYXIgKDE2LWJpdCkgb3V0cHV0IHRoZSBzUkdCIGJhY2tncm91bmQgY29sb3IgaXMgaWdub3JlZDsgdGhlCisgICAgICAgKiBjb21wb3NpdGlvbiBpcyBhbHdheXMgb24gdGhlIGJhY2tncm91bmQgKHNvIEJVRkZFUl9JTklUOCAqIDI1NyksIGV4Y2VwdAorICAgICAgICogdGhhdCBmb3IgdGhlIGNvbG9ybWFwIChpLmUuIGxpbmVhciBjb2xvcm1hcHBlZCBvdXRwdXQpIGJsYWNrIGlzIHVzZWQuCisgICAgICAgKi8KKyAgICAgIHJlc3VsdC0+YmFja2dyb3VuZCA9ICZyZXN1bHQtPmJhY2tncm91bmRfY29sb3I7CisKKyAgICAgIGlmIChvdXRfZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0xJTkVBUiB8fCB2aWFfbGluZWFyKQorICAgICAgeworICAgICAgICAgaWYgKG91dF9mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQ09MT1JNQVApCisgICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQtPmJhY2tncm91bmRfY29sb3IuaXIgPQorICAgICAgICAgICAgICAgcmVzdWx0LT5iYWNrZ3JvdW5kX2NvbG9yLmlnID0KKyAgICAgICAgICAgICAgIHJlc3VsdC0+YmFja2dyb3VuZF9jb2xvci5pYiA9IDA7CisgICAgICAgICAgICByZXN1bHQtPmJhY2tncm91bmRfY29sb3IuZHIgPQorICAgICAgICAgICAgICAgcmVzdWx0LT5iYWNrZ3JvdW5kX2NvbG9yLmRnID0KKyAgICAgICAgICAgICAgIHJlc3VsdC0+YmFja2dyb3VuZF9jb2xvci5kYiA9IDA7CisgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdC0+YmFja2dyb3VuZF9jb2xvci5pciA9CisgICAgICAgICAgICAgICByZXN1bHQtPmJhY2tncm91bmRfY29sb3IuaWcgPQorICAgICAgICAgICAgICAgcmVzdWx0LT5iYWNrZ3JvdW5kX2NvbG9yLmliID0gQlVGRkVSX0lOSVQ4ICogMjU3OworICAgICAgICAgICAgcmVzdWx0LT5iYWNrZ3JvdW5kX2NvbG9yLmRyID0KKyAgICAgICAgICAgICAgIHJlc3VsdC0+YmFja2dyb3VuZF9jb2xvci5kZyA9CisgICAgICAgICAgICAgICByZXN1bHQtPmJhY2tncm91bmRfY29sb3IuZGIgPSAwOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBlbHNlIC8qIHNSR0Igb3V0cHV0ICovCisgICAgICB7CisgICAgICAgICBpZiAoYmFja2dyb3VuZCAhPSBOVUxMKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKG91dF9mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQ09MT1IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICByZXN1bHQtPmJhY2tncm91bmRfY29sb3IuaXIgPSBiYWNrZ3JvdW5kLT5yZWQ7CisgICAgICAgICAgICAgICByZXN1bHQtPmJhY2tncm91bmRfY29sb3IuaWcgPSBiYWNrZ3JvdW5kLT5ncmVlbjsKKyAgICAgICAgICAgICAgIHJlc3VsdC0+YmFja2dyb3VuZF9jb2xvci5pYiA9IGJhY2tncm91bmQtPmJsdWU7CisgICAgICAgICAgICAgICAvKiBUT0RPOiBzb21ldGltZXMgbGlicG5nIHVzZXMgdGhlIHBvd2VyIGxhdyBjb252ZXJzaW9uIGhlcmUsIGhvdworICAgICAgICAgICAgICAgICogdG8gaGFuZGxlIHRoaXM/CisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIHJlc3VsdC0+YmFja2dyb3VuZF9jb2xvci5kciA9IHNSR0JfdG9fZFtiYWNrZ3JvdW5kLT5yZWRdOworICAgICAgICAgICAgICAgcmVzdWx0LT5iYWNrZ3JvdW5kX2NvbG9yLmRnID0gc1JHQl90b19kW2JhY2tncm91bmQtPmdyZWVuXTsKKyAgICAgICAgICAgICAgIHJlc3VsdC0+YmFja2dyb3VuZF9jb2xvci5kYiA9IHNSR0JfdG9fZFtiYWNrZ3JvdW5kLT5ibHVlXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWxzZSAvKiBncmF5c2NhbGU6IGxpYnBuZyBvbmx5IGxvb2tzIGF0ICdnJyAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcmVzdWx0LT5iYWNrZ3JvdW5kX2NvbG9yLmlyID0KKyAgICAgICAgICAgICAgICAgIHJlc3VsdC0+YmFja2dyb3VuZF9jb2xvci5pZyA9CisgICAgICAgICAgICAgICAgICByZXN1bHQtPmJhY2tncm91bmRfY29sb3IuaWIgPSBiYWNrZ3JvdW5kLT5ncmVlbjsKKyAgICAgICAgICAgICAgIC8qIFRPRE86IHNvbWV0aW1lcyBsaWJwbmcgdXNlcyB0aGUgcG93ZXIgbGF3IGNvbnZlcnNpb24gaGVyZSwgaG93CisgICAgICAgICAgICAgICAgKiB0byBoYW5kbGUgdGhpcz8KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgcmVzdWx0LT5iYWNrZ3JvdW5kX2NvbG9yLmRyID0KKyAgICAgICAgICAgICAgICAgIHJlc3VsdC0+YmFja2dyb3VuZF9jb2xvci5kZyA9CisgICAgICAgICAgICAgICAgICByZXN1bHQtPmJhY2tncm91bmRfY29sb3IuZGIgPSBzUkdCX3RvX2RbYmFja2dyb3VuZC0+Z3JlZW5dOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICBlbHNlIGlmICgob3V0X2Zvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCkgPT0gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdC0+YmFja2dyb3VuZF9jb2xvci5pciA9CisgICAgICAgICAgICAgICByZXN1bHQtPmJhY2tncm91bmRfY29sb3IuaWcgPQorICAgICAgICAgICAgICAgcmVzdWx0LT5iYWNrZ3JvdW5kX2NvbG9yLmliID0gQlVGRkVSX0lOSVQ4OworICAgICAgICAgICAgLyogVE9ETzogc29tZXRpbWVzIGxpYnBuZyB1c2VzIHRoZSBwb3dlciBsYXcgY29udmVyc2lvbiBoZXJlLCBob3cKKyAgICAgICAgICAgICAqIHRvIGhhbmRsZSB0aGlzPworICAgICAgICAgICAgICovCisgICAgICAgICAgICByZXN1bHQtPmJhY2tncm91bmRfY29sb3IuZHIgPQorICAgICAgICAgICAgICAgcmVzdWx0LT5iYWNrZ3JvdW5kX2NvbG9yLmRnID0KKyAgICAgICAgICAgICAgIHJlc3VsdC0+YmFja2dyb3VuZF9jb2xvci5kYiA9IHNSR0JfdG9fZFtCVUZGRVJfSU5JVDhdOworICAgICAgICAgfQorCisgICAgICAgICAvKiBFbHNlIHRoZSBvdXRwdXQgaXMgY29sb3JtYXBwZWQgYW5kIGEgYmFja2dyb3VuZCBjb2xvciBtdXN0IGJlCisgICAgICAgICAgKiBwcm92aWRlZDsgaWYgcG5nc3Rlc3QgY3Jhc2hlcyB0aGVuIHRoYXQgaXMgYSBidWcgaW4gdGhpcyBwcm9ncmFtCisgICAgICAgICAgKiAodGhvdWdoIGxpYnBuZyBzaG91bGQgcG5nX2Vycm9yIGFzIHdlbGwuKQorICAgICAgICAgICovCisgICAgICAgICBlbHNlCisgICAgICAgICAgICByZXN1bHQtPmJhY2tncm91bmQgPSBOVUxMOworICAgICAgfQorICAgfQorCisgICBpZiAocmVzdWx0LT5iYWNrZ3JvdW5kID09IE5VTEwpCisgICB7CisgICAgICByZXN1bHQtPmJhY2tncm91bmRfY29sb3IuaXIgPQorICAgICAgICAgcmVzdWx0LT5iYWNrZ3JvdW5kX2NvbG9yLmlnID0KKyAgICAgICAgIHJlc3VsdC0+YmFja2dyb3VuZF9jb2xvci5pYiA9IC0xOyAvKiBub3QgdXNlZCAqLworICAgICAgcmVzdWx0LT5iYWNrZ3JvdW5kX2NvbG9yLmRyID0KKyAgICAgICAgIHJlc3VsdC0+YmFja2dyb3VuZF9jb2xvci5kZyA9CisgICAgICAgICByZXN1bHQtPmJhY2tncm91bmRfY29sb3IuZGIgPSAxRTMwOyAvKiBub3QgdXNlZCAqLworICAgfQorCisKKyAgIC8qIENvcHkgdGhlIGVycm9yIHZhbHVlcyBpbnRvIHRoZSBUcmFuc2Zvcm06ICovCisgICByZXN1bHQtPmVycm9yWzBdID0gcmVzdWx0LT5lcnJvcl9wdHJbMF07CisgICByZXN1bHQtPmVycm9yWzFdID0gcmVzdWx0LT5lcnJvcl9wdHJbMV07CisgICByZXN1bHQtPmVycm9yWzJdID0gcmVzdWx0LT5lcnJvcl9wdHJbMl07CisgICByZXN1bHQtPmVycm9yWzNdID0gcmVzdWx0LT5lcnJvcl9wdHJbM107Cit9CisKKworLyogQ29tcGFyZSB0d28gcGl4ZWxzLgorICoKKyAqIE9MRCBlcnJvciB2YWx1ZXM6CitzdGF0aWMgaW50IGVycm9yX3RvX2xpbmVhciA9IDgxMTsgKiBieSBleHBlcmltZW50ICoKK3N0YXRpYyBpbnQgZXJyb3JfdG9fbGluZWFyX2dyYXlzY2FsZSA9IDQyNDsgKiBieSBleHBlcmltZW50ICoKK3N0YXRpYyBpbnQgZXJyb3JfdG9fc1JHQiA9IDY7ICogYnkgZXhwZXJpbWVudCAqCitzdGF0aWMgaW50IGVycm9yX3RvX3NSR0JfZ3JheXNjYWxlID0gMTc7ICogbGlicG5nIGVycm9yIGJ5IGNhbGN1bGF0aW9uICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiBieSBleHBlcmltZW50ICoKK3N0YXRpYyBpbnQgZXJyb3JfaW5fY29tcG9zZSA9IDI7ICogYnkgZXhwZXJpbWVudCAqCitzdGF0aWMgaW50IGVycm9yX2luX3ByZW11bHRpcGx5ID0gMTsKKyAqCisgKiBUaGUgZm9sbG93aW5nIGlzICpqdXN0KiB0aGUgcmVzdWx0IG9mIGEgcm91bmQgdHJpcCBmcm9tIDgtYml0IHNSR0IgdG8gbGluZWFyCisgKiB0aGVuIGJhY2sgdG8gOC1iaXQgc1JHQiB3aGVuIGl0IGlzIGRvbmUgYnkgbGlicG5nLiAgVGhlcmUgYXJlIHR3byBwcm9ibGVtczoKKyAqCisgKiAxKSBsaWJwbmcgY3VycmVudGx5IHVzZXMgYSAyLjIgcG93ZXIgbGF3IHdpdGggbm8gbGluZWFyIHNlZ21lbnQsIHRoaXMgcmVzdWx0cworICogaW4gaW5zdGFiaWxpdHkgaW4gdGhlIGxvdyB2YWx1ZXMgYW5kIGV2ZW4gd2l0aCAxNi1iaXQgcHJlY2lzaW9uIHNSR0IoMSkgZW5kcworICogdXAgbWFwcGluZyB0byBzUkdCKDApIGFzIGEgcmVzdWx0IG9mIHJvdW5kaW5nIGluIHRoZSAxNi1iaXQgcmVwcmVzZW50YXRpb24uCisgKiBUaGlzIGdpdmVzIGFuIGVycm9yIG9mIDEgaW4gdGhlIGhhbmRsaW5nIG9mIHZhbHVlIDEgb25seS4KKyAqCisgKiAyKSBsaWJwbmcgY3VycmVudGx5IHVzZXMgYW4gaW50ZXJtZWRpYXRlIDgtYml0IGxpbmVhciB2YWx1ZSBpbiBnYW1tYQorICogY29ycmVjdGlvbiBvZiA4LWJpdCB2YWx1ZXMuICBUaGlzIHJlc3VsdHMgaW4gbWFueSBtb3JlIGVycm9ycywgdGhlIHdvcnNlIG9mCisgKiB3aGljaCBpcyBtYXBwaW5nIHNSR0IoMTQpIHRvIHNSR0IoMCkuCisgKgorICogVGhlIGdlbmVyYWwgJ2Vycm9yX3ZpYV9saW5lYXInIGlzIG1vcmUgY29tcGxleCBiZWNhdXNlIG9mIHByZS1tdWx0aXBsaWNhdGlvbiwKKyAqIHRoaXMgY29tcG91bmRzIHRoZSA4LWJpdCBlcnJvcnMgYWNjb3JkaW5nIHRvIHRoZSBhbHBoYSB2YWx1ZSBvZiB0aGUgcGl4ZWwuCisgKiBBcyBhIHJlc3VsdCAyNTYgdmFsdWVzIGFyZSBwcmUtY2FsY3VsYXRlZCBmb3IgZXJyb3JfdmlhX2xpbmVhci4KKyAqLworI2lmIDAKK3N0YXRpYyBpbnQgZXJyb3JfaW5fbGlicG5nX2dhbW1hOworc3RhdGljIGludCBlcnJvcl92aWFfbGluZWFyWzI1Nl07IC8qIEluZGV4ZWQgYnkgOC1iaXQgYWxwaGEgKi8KKworc3RhdGljIHZvaWQKK2luaXRfZXJyb3JfdmlhX2xpbmVhcih2b2lkKQoreworICAgaW50IGFscGhhOworCisgICBlcnJvcl92aWFfbGluZWFyWzBdID0gMjU1OyAvKiB0cmFuc3BhcmVudCBwaXhlbCAqLworCisgICBmb3IgKGFscGhhPTE7IGFscGhhPD0yNTU7ICsrYWxwaGEpCisgICB7CisgICAgICAvKiAxNi1iaXQgdmFsdWVzIGxlc3MgdGhhbiAxMjguNSBnZXQgcm91bmRlZCB0byA4LWJpdCAwIGFuZCBzbyB0aGUgd29yc3QKKyAgICAgICAqIGNhc2UgZXJyb3IgYXJpc2VzIHdpdGggMTYtYml0IDEyOC41LCB3b3JrIG91dCB3aGF0IHNSR0IKKyAgICAgICAqIChub24tYXNzb2NpYXRlZCkgdmFsdWUgZ2VuZXJhdGVzIDEyOC41OyBhbnkgdmFsdWUgbGVzcyB0aGFuIHRoaXMgaXMKKyAgICAgICAqIGdvaW5nIHRvIG1hcCB0byAwLCBzbyB0aGUgd29yc3QgZXJyb3IgaXMgZmxvb3IodmFsdWUpLgorICAgICAgICoKKyAgICAgICAqIE5vdGUgdGhhdCBlcnJvcnMgYXJlIGNvbnNpZGVyYWJseSBoaWdoZXIgKG1vcmUgdGhhbiBhIGZhY3RvciBvZiAyKQorICAgICAgICogYmVjYXVzZSBsaWJwbmcgdXNlcyBhIHNpbXBsZSBwb3dlciBsYXcgZm9yIHNSR0IgZGF0YSBhdCBwcmVzZW50LgorICAgICAgICoKKyAgICAgICAqIEFkZCAuMSBmb3IgYXJpdGhtZXRpYyBlcnJvcnMgaW5zaWRlIGxpYnBuZy4KKyAgICAgICAqLworICAgICAgZG91YmxlIHYgPSBmbG9vcigyNTUqcG93KC41LyooMTI4LjUgKiAyNTUgLyA2NTUzNSkqLyAvIGFscGhhLCAxLzIuMikrLjEpOworCisgICAgICBlcnJvcl92aWFfbGluZWFyW2FscGhhXSA9IChpbnQpdjsKKyAgIH0KKworICAgLyogVGhpcyBpcyBhY3R1YWxseSAxNC45OSwgYnV0LCBkZXNwaXRlIHRoZSBjbG9zZW5lc3MgdG8gMTUsIDE0IHNlZW1zIHRvIHdvcmsKKyAgICAqIG9rIGluIHRoaXMgY2FzZS4KKyAgICAqLworICAgZXJyb3JfaW5fbGlicG5nX2dhbW1hID0gMTQ7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK3ByaW50X3BpeGVsKGNoYXIgc3RyaW5nWzY0XSwgY29uc3QgUGl4ZWwgKnBpeGVsLCBwbmdfdWludF8zMiBmb3JtYXQpCit7CisgICBzd2l0Y2ggKGZvcm1hdCAmIChQTkdfRk9STUFUX0ZMQUdfQUxQSEF8UE5HX0ZPUk1BVF9GTEFHX0NPTE9SKSkKKyAgIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgIHNwcmludGYoc3RyaW5nLCAiJXMoJWQpIiwgZm9ybWF0X25hbWVzW2Zvcm1hdF0sIHBpeGVsLT5nKTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBOR19GT1JNQVRfRkxBR19BTFBIQToKKyAgICAgICAgIHNwcmludGYoc3RyaW5nLCAiJXMoJWQsJWQpIiwgZm9ybWF0X25hbWVzW2Zvcm1hdF0sIHBpeGVsLT5nLAorICAgICAgICAgICAgcGl4ZWwtPmEpOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUE5HX0ZPUk1BVF9GTEFHX0NPTE9SOgorICAgICAgICAgc3ByaW50ZihzdHJpbmcsICIlcyglZCwlZCwlZCkiLCBmb3JtYXRfbmFtZXNbZm9ybWF0XSwKKyAgICAgICAgICAgIHBpeGVsLT5yLCBwaXhlbC0+ZywgcGl4ZWwtPmIpOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUE5HX0ZPUk1BVF9GTEFHX0NPTE9SfFBOR19GT1JNQVRfRkxBR19BTFBIQToKKyAgICAgICAgIHNwcmludGYoc3RyaW5nLCAiJXMoJWQsJWQsJWQsJWQpIiwgZm9ybWF0X25hbWVzW2Zvcm1hdF0sCisgICAgICAgICAgICBwaXhlbC0+ciwgcGl4ZWwtPmcsIHBpeGVsLT5iLCBwaXhlbC0+YSk7CisgICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHNwcmludGYoc3RyaW5nLCAiaW52YWxpZC1mb3JtYXQiKTsKKyAgICAgICAgIGJyZWFrOworICAgfQorfQorCitzdGF0aWMgaW50Citsb2dwaXhlbChjb25zdCBUcmFuc2Zvcm0gKnRyYW5zZm9ybSwgcG5nX3VpbnRfMzIgeCwgcG5nX3VpbnRfMzIgeSwKKyAgIGNvbnN0IFBpeGVsICppbiwgY29uc3QgUGl4ZWwgKmNhbGMsIGNvbnN0IFBpeGVsICpvdXQsIGNvbnN0IGNoYXIgKnJlYXNvbikKK3sKKyAgIGNvbnN0IHBuZ191aW50XzMyIGluX2Zvcm1hdCA9IHRyYW5zZm9ybS0+aW5faW1hZ2UtPmltYWdlLmZvcm1hdDsKKyAgIGNvbnN0IHBuZ191aW50XzMyIG91dF9mb3JtYXQgPSB0cmFuc2Zvcm0tPm91dF9pbWFnZS0+aW1hZ2UuZm9ybWF0OworCisgICBwbmdfdWludF8zMiBiYWNrX2Zvcm1hdCA9IG91dF9mb3JtYXQgJiB+UE5HX0ZPUk1BVF9GTEFHX0FMUEhBOworICAgY29uc3QgY2hhciAqdmlhX2xpbmVhciA9ICIiOworCisgICBjaGFyIHBpeGVsX2luWzY0XSwgcGl4ZWxfY2FsY1s2NF0sIHBpeGVsX291dFs2NF0sIHBpeGVsX2xvY1s2NF07CisgICBjaGFyIGJhY2tncm91bmRfaW5mb1sxMDBdOworCisgICBwcmludF9waXhlbChwaXhlbF9pbiwgaW4sIGluX2Zvcm1hdCk7CisgICBwcmludF9waXhlbChwaXhlbF9jYWxjLCBjYWxjLCBvdXRfZm9ybWF0KTsKKyAgIHByaW50X3BpeGVsKHBpeGVsX291dCwgb3V0LCBvdXRfZm9ybWF0KTsKKworICAgaWYgKHRyYW5zZm9ybS0+aXNfcGFsZXR0ZSkKKyAgICAgIHNwcmludGYocGl4ZWxfbG9jLCAicGFsZXR0ZTogJWx1IiwgKHVuc2lnbmVkIGxvbmcpeSk7CisgICBlbHNlCisgICAgICBzcHJpbnRmKHBpeGVsX2xvYywgIiVsdSwlbHUiLCAodW5zaWduZWQgbG9uZyl4LCAodW5zaWduZWQgbG9uZyl5KTsKKworICAgaWYgKHRyYW5zZm9ybS0+ZnJvbV9saW5lYXIgIT0gTlVMTCkKKyAgIHsKKyAgICAgIHZpYV9saW5lYXIgPSAiICh2aWEgbGluZWFyKSI7CisgICAgICAvKiBBbmQgYXMgYSByZXN1bHQgdGhlICpyZWFkKiBmb3JtYXQgd2hpY2ggZGlkIGFueSBiYWNrZ3JvdW5kIHByb2Nlc3NpbmcKKyAgICAgICAqIHdhcyBpdHNlbGYgbGluZWFyLCBzbyB0aGUgYmFja2dyb3VuZCBjb2xvciBpbmZvcm1hdGlvbiBpcyBhbHNvCisgICAgICAgKiBsaW5lYXIuCisgICAgICAgKi8KKyAgICAgIGJhY2tfZm9ybWF0IHw9IFBOR19GT1JNQVRfRkxBR19MSU5FQVI7CisgICB9CisKKyAgIGlmICh0cmFuc2Zvcm0tPmJhY2tncm91bmQgIT0gTlVMTCkKKyAgIHsKKyAgICAgIFBpeGVsIGJhY2s7CisgICAgICBjaGFyIHBpeGVsX2JhY2tbNjRdOworCisgICAgICBiYWNrLnIgPSB0cmFuc2Zvcm0tPmJhY2tncm91bmQtPmlyOworICAgICAgYmFjay5nID0gdHJhbnNmb3JtLT5iYWNrZ3JvdW5kLT5pZzsKKyAgICAgIGJhY2suYiA9IHRyYW5zZm9ybS0+YmFja2dyb3VuZC0+aWI7CisgICAgICBiYWNrLmEgPSAtMTsgLyogbm90IHVzZWQgKi8KKworICAgICAgcHJpbnRfcGl4ZWwocGl4ZWxfYmFjaywgJmJhY2ssIGJhY2tfZm9ybWF0KTsKKyAgICAgIHNwcmludGYoYmFja2dyb3VuZF9pbmZvLCAiIG9uIGJhY2tncm91bmQgJXMiLCBwaXhlbF9iYWNrKTsKKyAgIH0KKworICAgZWxzZQorICAgICAgYmFja2dyb3VuZF9pbmZvWzBdID0gMDsKKworICAgaWYgKHRyYW5zZm9ybS0+aW5faW1hZ2UtPmZpbGVfbmFtZSAhPSB0cmFuc2Zvcm0tPm91dF9pbWFnZS0+ZmlsZV9uYW1lKQorICAgeworICAgICAgY2hhciBlcnJvcl9idWZmZXJbNTEyXTsKKyAgICAgIHNwcmludGYoZXJyb3JfYnVmZmVyLAorICAgICAgICAgIiglcykgJXMgZXJyb3IlczpcbiAlcyVzIC0+XG4gICAgICAgJXNcbiAgbm90OiAlcy5cbiIKKyAgICAgICAgICJVc2UgLS1wcmVzZXJ2ZSBhbmQgZXhhbWluZTogIiwgcGl4ZWxfbG9jLCByZWFzb24sIHZpYV9saW5lYXIsCisgICAgICAgICBwaXhlbF9pbiwgYmFja2dyb3VuZF9pbmZvLCBwaXhlbF9vdXQsIHBpeGVsX2NhbGMpOworICAgICAgcmV0dXJuIGxvZ2Vycm9yKHRyYW5zZm9ybS0+aW5faW1hZ2UsIHRyYW5zZm9ybS0+aW5faW1hZ2UtPmZpbGVfbmFtZSwKKyAgICAgICAgIGVycm9yX2J1ZmZlciwgdHJhbnNmb3JtLT5vdXRfaW1hZ2UtPmZpbGVfbmFtZSk7CisgICB9CisKKyAgIGVsc2UKKyAgIHsKKyAgICAgIGNoYXIgZXJyb3JfYnVmZmVyWzUxMl07CisgICAgICBzcHJpbnRmKGVycm9yX2J1ZmZlciwKKyAgICAgICAgICIoJXMpICVzIGVycm9yJXM6XG4gJXMlcyAtPlxuICAgICAgICVzXG4gIG5vdDogJXMuXG4iCisgICAgICAgICAiIFRoZSBlcnJvciBoYXBwZW5lZCB3aGVuIHJlYWRpbmcgdGhlIG9yaWdpbmFsIGZpbGUgd2l0aCB0aGlzIGZvcm1hdC4iLAorICAgICAgICAgcGl4ZWxfbG9jLCByZWFzb24sIHZpYV9saW5lYXIsIHBpeGVsX2luLCBiYWNrZ3JvdW5kX2luZm8sIHBpeGVsX291dCwKKyAgICAgICAgIHBpeGVsX2NhbGMpOworICAgICAgcmV0dXJuIGxvZ2Vycm9yKHRyYW5zZm9ybS0+aW5faW1hZ2UsIHRyYW5zZm9ybS0+aW5faW1hZ2UtPmZpbGVfbmFtZSwKKyAgICAgICAgIGVycm9yX2J1ZmZlciwgIiIpOworICAgfQorfQorCitzdGF0aWMgaW50CitjbXBwaXhlbChUcmFuc2Zvcm0gKnRyYW5zZm9ybSwgcG5nX2NvbnN0X3ZvaWRwIGluLCBwbmdfY29uc3Rfdm9pZHAgb3V0LAorICAgcG5nX3VpbnRfMzIgeCwgcG5nX3VpbnRfMzIgeS8qb3IgcGFsZXR0ZSBpbmRleCovKQoreworICAgaW50IG1heGVycjsKKyAgIHBuZ19jb25zdF9jaGFycCBlcnJtc2c7CisgICBQaXhlbCBwaXhlbF9pbiwgcGl4ZWxfY2FsYywgcGl4ZWxfb3V0OworCisgICB0cmFuc2Zvcm0tPmluX2dwKCZwaXhlbF9pbiwgaW4pOworCisgICBpZiAodHJhbnNmb3JtLT5mcm9tX2xpbmVhciA9PSBOVUxMKQorICAgICAgdHJhbnNmb3JtLT50cmFuc2Zvcm0oJnBpeGVsX2NhbGMsICZwaXhlbF9pbiwgdHJhbnNmb3JtLT5iYWNrZ3JvdW5kKTsKKworICAgZWxzZQorICAgeworICAgICAgdHJhbnNmb3JtLT50cmFuc2Zvcm0oJnBpeGVsX291dCwgJnBpeGVsX2luLCB0cmFuc2Zvcm0tPmJhY2tncm91bmQpOworICAgICAgdHJhbnNmb3JtLT5mcm9tX2xpbmVhcigmcGl4ZWxfY2FsYywgJnBpeGVsX291dCwgTlVMTCk7CisgICB9CisKKyAgIHRyYW5zZm9ybS0+b3V0X2dwKCZwaXhlbF9vdXQsIG91dCk7CisKKyAgIC8qIEVsaW1pbmF0ZSB0aGUgY2FzZSB3aGVyZSB0aGUgaW5wdXQgYW5kIG91dHB1dCB2YWx1ZXMgbWF0Y2ggZXhhY3RseS4gKi8KKyAgIGlmIChwaXhlbF9jYWxjLmEgPT0gcGl4ZWxfb3V0LmEgJiYgcGl4ZWxfY2FsYy5yID09IHBpeGVsX291dC5yICYmCisgICAgICBwaXhlbF9jYWxjLmcgPT0gcGl4ZWxfb3V0LmcgJiYgcGl4ZWxfY2FsYy5iID09IHBpeGVsX291dC5iKQorICAgICAgcmV0dXJuIDE7CisKKyAgIC8qIEVsaW1pbmF0ZSB0aGUgY2FzZSB3aGVyZSB0aGUgb3V0cHV0IHBpeGVsIGlzIHRyYW5zcGFyZW50IGFuZCB0aGUgb3V0cHV0CisgICAgKiBpcyA4LWJpdCAtIGFueSBjb21wb25lbnQgdmFsdWVzIGFyZSB2YWxpZC4gIERvbid0IGNoZWNrIHRoZSBpbnB1dCBhbHBoYQorICAgICogaGVyZSB0byBhbHNvIHNraXAgdGhlIDE2LWJpdCBzbWFsbCBhbHBoYSBjYXNlcy4KKyAgICAqLworICAgaWYgKHRyYW5zZm9ybS0+b3V0cHV0XzhiaXQgJiYgcGl4ZWxfY2FsYy5hID09IDAgJiYgcGl4ZWxfb3V0LmEgPT0gMCkKKyAgICAgIHJldHVybiAxOworCisgICAvKiBDaGVjayBmb3IgYWxwaGEgZXJyb3JzIGZpcnN0OyBhbiBhbHBoYSBlcnJvciBjYW4gZGFtYWdlIHRoZSBjb21wb25lbnRzIHRvbworICAgICogc28gYXZvaWQgc3B1cmlvdXMgY2hlY2tzIG9uIGNvbXBvbmVudHMgaWYgb25lIGlzIGZvdW5kLgorICAgICovCisgICBlcnJtc2cgPSBOVUxMOworICAgeworICAgICAgaW50IGVycl9hID0gYWJzKHBpeGVsX2NhbGMuYS1waXhlbF9vdXQuYSk7CisKKyAgICAgIGlmIChlcnJfYSA+IHRyYW5zZm9ybS0+ZXJyb3JbM10pCisgICAgICB7CisgICAgICAgICAvKiBJZiBhY2N1bXVsYXRpbmcgY2hlY2sgdGhlIGNvbXBvbmVudHMgdG9vICovCisgICAgICAgICBpZiAodHJhbnNmb3JtLT5hY2N1bXVsYXRlKQorICAgICAgICAgICAgdHJhbnNmb3JtLT5lcnJvclszXSA9IChwbmdfdWludF8xNillcnJfYTsKKworICAgICAgICAgZWxzZQorICAgICAgICAgICAgZXJybXNnID0gImFscGhhIjsKKyAgICAgIH0KKyAgIH0KKworICAgLyogTm93IGlmICplaXRoZXIqIG9mIHRoZSBvdXRwdXQgYWxwaGFzIGFyZSAwIGJ1dCBhbHBoYSBpcyB3aXRoaW4gdG9sZXJhbmNlCisgICAgKiBlbGltaW5hdGUgdGhlIDgtYml0IGNvbXBvbmVudCBjb21wYXJpc29uLgorICAgICovCisgICBpZiAoZXJybXNnID09IE5VTEwgJiYgdHJhbnNmb3JtLT5vdXRwdXRfOGJpdCAmJgorICAgICAgKHBpeGVsX2NhbGMuYSA9PSAwIHx8IHBpeGVsX291dC5hID09IDApKQorICAgICAgcmV0dXJuIDE7CisKKyAgIGlmIChlcnJtc2cgPT0gTlVMTCkgLyogZWxzZSBqdXN0IHNpZ25hbCBhbiBhbHBoYSBlcnJvciAqLworICAgeworICAgICAgaW50IGVycl9yID0gYWJzKHBpeGVsX2NhbGMuciAtIHBpeGVsX291dC5yKTsKKyAgICAgIGludCBlcnJfZyA9IGFicyhwaXhlbF9jYWxjLmcgLSBwaXhlbF9vdXQuZyk7CisgICAgICBpbnQgZXJyX2IgPSBhYnMocGl4ZWxfY2FsYy5iIC0gcGl4ZWxfb3V0LmIpOworICAgICAgaW50IGxpbWl0OworCisgICAgICBpZiAoKGVycl9yIHwgZXJyX2cgfCBlcnJfYikgPT0gMCkKKyAgICAgICAgIHJldHVybiAxOyAvKiBleGFjdCBtYXRjaCAqLworCisgICAgICAvKiBNaXNtYXRjaCBvbiBhIGNvbXBvbmVudCwgY2hlY2sgdGhlIGlucHV0IGFscGhhICovCisgICAgICBpZiAocGl4ZWxfaW4uYSA+PSB0cmFuc2Zvcm0tPmluX29wYXF1ZSkKKyAgICAgIHsKKyAgICAgICAgIGVycm1zZyA9ICJvcGFxdWUgY29tcG9uZW50IjsKKyAgICAgICAgIGxpbWl0ID0gMjsgLyogb3BhcXVlICovCisgICAgICB9CisKKyAgICAgIGVsc2UgaWYgKHBpeGVsX2luLmEgPiAwKQorICAgICAgeworICAgICAgICAgZXJybXNnID0gImFscGhhIGNvbXBvbmVudCI7CisgICAgICAgICBsaW1pdCA9IDE7IC8qIHBhcnRpYWxseSB0cmFuc3BhcmVudCAqLworICAgICAgfQorCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBlcnJtc2cgPSAidHJhbnNwYXJlbnQgY29tcG9uZW50IChiYWNrZ3JvdW5kKSI7CisgICAgICAgICBsaW1pdCA9IDA7IC8qIHRyYW5zcGFyZW50ICovCisgICAgICB9CisKKyAgICAgIG1heGVyciA9IGVycl9yOworICAgICAgaWYgKG1heGVyciA8IGVycl9nKSBtYXhlcnIgPSBlcnJfZzsKKyAgICAgIGlmIChtYXhlcnIgPCBlcnJfYikgbWF4ZXJyID0gZXJyX2I7CisKKyAgICAgIGlmIChtYXhlcnIgPD0gdHJhbnNmb3JtLT5lcnJvcltsaW1pdF0pCisgICAgICAgICByZXR1cm4gMTsgLyogd2l0aGluIHRoZSBlcnJvciBsaW1pdHMgKi8KKworICAgICAgLyogSGFuZGxlIGEgY29tcG9uZW50IG1pcy1tYXRjaDsgbG9nIGl0LCBqdXN0IHJldHVybiBhbiBlcnJvciBjb2RlLCBvcgorICAgICAgICogYWNjdW11bGF0ZSBpdC4KKyAgICAgICAqLworICAgICAgaWYgKHRyYW5zZm9ybS0+YWNjdW11bGF0ZSkKKyAgICAgIHsKKyAgICAgICAgIHRyYW5zZm9ybS0+ZXJyb3JbbGltaXRdID0gKHBuZ191aW50XzE2KW1heGVycjsKKyAgICAgICAgIHJldHVybiAxOyAvKiB0byBjYXVzZSB0aGUgY2FsbGVyIHRvIGtlZXAgZ29pbmcgKi8KKyAgICAgIH0KKyAgIH0KKworICAgLyogRmFpbHVyZSB0byBtYXRjaCBhbmQgbm90IGFjY3VtdWxhdGluZywgc28gdGhlIGVycm9yIG11c3QgYmUgbG9nZ2VkLiAqLworICAgcmV0dXJuIGxvZ3BpeGVsKHRyYW5zZm9ybSwgeCwgeSwgJnBpeGVsX2luLCAmcGl4ZWxfY2FsYywgJnBpeGVsX291dCwgZXJybXNnKTsKK30KKworc3RhdGljIHBuZ19ieXRlCitjb21wb25lbnRfbG9jKHBuZ19ieXRlIGxvY1s0XSwgcG5nX3VpbnRfMzIgZm9ybWF0KQoreworICAgLyogR2l2ZW4gYSBmb3JtYXQgcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgYW5kIHRoZSBsb2NhdGlvbiBvZgorICAgICogZWFjaCBjaGFubmVsLgorICAgICoKKyAgICAqIFRoZSBtYXNrICdsb2MnIGNvbnRhaW5zIHRoZSBjb21wb25lbnQgb2Zmc2V0IG9mIHRoZSBjaGFubmVscyBpbiB0aGUKKyAgICAqIGZvbGxvd2luZyBvcmRlci4gIE5vdGUgdGhhdCBpZiAnZm9ybWF0JyBpcyBncmF5c2NhbGUgdGhlIGVudHJpZXMgMS0zIG11c3QKKyAgICAqIGFsbCBjb250YWluIHRoZSBsb2NhdGlvbiBvZiB0aGUgZ3JheSBjaGFubmVsLgorICAgICoKKyAgICAqIDA6IGFscGhhCisgICAgKiAxOiByZWQgb3IgZ3JheQorICAgICogMjogZ3JlZW4gb3IgZ3JheQorICAgICogMzogYmx1ZSBvciBncmF5CisgICAgKi8KKyAgIHBuZ19ieXRlIGNoYW5uZWxzOworCisgICBpZiAoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9SKQorICAgeworICAgICAgY2hhbm5lbHMgPSAzOworCisgICAgICBsb2NbMl0gPSAxOworCisjICAgICBpZmRlZiBQTkdfRk9STUFUX0JHUl9TVVBQT1JURUQKKyAgICAgICAgIGlmIChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQkdSKQorICAgICAgICAgeworICAgICAgICAgICAgbG9jWzFdID0gMjsKKyAgICAgICAgICAgIGxvY1szXSA9IDA7CisgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UKKyMgICAgIGVuZGlmCisgICAgICB7CisgICAgICAgICBsb2NbMV0gPSAwOworICAgICAgICAgbG9jWzNdID0gMjsKKyAgICAgIH0KKyAgIH0KKworICAgZWxzZQorICAgeworICAgICAgY2hhbm5lbHMgPSAxOworICAgICAgbG9jWzFdID0gbG9jWzJdID0gbG9jWzNdID0gMDsKKyAgIH0KKworICAgaWYgKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BTFBIQSkKKyAgIHsKKyMgICAgIGlmZGVmIFBOR19GT1JNQVRfQUZJUlNUX1NVUFBPUlRFRAorICAgICAgICAgaWYgKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BRklSU1QpCisgICAgICAgICB7CisgICAgICAgICAgICBsb2NbMF0gPSAwOworICAgICAgICAgICAgKytsb2NbMV07CisgICAgICAgICAgICArK2xvY1syXTsKKyAgICAgICAgICAgICsrbG9jWzNdOworICAgICAgICAgfQorCisgICAgICAgICBlbHNlCisjICAgICBlbmRpZgorICAgICAgICAgbG9jWzBdID0gY2hhbm5lbHM7CisKKyAgICAgICsrY2hhbm5lbHM7CisgICB9CisKKyAgIGVsc2UKKyAgICAgIGxvY1swXSA9IDQ7IC8qIG5vdCBwcmVzZW50ICovCisKKyAgIHJldHVybiBjaGFubmVsczsKK30KKworLyogQ29tcGFyZSB0d28gaW1hZ2VzLCB0aGUgb3JpZ2luYWwgJ2EnLCB3aGljaCB3YXMgd3JpdHRlbiBvdXQgdGhlbiByZWFkIGJhY2sgaW4KKyAqIHRvICogZ2l2ZSBpbWFnZSAnYicuICBUaGUgZm9ybWF0cyBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQuCisgKi8KK3N0YXRpYyBpbnQKK2NvbXBhcmVfdHdvX2ltYWdlcyhJbWFnZSAqYSwgSW1hZ2UgKmIsIGludCB2aWFfbGluZWFyLAorICAgcG5nX2NvbnN0X2NvbG9ycCBiYWNrZ3JvdW5kKQoreworICAgcHRyZGlmZl90IHN0cmlkZWEgPSBhLT5zdHJpZGU7CisgICBwdHJkaWZmX3Qgc3RyaWRlYiA9IGItPnN0cmlkZTsKKyAgIHBuZ19jb25zdF9ieXRlcCByb3dhID0gYS0+YnVmZmVyKzE2OworICAgcG5nX2NvbnN0X2J5dGVwIHJvd2IgPSBiLT5idWZmZXIrMTY7CisgICBjb25zdCBwbmdfdWludF8zMiB3aWR0aCA9IGEtPmltYWdlLndpZHRoOworICAgY29uc3QgcG5nX3VpbnRfMzIgaGVpZ2h0ID0gYS0+aW1hZ2UuaGVpZ2h0OworICAgY29uc3QgcG5nX3VpbnRfMzIgZm9ybWF0YSA9IGEtPmltYWdlLmZvcm1hdDsKKyAgIGNvbnN0IHBuZ191aW50XzMyIGZvcm1hdGIgPSBiLT5pbWFnZS5mb3JtYXQ7CisgICBjb25zdCB1bnNpZ25lZCBpbnQgYV9zYW1wbGUgPSBQTkdfSU1BR0VfU0FNUExFX1NJWkUoZm9ybWF0YSk7CisgICBjb25zdCB1bnNpZ25lZCBpbnQgYl9zYW1wbGUgPSBQTkdfSU1BR0VfU0FNUExFX1NJWkUoZm9ybWF0Yik7CisgICBpbnQgYWxwaGFfYWRkZWQsIGFscGhhX3JlbW92ZWQ7CisgICBpbnQgYmNoYW5uZWxzOworICAgaW50IGJ0b2FbNF07CisgICBwbmdfdWludF8zMiB5OworICAgVHJhbnNmb3JtIHRyOworCisgICAvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW46ICovCisgICBpZiAod2lkdGggIT0gYi0+aW1hZ2Uud2lkdGggfHwgaGVpZ2h0ICE9IGItPmltYWdlLmhlaWdodCkKKyAgICAgIHJldHVybiBsb2dlcnJvcihhLCBhLT5maWxlX25hbWUsICI6IHdpZHRoIHggaGVpZ2h0IGNoYW5nZWQ6ICIsCisgICAgICAgICBiLT5maWxlX25hbWUpOworCisgICAvKiBTZXQgdXAgdGhlIGJhY2tncm91bmQgYW5kIHRoZSB0cmFuc2Zvcm0gKi8KKyAgIHRyYW5zZm9ybV9mcm9tX2Zvcm1hdHMoJnRyLCBhLCBiLCBiYWNrZ3JvdW5kLCB2aWFfbGluZWFyKTsKKworICAgLyogRmluZCB0aGUgZmlyc3Qgcm93IGFuZCBpbnRlci1yb3cgc3BhY2UuICovCisgICBpZiAoIShmb3JtYXRhICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQKSAmJgorICAgICAgKGZvcm1hdGEgJiBQTkdfRk9STUFUX0ZMQUdfTElORUFSKSkKKyAgICAgIHN0cmlkZWEgKj0gMjsKKworICAgaWYgKCEoZm9ybWF0YiAmIFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCkgJiYKKyAgICAgIChmb3JtYXRiICYgUE5HX0ZPUk1BVF9GTEFHX0xJTkVBUikpCisgICAgICBzdHJpZGViICo9IDI7CisKKyAgIGlmIChzdHJpZGVhIDwgMCkgcm93YSArPSAoaGVpZ2h0LTEpICogKC1zdHJpZGVhKTsKKyAgIGlmIChzdHJpZGViIDwgMCkgcm93YiArPSAoaGVpZ2h0LTEpICogKC1zdHJpZGViKTsKKworICAgLyogRmlyc3Qgc2hvcnRjdXQgdGhlIHR3byBjb2xvcm1hcCBjYXNlIGJ5IGNvbXBhcmluZyB0aGUgaW1hZ2UgZGF0YTsgaWYgaXQKKyAgICAqIG1hdGNoZXMgdGhlbiB3ZSBleHBlY3QgdGhlIGNvbG9ybWFwcyB0byBtYXRjaCwgYWx0aG91Z2ggdGhpcyBpcyBub3QKKyAgICAqIGFic29sdXRlbHkgbmVjZXNzYXJ5IGZvciBhbiBpbWFnZSBtYXRjaC4gIElmIHRoZSBjb2xvcm1hcHMgZmFpbCB0byBtYXRjaAorICAgICogdGhlbiB0aGVyZSBpcyBhIHByb2JsZW0gaW4gbGlicG5nLgorICAgICovCisgICBpZiAoZm9ybWF0YSAmIGZvcm1hdGIgJiBQTkdfRk9STUFUX0ZMQUdfQ09MT1JNQVApCisgICB7CisgICAgICAvKiBPbmx5IGNoZWNrIGNvbG9ybWFwIGVudHJpZXMgdGhhdCBhY3R1YWxseSBleGlzdDsgKi8KKyAgICAgIHBuZ19jb25zdF9ieXRlcCBwcGEsIHBwYjsKKyAgICAgIGludCBtYXRjaDsKKyAgICAgIHBuZ19ieXRlIGluX3VzZVsyNTZdLCBhbWF4ID0gMCwgYm1heCA9IDA7CisKKyAgICAgIG1lbXNldChpbl91c2UsIDAsIHNpemVvZiBpbl91c2UpOworCisgICAgICBwcGEgPSByb3dhOworICAgICAgcHBiID0gcm93YjsKKworICAgICAgLyogRG8gdGhpcyB0aGUgc2xvdyB3YXkgdG8gYWNjdW11bGF0ZSB0aGUgJ2luX3VzZScgZmxhZ3MsIGRvbid0IGJyZWFrIG91dAorICAgICAgICogb2YgdGhlIGxvb3AgdW50aWwgdGhlIGVuZDsgdGhpcyB2YWxpZGF0ZXMgdGhlIGNvbG9yLW1hcHBlZCBkYXRhIHRvCisgICAgICAgKiBlbnN1cmUgYWxsIHBpeGVscyBhcmUgdmFsaWQgY29sb3ItbWFwIGluZGV4ZXMuCisgICAgICAgKi8KKyAgICAgIGZvciAoeT0wLCBtYXRjaD0xOyB5PGhlaWdodCAmJiBtYXRjaDsgKyt5LCBwcGEgKz0gc3RyaWRlYSwgcHBiICs9IHN0cmlkZWIpCisgICAgICB7CisgICAgICAgICBwbmdfdWludF8zMiB4OworCisgICAgICAgICBmb3IgKHg9MDsgeDx3aWR0aDsgKyt4KQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGUgYnZhbCA9IHBwYlt4XTsKKyAgICAgICAgICAgIHBuZ19ieXRlIGF2YWwgPSBwcGFbeF07CisKKyAgICAgICAgICAgIGlmIChidmFsID4gYm1heCkKKyAgICAgICAgICAgICAgIGJtYXggPSBidmFsOworCisgICAgICAgICAgICBpZiAoYnZhbCAhPSBhdmFsKQorICAgICAgICAgICAgICAgbWF0Y2ggPSAwOworCisgICAgICAgICAgICBpbl91c2VbYXZhbF0gPSAxOworICAgICAgICAgICAgaWYgKGF2YWwgPiBhbWF4KQorICAgICAgICAgICAgICAgYW1heCA9IGF2YWw7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIElmIHRoZSBidWZmZXJzIG1hdGNoIHRoZW4gdGhlIGNvbG9ybWFwcyBtdXN0IHRvby4gKi8KKyAgICAgIGlmIChtYXRjaCkKKyAgICAgIHsKKyAgICAgICAgIC8qIERvIHRoZSBjb2xvci1tYXBzIG1hdGNoLCBlbnRyeSBieSBlbnRyeT8gIE9ubHkgY2hlY2sgdGhlICdpbl91c2UnCisgICAgICAgICAgKiBlbnRyaWVzLiAgQW4gZXJyb3IgaGVyZSBzaG91bGQgYmUgbG9nZ2VkIGFzIGEgY29sb3ItbWFwIGVycm9yLgorICAgICAgICAgICovCisgICAgICAgICBwbmdfY29uc3RfYnl0ZXAgYV9jbWFwID0gKHBuZ19jb25zdF9ieXRlcClhLT5jb2xvcm1hcDsKKyAgICAgICAgIHBuZ19jb25zdF9ieXRlcCBiX2NtYXAgPSAocG5nX2NvbnN0X2J5dGVwKWItPmNvbG9ybWFwOworICAgICAgICAgaW50IHJlc3VsdCA9IDE7IC8qIG1hdGNoIGJ5IGRlZmF1bHQgKi8KKworICAgICAgICAgLyogVGhpcyBpcyB1c2VkIGluIGxvZ3BpeGVsIHRvIGdldCB0aGUgZXJyb3IgbWVzc2FnZSBjb3JyZWN0LiAqLworICAgICAgICAgdHIuaXNfcGFsZXR0ZSA9IDE7CisKKyAgICAgICAgIGZvciAoeT0wOyB5PDI1NjsgKyt5LCBhX2NtYXAgKz0gYV9zYW1wbGUsIGJfY21hcCArPSBiX3NhbXBsZSkKKyAgICAgICAgICAgIGlmIChpbl91c2VbeV0pCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGUgY29sb3JtYXAgZW50cmllcyBzaG91bGQgYmUgdmFsaWQsIGJ1dCBiZWNhdXNlIGxpYnBuZyBkb2Vzbid0CisgICAgICAgICAgICAgKiBkbyBhbnkgY2hlY2tpbmcgYXQgcHJlc2VudCB0aGUgb3JpZ2luYWwgaW1hZ2UgbWF5IGNvbnRhaW4gaW52YWxpZAorICAgICAgICAgICAgICogcGl4ZWwgdmFsdWVzLiAgVGhlc2UgY2F1c2UgYW4gZXJyb3IgaGVyZSAoYXQgcHJlc2VudCkgdW5sZXNzCisgICAgICAgICAgICAgKiBhY2N1bXVsYXRpbmcgZXJyb3JzIGluIHdoaWNoIGNhc2UgdGhlIHByb2dyYW0ganVzdCBpZ25vcmVzIHRoZW0uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICh5ID49IGEtPmltYWdlLmNvbG9ybWFwX2VudHJpZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZiAoKGEtPm9wdHMgJiBBQ0NVTVVMQVRFKSA9PSAwKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgY2hhciBwaW5kZXhbOV07CisgICAgICAgICAgICAgICAgICBzcHJpbnRmKHBpbmRleCwgIiVsdVslbHVdIiwgKHVuc2lnbmVkIGxvbmcpeSwKKyAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWEtPmltYWdlLmNvbG9ybWFwX2VudHJpZXMpOworICAgICAgICAgICAgICAgICAgbG9nZXJyb3IoYSwgYS0+ZmlsZV9uYW1lLCAiOiBiYWQgcGl4ZWwgaW5kZXg6ICIsIHBpbmRleCk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICByZXN1bHQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbHNlIGlmICh5ID49IGItPmltYWdlLmNvbG9ybWFwX2VudHJpZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZiAoKGItPm9wdHMgJiBBQ0NVTVVMQVRFKSA9PSAwKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgY2hhciBwaW5kZXhbOV07CisgICAgICAgICAgICAgICAgICBzcHJpbnRmKHBpbmRleCwgIiVsdVslbHVdIiwgKHVuc2lnbmVkIGxvbmcpeSwKKyAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWItPmltYWdlLmNvbG9ybWFwX2VudHJpZXMpOworICAgICAgICAgICAgICAgICAgbG9nZXJyb3IoYiwgYi0+ZmlsZV9uYW1lLCAiOiBiYWQgcGl4ZWwgaW5kZXg6ICIsIHBpbmRleCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICByZXN1bHQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBBbGwgdGhlIG1pc21hdGNoZXMgYXJlIGxvZ2dlZCBoZXJlOyB0aGVyZSBjYW4gb25seSBiZSAyNTYhICovCisgICAgICAgICAgICBlbHNlIGlmICghY21wcGl4ZWwoJnRyLCBhX2NtYXAsIGJfY21hcCwgMCwgeSkpCisgICAgICAgICAgICAgICByZXN1bHQgPSAwOworICAgICAgICAgfQorCisgICAgICAgICAvKiBJZiByZXFlc3RlZCBjb3B5IHRoZSBlcnJvciB2YWx1ZXMgYmFjayBmcm9tIHRoZSBUcmFuc2Zvcm0uICovCisgICAgICAgICBpZiAoYS0+b3B0cyAmIEFDQ1VNVUxBVEUpCisgICAgICAgICB7CisgICAgICAgICAgICB0ci5lcnJvcl9wdHJbMF0gPSB0ci5lcnJvclswXTsKKyAgICAgICAgICAgIHRyLmVycm9yX3B0clsxXSA9IHRyLmVycm9yWzFdOworICAgICAgICAgICAgdHIuZXJyb3JfcHRyWzJdID0gdHIuZXJyb3JbMl07CisgICAgICAgICAgICB0ci5lcnJvcl9wdHJbM10gPSB0ci5lcnJvclszXTsKKyAgICAgICAgICAgIHJlc3VsdCA9IDE7IC8qIGZvcmNlIGEgY29udGludWUgKi8KKyAgICAgICAgIH0KKworICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKworICAgICAgLyogZWxzZSB0aGUgaW1hZ2UgYnVmZmVycyBkb24ndCBtYXRjaCBwaXhlbC13aXNlIHNvIGNvbXBhcmUgc2FtcGxlIHZhbHVlcworICAgICAgICogaW5zdGVhZCwgYnV0IGZpcnN0IHZhbGlkYXRlIHRoYXQgdGhlIHBpeGVsIGluZGV4ZXMgYXJlIGluIHJhbmdlIChidXQKKyAgICAgICAqIG9ubHkgaWYgbm90IGFjY3VtdWxhdGluZywgd2hlbiB0aGUgZXJyb3IgaXMgaWdub3JlZC4pCisgICAgICAgKi8KKyAgICAgIGVsc2UgaWYgKChhLT5vcHRzICYgQUNDVU1VTEFURSkgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgIC8qIENoZWNrIHRoZSBvcmlnaW5hbCBpbWFnZSBmaXJzdCwKKyAgICAgICAgICAqIFRPRE86IGRlYWwgd2l0aCBpbnB1dCBpbWFnZXMgd2l0aCBiYWQgcGl4ZWwgdmFsdWVzPworICAgICAgICAgICovCisgICAgICAgICBpZiAoYW1heCA+PSBhLT5pbWFnZS5jb2xvcm1hcF9lbnRyaWVzKQorICAgICAgICAgeworICAgICAgICAgICAgY2hhciBwaW5kZXhbOV07CisgICAgICAgICAgICBzcHJpbnRmKHBpbmRleCwgIiVkWyVsdV0iLCBhbWF4LAorICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpYS0+aW1hZ2UuY29sb3JtYXBfZW50cmllcyk7CisgICAgICAgICAgICByZXR1cm4gbG9nZXJyb3IoYSwgYS0+ZmlsZV9uYW1lLCAiOiBiYWQgcGl4ZWwgaW5kZXg6ICIsIHBpbmRleCk7CisgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UgaWYgKGJtYXggPj0gYi0+aW1hZ2UuY29sb3JtYXBfZW50cmllcykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgcGluZGV4WzldOworICAgICAgICAgICAgc3ByaW50ZihwaW5kZXgsICIlZFslbHVdIiwgYm1heCwKKyAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWItPmltYWdlLmNvbG9ybWFwX2VudHJpZXMpOworICAgICAgICAgICAgcmV0dXJuIGxvZ2Vycm9yKGIsIGItPmZpbGVfbmFtZSwgIjogYmFkIHBpeGVsIGluZGV4OiAiLCBwaW5kZXgpOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICAvKiBXZSBjYW4gZGlyZWN0bHkgY29tcGFyZSBwaXhlbCB2YWx1ZXMgd2l0aG91dCB0aGUgbmVlZCB0byB1c2UgdGhlIHJlYWQKKyAgICAqIG9yIHRyYW5zZm9ybSBzdXBwb3J0IChpLmUuIGEgbWVtb3J5IGNvbXBhcmUpIGlmOgorICAgICoKKyAgICAqIDEpIFRoZSBiaXQgZGVwdGggaGFzIG5vdCBjaGFuZ2VkLgorICAgICogMikgUkdCIHRvIGdyYXlzY2FsZSBoYXMgbm90IGJlZW4gZG9uZSAodGhlIHJldmVyc2UgaXMgb2s7IHdlIGp1c3QgY29tcGFyZQorICAgICogICAgdGhlIHRocmVlIFJHQiB2YWx1ZXMgdG8gdGhlIG9yaWdpbmFsIGdyYXlzY2FsZS4pCisgICAgKiAzKSBBbiBhbHBoYSBjaGFubmVsIGhhcyBub3QgYmVlbiByZW1vdmVkIGZyb20gYW4gOC1iaXQgZm9ybWF0LCBvciB0aGUKKyAgICAqICAgIDgtYml0IGFscGhhIHZhbHVlIG9mIHRoZSBwaXhlbCB3YXMgMjU1IChvcGFxdWUpLgorICAgICoKKyAgICAqIElmIGFuIGFscGhhIGNoYW5uZWwgaGFzIGJlZW4gKmFkZGVkKiB0aGVuIGl0IG11c3QgaGF2ZSB0aGUgcmVsZXZhbnQgb3BhcXVlCisgICAgKiB2YWx1ZSAoMjU1IG9yIDY1NTM1KS4KKyAgICAqCisgICAgKiBUaGUgZmlzdCB0d28gdGhlIHRlc3RzIChpbiB0aGUgb3JkZXIgZ2l2ZW4gYWJvdmUpICh1c2luZyB0aGUgYm9vbGVhbgorICAgICogZXF1aXZhbGVuY2UgIWEgJiYgIWIgPT0gIShhIHx8IGIpKQorICAgICovCisgICBpZiAoISgoKGZvcm1hdGEgXiBmb3JtYXRiKSAmIFBOR19GT1JNQVRfRkxBR19MSU5FQVIpIHwKKyAgICAgIChmb3JtYXRhICYgKGZvcm1hdGIgXiBQTkdfRk9STUFUX0ZMQUdfQ09MT1IpICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9SKSkpCisgICB7CisgICAgICAvKiBXYXMgYW4gYWxwaGEgY2hhbm5lbCBjaGFuZ2VkPyAqLworICAgICAgY29uc3QgcG5nX3VpbnRfMzIgYWxwaGFfY2hhbmdlZCA9IChmb3JtYXRhIF4gZm9ybWF0YikgJgorICAgICAgICAgUE5HX0ZPUk1BVF9GTEFHX0FMUEhBOworCisgICAgICAvKiBXYXMgYW4gYWxwaGEgY2hhbm5lbCByZW1vdmVkPyAgKFRoZSB0aGlyZCB0ZXN0LikgIElmIHNvIHRoZSBkaXJlY3QKKyAgICAgICAqIGNvbXBhcmlzb24gaXMgb25seSBwb3NzaWJsZSBpZiB0aGUgaW5wdXQgYWxwaGEgaXMgb3BhcXVlLgorICAgICAgICovCisgICAgICBhbHBoYV9yZW1vdmVkID0gKGZvcm1hdGEgJiBhbHBoYV9jaGFuZ2VkKSAhPSAwOworCisgICAgICAvKiBXYXMgYW4gYWxwaGEgY2hhbm5lbCBhZGRlZD8gKi8KKyAgICAgIGFscGhhX2FkZGVkID0gKGZvcm1hdGIgJiBhbHBoYV9jaGFuZ2VkKSAhPSAwOworCisgICAgICAvKiBUaGUgY2hhbm5lbHMgbWF5IGhhdmUgYmVlbiBtb3ZlZCBiZXR3ZWVuIGlucHV0IGFuZCBvdXRwdXQsIHRoaXMgZmluZHMKKyAgICAgICAqIG91dCBob3csIHJlY29yZGluZyB0aGUgcmVzdWx0IGluIHRoZSBidG9hIGFycmF5LCB3aGljaCBzYXlzIHdoZXJlIGluCisgICAgICAgKiAnYScgdG8gZmluZCBlYWNoIGNoYW5uZWwgb2YgJ2InLiAgSWYgYWxwaGEgd2FzIGFkZGVkIHRoZW4gYnRvYVthbHBoYV0KKyAgICAgICAqIGVuZHMgdXAgYXMgNCAoYW5kIGlzIG5vdCB1c2VkLikKKyAgICAgICAqLworICAgICAgeworICAgICAgICAgaW50IGk7CisgICAgICAgICBwbmdfYnl0ZSBhbG9jWzRdOworICAgICAgICAgcG5nX2J5dGUgYmxvY1s0XTsKKworICAgICAgICAgLyogVGhlIGZvbGxvd2luZyBhcmUgdXNlZCBvbmx5IGlmIHRoZSBmb3JtYXRzIG1hdGNoLCBleGNlcHQgdGhhdAorICAgICAgICAgICogJ2JjaGFubmVscycgaXMgYSBmbGFnIGZvciBtYXRjaGluZyBmb3JtYXRzLiAgYnRvYVt4XSBzYXlzLCBmb3IgZWFjaAorICAgICAgICAgICogY2hhbm5lbCBpbiBiLCB3aGVyZSB0byBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluIGEsIGZvciB0aGUKKyAgICAgICAgICAqIGJjaGFubmVscy4gIGFjaGFubmVscyBtYXkgYmUgZGlmZmVyZW50IGZvciBhIGdyYXkgdG8gcmdiIHRyYW5zZm9ybQorICAgICAgICAgICogKGEgd2lsbCBiZSAxIG9yIDIsIGIgd2lsbCBiZSAzIG9yIDQgY2hhbm5lbHMuKQorICAgICAgICAgICovCisgICAgICAgICAodm9pZCljb21wb25lbnRfbG9jKGFsb2MsIGZvcm1hdGEpOworICAgICAgICAgYmNoYW5uZWxzID0gY29tcG9uZW50X2xvYyhibG9jLCBmb3JtYXRiKTsKKworICAgICAgICAgLyogSGVuY2UgdGhlIGJ0b2EgYXJyYXkuICovCisgICAgICAgICBmb3IgKGk9MDsgaTw0OyArK2kpIGlmIChibG9jW2ldIDwgNCkKKyAgICAgICAgICAgIGJ0b2FbYmxvY1tpXV0gPSBhbG9jW2ldOyAvKiBtYXkgYmUgJzQnIGZvciBhbHBoYSAqLworCisgICAgICAgICBpZiAoYWxwaGFfYWRkZWQpCisgICAgICAgICAgICBhbHBoYV9hZGRlZCA9IGJsb2NbMF07IC8qIGxvY2F0aW9uIG9mIGFscGhhIGNoYW5uZWwgaW4gaW1hZ2UgYiAqLworCisgICAgICAgICBlbHNlCisgICAgICAgICAgICBhbHBoYV9hZGRlZCA9IDQ7IC8qIFdvbid0IG1hdGNoIGFuIGltYWdlIGIgY2hhbm5lbCAqLworCisgICAgICAgICBpZiAoYWxwaGFfcmVtb3ZlZCkKKyAgICAgICAgICAgIGFscGhhX3JlbW92ZWQgPSBhbG9jWzBdOyAvKiBsb2NhdGlvbiBvZiBhbHBoYSBjaGFubmVsIGluIGltYWdlIGEgKi8KKworICAgICAgICAgZWxzZQorICAgICAgICAgICAgYWxwaGFfcmVtb3ZlZCA9IDQ7CisgICAgICB9CisgICB9CisKKyAgIGVsc2UKKyAgIHsKKyAgICAgIC8qIERpcmVjdCBjb21wYXJlIGlzIG5vdCBwb3NzaWJsZSwgY2FuY2VsIG91dCBhbGwgdGhlIGNvcnJlc3BvbmRpbmcgbG9jYWwKKyAgICAgICAqIHZhcmlhYmxlcy4KKyAgICAgICAqLworICAgICAgYmNoYW5uZWxzID0gMDsKKyAgICAgIGFscGhhX3JlbW92ZWQgPSBhbHBoYV9hZGRlZCA9IDQ7CisgICAgICBidG9hWzNdID0gYnRvYVsyXSA9IGJ0b2FbMV0gPSBidG9hWzBdID0gNDsgLyogNCA9PSBub3QgcHJlc2VudCAqLworICAgfQorCisgICBmb3IgKHk9MDsgeTxoZWlnaHQ7ICsreSwgcm93YSArPSBzdHJpZGVhLCByb3diICs9IHN0cmlkZWIpCisgICB7CisgICAgICBwbmdfY29uc3RfYnl0ZXAgcHBhLCBwcGI7CisgICAgICBwbmdfdWludF8zMiB4OworCisgICAgICBmb3IgKHg9MCwgcHBhPXJvd2EsIHBwYj1yb3diOyB4PHdpZHRoOyArK3gpCisgICAgICB7CisgICAgICAgICBwbmdfY29uc3RfYnl0ZXAgcHNhLCBwc2I7CisKKyAgICAgICAgIGlmIChmb3JtYXRhICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQKQorICAgICAgICAgICAgcHNhID0gKHBuZ19jb25zdF9ieXRlcClhLT5jb2xvcm1hcCArIGFfc2FtcGxlICogKnBwYSsrOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgcHNhID0gcHBhLCBwcGEgKz0gYV9zYW1wbGU7CisKKyAgICAgICAgIGlmIChmb3JtYXRiICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQKQorICAgICAgICAgICAgcHNiID0gKHBuZ19jb25zdF9ieXRlcCliLT5jb2xvcm1hcCArIGJfc2FtcGxlICogKnBwYisrOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgcHNiID0gcHBiLCBwcGIgKz0gYl9zYW1wbGU7CisKKyAgICAgICAgIC8qIERvIHRoZSBmYXN0IHRlc3QgaWYgcG9zc2libGUuICovCisgICAgICAgICBpZiAoYmNoYW5uZWxzKQorICAgICAgICAgeworICAgICAgICAgICAgLyogQ2hlY2sgZWFjaCAnYicgY2hhbm5lbCBhZ2FpbnN0IGVpdGhlciB0aGUgY29ycmVzcG9uZGluZyAnYScKKyAgICAgICAgICAgICAqIGNoYW5uZWwgb3IgdGhlIG9wYXF1ZSBhbHBoYSB2YWx1ZSwgYXMgYXBwcm9wcmlhdGUuICBJZgorICAgICAgICAgICAgICogYWxwaGFfcmVtb3ZlZCB2YWx1ZSBpcyBzZXQgKG5vdCA0KSB0aGVuIGFsc28gZG8gdGhpcyBvbmx5IGlmIHRoZQorICAgICAgICAgICAgICogJ2EnIGFscGhhIGNoYW5uZWwgKGFscGhhX3JlbW92ZWQpIGlzIG9wYXF1ZTsgb25seSByZWxldmFudCBmb3IKKyAgICAgICAgICAgICAqIHRoZSA4LWJpdCBjYXNlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoZm9ybWF0YiAmIFBOR19GT1JNQVRfRkxBR19MSU5FQVIpIC8qIDE2LWJpdCBjaGVja3MgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19jb25zdF91aW50XzE2cCBwdWEgPSBhbGlnbmNhc3Rjb25zdChwbmdfY29uc3RfdWludF8xNnAsIHBzYSk7CisgICAgICAgICAgICAgICBwbmdfY29uc3RfdWludF8xNnAgcHViID0gYWxpZ25jYXN0Y29uc3QocG5nX2NvbnN0X3VpbnRfMTZwLCBwc2IpOworCisgICAgICAgICAgICAgICBzd2l0Y2ggKGJjaGFubmVscykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgIGlmIChwdWFbYnRvYVszXV0gIT0gcHViWzNdKSBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgIGlmIChwdWFbYnRvYVsyXV0gIT0gcHViWzJdKSBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgIGlmIChwdWFbYnRvYVsxXV0gIT0gcHViWzFdKSBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgIGlmIChwdWFbYnRvYVswXV0gIT0gcHViWzBdKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIGlmIChhbHBoYV9hZGRlZCAhPSA0ICYmIHB1YlthbHBoYV9hZGRlZF0gIT0gNjU1MzUpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8qIHggbG9vcCAqLworICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBpbXBvc3NpYmxlICovCisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsc2UgaWYgKGFscGhhX3JlbW92ZWQgPT0gNCB8fCBwc2FbYWxwaGFfcmVtb3ZlZF0gPT0gMjU1KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc3dpdGNoIChiY2hhbm5lbHMpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICBpZiAocHNhW2J0b2FbM11dICE9IHBzYlszXSkgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICBpZiAocHNhW2J0b2FbMl1dICE9IHBzYlsyXSkgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICBpZiAocHNhW2J0b2FbMV1dICE9IHBzYlsxXSkgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICBpZiAocHNhW2J0b2FbMF1dICE9IHBzYlswXSkgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICBpZiAoYWxwaGFfYWRkZWQgIT0gNCAmJiBwc2JbYWxwaGFfYWRkZWRdICE9IDI1NSkgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLyogeCBsb29wICovCisgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8qIGltcG9zc2libGUgKi8KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICAgLyogSWYgd2UgZ2V0IHRvIGhlcmUgdGhlIGZhc3QgbWF0Y2ggZmFpbGVkOyBkbyB0aGUgc2xvdyBtYXRjaCBmb3IgdGhpcworICAgICAgICAgICogcGl4ZWwuCisgICAgICAgICAgKi8KKyAgICAgICAgIGlmICghY21wcGl4ZWwoJnRyLCBwc2EsIHBzYiwgeCwgeSkgJiYgKGEtPm9wdHMgJiBLRUVQX0dPSU5HKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7IC8qIGVycm9yIGNhc2UgKi8KKyAgICAgIH0KKyAgIH0KKworICAgLyogSWYgcmVxZXN0ZWQgY29weSB0aGUgZXJyb3IgdmFsdWVzIGJhY2sgZnJvbSB0aGUgVHJhbnNmb3JtLiAqLworICAgaWYgKGEtPm9wdHMgJiBBQ0NVTVVMQVRFKQorICAgeworICAgICAgdHIuZXJyb3JfcHRyWzBdID0gdHIuZXJyb3JbMF07CisgICAgICB0ci5lcnJvcl9wdHJbMV0gPSB0ci5lcnJvclsxXTsKKyAgICAgIHRyLmVycm9yX3B0clsyXSA9IHRyLmVycm9yWzJdOworICAgICAgdHIuZXJyb3JfcHRyWzNdID0gdHIuZXJyb3JbM107CisgICB9CisKKyAgIHJldHVybiAxOworfQorCisvKiBSZWFkIHRoZSBmaWxlOyBob3cgdGhlIHJlYWQgZ2V0cyBkb25lIGRlcGVuZHMgb24gd2hpY2ggb2YgaW5wdXRfZmlsZSBhbmQKKyAqIGlucHV0X21lbW9yeSBoYXZlIGJlZW4gc2V0LgorICovCitzdGF0aWMgaW50CityZWFkX2ZpbGUoSW1hZ2UgKmltYWdlLCBwbmdfdWludF8zMiBmb3JtYXQsIHBuZ19jb25zdF9jb2xvcnAgYmFja2dyb3VuZCkKK3sKKyAgIG1lbXNldCgmaW1hZ2UtPmltYWdlLCAwLCBzaXplb2YgaW1hZ2UtPmltYWdlKTsKKyAgIGltYWdlLT5pbWFnZS52ZXJzaW9uID0gUE5HX0lNQUdFX1ZFUlNJT047CisKKyAgIGlmIChpbWFnZS0+aW5wdXRfbWVtb3J5ICE9IE5VTEwpCisgICB7CisgICAgICBpZiAoIXBuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fbWVtb3J5KCZpbWFnZS0+aW1hZ2UsIGltYWdlLT5pbnB1dF9tZW1vcnksCisgICAgICAgICBpbWFnZS0+aW5wdXRfbWVtb3J5X3NpemUpKQorICAgICAgICAgcmV0dXJuIGxvZ2Vycm9yKGltYWdlLCAibWVtb3J5IGluaXQ6ICIsIGltYWdlLT5maWxlX25hbWUsICIiKTsKKyAgIH0KKworIyAgaWZkZWYgUE5HX1NURElPX1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAoaW1hZ2UtPmlucHV0X2ZpbGUgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIGlmICghcG5nX2ltYWdlX2JlZ2luX3JlYWRfZnJvbV9zdGRpbygmaW1hZ2UtPmltYWdlLCBpbWFnZS0+aW5wdXRfZmlsZSkpCisgICAgICAgICAgICByZXR1cm4gbG9nZXJyb3IoaW1hZ2UsICJzdGRpbyBpbml0OiAiLCBpbWFnZS0+ZmlsZV9uYW1lLCAiIik7CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGlmICghcG5nX2ltYWdlX2JlZ2luX3JlYWRfZnJvbV9maWxlKCZpbWFnZS0+aW1hZ2UsIGltYWdlLT5maWxlX25hbWUpKQorICAgICAgICAgICAgcmV0dXJuIGxvZ2Vycm9yKGltYWdlLCAiZmlsZSBpbml0OiAiLCBpbWFnZS0+ZmlsZV9uYW1lLCAiIik7CisgICAgICB9CisjICBlbHNlCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICByZXR1cm4gbG9nZXJyb3IoaW1hZ2UsICJ1bnN1cHBvcnRlZCBmaWxlL3N0ZGlvIGluaXQ6ICIsCisgICAgICAgICAgICBpbWFnZS0+ZmlsZV9uYW1lLCAiIik7CisgICAgICB9CisjICBlbmRpZgorCisgICAvKiBUaGlzIG11c3QgYmUgc2V0IGFmdGVyIHRoZSBiZWdpbl9yZWFkIGNhbGw6ICovCisgICBpZiAoaW1hZ2UtPm9wdHMgJiBzUkdCXzE2QklUKQorICAgICAgaW1hZ2UtPmltYWdlLmZsYWdzIHw9IFBOR19JTUFHRV9GTEFHXzE2QklUX3NSR0I7CisKKyAgIC8qIEhhdmUgYW4gaW5pdGlhbGl6ZWQgaW1hZ2Ugd2l0aCBhbGwgdGhlIGRhdGEgd2UgbmVlZCBwbHVzLCBtYXliZSwgYW4KKyAgICAqIGFsbG9jYXRlZCBmaWxlIChteWZpbGUpIG9yIGJ1ZmZlciAobXlidWZmZXIpIHRoYXQgbmVlZCB0byBiZSBmcmVlZC4KKyAgICAqLworICAgeworICAgICAgaW50IHJlc3VsdDsKKyAgICAgIHBuZ191aW50XzMyIGltYWdlX2Zvcm1hdDsKKworICAgICAgLyogUHJpbnQgYm90aCBvcmlnaW5hbCBhbmQgb3V0cHV0IGZvcm1hdHMuICovCisgICAgICBpbWFnZV9mb3JtYXQgPSBpbWFnZS0+aW1hZ2UuZm9ybWF0OworCisgICAgICBpZiAoaW1hZ2UtPm9wdHMgJiBWRVJCT1NFKQorICAgICAgeworICAgICAgICAgcHJpbnRmKCIlcyAlbHUgeCAlbHUgJXMgLT4gJXMiLCBpbWFnZS0+ZmlsZV9uYW1lLAorICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpaW1hZ2UtPmltYWdlLndpZHRoLAorICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpaW1hZ2UtPmltYWdlLmhlaWdodCwKKyAgICAgICAgICAgIGZvcm1hdF9uYW1lc1tpbWFnZV9mb3JtYXQgJiBGT1JNQVRfTUFTS10sCisgICAgICAgICAgICAoZm9ybWF0ICYgRk9STUFUX05PX0NIQU5HRSkgIT0gMCB8fCBpbWFnZS0+aW1hZ2UuZm9ybWF0ID09IGZvcm1hdAorICAgICAgICAgICAgPyAibm8gY2hhbmdlIiA6IGZvcm1hdF9uYW1lc1tmb3JtYXQgJiBGT1JNQVRfTUFTS10pOworCisgICAgICAgICBpZiAoYmFja2dyb3VuZCAhPSBOVUxMKQorICAgICAgICAgICAgcHJpbnRmKCIgYmFja2dyb3VuZCglZCwlZCwlZClcbiIsIGJhY2tncm91bmQtPnJlZCwKKyAgICAgICAgICAgICAgIGJhY2tncm91bmQtPmdyZWVuLCBiYWNrZ3JvdW5kLT5ibHVlKTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKworICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICB9CisKKyAgICAgIC8qICdOT19DSEFOR0UnIGNvbWJpbmVkIHdpdGggdGhlIGNvbG9yLW1hcCBmbGFnIGZvcmNlcyB0aGUgYmFzZSBmb3JtYXQKKyAgICAgICAqIGZsYWdzIHRvIGJlIHNldCBvbiByZWFkIHRvIGVuc3VyZSB0aGF0IHRoZSBvcmlnaW5hbCByZXByZXNlbnRhdGlvbiBpcworICAgICAgICogbm90IGxvc3QgaW4gdGhlIHBhc3MgdGhyb3VnaCBhIGNvbG9ybWFwIGZvcm1hdC4KKyAgICAgICAqLworICAgICAgaWYgKChmb3JtYXQgJiBGT1JNQVRfTk9fQ0hBTkdFKSAhPSAwKQorICAgICAgeworICAgICAgICAgaWYgKChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQ09MT1JNQVApICE9IDAgJiYKKyAgICAgICAgICAgIChpbWFnZV9mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQ09MT1JNQVApICE9IDApCisgICAgICAgICAgICBmb3JtYXQgPSAoaW1hZ2VfZm9ybWF0ICYgfkJBU0VfRk9STUFUUykgfCAoZm9ybWF0ICYgQkFTRV9GT1JNQVRTKTsKKworICAgICAgICAgZWxzZQorICAgICAgICAgICAgZm9ybWF0ID0gaW1hZ2VfZm9ybWF0OworICAgICAgfQorCisgICAgICBpbWFnZS0+aW1hZ2UuZm9ybWF0ID0gZm9ybWF0OworCisgICAgICBpbWFnZS0+c3RyaWRlID0gUE5HX0lNQUdFX1JPV19TVFJJREUoaW1hZ2UtPmltYWdlKSArIGltYWdlLT5zdHJpZGVfZXh0cmE7CisgICAgICBhbGxvY2J1ZmZlcihpbWFnZSk7CisKKyAgICAgIHJlc3VsdCA9IHBuZ19pbWFnZV9maW5pc2hfcmVhZCgmaW1hZ2UtPmltYWdlLCBiYWNrZ3JvdW5kLAorICAgICAgICAgaW1hZ2UtPmJ1ZmZlcisxNiwgKHBuZ19pbnRfMzIpaW1hZ2UtPnN0cmlkZSwgaW1hZ2UtPmNvbG9ybWFwKTsKKworICAgICAgY2hlY2tidWZmZXIoaW1hZ2UsIGltYWdlLT5maWxlX25hbWUpOworCisgICAgICBpZiAocmVzdWx0KQorICAgICAgICAgcmV0dXJuIGNoZWNrb3BhcXVlKGltYWdlKTsKKworICAgICAgZWxzZQorICAgICAgICAgcmV0dXJuIGxvZ2Vycm9yKGltYWdlLCBpbWFnZS0+ZmlsZV9uYW1lLCAiOiBpbWFnZSByZWFkIGZhaWxlZCIsICIiKTsKKyAgIH0KK30KKworLyogUmVhZHMgZnJvbSBhIGZpbGVuYW1lLCB3aGljaCBtdXN0IGJlIGluIGltYWdlLT5maWxlX25hbWUsIGJ1dCB1c2VzCisgKiBpbWFnZS0+b3B0cyB0byBjaG9vc2UgdGhlIG1ldGhvZC4gIFRoZSBmaWxlIGlzIGFsd2F5cyByZWFkIGluIGl0cyBuYXRpdmUKKyAqIGZvcm1hdCAodGhlIG9uZSB0aGUgc2ltcGxpZmllZCBBUEkgc3VnZ2VzdHMpLgorICovCitzdGF0aWMgaW50CityZWFkX29uZV9maWxlKEltYWdlICppbWFnZSkKK3sKKyAgIGlmICghKGltYWdlLT5vcHRzICYgUkVBRF9GSUxFKSB8fCAoaW1hZ2UtPm9wdHMgJiBVU0VfU1RESU8pKQorICAgeworICAgICAgLyogbWVtb3J5IG9yIHN0ZGlvLiAqLworICAgICAgRklMRSAqZiA9IGZvcGVuKGltYWdlLT5maWxlX25hbWUsICJyYiIpOworCisgICAgICBpZiAoZiAhPSBOVUxMKQorICAgICAgeworICAgICAgICAgaWYgKGltYWdlLT5vcHRzICYgUkVBRF9GSUxFKQorICAgICAgICAgICAgaW1hZ2UtPmlucHV0X2ZpbGUgPSBmOworCisgICAgICAgICBlbHNlIC8qIG1lbW9yeSAqLworICAgICAgICAgeworICAgICAgICAgICAgaWYgKGZzZWVrKGYsIDAsIFNFRUtfRU5EKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgbG9uZyBpbnQgY2IgPSBmdGVsbChmKTsKKworICAgICAgICAgICAgICAgaWYgKGNiID4gMCkKKyAgICAgICAgICAgICAgIHsKKyNpZm5kZWYgX19DT1ZFUklUWV9fCisgICAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkIGxvbmcgaW50KWNiIDw9IChzaXplX3QpfihzaXplX3QpMCkKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgcG5nX2J5dGVwIGIgPSB2b2lkY2FzdChwbmdfYnl0ZXAsIG1hbGxvYygoc2l6ZV90KWNiKSk7CisKKyAgICAgICAgICAgICAgICAgICAgIGlmIChiICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXdpbmQoZik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcmVhZChiLCAoc2l6ZV90KWNiLCAxLCBmKSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNsb3NlKGYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UtPmlucHV0X21lbW9yeV9zaXplID0gY2I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS0+aW5wdXRfbWVtb3J5ID0gYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2djbG9zZShpbWFnZSwgZiwgaW1hZ2UtPmZpbGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IHJlYWQgZmFpbGVkOiAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2Nsb3NlKGltYWdlLCBmLCBpbWFnZS0+ZmlsZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIjogb3V0IG9mIG1lbW9yeTogIik7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2djbG9zZShpbWFnZSwgZiwgaW1hZ2UtPmZpbGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICI6IGZpbGUgdG9vIGJpZyBmb3IgdGhpcyBhcmNoaXRlY3R1cmU6ICIpOworICAgICAgICAgICAgICAgICAgICAgLyogY2IgaXMgdGhlIGxlbmd0aCBvZiB0aGUgZmlsZSBhcyBhIChsb25nKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAqIHRoaXMgaXMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIGFtb3VudCBvZgorICAgICAgICAgICAgICAgICAgICAgICogbWVtb3J5IHRoYXQgY2FuIGJlIHJlcXVlc3RlZCBmcm9tIG1hbGxvYy4KKyAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBlbHNlIGlmIChjYiA9PSAwKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2Nsb3NlKGltYWdlLCBmLCBpbWFnZS0+ZmlsZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIjogemVybyBsZW5ndGg6ICIpOworCisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICByZXR1cm4gbG9nY2xvc2UoaW1hZ2UsIGYsIGltYWdlLT5maWxlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAiOiB0ZWxsIGZhaWxlZDogIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHJldHVybiBsb2djbG9zZShpbWFnZSwgZiwgaW1hZ2UtPmZpbGVfbmFtZSwgIjogc2VlayBmYWlsZWQ6ICIpOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBlbHNlCisgICAgICAgICByZXR1cm4gbG9nZXJyb3IoaW1hZ2UsIGltYWdlLT5maWxlX25hbWUsICI6IG9wZW4gZmFpbGVkOiAiLAorICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgIH0KKworICAgcmV0dXJuIHJlYWRfZmlsZShpbWFnZSwgRk9STUFUX05PX0NIQU5HRSwgTlVMTCk7Cit9CisKKyNpZmRlZiBQTkdfU0lNUExJRklFRF9XUklURV9TVVBQT1JURUQKK3N0YXRpYyBpbnQKK3dyaXRlX29uZV9maWxlKEltYWdlICpvdXRwdXQsIEltYWdlICppbWFnZSwgaW50IGNvbnZlcnRfdG9fOGJpdCkKK3sKKyAgIGlmIChpbWFnZS0+b3B0cyAmIEZBU1RfV1JJVEUpCisgICAgICBpbWFnZS0+aW1hZ2UuZmxhZ3MgfD0gUE5HX0lNQUdFX0ZMQUdfRkFTVDsKKworICAgaWYgKGltYWdlLT5vcHRzICYgVVNFX1NURElPKQorICAgeworI2lmbmRlZiBQTkdfVVNFX01LU1RFTVAKKyAgICAgIEZJTEUgKmYgPSB0bXBmaWxlKCk7CisjZWxzZQorICAgICAgLyogRXhwZXJpbWVudGFsLiBDb3Zlcml0eSBzYXlzIHRtcGZpbGUoKSBpcyBpbnNlY3VyZSBiZWNhdXNlIGl0CisgICAgICAgKiBnZW5lcmF0ZXMgcHJlZGljdGFibGUgbmFtZXMuCisgICAgICAgKgorICAgICAgICogSXQgaXMgcG9zc2libGUgdG8gc2F0aXNmeSBDb3Zlcml0eSBieSB1c2luZyBta3N0ZW1wKCk7IGhvd2V2ZXIsCisgICAgICAgKiBhbnkgcGxhdGZvcm0gc3VwcG9ydGluZyBta3N0ZW1wKCkgdW5kb3VidGVkbHkgaGFzIGEgc2VjdXJlIHRtcGZpbGUoKQorICAgICAgICogaW1wbGVtZW50YXRpb24gYXMgd2VsbCwgYW5kIGRvZXNuJ3QgbmVlZCB0aGUgZml4LiAgTm90ZSB0aGF0CisgICAgICAgKiB0aGUgZml4IHdvbid0IHdvcmsgb24gcGxhdGZvcm1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCBta3N0ZW1wKCkuCisgICAgICAgKgorICAgICAgICogaHR0cHM6Ly93d3cuc2VjdXJlY29kaW5nLmNlcnQub3JnL2NvbmZsdWVuY2UvZGlzcGxheS9jLworICAgICAgICogRklPMjEtQy4rRG8rbm90K2NyZWF0ZSt0ZW1wb3JhcnkrZmlsZXMraW4rc2hhcmVkK2RpcmVjdG9yaWVzCisgICAgICAgKiBzYXlzIHRoYXQgbW9zdCBoaXN0b3JpYyBpbXBsZW1lbnRhdGlvbnMgb2YgdG1wZmlsZSgpIHByb3ZpZGUKKyAgICAgICAqIG9ubHkgYSBsaW1pdGVkIG51bWJlciBvZiBwb3NzaWJsZSB0ZW1wb3JhcnkgZmlsZSBuYW1lcworICAgICAgICogKHVzdWFsbHkgMjYpIGJlZm9yZSBmaWxlIG5hbWVzIGFyZSByZWN5Y2xlZC4gVGhhdCBhcnRpY2xlIGFsc28KKyAgICAgICAqIHByb3ZpZGVzIGEgc2VjdXJlIHNvbHV0aW9uIHRoYXQgdW5mb3J0dW5hdGVseSBkZXBlbmRzIHVwb24gbWtzdGVtcCgpLgorICAgICAgICovCisgICAgICBjaGFyIHRtcGZpbGVbXSA9ICJwbmdzdGVzdC1YWFhYWFgiOworICAgICAgaW50IGZpbGVkZXM7CisgICAgICBGSUxFICpmOworICAgICAgdW1hc2soMDE3Nyk7CisgICAgICBmaWxlZGVzID0gbWtzdGVtcCh0bXBmaWxlKTsKKyAgICAgIGlmIChmaWxlZGVzIDwgMCkKKyAgICAgICAgZiA9IE5VTEw7CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGYgPSBmZG9wZW4oZmlsZWRlcywidysiKTsKKyAgICAgICAgLyogSGlkZSB0aGUgZmlsZW5hbWUgaW1tZWRpYXRlbHkgYW5kIGVuc3VyZSB0aGF0IHRoZSBmaWxlIGRvZXMKKyAgICAgICAgICogbm90IGV4aXN0IGFmdGVyIHRoZSBwcm9ncmFtIGVuZHMKKyAgICAgICAgICovCisgICAgICAgICh2b2lkKSB1bmxpbmsodG1wZmlsZSk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgaWYgKGYgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIGlmIChwbmdfaW1hZ2Vfd3JpdGVfdG9fc3RkaW8oJmltYWdlLT5pbWFnZSwgZiwgY29udmVydF90b184Yml0LAorICAgICAgICAgICAgaW1hZ2UtPmJ1ZmZlcisxNiwgKHBuZ19pbnRfMzIpaW1hZ2UtPnN0cmlkZSwgaW1hZ2UtPmNvbG9ybWFwKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmZmx1c2goZikgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHJld2luZChmKTsKKyAgICAgICAgICAgICAgIGluaXRpbWFnZShvdXRwdXQsIGltYWdlLT5vcHRzLCAidG1wZmlsZSIsIGltYWdlLT5zdHJpZGVfZXh0cmEpOworICAgICAgICAgICAgICAgb3V0cHV0LT5pbnB1dF9maWxlID0gZjsKKyAgICAgICAgICAgICAgIGlmICghY2hlY2tvcGFxdWUoaW1hZ2UpKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHJldHVybiBsb2djbG9zZShpbWFnZSwgZiwgInRtcGZpbGUiLCAiOiBmbHVzaDogIik7CisgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGZjbG9zZShmKTsKKyAgICAgICAgICAgIHJldHVybiBsb2dlcnJvcihpbWFnZSwgInRtcGZpbGUiLCAiOiB3cml0ZSBmYWlsZWQiLCAiIik7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgICAgIHJldHVybiBsb2dlcnJvcihpbWFnZSwgInRtcGZpbGUiLCAiOiBvcGVuOiAiLCBzdHJlcnJvcihlcnJubykpOworICAgfQorCisgICBlbHNlCisgICB7CisgICAgICBzdGF0aWMgaW50IGNvdW50ZXIgPSAwOworICAgICAgY2hhciBuYW1lWzMyXTsKKworICAgICAgc3ByaW50ZihuYW1lLCAiJXMlZC5wbmciLCB0bXBmLCArK2NvdW50ZXIpOworCisgICAgICBpZiAocG5nX2ltYWdlX3dyaXRlX3RvX2ZpbGUoJmltYWdlLT5pbWFnZSwgbmFtZSwgY29udmVydF90b184Yml0LAorICAgICAgICAgaW1hZ2UtPmJ1ZmZlcisxNiwgKHBuZ19pbnRfMzIpaW1hZ2UtPnN0cmlkZSwgaW1hZ2UtPmNvbG9ybWFwKSkKKyAgICAgIHsKKyAgICAgICAgIGluaXRpbWFnZShvdXRwdXQsIGltYWdlLT5vcHRzLCBvdXRwdXQtPnRtcGZpbGVfbmFtZSwKKyAgICAgICAgICAgIGltYWdlLT5zdHJpZGVfZXh0cmEpOworICAgICAgICAgLyogQWZ0ZXJ3YXJkcywgb3IgZnJlZWltYWdlIHdpbGwgZGVsZXRlIGl0ISAqLworICAgICAgICAgc3RyY3B5KG91dHB1dC0+dG1wZmlsZV9uYW1lLCBuYW1lKTsKKworICAgICAgICAgaWYgKCFjaGVja29wYXF1ZShpbWFnZSkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgICAgcmV0dXJuIGxvZ2Vycm9yKGltYWdlLCBuYW1lLCAiOiB3cml0ZSBmYWlsZWQiLCAiIik7CisgICB9CisKKyAgIC8qICdvdXRwdXQnIGhhcyBhbiBpbml0aWFsaXplZCB0ZW1wb3JhcnkgaW1hZ2UsIHJlYWQgdGhpcyBiYWNrIGluIGFuZCBjb21wYXJlCisgICAgKiB0aGlzIGFnYWluc3QgdGhlIG9yaWdpbmFsOiB0aGVyZSBzaG91bGQgYmUgbm8gY2hhbmdlIHNpbmNlIHRoZSBvcmlnaW5hbAorICAgICogZm9ybWF0IHdhcyB3cml0dGVuIHVubW9kaWZpZWQgdW5sZXNzICdjb252ZXJ0X3RvXzhiaXQnIHdhcyBzcGVjaWZpZWQuCisgICAgKiBIb3dldmVyLCBpZiB0aGUgb3JpZ2luYWwgaW1hZ2Ugd2FzIGNvbG9yLW1hcHBlZCwgYSBzaW1wbGUgcmVhZCB3aWxsIHphcAorICAgICogdGhlIGxpbmVhciwgY29sb3IgYW5kIG1heWJlIGFscGhhIGZsYWdzLCB0aGlzIHdpbGwgY2F1c2Ugc3B1cmlvdXMgZmFpbHVyZXMKKyAgICAqIHVuZGVyIHNvbWUgY2lyY3Vtc3RhbmNlcy4KKyAgICAqLworICAgaWYgKHJlYWRfZmlsZShvdXRwdXQsIGltYWdlLT5pbWFnZS5mb3JtYXQgfCBGT1JNQVRfTk9fQ0hBTkdFLCBOVUxMKSkKKyAgIHsKKyAgICAgIHBuZ191aW50XzMyIG9yaWdpbmFsX2Zvcm1hdCA9IGltYWdlLT5pbWFnZS5mb3JtYXQ7CisKKyAgICAgIGlmIChjb252ZXJ0X3RvXzhiaXQpCisgICAgICAgICBvcmlnaW5hbF9mb3JtYXQgJj0gflBOR19GT1JNQVRfRkxBR19MSU5FQVI7CisKKyAgICAgIGlmICgob3V0cHV0LT5pbWFnZS5mb3JtYXQgJiBCQVNFX0ZPUk1BVFMpICE9CisgICAgICAgICAob3JpZ2luYWxfZm9ybWF0ICYgQkFTRV9GT1JNQVRTKSkKKyAgICAgICAgIHJldHVybiBsb2dlcnJvcihpbWFnZSwgaW1hZ2UtPmZpbGVfbmFtZSwgIjogZm9ybWF0IGNoYW5nZWQgb24gcmVhZDogIiwKKyAgICAgICAgICAgIG91dHB1dC0+ZmlsZV9uYW1lKTsKKworICAgICAgcmV0dXJuIGNvbXBhcmVfdHdvX2ltYWdlcyhpbWFnZSwgb3V0cHV0LCAwLyp2aWEgbGluZWFyKi8sIE5VTEwpOworICAgfQorCisgICBlbHNlCisgICAgICByZXR1cm4gbG9nZXJyb3Iob3V0cHV0LCBvdXRwdXQtPnRtcGZpbGVfbmFtZSwKKyAgICAgICAgICI6IHJlYWQgb2YgbmV3IGZpbGUgZmFpbGVkIiwgIiIpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK3Rlc3RpbWFnZShJbWFnZSAqaW1hZ2UsIHBuZ191aW50XzMyIG9wdHMsIGZvcm1hdF9saXN0ICpwZikKK3sKKyAgIGludCByZXN1bHQ7CisgICBJbWFnZSBjb3B5OworCisgICAvKiBDb3B5IHRoZSBvcmlnaW5hbCBkYXRhLCBzdGVhbGluZyBpdCBmcm9tICdpbWFnZScgKi8KKyAgIGNoZWNrb3BhcXVlKGltYWdlKTsKKyAgIGNvcHkgPSAqaW1hZ2U7CisKKyAgIGNvcHkub3B0cyA9IG9wdHM7CisgICBjb3B5LmJ1ZmZlciA9IE5VTEw7CisgICBjb3B5LmJ1ZnNpemUgPSAwOworICAgY29weS5hbGxvY3NpemUgPSAwOworCisgICBpbWFnZS0+aW5wdXRfZmlsZSA9IE5VTEw7CisgICBpbWFnZS0+aW5wdXRfbWVtb3J5ID0gTlVMTDsKKyAgIGltYWdlLT5pbnB1dF9tZW1vcnlfc2l6ZSA9IDA7CisgICBpbWFnZS0+dG1wZmlsZV9uYW1lWzBdID0gMDsKKworICAgeworICAgICAgcG5nX3VpbnRfMzIgY291bnRlcjsKKyAgICAgIEltYWdlIG91dHB1dDsKKworICAgICAgbmV3aW1hZ2UoJm91dHB1dCk7CisKKyAgICAgIHJlc3VsdCA9IDE7CisKKyAgICAgIC8qIFVzZSB0aGUgbG93IGJpdCBvZiAnY291bnRlcicgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdG8gZG8gYWxwaGEKKyAgICAgICAqIHJlbW92YWwgd2l0aCBhIGJhY2tncm91bmQgY29sb3Igb3IgYnkgY29tcG9zdGluZyBvbnRvIHRoZSBpbWFnZTsgdGhpcworICAgICAgICogc3RlcCBnZXRzIHNraXBwZWQgaWYgaXQgaXNuJ3QgcmVsZXZhbnQKKyAgICAgICAqLworICAgICAgZm9yIChjb3VudGVyPTA7IGNvdW50ZXI8MipGT1JNQVRfQ09VTlQ7ICsrY291bnRlcikKKyAgICAgICAgIGlmIChmb3JtYXRfaXNzZXQocGYsIGNvdW50ZXIgPj4gMSkpCisgICAgICB7CisgICAgICAgICBwbmdfdWludF8zMiBmb3JtYXQgPSBjb3VudGVyID4+IDE7CisKKyAgICAgICAgIHBuZ19jb2xvciBiYWNrZ3JvdW5kX2NvbG9yOworICAgICAgICAgcG5nX2NvbG9ycCBiYWNrZ3JvdW5kID0gTlVMTDsKKworICAgICAgICAgLyogSWYgdGhlcmUgaXMgYSBmb3JtYXQgY2hhbmdlIHRoYXQgcmVtb3ZlcyB0aGUgYWxwaGEgY2hhbm5lbCB0aGVuCisgICAgICAgICAgKiB0aGUgYmFja2dyb3VuZCBpcyByZWxldmFudC4gIElmIHRoZSBvdXRwdXQgaXMgOC1iaXQgY29sb3ItbWFwcGVkCisgICAgICAgICAgKiB0aGVuIGEgYmFja2dyb3VuZCBjb2xvciAqbXVzdCogYmUgcHJvdmlkZWQsIG90aGVyd2lzZSB0aGVyZSBhcmUKKyAgICAgICAgICAqIHR3byB0ZXN0cyB0byBkbyAtIG9uZSB3aXRoIGEgY29sb3IsIHRoZSBvdGhlciB3aXRoIE5VTEwuICBUaGUKKyAgICAgICAgICAqIE5VTEwgdGVzdCBoYXBwZW5zIHNlY29uZC4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKChjb3VudGVyICYgMSkgPT0gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FMUEhBKSA9PSAwICYmCisgICAgICAgICAgICAgICAoaW1hZ2UtPmltYWdlLmZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BTFBIQSkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8qIEFscGhhL3RyYW5zcGFyZW5jeSB3aWxsIGJlIHJlbW92ZWQsIHRoZSBiYWNrZ3JvdW5kIGlzCisgICAgICAgICAgICAgICAgKiByZWxldmFudDogbWFrZSBpdCBhIGNvbG9yIHRoZSBmaXJzdCB0aW1lCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIHJhbmRvbV9jb2xvcigmYmFja2dyb3VuZF9jb2xvcik7CisgICAgICAgICAgICAgICBiYWNrZ3JvdW5kID0gJmJhY2tncm91bmRfY29sb3I7CisKKyAgICAgICAgICAgICAgIC8qIEJVVCBpZiB0aGUgb3V0cHV0IGlzIHRvIGEgY29sb3ItbWFwcGVkIDgtYml0IGZvcm1hdCB0aGVuCisgICAgICAgICAgICAgICAgKiB0aGUgYmFja2dyb3VuZCBtdXN0IGFsd2F5cyBiZSBhIGNvbG9yLCBzbyBpbmNyZW1lbnQgJ2NvdW50ZXInCisgICAgICAgICAgICAgICAgKiB0byBza2lwIHRoZSBOVUxMIHRlc3QuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIGlmICgoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQKSAhPSAwICYmCisgICAgICAgICAgICAgICAgICAoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0xJTkVBUikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICsrY291bnRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogT3RoZXJ3aXNlIGFuIGFscGhhIGNoYW5uZWwgaXMgbm90IGJlaW5nIGVsaW1pbmF0ZWQsIGp1c3QgbGVhdmUKKyAgICAgICAgICAgICAqIGJhY2tncm91bmQgTlVMTCBhbmQgc2tpcCB0aGUgKGNvdW50ZXIgJiAxKSBOVUxMIHRlc3QuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICsrY291bnRlcjsKKyAgICAgICAgIH0KKyAgICAgICAgIC8qIGVsc2UganVzdCB1c2UgTlVMTCBmb3IgYmFja2dyb3VuZCAqLworCisgICAgICAgICByZXNldGltYWdlKCZjb3B5KTsKKyAgICAgICAgIGNvcHkub3B0cyA9IG9wdHM7IC8qIGluIGNhc2UgcmVhZF9maWxlIG5lZWRzIHRvIGNoYW5nZSBpdCAqLworCisgICAgICAgICByZXN1bHQgPSByZWFkX2ZpbGUoJmNvcHksIGZvcm1hdCwgYmFja2dyb3VuZCk7CisgICAgICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAvKiBNYWtlIHN1cmUgdGhlIGZpbGUganVzdCByZWFkIG1hdGNoZXMgdGhlIG9yaWdpbmFsIGZpbGUuICovCisgICAgICAgICByZXN1bHQgPSBjb21wYXJlX3R3b19pbWFnZXMoaW1hZ2UsICZjb3B5LCAwLyp2aWEgbGluZWFyKi8sIGJhY2tncm91bmQpOworICAgICAgICAgaWYgKCFyZXN1bHQpCisgICAgICAgICAgICBicmVhazsKKworIyAgICAgICAgaWZkZWYgUE5HX1NJTVBMSUZJRURfV1JJVEVfU1VQUE9SVEVECisgICAgICAgICAgICAvKiBXcml0ZSB0aGUgKmNvcHkqIGp1c3QgbWFkZSB0byBhIG5ldyBmaWxlIHRvIG1ha2Ugc3VyZSB0aGUgd3JpdGUKKyAgICAgICAgICAgICAqIHNpZGUgd29ya3Mgb2suICBDaGVjayB0aGUgY29udmVyc2lvbiB0byBzUkdCIGlmIHRoZSBjb3B5IGlzCisgICAgICAgICAgICAgKiBsaW5lYXIuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG91dHB1dC5vcHRzID0gb3B0czsKKyAgICAgICAgICAgIHJlc3VsdCA9IHdyaXRlX29uZV9maWxlKCZvdXRwdXQsICZjb3B5LCAwLypjb252ZXJ0IHRvIDhiaXQqLyk7CisgICAgICAgICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvKiBWYWxpZGF0ZSBhZ2FpbnN0IHRoZSBvcmlnaW5hbCB0b287IHRoZSBiYWNrZ3JvdW5kIGlzIG5lZWRlZCBoZXJlCisgICAgICAgICAgICAgKiBhcyB3ZWxsIHNvIHRoYXQgY29tcGFyZV90d29faW1hZ2VzIGtub3dzIHdoYXQgY29sb3Igd2FzIHVzZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJlc3VsdCA9IGNvbXBhcmVfdHdvX2ltYWdlcyhpbWFnZSwgJm91dHB1dCwgMCwgYmFja2dyb3VuZCk7CisgICAgICAgICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBpZiAoKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19MSU5FQVIpICE9IDAgJiYKKyAgICAgICAgICAgICAgIChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQ09MT1JNQVApID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvKiAnb3V0cHV0JyBpcyBsaW5lYXIsIGNvbnZlcnQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgc1JHQiBmb3JtYXQuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIG91dHB1dC5vcHRzID0gb3B0czsKKyAgICAgICAgICAgICAgIHJlc3VsdCA9IHdyaXRlX29uZV9maWxlKCZvdXRwdXQsICZjb3B5LCAxLypjb252ZXJ0IHRvIDhiaXQqLyk7CisgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAvKiBUaGlzIG1heSBpbnZvbHZlIGEgY29udmVyc2lvbiB2aWEgbGluZWFyOyBpbiB0aGUgaWRlYWwgd29ybGQKKyAgICAgICAgICAgICAgICAqIHRoaXMgd291bGQgcm91bmQtdHJpcCBjb3JyZWN0bHksIGJ1dCBsaWJwbmcgMS41LjcgaXMgbm90IHRoZQorICAgICAgICAgICAgICAgICogaWRlYWwgd29ybGQgc28gYWxsb3cgYSBkcmlmdCAoZXJyb3JfdmlhX2xpbmVhcikuCisgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICogJ2ltYWdlJyBoYXMgYW4gYWxwaGEgY2hhbm5lbCBidXQgJ291dHB1dCcgZG9lcyBub3QgdGhlbiB0aGVyZQorICAgICAgICAgICAgICAgICogd2lsbCBhIHN0cmlwLWFscGhhLWNoYW5uZWwgb3BlcmF0aW9uIChiZWNhdXNlICdvdXRwdXQnIGlzCisgICAgICAgICAgICAgICAgKiBsaW5lYXIpLCBoYW5kbGUgdGhpcyBieSBjb21wb3Npbmcgb24gYmxhY2sgd2hlbiBkb2luZyB0aGUKKyAgICAgICAgICAgICAgICAqIGNvbXBhcmlzb24uCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbXBhcmVfdHdvX2ltYWdlcyhpbWFnZSwgJm91dHB1dCwgMS8qdmlhX2xpbmVhciovLAorICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZCk7CisgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorIyAgICAgICAgZW5kaWYgLyogUE5HX1NJTVBMSUZJRURfV1JJVEVfU1VQUE9SVEVEICovCisgICAgICB9CisKKyAgICAgIGZyZWVpbWFnZSgmb3V0cHV0KTsKKyAgIH0KKworICAgZnJlZWltYWdlKCZjb3B5KTsKKworICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludAordGVzdF9vbmVfZmlsZShjb25zdCBjaGFyICpmaWxlX25hbWUsIGZvcm1hdF9saXN0ICpmb3JtYXRzLCBwbmdfdWludF8zMiBvcHRzLAorICAgaW50IHN0cmlkZV9leHRyYSwgaW50IGxvZ19wYXNzKQoreworICAgaW50IHJlc3VsdDsKKyAgIEltYWdlIGltYWdlOworCisgICBuZXdpbWFnZSgmaW1hZ2UpOworICAgaW5pdGltYWdlKCZpbWFnZSwgb3B0cywgZmlsZV9uYW1lLCBzdHJpZGVfZXh0cmEpOworICAgcmVzdWx0ID0gcmVhZF9vbmVfZmlsZSgmaW1hZ2UpOworICAgaWYgKHJlc3VsdCkKKyAgICAgIHJlc3VsdCA9IHRlc3RpbWFnZSgmaW1hZ2UsIG9wdHMsIGZvcm1hdHMpOworICAgZnJlZWltYWdlKCZpbWFnZSk7CisKKyAgIC8qIEVuc3VyZSB0aGF0IHN0ZGVyciBpcyBmbHVzaGVkIGludG8gYW55IGxvZyBmaWxlICovCisgICBmZmx1c2goc3RkZXJyKTsKKworICAgaWYgKGxvZ19wYXNzKQorICAgeworICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgIHByaW50ZigiUEFTUzoiKTsKKworICAgICAgZWxzZQorICAgICAgICAgcHJpbnRmKCJGQUlMOiIpOworCisjICAgICBpZm5kZWYgUE5HX1NJTVBMSUZJRURfV1JJVEVfU1VQUE9SVEVECisgICAgICAgICBwcmludGYoIiAobm8gd3JpdGUpIik7CisjICAgICBlbmRpZgorCisgICAgICBwcmludF9vcHRzKG9wdHMpOworICAgICAgcHJpbnRmKCIgJXNcbiIsIGZpbGVfbmFtZSk7CisgICAgICAvKiBzdGRvdXQgbWF5IG5vdCBiZSBsaW5lLWJ1ZmZlcmVkIGlmIGl0IGlzIHBpcGVkIHRvIGEgZmlsZSwgc286ICovCisgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgIH0KKworICAgZWxzZSBpZiAoIXJlc3VsdCkKKyAgICAgIGV4aXQoMSk7CisKKyAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICBwbmdfdWludF8zMiBvcHRzID0gRkFTVF9XUklURTsKKyAgIGZvcm1hdF9saXN0IGZvcm1hdHM7CisgICBjb25zdCBjaGFyICp0b3VjaCA9IE5VTEw7CisgICBpbnQgbG9nX3Bhc3MgPSAwOworICAgaW50IHJlZHVuZGFudCA9IDA7CisgICBpbnQgc3RyaWRlX2V4dHJhID0gMDsKKyAgIGludCByZXR2YWwgPSAwOworICAgaW50IGM7CisKKyAgIGluaXRfc1JHQl90b19kKCk7CisjaWYgMAorICAgaW5pdF9lcnJvcl92aWFfbGluZWFyKCk7CisjZW5kaWYKKyAgIGZvcm1hdF9pbml0KCZmb3JtYXRzKTsKKworICAgZm9yIChjPTE7IGM8YXJnYzsgKytjKQorICAgeworICAgICAgY29uc3QgY2hhciAqYXJnID0gYXJndltjXTsKKworICAgICAgaWYgKHN0cmNtcChhcmcsICItLWxvZyIpID09IDApCisgICAgICAgICBsb2dfcGFzcyA9IDE7CisgICAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLS1mcmVzaCIpID09IDApCisgICAgICB7CisgICAgICAgICBtZW1zZXQoZ3BjX2Vycm9yLCAwLCBzaXplb2YgZ3BjX2Vycm9yKTsKKyAgICAgICAgIG1lbXNldChncGNfZXJyb3JfdmlhX2xpbmVhciwgMCwgc2l6ZW9mIGdwY19lcnJvcl92aWFfbGluZWFyKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICItLWZpbGUiKSA9PSAwKQorIyAgICAgICAgaWZkZWYgUE5HX1NURElPX1NVUFBPUlRFRAorICAgICAgICAgICAgb3B0cyB8PSBSRUFEX0ZJTEU7CisjICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gNzc7IC8qIHNraXBwZWQ6IG5vIHN1cHBvcnQgKi8KKyMgICAgICAgIGVuZGlmCisgICAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLS1tZW1vcnkiKSA9PSAwKQorICAgICAgICAgb3B0cyAmPSB+UkVBRF9GSUxFOworICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIi0tc3RkaW8iKSA9PSAwKQorIyAgICAgICAgaWZkZWYgUE5HX1NURElPX1NVUFBPUlRFRAorICAgICAgICAgICAgb3B0cyB8PSBVU0VfU1RESU87CisjICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gNzc7IC8qIHNraXBwZWQ6IG5vIHN1cHBvcnQgKi8KKyMgICAgICAgIGVuZGlmCisgICAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLS1uYW1lIikgPT0gMCkKKyAgICAgICAgIG9wdHMgJj0gflVTRV9TVERJTzsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICItLXZlcmJvc2UiKSA9PSAwKQorICAgICAgICAgb3B0cyB8PSBWRVJCT1NFOworICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIi0tcXVpZXQiKSA9PSAwKQorICAgICAgICAgb3B0cyAmPSB+VkVSQk9TRTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICItLXByZXNlcnZlIikgPT0gMCkKKyAgICAgICAgIG9wdHMgfD0gS0VFUF9UTVBGSUxFUzsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICItLW5vcHJlc2VydmUiKSA9PSAwKQorICAgICAgICAgb3B0cyAmPSB+S0VFUF9UTVBGSUxFUzsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICItLWtlZXAtZ29pbmciKSA9PSAwKQorICAgICAgICAgb3B0cyB8PSBLRUVQX0dPSU5HOworICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIi0tZmFzdCIpID09IDApCisgICAgICAgICBvcHRzIHw9IEZBU1RfV1JJVEU7CisgICAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLS1zbG93IikgPT0gMCkKKyAgICAgICAgIG9wdHMgJj0gfkZBU1RfV1JJVEU7CisgICAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLS1hY2N1bXVsYXRlIikgPT0gMCkKKyAgICAgICAgIG9wdHMgfD0gQUNDVU1VTEFURTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICItLXJlZHVuZGFudCIpID09IDApCisgICAgICAgICByZWR1bmRhbnQgPSAxOworICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIi0tc3RvcCIpID09IDApCisgICAgICAgICBvcHRzICY9IH5LRUVQX0dPSU5HOworICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIi0tc3RyaWN0IikgPT0gMCkKKyAgICAgICAgIG9wdHMgfD0gU1RSSUNUOworICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIi0tc1JHQi0xNmJpdCIpID09IDApCisgICAgICAgICBvcHRzIHw9IHNSR0JfMTZCSVQ7CisgICAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLS1saW5lYXItMTZiaXQiKSA9PSAwKQorICAgICAgICAgb3B0cyAmPSB+c1JHQl8xNkJJVDsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICItLXRtcGZpbGUiKSA9PSAwKQorICAgICAgeworICAgICAgICAgaWYgKGMrMSA8IGFyZ2MpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RybGVuKGFyZ3ZbKytjXSkgPj0gc2l6ZW9mIHRtcGYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICVzIGlzIHRvbyBsb25nIGZvciBhIHRlbXAgZmlsZSBwcmVmaXhcbiIsCisgICAgICAgICAgICAgICAgICBhcmd2WzBdLCBhcmd2W2NdKTsKKyAgICAgICAgICAgICAgIGV4aXQoOTkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBTYWZlOiBjaGVja2VkIGFib3ZlICovCisgICAgICAgICAgICBzdHJuY3B5KHRtcGYsIGFyZ3ZbY10sIHNpemVvZiAodG1wZiktMSk7CisgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogJXMgcmVxdWlyZXMgYSB0ZW1wb3JhcnkgZmlsZSBwcmVmaXhcbiIsCisgICAgICAgICAgICAgICBhcmd2WzBdLCBhcmcpOworICAgICAgICAgICAgZXhpdCg5OSk7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLS10b3VjaCIpID09IDApCisgICAgICB7CisgICAgICAgICBpZiAoYysxIDwgYXJnYykKKyAgICAgICAgICAgIHRvdWNoID0gYXJndlsrK2NdOworCisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICVzIHJlcXVpcmVzIGEgZmlsZSBuYW1lIGFyZ3VtZW50XG4iLAorICAgICAgICAgICAgICAgYXJndlswXSwgYXJnKTsKKyAgICAgICAgICAgIGV4aXQoOTkpOworICAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSBpZiAoYXJnWzBdID09ICcrJykKKyAgICAgIHsKKyAgICAgICAgIHBuZ191aW50XzMyIGZvcm1hdCA9IGZvcm1hdG9mKGFyZysxKTsKKworICAgICAgICAgaWYgKGZvcm1hdCA+IEZPUk1BVF9DT1VOVCkKKyAgICAgICAgICAgIGV4aXQoOTkpOworCisgICAgICAgICBmb3JtYXRfc2V0KCZmb3JtYXRzLCBmb3JtYXQpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoYXJnWzBdID09ICctJyAmJiBhcmdbMV0gIT0gMCAmJiAoYXJnWzFdICE9ICcwJyB8fCBhcmdbMl0gIT0gMCkpCisgICAgICB7CisgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHVua25vd24gb3B0aW9uOiAlc1xuIiwgYXJndlswXSwgYXJnKTsKKyAgICAgICAgIGV4aXQoOTkpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgaWYgKGZvcm1hdF9pc19pbml0aWFsKCZmb3JtYXRzKSkKKyAgICAgICAgICAgIGZvcm1hdF9kZWZhdWx0KCZmb3JtYXRzLCByZWR1bmRhbnQpOworCisgICAgICAgICBpZiAoYXJnWzBdID09ICctJykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB0ZXJtID0gKGFyZ1sxXSA9PSAnMCcgPyAwIDogJ1xuJyk7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaWNoID0gMDsKKworICAgICAgICAgICAgLyogTG9vcCByZWFkaW5nIGZpbGVzLCB1c2UgYSBzdGF0aWMgYnVmZmVyIHRvIHNpbXBsaWZ5IHRoaXMgYW5kIGp1c3QKKyAgICAgICAgICAgICAqIHN0b3AgaWYgdGhlIG5hbWUgZ2V0cyB0byBsb25nLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzdGF0aWMgY2hhciBidWZmZXJbNDA5Nl07CisKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpbnQgY2ggPSBnZXRjaGFyKCk7CisKKyAgICAgICAgICAgICAgIC8qIERvbid0IGFsbG93ICdcMCcgaW4gZmlsZSBuYW1lcywgYW5kIHRlcm1pbmF0ZSB3aXRoICdcbicgb3IsCisgICAgICAgICAgICAgICAgKiBmb3IgLTAsIGp1c3QgJ1wwJyAodXNlIC1wcmludDAgdG8gZmluZCB0byBtYWtlIHRoaXMgd29yayEpCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIGlmIChjaCA9PSBFT0YgfHwgY2ggPT0gdGVybSB8fCBjaCA9PSAwKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgYnVmZmVyW2ljaF0gPSAwOworCisgICAgICAgICAgICAgICAgICBpZiAoaWNoID4gMCAmJiAhdGVzdF9vbmVfZmlsZShidWZmZXIsICZmb3JtYXRzLCBvcHRzLAorICAgICAgICAgICAgICAgICAgICAgc3RyaWRlX2V4dHJhLCBsb2dfcGFzcykpCisgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSAxOworCisgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gRU9GKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgIGljaCA9IDA7CisgICAgICAgICAgICAgICAgICAtLWljaDsgLyogc28gdGhhdCB0aGUgaW5jcmVtZW50IGJlbG93IHNldHMgaXQgdG8gMCBhZ2FpbiAqLworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBidWZmZXJbaWNoXSA9IChjaGFyKWNoOworICAgICAgICAgICAgfSB3aGlsZSAoKytpY2ggPCBzaXplb2YgYnVmZmVyKTsKKworICAgICAgICAgICAgaWYgKGljaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGJ1ZmZlclszMl0gPSAwOworICAgICAgICAgICAgICAgYnVmZmVyWzQwOTVdID0gMDsKKyAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMuLi4lczogZmlsZSBuYW1lIHRvbyBsb25nXG4iLCBidWZmZXIsCisgICAgICAgICAgICAgICAgICBidWZmZXIrKDQwOTYtMzIpKTsKKyAgICAgICAgICAgICAgIGV4aXQoOTkpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICBlbHNlIGlmICghdGVzdF9vbmVfZmlsZShhcmcsICZmb3JtYXRzLCBvcHRzLCBzdHJpZGVfZXh0cmEsIGxvZ19wYXNzKSkKKyAgICAgICAgICAgIHJldHZhbCA9IDE7CisgICAgICB9CisgICB9CisKKyAgIGlmIChvcHRzICYgQUNDVU1VTEFURSkKKyAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBpbjsKKworICAgICAgcHJpbnRmKCIvKiBjb250cmliL2xpYnRlc3RzL3BuZ3N0ZXN0LWVycm9ycy5oXG4iKTsKKyAgICAgIHByaW50ZigiICpcbiIpOworICAgICAgcHJpbnRmKCIgKiBCVUlMVCBVU0lORzoiIFBOR19IRUFERVJfVkVSU0lPTl9TVFJJTkcpOworICAgICAgcHJpbnRmKCIgKlxuIik7CisgICAgICBwcmludGYoIiAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuXG4iKTsKKyAgICAgIHByaW50ZigiICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lclxuIik7CisgICAgICBwcmludGYoIiAqIGFuZCBsaWNlbnNlIGluIHBuZy5oXG4iKTsKKyAgICAgIHByaW50ZigiICpcbiIpOworICAgICAgcHJpbnRmKCIgKiBUSElTIElTIEEgTUFDSElORSBHRU5FUkFURUQgRklMRTogZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkhXG4iKTsKKyAgICAgIHByaW50ZigiICogSW5zdGVhZCBydW46XG4iKTsKKyAgICAgIHByaW50ZigiICpcbiIpOworICAgICAgcHJpbnRmKCIgKiAgICBwbmdzdGVzdCAtLWFjY3VtdWxhdGVcbiIpOworICAgICAgcHJpbnRmKCIgKlxuIik7CisgICAgICBwcmludGYoIiAqIG9uIGFzIG1hbnkgUE5HIGZpbGVzIGFzIHBvc3NpYmxlOyBhdCBsZWFzdCBQTkdTdWl0ZSBhbmRcbiIpOworICAgICAgcHJpbnRmKCIgKiBjb250cmliL2xpYnRlc3RzL3Rlc3RwbmdzLlxuIik7CisgICAgICBwcmludGYoIiAqL1xuIik7CisKKyAgICAgIHByaW50Zigic3RhdGljIHBuZ191aW50XzE2IGdwY19lcnJvclsxNi8qaW4qL11bMTYvKm91dCovXVs0LyphKi9dID1cbiIpOworICAgICAgcHJpbnRmKCJ7XG4iKTsKKyAgICAgIGZvciAoaW49MDsgaW48MTY7ICsraW4pCisgICAgICB7CisgICAgICAgICB1bnNpZ25lZCBpbnQgb3V0OworICAgICAgICAgcHJpbnRmKCIgeyAvKiBpbnB1dDogJXMgKi9cbiAiLCBmb3JtYXRfbmFtZXNbaW5dKTsKKyAgICAgICAgIGZvciAob3V0PTA7IG91dDwxNjsgKytvdXQpCisgICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYWxwaGE7CisgICAgICAgICAgICBwcmludGYoIiB7Iik7CisgICAgICAgICAgICBmb3IgKGFscGhhPTA7IGFscGhhPDQ7ICsrYWxwaGEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwcmludGYoIiAlZCIsIGdwY19lcnJvcltpbl1bb3V0XVthbHBoYV0pOworICAgICAgICAgICAgICAgaWYgKGFscGhhIDwgMykgcHV0Y2hhcignLCcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRmKCIgfSIpOworICAgICAgICAgICAgaWYgKG91dCA8IDE1KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcHV0Y2hhcignLCcpOworICAgICAgICAgICAgICAgaWYgKG91dCAlIDQgPT0gMykgcHJpbnRmKCJcbiAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIHByaW50ZigiXG4gfSIpOworCisgICAgICAgICBpZiAoaW4gPCAxNSkKKyAgICAgICAgICAgIHB1dGNoYXIoJywnKTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHB1dGNoYXIoJ1xuJyk7CisgICAgICB9CisgICAgICBwcmludGYoIn07XG4iKTsKKworICAgICAgcHJpbnRmKCJzdGF0aWMgcG5nX3VpbnRfMTYgZ3BjX2Vycm9yX3ZpYV9saW5lYXJbMTZdWzQvKm91dCovXVs0XSA9XG4iKTsKKyAgICAgIHByaW50Zigie1xuIik7CisgICAgICBmb3IgKGluPTA7IGluPDE2OyArK2luKQorICAgICAgeworICAgICAgICAgdW5zaWduZWQgaW50IG91dDsKKyAgICAgICAgIHByaW50ZigiIHsgLyogaW5wdXQ6ICVzICovXG4gIiwgZm9ybWF0X25hbWVzW2luXSk7CisgICAgICAgICBmb3IgKG91dD0wOyBvdXQ8NDsgKytvdXQpCisgICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYWxwaGE7CisgICAgICAgICAgICBwcmludGYoIiB7Iik7CisgICAgICAgICAgICBmb3IgKGFscGhhPTA7IGFscGhhPDQ7ICsrYWxwaGEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwcmludGYoIiAlZCIsIGdwY19lcnJvcl92aWFfbGluZWFyW2luXVtvdXRdW2FscGhhXSk7CisgICAgICAgICAgICAgICBpZiAoYWxwaGEgPCAzKSBwdXRjaGFyKCcsJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGYoIiB9Iik7CisgICAgICAgICAgICBpZiAob3V0IDwgMykKKyAgICAgICAgICAgICAgIHB1dGNoYXIoJywnKTsKKyAgICAgICAgIH0KKyAgICAgICAgIHByaW50ZigiXG4gfSIpOworCisgICAgICAgICBpZiAoaW4gPCAxNSkKKyAgICAgICAgICAgIHB1dGNoYXIoJywnKTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHB1dGNoYXIoJ1xuJyk7CisgICAgICB9CisgICAgICBwcmludGYoIn07XG4iKTsKKworICAgICAgcHJpbnRmKCJzdGF0aWMgcG5nX3VpbnRfMTYgZ3BjX2Vycm9yX3RvX2NvbG9ybWFwWzgvKmkqL11bOC8qbyovXVs0XSA9XG4iKTsKKyAgICAgIHByaW50Zigie1xuIik7CisgICAgICBmb3IgKGluPTA7IGluPDg7ICsraW4pCisgICAgICB7CisgICAgICAgICB1bnNpZ25lZCBpbnQgb3V0OworICAgICAgICAgcHJpbnRmKCIgeyAvKiBpbnB1dDogJXMgKi9cbiAiLCBmb3JtYXRfbmFtZXNbaW5dKTsKKyAgICAgICAgIGZvciAob3V0PTA7IG91dDw4OyArK291dCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBhbHBoYTsKKyAgICAgICAgICAgIHByaW50ZigiIHsiKTsKKyAgICAgICAgICAgIGZvciAoYWxwaGE9MDsgYWxwaGE8NDsgKythbHBoYSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHByaW50ZigiICVkIiwgZ3BjX2Vycm9yX3RvX2NvbG9ybWFwW2luXVtvdXRdW2FscGhhXSk7CisgICAgICAgICAgICAgICBpZiAoYWxwaGEgPCAzKSBwdXRjaGFyKCcsJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGYoIiB9Iik7CisgICAgICAgICAgICBpZiAob3V0IDwgNykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHB1dGNoYXIoJywnKTsKKyAgICAgICAgICAgICAgIGlmIChvdXQgJSA0ID09IDMpIHByaW50ZigiXG4gIik7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBwcmludGYoIlxuIH0iKTsKKworICAgICAgICAgaWYgKGluIDwgNykKKyAgICAgICAgICAgIHB1dGNoYXIoJywnKTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHB1dGNoYXIoJ1xuJyk7CisgICAgICB9CisgICAgICBwcmludGYoIn07XG4iKTsKKyAgICAgIHByaW50ZigiLyogRU5EIE1BQ0hJTkUgR0VORVJBVEVEICovXG4iKTsKKyAgIH0KKworICAgaWYgKHJldHZhbCA9PSAwICYmIHRvdWNoICE9IE5VTEwpCisgICB7CisgICAgICBGSUxFICpmc3VjY2VzcyA9IGZvcGVuKHRvdWNoLCAid3QiKTsKKworICAgICAgaWYgKGZzdWNjZXNzICE9IE5VTEwpCisgICAgICB7CisgICAgICAgICBpbnQgZXJyb3IgPSAwOworICAgICAgICAgZnByaW50Zihmc3VjY2VzcywgIlBORyBzaW1wbGUgQVBJIHRlc3RzIHN1Y2NlZWRlZFxuIik7CisgICAgICAgICBmZmx1c2goZnN1Y2Nlc3MpOworICAgICAgICAgZXJyb3IgPSBmZXJyb3IoZnN1Y2Nlc3MpOworCisgICAgICAgICBpZiAoZmNsb3NlKGZzdWNjZXNzKSB8fCBlcnJvcikKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogd3JpdGUgZmFpbGVkXG4iLCB0b3VjaCk7CisgICAgICAgICAgICBleGl0KDk5KTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBvcGVuIGZhaWxlZFxuIiwgdG91Y2gpOworICAgICAgICAgZXhpdCg5OSk7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiByZXR2YWw7Cit9CisKKyNlbHNlIC8qICFQTkdfU0lNUExJRklFRF9SRUFEX1NVUFBPUlRFRCAqLworaW50IG1haW4odm9pZCkKK3sKKyAgIGZwcmludGYoc3RkZXJyLCAicG5nc3Rlc3Q6IG5vIHJlYWQgc3VwcG9ydCBpbiBsaWJwbmcsIHRlc3Qgc2tpcHBlZFxuIik7CisgICAvKiBTbyB0aGUgdGVzdCBpcyBza2lwcGVkOiAqLworICAgcmV0dXJuIDc3OworfQorI2VuZGlmIC8qIFBOR19TSU1QTElGSUVEX1JFQURfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9saWJ0ZXN0cy9wbmd1bmtub3duLmMgYi9saWJwbmcvY29udHJpYi9saWJ0ZXN0cy9wbmd1bmtub3duLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ1MmZmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL2xpYnRlc3RzL3BuZ3Vua25vd24uYwpAQCAtMCwwICsxLDEyNjEgQEAKKworLyogcG5ndW5rbm93bi5jIC0gdGVzdCB0aGUgcmVhZCBzaWRlIHVua25vd24gY2h1bmsgaGFuZGxpbmcKKyAqCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4xMCBbTWFyY2ggNiwgMjAxNF0KKyAqIENvcHlyaWdodCAoYykgMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAqIFdyaXR0ZW4gYnkgSm9obiBDdW5uaW5naGFtIEJvd2xlcgorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisgKiBhbmQgbGljZW5zZSBpbiBwbmcuaAorICoKKyAqIE5PVEVTOgorICogICBUaGlzIGlzIGEgQyBwcm9ncmFtIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUgbGlua2VkIGFnYWluc3QgbGlicG5nLiAgSXQKKyAqICAgYWxsb3dzIHRoZSBsaWJwbmcgdW5rbm93biBoYW5kbGluZyBjb2RlIHRvIGJlIHRlc3RlZCBieSBpbnRlcnByZXRpbmcKKyAqICAgYXJndW1lbnRzIHRvIHNhdmUgb3IgZGlzY2FyZCBjb21iaW5hdGlvbnMgb2YgY2h1bmtzLiAgVGhlIHByb2dyYW0gaXMKKyAqICAgY3VycmVudGx5IGp1c3QgYSBtaW5pbWFsIHZhbGlkYXRpb24gZm9yIHRoZSBidWlsdC1pbiBsaWJwbmcgZmFjaWxpdGllcy4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKworLyogRGVmaW5lIHRoZSBmb2xsb3dpbmcgdG8gdXNlIHRoaXMgdGVzdCBhZ2FpbnN0IHlvdXIgaW5zdGFsbGVkIGxpYnBuZywgcmF0aGVyCisgKiB0aGFuIHRoZSBvbmUgYmVpbmcgYnVpbHQgaGVyZToKKyAqLworI2lmZGVmIFBOR19GUkVFU1RBTkRJTkdfVEVTVFMKKyMgIGluY2x1ZGUgPHBuZy5oPgorI2Vsc2UKKyMgIGluY2x1ZGUgIi4uLy4uL3BuZy5oIgorI2VuZGlmCisKKy8qIFNpbmNlIHRoaXMgcHJvZ3JhbSB0ZXN0cyB0aGUgYWJpbGl0eSB0byBjaGFuZ2UgdGhlIHVua25vd24gY2h1bmsgaGFuZGxpbmcKKyAqIHRoZXNlIG11c3QgYmUgZGVmaW5lZDoKKyAqLworI2lmIGRlZmluZWQoUE5HX1NFVF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQpICYmXAorICAgZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpCisKKy8qIE9uZSBvZiB0aGVzZSBtdXN0IGJlIGRlZmluZWQgdG8gYWxsb3cgdXMgdG8gZmluZCBvdXQgd2hhdCBoYXBwZW5lZC4gIEl0IGlzCisgKiBzdGlsbCB1c2VmdWwgdG8gc2V0IHVua25vd24gY2h1bmsgaGFuZGxpbmcgd2l0aG91dCBlaXRoZXIgb2YgdGhlc2UgaW4gb3JkZXIKKyAqIHRvIGNhdXNlICprbm93biogY2h1bmtzIHRvIGJlIGRpc2NhcmRlZC4gIFRoaXMgY2FuIGJlIGEgc2lnbmlmaWNhbnQKKyAqIGVmZmljaWVuY3kgZ2FpbiwgYnV0IGl0IGNhbid0IHJlYWxseSBiZSB0ZXN0ZWQgaGVyZS4KKyAqLworI2lmIGRlZmluZWQoUE5HX1JFQURfVVNFUl9DSFVOS1NfU1VQUE9SVEVEKSB8fFwKKyAgIGRlZmluZWQoUE5HX1NBVkVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEKQorCisjaWYgUE5HX0xJQlBOR19WRVIgPCAxMDUwMAorLyogVGhpcyBkZWxpYmVyYXRlbHkgbGFja3MgdGhlIFBOR19DT05TVC4gKi8KK3R5cGVkZWYgcG5nX2J5dGUgKnBuZ19jb25zdF9ieXRlcDsKKworLyogVGhpcyBpcyBjb3BpZWQgZnJvbSAxLjUuMSBwbmcuaDogKi8KKyNkZWZpbmUgUE5HX0lOVEVSTEFDRV9BREFNN19QQVNTRVMgNworI2RlZmluZSBQTkdfUEFTU19TVEFSVF9ST1cocGFzcykgKCgoMVUmfihwYXNzKSk8PCgzLSgocGFzcyk+PjEpKSkmNykKKyNkZWZpbmUgUE5HX1BBU1NfU1RBUlRfQ09MKHBhc3MpICgoKDFVJiAocGFzcykpPDwoMy0oKChwYXNzKSsxKT4+MSkpKSY3KQorI2RlZmluZSBQTkdfUEFTU19ST1dfU0hJRlQocGFzcykgKChwYXNzKT4yPyg4LShwYXNzKSk+PjE6MykKKyNkZWZpbmUgUE5HX1BBU1NfQ09MX1NISUZUKHBhc3MpICgocGFzcyk+MT8oNy0ocGFzcykpPj4xOjMpCisjZGVmaW5lIFBOR19QQVNTX1JPV1MoaGVpZ2h0LCBwYXNzKSAoKChoZWlnaHQpKygoKDE8PFBOR19QQVNTX1JPV19TSElGVChwYXNzKSlcCisgICAtMSktUE5HX1BBU1NfU1RBUlRfUk9XKHBhc3MpKSk+PlBOR19QQVNTX1JPV19TSElGVChwYXNzKSkKKyNkZWZpbmUgUE5HX1BBU1NfQ09MUyh3aWR0aCwgcGFzcykgKCgod2lkdGgpKygoKDE8PFBOR19QQVNTX0NPTF9TSElGVChwYXNzKSlcCisgICAtMSktUE5HX1BBU1NfU1RBUlRfQ09MKHBhc3MpKSk+PlBOR19QQVNTX0NPTF9TSElGVChwYXNzKSkKKyNkZWZpbmUgUE5HX1JPV19GUk9NX1BBU1NfUk9XKHlJbiwgcGFzcykgXAorICAgKCgoeUluKTw8UE5HX1BBU1NfUk9XX1NISUZUKHBhc3MpKStQTkdfUEFTU19TVEFSVF9ST1cocGFzcykpCisjZGVmaW5lIFBOR19DT0xfRlJPTV9QQVNTX0NPTCh4SW4sIHBhc3MpIFwKKyAgICgoKHhJbik8PFBOR19QQVNTX0NPTF9TSElGVChwYXNzKSkrUE5HX1BBU1NfU1RBUlRfQ09MKHBhc3MpKQorI2RlZmluZSBQTkdfUEFTU19NQVNLKHBhc3Msb2ZmKSAoIFwKKyAgICgoMHgxMTAxNDVBRlU+PigoKDctKG9mZikpLShwYXNzKSk8PDIpKSAmIDB4RlUpIHwgXAorICAgKCgweDAxMTQ1QUYwVT4+KCgoNy0ob2ZmKSktKHBhc3MpKTw8MikpICYgMHhGMFUpKQorI2RlZmluZSBQTkdfUk9XX0lOX0lOVEVSTEFDRV9QQVNTKHksIHBhc3MpIFwKKyAgICgoUE5HX1BBU1NfTUFTSyhwYXNzLDApID4+ICgoeSkmNykpICYgMSkKKyNkZWZpbmUgUE5HX0NPTF9JTl9JTlRFUkxBQ0VfUEFTUyh4LCBwYXNzKSBcCisgICAoKFBOR19QQVNTX01BU0socGFzcywxKSA+PiAoKHgpJjcpKSAmIDEpCisKKy8qIFRoZXNlIGFyZSBuZWVkZWQgdG9vIGZvciB0aGUgZGVmYXVsdCBidWlsZDogKi8KKyNkZWZpbmUgUE5HX1dSSVRFXzE2QklUX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF8xNkJJVF9TVVBQT1JURUQKKworLyogVGhpcyBjb21lcyBmcm9tIHBuZ2xpYmNvbmYuaCBhZmVyIDEuNTogKi8KKyNkZWZpbmUgUE5HX0ZQXzEgMTAwMDAwCisjZGVmaW5lIFBOR19HQU1NQV9USFJFU0hPTERfRklYRURcCisgICAoKHBuZ19maXhlZF9wb2ludCkoUE5HX0dBTU1BX1RIUkVTSE9MRCAqIFBOR19GUF8xKSkKKyNlbmRpZgorCisjaWYgUE5HX0xJQlBOR19WRVIgPCAxMDYwMAorICAgLyogMS42LjAgY29uc3RpZmllcyBtYW55IEFQSXMuIFRoZSBmb2xsb3dpbmcgZXhpc3RzIHRvIGFsbG93IHBuZ3ZhbGlkIHRvIGJlCisgICAgKiBjb21waWxlZCBhZ2FpbnN0IGVhcmxpZXIgdmVyc2lvbnMuCisgICAgKi8KKyMgIGRlZmluZSBwbmdfY29uc3Rfc3RydWN0cCBwbmdfc3RydWN0cAorI2VuZGlmCisKKyNpZiBQTkdfTElCUE5HX1ZFUiA8IDEwNzAwCisgICAvKiBDb3BpZWQgZnJvbSBsaWJwbmcgMS43LjAgcG5nLmggKi8KKyNkZWZpbmUgUE5HX3UyKGIxLCBiMikgKCgodW5zaWduZWQgaW50KShiMSkgPDwgOCkgKyAoYjIpKQorCisjZGVmaW5lIFBOR19VMTYoYjEsIGIyKSAoKHBuZ191aW50XzE2KVBOR191MihiMSwgYjIpKQorI2RlZmluZSBQTkdfVTMyKGIxLCBiMiwgYjMsIGI0KVwKKyAgICgoKHBuZ191aW50XzMyKVBOR191MihiMSwgYjIpIDw8IDE2KSArIFBOR191MihiMywgYjQpKQorCisvKiBDb25zdGFudHMgZm9yIGtub3duIGNodW5rIHR5cGVzLgorICovCisjZGVmaW5lIHBuZ19JREFUIFBOR19VMzIoIDczLCAgNjgsICA2NSwgIDg0KQorI2RlZmluZSBwbmdfSUVORCBQTkdfVTMyKCA3MywgIDY5LCAgNzgsICA2OCkKKyNkZWZpbmUgcG5nX0lIRFIgUE5HX1UzMiggNzMsICA3MiwgIDY4LCAgODIpCisjZGVmaW5lIHBuZ19QTFRFIFBOR19VMzIoIDgwLCAgNzYsICA4NCwgIDY5KQorI2RlZmluZSBwbmdfYktHRCBQTkdfVTMyKCA5OCwgIDc1LCAgNzEsICA2OCkKKyNkZWZpbmUgcG5nX2NIUk0gUE5HX1UzMiggOTksICA3MiwgIDgyLCAgNzcpCisjZGVmaW5lIHBuZ19mUkFjIFBOR19VMzIoMTAyLCAgODIsICA2NSwgIDk5KSAvKiByZWdpc3RlcmVkLCBub3QgZGVmaW5lZCAqLworI2RlZmluZSBwbmdfZ0FNQSBQTkdfVTMyKDEwMywgIDY1LCAgNzcsICA2NSkKKyNkZWZpbmUgcG5nX2dJRmcgUE5HX1UzMigxMDMsICA3MywgIDcwLCAxMDMpCisjZGVmaW5lIHBuZ19nSUZ0IFBOR19VMzIoMTAzLCAgNzMsICA3MCwgMTE2KSAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIHBuZ19nSUZ4IFBOR19VMzIoMTAzLCAgNzMsICA3MCwgMTIwKQorI2RlZmluZSBwbmdfaElTVCBQTkdfVTMyKDEwNCwgIDczLCAgODMsICA4NCkKKyNkZWZpbmUgcG5nX2lDQ1AgUE5HX1UzMigxMDUsICA2NywgIDY3LCAgODApCisjZGVmaW5lIHBuZ19pVFh0IFBOR19VMzIoMTA1LCAgODQsICA4OCwgMTE2KQorI2RlZmluZSBwbmdfb0ZGcyBQTkdfVTMyKDExMSwgIDcwLCAgNzAsIDExNSkKKyNkZWZpbmUgcG5nX3BDQUwgUE5HX1UzMigxMTIsICA2NywgIDY1LCAgNzYpCisjZGVmaW5lIHBuZ19wSFlzIFBOR19VMzIoMTEyLCAgNzIsICA4OSwgMTE1KQorI2RlZmluZSBwbmdfc0JJVCBQTkdfVTMyKDExNSwgIDY2LCAgNzMsICA4NCkKKyNkZWZpbmUgcG5nX3NDQUwgUE5HX1UzMigxMTUsICA2NywgIDY1LCAgNzYpCisjZGVmaW5lIHBuZ19zUExUIFBOR19VMzIoMTE1LCAgODAsICA3NiwgIDg0KQorI2RlZmluZSBwbmdfc1JHQiBQTkdfVTMyKDExNSwgIDgyLCAgNzEsICA2NikKKyNkZWZpbmUgcG5nX3NURVIgUE5HX1UzMigxMTUsICA4NCwgIDY5LCAgODIpCisjZGVmaW5lIHBuZ190RVh0IFBOR19VMzIoMTE2LCAgNjksICA4OCwgMTE2KQorI2RlZmluZSBwbmdfdElNRSBQTkdfVTMyKDExNiwgIDczLCAgNzcsICA2OSkKKyNkZWZpbmUgcG5nX3RSTlMgUE5HX1UzMigxMTYsICA4MiwgIDc4LCAgODMpCisjZGVmaW5lIHBuZ196VFh0IFBOR19VMzIoMTIyLCAgODQsICA4OCwgMTE2KQorCisvKiBUZXN0IG9uIGZsYWcgdmFsdWVzIGFzIGRlZmluZWQgaW4gdGhlIHNwZWMgKHNlY3Rpb24gNS40KTogKi8KKyNkZWZpbmUgUE5HX0NIVU5LX0FOQ0lMTEFSWShjKSAgICAoMSAmICgoYykgPj4gMjkpKQorI2RlZmluZSBQTkdfQ0hVTktfQ1JJVElDQUwoYykgICAgICghUE5HX0NIVU5LX0FOQ0lMTEFSWShjKSkKKyNkZWZpbmUgUE5HX0NIVU5LX1BSSVZBVEUoYykgICAgICAoMSAmICgoYykgPj4gMjEpKQorI2RlZmluZSBQTkdfQ0hVTktfUkVTRVJWRUQoYykgICAgICgxICYgKChjKSA+PiAxMykpCisjZGVmaW5lIFBOR19DSFVOS19TQUZFX1RPX0NPUFkoYykgKDEgJiAoKGMpID4+ICA1KSkKKworI2VuZGlmIC8qIFBOR19MSUJQTkdfVkVSIDwgMTA3MDAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCisjICBkZWZpbmUgdGhpcyBub3RfdGhlX2NwcF90aGlzCisjICBkZWZpbmUgbmV3IG5vdF90aGVfY3BwX25ldworIyAgZGVmaW5lIHZvaWRjYXN0KHR5cGUsIHZhbHVlKSBzdGF0aWNfY2FzdDx0eXBlPih2YWx1ZSkKKyNlbHNlCisjICBkZWZpbmUgdm9pZGNhc3QodHlwZSwgdmFsdWUpICh2YWx1ZSkKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisvKiBVbnVzZWQgZm9ybWFsIHBhcmFtZXRlciBlcnJvcnMgYXJlIHJlbW92ZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBtYWNybyB3aGljaCBpcworICogZXhwZWN0ZWQgdG8gaGF2ZSBubyBiYWQgZWZmZWN0cyBvbiBwZXJmb3JtYW5jZS4KKyAqLworI2lmbmRlZiBVTlVTRUQKKyMgIGlmIGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX01TQ19WRVIpCisjICAgICBkZWZpbmUgVU5VU0VEKHBhcmFtKSAodm9pZClwYXJhbTsKKyMgIGVsc2UKKyMgICAgIGRlZmluZSBVTlVTRUQocGFyYW0pCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFR5cGVzIG9mIGNodW5rcyBub3Qga25vd24gdG8gbGlicG5nICovCisjZGVmaW5lIHBuZ192cEFnIFBOR19VMzIoMTE4LCAxMTIsIDY1LCAxMDMpCisKKy8qIENodW5rIGluZm9ybWF0aW9uICovCisjZGVmaW5lIFBOR19JTkZPX3RFWHQgMHgxMDAwMDAwMFUKKyNkZWZpbmUgUE5HX0lORk9faVRYdCAweDIwMDAwMDAwVQorI2RlZmluZSBQTkdfSU5GT196VFh0IDB4NDAwMDAwMDBVCisKKyNkZWZpbmUgUE5HX0lORk9fc1RFUiAweDAxMDAwMDAwVQorI2RlZmluZSBQTkdfSU5GT192cEFnIDB4MDIwMDAwMDBVCisKKyNkZWZpbmUgQUJTRU5UICAwCisjZGVmaW5lIFNUQVJUICAgMQorI2RlZmluZSBFTkQgICAgIDIKKworc3RhdGljIHN0cnVjdAoreworICAgY2hhciAgICAgICAgbmFtZVs1XTsKKyAgIHBuZ191aW50XzMyIGZsYWc7CisgICBwbmdfdWludF8zMiB0YWc7CisgICBpbnQgICAgICAgICB1bmtub3duOyAgICAvKiBDaHVuayBub3Qga25vd24gdG8gbGlicG5nICovCisgICBpbnQgICAgICAgICBhbGw7ICAgICAgICAvKiBDaHVuayBzZXQgYnkgdGhlICctMScgb3B0aW9uICovCisgICBpbnQgICAgICAgICBwb3NpdGlvbjsgICAvKiBwb3NpdGlvbiBpbiBwbmd0ZXN0LnBuZyAqLworICAgaW50ICAgICAgICAga2VlcDsgICAgICAgLyogdW5rbm93biBoYW5kbGluZyBzZXR0aW5nICovCit9IGNodW5rX2luZm9bXSA9IHsKKyAgIC8qIENyaXRpY2FsIGNodW5rcyAqLworICAgeyAiSURBVCIsIFBOR19JTkZPX0lEQVQsIHBuZ19JREFULCAwLCAwLCAgU1RBUlQsIDAgfSwgLyogbXVzdCBiZSBbMF0gKi8KKyAgIHsgIlBMVEUiLCBQTkdfSU5GT19QTFRFLCBwbmdfUExURSwgMCwgMCwgQUJTRU5ULCAwIH0sCisKKyAgIC8qIE5vbi1jcml0aWNhbCBjaHVua3MgdGhhdCBsaWJwbmcgaGFuZGxlcyAqLworICAgLyogVGhpcyBpcyBhIG1lc3MgYnV0IGl0IHNlZW1zIHRvIGJlIHRoZSBvbmx5IHdheSB0byBkbyBpdCAtIHRoZXJlIGlzIG5vIHdheQorICAgICogdG8gY2hlY2sgZm9yIGEgZGVmaW5pdGlvbiBvdXRzaWRlIGEgI2lmLgorICAgICovCisgICB7ICJiS0dEIiwgUE5HX0lORk9fYktHRCwgcG5nX2JLR0QsCisjICAgICBpZmRlZiBQTkdfUkVBRF9iS0dEX1NVUFBPUlRFRAorICAgICAgICAgMCwKKyMgICAgIGVsc2UKKyAgICAgICAgIDEsCisjICAgICBlbmRpZgorICAgICAgMSwgIFNUQVJULCAwIH0sCisgICB7ICJjSFJNIiwgUE5HX0lORk9fY0hSTSwgcG5nX2NIUk0sCisjICAgICBpZmRlZiBQTkdfUkVBRF9jSFJNX1NVUFBPUlRFRAorICAgICAgICAgMCwKKyMgICAgIGVsc2UKKyAgICAgICAgIDEsCisjICAgICBlbmRpZgorICAgICAgMSwgIFNUQVJULCAwIH0sCisgICB7ICJnQU1BIiwgUE5HX0lORk9fZ0FNQSwgcG5nX2dBTUEsCisjICAgICBpZmRlZiBQTkdfUkVBRF9nQU1BX1NVUFBPUlRFRAorICAgICAgICAgMCwKKyMgICAgIGVsc2UKKyAgICAgICAgIDEsCisjICAgICBlbmRpZgorICAgICAgMSwgIFNUQVJULCAwIH0sCisgICB7ICJoSVNUIiwgUE5HX0lORk9faElTVCwgcG5nX2hJU1QsCisjICAgICBpZmRlZiBQTkdfUkVBRF9oSVNUX1NVUFBPUlRFRAorICAgICAgICAgMCwKKyMgICAgIGVsc2UKKyAgICAgICAgIDEsCisjICAgICBlbmRpZgorICAgICAgMSwgQUJTRU5ULCAwIH0sCisgICB7ICJpQ0NQIiwgUE5HX0lORk9faUNDUCwgcG5nX2lDQ1AsCisjICAgICBpZmRlZiBQTkdfUkVBRF9pQ0NQX1NVUFBPUlRFRAorICAgICAgICAgMCwKKyMgICAgIGVsc2UKKyAgICAgICAgIDEsCisjICAgICBlbmRpZgorICAgICAgMSwgQUJTRU5ULCAwIH0sCisgICB7ICJpVFh0IiwgUE5HX0lORk9faVRYdCwgcG5nX2lUWHQsCisjICAgICBpZmRlZiBQTkdfUkVBRF9pVFh0X1NVUFBPUlRFRAorICAgICAgICAgMCwKKyMgICAgIGVsc2UKKyAgICAgICAgIDEsCisjICAgICBlbmRpZgorICAgICAgMSwgQUJTRU5ULCAwIH0sCisgICB7ICJvRkZzIiwgUE5HX0lORk9fb0ZGcywgcG5nX29GRnMsCisjICAgICBpZmRlZiBQTkdfUkVBRF9vRkZzX1NVUFBPUlRFRAorICAgICAgICAgMCwKKyMgICAgIGVsc2UKKyAgICAgICAgIDEsCisjICAgICBlbmRpZgorICAgICAgMSwgIFNUQVJULCAwIH0sCisgICB7ICJwQ0FMIiwgUE5HX0lORk9fcENBTCwgcG5nX3BDQUwsCisjICAgICBpZmRlZiBQTkdfUkVBRF9wQ0FMX1NVUFBPUlRFRAorICAgICAgICAgMCwKKyMgICAgIGVsc2UKKyAgICAgICAgIDEsCisjICAgICBlbmRpZgorICAgICAgMSwgIFNUQVJULCAwIH0sCisgICB7ICJwSFlzIiwgUE5HX0lORk9fcEhZcywgcG5nX3BIWXMsCisjICAgICBpZmRlZiBQTkdfUkVBRF9wSFlzX1NVUFBPUlRFRAorICAgICAgICAgMCwKKyMgICAgIGVsc2UKKyAgICAgICAgIDEsCisjICAgICBlbmRpZgorICAgICAgMSwgIFNUQVJULCAwIH0sCisgICB7ICJzQklUIiwgUE5HX0lORk9fc0JJVCwgcG5nX3NCSVQsCisjICAgICBpZmRlZiBQTkdfUkVBRF9zQklUX1NVUFBPUlRFRAorICAgICAgICAgMCwKKyMgICAgIGVsc2UKKyAgICAgICAgIDEsCisjICAgICBlbmRpZgorICAgICAgMSwgIFNUQVJULCAwIH0sCisgICB7ICJzQ0FMIiwgUE5HX0lORk9fc0NBTCwgcG5nX3NDQUwsCisjICAgICBpZmRlZiBQTkdfUkVBRF9zQ0FMX1NVUFBPUlRFRAorICAgICAgICAgMCwKKyMgICAgIGVsc2UKKyAgICAgICAgIDEsCisjICAgICBlbmRpZgorICAgICAgMSwgIFNUQVJULCAwIH0sCisgICB7ICJzUExUIiwgUE5HX0lORk9fc1BMVCwgcG5nX3NQTFQsCisjICAgICBpZmRlZiBQTkdfUkVBRF9zUExUX1NVUFBPUlRFRAorICAgICAgICAgMCwKKyMgICAgIGVsc2UKKyAgICAgICAgIDEsCisjICAgICBlbmRpZgorICAgICAgMSwgQUJTRU5ULCAwIH0sCisgICB7ICJzUkdCIiwgUE5HX0lORk9fc1JHQiwgcG5nX3NSR0IsCisjICAgICBpZmRlZiBQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRAorICAgICAgICAgMCwKKyMgICAgIGVsc2UKKyAgICAgICAgIDEsCisjICAgICBlbmRpZgorICAgICAgMSwgIFNUQVJULCAwIH0sCisgICB7ICJ0RVh0IiwgUE5HX0lORk9fdEVYdCwgcG5nX3RFWHQsCisjICAgICBpZmRlZiBQTkdfUkVBRF90RVh0X1NVUFBPUlRFRAorICAgICAgICAgMCwKKyMgICAgIGVsc2UKKyAgICAgICAgIDEsCisjICAgICBlbmRpZgorICAgICAgMSwgIFNUQVJULCAwIH0sCisgICB7ICJ0SU1FIiwgUE5HX0lORk9fdElNRSwgcG5nX3RJTUUsCisjICAgICBpZmRlZiBQTkdfUkVBRF90SU1FX1NVUFBPUlRFRAorICAgICAgICAgMCwKKyMgICAgIGVsc2UKKyAgICAgICAgIDEsCisjICAgICBlbmRpZgorICAgICAgMSwgIFNUQVJULCAwIH0sCisgICB7ICJ0Uk5TIiwgUE5HX0lORk9fdFJOUywgcG5nX3RSTlMsCisjICAgICBpZmRlZiBQTkdfUkVBRF90Uk5TX1NVUFBPUlRFRAorICAgICAgICAgMCwKKyMgICAgIGVsc2UKKyAgICAgICAgIDEsCisjICAgICBlbmRpZgorICAgICAgMCwgQUJTRU5ULCAwIH0sCisgICB7ICJ6VFh0IiwgUE5HX0lORk9felRYdCwgcG5nX3pUWHQsCisjICAgICBpZmRlZiBQTkdfUkVBRF96VFh0X1NVUFBPUlRFRAorICAgICAgICAgMCwKKyMgICAgIGVsc2UKKyAgICAgICAgIDEsCisjICAgICBlbmRpZgorICAgICAgMSwgICAgRU5ELCAwIH0sCisKKyAgIC8qIE5vIGxpYnBuZyBoYW5kbGluZyAqLworICAgeyAic1RFUiIsIFBOR19JTkZPX3NURVIsIHBuZ19zVEVSLCAxLCAxLCAgU1RBUlQsIDAgfSwKKyAgIHsgInZwQWciLCBQTkdfSU5GT192cEFnLCBwbmdfdnBBZywgMSwgMCwgIFNUQVJULCAwIH0sCit9OworCisjZGVmaW5lIE5JTkZPICgoaW50KSgoc2l6ZW9mIGNodW5rX2luZm8pLyhzaXplb2YgY2h1bmtfaW5mb1swXSkpKQorCitzdGF0aWMgdm9pZAorY2xlYXJfa2VlcCh2b2lkKQoreworICAgaW50IGkgPSBOSU5GTzsKKyAgIHdoaWxlICgtLWkgPj0gMCkKKyAgICAgIGNodW5rX2luZm9baV0ua2VlcCA9IDA7Cit9CisKK3N0YXRpYyBpbnQKK2ZpbmQoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgIGludCBpID0gTklORk87CisgICB3aGlsZSAoLS1pID49IDApCisgICB7CisgICAgICBpZiAobWVtY21wKGNodW5rX2luZm9baV0ubmFtZSwgbmFtZSwgNCkgPT0gMCkKKyAgICAgICAgIGJyZWFrOworICAgfQorCisgICByZXR1cm4gaTsKK30KKworc3RhdGljIGludAorZmluZGIoY29uc3QgcG5nX2J5dGUgKm5hbWUpCit7CisgICBpbnQgaSA9IE5JTkZPOworICAgd2hpbGUgKC0taSA+PSAwKQorICAgeworICAgICAgaWYgKG1lbWNtcChjaHVua19pbmZvW2ldLm5hbWUsIG5hbWUsIDQpID09IDApCisgICAgICAgICBicmVhazsKKyAgIH0KKworICAgcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQKK2ZpbmRfYnlfZmxhZyhwbmdfdWludF8zMiBmbGFnKQoreworICAgaW50IGkgPSBOSU5GTzsKKworICAgd2hpbGUgKC0taSA+PSAwKSBpZiAoY2h1bmtfaW5mb1tpXS5mbGFnID09IGZsYWcpIHJldHVybiBpOworCisgICBmcHJpbnRmKHN0ZGVyciwgInBuZ3Vua25vd246IGludGVybmFsIGVycm9yXG4iKTsKKyAgIGV4aXQoNCk7Cit9CisKK3N0YXRpYyBpbnQKK2FuY2lsbGFyeShjb25zdCBjaGFyICpuYW1lKQoreworICAgcmV0dXJuIFBOR19DSFVOS19BTkNJTExBUlkoUE5HX1UzMihuYW1lWzBdLCBuYW1lWzFdLCBuYW1lWzJdLCBuYW1lWzNdKSk7Cit9CisKKyNpZmRlZiBQTkdfU0FWRV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKK3N0YXRpYyBpbnQKK2FuY2lsbGFyeWIoY29uc3QgcG5nX2J5dGUgKm5hbWUpCit7CisgICByZXR1cm4gUE5HX0NIVU5LX0FOQ0lMTEFSWShQTkdfVTMyKG5hbWVbMF0sIG5hbWVbMV0sIG5hbWVbMl0sIG5hbWVbM10pKTsKK30KKyNlbmRpZgorCisvKiBUeXBlIG9mIGFuIGVycm9yX3B0ciAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIGptcF9idWYgICAgIGVycm9yX3JldHVybjsKKyAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHI7CisgICBwbmdfaW5mb3AgICBpbmZvX3B0ciwgZW5kX3B0cjsKKyAgIHBuZ191aW50XzMyIGJlZm9yZV9JREFUOworICAgcG5nX3VpbnRfMzIgYWZ0ZXJfSURBVDsKKyAgIGludCAgICAgICAgIGVycm9yX2NvdW50OworICAgaW50ICAgICAgICAgd2FybmluZ19jb3VudDsKKyAgIGludCAgICAgICAgIGtlZXA7IC8qIHRoZSBkZWZhdWx0IHZhbHVlICovCisgICBjb25zdCBjaGFyICpwcm9ncmFtOworICAgY29uc3QgY2hhciAqZmlsZTsKKyAgIGNvbnN0IGNoYXIgKnRlc3Q7Cit9IGRpc3BsYXk7CisKK3N0YXRpYyBjb25zdCBjaGFyIGluaXRbXSA9ICJpbml0aWFsaXphdGlvbiI7CitzdGF0aWMgY29uc3QgY2hhciBjbWRbXSA9ICJjb21tYW5kIGxpbmUiOworCitzdGF0aWMgdm9pZAoraW5pdF9kaXNwbGF5KGRpc3BsYXkgKmQsIGNvbnN0IGNoYXIgKnByb2dyYW0pCit7CisgICBtZW1zZXQoZCwgMCwgc2l6ZW9mICpkKTsKKyAgIGQtPnBuZ19wdHIgPSBOVUxMOworICAgZC0+aW5mb19wdHIgPSBkLT5lbmRfcHRyID0gTlVMTDsKKyAgIGQtPmVycm9yX2NvdW50ID0gZC0+d2FybmluZ19jb3VudCA9IDA7CisgICBkLT5wcm9ncmFtID0gcHJvZ3JhbTsKKyAgIGQtPmZpbGUgPSBwcm9ncmFtOworICAgZC0+dGVzdCA9IGluaXQ7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbl9kaXNwbGF5KGRpc3BsYXkgKmQpCit7CisgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmZC0+cG5nX3B0ciwgJmQtPmluZm9fcHRyLCAmZC0+ZW5kX3B0cik7CisKKyAgIC8qIFRoaXMgbXVzdCBub3QgaGFwcGVuIC0gaXQgbWlnaHQgY2F1c2UgYW4gYXBwIGNyYXNoICovCisgICBpZiAoZC0+cG5nX3B0ciAhPSBOVUxMIHx8IGQtPmluZm9fcHRyICE9IE5VTEwgfHwgZC0+ZW5kX3B0ciAhPSBOVUxMKQorICAgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlcyglcyk6IHBuZ19kZXN0cm95X3JlYWRfc3RydWN0IGVycm9yXG4iLCBkLT5maWxlLAorICAgICAgICAgZC0+dGVzdCk7CisgICAgICBleGl0KDEpOworICAgfQorfQorCitQTkdfRlVOQ1RJT04odm9pZCwgZGlzcGxheV9leGl0LCAoZGlzcGxheSAqZCksIHN0YXRpYyBQTkdfTk9SRVRVUk4pCit7CisgICArKyhkLT5lcnJvcl9jb3VudCk7CisKKyAgIGlmIChkLT5wbmdfcHRyICE9IE5VTEwpCisgICAgICBjbGVhbl9kaXNwbGF5KGQpOworCisgICAvKiBEdXJpbmcgaW5pdGlhbGl6YXRpb24gYW5kIGlmIHRoaXMgaXMgYSBzaW5nbGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHNldAorICAgICogZXhpdCBub3cgLSB0aGVyZSBpcyBvbmx5IG9uZSB0ZXN0LCBvdGhlcndpc2UgbG9uZ2ptcCB0byBkbyB0aGUgbmV4dCB0ZXN0LgorICAgICovCisgICBpZiAoZC0+dGVzdCA9PSBpbml0IHx8IGQtPnRlc3QgPT0gY21kKQorICAgICAgZXhpdCgxKTsKKworICAgbG9uZ2ptcChkLT5lcnJvcl9yZXR1cm4sIDEpOworfQorCitzdGF0aWMgaW50CitkaXNwbGF5X3JjKGNvbnN0IGRpc3BsYXkgKmQsIGludCBzdHJpY3QpCit7CisgICByZXR1cm4gZC0+ZXJyb3JfY291bnQgKyAoc3RyaWN0ID8gZC0+d2FybmluZ19jb3VudCA6IDApOworfQorCisvKiBsaWJwbmcgZXJyb3IgYW5kIHdhcm5pbmcgY2FsbGJhY2tzICovCitQTkdfRlVOQ1RJT04odm9pZCwgKFBOR0NCQVBJIGVycm9yKSwgKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpLAorICAgc3RhdGljIFBOR19OT1JFVFVSTikKK3sKKyAgIGRpc3BsYXkgKmQgPSAoZGlzcGxheSopcG5nX2dldF9lcnJvcl9wdHIocG5nX3B0cik7CisKKyAgIGZwcmludGYoc3RkZXJyLCAiJXMoJXMpOiBsaWJwbmcgZXJyb3I6ICVzXG4iLCBkLT5maWxlLCBkLT50ZXN0LCBtZXNzYWdlKTsKKyAgIGRpc3BsYXlfZXhpdChkKTsKK30KKworc3RhdGljIHZvaWQgUE5HQ0JBUEkKK3dhcm5pbmcocG5nX3N0cnVjdHAgcG5nX3B0ciwgY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKyAgIGRpc3BsYXkgKmQgPSAoZGlzcGxheSopcG5nX2dldF9lcnJvcl9wdHIocG5nX3B0cik7CisKKyAgIGZwcmludGYoc3RkZXJyLCAiJXMoJXMpOiBsaWJwbmcgd2FybmluZzogJXNcbiIsIGQtPmZpbGUsIGQtPnRlc3QsIG1lc3NhZ2UpOworICAgKysoZC0+d2FybmluZ19jb3VudCk7Cit9CisKK3N0YXRpYyBwbmdfdWludF8zMgorZ2V0X3ZhbGlkKGRpc3BsYXkgKmQsIHBuZ19pbmZvcCBpbmZvX3B0cikKK3sKKyAgIHBuZ191aW50XzMyIGZsYWdzID0gcG5nX2dldF92YWxpZChkLT5wbmdfcHRyLCBpbmZvX3B0ciwgKHBuZ191aW50XzMyKX4wKTsKKworICAgLyogTWFwIHRoZSB0ZXh0IGNodW5rcyBiYWNrIGludG8gdGhlIGZsYWdzICovCisgICB7CisgICAgICBwbmdfdGV4dHAgdGV4dDsKKyAgICAgIHBuZ191aW50XzMyIG50ZXh0ID0gcG5nX2dldF90ZXh0KGQtPnBuZ19wdHIsIGluZm9fcHRyLCAmdGV4dCwgTlVMTCk7CisKKyAgICAgIHdoaWxlIChudGV4dC0tID4gMCkgc3dpdGNoICh0ZXh0W250ZXh0XS5jb21wcmVzc2lvbikKKyAgICAgIHsKKyAgICAgICAgIGNhc2UgLTE6CisgICAgICAgICAgICBmbGFncyB8PSBQTkdfSU5GT190RVh0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBmbGFncyB8PSBQTkdfSU5GT196VFh0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIDE6CisgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBmbGFncyB8PSBQTkdfSU5GT19pVFh0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyglcyk6IHVua25vd24gdGV4dCBjb21wcmVzc2lvbiAlZFxuIiwgZC0+ZmlsZSwKKyAgICAgICAgICAgICAgIGQtPnRlc3QsIHRleHRbbnRleHRdLmNvbXByZXNzaW9uKTsKKyAgICAgICAgICAgIGRpc3BsYXlfZXhpdChkKTsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIGZsYWdzOworfQorCisjaWZkZWYgUE5HX1JFQURfVVNFUl9DSFVOS1NfU1VQUE9SVEVECitzdGF0aWMgaW50IFBOR0NCQVBJCityZWFkX2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBwLCBwbmdfdW5rbm93bl9jaHVua3AgcGMpCit7CisgICAvKiBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgYmVoYXZpb3Igb2YgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzIGJ5CisgICAgKiByZXR1cm5pbmcgJzAnIHRvIGtlZXAgdGhlIGNodW5rIGFuZCAnMScgdG8gZGlzY2FyZCBpdC4KKyAgICAqLworICAgZGlzcGxheSAqZCA9IHZvaWRjYXN0KGRpc3BsYXkqLCBwbmdfZ2V0X3VzZXJfY2h1bmtfcHRyKHBwKSk7CisgICBpbnQgY2h1bmsgPSBmaW5kYihwYy0+bmFtZSk7CisgICBpbnQga2VlcCwgZGlzY2FyZDsKKworICAgaWYgKGNodW5rIDwgMCkgLyogbm90IG9uZSBpbiBvdXIgbGlzdCwgc28gbm90IGEga25vd24gY2h1bmsgKi8KKyAgICAgIGtlZXAgPSBkLT5rZWVwOworCisgICBlbHNlCisgICB7CisgICAgICBrZWVwID0gY2h1bmtfaW5mb1tjaHVua10ua2VlcDsKKyAgICAgIGlmIChrZWVwID09IFBOR19IQU5ETEVfQ0hVTktfQVNfREVGQVVMVCkKKyAgICAgIHsKKyAgICAgICAgIC8qIFNlZSB0aGUgY29tbWVudHMgaW4gcG5nLmggLSB1c2UgdGhlIGRlZmF1bHQgZm9yIHVua25vd24gY2h1bmtzLAorICAgICAgICAgICogZG8gbm90IGtlZXAga25vd24gY2h1bmtzLgorICAgICAgICAgICovCisgICAgICAgICBpZiAoY2h1bmtfaW5mb1tjaHVua10udW5rbm93bikKKyAgICAgICAgICAgIGtlZXAgPSBkLT5rZWVwOworCisgICAgICAgICBlbHNlCisgICAgICAgICAgICBrZWVwID0gUE5HX0hBTkRMRV9DSFVOS19ORVZFUjsKKyAgICAgIH0KKyAgIH0KKworICAgc3dpdGNoIChrZWVwKQorICAgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMoJXMpOiAlZDogdW5yZWNvZ25pemVkIGNodW5rIG9wdGlvblxuIiwgZC0+ZmlsZSwKKyAgICAgICAgICAgIGQtPnRlc3QsIGNodW5rX2luZm9bY2h1bmtdLmtlZXApOworICAgICAgICAgZGlzcGxheV9leGl0KGQpOworCisgICAgICBjYXNlIFBOR19IQU5ETEVfQ0hVTktfQVNfREVGQVVMVDoKKyAgICAgIGNhc2UgUE5HX0hBTkRMRV9DSFVOS19ORVZFUjoKKyAgICAgICAgIGRpc2NhcmQgPSAxLypoYW5kbGVkOyBkaXNjYXJkKi87CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBQTkdfSEFORExFX0NIVU5LX0lGX1NBRkU6CisgICAgICBjYXNlIFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTOgorICAgICAgICAgZGlzY2FyZCA9IDAvKm5vdCBoYW5kbGVkOyBrZWVwKi87CisgICAgICAgICBicmVhazsKKyAgIH0KKworICAgLyogQWxzbyBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNodW5rIGluIHRoZSBkaXNwbGF5LCB0aGUgcmVsZXZhbnQgZmxhZworICAgICogaXMgc2V0IGlmIHRoZSBjaHVuayBpcyB0byBiZSBrZXB0ICgnbm90IGhhbmRsZWQnLikKKyAgICAqLworICAgaWYgKGNodW5rID49IDApIGlmICghZGlzY2FyZCkgLyogc3R1cGlkaXR5IHRvIHN0b3AgYSBHQ0Mgd2FybmluZyAqLworICAgeworICAgICAgcG5nX3VpbnRfMzIgZmxhZyA9IGNodW5rX2luZm9bY2h1bmtdLmZsYWc7CisKKyAgICAgIGlmIChwYy0+bG9jYXRpb24gJiBQTkdfQUZURVJfSURBVCkKKyAgICAgICAgIGQtPmFmdGVyX0lEQVQgfD0gZmxhZzsKKworICAgICAgZWxzZQorICAgICAgICAgZC0+YmVmb3JlX0lEQVQgfD0gZmxhZzsKKyAgIH0KKworICAgLyogSG93ZXZlciBpZiB0aGVyZSBpcyBubyBzdXBwb3J0IHRvIHN0b3JlIHVua25vd24gY2h1bmtzIGRvbid0IGFzayBsaWJwbmcgdG8KKyAgICAqIGRvIGl0OyB0aGVyZSB3aWxsIGJlIGFuIHBuZ19lcnJvci4KKyAgICAqLworIyAgaWZkZWYgUE5HX1NBVkVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECisgICAgICByZXR1cm4gZGlzY2FyZDsKKyMgIGVsc2UKKyAgICAgIHJldHVybiAxOyAvKmhhbmRsZWQ7IGRpc2NhcmQqLworIyAgZW5kaWYKK30KKyNlbmRpZiAvKiBSRUFEX1VTRVJfQ0hVTktTX1NVUFBPUlRFRCAqLworCisjaWZkZWYgUE5HX1NBVkVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECitzdGF0aWMgcG5nX3VpbnRfMzIKK2dldF91bmtub3duKGRpc3BsYXkgKmQsIHBuZ19pbmZvcCBpbmZvX3B0ciwgaW50IGFmdGVyX0lEQVQpCit7CisgICAvKiBDcmVhdGUgY29ycmVzcG9uZGluZyAndW5rbm93bicgZmxhZ3MgKi8KKyAgIHBuZ191aW50XzMyIGZsYWdzID0gMDsKKworICAgVU5VU0VEKGFmdGVyX0lEQVQpCisKKyAgIHsKKyAgICAgIHBuZ191bmtub3duX2NodW5rcCB1bmtub3duOworICAgICAgaW50IG51bV91bmtub3duID0gcG5nX2dldF91bmtub3duX2NodW5rcyhkLT5wbmdfcHRyLCBpbmZvX3B0ciwgJnVua25vd24pOworCisgICAgICB3aGlsZSAoLS1udW1fdW5rbm93biA+PSAwKQorICAgICAgeworICAgICAgICAgaW50IGNodW5rID0gZmluZGIodW5rbm93bltudW1fdW5rbm93bl0ubmFtZSk7CisKKyAgICAgICAgIC8qIENodW5rcyBub3Qga25vd24gdG8gcG5ndW5rbm93biBtdXN0IGJlIHZhbGlkYXRlZCBoZXJlOyBzaW5jZSB0aGV5CisgICAgICAgICAgKiBtdXN0IGFsc28gYmUgdW5rbm93biB0byBsaWJwbmcgdGhlICdkaXNwbGF5LT5rZWVwJyBiZWhhdmlvciBzaG91bGQKKyAgICAgICAgICAqIGhhdmUgYmVlbiB1c2VkLgorICAgICAgICAgICovCisgICAgICAgICBpZiAoY2h1bmsgPCAwKSBzd2l0Y2ggKGQtPmtlZXApCisgICAgICAgICB7CisgICAgICAgICAgICBkZWZhdWx0OiAvKiBpbXBvc3NpYmxlICovCisgICAgICAgICAgICBjYXNlIFBOR19IQU5ETEVfQ0hVTktfQVNfREVGQVVMVDoKKyAgICAgICAgICAgIGNhc2UgUE5HX0hBTkRMRV9DSFVOS19ORVZFUjoKKyAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMoJXMpOiAlczogJXM6IHVua25vd24gY2h1bmsgc2F2ZWRcbiIsCisgICAgICAgICAgICAgICAgICBkLT5maWxlLCBkLT50ZXN0LCBkLT5rZWVwID8gImRpc2NhcmQiIDogImRlZmF1bHQiLAorICAgICAgICAgICAgICAgICAgdW5rbm93bltudW1fdW5rbm93bl0ubmFtZSk7CisgICAgICAgICAgICAgICArKyhkLT5lcnJvcl9jb3VudCk7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBQTkdfSEFORExFX0NIVU5LX0lGX1NBRkU6CisgICAgICAgICAgICAgICBpZiAoIWFuY2lsbGFyeWIodW5rbm93bltudW1fdW5rbm93bl0ubmFtZSkpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICIlcyglcyk6IGlmLXNhZmU6ICVzOiB1bmtub3duIGNyaXRpY2FsIGNodW5rIHNhdmVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgZC0+ZmlsZSwgZC0+dGVzdCwgdW5rbm93bltudW1fdW5rbm93bl0ubmFtZSk7CisgICAgICAgICAgICAgICAgICArKyhkLT5lcnJvcl9jb3VudCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAoc2FmZSkgKi8KKyAgICAgICAgICAgIGNhc2UgUE5HX0hBTkRMRV9DSFVOS19BTFdBWVM6CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKworICAgICAgICAgZWxzZQorICAgICAgICAgICAgZmxhZ3MgfD0gY2h1bmtfaW5mb1tjaHVua10uZmxhZzsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIGZsYWdzOworfQorI2Vsc2UKK3N0YXRpYyBwbmdfdWludF8zMgorZ2V0X3Vua25vd24oZGlzcGxheSAqZCwgcG5nX2luZm9wIGluZm9fcHRyLCBpbnQgYWZ0ZXJfSURBVCkKKyAgIC8qIE90aGVyd2lzZSB0aGlzIHdpbGwgcmV0dXJuIHRoZSBjYWNoZWQgdmFsdWVzIHNldCBieSBhbnkgdXNlciBjYWxsYmFjayAqLworeworICAgVU5VU0VEKGluZm9fcHRyKTsKKworICAgaWYgKGFmdGVyX0lEQVQpCisgICAgICByZXR1cm4gZC0+YWZ0ZXJfSURBVDsKKworICAgZWxzZQorICAgICAgcmV0dXJuIGQtPmJlZm9yZV9JREFUOworfQorCisjICBpZm5kZWYgUE5HX1JFQURfVVNFUl9DSFVOS1NfU1VQUE9SVEVECisgICAgICAvKiBUaGUgI2RlZmluZXMgYWJvdmUgc2hvdWxkIG1lYW4gdGhpcyBpcyBuZXZlciByZWFjaGVkLCBpdCdzIGp1c3QgaGVyZSBhcworICAgICAgICogYSBjaGVjayB0byBlbnN1cmUgdGhlIGxvZ2ljIGlzIGNvcnJlY3QuCisgICAgICAgKi8KKyMgICAgIGVycm9yIE5vIHN0b3JlIHN1cHBvcnQgYW5kIG5vIHVzZXIgY2h1bmsgc3VwcG9ydCwgdGhpcyB3aWxsIG5vdCB3b3JrCisjICBlbmRpZgorI2VuZGlmCisKK3N0YXRpYyBpbnQKK2NoZWNrKEZJTEUgKmZwLCBpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIHBuZ191aW50XzMycCBmbGFncy8qb3V0Ki8sCisgICBkaXNwbGF5ICpkLCBpbnQgc2V0X2NhbGxiYWNrKQoreworICAgaW50IGksIG5wYXNzZXMsIGlwYXNzOworICAgcG5nX3VpbnRfMzIgaGVpZ2h0OworCisgICBkLT5rZWVwID0gUE5HX0hBTkRMRV9DSFVOS19BU19ERUZBVUxUOworICAgZC0+YmVmb3JlX0lEQVQgPSAwOworICAgZC0+YWZ0ZXJfSURBVCA9IDA7CisKKyAgIC8qIFNvbWUgb2YgdGhlc2UgZXJyb3JzIGFyZSBwZXJtYW5lbnRseSBmYXRhbCBhbmQgY2F1c2UgYW4gZXhpdCBoZXJlLCBvdGhlcnMKKyAgICAqIGFyZSBwZXItdGVzdCBhbmQgY2F1c2UgYW4gZXJyb3IgcmV0dXJuLgorICAgICovCisgICBkLT5wbmdfcHRyID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIGQsIGVycm9yLAorICAgICAgd2FybmluZyk7CisgICBpZiAoZC0+cG5nX3B0ciA9PSBOVUxMKQorICAgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlcyglcyk6IGNvdWxkIG5vdCBhbGxvY2F0ZSBwbmcgc3RydWN0XG4iLCBkLT5maWxlLAorICAgICAgICAgZC0+dGVzdCk7CisgICAgICAvKiBUZXJtaW5hdGUgaGVyZSwgdGhpcyBlcnJvciBpcyBub3QgdGVzdCBzcGVjaWZpYy4gKi8KKyAgICAgIGV4aXQoMSk7CisgICB9CisKKyAgIGQtPmluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChkLT5wbmdfcHRyKTsKKyAgIGQtPmVuZF9wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KGQtPnBuZ19wdHIpOworICAgaWYgKGQtPmluZm9fcHRyID09IE5VTEwgfHwgZC0+ZW5kX3B0ciA9PSBOVUxMKQorICAgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlcyglcyk6IGNvdWxkIG5vdCBhbGxvY2F0ZSBwbmcgaW5mb1xuIiwgZC0+ZmlsZSwKKyAgICAgICAgIGQtPnRlc3QpOworICAgICAgY2xlYW5fZGlzcGxheShkKTsKKyAgICAgIGV4aXQoMSk7CisgICB9CisKKyAgIHBuZ19pbml0X2lvKGQtPnBuZ19wdHIsIGZwKTsKKworIyAgaWZkZWYgUE5HX1JFQURfVVNFUl9DSFVOS1NfU1VQUE9SVEVECisgICAgICAvKiBUaGlzIGlzIG9ubHkgZG9uZSBpZiByZXF1ZXN0ZWQgYnkgdGhlIGNhbGxlcjsgaXQgaW50ZXJmZXJlcyB3aXRoIHRoZQorICAgICAgICogc3RhbmRhcmQgc3RvcmUvc2F2ZSBtZWNoYW5pc20uCisgICAgICAgKi8KKyAgICAgIGlmIChzZXRfY2FsbGJhY2spCisgICAgICAgICBwbmdfc2V0X3JlYWRfdXNlcl9jaHVua19mbihkLT5wbmdfcHRyLCBkLCByZWFkX2NhbGxiYWNrKTsKKyMgIGVsc2UKKyAgICAgIFVOVVNFRChzZXRfY2FsbGJhY2spCisjICBlbmRpZgorCisgICAvKiBIYW5kbGUgZWFjaCBhcmd1bWVudCBpbiB0dXJuOyBtdWx0aXBsZSBzZXR0aW5ncyBhcmUgcG9zc2libGUgZm9yIHRoZSBzYW1lCisgICAgKiBjaHVuayBhbmQgbXVsdGlwbGUgY2FsbHMgd2lsbCBvY2N1ciAodGhlIGxhc3Qgb25lIHNob3VsZCBvdmVycmlkZSBhbGwKKyAgICAqIHByZWNlZGluZyBvbmVzKS4KKyAgICAqLworICAgZm9yIChpPTA7IGk8YXJnYzsgKytpKQorICAgeworICAgICAgY29uc3QgY2hhciAqZXF1YWxzID0gc3RyY2hyKGFyZ3ZbaV0sICc9Jyk7CisKKyAgICAgIGlmIChlcXVhbHMgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIGludCBjaHVuaywgb3B0aW9uOworCisgICAgICAgICBpZiAoc3RyY21wKGVxdWFscysxLCAiZGVmYXVsdCIpID09IDApCisgICAgICAgICAgICBvcHRpb24gPSBQTkdfSEFORExFX0NIVU5LX0FTX0RFRkFVTFQ7CisgICAgICAgICBlbHNlIGlmIChzdHJjbXAoZXF1YWxzKzEsICJkaXNjYXJkIikgPT0gMCkKKyAgICAgICAgICAgIG9wdGlvbiA9IFBOR19IQU5ETEVfQ0hVTktfTkVWRVI7CisgICAgICAgICBlbHNlIGlmIChzdHJjbXAoZXF1YWxzKzEsICJpZi1zYWZlIikgPT0gMCkKKyAgICAgICAgICAgIG9wdGlvbiA9IFBOR19IQU5ETEVfQ0hVTktfSUZfU0FGRTsKKyAgICAgICAgIGVsc2UgaWYgKHN0cmNtcChlcXVhbHMrMSwgInNhdmUiKSA9PSAwKQorICAgICAgICAgICAgb3B0aW9uID0gUE5HX0hBTkRMRV9DSFVOS19BTFdBWVM7CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzKCVzKTogJXM6IHVucmVjb2duaXplZCBjaHVuayBvcHRpb25cbiIsIGQtPmZpbGUsCisgICAgICAgICAgICAgICBkLT50ZXN0LCBhcmd2W2ldKTsKKyAgICAgICAgICAgIGRpc3BsYXlfZXhpdChkKTsKKyAgICAgICAgIH0KKworICAgICAgICAgc3dpdGNoIChlcXVhbHMgLSBhcmd2W2ldKQorICAgICAgICAgeworICAgICAgICAgICAgY2FzZSA0OiAvKiBjaHVuayBuYW1lICovCisgICAgICAgICAgICAgICBjaHVuayA9IGZpbmQoYXJndltpXSk7CisKKyAgICAgICAgICAgICAgIGlmIChjaHVuayA+PSAwKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyogVGhlc2UgI2lmIHRlc3RzIGhhdmUgdGhlIGVmZmVjdCBvZiBza2lwcGluZyB0aGUgYXJndW1lbnRzCisgICAgICAgICAgICAgICAgICAgKiBpZiBTQVZFIHN1cHBvcnQgaXMgdW5hdmFpbGFibGUgLSB3ZSBjYW4ndCBkbyBhIHVzZWZ1bCB0ZXN0CisgICAgICAgICAgICAgICAgICAgKiBpbiB0aGlzIGNhc2UsIHNvIHdlIGp1c3QgY2hlY2sgdGhlIGFyZ3VtZW50cyEgIFRoaXMgY291bGQKKyAgICAgICAgICAgICAgICAgICAqIGJlIGltcHJvdmVkIGluIHRoZSBmdXR1cmUgYnkgdXNpbmcgdGhlIHJlYWQgY2FsbGJhY2suCisgICAgICAgICAgICAgICAgICAgKi8KKyMgICAgICAgICAgICAgICAgIGlmIFBOR19MSUJQTkdfVkVSID49IDEwNzAwICYmXAorICAgICAgICAgICAgICAgICAgICAgIWRlZmluZWQoUE5HX1NBVkVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEKQorICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbiA8IFBOR19IQU5ETEVfQ0hVTktfSUZfU0FGRSkKKyMgICAgICAgICAgICAgICAgIGVuZGlmIC8qIDEuNysgU0FWRV9VTktOT1dOX0NIVU5LUyAqLworICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgcG5nX2J5dGUgbmFtZVs1XTsKKworICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KG5hbWUsIGNodW5rX2luZm9bY2h1bmtdLm5hbWUsIDUpOworICAgICAgICAgICAgICAgICAgICAgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKGQtPnBuZ19wdHIsIG9wdGlvbiwgbmFtZSwgMSk7CisgICAgICAgICAgICAgICAgICAgICBjaHVua19pbmZvW2NodW5rXS5rZWVwID0gb3B0aW9uOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDc6IC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAgICAgIGlmIChtZW1jbXAoYXJndltpXSwgImRlZmF1bHQiLCA3KSA9PSAwKQorICAgICAgICAgICAgICAgeworIyAgICAgICAgICAgICAgICAgaWYgUE5HX0xJQlBOR19WRVIgPj0gMTA3MDAgJiZcCisgICAgICAgICAgICAgICAgICAgICAhZGVmaW5lZChQTkdfU0FWRV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQpCisgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uIDwgUE5HX0hBTkRMRV9DSFVOS19JRl9TQUZFKQorIyAgICAgICAgICAgICAgICAgZW5kaWYgLyogMS43KyBTQVZFX1VOS05PV05fQ0hVTktTICovCisgICAgICAgICAgICAgICAgICAgICBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MoZC0+cG5nX3B0ciwgb3B0aW9uLCBOVUxMLCAwKTsKKworICAgICAgICAgICAgICAgICAgZC0+a2VlcCA9IG9wdGlvbjsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAzOiAvKiBhbGwgKi8KKyAgICAgICAgICAgICAgIGlmIChtZW1jbXAoYXJndltpXSwgImFsbCIsIDMpID09IDApCisgICAgICAgICAgICAgICB7CisjICAgICAgICAgICAgICAgICBpZiBQTkdfTElCUE5HX1ZFUiA+PSAxMDcwMCAmJlwKKyAgICAgICAgICAgICAgICAgICAgICFkZWZpbmVkKFBOR19TQVZFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkKKyAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb24gPCBQTkdfSEFORExFX0NIVU5LX0lGX1NBRkUpCisjICAgICAgICAgICAgICAgICBlbmRpZiAvKiAxLjcrIFNBVkVfVU5LTk9XTl9DSFVOS1MgKi8KKyAgICAgICAgICAgICAgICAgICAgIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyhkLT5wbmdfcHRyLCBvcHRpb24sIE5VTEwsIC0xKTsKKworICAgICAgICAgICAgICAgICAgZC0+a2VlcCA9IG9wdGlvbjsKKworICAgICAgICAgICAgICAgICAgZm9yIChjaHVuayA9IDA7IGNodW5rIDwgTklORk87ICsrY2h1bmspCisgICAgICAgICAgICAgICAgICAgICBpZiAoY2h1bmtfaW5mb1tjaHVua10uYWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtfaW5mb1tjaHVua10ua2VlcCA9IG9wdGlvbjsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDogLyogc29tZSBtaXNwbGFjZWQgPSAqLworCisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZnByaW50ZihzdGRlcnIsICIlcyglcyk6ICVzOiB1bnJlY29nbml6ZWQgY2h1bmsgYXJndW1lbnRcbiIsIGQtPmZpbGUsCisgICAgICAgICBkLT50ZXN0LCBhcmd2W2ldKTsKKyAgICAgIGRpc3BsYXlfZXhpdChkKTsKKyAgIH0KKworICAgcG5nX3JlYWRfaW5mbyhkLT5wbmdfcHRyLCBkLT5pbmZvX3B0cik7CisKKyAgIHN3aXRjaCAocG5nX2dldF9pbnRlcmxhY2VfdHlwZShkLT5wbmdfcHRyLCBkLT5pbmZvX3B0cikpCisgICB7CisgICAgICBjYXNlIFBOR19JTlRFUkxBQ0VfTk9ORToKKyAgICAgICAgIG5wYXNzZXMgPSAxOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUE5HX0lOVEVSTEFDRV9BREFNNzoKKyAgICAgICAgIG5wYXNzZXMgPSBQTkdfSU5URVJMQUNFX0FEQU03X1BBU1NFUzsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAgLyogSGFyZCBlcnJvciBiZWNhdXNlIGl0IGlzIG5vdCB0ZXN0IHNwZWNpZmljICovCisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzKCVzKTogaW52YWxpZCBpbnRlcmxhY2UgdHlwZVxuIiwgZC0+ZmlsZSwgZC0+dGVzdCk7CisgICAgICAgICBjbGVhbl9kaXNwbGF5KGQpOworICAgICAgICAgZXhpdCgxKTsKKyAgIH0KKworICAgLyogU2tpcCB0aGUgaW1hZ2UgZGF0YSwgaWYgSURBVCBpcyBub3QgYmVpbmcgaGFuZGxlZCB0aGVuIGRvbid0IGRvIHRoaXMKKyAgICAqIGJlY2F1c2UgaXQgd2lsbCBjYXVzZSBhIENSQyBlcnJvci4KKyAgICAqLworICAgaWYgKGNodW5rX2luZm9bMC8qSURBVCovXS5rZWVwID09IFBOR19IQU5ETEVfQ0hVTktfQVNfREVGQVVMVCkKKyAgIHsKKyAgICAgIHBuZ19zdGFydF9yZWFkX2ltYWdlKGQtPnBuZ19wdHIpOworICAgICAgaGVpZ2h0ID0gcG5nX2dldF9pbWFnZV9oZWlnaHQoZC0+cG5nX3B0ciwgZC0+aW5mb19wdHIpOworCisgICAgICBpZiAobnBhc3NlcyA+IDEpCisgICAgICB7CisgICAgICAgICBwbmdfdWludF8zMiB3aWR0aCA9IHBuZ19nZXRfaW1hZ2Vfd2lkdGgoZC0+cG5nX3B0ciwgZC0+aW5mb19wdHIpOworCisgICAgICAgICBmb3IgKGlwYXNzPTA7IGlwYXNzPG5wYXNzZXM7ICsraXBhc3MpCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfdWludF8zMiB3UGFzcyA9IFBOR19QQVNTX0NPTFMod2lkdGgsIGlwYXNzKTsKKworICAgICAgICAgICAgaWYgKHdQYXNzID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ191aW50XzMyIHk7CisKKyAgICAgICAgICAgICAgIGZvciAoeT0wOyB5PGhlaWdodDsgKyt5KSBpZiAoUE5HX1JPV19JTl9JTlRFUkxBQ0VfUEFTUyh5LCBpcGFzcykpCisgICAgICAgICAgICAgICAgICBwbmdfcmVhZF9yb3coZC0+cG5nX3B0ciwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9IC8qIGludGVybGFjZWQgKi8KKworICAgICAgZWxzZSAvKiBub3QgaW50ZXJsYWNlZCAqLworICAgICAgeworICAgICAgICAgcG5nX3VpbnRfMzIgeTsKKworICAgICAgICAgZm9yICh5PTA7IHk8aGVpZ2h0OyArK3kpCisgICAgICAgICAgICBwbmdfcmVhZF9yb3coZC0+cG5nX3B0ciwgTlVMTCwgTlVMTCk7CisgICAgICB9CisgICB9CisKKyAgIHBuZ19yZWFkX2VuZChkLT5wbmdfcHRyLCBkLT5lbmRfcHRyKTsKKworICAgZmxhZ3NbMF0gPSBnZXRfdmFsaWQoZCwgZC0+aW5mb19wdHIpOworICAgZmxhZ3NbMV0gPSBnZXRfdW5rbm93bihkLCBkLT5pbmZvX3B0ciwgMC8qYmVmb3JlIElEQVQqLyk7CisKKyAgIC8qIE9ubHkgcG5nX3JlYWRfcG5nIHNldHMgUE5HX0lORk9fSURBVCEgKi8KKyAgIGZsYWdzW2NodW5rX2luZm9bMC8qSURBVCovXS5rZWVwICE9IFBOR19IQU5ETEVfQ0hVTktfQVNfREVGQVVMVF0gfD0KKyAgICAgIFBOR19JTkZPX0lEQVQ7CisKKyAgIGZsYWdzWzJdID0gZ2V0X3ZhbGlkKGQsIGQtPmVuZF9wdHIpOworICAgZmxhZ3NbM10gPSBnZXRfdW5rbm93bihkLCBkLT5lbmRfcHRyLCAxLyphZnRlciBJREFUKi8pOworCisgICBjbGVhbl9kaXNwbGF5KGQpOworCisgICByZXR1cm4gZC0+a2VlcDsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX2Vycm9yKGRpc3BsYXkgKmQsIHBuZ191aW50XzMyIGZsYWdzLCBjb25zdCBjaGFyICptZXNzYWdlKQoreworICAgd2hpbGUgKGZsYWdzKQorICAgeworICAgICAgcG5nX3VpbnRfMzIgZmxhZyA9IGZsYWdzICYgLShwbmdfaW50XzMyKWZsYWdzOworICAgICAgaW50IGkgPSBmaW5kX2J5X2ZsYWcoZmxhZyk7CisKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMoJXMpOiBjaHVuayAlczogJXNcbiIsIGQtPmZpbGUsIGQtPnRlc3QsCisgICAgICAgICBjaHVua19pbmZvW2ldLm5hbWUsIG1lc3NhZ2UpOworICAgICAgKysoZC0+ZXJyb3JfY291bnQpOworCisgICAgICBmbGFncyAmPSB+ZmxhZzsKKyAgIH0KK30KKworc3RhdGljIHZvaWQKK2NoZWNrX2hhbmRsaW5nKGRpc3BsYXkgKmQsIGludCBkZWYsIHBuZ191aW50XzMyIGNodW5rcywgcG5nX3VpbnRfMzIga25vd24sCisgICBwbmdfdWludF8zMiB1bmtub3duLCBjb25zdCBjaGFyICpwb3NpdGlvbiwgaW50IHNldF9jYWxsYmFjaykKK3sKKyAgIHdoaWxlIChjaHVua3MpCisgICB7CisgICAgICBwbmdfdWludF8zMiBmbGFnID0gY2h1bmtzICYgLShwbmdfaW50XzMyKWNodW5rczsKKyAgICAgIGludCBpID0gZmluZF9ieV9mbGFnKGZsYWcpOworICAgICAgaW50IGtlZXAgPSBjaHVua19pbmZvW2ldLmtlZXA7CisgICAgICBjb25zdCBjaGFyICp0eXBlOworICAgICAgY29uc3QgY2hhciAqZXJyb3J4ID0gTlVMTDsKKworICAgICAgaWYgKGNodW5rX2luZm9baV0udW5rbm93bikKKyAgICAgIHsKKyAgICAgICAgIGlmIChrZWVwID09IFBOR19IQU5ETEVfQ0hVTktfQVNfREVGQVVMVCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGUgPSAiVU5LTk9XTiAoZGVmYXVsdCkiOworICAgICAgICAgICAga2VlcCA9IGRlZjsKKyAgICAgICAgIH0KKworICAgICAgICAgZWxzZQorICAgICAgICAgICAgdHlwZSA9ICJVTktOT1dOIChzcGVjaWZpZWQpIjsKKworICAgICAgICAgaWYgKGZsYWcgJiBrbm93bikKKyAgICAgICAgICAgIGVycm9yeCA9ICJjaHVuayBwcm9jZXNzZWQiOworCisgICAgICAgICBlbHNlIHN3aXRjaCAoa2VlcCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgUE5HX0hBTkRMRV9DSFVOS19BU19ERUZBVUxUOgorICAgICAgICAgICAgICAgaWYgKGZsYWcgJiB1bmtub3duKQorICAgICAgICAgICAgICAgICAgZXJyb3J4ID0gIkRFRkFVTFQ6IHVua25vd24gY2h1bmsgc2F2ZWQiOworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgUE5HX0hBTkRMRV9DSFVOS19ORVZFUjoKKyAgICAgICAgICAgICAgIGlmIChmbGFnICYgdW5rbm93bikKKyAgICAgICAgICAgICAgICAgIGVycm9yeCA9ICJESVNDQVJEOiB1bmtub3duIGNodW5rIHNhdmVkIjsKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFBOR19IQU5ETEVfQ0hVTktfSUZfU0FGRToKKyAgICAgICAgICAgICAgIGlmIChhbmNpbGxhcnkoY2h1bmtfaW5mb1tpXS5uYW1lKSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICghKGZsYWcgJiB1bmtub3duKSkKKyAgICAgICAgICAgICAgICAgICAgIGVycm9yeCA9ICJJRi1TQUZFOiB1bmtub3duIGFuY2lsbGFyeSBjaHVuayBsb3N0IjsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgZWxzZSBpZiAoZmxhZyAmIHVua25vd24pCisgICAgICAgICAgICAgICAgICBlcnJvcnggPSAiSUYtU0FGRTogdW5rbm93biBjcml0aWNhbCBjaHVuayBzYXZlZCI7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBQTkdfSEFORExFX0NIVU5LX0FMV0FZUzoKKyAgICAgICAgICAgICAgIGlmICghKGZsYWcgJiB1bmtub3duKSkKKyAgICAgICAgICAgICAgICAgIGVycm9yeCA9ICJTQVZFOiB1bmtub3duIGNodW5rIGxvc3QiOworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICBlcnJvcnggPSAiaW50ZXJuYWwgZXJyb3I6IGJhZCBrZWVwIjsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgfSAvKiB1bmtub3duIGNodW5rICovCisKKyAgICAgIGVsc2UgLyoga25vd24gY2h1bmsgKi8KKyAgICAgIHsKKyAgICAgICAgIHR5cGUgPSAiS05PV04iOworCisgICAgICAgICBpZiAoZmxhZyAmIGtub3duKQorICAgICAgICAgeworICAgICAgICAgICAgLyogY2h1bmsgd2FzIHByb2Nlc3NlZCwgaXQgd29uJ3QgaGF2ZSBiZWVuIHNhdmVkIGJlY2F1c2UgdGhhdCBpcworICAgICAgICAgICAgICogY2F1Z2h0IGJlbG93IHdoZW4gY2hlY2tpbmcgZm9yIGluY29uc2lzdGVudCBwcm9jZXNzaW5nLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoa2VlcCAhPSBQTkdfSEFORExFX0NIVU5LX0FTX0RFRkFVTFQpCisgICAgICAgICAgICAgICBlcnJvcnggPSAiIURFRkFVTFQ6IGtub3duIGNodW5rIHByb2Nlc3NlZCI7CisgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UgLyogbm90IHByb2Nlc3NlZCAqLyBzd2l0Y2ggKGtlZXApCisgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFBOR19IQU5ETEVfQ0hVTktfQVNfREVGQVVMVDoKKyAgICAgICAgICAgICAgIGVycm9yeCA9ICJERUZBVUxUOiBrbm93biBjaHVuayBub3QgcHJvY2Vzc2VkIjsKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFBOR19IQU5ETEVfQ0hVTktfTkVWRVI6CisgICAgICAgICAgICAgICBpZiAoZmxhZyAmIHVua25vd24pCisgICAgICAgICAgICAgICAgICBlcnJvcnggPSAiRElTQ0FSRDoga25vd24gY2h1bmsgc2F2ZWQiOworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgUE5HX0hBTkRMRV9DSFVOS19JRl9TQUZFOgorICAgICAgICAgICAgICAgaWYgKGFuY2lsbGFyeShjaHVua19pbmZvW2ldLm5hbWUpKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKCEoZmxhZyAmIHVua25vd24pKQorICAgICAgICAgICAgICAgICAgICAgZXJyb3J4ID0gIklGLVNBRkU6IGtub3duIGFuY2lsbGFyeSBjaHVuayBsb3N0IjsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgZWxzZSBpZiAoZmxhZyAmIHVua25vd24pCisgICAgICAgICAgICAgICAgICBlcnJvcnggPSAiSUYtU0FGRToga25vd24gY3JpdGljYWwgY2h1bmsgc2F2ZWQiOworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgUE5HX0hBTkRMRV9DSFVOS19BTFdBWVM6CisgICAgICAgICAgICAgICBpZiAoIShmbGFnICYgdW5rbm93bikpCisgICAgICAgICAgICAgICAgICBlcnJvcnggPSAiU0FWRToga25vd24gY2h1bmsgbG9zdCI7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgIGVycm9yeCA9ICJpbnRlcm5hbCBlcnJvcjogYmFkIGtlZXAgKDIpIjsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoZXJyb3J4ICE9IE5VTEwpCisgICAgICB7CisgICAgICAgICArKyhkLT5lcnJvcl9jb3VudCk7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzKCVzJXMpOiAlcyAlcyAlczogJXNcbiIsIGQtPmZpbGUsIGQtPnRlc3QsCisgICAgICAgICAgICBzZXRfY2FsbGJhY2sgPyAiLGNhbGxiYWNrIiA6ICIiLAorICAgICAgICAgICAgdHlwZSwgY2h1bmtfaW5mb1tpXS5uYW1lLCBwb3NpdGlvbiwgZXJyb3J4KTsKKyAgICAgIH0KKworICAgICAgY2h1bmtzICY9IH5mbGFnOworICAgfQorfQorCitzdGF0aWMgdm9pZAorcGVyZm9ybV9vbmVfdGVzdChGSUxFICpmcCwgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LAorICAgcG5nX3VpbnRfMzIgKmRlZmF1bHRfZmxhZ3MsIGRpc3BsYXkgKmQsIGludCBzZXRfY2FsbGJhY2spCit7CisgICBpbnQgZGVmOworICAgcG5nX3VpbnRfMzIgZmxhZ3NbMl1bNF07CisKKyAgIHJld2luZChmcCk7CisgICBjbGVhcl9rZWVwKCk7CisgICBtZW1jcHkoZmxhZ3NbMF0sIGRlZmF1bHRfZmxhZ3MsIHNpemVvZiBmbGFnc1swXSk7CisKKyAgIGRlZiA9IGNoZWNrKGZwLCBhcmdjLCBhcmd2LCBmbGFnc1sxXSwgZCwgc2V0X2NhbGxiYWNrKTsKKworICAgLyogQ2h1bmtzIHNob3VsZCBlaXRoZXIgYmUga25vd24gb3IgdW5rbm93biwgbmV2ZXIgYm90aCBhbmQgdGhpcyBzaG91bGQgYXBwbHkKKyAgICAqIHdoZXRoZXIgdGhlIGNodW5rIGlzIGJlZm9yZSBvciBhZnRlciB0aGUgSURBVCAoYWN0dWFsbHksIHRoZSBhcHAgY2FuCisgICAgKiBwcm9iYWJseSBjaGFuZ2UgdGhpcyBieSBzd2FwcGluZyB0aGUgaGFuZGxpbmcgYWZ0ZXIgdGhlIGltYWdlLCBidXQgdGhpcworICAgICogdGVzdCBkb2VzIG5vdCBkbyB0aGF0LikKKyAgICAqLworICAgY2hlY2tfZXJyb3IoZCwgKGZsYWdzWzBdWzBdfGZsYWdzWzBdWzJdKSAmIChmbGFnc1swXVsxXXxmbGFnc1swXVszXSksCisgICAgICAiY2h1bmsgaGFuZGxlZCBpbmNvbnNpc3RlbnRseSBpbiBjb3VudCB0ZXN0cyIpOworICAgY2hlY2tfZXJyb3IoZCwgKGZsYWdzWzFdWzBdfGZsYWdzWzFdWzJdKSAmIChmbGFnc1sxXVsxXXxmbGFnc1sxXVszXSksCisgICAgICAiY2h1bmsgaGFuZGxlZCBpbmNvbnNpc3RlbnRseSBpbiBvcHRpb24gdGVzdHMiKTsKKworICAgLyogTm93IGZpbmQgb3V0IHdoYXQgaGFwcGVuZWQgdG8gZWFjaCBjaHVuayBiZWZvcmUgYW5kIGFmdGVyIHRoZSBJREFUIGFuZAorICAgICogZGV0ZXJtaW5lIGlmIHRoZSBiZWhhdmlvciB3YXMgY29ycmVjdC4gIEZpcnN0IHNvbWUgYmFzaWMgc2FuaXR5IGNoZWNrcywKKyAgICAqIGFueSBrbm93biBjaHVuayBzaG91bGQgYmUga25vd24gaW4gdGhlIG9yaWdpbmFsIGNvdW50LCBhbnkgdW5rbm93biBjaHVuaworICAgICogc2hvdWxkIGJlIGVpdGhlciBrbm93biBvciB1bmtub3duIGluIHRoZSBvcmlnaW5hbC4KKyAgICAqLworICAgeworICAgICAgcG5nX3VpbnRfMzIgdGVzdDsKKworICAgICAgdGVzdCA9IGZsYWdzWzFdWzBdICYgfmZsYWdzWzBdWzBdOworICAgICAgY2hlY2tfZXJyb3IoZCwgdGVzdCwgIm5ldyBrbm93biBjaHVuayBiZWZvcmUgSURBVCIpOworICAgICAgdGVzdCA9IGZsYWdzWzFdWzFdICYgfihmbGFnc1swXVswXSB8IGZsYWdzWzBdWzFdKTsKKyAgICAgIGNoZWNrX2Vycm9yKGQsIHRlc3QsICJuZXcgdW5rbm93biBjaHVuayBiZWZvcmUgSURBVCIpOworICAgICAgdGVzdCA9IGZsYWdzWzFdWzJdICYgfmZsYWdzWzBdWzJdOworICAgICAgY2hlY2tfZXJyb3IoZCwgdGVzdCwgIm5ldyBrbm93biBjaHVuayBhZnRlciBJREFUIik7CisgICAgICB0ZXN0ID0gZmxhZ3NbMV1bM10gJiB+KGZsYWdzWzBdWzJdIHwgZmxhZ3NbMF1bM10pOworICAgICAgY2hlY2tfZXJyb3IoZCwgdGVzdCwgIm5ldyB1bmtub3duIGNodW5rIGFmdGVyIElEQVQiKTsKKyAgIH0KKworICAgLyogTm93IGVhY2ggY2h1bmsgaW4gdGhlIG9yaWdpbmFsIGxpc3Qgc2hvdWxkIGhhdmUgYmVlbiBoYW5kbGVkIGFjY29yZGluZyB0bworICAgICogdGhlIG9wdGlvbnMgc2V0IGZvciB0aGF0IGNodW5rLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgbGlicG5nIGtub3dzIGFib3V0CisgICAgKiBpdCBvciBub3QuCisgICAgKi8KKyAgIGNoZWNrX2hhbmRsaW5nKGQsIGRlZiwgZmxhZ3NbMF1bMF0gfCBmbGFnc1swXVsxXSwgZmxhZ3NbMV1bMF0sIGZsYWdzWzFdWzFdLAorICAgICAgImJlZm9yZSBJREFUIiwgc2V0X2NhbGxiYWNrKTsKKyAgIGNoZWNrX2hhbmRsaW5nKGQsIGRlZiwgZmxhZ3NbMF1bMl0gfCBmbGFnc1swXVszXSwgZmxhZ3NbMV1bMl0sIGZsYWdzWzFdWzNdLAorICAgICAgImFmdGVyIElEQVQiLCBzZXRfY2FsbGJhY2spOworfQorCitzdGF0aWMgdm9pZAorcGVyZm9ybV9vbmVfdGVzdF9zYWZlKEZJTEUgKmZwLCBpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsCisgICBwbmdfdWludF8zMiAqZGVmYXVsdF9mbGFncywgZGlzcGxheSAqZCwgY29uc3QgY2hhciAqdGVzdCkKK3sKKyAgIGlmIChzZXRqbXAoZC0+ZXJyb3JfcmV0dXJuKSA9PSAwKQorICAgeworICAgICAgZC0+dGVzdCA9IHRlc3Q7IC8qIGFsbG93IHVzZSBvZiBkLT5lcnJvcl9yZXR1cm4gKi8KKyMgICAgIGlmZGVmIFBOR19TQVZFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAorICAgICAgICAgcGVyZm9ybV9vbmVfdGVzdChmcCwgYXJnYywgYXJndiwgZGVmYXVsdF9mbGFncywgZCwgMCk7CisjICAgICBlbmRpZgorIyAgICAgaWZkZWYgUE5HX1JFQURfVVNFUl9DSFVOS1NfU1VQUE9SVEVECisgICAgICAgICBwZXJmb3JtX29uZV90ZXN0KGZwLCBhcmdjLCBhcmd2LCBkZWZhdWx0X2ZsYWdzLCBkLCAxKTsKKyMgICAgIGVuZGlmCisgICAgICBkLT50ZXN0ID0gaW5pdDsgLyogcHJldmVudCB1c2Ugb2YgZC0+ZXJyb3JfcmV0dXJuICovCisgICB9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpzdGFuZGFyZF90ZXN0c1tdID0KK3sKKyAiZGlzY2FyZCIsICJkZWZhdWx0PWRpc2NhcmQiLCAwLAorICJzYXZlIiwgImRlZmF1bHQ9c2F2ZSIsIDAsCisgImlmLXNhZmUiLCAiZGVmYXVsdD1pZi1zYWZlIiwgMCwKKyAidnBBZyIsICJ2cEFnPWlmLXNhZmUiLCAwLAorICJzVEVSIiwgInNURVI9aWYtc2FmZSIsIDAsCisgIklEQVQiLCAiZGVmYXVsdD1kaXNjYXJkIiwgIklEQVQ9c2F2ZSIsIDAsCisgInNBUEkiLCAiYktHRD1zYXZlIiwgImNIUk09c2F2ZSIsICJnQU1BPXNhdmUiLCAiYWxsPWRpc2NhcmQiLCAiaUNDUD1zYXZlIiwKKyAgICJzQklUPXNhdmUiLCAic1JHQj1zYXZlIiwgMCwKKyAwLyplbmQqLworfTsKKworc3RhdGljIFBOR19OT1JFVFVSTiB2b2lkCit1c2FnZShjb25zdCBjaGFyICpwcm9ncmFtLCBjb25zdCBjaGFyICpyZWFzb24pCit7CisgICBmcHJpbnRmKHN0ZGVyciwgInBuZ3Vua25vd246ICVzOiB1c2FnZTpcbiAlcyBbLS1zdHJpY3RdICIKKyAgICAgICItLWRlZmF1bHR8eyhDSE5LfGRlZmF1bHR8YWxsKT0oZGVmYXVsdHxkaXNjYXJkfGlmLXNhZmV8c2F2ZSl9ICIKKyAgICAgICJ0ZXN0ZmlsZS5wbmdcbiIsIHJlYXNvbiwgcHJvZ3JhbSk7CisgICBleGl0KDk5KTsKK30KKworaW50CittYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKyAgIEZJTEUgKmZwOworICAgcG5nX3VpbnRfMzIgZGVmYXVsdF9mbGFnc1s0Lyp2YWxpZCx1bmtub3due2JlZm9yZSxhZnRlcn0qL107CisgICBpbnQgc3RyaWN0ID0gMCwgZGVmYXVsdF90ZXN0cyA9IDA7CisgICBjb25zdCBjaGFyICpjb3VudF9hcmd2ID0gImRlZmF1bHQ9c2F2ZSI7CisgICBjb25zdCBjaGFyICp0b3VjaF9maWxlID0gTlVMTDsKKyAgIGRpc3BsYXkgZDsKKworICAgaW5pdF9kaXNwbGF5KCZkLCBhcmd2WzBdKTsKKworICAgd2hpbGUgKCsrYXJndiwgLS1hcmdjID4gMCkKKyAgIHsKKyAgICAgIGlmIChzdHJjbXAoKmFyZ3YsICItLXN0cmljdCIpID09IDApCisgICAgICAgICBzdHJpY3QgPSAxOworCisgICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItLWRlZmF1bHQiKSA9PSAwKQorICAgICAgICAgZGVmYXVsdF90ZXN0cyA9IDE7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tdG91Y2giKSA9PSAwKQorICAgICAgeworICAgICAgICAgaWYgKGFyZ2MgPiAxKQorICAgICAgICAgICAgdG91Y2hfZmlsZSA9ICorK2FyZ3YsIC0tYXJnYzsKKworICAgICAgICAgZWxzZQorICAgICAgICAgICAgdXNhZ2UoZC5wcm9ncmFtLCAiLS10b3VjaDogbWlzc2luZyBmaWxlIG5hbWUiKTsKKyAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgICAgYnJlYWs7CisgICB9CisKKyAgIC8qIEEgZmlsZSBuYW1lIGlzIHJlcXVpcmVkLCBidXQgdGhlcmUgc2hvdWxkIGJlIG5vIG90aGVyIGFyZ3VtZW50cyBpZgorICAgICogLS1kZWZhdWx0IHdhcyBzcGVjaWZpZWQuCisgICAgKi8KKyAgIGlmIChhcmdjIDw9IDApCisgICAgICB1c2FnZShkLnByb2dyYW0sICJtaXNzaW5nIHRlc3QgZmlsZSIpOworCisgICAvKiBHQ0MgQlVHOiBpZiAoZGVmYXVsdF90ZXN0cyAmJiBhcmdjICE9IDEpIHRyaWdnZXJzIHNvbWUgd2VpcmQgR0NDIGFyZ2MKKyAgICAqIG9wdGltaXphdGlvbiB3aGljaCBjYXVzZXMgd2FybmluZ3Mgd2l0aCAtV3N0cmljdC1vdmVyZmxvdyEKKyAgICAqLworICAgZWxzZSBpZiAoZGVmYXVsdF90ZXN0cykgaWYgKGFyZ2MgIT0gMSkKKyAgICAgIHVzYWdlKGQucHJvZ3JhbSwgImV4dHJhIGFyZ3VtZW50cyIpOworCisgICAvKiBUaGUgbmFtZSBvZiB0aGUgdGVzdCBmaWxlIGlzIHRoZSBsYXN0IGFyZ3VtZW50OyByZW1vdmUgaXQuICovCisgICBkLmZpbGUgPSBhcmd2Wy0tYXJnY107CisKKyAgIGZwID0gZm9wZW4oZC5maWxlLCAicmIiKTsKKyAgIGlmIChmcCA9PSBOVUxMKQorICAgeworICAgICAgcGVycm9yKGQuZmlsZSk7CisgICAgICBleGl0KDk5KTsKKyAgIH0KKworICAgLyogRmlyc3QgZmluZCBhbGwgdGhlIGNodW5rcywga25vd24gYW5kIHVua25vd24sIGluIHRoZSB0ZXN0IGZpbGUsIGEgZmFpbHVyZQorICAgICogaGVyZSBhYm9ydHMgdGhlIHdob2xlIHRlc3QuCisgICAgKgorICAgICogSWYgJ3NhdmUnIGlzIHN1cHBvcnRlZCB0aGVuIHRoZSBub3JtYWwgc2F2aW5nIG1ldGhvZCBzaG91bGQgaGFwcGVuLAorICAgICogb3RoZXJ3aXNlIGlmICdyZWFkJyBpcyBzdXBwb3J0ZWQgdGhlbiB0aGUgcmVhZCBjYWxsYmFjayB3aWxsIGRvIHRoZQorICAgICogc2FtZSB0aGluZy4gIElmIGJvdGggYXJlIHN1cHBvcnRlZCB0aGUgJ3JlYWQnIGNhbGxiYWNrIHdvbid0IGJlCisgICAgKiBpbnN0YW50aWF0ZWQgYnkgZGVmYXVsdC4gIElmICdzYXZlJyBpcyAqbm90KiBzdXBwb3J0ZWQgdGhlbiBhIHVzZXIKKyAgICAqIGNhbGxiYWNrIGlzIHJlcXVpcmVkIGV2ZW4gdGhvdWdoIHdlIGNhbiBjYWxsIHBuZ19nZXRfdW5rbm93bl9jaHVua3MuCisgICAgKi8KKyAgIGlmIChjaGVjayhmcCwgMSwgJmNvdW50X2FyZ3YsIGRlZmF1bHRfZmxhZ3MsICZkLAorIyAgICAgaWZkZWYgUE5HX1NBVkVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECisgICAgICAgICAwCisjICAgICBlbHNlCisgICAgICAgICAxCisjICAgICBlbmRpZgorICAgICAgKSAhPSBQTkdfSEFORExFX0NIVU5LX0FMV0FZUykKKyAgIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICVzOiBpbnRlcm5hbCBlcnJvclxuIiwgZC5wcm9ncmFtLCBkLmZpbGUpOworICAgICAgZXhpdCg5OSk7CisgICB9CisKKyAgIC8qIE5vdyBmaW5kIHdoYXQgdGhlIHZhcmlvdXMgc3VwcGxpZWQgb3B0aW9ucyBjYXVzZSB0byBjaGFuZ2U6ICovCisgICBpZiAoIWRlZmF1bHRfdGVzdHMpCisgICB7CisgICAgICBkLnRlc3QgPSBjbWQ7IC8qIGFjdHMgYXMgYSBmbGFnIHRvIHNheSBleGl0LCBkbyBub3QgbG9uZ2ptcCAqLworIyAgICAgaWZkZWYgUE5HX1NBVkVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECisgICAgICAgICBwZXJmb3JtX29uZV90ZXN0KGZwLCBhcmdjLCBhcmd2LCBkZWZhdWx0X2ZsYWdzLCAmZCwgMCk7CisjICAgICBlbmRpZgorIyAgICAgaWZkZWYgUE5HX1JFQURfVVNFUl9DSFVOS1NfU1VQUE9SVEVECisgICAgICAgICBwZXJmb3JtX29uZV90ZXN0KGZwLCBhcmdjLCBhcmd2LCBkZWZhdWx0X2ZsYWdzLCAmZCwgMSk7CisjICAgICBlbmRpZgorICAgICAgZC50ZXN0ID0gaW5pdDsKKyAgIH0KKworICAgZWxzZQorICAgeworICAgICAgY29uc3QgY2hhciAqKnRlc3QgPSBzdGFuZGFyZF90ZXN0czsKKworICAgICAgLyogU2V0IHRoZSBleGl0X3Rlc3QgcG9pbnRlciBoZXJlIHNvIHdlIGNhbiBjb250aW51ZSBhZnRlciBhIGxpYnBuZyBlcnJvci4KKyAgICAgICAqIE5PVEU6IHRoaXMgbGVha3MgbWVtb3J5IGJlY2F1c2UgdGhlIHBuZ19zdHJ1Y3QgZGF0YSBmcm9tIHRoZSBmYWlsaW5nCisgICAgICAgKiB0ZXN0IGlzIG5ldmVyIGZyZWVkLgorICAgICAgICovCisgICAgICB3aGlsZSAoKnRlc3QpCisgICAgICB7CisgICAgICAgICBjb25zdCBjaGFyICp0aGlzX3Rlc3QgPSAqdGVzdCsrOworICAgICAgICAgY29uc3QgY2hhciAqKm5leHQgPSB0ZXN0OworICAgICAgICAgaW50IGNvdW50ID0gZGlzcGxheV9yYygmZCwgc3RyaWN0KSwgbmV3X2NvdW50OworICAgICAgICAgY29uc3QgY2hhciAqcmVzdWx0OworICAgICAgICAgaW50IGFyZ19jb3VudCA9IDA7CisKKyAgICAgICAgIHdoaWxlICgqbmV4dCkgKytuZXh0LCArK2FyZ19jb3VudDsKKworICAgICAgICAgcGVyZm9ybV9vbmVfdGVzdF9zYWZlKGZwLCBhcmdfY291bnQsIHRlc3QsIGRlZmF1bHRfZmxhZ3MsICZkLAorICAgICAgICAgICAgdGhpc190ZXN0KTsKKworICAgICAgICAgbmV3X2NvdW50ID0gZGlzcGxheV9yYygmZCwgc3RyaWN0KTsKKworICAgICAgICAgaWYgKG5ld19jb3VudCA9PSBjb3VudCkKKyAgICAgICAgICAgIHJlc3VsdCA9ICJQQVNTIjsKKworICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzdWx0ID0gIkZBSUwiOworCisgICAgICAgICBwcmludGYoIiVzOiAlcyAlc1xuIiwgcmVzdWx0LCBkLnByb2dyYW0sIHRoaXNfdGVzdCk7CisKKyAgICAgICAgIHRlc3QgPSBuZXh0KzE7CisgICAgICB9CisgICB9CisKKyAgIGZjbG9zZShmcCk7CisKKyAgIGlmIChkaXNwbGF5X3JjKCZkLCBzdHJpY3QpID09IDApCisgICB7CisgICAgICAvKiBTdWNjZXNzLCB0b3VjaCB0aGUgc3VjY2VzcyBmaWxlIGlmIGFwcHJvcHJpYXRlICovCisgICAgICBpZiAodG91Y2hfZmlsZSAhPSBOVUxMKQorICAgICAgeworICAgICAgICAgRklMRSAqZnN1Y2Nlc3MgPSBmb3Blbih0b3VjaF9maWxlLCAid3QiKTsKKworICAgICAgICAgaWYgKGZzdWNjZXNzICE9IE5VTEwpCisgICAgICAgICB7CisgICAgICAgICAgICBpbnQgZXJyID0gMDsKKyAgICAgICAgICAgIGZwcmludGYoZnN1Y2Nlc3MsICJQTkcgdW5rbm93biB0ZXN0cyBzdWNjZWVkZWRcbiIpOworICAgICAgICAgICAgZmZsdXNoKGZzdWNjZXNzKTsKKyAgICAgICAgICAgIGVyciA9IGZlcnJvcihmc3VjY2Vzcyk7CisKKyAgICAgICAgICAgIGlmIChmY2xvc2UoZnN1Y2Nlc3MpIHx8IGVycikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHdyaXRlIGZhaWxlZFxuIiwgdG91Y2hfZmlsZSk7CisgICAgICAgICAgICAgICBleGl0KDk5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogb3BlbiBmYWlsZWRcbiIsIHRvdWNoX2ZpbGUpOworICAgICAgICAgICAgZXhpdCg5OSk7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiAwOworICAgfQorCisgICByZXR1cm4gMTsKK30KKworI2Vsc2UgLyogIShSRUFEX1VTRVJfQ0hVTktTIHx8IFNBVkVfVU5LTk9XTl9DSFVOS1MpICovCitpbnQKK21haW4odm9pZCkKK3sKKyAgIGZwcmludGYoc3RkZXJyLAorICAgICAgIiB0ZXN0IGlnbm9yZWQ6IG5vIHN1cHBvcnQgdG8gZmluZCBvdXQgYWJvdXQgdW5rbm93biBjaHVua3NcbiIpOworICAgLyogU28gdGhlIHRlc3QgaXMgc2tpcHBlZDogKi8KKyAgIHJldHVybiA3NzsKK30KKyNlbmRpZiAvKiBSRUFEX1VTRVJfQ0hVTktTIHx8IFNBVkVfVU5LTk9XTl9DSFVOS1MgKi8KKworI2Vsc2UgLyogIShTRVRfVU5LTk9XTl9DSFVOS1MgJiYgUkVBRCkgKi8KK2ludAorbWFpbih2b2lkKQoreworICAgZnByaW50ZihzdGRlcnIsCisgICAgICAiIHRlc3QgaWdub3JlZDogbm8gc3VwcG9ydCB0byBtb2RpZnkgdW5rbm93biBjaHVuayBoYW5kbGluZ1xuIik7CisgICAvKiBTbyB0aGUgdGVzdCBpcyBza2lwcGVkOiAqLworICAgcmV0dXJuIDc3OworfQorI2VuZGlmIC8qIFNFVF9VTktOT1dOX0NIVU5LUyAmJiBSRUFEKi8KZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL2xpYnRlc3RzL3BuZ3ZhbGlkLmMgYi9saWJwbmcvY29udHJpYi9saWJ0ZXN0cy9wbmd2YWxpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZDNjOTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9saWJ0ZXN0cy9wbmd2YWxpZC5jCkBAIC0wLDAgKzEsMTE3NDYgQEAKKworLyogcG5ndmFsaWQuYyAtIHZhbGlkYXRlIGxpYnBuZyBieSBjb25zdHJ1Y3RpbmcgdGhlbiByZWFkaW5nIHBuZyBmaWxlcy4KKyAqCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNS4yNSBbRGVjZW1iZXIgMywgMjAxNV0KKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogV3JpdHRlbiBieSBKb2huIEN1bm5pbmdoYW0gQm93bGVyCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCisgKgorICogTk9URVM6CisgKiAgIFRoaXMgaXMgYSBDIHByb2dyYW0gdGhhdCBpcyBpbnRlbmRlZCB0byBiZSBsaW5rZWQgYWdhaW5zdCBsaWJwbmcuICBJdAorICogICBnZW5lcmF0ZXMgYml0bWFwcyBpbnRlcm5hbGx5LCBzdG9yZXMgdGhlbSBhcyBQTkcgZmlsZXMgKHVzaW5nIHRoZQorICogICBzZXF1ZW50aWFsIHdyaXRlIGNvZGUpIHRoZW4gcmVhZHMgdGhlbSBiYWNrICh1c2luZyB0aGUgc2VxdWVudGlhbAorICogICByZWFkIGNvZGUpIGFuZCB2YWxpZGF0ZXMgdGhhdCB0aGUgcmVzdWx0IGhhcyB0aGUgY29ycmVjdCBkYXRhLgorICoKKyAqICAgVGhlIHByb2dyYW0gY2FuIGJlIG1vZGlmaWVkIGFuZCBleHRlbmRlZCB0byB0ZXN0IHRoZSBjb3JyZWN0bmVzcyBvZgorICogICB0cmFuc2Zvcm1hdGlvbnMgcGVyZm9ybWVkIGJ5IGxpYnBuZy4KKyAqLworCisjZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQorI2RlZmluZSBfSVNPQzk5X1NPVVJDRSAxIC8qIEZvciBmbG9hdGluZyBwb2ludCAqLworI2RlZmluZSBfR05VX1NPVVJDRSAxIC8qIEZvciB0aGUgZmxvYXRpbmcgcG9pbnQgZXhjZXB0aW9uIGV4dGVuc2lvbiAqLworCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmIGRlZmluZWQoSEFWRV9DT05GSUdfSCkgJiYgIWRlZmluZWQoUE5HX05PX0NPTkZJR19IKQorIyAgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfRkVFTkFCTEVFWENFUFQgLyogZnJvbSBjb25maWcuaCwgaWYgaW5jbHVkZWQgKi8KKyMgIGluY2x1ZGUgPGZlbnYuaD4KKyNlbmRpZgorCisjaWZuZGVmIEZFX0RJVkJZWkVSTworIyAgZGVmaW5lIEZFX0RJVkJZWkVSTyAwCisjZW5kaWYKKyNpZm5kZWYgRkVfSU5WQUxJRAorIyAgZGVmaW5lIEZFX0lOVkFMSUQgMAorI2VuZGlmCisjaWZuZGVmIEZFX09WRVJGTE9XCisjICBkZWZpbmUgRkVfT1ZFUkZMT1cgMAorI2VuZGlmCisKKy8qIERlZmluZSB0aGUgZm9sbG93aW5nIHRvIHVzZSB0aGlzIHRlc3QgYWdhaW5zdCB5b3VyIGluc3RhbGxlZCBsaWJwbmcsIHJhdGhlcgorICogdGhhbiB0aGUgb25lIGJlaW5nIGJ1aWx0IGhlcmU6CisgKi8KKyNpZmRlZiBQTkdfRlJFRVNUQU5ESU5HX1RFU1RTCisjICBpbmNsdWRlIDxwbmcuaD4KKyNlbHNlCisjICBpbmNsdWRlICIuLi8uLi9wbmcuaCIKKyNlbmRpZgorCisjaWZkZWYgUE5HX1pMSUJfSEVBREVSCisjICBpbmNsdWRlIFBOR19aTElCX0hFQURFUgorI2Vsc2UKKyMgIGluY2x1ZGUgPHpsaWIuaD4gICAvKiBGb3IgY3JjMzIgKi8KKyNlbmRpZgorCisvKiAxLjYuMSBhZGRlZCBzdXBwb3J0IGZvciB0aGUgY29uZmlndXJlIHRlc3QgaGFybmVzcywgd2hpY2ggdXNlcyA3NyB0byBpbmRpY2F0ZQorICogYSBza2lwcGVkIHRlc3QsIGluIGVhcmxpZXIgdmVyc2lvbnMgd2UgbmVlZCB0byBzdWNjZWVkIG9uIGEgc2tpcHBlZCB0ZXN0LCBzbzoKKyAqLworI2lmIFBOR19MSUJQTkdfVkVSIDwgMTA2MDEKKyMgIGRlZmluZSBTS0lQIDAKKyNlbHNlCisjICBkZWZpbmUgU0tJUCA3NworI2VuZGlmCisKKy8qIHBuZ3ZhbGlkIHJlcXVpcmVzIHdyaXRlIHN1cHBvcnQgYW5kIG9uZSBvZiB0aGUgZml4ZWQgb3IgZmxvYXRpbmcgcG9pbnQgQVBJcy4KKyAqLworI2lmIGRlZmluZWQoUE5HX1dSSVRFX1NVUFBPUlRFRCkgJiZcCisgICAoZGVmaW5lZChQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQpKQorCisjaWYgUE5HX0xJQlBOR19WRVIgPCAxMDUwMAorLyogVGhpcyBkZWxpYmVyYXRlbHkgbGFja3MgdGhlIGNvbnN0LiAqLwordHlwZWRlZiBwbmdfYnl0ZSAqcG5nX2NvbnN0X2J5dGVwOworCisvKiBUaGlzIGlzIGNvcGllZCBmcm9tIDEuNS4xIHBuZy5oOiAqLworI2RlZmluZSBQTkdfSU5URVJMQUNFX0FEQU03X1BBU1NFUyA3CisjZGVmaW5lIFBOR19QQVNTX1NUQVJUX1JPVyhwYXNzKSAoKCgxVSZ+KHBhc3MpKTw8KDMtKChwYXNzKT4+MSkpKSY3KQorI2RlZmluZSBQTkdfUEFTU19TVEFSVF9DT0wocGFzcykgKCgoMVUmIChwYXNzKSk8PCgzLSgoKHBhc3MpKzEpPj4xKSkpJjcpCisjZGVmaW5lIFBOR19QQVNTX1JPV19TSElGVChwYXNzKSAoKHBhc3MpPjI/KDgtKHBhc3MpKT4+MTozKQorI2RlZmluZSBQTkdfUEFTU19DT0xfU0hJRlQocGFzcykgKChwYXNzKT4xPyg3LShwYXNzKSk+PjE6MykKKyNkZWZpbmUgUE5HX1BBU1NfUk9XUyhoZWlnaHQsIHBhc3MpICgoKGhlaWdodCkrKCgoMTw8UE5HX1BBU1NfUk9XX1NISUZUKHBhc3MpKVwKKyAgIC0xKS1QTkdfUEFTU19TVEFSVF9ST1cocGFzcykpKT4+UE5HX1BBU1NfUk9XX1NISUZUKHBhc3MpKQorI2RlZmluZSBQTkdfUEFTU19DT0xTKHdpZHRoLCBwYXNzKSAoKCh3aWR0aCkrKCgoMTw8UE5HX1BBU1NfQ09MX1NISUZUKHBhc3MpKVwKKyAgIC0xKS1QTkdfUEFTU19TVEFSVF9DT0wocGFzcykpKT4+UE5HX1BBU1NfQ09MX1NISUZUKHBhc3MpKQorI2RlZmluZSBQTkdfUk9XX0ZST01fUEFTU19ST1coeUluLCBwYXNzKSBcCisgICAoKCh5SW4pPDxQTkdfUEFTU19ST1dfU0hJRlQocGFzcykpK1BOR19QQVNTX1NUQVJUX1JPVyhwYXNzKSkKKyNkZWZpbmUgUE5HX0NPTF9GUk9NX1BBU1NfQ09MKHhJbiwgcGFzcykgXAorICAgKCgoeEluKTw8UE5HX1BBU1NfQ09MX1NISUZUKHBhc3MpKStQTkdfUEFTU19TVEFSVF9DT0wocGFzcykpCisjZGVmaW5lIFBOR19QQVNTX01BU0socGFzcyxvZmYpICggXAorICAgKCgweDExMDE0NUFGVT4+KCgoNy0ob2ZmKSktKHBhc3MpKTw8MikpICYgMHhGVSkgfCBcCisgICAoKDB4MDExNDVBRjBVPj4oKCg3LShvZmYpKS0ocGFzcykpPDwyKSkgJiAweEYwVSkpCisjZGVmaW5lIFBOR19ST1dfSU5fSU5URVJMQUNFX1BBU1MoeSwgcGFzcykgXAorICAgKChQTkdfUEFTU19NQVNLKHBhc3MsMCkgPj4gKCh5KSY3KSkgJiAxKQorI2RlZmluZSBQTkdfQ09MX0lOX0lOVEVSTEFDRV9QQVNTKHgsIHBhc3MpIFwKKyAgICgoUE5HX1BBU1NfTUFTSyhwYXNzLDEpID4+ICgoeCkmNykpICYgMSkKKworLyogVGhlc2UgYXJlIG5lZWRlZCB0b28gZm9yIHRoZSBkZWZhdWx0IGJ1aWxkOiAqLworI2RlZmluZSBQTkdfV1JJVEVfMTZCSVRfU1VQUE9SVEVECisjZGVmaW5lIFBOR19SRUFEXzE2QklUX1NVUFBPUlRFRAorCisvKiBUaGlzIGNvbWVzIGZyb20gcG5nbGliY29uZi5oIGFmZXIgMS41OiAqLworI2RlZmluZSBQTkdfRlBfMSAxMDAwMDAKKyNkZWZpbmUgUE5HX0dBTU1BX1RIUkVTSE9MRF9GSVhFRFwKKyAgICgocG5nX2ZpeGVkX3BvaW50KShQTkdfR0FNTUFfVEhSRVNIT0xEICogUE5HX0ZQXzEpKQorI2VuZGlmCisKKyNpZiBQTkdfTElCUE5HX1ZFUiA8IDEwNjAwCisgICAvKiAxLjYuMCBjb25zdGlmaWVzIG1hbnkgQVBJcywgdGhlIGZvbGxvd2luZyBleGlzdHMgdG8gYWxsb3cgcG5ndmFsaWQgdG8gYmUKKyAgICAqIGNvbXBpbGVkIGFnYWluc3QgZWFybGllciB2ZXJzaW9ucy4KKyAgICAqLworIyAgZGVmaW5lIHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19zdHJ1Y3RwCisjZW5kaWYKKworI2luY2x1ZGUgPGZsb2F0Lmg+ICAvKiBGb3IgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzICovCisjaW5jbHVkZSA8c3RkbGliLmg+IC8qIEZvciBtYWxsb2MgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4gLyogRm9yIG1lbWNweSwgbWVtc2V0ICovCisjaW5jbHVkZSA8bWF0aC5oPiAgIC8qIEZvciBmbG9vciAqLworCisvKiBVbnVzZWQgZm9ybWFsIHBhcmFtZXRlciBlcnJvcnMgYXJlIHJlbW92ZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBtYWNybyB3aGljaCBpcworICogZXhwZWN0ZWQgdG8gaGF2ZSBubyBiYWQgZWZmZWN0cyBvbiBwZXJmb3JtYW5jZS4KKyAqLworI2lmbmRlZiBVTlVTRUQKKyMgIGlmIGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX01TQ19WRVIpCisjICAgICBkZWZpbmUgVU5VU0VEKHBhcmFtKSAodm9pZClwYXJhbTsKKyMgIGVsc2UKKyMgICAgIGRlZmluZSBVTlVTRUQocGFyYW0pCisjICBlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBFWENFUFRJT04gSEFORExJTkcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgUE5HX0ZSRUVTVEFORElOR19URVNUUworIyAgaW5jbHVkZSA8Y2V4Y2VwdC5oPgorI2Vsc2UKKyMgIGluY2x1ZGUgIi4uL3Zpc3VwbmcvY2V4Y2VwdC5oIgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworIyAgZGVmaW5lIHRoaXMgbm90X3RoZV9jcHBfdGhpcworIyAgZGVmaW5lIG5ldyBub3RfdGhlX2NwcF9uZXcKKyMgIGRlZmluZSB2b2lkY2FzdCh0eXBlLCB2YWx1ZSkgc3RhdGljX2Nhc3Q8dHlwZT4odmFsdWUpCisjZWxzZQorIyAgZGVmaW5lIHZvaWRjYXN0KHR5cGUsIHZhbHVlKSAodmFsdWUpCisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworc3RydWN0IHBuZ19zdG9yZTsKK2RlZmluZV9leGNlcHRpb25fdHlwZShzdHJ1Y3QgcG5nX3N0b3JlKik7CisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIG1hY3JvcyB0byByZWR1Y2UgdHlwaW5nIGV2ZXJ5d2hlcmUgd2hlcmUgdGhlIHdlbGwga25vd24KKyAqIG5hbWUgJ3RoZV9leGNlcHRpb25fY29udGV4dCcgbXVzdCBiZSBkZWZpbmVkLgorICovCisjZGVmaW5lIGFub25fY29udGV4dChwcykgc3RydWN0IGV4Y2VwdGlvbl9jb250ZXh0ICp0aGVfZXhjZXB0aW9uX2NvbnRleHQgPSBcCisgICAmKHBzKS0+ZXhjZXB0aW9uX2NvbnRleHQKKyNkZWZpbmUgY29udGV4dChwcyxmYXVsdCkgYW5vbl9jb250ZXh0KHBzKTsgcG5nX3N0b3JlICpmYXVsdAorCisvKiBUaGlzIG1hY3JvIHJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhbiBhcnJheSBhcyBhbiAodW5zaWduZWQgaW50KSwKKyAqIGl0IGlzIG5lY2Vzc2FyeSB0byBhdm9pZCB0aGUgaW5hYmlsaXR5IG9mIGNlcnRhaW4gdmVyc2lvbnMgb2YgR0NDIHRvIHVzZQorICogdGhlIHZhbHVlIG9mIGEgY29tcGlsZS10aW1lIGNvbnN0YW50IHdoZW4gcGVyZm9ybWluZyByYW5nZSBjaGVja3MuICBJdCBtdXN0CisgKiBiZSBwYXNzZWQgYW4gYXJyYXkgbmFtZS4KKyAqLworI2RlZmluZSBBUlJBWV9TSVpFKGEpICgodW5zaWduZWQgaW50KSgoc2l6ZW9mIChhKSkvKHNpemVvZiAoYSlbMF0pKSkKKworLyogR0NDIEJVRyA2NjQ0NyAoaHR0cHM6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NjY0NDcpIHJlcXVpcmVzCisgKiBzb21lIGJyb2tlbiBHQ0MgdmVyc2lvbnMgdG8gYmUgZml4ZWQgdXAgdG8gYXZvaWQgaW52YWxpZCB3aGluaW5nIGFib3V0IGF1dG8KKyAqIHZhcmlhYmxlcyB0aGF0IGFyZSAqbm90KiBjaGFuZ2VkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYSBzZXRqbXAgYmVpbmcgY2hhbmdlZC4KKyAqCisgKiBGZWVsIGZyZWUgdG8gZXh0ZW5kIHRoZSBsaXN0IG9mIGJyb2tlbiB2ZXJzaW9ucy4KKyAqLworI2RlZmluZSBpc19nbnUobWFqb3IsbWlub3IpXAorICAgKGRlZmluZWQgX19HTlVDX18pICYmIF9fR05VQ19fID09IChtYWpvcikgJiYgX19HTlVDX01JTk9SX18gPT0gKG1pbm9yKQorI2RlZmluZSBpc19nbnVfcGF0Y2gobWFqb3IsbWlub3IscGF0Y2gpXAorICAgaXNfZ251KG1ham9yLG1pbm9yKSAmJiBfX0dOVUNfUEFUQ0hMRVZFTF9fID09IDAKKy8qIEZvciB0aGUgbW9tZW50IGp1c3QgZG8gaXQgYWx3YXlzOyBhbGwgdmVyc2lvbnMgb2YgR0NDIHNlZW0gdG8gYmUgYnJva2VuOiAqLworI2lmZGVmIF9fR05VQ19fCisgICBjb25zdCB2b2lkICogdm9sYXRpbGUgbWFrZV92b2xhdGlsZV9mb3JfZ251OworIyAgZGVmaW5lIGdudV92b2xhdGlsZSh4KSBtYWtlX3ZvbGF0aWxlX2Zvcl9nbnUgPSAmeDsKKyNlbHNlIC8qICFHTlVDIGJyb2tlbiB2ZXJzaW9ucyAqLworIyAgZGVmaW5lIGdudV92b2xhdGlsZSh4KQorI2VuZGlmIC8qICFHTlVDIGJyb2tlbiB2ZXJzaW9ucyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVVElMSVRJRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRXJyb3IgaGFuZGxpbmcgaXMgcGFydGljdWxhcmx5IHByb2JsZW1hdGljIGluIHByb2R1Y3Rpb24gY29kZSAtIGVycm9yCisgKiBoYW5kbGVycyBvZnRlbiB0aGVtc2VsdmVzIGhhdmUgYnVncyB3aGljaCBsZWFkIHRvIHByb2dyYW1zIHRoYXQgZGV0ZWN0CisgKiBtaW5vciBlcnJvcnMgY3Jhc2hpbmcuICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBkZWFsIHdpdGggb25lIHZlcnkKKyAqIGNvbW1vbiBjbGFzcyBvZiBlcnJvcnMgaW4gZXJyb3IgaGFuZGxlcnMgLSBhdHRlbXB0aW5nIHRvIGZvcm1hdCBlcnJvciBvcgorICogd2FybmluZyBtZXNzYWdlcyBpbnRvIGJ1ZmZlcnMgdGhhdCBhcmUgdG9vIHNtYWxsLgorICovCitzdGF0aWMgc2l6ZV90IHNhZmVjYXQoY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmc2l6ZSwgc2l6ZV90IHBvcywKKyAgIGNvbnN0IGNoYXIgKmNhdCkKK3sKKyAgIHdoaWxlIChwb3MgPCBidWZzaXplICYmIGNhdCAhPSBOVUxMICYmICpjYXQgIT0gMCkKKyAgICAgIGJ1ZmZlcltwb3MrK10gPSAqY2F0Kys7CisKKyAgIGlmIChwb3MgPj0gYnVmc2l6ZSkKKyAgICAgIHBvcyA9IGJ1ZnNpemUtMTsKKworICAgYnVmZmVyW3Bvc10gPSAwOworICAgcmV0dXJuIHBvczsKK30KKworc3RhdGljIHNpemVfdCBzYWZlY2F0bihjaGFyICpidWZmZXIsIHNpemVfdCBidWZzaXplLCBzaXplX3QgcG9zLCBpbnQgbikKK3sKKyAgIGNoYXIgbnVtYmVyWzY0XTsKKyAgIHNwcmludGYobnVtYmVyLCAiJWQiLCBuKTsKKyAgIHJldHVybiBzYWZlY2F0KGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCBudW1iZXIpOworfQorCisjaWZkZWYgUE5HX1JFQURfVFJBTlNGT1JNU19TVVBQT1JURUQKK3N0YXRpYyBzaXplX3Qgc2FmZWNhdGQoY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmc2l6ZSwgc2l6ZV90IHBvcywgZG91YmxlIGQsCisgICAgaW50IHByZWNpc2lvbikKK3sKKyAgIGNoYXIgbnVtYmVyWzY0XTsKKyAgIHNwcmludGYobnVtYmVyLCAiJS4qZiIsIHByZWNpc2lvbiwgZCk7CisgICByZXR1cm4gc2FmZWNhdChidWZmZXIsIGJ1ZnNpemUsIHBvcywgbnVtYmVyKTsKK30KKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciBpbnZhbGlkW10gPSAiaW52YWxpZCI7CitzdGF0aWMgY29uc3QgY2hhciBzZXBbXSA9ICI6ICI7CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb2xvdXJfdHlwZXNbOF0gPQoreworICAgImdyYXlzY2FsZSIsIGludmFsaWQsICJ0cnVlY29sb3VyIiwgImluZGV4ZWQtY29sb3VyIiwKKyAgICJncmF5c2NhbGUgd2l0aCBhbHBoYSIsIGludmFsaWQsICJ0cnVlY29sb3VyIHdpdGggYWxwaGEiLCBpbnZhbGlkCit9OworCisjaWZkZWYgUE5HX1JFQURfVFJBTlNGT1JNU19TVVBQT1JURUQKKy8qIENvbnZlcnQgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIHRvIGZpeGVkIHBvaW50LiAqLworc3RhdGljIHBuZ19maXhlZF9wb2ludAorZml4KGRvdWJsZSBkKQoreworICAgZCA9IGZsb29yKGQgKiBQTkdfRlBfMSArIC41KTsKKyAgIHJldHVybiAocG5nX2ZpeGVkX3BvaW50KWQ7Cit9CisjZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICovCisKKy8qIEdlbmVyYXRlIHJhbmRvbSBieXRlcy4gIFRoaXMgdXNlcyBhIGJvcmluZyByZXBlYXRhYmxlIGFsZ29yaXRobSBhbmQgaXQKKyAqIGlzIGltcGxlbWVudGVkIGhlcmUgc28gdGhhdCBpdCBnaXZlcyB0aGUgc2FtZSBzZXQgb2YgbnVtYmVycyBvbiBldmVyeQorICogYXJjaGl0ZWN0dXJlLiAgSXQncyBhIGxpbmVhciBjb25ncnVlbnRpYWwgZ2VuZXJhdG9yIChLbnV0aCBvciBTZWRnZXdpY2sKKyAqICJBbGdvcml0aG1zIikgYnV0IGl0IGNvbWVzIGZyb20gdGhlICdmZWVkYmFjayB0YXBzJyB0YWJsZSBpbiBIb3Jvd2l0eiBhbmQKKyAqIEhpbGwsICJUaGUgQXJ0IG9mIEVsZWN0cm9uaWNzIiAoUHNldWRvLVJhbmRvbSBCaXQgU2VxdWVuY2VzIGFuZCBOb2lzZQorICogR2VuZXJhdGlvbi4pCisgKi8KK3N0YXRpYyB2b2lkCittYWtlX3JhbmRvbV9ieXRlcyhwbmdfdWludF8zMiogc2VlZCwgdm9pZCogcHYsIHNpemVfdCBzaXplKQoreworICAgcG5nX3VpbnRfMzIgdTAgPSBzZWVkWzBdLCB1MSA9IHNlZWRbMV07CisgICBwbmdfYnl0ZXAgYnl0ZXMgPSB2b2lkY2FzdChwbmdfYnl0ZXAsIHB2KTsKKworICAgLyogVGhlcmUgYXJlIHRoaXJ0eSB0aHJlZSBiaXRzLCB0aGUgbmV4dCBiaXQgaW4gdGhlIHNlcXVlbmNlIGlzIGJpdC0zMyBYT1IKKyAgICAqIGJpdC0yMC4gIFRoZSB0b3AgMSBiaXQgaXMgaW4gdTEsIHRoZSBib3R0b20gMzIgYXJlIGluIHUwLgorICAgICovCisgICBzaXplX3QgaTsKKyAgIGZvciAoaT0wOyBpPHNpemU7ICsraSkKKyAgIHsKKyAgICAgIC8qIEZpcnN0IGdlbmVyYXRlIDggbmV3IGJpdHMgdGhlbiBzaGlmdCB0aGVtIGluIGF0IHRoZSBlbmQuICovCisgICAgICBwbmdfdWludF8zMiB1ID0gKCh1MCA+PiAoMjAtOCkpIF4gKCh1MSA8PCA3KSB8ICh1MCA+PiAoMzItNykpKSkgJiAweGZmOworICAgICAgdTEgPDw9IDg7CisgICAgICB1MSB8PSB1MCA+PiAyNDsKKyAgICAgIHUwIDw8PSA4OworICAgICAgdTAgfD0gdTsKKyAgICAgICpieXRlcysrID0gKHBuZ19ieXRlKXU7CisgICB9CisKKyAgIHNlZWRbMF0gPSB1MDsKKyAgIHNlZWRbMV0gPSB1MTsKK30KKworc3RhdGljIHZvaWQKK21ha2VfZm91cl9yYW5kb21fYnl0ZXMocG5nX3VpbnRfMzIqIHNlZWQsIHBuZ19ieXRlcCBieXRlcykKK3sKKyAgIG1ha2VfcmFuZG9tX2J5dGVzKHNlZWQsIGJ5dGVzLCA0KTsKK30KKworI2lmIGRlZmluZWQgUE5HX1JFQURfU1VQUE9SVEVEIHx8IGRlZmluZWQgUE5HX1dSSVRFX3RSTlNfU1VQUE9SVEVECitzdGF0aWMgdm9pZAorcmFuZG9taXplKHZvaWQgKnB2LCBzaXplX3Qgc2l6ZSkKK3sKKyAgIHN0YXRpYyBwbmdfdWludF8zMiByYW5kb21fc2VlZFsyXSA9IHsweDU2Nzg5YWJjLCAweGR9OworICAgbWFrZV9yYW5kb21fYnl0ZXMocmFuZG9tX3NlZWQsIHB2LCBzaXplKTsKK30KKworI2RlZmluZSBSQU5ET01JWkUodGhpcykgcmFuZG9taXplKCYodGhpcyksIHNpemVvZiAodGhpcykpCisjZW5kaWYgLyogUkVBRCB8fCBXUklURV90Uk5TICovCisKKyNpZmRlZiBQTkdfUkVBRF9UUkFOU0ZPUk1TX1NVUFBPUlRFRAorc3RhdGljIHVuc2lnbmVkIGludAorcmFuZG9tX21vZCh1bnNpZ25lZCBpbnQgbWF4KQoreworICAgdW5zaWduZWQgaW50IHg7CisKKyAgIFJBTkRPTUlaRSh4KTsKKworICAgcmV0dXJuIHggJSBtYXg7IC8qIDAgLi4gbWF4LTEgKi8KK30KKworI2lmIChkZWZpbmVkIFBOR19SRUFEX1JHQl9UT19HUkFZX1NVUFBPUlRFRCkgfHxcCisgICAgKGRlZmluZWQgUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRCkKK3N0YXRpYyBpbnQKK3JhbmRvbV9jaG9pY2Uodm9pZCkKK3sKKyAgIHVuc2lnbmVkIGNoYXIgeDsKKworICAgUkFORE9NSVpFKHgpOworCisgICByZXR1cm4geCAmIDE7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBQTkdfUkVBRF9TVVBQT1JURUQgKi8KKworLyogQSBudW1lcmljIElEIGJhc2VkIG9uIFBORyBmaWxlIGNoYXJhY3RlcmlzdGljcy4gIFRoZSAnZG9faW50ZXJsYWNlJyBmaWVsZAorICogc2ltcGx5IHJlY29yZHMgd2hldGhlciBwbmd2YWxpZCBkaWQgdGhlIGludGVybGFjZSBpdHNlbGYgb3Igd2hldGhlciBpdAorICogd2FzIGRvbmUgYnkgbGlicG5nLiAgV2lkdGggYW5kIGhlaWdodCBtdXN0IGJlIGxlc3MgdGhhbiAyNTYuICAncGFsZXR0ZScgaXMgYW4KKyAqIGluZGV4IG9mIHRoZSBwYWxldHRlIHRvIHVzZSBmb3IgZm9ybWF0cyB3aXRoIGEgcGFsZXR0ZSBvdGhlcndpc2UgYSBib29sZWFuCisgKiBpbmRpY2F0aW5nIGlmIGEgdFJOUyBjaHVuayB3YXMgZ2VuZXJhdGVkLgorICovCisjZGVmaW5lIEZJTEVJRChjb2wsIGRlcHRoLCBwYWxldHRlLCBpbnRlcmxhY2UsIHdpZHRoLCBoZWlnaHQsIGRvX2ludGVybGFjZSkgXAorICAgKChwbmdfdWludF8zMikoKGNvbCkgKyAoKGRlcHRoKTw8MykgKyAoKHBhbGV0dGUpPDw4KSArICgoaW50ZXJsYWNlKTw8MTMpICsgXAorICAgICgoKGRvX2ludGVybGFjZSkhPTApPDwxNSkgKyAoKHdpZHRoKTw8MTYpICsgKChoZWlnaHQpPDwyNCkpKQorCisjZGVmaW5lIENPTF9GUk9NX0lEKGlkKSAoKHBuZ19ieXRlKSgoaWQpJiAweDdVKSkKKyNkZWZpbmUgREVQVEhfRlJPTV9JRChpZCkgKChwbmdfYnl0ZSkoKChpZCkgPj4gMykgJiAweDFmVSkpCisjZGVmaW5lIFBBTEVUVEVfRlJPTV9JRChpZCkgKCgoaWQpID4+IDgpICYgMHgxZikKKyNkZWZpbmUgSU5URVJMQUNFX0ZST01fSUQoaWQpICgocG5nX2J5dGUpKCgoaWQpID4+IDEzKSAmIDB4MykpCisjZGVmaW5lIERPX0lOVEVSTEFDRV9GUk9NX0lEKGlkKSAoKGludCkoKChpZCk+PjE1KSAmIDEpKQorI2RlZmluZSBXSURUSF9GUk9NX0lEKGlkKSAoKChpZCk+PjE2KSAmIDB4ZmYpCisjZGVmaW5lIEhFSUdIVF9GUk9NX0lEKGlkKSAoKChpZCk+PjI0KSAmIDB4ZmYpCisKKy8qIFV0aWxpdHkgdG8gY29uc3RydWN0IGEgc3RhbmRhcmQgbmFtZSBmb3IgYSBzdGFuZGFyZCBpbWFnZS4gKi8KK3N0YXRpYyBzaXplX3QKK3N0YW5kYXJkX25hbWUoY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmc2l6ZSwgc2l6ZV90IHBvcywgcG5nX2J5dGUgY29sb3VyX3R5cGUsCisgICAgaW50IGJpdF9kZXB0aCwgdW5zaWduZWQgaW50IG5wYWxldHRlLCBpbnQgaW50ZXJsYWNlX3R5cGUsCisgICAgcG5nX3VpbnRfMzIgdywgcG5nX3VpbnRfMzIgaCwgaW50IGRvX2ludGVybGFjZSkKK3sKKyAgIHBvcyA9IHNhZmVjYXQoYnVmZmVyLCBidWZzaXplLCBwb3MsIGNvbG91cl90eXBlc1tjb2xvdXJfdHlwZV0pOworICAgaWYgKGNvbG91cl90eXBlID09IDMpIC8qIG11c3QgaGF2ZSBhIHBhbGV0dGUgKi8KKyAgIHsKKyAgICAgIHBvcyA9IHNhZmVjYXQoYnVmZmVyLCBidWZzaXplLCBwb3MsICJbIik7CisgICAgICBwb3MgPSBzYWZlY2F0bihidWZmZXIsIGJ1ZnNpemUsIHBvcywgbnBhbGV0dGUpOworICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIGJ1ZnNpemUsIHBvcywgIl0iKTsKKyAgIH0KKworICAgZWxzZSBpZiAobnBhbGV0dGUgIT0gMCkKKyAgICAgIHBvcyA9IHNhZmVjYXQoYnVmZmVyLCBidWZzaXplLCBwb3MsICIrdFJOUyIpOworCisgICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCAiICIpOworICAgcG9zID0gc2FmZWNhdG4oYnVmZmVyLCBidWZzaXplLCBwb3MsIGJpdF9kZXB0aCk7CisgICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCAiIGJpdCIpOworCisgICBpZiAoaW50ZXJsYWNlX3R5cGUgIT0gUE5HX0lOVEVSTEFDRV9OT05FKQorICAgeworICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIGJ1ZnNpemUsIHBvcywgIiBpbnRlcmxhY2VkIik7CisgICAgICBpZiAoZG9faW50ZXJsYWNlKQorICAgICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIGJ1ZnNpemUsIHBvcywgIihwbmd2YWxpZCkiKTsKKyAgICAgIGVsc2UKKyAgICAgICAgIHBvcyA9IHNhZmVjYXQoYnVmZmVyLCBidWZzaXplLCBwb3MsICIobGlicG5nKSIpOworICAgfQorCisgICBpZiAodyA+IDAgfHwgaCA+IDApCisgICB7CisgICAgICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCAiICIpOworICAgICAgcG9zID0gc2FmZWNhdG4oYnVmZmVyLCBidWZzaXplLCBwb3MsIHcpOworICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIGJ1ZnNpemUsIHBvcywgIngiKTsKKyAgICAgIHBvcyA9IHNhZmVjYXRuKGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCBoKTsKKyAgIH0KKworICAgcmV0dXJuIHBvczsKK30KKworc3RhdGljIHNpemVfdAorc3RhbmRhcmRfbmFtZV9mcm9tX2lkKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZnNpemUsIHNpemVfdCBwb3MsIHBuZ191aW50XzMyIGlkKQoreworICAgcmV0dXJuIHN0YW5kYXJkX25hbWUoYnVmZmVyLCBidWZzaXplLCBwb3MsIENPTF9GUk9NX0lEKGlkKSwKKyAgICAgIERFUFRIX0ZST01fSUQoaWQpLCBQQUxFVFRFX0ZST01fSUQoaWQpLCBJTlRFUkxBQ0VfRlJPTV9JRChpZCksCisgICAgICBXSURUSF9GUk9NX0lEKGlkKSwgSEVJR0hUX0ZST01fSUQoaWQpLCBET19JTlRFUkxBQ0VfRlJPTV9JRChpZCkpOworfQorCisvKiBDb252ZW5pZW5jZSBBUEkgYW5kIGRlZmluZXMgdG8gbGlzdCB2YWxpZCBmb3JtYXRzLiAgTm90ZSB0aGF0IDE2IGJpdCByZWFkIGFuZAorICogd3JpdGUgc3VwcG9ydCBpcyByZXF1aXJlZCB0byBkbyAxNiBiaXQgcmVhZCB0ZXN0cyAod2UgbXVzdCBiZSBhYmxlIHRvIG1ha2UgYQorICogMTYgYml0IGltYWdlIHRvIHRlc3QhKQorICovCisjaWZkZWYgUE5HX1dSSVRFXzE2QklUX1NVUFBPUlRFRAorIyAgZGVmaW5lIFdSSVRFX0JESEkgNAorIyAgaWZkZWYgUE5HX1JFQURfMTZCSVRfU1VQUE9SVEVECisjICAgICBkZWZpbmUgUkVBRF9CREhJIDQKKyMgICAgIGRlZmluZSBET18xNkJJVAorIyAgZW5kaWYKKyNlbHNlCisjICBkZWZpbmUgV1JJVEVfQkRISSAzCisjZW5kaWYKKyNpZm5kZWYgRE9fMTZCSVQKKyMgIGRlZmluZSBSRUFEX0JESEkgMworI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIGRpZmZlcmVudCBwYWxldHRlcyB0byBnZW5lcmF0ZSBmb3IKKyAqIGVhY2ggbG9nIGJpdCBkZXB0aCBvZiBhIGNvbG91ciB0eXBlIDMgc3RhbmRhcmQgaW1hZ2UuCisgKi8KKyNkZWZpbmUgUEFMRVRURV9DT1VOVChiaXRfZGVwdGgpICgoYml0X2RlcHRoKSA+IDQgPyAxVSA6IDE2VSkKKworc3RhdGljIGludAorbmV4dF9mb3JtYXQocG5nX2J5dGVwIGNvbG91cl90eXBlLCBwbmdfYnl0ZXAgYml0X2RlcHRoLAorICAgdW5zaWduZWQgaW50KiBwYWxldHRlX251bWJlciwgaW50IGxvd19kZXB0aF9ncmF5LCBpbnQgdFJOUykKK3sKKyAgIGlmICgqYml0X2RlcHRoID09IDApCisgICB7CisgICAgICAqY29sb3VyX3R5cGUgPSAwOworICAgICAgaWYgKGxvd19kZXB0aF9ncmF5KQorICAgICAgICAgKmJpdF9kZXB0aCA9IDE7CisgICAgICBlbHNlCisgICAgICAgICAqYml0X2RlcHRoID0gODsKKyAgICAgICpwYWxldHRlX251bWJlciA9IDA7CisgICAgICByZXR1cm4gMTsKKyAgIH0KKworICAgaWYgICgqY29sb3VyX3R5cGUgPCA0LypubyBhbHBoYSBjaGFubmVsKi8pCisgICB7CisgICAgICAvKiBBZGQgbXVsdGlwbGUgcGFsZXR0ZXMgZm9yIGNvbG91ciB0eXBlIDMsIG9uZSBpbWFnZSB3aXRoIHRSTlMKKyAgICAgICAqIGFuZCBvbmUgd2l0aG91dCBmb3Igb3RoZXIgbm9uLWFscGhhIGZvcm1hdHM6CisgICAgICAgKi8KKyAgICAgIHVuc2lnbmVkIGludCBwbiA9ICsrKnBhbGV0dGVfbnVtYmVyOworICAgICAgcG5nX2J5dGUgY3QgPSAqY29sb3VyX3R5cGU7CisKKyAgICAgIGlmICgoKGN0ID09IDAvKkdSQVkqLyB8fCBjdC8qUkdCKi8gPT0gMikgJiYgdFJOUyAmJiBwbiA8IDIpIHx8CisgICAgICAgICAgKGN0ID09IDMvKlBBTEVUVEUqLyAmJiBwbiA8IFBBTEVUVEVfQ09VTlQoKmJpdF9kZXB0aCkpKQorICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgIC8qIE5vOiBuZXh0IGJpdCBkZXB0aCAqLworICAgICAgKnBhbGV0dGVfbnVtYmVyID0gMDsKKyAgIH0KKworICAgKmJpdF9kZXB0aCA9IChwbmdfYnl0ZSkoKmJpdF9kZXB0aCA8PCAxKTsKKworICAgLyogUGFsZXR0ZSBpbWFnZXMgYXJlIHJlc3RyaWN0ZWQgdG8gOCBiaXQgZGVwdGggKi8KKyAgIGlmICgqYml0X2RlcHRoIDw9IDgKKyNpZmRlZiBET18xNkJJVAorICAgICAgICAgfHwgKCpjb2xvdXJfdHlwZSAhPSAzICYmICpiaXRfZGVwdGggPD0gMTYpCisjZW5kaWYKKyAgICAgICkKKyAgICAgIHJldHVybiAxOworCisgICAvKiBNb3ZlIHRvIHRoZSBuZXh0IGNvbG9yIHR5cGUsIG9yIHJldHVybiAwIGF0IHRoZSBlbmQuICovCisgICBzd2l0Y2ggKCpjb2xvdXJfdHlwZSkKKyAgIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgICpjb2xvdXJfdHlwZSA9IDI7CisgICAgICAgICAqYml0X2RlcHRoID0gODsKKyAgICAgICAgIHJldHVybiAxOworCisgICAgICBjYXNlIDI6CisgICAgICAgICAqY29sb3VyX3R5cGUgPSAzOworICAgICAgICAgKmJpdF9kZXB0aCA9IDE7CisgICAgICAgICByZXR1cm4gMTsKKworICAgICAgY2FzZSAzOgorICAgICAgICAgKmNvbG91cl90eXBlID0gNDsKKyAgICAgICAgICpiaXRfZGVwdGggPSA4OworICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgICpjb2xvdXJfdHlwZSA9IDY7CisgICAgICAgICAqYml0X2RlcHRoID0gODsKKyAgICAgICAgIHJldHVybiAxOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAgcmV0dXJuIDA7CisgICB9Cit9CisKKyNpZmRlZiBQTkdfUkVBRF9UUkFOU0ZPUk1TX1NVUFBPUlRFRAorc3RhdGljIHVuc2lnbmVkIGludAorc2FtcGxlKHBuZ19jb25zdF9ieXRlcCByb3csIHBuZ19ieXRlIGNvbG91cl90eXBlLCBwbmdfYnl0ZSBiaXRfZGVwdGgsCisgICAgcG5nX3VpbnRfMzIgeCwgdW5zaWduZWQgaW50IHNhbXBsZV9pbmRleCwgaW50IHN3YXAxNiwgaW50IGxpdHRsZWVuZGlhbikKK3sKKyAgIHBuZ191aW50XzMyIGJpdF9pbmRleCwgcmVzdWx0OworCisgICAvKiBGaW5kIGEgc2FtcGxlIGluZGV4IGZvciB0aGUgZGVzaXJlZCBzYW1wbGU6ICovCisgICB4ICo9IGJpdF9kZXB0aDsKKyAgIGJpdF9pbmRleCA9IHg7CisKKyAgIGlmICgoY29sb3VyX3R5cGUgJiAxKSA9PSAwKSAvKiAhcGFsZXR0ZSAqLworICAgeworICAgICAgaWYgKGNvbG91cl90eXBlICYgMikKKyAgICAgICAgIGJpdF9pbmRleCAqPSAzOworCisgICAgICBpZiAoY29sb3VyX3R5cGUgJiA0KQorICAgICAgICAgYml0X2luZGV4ICs9IHg7IC8qIEFscGhhIGNoYW5uZWwgKi8KKworICAgICAgLyogTXVsdGlwbGUgY2hhbm5lbHM7IHNlbGVjdCBvbmU6ICovCisgICAgICBpZiAoY29sb3VyX3R5cGUgJiAoMis0KSkKKyAgICAgICAgIGJpdF9pbmRleCArPSBzYW1wbGVfaW5kZXggKiBiaXRfZGVwdGg7CisgICB9CisKKyAgIC8qIFJldHVybiB0aGUgc2FtcGxlIGZyb20gdGhlIHJvdyBhcyBhbiBpbnRlZ2VyLiAqLworICAgcm93ICs9IGJpdF9pbmRleCA+PiAzOworICAgcmVzdWx0ID0gKnJvdzsKKworICAgaWYgKGJpdF9kZXB0aCA9PSA4KQorICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgZWxzZSBpZiAoYml0X2RlcHRoID4gOCkKKyAgIHsKKyAgICAgIGlmIChzd2FwMTYpCisgICAgICAgICByZXR1cm4gKCorK3JvdyA8PCA4KSArIHJlc3VsdDsKKyAgICAgIGVsc2UKKyAgICAgICAgIHJldHVybiAocmVzdWx0IDw8IDgpICsgKisrcm93OworICAgfQorCisgICAvKiBMZXNzIHRoYW4gOCBiaXRzIHBlciBzYW1wbGUuICBCeSBkZWZhdWx0IFBORyBoYXMgdGhlIGJpZyBlbmQgb2YKKyAgICAqIHRoZSBlZ2cgb24gdGhlIGxlZnQgb2YgdGhlIHNjcmVlbiwgYnV0IGlmIGxpdHRsZWVuZGlhbiBpcyBzZXQKKyAgICAqIHRoZW4gdGhlIGJpZyBlbmQgaXMgb24gdGhlIHJpZ2h0LgorICAgICovCisgICBiaXRfaW5kZXggJj0gNzsKKworICAgaWYgKCFsaXR0bGVlbmRpYW4pCisgICAgICBiaXRfaW5kZXggPSA4LWJpdF9pbmRleC1iaXRfZGVwdGg7CisKKyAgIHJldHVybiAocmVzdWx0ID4+IGJpdF9pbmRleCkgJiAoKDFVPDxiaXRfZGVwdGgpLTEpOworfQorI2VuZGlmIC8qIFBOR19SRUFEX1RSQU5TRk9STVNfU1VQUE9SVEVEICovCisKKy8qIENvcHkgYSBzaW5nbGUgcGl4ZWwsIG9mIGEgZ2l2ZW4gc2l6ZSwgZnJvbSBvbmUgYnVmZmVyIHRvIGFub3RoZXIgLQorICogd2hpbGUgdGhpcyBpcyBiYXNpY2FsbHkgYml0IGFkZHJlc3NlZCB0aGVyZSBpcyBhbiBpbXBsaWNpdCBhc3N1bXB0aW9uCisgKiB0aGF0IHBpeGVscyA4IG9yIG1vcmUgYml0cyBpbiBzaXplIGFyZSBieXRlIGFsaWduZWQgYW5kIHRoYXQgcGl4ZWxzCisgKiBkbyBub3Qgb3RoZXJ3aXNlIGNyb3NzIGJ5dGUgYm91bmRhcmllcy4gIChUaGlzIGlzLCBzbyBmYXIgYXMgSSBrbm93LAorICogdW5pdmVyc2FsbHkgdHJ1ZSBpbiBiaXRtYXAgY29tcHV0ZXIgZ3JhcGhpY3MuICBbSkNCIDIwMTAxMjEyXSkKKyAqCisgKiBOT1RFOiBUaGUgdG8gYW5kIGZyb20gYnVmZmVycyBtYXkgYmUgdGhlIHNhbWUuCisgKi8KK3N0YXRpYyB2b2lkCitwaXhlbF9jb3B5KHBuZ19ieXRlcCB0b0J1ZmZlciwgcG5nX3VpbnRfMzIgdG9JbmRleCwKKyAgIHBuZ19jb25zdF9ieXRlcCBmcm9tQnVmZmVyLCBwbmdfdWludF8zMiBmcm9tSW5kZXgsIHVuc2lnbmVkIGludCBwaXhlbFNpemUsCisgICBpbnQgbGl0dGxlZW5kaWFuKQoreworICAgLyogQXNzdW1lIHdlIGNhbiBtdWx0aXBseSBieSAnc2l6ZScgd2l0aG91dCBvdmVyZmxvdyBiZWNhdXNlIHdlIGFyZQorICAgICoganVzdCB3b3JraW5nIGluIGEgc2luZ2xlIGJ1ZmZlci4KKyAgICAqLworICAgdG9JbmRleCAqPSBwaXhlbFNpemU7CisgICBmcm9tSW5kZXggKj0gcGl4ZWxTaXplOworICAgaWYgKHBpeGVsU2l6ZSA8IDgpIC8qIFN1Yi1ieXRlICovCisgICB7CisgICAgICAvKiBNYXNrIHRvIHNlbGVjdCB0aGUgbG9jYXRpb24gb2YgdGhlIGNvcGllZCBwaXhlbDogKi8KKyAgICAgIHVuc2lnbmVkIGludCBkZXN0TWFzayA9ICgoMVU8PHBpeGVsU2l6ZSktMSkgPDwKKyAgICAgICAgIChsaXR0bGVlbmRpYW4gPyB0b0luZGV4JjcgOiA4LXBpeGVsU2l6ZS0odG9JbmRleCY3KSk7CisgICAgICAvKiBUaGUgZm9sbG93aW5nIHJlYWQgdGhlIGVudGlyZSBwaXhlbHMgYW5kIGNsZWFycyB0aGUgZXh0cmE6ICovCisgICAgICB1bnNpZ25lZCBpbnQgZGVzdEJ5dGUgPSB0b0J1ZmZlclt0b0luZGV4ID4+IDNdICYgfmRlc3RNYXNrOworICAgICAgdW5zaWduZWQgaW50IHNvdXJjZUJ5dGUgPSBmcm9tQnVmZmVyW2Zyb21JbmRleCA+PiAzXTsKKworICAgICAgLyogRG9uJ3QgcmVseSBvbiA8PCBvciA+PiBzdXBwb3J0aW5nICcwJyBoZXJlLCBqdXN0IGluIGNhc2U6ICovCisgICAgICBmcm9tSW5kZXggJj0gNzsKKyAgICAgIGlmIChsaXR0bGVlbmRpYW4pCisgICAgICB7CisgICAgICAgICBpZiAoZnJvbUluZGV4ID4gMCkgc291cmNlQnl0ZSA+Pj0gZnJvbUluZGV4OworICAgICAgICAgaWYgKCh0b0luZGV4ICYgNykgPiAwKSBzb3VyY2VCeXRlIDw8PSB0b0luZGV4ICYgNzsKKyAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgaWYgKGZyb21JbmRleCA+IDApIHNvdXJjZUJ5dGUgPDw9IGZyb21JbmRleDsKKyAgICAgICAgIGlmICgodG9JbmRleCAmIDcpID4gMCkgc291cmNlQnl0ZSA+Pj0gdG9JbmRleCAmIDc7CisgICAgICB9CisKKyAgICAgIHRvQnVmZmVyW3RvSW5kZXggPj4gM10gPSAocG5nX2J5dGUpKGRlc3RCeXRlIHwgKHNvdXJjZUJ5dGUgJiBkZXN0TWFzaykpOworICAgfQorICAgZWxzZSAvKiBPbmUgb3IgbW9yZSBieXRlcyAqLworICAgICAgbWVtbW92ZSh0b0J1ZmZlcisodG9JbmRleD4+MyksIGZyb21CdWZmZXIrKGZyb21JbmRleD4+MyksIHBpeGVsU2l6ZT4+Myk7Cit9CisKKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKKy8qIENvcHkgYSBjb21wbGV0ZSByb3cgb2YgcGl4ZWxzLCB0YWtpbmcgaW50byBhY2NvdW50IHBvdGVudGlhbCBwYXJ0aWFsCisgKiBieXRlcyBhdCB0aGUgZW5kLgorICovCitzdGF0aWMgdm9pZAorcm93X2NvcHkocG5nX2J5dGVwIHRvQnVmZmVyLCBwbmdfY29uc3RfYnl0ZXAgZnJvbUJ1ZmZlciwgdW5zaWduZWQgaW50IGJpdFdpZHRoLAorICAgICAgaW50IGxpdHRsZWVuZGlhbikKK3sKKyAgIG1lbWNweSh0b0J1ZmZlciwgZnJvbUJ1ZmZlciwgYml0V2lkdGggPj4gMyk7CisKKyAgIGlmICgoYml0V2lkdGggJiA3KSAhPSAwKQorICAgeworICAgICAgdW5zaWduZWQgaW50IG1hc2s7CisKKyAgICAgIHRvQnVmZmVyICs9IGJpdFdpZHRoID4+IDM7CisgICAgICBmcm9tQnVmZmVyICs9IGJpdFdpZHRoID4+IDM7CisgICAgICBpZiAobGl0dGxlZW5kaWFuKQorICAgICAgICAgbWFzayA9IDB4ZmYgPDwgKGJpdFdpZHRoICYgNyk7CisgICAgICBlbHNlCisgICAgICAgICBtYXNrID0gMHhmZiA+PiAoYml0V2lkdGggJiA3KTsKKyAgICAgICp0b0J1ZmZlciA9IChwbmdfYnl0ZSkoKCp0b0J1ZmZlciAmIG1hc2spIHwgKCpmcm9tQnVmZmVyICYgfm1hc2spKTsKKyAgIH0KK30KKworLyogQ29tcGFyZSBwaXhlbHMgLSB0aGV5IGFyZSBhc3N1bWVkIHRvIHN0YXJ0IGF0IHRoZSBmaXJzdCBieXRlIGluIHRoZQorICogZ2l2ZW4gYnVmZmVycy4KKyAqLworc3RhdGljIGludAorcGl4ZWxfY21wKHBuZ19jb25zdF9ieXRlcCBwYSwgcG5nX2NvbnN0X2J5dGVwIHBiLCBwbmdfdWludF8zMiBiaXRfd2lkdGgpCit7CisjaWYgUE5HX0xJQlBOR19WRVIgPCAxMDUwNgorICAgaWYgKG1lbWNtcChwYSwgcGIsIGJpdF93aWR0aD4+MykgPT0gMCkKKyAgIHsKKyAgICAgIHBuZ191aW50XzMyIHA7CisKKyAgICAgIGlmICgoYml0X3dpZHRoICYgNykgPT0gMCkgcmV0dXJuIDA7CisKKyAgICAgIC8qIE9rLCBhbnkgZGlmZmVyZW5jZXM/ICovCisgICAgICBwID0gcGFbYml0X3dpZHRoID4+IDNdOworICAgICAgcCBePSBwYltiaXRfd2lkdGggPj4gM107CisKKyAgICAgIGlmIChwID09IDApIHJldHVybiAwOworCisgICAgICAvKiBUaGVyZSBhcmUsIGJ1dCB0aGV5IG1heSBub3QgYmUgc2lnbmlmaWNhbnQsIHJlbW92ZSB0aGUgYml0cworICAgICAgICogYWZ0ZXIgdGhlIGVuZCAodGhlIGxvdyBvcmRlciBiaXRzIGluIFBORy4pCisgICAgICAgKi8KKyAgICAgIGJpdF93aWR0aCAmPSA3OworICAgICAgcCA+Pj0gOC1iaXRfd2lkdGg7CisKKyAgICAgIGlmIChwID09IDApIHJldHVybiAwOworICAgfQorI2Vsc2UKKyAgIC8qIEZyb20gbGlicG5nLTEuNS42IHRoZSBvdmVyd3JpdGUgc2hvdWxkIGJlIGZpeGVkLCBzbyBjb21wYXJlIHRoZSB0cmFpbGluZworICAgICogYml0cyB0b286CisgICAgKi8KKyAgIGlmIChtZW1jbXAocGEsIHBiLCAoYml0X3dpZHRoKzcpPj4zKSA9PSAwKQorICAgICAgcmV0dXJuIDA7CisjZW5kaWYKKworICAgLyogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgY2hhbmdlZCBieXRlLiAqLworICAgeworICAgICAgcG5nX3VpbnRfMzIgd2hlcmUgPSAwOworCisgICAgICB3aGlsZSAocGFbd2hlcmVdID09IHBiW3doZXJlXSkgKyt3aGVyZTsKKyAgICAgIHJldHVybiAxK3doZXJlOworICAgfQorfQorI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqIEJBU0lDIFBORyBGSUxFIFdSSVRJTkcgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQSBwbmdfc3RvcmUgdGFrZXMgZGF0YSBmcm9tIHRoZSBzZXF1ZW50aWFsIHdyaXRlciBvciBwcm92aWRlcyBkYXRhCisgKiB0byB0aGUgc2VxdWVudGlhbCByZWFkZXIuICBJdCBjYW4gYWxzbyBzdG9yZSB0aGUgcmVzdWx0IG9mIGEgUE5HCisgKiB3cml0ZSBmb3IgbGF0ZXIgcmV0cmlldmFsLgorICovCisjZGVmaW5lIFNUT1JFX0JVRkZFUl9TSVpFIDUwMCAvKiBhcmJpdHJhcnkgKi8KK3R5cGVkZWYgc3RydWN0IHBuZ19zdG9yZV9idWZmZXIKK3sKKyAgIHN0cnVjdCBwbmdfc3RvcmVfYnVmZmVyKiAgcHJldjsgICAgLyogTk9URTogc3RvcmVkIGluIHJldmVyc2Ugb3JkZXIgKi8KKyAgIHBuZ19ieXRlICAgICAgICAgICAgICAgICAgYnVmZmVyW1NUT1JFX0JVRkZFUl9TSVpFXTsKK30gcG5nX3N0b3JlX2J1ZmZlcjsKKworI2RlZmluZSBGSUxFX05BTUVfU0laRSA2NAorCit0eXBlZGVmIHN0cnVjdCBzdG9yZV9wYWxldHRlX2VudHJ5IC8qIHJlY29yZCBvZiBhIHNpbmdsZSBwYWxldHRlIGVudHJ5ICovCit7CisgICBwbmdfYnl0ZSByZWQ7CisgICBwbmdfYnl0ZSBncmVlbjsKKyAgIHBuZ19ieXRlIGJsdWU7CisgICBwbmdfYnl0ZSBhbHBoYTsKK30gc3RvcmVfcGFsZXR0ZV9lbnRyeSwgc3RvcmVfcGFsZXR0ZVsyNTZdOworCit0eXBlZGVmIHN0cnVjdCBwbmdfc3RvcmVfZmlsZQoreworICAgc3RydWN0IHBuZ19zdG9yZV9maWxlKiAgbmV4dDsgICAgICAvKiBhcyBtYW55IGFzIHlvdSBsaWtlLi4uICovCisgICBjaGFyICAgICAgICAgICAgICAgICAgICBuYW1lW0ZJTEVfTkFNRV9TSVpFXTsKKyAgIHBuZ191aW50XzMyICAgICAgICAgICAgIGlkOyAgICAgICAgLyogbXVzdCBiZSBjb3JyZWN0IChzZWUgRklMRUlEKSAqLworICAgcG5nX3NpemVfdCAgICAgICAgICAgICAgZGF0YWNvdW50OyAvKiBJbiB0aGlzICh0aGUgbGFzdCkgYnVmZmVyICovCisgICBwbmdfc3RvcmVfYnVmZmVyICAgICAgICBkYXRhOyAgICAgIC8qIExhc3QgYnVmZmVyIGluIGZpbGUgKi8KKyAgIGludCAgICAgICAgICAgICAgICAgICAgIG5wYWxldHRlOyAgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gcGFsZXR0ZSAqLworICAgc3RvcmVfcGFsZXR0ZV9lbnRyeSogICAgcGFsZXR0ZTsgICAvKiBNYXkgYmUgTlVMTCAqLworfSBwbmdfc3RvcmVfZmlsZTsKKworLyogVGhlIGZvbGxvd2luZyBpcyBhIHBvb2wgb2YgbWVtb3J5IGFsbG9jYXRlZCBieSBhIHNpbmdsZSBsaWJwbmcgcmVhZCBvciB3cml0ZQorICogb3BlcmF0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCBzdG9yZV9wb29sCit7CisgICBzdHJ1Y3QgcG5nX3N0b3JlICAgICpzdG9yZTsgICAvKiBCYWNrIHBvaW50ZXIgKi8KKyAgIHN0cnVjdCBzdG9yZV9tZW1vcnkgKmxpc3Q7ICAgIC8qIExpc3Qgb2YgYWxsb2NhdGVkIG1lbW9yeSAqLworICAgcG5nX2J5dGUgICAgICAgICAgICAgbWFya1s0XTsgLyogQmVmb3JlIGFuZCBhZnRlciBkYXRhICovCisKKyAgIC8qIFN0YXRpc3RpY3MgZm9yIHRoaXMgcnVuLiAqLworICAgcG5nX2FsbG9jX3NpemVfdCAgICAgbWF4OyAgICAgLyogTWF4aW11bSBzaW5nbGUgYWxsb2NhdGlvbiAqLworICAgcG5nX2FsbG9jX3NpemVfdCAgICAgY3VycmVudDsgLyogQ3VycmVudCBhbGxvY2F0aW9uICovCisgICBwbmdfYWxsb2Nfc2l6ZV90ICAgICBsaW1pdDsgICAvKiBIaWdoZXN0IGN1cnJlbnQgYWxsb2NhdGlvbiAqLworICAgcG5nX2FsbG9jX3NpemVfdCAgICAgdG90YWw7ICAgLyogVG90YWwgYWxsb2NhdGlvbiAqLworCisgICAvKiBPdmVyYWxsIHN0YXRpc3RpY3MgKHJldGFpbmVkIGFjcm9zcyBzdWNjZXNzaXZlIHJ1bnMpLiAqLworICAgcG5nX2FsbG9jX3NpemVfdCAgICAgbWF4X21heDsKKyAgIHBuZ19hbGxvY19zaXplX3QgICAgIG1heF9saW1pdDsKKyAgIHBuZ19hbGxvY19zaXplX3QgICAgIG1heF90b3RhbDsKK30gc3RvcmVfcG9vbDsKKwordHlwZWRlZiBzdHJ1Y3QgcG5nX3N0b3JlCit7CisgICAvKiBGb3IgY2V4Y2VwdC5oIGV4Y2VwdGlvbiBoYW5kbGluZyAtIHNpbXBseSBzdG9yZSBvbmUgb2YgdGhlc2U7CisgICAgKiB0aGUgY29udGV4dCBpcyBhIHNlbGYgcG9pbnRlciBidXQgaXQgbWF5IHBvaW50IHRvIGEgZGlmZmVyZW50CisgICAgKiBwbmdfc3RvcmUgKGluIGZhY3QgaXQgbmV2ZXIgZG9lcyBpbiB0aGlzIHByb2dyYW0uKQorICAgICovCisgICBzdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQKKyAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25fY29udGV4dDsKKworICAgdW5zaWduZWQgaW50ICAgICAgIHZlcmJvc2UgOjE7CisgICB1bnNpZ25lZCBpbnQgICAgICAgdHJlYXRfd2FybmluZ3NfYXNfZXJyb3JzIDoxOworICAgdW5zaWduZWQgaW50ICAgICAgIGV4cGVjdF9lcnJvciA6MTsKKyAgIHVuc2lnbmVkIGludCAgICAgICBleHBlY3Rfd2FybmluZyA6MTsKKyAgIHVuc2lnbmVkIGludCAgICAgICBzYXdfd2FybmluZyA6MTsKKyAgIHVuc2lnbmVkIGludCAgICAgICBzcGVlZCA6MTsKKyAgIHVuc2lnbmVkIGludCAgICAgICBwcm9ncmVzc2l2ZSA6MTsgLyogdXNlIHByb2dyZXNzaXZlIHJlYWQgKi8KKyAgIHVuc2lnbmVkIGludCAgICAgICB2YWxpZGF0ZWQgOjE7ICAgLyogdXNlZCBhcyBhIHRlbXBvcmFyeSBmbGFnICovCisgICBpbnQgICAgICAgICAgICAgICAgbmVycm9yczsKKyAgIGludCAgICAgICAgICAgICAgICBud2FybmluZ3M7CisgICBpbnQgICAgICAgICAgICAgICAgbm9wdGlvbnM7ICAgICAgIC8qIG51bWJlciBvZiBvcHRpb25zIGJlbG93OiAqLworICAgc3RydWN0IHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgICBvcHRpb247ICAgICAgICAgLyogb3B0aW9uIG51bWJlciwgMC4uMzAgKi8KKyAgICAgIHVuc2lnbmVkIGNoYXIgICBzZXR0aW5nOyAgICAgICAgLyogc2V0dGluZyAodW5zZXQsaW52YWxpZCxvbixvZmYpICovCisgICB9ICAgICAgICAgICAgICAgICAgb3B0aW9uc1sxNl07CisgICBjaGFyICAgICAgICAgICAgICAgdGVzdFsxMjhdOyAgICAgIC8qIE5hbWUgb2YgdGVzdCAqLworICAgY2hhciAgICAgICAgICAgICAgIGVycm9yWzI1Nl07CisKKyAgIC8qIFJlYWQgZmllbGRzICovCisgICBwbmdfc3RydWN0cCAgICAgICAgcHJlYWQ7ICAgIC8qIFVzZWQgdG8gcmVhZCBhIHNhdmVkIGZpbGUgKi8KKyAgIHBuZ19pbmZvcCAgICAgICAgICBwaXJlYWQ7CisgICBwbmdfc3RvcmVfZmlsZSogICAgY3VycmVudDsgIC8qIFNldCB3aGVuIHJlYWRpbmcgKi8KKyAgIHBuZ19zdG9yZV9idWZmZXIqICBuZXh0OyAgICAgLyogU2V0IHdoZW4gcmVhZGluZyAqLworICAgcG5nX3NpemVfdCAgICAgICAgIHJlYWRwb3M7ICAvKiBQb3NpdGlvbiBpbiAqbmV4dCAqLworICAgcG5nX2J5dGUqICAgICAgICAgIGltYWdlOyAgICAvKiBCdWZmZXIgZm9yIHJlYWRpbmcgaW50ZXJsYWNlZCBpbWFnZXMgKi8KKyAgIHBuZ19zaXplX3QgICAgICAgICBjYl9pbWFnZTsgLyogU2l6ZSBvZiB0aGlzIGJ1ZmZlciAqLworICAgcG5nX3NpemVfdCAgICAgICAgIGNiX3JvdzsgICAvKiBSb3cgc2l6ZSBvZiB0aGUgaW1hZ2UocykgKi8KKyAgIHBuZ191aW50XzMyICAgICAgICBpbWFnZV9oOyAgLyogTnVtYmVyIG9mIHJvd3MgaW4gYSBzaW5nbGUgaW1hZ2UgKi8KKyAgIHN0b3JlX3Bvb2wgICAgICAgICByZWFkX21lbW9yeV9wb29sOworCisgICAvKiBXcml0ZSBmaWVsZHMgKi8KKyAgIHBuZ19zdG9yZV9maWxlKiAgICBzYXZlZDsKKyAgIHBuZ19zdHJ1Y3RwICAgICAgICBwd3JpdGU7ICAgLyogVXNlZCB3aGVuIHdyaXRpbmcgYSBuZXcgZmlsZSAqLworICAgcG5nX2luZm9wICAgICAgICAgIHBpd3JpdGU7CisgICBwbmdfc2l6ZV90ICAgICAgICAgd3JpdGVwb3M7IC8qIFBvc2l0aW9uIGluIC5uZXcgKi8KKyAgIGNoYXIgICAgICAgICAgICAgICB3bmFtZVtGSUxFX05BTUVfU0laRV07CisgICBwbmdfc3RvcmVfYnVmZmVyICAgbmV3OyAgICAgIC8qIFRoZSBlbmQgb2YgdGhlIG5ldyBQTkcgZmlsZSBiZWluZyB3cml0dGVuLiAqLworICAgc3RvcmVfcG9vbCAgICAgICAgIHdyaXRlX21lbW9yeV9wb29sOworICAgc3RvcmVfcGFsZXR0ZV9lbnRyeSogcGFsZXR0ZTsKKyAgIGludCAgICAgICAgICAgICAgICAgIG5wYWxldHRlOworfSBwbmdfc3RvcmU7CisKKy8qIEluaXRpYWxpemF0aW9uIGFuZCBjbGVhbnVwICovCitzdGF0aWMgdm9pZAorc3RvcmVfcG9vbF9tYXJrKHBuZ19ieXRlcCBtYXJrKQoreworICAgc3RhdGljIHBuZ191aW50XzMyIHN0b3JlX3NlZWRbMl0gPSB7IDB4MTIzNDU2NzgsIDF9OworCisgICBtYWtlX2ZvdXJfcmFuZG9tX2J5dGVzKHN0b3JlX3NlZWQsIG1hcmspOworfQorCisjaWZkZWYgUE5HX1JFQURfVFJBTlNGT1JNU19TVVBQT1JURUQKKy8qIFVzZSB0aGlzIGZvciByYW5kb20gMzIgYml0IHZhbHVlczsgdGhpcyBmdW5jdGlvbiBtYWtlcyBzdXJlIHRoZSByZXN1bHQgaXMKKyAqIG5vbi16ZXJvLgorICovCitzdGF0aWMgcG5nX3VpbnRfMzIKK3JhbmRvbV8zMih2b2lkKQoreworCisgICBmb3IgKDs7KQorICAgeworICAgICAgcG5nX2J5dGUgbWFya1s0XTsKKyAgICAgIHBuZ191aW50XzMyIHJlc3VsdDsKKworICAgICAgc3RvcmVfcG9vbF9tYXJrKG1hcmspOworICAgICAgcmVzdWx0ID0gcG5nX2dldF91aW50XzMyKG1hcmspOworCisgICAgICBpZiAocmVzdWx0ICE9IDApCisgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgfQorfQorI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAqLworCitzdGF0aWMgdm9pZAorc3RvcmVfcG9vbF9pbml0KHBuZ19zdG9yZSAqcHMsIHN0b3JlX3Bvb2wgKnBvb2wpCit7CisgICBtZW1zZXQocG9vbCwgMCwgc2l6ZW9mICpwb29sKTsKKworICAgcG9vbC0+c3RvcmUgPSBwczsKKyAgIHBvb2wtPmxpc3QgPSBOVUxMOworICAgcG9vbC0+bWF4ID0gcG9vbC0+Y3VycmVudCA9IHBvb2wtPmxpbWl0ID0gcG9vbC0+dG90YWwgPSAwOworICAgcG9vbC0+bWF4X21heCA9IHBvb2wtPm1heF9saW1pdCA9IHBvb2wtPm1heF90b3RhbCA9IDA7CisgICBzdG9yZV9wb29sX21hcmsocG9vbC0+bWFyayk7Cit9CisKK3N0YXRpYyB2b2lkCitzdG9yZV9pbml0KHBuZ19zdG9yZSogcHMpCit7CisgICBtZW1zZXQocHMsIDAsIHNpemVvZiAqcHMpOworICAgaW5pdF9leGNlcHRpb25fY29udGV4dCgmcHMtPmV4Y2VwdGlvbl9jb250ZXh0KTsKKyAgIHN0b3JlX3Bvb2xfaW5pdChwcywgJnBzLT5yZWFkX21lbW9yeV9wb29sKTsKKyAgIHN0b3JlX3Bvb2xfaW5pdChwcywgJnBzLT53cml0ZV9tZW1vcnlfcG9vbCk7CisgICBwcy0+dmVyYm9zZSA9IDA7CisgICBwcy0+dHJlYXRfd2FybmluZ3NfYXNfZXJyb3JzID0gMDsKKyAgIHBzLT5leHBlY3RfZXJyb3IgPSAwOworICAgcHMtPmV4cGVjdF93YXJuaW5nID0gMDsKKyAgIHBzLT5zYXdfd2FybmluZyA9IDA7CisgICBwcy0+c3BlZWQgPSAwOworICAgcHMtPnByb2dyZXNzaXZlID0gMDsKKyAgIHBzLT52YWxpZGF0ZWQgPSAwOworICAgcHMtPm5lcnJvcnMgPSBwcy0+bndhcm5pbmdzID0gMDsKKyAgIHBzLT5wcmVhZCA9IE5VTEw7CisgICBwcy0+cGlyZWFkID0gTlVMTDsKKyAgIHBzLT5zYXZlZCA9IHBzLT5jdXJyZW50ID0gTlVMTDsKKyAgIHBzLT5uZXh0ID0gTlVMTDsKKyAgIHBzLT5yZWFkcG9zID0gMDsKKyAgIHBzLT5pbWFnZSA9IE5VTEw7CisgICBwcy0+Y2JfaW1hZ2UgPSAwOworICAgcHMtPmNiX3JvdyA9IDA7CisgICBwcy0+aW1hZ2VfaCA9IDA7CisgICBwcy0+cHdyaXRlID0gTlVMTDsKKyAgIHBzLT5waXdyaXRlID0gTlVMTDsKKyAgIHBzLT53cml0ZXBvcyA9IDA7CisgICBwcy0+bmV3LnByZXYgPSBOVUxMOworICAgcHMtPnBhbGV0dGUgPSBOVUxMOworICAgcHMtPm5wYWxldHRlID0gMDsKKyAgIHBzLT5ub3B0aW9ucyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitzdG9yZV9mcmVlYnVmZmVyKHBuZ19zdG9yZV9idWZmZXIqIHBzYikKK3sKKyAgIGlmIChwc2ItPnByZXYpCisgICB7CisgICAgICBzdG9yZV9mcmVlYnVmZmVyKHBzYi0+cHJldik7CisgICAgICBmcmVlKHBzYi0+cHJldik7CisgICAgICBwc2ItPnByZXYgPSBOVUxMOworICAgfQorfQorCitzdGF0aWMgdm9pZAorc3RvcmVfZnJlZW5ldyhwbmdfc3RvcmUgKnBzKQoreworICAgc3RvcmVfZnJlZWJ1ZmZlcigmcHMtPm5ldyk7CisgICBwcy0+d3JpdGVwb3MgPSAwOworICAgaWYgKHBzLT5wYWxldHRlICE9IE5VTEwpCisgICB7CisgICAgICBmcmVlKHBzLT5wYWxldHRlKTsKKyAgICAgIHBzLT5wYWxldHRlID0gTlVMTDsKKyAgICAgIHBzLT5ucGFsZXR0ZSA9IDA7CisgICB9Cit9CisKK3N0YXRpYyB2b2lkCitzdG9yZV9zdG9yZW5ldyhwbmdfc3RvcmUgKnBzKQoreworICAgcG5nX3N0b3JlX2J1ZmZlciAqcGI7CisKKyAgIGlmIChwcy0+d3JpdGVwb3MgIT0gU1RPUkVfQlVGRkVSX1NJWkUpCisgICAgICBwbmdfZXJyb3IocHMtPnB3cml0ZSwgImludmFsaWQgc3RvcmUgY2FsbCIpOworCisgICBwYiA9IHZvaWRjYXN0KHBuZ19zdG9yZV9idWZmZXIqLCBtYWxsb2Moc2l6ZW9mICpwYikpOworCisgICBpZiAocGIgPT0gTlVMTCkKKyAgICAgIHBuZ19lcnJvcihwcy0+cHdyaXRlLCAic3RvcmUgbmV3OiBPT00iKTsKKworICAgKnBiID0gcHMtPm5ldzsKKyAgIHBzLT5uZXcucHJldiA9IHBiOworICAgcHMtPndyaXRlcG9zID0gMDsKK30KKworc3RhdGljIHZvaWQKK3N0b3JlX2ZyZWVmaWxlKHBuZ19zdG9yZV9maWxlICoqcHBmKQoreworICAgaWYgKCpwcGYgIT0gTlVMTCkKKyAgIHsKKyAgICAgIHN0b3JlX2ZyZWVmaWxlKCYoKnBwZiktPm5leHQpOworCisgICAgICBzdG9yZV9mcmVlYnVmZmVyKCYoKnBwZiktPmRhdGEpOworICAgICAgKCpwcGYpLT5kYXRhY291bnQgPSAwOworICAgICAgaWYgKCgqcHBmKS0+cGFsZXR0ZSAhPSBOVUxMKQorICAgICAgeworICAgICAgICAgZnJlZSgoKnBwZiktPnBhbGV0dGUpOworICAgICAgICAgKCpwcGYpLT5wYWxldHRlID0gTlVMTDsKKyAgICAgICAgICgqcHBmKS0+bnBhbGV0dGUgPSAwOworICAgICAgfQorICAgICAgZnJlZSgqcHBmKTsKKyAgICAgICpwcGYgPSBOVUxMOworICAgfQorfQorCisvKiBNYWluIGludGVyZmFjZSB0byBmaWxlIHN0b3JlYWdlLCBhZnRlciB3cml0aW5nIGEgbmV3IFBORyBmaWxlIChzZWUgdGhlIEFQSQorICogYmVsb3cpIGNhbGwgc3RvcmVfc3RvcmVmaWxlIHRvIHN0b3JlIHRoZSByZXN1bHQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgaWQuCisgKi8KK3N0YXRpYyB2b2lkCitzdG9yZV9zdG9yZWZpbGUocG5nX3N0b3JlICpwcywgcG5nX3VpbnRfMzIgaWQpCit7CisgICBwbmdfc3RvcmVfZmlsZSAqcGYgPSB2b2lkY2FzdChwbmdfc3RvcmVfZmlsZSosIG1hbGxvYyhzaXplb2YgKnBmKSk7CisgICBpZiAocGYgPT0gTlVMTCkKKyAgICAgIHBuZ19lcnJvcihwcy0+cHdyaXRlLCAic3RvcmVmaWxlOiBPT00iKTsKKyAgIHNhZmVjYXQocGYtPm5hbWUsIHNpemVvZiBwZi0+bmFtZSwgMCwgcHMtPnduYW1lKTsKKyAgIHBmLT5pZCA9IGlkOworICAgcGYtPmRhdGEgPSBwcy0+bmV3OworICAgcGYtPmRhdGFjb3VudCA9IHBzLT53cml0ZXBvczsKKyAgIHBzLT5uZXcucHJldiA9IE5VTEw7CisgICBwcy0+d3JpdGVwb3MgPSAwOworICAgcGYtPnBhbGV0dGUgPSBwcy0+cGFsZXR0ZTsKKyAgIHBmLT5ucGFsZXR0ZSA9IHBzLT5ucGFsZXR0ZTsKKyAgIHBzLT5wYWxldHRlID0gMDsKKyAgIHBzLT5ucGFsZXR0ZSA9IDA7CisKKyAgIC8qIEFuZCBzYXZlIGl0LiAqLworICAgcGYtPm5leHQgPSBwcy0+c2F2ZWQ7CisgICBwcy0+c2F2ZWQgPSBwZjsKK30KKworLyogR2VuZXJhdGUgYW4gZXJyb3IgbWVzc2FnZSAoaW4gdGhlIGdpdmVuIGJ1ZmZlcikgKi8KK3N0YXRpYyBzaXplX3QKK3N0b3JlX21lc3NhZ2UocG5nX3N0b3JlICpwcywgcG5nX2NvbnN0X3N0cnVjdHAgcHAsIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZnNpemUsCisgICBzaXplX3QgcG9zLCBjb25zdCBjaGFyICptc2cpCit7CisgICBpZiAocHAgIT0gTlVMTCAmJiBwcCA9PSBwcy0+cHJlYWQpCisgICB7CisgICAgICAvKiBSZWFkaW5nIGEgZmlsZSAqLworICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIGJ1ZnNpemUsIHBvcywgInJlYWQ6ICIpOworCisgICAgICBpZiAocHMtPmN1cnJlbnQgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIHBvcyA9IHNhZmVjYXQoYnVmZmVyLCBidWZzaXplLCBwb3MsIHBzLT5jdXJyZW50LT5uYW1lKTsKKyAgICAgICAgIHBvcyA9IHNhZmVjYXQoYnVmZmVyLCBidWZzaXplLCBwb3MsIHNlcCk7CisgICAgICB9CisgICB9CisKKyAgIGVsc2UgaWYgKHBwICE9IE5VTEwgJiYgcHAgPT0gcHMtPnB3cml0ZSkKKyAgIHsKKyAgICAgIC8qIFdyaXRpbmcgYSBmaWxlICovCisgICAgICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCAid3JpdGU6ICIpOworICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIGJ1ZnNpemUsIHBvcywgcHMtPnduYW1lKTsKKyAgICAgIHBvcyA9IHNhZmVjYXQoYnVmZmVyLCBidWZzaXplLCBwb3MsIHNlcCk7CisgICB9CisKKyAgIGVsc2UKKyAgIHsKKyAgICAgIC8qIE5laXRoZXIgcmVhZGluZyBub3Igd3JpdGluZyAob3IgYSBtZW1vcnkgZXJyb3IgaW4gc3RydWN0IGRlbGV0ZSkgKi8KKyAgICAgIHBvcyA9IHNhZmVjYXQoYnVmZmVyLCBidWZzaXplLCBwb3MsICJwbmd2YWxpZDogIik7CisgICB9CisKKyAgIGlmIChwcy0+dGVzdFswXSAhPSAwKQorICAgeworICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIGJ1ZnNpemUsIHBvcywgcHMtPnRlc3QpOworICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIGJ1ZnNpemUsIHBvcywgc2VwKTsKKyAgIH0KKyAgIHBvcyA9IHNhZmVjYXQoYnVmZmVyLCBidWZzaXplLCBwb3MsIG1zZyk7CisgICByZXR1cm4gcG9zOworfQorCisvKiBWZXJib3NlIG91dHB1dCB0byB0aGUgZXJyb3Igc3RyZWFtOiAqLworc3RhdGljIHZvaWQKK3N0b3JlX3ZlcmJvc2UocG5nX3N0b3JlICpwcywgcG5nX2NvbnN0X3N0cnVjdHAgcHAsIHBuZ19jb25zdF9jaGFycCBwcmVmaXgsCisgICBwbmdfY29uc3RfY2hhcnAgbWVzc2FnZSkKK3sKKyAgIGNoYXIgYnVmZmVyWzUxMl07CisKKyAgIGlmIChwcmVmaXgpCisgICAgICBmcHV0cyhwcmVmaXgsIHN0ZGVycik7CisKKyAgICh2b2lkKXN0b3JlX21lc3NhZ2UocHMsIHBwLCBidWZmZXIsIHNpemVvZiBidWZmZXIsIDAsIG1lc3NhZ2UpOworICAgZnB1dHMoYnVmZmVyLCBzdGRlcnIpOworICAgZnB1dGMoJ1xuJywgc3RkZXJyKTsKK30KKworLyogTG9nIGFuIGVycm9yIG9yIHdhcm5pbmcgLSB0aGUgcmVsZXZhbnQgY291bnQgaXMgYWx3YXlzIGluY3JlbWVudGVkLiAqLworc3RhdGljIHZvaWQKK3N0b3JlX2xvZyhwbmdfc3RvcmUqIHBzLCBwbmdfY29uc3Rfc3RydWN0cCBwcCwgcG5nX2NvbnN0X2NoYXJwIG1lc3NhZ2UsCisgICBpbnQgaXNfZXJyb3IpCit7CisgICAvKiBUaGUgd2FybmluZyBpcyBjb3BpZWQgdG8gdGhlIGVycm9yIGJ1ZmZlciBpZiB0aGVyZSBhcmUgbm8gZXJyb3JzIGFuZCBpdCBpcworICAgICogdGhlIGZpcnN0IHdhcm5pbmcuICBUaGUgZXJyb3IgaXMgY29waWVkIHRvIHRoZSBlcnJvciBidWZmZXIgaWYgaXQgaXMgdGhlCisgICAgKiBmaXJzdCBlcnJvciAob3ZlcndyaXRpbmcgYW55IHByaW9yIHdhcm5pbmdzKS4KKyAgICAqLworICAgaWYgKGlzX2Vycm9yID8gKHBzLT5uZXJyb3JzKSsrID09IDAgOgorICAgICAgIChwcy0+bndhcm5pbmdzKSsrID09IDAgJiYgcHMtPm5lcnJvcnMgPT0gMCkKKyAgICAgIHN0b3JlX21lc3NhZ2UocHMsIHBwLCBwcy0+ZXJyb3IsIHNpemVvZiBwcy0+ZXJyb3IsIDAsIG1lc3NhZ2UpOworCisgICBpZiAocHMtPnZlcmJvc2UpCisgICAgICBzdG9yZV92ZXJib3NlKHBzLCBwcCwgaXNfZXJyb3IgPyAiZXJyb3I6ICIgOiAid2FybmluZzogIiwgbWVzc2FnZSk7Cit9CisKKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKKy8qIEludGVybmFsIGVycm9yIGZ1bmN0aW9uLCBjYWxsZWQgd2l0aCBhIHBuZ19zdG9yZSBidXQgbm8gbGlicG5nIHN0dWZmLiAqLworc3RhdGljIHZvaWQKK2ludGVybmFsX2Vycm9yKHBuZ19zdG9yZSAqcHMsIHBuZ19jb25zdF9jaGFycCBtZXNzYWdlKQoreworICAgc3RvcmVfbG9nKHBzLCBOVUxMLCBtZXNzYWdlLCAxIC8qIGVycm9yICovKTsKKworICAgLyogQW5kIGZpbmFsbHkgdGhyb3cgYW4gZXhjZXB0aW9uLiAqLworICAgeworICAgICAgc3RydWN0IGV4Y2VwdGlvbl9jb250ZXh0ICp0aGVfZXhjZXB0aW9uX2NvbnRleHQgPSAmcHMtPmV4Y2VwdGlvbl9jb250ZXh0OworICAgICAgVGhyb3cgcHM7CisgICB9Cit9CisjZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICovCisKKy8qIEZ1bmN0aW9ucyB0byB1c2UgYXMgUE5HIGNhbGxiYWNrcy4gKi8KK3N0YXRpYyB2b2lkIFBOR0NCQVBJCitzdG9yZV9lcnJvcihwbmdfc3RydWN0cCBwcEluLCBwbmdfY29uc3RfY2hhcnAgbWVzc2FnZSkgLyogUE5HX05PUkVUVVJOICovCit7CisgICBwbmdfY29uc3Rfc3RydWN0cCBwcCA9IHBwSW47CisgICBwbmdfc3RvcmUgKnBzID0gdm9pZGNhc3QocG5nX3N0b3JlKiwgcG5nX2dldF9lcnJvcl9wdHIocHApKTsKKworICAgaWYgKCFwcy0+ZXhwZWN0X2Vycm9yKQorICAgICAgc3RvcmVfbG9nKHBzLCBwcCwgbWVzc2FnZSwgMSAvKiBlcnJvciAqLyk7CisKKyAgIC8qIEFuZCBmaW5hbGx5IHRocm93IGFuIGV4Y2VwdGlvbi4gKi8KKyAgIHsKKyAgICAgIHN0cnVjdCBleGNlcHRpb25fY29udGV4dCAqdGhlX2V4Y2VwdGlvbl9jb250ZXh0ID0gJnBzLT5leGNlcHRpb25fY29udGV4dDsKKyAgICAgIFRocm93IHBzOworICAgfQorfQorCitzdGF0aWMgdm9pZCBQTkdDQkFQSQorc3RvcmVfd2FybmluZyhwbmdfc3RydWN0cCBwcEluLCBwbmdfY29uc3RfY2hhcnAgbWVzc2FnZSkKK3sKKyAgIHBuZ19jb25zdF9zdHJ1Y3RwIHBwID0gcHBJbjsKKyAgIHBuZ19zdG9yZSAqcHMgPSB2b2lkY2FzdChwbmdfc3RvcmUqLCBwbmdfZ2V0X2Vycm9yX3B0cihwcCkpOworCisgICBpZiAoIXBzLT5leHBlY3Rfd2FybmluZykKKyAgICAgIHN0b3JlX2xvZyhwcywgcHAsIG1lc3NhZ2UsIDAgLyogd2FybmluZyAqLyk7CisgICBlbHNlCisgICAgICBwcy0+c2F3X3dhcm5pbmcgPSAxOworfQorCisvKiBUaGVzZSBzb21ld2hhdCBvZGQgZnVuY3Rpb25zIGFyZSB1c2VkIHdoZW4gcmVhZGluZyBhbiBpbWFnZSB0byBlbnN1cmUgdGhhdAorICogdGhlIGJ1ZmZlciBpcyBiaWcgZW5vdWdoLCB0aGUgcG5nX3N0cnVjdHAgaXMgZm9yIGVycm9ycy4KKyAqLworLyogUmV0dXJuIGEgc2luZ2xlIHJvdyBmcm9tIHRoZSBjb3JyZWN0IGltYWdlLiAqLworc3RhdGljIHBuZ19ieXRlcAorc3RvcmVfaW1hZ2Vfcm93KGNvbnN0IHBuZ19zdG9yZSogcHMsIHBuZ19jb25zdF9zdHJ1Y3RwIHBwLCBpbnQgbkltYWdlLAorICAgcG5nX3VpbnRfMzIgeSkKK3sKKyAgIHBuZ19zaXplX3QgY29mZnNldCA9IChuSW1hZ2UgKiBwcy0+aW1hZ2VfaCArIHkpICogKHBzLT5jYl9yb3cgKyA1KSArIDI7CisKKyAgIGlmIChwcy0+aW1hZ2UgPT0gTlVMTCkKKyAgICAgIHBuZ19lcnJvcihwcCwgIm5vIGFsbG9jYXRlZCBpbWFnZSIpOworCisgICBpZiAoY29mZnNldCArIHBzLT5jYl9yb3cgKyAzID4gcHMtPmNiX2ltYWdlKQorICAgICAgcG5nX2Vycm9yKHBwLCAiaW1hZ2UgdG9vIHNtYWxsIik7CisKKyAgIHJldHVybiBwcy0+aW1hZ2UgKyBjb2Zmc2V0OworfQorCitzdGF0aWMgdm9pZAorc3RvcmVfaW1hZ2VfZnJlZShwbmdfc3RvcmUgKnBzLCBwbmdfY29uc3Rfc3RydWN0cCBwcCkKK3sKKyAgIGlmIChwcy0+aW1hZ2UgIT0gTlVMTCkKKyAgIHsKKyAgICAgIHBuZ19ieXRlcCBpbWFnZSA9IHBzLT5pbWFnZTsKKworICAgICAgaWYgKGltYWdlWy0xXSAhPSAweGVkIHx8IGltYWdlW3BzLT5jYl9pbWFnZV0gIT0gMHhmZSkKKyAgICAgIHsKKyAgICAgICAgIGlmIChwcCAhPSBOVUxMKQorICAgICAgICAgICAgcG5nX2Vycm9yKHBwLCAicG5nX3N0b3JlIGltYWdlIG92ZXJ3cml0ZSAoMSkiKTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0b3JlX2xvZyhwcywgTlVMTCwgInBuZ19zdG9yZSBpbWFnZSBvdmVyd3JpdGUgKDIpIiwgMSk7CisgICAgICB9CisKKyAgICAgIHBzLT5pbWFnZSA9IE5VTEw7CisgICAgICBwcy0+Y2JfaW1hZ2UgPSAwOworICAgICAgLS1pbWFnZTsKKyAgICAgIGZyZWUoaW1hZ2UpOworICAgfQorfQorCitzdGF0aWMgdm9pZAorc3RvcmVfZW5zdXJlX2ltYWdlKHBuZ19zdG9yZSAqcHMsIHBuZ19jb25zdF9zdHJ1Y3RwIHBwLCBpbnQgbkltYWdlcywKKyAgIHBuZ19zaXplX3QgY2JSb3csIHBuZ191aW50XzMyIGNSb3dzKQoreworICAgcG5nX3NpemVfdCBjYiA9IG5JbWFnZXMgKiBjUm93cyAqIChjYlJvdyArIDUpOworCisgICBpZiAocHMtPmNiX2ltYWdlIDwgY2IpCisgICB7CisgICAgICBwbmdfYnl0ZXAgaW1hZ2U7CisKKyAgICAgIHN0b3JlX2ltYWdlX2ZyZWUocHMsIHBwKTsKKworICAgICAgLyogVGhlIGJ1ZmZlciBpcyBkZWxpYmVyYXRlbHkgbWlzLWFsaWduZWQuICovCisgICAgICBpbWFnZSA9IHZvaWRjYXN0KHBuZ19ieXRlcCwgbWFsbG9jKGNiKzIpKTsKKyAgICAgIGlmIChpbWFnZSA9PSBOVUxMKQorICAgICAgeworICAgICAgICAgLyogQ2FsbGVkIGZyb20gdGhlIHN0YXJ0dXAgLSBpZ25vcmUgdGhlIGVycm9yIGZvciB0aGUgbW9tZW50LiAqLworICAgICAgICAgaWYgKHBwID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgIHBuZ19lcnJvcihwcCwgIk9PTSBhbGxvY2F0aW5nIGltYWdlIGJ1ZmZlciIpOworICAgICAgfQorCisgICAgICAvKiBUaGVzZSBtYWdpYyB0YWdzIGFyZSB1c2VkIHRvIGRldGVjdCBvdmVyd3JpdGVzIGFib3ZlLiAqLworICAgICAgKytpbWFnZTsKKyAgICAgIGltYWdlWy0xXSA9IDB4ZWQ7CisgICAgICBpbWFnZVtjYl0gPSAweGZlOworCisgICAgICBwcy0+aW1hZ2UgPSBpbWFnZTsKKyAgICAgIHBzLT5jYl9pbWFnZSA9IGNiOworICAgfQorCisgICAvKiBXZSBoYXZlIGFuIGFkZXF1YXRlIHNpemVkIGltYWdlOyBsYXkgb3V0IHRoZSByb3dzLiAgVGhlcmUgYXJlIDIgYnl0ZXMgYXQKKyAgICAqIHRoZSBzdGFydCBhbmQgdGhyZWUgYXQgdGhlIGVuZCBvZiBlYWNoICh0aGlzIGVuc3VyZXMgdGhhdCB0aGUgcm93CisgICAgKiBhbGlnbm1lbnQgc3RhcnRzIG91dCBvZGQgLSAyKzEgYW5kIGNoYW5nZXMgZm9yIGxhcmdlciBpbWFnZXMgb24gZWFjaCByb3cuKQorICAgICovCisgICBwcy0+Y2Jfcm93ID0gY2JSb3c7CisgICBwcy0+aW1hZ2VfaCA9IGNSb3dzOworCisgICAvKiBGb3IgZXJyb3IgY2hlY2tpbmcsIHRoZSB3aG9sZSBidWZmZXIgaXMgc2V0IHRvIDEwMTEwMDEwICgweGIyIC0gMTc4KS4KKyAgICAqIFRoaXMgZGVsaWJlcmF0ZWx5IGRvZXNuJ3QgbWF0Y2ggdGhlIGJpdHMgaW4gdGhlIHNpemUgdGVzdCBpbWFnZSB3aGljaCBhcmUKKyAgICAqIG91dHNpZGUgdGhlIGltYWdlOyB0aGVzZSBhcmUgc2V0IHRvIDB4ZmYgKGFsbCAxKS4gIFRvIG1ha2UgdGhlIHJvdworICAgICogY29tcGFyaXNvbiB3b3JrIGluIHRoZSAnc2l6ZScgdGVzdCBjYXNlIHRoZSBzaXplIHJvd3MgYXJlIHByZS1pbml0aWFsaXplZAorICAgICogdG8gdGhlIHNhbWUgdmFsdWUgcHJpb3IgdG8gY2FsbGluZyAnc3RhbmRhcmRfcm93Jy4KKyAgICAqLworICAgbWVtc2V0KHBzLT5pbWFnZSwgMTc4LCBjYik7CisKKyAgIC8qIFRoZW4gcHV0IGluIHRoZSBtYXJrcy4gKi8KKyAgIHdoaWxlICgtLW5JbWFnZXMgPj0gMCkKKyAgIHsKKyAgICAgIHBuZ191aW50XzMyIHk7CisKKyAgICAgIGZvciAoeT0wOyB5PGNSb3dzOyArK3kpCisgICAgICB7CisgICAgICAgICBwbmdfYnl0ZXAgcm93ID0gc3RvcmVfaW1hZ2Vfcm93KHBzLCBwcCwgbkltYWdlcywgeSk7CisKKyAgICAgICAgIC8qIFRoZSBtYXJrZXJzOiAqLworICAgICAgICAgcm93Wy0yXSA9IDE5MDsKKyAgICAgICAgIHJvd1stMV0gPSAyMzk7CisgICAgICAgICByb3dbY2JSb3ddID0gMjIyOworICAgICAgICAgcm93W2NiUm93KzFdID0gMTczOworICAgICAgICAgcm93W2NiUm93KzJdID0gMTc7CisgICAgICB9CisgICB9Cit9CisKKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKK3N0YXRpYyB2b2lkCitzdG9yZV9pbWFnZV9jaGVjayhjb25zdCBwbmdfc3RvcmUqIHBzLCBwbmdfY29uc3Rfc3RydWN0cCBwcCwgaW50IGlJbWFnZSkKK3sKKyAgIHBuZ19jb25zdF9ieXRlcCBpbWFnZSA9IHBzLT5pbWFnZTsKKworICAgaWYgKGltYWdlWy0xXSAhPSAweGVkIHx8IGltYWdlW3BzLT5jYl9pbWFnZV0gIT0gMHhmZSkKKyAgICAgIHBuZ19lcnJvcihwcCwgImltYWdlIG92ZXJ3cml0ZSIpOworICAgZWxzZQorICAgeworICAgICAgcG5nX3NpemVfdCBjYlJvdyA9IHBzLT5jYl9yb3c7CisgICAgICBwbmdfdWludF8zMiByb3dzID0gcHMtPmltYWdlX2g7CisKKyAgICAgIGltYWdlICs9IGlJbWFnZSAqIChjYlJvdys1KSAqIHBzLT5pbWFnZV9oOworCisgICAgICBpbWFnZSArPSAyOyAvKiBza2lwIGltYWdlIGZpcnN0IHJvdyBtYXJrZXJzICovCisKKyAgICAgIHdoaWxlIChyb3dzLS0gPiAwKQorICAgICAgeworICAgICAgICAgaWYgKGltYWdlWy0yXSAhPSAxOTAgfHwgaW1hZ2VbLTFdICE9IDIzOSkKKyAgICAgICAgICAgIHBuZ19lcnJvcihwcCwgInJvdyBzdGFydCBvdmVyd3JpdHRlbiIpOworCisgICAgICAgICBpZiAoaW1hZ2VbY2JSb3ddICE9IDIyMiB8fCBpbWFnZVtjYlJvdysxXSAhPSAxNzMgfHwKKyAgICAgICAgICAgIGltYWdlW2NiUm93KzJdICE9IDE3KQorICAgICAgICAgICAgcG5nX2Vycm9yKHBwLCAicm93IGVuZCBvdmVyd3JpdHRlbiIpOworCisgICAgICAgICBpbWFnZSArPSBjYlJvdys1OworICAgICAgfQorICAgfQorfQorI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAqLworCitzdGF0aWMgdm9pZCBQTkdDQkFQSQorc3RvcmVfd3JpdGUocG5nX3N0cnVjdHAgcHBJbiwgcG5nX2J5dGVwIHBiLCBwbmdfc2l6ZV90IHN0KQoreworICAgcG5nX2NvbnN0X3N0cnVjdHAgcHAgPSBwcEluOworICAgcG5nX3N0b3JlICpwcyA9IHZvaWRjYXN0KHBuZ19zdG9yZSosIHBuZ19nZXRfaW9fcHRyKHBwKSk7CisKKyAgIGlmIChwcy0+cHdyaXRlICE9IHBwKQorICAgICAgcG5nX2Vycm9yKHBwLCAic3RvcmUgc3RhdGUgZGFtYWdlZCIpOworCisgICB3aGlsZSAoc3QgPiAwKQorICAgeworICAgICAgc2l6ZV90IGNiOworCisgICAgICBpZiAocHMtPndyaXRlcG9zID49IFNUT1JFX0JVRkZFUl9TSVpFKQorICAgICAgICAgc3RvcmVfc3RvcmVuZXcocHMpOworCisgICAgICBjYiA9IHN0OworCisgICAgICBpZiAoY2IgPiBTVE9SRV9CVUZGRVJfU0laRSAtIHBzLT53cml0ZXBvcykKKyAgICAgICAgIGNiID0gU1RPUkVfQlVGRkVSX1NJWkUgLSBwcy0+d3JpdGVwb3M7CisKKyAgICAgIG1lbWNweShwcy0+bmV3LmJ1ZmZlciArIHBzLT53cml0ZXBvcywgcGIsIGNiKTsKKyAgICAgIHBiICs9IGNiOworICAgICAgc3QgLT0gY2I7CisgICAgICBwcy0+d3JpdGVwb3MgKz0gY2I7CisgICB9Cit9CisKK3N0YXRpYyB2b2lkIFBOR0NCQVBJCitzdG9yZV9mbHVzaChwbmdfc3RydWN0cCBwcEluKQoreworICAgVU5VU0VEKHBwSW4pIC8qRE9FUyBOT1RISU5HKi8KK30KKworI2lmZGVmIFBOR19SRUFEX1NVUFBPUlRFRAorc3RhdGljIHNpemVfdAorc3RvcmVfcmVhZF9idWZmZXJfc2l6ZShwbmdfc3RvcmUgKnBzKQoreworICAgLyogUmV0dXJuIHRoZSBieXRlcyBhdmFpbGFibGUgZm9yIHJlYWQgaW4gdGhlIGN1cnJlbnQgYnVmZmVyLiAqLworICAgaWYgKHBzLT5uZXh0ICE9ICZwcy0+Y3VycmVudC0+ZGF0YSkKKyAgICAgIHJldHVybiBTVE9SRV9CVUZGRVJfU0laRTsKKworICAgcmV0dXJuIHBzLT5jdXJyZW50LT5kYXRhY291bnQ7Cit9CisKKyNpZmRlZiBQTkdfUkVBRF9UUkFOU0ZPUk1TX1NVUFBPUlRFRAorLyogUmV0dXJuIHRvdGFsIGJ5dGVzIGF2YWlsYWJsZSBmb3IgcmVhZC4gKi8KK3N0YXRpYyBzaXplX3QKK3N0b3JlX3JlYWRfYnVmZmVyX2F2YWlsKHBuZ19zdG9yZSAqcHMpCit7CisgICBpZiAocHMtPmN1cnJlbnQgIT0gTlVMTCAmJiBwcy0+bmV4dCAhPSBOVUxMKQorICAgeworICAgICAgcG5nX3N0b3JlX2J1ZmZlciAqbmV4dCA9ICZwcy0+Y3VycmVudC0+ZGF0YTsKKyAgICAgIHNpemVfdCBjYkF2YWlsID0gcHMtPmN1cnJlbnQtPmRhdGFjb3VudDsKKworICAgICAgd2hpbGUgKG5leHQgIT0gcHMtPm5leHQgJiYgbmV4dCAhPSBOVUxMKQorICAgICAgeworICAgICAgICAgbmV4dCA9IG5leHQtPnByZXY7CisgICAgICAgICBjYkF2YWlsICs9IFNUT1JFX0JVRkZFUl9TSVpFOworICAgICAgfQorCisgICAgICBpZiAobmV4dCAhPSBwcy0+bmV4dCkKKyAgICAgICAgIHBuZ19lcnJvcihwcy0+cHJlYWQsICJidWZmZXIgcmVhZCBlcnJvciIpOworCisgICAgICBpZiAoY2JBdmFpbCA+IHBzLT5yZWFkcG9zKQorICAgICAgICAgcmV0dXJuIGNiQXZhaWwgLSBwcy0+cmVhZHBvczsKKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludAorc3RvcmVfcmVhZF9idWZmZXJfbmV4dChwbmdfc3RvcmUgKnBzKQoreworICAgcG5nX3N0b3JlX2J1ZmZlciAqcGJPbGQgPSBwcy0+bmV4dDsKKyAgIHBuZ19zdG9yZV9idWZmZXIgKnBiTmV3ID0gJnBzLT5jdXJyZW50LT5kYXRhOworICAgaWYgKHBiT2xkICE9IHBiTmV3KQorICAgeworICAgICAgd2hpbGUgKHBiTmV3ICE9IE5VTEwgJiYgcGJOZXctPnByZXYgIT0gcGJPbGQpCisgICAgICAgICBwYk5ldyA9IHBiTmV3LT5wcmV2OworCisgICAgICBpZiAocGJOZXcgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIHBzLT5uZXh0ID0gcGJOZXc7CisgICAgICAgICBwcy0+cmVhZHBvcyA9IDA7CisgICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKworICAgICAgcG5nX2Vycm9yKHBzLT5wcmVhZCwgImJ1ZmZlciBsb3N0Iik7CisgICB9CisKKyAgIHJldHVybiAwOyAvKiBFT0Ygb3IgZXJyb3IgKi8KK30KKworLyogTmVlZCBzZXBhcmF0ZSBpbXBsZW1lbnRhdGlvbiBhbmQgY2FsbGJhY2sgdG8gYWxsb3cgdXNlIG9mIHRoZSBzYW1lIGNvZGUKKyAqIGR1cmluZyBwcm9ncmVzc2l2ZSByZWFkLCB3aGVyZSB0aGUgaW9fcHRyIGlzIHNldCBpbnRlcm5hbGx5IGJ5IGxpYnBuZy4KKyAqLworc3RhdGljIHZvaWQKK3N0b3JlX3JlYWRfaW1wKHBuZ19zdG9yZSAqcHMsIHBuZ19ieXRlcCBwYiwgcG5nX3NpemVfdCBzdCkKK3sKKyAgIGlmIChwcy0+Y3VycmVudCA9PSBOVUxMIHx8IHBzLT5uZXh0ID09IE5VTEwpCisgICAgICBwbmdfZXJyb3IocHMtPnByZWFkLCAic3RvcmUgc3RhdGUgZGFtYWdlZCIpOworCisgICB3aGlsZSAoc3QgPiAwKQorICAgeworICAgICAgc2l6ZV90IGNiQXZhaWwgPSBzdG9yZV9yZWFkX2J1ZmZlcl9zaXplKHBzKSAtIHBzLT5yZWFkcG9zOworCisgICAgICBpZiAoY2JBdmFpbCA+IDApCisgICAgICB7CisgICAgICAgICBpZiAoY2JBdmFpbCA+IHN0KSBjYkF2YWlsID0gc3Q7CisgICAgICAgICBtZW1jcHkocGIsIHBzLT5uZXh0LT5idWZmZXIgKyBwcy0+cmVhZHBvcywgY2JBdmFpbCk7CisgICAgICAgICBzdCAtPSBjYkF2YWlsOworICAgICAgICAgcGIgKz0gY2JBdmFpbDsKKyAgICAgICAgIHBzLT5yZWFkcG9zICs9IGNiQXZhaWw7CisgICAgICB9CisKKyAgICAgIGVsc2UgaWYgKCFzdG9yZV9yZWFkX2J1ZmZlcl9uZXh0KHBzKSkKKyAgICAgICAgIHBuZ19lcnJvcihwcy0+cHJlYWQsICJyZWFkIGJleW9uZCBlbmQgb2YgZmlsZSIpOworICAgfQorfQorCitzdGF0aWMgdm9pZCBQTkdDQkFQSQorc3RvcmVfcmVhZChwbmdfc3RydWN0cCBwcEluLCBwbmdfYnl0ZXAgcGIsIHBuZ19zaXplX3Qgc3QpCit7CisgICBwbmdfY29uc3Rfc3RydWN0cCBwcCA9IHBwSW47CisgICBwbmdfc3RvcmUgKnBzID0gdm9pZGNhc3QocG5nX3N0b3JlKiwgcG5nX2dldF9pb19wdHIocHApKTsKKworICAgaWYgKHBzID09IE5VTEwgfHwgcHMtPnByZWFkICE9IHBwKQorICAgICAgcG5nX2Vycm9yKHBwLCAiYmFkIHN0b3JlIHJlYWQgY2FsbCIpOworCisgICBzdG9yZV9yZWFkX2ltcChwcywgcGIsIHN0KTsKK30KKworc3RhdGljIHZvaWQKK3N0b3JlX3Byb2dyZXNzaXZlX3JlYWQocG5nX3N0b3JlICpwcywgcG5nX3N0cnVjdHAgcHAsIHBuZ19pbmZvcCBwaSkKK3sKKyAgIC8qIE5vdGljZSB0aGF0IGEgY2FsbCB0byBzdG9yZV9yZWFkIHdpbGwgY2F1c2UgdGhpcyBmdW5jdGlvbiB0byBmYWlsIGJlY2F1c2UKKyAgICAqIHJlYWRwb3Mgd2lsbCBiZSBzZXQuCisgICAgKi8KKyAgIGlmIChwcy0+cHJlYWQgIT0gcHAgfHwgcHMtPmN1cnJlbnQgPT0gTlVMTCB8fCBwcy0+bmV4dCA9PSBOVUxMKQorICAgICAgcG5nX2Vycm9yKHBwLCAic3RvcmUgc3RhdGUgZGFtYWdlZCAocHJvZ3Jlc3NpdmUpIik7CisKKyAgIGRvCisgICB7CisgICAgICBpZiAocHMtPnJlYWRwb3MgIT0gMCkKKyAgICAgICAgIHBuZ19lcnJvcihwcCwgInN0b3JlX3JlYWQgY2FsbGVkIGR1cmluZyBwcm9ncmVzc2l2ZSByZWFkIik7CisKKyAgICAgIHBuZ19wcm9jZXNzX2RhdGEocHAsIHBpLCBwcy0+bmV4dC0+YnVmZmVyLCBzdG9yZV9yZWFkX2J1ZmZlcl9zaXplKHBzKSk7CisgICB9CisgICB3aGlsZSAoc3RvcmVfcmVhZF9idWZmZXJfbmV4dChwcykpOworfQorI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAqLworCisvKiBUaGUgY2FsbGVyIG11c3QgZmlsbCB0aGlzIGluOiAqLworc3RhdGljIHN0b3JlX3BhbGV0dGVfZW50cnkgKgorc3RvcmVfd3JpdGVfcGFsZXR0ZShwbmdfc3RvcmUgKnBzLCBpbnQgbnBhbGV0dGUpCit7CisgICBpZiAocHMtPnB3cml0ZSA9PSBOVUxMKQorICAgICAgc3RvcmVfbG9nKHBzLCBOVUxMLCAiYXR0ZW1wdCB0byB3cml0ZSBwYWxldHRlIHdpdGhvdXQgd3JpdGUgc3RyZWFtIiwgMSk7CisKKyAgIGlmIChwcy0+cGFsZXR0ZSAhPSBOVUxMKQorICAgICAgcG5nX2Vycm9yKHBzLT5wd3JpdGUsICJtdWx0aXBsZSBzdG9yZV93cml0ZV9wYWxldHRlIGNhbGxzIik7CisKKyAgIC8qIFRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgcmV0dXJuIE5VTEwgaWYgY2FsbGVkIHdpdGggJzAnISAqLworICAgaWYgKG5wYWxldHRlID4gMCkKKyAgIHsKKyAgICAgIHBzLT5wYWxldHRlID0gdm9pZGNhc3Qoc3RvcmVfcGFsZXR0ZV9lbnRyeSosIG1hbGxvYyhucGFsZXR0ZSAqCisgICAgICAgICBzaXplb2YgKnBzLT5wYWxldHRlKSk7CisKKyAgICAgIGlmIChwcy0+cGFsZXR0ZSA9PSBOVUxMKQorICAgICAgICAgcG5nX2Vycm9yKHBzLT5wd3JpdGUsICJzdG9yZSBuZXcgcGFsZXR0ZTogT09NIik7CisKKyAgICAgIHBzLT5ucGFsZXR0ZSA9IG5wYWxldHRlOworICAgfQorCisgICByZXR1cm4gcHMtPnBhbGV0dGU7Cit9CisKKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKK3N0YXRpYyBzdG9yZV9wYWxldHRlX2VudHJ5ICoKK3N0b3JlX2N1cnJlbnRfcGFsZXR0ZShwbmdfc3RvcmUgKnBzLCBpbnQgKm5wYWxldHRlKQoreworICAgLyogVGhpcyBpcyBhbiBpbnRlcm5hbCBlcnJvciAodGhlIGNhbGwgaGFzIGJlZW4gbWFkZSBvdXRzaWRlIGEgcmVhZAorICAgICogb3BlcmF0aW9uLikKKyAgICAqLworICAgaWYgKHBzLT5jdXJyZW50ID09IE5VTEwpCisgICB7CisgICAgICBzdG9yZV9sb2cocHMsIHBzLT5wcmVhZCwgIm5vIGN1cnJlbnQgc3RyZWFtIGZvciBwYWxldHRlIiwgMSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgLyogVGhlIHJlc3VsdCBtYXkgYmUgbnVsbCBpZiB0aGVyZSBpcyBubyBwYWxldHRlLiAqLworICAgKm5wYWxldHRlID0gcHMtPmN1cnJlbnQtPm5wYWxldHRlOworICAgcmV0dXJuIHBzLT5jdXJyZW50LT5wYWxldHRlOworfQorI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTUVNT1JZIE1BTkFHRU1FTlQqKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKKy8qIEEgc3RvcmVfbWVtb3J5IGlzIHNpbXBseSB0aGUgaGVhZGVyIGZvciBhbiBhbGxvY2F0ZWQgYmxvY2sgb2YgbWVtb3J5LiAgVGhlCisgKiBwb2ludGVyIHJldHVybmVkIHRvIGxpYnBuZyBpcyBqdXN0IGFmdGVyIHRoZSBlbmQgb2YgdGhlIGhlYWRlciBibG9jaywgdGhlCisgKiBhbGxvY2F0ZWQgbWVtb3J5IGlzIGZvbGxvd2VkIGJ5IGEgc2Vjb25kIGNvcHkgb2YgdGhlICdtYXJrJy4KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc3RvcmVfbWVtb3J5Cit7CisgICBzdG9yZV9wb29sICAgICAgICAgICpwb29sOyAgICAvKiBPcmlnaW5hdGluZyBwb29sICovCisgICBzdHJ1Y3Qgc3RvcmVfbWVtb3J5ICpuZXh0OyAgICAvKiBTaW5nbHkgbGlua2VkIGxpc3QgKi8KKyAgIHBuZ19hbGxvY19zaXplX3QgICAgIHNpemU7ICAgIC8qIFNpemUgb2YgbWVtb3J5IGFsbG9jYXRlZCAqLworICAgcG5nX2J5dGUgICAgICAgICAgICAgbWFya1s0XTsgLyogSUQgbWFya2VyICovCit9IHN0b3JlX21lbW9yeTsKKworLyogSGFuZGxlIGEgZmF0YWwgZXJyb3IgaW4gbWVtb3J5IGFsbG9jYXRpb24uICBUaGlzIGNhbGxzIHBuZ19lcnJvciBpZiB0aGUKKyAqIGxpYnBuZyBzdHJ1Y3QgaXMgbm9uLU5VTEwsIGVsc2UgaXQgb3V0cHV0cyBhIG1lc3NhZ2UgYW5kIHJldHVybnMuICBUaGlzIG1lYW5zCisgKiB0aGF0IGEgbWVtb3J5IHByb2JsZW0gd2hpbGUgbGlicG5nIGlzIHJ1bm5pbmcgd2lsbCBhYm9ydCAocG5nX2Vycm9yKSB0aGUKKyAqIGhhbmRsaW5nIG9mIHBhcnRpY3VsYXIgZmlsZSB3aGlsZSBvbmUgaW4gY2xlYW51cCAoYWZ0ZXIgdGhlIGRlc3Ryb3kgb2YgdGhlCisgKiBzdHJ1Y3QgaGFzIHJldHVybmVkKSB3aWxsIHNpbXBseSBrZWVwIGdvaW5nIGFuZCBmcmVlIChvciBhdHRlbXB0IHRvIGZyZWUpCisgKiBhbGwgdGhlIG1lbW9yeS4KKyAqLworc3RhdGljIHZvaWQKK3N0b3JlX3Bvb2xfZXJyb3IocG5nX3N0b3JlICpwcywgcG5nX2NvbnN0X3N0cnVjdHAgcHAsIGNvbnN0IGNoYXIgKm1zZykKK3sKKyAgIGlmIChwcCAhPSBOVUxMKQorICAgICAgcG5nX2Vycm9yKHBwLCBtc2cpOworCisgICAvKiBFbHNlIHdlIGhhdmUgdG8gZG8gaXQgb3Vyc2VsdmVzLiAgcG5nX2Vycm9yIGV2ZW50dWFsbHkgY2FsbHMgc3RvcmVfbG9nLAorICAgICogYWJvdmUuICBzdG9yZV9sb2cgYWNjZXB0cyBhIE5VTEwgcG5nX3N0cnVjdHAgLSBpdCBqdXN0IGNoYW5nZXMgd2hhdCBnZXRzCisgICAgKiBvdXRwdXQgYnkgc3RvcmVfbWVzc2FnZS4KKyAgICAqLworICAgc3RvcmVfbG9nKHBzLCBwcCwgbXNnLCAxIC8qIGVycm9yICovKTsKK30KKworc3RhdGljIHZvaWQKK3N0b3JlX21lbW9yeV9mcmVlKHBuZ19jb25zdF9zdHJ1Y3RwIHBwLCBzdG9yZV9wb29sICpwb29sLCBzdG9yZV9tZW1vcnkgKm1lbW9yeSkKK3sKKyAgIC8qIE5vdGUgdGhhdCBwcCBtYXkgYmUgTlVMTCAoc2VlIHN0b3JlX3Bvb2xfZGVsZXRlIGJlbG93KSwgdGhlIGNhbGxlciBoYXMKKyAgICAqIGZvdW5kICdtZW1vcnknIGluIHBvb2wtPmxpc3QgKmFuZCogdW5saW5rZWQgdGhpcyBlbnRyeSwgc28gdGhpcyBpcyBhIHZhbGlkCisgICAgKiBwb2ludGVyIChmb3Igc3VyZSksIGJ1dCB0aGUgY29udGVudHMgbWF5IGhhdmUgYmVlbiB0cmFzaGVkLgorICAgICovCisgICBpZiAobWVtb3J5LT5wb29sICE9IHBvb2wpCisgICAgICBzdG9yZV9wb29sX2Vycm9yKHBvb2wtPnN0b3JlLCBwcCwgIm1lbW9yeSBjb3JydXB0ZWQgKHBvb2wpIik7CisKKyAgIGVsc2UgaWYgKG1lbWNtcChtZW1vcnktPm1hcmssIHBvb2wtPm1hcmssIHNpemVvZiBtZW1vcnktPm1hcmspICE9IDApCisgICAgICBzdG9yZV9wb29sX2Vycm9yKHBvb2wtPnN0b3JlLCBwcCwgIm1lbW9yeSBjb3JydXB0ZWQgKHN0YXJ0KSIpOworCisgICAvKiBJdCBzaG91bGQgYmUgc2FmZSB0byByZWFkIHRoZSBzaXplIGZpZWxkIG5vdy4gKi8KKyAgIGVsc2UKKyAgIHsKKyAgICAgIHBuZ19hbGxvY19zaXplX3QgY2IgPSBtZW1vcnktPnNpemU7CisKKyAgICAgIGlmIChjYiA+IHBvb2wtPm1heCkKKyAgICAgICAgIHN0b3JlX3Bvb2xfZXJyb3IocG9vbC0+c3RvcmUsIHBwLCAibWVtb3J5IGNvcnJ1cHRlZCAoc2l6ZSkiKTsKKworICAgICAgZWxzZSBpZiAobWVtY21wKChwbmdfYnl0ZXApKG1lbW9yeSsxKStjYiwgcG9vbC0+bWFyaywgc2l6ZW9mIHBvb2wtPm1hcmspCisgICAgICAgICAhPSAwKQorICAgICAgICAgc3RvcmVfcG9vbF9lcnJvcihwb29sLT5zdG9yZSwgcHAsICJtZW1vcnkgY29ycnVwdGVkIChlbmQpIik7CisKKyAgICAgIC8qIEZpbmFsbHkgZ2l2ZSB0aGUgbGlicmFyeSBhIGNoYW5jZSB0byBmaW5kIHByb2JsZW1zIHRvbzogKi8KKyAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgIHBvb2wtPmN1cnJlbnQgLT0gY2I7CisgICAgICAgICBmcmVlKG1lbW9yeSk7CisgICAgICAgICB9CisgICB9Cit9CisKK3N0YXRpYyB2b2lkCitzdG9yZV9wb29sX2RlbGV0ZShwbmdfc3RvcmUgKnBzLCBzdG9yZV9wb29sICpwb29sKQoreworICAgaWYgKHBvb2wtPmxpc3QgIT0gTlVMTCkKKyAgIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICVzICVzOiBtZW1vcnkgbG9zdCAobGlzdCBmb2xsb3dzKTpcbiIsIHBzLT50ZXN0LAorICAgICAgICAgcG9vbCA9PSAmcHMtPnJlYWRfbWVtb3J5X3Bvb2wgPyAicmVhZCIgOiAid3JpdGUiLAorICAgICAgICAgcG9vbCA9PSAmcHMtPnJlYWRfbWVtb3J5X3Bvb2wgPyAocHMtPmN1cnJlbnQgIT0gTlVMTCA/CisgICAgICAgICAgICBwcy0+Y3VycmVudC0+bmFtZSA6ICJ1bmtub3duIGZpbGUiKSA6IHBzLT53bmFtZSk7CisgICAgICArK3BzLT5uZXJyb3JzOworCisgICAgICBkbworICAgICAgeworICAgICAgICAgc3RvcmVfbWVtb3J5ICpuZXh0ID0gcG9vbC0+bGlzdDsKKyAgICAgICAgIHBvb2wtPmxpc3QgPSBuZXh0LT5uZXh0OworICAgICAgICAgbmV4dC0+bmV4dCA9IE5VTEw7CisKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXHQlbHUgYnl0ZXMgQCAlcFxuIiwKKyAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyluZXh0LT5zaXplLCAoY29uc3Qgdm9pZCopKG5leHQrMSkpOworICAgICAgICAgLyogVGhlIE5VTEwgbWVhbnMgdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4sIGV2ZW4gaWYgdGhlIG1lbW9yeSBpcworICAgICAgICAgICogY29ycnVwdGVkLgorICAgICAgICAgICovCisgICAgICAgICBzdG9yZV9tZW1vcnlfZnJlZShOVUxMLCBwb29sLCBuZXh0KTsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChwb29sLT5saXN0ICE9IE5VTEwpOworICAgfQorCisgICAvKiBBbmQgcmVzZXQgdGhlIG90aGVyIGZpZWxkcyB0b28gZm9yIHRoZSBuZXh0IHRpbWUuICovCisgICBpZiAocG9vbC0+bWF4ID4gcG9vbC0+bWF4X21heCkgcG9vbC0+bWF4X21heCA9IHBvb2wtPm1heDsKKyAgIHBvb2wtPm1heCA9IDA7CisgICBpZiAocG9vbC0+Y3VycmVudCAhPSAwKSAvKiB1bmV4cGVjdGVkIGludGVybmFsIGVycm9yICovCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAlcyAlczogbWVtb3J5IGNvdW50ZXIgbWlzbWF0Y2ggKGludGVybmFsIGVycm9yKVxuIiwKKyAgICAgICAgIHBzLT50ZXN0LCBwb29sID09ICZwcy0+cmVhZF9tZW1vcnlfcG9vbCA/ICJyZWFkIiA6ICJ3cml0ZSIsCisgICAgICAgICBwb29sID09ICZwcy0+cmVhZF9tZW1vcnlfcG9vbCA/IChwcy0+Y3VycmVudCAhPSBOVUxMID8KKyAgICAgICAgICAgIHBzLT5jdXJyZW50LT5uYW1lIDogInVua25vd24gZmlsZSIpIDogcHMtPnduYW1lKTsKKyAgIHBvb2wtPmN1cnJlbnQgPSAwOworCisgICBpZiAocG9vbC0+bGltaXQgPiBwb29sLT5tYXhfbGltaXQpCisgICAgICBwb29sLT5tYXhfbGltaXQgPSBwb29sLT5saW1pdDsKKworICAgcG9vbC0+bGltaXQgPSAwOworCisgICBpZiAocG9vbC0+dG90YWwgPiBwb29sLT5tYXhfdG90YWwpCisgICAgICBwb29sLT5tYXhfdG90YWwgPSBwb29sLT50b3RhbDsKKworICAgcG9vbC0+dG90YWwgPSAwOworCisgICAvKiBHZXQgYSBuZXcgbWFyayB0b28uICovCisgICBzdG9yZV9wb29sX21hcmsocG9vbC0+bWFyayk7Cit9CisKKy8qIFRoZSBtZW1vcnkgY2FsbGJhY2tzOiAqLworc3RhdGljIHBuZ192b2lkcCBQTkdDQkFQSQorc3RvcmVfbWFsbG9jKHBuZ19zdHJ1Y3RwIHBwSW4sIHBuZ19hbGxvY19zaXplX3QgY2IpCit7CisgICBwbmdfY29uc3Rfc3RydWN0cCBwcCA9IHBwSW47CisgICBzdG9yZV9wb29sICpwb29sID0gdm9pZGNhc3Qoc3RvcmVfcG9vbCosIHBuZ19nZXRfbWVtX3B0cihwcCkpOworICAgc3RvcmVfbWVtb3J5ICpuZXcgPSB2b2lkY2FzdChzdG9yZV9tZW1vcnkqLCBtYWxsb2MoY2IgKyAoc2l6ZW9mICpuZXcpICsKKyAgICAgIChzaXplb2YgcG9vbC0+bWFyaykpKTsKKworICAgaWYgKG5ldyAhPSBOVUxMKQorICAgeworICAgICAgaWYgKGNiID4gcG9vbC0+bWF4KQorICAgICAgICAgcG9vbC0+bWF4ID0gY2I7CisKKyAgICAgIHBvb2wtPmN1cnJlbnQgKz0gY2I7CisKKyAgICAgIGlmIChwb29sLT5jdXJyZW50ID4gcG9vbC0+bGltaXQpCisgICAgICAgICBwb29sLT5saW1pdCA9IHBvb2wtPmN1cnJlbnQ7CisKKyAgICAgIHBvb2wtPnRvdGFsICs9IGNiOworCisgICAgICBuZXctPnNpemUgPSBjYjsKKyAgICAgIG1lbWNweShuZXctPm1hcmssIHBvb2wtPm1hcmssIHNpemVvZiBuZXctPm1hcmspOworICAgICAgbWVtY3B5KChwbmdfYnl0ZSopKG5ldysxKSArIGNiLCBwb29sLT5tYXJrLCBzaXplb2YgcG9vbC0+bWFyayk7CisgICAgICBuZXctPnBvb2wgPSBwb29sOworICAgICAgbmV3LT5uZXh0ID0gcG9vbC0+bGlzdDsKKyAgICAgIHBvb2wtPmxpc3QgPSBuZXc7CisgICAgICArK25ldzsKKyAgIH0KKworICAgZWxzZQorICAgeworICAgICAgLyogTk9URTogdGhlIFBORyB1c2VyIG1hbGxvYyBmdW5jdGlvbiBjYW5ub3QgdXNlIHRoZSBwbmdfcHRyIGl0IGlzIHBhc3NlZAorICAgICAgICogb3RoZXIgdGhhbiB0byByZXRyaWV2ZSB0aGUgYWxsb2NhdGlvbiBwb2ludGVyISAgbGlicG5nIGNhbGxzIHRoZQorICAgICAgICogc3RvcmVfbWFsbG9jIGNhbGxiYWNrIGluIHR3byBiYXNpYyBjYXNlczoKKyAgICAgICAqCisgICAgICAgKiAxKSBGcm9tIHBuZ19tYWxsb2M7IHBuZ19tYWxsb2Mgd2lsbCBkbyBhIHBuZ19lcnJvciBpdHNlbGYgaWYgTlVMTCBpcworICAgICAgICogICAgcmV0dXJuZWQuCisgICAgICAgKiAyKSBGcm9tIHBuZ19zdHJ1Y3Qgb3IgcG5nX2luZm8gc3RydWN0dXJlIGNyZWF0aW9uOyBwbmdfbWFsbG9jIGlzCisgICAgICAgKiAgICB0byByZXR1cm4gc28gY2xlYW51cCBjYW4gYmUgcGVyZm9ybWVkLgorICAgICAgICoKKyAgICAgICAqIFRvIGhhbmRsZSB0aGlzIHN0b3JlX21hbGxvYyBjYW4gbG9nIGEgbWVzc2FnZSwgYnV0IGNhbid0IGRvIGFueXRoaW5nCisgICAgICAgKiBlbHNlLgorICAgICAgICovCisgICAgICBzdG9yZV9sb2cocG9vbC0+c3RvcmUsIHBwLCAib3V0IG9mIG1lbW9yeSIsIDEgLyogaXNfZXJyb3IgKi8pOworICAgfQorCisgICByZXR1cm4gbmV3OworfQorCitzdGF0aWMgdm9pZCBQTkdDQkFQSQorc3RvcmVfZnJlZShwbmdfc3RydWN0cCBwcEluLCBwbmdfdm9pZHAgbWVtb3J5KQoreworICAgcG5nX2NvbnN0X3N0cnVjdHAgcHAgPSBwcEluOworICAgc3RvcmVfcG9vbCAqcG9vbCA9IHZvaWRjYXN0KHN0b3JlX3Bvb2wqLCBwbmdfZ2V0X21lbV9wdHIocHApKTsKKyAgIHN0b3JlX21lbW9yeSAqdGhpcyA9IHZvaWRjYXN0KHN0b3JlX21lbW9yeSosIG1lbW9yeSksICoqdGVzdDsKKworICAgLyogQmVjYXVzZSBsaWJwbmcgY2FsbHMgc3RvcmVfZnJlZSB3aXRoIGEgZHVtbXkgcG5nX3N0cnVjdCB3aGVuIGRlbGV0aW5nCisgICAgKiBwbmdfc3RydWN0IG9yIHBuZ19pbmZvIHZpYSBwbmdfZGVzdHJveV9zdHJ1Y3RfMiBpdCBpcyBuZWNlc3NhcnkgdG8gY2hlY2sKKyAgICAqIHRoZSBwYXNzZWQgaW4gcG5nX3N0cnVjdHAgdG8gZW5zdXJlIGl0IGlzIHZhbGlkLCBhbmQgbm90IHBhc3MgaXQgdG8KKyAgICAqIHBuZ19lcnJvciBpZiBpdCBpcyBub3QuCisgICAgKi8KKyAgIGlmIChwcCAhPSBwb29sLT5zdG9yZS0+cHJlYWQgJiYgcHAgIT0gcG9vbC0+c3RvcmUtPnB3cml0ZSkKKyAgICAgIHBwID0gTlVMTDsKKworICAgLyogRmlyc3QgY2hlY2sgdGhhdCB0aGlzICdtZW1vcnknIHJlYWxseSBpcyB2YWxpZCBtZW1vcnkgLSBpdCBtdXN0IGJlIGluIHRoZQorICAgICogcG9vbCBsaXN0LiAgSWYgaXQgaXMsIHVzZSB0aGUgc2hhcmVkIG1lbW9yeV9mcmVlIGZ1bmN0aW9uIHRvIGZyZWUgaXQuCisgICAgKi8KKyAgIC0tdGhpczsKKyAgIGZvciAodGVzdCA9ICZwb29sLT5saXN0OyAqdGVzdCAhPSB0aGlzOyB0ZXN0ID0gJigqdGVzdCktPm5leHQpCisgICB7CisgICAgICBpZiAoKnRlc3QgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIHN0b3JlX3Bvb2xfZXJyb3IocG9vbC0+c3RvcmUsIHBwLCAiYmFkIHBvaW50ZXIgdG8gZnJlZSIpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgfQorCisgICAvKiBVbmxpbmsgdGhpcyBlbnRyeSwgKnRlc3QgPT0gdGhpcy4gKi8KKyAgICp0ZXN0ID0gdGhpcy0+bmV4dDsKKyAgIHRoaXMtPm5leHQgPSBOVUxMOworICAgc3RvcmVfbWVtb3J5X2ZyZWUocHAsIHBvb2wsIHRoaXMpOworfQorI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8KKworLyogU2V0dXAgZnVuY3Rpb25zLiAqLworLyogQ2xlYW51cCB3aGVuIGFib3J0aW5nIGEgd3JpdGUgb3IgYWZ0ZXIgc3RvcmluZyB0aGUgbmV3IGZpbGUuICovCitzdGF0aWMgdm9pZAorc3RvcmVfd3JpdGVfcmVzZXQocG5nX3N0b3JlICpwcykKK3sKKyAgIGlmIChwcy0+cHdyaXRlICE9IE5VTEwpCisgICB7CisgICAgICBhbm9uX2NvbnRleHQocHMpOworCisgICAgICBUcnkKKyAgICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcHMtPnB3cml0ZSwgJnBzLT5waXdyaXRlKTsKKworICAgICAgQ2F0Y2hfYW5vbnltb3VzCisgICAgICB7CisgICAgICAgICAvKiBtZW1vcnkgY29ycnVwdGlvbjogY29udGludWUuICovCisgICAgICB9CisKKyAgICAgIHBzLT5wd3JpdGUgPSBOVUxMOworICAgICAgcHMtPnBpd3JpdGUgPSBOVUxMOworICAgfQorCisgICAvKiBBbmQgbWFrZSBzdXJlIHRoYXQgYWxsIHRoZSBtZW1vcnkgaGFzIGJlZW4gZnJlZWQgLSB0aGlzIHdpbGwgb3V0cHV0CisgICAgKiBzcHVyaW91cyBlcnJvcnMgaW4gdGhlIGNhc2Ugb2YgbWVtb3J5IGNvcnJ1cHRpb24gYWJvdmUsIGJ1dCB0aGlzIGlzIHNhZmUuCisgICAgKi8KKyMgIGlmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKKyAgICAgIHN0b3JlX3Bvb2xfZGVsZXRlKHBzLCAmcHMtPndyaXRlX21lbW9yeV9wb29sKTsKKyMgIGVuZGlmCisKKyAgIHN0b3JlX2ZyZWVuZXcocHMpOworfQorCisvKiBUaGUgZm9sbG93aW5nIGlzIHRoZSBtYWluIHdyaXRlIGZ1bmN0aW9uLCBpdCByZXR1cm5zIGEgcG5nX3N0cnVjdCBhbmQsCisgKiBvcHRpb25hbGx5LCBhIHBuZ19pbmZvIHN1aXRhYmxlIGZvciB3cml0aWluZyBhIG5ldyBQTkcgZmlsZS4gIFVzZQorICogc3RvcmVfc3RvcmVmaWxlIGFib3ZlIHRvIHJlY29yZCB0aGlzIGZpbGUgYWZ0ZXIgaXQgaGFzIGJlZW4gd3JpdHRlbi4gIFRoZQorICogcmV0dXJuZWQgbGlicG5nIHN0cnVjdHVyZXMgYXMgZGVzdHJveWVkIGJ5IHN0b3JlX3dyaXRlX3Jlc2V0IGFib3ZlLgorICovCitzdGF0aWMgcG5nX3N0cnVjdHAKK3NldF9zdG9yZV9mb3Jfd3JpdGUocG5nX3N0b3JlICpwcywgcG5nX2luZm9wcCBwcGksIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICBhbm9uX2NvbnRleHQocHMpOworCisgICBUcnkKKyAgIHsKKyAgICAgIGlmIChwcy0+cHdyaXRlICE9IE5VTEwpCisgICAgICAgICBwbmdfZXJyb3IocHMtPnB3cml0ZSwgIndyaXRlIHN0b3JlIGFscmVhZHkgaW4gdXNlIik7CisKKyAgICAgIHN0b3JlX3dyaXRlX3Jlc2V0KHBzKTsKKyAgICAgIHNhZmVjYXQocHMtPnduYW1lLCBzaXplb2YgcHMtPnduYW1lLCAwLCBuYW1lKTsKKworICAgICAgLyogRG9uJ3QgZG8gdGhlIHNsb3cgbWVtb3J5IGNoZWNrcyBpZiBkb2luZyBhIHNwZWVkIHRlc3QsIGFsc28gaWYgdXNlcgorICAgICAgICogbWVtb3J5IGlzIG5vdCBzdXBwb3J0ZWQgd2UgY2FuJ3QgZG8gaXQgYW55d2F5LgorICAgICAgICovCisjICAgICBpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECisgICAgICAgICBpZiAoIXBzLT5zcGVlZCkKKyAgICAgICAgICAgIHBzLT5wd3JpdGUgPSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdF8yKFBOR19MSUJQTkdfVkVSX1NUUklORywKKyAgICAgICAgICAgICAgIHBzLCBzdG9yZV9lcnJvciwgc3RvcmVfd2FybmluZywgJnBzLT53cml0ZV9tZW1vcnlfcG9vbCwKKyAgICAgICAgICAgICAgIHN0b3JlX21hbGxvYywgc3RvcmVfZnJlZSk7CisKKyAgICAgICAgIGVsc2UKKyMgICAgIGVuZGlmCisgICAgICAgICBwcy0+cHdyaXRlID0gcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLAorICAgICAgICAgICAgcHMsIHN0b3JlX2Vycm9yLCBzdG9yZV93YXJuaW5nKTsKKworICAgICAgcG5nX3NldF93cml0ZV9mbihwcy0+cHdyaXRlLCBwcywgc3RvcmVfd3JpdGUsIHN0b3JlX2ZsdXNoKTsKKworIyAgICAgaWZkZWYgUE5HX1NFVF9PUFRJT05fU1VQUE9SVEVECisgICAgICAgICB7CisgICAgICAgICAgICBpbnQgb3B0OworICAgICAgICAgICAgZm9yIChvcHQ9MDsgb3B0PHBzLT5ub3B0aW9uczsgKytvcHQpCisgICAgICAgICAgICAgICBpZiAocG5nX3NldF9vcHRpb24ocHMtPnB3cml0ZSwgcHMtPm9wdGlvbnNbb3B0XS5vcHRpb24sCisgICAgICAgICAgICAgICAgICBwcy0+b3B0aW9uc1tvcHRdLnNldHRpbmcpID09IFBOR19PUFRJT05fSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgIHBuZ19lcnJvcihwcy0+cHdyaXRlLCAicG5nIG9wdGlvbiBpbnZhbGlkIik7CisgICAgICAgICB9CisjICAgICBlbmRpZgorCisgICAgICBpZiAocHBpICE9IE5VTEwpCisgICAgICAgICAqcHBpID0gcHMtPnBpd3JpdGUgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBzLT5wd3JpdGUpOworICAgfQorCisgICBDYXRjaF9hbm9ueW1vdXMKKyAgICAgIHJldHVybiBOVUxMOworCisgICByZXR1cm4gcHMtPnB3cml0ZTsKK30KKworLyogQ2xlYW51cCB3aGVuIGZpbmlzaGVkIHJlYWRpbmcgKGVpdGhlciBkdWUgdG8gZXJyb3Igb3IgaW4gdGhlIHN1Y2Nlc3MgY2FzZSkuCisgKiBUaGlzIHJvdXRpbmUgZXhpc3RzIGV2ZW4gd2hlbiB0aGVyZSBpcyBubyByZWFkIHN1cHBvcnQgdG8gbWFrZSB0aGUgY29kZQorICogdGlkaWVyIChhdm9pZCBhIG1hc3Mgb2YgaWZkZWZzKSBhbmQgc28gZWFzaWVyIHRvIG1haW50YWluLgorICovCitzdGF0aWMgdm9pZAorc3RvcmVfcmVhZF9yZXNldChwbmdfc3RvcmUgKnBzKQoreworIyAgaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECisgICAgICBpZiAocHMtPnByZWFkICE9IE5VTEwpCisgICAgICB7CisgICAgICAgICBhbm9uX2NvbnRleHQocHMpOworCisgICAgICAgICBUcnkKKyAgICAgICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwcy0+cHJlYWQsICZwcy0+cGlyZWFkLCBOVUxMKTsKKworICAgICAgICAgQ2F0Y2hfYW5vbnltb3VzCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBlcnJvciBhbHJlYWR5IG91dHB1dDogY29udGludWUgKi8KKyAgICAgICAgIH0KKworICAgICAgICAgcHMtPnByZWFkID0gTlVMTDsKKyAgICAgICAgIHBzLT5waXJlYWQgPSBOVUxMOworICAgICAgfQorIyAgZW5kaWYKKworIyAgaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAorICAgICAgLyogQWx3YXlzIGRvIHRoaXMgdG8gYmUgc2FmZS4gKi8KKyAgICAgIHN0b3JlX3Bvb2xfZGVsZXRlKHBzLCAmcHMtPnJlYWRfbWVtb3J5X3Bvb2wpOworIyAgZW5kaWYKKworICAgcHMtPmN1cnJlbnQgPSBOVUxMOworICAgcHMtPm5leHQgPSBOVUxMOworICAgcHMtPnJlYWRwb3MgPSAwOworICAgcHMtPnZhbGlkYXRlZCA9IDA7Cit9CisKKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKK3N0YXRpYyB2b2lkCitzdG9yZV9yZWFkX3NldChwbmdfc3RvcmUgKnBzLCBwbmdfdWludF8zMiBpZCkKK3sKKyAgIHBuZ19zdG9yZV9maWxlICpwZiA9IHBzLT5zYXZlZDsKKworICAgd2hpbGUgKHBmICE9IE5VTEwpCisgICB7CisgICAgICBpZiAocGYtPmlkID09IGlkKQorICAgICAgeworICAgICAgICAgcHMtPmN1cnJlbnQgPSBwZjsKKyAgICAgICAgIHBzLT5uZXh0ID0gTlVMTDsKKyAgICAgICAgIHN0b3JlX3JlYWRfYnVmZmVyX25leHQocHMpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBwZiA9IHBmLT5uZXh0OworICAgfQorCisgICB7CisgICAgICBzaXplX3QgcG9zOworICAgICAgY2hhciBtc2dbRklMRV9OQU1FX1NJWkUrNjRdOworCisgICAgICBwb3MgPSBzdGFuZGFyZF9uYW1lX2Zyb21faWQobXNnLCBzaXplb2YgbXNnLCAwLCBpZCk7CisgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiOiBmaWxlIG5vdCBmb3VuZCIpOworICAgICAgcG5nX2Vycm9yKHBzLT5wcmVhZCwgbXNnKTsKKyAgIH0KK30KKworLyogVGhlIG1haW4gaW50ZXJmYWNlIGZvciByZWFkaW5nIGEgc2F2ZWQgZmlsZSAtIHBhc3MgdGhlIGlkIG51bWJlciBvZiB0aGUgZmlsZQorICogdG8gcmV0cmlldmUuICBJZHMgbXVzdCBiZSB1bmlxdWUgb3IgdGhlIGVhcmxpZXIgZmlsZSB3aWxsIGJlIGhpZGRlbi4gIFRoZSBBUEkKKyAqIHJldHVybnMgYSBwbmdfc3RydWN0IGFuZCwgb3B0aW9uYWxseSwgYSBwbmdfaW5mby4gIEJvdGggb2YgdGhlc2Ugd2lsbCBiZQorICogZGVzdHJveWVkIGJ5IHN0b3JlX3JlYWRfcmVzZXQgYWJvdmUuCisgKi8KK3N0YXRpYyBwbmdfc3RydWN0cAorc2V0X3N0b3JlX2Zvcl9yZWFkKHBuZ19zdG9yZSAqcHMsIHBuZ19pbmZvcHAgcHBpLCBwbmdfdWludF8zMiBpZCwKKyAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAvKiBTZXQgdGhlIG5hbWUgZm9yIHBuZ19lcnJvciAqLworICAgc2FmZWNhdChwcy0+dGVzdCwgc2l6ZW9mIHBzLT50ZXN0LCAwLCBuYW1lKTsKKworICAgaWYgKHBzLT5wcmVhZCAhPSBOVUxMKQorICAgICAgcG5nX2Vycm9yKHBzLT5wcmVhZCwgInJlYWQgc3RvcmUgYWxyZWFkeSBpbiB1c2UiKTsKKworICAgc3RvcmVfcmVhZF9yZXNldChwcyk7CisKKyAgIC8qIEJvdGggdGhlIGNyZWF0ZSBBUElzIGNhbiByZXR1cm4gTlVMTCBpZiB1c2VkIGluIHRoZWlyIGRlZmF1bHQgbW9kZQorICAgICogKGJlY2F1c2UgdGhlcmUgaXMgbm8gb3RoZXIgd2F5IG9mIGhhbmRsaW5nIGFuIGVycm9yIGJlY2F1c2UgdGhlIGptcF9idWYKKyAgICAqIGJ5IGRlZmF1bHQgaXMgc3RvcmVkIGluIHBuZ19zdHJ1Y3QgYW5kIHRoYXQgaGFzIG5vdCBiZWVuIGFsbG9jYXRlZCEpCisgICAgKiBIb3dldmVyLCBnaXZlbiB0aGF0IHN0b3JlX2Vycm9yIHdvcmtzIGNvcnJlY3RseSBpbiB0aGVzZSBjaXJjdW1zdGFuY2VzCisgICAgKiB3ZSBkb24ndCBldmVyIGV4cGVjdCBOVUxMIGluIHRoaXMgcHJvZ3JhbS4KKyAgICAqLworIyAgaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAorICAgICAgaWYgKCFwcy0+c3BlZWQpCisgICAgICAgICBwcy0+cHJlYWQgPSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0XzIoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCBwcywKKyAgICAgICAgICAgICBzdG9yZV9lcnJvciwgc3RvcmVfd2FybmluZywgJnBzLT5yZWFkX21lbW9yeV9wb29sLCBzdG9yZV9tYWxsb2MsCisgICAgICAgICAgICAgc3RvcmVfZnJlZSk7CisKKyAgICAgIGVsc2UKKyMgIGVuZGlmCisgICBwcy0+cHJlYWQgPSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NUUklORywgcHMsIHN0b3JlX2Vycm9yLAorICAgICAgc3RvcmVfd2FybmluZyk7CisKKyAgIGlmIChwcy0+cHJlYWQgPT0gTlVMTCkKKyAgIHsKKyAgICAgIHN0cnVjdCBleGNlcHRpb25fY29udGV4dCAqdGhlX2V4Y2VwdGlvbl9jb250ZXh0ID0gJnBzLT5leGNlcHRpb25fY29udGV4dDsKKworICAgICAgc3RvcmVfbG9nKHBzLCBOVUxMLCAicG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCByZXR1cm5lZCBOVUxMICh1bmV4cGVjdGVkKSIsCisgICAgICAgICAxIC8qZXJyb3IqLyk7CisKKyAgICAgIFRocm93IHBzOworICAgfQorCisjICBpZmRlZiBQTkdfU0VUX09QVElPTl9TVVBQT1JURUQKKyAgICAgIHsKKyAgICAgICAgIGludCBvcHQ7CisgICAgICAgICBmb3IgKG9wdD0wOyBvcHQ8cHMtPm5vcHRpb25zOyArK29wdCkKKyAgICAgICAgICAgIGlmIChwbmdfc2V0X29wdGlvbihwcy0+cHJlYWQsIHBzLT5vcHRpb25zW29wdF0ub3B0aW9uLAorICAgICAgICAgICAgICAgcHMtPm9wdGlvbnNbb3B0XS5zZXR0aW5nKSA9PSBQTkdfT1BUSU9OX0lOVkFMSUQpCisgICAgICAgICAgICAgICAgICBwbmdfZXJyb3IocHMtPnByZWFkLCAicG5nIG9wdGlvbiBpbnZhbGlkIik7CisgICAgICB9CisjICBlbmRpZgorCisgICBzdG9yZV9yZWFkX3NldChwcywgaWQpOworCisgICBpZiAocHBpICE9IE5VTEwpCisgICAgICAqcHBpID0gcHMtPnBpcmVhZCA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocHMtPnByZWFkKTsKKworICAgcmV0dXJuIHBzLT5wcmVhZDsKK30KKyNlbmRpZiAvKiBQTkdfUkVBRF9TVVBQT1JURUQgKi8KKworLyogVGhlIG92ZXJhbGwgY2xlYW51cCBvZiBhIHN0b3JlIHNpbXBseSBjYWxscyB0aGUgYWJvdmUgdGhlbiByZW1vdmVzIGFsbCB0aGUKKyAqIHNhdmVkIGZpbGVzLiAgVGhpcyBkb2VzIG5vdCBkZWxldGUgdGhlIHN0b3JlIGl0c2VsZi4KKyAqLworc3RhdGljIHZvaWQKK3N0b3JlX2RlbGV0ZShwbmdfc3RvcmUgKnBzKQoreworICAgc3RvcmVfd3JpdGVfcmVzZXQocHMpOworICAgc3RvcmVfcmVhZF9yZXNldChwcyk7CisgICBzdG9yZV9mcmVlZmlsZSgmcHMtPnNhdmVkKTsKKyAgIHN0b3JlX2ltYWdlX2ZyZWUocHMsIE5VTEwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKiogUE5HIEZJTEUgTU9ESUZJQ0FUSU9OIE9OIFJFQUQgKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRmlsZXMgbWF5IGJlIG1vZGlmaWVkIG9uIHJlYWQuICBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBjb250YWlucyBhIGNvbXBsZXRlCisgKiBwbmdfc3RvcmUgdG9nZXRoZXIgd2l0aCBleHRyYSBtZW1iZXJzIHRvIGhhbmRsZSBtb2RpZmljYXRpb24gYW5kIGEgc3BlY2lhbAorICogcmVhZCBjYWxsYmFjayBmb3IgbGlicG5nLiAgVG8gdXNlIHRoaXMgdGhlICdtb2RpZmljYXRpb25zJyBmaWVsZCBtdXN0IGJlIHNldAorICogdG8gYSBsaXN0IG9mIHBuZ19tb2RpZmljYXRpb24gc3RydWN0dXJlcyB0aGF0IGFjdHVhbGx5IHBlcmZvcm0gdGhlCisgKiBtb2RpZmljYXRpb24sIG90aGVyd2lzZSBhIHBuZ19tb2RpZmllciBpcyBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBhCisgKiBwbmdfc3RvcmUuICBUaGVyZSBpcyBhIHNwZWNpYWwgcmVhZCBmdW5jdGlvbiwgc2V0X21vZGlmaWVyX2Zvcl9yZWFkLCB3aGljaAorICogcmVwbGFjZXMgc2V0X3N0b3JlX2Zvcl9yZWFkLgorICovCit0eXBlZGVmIGVudW0gbW9kaWZpZXJfc3RhdGUKK3sKKyAgIG1vZGlmaWVyX3N0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWwgdmFsdWUgKi8KKyAgIG1vZGlmaWVyX3NpZ25hdHVyZSwgICAgICAgICAgICAgICAgICAgIC8qIEhhdmUgYSBzaWduYXR1cmUgKi8KKyAgIG1vZGlmaWVyX0lIRFIgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhhdmUgYW4gSUhEUiAqLworfSBtb2RpZmllcl9zdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgQ0lFX2NvbG9yCit7CisgICAvKiBBIHNpbmdsZSBDSUUgdHJpc3RpbXVsdXMgdmFsdWUsIHJlcHJlc2VudGluZyB0aGUgdW5pcXVlIHJlc3BvbnNlIG9mIGEKKyAgICAqIHN0YW5kYXJkIG9ic2VydmVyIHRvIGEgdmFyaWV0eSBvZiBsaWdodCBzcGVjdHJhLiAgVGhlIG9ic2VydmVyIHJlY29nbml6ZXMKKyAgICAqIGFsbCBzcGVjdHJhIHRoYXQgcHJvZHVjZSB0aGlzIHJlc3BvbnNlIGFzIHRoZSBzYW1lIGNvbG9yLCB0aGVyZWZvcmUgdGhpcworICAgICogaXMgZWZmZWN0aXZlbHkgYSBkZXNjcmlwdGlvbiBvZiBhIGNvbG9yLgorICAgICovCisgICBkb3VibGUgWCwgWSwgWjsKK30gQ0lFX2NvbG9yOworCit0eXBlZGVmIHN0cnVjdCBjb2xvcl9lbmNvZGluZworeworICAgLyogQSBkZXNjcmlwdGlvbiBvZiBhbiAoUixHLEIpIGVuY29kaW5nIG9mIGNvbG9yIChhcyBkZWZpbmVkIGFib3ZlKTsgdGhpcworICAgICogaW5jbHVkZXMgdGhlIGFjdHVhbCBjb2xvcnMgb2YgdGhlIChSLEcsQikgdHJpcGxlcyAoMSwwLDApLCAoMCwxLDApIGFuZAorICAgICogKDAsMCwxKSBwbHVzIGFuIGVuY29kaW5nIHZhbHVlIHRoYXQgaXMgdXNlZCB0byBlbmNvZGUgdGhlIGxpbmVhcgorICAgICogY29tcG9uZW50cyBSLCBHIGFuZCBCIHRvIGdpdmUgdGhlIGFjdHVhbCB2YWx1ZXMgUl5nYW1tYSwgR15nYW1tYSBhbmQKKyAgICAqIEJeZ2FtbWEgdGhhdCBhcmUgc3RvcmVkLgorICAgICovCisgICBkb3VibGUgICAgZ2FtbWE7ICAgICAgICAgICAgLyogRW5jb2RpbmcgKGZpbGUpIGdhbW1hIG9mIHNwYWNlICovCisgICBDSUVfY29sb3IgcmVkLCBncmVlbiwgYmx1ZTsgLyogRW5kIHBvaW50cyAqLworfSBjb2xvcl9lbmNvZGluZzsKKworI2lmZGVmIFBOR19SRUFEX1NVUFBPUlRFRAorI2lmIGRlZmluZWQgUE5HX1JFQURfVFJBTlNGT1JNU19TVVBQT1JURUQgJiYgZGVmaW5lZCBQTkdfUkVBRF9jSFJNX1NVUFBPUlRFRAorc3RhdGljIGRvdWJsZQorY2hyb21hdGljaXR5X3goQ0lFX2NvbG9yIGMpCit7CisgICByZXR1cm4gYy5YIC8gKGMuWCArIGMuWSArIGMuWik7Cit9CisKK3N0YXRpYyBkb3VibGUKK2Nocm9tYXRpY2l0eV95KENJRV9jb2xvciBjKQoreworICAgcmV0dXJuIGMuWSAvIChjLlggKyBjLlkgKyBjLlopOworfQorCitzdGF0aWMgQ0lFX2NvbG9yCit3aGl0ZV9wb2ludChjb25zdCBjb2xvcl9lbmNvZGluZyAqZW5jb2RpbmcpCit7CisgICBDSUVfY29sb3Igd2hpdGU7CisKKyAgIHdoaXRlLlggPSBlbmNvZGluZy0+cmVkLlggKyBlbmNvZGluZy0+Z3JlZW4uWCArIGVuY29kaW5nLT5ibHVlLlg7CisgICB3aGl0ZS5ZID0gZW5jb2RpbmctPnJlZC5ZICsgZW5jb2RpbmctPmdyZWVuLlkgKyBlbmNvZGluZy0+Ymx1ZS5ZOworICAgd2hpdGUuWiA9IGVuY29kaW5nLT5yZWQuWiArIGVuY29kaW5nLT5ncmVlbi5aICsgZW5jb2RpbmctPmJsdWUuWjsKKworICAgcmV0dXJuIHdoaXRlOworfQorI2VuZGlmIC8qIFJFQURfVFJBTlNGT1JNUyAmJiBSRUFEX2NIUk0gKi8KKworI2lmZGVmIFBOR19SRUFEX1JHQl9UT19HUkFZX1NVUFBPUlRFRAorc3RhdGljIHZvaWQKK25vcm1hbGl6ZV9jb2xvcl9lbmNvZGluZyhjb2xvcl9lbmNvZGluZyAqZW5jb2RpbmcpCit7CisgICBjb25zdCBkb3VibGUgd2hpdGVZID0gZW5jb2RpbmctPnJlZC5ZICsgZW5jb2RpbmctPmdyZWVuLlkgKworICAgICAgZW5jb2RpbmctPmJsdWUuWTsKKworICAgaWYgKHdoaXRlWSAhPSAxKQorICAgeworICAgICAgZW5jb2RpbmctPnJlZC5YIC89IHdoaXRlWTsKKyAgICAgIGVuY29kaW5nLT5yZWQuWSAvPSB3aGl0ZVk7CisgICAgICBlbmNvZGluZy0+cmVkLlogLz0gd2hpdGVZOworICAgICAgZW5jb2RpbmctPmdyZWVuLlggLz0gd2hpdGVZOworICAgICAgZW5jb2RpbmctPmdyZWVuLlkgLz0gd2hpdGVZOworICAgICAgZW5jb2RpbmctPmdyZWVuLlogLz0gd2hpdGVZOworICAgICAgZW5jb2RpbmctPmJsdWUuWCAvPSB3aGl0ZVk7CisgICAgICBlbmNvZGluZy0+Ymx1ZS5ZIC89IHdoaXRlWTsKKyAgICAgIGVuY29kaW5nLT5ibHVlLlogLz0gd2hpdGVZOworICAgfQorfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9UUkFOU0ZPUk1TX1NVUFBPUlRFRAorc3RhdGljIHNpemVfdAorc2FmZWNhdF9jb2xvcl9lbmNvZGluZyhjaGFyICpidWZmZXIsIHNpemVfdCBidWZzaXplLCBzaXplX3QgcG9zLAorICAgY29uc3QgY29sb3JfZW5jb2RpbmcgKmUsIGRvdWJsZSBlbmNvZGluZ19nYW1tYSkKK3sKKyAgIGlmIChlICE9IDApCisgICB7CisgICAgICBpZiAoZW5jb2RpbmdfZ2FtbWEgIT0gMCkKKyAgICAgICAgIHBvcyA9IHNhZmVjYXQoYnVmZmVyLCBidWZzaXplLCBwb3MsICIoIik7CisgICAgICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCAiUigiKTsKKyAgICAgIHBvcyA9IHNhZmVjYXRkKGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCBlLT5yZWQuWCwgNCk7CisgICAgICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCAiLCIpOworICAgICAgcG9zID0gc2FmZWNhdGQoYnVmZmVyLCBidWZzaXplLCBwb3MsIGUtPnJlZC5ZLCA0KTsKKyAgICAgIHBvcyA9IHNhZmVjYXQoYnVmZmVyLCBidWZzaXplLCBwb3MsICIsIik7CisgICAgICBwb3MgPSBzYWZlY2F0ZChidWZmZXIsIGJ1ZnNpemUsIHBvcywgZS0+cmVkLlosIDQpOworICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIGJ1ZnNpemUsIHBvcywgIiksRygiKTsKKyAgICAgIHBvcyA9IHNhZmVjYXRkKGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCBlLT5ncmVlbi5YLCA0KTsKKyAgICAgIHBvcyA9IHNhZmVjYXQoYnVmZmVyLCBidWZzaXplLCBwb3MsICIsIik7CisgICAgICBwb3MgPSBzYWZlY2F0ZChidWZmZXIsIGJ1ZnNpemUsIHBvcywgZS0+Z3JlZW4uWSwgNCk7CisgICAgICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCAiLCIpOworICAgICAgcG9zID0gc2FmZWNhdGQoYnVmZmVyLCBidWZzaXplLCBwb3MsIGUtPmdyZWVuLlosIDQpOworICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIGJ1ZnNpemUsIHBvcywgIiksQigiKTsKKyAgICAgIHBvcyA9IHNhZmVjYXRkKGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCBlLT5ibHVlLlgsIDQpOworICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIGJ1ZnNpemUsIHBvcywgIiwiKTsKKyAgICAgIHBvcyA9IHNhZmVjYXRkKGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCBlLT5ibHVlLlksIDQpOworICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIGJ1ZnNpemUsIHBvcywgIiwiKTsKKyAgICAgIHBvcyA9IHNhZmVjYXRkKGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCBlLT5ibHVlLlosIDQpOworICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIGJ1ZnNpemUsIHBvcywgIikiKTsKKyAgICAgIGlmIChlbmNvZGluZ19nYW1tYSAhPSAwKQorICAgICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIGJ1ZnNpemUsIHBvcywgIikiKTsKKyAgIH0KKworICAgaWYgKGVuY29kaW5nX2dhbW1hICE9IDApCisgICB7CisgICAgICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCAiXiIpOworICAgICAgcG9zID0gc2FmZWNhdGQoYnVmZmVyLCBidWZzaXplLCBwb3MsIGVuY29kaW5nX2dhbW1hLCA1KTsKKyAgIH0KKworICAgcmV0dXJuIHBvczsKK30KKyNlbmRpZiAvKiBSRUFEX1RSQU5TRk9STVMgKi8KKyNlbmRpZiAvKiBQTkdfUkVBRF9TVVBQT1JURUQgKi8KKwordHlwZWRlZiBzdHJ1Y3QgcG5nX21vZGlmaWVyCit7CisgICBwbmdfc3RvcmUgICAgICAgICAgICAgICB0aGlzOyAgICAgICAgICAgICAvKiBJIGFtIGEgcG5nX3N0b3JlICovCisgICBzdHJ1Y3QgcG5nX21vZGlmaWNhdGlvbiAqbW9kaWZpY2F0aW9uczsgICAvKiBDaGFuZ2VzIHRvIG1ha2UgKi8KKworICAgbW9kaWZpZXJfc3RhdGUgICAgICAgICAgIHN0YXRlOyAgICAgICAgICAgLyogTXkgc3RhdGUgKi8KKworICAgLyogSW5mb3JtYXRpb24gZnJvbSBJSERSOiAqLworICAgcG5nX2J5dGUgICAgICAgICAgICAgICAgIGJpdF9kZXB0aDsgICAgICAgLyogRnJvbSBJSERSICovCisgICBwbmdfYnl0ZSAgICAgICAgICAgICAgICAgY29sb3VyX3R5cGU7ICAgICAvKiBGcm9tIElIRFIgKi8KKworICAgLyogV2hpbGUgaGFuZGxpbmcgUExURSwgSURBVCBhbmQgSUVORCB0aGVzZSBjaHVua3MgbWF5IGJlIHBlbmRlZCB0byBhbGxvdworICAgICogb3RoZXIgY2h1bmtzIHRvIGJlIGluc2VydGVkLgorICAgICovCisgICBwbmdfdWludF8zMiAgICAgICAgICAgICAgcGVuZGluZ19sZW47CisgICBwbmdfdWludF8zMiAgICAgICAgICAgICAgcGVuZGluZ19jaHVuazsKKworICAgLyogVGVzdCB2YWx1ZXMgKi8KKyAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICAqZ2FtbWFzOworICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICBuZ2FtbWFzOworICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICBuZ2FtbWFfdGVzdHM7ICAgICAvKiBOdW1iZXIgb2YgZ2FtbWEgdGVzdHMgdG8gcnVuKi8KKyAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICAgY3VycmVudF9nYW1tYTsgICAgLyogMCBpZiBub3Qgc2V0ICovCisgICBjb25zdCBjb2xvcl9lbmNvZGluZyAqZW5jb2RpbmdzOworICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICBuZW5jb2RpbmdzOworICAgY29uc3QgY29sb3JfZW5jb2RpbmcgKmN1cnJlbnRfZW5jb2Rpbmc7IC8qIElmIGFuIGVuY29kaW5nIGhhcyBiZWVuIHNldCAqLworICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICBlbmNvZGluZ19jb3VudGVyOyAvKiBGb3IgaXRlcmF0aW9uICovCisgICBpbnQgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nX2lnbm9yZWQ7IC8qIFNvbWV0aGluZyBvdmVyd3JvdGUgaXQgKi8KKworICAgLyogQ29udHJvbCB2YXJpYWJsZXMgdXNlZCB0byBpdGVyYXRlIHRocm91Z2ggcG9zc2libGUgZW5jb2RpbmdzLCB0aGUKKyAgICAqIGZvbGxvd2luZyBtdXN0IGJlIHNldCB0byAwIGFuZCB0ZXN0ZWQgYnkgdGhlIGZ1bmN0aW9uIHRoYXQgdXNlcyB0aGUKKyAgICAqIHBuZ19tb2RpZmllciBiZWNhdXNlIHRoZSBtb2RpZmllciBvbmx5IHNldHMgaXQgdG8gMSAodHJ1ZS4pCisgICAgKi8KKyAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgcmVwZWF0IDoxOyAgIC8qIFJlcGVhdCB0aGlzIHRyYW5zZm9ybSB0ZXN0LiAqLworICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICB0ZXN0X3VzZXNfZW5jb2RpbmcgOjE7CisKKyAgIC8qIExvd2VzdCBzYml0IHRvIHRlc3QgKHByZS0xLjcgbGlicG5nIGZhaWxzIGZvciBzYml0IDwgOCkgKi8KKyAgIHBuZ19ieXRlICAgICAgICAgICAgICAgICBzYml0bG93OworCisgICAvKiBFcnJvciBjb250cm9sIC0gdGhlc2UgYXJlIHRoZSBsaW1pdHMgb24gZXJyb3JzIGFjY2VwdGVkIGJ5IHRoZSBnYW1tYSB0ZXN0cworICAgICogYmVsb3cuCisgICAgKi8KKyAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICBtYXhvdXQ4OyAgLyogTWF4aW11bSBvdXRwdXQgdmFsdWUgZXJyb3IgKi8KKyAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICBtYXhhYnM4OyAgLyogQWJzb2x1dGUgc2FtcGxlIGVycm9yIDAuLjEgKi8KKyAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICBtYXhjYWxjODsgLyogQWJzb2x1dGUgc2FtcGxlIGVycm9yIDAuLjEgKi8KKyAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICBtYXhwYzg7ICAgLyogUGVyY2VudGFnZSBzYW1wbGUgZXJyb3IgMC4uMTAwJSAqLworICAgZG91YmxlICAgICAgICAgICAgICAgICAgIG1heG91dDE2OyAvKiBNYXhpbXVtIG91dHB1dCB2YWx1ZSBlcnJvciAqLworICAgZG91YmxlICAgICAgICAgICAgICAgICAgIG1heGFiczE2OyAvKiBBYnNvbHV0ZSBzYW1wbGUgZXJyb3IgMC4uMSAqLworICAgZG91YmxlICAgICAgICAgICAgICAgICAgIG1heGNhbGMxNjsvKiBBYnNvbHV0ZSBzYW1wbGUgZXJyb3IgMC4uMSAqLworICAgZG91YmxlICAgICAgICAgICAgICAgICAgIG1heGNhbGNHOyAvKiBBYnNvbHV0ZSBzYW1wbGUgZXJyb3IgMC4uMSAqLworICAgZG91YmxlICAgICAgICAgICAgICAgICAgIG1heHBjMTY7ICAvKiBQZXJjZW50YWdlIHNhbXBsZSBlcnJvciAwLi4xMDAlICovCisKKyAgIC8qIFRoaXMgaXMgc2V0IGJ5IHRyYW5zZm9ybXMgdGhhdCBuZWVkIHRvIGFsbG93IGEgaGlnaGVyIGxpbWl0LCBpdCBpcyBhbgorICAgICogaW50ZXJuYWwgY2hlY2sgb24gcG5ndmFsaWQgdG8gZW5zdXJlIHRoYXQgdGhlIGNhbGN1bGF0ZWQgZXJyb3IgbGltaXRzIGFyZQorICAgICogbm90IHJpZGljdWxvdXM7IHdpdGhvdXQgdGhpcyBpdCBpcyB0b28gZWFzeSB0byBtYWtlIGEgbWlzdGFrZSBpbiBwbmd2YWxpZAorICAgICogdGhhdCBhbGxvd3MgYW55IHZhbHVlIHRocm91Z2guCisgICAgKi8KKyAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICBsaW1pdDsgICAgLyogbGltaXQgb24gZXJyb3IgdmFsdWVzLCBub3JtYWxseSA0RS0zICovCisKKyAgIC8qIExvZyBsaW1pdHMgLSB2YWx1ZXMgYWJvdmUgdGhpcyBhcmUgbG9nZ2VkLCBidXQgbm90IG5lY2Vzc2FyaWx5CisgICAgKiB3YXJuZWQuCisgICAgKi8KKyAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICBsb2c4OyAgICAgLyogQWJzb2x1dGUgZXJyb3IgaW4gOCBiaXRzIHRvIGxvZyAqLworICAgZG91YmxlICAgICAgICAgICAgICAgICAgIGxvZzE2OyAgICAvKiBBYnNvbHV0ZSBlcnJvciBpbiAxNiBiaXRzIHRvIGxvZyAqLworCisgICAvKiBMb2dnZWQgOCBhbmQgMTYgYml0IGVycm9ycyAoJ291dHB1dCcgdmFsdWVzKTogKi8KKyAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICBlcnJvcl9ncmF5XzI7CisgICBkb3VibGUgICAgICAgICAgICAgICAgICAgZXJyb3JfZ3JheV80OworICAgZG91YmxlICAgICAgICAgICAgICAgICAgIGVycm9yX2dyYXlfODsKKyAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICBlcnJvcl9ncmF5XzE2OworICAgZG91YmxlICAgICAgICAgICAgICAgICAgIGVycm9yX2NvbG9yXzg7CisgICBkb3VibGUgICAgICAgICAgICAgICAgICAgZXJyb3JfY29sb3JfMTY7CisgICBkb3VibGUgICAgICAgICAgICAgICAgICAgZXJyb3JfaW5kZXhlZDsKKworICAgLyogRmxhZ3M6ICovCisgICAvKiBXaGV0aGVyIHRvIGNhbGwgcG5nX3JlYWRfdXBkYXRlX2luZm8sIG5vdCBwbmdfcmVhZF9zdGFydF9pbWFnZSwgYW5kIGhvdworICAgICogbWFueSB0aW1lcyB0byBjYWxsIGl0LgorICAgICovCisgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdXNlX3VwZGF0ZV9pbmZvOworCisgICAvKiBXaGV0aGVyIG9yIG5vdCB0byBpbnRlcmxhY2UuICovCisgICBpbnQgICAgICAgICAgICAgICAgICAgICAgaW50ZXJsYWNlX3R5cGUgOjk7IC8qIGludCwgYnV0IG11c3Qgc3RvcmUgJzEnICovCisKKyAgIC8qIFJ1biB0aGUgc3RhbmRhcmQgdGVzdHM/ICovCisgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgdGVzdF9zdGFuZGFyZCA6MTsKKworICAgLyogUnVuIHRoZSBvZGQtc2l6ZWQgaW1hZ2UgYW5kIGludGVybGFjZSByZWFkL3dyaXRlIHRlc3RzPyAqLworICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgIHRlc3Rfc2l6ZSA6MTsKKworICAgLyogUnVuIHRlc3RzIG9uIHJlYWRpbmcgd2l0aCBhIGNvbWJpbmF0aW9uIG9mIHRyYW5zZm9ybXMsICovCisgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgdGVzdF90cmFuc2Zvcm0gOjE7CisgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgdGVzdF90Uk5TIDoxOyAvKiBJbmNsdWRlcyB0Uk5TIGltYWdlcyAqLworCisgICAvKiBXaGVuIHRvIHVzZSB0aGUgdXNlX2lucHV0X3ByZWNpc2lvbiBvcHRpb24sIHRoaXMgY29udHJvbHMgdGhlIGdhbW1hCisgICAgKiB2YWxpZGF0aW9uIGNvZGUgY2hlY2tzLiAgSWYgc2V0IGFueSB2YWx1ZSB0aGF0IGlzIHdpdGhpbiB0aGUgdHJhbnNmb3JtZWQKKyAgICAqIHJhbmdlIGlucHV0LS41IHRvIGlucHV0Ky41IHdpbGwgYmUgYWNjZXB0ZWQsIG90aGVyd2lzZSB0aGUgdmFsdWUgbXVzdCBiZQorICAgICogd2l0aGluIHRoZSBub3JtYWwgbGltaXRzLiAgSXQgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgdG8gc2V0IHRoaXM7IHRoZQorICAgICogcmVzdWx0IHNob3VsZCBhbHdheXMgYmUgZXhhY3Qgd2l0aGluIHRoZSBwZXJtaXR0ZWQgZXJyb3IgbGltaXRzLgorICAgICovCisgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgdXNlX2lucHV0X3ByZWNpc2lvbiA6MTsKKyAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICB1c2VfaW5wdXRfcHJlY2lzaW9uX3NiaXQgOjE7CisgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgdXNlX2lucHV0X3ByZWNpc2lvbl8xNnRvOCA6MTsKKworICAgLyogSWYgc2V0IGFzc3VtZSB0aGF0IHRoZSBjYWxjdWxhdGlvbiBiaXQgZGVwdGggaXMgc2V0IGJ5IHRoZSBpbnB1dAorICAgICogcHJlY2lzaW9uLCBub3QgdGhlIG91dHB1dCBwcmVjaXNpb24uCisgICAgKi8KKyAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICBjYWxjdWxhdGlvbnNfdXNlX2lucHV0X3ByZWNpc2lvbiA6MTsKKworICAgLyogSWYgc2V0IGFzc3VtZSB0aGF0IHRoZSBjYWxjdWxhdGlvbnMgYXJlIGRvbmUgaW4gMTYgYml0cyBldmVuIGlmIHRoZSBzYW1wbGUKKyAgICAqIGRlcHRoIGlzIDggYml0cy4KKyAgICAqLworICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgIGFzc3VtZV8xNl9iaXRfY2FsY3VsYXRpb25zIDoxOworCisgICAvKiBXaGljaCBnYW1tYSB0ZXN0cyB0byBydW46ICovCisgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgdGVzdF9nYW1tYV90aHJlc2hvbGQgOjE7CisgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgdGVzdF9nYW1tYV90cmFuc2Zvcm0gOjE7IC8qIG1haW4gdGVzdHMgKi8KKyAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICB0ZXN0X2dhbW1hX3NiaXQgOjE7CisgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgdGVzdF9nYW1tYV9zY2FsZTE2IDoxOworICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgIHRlc3RfZ2FtbWFfYmFja2dyb3VuZCA6MTsKKyAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICB0ZXN0X2dhbW1hX2FscGhhX21vZGUgOjE7CisgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgdGVzdF9nYW1tYV9leHBhbmQxNiA6MTsKKyAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICB0ZXN0X2V4aGF1c3RpdmUgOjE7CisKKyAgIC8qIFdoZXRoZXIgb3Igbm90IHRvIHJ1biB0aGUgbG93LWJpdC1kZXB0aCBncmF5c2NhbGUgdGVzdHMuICBUaGlzIGZhaWxzIG9uCisgICAgKiBnYW1tYSBpbWFnZXMgaW4gc29tZSBjYXNlcyBiZWNhdXNlIG9mIGdyb3NzIGluYWNjdXJhY2llcyBpbiB0aGUgZ3JheXNjYWxlCisgICAgKiBnYW1tYSBoYW5kbGluZyBmb3IgbG93IGJpdCBkZXB0aC4KKyAgICAqLworICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgIHRlc3RfbGJnIDoxOworICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgIHRlc3RfbGJnX2dhbW1hX3RocmVzaG9sZCA6MTsKKyAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICB0ZXN0X2xiZ19nYW1tYV90cmFuc2Zvcm0gOjE7CisgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgdGVzdF9sYmdfZ2FtbWFfc2JpdCA6MTsKKyAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICB0ZXN0X2xiZ19nYW1tYV9jb21wb3NpdGlvbiA6MTsKKworICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgIGxvZyA6MTsgICAvKiBMb2cgbWF4IGVycm9yICovCisKKyAgIC8qIEJ1ZmZlciBpbmZvcm1hdGlvbiwgdGhlIGJ1ZmZlciBzaXplIGxpbWl0cyB0aGUgc2l6ZSBvZiB0aGUgY2h1bmtzIHRoYXQgY2FuCisgICAgKiBiZSBtb2RpZmllZCAtIHRoZXkgbXVzdCBmaXQgKGluY2x1ZGluZyBoZWFkZXIgYW5kIENSQykgaW50byB0aGUgYnVmZmVyIQorICAgICovCisgICBzaXplX3QgICAgICAgICAgICAgICAgICAgZmx1c2g7ICAgICAgICAgICAvKiBDb3VudCBvZiBieXRlcyB0byBmbHVzaCAqLworICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9jb3VudDsgICAgLyogQnl0ZXMgaW4gYnVmZmVyICovCisgICBzaXplX3QgICAgICAgICAgICAgICAgICAgYnVmZmVyX3Bvc2l0aW9uOyAvKiBQb3NpdGlvbiBpbiBidWZmZXIgKi8KKyAgIHBuZ19ieXRlICAgICAgICAgICAgICAgICBidWZmZXJbMTAyNF07Cit9IHBuZ19tb2RpZmllcjsKKworLyogVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIHRlc3Qgc2hvdWxkIGJlIHN0b3BwZWQgbm93IGJlY2F1c2UgaXQgaGFzIGFscmVhZHkKKyAqIGZhaWxlZCBhbmQgaXQgaXMgcnVubmluZyBzaWxlbnRseS4KKyAgKi8KK3N0YXRpYyBpbnQgZmFpbChwbmdfbW9kaWZpZXIgKnBtKQoreworICAgcmV0dXJuICFwbS0+bG9nICYmICFwbS0+dGhpcy52ZXJib3NlICYmIChwbS0+dGhpcy5uZXJyb3JzID4gMCB8fAorICAgICAgIChwbS0+dGhpcy50cmVhdF93YXJuaW5nc19hc19lcnJvcnMgJiYgcG0tPnRoaXMubndhcm5pbmdzID4gMCkpOworfQorCitzdGF0aWMgdm9pZAorbW9kaWZpZXJfaW5pdChwbmdfbW9kaWZpZXIgKnBtKQoreworICAgbWVtc2V0KHBtLCAwLCBzaXplb2YgKnBtKTsKKyAgIHN0b3JlX2luaXQoJnBtLT50aGlzKTsKKyAgIHBtLT5tb2RpZmljYXRpb25zID0gTlVMTDsKKyAgIHBtLT5zdGF0ZSA9IG1vZGlmaWVyX3N0YXJ0OworICAgcG0tPnNiaXRsb3cgPSAxVTsKKyAgIHBtLT5uZ2FtbWFzID0gMDsKKyAgIHBtLT5uZ2FtbWFfdGVzdHMgPSAwOworICAgcG0tPmdhbW1hcyA9IDA7CisgICBwbS0+Y3VycmVudF9nYW1tYSA9IDA7CisgICBwbS0+ZW5jb2RpbmdzID0gMDsKKyAgIHBtLT5uZW5jb2RpbmdzID0gMDsKKyAgIHBtLT5jdXJyZW50X2VuY29kaW5nID0gMDsKKyAgIHBtLT5lbmNvZGluZ19jb3VudGVyID0gMDsKKyAgIHBtLT5lbmNvZGluZ19pZ25vcmVkID0gMDsKKyAgIHBtLT5yZXBlYXQgPSAwOworICAgcG0tPnRlc3RfdXNlc19lbmNvZGluZyA9IDA7CisgICBwbS0+bWF4b3V0OCA9IHBtLT5tYXhwYzggPSBwbS0+bWF4YWJzOCA9IHBtLT5tYXhjYWxjOCA9IDA7CisgICBwbS0+bWF4b3V0MTYgPSBwbS0+bWF4cGMxNiA9IHBtLT5tYXhhYnMxNiA9IHBtLT5tYXhjYWxjMTYgPSAwOworICAgcG0tPm1heGNhbGNHID0gMDsKKyAgIHBtLT5saW1pdCA9IDRFLTM7CisgICBwbS0+bG9nOCA9IHBtLT5sb2cxNiA9IDA7IC8qIE1lYW5zICdvZmYnICovCisgICBwbS0+ZXJyb3JfZ3JheV8yID0gcG0tPmVycm9yX2dyYXlfNCA9IHBtLT5lcnJvcl9ncmF5XzggPSAwOworICAgcG0tPmVycm9yX2dyYXlfMTYgPSBwbS0+ZXJyb3JfY29sb3JfOCA9IHBtLT5lcnJvcl9jb2xvcl8xNiA9IDA7CisgICBwbS0+ZXJyb3JfaW5kZXhlZCA9IDA7CisgICBwbS0+dXNlX3VwZGF0ZV9pbmZvID0gMDsKKyAgIHBtLT5pbnRlcmxhY2VfdHlwZSA9IFBOR19JTlRFUkxBQ0VfTk9ORTsKKyAgIHBtLT50ZXN0X3N0YW5kYXJkID0gMDsKKyAgIHBtLT50ZXN0X3NpemUgPSAwOworICAgcG0tPnRlc3RfdHJhbnNmb3JtID0gMDsKKyMgIGlmZGVmIFBOR19XUklURV90Uk5TX1NVUFBPUlRFRAorICAgICAgcG0tPnRlc3RfdFJOUyA9IDE7CisjICBlbHNlCisgICAgICBwbS0+dGVzdF90Uk5TID0gMDsKKyMgIGVuZGlmCisgICBwbS0+dXNlX2lucHV0X3ByZWNpc2lvbiA9IDA7CisgICBwbS0+dXNlX2lucHV0X3ByZWNpc2lvbl9zYml0ID0gMDsKKyAgIHBtLT51c2VfaW5wdXRfcHJlY2lzaW9uXzE2dG84ID0gMDsKKyAgIHBtLT5jYWxjdWxhdGlvbnNfdXNlX2lucHV0X3ByZWNpc2lvbiA9IDA7CisgICBwbS0+YXNzdW1lXzE2X2JpdF9jYWxjdWxhdGlvbnMgPSAwOworICAgcG0tPnRlc3RfZ2FtbWFfdGhyZXNob2xkID0gMDsKKyAgIHBtLT50ZXN0X2dhbW1hX3RyYW5zZm9ybSA9IDA7CisgICBwbS0+dGVzdF9nYW1tYV9zYml0ID0gMDsKKyAgIHBtLT50ZXN0X2dhbW1hX3NjYWxlMTYgPSAwOworICAgcG0tPnRlc3RfZ2FtbWFfYmFja2dyb3VuZCA9IDA7CisgICBwbS0+dGVzdF9nYW1tYV9hbHBoYV9tb2RlID0gMDsKKyAgIHBtLT50ZXN0X2dhbW1hX2V4cGFuZDE2ID0gMDsKKyAgIHBtLT50ZXN0X2xiZyA9IDE7CisgICBwbS0+dGVzdF9sYmdfZ2FtbWFfdGhyZXNob2xkID0gMTsKKyAgIHBtLT50ZXN0X2xiZ19nYW1tYV90cmFuc2Zvcm0gPSAxOworICAgcG0tPnRlc3RfbGJnX2dhbW1hX3NiaXQgPSAxOworICAgcG0tPnRlc3RfbGJnX2dhbW1hX2NvbXBvc2l0aW9uID0gMTsKKyAgIHBtLT50ZXN0X2V4aGF1c3RpdmUgPSAwOworICAgcG0tPmxvZyA9IDA7CisKKyAgIC8qIFJlbHkgb24gdGhlIG1lbXNldCBmb3IgYWxsIHRoZSBvdGhlciBmaWVsZHMgLSB0aGVyZSBhcmUgbm8gcG9pbnRlcnMgKi8KK30KKworI2lmZGVmIFBOR19SRUFEX1RSQU5TRk9STVNfU1VQUE9SVEVECisKKy8qIFRoaXMgY29udHJvbHMgdXNlIG9mIGNoZWNrcyB0aGF0IGV4cGxpY2l0bHkga25vdyBob3cgbGlicG5nIGRpZ2l0aXplcyB0aGUKKyAqIHNhbXBsZXMgaW4gY2FsY3VsYXRpb25zOyBzZXR0aW5nIHRoaXMgY2lyY3VtdmVudHMgc2ltcGxlIGVycm9yIGxpbWl0IGNoZWNraW5nCisgKiBpbiB0aGUgcmdiX3RvX2dyYXkgY2hlY2ssIHJlcGxhY2luZyBpdCB3aXRoIGFuIGV4YWN0IGNvcHkgb2YgdGhlIGxpYnBuZyAxLjUKKyAqIGFsZ29yaXRobS4KKyAqLworI2RlZmluZSBESUdJVElaRSBQTkdfTElCUE5HX1ZFUiA8IDEwNzAwCisKKy8qIElmIHBtLT5jYWxjdWxhdGlvbnNfdXNlX2lucHV0X3ByZWNpc2lvbiBpcyBzZXQgdGhlbiBvcGVyYXRpb25zIHdpbGwgaGFwcGVuCisgKiB3aXRoIHRoZSBwcmVjaXNpb24gb2YgdGhlIGlucHV0LCBub3QgdGhlIHByZWNpc2lvbiBvZiB0aGUgb3V0cHV0IGRlcHRoLgorICoKKyAqIElmIHBtLT5hc3N1bWVfMTZfYml0X2NhbGN1bGF0aW9ucyBpcyBzZXQgdGhlbiBldmVuIDggYml0IGNhbGN1bGF0aW9ucyB1c2UgMTYKKyAqIGJpdCBwcmVjaXNpb24uICBUaGlzIG9ubHkgYWZmZWN0cyB0aG9zZSBvZiB0aGUgZm9sbG93aW5nIGxpbWl0cyB0aGF0IHBlcnRhaW4KKyAqIHRvIGEgY2FsY3VsYXRpb24gLSBub3QgYSBkaWdpdGl6YXRpb24gb3BlcmF0aW9uIC0gdW5sZXNzIHRoZSBmb2xsb3dpbmcgQVBJIGlzCisgKiBjYWxsZWQgZGlyZWN0bHkuCisgKi8KKyNpZmRlZiBQTkdfUkVBRF9SR0JfVE9fR1JBWV9TVVBQT1JURUQKKyNpZiBESUdJVElaRQorc3RhdGljIGRvdWJsZSBkaWdpdGl6ZShkb3VibGUgdmFsdWUsIGludCBkZXB0aCwgaW50IGRvX3JvdW5kKQoreworICAgLyogJ3ZhbHVlJyBpcyBpbiB0aGUgcmFuZ2UgMCB0byAxLCB0aGUgcmVzdWx0IGlzIHRoZSBzYW1lIHZhbHVlIHJvdW5kZWQgdG8gYQorICAgICogbXVsdGlwbGUgb2YgdGhlIGRpZ2l0aXphdGlvbiBmYWN0b3IgLSA4IG9yIDE2IGJpdHMgZGVwZW5kaW5nIG9uIGJvdGggdGhlCisgICAgKiBzYW1wbGUgZGVwdGggYW5kIHRoZSAnYXNzdW1lJyBzZXR0aW5nLiAgRGlnaXRpemF0aW9uIGlzIG5vcm1hbGx5IGJ5CisgICAgKiByb3VuZGluZyBhbmQgJ2RvX3JvdW5kJyBzaG91bGQgYmUgMSwgaWYgaXQgaXMgMCB0aGUgZGlnaXRpemVkIHZhbHVlIHdpbGwKKyAgICAqIGJlIHRydW5jYXRlZC4KKyAgICAqLworICAgY29uc3QgdW5zaWduZWQgaW50IGRpZ2l0aXphdGlvbl9mYWN0b3IgPSAoMVUgPDwgZGVwdGgpIC0xOworCisgICAvKiBMaW1pdGluZyB0aGUgcmFuZ2UgaXMgZG9uZSBhcyBhIGNvbnZlbmllbmNlIHRvIHRoZSBjYWxsZXIgLSBpdCdzIGVhc2llciB0bworICAgICogZG8gaXQgb25jZSBoZXJlIHRoYW4gZXZlcnkgdGltZSBhdCB0aGUgY2FsbCBzaXRlLgorICAgICovCisgICBpZiAodmFsdWUgPD0gMCkKKyAgICAgIHZhbHVlID0gMDsKKworICAgZWxzZSBpZiAodmFsdWUgPj0gMSkKKyAgICAgIHZhbHVlID0gMTsKKworICAgdmFsdWUgKj0gZGlnaXRpemF0aW9uX2ZhY3RvcjsKKyAgIGlmIChkb19yb3VuZCkgdmFsdWUgKz0gLjU7CisgICByZXR1cm4gZmxvb3IodmFsdWUpL2RpZ2l0aXphdGlvbl9mYWN0b3I7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBSR0JfVE9fR1JBWSAqLworCisjaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECitzdGF0aWMgZG91YmxlIGFic2Vycihjb25zdCBwbmdfbW9kaWZpZXIgKnBtLCBpbnQgaW5fZGVwdGgsIGludCBvdXRfZGVwdGgpCit7CisgICAvKiBBYnNvbHV0ZSBlcnJvciBwZXJtaXR0ZWQgaW4gbGluZWFyIHZhbHVlcyAtIGFmZmVjdGVkIGJ5IHRoZSBiaXQgZGVwdGggb2YKKyAgICAqIHRoZSBjYWxjdWxhdGlvbnMuCisgICAgKi8KKyAgIGlmIChwbS0+YXNzdW1lXzE2X2JpdF9jYWxjdWxhdGlvbnMgfHwKKyAgICAgIChwbS0+Y2FsY3VsYXRpb25zX3VzZV9pbnB1dF9wcmVjaXNpb24gPyBpbl9kZXB0aCA6IG91dF9kZXB0aCkgPT0gMTYpCisgICAgICByZXR1cm4gcG0tPm1heGFiczE2OworICAgZWxzZQorICAgICAgcmV0dXJuIHBtLT5tYXhhYnM4OworfQorCitzdGF0aWMgZG91YmxlIGNhbGNlcnIoY29uc3QgcG5nX21vZGlmaWVyICpwbSwgaW50IGluX2RlcHRoLCBpbnQgb3V0X2RlcHRoKQoreworICAgLyogRXJyb3IgaW4gdGhlIGxpbmVhciBjb21wb3NpdGlvbiBhcml0aG1ldGljIC0gb25seSByZWxldmFudCB3aGVuCisgICAgKiBjb21wb3NpdGlvbiBhY3R1YWxseSBoYXBwZW5zICgwIDwgYWxwaGEgPCAxKS4KKyAgICAqLworICAgaWYgKChwbS0+Y2FsY3VsYXRpb25zX3VzZV9pbnB1dF9wcmVjaXNpb24gPyBpbl9kZXB0aCA6IG91dF9kZXB0aCkgPT0gMTYpCisgICAgICByZXR1cm4gcG0tPm1heGNhbGMxNjsKKyAgIGVsc2UgaWYgKHBtLT5hc3N1bWVfMTZfYml0X2NhbGN1bGF0aW9ucykKKyAgICAgIHJldHVybiBwbS0+bWF4Y2FsY0c7CisgICBlbHNlCisgICAgICByZXR1cm4gcG0tPm1heGNhbGM4OworfQorCitzdGF0aWMgZG91YmxlIHBjZXJyKGNvbnN0IHBuZ19tb2RpZmllciAqcG0sIGludCBpbl9kZXB0aCwgaW50IG91dF9kZXB0aCkKK3sKKyAgIC8qIFBlcmNlbnRhZ2UgZXJyb3IgcGVybWl0dGVkIGluIHRoZSBsaW5lYXIgdmFsdWVzLiAgTm90ZSB0aGF0IHRoZSBzcGVjaWZpZWQKKyAgICAqIHZhbHVlIGlzIGEgcGVyY2VudGFnZSBidXQgdGhpcyByb3V0aW5lIHJldHVybnMgYSBzaW1wbGUgbnVtYmVyLgorICAgICovCisgICBpZiAocG0tPmFzc3VtZV8xNl9iaXRfY2FsY3VsYXRpb25zIHx8CisgICAgICAocG0tPmNhbGN1bGF0aW9uc191c2VfaW5wdXRfcHJlY2lzaW9uID8gaW5fZGVwdGggOiBvdXRfZGVwdGgpID09IDE2KQorICAgICAgcmV0dXJuIHBtLT5tYXhwYzE2ICogLjAxOworICAgZWxzZQorICAgICAgcmV0dXJuIHBtLT5tYXhwYzggKiAuMDE7Cit9CisKKy8qIE91dHB1dCBlcnJvciAtIHRoZSBlcnJvciBpbiB0aGUgZW5jb2RlZCB2YWx1ZS4gIFRoaXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUKKyAqIGRpZ2l0aXphdGlvbiBvZiB0aGUgb3V0cHV0IHNvIGNhbiBiZSArLy0wLjUgaW4gdGhlIGFjdHVhbCBvdXRwdXQgdmFsdWUuICBJbgorICogdGhlIGV4cGFuZF8xNiBjYXNlIHdpdGggdGhlIGN1cnJlbnQgY29kZSBpbiBsaWJwbmcgdGhlIGV4cGFuZCBoYXBwZW5zIGFmdGVyCisgKiBhbGwgdGhlIGNhbGN1bGF0aW9ucyBhcmUgZG9uZSBpbiA4IGJpdCBhcml0aG1ldGljLCBzbyBldmVuIHRob3VnaCB0aGUgb3V0cHV0CisgKiBkZXB0aCBpcyAxNiB0aGUgb3V0cHV0IGVycm9yIGlzIGRldGVybWluZWQgYnkgdGhlIDggYml0IGNhbGN1bGF0aW9uLgorICoKKyAqIFRoaXMgbGltaXQgaXMgbm90IGRldGVybWluZWQgYnkgdGhlIGJpdCBkZXB0aCBvZiBpbnRlcm5hbCBjYWxjdWxhdGlvbnMuCisgKgorICogVGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgZG9lcyAqbm90KiBpbmNsdWRlIHRoZSBiYXNlIC41IGRpZ2l0aXphdGlvbiBlcnJvciBidXQKKyAqIGl0IGlzIGFkZGVkIGhlcmUuCisgKi8KK3N0YXRpYyBkb3VibGUgb3V0ZXJyKGNvbnN0IHBuZ19tb2RpZmllciAqcG0sIGludCBpbl9kZXB0aCwgaW50IG91dF9kZXB0aCkKK3sKKyAgIC8qIFRoZXJlIGlzIGEgc2VyaW91cyBlcnJvciBpbiB0aGUgMiBhbmQgNCBiaXQgZ3JheXNjYWxlIHRyYW5zZm9ybSBiZWNhdXNlCisgICAgKiB0aGUgZ2FtbWEgdGFibGUgdmFsdWUgKDggYml0cykgaXMgc2ltcGx5IHNoaWZ0ZWQsIG5vdCByb3VuZGVkLCBzbyB0aGUKKyAgICAqIGVycm9yIGluIDQgYml0IGdyYXlzY2FsZSBnYW1tYSBpcyB1cCB0byB0aGUgdmFsdWUgYmVsb3cuICBUaGlzIGlzIGEgaGFjaworICAgICogdG8gYWxsb3cgcG5ndmFsaWQgdG8gc3VjY2VlZDoKKyAgICAqCisgICAgKiBUT0RPOiBmaXggdGhpcyBpbiBsaWJwbmcKKyAgICAqLworICAgaWYgKG91dF9kZXB0aCA9PSAyKQorICAgICAgcmV0dXJuIC43MzE4Mi0uNTsKKworICAgaWYgKG91dF9kZXB0aCA9PSA0KQorICAgICAgcmV0dXJuIC45MDY0NC0uNTsKKworICAgaWYgKChwbS0+Y2FsY3VsYXRpb25zX3VzZV9pbnB1dF9wcmVjaXNpb24gPyBpbl9kZXB0aCA6IG91dF9kZXB0aCkgPT0gMTYpCisgICAgICByZXR1cm4gcG0tPm1heG91dDE2OworCisgICAvKiBUaGlzIGlzIHRoZSBjYXNlIHdoZXJlIHRoZSB2YWx1ZSB3YXMgY2FsY3VsYXRlZCBhdCA4LWJpdCBwcmVjaXNpb24gdGhlbgorICAgICogc2NhbGVkIHRvIDE2IGJpdHMuCisgICAgKi8KKyAgIGVsc2UgaWYgKG91dF9kZXB0aCA9PSAxNikKKyAgICAgIHJldHVybiBwbS0+bWF4b3V0OCAqIDI1NzsKKworICAgZWxzZQorICAgICAgcmV0dXJuIHBtLT5tYXhvdXQ4OworfQorCisvKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgdGhlIGFib3ZlIGhvd2V2ZXIgaXQgcmV0dXJucyB0aGUgdmFsdWUgdG8gbG9nLAorICogcmF0aGVyIHRoYW4gcmFpc2luZyBhIHdhcm5pbmcuICBUaGlzIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHRvIHRyYWNrIGRvd24KKyAqIGV4YWN0bHkgd2hhdCBzZXQgb2YgcGFyYW1ldGVycyBjYXVzZSBoaWdoIGVycm9yIHZhbHVlcy4KKyAqLworc3RhdGljIGRvdWJsZSBvdXRsb2coY29uc3QgcG5nX21vZGlmaWVyICpwbSwgaW50IGluX2RlcHRoLCBpbnQgb3V0X2RlcHRoKQoreworICAgLyogVGhlIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIGFyZSBlaXRoZXIgOCBiaXQgKDAuLjI1NSkgb3IgMTYgYml0ICgwLi42NTUzNSkKKyAgICAqIGFuZCBzbyBtdXN0IGJlIGFkanVzdGVkIGZvciBsb3cgYml0IGRlcHRoIGdyYXlzY2FsZToKKyAgICAqLworICAgaWYgKG91dF9kZXB0aCA8PSA4KQorICAgeworICAgICAgaWYgKHBtLT5sb2c4ID09IDApIC8qIHN3aXRjaGVkIG9mZiAqLworICAgICAgICAgcmV0dXJuIDI1NjsKKworICAgICAgaWYgKG91dF9kZXB0aCA8IDgpCisgICAgICAgICByZXR1cm4gcG0tPmxvZzggLyAyNTUgKiAoKDE8PG91dF9kZXB0aCktMSk7CisKKyAgICAgIHJldHVybiBwbS0+bG9nODsKKyAgIH0KKworICAgaWYgKChwbS0+Y2FsY3VsYXRpb25zX3VzZV9pbnB1dF9wcmVjaXNpb24gPyBpbl9kZXB0aCA6IG91dF9kZXB0aCkgPT0gMTYpCisgICB7CisgICAgICBpZiAocG0tPmxvZzE2ID09IDApCisgICAgICAgICByZXR1cm4gNjU1MzY7CisKKyAgICAgIHJldHVybiBwbS0+bG9nMTY7CisgICB9CisKKyAgIC8qIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgdGhlIHZhbHVlIHdhcyBjYWxjdWxhdGVkIGF0IDgtYml0IHByZWNpc2lvbiB0aGVuCisgICAgKiBzY2FsZWQgdG8gMTYgYml0cy4KKyAgICAqLworICAgaWYgKHBtLT5sb2c4ID09IDApCisgICAgICByZXR1cm4gNjU1MzY7CisKKyAgIHJldHVybiBwbS0+bG9nOCAqIDI1NzsKK30KKworLyogVGhpcyBjb21wbGVtZW50cyB0aGUgYWJvdmUgYnkgcHJvdmlkaW5nIHRoZSBhcHByb3ByaWF0ZSBxdWFudGl6YXRpb24gZm9yIHRoZQorICogZmluYWwgdmFsdWUuICBOb3JtYWxseSB0aGlzIHdvdWxkIGp1c3QgYmUgcXVhbnRpemF0aW9uIHRvIGFuIGludGVncmFsIHZhbHVlLAorICogYnV0IGluIHRoZSA4IGJpdCBjYWxjdWxhdGlvbiBjYXNlIGl0J3MgYWN0dWFsbHkgcXVhbnRpemF0aW9uIHRvIGEgbXVsdGlwbGUgb2YKKyAqIDI1NyEKKyAqLworc3RhdGljIGludCBvdXRwdXRfcXVhbnRpemF0aW9uX2ZhY3Rvcihjb25zdCBwbmdfbW9kaWZpZXIgKnBtLCBpbnQgaW5fZGVwdGgsCisgICBpbnQgb3V0X2RlcHRoKQoreworICAgaWYgKG91dF9kZXB0aCA9PSAxNiAmJiBpbl9kZXB0aCAhPSAxNiAmJgorICAgICAgcG0tPmNhbGN1bGF0aW9uc191c2VfaW5wdXRfcHJlY2lzaW9uKQorICAgICAgcmV0dXJuIDI1NzsKKyAgIGVsc2UKKyAgICAgIHJldHVybiAxOworfQorI2VuZGlmIC8qIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCAqLworCisvKiBPbmUgbW9kaWZpY2F0aW9uIHN0cnVjdHVyZSBtdXN0IGJlIHByb3ZpZGVkIGZvciBlYWNoIGNodW5rIHRvIGJlIG1vZGlmaWVkIChpbgorICogZmFjdCBtb3JlIHRoYW4gb25lIGNhbiBiZSBwcm92aWRlZCBpZiBtdWx0aXBsZSBzZXBhcmF0ZSBjaGFuZ2VzIGFyZSBkZXNpcmVkCisgKiBmb3IgYSBzaW5nbGUgY2h1bmsuKSAgTW9kaWZpY2F0aW9ucyBpbmNsdWRlIGFkZGluZyBhIG5ldyBjaHVuayB3aGVuIGEKKyAqIHN1aXRhYmxlIGNodW5rIGRvZXMgbm90IGV4aXN0LgorICoKKyAqIFRoZSBjYWxsZXIgb2YgbW9kaWZ5X2ZuIHdpbGwgcmVzZXQgdGhlIENSQyBvZiB0aGUgY2h1bmsgYW5kIHJlY29yZCAnbW9kaWZpZWQnCisgKiBvciAnYWRkZWQnIGFzIGFwcHJvcHJpYXRlIGlmIHRoZSBtb2RpZnlfZm4gcmV0dXJucyAxICh0cnVlKS4gIElmIHRoZQorICogbW9kaWZ5X2ZuIGlzIE5VTEwgdGhlIGNodW5rIGlzIHNpbXBseSByZW1vdmVkLgorICovCit0eXBlZGVmIHN0cnVjdCBwbmdfbW9kaWZpY2F0aW9uCit7CisgICBzdHJ1Y3QgcG5nX21vZGlmaWNhdGlvbiAqbmV4dDsKKyAgIHBuZ191aW50XzMyICAgICAgICAgICAgICBjaHVuazsKKworICAgLyogSWYgdGhlIGZvbGxvd2luZyBpcyBOVUxMIGFsbCBtYXRjaGluZyBjaHVua3Mgd2lsbCBiZSByZW1vdmVkOiAqLworICAgaW50ICAgICAgICAgICAgICAgICAgICAoKm1vZGlmeV9mbikoc3RydWN0IHBuZ19tb2RpZmllciAqcG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHBuZ19tb2RpZmljYXRpb24gKm1lLCBpbnQgYWRkKTsKKworICAgLyogSWYgdGhlIGZvbGxvd2luZyBpcyBzZXQgdG8gUExURSwgSURBVCBvciBJRU5EIGFuZCB0aGUgY2h1bmsgaGFzIG5vdCBiZWVuCisgICAgKiBmb3VuZCBhbmQgbW9kaWZpZWQgKGFuZCB0aGVyZSBpcyBhIG1vZGlmeV9mbikgdGhlIG1vZGlmeV9mbiB3aWxsIGJlIGNhbGxlZAorICAgICogdG8gYWRkIHRoZSBjaHVuayBiZWZvcmUgdGhlIHJlbGV2YW50IGNodW5rLgorICAgICovCisgICBwbmdfdWludF8zMiAgICAgICAgICAgICAgYWRkOworICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgIG1vZGlmaWVkIDoxOyAgICAgLyogQ2h1bmsgd2FzIG1vZGlmaWVkICovCisgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgYWRkZWQgICAgOjE7ICAgICAvKiBDaHVuayB3YXMgYWRkZWQgKi8KKyAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICByZW1vdmVkICA6MTsgICAgIC8qIENodW5rIHdhcyByZW1vdmVkICovCit9IHBuZ19tb2RpZmljYXRpb247CisKK3N0YXRpYyB2b2lkCittb2RpZmljYXRpb25fcmVzZXQocG5nX21vZGlmaWNhdGlvbiAqcG1tKQoreworICAgaWYgKHBtbSAhPSBOVUxMKQorICAgeworICAgICAgcG1tLT5tb2RpZmllZCA9IDA7CisgICAgICBwbW0tPmFkZGVkID0gMDsKKyAgICAgIHBtbS0+cmVtb3ZlZCA9IDA7CisgICAgICBtb2RpZmljYXRpb25fcmVzZXQocG1tLT5uZXh0KTsKKyAgIH0KK30KKworc3RhdGljIHZvaWQKK21vZGlmaWNhdGlvbl9pbml0KHBuZ19tb2RpZmljYXRpb24gKnBtbSkKK3sKKyAgIG1lbXNldChwbW0sIDAsIHNpemVvZiAqcG1tKTsKKyAgIHBtbS0+bmV4dCA9IE5VTEw7CisgICBwbW0tPmNodW5rID0gMDsKKyAgIHBtbS0+bW9kaWZ5X2ZuID0gTlVMTDsKKyAgIHBtbS0+YWRkID0gMDsKKyAgIG1vZGlmaWNhdGlvbl9yZXNldChwbW0pOworfQorCisjaWZkZWYgUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVECitzdGF0aWMgdm9pZAorbW9kaWZpZXJfY3VycmVudF9lbmNvZGluZyhjb25zdCBwbmdfbW9kaWZpZXIgKnBtLCBjb2xvcl9lbmNvZGluZyAqY2UpCit7CisgICBpZiAocG0tPmN1cnJlbnRfZW5jb2RpbmcgIT0gMCkKKyAgICAgICpjZSA9ICpwbS0+Y3VycmVudF9lbmNvZGluZzsKKworICAgZWxzZQorICAgICAgbWVtc2V0KGNlLCAwLCBzaXplb2YgKmNlKTsKKworICAgY2UtPmdhbW1hID0gcG0tPmN1cnJlbnRfZ2FtbWE7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX1RSQU5TRk9STVNfU1VQUE9SVEVECitzdGF0aWMgc2l6ZV90CitzYWZlY2F0X2N1cnJlbnRfZW5jb2RpbmcoY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmc2l6ZSwgc2l6ZV90IHBvcywKKyAgIGNvbnN0IHBuZ19tb2RpZmllciAqcG0pCit7CisgICBwb3MgPSBzYWZlY2F0X2NvbG9yX2VuY29kaW5nKGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCBwbS0+Y3VycmVudF9lbmNvZGluZywKKyAgICAgIHBtLT5jdXJyZW50X2dhbW1hKTsKKworICAgaWYgKHBtLT5lbmNvZGluZ19pZ25vcmVkKQorICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIGJ1ZnNpemUsIHBvcywgIltvdmVycmlkZGVuXSIpOworCisgICByZXR1cm4gcG9zOworfQorI2VuZGlmCisKKy8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgdXNlZnVsbHkgdGVzdGFibGUgY29sb3IgZW5jb2RpbmdzLiAgQW4gZW5jb2RpbmcgaXMgb25lCisgKiBvZjoKKyAqCisgKiAxKSBOb3RoaW5nIChubyBjb2xvciBzcGFjZSwgbm8gZ2FtbWEpLgorICogMikgSnVzdCBhIGdhbW1hIHZhbHVlIGZyb20gdGhlIGdhbW1hIGFycmF5IChpbmNsdWRpbmcgMS4wKQorICogMykgQSBjb2xvciBzcGFjZSBmcm9tIHRoZSBlbmNvZGluZ3MgYXJyYXkgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBnYW1tYS4KKyAqIDQpIFRoZSBzYW1lLCBidXQgd2l0aCBnYW1tYSAxLjAgKG9ubHkgcmVhbGx5IHVzZWZ1bCB3aXRoIDE2IGJpdCBjYWxjdWxhdGlvbnMpCisgKgorICogVGhlIGl0ZXJhdG9yIHNlbGVjdHMgdGhlc2UgaW4gdHVybiwgdGhlIHJhbmRvbWl6ZXIgc2VsZWN0cyBvbmUgYXQgcmFuZG9tLAorICogd2hpY2ggaXMgdXNlZCBkZXBlbmRzIG9uIHRoZSBzZXR0aW5nIG9mIHRoZSAndGVzdF9leGhhdXN0aXZlJyBmbGFnLiAgTm90aWNlCisgKiB0aGF0IHRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgY29sb3VyIHNwYWNlIGVuY29kaW5nIHNvIGl0IG11c3Qgb25seSBiZQorICogY2FsbGVkIG9uIGNvbXBsZXRpb24gb2YgdGhlIHByZXZpb3VzIHRlc3QuICBUaGlzIGlzIHdoYXQgJ21vZGlmaWVyX3Jlc2V0JworICogZG9lcywgYmVsb3cuCisgKgorICogQWZ0ZXIgdGhlIGZ1bmN0aW9uIGhhcyBiZWVuIGNhbGxlZCB0aGUgJ3JlcGVhdCcgZmxhZyB3aWxsIHN0aWxsIGJlIHNldDsgdGhlCisgKiBjYWxsZXIgb2YgbW9kaWZpZXJfcmVzZXQgbXVzdCByZXNldCBpdCBhdCB0aGUgc3RhcnQgb2YgZWFjaCBydW4gb2YgdGhlIHRlc3QhCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQKK21vZGlmaWVyX3RvdGFsX2VuY29kaW5ncyhjb25zdCBwbmdfbW9kaWZpZXIgKnBtKQoreworICAgcmV0dXJuIDEgKyAgICAgICAgICAgICAgICAgLyogKDEpIG5vdGhpbmcgKi8KKyAgICAgIHBtLT5uZ2FtbWFzICsgICAgICAgICAgIC8qICgyKSBnYW1tYSB2YWx1ZXMgdG8gdGVzdCAqLworICAgICAgcG0tPm5lbmNvZGluZ3MgKyAgICAgICAgLyogKDMpIHRvdGFsIG51bWJlciBvZiBlbmNvZGluZ3MgKi8KKyAgICAgIC8qIFRoZSBmb2xsb3dpbmcgdGVzdCBvbmx5IHdvcmtzIGFmdGVyIHRoZSBmaXJzdCB0aW1lIHRocm91Z2ggdGhlCisgICAgICAgKiBwbmdfbW9kaWZpZXIgY29kZSBiZWNhdXNlICdiaXRfZGVwdGgnIGlzIHNldCB3aGVuIHRoZSBJSERSIGlzIHJlYWQuCisgICAgICAgKiBtb2RpZmllcl9yZXNldCwgYmVsb3csIHByZXNlcnZlcyB0aGUgc2V0dGluZyB1bnRpbCBhZnRlciBpdCBoYXMgY2FsbGVkCisgICAgICAgKiB0aGUgaXRlcmF0ZSBmdW5jdGlvbiAoYWxzbyBiZWxvdy4pCisgICAgICAgKgorICAgICAgICogRm9yIHRoaXMgcmVhc29uIGRvIG5vdCByZWx5IG9uIHRoaXMgZnVuY3Rpb24gb3V0c2lkZSBhIGNhbGwgdG8KKyAgICAgICAqIG1vZGlmaWVyX3Jlc2V0LgorICAgICAgICovCisgICAgICAoKHBtLT5iaXRfZGVwdGggPT0gMTYgfHwgcG0tPmFzc3VtZV8xNl9iaXRfY2FsY3VsYXRpb25zKSA/CisgICAgICAgICBwbS0+bmVuY29kaW5ncyA6IDApOyAvKiAoNCkgZW5jb2RpbmdzIHdpdGggZ2FtbWEgPT0gMS4wICovCit9CisKK3N0YXRpYyB2b2lkCittb2RpZmllcl9lbmNvZGluZ19pdGVyYXRlKHBuZ19tb2RpZmllciAqcG0pCit7CisgICBpZiAoIXBtLT5yZXBlYXQgJiYgLyogRWxzZSBzb21ldGhpbmcgbmVlZHMgdGhlIGN1cnJlbnQgZW5jb2RpbmcgYWdhaW4uICovCisgICAgICBwbS0+dGVzdF91c2VzX2VuY29kaW5nKSAvKiBTb21lIHRyYW5zZm9ybSBpcyBlbmNvZGluZyBkZXBlbmRlbnQgKi8KKyAgIHsKKyAgICAgIGlmIChwbS0+dGVzdF9leGhhdXN0aXZlKQorICAgICAgeworICAgICAgICAgaWYgKCsrcG0tPmVuY29kaW5nX2NvdW50ZXIgPj0gbW9kaWZpZXJfdG90YWxfZW5jb2RpbmdzKHBtKSkKKyAgICAgICAgICAgIHBtLT5lbmNvZGluZ19jb3VudGVyID0gMDsgLyogVGhpcyB3aWxsIHN0b3AgdGhlIHJlcGVhdCAqLworICAgICAgfQorCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICAvKiBOb3QgZXhoYXVzdGl2ZSAtIGNob29zZSBhbiBlbmNvZGluZyBhdCByYW5kb207IGdlbmVyYXRlIGEgbnVtYmVyIGluCisgICAgICAgICAgKiB0aGUgcmFuZ2UgMS4uKG1heC0xKSwgc28gdGhlIHJlc3VsdCBpcyBhbHdheXMgbm9uLXplcm86CisgICAgICAgICAgKi8KKyAgICAgICAgIGlmIChwbS0+ZW5jb2RpbmdfY291bnRlciA9PSAwKQorICAgICAgICAgICAgcG0tPmVuY29kaW5nX2NvdW50ZXIgPSByYW5kb21fbW9kKG1vZGlmaWVyX3RvdGFsX2VuY29kaW5ncyhwbSktMSkrMTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBtLT5lbmNvZGluZ19jb3VudGVyID0gMDsKKyAgICAgIH0KKworICAgICAgaWYgKHBtLT5lbmNvZGluZ19jb3VudGVyID4gMCkKKyAgICAgICAgIHBtLT5yZXBlYXQgPSAxOworICAgfQorCisgICBlbHNlIGlmICghcG0tPnJlcGVhdCkKKyAgICAgIHBtLT5lbmNvZGluZ19jb3VudGVyID0gMDsKK30KKworc3RhdGljIHZvaWQKK21vZGlmaWVyX3Jlc2V0KHBuZ19tb2RpZmllciAqcG0pCit7CisgICBzdG9yZV9yZWFkX3Jlc2V0KCZwbS0+dGhpcyk7CisgICBwbS0+bGltaXQgPSA0RS0zOworICAgcG0tPnBlbmRpbmdfbGVuID0gcG0tPnBlbmRpbmdfY2h1bmsgPSAwOworICAgcG0tPmZsdXNoID0gcG0tPmJ1ZmZlcl9jb3VudCA9IHBtLT5idWZmZXJfcG9zaXRpb24gPSAwOworICAgcG0tPm1vZGlmaWNhdGlvbnMgPSBOVUxMOworICAgcG0tPnN0YXRlID0gbW9kaWZpZXJfc3RhcnQ7CisgICBtb2RpZmllcl9lbmNvZGluZ19pdGVyYXRlKHBtKTsKKyAgIC8qIFRoZSBmb2xsb3dpbmcgbXVzdCBiZSBzZXQgaW4gdGhlIG5leHQgcnVuLiAgSW4gcGFydGljdWxhcgorICAgICogdGVzdF91c2VzX2VuY29kaW5ncyBtdXN0IGJlIHNldCBpbiB0aGUgX2luaSBmdW5jdGlvbiBvZiBlYWNoIHRyYW5zZm9ybQorICAgICogdGhhdCBsb29rcyBhdCB0aGUgZW5jb2RpbmdzLiAgKE5vdCB0aGUgJ2FkZCcgZnVuY3Rpb24hKQorICAgICovCisgICBwbS0+dGVzdF91c2VzX2VuY29kaW5nID0gMDsKKyAgIHBtLT5jdXJyZW50X2dhbW1hID0gMDsKKyAgIHBtLT5jdXJyZW50X2VuY29kaW5nID0gMDsKKyAgIHBtLT5lbmNvZGluZ19pZ25vcmVkID0gMDsKKyAgIC8qIFRoZXNlIG9ubHkgYmVjb21lIHZhbHVlIGFmdGVyIElIRFIgaXMgcmVhZDogKi8KKyAgIHBtLT5iaXRfZGVwdGggPSBwbS0+Y29sb3VyX3R5cGUgPSAwOworfQorCisvKiBUaGUgZm9sbG93aW5nIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnl0aGluZyBlbHNlIHRvIGdldCB0aGUgZW5jb2Rpbmcgc2V0IHVwCisgKiBvbiB0aGUgbW9kaWZpZXIuICBJbiBwYXJ0aWN1bGFyIGl0IG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgdHJhbnNmb3JtIGluaXQKKyAqIGZ1bmN0aW9ucyBhcmUgY2FsbGVkLgorICovCitzdGF0aWMgdm9pZAorbW9kaWZpZXJfc2V0X2VuY29kaW5nKHBuZ19tb2RpZmllciAqcG0pCit7CisgICAvKiBTZXQgdGhlIGVuY29kaW5nIHRvIHRoZSBvbmUgc3BlY2lmaWVkIGJ5IHRoZSBjdXJyZW50IGVuY29kaW5nIGNvdW50ZXIsCisgICAgKiBmaXJzdCBjbGVhciBvdXQgYWxsIHRoZSBzZXR0aW5ncyAtIHRoaXMgY29ycmVzcG9uZHMgdG8gYW4gZW5jb2RpbmdfY291bnRlcgorICAgICogb2YgMC4KKyAgICAqLworICAgcG0tPmN1cnJlbnRfZ2FtbWEgPSAwOworICAgcG0tPmN1cnJlbnRfZW5jb2RpbmcgPSAwOworICAgcG0tPmVuY29kaW5nX2lnbm9yZWQgPSAwOyAvKiBub3QgaWdub3JlZCB5ZXQgLSBoYXBwZW5zIGluIF9pbmkgZnVuY3Rpb25zLiAqLworCisgICAvKiBOb3csIGlmIHJlcXVpcmVkLCBzZXQgdGhlIGdhbW1hIGFuZCBlbmNvZGluZyBmaWVsZHMuICovCisgICBpZiAocG0tPmVuY29kaW5nX2NvdW50ZXIgPiAwKQorICAgeworICAgICAgLyogVGhlIGdhbW1hc1tdIGFycmF5IGlzIGFuIGFycmF5IG9mIHNjcmVlbiBnYW1tYXMsIG5vdCBlbmNvZGluZyBnYW1tYXMsCisgICAgICAgKiBzbyB3ZSBuZWVkIHRoZSBpbnZlcnNlOgorICAgICAgICovCisgICAgICBpZiAocG0tPmVuY29kaW5nX2NvdW50ZXIgPD0gcG0tPm5nYW1tYXMpCisgICAgICAgICBwbS0+Y3VycmVudF9nYW1tYSA9IDEvcG0tPmdhbW1hc1twbS0+ZW5jb2RpbmdfY291bnRlci0xXTsKKworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgdW5zaWduZWQgaW50IGkgPSBwbS0+ZW5jb2RpbmdfY291bnRlciAtIHBtLT5uZ2FtbWFzOworCisgICAgICAgICBpZiAoaSA+PSBwbS0+bmVuY29kaW5ncykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGkgJT0gcG0tPm5lbmNvZGluZ3M7CisgICAgICAgICAgICBwbS0+Y3VycmVudF9nYW1tYSA9IDE7IC8qIExpbmVhciwgb25seSBpbiB0aGUgMTYgYml0IGNhc2UgKi8KKyAgICAgICAgIH0KKworICAgICAgICAgZWxzZQorICAgICAgICAgICAgcG0tPmN1cnJlbnRfZ2FtbWEgPSBwbS0+ZW5jb2RpbmdzW2ldLmdhbW1hOworCisgICAgICAgICBwbS0+Y3VycmVudF9lbmNvZGluZyA9IHBtLT5lbmNvZGluZ3MgKyBpOworICAgICAgfQorICAgfQorfQorCisvKiBFbnF1aXJ5IGZ1bmN0aW9ucyB0byBmaW5kIG91dCB3aGF0IGlzIHNldC4gIE5vdGljZSB0aGF0IHRoZXJlIGlzIGFuIGltcGxpY2l0CisgKiBhc3N1bXB0aW9uIGJlbG93IHRoYXQgdGhlIGZpcnN0IGVuY29kaW5nIGluIHRoZSBsaXN0IGlzIHRoZSBvbmUgZm9yIHNSR0IuCisgKi8KK3N0YXRpYyBpbnQKK21vZGlmaWVyX2NvbG9yX2VuY29kaW5nX2lzX3NSR0IoY29uc3QgcG5nX21vZGlmaWVyICpwbSkKK3sKKyAgIHJldHVybiBwbS0+Y3VycmVudF9lbmNvZGluZyAhPSAwICYmIHBtLT5jdXJyZW50X2VuY29kaW5nID09IHBtLT5lbmNvZGluZ3MgJiYKKyAgICAgIHBtLT5jdXJyZW50X2VuY29kaW5nLT5nYW1tYSA9PSBwbS0+Y3VycmVudF9nYW1tYTsKK30KKworc3RhdGljIGludAorbW9kaWZpZXJfY29sb3JfZW5jb2RpbmdfaXNfc2V0KGNvbnN0IHBuZ19tb2RpZmllciAqcG0pCit7CisgICByZXR1cm4gcG0tPmN1cnJlbnRfZ2FtbWEgIT0gMDsKK30KKworLyogQ29udmVuaWVuY2UgbWFjcm9zLiAqLworI2RlZmluZSBDSFVOSyhhLGIsYyxkKSAoKChhKTw8MjQpKygoYik8PDE2KSsoKGMpPDw4KSsoZCkpCisjZGVmaW5lIENIVU5LX0lIRFIgQ0hVTksoNzMsNzIsNjgsODIpCisjZGVmaW5lIENIVU5LX1BMVEUgQ0hVTksoODAsNzYsODQsNjkpCisjZGVmaW5lIENIVU5LX0lEQVQgQ0hVTksoNzMsNjgsNjUsODQpCisjZGVmaW5lIENIVU5LX0lFTkQgQ0hVTksoNzMsNjksNzgsNjgpCisjZGVmaW5lIENIVU5LX2NIUk0gQ0hVTksoOTksNzIsODIsNzcpCisjZGVmaW5lIENIVU5LX2dBTUEgQ0hVTksoMTAzLDY1LDc3LDY1KQorI2RlZmluZSBDSFVOS19zQklUIENIVU5LKDExNSw2Niw3Myw4NCkKKyNkZWZpbmUgQ0hVTktfc1JHQiBDSFVOSygxMTUsODIsNzEsNjYpCisKKy8qIFRoZSBndXRzIG9mIG1vZGlmaWNhdGlvbiBhcmUgcGVyZm9ybWVkIGR1cmluZyBhIHJlYWQuICovCitzdGF0aWMgdm9pZAorbW9kaWZpZXJfY3JjKHBuZ19ieXRlcCBidWZmZXIpCit7CisgICAvKiBSZWNhbGN1bGF0ZSB0aGUgY2h1bmsgQ1JDIC0gYSBjb21wbGV0ZSBjaHVuayBtdXN0IGJlIGluCisgICAgKiB0aGUgYnVmZmVyLCBhdCB0aGUgc3RhcnQuCisgICAgKi8KKyAgIHVJbnQgZGF0YWxlbiA9IHBuZ19nZXRfdWludF8zMihidWZmZXIpOworICAgdUxvbmcgY3JjID0gY3JjMzIoMCwgYnVmZmVyKzQsIGRhdGFsZW4rNCk7CisgICAvKiBUaGUgY2FzdCB0byBwbmdfdWludF8zMiBpcyBzYWZlIGJlY2F1c2UgYSBjcmMzMiBpcyBhbHdheXMgYSAzMiBiaXQgdmFsdWUuCisgICAgKi8KKyAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmZmVyK2RhdGFsZW4rOCwgKHBuZ191aW50XzMyKWNyYyk7Cit9CisKK3N0YXRpYyB2b2lkCittb2RpZmllcl9zZXRidWZmZXIocG5nX21vZGlmaWVyICpwbSkKK3sKKyAgIG1vZGlmaWVyX2NyYyhwbS0+YnVmZmVyKTsKKyAgIHBtLT5idWZmZXJfY291bnQgPSBwbmdfZ2V0X3VpbnRfMzIocG0tPmJ1ZmZlcikrMTI7CisgICBwbS0+YnVmZmVyX3Bvc2l0aW9uID0gMDsKK30KKworLyogU2VwYXJhdGUgdGhlIGNhbGxiYWNrIGludG8gdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiAod2hpY2ggaXMgcGFzc2VkIHRoZQorICogcG5nX21vZGlmaWVyIGV4cGxpY2l0bHkpIGFuZCB0aGUgY2FsbGJhY2ssIHdoaWNoIGdldHMgdGhlIG1vZGlmaWVyIGZyb20gdGhlCisgKiBwbmdfc3RydWN0LgorICovCitzdGF0aWMgdm9pZAorbW9kaWZpZXJfcmVhZF9pbXAocG5nX21vZGlmaWVyICpwbSwgcG5nX2J5dGVwIHBiLCBwbmdfc2l6ZV90IHN0KQoreworICAgd2hpbGUgKHN0ID4gMCkKKyAgIHsKKyAgICAgIHNpemVfdCBjYjsKKyAgICAgIHBuZ191aW50XzMyIGxlbiwgY2h1bms7CisgICAgICBwbmdfbW9kaWZpY2F0aW9uICptb2Q7CisKKyAgICAgIGlmIChwbS0+YnVmZmVyX3Bvc2l0aW9uID49IHBtLT5idWZmZXJfY291bnQpIHN3aXRjaCAocG0tPnN0YXRlKQorICAgICAgeworICAgICAgICAgc3RhdGljIHBuZ19ieXRlIHNpZ25bOF0gPSB7IDEzNywgODAsIDc4LCA3MSwgMTMsIDEwLCAyNiwgMTAgfTsKKyAgICAgICAgIGNhc2UgbW9kaWZpZXJfc3RhcnQ6CisgICAgICAgICAgICBzdG9yZV9yZWFkX2ltcCgmcG0tPnRoaXMsIHBtLT5idWZmZXIsIDgpOyAvKiBzaXplIG9mIHNpZ25hdHVyZS4gKi8KKyAgICAgICAgICAgIHBtLT5idWZmZXJfY291bnQgPSA4OworICAgICAgICAgICAgcG0tPmJ1ZmZlcl9wb3NpdGlvbiA9IDA7CisKKyAgICAgICAgICAgIGlmIChtZW1jbXAocG0tPmJ1ZmZlciwgc2lnbiwgOCkgIT0gMCkKKyAgICAgICAgICAgICAgIHBuZ19lcnJvcihwbS0+dGhpcy5wcmVhZCwgImludmFsaWQgUE5HIGZpbGUgc2lnbmF0dXJlIik7CisgICAgICAgICAgICBwbS0+c3RhdGUgPSBtb2RpZmllcl9zaWduYXR1cmU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSBtb2RpZmllcl9zaWduYXR1cmU6CisgICAgICAgICAgICBzdG9yZV9yZWFkX2ltcCgmcG0tPnRoaXMsIHBtLT5idWZmZXIsIDEzKzEyKTsgLyogc2l6ZSBvZiBJSERSICovCisgICAgICAgICAgICBwbS0+YnVmZmVyX2NvdW50ID0gMTMrMTI7CisgICAgICAgICAgICBwbS0+YnVmZmVyX3Bvc2l0aW9uID0gMDsKKworICAgICAgICAgICAgaWYgKHBuZ19nZXRfdWludF8zMihwbS0+YnVmZmVyKSAhPSAxMyB8fAorICAgICAgICAgICAgICAgIHBuZ19nZXRfdWludF8zMihwbS0+YnVmZmVyKzQpICE9IENIVU5LX0lIRFIpCisgICAgICAgICAgICAgICBwbmdfZXJyb3IocG0tPnRoaXMucHJlYWQsICJpbnZhbGlkIElIRFIiKTsKKworICAgICAgICAgICAgLyogQ2hlY2sgdGhlIGxpc3Qgb2YgbW9kaWZpZXJzIGZvciBtb2RpZmljYXRpb25zIHRvIHRoZSBJSERSLiAqLworICAgICAgICAgICAgbW9kID0gcG0tPm1vZGlmaWNhdGlvbnM7CisgICAgICAgICAgICB3aGlsZSAobW9kICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZiAobW9kLT5jaHVuayA9PSBDSFVOS19JSERSICYmIG1vZC0+bW9kaWZ5X2ZuICYmCisgICAgICAgICAgICAgICAgICAgKCptb2QtPm1vZGlmeV9mbikocG0sIG1vZCwgMCkpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBtb2QtPm1vZGlmaWVkID0gMTsKKyAgICAgICAgICAgICAgICAgIG1vZGlmaWVyX3NldGJ1ZmZlcihwbSk7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIC8qIElnbm9yZSByZW1vdmFsIG9yIGFkZCBpZiBJSERSISAqLworICAgICAgICAgICAgICAgbW9kID0gbW9kLT5uZXh0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBDYWNoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBJSERSICh0aGUgbW9kaWZpZWQgb25lLikgKi8KKyAgICAgICAgICAgIHBtLT5iaXRfZGVwdGggPSBwbS0+YnVmZmVyWzgrOF07CisgICAgICAgICAgICBwbS0+Y29sb3VyX3R5cGUgPSBwbS0+YnVmZmVyWzgrOCsxXTsKKworICAgICAgICAgICAgcG0tPnN0YXRlID0gbW9kaWZpZXJfSUhEUjsKKyAgICAgICAgICAgIHBtLT5mbHVzaCA9IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSBtb2RpZmllcl9JSERSOgorICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8qIFJlYWQgYSBuZXcgY2h1bmsgYW5kIHByb2Nlc3MgaXQgdW50aWwgd2Ugc2VlIFBMVEUsIElEQVQgb3IKKyAgICAgICAgICAgICAqIElFTkQuICAnZmx1c2gnIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIHN0aWxsIHNvbWUgZGF0YSB0bworICAgICAgICAgICAgICogb3V0cHV0IGZyb20gdGhlIHByZWNlZGluZyBjaHVuay4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKChjYiA9IHBtLT5mbHVzaCkgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKGNiID4gc3QpIGNiID0gc3Q7CisgICAgICAgICAgICAgICBwbS0+Zmx1c2ggLT0gY2I7CisgICAgICAgICAgICAgICBzdG9yZV9yZWFkX2ltcCgmcG0tPnRoaXMsIHBiLCBjYik7CisgICAgICAgICAgICAgICBwYiArPSBjYjsKKyAgICAgICAgICAgICAgIHN0IC09IGNiOworICAgICAgICAgICAgICAgaWYgKHN0ID09IDApIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogTm8gbW9yZSBieXRlcyB0byBmbHVzaCwgcmVhZCBhIGhlYWRlciwgb3IgaGFuZGxlIGEgcGVuZGluZworICAgICAgICAgICAgICogY2h1bmsuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwbS0+cGVuZGluZ19jaHVuayAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX3NhdmVfdWludF8zMihwbS0+YnVmZmVyLCBwbS0+cGVuZGluZ19sZW4pOworICAgICAgICAgICAgICAgcG5nX3NhdmVfdWludF8zMihwbS0+YnVmZmVyKzQsIHBtLT5wZW5kaW5nX2NodW5rKTsKKyAgICAgICAgICAgICAgIHBtLT5wZW5kaW5nX2xlbiA9IDA7CisgICAgICAgICAgICAgICBwbS0+cGVuZGluZ19jaHVuayA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICBzdG9yZV9yZWFkX2ltcCgmcG0tPnRoaXMsIHBtLT5idWZmZXIsIDgpOworCisgICAgICAgICAgICBwbS0+YnVmZmVyX2NvdW50ID0gODsKKyAgICAgICAgICAgIHBtLT5idWZmZXJfcG9zaXRpb24gPSAwOworCisgICAgICAgICAgICAvKiBDaGVjayBmb3Igc29tZXRoaW5nIHRvIG1vZGlmeSBvciBhIHRlcm1pbmF0b3IgY2h1bmsuICovCisgICAgICAgICAgICBsZW4gPSBwbmdfZ2V0X3VpbnRfMzIocG0tPmJ1ZmZlcik7CisgICAgICAgICAgICBjaHVuayA9IHBuZ19nZXRfdWludF8zMihwbS0+YnVmZmVyKzQpOworCisgICAgICAgICAgICAvKiBUZXJtaW5hdG9ycyBmaXJzdCwgdGhleSBtYXkgaGF2ZSB0byBiZSBkZWxheWVkIGZvciBhZGRlZAorICAgICAgICAgICAgICogY2h1bmtzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChjaHVuayA9PSBDSFVOS19QTFRFIHx8IGNodW5rID09IENIVU5LX0lEQVQgfHwKKyAgICAgICAgICAgICAgICBjaHVuayA9PSBDSFVOS19JRU5EKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgbW9kID0gcG0tPm1vZGlmaWNhdGlvbnM7CisKKyAgICAgICAgICAgICAgIHdoaWxlIChtb2QgIT0gTlVMTCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICgobW9kLT5hZGQgPT0gY2h1bmsgfHwKKyAgICAgICAgICAgICAgICAgICAgICAobW9kLT5hZGQgPT0gQ0hVTktfUExURSAmJiBjaHVuayA9PSBDSFVOS19JREFUKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICBtb2QtPm1vZGlmeV9mbiAhPSBOVUxMICYmICFtb2QtPm1vZGlmaWVkICYmICFtb2QtPmFkZGVkKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgLyogUmVnYXJkbGVzcyBvZiB3aGF0IHRoZSBtb2RpZnkgZnVuY3Rpb24gZG9lcyBkbyBub3QgcnVuCisgICAgICAgICAgICAgICAgICAgICAgKiB0aGlzIGFnYWluLgorICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICBtb2QtPmFkZGVkID0gMTsKKworICAgICAgICAgICAgICAgICAgICAgaWYgKCgqbW9kLT5tb2RpZnlfZm4pKHBtLCBtb2QsIDEgLyphZGQqLykpCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCB0aGUgQ1JDIG9uIGEgbmV3IGNodW5rICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG0tPmJ1ZmZlcl9jb3VudCA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllcl9zZXRidWZmZXIocG0pOworCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBwbS0+YnVmZmVyX3Bvc2l0aW9uID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZC0+cmVtb3ZlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBidWZmZXIgaGFzIGJlZW4gZmlsbGVkIHdpdGggc29tZXRoaW5nICh3ZSBhc3N1bWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBzbyBvdXRwdXQgdGhpcy4gIFBlbmQgdGhlIGN1cnJlbnQgY2h1bmsuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBtLT5wZW5kaW5nX2xlbiA9IGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBtLT5wZW5kaW5nX2NodW5rID0gY2h1bms7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLyogb3V0IG9mIHdoaWxlICovCisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIG1vZCA9IG1vZC0+bmV4dDsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgLyogRG9uJ3QgZG8gYW55IGZ1cnRoZXIgcHJvY2Vzc2luZyBpZiB0aGUgYnVmZmVyIHdhcyBtb2RpZmllZCAtCisgICAgICAgICAgICAgICAgKiBvdGhlcndpc2UgdGhlIGNvZGUgd2lsbCBlbmQgdXAgbW9kaWZ5aW5nIGEgY2h1bmsgdGhhdCB3YXMKKyAgICAgICAgICAgICAgICAqIGp1c3QgYWRkZWQuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIGlmIChtb2QgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBvdXQgb2Ygc3dpdGNoICovCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIElmIHdlIGdldCB0byBoZXJlIHRoZW4gdGhpcyBjaHVuayBtYXkgbmVlZCB0byBiZSBtb2RpZmllZC4gIFRvCisgICAgICAgICAgICAgKiBkbyB0aGlzIGl0IG11c3QgYmUgbGVzcyB0aGFuIDEwMjQgYnl0ZXMgaW4gdG90YWwgc2l6ZSwgb3RoZXJ3aXNlCisgICAgICAgICAgICAgKiBpdCBqdXN0IGdldHMgZmx1c2hlZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKGxlbisxMiA8PSBzaXplb2YgcG0tPmJ1ZmZlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHN0b3JlX3JlYWRfaW1wKCZwbS0+dGhpcywgcG0tPmJ1ZmZlcitwbS0+YnVmZmVyX2NvdW50LAorICAgICAgICAgICAgICAgICAgIGxlbisxMi1wbS0+YnVmZmVyX2NvdW50KTsKKyAgICAgICAgICAgICAgIHBtLT5idWZmZXJfY291bnQgPSBsZW4rMTI7CisKKyAgICAgICAgICAgICAgIC8qIENoZWNrIGZvciBhIG1vZGlmaWNhdGlvbiwgZWxzZSBsZWF2ZSBpdCBiZS4gKi8KKyAgICAgICAgICAgICAgIG1vZCA9IHBtLT5tb2RpZmljYXRpb25zOworICAgICAgICAgICAgICAgd2hpbGUgKG1vZCAhPSBOVUxMKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKG1vZC0+Y2h1bmsgPT0gY2h1bmspCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBpZiAobW9kLT5tb2RpZnlfZm4gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlbW92ZSB0aGlzIGNodW5rICovCisgICAgICAgICAgICAgICAgICAgICAgICBwbS0+YnVmZmVyX2NvdW50ID0gcG0tPmJ1ZmZlcl9wb3NpdGlvbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBtb2QtPnJlbW92ZWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8qIFRlcm1pbmF0ZSB0aGUgd2hpbGUgbG9vcCAqLworICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoKm1vZC0+bW9kaWZ5X2ZuKShwbSwgbW9kLCAwKSkKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZC0+bW9kaWZpZWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGNodW5rIG1heSBoYXZlIGJlZW4gcmVtb3ZlZDogKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbS0+YnVmZmVyX2NvdW50ID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBwbS0+YnVmZmVyX3Bvc2l0aW9uID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXJfc2V0YnVmZmVyKHBtKTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgbW9kID0gbW9kLT5uZXh0OworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICBwbS0+Zmx1c2ggPSBsZW4rMTIgLSBwbS0+YnVmZmVyX2NvdW50OyAvKiBkYXRhICsgY3JjICovCisKKyAgICAgICAgICAgIC8qIFRha2UgdGhlIGRhdGEgZnJvbSB0aGUgYnVmZmVyIChpZiB0aGVyZSBpcyBhbnkpLiAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8qIEhlcmUgdG8gcmVhZCBmcm9tIHRoZSBtb2RpZmllciBidWZmZXIgKG5vdCBkaXJlY3RseSBmcm9tCisgICAgICAgKiB0aGUgc3RvcmUsIGFzIGluIHRoZSBmbHVzaCBjYXNlIGFib3ZlLikKKyAgICAgICAqLworICAgICAgY2IgPSBwbS0+YnVmZmVyX2NvdW50IC0gcG0tPmJ1ZmZlcl9wb3NpdGlvbjsKKworICAgICAgaWYgKGNiID4gc3QpCisgICAgICAgICBjYiA9IHN0OworCisgICAgICBtZW1jcHkocGIsIHBtLT5idWZmZXIgKyBwbS0+YnVmZmVyX3Bvc2l0aW9uLCBjYik7CisgICAgICBzdCAtPSBjYjsKKyAgICAgIHBiICs9IGNiOworICAgICAgcG0tPmJ1ZmZlcl9wb3NpdGlvbiArPSBjYjsKKyAgIH0KK30KKworLyogVGhlIGNhbGxiYWNrOiAqLworc3RhdGljIHZvaWQgUE5HQ0JBUEkKK21vZGlmaWVyX3JlYWQocG5nX3N0cnVjdHAgcHBJbiwgcG5nX2J5dGVwIHBiLCBwbmdfc2l6ZV90IHN0KQoreworICAgcG5nX2NvbnN0X3N0cnVjdHAgcHAgPSBwcEluOworICAgcG5nX21vZGlmaWVyICpwbSA9IHZvaWRjYXN0KHBuZ19tb2RpZmllciosIHBuZ19nZXRfaW9fcHRyKHBwKSk7CisKKyAgIGlmIChwbSA9PSBOVUxMIHx8IHBtLT50aGlzLnByZWFkICE9IHBwKQorICAgICAgcG5nX2Vycm9yKHBwLCAiYmFkIG1vZGlmaWVyX3JlYWQgY2FsbCIpOworCisgICBtb2RpZmllcl9yZWFkX2ltcChwbSwgcGIsIHN0KTsKK30KKworLyogTGlrZSBzdG9yZV9wcm9ncmVzc2l2ZV9yZWFkIGJ1dCB0aGUgZGF0YSBpcyBnZXR0aW5nIGNoYW5nZWQgYXMgd2UgZ28gc28gd2UKKyAqIG5lZWQgYSBsb2NhbCBidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkCittb2RpZmllcl9wcm9ncmVzc2l2ZV9yZWFkKHBuZ19tb2RpZmllciAqcG0sIHBuZ19zdHJ1Y3RwIHBwLCBwbmdfaW5mb3AgcGkpCit7CisgICBpZiAocG0tPnRoaXMucHJlYWQgIT0gcHAgfHwgcG0tPnRoaXMuY3VycmVudCA9PSBOVUxMIHx8CisgICAgICAgcG0tPnRoaXMubmV4dCA9PSBOVUxMKQorICAgICAgcG5nX2Vycm9yKHBwLCAic3RvcmUgc3RhdGUgZGFtYWdlZCAocHJvZ3Jlc3NpdmUpIik7CisKKyAgIC8qIFRoaXMgaXMgYW5vdGhlciBIb3Jvd2l0eiBhbmQgSGlsbCByYW5kb20gbm9pc2UgZ2VuZXJhdG9yLiAgSW4gdGhpcyBjYXNlCisgICAgKiB0aGUgYWltIGlzIHRvIHN0cmVzcyB0aGUgcHJvZ3Jlc3NpdmUgcmVhZGVyIHdpdGggdHJ1bHkgaG9ycmlibGUgdmFyaWFibGUKKyAgICAqIGJ1ZmZlciBzaXplcyBpbiB0aGUgcmFuZ2UgMS4uNTAwLCBzbyBhIHNlcXVlbmNlIG9mIDkgYml0IHJhbmRvbSBudW1iZXJzCisgICAgKiBpcyBnZW5lcmF0ZWQuICBXZSBjb3VsZCBwcm9iYWJseSBqdXN0IGNvdW50IGZyb20gMSB0byAzMjc2NyBhbmQgZ2V0IGFzCisgICAgKiBnb29kIGEgcmVzdWx0LgorICAgICovCisgICBmb3IgKDs7KQorICAgeworICAgICAgc3RhdGljIHBuZ191aW50XzMyIG5vaXNlID0gMTsKKyAgICAgIHBuZ19zaXplX3QgY2IsIGNiQXZhaWw7CisgICAgICBwbmdfYnl0ZSBidWZmZXJbNTEyXTsKKworICAgICAgLyogR2VuZXJhdGUgMTUgbW9yZSBiaXRzIG9mIHN0dWZmOiAqLworICAgICAgbm9pc2UgPSAobm9pc2UgPDwgOSkgfCAoKG5vaXNlIF4gKG5vaXNlID4+ICg5LTUpKSkgJiAweDFmZik7CisgICAgICBjYiA9IG5vaXNlICYgMHgxZmY7CisKKyAgICAgIC8qIENoZWNrIHRoYXQgdGhpcyBudW1iZXIgb2YgYnl0ZXMgYXJlIGF2YWlsYWJsZSAoaW4gdGhlIGN1cnJlbnQgYnVmZmVyLikKKyAgICAgICAqIChUaGlzIGRvZXNuJ3QgcXVpdGUgd29yayAtIHRoZSBtb2RpZmllciBtaWdodCBkZWxldGUgYSBjaHVuazsgdW5saWtlbHkKKyAgICAgICAqIGJ1dCBwb3NzaWJsZSwgaXQgZG9lc24ndCBoYXBwZW4gYXQgcHJlc2VudCBiZWNhdXNlIHRoZSBtb2RpZmllciBvbmx5CisgICAgICAgKiBhZGRzIGNodW5rcyB0byBzdGFuZGFyZCBpbWFnZXMuKQorICAgICAgICovCisgICAgICBjYkF2YWlsID0gc3RvcmVfcmVhZF9idWZmZXJfYXZhaWwoJnBtLT50aGlzKTsKKyAgICAgIGlmIChwbS0+YnVmZmVyX2NvdW50ID4gcG0tPmJ1ZmZlcl9wb3NpdGlvbikKKyAgICAgICAgIGNiQXZhaWwgKz0gcG0tPmJ1ZmZlcl9jb3VudCAtIHBtLT5idWZmZXJfcG9zaXRpb247CisKKyAgICAgIGlmIChjYiA+IGNiQXZhaWwpCisgICAgICB7CisgICAgICAgICAvKiBDaGVjayBmb3IgRU9GOiAqLworICAgICAgICAgaWYgKGNiQXZhaWwgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYiA9IGNiQXZhaWw7CisgICAgICB9CisKKyAgICAgIG1vZGlmaWVyX3JlYWRfaW1wKHBtLCBidWZmZXIsIGNiKTsKKyAgICAgIHBuZ19wcm9jZXNzX2RhdGEocHAsIHBpLCBidWZmZXIsIGNiKTsKKyAgIH0KKworICAgLyogQ2hlY2sgdGhlIGludmFyaWFudHMgYXQgdGhlIGVuZCAoaWYgdGhpcyBmYWlscyBpdCdzIGEgcHJvYmxlbSBpbiB0aGlzCisgICAgKiBmaWxlISkKKyAgICAqLworICAgaWYgKHBtLT5idWZmZXJfY291bnQgPiBwbS0+YnVmZmVyX3Bvc2l0aW9uIHx8CisgICAgICAgcG0tPnRoaXMubmV4dCAhPSAmcG0tPnRoaXMuY3VycmVudC0+ZGF0YSB8fAorICAgICAgIHBtLT50aGlzLnJlYWRwb3MgPCBwbS0+dGhpcy5jdXJyZW50LT5kYXRhY291bnQpCisgICAgICBwbmdfZXJyb3IocHAsICJwcm9ncmVzc2l2ZSByZWFkIGltcGxlbWVudGF0aW9uIGVycm9yIik7Cit9CisKKy8qIFNldCB1cCBhIG1vZGlmaWVyLiAqLworc3RhdGljIHBuZ19zdHJ1Y3RwCitzZXRfbW9kaWZpZXJfZm9yX3JlYWQocG5nX21vZGlmaWVyICpwbSwgcG5nX2luZm9wcCBwcGksIHBuZ191aW50XzMyIGlkLAorICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAvKiBEbyB0aGlzIGZpcnN0IHNvIHRoYXQgdGhlIG1vZGlmaWVyIGZpZWxkcyBhcmUgY2xlYXJlZCBldmVuIGlmIGFuIGVycm9yCisgICAgKiBoYXBwZW5zIGFsbG9jYXRpbmcgdGhlIHBuZ19zdHJ1Y3QuICBObyBhbGxvY2F0aW9uIGlzIGRvbmUgaGVyZSBzbyBubworICAgICogY2xlYW51cCBpcyByZXF1aXJlZC4KKyAgICAqLworICAgcG0tPnN0YXRlID0gbW9kaWZpZXJfc3RhcnQ7CisgICBwbS0+Yml0X2RlcHRoID0gMDsKKyAgIHBtLT5jb2xvdXJfdHlwZSA9IDI1NTsKKworICAgcG0tPnBlbmRpbmdfbGVuID0gMDsKKyAgIHBtLT5wZW5kaW5nX2NodW5rID0gMDsKKyAgIHBtLT5mbHVzaCA9IDA7CisgICBwbS0+YnVmZmVyX2NvdW50ID0gMDsKKyAgIHBtLT5idWZmZXJfcG9zaXRpb24gPSAwOworCisgICByZXR1cm4gc2V0X3N0b3JlX2Zvcl9yZWFkKCZwbS0+dGhpcywgcHBpLCBpZCwgbmFtZSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1PRElGSUNBVElPTlMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFN0YW5kYXJkIG1vZGlmaWNhdGlvbnMgdG8gYWRkIGNodW5rcy4gIFRoZXNlIGRvIG5vdCByZXF1aXJlIHRoZSBfU1VQUE9SVEVECisgKiBtYWNyb3MgYmVjYXVzZSB0aGUgY2h1bmtzIGNhbiBiZSB0aGVyZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhpcyBzcGVjaWZpYworICogbGlicG5nIHN1cHBvcnRzIHRoZW0uCisgKi8KK3R5cGVkZWYgc3RydWN0IGdhbWFfbW9kaWZpY2F0aW9uCit7CisgICBwbmdfbW9kaWZpY2F0aW9uIHRoaXM7CisgICBwbmdfZml4ZWRfcG9pbnQgIGdhbW1hOworfSBnYW1hX21vZGlmaWNhdGlvbjsKKworc3RhdGljIGludAorZ2FtYV9tb2RpZnkocG5nX21vZGlmaWVyICpwbSwgcG5nX21vZGlmaWNhdGlvbiAqbWUsIGludCBhZGQpCit7CisgICBVTlVTRUQoYWRkKQorICAgLyogVGhpcyBzaW1wbHkgZHVtcHMgdGhlIGdpdmVuIGdhbW1hIHZhbHVlIGludG8gdGhlIGJ1ZmZlci4gKi8KKyAgIHBuZ19zYXZlX3VpbnRfMzIocG0tPmJ1ZmZlciwgNCk7CisgICBwbmdfc2F2ZV91aW50XzMyKHBtLT5idWZmZXIrNCwgQ0hVTktfZ0FNQSk7CisgICBwbmdfc2F2ZV91aW50XzMyKHBtLT5idWZmZXIrOCwgKChnYW1hX21vZGlmaWNhdGlvbiopbWUpLT5nYW1tYSk7CisgICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK2dhbWFfbW9kaWZpY2F0aW9uX2luaXQoZ2FtYV9tb2RpZmljYXRpb24gKm1lLCBwbmdfbW9kaWZpZXIgKnBtLCBkb3VibGUgZ2FtbWFkKQoreworICAgZG91YmxlIGc7CisKKyAgIG1vZGlmaWNhdGlvbl9pbml0KCZtZS0+dGhpcyk7CisgICBtZS0+dGhpcy5jaHVuayA9IENIVU5LX2dBTUE7CisgICBtZS0+dGhpcy5tb2RpZnlfZm4gPSBnYW1hX21vZGlmeTsKKyAgIG1lLT50aGlzLmFkZCA9IENIVU5LX1BMVEU7CisgICBnID0gZml4KGdhbW1hZCk7CisgICBtZS0+Z2FtbWEgPSAocG5nX2ZpeGVkX3BvaW50KWc7CisgICBtZS0+dGhpcy5uZXh0ID0gcG0tPm1vZGlmaWNhdGlvbnM7CisgICBwbS0+bW9kaWZpY2F0aW9ucyA9ICZtZS0+dGhpczsKK30KKwordHlwZWRlZiBzdHJ1Y3QgY2hybV9tb2RpZmljYXRpb24KK3sKKyAgIHBuZ19tb2RpZmljYXRpb24gICAgICAgICAgdGhpczsKKyAgIGNvbnN0IGNvbG9yX2VuY29kaW5nICplbmNvZGluZzsKKyAgIHBuZ19maXhlZF9wb2ludCAgICAgICAgICAgd3gsIHd5LCByeCwgcnksIGd4LCBneSwgYngsIGJ5OworfSBjaHJtX21vZGlmaWNhdGlvbjsKKworc3RhdGljIGludAorY2hybV9tb2RpZnkocG5nX21vZGlmaWVyICpwbSwgcG5nX21vZGlmaWNhdGlvbiAqbWUsIGludCBhZGQpCit7CisgICBVTlVTRUQoYWRkKQorICAgLyogQXMgd2l0aCBnQU1BIHRoaXMganVzdCBhZGRzIHRoZSByZXF1aXJlZCBjSFJNIGNodW5rIHRvIHRoZSBidWZmZXIuICovCisgICBwbmdfc2F2ZV91aW50XzMyKHBtLT5idWZmZXIgICAsIDMyKTsKKyAgIHBuZ19zYXZlX3VpbnRfMzIocG0tPmJ1ZmZlcisgNCwgQ0hVTktfY0hSTSk7CisgICBwbmdfc2F2ZV91aW50XzMyKHBtLT5idWZmZXIrIDgsICgoY2hybV9tb2RpZmljYXRpb24qKW1lKS0+d3gpOworICAgcG5nX3NhdmVfdWludF8zMihwbS0+YnVmZmVyKzEyLCAoKGNocm1fbW9kaWZpY2F0aW9uKiltZSktPnd5KTsKKyAgIHBuZ19zYXZlX3VpbnRfMzIocG0tPmJ1ZmZlcisxNiwgKChjaHJtX21vZGlmaWNhdGlvbiopbWUpLT5yeCk7CisgICBwbmdfc2F2ZV91aW50XzMyKHBtLT5idWZmZXIrMjAsICgoY2hybV9tb2RpZmljYXRpb24qKW1lKS0+cnkpOworICAgcG5nX3NhdmVfdWludF8zMihwbS0+YnVmZmVyKzI0LCAoKGNocm1fbW9kaWZpY2F0aW9uKiltZSktPmd4KTsKKyAgIHBuZ19zYXZlX3VpbnRfMzIocG0tPmJ1ZmZlcisyOCwgKChjaHJtX21vZGlmaWNhdGlvbiopbWUpLT5neSk7CisgICBwbmdfc2F2ZV91aW50XzMyKHBtLT5idWZmZXIrMzIsICgoY2hybV9tb2RpZmljYXRpb24qKW1lKS0+YngpOworICAgcG5nX3NhdmVfdWludF8zMihwbS0+YnVmZmVyKzM2LCAoKGNocm1fbW9kaWZpY2F0aW9uKiltZSktPmJ5KTsKKyAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorY2hybV9tb2RpZmljYXRpb25faW5pdChjaHJtX21vZGlmaWNhdGlvbiAqbWUsIHBuZ19tb2RpZmllciAqcG0sCisgICBjb25zdCBjb2xvcl9lbmNvZGluZyAqZW5jb2RpbmcpCit7CisgICBDSUVfY29sb3Igd2hpdGUgPSB3aGl0ZV9wb2ludChlbmNvZGluZyk7CisKKyAgIC8qIE9yaWdpbmFsIGVuZCBwb2ludHM6ICovCisgICBtZS0+ZW5jb2RpbmcgPSBlbmNvZGluZzsKKworICAgLyogQ2hyb21hdGljaXRpZXMgKGluIGZpeGVkIHBvaW50KTogKi8KKyAgIG1lLT53eCA9IGZpeChjaHJvbWF0aWNpdHlfeCh3aGl0ZSkpOworICAgbWUtPnd5ID0gZml4KGNocm9tYXRpY2l0eV95KHdoaXRlKSk7CisKKyAgIG1lLT5yeCA9IGZpeChjaHJvbWF0aWNpdHlfeChlbmNvZGluZy0+cmVkKSk7CisgICBtZS0+cnkgPSBmaXgoY2hyb21hdGljaXR5X3koZW5jb2RpbmctPnJlZCkpOworICAgbWUtPmd4ID0gZml4KGNocm9tYXRpY2l0eV94KGVuY29kaW5nLT5ncmVlbikpOworICAgbWUtPmd5ID0gZml4KGNocm9tYXRpY2l0eV95KGVuY29kaW5nLT5ncmVlbikpOworICAgbWUtPmJ4ID0gZml4KGNocm9tYXRpY2l0eV94KGVuY29kaW5nLT5ibHVlKSk7CisgICBtZS0+YnkgPSBmaXgoY2hyb21hdGljaXR5X3koZW5jb2RpbmctPmJsdWUpKTsKKworICAgbW9kaWZpY2F0aW9uX2luaXQoJm1lLT50aGlzKTsKKyAgIG1lLT50aGlzLmNodW5rID0gQ0hVTktfY0hSTTsKKyAgIG1lLT50aGlzLm1vZGlmeV9mbiA9IGNocm1fbW9kaWZ5OworICAgbWUtPnRoaXMuYWRkID0gQ0hVTktfUExURTsKKyAgIG1lLT50aGlzLm5leHQgPSBwbS0+bW9kaWZpY2F0aW9uczsKKyAgIHBtLT5tb2RpZmljYXRpb25zID0gJm1lLT50aGlzOworfQorCit0eXBlZGVmIHN0cnVjdCBzcmdiX21vZGlmaWNhdGlvbgoreworICAgcG5nX21vZGlmaWNhdGlvbiB0aGlzOworICAgcG5nX2J5dGUgICAgICAgICBpbnRlbnQ7Cit9IHNyZ2JfbW9kaWZpY2F0aW9uOworCitzdGF0aWMgaW50CitzcmdiX21vZGlmeShwbmdfbW9kaWZpZXIgKnBtLCBwbmdfbW9kaWZpY2F0aW9uICptZSwgaW50IGFkZCkKK3sKKyAgIFVOVVNFRChhZGQpCisgICAvKiBBcyBhYm92ZSwgaWdub3JlIGFkZCBhbmQganVzdCBtYWtlIGEgbmV3IGNodW5rICovCisgICBwbmdfc2F2ZV91aW50XzMyKHBtLT5idWZmZXIsIDEpOworICAgcG5nX3NhdmVfdWludF8zMihwbS0+YnVmZmVyKzQsIENIVU5LX3NSR0IpOworICAgcG0tPmJ1ZmZlcls4XSA9ICgoc3JnYl9tb2RpZmljYXRpb24qKW1lKS0+aW50ZW50OworICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCitzcmdiX21vZGlmaWNhdGlvbl9pbml0KHNyZ2JfbW9kaWZpY2F0aW9uICptZSwgcG5nX21vZGlmaWVyICpwbSwgcG5nX2J5dGUgaW50ZW50KQoreworICAgbW9kaWZpY2F0aW9uX2luaXQoJm1lLT50aGlzKTsKKyAgIG1lLT50aGlzLmNodW5rID0gQ0hVTktfc0JJVDsKKworICAgaWYgKGludGVudCA8PSAzKSAvKiBpZiB2YWxpZCwgZWxzZSAqZGVsZXRlKiBzUkdCIGNodW5rcyAqLworICAgeworICAgICAgbWUtPnRoaXMubW9kaWZ5X2ZuID0gc3JnYl9tb2RpZnk7CisgICAgICBtZS0+dGhpcy5hZGQgPSBDSFVOS19QTFRFOworICAgICAgbWUtPmludGVudCA9IGludGVudDsKKyAgIH0KKworICAgZWxzZQorICAgeworICAgICAgbWUtPnRoaXMubW9kaWZ5X2ZuID0gMDsKKyAgICAgIG1lLT50aGlzLmFkZCA9IDA7CisgICAgICBtZS0+aW50ZW50ID0gMDsKKyAgIH0KKworICAgbWUtPnRoaXMubmV4dCA9IHBtLT5tb2RpZmljYXRpb25zOworICAgcG0tPm1vZGlmaWNhdGlvbnMgPSAmbWUtPnRoaXM7Cit9CisKKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKK3R5cGVkZWYgc3RydWN0IHNiaXRfbW9kaWZpY2F0aW9uCit7CisgICBwbmdfbW9kaWZpY2F0aW9uIHRoaXM7CisgICBwbmdfYnl0ZSAgICAgICAgIHNiaXQ7Cit9IHNiaXRfbW9kaWZpY2F0aW9uOworCitzdGF0aWMgaW50CitzYml0X21vZGlmeShwbmdfbW9kaWZpZXIgKnBtLCBwbmdfbW9kaWZpY2F0aW9uICptZSwgaW50IGFkZCkKK3sKKyAgIHBuZ19ieXRlIHNiaXQgPSAoKHNiaXRfbW9kaWZpY2F0aW9uKiltZSktPnNiaXQ7CisgICBpZiAocG0tPmJpdF9kZXB0aCA+IHNiaXQpCisgICB7CisgICAgICBpbnQgY2IgPSAwOworICAgICAgc3dpdGNoIChwbS0+Y29sb3VyX3R5cGUpCisgICAgICB7CisgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBjYiA9IDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSAyOgorICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgY2IgPSAzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGNiID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBjYiA9IDQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHBuZ19lcnJvcihwbS0+dGhpcy5wcmVhZCwKKyAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIGNvbG91ciB0eXBlIGluIHNCSVQgbW9kaWZpY2F0aW9uIik7CisgICAgICB9CisKKyAgICAgIHBuZ19zYXZlX3VpbnRfMzIocG0tPmJ1ZmZlciwgY2IpOworICAgICAgcG5nX3NhdmVfdWludF8zMihwbS0+YnVmZmVyKzQsIENIVU5LX3NCSVQpOworCisgICAgICB3aGlsZSAoY2IgPiAwKQorICAgICAgICAgKHBtLT5idWZmZXIrOClbLS1jYl0gPSBzYml0OworCisgICAgICByZXR1cm4gMTsKKyAgIH0KKyAgIGVsc2UgaWYgKCFhZGQpCisgICB7CisgICAgICAvKiBSZW1vdmUgdGhlIHNCSVQgY2h1bmsgKi8KKyAgICAgIHBtLT5idWZmZXJfY291bnQgPSBwbS0+YnVmZmVyX3Bvc2l0aW9uID0gMDsKKyAgICAgIHJldHVybiAxOworICAgfQorICAgZWxzZQorICAgICAgcmV0dXJuIDA7IC8qIGRvIG5vdGhpbmcgKi8KK30KKworc3RhdGljIHZvaWQKK3NiaXRfbW9kaWZpY2F0aW9uX2luaXQoc2JpdF9tb2RpZmljYXRpb24gKm1lLCBwbmdfbW9kaWZpZXIgKnBtLCBwbmdfYnl0ZSBzYml0KQoreworICAgbW9kaWZpY2F0aW9uX2luaXQoJm1lLT50aGlzKTsKKyAgIG1lLT50aGlzLmNodW5rID0gQ0hVTktfc0JJVDsKKyAgIG1lLT50aGlzLm1vZGlmeV9mbiA9IHNiaXRfbW9kaWZ5OworICAgbWUtPnRoaXMuYWRkID0gQ0hVTktfUExURTsKKyAgIG1lLT5zYml0ID0gc2JpdDsKKyAgIG1lLT50aGlzLm5leHQgPSBwbS0+bW9kaWZpY2F0aW9uczsKKyAgIHBtLT5tb2RpZmljYXRpb25zID0gJm1lLT50aGlzOworfQorI2VuZGlmIC8qIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCAqLworI2VuZGlmIC8qIFBOR19SRUFEX1RSQU5TRk9STVNfU1VQUE9SVEVEICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTVEFOREFSRCBQTkcgRklMRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBTdGFuZGFyZCBmaWxlcyAtIHdyaXRlIGFuZCBzYXZlIHN0YW5kYXJkIGZpbGVzLiAqLworLyogVGhlcmUgYXJlIHR3byBiYXNpYyBmb3JtcyBvZiBzdGFuZGFyZCBpbWFnZXMuICBUaG9zZSB3aGljaCBhdHRlbXB0IHRvIGhhdmUKKyAqIGFsbCB0aGUgcG9zc2libGUgcGl4ZWwgdmFsdWVzIChub3QgcG9zc2libGUgZm9yIDE2YnBwIGltYWdlcywgYnV0IGEgcmFuZ2Ugb2YKKyAqIHZhbHVlcyBhcmUgcHJvZHVjZWQpIGFuZCB0aG9zZSB3aGljaCBoYXZlIGEgcmFuZ2Ugb2YgaW1hZ2Ugc2l6ZXMuICBUaGUgZm9ybWVyCisgKiBhcmUgdXNlZCBmb3IgdGVzdGluZyB0cmFuc2Zvcm1zLCBpbiBwYXJ0aWN1bGFyIGdhbW1hIGNvcnJlY3Rpb24gYW5kIGJpdAorICogcmVkdWN0aW9uIGFuZCBpbmNyZWFzZS4gIFRoZSBsYXR0ZXIgYXJlIHJlc2VydmVkIGZvciB0ZXN0aW5nIHRoZSBiZWhhdmlvciBvZgorICogbGlicG5nIHdpdGggcmVzcGVjdCB0byAnb2RkJyBpbWFnZSBzaXplcyAtIHBhcnRpY3VsYXJseSBzbWFsbCBpbWFnZXMgd2hlcmUKKyAqIHJvd3MgYmVjb21lIDEgYnl0ZSBhbmQgaW50ZXJsYWNlIHBhc3NlcyBkaXNhcHBlYXIuCisgKgorICogVGhlIGZpcnN0LCBtb3N0IHVzZWZ1bCwgc2V0IGFyZSB0aGUgJ3RyYW5zZm9ybScgaW1hZ2VzLCB0aGUgc2Vjb25kIHNldCBvZgorICogc21hbGwgaW1hZ2VzIGFyZSB0aGUgJ3NpemUnIGltYWdlcy4KKyAqCisgKiBUaGUgdHJhbnNmb3JtIGZpbGVzIGFyZSBjb25zdHJ1Y3RlZCB3aXRoIHJvd3Mgd2hpY2ggZml0IGludG8gYSAxMDI0IGJ5dGUgcm93CisgKiBidWZmZXIuICBUaGlzIG1ha2VzIGFsbG9jYXRpb24gZWFzaWVyIGJlbG93LiAgRnVydGhlciByZWdhcmRsZXNzIG9mIHRoZSBmaWxlCisgKiBmb3JtYXQgZXZlcnkgcm93IGhhcyAxMjggcGl4ZWxzIChnaXZpbmcgMTAyNCBieXRlcyBmb3IgNjRicHAgZm9ybWF0cykuCisgKgorICogRmlsZXMgYXJlIHN0b3JlZCB3aXRoIG5vIGdBTUEgb3Igc0JJVCBjaHVua3MsIHdpdGggYSBQTFRFIG9ubHkgd2hlbiBuZWVkZWQKKyAqIGFuZCB3aXRoIGFuIElEIGRlcml2ZWQgZnJvbSB0aGUgY29sb3VyIHR5cGUsIGJpdCBkZXB0aCBhbmQgaW50ZXJsYWNlIHR5cGUKKyAqIGFzIGFib3ZlIChGSUxFSUQpLiAgVGhlIHdpZHRoICgxMjgpIGFuZCBoZWlnaHQgKHZhcmlhYmxlKSBhcmUgbm90IHN0b3JlZCBpbgorICogdGhlIEZJTEVJRCAtIGluc3RlYWQgdGhlIGZpZWxkcyBhcmUgc2V0IHRvIDAsIGluZGljYXRpbmcgYSB0cmFuc2Zvcm0gZmlsZS4KKyAqCisgKiBUaGUgc2l6ZSBmaWxlcyBhciBjb25zdHJ1Y3RlZCB3aXRoIHJvd3MgYSBtYXhpbXVtIG9mIDEyOCBieXRlcyB3aWRlLCBhbGxvd2luZworICogYSBtYXhpbXVtIHdpZHRoIG9mIDE2IHBpeGVscyAoZm9yIHRoZSA2NGJwcCBjYXNlLikgIFRoZXkgYWxzbyBoYXZlIGEgbWF4aW11bQorICogaGVpZ2h0IG9mIDE2IHJvd3MuICBUaGUgd2lkdGggYW5kIGhlaWdodCBhcmUgc3RvcmVkIGluIHRoZSBGSUxFSUQgYW5kLCBiZWluZworICogbm9uLXplcm8sIGluZGljYXRlIGEgc2l6ZSBmaWxlLgorICoKKyAqIEJlY2F1c2UgdGhlIFBORyBmaWx0ZXIgY29kZSBpcyB0eXBpY2FsbHkgdGhlIGxhcmdlc3QgQ1BVIGNvbnN1bWVyIHdpdGhpbgorICogbGlicG5nIGl0c2VsZiB0aGVyZSBpcyBhIHRlbmRlbmN5IHRvIGF0dGVtcHQgdG8gb3B0aW1pemUgaXQuICBUaGlzIHJlc3VsdHMgaW4KKyAqIHNwZWNpYWwgY2FzZSBjb2RlIHdoaWNoIG5lZWRzIHRvIGJlIHZhbGlkYXRlZC4gIFRvIGNhdXNlIHRoaXMgdG8gaGFwcGVuIHRoZQorICogJ3NpemUnIGltYWdlcyBhcmUgbWFkZSB0byB1c2UgZWFjaCBwb3NzaWJsZSBmaWx0ZXIsIGluIHNvIGZhciBhcyB0aGlzIGlzCisgKiBwb3NzaWJsZSBmb3Igc21hbGxlciBpbWFnZXMuCisgKgorICogRm9yIHBhbGV0dGUgaW1hZ2UgKGNvbG91ciB0eXBlIDMpIG11bHRpcGxlIHRyYW5zZm9ybSBpbWFnZXMgYXJlIHN0b3JlZCB3aXRoCisgKiB0aGUgc2FtZSBiaXQgZGVwdGggdG8gYWxsb3cgdGVzdGluZyBvZiBtb3JlIGNvbG91ciBjb21iaW5hdGlvbnMgLQorICogcGFydGljdWxhcmx5IGltcG9ydGFudCBmb3IgdGVzdGluZyB0aGUgZ2FtbWEgY29kZSBiZWNhdXNlIGxpYnBuZyB1c2VzIGEKKyAqIGRpZmZlcmVudCBjb2RlIHBhdGggZm9yIHBhbGV0dGUgaW1hZ2VzLiAgRm9yIHNpemUgaW1hZ2VzIGEgc2luZ2xlIHBhbGV0dGUgaXMKKyAqIHVzZWQuCisgKi8KKworLyogTWFrZSBhICdzdGFuZGFyZCcgcGFsZXR0ZS4gIEJlY2F1c2UgdGhlcmUgYXJlIG9ubHkgMjU2IGVudHJpZXMgaW4gYSBwYWxldHRlCisgKiAobWF4aW11bSkgdGhpcyBhY3R1YWxseSBtYWtlcyBhIHJhbmRvbSBwYWxldHRlIGluIHRoZSBob3BlIHRoYXQgZW5vdWdoIHRlc3RzCisgKiB3aWxsIGNhdGNoIGVub3VnaCBlcnJvcnMuICAoTm90ZSB0aGF0IHRoZSBzYW1lIHBhbGV0dGUgaXNuJ3QgcHJvZHVjZWQgZXZlcnkKKyAqIHRpbWUgZm9yIHRoZSBzYW1lIHRlc3QgLSBpdCBkZXBlbmRzIG9uIHdoYXQgcHJldmlvdXMgdGVzdHMgaGF2ZSBiZWVuIHJ1biAtCisgKiBidXQgYSBnaXZlbiBzZXQgb2YgYXJndW1lbnRzIHRvIHBuZ3ZhbGlkIHdpbGwgYWx3YXlzIHByb2R1Y2UgdGhlIHNhbWUgcGFsZXR0ZQorICogYXQgdGhlIHNhbWUgdGVzdCEgIFRoaXMgaXMgd2h5IHBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvcnMgYXJlIHVzZWZ1bCBmb3IKKyAqIHRlc3RpbmcuKQorICoKKyAqIFRoZSBzdG9yZSBtdXN0IGJlIG9wZW4gZm9yIHdyaXRlIHdoZW4gdGhpcyBpcyBjYWxsZWQsIG90aGVyd2lzZSBhbiBpbnRlcm5hbAorICogZXJyb3Igd2lsbCBvY2N1ci4gIFRoaXMgcm91dGluZSBjb250YWlucyBpdHMgb3duIG1hZ2ljIG51bWJlciBzZWVkLCBzbyB0aGUKKyAqIHBhbGV0dGVzIGdlbmVyYXRlZCBkb24ndCBjaGFuZ2UgaWYgdGhlcmUgYXJlIGludGVydmVuaW5nIGVycm9ycyAoY2hhbmdpbmcgdGhlCisgKiBjYWxscyB0byB0aGUgc3RvcmVfbWFyayBzZWVkLikKKyAqLworc3RhdGljIHN0b3JlX3BhbGV0dGVfZW50cnkgKgorbWFrZV9zdGFuZGFyZF9wYWxldHRlKHBuZ19zdG9yZSogcHMsIGludCBucGFsZXR0ZSwgaW50IGRvX3RSTlMpCit7CisgICBzdGF0aWMgcG5nX3VpbnRfMzIgcGFsZXR0ZV9zZWVkWzJdID0geyAweDg3NjU0MzIxLCA5IH07CisKKyAgIGludCBpID0gMDsKKyAgIHBuZ19ieXRlIHZhbHVlc1syNTZdWzRdOworCisgICAvKiBBbHdheXMgcHV0IGluIGJsYWNrIGFuZCB3aGl0ZSBwbHVzIHRoZSBzaXggcHJpbWFyeSBhbmQgc2Vjb25kYXJ5IGNvbG9ycy4KKyAgICAqLworICAgZm9yICg7IGk8ODsgKytpKQorICAgeworICAgICAgdmFsdWVzW2ldWzFdID0gKHBuZ19ieXRlKSgoaSYxKSA/IDI1NVUgOiAwVSk7CisgICAgICB2YWx1ZXNbaV1bMl0gPSAocG5nX2J5dGUpKChpJjIpID8gMjU1VSA6IDBVKTsKKyAgICAgIHZhbHVlc1tpXVszXSA9IChwbmdfYnl0ZSkoKGkmNCkgPyAyNTVVIDogMFUpOworICAgfQorCisgICAvKiBUaGVuIGFkZCA2MiBncmF5cyAob25lIHF1YXJ0ZXIgb2YgdGhlIHJlbWFpbmluZyAyNTYgc2xvdHMpLiAqLworICAgeworICAgICAgaW50IGogPSAwOworICAgICAgcG5nX2J5dGUgcmFuZG9tX2J5dGVzWzRdOworICAgICAgcG5nX2J5dGUgbmVlZFsyNTZdOworCisgICAgICBuZWVkWzBdID0gMDsgLypnb3QgYmxhY2sqLworICAgICAgbWVtc2V0KG5lZWQrMSwgMSwgKHNpemVvZiBuZWVkKS0yKTsgLypuZWVkIHRoZXNlKi8KKyAgICAgIG5lZWRbMjU1XSA9IDA7IC8qYnV0IG5vdCB3aGl0ZSovCisKKyAgICAgIHdoaWxlIChpPDcwKQorICAgICAgeworICAgICAgICAgcG5nX2J5dGUgYjsKKworICAgICAgICAgaWYgKGo9PTApCisgICAgICAgICB7CisgICAgICAgICAgICBtYWtlX2ZvdXJfcmFuZG9tX2J5dGVzKHBhbGV0dGVfc2VlZCwgcmFuZG9tX2J5dGVzKTsKKyAgICAgICAgICAgIGogPSA0OworICAgICAgICAgfQorCisgICAgICAgICBiID0gcmFuZG9tX2J5dGVzWy0tal07CisgICAgICAgICBpZiAobmVlZFtiXSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHZhbHVlc1tpXVsxXSA9IGI7CisgICAgICAgICAgICB2YWx1ZXNbaV1bMl0gPSBiOworICAgICAgICAgICAgdmFsdWVzW2krK11bM10gPSBiOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICAvKiBGaW5hbGx5IGFkZCAxOTIgY29sb3JzIGF0IHJhbmRvbSAtIGRvbid0IHdvcnJ5IGFib3V0IG1hdGNoZXMgdG8gdGhpbmdzIHdlCisgICAgKiBhbHJlYWR5IGhhdmUsIGNoYW5jZSBpcyBsZXNzIHRoYW4gMS82NTUzNi4gIERvbid0IHdvcnJ5IGFib3V0IGdyYXlzLAorICAgICogY2hhbmNlIGlzIHRoZSBzYW1lLCBzbyB3ZSBnZXQgYSBkdXBsaWNhdGUgb3IgZXh0cmEgZ3JheSBsZXNzIHRoYW4gMSB0aW1lCisgICAgKiBpbiAxNzAuCisgICAgKi8KKyAgIGZvciAoOyBpPDI1NjsgKytpKQorICAgICAgbWFrZV9mb3VyX3JhbmRvbV9ieXRlcyhwYWxldHRlX3NlZWQsIHZhbHVlc1tpXSk7CisKKyAgIC8qIEZpbGwgaW4gdGhlIGFscGhhIHZhbHVlcyBpbiB0aGUgZmlyc3QgYnl0ZS4gIEp1c3QgdXNlIGFsbCBwb3NzaWJsZSB2YWx1ZXMKKyAgICAqICgwLi4yNTUpIGluIGFuIGFwcGFyZW50bHkgcmFuZG9tIG9yZGVyOgorICAgICovCisgICB7CisgICAgICBzdG9yZV9wYWxldHRlX2VudHJ5ICpwYWxldHRlOworICAgICAgcG5nX2J5dGUgc2VsZWN0b3JbNF07CisKKyAgICAgIG1ha2VfZm91cl9yYW5kb21fYnl0ZXMocGFsZXR0ZV9zZWVkLCBzZWxlY3Rvcik7CisKKyAgICAgIGlmIChkb190Uk5TKQorICAgICAgICAgZm9yIChpPTA7IGk8MjU2OyArK2kpCisgICAgICAgICAgICB2YWx1ZXNbaV1bMF0gPSAocG5nX2J5dGUpKGkgXiBzZWxlY3RvclswXSk7CisKKyAgICAgIGVsc2UKKyAgICAgICAgIGZvciAoaT0wOyBpPDI1NjsgKytpKQorICAgICAgICAgICAgdmFsdWVzW2ldWzBdID0gMjU1OyAvKiBubyB0cmFuc3BhcmVuY3kvdFJOUyBjaHVuayAqLworCisgICAgICAvKiAndmFsdWVzJyBjb250YWlucyAyNTYgQVJHQiB2YWx1ZXMsIGJ1dCB3ZSBvbmx5IG5lZWQgJ25wYWxldHRlJy4KKyAgICAgICAqICducGFsZXR0ZScgd2lsbCBhbHdheXMgYmUgYSBwb3dlciBvZiAyOiAyLCA0LCAxNiBvciAyNTYuICBJbiB0aGUgbG93CisgICAgICAgKiBiaXQgZGVwdGggY2FzZXMgc2VsZWN0IGNvbG9ycyBhdCByYW5kb20sIGVsc2UgaXQgaXMgZGlmZmljdWx0IHRvIGhhdmUKKyAgICAgICAqIGEgc2V0IG9mIGxvdyBiaXQgZGVwdGggcGFsZXR0ZSB0ZXN0IHdpdGggYW55IGNoYW5jZSBvZiBhIHJlYXNvbmFibGUKKyAgICAgICAqIHJhbmdlIG9mIGNvbG9ycy4gIERvIHRoaXMgYnkgcmFuZG9tbHkgcGVybXV0aW5nIHZhbHVlcyBpbnRvIHRoZSBsb3cKKyAgICAgICAqICducGFsZXR0ZScgZW50cmllcyB1c2luZyBhbiBYT1IgbWFzayBnZW5lcmF0ZWQgaGVyZS4gIFRoaXMgYWxzbworICAgICAgICogcGVybXV0ZXMgdGhlIG5wYWxldHRlID09IDI1NiBjYXNlIGluIGEgcG90ZW50aWFsbHkgdXNlZnVsIHdheSAodGhlcmUgaXMKKyAgICAgICAqIG5vIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHBhbGV0dGUgaW5kZXggYW5kIHRoZSBjb2xvciB2YWx1ZSB0aGVyZWluISkKKyAgICAgICAqLworICAgICAgcGFsZXR0ZSA9IHN0b3JlX3dyaXRlX3BhbGV0dGUocHMsIG5wYWxldHRlKTsKKworICAgICAgZm9yIChpPTA7IGk8bnBhbGV0dGU7ICsraSkKKyAgICAgIHsKKyAgICAgICAgIHBhbGV0dGVbaV0uYWxwaGEgPSB2YWx1ZXNbaSBeIHNlbGVjdG9yWzFdXVswXTsKKyAgICAgICAgIHBhbGV0dGVbaV0ucmVkICAgPSB2YWx1ZXNbaSBeIHNlbGVjdG9yWzFdXVsxXTsKKyAgICAgICAgIHBhbGV0dGVbaV0uZ3JlZW4gPSB2YWx1ZXNbaSBeIHNlbGVjdG9yWzFdXVsyXTsKKyAgICAgICAgIHBhbGV0dGVbaV0uYmx1ZSAgPSB2YWx1ZXNbaSBeIHNlbGVjdG9yWzFdXVszXTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHBhbGV0dGU7CisgICB9Cit9CisKKy8qIEluaXRpYWxpemUgYSBzdGFuZGFyZCBwYWxldHRlIG9uIGEgd3JpdGUgc3RyZWFtLiAgVGhlICdkb190Uk5TJyBhcmd1bWVudAorICogaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIGFsc28gc2V0IHRoZSB0Uk5TIGNodW5rLgorICovCisvKiBUT0RPOiB0aGUgcG5nX3N0cnVjdHAgaGVyZSBjYW4gcHJvYmFibHkgYmUgJ2NvbnN0JyBpbiB0aGUgZnV0dXJlICovCitzdGF0aWMgdm9pZAoraW5pdF9zdGFuZGFyZF9wYWxldHRlKHBuZ19zdG9yZSAqcHMsIHBuZ19zdHJ1Y3RwIHBwLCBwbmdfaW5mb3AgcGksIGludCBucGFsZXR0ZSwKKyAgIGludCBkb190Uk5TKQoreworICAgc3RvcmVfcGFsZXR0ZV9lbnRyeSAqcHBhbCA9IG1ha2Vfc3RhbmRhcmRfcGFsZXR0ZShwcywgbnBhbGV0dGUsIGRvX3RSTlMpOworCisgICB7CisgICAgICBpbnQgaTsKKyAgICAgIHBuZ19jb2xvciBwYWxldHRlWzI1Nl07CisKKyAgICAgIC8qIFNldCBhbGwgZW50cmllcyB0byBkZXRlY3Qgb3ZlcnJlYWQgZXJyb3JzLiAqLworICAgICAgZm9yIChpPTA7IGk8bnBhbGV0dGU7ICsraSkKKyAgICAgIHsKKyAgICAgICAgIHBhbGV0dGVbaV0ucmVkID0gcHBhbFtpXS5yZWQ7CisgICAgICAgICBwYWxldHRlW2ldLmdyZWVuID0gcHBhbFtpXS5ncmVlbjsKKyAgICAgICAgIHBhbGV0dGVbaV0uYmx1ZSA9IHBwYWxbaV0uYmx1ZTsKKyAgICAgIH0KKworICAgICAgLyogSnVzdCBpbiBjYXNlIGZpbGwgaW4gdGhlIHJlc3Qgd2l0aCBkZXRlY3RhYmxlIHZhbHVlczogKi8KKyAgICAgIGZvciAoOyBpPDI1NjsgKytpKQorICAgICAgICAgcGFsZXR0ZVtpXS5yZWQgPSBwYWxldHRlW2ldLmdyZWVuID0gcGFsZXR0ZVtpXS5ibHVlID0gNDI7CisKKyAgICAgIHBuZ19zZXRfUExURShwcCwgcGksIHBhbGV0dGUsIG5wYWxldHRlKTsKKyAgIH0KKworICAgaWYgKGRvX3RSTlMpCisgICB7CisgICAgICBpbnQgaSwgajsKKyAgICAgIHBuZ19ieXRlIHRSTlNbMjU2XTsKKworICAgICAgLyogU2V0IGFsbCB0aGUgZW50cmllcywgYnV0IHNraXAgdHJhaWxpbmcgb3BhcXVlIGVudHJpZXMgKi8KKyAgICAgIGZvciAoaT1qPTA7IGk8bnBhbGV0dGU7ICsraSkKKyAgICAgICAgIGlmICgodFJOU1tpXSA9IHBwYWxbaV0uYWxwaGEpIDwgMjU1KQorICAgICAgICAgICAgaiA9IGkrMTsKKworICAgICAgLyogRmlsbCBpbiB0aGUgcmVtYWluZGVyIHdpdGggYSBkZXRlY3RhYmxlIHZhbHVlOiAqLworICAgICAgZm9yICg7IGk8MjU2OyArK2kpCisgICAgICAgICB0Uk5TW2ldID0gMjQ7CisKKyMgICAgIGlmZGVmIFBOR19XUklURV90Uk5TX1NVUFBPUlRFRAorICAgICAgICAgaWYgKGogPiAwKQorICAgICAgICAgICAgcG5nX3NldF90Uk5TKHBwLCBwaSwgdFJOUywgaiwgMC8qY29sb3IqLyk7CisjICAgICBlbmRpZgorICAgfQorfQorCisjaWZkZWYgUE5HX1dSSVRFX3RSTlNfU1VQUE9SVEVECitzdGF0aWMgdm9pZAorc2V0X3JhbmRvbV90Uk5TKHBuZ19zdHJ1Y3RwIHBwLCBwbmdfaW5mb3AgcGksIGNvbnN0IHBuZ19ieXRlIGNvbG91cl90eXBlLAorICAgY29uc3QgaW50IGJpdF9kZXB0aCkKK3sKKyAgIC8qIFRvIG1ha2UgdGhpcyB1c2VmdWwgdGhlIHRSTlMgY29sb3IgbmVlZHMgdG8gbWF0Y2ggYXQgbGVhc3Qgb25lIHBpeGVsLgorICAgICogUmFuZG9tIHZhbHVlcyBhcmUgZmluZSBmb3IgZ3JheSwgaW5jbHVkaW5nIHRoZSAxNi1iaXQgY2FzZSB3aGVyZSB3ZSBrbm93CisgICAgKiB0aGF0IHRoZSB0ZXN0IGltYWdlIGNvbnRhaW5zIGFsbCB0aGUgZ3JheSB2YWx1ZXMuICBGb3IgUkdCIHdlIG5lZWQgbW9yZQorICAgICogbWV0aG9kIGFzIG9ubHkgNjU1MzYgZGlmZmVyZW50IFJHQiB2YWx1ZXMgYXJlIGdlbmVyYXRlZC4KKyAgICAqLworICAgcG5nX2NvbG9yXzE2IHRSTlM7CisgICBjb25zdCBwbmdfdWludF8xNiBtYXNrID0gKHBuZ191aW50XzE2KSgoMVUgPDwgYml0X2RlcHRoKS0xKTsKKworICAgUkFORE9NSVpFKHRSTlMpOworCisgICBpZiAoY29sb3VyX3R5cGUgJiAyLypSR0IqLykKKyAgIHsKKyAgICAgIGlmIChiaXRfZGVwdGggPT0gOCkKKyAgICAgIHsKKyAgICAgICAgIHRSTlMuYmx1ZSA9IHRSTlMucmVkIF4gdFJOUy5ncmVlbjsKKyAgICAgICAgIHRSTlMucmVkICY9IG1hc2s7CisgICAgICAgICB0Uk5TLmdyZWVuICY9IG1hc2s7CisgICAgICAgICB0Uk5TLmJsdWUgJj0gbWFzazsKKyAgICAgIH0KKworICAgICAgZWxzZSAvKiBiaXRfZGVwdGggPT0gMTYgKi8KKyAgICAgIHsKKyAgICAgICAgIHRSTlMuZ3JlZW4gPSAocG5nX3VpbnRfMTYpKHRSTlMucmVkICogMjU3KTsKKyAgICAgICAgIHRSTlMuYmx1ZSA9IChwbmdfdWludF8xNikodFJOUy5ncmVlbiAqIDE3KTsKKyAgICAgIH0KKyAgIH0KKworICAgZWxzZQorICAgICAgdFJOUy5ncmF5ICY9IG1hc2s7CisKKyAgIHBuZ19zZXRfdFJOUyhwcCwgcGksIE5VTEwsIDAsICZ0Uk5TKTsKK30KKyNlbmRpZgorCisvKiBUaGUgbnVtYmVyIG9mIHBhc3NlcyBpcyByZWxhdGVkIHRvIHRoZSBpbnRlcmxhY2UgdHlwZS4gVGhlcmUgd2FzIG5vIGxpYnBuZworICogQVBJIHRvIGRldGVybWluZSB0aGlzIHByaW9yIHRvIDEuNSwgc28gd2UgbmVlZCBhbiBpbnF1aXJ5IGZ1bmN0aW9uOgorICovCitzdGF0aWMgaW50CitucGFzc2VzX2Zyb21faW50ZXJsYWNlX3R5cGUocG5nX2NvbnN0X3N0cnVjdHAgcHAsIGludCBpbnRlcmxhY2VfdHlwZSkKK3sKKyAgIHN3aXRjaCAoaW50ZXJsYWNlX3R5cGUpCisgICB7CisgICBkZWZhdWx0OgorICAgICAgcG5nX2Vycm9yKHBwLCAiaW52YWxpZCBpbnRlcmxhY2UgdHlwZSIpOworCisgICBjYXNlIFBOR19JTlRFUkxBQ0VfTk9ORToKKyAgICAgIHJldHVybiAxOworCisgICBjYXNlIFBOR19JTlRFUkxBQ0VfQURBTTc6CisgICAgICByZXR1cm4gUE5HX0lOVEVSTEFDRV9BREFNN19QQVNTRVM7CisgICB9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2JpdF9zaXplKHBuZ19jb25zdF9zdHJ1Y3RwIHBwLCBwbmdfYnl0ZSBjb2xvdXJfdHlwZSwgcG5nX2J5dGUgYml0X2RlcHRoKQoreworICAgc3dpdGNoIChjb2xvdXJfdHlwZSkKKyAgIHsKKyAgICAgIGRlZmF1bHQ6IHBuZ19lcnJvcihwcCwgImludmFsaWQgY29sb3IgdHlwZSIpOworCisgICAgICBjYXNlIDA6ICByZXR1cm4gYml0X2RlcHRoOworCisgICAgICBjYXNlIDI6ICByZXR1cm4gMypiaXRfZGVwdGg7CisKKyAgICAgIGNhc2UgMzogIHJldHVybiBiaXRfZGVwdGg7CisKKyAgICAgIGNhc2UgNDogIHJldHVybiAyKmJpdF9kZXB0aDsKKworICAgICAgY2FzZSA2OiAgcmV0dXJuIDQqYml0X2RlcHRoOworICAgfQorfQorCisjZGVmaW5lIFRSQU5TRk9STV9XSURUSCAgMTI4VQorI2RlZmluZSBUUkFOU0ZPUk1fUk9XTUFYIChUUkFOU0ZPUk1fV0lEVEgqOFUpCisjZGVmaW5lIFNJWkVfUk9XTUFYICgxNio4VSkgLyogMTYgcGl4ZWxzLCBtYXggOCBieXRlcyBlYWNoIC0gMTI4IGJ5dGVzICovCisjZGVmaW5lIFNUQU5EQVJEX1JPV01BWCBUUkFOU0ZPUk1fUk9XTUFYIC8qIFRoZSBsYXJnZXIgb2YgdGhlIHR3byAqLworI2RlZmluZSBTSVpFX0hFSUdIVE1BWCAxNiAvKiBNYXhpbXVtIHJhbmdlIG9mIHNpemUgaW1hZ2VzICovCisKK3N0YXRpYyBzaXplX3QKK3RyYW5zZm9ybV9yb3dzaXplKHBuZ19jb25zdF9zdHJ1Y3RwIHBwLCBwbmdfYnl0ZSBjb2xvdXJfdHlwZSwKKyAgIHBuZ19ieXRlIGJpdF9kZXB0aCkKK3sKKyAgIHJldHVybiAoVFJBTlNGT1JNX1dJRFRIICogYml0X3NpemUocHAsIGNvbG91cl90eXBlLCBiaXRfZGVwdGgpKSAvIDg7Cit9CisKKy8qIHRyYW5zZm9ybV93aWR0aChwcCwgY29sb3VyX3R5cGUsIGJpdF9kZXB0aCkgY3VycmVudCByZXR1cm5zIHRoZSBzYW1lIG51bWJlcgorICogZXZlcnkgdGltZSwgc28ganVzdCB1c2UgYSBtYWNybzoKKyAqLworI2RlZmluZSB0cmFuc2Zvcm1fd2lkdGgocHAsIGNvbG91cl90eXBlLCBiaXRfZGVwdGgpIFRSQU5TRk9STV9XSURUSAorCitzdGF0aWMgcG5nX3VpbnRfMzIKK3RyYW5zZm9ybV9oZWlnaHQocG5nX2NvbnN0X3N0cnVjdHAgcHAsIHBuZ19ieXRlIGNvbG91cl90eXBlLCBwbmdfYnl0ZSBiaXRfZGVwdGgpCit7CisgICBzd2l0Y2ggKGJpdF9zaXplKHBwLCBjb2xvdXJfdHlwZSwgYml0X2RlcHRoKSkKKyAgIHsKKyAgICAgIGNhc2UgMToKKyAgICAgIGNhc2UgMjoKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgIHJldHVybiAxOyAgIC8qIFRvdGFsIG9mIDEyOCBwaXhlbHMgKi8KKworICAgICAgY2FzZSA4OgorICAgICAgICAgcmV0dXJuIDI7ICAgLyogVG90YWwgb2YgMjU2IHBpeGVscy9ieXRlcyAqLworCisgICAgICBjYXNlIDE2OgorICAgICAgICAgcmV0dXJuIDUxMjsgLyogVG90YWwgb2YgNjU1MzYgcGl4ZWxzICovCisKKyAgICAgIGNhc2UgMjQ6CisgICAgICBjYXNlIDMyOgorICAgICAgICAgcmV0dXJuIDUxMjsgLyogNjU1MzYgcGl4ZWxzICovCisKKyAgICAgIGNhc2UgNDg6CisgICAgICBjYXNlIDY0OgorICAgICAgICAgcmV0dXJuIDIwNDg7LyogNCB4IDY1NTM2IHBpeGVscy4gKi8KKyMgICAgICAgIGRlZmluZSBUUkFOU0ZPUk1fSEVJR0hUTUFYIDIwNDgKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHJldHVybiAwOyAgIC8qIEVycm9yLCB3aWxsIGJlIGNhdWdodCBsYXRlciAqLworICAgfQorfQorCisjaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECisvKiBUaGUgZm9sbG93aW5nIGNhbiBvbmx5IGJlIGRlZmluZWQgaGVyZSwgbm93IHdlIGhhdmUgdGhlIGRlZmluaXRpb25zCisgKiBvZiB0aGUgdHJhbnNmb3JtIGltYWdlIHNpemVzLgorICovCitzdGF0aWMgcG5nX3VpbnRfMzIKK3N0YW5kYXJkX3dpZHRoKHBuZ19jb25zdF9zdHJ1Y3RwIHBwLCBwbmdfdWludF8zMiBpZCkKK3sKKyAgIHBuZ191aW50XzMyIHdpZHRoID0gV0lEVEhfRlJPTV9JRChpZCk7CisgICBVTlVTRUQocHApCisKKyAgIGlmICh3aWR0aCA9PSAwKQorICAgICAgd2lkdGggPSB0cmFuc2Zvcm1fd2lkdGgocHAsIENPTF9GUk9NX0lEKGlkKSwgREVQVEhfRlJPTV9JRChpZCkpOworCisgICByZXR1cm4gd2lkdGg7Cit9CisKK3N0YXRpYyBwbmdfdWludF8zMgorc3RhbmRhcmRfaGVpZ2h0KHBuZ19jb25zdF9zdHJ1Y3RwIHBwLCBwbmdfdWludF8zMiBpZCkKK3sKKyAgIHBuZ191aW50XzMyIGhlaWdodCA9IEhFSUdIVF9GUk9NX0lEKGlkKTsKKworICAgaWYgKGhlaWdodCA9PSAwKQorICAgICAgaGVpZ2h0ID0gdHJhbnNmb3JtX2hlaWdodChwcCwgQ09MX0ZST01fSUQoaWQpLCBERVBUSF9GUk9NX0lEKGlkKSk7CisKKyAgIHJldHVybiBoZWlnaHQ7Cit9CisKK3N0YXRpYyBwbmdfdWludF8zMgorc3RhbmRhcmRfcm93c2l6ZShwbmdfY29uc3Rfc3RydWN0cCBwcCwgcG5nX3VpbnRfMzIgaWQpCit7CisgICBwbmdfdWludF8zMiB3aWR0aCA9IHN0YW5kYXJkX3dpZHRoKHBwLCBpZCk7CisKKyAgIC8qIFRoaXMgd29uJ3Qgb3ZlcmZsb3c6ICovCisgICB3aWR0aCAqPSBiaXRfc2l6ZShwcCwgQ09MX0ZST01fSUQoaWQpLCBERVBUSF9GUk9NX0lEKGlkKSk7CisgICByZXR1cm4gKHdpZHRoICsgNykgLyA4OworfQorI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAqLworCitzdGF0aWMgdm9pZAordHJhbnNmb3JtX3JvdyhwbmdfY29uc3Rfc3RydWN0cCBwcCwgcG5nX2J5dGUgYnVmZmVyW1RSQU5TRk9STV9ST1dNQVhdLAorICAgcG5nX2J5dGUgY29sb3VyX3R5cGUsIHBuZ19ieXRlIGJpdF9kZXB0aCwgcG5nX3VpbnRfMzIgeSkKK3sKKyAgIHBuZ191aW50XzMyIHYgPSB5IDw8IDc7CisgICBwbmdfdWludF8zMiBpID0gMDsKKworICAgc3dpdGNoIChiaXRfc2l6ZShwcCwgY29sb3VyX3R5cGUsIGJpdF9kZXB0aCkpCisgICB7CisgICAgICBjYXNlIDE6CisgICAgICAgICB3aGlsZSAoaTwxMjgvOCkgYnVmZmVyW2ldID0gKHBuZ19ieXRlKSh2ICYgMHhmZiksIHYgKz0gMTcsICsraTsKKyAgICAgICAgIHJldHVybjsKKworICAgICAgY2FzZSAyOgorICAgICAgICAgd2hpbGUgKGk8MTI4LzQpIGJ1ZmZlcltpXSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpLCB2ICs9IDMzLCArK2k7CisgICAgICAgICByZXR1cm47CisKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgIHdoaWxlIChpPDEyOC8yKSBidWZmZXJbaV0gPSAocG5nX2J5dGUpKHYgJiAweGZmKSwgdiArPSA2NSwgKytpOworICAgICAgICAgcmV0dXJuOworCisgICAgICBjYXNlIDg6CisgICAgICAgICAvKiAyNTYgYnl0ZXMgdG90YWwsIDEyOCBieXRlcyBpbiBlYWNoIHJvdyBzZXQgYXMgZm9sbG93czogKi8KKyAgICAgICAgIHdoaWxlIChpPDEyOCkgYnVmZmVyW2ldID0gKHBuZ19ieXRlKSh2ICYgMHhmZiksICsrdiwgKytpOworICAgICAgICAgcmV0dXJuOworCisgICAgICBjYXNlIDE2OgorICAgICAgICAgLyogR2VuZXJhdGUgYWxsIDY1NTM2IHBpeGVsIHZhbHVlcyBpbiBvcmRlciwgd2hpY2ggaW5jbHVkZXMgdGhlIDggYml0CisgICAgICAgICAgKiBHQSBjYXNlIGFzIHdlbGwgYXMgdGhlIDE2IGJpdCBHIGNhc2UuCisgICAgICAgICAgKi8KKyAgICAgICAgIHdoaWxlIChpPDEyOCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZmZlclsyKmldID0gKHBuZ19ieXRlKSgodj4+OCkgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZmZlclsyKmkrMV0gPSAocG5nX2J5dGUpKHYgJiAweGZmKTsKKyAgICAgICAgICAgICsrdjsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgIH0KKworICAgICAgICAgcmV0dXJuOworCisgICAgICBjYXNlIDI0OgorICAgICAgICAgLyogNjU1MzUgcGl4ZWxzLCBidXQgcm90YXRlIHRoZSB2YWx1ZXMuICovCisgICAgICAgICB3aGlsZSAoaTwxMjgpCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBUaHJlZSBieXRlcyBwZXIgcGl4ZWwsIHIsIGcsIGIsIG1ha2UgYiBieSByXmcgKi8KKyAgICAgICAgICAgIGJ1ZmZlclszKmkrMF0gPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICBidWZmZXJbMyppKzFdID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7CisgICAgICAgICAgICBidWZmZXJbMyppKzJdID0gKHBuZ19ieXRlKSgoKHYgPj4gOCkgXiB2KSAmIDB4ZmYpOworICAgICAgICAgICAgKyt2OworICAgICAgICAgICAgKytpOworICAgICAgICAgfQorCisgICAgICAgICByZXR1cm47CisKKyAgICAgIGNhc2UgMzI6CisgICAgICAgICAvKiA2NTUzNSBwaXhlbHMsIHIsIGcsIGIsIGE7IGp1c3QgcmVwbGljYXRlICovCisgICAgICAgICB3aGlsZSAoaTwxMjgpCisgICAgICAgICB7CisgICAgICAgICAgICBidWZmZXJbNCppKzBdID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmZmVyWzQqaSsxXSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOworICAgICAgICAgICAgYnVmZmVyWzQqaSsyXSA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZmZlcls0KmkrM10gPSAocG5nX2J5dGUpKHYgJiAweGZmKTsKKyAgICAgICAgICAgICsrdjsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgIH0KKworICAgICAgICAgcmV0dXJuOworCisgICAgICBjYXNlIDQ4OgorICAgICAgICAgLyogeSBpcyBtYXhpbXVtIDIwNDcsIGdpdmluZyA0eDY1NTM2IHBpeGVscywgbWFrZSAncicgaW5jcmVhc2UgYnkgMSBhdAorICAgICAgICAgICogZWFjaCBwaXhlbCwgZyBpbmNyZWFzZSBieSAyNTcgKDB4MTAxKSBhbmQgJ2InIGJ5IDB4MTExMToKKyAgICAgICAgICAqLworICAgICAgICAgd2hpbGUgKGk8MTI4KQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX3VpbnRfMzIgdCA9IHYrKzsKKyAgICAgICAgICAgIGJ1ZmZlcls2KmkrMF0gPSAocG5nX2J5dGUpKCh0ID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICBidWZmZXJbNippKzFdID0gKHBuZ19ieXRlKSh0ICYgMHhmZik7CisgICAgICAgICAgICB0ICo9IDI1NzsKKyAgICAgICAgICAgIGJ1ZmZlcls2KmkrMl0gPSAocG5nX2J5dGUpKCh0ID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICBidWZmZXJbNippKzNdID0gKHBuZ19ieXRlKSh0ICYgMHhmZik7CisgICAgICAgICAgICB0ICo9IDE3OworICAgICAgICAgICAgYnVmZmVyWzYqaSs0XSA9IChwbmdfYnl0ZSkoKHQgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZmZlcls2KmkrNV0gPSAocG5nX2J5dGUpKHQgJiAweGZmKTsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgIH0KKworICAgICAgICAgcmV0dXJuOworCisgICAgICBjYXNlIDY0OgorICAgICAgICAgLyogQXMgYWJvdmUgaW4gdGhlIDMyIGJpdCBjYXNlLiAqLworICAgICAgICAgd2hpbGUgKGk8MTI4KQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX3VpbnRfMzIgdCA9IHYrKzsKKyAgICAgICAgICAgIGJ1ZmZlcls4KmkrMF0gPSAocG5nX2J5dGUpKCh0ID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICBidWZmZXJbOCppKzFdID0gKHBuZ19ieXRlKSh0ICYgMHhmZik7CisgICAgICAgICAgICBidWZmZXJbOCppKzRdID0gKHBuZ19ieXRlKSgodCA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmZmVyWzgqaSs1XSA9IChwbmdfYnl0ZSkodCAmIDB4ZmYpOworICAgICAgICAgICAgdCAqPSAyNTc7CisgICAgICAgICAgICBidWZmZXJbOCppKzJdID0gKHBuZ19ieXRlKSgodCA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmZmVyWzgqaSszXSA9IChwbmdfYnl0ZSkodCAmIDB4ZmYpOworICAgICAgICAgICAgYnVmZmVyWzgqaSs2XSA9IChwbmdfYnl0ZSkoKHQgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZmZlcls4KmkrN10gPSAocG5nX2J5dGUpKHQgJiAweGZmKTsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybjsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIGJyZWFrOworICAgfQorCisgICBwbmdfZXJyb3IocHAsICJpbnRlcm5hbCBlcnJvciIpOworfQorCisvKiBUaGlzIGlzIGp1c3QgdG8gZG8gdGhlIHJpZ2h0IGNhc3QgLSBjb3VsZCBiZSBjaGFuZ2VkIHRvIGEgZnVuY3Rpb24gdG8gY2hlY2sKKyAqICdiZCcgYnV0IHRoZXJlIGlzbid0IG11Y2ggcG9pbnQuCisgKi8KKyNkZWZpbmUgREVQVEgoYmQpICgocG5nX2J5dGUpKDFVIDw8IChiZCkpKQorCisvKiBUaGlzIGlzIGp1c3QgYSBoZWxwZXIgZm9yIGNvbXBpbGluZyBvbiBtaW5pbWFsIHN5c3RlbXMgd2l0aCBubyB3cml0ZQorICogaW50ZXJsYWNpbmcgc3VwcG9ydC4gIElmIHRoZXJlIGlzIG5vIHdyaXRlIGludGVybGFjaW5nIHdlIGNhbid0IGdlbmVyYXRlIHRlc3QKKyAqIGNhc2VzIHdpdGggaW50ZXJsYWNlOgorICovCisjaWZkZWYgUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAorIyAgZGVmaW5lIElOVEVSTEFDRV9MQVNUIFBOR19JTlRFUkxBQ0VfTEFTVAorIyAgZGVmaW5lIGNoZWNrX2ludGVybGFjZV90eXBlKHR5cGUpICgodm9pZCkodHlwZSkpCisjICBkZWZpbmUgc2V0X3dyaXRlX2ludGVybGFjZV9oYW5kbGluZyhwcCx0eXBlKSBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyhwcCkKKyMgIGRlZmluZSBkb19vd25faW50ZXJsYWNlIDAKKyNlbGlmIFBOR19MSUJQTkdfVkVSIDwgMTA3MDAKKyMgIGRlZmluZSBzZXRfd3JpdGVfaW50ZXJsYWNlX2hhbmRsaW5nKHBwLHR5cGUpICgxKQorc3RhdGljIHZvaWQKK2NoZWNrX2ludGVybGFjZV90eXBlKGludCBjb25zdCBpbnRlcmxhY2VfdHlwZSkKK3sKKyAgIC8qIFByaW9yIHRvIDEuNy4wIGxpYnBuZyBkb2VzIG5vdCBzdXBwb3J0IHRoZSB3cml0ZSBvZiBhbiBpbnRlcmxhY2VkIGltYWdlCisgICAgKiB1bmxlc3MgUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRCwgZXZlbiB3aXRoIGRvX2ludGVybGFjZSBzbyB0aGUKKyAgICAqIGNvZGUgaGVyZSBkb2VzIHRoZSBwaXhlbCBpbnRlcmxhY2UgaXRzZWxmLCBzbzoKKyAgICAqLworICAgaWYgKGludGVybGFjZV90eXBlICE9IFBOR19JTlRFUkxBQ0VfTk9ORSkKKyAgIHsKKyAgICAgIC8qIFRoaXMgaXMgYW4gaW50ZXJuYWwgZXJyb3IgLSAtLWludGVybGFjZSB0ZXN0cyBzaG91bGQgYmUgc2tpcHBlZCwgbm90CisgICAgICAgKiBhdHRlbXB0ZWQuCisgICAgICAgKi8KKyAgICAgIGZwcmludGYoc3RkZXJyLCAicG5ndmFsaWQ6IG5vIGludGVybGFjZSBzdXBwb3J0XG4iKTsKKyAgICAgIGV4aXQoOTkpOworICAgfQorfQorIyAgZGVmaW5lIElOVEVSTEFDRV9MQVNUIChQTkdfSU5URVJMQUNFX05PTkUrMSkKKyMgIGRlZmluZSBkb19vd25faW50ZXJsYWNlIDAKKyNlbHNlIC8qIGxpYnBuZyAxLjcrICovCisjICBkZWZpbmUgc2V0X3dyaXRlX2ludGVybGFjZV9oYW5kbGluZyhwcCx0eXBlKVwKKyAgICAgIG5wYXNzZXNfZnJvbV9pbnRlcmxhY2VfdHlwZShwcCx0eXBlKQorIyAgZGVmaW5lIGNoZWNrX2ludGVybGFjZV90eXBlKHR5cGUpICgodm9pZCkodHlwZSkpCisjICBkZWZpbmUgSU5URVJMQUNFX0xBU1QgUE5HX0lOVEVSTEFDRV9MQVNUCisjICBkZWZpbmUgZG9fb3duX2ludGVybGFjZSAxCisjZW5kaWYgLyogV1JJVEVfSU5URVJMQUNJTkcgdGVzdHMgKi8KKworI2RlZmluZSBDQU5fV1JJVEVfSU5URVJMQUNFXAorICAgUE5HX0xJQlBOR19WRVIgPj0gMTA3MDAgfHwgZGVmaW5lZCBQTkdfV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVECisKKy8qIERvIHRoZSBzYW1lIHRoaW5nIGZvciByZWFkIGludGVybGFjaW5nOyB0aGlzIGNvbnRyb2xzIHdoZXRoZXIgcmVhZCB0ZXN0cyBkbworICogdGhlaXIgb3duIGRlLWludGVybGFjZSBvciB1c2UgbGlicG5nLgorICovCisjaWZkZWYgUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVECisjICBkZWZpbmUgZG9fcmVhZF9pbnRlcmxhY2UgMAorI2Vsc2UgLyogbm8gbGlicG5nIHJlYWQgaW50ZXJsYWNlIHN1cHBvcnQgKi8KKyMgIGRlZmluZSBkb19yZWFkX2ludGVybGFjZSAxCisjZW5kaWYKKy8qIFRoZSBmb2xsb3dpbmcgdHdvIHJvdXRpbmVzIHVzZSB0aGUgUE5HIGludGVybGFjZSBzdXBwb3J0IG1hY3JvcyBmcm9tCisgKiBwbmcuaCB0byBpbnRlcmxhY2Ugb3IgZGVpbnRlcmxhY2Ugcm93cy4KKyAqLworc3RhdGljIHZvaWQKK2ludGVybGFjZV9yb3cocG5nX2J5dGVwIGJ1ZmZlciwgcG5nX2NvbnN0X2J5dGVwIGltYWdlUm93LAorICAgdW5zaWduZWQgaW50IHBpeGVsX3NpemUsIHBuZ191aW50XzMyIHcsIGludCBwYXNzLCBpbnQgbGl0dGxlZW5kaWFuKQoreworICAgcG5nX3VpbnRfMzIgeGluLCB4b3V0LCB4c3RlcDsKKworICAgLyogTm90ZSB0aGF0IHRoaXMgY2FuLCB0cml2aWFsbHksIGJlIG9wdGltaXplZCB0byBhIG1lbWNweSBvbiBwYXNzIDcsIHRoZQorICAgICogY29kZSBpcyBwcmVzZW50ZWQgdGhpcyB3YXkgdG8gbWFrZSBpdCBlYXNpZXIgdG8gdW5kZXJzdGFuZC4gIEluIHByYWN0aWNlCisgICAgKiBjb25zdWx0IHRoZSBjb2RlIGluIHRoZSBsaWJwbmcgc291cmNlIHRvIHNlZSBvdGhlciB3YXlzIG9mIGRvaW5nIHRoaXMuCisgICAgKgorICAgICogSXQgaXMgT0sgZm9yIGJ1ZmZlciBhbmQgaW1hZ2VSb3cgdG8gYmUgaWRlbnRpY2FsLCBiZWNhdXNlICd4aW4nIG1vdmVzCisgICAgKiBmYXN0ZXIgdGhhbiAneG91dCcgYW5kIHdlIGNvcHkgdXAuCisgICAgKi8KKyAgIHhpbiA9IFBOR19QQVNTX1NUQVJUX0NPTChwYXNzKTsKKyAgIHhzdGVwID0gMVU8PFBOR19QQVNTX0NPTF9TSElGVChwYXNzKTsKKworICAgZm9yICh4b3V0PTA7IHhpbjx3OyB4aW4rPXhzdGVwKQorICAgeworICAgICAgcGl4ZWxfY29weShidWZmZXIsIHhvdXQsIGltYWdlUm93LCB4aW4sIHBpeGVsX3NpemUsIGxpdHRsZWVuZGlhbik7CisgICAgICArK3hvdXQ7CisgICB9Cit9CisKKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9yb3cocG5nX2J5dGVwIGJ1ZmZlciwgcG5nX2NvbnN0X2J5dGVwIHJvdywKKyAgIHVuc2lnbmVkIGludCBwaXhlbF9zaXplLCBwbmdfdWludF8zMiB3LCBpbnQgcGFzcywgaW50IGxpdHRsZWVuZGlhbikKK3sKKyAgIC8qIFRoZSBpbnZlcnNlIG9mIHRoZSBhYm92ZSwgJ3JvdycgaXMgcGFydCBvZiByb3cgJ3knIG9mIHRoZSBvdXRwdXQgaW1hZ2UsCisgICAgKiBpbiAnYnVmZmVyJy4gIFRoZSBpbWFnZSBpcyAndycgd2lkZSBhbmQgdGhpcyBpcyBwYXNzICdwYXNzJywgZGlzdHJpYnV0ZQorICAgICogdGhlIHBpeGVscyBvZiByb3cgaW50byBidWZmZXIgYW5kIHJldHVybiB0aGUgbnVtYmVyIHdyaXR0ZW4gKHRvIGFsbG93CisgICAgKiB0aGlzIHRvIGJlIGNoZWNrZWQpLgorICAgICovCisgICBwbmdfdWludF8zMiB4aW4sIHhvdXQsIHhzdGVwOworCisgICB4b3V0ID0gUE5HX1BBU1NfU1RBUlRfQ09MKHBhc3MpOworICAgeHN0ZXAgPSAxVTw8UE5HX1BBU1NfQ09MX1NISUZUKHBhc3MpOworCisgICBmb3IgKHhpbj0wOyB4b3V0PHc7IHhvdXQrPXhzdGVwKQorICAgeworICAgICAgcGl4ZWxfY29weShidWZmZXIsIHhvdXQsIHJvdywgeGluLCBwaXhlbF9zaXplLCBsaXR0bGVlbmRpYW4pOworICAgICAgKyt4aW47CisgICB9Cit9CisjZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICovCisKKy8qIE1ha2UgYSBzdGFuZGFyZGl6ZWQgaW1hZ2UgZ2l2ZW4gYW4gaW1hZ2UgY29sb3VyIHR5cGUsIGJpdCBkZXB0aCBhbmQKKyAqIGludGVybGFjZSB0eXBlLiAgVGhlIHN0YW5kYXJkIGltYWdlcyBoYXZlIGEgdmVyeSByZXN0cmljdGVkIHJhbmdlIG9mCisgKiByb3dzIGFuZCBoZWlnaHRzIGFuZCBhcmUgdXNlZCBmb3IgdGVzdGluZyB0cmFuc2Zvcm1zIHJhdGhlciB0aGFuIGltYWdlCisgKiBsYXlvdXQgZGV0YWlscy4gIFNlZSBtYWtlX3NpemVfaW1hZ2VzIGJlbG93IGZvciBhIHdheSB0byBtYWtlIGltYWdlcworICogdGhhdCB0ZXN0IG9kZCBzaXplcyBhbG9uZyB3aXRoIHRoZSBsaWJwbmcgaW50ZXJsYWNlIGhhbmRsaW5nLgorICovCitzdGF0aWMgdm9pZAorbWFrZV90cmFuc2Zvcm1faW1hZ2UocG5nX3N0b3JlKiBjb25zdCBwcywgcG5nX2J5dGUgY29uc3QgY29sb3VyX3R5cGUsCisgICAgcG5nX2J5dGUgY29uc3QgYml0X2RlcHRoLCB1bnNpZ25lZCBpbnQgcGFsZXR0ZV9udW1iZXIsCisgICAgaW50IGludGVybGFjZV90eXBlLCBwbmdfY29uc3RfY2hhcnAgbmFtZSkKK3sKKyAgIGNvbnRleHQocHMsIGZhdWx0KTsKKworICAgY2hlY2tfaW50ZXJsYWNlX3R5cGUoaW50ZXJsYWNlX3R5cGUpOworCisgICBUcnkKKyAgIHsKKyAgICAgIHBuZ19pbmZvcCBwaTsKKyAgICAgIHBuZ19zdHJ1Y3RwIHBwID0gc2V0X3N0b3JlX2Zvcl93cml0ZShwcywgJnBpLCBuYW1lKTsKKyAgICAgIHBuZ191aW50XzMyIGgsIHc7CisKKyAgICAgIC8qIEluIHRoZSBldmVudCBvZiBhIHByb2JsZW0gcmV0dXJuIGNvbnRyb2wgdG8gdGhlIENhdGNoIHN0YXRlbWVudCBiZWxvdworICAgICAgICogdG8gZG8gdGhlIGNsZWFuIHVwIC0gaXQgaXMgbm90IHBvc3NpYmxlIHRvICdyZXR1cm4nIGRpcmVjdGx5IGZyb20gYSBUcnkKKyAgICAgICAqIGJsb2NrLgorICAgICAgICovCisgICAgICBpZiAocHAgPT0gTlVMTCkKKyAgICAgICAgIFRocm93IHBzOworCisgICAgICB3ID0gdHJhbnNmb3JtX3dpZHRoKHBwLCBjb2xvdXJfdHlwZSwgYml0X2RlcHRoKTsKKyAgICAgIGggPSB0cmFuc2Zvcm1faGVpZ2h0KHBwLCBjb2xvdXJfdHlwZSwgYml0X2RlcHRoKTsKKworICAgICAgcG5nX3NldF9JSERSKHBwLCBwaSwgdywgaCwgYml0X2RlcHRoLCBjb2xvdXJfdHlwZSwgaW50ZXJsYWNlX3R5cGUsCisgICAgICAgICBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFLCBQTkdfRklMVEVSX1RZUEVfQkFTRSk7CisKKyNpZmRlZiBQTkdfVEVYVF9TVVBQT1JURUQKKyMgIGlmIGRlZmluZWQoUE5HX1JFQURfelRYdF9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX1dSSVRFX3pUWHRfU1VQUE9SVEVEKQorIyAgICAgZGVmaW5lIFRFWFRfQ09NUFJFU1NJT04gUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdAorIyAgZWxzZQorIyAgICAgZGVmaW5lIFRFWFRfQ09NUFJFU1NJT04gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORQorIyAgZW5kaWYKKyAgICAgIHsKKyAgICAgICAgIHN0YXRpYyBjaGFyIGtleVtdID0gImltYWdlIG5hbWUiOyAvKiBtdXN0IGJlIHdyaXRlYWJsZSAqLworICAgICAgICAgc2l6ZV90IHBvczsKKyAgICAgICAgIHBuZ190ZXh0IHRleHQ7CisgICAgICAgICBjaGFyIGNvcHlbRklMRV9OQU1FX1NJWkVdOworCisgICAgICAgICAvKiBVc2UgYSBjb21wcmVzc2VkIHRleHQgc3RyaW5nIHRvIHRlc3QgdGhlIGNvcnJlY3QgaW50ZXJhY3Rpb24gb2YgdGV4dAorICAgICAgICAgICogY29tcHJlc3Npb24gYW5kIElEQVQgY29tcHJlc3Npb24uCisgICAgICAgICAgKi8KKyAgICAgICAgIHRleHQuY29tcHJlc3Npb24gPSBURVhUX0NPTVBSRVNTSU9OOworICAgICAgICAgdGV4dC5rZXkgPSBrZXk7CisgICAgICAgICAvKiBZdWNrOiB0aGUgdGV4dCBtdXN0IGJlIHdyaXRhYmxlISAqLworICAgICAgICAgcG9zID0gc2FmZWNhdChjb3B5LCBzaXplb2YgY29weSwgMCwgcHMtPnduYW1lKTsKKyAgICAgICAgIHRleHQudGV4dCA9IGNvcHk7CisgICAgICAgICB0ZXh0LnRleHRfbGVuZ3RoID0gcG9zOworICAgICAgICAgdGV4dC5pdHh0X2xlbmd0aCA9IDA7CisgICAgICAgICB0ZXh0LmxhbmcgPSAwOworICAgICAgICAgdGV4dC5sYW5nX2tleSA9IDA7CisKKyAgICAgICAgIHBuZ19zZXRfdGV4dChwcCwgcGksICZ0ZXh0LCAxKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBpZiAoY29sb3VyX3R5cGUgPT0gMykgLyogcGFsZXR0ZSAqLworICAgICAgICAgaW5pdF9zdGFuZGFyZF9wYWxldHRlKHBzLCBwcCwgcGksIDFVIDw8IGJpdF9kZXB0aCwgMS8qZG8gdFJOUyovKTsKKworIyAgICAgaWZkZWYgUE5HX1dSSVRFX3RSTlNfU1VQUE9SVEVECisgICAgICAgICBlbHNlIGlmIChwYWxldHRlX251bWJlcikKKyAgICAgICAgICAgIHNldF9yYW5kb21fdFJOUyhwcCwgcGksIGNvbG91cl90eXBlLCBiaXRfZGVwdGgpOworIyAgICAgZW5kaWYKKworICAgICAgcG5nX3dyaXRlX2luZm8ocHAsIHBpKTsKKworICAgICAgaWYgKHBuZ19nZXRfcm93Ynl0ZXMocHAsIHBpKSAhPQorICAgICAgICAgIHRyYW5zZm9ybV9yb3dzaXplKHBwLCBjb2xvdXJfdHlwZSwgYml0X2RlcHRoKSkKKyAgICAgICAgIHBuZ19lcnJvcihwcCwgInRyYW5zZm9ybSByb3cgc2l6ZSBpbmNvcnJlY3QiKTsKKworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgLyogU29tZXdoYXQgY29uZnVzaW5nbHkgdGhpcyBtdXN0IGJlIGNhbGxlZCAqYWZ0ZXIqIHBuZ193cml0ZV9pbmZvCisgICAgICAgICAgKiBiZWNhdXNlIGlmIGl0IGlzIGNhbGxlZCBiZWZvcmUsIHRoZSBpbmZvcm1hdGlvbiBpbiAqcHAgaGFzIG5vdCBiZWVuCisgICAgICAgICAgKiB1cGRhdGVkIHRvIHJlZmxlY3QgdGhlIGludGVybGFjZWQgaW1hZ2UuCisgICAgICAgICAgKi8KKyAgICAgICAgIGludCBucGFzc2VzID0gc2V0X3dyaXRlX2ludGVybGFjZV9oYW5kbGluZyhwcCwgaW50ZXJsYWNlX3R5cGUpOworICAgICAgICAgaW50IHBhc3M7CisKKyAgICAgICAgIGlmIChucGFzc2VzICE9IG5wYXNzZXNfZnJvbV9pbnRlcmxhY2VfdHlwZShwcCwgaW50ZXJsYWNlX3R5cGUpKQorICAgICAgICAgICAgcG5nX2Vycm9yKHBwLCAid3JpdGU6IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nIGZhaWxlZCIpOworCisgICAgICAgICBmb3IgKHBhc3M9MDsgcGFzczxucGFzc2VzOyArK3Bhc3MpCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfdWludF8zMiB5OworCisgICAgICAgICAgICAvKiBkb19vd25faW50ZXJsYWNlIGlzIGEgcHJlLWRlZmluZWQgYm9vbGVhbiAoYSAjZGVmaW5lKSB3aGljaCBpcworICAgICAgICAgICAgICogc2V0IGlmIHdlIGhhdmUgdG8gd29yayBvdXQgdGhlIGludGVybGFjZWQgcm93cyBoZXJlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBmb3IgKHk9MDsgeTxoOyArK3kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfYnl0ZSBidWZmZXJbVFJBTlNGT1JNX1JPV01BWF07CisKKyAgICAgICAgICAgICAgIHRyYW5zZm9ybV9yb3cocHAsIGJ1ZmZlciwgY29sb3VyX3R5cGUsIGJpdF9kZXB0aCwgeSk7CisKKyMgICAgICAgICAgICAgIGlmIGRvX293bl9pbnRlcmxhY2UKKyAgICAgICAgICAgICAgICAgIC8qIElmIGRvX293bl9pbnRlcmxhY2UgKmFuZCogdGhlIGltYWdlIGlzIGludGVybGFjZWQgd2UgbmVlZCBhCisgICAgICAgICAgICAgICAgICAgKiByZWR1Y2VkIGludGVybGFjZSByb3c7IHRoaXMgbWF5IGJlIHJlZHVjZWQgdG8gZW1wdHkuCisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChpbnRlcmxhY2VfdHlwZSA9PSBQTkdfSU5URVJMQUNFX0FEQU03KQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgLyogVGhlIHJvdyBtdXN0IG5vdCBiZSB3cml0dGVuIGlmIGl0IGRvZXNuJ3QgZXhpc3QsIG5vdGljZQorICAgICAgICAgICAgICAgICAgICAgICogdGhhdCB0aGVyZSBhcmUgdHdvIGNvbmRpdGlvbnMgaGVyZSwgZWl0aGVyIHRoZSByb3cgaXNuJ3QKKyAgICAgICAgICAgICAgICAgICAgICAqIGV2ZXIgaW4gdGhlIHBhc3Mgb3IgdGhlIHJvdyB3b3VsZCBiZSBidXQgaXNuJ3Qgd2lkZQorICAgICAgICAgICAgICAgICAgICAgICogZW5vdWdoIHRvIGNvbnRyaWJ1dGUgYW55IHBpeGVscy4gIEluIGZhY3QgdGhlIHdQYXNzIHRlc3QKKyAgICAgICAgICAgICAgICAgICAgICAqIGNhbiBiZSB1c2VkIHRvIHNraXAgdGhlIHdob2xlIHkgbG9vcCBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgIGlmIChQTkdfUk9XX0lOX0lOVEVSTEFDRV9QQVNTKHksIHBhc3MpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX1BBU1NfQ09MUyh3LCBwYXNzKSA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmxhY2Vfcm93KGJ1ZmZlciwgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0X3NpemUocHAsIGNvbG91cl90eXBlLCBiaXRfZGVwdGgpLCB3LCBwYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC8qZGF0YSBhbHdheXMgYmlnZW5kaWFuKi8pOworICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICB9CisjICAgICAgICAgICAgICBlbmRpZiAvKiBkb19vd25faW50ZXJsYWNlICovCisKKyAgICAgICAgICAgICAgIHBuZ193cml0ZV9yb3cocHAsIGJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisKKyNpZmRlZiBQTkdfVEVYVF9TVVBQT1JURUQKKyAgICAgIHsKKyAgICAgICAgIHN0YXRpYyBjaGFyIGtleVtdID0gImVuZCBtYXJrZXIiOworICAgICAgICAgc3RhdGljIGNoYXIgY29tbWVudFtdID0gImVuZCI7CisgICAgICAgICBwbmdfdGV4dCB0ZXh0OworCisgICAgICAgICAvKiBVc2UgYSBjb21wcmVzc2VkIHRleHQgc3RyaW5nIHRvIHRlc3QgdGhlIGNvcnJlY3QgaW50ZXJhY3Rpb24gb2YgdGV4dAorICAgICAgICAgICogY29tcHJlc3Npb24gYW5kIElEQVQgY29tcHJlc3Npb24uCisgICAgICAgICAgKi8KKyAgICAgICAgIHRleHQuY29tcHJlc3Npb24gPSBURVhUX0NPTVBSRVNTSU9OOworICAgICAgICAgdGV4dC5rZXkgPSBrZXk7CisgICAgICAgICB0ZXh0LnRleHQgPSBjb21tZW50OworICAgICAgICAgdGV4dC50ZXh0X2xlbmd0aCA9IChzaXplb2YgY29tbWVudCktMTsKKyAgICAgICAgIHRleHQuaXR4dF9sZW5ndGggPSAwOworICAgICAgICAgdGV4dC5sYW5nID0gMDsKKyAgICAgICAgIHRleHQubGFuZ19rZXkgPSAwOworCisgICAgICAgICBwbmdfc2V0X3RleHQocHAsIHBpLCAmdGV4dCwgMSk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgcG5nX3dyaXRlX2VuZChwcCwgcGkpOworCisgICAgICAvKiBBbmQgc3RvcmUgdGhpcyB1bmRlciB0aGUgYXBwcm9wcmlhdGUgaWQsIHRoZW4gY2xlYW4gdXAuICovCisgICAgICBzdG9yZV9zdG9yZWZpbGUocHMsIEZJTEVJRChjb2xvdXJfdHlwZSwgYml0X2RlcHRoLCBwYWxldHRlX251bWJlciwKKyAgICAgICAgIGludGVybGFjZV90eXBlLCAwLCAwLCAwKSk7CisKKyAgICAgIHN0b3JlX3dyaXRlX3Jlc2V0KHBzKTsKKyAgIH0KKworICAgQ2F0Y2goZmF1bHQpCisgICB7CisgICAgICAvKiBVc2UgdGhlIHBuZ19zdG9yZSByZXR1cm5lZCBieSB0aGUgZXhjZXB0aW9uLiBUaGlzIG1heSBoZWxwIHRoZSBjb21waWxlcgorICAgICAgICogYmVjYXVzZSAncHMnIGlzIG5vdCB1c2VkIGluIHRoaXMgYnJhbmNoIG9mIHRoZSBzZXRqbXAuICBOb3RlIHRoYXQgZmF1bHQKKyAgICAgICAqIGFuZCBwcyB3aWxsIGFsd2F5cyBiZSB0aGUgc2FtZSB2YWx1ZS4KKyAgICAgICAqLworICAgICAgc3RvcmVfd3JpdGVfcmVzZXQoZmF1bHQpOworICAgfQorfQorCitzdGF0aWMgdm9pZAorbWFrZV90cmFuc2Zvcm1faW1hZ2VzKHBuZ19tb2RpZmllciAqcG0pCit7CisgICBwbmdfYnl0ZSBjb2xvdXJfdHlwZSA9IDA7CisgICBwbmdfYnl0ZSBiaXRfZGVwdGggPSAwOworICAgdW5zaWduZWQgaW50IHBhbGV0dGVfbnVtYmVyID0gMDsKKworICAgLyogVGhpcyBpcyBpbiBjYXNlIG9mIGVycm9ycy4gKi8KKyAgIHNhZmVjYXQocG0tPnRoaXMudGVzdCwgc2l6ZW9mIHBtLT50aGlzLnRlc3QsIDAsICJtYWtlIHN0YW5kYXJkIGltYWdlcyIpOworCisgICAvKiBVc2UgbmV4dF9mb3JtYXQgdG8gZW51bWVyYXRlIGFsbCB0aGUgY29tYmluYXRpb25zIHdlIHRlc3QsIGluY2x1ZGluZworICAgICogZ2VuZXJhdGluZyBtdWx0aXBsZSBsb3cgYml0IGRlcHRoIHBhbGV0dGUgaW1hZ2VzLiBOb24tQSBpbWFnZXMgKHBhbGV0dGUKKyAgICAqIGFuZCBkaXJlY3QpIGFyZSBjcmVhdGVkIHdpdGggYW5kIHdpdGhvdXQgdFJOUyBjaHVua3MuCisgICAgKi8KKyAgIHdoaWxlIChuZXh0X2Zvcm1hdCgmY29sb3VyX3R5cGUsICZiaXRfZGVwdGgsICZwYWxldHRlX251bWJlciwgMSwgMSkpCisgICB7CisgICAgICBpbnQgaW50ZXJsYWNlX3R5cGU7CisKKyAgICAgIGZvciAoaW50ZXJsYWNlX3R5cGUgPSBQTkdfSU5URVJMQUNFX05PTkU7CisgICAgICAgICAgIGludGVybGFjZV90eXBlIDwgSU5URVJMQUNFX0xBU1Q7ICsraW50ZXJsYWNlX3R5cGUpCisgICAgICB7CisgICAgICAgICBjaGFyIG5hbWVbRklMRV9OQU1FX1NJWkVdOworCisgICAgICAgICBzdGFuZGFyZF9uYW1lKG5hbWUsIHNpemVvZiBuYW1lLCAwLCBjb2xvdXJfdHlwZSwgYml0X2RlcHRoLAorICAgICAgICAgICAgcGFsZXR0ZV9udW1iZXIsIGludGVybGFjZV90eXBlLCAwLCAwLCBkb19vd25faW50ZXJsYWNlKTsKKyAgICAgICAgIG1ha2VfdHJhbnNmb3JtX2ltYWdlKCZwbS0+dGhpcywgY29sb3VyX3R5cGUsIGJpdF9kZXB0aCwgcGFsZXR0ZV9udW1iZXIsCisgICAgICAgICAgICBpbnRlcmxhY2VfdHlwZSwgbmFtZSk7CisgICAgICB9CisgICB9Cit9CisKKy8qIEJ1aWxkIGEgc2luZ2xlIHJvdyBmb3IgdGhlICdzaXplJyB0ZXN0IGltYWdlczsgdGhpcyBmaWxscyBpbiBvbmx5IHRoZQorICogZmlyc3QgYml0X3dpZHRoIGJpdHMgb2YgdGhlIHNhbXBsZSByb3cuCisgKi8KK3N0YXRpYyB2b2lkCitzaXplX3JvdyhwbmdfYnl0ZSBidWZmZXJbU0laRV9ST1dNQVhdLCBwbmdfdWludF8zMiBiaXRfd2lkdGgsIHBuZ191aW50XzMyIHkpCit7CisgICAvKiBoZWlnaHQgaXMgaW4gdGhlIHJhbmdlIDEgdG8gMTYsIHNvOiAqLworICAgeSA9ICgoeSAmIDEpIDw8IDcpICsgKCh5ICYgMikgPDwgNikgKyAoKHkgJiA0KSA8PCA1KSArICgoeSAmIDgpIDw8IDQpOworICAgLyogdGhlIGZvbGxvd2luZyBlbnN1cmVzIGJpdHMgYXJlIHNldCBpbiBzbWFsbCBpbWFnZXM6ICovCisgICB5IF49IDB4QTU7CisKKyAgIHdoaWxlIChiaXRfd2lkdGggPj0gOCkKKyAgICAgICpidWZmZXIrKyA9IChwbmdfYnl0ZSl5KyssIGJpdF93aWR0aCAtPSA4OworCisgICAvKiBUaGVyZSBtYXkgYmUgdXAgdG8gNyByZW1haW5pbmcgYml0cywgdGhlc2UgZ28gaW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQKKyAgICAqIGJpdHMgb2YgdGhlIGJ5dGUuCisgICAgKi8KKyAgIGlmIChiaXRfd2lkdGggPiAwKQorICAgeworICAgICAgcG5nX3VpbnRfMzIgbWFzayA9ICgxVTw8KDgtYml0X3dpZHRoKSktMTsKKyAgICAgICpidWZmZXIgPSAocG5nX2J5dGUpKCgqYnVmZmVyICYgbWFzaykgfCAoeSAmIH5tYXNrKSk7CisgICB9Cit9CisKK3N0YXRpYyB2b2lkCittYWtlX3NpemVfaW1hZ2UocG5nX3N0b3JlKiBjb25zdCBwcywgcG5nX2J5dGUgY29uc3QgY29sb3VyX3R5cGUsCisgICAgcG5nX2J5dGUgY29uc3QgYml0X2RlcHRoLCBpbnQgY29uc3QgaW50ZXJsYWNlX3R5cGUsCisgICAgcG5nX3VpbnRfMzIgY29uc3QgdywgcG5nX3VpbnRfMzIgY29uc3QgaCwKKyAgICBpbnQgY29uc3QgZG9faW50ZXJsYWNlKQoreworICAgY29udGV4dChwcywgZmF1bHQpOworCisgICBjaGVja19pbnRlcmxhY2VfdHlwZShpbnRlcmxhY2VfdHlwZSk7CisKKyAgIFRyeQorICAgeworICAgICAgcG5nX2luZm9wIHBpOworICAgICAgcG5nX3N0cnVjdHAgcHA7CisgICAgICB1bnNpZ25lZCBpbnQgcGl4ZWxfc2l6ZTsKKworICAgICAgLyogTWFrZSBhIG5hbWUgYW5kIGdldCBhbiBhcHByb3ByaWF0ZSBpZCBmb3IgdGhlIHN0b3JlOiAqLworICAgICAgY2hhciBuYW1lW0ZJTEVfTkFNRV9TSVpFXTsKKyAgICAgIGNvbnN0IHBuZ191aW50XzMyIGlkID0gRklMRUlEKGNvbG91cl90eXBlLCBiaXRfZGVwdGgsIDAvKnBhbGV0dGUqLywKKyAgICAgICAgIGludGVybGFjZV90eXBlLCB3LCBoLCBkb19pbnRlcmxhY2UpOworCisgICAgICBzdGFuZGFyZF9uYW1lX2Zyb21faWQobmFtZSwgc2l6ZW9mIG5hbWUsIDAsIGlkKTsKKyAgICAgIHBwID0gc2V0X3N0b3JlX2Zvcl93cml0ZShwcywgJnBpLCBuYW1lKTsKKworICAgICAgLyogSW4gdGhlIGV2ZW50IG9mIGEgcHJvYmxlbSByZXR1cm4gY29udHJvbCB0byB0aGUgQ2F0Y2ggc3RhdGVtZW50IGJlbG93CisgICAgICAgKiB0byBkbyB0aGUgY2xlYW4gdXAgLSBpdCBpcyBub3QgcG9zc2libGUgdG8gJ3JldHVybicgZGlyZWN0bHkgZnJvbSBhIFRyeQorICAgICAgICogYmxvY2suCisgICAgICAgKi8KKyAgICAgIGlmIChwcCA9PSBOVUxMKQorICAgICAgICAgVGhyb3cgcHM7CisKKyAgICAgIHBuZ19zZXRfSUhEUihwcCwgcGksIHcsIGgsIGJpdF9kZXB0aCwgY29sb3VyX3R5cGUsIGludGVybGFjZV90eXBlLAorICAgICAgICAgUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSwgUE5HX0ZJTFRFUl9UWVBFX0JBU0UpOworCisjaWZkZWYgUE5HX1RFWFRfU1VQUE9SVEVECisgICAgICB7CisgICAgICAgICBzdGF0aWMgY2hhciBrZXlbXSA9ICJpbWFnZSBuYW1lIjsgLyogbXVzdCBiZSB3cml0ZWFibGUgKi8KKyAgICAgICAgIHNpemVfdCBwb3M7CisgICAgICAgICBwbmdfdGV4dCB0ZXh0OworICAgICAgICAgY2hhciBjb3B5W0ZJTEVfTkFNRV9TSVpFXTsKKworICAgICAgICAgLyogVXNlIGEgY29tcHJlc3NlZCB0ZXh0IHN0cmluZyB0byB0ZXN0IHRoZSBjb3JyZWN0IGludGVyYWN0aW9uIG9mIHRleHQKKyAgICAgICAgICAqIGNvbXByZXNzaW9uIGFuZCBJREFUIGNvbXByZXNzaW9uLgorICAgICAgICAgICovCisgICAgICAgICB0ZXh0LmNvbXByZXNzaW9uID0gVEVYVF9DT01QUkVTU0lPTjsKKyAgICAgICAgIHRleHQua2V5ID0ga2V5OworICAgICAgICAgLyogWXVjazogdGhlIHRleHQgbXVzdCBiZSB3cml0YWJsZSEgKi8KKyAgICAgICAgIHBvcyA9IHNhZmVjYXQoY29weSwgc2l6ZW9mIGNvcHksIDAsIHBzLT53bmFtZSk7CisgICAgICAgICB0ZXh0LnRleHQgPSBjb3B5OworICAgICAgICAgdGV4dC50ZXh0X2xlbmd0aCA9IHBvczsKKyAgICAgICAgIHRleHQuaXR4dF9sZW5ndGggPSAwOworICAgICAgICAgdGV4dC5sYW5nID0gMDsKKyAgICAgICAgIHRleHQubGFuZ19rZXkgPSAwOworCisgICAgICAgICBwbmdfc2V0X3RleHQocHAsIHBpLCAmdGV4dCwgMSk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgaWYgKGNvbG91cl90eXBlID09IDMpIC8qIHBhbGV0dGUgKi8KKyAgICAgICAgIGluaXRfc3RhbmRhcmRfcGFsZXR0ZShwcywgcHAsIHBpLCAxVSA8PCBiaXRfZGVwdGgsIDAvKmRvIHRSTlMqLyk7CisKKyAgICAgIHBuZ193cml0ZV9pbmZvKHBwLCBwaSk7CisKKyAgICAgIC8qIENhbGN1bGF0ZSB0aGUgYml0IHNpemUsIGRpdmlkZSBieSA4IHRvIGdldCB0aGUgYnl0ZSBzaXplIC0gdGhpcyB3b24ndAorICAgICAgICogb3ZlcmZsb3cgYmVjYXVzZSB3ZSBrbm93IHRoZSB3IHZhbHVlcyBhcmUgYWxsIHNtYWxsIGVub3VnaCBldmVuIGZvcgorICAgICAgICogYSBzeXN0ZW0gd2hlcmUgJ3Vuc2lnbmVkIGludCcgaXMgb25seSAxNiBiaXRzLgorICAgICAgICovCisgICAgICBwaXhlbF9zaXplID0gYml0X3NpemUocHAsIGNvbG91cl90eXBlLCBiaXRfZGVwdGgpOworICAgICAgaWYgKHBuZ19nZXRfcm93Ynl0ZXMocHAsIHBpKSAhPSAoKHcgKiBwaXhlbF9zaXplKSArIDcpIC8gOCkKKyAgICAgICAgIHBuZ19lcnJvcihwcCwgInNpemUgcm93IHNpemUgaW5jb3JyZWN0Iik7CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGludCBucGFzc2VzID0gbnBhc3Nlc19mcm9tX2ludGVybGFjZV90eXBlKHBwLCBpbnRlcmxhY2VfdHlwZSk7CisgICAgICAgICBwbmdfdWludF8zMiB5OworICAgICAgICAgaW50IHBhc3M7CisjICAgICAgICBpZmRlZiBQTkdfV1JJVEVfRklMVEVSX1NVUFBPUlRFRAorICAgICAgICAgICAgaW50IG5maWx0ZXIgPSBQTkdfRklMVEVSX1ZBTFVFX0xBU1Q7CisjICAgICAgICBlbmRpZgorICAgICAgICAgcG5nX2J5dGUgaW1hZ2VbMTZdW1NJWkVfUk9XTUFYXTsKKworICAgICAgICAgLyogVG8gaGVscCBjb25zaXN0ZW50IGVycm9yIGRldGVjdGlvbiBtYWtlIHRoZSBwYXJ0cyBvZiB0aGlzIGJ1ZmZlcgorICAgICAgICAgICogdGhhdCBhcmVuJ3Qgc2V0IGJlbG93IGFsbCAnMSc6CisgICAgICAgICAgKi8KKyAgICAgICAgIG1lbXNldChpbWFnZSwgMHhmZiwgc2l6ZW9mIGltYWdlKTsKKworICAgICAgICAgaWYgKCFkb19pbnRlcmxhY2UgJiYKKyAgICAgICAgICAgICBucGFzc2VzICE9IHNldF93cml0ZV9pbnRlcmxhY2VfaGFuZGxpbmcocHAsIGludGVybGFjZV90eXBlKSkKKyAgICAgICAgICAgIHBuZ19lcnJvcihwcCwgIndyaXRlOiBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyBmYWlsZWQiKTsKKworICAgICAgICAgLyogUHJlcGFyZSB0aGUgd2hvbGUgaW1hZ2UgZmlyc3QgdG8gYXZvaWQgbWFraW5nIGl0IDcgdGltZXM6ICovCisgICAgICAgICBmb3IgKHk9MDsgeTxoOyArK3kpCisgICAgICAgICAgICBzaXplX3JvdyhpbWFnZVt5XSwgdyAqIHBpeGVsX3NpemUsIHkpOworCisgICAgICAgICBmb3IgKHBhc3M9MDsgcGFzczxucGFzc2VzOyArK3Bhc3MpCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGUgZm9sbG93aW5nIHR3byBhcmUgZm9yIGNoZWNraW5nIHRoZSBtYWNyb3M6ICovCisgICAgICAgICAgICBjb25zdCBwbmdfdWludF8zMiB3UGFzcyA9IFBOR19QQVNTX0NPTFModywgcGFzcyk7CisKKyAgICAgICAgICAgIC8qIElmIGRvX2ludGVybGFjZSBpcyBzZXQgd2UgZG9uJ3QgY2FsbCBwbmdfd3JpdGVfcm93IGZvciBldmVyeQorICAgICAgICAgICAgICogcm93IGJlY2F1c2Ugc29tZSBvZiB0aGVtIGFyZSBlbXB0eS4gIEluIGZhY3QsIGZvciBhIDF4MSBpbWFnZSwKKyAgICAgICAgICAgICAqIG1vc3Qgb2YgdGhlbSBhcmUgZW1wdHkhCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGZvciAoeT0wOyB5PGg7ICsreSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19jb25zdF9ieXRlcCByb3cgPSBpbWFnZVt5XTsKKyAgICAgICAgICAgICAgIHBuZ19ieXRlIHRlbXBSb3dbU0laRV9ST1dNQVhdOworCisgICAgICAgICAgICAgICAvKiBJZiBkb19pbnRlcmxhY2UgKmFuZCogdGhlIGltYWdlIGlzIGludGVybGFjZWQgd2UKKyAgICAgICAgICAgICAgICAqIG5lZWQgYSByZWR1Y2VkIGludGVybGFjZSByb3c7IHRoaXMgbWF5IGJlIHJlZHVjZWQKKyAgICAgICAgICAgICAgICAqIHRvIGVtcHR5LgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICBpZiAoZG9faW50ZXJsYWNlICYmIGludGVybGFjZV90eXBlID09IFBOR19JTlRFUkxBQ0VfQURBTTcpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiBUaGUgcm93IG11c3Qgbm90IGJlIHdyaXR0ZW4gaWYgaXQgZG9lc24ndCBleGlzdCwgbm90aWNlCisgICAgICAgICAgICAgICAgICAgKiB0aGF0IHRoZXJlIGFyZSB0d28gY29uZGl0aW9ucyBoZXJlLCBlaXRoZXIgdGhlIHJvdyBpc24ndAorICAgICAgICAgICAgICAgICAgICogZXZlciBpbiB0aGUgcGFzcyBvciB0aGUgcm93IHdvdWxkIGJlIGJ1dCBpc24ndCB3aWRlCisgICAgICAgICAgICAgICAgICAgKiBlbm91Z2ggdG8gY29udHJpYnV0ZSBhbnkgcGl4ZWxzLiAgSW4gZmFjdCB0aGUgd1Bhc3MgdGVzdAorICAgICAgICAgICAgICAgICAgICogY2FuIGJlIHVzZWQgdG8gc2tpcCB0aGUgd2hvbGUgeSBsb29wIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgaWYgKFBOR19ST1dfSU5fSU5URVJMQUNFX1BBU1MoeSwgcGFzcykgJiYgd1Bhc3MgPiAwKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRvIGFsbCAxJ3MgZm9yIGVycm9yIGRldGVjdGlvbiAobGlicG5nIHRlbmRzIHRvCisgICAgICAgICAgICAgICAgICAgICAgKiBzZXQgdW5zZXQgdGhpbmdzIHRvIDApLgorICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICBtZW1zZXQodGVtcFJvdywgMHhmZiwgc2l6ZW9mIHRlbXBSb3cpOworICAgICAgICAgICAgICAgICAgICAgaW50ZXJsYWNlX3Jvdyh0ZW1wUm93LCByb3csIHBpeGVsX3NpemUsIHcsIHBhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwLypkYXRhIGFsd2F5cyBiaWdlbmRpYW4qLyk7CisgICAgICAgICAgICAgICAgICAgICByb3cgPSB0ZW1wUm93OworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICB9CisKKyMgICAgICAgICAgIGlmZGVmIFBOR19XUklURV9GSUxURVJfU1VQUE9SVEVECisgICAgICAgICAgICAgICAvKiBPbmx5IGdldCB0byBoZXJlIGlmIHRoZSByb3cgaGFzIHNvbWUgcGl4ZWxzIGluIGl0LCBzZXQgdGhlCisgICAgICAgICAgICAgICAgKiBmaWx0ZXJzIHRvICdhbGwnIGZvciB0aGUgdmVyeSBmaXJzdCByb3cgYW5kIHRoZXJlYWZ0ZXIgdG8gYQorICAgICAgICAgICAgICAgICogc2luZ2xlIGZpbHRlci4gIEl0IGlzbid0IHdlbGwgZG9jdW1lbnRlZCwgYnV0IHBuZ19zZXRfZmlsdGVyCisgICAgICAgICAgICAgICAgKiBkb2VzIGFjY2VwdCBhIGZpbHRlciBudW1iZXIgKHBlciB0aGUgc3BlYykgYXMgd2VsbCBhcyBhIGJpdAorICAgICAgICAgICAgICAgICogbWFzay4KKyAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgKiBUaGUgYXBwYXJlbnQgd2Fja2luZXNzIG9mIGRlY3JlbWVudGluZyBuZmlsdGVyIHJhdGhlciB0aGFuCisgICAgICAgICAgICAgICAgKiBpbmNyZW1lbnRpbmcgaXMgc28gdGhhdCBQYWV0aCBnZXRzIHVzZWQgaW4gYWxsIGltYWdlcyBiaWdnZXIKKyAgICAgICAgICAgICAgICAqIHRoYW4gMSByb3cgLSBpdCdzIHRoZSB0cmlja3kgb25lLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICBwbmdfc2V0X2ZpbHRlcihwcCwgMC8qbWV0aG9kKi8sCisgICAgICAgICAgICAgICAgICBuZmlsdGVyID49IFBOR19GSUxURVJfVkFMVUVfTEFTVCA/IFBOR19BTExfRklMVEVSUyA6IG5maWx0ZXIpOworCisgICAgICAgICAgICAgICBpZiAobmZpbHRlci0tID09IDApCisgICAgICAgICAgICAgICAgICBuZmlsdGVyID0gUE5HX0ZJTFRFUl9WQUxVRV9MQVNULTE7CisjICAgICAgICAgICBlbmRpZgorCisgICAgICAgICAgICAgICBwbmdfd3JpdGVfcm93KHBwLCByb3cpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorCisjaWZkZWYgUE5HX1RFWFRfU1VQUE9SVEVECisgICAgICB7CisgICAgICAgICBzdGF0aWMgY2hhciBrZXlbXSA9ICJlbmQgbWFya2VyIjsKKyAgICAgICAgIHN0YXRpYyBjaGFyIGNvbW1lbnRbXSA9ICJlbmQiOworICAgICAgICAgcG5nX3RleHQgdGV4dDsKKworICAgICAgICAgLyogVXNlIGEgY29tcHJlc3NlZCB0ZXh0IHN0cmluZyB0byB0ZXN0IHRoZSBjb3JyZWN0IGludGVyYWN0aW9uIG9mIHRleHQKKyAgICAgICAgICAqIGNvbXByZXNzaW9uIGFuZCBJREFUIGNvbXByZXNzaW9uLgorICAgICAgICAgICovCisgICAgICAgICB0ZXh0LmNvbXByZXNzaW9uID0gVEVYVF9DT01QUkVTU0lPTjsKKyAgICAgICAgIHRleHQua2V5ID0ga2V5OworICAgICAgICAgdGV4dC50ZXh0ID0gY29tbWVudDsKKyAgICAgICAgIHRleHQudGV4dF9sZW5ndGggPSAoc2l6ZW9mIGNvbW1lbnQpLTE7CisgICAgICAgICB0ZXh0Lml0eHRfbGVuZ3RoID0gMDsKKyAgICAgICAgIHRleHQubGFuZyA9IDA7CisgICAgICAgICB0ZXh0Lmxhbmdfa2V5ID0gMDsKKworICAgICAgICAgcG5nX3NldF90ZXh0KHBwLCBwaSwgJnRleHQsIDEpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHBuZ193cml0ZV9lbmQocHAsIHBpKTsKKworICAgICAgLyogQW5kIHN0b3JlIHRoaXMgdW5kZXIgdGhlIGFwcHJvcHJpYXRlIGlkLCB0aGVuIGNsZWFuIHVwLiAqLworICAgICAgc3RvcmVfc3RvcmVmaWxlKHBzLCBpZCk7CisKKyAgICAgIHN0b3JlX3dyaXRlX3Jlc2V0KHBzKTsKKyAgIH0KKworICAgQ2F0Y2goZmF1bHQpCisgICB7CisgICAgICAvKiBVc2UgdGhlIHBuZ19zdG9yZSByZXR1cm5lZCBieSB0aGUgZXhjZXB0aW9uLiBUaGlzIG1heSBoZWxwIHRoZSBjb21waWxlcgorICAgICAgICogYmVjYXVzZSAncHMnIGlzIG5vdCB1c2VkIGluIHRoaXMgYnJhbmNoIG9mIHRoZSBzZXRqbXAuICBOb3RlIHRoYXQgZmF1bHQKKyAgICAgICAqIGFuZCBwcyB3aWxsIGFsd2F5cyBiZSB0aGUgc2FtZSB2YWx1ZS4KKyAgICAgICAqLworICAgICAgc3RvcmVfd3JpdGVfcmVzZXQoZmF1bHQpOworICAgfQorfQorCitzdGF0aWMgdm9pZAorbWFrZV9zaXplKHBuZ19zdG9yZSogY29uc3QgcHMsIHBuZ19ieXRlIGNvbnN0IGNvbG91cl90eXBlLCBpbnQgYmRsbywKKyAgICBpbnQgY29uc3QgYmRoaSkKK3sKKyAgIGZvciAoOyBiZGxvIDw9IGJkaGk7ICsrYmRsbykKKyAgIHsKKyAgICAgIHBuZ191aW50XzMyIHdpZHRoOworCisgICAgICBmb3IgKHdpZHRoID0gMTsgd2lkdGggPD0gMTY7ICsrd2lkdGgpCisgICAgICB7CisgICAgICAgICBwbmdfdWludF8zMiBoZWlnaHQ7CisKKyAgICAgICAgIGZvciAoaGVpZ2h0ID0gMTsgaGVpZ2h0IDw9IDE2OyArK2hlaWdodCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoZSBmb3VyIGNvbWJpbmF0aW9ucyBvZiBESVkgaW50ZXJsYWNlIGFuZCBpbnRlcmxhY2Ugb3Igbm90IC0KKyAgICAgICAgICAgICAqIG5vIGludGVybGFjZSArIERJWSBzaG91bGQgYmUgaWRlbnRpY2FsIHRvIG5vIGludGVybGFjZSB3aXRoCisgICAgICAgICAgICAgKiBsaWJwbmcgZG9pbmcgaXQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1ha2Vfc2l6ZV9pbWFnZShwcywgY29sb3VyX3R5cGUsIERFUFRIKGJkbG8pLCBQTkdfSU5URVJMQUNFX05PTkUsCisgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCAwKTsKKyAgICAgICAgICAgIG1ha2Vfc2l6ZV9pbWFnZShwcywgY29sb3VyX3R5cGUsIERFUFRIKGJkbG8pLCBQTkdfSU5URVJMQUNFX05PTkUsCisgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCAxKTsKKyMgICAgICAgIGlmZGVmIFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQKKyAgICAgICAgICAgIG1ha2Vfc2l6ZV9pbWFnZShwcywgY29sb3VyX3R5cGUsIERFUFRIKGJkbG8pLCBQTkdfSU5URVJMQUNFX0FEQU03LAorICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgMCk7CisjICAgICAgICBlbmRpZgorIyAgICAgICAgaWYgQ0FOX1dSSVRFX0lOVEVSTEFDRQorICAgICAgICAgICAgLyogMS43LjAgcmVtb3ZlcyB0aGUgaGFjayB0aGF0IHByZXZlbnRlZCBhcHAgd3JpdGUgb2YgYW4gaW50ZXJsYWNlZAorICAgICAgICAgICAgICogaW1hZ2UgaWYgV1JJVEVfSU5URVJMQUNFIHdhcyBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1ha2Vfc2l6ZV9pbWFnZShwcywgY29sb3VyX3R5cGUsIERFUFRIKGJkbG8pLCBQTkdfSU5URVJMQUNFX0FEQU03LAorICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgMSk7CisjICAgICAgICBlbmRpZgorICAgICAgICAgfQorICAgICAgfQorICAgfQorfQorCitzdGF0aWMgdm9pZAorbWFrZV9zaXplX2ltYWdlcyhwbmdfc3RvcmUgKnBzKQoreworICAgLyogVGhpcyBpcyBpbiBjYXNlIG9mIGVycm9ycy4gKi8KKyAgIHNhZmVjYXQocHMtPnRlc3QsIHNpemVvZiBwcy0+dGVzdCwgMCwgIm1ha2Ugc2l6ZSBpbWFnZXMiKTsKKworICAgLyogQXJndW1lbnRzIGFyZSBjb2xvdXJfdHlwZSwgbG93IGJpdCBkZXB0aCwgaGlnaCBiaXQgZGVwdGgKKyAgICAqLworICAgbWFrZV9zaXplKHBzLCAwLCAwLCBXUklURV9CREhJKTsKKyAgIG1ha2Vfc2l6ZShwcywgMiwgMywgV1JJVEVfQkRISSk7CisgICBtYWtlX3NpemUocHMsIDMsIDAsIDMgLypwYWxldHRlOiBtYXggOCBiaXRzKi8pOworICAgbWFrZV9zaXplKHBzLCA0LCAzLCBXUklURV9CREhJKTsKKyAgIG1ha2Vfc2l6ZShwcywgNiwgMywgV1JJVEVfQkRISSk7Cit9CisKKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKKy8qIFJldHVybiBhIHJvdyBiYXNlZCBvbiBpbWFnZSBpZCBhbmQgJ3knIGZvciBjaGVja2luZzogKi8KK3N0YXRpYyB2b2lkCitzdGFuZGFyZF9yb3cocG5nX2NvbnN0X3N0cnVjdHAgcHAsIHBuZ19ieXRlIHN0ZFtTVEFOREFSRF9ST1dNQVhdLAorICAgcG5nX3VpbnRfMzIgaWQsIHBuZ191aW50XzMyIHkpCit7CisgICBpZiAoV0lEVEhfRlJPTV9JRChpZCkgPT0gMCkKKyAgICAgIHRyYW5zZm9ybV9yb3cocHAsIHN0ZCwgQ09MX0ZST01fSUQoaWQpLCBERVBUSF9GUk9NX0lEKGlkKSwgeSk7CisgICBlbHNlCisgICAgICBzaXplX3JvdyhzdGQsIFdJRFRIX0ZST01fSUQoaWQpICogYml0X3NpemUocHAsIENPTF9GUk9NX0lEKGlkKSwKKyAgICAgICAgIERFUFRIX0ZST01fSUQoaWQpKSwgeSk7Cit9CisjZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICovCisKKy8qIFRlc3RzIC0gaW5kaXZpZHVhbCB0ZXN0IGNhc2VzICovCisvKiBMaWtlICdtYWtlX3N0YW5kYXJkJyBidXQgZXJyb3JzIGFyZSBkZWxpYmVyYXRlbHkgaW50cm9kdWNlZCBpbnRvIHRoZSBjYWxscworICogdG8gZW5zdXJlIHRoYXQgdGhleSBnZXQgZGV0ZWN0ZWQgLSBpdCBzaG91bGQgbm90IGJlIHBvc3NpYmxlIHRvIHdyaXRlIGFuCisgKiBpbnZhbGlkIGltYWdlIHdpdGggbGlicG5nIQorICovCisvKiBUT0RPOiB0aGUgJ3NldCcgZnVuY3Rpb25zIGNhbiBwcm9iYWJseSBhbGwgYmUgbWFkZSB0byB0YWtlIGEKKyAqIHBuZ19jb25zdF9zdHJ1Y3RwIHJhdGhlciB0aGFuIGEgbW9kaWZpYWJsZSBvbmUuCisgKi8KKyNpZmRlZiBQTkdfV0FSTklOR1NfU1VQUE9SVEVECitzdGF0aWMgdm9pZAorc0JJVDBfZXJyb3JfZm4ocG5nX3N0cnVjdHAgcHAsIHBuZ19pbmZvcCBwaSkKK3sKKyAgIC8qIDAgaXMgaW52YWxpZC4uLiAqLworICAgcG5nX2NvbG9yXzggYmFkOworICAgYmFkLnJlZCA9IGJhZC5ncmVlbiA9IGJhZC5ibHVlID0gYmFkLmdyYXkgPSBiYWQuYWxwaGEgPSAwOworICAgcG5nX3NldF9zQklUKHBwLCBwaSwgJmJhZCk7Cit9CisKK3N0YXRpYyB2b2lkCitzQklUX2Vycm9yX2ZuKHBuZ19zdHJ1Y3RwIHBwLCBwbmdfaW5mb3AgcGkpCit7CisgICBwbmdfYnl0ZSBiaXRfZGVwdGg7CisgICBwbmdfY29sb3JfOCBiYWQ7CisKKyAgIGlmIChwbmdfZ2V0X2NvbG9yX3R5cGUocHAsIHBpKSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQorICAgICAgYml0X2RlcHRoID0gODsKKworICAgZWxzZQorICAgICAgYml0X2RlcHRoID0gcG5nX2dldF9iaXRfZGVwdGgocHAsIHBpKTsKKworICAgLyogTm93IHdlIGtub3cgdGhlIGJpdCBkZXB0aCB3ZSBjYW4gZWFzaWx5IGdlbmVyYXRlIGFuIGludmFsaWQgc0JJVCBlbnRyeSAqLworICAgYmFkLnJlZCA9IGJhZC5ncmVlbiA9IGJhZC5ibHVlID0gYmFkLmdyYXkgPSBiYWQuYWxwaGEgPQorICAgICAgKHBuZ19ieXRlKShiaXRfZGVwdGgrMSk7CisgICBwbmdfc2V0X3NCSVQocHAsIHBpLCAmYmFkKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdAoreworICAgdm9pZCAgICAgICAgICAoKmZuKShwbmdfc3RydWN0cCwgcG5nX2luZm9wKTsKKyAgIGNvbnN0IGNoYXIgKm1zZzsKKyAgIHVuc2lnbmVkIGludCAgICB3YXJuaW5nIDoxOyAvKiB0aGUgZXJyb3IgaXMgYSB3YXJuaW5nLi4uICovCit9IGVycm9yX3Rlc3RbXSA9CisgICAgeworICAgICAgIC8qIG5vIHdhcm5pbmdzIG1ha2VzIHRoZXNlIGVycm9ycyB1bmRldGVjdGFibGUgcHJpb3IgdG8gMS43LjAgKi8KKyAgICAgICB7IHNCSVQwX2Vycm9yX2ZuLCAic0JJVCgwKTogZmFpbGVkIHRvIGRldGVjdCBlcnJvciIsCisgICAgICAgICBQTkdfTElCUE5HX1ZFUiA8IDEwNzAwIH0sCisKKyAgICAgICB7IHNCSVRfZXJyb3JfZm4sICJzQklUKHRvbyBiaWcpOiBmYWlsZWQgdG8gZGV0ZWN0IGVycm9yIiwKKyAgICAgICAgIFBOR19MSUJQTkdfVkVSIDwgMTA3MDAgfSwKKyAgICB9OworCitzdGF0aWMgdm9pZAorbWFrZV9lcnJvcihwbmdfc3RvcmUqIGNvbnN0IHBzLCBwbmdfYnl0ZSBjb25zdCBjb2xvdXJfdHlwZSwKKyAgICBwbmdfYnl0ZSBiaXRfZGVwdGgsIGludCBpbnRlcmxhY2VfdHlwZSwgaW50IHRlc3QsIHBuZ19jb25zdF9jaGFycCBuYW1lKQoreworICAgY29udGV4dChwcywgZmF1bHQpOworCisgICBjaGVja19pbnRlcmxhY2VfdHlwZShpbnRlcmxhY2VfdHlwZSk7CisKKyAgIFRyeQorICAgeworICAgICAgcG5nX2luZm9wIHBpOworICAgICAgY29uc3QgcG5nX3N0cnVjdHAgcHAgPSBzZXRfc3RvcmVfZm9yX3dyaXRlKHBzLCAmcGksIG5hbWUpOworICAgICAgcG5nX3VpbnRfMzIgdywgaDsKKyAgICAgIGdudV92b2xhdGlsZShwcCkKKworICAgICAgaWYgKHBwID09IE5VTEwpCisgICAgICAgICBUaHJvdyBwczsKKworICAgICAgdyA9IHRyYW5zZm9ybV93aWR0aChwcCwgY29sb3VyX3R5cGUsIGJpdF9kZXB0aCk7CisgICAgICBnbnVfdm9sYXRpbGUodykKKyAgICAgIGggPSB0cmFuc2Zvcm1faGVpZ2h0KHBwLCBjb2xvdXJfdHlwZSwgYml0X2RlcHRoKTsKKyAgICAgIGdudV92b2xhdGlsZShoKQorICAgICAgcG5nX3NldF9JSERSKHBwLCBwaSwgdywgaCwgYml0X2RlcHRoLCBjb2xvdXJfdHlwZSwgaW50ZXJsYWNlX3R5cGUsCisgICAgICAgICAgICBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFLCBQTkdfRklMVEVSX1RZUEVfQkFTRSk7CisKKyAgICAgIGlmIChjb2xvdXJfdHlwZSA9PSAzKSAvKiBwYWxldHRlICovCisgICAgICAgICBpbml0X3N0YW5kYXJkX3BhbGV0dGUocHMsIHBwLCBwaSwgMVUgPDwgYml0X2RlcHRoLCAwLypkbyB0Uk5TKi8pOworCisgICAgICAvKiBUaW1lIGZvciBhIGZldyBlcnJvcnM7IHRoZXNlIGFyZSBpbiB2YXJpb3VzIG9wdGlvbmFsIGNodW5rcywgdGhlCisgICAgICAgKiBzdGFuZGFyZCB0ZXN0cyB0ZXN0IHRoZSBzdGFuZGFyZCBjaHVua3MgcHJldHR5IHdlbGwuCisgICAgICAgKi8KKyMgICAgIGRlZmluZSBleGNlcHRpb25fX3ByZXYgZXhjZXB0aW9uX3ByZXZfMQorIyAgICAgZGVmaW5lIGV4Y2VwdGlvbl9fZW52IGV4Y2VwdGlvbl9lbnZfMQorICAgICAgVHJ5CisgICAgICB7CisgICAgICAgICBnbnVfdm9sYXRpbGUoZXhjZXB0aW9uX19wcmV2KQorCisgICAgICAgICAvKiBFeHBlY3QgdGhpcyB0byB0aHJvdzogKi8KKyAgICAgICAgIHBzLT5leHBlY3RfZXJyb3IgPSAhZXJyb3JfdGVzdFt0ZXN0XS53YXJuaW5nOworICAgICAgICAgcHMtPmV4cGVjdF93YXJuaW5nID0gZXJyb3JfdGVzdFt0ZXN0XS53YXJuaW5nOworICAgICAgICAgcHMtPnNhd193YXJuaW5nID0gMDsKKyAgICAgICAgIGVycm9yX3Rlc3RbdGVzdF0uZm4ocHAsIHBpKTsKKworICAgICAgICAgLyogTm9ybWFsbHkgdGhlIGVycm9yIGlzIG9ubHkgZGV0ZWN0ZWQgaGVyZTogKi8KKyAgICAgICAgIHBuZ193cml0ZV9pbmZvKHBwLCBwaSk7CisKKyAgICAgICAgIC8qIEFuZCBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgaXQgd2FzIG9ubHkgYSB3YXJuaW5nOiAqLworICAgICAgICAgaWYgKHBzLT5leHBlY3Rfd2FybmluZyAmJiBwcy0+c2F3X3dhcm5pbmcpCisgICAgICAgICAgICBUaHJvdyBwczsKKworICAgICAgICAgLyogSWYgd2UgZ2V0IGhlcmUgdGhlcmUgaXMgYSBwcm9ibGVtLCB3ZSBoYXZlIHN1Y2Nlc3MgLSBubyBlcnJvciBvcgorICAgICAgICAgICogbm8gd2FybmluZyAtIHdoZW4gd2Ugc2hvdWxkbid0IGhhdmUgc3VjY2Vzcy4gIExvZyBhbiBlcnJvci4KKyAgICAgICAgICAqLworICAgICAgICAgc3RvcmVfbG9nKHBzLCBwcCwgZXJyb3JfdGVzdFt0ZXN0XS5tc2csIDEgLyplcnJvciovKTsKKyAgICAgIH0KKworICAgICAgQ2F0Y2ggKGZhdWx0KQorICAgICAgeyAvKiBleHBlY3RlZCBleGl0ICovCisgICAgICB9CisjdW5kZWYgZXhjZXB0aW9uX19wcmV2CisjdW5kZWYgZXhjZXB0aW9uX19lbnYKKworICAgICAgLyogQW5kIGNsZWFyIHRoZXNlIGZsYWdzICovCisgICAgICBwcy0+ZXhwZWN0X2Vycm9yID0gMDsKKyAgICAgIHBzLT5leHBlY3Rfd2FybmluZyA9IDA7CisKKyAgICAgIC8qIE5vdyB3cml0ZSB0aGUgd2hvbGUgaW1hZ2UsIGp1c3QgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGRldGVjdGVkLCBvcgorICAgICAgICogdW5kZXRlY3RlZCwgZXJycm8gaGFzIG5vdCBjcmVhdGVkIHByb2JsZW1zIGluc2lkZSBsaWJwbmcuCisgICAgICAgKi8KKyAgICAgIGlmIChwbmdfZ2V0X3Jvd2J5dGVzKHBwLCBwaSkgIT0KKyAgICAgICAgICB0cmFuc2Zvcm1fcm93c2l6ZShwcCwgY29sb3VyX3R5cGUsIGJpdF9kZXB0aCkpCisgICAgICAgICBwbmdfZXJyb3IocHAsICJyb3cgc2l6ZSBpbmNvcnJlY3QiKTsKKworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgaW50IG5wYXNzZXMgPSBzZXRfd3JpdGVfaW50ZXJsYWNlX2hhbmRsaW5nKHBwLCBpbnRlcmxhY2VfdHlwZSk7CisgICAgICAgICBpbnQgcGFzczsKKworICAgICAgICAgaWYgKG5wYXNzZXMgIT0gbnBhc3Nlc19mcm9tX2ludGVybGFjZV90eXBlKHBwLCBpbnRlcmxhY2VfdHlwZSkpCisgICAgICAgICAgICBwbmdfZXJyb3IocHAsICJ3cml0ZTogcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcgZmFpbGVkIik7CisKKyAgICAgICAgIGZvciAocGFzcz0wOyBwYXNzPG5wYXNzZXM7ICsrcGFzcykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIHk7CisKKyAgICAgICAgICAgIGZvciAoeT0wOyB5PGg7ICsreSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19ieXRlIGJ1ZmZlcltUUkFOU0ZPUk1fUk9XTUFYXTsKKworICAgICAgICAgICAgICAgdHJhbnNmb3JtX3JvdyhwcCwgYnVmZmVyLCBjb2xvdXJfdHlwZSwgYml0X2RlcHRoLCB5KTsKKworIyAgICAgICAgICAgICAgaWYgZG9fb3duX2ludGVybGFjZQorICAgICAgICAgICAgICAgICAgLyogSWYgZG9fb3duX2ludGVybGFjZSAqYW5kKiB0aGUgaW1hZ2UgaXMgaW50ZXJsYWNlZCB3ZSBuZWVkIGEKKyAgICAgICAgICAgICAgICAgICAqIHJlZHVjZWQgaW50ZXJsYWNlIHJvdzsgdGhpcyBtYXkgYmUgcmVkdWNlZCB0byBlbXB0eS4KKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgaWYgKGludGVybGFjZV90eXBlID09IFBOR19JTlRFUkxBQ0VfQURBTTcpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgcm93IG11c3Qgbm90IGJlIHdyaXR0ZW4gaWYgaXQgZG9lc24ndCBleGlzdCwgbm90aWNlCisgICAgICAgICAgICAgICAgICAgICAgKiB0aGF0IHRoZXJlIGFyZSB0d28gY29uZGl0aW9ucyBoZXJlLCBlaXRoZXIgdGhlIHJvdyBpc24ndAorICAgICAgICAgICAgICAgICAgICAgICogZXZlciBpbiB0aGUgcGFzcyBvciB0aGUgcm93IHdvdWxkIGJlIGJ1dCBpc24ndCB3aWRlCisgICAgICAgICAgICAgICAgICAgICAgKiBlbm91Z2ggdG8gY29udHJpYnV0ZSBhbnkgcGl4ZWxzLiAgSW4gZmFjdCB0aGUgd1Bhc3MgdGVzdAorICAgICAgICAgICAgICAgICAgICAgICogY2FuIGJlIHVzZWQgdG8gc2tpcCB0aGUgd2hvbGUgeSBsb29wIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgaWYgKFBOR19ST1dfSU5fSU5URVJMQUNFX1BBU1MoeSwgcGFzcykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfUEFTU19DT0xTKHcsIHBhc3MpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVybGFjZV9yb3coYnVmZmVyLCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRfc2l6ZShwcCwgY29sb3VyX3R5cGUsIGJpdF9kZXB0aCksIHcsIHBhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLypkYXRhIGFsd2F5cyBiaWdlbmRpYW4qLyk7CisgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgIH0KKyMgICAgICAgICAgICAgIGVuZGlmIC8qIGRvX293bl9pbnRlcmxhY2UgKi8KKworICAgICAgICAgICAgICAgcG5nX3dyaXRlX3JvdyhwcCwgYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcG5nX3dyaXRlX2VuZChwcCwgcGkpOworCisgICAgICAvKiBUaGUgZm9sbG93aW5nIGRlbGV0ZXMgdGhlIGZpbGUgdGhhdCB3YXMganVzdCB3cml0dGVuLiAqLworICAgICAgc3RvcmVfd3JpdGVfcmVzZXQocHMpOworICAgfQorCisgICBDYXRjaChmYXVsdCkKKyAgIHsKKyAgICAgIHN0b3JlX3dyaXRlX3Jlc2V0KGZhdWx0KTsKKyAgIH0KK30KKworc3RhdGljIGludAorbWFrZV9lcnJvcnMocG5nX21vZGlmaWVyKiBjb25zdCBwbSwgcG5nX2J5dGUgY29uc3QgY29sb3VyX3R5cGUsCisgICAgaW50IGJkbG8sIGludCBjb25zdCBiZGhpKQoreworICAgZm9yICg7IGJkbG8gPD0gYmRoaTsgKytiZGxvKQorICAgeworICAgICAgaW50IGludGVybGFjZV90eXBlOworCisgICAgICBmb3IgKGludGVybGFjZV90eXBlID0gUE5HX0lOVEVSTEFDRV9OT05FOworICAgICAgICAgICBpbnRlcmxhY2VfdHlwZSA8IElOVEVSTEFDRV9MQVNUOyArK2ludGVybGFjZV90eXBlKQorICAgICAgeworICAgICAgICAgdW5zaWduZWQgaW50IHRlc3Q7CisgICAgICAgICBjaGFyIG5hbWVbRklMRV9OQU1FX1NJWkVdOworCisgICAgICAgICBzdGFuZGFyZF9uYW1lKG5hbWUsIHNpemVvZiBuYW1lLCAwLCBjb2xvdXJfdHlwZSwgMTw8YmRsbywgMCwKKyAgICAgICAgICAgIGludGVybGFjZV90eXBlLCAwLCAwLCBkb19vd25faW50ZXJsYWNlKTsKKworICAgICAgICAgZm9yICh0ZXN0PTA7IHRlc3Q8QVJSQVlfU0laRShlcnJvcl90ZXN0KTsgKyt0ZXN0KQorICAgICAgICAgeworICAgICAgICAgICAgbWFrZV9lcnJvcigmcG0tPnRoaXMsIGNvbG91cl90eXBlLCBERVBUSChiZGxvKSwgaW50ZXJsYWNlX3R5cGUsCisgICAgICAgICAgICAgICB0ZXN0LCBuYW1lKTsKKworICAgICAgICAgICAgaWYgKGZhaWwocG0pKQorICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiAxOyAvKiBrZWVwIGdvaW5nICovCit9CisjZW5kaWYgLyogUE5HX1dBUk5JTkdTX1NVUFBPUlRFRCAqLworCitzdGF0aWMgdm9pZAorcGVyZm9ybV9lcnJvcl90ZXN0KHBuZ19tb2RpZmllciAqcG0pCit7CisjaWZkZWYgUE5HX1dBUk5JTkdTX1NVUFBPUlRFRCAvKiBlbHNlIHRoZXJlIGFyZSBubyBjYXNlcyB0aGF0IHdvcmshICovCisgICAvKiBOZWVkIHRvIGRvIHRoaXMgaGVyZSBiZWNhdXNlIHdlIGp1c3Qgd3JpdGUgaW4gdGhpcyB0ZXN0LiAqLworICAgc2FmZWNhdChwbS0+dGhpcy50ZXN0LCBzaXplb2YgcG0tPnRoaXMudGVzdCwgMCwgImVycm9yIHRlc3QiKTsKKworICAgaWYgKCFtYWtlX2Vycm9ycyhwbSwgMCwgMCwgV1JJVEVfQkRISSkpCisgICAgICByZXR1cm47CisKKyAgIGlmICghbWFrZV9lcnJvcnMocG0sIDIsIDMsIFdSSVRFX0JESEkpKQorICAgICAgcmV0dXJuOworCisgICBpZiAoIW1ha2VfZXJyb3JzKHBtLCAzLCAwLCAzKSkKKyAgICAgIHJldHVybjsKKworICAgaWYgKCFtYWtlX2Vycm9ycyhwbSwgNCwgMywgV1JJVEVfQkRISSkpCisgICAgICByZXR1cm47CisKKyAgIGlmICghbWFrZV9lcnJvcnMocG0sIDYsIDMsIFdSSVRFX0JESEkpKQorICAgICAgcmV0dXJuOworI2Vsc2UKKyAgIFVOVVNFRChwbSkKKyNlbmRpZgorfQorCisvKiBUaGlzIGlzIGp1c3QgdG8gdmFsaWRhdGUgdGhlIGludGVybmFsIFBORyBmb3JtYXR0aW5nIGNvZGUgLSBpZiB0aGlzIGZhaWxzCisgKiB0aGVuIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoZSBsaWJyYXJ5IG91dHB1dHMgd2lsbCBwcm9iYWJseSBiZSBnYXJiYWdlLgorICovCitzdGF0aWMgdm9pZAorcGVyZm9ybV9mb3JtYXR0aW5nX3Rlc3QocG5nX3N0b3JlICpwcykKK3sKKyNpZmRlZiBQTkdfVElNRV9SRkMxMTIzX1NVUFBPUlRFRAorICAgLyogVGhlIGhhbmRsZSBpbnRvIHRoZSBmb3JtYXR0aW5nIGNvZGUgaXMgdGhlIFJGQzExMjMgc3VwcG9ydDsgdGhpcyB0ZXN0IGRvZXMKKyAgICAqIG5vdGhpbmcgaWYgdGhhdCBpcyBjb21waWxlZCBvdXQuCisgICAgKi8KKyAgIGNvbnRleHQocHMsIGZhdWx0KTsKKworICAgVHJ5CisgICB7CisgICAgICBwbmdfY29uc3RfY2hhcnAgY29ycmVjdCA9ICIyOSBBdWcgMjA3OSAxMzo1Mzo2MCArMDAwMCI7CisgICAgICBwbmdfY29uc3RfY2hhcnAgcmVzdWx0OworIyAgICAgaWYgUE5HX0xJQlBOR19WRVIgPj0gMTA2MDAKKyAgICAgICAgIGNoYXIgdGltZXN0cmluZ1syOV07CisjICAgICBlbmRpZgorICAgICAgcG5nX3N0cnVjdHAgcHA7CisgICAgICBwbmdfdGltZSBwdDsKKworICAgICAgcHAgPSBzZXRfc3RvcmVfZm9yX3dyaXRlKHBzLCBOVUxMLCAibGlicG5nIGZvcm1hdHRpbmcgdGVzdCIpOworCisgICAgICBpZiAocHAgPT0gTlVMTCkKKyAgICAgICAgIFRocm93IHBzOworCisKKyAgICAgIC8qIEFyYml0cmFyeSBzZXR0aW5nczogKi8KKyAgICAgIHB0LnllYXIgPSAyMDc5OworICAgICAgcHQubW9udGggPSA4OworICAgICAgcHQuZGF5ID0gMjk7CisgICAgICBwdC5ob3VyID0gMTM7CisgICAgICBwdC5taW51dGUgPSA1MzsKKyAgICAgIHB0LnNlY29uZCA9IDYwOyAvKiBhIGxlYXAgc2Vjb25kICovCisKKyMgICAgIGlmIFBOR19MSUJQTkdfVkVSIDwgMTA2MDAKKyAgICAgICAgIHJlc3VsdCA9IHBuZ19jb252ZXJ0X3RvX3JmYzExMjMocHAsICZwdCk7CisjICAgICBlbHNlCisgICAgICAgICBpZiAocG5nX2NvbnZlcnRfdG9fcmZjMTEyM19idWZmZXIodGltZXN0cmluZywgJnB0KSkKKyAgICAgICAgICAgIHJlc3VsdCA9IHRpbWVzdHJpbmc7CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlc3VsdCA9IE5VTEw7CisjICAgICBlbmRpZgorCisgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgICBwbmdfZXJyb3IocHAsICJwbmdfY29udmVydF90b19yZmMxMTIzIGZhaWxlZCIpOworCisgICAgICBpZiAoc3RyY21wKHJlc3VsdCwgY29ycmVjdCkgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgIHNpemVfdCBwb3MgPSAwOworICAgICAgICAgY2hhciBtc2dbMTI4XTsKKworICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgInBuZ19jb252ZXJ0X3RvX3JmYzExMjMoIik7CisgICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCBjb3JyZWN0KTsKKyAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICIpIHJldHVybmVkOiAnIik7CisgICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCByZXN1bHQpOworICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgIiciKTsKKworICAgICAgICAgcG5nX2Vycm9yKHBwLCBtc2cpOworICAgICAgfQorCisgICAgICBzdG9yZV93cml0ZV9yZXNldChwcyk7CisgICB9CisKKyAgIENhdGNoKGZhdWx0KQorICAgeworICAgICAgc3RvcmVfd3JpdGVfcmVzZXQoZmF1bHQpOworICAgfQorI2Vsc2UKKyAgIFVOVVNFRChwcykKKyNlbmRpZgorfQorCisjaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECisvKiBCZWNhdXNlIHdlIHdhbnQgdG8gdXNlIHRoZSBzYW1lIGNvZGUgaW4gYm90aCB0aGUgcHJvZ3Jlc3NpdmUgcmVhZGVyIGFuZCB0aGUKKyAqIHNlcXVlbnRpYWwgcmVhZGVyIGl0IGlzIG5lY2Vzc2FyeSB0byBkZWFsIHdpdGggdGhlIGZhY3QgdGhhdCB0aGUgcHJvZ3Jlc3NpdmUKKyAqIHJlYWRlciBjYWxsYmFja3Mgb25seSBoYXZlIG9uZSBwYXJhbWV0ZXIgKHBuZ19nZXRfcHJvZ3Jlc3NpdmVfcHRyKCkpLCBzbyB0aGlzCisgKiBtdXN0IGNvbnRhaW4gYWxsIHRoZSB0ZXN0IHBhcmFtZXRlcnMgYW5kIGFsbCB0aGUgbG9jYWwgdmFyaWFibGVzIGRpcmVjdGx5CisgKiBhY2Nlc3NpYmxlIHRvIHRoZSBzZXF1ZW50aWFsIHJlYWRlciBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBUaGUgdGVjaG5pcXVlIGFkb3B0ZWQgaXMgdG8gcmVpbnZlbnQgcGFydCBvZiB3aGF0IERpamtzdHJhIHRlcm1lZCBhCisgKiAnZGlzcGxheSc7IGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIHRoZSBzdGFjayBmcmFtZXMgb2YgZW5jbG9zaW5nIGZ1bmN0aW9ucyBzbworICogdGhhdCBhIG5lc3RlZCBmdW5jdGlvbiBkZWZpbml0aW9uIGNhbiBhY2Nlc3MgdGhlIGxvY2FsIChDIGF1dG8pIHZhcmlhYmxlcyBvZgorICogdGhlIGZ1bmN0aW9ucyB0aGF0IGNvbnRhaW4gaXRzIGRlZmluaXRpb24uICBJbiBmYWN0IEMgcHJvdmlkZXMgdGhlIGZpcnN0CisgKiBwb2ludGVyICh0aGUgbG9jYWwgdmFyaWFibGVzIC0gdGhlIHN0YWNrIGZyYW1lIHBvaW50ZXIpIGFuZCB0aGUgbGFzdCAodGhlCisgKiBnbG9iYWwgdmFyaWFibGVzIC0gdGhlIEJDUEwgZ2xvYmFsIHZlY3RvciB0eXBpY2FsbHkgaW1wbGVtZW50ZWQgYXMgZ2xvYmFsCisgKiBhZGRyZXNzZXMpLCB0aGlzIGNvZGUgcmVxdWlyZXMgb25lIG1vcmUgcG9pbnRlciB0byBtYWtlIHRoZSBkaXNwbGF5IC0gdGhlCisgKiBsb2NhbCB2YXJpYWJsZXMgKGFuZCBmdW5jdGlvbiBjYWxsIHBhcmFtZXRlcnMpIG9mIHRoZSBmdW5jdGlvbiB0aGF0IGFjdHVhbGx5CisgKiBpbnZva2VzIGVpdGhlciB0aGUgcHJvZ3Jlc3NpdmUgb3Igc2VxdWVudGlhbCByZWFkZXIuCisgKgorICogUGVyaGFwcyBjb25mdXNpbmdseSB0aGlzIHRlY2huaXF1ZSBpcyBjb25mb3VuZGVkIHdpdGggY2xhc3NlcyAtIHRoZQorICogJ3N0YW5kYXJkX2Rpc3BsYXknIGRlZmluZWQgaGVyZSBpcyBzdWItY2xhc3NlZCBhcyB0aGUgJ2dhbW1hX2Rpc3BsYXknIGJlbG93LgorICogQSBnYW1tYV9kaXNwbGF5IGlzIGEgc3RhbmRhcmRfZGlzcGxheSwgdGFraW5nIGFkdmFudGFnZSBvZiB0aGUgQU5TSS1DCisgKiByZXF1aXJlbWVudCB0aGF0IHRoZSBwb2ludGVyIHRvIHRoZSBmaXJzdCBtZW1iZXIgb2YgYSBzdHJ1Y3R1cmUgbXVzdCBiZSB0aGUKKyAqIHNhbWUgYXMgdGhlIHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZS4gIFRoaXMgYWxsb3dzIHVzIHRvIHJldXNlIHN0YW5kYXJkXworICogZnVuY3Rpb25zIGluIHRoZSBnYW1tYSB0ZXN0IGNvZGU7IHNvbWV0aGluZyB0aGF0IGNvdWxkIG5vdCBiZSBkb25lIHdpdGgKKyAqIG5lc3RlZCBmdW5jdGlvbnMhCisgKi8KK3R5cGVkZWYgc3RydWN0IHN0YW5kYXJkX2Rpc3BsYXkKK3sKKyAgIHBuZ19zdG9yZSogIHBzOyAgICAgICAgICAgICAvKiBUZXN0IHBhcmFtZXRlcnMgKHBhc3NlZCB0byB0aGUgZnVuY3Rpb24pICovCisgICBwbmdfYnl0ZSAgICBjb2xvdXJfdHlwZTsKKyAgIHBuZ19ieXRlICAgIGJpdF9kZXB0aDsKKyAgIHBuZ19ieXRlICAgIHJlZF9zQklUOyAgICAgICAvKiBJbnB1dCBkYXRhIHNCSVQgdmFsdWVzLiAqLworICAgcG5nX2J5dGUgICAgZ3JlZW5fc0JJVDsKKyAgIHBuZ19ieXRlICAgIGJsdWVfc0JJVDsKKyAgIHBuZ19ieXRlICAgIGFscGhhX3NCSVQ7CisgICBwbmdfYnl0ZSAgICBpbnRlcmxhY2VfdHlwZTsKKyAgIHBuZ19ieXRlICAgIGZpbGxlcjsgICAgICAgICAvKiBPdXRwdXQgaGFzIGEgZmlsbGVyICovCisgICBwbmdfdWludF8zMiBpZDsgICAgICAgICAgICAgLyogQ2FsY3VsYXRlZCBmaWxlIElEICovCisgICBwbmdfdWludF8zMiB3OyAgICAgICAgICAgICAgLyogV2lkdGggb2YgaW1hZ2UgKi8KKyAgIHBuZ191aW50XzMyIGg7ICAgICAgICAgICAgICAvKiBIZWlnaHQgb2YgaW1hZ2UgKi8KKyAgIGludCAgICAgICAgIG5wYXNzZXM7ICAgICAgICAvKiBOdW1iZXIgb2YgaW50ZXJsYWNlZCBwYXNzZXMgKi8KKyAgIHBuZ191aW50XzMyIHBpeGVsX3NpemU7ICAgICAvKiBXaWR0aCBvZiBvbmUgcGl4ZWwgaW4gYml0cyAqLworICAgcG5nX3VpbnRfMzIgYml0X3dpZHRoOyAgICAgIC8qIFdpZHRoIG9mIG91dHB1dCByb3cgaW4gYml0cyAqLworICAgc2l6ZV90ICAgICAgY2JSb3c7ICAgICAgICAgIC8qIEJ5dGVzIGluIGEgcm93IG9mIHRoZSBvdXRwdXQgaW1hZ2UgKi8KKyAgIGludCAgICAgICAgIGRvX2ludGVybGFjZTsgICAvKiBEbyBpbnRlcmxhY2luZyBpbnRlcm5hbGx5ICovCisgICBpbnQgICAgICAgICBsaXR0bGVlbmRpYW47ICAgLyogQXBwIChyb3cpIGRhdGEgaXMgbGl0dGxlIGVuZGlhbiAqLworICAgaW50ICAgICAgICAgaXNfdHJhbnNwYXJlbnQ7IC8qIFRyYW5zcGFyZW5jeSBpbmZvcm1hdGlvbiB3YXMgcHJlc2VudC4gKi8KKyAgIGludCAgICAgICAgIGhhc190Uk5TOyAgICAgICAvKiBjb2xvciB0eXBlIEdSQVkgb3IgUkdCIHdpdGggYSB0Uk5TIGNodW5rLiAqLworICAgaW50ICAgICAgICAgc3BlZWQ7ICAgICAgICAgIC8qIERvaW5nIGEgc3BlZWQgdGVzdCAqLworICAgaW50ICAgICAgICAgdXNlX3VwZGF0ZV9pbmZvOy8qIENhbGwgdXBkYXRlX2luZm8sIG5vdCBzdGFydF9pbWFnZSAqLworICAgc3RydWN0CisgICB7CisgICAgICBwbmdfdWludF8xNiByZWQ7CisgICAgICBwbmdfdWludF8xNiBncmVlbjsKKyAgICAgIHBuZ191aW50XzE2IGJsdWU7CisgICB9ICAgICAgICAgICB0cmFuc3BhcmVudDsgICAgLyogVGhlIHRyYW5zcGFyZW50IGNvbG9yLCBpZiBzZXQuICovCisgICBpbnQgICAgICAgICBucGFsZXR0ZTsgICAgICAgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHBhbGV0dGUuICovCisgICBzdG9yZV9wYWxldHRlCisgICAgICAgICAgICAgICBwYWxldHRlOworfSBzdGFuZGFyZF9kaXNwbGF5OworCitzdGF0aWMgdm9pZAorc3RhbmRhcmRfZGlzcGxheV9pbml0KHN0YW5kYXJkX2Rpc3BsYXkgKmRwLCBwbmdfc3RvcmUqIHBzLCBwbmdfdWludF8zMiBpZCwKKyAgIGludCBkb19pbnRlcmxhY2UsIGludCB1c2VfdXBkYXRlX2luZm8pCit7CisgICBtZW1zZXQoZHAsIDAsIHNpemVvZiAqZHApOworCisgICBkcC0+cHMgPSBwczsKKyAgIGRwLT5jb2xvdXJfdHlwZSA9IENPTF9GUk9NX0lEKGlkKTsKKyAgIGRwLT5iaXRfZGVwdGggPSBERVBUSF9GUk9NX0lEKGlkKTsKKyAgIGlmIChkcC0+Yml0X2RlcHRoIDwgMSB8fCBkcC0+Yml0X2RlcHRoID4gMTYpCisgICAgICBpbnRlcm5hbF9lcnJvcihwcywgImludGVybmFsOiBiYWQgYml0IGRlcHRoIik7CisgICBpZiAoZHAtPmNvbG91cl90eXBlID09IDMpCisgICAgICBkcC0+cmVkX3NCSVQgPSBkcC0+Ymx1ZV9zQklUID0gZHAtPmdyZWVuX3NCSVQgPSBkcC0+YWxwaGFfc0JJVCA9IDg7CisgICBlbHNlCisgICAgICBkcC0+cmVkX3NCSVQgPSBkcC0+Ymx1ZV9zQklUID0gZHAtPmdyZWVuX3NCSVQgPSBkcC0+YWxwaGFfc0JJVCA9CisgICAgICAgICBkcC0+Yml0X2RlcHRoOworICAgZHAtPmludGVybGFjZV90eXBlID0gSU5URVJMQUNFX0ZST01fSUQoaWQpOworICAgY2hlY2tfaW50ZXJsYWNlX3R5cGUoZHAtPmludGVybGFjZV90eXBlKTsKKyAgIGRwLT5pZCA9IGlkOworICAgLyogQWxsIHRoZSByZXN0IGFyZSBmaWxsZWQgaW4gYWZ0ZXIgdGhlIHJlYWRfaW5mbzogKi8KKyAgIGRwLT53ID0gMDsKKyAgIGRwLT5oID0gMDsKKyAgIGRwLT5ucGFzc2VzID0gMDsKKyAgIGRwLT5waXhlbF9zaXplID0gMDsKKyAgIGRwLT5iaXRfd2lkdGggPSAwOworICAgZHAtPmNiUm93ID0gMDsKKyAgIGRwLT5kb19pbnRlcmxhY2UgPSBkb19pbnRlcmxhY2U7CisgICBkcC0+bGl0dGxlZW5kaWFuID0gMDsKKyAgIGRwLT5pc190cmFuc3BhcmVudCA9IDA7CisgICBkcC0+c3BlZWQgPSBwcy0+c3BlZWQ7CisgICBkcC0+dXNlX3VwZGF0ZV9pbmZvID0gdXNlX3VwZGF0ZV9pbmZvOworICAgZHAtPm5wYWxldHRlID0gMDsKKyAgIC8qIFByZXNldCB0aGUgdHJhbnNwYXJlbnQgY29sb3IgdG8gYmxhY2s6ICovCisgICBtZW1zZXQoJmRwLT50cmFuc3BhcmVudCwgMCwgc2l6ZW9mIGRwLT50cmFuc3BhcmVudCk7CisgICAvKiBQcmVzZXQgdGhlIHBhbGV0dGUgdG8gZnVsbCBpbnRlbnNpdHkvb3BhcXVlIHRocm91Z291dDogKi8KKyAgIG1lbXNldChkcC0+cGFsZXR0ZSwgMHhmZiwgc2l6ZW9mIGRwLT5wYWxldHRlKTsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgcGFsZXR0ZSBmaWVsZHMgLSB0aGlzIG11c3QgYmUgZG9uZSBsYXRlciBiZWNhdXNlIHRoZSBwYWxldHRlCisgKiBjb21lcyBmcm9tIHRoZSBwYXJ0aWN1bGFyIHBuZ19zdG9yZV9maWxlIHRoYXQgaXMgc2VsZWN0ZWQuCisgKi8KK3N0YXRpYyB2b2lkCitzdGFuZGFyZF9wYWxldHRlX2luaXQoc3RhbmRhcmRfZGlzcGxheSAqZHApCit7CisgICBzdG9yZV9wYWxldHRlX2VudHJ5ICpwYWxldHRlID0gc3RvcmVfY3VycmVudF9wYWxldHRlKGRwLT5wcywgJmRwLT5ucGFsZXR0ZSk7CisKKyAgIC8qIFRoZSByZW1haW5pbmcgZW50cmllcyByZW1haW4gd2hpdGUvb3BhcXVlLiAqLworICAgaWYgKGRwLT5ucGFsZXR0ZSA+IDApCisgICB7CisgICAgICBpbnQgaSA9IGRwLT5ucGFsZXR0ZTsKKyAgICAgIG1lbWNweShkcC0+cGFsZXR0ZSwgcGFsZXR0ZSwgaSAqIHNpemVvZiAqcGFsZXR0ZSk7CisKKyAgICAgIC8qIENoZWNrIGZvciBhIG5vbi1vcGFxdWUgcGFsZXR0ZSBlbnRyeTogKi8KKyAgICAgIHdoaWxlICgtLWkgPj0gMCkKKyAgICAgICAgIGlmIChwYWxldHRlW2ldLmFscGhhIDwgMjU1KQorICAgICAgICAgICAgYnJlYWs7CisKKyMgICAgIGlmZGVmIF9fR05VQ19fCisgICAgICAgICAvKiBHQ0MgY2FuJ3QgaGFuZGxlIHRoZSBtb3JlIG9idmlvdXNseSBvcHRpbWl6YWJsZSB2ZXJzaW9uLiAqLworICAgICAgICAgaWYgKGkgPj0gMCkKKyAgICAgICAgICAgIGRwLT5pc190cmFuc3BhcmVudCA9IDE7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBkcC0+aXNfdHJhbnNwYXJlbnQgPSAwOworIyAgICAgZWxzZQorICAgICAgICAgZHAtPmlzX3RyYW5zcGFyZW50ID0gKGkgPj0gMCk7CisjICAgICBlbmRpZgorICAgfQorfQorCisvKiBVdGlsaXR5IHRvIHJlYWQgdGhlIHBhbGV0dGUgZnJvbSB0aGUgUE5HIGZpbGUgYW5kIGNvbnZlcnQgaXQgaW50bworICogc3RvcmVfcGFsZXR0ZSBmb3JtYXQuICBUaGlzIHJldHVybnMgMSBpZiB0aGVyZSBpcyBhbnkgdHJhbnNwYXJlbmN5IGluIHRoZQorICogcGFsZXR0ZSAoaXQgZG9lcyBub3QgY2hlY2sgZm9yIGEgdHJhbnNwYXJlbnQgY29sb3VyIGluIHRoZSBub24tcGFsZXR0ZSBjYXNlLikKKyAqLworc3RhdGljIGludAorcmVhZF9wYWxldHRlKHN0b3JlX3BhbGV0dGUgcGFsZXR0ZSwgaW50ICpucGFsZXR0ZSwgcG5nX2NvbnN0X3N0cnVjdHAgcHAsCisgICBwbmdfaW5mb3AgcGkpCit7CisgICBwbmdfY29sb3JwIHBhbDsKKyAgIHBuZ19ieXRlcCB0cmFuc19hbHBoYTsKKyAgIGludCBudW07CisKKyAgIHBhbCA9IDA7CisgICAqbnBhbGV0dGUgPSAtMTsKKworICAgaWYgKHBuZ19nZXRfUExURShwcCwgcGksICZwYWwsIG5wYWxldHRlKSAmIFBOR19JTkZPX1BMVEUpCisgICB7CisgICAgICBpbnQgaSA9ICpucGFsZXR0ZTsKKworICAgICAgaWYgKGkgPD0gMCB8fCBpID4gMjU2KQorICAgICAgICAgcG5nX2Vycm9yKHBwLCAidmFsaWRhdGU6IGludmFsaWQgUExURSBjb3VudCIpOworCisgICAgICB3aGlsZSAoLS1pID49IDApCisgICAgICB7CisgICAgICAgICBwYWxldHRlW2ldLnJlZCA9IHBhbFtpXS5yZWQ7CisgICAgICAgICBwYWxldHRlW2ldLmdyZWVuID0gcGFsW2ldLmdyZWVuOworICAgICAgICAgcGFsZXR0ZVtpXS5ibHVlID0gcGFsW2ldLmJsdWU7CisgICAgICB9CisKKyAgICAgIC8qIE1hcmsgdGhlIHJlbWFpbmRlciBvZiB0aGUgZW50cmllcyB3aXRoIGEgZmxhZyB2YWx1ZSAob3RoZXIgdGhhbgorICAgICAgICogd2hpdGUvb3BhcXVlIHdoaWNoIGlzIHRoZSBmbGFnIHZhbHVlIHN0b3JlZCBhYm92ZS4pCisgICAgICAgKi8KKyAgICAgIG1lbXNldChwYWxldHRlICsgKm5wYWxldHRlLCAxMjYsICgyNTYtKm5wYWxldHRlKSAqIHNpemVvZiAqcGFsZXR0ZSk7CisgICB9CisKKyAgIGVsc2UgLyogIXBuZ19nZXRfUExURSAqLworICAgeworICAgICAgaWYgKCpucGFsZXR0ZSAhPSAoLTEpKQorICAgICAgICAgcG5nX2Vycm9yKHBwLCAidmFsaWRhdGU6IGludmFsaWQgUExURSByZXN1bHQiKTsKKyAgICAgIC8qIEJ1dCB0aGVyZSBpcyBubyBwYWxldHRlLCBzbyByZWNvcmQgdGhpczogKi8KKyAgICAgICpucGFsZXR0ZSA9IDA7CisgICAgICBtZW1zZXQocGFsZXR0ZSwgMTEzLCBzaXplb2YgKHN0b3JlX3BhbGV0dGUpKTsKKyAgIH0KKworICAgdHJhbnNfYWxwaGEgPSAwOworICAgbnVtID0gMjsgLyogZm9yY2UgZXJyb3IgYmVsb3cgKi8KKyAgIGlmICgocG5nX2dldF90Uk5TKHBwLCBwaSwgJnRyYW5zX2FscGhhLCAmbnVtLCAwKSAmIFBOR19JTkZPX3RSTlMpICE9IDAgJiYKKyAgICAgICh0cmFuc19hbHBoYSAhPSBOVUxMIHx8IG51bSAhPSAxLypyZXR1cm5zIDEgZm9yIGEgdHJhbnNwYXJlbnQgY29sb3IqLykgJiYKKyAgICAgIC8qIE9vcHMsIGlmIGEgcGFsZXR0ZSB0Uk5TIGdldHMgZXhwYW5kZWQgcG5nX3JlYWRfdXBkYXRlX2luZm8gKGF0IGxlYXN0IHNvCisgICAgICAgKiBmYXIgYXMgMS41LjQpIGRvZXMgbm90IHJlbW92ZSB0aGUgdHJhbnNfYWxwaGEgcG9pbnRlciwgb25seSBudW1fdHJhbnMsCisgICAgICAgKiBzbyBpbiB0aGUgYWJvdmUgY2FsbCB3ZSBnZXQgYSBzdWNjZXNzLCB3ZSBnZXQgYSBwb2ludGVyICh3aG8ga25vd3Mgd2hhdAorICAgICAgICogdG8pIGFuZCB3ZSBnZXQgbnVtX3RyYW5zID09IDA6CisgICAgICAgKi8KKyAgICAgICEodHJhbnNfYWxwaGEgIT0gTlVMTCAmJiBudW0gPT0gMCkpIC8qIFRPRE86IGZpeCB0aGlzIGluIGxpYnBuZy4gKi8KKyAgIHsKKyAgICAgIGludCBpOworCisgICAgICAvKiBBbnkgb2YgdGhlc2UgYXJlIGNyYXNoLXdvcnRoeSAtIGdpdmVuIHRoZSBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAgICogcG5nX2dldF90Uk5TIHVwIHRvIDEuNSBhbiBhcHAgd29uJ3QgY3Jhc2ggaWYgaXQganVzdCBjaGVja3MgdGhlCisgICAgICAgKiByZXN1bHQgYWJvdmUgYW5kIGZhaWxzIHRvIGNoZWNrIHRoYXQgdGhlIHZhcmlhYmxlcyBpdCBwYXNzZWQgaGF2ZQorICAgICAgICogYWN0dWFsbHkgYmVlbiBmaWxsZWQgaW4hICBOb3RlIHRoYXQgaWYgdGhlIGFwcCB3ZXJlIHRvIHBhc3MgdGhlCisgICAgICAgKiBsYXN0LCBwbmdfY29sb3JfMTZwLCB2YXJpYWJsZSB0b28gaXQgY291bGRuJ3QgcmVseSBvbiB0aGlzLgorICAgICAgICovCisgICAgICBpZiAodHJhbnNfYWxwaGEgPT0gTlVMTCB8fCBudW0gPD0gMCB8fCBudW0gPiAyNTYgfHwgbnVtID4gKm5wYWxldHRlKQorICAgICAgICAgcG5nX2Vycm9yKHBwLCAidmFsaWRhdGU6IHVuZXhwZWN0ZWQgcG5nX2dldF90Uk5TIChwYWxldHRlKSByZXN1bHQiKTsKKworICAgICAgZm9yIChpPTA7IGk8bnVtOyArK2kpCisgICAgICAgICBwYWxldHRlW2ldLmFscGhhID0gdHJhbnNfYWxwaGFbaV07CisKKyAgICAgIGZvciAobnVtPSpucGFsZXR0ZTsgaTxudW07ICsraSkKKyAgICAgICAgIHBhbGV0dGVbaV0uYWxwaGEgPSAyNTU7CisKKyAgICAgIGZvciAoOyBpPDI1NjsgKytpKQorICAgICAgICAgcGFsZXR0ZVtpXS5hbHBoYSA9IDMzOyAvKiBmbGFnIHZhbHVlICovCisKKyAgICAgIHJldHVybiAxOyAvKiB0cmFuc3BhcmVuY3kgKi8KKyAgIH0KKworICAgZWxzZQorICAgeworICAgICAgLyogTm8gcGFsZXR0ZSB0cmFuc3BhcmVuY3kgLSBqdXN0IHNldCB0aGUgYWxwaGEgY2hhbm5lbCB0byBvcGFxdWUuICovCisgICAgICBpbnQgaTsKKworICAgICAgZm9yIChpPTAsIG51bT0qbnBhbGV0dGU7IGk8bnVtOyArK2kpCisgICAgICAgICBwYWxldHRlW2ldLmFscGhhID0gMjU1OworCisgICAgICBmb3IgKDsgaTwyNTY7ICsraSkKKyAgICAgICAgIHBhbGV0dGVbaV0uYWxwaGEgPSA1NTsgLyogZmxhZyB2YWx1ZSAqLworCisgICAgICByZXR1cm4gMDsgLyogbm8gdHJhbnNwYXJlbmN5ICovCisgICB9Cit9CisKKy8qIFV0aWxpdHkgdG8gdmFsaWRhdGUgdGhlIHBhbGV0dGUgaWYgaXQgc2hvdWxkIG5vdCBoYXZlIGNoYW5nZWQgKHRoZQorICogbm9uLXRyYW5zZm9ybSBjYXNlKS4KKyAqLworc3RhdGljIHZvaWQKK3N0YW5kYXJkX3BhbGV0dGVfdmFsaWRhdGUoc3RhbmRhcmRfZGlzcGxheSAqZHAsIHBuZ19jb25zdF9zdHJ1Y3RwIHBwLAorICAgcG5nX2luZm9wIHBpKQoreworICAgaW50IG5wYWxldHRlOworICAgc3RvcmVfcGFsZXR0ZSBwYWxldHRlOworCisgICBpZiAocmVhZF9wYWxldHRlKHBhbGV0dGUsICZucGFsZXR0ZSwgcHAsIHBpKSAhPSBkcC0+aXNfdHJhbnNwYXJlbnQpCisgICAgICBwbmdfZXJyb3IocHAsICJ2YWxpZGF0ZTogcGFsZXR0ZSB0cmFuc3BhcmVuY3kgY2hhbmdlZCIpOworCisgICBpZiAobnBhbGV0dGUgIT0gZHAtPm5wYWxldHRlKQorICAgeworICAgICAgc2l6ZV90IHBvcyA9IDA7CisgICAgICBjaGFyIG1zZ1s2NF07CisKKyAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICJ2YWxpZGF0ZTogcGFsZXR0ZSBzaXplIGNoYW5nZWQ6ICIpOworICAgICAgcG9zID0gc2FmZWNhdG4obXNnLCBzaXplb2YgbXNnLCBwb3MsIGRwLT5ucGFsZXR0ZSk7CisgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiIC0+ICIpOworICAgICAgcG9zID0gc2FmZWNhdG4obXNnLCBzaXplb2YgbXNnLCBwb3MsIG5wYWxldHRlKTsKKyAgICAgIHBuZ19lcnJvcihwcCwgbXNnKTsKKyAgIH0KKworICAgeworICAgICAgaW50IGkgPSBucGFsZXR0ZTsgLyogbnBhbGV0dGUgaXMgYWxpYXNlZCAqLworCisgICAgICB3aGlsZSAoLS1pID49IDApCisgICAgICAgICBpZiAocGFsZXR0ZVtpXS5yZWQgIT0gZHAtPnBhbGV0dGVbaV0ucmVkIHx8CisgICAgICAgICAgICBwYWxldHRlW2ldLmdyZWVuICE9IGRwLT5wYWxldHRlW2ldLmdyZWVuIHx8CisgICAgICAgICAgICBwYWxldHRlW2ldLmJsdWUgIT0gZHAtPnBhbGV0dGVbaV0uYmx1ZSB8fAorICAgICAgICAgICAgcGFsZXR0ZVtpXS5hbHBoYSAhPSBkcC0+cGFsZXR0ZVtpXS5hbHBoYSkKKyAgICAgICAgICAgIHBuZ19lcnJvcihwcCwgInZhbGlkYXRlOiBQTFRFIG9yIHRSTlMgY2h1bmsgY2hhbmdlZCIpOworICAgfQorfQorCisvKiBCeSBwYXNzaW5nIGEgJ3N0YW5kYXJkX2Rpc3BsYXknIHRoZSBwcm9ncmVzc2l2ZSBjYWxsYmFja3MgY2FuIGJlIHVzZWQKKyAqIGRpcmVjdGx5IGJ5IHRoZSBzZXF1ZW50aWFsIGNvZGUsIHRoZSBmdW5jdGlvbnMgc3VmZml4ZWQgIl9pbXAiIGFyZSB0aGUKKyAqIGltcGxlbWVudGF0aW9ucywgdGhlIGZ1bmN0aW9ucyB3aXRob3V0IHRoZSBzdWZmaXggYXJlIHRoZSBjYWxsYmFja3MuCisgKgorICogVGhlIGNvZGUgZm9yIHRoZSBpbmZvIGNhbGxiYWNrIGlzIHNwbGl0IGludG8gdHdvIGJlY2F1c2UgdGhpcyBjYWxsYmFjayBjYWxscworICogcG5nX3JlYWRfdXBkYXRlX2luZm8gb3IgcG5nX3N0YXJ0X3JlYWRfaW1hZ2UgYW5kIHdoYXQgZ2V0cyBjYWxsZWQgZGVwZW5kcyBvbgorICogd2hldGhlciB0aGUgaW5mbyBuZWVkcyB1cGRhdGluZyAod2Ugd2FudCB0byB0ZXN0IGJvdGggY2FsbHMgaW4gcG5ndmFsaWQuKQorICovCitzdGF0aWMgdm9pZAorc3RhbmRhcmRfaW5mb19wYXJ0MShzdGFuZGFyZF9kaXNwbGF5ICpkcCwgcG5nX3N0cnVjdHAgcHAsIHBuZ19pbmZvcCBwaSkKK3sKKyAgIGlmIChwbmdfZ2V0X2JpdF9kZXB0aChwcCwgcGkpICE9IGRwLT5iaXRfZGVwdGgpCisgICAgICBwbmdfZXJyb3IocHAsICJ2YWxpZGF0ZTogYml0IGRlcHRoIGNoYW5nZWQiKTsKKworICAgaWYgKHBuZ19nZXRfY29sb3JfdHlwZShwcCwgcGkpICE9IGRwLT5jb2xvdXJfdHlwZSkKKyAgICAgIHBuZ19lcnJvcihwcCwgInZhbGlkYXRlOiBjb2xvciB0eXBlIGNoYW5nZWQiKTsKKworICAgaWYgKHBuZ19nZXRfZmlsdGVyX3R5cGUocHAsIHBpKSAhPSBQTkdfRklMVEVSX1RZUEVfQkFTRSkKKyAgICAgIHBuZ19lcnJvcihwcCwgInZhbGlkYXRlOiBmaWx0ZXIgdHlwZSBjaGFuZ2VkIik7CisKKyAgIGlmIChwbmdfZ2V0X2ludGVybGFjZV90eXBlKHBwLCBwaSkgIT0gZHAtPmludGVybGFjZV90eXBlKQorICAgICAgcG5nX2Vycm9yKHBwLCAidmFsaWRhdGU6IGludGVybGFjaW5nIGNoYW5nZWQiKTsKKworICAgaWYgKHBuZ19nZXRfY29tcHJlc3Npb25fdHlwZShwcCwgcGkpICE9IFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UpCisgICAgICBwbmdfZXJyb3IocHAsICJ2YWxpZGF0ZTogY29tcHJlc3Npb24gdHlwZSBjaGFuZ2VkIik7CisKKyAgIGRwLT53ID0gcG5nX2dldF9pbWFnZV93aWR0aChwcCwgcGkpOworCisgICBpZiAoZHAtPncgIT0gc3RhbmRhcmRfd2lkdGgocHAsIGRwLT5pZCkpCisgICAgICBwbmdfZXJyb3IocHAsICJ2YWxpZGF0ZTogaW1hZ2Ugd2lkdGggY2hhbmdlZCIpOworCisgICBkcC0+aCA9IHBuZ19nZXRfaW1hZ2VfaGVpZ2h0KHBwLCBwaSk7CisKKyAgIGlmIChkcC0+aCAhPSBzdGFuZGFyZF9oZWlnaHQocHAsIGRwLT5pZCkpCisgICAgICBwbmdfZXJyb3IocHAsICJ2YWxpZGF0ZTogaW1hZ2UgaGVpZ2h0IGNoYW5nZWQiKTsKKworICAgLyogUmVjb3JkIChidXQgZG9uJ3QgY2hlY2sgYXQgcHJlc2VudCkgdGhlIGlucHV0IHNCSVQgYWNjb3JkaW5nIHRvIHRoZSBjb2xvdXIKKyAgICAqIHR5cGUgaW5mb3JtYXRpb24uCisgICAgKi8KKyAgIHsKKyAgICAgIHBuZ19jb2xvcl84cCBzQklUID0gMDsKKworICAgICAgaWYgKHBuZ19nZXRfc0JJVChwcCwgcGksICZzQklUKSAmIFBOR19JTkZPX3NCSVQpCisgICAgICB7CisgICAgICAgICBpbnQgc0JJVF9pbnZhbGlkID0gMDsKKworICAgICAgICAgaWYgKHNCSVQgPT0gMCkKKyAgICAgICAgICAgIHBuZ19lcnJvcihwcCwgInZhbGlkYXRlOiB1bmV4cGVjdGVkIHBuZ19nZXRfc0JJVCByZXN1bHQiKTsKKworICAgICAgICAgaWYgKGRwLT5jb2xvdXJfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKHNCSVQtPnJlZCA9PSAwIHx8IHNCSVQtPnJlZCA+IGRwLT5iaXRfZGVwdGgpCisgICAgICAgICAgICAgICBzQklUX2ludmFsaWQgPSAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgZHAtPnJlZF9zQklUID0gc0JJVC0+cmVkOworCisgICAgICAgICAgICBpZiAoc0JJVC0+Z3JlZW4gPT0gMCB8fCBzQklULT5ncmVlbiA+IGRwLT5iaXRfZGVwdGgpCisgICAgICAgICAgICAgICBzQklUX2ludmFsaWQgPSAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgZHAtPmdyZWVuX3NCSVQgPSBzQklULT5ncmVlbjsKKworICAgICAgICAgICAgaWYgKHNCSVQtPmJsdWUgPT0gMCB8fCBzQklULT5ibHVlID4gZHAtPmJpdF9kZXB0aCkKKyAgICAgICAgICAgICAgIHNCSVRfaW52YWxpZCA9IDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICBkcC0+Ymx1ZV9zQklUID0gc0JJVC0+Ymx1ZTsKKyAgICAgICAgIH0KKworICAgICAgICAgZWxzZSAvKiAhQ09MT1IgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzQklULT5ncmF5ID09IDAgfHwgc0JJVC0+Z3JheSA+IGRwLT5iaXRfZGVwdGgpCisgICAgICAgICAgICAgICBzQklUX2ludmFsaWQgPSAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgZHAtPmJsdWVfc0JJVCA9IGRwLT5ncmVlbl9zQklUID0gZHAtPnJlZF9zQklUID0gc0JJVC0+Z3JheTsKKyAgICAgICAgIH0KKworICAgICAgICAgLyogQWxsIDggYml0cyBpbiB0Uk5TIGZvciBhIHBhbGV0dGUgaW1hZ2UgYXJlIHNpZ25pZmljYW50IC0gc2VlIHRoZQorICAgICAgICAgICogc3BlYy4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKGRwLT5jb2xvdXJfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKHNCSVQtPmFscGhhID09IDAgfHwgc0JJVC0+YWxwaGEgPiBkcC0+Yml0X2RlcHRoKQorICAgICAgICAgICAgICAgc0JJVF9pbnZhbGlkID0gMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIGRwLT5hbHBoYV9zQklUID0gc0JJVC0+YWxwaGE7CisgICAgICAgICB9CisKKyAgICAgICAgIGlmIChzQklUX2ludmFsaWQpCisgICAgICAgICAgICBwbmdfZXJyb3IocHAsICJ2YWxpZGF0ZTogc0JJVCB2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogSW1wb3J0YW50OiB0aGlzIGlzIHZhbGlkYXRpbmcgdGhlIHZhbHVlICpiZWZvcmUqIGFueSB0cmFuc2Zvcm1zIGhhdmUgYmVlbgorICAgICogcHV0IGluIHBsYWNlLiAgSXQgZG9lc24ndCBtYXR0ZXIgZm9yIHRoZSBzdGFuZGFyZCB0ZXN0cywgd2hlcmUgdGhlcmUgYXJlCisgICAgKiBubyB0cmFuc2Zvcm1zLCBidXQgaXQgZG9lcyBmb3Igb3RoZXIgdGVzdHMgd2hlcmUgcm93Ynl0ZXMgbWF5IGNoYW5nZSBhZnRlcgorICAgICogcG5nX3JlYWRfdXBkYXRlX2luZm8uCisgICAgKi8KKyAgIGlmIChwbmdfZ2V0X3Jvd2J5dGVzKHBwLCBwaSkgIT0gc3RhbmRhcmRfcm93c2l6ZShwcCwgZHAtPmlkKSkKKyAgICAgIHBuZ19lcnJvcihwcCwgInZhbGlkYXRlOiByb3cgc2l6ZSBjaGFuZ2VkIik7CisKKyAgIC8qIFZhbGlkYXRlIHRoZSBjb2xvdXIgdHlwZSAzIHBhbGV0dGUgKHRoaXMgY2FuIGJlIHByZXNlbnQgb24gb3RoZXIgY29sb3IKKyAgICAqIHR5cGVzLikKKyAgICAqLworICAgc3RhbmRhcmRfcGFsZXR0ZV92YWxpZGF0ZShkcCwgcHAsIHBpKTsKKworICAgLyogSW4gYW55IGNhc2UgYWx3YXlzIGNoZWNrIGZvciBhIHRyYW5wYXJlbnQgY29sb3IgKG5vdGljZSB0aGF0IHRoZQorICAgICogY29sb3VyIHR5cGUgMyBjYXNlIG11c3Qgbm90IGdpdmUgYSBzdWNjZXNzZnVsIHJldHVybiBvbiB0aGUgZ2V0X3RSTlMgY2FsbAorICAgICogd2l0aCB0aGVzZSBhcmd1bWVudHMhKQorICAgICovCisgICB7CisgICAgICBwbmdfY29sb3JfMTZwIHRyYW5zX2NvbG9yID0gMDsKKworICAgICAgaWYgKHBuZ19nZXRfdFJOUyhwcCwgcGksIDAsIDAsICZ0cmFuc19jb2xvcikgJiBQTkdfSU5GT190Uk5TKQorICAgICAgeworICAgICAgICAgaWYgKHRyYW5zX2NvbG9yID09IDApCisgICAgICAgICAgICBwbmdfZXJyb3IocHAsICJ2YWxpZGF0ZTogdW5leHBlY3RlZCBwbmdfZ2V0X3RSTlMgKGNvbG9yKSByZXN1bHQiKTsKKworICAgICAgICAgc3dpdGNoIChkcC0+Y29sb3VyX3R5cGUpCisgICAgICAgICB7CisgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBkcC0+dHJhbnNwYXJlbnQucmVkID0gZHAtPnRyYW5zcGFyZW50LmdyZWVuID0gZHAtPnRyYW5zcGFyZW50LmJsdWUgPQorICAgICAgICAgICAgICAgdHJhbnNfY29sb3ItPmdyYXk7CisgICAgICAgICAgICBkcC0+aGFzX3RSTlMgPSAxOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGRwLT50cmFuc3BhcmVudC5yZWQgPSB0cmFuc19jb2xvci0+cmVkOworICAgICAgICAgICAgZHAtPnRyYW5zcGFyZW50LmdyZWVuID0gdHJhbnNfY29sb3ItPmdyZWVuOworICAgICAgICAgICAgZHAtPnRyYW5zcGFyZW50LmJsdWUgPSB0cmFuc19jb2xvci0+Ymx1ZTsKKyAgICAgICAgICAgIGRwLT5oYXNfdFJOUyA9IDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgLyogTm90IGV4cGVjdGVkIGJlY2F1c2UgaXQgc2hvdWxkIHJlc3VsdCBpbiB0aGUgYXJyYXkgY2FzZQorICAgICAgICAgICAgICogYWJvdmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHBuZ19lcnJvcihwcCwgInZhbGlkYXRlOiB1bmV4cGVjdGVkIHBuZ19nZXRfdFJOUyByZXN1bHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcG5nX2Vycm9yKHBwLCAidmFsaWRhdGU6IGludmFsaWQgdFJOUyBjaHVuayB3aXRoIGFscGhhIGltYWdlIik7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIC8qIFJlYWQgdGhlIG51bWJlciBvZiBwYXNzZXMgLSBleHBlY3RlZCB0byBtYXRjaCB0aGUgdmFsdWUgdXNlZCB3aGVuCisgICAgKiBjcmVhdGluZyB0aGUgaW1hZ2UgKGludGVybGFjZWQgb3Igbm90KS4gIFRoaXMgaGFzIHRoZSBzaWRlIGVmZmVjdCBvZgorICAgICogdHVybmluZyBvbiBpbnRlcmxhY2UgaGFuZGxpbmcgKGlmIGRvX2ludGVybGFjZSBpcyBub3Qgc2V0LikKKyAgICAqLworICAgZHAtPm5wYXNzZXMgPSBucGFzc2VzX2Zyb21faW50ZXJsYWNlX3R5cGUocHAsIGRwLT5pbnRlcmxhY2VfdHlwZSk7CisgICBpZiAoIWRwLT5kb19pbnRlcmxhY2UpCisgICB7CisjICAgICBpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQKKyAgICAgICAgIGlmIChkcC0+bnBhc3NlcyAhPSBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyhwcCkpCisgICAgICAgICAgICBwbmdfZXJyb3IocHAsICJ2YWxpZGF0ZTogZmlsZSBjaGFuZ2VkIGludGVybGFjZSB0eXBlIik7CisjICAgICBlbHNlIC8qICFSRUFEX0lOVEVSTEFDSU5HICovCisgICAgICAgICAvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW46IHRoZSByZWxldmFudCB0ZXN0cyAoIWRvX2ludGVybGFjZSkgc2hvdWxkCisgICAgICAgICAgKiBub3QgYmUgcnVuLgorICAgICAgICAgICovCisgICAgICAgICBpZiAoZHAtPm5wYXNzZXMgPiAxKQorICAgICAgICAgICAgcG5nX2Vycm9yKHBwLCAidmFsaWRhdGU6IG5vIGxpYnBuZyBpbnRlcmxhY2Ugc3VwcG9ydCIpOworIyAgICAgZW5kaWYgLyogIVJFQURfSU5URVJMQUNJTkcgKi8KKyAgIH0KKworICAgLyogQ2FsbGVyIGNhbGxzIHBuZ19yZWFkX3VwZGF0ZV9pbmZvIG9yIHBuZ19zdGFydF9yZWFkX2ltYWdlIG5vdywgdGhlbiBjYWxscworICAgICogcGFydDIuCisgICAgKi8KK30KKworLyogVGhpcyBtdXN0IGJlIGNhbGxlZCAqYWZ0ZXIqIHRoZSBwbmdfcmVhZF91cGRhdGVfaW5mbyBjYWxsIHRvIGdldCB0aGUgY29ycmVjdAorICogJ3Jvd2J5dGVzJyB2YWx1ZSwgb3RoZXJ3aXNlIHBuZ19nZXRfcm93Ynl0ZXMgd2lsbCByZWZlciB0byB0aGUgdW50cmFuc2Zvcm1lZAorICogaW1hZ2UuCisgKi8KK3N0YXRpYyB2b2lkCitzdGFuZGFyZF9pbmZvX3BhcnQyKHN0YW5kYXJkX2Rpc3BsYXkgKmRwLCBwbmdfY29uc3Rfc3RydWN0cCBwcCwKKyAgICBwbmdfY29uc3RfaW5mb3AgcGksIGludCBuSW1hZ2VzKQoreworICAgLyogUmVjb3JkIGNiUm93IG5vdyB0aGF0IGl0IGNhbiBiZSBmb3VuZC4gKi8KKyAgIHsKKyAgICAgIHBuZ19ieXRlIGN0ID0gcG5nX2dldF9jb2xvcl90eXBlKHBwLCBwaSk7CisgICAgICBwbmdfYnl0ZSBiZCA9IHBuZ19nZXRfYml0X2RlcHRoKHBwLCBwaSk7CisKKyAgICAgIGlmIChiZCA+PSA4ICYmIChjdCA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgfHwgY3QgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkgJiYKKyAgICAgICAgICBkcC0+ZmlsbGVyKQorICAgICAgICAgIGN0IHw9IDQ7IC8qIGhhbmRsZSBmaWxsZXIgYXMgZmFrZWQgYWxwaGEgY2hhbm5lbCAqLworCisgICAgICBkcC0+cGl4ZWxfc2l6ZSA9IGJpdF9zaXplKHBwLCBjdCwgYmQpOworICAgfQorICAgZHAtPmJpdF93aWR0aCA9IHBuZ19nZXRfaW1hZ2Vfd2lkdGgocHAsIHBpKSAqIGRwLT5waXhlbF9zaXplOworICAgZHAtPmNiUm93ID0gcG5nX2dldF9yb3dieXRlcyhwcCwgcGkpOworCisgICAvKiBWYWxpZGF0ZSB0aGUgcm93Ynl0ZXMgaGVyZSBhZ2Fpbi4gKi8KKyAgIGlmIChkcC0+Y2JSb3cgIT0gKGRwLT5iaXRfd2lkdGgrNykvOCkKKyAgICAgIHBuZ19lcnJvcihwcCwgImJhZCBwbmdfZ2V0X3Jvd2J5dGVzIGNhbGN1bGF0aW9uIik7CisKKyAgIC8qIFRoZW4gZW5zdXJlIHRoZXJlIGlzIGVub3VnaCBzcGFjZSBmb3IgdGhlIG91dHB1dCBpbWFnZShzKS4gKi8KKyAgIHN0b3JlX2Vuc3VyZV9pbWFnZShkcC0+cHMsIHBwLCBuSW1hZ2VzLCBkcC0+Y2JSb3csIGRwLT5oKTsKK30KKworc3RhdGljIHZvaWQKK3N0YW5kYXJkX2luZm9faW1wKHN0YW5kYXJkX2Rpc3BsYXkgKmRwLCBwbmdfc3RydWN0cCBwcCwgcG5nX2luZm9wIHBpLAorICAgIGludCBuSW1hZ2VzKQoreworICAgLyogTm90ZSB0aGF0IHRoZSB2YWxpZGF0aW9uIHJvdXRpbmUgaGFzIHRoZSBzaWRlIGVmZmVjdCBvZiB0dXJuaW5nIG9uCisgICAgKiBpbnRlcmxhY2UgaGFuZGxpbmcgaW4gdGhlIHN1YnNlcXVlbnQgY29kZS4KKyAgICAqLworICAgc3RhbmRhcmRfaW5mb19wYXJ0MShkcCwgcHAsIHBpKTsKKworICAgLyogQW5kIHRoZSBpbmZvIGNhbGxiYWNrIGhhcyB0byBjYWxsIHRoaXMgKG9yIHBuZ19yZWFkX3VwZGF0ZV9pbmZvIC0gc2VlCisgICAgKiBiZWxvdyBpbiB0aGUgcG5nX21vZGlmaWVyIGNvZGUgZm9yIHRoYXQgdmFyaWFudC4KKyAgICAqLworICAgaWYgKGRwLT51c2VfdXBkYXRlX2luZm8pCisgICB7CisgICAgICAvKiBGb3IgZGVidWdnaW5nIHRoZSBlZmZlY3Qgb2YgbXVsdGlwbGUgY2FsbHM6ICovCisgICAgICBpbnQgaSA9IGRwLT51c2VfdXBkYXRlX2luZm87CisgICAgICB3aGlsZSAoaS0tID4gMCkKKyAgICAgICAgIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKHBwLCBwaSk7CisgICB9CisKKyAgIGVsc2UKKyAgICAgIHBuZ19zdGFydF9yZWFkX2ltYWdlKHBwKTsKKworICAgLyogVmFsaWRhdGUgdGhlIGhlaWdodCwgd2lkdGggYW5kIHJvd2J5dGVzIHBsdXMgZW5zdXJlIHRoYXQgc3VmZmljaWVudCBidWZmZXIKKyAgICAqIGV4aXN0cyBmb3IgZGVjb2RpbmcgdGhlIGltYWdlLgorICAgICovCisgICBzdGFuZGFyZF9pbmZvX3BhcnQyKGRwLCBwcCwgcGksIG5JbWFnZXMpOworfQorCitzdGF0aWMgdm9pZCBQTkdDQkFQSQorc3RhbmRhcmRfaW5mbyhwbmdfc3RydWN0cCBwcCwgcG5nX2luZm9wIHBpKQoreworICAgc3RhbmRhcmRfZGlzcGxheSAqZHAgPSB2b2lkY2FzdChzdGFuZGFyZF9kaXNwbGF5KiwKKyAgICAgIHBuZ19nZXRfcHJvZ3Jlc3NpdmVfcHRyKHBwKSk7CisKKyAgIC8qIENhbGwgd2l0aCBuSW1hZ2VzPT0xIGJlY2F1c2UgdGhlIHByb2dyZXNzaXZlIHJlYWRlciBjYW4gb25seSBwcm9kdWNlIG9uZQorICAgICogaW1hZ2UuCisgICAgKi8KKyAgIHN0YW5kYXJkX2luZm9faW1wKGRwLCBwcCwgcGksIDEgLypvbmx5IG9uZSBpbWFnZSovKTsKK30KKworc3RhdGljIHZvaWQgUE5HQ0JBUEkKK3Byb2dyZXNzaXZlX3Jvdyhwbmdfc3RydWN0cCBwcEluLCBwbmdfYnl0ZXAgbmV3X3JvdywgcG5nX3VpbnRfMzIgeSwgaW50IHBhc3MpCit7CisgICBwbmdfY29uc3Rfc3RydWN0cCBwcCA9IHBwSW47CisgICBjb25zdCBzdGFuZGFyZF9kaXNwbGF5ICpkcCA9IHZvaWRjYXN0KHN0YW5kYXJkX2Rpc3BsYXkqLAorICAgICAgcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIocHApKTsKKworICAgLyogV2hlbiBoYW5kbGluZyBpbnRlcmxhY2luZyBzb21lIHJvd3Mgd2lsbCBiZSBhYnNlbnQgaW4gZWFjaCBwYXNzLCB0aGUKKyAgICAqIGNhbGxiYWNrIHN0aWxsIGdldHMgY2FsbGVkLCBidXQgd2l0aCBhIE5VTEwgcG9pbnRlci4gIFRoaXMgaXMgY2hlY2tlZAorICAgICogaW4gdGhlICdlbHNlJyBjbGF1c2UgYmVsb3cuICBXZSBuZWVkIG91ciBvd24gJ2NiUm93JywgYnV0IHdlIGNhbid0IGNhbGwKKyAgICAqIHBuZ19nZXRfcm93Ynl0ZXMgYmVjYXVzZSB3ZSBnb3Qgbm8gaW5mbyBzdHJ1Y3R1cmUuCisgICAgKi8KKyAgIGlmIChuZXdfcm93ICE9IE5VTEwpCisgICB7CisgICAgICBwbmdfYnl0ZXAgcm93OworCisgICAgICAvKiBJbiB0aGUgY2FzZSB3aGVyZSB0aGUgcmVhZGVyIGRvZXNuJ3QgZG8gdGhlIGludGVybGFjZSBpdCBnaXZlcworICAgICAgICogdXMgdGhlIHkgaW4gdGhlIHN1Yi1pbWFnZToKKyAgICAgICAqLworICAgICAgaWYgKGRwLT5kb19pbnRlcmxhY2UgJiYgZHAtPmludGVybGFjZV90eXBlID09IFBOR19JTlRFUkxBQ0VfQURBTTcpCisgICAgICB7CisjaWZkZWYgUE5HX1VTRVJfVFJBTlNGT1JNX0lORk9fU1VQUE9SVEVECisgICAgICAgICAvKiBVc2UgdGhpcyBvcHBvcnR1bml0eSB0byB2YWxpZGF0ZSB0aGUgcG5nICdjdXJyZW50JyBBUElzOiAqLworICAgICAgICAgaWYgKHkgIT0gcG5nX2dldF9jdXJyZW50X3Jvd19udW1iZXIocHApKQorICAgICAgICAgICAgcG5nX2Vycm9yKHBwLCAicG5nX2dldF9jdXJyZW50X3Jvd19udW1iZXIgaXMgYnJva2VuIik7CisKKyAgICAgICAgIGlmIChwYXNzICE9IHBuZ19nZXRfY3VycmVudF9wYXNzX251bWJlcihwcCkpCisgICAgICAgICAgICBwbmdfZXJyb3IocHAsICJwbmdfZ2V0X2N1cnJlbnRfcGFzc19udW1iZXIgaXMgYnJva2VuIik7CisjZW5kaWYgLyogVVNFUl9UUkFOU0ZPUk1fSU5GTyAqLworCisgICAgICAgICB5ID0gUE5HX1JPV19GUk9NX1BBU1NfUk9XKHksIHBhc3MpOworICAgICAgfQorCisgICAgICAvKiBWYWxpZGF0ZSB0aGlzIGp1c3QgaW4gY2FzZS4gKi8KKyAgICAgIGlmICh5ID49IGRwLT5oKQorICAgICAgICAgcG5nX2Vycm9yKHBwLCAiaW52YWxpZCB5IHRvIHByb2dyZXNzaXZlIHJvdyBjYWxsYmFjayIpOworCisgICAgICByb3cgPSBzdG9yZV9pbWFnZV9yb3coZHAtPnBzLCBwcCwgMCwgeSk7CisKKyAgICAgIC8qIENvbWJpbmUgdGhlIG5ldyByb3cgaW50byB0aGUgb2xkOiAqLworI2lmZGVmIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAorICAgICAgaWYgKGRwLT5kb19pbnRlcmxhY2UpCisjZW5kaWYgLyogUkVBRF9JTlRFUkxBQ0lORyAqLworICAgICAgeworICAgICAgICAgaWYgKGRwLT5pbnRlcmxhY2VfdHlwZSA9PSBQTkdfSU5URVJMQUNFX0FEQU03KQorICAgICAgICAgICAgZGVpbnRlcmxhY2Vfcm93KHJvdywgbmV3X3JvdywgZHAtPnBpeGVsX3NpemUsIGRwLT53LCBwYXNzLAorICAgICAgICAgICAgICAgICAgZHAtPmxpdHRsZWVuZGlhbik7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICByb3dfY29weShyb3csIG5ld19yb3csIGRwLT5waXhlbF9zaXplICogZHAtPncsIGRwLT5saXR0bGVlbmRpYW4pOworICAgICAgfQorI2lmZGVmIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAorICAgICAgZWxzZQorICAgICAgICAgcG5nX3Byb2dyZXNzaXZlX2NvbWJpbmVfcm93KHBwLCByb3csIG5ld19yb3cpOworI2VuZGlmIC8qIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRCAqLworICAgfQorCisgICBlbHNlIGlmIChkcC0+aW50ZXJsYWNlX3R5cGUgPT0gUE5HX0lOVEVSTEFDRV9BREFNNyAmJgorICAgICAgIFBOR19ST1dfSU5fSU5URVJMQUNFX1BBU1MoeSwgcGFzcykgJiYKKyAgICAgICBQTkdfUEFTU19DT0xTKGRwLT53LCBwYXNzKSA+IDApCisgICAgICBwbmdfZXJyb3IocHAsICJtaXNzaW5nIHJvdyBpbiBwcm9ncmVzc2l2ZSBkZS1pbnRlcmxhY2luZyIpOworfQorCitzdGF0aWMgdm9pZAorc2VxdWVudGlhbF9yb3coc3RhbmRhcmRfZGlzcGxheSAqZHAsIHBuZ19zdHJ1Y3RwIHBwLCBwbmdfaW5mb3AgcGksCisgICAgY29uc3QgaW50IGlJbWFnZSwgY29uc3QgaW50IGlEaXNwbGF5KQoreworICAgY29uc3QgaW50ICAgICAgICAgbnBhc3NlcyA9IGRwLT5ucGFzc2VzOworICAgY29uc3QgaW50ICAgICAgICAgZG9faW50ZXJsYWNlID0gZHAtPmRvX2ludGVybGFjZSAmJgorICAgICAgZHAtPmludGVybGFjZV90eXBlID09IFBOR19JTlRFUkxBQ0VfQURBTTc7CisgICBjb25zdCBwbmdfdWludF8zMiBoZWlnaHQgPSBzdGFuZGFyZF9oZWlnaHQocHAsIGRwLT5pZCk7CisgICBjb25zdCBwbmdfdWludF8zMiB3aWR0aCA9IHN0YW5kYXJkX3dpZHRoKHBwLCBkcC0+aWQpOworICAgY29uc3QgcG5nX3N0b3JlKiAgcHMgPSBkcC0+cHM7CisgICBpbnQgcGFzczsKKworICAgZm9yIChwYXNzPTA7IHBhc3M8bnBhc3NlczsgKytwYXNzKQorICAgeworICAgICAgcG5nX3VpbnRfMzIgeTsKKyAgICAgIHBuZ191aW50XzMyIHdQYXNzID0gUE5HX1BBU1NfQ09MUyh3aWR0aCwgcGFzcyk7CisKKyAgICAgIGZvciAoeT0wOyB5PGhlaWdodDsgKyt5KQorICAgICAgeworICAgICAgICAgaWYgKGRvX2ludGVybGFjZSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHdQYXNzIG1heSBiZSB6ZXJvIG9yIHRoaXMgcm93IG1heSBub3QgYmUgaW4gdGhpcyBwYXNzLgorICAgICAgICAgICAgICogcG5nX3JlYWRfcm93IG11c3Qgbm90IGJlIGNhbGxlZCBpbiBlaXRoZXIgY2FzZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHdQYXNzID4gMCAmJiBQTkdfUk9XX0lOX0lOVEVSTEFDRV9QQVNTKHksIHBhc3MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLyogUmVhZCB0aGUgcm93IGludG8gYSBwYWlyIG9mIHRlbXBvcmFyeSBidWZmZXJzLCB0aGVuIGRvIHRoZQorICAgICAgICAgICAgICAgICogbWVyZ2UgaGVyZSBpbnRvIHRoZSBvdXRwdXQgcm93cy4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgcG5nX2J5dGUgcm93W1NUQU5EQVJEX1JPV01BWF0sIGRpc3BsYXlbU1RBTkRBUkRfUk9XTUFYXTsKKworICAgICAgICAgICAgICAgLyogVGhlIGZvbGxvd2luZyBhaWRzICh0byBzb21lIGV4dGVudCkgZXJyb3IgZGV0ZWN0aW9uIC0gd2UgY2FuCisgICAgICAgICAgICAgICAgKiBzZWUgd2hlcmUgcG5nX3JlYWRfcm93IHdyb3RlLiAgVXNlIG9wcG9zaXRlIHZhbHVlcyBpbiByb3cgYW5kCisgICAgICAgICAgICAgICAgKiBkaXNwbGF5IHRvIG1ha2UgdGhpcyBlYXNpZXIuICBEb24ndCB1c2UgMHhmZiAod2hpY2ggaXMgdXNlZCBpbgorICAgICAgICAgICAgICAgICogdGhlIGltYWdlIHdyaXRlIGNvZGUgdG8gZmlsbCB1bnVzZWQgYml0cykgb3IgMCAod2hpY2ggaXMgYQorICAgICAgICAgICAgICAgICogbGlrZWx5IHZhbHVlIHRvIG92ZXJ3cml0ZSB1bnVzZWQgYml0cyB3aXRoKS4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgbWVtc2V0KHJvdywgMHhjNSwgc2l6ZW9mIHJvdyk7CisgICAgICAgICAgICAgICBtZW1zZXQoZGlzcGxheSwgMHg1Yywgc2l6ZW9mIGRpc3BsYXkpOworCisgICAgICAgICAgICAgICBwbmdfcmVhZF9yb3cocHAsIHJvdywgZGlzcGxheSk7CisKKyAgICAgICAgICAgICAgIGlmIChpSW1hZ2UgPj0gMCkKKyAgICAgICAgICAgICAgICAgIGRlaW50ZXJsYWNlX3JvdyhzdG9yZV9pbWFnZV9yb3cocHMsIHBwLCBpSW1hZ2UsIHkpLCByb3csCisgICAgICAgICAgICAgICAgICAgICBkcC0+cGl4ZWxfc2l6ZSwgZHAtPncsIHBhc3MsIGRwLT5saXR0bGVlbmRpYW4pOworCisgICAgICAgICAgICAgICBpZiAoaURpc3BsYXkgPj0gMCkKKyAgICAgICAgICAgICAgICAgIGRlaW50ZXJsYWNlX3JvdyhzdG9yZV9pbWFnZV9yb3cocHMsIHBwLCBpRGlzcGxheSwgeSksIGRpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICBkcC0+cGl4ZWxfc2l6ZSwgZHAtPncsIHBhc3MsIGRwLT5saXR0bGVlbmRpYW4pOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgICAgcG5nX3JlYWRfcm93KHBwLAorICAgICAgICAgICAgICAgaUltYWdlID49IDAgPyBzdG9yZV9pbWFnZV9yb3cocHMsIHBwLCBpSW1hZ2UsIHkpIDogTlVMTCwKKyAgICAgICAgICAgICAgIGlEaXNwbGF5ID49IDAgPyBzdG9yZV9pbWFnZV9yb3cocHMsIHBwLCBpRGlzcGxheSwgeSkgOiBOVUxMKTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogQW5kIGZpbmlzaCB0aGUgcmVhZCBvcGVyYXRpb24gKG9ubHkgcmVhbGx5IG5lY2Vzc2FyeSBpZiB0aGUgY2FsbGVyIHdhbnRzCisgICAgKiB0byBmaW5kIGFkZGl0aW9uYWwgZGF0YSBpbiBwbmdfaW5mbyBmcm9tIGNodW5rcyBhZnRlciB0aGUgbGFzdCBJREFULikKKyAgICAqLworICAgcG5nX3JlYWRfZW5kKHBwLCBwaSk7Cit9CisKKyNpZmRlZiBQTkdfVEVYVF9TVVBQT1JURUQKK3N0YXRpYyB2b2lkCitzdGFuZGFyZF9jaGVja190ZXh0KHBuZ19jb25zdF9zdHJ1Y3RwIHBwLCBwbmdfY29uc3RfdGV4dHAgdHAsCisgICBwbmdfY29uc3RfY2hhcnAga2V5d29yZCwgcG5nX2NvbnN0X2NoYXJwIHRleHQpCit7CisgICBjaGFyIG1zZ1sxMDI0XTsKKyAgIHNpemVfdCBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgMCwgInRleHQ6ICIpOworICAgc2l6ZV90IG9rOworCisgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCBrZXl3b3JkKTsKKyAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICI6ICIpOworICAgb2sgPSBwb3M7CisKKyAgIGlmICh0cC0+Y29tcHJlc3Npb24gIT0gVEVYVF9DT01QUkVTU0lPTikKKyAgIHsKKyAgICAgIGNoYXIgYnVmWzY0XTsKKworICAgICAgc3ByaW50ZihidWYsICJjb21wcmVzc2lvbiBbJWQtPiVkXSwgIiwgVEVYVF9DT01QUkVTU0lPTiwKKyAgICAgICAgIHRwLT5jb21wcmVzc2lvbik7CisgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCBidWYpOworICAgfQorCisgICBpZiAodHAtPmtleSA9PSBOVUxMIHx8IHN0cmNtcCh0cC0+a2V5LCBrZXl3b3JkKSAhPSAwKQorICAgeworICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgImtleXdvcmQgXCIiKTsKKyAgICAgIGlmICh0cC0+a2V5ICE9IE5VTEwpCisgICAgICB7CisgICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCB0cC0+a2V5KTsKKyAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICJcIiwgIik7CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICJudWxsLCAiKTsKKyAgIH0KKworICAgaWYgKHRwLT50ZXh0ID09IE5VTEwpCisgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAidGV4dCBsb3N0LCAiKTsKKworICAgZWxzZQorICAgeworICAgICAgaWYgKHRwLT50ZXh0X2xlbmd0aCAhPSBzdHJsZW4odGV4dCkpCisgICAgICB7CisgICAgICAgICBjaGFyIGJ1Zls2NF07CisgICAgICAgICBzcHJpbnRmKGJ1ZiwgInRleHQgbGVuZ3RoIGNoYW5nZWRbJWx1LT4lbHVdLCAiLAorICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpc3RybGVuKHRleHQpLCAodW5zaWduZWQgbG9uZyl0cC0+dGV4dF9sZW5ndGgpOworICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgYnVmKTsKKyAgICAgIH0KKworICAgICAgaWYgKHN0cmNtcCh0cC0+dGV4dCwgdGV4dCkgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICJ0ZXh0IGJlY29tZXMgXCIiKTsKKyAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsIHRwLT50ZXh0KTsKKyAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICJcIiAod2FzIFwiIik7CisgICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCB0ZXh0KTsKKyAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICJcIiksICIpOworICAgICAgfQorICAgfQorCisgICBpZiAodHAtPml0eHRfbGVuZ3RoICE9IDApCisgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiaVRYdCBsZW5ndGggc2V0LCAiKTsKKworICAgaWYgKHRwLT5sYW5nICE9IE5VTEwpCisgICB7CisgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiaVRYdCBsYW5ndWFnZSBcIiIpOworICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgdHAtPmxhbmcpOworICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgIlwiLCAiKTsKKyAgIH0KKworICAgaWYgKHRwLT5sYW5nX2tleSAhPSBOVUxMKQorICAgeworICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgImlUWHQga2V5d29yZCBcIiIpOworICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgdHAtPmxhbmdfa2V5KTsKKyAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICJcIiwgIik7CisgICB9CisKKyAgIGlmIChwb3MgPiBvaykKKyAgIHsKKyAgICAgIG1zZ1twb3MtMl0gPSAnXDAnOyAvKiBSZW1vdmUgdGhlICIsICIgYXQgdGhlIGVuZCAqLworICAgICAgcG5nX2Vycm9yKHBwLCBtc2cpOworICAgfQorfQorCitzdGF0aWMgdm9pZAorc3RhbmRhcmRfdGV4dF92YWxpZGF0ZShzdGFuZGFyZF9kaXNwbGF5ICpkcCwgcG5nX2NvbnN0X3N0cnVjdHAgcHAsCisgICBwbmdfaW5mb3AgcGksIGludCBjaGVja19lbmQpCit7CisgICBwbmdfdGV4dHAgdHAgPSBOVUxMOworICAgcG5nX3VpbnRfMzIgbnVtX3RleHQgPSBwbmdfZ2V0X3RleHQocHAsIHBpLCAmdHAsIE5VTEwpOworCisgICBpZiAobnVtX3RleHQgPT0gMiAmJiB0cCAhPSBOVUxMKQorICAgeworICAgICAgc3RhbmRhcmRfY2hlY2tfdGV4dChwcCwgdHAsICJpbWFnZSBuYW1lIiwgZHAtPnBzLT5jdXJyZW50LT5uYW1lKTsKKworICAgICAgLyogVGhpcyBleGlzdHMgYmVjYXVzZSBwcmlvciB0byAxLjUuMTggdGhlIHByb2dyZXNzaXZlIHJlYWRlciBsZWZ0IHRoZQorICAgICAgICogcG5nX3N0cnVjdCB6X3N0cmVhbSB1bnJlc2V0IGF0IHRoZSBlbmQgb2YgdGhlIGltYWdlLCBzbyBzdWJzZXF1ZW50CisgICAgICAgKiBhdHRlbXB0cyB0byB1c2UgaXQgc2ltcGx5IHJldHVybnMgWl9TVFJFQU1fRU5ELgorICAgICAgICovCisgICAgICBpZiAoY2hlY2tfZW5kKQorICAgICAgICAgc3RhbmRhcmRfY2hlY2tfdGV4dChwcCwgdHArMSwgImVuZCBtYXJrZXIiLCAiZW5kIik7CisgICB9CisKKyAgIGVsc2UKKyAgIHsKKyAgICAgIGNoYXIgbXNnWzY0XTsKKworICAgICAgc3ByaW50Zihtc2csICJleHBlY3RlZCB0d28gdGV4dCBpdGVtcywgZ290ICVsdSIsCisgICAgICAgICAodW5zaWduZWQgbG9uZyludW1fdGV4dCk7CisgICAgICBwbmdfZXJyb3IocHAsIG1zZyk7CisgICB9Cit9CisjZWxzZQorIyAgZGVmaW5lIHN0YW5kYXJkX3RleHRfdmFsaWRhdGUoZHAscHAscGksY2hlY2tfZW5kKSAoKHZvaWQpMCkKKyNlbmRpZgorCitzdGF0aWMgdm9pZAorc3RhbmRhcmRfcm93X3ZhbGlkYXRlKHN0YW5kYXJkX2Rpc3BsYXkgKmRwLCBwbmdfY29uc3Rfc3RydWN0cCBwcCwKKyAgIGludCBpSW1hZ2UsIGludCBpRGlzcGxheSwgcG5nX3VpbnRfMzIgeSkKK3sKKyAgIGludCB3aGVyZTsKKyAgIHBuZ19ieXRlIHN0ZFtTVEFOREFSRF9ST1dNQVhdOworCisgICAvKiBUaGUgcm93IG11c3QgYmUgcHJlLWluaXRpYWxpemVkIHRvIHRoZSBtYWdpYyBudW1iZXIgaGVyZSBmb3IgdGhlIHNpemUKKyAgICAqIHRlc3RzIHRvIHBhc3M6CisgICAgKi8KKyAgIG1lbXNldChzdGQsIDE3OCwgc2l6ZW9mIHN0ZCk7CisgICBzdGFuZGFyZF9yb3cocHAsIHN0ZCwgZHAtPmlkLCB5KTsKKworICAgLyogQXQgdGhlIGVuZCBib3RoIHRoZSAncm93JyBhbmQgJ2Rpc3BsYXknIGFycmF5cyBzaG91bGQgZW5kIHVwIGlkZW50aWNhbC4KKyAgICAqIEluIGVhcmxpZXIgcGFzc2VzICdyb3cnIHdpbGwgYmUgcGFydGlhbGx5IGZpbGxlZCBpbiwgd2l0aCBvbmx5IHRoZSBwaXhlbHMKKyAgICAqIHRoYXQgaGF2ZSBiZWVuIHJlYWQgc28gZmFyLCBidXQgJ2Rpc3BsYXknIHdpbGwgaGF2ZSB0aG9zZSBwaXhlbHMKKyAgICAqIHJlcGxpY2F0ZWQgdG8gZmlsbCB0aGUgdW5yZWFkIHBpeGVscyB3aGlsZSByZWFkaW5nIGFuIGludGVybGFjZWQgaW1hZ2UuCisgICAgKi8KKyAgIGlmIChpSW1hZ2UgPj0gMCAmJgorICAgICAgKHdoZXJlID0gcGl4ZWxfY21wKHN0ZCwgc3RvcmVfaW1hZ2Vfcm93KGRwLT5wcywgcHAsIGlJbWFnZSwgeSksCisgICAgICAgICAgICBkcC0+Yml0X3dpZHRoKSkgIT0gMCkKKyAgIHsKKyAgICAgIGNoYXIgbXNnWzY0XTsKKyAgICAgIHNwcmludGYobXNnLCAiUE5HIGltYWdlIHJvd1slbHVdWyVkXSBjaGFuZ2VkIGZyb20gJS4yeCB0byAlLjJ4IiwKKyAgICAgICAgICh1bnNpZ25lZCBsb25nKXksIHdoZXJlLTEsIHN0ZFt3aGVyZS0xXSwKKyAgICAgICAgIHN0b3JlX2ltYWdlX3JvdyhkcC0+cHMsIHBwLCBpSW1hZ2UsIHkpW3doZXJlLTFdKTsKKyAgICAgIHBuZ19lcnJvcihwcCwgbXNnKTsKKyAgIH0KKworICAgaWYgKGlEaXNwbGF5ID49IDAgJiYKKyAgICAgICh3aGVyZSA9IHBpeGVsX2NtcChzdGQsIHN0b3JlX2ltYWdlX3JvdyhkcC0+cHMsIHBwLCBpRGlzcGxheSwgeSksCisgICAgICAgICBkcC0+Yml0X3dpZHRoKSkgIT0gMCkKKyAgIHsKKyAgICAgIGNoYXIgbXNnWzY0XTsKKyAgICAgIHNwcmludGYobXNnLCAiZGlzcGxheSByb3dbJWx1XVslZF0gY2hhbmdlZCBmcm9tICUuMnggdG8gJS4yeCIsCisgICAgICAgICAodW5zaWduZWQgbG9uZyl5LCB3aGVyZS0xLCBzdGRbd2hlcmUtMV0sCisgICAgICAgICBzdG9yZV9pbWFnZV9yb3coZHAtPnBzLCBwcCwgaURpc3BsYXksIHkpW3doZXJlLTFdKTsKKyAgICAgIHBuZ19lcnJvcihwcCwgbXNnKTsKKyAgIH0KK30KKworc3RhdGljIHZvaWQKK3N0YW5kYXJkX2ltYWdlX3ZhbGlkYXRlKHN0YW5kYXJkX2Rpc3BsYXkgKmRwLCBwbmdfY29uc3Rfc3RydWN0cCBwcCwgaW50IGlJbWFnZSwKKyAgICBpbnQgaURpc3BsYXkpCit7CisgICBwbmdfdWludF8zMiB5OworCisgICBpZiAoaUltYWdlID49IDApCisgICAgICBzdG9yZV9pbWFnZV9jaGVjayhkcC0+cHMsIHBwLCBpSW1hZ2UpOworCisgICBpZiAoaURpc3BsYXkgPj0gMCkKKyAgICAgIHN0b3JlX2ltYWdlX2NoZWNrKGRwLT5wcywgcHAsIGlEaXNwbGF5KTsKKworICAgZm9yICh5PTA7IHk8ZHAtPmg7ICsreSkKKyAgICAgIHN0YW5kYXJkX3Jvd192YWxpZGF0ZShkcCwgcHAsIGlJbWFnZSwgaURpc3BsYXksIHkpOworCisgICAvKiBUaGlzIGF2b2lkcyBmYWxzZSBwb3NpdGl2ZXMgaWYgdGhlIHZhbGlkYXRpb24gY29kZSBpcyBuZXZlciBjYWxsZWQhICovCisgICBkcC0+cHMtPnZhbGlkYXRlZCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIFBOR0NCQVBJCitzdGFuZGFyZF9lbmQocG5nX3N0cnVjdHAgcHBJbiwgcG5nX2luZm9wIHBpKQoreworICAgcG5nX2NvbnN0X3N0cnVjdHAgcHAgPSBwcEluOworICAgc3RhbmRhcmRfZGlzcGxheSAqZHAgPSB2b2lkY2FzdChzdGFuZGFyZF9kaXNwbGF5KiwKKyAgICAgIHBuZ19nZXRfcHJvZ3Jlc3NpdmVfcHRyKHBwKSk7CisKKyAgIFVOVVNFRChwaSkKKworICAgLyogVmFsaWRhdGUgdGhlIGltYWdlIC0gcHJvZ3Jlc3NpdmUgcmVhZGluZyBvbmx5IHByb2R1Y2VzIG9uZSB2YXJpYW50IGZvcgorICAgICogaW50ZXJsYWNlZCBpbWFnZXMuCisgICAgKi8KKyAgIHN0YW5kYXJkX3RleHRfdmFsaWRhdGUoZHAsIHBwLCBwaSwKKyAgICAgIFBOR19MSUJQTkdfVkVSID49IDEwNTE4LypjaGVja19lbmQ6IHNlZSBjb21tZW50cyBhYm92ZSovKTsKKyAgIHN0YW5kYXJkX2ltYWdlX3ZhbGlkYXRlKGRwLCBwcCwgMCwgLTEpOworfQorCisvKiBBIHNpbmdsZSB0ZXN0IHJ1biBjaGVja2luZyB0aGUgc3RhbmRhcmQgaW1hZ2UgdG8gZW5zdXJlIGl0IGlzIG5vdCBkYW1hZ2VkLiAqLworc3RhdGljIHZvaWQKK3N0YW5kYXJkX3Rlc3QocG5nX3N0b3JlKiBjb25zdCBwc0luLCBwbmdfdWludF8zMiBjb25zdCBpZCwKKyAgIGludCBkb19pbnRlcmxhY2UsIGludCB1c2VfdXBkYXRlX2luZm8pCit7CisgICBzdGFuZGFyZF9kaXNwbGF5IGQ7CisgICBjb250ZXh0KHBzSW4sIGZhdWx0KTsKKworICAgLyogU2V0IHVwIHRoZSBkaXNwbGF5IChzdGFjayBmcmFtZSkgdmFyaWFibGVzIGZyb20gdGhlIGFyZ3VtZW50cyB0byB0aGUKKyAgICAqIGZ1bmN0aW9uIGFuZCBpbml0aWFsaXplIHRoZSBsb2NhbHMgdGhhdCBhcmUgZmlsbGVkIGluIGxhdGVyLgorICAgICovCisgICBzdGFuZGFyZF9kaXNwbGF5X2luaXQoJmQsIHBzSW4sIGlkLCBkb19pbnRlcmxhY2UsIHVzZV91cGRhdGVfaW5mbyk7CisKKyAgIC8qIEV2ZXJ5dGhpbmcgaXMgcHJvdGVjdGVkIGJ5IGEgVHJ5L0NhdGNoLiAgVGhlIGZ1bmN0aW9ucyBjYWxsZWQgYWxzbworICAgICogdHlwaWNhbGx5IGhhdmUgbG9jYWwgVHJ5L0NhdGNoIGJsb2Nrcy4KKyAgICAqLworICAgVHJ5CisgICB7CisgICAgICBwbmdfc3RydWN0cCBwcDsKKyAgICAgIHBuZ19pbmZvcCBwaTsKKworICAgICAgLyogR2V0IGEgcG5nX3N0cnVjdCBmb3IgcmVhZGluZyB0aGUgaW1hZ2UuIFRoaXMgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiBpdAorICAgICAgICogZmFpbHMsIHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhlIHJlc3VsdC4KKyAgICAgICAqLworICAgICAgcHAgPSBzZXRfc3RvcmVfZm9yX3JlYWQoZC5wcywgJnBpLCBkLmlkLAorICAgICAgICAgZC5kb19pbnRlcmxhY2UgPyAgKGQucHMtPnByb2dyZXNzaXZlID8KKyAgICAgICAgICAgICJwbmd2YWxpZCBwcm9ncmVzc2l2ZSBkZWludGVybGFjZXIiIDoKKyAgICAgICAgICAgICJwbmd2YWxpZCBzZXF1ZW50aWFsIGRlaW50ZXJsYWNlciIpIDogKGQucHMtPnByb2dyZXNzaXZlID8KKyAgICAgICAgICAgICAgICJwcm9ncmVzc2l2ZSByZWFkZXIiIDogInNlcXVlbnRpYWwgcmVhZGVyIikpOworCisgICAgICAvKiBJbml0aWFsaXplIHRoZSBwYWxldHRlIGNvcnJlY3RseSBmcm9tIHRoZSBwbmdfc3RvcmVfZmlsZS4gKi8KKyAgICAgIHN0YW5kYXJkX3BhbGV0dGVfaW5pdCgmZCk7CisKKyAgICAgIC8qIEludHJvZHVjZSB0aGUgY29ycmVjdCByZWFkIGZ1bmN0aW9uLiAqLworICAgICAgaWYgKGQucHMtPnByb2dyZXNzaXZlKQorICAgICAgeworICAgICAgICAgcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKHBwLCAmZCwgc3RhbmRhcmRfaW5mbywgcHJvZ3Jlc3NpdmVfcm93LAorICAgICAgICAgICAgc3RhbmRhcmRfZW5kKTsKKworICAgICAgICAgLyogTm93IGZlZWQgZGF0YSBpbnRvIHRoZSByZWFkZXIgdW50aWwgd2UgcmVhY2ggdGhlIGVuZDogKi8KKyAgICAgICAgIHN0b3JlX3Byb2dyZXNzaXZlX3JlYWQoZC5wcywgcHAsIHBpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIC8qIE5vdGUgdGhhdCB0aGlzIHRha2VzIHRoZSBzdG9yZSwgbm90IHRoZSBkaXNwbGF5LiAqLworICAgICAgICAgcG5nX3NldF9yZWFkX2ZuKHBwLCBkLnBzLCBzdG9yZV9yZWFkKTsKKworICAgICAgICAgLyogQ2hlY2sgdGhlIGhlYWRlciB2YWx1ZXM6ICovCisgICAgICAgICBwbmdfcmVhZF9pbmZvKHBwLCBwaSk7CisKKyAgICAgICAgIC8qIFRoZSBjb2RlIHRlc3RzIGJvdGggdmVyc2lvbnMgb2YgdGhlIGltYWdlcyB0aGF0IHRoZSBzZXF1ZW50aWFsCisgICAgICAgICAgKiByZWFkZXIgY2FuIHByb2R1Y2UuCisgICAgICAgICAgKi8KKyAgICAgICAgIHN0YW5kYXJkX2luZm9faW1wKCZkLCBwcCwgcGksIDIgLyppbWFnZXMqLyk7CisKKyAgICAgICAgIC8qIE5lZWQgdGhlIHRvdGFsIGJ5dGVzIGluIHRoZSBpbWFnZSBiZWxvdzsgd2UgY2FuJ3QgZ2V0IHRvIHRoaXMgcG9pbnQKKyAgICAgICAgICAqIHVubGVzcyB0aGUgUE5HIGZpbGUgdmFsdWVzIGhhdmUgYmVlbiBjaGVja2VkIGFnYWluc3QgdGhlIGV4cGVjdGVkCisgICAgICAgICAgKiB2YWx1ZXMuCisgICAgICAgICAgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIHNlcXVlbnRpYWxfcm93KCZkLCBwcCwgcGksIDAsIDEpOworCisgICAgICAgICAgICAvKiBBZnRlciB0aGUgbGFzdCBwYXNzIGxvb3Agb3ZlciB0aGUgcm93cyBhZ2FpbiB0byBjaGVjayB0aGF0IHRoZQorICAgICAgICAgICAgICogaW1hZ2UgaXMgY29ycmVjdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCFkLnNwZWVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc3RhbmRhcmRfdGV4dF92YWxpZGF0ZSgmZCwgcHAsIHBpLCAxLypjaGVja19lbmQqLyk7CisgICAgICAgICAgICAgICBzdGFuZGFyZF9pbWFnZV92YWxpZGF0ZSgmZCwgcHAsIDAsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgZC5wcy0+dmFsaWRhdGVkID0gMTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogQ2hlY2sgZm9yIHZhbGlkYXRpb24uICovCisgICAgICBpZiAoIWQucHMtPnZhbGlkYXRlZCkKKyAgICAgICAgIHBuZ19lcnJvcihwcCwgImltYWdlIHJlYWQgZmFpbGVkIHNpbGVudGx5Iik7CisKKyAgICAgIC8qIFN1Y2Nlc3NmdWwgY29tcGxldGlvbi4gKi8KKyAgIH0KKworICAgQ2F0Y2goZmF1bHQpCisgICAgICBkLnBzID0gZmF1bHQ7IC8qIG1ha2Ugc3VyZSB0aGlzIGhhc24ndCBiZWVuIGNsb2JiZXJlZC4gKi8KKworICAgLyogSW4gZWl0aGVyIGNhc2UgY2xlYW4gdXAgdGhlIHN0b3JlLiAqLworICAgc3RvcmVfcmVhZF9yZXNldChkLnBzKTsKK30KKworc3RhdGljIGludAordGVzdF9zdGFuZGFyZChwbmdfbW9kaWZpZXIqIGNvbnN0IHBtLCBwbmdfYnl0ZSBjb25zdCBjb2xvdXJfdHlwZSwKKyAgICBpbnQgYmRsbywgaW50IGNvbnN0IGJkaGkpCit7CisgICBmb3IgKDsgYmRsbyA8PSBiZGhpOyArK2JkbG8pCisgICB7CisgICAgICBpbnQgaW50ZXJsYWNlX3R5cGU7CisKKyAgICAgIGZvciAoaW50ZXJsYWNlX3R5cGUgPSBQTkdfSU5URVJMQUNFX05PTkU7CisgICAgICAgICAgIGludGVybGFjZV90eXBlIDwgSU5URVJMQUNFX0xBU1Q7ICsraW50ZXJsYWNlX3R5cGUpCisgICAgICB7CisgICAgICAgICBzdGFuZGFyZF90ZXN0KCZwbS0+dGhpcywgRklMRUlEKGNvbG91cl90eXBlLCBERVBUSChiZGxvKSwgMC8qcGFsZXR0ZSovLAorICAgICAgICAgICAgaW50ZXJsYWNlX3R5cGUsIDAsIDAsIDApLCBkb19yZWFkX2ludGVybGFjZSwgcG0tPnVzZV91cGRhdGVfaW5mbyk7CisKKyAgICAgICAgIGlmIChmYWlsKHBtKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gMTsgLyoga2VlcCBnb2luZyAqLworfQorCitzdGF0aWMgdm9pZAorcGVyZm9ybV9zdGFuZGFyZF90ZXN0KHBuZ19tb2RpZmllciAqcG0pCit7CisgICAvKiBUZXN0IGVhY2ggY29sb3VyIHR5cGUgb3ZlciB0aGUgdmFsaWQgcmFuZ2Ugb2YgYml0IGRlcHRocyAoZXhwcmVzc2VkIGFzCisgICAgKiBsb2cyKGJpdF9kZXB0aCkgaW4gdHVybiwgc3RvcCBhcyBzb29uIGFzIGFueSBlcnJvciBpcyBkZXRlY3RlZC4KKyAgICAqLworICAgaWYgKCF0ZXN0X3N0YW5kYXJkKHBtLCAwLCAwLCBSRUFEX0JESEkpKQorICAgICAgcmV0dXJuOworCisgICBpZiAoIXRlc3Rfc3RhbmRhcmQocG0sIDIsIDMsIFJFQURfQkRISSkpCisgICAgICByZXR1cm47CisKKyAgIGlmICghdGVzdF9zdGFuZGFyZChwbSwgMywgMCwgMykpCisgICAgICByZXR1cm47CisKKyAgIGlmICghdGVzdF9zdGFuZGFyZChwbSwgNCwgMywgUkVBRF9CREhJKSkKKyAgICAgIHJldHVybjsKKworICAgaWYgKCF0ZXN0X3N0YW5kYXJkKHBtLCA2LCAzLCBSRUFEX0JESEkpKQorICAgICAgcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNJWkUgVEVTVFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50Cit0ZXN0X3NpemUocG5nX21vZGlmaWVyKiBjb25zdCBwbSwgcG5nX2J5dGUgY29uc3QgY29sb3VyX3R5cGUsCisgICAgaW50IGJkbG8sIGludCBjb25zdCBiZGhpKQoreworICAgLyogUnVuIHRoZSB0ZXN0cyBvbiBlYWNoIGNvbWJpbmF0aW9uLgorICAgICoKKyAgICAqIE5PVEU6IG9uIG15IDMyIGJpdCB4ODYgZWFjaCBvZiB0aGUgZm9sbG93aW5nIGJsb2NrcyB0YWtlcworICAgICogYSB0b3RhbCBvZiAzLjUgc2Vjb25kcyBpZiBkb25lIGFjcm9zcyBldmVyeSBjb21ibyBvZiBiaXQgZGVwdGgKKyAgICAqIHdpZHRoIGFuZCBoZWlnaHQuICBUaGlzIGlzIGEgd2FzdGUgb2YgdGltZSBpbiBwcmFjdGljZSwgaGVuY2UgdGhlCisgICAgKiBoaW5jIGFuZCB3aW5jIHN0dWZmOgorICAgICovCisgICBzdGF0aWMgY29uc3QgcG5nX2J5dGUgaGluY1tdID0gezEsIDMsIDExLCAxLCA1fTsKKyAgIHN0YXRpYyBjb25zdCBwbmdfYnl0ZSB3aW5jW10gPSB7MSwgOSwgNSwgNywgMX07CisgICBjb25zdCBpbnQgc2F2ZV9iZGxvID0gYmRsbzsKKworICAgZm9yICg7IGJkbG8gPD0gYmRoaTsgKytiZGxvKQorICAgeworICAgICAgcG5nX3VpbnRfMzIgaCwgdzsKKworICAgICAgZm9yIChoPTE7IGg8PTE2OyBoKz1oaW5jW2JkbG9dKSBmb3IgKHc9MTsgdzw9MTY7IHcrPXdpbmNbYmRsb10pCisgICAgICB7CisgICAgICAgICAvKiBGaXJzdCB0ZXN0IGFsbCB0aGUgJ3NpemUnIGltYWdlcyBhZ2FpbnN0IHRoZSBzZXF1ZW50aWFsCisgICAgICAgICAgKiByZWFkZXIgdXNpbmcgbGlicG5nIHRvIGRlaW50ZXJsYWNlICh3aGVyZSByZXF1aXJlZC4pICBUaGlzCisgICAgICAgICAgKiB2YWxpZGF0ZXMgdGhlIHdyaXRlIHNpZGUgb2YgbGlicG5nLiAgVGhlcmUgYXJlIGZvdXIgcG9zc2liaWxpdGllcworICAgICAgICAgICogdG8gdmFsaWRhdGUuCisgICAgICAgICAgKi8KKyAgICAgICAgIHN0YW5kYXJkX3Rlc3QoJnBtLT50aGlzLCBGSUxFSUQoY29sb3VyX3R5cGUsIERFUFRIKGJkbG8pLCAwLypwYWxldHRlKi8sCisgICAgICAgICAgICBQTkdfSU5URVJMQUNFX05PTkUsIHcsIGgsIDApLCAwLypkb19pbnRlcmxhY2UqLywKKyAgICAgICAgICAgIHBtLT51c2VfdXBkYXRlX2luZm8pOworCisgICAgICAgICBpZiAoZmFpbChwbSkpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgc3RhbmRhcmRfdGVzdCgmcG0tPnRoaXMsIEZJTEVJRChjb2xvdXJfdHlwZSwgREVQVEgoYmRsbyksIDAvKnBhbGV0dGUqLywKKyAgICAgICAgICAgIFBOR19JTlRFUkxBQ0VfTk9ORSwgdywgaCwgMSksIDAvKmRvX2ludGVybGFjZSovLAorICAgICAgICAgICAgcG0tPnVzZV91cGRhdGVfaW5mbyk7CisKKyAgICAgICAgIGlmIChmYWlsKHBtKSkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAvKiBOb3cgdmFsaWRhdGUgdGhlIGludGVybGFjZWQgcmVhZCBzaWRlIC0gZG9faW50ZXJsYWNlIHRydWUsCisgICAgICAgICAgKiBpbiB0aGUgcHJvZ3Jlc3NpdmUgY2FzZSB0aGlzIGRvZXMgYWN0dWFsbHkgbWFrZSBhIGRpZmZlcmVuY2UKKyAgICAgICAgICAqIHRvIHRoZSBjb2RlIHVzZWQgaW4gdGhlIG5vbi1pbnRlcmxhY2VkIGNhc2UgdG9vLgorICAgICAgICAgICovCisgICAgICAgICBzdGFuZGFyZF90ZXN0KCZwbS0+dGhpcywgRklMRUlEKGNvbG91cl90eXBlLCBERVBUSChiZGxvKSwgMC8qcGFsZXR0ZSovLAorICAgICAgICAgICAgUE5HX0lOVEVSTEFDRV9OT05FLCB3LCBoLCAwKSwgMS8qZG9faW50ZXJsYWNlKi8sCisgICAgICAgICAgICBwbS0+dXNlX3VwZGF0ZV9pbmZvKTsKKworICAgICAgICAgaWYgKGZhaWwocG0pKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyMgICAgIGlmIENBTl9XUklURV9JTlRFUkxBQ0UKKyAgICAgICAgIC8qIFZhbGlkYXRlIHRoZSBwbmd2YWxpZCBjb2RlIGl0c2VsZjogKi8KKyAgICAgICAgIHN0YW5kYXJkX3Rlc3QoJnBtLT50aGlzLCBGSUxFSUQoY29sb3VyX3R5cGUsIERFUFRIKGJkbG8pLCAwLypwYWxldHRlKi8sCisgICAgICAgICAgICBQTkdfSU5URVJMQUNFX0FEQU03LCB3LCBoLCAxKSwgMS8qZG9faW50ZXJsYWNlKi8sCisgICAgICAgICAgICBwbS0+dXNlX3VwZGF0ZV9pbmZvKTsKKworICAgICAgICAgaWYgKGZhaWwocG0pKQorICAgICAgICAgICAgcmV0dXJuIDA7CisjICAgICBlbmRpZgorICAgICAgfQorICAgfQorCisgICAvKiBOb3cgZG8gdGhlIHRlc3RzIG9mIGxpYnBuZyBpbnRlcmxhY2UgaGFuZGxpbmcsIGFmdGVyIHdlIGhhdmUgbWFkZSBzdXJlCisgICAgKiB0aGF0IHRoZSBwbmd2YWxpZCB2ZXJzaW9uIHdvcmtzOgorICAgICovCisgICBmb3IgKGJkbG8gPSBzYXZlX2JkbG87IGJkbG8gPD0gYmRoaTsgKytiZGxvKQorICAgeworICAgICAgcG5nX3VpbnRfMzIgaCwgdzsKKworICAgICAgZm9yIChoPTE7IGg8PTE2OyBoKz1oaW5jW2JkbG9dKSBmb3IgKHc9MTsgdzw9MTY7IHcrPXdpbmNbYmRsb10pCisgICAgICB7CisjICAgICBpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQKKyAgICAgICAgIC8qIFRlc3Qgd2l0aCBwbmd2YWxpZCBnZW5lcmF0ZWQgaW50ZXJsYWNlZCBpbWFnZXMgZmlyc3Q7IHdlIGhhdmUKKyAgICAgICAgICAqIGFscmVhZHkgdmVyaWZ5IHRoZXNlIGFyZSBvayAodW5sZXNzIHBuZ3ZhbGlkIGhhcyBzZWxmLWNvbnNpc3RlbnQKKyAgICAgICAgICAqIHJlYWQvd3JpdGUgZXJyb3JzLCB3aGljaCBpcyB1bmxpa2VseSksIHNvIHRoaXMgZGV0ZWN0cyBlcnJvcnMgaW4gdGhlCisgICAgICAgICAgKiByZWFkIHNpZGUgZmlyc3Q6CisgICAgICAgICAgKi8KKyMgICAgIGlmIENBTl9XUklURV9JTlRFUkxBQ0UKKyAgICAgICAgIHN0YW5kYXJkX3Rlc3QoJnBtLT50aGlzLCBGSUxFSUQoY29sb3VyX3R5cGUsIERFUFRIKGJkbG8pLCAwLypwYWxldHRlKi8sCisgICAgICAgICAgICBQTkdfSU5URVJMQUNFX0FEQU03LCB3LCBoLCAxKSwgMC8qZG9faW50ZXJsYWNlKi8sCisgICAgICAgICAgICBwbS0+dXNlX3VwZGF0ZV9pbmZvKTsKKworICAgICAgICAgaWYgKGZhaWwocG0pKQorICAgICAgICAgICAgcmV0dXJuIDA7CisjICAgICBlbmRpZgorIyAgICAgZW5kaWYgLyogUkVBRF9JTlRFUkxBQ0lORyAqLworCisjICAgICBpZmRlZiBQTkdfV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVECisgICAgICAgICAvKiBUZXN0IHRoZSBsaWJwbmcgd3JpdGUgc2lkZSBhZ2FpbnN0IHRoZSBwbmd2YWxpZCByZWFkIHNpZGU6ICovCisgICAgICAgICBzdGFuZGFyZF90ZXN0KCZwbS0+dGhpcywgRklMRUlEKGNvbG91cl90eXBlLCBERVBUSChiZGxvKSwgMC8qcGFsZXR0ZSovLAorICAgICAgICAgICAgUE5HX0lOVEVSTEFDRV9BREFNNywgdywgaCwgMCksIDEvKmRvX2ludGVybGFjZSovLAorICAgICAgICAgICAgcG0tPnVzZV91cGRhdGVfaW5mbyk7CisKKyAgICAgICAgIGlmIChmYWlsKHBtKSkKKyAgICAgICAgICAgIHJldHVybiAwOworIyAgICAgZW5kaWYKKworIyAgICAgaWZkZWYgUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVECisjICAgICBpZmRlZiBQTkdfV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVECisgICAgICAgICAvKiBUZXN0IGJvdGggdG9nZXRoZXI6ICovCisgICAgICAgICBzdGFuZGFyZF90ZXN0KCZwbS0+dGhpcywgRklMRUlEKGNvbG91cl90eXBlLCBERVBUSChiZGxvKSwgMC8qcGFsZXR0ZSovLAorICAgICAgICAgICAgUE5HX0lOVEVSTEFDRV9BREFNNywgdywgaCwgMCksIDAvKmRvX2ludGVybGFjZSovLAorICAgICAgICAgICAgcG0tPnVzZV91cGRhdGVfaW5mbyk7CisKKyAgICAgICAgIGlmIChmYWlsKHBtKSkKKyAgICAgICAgICAgIHJldHVybiAwOworIyAgICAgZW5kaWYKKyMgICAgIGVuZGlmIC8qIFJFQURfSU5URVJMQUNJTkcgKi8KKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIDE7IC8qIGtlZXAgZ29pbmcgKi8KK30KKworc3RhdGljIHZvaWQKK3BlcmZvcm1fc2l6ZV90ZXN0KHBuZ19tb2RpZmllciAqcG0pCit7CisgICAvKiBUZXN0IGVhY2ggY29sb3VyIHR5cGUgb3ZlciB0aGUgdmFsaWQgcmFuZ2Ugb2YgYml0IGRlcHRocyAoZXhwcmVzc2VkIGFzCisgICAgKiBsb2cyKGJpdF9kZXB0aCkgaW4gdHVybiwgc3RvcCBhcyBzb29uIGFzIGFueSBlcnJvciBpcyBkZXRlY3RlZC4KKyAgICAqLworICAgaWYgKCF0ZXN0X3NpemUocG0sIDAsIDAsIFJFQURfQkRISSkpCisgICAgICByZXR1cm47CisKKyAgIGlmICghdGVzdF9zaXplKHBtLCAyLCAzLCBSRUFEX0JESEkpKQorICAgICAgcmV0dXJuOworCisgICAvKiBGb3IgdGhlIG1vbWVudCBkb24ndCBkbyB0aGUgcGFsZXR0ZSB0ZXN0IC0gaXQncyBhIHdhc3RlIG9mIHRpbWUgd2hlbgorICAgICogY29tcGFyZWQgdG8gdGhlIGdyYXlzY2FsZSB0ZXN0LgorICAgICovCisjaWYgMAorICAgaWYgKCF0ZXN0X3NpemUocG0sIDMsIDAsIDMpKQorICAgICAgcmV0dXJuOworI2VuZGlmCisKKyAgIGlmICghdGVzdF9zaXplKHBtLCA0LCAzLCBSRUFEX0JESEkpKQorICAgICAgcmV0dXJuOworCisgICBpZiAoIXRlc3Rfc2l6ZShwbSwgNiwgMywgUkVBRF9CREhJKSkKKyAgICAgIHJldHVybjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBUUkFOU0ZPUk0gVEVTVFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFBOR19SRUFEX1RSQU5TRk9STVNfU1VQUE9SVEVECisvKiBBIHNldCBvZiB0ZXN0cyB0byB2YWxpZGF0ZSBsaWJwbmcgaW1hZ2UgdHJhbnNmb3Jtcy4gIFRoZSBwb3NzaWJpbGl0aWVzIGhlcmUKKyAqIGFyZSBsZWdpb24gYmVjYXVzZSB0aGUgdHJhbnNmb3JtcyBjYW4gYmUgY29tYmluZWQgaW4gYSBjb21iaW5hdG9yaWFsCisgKiBmYXNoaW9uLiAgVG8gZGVhbCB3aXRoIHRoaXMgc29tZSBtZWFzdXJlIG9mIHJlc3RyYWludCBpcyByZXF1aXJlZCwgb3RoZXJ3aXNlCisgKiB0aGUgdGVzdHMgd291bGQgdGFrZSBmb3JldmVyLgorICovCit0eXBlZGVmIHN0cnVjdCBpbWFnZV9waXhlbAoreworICAgLyogQSBsb2NhbCAocG5ndmFsaWQpIHJlcHJlc2VudGF0aW9uIG9mIGEgUE5HIHBpeGVsLCBpbiBhbGwgaXRzCisgICAgKiB2YXJpb3VzIGZvcm1zLgorICAgICovCisgICB1bnNpZ25lZCBpbnQgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGE7IC8qIEZvciBub24tcGFsZXR0ZSBpbWFnZXMuICovCisgICB1bnNpZ25lZCBpbnQgcGFsZXR0ZV9pbmRleDsgICAgICAgICAgIC8qIEZvciBhIHBhbGV0dGUgaW1hZ2UuICovCisgICBwbmdfYnl0ZSAgICAgY29sb3VyX3R5cGU7ICAgICAgICAgICAgIC8qIEFzIGluIHRoZSBzcGVjLiAqLworICAgcG5nX2J5dGUgICAgIGJpdF9kZXB0aDsgICAgICAgICAgICAgICAvKiBEZWZpbmVzIGJpdCBzaXplIGluIHJvdyAqLworICAgcG5nX2J5dGUgICAgIHNhbXBsZV9kZXB0aDsgICAgICAgICAgICAvKiBTY2FsZSBvZiBzYW1wbGVzICovCisgICB1bnNpZ25lZCBpbnQgaGF2ZV90Uk5TIDoxOyAgICAgICAgICAgIC8qIHRSTlMgY2h1bmsgbWF5IG5lZWQgcHJvY2Vzc2luZyAqLworICAgdW5zaWduZWQgaW50IHN3YXBfcmdiIDoxOyAgICAgICAgICAgICAvKiBSR0Igc3dhcHBlZCB0byBCR1IgKi8KKyAgIHVuc2lnbmVkIGludCBhbHBoYV9maXJzdCA6MTsgICAgICAgICAgLyogQWxwaGEgYXQgc3RhcnQsIG5vdCBlbmQgKi8KKyAgIHVuc2lnbmVkIGludCBhbHBoYV9pbnZlcnRlZCA6MTsgICAgICAgLyogQWxwaGEgY2hhbm5lbCBpbnZlcnRlZCAqLworICAgdW5zaWduZWQgaW50IG1vbm9faW52ZXJ0ZWQgOjE7ICAgICAgICAvKiBHcmF5IGNoYW5uZWwgaW52ZXJ0ZWQgKi8KKyAgIHVuc2lnbmVkIGludCBzd2FwMTYgOjE7ICAgICAgICAgICAgICAgLyogQnl0ZSBzd2FwIDE2LWJpdCBjb21wb25lbnRzICovCisgICB1bnNpZ25lZCBpbnQgbGl0dGxlZW5kaWFuIDoxOyAgICAgICAgIC8qIEhpZ2ggYml0cyBvbiByaWdodCAqLworICAgdW5zaWduZWQgaW50IHNpZ19iaXRzIDoxOyAgICAgICAgICAgICAvKiBQaXhlbCBzaGlmdGVkIChzaWcgYml0cyBvbmx5KSAqLworCisgICAvKiBGb3IgY2hlY2tpbmcgdGhlIGNvZGUgY2FsY3VsYXRlcyBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlcworICAgICogYWxvbmcgd2l0aCBhbiBlcnJvciB2YWx1ZSwgYWNjdW11bGF0ZWQgZnJvbSB0aGUgdHJhbnNmb3Jtcy4gIEJlY2F1c2UgYW4KKyAgICAqIHNCSVQgc2V0dGluZyBhbGxvd3MgbGFyZ2VyIGVycm9yIGJvdW5kcyAoaW5kZWVkLCBieSB0aGUgc3BlYywgYXBwYXJlbnRseQorICAgICogdXAgdG8ganVzdCBsZXNzIHRoYW4gKy8tMSBpbiB0aGUgc2NhbGVkIHZhbHVlKSB0aGUgKmxvd2VzdCogc0JJVCBmb3IgZWFjaAorICAgICogY2hhbm5lbCBpcyBzdG9yZWQuICBUaGlzIHNCSVQgdmFsdWUgaXMgZm9sZGVkIGluIHRvIHRoZSBzdG9yZWQgZXJyb3IgdmFsdWUKKyAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGFwcGxpY2F0aW9uIG9mIHRoZSB0cmFuc2Zvcm1zIHRvIHRoZSBwaXhlbC4KKyAgICAqCisgICAgKiBJZiBzaWdfYml0cyBpcyBzZXQgYWJvdmUgdGhlIHJlZCwgZ3JlZW4sIGJsdWUgYW5kIGFscGhhIHZhbHVlcyBoYXZlIGJlZW4KKyAgICAqIHNjYWxlZCBzbyB0aGV5IG9ubHkgY29udGFpbiB0aGUgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgY29tcG9uZW50IHZhbHVlcy4KKyAgICAqLworICAgZG91YmxlICAgcmVkZiwgZ3JlZW5mLCBibHVlZiwgYWxwaGFmOworICAgZG91YmxlICAgcmVkZSwgZ3JlZW5lLCBibHVlZSwgYWxwaGFlOworICAgcG5nX2J5dGUgcmVkX3NCSVQsIGdyZWVuX3NCSVQsIGJsdWVfc0JJVCwgYWxwaGFfc0JJVDsKK30gaW1hZ2VfcGl4ZWw7CisKKy8qIFNoYXJlZCB1dGlsaXR5IGZ1bmN0aW9uLCBzZWUgYmVsb3cuICovCitzdGF0aWMgdm9pZAoraW1hZ2VfcGl4ZWxfc2V0ZihpbWFnZV9waXhlbCAqdGhpcywgdW5zaWduZWQgaW50IHJNYXgsIHVuc2lnbmVkIGludCBnTWF4LAorICAgICAgICB1bnNpZ25lZCBpbnQgYk1heCwgdW5zaWduZWQgaW50IGFNYXgpCit7CisgICB0aGlzLT5yZWRmID0gdGhpcy0+cmVkIC8gKGRvdWJsZSlyTWF4OworICAgdGhpcy0+Z3JlZW5mID0gdGhpcy0+Z3JlZW4gLyAoZG91YmxlKWdNYXg7CisgICB0aGlzLT5ibHVlZiA9IHRoaXMtPmJsdWUgLyAoZG91YmxlKWJNYXg7CisgICB0aGlzLT5hbHBoYWYgPSB0aGlzLT5hbHBoYSAvIChkb3VibGUpYU1heDsKKworICAgaWYgKHRoaXMtPnJlZCA8IHJNYXgpCisgICAgICB0aGlzLT5yZWRlID0gdGhpcy0+cmVkZiAqIERCTF9FUFNJTE9OOworICAgZWxzZQorICAgICAgdGhpcy0+cmVkZSA9IDA7CisgICBpZiAodGhpcy0+Z3JlZW4gPCBnTWF4KQorICAgICAgdGhpcy0+Z3JlZW5lID0gdGhpcy0+Z3JlZW5mICogREJMX0VQU0lMT047CisgICBlbHNlCisgICAgICB0aGlzLT5ncmVlbmUgPSAwOworICAgaWYgKHRoaXMtPmJsdWUgPCBiTWF4KQorICAgICAgdGhpcy0+Ymx1ZWUgPSB0aGlzLT5ibHVlZiAqIERCTF9FUFNJTE9OOworICAgZWxzZQorICAgICAgdGhpcy0+Ymx1ZWUgPSAwOworICAgaWYgKHRoaXMtPmFscGhhIDwgYU1heCkKKyAgICAgIHRoaXMtPmFscGhhZSA9IHRoaXMtPmFscGhhZiAqIERCTF9FUFNJTE9OOworICAgZWxzZQorICAgICAgdGhpcy0+YWxwaGFlID0gMDsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgc3RydWN0dXJlIGZvciB0aGUgbmV4dCBwaXhlbCAtIGNhbGwgdGhpcyBiZWZvcmUgZG9pbmcgYW55CisgKiB0cmFuc2Zvcm1zIGFuZCBjYWxsIGl0IGZvciBlYWNoIHBpeGVsIHNpbmNlIGFsbCB0aGUgZmllbGRzIG1heSBuZWVkIHRvIGJlCisgKiByZXNldC4KKyAqLworc3RhdGljIHZvaWQKK2ltYWdlX3BpeGVsX2luaXQoaW1hZ2VfcGl4ZWwgKnRoaXMsIHBuZ19jb25zdF9ieXRlcCByb3csIHBuZ19ieXRlIGNvbG91cl90eXBlLAorICAgIHBuZ19ieXRlIGJpdF9kZXB0aCwgcG5nX3VpbnRfMzIgeCwgc3RvcmVfcGFsZXR0ZSBwYWxldHRlLAorICAgIGNvbnN0IGltYWdlX3BpeGVsICpmb3JtYXQgLypmcm9tIHBuZ3ZhbGlkIHRyYW5zZm9ybSBvZiBpbnB1dCovKQoreworICAgY29uc3QgcG5nX2J5dGUgc2FtcGxlX2RlcHRoID0gKHBuZ19ieXRlKShjb2xvdXJfdHlwZSA9PQorICAgICAgUE5HX0NPTE9SX1RZUEVfUEFMRVRURSA/IDggOiBiaXRfZGVwdGgpOworICAgY29uc3QgdW5zaWduZWQgaW50IG1heCA9ICgxVTw8c2FtcGxlX2RlcHRoKS0xOworICAgY29uc3QgaW50IHN3YXAxNiA9IChmb3JtYXQgIT0gMCAmJiBmb3JtYXQtPnN3YXAxNik7CisgICBjb25zdCBpbnQgbGl0dGxlZW5kaWFuID0gKGZvcm1hdCAhPSAwICYmIGZvcm1hdC0+bGl0dGxlZW5kaWFuKTsKKyAgIGNvbnN0IGludCBzaWdfYml0cyA9IChmb3JtYXQgIT0gMCAmJiBmb3JtYXQtPnNpZ19iaXRzKTsKKworICAgLyogSW5pdGlhbGx5IGp1c3Qgc2V0IGV2ZXJ5dGhpbmcgdG8gdGhlIHNhbWUgbnVtYmVyIGFuZCB0aGUgYWxwaGEgdG8gb3BhcXVlLgorICAgICogTm90ZSB0aGF0IHRoaXMgY3VycmVudGx5IGFzc3VtZXMgYSBzaW1wbGUgcGFsZXR0ZSB3aGVyZSBlbnRyeSB4IGhhcyBjb2xvdXIKKyAgICAqIHJnYih4LHgseCkhCisgICAgKi8KKyAgIHRoaXMtPnBhbGV0dGVfaW5kZXggPSB0aGlzLT5yZWQgPSB0aGlzLT5ncmVlbiA9IHRoaXMtPmJsdWUgPQorICAgICAgc2FtcGxlKHJvdywgY29sb3VyX3R5cGUsIGJpdF9kZXB0aCwgeCwgMCwgc3dhcDE2LCBsaXR0bGVlbmRpYW4pOworICAgdGhpcy0+YWxwaGEgPSBtYXg7CisgICB0aGlzLT5yZWRfc0JJVCA9IHRoaXMtPmdyZWVuX3NCSVQgPSB0aGlzLT5ibHVlX3NCSVQgPSB0aGlzLT5hbHBoYV9zQklUID0KKyAgICAgIHNhbXBsZV9kZXB0aDsKKworICAgLyogVGhlbiBvdmVycmlkZSBhcyBhcHByb3ByaWF0ZTogKi8KKyAgIGlmIChjb2xvdXJfdHlwZSA9PSAzKSAvKiBwYWxldHRlICovCisgICB7CisgICAgICAvKiBUaGlzIHBlcm1pdHMgdGhlIGNhbGxlciB0byBkZWZhdWx0IHRvIHRoZSBzYW1wbGUgdmFsdWUuICovCisgICAgICBpZiAocGFsZXR0ZSAhPSAwKQorICAgICAgeworICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGkgPSB0aGlzLT5wYWxldHRlX2luZGV4OworCisgICAgICAgICB0aGlzLT5yZWQgPSBwYWxldHRlW2ldLnJlZDsKKyAgICAgICAgIHRoaXMtPmdyZWVuID0gcGFsZXR0ZVtpXS5ncmVlbjsKKyAgICAgICAgIHRoaXMtPmJsdWUgPSBwYWxldHRlW2ldLmJsdWU7CisgICAgICAgICB0aGlzLT5hbHBoYSA9IHBhbGV0dGVbaV0uYWxwaGE7CisgICAgICB9CisgICB9CisKKyAgIGVsc2UgLyogbm90IHBhbGV0dGUgKi8KKyAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBpID0gMDsKKworICAgICAgaWYgKChjb2xvdXJfdHlwZSAmIDQpICE9IDAgJiYgZm9ybWF0ICE9IDAgJiYgZm9ybWF0LT5hbHBoYV9maXJzdCkKKyAgICAgIHsKKyAgICAgICAgIHRoaXMtPmFscGhhID0gdGhpcy0+cmVkOworICAgICAgICAgLyogVGhpcyBoYW5kbGVzIHRoZSBncmF5IGNhc2UgZm9yICdBRycgcGl4ZWxzICovCisgICAgICAgICB0aGlzLT5wYWxldHRlX2luZGV4ID0gdGhpcy0+cmVkID0gdGhpcy0+Z3JlZW4gPSB0aGlzLT5ibHVlID0KKyAgICAgICAgICAgIHNhbXBsZShyb3csIGNvbG91cl90eXBlLCBiaXRfZGVwdGgsIHgsIDEsIHN3YXAxNiwgbGl0dGxlZW5kaWFuKTsKKyAgICAgICAgIGkgPSAxOworICAgICAgfQorCisgICAgICBpZiAoY29sb3VyX3R5cGUgJiAyKQorICAgICAgeworICAgICAgICAgLyogR3JlZW4gaXMgc2Vjb25kIGZvciBib3RoIEJHUiBhbmQgUkdCOiAqLworICAgICAgICAgdGhpcy0+Z3JlZW4gPSBzYW1wbGUocm93LCBjb2xvdXJfdHlwZSwgYml0X2RlcHRoLCB4LCArK2ksIHN3YXAxNiwKKyAgICAgICAgICAgICAgICAgbGl0dGxlZW5kaWFuKTsKKworICAgICAgICAgaWYgKGZvcm1hdCAhPSAwICYmIGZvcm1hdC0+c3dhcF9yZ2IpIC8qIEJHUiAqLworICAgICAgICAgICAgIHRoaXMtPnJlZCA9IHNhbXBsZShyb3csIGNvbG91cl90eXBlLCBiaXRfZGVwdGgsIHgsICsraSwgc3dhcDE2LAorICAgICAgICAgICAgICAgICAgICAgbGl0dGxlZW5kaWFuKTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICB0aGlzLT5ibHVlID0gc2FtcGxlKHJvdywgY29sb3VyX3R5cGUsIGJpdF9kZXB0aCwgeCwgKytpLCBzd2FwMTYsCisgICAgICAgICAgICAgICAgICAgICBsaXR0bGVlbmRpYW4pOworICAgICAgfQorCisgICAgICBlbHNlIC8qIGdyYXlzY2FsZSAqLyBpZiAoZm9ybWF0ICE9IDAgJiYgZm9ybWF0LT5tb25vX2ludmVydGVkKQorICAgICAgICAgdGhpcy0+cmVkID0gdGhpcy0+Z3JlZW4gPSB0aGlzLT5ibHVlID0gdGhpcy0+cmVkIF4gbWF4OworCisgICAgICBpZiAoKGNvbG91cl90eXBlICYgNCkgIT0gMCkgLyogYWxwaGEgKi8KKyAgICAgIHsKKyAgICAgICAgIGlmIChmb3JtYXQgPT0gMCB8fCAhZm9ybWF0LT5hbHBoYV9maXJzdCkKKyAgICAgICAgICAgICB0aGlzLT5hbHBoYSA9IHNhbXBsZShyb3csIGNvbG91cl90eXBlLCBiaXRfZGVwdGgsIHgsICsraSwgc3dhcDE2LAorICAgICAgICAgICAgICAgICAgICAgbGl0dGxlZW5kaWFuKTsKKworICAgICAgICAgaWYgKGZvcm1hdCAhPSAwICYmIGZvcm1hdC0+YWxwaGFfaW52ZXJ0ZWQpCisgICAgICAgICAgICB0aGlzLT5hbHBoYSBePSBtYXg7CisgICAgICB9CisgICB9CisKKyAgIC8qIENhbGN1bGF0ZSB0aGUgc2NhbGVkIHZhbHVlcywgdGhlc2UgYXJlIHNpbXBseSB0aGUgdmFsdWVzIGRpdmlkZWQgYnkKKyAgICAqICdtYXgnIGFuZCB0aGUgZXJyb3IgaXMgaW5pdGlhbGl6ZWQgdG8gdGhlIGRvdWJsZSBwcmVjaXNpb24gZXBzaWxvbiB2YWx1ZQorICAgICogZnJvbSB0aGUgaGVhZGVyIGZpbGUuCisgICAgKi8KKyAgIGltYWdlX3BpeGVsX3NldGYodGhpcywKKyAgICAgIHNpZ19iaXRzID8gKDFVIDw8IGZvcm1hdC0+cmVkX3NCSVQpLTEgOiBtYXgsCisgICAgICBzaWdfYml0cyA/ICgxVSA8PCBmb3JtYXQtPmdyZWVuX3NCSVQpLTEgOiBtYXgsCisgICAgICBzaWdfYml0cyA/ICgxVSA8PCBmb3JtYXQtPmJsdWVfc0JJVCktMSA6IG1heCwKKyAgICAgIHNpZ19iaXRzID8gKDFVIDw8IGZvcm1hdC0+YWxwaGFfc0JJVCktMSA6IG1heCk7CisKKyAgIC8qIFN0b3JlIHRoZSBpbnB1dCBpbmZvcm1hdGlvbiBmb3IgdXNlIGluIHRoZSB0cmFuc2Zvcm1zIC0gdGhlc2Ugd2lsbAorICAgICogbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbi4KKyAgICAqLworICAgdGhpcy0+Y29sb3VyX3R5cGUgPSBjb2xvdXJfdHlwZTsKKyAgIHRoaXMtPmJpdF9kZXB0aCA9IGJpdF9kZXB0aDsKKyAgIHRoaXMtPnNhbXBsZV9kZXB0aCA9IHNhbXBsZV9kZXB0aDsKKyAgIHRoaXMtPmhhdmVfdFJOUyA9IDA7CisgICB0aGlzLT5zd2FwX3JnYiA9IDA7CisgICB0aGlzLT5hbHBoYV9maXJzdCA9IDA7CisgICB0aGlzLT5hbHBoYV9pbnZlcnRlZCA9IDA7CisgICB0aGlzLT5tb25vX2ludmVydGVkID0gMDsKKyAgIHRoaXMtPnN3YXAxNiA9IDA7CisgICB0aGlzLT5saXR0bGVlbmRpYW4gPSAwOworICAgdGhpcy0+c2lnX2JpdHMgPSAwOworfQorCisjaWYgZGVmaW5lZCBQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVEIHx8IGRlZmluZWQgUE5HX1JFQURfR1JBWV9UT19SR0JfU1VQUE9SVEVEXAorICAgfHwgZGVmaW5lZCBQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVEIHx8IGRlZmluZWQgUE5HX1JFQURfRVhQQU5EXzE2X1NVUFBPUlRFRFwKKyAgIHx8IGRlZmluZWQgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQKKy8qIENvbnZlcnQgYSBwYWxldHRlIGltYWdlIHRvIGFuIHJnYiBpbWFnZS4gIFRoaXMgbmVjZXNzYXJpbHkgY29udmVydHMgdGhlIHRSTlMKKyAqIGNodW5rIGF0IHRoZSBzYW1lIHRpbWUsIGJlY2F1c2UgdGhlIHRSTlMgd2lsbCBiZSBpbiBwYWxldHRlIGZvcm0uICBUaGUgd2F5CisgKiBwYWxldHRlIHZhbGlkYXRpb24gd29ya3MgbWVhbnMgdGhhdCB0aGUgb3JpZ2luYWwgcGFsZXR0ZSBpcyBuZXZlciB1cGRhdGVkLAorICogaW5zdGVhZCB0aGUgaW1hZ2VfcGl4ZWwgdmFsdWUgZnJvbSB0aGUgcm93IGNvbnRhaW5zIHRoZSBSR0Igb2YgdGhlCisgKiBjb3JyZXNwb25kaW5nIHBhbGV0dGUgZW50cnkgYW5kICp0aGlzKiBpcyB1cGRhdGVkLiAgQ29uc2VxdWVudGx5IHRoaXMgcm91dGluZQorICogb25seSBuZWVkcyB0byBjaGFuZ2UgdGhlIGNvbG91ciB0eXBlIGluZm9ybWF0aW9uLgorICovCitzdGF0aWMgdm9pZAoraW1hZ2VfcGl4ZWxfY29udmVydF9QTFRFKGltYWdlX3BpeGVsICp0aGlzKQoreworICAgaWYgKHRoaXMtPmNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCisgICB7CisgICAgICBpZiAodGhpcy0+aGF2ZV90Uk5TKQorICAgICAgeworICAgICAgICAgdGhpcy0+Y29sb3VyX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEE7CisgICAgICAgICB0aGlzLT5oYXZlX3RSTlMgPSAwOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICAgdGhpcy0+Y29sb3VyX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9SR0I7CisKKyAgICAgIC8qIFRoZSBiaXQgZGVwdGggb2YgdGhlIHJvdyBjaGFuZ2VzIGF0IHRoaXMgcG9pbnQgdG9vIChub3RpY2UgdGhhdCB0aGlzIGlzCisgICAgICAgKiB0aGUgcm93IGZvcm1hdCwgbm90IHRoZSBzYW1wbGUgZGVwdGgsIHdoaWNoIGlzIHNlcGFyYXRlLikKKyAgICAgICAqLworICAgICAgdGhpcy0+Yml0X2RlcHRoID0gODsKKyAgIH0KK30KKworLyogQWRkIGFuIGFscGhhIGNoYW5uZWw7IHRoaXMgd2lsbCBpbXBvcnQgdGhlIHRSTlMgaW5mb3JtYXRpb24gYmVjYXVzZSB0Uk5TIGlzCisgKiBub3QgdmFsaWQgaW4gYW4gYWxwaGEgaW1hZ2UuICBUaGUgYml0IGRlcHRoIHdpbGwgaW52YXJpYWJseSBiZSBzZXQgdG8gYXQKKyAqIGxlYXN0IDggcHJpb3IgdG8gMS43LjAuICBQYWxldHRlIGltYWdlcyB3aWxsIGJlIGNvbnZlcnRlZCB0byBhbHBoYSAodXNpbmcKKyAqIHRoZSBhYm92ZSBBUEkpLiAgV2l0aCBwbmdfc2V0X2JhY2tncm91bmQgdGhlIGFscGhhIGNoYW5uZWwgaXMgbmV2ZXIgZXhwYW5kZWQKKyAqIGJ1dCB0aGlzIHJvdXRpbmUgaXMgdXNlZCBieSBwbmd2YWxpZCB0byBzaW1wbGlmeSBjb2RlOyAnZm9yX2JhY2tncm91bmQnCisgKiByZWNvcmRzIHRoaXMuCisgKi8KK3N0YXRpYyB2b2lkCitpbWFnZV9waXhlbF9hZGRfYWxwaGEoaW1hZ2VfcGl4ZWwgKnRoaXMsIGNvbnN0IHN0YW5kYXJkX2Rpc3BsYXkgKmRpc3BsYXksCisgICBpbnQgZm9yX2JhY2tncm91bmQpCit7CisgICBpZiAodGhpcy0+Y29sb3VyX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgICAgIGltYWdlX3BpeGVsX2NvbnZlcnRfUExURSh0aGlzKTsKKworICAgaWYgKCh0aGlzLT5jb2xvdXJfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKSA9PSAwKQorICAgeworICAgICAgaWYgKHRoaXMtPmNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpCisgICAgICB7CisjICAgICAgICBpZiBQTkdfTElCUE5HX1ZFUiA8IDEwNzAwCisgICAgICAgICAgICBpZiAoIWZvcl9iYWNrZ3JvdW5kICYmIHRoaXMtPmJpdF9kZXB0aCA8IDgpCisgICAgICAgICAgICAgICB0aGlzLT5iaXRfZGVwdGggPSB0aGlzLT5zYW1wbGVfZGVwdGggPSA4OworIyAgICAgICAgZW5kaWYKKworICAgICAgICAgaWYgKHRoaXMtPmhhdmVfdFJOUykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEFmdGVyIDEuNyB0aGUgZXhwYW5zaW9uIG9mIGJpdCBkZXB0aCBvbmx5IGhhcHBlbnMgaWYgdGhlcmUgaXMgYQorICAgICAgICAgICAgICogdFJOUyBjaHVuayB0byBleHBhbmQgYXQgdGhpcyBwb2ludC4KKyAgICAgICAgICAgICAqLworIyAgICAgICAgICAgaWYgUE5HX0xJQlBOR19WRVIgPj0gMTA3MDAKKyAgICAgICAgICAgICAgIGlmICghZm9yX2JhY2tncm91bmQgJiYgdGhpcy0+Yml0X2RlcHRoIDwgOCkKKyAgICAgICAgICAgICAgICAgIHRoaXMtPmJpdF9kZXB0aCA9IHRoaXMtPnNhbXBsZV9kZXB0aCA9IDg7CisjICAgICAgICAgICBlbmRpZgorCisgICAgICAgICAgICB0aGlzLT5oYXZlX3RSTlMgPSAwOworCisgICAgICAgICAgICAvKiBDaGVjayB0aGUgaW5wdXQsIG9yaWdpbmFsLCBjaGFubmVsIHZhbHVlIGhlcmUgYWdhaW5zdCB0aGUKKyAgICAgICAgICAgICAqIG9yaWdpbmFsIHRSTlMgZ3JheSBjaHVuayB2YWxpZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHRoaXMtPnJlZCA9PSBkaXNwbGF5LT50cmFuc3BhcmVudC5yZWQpCisgICAgICAgICAgICAgICB0aGlzLT5hbHBoYWYgPSAwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgdGhpcy0+YWxwaGFmID0gMTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRoaXMtPmFscGhhZiA9IDE7CisKKyAgICAgICAgIHRoaXMtPmNvbG91cl90eXBlID0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQTsKKyAgICAgIH0KKworICAgICAgZWxzZSBpZiAodGhpcy0+Y29sb3VyX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQorICAgICAgeworICAgICAgICAgaWYgKHRoaXMtPmhhdmVfdFJOUykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPmhhdmVfdFJOUyA9IDA7CisKKyAgICAgICAgICAgIC8qIEFnYWluLCBjaGVjayB0aGUgZXhhY3QgaW5wdXQgdmFsdWVzLCBub3QgdGhlIGN1cnJlbnQgdHJhbnNmb3JtZWQKKyAgICAgICAgICAgICAqIHZhbHVlIQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAodGhpcy0+cmVkID09IGRpc3BsYXktPnRyYW5zcGFyZW50LnJlZCAmJgorICAgICAgICAgICAgICAgdGhpcy0+Z3JlZW4gPT0gZGlzcGxheS0+dHJhbnNwYXJlbnQuZ3JlZW4gJiYKKyAgICAgICAgICAgICAgIHRoaXMtPmJsdWUgPT0gZGlzcGxheS0+dHJhbnNwYXJlbnQuYmx1ZSkKKyAgICAgICAgICAgICAgIHRoaXMtPmFscGhhZiA9IDA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICB0aGlzLT5hbHBoYWYgPSAxOworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhpcy0+YWxwaGFmID0gMTsKKworICAgICAgICAgdGhpcy0+Y29sb3VyX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEE7CisgICAgICB9CisKKyAgICAgIC8qIFRoZSBlcnJvciBpbiB0aGUgYWxwaGEgaXMgemVybyBhbmQgdGhlIHNCSVQgdmFsdWUgY29tZXMgZnJvbSB0aGUKKyAgICAgICAqIG9yaWdpbmFsIHNCSVQgZGF0YSAoYWN0dWFsbHkgaXQgd2lsbCBhbHdheXMgYmUgdGhlIG9yaWdpbmFsIGJpdCBkZXB0aCkuCisgICAgICAgKi8KKyAgICAgIHRoaXMtPmFscGhhZSA9IDA7CisgICAgICB0aGlzLT5hbHBoYV9zQklUID0gZGlzcGxheS0+YWxwaGFfc0JJVDsKKyAgIH0KK30KKyNlbmRpZiAvKiB0cmFuc2Zvcm1zIHRoYXQgbmVlZCBpbWFnZV9waXhlbF9hZGRfYWxwaGEgKi8KKworc3RydWN0IHRyYW5zZm9ybV9kaXNwbGF5OwordHlwZWRlZiBzdHJ1Y3QgaW1hZ2VfdHJhbnNmb3JtCit7CisgICAvKiBUaGUgbmFtZSBvZiB0aGlzIHRyYW5zZm9ybTogYSBzdHJpbmcuICovCisgICBjb25zdCBjaGFyICpuYW1lOworCisgICAvKiBFYWNoIHRyYW5zZm9ybSBjYW4gYmUgZGlzYWJsZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lOiAqLworICAgaW50IGVuYWJsZTsKKworICAgLyogVGhlIGdsb2JhbCBsaXN0IG9mIHRyYW5zZm9ybXM7IHJlYWQgb25seS4gKi8KKyAgIHN0cnVjdCBpbWFnZV90cmFuc2Zvcm0gKmNvbnN0IGxpc3Q7CisKKyAgIC8qIFRoZSBnbG9iYWwgY291bnQgb2YgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIHRyYW5zZm9ybSBoYXMgYmVlbiBzZXQgb24gYW4KKyAgICAqIGltYWdlLgorICAgICovCisgICB1bnNpZ25lZCBpbnQgZ2xvYmFsX3VzZTsKKworICAgLyogVGhlIGxvY2FsIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyB0cmFuc2Zvcm0gaGFzIGJlZW4gc2V0LiAqLworICAgdW5zaWduZWQgaW50IGxvY2FsX3VzZTsKKworICAgLyogVGhlIG5leHQgdHJhbnNmb3JtIGluIHRoZSBsaXN0LCBlYWNoIHRyYW5zZm9ybSBtdXN0IGNhbGwgaXRzIG93biBuZXh0CisgICAgKiB0cmFuc2Zvcm0gYWZ0ZXIgaXQgaGFzIHByb2Nlc3NlZCB0aGUgcGl4ZWwgc3VjY2Vzc2Z1bGx5LgorICAgICovCisgICBjb25zdCBzdHJ1Y3QgaW1hZ2VfdHJhbnNmb3JtICpuZXh0OworCisgICAvKiBBIHNpbmdsZSB0cmFuc2Zvcm0gZm9yIHRoZSBpbWFnZSwgZXhwcmVzc2VkIGFzIGEgc2VyaWVzIG9mIGZ1bmN0aW9uCisgICAgKiBjYWxsYmFja3MgYW5kIHNvbWUgc3BhY2UgZm9yIHZhbHVlcy4KKyAgICAqCisgICAgKiBGaXJzdCBhIGNhbGxiYWNrIHRvIGFkZCBhbnkgcmVxdWlyZWQgbW9kaWZpY2F0aW9ucyB0byB0aGUgcG5nX21vZGlmaWVyOworICAgICogdGhpcyBnZXRzIGNhbGxlZCBqdXN0IGJlZm9yZSB0aGUgbW9kaWZpZXIgaXMgc2V0IHVwIGZvciByZWFkLgorICAgICovCisgICB2b2lkICgqaW5pKShjb25zdCBzdHJ1Y3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAorICAgICAgc3RydWN0IHRyYW5zZm9ybV9kaXNwbGF5ICp0aGF0KTsKKworICAgLyogQW5kIGEgY2FsbGJhY2sgdG8gc2V0IHRoZSB0cmFuc2Zvcm0gb24gdGhlIGN1cnJlbnQgcG5nX3JlYWRfc3RydWN0OgorICAgICovCisgICB2b2lkICgqc2V0KShjb25zdCBzdHJ1Y3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAorICAgICAgc3RydWN0IHRyYW5zZm9ybV9kaXNwbGF5ICp0aGF0LCBwbmdfc3RydWN0cCBwcCwgcG5nX2luZm9wIHBpKTsKKworICAgLyogVGhlbiBhIHRyYW5zZm9ybSB0aGF0IHRha2VzIGFuIGlucHV0IHBpeGVsIGluIG9uZSBQTkcgZm9ybWF0IG9yIGFub3RoZXIKKyAgICAqIGFuZCBtb2RpZmllcyBpdCBieSBhIHBuZ3ZhbGlkIGltcGxlbWVudGF0aW9uIG9mIHRoZSB0cmFuc2Zvcm0gKHRodXMKKyAgICAqIGR1cGxpY2F0aW5nIHRoZSBsaWJwbmcgaW50ZW50IHdpdGhvdXQsIHdlIGhvcGUsIGR1cGxpY2F0aW5nIHRoZSBidWdzCisgICAgKiBpbiB0aGUgbGlicG5nIGltcGxlbWVudGF0aW9uISkgIFRoZSBwbmdfc3RydWN0cCBpcyBzb2xlbHkgdG8gYWxsb3cgZXJyb3IKKyAgICAqIHJlcG9ydGluZyB2aWEgcG5nX2Vycm9yIGFuZCBwbmdfd2FybmluZy4KKyAgICAqLworICAgdm9pZCAoKm1vZCkoY29uc3Qgc3RydWN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywgaW1hZ2VfcGl4ZWwgKnRoYXQsCisgICAgICBwbmdfY29uc3Rfc3RydWN0cCBwcCwgY29uc3Qgc3RydWN0IHRyYW5zZm9ybV9kaXNwbGF5ICpkaXNwbGF5KTsKKworICAgLyogQWRkIHRoaXMgdHJhbnNmb3JtIHRvIHRoZSBsaXN0IGFuZCByZXR1cm4gdHJ1ZSBpZiB0aGUgdHJhbnNmb3JtIGlzCisgICAgKiBtZWFuaW5nZnVsIGZvciB0aGlzIGNvbG91ciB0eXBlIGFuZCBiaXQgZGVwdGggLSBpZiBmYWxzZSB0aGVuIHRoZQorICAgICogdHJhbnNmb3JtIHNob3VsZCBoYXZlIG5vIGVmZmVjdCBvbiB0aGUgaW1hZ2Ugc28gdGhlcmUncyBub3QgYSBsb3Qgb2YKKyAgICAqIHBvaW50IHJ1bm5pbmcgaXQuCisgICAgKi8KKyAgIGludCAoKmFkZCkoc3RydWN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKKyAgICAgIGNvbnN0IHN0cnVjdCBpbWFnZV90cmFuc2Zvcm0gKip0aGF0LCBwbmdfYnl0ZSBjb2xvdXJfdHlwZSwKKyAgICAgIHBuZ19ieXRlIGJpdF9kZXB0aCk7Cit9IGltYWdlX3RyYW5zZm9ybTsKKwordHlwZWRlZiBzdHJ1Y3QgdHJhbnNmb3JtX2Rpc3BsYXkKK3sKKyAgIHN0YW5kYXJkX2Rpc3BsYXkgdGhpczsKKworICAgLyogUGFyYW1ldGVycyAqLworICAgcG5nX21vZGlmaWVyKiAgICAgICAgICAgICAgcG07CisgICBjb25zdCBpbWFnZV90cmFuc2Zvcm0qIHRyYW5zZm9ybV9saXN0OworICAgdW5zaWduZWQgaW50IG1heF9nYW1tYV84OworCisgICAvKiBMb2NhbCB2YXJpYWJsZXMgKi8KKyAgIHBuZ19ieXRlIG91dHB1dF9jb2xvdXJfdHlwZTsKKyAgIHBuZ19ieXRlIG91dHB1dF9iaXRfZGVwdGg7CisgICBwbmdfYnl0ZSB1bnBhY2tlZDsKKworICAgLyogTW9kaWZpY2F0aW9ucyAobm90IG5lY2Vzc2FyaWx5IHVzZWQuKSAqLworICAgZ2FtYV9tb2RpZmljYXRpb24gZ2FtYV9tb2Q7CisgICBjaHJtX21vZGlmaWNhdGlvbiBjaHJtX21vZDsKKyAgIHNyZ2JfbW9kaWZpY2F0aW9uIHNyZ2JfbW9kOworfSB0cmFuc2Zvcm1fZGlzcGxheTsKKworLyogU2V0IHNSR0IsIGNIUk0gYW5kIGdBTUEgdHJhbnNmb3JtcyBhcyByZXF1aXJlZCBieSB0aGUgY3VycmVudCBlbmNvZGluZy4gKi8KK3N0YXRpYyB2b2lkCit0cmFuc2Zvcm1fc2V0X2VuY29kaW5nKHRyYW5zZm9ybV9kaXNwbGF5ICp0aGlzKQoreworICAgLyogU2V0IHVwIHRoZSBwbmdfbW9kaWZpZXIgJ19jdXJyZW50JyBmaWVsZHMgdGhlbiB1c2UgdGhlc2UgdG8gZGV0ZXJtaW5lIGhvdworICAgICogdG8gYWRkIGFwcHJvcHJpYXRlIGNodW5rcy4KKyAgICAqLworICAgcG5nX21vZGlmaWVyICpwbSA9IHRoaXMtPnBtOworCisgICBtb2RpZmllcl9zZXRfZW5jb2RpbmcocG0pOworCisgICBpZiAobW9kaWZpZXJfY29sb3JfZW5jb2RpbmdfaXNfc2V0KHBtKSkKKyAgIHsKKyAgICAgIGlmIChtb2RpZmllcl9jb2xvcl9lbmNvZGluZ19pc19zUkdCKHBtKSkKKyAgICAgICAgIHNyZ2JfbW9kaWZpY2F0aW9uX2luaXQoJnRoaXMtPnNyZ2JfbW9kLCBwbSwgUE5HX3NSR0JfSU5URU5UX0FCU09MVVRFKTsKKworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgLyogU2V0IGdBTUEgYW5kIGNIUk0gc2VwYXJhdGVseS4gKi8KKyAgICAgICAgIGdhbWFfbW9kaWZpY2F0aW9uX2luaXQoJnRoaXMtPmdhbWFfbW9kLCBwbSwgcG0tPmN1cnJlbnRfZ2FtbWEpOworCisgICAgICAgICBpZiAocG0tPmN1cnJlbnRfZW5jb2RpbmcgIT0gMCkKKyAgICAgICAgICAgIGNocm1fbW9kaWZpY2F0aW9uX2luaXQoJnRoaXMtPmNocm1fbW9kLCBwbSwgcG0tPmN1cnJlbnRfZW5jb2RpbmcpOworICAgICAgfQorICAgfQorfQorCisvKiBUaHJlZSBmdW5jdGlvbnMgdG8gZW5kIHRoZSBsaXN0OiAqLworc3RhdGljIHZvaWQKK2ltYWdlX3RyYW5zZm9ybV9pbmlfZW5kKGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKKyAgIHRyYW5zZm9ybV9kaXNwbGF5ICp0aGF0KQoreworICAgVU5VU0VEKHRoaXMpCisgICBVTlVTRUQodGhhdCkKK30KKworc3RhdGljIHZvaWQKK2ltYWdlX3RyYW5zZm9ybV9zZXRfZW5kKGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKKyAgIHRyYW5zZm9ybV9kaXNwbGF5ICp0aGF0LCBwbmdfc3RydWN0cCBwcCwgcG5nX2luZm9wIHBpKQoreworICAgVU5VU0VEKHRoaXMpCisgICBVTlVTRUQodGhhdCkKKyAgIFVOVVNFRChwcCkKKyAgIFVOVVNFRChwaSkKK30KKworLyogQXQgdGhlIGVuZCBvZiB0aGUgbGlzdCByZWNhbGN1bGF0ZSB0aGUgb3V0cHV0IGltYWdlIHBpeGVsIHZhbHVlIGZyb20gdGhlCisgKiBkb3VibGUgcHJlY2lzaW9uIHZhbHVlcyBzZXQgdXAgYnkgdGhlIHByZWNlZGluZyAnbW9kJyBjYWxsczoKKyAqLworc3RhdGljIHVuc2lnbmVkIGludAorc2FtcGxlX3NjYWxlKGRvdWJsZSBzYW1wbGVfdmFsdWUsIHVuc2lnbmVkIGludCBzY2FsZSkKK3sKKyAgIHNhbXBsZV92YWx1ZSA9IGZsb29yKHNhbXBsZV92YWx1ZSAqIHNjYWxlICsgLjUpOworCisgICAvKiBSZXR1cm4gTmFOIGFzIDA6ICovCisgICBpZiAoIShzYW1wbGVfdmFsdWUgPiAwKSkKKyAgICAgIHNhbXBsZV92YWx1ZSA9IDA7CisgICBlbHNlIGlmIChzYW1wbGVfdmFsdWUgPiBzY2FsZSkKKyAgICAgIHNhbXBsZV92YWx1ZSA9IHNjYWxlOworCisgICByZXR1cm4gKHVuc2lnbmVkIGludClzYW1wbGVfdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkCitpbWFnZV90cmFuc2Zvcm1fbW9kX2VuZChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsIGltYWdlX3BpeGVsICp0aGF0LAorICAgIHBuZ19jb25zdF9zdHJ1Y3RwIHBwLCBjb25zdCB0cmFuc2Zvcm1fZGlzcGxheSAqZGlzcGxheSkKK3sKKyAgIGNvbnN0IHVuc2lnbmVkIGludCBzY2FsZSA9ICgxVTw8dGhhdC0+c2FtcGxlX2RlcHRoKS0xOworICAgY29uc3QgaW50IHNpZ19iaXRzID0gdGhhdC0+c2lnX2JpdHM7CisKKyAgIFVOVVNFRCh0aGlzKQorICAgVU5VU0VEKHBwKQorICAgVU5VU0VEKGRpc3BsYXkpCisKKyAgIC8qIEF0IHRoZSBlbmQgcmVjYWxjdWxhdGUgdGhlIGRpZ2l0aXplZCByZWQgZ3JlZW4gYW5kIGJsdWUgdmFsdWVzIGFjY29yZGluZworICAgICogdG8gdGhlIGN1cnJlbnQgc2FtcGxlX2RlcHRoIG9mIHRoZSBwaXhlbC4KKyAgICAqCisgICAgKiBUaGUgc2FtcGxlIHZhbHVlIGlzIHNpbXBseSBzY2FsZWQgdG8gdGhlIG1heGltdW0sIGNoZWNraW5nIGZvciBvdmVyCisgICAgKiBhbmQgdW5kZXJmbG93ICh3aGljaCBjYW4gYm90aCBoYXBwZW4gZm9yIHNvbWUgaW1hZ2UgdHJhbnNmb3JtcywKKyAgICAqIGluY2x1ZGluZyBzaW1wbGUgc2l6ZSBzY2FsaW5nLCB0aG91Z2ggbGlicG5nIGRvZXNuJ3QgZG8gdGhhdCBhdCBwcmVzZW50LgorICAgICovCisgICB0aGF0LT5yZWQgPSBzYW1wbGVfc2NhbGUodGhhdC0+cmVkZiwgc2NhbGUpOworCisgICAvKiBUaGlzIGlzIGEgYml0IGJvZ3VzOyByZWFsbHkgdGhlIGFib3ZlIGNhbGN1bGF0aW9uIHNob3VsZCB1c2UgdGhlIHJlZF9zQklUCisgICAgKiB2YWx1ZSwgbm90IHNhbXBsZV9kZXB0aCwgYnV0IGJlY2F1c2UgbGlicG5nIGRvZXMgcG5nX3NldF9zaGlmdCBieSBqdXN0CisgICAgKiBzaGlmdGluZyB0aGUgYml0cyB3ZSBnZXQgZXJyb3JzIGlmIHdlIGRvbid0IGRvIGl0IHRoZSBzYW1lIHdheS4KKyAgICAqLworICAgaWYgKHNpZ19iaXRzICYmIHRoYXQtPnJlZF9zQklUIDwgdGhhdC0+c2FtcGxlX2RlcHRoKQorICAgICAgdGhhdC0+cmVkID4+PSB0aGF0LT5zYW1wbGVfZGVwdGggLSB0aGF0LT5yZWRfc0JJVDsKKworICAgLyogVGhlIGVycm9yIHZhbHVlIGlzIGluY3JlYXNlZCwgYXQgdGhlIGVuZCwgYWNjb3JkaW5nIHRvIHRoZSBsb3dlc3Qgc0JJVAorICAgICogdmFsdWUgc2Vlbi4gIENvbW1vbiBzZW5zZSB0ZWxscyB1cyB0aGF0IHRoZSBpbnRlcm1lZGlhdGUgaW50ZWdlcgorICAgICogcmVwcmVzZW50YXRpb25zIGFyZSBubyBtb3JlIGFjY3VyYXRlIHRoYW4gKy8tIDAuNSBpbiB0aGUgaW50ZWdyYWwgdmFsdWVzLAorICAgICogdGhlIHNCSVQgYWxsb3dzIHRoZSBpbXBsZW1lbnRhdGlvbiB0byBiZSB3b3JzZSB0aGFuIHRoaXMuICBJbiBhZGRpdGlvbiB0aGUKKyAgICAqIFBORyBzcGVjaWZpY2F0aW9uIGFjdHVhbGx5IHBlcm1pdHMgYW55IGVycm9yIHdpdGhpbiB0aGUgcmFuZ2UgKC0xLi4rMSksCisgICAgKiBidXQgdGhhdCBpcyBpZ25vcmVkIGhlcmUuICBJbnN0ZWFkIHRoZSBmaW5hbCBkaWdpdGl6ZWQgdmFsdWUgaXMgY29tcGFyZWQsCisgICAgKiBiZWxvdyB0byB0aGUgZGlnaXRpemVkIHZhbHVlIG9mIHRoZSBlcnJvciBsaW1pdHMgLSB0aGlzIGhhcyB0aGUgbmV0IGVmZmVjdAorICAgICogb2YgYWxsb3dpbmcgKGFsbW9zdCkgKy8tMSBpbiB0aGUgb3V0cHV0IHZhbHVlLiAgSXQncyBkaWZmaWN1bHQgdG8gc2VlIGhvdworICAgICogYW55IGFsZ29yaXRobSB0aGF0IGRpZ2l0aXplcyBpbnRlcm1lZGlhdGUgcmVzdWx0cyBjYW4gYmUgbW9yZSBhY2N1cmF0ZS4KKyAgICAqLworICAgdGhhdC0+cmVkZSArPSAxLi8oMiooKDFVPDx0aGF0LT5yZWRfc0JJVCktMSkpOworCisgICBpZiAodGhhdC0+Y29sb3VyX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikKKyAgIHsKKyAgICAgIHRoYXQtPmdyZWVuID0gc2FtcGxlX3NjYWxlKHRoYXQtPmdyZWVuZiwgc2NhbGUpOworICAgICAgaWYgKHNpZ19iaXRzICYmIHRoYXQtPmdyZWVuX3NCSVQgPCB0aGF0LT5zYW1wbGVfZGVwdGgpCisgICAgICAgICB0aGF0LT5ncmVlbiA+Pj0gdGhhdC0+c2FtcGxlX2RlcHRoIC0gdGhhdC0+Z3JlZW5fc0JJVDsKKworICAgICAgdGhhdC0+Ymx1ZSA9IHNhbXBsZV9zY2FsZSh0aGF0LT5ibHVlZiwgc2NhbGUpOworICAgICAgaWYgKHNpZ19iaXRzICYmIHRoYXQtPmJsdWVfc0JJVCA8IHRoYXQtPnNhbXBsZV9kZXB0aCkKKyAgICAgICAgIHRoYXQtPmJsdWUgPj49IHRoYXQtPnNhbXBsZV9kZXB0aCAtIHRoYXQtPmJsdWVfc0JJVDsKKworICAgICAgdGhhdC0+Z3JlZW5lICs9IDEuLygyKigoMVU8PHRoYXQtPmdyZWVuX3NCSVQpLTEpKTsKKyAgICAgIHRoYXQtPmJsdWVlICs9IDEuLygyKigoMVU8PHRoYXQtPmJsdWVfc0JJVCktMSkpOworICAgfQorICAgZWxzZQorICAgeworICAgICAgdGhhdC0+Ymx1ZSA9IHRoYXQtPmdyZWVuID0gdGhhdC0+cmVkOworICAgICAgdGhhdC0+Ymx1ZWYgPSB0aGF0LT5ncmVlbmYgPSB0aGF0LT5yZWRmOworICAgICAgdGhhdC0+Ymx1ZWUgPSB0aGF0LT5ncmVlbmUgPSB0aGF0LT5yZWRlOworICAgfQorCisgICBpZiAoKHRoYXQtPmNvbG91cl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpIHx8CisgICAgICB0aGF0LT5jb2xvdXJfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQorICAgeworICAgICAgdGhhdC0+YWxwaGEgPSBzYW1wbGVfc2NhbGUodGhhdC0+YWxwaGFmLCBzY2FsZSk7CisgICAgICB0aGF0LT5hbHBoYWUgKz0gMS4vKDIqKCgxVTw8dGhhdC0+YWxwaGFfc0JJVCktMSkpOworICAgfQorICAgZWxzZQorICAgeworICAgICAgdGhhdC0+YWxwaGEgPSBzY2FsZTsgLyogb3BhcXVlICovCisgICAgICB0aGF0LT5hbHBoYWYgPSAxOyAgICAvKiBPdmVycmlkZSB0aGlzLiAqLworICAgICAgdGhhdC0+YWxwaGFlID0gMDsgICAgLyogSXQncyBleGFjdCA7LSkgKi8KKyAgIH0KKworICAgaWYgKHNpZ19iaXRzICYmIHRoYXQtPmFscGhhX3NCSVQgPCB0aGF0LT5zYW1wbGVfZGVwdGgpCisgICAgICB0aGF0LT5hbHBoYSA+Pj0gdGhhdC0+c2FtcGxlX2RlcHRoIC0gdGhhdC0+YWxwaGFfc0JJVDsKK30KKworLyogU3RhdGljICdlbmQnIHN0cnVjdHVyZTogKi8KK3N0YXRpYyBpbWFnZV90cmFuc2Zvcm0gaW1hZ2VfdHJhbnNmb3JtX2VuZCA9Cit7CisgICAiKGVuZCkiLCAvKiBuYW1lICovCisgICAxLCAvKiBlbmFibGUgKi8KKyAgIDAsIC8qIGxpc3QgKi8KKyAgIDAsIC8qIGdsb2JhbF91c2UgKi8KKyAgIDAsIC8qIGxvY2FsX3VzZSAqLworICAgMCwgLyogbmV4dCAqLworICAgaW1hZ2VfdHJhbnNmb3JtX2luaV9lbmQsCisgICBpbWFnZV90cmFuc2Zvcm1fc2V0X2VuZCwKKyAgIGltYWdlX3RyYW5zZm9ybV9tb2RfZW5kLAorICAgMCAvKiBuZXZlciBjYWxsZWQsIEkgd2FudCBpdCB0byBjcmFzaCBpZiBpdCBpcyEgKi8KK307CisKKy8qIFJlYWRlciBjYWxsYmFja3MgYW5kIGltcGxlbWVudGF0aW9ucywgd2hlcmUgdGhleSBkaWZmZXIgZnJvbSB0aGUgc3RhbmRhcmQKKyAqIG9uZXMuCisgKi8KK3N0YXRpYyB2b2lkCit0cmFuc2Zvcm1fZGlzcGxheV9pbml0KHRyYW5zZm9ybV9kaXNwbGF5ICpkcCwgcG5nX21vZGlmaWVyICpwbSwgcG5nX3VpbnRfMzIgaWQsCisgICAgY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0cmFuc2Zvcm1fbGlzdCkKK3sKKyAgIG1lbXNldChkcCwgMCwgc2l6ZW9mICpkcCk7CisKKyAgIC8qIFN0YW5kYXJkIGZpZWxkcyAqLworICAgc3RhbmRhcmRfZGlzcGxheV9pbml0KCZkcC0+dGhpcywgJnBtLT50aGlzLCBpZCwgZG9fcmVhZF9pbnRlcmxhY2UsCisgICAgICBwbS0+dXNlX3VwZGF0ZV9pbmZvKTsKKworICAgLyogUGFyYW1ldGVyIGZpZWxkcyAqLworICAgZHAtPnBtID0gcG07CisgICBkcC0+dHJhbnNmb3JtX2xpc3QgPSB0cmFuc2Zvcm1fbGlzdDsKKyAgIGRwLT5tYXhfZ2FtbWFfOCA9IDE2OworCisgICAvKiBMb2NhbCB2YXJpYWJsZSBmaWVsZHMgKi8KKyAgIGRwLT5vdXRwdXRfY29sb3VyX3R5cGUgPSAyNTU7IC8qIGludmFsaWQgKi8KKyAgIGRwLT5vdXRwdXRfYml0X2RlcHRoID0gMjU1OyAgLyogaW52YWxpZCAqLworICAgZHAtPnVucGFja2VkID0gMDsgLyogbm90IHVucGFja2VkICovCit9CisKK3N0YXRpYyB2b2lkCit0cmFuc2Zvcm1faW5mb19pbXAodHJhbnNmb3JtX2Rpc3BsYXkgKmRwLCBwbmdfc3RydWN0cCBwcCwgcG5nX2luZm9wIHBpKQoreworICAgLyogUmV1c2UgdGhlIHN0YW5kYXJkIHN0dWZmIGFzIGFwcHJvcHJpYXRlLiAqLworICAgc3RhbmRhcmRfaW5mb19wYXJ0MSgmZHAtPnRoaXMsIHBwLCBwaSk7CisKKyAgIC8qIE5vdyBzZXQgdGhlIGxpc3Qgb2YgdHJhbnNmb3Jtcy4gKi8KKyAgIGRwLT50cmFuc2Zvcm1fbGlzdC0+c2V0KGRwLT50cmFuc2Zvcm1fbGlzdCwgZHAsIHBwLCBwaSk7CisKKyAgIC8qIFVwZGF0ZSB0aGUgaW5mbyBzdHJ1Y3R1cmUgZm9yIHRoZXNlIHRyYW5zZm9ybXM6ICovCisgICB7CisgICAgICBpbnQgaSA9IGRwLT50aGlzLnVzZV91cGRhdGVfaW5mbzsKKyAgICAgIC8qIEFsd2F5cyBkbyBvbmUgY2FsbCwgZXZlbiBpZiB1c2VfdXBkYXRlX2luZm8gaXMgMC4gKi8KKyAgICAgIGRvCisgICAgICAgICBwbmdfcmVhZF91cGRhdGVfaW5mbyhwcCwgcGkpOworICAgICAgd2hpbGUgKC0taSA+IDApOworICAgfQorCisgICAvKiBBbmQgZ2V0IHRoZSBvdXRwdXQgaW5mb3JtYXRpb24gaW50byB0aGUgc3RhbmRhcmRfZGlzcGxheSAqLworICAgc3RhbmRhcmRfaW5mb19wYXJ0MigmZHAtPnRoaXMsIHBwLCBwaSwgMS8qaW1hZ2VzKi8pOworCisgICAvKiBQbHVzIHRoZSBleHRyYSBzdHVmZiB3ZSBuZWVkIGZvciB0aGUgdHJhbnNmb3JtIHRlc3RzOiAqLworICAgZHAtPm91dHB1dF9jb2xvdXJfdHlwZSA9IHBuZ19nZXRfY29sb3JfdHlwZShwcCwgcGkpOworICAgZHAtPm91dHB1dF9iaXRfZGVwdGggPSBwbmdfZ2V0X2JpdF9kZXB0aChwcCwgcGkpOworCisgICAvKiBJZiBwbmdfc2V0X2ZpbGxlciBpcyBpbiBhY3Rpb24gdGhlbiBmYWtlIHRoZSBvdXRwdXQgY29sb3IgdHlwZSB0byBpbmNsdWRlCisgICAgKiBhbiBhbHBoYSBjaGFubmVsIHdoZXJlIGFwcHJvcHJpYXRlLgorICAgICovCisgICBpZiAoZHAtPm91dHB1dF9iaXRfZGVwdGggPj0gOCAmJgorICAgICAgIChkcC0+b3V0cHV0X2NvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiB8fAorICAgICAgICBkcC0+b3V0cHV0X2NvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpICYmIGRwLT50aGlzLmZpbGxlcikKKyAgICAgICBkcC0+b3V0cHV0X2NvbG91cl90eXBlIHw9IDQ7CisKKyAgIC8qIFZhbGlkYXRlIHRoZSBjb21iaW5hdGlvbiBvZiBjb2xvdXIgdHlwZSBhbmQgYml0IGRlcHRoIHRoYXQgd2UgYXJlIGdldHRpbmcKKyAgICAqIG91dCBvZiBsaWJwbmc7IHRoZSBzZW1hbnRpY3Mgb2Ygc29tZXRoaW5nIG5vdCBpbiB0aGUgUE5HIHNwZWMgYXJlLCBhdAorICAgICogYmVzdCwgdW5jbGVhci4KKyAgICAqLworICAgc3dpdGNoIChkcC0+b3V0cHV0X2NvbG91cl90eXBlKQorICAgeworICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFOgorICAgICAgaWYgKGRwLT5vdXRwdXRfYml0X2RlcHRoID4gOCkgZ290byBlcnJvcjsKKyAgICAgIC8qRkFMTCBUSFJPVUdIKi8KKyAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfR1JBWToKKyAgICAgIGlmIChkcC0+b3V0cHV0X2JpdF9kZXB0aCA9PSAxIHx8IGRwLT5vdXRwdXRfYml0X2RlcHRoID09IDIgfHwKKyAgICAgICAgIGRwLT5vdXRwdXRfYml0X2RlcHRoID09IDQpCisgICAgICAgICBicmVhazsKKyAgICAgIC8qRkFMTCBUSFJPVUdIKi8KKyAgIGRlZmF1bHQ6CisgICAgICBpZiAoZHAtPm91dHB1dF9iaXRfZGVwdGggPT0gOCB8fCBkcC0+b3V0cHV0X2JpdF9kZXB0aCA9PSAxNikKKyAgICAgICAgIGJyZWFrOworICAgICAgLypGQUxMIFRIUk9VR0gqLworICAgZXJyb3I6CisgICAgICB7CisgICAgICAgICBjaGFyIG1lc3NhZ2VbMTI4XTsKKyAgICAgICAgIHNpemVfdCBwb3M7CisKKyAgICAgICAgIHBvcyA9IHNhZmVjYXQobWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIDAsCisgICAgICAgICAgICAiaW52YWxpZCBmaW5hbCBiaXQgZGVwdGg6IGNvbG91ciB0eXBlKCIpOworICAgICAgICAgcG9zID0gc2FmZWNhdG4obWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIHBvcywgZHAtPm91dHB1dF9jb2xvdXJfdHlwZSk7CisgICAgICAgICBwb3MgPSBzYWZlY2F0KG1lc3NhZ2UsIHNpemVvZiBtZXNzYWdlLCBwb3MsICIpIHdpdGggYml0IGRlcHRoOiAiKTsKKyAgICAgICAgIHBvcyA9IHNhZmVjYXRuKG1lc3NhZ2UsIHNpemVvZiBtZXNzYWdlLCBwb3MsIGRwLT5vdXRwdXRfYml0X2RlcHRoKTsKKworICAgICAgICAgcG5nX2Vycm9yKHBwLCBtZXNzYWdlKTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogVXNlIGEgdGVzdCBwaXhlbCB0byBjaGVjayB0aGF0IHRoZSBvdXRwdXQgYWdyZWVzIHdpdGggd2hhdCB3ZSBleHBlY3QgLQorICAgICogdGhpcyBhdm9pZHMgcnVubmluZyB0aGUgd2hvbGUgdGVzdCBpZiB0aGUgb3V0cHV0IGlzIHVuZXhwZWN0ZWQuICBUaGlzIGFsc28KKyAgICAqIGNoZWNrcyBmb3IgaW50ZXJuYWwgZXJyb3JzLgorICAgICovCisgICB7CisgICAgICBpbWFnZV9waXhlbCB0ZXN0X3BpeGVsOworCisgICAgICBtZW1zZXQoJnRlc3RfcGl4ZWwsIDAsIHNpemVvZiB0ZXN0X3BpeGVsKTsKKyAgICAgIHRlc3RfcGl4ZWwuY29sb3VyX3R5cGUgPSBkcC0+dGhpcy5jb2xvdXJfdHlwZTsgLyogaW5wdXQgKi8KKyAgICAgIHRlc3RfcGl4ZWwuYml0X2RlcHRoID0gZHAtPnRoaXMuYml0X2RlcHRoOworICAgICAgaWYgKHRlc3RfcGl4ZWwuY29sb3VyX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgICAgICAgIHRlc3RfcGl4ZWwuc2FtcGxlX2RlcHRoID0gODsKKyAgICAgIGVsc2UKKyAgICAgICAgIHRlc3RfcGl4ZWwuc2FtcGxlX2RlcHRoID0gdGVzdF9waXhlbC5iaXRfZGVwdGg7CisgICAgICAvKiBEb24ndCBuZWVkIHNCSVQgaGVyZSwgYnV0IGl0IG11c3QgYmUgc2V0IHRvIG5vbi16ZXJvIHRvIGF2b2lkCisgICAgICAgKiBhcml0aG1ldGljIG92ZXJmbG93cy4KKyAgICAgICAqLworICAgICAgdGVzdF9waXhlbC5oYXZlX3RSTlMgPSBkcC0+dGhpcy5pc190cmFuc3BhcmVudCAhPSAwOworICAgICAgdGVzdF9waXhlbC5yZWRfc0JJVCA9IHRlc3RfcGl4ZWwuZ3JlZW5fc0JJVCA9IHRlc3RfcGl4ZWwuYmx1ZV9zQklUID0KKyAgICAgICAgIHRlc3RfcGl4ZWwuYWxwaGFfc0JJVCA9IHRlc3RfcGl4ZWwuc2FtcGxlX2RlcHRoOworCisgICAgICBkcC0+dHJhbnNmb3JtX2xpc3QtPm1vZChkcC0+dHJhbnNmb3JtX2xpc3QsICZ0ZXN0X3BpeGVsLCBwcCwgZHApOworCisgICAgICBpZiAodGVzdF9waXhlbC5jb2xvdXJfdHlwZSAhPSBkcC0+b3V0cHV0X2NvbG91cl90eXBlKQorICAgICAgeworICAgICAgICAgY2hhciBtZXNzYWdlWzEyOF07CisgICAgICAgICBzaXplX3QgcG9zID0gc2FmZWNhdChtZXNzYWdlLCBzaXplb2YgbWVzc2FnZSwgMCwgImNvbG91ciB0eXBlICIpOworCisgICAgICAgICBwb3MgPSBzYWZlY2F0bihtZXNzYWdlLCBzaXplb2YgbWVzc2FnZSwgcG9zLCBkcC0+b3V0cHV0X2NvbG91cl90eXBlKTsKKyAgICAgICAgIHBvcyA9IHNhZmVjYXQobWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIHBvcywgIiBleHBlY3RlZCAiKTsKKyAgICAgICAgIHBvcyA9IHNhZmVjYXRuKG1lc3NhZ2UsIHNpemVvZiBtZXNzYWdlLCBwb3MsIHRlc3RfcGl4ZWwuY29sb3VyX3R5cGUpOworCisgICAgICAgICBwbmdfZXJyb3IocHAsIG1lc3NhZ2UpOworICAgICAgfQorCisgICAgICBpZiAodGVzdF9waXhlbC5iaXRfZGVwdGggIT0gZHAtPm91dHB1dF9iaXRfZGVwdGgpCisgICAgICB7CisgICAgICAgICBjaGFyIG1lc3NhZ2VbMTI4XTsKKyAgICAgICAgIHNpemVfdCBwb3MgPSBzYWZlY2F0KG1lc3NhZ2UsIHNpemVvZiBtZXNzYWdlLCAwLCAiYml0IGRlcHRoICIpOworCisgICAgICAgICBwb3MgPSBzYWZlY2F0bihtZXNzYWdlLCBzaXplb2YgbWVzc2FnZSwgcG9zLCBkcC0+b3V0cHV0X2JpdF9kZXB0aCk7CisgICAgICAgICBwb3MgPSBzYWZlY2F0KG1lc3NhZ2UsIHNpemVvZiBtZXNzYWdlLCBwb3MsICIgZXhwZWN0ZWQgIik7CisgICAgICAgICBwb3MgPSBzYWZlY2F0bihtZXNzYWdlLCBzaXplb2YgbWVzc2FnZSwgcG9zLCB0ZXN0X3BpeGVsLmJpdF9kZXB0aCk7CisKKyAgICAgICAgIHBuZ19lcnJvcihwcCwgbWVzc2FnZSk7CisgICAgICB9CisKKyAgICAgIC8qIElmIGJvdGggYml0IGRlcHRoIGFuZCBjb2xvdXIgdHlwZSBhcmUgY29ycmVjdCBjaGVjayB0aGUgc2FtcGxlIGRlcHRoLgorICAgICAgICovCisgICAgICBpZiAodGVzdF9waXhlbC5jb2xvdXJfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFICYmCisgICAgICAgICAgdGVzdF9waXhlbC5zYW1wbGVfZGVwdGggIT0gOCkgLyogb29wcyAtIGludGVybmFsIGVycm9yISAqLworICAgICAgICAgcG5nX2Vycm9yKHBwLCAicG5ndmFsaWQ6IGludGVybmFsOiBwYWxldHRlIHNhbXBsZSBkZXB0aCBub3QgOCIpOworICAgICAgZWxzZSBpZiAoZHAtPnVucGFja2VkICYmIHRlc3RfcGl4ZWwuYml0X2RlcHRoICE9IDgpCisgICAgICAgICBwbmdfZXJyb3IocHAsICJwbmd2YWxpZDogaW50ZXJuYWw6IGJhZCB1bnBhY2tlZCBwaXhlbCBkZXB0aCIpOworICAgICAgZWxzZSBpZiAoIWRwLT51bnBhY2tlZCAmJiB0ZXN0X3BpeGVsLmNvbG91cl90eXBlICE9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUKKyAgICAgICAgICAgICAgJiYgdGVzdF9waXhlbC5iaXRfZGVwdGggIT0gdGVzdF9waXhlbC5zYW1wbGVfZGVwdGgpCisgICAgICB7CisgICAgICAgICBjaGFyIG1lc3NhZ2VbMTI4XTsKKyAgICAgICAgIHNpemVfdCBwb3MgPSBzYWZlY2F0KG1lc3NhZ2UsIHNpemVvZiBtZXNzYWdlLCAwLAorICAgICAgICAgICAgImludGVybmFsOiBzYW1wbGUgZGVwdGggIik7CisKKyAgICAgICAgIC8qIEJlY2F1c2UgdW5sZXNzIHNvbWV0aGluZyBoYXMgc2V0ICd1bnBhY2tlZCcgb3IgdGhlIGltYWdlIGlzIHBhbGV0dGUKKyAgICAgICAgICAqIG1hcHBlZCB3ZSBleHBlY3QgdGhlIHRyYW5zZm9ybSB0byBrZWVwIHNhbXBsZSBkZXB0aCBhbmQgYml0IGRlcHRoCisgICAgICAgICAgKiB0aGUgc2FtZS4KKyAgICAgICAgICAqLworICAgICAgICAgcG9zID0gc2FmZWNhdG4obWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIHBvcywgdGVzdF9waXhlbC5zYW1wbGVfZGVwdGgpOworICAgICAgICAgcG9zID0gc2FmZWNhdChtZXNzYWdlLCBzaXplb2YgbWVzc2FnZSwgcG9zLCAiIGV4cGVjdGVkICIpOworICAgICAgICAgcG9zID0gc2FmZWNhdG4obWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIHBvcywgdGVzdF9waXhlbC5iaXRfZGVwdGgpOworCisgICAgICAgICBwbmdfZXJyb3IocHAsIG1lc3NhZ2UpOworICAgICAgfQorICAgICAgZWxzZSBpZiAodGVzdF9waXhlbC5iaXRfZGVwdGggIT0gZHAtPm91dHB1dF9iaXRfZGVwdGgpCisgICAgICB7CisgICAgICAgICAvKiBUaGlzIGNvdWxkIGJlIGEgbGlicG5nIGVycm9yIHRvbzsgbGlicG5nIGhhcyBub3QgcHJvZHVjZWQgd2hhdCB3ZQorICAgICAgICAgICogZXhwZWN0IGZvciB0aGUgb3V0cHV0IGJpdCBkZXB0aC4KKyAgICAgICAgICAqLworICAgICAgICAgY2hhciBtZXNzYWdlWzEyOF07CisgICAgICAgICBzaXplX3QgcG9zID0gc2FmZWNhdChtZXNzYWdlLCBzaXplb2YgbWVzc2FnZSwgMCwKKyAgICAgICAgICAgICJpbnRlcm5hbDogYml0IGRlcHRoICIpOworCisgICAgICAgICBwb3MgPSBzYWZlY2F0bihtZXNzYWdlLCBzaXplb2YgbWVzc2FnZSwgcG9zLCBkcC0+b3V0cHV0X2JpdF9kZXB0aCk7CisgICAgICAgICBwb3MgPSBzYWZlY2F0KG1lc3NhZ2UsIHNpemVvZiBtZXNzYWdlLCBwb3MsICIgZXhwZWN0ZWQgIik7CisgICAgICAgICBwb3MgPSBzYWZlY2F0bihtZXNzYWdlLCBzaXplb2YgbWVzc2FnZSwgcG9zLCB0ZXN0X3BpeGVsLmJpdF9kZXB0aCk7CisKKyAgICAgICAgIHBuZ19lcnJvcihwcCwgbWVzc2FnZSk7CisgICAgICB9CisgICB9Cit9CisKK3N0YXRpYyB2b2lkIFBOR0NCQVBJCit0cmFuc2Zvcm1faW5mbyhwbmdfc3RydWN0cCBwcCwgcG5nX2luZm9wIHBpKQoreworICAgdHJhbnNmb3JtX2luZm9faW1wKHZvaWRjYXN0KHRyYW5zZm9ybV9kaXNwbGF5KiwgcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIocHApKSwKKyAgICAgIHBwLCBwaSk7Cit9CisKK3N0YXRpYyB2b2lkCit0cmFuc2Zvcm1fcmFuZ2VfY2hlY2socG5nX2NvbnN0X3N0cnVjdHAgcHAsIHVuc2lnbmVkIGludCByLCB1bnNpZ25lZCBpbnQgZywKKyAgIHVuc2lnbmVkIGludCBiLCB1bnNpZ25lZCBpbnQgYSwgdW5zaWduZWQgaW50IGluX2RpZ2l0aXplZCwgZG91YmxlIGluLAorICAgdW5zaWduZWQgaW50IG91dCwgcG5nX2J5dGUgc2FtcGxlX2RlcHRoLCBkb3VibGUgZXJyLCBkb3VibGUgbGltaXQsCisgICBjb25zdCBjaGFyICpuYW1lLCBkb3VibGUgZGlnaXRpemF0aW9uX2Vycm9yKQoreworICAgLyogQ29tcGFyZSB0aGUgc2NhbGVkLCBkaWdpdHplZCwgdmFsdWVzIG9mIG91ciBsb2NhbCBjYWxjdWxhdGlvbiAoaW4rLWVycikKKyAgICAqIHdpdGggdGhlIGRpZ2l0aXplZCB2YWx1ZXMgbGlicG5nIHByb2R1Y2VkOyAgJ3NhbXBsZV9kZXB0aCcgaXMgdGhlIGFjdHVhbAorICAgICogZGlnaXRpemF0aW9uIGRlcHRoIG9mIHRoZSBsaWJwbmcgb3V0cHV0IGNvbG9ycyAodGhlIGJpdCBkZXB0aCBleGNlcHQgZm9yCisgICAgKiBwYWxldHRlIGltYWdlcyB3aGVyZSBpdCBpcyBhbHdheXMgOC4pICBUaGUgY2hlY2sgb24gJ2VycicgaXMgdG8gZGV0ZWN0CisgICAgKiBpbnRlcm5hbCBlcnJvcnMgaW4gcG5ndmFsaWQgaXRzZWxmLgorICAgICovCisgICB1bnNpZ25lZCBpbnQgbWF4ID0gKDFVPDxzYW1wbGVfZGVwdGgpLTE7CisgICBkb3VibGUgaW5fbWluID0gY2VpbCgoaW4tZXJyKSptYXggLSBkaWdpdGl6YXRpb25fZXJyb3IpOworICAgZG91YmxlIGluX21heCA9IGZsb29yKChpbitlcnIpKm1heCArIGRpZ2l0aXphdGlvbl9lcnJvcik7CisgICBpZiAoZXJyID4gbGltaXQgfHwgIShvdXQgPj0gaW5fbWluICYmIG91dCA8PSBpbl9tYXgpKQorICAgeworICAgICAgY2hhciBtZXNzYWdlWzI1Nl07CisgICAgICBzaXplX3QgcG9zOworCisgICAgICBwb3MgPSBzYWZlY2F0KG1lc3NhZ2UsIHNpemVvZiBtZXNzYWdlLCAwLCBuYW1lKTsKKyAgICAgIHBvcyA9IHNhZmVjYXQobWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIHBvcywgIiBvdXRwdXQgdmFsdWUgZXJyb3I6IHJnYmEoIik7CisgICAgICBwb3MgPSBzYWZlY2F0bihtZXNzYWdlLCBzaXplb2YgbWVzc2FnZSwgcG9zLCByKTsKKyAgICAgIHBvcyA9IHNhZmVjYXQobWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIHBvcywgIiwiKTsKKyAgICAgIHBvcyA9IHNhZmVjYXRuKG1lc3NhZ2UsIHNpemVvZiBtZXNzYWdlLCBwb3MsIGcpOworICAgICAgcG9zID0gc2FmZWNhdChtZXNzYWdlLCBzaXplb2YgbWVzc2FnZSwgcG9zLCAiLCIpOworICAgICAgcG9zID0gc2FmZWNhdG4obWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIHBvcywgYik7CisgICAgICBwb3MgPSBzYWZlY2F0KG1lc3NhZ2UsIHNpemVvZiBtZXNzYWdlLCBwb3MsICIsIik7CisgICAgICBwb3MgPSBzYWZlY2F0bihtZXNzYWdlLCBzaXplb2YgbWVzc2FnZSwgcG9zLCBhKTsKKyAgICAgIHBvcyA9IHNhZmVjYXQobWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIHBvcywgIik6ICIpOworICAgICAgcG9zID0gc2FmZWNhdG4obWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIHBvcywgb3V0KTsKKyAgICAgIHBvcyA9IHNhZmVjYXQobWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIHBvcywgIiBleHBlY3RlZDogIik7CisgICAgICBwb3MgPSBzYWZlY2F0bihtZXNzYWdlLCBzaXplb2YgbWVzc2FnZSwgcG9zLCBpbl9kaWdpdGl6ZWQpOworICAgICAgcG9zID0gc2FmZWNhdChtZXNzYWdlLCBzaXplb2YgbWVzc2FnZSwgcG9zLCAiICgiKTsKKyAgICAgIHBvcyA9IHNhZmVjYXRkKG1lc3NhZ2UsIHNpemVvZiBtZXNzYWdlLCBwb3MsIChpbi1lcnIpKm1heCwgMyk7CisgICAgICBwb3MgPSBzYWZlY2F0KG1lc3NhZ2UsIHNpemVvZiBtZXNzYWdlLCBwb3MsICIuLiIpOworICAgICAgcG9zID0gc2FmZWNhdGQobWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIHBvcywgKGluK2VycikqbWF4LCAzKTsKKyAgICAgIHBvcyA9IHNhZmVjYXQobWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIHBvcywgIikiKTsKKworICAgICAgcG5nX2Vycm9yKHBwLCBtZXNzYWdlKTsKKyAgIH0KK30KKworc3RhdGljIHZvaWQKK3RyYW5zZm9ybV9pbWFnZV92YWxpZGF0ZSh0cmFuc2Zvcm1fZGlzcGxheSAqZHAsIHBuZ19jb25zdF9zdHJ1Y3RwIHBwLAorICAgcG5nX2luZm9wIHBpKQoreworICAgLyogQ29uc3RhbnRzIGZvciB0aGUgbG9vcCBiZWxvdzogKi8KKyAgIGNvbnN0IHBuZ19zdG9yZSogY29uc3QgcHMgPSBkcC0+dGhpcy5wczsKKyAgIGNvbnN0IHBuZ19ieXRlIGluX2N0ID0gZHAtPnRoaXMuY29sb3VyX3R5cGU7CisgICBjb25zdCBwbmdfYnl0ZSBpbl9iZCA9IGRwLT50aGlzLmJpdF9kZXB0aDsKKyAgIGNvbnN0IHBuZ191aW50XzMyIHcgPSBkcC0+dGhpcy53OworICAgY29uc3QgcG5nX3VpbnRfMzIgaCA9IGRwLT50aGlzLmg7CisgICBjb25zdCBwbmdfYnl0ZSBvdXRfY3QgPSBkcC0+b3V0cHV0X2NvbG91cl90eXBlOworICAgY29uc3QgcG5nX2J5dGUgb3V0X2JkID0gZHAtPm91dHB1dF9iaXRfZGVwdGg7CisgICBjb25zdCBwbmdfYnl0ZSBzYW1wbGVfZGVwdGggPSAocG5nX2J5dGUpKG91dF9jdCA9PQorICAgICAgUE5HX0NPTE9SX1RZUEVfUEFMRVRURSA/IDggOiBvdXRfYmQpOworICAgY29uc3QgcG5nX2J5dGUgcmVkX3NCSVQgPSBkcC0+dGhpcy5yZWRfc0JJVDsKKyAgIGNvbnN0IHBuZ19ieXRlIGdyZWVuX3NCSVQgPSBkcC0+dGhpcy5ncmVlbl9zQklUOworICAgY29uc3QgcG5nX2J5dGUgYmx1ZV9zQklUID0gZHAtPnRoaXMuYmx1ZV9zQklUOworICAgY29uc3QgcG5nX2J5dGUgYWxwaGFfc0JJVCA9IGRwLT50aGlzLmFscGhhX3NCSVQ7CisgICBjb25zdCBpbnQgaGF2ZV90Uk5TID0gZHAtPnRoaXMuaXNfdHJhbnNwYXJlbnQ7CisgICBkb3VibGUgZGlnaXRpemF0aW9uX2Vycm9yOworCisgICBzdG9yZV9wYWxldHRlIG91dF9wYWxldHRlOworICAgcG5nX3VpbnRfMzIgeTsKKworICAgVU5VU0VEKHBpKQorCisgICAvKiBDaGVjayBmb3Igcm93IG92ZXJ3cml0ZSBlcnJvcnMgKi8KKyAgIHN0b3JlX2ltYWdlX2NoZWNrKGRwLT50aGlzLnBzLCBwcCwgMCk7CisKKyAgIC8qIFJlYWQgdGhlIHBhbGV0dGUgY29ycmVzcG9uZGluZyB0byB0aGUgb3V0cHV0IGlmIHRoZSBvdXRwdXQgY29sb3VyIHR5cGUKKyAgICAqIGluZGljYXRlcyBhIHBhbGV0dGUsIG90aGV3aXNlIHNldCBvdXRfcGFsZXR0ZSB0byBnYXJiYWdlLgorICAgICovCisgICBpZiAob3V0X2N0ID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCisgICB7CisgICAgICAvKiBWYWxpZGF0ZSB0aGF0IHRoZSBwYWxldHRlIGNvdW50IGl0c2VsZiBoYXMgbm90IGNoYW5nZWQgLSB0aGlzIGlzIG5vdAorICAgICAgICogZXhwZWN0ZWQuCisgICAgICAgKi8KKyAgICAgIGludCBucGFsZXR0ZSA9ICgtMSk7CisKKyAgICAgICh2b2lkKXJlYWRfcGFsZXR0ZShvdXRfcGFsZXR0ZSwgJm5wYWxldHRlLCBwcCwgcGkpOworICAgICAgaWYgKG5wYWxldHRlICE9IGRwLT50aGlzLm5wYWxldHRlKQorICAgICAgICAgcG5nX2Vycm9yKHBwLCAidW5leHBlY3RlZCBjaGFuZ2UgaW4gcGFsZXR0ZSBzaXplIik7CisKKyAgICAgIGRpZ2l0aXphdGlvbl9lcnJvciA9IC41OworICAgfQorICAgZWxzZQorICAgeworICAgICAgcG5nX2J5dGUgaW5fc2FtcGxlX2RlcHRoOworCisgICAgICBtZW1zZXQob3V0X3BhbGV0dGUsIDB4NWUsIHNpemVvZiBvdXRfcGFsZXR0ZSk7CisKKyAgICAgIC8qIHVzZS1pbnB1dC1wcmVjaXNpb24gbWVhbnMgYXNzdW1lIHRoYXQgaWYgdGhlIGlucHV0IGhhcyA4IGJpdCAob3IgbGVzcykKKyAgICAgICAqIHNhbXBsZXMgYW5kIHRoZSBvdXRwdXQgaGFzIDE2IGJpdCBzYW1wbGVzIHRoZSBjYWxjdWxhdGlvbnMgd2lsbCBiZSBkb25lCisgICAgICAgKiB3aXRoIDggYml0IHByZWNpc2lvbiwgbm90IDE2LgorICAgICAgICovCisgICAgICBpZiAoaW5fY3QgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSB8fCBpbl9iZCA8IDE2KQorICAgICAgICAgaW5fc2FtcGxlX2RlcHRoID0gODsKKyAgICAgIGVsc2UKKyAgICAgICAgIGluX3NhbXBsZV9kZXB0aCA9IGluX2JkOworCisgICAgICBpZiAoc2FtcGxlX2RlcHRoICE9IDE2IHx8IGluX3NhbXBsZV9kZXB0aCA+IDggfHwKKyAgICAgICAgICFkcC0+cG0tPmNhbGN1bGF0aW9uc191c2VfaW5wdXRfcHJlY2lzaW9uKQorICAgICAgICAgZGlnaXRpemF0aW9uX2Vycm9yID0gLjU7CisKKyAgICAgIC8qIEVsc2UgY2FsY3VsYXRpb25zIGFyZSBhdCA4IGJpdCBwcmVjaXNpb24sIGFuZCB0aGUgb3V0cHV0IGFjdHVhbGx5CisgICAgICAgKiBjb25zaXN0cyBvZiBzY2FsZWQgOC1iaXQgdmFsdWVzLCBzbyBzY2FsZSAuNSBpbiA4IGJpdHMgdG8gdGhlIDE2IGJpdHM6CisgICAgICAgKi8KKyAgICAgIGVsc2UKKyAgICAgICAgIGRpZ2l0aXphdGlvbl9lcnJvciA9IC41ICogMjU3OworICAgfQorCisgICBmb3IgKHk9MDsgeTxoOyArK3kpCisgICB7CisgICAgICBwbmdfY29uc3RfYnl0ZXAgY29uc3QgcFJvdyA9IHN0b3JlX2ltYWdlX3JvdyhwcywgcHAsIDAsIHkpOworICAgICAgcG5nX3VpbnRfMzIgeDsKKworICAgICAgLyogVGhlIG9yaWdpbmFsLCBzdGFuZGFyZCwgcm93IHByZS10cmFuc2Zvcm1zLiAqLworICAgICAgcG5nX2J5dGUgc3RkW1NUQU5EQVJEX1JPV01BWF07CisKKyAgICAgIHRyYW5zZm9ybV9yb3cocHAsIHN0ZCwgaW5fY3QsIGluX2JkLCB5KTsKKworICAgICAgLyogR28gdGhyb3VnaCBlYWNoIG9yaWdpbmFsIHBpeGVsIHRyYW5zZm9ybWluZyBpdCBhbmQgY29tcGFyaW5nIHdpdGggd2hhdAorICAgICAgICogbGlicG5nIGRpZCB0byB0aGUgc2FtZSBwaXhlbC4KKyAgICAgICAqLworICAgICAgZm9yICh4PTA7IHg8dzsgKyt4KQorICAgICAgeworICAgICAgICAgaW1hZ2VfcGl4ZWwgaW5fcGl4ZWwsIG91dF9waXhlbDsKKyAgICAgICAgIHVuc2lnbmVkIGludCByLCBnLCBiLCBhOworCisgICAgICAgICAvKiBGaW5kIG91dCB3aGF0IHdlIHRoaW5rIHRoZSBwaXhlbCBzaG91bGQgYmU6ICovCisgICAgICAgICBpbWFnZV9waXhlbF9pbml0KCZpbl9waXhlbCwgc3RkLCBpbl9jdCwgaW5fYmQsIHgsIGRwLT50aGlzLnBhbGV0dGUsCisgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICAgICBpbl9waXhlbC5yZWRfc0JJVCA9IHJlZF9zQklUOworICAgICAgICAgaW5fcGl4ZWwuZ3JlZW5fc0JJVCA9IGdyZWVuX3NCSVQ7CisgICAgICAgICBpbl9waXhlbC5ibHVlX3NCSVQgPSBibHVlX3NCSVQ7CisgICAgICAgICBpbl9waXhlbC5hbHBoYV9zQklUID0gYWxwaGFfc0JJVDsKKyAgICAgICAgIGluX3BpeGVsLmhhdmVfdFJOUyA9IGhhdmVfdFJOUyAhPSAwOworCisgICAgICAgICAvKiBGb3IgZXJyb3IgZGV0ZWN0aW9uLCBiZWxvdy4gKi8KKyAgICAgICAgIHIgPSBpbl9waXhlbC5yZWQ7CisgICAgICAgICBnID0gaW5fcGl4ZWwuZ3JlZW47CisgICAgICAgICBiID0gaW5fcGl4ZWwuYmx1ZTsKKyAgICAgICAgIGEgPSBpbl9waXhlbC5hbHBoYTsKKworICAgICAgICAgLyogVGhpcyBhcHBsaWVzIHRoZSB0cmFuc2Zvcm1zIHRvIHRoZSBpbnB1dCBkYXRhLCBpbmNsdWRpbmcgb3V0cHV0CisgICAgICAgICAgKiBmb3JtYXQgb3BlcmF0aW9ucyB3aGljaCBtdXN0IGJlIHVzZWQgd2hlbiByZWFkaW5nIHRoZSBvdXRwdXQKKyAgICAgICAgICAqIHBpeGVsIHRoYXQgbGlicG5nIHByb2R1Y2VzLgorICAgICAgICAgICovCisgICAgICAgICBkcC0+dHJhbnNmb3JtX2xpc3QtPm1vZChkcC0+dHJhbnNmb3JtX2xpc3QsICZpbl9waXhlbCwgcHAsIGRwKTsKKworICAgICAgICAgLyogUmVhZCB0aGUgb3V0cHV0IHBpeGVsIGFuZCBjb21wYXJlIGl0IHRvIHdoYXQgd2UgZ290LCB3ZSBkb24ndAorICAgICAgICAgICogdXNlIHRoZSBlcnJvciBmaWVsZCBoZXJlLCBzbyBubyBuZWVkIHRvIHVwZGF0ZSBzQklULiAgaW5fcGl4ZWwKKyAgICAgICAgICAqIHNheXMgd2hldGhlciB3ZSBleHBlY3QgbGlicG5nIHRvIGNoYW5nZSB0aGUgb3V0cHV0IGZvcm1hdC4KKyAgICAgICAgICAqLworICAgICAgICAgaW1hZ2VfcGl4ZWxfaW5pdCgmb3V0X3BpeGVsLCBwUm93LCBvdXRfY3QsIG91dF9iZCwgeCwgb3V0X3BhbGV0dGUsCisgICAgICAgICAgICAgICAgICZpbl9waXhlbCk7CisKKyAgICAgICAgIC8qIFdlIGRvbid0IGV4cGVjdCBjaGFuZ2VzIHRvIHRoZSBpbmRleCBoZXJlIGV2ZW4gaWYgdGhlIGJpdCBkZXB0aCBpcworICAgICAgICAgICogY2hhbmdlZC4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKGluX2N0ID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgJiYKKyAgICAgICAgICAgIG91dF9jdCA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKGluX3BpeGVsLnBhbGV0dGVfaW5kZXggIT0gb3V0X3BpeGVsLnBhbGV0dGVfaW5kZXgpCisgICAgICAgICAgICAgICBwbmdfZXJyb3IocHAsICJ1bmV4cGVjdGVkIHRyYW5zZm9ybWVkIHBhbGV0dGUgaW5kZXgiKTsKKyAgICAgICAgIH0KKworICAgICAgICAgLyogQ2hlY2sgdGhlIGNvbG91cnMgZm9yIHBhbGV0dGUgaW1hZ2VzIHRvbyAtIGluIGZhY3QgdGhlIHBhbGV0dGUgY291bGQKKyAgICAgICAgICAqIGJlIHNlcGFyYXRlbHkgdmVyaWZpZWQgaXRzZWxmIGluIG1vc3QgY2FzZXMuCisgICAgICAgICAgKi8KKyAgICAgICAgIGlmIChpbl9waXhlbC5yZWQgIT0gb3V0X3BpeGVsLnJlZCkKKyAgICAgICAgICAgIHRyYW5zZm9ybV9yYW5nZV9jaGVjayhwcCwgciwgZywgYiwgYSwgaW5fcGl4ZWwucmVkLCBpbl9waXhlbC5yZWRmLAorICAgICAgICAgICAgICAgb3V0X3BpeGVsLnJlZCwgc2FtcGxlX2RlcHRoLCBpbl9waXhlbC5yZWRlLAorICAgICAgICAgICAgICAgZHAtPnBtLT5saW1pdCArIDEuLygyKigoMVU8PGluX3BpeGVsLnJlZF9zQklUKS0xKSksICJyZWQvZ3JheSIsCisgICAgICAgICAgICAgICBkaWdpdGl6YXRpb25fZXJyb3IpOworCisgICAgICAgICBpZiAoKG91dF9jdCAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKSAhPSAwICYmCisgICAgICAgICAgICBpbl9waXhlbC5ncmVlbiAhPSBvdXRfcGl4ZWwuZ3JlZW4pCisgICAgICAgICAgICB0cmFuc2Zvcm1fcmFuZ2VfY2hlY2socHAsIHIsIGcsIGIsIGEsIGluX3BpeGVsLmdyZWVuLAorICAgICAgICAgICAgICAgaW5fcGl4ZWwuZ3JlZW5mLCBvdXRfcGl4ZWwuZ3JlZW4sIHNhbXBsZV9kZXB0aCwgaW5fcGl4ZWwuZ3JlZW5lLAorICAgICAgICAgICAgICAgZHAtPnBtLT5saW1pdCArIDEuLygyKigoMVU8PGluX3BpeGVsLmdyZWVuX3NCSVQpLTEpKSwgImdyZWVuIiwKKyAgICAgICAgICAgICAgIGRpZ2l0aXphdGlvbl9lcnJvcik7CisKKyAgICAgICAgIGlmICgob3V0X2N0ICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpICE9IDAgJiYKKyAgICAgICAgICAgIGluX3BpeGVsLmJsdWUgIT0gb3V0X3BpeGVsLmJsdWUpCisgICAgICAgICAgICB0cmFuc2Zvcm1fcmFuZ2VfY2hlY2socHAsIHIsIGcsIGIsIGEsIGluX3BpeGVsLmJsdWUsIGluX3BpeGVsLmJsdWVmLAorICAgICAgICAgICAgICAgb3V0X3BpeGVsLmJsdWUsIHNhbXBsZV9kZXB0aCwgaW5fcGl4ZWwuYmx1ZWUsCisgICAgICAgICAgICAgICBkcC0+cG0tPmxpbWl0ICsgMS4vKDIqKCgxVTw8aW5fcGl4ZWwuYmx1ZV9zQklUKS0xKSksICJibHVlIiwKKyAgICAgICAgICAgICAgIGRpZ2l0aXphdGlvbl9lcnJvcik7CisKKyAgICAgICAgIGlmICgob3V0X2N0ICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpICE9IDAgJiYKKyAgICAgICAgICAgIGluX3BpeGVsLmFscGhhICE9IG91dF9waXhlbC5hbHBoYSkKKyAgICAgICAgICAgIHRyYW5zZm9ybV9yYW5nZV9jaGVjayhwcCwgciwgZywgYiwgYSwgaW5fcGl4ZWwuYWxwaGEsCisgICAgICAgICAgICAgICBpbl9waXhlbC5hbHBoYWYsIG91dF9waXhlbC5hbHBoYSwgc2FtcGxlX2RlcHRoLCBpbl9waXhlbC5hbHBoYWUsCisgICAgICAgICAgICAgICBkcC0+cG0tPmxpbWl0ICsgMS4vKDIqKCgxVTw8aW5fcGl4ZWwuYWxwaGFfc0JJVCktMSkpLCAiYWxwaGEiLAorICAgICAgICAgICAgICAgZGlnaXRpemF0aW9uX2Vycm9yKTsKKyAgICAgIH0gLyogcGl4ZWwgKHgpIGxvb3AgKi8KKyAgIH0gLyogcm93ICh5KSBsb29wICovCisKKyAgIC8qIFJlY29yZCB0aGF0IHNvbWV0aGluZyB3YXMgYWN0dWFsbHkgY2hlY2tlZCB0byBhdm9pZCBhIGZhbHNlIHBvc2l0aXZlLiAqLworICAgZHAtPnRoaXMucHMtPnZhbGlkYXRlZCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIFBOR0NCQVBJCit0cmFuc2Zvcm1fZW5kKHBuZ19zdHJ1Y3RwIHBwSW4sIHBuZ19pbmZvcCBwaSkKK3sKKyAgIHBuZ19jb25zdF9zdHJ1Y3RwIHBwID0gcHBJbjsKKyAgIHRyYW5zZm9ybV9kaXNwbGF5ICpkcCA9IHZvaWRjYXN0KHRyYW5zZm9ybV9kaXNwbGF5KiwKKyAgICAgIHBuZ19nZXRfcHJvZ3Jlc3NpdmVfcHRyKHBwKSk7CisKKyAgIGlmICghZHAtPnRoaXMuc3BlZWQpCisgICAgICB0cmFuc2Zvcm1faW1hZ2VfdmFsaWRhdGUoZHAsIHBwLCBwaSk7CisgICBlbHNlCisgICAgICBkcC0+dGhpcy5wcy0+dmFsaWRhdGVkID0gMTsKK30KKworLyogQSBzaW5nbGUgdGVzdCBydW4uICovCitzdGF0aWMgdm9pZAordHJhbnNmb3JtX3Rlc3QocG5nX21vZGlmaWVyICpwbUluLCBjb25zdCBwbmdfdWludF8zMiBpZEluLAorICAgIGNvbnN0IGltYWdlX3RyYW5zZm9ybSogdHJhbnNmb3JtX2xpc3RJbiwgY29uc3QgY2hhciAqIGNvbnN0IG5hbWUpCit7CisgICB0cmFuc2Zvcm1fZGlzcGxheSBkOworICAgY29udGV4dCgmcG1Jbi0+dGhpcywgZmF1bHQpOworCisgICB0cmFuc2Zvcm1fZGlzcGxheV9pbml0KCZkLCBwbUluLCBpZEluLCB0cmFuc2Zvcm1fbGlzdEluKTsKKworICAgVHJ5CisgICB7CisgICAgICBzaXplX3QgcG9zID0gMDsKKyAgICAgIHBuZ19zdHJ1Y3RwIHBwOworICAgICAgcG5nX2luZm9wIHBpOworICAgICAgY2hhciBmdWxsX25hbWVbMjU2XTsKKworICAgICAgLyogTWFrZSBzdXJlIHRoZSBlbmNvZGluZyBmaWVsZHMgYXJlIGNvcnJlY3QgYW5kIGVudGVyIHRoZSByZXF1aXJlZAorICAgICAgICogbW9kaWZpY2F0aW9ucy4KKyAgICAgICAqLworICAgICAgdHJhbnNmb3JtX3NldF9lbmNvZGluZygmZCk7CisKKyAgICAgIC8qIEFkZCBhbnkgbW9kaWZpY2F0aW9ucyByZXF1aXJlZCBieSB0aGUgdHJhbnNmb3JtIGxpc3QuICovCisgICAgICBkLnRyYW5zZm9ybV9saXN0LT5pbmkoZC50cmFuc2Zvcm1fbGlzdCwgJmQpOworCisgICAgICAvKiBBZGQgdGhlIGNvbG9yIHNwYWNlIGluZm9ybWF0aW9uLCBpZiBhbnksIHRvIHRoZSBuYW1lLiAqLworICAgICAgcG9zID0gc2FmZWNhdChmdWxsX25hbWUsIHNpemVvZiBmdWxsX25hbWUsIHBvcywgbmFtZSk7CisgICAgICBwb3MgPSBzYWZlY2F0X2N1cnJlbnRfZW5jb2RpbmcoZnVsbF9uYW1lLCBzaXplb2YgZnVsbF9uYW1lLCBwb3MsIGQucG0pOworCisgICAgICAvKiBHZXQgYSBwbmdfc3RydWN0IGZvciByZWFkaW5nIHRoZSBpbWFnZS4gKi8KKyAgICAgIHBwID0gc2V0X21vZGlmaWVyX2Zvcl9yZWFkKGQucG0sICZwaSwgZC50aGlzLmlkLCBmdWxsX25hbWUpOworICAgICAgc3RhbmRhcmRfcGFsZXR0ZV9pbml0KCZkLnRoaXMpOworCisjICAgICBpZiAwCisgICAgICAgICAvKiBMb2dnaW5nIChkZWJ1Z2dpbmcgb25seSkgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgYnVmZmVyWzI1Nl07CisKKyAgICAgICAgICAgICh2b2lkKXN0b3JlX21lc3NhZ2UoJmQucG0tPnRoaXMsIHBwLCBidWZmZXIsIHNpemVvZiBidWZmZXIsIDAsCisgICAgICAgICAgICAgICAicnVubmluZyB0ZXN0Iik7CisKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGJ1ZmZlcik7CisgICAgICAgICB9CisjICAgICBlbmRpZgorCisgICAgICAvKiBJbnRyb2R1Y2UgdGhlIGNvcnJlY3QgcmVhZCBmdW5jdGlvbi4gKi8KKyAgICAgIGlmIChkLnBtLT50aGlzLnByb2dyZXNzaXZlKQorICAgICAgeworICAgICAgICAgLyogU2hhcmUgdGhlIHJvdyBmdW5jdGlvbiB3aXRoIHRoZSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbi4gKi8KKyAgICAgICAgIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbihwcCwgJmQsIHRyYW5zZm9ybV9pbmZvLCBwcm9ncmVzc2l2ZV9yb3csCisgICAgICAgICAgICB0cmFuc2Zvcm1fZW5kKTsKKworICAgICAgICAgLyogTm93IGZlZWQgZGF0YSBpbnRvIHRoZSByZWFkZXIgdW50aWwgd2UgcmVhY2ggdGhlIGVuZDogKi8KKyAgICAgICAgIG1vZGlmaWVyX3Byb2dyZXNzaXZlX3JlYWQoZC5wbSwgcHAsIHBpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIC8qIG1vZGlmaWVyX3JlYWQgZXhwZWN0cyBhIHBuZ19tb2RpZmllciogKi8KKyAgICAgICAgIHBuZ19zZXRfcmVhZF9mbihwcCwgZC5wbSwgbW9kaWZpZXJfcmVhZCk7CisKKyAgICAgICAgIC8qIENoZWNrIHRoZSBoZWFkZXIgdmFsdWVzOiAqLworICAgICAgICAgcG5nX3JlYWRfaW5mbyhwcCwgcGkpOworCisgICAgICAgICAvKiBQcm9jZXNzIHRoZSAnaW5mbycgcmVxdWlyZW1lbnRzLiBPbmx5IG9uZSBpbWFnZSBpcyBnZW5lcmF0ZWQgKi8KKyAgICAgICAgIHRyYW5zZm9ybV9pbmZvX2ltcCgmZCwgcHAsIHBpKTsKKworICAgICAgICAgc2VxdWVudGlhbF9yb3coJmQudGhpcywgcHAsIHBpLCAtMSwgMCk7CisKKyAgICAgICAgIGlmICghZC50aGlzLnNwZWVkKQorICAgICAgICAgICAgdHJhbnNmb3JtX2ltYWdlX3ZhbGlkYXRlKCZkLCBwcCwgcGkpOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgZC50aGlzLnBzLT52YWxpZGF0ZWQgPSAxOworICAgICAgfQorCisgICAgICBtb2RpZmllcl9yZXNldChkLnBtKTsKKyAgIH0KKworICAgQ2F0Y2goZmF1bHQpCisgICB7CisgICAgICBtb2RpZmllcl9yZXNldCh2b2lkY2FzdChwbmdfbW9kaWZpZXIqLCh2b2lkKilmYXVsdCkpOworICAgfQorfQorCisvKiBUaGUgdHJhbnNmb3JtczogKi8KKyNkZWZpbmUgSVRTVFJVQ1QobmFtZSkgaW1hZ2VfdHJhbnNmb3JtXyMjbmFtZQorI2RlZmluZSBJVERBVEEobmFtZSkgaW1hZ2VfdHJhbnNmb3JtX2RhdGFfIyNuYW1lCisjZGVmaW5lIGltYWdlX3RyYW5zZm9ybV9pbmkgaW1hZ2VfdHJhbnNmb3JtX2RlZmF1bHRfaW5pCisjZGVmaW5lIElUKG5hbWUpXAorc3RhdGljIGltYWdlX3RyYW5zZm9ybSBJVFNUUlVDVChuYW1lKSA9XAore1wKKyAgICNuYW1lLFwKKyAgIDEsIC8qZW5hYmxlKi9cCisgICAmUFQsIC8qbGlzdCovXAorICAgMCwgLypnbG9iYWxfdXNlKi9cCisgICAwLCAvKmxvY2FsX3VzZSovXAorICAgMCwgLypuZXh0Ki9cCisgICBpbWFnZV90cmFuc2Zvcm1faW5pLFwKKyAgIGltYWdlX3RyYW5zZm9ybV9wbmdfc2V0XyMjbmFtZSMjX3NldCxcCisgICBpbWFnZV90cmFuc2Zvcm1fcG5nX3NldF8jI25hbWUjI19tb2QsXAorICAgaW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfIyNuYW1lIyNfYWRkXAorfQorI2RlZmluZSBQVCBJVFNUUlVDVChlbmQpIC8qIHN0b3JlcyB0aGUgcHJldmlvdXMgdHJhbnNmb3JtICovCisKKy8qIFRvIHNhdmUgY29kZTogKi8KK2V4dGVybiB2b2lkIGltYWdlX3RyYW5zZm9ybV9kZWZhdWx0X2luaShjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCisgICB0cmFuc2Zvcm1fZGlzcGxheSAqdGhhdCk7IC8qIHNpbGVuY2UgR0NDIHdhcm5pbmdzICovCisKK3ZvaWQgLyogcHJpdmF0ZSwgYnV0IGFsbW9zdCBhbHdheXMgbmVlZGVkICovCitpbWFnZV90cmFuc2Zvcm1fZGVmYXVsdF9pbmkoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAorICAgIHRyYW5zZm9ybV9kaXNwbGF5ICp0aGF0KQoreworICAgdGhpcy0+bmV4dC0+aW5pKHRoaXMtPm5leHQsIHRoYXQpOworfQorCisjaWZkZWYgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQKK3N0YXRpYyBpbnQKK2ltYWdlX3RyYW5zZm9ybV9kZWZhdWx0X2FkZChpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCisgICAgY29uc3QgaW1hZ2VfdHJhbnNmb3JtICoqdGhhdCwgcG5nX2J5dGUgY29sb3VyX3R5cGUsIHBuZ19ieXRlIGJpdF9kZXB0aCkKK3sKKyAgIFVOVVNFRChjb2xvdXJfdHlwZSkKKyAgIFVOVVNFRChiaXRfZGVwdGgpCisKKyAgIHRoaXMtPm5leHQgPSAqdGhhdDsKKyAgICp0aGF0ID0gdGhpczsKKworICAgcmV0dXJuIDE7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQKKy8qIHBuZ19zZXRfcGFsZXR0ZV90b19yZ2IgKi8KK3N0YXRpYyB2b2lkCitpbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9wYWxldHRlX3RvX3JnYl9zZXQoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAorICAgIHRyYW5zZm9ybV9kaXNwbGF5ICp0aGF0LCBwbmdfc3RydWN0cCBwcCwgcG5nX2luZm9wIHBpKQoreworICAgcG5nX3NldF9wYWxldHRlX3RvX3JnYihwcCk7CisgICB0aGlzLT5uZXh0LT5zZXQodGhpcy0+bmV4dCwgdGhhdCwgcHAsIHBpKTsKK30KKworc3RhdGljIHZvaWQKK2ltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X3BhbGV0dGVfdG9fcmdiX21vZChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCisgICAgaW1hZ2VfcGl4ZWwgKnRoYXQsIHBuZ19jb25zdF9zdHJ1Y3RwIHBwLAorICAgIGNvbnN0IHRyYW5zZm9ybV9kaXNwbGF5ICpkaXNwbGF5KQoreworICAgaWYgKHRoYXQtPmNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCisgICAgICBpbWFnZV9waXhlbF9jb252ZXJ0X1BMVEUodGhhdCk7CisKKyAgIHRoaXMtPm5leHQtPm1vZCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgZGlzcGxheSk7Cit9CisKK3N0YXRpYyBpbnQKK2ltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X3BhbGV0dGVfdG9fcmdiX2FkZChpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCisgICAgY29uc3QgaW1hZ2VfdHJhbnNmb3JtICoqdGhhdCwgcG5nX2J5dGUgY29sb3VyX3R5cGUsIHBuZ19ieXRlIGJpdF9kZXB0aCkKK3sKKyAgIFVOVVNFRChiaXRfZGVwdGgpCisKKyAgIHRoaXMtPm5leHQgPSAqdGhhdDsKKyAgICp0aGF0ID0gdGhpczsKKworICAgcmV0dXJuIGNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEU7Cit9CisKK0lUKHBhbGV0dGVfdG9fcmdiKTsKKyN1bmRlZiBQVAorI2RlZmluZSBQVCBJVFNUUlVDVChwYWxldHRlX3RvX3JnYikKKyNlbmRpZiAvKiBQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVEICovCisKKyNpZmRlZiBQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVECisvKiBwbmdfc2V0X3RSTlNfdG9fYWxwaGEgKi8KK3N0YXRpYyB2b2lkCitpbWFnZV90cmFuc2Zvcm1fcG5nX3NldF90Uk5TX3RvX2FscGhhX3NldChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCisgICB0cmFuc2Zvcm1fZGlzcGxheSAqdGhhdCwgcG5nX3N0cnVjdHAgcHAsIHBuZ19pbmZvcCBwaSkKK3sKKyAgIHBuZ19zZXRfdFJOU190b19hbHBoYShwcCk7CisKKyAgIC8qIElmIHRoZXJlIHdhcyBhIHRSTlMgY2h1bmsgdGhhdCB3b3VsZCBnZXQgZXhwYW5kZWQgYW5kIGFkZCBhbiBhbHBoYQorICAgICogY2hhbm5lbCBpc190cmFuc3BhcmVudCBtdXN0IGJlIHVwZGF0ZWQ6CisgICAgKi8KKyAgIGlmICh0aGF0LT50aGlzLmhhc190Uk5TKQorICAgICAgdGhhdC0+dGhpcy5pc190cmFuc3BhcmVudCA9IDE7CisKKyAgIHRoaXMtPm5leHQtPnNldCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgcGkpOworfQorCitzdGF0aWMgdm9pZAoraW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfdFJOU190b19hbHBoYV9tb2QoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAorICAgaW1hZ2VfcGl4ZWwgKnRoYXQsIHBuZ19jb25zdF9zdHJ1Y3RwIHBwLAorICAgY29uc3QgdHJhbnNmb3JtX2Rpc3BsYXkgKmRpc3BsYXkpCit7CisjaWYgUE5HX0xJQlBOR19WRVIgPCAxMDcwMAorICAgLyogTElCUE5HIEJVRzogdGhpcyBhbHdheXMgZm9yY2VzIHBhbGV0dGUgaW1hZ2VzIHRvIFJHQi4gKi8KKyAgIGlmICh0aGF0LT5jb2xvdXJfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQorICAgICAgaW1hZ2VfcGl4ZWxfY29udmVydF9QTFRFKHRoYXQpOworI2VuZGlmCisKKyAgIC8qIFRoaXMgZWZmZWN0aXZlbHkgZG9lcyBhbiAnZXhwYW5kJyBvbmx5IGlmIHRoZXJlIGlzIHNvbWUgdHJhbnNwYXJlbmN5IHRvCisgICAgKiBjb252ZXJ0IHRvIGFuIGFscGhhIGNoYW5uZWwuCisgICAgKi8KKyAgIGlmICh0aGF0LT5oYXZlX3RSTlMpCisjICAgICBpZiBQTkdfTElCUE5HX1ZFUiA+PSAxMDcwMAorICAgICAgICAgaWYgKHRoYXQtPmNvbG91cl90eXBlICE9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgJiYKKyAgICAgICAgICAgICAodGhhdC0+Y29sb3VyX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkgPT0gMCkKKyMgICAgIGVuZGlmCisgICAgICBpbWFnZV9waXhlbF9hZGRfYWxwaGEodGhhdCwgJmRpc3BsYXktPnRoaXMsIDAvKiFmb3IgYmFja2dyb3VuZCovKTsKKworI2lmIFBOR19MSUJQTkdfVkVSIDwgMTA3MDAKKyAgIC8qIExJQlBORyBCVUc6IG90aGVyd2lzZSBsaWJwbmcgc3RpbGwgZXhwYW5kcyB0byA4IGJpdHMhICovCisgICBlbHNlCisgICB7CisgICAgICBpZiAodGhhdC0+Yml0X2RlcHRoIDwgOCkKKyAgICAgICAgIHRoYXQtPmJpdF9kZXB0aCA9ODsKKyAgICAgIGlmICh0aGF0LT5zYW1wbGVfZGVwdGggPCA4KQorICAgICAgICAgdGhhdC0+c2FtcGxlX2RlcHRoID0gODsKKyAgIH0KKyNlbmRpZgorCisgICB0aGlzLT5uZXh0LT5tb2QodGhpcy0+bmV4dCwgdGhhdCwgcHAsIGRpc3BsYXkpOworfQorCitzdGF0aWMgaW50CitpbWFnZV90cmFuc2Zvcm1fcG5nX3NldF90Uk5TX3RvX2FscGhhX2FkZChpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCisgICAgY29uc3QgaW1hZ2VfdHJhbnNmb3JtICoqdGhhdCwgcG5nX2J5dGUgY29sb3VyX3R5cGUsIHBuZ19ieXRlIGJpdF9kZXB0aCkKK3sKKyAgIFVOVVNFRChiaXRfZGVwdGgpCisKKyAgIHRoaXMtPm5leHQgPSAqdGhhdDsKKyAgICp0aGF0ID0gdGhpczsKKworICAgLyogV2UgZG9uJ3Qga25vdyB5ZXQgd2hldGhlciB0aGVyZSB3aWxsIGJlIGEgdFJOUyBjaHVuaywgYnV0IHdlIGtub3cgdGhhdAorICAgICogdGhpcyB0cmFuc2Zvcm1hdGlvbiBzaG91bGQgZG8gbm90aGluZyBpZiB0aGVyZSBhbHJlYWR5IGlzIGFuIGFscGhhCisgICAgKiBjaGFubmVsLiAgSW4gYWRkaXRpb24sIGFmdGVyIHRoZSBidWcgZml4IGluIDEuNy4wLCB0aGVyZSBpcyBubyBsb25nZXIKKyAgICAqIGFueSBhY3Rpb24gb24gYSBwYWxldHRlIGltYWdlLgorICAgICovCisgICByZXR1cm4KKyMgIGlmIFBOR19MSUJQTkdfVkVSID49IDEwNzAwCisgICAgICBjb2xvdXJfdHlwZSAhPSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFICYmCisjICBlbmRpZgorICAgKGNvbG91cl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpID09IDA7Cit9CisKK0lUKHRSTlNfdG9fYWxwaGEpOworI3VuZGVmIFBUCisjZGVmaW5lIFBUIElUU1RSVUNUKHRSTlNfdG9fYWxwaGEpCisjZW5kaWYgLyogUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRCAqLworCisjaWZkZWYgUE5HX1JFQURfR1JBWV9UT19SR0JfU1VQUE9SVEVECisvKiBwbmdfc2V0X2dyYXlfdG9fcmdiICovCitzdGF0aWMgdm9pZAoraW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfZ3JheV90b19yZ2Jfc2V0KGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKKyAgICB0cmFuc2Zvcm1fZGlzcGxheSAqdGhhdCwgcG5nX3N0cnVjdHAgcHAsIHBuZ19pbmZvcCBwaSkKK3sKKyAgIHBuZ19zZXRfZ3JheV90b19yZ2IocHApOworICAgLyogTk9URTogdGhpcyBkb2Vzbid0IHJlc3VsdCBpbiB0Uk5TIGV4cGFuc2lvbi4gKi8KKyAgIHRoaXMtPm5leHQtPnNldCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgcGkpOworfQorCitzdGF0aWMgdm9pZAoraW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfZ3JheV90b19yZ2JfbW9kKGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKKyAgICBpbWFnZV9waXhlbCAqdGhhdCwgcG5nX2NvbnN0X3N0cnVjdHAgcHAsCisgICAgY29uc3QgdHJhbnNmb3JtX2Rpc3BsYXkgKmRpc3BsYXkpCit7CisgICAvKiBOT1RFOiB3ZSBjYW4gYWN0dWFsbHkgcGVuZCB0aGUgdFJOUyBwcm9jZXNzaW5nIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSB3ZQorICAgICogY2FuIGNvcnJlY3RseSByZWNvZ25pemUgdGhlIG9yaWdpbmFsIHBpeGVsIHZhbHVlIGV2ZW4gdGhvdWdoIHdlIGhhdmUKKyAgICAqIG1hcHBlZCB0aGUgb25lIGdyYXkgY2hhbm5lbCB0byB0aGUgdGhyZWUgUkdCIG9uZXMsIGJ1dCBpbiBmYWN0IGxpYnBuZworICAgICogZG9lc24ndCBkbyB0aGlzLCBzbyB3ZSBkb24ndCBlaXRoZXIuCisgICAgKi8KKyAgIGlmICgodGhhdC0+Y29sb3VyX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikgPT0gMCAmJiB0aGF0LT5oYXZlX3RSTlMpCisgICAgICBpbWFnZV9waXhlbF9hZGRfYWxwaGEodGhhdCwgJmRpc3BsYXktPnRoaXMsIDAvKiFmb3IgYmFja2dyb3VuZCovKTsKKworICAgLyogU2ltcGx5IGV4cGFuZCB0aGUgYml0IGRlcHRoIGFuZCBhbHRlciB0aGUgY29sb3VyIHR5cGUgYXMgcmVxdWlyZWQuICovCisgICBpZiAodGhhdC0+Y29sb3VyX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkKKyAgIHsKKyAgICAgIC8qIFJHQiBpbWFnZXMgaGF2ZSBhIGJpdCBkZXB0aCBhdCBsZWFzdCBlcXVhbCB0byAnOCcgKi8KKyAgICAgIGlmICh0aGF0LT5iaXRfZGVwdGggPCA4KQorICAgICAgICAgdGhhdC0+c2FtcGxlX2RlcHRoID0gdGhhdC0+Yml0X2RlcHRoID0gODsKKworICAgICAgLyogQW5kIGp1c3QgY2hhbmdpbmcgdGhlIGNvbG91ciB0eXBlIHdvcmtzIGhlcmUgYmVjYXVzZSB0aGUgZ3JlZW4gYW5kIGJsdWUKKyAgICAgICAqIGNoYW5uZWxzIGFyZSBiZWluZyBtYWludGFpbmVkIGluIGxvY2stc3RlcCB3aXRoIHRoZSByZWQvZ3JheToKKyAgICAgICAqLworICAgICAgdGhhdC0+Y29sb3VyX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9SR0I7CisgICB9CisKKyAgIGVsc2UgaWYgKHRoYXQtPmNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpCisgICAgICB0aGF0LT5jb2xvdXJfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQTsKKworICAgdGhpcy0+bmV4dC0+bW9kKHRoaXMtPm5leHQsIHRoYXQsIHBwLCBkaXNwbGF5KTsKK30KKworc3RhdGljIGludAoraW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfZ3JheV90b19yZ2JfYWRkKGltYWdlX3RyYW5zZm9ybSAqdGhpcywKKyAgICBjb25zdCBpbWFnZV90cmFuc2Zvcm0gKip0aGF0LCBwbmdfYnl0ZSBjb2xvdXJfdHlwZSwgcG5nX2J5dGUgYml0X2RlcHRoKQoreworICAgVU5VU0VEKGJpdF9kZXB0aCkKKworICAgdGhpcy0+bmV4dCA9ICp0aGF0OworICAgKnRoYXQgPSB0aGlzOworCisgICByZXR1cm4gKGNvbG91cl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpID09IDA7Cit9CisKK0lUKGdyYXlfdG9fcmdiKTsKKyN1bmRlZiBQVAorI2RlZmluZSBQVCBJVFNUUlVDVChncmF5X3RvX3JnYikKKyNlbmRpZiAvKiBQTkdfUkVBRF9HUkFZX1RPX1JHQl9TVVBQT1JURUQgKi8KKworI2lmZGVmIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQKKy8qIHBuZ19zZXRfZXhwYW5kICovCitzdGF0aWMgdm9pZAoraW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfZXhwYW5kX3NldChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCisgICAgdHJhbnNmb3JtX2Rpc3BsYXkgKnRoYXQsIHBuZ19zdHJ1Y3RwIHBwLCBwbmdfaW5mb3AgcGkpCit7CisgICBwbmdfc2V0X2V4cGFuZChwcCk7CisKKyAgIGlmICh0aGF0LT50aGlzLmhhc190Uk5TKQorICAgICAgdGhhdC0+dGhpcy5pc190cmFuc3BhcmVudCA9IDE7CisKKyAgIHRoaXMtPm5leHQtPnNldCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgcGkpOworfQorCitzdGF0aWMgdm9pZAoraW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfZXhwYW5kX21vZChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCisgICAgaW1hZ2VfcGl4ZWwgKnRoYXQsIHBuZ19jb25zdF9zdHJ1Y3RwIHBwLAorICAgIGNvbnN0IHRyYW5zZm9ybV9kaXNwbGF5ICpkaXNwbGF5KQoreworICAgLyogVGhlIGdlbmVyYWwgZXhwYW5kIGNhc2UgZGVwZW5kcyBvbiB3aGF0IHRoZSBjb2xvdXIgdHlwZSBpczogKi8KKyAgIGlmICh0aGF0LT5jb2xvdXJfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQorICAgICAgaW1hZ2VfcGl4ZWxfY29udmVydF9QTFRFKHRoYXQpOworICAgZWxzZSBpZiAodGhhdC0+Yml0X2RlcHRoIDwgOCkgLyogZ3JheXNjYWxlICovCisgICAgICB0aGF0LT5zYW1wbGVfZGVwdGggPSB0aGF0LT5iaXRfZGVwdGggPSA4OworCisgICBpZiAodGhhdC0+aGF2ZV90Uk5TKQorICAgICAgaW1hZ2VfcGl4ZWxfYWRkX2FscGhhKHRoYXQsICZkaXNwbGF5LT50aGlzLCAwLyohZm9yIGJhY2tncm91bmQqLyk7CisKKyAgIHRoaXMtPm5leHQtPm1vZCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgZGlzcGxheSk7Cit9CisKK3N0YXRpYyBpbnQKK2ltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X2V4cGFuZF9hZGQoaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAorICAgIGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqKnRoYXQsIHBuZ19ieXRlIGNvbG91cl90eXBlLCBwbmdfYnl0ZSBiaXRfZGVwdGgpCit7CisgICBVTlVTRUQoYml0X2RlcHRoKQorCisgICB0aGlzLT5uZXh0ID0gKnRoYXQ7CisgICAqdGhhdCA9IHRoaXM7CisKKyAgIC8qICdleHBhbmQnIHNob3VsZCBkbyBub3RoaW5nIGZvciBSR0JBIG9yIEdBIGlucHV0IC0gbm8gdFJOUyBhbmQgdGhlIGJpdAorICAgICogZGVwdGggaXMgYXQgbGVhc3QgOCBhbHJlYWR5LgorICAgICovCisgICByZXR1cm4gKGNvbG91cl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpID09IDA7Cit9CisKK0lUKGV4cGFuZCk7CisjdW5kZWYgUFQKKyNkZWZpbmUgUFQgSVRTVFJVQ1QoZXhwYW5kKQorI2VuZGlmIC8qIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQgKi8KKworI2lmZGVmIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQKKy8qIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOAorICogUHJlIDEuNy4wIExJQlBORyBCVUc6IHRoaXMganVzdCBkb2VzIGFuICdleHBhbmQnCisgKi8KK3N0YXRpYyB2b2lkCitpbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184X3NldCgKKyAgICBjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsIHRyYW5zZm9ybV9kaXNwbGF5ICp0aGF0LCBwbmdfc3RydWN0cCBwcCwKKyAgICBwbmdfaW5mb3AgcGkpCit7CisgICBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgocHApOworICAgLyogTk9URTogZG9uJ3QgZXhwZWN0IHRoaXMgdG8gZXhwYW5kIHRSTlMgKi8KKyAgIHRoaXMtPm5leHQtPnNldCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgcGkpOworfQorCitzdGF0aWMgdm9pZAoraW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOF9tb2QoCisgICAgY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLCBpbWFnZV9waXhlbCAqdGhhdCwgcG5nX2NvbnN0X3N0cnVjdHAgcHAsCisgICAgY29uc3QgdHJhbnNmb3JtX2Rpc3BsYXkgKmRpc3BsYXkpCit7CisjaWYgUE5HX0xJQlBOR19WRVIgPCAxMDcwMAorICAgaW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfZXhwYW5kX21vZCh0aGlzLCB0aGF0LCBwcCwgZGlzcGxheSk7CisjZWxzZQorICAgLyogT25seSBleHBhbmQgZ3JheXNjYWxlIG9mIGJpdCBkZXB0aCBsZXNzIHRoYW4gODogKi8KKyAgIGlmICh0aGF0LT5jb2xvdXJfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZICYmCisgICAgICAgdGhhdC0+Yml0X2RlcHRoIDwgOCkKKyAgICAgIHRoYXQtPnNhbXBsZV9kZXB0aCA9IHRoYXQtPmJpdF9kZXB0aCA9IDg7CisKKyAgIHRoaXMtPm5leHQtPm1vZCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgZGlzcGxheSk7CisjZW5kaWYgLyogMS43IG9yIGxhdGVyICovCit9CisKK3N0YXRpYyBpbnQKK2ltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzhfYWRkKGltYWdlX3RyYW5zZm9ybSAqdGhpcywKKyAgICBjb25zdCBpbWFnZV90cmFuc2Zvcm0gKip0aGF0LCBwbmdfYnl0ZSBjb2xvdXJfdHlwZSwgcG5nX2J5dGUgYml0X2RlcHRoKQoreworI2lmIFBOR19MSUJQTkdfVkVSIDwgMTA3MDAKKyAgIHJldHVybiBpbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9leHBhbmRfYWRkKHRoaXMsIHRoYXQsIGNvbG91cl90eXBlLAorICAgICAgYml0X2RlcHRoKTsKKyNlbHNlCisgICBVTlVTRUQoYml0X2RlcHRoKQorCisgICB0aGlzLT5uZXh0ID0gKnRoYXQ7CisgICAqdGhhdCA9IHRoaXM7CisKKyAgIC8qIFRoaXMgc2hvdWxkIGRvIG5vdGhpbmcgdW5sZXNzIHRoZSBjb2xvciB0eXBlIGlzIGdyYXkgYW5kIHRoZSBiaXQgZGVwdGggaXMKKyAgICAqIGxlc3MgdGhhbiA4OgorICAgICovCisgICByZXR1cm4gY29sb3VyX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSAmJiBiaXRfZGVwdGggPCA4OworI2VuZGlmIC8qIDEuNyBvciBsYXRlciAqLworfQorCitJVChleHBhbmRfZ3JheV8xXzJfNF90b184KTsKKyN1bmRlZiBQVAorI2RlZmluZSBQVCBJVFNUUlVDVChleHBhbmRfZ3JheV8xXzJfNF90b184KQorI2VuZGlmIC8qIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQgKi8KKworI2lmZGVmIFBOR19SRUFEX0VYUEFORF8xNl9TVVBQT1JURUQKKy8qIHBuZ19zZXRfZXhwYW5kXzE2ICovCitzdGF0aWMgdm9pZAoraW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfZXhwYW5kXzE2X3NldChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCisgICAgdHJhbnNmb3JtX2Rpc3BsYXkgKnRoYXQsIHBuZ19zdHJ1Y3RwIHBwLCBwbmdfaW5mb3AgcGkpCit7CisgICBwbmdfc2V0X2V4cGFuZF8xNihwcCk7CisKKyAgIC8qIE5PVEU6IHByaW9yIHRvIDEuNyBsaWJwbmcgZG9lcyBTRVRfRVhQQU5EIGFzIHdlbGwsIHNvIHRSTlMgaXMgZXhwYW5kZWQuICovCisjICBpZiBQTkdfTElCUE5HX1ZFUiA8IDEwNzAwCisgICAgICBpZiAodGhhdC0+dGhpcy5oYXNfdFJOUykKKyAgICAgICAgIHRoYXQtPnRoaXMuaXNfdHJhbnNwYXJlbnQgPSAxOworIyAgZW5kaWYKKworICAgdGhpcy0+bmV4dC0+c2V0KHRoaXMtPm5leHQsIHRoYXQsIHBwLCBwaSk7Cit9CisKK3N0YXRpYyB2b2lkCitpbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9leHBhbmRfMTZfbW9kKGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKKyAgICBpbWFnZV9waXhlbCAqdGhhdCwgcG5nX2NvbnN0X3N0cnVjdHAgcHAsCisgICAgY29uc3QgdHJhbnNmb3JtX2Rpc3BsYXkgKmRpc3BsYXkpCit7CisgICAvKiBFeHBlY3QgZXhwYW5kXzE2IHRvIGV4cGFuZCBldmVyeXRoaW5nIHRvIDE2IGJpdHMgYXMgYSByZXN1bHQgb2YgYWxzbworICAgICogY2F1c2luZyAnZXhwYW5kJyB0byBoYXBwZW4uCisgICAgKi8KKyAgIGlmICh0aGF0LT5jb2xvdXJfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQorICAgICAgaW1hZ2VfcGl4ZWxfY29udmVydF9QTFRFKHRoYXQpOworCisgICBpZiAodGhhdC0+aGF2ZV90Uk5TKQorICAgICAgaW1hZ2VfcGl4ZWxfYWRkX2FscGhhKHRoYXQsICZkaXNwbGF5LT50aGlzLCAwLyohZm9yIGJhY2tncm91bmQqLyk7CisKKyAgIGlmICh0aGF0LT5iaXRfZGVwdGggPCAxNikKKyAgICAgIHRoYXQtPnNhbXBsZV9kZXB0aCA9IHRoYXQtPmJpdF9kZXB0aCA9IDE2OworCisgICB0aGlzLT5uZXh0LT5tb2QodGhpcy0+bmV4dCwgdGhhdCwgcHAsIGRpc3BsYXkpOworfQorCitzdGF0aWMgaW50CitpbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9leHBhbmRfMTZfYWRkKGltYWdlX3RyYW5zZm9ybSAqdGhpcywKKyAgICBjb25zdCBpbWFnZV90cmFuc2Zvcm0gKip0aGF0LCBwbmdfYnl0ZSBjb2xvdXJfdHlwZSwgcG5nX2J5dGUgYml0X2RlcHRoKQoreworICAgVU5VU0VEKGNvbG91cl90eXBlKQorCisgICB0aGlzLT5uZXh0ID0gKnRoYXQ7CisgICAqdGhhdCA9IHRoaXM7CisKKyAgIC8qIGV4cGFuZF8xNiBkb2VzIHNvbWV0aGluZyB1bmxlc3MgdGhlIGJpdCBkZXB0aCBpcyBhbHJlYWR5IDE2LiAqLworICAgcmV0dXJuIGJpdF9kZXB0aCA8IDE2OworfQorCitJVChleHBhbmRfMTYpOworI3VuZGVmIFBUCisjZGVmaW5lIFBUIElUU1RSVUNUKGV4cGFuZF8xNikKKyNlbmRpZiAvKiBQTkdfUkVBRF9FWFBBTkRfMTZfU1VQUE9SVEVEICovCisKKyNpZmRlZiBQTkdfUkVBRF9TQ0FMRV8xNl9UT184X1NVUFBPUlRFRCAgLyogQVBJIGFkZGVkIGluIDEuNS40ICovCisvKiBwbmdfc2V0X3NjYWxlXzE2ICovCitzdGF0aWMgdm9pZAoraW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfc2NhbGVfMTZfc2V0KGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKKyAgICB0cmFuc2Zvcm1fZGlzcGxheSAqdGhhdCwgcG5nX3N0cnVjdHAgcHAsIHBuZ19pbmZvcCBwaSkKK3sKKyAgIHBuZ19zZXRfc2NhbGVfMTYocHApOworIyAgaWYgUE5HX0xJQlBOR19WRVIgPCAxMDcwMAorICAgICAgLyogbGlicG5nIHdpbGwgbGltaXQgdGhlIGdhbW1hIHRhYmxlIHNpemU6ICovCisgICAgICB0aGF0LT5tYXhfZ2FtbWFfOCA9IFBOR19NQVhfR0FNTUFfODsKKyMgIGVuZGlmCisgICB0aGlzLT5uZXh0LT5zZXQodGhpcy0+bmV4dCwgdGhhdCwgcHAsIHBpKTsKK30KKworc3RhdGljIHZvaWQKK2ltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X3NjYWxlXzE2X21vZChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCisgICAgaW1hZ2VfcGl4ZWwgKnRoYXQsIHBuZ19jb25zdF9zdHJ1Y3RwIHBwLAorICAgIGNvbnN0IHRyYW5zZm9ybV9kaXNwbGF5ICpkaXNwbGF5KQoreworICAgaWYgKHRoYXQtPmJpdF9kZXB0aCA9PSAxNikKKyAgIHsKKyAgICAgIHRoYXQtPnNhbXBsZV9kZXB0aCA9IHRoYXQtPmJpdF9kZXB0aCA9IDg7CisgICAgICBpZiAodGhhdC0+cmVkX3NCSVQgPiA4KSB0aGF0LT5yZWRfc0JJVCA9IDg7CisgICAgICBpZiAodGhhdC0+Z3JlZW5fc0JJVCA+IDgpIHRoYXQtPmdyZWVuX3NCSVQgPSA4OworICAgICAgaWYgKHRoYXQtPmJsdWVfc0JJVCA+IDgpIHRoYXQtPmJsdWVfc0JJVCA9IDg7CisgICAgICBpZiAodGhhdC0+YWxwaGFfc0JJVCA+IDgpIHRoYXQtPmFscGhhX3NCSVQgPSA4OworICAgfQorCisgICB0aGlzLT5uZXh0LT5tb2QodGhpcy0+bmV4dCwgdGhhdCwgcHAsIGRpc3BsYXkpOworfQorCitzdGF0aWMgaW50CitpbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9zY2FsZV8xNl9hZGQoaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAorICAgIGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqKnRoYXQsIHBuZ19ieXRlIGNvbG91cl90eXBlLCBwbmdfYnl0ZSBiaXRfZGVwdGgpCit7CisgICBVTlVTRUQoY29sb3VyX3R5cGUpCisKKyAgIHRoaXMtPm5leHQgPSAqdGhhdDsKKyAgICp0aGF0ID0gdGhpczsKKworICAgcmV0dXJuIGJpdF9kZXB0aCA+IDg7Cit9CisKK0lUKHNjYWxlXzE2KTsKKyN1bmRlZiBQVAorI2RlZmluZSBQVCBJVFNUUlVDVChzY2FsZV8xNikKKyNlbmRpZiAvKiBQTkdfUkVBRF9TQ0FMRV8xNl9UT184X1NVUFBPUlRFRCAoMS41LjQgb24pICovCisKKyNpZmRlZiBQTkdfUkVBRF8xNl9UT184X1NVUFBPUlRFRCAvKiB0aGUgZGVmYXVsdCBiZWZvcmUgMS41LjQgKi8KKy8qIHBuZ19zZXRfc3RyaXBfMTYgKi8KK3N0YXRpYyB2b2lkCitpbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9zdHJpcF8xNl9zZXQoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAorICAgIHRyYW5zZm9ybV9kaXNwbGF5ICp0aGF0LCBwbmdfc3RydWN0cCBwcCwgcG5nX2luZm9wIHBpKQoreworICAgcG5nX3NldF9zdHJpcF8xNihwcCk7CisjICBpZiBQTkdfTElCUE5HX1ZFUiA8IDEwNzAwCisgICAgICAvKiBsaWJwbmcgd2lsbCBsaW1pdCB0aGUgZ2FtbWEgdGFibGUgc2l6ZTogKi8KKyAgICAgIHRoYXQtPm1heF9nYW1tYV84ID0gUE5HX01BWF9HQU1NQV84OworIyAgZW5kaWYKKyAgIHRoaXMtPm5leHQtPnNldCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgcGkpOworfQorCitzdGF0aWMgdm9pZAoraW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfc3RyaXBfMTZfbW9kKGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKKyAgICBpbWFnZV9waXhlbCAqdGhhdCwgcG5nX2NvbnN0X3N0cnVjdHAgcHAsCisgICAgY29uc3QgdHJhbnNmb3JtX2Rpc3BsYXkgKmRpc3BsYXkpCit7CisgICBpZiAodGhhdC0+Yml0X2RlcHRoID09IDE2KQorICAgeworICAgICAgdGhhdC0+c2FtcGxlX2RlcHRoID0gdGhhdC0+Yml0X2RlcHRoID0gODsKKyAgICAgIGlmICh0aGF0LT5yZWRfc0JJVCA+IDgpIHRoYXQtPnJlZF9zQklUID0gODsKKyAgICAgIGlmICh0aGF0LT5ncmVlbl9zQklUID4gOCkgdGhhdC0+Z3JlZW5fc0JJVCA9IDg7CisgICAgICBpZiAodGhhdC0+Ymx1ZV9zQklUID4gOCkgdGhhdC0+Ymx1ZV9zQklUID0gODsKKyAgICAgIGlmICh0aGF0LT5hbHBoYV9zQklUID4gOCkgdGhhdC0+YWxwaGFfc0JJVCA9IDg7CisKKyAgICAgIC8qIFByaW9yIHRvIDEuNS40IHBuZ19zZXRfc3RyaXBfMTYgd291bGQgdXNlIGFuICdhY2N1cmF0ZScgbWV0aG9kIGlmIHRoaXMKKyAgICAgICAqIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGlzIHNldC4gIEZyb20gMS41LjQgdGhlIGZsYWcgaXMgbmV2ZXIgc2V0IGFuZCB0aGUKKyAgICAgICAqICdzY2FsZScgQVBJIChhYm92ZSkgbXVzdCBiZSB1c2VkLgorICAgICAgICovCisjICAgICBpZmRlZiBQTkdfUkVBRF9BQ0NVUkFURV9TQ0FMRV9TVVBQT1JURUQKKyMgICAgICAgIGlmIFBOR19MSUJQTkdfVkVSID49IDEwNTA0CisjICAgICAgICAgICBlcnJvciBQTkdfUkVBRF9BQ0NVUkFURV9TQ0FMRSBzaG91bGQgbm90IGJlIHNldAorIyAgICAgICAgZW5kaWYKKworICAgICAgICAgLyogVGhlIHN0cmlwIDE2IGFsZ29yaXRobSBkcm9wcyB0aGUgbG93IDggYml0cyByYXRoZXIgdGhhbiBjYWxjdWxhdGluZworICAgICAgICAgICogMS8yNTcsIHNvIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSBwZXJtaXR0ZWQgZXJyb3JzIGFwcHJvcHJpYXRlbHk6CisgICAgICAgICAgKiBOb3RpY2UgdGhhdCB0aGlzIGlzIG9ubHkgcmVsZXZhbnQgcHJpb3IgdG8gdGhlIGFkZGl0aW9uIG9mIHRoZQorICAgICAgICAgICogcG5nX3NldF9zY2FsZV8xNiBBUEkgaW4gMS41LjQgKGJ1dCAxLjUuNCsgYWx3YXlzIGRlZmluZXMgdGhlIGFib3ZlISkKKyAgICAgICAgICAqLworICAgICAgICAgeworICAgICAgICAgICAgY29uc3QgZG91YmxlIGQgPSAoMjU1LTEyOC41KS82NTUzNTsKKyAgICAgICAgICAgIHRoYXQtPnJlZGUgKz0gZDsKKyAgICAgICAgICAgIHRoYXQtPmdyZWVuZSArPSBkOworICAgICAgICAgICAgdGhhdC0+Ymx1ZWUgKz0gZDsKKyAgICAgICAgICAgIHRoYXQtPmFscGhhZSArPSBkOworICAgICAgICAgfQorIyAgICAgZW5kaWYKKyAgIH0KKworICAgdGhpcy0+bmV4dC0+bW9kKHRoaXMtPm5leHQsIHRoYXQsIHBwLCBkaXNwbGF5KTsKK30KKworc3RhdGljIGludAoraW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfc3RyaXBfMTZfYWRkKGltYWdlX3RyYW5zZm9ybSAqdGhpcywKKyAgICBjb25zdCBpbWFnZV90cmFuc2Zvcm0gKip0aGF0LCBwbmdfYnl0ZSBjb2xvdXJfdHlwZSwgcG5nX2J5dGUgYml0X2RlcHRoKQoreworICAgVU5VU0VEKGNvbG91cl90eXBlKQorCisgICB0aGlzLT5uZXh0ID0gKnRoYXQ7CisgICAqdGhhdCA9IHRoaXM7CisKKyAgIHJldHVybiBiaXRfZGVwdGggPiA4OworfQorCitJVChzdHJpcF8xNik7CisjdW5kZWYgUFQKKyNkZWZpbmUgUFQgSVRTVFJVQ1Qoc3RyaXBfMTYpCisjZW5kaWYgLyogUE5HX1JFQURfMTZfVE9fOF9TVVBQT1JURUQgKi8KKworI2lmZGVmIFBOR19SRUFEX1NUUklQX0FMUEhBX1NVUFBPUlRFRAorLyogcG5nX3NldF9zdHJpcF9hbHBoYSAqLworc3RhdGljIHZvaWQKK2ltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X3N0cmlwX2FscGhhX3NldChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCisgICAgdHJhbnNmb3JtX2Rpc3BsYXkgKnRoYXQsIHBuZ19zdHJ1Y3RwIHBwLCBwbmdfaW5mb3AgcGkpCit7CisgICBwbmdfc2V0X3N0cmlwX2FscGhhKHBwKTsKKyAgIHRoaXMtPm5leHQtPnNldCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgcGkpOworfQorCitzdGF0aWMgdm9pZAoraW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfc3RyaXBfYWxwaGFfbW9kKGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKKyAgICBpbWFnZV9waXhlbCAqdGhhdCwgcG5nX2NvbnN0X3N0cnVjdHAgcHAsCisgICAgY29uc3QgdHJhbnNmb3JtX2Rpc3BsYXkgKmRpc3BsYXkpCit7CisgICBpZiAodGhhdC0+Y29sb3VyX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkKKyAgICAgIHRoYXQtPmNvbG91cl90eXBlID0gUE5HX0NPTE9SX1RZUEVfR1JBWTsKKyAgIGVsc2UgaWYgKHRoYXQtPmNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkKKyAgICAgIHRoYXQtPmNvbG91cl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUkdCOworCisgICB0aGF0LT5oYXZlX3RSTlMgPSAwOworICAgdGhhdC0+YWxwaGFmID0gMTsKKworICAgdGhpcy0+bmV4dC0+bW9kKHRoaXMtPm5leHQsIHRoYXQsIHBwLCBkaXNwbGF5KTsKK30KKworc3RhdGljIGludAoraW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfc3RyaXBfYWxwaGFfYWRkKGltYWdlX3RyYW5zZm9ybSAqdGhpcywKKyAgICBjb25zdCBpbWFnZV90cmFuc2Zvcm0gKip0aGF0LCBwbmdfYnl0ZSBjb2xvdXJfdHlwZSwgcG5nX2J5dGUgYml0X2RlcHRoKQoreworICAgVU5VU0VEKGJpdF9kZXB0aCkKKworICAgdGhpcy0+bmV4dCA9ICp0aGF0OworICAgKnRoYXQgPSB0aGlzOworCisgICByZXR1cm4gKGNvbG91cl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpICE9IDA7Cit9CisKK0lUKHN0cmlwX2FscGhhKTsKKyN1bmRlZiBQVAorI2RlZmluZSBQVCBJVFNUUlVDVChzdHJpcF9hbHBoYSkKKyNlbmRpZiAvKiBQTkdfUkVBRF9TVFJJUF9BTFBIQV9TVVBQT1JURUQgKi8KKworI2lmZGVmIFBOR19SRUFEX1JHQl9UT19HUkFZX1NVUFBPUlRFRAorLyogcG5nX3NldF9yZ2JfdG9fZ3JheShwbmdfc3RydWN0cCwgaW50IGVycl9hY3Rpb24sIGRvdWJsZSByZWQsIGRvdWJsZSBncmVlbikKKyAqIHBuZ19zZXRfcmdiX3RvX2dyYXlfZml4ZWQocG5nX3N0cnVjdHAsIGludCBlcnJfYWN0aW9uLCBwbmdfZml4ZWRfcG9pbnQgcmVkLAorICogICAgcG5nX2ZpeGVkX3BvaW50IGdyZWVuKQorICogcG5nX2dldF9yZ2JfdG9fZ3JheV9zdGF0dXMKKyAqCisgKiBUaGUgJ2RlZmF1bHQnIHRlc3QgaGVyZSB1c2VzIHZhbHVlcyBrbm93biB0byBiZSB1c2VkIGluc2lkZSBsaWJwbmcgcHJpb3IgdG8KKyAqIDEuNy4wOgorICoKKyAqICAgcmVkOiAgICA2OTY4CisgKiAgIGdyZWVuOiAyMzQzNAorICogICBibHVlOiAgIDIzNjYKKyAqCisgKiBUaGVzZSB2YWx1ZXMgYXJlIGJlaW5nIHJldGFpbmVkIGZvciBjb21wYXRpYmlsaXR5LCBhbG9uZyB3aXRoIHRoZSBzb21ld2hhdAorICogYnJva2VuIHRydW5jYXRpb24gY2FsY3VsYXRpb24gaW4gdGhlIGZhc3QtYW5kLWluYWNjdXJhdGUgY29kZSBwYXRoLiAgT2xkZXIKKyAqIHZlcnNpb25zIG9mIGxpYnBuZyB3aWxsIGZhaWwgdGhlIGFjY3VyYWN5IHRlc3RzIGJlbG93IGJlY2F1c2UgdGhleSB1c2UgdGhlCisgKiB0cnVuY2F0aW9uIGFsZ29yaXRobSBldmVyeXdoZXJlLgorICovCisjZGVmaW5lIGRhdGEgSVREQVRBKHJnYl90b19ncmF5KQorc3RhdGljIHN0cnVjdAoreworICAgZG91YmxlIGdhbW1hOyAgICAgIC8qIEZpbGUgZ2FtbWEgdG8gdXNlIGluIHByb2Nlc3NpbmcgKi8KKworICAgLyogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHBhcmFtZXRlcnMgZm9yIHBuZ19zZXRfcmdiX3RvX2dyYXk6ICovCisjICBpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECisgICAgICBkb3VibGUgcmVkX3RvX3NldDsKKyAgICAgIGRvdWJsZSBncmVlbl90b19zZXQ7CisjICBlbHNlCisgICAgICBwbmdfZml4ZWRfcG9pbnQgcmVkX3RvX3NldDsKKyAgICAgIHBuZ19maXhlZF9wb2ludCBncmVlbl90b19zZXQ7CisjICBlbmRpZgorCisgICAvKiBUaGUgYWN0dWFsIGNvZWZmaWNpZW50czogKi8KKyAgIGRvdWJsZSByZWRfY29lZmZpY2llbnQ7CisgICBkb3VibGUgZ3JlZW5fY29lZmZpY2llbnQ7CisgICBkb3VibGUgYmx1ZV9jb2VmZmljaWVudDsKKworICAgLyogU2V0IGlmIHRoZSBjb2VlZmZpY2llbnRzIGhhdmUgYmVlbiBvdmVycmlkZGVuLiAqLworICAgaW50IGNvZWZmaWNpZW50c19vdmVycmlkZGVuOworfSBkYXRhOworCisjdW5kZWYgaW1hZ2VfdHJhbnNmb3JtX2luaQorI2RlZmluZSBpbWFnZV90cmFuc2Zvcm1faW5pIGltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X3JnYl90b19ncmF5X2luaQorc3RhdGljIHZvaWQKK2ltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X3JnYl90b19ncmF5X2luaShjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCisgICAgdHJhbnNmb3JtX2Rpc3BsYXkgKnRoYXQpCit7CisgICBwbmdfbW9kaWZpZXIgKnBtID0gdGhhdC0+cG07CisgICBjb25zdCBjb2xvcl9lbmNvZGluZyAqZSA9IHBtLT5jdXJyZW50X2VuY29kaW5nOworCisgICBVTlVTRUQodGhpcykKKworICAgLyogU2luY2Ugd2UgY2hlY2sgdGhlIGVuY29kaW5nIHRoaXMgZmxhZyBtdXN0IGJlIHNldDogKi8KKyAgIHBtLT50ZXN0X3VzZXNfZW5jb2RpbmcgPSAxOworCisgICAvKiBJZiAnZScgaXMgbm90IE5VTEwgY2hyb21hdGljaXR5IGluZm9ybWF0aW9uIGlzIHByZXNlbnQgYW5kIGVpdGhlciBhIGNIUk0KKyAgICAqIG9yIGFuIHNSR0IgY2h1bmsgd2lsbCBiZSBpbnNlcnRlZC4KKyAgICAqLworICAgaWYgKGUgIT0gMCkKKyAgIHsKKyAgICAgIC8qIENvZWZmaWNpZW50cyBjb21lIGZyb20gdGhlIGVuY29kaW5nLCBidXQgbWF5IG5lZWQgdG8gYmUgbm9ybWFsaXplZCB0byBhCisgICAgICAgKiB3aGl0ZSBwb2ludCBZIG9mIDEuMAorICAgICAgICovCisgICAgICBjb25zdCBkb3VibGUgd2hpdGVZID0gZS0+cmVkLlkgKyBlLT5ncmVlbi5ZICsgZS0+Ymx1ZS5ZOworCisgICAgICBkYXRhLnJlZF9jb2VmZmljaWVudCA9IGUtPnJlZC5ZOworICAgICAgZGF0YS5ncmVlbl9jb2VmZmljaWVudCA9IGUtPmdyZWVuLlk7CisgICAgICBkYXRhLmJsdWVfY29lZmZpY2llbnQgPSBlLT5ibHVlLlk7CisKKyAgICAgIGlmICh3aGl0ZVkgIT0gMSkKKyAgICAgIHsKKyAgICAgICAgIGRhdGEucmVkX2NvZWZmaWNpZW50IC89IHdoaXRlWTsKKyAgICAgICAgIGRhdGEuZ3JlZW5fY29lZmZpY2llbnQgLz0gd2hpdGVZOworICAgICAgICAgZGF0YS5ibHVlX2NvZWZmaWNpZW50IC89IHdoaXRlWTsKKyAgICAgIH0KKyAgIH0KKworICAgZWxzZQorICAgeworICAgICAgLyogVGhlIGRlZmF1bHQgKGJ1aWx0IGluKSBjb2VmZmNpZW50cywgYXMgYWJvdmU6ICovCisjICAgICBpZiBQTkdfTElCUE5HX1ZFUiA8IDEwNzAwCisgICAgICAgICBkYXRhLnJlZF9jb2VmZmljaWVudCA9IDY5NjggLyAzMjc2OC47CisgICAgICAgICBkYXRhLmdyZWVuX2NvZWZmaWNpZW50ID0gMjM0MzQgLyAzMjc2OC47CisgICAgICAgICBkYXRhLmJsdWVfY29lZmZpY2llbnQgPSAyMzY2IC8gMzI3NjguOworIyAgICAgZWxzZQorICAgICAgICAgZGF0YS5yZWRfY29lZmZpY2llbnQgPSAuMjEyNjsKKyAgICAgICAgIGRhdGEuZ3JlZW5fY29lZmZpY2llbnQgPSAuNzE1MjsKKyAgICAgICAgIGRhdGEuYmx1ZV9jb2VmZmljaWVudCA9IC4wNzIyOworIyAgICAgZW5kaWYKKyAgIH0KKworICAgZGF0YS5nYW1tYSA9IHBtLT5jdXJyZW50X2dhbW1hOworCisgICAvKiBJZiBub3Qgc2V0IHRoZW4gdGhlIGNhbGN1bGF0aW9ucyBhc3N1bWUgbGluZWFyIGVuY29kaW5nIChpbXBsaWNpdGx5KTogKi8KKyAgIGlmIChkYXRhLmdhbW1hID09IDApCisgICAgICBkYXRhLmdhbW1hID0gMTsKKworICAgLyogVGhlIGFyZ3VtZW50cyB0byBwbmdfc2V0X3JnYl90b19ncmF5IGNhbiBvdmVycmlkZSB0aGUgY29lZmZpY2llbnRzIGltcGxpZWQKKyAgICAqIGJ5IHRoZSBjb2xvciBzcGFjZSBlbmNvZGluZy4gIElmIGRvaW5nIGV4aGF1c3RpdmUgY2hlY2tzIGRvIHRoZSBvdmVycmlkZQorICAgICogaW4gZWFjaCBjYXNlLCBvdGhlcndpc2UgZG8gaXQgcmFuZG9tbHkuCisgICAgKi8KKyAgIGlmIChwbS0+dGVzdF9leGhhdXN0aXZlKQorICAgeworICAgICAgLyogRmlyc3QgdGltZSBpbiBjb2VmZmljaWVudHNfb3ZlcnJpZGRlbiBpcyAwLCB0aGUgZm9sbG93aW5nIHNldHMgaXQgdG8gMSwKKyAgICAgICAqIHNvIHJlcGVhdCBpZiBpdCBpcyBzZXQuICBJZiBhIHRlc3QgZmFpbHMgdGhpcyBtYXkgbWVhbiB3ZSBzdWJzZXF1ZW50bHkKKyAgICAgICAqIHNraXAgYSBub24tb3ZlcnJpZGUgdGVzdCwgaWdub3JlIHRoYXQuCisgICAgICAgKi8KKyAgICAgIGRhdGEuY29lZmZpY2llbnRzX292ZXJyaWRkZW4gPSAhZGF0YS5jb2VmZmljaWVudHNfb3ZlcnJpZGRlbjsKKyAgICAgIHBtLT5yZXBlYXQgPSBkYXRhLmNvZWZmaWNpZW50c19vdmVycmlkZGVuICE9IDA7CisgICB9CisKKyAgIGVsc2UKKyAgICAgIGRhdGEuY29lZmZpY2llbnRzX292ZXJyaWRkZW4gPSByYW5kb21fY2hvaWNlKCk7CisKKyAgIGlmIChkYXRhLmNvZWZmaWNpZW50c19vdmVycmlkZGVuKQorICAgeworICAgICAgLyogVGhlc2UgdmFsdWVzIG92ZXJyaWRlIHRoZSBjb2xvciBlbmNvZGluZyBkZWZhdWx0cywgc2ltcGx5IHVzZSByYW5kb20KKyAgICAgICAqIG51bWJlcnMuCisgICAgICAgKi8KKyAgICAgIHBuZ191aW50XzMyIHJ1OworICAgICAgZG91YmxlIHRvdGFsOworCisgICAgICBSQU5ET01JWkUocnUpOworICAgICAgZGF0YS5ncmVlbl9jb2VmZmljaWVudCA9IHRvdGFsID0gKHJ1ICYgMHhmZmZmKSAvIDY1NTM1LjsKKyAgICAgIHJ1ID4+PSAxNjsKKyAgICAgIGRhdGEucmVkX2NvZWZmaWNpZW50ID0gKDEgLSB0b3RhbCkgKiAocnUgJiAweGZmZmYpIC8gNjU1MzUuOworICAgICAgdG90YWwgKz0gZGF0YS5yZWRfY29lZmZpY2llbnQ7CisgICAgICBkYXRhLmJsdWVfY29lZmZpY2llbnQgPSAxIC0gdG90YWw7CisKKyMgICAgIGlmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKKyAgICAgICAgIGRhdGEucmVkX3RvX3NldCA9IGRhdGEucmVkX2NvZWZmaWNpZW50OworICAgICAgICAgZGF0YS5ncmVlbl90b19zZXQgPSBkYXRhLmdyZWVuX2NvZWZmaWNpZW50OworIyAgICAgZWxzZQorICAgICAgICAgZGF0YS5yZWRfdG9fc2V0ID0gZml4KGRhdGEucmVkX2NvZWZmaWNpZW50KTsKKyAgICAgICAgIGRhdGEuZ3JlZW5fdG9fc2V0ID0gZml4KGRhdGEuZ3JlZW5fY29lZmZpY2llbnQpOworIyAgICAgZW5kaWYKKworICAgICAgLyogVGhlIGZvbGxvd2luZyBqdXN0IGNoYW5nZXMgdGhlIGVycm9yIG1lc3NhZ2VzOiAqLworICAgICAgcG0tPmVuY29kaW5nX2lnbm9yZWQgPSAxOworICAgfQorCisgICBlbHNlCisgICB7CisgICAgICBkYXRhLnJlZF90b19zZXQgPSAtMTsKKyAgICAgIGRhdGEuZ3JlZW5fdG9fc2V0ID0gLTE7CisgICB9CisKKyAgIC8qIEFkanVzdCB0aGUgZXJyb3IgbGltaXQgaW4gdGhlIHBuZ19tb2RpZmllciBiZWNhdXNlIG9mIHRoZSBsYXJnZXIgZXJyb3JzCisgICAgKiBwcm9kdWNlZCBpbiB0aGUgZGlnaXRpemF0aW9uIGR1cmluZyB0aGUgZ2FtbWEgaGFuZGxpbmcuCisgICAgKi8KKyAgIGlmIChkYXRhLmdhbW1hICE9IDEpIC8qIFVzZSBnYW1tYSB0YWJsZXMgKi8KKyAgIHsKKyAgICAgIGlmICh0aGF0LT50aGlzLmJpdF9kZXB0aCA9PSAxNiB8fCBwbS0+YXNzdW1lXzE2X2JpdF9jYWxjdWxhdGlvbnMpCisgICAgICB7CisgICAgICAgICAvKiBUaGUgY29tcHV0YXRpb25zIGhhdmUgdGhlIGZvcm06CisgICAgICAgICAgKgorICAgICAgICAgICogICAgciAqIHJjICsgZyAqIGdjICsgYiAqIGJjCisgICAgICAgICAgKgorICAgICAgICAgICogIEVhY2ggY29tcG9uZW50IG9mIHdoaWNoIGlzICsvLTEvNjU1MzUgZnJvbSB0aGUgZ2FtbWFfdG9fMSB0YWJsZQorICAgICAgICAgICogIGxvb2t1cCwgcmVzdWx0aW5nIGluIGEgYmFzZSBlcnJvciBvZiArLy02LiAgVGhlIGdhbW1hX2Zyb21fMQorICAgICAgICAgICogIGNvbnZlcnNpb24gYWRkcyBhbm90aGVyICsvLTIgaW4gdGhlIDE2LWJpdCBjYXNlIGFuZAorICAgICAgICAgICogICsvLSgxPDwoMTUtUE5HX01BWF9HQU1NQV84KSkgaW4gdGhlIDgtYml0IGNhc2UuCisgICAgICAgICAgKi8KKyMgICAgICAgIGlmIFBOR19MSUJQTkdfVkVSIDwgMTA3MDAKKyAgICAgICAgICAgIGlmICh0aGF0LT50aGlzLmJpdF9kZXB0aCA8IDE2KQorICAgICAgICAgICAgICAgdGhhdC0+bWF4X2dhbW1hXzggPSBQTkdfTUFYX0dBTU1BXzg7CisjICAgICAgICBlbmRpZgorICAgICAgICAgdGhhdC0+cG0tPmxpbWl0ICs9IHBvdygKKyAgICAgICAgICAgICh0aGF0LT50aGlzLmJpdF9kZXB0aCA9PSAxNiB8fCB0aGF0LT5tYXhfZ2FtbWFfOCA+IDE0ID8KKyAgICAgICAgICAgICAgIDguIDoKKyAgICAgICAgICAgICAgIDYuICsgKDE8PCgxNS10aGF0LT5tYXhfZ2FtbWFfOCkpCisgICAgICAgICAgICApLzY1NTM1LCBkYXRhLmdhbW1hKTsKKyAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgLyogUm91bmRpbmcgdG8gOCBiaXRzIGluIHRoZSBsaW5lYXIgc3BhY2UgY2F1c2VzIG1hc3NpdmUgZXJyb3JzIHdoaWNoCisgICAgICAgICAgKiB3aWxsIHRyaWdnZXIgdGhlIGVycm9yIGNoZWNrIGluIHRyYW5zZm9ybV9yYW5nZV9jaGVjay4gIEZpeCB0aGF0CisgICAgICAgICAgKiBoZXJlIGJ5IHRha2luZyB0aGUgZ2FtbWEgZW5jb2RpbmcgaW50byBhY2NvdW50LgorICAgICAgICAgICoKKyAgICAgICAgICAqIFdoZW4gRElHSVRJWkUgaXMgc2V0IGJlY2F1c2UgYSBwcmUtMS43IHZlcnNpb24gb2YgbGlicG5nIGlzIGJlaW5nCisgICAgICAgICAgKiB0ZXN0ZWQgYWxsb3cgYSBiaWdnZXIgc2xhY2suCisgICAgICAgICAgKgorICAgICAgICAgICogTk9URTogdGhpcyBtYWdpYyBudW1iZXIgd2FzIGRldGVybWluZWQgYnkgZXhwZXJpbWVudCB0byBiZSBhYm91dAorICAgICAgICAgICogMS4yNjMuICBUaGVyZSdzIG5vIGdyZWF0IG1lcml0IHRvIHRoZSB2YWx1ZSBiZWxvdywgaG93ZXZlciBpdCBvbmx5CisgICAgICAgICAgKiBhZmZlY3RzIHRoZSBsaW1pdCB1c2VkIGZvciBjaGVja2luZyBmb3IgaW50ZXJuYWwgY2FsY3VsYXRpb24gZXJyb3JzLAorICAgICAgICAgICogbm90IHRoZSBhY3R1YWwgbGltaXQgaW1wb3NlZCBieSBwbmd2YWxpZCBvbiB0aGUgb3V0cHV0IGVycm9ycy4KKyAgICAgICAgICAqLworICAgICAgICAgdGhhdC0+cG0tPmxpbWl0ICs9IHBvdygKKyMgICAgICAgIGlmIERJR0lUSVpFCisgICAgICAgICAgICAxLjMKKyMgICAgICAgIGVsc2UKKyAgICAgICAgICAgIDEuMAorIyAgICAgICAgZW5kaWYKKyAgICAgICAgICAgIC8yNTUsIGRhdGEuZ2FtbWEpOworICAgICAgfQorICAgfQorCisgICBlbHNlCisgICB7CisgICAgICAvKiBXaXRoIG5vIGdhbW1hIGNvcnJlY3Rpb24gYSBsYXJnZSBlcnJvciBjb21lcyBmcm9tIHRoZSB0cnVuY2F0aW9uIG9mIHRoZQorICAgICAgICogY2FsY3VsYXRpb24gaW4gdGhlIDggYml0IGNhc2UsIGFsbG93IGZvciB0aGF0IGhlcmUuCisgICAgICAgKi8KKyAgICAgIGlmICh0aGF0LT50aGlzLmJpdF9kZXB0aCAhPSAxNiAmJiAhcG0tPmFzc3VtZV8xNl9iaXRfY2FsY3VsYXRpb25zKQorICAgICAgICAgdGhhdC0+cG0tPmxpbWl0ICs9IDRFLTM7CisgICB9Cit9CisKK3N0YXRpYyB2b2lkCitpbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9yZ2JfdG9fZ3JheV9zZXQoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAorICAgIHRyYW5zZm9ybV9kaXNwbGF5ICp0aGF0LCBwbmdfc3RydWN0cCBwcCwgcG5nX2luZm9wIHBpKQoreworICAgY29uc3QgaW50IGVycm9yX2FjdGlvbiA9IDE7IC8qIG5vIGVycm9yLCBubyBkZWZpbmVzIGluIHBuZy5oICovCisKKyMgIGlmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKKyAgICAgIHBuZ19zZXRfcmdiX3RvX2dyYXkocHAsIGVycm9yX2FjdGlvbiwgZGF0YS5yZWRfdG9fc2V0LCBkYXRhLmdyZWVuX3RvX3NldCk7CisjICBlbHNlCisgICAgICBwbmdfc2V0X3JnYl90b19ncmF5X2ZpeGVkKHBwLCBlcnJvcl9hY3Rpb24sIGRhdGEucmVkX3RvX3NldCwKKyAgICAgICAgIGRhdGEuZ3JlZW5fdG9fc2V0KTsKKyMgIGVuZGlmCisKKyMgIGlmZGVmIFBOR19SRUFEX2NIUk1fU1VQUE9SVEVECisgICAgICBpZiAodGhhdC0+cG0tPmN1cnJlbnRfZW5jb2RpbmcgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgIC8qIFdlIGhhdmUgYW4gZW5jb2Rpbmcgc28gYSBjSFJNIGNodW5rIG1heSBoYXZlIGJlZW4gc2V0OyBpZiBzbyB0aGVuCisgICAgICAgICAgKiBjaGVjayB0aGF0IHRoZSBsaWJwbmcgQVBJcyBnaXZlIHRoZSBjb3JyZWN0IChYLFksWikgdmFsdWVzIHdpdGhpbgorICAgICAgICAgICogc29tZSBtYXJnaW4gb2YgZXJyb3IgZm9yIHRoZSByb3VuZCB0cmlwIHRocm91Z2ggdGhlIGNocm9tYXRpY2l0eQorICAgICAgICAgICogZm9ybS4KKyAgICAgICAgICAqLworIyAgICAgICAgaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorIyAgICAgICAgICAgZGVmaW5lIEFQSV9mdW5jdGlvbiBwbmdfZ2V0X2NIUk1fWFlaCisjICAgICAgICAgICBkZWZpbmUgQVBJX2Zvcm0gIkZQIgorIyAgICAgICAgICAgZGVmaW5lIEFQSV90eXBlIGRvdWJsZQorIyAgICAgICAgICAgZGVmaW5lIEFQSV9jdnQoeCkgKHgpCisjICAgICAgICBlbHNlCisjICAgICAgICAgICBkZWZpbmUgQVBJX2Z1bmN0aW9uIHBuZ19nZXRfY0hSTV9YWVpfZml4ZWQKKyMgICAgICAgICAgIGRlZmluZSBBUElfZm9ybSAiZml4ZWQiCisjICAgICAgICAgICBkZWZpbmUgQVBJX3R5cGUgcG5nX2ZpeGVkX3BvaW50CisjICAgICAgICAgICBkZWZpbmUgQVBJX2N2dCh4KSAoKGRvdWJsZSkoeCkvUE5HX0ZQXzEpCisjICAgICAgICBlbmRpZgorCisgICAgICAgICBBUElfdHlwZSByWCwgZ1gsIGJYOworICAgICAgICAgQVBJX3R5cGUgclksIGdZLCBiWTsKKyAgICAgICAgIEFQSV90eXBlIHJaLCBnWiwgYlo7CisKKyAgICAgICAgIGlmICgoQVBJX2Z1bmN0aW9uKHBwLCBwaSwgJnJYLCAmclksICZyWiwgJmdYLCAmZ1ksICZnWiwgJmJYLCAmYlksICZiWikKKyAgICAgICAgICAgICAgICYgUE5HX0lORk9fY0hSTSkgIT0gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBtYXhlOworICAgICAgICAgICAgY29uc3QgY2hhciAqZWw7CisgICAgICAgICAgICBjb2xvcl9lbmNvZGluZyBlLCBvOworCisgICAgICAgICAgICAvKiBFeHBlY3QgbGlicG5nIHRvIHJldHVybiBhIG5vcm1hbGl6ZWQgcmVzdWx0LCBidXQgdGhlIG9yaWdpbmFsCisgICAgICAgICAgICAgKiBjb2xvciBzcGFjZSBlbmNvZGluZyBtYXkgbm90IGJlIG5vcm1hbGl6ZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1vZGlmaWVyX2N1cnJlbnRfZW5jb2RpbmcodGhhdC0+cG0sICZvKTsKKyAgICAgICAgICAgIG5vcm1hbGl6ZV9jb2xvcl9lbmNvZGluZygmbyk7CisKKyAgICAgICAgICAgIC8qIFNhbml0eSBjaGVjayB0aGUgcG5ndmFsaWQgY29kZSAtIHRoZSBjb2VmZmljaWVudHMgc2hvdWxkIG1hdGNoCisgICAgICAgICAgICAgKiB0aGUgbm9ybWFsaXplZCBZIHZhbHVlcyBvZiB0aGUgZW5jb2RpbmcgdW5sZXNzIHRoZXkgd2VyZQorICAgICAgICAgICAgICogb3ZlcnJpZGRlbi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKGRhdGEucmVkX3RvX3NldCA9PSAtMSAmJiBkYXRhLmdyZWVuX3RvX3NldCA9PSAtMSAmJgorICAgICAgICAgICAgICAgKGZhYnMoby5yZWQuWSAtIGRhdGEucmVkX2NvZWZmaWNpZW50KSA+IERCTF9FUFNJTE9OIHx8CisgICAgICAgICAgICAgICBmYWJzKG8uZ3JlZW4uWSAtIGRhdGEuZ3JlZW5fY29lZmZpY2llbnQpID4gREJMX0VQU0lMT04gfHwKKyAgICAgICAgICAgICAgIGZhYnMoby5ibHVlLlkgLSBkYXRhLmJsdWVfY29lZmZpY2llbnQpID4gREJMX0VQU0lMT04pKQorICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBwLCAiaW50ZXJuYWwgcG5ndmFsaWQgY0hSTSBjb2VmZmljaWVudCBlcnJvciIpOworCisgICAgICAgICAgICAvKiBHZW5lcmF0ZSBhIGNvbG91ciBzcGFjZSBlbmNvZGluZy4gKi8KKyAgICAgICAgICAgIGUuZ2FtbWEgPSBvLmdhbW1hOyAvKiBub3QgdXNlZCAqLworICAgICAgICAgICAgZS5yZWQuWCA9IEFQSV9jdnQoclgpOworICAgICAgICAgICAgZS5yZWQuWSA9IEFQSV9jdnQoclkpOworICAgICAgICAgICAgZS5yZWQuWiA9IEFQSV9jdnQoclopOworICAgICAgICAgICAgZS5ncmVlbi5YID0gQVBJX2N2dChnWCk7CisgICAgICAgICAgICBlLmdyZWVuLlkgPSBBUElfY3Z0KGdZKTsKKyAgICAgICAgICAgIGUuZ3JlZW4uWiA9IEFQSV9jdnQoZ1opOworICAgICAgICAgICAgZS5ibHVlLlggPSBBUElfY3Z0KGJYKTsKKyAgICAgICAgICAgIGUuYmx1ZS5ZID0gQVBJX2N2dChiWSk7CisgICAgICAgICAgICBlLmJsdWUuWiA9IEFQSV9jdnQoYlopOworCisgICAgICAgICAgICAvKiBUaGlzIHNob3VsZCBtYXRjaCB0aGUgb3JpZ2luYWwgb25lIGZyb20gdGhlIHBuZ19tb2RpZmllciwgd2l0aGluCisgICAgICAgICAgICAgKiB0aGUgcmFuZ2UgcGVybWl0dGVkIGJ5IHRoZSBsaWJwbmcgZml4ZWQgcG9pbnQgcmVwcmVzZW50YXRpb24uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1heGUgPSAwOworICAgICAgICAgICAgZWwgPSAiLSI7IC8qIFNldCB0byBlbGVtZW50IG5hbWUgd2l0aCBlcnJvciAqLworCisjICAgICAgICAgICBkZWZpbmUgQ0hFQ0soY29sLHgpXAorICAgICAgICAgICAge1wKKyAgICAgICAgICAgICAgIGRvdWJsZSBlcnIgPSBmYWJzKG8uY29sLnggLSBlLmNvbC54KTtcCisgICAgICAgICAgICAgICBpZiAoZXJyID4gbWF4ZSlcCisgICAgICAgICAgICAgICB7XAorICAgICAgICAgICAgICAgICAgbWF4ZSA9IGVycjtcCisgICAgICAgICAgICAgICAgICBlbCA9ICNjb2wgIigiICN4ICIpIjtcCisgICAgICAgICAgICAgICB9XAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDSyhyZWQsWCkKKyAgICAgICAgICAgIENIRUNLKHJlZCxZKQorICAgICAgICAgICAgQ0hFQ0socmVkLFopCisgICAgICAgICAgICBDSEVDSyhncmVlbixYKQorICAgICAgICAgICAgQ0hFQ0soZ3JlZW4sWSkKKyAgICAgICAgICAgIENIRUNLKGdyZWVuLFopCisgICAgICAgICAgICBDSEVDSyhibHVlLFgpCisgICAgICAgICAgICBDSEVDSyhibHVlLFkpCisgICAgICAgICAgICBDSEVDSyhibHVlLFopCisKKyAgICAgICAgICAgIC8qIEhlcmUgaW4gYm90aCBmaXhlZCBhbmQgZmxvYXRpbmcgY2FzZXMgdG8gY2hlY2sgdGhlIHZhbHVlcyByZWFkCisgICAgICAgICAgICAgKiBmcm9tIHRoZSBjSFJtIGNodW5rLiAgUE5HIHVzZXMgZml4ZWQgcG9pbnQgaW4gdGhlIGNIUk0gY2h1bmssIHNvCisgICAgICAgICAgICAgKiB3ZSBjYW4ndCBleHBlY3QgYmV0dGVyIHRoYW4gKy8tLjVFLTUgb24gdGhlIHJlc3VsdCwgYWxsb3cgMUUtNS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKG1heGUgPj0gMUUtNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNpemVfdCBwb3MgPSAwOworICAgICAgICAgICAgICAgY2hhciBidWZmZXJbMjU2XTsKKworICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIHNpemVvZiBidWZmZXIsIHBvcywgQVBJX2Zvcm0pOworICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIHNpemVvZiBidWZmZXIsIHBvcywgIiBjSFJNICIpOworICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIHNpemVvZiBidWZmZXIsIHBvcywgZWwpOworICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIHNpemVvZiBidWZmZXIsIHBvcywgIiBlcnJvcjogIik7CisgICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0ZChidWZmZXIsIHNpemVvZiBidWZmZXIsIHBvcywgbWF4ZSwgNyk7CisgICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgcG9zLCAiICIpOworICAgICAgICAgICAgICAgLyogUHJpbnQgdGhlIGNvbG9yIHNwYWNlIHdpdGhvdXQgdGhlIGdhbW1hIHZhbHVlOiAqLworICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdF9jb2xvcl9lbmNvZGluZyhidWZmZXIsIHNpemVvZiBidWZmZXIsIHBvcywgJm8sIDApOworICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIHNpemVvZiBidWZmZXIsIHBvcywgIiAtPiAiKTsKKyAgICAgICAgICAgICAgIHBvcyA9IHNhZmVjYXRfY29sb3JfZW5jb2RpbmcoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCBwb3MsICZlLCAwKTsKKworICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBwLCBidWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorIyAgZW5kaWYgLyogUkVBRF9jSFJNICovCisKKyAgIHRoaXMtPm5leHQtPnNldCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgcGkpOworfQorCitzdGF0aWMgdm9pZAoraW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfcmdiX3RvX2dyYXlfbW9kKGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKKyAgICBpbWFnZV9waXhlbCAqdGhhdCwgcG5nX2NvbnN0X3N0cnVjdHAgcHAsCisgICAgY29uc3QgdHJhbnNmb3JtX2Rpc3BsYXkgKmRpc3BsYXkpCit7CisgICBpZiAoKHRoYXQtPmNvbG91cl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpICE9IDApCisgICB7CisgICAgICBkb3VibGUgZ3JheSwgZXJyOworCisjICAgICBpZiBQTkdfTElCUE5HX1ZFUiA8IDEwNzAwCisgICAgICAgICBpZiAodGhhdC0+Y29sb3VyX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgICAgICAgICAgIGltYWdlX3BpeGVsX2NvbnZlcnRfUExURSh0aGF0KTsKKyMgICAgIGVuZGlmCisKKyAgICAgIC8qIEltYWdlIG5vdyBoYXMgUkdCIGNoYW5uZWxzLi4uICovCisjICBpZiBESUdJVElaRQorICAgICAgeworICAgICAgICAgY29uc3QgcG5nX21vZGlmaWVyICpwbSA9IGRpc3BsYXktPnBtOworICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IHNhbXBsZV9kZXB0aCA9IHRoYXQtPnNhbXBsZV9kZXB0aDsKKyAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBjYWxjX2RlcHRoID0gKHBtLT5hc3N1bWVfMTZfYml0X2NhbGN1bGF0aW9ucyA/IDE2IDoKKyAgICAgICAgICAgIHNhbXBsZV9kZXB0aCk7CisgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgZ2FtbWFfZGVwdGggPQorICAgICAgICAgICAgKHNhbXBsZV9kZXB0aCA9PSAxNiA/CisgICAgICAgICAgICAgICBkaXNwbGF5LT5tYXhfZ2FtbWFfOCA6CisgICAgICAgICAgICAgICAocG0tPmFzc3VtZV8xNl9iaXRfY2FsY3VsYXRpb25zID8KKyAgICAgICAgICAgICAgICAgIGRpc3BsYXktPm1heF9nYW1tYV84IDoKKyAgICAgICAgICAgICAgICAgIHNhbXBsZV9kZXB0aCkpOworICAgICAgICAgaW50IGlzZ3JheTsKKyAgICAgICAgIGRvdWJsZSByLCBnLCBiOworICAgICAgICAgZG91YmxlIHJsbywgcmhpLCBnbG8sIGdoaSwgYmxvLCBiaGksIGdyYXlsbywgZ3JheWhpOworCisgICAgICAgICAvKiBEbyB0aGlzIHVzaW5nIGludGVydmFsIGFyaXRobWV0aWMsIG90aGVyd2lzZSBpdCBpcyB0b28gZGlmZmljdWx0IHRvCisgICAgICAgICAgKiBoYW5kbGUgdGhlIGVycm9ycyBjb3JyZWN0bHkuCisgICAgICAgICAgKgorICAgICAgICAgICogVG8gaGFuZGxlIHRoZSBnYW1tYSBjb3JyZWN0aW9uIHdvcmsgb3V0IHRoZSB1cHBlciBhbmQgbG93ZXIgYm91bmRzCisgICAgICAgICAgKiBvZiB0aGUgZGlnaXRpemVkIHZhbHVlLiAgQXNzdW1lIHJvdW5kaW5nIGhlcmUgLSBub3JtYWxseSB0aGUgdmFsdWVzCisgICAgICAgICAgKiB3aWxsIGJlIGlkZW50aWNhbCBhZnRlciB0aGlzIG9wZXJhdGlvbiBpZiB0aGVyZSBpcyBvbmx5IG9uZQorICAgICAgICAgICogdHJhbnNmb3JtLCBmZWVsIGZyZWUgdG8gZGVsZXRlIHRoZSBwbmdfZXJyb3IgY2hlY2tzIG9uIHRoaXMgYmVsb3cgaW4KKyAgICAgICAgICAqIHRoZSBmdXR1cmUgKHRoaXMgaXMganVzdCBtZSB0cnlpbmcgdG8gZW5zdXJlIGl0IHdvcmtzISkKKyAgICAgICAgICAqCisgICAgICAgICAgKiBJbnRlcnZhbCBhcml0aG1ldGljIGlzIGV4YWN0LCBidXQgdG8gaW1wbGVtZW50IGl0IGl0IG11c3QgYmUKKyAgICAgICAgICAqIHBvc3NpYmxlIHRvIGNvbnRyb2wgdGhlIGZsb2F0aW5nIHBvaW50IGltcGxlbWVudGF0aW9uIHJvdW5kaW5nIG1vZGUuCisgICAgICAgICAgKiBUaGlzIGNhbm5vdCBiZSBkb25lIGluIEFOU0ktQywgc28gaW5zdGVhZCBJIHJlZHVjZSB0aGUgJ2xvJyB2YWx1ZXMKKyAgICAgICAgICAqIGJ5IERCTF9FUFNJTE9OIGFuZCBpbmNyZWFzZSB0aGUgJ2hpJyB2YWx1ZXMgYnkgdGhlIHNhbWUuCisgICAgICAgICAgKi8KKyMgICAgICAgIGRlZmluZSBERCh2LGQscikgKGRpZ2l0aXplKHYqKDEtREJMX0VQU0lMT04pLCBkLCByKSAqICgxLURCTF9FUFNJTE9OKSkKKyMgICAgICAgIGRlZmluZSBEVSh2LGQscikgKGRpZ2l0aXplKHYqKDErREJMX0VQU0lMT04pLCBkLCByKSAqICgxK0RCTF9FUFNJTE9OKSkKKworICAgICAgICAgciA9IHJsbyA9IHJoaSA9IHRoYXQtPnJlZGY7CisgICAgICAgICBybG8gLT0gdGhhdC0+cmVkZTsKKyAgICAgICAgIHJsbyA9IEREKHJsbywgY2FsY19kZXB0aCwgMS8qcm91bmQqLyk7CisgICAgICAgICByaGkgKz0gdGhhdC0+cmVkZTsKKyAgICAgICAgIHJoaSA9IERVKHJoaSwgY2FsY19kZXB0aCwgMS8qcm91bmQqLyk7CisKKyAgICAgICAgIGcgPSBnbG8gPSBnaGkgPSB0aGF0LT5ncmVlbmY7CisgICAgICAgICBnbG8gLT0gdGhhdC0+Z3JlZW5lOworICAgICAgICAgZ2xvID0gREQoZ2xvLCBjYWxjX2RlcHRoLCAxLypyb3VuZCovKTsKKyAgICAgICAgIGdoaSArPSB0aGF0LT5ncmVlbmU7CisgICAgICAgICBnaGkgPSBEVShnaGksIGNhbGNfZGVwdGgsIDEvKnJvdW5kKi8pOworCisgICAgICAgICBiID0gYmxvID0gYmhpID0gdGhhdC0+Ymx1ZWY7CisgICAgICAgICBibG8gLT0gdGhhdC0+Ymx1ZWU7CisgICAgICAgICBibG8gPSBERChibG8sIGNhbGNfZGVwdGgsIDEvKnJvdW5kKi8pOworICAgICAgICAgYmhpICs9IHRoYXQtPmJsdWVlOworICAgICAgICAgYmhpID0gRFUoYmhpLCBjYWxjX2RlcHRoLCAxLypyb3VuZCovKTsKKworICAgICAgICAgaXNncmF5ID0gcj09ZyAmJiBnPT1iOworCisgICAgICAgICBpZiAoZGF0YS5nYW1tYSAhPSAxKQorICAgICAgICAgeworICAgICAgICAgICAgY29uc3QgZG91YmxlIHBvd2VyID0gMS9kYXRhLmdhbW1hOworICAgICAgICAgICAgY29uc3QgZG91YmxlIGFic2UgPSAuNS8oc2FtcGxlX2RlcHRoID09IDE2ID8gNjU1MzUgOiAyNTUpOworCisgICAgICAgICAgICAvKiBJZiBhIGdhbW1hIGNhbGN1bGF0aW9uIGlzIGRvbmUgaXQgaXMgZG9uZSB1c2luZyBsb29rdXAgdGFibGVzIG9mCisgICAgICAgICAgICAgKiBwcmVjaXNpb24gZ2FtbWFfZGVwdGgsIHNvIHRoZSBhbHJlYWR5IGRpZ2l0aXplZCB2YWx1ZSBhYm92ZSBtYXkKKyAgICAgICAgICAgICAqIG5lZWQgdG8gYmUgZnVydGhlciBkaWdpdGl6ZWQgaGVyZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKGdhbW1hX2RlcHRoICE9IGNhbGNfZGVwdGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBybG8gPSBERChybG8sIGdhbW1hX2RlcHRoLCAwLyp0cnVuY2F0ZSovKTsKKyAgICAgICAgICAgICAgIHJoaSA9IERVKHJoaSwgZ2FtbWFfZGVwdGgsIDAvKnRydW5jYXRlKi8pOworICAgICAgICAgICAgICAgZ2xvID0gREQoZ2xvLCBnYW1tYV9kZXB0aCwgMC8qdHJ1bmNhdGUqLyk7CisgICAgICAgICAgICAgICBnaGkgPSBEVShnaGksIGdhbW1hX2RlcHRoLCAwLyp0cnVuY2F0ZSovKTsKKyAgICAgICAgICAgICAgIGJsbyA9IEREKGJsbywgZ2FtbWFfZGVwdGgsIDAvKnRydW5jYXRlKi8pOworICAgICAgICAgICAgICAgYmhpID0gRFUoYmhpLCBnYW1tYV9kZXB0aCwgMC8qdHJ1bmNhdGUqLyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qICdhYnNlJyBpcyB0aGUgZXJyb3IgaW4gdGhlIGdhbW1hIHRhYmxlIGNhbGN1bGF0aW9uIGl0c2VsZi4gKi8KKyAgICAgICAgICAgIHIgPSBwb3cociwgcG93ZXIpOworICAgICAgICAgICAgcmxvID0gREQocG93KHJsbywgcG93ZXIpLWFic2UsIGNhbGNfZGVwdGgsIDEpOworICAgICAgICAgICAgcmhpID0gRFUocG93KHJoaSwgcG93ZXIpK2Fic2UsIGNhbGNfZGVwdGgsIDEpOworCisgICAgICAgICAgICBnID0gcG93KGcsIHBvd2VyKTsKKyAgICAgICAgICAgIGdsbyA9IEREKHBvdyhnbG8sIHBvd2VyKS1hYnNlLCBjYWxjX2RlcHRoLCAxKTsKKyAgICAgICAgICAgIGdoaSA9IERVKHBvdyhnaGksIHBvd2VyKSthYnNlLCBjYWxjX2RlcHRoLCAxKTsKKworICAgICAgICAgICAgYiA9IHBvdyhiLCBwb3dlcik7CisgICAgICAgICAgICBibG8gPSBERChwb3coYmxvLCBwb3dlciktYWJzZSwgY2FsY19kZXB0aCwgMSk7CisgICAgICAgICAgICBiaGkgPSBEVShwb3coYmhpLCBwb3dlcikrYWJzZSwgY2FsY19kZXB0aCwgMSk7CisgICAgICAgICB9CisKKyAgICAgICAgIC8qIE5vdyBjYWxjdWxhdGUgdGhlIGFjdHVhbCBncmF5IHZhbHVlcy4gIEFsdGhvdWdoIHRoZSBlcnJvciBpbiB0aGUKKyAgICAgICAgICAqIGNvZWZmaWNpZW50cyBkZXBlbmRzIG9uIHdoZXRoZXIgdGhleSB3ZXJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZAorICAgICAgICAgICogbGluZSAoaW4gd2hpY2ggY2FzZSB0cnVuY2F0aW9uIHRvIDE1IGJpdHMgaGFwcGVuZWQpIG9yIG5vdCAocm91bmRpbmcKKyAgICAgICAgICAqIHdhcyB1c2VkKSB0aGUgbWF4aXVtIGVycm9yIGluIGFuIGluZGl2aWR1YWwgY29lZmZpY2llbnQgaXMgYWx3YXlzCisgICAgICAgICAgKiAyLzMyNzY4LCBiZWNhdXNlIGV2ZW4gaW4gdGhlIHJvdW5kaW5nIGNhc2UgdGhlIHJlcXVpcmVtZW50IHRoYXQKKyAgICAgICAgICAqIGNvZWZmaWNpZW50cyBhZGQgdXAgdG8gMzI3NjggY2FuIGNhdXNlIGEgbGFyZ2VyIHJvdW5kaW5nIGVycm9yLgorICAgICAgICAgICoKKyAgICAgICAgICAqIFRoZSBvbmx5IHRpbWUgd2hlbiByb3VuZGluZyBkb2Vzbid0IG9jY3VyIGluIDEuNS41IGFuZCBsYXRlciBpcyB3aGVuCisgICAgICAgICAgKiB0aGUgbm9uLWdhbW1hIGNvZGUgcGF0aCBpcyB1c2VkIGZvciBsZXNzIHRoYW4gMTYgYml0IGRhdGEuCisgICAgICAgICAgKi8KKyAgICAgICAgIGdyYXkgPSByICogZGF0YS5yZWRfY29lZmZpY2llbnQgKyBnICogZGF0YS5ncmVlbl9jb2VmZmljaWVudCArCisgICAgICAgICAgICBiICogZGF0YS5ibHVlX2NvZWZmaWNpZW50OworCisgICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBpbnQgZG9fcm91bmQgPSBkYXRhLmdhbW1hICE9IDEgfHwgY2FsY19kZXB0aCA9PSAxNjsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBjZSA9IDIuIC8gMzI3Njg7CisKKyAgICAgICAgICAgIGdyYXlsbyA9IEREKHJsbyAqIChkYXRhLnJlZF9jb2VmZmljaWVudC1jZSkgKworICAgICAgICAgICAgICAgZ2xvICogKGRhdGEuZ3JlZW5fY29lZmZpY2llbnQtY2UpICsKKyAgICAgICAgICAgICAgIGJsbyAqIChkYXRhLmJsdWVfY29lZmZpY2llbnQtY2UpLCBjYWxjX2RlcHRoLCBkb19yb3VuZCk7CisgICAgICAgICAgICBpZiAoZ3JheWxvID4gZ3JheSkgLyogYWx3YXlzIGFjY2VwdCB0aGUgcmlnaHQgYW5zd2VyICovCisgICAgICAgICAgICAgICBncmF5bG8gPSBncmF5OworCisgICAgICAgICAgICBncmF5aGkgPSBEVShyaGkgKiAoZGF0YS5yZWRfY29lZmZpY2llbnQrY2UpICsKKyAgICAgICAgICAgICAgIGdoaSAqIChkYXRhLmdyZWVuX2NvZWZmaWNpZW50K2NlKSArCisgICAgICAgICAgICAgICBiaGkgKiAoZGF0YS5ibHVlX2NvZWZmaWNpZW50K2NlKSwgY2FsY19kZXB0aCwgZG9fcm91bmQpOworICAgICAgICAgICAgaWYgKGdyYXloaSA8IGdyYXkpCisgICAgICAgICAgICAgICBncmF5aGkgPSBncmF5OworICAgICAgICAgfQorCisgICAgICAgICAvKiBBbmQgaW52ZXJ0IHRoZSBnYW1tYS4gKi8KKyAgICAgICAgIGlmIChkYXRhLmdhbW1hICE9IDEpCisgICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgcG93ZXIgPSBkYXRhLmdhbW1hOworCisgICAgICAgICAgICAvKiBBbmQgdGhpcyBoYXBwZW5zIHlldCBhZ2Fpbiwgc2hpZnRpbmcgdGhlIHZhbHVlcyBvbmNlIG1vcmUuICovCisgICAgICAgICAgICBpZiAoZ2FtbWFfZGVwdGggIT0gc2FtcGxlX2RlcHRoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcmxvID0gREQocmxvLCBnYW1tYV9kZXB0aCwgMC8qdHJ1bmNhdGUqLyk7CisgICAgICAgICAgICAgICByaGkgPSBEVShyaGksIGdhbW1hX2RlcHRoLCAwLyp0cnVuY2F0ZSovKTsKKyAgICAgICAgICAgICAgIGdsbyA9IEREKGdsbywgZ2FtbWFfZGVwdGgsIDAvKnRydW5jYXRlKi8pOworICAgICAgICAgICAgICAgZ2hpID0gRFUoZ2hpLCBnYW1tYV9kZXB0aCwgMC8qdHJ1bmNhdGUqLyk7CisgICAgICAgICAgICAgICBibG8gPSBERChibG8sIGdhbW1hX2RlcHRoLCAwLyp0cnVuY2F0ZSovKTsKKyAgICAgICAgICAgICAgIGJoaSA9IERVKGJoaSwgZ2FtbWFfZGVwdGgsIDAvKnRydW5jYXRlKi8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBncmF5ID0gcG93KGdyYXksIHBvd2VyKTsKKyAgICAgICAgICAgIGdyYXlsbyA9IEREKHBvdyhncmF5bG8sIHBvd2VyKSwgc2FtcGxlX2RlcHRoLCAxKTsKKyAgICAgICAgICAgIGdyYXloaSA9IERVKHBvdyhncmF5aGksIHBvd2VyKSwgc2FtcGxlX2RlcHRoLCAxKTsKKyAgICAgICAgIH0KKworIyAgICAgICAgdW5kZWYgREQKKyMgICAgICAgIHVuZGVmIERVCisKKyAgICAgICAgIC8qIE5vdyB0aGUgZXJyb3IgY2FuIGJlIGNhbGN1bGF0ZWQuCisgICAgICAgICAgKgorICAgICAgICAgICogSWYgcj09Zz09YiBiZWNhdXNlIHRoZXJlIGlzIG5vIG92ZXJhbGwgZ2FtbWEgY29ycmVjdGlvbiBsaWJwbmcKKyAgICAgICAgICAqIGN1cnJlbnRseSBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIHZhbHVlLgorICAgICAgICAgICovCisgICAgICAgICBpZiAoaXNncmF5KQorICAgICAgICAgICAgZXJyID0gKHRoYXQtPnJlZGUgKyB0aGF0LT5ncmVlbmUgKyB0aGF0LT5ibHVlZSkvMzsKKworICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgZXJyID0gZmFicyhncmF5aGktZ3JheSk7CisgICAgICAgICAgICBpZiAoZmFicyhncmF5IC0gZ3JheWxvKSA+IGVycikKKyAgICAgICAgICAgICAgIGVyciA9IGZhYnMoZ3JheWxvLWdyYXkpOworCisgICAgICAgICAgICAvKiBDaGVjayB0aGF0IHRoaXMgd29ya2VkOiAqLworICAgICAgICAgICAgaWYgKGVyciA+IHBtLT5saW1pdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNpemVfdCBwb3MgPSAwOworICAgICAgICAgICAgICAgY2hhciBidWZmZXJbMTI4XTsKKworICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIHNpemVvZiBidWZmZXIsIHBvcywgInJnYl90b19ncmF5IGVycm9yICIpOworICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdGQoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCBwb3MsIGVyciwgNik7CisgICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgcG9zLCAiIGV4Y2VlZHMgbGltaXQgIik7CisgICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0ZChidWZmZXIsIHNpemVvZiBidWZmZXIsIHBvcywgcG0tPmxpbWl0LCA2KTsKKyAgICAgICAgICAgICAgIHBuZ19lcnJvcihwcCwgYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyMgIGVsc2UgIC8qIERJR0lUSVpFICovCisgICAgICB7CisgICAgICAgICBkb3VibGUgciA9IHRoYXQtPnJlZGY7CisgICAgICAgICBkb3VibGUgcmUgPSB0aGF0LT5yZWRlOworICAgICAgICAgZG91YmxlIGcgPSB0aGF0LT5ncmVlbmY7CisgICAgICAgICBkb3VibGUgZ2UgPSB0aGF0LT5ncmVlbmU7CisgICAgICAgICBkb3VibGUgYiA9IHRoYXQtPmJsdWVmOworICAgICAgICAgZG91YmxlIGJlID0gdGhhdC0+Ymx1ZWU7CisKKyMgICAgICAgIGlmIFBOR19MSUJQTkdfVkVSIDwgMTA3MDAKKyAgICAgICAgICAgIC8qIFRoZSB0cnVlIGdyYXkgY2FzZSBpbnZvbHZlcyBubyBtYXRoIGluIGVhcmxpZXIgdmVyc2lvbnMgKG5vdAorICAgICAgICAgICAgICogdHJ1ZSwgdGhlcmUgd2FzIHNvbWUgaWYgZ2FtbWEgY29ycmVjdGlvbiB3YXMgaGFwcGVuaW5nIHRvby4pCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChyID09IGcgJiYgciA9PSBiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZ3JheSA9IHI7CisgICAgICAgICAgICAgICBlcnIgPSByZTsKKyAgICAgICAgICAgICAgIGlmIChlcnIgPCBnZSkgZXJyID0gZ2U7CisgICAgICAgICAgICAgICBpZiAoZXJyIDwgYmUpIGVyciA9IGJlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbHNlCisjICAgICAgICBlbmRpZiAvKiBiZWZvcmUgMS43ICovCisgICAgICAgICBpZiAoZGF0YS5nYW1tYSA9PSAxKQorICAgICAgICAgeworICAgICAgICAgICAgLyogVGhlcmUgaXMgbm8gbmVlZCB0byBkbyB0aGUgY29udmVyc2lvbnMgdG8gYW5kIGZyb20gbGluZWFyIHNwYWNlLAorICAgICAgICAgICAgICogc28gdGhlIGNhbGN1bGF0aW9uIHNob3VsZCBiZSBhIGxvdCBtb3JlIGFjY3VyYXRlLiAgVGhlcmUgaXMgYQorICAgICAgICAgICAgICogYnVpbHQgaW4gZXJyb3IgaW4gdGhlIGNvZWZmaWNpZW50cyBiZWNhdXNlIHRoZXkgb25seSBoYXZlIDE1IGJpdHMKKyAgICAgICAgICAgICAqIGFuZCBhcmUgYWRqdXN0ZWQgdG8gbWFrZSBzdXJlIHRoZXkgYWRkIHVwIHRvIDMyNzY4LiAgVGhpcworICAgICAgICAgICAgICogaW52b2x2ZXMgYSBpbnRlZ2VyIGNhbGN1bGF0aW9uIHdpdGggdHJ1bmNhdGlvbiBvZiB0aGUgZm9ybToKKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiAgICAgKChpbnQpKGNvZWZmaWNpZW50ICogMTAwMDAwKSAqIDMyNzY4KS8xMDAwMDAKKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBUaGlzIGlzIGRvbmUgdG8gdGhlIHJlZCBhbmQgZ3JlZW4gY29lZmZpY2llbnRzICh0aGUgb25lcworICAgICAgICAgICAgICogcHJvdmlkZWQgdG8gdGhlIEFQSSkgdGhlbiBibHVlIGlzIGNhbGN1bGF0ZWQgZnJvbSB0aGVtIHNvIHRoZQorICAgICAgICAgICAgICogcmVzdWx0IGFkZHMgdXAgdG8gMzI3NjguICBJbiB0aGUgd29yc3QgY2FzZSB0aGlzIGNhbiByZXN1bHQgaW4KKyAgICAgICAgICAgICAqIGEgLTEgZXJyb3IgaW4gcmVkIGFuZCBncmVlbiBhbmQgYSArMiBlcnJvciBpbiBibHVlLiAgQ29uc2VxdWVudGx5CisgICAgICAgICAgICAgKiB0aGUgd29yc3QgY2FzZSBpbiB0aGUgY2FsY3VsYXRpb24gYmVsb3cgaXMgMi8zMjc2OCBlcnJvci4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBUT0RPOiBjb25zaWRlciBmaXhpbmcgdGhpcyBpbiBsaWJwbmcgYnkgcm91bmRpbmcgdGhlIGNhbGN1bGF0aW9uCisgICAgICAgICAgICAgKiBsaW1pdGluZyB0aGUgZXJyb3IgdG8gMS8zMjc2OC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBIYW5kbGluZyB0aGlzIGJ5IGFkZGluZyAyLzMyNzY4IGhlcmUgYXZvaWRzIG5lZWRpbmcgdG8gaW5jcmVhc2UKKyAgICAgICAgICAgICAqIHRoZSBnbG9iYWwgZXJyb3IgbGltaXRzIHRvIHRha2UgdGhpcyBpbnRvIGFjY291bnQuKQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBncmF5ID0gciAqIGRhdGEucmVkX2NvZWZmaWNpZW50ICsgZyAqIGRhdGEuZ3JlZW5fY29lZmZpY2llbnQgKworICAgICAgICAgICAgICAgYiAqIGRhdGEuYmx1ZV9jb2VmZmljaWVudDsKKyAgICAgICAgICAgIGVyciA9IHJlICogZGF0YS5yZWRfY29lZmZpY2llbnQgKyBnZSAqIGRhdGEuZ3JlZW5fY29lZmZpY2llbnQgKworICAgICAgICAgICAgICAgYmUgKiBkYXRhLmJsdWVfY29lZmZpY2llbnQgKyAyLi8zMjc2OCArIGdyYXkgKiA1ICogREJMX0VQU0lMT047CisgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoZSBjYWxjdWxhdGlvbiBoYXBwZW5zIGluIGxpbmVhciBzcGFjZSwgYW5kIHRoaXMgcHJvZHVjZXMgbXVjaAorICAgICAgICAgICAgICogd2lkZXIgZXJyb3JzIGluIHRoZSBlbmNvZGVkIHNwYWNlLiAgVGhlc2UgYXJlIGhhbmRsZWQgaGVyZSBieQorICAgICAgICAgICAgICogZmFjdG9yaW5nIHRoZSBlcnJvcnMgaW4gdG8gdGhlIGNhbGN1bGF0aW9uLiAgVGhlcmUgYXJlIHR3byB0YWJsZQorICAgICAgICAgICAgICogbG9va3VwcyBpbiB0aGUgY2FsY3VsYXRpb24gYW5kIGVhY2ggaW50cm9kdWNlcyBhIHF1YW50aXphdGlvbgorICAgICAgICAgICAgICogZXJyb3IgZGVmaW5lZCBieSB0aGUgdGFibGUgc2l6ZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgY29uc3QgcG5nX21vZGlmaWVyICpwbSA9IGRpc3BsYXktPnBtOworICAgICAgICAgICAgZG91YmxlIGluX3FlID0gKHRoYXQtPnNhbXBsZV9kZXB0aCA+IDggPyAuNS82NTUzNSA6IC41LzI1NSk7CisgICAgICAgICAgICBkb3VibGUgb3V0X3FlID0gKHRoYXQtPnNhbXBsZV9kZXB0aCA+IDggPyAuNS82NTUzNSA6CisgICAgICAgICAgICAgICAocG0tPmFzc3VtZV8xNl9iaXRfY2FsY3VsYXRpb25zID8gLjUvKDE8PGRpc3BsYXktPm1heF9nYW1tYV84KSA6CisgICAgICAgICAgICAgICAuNS8yNTUpKTsKKyAgICAgICAgICAgIGRvdWJsZSByaGksIGdoaSwgYmhpLCBncmF5aGk7CisgICAgICAgICAgICBkb3VibGUgZzEgPSAxL2RhdGEuZ2FtbWE7CisKKyAgICAgICAgICAgIHJoaSA9IHIgKyByZSArIGluX3FlOyBpZiAocmhpID4gMSkgcmhpID0gMTsKKyAgICAgICAgICAgIHIgLT0gcmUgKyBpbl9xZTsgaWYgKHIgPCAwKSByID0gMDsKKyAgICAgICAgICAgIGdoaSA9IGcgKyBnZSArIGluX3FlOyBpZiAoZ2hpID4gMSkgZ2hpID0gMTsKKyAgICAgICAgICAgIGcgLT0gZ2UgKyBpbl9xZTsgaWYgKGcgPCAwKSBnID0gMDsKKyAgICAgICAgICAgIGJoaSA9IGIgKyBiZSArIGluX3FlOyBpZiAoYmhpID4gMSkgYmhpID0gMTsKKyAgICAgICAgICAgIGIgLT0gYmUgKyBpbl9xZTsgaWYgKGIgPCAwKSBiID0gMDsKKworICAgICAgICAgICAgciA9IHBvdyhyLCBnMSkqKDEtREJMX0VQU0lMT04pOyByaGkgPSBwb3cocmhpLCBnMSkqKDErREJMX0VQU0lMT04pOworICAgICAgICAgICAgZyA9IHBvdyhnLCBnMSkqKDEtREJMX0VQU0lMT04pOyBnaGkgPSBwb3coZ2hpLCBnMSkqKDErREJMX0VQU0lMT04pOworICAgICAgICAgICAgYiA9IHBvdyhiLCBnMSkqKDEtREJMX0VQU0lMT04pOyBiaGkgPSBwb3coYmhpLCBnMSkqKDErREJMX0VQU0lMT04pOworCisgICAgICAgICAgICAvKiBXb3JrIG91dCB0aGUgbG93ZXIgYW5kIHVwcGVyIGJvdW5kcyBmb3IgdGhlIGdyYXkgdmFsdWUgaW4gdGhlCisgICAgICAgICAgICAgKiBlbmNvZGVkIHNwYWNlLCB0aGVuIHdvcmsgb3V0IGFuIGF2ZXJhZ2UgYW5kIGVycm9yLiAgUmVtb3ZlIHRoZQorICAgICAgICAgICAgICogcHJldmlvdXNseSBhZGRlZCBpbnB1dCBxdWFudGl6YXRpb24gZXJyb3IgYXQgdGhpcyBwb2ludC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZ3JheSA9IHIgKiBkYXRhLnJlZF9jb2VmZmljaWVudCArIGcgKiBkYXRhLmdyZWVuX2NvZWZmaWNpZW50ICsKKyAgICAgICAgICAgICAgIGIgKiBkYXRhLmJsdWVfY29lZmZpY2llbnQgLSAyLi8zMjc2OCAtIG91dF9xZTsKKyAgICAgICAgICAgIGlmIChncmF5IDw9IDApCisgICAgICAgICAgICAgICBncmF5ID0gMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGdyYXkgKj0gKDEgLSA2ICogREJMX0VQU0lMT04pOworICAgICAgICAgICAgICAgZ3JheSA9IHBvdyhncmF5LCBkYXRhLmdhbW1hKSAqICgxLURCTF9FUFNJTE9OKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ3JheWhpID0gcmhpICogZGF0YS5yZWRfY29lZmZpY2llbnQgKyBnaGkgKiBkYXRhLmdyZWVuX2NvZWZmaWNpZW50ICsKKyAgICAgICAgICAgICAgIGJoaSAqIGRhdGEuYmx1ZV9jb2VmZmljaWVudCArIDIuLzMyNzY4ICsgb3V0X3FlOworICAgICAgICAgICAgZ3JheWhpICo9ICgxICsgNiAqIERCTF9FUFNJTE9OKTsKKyAgICAgICAgICAgIGlmIChncmF5aGkgPj0gMSkKKyAgICAgICAgICAgICAgIGdyYXloaSA9IDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICBncmF5aGkgPSBwb3coZ3JheWhpLCBkYXRhLmdhbW1hKSAqICgxK0RCTF9FUFNJTE9OKTsKKworICAgICAgICAgICAgZXJyID0gKGdyYXloaSAtIGdyYXkpIC8gMjsKKyAgICAgICAgICAgIGdyYXkgPSAoZ3JheWhpICsgZ3JheSkgLyAyOworCisgICAgICAgICAgICBpZiAoZXJyIDw9IGluX3FlKQorICAgICAgICAgICAgICAgZXJyID0gZ3JheSAqIERCTF9FUFNJTE9OOworCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICBlcnIgLT0gaW5fcWU7CisKKyAgICAgICAgICAgIC8qIFZhbGlkYXRlIHRoYXQgdGhlIGVycm9yIGlzIHdpdGhpbiBsaW1pdHMgKHRoaXMgaGFzIGNhdXNlZAorICAgICAgICAgICAgICogcHJvYmxlbXMgYmVmb3JlLCBpdCdzIG11Y2ggZWFzaWVyIHRvIGRldGVjdCB0aGVtIGhlcmUuKQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoZXJyID4gcG0tPmxpbWl0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc2l6ZV90IHBvcyA9IDA7CisgICAgICAgICAgICAgICBjaGFyIGJ1ZmZlclsxMjhdOworCisgICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgcG9zLCAicmdiX3RvX2dyYXkgZXJyb3IgIik7CisgICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0ZChidWZmZXIsIHNpemVvZiBidWZmZXIsIHBvcywgZXJyLCA2KTsKKyAgICAgICAgICAgICAgIHBvcyA9IHNhZmVjYXQoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCBwb3MsICIgZXhjZWVkcyBsaW1pdCAiKTsKKyAgICAgICAgICAgICAgIHBvcyA9IHNhZmVjYXRkKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgcG9zLCBwbS0+bGltaXQsIDYpOworICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBwLCBidWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorIyAgZW5kaWYgLyogIURJR0lUSVpFICovCisKKyAgICAgIHRoYXQtPmJsdWVmID0gdGhhdC0+Z3JlZW5mID0gdGhhdC0+cmVkZiA9IGdyYXk7CisgICAgICB0aGF0LT5ibHVlZSA9IHRoYXQtPmdyZWVuZSA9IHRoYXQtPnJlZGUgPSBlcnI7CisKKyAgICAgIC8qIFRoZSBzQklUIGlzIHRoZSBtaW5pdW0gb2YgdGhlIHRocmVlIGNvbG91ciBjaGFubmVsIHNCSVRzLiAqLworICAgICAgaWYgKHRoYXQtPnJlZF9zQklUID4gdGhhdC0+Z3JlZW5fc0JJVCkKKyAgICAgICAgIHRoYXQtPnJlZF9zQklUID0gdGhhdC0+Z3JlZW5fc0JJVDsKKyAgICAgIGlmICh0aGF0LT5yZWRfc0JJVCA+IHRoYXQtPmJsdWVfc0JJVCkKKyAgICAgICAgIHRoYXQtPnJlZF9zQklUID0gdGhhdC0+Ymx1ZV9zQklUOworICAgICAgdGhhdC0+Ymx1ZV9zQklUID0gdGhhdC0+Z3JlZW5fc0JJVCA9IHRoYXQtPnJlZF9zQklUOworCisgICAgICAvKiBBbmQgcmVtb3ZlIHRoZSBjb2xvdXIgYml0IGluIHRoZSB0eXBlOiAqLworICAgICAgaWYgKHRoYXQtPmNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikKKyAgICAgICAgIHRoYXQtPmNvbG91cl90eXBlID0gUE5HX0NPTE9SX1RZUEVfR1JBWTsKKyAgICAgIGVsc2UgaWYgKHRoYXQtPmNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkKKyAgICAgICAgIHRoYXQtPmNvbG91cl90eXBlID0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQTsKKyAgIH0KKworICAgdGhpcy0+bmV4dC0+bW9kKHRoaXMtPm5leHQsIHRoYXQsIHBwLCBkaXNwbGF5KTsKK30KKworc3RhdGljIGludAoraW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfcmdiX3RvX2dyYXlfYWRkKGltYWdlX3RyYW5zZm9ybSAqdGhpcywKKyAgICBjb25zdCBpbWFnZV90cmFuc2Zvcm0gKip0aGF0LCBwbmdfYnl0ZSBjb2xvdXJfdHlwZSwgcG5nX2J5dGUgYml0X2RlcHRoKQoreworICAgVU5VU0VEKGJpdF9kZXB0aCkKKworICAgdGhpcy0+bmV4dCA9ICp0aGF0OworICAgKnRoYXQgPSB0aGlzOworCisgICByZXR1cm4gKGNvbG91cl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpICE9IDA7Cit9CisKKyN1bmRlZiBkYXRhCitJVChyZ2JfdG9fZ3JheSk7CisjdW5kZWYgUFQKKyNkZWZpbmUgUFQgSVRTVFJVQ1QocmdiX3RvX2dyYXkpCisjdW5kZWYgaW1hZ2VfdHJhbnNmb3JtX2luaQorI2RlZmluZSBpbWFnZV90cmFuc2Zvcm1faW5pIGltYWdlX3RyYW5zZm9ybV9kZWZhdWx0X2luaQorI2VuZGlmIC8qIFBOR19SRUFEX1JHQl9UT19HUkFZX1NVUFBPUlRFRCAqLworCisjaWZkZWYgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQKKy8qIHBuZ19zZXRfYmFja2dyb3VuZChwbmdfc3RydWN0cCwgcG5nX2NvbnN0X2NvbG9yXzE2cCBiYWNrZ3JvdW5kX2NvbG9yLAorICogICAgaW50IGJhY2tncm91bmRfZ2FtbWFfY29kZSwgaW50IG5lZWRfZXhwYW5kLCBkb3VibGUgYmFja2dyb3VuZF9nYW1tYSkKKyAqIHBuZ19zZXRfYmFja2dyb3VuZF9maXhlZChwbmdfc3RydWN0cCwgcG5nX2NvbnN0X2NvbG9yXzE2cCBiYWNrZ3JvdW5kX2NvbG9yLAorICogICAgaW50IGJhY2tncm91bmRfZ2FtbWFfY29kZSwgaW50IG5lZWRfZXhwYW5kLAorICogICAgcG5nX2ZpeGVkX3BvaW50IGJhY2tncm91bmRfZ2FtbWEpCisgKgorICogVGhpcyBpZ25vcmVzIHRoZSBnYW1tYSAoYXQgcHJlc2VudC4pCisqLworI2RlZmluZSBkYXRhIElUREFUQShiYWNrZ3JvdW5kKQorc3RhdGljIGltYWdlX3BpeGVsIGRhdGE7CisKK3N0YXRpYyB2b2lkCitpbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9iYWNrZ3JvdW5kX3NldChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCisgICAgdHJhbnNmb3JtX2Rpc3BsYXkgKnRoYXQsIHBuZ19zdHJ1Y3RwIHBwLCBwbmdfaW5mb3AgcGkpCit7CisgICBwbmdfYnl0ZSBjb2xvdXJfdHlwZSwgYml0X2RlcHRoOworICAgcG5nX2J5dGUgcmFuZG9tX2J5dGVzWzhdOyAvKiA4IGJ5dGVzIC0gNjQgYml0cyAtIHRoZSBiaWdnZXN0IHBpeGVsICovCisgICBpbnQgZXhwYW5kOworICAgcG5nX2NvbG9yXzE2IGJhY2s7CisKKyAgIC8qIFdlIG5lZWQgYSBiYWNrZ3JvdW5kIGNvbG91ciwgYmVjYXVzZSB3ZSBkb24ndCBrbm93IGV4YWN0bHkgd2hhdCB0cmFuc2Zvcm1zCisgICAgKiBoYXZlIGJlZW4gc2V0IHdlIGhhdmUgdG8gc3VwcGx5IHRoZSBjb2xvdXIgaW4gdGhlIG9yaWdpbmFsIGZpbGUgZm9ybWF0IGFuZAorICAgICogc28gd2UgbmVlZCB0byBrbm93IHdoYXQgdGhhdCBpcyEgIFRoZSBiYWNrZ3JvdW5kIGNvbG91ciBpcyBzdG9yZWQgaW4gdGhlCisgICAgKiB0cmFuc2Zvcm1fZGlzcGxheS4KKyAgICAqLworICAgUkFORE9NSVpFKHJhbmRvbV9ieXRlcyk7CisKKyAgIC8qIFJlYWQgdGhlIHJhbmRvbSB2YWx1ZSwgZm9yIGNvbG91ciB0eXBlIDMgdGhlIGJhY2tncm91bmQgY29sb3VyIGlzIGFjdHVhbGx5CisgICAgKiBleHByZXNzZWQgYXMgYSAyNGJpdCByZ2IsIG5vdCBhbiBpbmRleC4KKyAgICAqLworICAgY29sb3VyX3R5cGUgPSB0aGF0LT50aGlzLmNvbG91cl90eXBlOworICAgaWYgKGNvbG91cl90eXBlID09IDMpCisgICB7CisgICAgICBjb2xvdXJfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1JHQjsKKyAgICAgIGJpdF9kZXB0aCA9IDg7CisgICAgICBleHBhbmQgPSAwOyAvKiBwYXNzaW5nIGluIGFuIFJHQiBub3QgYSBwaXhlbCBpbmRleCAqLworICAgfQorCisgICBlbHNlCisgICB7CisgICAgICBpZiAodGhhdC0+dGhpcy5oYXNfdFJOUykKKyAgICAgICAgIHRoYXQtPnRoaXMuaXNfdHJhbnNwYXJlbnQgPSAxOworCisgICAgICBiaXRfZGVwdGggPSB0aGF0LT50aGlzLmJpdF9kZXB0aDsKKyAgICAgIGV4cGFuZCA9IDE7CisgICB9CisKKyAgIGltYWdlX3BpeGVsX2luaXQoJmRhdGEsIHJhbmRvbV9ieXRlcywgY29sb3VyX3R5cGUsCisgICAgICBiaXRfZGVwdGgsIDAvKngqLywgMC8qdW51c2VkOiBwYWxldHRlKi8sIE5VTEwvKmZvcm1hdCovKTsKKworICAgLyogRXh0cmFjdCB0aGUgYmFja2dyb3VuZCBjb2xvdXIgZnJvbSB0aGlzIGltYWdlX3BpeGVsLCBidXQgbWFrZSBzdXJlIHRoZQorICAgICogdW51c2VkIGZpZWxkcyBvZiAnYmFjaycgYXJlIGdhcmJhZ2UuCisgICAgKi8KKyAgIFJBTkRPTUlaRShiYWNrKTsKKworICAgaWYgKGNvbG91cl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpCisgICB7CisgICAgICBiYWNrLnJlZCA9IChwbmdfdWludF8xNilkYXRhLnJlZDsKKyAgICAgIGJhY2suZ3JlZW4gPSAocG5nX3VpbnRfMTYpZGF0YS5ncmVlbjsKKyAgICAgIGJhY2suYmx1ZSA9IChwbmdfdWludF8xNilkYXRhLmJsdWU7CisgICB9CisKKyAgIGVsc2UKKyAgICAgIGJhY2suZ3JheSA9IChwbmdfdWludF8xNilkYXRhLnJlZDsKKworIyAgaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorICAgICAgcG5nX3NldF9iYWNrZ3JvdW5kKHBwLCAmYmFjaywgUE5HX0JBQ0tHUk9VTkRfR0FNTUFfRklMRSwgZXhwYW5kLCAwKTsKKyMgIGVsc2UKKyAgICAgIHBuZ19zZXRfYmFja2dyb3VuZF9maXhlZChwcCwgJmJhY2ssIFBOR19CQUNLR1JPVU5EX0dBTU1BX0ZJTEUsIGV4cGFuZCwgMCk7CisjICBlbmRpZgorCisgICB0aGlzLT5uZXh0LT5zZXQodGhpcy0+bmV4dCwgdGhhdCwgcHAsIHBpKTsKK30KKworc3RhdGljIHZvaWQKK2ltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X2JhY2tncm91bmRfbW9kKGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKKyAgICBpbWFnZV9waXhlbCAqdGhhdCwgcG5nX2NvbnN0X3N0cnVjdHAgcHAsCisgICAgY29uc3QgdHJhbnNmb3JtX2Rpc3BsYXkgKmRpc3BsYXkpCit7CisgICAvKiBDaGVjayBmb3IgdFJOUyBmaXJzdDogKi8KKyAgIGlmICh0aGF0LT5oYXZlX3RSTlMgJiYgdGhhdC0+Y29sb3VyX3R5cGUgIT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgICAgIGltYWdlX3BpeGVsX2FkZF9hbHBoYSh0aGF0LCAmZGlzcGxheS0+dGhpcywgMS8qZm9yIGJhY2tncm91bmQqLyk7CisKKyAgIC8qIFRoaXMgaXMgb25seSBuZWNlc3NhcnkgaWYgdGhlIGFscGhhIHZhbHVlIGlzIGxlc3MgdGhhbiAxLiAqLworICAgaWYgKHRoYXQtPmFscGhhZiA8IDEpCisgICB7CisgICAgICAvKiBOb3cgd2UgZG8gdGhlIGJhY2tncm91bmQgY2FsY3VsYXRpb24gd2l0aG91dCBhbnkgZ2FtbWEgY29ycmVjdGlvbi4gKi8KKyAgICAgIGlmICh0aGF0LT5hbHBoYWYgPD0gMCkKKyAgICAgIHsKKyAgICAgICAgIHRoYXQtPnJlZGYgPSBkYXRhLnJlZGY7CisgICAgICAgICB0aGF0LT5ncmVlbmYgPSBkYXRhLmdyZWVuZjsKKyAgICAgICAgIHRoYXQtPmJsdWVmID0gZGF0YS5ibHVlZjsKKworICAgICAgICAgdGhhdC0+cmVkZSA9IGRhdGEucmVkZTsKKyAgICAgICAgIHRoYXQtPmdyZWVuZSA9IGRhdGEuZ3JlZW5lOworICAgICAgICAgdGhhdC0+Ymx1ZWUgPSBkYXRhLmJsdWVlOworCisgICAgICAgICB0aGF0LT5yZWRfc0JJVD0gZGF0YS5yZWRfc0JJVDsKKyAgICAgICAgIHRoYXQtPmdyZWVuX3NCSVQ9IGRhdGEuZ3JlZW5fc0JJVDsKKyAgICAgICAgIHRoYXQtPmJsdWVfc0JJVD0gZGF0YS5ibHVlX3NCSVQ7CisgICAgICB9CisKKyAgICAgIGVsc2UgLyogMCA8IGFscGhhIDwgMSAqLworICAgICAgeworICAgICAgICAgZG91YmxlIGFsZiA9IDEgLSB0aGF0LT5hbHBoYWY7CisKKyAgICAgICAgIHRoYXQtPnJlZGYgPSB0aGF0LT5yZWRmICogdGhhdC0+YWxwaGFmICsgZGF0YS5yZWRmICogYWxmOworICAgICAgICAgdGhhdC0+cmVkZSA9IHRoYXQtPnJlZGUgKiB0aGF0LT5hbHBoYWYgKyBkYXRhLnJlZGUgKiBhbGYgKworICAgICAgICAgICAgREJMX0VQU0lMT047CisgICAgICAgICB0aGF0LT5ncmVlbmYgPSB0aGF0LT5ncmVlbmYgKiB0aGF0LT5hbHBoYWYgKyBkYXRhLmdyZWVuZiAqIGFsZjsKKyAgICAgICAgIHRoYXQtPmdyZWVuZSA9IHRoYXQtPmdyZWVuZSAqIHRoYXQtPmFscGhhZiArIGRhdGEuZ3JlZW5lICogYWxmICsKKyAgICAgICAgICAgIERCTF9FUFNJTE9OOworICAgICAgICAgdGhhdC0+Ymx1ZWYgPSB0aGF0LT5ibHVlZiAqIHRoYXQtPmFscGhhZiArIGRhdGEuYmx1ZWYgKiBhbGY7CisgICAgICAgICB0aGF0LT5ibHVlZSA9IHRoYXQtPmJsdWVlICogdGhhdC0+YWxwaGFmICsgZGF0YS5ibHVlZSAqIGFsZiArCisgICAgICAgICAgICBEQkxfRVBTSUxPTjsKKyAgICAgIH0KKworICAgICAgLyogUmVtb3ZlIHRoZSBhbHBoYSB0eXBlIGFuZCBzZXQgdGhlIGFscGhhIChub3QgaW4gdGhhdCBvcmRlci4pICovCisgICAgICB0aGF0LT5hbHBoYWYgPSAxOworICAgICAgdGhhdC0+YWxwaGFlID0gMDsKKyAgIH0KKworICAgaWYgKHRoYXQtPmNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkKKyAgICAgIHRoYXQtPmNvbG91cl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUkdCOworICAgZWxzZSBpZiAodGhhdC0+Y29sb3VyX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkKKyAgICAgIHRoYXQtPmNvbG91cl90eXBlID0gUE5HX0NPTE9SX1RZUEVfR1JBWTsKKyAgIC8qIFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgaXMgbm90IGNoYW5nZWQgKi8KKworICAgdGhpcy0+bmV4dC0+bW9kKHRoaXMtPm5leHQsIHRoYXQsIHBwLCBkaXNwbGF5KTsKK30KKworI2RlZmluZSBpbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9iYWNrZ3JvdW5kX2FkZCBpbWFnZV90cmFuc2Zvcm1fZGVmYXVsdF9hZGQKKworI3VuZGVmIGRhdGEKK0lUKGJhY2tncm91bmQpOworI3VuZGVmIFBUCisjZGVmaW5lIFBUIElUU1RSVUNUKGJhY2tncm91bmQpCisjZW5kaWYgLyogUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQgKi8KKworLyogcG5nX3NldF9xdWFudGl6ZShwbmdfc3RydWN0cCwgcG5nX2NvbG9ycCBwYWxldHRlLCBpbnQgbnVtX3BhbGV0dGUsCisgKiAgICBpbnQgbWF4aW11bV9jb2xvcnMsIHBuZ19jb25zdF91aW50XzE2cCBoaXN0b2dyYW0sIGludCBmdWxsX3F1YW50aXplKQorICoKKyAqIFZlcnkgZGlmZmljdWx0IHRvIHZhbGlkYXRlIHRoaXMhCisgKi8KKy8qTk9URTogVEJEIE5ZSSAqLworCisvKiBUaGUgZGF0YSBsYXlvdXQgdHJhbnNmb3JtcyBhcmUgaGFuZGxlZCBieSBzd2FwcGluZyBvdXIgb3duIGNoYW5uZWwgZGF0YSwKKyAqIG5lY2Vzc2FyaWx5IHRoZXNlIG5lZWQgdG8gaGFwcGVuIGF0IHRoZSBlbmQgb2YgdGhlIHRyYW5zZm9ybSBsaXN0IGJlY2F1c2UgdGhlCisgKiBzZW1hbnRpYyBvZiB0aGUgY2hhbm5lbHMgY2hhbmdlcyBhZnRlciB0aGVzZSBhcmUgZXhlY3V0ZWQuICBTb21lIG9mIHRoZXNlLAorICogbGlrZSBzZXRfc2hpZnQgYW5kIHNldF9wYWNraW5nLCBjYW4ndCBiZSBkb25lIGF0IHByZXNlbnQgYmVjYXVzZSB0aGV5IGNoYW5nZQorICogdGhlIGxheW91dCBvZiB0aGUgZGF0YSBhdCB0aGUgc3ViLXNhbXBsZSBsZXZlbCBzbyBzYW1wbGUoKSB3b24ndCBnZXQgdGhlCisgKiByaWdodCBhbnN3ZXIuCisgKi8KKy8qIHBuZ19zZXRfaW52ZXJ0X2FscGhhICovCisjaWZkZWYgUE5HX1JFQURfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRAorLyogSW52ZXJ0IHRoZSBhbHBoYSBjaGFubmVsCisgKgorICogIHBuZ19zZXRfaW52ZXJ0X2FscGhhKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQorICovCitzdGF0aWMgdm9pZAoraW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfaW52ZXJ0X2FscGhhX3NldChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCisgICAgdHJhbnNmb3JtX2Rpc3BsYXkgKnRoYXQsIHBuZ19zdHJ1Y3RwIHBwLCBwbmdfaW5mb3AgcGkpCit7CisgICBwbmdfc2V0X2ludmVydF9hbHBoYShwcCk7CisgICB0aGlzLT5uZXh0LT5zZXQodGhpcy0+bmV4dCwgdGhhdCwgcHAsIHBpKTsKK30KKworc3RhdGljIHZvaWQKK2ltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X2ludmVydF9hbHBoYV9tb2QoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAorICAgIGltYWdlX3BpeGVsICp0aGF0LCBwbmdfY29uc3Rfc3RydWN0cCBwcCwKKyAgICBjb25zdCB0cmFuc2Zvcm1fZGlzcGxheSAqZGlzcGxheSkKK3sKKyAgIGlmICh0aGF0LT5jb2xvdXJfdHlwZSAmIDQpCisgICAgICB0aGF0LT5hbHBoYV9pbnZlcnRlZCA9IDE7CisKKyAgIHRoaXMtPm5leHQtPm1vZCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgZGlzcGxheSk7Cit9CisKK3N0YXRpYyBpbnQKK2ltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X2ludmVydF9hbHBoYV9hZGQoaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAorICAgIGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqKnRoYXQsIHBuZ19ieXRlIGNvbG91cl90eXBlLCBwbmdfYnl0ZSBiaXRfZGVwdGgpCit7CisgICBVTlVTRUQoYml0X2RlcHRoKQorCisgICB0aGlzLT5uZXh0ID0gKnRoYXQ7CisgICAqdGhhdCA9IHRoaXM7CisKKyAgIC8qIE9ubHkgaGFzIGFuIGVmZmVjdCBvbiBwaXhlbHMgd2l0aCBhbHBoYTogKi8KKyAgIHJldHVybiAoY29sb3VyX3R5cGUgJiA0KSAhPSAwOworfQorCitJVChpbnZlcnRfYWxwaGEpOworI3VuZGVmIFBUCisjZGVmaW5lIFBUIElUU1RSVUNUKGludmVydF9hbHBoYSkKKworI2VuZGlmIC8qIFBOR19SRUFEX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQgKi8KKworLyogcG5nX3NldF9iZ3IgKi8KKyNpZmRlZiBQTkdfUkVBRF9CR1JfU1VQUE9SVEVECisvKiBTd2FwIFIsRyxCIGNoYW5uZWxzIHRvIG9yZGVyIEIsRyxSLgorICoKKyAqICBwbmdfc2V0X2Jncihwbmdfc3RydWN0cnAgcG5nX3B0cikKKyAqCisgKiBUaGlzIG9ubHkgaGFzIGFuIGVmZmVjdCBvbiBSR0IgYW5kIFJHQkEgcGl4ZWxzLgorICovCitzdGF0aWMgdm9pZAoraW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfYmdyX3NldChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCisgICAgdHJhbnNmb3JtX2Rpc3BsYXkgKnRoYXQsIHBuZ19zdHJ1Y3RwIHBwLCBwbmdfaW5mb3AgcGkpCit7CisgICBwbmdfc2V0X2JncihwcCk7CisgICB0aGlzLT5uZXh0LT5zZXQodGhpcy0+bmV4dCwgdGhhdCwgcHAsIHBpKTsKK30KKworc3RhdGljIHZvaWQKK2ltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X2Jncl9tb2QoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAorICAgIGltYWdlX3BpeGVsICp0aGF0LCBwbmdfY29uc3Rfc3RydWN0cCBwcCwKKyAgICBjb25zdCB0cmFuc2Zvcm1fZGlzcGxheSAqZGlzcGxheSkKK3sKKyAgIGlmICh0aGF0LT5jb2xvdXJfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgfHwKKyAgICAgICB0aGF0LT5jb2xvdXJfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JBKQorICAgICAgIHRoYXQtPnN3YXBfcmdiID0gMTsKKworICAgdGhpcy0+bmV4dC0+bW9kKHRoaXMtPm5leHQsIHRoYXQsIHBwLCBkaXNwbGF5KTsKK30KKworc3RhdGljIGludAoraW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfYmdyX2FkZChpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCisgICAgY29uc3QgaW1hZ2VfdHJhbnNmb3JtICoqdGhhdCwgcG5nX2J5dGUgY29sb3VyX3R5cGUsIHBuZ19ieXRlIGJpdF9kZXB0aCkKK3sKKyAgIFVOVVNFRChiaXRfZGVwdGgpCisKKyAgIHRoaXMtPm5leHQgPSAqdGhhdDsKKyAgICp0aGF0ID0gdGhpczsKKworICAgcmV0dXJuIGNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiB8fAorICAgICAgIGNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQkE7Cit9CisKK0lUKGJncik7CisjdW5kZWYgUFQKKyNkZWZpbmUgUFQgSVRTVFJVQ1QoYmdyKQorCisjZW5kaWYgLyogUE5HX1JFQURfQkdSX1NVUFBPUlRFRCAqLworCisvKiBwbmdfc2V0X3N3YXBfYWxwaGEgKi8KKyNpZmRlZiBQTkdfUkVBRF9TV0FQX0FMUEhBX1NVUFBPUlRFRAorLyogUHV0IHRoZSBhbHBoYSBjaGFubmVsIGZpcnN0LgorICoKKyAqICBwbmdfc2V0X3N3YXBfYWxwaGEocG5nX3N0cnVjdHJwIHBuZ19wdHIpCisgKgorICogVGhpcyBvbmx5IGhhcyBhbiBlZmZlY3Qgb24gR0EgYW5kIFJHQkEgcGl4ZWxzLgorICovCitzdGF0aWMgdm9pZAoraW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfc3dhcF9hbHBoYV9zZXQoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAorICAgIHRyYW5zZm9ybV9kaXNwbGF5ICp0aGF0LCBwbmdfc3RydWN0cCBwcCwgcG5nX2luZm9wIHBpKQoreworICAgcG5nX3NldF9zd2FwX2FscGhhKHBwKTsKKyAgIHRoaXMtPm5leHQtPnNldCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgcGkpOworfQorCitzdGF0aWMgdm9pZAoraW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfc3dhcF9hbHBoYV9tb2QoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAorICAgIGltYWdlX3BpeGVsICp0aGF0LCBwbmdfY29uc3Rfc3RydWN0cCBwcCwKKyAgICBjb25zdCB0cmFuc2Zvcm1fZGlzcGxheSAqZGlzcGxheSkKK3sKKyAgIGlmICh0aGF0LT5jb2xvdXJfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HQSB8fAorICAgICAgIHRoYXQtPmNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQkEpCisgICAgICB0aGF0LT5hbHBoYV9maXJzdCA9IDE7CisKKyAgIHRoaXMtPm5leHQtPm1vZCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgZGlzcGxheSk7Cit9CisKK3N0YXRpYyBpbnQKK2ltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X3N3YXBfYWxwaGFfYWRkKGltYWdlX3RyYW5zZm9ybSAqdGhpcywKKyAgICBjb25zdCBpbWFnZV90cmFuc2Zvcm0gKip0aGF0LCBwbmdfYnl0ZSBjb2xvdXJfdHlwZSwgcG5nX2J5dGUgYml0X2RlcHRoKQoreworICAgVU5VU0VEKGJpdF9kZXB0aCkKKworICAgdGhpcy0+bmV4dCA9ICp0aGF0OworICAgKnRoYXQgPSB0aGlzOworCisgICByZXR1cm4gY29sb3VyX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR0EgfHwKKyAgICAgICBjb2xvdXJfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JBOworfQorCitJVChzd2FwX2FscGhhKTsKKyN1bmRlZiBQVAorI2RlZmluZSBQVCBJVFNUUlVDVChzd2FwX2FscGhhKQorCisjZW5kaWYgLyogUE5HX1JFQURfU1dBUF9BTFBIQV9TVVBQT1JURUQgKi8KKworLyogcG5nX3NldF9zd2FwICovCisjaWZkZWYgUE5HX1JFQURfU1dBUF9TVVBQT1JURUQKKy8qIEJ5dGUgc3dhcCAxNi1iaXQgY29tcG9uZW50cy4KKyAqCisgKiAgcG5nX3NldF9zd2FwKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQorICovCitzdGF0aWMgdm9pZAoraW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfc3dhcF9zZXQoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAorICAgIHRyYW5zZm9ybV9kaXNwbGF5ICp0aGF0LCBwbmdfc3RydWN0cCBwcCwgcG5nX2luZm9wIHBpKQoreworICAgcG5nX3NldF9zd2FwKHBwKTsKKyAgIHRoaXMtPm5leHQtPnNldCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgcGkpOworfQorCitzdGF0aWMgdm9pZAoraW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfc3dhcF9tb2QoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAorICAgIGltYWdlX3BpeGVsICp0aGF0LCBwbmdfY29uc3Rfc3RydWN0cCBwcCwKKyAgICBjb25zdCB0cmFuc2Zvcm1fZGlzcGxheSAqZGlzcGxheSkKK3sKKyAgIGlmICh0aGF0LT5iaXRfZGVwdGggPT0gMTYpCisgICAgICB0aGF0LT5zd2FwMTYgPSAxOworCisgICB0aGlzLT5uZXh0LT5tb2QodGhpcy0+bmV4dCwgdGhhdCwgcHAsIGRpc3BsYXkpOworfQorCitzdGF0aWMgaW50CitpbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9zd2FwX2FkZChpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCisgICAgY29uc3QgaW1hZ2VfdHJhbnNmb3JtICoqdGhhdCwgcG5nX2J5dGUgY29sb3VyX3R5cGUsIHBuZ19ieXRlIGJpdF9kZXB0aCkKK3sKKyAgIFVOVVNFRChjb2xvdXJfdHlwZSkKKworICAgdGhpcy0+bmV4dCA9ICp0aGF0OworICAgKnRoYXQgPSB0aGlzOworCisgICByZXR1cm4gYml0X2RlcHRoID09IDE2OworfQorCitJVChzd2FwKTsKKyN1bmRlZiBQVAorI2RlZmluZSBQVCBJVFNUUlVDVChzd2FwKQorCisjZW5kaWYgLyogUE5HX1JFQURfU1dBUF9TVVBQT1JURUQgKi8KKworI2lmZGVmIFBOR19SRUFEX0ZJTExFUl9TVVBQT1JURUQKKy8qIEFkZCBhIGZpbGxlciBieXRlIHRvIDgtYml0IEdyYXkgb3IgMjQtYml0IFJHQiBpbWFnZXMuCisgKgorICogIHBuZ19zZXRfZmlsbGVyLCAocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgZmlsbGVyLCBpbnQgZmxhZ3MpKTsKKyAqCisgKiBGbGFnczoKKyAqCisgKiAgUE5HX0ZJTExFUl9CRUZPUkUKKyAqICBQTkdfRklMTEVSX0FGVEVSCisgKi8KKyNkZWZpbmUgZGF0YSBJVERBVEEoZmlsbGVyKQorc3RhdGljIHN0cnVjdAoreworICAgcG5nX3VpbnRfMzIgZmlsbGVyOworICAgaW50ICAgICAgICAgZmxhZ3M7Cit9IGRhdGE7CisKK3N0YXRpYyB2b2lkCitpbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9maWxsZXJfc2V0KGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKKyAgICB0cmFuc2Zvcm1fZGlzcGxheSAqdGhhdCwgcG5nX3N0cnVjdHAgcHAsIHBuZ19pbmZvcCBwaSkKK3sKKyAgIC8qIE5lZWQgYSByYW5kb20gY2hvaWNlIGZvciAnYmVmb3JlJyBhbmQgJ2FmdGVyJyBhcyB3ZWxsIGFzIGZvciB0aGUKKyAgICAqIGZpbGxlci4gIFRoZSAnZmlsbGVyJyB2YWx1ZSBoYXMgYWxsIDMyIGJpdHMgc2V0LCBidXQgb25seSBiaXRfZGVwdGgKKyAgICAqIHdpbGwgYmUgdXNlZC4gIEF0IHRoaXMgcG9pbnQgd2UgZG9uJ3Qga25vdyBiaXRfZGVwdGguCisgICAgKi8KKyAgIFJBTkRPTUlaRShkYXRhLmZpbGxlcik7CisgICBkYXRhLmZsYWdzID0gcmFuZG9tX2Nob2ljZSgpOworCisgICBwbmdfc2V0X2ZpbGxlcihwcCwgZGF0YS5maWxsZXIsIGRhdGEuZmxhZ3MpOworCisgICAvKiBUaGUgc3RhbmRhcmQgZGlzcGxheSBoYW5kbGluZyBzdHVmZiBhbHNvIG5lZWRzIHRvIGtub3cgdGhhdAorICAgICogdGhlcmUgaXMgYSBmaWxsZXIsIHNvIHNldCB0aGF0IGhlcmUuCisgICAgKi8KKyAgIHRoYXQtPnRoaXMuZmlsbGVyID0gMTsKKworICAgdGhpcy0+bmV4dC0+c2V0KHRoaXMtPm5leHQsIHRoYXQsIHBwLCBwaSk7Cit9CisKK3N0YXRpYyB2b2lkCitpbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9maWxsZXJfbW9kKGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKKyAgICBpbWFnZV9waXhlbCAqdGhhdCwgcG5nX2NvbnN0X3N0cnVjdHAgcHAsCisgICAgY29uc3QgdHJhbnNmb3JtX2Rpc3BsYXkgKmRpc3BsYXkpCit7CisgICBpZiAodGhhdC0+Yml0X2RlcHRoID49IDggJiYKKyAgICAgICAodGhhdC0+Y29sb3VyX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCIHx8CisgICAgICAgIHRoYXQtPmNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpKQorICAgeworICAgICAgY29uc3QgdW5zaWduZWQgaW50IG1heCA9ICgxVSA8PCB0aGF0LT5iaXRfZGVwdGgpLTE7CisgICAgICB0aGF0LT5hbHBoYSA9IGRhdGEuZmlsbGVyICYgbWF4OworICAgICAgdGhhdC0+YWxwaGFmID0gKChkb3VibGUpdGhhdC0+YWxwaGEpIC8gbWF4OworICAgICAgdGhhdC0+YWxwaGFlID0gMDsKKworICAgICAgLyogVGhlIGZpbGxlciBoYXMgYmVlbiBzdG9yZWQgaW4gdGhlIGFscGhhIGNoYW5uZWwsIHdlIG11c3QgcmVjb3JkCisgICAgICAgKiB0aGF0IHRoaXMgaGFzIGJlZW4gZG9uZSBmb3IgdGhlIGNoZWNraW5nIGxhdGVyIG9uLCB0aGUgY29sb3IKKyAgICAgICAqIHR5cGUgaXMgZmFrZWQgdG8gaGF2ZSBhbiBhbHBoYSBjaGFubmVsLCBidXQgbGlicG5nIHdvbid0IHJlcG9ydAorICAgICAgICogdGhpczsgdGhlIGFwcCBoYXMgdG8ga25vdyB0aGUgZXh0cmEgY2hhbm5lbCBpcyB0aGVyZSBhbmQgdGhpcworICAgICAgICogd2FzIHJlY29yZGluZyBpbiBzdGFuZGFyZF9kaXNwbGF5OjpmaWxsZXIgYWJvdmUuCisgICAgICAgKi8KKyAgICAgIHRoYXQtPmNvbG91cl90eXBlIHw9IDQ7IC8qIGFscGhhIGFkZGVkICovCisgICAgICB0aGF0LT5hbHBoYV9maXJzdCA9IGRhdGEuZmxhZ3MgPT0gUE5HX0ZJTExFUl9CRUZPUkU7CisgICB9CisKKyAgIHRoaXMtPm5leHQtPm1vZCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgZGlzcGxheSk7Cit9CisKK3N0YXRpYyBpbnQKK2ltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X2ZpbGxlcl9hZGQoaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAorICAgIGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqKnRoYXQsIHBuZ19ieXRlIGNvbG91cl90eXBlLCBwbmdfYnl0ZSBiaXRfZGVwdGgpCit7CisgICB0aGlzLT5uZXh0ID0gKnRoYXQ7CisgICAqdGhhdCA9IHRoaXM7CisKKyAgIHJldHVybiBiaXRfZGVwdGggPj0gOCAmJiAoY29sb3VyX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCIHx8CisgICAgICAgICAgIGNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpOworfQorCisjdW5kZWYgZGF0YQorSVQoZmlsbGVyKTsKKyN1bmRlZiBQVAorI2RlZmluZSBQVCBJVFNUUlVDVChmaWxsZXIpCisKKy8qIHBuZ19zZXRfYWRkX2FscGhhLCAocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgZmlsbGVyLCBpbnQgZmxhZ3MpKTsgKi8KKy8qIEFkZCBhbiBhbHBoYSBieXRlIHRvIDgtYml0IEdyYXkgb3IgMjQtYml0IFJHQiBpbWFnZXMuICovCisjZGVmaW5lIGRhdGEgSVREQVRBKGFkZF9hbHBoYSkKK3N0YXRpYyBzdHJ1Y3QKK3sKKyAgIHBuZ191aW50XzMyIGZpbGxlcjsKKyAgIGludCAgICAgICAgIGZsYWdzOworfSBkYXRhOworCitzdGF0aWMgdm9pZAoraW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfYWRkX2FscGhhX3NldChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCisgICAgdHJhbnNmb3JtX2Rpc3BsYXkgKnRoYXQsIHBuZ19zdHJ1Y3RwIHBwLCBwbmdfaW5mb3AgcGkpCit7CisgICAvKiBOZWVkIGEgcmFuZG9tIGNob2ljZSBmb3IgJ2JlZm9yZScgYW5kICdhZnRlcicgYXMgd2VsbCBhcyBmb3IgdGhlCisgICAgKiBmaWxsZXIuICBUaGUgJ2ZpbGxlcicgdmFsdWUgaGFzIGFsbCAzMiBiaXRzIHNldCwgYnV0IG9ubHkgYml0X2RlcHRoCisgICAgKiB3aWxsIGJlIHVzZWQuICBBdCB0aGlzIHBvaW50IHdlIGRvbid0IGtub3cgYml0X2RlcHRoLgorICAgICovCisgICBSQU5ET01JWkUoZGF0YS5maWxsZXIpOworICAgZGF0YS5mbGFncyA9IHJhbmRvbV9jaG9pY2UoKTsKKworICAgcG5nX3NldF9hZGRfYWxwaGEocHAsIGRhdGEuZmlsbGVyLCBkYXRhLmZsYWdzKTsKKyAgIHRoaXMtPm5leHQtPnNldCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgcGkpOworfQorCitzdGF0aWMgdm9pZAoraW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfYWRkX2FscGhhX21vZChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCisgICAgaW1hZ2VfcGl4ZWwgKnRoYXQsIHBuZ19jb25zdF9zdHJ1Y3RwIHBwLAorICAgIGNvbnN0IHRyYW5zZm9ybV9kaXNwbGF5ICpkaXNwbGF5KQoreworICAgaWYgKHRoYXQtPmJpdF9kZXB0aCA+PSA4ICYmCisgICAgICAgKHRoYXQtPmNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiB8fAorICAgICAgICB0aGF0LT5jb2xvdXJfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKSkKKyAgIHsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBtYXggPSAoMVUgPDwgdGhhdC0+Yml0X2RlcHRoKS0xOworICAgICAgdGhhdC0+YWxwaGEgPSBkYXRhLmZpbGxlciAmIG1heDsKKyAgICAgIHRoYXQtPmFscGhhZiA9ICgoZG91YmxlKXRoYXQtPmFscGhhKSAvIG1heDsKKyAgICAgIHRoYXQtPmFscGhhZSA9IDA7CisKKyAgICAgIHRoYXQtPmNvbG91cl90eXBlIHw9IDQ7IC8qIGFscGhhIGFkZGVkICovCisgICAgICB0aGF0LT5hbHBoYV9maXJzdCA9IGRhdGEuZmxhZ3MgPT0gUE5HX0ZJTExFUl9CRUZPUkU7CisgICB9CisKKyAgIHRoaXMtPm5leHQtPm1vZCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgZGlzcGxheSk7Cit9CisKK3N0YXRpYyBpbnQKK2ltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X2FkZF9hbHBoYV9hZGQoaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAorICAgIGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqKnRoYXQsIHBuZ19ieXRlIGNvbG91cl90eXBlLCBwbmdfYnl0ZSBiaXRfZGVwdGgpCit7CisgICB0aGlzLT5uZXh0ID0gKnRoYXQ7CisgICAqdGhhdCA9IHRoaXM7CisKKyAgIHJldHVybiBiaXRfZGVwdGggPj0gOCAmJiAoY29sb3VyX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCIHx8CisgICAgICAgICAgIGNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpOworfQorCisjdW5kZWYgZGF0YQorSVQoYWRkX2FscGhhKTsKKyN1bmRlZiBQVAorI2RlZmluZSBQVCBJVFNUUlVDVChhZGRfYWxwaGEpCisKKyNlbmRpZiAvKiBQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVEICovCisKKy8qIHBuZ19zZXRfcGFja2luZyAqLworI2lmZGVmIFBOR19SRUFEX1BBQ0tfU1VQUE9SVEVECisvKiBVc2UgMSBieXRlIHBlciBwaXhlbCBpbiAxLCAyLCBvciA0LWJpdCBkZXB0aCBmaWxlcy4KKyAqCisgKiAgcG5nX3NldF9wYWNraW5nKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQorICoKKyAqIFRoaXMgc2hvdWxkIG9ubHkgYWZmZWN0IGdyYXlzY2FsZSBhbmQgcGFsZXR0ZSBpbWFnZXMgd2l0aCBsZXNzIHRoYW4gOCBiaXRzCisgKiBwZXIgcGl4ZWwuCisgKi8KK3N0YXRpYyB2b2lkCitpbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9wYWNraW5nX3NldChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCisgICAgdHJhbnNmb3JtX2Rpc3BsYXkgKnRoYXQsIHBuZ19zdHJ1Y3RwIHBwLCBwbmdfaW5mb3AgcGkpCit7CisgICBwbmdfc2V0X3BhY2tpbmcocHApOworICAgdGhhdC0+dW5wYWNrZWQgPSAxOworICAgdGhpcy0+bmV4dC0+c2V0KHRoaXMtPm5leHQsIHRoYXQsIHBwLCBwaSk7Cit9CisKK3N0YXRpYyB2b2lkCitpbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9wYWNraW5nX21vZChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCisgICAgaW1hZ2VfcGl4ZWwgKnRoYXQsIHBuZ19jb25zdF9zdHJ1Y3RwIHBwLAorICAgIGNvbnN0IHRyYW5zZm9ybV9kaXNwbGF5ICpkaXNwbGF5KQoreworICAgLyogVGhlIGdlbmVyYWwgZXhwYW5kIGNhc2UgZGVwZW5kcyBvbiB3aGF0IHRoZSBjb2xvdXIgdHlwZSBpcywKKyAgICAqIGxvdyBiaXQtZGVwdGggcGl4ZWwgdmFsdWVzIGFyZSB1bnBhY2tlZCBpbnRvIGJ5dGVzIHdpdGhvdXQKKyAgICAqIHNjYWxpbmcsIHNvIHNhbXBsZV9kZXB0aCBpcyBub3QgY2hhbmdlZC4KKyAgICAqLworICAgaWYgKHRoYXQtPmJpdF9kZXB0aCA8IDgpIC8qIGdyYXlzY2FsZSBvciBwYWxldHRlICovCisgICAgICB0aGF0LT5iaXRfZGVwdGggPSA4OworCisgICB0aGlzLT5uZXh0LT5tb2QodGhpcy0+bmV4dCwgdGhhdCwgcHAsIGRpc3BsYXkpOworfQorCitzdGF0aWMgaW50CitpbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9wYWNraW5nX2FkZChpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCisgICAgY29uc3QgaW1hZ2VfdHJhbnNmb3JtICoqdGhhdCwgcG5nX2J5dGUgY29sb3VyX3R5cGUsIHBuZ19ieXRlIGJpdF9kZXB0aCkKK3sKKyAgIFVOVVNFRChjb2xvdXJfdHlwZSkKKworICAgdGhpcy0+bmV4dCA9ICp0aGF0OworICAgKnRoYXQgPSB0aGlzOworCisgICAvKiBOb3RoaW5nIHNob3VsZCBoYXBwZW4gdW5sZXNzIHRoZSBiaXQgZGVwdGggaXMgbGVzcyB0aGFuIDg6ICovCisgICByZXR1cm4gYml0X2RlcHRoIDwgODsKK30KKworSVQocGFja2luZyk7CisjdW5kZWYgUFQKKyNkZWZpbmUgUFQgSVRTVFJVQ1QocGFja2luZykKKworI2VuZGlmIC8qIFBOR19SRUFEX1BBQ0tfU1VQUE9SVEVEICovCisKKy8qIHBuZ19zZXRfcGFja3N3YXAgKi8KKyNpZmRlZiBQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQKKy8qIFN3YXAgcGl4ZWxzIHBhY2tlZCBpbnRvIGJ5dGVzOyByZXZlcnNlcyB0aGUgb3JkZXIgb24gc2NyZWVuIHNvIHRoYXQKKyAqIHRoZSBoaWdoIG9yZGVyIGJpdHMgY29ycmVzcG9uZCB0byB0aGUgcmlnaHRtb3N0IHBpeGVscy4KKyAqCisgKiAgcG5nX3NldF9wYWNrc3dhcChwbmdfc3RydWN0cnAgcG5nX3B0cikKKyAqLworc3RhdGljIHZvaWQKK2ltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X3BhY2tzd2FwX3NldChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCisgICAgdHJhbnNmb3JtX2Rpc3BsYXkgKnRoYXQsIHBuZ19zdHJ1Y3RwIHBwLCBwbmdfaW5mb3AgcGkpCit7CisgICBwbmdfc2V0X3BhY2tzd2FwKHBwKTsKKyAgIHRoYXQtPnRoaXMubGl0dGxlZW5kaWFuID0gMTsKKyAgIHRoaXMtPm5leHQtPnNldCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgcGkpOworfQorCitzdGF0aWMgdm9pZAoraW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfcGFja3N3YXBfbW9kKGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKKyAgICBpbWFnZV9waXhlbCAqdGhhdCwgcG5nX2NvbnN0X3N0cnVjdHAgcHAsCisgICAgY29uc3QgdHJhbnNmb3JtX2Rpc3BsYXkgKmRpc3BsYXkpCit7CisgICBpZiAodGhhdC0+Yml0X2RlcHRoIDwgOCkKKyAgICAgIHRoYXQtPmxpdHRsZWVuZGlhbiA9IDE7CisKKyAgIHRoaXMtPm5leHQtPm1vZCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgZGlzcGxheSk7Cit9CisKK3N0YXRpYyBpbnQKK2ltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X3BhY2tzd2FwX2FkZChpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCisgICAgY29uc3QgaW1hZ2VfdHJhbnNmb3JtICoqdGhhdCwgcG5nX2J5dGUgY29sb3VyX3R5cGUsIHBuZ19ieXRlIGJpdF9kZXB0aCkKK3sKKyAgIFVOVVNFRChjb2xvdXJfdHlwZSkKKworICAgdGhpcy0+bmV4dCA9ICp0aGF0OworICAgKnRoYXQgPSB0aGlzOworCisgICByZXR1cm4gYml0X2RlcHRoIDwgODsKK30KKworSVQocGFja3N3YXApOworI3VuZGVmIFBUCisjZGVmaW5lIFBUIElUU1RSVUNUKHBhY2tzd2FwKQorCisjZW5kaWYgLyogUE5HX1JFQURfUEFDS1NXQVBfU1VQUE9SVEVEICovCisKKworLyogcG5nX3NldF9pbnZlcnRfbW9ubyAqLworI2lmZGVmIFBOR19SRUFEX0lOVkVSVF9NT05PX1NVUFBPUlRFRAorLyogSW52ZXJ0IHRoZSBncmF5IGNoYW5uZWwKKyAqCisgKiAgcG5nX3NldF9pbnZlcnRfbW9ubyhwbmdfc3RydWN0cnAgcG5nX3B0cikKKyAqLworc3RhdGljIHZvaWQKK2ltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X2ludmVydF9tb25vX3NldChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCisgICAgdHJhbnNmb3JtX2Rpc3BsYXkgKnRoYXQsIHBuZ19zdHJ1Y3RwIHBwLCBwbmdfaW5mb3AgcGkpCit7CisgICBwbmdfc2V0X2ludmVydF9tb25vKHBwKTsKKyAgIHRoaXMtPm5leHQtPnNldCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgcGkpOworfQorCitzdGF0aWMgdm9pZAoraW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfaW52ZXJ0X21vbm9fbW9kKGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKKyAgICBpbWFnZV9waXhlbCAqdGhhdCwgcG5nX2NvbnN0X3N0cnVjdHAgcHAsCisgICAgY29uc3QgdHJhbnNmb3JtX2Rpc3BsYXkgKmRpc3BsYXkpCit7CisgICBpZiAodGhhdC0+Y29sb3VyX3R5cGUgJiA0KQorICAgICAgdGhhdC0+bW9ub19pbnZlcnRlZCA9IDE7CisKKyAgIHRoaXMtPm5leHQtPm1vZCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgZGlzcGxheSk7Cit9CisKK3N0YXRpYyBpbnQKK2ltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X2ludmVydF9tb25vX2FkZChpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCisgICAgY29uc3QgaW1hZ2VfdHJhbnNmb3JtICoqdGhhdCwgcG5nX2J5dGUgY29sb3VyX3R5cGUsIHBuZ19ieXRlIGJpdF9kZXB0aCkKK3sKKyAgIFVOVVNFRChiaXRfZGVwdGgpCisKKyAgIHRoaXMtPm5leHQgPSAqdGhhdDsKKyAgICp0aGF0ID0gdGhpczsKKworICAgLyogT25seSBoYXMgYW4gZWZmZWN0IG9uIHBpeGVscyB3aXRoIG5vIGNvbG91cjogKi8KKyAgIHJldHVybiAoY29sb3VyX3R5cGUgJiAyKSA9PSAwOworfQorCitJVChpbnZlcnRfbW9ubyk7CisjdW5kZWYgUFQKKyNkZWZpbmUgUFQgSVRTVFJVQ1QoaW52ZXJ0X21vbm8pCisKKyNlbmRpZiAvKiBQTkdfUkVBRF9JTlZFUlRfTU9OT19TVVBQT1JURUQgKi8KKworI2lmZGVmIFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRAorLyogcG5nX3NldF9zaGlmdChwbmdfc3RydWN0cCwgcG5nX2NvbnN0X2NvbG9yXzhwIHRydWVfYml0cykKKyAqCisgKiBUaGUgb3V0cHV0IHBpeGVscyB3aWxsIGJlIHNoaWZ0ZWQgYnkgdGhlIGdpdmVuIHRydWVfYml0cworICogdmFsdWVzLgorICovCisjZGVmaW5lIGRhdGEgSVREQVRBKHNoaWZ0KQorc3RhdGljIHBuZ19jb2xvcl84IGRhdGE7CisKK3N0YXRpYyB2b2lkCitpbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9zaGlmdF9zZXQoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAorICAgIHRyYW5zZm9ybV9kaXNwbGF5ICp0aGF0LCBwbmdfc3RydWN0cCBwcCwgcG5nX2luZm9wIHBpKQoreworICAgLyogR2V0IGEgcmFuZG9tIHNldCBvZiBzaGlmdHMuICBUaGUgc2hpZnRzIG5lZWQgdG8gZG8gc29tZXRoaW5nCisgICAgKiB0byB0ZXN0IHRoZSB0cmFuc2Zvcm0sIHNvIHRoZXkgYXJlIGxpbWl0ZWQgdG8gdGhlIGJpdCBkZXB0aAorICAgICogb2YgdGhlIGlucHV0IGltYWdlLiAgTm90aWNlIHRoYXQgaW4gdGhlIGZvbGxvd2luZyB0aGUgJ2dyYXknCisgICAgKiBmaWVsZCBpcyByYW5kb21pemVkIGluZGVwZW5kZW50bHkuICBUaGlzIGFjdHMgYXMgYSBjaGVjayB0aGF0CisgICAgKiBsaWJwbmcgZG9lcyB1c2UgdGhlIGNvcnJlY3QgZmllbGQuCisgICAgKi8KKyAgIGNvbnN0IHVuc2lnbmVkIGludCBkZXB0aCA9IHRoYXQtPnRoaXMuYml0X2RlcHRoOworCisgICBkYXRhLnJlZCA9IChwbmdfYnl0ZSkvKlNBRkUqLyhyYW5kb21fbW9kKGRlcHRoKSsxKTsKKyAgIGRhdGEuZ3JlZW4gPSAocG5nX2J5dGUpLypTQUZFKi8ocmFuZG9tX21vZChkZXB0aCkrMSk7CisgICBkYXRhLmJsdWUgPSAocG5nX2J5dGUpLypTQUZFKi8ocmFuZG9tX21vZChkZXB0aCkrMSk7CisgICBkYXRhLmdyYXkgPSAocG5nX2J5dGUpLypTQUZFKi8ocmFuZG9tX21vZChkZXB0aCkrMSk7CisgICBkYXRhLmFscGhhID0gKHBuZ19ieXRlKS8qU0FGRSovKHJhbmRvbV9tb2QoZGVwdGgpKzEpOworCisgICBwbmdfc2V0X3NoaWZ0KHBwLCAmZGF0YSk7CisgICB0aGlzLT5uZXh0LT5zZXQodGhpcy0+bmV4dCwgdGhhdCwgcHAsIHBpKTsKK30KKworc3RhdGljIHZvaWQKK2ltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X3NoaWZ0X21vZChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCisgICAgaW1hZ2VfcGl4ZWwgKnRoYXQsIHBuZ19jb25zdF9zdHJ1Y3RwIHBwLAorICAgIGNvbnN0IHRyYW5zZm9ybV9kaXNwbGF5ICpkaXNwbGF5KQoreworICAgLyogQ29weSB0aGUgY29ycmVjdCB2YWx1ZXMgaW50byB0aGUgc0JJVCBmaWVsZHMsIGxpYnBuZyBkb2VzIG5vdCBkbworICAgICogYW55dGhpbmcgdG8gcGFsZXR0ZSBkYXRhOgorICAgICovCisgICBpZiAodGhhdC0+Y29sb3VyX3R5cGUgIT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgIHsKKyAgICAgICB0aGF0LT5zaWdfYml0cyA9IDE7CisKKyAgICAgICAvKiBUaGUgc0JJVCBmaWVsZHMgYXJlIHJlc2V0IHRvIHRoZSB2YWx1ZXMgcHJldmlvdXNseSBzZW50IHRvCisgICAgICAgICogcG5nX3NldF9zaGlmdCBhY2NvcmRpbmcgdG8gdGhlIGNvbG91ciB0eXBlLgorICAgICAgICAqIGRvZXMuCisgICAgICAgICovCisgICAgICAgaWYgKHRoYXQtPmNvbG91cl90eXBlICYgMikgLyogUkdCIGNoYW5uZWxzICovCisgICAgICAgeworICAgICAgICAgIHRoYXQtPnJlZF9zQklUID0gZGF0YS5yZWQ7CisgICAgICAgICAgdGhhdC0+Z3JlZW5fc0JJVCA9IGRhdGEuZ3JlZW47CisgICAgICAgICAgdGhhdC0+Ymx1ZV9zQklUID0gZGF0YS5ibHVlOworICAgICAgIH0KKworICAgICAgIGVsc2UgLyogT25lIGdyZXkgY2hhbm5lbCAqLworICAgICAgICAgIHRoYXQtPnJlZF9zQklUID0gdGhhdC0+Z3JlZW5fc0JJVCA9IHRoYXQtPmJsdWVfc0JJVCA9IGRhdGEuZ3JheTsKKworICAgICAgIHRoYXQtPmFscGhhX3NCSVQgPSBkYXRhLmFscGhhOworICAgfQorCisgICB0aGlzLT5uZXh0LT5tb2QodGhpcy0+bmV4dCwgdGhhdCwgcHAsIGRpc3BsYXkpOworfQorCitzdGF0aWMgaW50CitpbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9zaGlmdF9hZGQoaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAorICAgIGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqKnRoYXQsIHBuZ19ieXRlIGNvbG91cl90eXBlLCBwbmdfYnl0ZSBiaXRfZGVwdGgpCit7CisgICBVTlVTRUQoYml0X2RlcHRoKQorCisgICB0aGlzLT5uZXh0ID0gKnRoYXQ7CisgICAqdGhhdCA9IHRoaXM7CisKKyAgIHJldHVybiBjb2xvdXJfdHlwZSAhPSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFOworfQorCitJVChzaGlmdCk7CisjdW5kZWYgUFQKKyNkZWZpbmUgUFQgSVRTVFJVQ1Qoc2hpZnQpCisKKyNlbmRpZiAvKiBQTkdfUkVBRF9TSElGVF9TVVBQT1JURUQgKi8KKworI2lmZGVmIFRISVNfSVNfVEhFX1BST0ZPUk1BCitzdGF0aWMgdm9pZAoraW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfQF9zZXQoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAorICAgIHRyYW5zZm9ybV9kaXNwbGF5ICp0aGF0LCBwbmdfc3RydWN0cCBwcCwgcG5nX2luZm9wIHBpKQoreworICAgcG5nX3NldF9AKHBwKTsKKyAgIHRoaXMtPm5leHQtPnNldCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgcGkpOworfQorCitzdGF0aWMgdm9pZAoraW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfQF9tb2QoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAorICAgIGltYWdlX3BpeGVsICp0aGF0LCBwbmdfY29uc3Rfc3RydWN0cCBwcCwKKyAgICBjb25zdCB0cmFuc2Zvcm1fZGlzcGxheSAqZGlzcGxheSkKK3sKKyAgIHRoaXMtPm5leHQtPm1vZCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgZGlzcGxheSk7Cit9CisKK3N0YXRpYyBpbnQKK2ltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X0BfYWRkKGltYWdlX3RyYW5zZm9ybSAqdGhpcywKKyAgICBjb25zdCBpbWFnZV90cmFuc2Zvcm0gKip0aGF0LCBwbmdfYnl0ZSBjb2xvdXJfdHlwZSwgcG5nX2J5dGUgYml0X2RlcHRoKQoreworICAgdGhpcy0+bmV4dCA9ICp0aGF0OworICAgKnRoYXQgPSB0aGlzOworCisgICByZXR1cm4gMTsKK30KKworSVQoQCk7CisjZW5kaWYKKworCisvKiBUaGlzIG1heSBqdXN0IGJlICdlbmQnIGlmIGFsbCB0aGUgdHJhbnNmb3JtcyBhcmUgZGlzYWJsZWQhICovCitzdGF0aWMgaW1hZ2VfdHJhbnNmb3JtICpjb25zdCBpbWFnZV90cmFuc2Zvcm1fZmlyc3QgPSAmUFQ7CisKK3N0YXRpYyB2b2lkCit0cmFuc2Zvcm1fZW5hYmxlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAvKiBFdmVyeXRoaW5nIHN0YXJ0cyBvdXQgZW5hYmxlZCwgc28gaWYgd2Ugc2VlIGFuICdlbmFibGUnIGRpc2FibGVkCisgICAgKiBldmVyeXRoaW5nIGVsc2UgdGhlIGZpcnN0IHRpbWUgcm91bmQuCisgICAgKi8KKyAgIHN0YXRpYyBpbnQgYWxsX2Rpc2FibGVkID0gMDsKKyAgIGludCBmb3VuZF9pdCA9IDA7CisgICBpbWFnZV90cmFuc2Zvcm0gKmxpc3QgPSBpbWFnZV90cmFuc2Zvcm1fZmlyc3Q7CisKKyAgIHdoaWxlIChsaXN0ICE9ICZpbWFnZV90cmFuc2Zvcm1fZW5kKQorICAgeworICAgICAgaWYgKHN0cmNtcChsaXN0LT5uYW1lLCBuYW1lKSA9PSAwKQorICAgICAgeworICAgICAgICAgbGlzdC0+ZW5hYmxlID0gMTsKKyAgICAgICAgIGZvdW5kX2l0ID0gMTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFhbGxfZGlzYWJsZWQpCisgICAgICAgICBsaXN0LT5lbmFibGUgPSAwOworCisgICAgICBsaXN0ID0gbGlzdC0+bGlzdDsKKyAgIH0KKworICAgYWxsX2Rpc2FibGVkID0gMTsKKworICAgaWYgKCFmb3VuZF9pdCkKKyAgIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAicG5ndmFsaWQ6IC0tdHJhbnNmb3JtLWVuYWJsZT0lczogdW5rbm93biB0cmFuc2Zvcm1cbiIsCisgICAgICAgICBuYW1lKTsKKyAgICAgIGV4aXQoOTkpOworICAgfQorfQorCitzdGF0aWMgdm9pZAordHJhbnNmb3JtX2Rpc2FibGUoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgIGltYWdlX3RyYW5zZm9ybSAqbGlzdCA9IGltYWdlX3RyYW5zZm9ybV9maXJzdDsKKworICAgd2hpbGUgKGxpc3QgIT0gJmltYWdlX3RyYW5zZm9ybV9lbmQpCisgICB7CisgICAgICBpZiAoc3RyY21wKGxpc3QtPm5hbWUsIG5hbWUpID09IDApCisgICAgICB7CisgICAgICAgICBsaXN0LT5lbmFibGUgPSAwOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBsaXN0ID0gbGlzdC0+bGlzdDsKKyAgIH0KKworICAgZnByaW50ZihzdGRlcnIsICJwbmd2YWxpZDogLS10cmFuc2Zvcm0tZGlzYWJsZT0lczogdW5rbm93biB0cmFuc2Zvcm1cbiIsCisgICAgICBuYW1lKTsKKyAgIGV4aXQoOTkpOworfQorCitzdGF0aWMgdm9pZAoraW1hZ2VfdHJhbnNmb3JtX3Jlc2V0X2NvdW50KHZvaWQpCit7CisgICBpbWFnZV90cmFuc2Zvcm0gKm5leHQgPSBpbWFnZV90cmFuc2Zvcm1fZmlyc3Q7CisgICBpbnQgY291bnQgPSAwOworCisgICB3aGlsZSAobmV4dCAhPSAmaW1hZ2VfdHJhbnNmb3JtX2VuZCkKKyAgIHsKKyAgICAgIG5leHQtPmxvY2FsX3VzZSA9IDA7CisgICAgICBuZXh0LT5uZXh0ID0gMDsKKyAgICAgIG5leHQgPSBuZXh0LT5saXN0OworICAgICAgKytjb3VudDsKKyAgIH0KKworICAgLyogVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgd2UgZXZlcnkgaGF2ZSBtb3JlIHRoYW4gMzIgdHJhbnNmb3JtcyAoZXhjbHVkaW5nCisgICAgKiB0aGUgZW5kKSBpbiB0aGUgbGlzdC4KKyAgICAqLworICAgaWYgKGNvdW50ID4gMzIpIGFib3J0KCk7Cit9CisKK3N0YXRpYyBpbnQKK2ltYWdlX3RyYW5zZm9ybV90ZXN0X2NvdW50ZXIocG5nX3VpbnRfMzIgY291bnRlciwgdW5zaWduZWQgaW50IG1heCkKK3sKKyAgIC8qIFRlc3QgdGhlIGxpc3QgdG8gc2VlIGlmIHRoZXJlIGlzIGFueSBwb2ludCBjb250aW5pbmcsIGdpdmVuIGEgY3VycmVudAorICAgICogY291bnRlciBhbmQgYSAnbWF4JyB2YWx1ZS4KKyAgICAqLworICAgaW1hZ2VfdHJhbnNmb3JtICpuZXh0ID0gaW1hZ2VfdHJhbnNmb3JtX2ZpcnN0OworCisgICB3aGlsZSAobmV4dCAhPSAmaW1hZ2VfdHJhbnNmb3JtX2VuZCkKKyAgIHsKKyAgICAgIC8qIEZvciBtYXggMCBvciAxIGNvbnRpbnVlIHVudGlsIHRoZSBjb3VudGVyIG92ZXJmbG93czogKi8KKyAgICAgIGNvdW50ZXIgPj49IDE7CisKKyAgICAgIC8qIENvbnRpbnVlIGlmIGFueSBlbnRyeSBoYXNuJ3QgcmVhY2tlZCB0aGUgbWF4LiAqLworICAgICAgaWYgKG1heCA+IDEgJiYgbmV4dC0+bG9jYWxfdXNlIDwgbWF4KQorICAgICAgICAgcmV0dXJuIDE7CisgICAgICBuZXh0ID0gbmV4dC0+bGlzdDsKKyAgIH0KKworICAgcmV0dXJuIG1heCA8PSAxICYmIGNvdW50ZXIgPT0gMDsKK30KKworc3RhdGljIHBuZ191aW50XzMyCitpbWFnZV90cmFuc2Zvcm1fYWRkKGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqKnRoaXMsIHVuc2lnbmVkIGludCBtYXgsCisgICBwbmdfdWludF8zMiBjb3VudGVyLCBjaGFyICpuYW1lLCBzaXplX3Qgc2l6ZW9mX25hbWUsIHNpemVfdCAqcG9zLAorICAgcG5nX2J5dGUgY29sb3VyX3R5cGUsIHBuZ19ieXRlIGJpdF9kZXB0aCkKK3sKKyAgIGZvciAoOzspIC8qIHVudGlsIHdlIG1hbmFnZSB0byBhZGQgc29tZXRoaW5nICovCisgICB7CisgICAgICBwbmdfdWludF8zMiBtYXNrOworICAgICAgaW1hZ2VfdHJhbnNmb3JtICpsaXN0OworCisgICAgICAvKiBGaW5kIHRoZSBuZXh0IGNvdW50ZXIgdmFsdWUsIGlmIHRoZSBjb3VudGVyIGlzIHplcm8gdGhpcyBpcyB0aGUgc3RhcnQKKyAgICAgICAqIG9mIHRoZSBsaXN0LiAgVGhpcyByb3V0aW5lIGFsd2F5cyByZXR1cm5zIHRoZSBjdXJyZW50IGNvdW50ZXIgKG5vdCB0aGUKKyAgICAgICAqIG5leHQpIHNvIGl0IHJldHVybnMgMCBhdCB0aGUgZW5kIGFuZCBleHBlY3RzIDAgYXQgdGhlIGJlZ2lubmluZy4KKyAgICAgICAqLworICAgICAgaWYgKGNvdW50ZXIgPT0gMCkgLyogZmlyc3QgdGltZSAqLworICAgICAgeworICAgICAgICAgaW1hZ2VfdHJhbnNmb3JtX3Jlc2V0X2NvdW50KCk7CisgICAgICAgICBpZiAobWF4IDw9IDEpCisgICAgICAgICAgICBjb3VudGVyID0gMTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvdW50ZXIgPSByYW5kb21fMzIoKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgLyogYWR2YW5jZSB0aGUgY291bnRlciAqLworICAgICAgeworICAgICAgICAgc3dpdGNoIChtYXgpCisgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDA6ICArK2NvdW50ZXI7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiAgY291bnRlciA8PD0gMTsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiBjb3VudGVyID0gcmFuZG9tXzMyKCk7IGJyZWFrOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBOb3cgYWRkIGFsbCB0aGVzZSBpdGVtcywgaWYgcG9zc2libGUgKi8KKyAgICAgICp0aGlzID0gJmltYWdlX3RyYW5zZm9ybV9lbmQ7CisgICAgICBsaXN0ID0gaW1hZ2VfdHJhbnNmb3JtX2ZpcnN0OworICAgICAgbWFzayA9IDE7CisKKyAgICAgIC8qIEdvIHRocm91Z2ggdGhlIHdob2xlIGxpc3QgYWRkaW5nIGFueXRoaW5nIHRoYXQgdGhlIGNvdW50ZXIgc2VsZWN0czogKi8KKyAgICAgIHdoaWxlIChsaXN0ICE9ICZpbWFnZV90cmFuc2Zvcm1fZW5kKQorICAgICAgeworICAgICAgICAgaWYgKChjb3VudGVyICYgbWFzaykgIT0gMCAmJiBsaXN0LT5lbmFibGUgJiYKKyAgICAgICAgICAgICAobWF4ID09IDAgfHwgbGlzdC0+bG9jYWxfdXNlIDwgbWF4KSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENhbmRpZGF0ZSB0byBhZGQ6ICovCisgICAgICAgICAgICBpZiAobGlzdC0+YWRkKGxpc3QsIHRoaXMsIGNvbG91cl90eXBlLCBiaXRfZGVwdGgpIHx8IG1heCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLyogQWRkZWQsIHNvIGFkZCB0byB0aGUgbmFtZSB0b28uICovCisgICAgICAgICAgICAgICAqcG9zID0gc2FmZWNhdChuYW1lLCBzaXplb2ZfbmFtZSwgKnBvcywgIiArIik7CisgICAgICAgICAgICAgICAqcG9zID0gc2FmZWNhdChuYW1lLCBzaXplb2ZfbmFtZSwgKnBvcywgbGlzdC0+bmFtZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8qIE5vdCB1c2VmdWwgYW5kIG1heD4wLCBzbyByZW1vdmUgaXQgZnJvbSAqdGhpczogKi8KKyAgICAgICAgICAgICAgICp0aGlzID0gbGlzdC0+bmV4dDsKKyAgICAgICAgICAgICAgIGxpc3QtPm5leHQgPSAwOworCisgICAgICAgICAgICAgICAvKiBBbmQsIHNpbmNlIHdlIGtub3cgaXQgaXNuJ3QgdXNlZnVsLCBzdG9wIGl0IGJlaW5nIGFkZGVkIGFnYWluCisgICAgICAgICAgICAgICAgKiBpbiB0aGlzIHJ1bjoKKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgbGlzdC0+bG9jYWxfdXNlID0gbWF4OworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICBtYXNrIDw8PSAxOworICAgICAgICAgbGlzdCA9IGxpc3QtPmxpc3Q7CisgICAgICB9CisKKyAgICAgIC8qIE5vdyBpZiBhbnl0aGluZyB3YXMgYWRkZWQgd2UgaGF2ZSBzb21ldGhpbmcgdG8gZG8uICovCisgICAgICBpZiAoKnRoaXMgIT0gJmltYWdlX3RyYW5zZm9ybV9lbmQpCisgICAgICAgICByZXR1cm4gY291bnRlcjsKKworICAgICAgLyogTm90aGluZyBhZGRlZCwgYnV0IHdhcyB0aGVyZSBhbnl0aGluZyBpbiB0aGVyZSB0byBhZGQ/ICovCisgICAgICBpZiAoIWltYWdlX3RyYW5zZm9ybV90ZXN0X2NvdW50ZXIoY291bnRlciwgbWF4KSkKKyAgICAgICAgIHJldHVybiAwOworICAgfQorfQorCitzdGF0aWMgdm9pZAorcGVyZm9ybV90cmFuc2Zvcm1fdGVzdChwbmdfbW9kaWZpZXIgKnBtKQoreworICAgcG5nX2J5dGUgY29sb3VyX3R5cGUgPSAwOworICAgcG5nX2J5dGUgYml0X2RlcHRoID0gMDsKKyAgIHVuc2lnbmVkIGludCBwYWxldHRlX251bWJlciA9IDA7CisKKyAgIHdoaWxlIChuZXh0X2Zvcm1hdCgmY29sb3VyX3R5cGUsICZiaXRfZGVwdGgsICZwYWxldHRlX251bWJlciwgcG0tPnRlc3RfbGJnLAorICAgICAgICAgICAgcG0tPnRlc3RfdFJOUykpCisgICB7CisgICAgICBwbmdfdWludF8zMiBjb3VudGVyID0gMDsKKyAgICAgIHNpemVfdCBiYXNlX3BvczsKKyAgICAgIGNoYXIgbmFtZVs2NF07CisKKyAgICAgIGJhc2VfcG9zID0gc2FmZWNhdChuYW1lLCBzaXplb2YgbmFtZSwgMCwgInRyYW5zZm9ybToiKTsKKworICAgICAgZm9yICg7OykKKyAgICAgIHsKKyAgICAgICAgIHNpemVfdCBwb3MgPSBiYXNlX3BvczsKKyAgICAgICAgIGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqbGlzdCA9IDA7CisKKyAgICAgICAgIC8qICdtYXgnIGlzIGN1cnJlbnRseSBoYXJkd2lyZWQgdG8gJzEnOyB0aGlzIHNob3VsZCBiZSBzZXR0YWJsZSBvbiB0aGUKKyAgICAgICAgICAqIGNvbW1hbmQgbGluZS4KKyAgICAgICAgICAqLworICAgICAgICAgY291bnRlciA9IGltYWdlX3RyYW5zZm9ybV9hZGQoJmxpc3QsIDEvKm1heCovLCBjb3VudGVyLAorICAgICAgICAgICAgbmFtZSwgc2l6ZW9mIG5hbWUsICZwb3MsIGNvbG91cl90eXBlLCBiaXRfZGVwdGgpOworCisgICAgICAgICBpZiAoY291bnRlciA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIC8qIFRoZSBjb21tYW5kIGxpbmUgY2FuIGNoYW5nZSB0aGlzIHRvIGNoZWNraW5nIGludGVybGFjZWQgaW1hZ2VzLiAqLworICAgICAgICAgZG8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBtLT5yZXBlYXQgPSAwOworICAgICAgICAgICAgdHJhbnNmb3JtX3Rlc3QocG0sIEZJTEVJRChjb2xvdXJfdHlwZSwgYml0X2RlcHRoLCBwYWxldHRlX251bWJlciwKKyAgICAgICAgICAgICAgIHBtLT5pbnRlcmxhY2VfdHlwZSwgMCwgMCwgMCksIGxpc3QsIG5hbWUpOworCisgICAgICAgICAgICBpZiAoZmFpbChwbSkpCisgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICB9CisgICAgICAgICB3aGlsZSAocG0tPnJlcGVhdCk7CisgICAgICB9CisgICB9Cit9CisjZW5kaWYgLyogUE5HX1JFQURfVFJBTlNGT1JNU19TVVBQT1JURUQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBHQU1NQSBURVNUUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKKy8qIFJlYWRlciBjYWxsYmFja3MgYW5kIGltcGxlbWVudGF0aW9ucywgd2hlcmUgdGhleSBkaWZmZXIgZnJvbSB0aGUgc3RhbmRhcmQKKyAqIG9uZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IGdhbW1hX2Rpc3BsYXkKK3sKKyAgIHN0YW5kYXJkX2Rpc3BsYXkgdGhpczsKKworICAgLyogUGFyYW1ldGVycyAqLworICAgcG5nX21vZGlmaWVyKiAgICBwbTsKKyAgIGRvdWJsZSAgICAgICAgICAgZmlsZV9nYW1tYTsKKyAgIGRvdWJsZSAgICAgICAgICAgc2NyZWVuX2dhbW1hOworICAgZG91YmxlICAgICAgICAgICBiYWNrZ3JvdW5kX2dhbW1hOworICAgcG5nX2J5dGUgICAgICAgICBzYml0OworICAgaW50ICAgICAgICAgICAgICB0aHJlc2hvbGRfdGVzdDsKKyAgIGludCAgICAgICAgICAgICAgdXNlX2lucHV0X3ByZWNpc2lvbjsKKyAgIGludCAgICAgICAgICAgICAgc2NhbGUxNjsKKyAgIGludCAgICAgICAgICAgICAgZXhwYW5kMTY7CisgICBpbnQgICAgICAgICAgICAgIGRvX2JhY2tncm91bmQ7CisgICBwbmdfY29sb3JfMTYgICAgIGJhY2tncm91bmRfY29sb3I7CisKKyAgIC8qIExvY2FsIHZhcmlhYmxlcyAqLworICAgZG91YmxlICAgICAgIG1heGVycm91dDsKKyAgIGRvdWJsZSAgICAgICBtYXhlcnJwYzsKKyAgIGRvdWJsZSAgICAgICBtYXhlcnJhYnM7Cit9IGdhbW1hX2Rpc3BsYXk7CisKKyNkZWZpbmUgQUxQSEFfTU9ERV9PRkZTRVQgNAorCitzdGF0aWMgdm9pZAorZ2FtbWFfZGlzcGxheV9pbml0KGdhbW1hX2Rpc3BsYXkgKmRwLCBwbmdfbW9kaWZpZXIgKnBtLCBwbmdfdWludF8zMiBpZCwKKyAgICBkb3VibGUgZmlsZV9nYW1tYSwgZG91YmxlIHNjcmVlbl9nYW1tYSwgcG5nX2J5dGUgc2JpdCwgaW50IHRocmVzaG9sZF90ZXN0LAorICAgIGludCB1c2VfaW5wdXRfcHJlY2lzaW9uLCBpbnQgc2NhbGUxNiwgaW50IGV4cGFuZDE2LAorICAgIGludCBkb19iYWNrZ3JvdW5kLCBjb25zdCBwbmdfY29sb3JfMTYgKnBvaW50ZXJfdG9fdGhlX2JhY2tncm91bmRfY29sb3IsCisgICAgZG91YmxlIGJhY2tncm91bmRfZ2FtbWEpCit7CisgICAvKiBTdGFuZGFyZCBmaWVsZHMgKi8KKyAgIHN0YW5kYXJkX2Rpc3BsYXlfaW5pdCgmZHAtPnRoaXMsICZwbS0+dGhpcywgaWQsIGRvX3JlYWRfaW50ZXJsYWNlLAorICAgICAgcG0tPnVzZV91cGRhdGVfaW5mbyk7CisKKyAgIC8qIFBhcmFtZXRlciBmaWVsZHMgKi8KKyAgIGRwLT5wbSA9IHBtOworICAgZHAtPmZpbGVfZ2FtbWEgPSBmaWxlX2dhbW1hOworICAgZHAtPnNjcmVlbl9nYW1tYSA9IHNjcmVlbl9nYW1tYTsKKyAgIGRwLT5iYWNrZ3JvdW5kX2dhbW1hID0gYmFja2dyb3VuZF9nYW1tYTsKKyAgIGRwLT5zYml0ID0gc2JpdDsKKyAgIGRwLT50aHJlc2hvbGRfdGVzdCA9IHRocmVzaG9sZF90ZXN0OworICAgZHAtPnVzZV9pbnB1dF9wcmVjaXNpb24gPSB1c2VfaW5wdXRfcHJlY2lzaW9uOworICAgZHAtPnNjYWxlMTYgPSBzY2FsZTE2OworICAgZHAtPmV4cGFuZDE2ID0gZXhwYW5kMTY7CisgICBkcC0+ZG9fYmFja2dyb3VuZCA9IGRvX2JhY2tncm91bmQ7CisgICBpZiAoZG9fYmFja2dyb3VuZCAmJiBwb2ludGVyX3RvX3RoZV9iYWNrZ3JvdW5kX2NvbG9yICE9IDApCisgICAgICBkcC0+YmFja2dyb3VuZF9jb2xvciA9ICpwb2ludGVyX3RvX3RoZV9iYWNrZ3JvdW5kX2NvbG9yOworICAgZWxzZQorICAgICAgbWVtc2V0KCZkcC0+YmFja2dyb3VuZF9jb2xvciwgMCwgc2l6ZW9mIGRwLT5iYWNrZ3JvdW5kX2NvbG9yKTsKKworICAgLyogTG9jYWwgdmFyaWFibGUgZmllbGRzICovCisgICBkcC0+bWF4ZXJyb3V0ID0gZHAtPm1heGVycnBjID0gZHAtPm1heGVycmFicyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitnYW1tYV9pbmZvX2ltcChnYW1tYV9kaXNwbGF5ICpkcCwgcG5nX3N0cnVjdHAgcHAsIHBuZ19pbmZvcCBwaSkKK3sKKyAgIC8qIFJldXNlIHRoZSBzdGFuZGFyZCBzdHVmZiBhcyBhcHByb3ByaWF0ZS4gKi8KKyAgIHN0YW5kYXJkX2luZm9fcGFydDEoJmRwLT50aGlzLCBwcCwgcGkpOworCisgICAvKiBJZiByZXF1ZXN0ZWQgc3RyaXAgMTYgdG8gOCBiaXRzIC0gdGhpcyBpcyBoYW5kbGVkIGF1dG9tYWdpY2FsbHkgYmVsb3cKKyAgICAqIGJlY2F1c2UgdGhlIG91dHB1dCBiaXQgZGVwdGggaXMgcmVhZCBmcm9tIHRoZSBsaWJyYXJ5LiAgTm90ZSB0aGF0IHRoZXJlCisgICAgKiBhcmUgaW50ZXJhY3Rpb25zIHdpdGggc0JJVCBidXQsIGludGVybmFsbHksIGxpYnBuZyBtYWtlcyBzYml0IGF0IG1vc3QKKyAgICAqIFBOR19NQVhfR0FNTUFfOCBwcmlvciB0byAxLjcgd2hlbiBkb2luZyB0aGUgZm9sbG93aW5nLgorICAgICovCisgICBpZiAoZHAtPnNjYWxlMTYpCisjICAgICBpZmRlZiBQTkdfUkVBRF9TQ0FMRV8xNl9UT184X1NVUFBPUlRFRAorICAgICAgICAgcG5nX3NldF9zY2FsZV8xNihwcCk7CisjICAgICBlbHNlCisgICAgICAgICAvKiBUaGUgZm9sbG93aW5nIHdvcmtzIGJvdGggaW4gMS41LjQgYW5kIGVhcmxpZXIgdmVyc2lvbnM6ICovCisjICAgICAgICBpZmRlZiBQTkdfUkVBRF8xNl9UT184X1NVUFBPUlRFRAorICAgICAgICAgICAgcG5nX3NldF9zdHJpcF8xNihwcCk7CisjICAgICAgICBlbHNlCisgICAgICAgICAgICBwbmdfZXJyb3IocHAsICJzY2FsZTE2ICgxNiB0byA4IGJpdCBjb252ZXJzaW9uKSBub3Qgc3VwcG9ydGVkIik7CisjICAgICAgICBlbmRpZgorIyAgICAgZW5kaWYKKworICAgaWYgKGRwLT5leHBhbmQxNikKKyMgICAgIGlmZGVmIFBOR19SRUFEX0VYUEFORF8xNl9TVVBQT1JURUQKKyAgICAgICAgIHBuZ19zZXRfZXhwYW5kXzE2KHBwKTsKKyMgICAgIGVsc2UKKyAgICAgICAgIHBuZ19lcnJvcihwcCwgImV4cGFuZDE2ICg4IHRvIDE2IGJpdCBjb252ZXJzaW9uKSBub3Qgc3VwcG9ydGVkIik7CisjICAgICBlbmRpZgorCisgICBpZiAoZHAtPmRvX2JhY2tncm91bmQgPj0gQUxQSEFfTU9ERV9PRkZTRVQpCisgICB7CisjICAgICBpZmRlZiBQTkdfUkVBRF9BTFBIQV9NT0RFX1NVUFBPUlRFRAorICAgICAgeworICAgICAgICAgLyogVGhpcyB0ZXN0cyB0aGUgYWxwaGEgbW9kZSBoYW5kbGluZywgaWYgc3VwcG9ydGVkLiAqLworICAgICAgICAgaW50IG1vZGUgPSBkcC0+ZG9fYmFja2dyb3VuZCAtIEFMUEhBX01PREVfT0ZGU0VUOworCisgICAgICAgICAvKiBUaGUgZ2FtbWEgdmFsdWUgaXMgdGhlIG91dHB1dCBnYW1tYSwgYW5kIGlzIGluIHRoZSBzdGFuZGFyZCwKKyAgICAgICAgICAqIG5vbi1pbnZlcnRlZCwgcmVwcmVzZW5hdGlvbi4gIEl0IHByb3ZpZGVzIGEgZGVmYXVsdCBmb3IgdGhlIFBORyBmaWxlCisgICAgICAgICAgKiBnYW1tYSwgYnV0IHNpbmNlIHRoZSBmaWxlIGhhcyBhIGdBTUEgY2h1bmsgdGhpcyBkb2VzIG5vdCBtYXR0ZXIuCisgICAgICAgICAgKi8KKyAgICAgICAgIGNvbnN0IGRvdWJsZSBzZyA9IGRwLT5zY3JlZW5fZ2FtbWE7CisjICAgICAgICBpZm5kZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorICAgICAgICAgICAgY29uc3QgcG5nX2ZpeGVkX3BvaW50IGcgPSBmaXgoc2cpOworIyAgICAgICAgZW5kaWYKKworIyAgICAgICAgaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorICAgICAgICAgICAgcG5nX3NldF9hbHBoYV9tb2RlKHBwLCBtb2RlLCBzZyk7CisjICAgICAgICBlbHNlCisgICAgICAgICAgICBwbmdfc2V0X2FscGhhX21vZGVfZml4ZWQocHAsIG1vZGUsIGcpOworIyAgICAgICAgZW5kaWYKKworICAgICAgICAgLyogSG93ZXZlciwgZm9yIHRoZSBzdGFuZGFyZCBQb3J0ZXItRHVmZiBhbGdvcml0aG0gdGhlIG91dHB1dCBkZWZhdWx0cworICAgICAgICAgICogdG8gYmUgbGluZWFyLCBzbyBpZiB0aGUgdGVzdCByZXF1aXJlcyBub24tbGluZWFyIG91dHB1dCBpdCBtdXN0IGJlCisgICAgICAgICAgKiBjb3JyZWN0ZWQgaGVyZS4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKG1vZGUgPT0gUE5HX0FMUEhBX1NUQU5EQVJEICYmIHNnICE9IDEpCisgICAgICAgICB7CisjICAgICAgICAgICBpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECisgICAgICAgICAgICAgICBwbmdfc2V0X2dhbW1hKHBwLCBzZywgZHAtPmZpbGVfZ2FtbWEpOworIyAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgcG5nX2ZpeGVkX3BvaW50IGYgPSBmaXgoZHAtPmZpbGVfZ2FtbWEpOworICAgICAgICAgICAgICAgcG5nX3NldF9nYW1tYV9maXhlZChwcCwgZywgZik7CisjICAgICAgICAgICBlbmRpZgorICAgICAgICAgfQorICAgICAgfQorIyAgICAgZWxzZQorICAgICAgICAgcG5nX2Vycm9yKHBwLCAiYWxwaGEgbW9kZSBoYW5kbGluZyBub3Qgc3VwcG9ydGVkIik7CisjICAgICBlbmRpZgorICAgfQorCisgICBlbHNlCisgICB7CisgICAgICAvKiBTZXQgdXAgZ2FtbWEgcHJvY2Vzc2luZy4gKi8KKyMgICAgIGlmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKKyAgICAgICAgIHBuZ19zZXRfZ2FtbWEocHAsIGRwLT5zY3JlZW5fZ2FtbWEsIGRwLT5maWxlX2dhbW1hKTsKKyMgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHBuZ19maXhlZF9wb2ludCBzID0gZml4KGRwLT5zY3JlZW5fZ2FtbWEpOworICAgICAgICAgcG5nX2ZpeGVkX3BvaW50IGYgPSBmaXgoZHAtPmZpbGVfZ2FtbWEpOworICAgICAgICAgcG5nX3NldF9nYW1tYV9maXhlZChwcCwgcywgZik7CisgICAgICB9CisjICAgICBlbmRpZgorCisgICAgICBpZiAoZHAtPmRvX2JhY2tncm91bmQpCisgICAgICB7CisjICAgICBpZmRlZiBQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRAorICAgICAgICAgLyogTk9URTogdGhpcyBhc3N1bWVzIHRoZSBjYWxsZXIgcHJvdmlkZWQgdGhlIGNvcnJlY3QgYmFja2dyb3VuZCBnYW1tYSEKKyAgICAgICAgICAqLworICAgICAgICAgY29uc3QgZG91YmxlIGJnID0gZHAtPmJhY2tncm91bmRfZ2FtbWE7CisjICAgICAgICBpZm5kZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorICAgICAgICAgICAgY29uc3QgcG5nX2ZpeGVkX3BvaW50IGcgPSBmaXgoYmcpOworIyAgICAgICAgZW5kaWYKKworIyAgICAgICAgaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorICAgICAgICAgICAgcG5nX3NldF9iYWNrZ3JvdW5kKHBwLCAmZHAtPmJhY2tncm91bmRfY29sb3IsIGRwLT5kb19iYWNrZ3JvdW5kLAorICAgICAgICAgICAgICAgMC8qbmVlZF9leHBhbmQqLywgYmcpOworIyAgICAgICAgZWxzZQorICAgICAgICAgICAgcG5nX3NldF9iYWNrZ3JvdW5kX2ZpeGVkKHBwLCAmZHAtPmJhY2tncm91bmRfY29sb3IsCisgICAgICAgICAgICAgICBkcC0+ZG9fYmFja2dyb3VuZCwgMC8qbmVlZF9leHBhbmQqLywgZyk7CisjICAgICAgICBlbmRpZgorIyAgICAgZWxzZQorICAgICAgICAgcG5nX2Vycm9yKHBwLCAicG5nX3NldF9iYWNrZ3JvdW5kIG5vdCBzdXBwb3J0ZWQiKTsKKyMgICAgIGVuZGlmCisgICAgICB9CisgICB9CisKKyAgIHsKKyAgICAgIGludCBpID0gZHAtPnRoaXMudXNlX3VwZGF0ZV9pbmZvOworICAgICAgLyogQWx3YXlzIGRvIG9uZSBjYWxsLCBldmVuIGlmIHVzZV91cGRhdGVfaW5mbyBpcyAwLiAqLworICAgICAgZG8KKyAgICAgICAgIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKHBwLCBwaSk7CisgICAgICB3aGlsZSAoLS1pID4gMCk7CisgICB9CisKKyAgIC8qIE5vdyB3ZSBtYXkgZ2V0IGEgZGlmZmVyZW50IGNiUm93OiAqLworICAgc3RhbmRhcmRfaW5mb19wYXJ0MigmZHAtPnRoaXMsIHBwLCBwaSwgMSAvKmltYWdlcyovKTsKK30KKworc3RhdGljIHZvaWQgUE5HQ0JBUEkKK2dhbW1hX2luZm8ocG5nX3N0cnVjdHAgcHAsIHBuZ19pbmZvcCBwaSkKK3sKKyAgIGdhbW1hX2luZm9faW1wKHZvaWRjYXN0KGdhbW1hX2Rpc3BsYXkqLCBwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0cihwcCkpLCBwcCwKKyAgICAgIHBpKTsKK30KKworLyogVmFsaWRhdGUgYSBzaW5nbGUgY29tcG9uZW50IHZhbHVlIC0gdGhlIHJvdXRpbmUgZ2V0cyB0aGUgaW5wdXQgYW5kIG91dHB1dAorICogc2FtcGxlIHZhbHVlcyBhcyB1bnNjYWxlZCBQTkcgY29tcG9uZW50IHZhbHVlcyBhbG9uZyB3aXRoIGEgY2FjaGUgb2YgYWxsIHRoZQorICogaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gdmFsaWRhdGUgdGhlIHZhbHVlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgdmFsaWRhdGVfaW5mbworeworICAgcG5nX2NvbnN0X3N0cnVjdHAgIHBwOworICAgZ2FtbWFfZGlzcGxheSAqZHA7CisgICBwbmdfYnl0ZSBzYml0OworICAgaW50IHVzZV9pbnB1dF9wcmVjaXNpb247CisgICBpbnQgZG9fYmFja2dyb3VuZDsKKyAgIGludCBzY2FsZTE2OworICAgdW5zaWduZWQgaW50IHNiaXRfbWF4OworICAgdW5zaWduZWQgaW50IGlzYml0X3NoaWZ0OworICAgdW5zaWduZWQgaW50IG91dG1heDsKKworICAgZG91YmxlIGdhbW1hX2NvcnJlY3Rpb247IC8qIE92ZXJhbGwgY29ycmVjdGlvbiByZXF1aXJlZC4gKi8KKyAgIGRvdWJsZSBmaWxlX2ludmVyc2U7ICAgICAvKiBJbnZlcnNlIG9mIGZpbGUgZ2FtbWEuICovCisgICBkb3VibGUgc2NyZWVuX2dhbW1hOworICAgZG91YmxlIHNjcmVlbl9pbnZlcnNlOyAgIC8qIEludmVyc2Ugb2Ygc2NyZWVuIGdhbW1hLiAqLworCisgICBkb3VibGUgYmFja2dyb3VuZF9yZWQ7ICAgLyogTGluZWFyIGJhY2tncm91bmQgdmFsdWUsIHJlZCBvciBncmF5LiAqLworICAgZG91YmxlIGJhY2tncm91bmRfZ3JlZW47CisgICBkb3VibGUgYmFja2dyb3VuZF9ibHVlOworCisgICBkb3VibGUgbWF4YWJzOworICAgZG91YmxlIG1heHBjOworICAgZG91YmxlIG1heGNhbGM7CisgICBkb3VibGUgbWF4b3V0OworICAgZG91YmxlIG1heG91dF90b3RhbDsgICAgIC8qIFRvdGFsIGluY2x1ZGluZyBxdWFudGl6YXRpb24gZXJyb3IgKi8KKyAgIGRvdWJsZSBvdXRsb2c7CisgICBpbnQgICAgb3V0cXVhbnQ7Cit9Cit2YWxpZGF0ZV9pbmZvOworCitzdGF0aWMgdm9pZAoraW5pdF92YWxpZGF0ZV9pbmZvKHZhbGlkYXRlX2luZm8gKnZpLCBnYW1tYV9kaXNwbGF5ICpkcCwgcG5nX2NvbnN0X3N0cnVjdHAgcHAsCisgICAgaW50IGluX2RlcHRoLCBpbnQgb3V0X2RlcHRoKQoreworICAgY29uc3QgdW5zaWduZWQgaW50IG91dG1heCA9ICgxVTw8b3V0X2RlcHRoKS0xOworCisgICB2aS0+cHAgPSBwcDsKKyAgIHZpLT5kcCA9IGRwOworCisgICBpZiAoZHAtPnNiaXQgPiAwICYmIGRwLT5zYml0IDwgaW5fZGVwdGgpCisgICB7CisgICAgICB2aS0+c2JpdCA9IGRwLT5zYml0OworICAgICAgdmktPmlzYml0X3NoaWZ0ID0gaW5fZGVwdGggLSBkcC0+c2JpdDsKKyAgIH0KKworICAgZWxzZQorICAgeworICAgICAgdmktPnNiaXQgPSAocG5nX2J5dGUpaW5fZGVwdGg7CisgICAgICB2aS0+aXNiaXRfc2hpZnQgPSAwOworICAgfQorCisgICB2aS0+c2JpdF9tYXggPSAoMVUgPDwgdmktPnNiaXQpLTE7CisKKyAgIC8qIFRoaXMgbWltaWNzIHRoZSBsaWJwbmcgdGhyZXNob2xkIHRlc3QsICcwJyBpcyB1c2VkIHRvIHByZXZlbnQgZ2FtbWEKKyAgICAqIGNvcnJlY3Rpb24gaW4gdGhlIHZhbGlkYXRpb24gdGVzdC4KKyAgICAqLworICAgdmktPnNjcmVlbl9nYW1tYSA9IGRwLT5zY3JlZW5fZ2FtbWE7CisgICBpZiAoZmFicyh2aS0+c2NyZWVuX2dhbW1hLTEpIDwgUE5HX0dBTU1BX1RIUkVTSE9MRCkKKyAgICAgIHZpLT5zY3JlZW5fZ2FtbWEgPSB2aS0+c2NyZWVuX2ludmVyc2UgPSAwOworICAgZWxzZQorICAgICAgdmktPnNjcmVlbl9pbnZlcnNlID0gMS92aS0+c2NyZWVuX2dhbW1hOworCisgICB2aS0+dXNlX2lucHV0X3ByZWNpc2lvbiA9IGRwLT51c2VfaW5wdXRfcHJlY2lzaW9uOworICAgdmktPm91dG1heCA9IG91dG1heDsKKyAgIHZpLT5tYXhhYnMgPSBhYnNlcnIoZHAtPnBtLCBpbl9kZXB0aCwgb3V0X2RlcHRoKTsKKyAgIHZpLT5tYXhwYyA9IHBjZXJyKGRwLT5wbSwgaW5fZGVwdGgsIG91dF9kZXB0aCk7CisgICB2aS0+bWF4Y2FsYyA9IGNhbGNlcnIoZHAtPnBtLCBpbl9kZXB0aCwgb3V0X2RlcHRoKTsKKyAgIHZpLT5tYXhvdXQgPSBvdXRlcnIoZHAtPnBtLCBpbl9kZXB0aCwgb3V0X2RlcHRoKTsKKyAgIHZpLT5vdXRxdWFudCA9IG91dHB1dF9xdWFudGl6YXRpb25fZmFjdG9yKGRwLT5wbSwgaW5fZGVwdGgsIG91dF9kZXB0aCk7CisgICB2aS0+bWF4b3V0X3RvdGFsID0gdmktPm1heG91dCArIHZpLT5vdXRxdWFudCAqIC41OworICAgdmktPm91dGxvZyA9IG91dGxvZyhkcC0+cG0sIGluX2RlcHRoLCBvdXRfZGVwdGgpOworCisgICBpZiAoKGRwLT50aGlzLmNvbG91cl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpICE9IDAgfHwKKyAgICAgIChkcC0+dGhpcy5jb2xvdXJfdHlwZSA9PSAzICYmIGRwLT50aGlzLmlzX3RyYW5zcGFyZW50KSB8fAorICAgICAgKChkcC0+dGhpcy5jb2xvdXJfdHlwZSA9PSAwIHx8IGRwLT50aGlzLmNvbG91cl90eXBlID09IDIpICYmCisgICAgICAgZHAtPnRoaXMuaGFzX3RSTlMpKQorICAgeworICAgICAgdmktPmRvX2JhY2tncm91bmQgPSBkcC0+ZG9fYmFja2dyb3VuZDsKKworICAgICAgaWYgKHZpLT5kb19iYWNrZ3JvdW5kICE9IDApCisgICAgICB7CisgICAgICAgICBjb25zdCBkb3VibGUgYmdfaW52ZXJzZSA9IDEvZHAtPmJhY2tncm91bmRfZ2FtbWE7CisgICAgICAgICBkb3VibGUgciwgZywgYjsKKworICAgICAgICAgLyogQ2FsbGVyIG11c3QgYXQgbGVhc3QgcHV0IHRoZSBncmF5IHZhbHVlIGludG8gdGhlIHJlZCBjaGFubmVsICovCisgICAgICAgICByID0gZHAtPmJhY2tncm91bmRfY29sb3IucmVkOyByIC89IG91dG1heDsKKyAgICAgICAgIGcgPSBkcC0+YmFja2dyb3VuZF9jb2xvci5ncmVlbjsgZyAvPSBvdXRtYXg7CisgICAgICAgICBiID0gZHAtPmJhY2tncm91bmRfY29sb3IuYmx1ZTsgYiAvPSBvdXRtYXg7CisKKyMgICAgIGlmIDAKKyAgICAgICAgIC8qIGxpYnBuZyBkb2Vzbid0IGRvIHRoaXMgb3B0aW1pemF0aW9uLCBpZiB3ZSBkbyBwbmd2YWxpZCB3aWxsIGZhaWwuCisgICAgICAgICAgKi8KKyAgICAgICAgIGlmIChmYWJzKGJnX2ludmVyc2UtMSkgPj0gUE5HX0dBTU1BX1RIUkVTSE9MRCkKKyMgICAgIGVuZGlmCisgICAgICAgICB7CisgICAgICAgICAgICByID0gcG93KHIsIGJnX2ludmVyc2UpOworICAgICAgICAgICAgZyA9IHBvdyhnLCBiZ19pbnZlcnNlKTsKKyAgICAgICAgICAgIGIgPSBwb3coYiwgYmdfaW52ZXJzZSk7CisgICAgICAgICB9CisKKyAgICAgICAgIHZpLT5iYWNrZ3JvdW5kX3JlZCA9IHI7CisgICAgICAgICB2aS0+YmFja2dyb3VuZF9ncmVlbiA9IGc7CisgICAgICAgICB2aS0+YmFja2dyb3VuZF9ibHVlID0gYjsKKyAgICAgIH0KKyAgIH0KKyAgIGVsc2UgLyogRG8gbm90IGV4cGVjdCBhbnkgYmFja2dyb3VuZCBwcm9jZXNzaW5nICovCisgICAgICB2aS0+ZG9fYmFja2dyb3VuZCA9IDA7CisKKyAgIGlmICh2aS0+ZG9fYmFja2dyb3VuZCA9PSAwKQorICAgICAgdmktPmJhY2tncm91bmRfcmVkID0gdmktPmJhY2tncm91bmRfZ3JlZW4gPSB2aS0+YmFja2dyb3VuZF9ibHVlID0gMDsKKworICAgdmktPmdhbW1hX2NvcnJlY3Rpb24gPSAxLyhkcC0+ZmlsZV9nYW1tYSpkcC0+c2NyZWVuX2dhbW1hKTsKKyAgIGlmIChmYWJzKHZpLT5nYW1tYV9jb3JyZWN0aW9uLTEpIDwgUE5HX0dBTU1BX1RIUkVTSE9MRCkKKyAgICAgIHZpLT5nYW1tYV9jb3JyZWN0aW9uID0gMDsKKworICAgdmktPmZpbGVfaW52ZXJzZSA9IDEvZHAtPmZpbGVfZ2FtbWE7CisgICBpZiAoZmFicyh2aS0+ZmlsZV9pbnZlcnNlLTEpIDwgUE5HX0dBTU1BX1RIUkVTSE9MRCkKKyAgICAgIHZpLT5maWxlX2ludmVyc2UgPSAwOworCisgICB2aS0+c2NhbGUxNiA9IGRwLT5zY2FsZTE2OworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgY29tcG9zaXRpb24gb2YgYSBzaW5nbGUgbm9uLWFscGhhIGNvbXBvbmVudC4gIFRoZQorICogYXJndW1lbnQgaXMgdGhlIGlucHV0IHNhbXBsZSB2YWx1ZSwgaW4gdGhlIHJhbmdlIDAuLjEsIGFuZCB0aGUgYWxwaGEgdmFsdWUuCisgKiBUaGUgcmVzdWx0IGlzIHRoZSBjb21wb3NlZCwgbGluZWFyLCBpbnB1dCBzYW1wbGUuICBJZiBhbHBoYSBpcyBsZXNzIHRoYW4gemVybworICogdGhpcyBpcyB0aGUgYWxwaGEgY29tcG9uZW50IGFuZCB0aGUgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQhCisgKi8KK3N0YXRpYyBkb3VibGUKK2dhbW1hX2NvbXBvbmVudF9jb21wb3NlKGludCBkb19iYWNrZ3JvdW5kLCBkb3VibGUgaW5wdXRfc2FtcGxlLCBkb3VibGUgYWxwaGEsCisgICBkb3VibGUgYmFja2dyb3VuZCwgaW50ICpjb21wb3NlKQoreworICAgc3dpdGNoIChkb19iYWNrZ3JvdW5kKQorICAgeworI2lmZGVmIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVECisgICAgICBjYXNlIFBOR19CQUNLR1JPVU5EX0dBTU1BX1NDUkVFTjoKKyAgICAgIGNhc2UgUE5HX0JBQ0tHUk9VTkRfR0FNTUFfRklMRToKKyAgICAgIGNhc2UgUE5HX0JBQ0tHUk9VTkRfR0FNTUFfVU5JUVVFOgorICAgICAgICAgLyogU3RhbmRhcmQgUE5HIGJhY2tncm91bmQgcHJvY2Vzc2luZy4gKi8KKyAgICAgICAgIGlmIChhbHBoYSA8IDEpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAoYWxwaGEgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaW5wdXRfc2FtcGxlID0gaW5wdXRfc2FtcGxlICogYWxwaGEgKyBiYWNrZ3JvdW5kICogKDEtYWxwaGEpOworICAgICAgICAgICAgICAgaWYgKGNvbXBvc2UgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICpjb21wb3NlID0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgaW5wdXRfc2FtcGxlID0gYmFja2dyb3VuZDsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9BTFBIQV9NT0RFX1NVUFBPUlRFRAorICAgICAgY2FzZSBBTFBIQV9NT0RFX09GRlNFVCArIFBOR19BTFBIQV9TVEFOREFSRDoKKyAgICAgIGNhc2UgQUxQSEFfTU9ERV9PRkZTRVQgKyBQTkdfQUxQSEFfQlJPS0VOOgorICAgICAgICAgLyogVGhlIGNvbXBvbmVudHMgYXJlIHByZW11bHRpcGxpZWQgaW4gZWl0aGVyIGNhc2UgYW5kIHRoZSBvdXRwdXQgaXMKKyAgICAgICAgICAqIGdhbW1hIGVuY29kZWQgKHRvIGdldCBzdGFuZGFyZCBQb3J0ZXItRHVmZiB3ZSBleHBlY3QgdGhlIG91dHB1dAorICAgICAgICAgICogZ2FtbWEgdG8gYmUgc2V0IHRvIDEuMCEpCisgICAgICAgICAgKi8KKyAgICAgIGNhc2UgQUxQSEFfTU9ERV9PRkZTRVQgKyBQTkdfQUxQSEFfT1BUSU1JWkVEOgorICAgICAgICAgLyogVGhlIG9wdGltaXphdGlvbiBpcyB0aGF0IHRoZSBwYXJ0aWFsLWFscGhhIGVudHJpZXMgYXJlIGxpbmVhcgorICAgICAgICAgICogd2hpbGUgdGhlIG9wYXF1ZSBwaXhlbHMgYXJlIGdhbW1hIGVuY29kZWQsIGJ1dCB0aGlzIG9ubHkgYWZmZWN0cyB0aGUKKyAgICAgICAgICAqIG91dHB1dCBlbmNvZGluZy4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKGFscGhhIDwgMSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhbHBoYSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpbnB1dF9zYW1wbGUgKj0gYWxwaGE7CisgICAgICAgICAgICAgICBpZiAoY29tcG9zZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgKmNvbXBvc2UgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICBpbnB1dF9zYW1wbGUgPSAwOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIC8qIFN0YW5kYXJkIGNhc2VzIHdoZXJlIG5vIGNvbXBvc2l0aW5nIGlzIGRvbmUgKHNvIHRoZSBjb21wb25lbnQKKyAgICAgICAgICAqIHZhbHVlIGlzIGFscmVhZHkgY29ycmVjdC4pCisgICAgICAgICAgKi8KKyAgICAgICAgIFVOVVNFRChhbHBoYSkKKyAgICAgICAgIFVOVVNFRChiYWNrZ3JvdW5kKQorICAgICAgICAgVU5VU0VEKGNvbXBvc2UpCisgICAgICAgICBicmVhazsKKyAgIH0KKworICAgcmV0dXJuIGlucHV0X3NhbXBsZTsKK30KKworLyogVGhpcyBBUEkgcmV0dXJucyB0aGUgZW5jb2RlZCAqaW5wdXQqIGNvbXBvbmVudCwgaW4gdGhlIHJhbmdlIDAuLjEgKi8KK3N0YXRpYyBkb3VibGUKK2dhbW1hX2NvbXBvbmVudF92YWxpZGF0ZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2YWxpZGF0ZV9pbmZvICp2aSwKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIGludCBvZCwKKyAgICBjb25zdCBkb3VibGUgYWxwaGEgLyogPDAgZm9yIHRoZSBhbHBoYSBjaGFubmVsIGl0c2VsZiAqLywKKyAgICBjb25zdCBkb3VibGUgYmFja2dyb3VuZCAvKiBjb21wb25lbnQgYmFja2dyb3VuZCB2YWx1ZSAqLykKK3sKKyAgIGNvbnN0IHVuc2lnbmVkIGludCBpc2JpdCA9IGlkID4+IHZpLT5pc2JpdF9zaGlmdDsKKyAgIGNvbnN0IHVuc2lnbmVkIGludCBzYml0X21heCA9IHZpLT5zYml0X21heDsKKyAgIGNvbnN0IHVuc2lnbmVkIGludCBvdXRtYXggPSB2aS0+b3V0bWF4OworICAgY29uc3QgaW50IGRvX2JhY2tncm91bmQgPSB2aS0+ZG9fYmFja2dyb3VuZDsKKworICAgZG91YmxlIGk7CisKKyAgIC8qIEZpcnN0IGNoZWNrIG9uIHRoZSAncGVyZmVjdCcgcmVzdWx0IG9idGFpbmVkIGZyb20gdGhlIGRpZ2l0aXplZCBpbnB1dAorICAgICogdmFsdWUsIGlkLCBhbmQgY29tcGFyZSB0aGlzIGFnYWluc3QgdGhlIGFjdHVhbCBkaWdpdGl6ZWQgcmVzdWx0LCAnb2QnLgorICAgICogJ2knIGlzIHRoZSBpbnB1dCByZXN1bHQgaW4gdGhlIHJhbmdlIDAuLjE6CisgICAgKi8KKyAgIGkgPSBpc2JpdDsgaSAvPSBzYml0X21heDsKKworICAgLyogQ2hlY2sgZm9yIHRoZSBmYXN0IHJvdXRlOiBpZiB3ZSBkb24ndCBkbyBhbnkgYmFja2dyb3VuZCBjb21wb3NpdGlvbiBvciBpZgorICAgICogdGhpcyBpcyB0aGUgYWxwaGEgY2hhbm5lbCAoJ2FscGhhJyA8IDApIG9yIGlmIHRoZSBwaXhlbCBpcyBvcGFxdWUgdGhlbgorICAgICoganVzdCB1c2UgdGhlIGdhbW1hX2NvcnJlY3Rpb24gZmllbGQgdG8gY29ycmVjdCB0byB0aGUgZmluYWwgb3V0cHV0IGdhbW1hLgorICAgICovCisgICBpZiAoYWxwaGEgPT0gMSAvKiBvcGFxdWUgcGl4ZWwgY29tcG9uZW50ICovIHx8ICFkb19iYWNrZ3JvdW5kCisjaWZkZWYgUE5HX1JFQURfQUxQSEFfTU9ERV9TVVBQT1JURUQKKyAgICAgIHx8IGRvX2JhY2tncm91bmQgPT0gQUxQSEFfTU9ERV9PRkZTRVQgKyBQTkdfQUxQSEFfUE5HCisjZW5kaWYKKyAgICAgIHx8IChhbHBoYSA8IDAgLyogYWxwaGEgY2hhbm5lbCAqLworI2lmZGVmIFBOR19SRUFEX0FMUEhBX01PREVfU1VQUE9SVEVECisgICAgICAmJiBkb19iYWNrZ3JvdW5kICE9IEFMUEhBX01PREVfT0ZGU0VUICsgUE5HX0FMUEhBX0JST0tFTgorI2VuZGlmCisgICAgICApKQorICAgeworICAgICAgLyogVGhlbiBnZXQgdGhlIGdhbW1hIGNvcnJlY3RlZCB2ZXJzaW9uIG9mICdpJyBhbmQgY29tcGFyZSB0byAnb2QnLCBhbnkKKyAgICAgICAqIGVycm9yIGxlc3MgdGhhbiAuNSBpcyBpbnNpZ25pZmljYW50IC0ganVzdCBxdWFudGl6YXRpb24gb2YgdGhlIG91dHB1dAorICAgICAgICogdmFsdWUgdG8gdGhlIG5lYXJlc3QgZGlnaXRhbCB2YWx1ZSAobmV2ZXJ0aGVsZXNzIHRoZSBlcnJvciBpcyBzdGlsbAorICAgICAgICogcmVjb3JkZWQgLSBpdCdzIGludGVyZXN0aW5nIDstKQorICAgICAgICovCisgICAgICBkb3VibGUgZW5jb2RlZF9zYW1wbGUgPSBpOworICAgICAgZG91YmxlIGVuY29kZWRfZXJyb3I7CisKKyAgICAgIC8qIGFscGhhIGxlc3MgdGhhbiAwIGluZGljYXRlcyB0aGUgYWxwaGEgY2hhbm5lbCwgd2hpY2ggaXMgYWx3YXlzIGxpbmVhcgorICAgICAgICovCisgICAgICBpZiAoYWxwaGEgPj0gMCAmJiB2aS0+Z2FtbWFfY29ycmVjdGlvbiA+IDApCisgICAgICAgICBlbmNvZGVkX3NhbXBsZSA9IHBvdyhlbmNvZGVkX3NhbXBsZSwgdmktPmdhbW1hX2NvcnJlY3Rpb24pOworICAgICAgZW5jb2RlZF9zYW1wbGUgKj0gb3V0bWF4OworCisgICAgICBlbmNvZGVkX2Vycm9yID0gZmFicyhvZC1lbmNvZGVkX3NhbXBsZSk7CisKKyAgICAgIGlmIChlbmNvZGVkX2Vycm9yID4gdmktPmRwLT5tYXhlcnJvdXQpCisgICAgICAgICB2aS0+ZHAtPm1heGVycm91dCA9IGVuY29kZWRfZXJyb3I7CisKKyAgICAgIGlmIChlbmNvZGVkX2Vycm9yIDwgdmktPm1heG91dF90b3RhbCAmJiBlbmNvZGVkX2Vycm9yIDwgdmktPm91dGxvZykKKyAgICAgICAgIHJldHVybiBpOworICAgfQorCisgICAvKiBUaGUgc2xvdyByb3V0ZSAtIGF0dGVtcHQgdG8gZG8gbGluZWFyIGNhbGN1bGF0aW9ucy4gKi8KKyAgIC8qIFRoZXJlIG1heSBiZSBhbiBlcnJvciwgb3IgYmFja2dyb3VuZCBwcm9jZXNzaW5nIGlzIHJlcXVpcmVkLCBzbyBjYWxjdWxhdGUKKyAgICAqIHRoZSBhY3R1YWwgc2FtcGxlIHZhbHVlcyAtIHVuZW5jb2RlZCBsaWdodCBpbnRlbnNpdHkgdmFsdWVzLiAgTm90ZSB0aGF0IGluCisgICAgKiBwcmFjdGljZSB0aGVzZSBhcmUgbm90IGNvbXBsZXRlbHkgdW5lbmNvZGVkIGJlY2F1c2UgdGhleSBpbmNsdWRlIGEKKyAgICAqICd2aWV3aW5nIGNvcnJlY3Rpb24nIHRvIGRlY3JlYXNlIG9yIChub3JtYWxseSkgaW5jcmVhc2UgdGhlIHBlcmNlcHR1YWwKKyAgICAqIGNvbnRyYXN0IG9mIHRoZSBpbWFnZS4gIFRoZXJlJ3Mgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgdGhpcyAtIHdlIGRvbid0CisgICAgKiBrbm93IHdoYXQgaXQgaXMgLSBzbyBhc3N1bWUgdGhlIHVuZW5jb2RlZCB2YWx1ZSBpcyBwZXJjZXB0dWFsbHkgbGluZWFyLgorICAgICovCisgICB7CisgICAgICBkb3VibGUgaW5wdXRfc2FtcGxlID0gaTsgLyogSW4gcmFuZ2UgMC4uMSAqLworICAgICAgZG91YmxlIG91dHB1dCwgZXJyb3IsIGVuY29kZWRfc2FtcGxlLCBlbmNvZGVkX2Vycm9yOworICAgICAgZG91YmxlIGVzX2xvLCBlc19oaTsKKyAgICAgIGludCBjb21wb3NlID0gMDsgICAgICAgICAgIC8qIFNldCB0byBvbmUgaWYgY29tcG9zaXRpb24gZG9uZSAqLworICAgICAgaW50IG91dHB1dF9pc19lbmNvZGVkOyAgICAgLyogU2V0IGlmIGVuY29kZWQgdG8gc2NyZWVuIGdhbW1hICovCisgICAgICBpbnQgbG9nX21heF9lcnJvciA9IDE7ICAgICAvKiBDaGVjayBtYXhpbXVtIGVycm9yIHZhbHVlcyAqLworICAgICAgcG5nX2NvbnN0X2NoYXJwIHBhc3MgPSAwOyAgLyogUmVhc29uIHRlc3QgcGFzc2VzIChvciAwIGZvciBmYWlsKSAqLworCisgICAgICAvKiBDb252ZXJ0IHRvIGxpbmVhciBsaWdodCAod2l0aCB0aGUgYWJvdmUgY2F2ZWF0LikgIFRoZSBhbHBoYSBjaGFubmVsIGlzCisgICAgICAgKiBhbHJlYWR5IGxpbmVhci4KKyAgICAgICAqLworICAgICAgaWYgKGFscGhhID49IDApCisgICAgICB7CisgICAgICAgICBpbnQgdGNvbXBvc2U7CisKKyAgICAgICAgIGlmICh2aS0+ZmlsZV9pbnZlcnNlID4gMCkKKyAgICAgICAgICAgIGlucHV0X3NhbXBsZSA9IHBvdyhpbnB1dF9zYW1wbGUsIHZpLT5maWxlX2ludmVyc2UpOworCisgICAgICAgICAvKiBIYW5kbGUgdGhlIGNvbXBvc2UgcHJvY2Vzc2luZzogKi8KKyAgICAgICAgIHRjb21wb3NlID0gMDsKKyAgICAgICAgIGlucHV0X3NhbXBsZSA9IGdhbW1hX2NvbXBvbmVudF9jb21wb3NlKGRvX2JhY2tncm91bmQsIGlucHV0X3NhbXBsZSwKKyAgICAgICAgICAgIGFscGhhLCBiYWNrZ3JvdW5kLCAmdGNvbXBvc2UpOworCisgICAgICAgICBpZiAodGNvbXBvc2UpCisgICAgICAgICAgICBjb21wb3NlID0gMTsKKyAgICAgIH0KKworICAgICAgLyogQW5kIHNpbWlsYXJseSBmb3IgdGhlIG91dHB1dCB2YWx1ZSwgYnV0IHdlIG5lZWQgdG8gY2hlY2sgdGhlIGJhY2tncm91bmQKKyAgICAgICAqIGhhbmRsaW5nIHRvIGxpbmVhcml6ZSBpdCBjb3JyZWN0bHkuCisgICAgICAgKi8KKyAgICAgIG91dHB1dCA9IG9kOworICAgICAgb3V0cHV0IC89IG91dG1heDsKKworICAgICAgb3V0cHV0X2lzX2VuY29kZWQgPSB2aS0+c2NyZWVuX2dhbW1hID4gMDsKKworICAgICAgaWYgKGFscGhhIDwgMCkgLyogVGhlIGFscGhhIGNoYW5uZWwgKi8KKyAgICAgIHsKKyNpZmRlZiBQTkdfUkVBRF9BTFBIQV9NT0RFX1NVUFBPUlRFRAorICAgICAgICAgaWYgKGRvX2JhY2tncm91bmQgIT0gQUxQSEFfTU9ERV9PRkZTRVQgKyBQTkdfQUxQSEFfQlJPS0VOKQorI2VuZGlmCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBJbiBhbGwgb3RoZXIgY2FzZXMgdGhlIG91dHB1dCBhbHBoYSBjaGFubmVsIGlzIGxpbmVhciBhbHJlYWR5LAorICAgICAgICAgICAgICogZG9uJ3QgbG9nIGVycm9ycyBoZXJlLCB0aGV5IGFyZSBtdWNoIGxhcmdlciBpbiBsaW5lYXIgZGF0YS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgb3V0cHV0X2lzX2VuY29kZWQgPSAwOworICAgICAgICAgICAgbG9nX21heF9lcnJvciA9IDA7CisgICAgICAgICB9CisgICAgICB9CisKKyNpZmRlZiBQTkdfUkVBRF9BTFBIQV9NT0RFX1NVUFBPUlRFRAorICAgICAgZWxzZSAvKiBBIGNvbXBvbmVudCAqLworICAgICAgeworICAgICAgICAgaWYgKGRvX2JhY2tncm91bmQgPT0gQUxQSEFfTU9ERV9PRkZTRVQgKyBQTkdfQUxQSEFfT1BUSU1JWkVEICYmCisgICAgICAgICAgICBhbHBoYSA8IDEpIC8qIHRoZSBvcHRpbWl6ZWQgY2FzZSAtIGxpbmVhciBvdXRwdXQgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhbHBoYSA+IDApIGxvZ19tYXhfZXJyb3IgPSAwOworICAgICAgICAgICAgb3V0cHV0X2lzX2VuY29kZWQgPSAwOworICAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisKKyAgICAgIGlmIChvdXRwdXRfaXNfZW5jb2RlZCkKKyAgICAgICAgIG91dHB1dCA9IHBvdyhvdXRwdXQsIHZpLT5zY3JlZW5fZ2FtbWEpOworCisgICAgICAvKiBDYWxjdWxhdGUgKG9yIHJlY2FsY3VsYXRlKSB0aGUgZW5jb2RlZF9zYW1wbGUgdmFsdWUgYW5kIHJlcGVhdCB0aGUKKyAgICAgICAqIGNoZWNrIGFib3ZlICh1bm5lY2Vzc2FyeSBpZiB3ZSB0b29rIHRoZSBmYXN0IHJvdXRlLCBidXQgaGFybWxlc3MuKQorICAgICAgICovCisgICAgICBlbmNvZGVkX3NhbXBsZSA9IGlucHV0X3NhbXBsZTsKKyAgICAgIGlmIChvdXRwdXRfaXNfZW5jb2RlZCkKKyAgICAgICAgIGVuY29kZWRfc2FtcGxlID0gcG93KGVuY29kZWRfc2FtcGxlLCB2aS0+c2NyZWVuX2ludmVyc2UpOworICAgICAgZW5jb2RlZF9zYW1wbGUgKj0gb3V0bWF4OworCisgICAgICBlbmNvZGVkX2Vycm9yID0gZmFicyhvZC1lbmNvZGVkX3NhbXBsZSk7CisKKyAgICAgIC8qIERvbid0IGxvZyBlcnJvcnMgaW4gdGhlIGFscGhhIGNoYW5uZWwsIG9yIHRoZSAnb3B0aW1pemVkJyBjYXNlLAorICAgICAgICogbmVpdGhlciBhcmUgc2lnbmlmaWNhbnQgdG8gdGhlIG92ZXJhbGwgcGVyY2VwdGlvbi4KKyAgICAgICAqLworICAgICAgaWYgKGxvZ19tYXhfZXJyb3IgJiYgZW5jb2RlZF9lcnJvciA+IHZpLT5kcC0+bWF4ZXJyb3V0KQorICAgICAgICAgdmktPmRwLT5tYXhlcnJvdXQgPSBlbmNvZGVkX2Vycm9yOworCisgICAgICBpZiAoZW5jb2RlZF9lcnJvciA8IHZpLT5tYXhvdXRfdG90YWwpCisgICAgICB7CisgICAgICAgICBpZiAoZW5jb2RlZF9lcnJvciA8IHZpLT5vdXRsb2cpCisgICAgICAgICAgICByZXR1cm4gaTsKKworICAgICAgICAgLyogVGVzdCBwYXNzZWQgYnV0IGVycm9yIGlzIGJpZ2dlciB0aGFuIHRoZSBsb2cgbGltaXQsIHJlY29yZCB3aHkgdGhlCisgICAgICAgICAgKiB0ZXN0IHBhc3NlZDoKKyAgICAgICAgICAqLworICAgICAgICAgcGFzcyA9ICJsZXNzIHRoYW4gbWF4b3V0OlxuIjsKKyAgICAgIH0KKworICAgICAgLyogaTogdGhlIG9yaWdpbmFsIGlucHV0IHZhbHVlIGluIHRoZSByYW5nZSAwLi4xCisgICAgICAgKgorICAgICAgICogcG5ndmFsaWQgY2FsY3VsYXRpb25zOgorICAgICAgICogIGlucHV0X3NhbXBsZTogbGluZWFyIHJlc3VsdDsgaSBsaW5lYXJpemVkIGFuZCBjb21wb3NlZCwgcmFuZ2UgMC4uMQorICAgICAgICogIGVuY29kZWRfc2FtcGxlOiBlbmNvZGVkIHJlc3VsdDsgaW5wdXRfc2FtcGxlIHNjYWxlZCB0byBvdXB1dCBiaXQgZGVwdGgKKyAgICAgICAqCisgICAgICAgKiBsaWJwbmcgY2FsY3VsYXRpb25zOgorICAgICAgICogIG91dHB1dDogbGluZWFyIHJlc3VsdDsgb2Qgc2NhbGVkIHRvIDAuLjEgYW5kIGxpbmVhcml6ZWQKKyAgICAgICAqICBvZDogZW5jb2RlZCByZXN1bHQgZnJvbSBsaWJwbmcKKyAgICAgICAqLworCisgICAgICAvKiBOb3cgd2UgaGF2ZSB0aGUgbnVtYmVycyBmb3IgcmVhbCBlcnJvcnMsIGJvdGggYWJzb2x1dGUgdmFsdWVzIGFzIGFzIGEKKyAgICAgICAqIHBlcmNlbnRhZ2Ugb2YgdGhlIGNvcnJlY3QgdmFsdWUgKG91dHB1dCk6CisgICAgICAgKi8KKyAgICAgIGVycm9yID0gZmFicyhpbnB1dF9zYW1wbGUtb3V0cHV0KTsKKworICAgICAgaWYgKGxvZ19tYXhfZXJyb3IgJiYgZXJyb3IgPiB2aS0+ZHAtPm1heGVycmFicykKKyAgICAgICAgIHZpLT5kcC0+bWF4ZXJyYWJzID0gZXJyb3I7CisKKyAgICAgIC8qIFRoZSBmb2xsb3dpbmcgaXMgYW4gYXR0ZW1wdCB0byBpZ25vcmUgdGhlIHRlbmRlbmN5IG9mIHF1YW50aXphdGlvbiB0bworICAgICAgICogZG9taW5hdGUgdGhlIHBlcmNlbnRhZ2UgZXJyb3JzIGZvciBsb3dlciByZXN1bHQgdmFsdWVzOgorICAgICAgICovCisgICAgICBpZiAobG9nX21heF9lcnJvciAmJiBpbnB1dF9zYW1wbGUgPiAuNSkKKyAgICAgIHsKKyAgICAgICAgIGRvdWJsZSBwZXJjZW50YWdlX2Vycm9yID0gZXJyb3IvaW5wdXRfc2FtcGxlOworICAgICAgICAgaWYgKHBlcmNlbnRhZ2VfZXJyb3IgPiB2aS0+ZHAtPm1heGVycnBjKQorICAgICAgICAgICAgdmktPmRwLT5tYXhlcnJwYyA9IHBlcmNlbnRhZ2VfZXJyb3I7CisgICAgICB9CisKKyAgICAgIC8qIE5vdyBjYWxjdWxhdGUgdGhlIGRpZ2l0aXphdGlvbiBsaW1pdHMgZm9yICdlbmNvZGVkX3NhbXBsZScgdXNpbmcgdGhlCisgICAgICAgKiAnbWF4JyB2YWx1ZXMuICBOb3RlIHRoYXQgbWF4b3V0IGlzIGluIHRoZSBlbmNvZGVkIHNwYWNlIGJ1dCBtYXhwYyBhbmQKKyAgICAgICAqIG1heGFicyBhcmUgaW4gbGluZWFyIGxpZ2h0IHNwYWNlLgorICAgICAgICoKKyAgICAgICAqIEZpcnN0IGZpbmQgdGhlIG1heGltdW0gZXJyb3IgaW4gbGluZWFyIGxpZ2h0IHNwYWNlLCByYW5nZSAwLi4xOgorICAgICAgICovCisgICAgICB7CisgICAgICAgICBkb3VibGUgdG1wID0gaW5wdXRfc2FtcGxlICogdmktPm1heHBjOworICAgICAgICAgaWYgKHRtcCA8IHZpLT5tYXhhYnMpIHRtcCA9IHZpLT5tYXhhYnM7CisgICAgICAgICAvKiBJZiAnY29tcG9zZScgaXMgdHJ1ZSB0aGUgY29tcG9zaXRpb24gd2FzIGRvbmUgaW4gbGluZWFyIHNwYWNlIHVzaW5nCisgICAgICAgICAgKiBpbnRlZ2VyIGFyaXRobWV0aWMuICBUaGlzIGludHJvZHVjZXMgYW4gZXh0cmEgZXJyb3Igb2YgKy8tIDAuNSAoYXQKKyAgICAgICAgICAqIGxlYXN0KSBpbiB0aGUgaW50ZWdlciBzcGFjZSB1c2VkLiAgJ21heGNhbGMnIHJlY29yZHMgdGhpcywgdGFraW5nCisgICAgICAgICAgKiBpbnRvIGFjY291bnQgdGhlIHBvc3NpYmlsaXR5IHRoYXQgZXZlbiBmb3IgMTYgYml0IG91dHB1dCA4IGJpdCBzcGFjZQorICAgICAgICAgICogbWF5IGhhdmUgYmVlbiB1c2VkLgorICAgICAgICAgICovCisgICAgICAgICBpZiAoY29tcG9zZSAmJiB0bXAgPCB2aS0+bWF4Y2FsYykgdG1wID0gdmktPm1heGNhbGM7CisKKyAgICAgICAgIC8qIFRoZSAnbWF4b3V0JyB2YWx1ZSByZWZlcnMgdG8gdGhlIGVuY29kZWQgcmVzdWx0LCB0byBjb21wYXJlIHdpdGgKKyAgICAgICAgICAqIHRoaXMgZW5jb2RlIGlucHV0X3NhbXBsZSBhZGp1c3RlZCBieSB0aGUgbWF4aW11bSBlcnJvciAodG1wKSBhYm92ZS4KKyAgICAgICAgICAqLworICAgICAgICAgZXNfbG8gPSBlbmNvZGVkX3NhbXBsZSAtIHZpLT5tYXhvdXQ7CisKKyAgICAgICAgIGlmIChlc19sbyA+IDAgJiYgaW5wdXRfc2FtcGxlLXRtcCA+IDApCisgICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgbG93X3ZhbHVlID0gaW5wdXRfc2FtcGxlLXRtcDsKKyAgICAgICAgICAgIGlmIChvdXRwdXRfaXNfZW5jb2RlZCkKKyAgICAgICAgICAgICAgIGxvd192YWx1ZSA9IHBvdyhsb3dfdmFsdWUsIHZpLT5zY3JlZW5faW52ZXJzZSk7CisgICAgICAgICAgICBsb3dfdmFsdWUgKj0gb3V0bWF4OworICAgICAgICAgICAgaWYgKGxvd192YWx1ZSA8IGVzX2xvKSBlc19sbyA9IGxvd192YWx1ZTsKKworICAgICAgICAgICAgLyogUXVhbnRpemUgdGhpcyBhcHByb3ByaWF0ZWx5OiAqLworICAgICAgICAgICAgZXNfbG8gPSBjZWlsKGVzX2xvIC8gdmktPm91dHF1YW50IC0gLjUpICogdmktPm91dHF1YW50OworICAgICAgICAgfQorCisgICAgICAgICBlbHNlCisgICAgICAgICAgICBlc19sbyA9IDA7CisKKyAgICAgICAgIGVzX2hpID0gZW5jb2RlZF9zYW1wbGUgKyB2aS0+bWF4b3V0OworCisgICAgICAgICBpZiAoZXNfaGkgPCBvdXRtYXggJiYgaW5wdXRfc2FtcGxlK3RtcCA8IDEpCisgICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgaGlnaF92YWx1ZSA9IGlucHV0X3NhbXBsZSt0bXA7CisgICAgICAgICAgICBpZiAob3V0cHV0X2lzX2VuY29kZWQpCisgICAgICAgICAgICAgICBoaWdoX3ZhbHVlID0gcG93KGhpZ2hfdmFsdWUsIHZpLT5zY3JlZW5faW52ZXJzZSk7CisgICAgICAgICAgICBoaWdoX3ZhbHVlICo9IG91dG1heDsKKyAgICAgICAgICAgIGlmIChoaWdoX3ZhbHVlID4gZXNfaGkpIGVzX2hpID0gaGlnaF92YWx1ZTsKKworICAgICAgICAgICAgZXNfaGkgPSBmbG9vcihlc19oaSAvIHZpLT5vdXRxdWFudCArIC41KSAqIHZpLT5vdXRxdWFudDsKKyAgICAgICAgIH0KKworICAgICAgICAgZWxzZQorICAgICAgICAgICAgZXNfaGkgPSBvdXRtYXg7CisgICAgICB9CisKKyAgICAgIC8qIFRoZSBwcmltYXJ5IHRlc3QgaXMgdGhhdCB0aGUgZmluYWwgZW5jb2RlZCB2YWx1ZSByZXR1cm5lZCBieSB0aGUKKyAgICAgICAqIGxpYnJhcnkgc2hvdWxkIGJlIGJldHdlZW4gdGhlIHR3byBsaW1pdHMgKGluY2x1c2l2ZSkgdGhhdCB3ZXJlCisgICAgICAgKiBjYWxjdWxhdGVkIGFib3ZlLgorICAgICAgICovCisgICAgICBpZiAob2QgPj0gZXNfbG8gJiYgb2QgPD0gZXNfaGkpCisgICAgICB7CisgICAgICAgICAvKiBUaGUgdmFsdWUgcGFzc2VzLCBidXQgd2UgbWF5IG5lZWQgdG8gbG9nIHRoZSBpbmZvcm1hdGlvbiBhbnl3YXkuICovCisgICAgICAgICBpZiAoZW5jb2RlZF9lcnJvciA8IHZpLT5vdXRsb2cpCisgICAgICAgICAgICByZXR1cm4gaTsKKworICAgICAgICAgaWYgKHBhc3MgPT0gMCkKKyAgICAgICAgICAgIHBhc3MgPSAid2l0aGluIGRpZ2l0aXphdGlvbiBsaW1pdHM6XG4iOworICAgICAgfQorCisgICAgICB7CisgICAgICAgICAvKiBUaGVyZSBoYXMgYmVlbiBhbiBlcnJvciBpbiBwcm9jZXNzaW5nLCBvciB3ZSBuZWVkIHRvIGxvZyB0aGlzCisgICAgICAgICAgKiB2YWx1ZS4KKyAgICAgICAgICAqLworICAgICAgICAgZG91YmxlIGlzX2xvLCBpc19oaTsKKworICAgICAgICAgLyogcGFzcyBpcyBzZXQgYXQgdGhpcyBwb2ludCBpZiBlaXRoZXIgb2YgdGhlIHRlc3RzIGFib3ZlIHdvdWxkIGhhdmUKKyAgICAgICAgICAqIHBhc3NlZC4gIERvbid0IGRvIHRoZXNlIGFkZGl0aW9uYWwgdGVzdHMgaGVyZSAtIGp1c3QgbG9nIHRoZQorICAgICAgICAgICogb3JpZ2luYWwgW2VzX2xvLi5lc19oaV0gdmFsdWVzLgorICAgICAgICAgICovCisgICAgICAgICBpZiAocGFzcyA9PSAwICYmIHZpLT51c2VfaW5wdXRfcHJlY2lzaW9uICYmIHZpLT5kcC0+c2JpdCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE9rLCBzb21ldGhpbmcgaXMgd3JvbmcgLSB0aGlzIGFjdHVhbGx5IGhhcHBlbnMgaW4gY3VycmVudCBsaWJwbmcKKyAgICAgICAgICAgICAqIDE2LXRvLTggcHJvY2Vzc2luZy4gIEFzc3VtZSB0aGF0IHRoZSBpbnB1dCB2YWx1ZSAoaWQsIGFkanVzdGVkCisgICAgICAgICAgICAgKiBmb3Igc2JpdCkgY2FuIGJlIGFueXdoZXJlIGJldHdlZW4gdmFsdWUtLjUgYW5kIHZhbHVlKy41IC0gcXVpdGUgYQorICAgICAgICAgICAgICogbGFyZ2UgcmFuZ2UgaWYgc2JpdCBpcyBsb3cuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogTk9URTogYXQgcHJlc2VudCBiZWNhdXNlIHRoZSBsaWJwbmcgZ2FtbWEgdGFibGUgc3R1ZmYgaGFzIGJlZW4KKyAgICAgICAgICAgICAqIGNoYW5nZWQgdG8gdXNlIGEgcm91bmRpbmcgYWxnb3JpdGhtIHRvIGNvcnJlY3QgZXJyb3JzIGluIDgtYml0CisgICAgICAgICAgICAgKiBjYWxjdWxhdGlvbnMgdGhlIHByZWNpc2Ugc2JpdCBjYWxjdWxhdGlvbiAoYSBzaGlmdCkgaGFzIGJlZW4KKyAgICAgICAgICAgICAqIGxvc3QuICBUaGlzIGNhbiByZXN1bHQgaW4gdXAgdG8gYSArLy0xIGVycm9yIGluIHRoZSBwcmVzZW5jZSBvZgorICAgICAgICAgICAgICogYW4gc2JpdCBsZXNzIHRoYW4gdGhlIGJpdCBkZXB0aC4KKyAgICAgICAgICAgICAqLworIyAgICAgICAgICAgaWYgUE5HX0xJQlBOR19WRVIgPCAxMDcwMAorIyAgICAgICAgICAgICAgZGVmaW5lIFNCSVRfRVJST1IgLjUKKyMgICAgICAgICAgIGVsc2UKKyMgICAgICAgICAgICAgIGRlZmluZSBTQklUX0VSUk9SIDEuCisjICAgICAgICAgICBlbmRpZgorICAgICAgICAgICAgZG91YmxlIHRtcCA9IChpc2JpdCAtIFNCSVRfRVJST1IpL3NiaXRfbWF4OworCisgICAgICAgICAgICBpZiAodG1wIDw9IDApCisgICAgICAgICAgICAgICB0bXAgPSAwOworCisgICAgICAgICAgICBlbHNlIGlmIChhbHBoYSA+PSAwICYmIHZpLT5maWxlX2ludmVyc2UgPiAwICYmIHRtcCA8IDEpCisgICAgICAgICAgICAgICB0bXAgPSBwb3codG1wLCB2aS0+ZmlsZV9pbnZlcnNlKTsKKworICAgICAgICAgICAgdG1wID0gZ2FtbWFfY29tcG9uZW50X2NvbXBvc2UoZG9fYmFja2dyb3VuZCwgdG1wLCBhbHBoYSwgYmFja2dyb3VuZCwKKyAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICAgICAgICBpZiAob3V0cHV0X2lzX2VuY29kZWQgJiYgdG1wID4gMCAmJiB0bXAgPCAxKQorICAgICAgICAgICAgICAgdG1wID0gcG93KHRtcCwgdmktPnNjcmVlbl9pbnZlcnNlKTsKKworICAgICAgICAgICAgaXNfbG8gPSBjZWlsKG91dG1heCAqIHRtcCAtIHZpLT5tYXhvdXRfdG90YWwpOworCisgICAgICAgICAgICBpZiAoaXNfbG8gPCAwKQorICAgICAgICAgICAgICAgaXNfbG8gPSAwOworCisgICAgICAgICAgICB0bXAgPSAoaXNiaXQgKyBTQklUX0VSUk9SKS9zYml0X21heDsKKworICAgICAgICAgICAgaWYgKHRtcCA+PSAxKQorICAgICAgICAgICAgICAgdG1wID0gMTsKKworICAgICAgICAgICAgZWxzZSBpZiAoYWxwaGEgPj0gMCAmJiB2aS0+ZmlsZV9pbnZlcnNlID4gMCAmJiB0bXAgPCAxKQorICAgICAgICAgICAgICAgdG1wID0gcG93KHRtcCwgdmktPmZpbGVfaW52ZXJzZSk7CisKKyAgICAgICAgICAgIHRtcCA9IGdhbW1hX2NvbXBvbmVudF9jb21wb3NlKGRvX2JhY2tncm91bmQsIHRtcCwgYWxwaGEsIGJhY2tncm91bmQsCisgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgICAgICAgaWYgKG91dHB1dF9pc19lbmNvZGVkICYmIHRtcCA+IDAgJiYgdG1wIDwgMSkKKyAgICAgICAgICAgICAgIHRtcCA9IHBvdyh0bXAsIHZpLT5zY3JlZW5faW52ZXJzZSk7CisKKyAgICAgICAgICAgIGlzX2hpID0gZmxvb3Iob3V0bWF4ICogdG1wICsgdmktPm1heG91dF90b3RhbCk7CisKKyAgICAgICAgICAgIGlmIChpc19oaSA+IG91dG1heCkKKyAgICAgICAgICAgICAgIGlzX2hpID0gb3V0bWF4OworCisgICAgICAgICAgICBpZiAoIShvZCA8IGlzX2xvIHx8IG9kID4gaXNfaGkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKGVuY29kZWRfZXJyb3IgPCB2aS0+b3V0bG9nKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisKKyAgICAgICAgICAgICAgIHBhc3MgPSAid2l0aGluIGlucHV0IHByZWNpc2lvbiBsaW1pdHM6XG4iOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBPbmUgbGFzdCBjaGFuY2UuICBJZiB0aGlzIGlzIGFuIGFscGhhIGNoYW5uZWwgYW5kIHRoZSAxNnRvOAorICAgICAgICAgICAgICogb3B0aW9uIGhhcyBiZWVuIHVzZWQgYW5kICdpbmFjY3VyYXRlJyBzY2FsaW5nIGlzIHVzZWQgdGhlbiB0aGUKKyAgICAgICAgICAgICAqIGJpdCByZWR1Y3Rpb24gaXMgb2J0YWluZWQgYnkgc2ltcGx5IHVzaW5nIHRoZSB0b3AgOCBiaXRzIG9mIHRoZQorICAgICAgICAgICAgICogdmFsdWUuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhpcyBpcyBvbmx5IGRvbmUgZm9yIG9sZGVyIGxpYnBuZyB2ZXJzaW9ucyB3aGVuIHRoZSAnaW5hY2N1cmF0ZScKKyAgICAgICAgICAgICAqIChjaG9wKSBtZXRob2Qgb2Ygc2NhbGluZyB3YXMgdXNlZC4KKyAgICAgICAgICAgICAqLworIyAgICAgICAgICAgaWZuZGVmIFBOR19SRUFEXzE2X1RPXzhfQUNDVVJBVEVfU0NBTEVfU1VQUE9SVEVECisjICAgICAgICAgICAgICBpZiBQTkdfTElCUE5HX1ZFUiA8IDEwNTA0CisgICAgICAgICAgICAgICAgICAvKiBUaGlzIG1heSBiZSByZXF1aXJlZCBmb3Igb3RoZXIgY29tcG9uZW50cyBpbiB0aGUgZnV0dXJlLAorICAgICAgICAgICAgICAgICAgICogYnV0IGF0IHByZXNlbnQgdGhlIHByZXNlbmNlIG9mIGdhbW1hIGNvcnJlY3Rpb24gZWZmZWN0aXZlbHkKKyAgICAgICAgICAgICAgICAgICAqIHByZXZlbnRzIHRoZSBlcnJvcnMgaW4gdGhlIGNvbXBvbmVudCBzY2FsaW5nIChJIGRvbid0IHF1aXRlCisgICAgICAgICAgICAgICAgICAgKiB1bmRlcnN0YW5kIHdoeSwgYnV0IHNpbmNlIGl0J3MgYmV0dGVyIHRoaXMgd2F5IEkgY2FyZSBub3QKKyAgICAgICAgICAgICAgICAgICAqIHRvIGFzaywgSkIgMjAxMTA0MTkuKQorICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBpZiAocGFzcyA9PSAwICYmIGFscGhhIDwgMCAmJiB2aS0+c2NhbGUxNiAmJiB2aS0+c2JpdCA+IDggJiYKKyAgICAgICAgICAgICAgICAgICAgIHZpLT5zYml0ICsgdmktPmlzYml0X3NoaWZ0ID09IDE2KQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgdG1wID0gKChpZCA+PiA4KSAtIC41KS8yNTU7CisKKyAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPiAwKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaXNfbG8gPSBjZWlsKG91dG1heCAqIHRtcCAtIHZpLT5tYXhvdXRfdG90YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2xvIDwgMCkgaXNfbG8gPSAwOworICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBpc19sbyA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICgoaWQgPj4gOCkgKyAuNSkvMjU1OworCisgICAgICAgICAgICAgICAgICAgICBpZiAodG1wIDwgMSkKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzX2hpID0gZmxvb3Iob3V0bWF4ICogdG1wICsgdmktPm1heG91dF90b3RhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNfaGkgPiBvdXRtYXgpIGlzX2hpID0gb3V0bWF4OworICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBpc19oaSA9IG91dG1heDsKKworICAgICAgICAgICAgICAgICAgICAgaWYgKCEob2QgPCBpc19sbyB8fCBvZCA+IGlzX2hpKSkKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGVkX2Vycm9yIDwgdmktPm91dGxvZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOworCisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gIndpdGhpbiA4IGJpdCBsaW1pdHM6XG4iOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorIyAgICAgICAgICAgICAgZW5kaWYKKyMgICAgICAgICAgIGVuZGlmCisgICAgICAgICB9CisgICAgICAgICBlbHNlIC8qICF1c2VfaW5wdXRfcHJlY2lzaW9uICovCisgICAgICAgICAgICBpc19sbyA9IGVzX2xvLCBpc19oaSA9IGVzX2hpOworCisgICAgICAgICAvKiBBdHRlbXB0IHRvIG91dHB1dCBhIG1lYW5pbmdmdWwgZXJyb3Ivd2FybmluZyBtZXNzYWdlOiB0aGUgbWVzc2FnZQorICAgICAgICAgICogb3V0cHV0IGRlcGVuZHMgb24gdGhlIGJhY2tncm91bmQvY29tcG9zaXRlIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWQKKyAgICAgICAgICAqIGJlY2F1c2UgdGhpcyBjaGFuZ2VzIHdoYXQgcGFyYW1ldGVycyB3ZXJlIGFjdHVhbGx5IHVzZWQgYWJvdmUuCisgICAgICAgICAgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIHNpemVfdCBwb3MgPSAwOworICAgICAgICAgICAgLyogTmVlZCBlaXRoZXIgMS8yNTUgb3IgMS82NTUzNSBwcmVjaXNpb24gaGVyZTsgMyBvciA2IGRlY2ltYWwKKyAgICAgICAgICAgICAqIHBsYWNlcy4gIEp1c3QgdXNlIG91dG1heCB0byB3b3JrIG91dCB3aGljaC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW50IHByZWNpc2lvbiA9IChvdXRtYXggPj0gMTAwMCA/IDYgOiAzKTsKKyAgICAgICAgICAgIGludCB1c2VfaW5wdXQ9MSwgdXNlX2JhY2tncm91bmQ9MCwgZG9fY29tcG9zZT0wOworICAgICAgICAgICAgY2hhciBtc2dbMjU2XTsKKworICAgICAgICAgICAgaWYgKHBhc3MgIT0gMCkKKyAgICAgICAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICJcblx0Iik7CisKKyAgICAgICAgICAgIC8qIFNldCB1cCB0aGUgdmFyaW91cyBmbGFncywgdGhlIG91dHB1dF9pc19lbmNvZGVkIGZsYWcgYWJvdmUKKyAgICAgICAgICAgICAqIGlzIGFsc28gdXNlZCBiZWxvdy4gIGRvX2NvbXBvc2UgaXMganVzdCBhIGRvdWJsZSBjaGVjay4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc3dpdGNoIChkb19iYWNrZ3JvdW5kKQorICAgICAgICAgICAgeworIyAgICAgICAgICAgaWZkZWYgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQKKyAgICAgICAgICAgICAgIGNhc2UgUE5HX0JBQ0tHUk9VTkRfR0FNTUFfU0NSRUVOOgorICAgICAgICAgICAgICAgY2FzZSBQTkdfQkFDS0dST1VORF9HQU1NQV9GSUxFOgorICAgICAgICAgICAgICAgY2FzZSBQTkdfQkFDS0dST1VORF9HQU1NQV9VTklRVUU6CisgICAgICAgICAgICAgICAgICB1c2VfYmFja2dyb3VuZCA9IChhbHBoYSA+PSAwICYmIGFscGhhIDwgMSk7CisgICAgICAgICAgICAgICAgICAvKkZBTEwgVEhST1VHSCovCisjICAgICAgICAgICBlbmRpZgorIyAgICAgICAgICAgaWZkZWYgUE5HX1JFQURfQUxQSEFfTU9ERV9TVVBQT1JURUQKKyAgICAgICAgICAgICAgIGNhc2UgQUxQSEFfTU9ERV9PRkZTRVQgKyBQTkdfQUxQSEFfU1RBTkRBUkQ6CisgICAgICAgICAgICAgICBjYXNlIEFMUEhBX01PREVfT0ZGU0VUICsgUE5HX0FMUEhBX0JST0tFTjoKKyAgICAgICAgICAgICAgIGNhc2UgQUxQSEFfTU9ERV9PRkZTRVQgKyBQTkdfQUxQSEFfT1BUSU1JWkVEOgorIyAgICAgICAgICAgZW5kaWYgLyogQUxQSEFfTU9ERV9TVVBQT1JURUQgKi8KKyAgICAgICAgICAgICAgIGRvX2NvbXBvc2UgPSAoYWxwaGEgPiAwICYmIGFscGhhIDwgMSk7CisgICAgICAgICAgICAgICB1c2VfaW5wdXQgPSAoYWxwaGEgIT0gMCk7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBDaGVjayB0aGUgJ2NvbXBvc2UnIGZsYWcgKi8KKyAgICAgICAgICAgIGlmIChjb21wb3NlICE9IGRvX2NvbXBvc2UpCisgICAgICAgICAgICAgICBwbmdfZXJyb3IodmktPnBwLCAiaW50ZXJuYWwgZXJyb3IgKGNvbXBvc2UpIik7CisKKyAgICAgICAgICAgIC8qICduYW1lJyBpcyB0aGUgY29tcG9uZW50IG5hbWUgKi8KKyAgICAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsIG5hbWUpOworICAgICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgIigiKTsKKyAgICAgICAgICAgIHBvcyA9IHNhZmVjYXRuKG1zZywgc2l6ZW9mIG1zZywgcG9zLCBpZCk7CisgICAgICAgICAgICBpZiAodXNlX2lucHV0IHx8IHBhc3MgIT0gMC8qbG9nZ2luZyovKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKGlzYml0ICE9IGlkKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyogc0JJVCBoYXMgcmVkdWNlZCB0aGUgcHJlY2lzaW9uIG9mIHRoZSBpbnB1dDogKi8KKyAgICAgICAgICAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICIsIHNiaXQoIik7CisgICAgICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0bihtc2csIHNpemVvZiBtc2csIHBvcywgdmktPnNiaXQpOworICAgICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgIik6ICIpOworICAgICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdG4obXNnLCBzaXplb2YgbXNnLCBwb3MsIGlzYml0KTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICIvIik7CisgICAgICAgICAgICAgICAvKiBUaGUgb3V0cHV0IGlzIGVpdGhlciAiaWQvbWF4IiBvciAiaWQgc2JpdChzYml0KTogaXNiaXQvbWF4IiAqLworICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdG4obXNnLCBzaXplb2YgbXNnLCBwb3MsIHZpLT5zYml0X21heCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiKSIpOworCisgICAgICAgICAgICAvKiBBIGNvbXBvbmVudCBtYXkgaGF2ZSBiZWVuIG11bHRpcGxpZWQgKGluIGxpbmVhciBzcGFjZSkgYnkgdGhlCisgICAgICAgICAgICAgKiBhbHBoYSB2YWx1ZSwgJ2NvbXBvc2UnIHNheXMgd2hldGhlciB0aGlzIGlzIHJlbGV2YW50LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoY29tcG9zZSB8fCBwYXNzICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvKiBJZiBhbnkgZm9ybSBvZiBjb21wb3NpdGlvbiBpcyBiZWluZyBkb25lIHJlcG9ydCBvdXIKKyAgICAgICAgICAgICAgICAqIGNhbGN1bGF0ZWQgbGluZWFyIHZhbHVlIGhlcmUgKHRoZSBjb2RlIGFib3ZlIGRvZXNuJ3QgcmVjb3JkCisgICAgICAgICAgICAgICAgKiB0aGUgaW5wdXQgdmFsdWUgYmVmb3JlIGNvbXBvc2l0aW9uIGlzIHBlcmZvcm1lZCwgc28gd2hhdAorICAgICAgICAgICAgICAgICogZ2V0cyByZXBvcnRlZCBpcyB0aGUgdmFsdWUgYWZ0ZXIgY29tcG9zaXRpb24uKQorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICBpZiAodXNlX2lucHV0IHx8IHBhc3MgIT0gMCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICh2aS0+ZmlsZV9pbnZlcnNlID4gMCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICJeIik7CisgICAgICAgICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0ZChtc2csIHNpemVvZiBtc2csIHBvcywgdmktPmZpbGVfaW52ZXJzZSwgMik7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICJbbGluZWFyXSIpOworCisgICAgICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiKihhbHBoYSkiKTsKKyAgICAgICAgICAgICAgICAgIHBvcyA9IHNhZmVjYXRkKG1zZywgc2l6ZW9mIG1zZywgcG9zLCBhbHBoYSwgcHJlY2lzaW9uKTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgLyogTm93IHJlY29yZCB0aGUgKmxpbmVhciogYmFja2dyb3VuZCB2YWx1ZSBpZiBpdCB3YXMgdXNlZAorICAgICAgICAgICAgICAgICogKHRoaXMgZnVuY3Rpb24gaXMgbm90IHBhc3NlZCB0aGUgb3JpZ2luYWwsIG5vbi1saW5lYXIsCisgICAgICAgICAgICAgICAgKiB2YWx1ZSBidXQgaXQgaXMgY29udGFpbmVkIGluIHRoZSB0ZXN0IG5hbWUuKQorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICBpZiAodXNlX2JhY2tncm91bmQpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCB1c2VfaW5wdXQgPyAiKyIgOiAiICIpOworICAgICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgIihiYWNrZ3JvdW5kKSIpOworICAgICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdGQobXNnLCBzaXplb2YgbXNnLCBwb3MsIGJhY2tncm91bmQsIHByZWNpc2lvbik7CisgICAgICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiKiIpOworICAgICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdGQobXNnLCBzaXplb2YgbXNnLCBwb3MsIDEtYWxwaGEsIHByZWNpc2lvbik7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFJlcG9ydCB0aGUgY2FsY3VsYXRlZCB2YWx1ZSAoaW5wdXRfc2FtcGxlKSBhbmQgdGhlIGxpbmVhcml6ZWQKKyAgICAgICAgICAgICAqIGxpYnBuZyB2YWx1ZSAob3V0cHV0KSB1bmxlc3MgdGhpcyBpcyBqdXN0IGEgY29tcG9uZW50IGdhbW1hCisgICAgICAgICAgICAgKiBjb3JyZWN0aW9uLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoY29tcG9zZSB8fCBhbHBoYSA8IDAgfHwgcGFzcyAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywKKyAgICAgICAgICAgICAgICAgIHBhc3MgIT0gMCA/ICIgPVxuXHQiIDogIiA9ICIpOworICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdGQobXNnLCBzaXplb2YgbXNnLCBwb3MsIGlucHV0X3NhbXBsZSwgcHJlY2lzaW9uKTsKKyAgICAgICAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICIgKGxpYnBuZzogIik7CisgICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0ZChtc2csIHNpemVvZiBtc2csIHBvcywgb3V0cHV0LCBwcmVjaXNpb24pOworICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgIikiKTsKKworICAgICAgICAgICAgICAgLyogRmluYWxseSByZXBvcnQgdGhlIG91dHB1dCBnYW1tYSBlbmNvZGluZywgaWYgYW55LiAqLworICAgICAgICAgICAgICAgaWYgKG91dHB1dF9pc19lbmNvZGVkKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgIiBeIik7CisgICAgICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0ZChtc2csIHNpemVvZiBtc2csIHBvcywgdmktPnNjcmVlbl9pbnZlcnNlLCAyKTsKKyAgICAgICAgICAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICIodG8gc2NyZWVuKSA9Iik7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICIgW3NjcmVlbiBpcyBsaW5lYXJdID0iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCghY29tcG9zZSAmJiBhbHBoYSA+PSAwKSB8fCBwYXNzICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZiAocGFzcyAhPSAwKSAvKiBsb2dnaW5nICovCisgICAgICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiXG5cdFtvdmVyYWxsOiIpOworCisgICAgICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSBub24tY29tcG9zaXRpb24gY2FzZSwgdGhlIGludGVybmFsIGxpbmVhcgorICAgICAgICAgICAgICAgICogdmFsdWVzIGFyZSBpcnJlbGV2YW50ICh0aG91Z2ggdGhlIGxvZyBiZWxvdyB3aWxsIHJldmVhbAorICAgICAgICAgICAgICAgICogdGhlbS4pICBPdXRwdXQgYSBtdWNoIHNob3J0ZXIgd2FybmluZy9lcnJvciBtZXNzYWdlIGFuZCByZXBvcnQKKyAgICAgICAgICAgICAgICAqIHRoZSBvdmVyYWxsIGdhbW1hIGNvcnJlY3Rpb24uCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIGlmICh2aS0+Z2FtbWFfY29ycmVjdGlvbiA+IDApCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiIF4iKTsKKyAgICAgICAgICAgICAgICAgIHBvcyA9IHNhZmVjYXRkKG1zZywgc2l6ZW9mIG1zZywgcG9zLCB2aS0+Z2FtbWFfY29ycmVjdGlvbiwgMik7CisgICAgICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiKGdhbW1hIGNvcnJlY3Rpb24pID0iKTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICIgW25vIGdhbW1hIGNvcnJlY3Rpb25dID0iKTsKKworICAgICAgICAgICAgICAgaWYgKHBhc3MgIT0gMCkKKyAgICAgICAgICAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICJdIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFRoaXMgaXMgb3VyIGNhbGN1bGF0ZWQgZW5jb2RlZF9zYW1wbGUgd2hpY2ggc2hvdWxkIChidXQgZG9lcworICAgICAgICAgICAgICogbm90KSBtYXRjaCBvZDoKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgcGFzcyAhPSAwID8gIlxuXHQiIDogIiAiKTsKKyAgICAgICAgICAgIHBvcyA9IHNhZmVjYXRkKG1zZywgc2l6ZW9mIG1zZywgcG9zLCBpc19sbywgMSk7CisgICAgICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiIDwgIik7CisgICAgICAgICAgICBwb3MgPSBzYWZlY2F0ZChtc2csIHNpemVvZiBtc2csIHBvcywgZW5jb2RlZF9zYW1wbGUsIDEpOworICAgICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgIiAobGlicG5nOiAiKTsKKyAgICAgICAgICAgIHBvcyA9IHNhZmVjYXRuKG1zZywgc2l6ZW9mIG1zZywgcG9zLCBvZCk7CisgICAgICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiKSIpOworICAgICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgIi8iKTsKKyAgICAgICAgICAgIHBvcyA9IHNhZmVjYXRuKG1zZywgc2l6ZW9mIG1zZywgcG9zLCBvdXRtYXgpOworICAgICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgIiA8ICIpOworICAgICAgICAgICAgcG9zID0gc2FmZWNhdGQobXNnLCBzaXplb2YgbXNnLCBwb3MsIGlzX2hpLCAxKTsKKworICAgICAgICAgICAgaWYgKHBhc3MgPT0gMCkgLyogVGhlIGVycm9yIGNvbmRpdGlvbiAqLworICAgICAgICAgICAgeworIyAgICAgICAgICAgICAgaWZkZWYgUE5HX1dBUk5JTkdTX1NVUFBPUlRFRAorICAgICAgICAgICAgICAgICAgcG5nX3dhcm5pbmcodmktPnBwLCBtc2cpOworIyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgc3RvcmVfd2FybmluZyh2aS0+cHAsIG1zZyk7CisjICAgICAgICAgICAgICBlbmRpZgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbHNlIC8qIGxvZ2dpbmcgdGhpcyB2YWx1ZSAqLworICAgICAgICAgICAgICAgc3RvcmVfdmVyYm9zZSgmdmktPmRwLT5wbS0+dGhpcywgdmktPnBwLCBwYXNzLCBtc2cpOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICByZXR1cm4gaTsKK30KKworc3RhdGljIHZvaWQKK2dhbW1hX2ltYWdlX3ZhbGlkYXRlKGdhbW1hX2Rpc3BsYXkgKmRwLCBwbmdfY29uc3Rfc3RydWN0cCBwcCwKKyAgIHBuZ19pbmZvcCBwaSkKK3sKKyAgIC8qIEdldCBzb21lIGNvbnN0YW50cyBkZXJpdmVkIGZyb20gdGhlIGlucHV0IGFuZCBvdXRwdXQgZmlsZSBmb3JtYXRzOiAqLworICAgY29uc3QgcG5nX3N0b3JlKiBjb25zdCBwcyA9IGRwLT50aGlzLnBzOworICAgY29uc3QgcG5nX2J5dGUgaW5fY3QgPSBkcC0+dGhpcy5jb2xvdXJfdHlwZTsKKyAgIGNvbnN0IHBuZ19ieXRlIGluX2JkID0gZHAtPnRoaXMuYml0X2RlcHRoOworICAgY29uc3QgcG5nX3VpbnRfMzIgdyA9IGRwLT50aGlzLnc7CisgICBjb25zdCBwbmdfdWludF8zMiBoID0gZHAtPnRoaXMuaDsKKyAgIGNvbnN0IHNpemVfdCBjYlJvdyA9IGRwLT50aGlzLmNiUm93OworICAgY29uc3QgcG5nX2J5dGUgb3V0X2N0ID0gcG5nX2dldF9jb2xvcl90eXBlKHBwLCBwaSk7CisgICBjb25zdCBwbmdfYnl0ZSBvdXRfYmQgPSBwbmdfZ2V0X2JpdF9kZXB0aChwcCwgcGkpOworCisgICAvKiBUaGVyZSBhcmUgdGhyZWUgc291cmNlcyBvZiBlcnJvciwgZmlyc3RseSB0aGUgcXVhbnRpemF0aW9uIGluIHRoZQorICAgICogZmlsZSBlbmNvZGluZywgZGV0ZXJtaW5lZCBieSBzYml0IGFuZC9vciB0aGUgZmlsZSBkZXB0aCwgc2Vjb25kbHkKKyAgICAqIHRoZSBvdXRwdXQgKHNjcmVlbikgZ2FtbWEgYW5kIHRoaXJkbHkgdGhlIG91dHB1dCBmaWxlIGVuY29kaW5nLgorICAgICoKKyAgICAqIFNpbmNlIHRoaXMgQVBJIHJlY2VpdmVzIHRoZSBzY3JlZW4gYW5kIGZpbGUgZ2FtbWEgaW4gZG91YmxlCisgICAgKiBwcmVjaXNpb24gaXQgaXMgcG9zc2libGUgdG8gY2FsY3VsYXRlIGFuIGV4YWN0IGFuc3dlciBnaXZlbiBhbiBpbnB1dAorICAgICogcGl4ZWwgdmFsdWUuICBUaGVyZWZvcmUgd2UgYXNzdW1lIHRoYXQgdGhlICppbnB1dCogdmFsdWUgaXMgZXhhY3QgLQorICAgICogc2FtcGxlL21heHNhbXBsZSAtIGNhbGN1bGF0ZSB0aGUgY29ycmVzcG9uZGluZyBnYW1tYSBjb3JyZWN0ZWQKKyAgICAqIG91dHB1dCB0byB0aGUgbGltaXRzIG9mIGRvdWJsZSBwcmVjaXNpb24gYXJpdGhtZXRpYyBhbmQgY29tcGFyZSB3aXRoCisgICAgKiB3aGF0IGxpYnBuZyByZXR1cm5zLgorICAgICoKKyAgICAqIFNpbmNlIHRoZSBsaWJyYXJ5IG11c3QgcXVhbnRpemUgdGhlIG91dHB1dCB0byA4IG9yIDE2IGJpdHMgdGhlcmUgaXMKKyAgICAqIGEgZnVuZGFtZW50YWwgbGltaXQgb24gdGhlIGFjY3VyYWN5IG9mIHRoZSBvdXRwdXQgb2YgKy8tLjUgLSB0aGlzCisgICAgKiBxdWFudGl6YXRpb24gbGltaXQgaXMgaW5jbHVkZWQgaW4gYWRkaXRpb24gdG8gdGhlIG90aGVyIGxpbWl0cworICAgICogc3BlY2lmaWVkIGJ5IHRoZSBwYXJhbWF0ZXJzIHRvIHRoZSBBUEkuICAoRWZmZWN0aXZlbHksIGFkZCAuNQorICAgICogZXZlcnl3aGVyZS4pCisgICAgKgorICAgICogVGhlIGJlaGF2aW9yIG9mIHRoZSAnc2JpdCcgcGFyYW10ZXIgaXMgZGVmaW5lZCBieSBzZWN0aW9uIDEyLjUKKyAgICAqIChzYW1wbGUgZGVwdGggc2NhbGluZykgb2YgdGhlIFBORyBzcGVjLiAgVGhhdCBzZWN0aW9uIGZvcmNlcyB0aGUKKyAgICAqIGRlY29kZXIgdG8gYXNzdW1lIHRoYXQgdGhlIFBORyB2YWx1ZXMgaGF2ZSBiZWVuIHNjYWxlZCBpZiBzQklUIGlzCisgICAgKiBwcmVzZW50OgorICAgICoKKyAgICAqICAgICBwbmctc2FtcGxlID0gZmxvb3IoIGlucHV0LXNhbXBsZSAqIChtYXgtb3V0L21heC1pbikgKyAuNSk7CisgICAgKgorICAgICogVGhpcyBtZWFucyB0aGF0IG9ubHkgYSBzdWJzZXQgb2YgdGhlIHBvc3NpYmxlIFBORyB2YWx1ZXMgc2hvdWxkCisgICAgKiBhcHBlYXIgaW4gdGhlIGlucHV0LiBIb3dldmVyLCB0aGUgc3BlYyBhbGxvd3MgdGhlIGVuY29kZXIgdG8gdXNlIGEKKyAgICAqIHZhcmlldHkgb2YgYXBwcm94aW1hdGlvbnMgdG8gdGhlIGFib3ZlIGFuZCBkb2Vzbid0IHJlcXVpcmUgYW55CisgICAgKiByZXN0cmljdGlvbiBvZiB0aGUgdmFsdWVzIHByb2R1Y2VkLgorICAgICoKKyAgICAqIE5ldmVydGhlbGVzcyB0aGUgc3BlYyByZXF1aXJlcyB0aGF0IHRoZSB1cHBlciAnc0JJVCcgYml0cyBvZiB0aGUKKyAgICAqIHZhbHVlIHN0b3JlZCBpbiBhIFBORyBmaWxlIGJlIHRoZSBvcmlnaW5hbCBzYW1wbGUgYml0cy4KKyAgICAqIENvbnNlcXVlbnRseSB0aGUgY29kZSBiZWxvdyBzaW1wbHkgc2NhbGVzIHRoZSB0b3Agc2JpdCBiaXRzIGJ5CisgICAgKiAoMTw8c2JpdCktMSB0byBvYnRhaW4gYW4gb3JpZ2luYWwgc2FtcGxlIHZhbHVlLgorICAgICoKKyAgICAqIEJlY2F1c2UgdGhlcmUgaXMgbGltaXRlZCBwcmVjaXNpb24gaW4gdGhlIGlucHV0IGl0IGlzIGFyZ3VhYmxlIHRoYXQKKyAgICAqIGFuIGFjY2VwdGFibGUgcmVzdWx0IGlzIGFueSB2YWxpZCByZXN1bHQgZnJvbSBpbnB1dC0uNSB0byBpbnB1dCsuNS4KKyAgICAqIFRoZSBiYXNpYyB0ZXN0cyBiZWxvdyBkbyBub3QgZG8gdGhpcywgaG93ZXZlciBpZiAndXNlX2lucHV0X3ByZWNpc2lvbicKKyAgICAqIGlzIHNldCBhIHN1YnNlcXVlbnQgdGVzdCBpcyBwZXJmb3JtZWQgYWJvdmUuCisgICAgKi8KKyAgIGNvbnN0IHVuc2lnbmVkIGludCBzYW1wbGVzX3Blcl9waXhlbCA9IChvdXRfY3QgJiAyVSkgPyAzVSA6IDFVOworICAgaW50IHByb2Nlc3Npbmc7CisgICBwbmdfdWludF8zMiB5OworICAgY29uc3Qgc3RvcmVfcGFsZXR0ZV9lbnRyeSAqaW5fcGFsZXR0ZSA9IGRwLT50aGlzLnBhbGV0dGU7CisgICBjb25zdCBpbnQgaW5faXNfdHJhbnNwYXJlbnQgPSBkcC0+dGhpcy5pc190cmFuc3BhcmVudDsKKyAgIGludCBwcm9jZXNzX3RSTlM7CisgICBpbnQgb3V0X25wYWxldHRlID0gLTE7CisgICBpbnQgb3V0X2lzX3RyYW5zcGFyZW50ID0gMDsgLyogSnVzdCByZWZlcnMgdG8gdGhlIHBhbGV0dGUgY2FzZSAqLworICAgc3RvcmVfcGFsZXR0ZSBvdXRfcGFsZXR0ZTsKKyAgIHZhbGlkYXRlX2luZm8gdmk7CisKKyAgIC8qIENoZWNrIGZvciByb3cgb3ZlcndyaXRlIGVycm9ycyAqLworICAgc3RvcmVfaW1hZ2VfY2hlY2soZHAtPnRoaXMucHMsIHBwLCAwKTsKKworICAgLyogU3VwcGx5IHRoZSBpbnB1dCBhbmQgb3V0cHV0IHNhbXBsZSBkZXB0aHMgaGVyZSAtIDggZm9yIGFuIGluZGV4ZWQgaW1hZ2UsCisgICAgKiBvdGhlcndpc2UgdGhlIGJpdCBkZXB0aC4KKyAgICAqLworICAgaW5pdF92YWxpZGF0ZV9pbmZvKCZ2aSwgZHAsIHBwLCBpbl9jdD09Mz84OmluX2JkLCBvdXRfY3Q9PTM/ODpvdXRfYmQpOworCisgICBwcm9jZXNzaW5nID0gKHZpLmdhbW1hX2NvcnJlY3Rpb24gPiAwICYmICFkcC0+dGhyZXNob2xkX3Rlc3QpCisgICAgICB8fCBpbl9iZCAhPSBvdXRfYmQgfHwgaW5fY3QgIT0gb3V0X2N0IHx8IHZpLmRvX2JhY2tncm91bmQ7CisgICBwcm9jZXNzX3RSTlMgPSBkcC0+dGhpcy5oYXNfdFJOUyAmJiB2aS5kb19iYWNrZ3JvdW5kOworCisgICAvKiBUT0RPOiBGSVggVEhJUzogTUFKT1IgQlVHISAgSWYgdGhlIHRyYW5zZm9ybWF0aW9ucyBhbGwgaGFwcGVuIGluc2lkZQorICAgICogdGhlIHBhbGV0dGUgdGhlcmUgaXMgbm8gd2F5IG9mIGZpbmRpbmcgb3V0LCBiZWNhdXNlIGxpYnBuZyBmYWlscyB0bworICAgICogdXBkYXRlIHRoZSBwYWxldHRlIG9uIHBuZ19yZWFkX3VwZGF0ZV9pbmZvLiAgSW5kZWVkLCBsaWJwbmcgZG9lc24ndAorICAgICogZXZlbiBkbyB0aGUgcmVxdWlyZWQgd29yayB1bnRpbCBtdWNoIGxhdGVyLCB3aGVuIGl0IGRvZXNuJ3QgaGF2ZSBhbnkKKyAgICAqIGluZm8gcG9pbnRlci4gIE9vcHMuICBGb3IgdGhlIG1vbWVudCAncHJvY2Vzc2luZycgaXMgdHVybmVkIG9mZiBpZgorICAgICogb3V0X2N0IGlzIHBhbGV0dGUuCisgICAgKi8KKyAgIGlmIChpbl9jdCA9PSAzICYmIG91dF9jdCA9PSAzKQorICAgICAgcHJvY2Vzc2luZyA9IDA7CisKKyAgIGlmIChwcm9jZXNzaW5nICYmIG91dF9jdCA9PSAzKQorICAgICAgb3V0X2lzX3RyYW5zcGFyZW50ID0gcmVhZF9wYWxldHRlKG91dF9wYWxldHRlLCAmb3V0X25wYWxldHRlLCBwcCwgcGkpOworCisgICBmb3IgKHk9MDsgeTxoOyArK3kpCisgICB7CisgICAgICBwbmdfY29uc3RfYnl0ZXAgcFJvdyA9IHN0b3JlX2ltYWdlX3JvdyhwcywgcHAsIDAsIHkpOworICAgICAgcG5nX2J5dGUgc3RkW1NUQU5EQVJEX1JPV01BWF07CisKKyAgICAgIHRyYW5zZm9ybV9yb3cocHAsIHN0ZCwgaW5fY3QsIGluX2JkLCB5KTsKKworICAgICAgaWYgKHByb2Nlc3NpbmcpCisgICAgICB7CisgICAgICAgICB1bnNpZ25lZCBpbnQgeDsKKworICAgICAgICAgZm9yICh4PTA7IHg8dzsgKyt4KQorICAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIGFscGhhID0gMTsgLyogc2VydmVzIGFzIGEgZmxhZyB2YWx1ZSAqLworCisgICAgICAgICAgICAvKiBSZWNvcmQgdGhlIHBhbGV0dGUgaW5kZXggZm9yIGluZGV4IGltYWdlcy4gKi8KKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBpbl9pbmRleCA9CisgICAgICAgICAgICAgICBpbl9jdCA9PSAzID8gc2FtcGxlKHN0ZCwgMywgaW5fYmQsIHgsIDAsIDAsIDApIDogMjU2OworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IG91dF9pbmRleCA9CisgICAgICAgICAgICAgICBvdXRfY3QgPT0gMyA/IHNhbXBsZShzdGQsIDMsIG91dF9iZCwgeCwgMCwgMCwgMCkgOiAyNTY7CisKKyAgICAgICAgICAgIC8qIEhhbmRsZSBpbnB1dCBhbHBoYSAtIHBuZ19zZXRfYmFja2dyb3VuZCB3aWxsIGNhdXNlIHRoZSBvdXRwdXQKKyAgICAgICAgICAgICAqIGFscGhhIHRvIGRpc2FwcGVhciBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGNoZWNrLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoKGluX2N0ICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpICE9IDAgfHwKKyAgICAgICAgICAgICAgICAoaW5fY3QgPT0gMyAmJiBpbl9pc190cmFuc3BhcmVudCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgaW5wdXRfYWxwaGEgPSBpbl9jdCA9PSAzID8KKyAgICAgICAgICAgICAgICAgIGRwLT50aGlzLnBhbGV0dGVbaW5faW5kZXhdLmFscGhhIDoKKyAgICAgICAgICAgICAgICAgIHNhbXBsZShzdGQsIGluX2N0LCBpbl9iZCwgeCwgc2FtcGxlc19wZXJfcGl4ZWwsIDAsIDApOworCisgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgb3V0cHV0X2FscGhhID0gNjU1MzYgLyogYXMgYSBmbGFnIHZhbHVlICovOworCisgICAgICAgICAgICAgICBpZiAob3V0X2N0ID09IDMpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAob3V0X2lzX3RyYW5zcGFyZW50KQorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2FscGhhID0gb3V0X3BhbGV0dGVbb3V0X2luZGV4XS5hbHBoYTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgZWxzZSBpZiAoKG91dF9jdCAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKSAhPSAwKQorICAgICAgICAgICAgICAgICAgb3V0cHV0X2FscGhhID0gc2FtcGxlKHBSb3csIG91dF9jdCwgb3V0X2JkLCB4LAorICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc19wZXJfcGl4ZWwsIDAsIDApOworCisgICAgICAgICAgICAgICBpZiAob3V0cHV0X2FscGhhICE9IDY1NTM2KQorICAgICAgICAgICAgICAgICAgYWxwaGEgPSBnYW1tYV9jb21wb25lbnRfdmFsaWRhdGUoImFscGhhIiwgJnZpLCBpbnB1dF9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9hbHBoYSwgLTEvKmFscGhhKi8sIDAvKmJhY2tncm91bmQqLyk7CisKKyAgICAgICAgICAgICAgIGVsc2UgLyogbm8gYWxwaGEgaW4gb3V0cHV0ICovCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiBUaGlzIGlzIGEgY29weSBvZiB0aGUgY2FsY3VsYXRpb24gb2YgJ2knIGFib3ZlIGluIG9yZGVyIHRvCisgICAgICAgICAgICAgICAgICAgKiBoYXZlIHRoZSBhbHBoYSB2YWx1ZSB0byB1c2UgaW4gdGhlIGJhY2tncm91bmQgY2FsY3VsYXRpb24uCisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIGFscGhhID0gaW5wdXRfYWxwaGEgPj4gdmkuaXNiaXRfc2hpZnQ7CisgICAgICAgICAgICAgICAgICBhbHBoYSAvPSB2aS5zYml0X21heDsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWxzZSBpZiAocHJvY2Vzc190Uk5TKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLyogYWxwaGEgbmVlZHMgdG8gYmUgc2V0IGFwcHJvcHJpYXRlbHkgZm9yIHRoaXMgcGl4ZWwsIGl0IGlzCisgICAgICAgICAgICAgICAgKiBjdXJyZW50bHkgMSBhbmQgbmVlZHMgdG8gYmUgMCBmb3IgYW4gaW5wdXQgcGl4ZWwgd2hpY2ggbWF0Y2hlcworICAgICAgICAgICAgICAgICogdGhlIHZhbHVlcyBpbiB0Uk5TLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICBzd2l0Y2ggKGluX2N0KQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgY2FzZSAwOiAvKiBncmF5ICovCisgICAgICAgICAgICAgICAgICAgICBpZiAoc2FtcGxlKHN0ZCwgaW5fY3QsIGluX2JkLCB4LCAwLCAwLCAwKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZHAtPnRoaXMudHJhbnNwYXJlbnQucmVkKQorICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgIGNhc2UgMjogLyogUkdCICovCisgICAgICAgICAgICAgICAgICAgICBpZiAoc2FtcGxlKHN0ZCwgaW5fY3QsIGluX2JkLCB4LCAwLCAwLCAwKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZHAtPnRoaXMudHJhbnNwYXJlbnQucmVkICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlKHN0ZCwgaW5fY3QsIGluX2JkLCB4LCAxLCAwLCAwKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZHAtPnRoaXMudHJhbnNwYXJlbnQuZ3JlZW4gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUoc3RkLCBpbl9jdCwgaW5fYmQsIHgsIDIsIDAsIDApID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICBkcC0+dGhpcy50cmFuc3BhcmVudC5ibHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogSGFuZGxlIGdyYXlzY2FsZSBvciBSR0IgY29tcG9uZW50cy4gKi8KKyAgICAgICAgICAgIGlmICgoaW5fY3QgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikgPT0gMCkgLyogZ3JheXNjYWxlICovCisgICAgICAgICAgICAgICAodm9pZClnYW1tYV9jb21wb25lbnRfdmFsaWRhdGUoImdyYXkiLCAmdmksCisgICAgICAgICAgICAgICAgICBzYW1wbGUoc3RkLCBpbl9jdCwgaW5fYmQsIHgsIDAsIDAsIDApLAorICAgICAgICAgICAgICAgICAgc2FtcGxlKHBSb3csIG91dF9jdCwgb3V0X2JkLCB4LCAwLCAwLCAwKSwKKyAgICAgICAgICAgICAgICAgIGFscGhhLypjb21wb25lbnQqLywgdmkuYmFja2dyb3VuZF9yZWQpOworICAgICAgICAgICAgZWxzZSAvKiBSR0Igb3IgcGFsZXR0ZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgKHZvaWQpZ2FtbWFfY29tcG9uZW50X3ZhbGlkYXRlKCJyZWQiLCAmdmksCisgICAgICAgICAgICAgICAgICBpbl9jdCA9PSAzID8gaW5fcGFsZXR0ZVtpbl9pbmRleF0ucmVkIDoKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsZShzdGQsIGluX2N0LCBpbl9iZCwgeCwgMCwgMCwgMCksCisgICAgICAgICAgICAgICAgICBvdXRfY3QgPT0gMyA/IG91dF9wYWxldHRlW291dF9pbmRleF0ucmVkIDoKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsZShwUm93LCBvdXRfY3QsIG91dF9iZCwgeCwgMCwgMCwgMCksCisgICAgICAgICAgICAgICAgICBhbHBoYS8qY29tcG9uZW50Ki8sIHZpLmJhY2tncm91bmRfcmVkKTsKKworICAgICAgICAgICAgICAgKHZvaWQpZ2FtbWFfY29tcG9uZW50X3ZhbGlkYXRlKCJncmVlbiIsICZ2aSwKKyAgICAgICAgICAgICAgICAgIGluX2N0ID09IDMgPyBpbl9wYWxldHRlW2luX2luZGV4XS5ncmVlbiA6CisgICAgICAgICAgICAgICAgICAgICBzYW1wbGUoc3RkLCBpbl9jdCwgaW5fYmQsIHgsIDEsIDAsIDApLAorICAgICAgICAgICAgICAgICAgb3V0X2N0ID09IDMgPyBvdXRfcGFsZXR0ZVtvdXRfaW5kZXhdLmdyZWVuIDoKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsZShwUm93LCBvdXRfY3QsIG91dF9iZCwgeCwgMSwgMCwgMCksCisgICAgICAgICAgICAgICAgICBhbHBoYS8qY29tcG9uZW50Ki8sIHZpLmJhY2tncm91bmRfZ3JlZW4pOworCisgICAgICAgICAgICAgICAodm9pZClnYW1tYV9jb21wb25lbnRfdmFsaWRhdGUoImJsdWUiLCAmdmksCisgICAgICAgICAgICAgICAgICBpbl9jdCA9PSAzID8gaW5fcGFsZXR0ZVtpbl9pbmRleF0uYmx1ZSA6CisgICAgICAgICAgICAgICAgICAgICBzYW1wbGUoc3RkLCBpbl9jdCwgaW5fYmQsIHgsIDIsIDAsIDApLAorICAgICAgICAgICAgICAgICAgb3V0X2N0ID09IDMgPyBvdXRfcGFsZXR0ZVtvdXRfaW5kZXhdLmJsdWUgOgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxlKHBSb3csIG91dF9jdCwgb3V0X2JkLCB4LCAyLCAwLCAwKSwKKyAgICAgICAgICAgICAgICAgIGFscGhhLypjb21wb25lbnQqLywgdmkuYmFja2dyb3VuZF9ibHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZWxzZSBpZiAobWVtY21wKHN0ZCwgcFJvdywgY2JSb3cpICE9IDApCisgICAgICB7CisgICAgICAgICBjaGFyIG1zZ1s2NF07CisKKyAgICAgICAgIC8qIE5vIHRyYW5zZm9ybSBpcyBleHBlY3RlZCBvbiB0aGUgdGhyZXNob2xkIHRlc3RzLiAqLworICAgICAgICAgc3ByaW50Zihtc2csICJnYW1tYTogYmVsb3cgdGhyZXNob2xkIHJvdyAlbHUgY2hhbmdlZCIsCisgICAgICAgICAgICAodW5zaWduZWQgbG9uZyl5KTsKKworICAgICAgICAgcG5nX2Vycm9yKHBwLCBtc2cpOworICAgICAgfQorICAgfSAvKiByb3cgKHkpIGxvb3AgKi8KKworICAgZHAtPnRoaXMucHMtPnZhbGlkYXRlZCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIFBOR0NCQVBJCitnYW1tYV9lbmQocG5nX3N0cnVjdHAgcHBJbiwgcG5nX2luZm9wIHBpKQoreworICAgcG5nX2NvbnN0X3N0cnVjdHAgcHAgPSBwcEluOworICAgZ2FtbWFfZGlzcGxheSAqZHAgPSB2b2lkY2FzdChnYW1tYV9kaXNwbGF5KiwgcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIocHApKTsKKworICAgaWYgKCFkcC0+dGhpcy5zcGVlZCkKKyAgICAgIGdhbW1hX2ltYWdlX3ZhbGlkYXRlKGRwLCBwcCwgcGkpOworICAgZWxzZQorICAgICAgZHAtPnRoaXMucHMtPnZhbGlkYXRlZCA9IDE7Cit9CisKKy8qIEEgc2luZ2xlIHRlc3QgcnVuIGNoZWNraW5nIGEgZ2FtbWEgdHJhbnNmb3JtYXRpb24uCisgKgorICogbWF4YWJzOiBtYXhpbXVtIGFic29sdXRlIGVycm9yIGFzIGEgZnJhY3Rpb24KKyAqIG1heG91dDogbWF4aW11bSBvdXRwdXQgZXJyb3IgaW4gdGhlIG91dHB1dCB1bml0cworICogbWF4cGM6ICBtYXhpbXVtIHBlcmNlbnRhZ2UgZXJyb3IgKGFzIGEgcGVyY2VudGFnZSkKKyAqLworc3RhdGljIHZvaWQKK2dhbW1hX3Rlc3QocG5nX21vZGlmaWVyICpwbUluLCBjb25zdCBwbmdfYnl0ZSBjb2xvdXJfdHlwZUluLAorICAgIGNvbnN0IHBuZ19ieXRlIGJpdF9kZXB0aEluLCBjb25zdCBpbnQgcGFsZXR0ZV9udW1iZXJJbiwKKyAgICBjb25zdCBpbnQgaW50ZXJsYWNlX3R5cGVJbiwKKyAgICBjb25zdCBkb3VibGUgZmlsZV9nYW1tYUluLCBjb25zdCBkb3VibGUgc2NyZWVuX2dhbW1hSW4sCisgICAgY29uc3QgcG5nX2J5dGUgc2JpdEluLCBjb25zdCBpbnQgdGhyZXNob2xkX3Rlc3RJbiwKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGNvbnN0IGludCB1c2VfaW5wdXRfcHJlY2lzaW9uSW4sIGNvbnN0IGludCBzY2FsZTE2SW4sCisgICAgY29uc3QgaW50IGV4cGFuZDE2SW4sIGNvbnN0IGludCBkb19iYWNrZ3JvdW5kSW4sCisgICAgY29uc3QgcG5nX2NvbG9yXzE2ICpia2dkX2NvbG9ySW4sIGRvdWJsZSBia2dkX2dhbW1hSW4pCit7CisgICBnYW1tYV9kaXNwbGF5IGQ7CisgICBjb250ZXh0KCZwbUluLT50aGlzLCBmYXVsdCk7CisKKyAgIGdhbW1hX2Rpc3BsYXlfaW5pdCgmZCwgcG1JbiwgRklMRUlEKGNvbG91cl90eXBlSW4sIGJpdF9kZXB0aEluLAorICAgICAgcGFsZXR0ZV9udW1iZXJJbiwgaW50ZXJsYWNlX3R5cGVJbiwgMCwgMCwgMCksCisgICAgICBmaWxlX2dhbW1hSW4sIHNjcmVlbl9nYW1tYUluLCBzYml0SW4sCisgICAgICB0aHJlc2hvbGRfdGVzdEluLCB1c2VfaW5wdXRfcHJlY2lzaW9uSW4sIHNjYWxlMTZJbiwKKyAgICAgIGV4cGFuZDE2SW4sIGRvX2JhY2tncm91bmRJbiwgYmtnZF9jb2xvckluLCBia2dkX2dhbW1hSW4pOworCisgICBUcnkKKyAgIHsKKyAgICAgIHBuZ19zdHJ1Y3RwIHBwOworICAgICAgcG5nX2luZm9wIHBpOworICAgICAgZ2FtYV9tb2RpZmljYXRpb24gZ2FtYV9tb2Q7CisgICAgICBzcmdiX21vZGlmaWNhdGlvbiBzcmdiX21vZDsKKyAgICAgIHNiaXRfbW9kaWZpY2F0aW9uIHNiaXRfbW9kOworCisgICAgICAvKiBGb3IgdGhlIG1vbWVudCBkb24ndCB1c2UgdGhlIHBuZ19tb2RpZmllciBzdXBwb3J0IGhlcmUuICovCisgICAgICBkLnBtLT5lbmNvZGluZ19jb3VudGVyID0gMDsKKyAgICAgIG1vZGlmaWVyX3NldF9lbmNvZGluZyhkLnBtKTsgLyogSnVzdCByZXNldHMgZXZlcnl0aGluZyAqLworICAgICAgZC5wbS0+Y3VycmVudF9nYW1tYSA9IGQuZmlsZV9nYW1tYTsKKworICAgICAgLyogTWFrZSBhbiBhcHByb3ByaWF0ZSBtb2RpZmllciB0byBzZXQgdGhlIFBORyBmaWxlIGdhbW1hIHRvIHRoZQorICAgICAgICogZ2l2ZW4gZ2FtbWEgdmFsdWUgYW5kIHRoZSBzQklUIGNodW5rIHRvIHRoZSBnaXZlbiBwcmVjaXNpb24uCisgICAgICAgKi8KKyAgICAgIGQucG0tPm1vZGlmaWNhdGlvbnMgPSBOVUxMOworICAgICAgZ2FtYV9tb2RpZmljYXRpb25faW5pdCgmZ2FtYV9tb2QsIGQucG0sIGQuZmlsZV9nYW1tYSk7CisgICAgICBzcmdiX21vZGlmaWNhdGlvbl9pbml0KCZzcmdiX21vZCwgZC5wbSwgMTI3IC8qZGVsZXRlKi8pOworICAgICAgaWYgKGQuc2JpdCA+IDApCisgICAgICAgICBzYml0X21vZGlmaWNhdGlvbl9pbml0KCZzYml0X21vZCwgZC5wbSwgZC5zYml0KTsKKworICAgICAgbW9kaWZpY2F0aW9uX3Jlc2V0KGQucG0tPm1vZGlmaWNhdGlvbnMpOworCisgICAgICAvKiBHZXQgYSBwbmdfc3RydWN0IGZvciByZWFkaW5nIHRoZSBpbWFnZS4gKi8KKyAgICAgIHBwID0gc2V0X21vZGlmaWVyX2Zvcl9yZWFkKGQucG0sICZwaSwgZC50aGlzLmlkLCBuYW1lKTsKKyAgICAgIHN0YW5kYXJkX3BhbGV0dGVfaW5pdCgmZC50aGlzKTsKKworICAgICAgLyogSW50cm9kdWNlIHRoZSBjb3JyZWN0IHJlYWQgZnVuY3Rpb24uICovCisgICAgICBpZiAoZC5wbS0+dGhpcy5wcm9ncmVzc2l2ZSkKKyAgICAgIHsKKyAgICAgICAgIC8qIFNoYXJlIHRoZSByb3cgZnVuY3Rpb24gd2l0aCB0aGUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24uICovCisgICAgICAgICBwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4ocHAsICZkLCBnYW1tYV9pbmZvLCBwcm9ncmVzc2l2ZV9yb3csCisgICAgICAgICAgICBnYW1tYV9lbmQpOworCisgICAgICAgICAvKiBOb3cgZmVlZCBkYXRhIGludG8gdGhlIHJlYWRlciB1bnRpbCB3ZSByZWFjaCB0aGUgZW5kOiAqLworICAgICAgICAgbW9kaWZpZXJfcHJvZ3Jlc3NpdmVfcmVhZChkLnBtLCBwcCwgcGkpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgLyogbW9kaWZpZXJfcmVhZCBleHBlY3RzIGEgcG5nX21vZGlmaWVyKiAqLworICAgICAgICAgcG5nX3NldF9yZWFkX2ZuKHBwLCBkLnBtLCBtb2RpZmllcl9yZWFkKTsKKworICAgICAgICAgLyogQ2hlY2sgdGhlIGhlYWRlciB2YWx1ZXM6ICovCisgICAgICAgICBwbmdfcmVhZF9pbmZvKHBwLCBwaSk7CisKKyAgICAgICAgIC8qIFByb2Nlc3MgdGhlICdpbmZvJyByZXF1aXJlbWVudHMuIE9ubHkgb25lIGltYWdlIGlzIGdlbmVyYXRlZCAqLworICAgICAgICAgZ2FtbWFfaW5mb19pbXAoJmQsIHBwLCBwaSk7CisKKyAgICAgICAgIHNlcXVlbnRpYWxfcm93KCZkLnRoaXMsIHBwLCBwaSwgLTEsIDApOworCisgICAgICAgICBpZiAoIWQudGhpcy5zcGVlZCkKKyAgICAgICAgICAgIGdhbW1hX2ltYWdlX3ZhbGlkYXRlKCZkLCBwcCwgcGkpOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgZC50aGlzLnBzLT52YWxpZGF0ZWQgPSAxOworICAgICAgfQorCisgICAgICBtb2RpZmllcl9yZXNldChkLnBtKTsKKworICAgICAgaWYgKGQucG0tPmxvZyAmJiAhZC50aHJlc2hvbGRfdGVzdCAmJiAhZC50aGlzLnNwZWVkKQorICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlZCBiaXQgJXMgJXM6IG1heCBlcnJvciAlZiAoJS4yZywgJTJnJSUpXG4iLAorICAgICAgICAgICAgZC50aGlzLmJpdF9kZXB0aCwgY29sb3VyX3R5cGVzW2QudGhpcy5jb2xvdXJfdHlwZV0sIG5hbWUsCisgICAgICAgICAgICBkLm1heGVycm91dCwgZC5tYXhlcnJhYnMsIDEwMCpkLm1heGVycnBjKTsKKworICAgICAgLyogTG9nIHRoZSBzdW1tYXJ5IHZhbHVlcyB0b28uICovCisgICAgICBpZiAoZC50aGlzLmNvbG91cl90eXBlID09IDAgfHwgZC50aGlzLmNvbG91cl90eXBlID09IDQpCisgICAgICB7CisgICAgICAgICBzd2l0Y2ggKGQudGhpcy5iaXRfZGVwdGgpCisgICAgICAgICB7CisgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgaWYgKGQubWF4ZXJyb3V0ID4gZC5wbS0+ZXJyb3JfZ3JheV8yKQorICAgICAgICAgICAgICAgZC5wbS0+ZXJyb3JfZ3JheV8yID0gZC5tYXhlcnJvdXQ7CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBpZiAoZC5tYXhlcnJvdXQgPiBkLnBtLT5lcnJvcl9ncmF5XzQpCisgICAgICAgICAgICAgICBkLnBtLT5lcnJvcl9ncmF5XzQgPSBkLm1heGVycm91dDsKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIGlmIChkLm1heGVycm91dCA+IGQucG0tPmVycm9yX2dyYXlfOCkKKyAgICAgICAgICAgICAgIGQucG0tPmVycm9yX2dyYXlfOCA9IGQubWF4ZXJyb3V0OworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgIGlmIChkLm1heGVycm91dCA+IGQucG0tPmVycm9yX2dyYXlfMTYpCisgICAgICAgICAgICAgICBkLnBtLT5lcnJvcl9ncmF5XzE2ID0gZC5tYXhlcnJvdXQ7CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcG5nX2Vycm9yKHBwLCAiYmFkIGJpdCBkZXB0aCAoaW50ZXJuYWw6IDEpIik7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGVsc2UgaWYgKGQudGhpcy5jb2xvdXJfdHlwZSA9PSAyIHx8IGQudGhpcy5jb2xvdXJfdHlwZSA9PSA2KQorICAgICAgeworICAgICAgICAgc3dpdGNoIChkLnRoaXMuYml0X2RlcHRoKQorICAgICAgICAgeworICAgICAgICAgY2FzZSA4OgorCisgICAgICAgICAgICBpZiAoZC5tYXhlcnJvdXQgPiBkLnBtLT5lcnJvcl9jb2xvcl84KQorICAgICAgICAgICAgICAgZC5wbS0+ZXJyb3JfY29sb3JfOCA9IGQubWF4ZXJyb3V0OworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSAxNjoKKworICAgICAgICAgICAgaWYgKGQubWF4ZXJyb3V0ID4gZC5wbS0+ZXJyb3JfY29sb3JfMTYpCisgICAgICAgICAgICAgICBkLnBtLT5lcnJvcl9jb2xvcl8xNiA9IGQubWF4ZXJyb3V0OworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHBuZ19lcnJvcihwcCwgImJhZCBiaXQgZGVwdGggKGludGVybmFsOiAyKSIpOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBlbHNlIGlmIChkLnRoaXMuY29sb3VyX3R5cGUgPT0gMykKKyAgICAgIHsKKyAgICAgICAgIGlmIChkLm1heGVycm91dCA+IGQucG0tPmVycm9yX2luZGV4ZWQpCisgICAgICAgICAgICBkLnBtLT5lcnJvcl9pbmRleGVkID0gZC5tYXhlcnJvdXQ7CisgICAgICB9CisgICB9CisKKyAgIENhdGNoKGZhdWx0KQorICAgICAgbW9kaWZpZXJfcmVzZXQodm9pZGNhc3QocG5nX21vZGlmaWVyKiwodm9pZCopZmF1bHQpKTsKK30KKworc3RhdGljIHZvaWQgZ2FtbWFfdGhyZXNob2xkX3Rlc3QocG5nX21vZGlmaWVyICpwbSwgcG5nX2J5dGUgY29sb3VyX3R5cGUsCisgICAgcG5nX2J5dGUgYml0X2RlcHRoLCBpbnQgaW50ZXJsYWNlX3R5cGUsIGRvdWJsZSBmaWxlX2dhbW1hLAorICAgIGRvdWJsZSBzY3JlZW5fZ2FtbWEpCit7CisgICBzaXplX3QgcG9zID0gMDsKKyAgIGNoYXIgbmFtZVs2NF07CisgICBwb3MgPSBzYWZlY2F0KG5hbWUsIHNpemVvZiBuYW1lLCBwb3MsICJ0aHJlc2hvbGQgIik7CisgICBwb3MgPSBzYWZlY2F0ZChuYW1lLCBzaXplb2YgbmFtZSwgcG9zLCBmaWxlX2dhbW1hLCAzKTsKKyAgIHBvcyA9IHNhZmVjYXQobmFtZSwgc2l6ZW9mIG5hbWUsIHBvcywgIi8iKTsKKyAgIHBvcyA9IHNhZmVjYXRkKG5hbWUsIHNpemVvZiBuYW1lLCBwb3MsIHNjcmVlbl9nYW1tYSwgMyk7CisKKyAgICh2b2lkKWdhbW1hX3Rlc3QocG0sIGNvbG91cl90eXBlLCBiaXRfZGVwdGgsIDAvKnBhbGV0dGUqLywgaW50ZXJsYWNlX3R5cGUsCisgICAgICBmaWxlX2dhbW1hLCBzY3JlZW5fZ2FtbWEsIDAvKnNCSVQqLywgMS8qdGhyZXNob2xkIHRlc3QqLywgbmFtZSwKKyAgICAgIDAgLypubyBpbnB1dCBwcmVjaXNpb24qLywKKyAgICAgIDAgLypubyBzY2FsZTE2Ki8sIDAgLypubyBleHBhbmQxNiovLCAwIC8qbm8gYmFja2dyb3VuZCovLCAwIC8qaGVuY2UqLywKKyAgICAgIDAgLypubyBiYWNrZ3JvdW5kIGdhbW1hKi8pOworfQorCitzdGF0aWMgdm9pZAorcGVyZm9ybV9nYW1tYV90aHJlc2hvbGRfdGVzdHMocG5nX21vZGlmaWVyICpwbSkKK3sKKyAgIHBuZ19ieXRlIGNvbG91cl90eXBlID0gMDsKKyAgIHBuZ19ieXRlIGJpdF9kZXB0aCA9IDA7CisgICB1bnNpZ25lZCBpbnQgcGFsZXR0ZV9udW1iZXIgPSAwOworCisgICAvKiBEb24ndCB0ZXN0IG1vcmUgdGhhbiBvbmUgaW5zdGFuY2Ugb2YgZWFjaCBwYWxldHRlIC0gaXQncyBwb2ludGxlc3MsIGluCisgICAgKiBmYWN0IHRoaXMgdGVzdCBpcyBzb21ld2hhdCBleGNlc3NpdmUgc2luY2UgbGlicG5nIGRvZXNuJ3QgbWFrZSB0aGlzCisgICAgKiBkZWNpc2lvbiBiYXNlZCBvbiBjb2xvdXIgdHlwZSBvciBiaXQgZGVwdGghCisgICAgKgorICAgICogQ0hBTkdFRDogbm93IHRlc3QgdHdvIHBhbGV0dGVzIGFuZCwgYXMgYSBzaWRlIGVmZmVjdCwgaW1hZ2VzIHdpdGggYW5kCisgICAgKiB3aXRob3V0IHRSTlMuCisgICAgKi8KKyAgIHdoaWxlIChuZXh0X2Zvcm1hdCgmY29sb3VyX3R5cGUsICZiaXRfZGVwdGgsICZwYWxldHRlX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICBwbS0+dGVzdF9sYmdfZ2FtbWFfdGhyZXNob2xkLCBwbS0+dGVzdF90Uk5TKSkKKyAgICAgIGlmIChwYWxldHRlX251bWJlciA8IDIpCisgICB7CisgICAgICBkb3VibGUgdGVzdF9nYW1tYSA9IDEuMDsKKyAgICAgIHdoaWxlICh0ZXN0X2dhbW1hID49IC40KQorICAgICAgeworICAgICAgICAgLyogVGhlcmUncyBsaXR0bGUgcG9pbnQgdGVzdGluZyB0aGUgaW50ZXJsYWNpbmcgdnMgbm9uLWludGVybGFjaW5nLAorICAgICAgICAgICogYnV0IHRoaXMgY2FuIGJlIHNldCBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCisgICAgICAgICAgKi8KKyAgICAgICAgIGdhbW1hX3RocmVzaG9sZF90ZXN0KHBtLCBjb2xvdXJfdHlwZSwgYml0X2RlcHRoLCBwbS0+aW50ZXJsYWNlX3R5cGUsCisgICAgICAgICAgICB0ZXN0X2dhbW1hLCAxL3Rlc3RfZ2FtbWEpOworICAgICAgICAgdGVzdF9nYW1tYSAqPSAuOTU7CisgICAgICB9CisKKyAgICAgIC8qIEFuZCBhIHNwZWNpYWwgdGVzdCBmb3Igc1JHQiAqLworICAgICAgZ2FtbWFfdGhyZXNob2xkX3Rlc3QocG0sIGNvbG91cl90eXBlLCBiaXRfZGVwdGgsIHBtLT5pbnRlcmxhY2VfdHlwZSwKKyAgICAgICAgICAuNDU0NTUsIDIuMik7CisKKyAgICAgIGlmIChmYWlsKHBtKSkKKyAgICAgICAgIHJldHVybjsKKyAgIH0KK30KKworc3RhdGljIHZvaWQgZ2FtbWFfdHJhbnNmb3JtX3Rlc3QocG5nX21vZGlmaWVyICpwbSwKKyAgIGNvbnN0IHBuZ19ieXRlIGNvbG91cl90eXBlLCBjb25zdCBwbmdfYnl0ZSBiaXRfZGVwdGgsCisgICBjb25zdCBpbnQgcGFsZXR0ZV9udW1iZXIsCisgICBjb25zdCBpbnQgaW50ZXJsYWNlX3R5cGUsIGNvbnN0IGRvdWJsZSBmaWxlX2dhbW1hLAorICAgY29uc3QgZG91YmxlIHNjcmVlbl9nYW1tYSwgY29uc3QgcG5nX2J5dGUgc2JpdCwKKyAgIGNvbnN0IGludCB1c2VfaW5wdXRfcHJlY2lzaW9uLCBjb25zdCBpbnQgc2NhbGUxNikKK3sKKyAgIHNpemVfdCBwb3MgPSAwOworICAgY2hhciBuYW1lWzY0XTsKKworICAgaWYgKHNiaXQgIT0gYml0X2RlcHRoICYmIHNiaXQgIT0gMCkKKyAgIHsKKyAgICAgIHBvcyA9IHNhZmVjYXQobmFtZSwgc2l6ZW9mIG5hbWUsIHBvcywgInNiaXQoIik7CisgICAgICBwb3MgPSBzYWZlY2F0bihuYW1lLCBzaXplb2YgbmFtZSwgcG9zLCBzYml0KTsKKyAgICAgIHBvcyA9IHNhZmVjYXQobmFtZSwgc2l6ZW9mIG5hbWUsIHBvcywgIikgIik7CisgICB9CisKKyAgIGVsc2UKKyAgICAgIHBvcyA9IHNhZmVjYXQobmFtZSwgc2l6ZW9mIG5hbWUsIHBvcywgImdhbW1hICIpOworCisgICBpZiAoc2NhbGUxNikKKyAgICAgIHBvcyA9IHNhZmVjYXQobmFtZSwgc2l6ZW9mIG5hbWUsIHBvcywgIjE2dG84ICIpOworCisgICBwb3MgPSBzYWZlY2F0ZChuYW1lLCBzaXplb2YgbmFtZSwgcG9zLCBmaWxlX2dhbW1hLCAzKTsKKyAgIHBvcyA9IHNhZmVjYXQobmFtZSwgc2l6ZW9mIG5hbWUsIHBvcywgIi0+Iik7CisgICBwb3MgPSBzYWZlY2F0ZChuYW1lLCBzaXplb2YgbmFtZSwgcG9zLCBzY3JlZW5fZ2FtbWEsIDMpOworCisgICBnYW1tYV90ZXN0KHBtLCBjb2xvdXJfdHlwZSwgYml0X2RlcHRoLCBwYWxldHRlX251bWJlciwgaW50ZXJsYWNlX3R5cGUsCisgICAgICBmaWxlX2dhbW1hLCBzY3JlZW5fZ2FtbWEsIHNiaXQsIDAsIG5hbWUsIHVzZV9pbnB1dF9wcmVjaXNpb24sCisgICAgICBzY2FsZTE2LCBwbS0+dGVzdF9nYW1tYV9leHBhbmQxNiwgMCAsIDAsIDApOworfQorCitzdGF0aWMgdm9pZCBwZXJmb3JtX2dhbW1hX3RyYW5zZm9ybV90ZXN0cyhwbmdfbW9kaWZpZXIgKnBtKQoreworICAgcG5nX2J5dGUgY29sb3VyX3R5cGUgPSAwOworICAgcG5nX2J5dGUgYml0X2RlcHRoID0gMDsKKyAgIHVuc2lnbmVkIGludCBwYWxldHRlX251bWJlciA9IDA7CisKKyAgIHdoaWxlIChuZXh0X2Zvcm1hdCgmY29sb3VyX3R5cGUsICZiaXRfZGVwdGgsICZwYWxldHRlX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICBwbS0+dGVzdF9sYmdfZ2FtbWFfdHJhbnNmb3JtLCBwbS0+dGVzdF90Uk5TKSkKKyAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBpLCBqOworCisgICAgICBmb3IgKGk9MDsgaTxwbS0+bmdhbW1hX3Rlc3RzOyArK2kpIGZvciAoaj0wOyBqPHBtLT5uZ2FtbWFfdGVzdHM7ICsraikKKyAgICAgICAgIGlmIChpICE9IGopCisgICAgICAgICB7CisgICAgICAgICAgICBnYW1tYV90cmFuc2Zvcm1fdGVzdChwbSwgY29sb3VyX3R5cGUsIGJpdF9kZXB0aCwgcGFsZXR0ZV9udW1iZXIsCisgICAgICAgICAgICAgICBwbS0+aW50ZXJsYWNlX3R5cGUsIDEvcG0tPmdhbW1hc1tpXSwgcG0tPmdhbW1hc1tqXSwgMC8qc0JJVCovLAorICAgICAgICAgICAgICAgcG0tPnVzZV9pbnB1dF9wcmVjaXNpb24sIDAgLypkbyBub3Qgc2NhbGUxNiovKTsKKworICAgICAgICAgICAgaWYgKGZhaWwocG0pKQorICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgfQorICAgfQorfQorCitzdGF0aWMgdm9pZCBwZXJmb3JtX2dhbW1hX3NiaXRfdGVzdHMocG5nX21vZGlmaWVyICpwbSkKK3sKKyAgIHBuZ19ieXRlIHNiaXQ7CisKKyAgIC8qIFRoZSBvbmx5IGludGVyZXN0aW5nIGNhc2VzIGFyZSBjb2xvdXIgYW5kIGdyYXlzY2FsZSwgYWxwaGEgaXMgaWdub3JlZCBoZXJlCisgICAgKiBmb3Igb3ZlcmFsbCBzcGVlZC4gIE9ubHkgYml0IGRlcHRocyB3aGVyZSBzYml0IGlzIGxlc3MgdGhhbiB0aGUgYml0IGRlcHRoCisgICAgKiBhcmUgdGVzdGVkLgorICAgICovCisgICBmb3IgKHNiaXQ9cG0tPnNiaXRsb3c7IHNiaXQ8KDE8PFJFQURfQkRISSk7ICsrc2JpdCkKKyAgIHsKKyAgICAgIHBuZ19ieXRlIGNvbG91cl90eXBlID0gMCwgYml0X2RlcHRoID0gMDsKKyAgICAgIHVuc2lnbmVkIGludCBucGFsZXR0ZSA9IDA7CisKKyAgICAgIHdoaWxlIChuZXh0X2Zvcm1hdCgmY29sb3VyX3R5cGUsICZiaXRfZGVwdGgsICZucGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwbS0+dGVzdF9sYmdfZ2FtbWFfc2JpdCwgcG0tPnRlc3RfdFJOUykpCisgICAgICAgICBpZiAoKGNvbG91cl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpID09IDAgJiYKKyAgICAgICAgICAgICgoY29sb3VyX3R5cGUgPT0gMyAmJiBzYml0IDwgOCkgfHwKKyAgICAgICAgICAgIChjb2xvdXJfdHlwZSAhPSAzICYmIHNiaXQgPCBiaXRfZGVwdGgpKSkKKyAgICAgIHsKKyAgICAgICAgIHVuc2lnbmVkIGludCBpOworCisgICAgICAgICBmb3IgKGk9MDsgaTxwbS0+bmdhbW1hX3Rlc3RzOyArK2kpCisgICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgajsKKworICAgICAgICAgICAgZm9yIChqPTA7IGo8cG0tPm5nYW1tYV90ZXN0czsgKytqKSBpZiAoaSAhPSBqKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZ2FtbWFfdHJhbnNmb3JtX3Rlc3QocG0sIGNvbG91cl90eXBlLCBiaXRfZGVwdGgsIG5wYWxldHRlLAorICAgICAgICAgICAgICAgICAgcG0tPmludGVybGFjZV90eXBlLCAxL3BtLT5nYW1tYXNbaV0sIHBtLT5nYW1tYXNbal0sCisgICAgICAgICAgICAgICAgICBzYml0LCBwbS0+dXNlX2lucHV0X3ByZWNpc2lvbl9zYml0LCAwIC8qc2NhbGUxNiovKTsKKworICAgICAgICAgICAgICAgaWYgKGZhaWwocG0pKQorICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgfQorfQorCisvKiBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyBhIDE2IGJpdCBzb3VyY2UgaW1hZ2UgYnV0IHByb2R1Y2VzIDggYml0IG91dHB1dCwgc28KKyAqIHdlIG9ubHkgbmVlZCB0aGUgMTZiaXQgd3JpdGUgc3VwcG9ydCwgYnV0IHRoZSAxNiBiaXQgaW1hZ2VzIGFyZSBvbmx5CisgKiBnZW5lcmF0ZWQgaWYgRE9fMTZCSVQgaXMgZGVmaW5lZC4KKyAqLworI2lmZGVmIERPXzE2QklUCitzdGF0aWMgdm9pZCBwZXJmb3JtX2dhbW1hX3NjYWxlMTZfdGVzdHMocG5nX21vZGlmaWVyICpwbSkKK3sKKyMgIGlmbmRlZiBQTkdfTUFYX0dBTU1BXzgKKyMgICAgIGRlZmluZSBQTkdfTUFYX0dBTU1BXzggMTEKKyMgIGVuZGlmCisjICBpZiBkZWZpbmVkIFBOR19NQVhfR0FNTUFfOCB8fCBQTkdfTElCUE5HX1ZFUiA8IDEwNzAwCisjICAgICBkZWZpbmUgU0JJVF8xNl9UT184IFBOR19NQVhfR0FNTUFfOAorIyAgZWxzZQorIyAgICAgZGVmaW5lIFNCSVRfMTZfVE9fOCAxNgorIyAgZW5kaWYKKyAgIC8qIEluY2x1ZGUgdGhlIGFscGhhIGNhc2VzIGhlcmUuIE5vdGUgdGhhdCBzYml0IG1hdGNoZXMgdGhlIGludGVybmFsIHZhbHVlCisgICAgKiB1c2VkIGJ5IHRoZSBsaWJyYXJ5IC0gb3RoZXJ3aXNlIHdlIHdpbGwgZ2V0IHNwdXJpb3VzIGVycm9ycyBmcm9tIHRoZQorICAgICogaW50ZXJuYWwgc2JpdCBzdHlsZSBhcHByb3hpbWF0aW9uLgorICAgICoKKyAgICAqIFRoZSB0aHJlc2hvbGQgdGVzdCBpcyBoZXJlIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSAxNiB0byA4IGNvbnZlcnNpb24gd2lsbAorICAgICogcHJvY2VlZCAqd2l0aG91dCogZ2FtbWEgY29ycmVjdGlvbiwgYW5kIHRoZSB0ZXN0cyBhYm92ZSB3aWxsIGZhaWwgKGJ1dCBub3QKKyAgICAqIGJ5IG11Y2gpIC0gdGhpcyBjb3VsZCBiZSBmaXhlZCwgaXQgb25seSBhcHBlYXJzIHdpdGggdGhlIC1nIG9wdGlvbi4KKyAgICAqLworICAgdW5zaWduZWQgaW50IGksIGo7CisgICBmb3IgKGk9MDsgaTxwbS0+bmdhbW1hX3Rlc3RzOyArK2kpCisgICB7CisgICAgICBmb3IgKGo9MDsgajxwbS0+bmdhbW1hX3Rlc3RzOyArK2opCisgICAgICB7CisgICAgICAgICBpZiAoaSAhPSBqICYmCisgICAgICAgICAgICAgZmFicyhwbS0+Z2FtbWFzW2pdL3BtLT5nYW1tYXNbaV0tMSkgPj0gUE5HX0dBTU1BX1RIUkVTSE9MRCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGdhbW1hX3RyYW5zZm9ybV90ZXN0KHBtLCAwLCAxNiwgMCwgcG0tPmludGVybGFjZV90eXBlLAorICAgICAgICAgICAgICAgMS9wbS0+Z2FtbWFzW2ldLCBwbS0+Z2FtbWFzW2pdLCBTQklUXzE2X1RPXzgsCisgICAgICAgICAgICAgICBwbS0+dXNlX2lucHV0X3ByZWNpc2lvbl8xNnRvOCwgMSAvKnNjYWxlMTYqLyk7CisKKyAgICAgICAgICAgIGlmIChmYWlsKHBtKSkKKyAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgZ2FtbWFfdHJhbnNmb3JtX3Rlc3QocG0sIDIsIDE2LCAwLCBwbS0+aW50ZXJsYWNlX3R5cGUsCisgICAgICAgICAgICAgICAxL3BtLT5nYW1tYXNbaV0sIHBtLT5nYW1tYXNbal0sIFNCSVRfMTZfVE9fOCwKKyAgICAgICAgICAgICAgIHBtLT51c2VfaW5wdXRfcHJlY2lzaW9uXzE2dG84LCAxIC8qc2NhbGUxNiovKTsKKworICAgICAgICAgICAgaWYgKGZhaWwocG0pKQorICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBnYW1tYV90cmFuc2Zvcm1fdGVzdChwbSwgNCwgMTYsIDAsIHBtLT5pbnRlcmxhY2VfdHlwZSwKKyAgICAgICAgICAgICAgIDEvcG0tPmdhbW1hc1tpXSwgcG0tPmdhbW1hc1tqXSwgU0JJVF8xNl9UT184LAorICAgICAgICAgICAgICAgcG0tPnVzZV9pbnB1dF9wcmVjaXNpb25fMTZ0bzgsIDEgLypzY2FsZTE2Ki8pOworCisgICAgICAgICAgICBpZiAoZmFpbChwbSkpCisgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGdhbW1hX3RyYW5zZm9ybV90ZXN0KHBtLCA2LCAxNiwgMCwgcG0tPmludGVybGFjZV90eXBlLAorICAgICAgICAgICAgICAgMS9wbS0+Z2FtbWFzW2ldLCBwbS0+Z2FtbWFzW2pdLCBTQklUXzE2X1RPXzgsCisgICAgICAgICAgICAgICBwbS0+dXNlX2lucHV0X3ByZWNpc2lvbl8xNnRvOCwgMSAvKnNjYWxlMTYqLyk7CisKKyAgICAgICAgICAgIGlmIChmYWlsKHBtKSkKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KK30KKyNlbmRpZiAvKiAxNiB0byA4IGJpdCBjb252ZXJzaW9uICovCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKSB8fFwKKyAgIGRlZmluZWQoUE5HX1JFQURfQUxQSEFfTU9ERV9TVVBQT1JURUQpCitzdGF0aWMgdm9pZCBnYW1tYV9jb21wb3NpdGlvbl90ZXN0KHBuZ19tb2RpZmllciAqcG0sCisgICBjb25zdCBwbmdfYnl0ZSBjb2xvdXJfdHlwZSwgY29uc3QgcG5nX2J5dGUgYml0X2RlcHRoLAorICAgY29uc3QgaW50IHBhbGV0dGVfbnVtYmVyLAorICAgY29uc3QgaW50IGludGVybGFjZV90eXBlLCBjb25zdCBkb3VibGUgZmlsZV9nYW1tYSwKKyAgIGNvbnN0IGRvdWJsZSBzY3JlZW5fZ2FtbWEsCisgICBjb25zdCBpbnQgdXNlX2lucHV0X3ByZWNpc2lvbiwgY29uc3QgaW50IGRvX2JhY2tncm91bmQsCisgICBjb25zdCBpbnQgZXhwYW5kXzE2KQoreworICAgc2l6ZV90IHBvcyA9IDA7CisgICBwbmdfY29uc3RfY2hhcnAgYmFzZTsKKyAgIGRvdWJsZSBiZzsKKyAgIGNoYXIgbmFtZVsxMjhdOworICAgcG5nX2NvbG9yXzE2IGJhY2tncm91bmQ7CisKKyAgIC8qIE1ha2UgdXAgYSBuYW1lIGFuZCBnZXQgYW4gYXBwcm9wcmlhdGUgYmFja2dyb3VuZCBnYW1tYSB2YWx1ZS4gKi8KKyAgIHN3aXRjaCAoZG9fYmFja2dyb3VuZCkKKyAgIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICBiYXNlID0gIiI7CisgICAgICAgICBiZyA9IDQ7IC8qIHNob3VsZCBub3QgYmUgdXNlZCAqLworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBOR19CQUNLR1JPVU5EX0dBTU1BX1NDUkVFTjoKKyAgICAgICAgIGJhc2UgPSAiIGJja2coU2NyZWVuKToiOworICAgICAgICAgYmcgPSAxL3NjcmVlbl9nYW1tYTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQTkdfQkFDS0dST1VORF9HQU1NQV9GSUxFOgorICAgICAgICAgYmFzZSA9ICIgYmNrZyhGaWxlKToiOworICAgICAgICAgYmcgPSBmaWxlX2dhbW1hOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBOR19CQUNLR1JPVU5EX0dBTU1BX1VOSVFVRToKKyAgICAgICAgIGJhc2UgPSAiIGJja2coVW5pcXVlKToiOworICAgICAgICAgLyogVGhpcyB0ZXN0cyB0aGUgaGFuZGxpbmcgb2YgYSB1bmlxdWUgdmFsdWUsIHRoZSBtYXRoIGlzIHN1Y2ggdGhhdCB0aGUKKyAgICAgICAgICAqIHZhbHVlIHRlbmRzIHRvIGJlIDwxLCBidXQgaXMgbmVpdGhlciBzY3JlZW4gbm9yIGZpbGUgKGV2ZW4gaWYgdGhleQorICAgICAgICAgICogbWF0Y2ghKQorICAgICAgICAgICovCisgICAgICAgICBiZyA9IChmaWxlX2dhbW1hICsgc2NyZWVuX2dhbW1hKSAvIDM7CisgICAgICAgICBicmVhazsKKyNpZmRlZiBQTkdfUkVBRF9BTFBIQV9NT0RFX1NVUFBPUlRFRAorICAgICAgY2FzZSBBTFBIQV9NT0RFX09GRlNFVCArIFBOR19BTFBIQV9QTkc6CisgICAgICAgICBiYXNlID0gIiBhbHBoYShQTkcpIjsKKyAgICAgICAgIGJnID0gNDsgLyogc2hvdWxkIG5vdCBiZSB1c2VkICovCisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQUxQSEFfTU9ERV9PRkZTRVQgKyBQTkdfQUxQSEFfU1RBTkRBUkQ6CisgICAgICAgICBiYXNlID0gIiBhbHBoYShQb3J0ZXItRHVmZikiOworICAgICAgICAgYmcgPSA0OyAvKiBzaG91bGQgbm90IGJlIHVzZWQgKi8KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBBTFBIQV9NT0RFX09GRlNFVCArIFBOR19BTFBIQV9PUFRJTUlaRUQ6CisgICAgICAgICBiYXNlID0gIiBhbHBoYShPcHRpbWl6ZWQpIjsKKyAgICAgICAgIGJnID0gNDsgLyogc2hvdWxkIG5vdCBiZSB1c2VkICovCisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQUxQSEFfTU9ERV9PRkZTRVQgKyBQTkdfQUxQSEFfQlJPS0VOOgorICAgICAgICAgYmFzZSA9ICIgYWxwaGEoQnJva2VuKSI7CisgICAgICAgICBiZyA9IDQ7IC8qIHNob3VsZCBub3QgYmUgdXNlZCAqLworICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgIH0KKworICAgLyogVXNlIHJhbmRvbSBiYWNrZ3JvdW5kIHZhbHVlcyAtIHRoZSBiYWNrZ3JvdW5kIGlzIGFsd2F5cyBwcmVzZW50ZWQgaW4gdGhlCisgICAgKiBvdXRwdXQgc3BhY2UgKDggb3IgMTYgYml0IGNvbXBvbmVudHMpLgorICAgICovCisgICBpZiAoZXhwYW5kXzE2IHx8IGJpdF9kZXB0aCA9PSAxNikKKyAgIHsKKyAgICAgIHBuZ191aW50XzMyIHIgPSByYW5kb21fMzIoKTsKKworICAgICAgYmFja2dyb3VuZC5yZWQgPSAocG5nX3VpbnRfMTYpcjsKKyAgICAgIGJhY2tncm91bmQuZ3JlZW4gPSAocG5nX3VpbnRfMTYpKHIgPj4gMTYpOworICAgICAgciA9IHJhbmRvbV8zMigpOworICAgICAgYmFja2dyb3VuZC5ibHVlID0gKHBuZ191aW50XzE2KXI7CisgICAgICBiYWNrZ3JvdW5kLmdyYXkgPSAocG5nX3VpbnRfMTYpKHIgPj4gMTYpOworCisgICAgICAvKiBJbiBlYXJsaWVyIGxpYnBuZyB2ZXJzaW9ucywgdGhvc2Ugd2hlcmUgRElHSVRJWkUgaXMgc2V0LCBhbnkgYmFja2dyb3VuZAorICAgICAgICogZ2FtbWEgY29ycmVjdGlvbiBpbiB0aGUgZXhwYW5kMTYgY2FzZSB3YXMgZG9uZSB1c2luZyA4LWJpdCBnYW1tYQorICAgICAgICogY29ycmVjdGlvbiB0YWJsZXMsIHJlc3VsdGluZyBpbiBsYXJnZXIgZXJyb3JzLiAgVG8gY29wZSB3aXRoIHRob3NlCisgICAgICAgKiBjYXNlcyB1c2UgYSAxNi1iaXQgYmFja2dyb3VuZCB2YWx1ZSB3aGljaCB3aWxsIGhhbmRsZSB0aGlzIGdhbW1hCisgICAgICAgKiBjb3JyZWN0aW9uLgorICAgICAgICovCisjICAgICBpZiBESUdJVElaRQorICAgICAgICAgaWYgKGV4cGFuZF8xNiAmJiAoZG9fYmFja2dyb3VuZCA9PSBQTkdfQkFDS0dST1VORF9HQU1NQV9VTklRVUUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX2JhY2tncm91bmQgPT0gUE5HX0JBQ0tHUk9VTkRfR0FNTUFfRklMRSkgJiYKKyAgICAgICAgICAgIGZhYnMoYmcqc2NyZWVuX2dhbW1hLTEpID4gUE5HX0dBTU1BX1RIUkVTSE9MRCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoZSBiYWNrZ3JvdW5kIHZhbHVlcyB3aWxsIGJlIGxvb2tlZCB1cCBpbiBhbiA4LWJpdCB0YWJsZSB0byBkbworICAgICAgICAgICAgICogdGhlIGdhbW1hIGNvcnJlY3Rpb24sIHNvIG9ubHkgc2VsZWN0IHZhbHVlcyB3aGljaCBhcmUgYW4gZXhhY3QKKyAgICAgICAgICAgICAqIG1hdGNoIGZvciB0aGUgOC1iaXQgdGFibGUgZW50cmllczoKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYmFja2dyb3VuZC5yZWQgPSAocG5nX3VpbnRfMTYpKChiYWNrZ3JvdW5kLnJlZCA+PiA4KSAqIDI1Nyk7CisgICAgICAgICAgICBiYWNrZ3JvdW5kLmdyZWVuID0gKHBuZ191aW50XzE2KSgoYmFja2dyb3VuZC5ncmVlbiA+PiA4KSAqIDI1Nyk7CisgICAgICAgICAgICBiYWNrZ3JvdW5kLmJsdWUgPSAocG5nX3VpbnRfMTYpKChiYWNrZ3JvdW5kLmJsdWUgPj4gOCkgKiAyNTcpOworICAgICAgICAgICAgYmFja2dyb3VuZC5ncmF5ID0gKHBuZ191aW50XzE2KSgoYmFja2dyb3VuZC5ncmF5ID4+IDgpICogMjU3KTsKKyAgICAgICAgIH0KKyMgICAgIGVuZGlmCisgICB9CisKKyAgIGVsc2UgLyogOCBiaXQgY29sb3JzICovCisgICB7CisgICAgICBwbmdfdWludF8zMiByID0gcmFuZG9tXzMyKCk7CisKKyAgICAgIGJhY2tncm91bmQucmVkID0gKHBuZ19ieXRlKXI7CisgICAgICBiYWNrZ3JvdW5kLmdyZWVuID0gKHBuZ19ieXRlKShyID4+IDgpOworICAgICAgYmFja2dyb3VuZC5ibHVlID0gKHBuZ19ieXRlKShyID4+IDE2KTsKKyAgICAgIGJhY2tncm91bmQuZ3JheSA9IChwbmdfYnl0ZSkociA+PiAyNCk7CisgICB9CisKKyAgIGJhY2tncm91bmQuaW5kZXggPSAxOTM7IC8qIHJnYigxOTMsMTkzLDE5MykgdG8gZGV0ZWN0IGVycm9ycyAqLworCisgICBpZiAoIShjb2xvdXJfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKSkKKyAgIHsKKyAgICAgIC8qIEJlY2F1c2UsIGN1cnJlbnRseSwgcG5nX3NldF9iYWNrZ3JvdW5kIGlzIGFsd2F5cyBjYWxsZWQgd2l0aAorICAgICAgICogJ25lZWRfZXhwYW5kJyBmYWxzZSBpbiB0aGlzIGNhc2UgYW5kIGJlY2F1c2UgdGhlIGdhbW1hIHRlc3QgaXRzZWxmCisgICAgICAgKiBkb2Vzbid0IGNhdXNlIGFuIGV4cGFuZCB0byA4LWJpdCBmb3IgbG93ZXIgYml0IGRlcHRocyB0aGUgY29sb3VyIG11c3QKKyAgICAgICAqIGJlIHJlZHVjZWQgdG8gdGhlIGNvcnJlY3QgcmFuZ2UuCisgICAgICAgKi8KKyAgICAgIGlmIChiaXRfZGVwdGggPCA4KQorICAgICAgICAgYmFja2dyb3VuZC5ncmF5ICY9IChwbmdfdWludF8xNikoKDFVIDw8IGJpdF9kZXB0aCktMSk7CisKKyAgICAgIC8qIEdyYXlzY2FsZSBpbnB1dCwgd2UgZG8gbm90IGNvbnZlcnQgdG8gUkdCIChUQkQpLCBzbyB3ZSBtdXN0IHNldCB0aGUKKyAgICAgICAqIGJhY2tncm91bmQgdG8gZ3JheSAtIGVsc2UgbGlicG5nIHNlZW1zIHRvIGZhaWwuCisgICAgICAgKi8KKyAgICAgIGJhY2tncm91bmQucmVkID0gYmFja2dyb3VuZC5ncmVlbiA9IGJhY2tncm91bmQuYmx1ZSA9IGJhY2tncm91bmQuZ3JheTsKKyAgIH0KKworICAgcG9zID0gc2FmZWNhdChuYW1lLCBzaXplb2YgbmFtZSwgcG9zLCAiZ2FtbWEgIik7CisgICBwb3MgPSBzYWZlY2F0ZChuYW1lLCBzaXplb2YgbmFtZSwgcG9zLCBmaWxlX2dhbW1hLCAzKTsKKyAgIHBvcyA9IHNhZmVjYXQobmFtZSwgc2l6ZW9mIG5hbWUsIHBvcywgIi0+Iik7CisgICBwb3MgPSBzYWZlY2F0ZChuYW1lLCBzaXplb2YgbmFtZSwgcG9zLCBzY3JlZW5fZ2FtbWEsIDMpOworCisgICBwb3MgPSBzYWZlY2F0KG5hbWUsIHNpemVvZiBuYW1lLCBwb3MsIGJhc2UpOworICAgaWYgKGRvX2JhY2tncm91bmQgPCBBTFBIQV9NT0RFX09GRlNFVCkKKyAgIHsKKyAgICAgIC8qIEluY2x1ZGUgdGhlIGJhY2tncm91bmQgY29sb3IgYW5kIGdhbW1hIGluIHRoZSBuYW1lOiAqLworICAgICAgcG9zID0gc2FmZWNhdChuYW1lLCBzaXplb2YgbmFtZSwgcG9zLCAiKCIpOworICAgICAgLyogVGhpcyBhc3N1bWVzIG5vIGV4cGFuZCBncmF5LT5yZ2IgLSB0aGUgY3VycmVudCBjb2RlIHdvbid0IGhhbmRsZSB0aGF0IQorICAgICAgICovCisgICAgICBpZiAoY29sb3VyX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikKKyAgICAgIHsKKyAgICAgICAgIHBvcyA9IHNhZmVjYXRuKG5hbWUsIHNpemVvZiBuYW1lLCBwb3MsIGJhY2tncm91bmQucmVkKTsKKyAgICAgICAgIHBvcyA9IHNhZmVjYXQobmFtZSwgc2l6ZW9mIG5hbWUsIHBvcywgIiwiKTsKKyAgICAgICAgIHBvcyA9IHNhZmVjYXRuKG5hbWUsIHNpemVvZiBuYW1lLCBwb3MsIGJhY2tncm91bmQuZ3JlZW4pOworICAgICAgICAgcG9zID0gc2FmZWNhdChuYW1lLCBzaXplb2YgbmFtZSwgcG9zLCAiLCIpOworICAgICAgICAgcG9zID0gc2FmZWNhdG4obmFtZSwgc2l6ZW9mIG5hbWUsIHBvcywgYmFja2dyb3VuZC5ibHVlKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgIHBvcyA9IHNhZmVjYXRuKG5hbWUsIHNpemVvZiBuYW1lLCBwb3MsIGJhY2tncm91bmQuZ3JheSk7CisgICAgICBwb3MgPSBzYWZlY2F0KG5hbWUsIHNpemVvZiBuYW1lLCBwb3MsICIpXiIpOworICAgICAgcG9zID0gc2FmZWNhdGQobmFtZSwgc2l6ZW9mIG5hbWUsIHBvcywgYmcsIDMpOworICAgfQorCisgICBnYW1tYV90ZXN0KHBtLCBjb2xvdXJfdHlwZSwgYml0X2RlcHRoLCBwYWxldHRlX251bWJlciwgaW50ZXJsYWNlX3R5cGUsCisgICAgICBmaWxlX2dhbW1hLCBzY3JlZW5fZ2FtbWEsIDAvKnNCSVQqLywgMCwgbmFtZSwgdXNlX2lucHV0X3ByZWNpc2lvbiwKKyAgICAgIDAvKnN0cmlwIDE2Ki8sIGV4cGFuZF8xNiwgZG9fYmFja2dyb3VuZCwgJmJhY2tncm91bmQsIGJnKTsKK30KKworCitzdGF0aWMgdm9pZAorcGVyZm9ybV9nYW1tYV9jb21wb3NpdGlvbl90ZXN0cyhwbmdfbW9kaWZpZXIgKnBtLCBpbnQgZG9fYmFja2dyb3VuZCwKKyAgIGludCBleHBhbmRfMTYpCit7CisgICBwbmdfYnl0ZSBjb2xvdXJfdHlwZSA9IDA7CisgICBwbmdfYnl0ZSBiaXRfZGVwdGggPSAwOworICAgdW5zaWduZWQgaW50IHBhbGV0dGVfbnVtYmVyID0gMDsKKworICAgLyogU2tpcCB0aGUgbm9uLWFscGhhIGNhc2VzIC0gdGhlcmUgaXMgbm8gc2V0dGluZyBvZiBhIHRyYW5zcGFyZW5jeSBjb2xvdXIgYXQKKyAgICAqIHByZXNlbnQuCisgICAgKgorICAgICogVE9ETzogaW5jb3JyZWN0OyB0aGUgcGFsZXR0ZSBjYXNlIHNldHMgdFJOUyBhbmQsIG5vdyBSR0IgYW5kIGdyYXkgZG8sCisgICAgKiBob3dldmVyIHRoZSBwYWxldHRlIGNhc2UgZmFpbHMgbWlzZXJhYmx5IHNvIGlzIGNvbW1lbnRlZCBvdXQgYmVsb3cuCisgICAgKi8KKyAgIHdoaWxlIChuZXh0X2Zvcm1hdCgmY29sb3VyX3R5cGUsICZiaXRfZGVwdGgsICZwYWxldHRlX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICBwbS0+dGVzdF9sYmdfZ2FtbWFfY29tcG9zaXRpb24sIHBtLT50ZXN0X3RSTlMpKQorICAgICAgaWYgKChjb2xvdXJfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKSAhPSAwCisjaWYgMCAvKiBUT0RPOiBGSVhNRSAqLworICAgICAgICAgIC8qVE9ETzogRklYTUU6IHRoaXMgc2hvdWxkIHdvcmsgKi8KKyAgICAgICAgICB8fCBjb2xvdXJfdHlwZSA9PSAzCisjZW5kaWYKKyAgICAgICAgICB8fCAoY29sb3VyX3R5cGUgIT0gMyAmJiBwYWxldHRlX251bWJlciAhPSAwKSkKKyAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBpLCBqOworCisgICAgICAvKiBEb24ndCBza2lwIHRoZSBpPT1qIGNhc2UgaGVyZSAtIGl0J3MgcmVsZXZhbnQuICovCisgICAgICBmb3IgKGk9MDsgaTxwbS0+bmdhbW1hX3Rlc3RzOyArK2kpIGZvciAoaj0wOyBqPHBtLT5uZ2FtbWFfdGVzdHM7ICsraikKKyAgICAgIHsKKyAgICAgICAgIGdhbW1hX2NvbXBvc2l0aW9uX3Rlc3QocG0sIGNvbG91cl90eXBlLCBiaXRfZGVwdGgsIHBhbGV0dGVfbnVtYmVyLAorICAgICAgICAgICAgcG0tPmludGVybGFjZV90eXBlLCAxL3BtLT5nYW1tYXNbaV0sIHBtLT5nYW1tYXNbal0sCisgICAgICAgICAgICBwbS0+dXNlX2lucHV0X3ByZWNpc2lvbiwgZG9fYmFja2dyb3VuZCwgZXhwYW5kXzE2KTsKKworICAgICAgICAgaWYgKGZhaWwocG0pKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgfQorfQorI2VuZGlmIC8qIFJFQURfQkFDS0dST1VORCB8fCBSRUFEX0FMUEhBX01PREUgKi8KKworc3RhdGljIHZvaWQKK2luaXRfZ2FtbWFfZXJyb3JzKHBuZ19tb2RpZmllciAqcG0pCit7CisgICAvKiBVc2UgLTEgdG8gY2F0Y2ggdGVzdHMgdGhhdCB3ZXJlIG5vdCBhY3R1YWxseSBydW4gKi8KKyAgIHBtLT5lcnJvcl9ncmF5XzIgPSBwbS0+ZXJyb3JfZ3JheV80ID0gcG0tPmVycm9yX2dyYXlfOCA9IC0xLjsKKyAgIHBtLT5lcnJvcl9jb2xvcl84ID0gLTEuOworICAgcG0tPmVycm9yX2luZGV4ZWQgPSAtMS47CisgICBwbS0+ZXJyb3JfZ3JheV8xNiA9IHBtLT5lcnJvcl9jb2xvcl8xNiA9IC0xLjsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X29uZShjb25zdCBjaGFyICpsZWFkZXIsIGRvdWJsZSBlcnIpCit7CisgICBpZiAoZXJyICE9IC0xLikKKyAgICAgIHByaW50ZigiICVzICUuNWZcbiIsIGxlYWRlciwgZXJyKTsKK30KKworc3RhdGljIHZvaWQKK3N1bW1hcml6ZV9nYW1tYV9lcnJvcnMocG5nX21vZGlmaWVyICpwbSwgcG5nX2NvbnN0X2NoYXJwIHdobywgaW50IGxvd19iaXRfZGVwdGgsCisgICBpbnQgaW5kZXhlZCkKK3sKKyAgIGZmbHVzaChzdGRlcnIpOworCisgICBpZiAod2hvKQorICAgICAgcHJpbnRmKCJcbkdhbW1hIGNvcnJlY3Rpb24gd2l0aCAlczpcbiIsIHdobyk7CisKKyAgIGVsc2UKKyAgICAgIHByaW50ZigiXG5CYXNpYyBnYW1tYSBjb3JyZWN0aW9uOlxuIik7CisKKyAgIGlmIChsb3dfYml0X2RlcHRoKQorICAgeworICAgICAgcHJpbnRfb25lKCIgMiBiaXQgZ3JheTogIiwgcG0tPmVycm9yX2dyYXlfMik7CisgICAgICBwcmludF9vbmUoIiA0IGJpdCBncmF5OiAiLCBwbS0+ZXJyb3JfZ3JheV80KTsKKyAgICAgIHByaW50X29uZSgiIDggYml0IGdyYXk6ICIsIHBtLT5lcnJvcl9ncmF5XzgpOworICAgICAgcHJpbnRfb25lKCIgOCBiaXQgY29sb3I6IiwgcG0tPmVycm9yX2NvbG9yXzgpOworICAgICAgaWYgKGluZGV4ZWQpCisgICAgICAgICBwcmludF9vbmUoIiBpbmRleGVkOiAgICAiLCBwbS0+ZXJyb3JfaW5kZXhlZCk7CisgICB9CisKKyAgIHByaW50X29uZSgiMTYgYml0IGdyYXk6ICIsIHBtLT5lcnJvcl9ncmF5XzE2KTsKKyAgIHByaW50X29uZSgiMTYgYml0IGNvbG9yOiIsIHBtLT5lcnJvcl9jb2xvcl8xNik7CisKKyAgIGZmbHVzaChzdGRvdXQpOworfQorCitzdGF0aWMgdm9pZAorcGVyZm9ybV9nYW1tYV90ZXN0KHBuZ19tb2RpZmllciAqcG0sIGludCBzdW1tYXJ5KQoreworICAgLypUT0RPOiByZW1vdmUgdGhpcyovCisgICAvKiBTYXZlIGNlcnRhaW4gdmFsdWVzIGZvciB0aGUgdGVtcG9yYXJ5IG92ZXJyaWRlcyBiZWxvdy4gKi8KKyAgIHVuc2lnbmVkIGludCBjYWxjdWxhdGlvbnNfdXNlX2lucHV0X3ByZWNpc2lvbiA9CisgICAgICBwbS0+Y2FsY3VsYXRpb25zX3VzZV9pbnB1dF9wcmVjaXNpb247CisjICBpZmRlZiBQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRAorICAgICAgZG91YmxlIG1heG91dDggPSBwbS0+bWF4b3V0ODsKKyMgIGVuZGlmCisKKyAgIC8qIEZpcnN0IHNvbWUgYXJiaXRyYXJ5IG5vLXRyYW5zZm9ybSB0ZXN0czogKi8KKyAgIGlmICghcG0tPnRoaXMuc3BlZWQgJiYgcG0tPnRlc3RfZ2FtbWFfdGhyZXNob2xkKQorICAgeworICAgICAgcGVyZm9ybV9nYW1tYV90aHJlc2hvbGRfdGVzdHMocG0pOworCisgICAgICBpZiAoZmFpbChwbSkpCisgICAgICAgICByZXR1cm47CisgICB9CisKKyAgIC8qIE5vdyBzb21lIHJlYWwgdHJhbnNmb3Jtcy4gKi8KKyAgIGlmIChwbS0+dGVzdF9nYW1tYV90cmFuc2Zvcm0pCisgICB7CisgICAgICBpZiAoc3VtbWFyeSkKKyAgICAgIHsKKyAgICAgICAgIGZmbHVzaChzdGRlcnIpOworICAgICAgICAgcHJpbnRmKCJHYW1tYSBjb3JyZWN0aW9uIGVycm9yIHN1bW1hcnlcblxuIik7CisgICAgICAgICBwcmludGYoIlRoZSBwcmludGVkIHZhbHVlIGlzIHRoZSBtYXhpbXVtIGVycm9yIGluIHRoZSBwaXhlbCB2YWx1ZXNcbiIpOworICAgICAgICAgcHJpbnRmKCJjYWxjdWxhdGVkIGJ5IHRoZSBsaWJwbmcgZ2FtbWEgY29ycmVjdGlvbiBjb2RlLiAgVGhlIGVycm9yXG4iKTsKKyAgICAgICAgIHByaW50ZigiaXMgY2FsY3VsYXRlZCBhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBvdXRwdXQgcGl4ZWxcbiIpOworICAgICAgICAgcHJpbnRmKCJ2YWx1ZSAoYWx3YXlzIGFuIGludGVnZXIpIGFuZCB0aGUgaWRlYWwgdmFsdWUgZnJvbSB0aGVcbiIpOworICAgICAgICAgcHJpbnRmKCJsaWJwbmcgc3BlY2lmaWNhdGlvbiAodHlwaWNhbGx5IG5vdCBhbiBpbnRlZ2VyKS5cblxuIik7CisKKyAgICAgICAgIHByaW50ZigiRXhwZWN0IHRoaXMgdmFsdWUgdG8gYmUgbGVzcyB0aGFuIC41IGZvciA4IGJpdCBmb3JtYXRzLFxuIik7CisgICAgICAgICBwcmludGYoImxlc3MgdGhhbiAxIGZvciBmb3JtYXRzIHdpdGggZmV3ZXIgdGhhbiA4IGJpdHMgYW5kIGEgc21hbGxcbiIpOworICAgICAgICAgcHJpbnRmKCJudW1iZXIgKHR5cGljYWxseSBsZXNzIHRoYW4gNSkgZm9yIHRoZSAxNiBiaXQgZm9ybWF0cy5cbiIpOworICAgICAgICAgcHJpbnRmKCJGb3IgcGVyZm9ybWFuY2UgcmVhc29ucyB0aGUgdmFsdWUgZm9yIDE2IGJpdCBmb3JtYXRzXG4iKTsKKyAgICAgICAgIHByaW50ZigiaW5jcmVhc2VzIHdoZW4gdGhlIGltYWdlIGZpbGUgaW5jbHVkZXMgYW4gc0JJVCBjaHVuay5cbiIpOworICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICB9CisKKyAgICAgIGluaXRfZ2FtbWFfZXJyb3JzKHBtKTsKKyAgICAgIC8qVE9ETzogcmVtb3ZlIHRoaXMuICBOZWNlc3NhcnkgYmVjYXVzZSB0aGUgY3VycmVudCBsaWJwbmcKKyAgICAgICAqIGltcGxlbWVudGF0aW9uIHdvcmtzIGluIDggYml0czoKKyAgICAgICAqLworICAgICAgaWYgKHBtLT50ZXN0X2dhbW1hX2V4cGFuZDE2KQorICAgICAgICAgcG0tPmNhbGN1bGF0aW9uc191c2VfaW5wdXRfcHJlY2lzaW9uID0gMTsKKyAgICAgIHBlcmZvcm1fZ2FtbWFfdHJhbnNmb3JtX3Rlc3RzKHBtKTsKKyAgICAgIGlmICghY2FsY3VsYXRpb25zX3VzZV9pbnB1dF9wcmVjaXNpb24pCisgICAgICAgICBwbS0+Y2FsY3VsYXRpb25zX3VzZV9pbnB1dF9wcmVjaXNpb24gPSAwOworCisgICAgICBpZiAoc3VtbWFyeSkKKyAgICAgICAgIHN1bW1hcml6ZV9nYW1tYV9lcnJvcnMocG0sIDAvKndobyovLCAxLypsb3cgYml0IGRlcHRoKi8sIDEvKmluZGV4ZWQqLyk7CisKKyAgICAgIGlmIChmYWlsKHBtKSkKKyAgICAgICAgIHJldHVybjsKKyAgIH0KKworICAgLyogVGhlIHNiaXQgdGVzdHMgcHJvZHVjZSBtdWNoIGxhcmdlciBlcnJvcnM6ICovCisgICBpZiAocG0tPnRlc3RfZ2FtbWFfc2JpdCkKKyAgIHsKKyAgICAgIGluaXRfZ2FtbWFfZXJyb3JzKHBtKTsKKyAgICAgIHBlcmZvcm1fZ2FtbWFfc2JpdF90ZXN0cyhwbSk7CisKKyAgICAgIGlmIChzdW1tYXJ5KQorICAgICAgICAgc3VtbWFyaXplX2dhbW1hX2Vycm9ycyhwbSwgInNCSVQiLCBwbS0+c2JpdGxvdyA8IDhVLCAxLyppbmRleGVkKi8pOworCisgICAgICBpZiAoZmFpbChwbSkpCisgICAgICAgICByZXR1cm47CisgICB9CisKKyNpZmRlZiBET18xNkJJVCAvKiBTaG91bGQgYmUgUkVBRF8xNkJJVF9TVVBQT1JURUQgKi8KKyAgIGlmIChwbS0+dGVzdF9nYW1tYV9zY2FsZTE2KQorICAgeworICAgICAgLyogVGhlIDE2IHRvIDggYml0IHN0cmlwIG9wZXJhdGlvbnM6ICovCisgICAgICBpbml0X2dhbW1hX2Vycm9ycyhwbSk7CisgICAgICBwZXJmb3JtX2dhbW1hX3NjYWxlMTZfdGVzdHMocG0pOworCisgICAgICBpZiAoc3VtbWFyeSkKKyAgICAgIHsKKyAgICAgICAgIGZmbHVzaChzdGRlcnIpOworICAgICAgICAgcHJpbnRmKCJcbkdhbW1hIGNvcnJlY3Rpb24gd2l0aCAxNiB0byA4IGJpdCByZWR1Y3Rpb246XG4iKTsKKyAgICAgICAgIHByaW50ZigiIDE2IGJpdCBncmF5OiAgJS41ZlxuIiwgcG0tPmVycm9yX2dyYXlfMTYpOworICAgICAgICAgcHJpbnRmKCIgMTYgYml0IGNvbG9yOiAlLjVmXG4iLCBwbS0+ZXJyb3JfY29sb3JfMTYpOworICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICB9CisKKyAgICAgIGlmIChmYWlsKHBtKSkKKyAgICAgICAgIHJldHVybjsKKyAgIH0KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQKKyAgIGlmIChwbS0+dGVzdF9nYW1tYV9iYWNrZ3JvdW5kKQorICAgeworICAgICAgaW5pdF9nYW1tYV9lcnJvcnMocG0pOworCisgICAgICAvKlRPRE86IHJlbW92ZSB0aGlzLiAgTmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGN1cnJlbnQgbGlicG5nCisgICAgICAgKiBpbXBsZW1lbnRhdGlvbiB3b3JrcyBpbiA4IGJpdHM6CisgICAgICAgKi8KKyAgICAgIGlmIChwbS0+dGVzdF9nYW1tYV9leHBhbmQxNikKKyAgICAgIHsKKyAgICAgICAgIHBtLT5jYWxjdWxhdGlvbnNfdXNlX2lucHV0X3ByZWNpc2lvbiA9IDE7CisgICAgICAgICBwbS0+bWF4b3V0OCA9IC40OTk7IC8qIGJlY2F1c2UgdGhlIDE2IGJpdCBiYWNrZ3JvdW5kIGlzIHNtYXNoZWQgKi8KKyAgICAgIH0KKyAgICAgIHBlcmZvcm1fZ2FtbWFfY29tcG9zaXRpb25fdGVzdHMocG0sIFBOR19CQUNLR1JPVU5EX0dBTU1BX1VOSVFVRSwKKyAgICAgICAgIHBtLT50ZXN0X2dhbW1hX2V4cGFuZDE2KTsKKyAgICAgIGlmICghY2FsY3VsYXRpb25zX3VzZV9pbnB1dF9wcmVjaXNpb24pCisgICAgICAgICBwbS0+Y2FsY3VsYXRpb25zX3VzZV9pbnB1dF9wcmVjaXNpb24gPSAwOworICAgICAgcG0tPm1heG91dDggPSBtYXhvdXQ4OworCisgICAgICBpZiAoc3VtbWFyeSkKKyAgICAgICAgIHN1bW1hcml6ZV9nYW1tYV9lcnJvcnMocG0sICJiYWNrZ3JvdW5kIiwgMSwgMC8qaW5kZXhlZCovKTsKKworICAgICAgaWYgKGZhaWwocG0pKQorICAgICAgICAgcmV0dXJuOworICAgfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9BTFBIQV9NT0RFX1NVUFBPUlRFRAorICAgaWYgKHBtLT50ZXN0X2dhbW1hX2FscGhhX21vZGUpCisgICB7CisgICAgICBpbnQgZG9fYmFja2dyb3VuZDsKKworICAgICAgaW5pdF9nYW1tYV9lcnJvcnMocG0pOworCisgICAgICAvKlRPRE86IHJlbW92ZSB0aGlzLiAgTmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGN1cnJlbnQgbGlicG5nCisgICAgICAgKiBpbXBsZW1lbnRhdGlvbiB3b3JrcyBpbiA4IGJpdHM6CisgICAgICAgKi8KKyAgICAgIGlmIChwbS0+dGVzdF9nYW1tYV9leHBhbmQxNikKKyAgICAgICAgIHBtLT5jYWxjdWxhdGlvbnNfdXNlX2lucHV0X3ByZWNpc2lvbiA9IDE7CisgICAgICBmb3IgKGRvX2JhY2tncm91bmQgPSBBTFBIQV9NT0RFX09GRlNFVCArIFBOR19BTFBIQV9TVEFOREFSRDsKKyAgICAgICAgIGRvX2JhY2tncm91bmQgPD0gQUxQSEFfTU9ERV9PRkZTRVQgKyBQTkdfQUxQSEFfQlJPS0VOICYmICFmYWlsKHBtKTsKKyAgICAgICAgICsrZG9fYmFja2dyb3VuZCkKKyAgICAgICAgIHBlcmZvcm1fZ2FtbWFfY29tcG9zaXRpb25fdGVzdHMocG0sIGRvX2JhY2tncm91bmQsCisgICAgICAgICAgICBwbS0+dGVzdF9nYW1tYV9leHBhbmQxNik7CisgICAgICBpZiAoIWNhbGN1bGF0aW9uc191c2VfaW5wdXRfcHJlY2lzaW9uKQorICAgICAgICAgcG0tPmNhbGN1bGF0aW9uc191c2VfaW5wdXRfcHJlY2lzaW9uID0gMDsKKworICAgICAgaWYgKHN1bW1hcnkpCisgICAgICAgICBzdW1tYXJpemVfZ2FtbWFfZXJyb3JzKHBtLCAiYWxwaGEgbW9kZSIsIDEsIDAvKmluZGV4ZWQqLyk7CisKKyAgICAgIGlmIChmYWlsKHBtKSkKKyAgICAgICAgIHJldHVybjsKKyAgIH0KKyNlbmRpZgorfQorI2VuZGlmIC8qIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCAqLworI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAqLworCisvKiBJTlRFUkxBQ0UgTUFDUk8gVkFMSURBVElPTiAqLworLyogVGhpcyBpcyBjb3BpZWQgdmVyYmF0aW0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiwgaXQgaXMgc2ltcGx5IHRoZSBwYXNzCisgKiBudW1iZXIgaW4gd2hpY2ggZWFjaCBwaXhlbCBpbiBlYWNoIDh4OCB0aWxlIGFwcGVhcnMuICBUaGUgYXJyYXkgbXVzdAorICogYmUgaW5kZXhlZCBhZGFtN1t5XVt4XSBhbmQgbm90aWNlIHRoYXQgdGhlIHBhc3MgbnVtYmVycyBhcmUgYmFzZWQgYXQKKyAqIDEsIG5vdCAwIC0gdGhlIGJhc2UgbGlicG5nIHVzZXMuCisgKi8KK3N0YXRpYyBjb25zdAorcG5nX2J5dGUgYWRhbTdbOF1bOF0gPQoreworICAgeyAxLDYsNCw2LDIsNiw0LDYgfSwKKyAgIHsgNyw3LDcsNyw3LDcsNyw3IH0sCisgICB7IDUsNiw1LDYsNSw2LDUsNiB9LAorICAgeyA3LDcsNyw3LDcsNyw3LDcgfSwKKyAgIHsgMyw2LDQsNiwzLDYsNCw2IH0sCisgICB7IDcsNyw3LDcsNyw3LDcsNyB9LAorICAgeyA1LDYsNSw2LDUsNiw1LDYgfSwKKyAgIHsgNyw3LDcsNyw3LDcsNyw3IH0KK307CisKKy8qIFRoaXMgcm91dGluZSB2YWxpZGF0ZXMgYWxsIHRoZSBpbnRlcmxhY2Ugc3VwcG9ydCBtYWNyb3MgaW4gcG5nLmggZm9yCisgKiBhIHZhcmlldHkgb2YgdmFsaWQgUE5HIHdpZHRocyBhbmQgaGVpZ2h0cy4gIEl0IHVzZXMgYSBudW1iZXIgb2Ygc2ltaWxhcmx5CisgKiBuYW1lZCBpbnRlcm5hbCByb3V0aW5lcyB0aGF0IGZlZWQgb2ZmIHRoZSBhYm92ZSBhcnJheS4KKyAqLworc3RhdGljIHBuZ191aW50XzMyCitwbmdfcGFzc19zdGFydF9yb3coaW50IHBhc3MpCit7CisgICBpbnQgeCwgeTsKKyAgICsrcGFzczsKKyAgIGZvciAoeT0wOyB5PDg7ICsreSkgZm9yICh4PTA7IHg8ODsgKyt4KSBpZiAoYWRhbTdbeV1beF0gPT0gcGFzcykKKyAgICAgIHJldHVybiB5OworICAgcmV0dXJuIDB4ZjsKK30KKworc3RhdGljIHBuZ191aW50XzMyCitwbmdfcGFzc19zdGFydF9jb2woaW50IHBhc3MpCit7CisgICBpbnQgeCwgeTsKKyAgICsrcGFzczsKKyAgIGZvciAoeD0wOyB4PDg7ICsreCkgZm9yICh5PTA7IHk8ODsgKyt5KSBpZiAoYWRhbTdbeV1beF0gPT0gcGFzcykKKyAgICAgIHJldHVybiB4OworICAgcmV0dXJuIDB4ZjsKK30KKworc3RhdGljIGludAorcG5nX3Bhc3Nfcm93X3NoaWZ0KGludCBwYXNzKQoreworICAgaW50IHgsIHksIGJhc2U9KC0xKSwgaW5jPTg7CisgICArK3Bhc3M7CisgICBmb3IgKHk9MDsgeTw4OyArK3kpIGZvciAoeD0wOyB4PDg7ICsreCkgaWYgKGFkYW03W3ldW3hdID09IHBhc3MpCisgICB7CisgICAgICBpZiAoYmFzZSA9PSAoLTEpKQorICAgICAgICAgYmFzZSA9IHk7CisgICAgICBlbHNlIGlmIChiYXNlID09IHkpCisgICAgICAgICB7fQorICAgICAgZWxzZSBpZiAoaW5jID09IHktYmFzZSkKKyAgICAgICAgIGJhc2U9eTsKKyAgICAgIGVsc2UgaWYgKGluYyA9PSA4KQorICAgICAgICAgaW5jID0geS1iYXNlLCBiYXNlPXk7CisgICAgICBlbHNlIGlmIChpbmMgIT0geS1iYXNlKQorICAgICAgICAgcmV0dXJuIDB4ZmY7IC8qIGVycm9yIC0gbW9yZSB0aGFuIG9uZSAnaW5jJyB2YWx1ZSEgKi8KKyAgIH0KKworICAgaWYgKGJhc2UgPT0gKC0xKSkgcmV0dXJuIDB4ZmU7IC8qIGVycm9yIC0gbm8gcm93IGluIHBhc3MhICovCisKKyAgIC8qIFRoZSBzaGlmdCBpcyBhbHdheXMgMSwgMiBvciAzIC0gbm8gcGFzcyBoYXMgYWxsIHRoZSByb3dzISAqLworICAgc3dpdGNoIChpbmMpCisgICB7CitjYXNlIDI6IHJldHVybiAxOworY2FzZSA0OiByZXR1cm4gMjsKK2Nhc2UgODogcmV0dXJuIDM7CitkZWZhdWx0OiBicmVhazsKKyAgIH0KKworICAgLyogZXJyb3IgLSB1bnJlY29nbml6ZWQgJ2luYycgKi8KKyAgIHJldHVybiAoaW5jIDw8IDgpICsgMHhmZDsKK30KKworc3RhdGljIGludAorcG5nX3Bhc3NfY29sX3NoaWZ0KGludCBwYXNzKQoreworICAgaW50IHgsIHksIGJhc2U9KC0xKSwgaW5jPTg7CisgICArK3Bhc3M7CisgICBmb3IgKHg9MDsgeDw4OyArK3gpIGZvciAoeT0wOyB5PDg7ICsreSkgaWYgKGFkYW03W3ldW3hdID09IHBhc3MpCisgICB7CisgICAgICBpZiAoYmFzZSA9PSAoLTEpKQorICAgICAgICAgYmFzZSA9IHg7CisgICAgICBlbHNlIGlmIChiYXNlID09IHgpCisgICAgICAgICB7fQorICAgICAgZWxzZSBpZiAoaW5jID09IHgtYmFzZSkKKyAgICAgICAgIGJhc2U9eDsKKyAgICAgIGVsc2UgaWYgKGluYyA9PSA4KQorICAgICAgICAgaW5jID0geC1iYXNlLCBiYXNlPXg7CisgICAgICBlbHNlIGlmIChpbmMgIT0geC1iYXNlKQorICAgICAgICAgcmV0dXJuIDB4ZmY7IC8qIGVycm9yIC0gbW9yZSB0aGFuIG9uZSAnaW5jJyB2YWx1ZSEgKi8KKyAgIH0KKworICAgaWYgKGJhc2UgPT0gKC0xKSkgcmV0dXJuIDB4ZmU7IC8qIGVycm9yIC0gbm8gcm93IGluIHBhc3MhICovCisKKyAgIC8qIFRoZSBzaGlmdCBpcyBhbHdheXMgMSwgMiBvciAzIC0gbm8gcGFzcyBoYXMgYWxsIHRoZSByb3dzISAqLworICAgc3dpdGNoIChpbmMpCisgICB7CitjYXNlIDE6IHJldHVybiAwOyAvKiBwYXNzIDcgaGFzIGFsbCB0aGUgY29sdW1ucyAqLworY2FzZSAyOiByZXR1cm4gMTsKK2Nhc2UgNDogcmV0dXJuIDI7CitjYXNlIDg6IHJldHVybiAzOworZGVmYXVsdDogYnJlYWs7CisgICB9CisKKyAgIC8qIGVycm9yIC0gdW5yZWNvZ25pemVkICdpbmMnICovCisgICByZXR1cm4gKGluYyA8PCA4KSArIDB4ZmQ7Cit9CisKK3N0YXRpYyBwbmdfdWludF8zMgorcG5nX3Jvd19mcm9tX3Bhc3Nfcm93KHBuZ191aW50XzMyIHlJbiwgaW50IHBhc3MpCit7CisgICAvKiBCeSBleGFtaW5hdGlvbiBvZiB0aGUgYXJyYXk6ICovCisgICBzd2l0Y2ggKHBhc3MpCisgICB7CitjYXNlIDA6IHJldHVybiB5SW4gKiA4OworY2FzZSAxOiByZXR1cm4geUluICogODsKK2Nhc2UgMjogcmV0dXJuIHlJbiAqIDggKyA0OworY2FzZSAzOiByZXR1cm4geUluICogNDsKK2Nhc2UgNDogcmV0dXJuIHlJbiAqIDQgKyAyOworY2FzZSA1OiByZXR1cm4geUluICogMjsKK2Nhc2UgNjogcmV0dXJuIHlJbiAqIDIgKyAxOworZGVmYXVsdDogYnJlYWs7CisgICB9CisKKyAgIHJldHVybiAweGZmOyAvKiBiYWQgcGFzcyBudW1iZXIgKi8KK30KKworc3RhdGljIHBuZ191aW50XzMyCitwbmdfY29sX2Zyb21fcGFzc19jb2wocG5nX3VpbnRfMzIgeEluLCBpbnQgcGFzcykKK3sKKyAgIC8qIEJ5IGV4YW1pbmF0aW9uIG9mIHRoZSBhcnJheTogKi8KKyAgIHN3aXRjaCAocGFzcykKKyAgIHsKK2Nhc2UgMDogcmV0dXJuIHhJbiAqIDg7CitjYXNlIDE6IHJldHVybiB4SW4gKiA4ICsgNDsKK2Nhc2UgMjogcmV0dXJuIHhJbiAqIDQ7CitjYXNlIDM6IHJldHVybiB4SW4gKiA0ICsgMjsKK2Nhc2UgNDogcmV0dXJuIHhJbiAqIDI7CitjYXNlIDU6IHJldHVybiB4SW4gKiAyICsgMTsKK2Nhc2UgNjogcmV0dXJuIHhJbjsKK2RlZmF1bHQ6IGJyZWFrOworICAgfQorCisgICByZXR1cm4gMHhmZjsgLyogYmFkIHBhc3MgbnVtYmVyICovCit9CisKK3N0YXRpYyBpbnQKK3BuZ19yb3dfaW5faW50ZXJsYWNlX3Bhc3MocG5nX3VpbnRfMzIgeSwgaW50IHBhc3MpCit7CisgICAvKiBJcyByb3cgJ3knIGluIHBhc3MgJ3Bhc3MnPyAqLworICAgaW50IHg7CisgICB5ICY9IDc7CisgICArK3Bhc3M7CisgICBmb3IgKHg9MDsgeDw4OyArK3gpIGlmIChhZGFtN1t5XVt4XSA9PSBwYXNzKQorICAgICAgcmV0dXJuIDE7CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwbmdfY29sX2luX2ludGVybGFjZV9wYXNzKHBuZ191aW50XzMyIHgsIGludCBwYXNzKQoreworICAgLyogSXMgY29sdW1uICd4JyBpbiBwYXNzICdwYXNzJz8gKi8KKyAgIGludCB5OworICAgeCAmPSA3OworICAgKytwYXNzOworICAgZm9yICh5PTA7IHk8ODsgKyt5KSBpZiAoYWRhbTdbeV1beF0gPT0gcGFzcykKKyAgICAgIHJldHVybiAxOworCisgICByZXR1cm4gMDsKK30KKworc3RhdGljIHBuZ191aW50XzMyCitwbmdfcGFzc19yb3dzKHBuZ191aW50XzMyIGhlaWdodCwgaW50IHBhc3MpCit7CisgICBwbmdfdWludF8zMiB0aWxlcyA9IGhlaWdodD4+MzsKKyAgIHBuZ191aW50XzMyIHJvd3MgPSAwOworICAgdW5zaWduZWQgaW50IHgsIHk7CisKKyAgIGhlaWdodCAmPSA3OworICAgKytwYXNzOworICAgZm9yICh5PTA7IHk8ODsgKyt5KSBmb3IgKHg9MDsgeDw4OyArK3gpIGlmIChhZGFtN1t5XVt4XSA9PSBwYXNzKQorICAgeworICAgICAgcm93cyArPSB0aWxlczsKKyAgICAgIGlmICh5IDwgaGVpZ2h0KSArK3Jvd3M7CisgICAgICBicmVhazsgLyogaS5lLiBicmVhayB0aGUgJ3gnLCBjb2x1bW4sIGxvb3AuICovCisgICB9CisKKyAgIHJldHVybiByb3dzOworfQorCitzdGF0aWMgcG5nX3VpbnRfMzIKK3BuZ19wYXNzX2NvbHMocG5nX3VpbnRfMzIgd2lkdGgsIGludCBwYXNzKQoreworICAgcG5nX3VpbnRfMzIgdGlsZXMgPSB3aWR0aD4+MzsKKyAgIHBuZ191aW50XzMyIGNvbHMgPSAwOworICAgdW5zaWduZWQgaW50IHgsIHk7CisKKyAgIHdpZHRoICY9IDc7CisgICArK3Bhc3M7CisgICBmb3IgKHg9MDsgeDw4OyArK3gpIGZvciAoeT0wOyB5PDg7ICsreSkgaWYgKGFkYW03W3ldW3hdID09IHBhc3MpCisgICB7CisgICAgICBjb2xzICs9IHRpbGVzOworICAgICAgaWYgKHggPCB3aWR0aCkgKytjb2xzOworICAgICAgYnJlYWs7IC8qIGkuZS4gYnJlYWsgdGhlICd5Jywgcm93LCBsb29wLiAqLworICAgfQorCisgICByZXR1cm4gY29sczsKK30KKworc3RhdGljIHZvaWQKK3BlcmZvcm1faW50ZXJsYWNlX21hY3JvX3ZhbGlkYXRpb24odm9pZCkKK3sKKyAgIC8qIFRoZSBtYWNyb3MgdG8gdmFsaWRhdGUsIGZpcnN0IHRob3NlIHRoYXQgZGVwZW5kIG9ubHkgb24gcGFzczoKKyAgICAqCisgICAgKiBQTkdfUEFTU19TVEFSVF9ST1cocGFzcykKKyAgICAqIFBOR19QQVNTX1NUQVJUX0NPTChwYXNzKQorICAgICogUE5HX1BBU1NfUk9XX1NISUZUKHBhc3MpCisgICAgKiBQTkdfUEFTU19DT0xfU0hJRlQocGFzcykKKyAgICAqLworICAgaW50IHBhc3M7CisKKyAgIGZvciAocGFzcz0wOyBwYXNzPDc7ICsrcGFzcykKKyAgIHsKKyAgICAgIHBuZ191aW50XzMyIG0sIGYsIHY7CisKKyAgICAgIG0gPSBQTkdfUEFTU19TVEFSVF9ST1cocGFzcyk7CisgICAgICBmID0gcG5nX3Bhc3Nfc3RhcnRfcm93KHBhc3MpOworICAgICAgaWYgKG0gIT0gZikKKyAgICAgIHsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUE5HX1BBU1NfU1RBUlRfUk9XKCVkKSA9ICV1ICE9ICV4XG4iLCBwYXNzLCBtLCBmKTsKKyAgICAgICAgIGV4aXQoOTkpOworICAgICAgfQorCisgICAgICBtID0gUE5HX1BBU1NfU1RBUlRfQ09MKHBhc3MpOworICAgICAgZiA9IHBuZ19wYXNzX3N0YXJ0X2NvbChwYXNzKTsKKyAgICAgIGlmIChtICE9IGYpCisgICAgICB7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBOR19QQVNTX1NUQVJUX0NPTCglZCkgPSAldSAhPSAleFxuIiwgcGFzcywgbSwgZik7CisgICAgICAgICBleGl0KDk5KTsKKyAgICAgIH0KKworICAgICAgbSA9IFBOR19QQVNTX1JPV19TSElGVChwYXNzKTsKKyAgICAgIGYgPSBwbmdfcGFzc19yb3dfc2hpZnQocGFzcyk7CisgICAgICBpZiAobSAhPSBmKQorICAgICAgeworICAgICAgICAgZnByaW50ZihzdGRlcnIsICJQTkdfUEFTU19ST1dfU0hJRlQoJWQpID0gJXUgIT0gJXhcbiIsIHBhc3MsIG0sIGYpOworICAgICAgICAgZXhpdCg5OSk7CisgICAgICB9CisKKyAgICAgIG0gPSBQTkdfUEFTU19DT0xfU0hJRlQocGFzcyk7CisgICAgICBmID0gcG5nX3Bhc3NfY29sX3NoaWZ0KHBhc3MpOworICAgICAgaWYgKG0gIT0gZikKKyAgICAgIHsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUE5HX1BBU1NfQ09MX1NISUZUKCVkKSA9ICV1ICE9ICV4XG4iLCBwYXNzLCBtLCBmKTsKKyAgICAgICAgIGV4aXQoOTkpOworICAgICAgfQorCisgICAgICAvKiBNYWNyb3MgdGhhdCBkZXBlbmQgb24gdGhlIGltYWdlIG9yIHN1Yi1pbWFnZSBoZWlnaHQgdG9vOgorICAgICAgICoKKyAgICAgICAqIFBOR19QQVNTX1JPV1MoaGVpZ2h0LCBwYXNzKQorICAgICAgICogUE5HX1BBU1NfQ09MUyh3aWR0aCwgcGFzcykKKyAgICAgICAqIFBOR19ST1dfRlJPTV9QQVNTX1JPVyh5SW4sIHBhc3MpCisgICAgICAgKiBQTkdfQ09MX0ZST01fUEFTU19DT0woeEluLCBwYXNzKQorICAgICAgICogUE5HX1JPV19JTl9JTlRFUkxBQ0VfUEFTUyh5LCBwYXNzKQorICAgICAgICogUE5HX0NPTF9JTl9JTlRFUkxBQ0VfUEFTUyh4LCBwYXNzKQorICAgICAgICovCisgICAgICBmb3IgKHY9MDs7KQorICAgICAgeworICAgICAgICAgLyogRmlyc3QgdGhlIGJhc2UgMCBzdHVmZjogKi8KKyAgICAgICAgIG0gPSBQTkdfUk9XX0ZST01fUEFTU19ST1codiwgcGFzcyk7CisgICAgICAgICBmID0gcG5nX3Jvd19mcm9tX3Bhc3Nfcm93KHYsIHBhc3MpOworICAgICAgICAgaWYgKG0gIT0gZikKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUE5HX1JPV19GUk9NX1BBU1NfUk9XKCV1LCAlZCkgPSAldSAhPSAleFxuIiwKKyAgICAgICAgICAgICAgIHYsIHBhc3MsIG0sIGYpOworICAgICAgICAgICAgZXhpdCg5OSk7CisgICAgICAgICB9CisKKyAgICAgICAgIG0gPSBQTkdfQ09MX0ZST01fUEFTU19DT0wodiwgcGFzcyk7CisgICAgICAgICBmID0gcG5nX2NvbF9mcm9tX3Bhc3NfY29sKHYsIHBhc3MpOworICAgICAgICAgaWYgKG0gIT0gZikKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUE5HX0NPTF9GUk9NX1BBU1NfQ09MKCV1LCAlZCkgPSAldSAhPSAleFxuIiwKKyAgICAgICAgICAgICAgIHYsIHBhc3MsIG0sIGYpOworICAgICAgICAgICAgZXhpdCg5OSk7CisgICAgICAgICB9CisKKyAgICAgICAgIG0gPSBQTkdfUk9XX0lOX0lOVEVSTEFDRV9QQVNTKHYsIHBhc3MpOworICAgICAgICAgZiA9IHBuZ19yb3dfaW5faW50ZXJsYWNlX3Bhc3ModiwgcGFzcyk7CisgICAgICAgICBpZiAobSAhPSBmKQorICAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJQTkdfUk9XX0lOX0lOVEVSTEFDRV9QQVNTKCV1LCAlZCkgPSAldSAhPSAleFxuIiwKKyAgICAgICAgICAgICAgIHYsIHBhc3MsIG0sIGYpOworICAgICAgICAgICAgZXhpdCg5OSk7CisgICAgICAgICB9CisKKyAgICAgICAgIG0gPSBQTkdfQ09MX0lOX0lOVEVSTEFDRV9QQVNTKHYsIHBhc3MpOworICAgICAgICAgZiA9IHBuZ19jb2xfaW5faW50ZXJsYWNlX3Bhc3ModiwgcGFzcyk7CisgICAgICAgICBpZiAobSAhPSBmKQorICAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJQTkdfQ09MX0lOX0lOVEVSTEFDRV9QQVNTKCV1LCAlZCkgPSAldSAhPSAleFxuIiwKKyAgICAgICAgICAgICAgIHYsIHBhc3MsIG0sIGYpOworICAgICAgICAgICAgZXhpdCg5OSk7CisgICAgICAgICB9CisKKyAgICAgICAgIC8qIFRoZW4gdGhlIGJhc2UgMSBzdHVmZjogKi8KKyAgICAgICAgICsrdjsKKyAgICAgICAgIG0gPSBQTkdfUEFTU19ST1dTKHYsIHBhc3MpOworICAgICAgICAgZiA9IHBuZ19wYXNzX3Jvd3ModiwgcGFzcyk7CisgICAgICAgICBpZiAobSAhPSBmKQorICAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJQTkdfUEFTU19ST1dTKCV1LCAlZCkgPSAldSAhPSAleFxuIiwKKyAgICAgICAgICAgICAgIHYsIHBhc3MsIG0sIGYpOworICAgICAgICAgICAgZXhpdCg5OSk7CisgICAgICAgICB9CisKKyAgICAgICAgIG0gPSBQTkdfUEFTU19DT0xTKHYsIHBhc3MpOworICAgICAgICAgZiA9IHBuZ19wYXNzX2NvbHModiwgcGFzcyk7CisgICAgICAgICBpZiAobSAhPSBmKQorICAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJQTkdfUEFTU19DT0xTKCV1LCAlZCkgPSAldSAhPSAleFxuIiwKKyAgICAgICAgICAgICAgIHYsIHBhc3MsIG0sIGYpOworICAgICAgICAgICAgZXhpdCg5OSk7CisgICAgICAgICB9CisKKyAgICAgICAgIC8qIE1vdmUgdG8gdGhlIG5leHQgdiAtIHRoZSBzdGVwcGluZyBhbGdvcml0aG0gc3RhcnRzIHNraXBwaW5nCisgICAgICAgICAgKiB2YWx1ZXMgYWJvdmUgMTAyNC4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKHYgPiAxMDI0KQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKHYgPT0gUE5HX1VJTlRfMzFfTUFYKQorICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIHYgPSAodiA8PCAxKSBeIHY7CisgICAgICAgICAgICBpZiAodiA+PSBQTkdfVUlOVF8zMV9NQVgpCisgICAgICAgICAgICAgICB2ID0gUE5HX1VJTlRfMzFfTUFYLTE7CisgICAgICAgICB9CisgICAgICB9CisgICB9Cit9CisKKy8qIFRlc3QgY29sb3IgZW5jb2RpbmdzLiBUaGVzZSB2YWx1ZXMgYXJlIGJhY2stY2FsY3VsYXRlZCBmcm9tIHRoZSBwdWJsaXNoZWQKKyAqIGNocm9tYXRpY2l0aWVzLiAgVGhlIHZhbHVlcyBhcmUgYWNjdXJhdGUgdG8gYWJvdXQgMTQgZGVjaW1hbCBwbGFjZXM7IDE1IGFyZQorICogZ2l2ZW4uICBUaGVzZSB2YWx1ZXMgYXJlIG11Y2ggbW9yZSBhY2N1cmF0ZSB0aGFuIHRoZSBvbmVzIGdpdmVuIGluIHRoZSBzcGVjLAorICogd2hpY2ggdHlwaWNhbGx5IGRvbid0IGV4Y2VlZCA0IGRlY2ltYWwgcGxhY2VzLiAgVGhpcyBhbGxvd3MgdGVzdGluZyBvZiB0aGUKKyAqIGxpYnBuZyBjb2RlIHRvIGl0cyB0aGVvcmV0aWNhbCBhY2N1cmFjeSBvZiA0IGRlY2ltYWwgcGxhY2VzLiAgKElmIHBuZ3ZhbGlkCisgKiB1c2VkIHRoZSBwdWJsaXNoZWQgZXJyb3JzIHRoZSAnc2xhY2snIHBlcm1pdHRlZCB3b3VsZCBoYXZlIHRvIGJlICsvLS41RS00IG9yCisgKiBtb3JlLikKKyAqCisgKiBUaGUgcG5nX21vZGlmaWVyIGNvZGUgYXNzdW1lcyB0aGF0IGVuY29kaW5nc1swXSBpcyBzUkdCIGFuZCB0cmVhdHMgaXQKKyAqIHNwZWNpYWxseTogZG8gbm90IGNoYW5nZSB0aGUgZmlyc3QgZW50cnkgaW4gdGhpcyBsaXN0IQorICovCitzdGF0aWMgY29uc3QgY29sb3JfZW5jb2RpbmcgdGVzdF9lbmNvZGluZ3NbXSA9Cit7CisvKiBzUkdCOiBtdXN0IGJlIGZpcnN0IGluIHRoaXMgbGlzdCEgKi8KKy8qZ2FtbWE6Ki8geyAxLzIuMiwKKy8qcmVkOiAgKi8geyAwLjQxMjM5MDc5OTI2NTk1OSwgMC4yMTI2MzkwMDU4NzE1MTAsIDAuMDE5MzMwODE4NzE1NTkyIH0sCisvKmdyZWVuOiovIHsgMC4zNTc1ODQzMzkzODM4NzgsIDAuNzE1MTY4Njc4NzY3NzU2LCAwLjExOTE5NDc3OTc5NDYyNiB9LAorLypibHVlOiAqLyB7IDAuMTgwNDgwNzg4NDAxODM0LCAwLjA3MjE5MjMxNTM2MDczNCwgMC45NTA1MzIxNTIyNDk2NjB9IH0sCisvKiBLb2RhayBQcm9QaG90byAod2lkZSBnYW11dCkgKi8KKy8qZ2FtbWE6Ki8geyAxLzEuNiAvKmFwcHJveGltYXRlOiB1c2VzIDEuOCBwb3dlciBsYXcgY29tcGFyZWQgdG8gc1JHQiAyLjQqLywKKy8qcmVkOiAgKi8geyAwLjc5Nzc2MDQ4OTY3MjMwMywgMC4yODgwNzExMjgyMjkyOTMsIDAuMDAwMDAwMDAwMDAwMDAwIH0sCisvKmdyZWVuOiovIHsgMC4xMzUxODU4MzcxNzU3NDAsIDAuNzExODQzMjE3ODEwMTAyLCAwLjAwMDAwMDAwMDAwMDAwMCB9LAorLypibHVlOiAqLyB7IDAuMDMxMzQ5MzQ5NTgxNTI1LCAwLjAwMDA4NTY1Mzk2MDYwNSwgMC44MjUxMDQ2MDI1MTA0NjB9IH0sCisvKiBBZG9iZSBSR0IgKDE5OTgpICovCisvKmdhbW1hOiovIHsgMS8oMis1MS4vMjU2KSwKKy8qcmVkOiAgKi8geyAwLjU3NjY2OTA0MjkxMDEzMSwgMC4yOTczNDQ5NzUyNTA1MzYsIDAuMDI3MDMxMzYxMzg2NDEyIH0sCisvKmdyZWVuOiovIHsgMC4xODU1NTgyMzc5MDY1NDYsIDAuNjI3MzYzNTY2MjU1NDY2LCAwLjA3MDY4ODg1MjUzNTgyNyB9LAorLypibHVlOiAqLyB7IDAuMTg4MjI4NjQ2MjM0OTk1LCAwLjA3NTI5MTQ1ODQ5Mzk5OCwgMC45OTEzMzc1MzY4Mzc2Mzl9IH0sCisvKiBBZG9iZSBXaWRlIEdhbXV0IFJHQiAqLworLypnYW1tYToqLyB7IDEvKDIrNTEuLzI1NiksCisvKnJlZDogICovIHsgMC43MTY1MDA3MTY3NzkzODYsIDAuMjU4NzI4MjQzMDQwMTEzLCAwLjAwMDAwMDAwMDAwMDAwMCB9LAorLypncmVlbjoqLyB7IDAuMTAxMDIwNTc0Mzk3NDc3LCAwLjcyNDY4MjMxNDk0ODU2NiwgMC4wNTEyMTE4MTg5NjUzODggfSwKKy8qYmx1ZTogKi8geyAwLjE0Njc3NDM4NTI1MjcwNSwgMC4wMTY1ODk0NDIwMTEzMjEsIDAuNzczODkyNzgzNTQ1MDczfSB9LAorLyogRmFrZSBlbmNvZGluZyB3aGljaCBzZWxlY3RzIGp1c3QgdGhlIGdyZWVuIGNoYW5uZWwgKi8KKy8qZ2FtbWE6Ki8geyAxLjQ1LzIuMiwgLyogdGhlICdNYWMnIGdhbW1hICovCisvKnJlZDogICovIHsgMC43MTY1MDA3MTY3NzkzODYsIDAuMDAwMDAwMDAwMDAwMDAwLCAwLjAwMDAwMDAwMDAwMDAwMCB9LAorLypncmVlbjoqLyB7IDAuMTAxMDIwNTc0Mzk3NDc3LCAxLjAwMDAwMDAwMDAwMDAwMCwgMC4wNTEyMTE4MTg5NjUzODggfSwKKy8qYmx1ZTogKi8geyAwLjE0Njc3NDM4NTI1MjcwNSwgMC4wMDAwMDAwMDAwMDAwMDAsIDAuNzczODkyNzgzNTQ1MDczfSB9LAorfTsKKworLyogc2lnbmFsIGhhbmRsZXIKKyAqCisgKiBUaGlzIGF0dGVtcHRzIHRvIHRyYXAgc2lnbmFscyBhbmQgZXNjYXBlIHdpdGhvdXQgY3Jhc2hpbmcuICBJdCBuZWVkcyBhCisgKiBjb250ZXh0IHBvaW50ZXIgc28gdGhhdCBpdCBjYW4gdGhyb3cgYW4gZXhjZXB0aW9uIChjYWxsIGxvbmdqbXApIHRvIHJlY292ZXIKKyAqIGZyb20gdGhlIGNvbmRpdGlvbjsgdGhpcyBpcyBoYW5kbGVkIGJ5IG1ha2luZyB0aGUgcG5nX21vZGlmaWVyIHVzZWQgYnkgJ21haW4nCisgKiBpbnRvIGEgZ2xvYmFsIHZhcmlhYmxlLgorICovCitzdGF0aWMgcG5nX21vZGlmaWVyIHBtOworCitzdGF0aWMgdm9pZCBzaWduYWxfaGFuZGxlcihpbnQgc2lnbnVtKQoreworCisgICBzaXplX3QgcG9zID0gMDsKKyAgIGNoYXIgbXNnWzY0XTsKKworICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgImNhdWdodCBzaWduYWw6ICIpOworCisgICBzd2l0Y2ggKHNpZ251bSkKKyAgIHsKKyAgICAgIGNhc2UgU0lHQUJSVDoKKyAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICJhYm9ydCIpOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgU0lHRlBFOgorICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgImZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbiIpOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgU0lHSUxMOgorICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgImlsbGVnYWwgaW5zdHJ1Y3Rpb24iKTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFNJR0lOVDoKKyAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICJpbnRlcnJ1cHQiKTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFNJR1NFR1Y6CisgICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiaW52YWxpZCBtZW1vcnkgYWNjZXNzIik7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBTSUdURVJNOgorICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgInRlcm1pbmF0aW9uIHJlcXVlc3QiKTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgInVua25vd24gIik7CisgICAgICAgICBwb3MgPSBzYWZlY2F0bihtc2csIHNpemVvZiBtc2csIHBvcywgc2lnbnVtKTsKKyAgICAgICAgIGJyZWFrOworICAgfQorCisgICBzdG9yZV9sb2coJnBtLnRoaXMsIE5VTEwvKnBuZ19zdHJ1Y3RwKi8sIG1zZywgMS8qZXJyb3IqLyk7CisKKyAgIC8qIEFuZCBmaW5hbGx5IHRocm93IGFuIGV4Y2VwdGlvbiBzbyB3ZSBjYW4ga2VlcCBnb2luZywgdW5sZXNzIHRoaXMgaXMKKyAgICAqIFNJR1RFUk0gaW4gd2hpY2ggY2FzZSBzdG9wIG5vdy4KKyAgICAqLworICAgaWYgKHNpZ251bSAhPSBTSUdURVJNKQorICAgeworICAgICAgc3RydWN0IGV4Y2VwdGlvbl9jb250ZXh0ICp0aGVfZXhjZXB0aW9uX2NvbnRleHQgPQorICAgICAgICAgJnBtLnRoaXMuZXhjZXB0aW9uX2NvbnRleHQ7CisKKyAgICAgIFRocm93ICZwbS50aGlzOworICAgfQorCisgICBlbHNlCisgICAgICBleGl0KDEpOworfQorCisvKiBtYWluIHByb2dyYW0gKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgIGludCBzdW1tYXJ5ID0gMTsgIC8qIFByaW50IHRoZSBlcnJvciBzdW1tYXJ5IGF0IHRoZSBlbmQgKi8KKyAgIGludCBtZW1zdGF0cyA9IDA7IC8qIFByaW50IG1lbW9yeSBzdGF0aXN0aWNzIGF0IHRoZSBlbmQgKi8KKworICAgLyogQ3JlYXRlIHRoZSBnaXZlbiBvdXRwdXQgZmlsZSBvbiBzdWNjZXNzOiAqLworICAgY29uc3QgY2hhciAqdG91Y2ggPSBOVUxMOworCisgICAvKiBUaGlzIGlzIGFuIGFycmF5IG9mIHN0YW5kYXJkIGdhbW1hIHZhbHVlcyAoYmVsaWV2ZSBpdCBvciBub3QgSSd2ZSBzZWVuCisgICAgKiBldmVyeSBvbmUgb2YgdGhlc2UgbWVudGlvbmVkIHNvbWV3aGVyZS4pCisgICAgKgorICAgICogSW4gdGhlIGZvbGxvd2luZyBsaXN0IHRoZSBtb3N0IHVzZWZ1bCB2YWx1ZXMgYXJlIGZpcnN0IQorICAgICovCisgICBzdGF0aWMgZG91YmxlCisgICAgICBnYW1tYXNbXT17Mi4yLCAxLjAsIDIuMi8xLjQ1LCAxLjgsIDEuNSwgMi40LCAyLjUsIDIuNjIsIDIuOX07CisKKyAgIC8qIFRoaXMgcmVjb3JkcyB0aGUgY29tbWFuZCBhbmQgYXJndW1lbnRzOiAqLworICAgc2l6ZV90IGNwID0gMDsKKyAgIGNoYXIgY29tbWFuZFsxMDI0XTsKKworICAgYW5vbl9jb250ZXh0KCZwbS50aGlzKTsKKworICAgZ251X3ZvbGF0aWxlKHN1bW1hcnkpCisgICBnbnVfdm9sYXRpbGUobWVtc3RhdHMpCisgICBnbnVfdm9sYXRpbGUodG91Y2gpCisKKyAgIC8qIEFkZCBhcHByb3ByaWF0ZSBzaWduYWwgaGFuZGxlcnMsIGp1c3QgdGhlIEFOU0kgc3BlY2lmaWVkIG9uZXM6ICovCisgICBzaWduYWwoU0lHQUJSVCwgc2lnbmFsX2hhbmRsZXIpOworICAgc2lnbmFsKFNJR0ZQRSwgc2lnbmFsX2hhbmRsZXIpOworICAgc2lnbmFsKFNJR0lMTCwgc2lnbmFsX2hhbmRsZXIpOworICAgc2lnbmFsKFNJR0lOVCwgc2lnbmFsX2hhbmRsZXIpOworICAgc2lnbmFsKFNJR1NFR1YsIHNpZ25hbF9oYW5kbGVyKTsKKyAgIHNpZ25hbChTSUdURVJNLCBzaWduYWxfaGFuZGxlcik7CisKKyNpZmRlZiBIQVZFX0ZFRU5BQkxFRVhDRVBUCisgICAvKiBPbmx5IHJlcXVpcmVkIHRvIGVuYWJsZSBGUCBleGNlcHRpb25zIG9uIHBsYXRmb3JtcyB3aGVyZSB0aGV5IHN0YXJ0IG9mZgorICAgICogZGlzYWJsZWQ7IHRoaXMgaXMgbm90IG5lY2Vzc2FyeSBidXQgaWYgaXQgaXMgbm90IGRvbmUgcG5ndmFsaWQgd2lsbCBsaWtlbHkKKyAgICAqIGVuZCB1cCBpZ25vcmluZyBGUCBjb25kaXRpb25zIHRoYXQgb3RoZXIgcGxhdGZvcm1zIGZhdWx0LgorICAgICovCisgICBmZWVuYWJsZWV4Y2VwdChGRV9ESVZCWVpFUk8gfCBGRV9JTlZBTElEIHwgRkVfT1ZFUkZMT1cpOworI2VuZGlmCisKKyAgIG1vZGlmaWVyX2luaXQoJnBtKTsKKworICAgLyogUHJlYWxsb2NhdGUgdGhlIGltYWdlIGJ1ZmZlciwgYmVjYXVzZSB3ZSBrbm93IGhvdyBiaWcgaXQgbmVlZHMgdG8gYmUsCisgICAgKiBub3RlIHRoYXQsIGZvciB0ZXN0aW5nIHB1cnBvc2VzLCBpdCBpcyBkZWxpYmVyYXRlbHkgbWlzLWFsaWduZWQgYnkgdGFnCisgICAgKiBieXRlcyBlaXRoZXIgc2lkZS4gIEFsbCByb3dzIGhhdmUgYW4gYWRkaXRpb25hbCBmaXZlIGJ5dGVzIG9mIHBhZGRpbmcgZm9yCisgICAgKiBvdmVyd3JpdGUgY2hlY2tpbmcuCisgICAgKi8KKyAgIHN0b3JlX2Vuc3VyZV9pbWFnZSgmcG0udGhpcywgTlVMTCwgMiwgVFJBTlNGT1JNX1JPV01BWCwgVFJBTlNGT1JNX0hFSUdIVE1BWCk7CisKKyAgIC8qIERvbid0IGdpdmUgYXJndlswXSwgaXQncyBub3JtYWxseSBzb21lIGhvcnJpYmxlIGxpYnRvb2wgc3RyaW5nOiAqLworICAgY3AgPSBzYWZlY2F0KGNvbW1hbmQsIHNpemVvZiBjb21tYW5kLCBjcCwgInBuZ3ZhbGlkIik7CisKKyAgIC8qIERlZmF1bHQgdG8gZXJyb3Igb24gd2FybmluZzogKi8KKyAgIHBtLnRoaXMudHJlYXRfd2FybmluZ3NfYXNfZXJyb3JzID0gMTsKKworICAgLyogRGVmYXVsdCBhc3N1bWVfMTZfYml0X2NhbGN1bGF0aW9ucyBhcHByb3ByaWF0ZWx5OyB0aGlzIHRlbGxzIHRoZSBjaGVja2luZworICAgICogY29kZSB0aGF0IDE2LWJpdCBhcml0aG1ldGljIGlzIHVzZWQgZm9yIDgtYml0IHNhbXBsZXMgd2hlbiBpdCB3b3VsZCBtYWtlIGEKKyAgICAqIGRpZmZlcmVuY2UuCisgICAgKi8KKyAgIHBtLmFzc3VtZV8xNl9iaXRfY2FsY3VsYXRpb25zID0gUE5HX0xJQlBOR19WRVIgPj0gMTA3MDA7CisKKyAgIC8qIEN1cnJlbnRseSAxNiBiaXQgZXhwYW5zaW9uIGhhcHBlbnMgYXQgdGhlIGVuZCBvZiB0aGUgcGlwZWxpbmUsIHNvIHRoZQorICAgICogY2FsY3VsYXRpb25zIGFyZSBkb25lIGluIHRoZSBpbnB1dCBiaXQgZGVwdGggbm90IHRoZSBvdXRwdXQuCisgICAgKgorICAgICogVE9ETzogZml4IHRoaXMKKyAgICAqLworICAgcG0uY2FsY3VsYXRpb25zX3VzZV9pbnB1dF9wcmVjaXNpb24gPSAxVTsKKworICAgLyogU3RvcmUgdGhlIHRlc3QgZ2FtbWFzICovCisgICBwbS5nYW1tYXMgPSBnYW1tYXM7CisgICBwbS5uZ2FtbWFzID0gQVJSQVlfU0laRShnYW1tYXMpOworICAgcG0ubmdhbW1hX3Rlc3RzID0gMDsgLyogZGVmYXVsdCB0byBvZmYgKi8KKworICAgLyogTG93IGJpdCBkZXB0aCBncmF5IGltYWdlcyBkb24ndCBkbyB3ZWxsIGluIHRoZSBnYW1tYSB0ZXN0cywgdW50aWwKKyAgICAqIHRoaXMgaXMgZml4ZWQgdHVybiB0aGVtIG9mZiBmb3Igc29tZSBnYW1tYSBjYXNlczoKKyAgICAqLworIyAgaWZkZWYgUE5HX1dSSVRFX3RSTlNfU1VQUE9SVEVECisgICAgICBwbS50ZXN0X3RSTlMgPSAxOworIyAgZW5kaWYKKyAgIHBtLnRlc3RfbGJnID0gUE5HX0xJQlBOR19WRVIgPj0gMTA2MDA7CisgICBwbS50ZXN0X2xiZ19nYW1tYV90aHJlc2hvbGQgPSAxOworICAgcG0udGVzdF9sYmdfZ2FtbWFfdHJhbnNmb3JtID0gUE5HX0xJQlBOR19WRVIgPj0gMTA2MDA7CisgICBwbS50ZXN0X2xiZ19nYW1tYV9zYml0ID0gMTsKKyAgIHBtLnRlc3RfbGJnX2dhbW1hX2NvbXBvc2l0aW9uID0gUE5HX0xJQlBOR19WRVIgPj0gMTA3MDA7CisKKyAgIC8qIEFuZCB0aGUgdGVzdCBlbmNvZGluZ3MgKi8KKyAgIHBtLmVuY29kaW5ncyA9IHRlc3RfZW5jb2RpbmdzOworICAgcG0ubmVuY29kaW5ncyA9IEFSUkFZX1NJWkUodGVzdF9lbmNvZGluZ3MpOworCisjICBpZiBQTkdfTElCUE5HX1ZFUiA8IDEwNzAwCisgICAgICBwbS5zYml0bG93ID0gOFU7IC8qIGJlY2F1c2UgbGlicG5nIGRvZXNuJ3QgZG8gc0JJVCBiZWxvdyA4ISAqLworIyAgZWxzZQorICAgICAgcG0uc2JpdGxvdyA9IDFVOworIyAgZW5kaWYKKworICAgLyogVGhlIGZvbGxvd2luZyBhbGxvd3MgcmVzdWx0cyB0byBwYXNzIGlmIHRoZXkgY29ycmVzcG9uZCB0byBhbnl0aGluZyBpbiB0aGUKKyAgICAqIHRyYW5zZm9ybWVkIHJhbmdlIFtpbnB1dC0uNSxpbnB1dCsuNV07IHRoaXMgaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBvZiB0aGUKKyAgICAqIHdheSBsaWJwbmcgdHJlYXRlcyB0aGUgMTZfVE9fOCBmbGFnIHdoZW4gYnVpbGRpbmcgdGhlIGdhbW1hIHRhYmxlcyBpbgorICAgICogcmVsZWFzZXMgdXAgdG8gMS42LjAuCisgICAgKgorICAgICogVE9ETzogcmV2aWV3IHRoaXMKKyAgICAqLworICAgcG0udXNlX2lucHV0X3ByZWNpc2lvbl8xNnRvOCA9IDFVOworICAgcG0udXNlX2lucHV0X3ByZWNpc2lvbl9zYml0ID0gMVU7IC8qIGJlY2F1c2UgbGlicG5nIG5vdyByb3VuZHMgc0JJVCAqLworCisgICAvKiBTb21lIGRlZmF1bHQgdmFsdWVzIChzZXQgdGhlIGJlaGF2aW9yIGZvciAnbWFrZSBjaGVjaycgaGVyZSkuCisgICAgKiBUaGVzZSB2YWx1ZXMgc2ltcGx5IGNvbnRyb2wgdGhlIG1heGltdW0gZXJyb3IgcGVybWl0dGVkIGluIHRoZSBnYW1tYQorICAgICogdHJhbnNmb3JtYXRpb25zLiAgVGhlIHByYWN0aWFsIGxpbWl0cyBmb3IgaHVtYW4gcGVyY2VwdGlvbiBhcmUgZGVzY3JpYmVkCisgICAgKiBiZWxvdyAodGhlIHNldHRpbmcgZm9yIG1heHBjMTYpLCBob3dldmVyIGZvciA4IGJpdCBlbmNvZGluZ3MgaXQgaXNuJ3QKKyAgICAqIHBvc3NpYmxlIHRvIG1lZXQgdGhlIGFjY2VwdGVkIGNhcGFiaWxpdGllcyBvZiBodW1hbiB2aXNpb24gLSBpLmUuIDggYml0CisgICAgKiBpbWFnZXMgY2FuIG5ldmVyIGJlIGdvb2QgZW5vdWdoLCByZWdhcmRsZXNzIG9mIGVuY29kaW5nLgorICAgICovCisgICBwbS5tYXhvdXQ4ID0gLjE7ICAgICAvKiBBcml0aG1ldGljIGVycm9yIGluICplbmNvZGVkKiB2YWx1ZSAqLworICAgcG0ubWF4YWJzOCA9IC4wMDAwNTsgLyogMS8yMDAwMCAqLworICAgcG0ubWF4Y2FsYzggPSAxLi8yNTU7ICAvKiArLy0xIGluIDggYml0cyBmb3IgY29tcG9zZSBlcnJvcnMgKi8KKyAgIHBtLm1heHBjOCA9IC40OTk7ICAgIC8qIEkuZS4sIC40OTklIGZyYWN0aW9uYWwgZXJyb3IgKi8KKyAgIHBtLm1heG91dDE2ID0gLjQ5OTsgIC8qIEVycm9yIGluICplbmNvZGVkKiB2YWx1ZSAqLworICAgcG0ubWF4YWJzMTYgPSAuMDAwMDU7LyogMS8yMDAwMCAqLworICAgcG0ubWF4Y2FsYzE2ID0xLi82NTUzNTsvKiArLy0xIGluIDE2IGJpdHMgZm9yIGNvbXBvc2UgZXJyb3JzICovCisjICBpZiBQTkdfTElCUE5HX1ZFUiA8IDEwNzAwCisgICAgICBwbS5tYXhjYWxjRyA9IDEuLygoMTw8UE5HX01BWF9HQU1NQV84KS0xKTsKKyMgIGVsc2UKKyAgICAgIHBtLm1heGNhbGNHID0gMS4vKCgxPDwxNiktMSk7CisjICBlbmRpZgorCisgICAvKiBOT1RFOiB0aGlzIGlzIGEgcmVhc29uYWJsZSBwZXJjZXB0dWFsIGxpbWl0LiBXZSBhc3N1bWUgdGhhdCBodW1hbnMgY2FuCisgICAgKiBwZXJjZWl2ZSBsaWdodCBsZXZlbCBkaWZmZXJlbmNlcyBvZiAxJSBvdmVyIGEgMTAwOjEgcmFuZ2UsIHNvIHdlIG5lZWQgdG8KKyAgICAqIG1haW50YWluIDEgaW4gMTAwMDAgYWNjdXJhY3kgKGluIGxpbmVhciBsaWdodCBzcGFjZSksIHdoaWNoIGlzIHdoYXQgdGhlCisgICAgKiBmb2xsb3dpbmcgZ3VhcmFudGVlcy4gIEl0IGFsc28gYWxsb3dzIHNpZ25pZmljYW50bHkgaGlnaGVyIGVycm9ycyBhdAorICAgICogaGlnaGVyIDE2IGJpdCB2YWx1ZXMsIHdoaWNoIGlzIGltcG9ydGFudCBmb3IgcGVyZm9ybWFuY2UuICBUaGUgYWN0dWFsCisgICAgKiBtYXhpbXVtIDE2IGJpdCBlcnJvciBpcyBhYm91dCArLy0xLjkgaW4gdGhlIGZpeGVkIHBvaW50IGltcGxlbWVudGF0aW9uIGJ1dAorICAgICogdGhpcyBpcyBvbmx5IGFsbG93ZWQgZm9yIHZhbHVlcyA+MzgxNDkgYnkgdGhlIGZvbGxvd2luZzoKKyAgICAqLworICAgcG0ubWF4cGMxNiA9IC4wMDU7ICAgLyogSS5lLiwgMS8yMDAlIC0gMS8yMDAwMCAqLworCisgICAvKiBOb3cgcGFyc2UgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLiAqLworICAgd2hpbGUgKC0tYXJnYyA+PSAxKQorICAgeworICAgICAgaW50IGNhdG1vcmUgPSAwOyAvKiBTZXQgaWYgdGhlIGFyZ3VtZW50IGhhcyBhbiBhcmd1bWVudC4gKi8KKworICAgICAgLyogUmVjb3JkIGVhY2ggYXJndW1lbnQgZm9yIHBvc3Rlcml0eTogKi8KKyAgICAgIGNwID0gc2FmZWNhdChjb21tYW5kLCBzaXplb2YgY29tbWFuZCwgY3AsICIgIik7CisgICAgICBjcCA9IHNhZmVjYXQoY29tbWFuZCwgc2l6ZW9mIGNvbW1hbmQsIGNwLCAqKythcmd2KTsKKworICAgICAgaWYgKHN0cmNtcCgqYXJndiwgIi12IikgPT0gMCkKKyAgICAgICAgIHBtLnRoaXMudmVyYm9zZSA9IDE7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1sIikgPT0gMCkKKyAgICAgICAgIHBtLmxvZyA9IDE7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1xIikgPT0gMCkKKyAgICAgICAgIHN1bW1hcnkgPSBwbS50aGlzLnZlcmJvc2UgPSBwbS5sb2cgPSAwOworCisgICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItdyIpID09IDAgfHwKKyAgICAgICAgICAgICAgIHN0cmNtcCgqYXJndiwgIi0tc3RyaWN0IikgPT0gMCkKKyAgICAgICAgIHBtLnRoaXMudHJlYXRfd2FybmluZ3NfYXNfZXJyb3JzID0gMDsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1zcGVlZCIpID09IDApCisgICAgICAgICBwbS50aGlzLnNwZWVkID0gMSwgcG0ubmdhbW1hX3Rlc3RzID0gcG0ubmdhbW1hcywgcG0udGVzdF9zdGFuZGFyZCA9IDAsCisgICAgICAgICAgICBzdW1tYXJ5ID0gMDsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1tZW1vcnkiKSA9PSAwKQorICAgICAgICAgbWVtc3RhdHMgPSAxOworCisgICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItLXNpemUiKSA9PSAwKQorICAgICAgICAgcG0udGVzdF9zaXplID0gMTsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1ub3NpemUiKSA9PSAwKQorICAgICAgICAgcG0udGVzdF9zaXplID0gMDsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1zdGFuZGFyZCIpID09IDApCisgICAgICAgICBwbS50ZXN0X3N0YW5kYXJkID0gMTsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1ub3N0YW5kYXJkIikgPT0gMCkKKyAgICAgICAgIHBtLnRlc3Rfc3RhbmRhcmQgPSAwOworCisgICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItLXRyYW5zZm9ybSIpID09IDApCisgICAgICAgICBwbS50ZXN0X3RyYW5zZm9ybSA9IDE7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tbm90cmFuc2Zvcm0iKSA9PSAwKQorICAgICAgICAgcG0udGVzdF90cmFuc2Zvcm0gPSAwOworCisjaWZkZWYgUE5HX1JFQURfVFJBTlNGT1JNU19TVVBQT1JURUQKKyAgICAgIGVsc2UgaWYgKHN0cm5jbXAoKmFyZ3YsICItLXRyYW5zZm9ybS1kaXNhYmxlPSIsCisgICAgICAgICBzaXplb2YgIi0tdHJhbnNmb3JtLWRpc2FibGUiKSA9PSAwKQorICAgICAgICAgeworICAgICAgICAgcG0udGVzdF90cmFuc2Zvcm0gPSAxOworICAgICAgICAgdHJhbnNmb3JtX2Rpc2FibGUoKmFyZ3YgKyBzaXplb2YgIi0tdHJhbnNmb3JtLWRpc2FibGUiKTsKKyAgICAgICAgIH0KKworICAgICAgZWxzZSBpZiAoc3RybmNtcCgqYXJndiwgIi0tdHJhbnNmb3JtLWVuYWJsZT0iLAorICAgICAgICAgc2l6ZW9mICItLXRyYW5zZm9ybS1lbmFibGUiKSA9PSAwKQorICAgICAgICAgeworICAgICAgICAgcG0udGVzdF90cmFuc2Zvcm0gPSAxOworICAgICAgICAgdHJhbnNmb3JtX2VuYWJsZSgqYXJndiArIHNpemVvZiAiLS10cmFuc2Zvcm0tZW5hYmxlIik7CisgICAgICAgICB9CisjZW5kaWYgLyogUE5HX1JFQURfVFJBTlNGT1JNU19TVVBQT1JURUQgKi8KKworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1nYW1tYSIpID09IDApCisgICAgICAgICB7CisgICAgICAgICAvKiBKdXN0IGRvIHR3byBnYW1tYSB0ZXN0cyBoZXJlICgyLjIgYW5kIGxpbmVhcikgZm9yIHNwZWVkOiAqLworICAgICAgICAgcG0ubmdhbW1hX3Rlc3RzID0gMlU7CisgICAgICAgICBwbS50ZXN0X2dhbW1hX3RocmVzaG9sZCA9IDE7CisgICAgICAgICBwbS50ZXN0X2dhbW1hX3RyYW5zZm9ybSA9IDE7CisgICAgICAgICBwbS50ZXN0X2dhbW1hX3NiaXQgPSAxOworICAgICAgICAgcG0udGVzdF9nYW1tYV9zY2FsZTE2ID0gMTsKKyAgICAgICAgIHBtLnRlc3RfZ2FtbWFfYmFja2dyb3VuZCA9IDE7IC8qIGNvbXBvc2l0aW9uICovCisgICAgICAgICBwbS50ZXN0X2dhbW1hX2FscGhhX21vZGUgPSAxOworICAgICAgICAgfQorCisgICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItLW5vZ2FtbWEiKSA9PSAwKQorICAgICAgICAgcG0ubmdhbW1hX3Rlc3RzID0gMDsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1nYW1tYS10aHJlc2hvbGQiKSA9PSAwKQorICAgICAgICAgcG0ubmdhbW1hX3Rlc3RzID0gMlUsIHBtLnRlc3RfZ2FtbWFfdGhyZXNob2xkID0gMTsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1ub2dhbW1hLXRocmVzaG9sZCIpID09IDApCisgICAgICAgICBwbS50ZXN0X2dhbW1hX3RocmVzaG9sZCA9IDA7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tZ2FtbWEtdHJhbnNmb3JtIikgPT0gMCkKKyAgICAgICAgIHBtLm5nYW1tYV90ZXN0cyA9IDJVLCBwbS50ZXN0X2dhbW1hX3RyYW5zZm9ybSA9IDE7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tbm9nYW1tYS10cmFuc2Zvcm0iKSA9PSAwKQorICAgICAgICAgcG0udGVzdF9nYW1tYV90cmFuc2Zvcm0gPSAwOworCisgICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItLWdhbW1hLXNiaXQiKSA9PSAwKQorICAgICAgICAgcG0ubmdhbW1hX3Rlc3RzID0gMlUsIHBtLnRlc3RfZ2FtbWFfc2JpdCA9IDE7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tbm9nYW1tYS1zYml0IikgPT0gMCkKKyAgICAgICAgIHBtLnRlc3RfZ2FtbWFfc2JpdCA9IDA7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tZ2FtbWEtMTYtdG8tOCIpID09IDApCisgICAgICAgICBwbS5uZ2FtbWFfdGVzdHMgPSAyVSwgcG0udGVzdF9nYW1tYV9zY2FsZTE2ID0gMTsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1ub2dhbW1hLTE2LXRvLTgiKSA9PSAwKQorICAgICAgICAgcG0udGVzdF9nYW1tYV9zY2FsZTE2ID0gMDsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1nYW1tYS1iYWNrZ3JvdW5kIikgPT0gMCkKKyAgICAgICAgIHBtLm5nYW1tYV90ZXN0cyA9IDJVLCBwbS50ZXN0X2dhbW1hX2JhY2tncm91bmQgPSAxOworCisgICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItLW5vZ2FtbWEtYmFja2dyb3VuZCIpID09IDApCisgICAgICAgICBwbS50ZXN0X2dhbW1hX2JhY2tncm91bmQgPSAwOworCisgICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItLWdhbW1hLWFscGhhLW1vZGUiKSA9PSAwKQorICAgICAgICAgcG0ubmdhbW1hX3Rlc3RzID0gMlUsIHBtLnRlc3RfZ2FtbWFfYWxwaGFfbW9kZSA9IDE7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tbm9nYW1tYS1hbHBoYS1tb2RlIikgPT0gMCkKKyAgICAgICAgIHBtLnRlc3RfZ2FtbWFfYWxwaGFfbW9kZSA9IDA7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tZXhwYW5kMTYiKSA9PSAwKQorICAgICAgICAgcG0udGVzdF9nYW1tYV9leHBhbmQxNiA9IDE7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tbm9leHBhbmQxNiIpID09IDApCisgICAgICAgICBwbS50ZXN0X2dhbW1hX2V4cGFuZDE2ID0gMDsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1sb3ctZGVwdGgtZ3JheSIpID09IDApCisgICAgICAgICBwbS50ZXN0X2xiZyA9IHBtLnRlc3RfbGJnX2dhbW1hX3RocmVzaG9sZCA9CisgICAgICAgICAgICBwbS50ZXN0X2xiZ19nYW1tYV90cmFuc2Zvcm0gPSBwbS50ZXN0X2xiZ19nYW1tYV9zYml0ID0KKyAgICAgICAgICAgIHBtLnRlc3RfbGJnX2dhbW1hX2NvbXBvc2l0aW9uID0gMTsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1ub2xvdy1kZXB0aC1ncmF5IikgPT0gMCkKKyAgICAgICAgIHBtLnRlc3RfbGJnID0gcG0udGVzdF9sYmdfZ2FtbWFfdGhyZXNob2xkID0KKyAgICAgICAgICAgIHBtLnRlc3RfbGJnX2dhbW1hX3RyYW5zZm9ybSA9IHBtLnRlc3RfbGJnX2dhbW1hX3NiaXQgPQorICAgICAgICAgICAgcG0udGVzdF9sYmdfZ2FtbWFfY29tcG9zaXRpb24gPSAwOworCisjICAgICBpZmRlZiBQTkdfV1JJVEVfdFJOU19TVVBQT1JURUQKKyAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tdFJOUyIpID09IDApCisgICAgICAgICAgICBwbS50ZXN0X3RSTlMgPSAxOworIyAgICAgZW5kaWYKKworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1ub3RSTlMiKSA9PSAwKQorICAgICAgICAgcG0udGVzdF90Uk5TID0gMDsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1tb3JlLWdhbW1hcyIpID09IDApCisgICAgICAgICBwbS5uZ2FtbWFfdGVzdHMgPSAzVTsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1hbGwtZ2FtbWFzIikgPT0gMCkKKyAgICAgICAgIHBtLm5nYW1tYV90ZXN0cyA9IHBtLm5nYW1tYXM7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tcHJvZ3Jlc3NpdmUtcmVhZCIpID09IDApCisgICAgICAgICBwbS50aGlzLnByb2dyZXNzaXZlID0gMTsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS11c2UtdXBkYXRlLWluZm8iKSA9PSAwKQorICAgICAgICAgKytwbS51c2VfdXBkYXRlX2luZm87IC8qIENhbiBjYWxsIG11bHRpcGxlIHRpbWVzICovCisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0taW50ZXJsYWNlIikgPT0gMCkKKyAgICAgIHsKKyMgICAgICAgIGlmIENBTl9XUklURV9JTlRFUkxBQ0UKKyAgICAgICAgICAgIHBtLmludGVybGFjZV90eXBlID0gUE5HX0lOVEVSTEFDRV9BREFNNzsKKyMgICAgICAgIGVsc2UgLyogIUNBTl9XUklURV9JTlRFUkxBQ0UgKi8KKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicG5ndmFsaWQ6IG5vIHdyaXRlIGludGVybGFjZSBzdXBwb3J0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBTS0lQOworIyAgICAgICAgZW5kaWYgLyogIUNBTl9XUklURV9JTlRFUkxBQ0UgKi8KKyAgICAgIH0KKworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS11c2UtaW5wdXQtcHJlY2lzaW9uIikgPT0gMCkKKyAgICAgICAgIHBtLnVzZV9pbnB1dF9wcmVjaXNpb24gPSAxVTsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS11c2UtY2FsY3VsYXRpb24tcHJlY2lzaW9uIikgPT0gMCkKKyAgICAgICAgIHBtLnVzZV9pbnB1dF9wcmVjaXNpb24gPSAwOworCisgICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItLWNhbGN1bGF0aW9ucy11c2UtaW5wdXQtcHJlY2lzaW9uIikgPT0gMCkKKyAgICAgICAgIHBtLmNhbGN1bGF0aW9uc191c2VfaW5wdXRfcHJlY2lzaW9uID0gMVU7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tYXNzdW1lLTE2LWJpdC1jYWxjdWxhdGlvbnMiKSA9PSAwKQorICAgICAgICAgcG0uYXNzdW1lXzE2X2JpdF9jYWxjdWxhdGlvbnMgPSAxVTsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1jYWxjdWxhdGlvbnMtZm9sbG93LWJpdC1kZXB0aCIpID09IDApCisgICAgICAgICBwbS5jYWxjdWxhdGlvbnNfdXNlX2lucHV0X3ByZWNpc2lvbiA9CisgICAgICAgICAgICBwbS5hc3N1bWVfMTZfYml0X2NhbGN1bGF0aW9ucyA9IDA7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tZXhoYXVzdGl2ZSIpID09IDApCisgICAgICAgICBwbS50ZXN0X2V4aGF1c3RpdmUgPSAxOworCisgICAgICBlbHNlIGlmIChhcmdjID4gMSAmJiBzdHJjbXAoKmFyZ3YsICItLXNiaXRsb3ciKSA9PSAwKQorICAgICAgICAgLS1hcmdjLCBwbS5zYml0bG93ID0gKHBuZ19ieXRlKWF0b2koKisrYXJndiksIGNhdG1vcmUgPSAxOworCisgICAgICBlbHNlIGlmIChhcmdjID4gMSAmJiBzdHJjbXAoKmFyZ3YsICItLXRvdWNoIikgPT0gMCkKKyAgICAgICAgIC0tYXJnYywgdG91Y2ggPSAqKythcmd2LCBjYXRtb3JlID0gMTsKKworICAgICAgZWxzZSBpZiAoYXJnYyA+IDEgJiYgc3RybmNtcCgqYXJndiwgIi0tbWF4IiwgNSkgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgIC0tYXJnYzsKKworICAgICAgICAgaWYgKHN0cmNtcCg1Kyphcmd2LCAiYWJzOCIpID09IDApCisgICAgICAgICAgICBwbS5tYXhhYnM4ID0gYXRvZigqKythcmd2KTsKKworICAgICAgICAgZWxzZSBpZiAoc3RyY21wKDUrKmFyZ3YsICJhYnMxNiIpID09IDApCisgICAgICAgICAgICBwbS5tYXhhYnMxNiA9IGF0b2YoKisrYXJndik7CisKKyAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCg1Kyphcmd2LCAiY2FsYzgiKSA9PSAwKQorICAgICAgICAgICAgcG0ubWF4Y2FsYzggPSBhdG9mKCorK2FyZ3YpOworCisgICAgICAgICBlbHNlIGlmIChzdHJjbXAoNSsqYXJndiwgImNhbGMxNiIpID09IDApCisgICAgICAgICAgICBwbS5tYXhjYWxjMTYgPSBhdG9mKCorK2FyZ3YpOworCisgICAgICAgICBlbHNlIGlmIChzdHJjbXAoNSsqYXJndiwgIm91dDgiKSA9PSAwKQorICAgICAgICAgICAgcG0ubWF4b3V0OCA9IGF0b2YoKisrYXJndik7CisKKyAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCg1Kyphcmd2LCAib3V0MTYiKSA9PSAwKQorICAgICAgICAgICAgcG0ubWF4b3V0MTYgPSBhdG9mKCorK2FyZ3YpOworCisgICAgICAgICBlbHNlIGlmIChzdHJjbXAoNSsqYXJndiwgInBjOCIpID09IDApCisgICAgICAgICAgICBwbS5tYXhwYzggPSBhdG9mKCorK2FyZ3YpOworCisgICAgICAgICBlbHNlIGlmIChzdHJjbXAoNSsqYXJndiwgInBjMTYiKSA9PSAwKQorICAgICAgICAgICAgcG0ubWF4cGMxNiA9IGF0b2YoKisrYXJndik7CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicG5ndmFsaWQ6ICVzOiB1bmtub3duICdtYXgnIG9wdGlvblxuIiwgKmFyZ3YpOworICAgICAgICAgICAgZXhpdCg5OSk7CisgICAgICAgICB9CisKKyAgICAgICAgIGNhdG1vcmUgPSAxOworICAgICAgfQorCisgICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItLWxvZzgiKSA9PSAwKQorICAgICAgICAgLS1hcmdjLCBwbS5sb2c4ID0gYXRvZigqKythcmd2KSwgY2F0bW9yZSA9IDE7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tbG9nMTYiKSA9PSAwKQorICAgICAgICAgLS1hcmdjLCBwbS5sb2cxNiA9IGF0b2YoKisrYXJndiksIGNhdG1vcmUgPSAxOworCisjaWZkZWYgUE5HX1NFVF9PUFRJT05fU1VQUE9SVEVECisgICAgICBlbHNlIGlmIChzdHJuY21wKCphcmd2LCAiLS1vcHRpb249IiwgOSkgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgIC8qIFN5bnRheCBvZiB0aGUgYXJndW1lbnQgaXMgPG9wdGlvbj46e29ufG9mZn0gKi8KKyAgICAgICAgIGNvbnN0IGNoYXIgKmFyZyA9IDkrKmFyZ3Y7CisgICAgICAgICB1bnNpZ25lZCBjaGFyIG9wdGlvbj0wLCBzZXR0aW5nPTA7CisKKyNpZmRlZiBQTkdfQVJNX05FT04KKyAgICAgICAgIGlmIChzdHJuY21wKGFyZywgImFybS1uZW9uOiIsIDkpID09IDApCisgICAgICAgICAgICBvcHRpb24gPSBQTkdfQVJNX05FT04sIGFyZyArPSA5OworCisgICAgICAgICBlbHNlCisjZW5kaWYKKyNpZmRlZiBQTkdfRVhURU5TSU9OUworICAgICAgICAgaWYgKHN0cm5jbXAoYXJnLCAiZXh0ZW5zaW9uczoiLCAxMSkgPT0gMCkKKyAgICAgICAgICAgIG9wdGlvbiA9IFBOR19FWFRFTlNJT05TLCBhcmcgKz0gMTE7CisKKyAgICAgICAgIGVsc2UKKyNlbmRpZgorI2lmZGVmIFBOR19NQVhJTVVNX0lORkxBVEVfV0lORE9XCisgICAgICAgICBpZiAoc3RybmNtcChhcmcsICJtYXgtaW5mbGF0ZS13aW5kb3c6IiwgMTkpID09IDApCisgICAgICAgICAgICBvcHRpb24gPSBQTkdfTUFYSU1VTV9JTkZMQVRFX1dJTkRPVywgYXJnICs9IDE5OworCisgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicG5ndmFsaWQ6ICVzOiAlczogdW5rbm93biBvcHRpb25cbiIsICphcmd2LCBhcmcpOworICAgICAgICAgICAgZXhpdCg5OSk7CisgICAgICAgICB9CisKKyAgICAgICAgIGlmIChzdHJjbXAoYXJnLCAib2ZmIikgPT0gMCkKKyAgICAgICAgICAgIHNldHRpbmcgPSBQTkdfT1BUSU9OX09GRjsKKworICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIm9uIikgPT0gMCkKKyAgICAgICAgICAgIHNldHRpbmcgPSBQTkdfT1BUSU9OX09OOworCisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICJwbmd2YWxpZDogJXM6ICVzOiB1bmtub3duIHNldHRpbmcgKHVzZSAnb24nIG9yICdvZmYnKVxuIiwKKyAgICAgICAgICAgICAgICphcmd2LCBhcmcpOworICAgICAgICAgICAgZXhpdCg5OSk7CisgICAgICAgICB9CisKKyAgICAgICAgIHBtLnRoaXMub3B0aW9uc1twbS50aGlzLm5vcHRpb25zXS5vcHRpb24gPSBvcHRpb247CisgICAgICAgICBwbS50aGlzLm9wdGlvbnNbcG0udGhpcy5ub3B0aW9ucysrXS5zZXR0aW5nID0gc2V0dGluZzsKKyAgICAgIH0KKyNlbmRpZiAvKiBQTkdfU0VUX09QVElPTl9TVVBQT1JURUQgKi8KKworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgZnByaW50ZihzdGRlcnIsICJwbmd2YWxpZDogJXM6IHVua25vd24gYXJndW1lbnRcbiIsICphcmd2KTsKKyAgICAgICAgIGV4aXQoOTkpOworICAgICAgfQorCisgICAgICBpZiAoY2F0bW9yZSkgLyogY29uc3VtZWQgYW4gZXh0cmEgKmFyZ3YgKi8KKyAgICAgIHsKKyAgICAgICAgIGNwID0gc2FmZWNhdChjb21tYW5kLCBzaXplb2YgY29tbWFuZCwgY3AsICIgIik7CisgICAgICAgICBjcCA9IHNhZmVjYXQoY29tbWFuZCwgc2l6ZW9mIGNvbW1hbmQsIGNwLCAqYXJndik7CisgICAgICB9CisgICB9CisKKyAgIC8qIElmIHBuZ3ZhbGlkIGlzIHJ1biB3aXRoIG5vIGFyZ3VtZW50cyBkZWZhdWx0IHRvIGEgcmVhc29uYWJsZSBzZXQgb2YgdGhlCisgICAgKiB0ZXN0cy4KKyAgICAqLworICAgaWYgKHBtLnRlc3Rfc3RhbmRhcmQgPT0gMCAmJiBwbS50ZXN0X3NpemUgPT0gMCAmJiBwbS50ZXN0X3RyYW5zZm9ybSA9PSAwICYmCisgICAgICBwbS5uZ2FtbWFfdGVzdHMgPT0gMCkKKyAgIHsKKyAgICAgIC8qIE1ha2UgdGhpcyBkbyBhbGwgdGhlIHRlc3RzIGRvbmUgaW4gdGhlIHRlc3Qgc2hlbGwgc2NyaXB0cyB3aXRoIHRoZSBzYW1lCisgICAgICAgKiBwYXJhbWV0ZXJzLCB3aGVyZSBwb3NzaWJsZS4gIFRoZSBsaW1pdGF0aW9uIGlzIHRoYXQgYWxsIHRoZSBwcm9ncmVzc2l2ZQorICAgICAgICogcmVhZCBhbmQgaW50ZXJsYWNlIHN0dWZmIGhhcyB0byBiZSBkb25lIGluIHNlcGFyYXRlIHJ1bnMsIHNvIG9ubHkgdGhlCisgICAgICAgKiBiYXNpYyAnc3RhbmRhcmQnIGFuZCAnc2l6ZScgdGVzdHMgYXJlIGRvbmUuCisgICAgICAgKi8KKyAgICAgIHBtLnRlc3Rfc3RhbmRhcmQgPSAxOworICAgICAgcG0udGVzdF9zaXplID0gMTsKKyAgICAgIHBtLnRlc3RfdHJhbnNmb3JtID0gMTsKKyAgICAgIHBtLm5nYW1tYV90ZXN0cyA9IDJVOworICAgfQorCisgICBpZiAocG0ubmdhbW1hX3Rlc3RzID4gMCAmJgorICAgICAgcG0udGVzdF9nYW1tYV90aHJlc2hvbGQgPT0gMCAmJiBwbS50ZXN0X2dhbW1hX3RyYW5zZm9ybSA9PSAwICYmCisgICAgICBwbS50ZXN0X2dhbW1hX3NiaXQgPT0gMCAmJiBwbS50ZXN0X2dhbW1hX3NjYWxlMTYgPT0gMCAmJgorICAgICAgcG0udGVzdF9nYW1tYV9iYWNrZ3JvdW5kID09IDAgJiYgcG0udGVzdF9nYW1tYV9hbHBoYV9tb2RlID09IDApCisgICB7CisgICAgICBwbS50ZXN0X2dhbW1hX3RocmVzaG9sZCA9IDE7CisgICAgICBwbS50ZXN0X2dhbW1hX3RyYW5zZm9ybSA9IDE7CisgICAgICBwbS50ZXN0X2dhbW1hX3NiaXQgPSAxOworICAgICAgcG0udGVzdF9nYW1tYV9zY2FsZTE2ID0gMTsKKyAgICAgIHBtLnRlc3RfZ2FtbWFfYmFja2dyb3VuZCA9IDE7CisgICAgICBwbS50ZXN0X2dhbW1hX2FscGhhX21vZGUgPSAxOworICAgfQorCisgICBlbHNlIGlmIChwbS5uZ2FtbWFfdGVzdHMgPT0gMCkKKyAgIHsKKyAgICAgIC8qIE5vdGhpbmcgdG8gdGVzdCBzbyB0dXJuIGV2ZXJ5dGhpbmcgb2ZmOiAqLworICAgICAgcG0udGVzdF9nYW1tYV90aHJlc2hvbGQgPSAwOworICAgICAgcG0udGVzdF9nYW1tYV90cmFuc2Zvcm0gPSAwOworICAgICAgcG0udGVzdF9nYW1tYV9zYml0ID0gMDsKKyAgICAgIHBtLnRlc3RfZ2FtbWFfc2NhbGUxNiA9IDA7CisgICAgICBwbS50ZXN0X2dhbW1hX2JhY2tncm91bmQgPSAwOworICAgICAgcG0udGVzdF9nYW1tYV9hbHBoYV9tb2RlID0gMDsKKyAgIH0KKworICAgVHJ5CisgICB7CisgICAgICAvKiBNYWtlIHVzZWZ1bCBiYXNlIGltYWdlcyAqLworICAgICAgbWFrZV90cmFuc2Zvcm1faW1hZ2VzKCZwbSk7CisKKyAgICAgIC8qIFBlcmZvcm0gdGhlIHN0YW5kYXJkIGFuZCBnYW1tYSB0ZXN0cy4gKi8KKyAgICAgIGlmIChwbS50ZXN0X3N0YW5kYXJkKQorICAgICAgeworICAgICAgICAgcGVyZm9ybV9pbnRlcmxhY2VfbWFjcm9fdmFsaWRhdGlvbigpOworICAgICAgICAgcGVyZm9ybV9mb3JtYXR0aW5nX3Rlc3QoJnBtLnRoaXMpOworIyAgICAgICAgaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECisgICAgICAgICAgICBwZXJmb3JtX3N0YW5kYXJkX3Rlc3QoJnBtKTsKKyMgICAgICAgIGVuZGlmCisgICAgICAgICBwZXJmb3JtX2Vycm9yX3Rlc3QoJnBtKTsKKyAgICAgIH0KKworICAgICAgLyogVmFyaW91cyBvZGRseSBzaXplZCBpbWFnZXM6ICovCisgICAgICBpZiAocG0udGVzdF9zaXplKQorICAgICAgeworICAgICAgICAgbWFrZV9zaXplX2ltYWdlcygmcG0udGhpcyk7CisjICAgICAgICBpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKKyAgICAgICAgICAgIHBlcmZvcm1fc2l6ZV90ZXN0KCZwbSk7CisjICAgICAgICBlbmRpZgorICAgICAgfQorCisjaWZkZWYgUE5HX1JFQURfVFJBTlNGT1JNU19TVVBQT1JURUQKKyAgICAgIC8qIENvbWJpbmF0b3JpYWwgdHJhbnNmb3JtczogKi8KKyAgICAgIGlmIChwbS50ZXN0X3RyYW5zZm9ybSkKKyAgICAgICAgIHBlcmZvcm1fdHJhbnNmb3JtX3Rlc3QoJnBtKTsKKyNlbmRpZiAvKiBQTkdfUkVBRF9UUkFOU0ZPUk1TX1NVUFBPUlRFRCAqLworCisjaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECisgICAgICBpZiAocG0ubmdhbW1hX3Rlc3RzID4gMCkKKyAgICAgICAgIHBlcmZvcm1fZ2FtbWFfdGVzdCgmcG0sIHN1bW1hcnkpOworI2VuZGlmCisgICB9CisKKyAgIENhdGNoX2Fub255bW91cworICAgeworICAgICAgZnByaW50ZihzdGRlcnIsICJwbmd2YWxpZDogdGVzdCBhYm9ydGVkIChwcm9iYWJseSBmYWlsZWQgaW4gY2xlYW51cClcbiIpOworICAgICAgaWYgKCFwbS50aGlzLnZlcmJvc2UpCisgICAgICB7CisgICAgICAgICBpZiAocG0udGhpcy5lcnJvclswXSAhPSAwKQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJwbmd2YWxpZDogZmlyc3QgZXJyb3I6ICVzXG4iLCBwbS50aGlzLmVycm9yKTsKKworICAgICAgICAgZnByaW50ZihzdGRlcnIsICJwbmd2YWxpZDogcnVuIHdpdGggLXYgdG8gc2VlIHdoYXQgaGFwcGVuZWRcbiIpOworICAgICAgfQorICAgICAgZXhpdCgxKTsKKyAgIH0KKworICAgaWYgKHN1bW1hcnkpCisgICB7CisgICAgICBwcmludGYoIiVzOiAlcyAoJXMgcG9pbnQgYXJpdGhtZXRpYylcbiIsCisgICAgICAgICAocG0udGhpcy5uZXJyb3JzIHx8IChwbS50aGlzLnRyZWF0X3dhcm5pbmdzX2FzX2Vycm9ycyAmJgorICAgICAgICAgICAgcG0udGhpcy5ud2FybmluZ3MpKSA/ICJGQUlMIiA6ICJQQVNTIiwKKyAgICAgICAgIGNvbW1hbmQsCisjaWYgZGVmaW5lZChQTkdfRkxPQVRJTkdfQVJJVEhNRVRJQ19TVVBQT1JURUQpIHx8IFBOR19MSUJQTkdfVkVSIDwgMTA1MDAKKyAgICAgICAgICJmbG9hdGluZyIKKyNlbHNlCisgICAgICAgICAiZml4ZWQiCisjZW5kaWYKKyAgICAgICAgICk7CisgICB9CisKKyAgIGlmIChtZW1zdGF0cykKKyAgIHsKKyAgICAgIHByaW50ZigiQWxsb2NhdGVkIG1lbW9yeSBzdGF0aXN0aWNzIChpbiBieXRlcyk6XG4iCisgICAgICAgICAiXHRyZWFkICAlbHUgbWF4aW11bSBzaW5nbGUsICVsdSBwZWFrLCAlbHUgdG90YWxcbiIKKyAgICAgICAgICJcdHdyaXRlICVsdSBtYXhpbXVtIHNpbmdsZSwgJWx1IHBlYWssICVsdSB0b3RhbFxuIiwKKyAgICAgICAgICh1bnNpZ25lZCBsb25nKXBtLnRoaXMucmVhZF9tZW1vcnlfcG9vbC5tYXhfbWF4LAorICAgICAgICAgKHVuc2lnbmVkIGxvbmcpcG0udGhpcy5yZWFkX21lbW9yeV9wb29sLm1heF9saW1pdCwKKyAgICAgICAgICh1bnNpZ25lZCBsb25nKXBtLnRoaXMucmVhZF9tZW1vcnlfcG9vbC5tYXhfdG90YWwsCisgICAgICAgICAodW5zaWduZWQgbG9uZylwbS50aGlzLndyaXRlX21lbW9yeV9wb29sLm1heF9tYXgsCisgICAgICAgICAodW5zaWduZWQgbG9uZylwbS50aGlzLndyaXRlX21lbW9yeV9wb29sLm1heF9saW1pdCwKKyAgICAgICAgICh1bnNpZ25lZCBsb25nKXBtLnRoaXMud3JpdGVfbWVtb3J5X3Bvb2wubWF4X3RvdGFsKTsKKyAgIH0KKworICAgLyogRG8gdGhpcyBoZXJlIHRvIHByb3Zva2UgbWVtb3J5IGNvcnJ1cHRpb24gZXJyb3JzIGluIG1lbW9yeSBub3QgZGlyZWN0bHkKKyAgICAqIGFsbG9jYXRlZCBieSBsaWJwbmcgLSBub3QgYSBjb21wbGV0ZSB0ZXN0LCBidXQgYmV0dGVyIHRoYW4gbm90aGluZy4KKyAgICAqLworICAgc3RvcmVfZGVsZXRlKCZwbS50aGlzKTsKKworICAgLyogRXJyb3IgZXhpdCBpZiB0aGVyZSBhcmUgYW55IGVycm9ycywgYW5kIG1heWJlIGlmIHRoZXJlIGFyZSBhbnkKKyAgICAqIHdhcm5pbmdzLgorICAgICovCisgICBpZiAocG0udGhpcy5uZXJyb3JzIHx8IChwbS50aGlzLnRyZWF0X3dhcm5pbmdzX2FzX2Vycm9ycyAmJgorICAgICAgIHBtLnRoaXMubndhcm5pbmdzKSkKKyAgIHsKKyAgICAgIGlmICghcG0udGhpcy52ZXJib3NlKQorICAgICAgICAgZnByaW50ZihzdGRlcnIsICJwbmd2YWxpZDogJXNcbiIsIHBtLnRoaXMuZXJyb3IpOworCisgICAgICBmcHJpbnRmKHN0ZGVyciwgInBuZ3ZhbGlkOiAlZCBlcnJvcnMsICVkIHdhcm5pbmdzXG4iLCBwbS50aGlzLm5lcnJvcnMsCisgICAgICAgICAgcG0udGhpcy5ud2FybmluZ3MpOworCisgICAgICBleGl0KDEpOworICAgfQorCisgICAvKiBTdWNjZXNzIGNhc2UuICovCisgICBpZiAodG91Y2ggIT0gTlVMTCkKKyAgIHsKKyAgICAgIEZJTEUgKmZzdWNjZXNzID0gZm9wZW4odG91Y2gsICJ3dCIpOworCisgICAgICBpZiAoZnN1Y2Nlc3MgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIGludCBlcnJvciA9IDA7CisgICAgICAgICBmcHJpbnRmKGZzdWNjZXNzLCAiUE5HIHZhbGlkYXRpb24gc3VjY2VlZGVkXG4iKTsKKyAgICAgICAgIGZmbHVzaChmc3VjY2Vzcyk7CisgICAgICAgICBlcnJvciA9IGZlcnJvcihmc3VjY2Vzcyk7CisKKyAgICAgICAgIGlmIChmY2xvc2UoZnN1Y2Nlc3MpIHx8IGVycm9yKQorICAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogd3JpdGUgZmFpbGVkXG4iLCB0b3VjaCk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBvcGVuIGZhaWxlZFxuIiwgdG91Y2gpOworICAgICAgICAgZXhpdCgxKTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIHNvbWUgdmVyeSBtaW5pbWFsIGNvbmZpZ3VyYXRpb25zIGRvIG5vdCB1c2UgaXQ6CisgICAgKi8KKyAgIFVOVVNFRChmYWlsKQorICAgcmV0dXJuIDA7Cit9CisjZWxzZSAvKiB3cml0ZSBvciBsb3cgbGV2ZWwgQVBJcyBub3Qgc3VwcG9ydGVkICovCitpbnQgbWFpbih2b2lkKQoreworICAgZnByaW50ZihzdGRlcnIsCisgICAgICAicG5ndmFsaWQ6IG5vIGxvdyBsZXZlbCB3cml0ZSBzdXBwb3J0IGluIGxpYnBuZywgYWxsIHRlc3RzIHNraXBwZWRcbiIpOworICAgLyogU28gdGhlIHRlc3QgaXMgc2tpcHBlZDogKi8KKyAgIHJldHVybiBTS0lQOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9saWJ0ZXN0cy9yZWFkcG5nLmMgYi9saWJwbmcvY29udHJpYi9saWJ0ZXN0cy9yZWFkcG5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMzNmQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL2xpYnRlc3RzL3JlYWRwbmcuYwpAQCAtMCwwICsxLDExNSBAQAorLyogcmVhZHBuZy5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEzIEpvaG4gQ3VubmluZ2hhbSBCb3dsZXIKKyAqCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4xIFtNYXJjaCAyOCwgMjAxM10KKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKyAqCisgKiBMb2FkIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgUE5HIGZpbGVzIChmcm9tIHRoZSBjb21tYW5kIGxpbmUsIG9yLCBpZiB0aGVyZQorICogYXJlIG5vIGFyZ3VtZW50cyBvbiB0aGUgY29tbWFuZCBsaW5lLCBmcm9tIHN0ZGluKSB0aGVuIHJ1biBhIHRpbWUgdGVzdCBieQorICogcmVhZGluZyBlYWNoIGZpbGUgYnkgcm93LiAgVGhlIHRlc3QgZG9lcyBub3RoaW5nIHdpdGggdGhlIHJlYWQgcmVzdWx0IGFuZAorICogZG9lcyBubyB0cmFuc2Zvcm1zLiAgVGhlIG9ubHkgb3V0cHV0IGlzIGEgdGltZSBhcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciBvZgorICogc2Vjb25kcyB3aXRoIDkgZGVjaW1hbCBkaWdpdHMuCisgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWYgZGVmaW5lZChIQVZFX0NPTkZJR19IKSAmJiAhZGVmaW5lZChQTkdfTk9fQ09ORklHX0gpCisjICBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisvKiBEZWZpbmUgdGhlIGZvbGxvd2luZyB0byB1c2UgdGhpcyB0ZXN0IGFnYWluc3QgeW91ciBpbnN0YWxsZWQgbGlicG5nLCByYXRoZXIKKyAqIHRoYW4gdGhlIG9uZSBiZWluZyBidWlsdCBoZXJlOgorICovCisjaWZkZWYgUE5HX0ZSRUVTVEFORElOR19URVNUUworIyAgaW5jbHVkZSA8cG5nLmg+CisjZWxzZQorIyAgaW5jbHVkZSAiLi4vLi4vcG5nLmgiCisjZW5kaWYKKworc3RhdGljIGludAorcmVhZF9wbmcoRklMRSAqZnApCit7CisgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsMCwwLDApOworICAgcG5nX2luZm9wIGluZm9fcHRyID0gTlVMTDsKKyAgIHBuZ19ieXRlcCByb3cgPSBOVUxMLCBkaXNwbGF5ID0gTlVMTDsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybiAwOworCisgICBpZiAoc2V0am1wKHBuZ19qbXBidWYocG5nX3B0cikpKQorICAgeworICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7CisgICAgICBpZiAocm93ICE9IE5VTEwpIGZyZWUocm93KTsKKyAgICAgIGlmIChkaXNwbGF5ICE9IE5VTEwpIGZyZWUoZGlzcGxheSk7CisgICAgICByZXR1cm4gMDsKKyAgIH0KKworICAgcG5nX2luaXRfaW8ocG5nX3B0ciwgZnApOworCisgICBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7CisgICBpZiAoaW5mb19wdHIgPT0gTlVMTCkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiT09NIGFsbG9jYXRpbmcgaW5mbyBzdHJ1Y3R1cmUiKTsKKworICAgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKHBuZ19wdHIsIFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTLCBOVUxMLCAwKTsKKworICAgcG5nX3JlYWRfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7CisKKyAgIHsKKyAgICAgIHBuZ19zaXplX3Qgcm93Ynl0ZXMgPSBwbmdfZ2V0X3Jvd2J5dGVzKHBuZ19wdHIsIGluZm9fcHRyKTsKKworICAgICAgLyogRmFpbHVyZSB0byBpbml0aWFsaXplIHRoZXNlIGlzIGhhcm1sZXNzICovCisgICAgICByb3cgPSBtYWxsb2Mocm93Ynl0ZXMpOworICAgICAgZGlzcGxheSA9IG1hbGxvYyhyb3dieXRlcyk7CisKKyAgICAgIGlmIChyb3cgPT0gTlVMTCB8fCBkaXNwbGF5ID09IE5VTEwpCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk9PTSBhbGxvY2F0aW5nIHJvdyBidWZmZXJzIik7CisKKyAgICAgIHsKKyAgICAgICAgIHBuZ191aW50XzMyIGhlaWdodCA9IHBuZ19nZXRfaW1hZ2VfaGVpZ2h0KHBuZ19wdHIsIGluZm9fcHRyKTsKKyMgICAgICAgIGlmZGVmIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAorICAgICAgICAgICAgaW50IHBhc3NlcyA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOworIyAgICAgICAgZWxzZSAvKiAhUkVBRF9JTlRFUkxBQ0lORyAqLworICAgICAgICAgICAgaW50IHBhc3NlcyA9IHBuZ19nZXRfaW50ZXJsYWNlX3R5cGUocG5nX3B0ciwgaW5mb19wdHIpID09CisgICAgICAgICAgICAgICBQTkdfSU5URVJMQUNFX0FEQU03ID8gUE5HX0lOVEVSTEFDRV9BREFNN19QQVNTRVMgOiAxOworIyAgICAgICAgZW5kaWYgLyogIVJFQURfSU5URVJMQUNJTkcgKi8KKyAgICAgICAgIGludCBwYXNzOworCisgICAgICAgICBwbmdfc3RhcnRfcmVhZF9pbWFnZShwbmdfcHRyKTsKKworICAgICAgICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IHBhc3NlczsgKytwYXNzKQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX3VpbnRfMzIgeSA9IGhlaWdodDsKKworIyAgICAgICAgICAgaWZuZGVmIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAorICAgICAgICAgICAgICAgaWYgKHBhc3NlcyA9PSBQTkdfSU5URVJMQUNFX0FEQU03X1BBU1NFUykKKyAgICAgICAgICAgICAgICAgIHkgPSBQTkdfUEFTU19ST1dTKHksIHBhc3MpOworIyAgICAgICAgICAgZW5kaWYgLyogUkVBRF9JTlRFUkxBQ0lORyAqLworCisgICAgICAgICAgICAvKiBOT1RFOiB0aGlzIHRyYXNoZXMgdGhlIHJvdyBlYWNoIHRpbWU7IGludGVybGFjZSBoYW5kbGluZyB3b24ndAorICAgICAgICAgICAgICogd29yaywgYnV0IHRoaXMgYXZvaWRzIG1lbW9yeSB0aHJhc2hpbmcgZm9yIHNwZWVkIHRlc3RpbmcuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHdoaWxlICh5LS0gPiAwKQorICAgICAgICAgICAgICAgcG5nX3JlYWRfcm93KHBuZ19wdHIsIHJvdywgZGlzcGxheSk7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIC8qIE1ha2Ugc3VyZSB0byByZWFkIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGU6ICovCisgICBwbmdfcmVhZF9lbmQocG5nX3B0ciwgaW5mb19wdHIpOworICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7CisgICBmcmVlKHJvdyk7CisgICBmcmVlKGRpc3BsYXkpOworICAgcmV0dXJuIDE7Cit9CisKK2ludAorbWFpbih2b2lkKQoreworICAgLyogRXhpdCBjb2RlIDAgb24gc3VjY2Vzcy4gKi8KKyAgIHJldHVybiAhcmVhZF9wbmcoc3RkaW4pOworfQpkaWZmIC0tZ2l0IGEvbGlicG5nL2NvbnRyaWIvbGlidGVzdHMvdGFyaXRoLmMgYi9saWJwbmcvY29udHJpYi9saWJ0ZXN0cy90YXJpdGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjE3ZmZhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvbGlidGVzdHMvdGFyaXRoLmMKQEAgLTAsMCArMSw5OTkgQEAKKworLyogdGFyaXRoLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMyBKb2huIEN1bm5pbmdoYW0gQm93bGVyCisgKgorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMCBbRmVicnVhcnkgMTQsIDIwMTNdCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCisgKgorICogVGVzdCBpbnRlcm5hbCBhcml0aG1ldGljIGZ1bmN0aW9ucyBvZiBsaWJwbmcuCisgKgorICogVGhpcyBjb2RlIG11c3QgYmUgbGlua2VkIGFnYWluc3QgYSBtYXRoIGxpYnJhcnkgKC1sbSksIGJ1dCBkb2VzIG5vdCByZXF1aXJlCisgKiBsaWJwbmcgb3IgemxpYiB0byB3b3JrLiAgQmVjYXVzZSBpdCBpbmNsdWRlcyB0aGUgY29tcGxldGUgc291cmNlIG9mICdwbmcuYycKKyAqIGl0IHRlc3RzIHRoZSBjb2RlIHdpdGggd2hhdGV2ZXIgY29tcGlsZXIgb3B0aW9ucyBhcmUgdXNlZCB0byBidWlsZCBpdC4KKyAqIENoYW5naW5nIHRoZXNlIG9wdGlvbnMgY2FuIHN1YnN0YW50aWFsbHkgY2hhbmdlIHRoZSBlcnJvcnMgaW4gdGhlCisgKiBjYWxjdWxhdGlvbnMgdGhhdCB0aGUgY29tcGlsZXIgY2hvb3NlcyEKKyAqLworI2RlZmluZSBfUE9TSVhfU09VUkNFIDEKKyNkZWZpbmUgX0lTT0M5OV9TT1VSQ0UgMQorCisvKiBPYnRhaW4gYSBjb3B5IG9mIHRoZSBjb2RlIHRvIGJlIHRlc3RlZCAocGx1cyBvdGhlciB0aGluZ3MpLCBkaXNhYmxpbmcKKyAqIHN0dWZmIHRoYXQgaXMgbm90IHJlcXVpcmVkLgorICovCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICIuLi8uLi9wbmdwcml2LmgiCisKKyNkZWZpbmUgcG5nX2Vycm9yIHBuZ193YXJuaW5nCisKK3ZvaWQgcG5nX3dhcm5pbmcocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBtc2cpCit7CisgICBmcHJpbnRmKHN0ZGVyciwgInZhbGlkYXRpb246ICVzXG4iLCBtc2cpOworfQorCisjZGVmaW5lIHBuZ19maXhlZF9lcnJvciBwbmdfZml4ZWRfd2FybmluZworCit2b2lkIHBuZ19maXhlZF93YXJuaW5nKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgbXNnKQoreworICAgZnByaW50ZihzdGRlcnIsICJvdmVyZmxvdyBpbjogJXNcbiIsIG1zZyk7Cit9CisKKyNkZWZpbmUgcG5nX3NldF9lcnJvcl9mbihwcCwgZXAsIGVmcCwgd2ZwKSAoKHZvaWQpMCkKKyNkZWZpbmUgcG5nX21hbGxvYyhwcCwgcykgbWFsbG9jKHMpCisjZGVmaW5lIHBuZ19tYWxsb2Nfd2FybihwcCwgcykgbWFsbG9jKHMpCisjZGVmaW5lIHBuZ19tYWxsb2NfYmFzZShwcCwgcykgbWFsbG9jKHMpCisjZGVmaW5lIHBuZ19jYWxsb2MocHAsIHMpIGNhbGxvYygxLCAocykpCisjZGVmaW5lIHBuZ19mcmVlKHBwLCBzKSBmcmVlKHMpCisKKyNkZWZpbmUgcG5nX3NhZmVjYXQoYiwgc2IsIHBvcywgc3RyKSAocG9zKQorI2RlZmluZSBwbmdfZm9ybWF0X251bWJlcihzdGFydCwgZW5kLCBmb3JtYXQsIG51bWJlcikgKHN0YXJ0KQorCisjZGVmaW5lIGNyYzMyKGNyYywgcHAsIHMpIChjcmMpCisjZGVmaW5lIGluZmxhdGVSZXNldCh6cykgWl9PSworCisjZGVmaW5lIHBuZ19jcmVhdGVfc3RydWN0KHR5cGUpICgwKQorI2RlZmluZSBwbmdfZGVzdHJveV9zdHJ1Y3QocHApICgodm9pZCkwKQorI2RlZmluZSBwbmdfY3JlYXRlX3N0cnVjdF8yKHR5cGUsIG0sIG1tKSAoMCkKKyNkZWZpbmUgcG5nX2Rlc3Ryb3lfc3RydWN0XzIocHAsIGYsIG1tKSAoKHZvaWQpMCkKKworI3VuZGVmIFBOR19TSU1QTElGSUVEX1JFQURfU1VQUE9SVEVECisjdW5kZWYgUE5HX1NJTVBMSUZJRURfV1JJVEVfU1VQUE9SVEVECisjdW5kZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAorCisjaW5jbHVkZSAiLi4vLi4vcG5nLmMiCisKKy8qIFZhbGlkYXRlIEFTQ0lJIHRvIGZwIHJvdXRpbmVzLiAqLworc3RhdGljIGludCB2ZXJib3NlID0gMDsKKworaW50IHZhbGlkYXRpb25fYXNjaWlfdG9fZnAoaW50IGNvdW50LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICBpbnQgICAgc2hvd2FsbCA9IDA7CisgICBkb3VibGUgbWF4X2Vycm9yPTI7ICAgICAgLyogQXMgYSBwZXJjZW50YWdlIGVycm9yLWluLWxhc3QtZGlnaXQvLjUgKi8KKyAgIGRvdWJsZSBtYXhfZXJyb3JfYWJzPTE3OyAvKiBVc2VkIHdoZW4gcHJlY2lzaW9uIGlzIERCTF9ESUcgKi8KKyAgIGRvdWJsZSBtYXggPSAwOworICAgZG91YmxlIG1heF9hYnMgPSAwOworICAgZG91YmxlIHRlc3QgPSAwOyAvKiBJbXBvcnRhbnQgdG8gdGVzdCB0aGlzLiAqLworICAgaW50ICAgIHByZWNpc2lvbiA9IDU7CisgICBpbnQgICAgbm9uZmluaXRlID0gMDsKKyAgIGludCAgICBmaW5pdGUgPSAwOworICAgaW50ICAgIG9rID0gMDsKKyAgIGludCAgICBmYWlsY291bnQgPSAwOworICAgaW50ICAgIG1pbm9yYXJpdGggPSAwOworCisgICB3aGlsZSAoLS1hcmdjID4gMCkKKyAgICAgIGlmIChzdHJjbXAoKisrYXJndiwgIi1hIikgPT0gMCkKKyAgICAgICAgIHNob3dhbGwgPSAxOworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLWUiKSA9PSAwICYmIGFyZ2MgPiAwKQorICAgICAgeworICAgICAgICAgLS1hcmdjOworICAgICAgICAgbWF4X2Vycm9yID0gYXRvZigqKythcmd2KTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1FIikgPT0gMCAmJiBhcmdjID4gMCkKKyAgICAgIHsKKyAgICAgICAgIC0tYXJnYzsKKyAgICAgICAgIG1heF9lcnJvcl9hYnMgPSBhdG9mKCorK2FyZ3YpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmtub3duIGFyZ3VtZW50ICVzXG4iLCAqYXJndik7CisgICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKworICAgZG8KKyAgIHsKKyAgICAgIHBuZ19zaXplX3QgaW5kZXg7CisgICAgICBpbnQgc3RhdGUsIGZhaWxlZCA9IDA7CisgICAgICBjaGFyIGJ1ZmZlcls2NF07CisKKyAgICAgIGlmIChpc2Zpbml0ZSh0ZXN0KSkKKyAgICAgICAgICsrZmluaXRlOworICAgICAgZWxzZQorICAgICAgICAgKytub25maW5pdGU7CisKKyAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlLipnICVkXG4iLCBEQkxfRElHLCB0ZXN0LCBwcmVjaXNpb24pOworCisgICAgICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgaW4gdGhlIGJ1ZmZlciBieSBzZXR0aW5nIGEgbWFya2VyLiAqLworICAgICAgbWVtc2V0KGJ1ZmZlciwgNzEsIHNpemVvZiBidWZmZXIpOworCisgICAgICBwbmdfYXNjaWlfZnJvbV9mcCgwLCBidWZmZXIsIHByZWNpc2lvbisxMCwgdGVzdCwgcHJlY2lzaW9uKTsKKworICAgICAgLyogQWxsb3cgZm9yIGEgdGhyZWUgZGlnaXQgZXhwb25lbnQsIHRoaXMgc3R1ZmYgd2lsbCBmYWlsIGlmCisgICAgICAgKiB0aGUgZXhwb25lbnQgaXMgYmlnZ2VyIHRoYW4gdGhpcyEKKyAgICAgICAqLworICAgICAgaWYgKGJ1ZmZlcltwcmVjaXNpb24rN10gIT0gNzEpCisgICAgICB7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVnWyVkXSAtPiAnJXMnWyVsdV0gYnVmZmVyIG92ZXJmbG93XG4iLCB0ZXN0LAorICAgICAgICAgICAgcHJlY2lzaW9uLCBidWZmZXIsICh1bnNpZ25lZCBsb25nKXN0cmxlbihidWZmZXIpKTsKKyAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICB9CisKKyAgICAgIC8qIEZvbGxvd2luZyBhcmUgdXNlZCBmb3IgdGhlIG51bWJlciBwYXJzZXIgYmVsb3cgYW5kIG11c3QgYmUKKyAgICAgICAqIGluaXRpYWxpemVkIHRvIHplcm8uCisgICAgICAgKi8KKyAgICAgIHN0YXRlID0gMDsKKyAgICAgIGluZGV4ID0gMDsKKyAgICAgIGlmICghaXNmaW5pdGUodGVzdCkpCisgICAgICB7CisgICAgICAgICAvKiBFeHBlY3QgJ2luZicgKi8KKyAgICAgICAgIGlmICh0ZXN0ID49IDAgJiYgc3RyY21wKGJ1ZmZlciwgImluZiIpIHx8CisgICAgICAgICAgICAgdGVzdCA8ICAwICYmIHN0cmNtcChidWZmZXIsICItaW5mIikpCisgICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVnWyVkXSAtPiAnJXMnIGJ1dCBleHBlY3RlZCAnaW5mJ1xuIiwgdGVzdCwKKyAgICAgICAgICAgICAgIHByZWNpc2lvbiwgYnVmZmVyKTsKKyAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmICghcG5nX2NoZWNrX2ZwX251bWJlcihidWZmZXIsIHByZWNpc2lvbisxMCwgJnN0YXRlLCAmaW5kZXgpIHx8CisgICAgICAgICAgYnVmZmVyW2luZGV4XSAhPSAwKQorICAgICAgeworICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlZ1slZF0gLT4gJyVzJyBidXQgaGFzIGJhZCBmb3JtYXQgKCclYycpXG4iLCB0ZXN0LAorICAgICAgICAgcHJlY2lzaW9uLCBidWZmZXIsIGJ1ZmZlcltpbmRleF0pOworICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKFBOR19GUF9JU19ORUdBVElWRShzdGF0ZSkgJiYgISh0ZXN0IDwgMCkpCisgICAgICB7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVnWyVkXSAtPiAnJXMnIGJ1dCBuZWdhdGl2ZSB2YWx1ZSBub3Qgc28gcmVwb3J0ZWRcbiIsCisgICAgICAgICAgICB0ZXN0LCBwcmVjaXNpb24sIGJ1ZmZlcik7CisgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgYXNzZXJ0KCFQTkdfRlBfSVNfWkVSTyhzdGF0ZSkpOworICAgICAgICAgYXNzZXJ0KCFQTkdfRlBfSVNfUE9TSVRJVkUoc3RhdGUpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKFBOR19GUF9JU19aRVJPKHN0YXRlKSAmJiAhKHRlc3QgPT0gMCkpCisgICAgICB7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVnWyVkXSAtPiAnJXMnIGJ1dCB6ZXJvIHZhbHVlIG5vdCBzbyByZXBvcnRlZFxuIiwKKyAgICAgICAgICAgIHRlc3QsIHByZWNpc2lvbiwgYnVmZmVyKTsKKyAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICBhc3NlcnQoIVBOR19GUF9JU19ORUdBVElWRShzdGF0ZSkpOworICAgICAgICAgYXNzZXJ0KCFQTkdfRlBfSVNfUE9TSVRJVkUoc3RhdGUpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKFBOR19GUF9JU19QT1NJVElWRShzdGF0ZSkgJiYgISh0ZXN0ID4gMCkpCisgICAgICB7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVnWyVkXSAtPiAnJXMnIGJ1dCBwb3N0aXZlIHZhbHVlIG5vdCBzbyByZXBvcnRlZFxuIiwKKyAgICAgICAgICAgIHRlc3QsIHByZWNpc2lvbiwgYnVmZmVyKTsKKyAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICBhc3NlcnQoIVBOR19GUF9JU19ORUdBVElWRShzdGF0ZSkpOworICAgICAgICAgYXNzZXJ0KCFQTkdfRlBfSVNfWkVSTyhzdGF0ZSkpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgLyogQ2hlY2sgdGhlIHJlc3VsdCBhZ2FpbnN0IHRoZSBvcmlnaW5hbC4gKi8KKyAgICAgICAgIGRvdWJsZSBvdXQgPSBhdG9mKGJ1ZmZlcik7CisgICAgICAgICBkb3VibGUgY2hhbmdlID0gZmFicygob3V0IC0gdGVzdCkvdGVzdCk7CisgICAgICAgICBkb3VibGUgYWxsb3cgPSAuNS9wb3coMTAsCisgICAgICAgICAgICAocHJlY2lzaW9uID49IERCTF9ESUcpID8gREJMX0RJRy0xIDogcHJlY2lzaW9uLTEpOworCisgICAgICAgICAvKiBOT1RFOiBpZiB5b3UgaGl0IHRoaXMgZXJyb3IgY2FzZSBhcmUgeW91IGNvbXBpbGluZyB3aXRoIGdjYworICAgICAgICAgICogYW5kIC1PMD8gIFRyeSAtTzIgLSB0aGUgZXJyb3JzIGNhbiBhY2N1bXVsYXRlIGlmIHRoZSBGUAorICAgICAgICAgICogY29kZSBhYm92ZSBpcyBub3Qgb3B0aW1pemVkIGFuZCBtYXkgZHJpZnQgb3V0c2lkZSB0aGUgLjUgaW4KKyAgICAgICAgICAqIERCTF9ESUcgYWxsb3dlZC4gIEluIGFueSBjYXNlIGEgc21hbGwgbnVtYmVyIG9mIGVycm9ycyBtYXkKKyAgICAgICAgICAqIG9jY3VyICh2ZXJ5IHNtYWxsIG9uZXMgLSAxIG9yIDIlKSBiZWNhdXNlIG9mIHJvdW5kaW5nIGluIHRoZQorICAgICAgICAgICogY2FsY3VsYXRpb25zLCBlaXRoZXIgaW4gdGhlIGNvbnZlcnNpb24gQVBJIG9yIGluIGF0b2YuCisgICAgICAgICAgKi8KKyAgICAgICAgIGlmIChjaGFuZ2UgPj0gYWxsb3cgJiYgKGlzZmluaXRlKG91dCkgfHwKKyAgICAgICAgICAgICBmYWJzKHRlc3QvREJMX01BWCkgPD0gMS1hbGxvdykpCisgICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgcGVyY2VudCA9IChwcmVjaXNpb24gPj0gREJMX0RJRykgPyBtYXhfZXJyb3JfYWJzIDogbWF4X2Vycm9yOworICAgICAgICAgICAgZG91YmxlIGFsbG93cCA9IChjaGFuZ2UtYWxsb3cpKjEwMC9hbGxvdzsKKworICAgICAgICAgICAgaWYgKHByZWNpc2lvbiA+PSBEQkxfRElHKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKG1heF9hYnMgPCBhbGxvd3ApIG1heF9hYnMgPSBhbGxvd3A7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmIChtYXggPCBhbGxvd3ApIG1heCA9IGFsbG93cDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNob3dhbGwgfHwgYWxsb3dwID49IHBlcmNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICIlLipnWyVkXSAtPiAnJXMnIC0+ICUuKmcgbnVtYmVyIGNoYW5nZWQgKCVnID4gJWcgKCVkJSUpKVxuIiwKKyAgICAgICAgICAgICAgICAgIERCTF9ESUcsIHRlc3QsIHByZWNpc2lvbiwgYnVmZmVyLCBEQkxfRElHLCBvdXQsIGNoYW5nZSwgYWxsb3csCisgICAgICAgICAgICAgICAgICAoaW50KXJvdW5kKGFsbG93cCkpOworICAgICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICsrbWlub3Jhcml0aDsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGZhaWxlZCkKKyAgICAgICAgICsrZmFpbGNvdW50OworICAgICAgZWxzZQorICAgICAgICAgKytvazsKKworc2tpcDoKKyAgICAgIC8qIEdlbmVyYXRlIGEgbmV3IG51bWJlciBhbmQgcHJlY2lzaW9uLiAqLworICAgICAgcHJlY2lzaW9uID0gcmFuZCgpOworICAgICAgaWYgKHByZWNpc2lvbiAmIDEpIHRlc3QgPSAtdGVzdDsKKyAgICAgIHByZWNpc2lvbiA+Pj0gMTsKKworICAgICAgLyogR2VuZXJhdGUgcmFuZG9tIG51bWJlcnMuICovCisgICAgICBpZiAodGVzdCA9PSAwIHx8ICFpc2Zpbml0ZSh0ZXN0KSkKKyAgICAgICAgIHRlc3QgPSBwcmVjaXNpb24rMTsKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIC8qIERlcml2ZSB0aGUgZXhwb25lbnQgZnJvbSB0aGUgcHJldmlvdXMgcmFuZCgpIHZhbHVlLiAqLworICAgICAgICAgaW50IGV4cG9uZW50ID0gcHJlY2lzaW9uICUgKERCTF9NQVhfRVhQIC0gREJMX01JTl9FWFApICsgREJMX01JTl9FWFA7CisgICAgICAgICBpbnQgdG1wOworICAgICAgICAgdGVzdCA9IGZyZXhwKHRlc3QgKiByYW5kKCksICZ0bXApOworICAgICAgICAgdGVzdCA9IGxkZXhwKHRlc3QsIGV4cG9uZW50KTsKKyAgICAgICAgIHByZWNpc2lvbiA+Pj0gODsgLyogYXJiaXRyYXJ5ICovCisgICAgICB9CisKKyAgICAgIC8qIFRoaXMgbGltaXRzIHRoZSBwcmVjaXNpb24gdG8gMzIgZGlnaXRzLCBlbm91Z2ggZm9yIHN0YW5kYXJkCisgICAgICAgKiBJRUVFIGltcGxlbWVudGF0aW9ucyB3aGljaCBoYXZlIGF0IG1vc3QgMTUgZGlnaXRzLgorICAgICAgICovCisgICAgICBwcmVjaXNpb24gPSAocHJlY2lzaW9uICYgMHgxZikgKyAxOworICAgfQorICAgd2hpbGUgKC0tY291bnQpOworCisgICBwcmludGYoIlRlc3RlZCAlZCBmaW5pdGUgdmFsdWVzLCAlZCBub24tZmluaXRlLCAlZCBPSyAoJWQgZmFpbGVkKSAlZCBtaW5vciAiCisgICAgICAiYXJpdGhtZXRpYyBlcnJvcnNcbiIsIGZpbml0ZSwgbm9uZmluaXRlLCBvaywgZmFpbGNvdW50LCBtaW5vcmFyaXRoKTsKKyAgIHByaW50ZigiIEVycm9yIHdpdGggPj0lZCBkaWdpdCBwcmVjaXNpb24gJS4yZiUlXG4iLCBEQkxfRElHLCBtYXhfYWJzKTsKKyAgIHByaW50ZigiIEVycm9yIHdpdGggPCAlZCBkaWdpdCBwcmVjaXNpb24gJS4yZiUlXG4iLCBEQkxfRElHLCBtYXgpOworCisgICByZXR1cm4gMDsKK30KKworLyogT2JzZXJ2ZSB0aGF0IHZhbGlkIEZQIG51bWJlcnMgaGF2ZSB0aGUgZm9ybXMgbGlzdGVkIGluIHRoZSBQTkcgZXh0ZW5zaW9ucworICogc3BlY2lmaWNhdGlvbjoKKyAqCisgKiBbKywtXXtpbnRlZ2VyLGludGVnZXIuZnJhY3Rpb24sLmZyYWN0aW9ufVt7ZSxFfVsrLC1daW50ZWdlcl0KKyAqCisgKiBUZXN0IGVhY2ggb2YgdGhlc2UgaW4gdHVybiwgaW5jbHVkaW5nIGludmFsaWQgY2FzZXMuCisgKi8KK3R5cGVkZWYgZW51bSBjaGVja2ZwX3N0YXRlCit7CisgICBzdGFydCwgZnJhY3Rpb24sIGV4cG9uZW50LCBzdGF0ZXMKK30gY2hlY2tmcF9zdGF0ZTsKKworLyogVGhlIGNoYXJhY3RlcnMgKG90aGVyIHRoYW4gZGlnaXRzKSB0aGF0IGNoYXJhY3Rlcml6ZSB0aGUgc3RhdGVzOiAqLworc3RhdGljIGNvbnN0IGNoYXIgbm9uZVtdID0gIiI7CitzdGF0aWMgY29uc3QgY2hhciBoZXhkaWdpdHNbMTZdID0gIjAxMjM0NTY3ODlBQkNERUYiOworCitzdGF0aWMgY29uc3Qgc3RydWN0Cit7CisgICBjb25zdCBjaGFyICpzdGFydDsgLyogQ2hhcmFjdGVycyB2YWxpZCBhdCB0aGUgc3RhcnQgKi8KKyAgIGNvbnN0IGNoYXIgKmVuZDsgICAvKiBWYWxpZCBjaGFyYWN0ZXJzIHRoYXQgZW5kIHRoZSBzdGF0ZSAqLworICAgY29uc3QgY2hhciAqdGVzdHM7IC8qIENoYXJhY3RlcnMgdG8gdGVzdCBhZnRlciAyIGRpZ2l0cyBzZWVuICovCit9CitzdGF0ZV9jaGFyYWN0ZXJzW3N0YXRlc10gPQoreworICAgLyogc3RhcnQ6ICAgICovIHsgIistLiIsICIuZUUiLCAiKy0uZSowMzY5IiB9LAorICAgLyogZnJhY3Rpb246ICovIHsgbm9uZSwgImVFIiwgICIrLS5FIzAxNDciIH0sCisgICAvKiBleHBvbmVudDogKi8geyAiKy0iLCBub25lLCAgIistLmVFXjAyNTgiIH0KK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICBjaGFyIG51bWJlclsxMDI0XTsgIC8qIEJ1ZmZlciBmb3IgbnVtYmVyIGJlaW5nIHRlc3RlZCAqLworICAgaW50ICBsaW1pdDsgICAgICAgICAvKiBDb21tYW5kIGxpbmUgbGltaXQgKi8KKyAgIGludCAgdmVyYm9zZTsgICAgICAgLyogU2hhZG93cyBnbG9iYWwgdmFyaWFibGUgKi8KKyAgIGludCAgY3RpbWVzOyAgICAgICAgLyogTnVtYmVyIG9mIG51bWJlcnMgdGVzdGVkICovCisgICBpbnQgIGNtaWxsaW9uczsgICAgIC8qIENvdW50IG9mIG1pbGxpb25zIG9mIG51bWJlcnMgKi8KKyAgIGludCAgY2ludmFsaWQ7ICAgICAgLyogSW52YWxpZCBzdHJpbmdzIGNoZWNrZWQgKi8KKyAgIGludCAgY25vYWNjZXB0OyAgICAgLyogQ2hhcmFjdGVycyBub3QgYWNjZXB0ZWQgKi8KK30KK2NoZWNrZnBfY29tbWFuZDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIGludCAgICAgICAgICAgY251bWJlcjsgICAgICAgICAgLyogSW5kZXggaW50byBudW1iZXIgc3RyaW5nICovCisgICBjaGVja2ZwX3N0YXRlIGNoZWNrX3N0YXRlOyAgICAgIC8qIEN1cnJlbnQgbnVtYmVyIHN0YXRlICovCisgICBpbnQgICAgICAgICAgIGF0X3N0YXJ0OyAgICAgICAgIC8qIEF0IHN0YXJ0IChmaXJzdCBjaGFyYWN0ZXIpIG9mIHN0YXRlICovCisgICBpbnQgICAgICAgICAgIGNkaWdpdHNfaW5fc3RhdGU7IC8qIERpZ2l0cyBzZWVuIGluIHRoYXQgc3RhdGUgKi8KKyAgIGludCAgICAgICAgICAgbGltaXQ7ICAgICAgICAgICAgLyogTGltaXQgb24gc2FtZSBmb3IgY2hlY2tpbmcgYWxsIGNoYXJzICovCisgICBpbnQgICAgICAgICAgIHN0YXRlOyAgICAgICAgICAgIC8qIEN1cnJlbnQgcGFyc2VyIHN0YXRlICovCisgICBpbnQgICAgICAgICAgIGlzX25lZ2F0aXZlOyAgICAgIC8qIE51bWJlciBpcyBuZWdhdGl2ZSAqLworICAgaW50ICAgICAgICAgICBpc196ZXJvOyAgICAgICAgICAvKiBOdW1iZXIgaXMgKHN0aWxsKSB6ZXJvICovCisgICBpbnQgICAgICAgICAgIG51bWJlcl93YXNfdmFsaWQ7IC8qIFByZXZpb3VzIGNoYXJhY3RlciB2YWxpZGl0eSAqLworfQorY2hlY2tmcF9jb250cm9sOworCitzdGF0aWMgaW50IGNoZWNrX2FsbF9jaGFyYWN0ZXJzKGNoZWNrZnBfY29tbWFuZCAqY28sIGNoZWNrZnBfY29udHJvbCBjKTsKKworc3RhdGljIGludCBjaGVja19zb21lX2NoYXJhY3RlcnMoY2hlY2tmcF9jb21tYW5kICpjbywgY2hlY2tmcF9jb250cm9sIGMsCisgICBjb25zdCBjaGFyICp0ZXN0cyk7CisKK3N0YXRpYyBpbnQgY2hlY2tfb25lX2NoYXJhY3RlcihjaGVja2ZwX2NvbW1hbmQgKmNvLCBjaGVja2ZwX2NvbnRyb2wgYywgaW50IGNoKQoreworICAgLyogVGVzdCB0aGlzIGNoYXJhY3RlciAoY2gpIHRvIGVuc3VyZSB0aGUgcGFyc2VyIGRvZXMgdGhlIGNvcnJlY3QgdGhpbmcuCisgICAgKi8KKyAgIHBuZ19zaXplX3QgaW5kZXggPSAwOworICAgY29uc3QgY2hhciB0ZXN0ID0gKGNoYXIpY2g7CisgICBjb25zdCBpbnQgbnVtYmVyX2lzX3ZhbGlkID0gcG5nX2NoZWNrX2ZwX251bWJlcigmdGVzdCwgMSwgJmMuc3RhdGUsICZpbmRleCk7CisgICBjb25zdCBpbnQgY2hhcmFjdGVyX2FjY2VwdGVkID0gKGluZGV4ID09IDEpOworCisgICBpZiAoYy5jaGVja19zdGF0ZSAhPSBleHBvbmVudCAmJiBpc2RpZ2l0KGNoKSAmJiBjaCAhPSAnMCcpCisgICAgICBjLmlzX3plcm8gPSAwOworCisgICBpZiAoYy5jaGVja19zdGF0ZSA9PSBzdGFydCAmJiBjLmF0X3N0YXJ0ICYmIGNoID09ICctJykKKyAgICAgIGMuaXNfbmVnYXRpdmUgPSAxOworCisgICBpZiAoaXNwcmludChjaCkpCisgICAgICBjby0+bnVtYmVyW2MuY251bWJlcisrXSA9IChjaGFyKWNoOworICAgZWxzZQorICAgeworICAgICAgY28tPm51bWJlcltjLmNudW1iZXIrK10gPSAnPCc7CisgICAgICBjby0+bnVtYmVyW2MuY251bWJlcisrXSA9IGhleGRpZ2l0c1soY2ggPj4gNCkgJiAweGZdOworICAgICAgY28tPm51bWJlcltjLmNudW1iZXIrK10gPSBoZXhkaWdpdHNbY2ggJiAweGZdOworICAgICAgY28tPm51bWJlcltjLmNudW1iZXIrK10gPSAnPic7CisgICB9CisgICBjby0+bnVtYmVyW2MuY251bWJlcl0gPSAwOworCisgICBpZiAoY28tPnZlcmJvc2UgPiAxKQorICAgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgY28tPm51bWJlcik7CisKKyAgIGlmICgrKyhjby0+Y3RpbWVzKSA9PSAxMDAwMDAwKQorICAgeworICAgICAgaWYgKGNvLT52ZXJib3NlID09IDEpCisgICAgICAgICBmcHV0YygnLicsIHN0ZGVycik7CisgICAgICBjby0+Y3RpbWVzID0gMDsKKyAgICAgICsrKGNvLT5jbWlsbGlvbnMpOworICAgfQorCisgICBpZiAoIW51bWJlcl9pc192YWxpZCkKKyAgICAgICsrKGNvLT5jaW52YWxpZCk7CisKKyAgIGlmICghY2hhcmFjdGVyX2FjY2VwdGVkKQorICAgICAgKysoY28tPmNub2FjY2VwdCk7CisKKyAgIC8qIFRoaXMgc2hvdWxkIG5ldmVyIGZhaWwgKGl0J3MgYSBzZXJpb3VzIGJ1ZyBpZiBpdCBkb2VzKTogKi8KKyAgIGlmIChpbmRleCAhPSAwICYmIGluZGV4ICE9IDEpCisgICB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiByZWFkIGJleW9uZCBlbmQgb2Ygc3RyaW5nICglbHUpXG4iLCBjby0+bnVtYmVyLAorICAgICAgICAgKHVuc2lnbmVkIGxvbmcpaW5kZXgpOworICAgICAgcmV0dXJuIDA7CisgICB9CisKKyAgIC8qIFZhbGlkYXRlIHRoZSBuZXcgc3RhdGUsIG5vdGUgdGhhdCB0aGUgUE5HX0ZQX0lTXyBtYWNyb3MgYWxsIHJldHVybgorICAgICogZmFsc2UgdW5sZXNzIHRoZSBudW1iZXIgaXMgdmFsaWQuCisgICAgKi8KKyAgIGlmIChQTkdfRlBfSVNfTkVHQVRJVkUoYy5zdGF0ZSkgIT0KKyAgICAgIChudW1iZXJfaXNfdmFsaWQgJiYgIWMuaXNfemVybyAmJiBjLmlzX25lZ2F0aXZlKSkKKyAgIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG5lZ2F0aXZlIHdoZW4gaXQgaXMgbm90XG4iLCBjby0+bnVtYmVyKTsKKyAgICAgIHJldHVybiAwOworICAgfQorCisgICBpZiAoUE5HX0ZQX0lTX1pFUk8oYy5zdGF0ZSkgIT0gKG51bWJlcl9pc192YWxpZCAmJiBjLmlzX3plcm8pKQorICAgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlczogemVybyB3aGVuIGl0IGlzIG5vdFxuIiwgY28tPm51bWJlcik7CisgICAgICByZXR1cm4gMDsKKyAgIH0KKworICAgaWYgKFBOR19GUF9JU19QT1NJVElWRShjLnN0YXRlKSAhPQorICAgICAgKG51bWJlcl9pc192YWxpZCAmJiAhYy5pc196ZXJvICYmICFjLmlzX25lZ2F0aXZlKSkKKyAgIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHBvc2l0aXZlIHdoZW4gaXQgaXMgbm90XG4iLCBjby0+bnVtYmVyKTsKKyAgICAgIHJldHVybiAwOworICAgfQorCisgICAvKiBUZXN0aW5nIGEgZGlnaXQgKi8KKyAgIGlmIChpc2RpZ2l0KGNoKSkKKyAgIHsKKyAgICAgIGlmICghY2hhcmFjdGVyX2FjY2VwdGVkKQorICAgICAgeworICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogZGlnaXQgJyVjJyBub3QgYWNjZXB0ZWRcbiIsIGNvLT5udW1iZXIsIGNoKTsKKyAgICAgICAgIHJldHVybiAwOworICAgICAgfQorCisgICAgICBpZiAoIW51bWJlcl9pc192YWxpZCkKKyAgICAgIHsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHNhdyBhIGRpZ2l0ICglYykgYnV0IG51bWJlciBub3QgdmFsaWRcbiIsCisgICAgICAgICAgICBjby0+bnVtYmVyLCBjaCk7CisgICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgKytjLmNkaWdpdHNfaW5fc3RhdGU7CisgICAgICBjLmF0X3N0YXJ0ID0gMDsKKyAgICAgIGMubnVtYmVyX3dhc192YWxpZCA9IDE7CisKKyAgICAgIC8qIENvbnRpbnVlIHRlc3RpbmcgY2hhcmFjdGVycyBpbiB0aGlzIHN0YXRlLiAgRWl0aGVyIHRlc3QgYWxsIG9mCisgICAgICAgKiB0aGVtIG9yLCBpZiB3ZSBoYXZlIGFscmVhZHkgc2VlbiBvbmUgZGlnaXQgaW4gdGhpcyBzdGF0ZSwganVzdCB0ZXN0IGEKKyAgICAgICAqIGxpbWl0ZWQgc2V0LgorICAgICAgICovCisgICAgICBpZiAoYy5jZGlnaXRzX2luX3N0YXRlIDwgMSkKKyAgICAgICAgIHJldHVybiBjaGVja19hbGxfY2hhcmFjdGVycyhjbywgYyk7CisKKyAgICAgIGVsc2UKKyAgICAgICAgIHJldHVybiBjaGVja19zb21lX2NoYXJhY3RlcnMoY28sIGMsCisgICAgICAgICAgICBzdGF0ZV9jaGFyYWN0ZXJzW2MuY2hlY2tfc3RhdGVdLnRlc3RzKTsKKyAgIH0KKworICAgLyogQSBub24tZGlnaXQ7IGlzIGl0IGFsbG93ZWQgaGVyZT8gKi8KKyAgIGVsc2UgaWYgKCgoY2ggPT0gJysnIHx8IGNoID09ICctJykgJiYgYy5jaGVja19zdGF0ZSAhPSBmcmFjdGlvbiAmJgorICAgICAgICAgICAgICAgYy5hdF9zdGFydCkgfHwKKyAgICAgICAgICAgIChjaCA9PSAnLicgJiYgYy5jaGVja19zdGF0ZSA9PSBzdGFydCkgfHwKKyAgICAgICAgICAgICgoY2ggPT0gJ2UnIHx8IGNoID09ICdFJykgJiYgYy5udW1iZXJfd2FzX3ZhbGlkICYmCisgICAgICAgICAgICAgICBjLmNoZWNrX3N0YXRlICE9IGV4cG9uZW50KSkKKyAgIHsKKyAgICAgIGlmICghY2hhcmFjdGVyX2FjY2VwdGVkKQorICAgICAgeworICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2hhcmFjdGVyICclYycgbm90IGFjY2VwdGVkXG4iLCBjby0+bnVtYmVyLCBjaCk7CisgICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgLyogVGhlIG51bWJlciByZW1haW5zIHZhbGlkIGFmdGVyIHN0YXJ0IG9mIGZyYWN0aW9uIGJ1dCBub3doZXJlIGVsc2UuICovCisgICAgICBpZiAobnVtYmVyX2lzX3ZhbGlkICYmIChjLmNoZWNrX3N0YXRlICE9IHN0YXJ0IHx8IGNoICE9ICcuJykpCisgICAgICB7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBzYXcgYSBub24tZGlnaXQgKCVjKSBidXQgbnVtYmVyIHZhbGlkXG4iLAorICAgICAgICAgICAgY28tPm51bWJlciwgY2gpOworICAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIGMubnVtYmVyX3dhc192YWxpZCA9IG51bWJlcl9pc192YWxpZDsKKworICAgICAgLyogQ2hlY2sgZm9yIGEgc3RhdGUgY2hhbmdlLiAgV2hlbiBjaGFuZ2luZyB0byAnZnJhY3Rpb24nIGlmIHRoZSBudW1iZXIKKyAgICAgICAqIGlzIHZhbGlkIGF0IHRoaXMgcG9pbnQgc2V0IHRoZSBhdF9zdGFydCB0byBmYWxzZSB0byBhbGxvdyBhbiBleHBvbmVudAorICAgICAgICogJ2UnIHRvIGNvbWUgbmV4dC4KKyAgICAgICAqLworICAgICAgaWYgKGMuY2hlY2tfc3RhdGUgPT0gc3RhcnQgJiYgY2ggPT0gJy4nKQorICAgICAgeworICAgICAgICAgYy5jaGVja19zdGF0ZSA9IGZyYWN0aW9uOworICAgICAgICAgYy5hdF9zdGFydCA9ICFudW1iZXJfaXNfdmFsaWQ7CisgICAgICAgICBjLmNkaWdpdHNfaW5fc3RhdGUgPSAwOworICAgICAgICAgYy5saW1pdCA9IGNvLT5saW1pdDsKKyAgICAgICAgIHJldHVybiBjaGVja19hbGxfY2hhcmFjdGVycyhjbywgYyk7CisgICAgICB9CisKKyAgICAgIGVsc2UgaWYgKGMuY2hlY2tfc3RhdGUgPCBleHBvbmVudCAmJiAoY2ggPT0gJ2UnIHx8IGNoID09ICdFJykpCisgICAgICB7CisgICAgICAgICBjLmNoZWNrX3N0YXRlID0gZXhwb25lbnQ7CisgICAgICAgICBjLmF0X3N0YXJ0ID0gMTsKKyAgICAgICAgIGMuY2RpZ2l0c19pbl9zdGF0ZSA9IDA7CisgICAgICAgICBjLmxpbWl0ID0gY28tPmxpbWl0OworICAgICAgICAgcmV0dXJuIGNoZWNrX2FsbF9jaGFyYWN0ZXJzKGNvLCBjKTsKKyAgICAgIH0KKworICAgICAgLyogRWxzZSBpdCB3YXMgYSBzaWduLCBhbmQgdGhlIHN0YXRlIGRvZXNuJ3QgY2hhbmdlLiAqLworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgaWYgKGNoICE9ICctJyAmJiBjaCAhPSAnKycpCisgICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNoZWNrZnA6IGludGVybmFsIGVycm9yICgxKVxuIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgIH0KKworICAgICAgICAgYy5hdF9zdGFydCA9IDA7CisgICAgICAgICByZXR1cm4gY2hlY2tfYWxsX2NoYXJhY3RlcnMoY28sIGMpOworICAgICAgfQorICAgfQorCisgICAvKiBUZXN0aW5nIGFuIGludmFsaWQgY2hhcmFjdGVyICovCisgICBlbHNlCisgICB7CisgICAgICBpZiAoY2hhcmFjdGVyX2FjY2VwdGVkKQorICAgICAgeworICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2hhcmFjdGVyICclYycgWzB4JS4yeF0gYWNjZXB0ZWRcbiIsIGNvLT5udW1iZXIsCisgICAgICAgICAgICBjaCwgY2gpOworICAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIGlmIChudW1iZXJfaXNfdmFsaWQgIT0gYy5udW1iZXJfd2FzX3ZhbGlkKQorICAgICAgeworICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiJXM6IGNoYXJhY3RlciAnJWMnIFsweCUuMnhdIGNoYW5nZWQgbnVtYmVyIHZhbGlkaXR5XG4iLCBjby0+bnVtYmVyLAorICAgICAgICAgICAgY2gsIGNoKTsKKyAgICAgICAgIHJldHVybiAwOworICAgICAgfQorCisgICAgICAvKiBEbyBub3RoaW5nIC0gdGhlIHBhcnNlciBoYXMgc3R1Y2s7IHJldHVybiBzdWNjZXNzIGFuZCBrZWVwIGdvaW5nIHdpdGgKKyAgICAgICAqIHRoZSBuZXh0IGNoYXJhY3Rlci4KKyAgICAgICAqLworICAgfQorCisgICAvKiBTdWNjZXNzZnVsIHJldHVybiAodGhlIGNhbGxlciB3aWxsIHRyeSB0aGUgbmV4dCBjaGFyYWN0ZXIuKSAqLworICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfYWxsX2NoYXJhY3RlcnMoY2hlY2tmcF9jb21tYW5kICpjbywgY2hlY2tmcF9jb250cm9sIGMpCit7CisgICBpbnQgY2g7CisKKyAgIGlmIChjLmNudW1iZXIrNCA8IHNpemVvZiBjby0+bnVtYmVyKSBmb3IgKGNoPTA7IGNoPDI1NjsgKytjaCkKKyAgIHsKKyAgICAgIGlmICghY2hlY2tfb25lX2NoYXJhY3RlcihjbywgYywgY2gpKQorICAgICAgICAgcmV0dXJuIDA7CisgICB9CisKKyAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoZWNrX3NvbWVfY2hhcmFjdGVycyhjaGVja2ZwX2NvbW1hbmQgKmNvLCBjaGVja2ZwX2NvbnRyb2wgYywKKyAgIGNvbnN0IGNoYXIgKnRlc3RzKQoreworICAgaW50IGk7CisKKyAgIC0tKGMubGltaXQpOworCisgICBpZiAoYy5jbnVtYmVyKzQgPCBzaXplb2YgY28tPm51bWJlciAmJiBjLmxpbWl0ID49IDApCisgICB7CisgICAgICBpZiAoYy5saW1pdCA+IDApIGZvciAoaT0wOyB0ZXN0c1tpXTsgKytpKQorICAgICAgeworICAgICAgICAgaWYgKCFjaGVja19vbmVfY2hhcmFjdGVyKGNvLCBjLCB0ZXN0c1tpXSkpCisgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgLyogQXQgdGhlIGVuZCBjaGVjayBhbGwgdGhlIGNoYXJhY3RlcnMuICovCisgICAgICBlbHNlCisgICAgICAgICByZXR1cm4gY2hlY2tfYWxsX2NoYXJhY3RlcnMoY28sIGMpOworICAgfQorCisgICByZXR1cm4gMTsKK30KKworaW50IHZhbGlkYXRpb25fY2hlY2tmcChpbnQgY291bnQsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgIGludCByZXN1bHQ7CisgICBjaGVja2ZwX2NvbW1hbmQgY29tbWFuZDsKKyAgIGNoZWNrZnBfY29udHJvbCBjb250cm9sOworCisgICBjb21tYW5kLm51bWJlclswXSA9IDA7CisgICBjb21tYW5kLmxpbWl0ID0gMzsKKyAgIGNvbW1hbmQudmVyYm9zZSA9IHZlcmJvc2U7CisgICBjb21tYW5kLmN0aW1lcyA9IDA7CisgICBjb21tYW5kLmNtaWxsaW9ucyA9IDA7CisgICBjb21tYW5kLmNpbnZhbGlkID0gMDsKKyAgIGNvbW1hbmQuY25vYWNjZXB0ID0gMDsKKworICAgd2hpbGUgKC0tYXJnYyA+IDApCisgICB7CisgICAgICArK2FyZ3Y7CisgICAgICBpZiAoYXJnYyA+IDEgJiYgc3RyY21wKCphcmd2LCAiLWwiKSA9PSAwKQorICAgICAgeworICAgICAgICAgLS1hcmdjOworICAgICAgICAgY29tbWFuZC5saW1pdCA9IGF0b2koKisrYXJndik7CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5rbm93biBhcmd1bWVudCAlc1xuIiwgKmFyZ3YpOworICAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICB9CisKKyAgIGNvbnRyb2wuY251bWJlciA9IDA7CisgICBjb250cm9sLmNoZWNrX3N0YXRlID0gc3RhcnQ7CisgICBjb250cm9sLmF0X3N0YXJ0ID0gMTsKKyAgIGNvbnRyb2wuY2RpZ2l0c19pbl9zdGF0ZSA9IDA7CisgICBjb250cm9sLmxpbWl0ID0gY29tbWFuZC5saW1pdDsKKyAgIGNvbnRyb2wuc3RhdGUgPSAwOworICAgY29udHJvbC5pc19uZWdhdGl2ZSA9IDA7CisgICBjb250cm9sLmlzX3plcm8gPSAxOworICAgY29udHJvbC5udW1iZXJfd2FzX3ZhbGlkID0gMDsKKworICAgcmVzdWx0ID0gY2hlY2tfYWxsX2NoYXJhY3RlcnMoJmNvbW1hbmQsIGNvbnRyb2wpOworCisgICBwcmludGYoImNoZWNrZnA6ICVzOiBjaGVja2VkICVkLCUuM2QsJS4zZCwlLjNkIHN0cmluZ3MgKCVkIGludmFsaWQpXG4iLAorICAgICAgcmVzdWx0ID8gInBhc3MiIDogIkZBSUwiLCBjb21tYW5kLmNtaWxsaW9ucyAvIDEwMDAsCisgICAgICBjb21tYW5kLmNtaWxsaW9ucyAlIDEwMDAsIGNvbW1hbmQuY3RpbWVzIC8gMTAwMCwgY29tbWFuZC5jdGltZXMgJSAxMDAwLAorICAgICAgY29tbWFuZC5jaW52YWxpZCk7CisKKyAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCB2YWxpZGF0aW9uX211bGRpdihpbnQgY291bnQsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgIGludCB0ZXN0ZWQgPSAwOworICAgaW50IG92ZXJmbG93ID0gMDsKKyAgIGludCBlcnJvciA9IDA7CisgICBpbnQgZXJyb3I2NCA9IDA7CisgICBpbnQgcGFzc2VkID0gMDsKKyAgIGludCByYW5kYml0cyA9IDA7CisgICBwbmdfdWludF8zMiByYW5kYnVmZmVyOworICAgcG5nX2ZpeGVkX3BvaW50IGE7CisgICBwbmdfaW50XzMyIHRpbWVzLCBkaXY7CisKKyAgIHdoaWxlICgtLWFyZ2MgPiAwKQorICAgICAgeworICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmtub3duIGFyZ3VtZW50ICVzXG4iLCAqKythcmd2KTsKKyAgICAgICAgIHJldHVybiAxOworICAgICAgfQorCisgICAvKiBGaW5kIG91dCBhYm91dCB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuICovCisgICByYW5kYnVmZmVyID0gUkFORF9NQVg7CisgICB3aGlsZSAocmFuZGJ1ZmZlciAhPSAwKSArK3JhbmRiaXRzLCByYW5kYnVmZmVyID4+PSAxOworICAgcHJpbnRmKCJVc2luZyByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB0aGF0IG1ha2VzICVkIGJpdHNcbiIsIHJhbmRiaXRzKTsKKyAgIGZvciAoZGl2PTA7IGRpdjwzMjsgZGl2ICs9IHJhbmRiaXRzKQorICAgICAgcmFuZGJ1ZmZlciA9IChyYW5kYnVmZmVyIDw8IHJhbmRiaXRzKSBeIHJhbmQoKTsKKworICAgYSA9IDA7CisgICB0aW1lcyA9IGRpdiA9IDA7CisgICBkbworICAgeworICAgICAgcG5nX2ZpeGVkX3BvaW50IHJlc3VsdDsKKyAgICAgIC8qIE5PVEU6IHlvdXIgbWlsZWFnZSBtYXkgdmFyeSwgYSB0eXBlIGlzIHJlcXVpcmVkIGJlbG93IHRoYXQgY2FuCisgICAgICAgKiBob2xkIDY0IGJpdHMgb3IgbW9yZSwgaWYgZmxvYXRpbmcgcG9pbnQgaXMgdXNlZCBhIDY0LWJpdCBvcgorICAgICAgICogYmV0dGVyIG1hbnRpc3NhIGlzIHJlcXVpcmVkLgorICAgICAgICovCisgICAgICBsb25nIGxvbmcgaW50IGZwLCBmcHJvdW5kOworICAgICAgdW5zaWduZWQgbG9uZyBoaSwgbG87CisgICAgICBpbnQgb2s7CisKKyAgICAgIC8qIENoZWNrIHRoZSB2YWx1ZXMsIHBuZ182NGJpdF9wcm9kdWN0IGNhbiBvbmx5IGhhbmRsZSBwb3NpdGl2ZQorICAgICAgICogbnVtYmVycywgc28gY29ycmVjdCBmb3IgdGhhdCBoZXJlLgorICAgICAgICovCisgICAgICB7CisgICAgICAgICBsb25nIHUxLCB1MjsKKyAgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgIGlmIChhIDwgMCkgdTEgPSAtYSwgbiA9IDE7IGVsc2UgdTEgPSBhOworICAgICAgICAgaWYgKHRpbWVzIDwgMCkgdTIgPSAtdGltZXMsIG4gPSAhbjsgZWxzZSB1MiA9IHRpbWVzOworICAgICAgICAgcG5nXzY0Yml0X3Byb2R1Y3QodTEsIHUyLCAmaGksICZsbyk7CisgICAgICAgICBpZiAobikKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIC14ID0gfngrMSAqLworICAgICAgICAgICAgbG8gPSAoKH5sbykgKyAxKSAmIDB4ZmZmZmZmZmY7CisgICAgICAgICAgICBoaSA9IH5oaTsKKyAgICAgICAgICAgIGlmIChsbyA9PSAwKSArK2hpOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBmcCA9IGE7CisgICAgICBmcCAqPSB0aW1lczsKKyAgICAgIGlmICgoZnAgJiAweGZmZmZmZmZmKSAhPSBsbyB8fCAoKGZwID4+IDMyKSAmIDB4ZmZmZmZmZmYpICE9IGhpKQorICAgICAgeworICAgICAgICAgZnByaW50ZihzdGRlcnIsICJwbmdfNjRiaXRfcHJvZHVjdCAlZCAqICVkIC0+ICVseHwlLjhseCBub3QgJWxseFxuIiwKKyAgICAgICAgICAgIGEsIHRpbWVzLCBoaSwgbG8sIGZwKTsKKyAgICAgICAgICsrZXJyb3I2NDsKKyAgICAgIH0KKworICAgICAgaWYgKGRpdiAhPSAwKQorICAgICAgeworICAgICAgICAgLyogUm91bmQgLSB0aGlzIGlzIEMgcm91bmQgdG8gemVyby4gKi8KKyAgICAgICAgIGlmICgoZnAgPCAwKSAhPSAoZGl2IDwgMCkpCisgICAgICAgICAgIGZwIC09IGRpdi8yOworICAgICAgICAgZWxzZQorICAgICAgICAgICBmcCArPSBkaXYvMjsKKworICAgICAgICAgZnAgLz0gZGl2OworICAgICAgICAgZnByb3VuZCA9IGZwOworICAgICAgICAgLyogQXNzdW1lIDIncyBjb21wbGVtZW50IGhlcmU6ICovCisgICAgICAgICBvayA9IGZwcm91bmQgPD0gUE5HX1VJTlRfMzFfTUFYICYmCisgICAgICAgICAgICAgIGZwcm91bmQgPj0gLTEtKGxvbmcgbG9uZyBpbnQpUE5HX1VJTlRfMzFfTUFYOworICAgICAgICAgaWYgKCFvaykgKytvdmVyZmxvdzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgb2sgPSAwLCArK292ZXJmbG93LCBmcHJvdW5kID0gZnAvKm1pc2xlYWRpbmcqLzsKKworICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRFU1QgJWQgKiAlZCAvICVkIC0+ICVsbGQgKCVzKVxuIiwgYSwgdGltZXMsIGRpdiwKKyAgICAgICAgICAgIGZwLCBvayA/ICJvayIgOiAib3ZlcmZsb3ciKTsKKworICAgICAgKyt0ZXN0ZWQ7CisgICAgICBpZiAocG5nX211bGRpdigmcmVzdWx0LCBhLCB0aW1lcywgZGl2KSAhPSBvaykKKyAgICAgIHsKKyAgICAgICAgICsrZXJyb3I7CisgICAgICAgICBpZiAob2spCisgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlZCAqICVkIC8gJWQgLT4gb3ZlcmZsb3cgKGV4cGVjdGVkICVsbGQpXG4iLCBhLAorICAgICAgICAgICAgICAgIHRpbWVzLCBkaXYsIGZwKTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVkICogJWQgLyAlZCAtPiAlZCAoZXhwZWN0ZWQgb3ZlcmZsb3cgJWxsZClcbiIsIGEsCisgICAgICAgICAgICAgICAgdGltZXMsIGRpdiwgcmVzdWx0LCBmcCk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChvayAmJiByZXN1bHQgIT0gZnByb3VuZCkKKyAgICAgIHsKKyAgICAgICAgICsrZXJyb3I7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVkICogJWQgLyAlZCAtPiAlZCBub3QgJWxsZFxuIiwgYSwgdGltZXMsIGRpdiwgcmVzdWx0LAorICAgICAgICAgICAgZnApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICAgKytwYXNzZWQ7CisKKyAgICAgIC8qIEdlbmVyYXRlIHRocmVlIG5ldyB2YWx1ZXMsIHRoaXMgdXNlcyByYW5kKCkgYW5kIHJhbmQoKSBvbmx5IHJldHVybnMKKyAgICAgICAqIHVwIHRvIFJBTkRfTUFYLgorICAgICAgICovCisgICAgICAvKiBDUlVERSAqLworICAgICAgYSArPSB0aW1lczsKKyAgICAgIHRpbWVzICs9IGRpdjsKKyAgICAgIGRpdiA9IHJhbmRidWZmZXI7CisgICAgICByYW5kYnVmZmVyID0gKHJhbmRidWZmZXIgPDwgcmFuZGJpdHMpIF4gcmFuZCgpOworICAgfQorICAgd2hpbGUgKC0tY291bnQgPiAwKTsKKworICAgcHJpbnRmKCIlZCB0ZXN0cyBpbmNsdWRpbmcgJWQgb3ZlcmZsb3dzLCAlZCBwYXNzZWQsICVkIGZhaWxlZCAoJWQgNjQtYml0ICIKKyAgICAgICJlcnJvcnMpXG4iLCB0ZXN0ZWQsIG92ZXJmbG93LCBwYXNzZWQsIGVycm9yLCBlcnJvcjY0KTsKKyAgIHJldHVybiAwOworfQorCisvKiBXaGVuIEZQIGlzIG9uIHRoaXMganVzdCBiZWNvbWVzIGEgc3BlZWQgdGVzdCAtIGNvbXBpbGUgd2l0aG91dCBGUCB0byBnZXQgcmVhbAorICogdmFsaWRhdGlvbi4KKyAqLworI2lmZGVmIFBOR19GTE9BVElOR19BUklUSE1FVElDX1NVUFBPUlRFRAorI2RlZmluZSBMTjIgLjAwMDAxMDU3NjU4NjYxNzQzMDgwNjExMjkzMzgzOSAvKiBsb2coMikvNjU1MzYgKi8KKyNkZWZpbmUgTDJJTlYgOTQ1NDguNDYyMTk5Njk5MTA1ODY1NzI2NTEgICAgLyogNjU1MzYvbG9nKDIpICovCisKKy8qIEZvciBzcGVlZCB0ZXN0aW5nLCBuZWVkIHRoZSBpbnRlcm5hbCBmdW5jdGlvbnMgdG9vOiAqLworc3RhdGljIHBuZ191aW50XzMyIHBuZ19sb2c4Yml0KHVuc2lnbmVkIHgpCit7CisgICBpZiAoeCA+IDApCisgICAgICByZXR1cm4gKHBuZ191aW50XzMyKWZsb29yKC41LWxvZyh4LzI1NS4pKkwySU5WKTsKKworICAgcmV0dXJuIDB4ZmZmZmZmZmY7Cit9CisKK3N0YXRpYyBwbmdfdWludF8zMiBwbmdfbG9nMTZiaXQocG5nX3VpbnRfMzIgeCkKK3sKKyAgIGlmICh4ID4gMCkKKyAgICAgIHJldHVybiAocG5nX3VpbnRfMzIpZmxvb3IoLjUtbG9nKHgvNjU1MzUuKSpMMklOVik7CisKKyAgIHJldHVybiAweGZmZmZmZmZmOworfQorCitzdGF0aWMgcG5nX3VpbnRfMzIgcG5nX2V4cChwbmdfdWludF8zMiB4KQoreworICAgcmV0dXJuIChwbmdfdWludF8zMilmbG9vciguNSArIGV4cCh4ICogLUxOMikgKiAweGZmZmZmZmZmVSk7Cit9CisKK3N0YXRpYyBwbmdfYnl0ZSBwbmdfZXhwOGJpdChwbmdfdWludF8zMiBsb2cpCit7CisgICByZXR1cm4gKHBuZ19ieXRlKWZsb29yKC41ICsgZXhwKGxvZyAqIC1MTjIpICogMjU1KTsKK30KKworc3RhdGljIHBuZ191aW50XzE2IHBuZ19leHAxNmJpdChwbmdfdWludF8zMiBsb2cpCit7CisgICByZXR1cm4gKHBuZ191aW50XzE2KWZsb29yKC41ICsgZXhwKGxvZyAqIC1MTjIpICogNjU1MzUpOworfQorI2VuZGlmIC8qIEZMT0FUSU5HX0FSSVRITUVUSUMgKi8KKworaW50IHZhbGlkYXRpb25fZ2FtbWEoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgZG91YmxlIGdhbW1hWzldID0geyAyLjIsIDEuOCwgMS41MiwgMS40NSwgMS4sIDEvMS40NSwgMS8xLjUyLCAxLzEuOCwgMS8yLjIgfTsKKyAgIGRvdWJsZSBtYXhlcnI7CisgICBpbnQgaSwgc2lsZW50PTAsIG9ubHlnYW1tYT0wOworCisgICAvKiBTaWxlbmNlIHRoZSBvdXRwdXQgd2l0aCAtcywganVzdCB0ZXN0IHRoZSBnYW1tYSBmdW5jdGlvbnMgd2l0aCAtZzogKi8KKyAgIHdoaWxlICgtLWFyZ2MgPiAwKQorICAgICAgaWYgKHN0cmNtcCgqKythcmd2LCAiLXMiKSA9PSAwKQorICAgICAgICAgc2lsZW50ID0gMTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1nIikgPT0gMCkKKyAgICAgICAgIG9ubHlnYW1tYSA9IDE7CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVua25vd24gYXJndW1lbnQgJXNcbiIsICphcmd2KTsKKyAgICAgICAgIHJldHVybiAxOworICAgICAgfQorCisgICBpZiAoIW9ubHlnYW1tYSkKKyAgIHsKKyAgICAgIC8qIEZpcnN0IHZhbGlkYXRlIHRoZSBsb2cgZnVuY3Rpb25zOiAqLworICAgICAgbWF4ZXJyID0gMDsKKyAgICAgIGZvciAoaT0wOyBpPDI1NjsgKytpKQorICAgICAgeworICAgICAgICAgZG91YmxlIGNvcnJlY3QgPSAtbG9nKGkvMjU1LikvbG9nKDIuKSo2NTUzNjsKKyAgICAgICAgIGRvdWJsZSBlcnJvciA9IHBuZ19sb2c4Yml0KGkpIC0gY29ycmVjdDsKKworICAgICAgICAgaWYgKGkgIT0gMCAmJiBmYWJzKGVycm9yKSA+IG1heGVycikKKyAgICAgICAgICAgIG1heGVyciA9IGZhYnMoZXJyb3IpOworCisgICAgICAgICBpZiAoaSA9PSAwICYmIHBuZ19sb2c4Yml0KGkpICE9IDB4ZmZmZmZmZmYgfHwKKyAgICAgICAgICAgICBpICE9IDAgJiYgcG5nX2xvZzhiaXQoaSkgIT0gZmxvb3IoY29ycmVjdCsuNSkpCisgICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIjgtYml0IGxvZyBlcnJvcjogJWQ6IGdvdCAldSwgZXhwZWN0ZWQgJWZcbiIsCisgICAgICAgICAgICAgICBpLCBwbmdfbG9nOGJpdChpKSwgY29ycmVjdCk7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICghc2lsZW50KQorICAgICAgICAgcHJpbnRmKCJtYXhpbXVtIDgtYml0IGxvZyBlcnJvciA9ICVmXG4iLCBtYXhlcnIpOworCisgICAgICBtYXhlcnIgPSAwOworICAgICAgZm9yIChpPTA7IGk8NjU1MzY7ICsraSkKKyAgICAgIHsKKyAgICAgICAgIGRvdWJsZSBjb3JyZWN0ID0gLWxvZyhpLzY1NTM1LikvbG9nKDIuKSo2NTUzNjsKKyAgICAgICAgIGRvdWJsZSBlcnJvciA9IHBuZ19sb2cxNmJpdChpKSAtIGNvcnJlY3Q7CisKKyAgICAgICAgIGlmIChpICE9IDAgJiYgZmFicyhlcnJvcikgPiBtYXhlcnIpCisgICAgICAgICAgICBtYXhlcnIgPSBmYWJzKGVycm9yKTsKKworICAgICAgICAgaWYgKGkgPT0gMCAmJiBwbmdfbG9nMTZiaXQoaSkgIT0gMHhmZmZmZmZmZiB8fAorICAgICAgICAgICAgIGkgIT0gMCAmJiBwbmdfbG9nMTZiaXQoaSkgIT0gZmxvb3IoY29ycmVjdCsuNSkpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAoZXJyb3IgPiAuNjgpIC8qIEJ5IGV4cGVyaW1lbnQgZXJyb3IgaXMgbGVzcyB0aGFuIC42OCAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIxNi1iaXQgbG9nIGVycm9yOiAlZDogZ290ICV1LCBleHBlY3RlZCAlZiIKKyAgICAgICAgICAgICAgICAgICIgZXJyb3I6ICVmXG4iLCBpLCBwbmdfbG9nMTZiaXQoaSksIGNvcnJlY3QsIGVycm9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKCFzaWxlbnQpCisgICAgICAgICBwcmludGYoIm1heGltdW0gMTYtYml0IGxvZyBlcnJvciA9ICVmXG4iLCBtYXhlcnIpOworCisgICAgICAvKiBOb3cgZXhwb25lbnRpYXRpb25zLiAqLworICAgICAgbWF4ZXJyID0gMDsKKyAgICAgIGZvciAoaT0wOyBpPD0weGZmZmZmOyArK2kpCisgICAgICB7CisgICAgICAgICBkb3VibGUgY29ycmVjdCA9IGV4cCgtaS82NTUzNi4gKiBsb2coMi4pKSAqICg2NTUzNi4gKiA2NTUzNik7CisgICAgICAgICBkb3VibGUgZXJyb3IgPSBwbmdfZXhwKGkpIC0gY29ycmVjdDsKKworICAgICAgICAgaWYgKGZhYnMoZXJyb3IpID4gbWF4ZXJyKQorICAgICAgICAgICAgbWF4ZXJyID0gZmFicyhlcnJvcik7CisgICAgICAgICBpZiAoZmFicyhlcnJvcikgPiAxODgzKSAvKiBCeSBleHBlcmltZW50LiAqLworICAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIzMi1iaXQgZXhwIGVycm9yOiAlZDogZ290ICV1LCBleHBlY3RlZCAlZiIKKyAgICAgICAgICAgICAgICAgICIgZXJyb3I6ICVmXG4iLCBpLCBwbmdfZXhwKGkpLCBjb3JyZWN0LCBlcnJvcik7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICghc2lsZW50KQorICAgICAgICAgcHJpbnRmKCJtYXhpbXVtIDMyLWJpdCBleHAgZXJyb3IgPSAlZlxuIiwgbWF4ZXJyKTsKKworICAgICAgbWF4ZXJyID0gMDsKKyAgICAgIGZvciAoaT0wOyBpPD0weGZmZmZmOyArK2kpCisgICAgICB7CisgICAgICAgICBkb3VibGUgY29ycmVjdCA9IGV4cCgtaS82NTUzNi4gKiBsb2coMi4pKSAqIDI1NTsKKyAgICAgICAgIGRvdWJsZSBlcnJvciA9IHBuZ19leHA4Yml0KGkpIC0gY29ycmVjdDsKKworICAgICAgICAgaWYgKGZhYnMoZXJyb3IpID4gbWF4ZXJyKQorICAgICAgICAgICAgbWF4ZXJyID0gZmFicyhlcnJvcik7CisgICAgICAgICBpZiAoZmFicyhlcnJvcikgPiAuNTAwMDIpIC8qIEJ5IGV4cGVyaW1lbnQgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiOC1iaXQgZXhwIGVycm9yOiAlZDogZ290ICV1LCBleHBlY3RlZCAlZiIKKyAgICAgICAgICAgICAgICAgICIgZXJyb3I6ICVmXG4iLCBpLCBwbmdfZXhwOGJpdChpKSwgY29ycmVjdCwgZXJyb3IpOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoIXNpbGVudCkKKyAgICAgICAgIHByaW50ZigibWF4aW11bSA4LWJpdCBleHAgZXJyb3IgPSAlZlxuIiwgbWF4ZXJyKTsKKworICAgICAgbWF4ZXJyID0gMDsKKyAgICAgIGZvciAoaT0wOyBpPD0weGZmZmZmOyArK2kpCisgICAgICB7CisgICAgICAgICBkb3VibGUgY29ycmVjdCA9IGV4cCgtaS82NTUzNi4gKiBsb2coMi4pKSAqIDY1NTM1OworICAgICAgICAgZG91YmxlIGVycm9yID0gcG5nX2V4cDE2Yml0KGkpIC0gY29ycmVjdDsKKworICAgICAgICAgaWYgKGZhYnMoZXJyb3IpID4gbWF4ZXJyKQorICAgICAgICAgICAgbWF4ZXJyID0gZmFicyhlcnJvcik7CisgICAgICAgICBpZiAoZmFicyhlcnJvcikgPiAuNTI0KSAvKiBCeSBleHBlcmltZW50ICovCisgICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIjE2LWJpdCBleHAgZXJyb3I6ICVkOiBnb3QgJXUsIGV4cGVjdGVkICVmIgorICAgICAgICAgICAgICAgICAgIiBlcnJvcjogJWZcbiIsIGksIHBuZ19leHAxNmJpdChpKSwgY29ycmVjdCwgZXJyb3IpOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoIXNpbGVudCkKKyAgICAgICAgIHByaW50ZigibWF4aW11bSAxNi1iaXQgZXhwIGVycm9yID0gJWZcbiIsIG1heGVycik7CisgICB9IC8qICFvbmx5Z2FtbWEgKi8KKworICAgLyogVGVzdCB0aGUgb3ZlcmFsbCBnYW1tYSBjb3JyZWN0aW9uLiAqLworICAgZm9yIChpPTA7IGk8OTsgKytpKQorICAgeworICAgICAgdW5zaWduZWQgajsKKyAgICAgIGRvdWJsZSBnID0gZ2FtbWFbaV07CisgICAgICBwbmdfZml4ZWRfcG9pbnQgZ2ZwID0gZmxvb3IoZyAqIFBOR19GUF8xICsgLjUpOworCisgICAgICBpZiAoIXNpbGVudCkKKyAgICAgICAgIHByaW50ZigiVGVzdCBnYW1tYSAlZlxuIiwgZyk7CisKKyAgICAgIG1heGVyciA9IDA7CisgICAgICBmb3IgKGo9MDsgajwyNTY7ICsraikKKyAgICAgIHsKKyAgICAgICAgIGRvdWJsZSBjb3JyZWN0ID0gcG93KGovMjU1LiwgZykgKiAyNTU7CisgICAgICAgICBwbmdfYnl0ZSBvdXQgPSBwbmdfZ2FtbWFfOGJpdF9jb3JyZWN0KGosIGdmcCk7CisgICAgICAgICBkb3VibGUgZXJyb3IgPSBvdXQgLSBjb3JyZWN0OworCisgICAgICAgICBpZiAoZmFicyhlcnJvcikgPiBtYXhlcnIpCisgICAgICAgICAgICBtYXhlcnIgPSBmYWJzKGVycm9yKTsKKyAgICAgICAgIGlmIChvdXQgIT0gZmxvb3IoY29ycmVjdCsuNSkpCisgICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIjhiaXQgJWQgXiAlZjogZ290ICVkIGV4cGVjdGVkICVmIGVycm9yICVmXG4iLAorICAgICAgICAgICAgICAgaiwgZywgb3V0LCBjb3JyZWN0LCBlcnJvcik7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICghc2lsZW50KQorICAgICAgICAgcHJpbnRmKCJnYW1tYSAlZjogbWF4aW11bSA4LWJpdCBlcnJvciAlZlxuIiwgZywgbWF4ZXJyKTsKKworICAgICAgbWF4ZXJyID0gMDsKKyAgICAgIGZvciAoaj0wOyBqPDY1NTM2OyArK2opCisgICAgICB7CisgICAgICAgICBkb3VibGUgY29ycmVjdCA9IHBvdyhqLzY1NTM1LiwgZykgKiA2NTUzNTsKKyAgICAgICAgIHBuZ191aW50XzE2IG91dCA9IHBuZ19nYW1tYV8xNmJpdF9jb3JyZWN0KGosIGdmcCk7CisgICAgICAgICBkb3VibGUgZXJyb3IgPSBvdXQgLSBjb3JyZWN0OworCisgICAgICAgICBpZiAoZmFicyhlcnJvcikgPiBtYXhlcnIpCisgICAgICAgICAgICBtYXhlcnIgPSBmYWJzKGVycm9yKTsKKyAgICAgICAgIGlmIChmYWJzKGVycm9yKSA+IDEuNjIpCisgICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIjE2Yml0ICVkIF4gJWY6IGdvdCAlZCBleHBlY3RlZCAlZiBlcnJvciAlZlxuIiwKKyAgICAgICAgICAgICAgIGosIGcsIG91dCwgY29ycmVjdCwgZXJyb3IpOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoIXNpbGVudCkKKyAgICAgICAgIHByaW50ZigiZ2FtbWEgJWY6IG1heGltdW0gMTYtYml0IGVycm9yICVmXG4iLCBnLCBtYXhlcnIpOworICAgfQorCisgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogVkFMSURBVElPTiBURVNUUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFZhcmlvdXMgdmFsaWRhdGlvbiByb3V0aW5lcyBhcmUgaW5jbHVkZWQgaGVyZWluLCB0aGV5IHJlcXVpcmUgc29tZQorICogZGVmaW5pdGlvbiBmb3IgcG5nX3dhcm5pbmcgYW5kIHBuZ19lcnJvciwgc2VldGluZ3Mgb2YgVkFMSURBVElPTjoKKyAqCisgKiAxOiB2YWxpZGF0ZXMgdGhlIEFTQ0lJIHRvIGZsb2F0aW5nIHBvaW50IGNvbnZlcnNpb25zCisgKiAyOiB2YWxpZGF0ZXMgcG5nX211bGRpdgorICogMzogYWNjdXJhY3kgdGVzdCBvZiBmaXhlZCBwb2ludCBnYW1tYSB0YWJsZXMKKyAqLworCisvKiBUaGUgZm9sbG93aW5nIENPVU5UICgxMF44KSB0YWtlcyBhYm91dCAxIGhvdXIgb24gYSAxR0h6IFBlbnRpdW0gSVYKKyAqIHByb2Nlc3Nvci4KKyAqLworI2RlZmluZSBDT1VOVCAxMDAwMDAwMDAwCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgIGludCBjb3VudCA9IENPVU5UOworCisgICB3aGlsZSAoYXJnYyA+IDEpCisgICB7CisgICAgICBpZiAoYXJnYyA+IDIgJiYgc3RyY21wKGFyZ3ZbMV0sICItYyIpID09IDApCisgICAgICB7CisgICAgICAgICBjb3VudCA9IGF0b2koYXJndlsyXSk7CisgICAgICAgICBhcmdjIC09IDI7CisgICAgICAgICBhcmd2ICs9IDI7CisgICAgICB9CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiLXYiKSA9PSAwKQorICAgICAgeworICAgICAgICAgKyt2ZXJib3NlOworICAgICAgICAgLS1hcmdjOworICAgICAgICAgKythcmd2OworICAgICAgfQorCisgICAgICBlbHNlCisgICAgICAgICBicmVhazsKKyAgIH0KKworICAgaWYgKGNvdW50ID4gMCAmJiBhcmdjID4gMSkKKyAgIHsKKyAgICAgIGlmIChzdHJjbXAoYXJndlsxXSwgImFzY2lpIikgPT0gMCkKKyAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uX2FzY2lpX3RvX2ZwKGNvdW50LCBhcmdjLTEsIGFyZ3YrMSk7CisgICAgICBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImNoZWNrZnAiKSA9PSAwKQorICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25fY2hlY2tmcChjb3VudCwgYXJnYy0xLCBhcmd2KzEpOworICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJtdWxkaXYiKSA9PSAwKQorICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25fbXVsZGl2KGNvdW50LCBhcmdjLTEsIGFyZ3YrMSk7CisgICAgICBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImdhbW1hIikgPT0gMCkKKyAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uX2dhbW1hKGFyZ2MtMSwgYXJndisxKTsKKyAgIH0KKworICAgLyogQmFkIGFyZ3VtZW50OiAqLworICAgZnByaW50ZihzdGRlcnIsCisgICAgICAidXNhZ2U6IHRhcml0aCBbLXZdIFstYyBjb3VudF0ge2FzY2lpLG11bGRpdixnYW1tYX0gW2FyZ3NdXG4iKTsKKyAgIGZwcmludGYoc3RkZXJyLCAiIGFyZ3VtZW50czogYXNjaWkgWy1hIChhbGwgcmVzdWx0cyldIFstZSBlcnJvciUlXVxuIik7CisgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgIGNoZWNrZnAgWy1sIG1heC1udW1iZXItY2hhcnNdXG4iKTsKKyAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgbXVsZGl2XG4iKTsKKyAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgZ2FtbWEgLXMgKHNpbGVudCkgLWcgKG9ubHkgZ2FtbWE7IG5vIGxvZylcbiIpOworICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9saWJ0ZXN0cy90aW1lcG5nLmMgYi9saWJwbmcvY29udHJpYi9saWJ0ZXN0cy90aW1lcG5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M5Mzc5NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL2xpYnRlc3RzL3RpbWVwbmcuYwpAQCAtMCwwICsxLDMwMyBAQAorLyogdGltZXBuZy5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEzIEpvaG4gQ3VubmluZ2hhbSBCb3dsZXIKKyAqCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4xIFtNYXJjaCAyOCwgMjAxM10KKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKyAqCisgKiBMb2FkIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgUE5HIGZpbGVzIChmcm9tIHRoZSBjb21tYW5kIGxpbmUsIG9yLCBpZiB0aGVyZQorICogYXJlIG5vIGFyZ3VtZW50cyBvbiB0aGUgY29tbWFuZCBsaW5lLCBmcm9tIHN0ZGluKSB0aGVuIHJ1biBhIHRpbWUgdGVzdCBieQorICogcmVhZGluZyBlYWNoIGZpbGUgYnkgcm93LiAgVGhlIHRlc3QgZG9lcyBub3RoaW5nIHdpdGggdGhlIHJlYWQgcmVzdWx0IGFuZAorICogZG9lcyBubyB0cmFuc2Zvcm1zLiAgVGhlIG9ubHkgb3V0cHV0IGlzIGEgdGltZSBhcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciBvZgorICogc2Vjb25kcyB3aXRoIDkgZGVjaW1hbCBkaWdpdHMuCisgKi8KKyNkZWZpbmUgX1BPU0lYX0NfU09VUkNFIDE5OTMwOUwgLyogZm9yIGNsb2NrX2dldHRpbWUgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpZiBkZWZpbmVkKEhBVkVfQ09ORklHX0gpICYmICFkZWZpbmVkKFBOR19OT19DT05GSUdfSCkKKyMgIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKy8qIERlZmluZSB0aGUgZm9sbG93aW5nIHRvIHVzZSB0aGlzIHRlc3QgYWdhaW5zdCB5b3VyIGluc3RhbGxlZCBsaWJwbmcsIHJhdGhlcgorICogdGhhbiB0aGUgb25lIGJlaW5nIGJ1aWx0IGhlcmU6CisgKi8KKyNpZmRlZiBQTkdfRlJFRVNUQU5ESU5HX1RFU1RTCisjICBpbmNsdWRlIDxwbmcuaD4KKyNlbHNlCisjICBpbmNsdWRlICIuLi8uLi9wbmcuaCIKKyNlbmRpZgorCitzdGF0aWMgaW50IHJlYWRfcG5nKEZJTEUgKmZwKQoreworICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLDAsMCwwKTsKKyAgIHBuZ19pbmZvcCBpbmZvX3B0ciA9IE5VTEw7CisgICBwbmdfYnl0ZXAgcm93ID0gTlVMTCwgZGlzcGxheSA9IE5VTEw7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm4gMDsKKworICAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZ19wdHIpKSkKKyAgIHsKKyAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsIE5VTEwpOworICAgICAgaWYgKHJvdyAhPSBOVUxMKSBmcmVlKHJvdyk7CisgICAgICBpZiAoZGlzcGxheSAhPSBOVUxMKSBmcmVlKGRpc3BsYXkpOworICAgICAgcmV0dXJuIDA7CisgICB9CisKKyAgIHBuZ19pbml0X2lvKHBuZ19wdHIsIGZwKTsKKworICAgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOworICAgaWYgKGluZm9fcHRyID09IE5VTEwpCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk9PTSBhbGxvY2F0aW5nIGluZm8gc3RydWN0dXJlIik7CisKKyAgIHBuZ19yZWFkX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOworCisgICB7CisgICAgICBwbmdfc2l6ZV90IHJvd2J5dGVzID0gcG5nX2dldF9yb3dieXRlcyhwbmdfcHRyLCBpbmZvX3B0cik7CisKKyAgICAgIHJvdyA9IG1hbGxvYyhyb3dieXRlcyk7CisgICAgICBkaXNwbGF5ID0gbWFsbG9jKHJvd2J5dGVzKTsKKworICAgICAgaWYgKHJvdyA9PSBOVUxMIHx8IGRpc3BsYXkgPT0gTlVMTCkKKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiT09NIGFsbG9jYXRpbmcgcm93IGJ1ZmZlcnMiKTsKKworICAgICAgeworICAgICAgICAgcG5nX3VpbnRfMzIgaGVpZ2h0ID0gcG5nX2dldF9pbWFnZV9oZWlnaHQocG5nX3B0ciwgaW5mb19wdHIpOworICAgICAgICAgaW50IHBhc3NlcyA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOworICAgICAgICAgaW50IHBhc3M7CisKKyAgICAgICAgIHBuZ19zdGFydF9yZWFkX2ltYWdlKHBuZ19wdHIpOworCisgICAgICAgICBmb3IgKHBhc3MgPSAwOyBwYXNzIDwgcGFzc2VzOyArK3Bhc3MpCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfdWludF8zMiB5ID0gaGVpZ2h0OworCisgICAgICAgICAgICAvKiBOT1RFOiB0aGlzIHRyYXNoZXMgdGhlIHJvdyBlYWNoIHRpbWU7IGludGVybGFjZSBoYW5kbGluZyB3b24ndAorICAgICAgICAgICAgICogd29yaywgYnV0IHRoaXMgYXZvaWRzIG1lbW9yeSB0aHJhc2hpbmcgZm9yIHNwZWVkIHRlc3RpbmcuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHdoaWxlICh5LS0gPiAwKQorICAgICAgICAgICAgICAgcG5nX3JlYWRfcm93KHBuZ19wdHIsIHJvdywgZGlzcGxheSk7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIC8qIE1ha2Ugc3VyZSB0byByZWFkIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGU6ICovCisgICBwbmdfcmVhZF9lbmQocG5nX3B0ciwgaW5mb19wdHIpOworICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7CisgICBmcmVlKHJvdyk7CisgICBmcmVlKGRpc3BsYXkpOworICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbXl0aW1lKHN0cnVjdCB0aW1lc3BlYyAqdCkKK3sKKyAgIC8qIERvIHRoZSB0aW1pbmcgdXNpbmcgY2xvY2tfZ2V0dGltZSBhbmQgdGhlIHBlci1wcm9jZXNzIHRpbWVyLiAqLworICAgaWYgKCFjbG9ja19nZXR0aW1lKENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRCwgdCkpCisgICAgICByZXR1cm4gMTsKKworICAgcGVycm9yKCJDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQiKTsKKyAgIGZwcmludGYoc3RkZXJyLCAidGltZXBuZzogY291bGQgbm90IGdldCB0aGUgdGltZVxuIik7CisgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwZXJmb3JtX29uZV90ZXN0KEZJTEUgKmZwLCBpbnQgbmZpbGVzKQoreworICAgaW50IGk7CisgICBzdHJ1Y3QgdGltZXNwZWMgYmVmb3JlLCBhZnRlcjsKKworICAgLyogQ2xlYXIgb3V0IGFsbCBlcnJvcnM6ICovCisgICByZXdpbmQoZnApOworCisgICBpZiAobXl0aW1lKCZiZWZvcmUpKQorICAgeworICAgICAgZm9yIChpPTA7IGk8bmZpbGVzOyArK2kpCisgICAgICB7CisgICAgICAgICBpZiAocmVhZF9wbmcoZnApKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKGZlcnJvcihmcCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwZXJyb3IoInRlbXBvcmFyeSBmaWxlIik7CisgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZpbGUgJWQ6IGVycm9yIHJlYWRpbmcgUE5HIGRhdGFcbiIsIGkpOworICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBlcnJvcigidGVtcG9yYXJ5IGZpbGUiKTsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZmlsZSAlZDogZXJyb3IgZnJvbSBsaWJwbmdcbiIsIGkpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIGVsc2UKKyAgICAgIHJldHVybiAwOworCisgICBpZiAobXl0aW1lKCZhZnRlcikpCisgICB7CisgICAgICAvKiBXb3JrIG91dCB0aGUgdGltZSBkaWZmZXJlbmNlIGFuZCBwcmludCBpdCAtIHRoaXMgaXMgdGhlIG9ubHkgb3V0cHV0LAorICAgICAgICogc28gZmx1c2ggaXQgaW1tZWRpYXRlbHkuCisgICAgICAgKi8KKyAgICAgIHVuc2lnbmVkIGxvbmcgcyA9IGFmdGVyLnR2X3NlYyAtIGJlZm9yZS50dl9zZWM7CisgICAgICBsb25nIG5zID0gYWZ0ZXIudHZfbnNlYyAtIGJlZm9yZS50dl9uc2VjOworCisgICAgICBpZiAobnMgPCAwKQorICAgICAgeworICAgICAgICAgLS1zOworICAgICAgICAgbnMgKz0gMTAwMDAwMDAwMDsKKworICAgICAgICAgaWYgKG5zIDwgMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidGltZXBuZzogYmFkIGNsb2NrIGZyb20ga2VybmVsXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBwcmludGYoIiVsdS4lLjlsZFxuIiwgcywgbnMpOworICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICBpZiAoZmVycm9yKHN0ZG91dCkpCisgICAgICB7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInRpbWVwbmc6IGVycm9yIHdyaXRpbmcgb3V0cHV0XG4iKTsKKyAgICAgICAgIHJldHVybiAwOworICAgICAgfQorCisgICAgICAvKiBTdWNjZXNzZnVsIHJldHVybiAqLworICAgICAgcmV0dXJuIDE7CisgICB9CisKKyAgIGVsc2UKKyAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkZF9vbmVfZmlsZShGSUxFICpmcCwgY2hhciAqbmFtZSkKK3sKKyAgIEZJTEUgKmlwID0gZm9wZW4obmFtZSwgInJiIik7CisKKyAgIGlmIChpcCAhPSBOVUxMKQorICAgeworICAgICAgaW50IGNoOworICAgICAgZm9yICg7OykKKyAgICAgIHsKKyAgICAgICAgIGNoID0gZ2V0YyhpcCk7CisgICAgICAgICBpZiAoY2ggPT0gRU9GKSBicmVhazsKKyAgICAgICAgIHB1dGMoY2gsIGZwKTsKKyAgICAgIH0KKworICAgICAgaWYgKGZlcnJvcihpcCkpCisgICAgICB7CisgICAgICAgICBwZXJyb3IobmFtZSk7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiByZWFkIGVycm9yXG4iLCBuYW1lKTsKKyAgICAgICAgIHJldHVybiAwOworICAgICAgfQorCisgICAgICAodm9pZClmY2xvc2UoaXApOworCisgICAgICBpZiAoZmVycm9yKGZwKSkKKyAgICAgIHsKKyAgICAgICAgIHBlcnJvcigidGVtcG9yYXJ5IGZpbGUiKTsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidGVtcG9yYXJ5IGZpbGUgd3JpdGUgZXJyb3JcbiIpOworICAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICB9CisKKyAgIGVsc2UKKyAgIHsKKyAgICAgIHBlcnJvcihuYW1lKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG9wZW4gZmFpbGVkXG4iLCBuYW1lKTsKKyAgICAgIHJldHVybiAwOworICAgfQorCisgICByZXR1cm4gMTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgaW50IG9rID0gMDsKKyAgIEZJTEUgKmZwID0gdG1wZmlsZSgpOworCisgICBpZiAoZnAgIT0gTlVMTCkKKyAgIHsKKyAgICAgIGludCBlcnIgPSAwOworICAgICAgaW50IG5maWxlcyA9IDA7CisKKyAgICAgIGlmIChhcmdjID4gMSkKKyAgICAgIHsKKyAgICAgICAgIGludCBpOworCisgICAgICAgICBmb3IgKGk9MTsgaTxhcmdjOyArK2kpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAoYWRkX29uZV9maWxlKGZwLCBhcmd2W2ldKSkKKyAgICAgICAgICAgICAgICsrbmZpbGVzOworCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBlcnIgPSAxOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGNoYXIgZmlsZW5hbWVbRklMRU5BTUVfTUFYKzFdOworCisgICAgICAgICB3aGlsZSAoZmdldHMoZmlsZW5hbWUsIEZJTEVOQU1FX01BWCsxLCBzdGRpbikpCisgICAgICAgICB7CisgICAgICAgICAgICBzaXplX3QgbGVuID0gc3RybGVuKGZpbGVuYW1lKTsKKworICAgICAgICAgICAgaWYgKGZpbGVuYW1lW2xlbi0xXSA9PSAnXG4nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZmlsZW5hbWVbbGVuLTFdID0gMDsKKyAgICAgICAgICAgICAgIGlmIChhZGRfb25lX2ZpbGUoZnAsIGZpbGVuYW1lKSkKKyAgICAgICAgICAgICAgICAgICsrbmZpbGVzOworCisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBlcnIgPSAxOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidGltZXBuZzogdHJ1bmNhdGVkIGZpbGUgbmFtZSAuLi4lc1xuIiwKKyAgICAgICAgICAgICAgICAgIGZpbGVuYW1lK2xlbi0zMik7CisgICAgICAgICAgICAgICBlcnIgPSAxOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIGlmIChmZXJyb3Ioc3RkaW4pKQorICAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ0aW1lcG5nOiBzdGRpbjogcmVhZCBlcnJvclxuIik7CisgICAgICAgICAgICBlcnIgPSAxOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoIWVycikKKyAgICAgIHsKKyAgICAgICAgIGlmIChuZmlsZXMgPiAwKQorICAgICAgICAgICAgb2sgPSBwZXJmb3JtX29uZV90ZXN0KGZwLCBuZmlsZXMpOworCisgICAgICAgICBlbHNlCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiB0aW1lcG5nIHtmaWxlc30gb3IgbHMgZmlsZXMgfCB0aW1lcG5nXG4iKTsKKyAgICAgIH0KKworICAgICAgKHZvaWQpZmNsb3NlKGZwKTsKKyAgIH0KKworICAgZWxzZQorICAgICAgZnByaW50ZihzdGRlcnIsICJ0aW1lcG5nOiBjb3VsZCBub3Qgb3BlbiB0ZW1wb3JhcnkgZmlsZVxuIik7CisKKyAgIC8qIEV4aXQgY29kZSAwIG9uIHN1Y2Nlc3MuICovCisgICByZXR1cm4gb2sgPT0gMDsKK30KZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ21pbmltL1JFQURNRSBiL2xpYnBuZy9jb250cmliL3BuZ21pbmltL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTdmZTM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vUkVBRE1FCkBAIC0wLDAgKzEsNSBAQAorCitUaGlzIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIFBOR19VU0VSX0NPTkZJRywgcG5ndXNyLmggYW5kIHBuZ3Vzci5kZmEKK3RvIGJ1aWxkIG1pbmltYWwgZGVjb2RlciwgZW5jb2RlciwgYW5kIHByb2dyZXNzaXZlIHJlYWRlciBhcHBsaWNhdGlvbnMuCisKK1NlZSB0aGUgaW5kaXZpZHVhbCBSRUFETUUgYW5kIHBuZ3Vzci5kZmEgZmlsZXMgZm9yIG1vcmUgZXhwbGFuYXRpb24uCmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9kZWNvZGVyL1JFQURNRSBiL2xpYnBuZy9jb250cmliL3BuZ21pbmltL2RlY29kZXIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhOTc5ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9kZWNvZGVyL1JFQURNRQpAQCAtMCwwICsxLDEwIEBACitUaGlzIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIFBOR19VU0VSX0NPTkZJRywgcG5ndXNyLmggYW5kIHBuZ3Vzci5kZmEKKworVGhlIG1ha2VmaWxlIGJ1aWxkcyBhIG1pbmltYWwgcmVhZC1vbmx5IGRlY29kZXIgd2l0aCBlbWJlZGRlZCBsaWJwbmcKK2FuZCB6bGliLgorCitTcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiB0aGUgemxpYiBzb3VyY2UgKDEuMi4xIG9yIGxhdGVyKSBhcyBaTElCU1JDCitvbiB0aGUgbWFrZSBjb21tYW5kIGxpbmUuCisKK0lmIHlvdSBwcmVmZXIgdG8gdXNlIHRoZSBzaGFyZWQgbGlicmFyaWVzLCBnbyB0byBjb250cmliL3BuZ21pbnVzCithbmQgYnVpbGQgdGhlIHBuZzJwbm0gYXBwbGljYXRpb24gdGhlcmUuCmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9kZWNvZGVyL21ha2VmaWxlIGIvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vZGVjb2Rlci9tYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWNmM2MxCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vZGVjb2Rlci9tYWtlZmlsZQpAQCAtMCwwICsxLDE1MSBAQAorIyBNYWtlZmlsZSBmb3IgUG5nTWludXMgKHBuZ20ycG5tKQorIyBMaW51eCAvIFVuaXgKKworI0NDPWNjCitDQz1nY2MKK0xEPSQoQ0MpCisKKyMgSWYgYXdrIGZhaWxzIHRyeQorIyBtYWtlIEFXSz1uYXdrCisKKyMgSWYgY3BwIGZhaWxzIHRyeQorIyBtYWtlIENQUD0vbGliL2NwcAorCitSTT1ybSAtZgorQ09QWT1jcAorCitDUFBGTEFHUz0tSS4gLURQTkdfVVNFUl9DT05GSUcgLUROT19HWkNPTVBSRVNTIC1EWl9TT0xPIC1ETk9fR1pJUAorQ0ZMQUdTPS1PMSAtV2FsbAorCitDPS5jCitPPS5vCitMPS5hCitFPQorCisjIFdoZXJlIHRvIGZpbmQgdGhlIHNvdXJjZSBjb2RlOgorUE5HU1JDID0uLi8uLi8uLgorWkxJQlNSQz0kKFBOR1NSQykvLi4vemxpYgorUFJPR1NSQz0kKFBOR1NSQykvY29udHJpYi9wbmdtaW51cworCisjIFpsaWIgKG1pbmltYWwgaW5mbGF0ZSByZXF1aXJlbWVudHMgLSBjcmMzMiBpcyB1c2VkIGJ5IGxpYnBuZykKKyMgenV0aWwgY2FuIGJlIGVsaW1pbmF0ZWQgaWYgeW91IHByb3ZpZGUgeW91ciBvd24gemNhbGxvYyBhbmQgemNmcmVlCitaU1JDUyAgPSBhZGxlcjMyJChDKSBjcmMzMiQoQykgXAorCSBpbmZmYXN0JChDKSBpbmZsYXRlJChDKSBpbmZ0cmVlcyQoQykgXAorCSB6dXRpbCQoQykKKworIyBTdGFuZGFyZCBoZWFkZXJzCitaSCAgICAgPSB6bGliLmggY3JjMzIuaCBpbmZmYXN0LmggaW5mZml4ZWQuaCBcCisJIGluZmxhdGUuaCBpbmZ0cmVlcy5oIHp1dGlsLmgKKworIyBNYWNoaW5lIGdlbmVyYXRlZCBoZWFkZXJzCitaQ09ORiAgPSB6Y29uZi5oCisKKyMgSGVhZGVycyBjYWxsZXJzIHVzZQorWklOQyAgID0gemxpYi5oICQoWkNPTkYpCisKKyMgSGVhZGVycyB0aGUgWmxpYiBzb3VyY2UgdXNlcworWkhEUlMgID0gJChaSCkgJChaQ09ORikKKworWk9CSlMgID0gYWRsZXIzMiQoTykgY3JjMzIkKE8pIFwKKwkgaW5mZmFzdCQoTykgaW5mbGF0ZSQoTykgaW5mdHJlZXMkKE8pIFwKKwkgenV0aWwkKE8pCisKKyMgbGlicG5nCitQTkdTUkNTPXBuZyQoQykgcG5nZXJyb3IkKEMpIHBuZ2dldCQoQykgcG5nbWVtJChDKSBcCisJcG5ncmVhZCQoQykgcG5ncmlvJChDKSBwbmdydHJhbiQoQykgcG5ncnV0aWwkKEMpIFwKKwlwbmdzZXQkKEMpIHBuZ3RyYW5zJChDKQorCQorIyBTdGFuZGFyZCBoZWFkZXJzCitQTkdIICAgPXBuZy5oIHBuZ2NvbmYuaCBwbmdkZWJ1Zy5oIHBuZ2luZm8uaCBwbmdwcml2LmggcG5nc3RydWN0LmgKKworIyBNYWNoaW5lIGdlbmVyYXRlZCBoZWFkZXJzCitQTkdDT05GPXBuZ2xpYmNvbmYuaAorCisjIEhlYWRlcnMgY2FsbGVycyB1c2UKK1BOR0lOQz0gcG5nLmggcG5nY29uZi5oIHBuZ3Vzci5oICQoUE5HQ09ORikKKworIyBIZWFkZXJzIHRoZSBQTkcgbGlicmFyeSB1c2VzCitQTkdIRFJTPSQoUE5HSCkgJChQTkdDT05GKSBwbmd1c3IuaAorCitQTkdPQkpTPXBuZyQoTykgcG5nZXJyb3IkKE8pIHBuZ2dldCQoTykgcG5nbWVtJChPKSBcCisJcG5ncmVhZCQoTykgcG5ncmlvJChPKSBwbmdydHJhbiQoTykgcG5ncnV0aWwkKE8pIFwKKwlwbmdzZXQkKE8pIHBuZ3RyYW5zJChPKQorCitQUk9HU1JDUz0gcG5nbTJwbm0kKEMpCitQUk9HSERSUz0KK1BST0dET0NTPQorUFJPR09CSlM9IHBuZ20ycG5tJChPKQorCitPQkpTICAgID0gJChQUk9HT0JKUykgJChQTkdPQkpTKSAkKFpPQkpTKQorCisjIGltcGxpY2l0IG1ha2UgcnVsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIG5vdGU6IGRlcGVuZGVuY2llcyBkbyBub3Qgd29yayBvbiBpbXBsaWNpdCBydWxlIGxpbmVzCisuYyQoTyk6CisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQ8CisKKyMgZGVwZW5kZW5jaWVzCisKK2FsbDogcG5nbTJwbm0kKEUpCisKK3BuZ20ycG5tJChFKTogJChPQkpTKQorCSQoTEQpIC1vIHBuZ20ycG5tJChFKSAkKE9CSlMpCisKKyMgVGhlIERGQV9YVFJBIHNldHRpbmcgdHVybnMgYWxsIGxpYnBuZyBvcHRpb25zIG9mZiB0aGVuCisjIHR1cm5zIG9uIHRob3NlIHJlcXVpcmVkIGZvciB0aGlzIG1pbmltYWwgYnVpbGQuCisjIFRoZSBDUFBfRkxBR1Mgc2V0dGluZyBjYXVzZXMgcG5ndXNyLmggdG8gYmUgaW5jbHVkZWQgaW4KKyMgYm90aCB0aGUgYnVpbGQgb2YgcG5nbGliY29uZi5oIGFuZCwgc3Vic2VxdWVudGx5LCB3aGVuCisjIGJ1aWxkaW5nIGxpYnBuZyBpdHNlbGYuCiskKFBOR0NPTkYpOiAkKFBOR1NSQykvc2NyaXB0cy9wbmdsaWJjb25mLm1hayAkKFpIKVwKKwkkKFBOR1NSQykvc2NyaXB0cy9wbmdsaWJjb25mLmRmYSBcCisJJChQTkdTUkMpL3NjcmlwdHMvb3B0aW9ucy5hd2sgcG5ndXNyLmggcG5ndXNyLmRmYQorCSQoUk0pIHBuZ2xpYmNvbmYuaCBwbmdsaWJjb25mLmRmbgorCSQoTUFLRSkgLWYgJChQTkdTUkMpL3NjcmlwdHMvcG5nbGliY29uZi5tYWsgJChNQUtFRkxBR1MpXAorCSAgICBzcmNkaXI9JChQTkdTUkMpIENQUEZMQUdTPSItRFBOR19VU0VSX0NPTkZJRyAtSS4iXAorCSAgICBERkFfWFRSQT0icG5ndXNyLmRmYSIgJEAKKworY2xlYW46CisJJChNQUtFKSAtZiAkKFBOR1NSQykvc2NyaXB0cy9wbmdsaWJjb25mLm1hayAkKE1BS0VGTEFHUylcCisJICAgIHNyY2Rpcj0kKFBOR1NSQykgY2xlYW4KKwkkKFJNKSBwbmdtMnBubSQoTykKKwkkKFJNKSBwbmdtMnBubSQoRSkKKwkkKFJNKSAkKE9CSlMpCisKKyMgZGlzdGNsZWFuIGFsc28gcmVtb3ZlcyB0aGUgY29waWVkIHNvdXJjZSBhbmQgaGVhZGVycworZGlzdGNsZWFuOiBjbGVhbgorCSQoUk0pIC1yIHNjcmlwdHMgIyBoaXN0b3JpY2FsIHJlYXNvbnMKKwkkKFJNKSAkKFBOR1NSQ1MpICQoUE5HSCkKKwkkKFJNKSAkKFpTUkNTKSAkKFpIKSAkKFpDT05GKQorCSQoUk0pICQoUFJPR1NSQ1MpICQoUFJPR0hEUlMpICQoUFJPR0RPQ1MpCisKKyMgSGVhZGVyIGZpbGUgZGVwZW5kZW5jaWVzOgorJChQUk9HT0JKUyk6ICQoUFJPR0hEUlMpICQoUE5HSU5DKSAkKFpJTkMpCiskKFBOR09CSlMpOiAkKFBOR0hEUlMpICQoWklOQykKKyQoWk9CSlMpOiAkKFpIRFJTKQorCisjIEdhdGhlciB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgcmVzcGVjdGl2ZSBkaXJlY3RvcmllcworJChQTkdTUkNTKSAkKFBOR0gpOiAkKFBOR1NSQykvJEAKKwkkKFJNKSAkQAorCSQoQ09QWSkgJChQTkdTUkMpLyRAICRACisKKyMgTm8gZGVwZW5kZW5jeSBvbiB0aGUgWkxJQlNSQyB0YXJnZXQgc28gdGhhdCBpdCBvbmx5IG5lZWRzCisjIHRvIGJlIHNwZWNpZmllZCBvbmNlLgorJChaU1JDUykgJChaSCk6CisJJChSTSkgJEAKKwkkKENPUFkpICQoWkxJQlNSQykvJEAgJEAKKworIyBUaGUgdW5jb25maWd1cmVkIHpjb25mLmggdmFyaWVzIGluIG5hbWUgYWNjb3JkaW5nIHRvIHRoZQorIyB6bGliIHJlbGVhc2UKKyQoWkNPTkYpOgorCSQoUk0pICRACisJQGZvciBmIGluIHpjb25mLmguaW4gemNvbmYuaW4uaCB6Y29uZi5oOyBkb1wKKwkgICAgdGVzdCAtciAkKFpMSUJTUkMpLyQkZiAmJlwKKwkgICAgZWNobyAkKENPUFkpICQoWkxJQlNSQykvJCRmICRAICYmXAorCSAgICAkKENPUFkpICQoWkxJQlNSQykvJCRmICRAICYmIGV4aXQgMDtcCisJZG9uZTsgZWNobyBjb3B5OiAkKFpMSUJTUkMpL3pjb25mLmggbm90IGZvdW5kOyBleGl0IDEKKworcG5nbTJwbm0uYzogJChQUk9HU1JDKS9wbmcycG5tLmMKKwkkKFJNKSAkQAorCSQoQ09QWSkgJChQUk9HU1JDKS9wbmcycG5tLmMgJEAKKworIyBFbmQgb2YgbWFrZWZpbGUgZm9yIHBuZ20ycG5tCmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9kZWNvZGVyL3BuZ3Vzci5kZmEgYi9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9kZWNvZGVyL3BuZ3Vzci5kZmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY0MDI3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL3BuZ21pbmltL2RlY29kZXIvcG5ndXNyLmRmYQpAQCAtMCwwICsxLDQwIEBACisjIHBuZ21pbmltL2RlY29kZXIvcG5ndXNyLmRmYQorIworIyBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMyBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyMKKyMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorIyBhbmQgbGljZW5zZSBpbiBwbmcuaAorCisjIEZpcnN0IGFsbCB0aGUgYnVpbGQgb3B0aW9ucyBvZmY6CisKK2V2ZXJ5dGhpbmcgPSBvZmYKKworIyBBbGwgdGhhdCBpcyByZXF1aXJlZCBpcyBzb21lIHJlYWQgY29kZS4gVGhpcyBleGFtcGxlIHN3aXRjaGVzCisjIG9uIHRoZSBzZXF1ZW50aWFsIHJlYWQgY29kZSAoc2VlIC4uL3ByZWFkZXIgZm9yIGEgcHJvZ3Jlc3NpdmUKKyMgcmVhZCBleGFtcGxlKS4KKworb3B0aW9uIFNFUVVFTlRJQUxfUkVBRCBvbgorCisjIFlvdSBtdXN0IGNob29zZSBmaXhlZCBvciBmbG9hdGluZyBwb2ludCBhcml0aG1ldGljOgorIyBvcHRpb24gRkxPQVRJTkdfUE9JTlQgb24KKworb3B0aW9uIEZJWEVEX1BPSU5UIG9uCisKKyMgWW91IG11c3QgY2hvc2UgdGhlIGludGVybmFsIGZpeGVkIHBvaW50IGltcGxlbWVudGF0aW9uIG9yIHRvCisjIHVzZSB0aGUgc3lzdGVtIGZsb2F0aW5nIHBvaW50LiAgVGhlIGxhdHRlciBpcyBjb25zaWRlcmFibHkKKyMgc21hbGxlciAoYnkgYWJvdXQgMWtieXRlIG9uIGFuIHg4NiBzeXN0ZW0pOgorIyBvcHRpb24gRkxPQVRJTkdfQVJJVEhNRVRJQyBvbgorCitvcHRpb24gRkxPQVRJTkdfQVJJVEhNRVRJQyBvZmYKKworIyBZb3VyIHByb2dyYW0gd2lsbCBwcm9iYWJseSBuZWVkIG90aGVyIG9wdGlvbnMuICBUaGUgZXhhbXBsZQorIyBwcm9ncmFtIGhlcmUsIHBuZ20ycG5tLCByZXF1aXJlcyB0aGUgZm9sbG93aW5nLiAgVGFrZSBhIGxvb2sKKyMgYXQgcG5nbGliY29uZi5oIHRvIGZpbmQgb3V0IHRoZSBmdWxsIHNldCBvZiB3aGF0IGhhcyB0byBiZQorIyBlbmFibGVkIHRvIG1ha2UgdGhlIGZvbGxvd2luZyB3b3JrLgorCitvcHRpb24gU0VUSk1QIG9uCitvcHRpb24gU1RESU8gb24KK29wdGlvbiBSRUFEX0VYUEFORCBvbgorb3B0aW9uIFJFQURfU1RSSVBfMTZfVE9fOCBvbgorb3B0aW9uIFVTRVJfTElNSVRTIG9uCmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9kZWNvZGVyL3BuZ3Vzci5oIGIvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vZGVjb2Rlci9wbmd1c3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmQ3ODkwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vZGVjb2Rlci9wbmd1c3IuaApAQCAtMCwwICsxLDIzIEBACisvKiBtaW5yZHBuZ2NvbmYuaDogaGVhZGVycyB0byBtYWtlIGEgbWluaW1hbCBwbmctcmVhZC1vbmx5IGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAtMjAxMyBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKyAqCisgKiBEZXJpdmVkIGZyb20gcG5nY3J1c2guaCwgQ29weXJpZ2h0IDE5OTgtMjAwNywgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKi8KKworI2lmbmRlZiBNSU5SRFBOR0NPTkZfSAorI2RlZmluZSBNSU5SRFBOR0NPTkZfSAorCisvKiBUbyBpbmNsdWRlIHBuZ3Vzci5oIHNldCAtRFBOR19VU0VSX0NPTkZJRyBpbiBDUFBGTEFHUyAqLworCisvKiBMaXN0IG9wdGlvbnMgdG8gdHVybiBvZmYgZmVhdHVyZXMgb2YgdGhlIGJ1aWxkIHRoYXQgZG8gbm90CisgKiBhZmZlY3QgdGhlIEFQSSAoc28gYXJlIG5vdCByZWNvcmRlZCBpbiBwbmdsaWJjb25mLmgpCisgKi8KKworI2RlZmluZSBQTkdfQUxJR05fVFlQRSBQTkdfQUxJR05fTk9ORQorCisjZW5kaWYgLyogTUlOUkRQTkdDT05GX0ggKi8KZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ21pbmltL2VuY29kZXIvUkVBRE1FIGIvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vZW5jb2Rlci9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhkOWE2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL3BuZ21pbmltL2VuY29kZXIvUkVBRE1FCkBAIC0wLDAgKzEsMTAgQEAKK1RoaXMgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgUE5HX1VTRVJfQ09ORklHIGFuZCBwbmd1c3IuaAorCitUaGUgbWFrZWZpbGUgYnVpbGRzIGEgbWluaW1hbCB3cml0ZS1vbmx5IGVuY29kZXIgd2l0aCBlbWJlZGRlZCBsaWJwbmcKK2FuZCB6bGliLgorCitTcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiB0aGUgemxpYiBzb3VyY2UgKDEuMi4xIG9yIGxhdGVyKSBhcyBaTElCU1JDCitvbiB0aGUgbWFrZSBjb21tYW5kIGxpbmUuCisKK0lmIHlvdSBwcmVmZXIgdG8gdXNlIHRoZSBzaGFyZWQgbGlicmFyaWVzLCBnbyB0byBjb250cmliL3BuZ21pbnVzCithbmQgYnVpbGQgdGhlIHBubTJwbmcgYXBwbGljYXRpb24gdGhlcmUuCmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9lbmNvZGVyL21ha2VmaWxlIGIvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vZW5jb2Rlci9tYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWIyMDVjCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vZW5jb2Rlci9tYWtlZmlsZQpAQCAtMCwwICsxLDE1MCBAQAorIyBNYWtlZmlsZSBmb3IgUG5nTWludXMgKHBubTJwbmdtKQorIyBMaW51eCAvIFVuaXgKKworI0NDPWNjCitDQz1nY2MKK0xEPSQoQ0MpCisKKyMgSWYgYXdrIGZhaWxzIHRyeQorIyBtYWtlIEFXSz1uYXdrCisKKyMgSWYgY3BwIGZhaWxzIHRyeQorIyBtYWtlIENQUD0vbGliL2NwcAorCitSTT1ybSAtZgorQ09QWT1jcAorCitDUFBGTEFHUz0tSS4gLURQTkdfVVNFUl9DT05GSUcgLUROT19HWkNPTVBSRVNTIC1EWl9TT0xPIC1ETk9fR1pJUAorQ0ZMQUdTPS1PMSAtV2FsbAorCitDPS5jCitPPS5vCitMPS5hCitFPQorCisjIFdoZXJlIHRvIGZpbmQgdGhlIHNvdXJjZSBjb2RlOgorUE5HU1JDID0uLi8uLi8uLgorWkxJQlNSQz0kKFBOR1NSQykvLi4vemxpYgorUFJPR1NSQz0kKFBOR1NSQykvY29udHJpYi9wbmdtaW51cworCisjIFpsaWIKK1pTUkNTICA9IGFkbGVyMzIkKEMpIGNvbXByZXNzJChDKSBjcmMzMiQoQykgZGVmbGF0ZSQoQykgXAorCSB0cmVlcyQoQykgenV0aWwkKEMpCisKKyMgU3RhbmRhcmQgaGVhZGVycworI1pIICAgICA9IHpsaWIuaCBjcmMzMi5oIGRlZmxhdGUuaCB0cmVlcy5oIHp1dGlsLmgKK1pIICAgICA9IHpsaWIuaCBjcmMzMi5oIGRlZmxhdGUuaCB0cmVlcy5oIHp1dGlsLmgKKworIyBNYWNoaW5lIGdlbmVyYXRlZCBoZWFkZXJzCitaQ09ORiAgPSB6Y29uZi5oCisKKyMgSGVhZGVycyBjYWxsZXJzIHVzZQorWklOQyAgID0gemxpYi5oICQoWkNPTkYpCisKKyMgSGVhZGVycyB0aGUgWmxpYiBzb3VyY2UgdXNlcworWkhEUlMgID0gJChaSCkgJChaQ09ORikKKworIyBjb21wcmVzcyBpcyBub3QgcmVxdWlyZWQ7IGl0IGlzIG5lZWRlZCB0byBsaW5rIHRoZSB6bGliCisjIGNvZGUgYmVjYXVzZSBkZWZsYXRlIGRlZmluZXMgYW4gdW51c2VkIEFQSSBmdW5jdGlvbiBkZWZsYXRlQm91bmQKKyMgd2hpY2ggaXRzZWxmIGNhbGxzIGNvbXByZXNzQm91bmQgZnJvbSBjb21wcmVzcy4KK1pPQkpTICA9IGFkbGVyMzIkKE8pIGNvbXByZXNzJChPKSBjcmMzMiQoTykgZGVmbGF0ZSQoTykgXAorCSB0cmVlcyQoTykgenV0aWwkKE8pCisKKyMgbGlicG5nCitQTkdTUkNTPXBuZyQoQykgcG5nZXJyb3IkKEMpIHBuZ2dldCQoQykgcG5nbWVtJChDKSBcCisJcG5nc2V0JChDKSBwbmd0cmFucyQoQykgcG5nd2lvJChDKSBwbmd3cml0ZSQoQykgXAorCXBuZ3d0cmFuJChDKSBwbmd3dXRpbCQoQykKKworIyBTdGFuZGFyZCBoZWFkZXJzCitQTkdIICAgPXBuZy5oIHBuZ2NvbmYuaCBwbmdkZWJ1Zy5oIHBuZ2luZm8uaCBwbmdwcml2LmggcG5nc3RydWN0LmgKKworIyBNYWNoaW5lIGdlbmVyYXRlZCBoZWFkZXJzCitQTkdDT05GPXBuZ2xpYmNvbmYuaAorCisjIEhlYWRlcnMgY2FsbGVycyB1c2UKK1BOR0lOQz0gcG5nLmggcG5nY29uZi5oIHBuZ3Vzci5oICQoUE5HQ09ORikKKworIyBIZWFkZXJzIHRoZSBQTkcgbGlicmFyeSB1c2VzCitQTkdIRFJTPSQoUE5HSCkgJChQTkdDT05GKSBwbmd1c3IuaAorCitQTkdPQkpTPXBuZyQoTykgcG5nZXJyb3IkKE8pIHBuZ2dldCQoTykgcG5nbWVtJChPKSBcCisJcG5nc2V0JChPKSBwbmd0cmFucyQoTykgcG5nd2lvJChPKSBwbmd3cml0ZSQoTykgXAorCXBuZ3d0cmFuJChPKSBwbmd3dXRpbCQoTykKKworUFJPR1NSQ1M9IHBubTJwbmdtJChDKQorUFJPR0hEUlM9CitQUk9HRE9DUz0KK1BST0dPQkpTPSBwbm0ycG5nbSQoTykKKworT0JKUyAgICA9ICQoUFJPR09CSlMpICQoUE5HT0JKUykgJChaT0JKUykKKworIyBpbXBsaWNpdCBtYWtlIHJ1bGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLmMkKE8pOgorCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkPAorCisjIGRlcGVuZGVuY2llcworCithbGw6IHBubTJwbmdtJChFKQorCitwbm0ycG5nbSQoRSk6ICQoT0JKUykKKwkkKExEKSAtbyBwbm0ycG5nbSQoRSkgJChPQkpTKQorCisjIFRoZSBERkFfWFRSQSBzZXR0aW5nIHR1cm5zIGFsbCBsaWJwbmcgb3B0aW9ucyBvZmYgdGhlbgorIyB0dXJucyBvbiB0aG9zZSByZXF1aXJlZCBmb3IgdGhpcyBtaW5pbWFsIGJ1aWxkLgorIyBUaGUgQ1BQX0ZMQUdTIHNldHRpbmcgY2F1c2VzIHBuZ3Vzci5oIHRvIGJlIGluY2x1ZGVkIGluCisjIGJvdGggdGhlIGJ1aWxkIG9mIHBuZ2xpYmNvbmYuaCBhbmQsIHN1YnNlcXVlbnRseSwgd2hlbgorIyBidWlsZGluZyBsaWJwbmcgaXRzZWxmLgorJChQTkdDT05GKTogJChQTkdTUkMpL3NjcmlwdHMvcG5nbGliY29uZi5tYWsgJChaSClcCisJJChQTkdTUkMpL3NjcmlwdHMvcG5nbGliY29uZi5kZmEgXAorCSQoUE5HU1JDKS9zY3JpcHRzL29wdGlvbnMuYXdrIHBuZ3Vzci5oIHBuZ3Vzci5kZmEKKwkkKFJNKSBwbmdsaWJjb25mLmggcG5nbGliY29uZi5kZm4KKwkkKE1BS0UpIC1mICQoUE5HU1JDKS9zY3JpcHRzL3BuZ2xpYmNvbmYubWFrICQoTUFLRUZMQUdTKVwKKwkgICAgc3JjZGlyPSQoUE5HU1JDKSBDUFBGTEFHUz0iLURQTkdfVVNFUl9DT05GSUcgLUkuIlwKKwkgICAgREZBX1hUUkE9InBuZ3Vzci5kZmEiICRACisKK2NsZWFuOgorCSQoTUFLRSkgLWYgJChQTkdTUkMpL3NjcmlwdHMvcG5nbGliY29uZi5tYWsgJChNQUtFRkxBR1MpXAorCSAgICBzcmNkaXI9JChQTkdTUkMpIGNsZWFuCisJJChSTSkgcG5tMnBuZ20kKE8pCisJJChSTSkgcG5tMnBuZ20kKEUpCisJJChSTSkgJChPQkpTKQorCisjIGRpc3RjbGVhbiBhbHNvIHJlbW92ZXMgdGhlIGNvcGllZCBzb3VyY2UgYW5kIGhlYWRlcnMKK2Rpc3RjbGVhbjogY2xlYW4KKwkkKFJNKSAtciBzY3JpcHRzICMgaGlzdG9yaWNhbCByZWFzb25zCisJJChSTSkgJChQTkdTUkNTKSAkKFBOR0gpCisJJChSTSkgJChaU1JDUykgJChaSCkgJChaQ09ORikKKwkkKFJNKSAkKFBST0dTUkNTKSAkKFBST0dIRFJTKSAkKFBST0dET0NTKQorCisjIEhlYWRlciBmaWxlIGRlcGVuZGVuY2llczoKKyQoUFJPR09CSlMpOiAkKFBST0dIRFJTKSAkKFBOR0lOQykgJChaSU5DKQorJChQTkdPQkpTKTogJChQTkdIRFJTKSAkKFpJTkMpCiskKFpPQkpTKTogJChaSERSUykKKworIyBHYXRoZXIgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHJlc3BlY3RpdmUgZGlyZWN0b3JpZXMKKyQoUE5HU1JDUykgJChQTkdIKTogJChQTkdTUkMpLyRACisJJChSTSkgJEAKKwkkKENPUFkpICQoUE5HU1JDKS8kQCAkQAorCisjIE5vIGRlcGVuZGVuY3kgb24gdGhlIFpMSUJTUkMgdGFyZ2V0IHNvIHRoYXQgaXQgb25seSBuZWVkcworIyB0byBiZSBzcGVjaWZpZWQgb25jZS4KKyQoWlNSQ1MpICQoWkgpOgorCSQoUk0pICRACisJJChDT1BZKSAkKFpMSUJTUkMpLyRAICRACisKKyMgVGhlIHVuY29uZmlndXJlZCB6Y29uZi5oIHZhcmllcyBpbiBuYW1lIGFjY29yZGluZyB0byB0aGUKKyMgemxpYiByZWxlYXNlCiskKFpDT05GKToKKwkkKFJNKSAkQAorCUBmb3IgZiBpbiB6Y29uZi5oLmluIHpjb25mLmluLmggemNvbmYuaDsgZG9cCisJICAgIHRlc3QgLXIgJChaTElCU1JDKS8kJGYgJiZcCisJICAgIGVjaG8gJChDT1BZKSAkKFpMSUJTUkMpLyQkZiAkQCAmJlwKKwkgICAgJChDT1BZKSAkKFpMSUJTUkMpLyQkZiAkQCAmJiBleGl0IDA7XAorCWRvbmU7IGVjaG8gY29weTogJChaTElCU1JDKS96Y29uZi5oIG5vdCBmb3VuZDsgZXhpdCAxCisKK3BubTJwbmdtLmM6ICQoUFJPR1NSQykvcG5tMnBuZy5jCisJJChSTSkgJEAKKwkkKENPUFkpICQoUFJPR1NSQykvcG5tMnBuZy5jICRACisKKyMgRW5kIG9mIG1ha2VmaWxlIGZvciBwbm0ycG5nbQpkaWZmIC0tZ2l0IGEvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vZW5jb2Rlci9wbmd1c3IuZGZhIGIvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vZW5jb2Rlci9wbmd1c3IuZGZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYzI0ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9lbmNvZGVyL3BuZ3Vzci5kZmEKQEAgLTAsMCArMSwzOSBAQAorIyBwbmdtaW5pbS9lbmNvZGVyL3BuZ3Vzci5kZmEKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTMgR2xlbm4gUmFuZGVycy1QZWhyc29uCisjCisjIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisjIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKworIyBGaXJzdCBhbGwgdGhlIGJ1aWxkIG9wdGlvbnMgb2ZmOgorCitldmVyeXRoaW5nID0gb2ZmCisKKyMgU3dpdGNoIG9uIHRoZSB3cml0ZSBjb2RlIC0gdGhpcyBtYWtlcyBhIG1pbmltYWxpc3QgZW5jb2RlcgorCitvcHRpb24gV1JJVEUgb24KKworIyBUaGVzZSAyIG9wdGlvbnMgYXJlIHJlcXVpcmVkIGlmIHlvdSBuZWVkIHRvIHJlYWQgUEJNIChQMSBvciBQNCkgZmlsZXMuCitvcHRpb24gV1JJVEVfSU5WRVJUIG9uCitvcHRpb24gV1JJVEVfUEFDSyBvbgorCisjIFlvdSBtdXN0IGNob29zZSBmaXhlZCBvciBmbG9hdGluZyBwb2ludCBhcml0aG1ldGljOgorIyBvcHRpb24gRkxPQVRJTkdfUE9JTlQgb24KKworb3B0aW9uIEZJWEVEX1BPSU5UIG9uCisKKyMgWW91IG11c3QgY2hvc2UgdGhlIGludGVybmFsIGZpeGVkIHBvaW50IGltcGxlbWVudGF0aW9uIG9yIHRvCisjIHVzZSB0aGUgc3lzdGVtIGZsb2F0aW5nIHBvaW50LiAgVGhlIGxhdHRlciBpcyBjb25zaWRlcmFibHkKKyMgc21hbGxlciAoYnkgYWJvdXQgMWtieXRlIG9uIGFuIHg4NiBzeXN0ZW0pOgorIyBvcHRpb24gRkxPQVRJTkdfQVJJVEhNRVRJQyBvbgorCitvcHRpb24gRkxPQVRJTkdfQVJJVEhNRVRJQyBvZmYKKworIyBZb3VyIHByb2dyYW0gd2lsbCBwcm9iYWJseSBuZWVkIG90aGVyIG9wdGlvbnMuICBUaGUgZXhhbXBsZQorIyBwcm9ncmFtIGhlcmUsIHBubTJwbmdtLCByZXF1aXJlcyB0aGUgZm9sbG93aW5nLiAgVGFrZSBhIGxvb2sKKyMgYXQgcG5nbGliY29uZi5oIHRvIGZpbmQgb3V0IHRoZSBmdWxsIHNldCBvZiB3aGF0IGhhcyB0byBiZQorIyBlbmFibGVkIHRvIG1ha2UgdGhlIGZvbGxvd2luZyB3b3JrLgorCitvcHRpb24gU0VUSk1QIG9uCitvcHRpb24gU1RESU8gb24KZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ21pbmltL2VuY29kZXIvcG5ndXNyLmggYi9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9lbmNvZGVyL3BuZ3Vzci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5N2Q0NGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9lbmNvZGVyL3BuZ3Vzci5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qIG1pbndycG5nY29uZi5oOiBoZWFkZXJzIHRvIG1ha2UgYSBtaW5pbWFsIHBuZy13cml0ZS1vbmx5IGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAtMjAxMyBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKyAqCisgKiBEZXJpdmVkIGZyb20gcG5nY3J1c2guaCwgQ29weXJpZ2h0IDE5OTgtMjAwNywgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKi8KKworI2lmbmRlZiBNSU5XUlBOR0NPTkZfSAorI2RlZmluZSBNSU5XUlBOR0NPTkZfSAorCisvKiBUbyBpbmNsdWRlIHBuZ3Vzci5oIHNldCAtRFBOR19VU0VSX0NPTkZJRyBpbiBDUFBGTEFHUyAqLworCisvKiBMaXN0IG9wdGlvbnMgdG8gdHVybiBvZmYgZmVhdHVyZXMgb2YgdGhlIGJ1aWxkIHRoYXQgZG8gbm90CisgKiBhZmZlY3QgdGhlIEFQSSAoc28gYXJlIG5vdCByZWNvcmRlZCBpbiBwbmdsaWJjb25mLmgpCisgKi8KKworI2RlZmluZSBQTkdfQUxJR05fVFlQRSBQTkdfQUxJR05fTk9ORQorCisjZW5kaWYgLyogTUlOV1JQTkdDT05GX0ggKi8KZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ21pbmltL3ByZWFkZXIvUkVBRE1FIGIvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vcHJlYWRlci9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFhODM1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL3BuZ21pbmltL3ByZWFkZXIvUkVBRE1FCkBAIC0wLDAgKzEsMTUgQEAKK1RoaXMgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgUE5HX1VTRVJfQ09ORklHIGFuZCBwbmd1c3IuaAorCitUaGUgbWFrZWZpbGUgYnVpbGRzIGEgbWluaW1hbCByZWFkLW9ubHkgcHJvZ3Jlc3NpdmUgZGVjb2RlciB3aXRoCitlbWJlZGRlZCBsaWJwbmcsIHpsaWIgYW5kIHlvdXIgc3lzdGVtJ3MgWCBsaWJyYXJ5LgorCitTcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiB0aGUgemxpYiBzb3VyY2UgKDEuMi4xIG9yIGxhdGVyKSBhcyBaTElCU1JDCitvbiB0aGUgbWFrZSBjb21tYW5kIGxpbmUuCisKK0VkaXQgbWFrZWZpbGUgaWYgcmVxdWlyZWQsIHRvIGZpbmQgeW91ciBYIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMsCit0aGVuCisKKyAgICBtYWtlIFpMSUJTUkM9ZGlyZWN0b3J5CisKK0lmIHlvdSBwcmVmZXIgdG8gdXNlIHRoZSBzaGFyZWQgbGlicmFyaWVzLCBnbyB0byBjb250cmliL2dyZWdib29rCithbmQgYnVpbGQgdGhlIHJwbmcyLXggYXBwbGljYXRpb24gdGhlcmUuCmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9wcmVhZGVyL21ha2VmaWxlIGIvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vcHJlYWRlci9tYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjI1MTk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vcHJlYWRlci9tYWtlZmlsZQpAQCAtMCwwICsxLDE2NiBAQAorIyBNYWtlZmlsZSBmb3IgUG5nTWludXMgKHJwbmcyKQorIyBMaW51eCAvIFVuaXgKKworI0NDPWNjCitDQz1nY2MKK0xEPSQoQ0MpCisKKyMgSWYgYXdrIGZhaWxzIHRyeQorIyBtYWtlIEFXSz1uYXdrCisKKyMgSWYgY3BwIGZhaWxzIHRyeQorIyBtYWtlIENQUD0vbGliL2NwcAorCitSTT1ybSAtZgorQ09QWT1jcAorCisjWElOQyA9IC1JL3Vzci9pbmNsdWRlCQkJIyBvbGQtc3R5bGUsIHN0b2NrIFggZGlzdHJpYnV0aW9ucworI1hMSUIgPSAtTC91c3IvbGliL1gxMSAtbFgxMQkJIyAgKGluY2x1ZGluZyBTR0kgSVJJWCkKKworI1hJTkMgPSAtSS91c3Ivb3Blbndpbi9pbmNsdWRlCQkjIFN1biB3b3Jrc3RhdGlvbnMgKE9wZW5XaW5kb3dzKQorI1hMSUIgPSAtTC91c3Ivb3Blbndpbi9saWIgLWxYMTEKKworWElOQyA9IC1JL3Vzci9YMTFSNi9pbmNsdWRlCQkjIG5ldyBYIGRpc3RyaWJ1dGlvbnMgKFgub3JnLCBldGMuKQorWExJQiA9IC1ML3Vzci9YMTFSNi9saWIgLWxYMTEKKyNYTElCID0gLUwvdXNyL1gxMVI2L2xpYjY0IC1sWDExCSMgZS5nLiwgUmVkIEhhdCBvbiBBTUQ2NAorCisjWElOQyA9IC1JL3Vzci9sb2NhbC9pbmNsdWRlICAgCQkjIEZyZWVCU0QKKyNYTElCID0gLUwvdXNyL2xvY2FsL2xpYiAtbFgxMQorCisjTElCUyA9ICQoWExJQikKK0xJQlMgPSAkKFhMSUIpIC1sbSAgICAgICAgICAgICAgICAgICAgICAjcGxhdGZvcm1zIHRoYXQgbmVlZCBsaWJtCisKK0NQUEZMQUdTPS1JLiAkKFhJTkMpIC1EUE5HX1VTRVJfQ09ORklHIC1ETk9fR1pDT01QUkVTUyAtRFpfU09MTyAtRE5PX0daSVAKK0NGTEFHUz0tTzEgLVdhbGwKKworQz0uYworTz0ubworTD0uYQorRT0KKworIyBXaGVyZSB0byBmaW5kIHRoZSBzb3VyY2UgY29kZToKK1BOR1NSQyA9Li4vLi4vLi4KK1pMSUJTUkM9JChQTkdTUkMpLy4uL3psaWIKK1BST0dTUkM9JChQTkdTUkMpL2NvbnRyaWIvZ3JlZ2Jvb2sKKworIyBabGliIChtaW5pbWFsIGluZmxhdGUgcmVxdWlyZW1lbnRzIC0gY3JjMzIgaXMgdXNlZCBieSBsaWJwbmcpCisjIHp1dGlsIGNhbiBiZSBlbGltaW5hdGVkIGlmIHlvdSBwcm92aWRlIHlvdXIgb3duIHpjYWxsb2MgYW5kIHpjZnJlZQorWlNSQ1MgID0gYWRsZXIzMiQoQykgY3JjMzIkKEMpIFwKKwkgaW5mZmFzdCQoQykgaW5mbGF0ZSQoQykgaW5mdHJlZXMkKEMpIFwKKwkgenV0aWwkKEMpCisKKyMgU3RhbmRhcmQgaGVhZGVycworWkggICAgID0gemxpYi5oIGNyYzMyLmggaW5mZmFzdC5oIGluZmZpeGVkLmggXAorCSBpbmZsYXRlLmggaW5mdHJlZXMuaCB6dXRpbC5oCisKKyMgTWFjaGluZSBnZW5lcmF0ZWQgaGVhZGVycworWkNPTkYgID0gemNvbmYuaAorCisjIEhlYWRlcnMgY2FsbGVycyB1c2UKK1pJTkMgICA9IHpsaWIuaCAkKFpDT05GKQorCisjIEhlYWRlcnMgdGhlIFpsaWIgc291cmNlIHVzZXMKK1pIRFJTICA9ICQoWkgpICQoWkNPTkYpCisKK1pPQkpTICA9IGFkbGVyMzIkKE8pIGNyYzMyJChPKSBcCisJIGluZmZhc3QkKE8pIGluZmxhdGUkKE8pIGluZnRyZWVzJChPKSBcCisJIHp1dGlsJChPKQorCisjIGxpYnBuZworUE5HU1JDUz1wbmckKEMpIHBuZ2Vycm9yJChDKSBwbmdnZXQkKEMpIHBuZ21lbSQoQykgXAorCXBuZ3ByZWFkJChDKSBwbmdyZWFkJChDKSBwbmdyaW8kKEMpIHBuZ3J0cmFuJChDKSBwbmdydXRpbCQoQykgXAorCXBuZ3NldCQoQykgcG5ndHJhbnMkKEMpCisKKyMgU3RhbmRhcmQgaGVhZGVycworUE5HSCAgID1wbmcuaCBwbmdjb25mLmggcG5nZGVidWcuaCBwbmdpbmZvLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oCisKKyMgTWFjaGluZSBnZW5lcmF0ZWQgaGVhZGVycworUE5HQ09ORj1wbmdsaWJjb25mLmgKKworIyBIZWFkZXJzIGNhbGxlcnMgdXNlCitQTkdJTkM9IHBuZy5oIHBuZ2NvbmYuaCBwbmd1c3IuaCAkKFBOR0NPTkYpCisKKyMgSGVhZGVycyB0aGUgUE5HIGxpYnJhcnkgdXNlcworUE5HSERSUz0kKFBOR0gpICQoUE5HQ09ORikgcG5ndXNyLmgKKworUE5HT0JKUz1wbmckKE8pIHBuZ2Vycm9yJChPKSBwbmdnZXQkKE8pIHBuZ21lbSQoTykgXAorCXBuZ3ByZWFkJChPKSBwbmdyZWFkJChPKSBwbmdyaW8kKE8pIHBuZ3J0cmFuJChPKSBwbmdydXRpbCQoTykgXAorCXBuZ3NldCQoTykgcG5ndHJhbnMkKE8pCisKK1BST0dTUkNTPSBycG5nMi14JChDKSByZWFkcG5nMiQoQykKK1BST0dIRFJTPSByZWFkcG5nMi5oCitQUk9HRE9DUz0gQ09QWUlORyBMSUNFTlNFCitQUk9HT0JKUz0gcnBuZzIteCQoTykgcmVhZHBuZzIkKE8pCisKK09CSlMgICAgPSAkKFBST0dPQkpTKSAkKFBOR09CSlMpICQoWk9CSlMpCisKKyMgaW1wbGljaXQgbWFrZSBydWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy5jJChPKToKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJDwKKworIyBkZXBlbmRlbmNpZXMKKworYWxsOiAkKFBST0dET0NTKSBycG5nMi14JChFKQorCitycG5nMi14JChFKTogJChPQkpTKQorCSQoTEQpIC1vIHJwbmcyLXgkKEUpICQoT0JKUykgJChMSUJTKQorCisjIFRoZSBERkFfWFRSQSBzZXR0aW5nIHR1cm5zIGFsbCBsaWJwbmcgb3B0aW9ucyBvZmYgdGhlbgorIyB0dXJucyBvbiB0aG9zZSByZXF1aXJlZCBmb3IgdGhpcyBtaW5pbWFsIGJ1aWxkLgorIyBUaGUgQ1BQX0ZMQUdTIHNldHRpbmcgY2F1c2VzIHBuZ3Vzci5oIHRvIGJlIGluY2x1ZGVkIGluCisjIGJvdGggdGhlIGJ1aWxkIG9mIHBuZ2xpYmNvbmYuaCBhbmQsIHN1YnNlcXVlbnRseSwgd2hlbgorIyBidWlsZGluZyBsaWJwbmcgaXRzZWxmLgorJChQTkdDT05GKTogJChQTkdTUkMpL3NjcmlwdHMvcG5nbGliY29uZi5tYWsgJChaSClcCisJJChQTkdTUkMpL3NjcmlwdHMvcG5nbGliY29uZi5kZmEgXAorCSQoUE5HU1JDKS9zY3JpcHRzL29wdGlvbnMuYXdrIHBuZ3Vzci5oIHBuZ3Vzci5kZmEKKwkkKFJNKSBwbmdsaWJjb25mLmggcG5nbGliY29uZi5kZm4KKwkkKE1BS0UpIC1mICQoUE5HU1JDKS9zY3JpcHRzL3BuZ2xpYmNvbmYubWFrICQoTUFLRUZMQUdTKVwKKwkgICAgc3JjZGlyPSQoUE5HU1JDKSBDUFBGTEFHUz0iLURQTkdfVVNFUl9DT05GSUcgLUkuIlwKKwkgICAgREZBX1hUUkE9InBuZ3Vzci5kZmEiICRACisKK2NsZWFuOgorCSQoTUFLRSkgLWYgJChQTkdTUkMpL3NjcmlwdHMvcG5nbGliY29uZi5tYWsgJChNQUtFRkxBR1MpXAorCSAgICBzcmNkaXI9JChQTkdTUkMpIGNsZWFuCisJJChSTSkgcnBuZzIteCQoTykKKwkkKFJNKSBycG5nMi14JChFKQorCSQoUk0pICQoT0JKUykKKworIyBkaXN0Y2xlYW4gYWxzbyByZW1vdmVzIHRoZSBjb3BpZWQgc291cmNlIGFuZCBoZWFkZXJzCitkaXN0Y2xlYW46IGNsZWFuCisJJChSTSkgLXIgc2NyaXB0cyAjIGhpc3RvcmljYWwgcmVhc29ucworCSQoUk0pICQoUE5HU1JDUykgJChQTkdIKQorCSQoUk0pICQoWlNSQ1MpICQoWkgpICQoWkNPTkYpCisJJChSTSkgJChQUk9HU1JDUykgJChQUk9HSERSUykgJChQUk9HRE9DUykKKworIyBIZWFkZXIgZmlsZSBkZXBlbmRlbmNpZXM6CiskKFBST0dPQkpTKTogJChQUk9HSERSUykgJChQTkdJTkMpICQoWklOQykKKyQoUE5HT0JKUyk6ICQoUE5HSERSUykgJChaSU5DKQorJChaT0JKUyk6ICQoWkhEUlMpCisKKyMgR2F0aGVyIHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSByZXNwZWN0aXZlIGRpcmVjdG9yaWVzCiskKFBOR1NSQ1MpICQoUE5HSCk6ICQoUE5HU1JDKS8kQAorCSQoUk0pICRACisJJChDT1BZKSAkKFBOR1NSQykvJEAgJEAKKworIyBObyBkZXBlbmRlbmN5IG9uIHRoZSBaTElCU1JDIHRhcmdldCBzbyB0aGF0IGl0IG9ubHkgbmVlZHMKKyMgdG8gYmUgc3BlY2lmaWVkIG9uY2UuCiskKFpTUkNTKSAkKFpIKToKKwkkKFJNKSAkQAorCSQoQ09QWSkgJChaTElCU1JDKS8kQCAkQAorCisjIFRoZSB1bmNvbmZpZ3VyZWQgemNvbmYuaCB2YXJpZXMgaW4gbmFtZSBhY2NvcmRpbmcgdG8gdGhlCisjIHpsaWIgcmVsZWFzZQorJChaQ09ORik6CisJJChSTSkgJEAKKwlAZm9yIGYgaW4gemNvbmYuaC5pbiB6Y29uZi5pbi5oIHpjb25mLmg7IGRvXAorCSAgICB0ZXN0IC1yICQoWkxJQlNSQykvJCRmICYmXAorCSAgICBlY2hvICQoQ09QWSkgJChaTElCU1JDKS8kJGYgJEAgJiZcCisJICAgICQoQ09QWSkgJChaTElCU1JDKS8kJGYgJEAgJiYgZXhpdCAwO1wKKwlkb25lOyBlY2hvIGNvcHk6ICQoWkxJQlNSQykvemNvbmYuaCBub3QgZm91bmQ7IGV4aXQgMQorCiskKFBST0dTUkNTKSAkKFBST0dIRFJTKSAkKFBST0dET0NTKTogJChQUk9HU1JDKS8kQAorCSQoUk0pICRACisJJChDT1BZKSAkKFBST0dTUkMpLyRAICRACisKKyMgRW5kIG9mIG1ha2VmaWxlIGZvciBycG5nMi14CmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9wcmVhZGVyL3BuZ3Vzci5kZmEgYi9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9wcmVhZGVyL3BuZ3Vzci5kZmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMyOTdmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL3BuZ21pbmltL3ByZWFkZXIvcG5ndXNyLmRmYQpAQCAtMCwwICsxLDQwIEBACisjIHBuZ21pbmltL3ByZWFkZXIvcG5ndXNyLmRmYQorIworIyBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMyBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyMKKyMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorIyBhbmQgbGljZW5zZSBpbiBwbmcuaAorCisjIEZpcnN0IGFsbCB0aGUgYnVpbGQgb3B0aW9ucyBvZmY6CisKK2V2ZXJ5dGhpbmcgPSBvZmYKKworIyBKdXN0IHN3aXRjaCBvbiB0aGUgcHJvZ3Jlc3NpdmUgcmVhZCBjb2RlCisKK29wdGlvbiBQUk9HUkVTU0lWRV9SRUFEIG9uCisKKyMgWW91IG1heSBjaG9vc2UgZml4ZWQgb3IgZmxvYXRpbmcgcG9pbnQgQVBJczoKKyMgb3B0aW9uIEZMT0FUSU5HX1BPSU5UIG9uCisKK29wdGlvbiBGSVhFRF9QT0lOVCBvbgorCisjIFlvdSBtdXN0IGNob3NlIHRoZSBpbnRlcm5hbCBmaXhlZCBwb2ludCBpbXBsZW1lbnRhdGlvbiBvciB0bworIyB1c2UgdGhlIHN5c3RlbSBmbG9hdGluZyBwb2ludC4gIFRoZSBsYXR0ZXIgaXMgY29uc2lkZXJhYmx5CisjIHNtYWxsZXIgKGJ5IGFib3V0IDFrYnl0ZSBvbiBhbiB4ODYgc3lzdGVtKToKKworb3B0aW9uIEZMT0FUSU5HX0FSSVRITUVUSUMgb24KKyMgb3B0aW9uIEZMT0FUSU5HX0FSSVRITUVUSUMgb2ZmCisKKyMgWW91ciBwcm9ncmFtIHdpbGwgcHJvYmFibHkgbmVlZCBvdGhlciBvcHRpb25zLiAgVGhlIGV4YW1wbGUKKyMgcHJvZ3JhbSBoZXJlLCBycG5nMi14LCByZXF1aXJlcyB0aGUgZm9sbG93aW5nLiAgVGFrZSBhIGxvb2sKKyMgYXQgcG5nbGliY29uZi5oIHRvIGZpbmQgb3V0IHRoZSBmdWxsIHNldCBvZiB3aGF0IGhhcyB0byBiZQorIyBlbmFibGVkIHRvIG1ha2UgdGhlIGZvbGxvd2luZyB3b3JrLgorCitvcHRpb24gU0VUSk1QIG9uCitvcHRpb24gU1RESU8gb24KK29wdGlvbiBSRUFEX2JLR0Qgb24KK29wdGlvbiBSRUFEX0dBTU1BIG9uCitvcHRpb24gUkVBRF9FWFBBTkQgb24KK29wdGlvbiBSRUFEX1NUUklQXzE2X1RPXzggb24KK29wdGlvbiBSRUFEX0dSQVlfVE9fUkdCIG9uCmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9wcmVhZGVyL3BuZ3Vzci5oIGIvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vcHJlYWRlci9wbmd1c3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGRiM2JiCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vcHJlYWRlci9wbmd1c3IuaApAQCAtMCwwICsxLDIzIEBACisvKiBtaW5yZHBuZ2NvbmYuaDogaGVhZGVycyB0byBtYWtlIGEgbWluaW1hbCBwbmctcmVhZC1vbmx5IGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAtMjAxMyBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKyAqCisgKiBEZXJpdmVkIGZyb20gcG5nY3J1c2guaCwgQ29weXJpZ2h0IDE5OTgtMjAwNywgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKi8KKworI2lmbmRlZiBNSU5QUkRQTkdDT05GX0gKKyNkZWZpbmUgTUlOUFJEUE5HQ09ORl9ICisKKy8qIFRvIGluY2x1ZGUgcG5ndXNyLmggc2V0IC1EUE5HX1VTRVJfQ09ORklHIGluIENQUEZMQUdTICovCisKKy8qIExpc3Qgb3B0aW9ucyB0byB0dXJuIG9mZiBmZWF0dXJlcyBvZiB0aGUgYnVpbGQgdGhhdCBkbyBub3QKKyAqIGFmZmVjdCB0aGUgQVBJIChzbyBhcmUgbm90IHJlY29yZGVkIGluIHBuZ2xpYmNvbmYuaCkKKyAqLworCisjZGVmaW5lIFBOR19BTElHTl9UWVBFIFBOR19BTElHTl9OT05FCisKKyNlbmRpZiAvKiBNSU5QUkRQTkdDT05GX0ggKi8KZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL1JFQURNRSBiL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmU3NDA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvUkVBRE1FCkBAIC0wLDAgKzEsMTUzIEBACitQbmdNaW51cworLS0tLS0tLS0KKyhjb3B5cmlnaHQgV2lsbGVtIHZhbiBTY2hhaWssIDE5OTkpCisKKworTGljZW5zZQorLS0tLS0tLQorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZAoraXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKK3Byb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCit0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dAorZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorCisKK1NvbWUgaGlzdG9yeQorLS0tLS0tLS0tLS0tCitTb29uIGFmdGVyIHRoZSBjcmVhdGlvbiBvZiBQTkcgaW4gMTk5NSwgdGhlIG5lZWQgd2FzIGZlbHQgZm9yIGEgc2V0IG9mCitwbm10b3BuZyAvIHBuZ3RvcG5tIHV0aWxpdGllcy4gSW5kZXBlbmRhbnRseSBBbGV4YW5kZXIgTGVobWFubiBhbmQgSQorKFdpbGxlbSB2YW4gU2NoYWlrKSBzdGFydGVkIHN1Y2ggYSBwcm9qZWN0LiBMdWNraWx5IHdlIGRpc2NvdmVyZWQgdGhpcworYW5kIG1lcmdlZCB0aGUgdHdvIHRvZ2V0aGVyIGludG8gcG5tdG9wbmcudGFyLmd6LCB3aGljaCBpcyBhdmFpbGFibGUKK2Zyb20gYS9vIGZ0cDovL2Z0cC5zaW1wbGVzeXN0ZW1zLm9yZy9wdWIvbGlicG5nL3BuZy8uCisKK1RoZXNlIHR3byB1dGlsaXRpZXMgaGF2ZSBtYW55LCBtYW55IG9wdGlvbnMgYW5kIG1ha2UgdXNlIG9mIG1vc3Qgb2YgdGhlCitmZWF0dXJlcyBvZiBQTkcsIGxpa2UgZ2FtbWEsIGFscGhhLCBzYml0LCB0ZXh0LWNodW5rcywgZXRjLiBUaGlzIG1ha2VzCit0aGUgdXRpbGl0aWVzIHF1aXRlIGNvbXBsZXggYW5kIGJ5IG5vdyBub3QgYW55bW9yZSB2ZXJ5IG1haW50YWluYWJsZS4KK1doZW4gd2Ugd3JvdGUgdGhlc2UgcHJvZ3JhbXMsIGxpYnBuZyB3YXMgc3RpbGwgaW4gYW4gZWFybHkgc3RhZ2UuCitUaGVyZWZvcmUsIGxvdHMgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgdGhhdCB3ZSBwdXQgaW4gb3VyIHNvZnR3YXJlIGNhbiBub3cKK2JlIGRvbmUgdXNpbmcgdHJhbnNmb3JtLWZ1bmN0aW9ucyBpbiBsaWJwbmcuCisKK0ZpbmFsbHksIHRvIGNvbXBpbGUgdGhlc2UgcHJvZ3JhbXMsIHlvdSBuZWVkIHRvIGhhdmUgaW5zdGFsbGVkIGFuZAorY29tcGlsZWQgdGhyZWUgbGlicmFyaWVzOiBsaWJwbmcsIHpsaWIgYW5kIG5ldHBibS4gRXNwZWNpYWxseSB0aGUgbGF0dGVyCittYWtlcyB0aGUgd2hvbGUgc2V0dXAgYSBiaXQgYnVsa3kuIEJ1dCB0aGF0J3MgdW5hdm9pZGFibGUgZ2l2ZW4gdGhlIG1hbnkKK2ZlYXR1cmVzIG9mIHBubXRvcG5nLgorCisKK1doYXQgbm93CistLS0tLS0tLQorQXQgdGhpcyBtb21lbnQgbGlicG5nIGlzIGluIGEgdmVyeSBzdGFibGUgc3RhdGUgYW5kIGNhbiBkbyBtdWNoIG9mIHRoZQord29yayBkb25lIGluIHBubXRvcG5nLiBBbHNvLCBwbm10b3BuZyBuZWVkcyB0byBiZSB1cGdyYWRlZCB0byB0aGUgbmV3CitpbnRlcmZhY2Ugb2YgbGlicG5nLiBIZW5jZSwgaXQgaXMgdGltZSBmb3IgYSByZXdyaXRlIGZyb20gdGhlIGdyb3VuZCB1cAorb2YgcG5tdG9wbmcgYW5kIHBuZ3RvcG5tLiBUaGlzIHdpbGwgaGFwcGVuIGluIHRoZSBuZWFyIGZ1dHVyZSAoc3RheQordHVuZWQpLiBUaGUgbmV3IHBhY2thZ2Ugd2lsbCBnZXQgYSBkaWZmZXJlbnQgbmFtZSB0byBkaXN0aW5ndWlzaCBpdCBmcm9tCit0aGUgb2xkIG9uZTogUG5nUGx1cy4KKworVG8gZXhwZXJpbWVudCBhIGJpdCB3aXRoIHRoZSBuZXcgaW50ZXJmYWNlIG9mIGxpYnBuZywgSSBzdGFydGVkIG9mZiB3aXRoCithIHNtYWxsIHByb3RvdHlwZSB0aGF0IGNvbnRhaW5zIG9ubHkgdGhlIGJhc2ljIGZ1bmN0aW9uYWxpdHkuIEl0IGRvZXNuJ3QKK2hhdmUgYW55IG9mIHRoZSBvcHRpb25zIHRvIHJlYWQgb3Igd3JpdGUgc3BlY2lhbCBjaHVua3MgYW5kIGl0IHdpbGwgZG8KK25vIGdhbW1hIGNvcnJlY3Rpb24uIEJ1dCB0aGlzIG1ha2VzIGl0IGFsc28gYSBzaW1wbGUgcHJvZ3JhbSB0aGF0IGlzCitxdWl0ZSBlYXN5IHRvIHVuZGVyc3RhbmQgYW5kIGNhbiBzZXJ2ZSB3ZWxsIGFzIGEgdGVtcGxhdGUgZm9yIG90aGVyCitzb2Z0d2FyZSBkZXZlbG9wbWVudHMuIChCeSBub3cgdGhlcmUgYXJlIG9mIGNvdXJzZSBhIGNvdXBsZSBvZiBwcm9ncmFtcywKK2xpa2UgR3JlZyBSb2Vsb2ZzJyBycG5nL3dwbmcsIHRoYXQgY2FuIGJlIHVzZWQganVzdCBhcyBnb29kLikKKworCitDYW4gYW5kIGNhbiBub3QKKy0tLS0tLS0tLS0tLS0tLQorQXMgdGhpcyBpcyB0aGUgc21hbGwgYnJvdGhlciBvZiB0aGUgZnV0dXJlIFBuZ1BsdXMsIEkgY2FsbGVkIHRoaXMgZmVsbG93CitQbmdNaW51cy4gQmVjYXVzZSBJIHN0YXJ0ZWQgdGhpcyBkZXZlbG9wbWVudCBpbiBnb29kLW9sZCBUdXJiby1DLCBJCithdm9pZGVkIHRoZSB1c2UgdGhlIG5ldHBibSBsaWJyYXJ5LCB3aGljaCByZXF1aXJlcyBET1MgZXh0ZW5kZXJzLiBBZ2FpbiwKK2Fub3RoZXIgcmVhc29uIHRvIGNhbGwgaXQgUG5nTWludXMgKG1pbnVzIG5ldHBibSA6LSkuIFNvLCBwYXJ0IG9mIHRoZQorcHJvZ3JhbSBhcmUgc29tZSBlbGVtZW50YXJ5IHJvdXRpbmVzIHRvIHJlYWQgLyB3cml0ZSBwZ20tIGFuZCBwcG0tZmlsZXMuCitJdCBkb2VzIG5vdCByZWFkIGImdyBwYm0tZmlsZXMuCisKK1RoZSBkb3duc2lkZSBvZiB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgeW91IGNhbiBub3QgdXNlIHRoZW0gb24gaW1hZ2VzCit0aGF0IHJlcXVpcmUgYmxvY2tzIG9mIG1lbW9yeSBiaWdnZXIgdGhhbiA2NGsgKHRoZSBET1MgdmVyc2lvbikuIEZvcgorbGFyZ2VyIGltYWdlcyB5b3Ugd2lsbCBnZXQgYW4gb3V0LW9mLW1lbW9yeSBlcnJvci4KKworQXMgc2FpZCBiZWZvcmUsIFBuZ01pbnVzIGRvZXNuJ3QgY29ycmVjdCBmb3IgZ2FtbWEuIFdoZW4gcmVhZGluZworcG5nLWZpbGVzIHlvdSBjYW4gZG8gdGhpcyBqdXN0IGFzIHdlbGwgYnkgcGlwaW5nIHRoZSBvdXRwdXQgb2YgcG5nMnBubQordG8gcG5tZ2FtbWEsIG9uZSBvZiB0aGUgc3RhbmRhcmQgUGJtUGx1cyB0b29scy4gVGhpcyBzYW1lIHNjZW5hcmlvIHdpbGwKK21vc3QgcHJvYmFibHkgYWxzbyBiZSBmb2xsb3dlZCBpbiB0aGUgZnVsbC1ibG93biBmdXR1cmUgUG5nUGx1cywgd2l0aAordGhlIGFkZGl0aW9uIG9mIGNvdXJzZSBvZiB0aGUgcG9zc2liaWxpdHkgdG8gY3JlYXRlIGdhbW1hLWNodW5rcyB3aGVuCit3cml0aW5nIHBuZy1maWxlcy4KKworT24gdGhlIG90aGVyIGhhbmQgaXQgc3VwcG9ydHMgYWxwaGEtY2hhbm5lbHMuIFdoZW4gcmVhZGluZyBhIHBuZy1pbWFnZQoreW91IGNhbiB3cml0ZSB0aGUgYWxwaGEtY2hhbm5lbCBpbnRvIGEgcGdtLWZpbGUuIEFuZCB3aGVuIGNyZWF0aW5nIGFuCitSR0IrQSBwbmctaW1hZ2UsIHlvdSBqdXN0IGNvbWJpbmUgYSBwcG0tZmlsZSB3aXRoIGEgY29ycmVzcG9uZGluZworcGdtLWZpbGUgY29udGFpbmluZyB0aGUgYWxwaGEtY2hhbm5lbC4gV2hlbiByZWFkaW5nLCB0cmFuc3BhcmVuY3kgY2h1bmtzCithcmUgY29udmVydGVkIGludG8gYW4gYWxwaGEtY2hhbm5lbCBhbmQgZnJvbSB0aGVyZSBvbiB0cmVhdGVkIHRoZSBzYW1lCit3YXkuCisKK0ZpbmFsbHkgeW91IGNhbiBvcHQgZm9yIHdyaXRpbmcgYXNjaWkgb3IgYmluYXJ5IHBnbS0gYW5kIHBwbS1maWxlcy4gV2hlbgordGhlIGJpdC1kZXB0aCBpcyAxNiwgdGhlIGZvcm1hdCB3aWxsIGFsd2F5cyBiZSBhc2NpaS4KKworCitVc2luZyBpdAorLS0tLS0tLS0KK1RvIGRpc3Rpbmd1aXNoIHRoZW0gZnJvbSBwbm10b3BuZyBhbmQgUG5nUGx1cywgdGhlIHV0aWxpdGllcyBhcmUgbmFtZWQKK3BuZzJwbm0gYW5kIHBubTJwbmcgKDIgaW5zdGVhZCBvZiB0bykuIFRoZSBpbnB1dC0gYW5kIG91dHB1dC1maWxlcyBjYW4KK2JlIGdpdmVuIGFzIHBhcmFtZXRlcnMgb3IgdGhyb3VnaCByZWRpcmVjdGlvbi4gVGhlcmVmb3JlIHRoZSBwcm9ncmFtcworY2FuIGJlIHBhcnQgb2YgYSBwaXBlLgorCitUbyBsaXN0IHRoZSBvcHRpb25zIHR5cGUgInBuZzJwbm0gLWgiIG9yICJwbm0ycG5nIC1oIi4KKworCitKdXN0IGxpa2UgU2NhbmRpbmF2aWFuIGZ1cm5pdHVyZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1lvdSBoYXZlIHRvIHB1dCBpdCB0b2dldGhlciB5b3Vyc2VsZi4gSSBkaWQgdGVzdCB0aGUgc29mdHdhcmUgdW5kZXIKK01TLURPUyB3aXRoIFR1cmJvLUMgMy4wIGFuZCB1bmRlciBSZWRIYXQgTGludXggNC4yIHdpdGggZ2NjLiBJbiBib3RoCitjYXNlcyBJIHVzZWQgbGlicG5nLTEuMC40IGFuZCB6bGliLTEuMS4zLiBMYXRlciB2ZXJzaW9ucyBzaG91bGQgYmUgT0ssCitob3dldmVyIHNvbWUgb2xkZXIgbGlicG5nIHZlcnNpb25zIGhhdmUgYSBidWcgaW4gcG5nbWVtLmMgd2hlbiB1c2luZworVHVyYm8tQyAzLjAgKHNlZSBiZWxvdykuCisKK1lvdSBjYW4gYnVpbGQgaXQgdXNpbmcgb25lIG9mIHRoZSB0d28gbWFrZWZpbGVzIChtYWtlIC1mIG1ha2VmaWxlLiMjIykKK29yIHVzZSB0aGUgYmF0Y2gvc2NyaXB0IGZpbGVzIHBuZ21pbnVzLmJhdCAvIHBuZ21pbnVzLnNoLiBUaGlzIGFzc3VtZXMKK3RoYXQgeW91IGhhdmUgYnVpbHQgdGhlIGxpYnJhcmllcyBpbiAuLi9saWJwbmcgYW5kIC4uL3psaWIuIFVzaW5nIExpbnV4LAorbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgYnVpbHQgbGlicG5nIHdpdGggbWFrZWZpbGUuc3RkIGFuZCBub3QKK21ha2VmaWxlLmxpbnV4IChhbHNvIGNhbGxlZCAubG54IGluIGVhcmxpZXIgdmVyc2lvbnMgb2YgbGlicG5nKS4gVGhlCitsYXR0ZXIgY3JlYXRlcyBhIC5zbyBzaGFyZWQtbGlicmFyeSwgd2hpbGUgdGhlIFBuZ01pbnVzIG1ha2VmaWxlIGFzc3VtZXMKK2Egbm9ybWFsIC5hIHN0YXRpYyBsaWJyYXJ5LgorCitJZiB5b3UgY3JlYXRlIGEgLi4vcG5nc3VpdGUgZGlyZWN0b3J5IGFuZCB0aGVuIHN0b3JlIHRoZSBiYXNuIyMjIy5wbmcKK2ZpbGVzIGZyb20gUG5nU3VpdGUgKGh0dHA6Ly93d3cuc2NoYWlrLmNvbS9wbmdzdWl0ZS8pIGluIHRoZXJlLCB5b3UgY2FuCit0ZXN0IGluIG9uZSBnbyB0aGUgcHJvcGVyIGZ1bmN0aW9uaW5nIG9mIFBuZ01pbnVzLCBzZWUgcG5nMnBubS5iYXQgYW5kCitwbm0ycG5nLmJhdCAob3IgdGhlIC5zaCB2ZXJzaW9ucykuCisKKworV2FycmFudHkKKy0tLS0tLS0KK1BsZWFzZSwgcmVtZW1iZXIgdGhhdCB0aGlzIHdhcyBqdXN0IGEgc21hbGwgZXhwZXJpbWVudCB0byBsZWFybiBhIGZldwordGhpbmdzLiBJdCB3aWxsIGhhdmUgbWFueSB1bmZvcmVzZWVuIGZlYXR1cmVzIDx2Ymc+LiBXaG8gc2FpZCBidWdzPyBVc2UKK2l0IHdoZW4geW91IGFyZSBpbiBuZWVkIGZvciBzb21ldGhpbmcgc2ltcGxlIG9yIHdoZW4geW91IHdhbnQgdG8gc3RhcnQKK2RldmVsb3BpbmcgeW91ciBvd24gc3R1ZmYuCisKKworVGhlIFR1cmJvIGJ1ZworLS0tLS0tLS0tLS0tLQorKiogcG5nbWVtLm9sZAorICAgICAgICAgIGhwdHIgPSAocG5nX2J5dGUgaHVnZSAqKSgobG9uZykoaHB0cikgJiAweGZmZmZmZmYwTCk7CisgICAgICAgICAgaHB0ciArPSAxNkw7CisqKiBwbmdtZW0uYworICAgICAgICAgIGhwdHIgPSAocG5nX2J5dGUgaHVnZSAqKSgobG9uZykoaHB0cikgJiAweGZmZmZmZmYwTCk7CisgICAgICAgICAgaHB0ciA9IGhwdHIgKyAxNkw7CisqKgorCisqKiBwbmdtZW0ub2xkCisgICAgICAgICAgcG5nX3B0ci0+b2Zmc2V0X3RhYmxlX3B0cltpXSA9IChwbmdfYnl0ZXApaHB0cjsKKyAgICAgICAgICBocHRyICs9IChwbmdfdWludF8zMik2NTUzNkw7CisqKiBwbmdtZW0uYworICAgICAgICAgIHBuZ19wdHItPm9mZnNldF90YWJsZV9wdHJbaV0gPSAocG5nX2J5dGVwKWhwdHI7CisgICAgICAgICAgaHB0ciA9IGhwdHIgKyA2NTUzNkw7CisqKgorCisKK1RoZSBlbmQKKy0tLS0tLS0KK1dpbGxlbSB2YW4gU2NoYWlrCittYWlsdG86d2lsbGVtQHNjaGFpay5jb20KK2h0dHA6Ly93d3cuc2NoYWlrLmNvbS9wbmcvCistLS0tLS0tCitPY3QgMTk5OQorCmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9wbmdtaW51cy9tYWtlZmlsZS5zdGQgYi9saWJwbmcvY29udHJpYi9wbmdtaW51cy9tYWtlZmlsZS5zdGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRlMjVjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL21ha2VmaWxlLnN0ZApAQCAtMCwwICsxLDY2IEBACisjIE1ha2VmaWxlIGZvciBQbmdNaW51cyAocG5nMnBubSBhbmQgcG5tMnBuZykKKyMgTGludXggLyBVbml4CisKKyNDQz1jYworQ0M9Z2NjCitMRD0kKENDKQorCitSTT1ybSAtZgorCisjUE5HUEFUSCA9IC91c3IvbG9jYWwKKyNQTkdJTkMgPSAtSSQoUE5HUEFUSCkvaW5jbHVkZS9saWJwbmcxNgorI1BOR0xJQiA9IC1MJChQTkdQQVRIKS9saWIgLWxwbmcxNgorI1BOR0xJQlMgPSAkKFBOR1BBVEgpL2xpYi9saWJwbmcxNi5hCitQTkdJTkMgPSAtSS4uLy4uCitQTkdMSUIgPSAtTC4uLy4uIC1scG5nCitQTkdMSUJTID0gLi4vLi4vbGlicG5nLmEKKworI1pQQVRIID0gL3Vzci9sb2NhbAorI1pJTkMgPSAtSSQoWlBBVEgpL2luY2x1ZGUKKyNaTElCID0gLUwkKFpQQVRIKS9saWIgLWx6CisjWkxJQlMgPSAkKFpQQVRIKS9saWIvbGliei5hCitaSU5DID0gLUkuLi8uLi8uLi96bGliCitaTElCID0gLUwuLi8uLi8uLi96bGliIC1segorWkxJQlMgPSAuLi8uLi8uLi96bGliL2xpYnouYQorCitDUFBGTEFHUz0kKFBOR0lOQykgJChaSU5DKQorQ0ZMQUdTPQorTERMSUJTPSQoUE5HTElCKSAkKFpMSUIpCitMRExJQlNTPSQoUE5HTElCUykgJChaTElCUykKK0M9LmMKK089Lm8KK0w9LmEKK0U9CisKKyMgZGVwZW5kZW5jaWVzCisKKyNhbGw6IHBuZzJwbm0kKEUpIHBubTJwbmckKEUpCithbGw6IHBuZzJwbm0kKEUpIHBubTJwbmckKEUpIHBuZzJwbm0tc3RhdGljJChFKSBwbm0ycG5nLXN0YXRpYyQoRSkKKworcG5nMnBubSQoTyk6IHBuZzJwbm0kKEMpCisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIHBuZzJwbm0kKEMpCisKK3BuZzJwbm0kKEUpOiBwbmcycG5tJChPKQorCSQoTEQpICQoTERGTEFHUykgLW8gcG5nMnBubSQoRSkgcG5nMnBubSQoTykgJChMRExJQlMpIC1sbQorCitwbmcycG5tLXN0YXRpYyQoRSk6IHBuZzJwbm0kKE8pCisJJChMRCkgJChMREZMQUdTKSAtbyBwbmcycG5tLXN0YXRpYyQoRSkgcG5nMnBubSQoTykgJChMRExJQlNTKSAtbG0KKworcG5tMnBuZyQoTyk6IHBubTJwbmckKEMpCisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIHBubTJwbmckKEMpCisKK3BubTJwbmckKEUpOiBwbm0ycG5nJChPKQorCSQoTEQpICQoTERGTEFHUykgLW8gcG5tMnBuZyQoRSkgcG5tMnBuZyQoTykgJChMRExJQlMpIC1sbQorCitwbm0ycG5nLXN0YXRpYyQoRSk6IHBubTJwbmckKE8pCisJJChMRCkgJChMREZMQUdTKSAtbyBwbm0ycG5nLXN0YXRpYyQoRSkgcG5tMnBuZyQoTykgJChMRExJQlNTKSAtbG0KKworY2xlYW46CisJJChSTSkgcG5nMnBubSQoTykKKwkkKFJNKSBwbm0ycG5nJChPKQorCSQoUk0pIHBuZzJwbm0kKEUpCisJJChSTSkgcG5tMnBuZyQoRSkKKwkkKFJNKSBwbmcycG5tLXN0YXRpYyQoRSkKKwkkKFJNKSBwbm0ycG5nLXN0YXRpYyQoRSkKKworIyBFbmQgb2YgbWFrZWZpbGUgZm9yIHBuZzJwbm0gLyBwbm0ycG5nCmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9wbmdtaW51cy9tYWtlZmlsZS50YzMgYi9saWJwbmcvY29udHJpYi9wbmdtaW51cy9tYWtlZmlsZS50YzMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEyZjRiOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL21ha2VmaWxlLnRjMwpAQCAtMCwwICsxLDM4IEBACisjIE1ha2VmaWxlIGZvciBQbmdNaW51cyAocG5nMnBubSBhbmQgcG5tMnBuZykKKyMgVHVyYm9DKysgMy4wCisKK0NDPXRjYyAtSWM6XHRjM1xpbmMKK0xEPXRjYyAtTGM6XHRjM1xsaWIKK0xCPXRsaWIKK1JNPWRlbAorQ1A9Y29weQorTU9ERUw9bAorQ1BQRkxBR1M9LUkuLlxsaWJwbmcgLUkuLlx6bGliCitDRkxBR1M9LU8gLW0kKE1PREVMKQorTERGTEFHUz0tbSQoTU9ERUwpIC1MLi5cbGlicG5nIC1MLi5cemxpYgorQz0uYworTz0ub2JqCitMPS5saWIKK0U9LmV4ZQorCisjIGRlcGVuZGVuY2llcworCithbGw6IHBuZzJwbm0kKEUpIHBubTJwbmckKEUpCisKK3BuZzJwbm0kKE8pOiBwbmcycG5tJChDKQorICAgICAgICAkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgcG5nMnBubSQoQykKKworcG5nMnBubSQoRSk6IHBuZzJwbm0kKE8pCisgICAgICAgICQoTEQpICQoTERGTEFHUykgcG5nMnBubSQoTykgbGlicG5nJChMKSB6bGliJChMKQorCitwbm0ycG5nJChPKTogcG5tMnBuZyQoQykKKyAgICAgICAgJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIHBubTJwbmckKEMpCisKK3BubTJwbmckKEUpOiBwbm0ycG5nJChPKQorICAgICAgICAkKExEKSAkKExERkxBR1MpIHBubTJwbmckKE8pIGxpYnBuZyQoTCkgemxpYiQoTCkKKworY2xlYW46CisgICAgICAgICQoUk0pICokKE8pCisgICAgICAgICQoUk0pICokKEUpCisKKyMgRW5kIG9mIG1ha2VmaWxlIGZvciBwbmcycG5tIC8gcG5tMnBuZwpkaWZmIC0tZ2l0IGEvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvbWFrZXZtcy5jb20gYi9saWJwbmcvY29udHJpYi9wbmdtaW51cy9tYWtldm1zLmNvbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDU2MWJjCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvbWFrZXZtcy5jb20KQEAgLTAsMCArMSw5MiBAQAorJCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQhIG1ha2UgQ29udHJpYiBwcm9ncmFtcyBvZiBsaWJwbmcgdW5kZXIgT3BlblZNUworJCEKKyQhCiskISBMb29rIGZvciB0aGUgY29tcGlsZXIgdXNlZAorJCEKKyQgemxpYnNyYyA9ICJbLS0tLnpsaWJdIgorJCBjY29wdD0iL2luY2x1ZGU9KCcnemxpYnNyYycsWy0tXSkiCiskIGlmIGYkZ2V0c3lpKCJIV19NT0RFTCIpLmdlLjEwMjQKKyQgdGhlbgorJCAgY2NvcHQgPSAiL3ByZWZpeD1hbGwiK2Njb3B0CiskICBjb21wICA9ICJfX2RlY2NfXz0xIgorJCAgaWYgZiR0cm5sbm0oIlNZUyIpLmVxcy4iIiB0aGVuIGRlZmluZSBzeXMgc3lzJGxpYnJhcnk6CiskIGVsc2UKKyQgIGlmIGYkc2VhcmNoKCJTWVMkU1lTVEVNOkRFQ0MkQ09NUElMRVIuRVhFIikuZXFzLiIiCiskICAgdGhlbgorJCAgICBpZiBmJHRybmxubSgiU1lTIikuZXFzLiIiIHRoZW4gZGVmaW5lIHN5cyBzeXMkbGlicmFyeToKKyQgICAgaWYgZiRzZWFyY2goIlNZUyRTWVNURU06VkFYQy5FWEUiKS5lcXMuIiIKKyQgICAgIHRoZW4KKyQgICAgICBjb21wICA9ICJfX2djY19fPTEiCiskICAgICAgQ0MgOj09IEdDQworJCAgICAgZWxzZQorJCAgICAgIGNvbXAgPSAiX192YXhjX189MSIKKyQgICAgIGVuZGlmCiskICAgZWxzZQorJCAgICBpZiBmJHRybmxubSgiU1lTIikuZXFzLiIiIHRoZW4gZGVmaW5lIHN5cyBkZWNjJGxpYnJhcnlfaW5jbHVkZToKKyQgICAgY2NvcHQgPSAiL2RlY2MvcHJlZml4PWFsbCIrY2NvcHQKKyQgICAgY29tcCAgPSAiX19kZWNjX189MSIKKyQgIGVuZGlmCiskIGVuZGlmCiskIG9wZW4vd3JpdGUgbG9wdCBsaWIub3B0CiskIHdyaXRlIGxvcHQgIlstLV1saWJwbmcub2xiL2xpYiIKKyQgd3JpdGUgbG9wdCAiJyd6bGlic3JjJ2xpYnoub2xiL2xpYiIKKyQgY2xvc2UgbG9wdAorJCBvcGVuL3dyaXRlIHhvcHQgeDExLm9wdAorJCB3cml0ZSB4b3B0ICJzeXMkbGlicmFyeTpkZWN3JHhsaWJzaHIuZXhlL3NoYXJlIgorJCBjbG9zZSB4b3B0CiskIHdyaXRlIHN5cyRvdXRwdXQgIkNvbXBpbGluZyBQTkcgY29udHJpYiBwcm9ncmFtcyAuLi4iCiskICAgd3JpdGUgc3lzJG91dHB1dCAiQnVpbGRpbmcgcG5tMnBuZy4uLiIKKyQgICBDQUxMIE1BS0UgcG5tMnBuZy5PQkogImNjICcnQ0NPUFQnIHBubTJwbmciIC0KKwlwbm0ycG5nLmMKKyQgICBjYWxsIG1ha2UgcG5tMnBuZy5leGUgLQorCSJMSU5LIHBubTJwbmcsbGliLm9wdC9vcHQiIC0KKwlwbm0ycG5nLm9iagorJCAgIHdyaXRlIHN5cyRvdXRwdXQgIkJ1aWxkaW5nIHBuZzJwbm0uLi4iCiskICAgQ0FMTCBNQUtFIHBuZzJwbm0uT0JKICJjYyAnJ0NDT1BUJyBwbmcycG5tIiAtCisJcG5nMnBubS5jCiskICAgY2FsbCBtYWtlIHBuZzJwbm0uZXhlIC0KKwkiTElOSyBwbmcycG5tLGxpYi5vcHQvb3B0IiAtCisJcG5nMnBubS5vYmoKKyQgZXhpdAorJCEKKyQhCiskTUFLRTogU1VCUk9VVElORSAgICFTVUJST1VUSU5FIFRPIENIRUNLIERFUEVOREVOQ0lFUworJCBWID0gJ0YkVmVyaWZ5KDApCiskISBQMSA9IFdoYXQgd2UgYXJlIHRyeWluZyB0byBtYWtlCiskISBQMiA9IENvbW1hbmQgdG8gbWFrZSBpdAorJCEgUDMgLSBQOCAgV2hhdCBpdCBkZXBlbmRzIG9uCiskCiskIElmIEYkU2VhcmNoKFAxKSAuRXFzLiAiIiBUaGVuIEdvdG8gTWFrZWl0CiskIFRpbWUgPSBGJEN2VGltZShGJEZpbGUoUDEsIlJEVCIpKQorJGFyZz0zCiskTG9vcDoKKyQgICAgICAgQXJndW1lbnQgPSBQJ2FyZworJCAgICAgICBJZiBBcmd1bWVudCAuRXFzLiAiIiBUaGVuIEdvdG8gRXhpdAorJCAgICAgICBFbD0wCiskTG9vcDI6CiskICAgICAgIEZpbGUgPSBGJEVsZW1lbnQoRWwsIiAiLEFyZ3VtZW50KQorJCAgICAgICBJZiBGaWxlIC5FcXMuICIgIiBUaGVuIEdvdG8gRW5kbAorJCAgICAgICBBRmlsZSA9ICIiCiskTG9vcDM6CiskICAgICAgIE9GaWxlID0gQUZpbGUKKyQgICAgICAgQUZpbGUgPSBGJFNlYXJjaChGaWxlKQorJCAgICAgICBJZiBBRmlsZSAuRXFzLiAiIiAuT3IuIEFGaWxlIC5FcXMuIE9GaWxlIFRoZW4gR290byBOZXh0RWwKKyQgICAgICAgSWYgRiRDdlRpbWUoRiRGaWxlKEFGaWxlLCJSRFQiKSkgLkdlcy4gVGltZSBUaGVuIEdvdG8gTWFrZWl0CiskICAgICAgIEdvdG8gTG9vcDMKKyROZXh0RUw6CiskICAgICAgIEVsID0gRWwgKyAxCiskICAgICAgIEdvdG8gTG9vcDIKKyRFbmRMOgorJCBhcmc9YXJnKzEKKyQgSWYgYXJnIC5MZS4gOCBUaGVuIEdvdG8gTG9vcAorJCBHb3RvIEV4aXQKKyQKKyRNYWtlaXQ6CiskIFZWPUYkVkVSSUZZKDApCiskIHdyaXRlIHN5cyRvdXRwdXQgUDIKKyQgJ1AyCiskIFZWPSdGJFZlcmlmeShWVikKKyRFeGl0OgorJCBJZiBWIFRoZW4gU2V0IFZlcmlmeQorJEVORFNVQlJPVVRJTkUKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BuZzJwbm0uYmF0IGIvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvcG5nMnBubS5iYXQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDQ5Y2YzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BuZzJwbm0uYmF0CkBAIC0wLDAgKzEsNDEgQEAKK1JFTSAtLSBncmF5c2NhbGUKK3BuZzJwbm0uZXhlIC1ub3JhdyAuLlxwbmdzdWl0ZVxiYXNuMGcwMS5wbmcgYmFzbjBnMDEucGdtCitwbmcycG5tLmV4ZSAtbm9yYXcgLi5ccG5nc3VpdGVcYmFzbjBnMDIucG5nIGJhc24wZzAyLnBnbQorcG5nMnBubS5leGUgLW5vcmF3IC4uXHBuZ3N1aXRlXGJhc24wZzA0LnBuZyBiYXNuMGcwNC5wZ20KK3BuZzJwbm0uZXhlIC1ub3JhdyAuLlxwbmdzdWl0ZVxiYXNuMGcwOC5wbmcgYmFzbjBnMDgucGdtCitwbmcycG5tLmV4ZSAtbm9yYXcgLi5ccG5nc3VpdGVcYmFzbjBnMTYucG5nIGJhc24wZzE2LnBnbQorUkVNIC0tIGZ1bGwtY29sb3IKK3BuZzJwbm0uZXhlIC1ub3JhdyAuLlxwbmdzdWl0ZVxiYXNuMmMwOC5wbmcgYmFzbjJjMDgucHBtCitwbmcycG5tLmV4ZSAtbm9yYXcgLi5ccG5nc3VpdGVcYmFzbjJjMTYucG5nIGJhc24yYzE2LnBwbQorUkVNIC0tIHBhbGxldHRlZAorcG5nMnBubS5leGUgLW5vcmF3IC4uXHBuZ3N1aXRlXGJhc24zcDAxLnBuZyBiYXNuM3AwMS5wcG0KK3BuZzJwbm0uZXhlIC1ub3JhdyAuLlxwbmdzdWl0ZVxiYXNuM3AwMi5wbmcgYmFzbjNwMDIucHBtCitwbmcycG5tLmV4ZSAtbm9yYXcgLi5ccG5nc3VpdGVcYmFzbjNwMDQucG5nIGJhc24zcDA0LnBwbQorcG5nMnBubS5leGUgLW5vcmF3IC4uXHBuZ3N1aXRlXGJhc24zcDA4LnBuZyBiYXNuM3AwOC5wcG0KK1JFTSAtLSBncmF5IHdpdGggYWxwaGEtY2hhbm5lbAorcG5nMnBubS5leGUgLW5vcmF3IC4uXHBuZ3N1aXRlXGJhc240YTA4LnBuZyBiYXNuNGEwOC5wZ20KK3BuZzJwbm0uZXhlIC1ub3JhdyAuLlxwbmdzdWl0ZVxiYXNuNGExNi5wbmcgYmFzbjRhMTYucGdtCitSRU0gLS0gY29sb3Igd2l0aCBhbHBoYS1jaGFubmVsCitwbmcycG5tLmV4ZSAtbm9yYXcgLWFscGhhIGJhc242YTA4LnBnbSAuLlxwbmdzdWl0ZVxiYXNuNmEwOC5wbmcgYmFzbjZhMDgucHBtCitwbmcycG5tLmV4ZSAtbm9yYXcgLWFscGhhIGJhc242YTE2LnBnbSAuLlxwbmdzdWl0ZVxiYXNuNmExNi5wbmcgYmFzbjZhMTYucHBtCitSRU0gLS0gZ3JheXNjYWxlCitwbmcycG5tLmV4ZSAtcmF3IC4uXHBuZ3N1aXRlXGJhc24wZzAxLnBuZyByYXduMGcwMS5wZ20KK3BuZzJwbm0uZXhlIC1yYXcgLi5ccG5nc3VpdGVcYmFzbjBnMDIucG5nIHJhd24wZzAyLnBnbQorcG5nMnBubS5leGUgLXJhdyAuLlxwbmdzdWl0ZVxiYXNuMGcwNC5wbmcgcmF3bjBnMDQucGdtCitwbmcycG5tLmV4ZSAtcmF3IC4uXHBuZ3N1aXRlXGJhc24wZzA4LnBuZyByYXduMGcwOC5wZ20KK3BuZzJwbm0uZXhlIC1yYXcgLi5ccG5nc3VpdGVcYmFzbjBnMTYucG5nIHJhd24wZzE2LnBnbQorUkVNIC0tIGZ1bGwtY29sb3IKK3BuZzJwbm0uZXhlIC1yYXcgLi5ccG5nc3VpdGVcYmFzbjJjMDgucG5nIHJhd24yYzA4LnBwbQorcG5nMnBubS5leGUgLXJhdyAuLlxwbmdzdWl0ZVxiYXNuMmMxNi5wbmcgcmF3bjJjMTYucHBtCitSRU0gLS0gcGFsbGV0dGVkCitwbmcycG5tLmV4ZSAtcmF3IC4uXHBuZ3N1aXRlXGJhc24zcDAxLnBuZyByYXduM3AwMS5wcG0KK3BuZzJwbm0uZXhlIC1yYXcgLi5ccG5nc3VpdGVcYmFzbjNwMDIucG5nIHJhd24zcDAyLnBwbQorcG5nMnBubS5leGUgLXJhdyAuLlxwbmdzdWl0ZVxiYXNuM3AwNC5wbmcgcmF3bjNwMDQucHBtCitwbmcycG5tLmV4ZSAtcmF3IC4uXHBuZ3N1aXRlXGJhc24zcDA4LnBuZyByYXduM3AwOC5wcG0KK1JFTSAtLSBncmF5IHdpdGggYWxwaGEtY2hhbm5lbAorcG5nMnBubS5leGUgLXJhdyAuLlxwbmdzdWl0ZVxiYXNuNGEwOC5wbmcgcmF3bjRhMDgucGdtCitwbmcycG5tLmV4ZSAtcmF3IC4uXHBuZ3N1aXRlXGJhc240YTE2LnBuZyByYXduNGExNi5wZ20KK1JFTSAtLSBjb2xvciB3aXRoIGFscGhhLWNoYW5uZWwKK3BuZzJwbm0uZXhlIC1ub3JhdyAtYWxwaGEgcmF3bjZhMDgucGdtIC4uXHBuZ3N1aXRlXGJhc242YTA4LnBuZyByYXduNmEwOC5wcG0KK3BuZzJwbm0uZXhlIC1ub3JhdyAtYWxwaGEgcmF3bjZhMTYucGdtIC4uXHBuZ3N1aXRlXGJhc242YTE2LnBuZyByYXduNmExNi5wcG0KKwpkaWZmIC0tZ2l0IGEvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvcG5nMnBubS5jIGIvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvcG5nMnBubS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2OGQ3ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9wbmdtaW51cy9wbmcycG5tLmMKQEAgLTAsMCArMSw0MzggQEAKKy8qCisgKiAgcG5nMnBubS5jIC0tLSBjb252ZXJzaW9uIGZyb20gUE5HLWZpbGUgdG8gUEdNL1BQTS1maWxlCisgKiAgY29weXJpZ2h0IChDKSAxOTk5IGJ5IFdpbGxlbSB2YW4gU2NoYWlrIDx3aWxsZW1Ac2NoYWlrLmNvbT4KKyAqCisgKiAgdmVyc2lvbiAxLjAgLSAxOTk5LjEwLjE1IC0gRmlyc3QgdmVyc2lvbi4KKyAqCisgKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQKKyAqICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAorICogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiAgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0CisgKiAgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lmZGVmIF9fVFVSQk9DX18KKyNpbmNsdWRlIDxtZW0uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2VuZGlmCisjaW5jbHVkZSA8emxpYi5oPgorCisjaWZuZGVmIEJPT0wKKyNkZWZpbmUgQk9PTCB1bnNpZ25lZCBjaGFyCisjZW5kaWYKKyNpZm5kZWYgVFJVRQorI2RlZmluZSBUUlVFIChCT09MKSAxCisjZW5kaWYKKyNpZm5kZWYgRkFMU0UKKyNkZWZpbmUgRkFMU0UgKEJPT0wpIDAKKyNlbmRpZgorCisjaWZkZWYgX19UVVJCT0NfXworI2RlZmluZSBTVERJTiAgMAorI2RlZmluZSBTVERPVVQgMQorI2RlZmluZSBTVERFUlIgMgorI2VuZGlmCisKKy8qIHRvIG1ha2UgcG5nMnBubSB2ZXJib3NlIHNvIHdlIGNhbiBmaW5kIHByb2JsZW1zIChuZWVkcyB0byBiZSBiZWZvcmUgcG5nLmgpICovCisjaWZuZGVmIFBOR19ERUJVRworI2RlZmluZSBQTkdfREVCVUcgMAorI2VuZGlmCisKKyNpbmNsdWRlICJwbmcuaCIKKworLyogRGVmaW5lIHBuZ19qbXBidWYoKSBpbiBjYXNlIHdlIGFyZSB1c2luZyBhIHByZS0xLjAuNiB2ZXJzaW9uIG9mIGxpYnBuZyAqLworI2lmbmRlZiBwbmdfam1wYnVmCisjICBkZWZpbmUgcG5nX2ptcGJ1ZihwbmdfcHRyKSAoKHBuZ19wdHIpLT5qbXBidWYpCisjZW5kaWYKKworLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqLworCitpbnQgIG1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pOwordm9pZCB1c2FnZSAoKTsKK0JPT0wgcG5nMnBubSAoRklMRSAqcG5nX2ZpbGUsIEZJTEUgKnBubV9maWxlLCBGSUxFICphbHBoYV9maWxlLCBCT09MIHJhdywKKyAgIEJPT0wgYWxwaGEpOworCisvKgorICogIG1haW4KKyAqLworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBGSUxFICpmcF9yZCA9IHN0ZGluOworICBGSUxFICpmcF93ciA9IHN0ZG91dDsKKyAgRklMRSAqZnBfYWwgPSBOVUxMOworICBCT09MIHJhdyA9IFRSVUU7CisgIEJPT0wgYWxwaGEgPSBGQUxTRTsKKyAgaW50IGFyZ2k7CisKKyAgZm9yIChhcmdpID0gMTsgYXJnaSA8IGFyZ2M7IGFyZ2krKykKKyAgeworICAgIGlmIChhcmd2W2FyZ2ldWzBdID09ICctJykKKyAgICB7CisgICAgICBzd2l0Y2ggKGFyZ3ZbYXJnaV1bMV0pCisgICAgICB7CisgICAgICAgIGNhc2UgJ24nOgorICAgICAgICAgIHJhdyA9IEZBTFNFOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICByYXcgPSBUUlVFOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdhJzoKKyAgICAgICAgICBhbHBoYSA9IFRSVUU7CisgICAgICAgICAgYXJnaSsrOworICAgICAgICAgIGlmICgoZnBfYWwgPSBmb3BlbiAoYXJndlthcmdpXSwgIndiIikpID09IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUE5NMlBOR1xuIik7CisgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvcjogIGNhbiBub3QgY3JlYXRlIGFscGhhLWNoYW5uZWwgZmlsZSAlc1xuIiwKKyAgICAgICAgICAgICAgIGFyZ3ZbYXJnaV0pOworICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgY2FzZSAnPyc6CisgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgICBleGl0KDApOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIlBORzJQTk1cbiIpOworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yOiAgdW5rbm93biBvcHRpb24gJXNcbiIsIGFyZ3ZbYXJnaV0pOworICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0gLyogZW5kIHN3aXRjaCAqLworICAgIH0KKyAgICBlbHNlIGlmIChmcF9yZCA9PSBzdGRpbikKKyAgICB7CisgICAgICBpZiAoKGZwX3JkID0gZm9wZW4gKGFyZ3ZbYXJnaV0sICJyYiIpKSA9PSBOVUxMKQorICAgICAgeworICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIlBORzJQTk1cbiIpOworICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3I6ICBmaWxlICVzIGRvZXMgbm90IGV4aXN0XG4iLCBhcmd2W2FyZ2ldKTsKKyAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChmcF93ciA9PSBzdGRvdXQpCisgICAgeworICAgICAgaWYgKChmcF93ciA9IGZvcGVuIChhcmd2W2FyZ2ldLCAid2IiKSkgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUE5HMlBOTVxuIik7CisgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yOiAgY2FuIG5vdCBjcmVhdGUgZmlsZSAlc1xuIiwgYXJndlthcmdpXSk7CisgICAgICAgIGV4aXQgKDEpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUE5HMlBOTVxuIik7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvcjogIHRvbyBtYW55IHBhcmFtZXRlcnNcbiIpOworICAgICAgdXNhZ2UoKTsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorICB9IC8qIGVuZCBmb3IgKi8KKworI2lmZGVmIF9fVFVSQk9DX18KKyAgLyogc2V0IHN0ZGluL3N0ZG91dCBpZiByZXF1aXJlZCB0byBiaW5hcnkgKi8KKyAgaWYgKGZwX3JkID09IHN0ZGluKQorICB7CisgICAgc2V0bW9kZSAoU1RESU4sIE9fQklOQVJZKTsKKyAgfQorICBpZiAoKHJhdykgJiYgKGZwX3dyID09IHN0ZG91dCkpCisgIHsKKyAgICBzZXRtb2RlIChTVERPVVQsIE9fQklOQVJZKTsKKyAgfQorI2VuZGlmCisKKyAgLyogY2FsbCB0aGUgY29udmVyc2lvbiBwcm9ncmFtIGl0c2VsZiAqLworICBpZiAocG5nMnBubSAoZnBfcmQsIGZwX3dyLCBmcF9hbCwgcmF3LCBhbHBoYSkgPT0gRkFMU0UpCisgIHsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJQTkcyUE5NXG4iKTsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvcjogIHVuc3VjY2Vzc2Z1bCBjb252ZXJzaW9uIG9mIFBORy1pbWFnZVxuIik7CisgICAgZXhpdCgxKTsKKyAgfQorCisgIC8qIGNsb3NlIGlucHV0IGZpbGUgKi8KKyAgZmNsb3NlIChmcF9yZCk7CisgIC8qIGNsb3NlIG91dHB1dCBmaWxlICovCisgIGZjbG9zZSAoZnBfd3IpOworICAvKiBjbG9zZSBhbHBoYSBmaWxlICovCisgIGlmIChhbHBoYSkKKyAgICBmY2xvc2UgKGZwX2FsKTsKKworICByZXR1cm4gMDsKK30KKworLyoKKyAqICB1c2FnZQorICovCisKK3ZvaWQgdXNhZ2UoKQoreworICBmcHJpbnRmIChzdGRlcnIsICJQTkcyUE5NXG4iKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiICAgYnkgV2lsbGVtIHZhbiBTY2hhaWssIDE5OTlcbiIpOworI2lmZGVmIF9fVFVSQk9DX18KKyAgZnByaW50ZiAoc3RkZXJyLCAiICAgZm9yIFR1cmJvLUMgYW5kIEJvcmxhbmQtQyBjb21waWxlcnNcbiIpOworI2Vsc2UKKyAgZnByaW50ZiAoc3RkZXJyLCAiICAgZm9yIExpbnV4IChhbmQgVW5peCkgY29tcGlsZXJzXG4iKTsKKyNlbmRpZgorICBmcHJpbnRmIChzdGRlcnIsICJVc2FnZTogIHBuZzJwbm0gW29wdGlvbnNdIDxmaWxlPi5wbmcgWzxmaWxlPi5wbm1dXG4iKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiICAgb3I6ICAuLi4gfCBwbmcycG5tIFtvcHRpb25zXVxuIik7CisgIGZwcmludGYgKHN0ZGVyciwgIk9wdGlvbnM6XG4iKTsKKyAgZnByaW50ZiAoc3RkZXJyLAorICAgICAiICAgLXJbYXddICAgd3JpdGUgcG5tLWZpbGUgaW4gYmluYXJ5IGZvcm1hdCAoUDQvUDUvUDYpIChkZWZhdWx0KVxuIik7CisgIGZwcmludGYgKHN0ZGVyciwgIiAgIC1uW29yYXddIHdyaXRlIHBubS1maWxlIGluIGFzY2lpIGZvcm1hdCAoUDEvUDIvUDMpXG4iKTsKKyAgZnByaW50ZiAoc3RkZXJyLAorICAgICAiICAgLWFbbHBoYV0gPGZpbGU+LnBnbSB3cml0ZSBQTkcgYWxwaGEgY2hhbm5lbCBhcyBwZ20tZmlsZVxuIik7CisgIGZwcmludGYgKHN0ZGVyciwgIiAgIC1oIHwgLT8gIHByaW50IHRoaXMgaGVscC1pbmZvcm1hdGlvblxuIik7Cit9CisKKy8qCisgKiAgcG5nMnBubQorICovCisKK0JPT0wgcG5nMnBubSAoRklMRSAqcG5nX2ZpbGUsIEZJTEUgKnBubV9maWxlLCBGSUxFICphbHBoYV9maWxlLAorICAgIHZvbGF0aWxlIEJPT0wgcmF3LCBCT09MIGFscGhhKQoreworICBwbmdfc3RydWN0ICAgICpwbmdfcHRyID0gTlVMTDsKKyAgcG5nX2luZm8gICAgICAgICppbmZvX3B0ciA9IE5VTEw7CisgIHBuZ19ieXRlICAgICAgYnVmWzhdOworICBwbmdfYnl0ZSAgICAgICpwbmdfcGl4ZWxzID0gTlVMTDsKKyAgcG5nX2J5dGUgICAgICAqKnJvd19wb2ludGVycyA9IE5VTEw7CisgIHBuZ19ieXRlICAgICAgKnBpeF9wdHIgPSBOVUxMOworICBwbmdfdWludF8zMiAgIHJvd19ieXRlczsKKworICBwbmdfdWludF8zMiAgIHdpZHRoOworICBwbmdfdWludF8zMiAgIGhlaWdodDsKKyAgaW50ICAgICAgICAgICBiaXRfZGVwdGg7CisgIGludCAgICAgICAgICAgY2hhbm5lbHM7CisgIGludCAgICAgICAgICAgY29sb3JfdHlwZTsKKyAgaW50ICAgICAgICAgICBhbHBoYV9wcmVzZW50OworICBpbnQgICAgICAgICAgIHJvdywgY29sOworICBpbnQgICAgICAgICAgIHJldDsKKyAgaW50ICAgICAgICAgICBpOworICBsb25nICAgICAgICAgIGRlcF8xNjsKKworICAvKiByZWFkIGFuZCBjaGVjayBzaWduYXR1cmUgaW4gUE5HIGZpbGUgKi8KKyAgcmV0ID0gZnJlYWQgKGJ1ZiwgMSwgOCwgcG5nX2ZpbGUpOworICBpZiAocmV0ICE9IDgpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldCA9IHBuZ19zaWdfY21wIChidWYsIDAsIDgpOworICBpZiAocmV0KQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBjcmVhdGUgcG5nIGFuZCBpbmZvIHN0cnVjdHVyZXMgKi8KKworICBwbmdfcHRyID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCAocG5nX2dldF9saWJwbmdfdmVyKE5VTEwpLAorICAgIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoIXBuZ19wdHIpCisgICAgcmV0dXJuIEZBTFNFOyAgIC8qIG91dCBvZiBtZW1vcnkgKi8KKworICBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QgKHBuZ19wdHIpOworICBpZiAoIWluZm9fcHRyKQorICB7CisgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QgKCZwbmdfcHRyLCBOVUxMLCBOVUxMKTsKKyAgICByZXR1cm4gRkFMU0U7ICAgLyogb3V0IG9mIG1lbW9yeSAqLworICB9CisKKyAgaWYgKHNldGptcCAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpCisgIHsKKyAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCAoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogc2V0IHVwIHRoZSBpbnB1dCBjb250cm9sIGZvciBDIHN0cmVhbXMgKi8KKyAgcG5nX2luaXRfaW8gKHBuZ19wdHIsIHBuZ19maWxlKTsKKyAgcG5nX3NldF9zaWdfYnl0ZXMgKHBuZ19wdHIsIDgpOyAgLyogd2UgYWxyZWFkeSByZWFkIHRoZSA4IHNpZ25hdHVyZSBieXRlcyAqLworCisgIC8qIHJlYWQgdGhlIGZpbGUgaW5mb3JtYXRpb24gKi8KKyAgcG5nX3JlYWRfaW5mbyAocG5nX3B0ciwgaW5mb19wdHIpOworCisgIC8qIGdldCBzaXplIGFuZCBiaXQtZGVwdGggb2YgdGhlIFBORy1pbWFnZSAqLworICBwbmdfZ2V0X0lIRFIgKHBuZ19wdHIsIGluZm9fcHRyLAorICAgICZ3aWR0aCwgJmhlaWdodCwgJmJpdF9kZXB0aCwgJmNvbG9yX3R5cGUsCisgICAgTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgLyogc2V0LXVwIHRoZSB0cmFuc2Zvcm1hdGlvbnMgKi8KKworICAvKiB0cmFuc2Zvcm0gcGFsZXR0ZWQgaW1hZ2VzIGludG8gZnVsbC1jb2xvciByZ2IgKi8KKyAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgICBwbmdfc2V0X2V4cGFuZCAocG5nX3B0cik7CisgIC8qIGV4cGFuZCBpbWFnZXMgdG8gYml0LWRlcHRoIDggKG9ubHkgYXBwbGljYWJsZSBmb3IgZ3JheXNjYWxlIGltYWdlcykgKi8KKyAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSAmJiBiaXRfZGVwdGggPCA4KQorICAgIHBuZ19zZXRfZXhwYW5kIChwbmdfcHRyKTsKKyAgLyogdHJhbnNmb3JtIHRyYW5zcGFyZW5jeSBtYXBzIGludG8gZnVsbCBhbHBoYS1jaGFubmVsICovCisgIGlmIChwbmdfZ2V0X3ZhbGlkIChwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0lORk9fdFJOUykpCisgICAgcG5nX3NldF9leHBhbmQgKHBuZ19wdHIpOworCisjaWZkZWYgTkpFVAorICAvKiBkb3duZ3JhZGUgMTYtYml0IGltYWdlcyB0byA4LWJpdCAqLworICBpZiAoYml0X2RlcHRoID09IDE2KQorICAgIHBuZ19zZXRfc3RyaXBfMTYgKHBuZ19wdHIpOworICAvKiB0cmFuc2Zvcm0gZ3JheXNjYWxlIGltYWdlcyBpbnRvIGZ1bGwtY29sb3IgKi8KKyAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSB8fAorICAgIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkKKyAgICBwbmdfc2V0X2dyYXlfdG9fcmdiIChwbmdfcHRyKTsKKyAgLyogb25seSBpZiBmaWxlIGhhcyBhIGZpbGUgZ2FtbWEsIHdlIGRvIGEgY29ycmVjdGlvbiAqLworICBpZiAocG5nX2dldF9nQU1BIChwbmdfcHRyLCBpbmZvX3B0ciwgJmZpbGVfZ2FtbWEpKQorICAgIHBuZ19zZXRfZ2FtbWEgKHBuZ19wdHIsIChkb3VibGUpIDIuMiwgZmlsZV9nYW1tYSk7CisjZW5kaWYKKworICAvKiBhbGwgdHJhbnNmb3JtYXRpb25zIGhhdmUgYmVlbiByZWdpc3RlcmVkOyBub3cgdXBkYXRlIGluZm9fcHRyIGRhdGEsCisgICAqIGdldCByb3dieXRlcyBhbmQgY2hhbm5lbHMsIGFuZCBhbGxvY2F0ZSBpbWFnZSBtZW1vcnkgKi8KKworICBwbmdfcmVhZF91cGRhdGVfaW5mbyAocG5nX3B0ciwgaW5mb19wdHIpOworCisgIC8qIGdldCB0aGUgbmV3IGNvbG9yLXR5cGUgYW5kIGJpdC1kZXB0aCAoYWZ0ZXIgZXhwYW5zaW9uL3N0cmlwcGluZykgKi8KKyAgcG5nX2dldF9JSERSIChwbmdfcHRyLCBpbmZvX3B0ciwgJndpZHRoLCAmaGVpZ2h0LCAmYml0X2RlcHRoLCAmY29sb3JfdHlwZSwKKyAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKworICAvKiBjaGVjayBmb3IgMTYtYml0IGZpbGVzICovCisgIGlmIChiaXRfZGVwdGggPT0gMTYpCisgIHsKKyAgICByYXcgPSBGQUxTRTsKKyNpZmRlZiBfX1RVUkJPQ19fCisgICAgcG5tX2ZpbGUtPmZsYWdzICY9IH4oKHVuc2lnbmVkKSBfRl9CSU4pOworI2VuZGlmCisgIH0KKworICAvKiBjYWxjdWxhdGUgbmV3IG51bWJlciBvZiBjaGFubmVscyBhbmQgc3RvcmUgYWxwaGEtcHJlc2VuY2UgKi8KKyAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkKKyAgICBjaGFubmVscyA9IDE7CisgIGVsc2UgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkKKyAgICBjaGFubmVscyA9IDI7CisgIGVsc2UgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQorICAgIGNoYW5uZWxzID0gMzsKKyAgZWxzZSBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCisgICAgY2hhbm5lbHMgPSA0OworICBlbHNlCisgICAgY2hhbm5lbHMgPSAwOyAvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisgIGFscGhhX3ByZXNlbnQgPSAoY2hhbm5lbHMgLSAxKSAlIDI7CisKKyAgLyogY2hlY2sgaWYgYWxwaGEgaXMgZXhwZWN0ZWQgdG8gYmUgcHJlc2VudCBpbiBmaWxlICovCisgIGlmIChhbHBoYSAmJiAhYWxwaGFfcHJlc2VudCkKKyAgeworICAgIGZwcmludGYgKHN0ZGVyciwgIlBORzJQTk1cbiIpOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yOiAgUE5HLWZpbGUgZG9lc24ndCBjb250YWluIGFscGhhIGNoYW5uZWxcbiIpOworICAgIGV4aXQgKDEpOworICB9CisKKyAgLyogcm93X2J5dGVzIGlzIHRoZSB3aWR0aCB4IG51bWJlciBvZiBjaGFubmVscyB4IChiaXQtZGVwdGggLyA4KSAqLworICByb3dfYnl0ZXMgPSBwbmdfZ2V0X3Jvd2J5dGVzIChwbmdfcHRyLCBpbmZvX3B0cik7CisKKyAgaWYgKChwbmdfcGl4ZWxzID0gKHBuZ19ieXRlICopCisgICAgIG1hbGxvYyAocm93X2J5dGVzICogaGVpZ2h0ICogc2l6ZW9mIChwbmdfYnl0ZSkpKSA9PSBOVUxMKSB7CisgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QgKCZwbmdfcHRyLCAmaW5mb19wdHIsIE5VTEwpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmICgocm93X3BvaW50ZXJzID0gKHBuZ19ieXRlICoqKQorICAgICBtYWxsb2MgKGhlaWdodCAqIHNpemVvZiAocG5nX2J5dGVwKSkpID09IE5VTEwpCisgIHsKKyAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCAoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7CisgICAgZnJlZSAocG5nX3BpeGVscyk7CisgICAgcG5nX3BpeGVscyA9IE5VTEw7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogc2V0IHRoZSBpbmRpdmlkdWFsIHJvd19wb2ludGVycyB0byBwb2ludCBhdCB0aGUgY29ycmVjdCBvZmZzZXRzICovCisgIGZvciAoaSA9IDA7IGkgPCAoKGludCkgaGVpZ2h0KTsgaSsrKQorICAgIHJvd19wb2ludGVyc1tpXSA9IHBuZ19waXhlbHMgKyBpICogcm93X2J5dGVzOworCisgIC8qIG5vdyB3ZSBjYW4gZ28gYWhlYWQgYW5kIGp1c3QgcmVhZCB0aGUgd2hvbGUgaW1hZ2UgKi8KKyAgcG5nX3JlYWRfaW1hZ2UgKHBuZ19wdHIsIHJvd19wb2ludGVycyk7CisKKyAgLyogcmVhZCByZXN0IG9mIGZpbGUsIGFuZCBnZXQgYWRkaXRpb25hbCBjaHVua3MgaW4gaW5mb19wdHIgLSBSRVFVSVJFRCAqLworICBwbmdfcmVhZF9lbmQgKHBuZ19wdHIsIGluZm9fcHRyKTsKKworICAvKiBjbGVhbiB1cCBhZnRlciB0aGUgcmVhZCwgYW5kIGZyZWUgYW55IG1lbW9yeSBhbGxvY2F0ZWQgLSBSRVFVSVJFRCAqLworICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCAoJnBuZ19wdHIsICZpbmZvX3B0ciwgKHBuZ19pbmZvcHApIE5VTEwpOworCisgIC8qIHdyaXRlIGhlYWRlciBvZiBQTk0gZmlsZSAqLworCisgIGlmICgoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKSB8fAorICAgICAgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkpCisgIHsKKyAgICBmcHJpbnRmIChwbm1fZmlsZSwgIiVzXG4iLCAocmF3KSA/ICJQNSIgOiAiUDIiKTsKKyAgICBmcHJpbnRmIChwbm1fZmlsZSwgIiVkICVkXG4iLCAoaW50KSB3aWR0aCwgKGludCkgaGVpZ2h0KTsKKyAgICBmcHJpbnRmIChwbm1fZmlsZSwgIiVsZFxuIiwgKCgxTCA8PCAoaW50KSBiaXRfZGVwdGgpIC0gMUwpKTsKKyAgfQorICBlbHNlIGlmICgoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpIHx8CisgICAgICAgICAgIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkpCisgIHsKKyAgICBmcHJpbnRmIChwbm1fZmlsZSwgIiVzXG4iLCAocmF3KSA/ICJQNiIgOiAiUDMiKTsKKyAgICBmcHJpbnRmIChwbm1fZmlsZSwgIiVkICVkXG4iLCAoaW50KSB3aWR0aCwgKGludCkgaGVpZ2h0KTsKKyAgICBmcHJpbnRmIChwbm1fZmlsZSwgIiVsZFxuIiwgKCgxTCA8PCAoaW50KSBiaXRfZGVwdGgpIC0gMUwpKTsKKyAgfQorCisgIC8qIHdyaXRlIGhlYWRlciBvZiBQR00gZmlsZSB3aXRoIGFscGhhIGNoYW5uZWwgKi8KKworICBpZiAoKGFscGhhKSAmJgorICAgICAgKChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpIHx8CisgICAgICAgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKSkpCisgIHsKKyAgICBmcHJpbnRmIChhbHBoYV9maWxlLCAiJXNcbiIsIChyYXcpID8gIlA1IiA6ICJQMiIpOworICAgIGZwcmludGYgKGFscGhhX2ZpbGUsICIlZCAlZFxuIiwgKGludCkgd2lkdGgsIChpbnQpIGhlaWdodCk7CisgICAgZnByaW50ZiAoYWxwaGFfZmlsZSwgIiVsZFxuIiwgKCgxTCA8PCAoaW50KSBiaXRfZGVwdGgpIC0gMUwpKTsKKyAgfQorCisgIC8qIHdyaXRlIGRhdGEgdG8gUE5NIGZpbGUgKi8KKyAgcGl4X3B0ciA9IHBuZ19waXhlbHM7CisKKyAgZm9yIChyb3cgPSAwOyByb3cgPCAoaW50KSBoZWlnaHQ7IHJvdysrKQorICB7CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCAoaW50KSB3aWR0aDsgY29sKyspCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IChjaGFubmVscyAtIGFscGhhX3ByZXNlbnQpOyBpKyspCisgICAgICB7CisgICAgICAgIGlmIChyYXcpCisgICAgICAgICAgZnB1dGMgKChpbnQpICpwaXhfcHRyKysgLCBwbm1fZmlsZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBpZiAoYml0X2RlcHRoID09IDE2KXsKKyAgICAgICAgICAgIGRlcF8xNiA9IChsb25nKSAqcGl4X3B0cisrOworICAgICAgICAgICAgZnByaW50ZiAocG5tX2ZpbGUsICIlbGQgIiwgKGRlcF8xNiA8PCA4KSArICgobG9uZykgKnBpeF9wdHIrKykpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBmcHJpbnRmIChwbm1fZmlsZSwgIiVsZCAiLCAobG9uZykgKnBpeF9wdHIrKyk7CisgICAgICB9CisgICAgICBpZiAoYWxwaGFfcHJlc2VudCkKKyAgICAgIHsKKyAgICAgICAgaWYgKCFhbHBoYSkKKyAgICAgICAgeworICAgICAgICAgIHBpeF9wdHIrKzsgLyogYWxwaGEgKi8KKyAgICAgICAgICBpZiAoYml0X2RlcHRoID09IDE2KQorICAgICAgICAgICAgcGl4X3B0cisrOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogb3V0cHV0IGFscGhhLWNoYW5uZWwgYXMgcGdtIGZpbGUgKi8KKyAgICAgICAgeworICAgICAgICAgIGlmIChyYXcpCisgICAgICAgICAgICBmcHV0YyAoKGludCkgKnBpeF9wdHIrKyAsIGFscGhhX2ZpbGUpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmIChiaXRfZGVwdGggPT0gMTYpeworICAgICAgICAgICAgICBkZXBfMTYgPSAobG9uZykgKnBpeF9wdHIrKzsKKyAgICAgICAgICAgICAgZnByaW50ZiAoYWxwaGFfZmlsZSwgIiVsZCAiLCAoZGVwXzE2IDw8IDgpICsgKGxvbmcpICpwaXhfcHRyKyspOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBmcHJpbnRmIChhbHBoYV9maWxlLCAiJWxkICIsIChsb25nKSAqcGl4X3B0cisrKTsKKyAgICAgICAgfQorICAgICAgfSAvKiBpZiBhbHBoYV9wcmVzZW50ICovCisKKyAgICAgIGlmICghcmF3KQorICAgICAgICBpZiAoY29sICUgNCA9PSAzKQorICAgICAgICAgIGZwcmludGYgKHBubV9maWxlLCAiXG4iKTsKKyAgICB9IC8qIGVuZCBmb3IgY29sICovCisKKyAgICBpZiAoIXJhdykKKyAgICAgIGlmIChjb2wgJSA0ICE9IDApCisgICAgICAgIGZwcmludGYgKHBubV9maWxlLCAiXG4iKTsKKyAgfSAvKiBlbmQgZm9yIHJvdyAqLworCisgIGlmIChyb3dfcG9pbnRlcnMgIT0gKHVuc2lnbmVkIGNoYXIqKikgTlVMTCkKKyAgICBmcmVlIChyb3dfcG9pbnRlcnMpOworICBpZiAocG5nX3BpeGVscyAhPSAodW5zaWduZWQgY2hhciopIE5VTEwpCisgICAgZnJlZSAocG5nX3BpeGVscyk7CisKKyAgcmV0dXJuIFRSVUU7CisKK30gLyogZW5kIG9mIHNvdXJjZSAqLworCmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi9wbmdtaW51cy9wbmcycG5tLnNoIGIvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvcG5nMnBubS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMWMwNTM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvcG5nMnBubS5zaApAQCAtMCwwICsxLDQyIEBACisjIS9iaW4vc2gKKyMgLS0gZ3JheXNjYWxlCisuL3BuZzJwbm0gLW5vcmF3IC4uL3BuZ3N1aXRlL2Jhc24wZzAxLnBuZyBiYXNuMGcwMS5wZ20KKy4vcG5nMnBubSAtbm9yYXcgLi4vcG5nc3VpdGUvYmFzbjBnMDIucG5nIGJhc24wZzAyLnBnbQorLi9wbmcycG5tIC1ub3JhdyAuLi9wbmdzdWl0ZS9iYXNuMGcwNC5wbmcgYmFzbjBnMDQucGdtCisuL3BuZzJwbm0gLW5vcmF3IC4uL3BuZ3N1aXRlL2Jhc24wZzA4LnBuZyBiYXNuMGcwOC5wZ20KKy4vcG5nMnBubSAtbm9yYXcgLi4vcG5nc3VpdGUvYmFzbjBnMTYucG5nIGJhc24wZzE2LnBnbQorIyAtLSBmdWxsLWNvbG9yCisuL3BuZzJwbm0gLW5vcmF3IC4uL3BuZ3N1aXRlL2Jhc24yYzA4LnBuZyBiYXNuMmMwOC5wcG0KKy4vcG5nMnBubSAtbm9yYXcgLi4vcG5nc3VpdGUvYmFzbjJjMTYucG5nIGJhc24yYzE2LnBwbQorIyAtLSBwYWxsZXR0ZWQKKy4vcG5nMnBubSAtbm9yYXcgLi4vcG5nc3VpdGUvYmFzbjNwMDEucG5nIGJhc24zcDAxLnBwbQorLi9wbmcycG5tIC1ub3JhdyAuLi9wbmdzdWl0ZS9iYXNuM3AwMi5wbmcgYmFzbjNwMDIucHBtCisuL3BuZzJwbm0gLW5vcmF3IC4uL3BuZ3N1aXRlL2Jhc24zcDA0LnBuZyBiYXNuM3AwNC5wcG0KKy4vcG5nMnBubSAtbm9yYXcgLi4vcG5nc3VpdGUvYmFzbjNwMDgucG5nIGJhc24zcDA4LnBwbQorIyAtLSBncmF5IHdpdGggYWxwaGEtY2hhbm5lbAorLi9wbmcycG5tIC1ub3JhdyAuLi9wbmdzdWl0ZS9iYXNuNGEwOC5wbmcgYmFzbjRhMDgucGdtCisuL3BuZzJwbm0gLW5vcmF3IC4uL3BuZ3N1aXRlL2Jhc240YTE2LnBuZyBiYXNuNGExNi5wZ20KKyMgLS0gY29sb3Igd2l0aCBhbHBoYS1jaGFubmVsCisuL3BuZzJwbm0gLW5vcmF3IC1hbHBoYSBiYXNuNmEwOC5wZ20gLi4vcG5nc3VpdGUvYmFzbjZhMDgucG5nIGJhc242YTA4LnBwbQorLi9wbmcycG5tIC1ub3JhdyAtYWxwaGEgYmFzbjZhMTYucGdtIC4uL3BuZ3N1aXRlL2Jhc242YTE2LnBuZyBiYXNuNmExNi5wcG0KKyMgLS0gZ3JheXNjYWxlCisuL3BuZzJwbm0gLXJhdyAuLi9wbmdzdWl0ZS9iYXNuMGcwMS5wbmcgcmF3bjBnMDEucGdtCisuL3BuZzJwbm0gLXJhdyAuLi9wbmdzdWl0ZS9iYXNuMGcwMi5wbmcgcmF3bjBnMDIucGdtCisuL3BuZzJwbm0gLXJhdyAuLi9wbmdzdWl0ZS9iYXNuMGcwNC5wbmcgcmF3bjBnMDQucGdtCisuL3BuZzJwbm0gLXJhdyAuLi9wbmdzdWl0ZS9iYXNuMGcwOC5wbmcgcmF3bjBnMDgucGdtCisuL3BuZzJwbm0gLXJhdyAuLi9wbmdzdWl0ZS9iYXNuMGcxNi5wbmcgcmF3bjBnMTYucGdtCisjIC0tIGZ1bGwtY29sb3IKKy4vcG5nMnBubSAtcmF3IC4uL3BuZ3N1aXRlL2Jhc24yYzA4LnBuZyByYXduMmMwOC5wcG0KKy4vcG5nMnBubSAtcmF3IC4uL3BuZ3N1aXRlL2Jhc24yYzE2LnBuZyByYXduMmMxNi5wcG0KKyMgLS0gcGFsbGV0dGVkCisuL3BuZzJwbm0gLXJhdyAuLi9wbmdzdWl0ZS9iYXNuM3AwMS5wbmcgcmF3bjNwMDEucHBtCisuL3BuZzJwbm0gLXJhdyAuLi9wbmdzdWl0ZS9iYXNuM3AwMi5wbmcgcmF3bjNwMDIucHBtCisuL3BuZzJwbm0gLXJhdyAuLi9wbmdzdWl0ZS9iYXNuM3AwNC5wbmcgcmF3bjNwMDQucHBtCisuL3BuZzJwbm0gLXJhdyAuLi9wbmdzdWl0ZS9iYXNuM3AwOC5wbmcgcmF3bjNwMDgucHBtCisjIC0tIGdyYXkgd2l0aCBhbHBoYS1jaGFubmVsCisuL3BuZzJwbm0gLXJhdyAuLi9wbmdzdWl0ZS9iYXNuNGEwOC5wbmcgcmF3bjRhMDgucGdtCisuL3BuZzJwbm0gLXJhdyAuLi9wbmdzdWl0ZS9iYXNuNGExNi5wbmcgcmF3bjRhMTYucGdtCisjIC0tIGNvbG9yIHdpdGggYWxwaGEtY2hhbm5lbAorLi9wbmcycG5tIC1ub3JhdyAtYWxwaGEgcmF3bjZhMDgucGdtIC4uL3BuZ3N1aXRlL2Jhc242YTA4LnBuZyByYXduNmEwOC5wcG0KKy4vcG5nMnBubSAtbm9yYXcgLWFscGhhIHJhd242YTE2LnBnbSAuLi9wbmdzdWl0ZS9iYXNuNmExNi5wbmcgcmF3bjZhMTYucHBtCisKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BuZ21pbnVzLmJhdCBiL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BuZ21pbnVzLmJhdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MTFiYjhkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvcG5nbWludXMuYmF0CkBAIC0wLDAgKzEsNCBAQAorbWFrZSAtZiBtYWtlZmlsZS50YzMKK2NhbGwgcG5nMnBubS5iYXQKK2NhbGwgcG5tMnBuZy5iYXQKKwpkaWZmIC0tZ2l0IGEvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvcG5nbWludXMuc2ggYi9saWJwbmcvY29udHJpYi9wbmdtaW51cy9wbmdtaW51cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYTBhOWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvcG5nbWludXMuc2gKQEAgLTAsMCArMSw1IEBACisjIS9iaW4vc2gKK21ha2UgLWYgbWFrZWZpbGUuc3RkCitzaCBwbmcycG5tLnNoCitzaCBwbm0ycG5nLnNoCisKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BubTJwbmcuYmF0IGIvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvcG5tMnBuZy5iYXQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjc1NmNiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BubTJwbmcuYmF0CkBAIC0wLDAgKzEsNDEgQEAKK1JFTSAtLSBncmF5c2NhbGUKK3BubTJwbmcuZXhlIGJhc24wZzAxLnBnbSBiYXNuMGcwMS5wbmcKK3BubTJwbmcuZXhlIGJhc24wZzAyLnBnbSBiYXNuMGcwMi5wbmcKK3BubTJwbmcuZXhlIGJhc24wZzA0LnBnbSBiYXNuMGcwNC5wbmcKK3BubTJwbmcuZXhlIGJhc24wZzA4LnBnbSBiYXNuMGcwOC5wbmcKK3BubTJwbmcuZXhlIGJhc24wZzE2LnBnbSBiYXNuMGcxNi5wbmcKK1JFTSAtLSBmdWxsLWNvbG9yCitwbm0ycG5nLmV4ZSBiYXNuMmMwOC5wcG0gYmFzbjJjMDgucG5nCitwbm0ycG5nLmV4ZSBiYXNuMmMxNi5wcG0gYmFzbjJjMTYucG5nCitSRU0gLS0gcGFsbGV0dGVkCitwbm0ycG5nLmV4ZSBiYXNuM3AwMS5wcG0gYmFzbjNwMDEucG5nCitwbm0ycG5nLmV4ZSBiYXNuM3AwMi5wcG0gYmFzbjNwMDIucG5nCitwbm0ycG5nLmV4ZSBiYXNuM3AwNC5wcG0gYmFzbjNwMDQucG5nCitwbm0ycG5nLmV4ZSBiYXNuM3AwOC5wcG0gYmFzbjNwMDgucG5nCitSRU0gLS0gZ3JheSB3aXRoIGFscGhhLWNoYW5uZWwKK3BubTJwbmcuZXhlIC1hbHBoYSBiYXNuNmEwOC5wZ20gYmFzbjRhMDgucGdtIGJhc240YTA4LnBuZworcG5tMnBuZy5leGUgLWFscGhhIGJhc242YTE2LnBnbSBiYXNuNGExNi5wZ20gYmFzbjRhMTYucG5nCitSRU0gLS0gY29sb3Igd2l0aCBhbHBoYS1jaGFubmVsCitwbm0ycG5nLmV4ZSAtYWxwaGEgYmFzbjZhMDgucGdtIGJhc242YTA4LnBwbSBiYXNuNmEwOC5wbmcKK3BubTJwbmcuZXhlIC1hbHBoYSBiYXNuNmExNi5wZ20gYmFzbjZhMTYucHBtIGJhc242YTE2LnBuZworUkVNIC0tIGdyYXlzY2FsZQorcG5tMnBuZy5leGUgcmF3bjBnMDEucGdtIHJhd24wZzAxLnBuZworcG5tMnBuZy5leGUgcmF3bjBnMDIucGdtIHJhd24wZzAyLnBuZworcG5tMnBuZy5leGUgcmF3bjBnMDQucGdtIHJhd24wZzA0LnBuZworcG5tMnBuZy5leGUgcmF3bjBnMDgucGdtIHJhd24wZzA4LnBuZworcG5tMnBuZy5leGUgcmF3bjBnMTYucGdtIHJhd24wZzE2LnBuZworUkVNIC0tIGZ1bGwtY29sb3IKK3BubTJwbmcuZXhlIHJhd24yYzA4LnBwbSByYXduMmMwOC5wbmcKK3BubTJwbmcuZXhlIHJhd24yYzE2LnBwbSByYXduMmMxNi5wbmcKK1JFTSAtLSBwYWxsZXR0ZWQKK3BubTJwbmcuZXhlIHJhd24zcDAxLnBwbSByYXduM3AwMS5wbmcKK3BubTJwbmcuZXhlIHJhd24zcDAyLnBwbSByYXduM3AwMi5wbmcKK3BubTJwbmcuZXhlIHJhd24zcDA0LnBwbSByYXduM3AwNC5wbmcKK3BubTJwbmcuZXhlIHJhd24zcDA4LnBwbSByYXduM3AwOC5wbmcKK1JFTSAtLSBncmF5IHdpdGggYWxwaGEtY2hhbm5lbAorcG5tMnBuZy5leGUgLWFscGhhIHJhd242YTA4LnBnbSByYXduNGEwOC5wZ20gcmF3bjRhMDgucG5nCitwbm0ycG5nLmV4ZSAtYWxwaGEgcmF3bjZhMTYucGdtIHJhd240YTE2LnBnbSByYXduNGExNi5wbmcKK1JFTSAtLSBjb2xvciB3aXRoIGFscGhhLWNoYW5uZWwKK3BubTJwbmcuZXhlIC1hbHBoYSByYXduNmEwOC5wZ20gcmF3bjZhMDgucHBtIHJhd242YTA4LnBuZworcG5tMnBuZy5leGUgLWFscGhhIHJhd242YTE2LnBnbSByYXduNmExNi5wcG0gcmF3bjZhMTYucG5nCisKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BubTJwbmcuYyBiL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BubTJwbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmE2NGNkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvcG5tMnBuZy5jCkBAIC0wLDAgKzEsNjE2IEBACisvKgorICogIHBubTJwbmcuYyAtLS0gY29udmVyc2lvbiBmcm9tIFBCTS9QR00vUFBNLWZpbGUgdG8gUE5HLWZpbGUKKyAqICBjb3B5cmlnaHQgKEMpIDE5OTkgYnkgV2lsbGVtIHZhbiBTY2hhaWsgPHdpbGxlbUBzY2hhaWsuY29tPgorICoKKyAqICB2ZXJzaW9uIDEuMCAtIDE5OTkuMTAuMTUgLSBGaXJzdCB2ZXJzaW9uLgorICogIHZlcnNpb24gMS4xIC0gMjAxNS4wNy4yOSAtIEZpeGVkIGxlYWtzIChHbGVubiBSYW5kZXJzLVBlaHJzb24pCisgKgorICogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kCisgKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKKyAqICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisgKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dAorICogIGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpZmRlZiBfX1RVUkJPQ19fCisjaW5jbHVkZSA8bWVtLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHpsaWIuaD4KKworI2lmbmRlZiBCT09MCisjZGVmaW5lIEJPT0wgdW5zaWduZWQgY2hhcgorI2VuZGlmCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAoQk9PTCkgMQorI2VuZGlmCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFIChCT09MKSAwCisjZW5kaWYKKworI2RlZmluZSBTVERJTiAgMAorI2RlZmluZSBTVERPVVQgMQorI2RlZmluZSBTVERFUlIgMgorCisvKiB0byBtYWtlIHBubTJwbmcgdmVyYm9zZSBzbyB3ZSBjYW4gZmluZCBwcm9ibGVtcyAobmVlZHMgdG8gYmUgYmVmb3JlIHBuZy5oKSAqLworI2lmbmRlZiBQTkdfREVCVUcKKyNkZWZpbmUgUE5HX0RFQlVHIDAKKyNlbmRpZgorCisjaW5jbHVkZSAicG5nLmgiCisKKy8qIERlZmluZSBwbmdfam1wYnVmKCkgaW4gY2FzZSB3ZSBhcmUgdXNpbmcgYSBwcmUtMS4wLjYgdmVyc2lvbiBvZiBsaWJwbmcgKi8KKyNpZm5kZWYgcG5nX2ptcGJ1ZgorIyAgZGVmaW5lIHBuZ19qbXBidWYocG5nX3B0cikgKChwbmdfcHRyKS0+am1wYnVmKQorI2VuZGlmCisKKy8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKworaW50ICBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKTsKK3ZvaWQgdXNhZ2UgKCk7CitCT09MIHBubTJwbmcgKEZJTEUgKnBubV9maWxlLCBGSUxFICpwbmdfZmlsZSwgRklMRSAqYWxwaGFfZmlsZSwgQk9PTCBpbnRlcmxhY2UsCisgICAgQk9PTCBhbHBoYSk7Cit2b2lkIGdldF90b2tlbihGSUxFICpwbm1fZmlsZSwgY2hhciAqdG9rZW4pOworcG5nX3VpbnRfMzIgZ2V0X2RhdGEgKEZJTEUgKnBubV9maWxlLCBpbnQgZGVwdGgpOworcG5nX3VpbnRfMzIgZ2V0X3ZhbHVlIChGSUxFICpwbm1fZmlsZSwgaW50IGRlcHRoKTsKKworLyoKKyAqICBtYWluCisgKi8KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgRklMRSAqZnBfcmQgPSBzdGRpbjsKKyAgRklMRSAqZnBfYWwgPSBOVUxMOworICBGSUxFICpmcF93ciA9IHN0ZG91dDsKKyAgQk9PTCBpbnRlcmxhY2UgPSBGQUxTRTsKKyAgQk9PTCBhbHBoYSA9IEZBTFNFOworICBpbnQgYXJnaTsKKworICBmb3IgKGFyZ2kgPSAxOyBhcmdpIDwgYXJnYzsgYXJnaSsrKQorICB7CisgICAgaWYgKGFyZ3ZbYXJnaV1bMF0gPT0gJy0nKQorICAgIHsKKyAgICAgIHN3aXRjaCAoYXJndlthcmdpXVsxXSkKKyAgICAgIHsKKyAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgaW50ZXJsYWNlID0gVFJVRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnYSc6CisgICAgICAgICAgYWxwaGEgPSBUUlVFOworICAgICAgICAgIGFyZ2krKzsKKyAgICAgICAgICBpZiAoKGZwX2FsID0gZm9wZW4gKGFyZ3ZbYXJnaV0sICJyYiIpKSA9PSBOVUxMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIlBOTTJQTkdcbiIpOworICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3I6ICBhbHBoYS1jaGFubmVsIGZpbGUgJXMgZG9lcyBub3QgZXhpc3RcbiIsCisgICAgICAgICAgICAgICBhcmd2W2FyZ2ldKTsKKyAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnaCc6CisgICAgICAgIGNhc2UgJz8nOgorICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJQTk0yUE5HXG4iKTsKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvcjogIHVua25vd24gb3B0aW9uICVzXG4iLCBhcmd2W2FyZ2ldKTsKKyAgICAgICAgICB1c2FnZSgpOworICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9IC8qIGVuZCBzd2l0Y2ggKi8KKyAgICB9CisgICAgZWxzZSBpZiAoZnBfcmQgPT0gc3RkaW4pCisgICAgeworICAgICAgaWYgKChmcF9yZCA9IGZvcGVuIChhcmd2W2FyZ2ldLCAicmIiKSkgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUE5NMlBOR1xuIik7CisgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yOiAgZmlsZSAlcyBkb2VzIG5vdCBleGlzdFxuIiwgYXJndlthcmdpXSk7CisgICAgICAgIGV4aXQgKDEpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChmcF93ciA9PSBzdGRvdXQpCisgICAgeworICAgICAgaWYgKChmcF93ciA9IGZvcGVuIChhcmd2W2FyZ2ldLCAid2IiKSkgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUE5NMlBOR1xuIik7CisgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yOiAgY2FuIG5vdCBjcmVhdGUgUE5HLWZpbGUgJXNcbiIsIGFyZ3ZbYXJnaV0pOworICAgICAgICBleGl0ICgxKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlBOTTJQTkdcbiIpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3I6ICB0b28gbWFueSBwYXJhbWV0ZXJzXG4iKTsKKyAgICAgIHVzYWdlKCk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisgIH0gLyogZW5kIGZvciAqLworCisjaWZkZWYgX19UVVJCT0NfXworICAvKiBzZXQgc3RkaW4vc3Rkb3V0IHRvIGJpbmFyeSwgd2UncmUgcmVhZGluZyB0aGUgUE5NIGFsd2F5cyEgaW4gYmluYXJ5IGZvcm1hdCAqLworICBpZiAoZnBfcmQgPT0gc3RkaW4pCisgIHsKKyAgICBzZXRtb2RlIChTVERJTiwgT19CSU5BUlkpOworICB9CisgIGlmIChmcF93ciA9PSBzdGRvdXQpCisgIHsKKyAgICBzZXRtb2RlIChTVERPVVQsIE9fQklOQVJZKTsKKyAgfQorI2VuZGlmCisKKyAgLyogY2FsbCB0aGUgY29udmVyc2lvbiBwcm9ncmFtIGl0c2VsZiAqLworICBpZiAocG5tMnBuZyAoZnBfcmQsIGZwX3dyLCBmcF9hbCwgaW50ZXJsYWNlLCBhbHBoYSkgPT0gRkFMU0UpCisgIHsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJQTk0yUE5HXG4iKTsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvcjogIHVuc3VjY2Vzc2Z1bCBjb252ZXJ0aW5nIHRvIFBORy1pbWFnZVxuIik7CisgICAgZXhpdCAoMSk7CisgIH0KKworICAvKiBjbG9zZSBpbnB1dCBmaWxlICovCisgIGZjbG9zZSAoZnBfcmQpOworICAvKiBjbG9zZSBvdXRwdXQgZmlsZSAqLworICBmY2xvc2UgKGZwX3dyKTsKKyAgLyogY2xvc2UgYWxwaGEgZmlsZSAqLworICBpZiAoYWxwaGEpCisgICAgZmNsb3NlIChmcF9hbCk7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgdXNhZ2UKKyAqLworCit2b2lkIHVzYWdlKCkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiUE5NMlBOR1xuIik7CisgIGZwcmludGYgKHN0ZGVyciwgIiAgIGJ5IFdpbGxlbSB2YW4gU2NoYWlrLCAxOTk5XG4iKTsKKyNpZmRlZiBfX1RVUkJPQ19fCisgIGZwcmludGYgKHN0ZGVyciwgIiAgIGZvciBUdXJiby1DIGFuZCBCb3JsYW5kLUMgY29tcGlsZXJzXG4iKTsKKyNlbHNlCisgIGZwcmludGYgKHN0ZGVyciwgIiAgIGZvciBMaW51eCAoYW5kIFVuaXgpIGNvbXBpbGVyc1xuIik7CisjZW5kaWYKKyAgZnByaW50ZiAoc3RkZXJyLCAiVXNhZ2U6ICBwbm0ycG5nIFtvcHRpb25zXSA8ZmlsZT4uPHBubT4gWzxmaWxlPi5wbmddXG4iKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiICAgb3I6ICAuLi4gfCBwbm0ycG5nIFtvcHRpb25zXVxuIik7CisgIGZwcmludGYgKHN0ZGVyciwgIk9wdGlvbnM6XG4iKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiICAgLWlbbnRlcmxhY2VdICAgd3JpdGUgcG5nLWZpbGUgd2l0aCBpbnRlcmxhY2luZyBvblxuIik7CisgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICIgICAtYVtscGhhXSA8ZmlsZT4ucGdtIHJlYWQgUE5HIGFscGhhIGNoYW5uZWwgYXMgcGdtLWZpbGVcbiIpOworICBmcHJpbnRmIChzdGRlcnIsICIgICAtaCB8IC0/ICBwcmludCB0aGlzIGhlbHAtaW5mb3JtYXRpb25cbiIpOworfQorCisvKgorICogIHBubTJwbmcKKyAqLworCitCT09MIHBubTJwbmcgKEZJTEUgKnBubV9maWxlLCBGSUxFICpwbmdfZmlsZSwgRklMRSAqYWxwaGFfZmlsZSwgQk9PTCBpbnRlcmxhY2UsCisgICAgIEJPT0wgYWxwaGEpCit7CisgIHBuZ19zdHJ1Y3QgICAgKnBuZ19wdHIgPSBOVUxMOworICBwbmdfaW5mbyAgICAgICppbmZvX3B0ciA9IE5VTEw7CisgIHBuZ19ieXRlICAgICAgKnBuZ19waXhlbHMgPSBOVUxMOworICBwbmdfYnl0ZSAgICAgICoqcm93X3BvaW50ZXJzID0gTlVMTDsKKyAgcG5nX2J5dGUgICAgICAqcGl4X3B0ciA9IE5VTEw7CisgIHZvbGF0aWxlIHBuZ191aW50XzMyICAgcm93X2J5dGVzOworCisgIGNoYXIgICAgICAgICAgdHlwZV90b2tlblsxNl07CisgIGNoYXIgICAgICAgICAgd2lkdGhfdG9rZW5bMTZdOworICBjaGFyICAgICAgICAgIGhlaWdodF90b2tlblsxNl07CisgIGNoYXIgICAgICAgICAgbWF4dmFsX3Rva2VuWzE2XTsKKyAgdm9sYXRpbGUgaW50ICAgIGNvbG9yX3R5cGU9MTsKKyAgdW5zaWduZWQgbG9uZyAgIHVsX3dpZHRoPTAsIHVsX2FscGhhX3dpZHRoPTA7CisgIHVuc2lnbmVkIGxvbmcgICB1bF9oZWlnaHQ9MCwgdWxfYWxwaGFfaGVpZ2h0PTA7CisgIHVuc2lnbmVkIGxvbmcgICB1bF9tYXh2YWw9MDsKKyAgdm9sYXRpbGUgcG5nX3VpbnRfMzIgICB3aWR0aD0wLCBoZWlnaHQ9MDsKKyAgdm9sYXRpbGUgcG5nX3VpbnRfMzIgICBhbHBoYV93aWR0aD0wLCBhbHBoYV9oZWlnaHQ9MDsKKyAgcG5nX3VpbnRfMzIgICBtYXh2YWw7CisgIHZvbGF0aWxlIGludCAgICAgICAgICAgYml0X2RlcHRoID0gMDsKKyAgaW50ICAgICAgICAgICBjaGFubmVscz0wOworICBpbnQgICAgICAgICAgIGFscGhhX2RlcHRoID0gMDsKKyAgaW50ICAgICAgICAgICBhbHBoYV9wcmVzZW50PTA7CisgIGludCAgICAgICAgICAgcm93LCBjb2w7CisgIEJPT0wgICAgICAgICAgcmF3LCBhbHBoYV9yYXcgPSBGQUxTRTsKKyNpZiBkZWZpbmVkKFBOR19XUklURV9JTlZFUlRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9QQUNLX1NVUFBPUlRFRCkKKyAgQk9PTCAgICAgICAgICBwYWNrZWRfYml0bWFwID0gRkFMU0U7CisjZW5kaWYKKyAgcG5nX3VpbnRfMzIgICB0bXAxNjsKKyAgaW50ICAgICAgICAgICBpOworCisgIC8qIHJlYWQgaGVhZGVyIG9mIFBOTSBmaWxlICovCisKKyAgZ2V0X3Rva2VuKHBubV9maWxlLCB0eXBlX3Rva2VuKTsKKyAgaWYgKHR5cGVfdG9rZW5bMF0gIT0gJ1AnKQorICB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGVsc2UgaWYgKCh0eXBlX3Rva2VuWzFdID09ICcxJykgfHwgKHR5cGVfdG9rZW5bMV0gPT0gJzQnKSkKKyAgeworI2lmIGRlZmluZWQoUE5HX1dSSVRFX0lOVkVSVF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1BBQ0tfU1VQUE9SVEVEKQorICAgIHJhdyA9ICh0eXBlX3Rva2VuWzFdID09ICc0Jyk7CisgICAgY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX0dSQVk7CisgICAgZ2V0X3Rva2VuKHBubV9maWxlLCB3aWR0aF90b2tlbik7CisgICAgc3NjYW5mICh3aWR0aF90b2tlbiwgIiVsdSIsICZ1bF93aWR0aCk7CisgICAgd2lkdGggPSAocG5nX3VpbnRfMzIpIHVsX3dpZHRoOworICAgIGdldF90b2tlbihwbm1fZmlsZSwgaGVpZ2h0X3Rva2VuKTsKKyAgICBzc2NhbmYgKGhlaWdodF90b2tlbiwgIiVsdSIsICZ1bF9oZWlnaHQpOworICAgIGhlaWdodCA9IChwbmdfdWludF8zMikgdWxfaGVpZ2h0OworICAgIGJpdF9kZXB0aCA9IDE7CisgICAgcGFja2VkX2JpdG1hcCA9IFRSVUU7CisjZWxzZQorICAgIGZwcmludGYgKHN0ZGVyciwgIlBOTTJQTkcgYnVpbHQgd2l0aG91dCBQTkdfV1JJVEVfSU5WRVJUX1NVUFBPUlRFRCBhbmQgXG4iKTsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJQTkdfV1JJVEVfUEFDS19TVVBQT1JURUQgY2FuJ3QgcmVhZCBQQk0gKFAxLFA0KSBmaWxlc1xuIik7CisjZW5kaWYKKyAgfQorICBlbHNlIGlmICgodHlwZV90b2tlblsxXSA9PSAnMicpIHx8ICh0eXBlX3Rva2VuWzFdID09ICc1JykpCisgIHsKKyAgICByYXcgPSAodHlwZV90b2tlblsxXSA9PSAnNScpOworICAgIGNvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9HUkFZOworICAgIGdldF90b2tlbihwbm1fZmlsZSwgd2lkdGhfdG9rZW4pOworICAgIHNzY2FuZiAod2lkdGhfdG9rZW4sICIlbHUiLCAmdWxfd2lkdGgpOworICAgIHdpZHRoID0gKHBuZ191aW50XzMyKSB1bF93aWR0aDsKKyAgICBnZXRfdG9rZW4ocG5tX2ZpbGUsIGhlaWdodF90b2tlbik7CisgICAgc3NjYW5mIChoZWlnaHRfdG9rZW4sICIlbHUiLCAmdWxfaGVpZ2h0KTsKKyAgICBoZWlnaHQgPSAocG5nX3VpbnRfMzIpIHVsX2hlaWdodDsKKyAgICBnZXRfdG9rZW4ocG5tX2ZpbGUsIG1heHZhbF90b2tlbik7CisgICAgc3NjYW5mIChtYXh2YWxfdG9rZW4sICIlbHUiLCAmdWxfbWF4dmFsKTsKKyAgICBtYXh2YWwgPSAocG5nX3VpbnRfMzIpIHVsX21heHZhbDsKKworICAgIGlmIChtYXh2YWwgPD0gMSkKKyAgICAgIGJpdF9kZXB0aCA9IDE7CisgICAgZWxzZSBpZiAobWF4dmFsIDw9IDMpCisgICAgICBiaXRfZGVwdGggPSAyOworICAgIGVsc2UgaWYgKG1heHZhbCA8PSAxNSkKKyAgICAgIGJpdF9kZXB0aCA9IDQ7CisgICAgZWxzZSBpZiAobWF4dmFsIDw9IDI1NSkKKyAgICAgIGJpdF9kZXB0aCA9IDg7CisgICAgZWxzZSAvKiBpZiAobWF4dmFsIDw9IDY1NTM1KSAqLworICAgICAgYml0X2RlcHRoID0gMTY7CisgIH0KKyAgZWxzZSBpZiAoKHR5cGVfdG9rZW5bMV0gPT0gJzMnKSB8fCAodHlwZV90b2tlblsxXSA9PSAnNicpKQorICB7CisgICAgcmF3ID0gKHR5cGVfdG9rZW5bMV0gPT0gJzYnKTsKKyAgICBjb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUkdCOworICAgIGdldF90b2tlbihwbm1fZmlsZSwgd2lkdGhfdG9rZW4pOworICAgIHNzY2FuZiAod2lkdGhfdG9rZW4sICIlbHUiLCAmdWxfd2lkdGgpOworICAgIHdpZHRoID0gKHBuZ191aW50XzMyKSB1bF93aWR0aDsKKyAgICBnZXRfdG9rZW4ocG5tX2ZpbGUsIGhlaWdodF90b2tlbik7CisgICAgc3NjYW5mIChoZWlnaHRfdG9rZW4sICIlbHUiLCAmdWxfaGVpZ2h0KTsKKyAgICBoZWlnaHQgPSAocG5nX3VpbnRfMzIpIHVsX2hlaWdodDsKKyAgICBnZXRfdG9rZW4ocG5tX2ZpbGUsIG1heHZhbF90b2tlbik7CisgICAgc3NjYW5mIChtYXh2YWxfdG9rZW4sICIlbHUiLCAmdWxfbWF4dmFsKTsKKyAgICBtYXh2YWwgPSAocG5nX3VpbnRfMzIpIHVsX21heHZhbDsKKyAgICBpZiAobWF4dmFsIDw9IDEpCisgICAgICBiaXRfZGVwdGggPSAxOworICAgIGVsc2UgaWYgKG1heHZhbCA8PSAzKQorICAgICAgYml0X2RlcHRoID0gMjsKKyAgICBlbHNlIGlmIChtYXh2YWwgPD0gMTUpCisgICAgICBiaXRfZGVwdGggPSA0OworICAgIGVsc2UgaWYgKG1heHZhbCA8PSAyNTUpCisgICAgICBiaXRfZGVwdGggPSA4OworICAgIGVsc2UgLyogaWYgKG1heHZhbCA8PSA2NTUzNSkgKi8KKyAgICAgIGJpdF9kZXB0aCA9IDE2OworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIHJlYWQgaGVhZGVyIG9mIFBHTSBmaWxlIHdpdGggYWxwaGEgY2hhbm5lbCAqLworCisgIGlmIChhbHBoYSkKKyAgeworICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpCisgICAgICBjb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQTsKKyAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpCisgICAgICBjb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBOworCisgICAgZ2V0X3Rva2VuKGFscGhhX2ZpbGUsIHR5cGVfdG9rZW4pOworICAgIGlmICh0eXBlX3Rva2VuWzBdICE9ICdQJykKKyAgICB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGVsc2UgaWYgKCh0eXBlX3Rva2VuWzFdID09ICcyJykgfHwgKHR5cGVfdG9rZW5bMV0gPT0gJzUnKSkKKyAgICB7CisgICAgICBhbHBoYV9yYXcgPSAodHlwZV90b2tlblsxXSA9PSAnNScpOworICAgICAgZ2V0X3Rva2VuKGFscGhhX2ZpbGUsIHdpZHRoX3Rva2VuKTsKKyAgICAgIHNzY2FuZiAod2lkdGhfdG9rZW4sICIlbHUiLCAmdWxfYWxwaGFfd2lkdGgpOworICAgICAgYWxwaGFfd2lkdGg9KHBuZ191aW50XzMyKSB1bF9hbHBoYV93aWR0aDsKKyAgICAgIGlmIChhbHBoYV93aWR0aCAhPSB3aWR0aCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgZ2V0X3Rva2VuKGFscGhhX2ZpbGUsIGhlaWdodF90b2tlbik7CisgICAgICBzc2NhbmYgKGhlaWdodF90b2tlbiwgIiVsdSIsICZ1bF9hbHBoYV9oZWlnaHQpOworICAgICAgYWxwaGFfaGVpZ2h0ID0gKHBuZ191aW50XzMyKSB1bF9hbHBoYV9oZWlnaHQ7CisgICAgICBpZiAoYWxwaGFfaGVpZ2h0ICE9IGhlaWdodCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgZ2V0X3Rva2VuKGFscGhhX2ZpbGUsIG1heHZhbF90b2tlbik7CisgICAgICBzc2NhbmYgKG1heHZhbF90b2tlbiwgIiVsdSIsICZ1bF9tYXh2YWwpOworICAgICAgbWF4dmFsID0gKHBuZ191aW50XzMyKSB1bF9tYXh2YWw7CisgICAgICBpZiAobWF4dmFsIDw9IDEpCisgICAgICAgIGFscGhhX2RlcHRoID0gMTsKKyAgICAgIGVsc2UgaWYgKG1heHZhbCA8PSAzKQorICAgICAgICBhbHBoYV9kZXB0aCA9IDI7CisgICAgICBlbHNlIGlmIChtYXh2YWwgPD0gMTUpCisgICAgICAgIGFscGhhX2RlcHRoID0gNDsKKyAgICAgIGVsc2UgaWYgKG1heHZhbCA8PSAyNTUpCisgICAgICAgIGFscGhhX2RlcHRoID0gODsKKyAgICAgIGVsc2UgLyogaWYgKG1heHZhbCA8PSA2NTUzNSkgKi8KKyAgICAgICAgYWxwaGFfZGVwdGggPSAxNjsKKyAgICAgIGlmIChhbHBoYV9kZXB0aCAhPSBiaXRfZGVwdGgpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0gLyogZW5kIGlmIGFscGhhICovCisKKyAgLyogY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgYW5kIHN0b3JlIGFscGhhLXByZXNlbmNlICovCisgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpCisgICAgY2hhbm5lbHMgPSAxOworICBlbHNlIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpCisgICAgY2hhbm5lbHMgPSAyOworICBlbHNlIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikKKyAgICBjaGFubmVscyA9IDM7CisgIGVsc2UgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQorICAgIGNoYW5uZWxzID0gNDsKKyNpZiAwCisgIGVsc2UKKyAgICBjaGFubmVscyA9IDA7IC8qIGNhbm5vdCBoYXBwZW4gKi8KKyNlbmRpZgorCisgIGFscGhhX3ByZXNlbnQgPSAoY2hhbm5lbHMgLSAxKSAlIDI7CisKKyNpZiBkZWZpbmVkKFBOR19XUklURV9JTlZFUlRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9QQUNLX1NVUFBPUlRFRCkKKyAgaWYgKHBhY2tlZF9iaXRtYXApCisgICAgLyogcm93IGRhdGEgaXMgYXMgbWFueSBieXRlcyBhcyBjYW4gZml0IHdpZHRoIHggY2hhbm5lbHMgeCBiaXRfZGVwdGggKi8KKyAgICByb3dfYnl0ZXMgPSAod2lkdGggKiBjaGFubmVscyAqIGJpdF9kZXB0aCArIDcpIC8gODsKKyAgZWxzZQorI2VuZGlmCisgICAgLyogcm93X2J5dGVzIGlzIHRoZSB3aWR0aCB4IG51bWJlciBvZiBjaGFubmVscyB4IChiaXQtZGVwdGggLyA4KSAqLworICAgIHJvd19ieXRlcyA9IHdpZHRoICogY2hhbm5lbHMgKiAoKGJpdF9kZXB0aCA8PSA4KSA/IDEgOiAyKTsKKworICBpZiAoKHBuZ19waXhlbHMgPSAocG5nX2J5dGUgKikKKyAgICAgbWFsbG9jIChyb3dfYnl0ZXMgKiBoZWlnaHQgKiBzaXplb2YgKHBuZ19ieXRlKSkpID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIHJlYWQgZGF0YSBmcm9tIFBOTSBmaWxlICovCisgIHBpeF9wdHIgPSBwbmdfcGl4ZWxzOworCisgIGZvciAocm93ID0gMDsgcm93IDwgKGludCkgaGVpZ2h0OyByb3crKykKKyAgeworI2lmIGRlZmluZWQoUE5HX1dSSVRFX0lOVkVSVF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1BBQ0tfU1VQUE9SVEVEKQorICAgIGlmIChwYWNrZWRfYml0bWFwKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkgcm93X2J5dGVzOyBpKyspCisgICAgICAgIC8qIHBuZyBzdXBwb3J0cyB0aGlzIGZvcm1hdCBuYXRpdmVseSBzbyBubyBjb252ZXJzaW9uIGlzIG5lZWRlZCAqLworICAgICAgICAqcGl4X3B0cisrID0gZ2V0X2RhdGEgKHBubV9maWxlLCA4KTsKKyAgICB9IGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgIGZvciAoY29sID0gMDsgY29sIDwgKGludCkgd2lkdGg7IGNvbCsrKQorICAgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGNoYW5uZWxzIC0gYWxwaGFfcHJlc2VudCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIGlmIChyYXcpCisgICAgICAgICAgICAqcGl4X3B0cisrID0gZ2V0X2RhdGEgKHBubV9maWxlLCBiaXRfZGVwdGgpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmIChiaXRfZGVwdGggPD0gOCkKKyAgICAgICAgICAgICAgKnBpeF9wdHIrKyA9IGdldF92YWx1ZSAocG5tX2ZpbGUsIGJpdF9kZXB0aCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHRtcDE2ID0gZ2V0X3ZhbHVlIChwbm1fZmlsZSwgYml0X2RlcHRoKTsKKyAgICAgICAgICAgICAgKnBpeF9wdHIgPSAocG5nX2J5dGUpICgodG1wMTYgPj4gOCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgcGl4X3B0cisrOworICAgICAgICAgICAgICAqcGl4X3B0ciA9IChwbmdfYnl0ZSkgKHRtcDE2ICYgMHhGRik7CisgICAgICAgICAgICAgIHBpeF9wdHIrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChhbHBoYSkgLyogcmVhZCBhbHBoYS1jaGFubmVsIGZyb20gcGdtIGZpbGUgKi8KKyAgICAgICAgeworICAgICAgICAgIGlmIChhbHBoYV9yYXcpCisgICAgICAgICAgICAqcGl4X3B0cisrID0gZ2V0X2RhdGEgKGFscGhhX2ZpbGUsIGFscGhhX2RlcHRoKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiAoYWxwaGFfZGVwdGggPD0gOCkKKyAgICAgICAgICAgICAgKnBpeF9wdHIrKyA9IGdldF92YWx1ZSAoYWxwaGFfZmlsZSwgYml0X2RlcHRoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdG1wMTYgPSBnZXRfdmFsdWUgKGFscGhhX2ZpbGUsIGJpdF9kZXB0aCk7CisgICAgICAgICAgICAgICpwaXhfcHRyKysgPSAocG5nX2J5dGUpICgodG1wMTYgPj4gOCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgKnBpeF9wdHIrKyA9IChwbmdfYnl0ZSkgKHRtcDE2ICYgMHhGRik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gLyogaWYgYWxwaGEgKi8KKyAgICAgIH0gLyogaWYgcGFja2VkX2JpdG1hcCAqLworICAgIH0gLyogZW5kIGZvciBjb2wgKi8KKyAgfSAvKiBlbmQgZm9yIHJvdyAqLworCisgIC8qIHByZXBhcmUgdGhlIHN0YW5kYXJkIFBORyBzdHJ1Y3R1cmVzICovCisgIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCAocG5nX2dldF9saWJwbmdfdmVyKE5VTEwpLCBOVUxMLCBOVUxMLAorICAgICAgTlVMTCk7CisgIGlmICghcG5nX3B0cikKKyAgeworICAgIGZyZWUgKHBuZ19waXhlbHMpOworICAgIHBuZ19waXhlbHMgPSBOVUxMOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QgKHBuZ19wdHIpOworICBpZiAoIWluZm9fcHRyKQorICB7CisgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0ICgmcG5nX3B0ciwgKHBuZ19pbmZvcHApIE5VTEwpOworICAgIGZyZWUgKHBuZ19waXhlbHMpOworICAgIHBuZ19waXhlbHMgPSBOVUxMOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisjaWYgZGVmaW5lZChQTkdfV1JJVEVfSU5WRVJUX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfUEFDS19TVVBQT1JURUQpCisgIGlmIChwYWNrZWRfYml0bWFwID09IFRSVUUpCisgIHsKKyAgICBwbmdfc2V0X3BhY2tpbmcgKHBuZ19wdHIpOworICAgIHBuZ19zZXRfaW52ZXJ0X21vbm8gKHBuZ19wdHIpOworICB9CisjZW5kaWYKKworICAvKiBzZXRqbXAoKSBtdXN0IGJlIGNhbGxlZCBpbiBldmVyeSBmdW5jdGlvbiB0aGF0IGNhbGxzIGEgUE5HLXJlYWRpbmcgbGlicG5nIGZ1bmN0aW9uICovCisgIGlmIChzZXRqbXAgKHBuZ19qbXBidWYocG5nX3B0cikpKQorICB7CisgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0ICgmcG5nX3B0ciwgJmluZm9fcHRyKTsKKyAgICBmcmVlIChwbmdfcGl4ZWxzKTsKKyAgICBwbmdfcGl4ZWxzID0gTlVMTDsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBpbml0aWFsaXplIHRoZSBwbmcgc3RydWN0dXJlICovCisgIHBuZ19pbml0X2lvIChwbmdfcHRyLCBwbmdfZmlsZSk7CisKKyAgLyogd2UncmUgZ29pbmcgdG8gd3JpdGUgbW9yZSBvciBsZXNzIHRoZSBzYW1lIFBORyBhcyB0aGUgaW5wdXQgZmlsZSAqLworICBwbmdfc2V0X0lIRFIgKHBuZ19wdHIsIGluZm9fcHRyLCB3aWR0aCwgaGVpZ2h0LCBiaXRfZGVwdGgsIGNvbG9yX3R5cGUsCisgICAgKCFpbnRlcmxhY2UpID8gUE5HX0lOVEVSTEFDRV9OT05FIDogUE5HX0lOVEVSTEFDRV9BREFNNywKKyAgICBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFLCBQTkdfRklMVEVSX1RZUEVfQkFTRSk7CisKKyAgLyogd3JpdGUgdGhlIGZpbGUgaGVhZGVyIGluZm9ybWF0aW9uICovCisgIHBuZ193cml0ZV9pbmZvIChwbmdfcHRyLCBpbmZvX3B0cik7CisKKyAgLyogaWYgbmVlZGVkIHdlIHdpbGwgYWxsb2NhdGUgbWVtb3J5IGZvciBhbiBuZXcgYXJyYXkgb2Ygcm93LXBvaW50ZXJzICovCisgIGlmIChyb3dfcG9pbnRlcnMgPT0gKHVuc2lnbmVkIGNoYXIqKikgTlVMTCkKKyAgeworICAgIGlmICgocm93X3BvaW50ZXJzID0gKHBuZ19ieXRlICoqKQorICAgICAgICBtYWxsb2MgKGhlaWdodCAqIHNpemVvZiAocG5nX2J5dGVwKSkpID09IE5VTEwpCisgICAgeworICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0ICgmcG5nX3B0ciwgJmluZm9fcHRyKTsKKyAgICAgIGZyZWUgKHBuZ19waXhlbHMpOworICAgICAgcG5nX3BpeGVscyA9IE5VTEw7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9CisKKyAgLyogc2V0IHRoZSBpbmRpdmlkdWFsIHJvd19wb2ludGVycyB0byBwb2ludCBhdCB0aGUgY29ycmVjdCBvZmZzZXRzICovCisgIGZvciAoaSA9IDA7IGkgPCAoaW50KSBoZWlnaHQ7IGkrKykKKyAgICByb3dfcG9pbnRlcnNbaV0gPSBwbmdfcGl4ZWxzICsgaSAqIHJvd19ieXRlczsKKworICAvKiB3cml0ZSBvdXQgdGhlIGVudGlyZSBpbWFnZSBkYXRhIGluIG9uZSBjYWxsICovCisgIHBuZ193cml0ZV9pbWFnZSAocG5nX3B0ciwgcm93X3BvaW50ZXJzKTsKKworICAvKiB3cml0ZSB0aGUgYWRkaXRpb25hbCBjaHVua3MgdG8gdGhlIFBORyBmaWxlIChub3QgcmVhbGx5IG5lZWRlZCkgKi8KKyAgcG5nX3dyaXRlX2VuZCAocG5nX3B0ciwgaW5mb19wdHIpOworCisgIC8qIGNsZWFuIHVwIGFmdGVyIHRoZSB3cml0ZSwgYW5kIGZyZWUgYW55IG1lbW9yeSBhbGxvY2F0ZWQgKi8KKyAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0ICgmcG5nX3B0ciwgJmluZm9fcHRyKTsKKworICBpZiAocm93X3BvaW50ZXJzICE9ICh1bnNpZ25lZCBjaGFyKiopIE5VTEwpCisgICAgZnJlZSAocm93X3BvaW50ZXJzKTsKKyAgaWYgKHBuZ19waXhlbHMgIT0gKHVuc2lnbmVkIGNoYXIqKSBOVUxMKQorICAgIGZyZWUgKHBuZ19waXhlbHMpOworCisgIHJldHVybiBUUlVFOworfSAvKiBlbmQgb2YgcG5tMnBuZyAqLworCisvKgorICogZ2V0X3Rva2VuKCkgLSBnZXRzIHRoZSBmaXJzdCBzdHJpbmcgYWZ0ZXIgd2hpdGVzcGFjZQorICovCisKK3ZvaWQgZ2V0X3Rva2VuKEZJTEUgKnBubV9maWxlLCBjaGFyICp0b2tlbikKK3sKKyAgaW50IGkgPSAwOworICBpbnQgcmV0OworCisgIC8qIHJlbW92ZSB3aGl0ZS1zcGFjZSBhbmQgY29tbWVudCBsaW5lcyAqLworICBkbworICB7CisgICAgcmV0ID0gZmdldGMocG5tX2ZpbGUpOworICAgIGlmIChyZXQgPT0gJyMnKSB7CisgICAgICAvKiB0aGUgcmVzdCBvZiB0aGlzIGxpbmUgaXMgYSBjb21tZW50ICovCisgICAgICBkbworICAgICAgeworICAgICAgICByZXQgPSBmZ2V0Yyhwbm1fZmlsZSk7CisgICAgICB9CisgICAgICB3aGlsZSAoKHJldCAhPSAnXG4nKSAmJiAocmV0ICE9ICdccicpICYmIChyZXQgIT0gRU9GKSk7CisgICAgfQorICAgIGlmIChyZXQgPT0gRU9GKSBicmVhazsKKyAgICB0b2tlbltpXSA9ICh1bnNpZ25lZCBjaGFyKSByZXQ7CisgIH0KKyAgd2hpbGUgKCh0b2tlbltpXSA9PSAnXG4nKSB8fCAodG9rZW5baV0gPT0gJ1xyJykgfHwgKHRva2VuW2ldID09ICcgJykpOworCisgIC8qIHJlYWQgc3RyaW5nICovCisgIGRvCisgIHsKKyAgICByZXQgPSBmZ2V0Yyhwbm1fZmlsZSk7CisgICAgaWYgKHJldCA9PSBFT0YpIGJyZWFrOworICAgIGkrKzsKKyAgICB0b2tlbltpXSA9ICh1bnNpZ25lZCBjaGFyKSByZXQ7CisgIH0KKyAgd2hpbGUgKCh0b2tlbltpXSAhPSAnXG4nKSAmJiAodG9rZW5baV0gIT0gJ1xyJykgJiYgKHRva2VuW2ldICE9ICcgJykpOworCisgIHRva2VuW2ldID0gJ1wwJzsKKworICByZXR1cm47Cit9CisKKy8qCisgKiBnZXRfZGF0YSgpIC0gdGFrZXMgZmlyc3QgYnl0ZSBhbmQgY29udmVydHMgaW50byBuZXh0IHBpeGVsIHZhbHVlLAorICogICAgICAgIHRha2luZyBhcyBtdWNoIGJpdHMgYXMgZGVmaW5lZCBieSBiaXQtZGVwdGggYW5kCisgKiAgICAgICAgdXNpbmcgdGhlIGJpdC1kZXB0aCB0byBmaWxsIHVwIGEgYnl0ZSAoMEFoIC0+IEFBaCkKKyAqLworCitwbmdfdWludF8zMiBnZXRfZGF0YSAoRklMRSAqcG5tX2ZpbGUsIGludCBkZXB0aCkKK3sKKyAgc3RhdGljIGludCBiaXRzX2xlZnQgPSAwOworICBzdGF0aWMgaW50IG9sZF92YWx1ZSA9IDA7CisgIHN0YXRpYyBpbnQgbWFzayA9IDA7CisgIGludCBpOworICBwbmdfdWludF8zMiByZXRfdmFsdWU7CisKKyAgaWYgKG1hc2sgPT0gMCkKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGVwdGg7IGkrKykKKyAgICAgIG1hc2sgPSAobWFzayA+PiAxKSB8IDB4ODA7CisKKyAgaWYgKGJpdHNfbGVmdCA8PSAwKQorICB7CisgICAgb2xkX3ZhbHVlID0gZmdldGMgKHBubV9maWxlKTsKKyAgICBiaXRzX2xlZnQgPSA4OworICB9CisKKyAgcmV0X3ZhbHVlID0gb2xkX3ZhbHVlICYgbWFzazsKKyAgZm9yIChpID0gMTsgaSA8ICg4IC8gZGVwdGgpOyBpKyspCisgICAgcmV0X3ZhbHVlID0gcmV0X3ZhbHVlIHx8IChyZXRfdmFsdWUgPj4gZGVwdGgpOworCisgIG9sZF92YWx1ZSA9IChvbGRfdmFsdWUgPDwgZGVwdGgpICYgMHhGRjsKKyAgYml0c19sZWZ0IC09IGRlcHRoOworCisgIHJldHVybiByZXRfdmFsdWU7Cit9CisKKy8qCisgKiBnZXRfdmFsdWUoKSAtIHRha2VzIGZpcnN0IChudW1lcmljKSBzdHJpbmcgYW5kIGNvbnZlcnRzIGludG8gbnVtYmVyLAorICogICAgICAgICB1c2luZyB0aGUgYml0LWRlcHRoIHRvIGZpbGwgdXAgYSBieXRlICgwQWggLT4gQUFoKQorICovCisKK3BuZ191aW50XzMyIGdldF92YWx1ZSAoRklMRSAqcG5tX2ZpbGUsIGludCBkZXB0aCkKK3sKKyAgc3RhdGljIHBuZ191aW50XzMyIG1hc2sgPSAwOworICBwbmdfYnl0ZSB0b2tlblsxNl07CisgIHVuc2lnbmVkIGxvbmcgdWxfcmV0X3ZhbHVlOworICBwbmdfdWludF8zMiByZXRfdmFsdWU7CisgIGludCBpID0gMDsKKworICBpZiAobWFzayA9PSAwKQorICAgIGZvciAoaSA9IDA7IGkgPCBkZXB0aDsgaSsrKQorICAgICAgbWFzayA9IChtYXNrIDw8IDEpIHwgMHgwMTsKKworICBnZXRfdG9rZW4gKHBubV9maWxlLCAoY2hhciAqKSB0b2tlbik7CisgIHNzY2FuZiAoKGNvbnN0IGNoYXIgKikgdG9rZW4sICIlbHUiLCAmdWxfcmV0X3ZhbHVlKTsKKyAgcmV0X3ZhbHVlID0gKHBuZ191aW50XzMyKSB1bF9yZXRfdmFsdWU7CisKKyAgcmV0X3ZhbHVlICY9IG1hc2s7CisKKyAgaWYgKGRlcHRoIDwgOCkKKyAgICBmb3IgKGkgPSAwOyBpIDwgKDggLyBkZXB0aCk7IGkrKykKKyAgICAgIHJldF92YWx1ZSA9IChyZXRfdmFsdWUgPDwgZGVwdGgpIHx8IHJldF92YWx1ZTsKKworICByZXR1cm4gcmV0X3ZhbHVlOworfQorCisvKiBlbmQgb2Ygc291cmNlICovCisKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BubTJwbmcuc2ggYi9saWJwbmcvY29udHJpYi9wbmdtaW51cy9wbm0ycG5nLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ3OWRmMmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9wbmdtaW51cy9wbm0ycG5nLnNoCkBAIC0wLDAgKzEsNDIgQEAKKyMhL2Jpbi9zaAorIyAtLSBncmF5c2NhbGUKKy4vcG5tMnBuZyBiYXNuMGcwMS5wZ20gYmFzbjBnMDEucG5nCisuL3BubTJwbmcgYmFzbjBnMDIucGdtIGJhc24wZzAyLnBuZworLi9wbm0ycG5nIGJhc24wZzA0LnBnbSBiYXNuMGcwNC5wbmcKKy4vcG5tMnBuZyBiYXNuMGcwOC5wZ20gYmFzbjBnMDgucG5nCisuL3BubTJwbmcgYmFzbjBnMTYucGdtIGJhc24wZzE2LnBuZworIyAtLSBmdWxsLWNvbG9yCisuL3BubTJwbmcgYmFzbjJjMDgucHBtIGJhc24yYzA4LnBuZworLi9wbm0ycG5nIGJhc24yYzE2LnBwbSBiYXNuMmMxNi5wbmcKKyMgLS0gcGFsbGV0dGVkCisuL3BubTJwbmcgYmFzbjNwMDEucHBtIGJhc24zcDAxLnBuZworLi9wbm0ycG5nIGJhc24zcDAyLnBwbSBiYXNuM3AwMi5wbmcKKy4vcG5tMnBuZyBiYXNuM3AwNC5wcG0gYmFzbjNwMDQucG5nCisuL3BubTJwbmcgYmFzbjNwMDgucHBtIGJhc24zcDA4LnBuZworIyAtLSBncmF5IHdpdGggYWxwaGEtY2hhbm5lbAorLi9wbm0ycG5nIC1hbHBoYSBiYXNuNmEwOC5wZ20gYmFzbjRhMDgucGdtIGJhc240YTA4LnBuZworLi9wbm0ycG5nIC1hbHBoYSBiYXNuNmExNi5wZ20gYmFzbjRhMTYucGdtIGJhc240YTE2LnBuZworIyAtLSBjb2xvciB3aXRoIGFscGhhLWNoYW5uZWwKKy4vcG5tMnBuZyAtYWxwaGEgYmFzbjZhMDgucGdtIGJhc242YTA4LnBwbSBiYXNuNmEwOC5wbmcKKy4vcG5tMnBuZyAtYWxwaGEgYmFzbjZhMTYucGdtIGJhc242YTE2LnBwbSBiYXNuNmExNi5wbmcKKyMgLS0gZ3JheXNjYWxlCisuL3BubTJwbmcgcmF3bjBnMDEucGdtIHJhd24wZzAxLnBuZworLi9wbm0ycG5nIHJhd24wZzAyLnBnbSByYXduMGcwMi5wbmcKKy4vcG5tMnBuZyByYXduMGcwNC5wZ20gcmF3bjBnMDQucG5nCisuL3BubTJwbmcgcmF3bjBnMDgucGdtIHJhd24wZzA4LnBuZworLi9wbm0ycG5nIHJhd24wZzE2LnBnbSByYXduMGcxNi5wbmcKKyMgLS0gZnVsbC1jb2xvcgorLi9wbm0ycG5nIHJhd24yYzA4LnBwbSByYXduMmMwOC5wbmcKKy4vcG5tMnBuZyByYXduMmMxNi5wcG0gcmF3bjJjMTYucG5nCisjIC0tIHBhbGxldHRlZAorLi9wbm0ycG5nIHJhd24zcDAxLnBwbSByYXduM3AwMS5wbmcKKy4vcG5tMnBuZyByYXduM3AwMi5wcG0gcmF3bjNwMDIucG5nCisuL3BubTJwbmcgcmF3bjNwMDQucHBtIHJhd24zcDA0LnBuZworLi9wbm0ycG5nIHJhd24zcDA4LnBwbSByYXduM3AwOC5wbmcKKyMgLS0gZ3JheSB3aXRoIGFscGhhLWNoYW5uZWwKKy4vcG5tMnBuZyAtYWxwaGEgcmF3bjZhMDgucGdtIHJhd240YTA4LnBnbSByYXduNGEwOC5wbmcKKy4vcG5tMnBuZyAtYWxwaGEgcmF3bjZhMTYucGdtIHJhd240YTE2LnBnbSByYXduNGExNi5wbmcKKyMgLS0gY29sb3Igd2l0aCBhbHBoYS1jaGFubmVsCisuL3BubTJwbmcgLWFscGhhIHJhd242YTA4LnBnbSByYXduNmEwOC5wcG0gcmF3bjZhMDgucG5nCisuL3BubTJwbmcgLWFscGhhIHJhd242YTE2LnBnbSByYXduNmExNi5wcG0gcmF3bjZhMTYucG5nCisKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL1JFQURNRSBiL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2ZkZThmCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvUkVBRE1FCkBAIC0wLDAgKzEsMTA1IEBACisKK3BuZ3N1aXRlCistLS0tLS0tLQorQ29weXJpZ2h0IChjKSBXaWxsZW0gdmFuIFNjaGFpaywgMTk5OSwgMjAxMSwgMjAxMgorVHdvIGltYWdlcyAoZnRiYm4wZzAxLnBuZyBhbmQgZnRiYm4wZzAyLnBuZykgYXJlIGJ5IEdsZW5uIFJhbmRlcnMtUGVocnNvbiwgMjAxMgorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGVzZSBpbWFnZXMgZm9yIGFueQorcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuCisKK1RoZSAxNSAiYmFzKi5wbmciIGltYWdlcyBhcmUgcGFydCBvZiB0aGUgbXVjaCBsYXJnZXIgUG5nU3VpdGUgdGVzdC1zZXQgb2YKK2ltYWdlcywgYXZhaWxhYmxlIGZvciBkZXZlbG9wZXJzIG9mIFBORyBzdXBwb3J0aW5nIHNvZnR3YXJlLiBUaGUKK2NvbXBsZXRlIHNldCwgYXZhaWxhYmxlIGF0IGh0dHA6L3d3dy5zY2hhaWsuY29tL3BuZ3N1aXRlLywgY29udGFpbnMKK2EgdmFyaWV0eSBvZiBpbWFnZXMgdG8gdGVzdCBpbnRlcmxhY2luZywgZ2FtbWEgc2V0dGluZ3MsIGFuY2lsbGFyeQorY2h1bmtzLCBldGMuCisKK1RoZSAiZnQqLnBuZyIgaW1hZ2VzIGFyZSAiZnJlZS9saWJyZSIgcmVwbGFjZW1lbnRzIGZvciB0aGUgdHJhbnNwYXJlbnQKK2NvcnJlc3BvbmRpbmcgdCoucG5nIGltYWdlcyBpbiB0aGUgUG5nU3VpdGUuCisKK1RoZSBpbWFnZXMgaW4gdGhpcyBkaXJlY3RvcnkgcmVwcmVzZW50IHRoZSBiYXNpYyBQTkcgY29sb3ItdHlwZXM6CitncmF5c2NhbGUgKDEtMTYgYml0IGRlZXApLCBmdWxsIGNvbG9yICg4IG9yIDE2IGJpdCksIHBhbGV0dGVkCisoMS04IGJpdCkgYW5kIGdyYXlzY2FsZSBvciBjb2xvciBpbWFnZXMgd2l0aCBhbHBoYSBjaGFubmVsLiBZb3UKK2NhbiB1c2UgdGhlbSB0byB0ZXN0IHRoZSBwcm9wZXIgZnVuY3Rpb25pbmcgb2YgUE5HIHNvZnR3YXJlLgorCisgICAgZmlsZW5hbWUgICAgICAgZGVwdGggdHlwZQorICAgIC0tLS0tLS0tLS0tLSAtLS0tLS0gLS0tLS0tLS0tLS0tLS0KKyAgICBiYXNuMGcwMS5wbmcgICAxLWJpdCBncmF5c2NhbGUKKyAgICBiYXNuMGcwMi5wbmcgICAyLWJpdCBncmF5c2NhbGUKKyAgICBiYXNuMGcwNC5wbmcgICA0LWJpdCBncmF5c2NhbGUKKyAgICBiYXNuMGcwOC5wbmcgICA4LWJpdCBncmF5c2NhbGUKKyAgICBiYXNuMGcxNi5wbmcgIDE2LWJpdCBncmF5c2NhbGUKKyAgICBiYXNuMmMwOC5wbmcgICA4LWJpdCB0cnVlY29sb3IKKyAgICBiYXNuMmMxNi5wbmcgIDE2LWJpdCB0cnVlY29sb3IKKyAgICBiYXNuM3AwMS5wbmcgICAxLWJpdCBwYWxldHRlZAorICAgIGJhc24zcDAyLnBuZyAgIDItYml0IHBhbGV0dGVkCisgICAgYmFzbjNwMDQucG5nICAgNC1iaXQgcGFsZXR0ZWQKKyAgICBiYXNuM3AwOC5wbmcgICA4LWJpdCBwYWxldHRlZAorICAgIGJhc240YTA4LnBuZyAgIDgtYml0IGdyYXkgd2l0aCBhbHBoYQorICAgIGJhc240YTE2LnBuZyAgMTYtYml0IGdyYXkgd2l0aCBhbHBoYQorICAgIGJhc242YTA4LnBuZyAgIDgtYml0IFJHQkEKKyAgICBiYXNuNmExNi5wbmcgIDE2LWJpdCBSR0JBCisKKyAgICBmdGJibjBnMDEucG5nICAxLWJpdCBncmF5c2NhbGUsIGJsYWNrIGJLR0QKKyAgICBmdGJibjBnMDIucG5nICAyLWJpdCBncmF5c2NhbGUsIGJsYWNrIGJLR0QKKyAgICBmdGJibjBnMDQucG5nICA0LWJpdCBncmF5c2NhbGUsIGJsYWNrIGJLR0QKKyAgICBmdGJibjJjMTYucG5nIDE2LWJpdCB0cnVlY29sb3IsIGJsYWNrIGJLR0QKKyAgICBmdGJibjNwMDgucG5nICA4LWJpdCBwYWxldHRlZCwgYmxhY2sgYktHRAorICAgIGZ0YmduMmMxNi5wbmcgMTYtYml0IHRydWVjb2xvciwgZ3JheSBiS0dECisgICAgZnRiZ24zcDA4LnBuZyAgOC1iaXQgcGFsZXR0ZWQsIGdyYXkgYktHRAorICAgIGZ0YnJuMmMwOC5wbmcgIDgtYml0IHRydWVjb2xvciwgcmVkIGJLR0QKKyAgICBmdGJ3bjBnMTYucG5nIDE2LWJpdCBncmF5LCB3aGl0ZSBiS0dECisgICAgZnRid24zcDA4LnBuZyAgOC1iaXQgcGFsZXR0ZWQsIHdoaXRlIGJLR0QKKyAgICBmdGJ5bjNwMDgucG5nICA4LWJpdCBwYWxldHRlZCwgeWVsbG93IGJLR0QKKyAgICBmdHAwbjBnMDgucG5nICA4LWJpdCBncmF5c2NhbGUsIG9wYXF1ZQorICAgIGZ0cDBuMmMwOC5wbmcgIDgtYml0IHRydWVjb2xvciwgb3BhcXVlCisgICAgZnRwMG4zcDA4LnBuZyAgOC1iaXQgcGFsZXR0ZWQsIG9wYXF1ZQorICAgIGZ0cDFuM3AwOC5wbmcgIDgtYml0IHBhbGV0dGVkLCBubyBiS0dECisKK0hlcmUgaXMgdGhlIGNvcnJlY3QgcmVzdWx0IG9mIHR5cGluZyAicG5ndGVzdCAtbSBiYXMqLnBuZyIgaW4KK3RoaXMgZGlyZWN0b3J5OgorCitUZXN0aW5nIGJhc24wZzAxLnBuZzogUEFTUyAoNTI0IHplcm8gc2FtcGxlcykKKyBGaWx0ZXIgMCB3YXMgdXNlZCAzMiB0aW1lcworVGVzdGluZyBiYXNuMGcwMi5wbmc6IFBBU1MgKDQ0OCB6ZXJvIHNhbXBsZXMpCisgRmlsdGVyIDAgd2FzIHVzZWQgMzIgdGltZXMKK1Rlc3RpbmcgYmFzbjBnMDQucG5nOiBQQVNTICg1MjAgemVybyBzYW1wbGVzKQorIEZpbHRlciAwIHdhcyB1c2VkIDMyIHRpbWVzCitUZXN0aW5nIGJhc24wZzA4LnBuZzogUEFTUyAoMyB6ZXJvIHNhbXBsZXMpCisgRmlsdGVyIDEgd2FzIHVzZWQgOSB0aW1lcworIEZpbHRlciA0IHdhcyB1c2VkIDIzIHRpbWVzCitUZXN0aW5nIGJhc24wZzE2LnBuZzogUEFTUyAoMSB6ZXJvIHNhbXBsZXMpCisgRmlsdGVyIDEgd2FzIHVzZWQgMSB0aW1lcworIEZpbHRlciAyIHdhcyB1c2VkIDMxIHRpbWVzCitUZXN0aW5nIGJhc24yYzA4LnBuZzogUEFTUyAoNiB6ZXJvIHNhbXBsZXMpCisgRmlsdGVyIDEgd2FzIHVzZWQgNSB0aW1lcworIEZpbHRlciA0IHdhcyB1c2VkIDI3IHRpbWVzCitUZXN0aW5nIGJhc24yYzE2LnBuZzogUEFTUyAoNTkyIHplcm8gc2FtcGxlcykKKyBGaWx0ZXIgMSB3YXMgdXNlZCAxIHRpbWVzCisgRmlsdGVyIDQgd2FzIHVzZWQgMzEgdGltZXMKK1Rlc3RpbmcgYmFzbjNwMDEucG5nOiBQQVNTICg1MTIgemVybyBzYW1wbGVzKQorIEZpbHRlciAwIHdhcyB1c2VkIDMyIHRpbWVzCitUZXN0aW5nIGJhc24zcDAyLnBuZzogUEFTUyAoNDQ4IHplcm8gc2FtcGxlcykKKyBGaWx0ZXIgMCB3YXMgdXNlZCAzMiB0aW1lcworVGVzdGluZyBiYXNuM3AwNC5wbmc6IFBBU1MgKDU0NCB6ZXJvIHNhbXBsZXMpCisgRmlsdGVyIDAgd2FzIHVzZWQgMzIgdGltZXMKK1Rlc3RpbmcgYmFzbjNwMDgucG5nOiBQQVNTICg0IHplcm8gc2FtcGxlcykKKyBGaWx0ZXIgMCB3YXMgdXNlZCAzMiB0aW1lcworVGVzdGluZyBiYXNuNGEwOC5wbmc6IFBBU1MgKDMyIHplcm8gc2FtcGxlcykKKyBGaWx0ZXIgMSB3YXMgdXNlZCAxIHRpbWVzCisgRmlsdGVyIDQgd2FzIHVzZWQgMzEgdGltZXMKK1Rlc3RpbmcgYmFzbjRhMTYucG5nOiBQQVNTICg2NCB6ZXJvIHNhbXBsZXMpCisgRmlsdGVyIDAgd2FzIHVzZWQgMSB0aW1lcworIEZpbHRlciAxIHdhcyB1c2VkIDIgdGltZXMKKyBGaWx0ZXIgMiB3YXMgdXNlZCAxIHRpbWVzCisgRmlsdGVyIDQgd2FzIHVzZWQgMjggdGltZXMKK1Rlc3RpbmcgYmFzbjZhMDgucG5nOiBQQVNTICgxNjAgemVybyBzYW1wbGVzKQorIEZpbHRlciAxIHdhcyB1c2VkIDEgdGltZXMKKyBGaWx0ZXIgNCB3YXMgdXNlZCAzMSB0aW1lcworVGVzdGluZyBiYXNuNmExNi5wbmc6IFBBU1MgKDEwNzIgemVybyBzYW1wbGVzKQorIEZpbHRlciAxIHdhcyB1c2VkIDQgdGltZXMKKyBGaWx0ZXIgNCB3YXMgdXNlZCAyOCB0aW1lcworbGlicG5nIHBhc3NlcyB0ZXN0CisKK1dpbGxlbSB2YW4gU2NoYWlrCis8d2lsbGVtQHNjaGFpay5jb20+CitPY3RvYmVyIDE5OTkKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzAxLnBuZyBiL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzAxLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzFlMWM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjBnMDEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzAyLnBuZyBiL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzAyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODgwOWRkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjBnMDIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzA0LnBuZyBiL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzA0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmEwODljCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjBnMDQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzA4LnBuZyBiL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzA4LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjUyMmVlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjBnMDgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzE2LnBuZyBiL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzE2LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMThlYmNhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjBnMTYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24yYzA4LnBuZyBiL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24yYzA4LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWQyZjkxCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjJjMDgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24yYzE2LnBuZyBiL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24yYzE2LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmQ0YTRkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjJjMTYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDAxLnBuZyBiL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDAxLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjFkYjU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjNwMDEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDAyLnBuZyBiL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDAyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDBhYjYxCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjNwMDIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDA0LnBuZyBiL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDA0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGM2ZWFjCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjNwMDQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDA4LnBuZyBiL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDA4LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTA3ZjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjNwMDgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc240YTA4LnBuZyBiL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc240YTA4LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmIwZGQwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjRhMDgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc240YTE2LnBuZyBiL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc240YTE2LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGJlZTlmCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjRhMTYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc242YTA4LnBuZyBiL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc242YTA4LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTA2MjMwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjZhMDgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc242YTE2LnBuZyBiL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc242YTE2LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWJmM2NiCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjZhMTYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0YmJuMGcwMS5wbmcgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJibjBnMDEucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNzQ2ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJibjBnMDEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0YmJuMGcwMi5wbmcgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJibjBnMDIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkODNiZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJibjBnMDIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0YmJuMGcwNC5wbmcgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJibjBnMDQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YTcwNTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJibjBnMDQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0YmJuMmMxNi5wbmcgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJibjJjMTYucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMzE2OGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJibjJjMTYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0YmJuM3AwOC5wbmcgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJibjNwMDgucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZGUzNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJibjNwMDgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0YmduMmMxNi5wbmcgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJnbjJjMTYucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1Y2VjMzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJnbjJjMTYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0YmduM3AwOC5wbmcgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJnbjNwMDgucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZjJlNmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJnbjNwMDgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0YnJuMmMwOC5wbmcgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJybjJjMDgucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjY2EwZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJybjJjMDgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0YnduMGcxNi5wbmcgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJ3bjBnMTYucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YmRlZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJ3bjBnMTYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0YnduM3AwOC5wbmcgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJ3bjNwMDgucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhY2FiN2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJ3bjNwMDgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0YnluM3AwOC5wbmcgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJ5bjNwMDgucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NmRiMDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdGJ5bjNwMDgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0cDBuMGcwOC5wbmcgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdHAwbjBnMDgucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMzQ2NWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdHAwbjBnMDgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0cDBuMmMwOC5wbmcgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdHAwbjJjMDgucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNmU0MmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdHAwbjJjMDgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0cDBuM3AwOC5wbmcgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdHAwbjNwMDgucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YTY5ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdHAwbjNwMDgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Z0cDFuM3AwOC5wbmcgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdHAxbjNwMDgucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YzlmMzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9mdHAxbjNwMDgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3Rvb2xzL1JFQURNRS50eHQgYi9saWJwbmcvY29udHJpYi90b29scy9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZGFlMDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi90b29scy9SRUFETUUudHh0CkBAIC0wLDAgKzEsMjYgQEAKK1RoaXMgZGlyZWN0b3J5IChjb250cmliL3Rvb2xzKSBjb250YWlucyB0b29scyB1c2VkIGJ5IHRoZSBhdXRob3JzIG9mIGxpYnBuZy4KKworQ29kZSBhbmQgZGF0YSBwbGFjZWQgaW4gdGhpcyBkaXJlY3RvcnkgaXMgbm90IHJlcXVpcmVkIHRvIGJ1aWxkIGxpYnBuZywKK2hvd2V2ZXIgdGhlIGNvZGUgaW4gdGhpcyBkaXJlY3RvcnkgaGFzIGJlZW4gdXNlZCB0byBnZW5lcmF0ZSBkYXRhIG9yIGNvZGUgaW4KK3RoZSBib2R5IG9mIHRoZSBsaWJwbmcgc291cmNlLiAgVGhlIHNvdXJjZSBjb2RlIGlkZW50aWZpZXMgd2hlcmUgdGhpcyBoYXMKK2JlZW4gZG9uZS4gIENvZGUgaW4gdGhpcyBkaXJlY3RvcnkgbWF5IG5vdCBjb21waWxlIG9uIGFsbCBvcGVyYXRpbmcgc3lzdGVtcwordGhhdCBsaWJwbmcgc3VwcG9ydHMuCisKK05PIENPUFlSSUdIVCBSSUdIVFMgQVJFIENMQUlNRUQgVE8gQU5ZIE9GIFRIRSBGSUxFUyBJTiBUSElTIERJUkVDVE9SWS4KKworVG8gdGhlIGV4dGVudCBwb3NzaWJsZSB1bmRlciBsYXcsIHRoZSBhdXRob3JzIGhhdmUgd2FpdmVkIGFsbCBjb3B5cmlnaHQgYW5kCityZWxhdGVkIG9yIG5laWdoYm9yaW5nIHJpZ2h0cyB0byB0aGlzIHdvcmsuICBUaGlzIHdvcmsgaXMgcHVibGlzaGVkIGZyb206CitVbml0ZWQgU3RhdGVzLgorCitUaGUgZmlsZXMgbWF5IGJlIHVzZWQgZnJlZWx5IGluIGFueSB3YXkuCisKK1RoZSBzb3VyY2UgY29kZSBhbmQgY29tbWVudHMgaW4gdGhpcyBkaXJlY3RvcnkgYXJlIHRoZSBvcmlnaW5hbCB3b3JrIG9mIHRoZQorcGVvcGxlIG5hbWVkIGJlbG93LiAgTm8gb3RoZXIgcGVyc29uIG9yIG9yZ2FuaXphdGlvbiBoYXMgbWFkZSBjb250cmlidXRpb25zIHRvCit0aGUgd29yayBpbiB0aGlzIGRpcmVjdG9yeS4KKworT1JJR0lOQUwgQVVUSE9SUworICAgIFRoZSBmb2xsb3dpbmcgcGVvcGxlIGhhdmUgY29udHJpYnV0ZWQgdG8gdGhlIGNvZGUgaW4gdGhpcyBkaXJlY3RvcnkuICBOb25lCisgICAgb2YgdGhlIHBlb3BsZSBiZWxvdyBjbGFpbSBhbnkgcmlnaHRzIHdpdGggcmVnYXJkIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzCisgICAgZGlyZWN0b3J5LgorCisgICAgSm9obiBCb3dsZXIgPGpib3dsZXJAYWNtLm9yZz4KZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3Rvb2xzL2NoZWNrc3VtLWljYy5jIGIvbGlicG5nL2NvbnRyaWIvdG9vbHMvY2hlY2tzdW0taWNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgxZTcwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL3Rvb2xzL2NoZWNrc3VtLWljYy5jCkBAIC0wLDAgKzEsMTAyIEBACisvKiBjaGVja3N1bS1pY2MuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBKb2huIEN1bm5pbmdoYW0gQm93bGVyCisgKgorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMCBbRmVicnVhcnkgMTQsIDIwMTNdCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCisgKgorICogR2VuZXJhdGUgY3JjMzIgYW5kIGFkbGVyMzIgY2hlY2tzdW1zIG9mIHRoZSBnaXZlbiBpbnB1dCBmaWxlcywgdXNlZCB0bworICogZ2VuZXJhdGUgY2hlY2stY29kZXMgZm9yIHVzZSB3aGVuIG1hdGNoaW5nIElDQyBwcm9maWxlcyB3aXRoaW4gbGlicG5nLgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPHpsaWIuaD4KKworc3RhdGljIGludAorcmVhZF9vbmVfZmlsZShGSUxFICppcCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgIHVMb25nIGxlbmd0aCA9IDA7CisgICB1TG9uZyBhMzIgPSBhZGxlcjMyKDAsIE5VTEwsIDApOworICAgdUxvbmcgYzMyID0gY3JjMzIoMCwgTlVMTCwgMCk7CisgICBCeXRlIGhlYWRlclsxMzJdOworCisgICBmb3IgKDs7KQorICAgeworICAgICAgaW50IGNoID0gZ2V0YyhpcCk7CisgICAgICBCeXRlIGI7CisKKyAgICAgIGlmIChjaCA9PSBFT0YpIGJyZWFrOworCisgICAgICBiID0gKEJ5dGUpY2g7CisKKyAgICAgIGlmIChsZW5ndGggPCBzaXplb2YgaGVhZGVyKQorICAgICAgICAgaGVhZGVyW2xlbmd0aF0gPSBiOworCisgICAgICArK2xlbmd0aDsKKyAgICAgIGEzMiA9IGFkbGVyMzIoYTMyLCAmYiwgMSk7CisgICAgICBjMzIgPSBjcmMzMihjMzIsICZiLCAxKTsKKyAgIH0KKworICAgaWYgKGZlcnJvcihpcCkpCisgICAgICByZXR1cm4gMDsKKworICAgLyogU3VjY2VzcyAqLworICAgcHJpbnRmKCJQTkdfSUNDX0NIRUNLU1VNKDB4JTguOGx4LCAweCU4LjhseCxcbiAgIFBOR19NRDUoIgorICAgICAgIjB4JTIuMnglMi4yeCUyLjJ4JTIuMngsIDB4JTIuMnglMi4yeCUyLjJ4JTIuMngsIDB4JTIuMnglMi4yeCUyLjJ4JTIuMngsIgorICAgICAgIiAweCUyLjJ4JTIuMnglMi4yeCUyLjJ4KSwgJWQsXG4iCisgICAgICAiICAgXCIlNC40ZC8lMi4yZC8lMi4yZCAlMi4yZDolMi4yZDolMi4yZFwiLCAlbHUsIFwiJXNcIilcbiIsCisgICAgICAodW5zaWduZWQgbG9uZylhMzIsICh1bnNpZ25lZCBsb25nKWMzMiwKKyAgICAgIGhlYWRlcls4NF0sIGhlYWRlcls4NV0sIGhlYWRlcls4Nl0sIGhlYWRlcls4N10sCisgICAgICBoZWFkZXJbODhdLCBoZWFkZXJbODldLCBoZWFkZXJbOTBdLCBoZWFkZXJbOTFdLAorICAgICAgaGVhZGVyWzkyXSwgaGVhZGVyWzkzXSwgaGVhZGVyWzk0XSwgaGVhZGVyWzk1XSwKKyAgICAgIGhlYWRlcls5Nl0sIGhlYWRlcls5N10sIGhlYWRlcls5OF0sIGhlYWRlcls5OV0sCisjICAgICBkZWZpbmUgdTE2KHgpIChoZWFkZXJbeF0gKiAyNTYgKyBoZWFkZXJbeCsxXSkKKyMgICAgIGRlZmluZSB1MzIoeCkgKHUxNih4KSAqIDY1NTM2ICsgdTE2KHgrMikpCisgICAgICB1MzIoNjQpLCB1MTYoMjQpLCB1MTYoMjYpLCB1MTYoMjgpLCB1MTYoMzApLCB1MTYoMzIpLCB1MTYoMzQpLAorICAgICAgKHVuc2lnbmVkIGxvbmcpbGVuZ3RoLCBuYW1lKTsKKworICAgcmV0dXJuIDE7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgIGludCBlcnIgPSAwOworCisgICBwcmludGYoIi8qIGFkbGVyMzIsIGNyYzMyLCBNRDVbMTZdLCBpbnRlbnQsIGRhdGUsIGxlbmd0aCwgZmlsZS1uYW1lICovXG4iKTsKKworICAgaWYgKGFyZ2MgPiAxKQorICAgeworICAgICAgaW50IGk7CisKKyAgICAgIGZvciAoaT0xOyBpPGFyZ2M7ICsraSkKKyAgICAgIHsKKyAgICAgICAgIEZJTEUgKmlwID0gZm9wZW4oYXJndltpXSwgInJiIik7CisKKyAgICAgICAgIGlmIChpcCA9PSBOVUxMIHx8ICFyZWFkX29uZV9maWxlKGlwLCBhcmd2W2ldKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IDE7CisgICAgICAgICAgICBwZXJyb3IoYXJndltpXSk7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiByZWFkIGVycm9yXG4iLCBhcmd2W2ldKTsKKyAgICAgICAgICAgIHByaW50ZigiLyogRVJST1I6ICVzICovXG4iLCBhcmd2W2ldKTsKKyAgICAgICAgIH0KKworICAgICAgICAgKHZvaWQpZmNsb3NlKGlwKTsKKyAgICAgIH0KKyAgIH0KKworICAgZWxzZQorICAgeworICAgICAgaWYgKCFyZWFkX29uZV9maWxlKHN0ZGluLCAiLSIpKQorICAgICAgeworICAgICAgICAgZXJyID0gMTsKKyAgICAgICAgIHBlcnJvcigic3RkaW4iKTsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic3RkaW46IHJlYWQgZXJyb3JcbiIpOworICAgICAgICAgcHJpbnRmKCIvKiBFUlJPUjogc3RkaW4gKi9cbiIpOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvbGlicG5nL2NvbnRyaWIvdG9vbHMvY2hrZm10IGIvbGlicG5nL2NvbnRyaWIvdG9vbHMvY2hrZm10Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlkYTY0NzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi90b29scy9jaGtmbXQKQEAgLTAsMCArMSwxMzcgQEAKKyMhL2Jpbi9zaAorIworIyBDaGVjayB0aGUgZm9ybWF0IG9mIHRoZSBzb3VyY2UgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IC0gY2hlY2tzIGZvciBhCisjIGxpbmUgbGVuZ3RoIG9mIDgwIGNoYXJhY3RlcnMgbWF4IGFuZCBubyB0YWIgY2hhcmFjdGVycy4KKyMKKyMgT3B0aW9uYWxseSBhcmd1bWVudHMgYXJlIGZpbGVzIG9yIGRpcmVjdG9yaWVzIHRvIGNoZWNrLgorIworIyAtdjogb3V0cHV0IHRoZSBsb25nIGxpbmVzIChtYWtlcyBmaXhpbmcgdGhlbSBlYXNpZXIpCisjIC1lOiBzcGF3biBhbiBlZGl0b3IgZm9yIGVhY2ggZmlsZSB0aGF0IG5lZWRzIGEgY2hhbmdlICgkRURJVE9SIG11c3QgYmUKKyMgICAgIGRlZmluZWQpLiAgV2hlbiB1c2luZyAtZSB0aGUgc2NyaXB0IE1VU1QgYmUgcnVuIGZyb20gYW4gaW50ZXJhY3RpdmUKKyMgICAgIGNvbW1hbmQgbGluZS4KK3ZlcmJvc2U9CitlZGl0PQordmVycz0KK3Rlc3QgIiQxIiA9ICItdiIgJiYgeworICAgc2hpZnQKKyAgIHZlcmJvc2U9eWVzCit9Cit0ZXN0ICIkMSIgPSAiLWUiICYmIHsKKyAgIHNoaWZ0CisgICBpZiB0ZXN0IC1uICIkRURJVE9SIgorICAgdGhlbgorICAgICAgZWRpdD15ZXMKKworICAgICAgIyBDb3B5IHRoZSBzdGFuZGFyZCBzdHJlYW1zIGZvciB0aGUgZWRpdG9yCisgICAgICBleGVjIDM+JjAgND4mMSA1PiYyCisgICBlbHNlCisgICAgICBlY2hvICJjaGtmbXQgLWU6IEVESVRPUiBtdXN0IGJlIGRlZmluZWQiID4mMgorICAgICAgZXhpdCAxCisgICBmaQorfQorCisjIEZ1bmN0aW9uIHRvIGVkaXQgYSBzaW5nbGUgZmlsZSAtIGlmIHRoZSBmaWxlIGlzbid0IGNoYW5nZWQgYXNrIHRoZSB1c2VyCisjIHdoZXRoZXIgb3Igbm90IHRvIGNvbnRpbnVlLiAgVGhpcyBzdHVmZiBvbmx5IHdvcmtzIGlmIHRoZSBzY3JpcHQgaXMgcnVuIGZyb20KKyMgdGhlIGNvbW1hbmQgbGluZSAob3RoZXJ3aXNlLCBkb24ndCBzcGVjaWZ5IC1lIG9yIHlvdSB3aWxsIGJlIHNvcnJ5KS4KK2RvZWQoKXsKKyAgIGNwICIkZmlsZSIgIiRmaWxlIi5vcmlnCisgICAiJEVESVRPUiIgIiRmaWxlIiAwPiYzIDE+JjQgMj4mNSAzPiYtIDQ+Ji0gNT4mLSB8fCBleGl0IDEKKyAgIGlmIGNtcCAtcyAiJGZpbGUiLm9yaWcgIiRmaWxlIgorICAgdGhlbgorICAgICAgcm0gIiRmaWxlIi5vcmlnCisgICAgICBlY2hvIC1uICIkZmlsZTogZmlsZSBub3QgY2hhbmdlZCwgdHlwZSBhbnl0aGluZyB0byBjb250aW51ZTogIiA+JjUKKyAgICAgIHJlYWQgYW5zIDA+JjMKKyAgICAgIHRlc3QgLW4gIiRhbnMiIHx8IHJldHVybiAxCisgICBmaQorICAgcmV0dXJuIDAKK30KKworIyBJbiBiZXRhIHZlcnNpb25zIHRoZSB2ZXJzaW9uIHN0cmluZyB3aGljaCBhcHBlYXJzIGluIGZpbGVzIGNhbiBiZSBhIGxpdHRsZQorIyBsb25nIGFuZCBjYXVzZSBzcHVyaW91c2x5IG92ZXJsb25nIGxpbmVzLiAgVG8gYXZvaWQgdGhpcyBzdWJ0aXR1dGUgdGhlIHZlcnNpb24KKyMgc3RyaW5nIHdpdGggYSAnc3RhbmRhcmQnIHZlcnNpb24gYS5iLmNjIGJlZm9yZSBjaGVja2luZyBmb3IgbG9uZyBsaW5lcy4KK2lmIHRlc3QgLXIgcG5nLmgKK3RoZW4KKyAgIHZlcnM9ImBzZWQgLW4gLWUgXAorICAgJ3MvXiNkZWZpbmUgUE5HX0xJQlBOR19WRVJfU1RSSU5HIC5cKFswLTldXC5bMC05XVwuWzAtOV1bMC05YS16XSpcKS4kL1wxL3AnIFwKKyAgIHBuZy5oYCIKKyAgIGVjaG8gImNoa2ZtdDogY2hlY2tpbmcgdmVyc2lvbiAkdmVycyIKK2ZpCitpZiB0ZXN0IC16ICIkdmVycyIKK3RoZW4KKyAgIGVjaG8gImNoa2ZtdDogcG5nLmggbm90IGZvdW5kLCBpZ25vcmluZyB2ZXJzaW9uIG51bWJlciIgPiYyCitmaQorCit0ZXN0IC1uICIkMSIgfHwgc2V0IC0tIC4KK2ZpbmQgIiRAIiBcKCAtdHlwZSBkIFwoIC1uYW1lICcuZ2l0JyAtbyAtbmFtZSAnLmxpYnMnIC1vIC1uYW1lICdwcm9qZWN0cycgXCkgXAorICAgLXBydW5lIFwpIC1vIFwoIC10eXBlIGYgXAorICAgISAtbmFtZSAnKi5bb2FdJyAhIC1uYW1lICcqLmxbb2FdJyAhICAtbmFtZSAnKi5wbmcnICEgLW5hbWUgJyoub3V0JyBcCisgICAhIC1uYW1lICcqLmpwZycgISAtbmFtZSAnKi5wYXRjaCcgISAtbmFtZSAnKi5vYmonICEgLW5hbWUgJyouZXhlJyBcCisgICAhIC1uYW1lICcqLmNvbScgISAtbmFtZSAnKi50YXIuKicgISAtbmFtZSAnKi56aXAnICEgLW5hbWUgJyouaWNvJyBcCisgICAhIC1uYW1lICcqLnJlcycgISAtbmFtZSAnKi5yYycgISAtbmFtZSAnKi5tbXMnICEgLW5hbWUgJyoucmVqJyBcCisgICAhIC1uYW1lICcqLmRzcCcgISAtbmFtZSAnKi5vcmlnJyAhIC1uYW1lICcqLmRmbicgISAtbmFtZSAnKi5zd3AnIFwKKyAgICEgLW5hbWUgJ34qJyAhIC1uYW1lICcqLjMnIFwKKyAgICEgLW5hbWUgJ21pc3NpbmcnICEgLW5hbWUgJ21raW5zdGFsbGRpcnMnICEgLW5hbWUgJ2RlcGNvbXAnIFwKKyAgICEgLW5hbWUgJ2FjbG9jYWwubTQnICEgLW5hbWUgJ2luc3RhbGwtc2gnICEgLW5hbWUgJ01ha2VmaWxlLmluJyBcCisgICAhIC1uYW1lICdsdG1haW4uc2gnICEgLW5hbWUgJ2NvbmZpZyonIC1wcmludCBcKSB8IHsKKyAgIHN0PTAKKyAgIHdoaWxlIHJlYWQgZmlsZQorICAgZG8KKyAgICAgIGNhc2UgIiRmaWxlIiBpbgorICAgICAgKi5tYWt8KltNbV1ha2VmaWxlLip8KltNbV1ha2VmaWxlKQorICAgICAgICAgIyBNYWtlZmlsZXMgcmVxdWlyZSB0YWJzLCBkZXBlbmRlbmN5IGxpbmVzIGNhbiBiZSB0aGlzIGxvbmcuCisgICAgICAgICBjaGVja190YWJzPQorICAgICAgICAgbGluZV9sZW5ndGg9MTAwOzsKKyAgICAgICouYXdrKQorICAgICAgICAgIyBJbmNsdWRlcyBsaXRlcmFsIHRhYnMKKyAgICAgICAgIGNoZWNrX3RhYnM9CisgICAgICAgICAjIFRoZSBmb2xsb3dpbmcgaXMgYXJiaXRyYXJ5CisgICAgICAgICBsaW5lX2xlbmd0aD0xMzI7OworICAgICAgKmNvbnRyaWIvKi8qLltjaF0pCisgICAgICAgICBjaGVja190YWJzPXllcworICAgICAgICAgbGluZV9sZW5ndGg9OTY7OworICAgICAgKikKKyAgICAgICAgIGNoZWNrX3RhYnM9eWVzCisgICAgICAgICBsaW5lX2xlbmd0aD04MDs7CisgICAgICBlc2FjCisKKyAgICAgICMgTm90ZSB0aGF0IHZlcnMgY2FuIG9ubHkgY29udGFpbiAwLTksIC4gYW5kIGEtegorICAgICAgaWYgdGVzdCAtbiAiJHZlcnMiCisgICAgICB0aGVuCisgICAgICAgICBzZWQgLWUgInMvJHZlcnMvYS5iLmNjL2ciICIkZmlsZSIgPiIkZmlsZSIuJCQKKyAgICAgIGVsc2UKKyAgICAgICAgIGNwICIkZmlsZSIgIiRmaWxlIi4kJAorICAgICAgZmkKKyAgICAgIHNwbHQ9ImBmb2xkIC0kbGluZV9sZW5ndGggIiRmaWxlIi4kJCB8IGRpZmYgLWMgIiRmaWxlIi4kJCAtYCIKKyAgICAgIHJtICIkZmlsZSIuJCQKKworICAgICAgaWYgdGVzdCAtbiAiJHNwbHQiCisgICAgICB0aGVuCisgICAgICAgICBlY2hvICIkZmlsZTogbGluZXMgdG9vIGxvbmciCisgICAgICAgICBzdD0xCisgICAgICAgICBpZiB0ZXN0IC1uICIkRURJVE9SIiAtYSAtbiAiJGVkaXQiCisgICAgICAgICB0aGVuCisgICAgICAgICAgICBkb2VkICIkZmlsZSIgfHwgZXhpdCAxCisgICAgICAgICBlbGlmIHRlc3QgLW4gIiR2ZXJib3NlIgorICAgICAgICAgdGhlbgorICAgICAgICAgICAgZWNobyAiJHNwbHQiCisgICAgICAgICBmaQorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgLW4gIiRjaGVja190YWJzIgorICAgICAgdGhlbgorICAgICAgICAgdGFiPSJgdHIgLWMgLWQgJ1x0JyA8IiRmaWxlImAiCisgICAgICAgICBpZiB0ZXN0IC1uICIkdGFiIgorICAgICAgICAgdGhlbgorICAgICAgICAgICAgZWNobyAiJGZpbGU6IGZpbGUgY29udGFpbnMgdGFiIGNoYXJhY3RlcnMiCisgICAgICAgICAgICBzdD0xCisgICAgICAgICAgICBpZiB0ZXN0IC1uICIkRURJVE9SIiAtYSAtbiAiJGVkaXQiCisgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICAgICBkb2VkICIkZmlsZSIgfHwgZXhpdCAxCisgICAgICAgICAgICBlbGlmIHRlc3QgLW4gIiR2ZXJib3NlIgorICAgICAgICAgICAgdGhlbgorICAgICAgICAgICAgICAgZWNobyAiJHNwbHQiCisgICAgICAgICAgICBmaQorICAgICAgICAgZmkKKyAgICAgIGZpCisgICBkb25lCisgICBleGl0ICRzdAorfQpkaWZmIC0tZ2l0IGEvbGlicG5nL2NvbnRyaWIvdG9vbHMvY3Z0Y29sb3IuYyBiL2xpYnBuZy9jb250cmliL3Rvb2xzL2N2dGNvbG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY3OTNjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL3Rvb2xzL2N2dGNvbG9yLmMKQEAgLTAsMCArMSwxODggQEAKKy8qLQorICogY29udmVydC5jCisgKgorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMCBbRmVicnVhcnkgMTQsIDIwMTNdCisgKgorICogQ09QWVJJR0hUOiBXcml0dGVuIGJ5IEpvaG4gQ3VubmluZ2hhbSBCb3dsZXIsIDIwMTMuCisgKiBUbyB0aGUgZXh0ZW50IHBvc3NpYmxlIHVuZGVyIGxhdywgdGhlIGF1dGhvciBoYXMgd2FpdmVkIGFsbCBjb3B5cmlnaHQgYW5kCisgKiByZWxhdGVkIG9yIG5laWdoYm9yaW5nIHJpZ2h0cyB0byB0aGlzIHdvcmsuICBUaGlzIHdvcmsgaXMgcHVibGlzaGVkIGZyb206CisgKiBVbml0ZWQgU3RhdGVzLgorICoKKyAqIENvbnZlcnQgOC1iaXQgc1JHQiBvciAxNi1iaXQgbGluZWFyIHZhbHVlcyB0byBhbm90aGVyIGZvcm1hdC4KKyAqLworI2RlZmluZSBfSVNPQzk5X1NPVVJDRSAxCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPGZlbnYuaD4KKworI2luY2x1ZGUgInNSR0IuaCIKKworc3RhdGljIHZvaWQKK3VzYWdlKGNvbnN0IGNoYXIgKnByb2cpCit7CisgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICIlczogdXNhZ2U6ICVzIFstbGluZWFyfC1zUkdCXSBbLWdyYXl8LWNvbG9yXSBjb21wb25lbnR7MSw0fVxuIiwKKyAgICAgIHByb2csIHByb2cpOworICAgZXhpdCgxKTsKK30KKwordW5zaWduZWQgbG9uZworY29tcG9uZW50KGNvbnN0IGNoYXIgKnByb2csIGNvbnN0IGNoYXIgKmFyZywgaW50IGlzc1JHQikKK3sKKyAgIGNoYXIgKmVwOworICAgdW5zaWduZWQgbG9uZyBjID0gc3RydG91bChhcmcsICZlcCwgMCk7CisKKyAgIGlmIChlcCA8PSBhcmcgfHwgKmVwIHx8IGMgPiA2NTUzNSB8fCAoaXNzUkdCICYmIGMgPiAyNTUpKQorICAgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlczogJXM6IGludmFsaWQgY29tcG9uZW50IHZhbHVlICglbHUpXG4iLCBwcm9nLCBhcmcsIGMpOworICAgICAgdXNhZ2UocHJvZyk7CisgICB9CisKKyAgIHJldHVybiBjOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworICAgY29uc3QgY2hhciAqcHJvZyA9ICphcmd2Kys7CisgICBpbnQgdG9fbGluZWFyID0gMCwgdG9fZ3JheSA9IDAsIHRvX2NvbG9yID0gMDsKKyAgIGludCBjaGFubmVscyA9IDA7CisgICBkb3VibGUgY1s0XTsKKworICAgLyogRkVfVE9ORUFSRVNUIGlzIHRoZSBJRUVFNzU0IHJvdW5kIHRvIG5lYXJlc3QsIHByZWZlcnJpbmcgZXZlbiwgbW9kZTsgaS5lLgorICAgICogZXZlcnl0aGluZyByb3VuZHMgdG8gdGhlIG5lYXJlc3QgdmFsdWUgZXhjZXB0IHRoYXQgJy41JyByb3VuZHMgdG8gdGhlCisgICAgKiBuZWFyZXN0IGV2ZW4gdmFsdWUuCisgICAgKi8KKyAgIGZlc2V0cm91bmQoRkVfVE9ORUFSRVNUKTsKKworICAgY1szXSA9IGNbMl0gPSBjWzFdID0gY1swXSA9IDA7CisKKyAgIHdoaWxlICgtLWFyZ2MgPiAwICYmICoqYXJndiA9PSAnLScpCisgICB7CisgICAgICBjb25zdCBjaGFyICphcmcgPSAxKyphcmd2Kys7CisKKyAgICAgIGlmIChzdHJjbXAoYXJnLCAic1JHQiIpID09IDApCisgICAgICAgICB0b19saW5lYXIgPSAwOworCisgICAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAibGluZWFyIikgPT0gMCkKKyAgICAgICAgIHRvX2xpbmVhciA9IDE7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICJncmF5IikgPT0gMCkKKyAgICAgICAgIHRvX2dyYXkgPSAxLCB0b19jb2xvciA9IDA7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICJjb2xvciIpID09IDApCisgICAgICAgICB0b19ncmF5ID0gMCwgdG9fY29sb3IgPSAxOworCisgICAgICBlbHNlCisgICAgICAgICB1c2FnZShwcm9nKTsKKyAgIH0KKworICAgc3dpdGNoIChhcmdjKQorICAgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHVzYWdlKHByb2cpOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgIGNbM10gPSBjb21wb25lbnQocHJvZywgYXJndlszXSwgdG9fbGluZWFyKTsKKyAgICAgICAgICsrY2hhbm5lbHM7CisgICAgICBjYXNlIDM6CisgICAgICAgICBjWzJdID0gY29tcG9uZW50KHByb2csIGFyZ3ZbMl0sIHRvX2xpbmVhcik7CisgICAgICAgICArK2NoYW5uZWxzOworICAgICAgY2FzZSAyOgorICAgICAgICAgY1sxXSA9IGNvbXBvbmVudChwcm9nLCBhcmd2WzFdLCB0b19saW5lYXIpOworICAgICAgICAgKytjaGFubmVsczsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgIGNbMF0gPSBjb21wb25lbnQocHJvZywgYXJndlswXSwgdG9fbGluZWFyKTsKKyAgICAgICAgICsrY2hhbm5lbHM7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgaWYgKHRvX2xpbmVhcikKKyAgIHsKKyAgICAgIGludCBpOworICAgICAgaW50IGNvbXBvbmVudHMgPSBjaGFubmVsczsKKworICAgICAgaWYgKChjb21wb25lbnRzICYgMSkgPT0gMCkKKyAgICAgICAgIC0tY29tcG9uZW50czsKKworICAgICAgZm9yIChpPTA7IGk8Y29tcG9uZW50czsgKytpKSBjW2ldID0gbGluZWFyX2Zyb21fc1JHQihjW2ldIC8gMjU1KTsKKyAgICAgIGlmIChjb21wb25lbnRzIDwgY2hhbm5lbHMpCisgICAgICAgICBjW2NvbXBvbmVudHNdID0gY1tjb21wb25lbnRzXSAvIDI1NTsKKyAgIH0KKworICAgZWxzZQorICAgeworICAgICAgaW50IGk7CisgICAgICBmb3IgKGk9MDsgaTw0OyArK2kpIGNbaV0gLz0gNjU1MzU7CisKKyAgICAgIGlmICgoY2hhbm5lbHMgJiAxKSA9PSAwKQorICAgICAgeworICAgICAgICAgZG91YmxlIGFscGhhID0gY1tjaGFubmVscy0xXTsKKworICAgICAgICAgaWYgKGFscGhhID4gMCkKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPGNoYW5uZWxzLTE7ICsraSkgY1tpXSAvPSBhbHBoYTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPGNoYW5uZWxzLTE7ICsraSkgY1tpXSA9IDE7CisgICAgICB9CisgICB9CisKKyAgIGlmICh0b19ncmF5KQorICAgeworICAgICAgaWYgKGNoYW5uZWxzIDwgMykKKyAgICAgIHsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHRvbyBmZXcgY2hhbm5lbHMgKCVkKSBmb3IgLWdyYXlcbiIsCisgICAgICAgICAgICBwcm9nLCBjaGFubmVscyk7CisgICAgICAgICB1c2FnZShwcm9nKTsKKyAgICAgIH0KKworICAgICAgY1swXSA9IFlmcm9tUkdCKGNbMF0sIGNbMV0sIGNbMl0pOworICAgICAgY2hhbm5lbHMgLT0gMjsKKyAgIH0KKworICAgaWYgKHRvX2NvbG9yKQorICAgeworICAgICAgaWYgKGNoYW5uZWxzID4gMikKKyAgICAgIHsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHRvbyBtYW55IGNoYW5uZWxzICglZCkgZm9yIC1jb2xvclxuIiwKKyAgICAgICAgICAgIHByb2csIGNoYW5uZWxzKTsKKyAgICAgICAgIHVzYWdlKHByb2cpOworICAgICAgfQorCisgICAgICBjWzNdID0gY1sxXTsgLyogYWxwaGEsIGlmIHByZXNlbnQgKi8KKyAgICAgIGNbMl0gPSBjWzFdID0gY1swXTsKKyAgIH0KKworICAgaWYgKHRvX2xpbmVhcikKKyAgIHsKKyAgICAgIGludCBpOworICAgICAgaWYgKChjaGFubmVscyAmIDEpID09IDApCisgICAgICB7CisgICAgICAgICBkb3VibGUgYWxwaGEgPSBjW2NoYW5uZWxzLTFdOworICAgICAgICAgZm9yIChpPTA7IGk8Y2hhbm5lbHMtMTsgKytpKSBjW2ldICo9IGFscGhhOworICAgICAgfQorCisgICAgICBmb3IgKGk9MDsgaTxjaGFubmVsczsgKytpKSBjW2ldID0gbmVhcmJ5aW50KGNbaV0gKiA2NTUzNSk7CisgICB9CisKKyAgIGVsc2UgLyogdG8gc1JHQiAqLworICAgeworICAgICAgaW50IGkgPSAoY2hhbm5lbHMrMSkmfjE7CisgICAgICB3aGlsZSAoLS1pID49IDApCisgICAgICAgICBjW2ldID0gc1JHQl9mcm9tX2xpbmVhcihjW2ldKTsKKworICAgICAgZm9yIChpPTA7IGk8Y2hhbm5lbHM7ICsraSkgY1tpXSA9IG5lYXJieWludChjW2ldICogMjU1KTsKKyAgIH0KKworICAgeworICAgICAgaW50IGk7CisgICAgICBmb3IgKGk9MDsgaTxjaGFubmVsczsgKytpKSBwcmludGYoIiAlZyIsIGNbaV0pOworICAgfQorICAgcHJpbnRmKCJcbiIpOworCisgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3Rvb2xzL2dlbnBuZy5jIGIvbGlicG5nL2NvbnRyaWIvdG9vbHMvZ2VucG5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U0MzI2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL3Rvb2xzL2dlbnBuZy5jCkBAIC0wLDAgKzEsODY3IEBACisvKi0gZ2VucG5nCisgKgorICogQ09QWVJJR0hUOiBXcml0dGVuIGJ5IEpvaG4gQ3VubmluZ2hhbSBCb3dsZXIsIDIwMTUuCisgKiBUbyB0aGUgZXh0ZW50IHBvc3NpYmxlIHVuZGVyIGxhdywgdGhlIGF1dGhvciBoYXMgd2FpdmVkIGFsbCBjb3B5cmlnaHQgYW5kCisgKiByZWxhdGVkIG9yIG5laWdoYm9yaW5nIHJpZ2h0cyB0byB0aGlzIHdvcmsuICBUaGlzIHdvcmsgaXMgcHVibGlzaGVkIGZyb206CisgKiBVbml0ZWQgU3RhdGVzLgorICoKKyAqIEdlbmVyYXRlIGEgUE5HIHdpdGggYW4gYWxwaGEgY2hhbm5lbCwgY29ycmVjdGx5LgorICoKKyAqIFRoaXMgaXMgYSB0ZXN0IGNhc2UgZ2VuZXJhdG9yOyB0aGUgcmVzdWx0YW50IFBORyBmaWxlcyBhcmUgb25seSBvZiBpbnRlcmVzdAorICogdG8gdGhvc2Ugb2YgdXMgd2hvIGNhcmUgYWJvdXQgd2hldGhlciB0aGUgZWRnZXMgb2YgY2lyY2xlcyBhcmUgZ3JlZW4sIHJlZCwKKyAqIG9yIHllbGxvdy4KKyAqCisgKiBUaGUgcHJvZ3JhbSBnZW5lcmF0ZXMgYW4gUkdCK0FscGhhIFBORyBvZiBhIGdpdmVuIHNpemUgY29udGFpbmluZyB0aGUgZ2l2ZW4KKyAqIHNoYXBlcyBvbiBhIHRyYW5zcGFyZW50IGJhY2tncm91bmQ6CisgKgorICogIGdlbnBuZyB3aWR0aCBoZWlnaHQgeyBzaGFwZSB9CisgKiAgICBzaGFwZSA6Oj0gY29sb3Igd2lkdGggc2hhcGUgeDEgeTEgeDIgeTIKKyAqCisgKiAnY29sb3InIGlzOgorICoKKyAqICBibGFjayB3aGl0ZSByZWQgZ3JlZW4geWVsbG93IGJsdWUgYnJvd24gcHVycGxlIHBpbmsgb3JhbmdlIGdyYXkgY3lhbgorICoKKyAqIFRoZSBwb2ludCBpcyB0byBoYXZlIGNvbG9ycyB0aGF0IGFyZSBsaW5ndWlzdGljYWxseSBtZWFuaW5nZnVsIHBsdXMgdGhhdCBvbGQKKyAqIGJ1Z2JlYXIgb2YgdGhlIGRlcGFydG1lbnQgc3RvcmUgZHJlc3MgbXVyZGVycywgQ3lhbiwgdGhlIG9ubHkgY29sb3Igd2UgYXJndWUKKyAqIGFib3V0LgorICoKKyAqICdzaGFwZScgaXM6CisgKgorICogIGNpcmNsZTogYW4gZWxsaXBzZQorICogIHNxdWFyZTogYSByZWN0YW5nbGUKKyAqICBsaW5lOiBhIHN0cmFpZ2h0IGxpbmUKKyAqCisgKiBFYWNoIHNoYXBlIGlzIGZvbGxvd2VkIGJ5IGZvdXIgbnVtYmVycywgdGhlc2UgYXJlIHR3byBwb2ludHMgaW4gdGhlIG91dHB1dAorICogY29vcmRpbmF0ZSBzcGFjZSAoYXMgcmVhbCBudW1iZXJzKSB3aGljaCBkZXNjcmliZSB0aGUgY2lyY2xlLCBzcXVhcmUsIG9yCisgKiBsaW5lLiAgVGhlIHNoYXBlIGlzIGZpbGxlZCBpZiBpdCBpcyBwcmVjZWRlZCBieSAnZmlsbGVkJyAobm90IHZhbGlkIGZvcgorICogJ2xpbmUnKSBvciBpcyBkcmF3biB3aXRoIGEgbGluZSwgaW4gd2hpY2ggY2FzZSB0aGUgd2lkdGggb2YgdGhlIGxpbmUgbXVzdAorICogcHJlY2VkZSB0aGUgc2hhcGUuCisgKgorICogVGhlIHdob2xlIHNldCBvZiBpbmZvcm1hdGlvbiBjYW4gYmUgcmVwZWF0ZWQgYXMgbWFueSB0aW1lcyBhcyBkZXNpcmVkOgorICoKKyAqICAgIHNoYXBlIDo6PSBjb2xvciB3aWR0aCBzaGFwZSB4MSB5MSB4MiB5MgorICoKKyAqICAgIGNvbG9yIDo6PSBibGFja3x3aGl0ZXxyZWR8Z3JlZW58eWVsbG93fGJsdWUKKyAqICAgIGNvbG9yIDo6PSBicm93bnxwdXJwbGV8cGlua3xvcmFuZ2V8Z3JheXxjeWFuCisgKiAgICB3aWR0aCA6Oj0gZmlsbGVkCisgKiAgICB3aWR0aCA6Oj0gPG51bWJlcj4KKyAqICAgIHNoYXBlIDo6PSBjaXJjbGV8c3F1YXJlfGxpbmUKKyAqICAgIHgxICAgIDo6PSA8bnVtYmVyPgorICogICAgeDIgICAgOjo9IDxudW1iZXI+CisgKiAgICB5MSAgICA6Oj0gPG51bWJlcj4KKyAqICAgIHkyICAgIDo6PSA8bnVtYmVyPgorICoKKyAqIFRoZSBvdXRwdXQgUE5HIGlzIGdlbmVyYXRlZCBieSBkb3duLXNhbXBsaW5nIGEgNHggc3VwZXJzYW1wbGVkIGltYWdlIHVzaW5nCisgKiBhIGJpLWN1YmljIGZpbHRlci4gIFRoZSBiaS1jdWJpYyBoYXMgYSAyIChvdXRwdXQpIHBpeGVsIHdpZHRoLCBzbyBhbiA4eDgKKyAqIGFycmF5IG9mIHN1cGVyLXNhbXBsZWQgcG9pbnRzIGNvbnRyaWJ1dGUgdG8gZWFjaCBvdXRwdXQgcGl4ZWwuICBUaGUgdmFsdWUgb2YKKyAqIGEgc3VwZXItc2FtcGxlZCBwb2ludCBpcyBmb3VuZCB1c2luZyBhbiB1bmZpbHRlcmVkLCBhbGlhc2VkLCBpbmZpbml0ZQorICogcHJlY2lzaW9uIGltYWdlOiBFYWNoIHNoYXBlIGZyb20gdGhlIGxhc3QgdG8gdGhlIGZpcnN0IGlzIGNoZWNrZWQgdG8gc2VlIGlmCisgKiB0aGUgcG9pbnQgaXMgaW4gdGhlIGRyYXduIGFyZWEgYW5kLCBpZiBpdCBpcywgdGhlIGNvbG9yIG9mIHRoZSBwb2ludCBpcyB0aGUKKyAqIGNvbG9yIG9mIHRoZSBzaGFwZSBhbmQgdGhlIGFscGhhIGlzIDEsIGlmIG5vdCB0aGUgcHJldmlvdXMgc2hhcGUgaXMgY2hlY2tlZC4KKyAqCisgKiBUaGlzIGlzIGFuIGFsaWFzZWQgYWxnb3JpdGhtIGJlY2F1c2Ugbm8gZmlsdGVyaW5nIGlzIGRvbmU7IGEgcG9pbnQgaXMgZWl0aGVyCisgKiBpbnNpZGUgb3Igb3V0c2lkZSBlYWNoIHNoYXBlIGFuZCAnY2xvc2UnIHBvaW50cyBkbyBub3QgY29udHJpYnV0ZSB0byB0aGUKKyAqIHNhbXBsZS4gIFRoZSBkb3duLXNhbXBsaW5nIGlzIHJlbGllZCBvbiB0byBjb3JyZWN0IHRoZSBlcnJvciBvZiBub3QgdXNpbmcKKyAqIGEgZmlsdGVyLgorICoKKyAqIFRoZSBsaW5lIGVuZC1jYXBzIGFyZSAnZmxhdCc7IHRoZXkgZ28gdGhyb3VnaCB0aGUgcG9pbnRzLiAgVGhlIHNxdWFyZSBsaW5lCisgKiBqb2lucyBhcmUgbWl0cmVzOyB0aGUgb3V0c2lkZSBvZiB0aGUgbGluZXMgYXJlIGNvbnRpbnVlZCB0byB0aGUgcG9pbnQgb2YKKyAqIGludGVyc2VjdGlvbi4KKyAqLworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisvKiBOb3JtYWxseSB1c2UgPHBuZy5oPiBoZXJlIHRvIGdldCB0aGUgaW5zdGFsbGVkIGxpYnBuZywgYnV0IHRoaXMgaXMgZG9uZSB0bworICogZW5zdXJlIHRoZSBjb2RlIHBpY2tzIHVwIHRoZSBsb2NhbCBsaWJwbmcgaW1wbGVtZW50YXRpb246CisgKi8KKyNpbmNsdWRlICIuLi8uLi9wbmcuaCIKKworI2lmIGRlZmluZWQoUE5HX1NJTVBMSUZJRURfV1JJVEVfU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19TVERJT19TVVBQT1JURUQpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29sb3IKK3sKKyAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICBkb3VibGUgICAgICByZWQ7CisgICBkb3VibGUgICAgICBncmVlbjsKKyAgIGRvdWJsZSAgICAgIGJsdWU7Cit9IGNvbG9yc1tdID0KKy8qIGNvbG9yIDo6PSBibGFja3x3aGl0ZXxyZWR8Z3JlZW58eWVsbG93fGJsdWUKKyAqIGNvbG9yIDo6PSBicm93bnxwdXJwbGV8cGlua3xvcmFuZ2V8Z3JheXxjeWFuCisgKi8KK3sKKyAgIHsgImJsYWNrIiwgICAwLCAgICAwLCAgMCB9LAorICAgeyAid2hpdGUiLCAgIDEsICAgIDEsICAxIH0sCisgICB7ICJyZWQiLCAgICAgMSwgICAgMCwgIDAgfSwKKyAgIHsgImdyZWVuIiwgICAwLCAgICAxLCAgMCB9LAorICAgeyAieWVsbG93IiwgIDEsICAgIDEsICAwIH0sCisgICB7ICJibHVlIiwgICAgMCwgICAgMCwgIDEgfSwKKyAgIHsgImJyb3duIiwgIC41LCAuMTI1LCAgMCB9LAorICAgeyAicHVycGxlIiwgIDEsICAgIDAsICAxIH0sCisgICB7ICJwaW5rIiwgICAgMSwgICAuNSwgLjUgfSwKKyAgIHsgIm9yYW5nZSIsICAxLCAgIC41LCAgMCB9LAorICAgeyAiZ3JheSIsICAgIDAsICAgLjUsIC41IH0sCisgICB7ICJjeWFuIiwgICAgMCwgICAgMSwgIDEgfQorfTsKKyNkZWZpbmUgY29sb3JfY291bnQgKChzaXplb2YgY29sb3JzKS8oc2l6ZW9mIGNvbG9yc1swXSkpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29sb3IgKgorY29sb3Jfb2YoY29uc3QgY2hhciAqYXJnKQoreworICAgaW50IGljb2xvciA9IGNvbG9yX2NvdW50OworCisgICB3aGlsZSAoLS1pY29sb3IgPj0gMCkKKyAgIHsKKyAgICAgIGlmIChzdHJjbXAoY29sb3JzW2ljb2xvcl0ubmFtZSwgYXJnKSA9PSAwKQorICAgICAgICAgcmV0dXJuIGNvbG9ycytpY29sb3I7CisgICB9CisKKyAgIGZwcmludGYoc3RkZXJyLCAiZ2VucG5nOiBpbnZhbGlkIGNvbG9yICVzXG4iLCBhcmcpOworICAgZXhpdCgxKTsKK30KKworc3RhdGljIGRvdWJsZQord2lkdGhfb2YoY29uc3QgY2hhciAqYXJnKQoreworICAgaWYgKHN0cmNtcChhcmcsICJmaWxsZWQiKSA9PSAwKQorICAgICAgcmV0dXJuIDA7CisKKyAgIGVsc2UKKyAgIHsKKyAgICAgIGNoYXIgKmVwID0gTlVMTDsKKyAgICAgIGRvdWJsZSB3ID0gc3RydG9kKGFyZywgJmVwKTsKKworICAgICAgaWYgKGVwICE9IE5VTEwgJiYgKmVwID09IDAgJiYgdyA+IDApCisgICAgICAgICByZXR1cm4gdzsKKyAgIH0KKworICAgZnByaW50ZihzdGRlcnIsICJnZW5wbmc6IGludmFsaWQgbGluZSB3aWR0aCAlc1xuIiwgYXJnKTsKKyAgIGV4aXQoMSk7Cit9CisKK3N0YXRpYyBkb3VibGUKK2Nvb3JkaW5hdGVfb2YoY29uc3QgY2hhciAqYXJnKQoreworICAgY2hhciAqZXAgPSBOVUxMOworICAgZG91YmxlIHcgPSBzdHJ0b2QoYXJnLCAmZXApOworCisgICBpZiAoZXAgIT0gTlVMTCAmJiAqZXAgPT0gMCkKKyAgICAgIHJldHVybiB3OworCisgICBmcHJpbnRmKHN0ZGVyciwgImdlbnBuZzogaW52YWxpZCBjb29yZGluYXRlIHZhbHVlICVzXG4iLCBhcmcpOworICAgZXhpdCgxKTsKK30KKworc3RydWN0IGFyZzsgLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLworCit0eXBlZGVmIGludCAoKnNoYXBlX2ZuX3B0cikoY29uc3Qgc3RydWN0IGFyZyAqYXJnLCBkb3VibGUgeCwgZG91YmxlIHkpOworICAgLyogQSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgKHgseSkgaXMgaW5zaWRlIHRoZSBzaGFwZS4KKyAgICAqCisgICAgKiBUaGVyZSBhcmUgdHdvIGltcGxlbWVudGF0aW9uczoKKyAgICAqCisgICAgKiAgICBpbnNpZGVfZm46IHJldHVybnMgdHJ1ZSBpZiB0aGUgcG9pbnQgaXMgaW5zaWRlCisgICAgKiAgICBjaGVja19mbjogIHJldHVybnM7CisgICAgKiAgICAgICAtMTogdGhlIHBvaW50IGlzIG91dHNpZGUgdGhlIHNoYXBlIGJ5IG1vcmUgdGhhbiB0aGUgZmlsdGVyIHdpZHRoICgyKQorICAgICogICAgICAgIDA6IHRoZSBwb2ludCBtYXkgYmUgaW5zaWRlIHRoZSBzaGFwZQorICAgICogICAgICAgKzE6IHRoZSBwb2ludCBpcyBpbnNpZGUgdGhlIHNoYXBlIGJ5IG1vcmUgdGhhbiB0aGUgZmlsdGVyIHdpZHRoCisgICAgKi8KKyNkZWZpbmUgT1VUU0lERSAoLTEpCisjZGVmaW5lIElOU0lERSAgKDEpCisKK3N0cnVjdCBhcmcKK3sKKyAgIGNvbnN0IHN0cnVjdCBjb2xvciAqY29sb3I7CisgICBzaGFwZV9mbl9wdHIgICAgICAgIGluc2lkZV9mbjsKKyAgIHNoYXBlX2ZuX3B0ciAgICAgICAgY2hlY2tfZm47CisgICBkb3VibGUgICAgICAgICAgICAgIHdpZHRoOyAvKiBsaW5lIHdpZHRoLCAwIGZvciAnZmlsbGVkJyAqLworICAgZG91YmxlICAgICAgICAgICAgICB4MSwgeTEsIHgyLCB5MjsKK307CisKKy8qIElNUExFTUVOVEFUSU9OIE5PVEU6CisgKgorICogV2Ugd2FudCB0aGUgY29udHJpYnV0aW9uIG9mIGVhY2ggc2hhcGUgdG8gdGhlIHNhbXBsZSBjb3JyZXNwb25kaW5nIHRvIGVhY2gKKyAqIHBpeGVsLiAgVGhpcyBjb3VsZCBiZSBvYnRhaW5lZCBieSBzdXBlciBzYW1wbGluZyB0aGUgaW1hZ2UgdG8gaW5maW5pdGUKKyAqIGRpbWVuc2lvbnMsIGZpbmRpbmcgZWFjaCBwb2ludCB3aXRoaW4gdGhlIHNoYXBlIGFuZCBhc3NpZ25pbmcgdGhhdCBhIHZhbHVlCisgKiAnMScgd2hpbGUgbGVhdmluZyBldmVyeSBwb2ludCBvdXRzaWRlIHRoZSBzaGFwZSB3aXRoIHZhbHVlICcwJyB0aGVuCisgKiBkb3duc2FtcGxpbmcgdG8gdGhlIGltYWdlIHNpemUgd2l0aCBzaW5jOyBjb21wdXRhdGlvbmFsbHkgdmVyeSBleHBlbnNpdmUuCisgKgorICogQXBwcm94aW1hdGlvbnMgYXJlIGFzIGZvbGxvd3M6CisgKgorICogMSkgSWYgdGhlIHBpeGVsIGNvb3JkaW5hdGUgaXMgd2l0aGluIHRoZSBzaGFwZSBhc3N1bWUgdGhlIHNhbXBsZSBoYXMgdGhlCisgKiAgICBzaGFwZSBjb2xvciBhbmQgaXMgb3BhcXVlLCBlbHNlIGFzc3VtZSB0aGVyZSBpcyBubyBjb250cmlidXRpb24gZnJvbQorICogICAgdGhlIHNoYXBlLgorICoKKyAqICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgYWxpYXNlZCByZW5kZXJpbmcgb3IgcmVzYW1wbGluZyBhbiBpbWFnZSB3aXRoCisgKiAgICBhIGJsb2NrIGZpbHRlci4gIFRoZSBtYXhpbXVtIGVycm9yIGluIHRoZSBjYWxjdWxhdGVkIGFscGhhICh3aGljaCB3aWxsCisgKiAgICBhbHdheXMgYmUgMCBvciAxKSBpcyAwLjUuCisgKgorICogMikgSWYgdGhlIHNoYXBlIGlzIHdpdGhpbiBhIHNxdWFyZSBvZiBzaXplIDF4MSBjZW50ZXJlZCBvbiB0aGUgcGl4ZWwgYXNzdW1lCisgKiAgICB0aGF0IHRoZSBzaGFwZSBvYnNjdXJlcyBhbiBhbW91bnQgb2YgdGhlIHBpeGVsIGVxdWFsIHRvIGl0cyBhcmVhIHdpdGhpbgorICogICAgdGhhdCBzcXVhcmUuCisgKgorICogICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiAncGl4ZWwgY292ZXJhZ2UnIGFscGhhIGNhbGN1bGF0aW9uIG9yIHJlc2FtcGxpbmcKKyAqICAgIGFuIGltYWdlIHdpdGggYSBiaS1saW5lYXIgZmlsdGVyLiAgVGhlIG1heGltdW0gZXJyb3IgaXMgb3ZlciAwLjIsIGJ1dCB0aGUKKyAqICAgIHJlc3VsdHMgYXJlIG9mdGVuIGFjY2VwdGFibGUuCisgKgorICogICAgVGhpcyBjYW4gYmUgYXBwcm94aW1hdGVkIGJ5IGFwcGx5aW5nICgxKSB0byBhIHN1cGVyLXNhbXBsZWQgaW1hZ2UgdGhlbgorICogICAgZG93bnNhbXBsaW5nIHdpdGggYSBiaS1saW5lYXIgZmlsdGVyLiAgVGhlIGVycm9yIGluIHRoZSBzdXBlci1zYW1wbGVkCisgKiAgICBpbWFnZSBpcyAwLjUgcGVyIHNhbXBsZSwgYnV0IHRoZSByZXNhbXBsaW5nIHJlZHVjZXMgdGhpcy4KKyAqCisgKiAzKSBVc2UgYSBiZXR0ZXIgZmlsdGVyIHdpdGggYSBzdXBlci1zYW1wbGVkIGltYWdlOyBpbiB0aGUgbGltaXQgdGhpcyBpcyB0aGUKKyAqICAgIHNpbmMoKSBhcHByb2FjaC4KKyAqCisgKiA0KSBEbyB0aGUgZ2VvbWV0cmljIGNhbGN1bGF0aW9uOyBhIGJpdmFyaWF0ZSBkZWZpbml0ZSBpbnRlZ3JhbCBhY3Jvc3MgdGhlCisgKiAgICBzaGFwZSwgdW5mb3J0dW5hdGVseSB0aGlzIG1lYW5zIGV2YWx1YXRpbmcgU2koeCksIHRoZSBpbnRlZ3JhbCBvZiBzaW5jKHgpLAorICogICAgd2hpY2ggaXMgc3RpbGwgYSBsb3Qgb2YgbWF0aC4KKyAqCisgKiBUaGlzIGNvZGUgdXNlcyBhcHByb2FjaCAoMykgd2l0aCBhIGJpLWN1YmljIGZpbHRlciBhbmQgOHggc3VwZXItc2FtcGxpbmcKKyAqIGFuZCBtZXRob2QgKDEpIGZvciB0aGUgc3VwZXItc2FtcGxlcy4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgc2FtcGxlIGlzIGVpdGhlcgorICogMCBvciAxLCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgc3ViLXBpeGVsIGlzIHdpdGhpbiBvciBvdXRzaWRlIHRoZSBzaGFwZS4KKyAqIFRoZSBiaS1jdWJpYyB3ZWlnaHRzIGFyZSBhbHNvIGZpeGVkIGFuZCB0aGUgMTYgcmVxdWlyZWQgd2VpZ2h0cyBhcmUKKyAqIHByZS1jb21wdXRlZCBoZXJlIChub3RlIHRoYXQgdGhlICdzY2FsZScgc2V0dGluZyB3aWxsIG5lZWQgdG8gYmUgY2hhbmdlZCBpZgorICogJ3N1cGVyJyBpcyBpbmNyZWFzZWQpLgorICoKKyAqIFRoZSBjb2RlIGFsc28gY2FsY3VsYXRlcyBhIHN1bSB0byB0aGUgZWRnZSBvZiB0aGUgZmlsdGVyLiBUaGlzIGlzIG5vdAorICogY3VycmVudGx5IHVzZWQgYnkgY291bGQgYmUgdXNlZCB0byBvcHRpbWl6ZSB0aGUgY2FsY3VsYXRpb24uCisgKi8KKyNpZiAwIC8qIGJjIGNvZGUgKi8KK3NjYWxlPTEwCitzdXBlcj04CitkZWZpbmUgYmljdWJpYyh4KSB7CisgICBpZiAoeCA8PSAxKSByZXR1cm4gKDEuNSp4IC0gMi41KSp4KnggKyAxOworICAgaWYgKHggPCAgMikgcmV0dXJuICgoKDIuNSAtIDAuNSp4KSp4IC0gNCkqeCArIDIpOworICAgcmV0dXJuIDA7Cit9CitkZWZpbmUgc3VtKHgpIHsKKyAgIGF1dG8gczsKKyAgIHMgPSAwOworICAgd2hpbGUgKHggPCAyKnN1cGVyKSB7CisgICAgICBzID0gcyArIGJpY3ViaWMoeC9zdXBlcik7CisgICAgICB4ID0geCArIDE7CisgICB9CisgICByZXR1cm4gczsKK30KK2RlZmluZSByZXN1bHRzKHgpIHsKKyAgIGF1dG8gYiwgczsKKyAgIGIgPSBiaWN1YmljKHgvc3VwZXIpOworICAgcyA9IHN1bSh4KTsKKworICAgcHJpbnQgIiAgIC8qIiwgeCwgIiovIHsgIiwgYiwgIiwgIiwgcywgIiB9IjsKKyAgIHJldHVybiAxOworfQoreD0wCit3aGlsZSAoeDwyKnN1cGVyKSB7CisgICB4ID0geCArIHJlc3VsdHMoeCkKKyAgIGlmICh4IDwgMipzdXBlcikgcHJpbnQgIiwiCisgICBwcmludCAiXG4iCit9CitxdWl0CisjZW5kaWYKKworI2RlZmluZSBCSUNVQklDMSh4KSAvKiAgICAgfHh8IDw9IDEgKi8gKCgxLjUqKHgpKiAtIDIuNSkqKHgpKih4KSArIDEpCisjZGVmaW5lIEJJQ1VCSUMyKHgpIC8qIDEgPCB8eHwgPCAgMiAqLyAoKCgyLjUgLSAwLjUqKHgpKSooeCkgLSA0KSooeCkgKyAyKQorI2RlZmluZSBGSUxURVJfV0VJR0hUIDkgLyogVHdpY2UgdGhlIGZpcnN0IHN1bSBiZWxvdyAqLworI2RlZmluZSBGSUxURVJfV0lEVEggIDIgLyogQWN0dWFsbHkgaGFsZiB0aGUgd2lkdGg7IC0yLi4rMiAqLworI2RlZmluZSBGSUxURVJfU1RFUFMgIDggLyogc3RlcHMgcGVyIGZpbHRlciB1bml0ICovCitzdGF0aWMgY29uc3QgZG91YmxlCitiaWN1YmljWzE2XVsyXSA9Cit7CisgICAvKiBUaGVzZSBudW1iZXJzIGFyZSBleGFjdDsgdGhlIHdlaWdodCBmb3IgdGhlIGZpbHRlciBpcyAxLzksIGJ1dCB0aGlzCisgICAgKiB3b3VsZCBtYWtlIHRoZSBudW1iZXJzIGluZXhhY3QsIHNvIGl0IGlzIG5vdCBpbmNsdWRlZCBoZXJlLgorICAgICovCisgICAvKiAgICAgICAgICBiaWN1YmljICAgICAgc3VtICAgICAgICAqLworICAgLyogMCovIHsgMS4wMDAwMDAwMDAwLCA0LjUwMDAwMDAwMDAgfSwKKyAgIC8qIDEqLyB7ICAuOTYzODY3MTg3NSwgMy41MDAwMDAwMDAwIH0sCisgICAvKiAyKi8geyAgLjg2NzE4NzUwMDAsIDIuNTM2MTMyODEyNSB9LAorICAgLyogMyovIHsgIC43Mjc1MzkwNjI1LCAxLjY2ODk0NTMxMjUgfSwKKyAgIC8qIDQqLyB7ICAuNTYyNTAwMDAwMCwgIC45NDE0MDYyNTAwIH0sCisgICAvKiA1Ki8geyAgLjM4OTY0ODQzNzUsICAuMzc4OTA2MjUwMCB9LAorICAgLyogNiovIHsgIC4yMjY1NjI1MDAwLCAtLjAxMDc0MjE4NzUgfSwKKyAgIC8qIDcqLyB7ICAuMDkwODIwMzEyNSwgLS4yMzczMDQ2ODc1IH0sCisgICAvKiA4Ki8geyAgICAgICAgICAgIDAsIC0uMzI4MTI1MDAwMCB9LAorICAgLyogOSovIHsgLS4wNDc4NTE1NjI1LCAtLjMyODEyNTAwMDAgfSwKKyAgIC8qMTAqLyB7IC0uMDcwMzEyNTAwMCwgLS4yODAyNzM0Mzc1IH0sCisgICAvKjExKi8geyAtLjA3MzI0MjE4NzUsIC0uMjA5OTYwOTM3NSB9LAorICAgLyoxMiovIHsgLS4wNjI1MDAwMDAwLCAtLjEzNjcxODc1MDAgfSwKKyAgIC8qMTMqLyB7IC0uMDQzOTQ1MzEyNSwgLS4wNzQyMTg3NTAwIH0sCisgICAvKjE0Ki8geyAtLjAyMzQzNzUwMDAsIC0uMDMwMjczNDM3NSB9LAorICAgLyoxNSovIHsgLS4wMDY4MzU5Mzc1LCAtLjAwNjgzNTkzNzUgfQorfTsKKworc3RhdGljIGRvdWJsZQorYWxwaGFfY2FsYyhjb25zdCBzdHJ1Y3QgYXJnICphcmcsIGRvdWJsZSB4LCBkb3VibGUgeSkKK3sKKyAgIC8qIEZvciBbeC0yLi54KzJdLFt5LTIseSsyXSBjYWxjdWxhdGUgdGhlIHdlaWdodGVkIGJpY3ViaWMgZ2l2ZW4gYSBmdW5jdGlvbgorICAgICogd2hpY2ggdGVsbHMgdXMgd2hldGhlciBhIHBvaW50IGlzIGluc2lkZSBvciBvdXRzaWRlIHRoZSBzaGFwZS4gIEZpcnN0CisgICAgKiBjaGVjayBpZiB3ZSBuZWVkIHRvIGRvIHRoaXMgYXQgYWxsOgorICAgICovCisgICBzd2l0Y2ggKGFyZy0+Y2hlY2tfZm4oYXJnLCB4LCB5KSkKKyAgIHsKKyAgICAgIGNhc2UgT1VUU0lERToKKyAgICAgICAgIHJldHVybiAwOyAvKiBhbGwgc2FtcGxlcyBvdXRzaWRlIHRoZSBzaGFwZSAqLworCisgICAgICBjYXNlIElOU0lERToKKyAgICAgICAgIHJldHVybiAxOyAvKiBhbGwgc2FtcGxlcyBpbnNpZGUgdGhlIHNoYXBlICovCisKKyAgICAgIGRlZmF1bHQ6CisgICAgICB7CisgICAgICAgICBpbnQgZHk7CisgICAgICAgICBkb3VibGUgYWxwaGEgPSAwOworCisjICAgICAgICBkZWZpbmUgRklMVEVSX0QgKEZJTFRFUl9XSURUSCpGSUxURVJfU1RFUFMtMSkKKyAgICAgICAgIGZvciAoZHk9LUZJTFRFUl9EOyBkeTw9RklMVEVSX0Q7ICsrZHkpCisgICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgd3kgPSBiaWN1YmljW2FicyhkeSldWzBdOworCisgICAgICAgICAgICBpZiAod3kgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGRvdWJsZSBhbHBoYXkgPSAwOworICAgICAgICAgICAgICAgaW50IGR4OworCisgICAgICAgICAgICAgICBmb3IgKGR4PS1GSUxURVJfRDsgZHg8PUZJTFRFUl9EOyArK2R4KQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZG91YmxlIHd4ID0gYmljdWJpY1thYnMoZHgpXVswXTsKKworICAgICAgICAgICAgICAgICAgaWYgKHd4ICE9IDAgJiYgYXJnLT5pbnNpZGVfZm4oYXJnLCB4K2R4LzE2LCB5K2R5LzE2KSkKKyAgICAgICAgICAgICAgICAgICAgIGFscGhheSArPSB3eDsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgYWxwaGEgKz0gd3kgKiBhbHBoYXk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIC8qIFRoaXMgbmVlZHMgdG8gYmUgd2VpZ2h0ZWQgZm9yIGVhY2ggZGltZW5zaW9uOiAqLworICAgICAgICAgcmV0dXJuIGFscGhhIC8gKEZJTFRFUl9XRUlHSFQqRklMVEVSX1dFSUdIVCk7CisgICAgICB9CisgICB9Cit9CisKKy8qIFRoZXNlIGFyZSB0aGUgc2hhcGUgZnVuY3Rpb25zLiAqLworLyogInNxdWFyZSIsCisgKiB7IGluc2lkZV9zcXVhcmVfZmlsbGVkLCBjaGVja19zcXVhcmVfZmlsbGVkIH0sCisgKiB7IGluc2lkZV9zcXVhcmUsIGNoZWNrX3NxdWFyZSB9CisgKi8KK3N0YXRpYyBpbnQKK3NxdWFyZV9jaGVjayhkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsIGRvdWJsZSB5MikKKyAgIC8qIElzIHgseSBpbnNpZGUgdGhlIHNxdWFyZSAoeDEseTEpLi4oeDIseTIpPyAqLworeworICAgLyogRG8gYSBtb2RpZmllZCBDb2hlbi1TdXRoZXJsYW5kIG9uIG9uZSBwb2ludCwgYml0IHBhdHRlcm5zIHRoYXQgaW5kaWNhdGUKKyAgICAqICdvdXRzaWRlJyBhcmU6CisgICAgKgorICAgICogICB4PHgxIHwgeDx5MSB8IHg8eDIgfCB4PHkyCisgICAgKiAgICAwICAgICAgeCAgICAgIDAgICAgICB4ICAgICBUbyB0aGUgcmlnaHQKKyAgICAqICAgIDEgICAgICB4ICAgICAgMSAgICAgIHggICAgIFRvIHRoZSBsZWZ0CisgICAgKiAgICB4ICAgICAgMCAgICAgIHggICAgICAwICAgICBCZWxvdworICAgICogICAgeCAgICAgIDEgICAgICB4ICAgICAgMSAgICAgQWJvdmUKKyAgICAqCisgICAgKiBTbyAnaW5zaWRlJyBpcyAoeDx4MSkgIT0gKHg8eDIpICYmICh5PHkxKSAhPSAoeTx5Mik7CisgICAgKi8KKyAgIHJldHVybiAoKHg8eDEpIF4gKHg8eDIpKSAmICgoeTx5MSkgXiAoeTx5MikpOworfQorCitzdGF0aWMgaW50CitpbnNpZGVfc3F1YXJlX2ZpbGxlZChjb25zdCBzdHJ1Y3QgYXJnICphcmcsIGRvdWJsZSB4LCBkb3VibGUgeSkKK3sKKyAgIHJldHVybiBzcXVhcmVfY2hlY2soeCwgeSwgYXJnLT54MSwgYXJnLT55MSwgYXJnLT54MiwgYXJnLT55Mik7Cit9CisKK3N0YXRpYyBpbnQKK3NxdWFyZV9jaGVja19saW5lKGNvbnN0IHN0cnVjdCBhcmcgKmFyZywgZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgdykKKyAgIC8qIENoZWNrIGZvciBhIHBvaW50IGJlaW5nIGluc2lkZSB0aGUgYm91bmRhcmllcyBpbXBsaWVkIGJ5IHRoZSBnaXZlbiBhcmcKKyAgICAqIGFuZCBhc3N1bWluZyBhIHdpZHRoIDIqdyBlYWNoIHNpZGUgb2YgdGhlIGJvdW5kYXJpZXMuICBUaGlzIHJldHVybnMgdGhlCisgICAgKiAnY2hlY2snIElOU0lERS9PVVRTSURFLzAgcmVzdWx0IGJ1dCBub3RlIHRoZSBzZW1hbnRpY3M6CisgICAgKgorICAgICogICAgICAgICAgKy0tLS0tLS0tLS0tLS0tKworICAgICogICAgICAgICAgfCAgICAgICAgICAgICAgfCAgIE9VVFNJREUKKyAgICAqICAgICAgICAgIHwgICBJTlNJREUgICAgIHwKKyAgICAqICAgICAgICAgIHwgICAgICAgICAgICAgIHwKKyAgICAqICAgICAgICAgICstLS0tLS0tLS0tLS0tLSsKKyAgICAqCisgICAgKiBBbmQgJzAnIG1lYW5zIHdpdGhpbiB0aGUgbGluZSBib3VuZGFyaWVzLgorICAgICovCit7CisgICBkb3VibGUgY3ggPSAoYXJnLT54MSthcmctPngyKS8yOworICAgZG91YmxlIHd4ID0gZmFicyhhcmctPngxLWFyZy0+eDIpLzI7CisgICBkb3VibGUgY3kgPSAoYXJnLT55MSthcmctPnkyKS8yOworICAgZG91YmxlIHd5ID0gZmFicyhhcmctPnkxLWFyZy0+eTIpLzI7CisKKyAgIGlmIChzcXVhcmVfY2hlY2soeCwgeSwgY3gtd3gtdywgY3ktd3ktdywgY3grd3grdywgY3krd3krdykpCisgICB7CisgICAgICAvKiBJbnNpZGUsIGJ1dCBtYXliZSB0b28gZmFyOyBjaGVjayBmb3IgdGhlIHJlZHVuZGFudCBjYXNlIHdoZXJlCisgICAgICAgKiB0aGUgbGluZXMgb3ZlcmxhcDoKKyAgICAgICAqLworICAgICAgd3ggLT0gdzsKKyAgICAgIHd5IC09IHc7CisgICAgICBpZiAod3ggPiAwICYmIHd5ID4gMCAmJiBzcXVhcmVfY2hlY2soeCwgeSwgY3gtd3gsIGN5LXd5LCBjeCt3eCwgY3krd3kpKQorICAgICAgICAgcmV0dXJuIElOU0lERTsgLyogYmV0d2VlbiAoaW5zaWRlKSB0aGUgYm91bmRhcnkgbGluZXMuICovCisKKyAgICAgIHJldHVybiAwOyAvKiBpbnNpZGUgdGhlIGxpbmVzIHRoZW1zZWx2ZXMuICovCisgICB9CisKKyAgIHJldHVybiBPVVRTSURFOyAvKiBvdXRzaWRlIHRoZSBib3VuZGFyeSBsaW5lcy4gKi8KK30KKworc3RhdGljIGludAorY2hlY2tfc3F1YXJlX2ZpbGxlZChjb25zdCBzdHJ1Y3QgYXJnICphcmcsIGRvdWJsZSB4LCBkb3VibGUgeSkKK3sKKyAgIC8qIFRoZSBmaWx0ZXIgZXh0ZW5kcyArLy1GSUxURVJfV0lEVEggZWFjaCBzaWRlIG9mIGVhY2ggb3V0cHV0IHBvaW50LCBzbworICAgICogdGhlIGNoZWNrIGhhcyB0byBleHBhbmQgYW5kIGNvbnRyYWN0IHRoZSBzcXVhcmUgYnkgdGhhdCBhbW91bnQ7ICcwJworICAgICogbWVhbnMgY2xvc2UgZW5vdWdoIHRvIHRoZSBlZGdlIG9mIHRoZSBzcXVhcmUgdGhhdCB0aGUgYmljdWJpYyBmaWx0ZXIgaGFzCisgICAgKiB0byBiZSBydW4sIE9VVFNJREUgbWVhbnMgYWxwaGE9PTAsIElOU0lERSBtZWFucyBhbHBoYT09MS4KKyAgICAqLworICAgcmV0dXJuIHNxdWFyZV9jaGVja19saW5lKGFyZywgeCwgeSwgRklMVEVSX1dJRFRIKTsKK30KKworc3RhdGljIGludAoraW5zaWRlX3NxdWFyZShjb25zdCBzdHJ1Y3QgYXJnICphcmcsIGRvdWJsZSB4LCBkb3VibGUgeSkKK3sKKyAgIC8qIFJldHVybiB0cnVlIGlmIHdpdGhpbiB0aGUgZHJhd24gbGluZXMsIGVsc2UgZmFsc2UsIG5vIG5lZWQgdG8gZGlzdGluZ3Vpc2gKKyAgICAqIElOU0lERSB2cyBPVVRTSURFIGhlcmU6CisgICAgKi8KKyAgIHJldHVybiBzcXVhcmVfY2hlY2tfbGluZShhcmcsIHgsIHksIGFyZy0+d2lkdGgvMikgPT0gMDsKK30KKworc3RhdGljIGludAorY2hlY2tfc3F1YXJlKGNvbnN0IHN0cnVjdCBhcmcgKmFyZywgZG91YmxlIHgsIGRvdWJsZSB5KQoreworICAgLyogU28gZm9yIHRoaXMgZnVuY3Rpb24gYSByZXN1bHQgb2YgJ0lOU0lERScgbWVhbnMgaW5zaWRlIHRoZSBhY3R1YWwgbGluZXMuCisgICAgKi8KKyAgIGRvdWJsZSB3ID0gYXJnLT53aWR0aC8yOworCisgICBpZiAoc3F1YXJlX2NoZWNrX2xpbmUoYXJnLCB4LCB5LCB3K0ZJTFRFUl9XSURUSCkgPT0gMCkKKyAgIHsKKyAgICAgIC8qIFNvbWV3aGVyZSBjbG9zZSB0byB0aGUgYm91bmRhcnkgbGluZXMuIElmIGZhciBlbm91Z2ggaW5zaWRlIG9uZSBvZgorICAgICAgICogdGhlbSB0aGVuIHdlIGNhbiByZXR1cm4gSU5TSURFOgorICAgICAgICovCisgICAgICB3IC09IEZJTFRFUl9XSURUSDsKKworICAgICAgaWYgKHcgPiAwICYmIHNxdWFyZV9jaGVja19saW5lKGFyZywgeCwgeSwgdykgPT0gMCkKKyAgICAgICAgIHJldHVybiBJTlNJREU7CisKKyAgICAgIC8qIFBvaW50IGlzIHNvbWV3aGVyZSBpbiB0aGUgZmlsdGVyIHJlZ2lvbjogKi8KKyAgICAgIHJldHVybiAwOworICAgfQorCisgICBlbHNlIC8qIEluc2lkZSBvciBvdXRzaWRlIHRoZSBzcXVhcmUgYnkgbW9yZSB0aGFuIHcrRklMVEVSX1dJRFRILiAqLworICAgICAgcmV0dXJuIE9VVFNJREU7Cit9CisKKy8qICJjaXJjbGUiLAorICogeyBpbnNpZGVfY2lyY2xlX2ZpbGxlZCwgY2hlY2tfY2lyY2xlX2ZpbGxlZCB9LAorICogeyBpbnNpZGVfY2lyY2xlLCBjaGVja19jaXJjbGUgfQorICoKKyAqIFRoZSBmdW5jdGlvbnMgaGVyZSBhcmUgYW5hbG9ndW91cyB0byB0aGUgc3F1YXJlIG9uZXM7IGhvd2V2ZXIsIHRoZXkgY2hlY2sKKyAqIHRoZSBjb3JyZXNwb25kaW5nIGVsbGlwc2UgYXMgb3Bwb3NlZCB0byB0aGUgcmVjdGFuZ2xlLgorICovCitzdGF0aWMgaW50CitjaXJjbGVfY2hlY2soZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIpCit7CisgICBpZiAoc3F1YXJlX2NoZWNrKHgsIHksIHgxLCB5MSwgeDIsIHkyKSkKKyAgIHsKKyAgICAgIC8qIEluc2lkZSB0aGUgc3F1YXJlLCBzbyBtYXliZSBpbnNpZGUgdGhlIGNpcmNsZSB0b286ICovCisgICAgICBjb25zdCBkb3VibGUgY3ggPSAoeDEgKyB4MikvMjsKKyAgICAgIGNvbnN0IGRvdWJsZSBjeSA9ICh5MSArIHkyKS8yOworICAgICAgY29uc3QgZG91YmxlIGR4ID0geDEgLSB4MjsKKyAgICAgIGNvbnN0IGRvdWJsZSBkeSA9IHkxIC0geTI7CisKKyAgICAgIHggPSAoeCAtIGN4KS9keDsKKyAgICAgIHkgPSAoeSAtIGN5KS9keTsKKworICAgICAgLyogSXQgaXMgb3V0c2lkZSBpZiB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgY2VudGVyIGlzIG1vcmUgdGhhbiBoYWxmIHRoZQorICAgICAgICogZGlhbWV0ZXI6CisgICAgICAgKi8KKyAgICAgIHJldHVybiB4KngreSp5IDwgLjI1OworICAgfQorCisgICByZXR1cm4gMDsgLyogb3V0c2lkZSAqLworfQorCitzdGF0aWMgaW50CitpbnNpZGVfY2lyY2xlX2ZpbGxlZChjb25zdCBzdHJ1Y3QgYXJnICphcmcsIGRvdWJsZSB4LCBkb3VibGUgeSkKK3sKKyAgIHJldHVybiBjaXJjbGVfY2hlY2soeCwgeSwgYXJnLT54MSwgYXJnLT55MSwgYXJnLT54MiwgYXJnLT55Mik7Cit9CisKK3N0YXRpYyBpbnQKK2NpcmNsZV9jaGVja19saW5lKGNvbnN0IHN0cnVjdCBhcmcgKmFyZywgZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgdykKKyAgIC8qIENoZWNrIGZvciBhIHBvaW50IGJlaW5nIGluc2lkZSB0aGUgYm91bmRhcmllcyBpbXBsaWVkIGJ5IHRoZSBnaXZlbiBhcmcKKyAgICAqIGFuZCBhc3N1bWluZyBhIHdpZHRoIDIqdyBlYWNoIHNpZGUgb2YgdGhlIGJvdW5kYXJpZXMuICBUaGlzIGZ1bmN0aW9uIGhhcworICAgICogdGhlIHNhbWUgc2VtYW50aWMgYXMgc3F1YXJlX2NoZWNrX2xpbmUgYnV0IHRlc3RzIHRoZSBjaXJjbGUuCisgICAgKi8KK3sKKyAgIGRvdWJsZSBjeCA9IChhcmctPngxK2FyZy0+eDIpLzI7CisgICBkb3VibGUgd3ggPSBmYWJzKGFyZy0+eDEtYXJnLT54MikvMjsKKyAgIGRvdWJsZSBjeSA9IChhcmctPnkxK2FyZy0+eTIpLzI7CisgICBkb3VibGUgd3kgPSBmYWJzKGFyZy0+eTEtYXJnLT55MikvMjsKKworICAgaWYgKGNpcmNsZV9jaGVjayh4LCB5LCBjeC13eC13LCBjeS13eS13LCBjeCt3eCt3LCBjeSt3eSt3KSkKKyAgIHsKKyAgICAgIC8qIEluc2lkZSwgYnV0IG1heWJlIHRvbyBmYXI7IGNoZWNrIGZvciB0aGUgcmVkdW5kYW50IGNhc2Ugd2hlcmUKKyAgICAgICAqIHRoZSBsaW5lcyBvdmVybGFwOgorICAgICAgICovCisgICAgICB3eCAtPSB3OworICAgICAgd3kgLT0gdzsKKyAgICAgIGlmICh3eCA+IDAgJiYgd3kgPiAwICYmIGNpcmNsZV9jaGVjayh4LCB5LCBjeC13eCwgY3ktd3ksIGN4K3d4LCBjeSt3eSkpCisgICAgICAgICByZXR1cm4gSU5TSURFOyAvKiBiZXR3ZWVuIChpbnNpZGUpIHRoZSBib3VuZGFyeSBsaW5lcy4gKi8KKworICAgICAgcmV0dXJuIDA7IC8qIGluc2lkZSB0aGUgbGluZXMgdGhlbXNlbHZlcy4gKi8KKyAgIH0KKworICAgcmV0dXJuIE9VVFNJREU7IC8qIG91dHNpZGUgdGhlIGJvdW5kYXJ5IGxpbmVzLiAqLworfQorCitzdGF0aWMgaW50CitjaGVja19jaXJjbGVfZmlsbGVkKGNvbnN0IHN0cnVjdCBhcmcgKmFyZywgZG91YmxlIHgsIGRvdWJsZSB5KQoreworICAgcmV0dXJuIGNpcmNsZV9jaGVja19saW5lKGFyZywgeCwgeSwgRklMVEVSX1dJRFRIKTsKK30KKworc3RhdGljIGludAoraW5zaWRlX2NpcmNsZShjb25zdCBzdHJ1Y3QgYXJnICphcmcsIGRvdWJsZSB4LCBkb3VibGUgeSkKK3sKKyAgIHJldHVybiBjaXJjbGVfY2hlY2tfbGluZShhcmcsIHgsIHksIGFyZy0+d2lkdGgvMikgPT0gMDsKK30KKworc3RhdGljIGludAorY2hlY2tfY2lyY2xlKGNvbnN0IHN0cnVjdCBhcmcgKmFyZywgZG91YmxlIHgsIGRvdWJsZSB5KQoreworICAgLyogRXhhY3RseSBhcyB0aGUgJ3NxdWFyZScgY29kZS4gICovCisgICBkb3VibGUgdyA9IGFyZy0+d2lkdGgvMjsKKworICAgaWYgKGNpcmNsZV9jaGVja19saW5lKGFyZywgeCwgeSwgdytGSUxURVJfV0lEVEgpID09IDApCisgICB7CisgICAgICB3IC09IEZJTFRFUl9XSURUSDsKKworICAgICAgaWYgKHcgPiAwICYmIGNpcmNsZV9jaGVja19saW5lKGFyZywgeCwgeSwgdykgPT0gMCkKKyAgICAgICAgIHJldHVybiBJTlNJREU7CisKKyAgICAgIC8qIFBvaW50IGlzIHNvbWV3aGVyZSBpbiB0aGUgZmlsdGVyIHJlZ2lvbjogKi8KKyAgICAgIHJldHVybiAwOworICAgfQorCisgICBlbHNlIC8qIEluc2lkZSBvciBvdXRzaWRlIHRoZSBzcXVhcmUgYnkgbW9yZSB0aGFuIHcrRklMVEVSX1dJRFRILiAqLworICAgICAgcmV0dXJuIE9VVFNJREU7Cit9CisKKy8qICJsaW5lIiwKKyAqIHsgTlVMTCwgTlVMTCB9LCAgVGhlcmUgaXMgbm8gJ2ZpbGxlZCcgbGluZS4KKyAqIHsgaW5zaWRlX2xpbmUsIGNoZWNrX2xpbmUgfQorICovCitzdGF0aWMgaW50CitsaW5lX2NoZWNrKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSB4MiwgZG91YmxlIHkyLAorICAgZG91YmxlIHcsIGRvdWJsZSBleHBhbmQpCit7CisgICAvKiBTaGlmdCBhbGwgdGhlIHBvaW50cyB0byAoYXJnLT54MSwgYXJnLT55MSkgKi8KKyAgIGRvdWJsZSBseCA9IHgyIC0geDE7CisgICBkb3VibGUgbHkgPSB5MiAtIHkxOworICAgZG91YmxlIGxlbjIgPSBseCpseCArIGx5Kmx5OworICAgZG91YmxlIGNyb3NzLCBkb3Q7CisKKyAgIHggLT0geDE7CisgICB5IC09IHkxOworCisgICAvKiBUaGUgZG90IHByb2R1Y3QgaXMgdGhlIGRpc3RhbmNlIGRvd24gdGhlIGxpbmUsIHRoZSBjcm9zcyBwcm9kdWN0IGlzCisgICAgKiB0aGUgZGlzdGFuY2UgYXdheSBmcm9tIHRoZSBsaW5lOgorICAgICoKKyAgICAqICAgIGRpc3RhbmNlID0gfGNyb3NzfCAvIHNxcnQobGVuMikKKyAgICAqLworICAgY3Jvc3MgPSB4ICogbHkgLSB5ICogbHg7CisKKyAgIC8qIElmICdkaXN0YW5jZScgaXMgbW9yZSB0aGFuIHcgdGhlIHBvaW50IGlzIGRlZmluaXRlbHkgb3V0c2lkZSB0aGUgbGluZToKKyAgICAqCisgICAgKiAgICAgZGlzdGFuY2UgPj0gdworICAgICogICAgIHxjcm9zc3wgID49IHcgKiBzcXJ0KGxlbjIpCisgICAgKiAgICAgY3Jvc3NeMiAgPj0gd14yICogbGVuMjoKKyAgICAqLworICAgaWYgKGNyb3NzKmNyb3NzID49ICh3K2V4cGFuZCkqKHcrZXhwYW5kKSpsZW4yKQorICAgICAgcmV0dXJuIDA7IC8qIG91dHNpZGUgKi8KKworICAgLyogTm93IGZpbmQgdGhlIGRpc3RhbmNlICphbG9uZyogdGhlIGxpbmU7IHRoaXMgY29tZXMgZnJvbSB0aGUgZG90IHByb2R1Y3QKKyAgICAqIGx4LngrbHkueS4gVGhlIGFjdHVhbCBkaXN0YW5jZSAoaW4gcGl4ZWxzKSBpczoKKyAgICAqCisgICAgKiAgIGRpc3RhbmNlID0gZG90IC8gc3FydChsZW4yKQorICAgICovCisgICBkb3QgPSBseCAqIHggKyBseSAqIHk7CisKKyAgIC8qIFRoZSB0ZXN0IGZvciAnb3V0c2lkZScgaXM6CisgICAgKgorICAgICogICAgZGlzdGFuY2UgPCAwIHx8IGRpc3RhbmNlID4gc3FydChsZW4yKQorICAgICogICAgICAgICAgICAgICAgIC0+IGRvdCAvIHNxcnQobGVuMikgPiBzcXJ0KGxlbjIpCisgICAgKiAgICAgICAgICAgICAgICAgLT4gZG90ID4gbGVuMgorICAgICoKKyAgICAqIEJ1dCAnZXhwYW5kJyBpcyB1c2VkIGZvciB0aGUgZmlsdGVyIHdpZHRoIGFuZCBuZWVkcyB0byBiZSBoYW5kbGVkIHRvbzoKKyAgICAqLworICAgcmV0dXJuIGRvdCA+IC1leHBhbmQgJiYgZG90IDwgbGVuMitleHBhbmQ7Cit9CisKK3N0YXRpYyBpbnQKK2luc2lkZV9saW5lKGNvbnN0IHN0cnVjdCBhcmcgKmFyZywgZG91YmxlIHgsIGRvdWJsZSB5KQoreworICAgcmV0dXJuIGxpbmVfY2hlY2soeCwgeSwgYXJnLT54MSwgYXJnLT55MSwgYXJnLT54MiwgYXJnLT55MiwgYXJnLT53aWR0aC8yLCAwKTsKK30KKworc3RhdGljIGludAorY2hlY2tfbGluZShjb25zdCBzdHJ1Y3QgYXJnICphcmcsIGRvdWJsZSB4LCBkb3VibGUgeSkKK3sKKyAgIC8qIFRoZSBlbmQgY2FwcyBvZiB0aGUgbGluZSBtdXN0IGJlIGNoZWNrZWQgdG9vOyBpdCdzIG5vdCBlbm91Z2gganVzdCB0bworICAgICogd2lkZW4gdGhlIGxpbmUgYnkgRklMVEVSX1dJRFRIOyAnZXhwYW5kJyBleGlzdHMgZm9yIHRoaXMgcHVycG9zZToKKyAgICAqLworICAgaWYgKGxpbmVfY2hlY2soeCwgeSwgYXJnLT54MSwgYXJnLT55MSwgYXJnLT54MiwgYXJnLT55MiwgYXJnLT53aWR0aC8yLAorICAgICAgIEZJTFRFUl9XSURUSCkpCisgICB7CisgICAgICAvKiBJbnNpZGUgdGhlIGxpbmUrZmlsdGVyOyBmYXIgZW5vdWdoIGluc2lkZSB0aGF0IHRoZSBmaWx0ZXIgaXNuJ3QKKyAgICAgICAqIHJlcXVpcmVkPworICAgICAgICovCisgICAgICBpZiAoYXJnLT53aWR0aCA+IDIqRklMVEVSX1dJRFRIICYmCisgICAgICAgICAgbGluZV9jaGVjayh4LCB5LCBhcmctPngxLCBhcmctPnkxLCBhcmctPngyLCBhcmctPnkyLCBhcmctPndpZHRoLzIsCisgICAgICAgICAgICAgLUZJTFRFUl9XSURUSCkpCisgICAgICAgICByZXR1cm4gSU5TSURFOworCisgICAgICByZXR1cm4gMDsKKyAgIH0KKworICAgcmV0dXJuIE9VVFNJREU7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QKK3sKKyAgIGNvbnN0IGNoYXIgICAgKm5hbWU7CisgICBzaGFwZV9mbl9wdHIgICBmdW5jdGlvblsyLypmaWxsLGxpbmUqL11bMl07CisjICBkZWZpbmUgICAgICAgICBGTl9JTlNJREUgMAorIyAgZGVmaW5lICAgICAgICAgRk5fQ0hFQ0sgMQorfSBzaGFwZV9kZWZzW10gPQoreworICAgeyAgInNxdWFyZSIsCisgICAgICB7ICB7IGluc2lkZV9zcXVhcmVfZmlsbGVkLCBjaGVja19zcXVhcmVfZmlsbGVkIH0sCisgICAgICAgICB7IGluc2lkZV9zcXVhcmUsIGNoZWNrX3NxdWFyZSB9IH0KKyAgIH0sCisgICB7ICAiY2lyY2xlIiwKKyAgICAgIHsgIHsgaW5zaWRlX2NpcmNsZV9maWxsZWQsIGNoZWNrX2NpcmNsZV9maWxsZWQgfSwKKyAgICAgICAgIHsgaW5zaWRlX2NpcmNsZSwgY2hlY2tfY2lyY2xlIH0gfQorICAgfSwKKyAgIHsgICJsaW5lIiwKKyAgICAgIHsgIHsgTlVMTCwgTlVMTCB9LAorICAgICAgICAgeyBpbnNpZGVfbGluZSwgY2hlY2tfbGluZSB9IH0KKyAgIH0KK307CisKKyNkZWZpbmUgc2hhcGVfY291bnQgKChzaXplb2Ygc2hhcGVfZGVmcykvKHNpemVvZiBzaGFwZV9kZWZzWzBdKSkKKworc3RhdGljIHNoYXBlX2ZuX3B0cgorc2hhcGVfb2YoY29uc3QgY2hhciAqYXJnLCBkb3VibGUgd2lkdGgsIGludCBmKQoreworICAgdW5zaWduZWQgaW50IGk7CisKKyAgIGZvciAoaT0wOyBpPHNoYXBlX2NvdW50OyArK2kpIGlmIChzdHJjbXAoc2hhcGVfZGVmc1tpXS5uYW1lLCBhcmcpID09IDApCisgICB7CisgICAgICBzaGFwZV9mbl9wdHIgZm4gPSBzaGFwZV9kZWZzW2ldLmZ1bmN0aW9uW3dpZHRoICE9IDBdW2ZdOworCisgICAgICBpZiAoZm4gIT0gTlVMTCkKKyAgICAgICAgIHJldHVybiBmbjsKKworICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wbmc6ICVzICVzIG5vdCBzdXBwb3J0ZWRcbiIsCisgICAgICAgICB3aWR0aCA9PSAwID8gImZpbGxlZCIgOiAidW5maWxsZWQiLCBhcmcpOworICAgICAgZXhpdCgxKTsKKyAgIH0KKworICAgZnByaW50ZihzdGRlcnIsICJnZW5wbmc6ICVzOiBub3QgYSB2YWxpZCBzaGFwZSBuYW1lXG4iLCBhcmcpOworICAgZXhpdCgxKTsKK30KKworc3RhdGljIHZvaWQKK3BhcnNlX2FyZyhzdHJ1Y3QgYXJnICphcmcsIGNvbnN0IGNoYXIgKiphcmd2Lyo3IGFyZ3VtZW50cyovKQoreworICAgLyogc2hhcGUgOjo9IGNvbG9yIHdpZHRoIHNoYXBlIHgxIHkxIHgyIHkyICovCisgICBhcmctPmNvbG9yID0gY29sb3Jfb2YoYXJndlswXSk7CisgICBhcmctPndpZHRoID0gd2lkdGhfb2YoYXJndlsxXSk7CisgICBhcmctPmluc2lkZV9mbiA9IHNoYXBlX29mKGFyZ3ZbMl0sIGFyZy0+d2lkdGgsIEZOX0lOU0lERSk7CisgICBhcmctPmNoZWNrX2ZuID0gc2hhcGVfb2YoYXJndlsyXSwgYXJnLT53aWR0aCwgRk5fQ0hFQ0spOworICAgYXJnLT54MSA9IGNvb3JkaW5hdGVfb2YoYXJndlszXSk7CisgICBhcmctPnkxID0gY29vcmRpbmF0ZV9vZihhcmd2WzRdKTsKKyAgIGFyZy0+eDIgPSBjb29yZGluYXRlX29mKGFyZ3ZbNV0pOworICAgYXJnLT55MiA9IGNvb3JkaW5hdGVfb2YoYXJndls2XSk7Cit9CisKK3N0YXRpYyBwbmdfdWludF8zMgorcmVhZF93aChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpzdHIpCisgICAvKiByZWFkIGEgUE5HIHdpZHRoIG9yIGhlaWdodCAqLworeworICAgY2hhciAqZXAgPSBOVUxMOworICAgdW5zaWduZWQgbG9uZyB1bCA9IHN0cnRvdWwoc3RyLCAmZXAsIDEwKTsKKworICAgaWYgKGVwICE9IE5VTEwgJiYgKmVwID09IDAgJiYgdWwgPiAwICYmIHVsIDw9IDB4N2ZmZmZmZmYpCisgICAgICByZXR1cm4gKHBuZ191aW50XzMyKS8qU0FGRSovdWw7CisKKyAgIGZwcmludGYoc3RkZXJyLCAiZ2VucG5nOiAlczogaW52YWxpZCBudW1iZXIgJXNcbiIsIG5hbWUsIHN0cik7CisgICBleGl0KDEpOworfQorCitzdGF0aWMgdm9pZAorcGl4ZWwocG5nX3VpbnRfMTZwIHAsIHN0cnVjdCBhcmcgKmFyZ3MsIGludCBuYXJncywgZG91YmxlIHgsIGRvdWJsZSB5KQoreworICAgLyogRmlsbCBpbiB0aGUgcGl4ZWwgYnkgY2hlY2tpbmcgZWFjaCBzaGFwZSAoYXJnc1tuYXJnc10pIGZvciBlZmZlY3RzIG9uCisgICAgKiB0aGUgY29ycmVzcG9uZGluZyBzYW1wbGU6CisgICAgKi8KKyAgIGRvdWJsZSByPTAsIGc9MCwgYj0wLCBhPTA7CisKKyAgIHdoaWxlICgtLW5hcmdzID49IDAgJiYgYSAhPSAxKQorICAgeworICAgICAgLyogTk9URTogYWxwaGFfY2FsYyBjYW4gcmV0dXJuIGEgdmFsdWUgb3V0c2lkZSB0aGUgcmFuZ2UgMC4uMSB3aXRoIHRoZQorICAgICAgICogYmljdWJpYyBmaWx0ZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0IGRvdWJsZSBhbHBoYSA9IGFscGhhX2NhbGMoYXJncytuYXJncywgeCwgeSkgKiAoMS1hKTsKKworICAgICAgciArPSBhbHBoYSAqIGFyZ3NbbmFyZ3NdLmNvbG9yLT5yZWQ7CisgICAgICBnICs9IGFscGhhICogYXJnc1tuYXJnc10uY29sb3ItPmdyZWVuOworICAgICAgYiArPSBhbHBoYSAqIGFyZ3NbbmFyZ3NdLmNvbG9yLT5ibHVlOworICAgICAgYSArPSBhbHBoYTsKKyAgIH0KKworICAgLyogJ2EnIG1heSBiZSBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4gMTsgaWYgaXQgaXMsIG5lZ2F0aXZlIGNsYW1wIHRoZQorICAgICogcGl4ZWwgdG8gMCBpZiA+MSBjbGFtcCByL2cvYjoKKyAgICAqLworICAgaWYgKGEgPiAwKQorICAgeworICAgICAgaWYgKGEgPiAxKQorICAgICAgeworICAgICAgICAgaWYgKHIgPiAxKSByID0gMTsKKyAgICAgICAgIGlmIChnID4gMSkgZyA9IDE7CisgICAgICAgICBpZiAoYiA+IDEpIGIgPSAxOworICAgICAgICAgYSA9IDE7CisgICAgICB9CisKKyAgICAgIC8qIEFuZCBmaWxsIGluIHRoZSBwaXhlbDogKi8KKyAgICAgIHBbMF0gPSAocG5nX3VpbnRfMTYpLypTQUZFKi9yb3VuZChyICogNjU1MzUpOworICAgICAgcFsxXSA9IChwbmdfdWludF8xNikvKlNBRkUqL3JvdW5kKGcgKiA2NTUzNSk7CisgICAgICBwWzJdID0gKHBuZ191aW50XzE2KS8qU0FGRSovcm91bmQoYiAqIDY1NTM1KTsKKyAgICAgIHBbM10gPSAocG5nX3VpbnRfMTYpLypTQUZFKi9yb3VuZChhICogNjU1MzUpOworICAgfQorCisgICBlbHNlCisgICAgICBwWzNdID0gcFsyXSA9IHBbMV0gPSBwWzBdID0gMDsKK30KKworaW50CittYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKyAgIGludCBjb252ZXJ0X3RvXzhiaXQgPSAwOworCisgICAvKiBUaGVyZSBpcyBvbmUgb3B0aW9uOiAtLThiaXQ6ICovCisgICBpZiAoYXJnYyA+IDEgJiYgc3RyY21wKGFyZ3ZbMV0sICItLThiaXQiKSA9PSAwKQorICAgICAgLS1hcmdjLCArK2FyZ3YsIGNvbnZlcnRfdG9fOGJpdCA9IDE7CisKKyAgIGlmIChhcmdjID49IDMpCisgICB7CisgICAgICBwbmdfdWludF8xNnAgYnVmZmVyOworICAgICAgaW50IG5zaGFwZXM7CisgICAgICBwbmdfaW1hZ2UgaW1hZ2U7CisjICAgICBkZWZpbmUgbWF4X3NoYXBlcyAyNTYKKyAgICAgIHN0cnVjdCBhcmcgYXJnX2xpc3RbbWF4X3NoYXBlc107CisKKyAgICAgIC8qIFRoZSBsaWJwbmcgU2ltcGxpZmllZCBBUEkgd3JpdGUgY29kZSByZXF1aXJlcyBhIGZ1bGx5IGluaXRpYWxpemVkCisgICAgICAgKiBzdHJ1Y3R1cmUuCisgICAgICAgKi8KKyAgICAgIG1lbXNldCgmaW1hZ2UsIDAsIHNpemVvZiBpbWFnZSk7CisgICAgICBpbWFnZS52ZXJzaW9uID0gUE5HX0lNQUdFX1ZFUlNJT047CisgICAgICBpbWFnZS5vcGFxdWUgPSBOVUxMOworICAgICAgaW1hZ2Uud2lkdGggPSByZWFkX3doKCJ3aWR0aCIsIGFyZ3ZbMV0pOworICAgICAgaW1hZ2UuaGVpZ2h0ID0gcmVhZF93aCgiaGVpZ2h0IiwgYXJndlsyXSk7CisgICAgICBpbWFnZS5mb3JtYXQgPSBQTkdfRk9STUFUX0xJTkVBUl9SR0JfQUxQSEE7CisgICAgICBpbWFnZS5mbGFncyA9IDA7CisgICAgICBpbWFnZS5jb2xvcm1hcF9lbnRyaWVzID0gMDsKKworICAgICAgLyogQ2hlY2sgdGhlIHJlbWFpbmRlciBvZiB0aGUgYXJndW1lbnRzICovCisgICAgICBmb3IgKG5zaGFwZXM9MDsgMys3Kihuc2hhcGVzKzEpIDw9IGFyZ2MgJiYgbnNoYXBlcyA8IG1heF9zaGFwZXM7CisgICAgICAgICAgICsrbnNoYXBlcykKKyAgICAgICAgIHBhcnNlX2FyZyhhcmdfbGlzdCtuc2hhcGVzLCBhcmd2KzMrNypuc2hhcGVzKTsKKworICAgICAgaWYgKDMrNypuc2hhcGVzICE9IGFyZ2MpCisgICAgICB7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnBuZzogJXM6IHRvbyBtYW55IGFyZ3VtZW50c1xuIiwgYXJndlszKzcqbnNoYXBlc10pOworICAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisKKyAgICAgIC8qIENyZWF0ZSB0aGUgYnVmZmVyOiAqLworICAgICAgYnVmZmVyID0gbWFsbG9jKFBOR19JTUFHRV9TSVpFKGltYWdlKSk7CisKKyAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ191aW50XzMyIHk7CisKKyAgICAgICAgIC8qIFdyaXRlIGVhY2ggcm93Li4uICovCisgICAgICAgICBmb3IgKHk9MDsgeTxpbWFnZS5oZWlnaHQ7ICsreSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIHg7CisKKyAgICAgICAgICAgIC8qIEVhY2ggcGl4ZWwgaW4gZWFjaCByb3c6ICovCisgICAgICAgICAgICBmb3IgKHg9MDsgeDxpbWFnZS53aWR0aDsgKyt4KQorICAgICAgICAgICAgICAgcGl4ZWwoYnVmZmVyICsgNCooeCArIHkqaW1hZ2Uud2lkdGgpLCBhcmdfbGlzdCwgbnNoYXBlcywgeCwgeSk7CisgICAgICAgICB9CisKKyAgICAgICAgIC8qIFdyaXRlIHRoZSByZXN1bHQgKHRvIHN0ZG91dCkgKi8KKyAgICAgICAgIGlmIChwbmdfaW1hZ2Vfd3JpdGVfdG9fc3RkaW8oJmltYWdlLCBzdGRvdXQsIGNvbnZlcnRfdG9fOGJpdCwKKyAgICAgICAgICAgICBidWZmZXIsIDAvKnJvd19zdHJpZGUqLywgTlVMTC8qY29sb3JtYXAqLykpCisgICAgICAgICB7CisgICAgICAgICAgICBmcmVlKGJ1ZmZlcik7CisgICAgICAgICAgICByZXR1cm4gMDsgLyogc3VjY2VzcyAqLworICAgICAgICAgfQorCisgICAgICAgICBlbHNlCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnBuZzogd3JpdGUgc3Rkb3V0OiAlc1xuIiwgaW1hZ2UubWVzc2FnZSk7CisKKyAgICAgICAgIGZyZWUoYnVmZmVyKTsKKyAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wbmc6IG91dCBvZiBtZW1vcnk6ICVsdSBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKVBOR19JTUFHRV9TSVpFKGltYWdlKSk7CisgICB9CisKKyAgIGVsc2UKKyAgIHsKKyAgICAgIC8qIFdyb25nIG51bWJlciBvZiBhcmd1bWVudHMgKi8KKyAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucG5nOiB1c2FnZTogZ2VucG5nIFstLThiaXRdIHdpZHRoIGhlaWdodCB7c2hhcGV9XG4iCisgICAgICAgICAiIEdlbmVyYXRlIGEgdHJhbnNwYXJlbnQgUE5HIGluIFJHQkEgKHRydWVjb2xvcithbHBoYSkgZm9ybWF0XG4iCisgICAgICAgICAiIGNvbnRhaW5pbmcgdGhlIGdpdmVuIHNoYXBlIG9yIHNoYXBlcy4gIFNoYXBlcyBhcmUgZGVmaW5lZDpcbiIKKyAgICAgICAgICJcbiIKKyAgICAgICAgICIgIHNoYXBlIDo6PSBjb2xvciB3aWR0aCBzaGFwZSB4MSB5MSB4MiB5MlxuIgorICAgICAgICAgIiAgY29sb3IgOjo9IGJsYWNrfHdoaXRlfHJlZHxncmVlbnx5ZWxsb3d8Ymx1ZVxuIgorICAgICAgICAgIiAgY29sb3IgOjo9IGJyb3dufHB1cnBsZXxwaW5rfG9yYW5nZXxncmF5fGN5YW5cbiIKKyAgICAgICAgICIgIHdpZHRoIDo6PSBmaWxsZWR8PG51bWJlcj5cbiIKKyAgICAgICAgICIgIHNoYXBlIDo6PSBjaXJjbGV8c3F1YXJlfGxpbmVcbiIKKyAgICAgICAgICIgIHgxLHgyIDo6PSA8bnVtYmVyPlxuIgorICAgICAgICAgIiAgeTEseTIgOjo9IDxudW1iZXI+XG4iCisgICAgICAgICAiXG4iCisgICAgICAgICAiIE51bWJlcnMgYXJlIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgZGVzY3JpYmluZyBwb2ludHMgcmVsYXRpdmUgdG9cbiIKKyAgICAgICAgICIgdGhlIHRvcCBsZWZ0IG9mIHRoZSBvdXRwdXQgUE5HIGFzIHBpeGVsIGNvb3JkaW5hdGVzLiAgVGhlICd3aWR0aCdcbiIKKyAgICAgICAgICIgcGFyYW1ldGVyIGlzIGVpdGhlciB0aGUgd2lkdGggb2YgdGhlIGxpbmUgKGluIG91dHB1dCBwaXhlbHMpIHVzZWRcbiIKKyAgICAgICAgICIgdG8gZHJhdyB0aGUgc2hhcGUgb3IgJ2ZpbGxlZCcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgc2hhcGUgc2hvdWxkXG4iCisgICAgICAgICAiIGJlIGZpbGxlZCB3aXRoIHRoZSBjb2xvci5cbiIKKyAgICAgICAgICJcbiIKKyAgICAgICAgICIgQ29sb3JzIGFyZSBpbnRlcnByZXRlZCBsb29zZWx5IHRvIGdpdmUgYWNjZXNzIHRvIHRoZSBlaWdodCBmdWxsXG4iCisgICAgICAgICAiIGludGVuc2l0eSBSR0IgdmFsdWVzOlxuIgorICAgICAgICAgIlxuIgorICAgICAgICAgIiAgYmxhY2ssIHJlZCwgZ3JlZW4sIGJsdWUsIHllbGxvdywgY3lhbiwgcHVycGxlLCB3aGl0ZSxcbiIKKyAgICAgICAgICJcbiIKKyAgICAgICAgICIgQ3lhbiBpcyBmdWxsIGludGVuc2l0eSBibHVlK2dyZWVuOyBSR0IoMCwxLDEpLCBwbHVzIHRoZSBmb2xsb3dpbmdcbiIKKyAgICAgICAgICIgbG93ZXIgaW50ZW5zaXR5IHZhbHVlczpcbiIKKyAgICAgICAgICJcbiIKKyAgICAgICAgICIgIGJyb3duOiAgcmVkK29yYW5nZTogIFJHQigwLjUsIDAuMTI1LCAwKSAoZGFyayByZWQrb3JhbmdlKVxuIgorICAgICAgICAgIiAgcGluazogICByZWQrd2hpdGU6ICAgUkdCKDEuMCwgMC41LCAgIDAuNSlcbiIKKyAgICAgICAgICIgIG9yYW5nZTogcmVkK3llbGxvdzogIFJHQigxLjAsIDAuNSwgICAwKVxuIgorICAgICAgICAgIiAgZ3JheTogICBibGFjayt3aGl0ZTogUkdCKDAuNSwgMC41LCAgIDAuNSlcbiIKKyAgICAgICAgICJcbiIKKyAgICAgICAgICIgVGhlIFJHQiB2YWx1ZXMgYXJlIHNlbGVjdGVkIHRvIG1ha2UgZGV0ZWN0aW9uIG9mIGFsaWFzaW5nIGVycm9yc1xuIgorICAgICAgICAgIiBlYXN5LiBUaGUgbmFtZXMgYXJlIHNlbGVjdGVkIHRvIG1ha2UgdGhlIGRlc2NyaXB0aW9uIG9mIGVycm9yc1xuIgorICAgICAgICAgIiBlYXN5LlxuIgorICAgICAgICAgIlxuIgorICAgICAgICAgIiBUaGUgUE5HIGlzIHdyaXR0ZW4gdG8gc3Rkb3V0LCBpZiAtLThiaXQgaXMgZ2l2ZW4gYSAzMmJwcCBSR0JBIHNSR0JcbiIKKyAgICAgICAgICIgZmlsZSBpcyBwcm9kdWNlZCwgb3RoZXJ3aXNlIGEgNjRicHAgUkdCQSBsaW5lYXIgZW5jb2RlZCBmaWxlIGlzXG4iCisgICAgICAgICAiIHdyaXR0ZW4uXG4iKTsKKyAgIH0KKworICAgcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogU0lNUExJRklFRF9XUklURSAmJiBTVERJTyAqLwpkaWZmIC0tZ2l0IGEvbGlicG5nL2NvbnRyaWIvdG9vbHMvaW50Z2FtbWEuc2ggYi9saWJwbmcvY29udHJpYi90b29scy9pbnRnYW1tYS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MWM1ZDZkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvdG9vbHMvaW50Z2FtbWEuc2gKQEAgLTAsMCArMSwxMTAgQEAKKyMhL2Jpbi9zaAorIworIyBpbnRnYW1tYS5zaAorIworIyBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4wIFtGZWJydWFyeSAxNCwgMjAxM10KKyMKKyMgQ09QWVJJR0hUOiBXcml0dGVuIGJ5IEpvaG4gQ3VubmluZ2hhbSBCb3dsZXIsIDIwMTMuCisjIFRvIHRoZSBleHRlbnQgcG9zc2libGUgdW5kZXIgbGF3LCB0aGUgYXV0aG9yIGhhcyB3YWl2ZWQgYWxsIGNvcHlyaWdodCBhbmQKKyMgcmVsYXRlZCBvciBuZWlnaGJvcmluZyByaWdodHMgdG8gdGhpcyB3b3JrLiAgVGhpcyB3b3JrIGlzIHB1Ymxpc2hlZCBmcm9tOgorIyBVbml0ZWQgU3RhdGVzLgorIworIyBTaGVsbCBzY3JpcHQgdG8gZ2VuZXJhdGUgcG5nLmMgOC1iaXQgYW5kIDE2LWJpdCBsb2cgdGFibGVzIChzZWUgdGhlIGNvZGUgaW4KKyMgcG5nLmMgZm9yIGRldGFpbHMpLgorIworIyBUaGlzIHNjcmlwdCB1c2VzIHRoZSAiYmMiIGFyYml0cmFyeSBwcmVjaXNpb24gY2FsY3VsYXRvciB0byBjYWxjdWxhdGUgMzItYml0CisjIGZpeGVkIHBvaW50IHZhbHVlcyBvZiBsb2dhcml0aG1zIGFwcHJvcHJpYXRlIHRvIGZpbmRpbmcgdGhlIGxvZyBvZiBhbiA4LWJpdAorIyAoMC4uMjU1KSB2YWx1ZSBhbmQgYSBzaW1pbGFyIHRhYmxlIGZvciB0aGUgZXhwb25lbnQgY2FsY3VsYXRpb24uCisjCisjICJiYyIgbXVzdCBiZSBvbiB0aGUgcGF0aCB3aGVuIHRoZSBzY3JpcHQgaXMgZXhlY3V0ZWQsIGFuZCB0aGUgbWF0aCBsaWJyYXJ5CisjICgtbG0pIG11c3QgYmUgYXZhaWxhYmxlCisjCisjIGZ1bmN0aW9uIHRvIHByaW50IG91dCBhIGxpc3Qgb2YgbnVtYmVycyBhcyBpbnRlZ2VyczsgdGhlIGZ1bmN0aW9uIHRydW5jYXRlcworIyB0aGUgaW50ZWdlcnMgd2hpY2ggbXVzdCBiZSBvbmUtcGVyLWxpbmUKK2Z1bmN0aW9uIHByaW50KCl7CisgICBhd2sgJ0JFR0lOeworICAgICAgc3RyID0gIiIKKyAgIH0KKyAgIHsKKyAgICAgIHN1YigiXFwuWzAtOV0qJCIsICIiKQorICAgICAgaWYgKCQwID09ICIiKQorICAgICAgICAgJDAgPSAiMCIKKworICAgICAgaWYgKHN0ciA9PSAiIikKKyAgICAgICAgIHQgPSAiICAgIiAkMCAiVSIKKyAgICAgIGVsc2UKKyAgICAgICAgIHQgPSBzdHIgIiwgIiAkMCAiVSIKKworICAgICAgaWYgKGxlbmd0aCh0KSA+PSA4MCkgeworICAgICAgICAgcHJpbnQgc3RyICIsIgorICAgICAgICAgc3RyID0gIiAgICIgJDAgIlUiCisgICAgICB9IGVsc2UKKyAgICAgICAgIHN0ciA9IHQKKyAgIH0KKyAgIEVORHsKKyAgICAgIHByaW50IHN0cgorICAgfScKK30KKyMKKyMgVGhlIGxvZ2FyaXRobSB0YWJsZS4KK2NhdCA8PEVORAorLyogOC1iaXQgbG9nIHRhYmxlOiBwbmdfOGJpdF9sMlsxMjhdCisgKiBUaGlzIGlzIGEgdGFibGUgb2YgLWxvZyh2YWx1ZS8yNTUpL2xvZygyKSBmb3IgJ3ZhbHVlJyBpbiB0aGUgcmFuZ2UgMTI4IHRvCisgKiAyNTUsIHNvIGl0J3MgdGhlIGJhc2UgMiBsb2dhcml0aG0gb2YgYSBub3JtYWxpemVkIDgtYml0IGZsb2F0aW5nIHBvaW50CisgKiBtYW50aXNzYS4gIFRoZSBudW1iZXJzIGFyZSAzMi1iaXQgZnJhY3Rpb25zLgorICovCitzdGF0aWMgY29uc3QgcG5nX3VpbnRfMzIKK3BuZ184Yml0X2wyWzEyOF0gPQoreworRU5ECisjCitiYyAtbHF3cyA8PEVORCB8IHByaW50CitmPTY1NTM2KjY1NTM2L2woMikKK2ZvciAoaT0xMjg7aTwyNTY7KytpKSB7IC41IC0gbChpLzI1NSkqZjsgfQorRU5ECitlY2hvICd9OycKK2VjaG8KKyMKKyMgVGhlIGV4cG9uZW50IHRhYmxlLgorY2F0IDw8RU5ECisvKiBUaGUgJ2V4cCgpJyBjYXNlIG11c3QgaW52ZXJ0IHRoZSBhYm92ZSwgdGFraW5nIGEgMjAtYml0IGZpeGVkIHBvaW50CisgKiBsb2dhcml0aG1pYyB2YWx1ZSBhbmQgcmV0dXJuaW5nIGEgMTYgb3IgOC1iaXQgbnVtYmVyIGFzIGFwcHJvcHJpYXRlLiAgSW4KKyAqIGVhY2ggY2FzZSBvbmx5IHRoZSBsb3cgMTYgYml0cyBhcmUgcmVsZXZhbnQgLSB0aGUgZnJhY3Rpb24gLSBzaW5jZSB0aGUKKyAqIGludGVnZXIgYml0cyAodGhlIHRvcCA0KSBzaW1wbHkgZGV0ZXJtaW5lIGEgc2hpZnQuCisgKgorICogVGhlIHdvcnN0IGNhc2UgaXMgdGhlIDE2LWJpdCBkaXN0aW5jdGlvbiBiZXR3ZWVuIDY1NTM1IGFuZCA2NTUzNDsgdGhpcworICogcmVxdWlyZXMgcGVyaGFwcyBzcHVyaW91cyBhY2N1cmFjeSBpbiB0aGUgZGVjb2Rpbmcgb2YgdGhlIGxvZ2FyaXRobSB0bworICogZGlzdGluZ3Vpc2ggbG9nMig2NTUzNS82NTUzNC41KSAtIDEwXi01IG9yIDE3IGJpdHMuICBUaGVyZSBpcyBsaXR0bGUgY2hhbmNlCisgKiBvZiBnZXR0aW5nIHRoaXMgYWNjdXJhY3kgaW4gcHJhY3RpY2UuCisgKgorICogVG8gZGVhbCB3aXRoIHRoaXMgdGhlIGZvbGxvd2luZyBleHAoKSBmdW5jdGlvbiB3b3JrcyBvdXQgdGhlIGV4cG9uZW50IG9mIHRoZQorICogZnJhdGlvbmFsIHBhcnQgb2YgdGhlIGxvZ2FyaXRobSBieSB1c2luZyBhbiBhY2N1cmF0ZSAzMi1iaXQgdmFsdWUgZnJvbSB0aGUKKyAqIHRvcCBmb3VyIGZyYWN0aW9uYWwgYml0cyB0aGVuIG11bHRpcGx5aW5nIGluIHRoZSByZW1haW5pbmcgYml0cy4KKyAqLworc3RhdGljIGNvbnN0IHBuZ191aW50XzMyCitwbmdfMzJiaXRfZXhwWzE2XSA9Cit7CitFTkQKKyMKK2JjIC1scXdzIDw8RU5EIHwgcHJpbnQKK2Y9bCgyKS8xNgorZm9yIChpPTA7aTwxNjsrK2kpIHsKKyAgIHggPSAuNSArIGUoLWkqZikqMl4zMjsKKyAgIGlmICh4ID49IDJeMzIpIHggPSAyXjMyLTE7CisgICB4OworfQorRU5ECitlY2hvICd9OycKK2VjaG8KKyMKKyMgQW5kIHRoZSB0YWJsZSBvZiBhZGp1c3RtZW50IHZhbHVlcy4KK2NhdCA8PEVORAorLyogQWRqdXN0bWVudCB0YWJsZTsgcHJvdmlkZWQgdG8gZXhwbGFpbiB0aGUgbnVtYmVycyBpbiB0aGUgY29kZSBiZWxvdy4gKi8KKyNpZiAwCitFTkQKK2JjIC1scXdzIDw8RU5EIHwgYXdrICd7IHByaW50ZiAiJTVkICVzXG4iLCAxMi1OUiwgJDAgfScKK2ZvciAoaT0xMTtpPj0wOy0taSl7CisgICAoMSAtIGUoLSgyXmkpLzY1NTM2KmwoMikpKSAqIDJeKDMyLWkpCit9CitFTkQKK2VjaG8gJyNlbmRpZicKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3Rvb2xzL21ha2VzUkdCLmMgYi9saWJwbmcvY29udHJpYi90b29scy9tYWtlc1JHQi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NmM5ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi90b29scy9tYWtlc1JHQi5jCkBAIC0wLDAgKzEsNDMwIEBACisvKiBtYWtlc1JHQi5jIC0tIGJ1aWxkIHNSR0ItdG8tbGluZWFyIGFuZCBsaW5lYXItdG8tc1JHQiBjb252ZXJzaW9uIHRhYmxlcworICoKKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS42LjAgW0ZlYnJ1YXJ5IDE0LCAyMDEzXQorICoKKyAqIENPUFlSSUdIVDogV3JpdHRlbiBieSBKb2huIEN1bm5pbmdoYW0gQm93bGVyLCAyMDEzLgorICogVG8gdGhlIGV4dGVudCBwb3NzaWJsZSB1bmRlciBsYXcsIHRoZSBhdXRob3IgaGFzIHdhaXZlZCBhbGwgY29weXJpZ2h0IGFuZAorICogcmVsYXRlZCBvciBuZWlnaGJvcmluZyByaWdodHMgdG8gdGhpcyB3b3JrLiAgVGhpcyB3b3JrIGlzIHB1Ymxpc2hlZCBmcm9tOgorICogVW5pdGVkIFN0YXRlcy4KKyAqCisgKiBNYWtlIGEgdGFibGUgdG8gY29udmVydCA4LWJpdCBzUkdCIGVuY29kaW5nIHZhbHVlcyBpbnRvIHRoZSBjbG9zZXN0IDE2LWJpdAorICogbGluZWFyIHZhbHVlLgorICoKKyAqIE1ha2UgdHdvIHRhYmxlcyB0byB0YWtlIGEgbGluZWFyIHZhbHVlIHNjYWxlZCB0byAyNTUqNjU1MzUgYW5kIHJldHVybiBhbgorICogYXBwcm94aW1hdGlvbiB0byB0aGUgOC1iaXQgc1JHQiBlbmNvZGVkIHZhbHVlLiAgQ2FsY3VsYXRlIHRoZSBlcnJvciBpbiB0aGVzZQorICogdGFibGVzIGFuZCBkaXNwbGF5IGl0LgorICovCisjZGVmaW5lIF9DOTlfU09VUkNFIDEKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyogcG5ncHJpdi5oIGluY2x1ZGVzIHRoZSBkZWZpbml0aW9uIG9mICdQTkdfc1JHQl9GUk9NX0xJTkVBUicgd2hpY2ggaXMgcmVxdWlyZWQKKyAqIHRvIHZlcmlmeSB0aGUgYWN0dWFsIGNvZGUuCisgKi8KKyNpbmNsdWRlICIuLi8uLi9wbmdwcml2LmgiCisKKyNpbmNsdWRlICJzUkdCLmgiCisKKy8qIFRoZSB0YWJsZXMgYXJlIGRlY2xhcmVkICdjb25zdCcgaW4gcG5ncHJpdi5oLCBzbyB0aGlzIHJlZGVmaW5lcyB0aGUgdGFibGVzIHRvCisgKiBiZSB1c2VkLgorICovCisjZGVmaW5lIHBuZ19zUkdCX3RhYmxlIHNSR0JfdGFibGUKKyNkZWZpbmUgcG5nX3NSR0JfYmFzZSBzUkdCX2Jhc2UKKyNkZWZpbmUgcG5nX3NSR0JfZGVsdGEgc1JHQl9kZWx0YQorCitzdGF0aWMgcG5nX3VpbnRfMTYgcG5nX3NSR0JfdGFibGVbMjU2XTsKK3N0YXRpYyBwbmdfdWludF8xNiBwbmdfc1JHQl9iYXNlWzUxMl07CitzdGF0aWMgcG5nX2J5dGUgcG5nX3NSR0JfZGVsdGFbNTEyXTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtYXhfaW5wdXQgPSAyNTUqNjU1MzU7CisKK2RvdWJsZQorZnNSR0IoZG91YmxlIGwpCit7CisgICByZXR1cm4gc1JHQl9mcm9tX2xpbmVhcihsL21heF9pbnB1dCk7Cit9CisKK2RvdWJsZQorc1JHQih1bnNpZ25lZCBpbnQgaSkKK3sKKyAgIHJldHVybiBmc1JHQihpKTsKK30KKworZG91YmxlCitmaW52c1JHQih1bnNpZ25lZCBpbnQgaSkKK3sKKyAgIHJldHVybiA2NTUzNSAqIGxpbmVhcl9mcm9tX3NSR0IoaS8yNTUuKTsKK30KKworcG5nX3VpbnRfMTYKK2ludnNSR0IodW5zaWduZWQgaW50IGkpCit7CisgICB1bnNpZ25lZCBpbnQgeCA9IG5lYXJieWludChmaW52c1JHQihpKSk7CisKKyAgIGlmICh4ID4gNjU1MzUpCisgICB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgImludnNSR0IoJXUpIG92ZXJmbG93cyB0byAldVxuIiwgaSwgeCk7CisgICAgICBleGl0KDEpOworICAgfQorCisgICByZXR1cm4gKHBuZ191aW50XzE2KXg7Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICB1bnNpZ25lZCBpbnQgaSwgaTE2LCBpYmFzZTsKKyAgIGRvdWJsZSBtaW5fZXJyb3IgPSAwOworICAgZG91YmxlIG1heF9lcnJvciA9IDA7CisgICBkb3VibGUgbWluX2Vycm9yMTYgPSAwOworICAgZG91YmxlIG1heF9lcnJvcjE2ID0gMDsKKyAgIGRvdWJsZSBhZGp1c3Q7CisgICBkb3VibGUgYWRqdXN0X2xvID0gMC40LCBhZGp1c3RfaGkgPSAwLjYsIGFkanVzdF9taWQgPSAwLjU7CisgICB1bnNpZ25lZCBpbnQgZWNfbG8gPSAwLCBlY19oaSA9IDAsIGVjX21pZCA9IDA7CisgICB1bnNpZ25lZCBpbnQgZXJyb3JfY291bnQgPSAwOworICAgdW5zaWduZWQgaW50IGVycm9yX2NvdW50MTYgPSAwOworICAgaW50IHRlc3Rfb25seSA9IDA7CisKKyAgIGlmIChhcmdjID4gMSkKKyAgICAgIHRlc3Rfb25seSA9IHN0cmNtcCgiLS10ZXN0IiwgYXJndlsxXSkgPT0gMDsKKworICAgLyogSW5pdGlhbGl6ZSB0aGUgZW5jb2RpbmcgdGFibGUgZmlyc3QuICovCisgICBmb3IgKGk9MDsgaTwyNTY7ICsraSkKKyAgIHsKKyAgICAgIHBuZ19zUkdCX3RhYmxlW2ldID0gaW52c1JHQihpKTsKKyAgIH0KKworICAgLyogTm93IHdvcmsgb3V0IHRoZSBkZWNvZGluZyB0YWJsZXMgKHRoaXMgaXMgd2hlcmUgdGhlIGVycm9yIGNvbWVzIGluIGJlY2F1c2UKKyAgICAqIHRoZXJlIGFyZSA1MTIgc2V0IHBvaW50cyBhbmQgNTEyIHN0cmFpZ2h0IGxpbmVzIGJldHdlZW4gdGhlbS4pCisgICAgKi8KKyAgIGZvciAoOzspCisgICB7CisgICAgICBpZiAoZWNfbG8gPT0gMCkKKyAgICAgICAgIGFkanVzdCA9IGFkanVzdF9sbzsKKworICAgICAgZWxzZSBpZiAoZWNfaGkgPT0gMCkKKyAgICAgICAgIGFkanVzdCA9IGFkanVzdF9oaTsKKworICAgICAgZWxzZSBpZiAoZWNfbWlkID09IDApCisgICAgICAgICBhZGp1c3QgPSBhZGp1c3RfbWlkOworCisgICAgICBlbHNlIGlmIChlY19taWQgPCBlY19oaSkKKyAgICAgICAgIGFkanVzdCA9IChhZGp1c3RfbWlkICsgYWRqdXN0X2hpKS8yOworCisgICAgICBlbHNlIGlmIChlY19taWQgPCBlY19sbykKKyAgICAgICAgIGFkanVzdCA9IChhZGp1c3RfbWlkICsgYWRqdXN0X2xvKS8yOworCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm5vdCByZWFjaGVkOiAldSAuLiAldSAuLiAldVxuIiwgZWNfbG8sIGVjX21pZCwgZWNfaGkpOworICAgICAgICAgZXhpdCgxKTsKKyAgICAgIH0KKworICAgICAgLyogQ2FsY3VsYXRlIHRoZSB0YWJsZSB1c2luZyB0aGUgY3VycmVudCAnYWRqdXN0JyAqLworICAgICAgZm9yIChpPTA7IGk8PTUxMTsgKytpKQorICAgICAgeworICAgICAgICAgZG91YmxlIGxvID0gMjU1ICogc1JHQihpIDw8IDE1KTsKKyAgICAgICAgIGRvdWJsZSBoaSA9IDI1NSAqIHNSR0IoKGkrMSkgPDwgMTUpOworICAgICAgICAgdW5zaWduZWQgaW50IGNhbGM7CisKKyAgICAgICAgIGNhbGMgPSBuZWFyYnlpbnQoKGxvK2FkanVzdCkgKiAyNTYpOworICAgICAgICAgaWYgKGNhbGMgPiA2NTUzNSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidGFibGVbJWRdWzBdOiBvdmVyZmxvdyAlMDh4ICglZClcbiIsIGksIGNhbGMsCisgICAgICAgICAgICAgICBjYWxjKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICB9CisgICAgICAgICBwbmdfc1JHQl9iYXNlW2ldID0gY2FsYzsKKworICAgICAgICAgY2FsYyA9IG5lYXJieWludCgoaGktbG8pICogMzIpOworICAgICAgICAgaWYgKGNhbGMgPiAyNTUpCisgICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInRhYmxlWyVkXVsxXTogb3ZlcmZsb3cgJTA4eCAoJWQpXG4iLCBpLCBjYWxjLAorICAgICAgICAgICAgICAgY2FsYyk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgfQorICAgICAgICAgcG5nX3NSR0JfZGVsdGFbaV0gPSBjYWxjOworICAgICAgfQorCisgICAgICAvKiBDaGVjayB0aGUgMTYtYml0IGxpbmVhciB2YWx1ZXMgYWxvbmU6ICovCisgICAgICBlcnJvcl9jb3VudDE2ID0gMDsKKyAgICAgIGZvciAoaTE2PTA7IGkxNiA8PSA2NTUzNTsgKytpMTYpCisgICAgICB7CisgICAgICAgICB1bnNpZ25lZCBpbnQgaSA9IDI1NSppMTY7CisgICAgICAgICB1bnNpZ25lZCBpbnQgaWV4YWN0ID0gbmVhcmJ5aW50KDI1NSpzUkdCKGkpKTsKKyAgICAgICAgIHVuc2lnbmVkIGludCBpY2FsYyA9IFBOR19zUkdCX0ZST01fTElORUFSKGkpOworCisgICAgICAgICBpZiAoaWNhbGMgIT0gaWV4YWN0KQorICAgICAgICAgICAgKytlcnJvcl9jb3VudDE2OworICAgICAgfQorCisgICAgICAvKiBOb3cgdHJ5IGNoYW5naW5nIHRoZSBhZGp1c3RtZW50LiAqLworICAgICAgaWYgKGVjX2xvID09IDApCisgICAgICAgICBlY19sbyA9IGVycm9yX2NvdW50MTY7CisKKyAgICAgIGVsc2UgaWYgKGVjX2hpID09IDApCisgICAgICAgICBlY19oaSA9IGVycm9yX2NvdW50MTY7CisKKyAgICAgIGVsc2UgaWYgKGVjX21pZCA9PSAwKQorICAgICAgeworICAgICAgICAgZWNfbWlkID0gZXJyb3JfY291bnQxNjsKKyAgICAgICAgIHByaW50ZigiLyogaW5pdGlhbCBlcnJvciBjb3VudHM6ICV1IC4uICV1IC4uICV1ICovXG4iLCBlY19sbywgZWNfbWlkLAorICAgICAgICAgICAgZWNfaGkpOworICAgICAgfQorCisgICAgICBlbHNlIGlmIChlcnJvcl9jb3VudDE2IDwgZWNfbWlkKQorICAgICAgeworICAgICAgICAgcHJpbnRmKCIvKiBhZGp1c3QgKG1pZCApOiAlZjogJXUgLT4gJXUgKi9cbiIsIGFkanVzdCwgZWNfbWlkLAorICAgICAgICAgICAgZXJyb3JfY291bnQxNik7CisgICAgICAgICBlY19taWQgPSBlcnJvcl9jb3VudDE2OworICAgICAgICAgYWRqdXN0X21pZCA9IGFkanVzdDsKKyAgICAgIH0KKworICAgICAgZWxzZSBpZiAoYWRqdXN0IDwgYWRqdXN0X21pZCAmJiBlcnJvcl9jb3VudDE2IDwgZWNfbG8pCisgICAgICB7CisgICAgICAgICBwcmludGYoIi8qIGFkanVzdCAobG93ICk6ICVmOiAldSAtPiAldSAqL1xuIiwgYWRqdXN0LCBlY19sbywKKyAgICAgICAgICAgIGVycm9yX2NvdW50MTYpOworICAgICAgICAgZWNfbG8gPSBlcnJvcl9jb3VudDE2OworICAgICAgICAgYWRqdXN0X2xvID0gYWRqdXN0OworICAgICAgfQorCisgICAgICBlbHNlIGlmIChhZGp1c3QgPiBhZGp1c3RfbWlkICYmIGVycm9yX2NvdW50MTYgPCBlY19oaSkKKyAgICAgIHsKKyAgICAgICAgIHByaW50ZigiLyogYWRqdXN0IChoaWdoKTogJWY6ICV1IC0+ICV1ICovXG4iLCBhZGp1c3QsIGVjX2hpLAorICAgICAgICAgICAgZXJyb3JfY291bnQxNik7CisgICAgICAgICBlY19oaSA9IGVycm9yX2NvdW50MTY7CisgICAgICAgICBhZGp1c3RfaGkgPSBhZGp1c3Q7CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGFkanVzdCA9IGFkanVzdF9taWQ7CisgICAgICAgICBwcmludGYoIi8qIGFkanVzdDogJWY6ICV1ICovXG4iLCBhZGp1c3QsIGVjX21pZCk7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgIH0KKworICAgLyogRm9yIGVhY2ggZW50cnkgaW4gdGhlIHRhYmxlIHRyeSB0byBhZGp1c3QgaXQgdG8gbWluaW1pemUgdGhlIGVycm9yIGNvdW50CisgICAgKiBpbiB0aGF0IGVudHJ5LiAgRWFjaCBlbnRyeSBjb3JyZXNwb25kcyB0byAxMjggaW5wdXQgdmFsdWVzLgorICAgICovCisgICBmb3IgKGliYXNlPTA7IGliYXNlPDY1NTM2OyBpYmFzZSs9MTI4KQorICAgeworICAgICAgcG5nX3VpbnRfMTYgYmFzZSA9IHBuZ19zUkdCX2Jhc2VbaWJhc2UgPj4gN10sIHRyeWJhc2UgPSBiYXNlLCBvYj1iYXNlOworICAgICAgcG5nX2J5dGUgZGVsdGEgPSBwbmdfc1JHQl9kZWx0YVtpYmFzZSA+PiA3XSwgdHJ5ZGVsdGEgPSBkZWx0YSwgb2Q9ZGVsdGE7CisgICAgICB1bnNpZ25lZCBpbnQgZWNiYXNlID0gMCwgZWNvOworCisgICAgICBmb3IgKDs7KQorICAgICAgeworICAgICAgICAgcG5nX3NSR0JfYmFzZVtpYmFzZSA+PiA3XSA9IHRyeWJhc2U7CisgICAgICAgICBwbmdfc1JHQl9kZWx0YVtpYmFzZSA+PiA3XSA9IHRyeWRlbHRhOworCisgICAgICAgICAvKiBDaGVjayB0aGUgMTYtYml0IGxpbmVhciB2YWx1ZXMgYWxvbmU6ICovCisgICAgICAgICBlcnJvcl9jb3VudDE2ID0gMDsKKyAgICAgICAgIGZvciAoaTE2PWliYXNlOyBpMTYgPCBpYmFzZSsxMjg7ICsraTE2KQorICAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IGkgPSAyNTUqaTE2OworICAgICAgICAgICAgdW5zaWduZWQgaW50IGlleGFjdCA9IG5lYXJieWludCgyNTUqc1JHQihpKSk7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaWNhbGMgPSBQTkdfc1JHQl9GUk9NX0xJTkVBUihpKTsKKworICAgICAgICAgICAgaWYgKGljYWxjICE9IGlleGFjdCkKKyAgICAgICAgICAgICAgICsrZXJyb3JfY291bnQxNjsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYgKGVycm9yX2NvdW50MTYgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBpZiAoZWNiYXNlID09IDApCisgICAgICAgICB7CisgICAgICAgICAgICBlY28gPSBlY2Jhc2UgPSBlcnJvcl9jb3VudDE2OworICAgICAgICAgICAgKyt0cnliYXNlOyAvKiBGaXJzdCB0ZXN0ICovCisgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UgaWYgKGVycm9yX2NvdW50MTYgPCBlY2Jhc2UpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAodHJ5YmFzZSA+IGJhc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBiYXNlID0gdHJ5YmFzZTsKKyAgICAgICAgICAgICAgICsrdHJ5YmFzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHRyeWJhc2UgPCBiYXNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgYmFzZSA9IHRyeWJhc2U7CisgICAgICAgICAgICAgICAtLXRyeWJhc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh0cnlkZWx0YSA+IGRlbHRhKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZGVsdGEgPSB0cnlkZWx0YTsKKyAgICAgICAgICAgICAgICsrdHJ5ZGVsdGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh0cnlkZWx0YSA8IGRlbHRhKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZGVsdGEgPSB0cnlkZWx0YTsKKyAgICAgICAgICAgICAgIC0tdHJ5ZGVsdGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1ha2VzUkdCOiBpbXBvc3NpYmxlXG4iKTsKKyAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlY2Jhc2UgPSBlcnJvcl9jb3VudDE2OworICAgICAgICAgfQorCisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAodHJ5YmFzZSA+IGJhc2UpCisgICAgICAgICAgICAgICB0cnliYXNlID0gYmFzZS0xOworICAgICAgICAgICAgZWxzZSBpZiAodHJ5YmFzZSA8IGJhc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICB0cnliYXNlID0gYmFzZTsKKyAgICAgICAgICAgICAgICsrdHJ5ZGVsdGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh0cnlkZWx0YSA+IGRlbHRhKQorICAgICAgICAgICAgICAgdHJ5ZGVsdGEgPSBkZWx0YS0xOworICAgICAgICAgICAgZWxzZSBpZiAodHJ5ZGVsdGEgPCBkZWx0YSkKKyAgICAgICAgICAgICAgIGJyZWFrOyAvKiBlbmQgb2YgdGVzdHMgKi8KKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcG5nX3NSR0JfYmFzZVtpYmFzZSA+PiA3XSA9IGJhc2U7CisgICAgICBwbmdfc1JHQl9kZWx0YVtpYmFzZSA+PiA3XSA9IGRlbHRhOworICAgICAgaWYgKGJhc2UgIT0gb2IgfHwgZGVsdGEgIT0gb2QpCisgICAgICB7CisgICAgICAgICBwcmludGYoIi8qIHRhYmxlWyV1XT17JXUsJXV9IC0+IHsldSwldX0gJXUgLT4gJXUgZXJyb3JzICovXG4iLAorICAgICAgICAgICAgaWJhc2U+PjcsIG9iLCBvZCwgYmFzZSwgZGVsdGEsIGVjbywgZWNiYXNlKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKDApCisgICAgICAgICBwcmludGYoIi8qIHRhYmxlWyV1XT17JXUsJXV9ICV1IGVycm9ycyAqL1xuIiwgaWJhc2U+PjcsIG9iLCBvZCwKKyAgICAgICAgICAgIGVjYmFzZSk7CisgICB9CisKKyAgIC8qIE9ubHkgZG8gdGhlIGZ1bGwgKHNsb3cpIHRlc3QgYXQgdGhlIGVuZDogKi8KKyAgIG1pbl9lcnJvciA9IC0uNDk5OTsKKyAgIG1heF9lcnJvciA9IC40OTk5OworICAgZXJyb3JfY291bnQgPSAwOworCisgICBmb3IgKGk9MDsgaSA8PSBtYXhfaW5wdXQ7ICsraSkKKyAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBpZXhhY3QgPSBuZWFyYnlpbnQoMjU1KnNSR0IoaSkpOworICAgICAgdW5zaWduZWQgaW50IGljYWxjID0gUE5HX3NSR0JfRlJPTV9MSU5FQVIoaSk7CisKKyAgICAgIGlmIChpY2FsYyAhPSBpZXhhY3QpCisgICAgICB7CisgICAgICAgICBkb3VibGUgZXJyID0gMjU1KnNSR0IoaSkgLSBpY2FsYzsKKworICAgICAgICAgaWYgKGVyciA+IChtYXhfZXJyb3IrLjAwMSkgfHwgZXJyIDwgKG1pbl9lcnJvci0uMDAxKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZigKKyAgICAgICAgICAgICAgICIvKiAweCUwOHg6IGV4YWN0OiAlM2QsIGdvdDogJTNkIFt0YWJsZXM6ICUwOHgsICUwOHhdICglZikgKi9cbiIsCisgICAgICAgICAgICAgICBpLCBpZXhhY3QsIGljYWxjLCBwbmdfc1JHQl9iYXNlW2k+PjE1XSwKKyAgICAgICAgICAgICAgIHBuZ19zUkdCX2RlbHRhW2k+PjE1XSwgZXJyKTsKKyAgICAgICAgIH0KKworICAgICAgICAgKytlcnJvcl9jb3VudDsKKyAgICAgICAgIGlmIChlcnIgPiBtYXhfZXJyb3IpCisgICAgICAgICAgICBtYXhfZXJyb3IgPSBlcnI7CisgICAgICAgICBlbHNlIGlmIChlcnIgPCBtaW5fZXJyb3IpCisgICAgICAgICAgICBtaW5fZXJyb3IgPSBlcnI7CisgICAgICB9CisgICB9CisKKyAgIC8qIFJlLWNoZWNrIHRoZSAxNi1iaXQgY2FzZXMgdG9vLCBpbmNsdWRpbmcgdGhlIHdhcm5pbmcgaWYgdGhlcmUgaXMgYW4gZXJyb3IKKyAgICAqIGJpZ2dlciB0aGFuIDEuCisgICAgKi8KKyAgIGVycm9yX2NvdW50MTYgPSAwOworICAgbWF4X2Vycm9yMTYgPSAwOworICAgbWluX2Vycm9yMTYgPSAwOworICAgZm9yIChpMTY9MDsgaTE2IDw9IDY1NTM1OyArK2kxNikKKyAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBpID0gMjU1KmkxNjsKKyAgICAgIHVuc2lnbmVkIGludCBpZXhhY3QgPSBuZWFyYnlpbnQoMjU1KnNSR0IoaSkpOworICAgICAgdW5zaWduZWQgaW50IGljYWxjID0gUE5HX3NSR0JfRlJPTV9MSU5FQVIoaSk7CisKKyAgICAgIGlmIChpY2FsYyAhPSBpZXhhY3QpCisgICAgICB7CisgICAgICAgICBkb3VibGUgZXJyID0gMjU1KnNSR0IoaSkgLSBpY2FsYzsKKworICAgICAgICAgKytlcnJvcl9jb3VudDE2OworICAgICAgICAgaWYgKGVyciA+IG1heF9lcnJvcjE2KQorICAgICAgICAgICAgbWF4X2Vycm9yMTYgPSBlcnI7CisgICAgICAgICBlbHNlIGlmIChlcnIgPCBtaW5fZXJyb3IxNikKKyAgICAgICAgICAgIG1pbl9lcnJvcjE2ID0gZXJyOworCisgICAgICAgICBpZiAoYWJzKGljYWxjIC0gaWV4YWN0KSA+IDEpCisgICAgICAgICAgICBwcmludGYoCisgICAgICAgICAgICAgICAiLyogMHglMDR4OiBleGFjdDogJTNkLCBnb3Q6ICUzZCBbdGFibGVzOiAlMDh4LCAlMDh4XSAoJWYpICovXG4iLAorICAgICAgICAgICAgICAgaTE2LCBpZXhhY3QsIGljYWxjLCBwbmdfc1JHQl9iYXNlW2k+PjE1XSwKKyAgICAgICAgICAgICAgIHBuZ19zUkdCX2RlbHRhW2k+PjE1XSwgZXJyKTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogQ2hlY2sgdGhlIHJvdW5kIHRyaXAgZm9yIGVhY2ggOC1iaXQgc1JHQiB2YWx1ZS4gKi8KKyAgIGZvciAoaTE2PTA7IGkxNiA8PSAyNTU7ICsraTE2KQorICAgeworICAgICAgdW5zaWduZWQgaW50IGkgPSAyNTUgKiBwbmdfc1JHQl90YWJsZVtpMTZdOworICAgICAgdW5zaWduZWQgaW50IGlleGFjdCA9IG5lYXJieWludCgyNTUqc1JHQihpKSk7CisgICAgICB1bnNpZ25lZCBpbnQgaWNhbGMgPSBQTkdfc1JHQl9GUk9NX0xJTkVBUihpKTsKKworICAgICAgaWYgKGkxNiAhPSBpZXhhY3QpCisgICAgICB7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIjgtYml0IHJvdW5kaW5nIGVycm9yOiAlZCAtPiAlZFxuIiwgaTE2LCBpZXhhY3QpOworICAgICAgICAgZXhpdCgxKTsKKyAgICAgIH0KKworICAgICAgaWYgKGljYWxjICE9IGkxNikKKyAgICAgIHsKKyAgICAgICAgIGRvdWJsZSBmaW52ID0gZmludnNSR0IoaTE2KTsKKworICAgICAgICAgcHJpbnRmKCIvKiA4LWJpdCByb3VuZHRyaXAgZXJyb3I6ICVkIC0+ICVmIC0+ICVkKCVmKSAqL1xuIiwKKyAgICAgICAgICAgIGkxNiwgZmludiwgaWNhbGMsIGZzUkdCKDI1NSpmaW52KSk7CisgICAgICB9CisgICB9CisKKworICAgcHJpbnRmKCIvKiBlcnJvcjogJWcgLSAlZywgJXUgKCVnJSUpIG9mIHJlYWRpbmdzIGluZXhhY3QgKi9cbiIsCisgICAgICBtaW5fZXJyb3IsIG1heF9lcnJvciwgZXJyb3JfY291bnQsICgxMDAuKmVycm9yX2NvdW50KS9tYXhfaW5wdXQpOworICAgcHJpbnRmKCIvKiAxNi1iaXQgZXJyb3I6ICVnIC0gJWcsICV1ICglZyUlKSBvZiByZWFkaW5ncyBpbmV4YWN0ICovXG4iLAorICAgICAgbWluX2Vycm9yMTYsIG1heF9lcnJvcjE2LCBlcnJvcl9jb3VudDE2LCAoMTAwLiplcnJvcl9jb3VudDE2KS82NTUzNSk7CisKKyAgIGlmICghdGVzdF9vbmx5KQorICAgeworICAgICAgcHJpbnRmKCJQTkdfQ09OU1QgcG5nX3VpbnRfMTYgcG5nX3NSR0JfdGFibGVbMjU2XSA9XG57XG4gICAiKTsKKyAgICAgIGZvciAoaT0wOyBpPDI1NTsgKQorICAgICAgeworICAgICAgICAgZG8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZigiJWQsIiwgcG5nX3NSR0JfdGFibGVbaSsrXSk7CisgICAgICAgICB9CisgICAgICAgICB3aGlsZSAoKGkgJiAweDcpICE9IDAgJiYgaTwyNTUpOworICAgICAgICAgaWYgKGk8MjU1KSBwcmludGYoIlxuICAgIik7CisgICAgICB9CisgICAgICBwcmludGYoIiVkXG59O1xuXG4iLCBwbmdfc1JHQl90YWJsZVtpXSk7CisKKworICAgICAgcHJpbnRmKCJQTkdfQ09OU1QgcG5nX3VpbnRfMTYgcG5nX3NSR0JfYmFzZVs1MTJdID1cbntcbiAgICIpOworICAgICAgZm9yIChpPTA7IGk8NTExOyApCisgICAgICB7CisgICAgICAgICBkbworICAgICAgICAgeworICAgICAgICAgICAgcHJpbnRmKCIlZCwiLCBwbmdfc1JHQl9iYXNlW2krK10pOworICAgICAgICAgfQorICAgICAgICAgd2hpbGUgKChpICYgMHg3KSAhPSAwICYmIGk8NTExKTsKKyAgICAgICAgIGlmIChpPDUxMSkgcHJpbnRmKCJcbiAgICIpOworICAgICAgfQorICAgICAgcHJpbnRmKCIlZFxufTtcblxuIiwgcG5nX3NSR0JfYmFzZVtpXSk7CisKKyAgICAgIHByaW50ZigiUE5HX0NPTlNUIHBuZ19ieXRlIHBuZ19zUkdCX2RlbHRhWzUxMl0gPVxue1xuICAgIik7CisgICAgICBmb3IgKGk9MDsgaTw1MTE7ICkKKyAgICAgIHsKKyAgICAgICAgIGRvCisgICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoIiVkLCIsIHBuZ19zUkdCX2RlbHRhW2krK10pOworICAgICAgICAgfQorICAgICAgICAgd2hpbGUgKChpICYgMHhmKSAhPSAwICYmIGk8NTExKTsKKyAgICAgICAgIGlmIChpPDUxMSkgcHJpbnRmKCJcbiAgICIpOworICAgICAgfQorICAgICAgcHJpbnRmKCIlZFxufTtcblxuIiwgcG5nX3NSR0JfZGVsdGFbaV0pOworICAgfQorCisgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3Rvb2xzL3BuZy1maXgtaXR4dC5jIGIvbGlicG5nL2NvbnRyaWIvdG9vbHMvcG5nLWZpeC1pdHh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc2NTRjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL3Rvb2xzL3BuZy1maXgtaXR4dC5jCkBAIC0wLDAgKzEsMTY0IEBACisKKy8qIHBuZy1maXgtaXR4dCB2ZXJzaW9uIDEuMC4wCisgKgorICogQ29weXJpZ2h0IDIwMTUgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4xOCBbSnVseSAyMywgMjAxNV0KKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKyAqCisgKiBVc2FnZToKKyAqCisgKiAgICAgcG5nLWZpeC1pdHh0LmV4ZSA8IGJhZC5wbmcgPiBnb29kLnBuZworICoKKyAqIEZpeGVzIGEgUE5HIGZpbGUgd3JpdHRlbiB3aXRoIGxpYnBuZy0xLjYuMCBvciAxLjYuMSB0aGF0IGhhcyBvbmUgb3IgbW9yZQorICogdW5jb21wcmVzc2VkIGlUWHQgY2h1bmtzLiAgQXNzdW1lcyB0aGF0IHRoZSBhY3R1YWwgbGVuZ3RoIGlzIGdyZWF0ZXIKKyAqIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHZhbHVlIGluIHRoZSBsZW5ndGggYnl0ZSwgYW5kIHRoYXQgdGhlIENSQyBpcworICogY29ycmVjdCBmb3IgdGhlIGFjdHVhbCBsZW5ndGguICBUaGlzIHByb2dyYW0gaHVudHMgZm9yIHRoZSBDUkMgYW5kCisgKiBhZGp1c3RzIHRoZSBsZW5ndGggYnl0ZSBhY2NvcmRpbmdseS4gIEl0IGlzIG5vdCBhbiBlcnJvciB0byBwcm9jZXNzIGEKKyAqIFBORyBmaWxlIHRoYXQgaGFzIG5vIGlUWHQgY2h1bmtzIG9yIG9uZSB0aGF0IGhhcyB2YWxpZCBpVFh0IGNodW5rczsKKyAqIHN1Y2ggZmlsZXMgd2lsbCBzaW1wbHkgYmUgY29waWVkLgorICoKKyAqIFJlcXVpcmVzIHpsaWIgKGZvciBjcmMzMiBhbmQgWl9OVUxMKTsgYnVpbGQgd2l0aAorICoKKyAqICAgICBnY2MgLU8gLW8gcG5nLWZpeC1pdHh0IHBuZy1maXgtaXR4dC5jIC1segorICoKKyAqIElmIHlvdSBuZWVkIHRvIGhhbmRsZSBpVFh0IGNodW5rcyBsYXJnZXIgdGhhbiA1MDAwMDAga2J5dGVzIHlvdSBtdXN0CisgKiByZWJ1aWxkIHBuZy1maXgtaXR4dCB3aXRoIGEgbGFyZ2VyIHZhbHVlcyBvZiBNQVhfTEVOR1RIIChvciBhIHNtYWxsZXIgdmFsdWUKKyAqIGlmIHlvdSBrbm93IHlvdSB3aWxsIG5ldmVyIGVuY291bnRlciBzdWNoIGh1Z2UgaVRYdCBjaHVua3MpLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHpsaWIuaD4KKworI2RlZmluZSBNQVhfTEVOR1RIIDUwMDAwMAorCisvKiBSZWFkIG9uZSBjaGFyYWN0ZXIgKGluY2hhciksIGFsc28gcmV0dXJuIG9jdGV0IChjKSwgYnJlYWsgaWYgRU9GICovCisjZGVmaW5lIEdFVEJSRUFLIGluY2hhcj1nZXRjaGFyKCk7IFwKKyAgICAgICAgICAgICAgICAgYz0oaW5jaGFyICYgMHhmZlUpO1wKKyAgICAgICAgICAgICAgICAgaWYgKGluY2hhciAhPSBjKSBicmVhaworaW50CittYWluKHZvaWQpCit7CisgICB1bnNpZ25lZCBpbnQgaTsKKyAgIHVuc2lnbmVkIGNoYXIgYnVmW01BWF9MRU5HVEhdOworICAgdW5zaWduZWQgbG9uZyBjcmM7CisgICB1bnNpZ25lZCBjaGFyIGM7CisgICBpbnQgaW5jaGFyOworCisvKiBTa2lwIDgtYnl0ZSBzaWduYXR1cmUgKi8KKyAgIGZvciAoaT04OyBpOyBpLS0pCisgICB7CisgICAgICBHRVRCUkVBSzsKKyAgICAgIHB1dGNoYXIoYyk7CisgICB9CisKK2lmIChpbmNoYXIgPT0gYykgLyogIUVPRiAqLworZm9yICg7OykKKyB7CisgICAvKiBSZWFkIHRoZSBsZW5ndGggKi8KKyAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOyAvKiBtdXN0IGJlIDMyIGJpdHMhICovCisgICBHRVRCUkVBSzsgYnVmWzBdID0gYzsgbGVuZ3RoICA9IGM7IGxlbmd0aCA8PD0gODsKKyAgIEdFVEJSRUFLOyBidWZbMV0gPSBjOyBsZW5ndGggKz0gYzsgbGVuZ3RoIDw8PSA4OworICAgR0VUQlJFQUs7IGJ1ZlsyXSA9IGM7IGxlbmd0aCArPSBjOyBsZW5ndGggPDw9IDg7CisgICBHRVRCUkVBSzsgYnVmWzNdID0gYzsgbGVuZ3RoICs9IGM7CisKKyAgIC8qIFJlYWQgdGhlIGNodW5rbmFtZSAqLworICAgR0VUQlJFQUs7IGJ1Zls0XSA9IGM7CisgICBHRVRCUkVBSzsgYnVmWzVdID0gYzsKKyAgIEdFVEJSRUFLOyBidWZbNl0gPSBjOworICAgR0VUQlJFQUs7IGJ1Zls3XSA9IGM7CisKKworICAgLyogVGhlIGlUWHQgY2h1bmsgdHlwZSBleHByZXNzZWQgYXMgaW50ZWdlcnMgaXMgKDEwNSwgODQsIDg4LCAxMTYpICovCisgICBpZiAoYnVmWzRdID09IDEwNSAmJiBidWZbNV0gPT0gODQgJiYgYnVmWzZdID09IDg4ICYmIGJ1Zls3XSA9PSAxMTYpCisgICB7CisgICAgICBpZiAobGVuZ3RoID49IE1BWF9MRU5HVEgtMTIpCisgICAgICAgICBicmVhazsgIC8qIFRvIGRvOiBoYW5kbGUgdGhpcyBtb3JlIGdyYWNlZnVsbHkgKi8KKworICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgQ1JDICovCisgICAgICBjcmMgPSBjcmMzMigwLCBaX05VTEwsIDApOworCisgICAgICAvKiBDb3B5IHRoZSBkYXRhIGJ5dGVzICovCisgICAgICBmb3IgKGk9ODsgaSA8IGxlbmd0aCArIDEyOyBpKyspCisgICAgICB7CisgICAgICAgICBHRVRCUkVBSzsgYnVmW2ldID0gYzsKKyAgICAgIH0KKworICAgICAgaWYgKGluY2hhciAhPSBjKSAvKiBFT0YgKi8KKyAgICAgICAgIGJyZWFrOworCisgICAgICAvKiBDYWxjdWxhdGUgdGhlIENSQyAqLworICAgICAgY3JjID0gY3JjMzIoY3JjLCBidWYrNCwgKHVJbnQpbGVuZ3RoKzQpOworCisgICAgICBmb3IgKDs7KQorICAgICAgeworICAgICAgICAvKiBDaGVjayB0aGUgQ1JDICovCisgICAgICAgIGlmICgoKGNyYyA+PiAyNCkgJiAweGZmVSkgPT0gYnVmW2xlbmd0aCs4XSAmJgorICAgICAgICAgICAgKChjcmMgPj4gMTYpICYgMHhmZlUpID09IGJ1ZltsZW5ndGgrOV0gJiYKKyAgICAgICAgICAgICgoY3JjID4+ICA4KSAmIDB4ZmZVKSA9PSBidWZbbGVuZ3RoKzEwXSAmJgorICAgICAgICAgICAgKChjcmMgICAgICApICYgMHhmZlUpID09IGJ1ZltsZW5ndGgrMTFdKQorICAgICAgICAgICBicmVhazsKKworICAgICAgICBsZW5ndGgrKzsKKworICAgICAgICBpZiAobGVuZ3RoID49IE1BWF9MRU5HVEgtMTIpCisgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIEdFVEJSRUFLOworICAgICAgICBidWZbbGVuZ3RoKzExXSA9IGM7CisKKyAgICAgICAgLyogVXBkYXRlIHRoZSBDUkMgKi8KKyAgICAgICAgY3JjID0gY3JjMzIoY3JjLCBidWYrNytsZW5ndGgsIDEpOworICAgICAgfQorCisgICAgICBpZiAoaW5jaGFyICE9IGMpIC8qIEVPRiAqLworICAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFVwZGF0ZSBsZW5ndGggYnl0ZXMgKi8KKyAgICAgIGJ1ZlswXSA9ICh1bnNpZ25lZCBjaGFyKSgobGVuZ3RoID4+IDI0KSAmIDB4ZmZVKTsKKyAgICAgIGJ1ZlsxXSA9ICh1bnNpZ25lZCBjaGFyKSgobGVuZ3RoID4+IDE2KSAmIDB4ZmZVKTsKKyAgICAgIGJ1ZlsyXSA9ICh1bnNpZ25lZCBjaGFyKSgobGVuZ3RoID4+ICA4KSAmIDB4ZmZVKTsKKyAgICAgIGJ1ZlszXSA9ICh1bnNpZ25lZCBjaGFyKSgobGVuZ3RoICAgICAgKSAmIDB4ZmZVKTsKKworICAgICAgLyogV3JpdGUgdGhlIGZpeGVkIGlUWHQgY2h1bmsgKGxlbmd0aCwgbmFtZSwgZGF0YSwgY3JjKSAqLworICAgICAgZm9yIChpPTA7IGk8bGVuZ3RoKzEyOyBpKyspCisgICAgICAgICBwdXRjaGFyKGJ1ZltpXSk7CisgICB9CisKKyAgIGVsc2UKKyAgIHsKKyAgICAgIGlmIChpbmNoYXIgIT0gYykgLyogRU9GICovCisgICAgICAgICBicmVhazsKKworICAgICAgLyogQ29weSBieXRlcyB0aGF0IHdlcmUgYWxyZWFkeSByZWFkIChsZW5ndGggYW5kIGNodW5rIG5hbWUpICovCisgICAgICBmb3IgKGk9MDsgaTw4OyBpKyspCisgICAgICAgICBwdXRjaGFyKGJ1ZltpXSk7CisKKyAgICAgIC8qIENvcHkgZGF0YSBieXRlcyBhbmQgQ1JDICovCisgICAgICBmb3IgKGk9ODsgaTwgbGVuZ3RoKzEyOyBpKyspCisgICAgICB7CisgICAgICAgICBHRVRCUkVBSzsKKyAgICAgICAgIHB1dGNoYXIoYyk7CisgICAgICB9CisKKyAgICAgIGlmIChpbmNoYXIgIT0gYykgLyogRU9GICovCisgICAgICB7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgLyogVGhlIElFTkQgY2h1bmsgdHlwZSBleHByZXNzZWQgYXMgaW50ZWdlcnMgaXMgKDczLCA2OSwgNzgsIDY4KSAqLworICAgICAgaWYgKGJ1Zls0XSA9PSA3MyAmJiBidWZbNV0gPT0gNjkgJiYgYnVmWzZdID09IDc4ICYmIGJ1Zls3XSA9PSA2OCkKKyAgICAgICAgIGJyZWFrOworICAgfQorCisgICBpZiAoaW5jaGFyICE9IGMpIC8qIEVPRiAqLworICAgICAgYnJlYWs7CisKKyAgIGlmIChidWZbNF0gPT0gNzMgJiYgYnVmWzVdID09IDY5ICYmIGJ1Zls2XSA9PSA3OCAmJiBidWZbN10gPT0gNjgpCisgICAgIGJyZWFrOworIH0KKworIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGlicG5nL2NvbnRyaWIvdG9vbHMvcG5nZml4LmMgYi9saWJwbmcvY29udHJpYi90b29scy9wbmdmaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmRlMzFjCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvdG9vbHMvcG5nZml4LmMKQEAgLTAsMCArMSw0MDQ5IEBACisvKiBwbmdmaXguYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IEpvaG4gQ3VubmluZ2hhbSBCb3dsZXIKKyAqCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4yMCBbRGVjZW1iZXIgMywgMjAxNV0KKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKyAqCisgKiBUb29sIHRvIGNoZWNrIGFuZCBmaXggdGhlIHpsaWIgaW5mbGF0ZSAndG9vIGZhciBiYWNrJyBwcm9ibGVtLgorICogU2VlIHRoZSB1c2FnZSBtZXNzYWdlIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNkZWZpbmUgaW1wbGllcyh4LHkpIGFzc2VydCghKHgpIHx8ICh5KSkKKworI2lmZGVmIF9fR05VQ19fCisgICAvKiBUaGlzIGlzIHVzZWQgdG8gZml4IHRoZSBlcnJvcjoKKyAgICAqCisgICAgKiBwbmdmaXguYzoKKyAgICAqIEluIGZ1bmN0aW9uICd6bGliX2FkdmFuY2UnOgorICAgICogcG5nZml4LmM6MTgxOjEzOiBlcnJvcjogYXNzdW1pbmcgc2lnbmVkIG92ZXJmbG93IGRvZXMgbm90CisgICAgKiAgIG9jY3VyIHdoZW4gc2ltcGxpZnlpbmcgY29uZGl0aW9uYWwgdG8gY29uc3RhbnQgWy1XZXJyb3I9c3RyaWN0LW92ZXJmbG93XQorICAgICovCisjICBkZWZpbmUgRklYX0dDQyB2b2xhdGlsZQorI2Vsc2UKKyMgIGRlZmluZSBGSVhfR0NDCisjZW5kaWYKKworI2RlZmluZSBQUk9HUkFNX05BTUUgInBuZ2ZpeCIKKworLyogRGVmaW5lIHRoZSBmb2xsb3dpbmcgdG8gdXNlIHRoaXMgcHJvZ3JhbSBhZ2FpbnN0IHlvdXIgaW5zdGFsbGVkIGxpYnBuZywKKyAqIHJhdGhlciB0aGFuIHRoZSBvbmUgYmVpbmcgYnVpbHQgaGVyZToKKyAqLworI2lmZGVmIFBOR19GUkVFU1RBTkRJTkdfVEVTVFMKKyMgIGluY2x1ZGUgPHBuZy5oPgorI2Vsc2UKKyMgIGluY2x1ZGUgIi4uLy4uL3BuZy5oIgorI2VuZGlmCisKKyNpZiBQTkdfTElCUE5HX1ZFUiA8IDEwNjAzIC8qIDEuNi4zICovCisjICBlcnJvciAicG5nZml4IHdpbGwgbm90IHdvcmsgd2l0aCBsaWJwbmcgcHJpb3IgdG8gMS42LjMiCisjZW5kaWYKKworI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECisjaW5jbHVkZSA8c2V0am1wLmg+CisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfRUFTWV9BQ0NFU1NfU1VQUE9SVEVEKSAmJlwKKyAgIChkZWZpbmVkKFBOR19SRUFEX0RFSU5URVJMQUNFX1NVUFBPUlRFRCkgfHxcCisgICAgZGVmaW5lZChQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQpKQorCisvKiB6bGliLmggZGVmaW5lcyB0aGUgc3RydWN0dXJlIHpfc3RyZWFtLCBhbiBpbnN0YW5jZSBvZiB3aGljaCBpcyBpbmNsdWRlZAorICogaW4gdGhpcyBzdHJ1Y3R1cmUgYW5kIGlzIHJlcXVpcmVkIGZvciBkZWNvbXByZXNzaW5nIHRoZSBMWiBjb21wcmVzc2VkCisgKiBkYXRhIGluIFBORyBmaWxlcy4KKyAqLworI2lmbmRlZiBaTElCX0NPTlNUCisgICAvKiBXZSBtdXN0IGVuc3VyZSB0aGF0IHpsaWIgdXNlcyAnY29uc3QnIGluIGRlY2xhcmF0aW9ucy4gKi8KKyMgIGRlZmluZSBaTElCX0NPTlNUCisjZW5kaWYKKyNpbmNsdWRlIDx6bGliLmg+CisjaWZkZWYgY29uc3QKKyAgIC8qIHpsaWIuaCBzb21ldGltZXMgI2RlZmluZXMgY29uc3QgdG8gbm90aGluZywgdW5kbyB0aGlzLiAqLworIyAgdW5kZWYgY29uc3QKKyNlbmRpZgorCisvKiB6bGliLmggaGFzIG1lZGlvY3JlIHpfY29uc3QgdXNlIGJlZm9yZSAxLjIuNiwgdGhpcyBzdHVmZiBpcyBmb3IgY29tcGF0aWJpbGl0eQorICogd2l0aCBvbGRlciBidWlsZHMuCisgKi8KKyNpZiBaTElCX1ZFUk5VTSA8IDB4MTI2MAorIyAgZGVmaW5lIFBOR1pfTVNHX0NBU1QocykgY29uc3RjYXN0KGNoYXIqLHMpCisjICBkZWZpbmUgUE5HWl9JTlBVVF9DQVNUKGIpIGNvbnN0Y2FzdChwbmdfYnl0ZXAsYikKKyNlbHNlCisjICBkZWZpbmUgUE5HWl9NU0dfQ0FTVChzKSAocykKKyMgIGRlZmluZSBQTkdaX0lOUFVUX0NBU1QoYikgKGIpCisjZW5kaWYKKworI2lmbmRlZiBQTkdfTUFYSU1VTV9JTkZMQVRFX1dJTkRPVworIyAgZXJyb3IgInBuZ2ZpeCBub3Qgc3VwcG9ydGVkIGluIHRoaXMgbGlicG5nIHZlcnNpb24iCisjZW5kaWYKKworI2lmIFpMSUJfVkVSTlVNID49IDB4MTI0MAorCisvKiBDb3BpZWQgZnJvbSBwbmdwcml2LmggKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworIyAgZGVmaW5lIHZvaWRjYXN0KHR5cGUsIHZhbHVlKSBzdGF0aWNfY2FzdDx0eXBlPih2YWx1ZSkKKyMgIGRlZmluZSBjb25zdGNhc3QodHlwZSwgdmFsdWUpIGNvbnN0X2Nhc3Q8dHlwZT4odmFsdWUpCisjICBkZWZpbmUgYWxpZ25jYXN0KHR5cGUsIHZhbHVlKSBcCisgICBzdGF0aWNfY2FzdDx0eXBlPihzdGF0aWNfY2FzdDx2b2lkKj4odmFsdWUpKQorIyAgZGVmaW5lIGFsaWduY2FzdGNvbnN0KHR5cGUsIHZhbHVlKSBcCisgICBzdGF0aWNfY2FzdDx0eXBlPihzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4odmFsdWUpKQorI2Vsc2UKKyMgIGRlZmluZSB2b2lkY2FzdCh0eXBlLCB2YWx1ZSkgKHZhbHVlKQorIyAgZGVmaW5lIGNvbnN0Y2FzdCh0eXBlLCB2YWx1ZSkgKCh0eXBlKSh2YWx1ZSkpCisjICBkZWZpbmUgYWxpZ25jYXN0KHR5cGUsIHZhbHVlKSAoKHZvaWQqKSh2YWx1ZSkpCisjICBkZWZpbmUgYWxpZ25jYXN0Y29uc3QodHlwZSwgdmFsdWUpICgoY29uc3Qgdm9pZCopKHZhbHVlKSkKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjaWYgUE5HX0xJQlBOR19WRVIgPCAxMDcwMAorLyogQ2h1bmsgdGFncyAoY29waWVkIGZyb20gcG5ncHJpdi5oKSAqLworI2RlZmluZSBQTkdfMzJiKGIscykgKChwbmdfdWludF8zMikoYikgPDwgKHMpKQorI2RlZmluZSBQTkdfVTMyKGIxLGIyLGIzLGI0KSBcCisgICAoUE5HXzMyYihiMSwyNCkgfCBQTkdfMzJiKGIyLDE2KSB8IFBOR18zMmIoYjMsOCkgfCBQTkdfMzJiKGI0LDApKQorCisvKiBDb25zdGFudHMgZm9yIGtub3duIGNodW5rIHR5cGVzLiAqLworI2RlZmluZSBwbmdfSURBVCBQTkdfVTMyKCA3MywgIDY4LCAgNjUsICA4NCkKKyNkZWZpbmUgcG5nX0lFTkQgUE5HX1UzMiggNzMsICA2OSwgIDc4LCAgNjgpCisjZGVmaW5lIHBuZ19JSERSIFBOR19VMzIoIDczLCAgNzIsICA2OCwgIDgyKQorI2RlZmluZSBwbmdfUExURSBQTkdfVTMyKCA4MCwgIDc2LCAgODQsICA2OSkKKyNkZWZpbmUgcG5nX2JLR0QgUE5HX1UzMiggOTgsICA3NSwgIDcxLCAgNjgpCisjZGVmaW5lIHBuZ19jSFJNIFBOR19VMzIoIDk5LCAgNzIsICA4MiwgIDc3KQorI2RlZmluZSBwbmdfZlJBYyBQTkdfVTMyKDEwMiwgIDgyLCAgNjUsICA5OSkgLyogcmVnaXN0ZXJlZCwgbm90IGRlZmluZWQgKi8KKyNkZWZpbmUgcG5nX2dBTUEgUE5HX1UzMigxMDMsICA2NSwgIDc3LCAgNjUpCisjZGVmaW5lIHBuZ19nSUZnIFBOR19VMzIoMTAzLCAgNzMsICA3MCwgMTAzKQorI2RlZmluZSBwbmdfZ0lGdCBQTkdfVTMyKDEwMywgIDczLCAgNzAsIDExNikgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBwbmdfZ0lGeCBQTkdfVTMyKDEwMywgIDczLCAgNzAsIDEyMCkKKyNkZWZpbmUgcG5nX2hJU1QgUE5HX1UzMigxMDQsICA3MywgIDgzLCAgODQpCisjZGVmaW5lIHBuZ19pQ0NQIFBOR19VMzIoMTA1LCAgNjcsICA2NywgIDgwKQorI2RlZmluZSBwbmdfaVRYdCBQTkdfVTMyKDEwNSwgIDg0LCAgODgsIDExNikKKyNkZWZpbmUgcG5nX29GRnMgUE5HX1UzMigxMTEsICA3MCwgIDcwLCAxMTUpCisjZGVmaW5lIHBuZ19wQ0FMIFBOR19VMzIoMTEyLCAgNjcsICA2NSwgIDc2KQorI2RlZmluZSBwbmdfcEhZcyBQTkdfVTMyKDExMiwgIDcyLCAgODksIDExNSkKKyNkZWZpbmUgcG5nX3NCSVQgUE5HX1UzMigxMTUsICA2NiwgIDczLCAgODQpCisjZGVmaW5lIHBuZ19zQ0FMIFBOR19VMzIoMTE1LCAgNjcsICA2NSwgIDc2KQorI2RlZmluZSBwbmdfc1BMVCBQTkdfVTMyKDExNSwgIDgwLCAgNzYsICA4NCkKKyNkZWZpbmUgcG5nX3NSR0IgUE5HX1UzMigxMTUsICA4MiwgIDcxLCAgNjYpCisjZGVmaW5lIHBuZ19zVEVSIFBOR19VMzIoMTE1LCAgODQsICA2OSwgIDgyKQorI2RlZmluZSBwbmdfdEVYdCBQTkdfVTMyKDExNiwgIDY5LCAgODgsIDExNikKKyNkZWZpbmUgcG5nX3RJTUUgUE5HX1UzMigxMTYsICA3MywgIDc3LCAgNjkpCisjZGVmaW5lIHBuZ190Uk5TIFBOR19VMzIoMTE2LCAgODIsICA3OCwgIDgzKQorI2RlZmluZSBwbmdfelRYdCBQTkdfVTMyKDEyMiwgIDg0LCAgODgsIDExNikKKyNlbmRpZgorCisvKiBUaGUgOC1ieXRlIHNpZ25hdHVyZSBhcyBhIHBhaXIgb2YgMzItYml0IHF1YW50aXRpZXMgKi8KKyNkZWZpbmUgc2lnMSBQTkdfVTMyKDEzNywgIDgwLCAgNzgsICA3MSkKKyNkZWZpbmUgc2lnMiBQTkdfVTMyKCAxMywgIDEwLCAgMjYsICAxMCkKKworLyogSXMgdGhlIGNodW5rIGNyaXRpY2FsPyAqLworI2RlZmluZSBDUklUSUNBTChjaHVuaykgKCgoY2h1bmspICYgUE5HX1UzMigzMiwwLDAsMCkpID09IDApCisKKy8qIElzIGl0IHNhZmUgdG8gY29weT8gKi8KKyNkZWZpbmUgU0FGRV9UT19DT1BZKGNodW5rKSAoKChjaHVuaykgJiBQTkdfVTMyKDAsMCwwLDMyKSkgIT0gMCkKKworLyogRml4IHVwcyBmb3IgYnVpbGRzIHdpdGggbGltaXRlZCByZWFkIHN1cHBvcnQgKi8KKyNpZm5kZWYgUE5HX0VSUk9SX1RFWFRfU1VQUE9SVEVECisjICBkZWZpbmUgcG5nX2Vycm9yKGEsYikgcG5nX2VycihhKQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVVRJTElUSUVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBVTlJFQUNIRUQgaXMgYSB2YWx1ZSB0byBjYXVzZSBhbiBhc3NlcnQgdG8gZmFpbC4gQmVjYXVzZSBvZiB0aGUgd2F5IHRoZQorICogYXNzZXJ0IG1hY3JvIGlzIHdyaXR0ZW4gdGhlIHN0cmluZyAiVU5SRUFDSEVEIiBpcyBwcm9kdWNlZCBpbiB0aGUgZXJyb3IKKyAqIG1lc3NhZ2UuCisgKi8KKyNkZWZpbmUgVU5SRUFDSEVEIDAKKworLyogODAtYml0IG51bWJlciBoYW5kbGluZyAtIGEgUE5HIGltYWdlIGNhbiBiZSB1cCB0byAoMl4zMS0xKXgoMl4zMS0xKSA4LWJ5dGUKKyAqICgxNi1iaXQgUkdCQSkgcGl4ZWxzIGluIHNpemU7IHRoYXQncyBsZXNzIHRoYW4gMl42NSBieXRlcyBvciAyXjY4IGJpdHMsIHNvCisgKiBhcml0aG1ldGljIG9mIDgwLWJpdCBudW1iZXJzIGlzIHN1ZmZpY2llbnQuICBUaGlzIHJlcHJlc2VudGF0aW9uIHVzZXMgYW4KKyAqIGFyYml0cmFyeSBsZW5ndGggYXJyYXkgb2YgcG5nX3VpbnRfMTYgZGlnaXRzICgwLi42NTUzNSkuICBUaGUgcmVwcmVzZW50YXRpb24KKyAqIGlzIGxpdHRsZSBlbmRpYW4uCisgKgorICogVGhlIGFyaXRobWV0aWMgZnVuY3Rpb25zIHRha2UgemVybyB0byB0d28gdWFyYiB2YWx1ZXMgdG9nZXRoZXIgd2l0aCB0aGUKKyAqIG51bWJlciBvZiBkaWdpdHMgaW4gdGhvc2UgdmFsdWVzIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIHRoZSBnaXZlbiB1YXJiCisgKiAoYWx3YXlzIHRoZSBmaXJzdCBhcmd1bWVudCkgcmV0dXJuaW5nIHRoZSBudW1iZXIgb2YgZGlnaXRzIGluIHRoZSByZXN1bHQuCisgKiBJZiB0aGUgcmVzdWx0IGlzIG5lZ2F0aXZlIHRoZSByZXR1cm4gdmFsdWUgaXMgYWxzbyBuZWdhdGl2ZSAodGhpcyB3b3VsZAorICogbm9ybWFsbHkgYmUgYW4gZXJyb3IpLgorICovCit0eXBlZGVmIHBuZ191aW50XzE2ICB1ZGlnaXQ7IC8qIEEgJ3VudW0nIGlzIGFuIGFycmF5IG9mIHRoZXNlICovCit0eXBlZGVmIHBuZ191aW50XzE2cCB1YXJiOwordHlwZWRlZiBwbmdfY29uc3RfdWludF8xNnAgdWFyYmM7CisKKyNkZWZpbmUgVURJR0lUUyh1bnVtKSAoKHNpemVvZiB1bnVtKS8oc2l6ZW9mICh1ZGlnaXQpKQorICAgLyogSU1QT1JUQU5UOiBvbmx5IGFwcGx5IHRoaXMgdG8gYW4gYXJyYXksIGFwcGxpZWQgdG8gYSBwb2ludGVyIHRoZSByZXN1bHQKKyAgICAqIHdpbGwgdHlwaWNhbGx5IGJlICcyJywgd2hpY2ggaXMgbm90IHVzZWZ1bC4KKyAgICAqLworCitzdGF0aWMgaW50Cit1YXJiX3NldCh1YXJiIHJlc3VsdCwgcG5nX2FsbG9jX3NpemVfdCB2YWwpCisgICAvKiBTZXQgKGluaXRpYWxpemUpICdyZXN1bHQnIHRvICd2YWwnLiAgVGhlIHNpemUgcmVxdWlyZWQgZm9yICdyZXN1bHQnIG11c3QKKyAgICAqIGJlIGRldGVybWluZWQgYnkgdGhlIGNhbGxlciBmcm9tIGEga25vd2xlZGdlIG9mIHRoZSBtYXhpbXVtIGZvciAndmFsJy4KKyAgICAqLworeworICAgaW50IG5kaWdpdHMgPSAwOworCisgICB3aGlsZSAodmFsID4gMCkKKyAgIHsKKyAgICAgIHJlc3VsdFtuZGlnaXRzKytdID0gKHBuZ191aW50XzE2KSh2YWwgJiAweGZmZmYpOworICAgICAgdmFsID4+PSAxNjsKKyAgIH0KKworICAgcmV0dXJuIG5kaWdpdHM7Cit9CisKK3N0YXRpYyBpbnQKK3VhcmJfY29weSh1YXJiIHRvLCB1YXJiIGZyb20sIGludCBpZGlnaXRzKQorICAgLyogQ29weSBhIHVhcmIsIG1heSByZWR1Y2UgdGhlIGRpZ2l0IGNvdW50ICovCit7CisgICBpbnQgZCwgb2RpZ2l0czsKKworICAgZm9yIChkPW9kaWdpdHM9MDsgZDxpZGlnaXRzOyArK2QpCisgICAgICBpZiAoKHRvW2RdID0gZnJvbVtkXSkgIT0gMCkKKyAgICAgICAgIG9kaWdpdHMgPSBkKzE7CisKKyAgIHJldHVybiBvZGlnaXRzOworfQorCitzdGF0aWMgaW50Cit1YXJiX2luYyh1YXJiIG51bSwgaW50IGluX2RpZ2l0cywgcG5nX2ludF8zMiBhZGQpCisgICAvKiBUaGlzIGlzIGEgc2lnbmVkIDMyLWJpdCBhZGQsIGV4Y2VwdCB0aGF0IHRvIGF2b2lkIG92ZXJmbG93IHRoZSB2YWx1ZSBhZGRlZAorICAgICogb3Igc3VidHJhY3RlZCBtdXN0IGJlIG5vIG1vcmUgdGhhbiAyXjMxLTY1NTM2LiAgQSBuZWdhdGl2ZSByZXN1bHQKKyAgICAqIGluZGljYXRlcyBhIG5lZ2F0aXZlIG51bWJlciAod2hpY2ggaXMgYW4gZXJyb3IgYmVsb3cpLiAgVGhlIHNpemUgb2YKKyAgICAqICdudW0nIHNob3VsZCBiZSBtYXgoaW5fZGlnaXRzKzEsMikgZm9yIGFyYml0cmFyeSAnYWRkJyBidXQgY2FuIGJlIGp1c3QKKyAgICAqIGluX2RpZ2l0cysxIGlmIGFkZCBpcyBrbm93biB0byBiZSBpbiB0aGUgcmFuZ2UgLTY1NTM1Li42NTUzNS4KKyAgICAqLworeworICAgRklYX0dDQyBpbnQgb3V0X2RpZ2l0cyA9IDA7CisKKyAgIHdoaWxlIChvdXRfZGlnaXRzIDwgaW5fZGlnaXRzKQorICAgeworICAgICAgYWRkICs9IG51bVtvdXRfZGlnaXRzXTsKKyAgICAgIG51bVtvdXRfZGlnaXRzKytdID0gKHBuZ191aW50XzE2KShhZGQgJiAweGZmZmYpOworICAgICAgYWRkID4+PSAxNjsKKyAgIH0KKworICAgd2hpbGUgKGFkZCAhPSAwICYmIGFkZCAhPSAoLTEpKQorICAgeworICAgICAgbnVtW291dF9kaWdpdHMrK10gPSAocG5nX3VpbnRfMTYpKGFkZCAmIDB4ZmZmZik7CisgICAgICBhZGQgPj49IDE2OworICAgfQorCisgICBpZiAoYWRkID09IDApCisgICB7CisgICAgICB3aGlsZSAob3V0X2RpZ2l0cyA+IDAgJiYgbnVtW291dF9kaWdpdHMtMV0gPT0gMCkKKyAgICAgICAgIC0tb3V0X2RpZ2l0czsKKyAgICAgIHJldHVybiBvdXRfZGlnaXRzOyAvKiBtYXkgYmUgMCAqLworICAgfQorCisgICBlbHNlIC8qIG5lZ2F0aXZlIHJlc3VsdCAqLworICAgeworICAgICAgd2hpbGUgKG91dF9kaWdpdHMgPiAxICYmIG51bVtvdXRfZGlnaXRzLTFdID09IDB4ZmZmZikKKyAgICAgICAgIC0tb3V0X2RpZ2l0czsKKworICAgICAgcmV0dXJuIC1vdXRfZGlnaXRzOworICAgfQorfQorCitzdGF0aWMgaW50Cit1YXJiX2FkZDMyKHVhcmIgbnVtLCBpbnQgaW5fZGlnaXRzLCBwbmdfdWludF8zMiBhZGQpCisgICAvKiBBcyBhYm92ZSBidXQgdGhpcyB3b3JrcyB3aXRoIGFueSAzMi1iaXQgdmFsdWUgYW5kIG9ubHkgZG9lcyAnYWRkJyAqLworeworICAgaWYgKGluX2RpZ2l0cyA+IDApCisgICB7CisgICAgICBpbl9kaWdpdHMgPSB1YXJiX2luYyhudW0sIGluX2RpZ2l0cywgYWRkICYgMHhmZmZmKTsKKyAgICAgIHJldHVybiB1YXJiX2luYyhudW0rMSwgaW5fZGlnaXRzLTEsIGFkZCA+PiAxNikrMTsKKyAgIH0KKworICAgcmV0dXJuIHVhcmJfc2V0KG51bSwgYWRkKTsKK30KKworc3RhdGljIGludAordWFyYl9tdWx0X2RpZ2l0KHVhcmIgYWNjLCBpbnQgYV9kaWdpdHMsIHVhcmIgbnVtLCBGSVhfR0NDIGludCBuX2RpZ2l0cywKKyAgIHBuZ191aW50XzE2IHZhbCkKKyAgIC8qIFByaW1pdGl2ZSBvbmUtZGlnaXQgbXVsdGlwbHkgLSAndmFsJyBtdXN0IGJlIDAuLjY1NTM1LiBOb3RlIHRoYXQgdGhpcworICAgICogcHJpbWl0aXZlIGlzIGEgbXVsdGlwbHkgYW5kIGFjY3VtdWxhdGUgLSB0aGUgcmVzdWx0IG9mICpudW0gKiB2YWwgaXMgYWRkZWQKKyAgICAqIHRvICphY2MuCisgICAgKgorICAgICogVGhpcyBpcyBhIG9uZS1kaWdpdCBtdWx0aXBseSwgc28gdGhlIHByb2R1Y3QgbWF5IGJlIHVwIHRvIG9uZSBkaWdpdCBsb25nZXIKKyAgICAqIHRoYW4gJ251bScsIGhvd2V2ZXIgdGhlIGFkZCB0byAnYWNjJyBtZWFucyB0aGF0IHRoZSBjYWxsZXIgbXVzdCBlbnN1cmUKKyAgICAqIHRoYXQgJ2FjYycgaXMgYXQgbGVhc3Qgb25lIGRpZ2l0IGxvbmdlciB0aGFuIHRoaXMgKmFuZCogYXQgbGVhc3Qgb25lIGRpZ2l0CisgICAgKiBsb25nZXIgdGhhbiB0aGUgY3VycmVudCBsZW5ndGggb2YgJ2FjYycuICAoT3IgdGhlIGNhbGxlciBtdXN0IG90aGVyd2lzZQorICAgICogZW5zdXJlICdhZGlnaXRzJyBpcyBhZGVxdWF0ZSBmcm9tIGtub3dsZWRnZSBvZiB0aGUgdmFsdWVzLikKKyAgICAqLworeworICAgLyogVGhlIGRpZ2l0cyBpbiAqYWNjLCAqbnVtIGFuZCB2YWwgYXJlIGluIHRoZSByYW5nZSAwLi42NTUzNSwgc28gdGhlCisgICAgKiByZXN1bHQgYmVsb3cgaXMgYXQgbW9zdCAoNjU1MzUqNjU1MzUpKzIqNjU2MzUgPSA2NTUzNSooNjU1MzUrMiksIHdoaWNoIGlzCisgICAgKiBleGFjdGx5IDB4ZmZmZmZmZmYuCisgICAgKi8KKyAgIGlmICh2YWwgPiAwICYmIG5fZGlnaXRzID4gMCkgLyogRWxzZSB0aGUgcHJvZHVjdCBpcyAwICovCisgICB7CisgICAgICBwbmdfdWludF8zMiBjYXJyeSA9IDA7CisgICAgICBpbnQgb3V0X2RpZ2l0cyA9IDA7CisKKyAgICAgIHdoaWxlIChvdXRfZGlnaXRzIDwgbl9kaWdpdHMgfHwgY2FycnkgPiAwKQorICAgICAgeworICAgICAgICAgaWYgKG91dF9kaWdpdHMgPCBhX2RpZ2l0cykKKyAgICAgICAgICAgIGNhcnJ5ICs9IGFjY1tvdXRfZGlnaXRzXTsKKworICAgICAgICAgaWYgKG91dF9kaWdpdHMgPCBuX2RpZ2l0cykKKyAgICAgICAgICAgIGNhcnJ5ICs9IChwbmdfdWludF8zMiludW1bb3V0X2RpZ2l0c10gKiB2YWw7CisKKyAgICAgICAgIGFjY1tvdXRfZGlnaXRzKytdID0gKHBuZ191aW50XzE2KShjYXJyeSAmIDB4ZmZmZik7CisgICAgICAgICBjYXJyeSA+Pj0gMTY7CisgICAgICB9CisKKyAgICAgIC8qIFNvIGNhcnJ5IGlzIDAgYW5kIGFsbCB0aGUgaW5wdXQgZGlnaXRzIGhhdmUgYmVlbiBjb25zdW1lZC4gVGhpcyBtZWFucworICAgICAgICogdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBza2lwIGFueSByZW1haW5pbmcgZGlnaXRzIGluIGFjYy4KKyAgICAgICAqLworICAgICAgaWYgKG91dF9kaWdpdHMgPiBhX2RpZ2l0cykKKyAgICAgICAgIHJldHVybiBvdXRfZGlnaXRzOworICAgfQorCisgICByZXR1cm4gYV9kaWdpdHM7Cit9CisKK3N0YXRpYyBpbnQKK3VhcmJfbXVsdDMyKHVhcmIgYWNjLCBpbnQgYV9kaWdpdHMsIHVhcmIgbnVtLCBpbnQgbl9kaWdpdHMsIHBuZ191aW50XzMyIHZhbCkKKyAgIC8qIGNhbGN1bGF0ZSBhY2MgKz0gbnVtICogdmFsLCAndmFsJyBtYXkgYmUgYW55IDMyLWJpdCB2YWx1ZSwgJ2FjYycgYW5kICdudW0nCisgICAgKiBtYXkgYmUgYW55IHZhbHVlLCByZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlnaXRzIGluICdhY2MnLgorICAgICovCit7CisgICBpZiAobl9kaWdpdHMgPiAwICYmIHZhbCA+IDApCisgICB7CisgICAgICBhX2RpZ2l0cyA9IHVhcmJfbXVsdF9kaWdpdChhY2MsIGFfZGlnaXRzLCBudW0sIG5fZGlnaXRzLAorICAgICAgICAgKHBuZ191aW50XzE2KSh2YWwgJiAweGZmZmYpKTsKKworICAgICAgLyogQmVjYXVzZSBuX2RpZ2l0cyBhbmQgdmFsIGFyZSA+MCB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZTogKi8KKyAgICAgIGFzc2VydChhX2RpZ2l0cyA+IDApOworCisgICAgICB2YWwgPj49IDE2OworICAgICAgaWYgKHZhbCA+IDApCisgICAgICAgICBhX2RpZ2l0cyA9IHVhcmJfbXVsdF9kaWdpdChhY2MrMSwgYV9kaWdpdHMtMSwgbnVtLCBuX2RpZ2l0cywKKyAgICAgICAgICAgIChwbmdfdWludF8xNil2YWwpICsgMTsKKyAgIH0KKworICAgcmV0dXJuIGFfZGlnaXRzOworfQorCitzdGF0aWMgaW50Cit1YXJiX3NoaWZ0KHVhcmIgaW5vdXQsIGludCBuZGlnaXRzLCB1bnNpZ25lZCBpbnQgcmlnaHRfc2hpZnQpCisgICAvKiBTaGlmdCBpbm91dCByaWdodCBieSByaWdodF9zaGlmdCBiaXRzLCByaWdodF9zaGlmdCBtdXN0IGJlIGluIHRoZSByYW5nZQorICAgICogMS4uMTUKKyAgICAqLworeworICAgRklYX0dDQyBpbnQgaSA9IG5kaWdpdHM7CisgICBwbmdfdWludF8xNiBjYXJyeSA9IDA7CisKKyAgIGFzc2VydChyaWdodF9zaGlmdCA+PSAxICYmIHJpZ2h0X3NoaWZ0IDw9IDE1KTsKKworICAgd2hpbGUgKC0taSA+PSAwKQorICAgeworICAgICAgcG5nX3VpbnRfMTYgdGVtcCA9IChwbmdfdWludF8xNikoY2FycnkgfCAoaW5vdXRbaV0gPj4gcmlnaHRfc2hpZnQpKTsKKworICAgICAgLyogQm90dG9tIGJpdHMgdG8gdG9wIGJpdHMgb2YgY2FycnkgKi8KKyAgICAgIGNhcnJ5ID0gKHBuZ191aW50XzE2KSgoaW5vdXRbaV0gPDwgKDE2LXJpZ2h0X3NoaWZ0KSkgJiAweGZmZmYpOworCisgICAgICBpbm91dFtpXSA9IHRlbXA7CisKKyAgICAgIC8qIFRoZSBzaGlmdCBtYXkgcmVkdWNlIG5kaWdpdHMgKi8KKyAgICAgIGlmIChpID09IG5kaWdpdHMtMSAmJiB0ZW1wID09IDApCisgICAgICAgICBuZGlnaXRzID0gaTsKKyAgIH0KKworICAgcmV0dXJuIG5kaWdpdHM7Cit9CisKK3N0YXRpYyBpbnQKK3VhcmJfY21wKHVhcmIgYSwgaW50IGFkaWdpdHMsIHVhcmIgYiwgaW50IGJkaWdpdHMpCisgICAvKiBSZXR1cm4gLTEvMC8rMSBhY2NvcmRpbmcgYXMgYTxiL2E9PWIvYT5iICovCit7CisgICBpZiAoYWRpZ2l0cyA8IGJkaWdpdHMpCisgICAgICByZXR1cm4gLTE7CisKKyAgIGlmIChhZGlnaXRzID4gYmRpZ2l0cykKKyAgICAgIHJldHVybiAxOworCisgICB3aGlsZSAoYWRpZ2l0cy0tID4gMCkKKyAgICAgIGlmIChhW2FkaWdpdHNdIDwgYlthZGlnaXRzXSkKKyAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgZWxzZSBpZiAoYVthZGlnaXRzXSA+IGJbYWRpZ2l0c10pCisgICAgICAgICByZXR1cm4gMTsKKworICAgcmV0dXJuIDA7Cit9CisKKyNpZiAwIC8qVU5VU0VEKi8KK3N0YXRpYyBpbnQKK3VhcmJfZXEzMih1YXJiIG51bSwgaW50IGRpZ2l0cywgcG5nX3VpbnRfMzIgdmFsKQorICAgLyogUmV0dXJuIHRydWUgaWYgdGhlIHVhcmIgaXMgZXF1YWwgdG8gJ3ZhbCcgKi8KK3sKKyAgIHN3aXRjaCAoZGlnaXRzKQorICAgeworICAgICAgY2FzZSAwOiAgcmV0dXJuIHZhbCA9PSAwOworICAgICAgY2FzZSAxOiAgcmV0dXJuIHZhbCA9PSBudW1bMF07CisgICAgICBjYXNlIDI6ICByZXR1cm4gKHZhbCAmIDB4ZmZmZikgPT0gbnVtWzBdICYmICh2YWwgPj4gMTYpID09IG51bVsxXTsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAwOworICAgfQorfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCit1YXJiX3ByaW50eCh1YXJiIG51bSwgaW50IGRpZ2l0cywgRklMRSAqb3V0KQorICAgLyogUHJpbnQgJ251bScgYXMgYSBoZXhhZGVjaW1hbCBudW1iZXIgKGVhc2llciB0aGFuIGRlY2ltYWwhKSAqLworeworICAgd2hpbGUgKGRpZ2l0cyA+IDApCisgICAgICBpZiAobnVtWy0tZGlnaXRzXSA+IDApCisgICAgICB7CisgICAgICAgICBmcHJpbnRmKG91dCwgIjB4JXgiLCBudW1bZGlnaXRzXSk7CisKKyAgICAgICAgIHdoaWxlIChkaWdpdHMgPiAwKQorICAgICAgICAgICAgZnByaW50ZihvdXQsICIlLjR4IiwgbnVtWy0tZGlnaXRzXSk7CisgICAgICB9CisKKyAgICAgIGVsc2UgaWYgKGRpZ2l0cyA9PSAwKSAvKiB0aGUgbnVtYmVyIGlzIDAgKi8KKyAgICAgICAgIGZwdXRzKCIweDAiLCBvdXQpOworfQorCitzdGF0aWMgdm9pZAordWFyYl9wcmludCh1YXJiIG51bSwgaW50IGRpZ2l0cywgRklMRSAqb3V0KQorICAgLyogUHJpbnRzICdudW0nIGFzIGEgZGVjaW1hbCBpZiBpdCB3aWxsIGZpdCBpbiBhbiB1bnNpZ25lZCBsb25nLCBlbHNlIGFzIGEKKyAgICAqIGhleGFkZWNpbWFsIG51bWJlci4gIE5vdGljZSB0aGF0IHRoZSByZXN1bHRzIHZhcnkgZm9yIGltYWdlcyBvdmVyIDRHQnl0ZQorICAgICogaW4gYSBzeXN0ZW0gZGVwZW5kZW50IHdheSwgYW5kIHRoZSBoZXhhZGVjaW1hbCBmb3JtIGRvZXNuJ3Qgd29yayB2ZXJ5IHdlbGwKKyAgICAqIGluIGF3ayBzY3JpcHQgaW5wdXQuCisgICAgKgorICAgICoKKyAgICAqIFRPRE86IHdyaXRlIHVhcmJfZGl2MTAKKyAgICAqLworeworICAgaWYgKGRpZ2l0cyAqIHNpemVvZiAodWRpZ2l0KSA+IHNpemVvZiAodW5zaWduZWQgbG9uZykpCisgICAgICB1YXJiX3ByaW50eChudW0sIGRpZ2l0cywgb3V0KTsKKworICAgZWxzZQorICAgeworICAgICAgdW5zaWduZWQgbG9uZyBuID0gMDsKKworICAgICAgd2hpbGUgKGRpZ2l0cyA+IDApCisgICAgICAgICBuID0gKG4gPDwgMTYpICsgbnVtWy0tZGlnaXRzXTsKKworICAgICAgZnByaW50ZihvdXQsICIlbHUiLCBuKTsKKyAgIH0KK30KKworLyogR2VuZXJhdGUgcmFuZG9tIGJ5dGVzLiAgVGhpcyB1c2VzIGEgYm9yaW5nIHJlcGVhdGFibGUgYWxnb3JpdGhtIGFuZCBpdAorICogaXMgaW1wbGVtZW50ZWQgaGVyZSBzbyB0aGF0IGl0IGdpdmVzIHRoZSBzYW1lIHNldCBvZiBudW1iZXJzIG9uIGV2ZXJ5CisgKiBhcmNoaXRlY3R1cmUuICBJdCdzIGEgbGluZWFyIGNvbmdydWVudGlhbCBnZW5lcmF0b3IgKEtudXRoIG9yIFNlZGdld2ljaworICogIkFsZ29yaXRobXMiKSBidXQgaXQgY29tZXMgZnJvbSB0aGUgJ2ZlZWRiYWNrIHRhcHMnIHRhYmxlIGluIEhvcm93aXR6IGFuZAorICogSGlsbCwgIlRoZSBBcnQgb2YgRWxlY3Ryb25pY3MiIChQc2V1ZG8tUmFuZG9tIEJpdCBTZXF1ZW5jZXMgYW5kIE5vaXNlCisgKiBHZW5lcmF0aW9uLikKKyAqCisgKiAoQ29waWVkIGZyb20gY29udHJpYi9saWJ0ZXN0cy9wbmd2YWxpZC5jKQorICovCitzdGF0aWMgdm9pZAorbWFrZV9yYW5kb21fYnl0ZXMocG5nX3VpbnRfMzIqIHNlZWQsIHZvaWQqIHB2LCBzaXplX3Qgc2l6ZSkKK3sKKyAgIHBuZ191aW50XzMyIHUwID0gc2VlZFswXSwgdTEgPSBzZWVkWzFdOworICAgcG5nX2J5dGVwIGJ5dGVzID0gdm9pZGNhc3QocG5nX2J5dGVwLCBwdik7CisKKyAgIC8qIFRoZXJlIGFyZSB0aGlydHktdGhyZWUgYml0czsgdGhlIG5leHQgYml0IGluIHRoZSBzZXF1ZW5jZSBpcyBiaXQtMzMgWE9SCisgICAgKiBiaXQtMjAuICBUaGUgdG9wIDEgYml0IGlzIGluIHUxLCB0aGUgYm90dG9tIDMyIGFyZSBpbiB1MC4KKyAgICAqLworICAgc2l6ZV90IGk7CisgICBmb3IgKGk9MDsgaTxzaXplOyArK2kpCisgICB7CisgICAgICAvKiBGaXJzdCBnZW5lcmF0ZSA4IG5ldyBiaXRzIHRoZW4gc2hpZnQgdGhlbSBpbiBhdCB0aGUgZW5kLiAqLworICAgICAgcG5nX3VpbnRfMzIgdSA9ICgodTAgPj4gKDIwLTgpKSBeICgodTEgPDwgNykgfCAodTAgPj4gKDMyLTcpKSkpICYgMHhmZjsKKyAgICAgIHUxIDw8PSA4OworICAgICAgdTEgfD0gdTAgPj4gMjQ7CisgICAgICB1MCA8PD0gODsKKyAgICAgIHUwIHw9IHU7CisgICAgICAqYnl0ZXMrKyA9IChwbmdfYnl0ZSl1OworICAgfQorCisgICBzZWVkWzBdID0gdTA7CisgICBzZWVkWzFdID0gdTE7Cit9CisKKy8qIENsZWFyIGFuIG9iamVjdCB0byBhIHJhbmRvbSB2YWx1ZS4gKi8KK3N0YXRpYyB2b2lkCitjbGVhcih2b2lkICpwdiwgc2l6ZV90IHNpemUpCit7CisgICBzdGF0aWMgcG5nX3VpbnRfMzIgY2xlYXJfc2VlZFsyXSA9IHsgMHgxMjM0NTY3OCwgMHg5YWJjZGVmMCB9OworICAgbWFrZV9yYW5kb21fYnl0ZXMoY2xlYXJfc2VlZCwgcHYsIHNpemUpOworfQorCisjZGVmaW5lIENMRUFSKG9iamVjdCkgY2xlYXIoJihvYmplY3QpLCBzaXplb2YgKG9iamVjdCkpCisKKy8qIENvcGllZCBmcm9tIHVucmVsZWFzZWQgMS43IGNvZGUuCisgKgorICogQ1JDIGNoZWNraW5nIHVzZXMgYSBsb2NhbCBwcmUtYnVpbHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEV0aGVybmV0IENSQzMyLgorICogVGhpcyBpcyB0byBhdm9pZCBhIGZ1bmN0aW9uIGNhbGwgdG8gdGhlIHpsaWIgRExMIGFuZCB0byBvcHRpbWl6ZSB0aGUKKyAqIGJ5dGUtYnktYnl0ZSBjYXNlLgorICovCitzdGF0aWMgcG5nX3VpbnRfMzIgY3JjX3RhYmxlWzI1Nl0gPQoreworICAgMHgwMDAwMDAwMCwgMHg3NzA3MzA5NiwgMHhlZTBlNjEyYywgMHg5OTA5NTFiYSwgMHgwNzZkYzQxOSwKKyAgIDB4NzA2YWY0OGYsIDB4ZTk2M2E1MzUsIDB4OWU2NDk1YTMsIDB4MGVkYjg4MzIsIDB4NzlkY2I4YTQsCisgICAweGUwZDVlOTFlLCAweDk3ZDJkOTg4LCAweDA5YjY0YzJiLCAweDdlYjE3Y2JkLCAweGU3YjgyZDA3LAorICAgMHg5MGJmMWQ5MSwgMHgxZGI3MTA2NCwgMHg2YWIwMjBmMiwgMHhmM2I5NzE0OCwgMHg4NGJlNDFkZSwKKyAgIDB4MWFkYWQ0N2QsIDB4NmRkZGU0ZWIsIDB4ZjRkNGI1NTEsIDB4ODNkMzg1YzcsIDB4MTM2Yzk4NTYsCisgICAweDY0NmJhOGMwLCAweGZkNjJmOTdhLCAweDhhNjVjOWVjLCAweDE0MDE1YzRmLCAweDYzMDY2Y2Q5LAorICAgMHhmYTBmM2Q2MywgMHg4ZDA4MGRmNSwgMHgzYjZlMjBjOCwgMHg0YzY5MTA1ZSwgMHhkNTYwNDFlNCwKKyAgIDB4YTI2NzcxNzIsIDB4M2MwM2U0ZDEsIDB4NGIwNGQ0NDcsIDB4ZDIwZDg1ZmQsIDB4YTUwYWI1NmIsCisgICAweDM1YjVhOGZhLCAweDQyYjI5ODZjLCAweGRiYmJjOWQ2LCAweGFjYmNmOTQwLCAweDMyZDg2Y2UzLAorICAgMHg0NWRmNWM3NSwgMHhkY2Q2MGRjZiwgMHhhYmQxM2Q1OSwgMHgyNmQ5MzBhYywgMHg1MWRlMDAzYSwKKyAgIDB4YzhkNzUxODAsIDB4YmZkMDYxMTYsIDB4MjFiNGY0YjUsIDB4NTZiM2M0MjMsIDB4Y2ZiYTk1OTksCisgICAweGI4YmRhNTBmLCAweDI4MDJiODllLCAweDVmMDU4ODA4LCAweGM2MGNkOWIyLCAweGIxMGJlOTI0LAorICAgMHgyZjZmN2M4NywgMHg1ODY4NGMxMSwgMHhjMTYxMWRhYiwgMHhiNjY2MmQzZCwgMHg3NmRjNDE5MCwKKyAgIDB4MDFkYjcxMDYsIDB4OThkMjIwYmMsIDB4ZWZkNTEwMmEsIDB4NzFiMTg1ODksIDB4MDZiNmI1MWYsCisgICAweDlmYmZlNGE1LCAweGU4YjhkNDMzLCAweDc4MDdjOWEyLCAweDBmMDBmOTM0LCAweDk2MDlhODhlLAorICAgMHhlMTBlOTgxOCwgMHg3ZjZhMGRiYiwgMHgwODZkM2QyZCwgMHg5MTY0NmM5NywgMHhlNjYzNWMwMSwKKyAgIDB4NmI2YjUxZjQsIDB4MWM2YzYxNjIsIDB4ODU2NTMwZDgsIDB4ZjI2MjAwNGUsIDB4NmMwNjk1ZWQsCisgICAweDFiMDFhNTdiLCAweDgyMDhmNGMxLCAweGY1MGZjNDU3LCAweDY1YjBkOWM2LCAweDEyYjdlOTUwLAorICAgMHg4YmJlYjhlYSwgMHhmY2I5ODg3YywgMHg2MmRkMWRkZiwgMHgxNWRhMmQ0OSwgMHg4Y2QzN2NmMywKKyAgIDB4ZmJkNDRjNjUsIDB4NGRiMjYxNTgsIDB4M2FiNTUxY2UsIDB4YTNiYzAwNzQsIDB4ZDRiYjMwZTIsCisgICAweDRhZGZhNTQxLCAweDNkZDg5NWQ3LCAweGE0ZDFjNDZkLCAweGQzZDZmNGZiLCAweDQzNjllOTZhLAorICAgMHgzNDZlZDlmYywgMHhhZDY3ODg0NiwgMHhkYTYwYjhkMCwgMHg0NDA0MmQ3MywgMHgzMzAzMWRlNSwKKyAgIDB4YWEwYTRjNWYsIDB4ZGQwZDdjYzksIDB4NTAwNTcxM2MsIDB4MjcwMjQxYWEsIDB4YmUwYjEwMTAsCisgICAweGM5MGMyMDg2LCAweDU3NjhiNTI1LCAweDIwNmY4NWIzLCAweGI5NjZkNDA5LCAweGNlNjFlNDlmLAorICAgMHg1ZWRlZjkwZSwgMHgyOWQ5Yzk5OCwgMHhiMGQwOTgyMiwgMHhjN2Q3YThiNCwgMHg1OWIzM2QxNywKKyAgIDB4MmViNDBkODEsIDB4YjdiZDVjM2IsIDB4YzBiYTZjYWQsIDB4ZWRiODgzMjAsIDB4OWFiZmIzYjYsCisgICAweDAzYjZlMjBjLCAweDc0YjFkMjlhLCAweGVhZDU0NzM5LCAweDlkZDI3N2FmLCAweDA0ZGIyNjE1LAorICAgMHg3M2RjMTY4MywgMHhlMzYzMGIxMiwgMHg5NDY0M2I4NCwgMHgwZDZkNmEzZSwgMHg3YTZhNWFhOCwKKyAgIDB4ZTQwZWNmMGIsIDB4OTMwOWZmOWQsIDB4MGEwMGFlMjcsIDB4N2QwNzllYjEsIDB4ZjAwZjkzNDQsCisgICAweDg3MDhhM2QyLCAweDFlMDFmMjY4LCAweDY5MDZjMmZlLCAweGY3NjI1NzVkLCAweDgwNjU2N2NiLAorICAgMHgxOTZjMzY3MSwgMHg2ZTZiMDZlNywgMHhmZWQ0MWI3NiwgMHg4OWQzMmJlMCwgMHgxMGRhN2E1YSwKKyAgIDB4NjdkZDRhY2MsIDB4ZjliOWRmNmYsIDB4OGViZWVmZjksIDB4MTdiN2JlNDMsIDB4NjBiMDhlZDUsCisgICAweGQ2ZDZhM2U4LCAweGExZDE5MzdlLCAweDM4ZDhjMmM0LCAweDRmZGZmMjUyLCAweGQxYmI2N2YxLAorICAgMHhhNmJjNTc2NywgMHgzZmI1MDZkZCwgMHg0OGIyMzY0YiwgMHhkODBkMmJkYSwgMHhhZjBhMWI0YywKKyAgIDB4MzYwMzRhZjYsIDB4NDEwNDdhNjAsIDB4ZGY2MGVmYzMsIDB4YTg2N2RmNTUsIDB4MzE2ZThlZWYsCisgICAweDQ2NjliZTc5LCAweGNiNjFiMzhjLCAweGJjNjY4MzFhLCAweDI1NmZkMmEwLCAweDUyNjhlMjM2LAorICAgMHhjYzBjNzc5NSwgMHhiYjBiNDcwMywgMHgyMjAyMTZiOSwgMHg1NTA1MjYyZiwgMHhjNWJhM2JiZSwKKyAgIDB4YjJiZDBiMjgsIDB4MmJiNDVhOTIsIDB4NWNiMzZhMDQsIDB4YzJkN2ZmYTcsIDB4YjVkMGNmMzEsCisgICAweDJjZDk5ZThiLCAweDViZGVhZTFkLCAweDliNjRjMmIwLCAweGVjNjNmMjI2LCAweDc1NmFhMzljLAorICAgMHgwMjZkOTMwYSwgMHg5YzA5MDZhOSwgMHhlYjBlMzYzZiwgMHg3MjA3Njc4NSwgMHgwNTAwNTcxMywKKyAgIDB4OTViZjRhODIsIDB4ZTJiODdhMTQsIDB4N2JiMTJiYWUsIDB4MGNiNjFiMzgsIDB4OTJkMjhlOWIsCisgICAweGU1ZDViZTBkLCAweDdjZGNlZmI3LCAweDBiZGJkZjIxLCAweDg2ZDNkMmQ0LCAweGYxZDRlMjQyLAorICAgMHg2OGRkYjNmOCwgMHgxZmRhODM2ZSwgMHg4MWJlMTZjZCwgMHhmNmI5MjY1YiwgMHg2ZmIwNzdlMSwKKyAgIDB4MThiNzQ3NzcsIDB4ODgwODVhZTYsIDB4ZmYwZjZhNzAsIDB4NjYwNjNiY2EsIDB4MTEwMTBiNWMsCisgICAweDhmNjU5ZWZmLCAweGY4NjJhZTY5LCAweDYxNmJmZmQzLCAweDE2NmNjZjQ1LCAweGEwMGFlMjc4LAorICAgMHhkNzBkZDJlZSwgMHg0ZTA0ODM1NCwgMHgzOTAzYjNjMiwgMHhhNzY3MjY2MSwgMHhkMDYwMTZmNywKKyAgIDB4NDk2OTQ3NGQsIDB4M2U2ZTc3ZGIsIDB4YWVkMTZhNGEsIDB4ZDlkNjVhZGMsIDB4NDBkZjBiNjYsCisgICAweDM3ZDgzYmYwLCAweGE5YmNhZTUzLCAweGRlYmI5ZWM1LCAweDQ3YjJjZjdmLCAweDMwYjVmZmU5LAorICAgMHhiZGJkZjIxYywgMHhjYWJhYzI4YSwgMHg1M2IzOTMzMCwgMHgyNGI0YTNhNiwgMHhiYWQwMzYwNSwKKyAgIDB4Y2RkNzA2OTMsIDB4NTRkZTU3MjksIDB4MjNkOTY3YmYsIDB4YjM2NjdhMmUsIDB4YzQ2MTRhYjgsCisgICAweDVkNjgxYjAyLCAweDJhNmYyYjk0LCAweGI0MGJiZTM3LCAweGMzMGM4ZWExLCAweDVhMDVkZjFiLAorICAgMHgyZDAyZWY4ZAorfTsKKworLyogVGhlIENSQyBjYWxjdWxhdGVkIGhlcmUgKklTKiBjb25kaXRpb25lZCwgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgdXNlZCBieQorICogemxpYiBhbmQgdGhlIHJlc3VsdCB2YWx1ZSBpcyBvYnRhaW5lZCBieSBYT1Jpbmcgd2l0aCBDUkNfSU5JVCwgd2hpY2ggaXMgYWxzbworICogdGhlIGZpcnN0IHZhbHVlIHRoYXQgbXVzdCBiZSBwYXNzZWQgaW4gKGZvciB0aGUgZmlyc3QgYnl0ZSkgdG8gY3JjX29uZV9ieXRlLgorICovCisjZGVmaW5lIENSQ19JTklUIDB4ZmZmZmZmZmYKKworc3RhdGljIHBuZ191aW50XzMyCitjcmNfb25lX2J5dGUocG5nX3VpbnRfMzIgY3JjLCBpbnQgYikKK3sKKyAgIHJldHVybiBjcmNfdGFibGVbKGNyYyBeIGIpICYgMHhmZl0gXiAoY3JjID4+IDgpOworfQorCitzdGF0aWMgcG5nX3VpbnRfMzIKK2NyY19pbml0XzQocG5nX3VpbnRfMzIgdmFsdWUpCit7CisgICAvKiBUaGlzIGlzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSBhbGdvcml0aG0gdXNlZCBpbiB6bGliLCB3aGljaCByZXF1aXJlcyBmb3VyCisgICAgKiBzZXBhcmF0ZSB0YWJsZXMgdG8gcGFyYWxsZWxpemUgdGhlIGZvdXIgYnl0ZSBvcGVyYXRpb25zLCBpdCBvbmx5IHdvcmtzIGZvcgorICAgICogYSBDUkMgb2YgdGhlIGZpcnN0IGZvdXIgYnl0ZXMgb2YgdGhlIHN0cmVhbSwgYnV0IHRoaXMgaXMgd2hhdCBoYXBwZW5zIGluCisgICAgKiB0aGUgcGFyc2VyIGJlbG93IHdoZXJlIGxlbmd0aCtjaHVuay1uYW1lIGlzIHJlYWQgYW5kIGNodW5rLW5hbWUgdXNlZCB0bworICAgICogaW5pdGlhbGl6ZSB0aGUgQ1JDLiAgTm90aWNlIHRoYXQgdGhlIGNhbGN1bGF0aW9uIGhlcmUgYXZvaWRzIHJlcGVhdGVkCisgICAgKiBjb25kaXRpb25pbmcgKHhvciB3aXRoIDB4ZmZmZmZmZmYpIGJ5IHN0b3JpbmcgdGhlIGNvbmRpdGlvbmVkIHZhbHVlLgorICAgICovCisgICBwbmdfdWludF8zMiBjcmMgPSBjcmNfdGFibGVbKH52YWx1ZSA+PiAyNCldIF4gMHhmZmZmZmY7CisKKyAgIGNyYyA9IGNyY190YWJsZVsoY3JjIF4gKHZhbHVlID4+IDE2KSkgJiAweGZmXSBeIChjcmMgPj4gOCk7CisgICBjcmMgPSBjcmNfdGFibGVbKGNyYyBeICh2YWx1ZSA+PiA4KSkgJiAweGZmXSBeIChjcmMgPj4gOCk7CisgICByZXR1cm4gY3JjX3RhYmxlWyhjcmMgXiB2YWx1ZSkgJiAweGZmXSBeIChjcmMgPj4gOCk7Cit9CisKK3N0YXRpYyBpbnQKK2NodW5rX3R5cGVfdmFsaWQocG5nX3VpbnRfMzIgYykKKyAgIC8qIEJpdCB3aGFja2luZyBhcHByb2FjaCB0byBjaHVuayBuYW1lIHZhbGlkYXRpb24gdGhhdCBpcyBpbnRlbmRlZCB0byBhdm9pZAorICAgICogYnJhbmNoZXMuICBUaGUgY29zdCBpcyB0aGF0IGl0IHVzZXMgYSBsb3Qgb2YgMzItYml0IGNvbnN0YW50cywgd2hpY2ggbWlnaHQKKyAgICAqIGJlIGJhZCBvbiBzb21lIGFyY2hpdGVjdHVyZXMuCisgICAgKi8KK3sKKyAgIHBuZ191aW50XzMyIHQ7CisKKyAgIC8qIFJlbW92ZSBiaXQgNSBmcm9tIGFsbCBidXQgdGhlIHJlc2VydmVkIGJ5dGU7IHRoaXMgbWVhbnMgZXZlcnkKKyAgICAqIDgtYml0IHVuaXQgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgNjUtOTAgdG8gYmUgdmFsaWQuICBTbyBiaXQgNQorICAgICogbXVzdCBiZSB6ZXJvLCBiaXQgNiBtdXN0IGJlIHNldCBhbmQgYml0IDcgemVyby4KKyAgICAqLworICAgYyAmPSB+UE5HX1UzMigzMiwzMiwwLDMyKTsKKyAgIHQgPSAoYyAmIH4weDFmMWYxZjFmKSBeIDB4NDA0MDQwNDA7CisKKyAgIC8qIFN1YnRyYWN0IDY1IGZvciBlYWNoIDgtYml0IHF1YW50aXR5LCB0aGlzIG11c3Qgbm90IG92ZXJmbG93CisgICAgKiBhbmQgZWFjaCBieXRlIG11c3QgdGhlbiBiZSBpbiB0aGUgcmFuZ2UgMC0yNS4KKyAgICAqLworICAgYyAtPSBQTkdfVTMyKDY1LDY1LDY1LDY1KTsKKyAgIHQgfD1jIDsKKworICAgLyogU3VidHJhY3QgMjYsIGhhbmRsaW5nIHRoZSBvdmVyZmxvdyB3aGljaCBzaG91bGQgc2V0IHRoZSB0b3AKKyAgICAqIHRocmVlIGJpdHMgb2YgZWFjaCBieXRlLgorICAgICovCisgICBjIC09IFBOR19VMzIoMjUsMjUsMjUsMjYpOworICAgdCB8PSB+YzsKKworICAgcmV0dXJuICh0ICYgMHhlMGUwZTBlMCkgPT0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ09OVFJPTCBJTkZPUk1BVElPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSW5mb3JtYXRpb24gYWJvdXQgYSBzZXF1ZW5jZSBvZiBJREFUIGNodW5rcywgdGhlIGNodW5rcyBoYXZlIGJlZW4gcmUtc3luY2VkCisgKiB1c2luZyBzeW5jX3N0cmVhbSBiZWxvdyBhbmQgdGhlIG5ldyBsZW5ndGhzIGFyZSByZWNvcmRlZCBoZXJlLiAgQmVjYXVzZSB0aGUKKyAqIG51bWJlciBvZiBjaHVua3MgaXMgdW5saW1pdGVkIHRoaXMgaXMgaGFuZGxlZCB1c2luZyBhIGxpbmtlZCBsaXN0IG9mIHRoZXNlCisgKiBzdHJ1Y3R1cmVzLgorICovCitzdHJ1Y3QgSURBVF9saXN0Cit7CisgICBzdHJ1Y3QgSURBVF9saXN0ICpuZXh0OyAgICAgLyogTGlua2VkIGxpc3QgKi8KKyAgIHVuc2lnbmVkIGludCAgICAgIGxlbmd0aDsgICAvKiBBY3R1YWwgbGVuZ3RoIG9mIHRoZSBhcnJheSBiZWxvdyAqLworICAgdW5zaWduZWQgaW50ICAgICAgY291bnQ7ICAgIC8qIE51bWJlciBvZiBlbnRyaWVzIHRoYXQgYXJlIHZhbGlkICovCisjICAgICBkZWZpbmUgSURBVF9JTklUX0xFTkdUSCAxNgorICAgcG5nX3VpbnRfMzIgICAgICAgbGVuZ3Roc1tJREFUX0lOSVRfTEVOR1RIXTsKK307CisKK3N0YXRpYyB2b2lkCitJREFUX2xpc3RfaW5pdChzdHJ1Y3QgSURBVF9saXN0ICpsaXN0KQoreworICAgQ0xFQVIoKmxpc3QpOworCisgICBsaXN0LT5uZXh0ID0gTlVMTDsKKyAgIGxpc3QtPmxlbmd0aCA9IElEQVRfSU5JVF9MRU5HVEg7Cit9CisKK3N0YXRpYyBzaXplX3QKK0lEQVRfbGlzdF9zaXplKHN0cnVjdCBJREFUX2xpc3QgKmxpc3QsIHVuc2lnbmVkIGludCBsZW5ndGgpCisgICAvKiBSZXR1cm4gdGhlIHNpemUgaW4gYnl0ZXMgb2YgYW4gSURBVF9saXN0IG9mIHRoZSBnaXZlbiBsZW5ndGguICovCit7CisgICBpZiAobGlzdCAhPSBOVUxMKQorICAgICAgbGVuZ3RoID0gbGlzdC0+bGVuZ3RoOworCisgICByZXR1cm4gc2l6ZW9mICpsaXN0IC0gc2l6ZW9mIGxpc3QtPmxlbmd0aHMgKworICAgICAgbGVuZ3RoICogc2l6ZW9mIGxpc3QtPmxlbmd0aHNbMF07Cit9CisKK3N0YXRpYyB2b2lkCitJREFUX2xpc3RfZW5kKHN0cnVjdCBJREFUX2xpc3QgKklEQVRfbGlzdCkKK3sKKyAgIHN0cnVjdCBJREFUX2xpc3QgKmxpc3QgPSBJREFUX2xpc3QtPm5leHQ7CisKKyAgIENMRUFSKCpJREFUX2xpc3QpOworCisgICB3aGlsZSAobGlzdCAhPSBOVUxMKQorICAgeworICAgICAgc3RydWN0IElEQVRfbGlzdCAqbmV4dCA9IGxpc3QtPm5leHQ7CisKKyAgICAgIGNsZWFyKGxpc3QsIElEQVRfbGlzdF9zaXplKGxpc3QsIDApKTsKKyAgICAgIGZyZWUobGlzdCk7CisgICAgICBsaXN0ID0gbmV4dDsKKyAgIH0KK30KKworc3RhdGljIHN0cnVjdCBJREFUX2xpc3QgKgorSURBVF9saXN0X2V4dGVuZChzdHJ1Y3QgSURBVF9saXN0ICp0YWlsKQoreworICAgLyogVXNlIHRoZSBwcmV2aW91cyBjYWNoZWQgdmFsdWUgaWYgYXZhaWxhYmxlLiAqLworICAgc3RydWN0IElEQVRfbGlzdCAqbmV4dCA9IHRhaWwtPm5leHQ7CisKKyAgIGlmIChuZXh0ID09IE5VTEwpCisgICB7CisgICAgICAvKiBJbnNlcnQgYSBuZXcsIG1hbGxvYydlZCwgYmxvY2sgb2YgSURBVCBpbmZvcm1hdGlvbiBidWZmZXJzLCB0aGlzCisgICAgICAgKiBvbmUgdHdpY2UgYXMgbGFyZ2UgYXMgdGhlIHByZXZpb3VzIG9uZToKKyAgICAgICAqLworICAgICAgdW5zaWduZWQgaW50IGxlbmd0aCA9IDIgKiB0YWlsLT5sZW5ndGg7CisKKyAgICAgIGlmIChsZW5ndGggPCB0YWlsLT5sZW5ndGgpIC8qIGFyaXRobWV0aWMgb3ZlcmZsb3cgKi8KKyAgICAgICAgIGxlbmd0aCA9IHRhaWwtPmxlbmd0aDsKKworICAgICAgbmV4dCA9IHZvaWRjYXN0KElEQVRfbGlzdCosIG1hbGxvYyhJREFUX2xpc3Rfc2l6ZShOVUxMLCBsZW5ndGgpKSk7CisgICAgICBDTEVBUigqbmV4dCk7CisKKyAgICAgIC8qIFRoZSBjYWxsZXIgbXVzdCBoYW5kbGUgdGhpczogKi8KKyAgICAgIGlmIChuZXh0ID09IE5VTEwpCisgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgbmV4dC0+bmV4dCA9IE5VTEw7CisgICAgICBuZXh0LT5sZW5ndGggPSBsZW5ndGg7CisgICAgICB0YWlsLT5uZXh0ID0gbmV4dDsKKyAgIH0KKworICAgcmV0dXJuIG5leHQ7Cit9CisKKy8qIEdMT0JBTCBDT05UUk9MIFNUUlVDVFVSRSAqLworc3RydWN0IGdsb2JhbAoreworICAgLyogUFVCTElDIEdMT0JBTCBWQVJJQUJMRVM6IE9XTkVSIElOSVRJQUxJWkUgKi8KKyAgIHVuc2lnbmVkIGludCAgIGVycm9ycyAgICAgICAgOjE7IC8qIHByaW50IGZpbGUgZXJyb3JzIHRvIHN0ZGVyciAqLworICAgdW5zaWduZWQgaW50ICAgd2FybmluZ3MgICAgICA6MTsgLyogcHJpbnQgbGlicG5nIHdhcm5pbmdzIHRvIHN0ZGVyciAqLworICAgdW5zaWduZWQgaW50ICAgb3B0aW1pemVfemxpYiA6MTsgLyogUnVuIG9wdGltaXphdGlvbiBzZWFyY2ggKi8KKyAgIHVuc2lnbmVkIGludCAgIHF1aWV0ICAgICAgICAgOjI7IC8qIGRvbid0IG91dHB1dCBzdW1tYXJpZXMgKi8KKyAgIHVuc2lnbmVkIGludCAgIHZlcmJvc2UgICAgICAgOjM7IC8qIHZhcmlvdXMgaW50ZXJuYWwgdHJhY2tpbmcgKi8KKyAgIHVuc2lnbmVkIGludCAgIHNraXAgICAgICAgICAgOjM7IC8qIE5vbi1jcml0aWNhbCBjaHVua3MgdG8gc2tpcCAqLworIyAgICAgZGVmaW5lIFNLSVBfTk9ORSAgICAgIDAKKyMgICAgIGRlZmluZSBTS0lQX0JBRF9DUkMgICAxICAgIC8qIENodW5rcyB3aXRoIGEgYmFkIENSQyAqLworIyAgICAgZGVmaW5lIFNLSVBfVU5TQUZFICAgIDIgICAgLyogQ2h1bmtzIG5vdCBzYWZlIHRvIGNvcHkgKi8KKyMgICAgIGRlZmluZSBTS0lQX1VOVVNFRCAgICAzICAgIC8qIENodW5rcyBub3QgdXNlZCBieSBsaWJwbmcgKi8KKyMgICAgIGRlZmluZSBTS0lQX1RSQU5TRk9STSA0ICAgIC8qIENodW5rcyBvbmx5IHVzZWQgaW4gdHJhbnNmb3JtcyAqLworIyAgICAgZGVmaW5lIFNLSVBfQ09MT1IgICAgIDUgICAgLyogRXZlcnl0aGluZyBidXQgdFJOUywgc0JJVCwgZ0FNQSBhbmQgc1JHQiAqLworIyAgICAgZGVmaW5lIFNLSVBfQUxMICAgICAgIDYgICAgLyogRXZlcnl0aGluZyBidXQgdFJOUyBhbmQgc0JJVCAqLworCisgICBwbmdfdWludF8zMiAgICBpZGF0X21heDsgICAgICAgICAvKiAwIHRvIHBlcmZvcm0gbm8gcmUtY2h1bmtpbmcgKi8KKworICAgaW50ICAgICAgICAgICAgc3RhdHVzX2NvZGU7ICAgICAgLyogQWNjdW11bGF0ZWQgc3RhdHVzIGNvZGUgKi8KKyMgICAgIGRlZmluZSBUT09fRkFSX0JBQ0sgICAweDAxIC8qIGZvdW5kIGEgdG9vLWZhci1iYWNrIGVycm9yICovCisjICAgICBkZWZpbmUgQ1JDX0VSUk9SICAgICAgMHgwMiAvKiBmaXhlZCBhbiBpbnZhbGlkIENSQyAqLworIyAgICAgZGVmaW5lIFNUUkVBTV9FUlJPUiAgIDB4MDQgLyogZGFtYWdlZCBQTkcgc3RyZWFtIChtYXkgYmUgZml4YWJsZSkgKi8KKyMgICAgIGRlZmluZSBUUlVOQ0FURUQgICAgICAweDA4IC8qIHRydW5jYXRlZCBidXQgc3RpbGwgcmVhZGFibGUgKi8KKyMgICAgIGRlZmluZSBGSUxFX0VSUk9SICAgICAweDEwIC8qIGNvdWxkIG5vdCByZWFkIHRoZSBmaWxlICovCisjICAgICBkZWZpbmUgV1JJVEVfRVJST1IgICAgMHgyMCAvKiB3cml0ZSBlcnJvciAodGhpcyB0ZXJtaW5hdGVzIHRoZSByZWFkKSAqLworIyAgICAgZGVmaW5lIElOVEVSTkFMX0VSUk9SIDB4NDAgLyogaW50ZXJuYWwgbGltaXRzL2Vycm9ycyBlbmNvdW50ZXJlZCAqLworCisgICAvKiBQVUJMSUMgR0xPQkFMIFZBUklBQkxFUzogVVNFRCBJTlRFUk5BTExZIEJZIElEQVQgUkVBRCBDT0RFICovCisgICBzdHJ1Y3QgSURBVF9saXN0IGlkYXRfY2FjaGU7ICAvKiBDYWNoZSBvZiBmaWxlIElEQVQgaW5mb3JtYXRpb24gYnVmZmVycyAqLworICAgICAgLyogVGhlIHN0cnVjdHVyZSBpcyBzaGFyZWQgYWNyb3NzIGFsbCB1c2VzIG9mIHRoaXMgZ2xvYmFsIGNvbnRyb2wKKyAgICAgICAqIHN0cnVjdHVyZSB0byBhdm9pZCByZWFsbG9jYXRpb24gYmV0d2VlbiBJREFUIHN0cmVhbXMuCisgICAgICAgKi8KK307CisKK3N0YXRpYyBpbnQKK2dsb2JhbF9lbmQoc3RydWN0IGdsb2JhbCAqZ2xvYmFsKQoreworCisgICBpbnQgcmM7CisKKyAgIElEQVRfbGlzdF9lbmQoJmdsb2JhbC0+aWRhdF9jYWNoZSk7CisgICByYyA9IGdsb2JhbC0+c3RhdHVzX2NvZGU7CisgICBDTEVBUigqZ2xvYmFsKTsKKyAgIHJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQKK2dsb2JhbF9pbml0KHN0cnVjdCBnbG9iYWwgKmdsb2JhbCkKKyAgIC8qIENhbGwgdGhpcyBvbmNlIChhbmQgb25seSBvbmNlKSB0byBpbml0aWFsaXplIHRoZSBjb250cm9sICovCit7CisgICBDTEVBUigqZ2xvYmFsKTsKKworICAgLyogR2xvYmFscyAqLworICAgZ2xvYmFsLT5lcnJvcnMgICAgICAgID0gMDsKKyAgIGdsb2JhbC0+d2FybmluZ3MgICAgICA9IDA7CisgICBnbG9iYWwtPnF1aWV0ICAgICAgICAgPSAwOworICAgZ2xvYmFsLT52ZXJib3NlICAgICAgID0gMDsKKyAgIGdsb2JhbC0+aWRhdF9tYXggICAgICA9IDA7ICAgICAgICAgLyogbm8gcmUtY2h1bmtpbmcgb2YgSURBVCAqLworICAgZ2xvYmFsLT5vcHRpbWl6ZV96bGliID0gMDsKKyAgIGdsb2JhbC0+c2tpcCAgICAgICAgICA9IFNLSVBfTk9ORTsKKyAgIGdsb2JhbC0+c3RhdHVzX2NvZGUgICA9IDA7CisKKyAgIElEQVRfbGlzdF9pbml0KCZnbG9iYWwtPmlkYXRfY2FjaGUpOworfQorCitzdGF0aWMgaW50Citza2lwX2NodW5rX3R5cGUoY29uc3Qgc3RydWN0IGdsb2JhbCAqZ2xvYmFsLCBwbmdfdWludF8zMiB0eXBlKQorICAgLyogUmV0dXJuIHRydWUgaWYgdGhpcyBjaHVuayBpcyB0byBiZSBza2lwcGVkIGFjY29yZGluZyB0byB0aGUgLS1zdHJpcAorICAgICogb3B0aW9uLiAgVGhpcyBjb2RlIG5lZWRzIHRvIHJlY29nbml6ZSBhbGwga25vd24gYW5jaWxsYXJ5IGNodW5rcyBpbiBvcmRlcgorICAgICogdG8gaGFuZGxlIHRoZSAtLXN0cmlwPXVuc2FmZSBvcHRpb24uCisgICAgKi8KK3sKKyAgIC8qIE5ldmVyIHN0cmlwIGNyaXRpY2FsIGNodW5rczogKi8KKyAgIGlmIChDUklUSUNBTCh0eXBlKSkKKyAgICAgIHJldHVybiAwOworCisgICBzd2l0Y2ggKHR5cGUpCisgICB7CisgICAgICAvKiBDaHVua3MgdGhhdCBhcmUgdHJlYXRlZCBhcywgZWZmZWN0aXZlbHksIGNyaXRpY2FsIGJlY2F1c2UgdGhleSBhZmZlY3QKKyAgICAgICAqIGNvcnJlY3QgaW50ZXJwcmV0YXRpb24gb2YgdGhlIHBpeGVsIHZhbHVlczoKKyAgICAgICAqLworICAgICAgY2FzZSBwbmdfdFJOUzogY2FzZSBwbmdfc0JJVDoKKyAgICAgICAgIHJldHVybiAwOworCisgICAgICAvKiBDaHVua3MgdGhhdCBzcGVjaWZ5IGdhbW1hIGVuY29kaW5nIHdoaWNoIHNob3VsZCB0aGVyZWZvcmUgb25seSBiZQorICAgICAgICogcmVtb3ZlZCB0aGUgdGhlIHVzZXIgaW5zaXN0czoKKyAgICAgICAqLworICAgICAgY2FzZSBwbmdfZ0FNQTogY2FzZSBwbmdfc1JHQjoKKyAgICAgICAgIGlmIChnbG9iYWwtPnNraXAgPj0gU0tJUF9BTEwpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgIHJldHVybiAwOworCisgICAgICAvKiBDaHVua3MgdGhhdCBhZmZlY3QgY29sb3IgaW50ZXJwcmV0YXRpb24gLSBub3QgdXNlZCBieSBsaWJwbmcgYW5kIHJhcmVseQorICAgICAgICogdXNlZCBieSBhcHBsaWNhdGlvbnMsIGJ1dCB0ZWNobmljYWxseSBzdGlsbCByZXF1aXJlZCBmb3IgY29ycmVjdAorICAgICAgICogaW50ZXJwcmV0YXRpb24gb2YgdGhlIGltYWdlIGRhdGE6CisgICAgICAgKi8KKyAgICAgIGNhc2UgcG5nX2NIUk06IGNhc2UgcG5nX2lDQ1A6CisgICAgICAgICBpZiAoZ2xvYmFsLT5za2lwID49IFNLSVBfQ09MT1IpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgIHJldHVybiAwOworCisgICAgICAvKiBPdGhlciBjaHVua3MgdGhhdCBhcmUgdXNlZCBieSBsaWJwbmcgaW4gaW1hZ2UgdHJhbnNmb3JtYXRpb25zIChhcworICAgICAgICogb3Bwb3NlZCB0byBrbm93biBjaHVua3MgdGhhdCBoYXZlIGdldC9zZXQgQVBJcyBidXQgYXJlIG5vdCBvdGhlcndpc2UKKyAgICAgICAqIHVzZWQuKQorICAgICAgICovCisgICAgICBjYXNlIHBuZ19iS0dEOgorICAgICAgICAgaWYgKGdsb2JhbC0+c2tpcCA+PSBTS0lQX1RSQU5TRk9STSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgIC8qIEFsbCBvdGhlciBjaHVua3MgdGhhdCBsaWJwbmcga25vd3MgYWJvdXQgYW5kIGFmZmVjdCBuZWl0aGVyIGltYWdlCisgICAgICAgKiBpbnRlcnByZXRhdGlvbiBub3IgbGlicG5nIHRyYW5zZm9ybXMgLSBjaHVua3MgdGhhdCBhcmUgZWZmZWN0aXZlbHkKKyAgICAgICAqIHVudXNlZCBieSBsaWJwbmcgZXZlbiB0aG91Z2ggbGlicG5nIG1pZ2h0IHJlY29nbml6ZSBhbmQgc3RvcmUgdGhlbS4KKyAgICAgICAqLworICAgICAgY2FzZSBwbmdfZlJBYzogY2FzZSBwbmdfZ0lGZzogY2FzZSBwbmdfZ0lGdDogY2FzZSBwbmdfZ0lGeDogY2FzZSBwbmdfaElTVDoKKyAgICAgIGNhc2UgcG5nX2lUWHQ6IGNhc2UgcG5nX29GRnM6IGNhc2UgcG5nX3BDQUw6IGNhc2UgcG5nX3BIWXM6IGNhc2UgcG5nX3NDQUw6CisgICAgICBjYXNlIHBuZ19zUExUOiBjYXNlIHBuZ19zVEVSOiBjYXNlIHBuZ190RVh0OiBjYXNlIHBuZ190SU1FOiBjYXNlIHBuZ196VFh0OgorICAgICAgICAgaWYgKGdsb2JhbC0+c2tpcCA+PSBTS0lQX1VOVVNFRCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgIC8qIENodW5rcyB0aGF0IGxpYnBuZyBkb2VzIG5vdCBrbm93IGFib3V0IChub3RpY2UgdGhhdCB0aGlzIGRlcGVuZHMgb24gdGhlCisgICAgICAgKiBsaXN0IGFib3ZlIGluY2x1ZGluZyBhbGwga25vd24gY2h1bmtzISkgIFRoZSBkZWNpc2lvbiBoZXJlIGRlcGVuZHMgb24KKyAgICAgICAqIHdoZXRoZXIgdGhlIHNhZmUtdG8tY29weSBiaXQgaXMgc2V0IGluIHRoZSBjaHVuayB0eXBlLgorICAgICAgICovCisgICAgICBkZWZhdWx0OgorICAgICAgICAgaWYgKFNBRkVfVE9fQ09QWSh0eXBlKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChnbG9iYWwtPnNraXAgPj0gU0tJUF9VTlVTRUQpIC8qIGFzIGFib3ZlICovCisgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgIH0KKworICAgICAgICAgZWxzZSBpZiAoZ2xvYmFsLT5za2lwID49IFNLSVBfVU5TQUZFKQorICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgIHJldHVybiAwOworICAgfQorfQorCisvKiBQRVItRklMRSBDT05UUk9MIFNUUlVDVFVSRSAqLworc3RydWN0IGNodW5rOworc3RydWN0IElEQVQ7CitzdHJ1Y3QgZmlsZQoreworICAgLyogQU5DRVNUT1JTICovCisgICBzdHJ1Y3QgZ2xvYmFsICpnbG9iYWw7CisKKyAgIC8qIFBVQkxJQyBQRVItRklMRSBWQVJJQUJMRVM6IENBTExFUiBJTklUSUFMSVpFICovCisgICBjb25zdCBjaGFyICogICBmaWxlX25hbWU7CisgICBjb25zdCBjaGFyICogICBvdXRfbmFtZTsgICAgICAvKiBOYW1lIG9mIG91dHB1dCBmaWxlIChpZiByZXF1aXJlZCkgKi8KKworICAgLyogUFVCTElDIFBFUi1GSUxFIFZBUklBQkxFUzogU0VUIEJZIFBORyBSRUFEIENPREUgKi8KKyAgIC8qIEZpbGUgc3BlY2lmaWMgcmVzdWx0IGNvZGVzICovCisgICBpbnQgICAgICAgICAgICBzdGF0dXNfY29kZTsgICAvKiBTZXQgdG8gYSBiaXQgbWFzayBvZiB0aGUgZm9sbG93aW5nOiAqLworICAgaW50ICAgICAgICAgICAgcmVhZF9lcnJubzsgICAgLyogUmVjb3JkcyBhIHJlYWQgZXJyb3IgZXJybm8gKi8KKyAgIGludCAgICAgICAgICAgIHdyaXRlX2Vycm5vOyAgIC8qIFJlY29yZHMgYSB3cml0ZSBlcnJvciBlcnJubyAqLworCisgICAvKiBJSERSIGluZm9ybWF0aW9uICovCisgICBwbmdfdWludF8zMiAgICB3aWR0aDsKKyAgIHBuZ191aW50XzMyICAgIGhlaWdodDsKKyAgIHBuZ19ieXRlICAgICAgIGJpdF9kZXB0aDsKKyAgIHBuZ19ieXRlICAgICAgIGNvbG9yX3R5cGU7CisgICBwbmdfYnl0ZSAgICAgICBjb21wcmVzc2lvbl9tZXRob2Q7CisgICBwbmdfYnl0ZSAgICAgICBmaWx0ZXJfbWV0aG9kOworICAgcG5nX2J5dGUgICAgICAgaW50ZXJsYWNlX21ldGhvZDsKKworICAgdWRpZ2l0ICAgICAgICAgaW1hZ2VfYnl0ZXNbNV07CisgICBpbnQgICAgICAgICAgICBpbWFnZV9kaWdpdHM7CisKKyAgIC8qIFBST1RFQ1RFRCBQRVItRklMRSBWQVJJQUJMRVM6IFVTRUQgQlkgVEhFIFJFQUQgQ09ERSAqLworICAgRklMRSAqICAgICAgICAgZmlsZTsgICAgICAgICAgLyogT3JpZ2luYWwgUE5HIGZpbGUgKi8KKyAgIEZJTEUgKiAgICAgICAgIG91dDsgICAgICAgICAgIC8qIElmIGEgbmV3IG9uZSBpcyBiZWluZyB3cml0dGVuICovCisgICBqbXBfYnVmICAgICAgICBqbXBidWY7ICAgICAgICAvKiBTZXQgd2hpbGUgcmVhZGluZyBhIFBORyAqLworCisgICAvKiBQUk9URUNURUQgQ0hVTksgU1BFQ0lGSUMgVkFSSUFCTEVTOiBVU0VEIEJZIENIVU5LIENPREUgKi8KKyAgIC8qIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGFyZSB1c2VkIGR1cmluZyByZWFkaW5nIHRvIHJlY29yZCB0aGUgbGVuZ3RoLCB0eXBlCisgICAgKiBhbmQgZGF0YSBwb3NpdGlvbiBvZiB0aGUgKm5leHQqIGNodW5rIG9yLCByaWdodCBhdCB0aGUgc3RhcnQsIHRoZQorICAgICogc2lnbmF0dXJlIChpbiBsZW5ndGgsdHlwZSkuCisgICAgKgorICAgICogV2hlbiBhIGNodW5rIGNvbnRyb2wgc3RydWN0dXJlIGlzIGluc3RhbnRpYXRlZCB0aGVzZSB2YWx1ZXMgYXJlIGNvcGllZAorICAgICogaW50byB0aGUgc3RydWN0dXJlIGFuZCBjYW4gdGhlbiBiZSBvdmVycml0dGVuIHdpdGggdGhlIGRhdGEgZm9yIHRoZSBuZXh0CisgICAgKiBjaHVuay4KKyAgICAqLworICAgZnBvc190ICAgICAgICAgZGF0YV9wb3M7ICAgICAgLyogUG9zaXRpb24gb2YgZmlyc3QgYnl0ZSBvZiBjaHVuayBkYXRhICovCisgICBwbmdfdWludF8zMiAgICBsZW5ndGg7ICAgICAgICAvKiBGaXJzdCB3b3JkIChsZW5ndGggb3Igc2lnbmF0dXJlIHN0YXJ0KSAqLworICAgcG5nX3VpbnRfMzIgICAgdHlwZTsgICAgICAgICAgLyogU2Vjb25kIHdvcmQgKHR5cGUgb3Igc2lnbmF0dXJlIGVuZCkgKi8KKyAgIHBuZ191aW50XzMyICAgIGNyYzsgICAgICAgICAgIC8qIFJ1bm5pbmcgY2h1bmsgQ1JDICh1c2VkIGJ5IHJlYWRfY2h1bmspICovCisKKyAgIC8qIFRoZXNlIGNvdW50cyBhcmUgbWFpbnRhaW5lZCBieSB0aGUgcmVhZCBhbmQgd3JpdGUgcm91dGluZXMgYmVsb3cgYW5kIGFyZQorICAgICogcmVzZXQgYnkgdGhlIGNodW5rIGhhbmRsaW5nIGNvZGUuICBUaGV5IHJlY29yZCB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzCisgICAgKiByZWFkIG9yIHdyaXR0ZW4gZm9yIHRoZSBjaHVuaywgaW5jbHVkaW5nIHRoZSBoZWFkZXIgKGxlbmd0aCx0eXBlKSBieXRlcy4KKyAgICAqLworICAgcG5nX3VpbnRfMzIgICAgcmVhZF9jb3VudDsgICAgLyogQ291bnQgb2YgYnl0ZXMgcmVhZCAoaW4gdGhlIGNodW5rKSAqLworICAgcG5nX3VpbnRfMzIgICAgd3JpdGVfY291bnQ7ICAgLyogQ291bnQgb2YgYnl0ZXMgd3JpdHRlbiAoaW4gdGhlIGNodW5rKSAqLworICAgaW50ICAgICAgICAgICAgc3RhdGU7ICAgICAgICAgLyogQXMgZGVmaW5lZCBoZXJlOiAqLworIyAgICAgZGVmaW5lIFNUQVRFX1NJR05BVFVSRSAgMCAgLyogVGhlIHNpZ25hdHVyZSBpcyBiZWluZyB3cml0dGVuICovCisjICAgICBkZWZpbmUgU1RBVEVfQ0hVTktTICAgICAxICAvKiBOb24tSURBVCBjaHVua3MgYXJlIGJlaW5nIHdyaXR0ZW4gKi8KKyMgICAgIGRlZmluZSBTVEFURV9JREFUICAgICAgIDIgIC8qIEFuIElEQVQgc3RyZWFtIGlzIGJlaW5nIHdyaXR0ZW4gKi8KKworICAgLyogVHdvIHBvaW50ZXJzIHVzZWQgdG8gZW5hYmxlIGNsZWFuLXVwIGluIHRoZSBldmVudCBvZiBmYXRhbCBlcnJvcnMgYW5kIHRvCisgICAgKiBob2xkIHN0YXRlIGFib3V0IHRoZSBwYXJzZXIgcHJvY2VzcyAob25seSBvbmUgb2YgZWFjaCBhdCBwcmVzZW50LikKKyAgICAqLworICAgc3RydWN0IGNodW5rICogY2h1bms7CisgICBzdHJ1Y3QgSURBVCAqICBpZGF0OworCisgICAvKiBJbnRlcmZhY2UgdG8gYWxsb2NhdGUgYSBuZXcgY2h1bmsgb3IgSURBVCBjb250cm9sIHN0cnVjdHVyZS4gIFRoZSByZXN1bHQKKyAgICAqIGlzIHJldHVybmVkIGJ5IHNldHRpbmcgb25lIG9yIG90aGVyIG9mIHRoZSBhYm92ZSB2YXJpYWJsZXMuICBOb3RlIHRoYXQgdGhlCisgICAgKiByZWxldmFudCBpbml0aWFsaXplciBpcyBjYWxsZWQgYnkgdGhlIGFsbG9jYXRvciBmdW5jdGlvbi4gIFRoZSBhbGxvY19wdHIKKyAgICAqIGlzIHVzZWQgb25seSBieSB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGFsbG9jYXRlIGZ1bmN0aW9uLgorICAgICovCisgICB2b2lkICogICAgICAgICBhbGxvY19wdHI7CisgICB2b2lkICAgICAgICAgKCphbGxvYykoc3RydWN0IGZpbGUqLGludCBpZGF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZGF0OiBhbGxvY2F0ZSBJREFUIG5vdCBjaHVuayAqLworfTsKKworLyogVmFsaWQgbG9uZ2ptcCAoc3RvcCkgY29kZXMgYXJlOiAqLworI2RlZmluZSBMSUJQTkdfV0FSTklOR19DT0RFICAgMSAvKiBnZW5lcmljIHBuZ19lcnJvciAqLworI2RlZmluZSBMSUJQTkdfRVJST1JfQ09ERSAgICAgMiAvKiBnZW5lcmljIHBuZ19lcnJvciAqLworI2RlZmluZSBaTElCX0VSUk9SX0NPREUgICAgICAgMyAvKiBnZW5lcmljIHpsaWIgZXJyb3IgKi8KKyNkZWZpbmUgSU5WQUxJRF9FUlJPUl9DT0RFICAgIDQgLyogZGV0ZWN0ZWQgYW4gaW52YWxpZCBQTkcgKi8KKyNkZWZpbmUgUkVBRF9FUlJPUl9DT0RFICAgICAgIDUgLyogcmVhZCBmYWlsZWQgKi8KKyNkZWZpbmUgV1JJVEVfRVJST1JfQ09ERSAgICAgIDYgLyogZXJyb3IgaW4gd3JpdGUgKi8KKyNkZWZpbmUgVU5FWFBFQ1RFRF9FUlJPUl9DT0RFIDcgLyogdW5leHBlY3RlZCAoaW50ZXJuYWw/KSBlcnJvciAqLworCitzdGF0aWMgdm9pZAorZW1pdF9zdHJpbmcoY29uc3QgY2hhciAqc3RyLCBGSUxFICpvdXQpCisgICAvKiBQcmludCBhIHN0cmluZyB3aXRoIHNwYWNlcyByZXBsYWNlZCBieSAnXycgYW5kIG5vbi1wcmludGluZyBjaGFyYWN0ZXJzIGJ5CisgICAgKiBhbiBvY3RhbCBlc2NhcGUuCisgICAgKi8KK3sKKyAgIGZvciAoOyAqc3RyOyArK3N0cikKKyAgICAgIGlmIChpc2dyYXBoKFVDSEFSX01BWCAmICpzdHIpKQorICAgICAgICAgcHV0Yygqc3RyLCBvdXQpOworCisgICAgICBlbHNlIGlmIChpc3NwYWNlKFVDSEFSX01BWCAmICpzdHIpKQorICAgICAgICAgcHV0YygnXycsIG91dCk7CisKKyAgICAgIGVsc2UKKyAgICAgICAgIGZwcmludGYob3V0LCAiXFwlLjNvIiwgKnN0cik7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3N0cmNvZGUoaW50IGNvZGUpCit7CisgICBzd2l0Y2ggKGNvZGUpCisgICB7CisgICAgICBjYXNlIExJQlBOR19XQVJOSU5HX0NPREU6ICAgcmV0dXJuICJ3YXJuaW5nIjsKKyAgICAgIGNhc2UgTElCUE5HX0VSUk9SX0NPREU6ICAgICByZXR1cm4gImxpYnBuZyI7CisgICAgICBjYXNlIFpMSUJfRVJST1JfQ09ERTogICAgICAgcmV0dXJuICJ6bGliIjsKKyAgICAgIGNhc2UgSU5WQUxJRF9FUlJPUl9DT0RFOiAgICByZXR1cm4gImludmFsaWQiOworICAgICAgY2FzZSBSRUFEX0VSUk9SX0NPREU6ICAgICAgIHJldHVybiAicmVhZCI7CisgICAgICBjYXNlIFdSSVRFX0VSUk9SX0NPREU6ICAgICAgcmV0dXJuICJ3cml0ZSI7CisgICAgICBjYXNlIFVORVhQRUNURURfRVJST1JfQ09ERTogcmV0dXJuICJ1bmV4cGVjdGVkIjsKKyAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIklOVkFMSUQiOworICAgfQorfQorCitzdGF0aWMgdm9pZAorZW1pdF9lcnJvcihzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGNvZGUsIGNvbnN0IGNoYXIgKndoYXQpCisgICAvKiBHZW5lcmljIGVycm9yIG1lc3NhZ2Ugcm91dGluZSwgdGFrZXMgYSAnc3RvcCcgY29kZSBidXQgY2FuIGJlIHVzZWQKKyAgICAqIGVsc2V3aGVyZS4gIEFsd2F5cyBvdXRwdXRzIGEgbWVzc2FnZS4KKyAgICAqLworeworICAgY29uc3QgY2hhciAqcmVhc29uOworICAgaW50IGVyciA9IDA7CisKKyAgIHN3aXRjaCAoY29kZSkKKyAgIHsKKyAgICAgIGNhc2UgTElCUE5HX1dBUk5JTkdfQ09ERTogICByZWFzb24gPSAibGlicG5nIHdhcm5pbmc6IjsgYnJlYWs7CisgICAgICBjYXNlIExJQlBOR19FUlJPUl9DT0RFOiAgICAgcmVhc29uID0gImxpYnBuZyBlcnJvcjoiOyBicmVhazsKKyAgICAgIGNhc2UgWkxJQl9FUlJPUl9DT0RFOiAgICAgICByZWFzb24gPSAiemxpYiBlcnJvcjoiOyBicmVhazsKKyAgICAgIGNhc2UgSU5WQUxJRF9FUlJPUl9DT0RFOiAgICByZWFzb24gPSAiaW52YWxpZCI7IGJyZWFrOworICAgICAgY2FzZSBSRUFEX0VSUk9SX0NPREU6ICAgICAgIHJlYXNvbiA9ICJyZWFkIGZhaWx1cmU6IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBmaWxlLT5yZWFkX2Vycm5vOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBXUklURV9FUlJPUl9DT0RFOiAgICAgIHJlYXNvbiA9ICJ3cml0ZSBlcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZmlsZS0+d3JpdGVfZXJybm87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVORVhQRUNURURfRVJST1JfQ09ERTogcmVhc29uID0gInVuZXhwZWN0ZWQgZXJyb3I6IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBmaWxlLT5yZWFkX2Vycm5vOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBmaWxlLT53cml0ZV9lcnJubzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICByZWFzb24gPSAiSU5WQUxJRCAoaW50ZXJuYWwgZXJyb3IpOiI7IGJyZWFrOworICAgfQorCisgICBpZiAoZXJyICE9IDApCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAlcyAlcyBbJXNdXG4iLCBmaWxlLT5maWxlX25hbWUsIHJlYXNvbiwgd2hhdCwKKyAgICAgICAgIHN0cmVycm9yKGVycikpOworCisgICBlbHNlCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAlcyAlc1xuIiwgZmlsZS0+ZmlsZV9uYW1lLCByZWFzb24sIHdoYXQpOworfQorCitzdGF0aWMgdm9pZCBjaHVua19lbmQoc3RydWN0IGNodW5rICoqKTsKK3N0YXRpYyB2b2lkIElEQVRfZW5kKHN0cnVjdCBJREFUICoqKTsKKworc3RhdGljIGludAorZmlsZV9lbmQoc3RydWN0IGZpbGUgKmZpbGUpCit7CisgICBpbnQgcmM7CisKKyAgIC8qIElmIGVpdGhlciBvZiB0aGUgY2h1bmsgcG9pbnRlcnMgYXJlIHNldCBlbmQgdGhlbSBoZXJlLCB0aGUgSURBVCBzdHJ1Y3R1cmUKKyAgICAqIG11c3QgYmUgZGVhbGxvY2F0ZWQgZmlyc3QgYXMgaXQgbWF5IGRlYWxsb2NhdGUgdGhlIGNodW5rIHN0cnVjdHVyZS4KKyAgICAqLworICAgaWYgKGZpbGUtPmlkYXQgIT0gTlVMTCkKKyAgICAgIElEQVRfZW5kKCZmaWxlLT5pZGF0KTsKKworICAgaWYgKGZpbGUtPmNodW5rICE9IE5VTEwpCisgICAgICBjaHVua19lbmQoJmZpbGUtPmNodW5rKTsKKworICAgcmMgPSBmaWxlLT5zdGF0dXNfY29kZTsKKworICAgaWYgKGZpbGUtPmZpbGUgIT0gTlVMTCkKKyAgICAgICh2b2lkKWZjbG9zZShmaWxlLT5maWxlKTsKKworICAgaWYgKGZpbGUtPm91dCAhPSBOVUxMKQorICAgeworICAgICAgLyogTk9URTogdGhpcyBpcyBiaXR3aXNlIHwsIGFsbCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBtdXN0IGV4ZWN1dGUgYW5kCisgICAgICAgKiBtdXN0IHN1Y2NlZWQuCisgICAgICAgKi8KKyAgICAgIGlmIChmZXJyb3IoZmlsZS0+b3V0KSB8IGZmbHVzaChmaWxlLT5vdXQpIHwgZmNsb3NlKGZpbGUtPm91dCkpCisgICAgICB7CisgICAgICAgICBwZXJyb3IoZmlsZS0+b3V0X25hbWUpOworICAgICAgICAgZW1pdF9lcnJvcihmaWxlLCBSRUFEX0VSUk9SX0NPREUsICJvdXRwdXQgd3JpdGUgZXJyb3IiKTsKKyAgICAgICAgIHJjIHw9IFdSSVRFX0VSUk9SOworICAgICAgfQorICAgfQorCisgICAvKiBBY2N1bXVsYXRlIHRoZSByZXN1bHQgY29kZXMgKi8KKyAgIGZpbGUtPmdsb2JhbC0+c3RhdHVzX2NvZGUgfD0gcmM7CisKKyAgIENMRUFSKCpmaWxlKTsKKworICAgcmV0dXJuIHJjOyAvKiBzdGF0dXMgY29kZTogbm9uLXplcm8gb24gcmVhZCBvciB3cml0ZSBlcnJvciAqLworfQorCitzdGF0aWMgaW50CitmaWxlX2luaXQoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBnbG9iYWwgKmdsb2JhbCwgY29uc3QgY2hhciAqZmlsZV9uYW1lLAorICAgY29uc3QgY2hhciAqb3V0X25hbWUsIHZvaWQgKmFsbG9jX3B0ciwgdm9pZCAoKmFsbG9jKShzdHJ1Y3QgZmlsZSosaW50KSkKKyAgIC8qIEluaXRpYWxpemUgYSBmaWxlIGNvbnRyb2wgc3RydWN0dXJlLiAgVGhpcyB3aWxsIG9wZW4gdGhlIGdpdmVuIGZpbGVzIGFzCisgICAgKiB3ZWxsLiAgVGhlIHN0YXR1cyBjb2RlIHJldHVybmVkIGlzIDAgb24gc3VjY2Vzcywgbm9uIHplcm8gKHVzaW5nIHRoZSBmbGFncworICAgICogYWJvdmUpIG9uIGEgZmlsZSBvcGVuIGVycm9yLgorICAgICovCit7CisgICBDTEVBUigqZmlsZSk7CisgICBmaWxlLT5nbG9iYWwgPSBnbG9iYWw7CisKKyAgIGZpbGUtPmZpbGVfbmFtZSA9IGZpbGVfbmFtZTsKKyAgIGZpbGUtPm91dF9uYW1lID0gb3V0X25hbWU7CisgICBmaWxlLT5zdGF0dXNfY29kZSA9IDA7CisgICBmaWxlLT5yZWFkX2Vycm5vID0gMDsKKyAgIGZpbGUtPndyaXRlX2Vycm5vID0gMDsKKworICAgZmlsZS0+ZmlsZSA9IE5VTEw7CisgICBmaWxlLT5vdXQgPSBOVUxMOworICAgLyogam1wYnVmIGlzIGdhcmJhZ2U6IG11c3QgYmUgc2V0IGJ5IHJlYWRfcG5nICovCisKKyAgIGZpbGUtPnJlYWRfY291bnQgPSAwOworICAgZmlsZS0+c3RhdGUgPSBTVEFURV9TSUdOQVRVUkU7CisKKyAgIGZpbGUtPmNodW5rID0gTlVMTDsKKyAgIGZpbGUtPmlkYXQgPSBOVUxMOworCisgICBmaWxlLT5hbGxvY19wdHIgPSBhbGxvY19wdHI7CisgICBmaWxlLT5hbGxvYyA9IGFsbG9jOworCisgICAvKiBPcGVuIHRoZSBmaWxlczogKi8KKyAgIGFzc2VydChmaWxlX25hbWUgIT0gTlVMTCk7CisgICBmaWxlLT5maWxlID0gZm9wZW4oZmlsZV9uYW1lLCAicmIiKTsKKworICAgaWYgKGZpbGUtPmZpbGUgPT0gTlVMTCkKKyAgIHsKKyAgICAgIGZpbGUtPnJlYWRfZXJybm8gPSBlcnJubzsKKyAgICAgIGZpbGUtPnN0YXR1c19jb2RlIHw9IEZJTEVfRVJST1I7CisgICAgICAvKiBBbHdheXMgb3V0cHV0OiBwbGVhc2UgZ2l2ZSBhIHJlYWRhYmxlIGZpbGUhICovCisgICAgICBwZXJyb3IoZmlsZV9uYW1lKTsKKyAgICAgIHJldHVybiBGSUxFX0VSUk9SOworICAgfQorCisgICBpZiAob3V0X25hbWUgIT0gTlVMTCkKKyAgIHsKKyAgICAgIGZpbGUtPm91dCA9IGZvcGVuKG91dF9uYW1lLCAid2IiKTsKKworICAgICAgaWYgKGZpbGUtPm91dCA9PSBOVUxMKQorICAgICAgeworICAgICAgICAgZmlsZS0+d3JpdGVfZXJybm8gPSBlcnJubzsKKyAgICAgICAgIGZpbGUtPnN0YXR1c19jb2RlIHw9IFdSSVRFX0VSUk9SOworICAgICAgICAgcGVycm9yKG91dF9uYW1lKTsKKyAgICAgICAgIHJldHVybiBXUklURV9FUlJPUjsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitsb2dfZXJyb3Ioc3RydWN0IGZpbGUgKmZpbGUsIGludCBjb2RlLCBjb25zdCBjaGFyICp3aGF0KQorICAgLyogTGlrZSBlbWl0X2Vycm9yIGJ1dCBjaGVja3MgdGhlIGdsb2JhbCAnZXJyb3JzJyBmbGFnICovCit7CisgICBpZiAoZmlsZS0+Z2xvYmFsLT5lcnJvcnMpCisgICAgICBlbWl0X2Vycm9yKGZpbGUsIGNvZGUsIHdoYXQpOworfQorCitzdGF0aWMgY2hhcgordHlwZV9jaGFyKHBuZ191aW50XzMyIHYpCit7CisgICAvKiBJbiBmYWN0IGJlY2F1c2UgY2h1bms6OmNodW5rX3R5cGUgaXMgdmFsaWRhdGVkIHByaW9yIHRvIGFueSBjYWxsIHRvIHRoaXMKKyAgICAqIGZ1bmN0aW9uIGl0IHdpbGwgYWx3YXlzIHJldHVybiBhLXpBLVosIGJ1dCB0aGUgZXh0cmEgY29kZXMgYXJlIGp1c3QgdGhlcmUKKyAgICAqIHRvIGhlbHAgaW4gZmluZGluZyBpbnRlcm5hbCAocHJvZ3JhbW1pbmcpIGVycm9ycy4gIE5vdGUgdGhhdCB0aGUgY29kZSBvbmx5CisgICAgKiBldmVyIGNvbnNpZGVycyB0aGUgbG93IDcgYml0cyBvZiB0aGUgdmFsdWUgKHNvIGl0IGlzIG5vdCBuZWNlc3NhcnkgZm9yIHRoZQorICAgICogdHlwZV9uYW1lIGZ1bmN0aW9uIHRvIG1hc2sgb2YgdGhlIGJ5dGUuKQorICAgICovCisgICBpZiAodiAmIDMyKQorICAgICAgcmV0dXJuICIhYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo1Njc4OSJbKHYtOTYpJjMxXTsKKworICAgZWxzZQorICAgICAgcmV0dXJuICJAQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNCJbKHYtNjQpJjMxXTsKK30KKworc3RhdGljIHZvaWQKK3R5cGVfbmFtZShwbmdfdWludF8zMiB0eXBlLCBGSUxFICpvdXQpCit7CisgICBwdXRjKHR5cGVfY2hhcih0eXBlID4+IDI0KSwgb3V0KTsKKyAgIHB1dGModHlwZV9jaGFyKHR5cGUgPj4gMTYpLCBvdXQpOworICAgcHV0Yyh0eXBlX2NoYXIodHlwZSA+PiAgOCksIG91dCk7CisgICBwdXRjKHR5cGVfY2hhcih0eXBlICAgICAgKSwgb3V0KTsKK30KKworc3RhdGljIHZvaWQKK3R5cGVfc2VwKEZJTEUgKm91dCkKK3sKKyAgIHB1dGMoJzonLCBvdXQpOworICAgcHV0YygnICcsIG91dCk7Cit9CisKK3N0YXRpYyBwbmdfdWludF8zMiBjdXJyZW50X3R5cGUoc3RydWN0IGZpbGUgKmZpbGUsIGludCBjb2RlKTsKKworUE5HX05PUkVUVVJOIHN0YXRpYyB2b2lkCitzdG9wKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgY29kZSwgY29uc3QgY2hhciAqd2hhdCkKKyAgIC8qIFJldHVybiBjb250cm9sIHdoZW4gYSBQTkcgZmlsZSBjYW5ub3QgYmUgcmVhZC4gVGhpcyBvdXRwdXRzIGFuICdFUlInCisgICAgKiBzdW1tYXJ5IGxpbmUgdG9vLgorICAgICovCit7CisgICBsb2dfZXJyb3IoZmlsZSwgY29kZSwgd2hhdCk7CisKKyAgIC8qIFRoZSBjaHVuayBiZWluZyByZWFkIGlzIHR5cGljYWxseSBpZGVudGlmaWVkIGJ5IGZpbGUtPmNodW5rIG9yLCBpZiB0aGlzIGlzCisgICAgKiBOVUxMLCBieSBmaWxlLT50eXBlLiAgVGhpcyBtYXkgYmUgd3JvbmcgaWYgbGlicG5nIHJlYWRzIGFoZWFkLCBidXQgdGhpcworICAgICogb25seSBoYXBwZW5zIHdpdGggSURBVCB3aGVyZSBsaWJwbmcgcmVhZHMgdGhlIGhlYWRlciB0aGVuIGp1bXBzIGFyb3VuZAorICAgICogZmluZGluZyBlcnJvcnMgaW4gdGhlIHByZXZpb3VzIGNodW5rcy4gIFdlIGtub3cgdGhhdCBpcyBoYXBwZW5pbmcgYmVjYXVzZQorICAgICogd2UgYXJlIGF0IHRoZSBzdGFydCBvZiB0aGUgSURBVCAoaS5lLiBubyBJREFUIGRhdGEgaGFzIHlldCBiZWVuIHdyaXR0ZW4uKQorICAgICoKKyAgICAqIFNVTU1BUlkgRk9STUFUIChzdG9wKToKKyAgICAqCisgICAgKiBJREFUIEVSUiBzdGF0dXMgY29kZSByZWFkLWVycm5vIHdyaXRlLWVycm5vIG1lc3NhZ2UgZmlsZQorICAgICoKKyAgICAqICd1bmNvbXByZXNzZWQnIHdpbGwgYmUgMCBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtIGluIHRoZSBJSERSLiAgVGhlIGVycm5vCisgICAgKiB2YWx1ZXMgYXJlIGVtaXRfc3RyaW5nKHN0cmVycm9yKGVycm5vKSkuCisgICAgKi8KKyAgIGlmIChmaWxlLT5nbG9iYWwtPnF1aWV0IDwgMikgLyogbmVlZCB0d28gcXVpZXRzIHRvIHN0b3AgdGhpcy4gKi8KKyAgIHsKKyAgICAgIHBuZ191aW50XzMyIHR5cGU7CisKKyAgICAgIGlmIChmaWxlLT5jaHVuayAhPSBOVUxMKQorICAgICAgICAgdHlwZSA9IGN1cnJlbnRfdHlwZShmaWxlLCBjb2RlKTsgLyogR3JvcGVzIGluIHN0cnVjdCBjaHVuayBhbmQgSURBVCAqLworCisgICAgICBlbHNlCisgICAgICAgICB0eXBlID0gZmlsZS0+dHlwZTsKKworICAgICAgaWYgKHR5cGUpCisgICAgICAgICB0eXBlX25hbWUodHlwZSwgc3Rkb3V0KTsKKworICAgICAgZWxzZSAvKiBtYWdpYzogYW4gSURBVCBoZWFkZXIsIHByb2R1Y2VzIGJvZ29ucyBmb3IgdG9vIG1hbnkgSURBVHMgKi8KKyAgICAgICAgIGZwdXRzKCJIRUFEIiwgc3Rkb3V0KTsgLyogbm90IGEgcmVnaXN0ZXJlZCBjaHVuayEgKi8KKworICAgICAgcHJpbnRmKCIgRVJSICUuMnggJXMgIiwgZmlsZS0+c3RhdHVzX2NvZGUsIHN0cmNvZGUoY29kZSkpOworICAgICAgLyogVGhpcyBvbmx5IHdvcmtzIG9uZSBzdHJlcnJvciBhdCBhIHRpbWUsIGJlY2F1c2Ugb2YgdGhlIHdheSBzdHJlcnJvciBpcworICAgICAgICogaW1wbGVtZW50ZWQuCisgICAgICAgKi8KKyAgICAgIGVtaXRfc3RyaW5nKHN0cmVycm9yKGZpbGUtPnJlYWRfZXJybm8pLCBzdGRvdXQpOworICAgICAgcHV0YygnICcsIHN0ZG91dCk7CisgICAgICBlbWl0X3N0cmluZyhzdHJlcnJvcihmaWxlLT53cml0ZV9lcnJubyksIHN0ZG91dCk7CisgICAgICBwdXRjKCcgJywgc3Rkb3V0KTsKKyAgICAgIGVtaXRfc3RyaW5nKHdoYXQsIHN0ZG91dCk7CisgICAgICBwdXRjKCcgJywgc3Rkb3V0KTsKKyAgICAgIGZwdXRzKGZpbGUtPmZpbGVfbmFtZSwgc3Rkb3V0KTsKKyAgICAgIHB1dGMoJ1xuJywgc3Rkb3V0KTsKKyAgIH0KKworICAgZmlsZS0+c3RhdHVzX2NvZGUgfD0gRklMRV9FUlJPUjsKKyAgIGxvbmdqbXAoZmlsZS0+am1wYnVmLCBjb2RlKTsKK30KKworUE5HX05PUkVUVVJOIHN0YXRpYyB2b2lkCitzdG9wX2ludmFsaWQoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKndoYXQpCit7CisgICBzdG9wKGZpbGUsIElOVkFMSURfRVJST1JfQ09ERSwgd2hhdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0eXBlX21lc3NhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHBuZ191aW50XzMyIHR5cGUsIGNvbnN0IGNoYXIgKndoYXQpCisgICAvKiBFcnJvciBtZXNzYWdlIGZvciBhIGNodW5rOyB0aGUgY2h1bmsgbmFtZSBjb21lcyBmcm9tICd0eXBlJyAqLworeworICAgaWYgKGZpbGUtPmdsb2JhbC0+ZXJyb3JzKQorICAgeworICAgICAgZnB1dHMoZmlsZS0+ZmlsZV9uYW1lLCBzdGRlcnIpOworICAgICAgdHlwZV9zZXAoc3RkZXJyKTsKKyAgICAgIHR5cGVfbmFtZSh0eXBlLCBzdGRlcnIpOworICAgICAgdHlwZV9zZXAoc3RkZXJyKTsKKyAgICAgIGZwdXRzKHdoYXQsIHN0ZGVycik7CisgICAgICBwdXRjKCdcbicsIHN0ZGVycik7CisgICB9Cit9CisKKy8qIElucHV0IGZpbGUgcG9zaXRpb25pbmcgLSB3ZSBqdW1wIGFyb3VuZCBpbiB0aGUgaW5wdXQgZmlsZSB3aGlsZSByZWFkaW5nCisgKiBzdHVmZiwgdGhlc2Ugd3JhcHBlcnMgZGVhbCB3aXRoIHRoZSBlcnJvciBoYW5kbGluZy4KKyAqLworc3RhdGljIHZvaWQKK2ZpbGVfZ2V0cG9zKHN0cnVjdCBmaWxlICpmaWxlLCBmcG9zX3QgKnBvcykKK3sKKyAgIGlmIChmZ2V0cG9zKGZpbGUtPmZpbGUsIHBvcykpCisgICB7CisgICAgICAvKiBUaGlzIGlzIHVuZXhwZWN0ZWQsIHNvIHBlcnJvciBpdCAqLworICAgICAgcGVycm9yKGZpbGUtPmZpbGVfbmFtZSk7CisgICAgICBzdG9wKGZpbGUsIFJFQURfRVJST1JfQ09ERSwgImZnZXRwb3MiKTsKKyAgIH0KK30KKworc3RhdGljIHZvaWQKK2ZpbGVfc2V0cG9zKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBmcG9zX3QgKnBvcykKK3sKKyAgIGlmIChmc2V0cG9zKGZpbGUtPmZpbGUsIHBvcykpCisgICB7CisgICAgICBwZXJyb3IoZmlsZS0+ZmlsZV9uYW1lKTsKKyAgICAgIHN0b3AoZmlsZSwgUkVBRF9FUlJPUl9DT0RFLCAiZnNldHBvcyIpOworICAgfQorfQorCitzdGF0aWMgdm9pZAorZ2V0cG9zKHN0cnVjdCBmaWxlICpmaWxlKQorICAgLyogR2V0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZCBzdG9yZSBpdCBpbiAnZGF0YV9wb3MnLiAgVGhlIGNvcnJlc3BvbmRpbmcKKyAgICAqIHNldHBvcygpIGZ1bmN0aW9uIGlzIGNodW5rIHNwZWNpZmljIGJlY2F1c2UgaXQgdXNlcyB0aGUgY29weSBvZiB0aGUKKyAgICAqIHBvc2l0aW9uIGZvciB0aGUgc3BlY2lmaWMgY2h1bmsuCisgICAgKi8KK3sKKyAgIGZpbGVfZ2V0cG9zKGZpbGUsICZmaWxlLT5kYXRhX3Bvcyk7Cit9CisKKworLyogUmVhZCB1dGlsaXR5IC0gcmVhZCBhIHNpbmdsZSBieXRlLCByZXR1cm5zIGEgdmFsdWUgaW4gdGhlIHJhbmdlIDAuLjI1NSBvciBFT0YKKyAqIG9uIGEgcmVhZCBlcnJvci4gIEluIHRoZSBsYXR0ZXIgY2FzZSBzdGF0dXNfY29kZSBhbmQgcmVhZF9lcnJubyBhcmUgdXBkYXRlZAorICogYXBwcm9wcmlhdGVseS4KKyAqLworc3RhdGljIGludAorcmVhZF9ieXRlKHN0cnVjdCBmaWxlICpmaWxlKQoreworICAgaW50IGNoID0gZ2V0YyhmaWxlLT5maWxlKTsKKworICAgaWYgKGNoID49IDAgJiYgY2ggPD0gMjU1KQorICAgeworICAgICAgKysoZmlsZS0+cmVhZF9jb3VudCk7CisgICAgICByZXR1cm4gY2g7CisgICB9CisKKyAgIGVsc2UgaWYgKGNoICE9IEVPRikKKyAgIHsKKyAgICAgIGZpbGUtPnN0YXR1c19jb2RlIHw9IElOVEVSTkFMX0VSUk9SOworICAgICAgZmlsZS0+cmVhZF9lcnJubyA9IEVSQU5HRTsgLyogb3V0IG9mIHJhbmdlIGNoYXJhY3RlciAqLworCisgICAgICAvKiBUaGlzIGlzIHZlcnkgdW5leHBlY3RlZDsgYW4gZXJyb3IgbWVzc2FnZSBpcyBhbHdheXMgb3V0cHV0OiAqLworICAgICAgZW1pdF9lcnJvcihmaWxlLCBVTkVYUEVDVEVEX0VSUk9SX0NPREUsICJmaWxlIHJlYWQiKTsKKyAgIH0KKworIyAgaWZkZWYgRUlOVFIKKyAgICAgIGVsc2UgaWYgKGVycm5vID09IEVJTlRSKSAvKiBJbnRlcnJ1cHRlZCwgdHJ5IGFnYWluICovCisgICAgICB7CisgICAgICAgICBlcnJubyA9IDA7CisgICAgICAgICByZXR1cm4gcmVhZF9ieXRlKGZpbGUpOworICAgICAgfQorIyAgZW5kaWYKKworICAgZWxzZQorICAgeworICAgICAgLyogQW4gZXJyb3IsIGl0IGRvZXNuJ3QgcmVhbGx5IG1hdHRlciB3aGF0IHRoZSBlcnJvciBpcyBidXQgaXQgZ2V0cworICAgICAgICogcmVjb3JkZWQgYW55d2F5LgorICAgICAgICovCisgICAgICBpZiAoZmVycm9yKGZpbGUtPmZpbGUpKQorICAgICAgICAgZmlsZS0+cmVhZF9lcnJubyA9IGVycm5vOworCisgICAgICBlbHNlIGlmIChmZW9mKGZpbGUtPmZpbGUpKQorICAgICAgICAgZmlsZS0+cmVhZF9lcnJubyA9IDA7IC8qIEkuZS4gYSByZWd1bGFyIEVPRiwgbm8gZXJyb3IgKi8KKworICAgICAgZWxzZSAvKiB1bmV4cGVjdGVkICovCisgICAgICAgICBmaWxlLT5yZWFkX2Vycm5vID0gRURPTTsKKyAgIH0KKworICAgLyogJ1RSVU5DQVRFRCcgaXMgdXNlZCBmb3IgYWxsIGNhc2VzIG9mIGZhaWx1cmUgdG8gcmVhZCBhIGJ5dGUsIGJlY2F1c2Ugb2YKKyAgICAqIHRoZSB3YXkgbGlicG5nIHdvcmtzIGEgYnl0ZSByZWFkIGlzIG5ldmVyIGF0dGVtcHRlZCB1bmxlc3MgdGhlIGJ5dGUgaXMKKyAgICAqIGV4cGVjdGVkIHRvIGJlIHRoZXJlLCBzbyBFT0Ygc2hvdWxkIG5vdCBvY2N1ci4KKyAgICAqLworICAgZmlsZS0+c3RhdHVzX2NvZGUgfD0gVFJVTkNBVEVEOworICAgcmV0dXJuIEVPRjsKK30KKworc3RhdGljIHBuZ19ieXRlCityZXJlYWRfYnl0ZShzdHJ1Y3QgZmlsZSAqZmlsZSkKKyAgIC8qIFJlYWQgYSBieXRlIHdoZW4gYW4gZXJyb3IgaXMgbm90IGV4cGVjdGVkIHRvIGhhcHBlbiBiZWNhdXNlIHRoZSBieXRlIGhhcworICAgICogYmVlbiByZWFkIGJlZm9yZSB3aXRob3V0IGVycm9yLgorICAgICovCit7CisgICBpbnQgY2ggPSBnZXRjKGZpbGUtPmZpbGUpOworCisgICBpZiAoZXJybm8gIT0gMCkKKyAgICAgIGZpbGUtPnJlYWRfZXJybm8gPSBlcnJubzsKKworICAgaWYgKGNoIDwgMCB8fCBjaCA+IDI1NSkKKyAgICAgIHN0b3AoZmlsZSwgVU5FWFBFQ1RFRF9FUlJPUl9DT0RFLCAicmVyZWFkIik7CisKKyAgIHJldHVybiAocG5nX2J5dGUpY2g7Cit9CisKK3N0YXRpYyBwbmdfdWludF8zMgorcmVyZWFkXzQoc3RydWN0IGZpbGUgKmZpbGUpCisgICAvKiBUaGUgc2FtZSBidXQgZm9yIGEgZm91ciBieXRlIHF1YW50aXR5ICovCit7CisgICBwbmdfdWludF8zMiByZXN1bHQgPSAwOworICAgaW50IGkgPSAwOworCisgICB3aGlsZSAoKytpIDw9IDQpCisgICAgICByZXN1bHQgPSAocmVzdWx0IDw8IDgpICsgcmVyZWFkX2J5dGUoZmlsZSk7CisKKyAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitza2lwXzEyKHN0cnVjdCBmaWxlICpmaWxlKQorICAgLyogU2tpcCBleGFjdGx5IDEyIGJ5dGVzIGluIHRoZSBpbnB1dCBzdHJlYW0gLSB1c2VkIHRvIHNraXAgYSBDUkMgYW5kIGNodW5rCisgICAgKiBoZWFkZXIgdGhhdCBoYXMgYmVlbiByZWFkIGJlZm9yZS4KKyAgICAqLworeworICAgLyogU2luY2UgdGhlIGNodW5rcyB3ZXJlIHJlYWQgYmVmb3JlIHRoaXMgc2hvdWxkbid0IGZhaWw6ICovCisgICBpZiAoZnNlZWsoZmlsZS0+ZmlsZSwgMTIsIFNFRUtfQ1VSKSAhPSAwKQorICAgeworICAgICAgaWYgKGVycm5vICE9IDApCisgICAgICAgICBmaWxlLT5yZWFkX2Vycm5vID0gZXJybm87CisKKyAgICAgIHN0b3AoZmlsZSwgVU5FWFBFQ1RFRF9FUlJPUl9DT0RFLCAicmVza2lwIik7CisgICB9Cit9CisKK3N0YXRpYyB2b2lkCit3cml0ZV9ieXRlKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgYikKKyAgIC8qIFdyaXRlIG9uZSBieXRlIHRvIHRoZSBvdXRwdXQgLSB0aGlzIGNhdXNlcyBhIGZhdGFsIGVycm9yIGlmIHRoZSB3cml0ZQorICAgICogZmFpbHMgYW5kIHRoZSByZWFkIG9mIHRoaXMgUE5HIGZpbGUgaW1tZWRpYXRlbHkgdGVybWluYXRlcy4gIEp1c3QKKyAgICAqIGluY3JlbWVudHMgdGhlIHdyaXRlIGNvdW50IGlmIHRoZXJlIGlzIG5vIG91dHB1dCBmaWxlLgorICAgICovCit7CisgICBpZiAoZmlsZS0+b3V0ICE9IE5VTEwpCisgICB7CisgICAgICBpZiAocHV0YyhiLCBmaWxlLT5vdXQpICE9IGIpCisgICAgICB7CisgICAgICAgICBmaWxlLT53cml0ZV9lcnJubyA9IGVycm5vOworICAgICAgICAgZmlsZS0+c3RhdHVzX2NvZGUgfD0gV1JJVEVfRVJST1I7CisgICAgICAgICBzdG9wKGZpbGUsIFdSSVRFX0VSUk9SX0NPREUsICJ3cml0ZSBieXRlIik7CisgICAgICB9CisgICB9CisKKyAgICsrKGZpbGUtPndyaXRlX2NvdW50KTsKK30KKworLyogRGVyaXZhdGl2ZXMgb2YgdGhlIHJlYWQvd3JpdGUgZnVuY3Rpb25zLiAqLworc3RhdGljIHVuc2lnbmVkIGludAorcmVhZF80KHN0cnVjdCBmaWxlICpmaWxlLCBwbmdfdWludF8zMiAqcHUpCisgICAvKiBSZWFkIGZvdXIgYnl0ZXMsIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIHN1Y2Nlc3NmdWxseSBhbmQsIGlmIGFsbAorICAgICogZm91ciBieXRlcyBhcmUgcmVhZCwgYXNzaWducyB0aGUgcmVzdWx0IHRvICpwdS4KKyAgICAqLworeworICAgdW5zaWduZWQgaW50IGkgPSAwOworICAgcG5nX3VpbnRfMzIgdmFsID0gMDsKKworICAgZG8KKyAgIHsKKyAgICAgIGludCBjaCA9IHJlYWRfYnl0ZShmaWxlKTsKKworICAgICAgaWYgKGNoID09IEVPRikKKyAgICAgICAgIHJldHVybiBpOworCisgICAgICB2YWwgPSAodmFsIDw8IDgpICsgY2g7CisgICB9IHdoaWxlICgrK2kgPCA0KTsKKworICAgKnB1ID0gdmFsOworICAgcmV0dXJuIGk7Cit9CisKKy8qIENSQyBoYW5kbGluZyAtIHJlYWQgYnV0IGNhbGN1bGF0ZSB0aGUgQ1JDIHdoaWxlIGRvaW5nIHNvLiAqLworc3RhdGljIGludAorY3JjX3JlYWRfbWFueShzdHJ1Y3QgZmlsZSAqZmlsZSwgcG5nX3VpbnRfMzIgbGVuZ3RoKQorICAgLyogUmVhZHMgJ2xlbmd0aCcgYnl0ZXMgYW5kIHVwZGF0ZXMgdGhlIENSQywgcmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlCisgICAgKiBpZiB0aGUgaW5wdXQgaXMgdHJ1bmNhdGVkLgorICAgICovCit7CisgICBpZiAobGVuZ3RoID4gMCkKKyAgIHsKKyAgICAgIHBuZ191aW50XzMyIGNyYyA9IGZpbGUtPmNyYzsKKworICAgICAgZG8KKyAgICAgIHsKKyAgICAgICAgIGludCBjaCA9IHJlYWRfYnl0ZShmaWxlKTsKKworICAgICAgICAgaWYgKGNoID09IEVPRikKKyAgICAgICAgICAgIHJldHVybiAwOyAvKiBUcnVuY2F0ZWQgKi8KKworICAgICAgICAgY3JjID0gY3JjX29uZV9ieXRlKGNyYywgY2gpOworICAgICAgfQorICAgICAgd2hpbGUgKC0tbGVuZ3RoID4gMCk7CisKKyAgICAgIGZpbGUtPmNyYyA9IGNyYzsKKyAgIH0KKworICAgcmV0dXJuIDE7IC8qIE9LICovCit9CisKK3N0YXRpYyBpbnQKK2NhbGNfaW1hZ2Vfc2l6ZShzdHJ1Y3QgZmlsZSAqZmlsZSkKKyAgIC8qIEZpbGwgaW4gdGhlIGltYWdlX2J5dGVzIGZpZWxkIGdpdmVuIHRoZSBJSERSIGluZm9ybWF0aW9uLCBjYWxscyBzdG9wIG9uCisgICAgKiBlcnJvci4KKyAgICAqLworeworICAgcG5nX3VpbnRfMTYgcGQgPSBmaWxlLT5iaXRfZGVwdGg7CisKKyAgIHN3aXRjaCAoZmlsZS0+Y29sb3JfdHlwZSkKKyAgIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICBzdG9wX2ludmFsaWQoZmlsZSwgIklIRFI6IGNvbG91ciB0eXBlIik7CisKKyAgICAgIGludmFsaWRfYml0X2RlcHRoOgorICAgICAgICAgc3RvcF9pbnZhbGlkKGZpbGUsICJJSERSOiBiaXQgZGVwdGgiKTsKKworICAgICAgY2FzZSAwOiAvKiBnICovCisgICAgICAgICBpZiAocGQgIT0gMSAmJiBwZCAhPSAyICYmIHBkICE9IDQgJiYgcGQgIT0gOCAmJiBwZCAhPSAxNikKKyAgICAgICAgICAgIGdvdG8gaW52YWxpZF9iaXRfZGVwdGg7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAzOgorICAgICAgICAgaWYgKHBkICE9IDEgJiYgcGQgIT0gMiAmJiBwZCAhPSA0ICYmIHBkICE9IDgpCisgICAgICAgICAgICBnb3RvIGludmFsaWRfYml0X2RlcHRoOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMjogLyogcmdiICovCisgICAgICAgICBpZiAocGQgIT0gOCAmJiBwZCAhPSAxNikKKyAgICAgICAgICAgIGdvdG8gaW52YWxpZF9iaXRfZGVwdGg7CisKKyAgICAgICAgIHBkID0gKHBuZ191aW50XzE2KShwZCAqIDMpOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgNDogLyogZ2EgKi8KKyAgICAgICAgIGlmIChwZCAhPSA4ICYmIHBkICE9IDE2KQorICAgICAgICAgICAgZ290byBpbnZhbGlkX2JpdF9kZXB0aDsKKworICAgICAgICAgcGQgPSAocG5nX3VpbnRfMTYpKHBkICogMik7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA2OiAvKiByZ2JhICovCisgICAgICAgICBpZiAocGQgIT0gOCAmJiBwZCAhPSAxNikKKyAgICAgICAgICAgIGdvdG8gaW52YWxpZF9iaXRfZGVwdGg7CisKKyAgICAgICAgIHBkID0gKHBuZ191aW50XzE2KShwZCAqIDQpOworICAgICAgICAgYnJlYWs7CisgICB9CisKKyAgIGlmIChmaWxlLT53aWR0aCA8IDEgfHwgZmlsZS0+d2lkdGggPiAweDdmZmZmZmZmKQorICAgICAgc3RvcF9pbnZhbGlkKGZpbGUsICJJSERSOiB3aWR0aCIpOworCisgICBlbHNlIGlmIChmaWxlLT5oZWlnaHQgPCAxIHx8IGZpbGUtPmhlaWdodCA+IDB4N2ZmZmZmZmYpCisgICAgICBzdG9wX2ludmFsaWQoZmlsZSwgIklIRFI6IGhlaWdodCIpOworCisgICBlbHNlIGlmIChmaWxlLT5jb21wcmVzc2lvbl9tZXRob2QgIT0gMCkKKyAgICAgIHN0b3BfaW52YWxpZChmaWxlLCAiSUhEUjogY29tcHJlc3Npb24gbWV0aG9kIik7CisKKyAgIGVsc2UgaWYgKGZpbGUtPmZpbHRlcl9tZXRob2QgIT0gMCkKKyAgICAgIHN0b3BfaW52YWxpZChmaWxlLCAiSUhEUjogZmlsdGVyIG1ldGhvZCIpOworCisgICBlbHNlIHN3aXRjaCAoZmlsZS0+aW50ZXJsYWNlX21ldGhvZCkKKyAgIHsKKyAgICAgIGNhc2UgUE5HX0lOVEVSTEFDRV9BREFNNzoKKyAgICAgICAgIC8qIEludGVybGFjaW5nIG1ha2VzIHRoZSBpbWFnZSBsYXJnZXIgYmVjYXVzZSBvZiB0aGUgcmVwbGljYXRpb24gb2YKKyAgICAgICAgICAqIGJvdGggdGhlIGZpbHRlciBieXRlIGFuZCB0aGUgcGFkZGluZyB0byBhIGJ5dGUgYm91bmRhcnkuCisgICAgICAgICAgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIGludCBwYXNzOworICAgICAgICAgICAgaW50IGltYWdlX2RpZ2l0cyA9IDA7CisgICAgICAgICAgICB1ZGlnaXQgcm93X3dpZHRoWzJdLCByb3dfYnl0ZXNbM107CisKKyAgICAgICAgICAgIGZvciAocGFzcz0wOyBwYXNzPD02OyArK3Bhc3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfdWludF8zMiBwdyA9IFBOR19QQVNTX0NPTFMoZmlsZS0+d2lkdGgsIHBhc3MpOworCisgICAgICAgICAgICAgICBpZiAocHcgPiAwKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaW50ICBkaWdpdHM7CisKKyAgICAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSAxKygocHcqcGQrNyk+PjMpIGluIHJvd19ieXRlcyAqLworICAgICAgICAgICAgICAgICAgZGlnaXRzID0gdWFyYl9tdWx0X2RpZ2l0KHJvd19ieXRlcywgdWFyYl9zZXQocm93X2J5dGVzLCA3KSwKKyAgICAgICAgICAgICAgICAgICAgIHJvd193aWR0aCwgdWFyYl9zZXQocm93X3dpZHRoLCBwdyksIHBkKTsKKyAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IHVhcmJfc2hpZnQocm93X2J5dGVzLCBkaWdpdHMsIDMpOworICAgICAgICAgICAgICAgICAgZGlnaXRzID0gdWFyYl9pbmMocm93X2J5dGVzLCBkaWdpdHMsIDEpOworCisgICAgICAgICAgICAgICAgICAvKiBBZGQgcm93X2J5dGVzICogcGFzcy1oZWlnaHQgdG8gdGhlIGZpbGUgaW1hZ2VfYnl0ZXMgZmllbGQKKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgaW1hZ2VfZGlnaXRzID0gdWFyYl9tdWx0MzIoZmlsZS0+aW1hZ2VfYnl0ZXMsIGltYWdlX2RpZ2l0cywKKyAgICAgICAgICAgICAgICAgICAgIHJvd19ieXRlcywgZGlnaXRzLAorICAgICAgICAgICAgICAgICAgICAgUE5HX1BBU1NfUk9XUyhmaWxlLT5oZWlnaHQsIHBhc3MpKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmlsZS0+aW1hZ2VfZGlnaXRzID0gaW1hZ2VfZGlnaXRzOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUE5HX0lOVEVSTEFDRV9OT05FOgorICAgICAgICAgeworICAgICAgICAgICAgaW50ICBkaWdpdHM7CisgICAgICAgICAgICB1ZGlnaXQgcm93X3dpZHRoWzJdLCByb3dfYnl0ZXNbM107CisKKyAgICAgICAgICAgIC8qIEFzIGFib3ZlLCBidXQgdXNlIGltYWdlX3dpZHRoIGluIHBsYWNlIG9mIHRoZSBwYXNzIHdpZHRoOiAqLworICAgICAgICAgICAgZGlnaXRzID0gdWFyYl9tdWx0X2RpZ2l0KHJvd19ieXRlcywgdWFyYl9zZXQocm93X2J5dGVzLCA3KSwKKyAgICAgICAgICAgICAgIHJvd193aWR0aCwgdWFyYl9zZXQocm93X3dpZHRoLCBmaWxlLT53aWR0aCksIHBkKTsKKyAgICAgICAgICAgIGRpZ2l0cyA9IHVhcmJfc2hpZnQocm93X2J5dGVzLCBkaWdpdHMsIDMpOworICAgICAgICAgICAgZGlnaXRzID0gdWFyYl9pbmMocm93X2J5dGVzLCBkaWdpdHMsIDEpOworCisgICAgICAgICAgICAvKiBTZXQgcm93X2J5dGVzICogaW1hZ2UtaGVpZ2h0IHRvIHRoZSBmaWxlIGltYWdlX2J5dGVzIGZpZWxkICovCisgICAgICAgICAgICBmaWxlLT5pbWFnZV9kaWdpdHMgPSB1YXJiX211bHQzMihmaWxlLT5pbWFnZV9ieXRlcywgMCwKKyAgICAgICAgICAgICAgIHJvd19ieXRlcywgZGlnaXRzLCBmaWxlLT5oZWlnaHQpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICBzdG9wX2ludmFsaWQoZmlsZSwgIklIRFI6IGludGVybGFjZSBtZXRob2QiKTsKKyAgIH0KKworICAgYXNzZXJ0KGZpbGUtPmltYWdlX2RpZ2l0cyA+PSAxICYmIGZpbGUtPmltYWdlX2RpZ2l0cyA8PSA1KTsKKyAgIHJldHVybiAxOworfQorCisvKiBQRVItQ0hVTksgQ09OVFJPTCBTVFJVQ1RVUkUKKyAqIFRoaXMgc3RydWN0dXJlIGlzIGluc3RhbnRpYXRlZCBmb3IgZWFjaCBjaHVuaywgZXhjZXB0IGZvciB0aGUgSURBVCBjaHVua3MKKyAqIHdoZXJlIG9uZSBjaHVuayBjb250cm9sIHN0cnVjdHVyZSBpcyB1c2VkIGZvciB0aGUgd2hvbGUgb2YgYSBzaW5nbGUgc3RyZWFtIG9mCisgKiBJREFUIGNodW5rcyAoc2VlIHRoZSBJREFUIGNvbnRyb2wgc3RydWN0dXJlIGJlbG93KS4KKyAqLworc3RydWN0IGNodW5rCit7CisgICAvKiBBTkNFU1RPUlMgKi8KKyAgIHN0cnVjdCBmaWxlICogICAgICAgICBmaWxlOworICAgc3RydWN0IGdsb2JhbCAqICAgICAgIGdsb2JhbDsKKworICAgLyogUFVCTElDIElEQVQgSU5GT1JNQVRJT046IFNFVCBCWSBUSEUgWkxJQiBDT0RFICovCisgICB1ZGlnaXQgICAgICAgICB1bmNvbXByZXNzZWRfYnl0ZXNbNV07CisgICBpbnQgICAgICAgICAgICB1bmNvbXByZXNzZWRfZGlnaXRzOworICAgdWRpZ2l0ICAgICAgICAgY29tcHJlc3NlZF9ieXRlc1s1XTsKKyAgIGludCAgICAgICAgICAgIGNvbXByZXNzZWRfZGlnaXRzOworCisgICAvKiBQVUJMSUMgUEVSLUNIVU5LIElORk9STUFUSU9OOiBVU0VEIEJZIENIVU5LIFJFQUQgQ09ERSAqLworICAgLyogVGhpcyBpbmZvcm1hdGlvbiBpcyBmaWxsZWQgaW4gYnkgY2h1bmtfaW5pdCBmcm9tIHRoZSBkYXRhIGluIHRoZSBmaWxlCisgICAgKiBjb250cm9sIHN0cnVjdHVyZSwgYnV0IGNodW5rX2xlbmd0aCBtYXkgYmUgY2hhbmdlZCBsYXRlci4KKyAgICAqLworICAgZnBvc190ICAgICAgICAgY2h1bmtfZGF0YV9wb3M7ICAgIC8qIFBvc2l0aW9uIG9mIGZpcnN0IGJ5dGUgb2YgY2h1bmsgZGF0YSAqLworICAgcG5nX3VpbnRfMzIgICAgY2h1bmtfbGVuZ3RoOyAgICAgIC8qIEZyb20gaGVhZGVyIChvciBtb2RpZmllZCBiZWxvdykgKi8KKyAgIHBuZ191aW50XzMyICAgIGNodW5rX3R5cGU7ICAgICAgICAvKiBGcm9tIGhlYWRlciAqLworCisgICAvKiBQVUJMSUMgUEVSLUNIVU5LIElORk9STUFUSU9OOiBGT1IgVEhFIENIVU5LIFdSSVRFIENPREUgKi8KKyAgIHBuZ191aW50XzMyICAgIHdyaXRlX2NyYzsgICAgICAgICAvKiBPdXRwdXQgQ1JDIChtYXkgZGlmZmVyIGZyb20gcmVhZF9jcmMpICovCisgICBwbmdfdWludF8zMiAgICByZXdyaXRlX29mZnNldDsgICAgLyogQ291bnQgb2YgYnl0ZXMgYmVmb3JlIHJld3JpdGUuICovCisgICBpbnQgICAgICAgICAgICByZXdyaXRlX2xlbmd0aDsgICAgLyogTnVtYmVyIG9mIGJ5dGVzIGxlZnQgdG8gY2hhbmdlICovCisgICBwbmdfYnl0ZSAgICAgICByZXdyaXRlX2J1ZmZlclsyXTsgLyogQnVmZmVyIG9mIG5ldyBieXRlIHZhbHVlcyAqLworfTsKKworc3RhdGljIHZvaWQKK2NodW5rX21lc3NhZ2Uoc3RydWN0IGNodW5rICpjaHVuaywgY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKyAgIHR5cGVfbWVzc2FnZShjaHVuay0+ZmlsZSwgY2h1bmstPmNodW5rX3R5cGUsIG1lc3NhZ2UpOworfQorCitzdGF0aWMgdm9pZAorY2h1bmtfZW5kKHN0cnVjdCBjaHVuayAqKmNodW5rX3ZhcikKK3sKKyAgIHN0cnVjdCBjaHVuayAqY2h1bmsgPSAqY2h1bmtfdmFyOworCisgICAqY2h1bmtfdmFyID0gTlVMTDsKKyAgIENMRUFSKCpjaHVuayk7Cit9CisKK3N0YXRpYyB2b2lkCitjaHVua19pbml0KHN0cnVjdCBjaHVuayAqIGNvbnN0IGNodW5rLCBzdHJ1Y3QgZmlsZSAqIGNvbnN0IGZpbGUpCisgICAvKiBXaGVuIGEgY2h1bmsgaXMgaW5pdGlhbGl6ZWQgdGhlIGZpbGUgbGVuZ3RoL3R5cGUvcG9zIGFyZSBjb3BpZWQgaW50byB0aGUKKyAgICAqIGNvcnJlc3BvbmRpbmcgY2h1bmsgZmllbGRzIGFuZCB0aGUgbmV3IGNodW5rIGlzIHJlZ2lzdGVyZWQgaW4gdGhlIGZpbGUKKyAgICAqIHN0cnVjdHVyZS4gIFRoZXJlIGNhbiBvbmx5IGJlIG9uZSBjaHVuayBhdCBhIHRpbWUuCisgICAgKgorICAgICogTk9URTogdGhpcyByb3V0aW5lIG11c3Qgb25lbHkgYmUgY2FsbGVkIGZyb20gdGhlIGZpbGUgYWxsb2Mgcm91dGluZSEKKyAgICAqLworeworICAgYXNzZXJ0KGZpbGUtPmNodW5rID09IE5VTEwpOworCisgICBDTEVBUigqY2h1bmspOworCisgICBjaHVuay0+ZmlsZSA9IGZpbGU7CisgICBjaHVuay0+Z2xvYmFsID0gZmlsZS0+Z2xvYmFsOworCisgICBjaHVuay0+Y2h1bmtfZGF0YV9wb3MgPSBmaWxlLT5kYXRhX3BvczsKKyAgIGNodW5rLT5jaHVua19sZW5ndGggPSBmaWxlLT5sZW5ndGg7CisgICBjaHVuay0+Y2h1bmtfdHlwZSA9IGZpbGUtPnR5cGU7CisKKyAgIC8qIENvbXByZXNzc2VkL3VuY29tcHJlc3NlZCBzaXplIGluZm9ybWF0aW9uIChmcm9tIHRoZSB6bGliIGNvbnRyb2wgc3RydWN0dXJlCisgICAgKiB0aGF0IGlzIHVzZWQgdG8gY2hlY2sgdGhlIGNvbXByZXNzZWQgZGF0YSBpbiBhIGNodW5rLikKKyAgICAqLworICAgY2h1bmstPnVuY29tcHJlc3NlZF9kaWdpdHMgPSAwOworICAgY2h1bmstPmNvbXByZXNzZWRfZGlnaXRzID0gMDsKKworICAgZmlsZS0+Y2h1bmsgPSBjaHVuazsKK30KKworc3RhdGljIHBuZ191aW50XzMyCitjdXJyZW50X3R5cGUoc3RydWN0IGZpbGUgKmZpbGUsIGludCBjb2RlKQorICAgLyogR3Vlc3MgdGhlIGFjdHVhbCBjaHVuayB0eXBlIHRoYXQgY2F1c2VzIGEgc3RvcCgpICovCit7CisgICAvKiBUaGlzIG1heSByZXR1cm4gcG5nX0lEQVQgZm9yIGVycm9ycyBkZXRlY3RlZCAobGF0ZSkgaW4gdGhlIGhlYWRlcjsgdGhhdAorICAgICogaW5jbHVkZXMgYW55IGludGVyLWNodW5rIGNvbnNpc3RlbmN5IGNoZWNrIHRoYXQgbGlicG5nIHBlcmZvcm1zLiAgQXNzdW1lCisgICAgKiB0aGF0IGlmIHRoZSBjaHVua190eXBlIGlzIHBuZ19JREFUIGFuZCB0aGUgZmlsZSB3cml0ZSBjb3VudCBpcyA4IHRoaXMgaXMKKyAgICAqIHdoYXQgaXMgaGFwcGVuaW5nLgorICAgICovCisgICBpZiAoZmlsZS0+Y2h1bmsgIT0gTlVMTCkKKyAgIHsKKyAgICAgIHBuZ191aW50XzMyIHR5cGUgPSBmaWxlLT5jaHVuay0+Y2h1bmtfdHlwZTsKKworICAgICAgLyogVGhpcyBpcyBwcm9iYWJseSB3cm9uZyBmb3IgdGhlIGV4Y2VzcyBJREFUcyBjYXNlLCBiZWNhdXNlIHRoZW4gbGlicG5nCisgICAgICAgKiB3aGluZXMgYWJvdXQgdG9vIG1hbnkgb2YgdGhlbSAoYXBwYXJlbnRseSBpbiBzb21lIGNhc2VzIGVycm9uZW91c2x5KQorICAgICAgICogd2hlbiB0aGUgaGVhZGVyIGlzIHJlYWQuCisgICAgICAgKi8KKyAgICAgIGlmIChjb2RlIDw9IExJQlBOR19FUlJPUl9DT0RFICYmIHR5cGUgPT0gcG5nX0lEQVQgJiYKKyAgICAgICAgIGZpbGUtPndyaXRlX2NvdW50ID09IDgpCisgICAgICAgICB0eXBlID0gMDsgLyogbWFnaWMgKi8KKworICAgICAgcmV0dXJuIHR5cGU7CisgICB9CisKKyAgIGVsc2UKKyAgICAgIHJldHVybiBmaWxlLT50eXBlOworfQorCitzdGF0aWMgdm9pZAorc2V0cG9zKHN0cnVjdCBjaHVuayAqY2h1bmspCisgICAvKiBSZXNldCB0aGUgcG9zaXRpb24gdG8gJ2NodW5rX2RhdGFfcG9zJyAtIHRoZSBzdGFydCBvZiB0aGUgZGF0YSBmb3IgdGhpcworICAgICogY2h1bmsuICBBcyBhIHNpZGUgZWZmZWN0IHRoZSByZWFkX2NvdW50IGluIHRoZSBmaWxlIGlzIHJlc2V0IHRvIDgsIGp1c3QKKyAgICAqIGFmdGVyIHRoZSBsZW5ndGgvdHlwZSBoZWFkZXIuCisgICAgKi8KK3sKKyAgIGNodW5rLT5maWxlLT5yZWFkX2NvdW50ID0gODsKKyAgIGZpbGVfc2V0cG9zKGNodW5rLT5maWxlLCAmY2h1bmstPmNodW5rX2RhdGFfcG9zKTsKK30KKworLyogU3BlY2lmaWMgY2h1bmsgaGFuZGxpbmcgLSBjYWxsZWQgZm9yIGVhY2ggY2h1bmsgaGVhZGVyLCBhbGwgc3BlY2lhbCBjaHVuaworICogcHJvY2Vzc2luZyBpcyBpbml0aWF0ZWQgaW4gdGhlc2UgZnVuY3Rpb25zLgorICovCisvKiBUaGUgbmV4dCBmdW5jdGlvbnMgaGFuZGxlIHNwZWNpYWwgcHJvY2Vzc2luZyBmb3IgdGhvc2UgY2h1bmtzIHdpdGggTFogZGF0YSwKKyAqIHRoZSBkYXRhIGlzIGlkZW50aWZpZWQgYW5kIGNoZWNrZWQgZm9yIHZhbGlkaXR5LiAgSWYgdGhlcmUgYXJlIHByb2JsZW1zIHdoaWNoCisgKiBjYW5ub3QgYmUgY29ycmVjdGVkIHRoZSByb3V0aW5lcyByZXR1cm4gZmFsc2UsIG90aGVyd2lzZSB0cnVlIChhbHRob3VnaAorICogbW9kaWZpY2F0aW9uIHRvIHRoZSB6bGliIGhlYWRlciBtYXkgYmUgcmVxdWlyZWQuKQorICoKKyAqIFRoZSBjb21wcmVzc2VkIGRhdGEgaXMgaW4gemxpYiBmb3JtYXQgKFJGQzE5NTApIGFuZCBjb25zZXF1ZW50bHkgaGFzIGEKKyAqIG1pbmltdW0gbGVuZ3RoIG9mIDcgYnl0ZXMuCisgKi8KK3N0YXRpYyBpbnQgemxpYl9jaGVjayhzdHJ1Y3QgZmlsZSAqZmlsZSwgcG5nX3VpbnRfMzIgb2Zmc2V0KTsKKworc3RhdGljIGludAorcHJvY2Vzc196VFh0X2lDQ1Aoc3RydWN0IGZpbGUgKmZpbGUpCisgICAvKiB6VFh0IGFuZCBpQ0NQIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBmb3JtIC0ga2V5d29yZCwgbnVsbCwgY29tcHJlc3Npb24KKyAgICAqIG1ldGhvZCB0aGVuIGNvbXByZXNzZWQgZGF0YS4KKyAgICAqLworeworICAgc3RydWN0IGNodW5rICpjaHVuayA9IGZpbGUtPmNodW5rOworICAgcG5nX3VpbnRfMzIgbGVuZ3RoOworICAgcG5nX3VpbnRfMzIgaW5kZXggPSAwOworCisgICBhc3NlcnQoY2h1bmsgIT0gTlVMTCAmJiBmaWxlLT5pZGF0ID09IE5VTEwpOworICAgbGVuZ3RoID0gY2h1bmstPmNodW5rX2xlbmd0aDsKKyAgIHNldHBvcyhjaHVuayk7CisKKyAgIHdoaWxlIChsZW5ndGggPj0gOSkKKyAgIHsKKyAgICAgIC0tbGVuZ3RoOworICAgICAgKytpbmRleDsKKyAgICAgIGlmIChyZXJlYWRfYnl0ZShmaWxlKSA9PSAwKSAvKiBrZXl3b3JkIG51bGwgdGVybWluYXRvciAqLworICAgICAgeworICAgICAgICAgLS1sZW5ndGg7CisgICAgICAgICArK2luZGV4OworICAgICAgICAgKHZvaWQpcmVyZWFkX2J5dGUoZmlsZSk7IC8qIGNvbXByZXNzaW9uIG1ldGhvZCAqLworICAgICAgICAgcmV0dXJuIHpsaWJfY2hlY2soZmlsZSwgaW5kZXgpOworICAgICAgfQorICAgfQorCisgICBjaHVua19tZXNzYWdlKGNodW5rLCAidG9vIHNob3J0Iik7CisgICByZXR1cm4gMDsgLyogc2tpcCAqLworfQorCitzdGF0aWMgaW50Citwcm9jZXNzX2lUWHQoc3RydWN0IGZpbGUgKmZpbGUpCit7CisgICAvKiBMaWtlIHpUWHQgYnV0IG1vcmUgZmllbGRzLiAqLworICAgc3RydWN0IGNodW5rICpjaHVuayA9IGZpbGUtPmNodW5rOworICAgcG5nX3VpbnRfMzIgbGVuZ3RoOworICAgcG5nX3VpbnRfMzIgaW5kZXggPSAwOworCisgICBhc3NlcnQoY2h1bmsgIT0gTlVMTCAmJiBmaWxlLT5pZGF0ID09IE5VTEwpOworICAgbGVuZ3RoID0gY2h1bmstPmNodW5rX2xlbmd0aDsKKyAgIHNldHBvcyhjaHVuayk7CisKKyAgIHdoaWxlIChsZW5ndGggPj0gNSkKKyAgIHsKKyAgICAgIC0tbGVuZ3RoOworICAgICAgKytpbmRleDsKKyAgICAgIGlmIChyZXJlYWRfYnl0ZShmaWxlKSA9PSAwKSAvKiBrZXl3b3JkIG51bGwgdGVybWluYXRvciAqLworICAgICAgeworICAgICAgICAgLS1sZW5ndGg7CisgICAgICAgICArK2luZGV4OworICAgICAgICAgaWYgKHJlcmVhZF9ieXRlKGZpbGUpID09IDApIC8qIHVuY29tcHJlc3NlZCB0ZXh0ICovCisgICAgICAgICAgICByZXR1cm4gMTsgLyogbm90aGluZyB0byBjaGVjayAqLworCisgICAgICAgICAtLWxlbmd0aDsKKyAgICAgICAgICsraW5kZXg7CisgICAgICAgICAodm9pZClyZXJlYWRfYnl0ZShmaWxlKTsgLyogY29tcHJlc3Npb24gbWV0aG9kICovCisKKyAgICAgICAgIC8qIFNraXAgdGhlIGxhbmd1YWdlIHRhZyAobnVsbCB0ZXJtaW5hdGVkKS4gKi8KKyAgICAgICAgIHdoaWxlIChsZW5ndGggPj0gOSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC0tbGVuZ3RoOworICAgICAgICAgICAgKytpbmRleDsKKyAgICAgICAgICAgIGlmIChyZXJlYWRfYnl0ZShmaWxlKSA9PSAwKSAvKiB0ZXJtaW5hdG9yICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvKiBTa2lwIHRoZSB0cmFuc2xhdGVkIGtleXdvcmQgKi8KKyAgICAgICAgICAgICAgIHdoaWxlIChsZW5ndGggPj0gOCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC0tbGVuZ3RoOworICAgICAgICAgICAgICAgICAgKytpbmRleDsKKyAgICAgICAgICAgICAgICAgIGlmIChyZXJlYWRfYnl0ZShmaWxlKSA9PSAwKSAvKiB0ZXJtaW5hdG9yICovCisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gemxpYl9jaGVjayhmaWxlLCBpbmRleCk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIC8qIFJhbiBvdXQgb2YgYnl0ZXMgaW4gdGhlIGNvbXByZXNzZWQgY2FzZS4gKi8KKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgfQorCisgICBsb2dfZXJyb3IoZmlsZSwgSU5WQUxJRF9FUlJPUl9DT0RFLCAiaVRYdCBjaHVuayBsZW5ndGgiKTsKKworICAgcmV0dXJuIDA7IC8qIHNraXAgKi8KK30KKworLyogSURBVCBSRUFEL1dSSVRFIENPTlRST0wgU1RSVUNUVVJFICovCitzdHJ1Y3QgSURBVAoreworICAgLyogQU5DRVNUT1JTICovCisgICBzdHJ1Y3QgZmlsZSAqICAgICAgICAgZmlsZTsKKyAgIHN0cnVjdCBnbG9iYWwgKiAgICAgICBnbG9iYWw7CisKKyAgIC8qIFBST1RFQ1RFRCBJREFUIElORk9STUFUSU9OOiBTRVQgQlkgVEhFIElEQVQgUkVBRCBDT0RFICovCisgICBzdHJ1Y3QgSURBVF9saXN0ICppZGF0X2xpc3RfaGVhZDsgLyogU1RBUlQgb2YgdGhlIGxpc3Qgb2YgSURBVCBpbmZvcm1hdGlvbiAqLworICAgc3RydWN0IElEQVRfbGlzdCAqaWRhdF9saXN0X3RhaWw7IC8qICpFTkQqIG9mIHRoZSBsaXN0IG9mIElEQVQgaW5mb3JtYXRpb24gKi8KKworICAgLyogUFJPVEVDVEVEIElEQVQgSU5GT1JNQVRJT046IFVTRUQgQlkgVEhFIElEQVQgV1JJVEUgQ09ERSAqLworICAgc3RydWN0IElEQVRfbGlzdCAqaWRhdF9jdXI7ICAgICAgIC8qIEN1cnJlbnQgbGlzdCBlbnRyeSAqLworICAgdW5zaWduZWQgaW50ICAgICAgaWRhdF9jb3VudDsgICAgIC8qIEFuZCB0aGUgKmN1cnJlbnQqIGluZGV4IGludG8gdGhlIGxpc3QgKi8KKyAgIHBuZ191aW50XzMyICAgICAgIGlkYXRfaW5kZXg7ICAgICAvKiBJbmRleCBvZiAqbmV4dCogaW5wdXQgYnl0ZSB0byB3cml0ZSAqLworICAgcG5nX3VpbnRfMzIgICAgICAgaWRhdF9sZW5ndGg7ICAgIC8qIENhY2hlIG9mIGN1cnJlbnQgY2h1bmsgbGVuZ3RoICovCit9OworCisvKiBOT1RFOiB0aGVyZSBpcyBjdXJyZW50bHkgbm8gSURBVF9yZXNldCwgc28gYSBzdHJlYW0gY2Fubm90IGNvbnRhaW4gbW9yZSB0aGFuCisgKiBvbmUgSURBVCBzZXF1ZW5jZSAoaS5lLiBNTkcgaXMgbm90IHN1cHBvcnRlZCkuCisgKi8KKworc3RhdGljIHZvaWQKK0lEQVRfZW5kKHN0cnVjdCBJREFUICoqaWRhdF92YXIpCit7CisgICBzdHJ1Y3QgSURBVCAqaWRhdCA9ICppZGF0X3ZhcjsKKyAgIHN0cnVjdCBmaWxlICpmaWxlID0gaWRhdC0+ZmlsZTsKKworICAgKmlkYXRfdmFyID0gTlVMTDsKKworICAgQ0xFQVIoKmlkYXQpOworCisgICBhc3NlcnQoZmlsZS0+Y2h1bmsgIT0gTlVMTCk7CisgICBjaHVua19lbmQoJmZpbGUtPmNodW5rKTsKKworICAgLyogUmVnYXJkbGVzcyBvZiB3aHkgdGhlIElEQVQgd2FzIGtpbGxlZCBzZXQgdGhlIHN0YXRlIGJhY2sgdG8gQ0hVTktTIChpdCBtYXkKKyAgICAqIGFscmVhZHkgYmUgQ0hVTktTIGJlY2F1c2UgdGhlIHN0YXRlIGlzbid0IGNoYW5nZWQgdW50aWwgcHJvY2Vzc19JREFUCisgICAgKiByZXR1cm5zOyBhIHN0b3Agd2lsbCBjYXVzZSBJREFUX2VuZCB0byBiZSBlbnRlcmVkIGluIHN0YXRlIENIVU5LUyEpCisgICAgKi8KKyAgIGZpbGUtPnN0YXRlID0gU1RBVEVfQ0hVTktTOworfQorCitzdGF0aWMgdm9pZAorSURBVF9pbml0KHN0cnVjdCBJREFUICogY29uc3QgaWRhdCwgc3RydWN0IGZpbGUgKiBjb25zdCBmaWxlKQorICAgLyogV2hlbiB0aGUgY2h1bmsgaXMgcG5nX0lEQVQgaW5zdGFudGlhdGUgYW4gSURBVCBjb250cm9sIHN0cnVjdHVyZSBpbiBwbGFjZQorICAgICogb2YgYSBjaHVuayBjb250cm9sIHN0cnVjdHVyZS4gIFRoZSBJREFUIHdpbGwgaW5zdGFudGlhdGUgYSBjaHVuayBjb250cm9sCisgICAgKiBzdHJ1Y3R1cmUgdXNpbmcgdGhlIGZpbGUgYWxsb2Mgcm91dGluZS4KKyAgICAqCisgICAgKiBOT1RFOiB0aGlzIHJvdXRpbmUgbXVzdCBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBmaWxlIGFsbG9jIHJvdXRpbmUhCisgICAgKi8KK3sKKyAgIGFzc2VydChmaWxlLT5jaHVuayA9PSBOVUxMKTsKKyAgIGFzc2VydChmaWxlLT5pZGF0ID09IE5VTEwpOworCisgICBDTEVBUigqaWRhdCk7CisKKyAgIGlkYXQtPmZpbGUgPSBmaWxlOworICAgaWRhdC0+Z2xvYmFsID0gZmlsZS0+Z2xvYmFsOworCisgICAvKiBJbml0aWFsaXplIHRoZSB0YWlsIHRvIHRoZSBwcmUtYWxsb2NhdGVkIGJ1ZmZlciBhbmQgc2V0IHRoZSBjb3VudCB0byAwCisgICAgKiAoZW1wdHkuKQorICAgICovCisgICBpZGF0LT5nbG9iYWwtPmlkYXRfY2FjaGUuY291bnQgPSAwOworICAgaWRhdC0+aWRhdF9saXN0X2hlYWQgPSBpZGF0LT5pZGF0X2xpc3RfdGFpbCA9ICZpZGF0LT5nbG9iYWwtPmlkYXRfY2FjaGU7CisKKyAgIC8qIE5vdyB0aGUgY2h1bmsuICBUaGUgYWxsb2NhdG9yIGNhbGxzIHRoZSBpbml0aWFsaXplciBvZiB0aGUgbmV3IGNodW5rIGFuZAorICAgICogc3RvcmVzIHRoZSByZXN1bHQgaW4gZmlsZS0+Y2h1bms6CisgICAgKi8KKyAgIGZpbGUtPmFsbG9jKGZpbGUsIDAvKmNodW5rKi8pOworICAgYXNzZXJ0KGZpbGUtPmNodW5rICE9IE5VTEwpOworCisgICAvKiBBbmQgc3RvcmUgdGhpcyBmb3IgY2xlYW51cCAoYW5kIHRvIGNoZWNrIGZvciBkb3VibGUgYWxsb2Mgb3IgZmFpbHVyZSB0bworICAgICogZnJlZS4pCisgICAgKi8KKyAgIGZpbGUtPmlkYXQgPSBpZGF0OworfQorCitzdGF0aWMgcG5nX3VpbnRfMzIKK3JlY2h1bmtfbGVuZ3RoKHN0cnVjdCBJREFUICppZGF0KQorICAgLyogUmV0dXJuIHRoZSBsZW5ndGggZm9yIHRoZSBuZXh0IElEQVQgY2h1bmssIHRha2luZyBpbnRvIGFjY291bnQKKyAgICAqIHJlY2h1bmtpbmcuCisgICAgKi8KK3sKKyAgIHBuZ191aW50XzMyIGxlbiA9IGlkYXQtPmdsb2JhbC0+aWRhdF9tYXg7CisKKyAgIGlmIChsZW4gPT0gMCkgLyogdXNlIG9yaWdpbmFsIGNodW5rIGxlbmd0aHMgKi8KKyAgIHsKKyAgICAgIGNvbnN0IHN0cnVjdCBJREFUX2xpc3QgKmN1cjsKKyAgICAgIHVuc2lnbmVkIGludCBjb3VudDsKKworICAgICAgaWYgKGlkYXQtPmlkYXRfaW5kZXggPT0gMCkgLyogYXQgdGhlIG5ldyBjaHVuayAoZmlyc3QgdGltZSkgKi8KKyAgICAgICAgIHJldHVybiBpZGF0LT5pZGF0X2xlbmd0aDsgLyogdXNlIHRoZSBjYWNoZSAqLworCisgICAgICAvKiBPdGhlcndpc2UgcmVjaHVua19sZW5ndGggaXMgY2FsbGVkIGF0IHRoZSBlbmQgb2YgYSBjaHVuayBmb3IgdGhlIGxlbmd0aAorICAgICAgICogb2YgdGhlIG5leHQgb25lLgorICAgICAgICovCisgICAgICBjdXIgPSBpZGF0LT5pZGF0X2N1cjsKKyAgICAgIGNvdW50ID0gaWRhdC0+aWRhdF9jb3VudDsKKworICAgICAgYXNzZXJ0KGlkYXQtPmlkYXRfaW5kZXggPT0gaWRhdC0+aWRhdF9sZW5ndGggJiYKKyAgICAgICAgIGlkYXQtPmlkYXRfbGVuZ3RoID09IGN1ci0+bGVuZ3Roc1tjb3VudF0pOworCisgICAgICAvKiBSZXR1cm4gbGVuZ3RoIG9mIHRoZSAqbmV4dCogY2h1bmsgKi8KKyAgICAgIGlmICgrK2NvdW50IDwgY3VyLT5jb3VudCkKKyAgICAgICAgIHJldHVybiBjdXItPmxlbmd0aHNbY291bnRdOworCisgICAgICAvKiBFbmQgb2YgdGhpcyBsaXN0ICovCisgICAgICBhc3NlcnQoY3VyICE9IGlkYXQtPmlkYXRfbGlzdF90YWlsKTsKKyAgICAgIGN1ciA9IGN1ci0+bmV4dDsKKyAgICAgIGFzc2VydChjdXIgIT0gTlVMTCAmJiBjdXItPmNvdW50ID4gMCk7CisgICAgICByZXR1cm4gY3VyLT5sZW5ndGhzWzBdOworICAgfQorCisgICBlbHNlIC8qIHJlY2h1bmtpbmcgKi8KKyAgIHsKKyAgICAgIC8qIFRoZSBjaHVuayBzaXplIGlzIHRoZSBsZXNzZXIgb2YgZmlsZS0+aWRhdF9tYXggYW5kIHRoZSBudW1iZXIKKyAgICAgICAqIG9mIHJlbWFpbmluZyBieXRlcy4KKyAgICAgICAqLworICAgICAgcG5nX3VpbnRfMzIgaGF2ZSA9IGlkYXQtPmlkYXRfbGVuZ3RoIC0gaWRhdC0+aWRhdF9pbmRleDsKKworICAgICAgaWYgKGxlbiA+IGhhdmUpCisgICAgICB7CisgICAgICAgICBzdHJ1Y3QgSURBVF9saXN0ICpjdXIgPSBpZGF0LT5pZGF0X2N1cjsKKyAgICAgICAgIHVuc2lnbmVkIGludCBqID0gaWRhdC0+aWRhdF9jb3VudCsxOyAvKiB0aGUgbmV4dCBJREFUIGluIHRoZSBsaXN0ICovCisKKyAgICAgICAgIGRvCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBBZGQgdXAgdGhlIHJlbWFpbmluZyBieXRlcy4gIFRoaXMgY2FuJ3Qgb3ZlcmZsb3cgYmVjYXVzZSB0aGUKKyAgICAgICAgICAgICAqIGluZGl2aWR1YWwgbGVuZ3RocyBhcmUgYWx3YXlzIDw9IDB4N2ZmZmZmZmYsIHNvIHdoZW4gd2UgYWRkIHR3bworICAgICAgICAgICAgICogb2YgdGhlbSBvdmVyZmxvdyBpcyBub3QgcG9zc2libGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGFzc2VydChjdXIgIT0gTlVMTCk7CisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvKiBOT1RFOiBJREFUX2xpc3Q6OmNvdW50IGhlcmUsIG5vdCBJREFUX2xpc3Q6Omxlbmd0aCAqLworICAgICAgICAgICAgICAgZm9yICg7IGogPCBjdXItPmNvdW50OyArK2opCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBoYXZlICs9IGN1ci0+bGVuZ3Roc1tqXTsKKyAgICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gaGF2ZSkKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsZW47CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIC8qIElmIHRoaXMgd2FzIHRoZSBlbmQgcmV0dXJuIHRoZSBjb3VudCBvZiB0aGUgYXZhaWxhYmxlIGJ5dGVzICovCisgICAgICAgICAgICAgICBpZiAoY3VyID09IGlkYXQtPmlkYXRfbGlzdF90YWlsKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhdmU7CisKKyAgICAgICAgICAgICAgIGN1ciA9IGN1ci0+bmV4dDsKKyAgICAgICAgICAgICAgIGogPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgd2hpbGUgKGxlbiA+IGhhdmUpOworICAgICAgfQorCisgICAgICByZXR1cm4gbGVuOworICAgfQorfQorCitzdGF0aWMgaW50Citwcm9jZXNzX0lEQVQoc3RydWN0IGZpbGUgKmZpbGUpCisgICAvKiBQcm9jZXNzIHRoZSBJREFUIHN0cmVhbSwgdGhpcyBpcyB0aGUgbW9yZSBjb21wbGV4IHRoYW4gdGhlIHByZWNlZGluZworICAgICogY2FzZXMgYmVjYXVzZSB0aGUgY29tcHJlc3NlZCBkYXRhIGlzIHNwcmVhZCBhY3Jvc3MgbXVsdGlwbGUgSURBVCBjaHVua3MKKyAgICAqICh0eXBpY2FsbHkpLiAgUmVjaHVua2luZyBvZiB0aGUgZGF0YSBpcyBub3QgaGFuZGxlZCBoZXJlOyBhbGwgdGhpcworICAgICogZnVuY3Rpb24gZG9lcyBpcyBlc3RhYmxpc2ggd2hldGhlciB0aGUgemxpYiBoZWFkZXIgbmVlZHMgdG8gYmUgbW9kaWZpZWQuCisgICAgKgorICAgICogSW5pdGlhbGx5IHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIGNodW5rIHNob3VsZCBub3QKKyAgICAqIGJlIHdyaXR0ZW4uICBJdCBkb2VzIHRoaXMgdW50aWwgdGhlIGxhc3QgSURBVCBjaHVuayBpcyBwYXNzZWQgaW4sIHRoZW4gaXQKKyAgICAqIGNoZWNrcyB0aGUgemxpYiBkYXRhIGFuZCByZXR1cm5zIHRydWUuCisgICAgKgorICAgICogSXQgZG9lcyBub3QgcmV0dXJuIGZhbHNlIG9uIGEgZmF0YWwgZXJyb3I7IGl0IGNhbGxzIHN0b3AgaW5zdGVhZC4KKyAgICAqCisgICAgKiBUaGUgY2FsbGVyIG11c3QgaGF2ZSBhbiBpbnN0YW50aWF0ZWQgKElEQVQpIGNvbnRyb2wgc3RydWN0dXJlIGFuZCBpdCBtdXN0CisgICAgKiBoYXZlIGV4dGVudCBvdmVyIHRoZSB3aG9sZSByZWFkIG9mIHRoZSBJREFUIHN0cmVhbS4gIEZvciBhIFBORyB0aGlzIG1lYW5zCisgICAgKiB0aGUgd2hvbGUgUE5HIHJlYWQsIGZvciBNTkcgaXQgY291bGQgaGF2ZSBsZXNzZXIgZXh0ZW50LgorICAgICovCit7CisgICBzdHJ1Y3QgSURBVF9saXN0ICpsaXN0OworCisgICBhc3NlcnQoZmlsZS0+aWRhdCAhPSBOVUxMICYmIGZpbGUtPmNodW5rICE9IE5VTEwpOworCisgICAvKiBXZSBuZWVkIHRvIGZpcnN0IGNoZWNrIHRoZSBlbnRpcmUgc2VxdWVuY2Ugb2YgSURBVCBjaHVua3MgdG8gZW5zdXJlIHRoZQorICAgICogc3RyZWFtIGlzIGluIHN5bmMuICBEbyB0aGlzIGJ5IGJ1aWxkaW5nIGEgbGlzdCBvZiBhbGwgdGhlIGNodW5rcyBhbmQKKyAgICAqIHJlY29yZGluZyB0aGUgbGVuZ3RoIG9mIGVhY2ggYmVjYXVzZSB0aGUgbGVuZ3RoIG1heSBoYXZlIGJlZW4gZml4ZWQgdXAgYnkKKyAgICAqIHN5bmNfc3RyZWFtIGJlbG93LgorICAgICoKKyAgICAqIEF0IHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2YgY2h1bmtzLCB3aGVyZSB0aGUgdHlwZSBvZiB0aGUgbmV4dCBjaHVuayBpcyBub3QKKyAgICAqIHBuZ19JREFULCBwcm9jZXNzIHRoZSB3aG9sZSBzdHJlYW0gdXNpbmcgdGhlIGxpc3QgZGF0YSB0byBjaGVjayB2YWxpZGl0eQorICAgICogdGhlbiByZXR1cm4gY29udHJvbCB0byB0aGUgc3RhcnQgYW5kIHJld3JpdGUgZXZlcnl0aGluZy4KKyAgICAqLworICAgbGlzdCA9IGZpbGUtPmlkYXQtPmlkYXRfbGlzdF90YWlsOworCisgICBpZiAobGlzdC0+Y291bnQgPT0gbGlzdC0+bGVuZ3RoKQorICAgeworICAgICAgbGlzdCA9IElEQVRfbGlzdF9leHRlbmQobGlzdCk7CisKKyAgICAgIGlmIChsaXN0ID09IE5VTEwpCisgICAgICAgICBzdG9wKGZpbGUsIFJFQURfRVJST1JfQ09ERSwgIm91dCBvZiBtZW1vcnkiKTsKKworICAgICAgLyogTW92ZSB0byB0aGUgbmV4dCBibG9jayAqLworICAgICAgbGlzdC0+Y291bnQgPSAwOworICAgICAgZmlsZS0+aWRhdC0+aWRhdF9saXN0X3RhaWwgPSBsaXN0OworICAgfQorCisgICAvKiBBbmQgZmlsbCBpbiB0aGUgbmV4dCBJREFUIGluZm9ybWF0aW9uIGJ1ZmZlci4gKi8KKyAgIGxpc3QtPmxlbmd0aHNbKGxpc3QtPmNvdW50KSsrXSA9IGZpbGUtPmNodW5rLT5jaHVua19sZW5ndGg7CisKKyAgIC8qIFRoZSB0eXBlIG9mIHRoZSBuZXh0IGNodW5rIHdhcyByZWNvcmRlZCBpbiB0aGUgZmlsZSBjb250cm9sIHN0cnVjdHVyZSBieQorICAgICogdGhlIGNhbGxlciwgaWYgdGhpcyBpcyBwbmdfSURBVCByZXR1cm4gJ3NraXAnIHRvIHRoZSBjYWxsZXIuCisgICAgKi8KKyAgIGlmIChmaWxlLT50eXBlID09IHBuZ19JREFUKQorICAgICAgcmV0dXJuIDA7IC8qIHNraXAgdGhpcyBmb3IgdGhlIG1vbWVudCAqLworCisgICAvKiBUaGlzIGlzIHRoZSBmaW5hbCBJREFUIGNodW5rLCBzbyBydW4gdGhlIHRlc3RzIHRvIGNoZWNrIGZvciB0aGUgdG9vIGZhcgorICAgICogYmFjayBlcnJvciBhbmQgcG9zc2libHkgb3B0aW1pemUgdGhlIHdpbmRvdyBiaXRzLiAgVGhpcyBtZWFucyBnb2luZyBiYWNrCisgICAgKiB0byB0aGUgc3RhcnQgb2YgdGhlIGZpcnN0IGNodW5rIGRhdGEsIHdoaWNoIGlzIHN0b3JlZCBpbiB0aGUgb3JpZ2luYWwKKyAgICAqIGNodW5rIGFsbG9jYXRpb24uCisgICAgKi8KKyAgIHNldHBvcyhmaWxlLT5jaHVuayk7CisKKyAgIGlmICh6bGliX2NoZWNrKGZpbGUsIDApKQorICAgeworICAgICAgc3RydWN0IElEQVQgKmlkYXQ7CisgICAgICBpbnQgY21wOworCisgICAgICAvKiBUaGUgSURBVCBzdHJlYW0gd2FzIHN1Y2Nlc3NmdWxseSB1bmNvbXByZXNzZWQ7IHNlZSB3aGV0aGVyIGl0CisgICAgICAgKiBjb250YWluZWQgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGJ5dGVzIG9mIGltYWdlIGRhdGEuCisgICAgICAgKi8KKyAgICAgIGNtcCA9IHVhcmJfY21wKGZpbGUtPmltYWdlX2J5dGVzLCBmaWxlLT5pbWFnZV9kaWdpdHMsCisgICAgICAgICBmaWxlLT5jaHVuay0+dW5jb21wcmVzc2VkX2J5dGVzLCBmaWxlLT5jaHVuay0+dW5jb21wcmVzc2VkX2RpZ2l0cyk7CisKKyAgICAgIGlmIChjbXAgPCAwKQorICAgICAgICAgdHlwZV9tZXNzYWdlKGZpbGUsIHBuZ19JREFULCAiZXh0cmEgdW5jb21wcmVzc2VkIGRhdGEiKTsKKworICAgICAgZWxzZSBpZiAoY21wID4gMCkKKyAgICAgICAgIHN0b3AoZmlsZSwgTElCUE5HX0VSUk9SX0NPREUsICJJREFUOiB1bmNvbXByZXNzZWQgZGF0YSB0b28gc21hbGwiKTsKKworICAgICAgLyogUmV0dXJuIHRoZSBzdHJlYW0gdG8gdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCBJREFUIGNodW5rOyB0aGUgbGVuZ3RoCisgICAgICAgKiBpcyBzZXQgaW4gdGhlIHdyaXRlIGNhc2UgYmVsb3cgYnV0IHRoZSBpbnB1dCBjaHVuayB2YXJpYWJsZXMgbXVzdCBiZQorICAgICAgICogc2V0IChvbmNlKSBoZXJlOgorICAgICAgICovCisgICAgICBzZXRwb3MoZmlsZS0+Y2h1bmspOworCisgICAgICBpZGF0ID0gZmlsZS0+aWRhdDsKKyAgICAgIGlkYXQtPmlkYXRfY3VyID0gaWRhdC0+aWRhdF9saXN0X2hlYWQ7CisgICAgICBpZGF0LT5pZGF0X2xlbmd0aCA9IGlkYXQtPmlkYXRfY3VyLT5sZW5ndGhzWzBdOworICAgICAgaWRhdC0+aWRhdF9jb3VudCA9IDA7IC8qIENvdW50IG9mIGNodW5rcyByZWFkIGluIGN1cnJlbnQgbGlzdCAqLworICAgICAgaWRhdC0+aWRhdF9pbmRleCA9IDA7IC8qIEluZGV4IGludG8gY2h1bmsgZGF0YSAqLworCisgICAgICAvKiBVcGRhdGUgdGhlIGNodW5rIGxlbmd0aCB0byB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgdGhlIElEQVQgY2h1bms6ICovCisgICAgICBmaWxlLT5jaHVuay0+Y2h1bmtfbGVuZ3RoID0gcmVjaHVua19sZW5ndGgoaWRhdCk7CisKKyAgICAgIC8qIENoYW5nZSB0aGUgc3RhdGUgdG8gd3JpdGluZyBJREFUIGNodW5rcyAqLworICAgICAgZmlsZS0+c3RhdGUgPSBTVEFURV9JREFUOworCisgICAgICByZXR1cm4gMTsKKyAgIH0KKworICAgZWxzZSAvKiBGYWlsdXJlIHRvIGRlY29tcHJlc3MgdGhlIElEQVQgc3RyZWFtOyBnaXZlIHVwLiAqLworICAgICAgc3RvcChmaWxlLCBaTElCX0VSUk9SX0NPREUsICJjb3VsZCBub3QgdW5jb21wcmVzcyBJREFUIik7Cit9CisKKy8qIFpMSUIgQ09OVFJPTCBTVFJVQ1RVUkUgKi8KK3N0cnVjdCB6bGliCit7CisgICAvKiBBTkNFU1RPUlMgKi8KKyAgIHN0cnVjdCBJREFUICogIGlkYXQ7ICAgICAgICAgIC8qIE5PVEU6IE1heSBiZSBOVUxMICovCisgICBzdHJ1Y3QgY2h1bmsgKiBjaHVuazsKKyAgIHN0cnVjdCBmaWxlICogIGZpbGU7CisgICBzdHJ1Y3QgZ2xvYmFsICpnbG9iYWw7CisKKyAgIC8qIEdMT0JBTCBaTElCIElORk9STUFUSU9OOiBTRVQgQlkgVEhFIENBTExFUiAqLworICAgcG5nX3VpbnRfMzIgICAgcmV3cml0ZV9vZmZzZXQ7CisKKyAgIC8qIEdMT0JBTCBaTElCIElORk9STUFUSU9OOiBTRVQgQlkgVEhFIFpMSUIgUkVBRCBDT0RFICovCisgICB1ZGlnaXQgICAgICAgICBjb21wcmVzc2VkX2J5dGVzWzVdOworICAgaW50ICAgICAgICAgICAgY29tcHJlc3NlZF9kaWdpdHM7CisgICB1ZGlnaXQgICAgICAgICB1bmNvbXByZXNzZWRfYnl0ZXNbNV07CisgICBpbnQgICAgICAgICAgICB1bmNvbXByZXNzZWRfZGlnaXRzOworICAgaW50ICAgICAgICAgICAgZmlsZV9iaXRzOyAgICAgICAgICAgICAvKiB3aW5kb3cgYml0cyBmcm9tIHRoZSBmaWxlICovCisgICBpbnQgICAgICAgICAgICBva19iaXRzOyAgICAgICAgICAgICAgIC8qIFNldCA8MTYgb24gYSBzdWNjZXNzZnVsIHJlYWQgKi8KKyAgIGludCAgICAgICAgICAgIGNrc3VtOyAgICAgICAgICAgICAgICAgLyogU2V0IG9uIGEgY2hlY2tzdW0gZXJyb3IgKi8KKworICAgLyogUFJPVEVDVEVEIFpMSUIgSU5GT1JNQVRJT046IFVTRUQgQlkgVEhFIFpMSUIgUk9VVElORVMgKi8KKyAgIHpfc3RyZWFtICAgICAgIHo7CisgICBwbmdfdWludF8zMiAgICBleHRyYV9ieXRlczsgICAvKiBDb3VudCBvZiBleHRyYSBjb21wcmVzc2VkIGJ5dGVzICovCisgICBpbnQgICAgICAgICAgICBzdGF0ZTsKKyAgIGludCAgICAgICAgICAgIHJjOyAgICAgICAgICAgIC8qIExhc3QgcmV0dXJuIGNvZGUgKi8KKyAgIGludCAgICAgICAgICAgIHdpbmRvd19iaXRzOyAgIC8qIDAgaWYgbm8gY2hhbmdlICovCisgICBwbmdfYnl0ZSAgICAgICBoZWFkZXJbMl07Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqCit6bGliX2ZsZXZlbChzdHJ1Y3QgemxpYiAqemxpYikKK3sKKyAgIHN3aXRjaCAoemxpYi0+aGVhZGVyWzFdID4+IDYpCisgICB7CisgICAgICBjYXNlIDA6ICByZXR1cm4gInN1cGZhc3QiOworICAgICAgY2FzZSAxOiAgcmV0dXJuICJzdGRmYXN0IjsKKyAgICAgIGNhc2UgMjogIHJldHVybiAiZGVmYXVsdCI7CisgICAgICBjYXNlIDM6ICByZXR1cm4gIm1heGltdW0iOworICAgICAgZGVmYXVsdDogYXNzZXJ0KFVOUkVBQ0hFRCk7CisgICB9CisKKyAgIHJldHVybiAiQ09NUElMRVIgQlVHIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgoremxpYl9yYyhzdHJ1Y3QgemxpYiAqemxpYikKKyAgIC8qIFJldHVybiBhIHN0cmluZyBmb3IgdGhlIHpsaWIgcmV0dXJuIGNvZGUgKi8KK3sKKyAgIHN3aXRjaCAoemxpYi0+cmMpCisgICB7CisgICAgICBjYXNlIFpfT0s6ICAgICAgICAgICAgICByZXR1cm4gIlpfT0siOworICAgICAgY2FzZSBaX1NUUkVBTV9FTkQ6ICAgICAgcmV0dXJuICJaX1NUUkVBTV9FTkQiOworICAgICAgY2FzZSBaX05FRURfRElDVDogICAgICAgcmV0dXJuICJaX05FRURfRElDVCI7CisgICAgICBjYXNlIFpfRVJSTk86ICAgICAgICAgICByZXR1cm4gIlpfRVJSTk8iOworICAgICAgY2FzZSBaX1NUUkVBTV9FUlJPUjogICAgcmV0dXJuICJaX1NUUkVBTV9FUlJPUiI7CisgICAgICBjYXNlIFpfREFUQV9FUlJPUjogICAgICByZXR1cm4gIlpfREFUQV9FUlJPUiI7CisgICAgICBjYXNlIFpfTUVNX0VSUk9SOiAgICAgICByZXR1cm4gIlpfTUVNX0VSUk9SIjsKKyAgICAgIGNhc2UgWl9CVUZfRVJST1I6ICAgICAgIHJldHVybiAiWl9CVUZfRVJST1IiOworICAgICAgY2FzZSBaX1ZFUlNJT05fRVJST1I6ICAgcmV0dXJuICJaX1ZFUlNJT05fRVJST1IiOworICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgcmV0dXJuICJaXypJTlZBTElEX1JDKiI7CisgICB9Cit9CisKK3N0YXRpYyB2b2lkCit6bGliX21lc3NhZ2Uoc3RydWN0IHpsaWIgKnpsaWIsIGludCB1bmV4cGVjdGVkKQorICAgLyogT3V0cHV0IGEgbWVzc2FnZSBnaXZlbiBhIHpsaWIgcmMgKi8KK3sKKyAgIGlmICh6bGliLT5nbG9iYWwtPmVycm9ycykKKyAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnJlYXNvbiA9IHpsaWItPnoubXNnOworCisgICAgICBpZiAocmVhc29uID09IE5VTEwpCisgICAgICAgICByZWFzb24gPSAiW25vIG1lc3NhZ2VdIjsKKworICAgICAgZnB1dHMoemxpYi0+ZmlsZS0+ZmlsZV9uYW1lLCBzdGRlcnIpOworICAgICAgdHlwZV9zZXAoc3RkZXJyKTsKKyAgICAgIHR5cGVfbmFtZSh6bGliLT5jaHVuay0+Y2h1bmtfdHlwZSwgc3RkZXJyKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiOiAlc3psaWIgZXJyb3I6ICVkICglcykgKCVzKVxuIiwKKyAgICAgICAgIHVuZXhwZWN0ZWQgPyAidW5leHBlY3RlZCAiIDogIiIsIHpsaWItPnJjLCB6bGliX3JjKHpsaWIpLCByZWFzb24pOworICAgfQorfQorCitzdGF0aWMgdm9pZAoremxpYl9lbmQoc3RydWN0IHpsaWIgKnpsaWIpCit7CisgICAvKiBPdXRwdXQgdGhlIHN1bW1hcnkgbGluZSBub3c7IHRoaXMgZW5zdXJlcyBhIHN1bW1hcnkgbGluZSBhbHdheXMgZ2V0cworICAgICogb3V0cHV0IHJlZ2FyZGxlc3Mgb2YgdGhlIG1hbm5lciBvZiBleGl0LgorICAgICovCisgICBpZiAoIXpsaWItPmdsb2JhbC0+cXVpZXQpCisgICB7CisgICAgICBpZiAoemxpYi0+b2tfYml0cyA8IDE2KSAvKiBzdHJlYW0gd2FzIHJlYWQgb2sgKi8KKyAgICAgIHsKKyAgICAgICAgIGNvbnN0IGNoYXIgKnJlYXNvbjsKKworICAgICAgICAgaWYgKHpsaWItPmNrc3VtKQorICAgICAgICAgICAgcmVhc29uID0gIkNISyI7IC8qIGNoZWNrc3VtIGVycm9yICovCisKKyAgICAgICAgIGVsc2UgaWYgKHpsaWItPm9rX2JpdHMgPiB6bGliLT5maWxlX2JpdHMpCisgICAgICAgICAgICByZWFzb24gPSAiVEZCIjsgLyogZml4aW5nIGEgdG9vLWZhci1iYWNrIGVycm9yICovCisKKyAgICAgICAgIGVsc2UgaWYgKHpsaWItPm9rX2JpdHMgPT0gemxpYi0+ZmlsZV9iaXRzKQorICAgICAgICAgICAgcmVhc29uID0gIk9LICI7CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlYXNvbiA9ICJPUFQiOyAvKiBvcHRpbWl6aW5nIHdpbmRvdyBiaXRzICovCisKKyAgICAgICAgIC8qIFNVTU1BUlkgRk9STUFUIChmb3IgYSBzdWNjZXNzZnVsIHpsaWIgaW5mbGF0ZSk6CisgICAgICAgICAgKgorICAgICAgICAgICogSURBVCByZWFzb24gZmxldmVsIGZpbGUtYml0cyBvay1iaXRzIGNvbXByZXNzZWQgdW5jb21wcmVzc2VkIGZpbGUKKyAgICAgICAgICAqLworICAgICAgICAgdHlwZV9uYW1lKHpsaWItPmNodW5rLT5jaHVua190eXBlLCBzdGRvdXQpOworICAgICAgICAgcHJpbnRmKCIgJXMgJXMgJWQgJWQgIiwgcmVhc29uLCB6bGliX2ZsZXZlbCh6bGliKSwgemxpYi0+ZmlsZV9iaXRzLAorICAgICAgICAgICAgemxpYi0+b2tfYml0cyk7CisgICAgICAgICB1YXJiX3ByaW50KHpsaWItPmNvbXByZXNzZWRfYnl0ZXMsIHpsaWItPmNvbXByZXNzZWRfZGlnaXRzLCBzdGRvdXQpOworICAgICAgICAgcHV0YygnICcsIHN0ZG91dCk7CisgICAgICAgICB1YXJiX3ByaW50KHpsaWItPnVuY29tcHJlc3NlZF9ieXRlcywgemxpYi0+dW5jb21wcmVzc2VkX2RpZ2l0cywKKyAgICAgICAgICAgIHN0ZG91dCk7CisgICAgICAgICBwdXRjKCcgJywgc3Rkb3V0KTsKKyAgICAgICAgIGZwdXRzKHpsaWItPmZpbGUtPmZpbGVfbmFtZSwgc3Rkb3V0KTsKKyAgICAgICAgIHB1dGMoJ1xuJywgc3Rkb3V0KTsKKyAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgLyogVGhpcyBpcyBhIHpsaWIgcmVhZCBlcnJvcjsgdGhlIGNodW5rIHdpbGwgYmUgc2tpcHBlZC4gIEZvciBhbiBJREFUCisgICAgICAgICAgKiBzdHJlYW0gdGhpcyB3aWxsIGFsc28gY2F1c2UgYSBmYXRhbCByZWFkIGVycm9yICh2aWEgc3RvcCgpKS4KKyAgICAgICAgICAqCisgICAgICAgICAgKiBTVU1NQVJZIEZPUk1BVDoKKyAgICAgICAgICAqCisgICAgICAgICAgKiBJREFUIFNLUCBmbGV2ZWwgZmlsZS1iaXRzIHotcmMgY29tcHJlc3NlZCBtZXNzYWdlIGZpbGUKKyAgICAgICAgICAqCisgICAgICAgICAgKiB6LXJjIGlzIHRoZSB6bGliIGZhaWx1cmUgY29kZTsgbWVzc2FnZSBpcyB0aGUgZXJyb3IgbWVzc2FnZSB3aXRoCisgICAgICAgICAgKiBzcGFjZXMgcmVwbGFjZWQgYnkgJy0nLiAgVGhlIGNvbXByZXNzZWQgYnl0ZSBjb3VudCBpbmRpY2F0ZXMgd2hlcmUKKyAgICAgICAgICAqIGluIHRoZSB6bGliIHN0cmVhbSB0aGUgZXJyb3Igb2NjdXJyZWQuCisgICAgICAgICAgKi8KKyAgICAgICAgIHR5cGVfbmFtZSh6bGliLT5jaHVuay0+Y2h1bmtfdHlwZSwgc3Rkb3V0KTsKKyAgICAgICAgIHByaW50ZigiIFNLUCAlcyAlZCAlcyAiLCB6bGliX2ZsZXZlbCh6bGliKSwgemxpYi0+ZmlsZV9iaXRzLAorICAgICAgICAgICAgemxpYl9yYyh6bGliKSk7CisgICAgICAgICB1YXJiX3ByaW50KHpsaWItPmNvbXByZXNzZWRfYnl0ZXMsIHpsaWItPmNvbXByZXNzZWRfZGlnaXRzLCBzdGRvdXQpOworICAgICAgICAgcHV0YygnICcsIHN0ZG91dCk7CisgICAgICAgICBlbWl0X3N0cmluZyh6bGliLT56Lm1zZyA/IHpsaWItPnoubXNnIDogIltub19tZXNzYWdlXSIsIHN0ZG91dCk7CisgICAgICAgICBwdXRjKCcgJywgc3Rkb3V0KTsKKyAgICAgICAgIGZwdXRzKHpsaWItPmZpbGUtPmZpbGVfbmFtZSwgc3Rkb3V0KTsKKyAgICAgICAgIHB1dGMoJ1xuJywgc3Rkb3V0KTsKKyAgICAgIH0KKyAgIH0KKworICAgaWYgKHpsaWItPnN0YXRlID49IDApCisgICB7CisgICAgICB6bGliLT5yYyA9IGluZmxhdGVFbmQoJnpsaWItPnopOworCisgICAgICBpZiAoemxpYi0+cmMgIT0gWl9PSykKKyAgICAgICAgIHpsaWJfbWVzc2FnZSh6bGliLCAxLyp1bmV4cGVjdGVkKi8pOworICAgfQorCisgICBDTEVBUigqemxpYik7Cit9CisKK3N0YXRpYyBpbnQKK3psaWJfcmVzZXQoc3RydWN0IHpsaWIgKnpsaWIsIGludCB3aW5kb3dfYml0cykKKyAgIC8qIFJlaW5pdGlhbGl6ZXMgYSB6bGliIHdpdGggYSBkaWZmZXJlbnQgd2luZG93X2JpdHMgKi8KK3sKKyAgIGFzc2VydCh6bGliLT5zdGF0ZSA+PSAwKTsgLyogaW5pdGlhbGl6ZWQgYnkgemxpYl9pbml0ICovCisKKyAgIHpsaWItPnoubmV4dF9pbiA9IFpfTlVMTDsKKyAgIHpsaWItPnouYXZhaWxfaW4gPSAwOworICAgemxpYi0+ei5uZXh0X291dCA9IFpfTlVMTDsKKyAgIHpsaWItPnouYXZhaWxfb3V0ID0gMDsKKworICAgemxpYi0+d2luZG93X2JpdHMgPSB3aW5kb3dfYml0czsKKyAgIHpsaWItPmNvbXByZXNzZWRfZGlnaXRzID0gMDsKKyAgIHpsaWItPnVuY29tcHJlc3NlZF9kaWdpdHMgPSAwOworCisgICB6bGliLT5zdGF0ZSA9IDA7IC8qIGluaXRpYWxpemVkLCBvbmNlICovCisgICB6bGliLT5yYyA9IGluZmxhdGVSZXNldDIoJnpsaWItPnosIDApOworICAgaWYgKHpsaWItPnJjICE9IFpfT0spCisgICB7CisgICAgICB6bGliX21lc3NhZ2UoemxpYiwgMS8qdW5leHBlY3RlZCovKTsKKyAgICAgIHJldHVybiAwOworICAgfQorCisgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludAoremxpYl9pbml0KHN0cnVjdCB6bGliICp6bGliLCBzdHJ1Y3QgSURBVCAqaWRhdCwgc3RydWN0IGNodW5rICpjaHVuaywKKyAgIGludCB3aW5kb3dfYml0cywgcG5nX3VpbnRfMzIgb2Zmc2V0KQorICAgLyogSW5pdGlhbGl6ZSBhIHpsaWJfY29udHJvbDsgdGhlIHJlc3VsdCBpcyB0cnVlL2ZhbHNlICovCit7CisgICBDTEVBUigqemxpYik7CisKKyAgIHpsaWItPmlkYXQgPSBpZGF0OworICAgemxpYi0+Y2h1bmsgPSBjaHVuazsKKyAgIHpsaWItPmZpbGUgPSBjaHVuay0+ZmlsZTsKKyAgIHpsaWItPmdsb2JhbCA9IGNodW5rLT5nbG9iYWw7CisgICB6bGliLT5yZXdyaXRlX29mZnNldCA9IG9mZnNldDsgLyogbmV2ZXIgY2hhbmdlZCBmb3IgdGhpcyB6bGliICovCisKKyAgIC8qICpfb3V0IGRvZXMgbm90IG5lZWQgdG8gYmUgc2V0OiAqLworICAgemxpYi0+ei5uZXh0X2luID0gWl9OVUxMOworICAgemxpYi0+ei5hdmFpbF9pbiA9IDA7CisgICB6bGliLT56LnphbGxvYyA9IFpfTlVMTDsKKyAgIHpsaWItPnouemZyZWUgPSBaX05VTEw7CisgICB6bGliLT56Lm9wYXF1ZSA9IFpfTlVMTDsKKworICAgemxpYi0+c3RhdGUgPSAtMTsKKyAgIHpsaWItPndpbmRvd19iaXRzID0gd2luZG93X2JpdHM7CisKKyAgIHpsaWItPmNvbXByZXNzZWRfZGlnaXRzID0gMDsKKyAgIHpsaWItPnVuY29tcHJlc3NlZF9kaWdpdHMgPSAwOworCisgICAvKiBUaGVzZSB2YWx1ZXMgYXJlIHN0aWNreSBhY3Jvc3MgcmVzZXQgKGluIGFkZGl0aW9uIHRvIHRoZSBzdHVmZiBpbiB0aGUKKyAgICAqIGZpcnN0IGJsb2NrLCB3aGljaCBpcyBhY3R1YWxseSBjb25zdGFudC4pCisgICAgKi8KKyAgIHpsaWItPmZpbGVfYml0cyA9IDI0OworICAgemxpYi0+b2tfYml0cyA9IDE2OyAvKiB1bnNldCAqLworICAgemxpYi0+Y2tzdW0gPSAwOyAvKiBzZXQgd2hlbiBhIGNoZWNrc3VtIGVycm9yIGlzIGRldGVjdGVkICovCisKKyAgIC8qICcwJyBtZWFucyB1c2UgdGhlIGhlYWRlcjsgaW5mbGF0ZUluaXQyIHNob3VsZCBhbHdheXMgc3VjY2VlZCBiZWNhdXNlIGl0CisgICAgKiBkb2VzIG5vdGhpbmcgYXBhcnQgZnJvbSBhbGxvY2F0aW5nIHRoZSBpbnRlcm5hbCB6c3RhdGUuCisgICAgKi8KKyAgIHpsaWItPnJjID0gaW5mbGF0ZUluaXQyKCZ6bGliLT56LCAwKTsKKyAgIGlmICh6bGliLT5yYyAhPSBaX09LKQorICAgeworICAgICAgemxpYl9tZXNzYWdlKHpsaWIsIDEvKnVuZXhwZWN0ZWQqLyk7CisgICAgICByZXR1cm4gMDsKKyAgIH0KKworICAgZWxzZQorICAgeworICAgICAgemxpYi0+c3RhdGUgPSAwOyAvKiBpbml0aWFsaXplZCAqLworICAgICAgcmV0dXJuIDE7CisgICB9Cit9CisKK3N0YXRpYyBpbnQKK21heF93aW5kb3dfYml0cyh1YXJiYyBzaXplLCBpbnQgbmRpZ2l0cykKKyAgIC8qIFJldHVybiB0aGUgemxpYiBzdHJlYW0gd2luZG93IGJpdHMgcmVxdWlyZWQgZm9yIGRhdGEgb2YgdGhlIGdpdmVuIHNpemUuICovCit7CisgICBwbmdfdWludF8xNiBjYjsKKworICAgaWYgKG5kaWdpdHMgPiAxKQorICAgICAgcmV0dXJuIDE1OworCisgICBjYiA9IHNpemVbMF07CisKKyAgIGlmIChjYiA+IDE2Mzg0KSByZXR1cm4gMTU7CisgICBpZiAoY2IgPiAgODE5MikgcmV0dXJuIDE0OworICAgaWYgKGNiID4gIDQwOTYpIHJldHVybiAxMzsKKyAgIGlmIChjYiA+ICAyMDQ4KSByZXR1cm4gMTI7CisgICBpZiAoY2IgPiAgMTAyNCkgcmV0dXJuIDExOworICAgaWYgKGNiID4gICA1MTIpIHJldHVybiAxMDsKKyAgIGlmIChjYiA+ICAgMjU2KSByZXR1cm4gIDk7CisgICByZXR1cm4gODsKK30KKworc3RhdGljIGludAoremxpYl9hZHZhbmNlKHN0cnVjdCB6bGliICp6bGliLCBwbmdfdWludF8zMiBuYnl0ZXMpCisgICAvKiBSZWFkIG5ieXRlcyBjb21wcmVzc2VkIGJ5dGVzOyB0aGUgc3RyZWFtIHdpbGwgYmUgaW5pdGlhbGl6ZWQgaWYgcmVxdWlyZWQuCisgICAgKiBCeXRlcyBhcmUgYWx3YXlzIGJlaW5nIHJlcmVhZCBhbmQgZXJyb3JzIGFyZSBmYXRhbC4gIFRoZSByZXR1cm4gY29kZSBpcyBhcworICAgICogZm9sbG93czoKKyAgICAqCisgICAgKiAgICAtMTogc2F3IHRoZSAidG9vIGZhciBiYWNrIiBlcnJvcgorICAgICogICAgIDA6IG9rLCBrZWVwIGdvaW5nCisgICAgKiAgICAgMTogc2F3IFpfU1RSRUFNX0VORCAoemxpYi0+ZXh0cmFfYnl0ZXMgaW5kaWNhdGVzIHRvbyBtdWNoIGRhdGEpCisgICAgKiAgICAgMjogYSB6bGliIGVycm9yIHRoYXQgY2Fubm90IGJlIGNvcnJlY3RlZCAoZXJyb3IgbWVzc2FnZSBhbHJlYWR5CisgICAgKiAgICAgICAgb3V0cHV0IGlmIHJlcXVpcmVkLikKKyAgICAqLworIyAgZGVmaW5lIFpMSUJfVE9PX0ZBUl9CQUNLICgtMSkKKyMgIGRlZmluZSBaTElCX09LICAgICAgICAgICAwCisjICBkZWZpbmUgWkxJQl9TVFJFQU1fRU5EICAgMQorIyAgZGVmaW5lIFpMSUJfRkFUQUwgICAgICAgIDIKK3sKKyAgIGludCBzdGF0ZSA9IHpsaWItPnN0YXRlOworICAgaW50IGVuZHJjID0gWkxJQl9PSzsKKyAgIHBuZ191aW50XzMyIGluX2J5dGVzID0gMDsKKyAgIHN0cnVjdCBmaWxlICpmaWxlID0gemxpYi0+ZmlsZTsKKworICAgYXNzZXJ0KHN0YXRlID49IDApOworCisgICB3aGlsZSAoaW5fYnl0ZXMgPCBuYnl0ZXMgJiYgZW5kcmMgPT0gWkxJQl9PSykKKyAgIHsKKyAgICAgIHBuZ191aW50XzMyIG91dF9ieXRlczsKKyAgICAgIGludCBmbHVzaDsKKyAgICAgIHBuZ19ieXRlIGJJbiA9IHJlcmVhZF9ieXRlKGZpbGUpOworICAgICAgcG5nX2J5dGUgYk91dDsKKworICAgICAgc3dpdGNoIChzdGF0ZSkKKyAgICAgIHsKKyAgICAgICAgIGNhc2UgMDogLyogZmlyc3QgaGVhZGVyIGJ5dGUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGludCBmaWxlX2JpdHMgPSA4KyhiSW4gPj4gNCk7CisgICAgICAgICAgICAgICBpbnQgbmV3X2JpdHMgPSB6bGliLT53aW5kb3dfYml0czsKKworICAgICAgICAgICAgICAgemxpYi0+ZmlsZV9iaXRzID0gZmlsZV9iaXRzOworCisgICAgICAgICAgICAgICAvKiBDaGVjayBhZ2FpbnN0IHRoZSBleGlzdGluZyB2YWx1ZSAtIGl0IG1heSBub3QgbmVlZCB0byBiZQorICAgICAgICAgICAgICAgICogY2hhbmdlZC4gIE5vdGUgdGhhdCBhIGJvZ3VzIGZpbGVfYml0cyBpcyBhbGxvd2VkIHRocm91Z2ggb25jZSwKKyAgICAgICAgICAgICAgICAqIHRvIHNlZSBpZiBpdCB3b3JrcywgYnV0IHRoZSB3aW5kb3dfYml0cyB2YWx1ZSBpcyBzZXQgdG8gMTUsCisgICAgICAgICAgICAgICAgKiB0aGUgbWF4aW11bS4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgaWYgKG5ld19iaXRzID09IDApIC8qIG5vIGNoYW5nZSAqLworICAgICAgICAgICAgICAgICAgemxpYi0+d2luZG93X2JpdHMgPSAoKGZpbGVfYml0cyA+IDE1KSA/IDE1IDogZmlsZV9iaXRzKTsKKworICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3X2JpdHMgIT0gZmlsZV9iaXRzKSAvKiByZXdyaXRlIHJlcXVpcmVkICovCisgICAgICAgICAgICAgICAgICBiSW4gPSAocG5nX2J5dGUpKChiSW4gJiAweGYpICsgKChuZXdfYml0cy04KSA8PCA0KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHpsaWItPmhlYWRlclswXSA9IGJJbjsKKyAgICAgICAgICAgIHpsaWItPnN0YXRlID0gc3RhdGUgPSAxOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgMTogLyogc2Vjb25kIGhlYWRlciBieXRlICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpbnQgYjIgPSBiSW4gJiAweGUwOyAvKiB0b3AgMyBiaXRzICovCisKKyAgICAgICAgICAgICAgIC8qIFRoZSBjaGVja3N1bSBjYWxjdWxhdGlvbiwgb24gdGhlIGZpcnN0IDExIGJpdHM6ICovCisgICAgICAgICAgICAgICBiMiArPSAweDFmIC0gKCh6bGliLT5oZWFkZXJbMF0gPDwgOCkgKyBiMikgJSAweDFmOworCisgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIGNoZWNrc3VtIGJ5dGUgaWYgcmVxdWlyZWQ6ICovCisgICAgICAgICAgICAgICBpZiAoYkluICE9IGIyKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIGZpcnN0IGJ5dGUgd2Fzbid0IGNoYW5nZWQgdGhpcyBpbmRpY2F0ZXMgYW4gZXJyb3IgaW4KKyAgICAgICAgICAgICAgICAgICAqIHRoZSBjaGVja3N1bSBjYWxjdWxhdGlvbjsgc2lnbmFsIHRoaXMgYnkgc2V0dGluZyAnY2tzdW0nLgorICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBpZiAoemxpYi0+ZmlsZV9iaXRzID09IHpsaWItPndpbmRvd19iaXRzKQorICAgICAgICAgICAgICAgICAgICAgemxpYi0+Y2tzdW0gPSAxOworCisgICAgICAgICAgICAgICAgICBiSW4gPSAocG5nX2J5dGUpYjI7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHpsaWItPmhlYWRlclsxXSA9IGJJbjsKKyAgICAgICAgICAgIHpsaWItPnN0YXRlID0gc3RhdGUgPSAyOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGRlZmF1bHQ6IC8qIEFmdGVyIHRoZSBoZWFkZXIgYnl0ZXMgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvKiBGb3Igc29tZSBzdHJlYW1zLCBwZXJoYXBzIG9ubHkgdGhvc2UgY29tcHJlc3NlZCB3aXRoICdzdXBlcmZhc3QKKyAgICAgICAqIGNvbXByZXNzaW9uJyAod2hpY2ggcmVzdWx0cyBpbiBhIGxvdCBvZiBjb3B5aW5nKSBaX0JVRl9FUlJPUiBjYW4gaGFwcGVuCisgICAgICAgKiBpbW1lZGlhdGVseSBhZnRlciBhbGwgb3V0cHV0IGhhcyBiZWVuIGZsdXNoZWQgb24gdGhlIG5leHQgaW5wdXQgYnl0ZS4KKyAgICAgICAqIFRoaXMgaXMgaGFuZGxlZCBiZWxvdyB3aGVuIFpfQlVGX0VSUk9SIGlzIGRldGVjdGVkIGJ5IGFkZGluZyBhbiBvdXRwdXQKKyAgICAgICAqIGJ5dGUuCisgICAgICAgKi8KKyAgICAgIHpsaWItPnoubmV4dF9pbiA9ICZiSW47CisgICAgICB6bGliLT56LmF2YWlsX2luID0gMTsKKyAgICAgIHpsaWItPnoubmV4dF9vdXQgPSAmYk91dDsKKyAgICAgIHpsaWItPnouYXZhaWxfb3V0ID0gMDsgICAgIC8qIEluaXRpYWxseSAqLworCisgICAgICAvKiBJbml0aWFsbHkgdXNlIFpfTk9fRkxVU0ggaW4gYW4gYXR0ZW1wdCB0byBwZXJzdWFkZSB6bGliIHRvIGxvb2sgYXQgdGhpcworICAgICAgICogYnl0ZSB3aXRob3V0IGNvbmZ1c2luZyB3aGF0IGlzIGdvaW5nIG9uIHdpdGggb3V0cHV0LgorICAgICAgICovCisgICAgICBmbHVzaCA9IFpfTk9fRkxVU0g7CisgICAgICBvdXRfYnl0ZXMgPSAwOworCisgICAgICAvKiBOT1RFOiBleHByZXNzaW9uIDMgaXMgb25seSBldmFsdXRlZCBvbiAnY29udGludWUnLCBiZWNhdXNlIG9mIHRoZQorICAgICAgICogJ2JyZWFrJyBhdCB0aGUgZW5kIG9mIHRoaXMgbG9vcCBiZWxvdy4KKyAgICAgICAqLworICAgICAgZm9yICg7ZW5kcmMgPT0gWkxJQl9PSzsKKyAgICAgICAgIGZsdXNoID0gWl9TWU5DX0ZMVVNILAorICAgICAgICAgemxpYi0+ei5uZXh0X291dCA9ICZiT3V0LAorICAgICAgICAgemxpYi0+ei5hdmFpbF9vdXQgPSAxLAorICAgICAgICAgKytvdXRfYnl0ZXMpCisgICAgICB7CisgICAgICAgICB6bGliLT5yYyA9IGluZmxhdGUoJnpsaWItPnosIGZsdXNoKTsKKyAgICAgICAgIG91dF9ieXRlcyAtPSB6bGliLT56LmF2YWlsX291dDsKKworICAgICAgICAgc3dpdGNoICh6bGliLT5yYykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgWl9CVUZfRVJST1I6CisgICAgICAgICAgICAgICBpZiAoemxpYi0+ei5hdmFpbF9vdXQgPT0gMCkKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvKiBUcnkgYW5vdGhlciBvdXRwdXQgYnl0ZS4gKi8KKworICAgICAgICAgICAgICAgaWYgKHpsaWItPnouYXZhaWxfaW4gPT0gMCkKKyAgICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBUcnkgYW5vdGhlciBpbnB1dCBieXRlICovCisKKyAgICAgICAgICAgICAgIC8qIEJvdGggYXZhaWxfb3V0IGFuZCBhdmFpbF9pbiBhcmUgMSB5ZXQgemxpYiByZXR1cm5lZCBhIGNvZGUKKyAgICAgICAgICAgICAgICAqIGluZGljYXRpbmcgbm8gcHJvZ3Jlc3Mgd2FzIHBvc3NpYmxlLiAgVGhpcyBpcyB1bmV4cGVjdGVkLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICB6bGliX21lc3NhZ2UoemxpYiwgMS8qdW5leHBlY3RlZCovKTsKKyAgICAgICAgICAgICAgIGVuZHJjID0gWkxJQl9GQVRBTDsgLyogc3RvcCBwcm9jZXNzaW5nICovCisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBaX09LOgorICAgICAgICAgICAgICAgLyogWmxpYiBpcyBzdXBwb3NlZCB0byBoYXZlIG1hZGUgcHJvZ3Jlc3M6ICovCisgICAgICAgICAgICAgICBhc3NlcnQoemxpYi0+ei5hdmFpbF9vdXQgPT0gMCB8fCB6bGliLT56LmF2YWlsX2luID09IDApOworICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGNhc2UgWl9TVFJFQU1fRU5EOgorICAgICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgc3VjY2Vzc2Z1bCBlbmQuICovCisgICAgICAgICAgICAgICB6bGliLT5zdGF0ZSA9IDM7IC8qIGVuZCBvZiBzdHJlYW0gKi8KKyAgICAgICAgICAgICAgIGVuZHJjID0gWkxJQl9TVFJFQU1fRU5EOworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgWl9ORUVEX0RJQ1Q6CisgICAgICAgICAgICAgICB6bGliX21lc3NhZ2UoemxpYiwgMC8qc3RyZWFtIGVycm9yKi8pOworICAgICAgICAgICAgICAgZW5kcmMgPSBaTElCX0ZBVEFMOworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgWl9EQVRBX0VSUk9SOgorICAgICAgICAgICAgICAgLyogVGhlIHRvbyBmYXIgYmFjayBlcnJvciBjYW4gYmUgY29ycmVjdGVkLCBvdGhlcnMgY2Fubm90OiAqLworICAgICAgICAgICAgICAgaWYgKHpsaWItPnoubXNnICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgIHN0cmNtcCh6bGliLT56Lm1zZywgImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIikgPT0gMCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGVuZHJjID0gWkxJQl9UT09fRkFSX0JBQ0s7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgemxpYl9tZXNzYWdlKHpsaWIsIDAvKnN0cmVhbSBlcnJvciovKTsKKyAgICAgICAgICAgICAgIGVuZHJjID0gWkxJQl9GQVRBTDsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfSAvKiBzd2l0Y2ggKGluZmxhdGUgcmMpICovCisKKyAgICAgICAgIC8qIENvbnRyb2wgZ2V0cyBoZXJlIHdoZW4gZnVydGhlciBvdXRwdXQgaXMgbm90IHBvc3NpYmxlOyBlbmRyYyBtYXkKKyAgICAgICAgICAqIHN0aWxsIGJlIFpMSUJfT0sgaWYgbW9yZSBpbnB1dCBpcyByZXF1aXJlZC4KKyAgICAgICAgICAqLworICAgICAgICAgYnJlYWs7CisgICAgICB9IC8qIGZvciAob3V0cHV0IGJ5dGVzKSAqLworCisgICAgICAvKiBLZWVwIGEgcnVubmluZyBjb3VudCBvZiBvdXRwdXQgYnl0ZSBwcm9kdWNlZDogKi8KKyAgICAgIHpsaWItPnVuY29tcHJlc3NlZF9kaWdpdHMgPSB1YXJiX2FkZDMyKHpsaWItPnVuY29tcHJlc3NlZF9ieXRlcywKKyAgICAgICAgIHpsaWItPnVuY29tcHJlc3NlZF9kaWdpdHMsIG91dF9ieXRlcyk7CisKKyAgICAgIC8qIEtlZXAgZ29pbmcsIHRoZSBsb29wIHdpbGwgdGVybWluYXRlIHdoZW4gZW5kcmMgaXMgbm8gbG9uZ2VyIHNldCB0bworICAgICAgICogWkxJQl9PSyBvciBhbGwgdGhlIGlucHV0IGJ5dGVzIGhhdmUgYmVlbiBjb25zdW1lZDsgbWVhbndoaWxlIGtlZXAKKyAgICAgICAqIGFkZGluZyBpbnB1dCBieXRlcy4KKyAgICAgICAqLworICAgICAgYXNzZXJ0KHpsaWItPnouYXZhaWxfaW4gPT0gMCB8fCBlbmRyYyAhPSBaTElCX09LKTsKKworICAgICAgaW5fYnl0ZXMgKz0gMSAtIHpsaWItPnouYXZhaWxfaW47CisgICB9IC8qIHdoaWxlIChpbnB1dCBieXRlcykgKi8KKworICAgYXNzZXJ0KGluX2J5dGVzID09IG5ieXRlcyB8fCBlbmRyYyAhPSBaTElCX09LKTsKKworICAgLyogVXBkYXRlIHRoZSBydW5uaW5nIHRvdGFsIG9mIGlucHV0IGJ5dGVzIGNvbnN1bWVkICovCisgICB6bGliLT5jb21wcmVzc2VkX2RpZ2l0cyA9IHVhcmJfYWRkMzIoemxpYi0+Y29tcHJlc3NlZF9ieXRlcywKKyAgICAgIHpsaWItPmNvbXByZXNzZWRfZGlnaXRzLCBpbl9ieXRlcyAtIHpsaWItPnouYXZhaWxfaW4pOworCisgICAvKiBBdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gdXBkYXRlIHRoZSBjaHVuayB3aXRoIHRoZSBhY2N1bXVsYXRlZAorICAgICogaW5mb3JtYXRpb24gaWYgaXQgaXMgYW4gaW1wcm92ZW1lbnQ6CisgICAgKi8KKyAgIGlmIChlbmRyYyA9PSBaTElCX1NUUkVBTV9FTkQgJiYgemxpYi0+d2luZG93X2JpdHMgPCB6bGliLT5va19iaXRzKQorICAgeworICAgICAgc3RydWN0IGNodW5rICpjaHVuayA9IHpsaWItPmNodW5rOworCisgICAgICBjaHVuay0+dW5jb21wcmVzc2VkX2RpZ2l0cyA9IHVhcmJfY29weShjaHVuay0+dW5jb21wcmVzc2VkX2J5dGVzLAorICAgICAgICAgemxpYi0+dW5jb21wcmVzc2VkX2J5dGVzLCB6bGliLT51bmNvbXByZXNzZWRfZGlnaXRzKTsKKyAgICAgIGNodW5rLT5jb21wcmVzc2VkX2RpZ2l0cyA9IHVhcmJfY29weShjaHVuay0+Y29tcHJlc3NlZF9ieXRlcywKKyAgICAgICAgIHpsaWItPmNvbXByZXNzZWRfYnl0ZXMsIHpsaWItPmNvbXByZXNzZWRfZGlnaXRzKTsKKyAgICAgIGNodW5rLT5yZXdyaXRlX2J1ZmZlclswXSA9IHpsaWItPmhlYWRlclswXTsKKyAgICAgIGNodW5rLT5yZXdyaXRlX2J1ZmZlclsxXSA9IHpsaWItPmhlYWRlclsxXTsKKworICAgICAgaWYgKHpsaWItPndpbmRvd19iaXRzICE9IHpsaWItPmZpbGVfYml0cyB8fCB6bGliLT5ja3N1bSkKKyAgICAgIHsKKyAgICAgICAgIC8qIEEgcmV3cml0ZSBpcyByZXF1aXJlZCAqLworICAgICAgICAgY2h1bmstPnJld3JpdGVfb2Zmc2V0ID0gemxpYi0+cmV3cml0ZV9vZmZzZXQ7CisgICAgICAgICBjaHVuay0+cmV3cml0ZV9sZW5ndGggPSAyOworICAgICAgfQorCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBjaHVuay0+cmV3cml0ZV9vZmZzZXQgPSAwOworICAgICAgICAgY2h1bmstPnJld3JpdGVfbGVuZ3RoID0gMDsKKyAgICAgIH0KKworICAgICAgaWYgKGluX2J5dGVzIDwgbmJ5dGVzKQorICAgICAgICAgY2h1bmtfbWVzc2FnZShjaHVuaywgImV4dHJhIGNvbXByZXNzZWQgZGF0YSIpOworCisgICAgICB6bGliLT5leHRyYV9ieXRlcyA9IG5ieXRlcyAtIGluX2J5dGVzOworICAgICAgemxpYi0+b2tfYml0cyA9IHpsaWItPndpbmRvd19iaXRzOworICAgfQorCisgICByZXR1cm4gZW5kcmM7Cit9CisKK3N0YXRpYyBpbnQKK3psaWJfcnVuKHN0cnVjdCB6bGliICp6bGliKQorICAgLyogTGlrZSB6bGliX2FkdmFuY2UgYnV0IGFsc28gaGFuZGxlcyBhIHN0cmVhbSBvZiBJREFUIGNodW5rcy4gKi8KK3sKKyAgIC8qIFRoZSAnZXh0cmFfYnl0ZXMnIGZpZWxkIGlzIHNldCBieSB6bGliX2FkdmFuY2UgaWYgdGhlcmUgaXMgZXh0cmEKKyAgICAqIGNvbXByZXNzZWQgZGF0YSBpbiB0aGUgY2h1bmsgaXQgaGFuZGxlcyAoaWYgaXQgc2VlcyBaX1NUUkVBTV9FTkQgYmVmb3JlCisgICAgKiBhbGwgdGhlIGlucHV0IGRhdGEgaGFzIGJlZW4gdXNlZC4pICBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIHZhbHVlIHRvIHVwZGF0ZQorICAgICogdGhlIGNvcnJlY3QgY2h1bmsgbGVuZ3RoLCBzbyB0aGUgcHJvYmxlbSBzaG91bGQgb25seSBldmVyIGJlIGRldGVjdGVkIG9uY2UKKyAgICAqIGZvciBlYWNoIGNodW5rLiAgemxpYl9hZHZhbmNlIG91dHB1dHMgdGhlIGVycm9yIG1lc3NhZ2UsIHRob3VnaCBzZWUgdGhlCisgICAgKiBJREFUIHNwZWNpZmljIGNoZWNrIGJlbG93LgorICAgICovCisgICB6bGliLT5leHRyYV9ieXRlcyA9IDA7CisKKyAgIGlmICh6bGliLT5pZGF0ICE9IE5VTEwpCisgICB7CisgICAgICBzdHJ1Y3QgSURBVF9saXN0ICpsaXN0ID0gemxpYi0+aWRhdC0+aWRhdF9saXN0X2hlYWQ7CisgICAgICBzdHJ1Y3QgSURBVF9saXN0ICpsYXN0ID0gemxpYi0+aWRhdC0+aWRhdF9saXN0X3RhaWw7CisgICAgICBpbnQgICAgICAgIHNraXAgPSAwOworCisgICAgICAvKiAncmV3cml0ZV9vZmZzZXQnIGlzIHRoZSBvZmZzZXQgb2YgdGhlIExaIGRhdGEgd2l0aGluIHRoZSBjaHVuaywgZm9yCisgICAgICAgKiBJREFUIGl0IHNob3VsZCBiZSAwOgorICAgICAgICovCisgICAgICBhc3NlcnQoemxpYi0+cmV3cml0ZV9vZmZzZXQgPT0gMCk7CisKKyAgICAgIC8qIFByb2Nlc3MgZWFjaCBJREFUX2xpc3QgaW4gdHVybjsgdGhlIGNhbGxlciBoYXMgbGVmdCB0aGUgc3RyZWFtCisgICAgICAgKiBwb3NpdGlvbmVkIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlyc3QgSURBVCBjaHVuayBkYXRhLgorICAgICAgICovCisgICAgICBmb3IgKDs7KQorICAgICAgeworICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGNvdW50ID0gbGlzdC0+Y291bnQ7CisgICAgICAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgICAgICAgZm9yIChpID0gMDsgaTxjb3VudDsgKytpKQorICAgICAgICAgeworICAgICAgICAgICAgaW50IHJjOworCisgICAgICAgICAgICBpZiAoc2tpcCA+IDApIC8qIFNraXAgQ1JDIGFuZCBuZXh0IElEQVQgaGVhZGVyICovCisgICAgICAgICAgICAgICBza2lwXzEyKHpsaWItPmZpbGUpOworCisgICAgICAgICAgICBza2lwID0gMTI7IC8qIGZvciB0aGUgbmV4dCB0aW1lICovCisKKyAgICAgICAgICAgIHJjID0gemxpYl9hZHZhbmNlKHpsaWIsIGxpc3QtPmxlbmd0aHNbaV0pOworCisgICAgICAgICAgICBzd2l0Y2ggKHJjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgY2FzZSBaTElCX09LOiAvKiBrZWVwIGdvaW5nICovCisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgY2FzZSBaTElCX1NUUkVBTV9FTkQ6IC8qIHN0b3AgKi8KKyAgICAgICAgICAgICAgICAgIC8qIFRoZXJlIG1heSBiZSBleHRyYSBjaHVua3M7IGlmIHRoZXJlIGFyZSBhbmQgb25lIG9mIHRoZW0gaXMKKyAgICAgICAgICAgICAgICAgICAqIG5vdCB6ZXJvIGxlbmd0aCBvdXRwdXQgdGhlICdleHRyYSBkYXRhJyBtZXNzYWdlLiAgT25seSBkbworICAgICAgICAgICAgICAgICAgICogdGhpcyBjaGVjayBpZiBlcnJvcnMgYXJlIGJlaW5nIG91dHB1dC4KKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgaWYgKHpsaWItPmdsb2JhbC0+ZXJyb3JzICYmIHpsaWItPmV4dHJhX2J5dGVzID09IDApCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgSURBVF9saXN0ICpjaGVjayA9IGxpc3Q7CisgICAgICAgICAgICAgICAgICAgICBpbnQgaiA9IGkrMSwgamNvdW50ID0gY291bnQ7CisKKyAgICAgICAgICAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgajxqY291bnQ7ICsraikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVjay0+bGVuZ3Roc1tqXSA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua19tZXNzYWdlKHpsaWItPmNodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4dHJhIGNvbXByZXNzZWQgZGF0YSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmRfY2hlY2s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVjayA9PSBsYXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrID0gY2hlY2stPm5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBqY291bnQgPSBjaGVjay0+Y291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgZW5kX2NoZWNrOgorICAgICAgICAgICAgICAgICAgLyogVGVybWluYXRlIHRoZSBsaXN0IGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLCByZWR1Y2luZyB0aGUKKyAgICAgICAgICAgICAgICAgICAqIGxlbmd0aCBvZiB0aGUgbGFzdCBJREFUIHRvbyBpZiByZXF1aXJlZC4KKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgbGlzdC0+bGVuZ3Roc1tpXSAtPSB6bGliLT5leHRyYV9ieXRlczsKKyAgICAgICAgICAgICAgICAgIGxpc3QtPmNvdW50ID0gaSsxOworICAgICAgICAgICAgICAgICAgemxpYi0+aWRhdC0+aWRhdF9saXN0X3RhaWwgPSBsaXN0OworICAgICAgICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIC8qIEF0IHRoZSBlbmQgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBhbmQgWl9TVFJFQU1fRU5EIHdhcyBub3Qgc2Vlbi4gKi8KKyAgICAgICAgIGlmIChsaXN0ID09IGxhc3QpCisgICAgICAgICAgICByZXR1cm4gWkxJQl9PSzsKKworICAgICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7CisgICAgICB9CisgICB9CisKKyAgIGVsc2UKKyAgIHsKKyAgICAgIHN0cnVjdCBjaHVuayAqY2h1bmsgPSB6bGliLT5jaHVuazsKKyAgICAgIGludCByYzsKKworICAgICAgYXNzZXJ0KHpsaWItPnJld3JpdGVfb2Zmc2V0IDwgY2h1bmstPmNodW5rX2xlbmd0aCk7CisKKyAgICAgIHJjID0gemxpYl9hZHZhbmNlKHpsaWIsIGNodW5rLT5jaHVua19sZW5ndGggLSB6bGliLT5yZXdyaXRlX29mZnNldCk7CisKKyAgICAgIC8qIFRoZSBleHRyYSBieXRlcyBpbiB0aGUgY2h1bmsgYXJlIGhhbmRsZWQgbm93IGJ5IGFkanVzdGluZyB0aGUgY2h1bmsKKyAgICAgICAqIGxlbmd0aCB0byBleGNsdWRlIHRoZW07IHRoZSB6bGliIGRhdGEgaXMgYWx3YXlzIHN0b3JlZCBhdCB0aGUgZW5kIG9mCisgICAgICAgKiB0aGUgUE5HIGNodW5rIChhbHRob3VnaCBjbGVhcmx5IHRoaXMgaXMgbm90IG5lY2Vzc2FyeS4pICB6bGliX2FkdmFuY2UKKyAgICAgICAqIGhhcyBhbHJlYWR5IG91dHB1dCBhIHdhcm5pbmcgbWVzc2FnZS4KKyAgICAgICAqLworICAgICAgY2h1bmstPmNodW5rX2xlbmd0aCAtPSB6bGliLT5leHRyYV9ieXRlczsKKyAgICAgIHJldHVybiByYzsKKyAgIH0KK30KKworc3RhdGljIGludCAvKiBnbG9iYWwgZnVuY3Rpb247IG5vdCBhIG1lbWJlciBmdW5jdGlvbiAqLworemxpYl9jaGVjayhzdHJ1Y3QgZmlsZSAqZmlsZSwgcG5nX3VpbnRfMzIgb2Zmc2V0KQorICAgLyogQ2hlY2sgdGhlIHN0cmVhbSBvZiB6bGliIGNvbXByZXNzZWQgZGF0YSBpbiBlaXRoZXIgaWRhdCAoaWYgZ2l2ZW4pIG9yIChpZgorICAgICogbm90KSBjaHVuay4gIEluIGZhY3QgaXQgaXMgemxpYl9ydW4gdGhhdCBoYW5kbGVzIHRoZSBkaWZmZXJlbmNlIGluIHJlYWRpbmcKKyAgICAqIGEgc2luZ2xlIGNodW5rIGFuZCBhIGxpc3Qgb2YgSURBVCBjaHVua3MuCisgICAgKgorICAgICogSW4gZWl0aGVyIGNhc2UgdGhlIGlucHV0IGZpbGUgbXVzdCBiZSBwb3NpdGlvbmVkIGF0IHRoZSBmaXJzdCBieXRlIG9mIHpsaWIKKyAgICAqIGNvbXByZXNzZWQgZGF0YSAodGhlIGZpcnN0IGhlYWRlciBieXRlKS4KKyAgICAqCisgICAgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRydWUgb24gc3VjY2VzcywgaW5jbHVkaW5nIHRoZSBjYXNlIHdoZXJlIHRoZSB6bGliCisgICAgKiBoZWFkZXIgbWF5IG5lZWQgdG8gYmUgcmV3cml0dGVuLCBhbmQgZmFsc2Ugb24gYW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KKyAgICAqCisgICAgKiBJbiB0aGUgY2FzZSBvZiBJREFUIGNodW5rcyAnb2Zmc2V0JyBzaG91bGQgYmUgMC4KKyAgICAqLworeworICAgZnBvc190IHN0YXJ0X3BvczsKKyAgIHN0cnVjdCB6bGliIHpsaWI7CisKKyAgIC8qIFJlY29yZCB0aGUgc3RhcnQgb2YgdGhlIExaIGRhdGEgdG8gYWxsb3cgYSByZS1yZWFkLiAqLworICAgZmlsZV9nZXRwb3MoZmlsZSwgJnN0YXJ0X3Bvcyk7CisKKyAgIC8qIEZpcnN0IHRlc3QgdGhlIGV4aXN0aW5nIChmaWxlKSB3aW5kb3cgYml0czogKi8KKyAgIGlmICh6bGliX2luaXQoJnpsaWIsIGZpbGUtPmlkYXQsIGZpbGUtPmNodW5rLCAwLyp3aW5kb3cgYml0cyovLCBvZmZzZXQpKQorICAgeworICAgICAgaW50IG1pbl9iaXRzLCBtYXhfYml0cywgcmM7CisKKyAgICAgIC8qIFRoZSBmaXJzdCBydW4gdXNpbmcgdGhlIGV4aXN0aW5nIHdpbmRvdyBiaXRzLiAqLworICAgICAgcmMgPSB6bGliX3J1bigmemxpYik7CisKKyAgICAgIHN3aXRjaCAocmMpCisgICAgICB7CisgICAgICAgICBjYXNlIFpMSUJfVE9PX0ZBUl9CQUNLOgorICAgICAgICAgICAgLyogdG9vIGZhciBiYWNrIGVycm9yICovCisgICAgICAgICAgICBmaWxlLT5zdGF0dXNfY29kZSB8PSBUT09fRkFSX0JBQ0s7CisgICAgICAgICAgICBtaW5fYml0cyA9IHpsaWIud2luZG93X2JpdHMgKyAxOworICAgICAgICAgICAgbWF4X2JpdHMgPSAxNTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIFpMSUJfU1RSRUFNX0VORDoKKyAgICAgICAgICAgIGlmICghemxpYi5nbG9iYWwtPm9wdGltaXplX3psaWIgJiYKKyAgICAgICAgICAgICAgIHpsaWIud2luZG93X2JpdHMgPT0gemxpYi5maWxlX2JpdHMgJiYgIXpsaWIuY2tzdW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvKiBUaGUgdHJpdmlhbCBjYXNlIHdoZXJlIHRoZSBzdHJlYW0gaXMgb2sgYW5kIG9wdGltaXphdGlvbiB3YXMKKyAgICAgICAgICAgICAgICAqIG5vdCByZXF1ZXN0ZWQuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIHpsaWJfZW5kKCZ6bGliKTsKKyAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtYXhfYml0cyA9IG1heF93aW5kb3dfYml0cyh6bGliLnVuY29tcHJlc3NlZF9ieXRlcywKKyAgICAgICAgICAgICAgIHpsaWIudW5jb21wcmVzc2VkX2RpZ2l0cyk7CisgICAgICAgICAgICBpZiAoemxpYi5va19iaXRzIDwgbWF4X2JpdHMpCisgICAgICAgICAgICAgICBtYXhfYml0cyA9IHpsaWIub2tfYml0czsKKyAgICAgICAgICAgIG1pbl9iaXRzID0gODsKKworICAgICAgICAgICAgLyogY2tzdW0gaXMgc2V0IGlmIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSB6bGliIGhlYWRlciBjaGVja3N1bQorICAgICAgICAgICAgICogY2FsY3VsYXRpb24gaW4gdGhlIG9yaWdpbmFsIGZpbGUgKGFuZCB0aGlzIG1heSBiZSB0aGUgb25seSByZWFzb24KKyAgICAgICAgICAgICAqIGEgcmV3cml0ZSBpcyByZXF1aXJlZCkuICBXZSBjYW4ndCByZWx5IG9uIHRoZSBmaWxlIHdpbmRvdyBiaXRzIGluCisgICAgICAgICAgICAgKiB0aGlzIGNhc2UsIHNvIGRvIHRoZSBvcHRpbWl6YXRpb24gYW55d2F5LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoemxpYi5ja3N1bSkKKyAgICAgICAgICAgICAgIGNodW5rX21lc3NhZ2UoemxpYi5jaHVuaywgInpsaWIgY2hlY2t1bSIpOworICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICAgY2FzZSBaTElCX09LOgorICAgICAgICAgICAgLyogVHJ1bmNhdGVkIHN0cmVhbTsgdW5yZWNvdmVyYWJsZSwgZ2V0cyBjb252ZXJ0ZWQgdG8gWkxJQl9GQVRBTCAqLworICAgICAgICAgICAgemxpYi56Lm1zZyA9IFBOR1pfTVNHX0NBU1QoIlt0cnVuY2F0ZWRdIik7CisgICAgICAgICAgICB6bGliX21lc3NhZ2UoJnpsaWIsIDAvKmV4cGVjdGVkKi8pOworICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKiBVbnJlY292ZXJhYmxlIGVycm9yOyBza2lwIHRoZSBjaHVuazsgYSB6bGliX21lc3NhZ2UgaGFzIGFscmVhZHkKKyAgICAgICAgICAgICAqIGJlZW4gb3V0cHV0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICB6bGliX2VuZCgmemxpYik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgLyogT3B0aW1pemUgd2luZG93IGJpdHMgb3IgZml4IGEgdG9vLWZhci1iYWNrIGVycm9yLiAgbWluX2JpdHMgYW5kCisgICAgICAgKiBtYXhfYml0cyBoYXZlIGJlZW4gc2V0IGFwcHJvcHJpYXRlbHksIG9rX2JpdHMgcmVjb3JkcyB0aGUgYml0IHZhbHVlCisgICAgICAgKiBrbm93biB0byB3b3JrLgorICAgICAgICovCisgICAgICB3aGlsZSAobWluX2JpdHMgPCBtYXhfYml0cyB8fCBtYXhfYml0cyA8IHpsaWIub2tfYml0cy8qaWYgMTYqLykKKyAgICAgIHsKKyAgICAgICAgIGludCB0ZXN0X2JpdHMgPSAobWluX2JpdHMgKyBtYXhfYml0cykgPj4gMTsKKworICAgICAgICAgaWYgKHpsaWJfcmVzZXQoJnpsaWIsIHRlc3RfYml0cykpCisgICAgICAgICB7CisgICAgICAgICAgICBmaWxlX3NldHBvcyhmaWxlLCAmc3RhcnRfcG9zKTsKKyAgICAgICAgICAgIHJjID0gemxpYl9ydW4oJnpsaWIpOworCisgICAgICAgICAgICBzd2l0Y2ggKHJjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgY2FzZSBaTElCX1RPT19GQVJfQkFDSzoKKyAgICAgICAgICAgICAgICAgIG1pbl9iaXRzID0gdGVzdF9iaXRzKzE7CisgICAgICAgICAgICAgICAgICBpZiAobWluX2JpdHMgPiBtYXhfYml0cykKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBzdHJlYW0gcmVhbGx5IGlzIGRhbWFnZWQgYW5kIGl0CisgICAgICAgICAgICAgICAgICAgICAgKiBjb250YWlucyBhIGRpc3RhbmNlIGNvZGUgdGhhdCBhZGRyZXNzZXMgYnl0ZXMgYmVmb3JlCisgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgc3RhcnQgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhLgorICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICBhc3NlcnQodGVzdF9iaXRzID09IDE1KTsKKworICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IHRoZSBlcnJvciB0aGF0IHdhc24ndCBvdXRwdXQgYmVmb3JlOiAqLworICAgICAgICAgICAgICAgICAgICAgaWYgKHpsaWIuei5tc2cgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHpsaWIuei5tc2cgPSBQTkdaX01TR19DQVNUKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIik7CisgICAgICAgICAgICAgICAgICAgICB6bGliX21lc3NhZ2UoJnpsaWIsIDAvKnN0cmVhbSBlcnJvciovKTsKKyAgICAgICAgICAgICAgICAgICAgIHpsaWJfZW5kKCZ6bGliKTsKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgIGNhc2UgWkxJQl9TVFJFQU1fRU5EOiAvKiBzdWNjZXNzICovCisgICAgICAgICAgICAgICAgICBtYXhfYml0cyA9IHRlc3RfYml0czsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgLyogQSBmYXRhbCBlcnJvcjsgdGhpcyBoYXBwZW5zIGlmIGEgdG9vLWZhci1iYWNrIGVycm9yIHdhcworICAgICAgICAgICAgICAgICAgICogaGlkaW5nIGEgbW9yZSBzZXJpb3VzIGVycm9yLCB6bGliX2FkdmFuY2UgaGFzIGFscmVhZHkKKyAgICAgICAgICAgICAgICAgICAqIG91dHB1dCBhIHpsaWJfbWVzc2FnZS4KKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgemxpYl9lbmQoJnpsaWIpOworICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UgLyogaW5mbGF0ZVJlc2V0MiBmYWlsZWQgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIHpsaWJfZW5kKCZ6bGliKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBUaGUgbG9vcCBndWFyYW50ZWVzIHRoaXMgKi8KKyAgICAgIGFzc2VydCh6bGliLm9rX2JpdHMgPT0gbWF4X2JpdHMpOworICAgICAgemxpYl9lbmQoJnpsaWIpOworICAgICAgcmV0dXJuIDE7CisgICB9CisKKyAgIGVsc2UgLyogemxpYiBpbml0aWFsaXphdGlvbiBmYWlsZWQgLSBza2lwIHRoZSBjaHVuayAqLworICAgeworICAgICAgemxpYl9lbmQoJnpsaWIpOworICAgICAgcmV0dXJuIDA7CisgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBMSUJQTkcgQ0FMTEJBQ0tTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUaGUgc3RyYXRlZ3kgaGVyZSBpcyB0byBydW4gYSByZWd1bGFyIGxpYnBuZyBQTkcgZmlsZSByZWFkIGJ1dCBleGFtaW5lIHRoZQorICogaW5wdXQgZGF0YSAoZnJvbSB0aGUgZmlsZSkgYmVmb3JlIHBhc3NpbmcgaXQgdG8gbGlicG5nIHNvIGFzIHRvIGJlIGF3YXJlIG9mCisgKiB0aGUgc3RhdGUgd2UgZXhwZWN0IGxpYnBuZyB0byBiZSBpbi4gIFdhcm5pbmcgYW5kIGVycm9yIGNhbGxiYWNrcyBhcmUgYWxzbworICogaW50ZXJjZXB0ZWQgc28gdGhhdCB0aGV5IGNhbiBiZSBxdWlldGVkIGFuZCBpbnRlcnByZXRlZC4gIEludGVycHJldGF0aW9uCisgKiBkZXBlbmRzIG9uIGEgc29tZXdoYXQgcmlza3kgc3RyaW5nIG1hdGNoIGZvciBrbm93biBlcnJvciBtZXNzYWdlczsgbGV0IHVzCisgKiBob3BlIHRoYXQgdGhpcyBjYW4gYmUgZml4ZWQgaW4gdGhlIG5leHQgdmVyc2lvbiBvZiBsaWJwbmcuCisgKgorICogVGhlIGNvbnRyb2wgc3RydWN0dXJlIGlzIHBvaW50ZWQgdG8gYnkgdGhlIGxpYnBuZyBlcnJvciBwb2ludGVyLiAgSXQgY29udGFpbnMKKyAqIHRoYXQgc2V0IG9mIHN0cnVjdHVyZXMgd2hpY2ggbXVzdCBwZXJzaXN0IGFjcm9zcyBtdWx0aXBsZSByZWFkIGNhbGxiYWNrcywKKyAqIHdoaWNoIGlzIHByZXR0eSBtdWNoIGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSAnemxpYicgY29udHJvbCBzdHJ1Y3R1cmUuCisgKgorICogVGhlIGZpbGUgc3RydWN0dXJlIGlzIGluc3RhbnRpYXRlZCBpbiB0aGUgY2FsbGVyIG9mIHRoZSBwZXItZmlsZSByb3V0aW5lLCBidXQKKyAqIHRoZSBwZXItZmlsZSByb3V0aW5lIGNvbnRhaW5zIHRoZSBjaHVuayBhbmQgSURBVCBjb250cm9sIHN0cnVjdHVyZXMuCisgKi8KKy8qIFRoZSB0aHJlZSByb3V0aW5lcyByZWFkX2NodW5rLCBwcm9jZXNzX2NodW5rIGFuZCBzeW5jX3N0cmVhbSBjYW4gb25seSBiZQorICogY2FsbGVkIHZpYSBhIGNhbGwgdG8gcmVhZF9jaHVuayBhbmQgb25seSBleGl0IGF0IGEgcmV0dXJuIGZyb20gcHJvY2Vzc19jaHVuay4KKyAqIFRoZXNlIHJvdXRpbmVzIGNvdWxkIGhhdmUgYmVlbiB3cml0dGVuIGFzIG9uZSBjb25mdXNpbmcgbGFyZ2Ugcm91dGluZSwKKyAqIGluc3RlYWQgdGhpcyBjb2RlIHJlbGllcyBvbiB0aGUgY29tcGlsZXIgdG8gZG8gdGFpbCBjYWxsIGVsaW1pbmF0aW9uLiAgVGhlCisgKiBwb3NzaWJsZSBjYWxscyBhcmUgYXMgZm9sbG93czoKKyAqCisgKiByZWFkX2NodW5rCisgKiAgICAtPiBzeW5jX3N0cmVhbQorICogICAgICAgLT4gcHJvY2Vzc19jaHVuaworICogICAgLT4gcHJvY2Vzc19jaHVuaworICogICAgICAgLT4gcmVhZF9jaHVuaworICogICAgICAgcmV0dXJucworICovCitzdGF0aWMgdm9pZCByZWFkX2NodW5rKHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyB2b2lkCitwcm9jZXNzX2NodW5rKHN0cnVjdCBmaWxlICpmaWxlLCBwbmdfdWludF8zMiBmaWxlX2NyYywgcG5nX3VpbnRfMzIgbmV4dF9sZW5ndGgsCisgICBwbmdfdWludF8zMiBuZXh0X3R5cGUpCisgICAvKiBDYWxsZWQgd2hlbiB0aGUgY2h1bmsgZGF0YSBoYXMgYmVlbiByZWFkLCBuZXh0X2xlbmd0aCBhbmQgbmV4dF90eXBlCisgICAgKiB3aWxsIGJlIHNldCBmb3IgdGhlIG5leHQgY2h1bmsgKG9yIDAgaWYgdGhpcyBpcyBJRU5EKS4KKyAgICAqCisgICAgKiBXaGVuIHRoaXMgcm91dGluZSByZXR1cm5zLCBjaHVua19sZW5ndGggYW5kIGNodW5rX3R5cGUgd2lsbCBiZSBzZXQgZm9yIHRoZQorICAgICogbmV4dCBjaHVuayB0byB3cml0ZSBiZWNhdXNlIGlmIGEgY2h1bmsgaXMgc2tpcHBlZCB0aGlzIHJldHVybiBjYWxscyBiYWNrCisgICAgKiB0byByZWFkX2NodW5rLgorICAgICovCit7CisgICBjb25zdCBwbmdfdWludF8zMiB0eXBlID0gZmlsZS0+dHlwZTsKKworICAgaWYgKGZpbGUtPmdsb2JhbC0+dmVyYm9zZSA+IDEpCisgICB7CisgICAgICBmcHV0cygiICAiLCBzdGRlcnIpOworICAgICAgdHlwZV9uYW1lKGZpbGUtPnR5cGUsIHN0ZGVycik7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAlbHUgMHglLjh4IDB4JS44eFxuIiwgKHVuc2lnbmVkIGxvbmcpZmlsZS0+bGVuZ3RoLAorICAgICAgICAgZmlsZS0+Y3JjIF4gMHhmZmZmZmZmZiwgZmlsZV9jcmMpOworICAgfQorCisgICAvKiBUaGUgYmFzaWMgc3RydWN0dXJlIHNlZW1zIGNvcnJlY3QgYnV0IHRoZSBDUkMgbWF5IG5vdCBtYXRjaCwgaW4gdGhpcworICAgICogY2FzZSBhc3N1bWUgdGhhdCBpdCBpcyBzaW1wbHkgYSBiYWQgQ1JDLCBlaXRoZXIgd3JvbmdseSBjYWxjdWxhdGVkIG9yCisgICAgKiBiZWNhdXNlIG9mIGRhbWFnZWQgc3RyZWFtIGRhdGEuCisgICAgKi8KKyAgIGlmICgoZmlsZS0+Y3JjIF4gMHhmZmZmZmZmZikgIT0gZmlsZV9jcmMpCisgICB7CisgICAgICAvKiBUaGUgYmVoYXZpb3IgaXMgc2V0IGJ5IHRoZSAnc2tpcCcgc2V0dGluZzsgaWYgaXQgaXMgYW55dGhpbmcgb3RoZXIKKyAgICAgICAqIHRoYW4gU0tJUF9CQURfQ1JDIGlnbm9yZSB0aGUgYmFkIENSQyBhbmQgcmV0dXJuIHRoZSBjaHVuaywgd2l0aCBhCisgICAgICAgKiBjb3JyZWN0ZWQgQ1JDIGFuZCBwb3NzaWJseSBwcm9jZXNzZWQsIHRvIGxpYnBuZy4gIE90aGVyd2lzZSBza2lwIHRoZQorICAgICAgICogY2h1bmssIHdoaWNoIHdpbGwgcmVzdWx0IGluIGEgZmF0YWwgZXJyb3IgaWYgdGhlIGNodW5rIGlzIGNyaXRpY2FsLgorICAgICAgICovCisgICAgICBmaWxlLT5zdGF0dXNfY29kZSB8PSBDUkNfRVJST1I7CisKKyAgICAgIC8qIElnbm9yZSB0aGUgYmFkIENSQyAgKi8KKyAgICAgIGlmIChmaWxlLT5nbG9iYWwtPnNraXAgIT0gU0tJUF9CQURfQ1JDKQorICAgICAgICAgdHlwZV9tZXNzYWdlKGZpbGUsIHR5cGUsICJiYWQgQ1JDIik7CisKKyAgICAgIC8qIFRoaXMgd2lsbCBjYXVzZSBhbiBJRU5EIHdpdGggYSBiYWQgQ1JDIHRvIHN0b3AgKi8KKyAgICAgIGVsc2UgaWYgKENSSVRJQ0FMKHR5cGUpKQorICAgICAgICAgc3RvcChmaWxlLCBSRUFEX0VSUk9SX0NPREUsICJiYWQgQ1JDIGluIGNyaXRpY2FsIGNodW5rIik7CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHR5cGVfbWVzc2FnZShmaWxlLCB0eXBlLCAic2tpcHBlZDogYmFkIENSQyIpOworCisgICAgICAgICAvKiBOT1RFOiB0aGlzIGNhbm5vdCBiZSByZWFjaGVkIGZvciBJRU5EIGJlY2F1c2UgaXQgaXMgY3JpdGljYWwuICovCisgICAgICAgICBnb3RvIHNraXBfY2h1bms7CisgICAgICB9CisgICB9CisKKyAgIC8qIENoZWNrIGZvciBvdGhlciAnc2tpcCcgY2FzZXMgYW5kIGhhbmRsZSB0aGVzZTsgdGhlc2Ugb25seSBhcHBseSB0bworICAgICogYW5jaWxsYXJ5IGNodW5rcyAoYW5kIG5vdCB0Uk5TLCB3aGljaCBzaG91bGQgcHJvYmFibHkgaGF2ZSBiZWVuIGEgY3JpdGljYWwKKyAgICAqIGNodW5rLikKKyAgICAqLworICAgaWYgKHNraXBfY2h1bmtfdHlwZShmaWxlLT5nbG9iYWwsIHR5cGUpKQorICAgICAgZ290byBza2lwX2NodW5rOworCisgICAvKiBUaGUgY2h1bmsgbWF5IHN0aWxsIGJlIHNraXBwZWQgaWYgcHJvYmxlbXMgYXJlIGRldGVjdGVkIGluIHRoZSBMWiBkYXRhLAorICAgICogaG93ZXZlciB0aGUgTFogZGF0YSBjaGVjayByZXF1aXJlcyBhIGNodW5rLiAgSGFuZGxlIHRoaXMgYnkgaW5zdGFudGlhdGluZworICAgICogYSBjaHVuayB1bmxlc3MgYW4gSURBVCBpcyBhbHJlYWR5IGluc3RhbnRpYXRlZCAoSURBVCBjb250cm9sIHN0cnVjdHVyZXMKKyAgICAqIGluc3RhbnRpYXRlIHRoZWlyIG93biBjaHVuay4pCisgICAgKi8KKyAgIGlmICh0eXBlICE9IHBuZ19JREFUKQorICAgICAgZmlsZS0+YWxsb2MoZmlsZSwgMC8qY2h1bmsqLyk7CisKKyAgIGVsc2UgaWYgKGZpbGUtPmlkYXQgPT0gTlVMTCkKKyAgICAgIGZpbGUtPmFsbG9jKGZpbGUsIDEvKklEQVQqLyk7CisKKyAgIGVsc2UKKyAgIHsKKyAgICAgIC8qIFRoZSBjaHVuayBsZW5ndGggbXVzdCBiZSB1cGRhdGVkIGZvciBwcm9jZXNzX0lEQVQgKi8KKyAgICAgIGFzc2VydChmaWxlLT5jaHVuayAhPSBOVUxMKTsKKyAgICAgIGFzc2VydChmaWxlLT5jaHVuay0+Y2h1bmtfdHlwZSA9PSBwbmdfSURBVCk7CisgICAgICBmaWxlLT5jaHVuay0+Y2h1bmtfbGVuZ3RoID0gZmlsZS0+bGVuZ3RoOworICAgfQorCisgICAvKiBSZWNvcmQgdGhlICduZXh0JyBpbmZvcm1hdGlvbiB0b28sIG5vdyB0aGF0IHRoZSBvcmlnaW5hbCB2YWx1ZXMgZm9yCisgICAgKiB0aGlzIGNodW5rIGhhdmUgYmVlbiBjb3BpZWQuICBOb3RpY2UgdGhhdCB0aGUgSURBVCBjaHVua3Mgb25seSBtYWtlIGEKKyAgICAqIGNvcHkgb2YgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjaHVuaywgdGhpcyBpcyBmaW5lIC0gcHJvY2Vzc19JREFUIGRvZXMKKyAgICAqIG5vdCBuZWVkIHRoZSBwb3NpdGlvbiBvZiB0aGlzIGNodW5rLgorICAgICovCisgICBmaWxlLT5sZW5ndGggPSBuZXh0X2xlbmd0aDsKKyAgIGZpbGUtPnR5cGUgPSBuZXh0X3R5cGU7CisgICBnZXRwb3MoZmlsZSk7CisKKyAgIC8qIERvIHBlci10eXBlIHByb2Nlc3NpbmcsIG5vdGUgdGhhdCBpZiB0aGlzIGNvZGUgZG9lcyBub3QgcmV0dXJuIGZyb20gdGhlCisgICAgKiBmdW5jdGlvbiB0aGUgY2h1bmsgd2lsbCBiZSBza2lwcGVkLiAgVGhlIHJld3JpdGUgaXMgY2FuY2VsbGVkIGhlcmUgc28gdGhhdAorICAgICogaXQgY2FuIGJlIHNldCBpbiB0aGUgcGVyLWNodW5rIHByb2Nlc3NpbmcuCisgICAgKi8KKyAgIGZpbGUtPmNodW5rLT5yZXdyaXRlX2xlbmd0aCA9IDA7CisgICBmaWxlLT5jaHVuay0+cmV3cml0ZV9vZmZzZXQgPSAwOworICAgc3dpdGNoICh0eXBlKQorICAgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHJldHVybjsKKworICAgICAgY2FzZSBwbmdfSUhEUjoKKyAgICAgICAgIC8qIFJlYWQgdGhpcyBub3cgYW5kIHVwZGF0ZSB0aGUgY29udHJvbCBzdHJ1Y3R1cmUgd2l0aCB0aGUgaW5mb3JtYXRpb24KKyAgICAgICAgICAqIGl0IGNvbnRhaW5zLiAgVGhlIGhlYWRlciBpcyB2YWxpZGF0ZWQgY29tcGxldGVseSB0byBlbnN1cmUgdGhpcyBpcyBhCisgICAgICAgICAgKiBQTkcuCisgICAgICAgICAgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBjaHVuayAqY2h1bmsgPSBmaWxlLT5jaHVuazsKKworICAgICAgICAgICAgaWYgKGNodW5rLT5jaHVua19sZW5ndGggIT0gMTMpCisgICAgICAgICAgICAgICBzdG9wX2ludmFsaWQoZmlsZSwgIklIRFIgbGVuZ3RoIik7CisKKyAgICAgICAgICAgIC8qIFJlYWQgYWxsIHRoZSBJSERSIGluZm9ybWF0aW9uIGFuZCB2YWxpZGF0ZSBpdC4gKi8KKyAgICAgICAgICAgIHNldHBvcyhjaHVuayk7CisgICAgICAgICAgICBmaWxlLT53aWR0aCA9IHJlcmVhZF80KGZpbGUpOworICAgICAgICAgICAgZmlsZS0+aGVpZ2h0ID0gcmVyZWFkXzQoZmlsZSk7CisgICAgICAgICAgICBmaWxlLT5iaXRfZGVwdGggPSByZXJlYWRfYnl0ZShmaWxlKTsKKyAgICAgICAgICAgIGZpbGUtPmNvbG9yX3R5cGUgPSByZXJlYWRfYnl0ZShmaWxlKTsKKyAgICAgICAgICAgIGZpbGUtPmNvbXByZXNzaW9uX21ldGhvZCA9IHJlcmVhZF9ieXRlKGZpbGUpOworICAgICAgICAgICAgZmlsZS0+ZmlsdGVyX21ldGhvZCA9IHJlcmVhZF9ieXRlKGZpbGUpOworICAgICAgICAgICAgZmlsZS0+aW50ZXJsYWNlX21ldGhvZCA9IHJlcmVhZF9ieXRlKGZpbGUpOworCisgICAgICAgICAgICAvKiBUaGlzIHZhbGlkYXRlcyBhbGwgdGhlIGZpZWxkcywgYW5kIGNhbGxzIHN0b3BfaW52YWxpZCBpZgorICAgICAgICAgICAgICogdGhlcmUgaXMgYSBwcm9ibGVtLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBjYWxjX2ltYWdlX3NpemUoZmlsZSk7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm47CisKKyAgICAgICAgIC8qIEFuY2lsbGFyeSBjaHVua3MgdGhhdCByZXF1aXJlIGZ1cnRoZXIgcHJvY2Vzc2luZzogKi8KKyAgICAgIGNhc2UgcG5nX3pUWHQ6IGNhc2UgcG5nX2lDQ1A6CisgICAgICAgICBpZiAocHJvY2Vzc196VFh0X2lDQ1AoZmlsZSkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICBjaHVua19lbmQoJmZpbGUtPmNodW5rKTsKKyAgICAgICAgIGZpbGVfc2V0cG9zKGZpbGUsICZmaWxlLT5kYXRhX3Bvcyk7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBwbmdfaVRYdDoKKyAgICAgICAgIGlmIChwcm9jZXNzX2lUWHQoZmlsZSkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICBjaHVua19lbmQoJmZpbGUtPmNodW5rKTsKKyAgICAgICAgIGZpbGVfc2V0cG9zKGZpbGUsICZmaWxlLT5kYXRhX3Bvcyk7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBwbmdfSURBVDoKKyAgICAgICAgIGlmIChwcm9jZXNzX0lEQVQoZmlsZSkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAvKiBGaXJzdCBwYXNzOiAqLworICAgICAgICAgYXNzZXJ0KG5leHRfdHlwZSA9PSBwbmdfSURBVCk7CisgICAgICAgICBicmVhazsKKyAgIH0KKworICAgLyogQ29udHJvbCByZWFjaGVzIHRoaXMgcG9pbnQgaWYgdGhlIGNodW5rIG11c3QgYmUgc2tpcHBlZC4gIEZvciBjaHVua3Mgb3RoZXIKKyAgICAqIHRoYW4gSURBVCB0aGlzIG1lYW5zIHRoYXQgdGhlIHpsaWIgY29tcHJlc3NlZCBkYXRhIGlzIGZhdGFsbHkgZGFtYW5nZWQgYW5kCisgICAgKiB0aGUgY2h1bmsgd2lsbCBub3QgYmUgcGFzc2VkIHRvIGxpYnBuZy4gIEZvciBJREFUIGl0IG1lYW5zIHRoYXQgdGhlIGVuZCBvZgorICAgICogdGhlIElEQVQgc3RyZWFtIGhhcyBub3QgeWV0IGJlZW4gcmVhY2hlZCBhbmQgd2UgbXVzdCBoYW5kbGUgdGhlIG5leHQKKyAgICAqIChJREFUKSBjaHVuay4gIElmIHRoZSBMWiBkYXRhIGluIGFuIElEQVQgc3RyZWFtIGNhbm5vdCBiZSByZWFkICdzdG9wJyBtdXN0CisgICAgKiBiZSB1c2VkIHRvIGhhbHQgcGFyc2luZyBvZiB0aGUgUE5HLgorICAgICovCisgICByZWFkX2NodW5rKGZpbGUpOworICAgcmV0dXJuOworCisgICAvKiBUaGlzIGlzIHRoZSBnZW5lcmljIGNvZGUgdG8gc2tpcCB0aGUgY3VycmVudCBjaHVuazsgc2ltcGx5IGp1bXAgdG8gdGhlCisgICAgKiBuZXh0IG9uZS4KKyAgICAqLworc2tpcF9jaHVuazoKKyAgIGZpbGUtPmxlbmd0aCA9IG5leHRfbGVuZ3RoOworICAgZmlsZS0+dHlwZSA9IG5leHRfdHlwZTsKKyAgIGdldHBvcyhmaWxlKTsKKyAgIHJlYWRfY2h1bmsoZmlsZSk7Cit9CisKK3N0YXRpYyBwbmdfdWludF8zMgorZ2V0MzIocG5nX2J5dGVwIGJ1ZmZlciwgaW50IG9mZnNldCkKKyAgIC8qIFJlYWQgYSAzMi1iaXQgdmFsdWUgZnJvbSBhbiA4LWJ5dGUgY2lyY3VsYXIgYnVmZmVyICh1c2VkIG9ubHkgYmVsb3cpLgorICAgICovCit7CisgICByZXR1cm4KKyAgICAgIChidWZmZXJbIG9mZnNldCAgICAmIDddIDw8IDI0KSArCisgICAgICAoYnVmZmVyWyhvZmZzZXQrMSkgJiA3XSA8PCAxNikgKworICAgICAgKGJ1ZmZlclsob2Zmc2V0KzIpICYgN10gPDwgIDgpICsKKyAgICAgIChidWZmZXJbKG9mZnNldCszKSAmIDddICAgICAgKTsKK30KKworc3RhdGljIHZvaWQKK3N5bmNfc3RyZWFtKHN0cnVjdCBmaWxlICpmaWxlKQorICAgLyogVGhlIHN0cmVhbSBzZWVtcyB0byBiZSBtZXNzZWQgdXAsIGF0dGVtcHQgdG8gcmVzeW5jIGZyb20gdGhlIGN1cnJlbnQgY2h1bmsKKyAgICAqIGhlYWRlci4gIEV4ZWN1dGVzIHN0b3Agb24gYSBmYXRhbCBlcnJvciwgb3RoZXJ3aXNlIGNhbGxzIHByb2Nlc3NfY2h1bmsuCisgICAgKi8KK3sKKyAgIHBuZ191aW50XzMyIGZpbGVfY3JjOworCisgICBmaWxlLT5zdGF0dXNfY29kZSB8PSBTVFJFQU1fRVJST1I7CisKKyAgIGlmIChmaWxlLT5nbG9iYWwtPnZlcmJvc2UpCisgICB7CisgICAgICBmcHV0cygiIFNZTkMgIiwgc3RkZXJyKTsKKyAgICAgIHR5cGVfbmFtZShmaWxlLT50eXBlLCBzdGRlcnIpOworICAgICAgcHV0YygnXG4nLCBzdGRlcnIpOworICAgfQorCisgICAvKiBSZXR1cm4gdG8gdGhlIHN0YXJ0IG9mIHRoZSBjaHVuayBkYXRhICovCisgICBmaWxlX3NldHBvcyhmaWxlLCAmZmlsZS0+ZGF0YV9wb3MpOworICAgZmlsZS0+cmVhZF9jb3VudCA9IDg7CisKKyAgIGlmIChyZWFkXzQoZmlsZSwgJmZpbGVfY3JjKSA9PSA0KSAvKiBlbHNlIGNvbXBsZXRlbHkgdHJ1bmNhdGVkICovCisgICB7CisgICAgICAvKiBJZ25vcmUgdGhlIHJlY29yZGVkIGNodW5rIGxlbmd0aCwgcHJvY2VlZCB0aHJvdWdoIHRoZSBkYXRhIGxvb2tpbmcgZm9yCisgICAgICAgKiBhIGxlYWRpbmcgc2VxdWVuY2Ugb2YgYnl0ZXMgdGhhdCBtYXRjaCB0aGUgQ1JDIGluIHRoZSBmb2xsb3dpbmcgZm91cgorICAgICAgICogYnl0ZXMuICBFYWNoIHRpbWUgYSBtYXRjaCBpcyBmb3VuZCBjaGVjayB0aGUgbmV4dCA4IGJ5dGVzIGZvciBhIHZhbGlkCisgICAgICAgKiBsZW5ndGgsIGNodW5rLXR5cGUgcGFpci4KKyAgICAgICAqLworICAgICAgcG5nX3VpbnRfMzIgbGVuZ3RoOworICAgICAgcG5nX3VpbnRfMzIgdHlwZSA9IGZpbGUtPnR5cGU7CisgICAgICBwbmdfdWludF8zMiBjcmMgPSBjcmNfaW5pdF80KHR5cGUpOworICAgICAgcG5nX2J5dGUgYnVmZmVyWzhdOworICAgICAgdW5zaWduZWQgaW50IG5yZWFkID0gMCwgbnVzZWQgPSAwOworCisgICAgICBmb3IgKGxlbmd0aD0wOyBsZW5ndGggPD0gMHg3ZmZmZmZmZjsgKytsZW5ndGgpCisgICAgICB7CisgICAgICAgICBpbnQgY2g7CisKKyAgICAgICAgIGlmICgoY3JjIF4gMHhmZmZmZmZmZikgPT0gZmlsZV9jcmMpCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBBIG1hdGNoIG9uIHRoZSBDUkM7IGZvciBJRU5EIHRoaXMgaXMgc3VmZmljaWVudCwgYnV0IGZvciBhbnl0aGluZworICAgICAgICAgICAgICogZWxzZSBleHBlY3QgYSBmb2xsb3dpbmcgY2h1bmsgaGVhZGVyLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAodHlwZSA9PSBwbmdfSUVORCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGZpbGUtPmxlbmd0aCA9IGxlbmd0aDsKKyAgICAgICAgICAgICAgIHByb2Nlc3NfY2h1bmsoZmlsZSwgZmlsZV9jcmMsIDAsIDApOworICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvKiBOZWVkIDggYnl0ZXMgKi8KKyAgICAgICAgICAgICAgIHdoaWxlIChucmVhZCA8IDgrbnVzZWQpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBjaCA9IHJlYWRfYnl0ZShmaWxlKTsKKyAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSBFT0YpCisgICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jYXRlZDsKKyAgICAgICAgICAgICAgICAgIGJ1ZmZlclsobnJlYWQrKykgJiA3XSA9IChwbmdfYnl0ZSljaDsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgLyogUHJldmVudCBvdmVyZmxvdyAqLworICAgICAgICAgICAgICAgbnJlYWQgLT0gbnVzZWQgJiB+NzsKKyAgICAgICAgICAgICAgIG51c2VkIC09IG51c2VkICYgfjc7IC8qIG9yLCBudXNlZCAmPSA3IDstKSAqLworCisgICAgICAgICAgICAgICAvKiBFeGFtaW5lIHRoZSA4IGJ5dGVzIGZvciBhIHZhbGlkIGNodW5rIGhlYWRlci4gKi8KKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBuZ191aW50XzMyIG5leHRfbGVuZ3RoID0gZ2V0MzIoYnVmZmVyLCBudXNlZCk7CisKKyAgICAgICAgICAgICAgICAgIGlmIChuZXh0X2xlbmd0aCA8IDB4N2ZmZmZmZmYpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8zMiBuZXh0X3R5cGUgPSBnZXQzMihidWZmZXIsIG51c2VkKzQpOworCisgICAgICAgICAgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZV92YWxpZChuZXh0X3R5cGUpKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS0+cmVhZF9jb3VudCAtPSA4OworICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc19jaHVuayhmaWxlLCBmaWxlX2NyYywgbmV4dF9sZW5ndGgsIG5leHRfdHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIC8qIE5vdCB2YWxpZCwga2VlcCBnb2luZy4gKi8KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICAgLyogVGhpcyBjYXRjaGVzIHVwIHdpdGggdGhlIGNpcmN1bGFyIGJ1ZmZlciB3aGljaCBnZXRzIGZpbGxlZCBhYm92ZQorICAgICAgICAgICogd2hpbGUgY2hlY2tpbmcgYSBjaHVuayBoZWFkZXIuICBUaGlzIGNvZGUgaXMgc2xpZ2h0bHkgdHJpY2t5IC0gaWYKKyAgICAgICAgICAqIHRoZSBjaHVua190eXBlIGlzIElFTkQgdGhlIGJ1ZmZlciB3aWxsIG5ldmVyIGJlIHVzZWQsIGlmIGl0IGlzIG5vdAorICAgICAgICAgICogdGhlIGNvZGUgd2lsbCBhbHdheXMgcmVhZCBhaGVhZCBleGFjdGx5IDggYnl0ZXMgYW5kIHBhc3MgdGhpcyBvbiB0bworICAgICAgICAgICogcHJvY2Vzc19jaHVuay4gIFNvIHRoZSBpbnZhcmlhbnQgdGhhdCBJRU5EIGxlYXZlcyB0aGUgZmlsZSBwb3NpdGlvbgorICAgICAgICAgICogYWZ0ZXIgdGhlIElFTkQgQ1JDIGFuZCBvdGhlciBjaHVuayBsZWF2ZSBpdCBhZnRlciB0aGUgKm5leHQqIGNodW5rCisgICAgICAgICAgKiBoZWFkZXIgaXMgbm90IGJyb2tlbi4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKG5yZWFkIDw9IG51c2VkKQorICAgICAgICAgeworICAgICAgICAgICAgY2ggPSByZWFkX2J5dGUoZmlsZSk7CisKKyAgICAgICAgICAgIGlmIChjaCA9PSBFT0YpCisgICAgICAgICAgICAgICBnb3RvIHRydW5jYXRlZDsKKyAgICAgICAgIH0KKworICAgICAgICAgZWxzZQorICAgICAgICAgICAgY2ggPSBidWZmZXJbKCsrbnVzZWQpICYgN107CisKKyAgICAgICAgIGNyYyA9IGNyY19vbmVfYnl0ZShjcmMsIGZpbGVfY3JjID4+IDI0KTsKKyAgICAgICAgIGZpbGVfY3JjID0gKGZpbGVfY3JjIDw8IDgpICsgY2g7CisgICAgICB9CisKKyAgICAgIC8qIENvbnRyb2wgZ2V0cyB0byBoZXJlIGlmIHdoZW4gMHg3ZmZmZmZmZiBieXRlcyAocGx1cyA4KSBoYXZlIGJlZW4gcmVhZCwKKyAgICAgICAqIG9rLCB0cmVhdCB0aGlzIGFzIGEgZGFtYWdlZCBzdHJlYW0gdG9vOgorICAgICAgICovCisgICB9CisKK3RydW5jYXRlZDoKKyAgIHN0b3AoZmlsZSwgUkVBRF9FUlJPUl9DT0RFLCAiZGFtYWdlZCBQTkcgc3RyZWFtIik7Cit9CisKK3N0YXRpYyB2b2lkCityZWFkX2NodW5rKHN0cnVjdCBmaWxlICpmaWxlKQorICAgLyogT24gZW50cnkgZmlsZTo6ZGF0YV9wb3MgbXVzdCBiZSBzZXQgdG8gdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBieXRlCisgICAgKiBvZiB0aGUgY2h1bmsgZGF0YSAqYW5kKiB0aGUgaW5wdXQgZmlsZSBtdXN0IGJlIGF0IHRoaXMgcG9zaXRpb24uICBUaGlzCisgICAgKiByb3V0aW5lICh2aWEgcHJvY2Vzc19jaHVuaykgaW5zdGFudGlhdGVzIGEgY2h1bmsgb3IgSURBVCBjb250cm9sIHN0cnVjdHVyZQorICAgICogYmFzZWQgb24gZmlsZTo6bGVuZ3RoIGFuZCBmaWxlOjp0eXBlIGFuZCBhbHNvIHJlc2V0cyB0aGVzZSBmaWVsZHMgYW5kCisgICAgKiBmaWxlOjpkYXRhX3BvcyBmb3IgdGhlIGNodW5rIGFmdGVyIHRoaXMgb25lLiAgRm9yIGFuIElEQVQgY2h1bmsgdGhlIHdob2xlCisgICAgKiBzdHJlYW0gb2YgSURBVHMgd2lsbCBiZSByZWFkLCB1bnRpbCBzb21ldGhpbmcgb3RoZXIgdGhhbiBhbiBJREFUIGlzCisgICAgKiBlbmNvdW50ZXJlZCwgYW5kIHRoZSBmaWxlIGZpZWxkcyB3aWxsIGJlIHNldCBmb3IgdGhlIGNodW5rIGFmdGVyIHRoZSBlbmQKKyAgICAqIG9mIHRoZSBzdHJlYW0gb2YgSURBVHMuCisgICAgKgorICAgICogRm9yIElFTkQgdGhlIGZpbGU6OnR5cGUgZmllbGQgd2lsbCBiZSBzZXQgdG8gMCwgYW5kIG5vdGhpbmcgYmV5b25kIHRoZSBlbmQKKyAgICAqIG9mIHRoZSBJRU5EIGNodW5rIHdpbGwgaGF2ZSBiZWVuIHJlYWQuCisgICAgKi8KK3sKKyAgIHBuZ191aW50XzMyIGxlbmd0aCA9IGZpbGUtPmxlbmd0aDsKKyAgIHBuZ191aW50XzMyIHR5cGUgPSBmaWxlLT50eXBlOworCisgICAvKiBBZnRlciBJRU5EIGZpbGU6OnR5cGUgaXMgc2V0IHRvIDAsIGlmIGxpYnBuZyBhdHRlbXB0cyB0byByZWFkCisgICAgKiBtb3JlIGRhdGEgYXQgdGhpcyBwb2ludCB0aGlzIGlzIGEgYnVnIGluIGxpYnBuZy4KKyAgICAqLworICAgaWYgKHR5cGUgPT0gMCkKKyAgICAgIHN0b3AoZmlsZSwgVU5FWFBFQ1RFRF9FUlJPUl9DT0RFLCAicmVhZCBiZXlvbmQgSUVORCIpOworCisgICBpZiAoZmlsZS0+Z2xvYmFsLT52ZXJib3NlID4gMikKKyAgIHsKKyAgICAgIGZwdXRzKCIgICAiLCBzdGRlcnIpOworICAgICAgdHlwZV9uYW1lKHR5cGUsIHN0ZGVycik7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAlbHVcbiIsICh1bnNpZ25lZCBsb25nKWxlbmd0aCk7CisgICB9CisKKyAgIC8qIFN0YXJ0IHRoZSByZWFkX2NyYyBjYWxjdWxhdGlvbiB3aXRoIHRoZSBjaHVuayB0eXBlLCB0aGVuIHJlYWQgdG8gdGhlIGVuZAorICAgICogb2YgdGhlIGNodW5rIGRhdGEgKHdpdGhvdXQgcHJvY2Vzc2luZyBpdCBpbiBhbnkgd2F5KSB0byBjaGVjayB0aGF0IGl0IGlzCisgICAgKiBhbGwgdGhlcmUgYW5kIGNhbGN1bGF0ZSB0aGUgQ1JDLgorICAgICovCisgICBmaWxlLT5jcmMgPSBjcmNfaW5pdF80KHR5cGUpOworICAgaWYgKGNyY19yZWFkX21hbnkoZmlsZSwgbGVuZ3RoKSkgLyogZWxzZSBpdCB3YXMgdHJ1bmNhdGVkICovCisgICB7CisgICAgICBwbmdfdWludF8zMiBmaWxlX2NyYzsgLyogQ1JDIHJlYWQgZnJvbSBmaWxlICovCisgICAgICB1bnNpZ25lZCBpbnQgbnJlYWQgPSByZWFkXzQoZmlsZSwgJmZpbGVfY3JjKTsKKworICAgICAgaWYgKG5yZWFkID09IDQpCisgICAgICB7CisgICAgICAgICBpZiAodHlwZSAhPSBwbmdfSUVORCkgLyogZG8gbm90IHJlYWQgYmV5b25kIElFTkQgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIG5leHRfbGVuZ3RoOworCisgICAgICAgICAgICBucmVhZCArPSByZWFkXzQoZmlsZSwgJm5leHRfbGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChucmVhZCA9PSA4ICYmIG5leHRfbGVuZ3RoIDw9IDB4N2ZmZmZmZmYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfdWludF8zMiBuZXh0X3R5cGU7CisKKyAgICAgICAgICAgICAgIG5yZWFkICs9IHJlYWRfNChmaWxlLCAmbmV4dF90eXBlKTsKKworICAgICAgICAgICAgICAgaWYgKG5yZWFkID09IDEyICYmIGNodW5rX3R5cGVfdmFsaWQobmV4dF90eXBlKSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIEFkanVzdCB0aGUgcmVhZCBjb3VudCBiYWNrIHRvIHRoZSBjb3JyZWN0IHZhbHVlIGZvciB0aGlzCisgICAgICAgICAgICAgICAgICAgKiBjaHVuay4KKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgZmlsZS0+cmVhZF9jb3VudCAtPSA4OworICAgICAgICAgICAgICAgICAgcHJvY2Vzc19jaHVuayhmaWxlLCBmaWxlX2NyYywgbmV4dF9sZW5ndGgsIG5leHRfdHlwZSk7CisgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UgLyogSUVORCAqLworICAgICAgICAgeworICAgICAgICAgICAgcHJvY2Vzc19jaHVuayhmaWxlLCBmaWxlX2NyYywgMCwgMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIC8qIENvbnRyb2wgZ2V0cyB0byBoZXJlIGlmIHRoZSB0aGUgc3RyZWFtIHNlZW1zIGludmFsaWQgb3IgZGFtYWdlZCBpbiBzb21lCisgICAgKiB3YXkuICBFaXRoZXIgdGhlcmUgd2FzIGEgcHJvYmxlbSByZWFkaW5nIGFsbCB0aGUgZXhwZWN0ZWQgZGF0YSAodGhpcworICAgICogY2h1bmsncyBkYXRhLCBpdHMgQ1JDIGFuZCB0aGUgbGVuZ3RoIGFuZCB0eXBlIG9mIHRoZSBuZXh0IGNodW5rKSBvciB0aGUKKyAgICAqIG5leHQgY2h1bmsgbGVuZ3RoL3R5cGUgYXJlIGludmFsaWQuICBOb3RpY2UgdGhhdCB0aGUgY2FzZXMgdGhhdCBlbmQgdXAKKyAgICAqIGhlcmUgYWxsIGNvcnJlc3BvbmQgdG8gY2FzZXMgdGhhdCB3b3VsZCBvdGhlcndpc2UgdGVybWluYXRlIHRoZSByZWFkIG9mCisgICAgKiB0aGUgUE5HIGZpbGUuCisgICAgKi8KKyAgIHN5bmNfc3RyZWFtKGZpbGUpOworfQorCisvKiBUaGlzIHJldHVybnMgYSBmaWxlKiBmcm9tIGEgcG5nX3N0cnVjdCBpbiBhbiBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyB3YXkuICovCitzdGF0aWMgc3RydWN0IGZpbGUgKmdldF9jb250cm9sKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyKTsKKworc3RhdGljIHZvaWQgUE5HQ0JBUEkKK2Vycm9yX2hhbmRsZXIocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIG1lc3NhZ2UpCit7CisgICBzdG9wKGdldF9jb250cm9sKHBuZ19wdHIpLCAgTElCUE5HX0VSUk9SX0NPREUsIG1lc3NhZ2UpOworfQorCitzdGF0aWMgdm9pZCBQTkdDQkFQSQord2FybmluZ19oYW5kbGVyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBtZXNzYWdlKQoreworICAgc3RydWN0IGZpbGUgKmZpbGUgPSBnZXRfY29udHJvbChwbmdfcHRyKTsKKworICAgaWYgKGZpbGUtPmdsb2JhbC0+d2FybmluZ3MpCisgICAgICBlbWl0X2Vycm9yKGZpbGUsIExJQlBOR19XQVJOSU5HX0NPREUsIG1lc3NhZ2UpOworfQorCisvKiBSZWFkIGNhbGxiYWNrIC0gdGhpcyBpcyB3aGVyZSB0aGUgd29yayBnZXRzIGRvbmUgdG8gY2hlY2sgdGhlIHN0cmVhbSBiZWZvcmUKKyAqIHBhc3NpbmcgaXQgdG8gbGlicG5nCisgKi8KK3N0YXRpYyB2b2lkIFBOR0NCQVBJCityZWFkX2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBidWZmZXIsIHNpemVfdCBjb3VudCkKKyAgIC8qIFJldHVybiAnY291bnQnIGJ5dGVzIHRvIGxpYnBuZyBpbiAnYnVmZmVyJyAqLworeworICAgc3RydWN0IGZpbGUgKmZpbGUgPSBnZXRfY29udHJvbChwbmdfcHRyKTsKKyAgIHBuZ191aW50XzMyIHR5cGUsIGxlbmd0aDsgLyogRm9yIHRoZSBjaHVuayBiZSAqV1JJVFRFTiogKi8KKyAgIHN0cnVjdCBjaHVuayAqY2h1bms7CisKKyAgIC8qIGxpYnBuZyBzaG91bGQgYWx3YXlzIGFzayBmb3IgYXQgbGVhc3Qgb25lIGJ5dGUgKi8KKyAgIGlmIChjb3VudCA9PSAwKQorICAgICAgc3RvcChmaWxlLCBVTkVYUEVDVEVEX0VSUk9SX0NPREUsICJyZWFkIGNhbGxiYWNrIGZvciAwIGJ5dGVzIik7CisKKyAgIC8qIFRoZSBjYWxsYmFjayBhbHdheXMgcmVhZHMgYWhlYWQgYnkgOCBieXRlcyAtIHRoZSBzaWduYXR1cmUgb3IgY2h1bmsgaGVhZGVyCisgICAgKiAtIHRoZXNlIGJ5dGVzIGFyZSBzdG9yZWQgaW4gY2h1bmtfbGVuZ3RoIGFuZCBjaHVua190eXBlLiAgVGhpcyBibG9jayBpcworICAgICogZXhlY3V0ZWQgb25jZSBmb3IgdGhlIHNpZ25hdHVyZSBhbmQgb25jZSBmb3IgdGhlIGZpcnN0IGNodW5rIHJpZ2h0IGF0IHRoZQorICAgICogc3RhcnQuCisgICAgKi8KKyAgIGlmIChmaWxlLT5yZWFkX2NvdW50IDwgOCkKKyAgIHsKKyAgICAgIGFzc2VydChmaWxlLT5yZWFkX2NvdW50ID09IDApOworICAgICAgYXNzZXJ0KChmaWxlLT5zdGF0dXNfY29kZSAmIFRSVU5DQVRFRCkgPT0gMCk7CisKKyAgICAgICh2b2lkKXJlYWRfNChmaWxlLCAmZmlsZS0+bGVuZ3RoKTsKKworICAgICAgaWYgKGZpbGUtPnJlYWRfY291bnQgPT0gNCkKKyAgICAgICAgICh2b2lkKXJlYWRfNChmaWxlLCAmZmlsZS0+dHlwZSk7CisKKyAgICAgIGlmIChmaWxlLT5yZWFkX2NvdW50IDwgOCkKKyAgICAgIHsKKyAgICAgICAgIGFzc2VydCgoZmlsZS0+c3RhdHVzX2NvZGUgJiBUUlVOQ0FURUQpICE9IDApOworICAgICAgICAgc3RvcChmaWxlLCBSRUFEX0VSUk9SX0NPREUsICJub3QgYSBQTkcgKHRvbyBzaG9ydCkiKTsKKyAgICAgIH0KKworICAgICAgaWYgKGZpbGUtPnN0YXRlID09IFNUQVRFX1NJR05BVFVSRSkKKyAgICAgIHsKKyAgICAgICAgIGlmIChmaWxlLT5sZW5ndGggIT0gc2lnMSB8fCBmaWxlLT50eXBlICE9IHNpZzIpCisgICAgICAgICAgICBzdG9wKGZpbGUsIExJQlBOR19FUlJPUl9DT0RFLCAibm90IGEgUE5HIChzaWduYXR1cmUpIik7CisKKyAgICAgICAgIC8qIEVsc2Ugd3JpdGUgaXQgKHRoaXMgaXMgdGhlIGluaXRpYWxpemF0aW9uIG9mIHdyaXRlX2NvdW50LCBwcmlvciB0bworICAgICAgICAgICogdGhpcyBpdCBjb250YWlucyBDTEVBUiBnYXJiYWdlLikKKyAgICAgICAgICAqLworICAgICAgICAgZmlsZS0+d3JpdGVfY291bnQgPSAwOworICAgICAgfQorCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBhc3NlcnQoZmlsZS0+c3RhdGUgPT0gU1RBVEVfQ0hVTktTKTsKKworICAgICAgICAgLyogVGhlIGZpcnN0IGNodW5rIG11c3QgYmUgYSB3ZWxsIGZvcm1lZCBJSERSICh0aGlzIGNvdWxkIGJlIHJlbGF4ZWQgdG8KKyAgICAgICAgICAqIHVzZSB0aGUgY2hlY2tzIGluIHByb2Nlc3NfY2h1bmssIGJ1dCB0aGF0IHNlZW1zIHVubmVjZXNzYXJ5LikKKyAgICAgICAgICAqLworICAgICAgICAgaWYgKGZpbGUtPmxlbmd0aCAhPSAxMyB8fCBmaWxlLT50eXBlICE9IHBuZ19JSERSKQorICAgICAgICAgICAgc3RvcChmaWxlLCBMSUJQTkdfRVJST1JfQ09ERSwgIm5vdCBhIFBORyAoSUhEUikiKTsKKworICAgICAgICAgLyogVGhlIHBvc2l0aW9uIG9mIHRoZSBkYXRhIG11c3QgYmUgc3RvcmVkIHRvbyAqLworICAgICAgICAgZ2V0cG9zKGZpbGUpOworICAgICAgfQorICAgfQorCisgICAvKiBSZXRyaWV2ZSBwcmV2aW91cyBzdGF0ZSAoYmVjYXVzZSB0aGUgcmVhZCBjYWxsYmFja3MgYXJlIG1hZGUgcHJldHR5IG11Y2gKKyAgICAqIGJ5dGUtYnktYnl0ZSBpbiB0aGUgc2VxdWVudGlhbCByZWFkZXIgcHJpb3IgdG8gMS43KS4KKyAgICAqLworICAgY2h1bmsgPSBmaWxlLT5jaHVuazsKKworICAgaWYgKGNodW5rICE9IE5VTEwpCisgICB7CisgICAgICBsZW5ndGggPSBjaHVuay0+Y2h1bmtfbGVuZ3RoOworICAgICAgdHlwZSA9IGNodW5rLT5jaHVua190eXBlOworICAgfQorCisgICBlbHNlCisgICB7CisgICAgICAvKiBUaGlzIGlzIHRoZSBzaWduYXR1cmUgY2FzZTsgZm9yIElEQVQgYW5kIG90aGVyIGNodW5rcyB0aGVzZSB2YWx1ZXMgd2lsbAorICAgICAgICogYmUgb3ZlcndyaXR0ZW4gd2hlbiByZWFkX2NodW5rIGlzIGNhbGxlZCBiZWxvdy4KKyAgICAgICAqLworICAgICAgbGVuZ3RoID0gZmlsZS0+bGVuZ3RoOworICAgICAgdHlwZSA9IGZpbGUtPnR5cGU7CisgICB9CisKKyAgIGRvCisgICB7CisgICAgICBwbmdfdWludF8zMiBiOworCisgICAgICAvKiBDb21wbGV0ZSB0aGUgcmVhZCBvZiBhIGNodW5rOyBhcyBhIHNpZGUgZWZmZWN0IHRoaXMgYWxzbyBpbnN0YW50aWF0ZXMKKyAgICAgICAqIGEgY2h1bmsgY29udHJvbCBzdHJ1Y3R1cmUgYW5kIHNldHMgdGhlIGZpbGUgbGVuZ3RoL3R5cGUvZGF0YV9wb3MgZmllbGRzCisgICAgICAgKiBmb3IgdGhlICpORVhUKiBjaHVuayBoZWFkZXIuCisgICAgICAgKgorICAgICAgICogTk9URTogYXQgYW4gSURBVCBhbnkgZm9sbG93aW5nIElEQVQgY2h1bmtzIHdpbGwgYWxzbyBiZSByZWFkIGFuZCB0aGUKKyAgICAgICAqIG5leHRfIGZpZWxkcyB3aWxsIHJlZmVyIHRvIHRoZSBjaHVuayBhZnRlciB0aGUgbGFzdCBJREFULgorICAgICAgICoKKyAgICAgICAqIE5PVEU6IHJlYWRfY2h1bmsgb25seSByZXR1cm5zIHdoZW4gaXQgaGFzIHJlYWQgYSBjaHVuayB0aGF0IG11c3Qgbm93IGJlCisgICAgICAgKiB3cml0dGVuLgorICAgICAgICovCisgICAgICBpZiAoZmlsZS0+c3RhdGUgIT0gU1RBVEVfU0lHTkFUVVJFICYmIGNodW5rID09IE5VTEwpCisgICAgICB7CisgICAgICAgICBhc3NlcnQoZmlsZS0+cmVhZF9jb3VudCA9PSA4KTsKKyAgICAgICAgIGFzc2VydChmaWxlLT5pZGF0ID09IE5VTEwpOworICAgICAgICAgcmVhZF9jaHVuayhmaWxlKTsKKyAgICAgICAgIGNodW5rID0gZmlsZS0+Y2h1bms7CisgICAgICAgICBhc3NlcnQoY2h1bmsgIT0gTlVMTCk7CisKKyAgICAgICAgIC8qIERvIHRoZSBpbml0aWFsaXphdGlvbiB0aGF0IHdhcyBub3QgZG9uZSBiZWZvcmUuICovCisgICAgICAgICBsZW5ndGggPSBjaHVuay0+Y2h1bmtfbGVuZ3RoOworICAgICAgICAgdHlwZSA9IGNodW5rLT5jaHVua190eXBlOworCisgICAgICAgICAvKiBBbmQgc3RhcnQgd3JpdGluZyB0aGUgbmV3IGNodW5rLiAqLworICAgICAgICAgZmlsZS0+d3JpdGVfY291bnQgPSAwOworICAgICAgfQorCisgICAgICAvKiBUaGUgY2h1bmtfIGZpZWxkcyBkZXNjcmliZSBhIGNodW5rIHRoYXQgbXVzdCBiZSB3cml0dGVuLCBvciBob2xkIHRoZQorICAgICAgICogc2lnbmF0dXJlLiAgV3JpdGUgdGhlIGhlYWRlciBmaXJzdC4gIEluIHRoZSBzaWduYXR1cmUgY2FzZSB0aGlzCisgICAgICAgKiByZXdyaXRlcyB0aGUgc2lnbmF0dXJlLgorICAgICAgICovCisgICAgICBzd2l0Y2ggKGZpbGUtPndyaXRlX2NvdW50KQorICAgICAgeworICAgICAgICAgY2FzZSAwOiBiID0gbGVuZ3RoID4+IDI0OyBicmVhazsKKyAgICAgICAgIGNhc2UgMTogYiA9IGxlbmd0aCA+PiAxNjsgYnJlYWs7CisgICAgICAgICBjYXNlIDI6IGIgPSBsZW5ndGggPj4gIDg7IGJyZWFrOworICAgICAgICAgY2FzZSAzOiBiID0gbGVuZ3RoICAgICAgOyBicmVhazsKKworICAgICAgICAgY2FzZSA0OiBiID0gdHlwZSA+PiAyNDsgYnJlYWs7CisgICAgICAgICBjYXNlIDU6IGIgPSB0eXBlID4+IDE2OyBicmVhazsKKyAgICAgICAgIGNhc2UgNjogYiA9IHR5cGUgPj4gIDg7IGJyZWFrOworICAgICAgICAgY2FzZSA3OiBiID0gdHlwZSAgICAgIDsgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIC8qIFRoZSBoZWFkZXIgaGFzIGJlZW4gd3JpdHRlbi4gIElmIHRoaXMgaXMgcmVhbGx5IHRoZSBzaWduYXR1cmUKKyAgICAgICAgICAgICAqIHRoYXQncyBhbGwgdGhhdCBpcyByZXF1aXJlZCBhbmQgd2UgY2FuIGdvIHRvIG5vcm1hbCBjaHVuaworICAgICAgICAgICAgICogcHJvY2Vzc2luZy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKGZpbGUtPnN0YXRlID09IFNUQVRFX1NJR05BVFVSRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8qIFRoZSBzaWduYXR1cmUgaGFzIGJlZW4gd3JpdHRlbiwgdGhlIHRhaWwgY2FsbCB0byByZWFkX2NhbGxiYWNrCisgICAgICAgICAgICAgICAgKiBiZWxvdyAoaXQncyBqdXN0IGEgZ290byB0byB0aGUgc3RhcnQgd2l0aCBhIGRlY2VudCBjb21waWxlcikKKyAgICAgICAgICAgICAgICAqIHdpbGwgcmVhZCB0aGUgSUhEUiBoZWFkZXIgYWhlYWQgYW5kIHZhbGlkYXRlIGl0LgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICBhc3NlcnQobGVuZ3RoID09IHNpZzEgJiYgdHlwZSA9PSBzaWcyKTsKKyAgICAgICAgICAgICAgIGZpbGUtPnJlYWRfY291bnQgPSAwOyAvKiBGb3JjZXMgYSBoZWFkZXIgcmVhZCAqLworICAgICAgICAgICAgICAgZmlsZS0+c3RhdGUgPSBTVEFURV9DSFVOS1M7IC8qIElIRFI6IGNoZWNrZWQgYWJvdmUgKi8KKyAgICAgICAgICAgICAgIHJlYWRfY2FsbGJhY2socG5nX3B0ciwgYnVmZmVyLCBjb3VudCk7CisgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGFzc2VydChjaHVuayAhPSBOVUxMKTsKKworICAgICAgICAgICAgICAgLyogU2V0IHVwIGZvciB3cml0ZSwgbm90aWNlIHRoYXQgcmVwb3NpdGlvbmluZyB0aGUgaW5wdXQgc3RyZWFtCisgICAgICAgICAgICAgICAgKiBpcyBvbmx5IG5lY2Vzc2FyeSBpZiBzb21ldGhpbmcgaXMgdG8gYmUgcmVhZCBmcm9tIGl0LiAgQWxzbworICAgICAgICAgICAgICAgICogbm90aWNlIHRoYXQgZm9yIHRoZSBJREFUIHN0cmVhbSB0aGlzIG11c3Qgb25seSBoYXBwZW4gb25jZSAtCisgICAgICAgICAgICAgICAgKiBvbiB0aGUgZmlyc3QgSURBVCAtIHRvIGdldCBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgbGlzdCBhbmQKKyAgICAgICAgICAgICAgICAqIHRoaXMgaXMgZG9uZSBpbnNpZGUgcHJvY2Vzc19JREFUOgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICBjaHVuay0+d3JpdGVfY3JjID0gY3JjX2luaXRfNCh0eXBlKTsKKyAgICAgICAgICAgICAgIGlmIChmaWxlLT5zdGF0ZSAhPSBTVEFURV9JREFUICYmIGxlbmd0aCA+IDApCisgICAgICAgICAgICAgICAgICBzZXRwb3MoY2h1bmspOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhc3NlcnQoY2h1bmsgIT0gTlVMTCk7CisKKyAgICAgICAgICAgIC8qIE5PVEU6IHRoZSBhcml0aG1ldGljIGJlbG93IG92ZXJmbG93cyBhbmQgZ2l2ZXMgYSBsYXJnZSBwb3NpdGl2ZQorICAgICAgICAgICAgICogcG5nX3VpbnRfMzIgdmFsdWUgdW50aWwgdGhlIHdob2xlIGNodW5rIGRhdGEgaGFzIGJlZW4gd3JpdHRlbi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc3dpdGNoIChmaWxlLT53cml0ZV9jb3VudCAtIGxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8qIFdyaXRlIHRoZSBjaHVuayBkYXRhLCBub3JtYWxseSB0aGlzIGp1c3QgY29tZXMgZnJvbQorICAgICAgICAgICAgICAgICogdGhlIGZpbGUuICBUaGUgb25seSBleGNlcHRpb24gaXMgZm9yIHRoYXQgcGFydCBvZiBhCisgICAgICAgICAgICAgICAgKiBjaHVuayB3aGljaCBpcyB6bGliIGRhdGEgYW5kIHdoaWNoIG11c3QgYmUgcmV3cml0dGVuLAorICAgICAgICAgICAgICAgICogYW5kIElEQVQgY2h1bmtzIHdoaWNoIGNhbiBiZSBjb21wbGV0ZWx5CisgICAgICAgICAgICAgICAgKiByZWNvbnN0cnVjdGVkLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgaWYgKGZpbGUtPnN0YXRlID09IFNUQVRFX0lEQVQpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgSURBVCAqaWRhdCA9IGZpbGUtPmlkYXQ7CisKKyAgICAgICAgICAgICAgICAgICAgIGFzc2VydChpZGF0ICE9IE5VTEwpOworCisgICAgICAgICAgICAgICAgICAgICAvKiBSZWFkIGFuIElEQVQgYnl0ZSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gb2YgSURBVCBjaHVua3MuCisgICAgICAgICAgICAgICAgICAgICAgKiBCZWNhdXNlIHRoZSBJREFUIHN0cmVhbSBjYW4gYmUgcmUtY2h1bmtlZCB0aGlzIHN0cmVhbSBpcworICAgICAgICAgICAgICAgICAgICAgICogaGVsZCBpbiB0aGUgc3RydWN0IElEQVQgbWVtYmVycy4gIFRoZSBjaHVuayBtZW1iZXJzLCBpbgorICAgICAgICAgICAgICAgICAgICAgICogcGFydGljdWxhciBjaHVua19sZW5ndGggKGFuZCB0aGVyZWZvcmUgdGhlIGxlbmd0aCBsb2NhbCkKKyAgICAgICAgICAgICAgICAgICAgICAqIHJlZmVyIHRvIHRoZSBvdXRwdXQgY2h1bmsuCisgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpZGF0LT5pZGF0X2luZGV4ID49IGlkYXQtPmlkYXRfbGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogQWR2YW5jZSBvbmUgY2h1bmsgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBJREFUX2xpc3QgKmN1ciA9IGlkYXQtPmlkYXRfY3VyOworCisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoaWRhdC0+aWRhdF9pbmRleCA9PSBpZGF0LT5pZGF0X2xlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoY3VyICE9IE5VTEwgJiYgY3VyLT5jb3VudCA+IDApOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBOT1RFOiBJREFUX2xpc3Q6OmNvdW50IGhlcmUsIG5vdCBJREFUX2xpc3Q6Omxlbmd0aCAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCsrKGlkYXQtPmlkYXRfY291bnQpID49IGN1ci0+Y291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoaWRhdC0+aWRhdF9jb3VudCA9PSBjdXItPmNvdW50KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTW92ZSBvbiB0byB0aGUgbmV4dCBJREFUX2xpc3Q6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXIgPSBjdXItPm5leHQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgYW4gaW50ZXJuYWwgZXJyb3IgLSByZWFkIGJleW9uZCB0aGUgZW5kIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgcHJlLWNhbGN1bGF0ZWQgc3RyZWFtLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyID09IE5VTEwgfHwgY3VyLT5jb3VudCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcChmaWxlLCBVTkVYUEVDVEVEX0VSUk9SX0NPREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZCBiZXlvbmQgZW5kIG9mIElEQVQiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRhdC0+aWRhdF9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGF0LT5pZGF0X2N1ciA9IGN1cjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWRhdC0+aWRhdF9pbmRleCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBaZXJvIGxlbmd0aCBJREFUIGNodW5rcyBhcmUgcGVybWl0dGVkLCBzbyB0aGUgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBoZXJlIG1heSBiZSAwLgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZGF0LT5pZGF0X2xlbmd0aCA9IGN1ci0+bGVuZ3Roc1tpZGF0LT5pZGF0X2NvdW50XTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogQW5kIHNraXAgMTIgYnl0ZXMgdG8gdGhlIG5leHQgY2h1bmsgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcF8xMihmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGluZGV4IGlzIGFsd2F5cyB0aGF0IG9mIHRoZSBuZXh0IGJ5dGUsIHRoZSByZXN0IG9mCisgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgaW5mb3JtYXRpb24gaXMgYWx3YXlzIHRoZSBjdXJyZW50IElEQVQgY2h1bmsgYW5kIHRoZQorICAgICAgICAgICAgICAgICAgICAgICogY3VycmVudCBsaXN0LgorICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICArKyhpZGF0LT5pZGF0X2luZGV4KTsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgLyogUmVhZCB0aGUgYnl0ZSBmcm9tIHRoZSBzdHJlYW0uICovCisgICAgICAgICAgICAgICAgICBiID0gcmVyZWFkX2J5dGUoZmlsZSk7CisKKyAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSBieXRlIG11c3QgYmUgcmV3cml0dGVuIGhhbmRsZSB0aGF0IGhlcmUgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChjaHVuay0+cmV3cml0ZV9sZW5ndGggPiAwKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rLT5yZXdyaXRlX29mZnNldCA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAtLShjaHVuay0+cmV3cml0ZV9vZmZzZXQpOworCisgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiID0gY2h1bmstPnJld3JpdGVfYnVmZmVyWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtbW92ZShjaHVuay0+cmV3cml0ZV9idWZmZXIsIGNodW5rLT5yZXdyaXRlX2J1ZmZlcisxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZiBjaHVuay0+cmV3cml0ZV9idWZmZXIpLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZiBjaHVuay0+cmV3cml0ZV9idWZmZXJbMF0pKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLS0oY2h1bmstPnJld3JpdGVfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgY2h1bmstPndyaXRlX2NyYyA9IGNyY19vbmVfYnl0ZShjaHVuay0+d3JpdGVfY3JjLCBiKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAvKiBUaGUgQ1JDIGlzIHdyaXR0ZW4gYXQ6CisgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICogICAgY2h1bmtfd3JpdGUgPT0gY2h1bmtfbGVuZ3RoKzguLmNodW5rX2xlbmd0aCsxMQorICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAqIHNvIDggdG8gMTEuICBUaGUgQ1JDIGlzIG5vdCAoeWV0KSBjb25kaXRpb25lZC4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgY2FzZSAgODogYiA9IGNodW5rLT53cml0ZV9jcmMgPj4gMjQ7IGdvdG8gd3JpdGVfY3JjOworICAgICAgICAgICAgICAgY2FzZSAgOTogYiA9IGNodW5rLT53cml0ZV9jcmMgPj4gMTY7IGdvdG8gd3JpdGVfY3JjOworICAgICAgICAgICAgICAgY2FzZSAxMDogYiA9IGNodW5rLT53cml0ZV9jcmMgPj4gIDg7IGdvdG8gd3JpdGVfY3JjOworICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgIC8qIFRoaXMgbXVzdCBoYXBwZW4gYmVmb3JlIHRoZSBjaHVua19lbmQgYmVsb3c6ICovCisgICAgICAgICAgICAgICAgICBiID0gY2h1bmstPndyaXRlX2NyYzsKKworICAgICAgICAgICAgICAgICAgaWYgKGZpbGUtPmdsb2JhbC0+dmVyYm9zZSA+IDIpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBmcHV0cygiICAgIiwgc3RkZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlLCBzdGRlcnIpOworICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgJWx1IDB4JS44eFxuIiwgKHVuc2lnbmVkIGxvbmcpbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmstPndyaXRlX2NyYyBeIDB4ZmZmZmZmZmYpOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAvKiBUaGUgSURBVCBzdHJlYW0gaXMgd3JpdHRlbiB3aXRob3V0IGEgY2FsbCB0byByZWFkX2NodW5rCisgICAgICAgICAgICAgICAgICAgKiB1bnRpbCB0aGUgZW5kIGlzIHJlYWNoZWQuICByZWNodW5rX2xlbmd0aCgpIGNhbGN1bGF0ZXMgdGhlCisgICAgICAgICAgICAgICAgICAgKiBsZW5ndGggb2YgdGhlIG91dHB1dCBjaHVua3MuICBDb250cm9sIGdldHMgdG8gdGhpcyBwb2ludCBhdAorICAgICAgICAgICAgICAgICAgICogdGhlIGVuZCBvZiBhbiAqb3V0cHV0KiBjaHVuayAtIHRoZSBsZW5ndGggY2FsY3VsYXRlZCBieQorICAgICAgICAgICAgICAgICAgICogcmVjaHVua19sZW5ndGguICBJZiB0aGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBlbmQgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgKiBpbnB1dCBzdHJlYW0gc3RvcCB3cml0aW5nIElEQVQgY2h1bmtzLCBvdGhlcndpc2UgY29udGludWUuCisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChmaWxlLT5zdGF0ZSA9PSBTVEFURV9JREFUICYmCisgICAgICAgICAgICAgICAgICAgICAoZmlsZS0+aWRhdC0+aWRhdF9pbmRleCA8IGZpbGUtPmlkYXQtPmlkYXRfbGVuZ3RoIHx8CisgICAgICAgICAgICAgICAgICAgICAgMStmaWxlLT5pZGF0LT5pZGF0X2NvdW50IDwgZmlsZS0+aWRhdC0+aWRhdF9jdXItPmNvdW50IHx8CisgICAgICAgICAgICAgICAgICAgICAgZmlsZS0+aWRhdC0+aWRhdF9jdXIgIT0gZmlsZS0+aWRhdC0+aWRhdF9saXN0X3RhaWwpKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgLyogV3JpdGUgYW5vdGhlciBJREFUIGNodW5rLiAgQ2FsbCByZWNodW5rX2xlbmd0aCB0bworICAgICAgICAgICAgICAgICAgICAgICogY2FsY3VsYXRlIHRoZSBsZW5ndGggcmVxdWlyZWQuCisgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IGNodW5rLT5jaHVua19sZW5ndGggPSByZWNodW5rX2xlbmd0aChmaWxlLT5pZGF0KTsKKyAgICAgICAgICAgICAgICAgICAgIGFzc2VydCh0eXBlID09IHBuZ19JREFUKTsKKyAgICAgICAgICAgICAgICAgICAgIGZpbGUtPndyaXRlX2NvdW50ID0gMDsgLyogZm9yIHRoZSBuZXcgY2h1bmsgKi8KKyAgICAgICAgICAgICAgICAgICAgIC0tKGZpbGUtPndyaXRlX2NvdW50KTsgLyogZmFrZSBvdXQgdGhlIGluY3JlbWVudCBiZWxvdyAqLworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAvKiBFbnRlcmVkIGF0IHRoZSBlbmQgb2YgYSBub24tSURBVCBjaHVuayBhbmQgYXQgdGhlIGVuZCBvZgorICAgICAgICAgICAgICAgICAgICAgICogdGhlIElEQVQgc3RyZWFtLiAgVGhlIHJld3JpdGUgc2hvdWxkIGhhdmUgYmVlbiBjbGVhcmVkLgorICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICBpZiAoY2h1bmstPnJld3JpdGVfbGVuZ3RoID4gMCB8fCBjaHVuay0+cmV3cml0ZV9vZmZzZXQgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RvcChmaWxlLCBVTkVYUEVDVEVEX0VSUk9SX0NPREUsICJwZW5kaW5nIHJld3JpdGUiKTsKKworICAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgbGFzdCBieXRlIHNvIHJlc2V0IGNodW5rX3JlYWQgZm9yIHRoZSBuZXh0CisgICAgICAgICAgICAgICAgICAgICAgKiBjaHVuayBhbmQgbW92ZSB0aGUgaW5wdXQgZmlsZSB0byB0aGUgcG9zaXRpb24gYWZ0ZXIgdGhlCisgICAgICAgICAgICAgICAgICAgICAgKiAqbmV4dCogY2h1bmsgaGVhZGVyIGlmIHJlcXVpcmVkLgorICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICBmaWxlLT5yZWFkX2NvdW50ID0gODsKKyAgICAgICAgICAgICAgICAgICAgIGZpbGVfc2V0cG9zKGZpbGUsICZmaWxlLT5kYXRhX3Bvcyk7CisKKyAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLT5pZGF0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICBjaHVua19lbmQoJmZpbGUtPmNodW5rKTsKKworICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgSURBVF9lbmQoJmZpbGUtPmlkYXQpOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICB3cml0ZV9jcmM6CisgICAgICAgICAgICAgICAgICBiIF49IDB4ZmY7IC8qIGNvbmRpdGlvbmluZyAqLworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLyogV3JpdGUgb25lIGJ5dGUgKi8KKyAgICAgIGIgJj0gMHhmZjsKKyAgICAgICpidWZmZXIrKyA9IChwbmdfYnl0ZSliOworICAgICAgLS1jb3VudDsKKyAgICAgIHdyaXRlX2J5dGUoZmlsZSwgKHBuZ19ieXRlKWIpOyAvKiBpbmNyZW1lbnRzIGNodW5rX3dyaXRlICovCisgICB9CisgICB3aGlsZSAoY291bnQgPiAwKTsKK30KKworLyogQnVuZGxlIHRoZSBmaWxlIGFuZCBhbiB1bmluaXRpYWxpemVkIGNodW5rIGFuZCBJREFUIGNvbnRyb2wgc3RydWN0dXJlCisgKiB0b2dldGhlciB0byBhbGxvdyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY2h1bmsvSURBVCBhbGxvY2F0ZSByb3V0aW5lLgorICovCitzdHJ1Y3QgY29udHJvbAoreworICAgc3RydWN0IGZpbGUgIGZpbGU7CisgICBzdHJ1Y3QgY2h1bmsgY2h1bms7CisgICBzdHJ1Y3QgSURBVCAgaWRhdDsKK307CisKK3N0YXRpYyBpbnQKK2NvbnRyb2xfZW5kKHN0cnVjdCBjb250cm9sICpjb250cm9sKQoreworICAgcmV0dXJuIGZpbGVfZW5kKCZjb250cm9sLT5maWxlKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlICoKK2dldF9jb250cm9sKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyKQoreworICAgLyogVGhpcyBqdXN0IHJldHVybnMgdGhlIChmaWxlKikuICBUaGUgY2h1bmsgYW5kIGlkYXQgY29udHJvbCBzdHJ1Y3R1cmVzCisgICAgKiBkb24ndCBhbHdheXMgZXhpc3QuCisgICAgKi8KKyAgIHN0cnVjdCBjb250cm9sICpjb250cm9sID0gdm9pZGNhc3Qoc3RydWN0IGNvbnRyb2wqLAorICAgICAgcG5nX2dldF9lcnJvcl9wdHIocG5nX3B0cikpOworICAgcmV0dXJuICZjb250cm9sLT5maWxlOworfQorCitzdGF0aWMgdm9pZAorYWxsb2NhdGUoc3RydWN0IGZpbGUgKmZpbGUsIGludCBhbGxvY2F0ZV9pZGF0KQoreworICAgc3RydWN0IGNvbnRyb2wgKmNvbnRyb2wgPSB2b2lkY2FzdChzdHJ1Y3QgY29udHJvbCosIGZpbGUtPmFsbG9jX3B0cik7CisKKyAgIGlmIChhbGxvY2F0ZV9pZGF0KQorICAgeworICAgICAgYXNzZXJ0KGZpbGUtPmlkYXQgPT0gTlVMTCk7CisgICAgICBJREFUX2luaXQoJmNvbnRyb2wtPmlkYXQsIGZpbGUpOworICAgfQorCisgICBlbHNlIC8qIGNodW5rICovCisgICB7CisgICAgICBhc3NlcnQoZmlsZS0+Y2h1bmsgPT0gTlVMTCk7CisgICAgICBjaHVua19pbml0KCZjb250cm9sLT5jaHVuaywgZmlsZSk7CisgICB9Cit9CisKK3N0YXRpYyBpbnQKK2NvbnRyb2xfaW5pdChzdHJ1Y3QgY29udHJvbCAqY29udHJvbCwgc3RydWN0IGdsb2JhbCAqZ2xvYmFsLAorICAgY29uc3QgY2hhciAqZmlsZV9uYW1lLCBjb25zdCBjaGFyICpvdXRfbmFtZSkKKyAgIC8qIFRoaXMgd3JhcHMgZmlsZV9pbml0KCZjb250cm9sOjpmaWxlKSBhbmQgc2ltcGx5IHJldHVybnMgdGhlIHJlc3VsdCBmcm9tCisgICAgKiBmaWxlX2luaXQuCisgICAgKi8KK3sKKyAgIHJldHVybiBmaWxlX2luaXQoJmNvbnRyb2wtPmZpbGUsIGdsb2JhbCwgZmlsZV9uYW1lLCBvdXRfbmFtZSwgY29udHJvbCwKKyAgICAgIGFsbG9jYXRlKTsKK30KKworc3RhdGljIGludAorcmVhZF9wbmcoc3RydWN0IGNvbnRyb2wgKmNvbnRyb2wpCisgICAvKiBSZWFkIGEgUE5HLCByZXR1cm4gMCBvbiBzdWNjZXNzIGVsc2UgYW4gZXJyb3IgKHN0YXR1cykgY29kZTsgYSBiaXQgbWFzayBhcworICAgICogZGVmaW5lZCBmb3IgZmlsZTo6c3RhdHVzX2NvZGUgYXMgYWJvdmUuCisgICAgKi8KK3sKKyAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHI7CisgICBwbmdfaW5mb3AgaW5mb19wdHIgPSBOVUxMOworICAgdm9sYXRpbGUgaW50IHJjOworCisgICBwbmdfcHRyID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIGNvbnRyb2wsCisgICAgICBlcnJvcl9oYW5kbGVyLCB3YXJuaW5nX2hhbmRsZXIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgeworICAgICAgLyogVGhpcyBpcyBub3QgcmVhbGx5IGV4cGVjdGVkLiAqLworICAgICAgbG9nX2Vycm9yKCZjb250cm9sLT5maWxlLCBMSUJQTkdfRVJST1JfQ09ERSwgIk9PTSBhbGxvY2F0aW5nIHBuZ19zdHJ1Y3QiKTsKKyAgICAgIGNvbnRyb2wtPmZpbGUuc3RhdHVzX2NvZGUgfD0gSU5URVJOQUxfRVJST1I7CisgICAgICByZXR1cm4gTElCUE5HX0VSUk9SX0NPREU7CisgICB9CisKKyAgIHJjID0gc2V0am1wKGNvbnRyb2wtPmZpbGUuam1wYnVmKTsKKyAgIGlmIChyYyA9PSAwKQorICAgeworIyAgICAgaWZkZWYgUE5HX1NFVF9VU0VSX0xJTUlUU19TVVBQT1JURUQKKyAgICAgICAgIC8qIFJlbW92ZSBhbnkgbGltaXRzIG9uIHRoZSBzaXplIG9mIFBORyBmaWxlcyB0aGF0IGNhbiBiZSByZWFkLAorICAgICAgICAgICogd2l0aG91dCB0aGlzIHdlIG1heSByZWplY3QgZmlsZXMgYmFzZWQgb24gYnVpbHQtaW4gc2FmZXR5CisgICAgICAgICAgKiBsaW1pdHMuCisgICAgICAgICAgKi8KKyAgICAgICAgIHBuZ19zZXRfdXNlcl9saW1pdHMocG5nX3B0ciwgMHg3ZmZmZmZmZiwgMHg3ZmZmZmZmZik7CisgICAgICAgICBwbmdfc2V0X2NodW5rX2NhY2hlX21heChwbmdfcHRyLCAwKTsKKyAgICAgICAgIHBuZ19zZXRfY2h1bmtfbWFsbG9jX21heChwbmdfcHRyLCAwKTsKKyMgICAgIGVuZGlmCisKKyAgICAgIHBuZ19zZXRfcmVhZF9mbihwbmdfcHRyLCBjb250cm9sLCByZWFkX2NhbGxiYWNrKTsKKworICAgICAgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOworICAgICAgaWYgKGluZm9fcHRyID09IE5VTEwpCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk9PTSBhbGxvY2F0aW5nIGluZm8gc3RydWN0dXJlIik7CisKKyAgICAgIGlmIChjb250cm9sLT5maWxlLmdsb2JhbC0+dmVyYm9zZSkKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiIElORk9cbiIpOworCisgICAgICBwbmdfcmVhZF9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKKworICAgICAgeworICAgICAgICBwbmdfdWludF8zMiBoZWlnaHQgPSBwbmdfZ2V0X2ltYWdlX2hlaWdodChwbmdfcHRyLCBpbmZvX3B0cik7CisgICAgICAgIGludCBwYXNzZXMgPSBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyhwbmdfcHRyKTsKKyAgICAgICAgaW50IHBhc3M7CisKKyAgICAgICAgcG5nX3N0YXJ0X3JlYWRfaW1hZ2UocG5nX3B0cik7CisKKyAgICAgICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IHBhc3NlczsgKytwYXNzKQorICAgICAgICB7CisgICAgICAgICAgIHBuZ191aW50XzMyIHkgPSBoZWlnaHQ7CisKKyAgICAgICAgICAgLyogTk9URTogdGhpcyBza2lwcyBhc2tpbmcgbGlicG5nIHRvIHJldHVybiBlaXRoZXIgdmVyc2lvbiBvZgorICAgICAgICAgICAgKiB0aGUgaW1hZ2Ugcm93LCBidXQgbGlicG5nIHN0aWxsIHJlYWRzIHRoZSByb3dzLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgd2hpbGUgKHktLSA+IDApCisgICAgICAgICAgICAgIHBuZ19yZWFkX3JvdyhwbmdfcHRyLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoY29udHJvbC0+ZmlsZS5nbG9iYWwtPnZlcmJvc2UpCisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiBFTkRcbiIpOworCisgICAgICAvKiBNYWtlIHN1cmUgdG8gcmVhZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlOiAqLworICAgICAgcG5nX3JlYWRfZW5kKHBuZ19wdHIsIGluZm9fcHRyKTsKKyAgIH0KKworICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7CisgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQKK29uZV9maWxlKHN0cnVjdCBnbG9iYWwgKmdsb2JhbCwgY29uc3QgY2hhciAqZmlsZV9uYW1lLCBjb25zdCBjaGFyICpvdXRfbmFtZSkKK3sKKyAgIGludCByYzsKKyAgIHN0cnVjdCBjb250cm9sIGNvbnRyb2w7CisKKyAgIGlmIChnbG9iYWwtPnZlcmJvc2UpCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZJTEUgJXMgLT4gJXNcbiIsIGZpbGVfbmFtZSwKKyAgICAgICAgIG91dF9uYW1lID8gb3V0X25hbWUgOiAiPG5vbmU+Iik7CisKKyAgIC8qIEFsdGhvdWdoIGNvbnRyb2xfaW5pdCBjYW4gcmV0dXJuIGEgZmFpbHVyZSBjb2RlIHRoZSBzdHJ1Y3R1cmUgaXMgYWx3YXlzCisgICAgKiBpbml0aWFsaXplZCwgc28gY29udHJvbF9lbmQgY2FuIGJlIHVzZWQgdG8gYWNjdW11bGF0ZSBhbnkgc3RhdHVzIGNvZGVzLgorICAgICovCisgICByYyA9IGNvbnRyb2xfaW5pdCgmY29udHJvbCwgZ2xvYmFsLCBmaWxlX25hbWUsIG91dF9uYW1lKTsKKworICAgaWYgKHJjID09IDApCisgICAgICByYyA9IHJlYWRfcG5nKCZjb250cm9sKTsKKworICAgcmMgfD0gY29udHJvbF9lbmQoJmNvbnRyb2wpOworCisgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkCit1c2FnZShjb25zdCBjaGFyICpwcm9nKQoreworICAgLyogQU5TSSBDLTkwIGxpbWl0cyBzdHJpbmdzIHRvIDUwOSBjaGFyYWN0ZXJzLCBzbyB1c2UgYSBzdHJpbmcgYXJyYXk6ICovCisgICBzaXplX3QgaTsKKyAgIHN0YXRpYyBjb25zdCBjaGFyICp1c2FnZV9zdHJpbmdbXSA9IHsKKyIgIFRlc3RzLCBvcHRpbWl6ZXMgYW5kIG9wdGlvbmFsbHkgZml4ZXMgdGhlIHpsaWIgaGVhZGVyIGluIFBORyBmaWxlcy4iLAorIiAgT3B0aW9uYWxseSwgd2hlbiBmaXhpbmcsIHN0cmlwcyBhbmNpbGxpYXJ5IGNodW5rcyBmcm9tIHRoZSBmaWxlLiIsCiswLAorIk9QVElPTlMiLAorIiAgT1BFUkFUSU9OIiwKKyIgICAgICBCeSBkZWZhdWx0IGZpbGVzIGFyZSBqdXN0IGNoZWNrZWQgZm9yIHJlYWRhYmlsaXR5IHdpdGggYSBzdW1tYXJ5IG9mIHRoZSIsCisiICAgICAgb2YgemxpYiBpc3N1ZXMgZm91bmRzIGZvciBlYWNoIGNvbXByZXNzZWQgY2h1bmsgYW5kIHRoZSBJREFUIHN0cmVhbSBpbiIsCisiICAgICAgdGhlIGZpbGUuIiwKKyIgICAgLS1vcHRpbWl6ZSAoLW8pOiIsCisiICAgICAgRmluZCB0aGUgc21hbGxlc3QgZGVmbGF0ZSB3aW5kb3cgc2l6ZSBmb3IgdGhlIGNvbXByZXNzZWQgZGF0YS4iLAorIiAgICAtLXN0cmlwPVtub25lfGNyY3x1bnNhZmV8dW51c2VkfHRyYW5zZm9ybXxjb2xvcnxhbGxdOiIsCisiICAgICAgICBub25lIChkZWZhdWx0KTogICBSZXRhaW4gYWxsIGNodW5rcy4iLAorIiAgICAgICAgY3JjOiAgICBSZW1vdmUgY2h1bmtzIHdpdGggYSBiYWQgQ1JDLiIsCisiICAgICAgICB1bnNhZmU6IFJlbW92ZSBjaHVua3MgdGhhdCBtYXkgYmUgdW5zYWZlIHRvIHJldGFpbiBpZiB0aGUgaW1hZ2UgZGF0YSIsCisiICAgICAgICAgICAgICAgIGlzIG1vZGlmaWVkLiAgVGhpcyBpcyBzZXQgYXV0b21hdGljYWxseSBpZiAtLW1heCBpcyBnaXZlbiBidXQiLAorIiAgICAgICAgICAgICAgICBtYXkgYmUgY2FuY2VsbGVkIGJ5IGEgbGF0ZXIgLS1zdHJpcD1ub25lLiIsCisiICAgICAgICB1bnVzZWQ6IFJlbW92ZSBjaHVua3Mgbm90IHVzZWQgYnkgbGlicG5nIHdoZW4gZGVjb2RpbmcgYW4gaW1hZ2UuIiwKKyIgICAgICAgICAgICAgICAgVGhpcyByZXRhaW5zIGFueSBjaHVua3MgdGhhdCBtaWdodCBiZSB1c2VkIGJ5IGxpYnBuZyBpbWFnZSIsCisiICAgICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9ucy4iLAorIiAgICAgICAgdHJhbnNmb3JtOiB1bnVzZWQrYktHRC4iLAorIiAgICAgICAgY29sb3I6ICB0cmFuc2Zvcm0raUNDUCBhbmQgY0hSTS4iLAorIiAgICAgICAgYWxsOiAgICBjb2xvcitnQU1BIGFuZCBzUkdCLiIsCisiICAgICAgT25seSBhbmNpbGxhcnkgY2h1bmtzIGFyZSBldmVyIHJlbW92ZWQuICBJbiBhZGRpdGlvbiB0aGUgdFJOUyBhbmQgc0JJVCIsCisiICAgICAgY2h1bmtzIGFyZSBuZXZlciByZW1vdmVkIGFzIHRoZXkgYWZmZWN0IGV4YWN0IGludGVycHJldGF0aW9uIG9mIHRoZSIsCisiICAgICAgaW1hZ2UgcGl4ZWwgdmFsdWVzLiAgVGhlIGZvbGxvd2luZyBrbm93biBjaHVua3MgYXJlIHRyZWF0ZWQgc3BlY2lhbGx5IiwKKyIgICAgICBieSB0aGUgYWJvdmUgb3B0aW9uczoiLAorIiAgICAgICAgZ0FNQSwgc1JHQiBbYWxsXTogVGhlc2Ugc3BlY2lmeSB0aGUgZ2FtbWEgZW5jb2RpbmcgdXNlZCBmb3IgdGhlIHBpeGVsIiwKKyIgICAgICAgICAgICB2YWx1ZXMuIiwKKyIgICAgICAgIGNIUk0sIGlDQ1AgW2NvbG9yXTogVGhlc2Ugc3BlY2lmeSBob3cgY29sb3JzIGFyZSBlbmNvZGVkLiAgaUNDUCBhbHNvIiwKKyIgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGV4YWN0IGVuY29kaW5nIG9mIGEgcGl4ZWwgdmFsdWU7IGhvd2V2ZXIsIGluIiwKKyIgICAgICAgICAgICBwcmFjdGljZSBtb3N0IHByb2dyYW1zIHdpbGwgaWdub3JlIGl0LiIsCisiICAgICAgICBiS0dEIFt0cmFuc2Zvcm1dOiBUaGlzIGlzIHVzZWQgYnkgbGlicG5nIHRyYW5zZm9ybXMuIgorIiAgICAtLW1heD08bnVtYmVyPjoiLAorIiAgICAgIFVzZSBJREFUIGNodW5rcyBzaXplZCA8bnVtYmVyPi4gIElmIG5vIG51bWJlciBpcyBnaXZlbiB0aGUgdGhlIElEQVQiLAorIiAgICAgIGNodW5rcyB3aWxsIGJlIHRoZSBtYXhpbXVtIHNpemUgcGVybWl0dGVkOyAyXjMxLTEgYnl0ZXMuICBJZiB0aGUgb3B0aW9uIiwKKyIgICAgICBpcyBvbWl0dGVkIHRoZSBvcmlnaW5hbCBjaHVuayBzaXplcyB3aWxsIG5vdCBiZSBjaGFuZ2VkLiAgV2hlbiB0aGUiLAorIiAgICAgIG9wdGlvbiBpcyBnaXZlbiAtLXN0cmlwPXVuc2FmZSBpcyBzZXQgYXV0b21hdGljYWxseS4gVGhpcyBtYXkgYmUiLAorIiAgICAgIGNhbmNlbGxlZCBpZiB5b3Uga25vdyB0aGF0IGFsbCB1bmtub3duIHVuc2FmZS10by1jb3B5IGNodW5rcyByZWFsbHkgYXJlIiwKKyIgICAgICBzYWZlIHRvIGNvcHkgYWNyb3NzIGFuIElEQVQgc2l6ZSBjaGFuZ2UuICBUaGlzIGlzIHRydWUgb2YgYWxsIGNodW5rcyIsCisiICAgICAgdGhhdCBoYXZlIGV2ZXIgYmVlbiBmb3JtYWxseSBwcm9wb3NlZCBhcyBQTkcgZXh0ZW5zaW9ucy4iLAorIiAgTUVTU0FHRVMiLAorIiAgICAgIEJ5IGRlZmF1bHQgdGhlIHByb2dyYW0gb25seSBvdXRwdXRzIHN1bW1hcmllcyBmb3IgZWFjaCBmaWxlLiIsCisiICAgIC0tcXVpZXQgKC1xKToiLAorIiAgICAgIERvIG5vdCBvdXRwdXQgdGhlIHN1bW1hcmllcyBleGNlcHQgZm9yIGZpbGVzIHRoYXQgY2Fubm90IGJlIHJlYWQuIFdpdGgiLAorIiAgICAgIHR3byAtLXF1aWV0cyB0aGVzZSBhcmUgbm90IG91dHB1dCBlaXRoZXIuIiwKKyIgICAgLS1lcnJvcnMgKC1lKToiLAorIiAgICAgIE91dHB1dCBlcnJvcnMgZnJvbSBsaWJwbmcgYW5kIHRoZSBwcm9ncmFtIChleGNlcHQgdG9vLWZhci1iYWNrKS4iLAorIiAgICAtLXdhcm5pbmdzICgtdyk6IiwKKyIgICAgICBPdXRwdXQgd2FybmluZ3MgZnJvbSBsaWJwbmcuIiwKKyIgIE9VVFBVVCIsCisiICAgICAgQnkgZGVmYXVsdCBub3RoaW5nIGlzIHdyaXR0ZW4uIiwKKyIgICAgLS1vdXQ9PGZpbGU+OiIsCisiICAgICAgV3JpdGUgdGhlIG9wdGltaXplZC9jb3JyZWN0ZWQgdmVyc2lvbiBvZiB0aGUgbmV4dCBQTkcgdG8gPGZpbGU+LiAgVGhpcyIsCisiICAgICAgb3ZlcnJpZGVzIHRoZSBmb2xsb3dpbmcgdHdvIG9wdGlvbnMiLAorIiAgICAtLXN1ZmZpeD08c3VmZml4PjoiLAorIiAgICAgIFNldCAtLW91dD08bmFtZT48c3VmZml4PiBmb3IgYWxsIGZvbGxvd2luZyBmaWxlcyB1bmxlc3Mgb3ZlcnJpZGRlbiBvbiIsCisiICAgICAgYSBwZXItZmlsZSBiYXNpcyBieSBleHBsaWNpdCAtLW91dC4iLAorIiAgICAtLXByZWZpeD08cHJlZml4PjoiLAorIiAgICAgIFNldCAtLW91dD08cHJlZml4PjxuYW1lPiBmb3IgYWxsIHRoZSBmb2xsb3dpbmcgZmlsZXMgdW5sZXNzIG92ZXJyaWRkZW4iLAorIiAgICAgIG9uIGEgcGVyLWZpbGUgYmFzaXMgYnkgZXhwbGljaXQgLS1vdXQuIiwKKyIgICAgICBUaGVzZSB0d28gb3B0aW9ucyBjYW4gYmUgdXNlZCB0b2dldGhlciB0byBwcm9kdWNlIGEgc3VmZml4IGFuZCBwcmVmaXguIiwKKyIgIElOVEVSTkFMIE9QVElPTlMiLAorI2lmIDAgLypOWUkqLworI2lmZGVmIFBOR19NQVhJTVVNX0lORkxBVEVfV0lORE9XCisiICAgIC0tdGVzdDoiLAorIiAgICAgIFRlc3QgdGhlIFBOR19NQVhJTVVNX0lORkxBVEVfV0lORE9XIG9wdGlvbi4gIFNldHRpbmcgdGhpcyBkaXNhYmxlcyIsCisiICAgICAgb3V0cHV0IGFzIHRoaXMgd291bGQgcHJvZHVjZSBhIGJyb2tlbiBmaWxlLiIsCisjZW5kaWYKKyNlbmRpZgorMCwKKyJFWElUIENPREVTIiwKKyIgICoqKiBTVUJKRUNUIFRPIENIQU5HRSAqKioiLAorIiAgVGhlIHByb2dyYW0gZXhpdCBjb2RlIGlzIHZhbHVlIGluIHRoZSByYW5nZSAwLi4xMjcgaG9sZGluZyBhIGJpdCBtYXNrIG9mIiwKKyIgIHRoZSBmb2xsb3dpbmcgY29kZXMuICBOb3RpY2UgdGhhdCB0aGUgcmVzdWx0cyBmb3IgZWFjaCBmaWxlIGFyZSBjb21iaW5lZCIsCisiICB0b2dldGhlciAtIGNoZWNrIG9uZSBmaWxlIGF0IGEgdGltZSB0byBnZXQgYSBtZWFuaW5nZnVsIGVycm9yIGNvZGUhIiwKKyIgICAgMHgwMTogVGhlIHpsaWIgdG9vLWZhci1iYWNrIGVycm9yIGV4aXN0ZWQgaW4gYXQgbGVhc3Qgb25lIGNodW5rLiIsCisiICAgIDB4MDI6IEF0IGxlYXN0IG9uZSBjaHVuayBoYWQgYSBDUkMgZXJyb3IuIiwKKyIgICAgMHgwNDogQSBjaHVuayBsZW5ndGggd2FzIGluY29ycmVjdC4iLAorIiAgICAweDA4OiBUaGUgZmlsZSB3YXMgdHJ1bmNhdGVkLiIsCisiICBFcnJvcnMgbGVzcyB0aGFuIDE2IGFyZSBwb3RlbnRpYWxseSByZWNvdmVyYWJsZSwgZm9yIGEgc2luZ2xlIGZpbGUgaWYgdGhlIiwKKyIgIGV4aXQgY29kZSBpcyBsZXNzIHRoYW4gMTYgdGhlIGZpbGUgY291bGQgYmUgcmVhZCAod2l0aCBjb3JyZWN0aW9ucyBpZiBhIiwKKyIgIG5vbi16ZXJvIGNvZGUgaXMgcmV0dXJuZWQpLiIsCisiICAgIDB4MTA6IFRoZSBmaWxlIGNvdWxkIG5vdCBiZSByZWFkLCBldmVuIHdpdGggY29ycmVjdGlvbnMuIiwKKyIgICAgMHgyMDogVGhlIG91dHB1dCBmaWxlIGNvdWxkIG5vdCBiZSB3cml0dGVuLiIsCisiICAgIDB4NDA6IEFuIHVuZXhwZWN0ZWQsIHBvdGVudGlhbGx5IGludGVybmFsLCBlcnJvciBvY2N1cnJlZC4iLAorIiAgSWYgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYXJlIGluY29ycmVjdCB0aGUgcHJvZ3JhbSBleGl0cyB3aXRoIGV4aXQiLAorIiAgMjU1LiAgU29tZSBvbGRlciBvcGVyYXRpbmcgc3lzdGVtcyBvbmx5IHN1cHBvcnQgNy1iaXQgZXhpdCBjb2Rlcywgb24gdGhvc2UiLAorIiAgc3lzdGVtcyBpdCBpcyBzdWdnZXN0ZWQgdGhhdCB0aGlzIHByb2dyYW0gaXMgZmlyc3QgdGVzdGVkIGJ5IHN1cHBseWluZyIsCisiICBpbnZhbGlkIGFyZ3VtZW50cy4iLAorMCwKKyJERVNDUklQVElPTiIsCisiICAiIFBST0dSQU1fTkFNRSAiOiIsCisiICBjaGVja3MgZWFjaCBQTkcgZmlsZSBvbiB0aGUgY29tbWFuZCBsaW5lIGZvciBlcnJvcnMuICBCeSBkZWZhdWx0IGVycm9ycyBhcmUiLAorIiAgbm90IG91dHB1dCBhbmQgdGhlIHByb2dyYW0ganVzdCByZXR1cm5zIGFuIGV4aXQgY29kZSBhbmQgcHJpbnRzIGEgc3VtbWFyeS4iLAorIiAgV2l0aCB0aGUgLS1xdWlldCAoLXEpIG9wdGlvbiB0aGUgc3VtbWFyaWVzIGFyZSBzdXBwcmVzc2VkIHRvbyBhbmQgdGhlIiwKKyIgIHByb2dyYW0gb25seSBvdXRwdXRzIHVuZXhwZWN0ZWQgZXJyb3JzIChpbnRlcm5hbCBlcnJvcnMgYW5kIGZpbGUgb3BlbiIsCisiICBlcnJvcnMpLiIsCisiICBWYXJpb3VzIGtub3duIHByb2JsZW1zIGluIFBORyBmaWxlcyBhcmUgZml4ZWQgd2hpbGUgdGhlIGZpbGUgaXMgYmVpbmcgcmVhZCIsCisiICBUaGUgZXhpdCBjb2RlIHNheXMgd2hhdCBwcm9ibGVtcyB3ZXJlIGZpeGVkLiAgSW4gcGFydGljdWxhciB0aGUgemxpYiBlcnJvcjoiLAorMCwKKyIgICAgICAgIFwiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2tcIiIsCiswLAorIiAgY2F1c2VkIGJ5IGFuIGluY29ycmVjdCBvcHRpbWl6YXRpb24gb2YgYSB6bGliIHN0cmVhbSBpcyBmaXhlZCBpbiBhbnkiLAorIiAgY29tcHJlc3NlZCBjaHVuayBpbiB3aGljaCBpdCBpcyBlbmNvdW50ZXJlZC4gIEFuIGludGVncml0eSBwcm9ibGVtIG9mIHRoZSIsCisiICBQTkcgc3RyZWFtIGNhdXNlZCBieSBhIGJ1ZyBpbiBsaWJwbmcgd2hpY2ggd3JvdGUgYW4gaW5jb3JyZWN0IGNodW5rIGxlbmd0aCIsCisiICBpcyBhbHNvIGZpeGVkLiAgQ2h1bmsgQ1JDIGVycm9ycyBhcmUgYXV0b21hdGljYWxseSBmaXhlZCB1cC4iLAorMCwKKyIgIFNldHRpbmcgb25lIG9mIHRoZSBcIk9VVFBVVFwiIG9wdGlvbnMgY2F1c2VzIHRoZSBwb3NzaWJseSBtb2RpZmllZCBmaWxlIHRvIiwKKyIgIGJlIHdyaXR0ZW4gdG8gYSBuZXcgZmlsZS4iLAorMCwKKyIgIE5vdGljZSB0aGF0IHNvbWUgUE5HIGZpbGVzIHdpdGggdGhlIHpsaWIgb3B0aW1pemF0aW9uIHByb2JsZW0gY2FuIHN0aWxsIGJlIiwKKyIgIHJlYWQgYnkgbGlicG5nIHVuZGVyIHNvbWUgY2lyY3Vtc3RhbmNlcy4gIFRoaXMgcHJvZ3JhbSB3aWxsIHN0aWxsIGRldGVjdCIsCisiICBhbmQsIGlmIHJlcXVlc3RlZCwgY29ycmVjdCB0aGUgZXJyb3IuIiwKKzAsCisiICBUaGUgcHJvZ3JhbSB3aWxsIHJlbGlhYmx5IHByb2Nlc3MgYWxsIGZpbGVzIG9uIHRoZSBjb21tYW5kIGxpbmUgdW5sZXNzIiwKKyIgIGVpdGhlciBhbiBpbnZhbGlkIGFyZ3VtZW50IGNhdXNlcyB0aGUgdXNhZ2UgbWVzc2FnZSAodGhpcyBtZXNzYWdlKSB0byBiZSIsCisiICBwcm9kdWNlZCBvciB0aGUgcHJvZ3JhbSBjcmFzaGVzLiIsCiswLAorIiAgVGhlIHN1bW1hcnkgbGluZXMgZGVzY3JpYmUgaXNzdWVzIGVuY291bnRlcmVkIHdpdGggdGhlIHpsaWIgY29tcHJlc3NlZCIsCisiICBzdHJlYW0gb2YgYSBjaHVuay4gIFRoZXkgaGF2ZSB0aGUgZm9sbG93aW5nIGZvcm1hdCwgd2hpY2ggaXMgU1VCSkVDVCBUTyIsCisiICBDSEFOR0UgaW4gdGhlIGZ1dHVyZToiLAorMCwKKyIgICAgIGNodW5rIHJlYXNvbiBjb21wLWxldmVsIHAxIHAyIHAzIHA0IGZpbGUiLAorMCwKKyIgIHAxIHRocm91Z2ggcDQgdmFyeSBhY2NvcmRpbmcgdG8gdGhlICdyZWFzb24nLiAgVGhlcmUgYXJlIGFsd2F5cyA4IHNwYWNlIiwKKyIgIHNlcGFyYXRlZCBmaWVsZHMuICBSZWFzb25zIHNwZWNpZmljIGZvcm1hdHMgYXJlOiIsCiswLAorIiAgICAgY2h1bmsgRVJSIHN0YXR1cyBjb2RlIHJlYWQtZXJybm8gd3JpdGUtZXJybm8gbWVzc2FnZSBmaWxlIiwKKyIgICAgIGNodW5rIFNLUCBjb21wLWxldmVsIGZpbGUtYml0cyB6bGliLXJjIGNvbXByZXNzZWQgbWVzc2FnZSBmaWxlIiwKKyIgICAgIGNodW5rID8/PyBjb21wLWxldmVsIGZpbGUtYml0cyBvay1iaXRzIGNvbXByZXNzZWQgdW5jb21wcmVzcyBmaWxlIiwKKzAsCisiICBUaGUgdmFyaW91cyBmaWVsZHMgYXJlIiwKKzAsCisiJDEgY2h1bms6ICAgICAgVGhlIGNodW5rIHR5cGUgb2YgYSBjaHVuayBpbiB0aGUgZmlsZSBvciAnSEVBRCcgaWYgYSBwcm9ibGVtIiwKKyIgICAgICAgICAgICAgICBpcyByZXBvcnRlZCBieSBsaWJwbmcgYXQgdGhlIHN0YXJ0IG9mIHRoZSBJREFUIHN0cmVhbS4iLAorIiQyIHJlYXNvbjogICAgIE9uZSBvZjoiLAorIiAgICAgICAgICBDSEs6IEEgemxpYiBoZWFkZXIgY2hlY2tzdW0gd2FzIGRldGVjdGVkIGFuZCBmaXhlZC4iLAorIiAgICAgICAgICBURkI6IFRoZSB6bGliIHRvbyBmYXIgYmFjayBlcnJvciB3YXMgZGV0ZWN0ZWQgYW5kIGZpeGVkLiIsCisiICAgICAgICAgIE9LIDogTm8gZXJyb3JzIHdlcmUgZGV0ZWN0ZWQgaW4gdGhlIHpsaWIgc3RyZWFtIGFuZCBvcHRpbWl6YXRpb24iLAorIiAgICAgICAgICAgICAgIHdhcyBub3QgcmVxdWVzdGVkLCBvciB3YXMgbm90IHBvc3NpYmxlLiIsCisiICAgICAgICAgIE9QVDogVGhlIHpsaWIgc3RyZWFtIHdpbmRvdyBiaXRzIHZhbHVlIGNvdWxkIGJlIGltcHJvdmVkIChhbmQgd2FzKS4iLAorIiAgICAgICAgICBTS1A6IFRoZSBjaHVuayB3YXMgc2tpcHBlZCBiZWNhdXNlIG9mIGEgemxpYiBpc3N1ZSAoemxpYi1yYykgd2l0aCIsCisiICAgICAgICAgICAgICAgZXhwbGFuYXRpb24gJ21lc3NhZ2UnIiwKKyIgICAgICAgICAgRVJSOiBUaGUgcmVhZCBvZiB0aGUgZmlsZSB3YXMgYWJvcnRlZC4gIFRoZSBwYXJhbWV0ZXJzIGV4cGxhaW4gd2h5LiIsCisiJDMgc3RhdHVzOiAgICAgRm9yICdFUlInIHRoZSBhY2N1bXVsYXRlZCBzdGF0dXMgY29kZSBmcm9tICdFWElUIENPREVTJyBhYm92ZS4iLAorIiAgICAgICAgICAgICAgIFRoaXMgaXMgcHJpbnRlZCBhcyBhIDIgZGlnaXQgaGV4YWRlY2ltYWwgdmFsdWUiLAorIiAgIGNvbXAtbGV2ZWw6IFRoZSByZWNvcmRlZCBjb21wcmVzc2lvbiBsZXZlbCAoRkxFVkVMKSBvZiBhIHpsaWIgc3RyZWFtIiwKKyIgICAgICAgICAgICAgICBleHByZXNzZWQgYXMgYSBzdHJpbmcge3N1cGZhc3Qsc3RkZmFzdCxkZWZhdWx0LG1heGltdW19IiwKKyIkNCBjb2RlOiAgICAgICBUaGUgZmlsZSBleGl0IGNvZGU7IHdoZXJlIHN0b3Agd2FzIGNhbGxlZCwgYXMgYSBmYWlybHkgdGVyc2UiLAorIiAgICAgICAgICAgICAgIHN0cmluZyB7d2FybmluZyxsaWJwbmcsemxpYixpbnZhbGlkLHJlYWQsd3JpdGUsdW5leHBlY3RlZH0uIiwKKyIgICBmaWxlLWJpdHM6ICBUaGUgemxpYiB3aW5kb3cgYml0cyByZWNvcmRlZCBpbiB0aGUgZmlsZS4iLAorIiQ1IHJlYWQtZXJybm86IEEgc3lzdGVtIGVycm5vIHZhbHVlIGZyb20gYSByZWFkIHRyYW5zbGF0ZWQgYnkgc3RyZXJyb3IoMykuIiwKKyIgICB6bGliLXJjOiAgICBBIHpsaWIgcmV0dXJuIGNvZGUgYXMgYSBzdHJpbmcgKHNlZSB6bGliLmgpLiIsCisiICAgb2stYml0czogICAgVGhlIHNtYWxsZXN0IHpsaWIgd2luZG93IGJpdHMgdmFsdWUgdGhhdCB3b3Jrcy4iLAorIiQ2IHdyaXRlLWVycm5vOkEgc3lzdGVtIGVycm5vIHZhbHVlIGZyb20gYSB3cml0ZSB0cmFuc2xhdGVkIGJ5IHN0cmVycm9yKDMpLiIsCisiICAgY29tcHJlc3NlZDogVGhlIGNvdW50IG9mIGNvbXByZXNzZWQgYnl0ZXMgaW4gdGhlIHpsaWIgc3RyZWFtLCB3aGVuIHRoZSIsCisiICAgICAgICAgICAgICAgcmVhc29uIGlzICdTS1AnOyB0aGlzIGlzIGEgY291bnQgb2YgdGhlIGJ5dGVzIHJlYWQgZnJvbSB0aGUiLAorIiAgICAgICAgICAgICAgIHN0cmVhbSB3aGVuIHRoZSBmYXRhbCBlcnJvciB3YXMgZW5jb3VudGVyZWQuIiwKKyIkNyBtZXNzYWdlOiAgICBBbiBlcnJvciBtZXNzYWdlIChzcGFjZXMgcmVwbGFjZWQgYnkgXywgYXMgaW4gYWxsIHBhcmFtZXRlcnMpLCIsCisiICAgdW5jb21wcmVzczogVGhlIGNvdW50IG9mIGJ5dGVzIGZyb20gdW5jb21wcmVzc2luZyB0aGUgemxpYiBzdHJlYW07IHRoaXMiLAorIiAgICAgICAgICAgICAgIG1heSBub3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgaW1hZ2UuIiwKKyIkOCBmaWxlOiAgICAgICBUaGUgbmFtZSBvZiB0aGUgZmlsZSAodGhpcyBtYXkgY29udGFpbiBzcGFjZXMpLiIsCit9OworCisgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyB7W29wdGlvbnNdIHBuZy1maWxlfVxuIiwgcHJvZyk7CisKKyAgIGZvciAoaT0wOyBpIDwgKHNpemVvZiB1c2FnZV9zdHJpbmcpLyhzaXplb2YgdXNhZ2Vfc3RyaW5nWzBdKTsgKytpKQorICAgeworICAgICAgaWYgKHVzYWdlX3N0cmluZ1tpXSAhPSAwKQorICAgICAgICAgZnB1dHModXNhZ2Vfc3RyaW5nW2ldLCBzdGRlcnIpOworCisgICAgICBmcHV0YygnXG4nLCBzdGRlcnIpOworICAgfQorCisgICBleGl0KDI1NSk7Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCit7CisgICBjaGFyIHRlbXBfbmFtZVtGSUxFTkFNRV9NQVgrMV07CisgICBjb25zdCBjaGFyICogIHByb2cgPSAqYXJndjsKKyAgIGNvbnN0IGNoYXIgKiAgb3V0ZmlsZSA9IE5VTEw7CisgICBjb25zdCBjaGFyICogIHN1ZmZpeCA9IE5VTEw7CisgICBjb25zdCBjaGFyICogIHByZWZpeCA9IE5VTEw7CisgICBpbnQgICAgICAgICAgIGRvbmUgPSAwOyAvKiBpZiBhdCBsZWFzdCBvbmUgZmlsZSBpcyBwcm9jZXNzZWQgKi8KKyAgIHN0cnVjdCBnbG9iYWwgZ2xvYmFsOworCisgICBnbG9iYWxfaW5pdCgmZ2xvYmFsKTsKKworICAgd2hpbGUgKC0tYXJnYyA+IDApCisgICB7CisgICAgICArK2FyZ3Y7CisKKyAgICAgIGlmIChzdHJjbXAoKmFyZ3YsICItLWRlYnVnIikgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgIC8qIFRvIGhlbHAgZGVidWdnaW5nIHByb2JsZW1zOiAqLworICAgICAgICAgZ2xvYmFsLmVycm9ycyA9IGdsb2JhbC53YXJuaW5ncyA9IDE7CisgICAgICAgICBnbG9iYWwucXVpZXQgPSAwOworICAgICAgICAgZ2xvYmFsLnZlcmJvc2UgPSA3OworICAgICAgfQorCisgICAgICBlbHNlIGlmIChzdHJuY21wKCphcmd2LCAiLS1tYXg9IiwgNikgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgIGdsb2JhbC5pZGF0X21heCA9IChwbmdfdWludF8zMilhdG9sKDYrKmFyZ3YpOworCisgICAgICAgICBpZiAoZ2xvYmFsLnNraXAgPCBTS0lQX1VOU0FGRSkKKyAgICAgICAgICAgIGdsb2JhbC5za2lwID0gU0tJUF9VTlNBRkU7CisgICAgICB9CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tbWF4IikgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgIGdsb2JhbC5pZGF0X21heCA9IDB4N2ZmZmZmZmY7CisKKyAgICAgICAgIGlmIChnbG9iYWwuc2tpcCA8IFNLSVBfVU5TQUZFKQorICAgICAgICAgICAgZ2xvYmFsLnNraXAgPSBTS0lQX1VOU0FGRTsKKyAgICAgIH0KKworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1vcHRpbWl6ZSIpID09IDAgfHwgc3RyY21wKCphcmd2LCAiLW8iKSA9PSAwKQorICAgICAgICAgZ2xvYmFsLm9wdGltaXplX3psaWIgPSAxOworCisgICAgICBlbHNlIGlmIChzdHJuY21wKCphcmd2LCAiLS1vdXQ9IiwgNikgPT0gMCkKKyAgICAgICAgIG91dGZpbGUgPSA2Kyphcmd2OworCisgICAgICBlbHNlIGlmIChzdHJuY21wKCphcmd2LCAiLS1zdWZmaXg9IiwgOSkgPT0gMCkKKyAgICAgICAgIHN1ZmZpeCA9IDkrKmFyZ3Y7CisKKyAgICAgIGVsc2UgaWYgKHN0cm5jbXAoKmFyZ3YsICItLXByZWZpeD0iLCA5KSA9PSAwKQorICAgICAgICAgcHJlZml4ID0gOSsqYXJndjsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1zdHJpcD1ub25lIikgPT0gMCkKKyAgICAgICAgIGdsb2JhbC5za2lwID0gU0tJUF9OT05FOworCisgICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItLXN0cmlwPWNyYyIpID09IDApCisgICAgICAgICBnbG9iYWwuc2tpcCA9IFNLSVBfQkFEX0NSQzsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1zdHJpcD11bnNhZmUiKSA9PSAwKQorICAgICAgICAgZ2xvYmFsLnNraXAgPSBTS0lQX1VOU0FGRTsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1zdHJpcD11bnVzZWQiKSA9PSAwKQorICAgICAgICAgZ2xvYmFsLnNraXAgPSBTS0lQX1VOVVNFRDsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1zdHJpcD10cmFuc2Zvcm0iKSA9PSAwKQorICAgICAgICAgZ2xvYmFsLnNraXAgPSBTS0lQX1RSQU5TRk9STTsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1zdHJpcD1jb2xvciIpID09IDApCisgICAgICAgICBnbG9iYWwuc2tpcCA9IFNLSVBfQ09MT1I7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tc3RyaXA9YWxsIikgPT0gMCkKKyAgICAgICAgIGdsb2JhbC5za2lwID0gU0tJUF9BTEw7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tZXJyb3JzIikgPT0gMCB8fCBzdHJjbXAoKmFyZ3YsICItZSIpID09IDApCisgICAgICAgICBnbG9iYWwuZXJyb3JzID0gMTsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS13YXJuaW5ncyIpID09IDAgfHwgc3RyY21wKCphcmd2LCAiLXciKSA9PSAwKQorICAgICAgICAgZ2xvYmFsLndhcm5pbmdzID0gMTsKKworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1xdWlldCIpID09IDAgfHwgc3RyY21wKCphcmd2LCAiLXEiKSA9PSAwKQorICAgICAgeworICAgICAgICAgaWYgKGdsb2JhbC5xdWlldCkKKyAgICAgICAgICAgIGdsb2JhbC5xdWlldCA9IDI7CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdsb2JhbC5xdWlldCA9IDE7CisgICAgICB9CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tdmVyYm9zZSIpID09IDAgfHwgc3RyY21wKCphcmd2LCAiLXYiKSA9PSAwKQorICAgICAgICAgKytnbG9iYWwudmVyYm9zZTsKKworI2lmIDAKKyAgICAgIC8qIE5ZSSAqLworIyAgICAgaWZkZWYgUE5HX01BWElNVU1fSU5GTEFURV9XSU5ET1cKKyAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tdGVzdCIpID09IDApCisgICAgICAgICAgICArK3NldF9vcHRpb247CisjICAgICBlbmRpZgorI2VuZGlmCisKKyAgICAgIGVsc2UgaWYgKCgqYXJndilbMF0gPT0gJy0nKQorICAgICAgICAgdXNhZ2UocHJvZyk7CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHNpemVfdCBvdXRsZW4gPSBzdHJsZW4oKmFyZ3YpOworCisgICAgICAgICBpZiAob3V0ZmlsZSA9PSBOVUxMKSAvKiBlbHNlIHRoaXMgdGFrZXMgcHJlY2VkZW5jZSAqLworICAgICAgICAgeworICAgICAgICAgICAgLyogQ29uc2lkZXIgdGhlIHByZWZpeC9zdWZmaXggb3B0aW9ucyAqLworICAgICAgICAgICAgaWYgKHByZWZpeCAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc2l6ZV90IHByZWZpeGxlbiA9IHN0cmxlbihwcmVmaXgpOworCisgICAgICAgICAgICAgICBpZiAocHJlZml4bGVuK291dGxlbiA+IEZJTEVOQU1FX01BWCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG91dHB1dCBmaWxlIG5hbWUgdG9vIGxvbmc6ICVzJXMlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHByb2csIHByZWZpeCwgKmFyZ3YsIHN1ZmZpeCA/IHN1ZmZpeCA6ICIiKTsKKyAgICAgICAgICAgICAgICAgIGdsb2JhbC5zdGF0dXNfY29kZSB8PSBXUklURV9FUlJPUjsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBtZW1jcHkodGVtcF9uYW1lLCBwcmVmaXgsIHByZWZpeGxlbik7CisgICAgICAgICAgICAgICBtZW1jcHkodGVtcF9uYW1lK3ByZWZpeGxlbiwgKmFyZ3YsIG91dGxlbik7CisgICAgICAgICAgICAgICBvdXRsZW4gKz0gcHJlZml4bGVuOworICAgICAgICAgICAgICAgb3V0ZmlsZSA9IHRlbXBfbmFtZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWxzZSBpZiAoc3VmZml4ICE9IE5VTEwpCisgICAgICAgICAgICAgICBtZW1jcHkodGVtcF9uYW1lLCAqYXJndiwgb3V0bGVuKTsKKworICAgICAgICAgICAgdGVtcF9uYW1lW291dGxlbl0gPSAwOworCisgICAgICAgICAgICBpZiAoc3VmZml4ICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzaXplX3Qgc3VmZml4bGVuID0gc3RybGVuKHN1ZmZpeCk7CisKKyAgICAgICAgICAgICAgIGlmIChvdXRsZW4rc3VmZml4bGVuID4gRklMRU5BTUVfTUFYKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogb3V0cHV0IGZpbGUgbmFtZSB0b28gbG9uZzogJXMlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHByb2csICphcmd2LCBzdWZmaXgpOworICAgICAgICAgICAgICAgICAgZ2xvYmFsLnN0YXR1c19jb2RlIHw9IFdSSVRFX0VSUk9SOworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wX25hbWUrb3V0bGVuLCBzdWZmaXgsIHN1ZmZpeGxlbik7CisgICAgICAgICAgICAgICBvdXRsZW4gKz0gc3VmZml4bGVuOworICAgICAgICAgICAgICAgdGVtcF9uYW1lW291dGxlbl0gPSAwOworICAgICAgICAgICAgICAgb3V0ZmlsZSA9IHRlbXBfbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICAgKHZvaWQpb25lX2ZpbGUoJmdsb2JhbCwgKmFyZ3YsIG91dGZpbGUpOworICAgICAgICAgKytkb25lOworICAgICAgICAgb3V0ZmlsZSA9IE5VTEw7CisgICAgICB9CisgICB9CisKKyAgIGlmICghZG9uZSkKKyAgICAgIHVzYWdlKHByb2cpOworCisgICByZXR1cm4gZ2xvYmFsX2VuZCgmZ2xvYmFsKTsKK30KKworI2Vsc2UgLyogWkxJQl9WRVJOVU0gPCAweDEyNDAgKi8KK2ludAorbWFpbih2b2lkKQoreworICAgZnByaW50ZihzdGRlcnIsCisgICAgICAicG5nZml4IG5lZWRzIGxpYnBuZyB3aXRoIGEgemxpYiA+PTEuMi40IChub3QgMHgleClcbiIsCisgICAgICBaTElCX1ZFUk5VTSk7CisgICByZXR1cm4gNzc7Cit9CisjZW5kaWYgLyogWkxJQl9WRVJOVU0gKi8KKworI2Vsc2UgLyogTm8gcmVhZCBzdXBwb3J0ICovCisKK2ludAorbWFpbih2b2lkKQoreworICAgZnByaW50ZihzdGRlcnIsICJwbmdmaXggZG9lcyBub3Qgd29yayB3aXRob3V0IHJlYWQgZGVpbnRlcmxhY2Ugc3VwcG9ydFxuIik7CisgICByZXR1cm4gNzc7Cit9CisjZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICYmIFBOR19FQVNZX0FDQ0VTU19TVVBQT1JURUQgKi8KKyNlbHNlIC8qIE5vIHNldGptcCBzdXBwb3J0ICovCitpbnQKK21haW4odm9pZCkKK3sKKyAgIGZwcmludGYoc3RkZXJyLCAicG5nZml4IGRvZXMgbm90IHdvcmsgd2l0aG91dCBzZXRqbXAgc3VwcG9ydFxuIik7CisgICByZXR1cm4gNzc7Cit9CisjZW5kaWYgLyogUE5HX1NFVEpNUF9TVVBQT1JURUQgKi8KKwpkaWZmIC0tZ2l0IGEvbGlicG5nL2NvbnRyaWIvdG9vbHMvc1JHQi5oIGIvbGlicG5nL2NvbnRyaWIvdG9vbHMvc1JHQi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYzhmN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi90b29scy9zUkdCLmgKQEAgLTAsMCArMSw0OCBAQAorLyotCisgKiBzUkdCLmgKKyAqCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4wIFtGZWJydWFyeSAxNCwgMjAxM10KKyAqCisgKiBDT1BZUklHSFQ6IFdyaXR0ZW4gYnkgSm9obiBDdW5uaW5naGFtIEJvd2xlciwgMjAxMy4KKyAqIFRvIHRoZSBleHRlbnQgcG9zc2libGUgdW5kZXIgbGF3LCB0aGUgYXV0aG9yIGhhcyB3YWl2ZWQgYWxsIGNvcHlyaWdodCBhbmQKKyAqIHJlbGF0ZWQgb3IgbmVpZ2hib3JpbmcgcmlnaHRzIHRvIHRoaXMgd29yay4gIFRoaXMgd29yayBpcyBwdWJsaXNoZWQgZnJvbToKKyAqIFVuaXRlZCBTdGF0ZXMuCisgKgorICogVXRpbGl0eSBmaWxlOyBub3QgYWN0dWFsbHkgYSBoZWFkZXIsIHRoaXMgY29udGFpbnMgZGVmaW5pdGlvbnMgb2Ygc1JHQgorICogY2FsY3VsYXRpb24gZnVuY3Rpb25zIGZvciBpbmNsdXNpb24gaW4gdGhvc2UgdGVzdCBwcm9ncmFtcyB0aGF0IG5lZWQgdGhlbS4KKyAqCisgKiBBbGwgcm91dGluZXMgdGFrZSBhbmQgcmV0dXJuIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUgaW4gdGhlIHJhbmdlCisgKiAwIHRvIDEuMCwgZG9pbmcgYSBjYWxjdWxhdGlvbiBhY2NvcmRpbmcgdG8gdGhlIHNSR0Igc3BlY2lmaWNhdGlvbgorICogKGluIGZhY3QgdGhlIHNvdXJjZSBvZiB0aGUgbnVtYmVycyBpcyB0aGUgd2lraXBlZGlhIGFydGljbGUgYXQKKyAqIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU1JHQikuCisgKi8KK3N0YXRpYyBkb3VibGUKK3NSR0JfZnJvbV9saW5lYXIoZG91YmxlIGwpCit7CisgICBpZiAobCA8PSAwLjAwMzEzMDgpCisgICAgICBsICo9IDEyLjkyOworCisgICBlbHNlCisgICAgICBsID0gMS4wNTUgKiBwb3cobCwgMS8yLjQpIC0gMC4wNTU7CisKKyAgIHJldHVybiBsOworfQorCitzdGF0aWMgZG91YmxlCitsaW5lYXJfZnJvbV9zUkdCKGRvdWJsZSBzKQoreworICAgaWYgKHMgPD0gMC4wNDA0NSkKKyAgICAgIHJldHVybiBzIC8gMTIuOTI7CisKKyAgIGVsc2UKKyAgICAgIHJldHVybiBwb3coKHMrMC4wNTUpLzEuMDU1LCAyLjQpOworfQorCitzdGF0aWMgZG91YmxlCitZZnJvbVJHQihkb3VibGUgciwgZG91YmxlIGcsIGRvdWJsZSBiKQoreworICAgLyogVXNlIHRoZSBzUkdCIChyb3VuZGVkKSBjb2VmZmljaWVudHMgZm9yIFJsaW5lYXIsIEdsaW5lYXIsIEJsaW5lYXIgdG8gZ2V0CisgICAgKiB0aGUgQ0lFIFkgdmFsdWUgKGFsc28gbGluZWFyKS4KKyAgICAqLworICAgcmV0dXJuIDAuMjEyNiAqIHIgKyAwLjcxNTIgKiBnICsgMC4wNzIyICogYjsKK30KZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvUG5nRmlsZS5jIGIvbGlicG5nL2NvbnRyaWIvdmlzdXBuZy9QbmdGaWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNkZTE4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvUG5nRmlsZS5jCkBAIC0wLDAgKzEsNDUxIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBQTkdGSUxFLkMgLS0gSW1hZ2UgRmlsZSBGdW5jdGlvbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIENvcHlyaWdodCAyMDAwLCBXaWxsZW0gdmFuIFNjaGFpay4KKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKyAqLworCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPGNvbW1kbGcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHpsaWIuaD4KKworI2luY2x1ZGUgInBuZy5oIgorI2luY2x1ZGUgInBuZ2ZpbGUuaCIKKyNpbmNsdWRlICJjZXhjZXB0LmgiCisKK2RlZmluZV9leGNlcHRpb25fdHlwZShjb25zdCBjaGFyICopOworZXh0ZXJuIHN0cnVjdCBleGNlcHRpb25fY29udGV4dCB0aGVfZXhjZXB0aW9uX2NvbnRleHRbMV07CitzdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQgdGhlX2V4Y2VwdGlvbl9jb250ZXh0WzFdOworcG5nX2NvbnN0X2NoYXJwIG1zZzsKKworc3RhdGljIE9QRU5GSUxFTkFNRSBvZm47CisKK3N0YXRpYyBwbmdfc3RydWN0cCBwbmdfcHRyID0gTlVMTDsKK3N0YXRpYyBwbmdfaW5mb3AgaW5mb19wdHIgPSBOVUxMOworCisKKy8qIGNleGNlcHQgaW50ZXJmYWNlICovCisKK3N0YXRpYyB2b2lkCitwbmdfY2V4Y2VwdF9lcnJvcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgbXNnKQoreworICAgaWYocG5nX3B0cikKKyAgICAgOworI2lmZGVmIFBOR19DT05TT0xFX0lPX1NVUFBPUlRFRAorICAgZnByaW50ZihzdGRlcnIsICJsaWJwbmcgZXJyb3I6ICVzXG4iLCBtc2cpOworI2VuZGlmCisgICB7CisgICAgICBUaHJvdyBtc2c7CisgICB9Cit9CisKKy8qIFdpbmRvd3Mgb3Blbi1maWxlIGZ1bmN0aW9ucyAqLworCit2b2lkIFBuZ0ZpbGVJbml0aWFsaXplIChIV05EIGh3bmQpCit7CisgICAgc3RhdGljIFRDSEFSIHN6RmlsdGVyW10gPSBURVhUICgiUE5HIEZpbGVzICgqLlBORylcMCoucG5nXDAiKQorICAgICAgICBURVhUICgiQWxsIEZpbGVzICgqLiopXDAqLipcMFwwIik7CisKKyAgICBvZm4ubFN0cnVjdFNpemUgICAgICAgPSBzaXplb2YgKE9QRU5GSUxFTkFNRSk7CisgICAgb2ZuLmh3bmRPd25lciAgICAgICAgID0gaHduZDsKKyAgICBvZm4uaEluc3RhbmNlICAgICAgICAgPSBOVUxMOworICAgIG9mbi5scHN0ckZpbHRlciAgICAgICA9IHN6RmlsdGVyOworICAgIG9mbi5scHN0ckN1c3RvbUZpbHRlciA9IE5VTEw7CisgICAgb2ZuLm5NYXhDdXN0RmlsdGVyICAgID0gMDsKKyAgICBvZm4ubkZpbHRlckluZGV4ICAgICAgPSAwOworICAgIG9mbi5scHN0ckZpbGUgICAgICAgICA9IE5VTEw7ICAgICAgICAgIC8qIFNldCBpbiBPcGVuIGFuZCBDbG9zZSBmdW5jdGlvbnMgKi8KKyAgICBvZm4ubk1heEZpbGUgICAgICAgICAgPSBNQVhfUEFUSDsKKyAgICBvZm4ubHBzdHJGaWxlVGl0bGUgICAgPSBOVUxMOyAgICAgICAgICAvKiBTZXQgaW4gT3BlbiBhbmQgQ2xvc2UgZnVuY3Rpb25zICovCisgICAgb2ZuLm5NYXhGaWxlVGl0bGUgICAgID0gTUFYX1BBVEg7CisgICAgb2ZuLmxwc3RySW5pdGlhbERpciAgID0gTlVMTDsKKyAgICBvZm4ubHBzdHJUaXRsZSAgICAgICAgPSBOVUxMOworICAgIG9mbi5GbGFncyAgICAgICAgICAgICA9IDA7ICAgICAgICAgICAgIC8qIFNldCBpbiBPcGVuIGFuZCBDbG9zZSBmdW5jdGlvbnMgKi8KKyAgICBvZm4ubkZpbGVPZmZzZXQgICAgICAgPSAwOworICAgIG9mbi5uRmlsZUV4dGVuc2lvbiAgICA9IDA7CisgICAgb2ZuLmxwc3RyRGVmRXh0ICAgICAgID0gVEVYVCAoInBuZyIpOworICAgIG9mbi5sQ3VzdERhdGEgICAgICAgICA9IDA7CisgICAgb2ZuLmxwZm5Ib29rICAgICAgICAgID0gTlVMTDsKKyAgICBvZm4ubHBUZW1wbGF0ZU5hbWUgICAgPSBOVUxMOworfQorCitCT09MIFBuZ0ZpbGVPcGVuRGxnIChIV05EIGh3bmQsIFBUU1RSIHBzdHJGaWxlTmFtZSwgUFRTVFIgcHN0clRpdGxlTmFtZSkKK3sKKyAgICBvZm4uaHduZE93bmVyICAgICAgICAgPSBod25kOworICAgIG9mbi5scHN0ckZpbGUgICAgICAgICA9IHBzdHJGaWxlTmFtZTsKKyAgICBvZm4ubHBzdHJGaWxlVGl0bGUgICAgPSBwc3RyVGl0bGVOYW1lOworICAgIG9mbi5GbGFncyAgICAgICAgICAgICA9IE9GTl9ISURFUkVBRE9OTFk7CisKKyAgICByZXR1cm4gR2V0T3BlbkZpbGVOYW1lICgmb2ZuKTsKK30KKworQk9PTCBQbmdGaWxlU2F2ZURsZyAoSFdORCBod25kLCBQVFNUUiBwc3RyRmlsZU5hbWUsIFBUU1RSIHBzdHJUaXRsZU5hbWUpCit7CisgICAgb2ZuLmh3bmRPd25lciAgICAgICAgID0gaHduZDsKKyAgICBvZm4ubHBzdHJGaWxlICAgICAgICAgPSBwc3RyRmlsZU5hbWU7CisgICAgb2ZuLmxwc3RyRmlsZVRpdGxlICAgID0gcHN0clRpdGxlTmFtZTsKKyAgICBvZm4uRmxhZ3MgICAgICAgICAgICAgPSBPRk5fSElERVJFQURPTkxZIHwgT0ZOX09WRVJXUklURVBST01QVDsKKworICAgIHJldHVybiBHZXRTYXZlRmlsZU5hbWUgKCZvZm4pOworfQorCisvKiBQTkcgaW1hZ2UgaGFuZGxlciBmdW5jdGlvbnMgKi8KKworQk9PTCBQbmdMb2FkSW1hZ2UgKFBUU1RSIHBzdHJGaWxlTmFtZSwgcG5nX2J5dGUgKipwcGJJbWFnZURhdGEsCisgICAgICAgICAgICAgICAgICAgaW50ICpwaVdpZHRoLCBpbnQgKnBpSGVpZ2h0LCBpbnQgKnBpQ2hhbm5lbHMsIHBuZ19jb2xvciAqcEJrZ0NvbG9yKQoreworICAgIHN0YXRpYyBGSUxFICAgICAgICAqcGZGaWxlOworICAgIHBuZ19ieXRlICAgICAgICAgICAgcGJTaWdbOF07CisgICAgaW50ICAgICAgICAgICAgICAgICBpQml0RGVwdGg7CisgICAgaW50ICAgICAgICAgICAgICAgICBpQ29sb3JUeXBlOworICAgIGRvdWJsZSAgICAgICAgICAgICAgZEdhbW1hOworICAgIHBuZ19jb2xvcl8xNiAgICAgICAqcEJhY2tncm91bmQ7CisgICAgcG5nX3VpbnRfMzIgICAgICAgICB1bENoYW5uZWxzOworICAgIHBuZ191aW50XzMyICAgICAgICAgdWxSb3dCeXRlczsKKyAgICBwbmdfYnl0ZSAgICAgICAgICAgKnBiSW1hZ2VEYXRhID0gKnBwYkltYWdlRGF0YTsKKyAgICBzdGF0aWMgcG5nX2J5dGUgICAqKnBwYlJvd1BvaW50ZXJzID0gTlVMTDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGk7CisKKyAgICAvKiBvcGVuIHRoZSBQTkcgaW5wdXQgZmlsZSAqLworCisgICAgaWYgKCFwc3RyRmlsZU5hbWUpCisgICAgeworICAgICAgICAqcHBiSW1hZ2VEYXRhID0gcGJJbWFnZURhdGEgPSBOVUxMOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKCEocGZGaWxlID0gZm9wZW4ocHN0ckZpbGVOYW1lLCAicmIiKSkpCisgICAgeworICAgICAgICAqcHBiSW1hZ2VEYXRhID0gcGJJbWFnZURhdGEgPSBOVUxMOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLyogZmlyc3QgY2hlY2sgdGhlIGVpZ2h0IGJ5dGUgUE5HIHNpZ25hdHVyZSAqLworCisgICAgZnJlYWQocGJTaWcsIDEsIDgsIHBmRmlsZSk7CisgICAgaWYgKHBuZ19zaWdfY21wKHBiU2lnLCAwLCA4KSkKKyAgICB7CisgICAgICAgICpwcGJJbWFnZURhdGEgPSBwYkltYWdlRGF0YSA9IE5VTEw7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvKiBjcmVhdGUgdGhlIHR3byBwbmcoLWluZm8pIHN0cnVjdHVyZXMgKi8KKworICAgIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NUUklORywgTlVMTCwKKyAgICAgIChwbmdfZXJyb3JfcHRyKXBuZ19jZXhjZXB0X2Vycm9yLCAocG5nX2Vycm9yX3B0cilOVUxMKTsKKyAgICBpZiAoIXBuZ19wdHIpCisgICAgeworICAgICAgICAqcHBiSW1hZ2VEYXRhID0gcGJJbWFnZURhdGEgPSBOVUxMOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOworICAgIGlmICghaW5mb19wdHIpCisgICAgeworICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgTlVMTCwgTlVMTCk7CisgICAgICAgICpwcGJJbWFnZURhdGEgPSBwYkltYWdlRGF0YSA9IE5VTEw7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBUcnkKKyAgICB7CisKKyAgICAgICAgLyogaW5pdGlhbGl6ZSB0aGUgcG5nIHN0cnVjdHVyZSAqLworCisjaWZkZWYgUE5HX1NURElPX1NVUFBPUlRFRAorICAgICAgICBwbmdfaW5pdF9pbyhwbmdfcHRyLCBwZkZpbGUpOworI2Vsc2UKKyAgICAgICAgcG5nX3NldF9yZWFkX2ZuKHBuZ19wdHIsIChwbmdfdm9pZHApcGZGaWxlLCBwbmdfcmVhZF9kYXRhKTsKKyNlbmRpZgorCisgICAgICAgIHBuZ19zZXRfc2lnX2J5dGVzKHBuZ19wdHIsIDgpOworCisgICAgICAgIC8qIHJlYWQgYWxsIFBORyBpbmZvIHVwIHRvIGltYWdlIGRhdGEgKi8KKworICAgICAgICBwbmdfcmVhZF9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKKworICAgICAgICAvKiBnZXQgd2lkdGgsIGhlaWdodCwgYml0LWRlcHRoIGFuZCBjb2xvci10eXBlICovCisKKyAgICAgICAgcG5nX2dldF9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCBwaVdpZHRoLCBwaUhlaWdodCwgJmlCaXREZXB0aCwKKyAgICAgICAgICAgICZpQ29sb3JUeXBlLCBOVUxMLCBOVUxMLCBOVUxMKTsKKworICAgICAgICAvKiBleHBhbmQgaW1hZ2VzIG9mIGFsbCBjb2xvci10eXBlIGFuZCBiaXQtZGVwdGggdG8gM3g4LWJpdCBSR0IgKi8KKyAgICAgICAgLyogbGV0IHRoZSBsaWJyYXJ5IHByb2Nlc3MgYWxwaGEsIHRyYW5zcGFyZW5jeSwgYmFja2dyb3VuZCwgZXRjLiAqLworCisjaWZkZWYgUE5HX1JFQURfMTZfVE9fOF9TVVBQT1JURUQKKyAgICBpZiAoaUJpdERlcHRoID09IDE2KQorIyAgaWZkZWYgUE5HX1JFQURfU0NBTEVfMTZfVE9fOF9TVVBQT1JURUQKKyAgICAgICAgcG5nX3NldF9zY2FsZV8xNihwbmdfcHRyKTsKKyMgIGVsc2UKKyAgICAgICAgcG5nX3NldF9zdHJpcF8xNihwbmdfcHRyKTsKKyMgIGVuZGlmCisjZW5kaWYKKyAgICAgICAgaWYgKGlDb2xvclR5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgICAgICAgICAgIHBuZ19zZXRfZXhwYW5kKHBuZ19wdHIpOworICAgICAgICBpZiAoaUJpdERlcHRoIDwgOCkKKyAgICAgICAgICAgIHBuZ19zZXRfZXhwYW5kKHBuZ19wdHIpOworICAgICAgICBpZiAocG5nX2dldF92YWxpZChwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0lORk9fdFJOUykpCisgICAgICAgICAgICBwbmdfc2V0X2V4cGFuZChwbmdfcHRyKTsKKyAgICAgICAgaWYgKGlDb2xvclR5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSB8fAorICAgICAgICAgICAgaUNvbG9yVHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQorICAgICAgICAgICAgcG5nX3NldF9ncmF5X3RvX3JnYihwbmdfcHRyKTsKKworICAgICAgICAvKiBzZXQgdGhlIGJhY2tncm91bmQgY29sb3IgdG8gZHJhdyB0cmFuc3BhcmVudCBhbmQgYWxwaGEgaW1hZ2VzIG92ZXIgKi8KKyAgICAgICAgaWYgKHBuZ19nZXRfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgJnBCYWNrZ3JvdW5kKSkKKyAgICAgICAgeworICAgICAgICAgICAgcG5nX3NldF9iYWNrZ3JvdW5kKHBuZ19wdHIsIHBCYWNrZ3JvdW5kLCBQTkdfQkFDS0dST1VORF9HQU1NQV9GSUxFLCAxLCAxLjApOworICAgICAgICAgICAgcEJrZ0NvbG9yLT5yZWQgICA9IChieXRlKSBwQmFja2dyb3VuZC0+cmVkOworICAgICAgICAgICAgcEJrZ0NvbG9yLT5ncmVlbiA9IChieXRlKSBwQmFja2dyb3VuZC0+Z3JlZW47CisgICAgICAgICAgICBwQmtnQ29sb3ItPmJsdWUgID0gKGJ5dGUpIHBCYWNrZ3JvdW5kLT5ibHVlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEJrZ0NvbG9yID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGlmIHJlcXVpcmVkIHNldCBnYW1tYSBjb252ZXJzaW9uICovCisgICAgICAgIGlmIChwbmdfZ2V0X2dBTUEocG5nX3B0ciwgaW5mb19wdHIsICZkR2FtbWEpKQorICAgICAgICAgICAgcG5nX3NldF9nYW1tYShwbmdfcHRyLCAoZG91YmxlKSAyLjIsIGRHYW1tYSk7CisKKyAgICAgICAgLyogYWZ0ZXIgdGhlIHRyYW5zZm9ybWF0aW9ucyBhcmUgcmVnaXN0ZXJlZCwgdXBkYXRlIGluZm9fcHRyIGRhdGEgKi8KKworICAgICAgICBwbmdfcmVhZF91cGRhdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7CisKKyAgICAgICAgLyogZ2V0IGFnYWluIHdpZHRoLCBoZWlnaHQgYW5kIHRoZSBuZXcgYml0LWRlcHRoIGFuZCBjb2xvci10eXBlICovCisKKyAgICAgICAgcG5nX2dldF9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCBwaVdpZHRoLCBwaUhlaWdodCwgJmlCaXREZXB0aCwKKyAgICAgICAgICAgICZpQ29sb3JUeXBlLCBOVUxMLCBOVUxMLCBOVUxMKTsKKworCisgICAgICAgIC8qIHJvd19ieXRlcyBpcyB0aGUgd2lkdGggeCBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKworICAgICAgICB1bFJvd0J5dGVzID0gcG5nX2dldF9yb3dieXRlcyhwbmdfcHRyLCBpbmZvX3B0cik7CisgICAgICAgIHVsQ2hhbm5lbHMgPSBwbmdfZ2V0X2NoYW5uZWxzKHBuZ19wdHIsIGluZm9fcHRyKTsKKworICAgICAgICAqcGlDaGFubmVscyA9IHVsQ2hhbm5lbHM7CisKKyAgICAgICAgLyogbm93IHdlIGNhbiBhbGxvY2F0ZSBtZW1vcnkgdG8gc3RvcmUgdGhlIGltYWdlICovCisKKyAgICAgICAgaWYgKHBiSW1hZ2VEYXRhKQorICAgICAgICB7CisgICAgICAgICAgICBmcmVlIChwYkltYWdlRGF0YSk7CisgICAgICAgICAgICBwYkltYWdlRGF0YSA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChwYkltYWdlRGF0YSA9IChwbmdfYnl0ZSAqKSBtYWxsb2ModWxSb3dCeXRlcyAqICgqcGlIZWlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YocG5nX2J5dGUpKSkgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJWaXN1YWwgUE5HOiBvdXQgb2YgbWVtb3J5Iik7CisgICAgICAgIH0KKyAgICAgICAgKnBwYkltYWdlRGF0YSA9IHBiSW1hZ2VEYXRhOworCisgICAgICAgIC8qIGFuZCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGFuIGFycmF5IG9mIHJvdy1wb2ludGVycyAqLworCisgICAgICAgIGlmICgocHBiUm93UG9pbnRlcnMgPSAocG5nX2J5dGVwcCkgbWFsbG9jKCgqcGlIZWlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YocG5nX2J5dGVwKSkpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiVmlzdWFsIFBORzogb3V0IG9mIG1lbW9yeSIpOworICAgICAgICB9CisKKyAgICAgICAgLyogc2V0IHRoZSBpbmRpdmlkdWFsIHJvdy1wb2ludGVycyB0byBwb2ludCBhdCB0aGUgY29ycmVjdCBvZmZzZXRzICovCisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8ICgqcGlIZWlnaHQpOyBpKyspCisgICAgICAgICAgICBwcGJSb3dQb2ludGVyc1tpXSA9IHBiSW1hZ2VEYXRhICsgaSAqIHVsUm93Qnl0ZXM7CisKKyAgICAgICAgLyogbm93IHdlIGNhbiBnbyBhaGVhZCBhbmQganVzdCByZWFkIHRoZSB3aG9sZSBpbWFnZSAqLworCisgICAgICAgIHBuZ19yZWFkX2ltYWdlKHBuZ19wdHIsIHBwYlJvd1BvaW50ZXJzKTsKKworICAgICAgICAvKiByZWFkIHRoZSBhZGRpdGlvbmFsIGNodW5rcyBpbiB0aGUgUE5HIGZpbGUgKG5vdCByZWFsbHkgbmVlZGVkKSAqLworCisgICAgICAgIHBuZ19yZWFkX2VuZChwbmdfcHRyLCBOVUxMKTsKKworICAgICAgICAvKiBhbmQgd2UncmUgZG9uZSAqLworCisgICAgICAgIGZyZWUgKHBwYlJvd1BvaW50ZXJzKTsKKyAgICAgICAgcHBiUm93UG9pbnRlcnMgPSBOVUxMOworCisgICAgICAgIC8qIHllcHAsIGRvbmUgKi8KKyAgICB9CisKKyAgICBDYXRjaCAobXNnKQorICAgIHsKKyAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7CisKKyAgICAgICAgKnBwYkltYWdlRGF0YSA9IHBiSW1hZ2VEYXRhID0gTlVMTDsKKworICAgICAgICBpZihwcGJSb3dQb2ludGVycykKKyAgICAgICAgICAgIGZyZWUgKHBwYlJvd1BvaW50ZXJzKTsKKworICAgICAgICBmY2xvc2UocGZGaWxlKTsKKworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgZmNsb3NlIChwZkZpbGUpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworQk9PTCBQbmdTYXZlSW1hZ2UgKFBUU1RSIHBzdHJGaWxlTmFtZSwgcG5nX2J5dGUgKnBEaURhdGEsCisgICAgICAgICAgICAgICAgICAgaW50IGlXaWR0aCwgaW50IGlIZWlnaHQsIHBuZ19jb2xvciBia2dDb2xvcikKK3sKKyAgICBjb25zdCBpbnQgICAgICAgICAgIGNpQml0RGVwdGggPSA4OworICAgIGNvbnN0IGludCAgICAgICAgICAgY2lDaGFubmVscyA9IDM7CisKKyAgICBzdGF0aWMgRklMRSAgICAgICAgKnBmRmlsZTsKKyAgICBwbmdfdWludF8zMiAgICAgICAgIHVsUm93Qnl0ZXM7CisgICAgc3RhdGljIHBuZ19ieXRlICAgKipwcGJSb3dQb2ludGVycyA9IE5VTEw7CisgICAgaW50ICAgICAgICAgICAgICAgICBpOworCisgICAgLyogb3BlbiB0aGUgUE5HIG91dHB1dCBmaWxlICovCisKKyAgICBpZiAoIXBzdHJGaWxlTmFtZSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKCEocGZGaWxlID0gZm9wZW4ocHN0ckZpbGVOYW1lLCAid2IiKSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIC8qIHByZXBhcmUgdGhlIHN0YW5kYXJkIFBORyBzdHJ1Y3R1cmVzICovCisKKyAgICBwbmdfcHRyID0gcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCBOVUxMLAorICAgICAgKHBuZ19lcnJvcl9wdHIpcG5nX2NleGNlcHRfZXJyb3IsIChwbmdfZXJyb3JfcHRyKU5VTEwpOworICAgIGlmICghcG5nX3B0cikKKyAgICB7CisgICAgICAgIGZjbG9zZShwZkZpbGUpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOworICAgIGlmICghaW5mb19wdHIpIHsKKyAgICAgICAgZmNsb3NlKHBmRmlsZSk7CisgICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgKHBuZ19pbmZvcHApIE5VTEwpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgVHJ5CisgICAgeworICAgICAgICAvKiBpbml0aWFsaXplIHRoZSBwbmcgc3RydWN0dXJlICovCisKKyNpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECisgICAgICAgIHBuZ19pbml0X2lvKHBuZ19wdHIsIHBmRmlsZSk7CisjZWxzZQorICAgICAgICBwbmdfc2V0X3dyaXRlX2ZuKHBuZ19wdHIsIChwbmdfdm9pZHApcGZGaWxlLCBwbmdfd3JpdGVfZGF0YSwgcG5nX2ZsdXNoKTsKKyNlbmRpZgorCisgICAgICAgIC8qIHdlJ3JlIGdvaW5nIHRvIHdyaXRlIGEgdmVyeSBzaW1wbGUgM3g4LWJpdCBSR0IgaW1hZ2UgKi8KKworICAgICAgICBwbmdfc2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIGlXaWR0aCwgaUhlaWdodCwgY2lCaXREZXB0aCwKKyAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX1JHQiwgUE5HX0lOVEVSTEFDRV9OT05FLCBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFLAorICAgICAgICAgICAgUE5HX0ZJTFRFUl9UWVBFX0JBU0UpOworCisgICAgICAgIC8qIHdyaXRlIHRoZSBmaWxlIGhlYWRlciBpbmZvcm1hdGlvbiAqLworCisgICAgICAgIHBuZ193cml0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKKworICAgICAgICAvKiBzd2FwIHRoZSBCR1IgcGl4ZWxzIGluIHRoZSBEaURhdGEgc3RydWN0dXJlIHRvIFJHQiAqLworCisgICAgICAgIHBuZ19zZXRfYmdyKHBuZ19wdHIpOworCisgICAgICAgIC8qIHJvd19ieXRlcyBpcyB0aGUgd2lkdGggeCBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKworICAgICAgICB1bFJvd0J5dGVzID0gaVdpZHRoICogY2lDaGFubmVsczsKKworICAgICAgICAvKiB3ZSBjYW4gYWxsb2NhdGUgbWVtb3J5IGZvciBhbiBhcnJheSBvZiByb3ctcG9pbnRlcnMgKi8KKworICAgICAgICBpZiAoKHBwYlJvd1BvaW50ZXJzID0gKHBuZ19ieXRlcHApIG1hbGxvYyhpSGVpZ2h0ICogc2l6ZW9mKHBuZ19ieXRlcCkpKSA9PSBOVUxMKQorICAgICAgICAgICAgVGhyb3cgIlZpc3VhbHBuZzogT3V0IG9mIG1lbW9yeSI7CisKKyAgICAgICAgLyogc2V0IHRoZSBpbmRpdmlkdWFsIHJvdy1wb2ludGVycyB0byBwb2ludCBhdCB0aGUgY29ycmVjdCBvZmZzZXRzICovCisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGlIZWlnaHQ7IGkrKykKKyAgICAgICAgICAgIHBwYlJvd1BvaW50ZXJzW2ldID0gcERpRGF0YSArIGkgKiAoKCh1bFJvd0J5dGVzICsgMykgPj4gMikgPDwgMik7CisKKyAgICAgICAgLyogd3JpdGUgb3V0IHRoZSBlbnRpcmUgaW1hZ2UgZGF0YSBpbiBvbmUgY2FsbCAqLworCisgICAgICAgIHBuZ193cml0ZV9pbWFnZSAocG5nX3B0ciwgcHBiUm93UG9pbnRlcnMpOworCisgICAgICAgIC8qIHdyaXRlIHRoZSBhZGRpdGlvbmFsIGNodW5rcyB0byB0aGUgUE5HIGZpbGUgKG5vdCByZWFsbHkgbmVlZGVkKSAqLworCisgICAgICAgIHBuZ193cml0ZV9lbmQocG5nX3B0ciwgaW5mb19wdHIpOworCisgICAgICAgIC8qIGFuZCB3ZSdyZSBkb25lICovCisKKyAgICAgICAgZnJlZSAocHBiUm93UG9pbnRlcnMpOworICAgICAgICBwcGJSb3dQb2ludGVycyA9IE5VTEw7CisKKyAgICAgICAgLyogY2xlYW4gdXAgYWZ0ZXIgdGhlIHdyaXRlLCBhbmQgZnJlZSBhbnkgbWVtb3J5IGFsbG9jYXRlZCAqLworCisgICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgKHBuZ19pbmZvcHApIE5VTEwpOworCisgICAgICAgIC8qIHllcHAsIGRvbmUgKi8KKyAgICB9CisKKyAgICBDYXRjaCAobXNnKQorICAgIHsKKyAgICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLCAocG5nX2luZm9wcCkgTlVMTCk7CisKKyAgICAgICAgaWYocHBiUm93UG9pbnRlcnMpCisgICAgICAgICAgICBmcmVlIChwcGJSb3dQb2ludGVycyk7CisKKyAgICAgICAgZmNsb3NlKHBmRmlsZSk7CisKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGZjbG9zZSAocGZGaWxlKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisjaWZuZGVmIFBOR19TVERJT19TVVBQT1JURUQKKworc3RhdGljIHZvaWQKK3BuZ19yZWFkX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKQoreworICAgcG5nX3NpemVfdCBjaGVjazsKKworICAgLyogZnJlYWQoKSByZXR1cm5zIDAgb24gZXJyb3IsIHNvIGl0IGlzIE9LIHRvIHN0b3JlIHRoaXMgaW4gYSBwbmdfc2l6ZV90CisgICAgKiBpbnN0ZWFkIG9mIGFuIGludCwgd2hpY2ggaXMgd2hhdCBmcmVhZCgpIGFjdHVhbGx5IHJldHVybnMuCisgICAgKi8KKyAgIGNoZWNrID0gKHBuZ19zaXplX3QpZnJlYWQoZGF0YSwgKHBuZ19zaXplX3QpMSwgbGVuZ3RoLAorICAgICAgKEZJTEUgKilwbmdfcHRyLT5pb19wdHIpOworCisgICBpZiAoY2hlY2sgIT0gbGVuZ3RoKQorICAgeworICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJSZWFkIEVycm9yIik7CisgICB9Cit9CisKK3N0YXRpYyB2b2lkCitwbmdfd3JpdGVfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpCit7CisgICBwbmdfdWludF8zMiBjaGVjazsKKworICAgY2hlY2sgPSBmd3JpdGUoZGF0YSwgMSwgbGVuZ3RoLCAoRklMRSAqKShwbmdfcHRyLT5pb19wdHIpKTsKKyAgIGlmIChjaGVjayAhPSBsZW5ndGgpCisgICB7CisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIldyaXRlIEVycm9yIik7CisgICB9Cit9CisKK3N0YXRpYyB2b2lkCitwbmdfZmx1c2gocG5nX3N0cnVjdHAgcG5nX3B0cikKK3sKKyAgIEZJTEUgKmlvX3B0cjsKKyAgIGlvX3B0ciA9IChGSUxFICopQ1ZUX1BUUigocG5nX3B0ci0+aW9fcHRyKSk7CisgICBpZiAoaW9fcHRyICE9IE5VTEwpCisgICAgICBmZmx1c2goaW9fcHRyKTsKK30KKworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBlbmQgb2Ygc291cmNlCisgKi0tLS0tLS0tLS0tLS0tLS0tCisgKi8KZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvUG5nRmlsZS5oIGIvbGlicG5nL2NvbnRyaWIvdmlzdXBuZy9QbmdGaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc0NDI2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvUG5nRmlsZS5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qICBQTkdGSUxFLkggLS0gSGVhZGVyIEZpbGUgZm9yIHBuZ2ZpbGUuYyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIENvcHlyaWdodCAyMDAwLCBXaWxsZW0gdmFuIFNjaGFpay4qLworCisvKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLiovCisvKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyKi8KKy8qIGFuZCBsaWNlbnNlIGluIHBuZy5oKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgorCit2b2lkIFBuZ0ZpbGVJbml0aWFsaXplIChIV05EIGh3bmQpIDsKK0JPT0wgUG5nRmlsZU9wZW5EbGcgKEhXTkQgaHduZCwgUFRTVFIgcHN0ckZpbGVOYW1lLCBQVFNUUiBwc3RyVGl0bGVOYW1lKSA7CitCT09MIFBuZ0ZpbGVTYXZlRGxnIChIV05EIGh3bmQsIFBUU1RSIHBzdHJGaWxlTmFtZSwgUFRTVFIgcHN0clRpdGxlTmFtZSkgOworCitCT09MIFBuZ0xvYWRJbWFnZSAoUFRTVFIgcHN0ckZpbGVOYW1lLCBwbmdfYnl0ZSAqKnBwYkltYWdlRGF0YSwKKyAgICAgICAgICAgICAgICAgICBpbnQgKnBpV2lkdGgsIGludCAqcGlIZWlnaHQsIGludCAqcGlDaGFubmVscywgcG5nX2NvbG9yICpwQmtnQ29sb3IpOworQk9PTCBQbmdTYXZlSW1hZ2UgKFBUU1RSIHBzdHJGaWxlTmFtZSwgcG5nX2J5dGUgKnBEaURhdGEsCisgICAgICAgICAgICAgICAgICAgaW50IGlXaWR0aCwgaW50IGlIZWlnaHQsIHBuZ19jb2xvciBCa2dDb2xvcik7CisKKyNpZm5kZWYgUE5HX1NURElPX1NVUFBPUlRFRAorc3RhdGljIHZvaWQgcG5nX3JlYWRfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpOworc3RhdGljIHZvaWQgcG5nX3dyaXRlX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIHBuZ19mbHVzaChwbmdfc3RydWN0cCBwbmdfcHRyKTsKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi92aXN1cG5nL1JFQURNRS50eHQgYi9saWJwbmcvY29udHJpYi92aXN1cG5nL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJjNWNiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvUkVBRE1FLnR4dApAQCAtMCwwICsxLDYxIEBACitNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwIGZvciBWaXN1YWxQbmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDb3B5cmlnaHQgMjAwMCwgV2lsbGVtIHZhbiBTY2hhaWsuCisKK1RoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCitGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCithbmQgbGljZW5zZSBpbiBwbmcuaAorCitBcyBhIFBORyAuZGxsIGRlbW8gVmlzdWFsUG5nIGlzIGZpbmlzaGVkLiBNb3JlIGZlYXR1cmVzIHdvdWxkIG9ubHkgaGluZGVyCit0aGUgcHJvZ3JhbSdzIG9iamVjdGl2ZS4gSG93ZXZlciwgZnVydGhlciBleHRlbnNpb25zIChsaWtlIHN1cHBvcnQgZm9yIG90aGVyCitncmFwaGljcyBmb3JtYXRzKSBhcmUgaW4gZGV2ZWxvcG1lbnQuIFRvIGdldCB0aGVzZSwgb3IgZm9yIHByZS1jb21waWxlZAorYmluYXJpZXMsIGdvIHRvICJodHRwOi8vd3d3LnNjaGFpay5jb20vcG5nL3Zpc3VhbHBuZy5odG1sIi4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Fzc3VtZXMgdGhhdAorCisgICBsaWJwbmcgRExMcyBhbmQgTElCcyBhcmUgaW4gLi5cLi5ccHJvamVjdHNcbXN2Y1x3aW4zMlxsaWJwbmcKKyAgIHpsaWIgRExMcyBhbmQgTElCcyBhcmUgaW4gICAuLlwuLlxwcm9qZWN0c1xtc3ZjXHdpbjMyXHpsaWIKKyAgIGxpYnBuZyBoZWFkZXIgZmlsZXMgYXJlIGluICAuLlwuLlwuLlxsaWJwbmcKKyAgIHpsaWIgaGVhZGVyIGZpbGVzIGFyZSBpbiAgICAuLlwuLlwuLlx6bGliCisgICB0aGUgcG5nc3VpdGUgaW1hZ2VzIGFyZSBpbiAgLi5ccG5nc3VpdGUKKworVG8gYnVpbGQ6CisKKzEpIE9uIHRoZSBtYWluIG1lbnUgU2VsZWN0ICJCdWlsZHxTZXQgQWN0aXZlIGNvbmZpZ3VyYXRpb24iLgorICAgQ2hvb3NlIHRoZSBjb25maWd1cmF0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxpYnJhcnkgeW91IHdhbnQgdG8gdGVzdC4KKyAgIFRoaXMgbGlicmFyeSBtdXN0IGhhdmUgYmVlbiBidWlsdCB1c2luZyB0aGUgbGlicG5nIE1TIHByb2plY3QgbG9jYXRlZCBpbgorICAgdGhlICIuLlwuLlxtc2N2IiBzdWJkaXJlY3RvcnkuCisKKzIpIFNlbGVjdCAiQnVpbGR8Q2xlYW4iCisKKzMpIFNlbGVjdCAiQnVpbGR8UmVidWlsZCBBbGwiCisKKzQpIEFmdGVyIGNvbXBpbGluZyBhbmQgbGlua2luZyBWaXN1YWxQbmcgd2lsbCBiZSBzdGFydGVkIHRvIHZpZXcgYW4gaW1hZ2UKKyAgIGZyb20gdGhlIFBuZ1N1aXRlIGRpcmVjdG9yeS4gIFByZXNzIEN0cmwtTiAoYW5kIEN0cmwtVikgZm9yIG90aGVyIGltYWdlcy4KKworCitUbyBpbnN0YWxsOgorCitXaGVuIGRpc3RyaWJ1dGluZyBWaXN1YWxQbmcgKG9yIGEgZnVydGhlciBkZXZlbG9wbWVudCkgdGhlIGZvbGxvd2luZyBvcHRpb25zCithcmUgYXZhaWxhYmxlOgorCisxKSBCdWlsZCB0aGUgcHJvZ3JhbSB3aXRoIHRoZSBjb25maWd1cmF0aW9uICJXaW4zMiBMSUIiIGFuZCB5b3Ugb25seSBuZWVkIHRvCisgICBpbmNsdWRlIHRoZSBleGVjdXRhYmxlIGZyb20gdGhlIC4vbGliIGRpcmVjdG9yeSBpbiB5b3VyIGRpc3RyaWJ1dGlvbi4KKworMikgQnVpbGQgdGhlIHByb2dyYW0gd2l0aCB0aGUgY29uZmlndXJhdGlvbiAiV2luMzIgRExMIiBhbmQgeW91IG5lZWQgdG8gcHV0CisgICBpbiB5b3VyIGRpc3RyaWJ1dGlvbiB0aGUgZXhlY3V0YWJsZSBmcm9tIHRoZSAuL2RsbCBkaXJlY3RvcnkgYW5kIHRoZSBkbGwncworICAgbGlicG5nMS5kbGwsIHpsaWIuZGxsIGFuZCBtc3ZjcnQuZGxsLiAgVGhlc2UgbmVlZCB0byBiZSBpbiB0aGUgdXNlcidzIFBBVEguCisKKworV2lsbGVtIHZhbiBTY2hhaWsKK0NhbGdhcnksIEp1bmUgNnRoIDIwMDAKKworUC5TLiBWaXN1YWxQbmcgd2FzIHdyaXR0ZW4gYmFzZWQgb24gcHJlbGltaW5hcnkgd29yayBvZjoKKworICAgIC0gU2ltb24tUGllcnJlIENhZGlldXgKKyAgICAtIEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICAgIC0gR3JlZyBSb2Vsb2ZzCisKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLmMgYi9saWJwbmcvY29udHJpYi92aXN1cG5nL1Zpc3VhbFBuZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNjUyNWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvY29udHJpYi92aXN1cG5nL1Zpc3VhbFBuZy5jCkBAIC0wLDAgKzEsOTcwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFZpc3VhbFBuZy5DIC0tIFNob3dzIGEgUE5HIGltYWdlCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIENvcHlyaWdodCAyMDAwLCBXaWxsZW0gdmFuIFNjaGFpay4KKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKyAqLworCisvKiBzd2l0Y2hlcyAqLworCisvKiBkZWZpbmVzICovCisKKyNkZWZpbmUgUFJPR05BTUUgICJWaXN1YWxQbmciCisjZGVmaW5lIExPTkdOQU1FICAiV2luMzIgVmlld2VyIGZvciBQTkctZmlsZXMiCisjZGVmaW5lIFZFUlNJT04gICAiMS4wIG9mIDIwMDAgSnVuZSAwNyIKKworLyogY29uc3RhbnRzICovCisKKyNkZWZpbmUgTUFSR0lOIDgKKworLyogc3RhbmRhcmQgaW5jbHVkZXMgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHpsaWIuaD4KKworLyogYXBwbGljYXRpb24gaW5jbHVkZXMgKi8KKworI2luY2x1ZGUgInBuZy5oIgorI2luY2x1ZGUgInBuZ2ZpbGUuaCIKKyNpbmNsdWRlICJyZXNvdXJjZS5oIgorCisvKiBtYWNyb3MgKi8KKworLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqLworCitMUkVTVUxUIENBTExCQUNLIFduZFByb2MgKEhXTkQsIFVJTlQsIFdQQVJBTSwgTFBBUkFNKTsKK0JPT0wgICAgQ0FMTEJBQ0sgQWJvdXREbGdQcm9jIChIV05ELCBVSU5ULCBXUEFSQU0sIExQQVJBTSkgOworCitCT09MIENlbnRlckFib3V0IChIV05EIGh3bmRDaGlsZCwgSFdORCBod25kUGFyZW50KTsKKworQk9PTCBCdWlsZFBuZ0xpc3QgKFBUU1RSIHBzdHJQYXRoTmFtZSwgVENIQVIgKipwcEZpbGVMaXN0LCBpbnQgKnBGaWxlQ291bnQsCisgICAgICAgIGludCAqcEZpbGVJbmRleCk7CisKK0JPT0wgU2VhcmNoUG5nTGlzdCAoVENIQVIgKnBGaWxlTGlzdCwgaW50IEZpbGVDb3VudCwgaW50ICpwRmlsZUluZGV4LAorICAgICAgICBQVFNUUiBwc3RyUHJldk5hbWUsIFBUU1RSIHBzdHJOZXh0TmFtZSk7CisKK0JPT0wgTG9hZEltYWdlRmlsZShIV05EIGh3bmQsIFBUU1RSIHBzdHJQYXRoTmFtZSwKKyAgICAgICAgcG5nX2J5dGUgKipwcGJJbWFnZSwgaW50ICpweEltZ1NpemUsIGludCAqcHlJbWdTaXplLCBpbnQgKnBpQ2hhbm5lbHMsCisgICAgICAgIHBuZ19jb2xvciAqcEJrZ0NvbG9yKTsKKworQk9PTCBEaXNwbGF5SW1hZ2UgKEhXTkQgaHduZCwgQllURSAqKnBwRGliLAorICAgICAgICBCWVRFICoqcHBEaURhdGEsIGludCBjeFdpblNpemUsIGludCBjeVdpblNpemUsCisgICAgICAgIEJZVEUgKnBiSW1hZ2UsIGludCBjeEltZ1NpemUsIGludCBjeUltZ1NpemUsIGludCBjSW1nQ2hhbm5lbHMsCisgICAgICAgIEJPT0wgYlN0cmV0Y2hlZCk7CisKK0JPT0wgSW5pdEJpdG1hcCAoCisgICAgICAgIEJZVEUgKnBEaURhdGEsIGludCBjeFdpblNpemUsIGludCBjeVdpblNpemUpOworCitCT09MIEZpbGxCaXRtYXAgKAorICAgICAgICBCWVRFICpwRGlEYXRhLCBpbnQgY3hXaW5TaXplLCBpbnQgY3lXaW5TaXplLAorICAgICAgICBCWVRFICpwYkltYWdlLCBpbnQgY3hJbWdTaXplLCBpbnQgY3lJbWdTaXplLCBpbnQgY0ltZ0NoYW5uZWxzLAorICAgICAgICBCT09MIGJTdHJldGNoZWQpOworCisvKiBhIGZldyBnbG9iYWwgdmFyaWFibGVzICovCisKK3N0YXRpYyBjaGFyICpzelByb2dOYW1lID0gUFJPR05BTUU7CitzdGF0aWMgY2hhciAqc3pBcHBOYW1lID0gTE9OR05BTUU7CitzdGF0aWMgY2hhciAqc3pJY29uTmFtZSA9IFBST0dOQU1FOworc3RhdGljIGNoYXIgc3pDbWRGaWxlTmFtZSBbTUFYX1BBVEhdOworCisvKiBNQUlOIHJvdXRpbmUgKi8KKworaW50IFdJTkFQSSBXaW5NYWluIChISU5TVEFOQ0UgaEluc3RhbmNlLCBISU5TVEFOQ0UgaFByZXZJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgUFNUUiBzekNtZExpbmUsIGludCBpQ21kU2hvdykKK3sKKyAgICBIQUNDRUwgICBoQWNjZWw7CisgICAgSFdORCAgICAgaHduZDsKKyAgICBNU0cgICAgICBtc2c7CisgICAgV05EQ0xBU1Mgd25kY2xhc3M7CisgICAgaW50IGl4Qm9yZGVycywgaXlCb3JkZXJzOworCisgICAgd25kY2xhc3Muc3R5bGUgICAgICAgICA9IENTX0hSRURSQVcgfCBDU19WUkVEUkFXOworICAgIHduZGNsYXNzLmxwZm5XbmRQcm9jICAgPSBXbmRQcm9jOworICAgIHduZGNsYXNzLmNiQ2xzRXh0cmEgICAgPSAwOworICAgIHduZGNsYXNzLmNiV25kRXh0cmEgICAgPSAwOworICAgIHduZGNsYXNzLmhJbnN0YW5jZSAgICAgPSBoSW5zdGFuY2U7CisgICAgd25kY2xhc3MuaEljb24gICAgICAgICA9IExvYWRJY29uIChoSW5zdGFuY2UsIHN6SWNvbk5hbWUpIDsKKyAgICB3bmRjbGFzcy5oQ3Vyc29yICAgICAgID0gTG9hZEN1cnNvciAoTlVMTCwgSURDX0FSUk9XKTsKKyAgICB3bmRjbGFzcy5oYnJCYWNrZ3JvdW5kID0gTlVMTDsgLyogKEhCUlVTSCkgR2V0U3RvY2tPYmplY3QgKEdSQVlfQlJVU0gpOyAqLworICAgIHduZGNsYXNzLmxwc3pNZW51TmFtZSAgPSBzelByb2dOYW1lOworICAgIHduZGNsYXNzLmxwc3pDbGFzc05hbWUgPSBzelByb2dOYW1lOworCisgICAgaWYgKCFSZWdpc3RlckNsYXNzICgmd25kY2xhc3MpKQorICAgIHsKKyAgICAgICAgTWVzc2FnZUJveCAoTlVMTCwgVEVYVCAoIkVycm9yOiB0aGlzIHByb2dyYW0gcmVxdWlyZXMgV2luZG93cyBOVCEiKSwKKyAgICAgICAgICAgIHN6UHJvZ05hbWUsIE1CX0lDT05FUlJPUik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIGlmIGZpbGVuYW1lIGdpdmVuIG9uIGNvbW1hbmRsaW5lLCBzdG9yZSBpdCAqLworICAgIGlmICgoc3pDbWRMaW5lICE9IE5VTEwpICYmICgqc3pDbWRMaW5lICE9ICdcMCcpKQorICAgICAgICBpZiAoc3pDbWRMaW5lWzBdID09ICciJykKKyAgICAgICAgICAgIHN0cm5jcHkgKHN6Q21kRmlsZU5hbWUsIHN6Q21kTGluZSArIDEsIHN0cmxlbihzekNtZExpbmUpIC0gMik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0cmNweSAoc3pDbWRGaWxlTmFtZSwgc3pDbWRMaW5lKTsKKyAgICBlbHNlCisgICAgICAgIHN0cmNweSAoc3pDbWRGaWxlTmFtZSwgIiIpOworCisgICAgLyogY2FsY3VsYXRlIHNpemUgb2Ygd2luZG93LWJvcmRlcnMgKi8KKyAgICBpeEJvcmRlcnMgPSAyICogKEdldFN5c3RlbU1ldHJpY3MgKFNNX0NYQk9SREVSKSArCisgICAgICAgICAgICAgICAgICAgICBHZXRTeXN0ZW1NZXRyaWNzIChTTV9DWERMR0ZSQU1FKSk7CisgICAgaXlCb3JkZXJzID0gMiAqIChHZXRTeXN0ZW1NZXRyaWNzIChTTV9DWUJPUkRFUikgKworICAgICAgICAgICAgICAgICAgICAgR2V0U3lzdGVtTWV0cmljcyAoU01fQ1lETEdGUkFNRSkpICsKKyAgICAgICAgICAgICAgICAgICAgIEdldFN5c3RlbU1ldHJpY3MgKFNNX0NZQ0FQVElPTikgKworICAgICAgICAgICAgICAgICAgICAgR2V0U3lzdGVtTWV0cmljcyAoU01fQ1lNRU5VU0laRSkgKworICAgICAgICAgICAgICAgICAgICAgMTsgLyogV3ZTOiBkb24ndCBhc2sgbWUgd2h5PyAgKi8KKworICAgIGh3bmQgPSBDcmVhdGVXaW5kb3cgKHN6UHJvZ05hbWUsIHN6QXBwTmFtZSwKKyAgICAgICAgV1NfT1ZFUkxBUFBFRFdJTkRPVywKKyAgICAgICAgQ1dfVVNFREVGQVVMVCwgQ1dfVVNFREVGQVVMVCwKKyAgICAgICAgNTEyICsgMiAqIE1BUkdJTiArIGl4Qm9yZGVycywgMzg0ICsgMiAqIE1BUkdJTiArIGl5Qm9yZGVycywKKy8qICAgICAgQ1dfVVNFREVGQVVMVCwgQ1dfVVNFREVGQVVMVCwgKi8KKyAgICAgICAgTlVMTCwgTlVMTCwgaEluc3RhbmNlLCBOVUxMKTsKKworICAgIFNob3dXaW5kb3cgKGh3bmQsIGlDbWRTaG93KTsKKyAgICBVcGRhdGVXaW5kb3cgKGh3bmQpOworCisgICAgaEFjY2VsID0gTG9hZEFjY2VsZXJhdG9ycyAoaEluc3RhbmNlLCBzelByb2dOYW1lKTsKKworICAgIHdoaWxlIChHZXRNZXNzYWdlICgmbXNnLCBOVUxMLCAwLCAwKSkKKyAgICB7CisgICAgICAgIGlmICghVHJhbnNsYXRlQWNjZWxlcmF0b3IgKGh3bmQsIGhBY2NlbCwgJm1zZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRyYW5zbGF0ZU1lc3NhZ2UgKCZtc2cpOworICAgICAgICAgICAgRGlzcGF0Y2hNZXNzYWdlICgmbXNnKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbXNnLndQYXJhbTsKK30KKworTFJFU1VMVCBDQUxMQkFDSyBXbmRQcm9jIChIV05EIGh3bmQsIFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwKKyAgICAgICAgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBzdGF0aWMgSElOU1RBTkNFICAgICAgICAgIGhJbnN0YW5jZSA7CisgICAgc3RhdGljIEhEQyAgICAgICAgICAgICAgICBoZGM7CisgICAgc3RhdGljIFBBSU5UU1RSVUNUICAgICAgICBwczsKKyAgICBzdGF0aWMgSE1FTlUgICAgICAgICAgICAgIGhNZW51OworCisgICAgc3RhdGljIEJJVE1BUEZJTEVIRUFERVIgICpwYm1maDsKKyAgICBzdGF0aWMgQklUTUFQSU5GT0hFQURFUiAgKnBibWloOworICAgIHN0YXRpYyBCWVRFICAgICAgICAgICAgICAqcGJJbWFnZTsKKyAgICBzdGF0aWMgaW50ICAgICAgICAgICAgICAgIGN4V2luU2l6ZSwgY3lXaW5TaXplOworICAgIHN0YXRpYyBpbnQgICAgICAgICAgICAgICAgY3hJbWdTaXplLCBjeUltZ1NpemU7CisgICAgc3RhdGljIGludCAgICAgICAgICAgICAgICBjSW1nQ2hhbm5lbHM7CisgICAgc3RhdGljIHBuZ19jb2xvciAgICAgICAgICBia2dDb2xvciA9IHsxMjcsIDEyNywgMTI3fTsKKworICAgIHN0YXRpYyBCT09MICAgICAgICAgICAgICAgYlN0cmV0Y2hlZCA9IFRSVUU7CisKKyAgICBzdGF0aWMgQllURSAgICAgICAgICAgICAgKnBEaWIgPSBOVUxMOworICAgIHN0YXRpYyBCWVRFICAgICAgICAgICAgICAqcERpRGF0YSA9IE5VTEw7CisKKyAgICBzdGF0aWMgVENIQVIgICAgICAgICAgICAgIHN6SW1nUGF0aE5hbWUgW01BWF9QQVRIXTsKKyAgICBzdGF0aWMgVENIQVIgICAgICAgICAgICAgIHN6VGl0bGVOYW1lIFtNQVhfUEFUSF07CisKKyAgICBzdGF0aWMgVENIQVIgICAgICAgICAgICAgKnBQbmdGaWxlTGlzdCA9IE5VTEw7CisgICAgc3RhdGljIGludCAgICAgICAgICAgICAgICBpUG5nRmlsZUNvdW50OworICAgIHN0YXRpYyBpbnQgICAgICAgICAgICAgICAgaVBuZ0ZpbGVJbmRleDsKKworICAgIEJPT0wgICAgICAgICAgICAgICAgICAgICAgYk9rOworCisgICAgc3dpdGNoIChtZXNzYWdlKQorICAgIHsKKyAgICBjYXNlIFdNX0NSRUFURToKKyAgICAgICAgaEluc3RhbmNlID0gKChMUENSRUFURVNUUlVDVCkgbFBhcmFtKS0+aEluc3RhbmNlIDsKKyAgICAgICAgUG5nRmlsZUluaXRpYWxpemUgKGh3bmQpOworCisgICAgICAgIHN0cmNweSAoc3pJbWdQYXRoTmFtZSwgIiIpOworCisgICAgICAgIC8qIGluIGNhc2Ugd2UgcHJvY2VzcyBmaWxlIGdpdmVuIG9uIGNvbW1hbmQtbGluZSAqLworCisgICAgICAgIGlmIChzekNtZEZpbGVOYW1lWzBdICE9ICdcMCcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmNweSAoc3pJbWdQYXRoTmFtZSwgc3pDbWRGaWxlTmFtZSk7CisKKyAgICAgICAgICAgIC8qIHJlYWQgdGhlIG90aGVyIHBuZy1maWxlcyBpbiB0aGUgZGlyZWN0b3J5IGZvciBsYXRlciAqLworICAgICAgICAgICAgLyogbmV4dC9wcmV2aW91cyBjb21tYW5kcyAqLworCisgICAgICAgICAgICBCdWlsZFBuZ0xpc3QgKHN6SW1nUGF0aE5hbWUsICZwUG5nRmlsZUxpc3QsICZpUG5nRmlsZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVBuZ0ZpbGVJbmRleCk7CisKKyAgICAgICAgICAgIC8qIGxvYWQgdGhlIGltYWdlIGZyb20gZmlsZSAqLworCisgICAgICAgICAgICBpZiAoIUxvYWRJbWFnZUZpbGUgKGh3bmQsIHN6SW1nUGF0aE5hbWUsCisgICAgICAgICAgICAgICAgJnBiSW1hZ2UsICZjeEltZ1NpemUsICZjeUltZ1NpemUsICZjSW1nQ2hhbm5lbHMsICZia2dDb2xvcikpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAgIC8qIGludmFsaWRhdGUgdGhlIGNsaWVudCBhcmVhIGZvciBsYXRlciB1cGRhdGUgKi8KKworICAgICAgICAgICAgSW52YWxpZGF0ZVJlY3QgKGh3bmQsIE5VTEwsIFRSVUUpOworCisgICAgICAgICAgICAvKiBkaXNwbGF5IHRoZSBQTkcgaW50byB0aGUgRElCaXRtYXAgKi8KKworICAgICAgICAgICAgRGlzcGxheUltYWdlIChod25kLCAmcERpYiwgJnBEaURhdGEsIGN4V2luU2l6ZSwgY3lXaW5TaXplLAorICAgICAgICAgICAgICAgIHBiSW1hZ2UsIGN4SW1nU2l6ZSwgY3lJbWdTaXplLCBjSW1nQ2hhbm5lbHMsIGJTdHJldGNoZWQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIFdNX1NJWkU6CisgICAgICAgIGN4V2luU2l6ZSA9IExPV09SRCAobFBhcmFtKTsKKyAgICAgICAgY3lXaW5TaXplID0gSElXT1JEIChsUGFyYW0pOworCisgICAgICAgIC8qIGludmFsaWRhdGUgdGhlIGNsaWVudCBhcmVhIGZvciBsYXRlciB1cGRhdGUgKi8KKworICAgICAgICBJbnZhbGlkYXRlUmVjdCAoaHduZCwgTlVMTCwgVFJVRSk7CisKKyAgICAgICAgLyogZGlzcGxheSB0aGUgUE5HIGludG8gdGhlIERJQml0bWFwICovCisKKyAgICAgICAgRGlzcGxheUltYWdlIChod25kLCAmcERpYiwgJnBEaURhdGEsIGN4V2luU2l6ZSwgY3lXaW5TaXplLAorICAgICAgICAgICAgcGJJbWFnZSwgY3hJbWdTaXplLCBjeUltZ1NpemUsIGNJbWdDaGFubmVscywgYlN0cmV0Y2hlZCk7CisKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIFdNX0lOSVRNRU5VUE9QVVA6CisgICAgICAgIGhNZW51ID0gR2V0TWVudSAoaHduZCk7CisKKyAgICAgICAgaWYgKHBiSW1hZ2UpCisgICAgICAgICAgICBFbmFibGVNZW51SXRlbSAoaE1lbnUsIElETV9GSUxFX1NBVkUsIE1GX0VOQUJMRUQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBFbmFibGVNZW51SXRlbSAoaE1lbnUsIElETV9GSUxFX1NBVkUsIE1GX0dSQVlFRCk7CisKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIFdNX0NPTU1BTkQ6CisgICAgICAgIGhNZW51ID0gR2V0TWVudSAoaHduZCk7CisKKyAgICAgICAgc3dpdGNoIChMT1dPUkQgKHdQYXJhbSkpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBJRE1fRklMRV9PUEVOOgorCisgICAgICAgICAgICAvKiBzaG93IHRoZSBGaWxlIE9wZW4gZGlhbG9nIGJveCAqLworCisgICAgICAgICAgICBpZiAoIVBuZ0ZpbGVPcGVuRGxnIChod25kLCBzekltZ1BhdGhOYW1lLCBzelRpdGxlTmFtZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAgIC8qIHJlYWQgdGhlIG90aGVyIHBuZy1maWxlcyBpbiB0aGUgZGlyZWN0b3J5IGZvciBsYXRlciAqLworICAgICAgICAgICAgLyogbmV4dC9wcmV2aW91cyBjb21tYW5kcyAqLworCisgICAgICAgICAgICBCdWlsZFBuZ0xpc3QgKHN6SW1nUGF0aE5hbWUsICZwUG5nRmlsZUxpc3QsICZpUG5nRmlsZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVBuZ0ZpbGVJbmRleCk7CisKKyAgICAgICAgICAgIC8qIGxvYWQgdGhlIGltYWdlIGZyb20gZmlsZSAqLworCisgICAgICAgICAgICBpZiAoIUxvYWRJbWFnZUZpbGUgKGh3bmQsIHN6SW1nUGF0aE5hbWUsCisgICAgICAgICAgICAgICAgJnBiSW1hZ2UsICZjeEltZ1NpemUsICZjeUltZ1NpemUsICZjSW1nQ2hhbm5lbHMsICZia2dDb2xvcikpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAgIC8qIGludmFsaWRhdGUgdGhlIGNsaWVudCBhcmVhIGZvciBsYXRlciB1cGRhdGUgKi8KKworICAgICAgICAgICAgSW52YWxpZGF0ZVJlY3QgKGh3bmQsIE5VTEwsIFRSVUUpOworCisgICAgICAgICAgICAvKiBkaXNwbGF5IHRoZSBQTkcgaW50byB0aGUgRElCaXRtYXAgKi8KKworICAgICAgICAgICAgRGlzcGxheUltYWdlIChod25kLCAmcERpYiwgJnBEaURhdGEsIGN4V2luU2l6ZSwgY3lXaW5TaXplLAorICAgICAgICAgICAgICAgIHBiSW1hZ2UsIGN4SW1nU2l6ZSwgY3lJbWdTaXplLCBjSW1nQ2hhbm5lbHMsIGJTdHJldGNoZWQpOworCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjYXNlIElETV9GSUxFX1NBVkU6CisKKyAgICAgICAgICAgIC8qIHNob3cgdGhlIEZpbGUgU2F2ZSBkaWFsb2cgYm94ICovCisKKyAgICAgICAgICAgIGlmICghUG5nRmlsZVNhdmVEbGcgKGh3bmQsIHN6SW1nUGF0aE5hbWUsIHN6VGl0bGVOYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgLyogc2F2ZSB0aGUgUE5HIHRvIGEgZGlzayBmaWxlICovCisKKyAgICAgICAgICAgIFNldEN1cnNvciAoTG9hZEN1cnNvciAoTlVMTCwgSURDX1dBSVQpKTsKKyAgICAgICAgICAgIFNob3dDdXJzb3IgKFRSVUUpOworCisgICAgICAgICAgICBiT2sgPSBQbmdTYXZlSW1hZ2UgKHN6SW1nUGF0aE5hbWUsIHBEaURhdGEsIGN4V2luU2l6ZSwgY3lXaW5TaXplLAorICAgICAgICAgICAgICAgICAgYmtnQ29sb3IpOworCisgICAgICAgICAgICBTaG93Q3Vyc29yIChGQUxTRSk7CisgICAgICAgICAgICBTZXRDdXJzb3IgKExvYWRDdXJzb3IgKE5VTEwsIElEQ19BUlJPVykpOworCisgICAgICAgICAgICBpZiAoIWJPaykKKyAgICAgICAgICAgICAgICBNZXNzYWdlQm94IChod25kLCBURVhUICgiRXJyb3IgaW4gc2F2aW5nIHRoZSBQTkcgaW1hZ2UiKSwKKyAgICAgICAgICAgICAgICBzelByb2dOYW1lLCBNQl9JQ09ORVhDTEFNQVRJT04gfCBNQl9PSyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjYXNlIElETV9GSUxFX05FWFQ6CisKKyAgICAgICAgICAgIC8qIHJlYWQgbmV4dCBlbnRyeSBpbiB0aGUgZGlyZWN0b3J5ICovCisKKyAgICAgICAgICAgIGlmIChTZWFyY2hQbmdMaXN0IChwUG5nRmlsZUxpc3QsIGlQbmdGaWxlQ291bnQsICZpUG5nRmlsZUluZGV4LAorICAgICAgICAgICAgICAgIE5VTEwsIHN6SW1nUGF0aE5hbWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzdHJjbXAgKHN6SW1nUGF0aE5hbWUsICIiKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgICAgIC8qIGxvYWQgdGhlIGltYWdlIGZyb20gZmlsZSAqLworCisgICAgICAgICAgICAgICAgaWYgKCFMb2FkSW1hZ2VGaWxlIChod25kLCBzekltZ1BhdGhOYW1lLCAmcGJJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZjeEltZ1NpemUsICZjeUltZ1NpemUsICZjSW1nQ2hhbm5lbHMsICZia2dDb2xvcikpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICAgICAgLyogaW52YWxpZGF0ZSB0aGUgY2xpZW50IGFyZWEgZm9yIGxhdGVyIHVwZGF0ZSAqLworCisgICAgICAgICAgICAgICAgSW52YWxpZGF0ZVJlY3QgKGh3bmQsIE5VTEwsIFRSVUUpOworCisgICAgICAgICAgICAgICAgLyogZGlzcGxheSB0aGUgUE5HIGludG8gdGhlIERJQml0bWFwICovCisKKyAgICAgICAgICAgICAgICBEaXNwbGF5SW1hZ2UgKGh3bmQsICZwRGliLCAmcERpRGF0YSwgY3hXaW5TaXplLCBjeVdpblNpemUsCisgICAgICAgICAgICAgICAgICAgIHBiSW1hZ2UsIGN4SW1nU2l6ZSwgY3lJbWdTaXplLCBjSW1nQ2hhbm5lbHMsIGJTdHJldGNoZWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjYXNlIElETV9GSUxFX1BSRVZJT1VTOgorCisgICAgICAgICAgICAvKiByZWFkIHByZXZpb3VzIGVudHJ5IGluIHRoZSBkaXJlY3RvcnkgKi8KKworICAgICAgICAgICAgaWYgKFNlYXJjaFBuZ0xpc3QgKHBQbmdGaWxlTGlzdCwgaVBuZ0ZpbGVDb3VudCwgJmlQbmdGaWxlSW5kZXgsCisgICAgICAgICAgICAgICAgc3pJbWdQYXRoTmFtZSwgTlVMTCkpCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBpZiAoc3RyY21wIChzekltZ1BhdGhOYW1lLCAiIikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAgICAgICAvKiBsb2FkIHRoZSBpbWFnZSBmcm9tIGZpbGUgKi8KKworICAgICAgICAgICAgICAgIGlmICghTG9hZEltYWdlRmlsZSAoaHduZCwgc3pJbWdQYXRoTmFtZSwgJnBiSW1hZ2UsICZjeEltZ1NpemUsCisgICAgICAgICAgICAgICAgICAgICZjeUltZ1NpemUsICZjSW1nQ2hhbm5lbHMsICZia2dDb2xvcikpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICAgICAgLyogaW52YWxpZGF0ZSB0aGUgY2xpZW50IGFyZWEgZm9yIGxhdGVyIHVwZGF0ZSAqLworCisgICAgICAgICAgICAgICAgSW52YWxpZGF0ZVJlY3QgKGh3bmQsIE5VTEwsIFRSVUUpOworCisgICAgICAgICAgICAgICAgLyogZGlzcGxheSB0aGUgUE5HIGludG8gdGhlIERJQml0bWFwICovCisKKyAgICAgICAgICAgICAgICBEaXNwbGF5SW1hZ2UgKGh3bmQsICZwRGliLCAmcERpRGF0YSwgY3hXaW5TaXplLCBjeVdpblNpemUsCisgICAgICAgICAgICAgICAgICAgIHBiSW1hZ2UsIGN4SW1nU2l6ZSwgY3lJbWdTaXplLCBjSW1nQ2hhbm5lbHMsIGJTdHJldGNoZWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjYXNlIElETV9GSUxFX0VYSVQ6CisKKyAgICAgICAgICAgIC8qIG1vcmUgY2xlYW51cCBuZWVkZWQuLi4gKi8KKworICAgICAgICAgICAgLyogZnJlZSBpbWFnZSBidWZmZXIgKi8KKworICAgICAgICAgICAgaWYgKHBEaWIgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcmVlIChwRGliKTsKKyAgICAgICAgICAgICAgICBwRGliID0gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogZnJlZSBmaWxlLWxpc3QgKi8KKworICAgICAgICAgICAgaWYgKHBQbmdGaWxlTGlzdCAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZyZWUgKHBQbmdGaWxlTGlzdCk7CisgICAgICAgICAgICAgICAgcFBuZ0ZpbGVMaXN0ID0gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogbGV0J3MgZ28gLi4uICovCisKKyAgICAgICAgICAgIGV4aXQgKDApOworCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjYXNlIElETV9PUFRJT05TX1NUUkVUQ0g6CisgICAgICAgICAgICBiU3RyZXRjaGVkID0gIWJTdHJldGNoZWQ7CisgICAgICAgICAgICBpZiAoYlN0cmV0Y2hlZCkKKyAgICAgICAgICAgICAgICBDaGVja01lbnVJdGVtIChoTWVudSwgSURNX09QVElPTlNfU1RSRVRDSCwgTUZfQ0hFQ0tFRCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQ2hlY2tNZW51SXRlbSAoaE1lbnUsIElETV9PUFRJT05TX1NUUkVUQ0gsIE1GX1VOQ0hFQ0tFRCk7CisKKyAgICAgICAgICAgIC8qIGludmFsaWRhdGUgdGhlIGNsaWVudCBhcmVhIGZvciBsYXRlciB1cGRhdGUgKi8KKworICAgICAgICAgICAgSW52YWxpZGF0ZVJlY3QgKGh3bmQsIE5VTEwsIFRSVUUpOworCisgICAgICAgICAgICAvKiBkaXNwbGF5IHRoZSBQTkcgaW50byB0aGUgRElCaXRtYXAgKi8KKworICAgICAgICAgICAgRGlzcGxheUltYWdlIChod25kLCAmcERpYiwgJnBEaURhdGEsIGN4V2luU2l6ZSwgY3lXaW5TaXplLAorICAgICAgICAgICAgICAgIHBiSW1hZ2UsIGN4SW1nU2l6ZSwgY3lJbWdTaXplLCBjSW1nQ2hhbm5lbHMsIGJTdHJldGNoZWQpOworCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjYXNlIElETV9IRUxQX0FCT1VUOgorICAgICAgICAgICAgRGlhbG9nQm94IChoSW5zdGFuY2UsIFRFWFQgKCJBYm91dEJveCIpLCBod25kLCBBYm91dERsZ1Byb2MpIDsKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIH0gLyogZW5kIHN3aXRjaCAqLworCisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBXTV9QQUlOVDoKKyAgICAgICAgaGRjID0gQmVnaW5QYWludCAoaHduZCwgJnBzKTsKKworICAgICAgICBpZiAocERpYikKKyAgICAgICAgICAgIFNldERJQml0c1RvRGV2aWNlIChoZGMsIDAsIDAsIGN4V2luU2l6ZSwgY3lXaW5TaXplLCAwLCAwLAorICAgICAgICAgICAgICAgIDAsIGN5V2luU2l6ZSwgcERpRGF0YSwgKEJJVE1BUElORk8gKikgcERpYiwgRElCX1JHQl9DT0xPUlMpOworCisgICAgICAgIEVuZFBhaW50IChod25kLCAmcHMpOworICAgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgV01fREVTVFJPWToKKyAgICAgICAgaWYgKHBibWZoKQorICAgICAgICB7CisgICAgICAgICAgICBmcmVlIChwYm1maCk7CisgICAgICAgICAgICBwYm1maCA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBQb3N0UXVpdE1lc3NhZ2UgKDApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gRGVmV2luZG93UHJvYyAoaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOworfQorCitCT09MIENBTExCQUNLIEFib3V0RGxnUHJvYyAoSFdORCBoRGxnLCBVSU5UIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICAgc3dpdGNoIChtZXNzYWdlKQorICAgICB7CisgICAgIGNhc2UgV01fSU5JVERJQUxPRyA6CisgICAgICAgICAgU2hvd1dpbmRvdyAoaERsZywgU1dfSElERSk7CisgICAgICAgICAgQ2VudGVyQWJvdXQgKGhEbGcsIEdldFdpbmRvdyAoaERsZywgR1dfT1dORVIpKTsKKyAgICAgICAgICBTaG93V2luZG93IChoRGxnLCBTV19TSE9XKTsKKyAgICAgICAgICByZXR1cm4gVFJVRSA7CisKKyAgICAgY2FzZSBXTV9DT01NQU5EIDoKKyAgICAgICAgICBzd2l0Y2ggKExPV09SRCAod1BhcmFtKSkKKyAgICAgICAgICB7CisgICAgICAgICAgY2FzZSBJRE9LIDoKKyAgICAgICAgICBjYXNlIElEQ0FOQ0VMIDoKKyAgICAgICAgICAgICAgIEVuZERpYWxvZyAoaERsZywgMCkgOworICAgICAgICAgICAgICAgcmV0dXJuIFRSVUUgOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhayA7CisgICAgIH0KKyAgICAgcmV0dXJuIEZBTFNFIDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0KKyAqICBDZW50ZXJBYm91dAorICotLS0tLS0tLS0tLS0tLS0KKyAqLworQk9PTCBDZW50ZXJBYm91dCAoSFdORCBod25kQ2hpbGQsIEhXTkQgaHduZFBhcmVudCkKK3sKKyAgIFJFQ1QgICAgckNoaWxkLCByUGFyZW50LCByV29ya0FyZWE7CisgICBpbnQgICAgIHdDaGlsZCwgaENoaWxkLCB3UGFyZW50LCBoUGFyZW50OworICAgaW50ICAgICB4TmV3LCB5TmV3OworICAgQk9PTCAgYlJlc3VsdDsKKworICAgLyogR2V0IHRoZSBIZWlnaHQgYW5kIFdpZHRoIG9mIHRoZSBjaGlsZCB3aW5kb3cgKi8KKyAgIEdldFdpbmRvd1JlY3QgKGh3bmRDaGlsZCwgJnJDaGlsZCk7CisgICB3Q2hpbGQgPSByQ2hpbGQucmlnaHQgLSByQ2hpbGQubGVmdDsKKyAgIGhDaGlsZCA9IHJDaGlsZC5ib3R0b20gLSByQ2hpbGQudG9wOworCisgICAvKiBHZXQgdGhlIEhlaWdodCBhbmQgV2lkdGggb2YgdGhlIHBhcmVudCB3aW5kb3cgKi8KKyAgIEdldFdpbmRvd1JlY3QgKGh3bmRQYXJlbnQsICZyUGFyZW50KTsKKyAgIHdQYXJlbnQgPSByUGFyZW50LnJpZ2h0IC0gclBhcmVudC5sZWZ0OworICAgaFBhcmVudCA9IHJQYXJlbnQuYm90dG9tIC0gclBhcmVudC50b3A7CisKKyAgIC8qIEdldCB0aGUgbGltaXRzIG9mIHRoZSAnd29ya2FyZWEnICovCisgICBiUmVzdWx0ID0gU3lzdGVtUGFyYW1ldGVyc0luZm8oCisgICAgICBTUElfR0VUV09SS0FSRUEsICAvKiBzeXN0ZW0gcGFyYW1ldGVyIHRvIHF1ZXJ5IG9yIHNldCAqLworICAgICAgc2l6ZW9mKFJFQ1QpLAorICAgICAgJnJXb3JrQXJlYSwKKyAgICAgIDApOworICAgaWYgKCFiUmVzdWx0KSB7CisgICAgICByV29ya0FyZWEubGVmdCA9IHJXb3JrQXJlYS50b3AgPSAwOworICAgICAgcldvcmtBcmVhLnJpZ2h0ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTik7CisgICAgICByV29ya0FyZWEuYm90dG9tID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTik7CisgICB9CisKKyAgIC8qIENhbGN1bGF0ZSBuZXcgWCBwb3NpdGlvbiwgdGhlbiBhZGp1c3QgZm9yIHdvcmthcmVhICovCisgICB4TmV3ID0gclBhcmVudC5sZWZ0ICsgKCh3UGFyZW50IC0gd0NoaWxkKSAvMik7CisgICBpZiAoeE5ldyA8IHJXb3JrQXJlYS5sZWZ0KSB7CisgICAgICB4TmV3ID0gcldvcmtBcmVhLmxlZnQ7CisgICB9IGVsc2UgaWYgKCh4TmV3K3dDaGlsZCkgPiByV29ya0FyZWEucmlnaHQpIHsKKyAgICAgIHhOZXcgPSByV29ya0FyZWEucmlnaHQgLSB3Q2hpbGQ7CisgICB9CisKKyAgIC8qIENhbGN1bGF0ZSBuZXcgWSBwb3NpdGlvbiwgdGhlbiBhZGp1c3QgZm9yIHdvcmthcmVhICovCisgICB5TmV3ID0gclBhcmVudC50b3AgICsgKChoUGFyZW50IC0gaENoaWxkKSAvMik7CisgICBpZiAoeU5ldyA8IHJXb3JrQXJlYS50b3ApIHsKKyAgICAgIHlOZXcgPSByV29ya0FyZWEudG9wOworICAgfSBlbHNlIGlmICgoeU5ldytoQ2hpbGQpID4gcldvcmtBcmVhLmJvdHRvbSkgeworICAgICAgeU5ldyA9IHJXb3JrQXJlYS5ib3R0b20gLSBoQ2hpbGQ7CisgICB9CisKKyAgIC8qIFNldCBpdCwgYW5kIHJldHVybiAqLworICAgcmV0dXJuIFNldFdpbmRvd1BvcyAoaHduZENoaWxkLCBOVUxMLCB4TmV3LCB5TmV3LCAwLCAwLCBTV1BfTk9TSVpFIHwKKyAgICAgICAgICBTV1BfTk9aT1JERVIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0KKyAqICBCdWlsZFBuZ0xpc3QKKyAqLS0tLS0tLS0tLS0tLS0tLQorICovCitCT09MIEJ1aWxkUG5nTGlzdCAoUFRTVFIgcHN0clBhdGhOYW1lLCBUQ0hBUiAqKnBwRmlsZUxpc3QsIGludCAqcEZpbGVDb3VudCwKKyAgICAgaW50ICpwRmlsZUluZGV4KQoreworICAgIHN0YXRpYyBUQ0hBUiAgICAgICAgICAgICAgc3pJbWdQYXRoTmFtZSBbTUFYX1BBVEhdOworICAgIHN0YXRpYyBUQ0hBUiAgICAgICAgICAgICAgc3pJbWdGaWxlTmFtZSBbTUFYX1BBVEhdOworICAgIHN0YXRpYyBUQ0hBUiAgICAgICAgICAgICAgc3pJbWdGaW5kTmFtZSBbTUFYX1BBVEhdOworCisgICAgV0lOMzJfRklORF9EQVRBICAgICAgICAgICBmaW5kZGF0YTsKKyAgICBIQU5ETEUgICAgICAgICAgICAgICAgICAgIGhGaW5kOworCisgICAgc3RhdGljIFRDSEFSICAgICAgICAgICAgICBzelRtcCBbTUFYX1BBVEhdOworICAgIEJPT0wgICAgICAgICAgICAgICAgICAgICAgYk9rOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgaSwgaWk7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICBqLCBqajsKKworICAgIC8qIGZyZWUgcHJldmlvdXMgZmlsZS1saXN0ICovCisKKyAgICBpZiAoKnBwRmlsZUxpc3QgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGZyZWUgKCpwcEZpbGVMaXN0KTsKKyAgICAgICAgKnBwRmlsZUxpc3QgPSBOVUxMOworICAgIH0KKworICAgIC8qIGV4dHJhY3QgZm9sZGVybmFtZSwgZmlsZW5hbWUgYW5kIHNlYXJjaC1uYW1lICovCisKKyAgICBzdHJjcHkgKHN6SW1nUGF0aE5hbWUsIHBzdHJQYXRoTmFtZSk7CisgICAgc3RyY3B5IChzekltZ0ZpbGVOYW1lLCBzdHJyY2hyIChwc3RyUGF0aE5hbWUsICdcXCcpICsgMSk7CisKKyAgICBzdHJjcHkgKHN6SW1nRmluZE5hbWUsIHN6SW1nUGF0aE5hbWUpOworICAgICooc3RycmNociAoc3pJbWdGaW5kTmFtZSwgJ1xcJykgKyAxKSA9ICdcMCc7CisgICAgc3RyY2F0IChzekltZ0ZpbmROYW1lLCAiKi5wbmciKTsKKworICAgIC8qIGZpcnN0IGN5Y2xlOiBjb3VudCBudW1iZXIgb2YgZmlsZXMgaW4gZGlyZWN0b3J5IGZvciBtZW1vcnkgYWxsb2NhdGlvbiAqLworCisgICAgKnBGaWxlQ291bnQgPSAwOworCisgICAgaEZpbmQgPSBGaW5kRmlyc3RGaWxlKHN6SW1nRmluZE5hbWUsICZmaW5kZGF0YSk7CisgICAgYk9rID0gKGhGaW5kICE9IChIQU5ETEUpIC0xKTsKKworICAgIHdoaWxlIChiT2spCisgICAgeworICAgICAgICAqcEZpbGVDb3VudCArPSAxOworICAgICAgICBiT2sgPSBGaW5kTmV4dEZpbGUoaEZpbmQsICZmaW5kZGF0YSk7CisgICAgfQorICAgIEZpbmRDbG9zZShoRmluZCk7CisKKyAgICAvKiBhbGxvY2F0aW9uIG1lbW9yeSBmb3IgZmlsZS1saXN0ICovCisKKyAgICAqcHBGaWxlTGlzdCA9IChUQ0hBUiAqKSBtYWxsb2MgKCpwRmlsZUNvdW50ICogTUFYX1BBVEgpOworCisgICAgLyogc2Vjb25kIGN5Y2xlOiByZWFkIGRpcmVjdG9yeSBhbmQgc3RvcmUgZmlsZW5hbWVzIGluIGZpbGUtbGlzdCAqLworCisgICAgaEZpbmQgPSBGaW5kRmlyc3RGaWxlKHN6SW1nRmluZE5hbWUsICZmaW5kZGF0YSk7CisgICAgYk9rID0gKGhGaW5kICE9IChIQU5ETEUpIC0xKTsKKworICAgIGkgPSAwOworICAgIGlpID0gMDsKKyAgICB3aGlsZSAoYk9rKQorICAgIHsKKyAgICAgICAgc3RyY3B5ICgqcHBGaWxlTGlzdCArIGlpLCBzekltZ1BhdGhOYW1lKTsKKyAgICAgICAgc3RyY3B5IChzdHJyY2hyKCpwcEZpbGVMaXN0ICsgaWksICdcXCcpICsgMSwgZmluZGRhdGEuY0ZpbGVOYW1lKTsKKworICAgICAgICBpZiAoc3RyY21wKHBzdHJQYXRoTmFtZSwgKnBwRmlsZUxpc3QgKyBpaSkgPT0gMCkKKyAgICAgICAgICAgICpwRmlsZUluZGV4ID0gaTsKKworICAgICAgICBpaSArPSBNQVhfUEFUSDsKKyAgICAgICAgaSsrOworCisgICAgICAgIGJPayA9IEZpbmROZXh0RmlsZShoRmluZCwgJmZpbmRkYXRhKTsKKyAgICB9CisgICAgRmluZENsb3NlKGhGaW5kKTsKKworICAgIC8qIGZpbmFsbHkgd2UgbXVzdCBzb3J0IHRoZSBmaWxlLWxpc3QgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCAqcEZpbGVDb3VudCAtIDE7IGkrKykKKyAgICB7CisgICAgICAgIGlpID0gaSAqIE1BWF9QQVRIOworICAgICAgICBmb3IgKGogPSBpKzE7IGogPCAqcEZpbGVDb3VudDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBqaiA9IGogKiBNQVhfUEFUSDsKKyAgICAgICAgICAgIGlmIChzdHJjbXAgKCpwcEZpbGVMaXN0ICsgaWksICpwcEZpbGVMaXN0ICsgamopID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJjcHkgKHN6VG1wLCAqcHBGaWxlTGlzdCArIGpqKTsKKyAgICAgICAgICAgICAgICBzdHJjcHkgKCpwcEZpbGVMaXN0ICsgamosICpwcEZpbGVMaXN0ICsgaWkpOworICAgICAgICAgICAgICAgIHN0cmNweSAoKnBwRmlsZUxpc3QgKyBpaSwgc3pUbXApOworCisgICAgICAgICAgICAgICAgLyogY2hlY2sgaWYgdGhpcyB3YXMgdGhlIGN1cnJlbnQgaW1hZ2UgdGhhdCB3ZSBtb3ZlZCAqLworCisgICAgICAgICAgICAgICAgaWYgKCpwRmlsZUluZGV4ID09IGkpCisgICAgICAgICAgICAgICAgICAgICpwRmlsZUluZGV4ID0gajsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGlmICgqcEZpbGVJbmRleCA9PSBqKQorICAgICAgICAgICAgICAgICAgICAgICAgKnBGaWxlSW5kZXggPSBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLQorICogIFNlYXJjaFBuZ0xpc3QKKyAqLS0tLS0tLS0tLS0tLS0tLQorICovCisKK0JPT0wgU2VhcmNoUG5nTGlzdCAoCisgICAgICAgIFRDSEFSICpwRmlsZUxpc3QsIGludCBGaWxlQ291bnQsIGludCAqcEZpbGVJbmRleCwKKyAgICAgICAgUFRTVFIgcHN0clByZXZOYW1lLCBQVFNUUiBwc3RyTmV4dE5hbWUpCit7CisgICAgaWYgKEZpbGVDb3VudCA+IDApCisgICAgeworICAgICAgICAvKiBnZXQgcHJldmlvdXMgZW50cnkgKi8KKworICAgICAgICBpZiAocHN0clByZXZOYW1lICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgqcEZpbGVJbmRleCA+IDApCisgICAgICAgICAgICAgICAgKnBGaWxlSW5kZXggLT0gMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAqcEZpbGVJbmRleCA9IEZpbGVDb3VudCAtIDE7CisKKyAgICAgICAgICAgIHN0cmNweSAocHN0clByZXZOYW1lLCBwRmlsZUxpc3QgKyAoKnBGaWxlSW5kZXggKiBNQVhfUEFUSCkpOworICAgICAgICB9CisKKyAgICAgICAgLyogZ2V0IG5leHQgZW50cnkgKi8KKworICAgICAgICBpZiAocHN0ck5leHROYW1lICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgqcEZpbGVJbmRleCA8IEZpbGVDb3VudCAtIDEpCisgICAgICAgICAgICAgICAgKnBGaWxlSW5kZXggKz0gMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAqcEZpbGVJbmRleCA9IDA7CisKKyAgICAgICAgICAgIHN0cmNweSAocHN0ck5leHROYW1lLCBwRmlsZUxpc3QgKyAoKnBGaWxlSW5kZXggKiBNQVhfUEFUSCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBMb2FkSW1hZ2VGaWxlCisgKi0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworQk9PTCBMb2FkSW1hZ2VGaWxlIChIV05EIGh3bmQsIFBUU1RSIHBzdHJQYXRoTmFtZSwKKyAgICAgICAgICAgICAgICBwbmdfYnl0ZSAqKnBwYkltYWdlLCBpbnQgKnB4SW1nU2l6ZSwgaW50ICpweUltZ1NpemUsCisgICAgICAgICAgICAgICAgaW50ICpwaUNoYW5uZWxzLCBwbmdfY29sb3IgKnBCa2dDb2xvcikKK3sKKyAgICBzdGF0aWMgVENIQVIgc3pUbXAgW01BWF9QQVRIXTsKKworICAgIC8qIGlmIHRoZXJlJ3MgYW4gZXhpc3RpbmcgUE5HLCBmcmVlIHRoZSBtZW1vcnkgKi8KKworICAgIGlmICgqcHBiSW1hZ2UpCisgICAgeworICAgICAgICBmcmVlICgqcHBiSW1hZ2UpOworICAgICAgICAqcHBiSW1hZ2UgPSBOVUxMOworICAgIH0KKworICAgIC8qIExvYWQgdGhlIGVudGlyZSBQTkcgaW50byBtZW1vcnkgKi8KKworICAgIFNldEN1cnNvciAoTG9hZEN1cnNvciAoTlVMTCwgSURDX1dBSVQpKTsKKyAgICBTaG93Q3Vyc29yIChUUlVFKTsKKworICAgIFBuZ0xvYWRJbWFnZSAocHN0clBhdGhOYW1lLCBwcGJJbWFnZSwgcHhJbWdTaXplLCBweUltZ1NpemUsIHBpQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICBwQmtnQ29sb3IpOworCisgICAgU2hvd0N1cnNvciAoRkFMU0UpOworICAgIFNldEN1cnNvciAoTG9hZEN1cnNvciAoTlVMTCwgSURDX0FSUk9XKSk7CisKKyAgICBpZiAoKnBwYkltYWdlICE9IE5VTEwpCisgICAgeworICAgICAgICBzcHJpbnRmIChzelRtcCwgIlZpc3VhbFBuZyAtICVzIiwgc3RycmNocihwc3RyUGF0aE5hbWUsICdcXCcpICsgMSk7CisgICAgICAgIFNldFdpbmRvd1RleHQgKGh3bmQsIHN6VG1wKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTWVzc2FnZUJveCAoaHduZCwgVEVYVCAoIkVycm9yIGluIGxvYWRpbmcgdGhlIFBORyBpbWFnZSIpLAorICAgICAgICAgICAgc3pQcm9nTmFtZSwgTUJfSUNPTkVYQ0xBTUFUSU9OIHwgTUJfT0spOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLQorICogIERpc3BsYXlJbWFnZQorICotLS0tLS0tLS0tLS0tLS0tCisgKi8KK0JPT0wgRGlzcGxheUltYWdlIChIV05EIGh3bmQsIEJZVEUgKipwcERpYiwKKyAgICAgICAgQllURSAqKnBwRGlEYXRhLCBpbnQgY3hXaW5TaXplLCBpbnQgY3lXaW5TaXplLAorICAgICAgICBCWVRFICpwYkltYWdlLCBpbnQgY3hJbWdTaXplLCBpbnQgY3lJbWdTaXplLCBpbnQgY0ltZ0NoYW5uZWxzLAorICAgICAgICBCT09MIGJTdHJldGNoZWQpCit7CisgICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgKnBEaWIgPSAqcHBEaWI7CisgICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgKnBEaURhdGEgPSAqcHBEaURhdGE7CisgICAgLyogQklUTUFQRklMRUhFQURFUiAgICAgICAgKnBibWZoOyAqLworICAgIEJJVE1BUElORk9IRUFERVIgICAgICAgICAgICpwYm1paDsKKyAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgd0RJUm93Qnl0ZXM7CisgICAgcG5nX2NvbG9yICAgICAgICAgICAgICAgICAgIGJrZ0JsYWNrID0gezAsIDAsIDB9OworICAgIHBuZ19jb2xvciAgICAgICAgICAgICAgICAgICBia2dHcmF5ICA9IHsxMjcsIDEyNywgMTI3fTsKKyAgICBwbmdfY29sb3IgICAgICAgICAgICAgICAgICAgYmtnV2hpdGUgPSB7MjU1LCAyNTUsIDI1NX07CisKKyAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBEZXZpY2UgSW5kZXBlbmRhbnQgYml0bWFwICovCisKKyAgICB3RElSb3dCeXRlcyA9IChXT1JEKSAoKDMgKiBjeFdpblNpemUgKyAzTCkgPj4gMikgPDwgMjsKKworICAgIGlmIChwRGliKQorICAgIHsKKyAgICAgICAgZnJlZSAocERpYik7CisgICAgICAgIHBEaWIgPSBOVUxMOworICAgIH0KKworICAgIGlmICghKHBEaWIgPSAoQllURSAqKSBtYWxsb2MgKHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSArCisgICAgICAgIHdESVJvd0J5dGVzICogY3lXaW5TaXplKSkpCisgICAgeworICAgICAgICBNZXNzYWdlQm94IChod25kLCBURVhUICgiRXJyb3IgaW4gZGlzcGxheWluZyB0aGUgUE5HIGltYWdlIiksCisgICAgICAgICAgICBzelByb2dOYW1lLCBNQl9JQ09ORVhDTEFNQVRJT04gfCBNQl9PSyk7CisgICAgICAgICpwcERpYiA9IHBEaWIgPSBOVUxMOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgICpwcERpYiA9IHBEaWI7CisgICAgbWVtc2V0IChwRGliLCAwLCBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpOworCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgZGliLXN0cnVjdHVyZSAqLworCisgICAgcGJtaWggPSAoQklUTUFQSU5GT0hFQURFUiAqKSBwRGliOworICAgIHBibWloLT5iaVNpemUgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7CisgICAgcGJtaWgtPmJpV2lkdGggPSBjeFdpblNpemU7CisgICAgcGJtaWgtPmJpSGVpZ2h0ID0gLSgobG9uZykgY3lXaW5TaXplKTsKKyAgICBwYm1paC0+YmlQbGFuZXMgPSAxOworICAgIHBibWloLT5iaUJpdENvdW50ID0gMjQ7CisgICAgcGJtaWgtPmJpQ29tcHJlc3Npb24gPSAwOworICAgIHBEaURhdGEgPSBwRGliICsgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOworICAgICpwcERpRGF0YSA9IHBEaURhdGE7CisKKyAgICAvKiBmaXJzdCBmaWxsIGJpdG1hcCB3aXRoIGdyYXkgYW5kIGltYWdlIGJvcmRlciAqLworCisgICAgSW5pdEJpdG1hcCAocERpRGF0YSwgY3hXaW5TaXplLCBjeVdpblNpemUpOworCisgICAgLyogdGhlbiBmaWxsIGJpdG1hcCB3aXRoIGltYWdlICovCisKKyAgICBpZiAocGJJbWFnZSkKKyAgICB7CisgICAgICAgIEZpbGxCaXRtYXAgKAorICAgICAgICAgICAgcERpRGF0YSwgY3hXaW5TaXplLCBjeVdpblNpemUsCisgICAgICAgICAgICBwYkltYWdlLCBjeEltZ1NpemUsIGN5SW1nU2l6ZSwgY0ltZ0NoYW5uZWxzLAorICAgICAgICAgICAgYlN0cmV0Y2hlZCk7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0KKyAqICBJbml0Qml0bWFwCisgKi0tLS0tLS0tLS0tLS0tCisgKi8KK0JPT0wgSW5pdEJpdG1hcCAoQllURSAqcERpRGF0YSwgaW50IGN4V2luU2l6ZSwgaW50IGN5V2luU2l6ZSkKK3sKKyAgICBCWVRFICpkc3Q7CisgICAgaW50IHgsIHksIGNvbDsKKworICAgIC8qIGluaXRpYWxpemUgdGhlIGJhY2tncm91bmQgd2l0aCBncmF5ICovCisKKyAgICBkc3QgPSBwRGlEYXRhOworICAgIGZvciAoeSA9IDA7IHkgPCBjeVdpblNpemU7IHkrKykKKyAgICB7CisgICAgICAgIGNvbCA9IDA7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBjeFdpblNpemU7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogZmlsbCB3aXRoIEdSQVkgKi8KKyAgICAgICAgICAgICpkc3QrKyA9IDEyNzsKKyAgICAgICAgICAgICpkc3QrKyA9IDEyNzsKKyAgICAgICAgICAgICpkc3QrKyA9IDEyNzsKKyAgICAgICAgICAgIGNvbCArPSAzOworICAgICAgICB9CisgICAgICAgIC8qIHJvd3Mgc3RhcnQgb24gNCBieXRlIGJvdW5kYXJpZXMgKi8KKyAgICAgICAgd2hpbGUgKChjb2wgJSA0KSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBkc3QrKzsKKyAgICAgICAgICAgIGNvbCsrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0KKyAqICBGaWxsQml0bWFwCisgKi0tLS0tLS0tLS0tLS0tCisgKi8KK0JPT0wgRmlsbEJpdG1hcCAoCisgICAgICAgIEJZVEUgKnBEaURhdGEsIGludCBjeFdpblNpemUsIGludCBjeVdpblNpemUsCisgICAgICAgIEJZVEUgKnBiSW1hZ2UsIGludCBjeEltZ1NpemUsIGludCBjeUltZ1NpemUsIGludCBjSW1nQ2hhbm5lbHMsCisgICAgICAgIEJPT0wgYlN0cmV0Y2hlZCkKK3sKKyAgICBCWVRFICpwU3RyZXRjaGVkSW1hZ2U7CisgICAgQllURSAqcEltZzsKKyAgICBCWVRFICpzcmMsICpkc3Q7CisgICAgQllURSByLCBnLCBiLCBhOworICAgIGNvbnN0IGludCBjRElDaGFubmVscyA9IDM7CisgICAgV09SRCB3SW1nUm93Qnl0ZXM7CisgICAgV09SRCB3RElSb3dCeXRlczsKKyAgICBpbnQgY3hOZXdTaXplLCBjeU5ld1NpemU7CisgICAgaW50IGN4SW1nUG9zLCBjeUltZ1BvczsKKyAgICBpbnQgeEltZywgeUltZzsKKyAgICBpbnQgeFdpbiwgeVdpbjsKKyAgICBpbnQgeE9sZCwgeU9sZDsKKyAgICBpbnQgeE5ldywgeU5ldzsKKworICAgIGlmIChiU3RyZXRjaGVkKQorICAgIHsKKyAgICAgICAgY3hOZXdTaXplID0gY3hXaW5TaXplIC0gMiAqIE1BUkdJTjsKKyAgICAgICAgY3lOZXdTaXplID0gY3lXaW5TaXplIC0gMiAqIE1BUkdJTjsKKworICAgICAgICAvKiBzdHJldGNoIHRoZSBpbWFnZSB0byBpdCdzIHdpbmRvdyBkZXRlcm1pbmVkIHNpemUgKi8KKworICAgICAgICAvKiB0aGUgZm9sbG93aW5nIHR3byBhcmUgbWF0aGVtYXRpY2FsbHkgdGhlIHNhbWUsIGJ1dCB0aGUgZmlyc3QKKyAgICAgICAgICogaGFzIHNpZGUtZWZmZWN0cyBiZWNhdXNlIG9mIHJvdW5kaW5nCisgICAgICAgICAqLworLyogICAgICBpZiAoKGN5TmV3U2l6ZSAvIGN4TmV3U2l6ZSkgPiAoY3lJbWdTaXplIC8gY3hJbWdTaXplKSkgKi8KKyAgICAgICAgaWYgKChjeU5ld1NpemUgKiBjeEltZ1NpemUpID4gKGN5SW1nU2l6ZSAqIGN4TmV3U2l6ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGN5TmV3U2l6ZSA9IGN4TmV3U2l6ZSAqIGN5SW1nU2l6ZSAvIGN4SW1nU2l6ZTsKKyAgICAgICAgICAgIGN4SW1nUG9zID0gTUFSR0lOOworICAgICAgICAgICAgY3lJbWdQb3MgPSAoY3lXaW5TaXplIC0gY3lOZXdTaXplKSAvIDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjeE5ld1NpemUgPSBjeU5ld1NpemUgKiBjeEltZ1NpemUgLyBjeUltZ1NpemU7CisgICAgICAgICAgICBjeUltZ1BvcyA9IE1BUkdJTjsKKyAgICAgICAgICAgIGN4SW1nUG9zID0gKGN4V2luU2l6ZSAtIGN4TmV3U2l6ZSkgLyAyOworICAgICAgICB9CisKKyAgICAgICAgcFN0cmV0Y2hlZEltYWdlID0gbWFsbG9jIChjSW1nQ2hhbm5lbHMgKiBjeE5ld1NpemUgKiBjeU5ld1NpemUpOworICAgICAgICBwSW1nID0gcFN0cmV0Y2hlZEltYWdlOworCisgICAgICAgIGZvciAoeU5ldyA9IDA7IHlOZXcgPCBjeU5ld1NpemU7IHlOZXcrKykKKyAgICAgICAgeworICAgICAgICAgICAgeU9sZCA9IHlOZXcgKiBjeUltZ1NpemUgLyBjeU5ld1NpemU7CisgICAgICAgICAgICBmb3IgKHhOZXcgPSAwOyB4TmV3IDwgY3hOZXdTaXplOyB4TmV3KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeE9sZCA9IHhOZXcgKiBjeEltZ1NpemUgLyBjeE5ld1NpemU7CisKKyAgICAgICAgICAgICAgICByID0gKihwYkltYWdlICsgY0ltZ0NoYW5uZWxzICogKCh5T2xkICogY3hJbWdTaXplKSArIHhPbGQpICsgMCk7CisgICAgICAgICAgICAgICAgZyA9ICoocGJJbWFnZSArIGNJbWdDaGFubmVscyAqICgoeU9sZCAqIGN4SW1nU2l6ZSkgKyB4T2xkKSArIDEpOworICAgICAgICAgICAgICAgIGIgPSAqKHBiSW1hZ2UgKyBjSW1nQ2hhbm5lbHMgKiAoKHlPbGQgKiBjeEltZ1NpemUpICsgeE9sZCkgKyAyKTsKKyAgICAgICAgICAgICAgICAqcEltZysrID0gcjsKKyAgICAgICAgICAgICAgICAqcEltZysrID0gZzsKKyAgICAgICAgICAgICAgICAqcEltZysrID0gYjsKKyAgICAgICAgICAgICAgICBpZiAoY0ltZ0NoYW5uZWxzID09IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhID0gKihwYkltYWdlICsgY0ltZ0NoYW5uZWxzICogKCh5T2xkICogY3hJbWdTaXplKSArIHhPbGQpCisgICAgICAgICAgICAgICAgICAgICAgICArIDMpOworICAgICAgICAgICAgICAgICAgICAqcEltZysrID0gYTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBjYWxjdWxhdGUgcm93LWJ5dGVzICovCisKKyAgICAgICAgd0ltZ1Jvd0J5dGVzID0gY0ltZ0NoYW5uZWxzICogY3hOZXdTaXplOworICAgICAgICB3RElSb3dCeXRlcyA9IChXT1JEKSAoKGNESUNoYW5uZWxzICogY3hXaW5TaXplICsgM0wpID4+IDIpIDw8IDI7CisKKyAgICAgICAgLyogY29weSBpbWFnZSB0byBzY3JlZW4gKi8KKworICAgICAgICBmb3IgKHlJbWcgPSAwLCB5V2luID0gY3lJbWdQb3M7IHlJbWcgPCBjeU5ld1NpemU7IHlJbWcrKywgeVdpbisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoeVdpbiA+PSBjeVdpblNpemUgLSBjeUltZ1BvcykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHNyYyA9IHBTdHJldGNoZWRJbWFnZSArIHlJbWcgKiB3SW1nUm93Qnl0ZXM7CisgICAgICAgICAgICBkc3QgPSBwRGlEYXRhICsgeVdpbiAqIHdESVJvd0J5dGVzICsgY3hJbWdQb3MgKiBjRElDaGFubmVsczsKKworICAgICAgICAgICAgZm9yICh4SW1nID0gMCwgeFdpbiA9IGN4SW1nUG9zOyB4SW1nIDwgY3hOZXdTaXplOyB4SW1nKyssIHhXaW4rKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoeFdpbiA+PSBjeFdpblNpemUgLSBjeEltZ1BvcykKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgciA9ICpzcmMrKzsKKyAgICAgICAgICAgICAgICBnID0gKnNyYysrOworICAgICAgICAgICAgICAgIGIgPSAqc3JjKys7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gYjsgLyogbm90ZSB0aGUgcmV2ZXJzZSBvcmRlciAgKi8KKyAgICAgICAgICAgICAgICAqZHN0KysgPSBnOworICAgICAgICAgICAgICAgICpkc3QrKyA9IHI7CisgICAgICAgICAgICAgICAgaWYgKGNJbWdDaGFubmVscyA9PSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYSA9ICpzcmMrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBmcmVlIG1lbW9yeSAqLworCisgICAgICAgIGlmIChwU3RyZXRjaGVkSW1hZ2UgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgZnJlZSAocFN0cmV0Y2hlZEltYWdlKTsKKyAgICAgICAgICAgIHBTdHJldGNoZWRJbWFnZSA9IE5VTEw7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qIHByb2Nlc3MgdGhlIGltYWdlIG5vdC1zdHJldGNoZWQgKi8KKworICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgY2VudHJhbCBwb3NpdGlvbiAqLworCisgICAgICAgIGN4SW1nUG9zID0gKGN4V2luU2l6ZSAtIGN4SW1nU2l6ZSkgLyAyOworICAgICAgICBjeUltZ1BvcyA9IChjeVdpblNpemUgLSBjeUltZ1NpemUpIC8gMjsKKworICAgICAgICAvKiBjaGVjayBmb3IgaW1hZ2UgbGFyZ2VyIHRoYW4gd2luZG93ICovCisKKyAgICAgICAgaWYgKGN4SW1nUG9zIDwgTUFSR0lOKQorICAgICAgICAgICAgY3hJbWdQb3MgPSBNQVJHSU47CisgICAgICAgIGlmIChjeUltZ1BvcyA8IE1BUkdJTikKKyAgICAgICAgICAgIGN5SW1nUG9zID0gTUFSR0lOOworCisgICAgICAgIC8qIGNhbGN1bGF0ZSBib3RoIHJvdy1ieXRlcyAqLworCisgICAgICAgIHdJbWdSb3dCeXRlcyA9IGNJbWdDaGFubmVscyAqIGN4SW1nU2l6ZTsKKyAgICAgICAgd0RJUm93Qnl0ZXMgPSAoV09SRCkgKChjRElDaGFubmVscyAqIGN4V2luU2l6ZSArIDNMKSA+PiAyKSA8PCAyOworCisgICAgICAgIC8qIGNvcHkgaW1hZ2UgdG8gc2NyZWVuICovCisKKyAgICAgICAgZm9yICh5SW1nID0gMCwgeVdpbiA9IGN5SW1nUG9zOyB5SW1nIDwgY3lJbWdTaXplOyB5SW1nKyssIHlXaW4rKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHlXaW4gPj0gY3lXaW5TaXplIC0gTUFSR0lOKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgc3JjID0gcGJJbWFnZSArIHlJbWcgKiB3SW1nUm93Qnl0ZXM7CisgICAgICAgICAgICBkc3QgPSBwRGlEYXRhICsgeVdpbiAqIHdESVJvd0J5dGVzICsgY3hJbWdQb3MgKiBjRElDaGFubmVsczsKKworICAgICAgICAgICAgZm9yICh4SW1nID0gMCwgeFdpbiA9IGN4SW1nUG9zOyB4SW1nIDwgY3hJbWdTaXplOyB4SW1nKyssIHhXaW4rKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoeFdpbiA+PSBjeFdpblNpemUgLSBNQVJHSU4pCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHIgPSAqc3JjKys7CisgICAgICAgICAgICAgICAgZyA9ICpzcmMrKzsKKyAgICAgICAgICAgICAgICBiID0gKnNyYysrOworICAgICAgICAgICAgICAgICpkc3QrKyA9IGI7IC8qIG5vdGUgdGhlIHJldmVyc2Ugb3JkZXIgICovCisgICAgICAgICAgICAgICAgKmRzdCsrID0gZzsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSByOworICAgICAgICAgICAgICAgIGlmIChjSW1nQ2hhbm5lbHMgPT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGEgPSAqc3JjKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBlbmQgb2Ygc291cmNlCisgKi0tLS0tLS0tLS0tLS0tLS0tCisgKi8KZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLmRzcCBiL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDFlZjZjCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvdmlzdXBuZy9WaXN1YWxQbmcuZHNwCkBAIC0wLDAgKzEsMTQ3IEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9IlZpc3VhbFBuZyIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCisjICoqIERPIE5PVCBFRElUICoqDQorDQorIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQXBwbGljYXRpb24iIDB4MDEwMQ0KKw0KK0NGRz1WaXN1YWxQbmcgLSBXaW4zMiBEZWJ1Zw0KKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwNCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4NCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAiVmlzdWFsUG5nLm1hayIuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UNCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJWaXN1YWxQbmcubWFrIiBDRkc9IlZpc3VhbFBuZyAtIFdpbjMyIERlYnVnIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJWaXN1YWxQbmcgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSAiVmlzdWFsUG5nIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQXBwbGljYXRpb24iKQ0KKyFNRVNTQUdFIA0KKw0KKyMgQmVnaW4gUHJvamVjdA0KKyMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwDQorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIg0KKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiDQorQ1BQPWNsLmV4ZQ0KK01UTD1taWRsLmV4ZQ0KK1JTQz1yYy5leGUNCisNCishSUYgICIkKENGRykiID09ICJWaXN1YWxQbmcgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgQkFTRSBJZ25vcmVfRXhwb3J0X0xpYiAwDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9PMiAvSSAiLi5cLi4iIC9JICIuLlwuLlwuLlx6bGliIiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJQTkdfTk9fU1RESU8iIC9GRCAvYw0KKyMgU1VCVFJBQ1QgQkFTRSBDUFAgL1lYDQorIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0kgIi4uXC4uIiAvSSAiLi5cLi5cLi5cemxpYiIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiUE5HX05PX1NURElPIiAvRkQgL2MNCisjIFNVQlRSQUNUIENQUCAvWVgNCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzINCisjIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvbWFjaGluZTpJMzg2DQorIyBBREQgTElOSzMyIC4uXC4uXHByb2plY3RzXHZpc3VhbGM2XFdpbjMyX0xJQl9SZWxlYXNlXGxpYnBuZy5saWIgLi5cLi5cLi5cemxpYlxwcm9qZWN0c1x2aXN1YWxjNlxXaW4zMl9MSUJfUmVsZWFzZVx6bGliLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvbWFjaGluZTpJMzg2DQorIyBCZWdpbiBTcGVjaWFsIEJ1aWxkIFRvb2wNCitPdXREaXI9LlxSZWxlYXNlDQorU09VUkNFPSIkKElucHV0UGF0aCkiDQorUG9zdEJ1aWxkX0NtZHM9JChvdXRkaXIpXFZpc3VhbFBuZy5leGUgLi5cLi5cY29udHJpYlxwbmdzdWl0ZVxiYXNuNmExNi5wbmcNCisjIEVuZCBTcGVjaWFsIEJ1aWxkIFRvb2wNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiVmlzdWFsUG5nIC0gV2luMzIgRGVidWciDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQorIyBQUk9QIEJBU0UgSWdub3JlX0V4cG9ydF9MaWIgMA0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvWkkgL09kIC9JICIuLlwuLiIgL0kgIi4uXC4uXC4uXHpsaWIiIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIlBOR19OT19TVERJTyIgL0ZEIC9HWiAvYw0KKyMgU1VCVFJBQ1QgQkFTRSBDUFAgL1lYDQorIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9aSSAvT2QgL0kgIi4uXC4uIiAvSSAiLi5cLi5cLi5cemxpYiIgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiUE5HX05PX1NURElPIiAvRkQgL0daIC9jDQorIyBTVUJUUkFDVCBDUFAgL1lYDQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyDQorIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMg0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KKyMgQUREIExJTkszMiAuLlwuLlxwcm9qZWN0c1x2aXN1YWxjNlxXaW4zMl9MSUJfUmVsZWFzZVxsaWJwbmcubGliIC4uXC4uXC4uXHpsaWJccHJvamVjdHNcdmlzdWFsYzZcV2luMzJfTElCX1JlbGVhc2VcemxpYi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RlYnVnIC9tYWNoaW5lOkkzODYgL25vZGVmYXVsdGxpYjoibXN2Y3J0LmxpYiIgL3BkYnR5cGU6c2VwdA0KKyMgQmVnaW4gU3BlY2lhbCBCdWlsZCBUb29sDQorT3V0RGlyPS5cRGVidWcNCitTT1VSQ0U9IiQoSW5wdXRQYXRoKSINCitQb3N0QnVpbGRfQ21kcz0kKG91dGRpcilcVmlzdWFsUG5nLmV4ZSAuLlwuLlxjb250cmliXHBuZ3N1aXRlXGJhc242YTE2LnBuZw0KKyMgRW5kIFNwZWNpYWwgQnVpbGQgVG9vbA0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAiVmlzdWFsUG5nIC0gV2luMzIgUmVsZWFzZSINCisjIE5hbWUgIlZpc3VhbFBuZyAtIFdpbjMyIERlYnVnIg0KKyMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFBuZ0ZpbGUuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFZpc3VhbFBuZy5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGNleGNlcHQuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFBuZ0ZpbGUuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc291cmNlLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFZpc3VhbFBuZy5pY28NCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxWaXN1YWxQbmcucmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBFbmQgVGFyZ2V0DQorIyBFbmQgUHJvamVjdA0KZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLmRzdyBiL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLmRzdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzBlMWNjCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvdmlzdXBuZy9WaXN1YWxQbmcuZHN3CkBAIC0wLDAgKzEsMjkgQEAKK01pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFdvcmtzcGFjZSBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyBXQVJOSU5HOiBETyBOT1QgRURJVCBPUiBERUxFVEUgVEhJUyBXT1JLU1BBQ0UgRklMRSENCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogIlZpc3VhbFBuZyI9LlxWaXN1YWxQbmcuZHNwIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK0dsb2JhbDoNCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDM+DQore3t7DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLmljbyBiL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLmljbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGFhMzcxCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvdmlzdXBuZy9WaXN1YWxQbmcuaWNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLnBuZyBiL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmFhODBhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvdmlzdXBuZy9WaXN1YWxQbmcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLnJjIGIvbGlicG5nL2NvbnRyaWIvdmlzdXBuZy9WaXN1YWxQbmcucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUwNjIzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLnJjCkBAIC0wLDAgKzEsMTUyIEBACisvL01pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIGdlbmVyYXRlZCByZXNvdXJjZSBzY3JpcHQuDQorLy8NCisjaW5jbHVkZSAicmVzb3VyY2UuaCINCisNCisjZGVmaW5lIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vDQorLy8gR2VuZXJhdGVkIGZyb20gdGhlIFRFWFRJTkNMVURFIDIgcmVzb3VyY2UuDQorLy8NCisjaW5jbHVkZSAiYWZ4cmVzLmgiDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisjdW5kZWYgQVBTVFVESU9fUkVBRE9OTFlfU1lNQk9MUw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gRW5nbGlzaCAoVS5TLikgcmVzb3VyY2VzDQorDQorI2lmICFkZWZpbmVkKEFGWF9SRVNPVVJDRV9ETEwpIHx8IGRlZmluZWQoQUZYX1RBUkdfRU5VKQ0KKyNpZmRlZiBfV0lOMzINCitMQU5HVUFHRSBMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VUw0KKyNwcmFnbWEgY29kZV9wYWdlKDEyNTIpDQorI2VuZGlmIC8vX1dJTjMyDQorDQorI2lmZGVmIEFQU1RVRElPX0lOVk9LRUQNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vDQorLy8gVEVYVElOQ0xVREUNCisvLw0KKw0KKzEgVEVYVElOQ0xVREUgRElTQ0FSREFCTEUgDQorQkVHSU4NCisgICAgInJlc291cmNlLmhcMCINCitFTkQNCisNCisyIFRFWFRJTkNMVURFIERJU0NBUkRBQkxFIA0KK0JFR0lODQorICAgICIjaW5jbHVkZSAiImFmeHJlcy5oIiJcclxuIg0KKyAgICAiXDAiDQorRU5EDQorDQorMyBURVhUSU5DTFVERSBESVNDQVJEQUJMRSANCitCRUdJTg0KKyAgICAiXHJcbiINCisgICAgIlwwIg0KK0VORA0KKw0KKyNlbmRpZiAgICAvLyBBUFNUVURJT19JTlZPS0VEDQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLw0KKy8vIE1lbnUNCisvLw0KKw0KK1ZJU1VBTFBORyBNRU5VIERJU0NBUkRBQkxFIA0KK0JFR0lODQorICAgIFBPUFVQICImRmlsZSINCisgICAgQkVHSU4NCisgICAgICAgIE1FTlVJVEVNICImT3BlbiBJbWFnZS4uLlx0Q3RybCtPIiwgICAgICBJRE1fRklMRV9PUEVODQorICAgICAgICBNRU5VSVRFTSAiU2F2ZSAmQXMuLi4iLCAgICAgICAgICAgICAgICAgSURNX0ZJTEVfU0FWRQ0KKyAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SDQorICAgICAgICBNRU5VSVRFTSAiJk5leHQgSW1hZ2VcdEN0cmwrTiIsICAgICAgICAgSURNX0ZJTEVfTkVYVA0KKyAgICAgICAgTUVOVUlURU0gIlByZSZ2aW91cyBJbWFnZVx0Q3RybCtWIiwgICAgIElETV9GSUxFX1BSRVZJT1VTDQorICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1INCisgICAgICAgIE1FTlVJVEVNICJFJnhpdFx0QWx0K1giLCAgICAgICAgICAgICAgICBJRE1fRklMRV9FWElUDQorICAgIEVORA0KKyAgICBQT1BVUCAiJk9wdGlvbnMiDQorICAgIEJFR0lODQorICAgICAgICBNRU5VSVRFTSAiJlN0cmV0Y2giLCAgICAgICAgICAgICAgICAgICAgSURNX09QVElPTlNfU1RSRVRDSCwgQ0hFQ0tFRA0KKyAgICBFTkQNCisgICAgUE9QVVAgIiZIZWxwIg0KKyAgICBCRUdJTg0KKyAgICAgICAgTUVOVUlURU0gIiZBYm91dCIsICAgICAgICAgICAgICAgICAgICAgIElETV9IRUxQX0FCT1VUDQorICAgIEVORA0KK0VORA0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8NCisvLyBBY2NlbGVyYXRvcg0KKy8vDQorDQorVklTVUFMUE5HIEFDQ0VMRVJBVE9SUyBESVNDQVJEQUJMRSANCitCRUdJTg0KKyAgICAiTiIsICAgICAgICAgICAgSURNX0ZJTEVfTkVYVCwgICAgICAgICAgVklSVEtFWSwgQ09OVFJPTCwgTk9JTlZFUlQNCisgICAgIk8iLCAgICAgICAgICAgIElETV9GSUxFX09QRU4sICAgICAgICAgIFZJUlRLRVksIENPTlRST0wsIE5PSU5WRVJUDQorICAgICJQIiwgICAgICAgICAgICBJRE1fRklMRV9QUkVWSU9VUywgICAgICBWSVJUS0VZLCBDT05UUk9MLCBOT0lOVkVSVA0KKyAgICAiViIsICAgICAgICAgICAgSURNX0ZJTEVfUFJFVklPVVMsICAgICAgVklSVEtFWSwgQ09OVFJPTCwgTk9JTlZFUlQNCisgICAgIlgiLCAgICAgICAgICAgIElETV9GSUxFX0VYSVQsICAgICAgICAgIFZJUlRLRVksIEFMVCwgTk9JTlZFUlQNCitFTkQNCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vDQorLy8gSWNvbg0KKy8vDQorDQorLy8gSWNvbiB3aXRoIGxvd2VzdCBJRCB2YWx1ZSBwbGFjZWQgZmlyc3QgdG8gZW5zdXJlIGFwcGxpY2F0aW9uIGljb24NCisvLyByZW1haW5zIGNvbnNpc3RlbnQgb24gYWxsIHN5c3RlbXMuDQorVklTVUFMUE5HICAgICAgICAgICAgICAgSUNPTiAgICBESVNDQVJEQUJMRSAgICAgIlZpc3VhbFBuZy5pY28iDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLw0KKy8vIERpYWxvZw0KKy8vDQorDQorQUJPVVRCT1ggRElBTE9HIERJU0NBUkRBQkxFICAwLCAwLCAxODYsIDk0DQorU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQDQorRk9OVCA4LCAiTVMgU2FucyBTZXJpZiINCitCRUdJTg0KKyAgICBERUZQVVNIQlVUVE9OICAgIk9LIixJRE9LLDY4LDY3LDUwLDE0DQorICAgIENURVhUICAgICAgICAgICAiVmlzdWFsUG5nIDEuMCAgLSAgSnVuZSAyMDAwIixJRENfU1RBVElDLDQ5LDE0LDg4LDgNCisgICAgTFRFWFQgICAgICAgICAgICJhIFBORyBpbWFnZSB2aWV3ZXIiLElEQ19TVEFUSUMsNjAsMzAsNjYsOA0KKyAgICBMVEVYVCAgICAgICAgICAgIihjKSBXaWxsZW0gdmFuIFNjaGFpaywgMjAwMCIsSURDX1NUQVRJQyw0OCw1Miw5MCw4DQorICAgIExURVhUICAgICAgICAgICAidG8gZGVtb25zdHJhdGUgdGhlIHVzZSBvZiBsaWJwbmcgaW4gVmlzdWFsIEMiLA0KKyAgICAgICAgICAgICAgICAgICAgSURDX1NUQVRJQywyNSwzOCwxMzYsOA0KK0VORA0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8NCisvLyBERVNJR05JTkZPDQorLy8NCisNCisjaWZkZWYgQVBTVFVESU9fSU5WT0tFRA0KK0dVSURFTElORVMgREVTSUdOSU5GTyBESVNDQVJEQUJMRSANCitCRUdJTg0KKyAgICAiQUJPVVRCT1giLCBESUFMT0cNCisgICAgQkVHSU4NCisgICAgICAgIExFRlRNQVJHSU4sIDcNCisgICAgICAgIFJJR0hUTUFSR0lOLCAxNzkNCisgICAgICAgIFRPUE1BUkdJTiwgNw0KKyAgICAgICAgQk9UVE9NTUFSR0lOLCA4Nw0KKyAgICBFTkQNCitFTkQNCisjZW5kaWYgICAgLy8gQVBTVFVESU9fSU5WT0tFRA0KKw0KKyNlbmRpZiAgICAvLyBFbmdsaXNoIChVLlMuKSByZXNvdXJjZXMNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KKw0KKw0KKyNpZm5kZWYgQVBTVFVESU9fSU5WT0tFRA0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8NCisvLyBHZW5lcmF0ZWQgZnJvbSB0aGUgVEVYVElOQ0xVREUgMyByZXNvdXJjZS4NCisvLw0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorI2VuZGlmICAgIC8vIG5vdCBBUFNUVURJT19JTlZPS0VEDQorDQpkaWZmIC0tZ2l0IGEvbGlicG5nL2NvbnRyaWIvdmlzdXBuZy9jZXhjZXB0LmggYi9saWJwbmcvY29udHJpYi92aXN1cG5nL2NleGNlcHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjQ1ZDc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL2NvbnRyaWIvdmlzdXBuZy9jZXhjZXB0LmgKQEAgLTAsMCArMSwyNDggQEAKKy8qPT09CitjZXhjZXB0LmggMi4wLjEgKDIwMDgtSnVsLTE5LVNhdCkKK2h0dHA6Ly93d3cubmljZW1pY2UubmV0L2NleGNlcHQvCitBZGFtIE0uIENvc3RlbGxvCitodHRwOi8vd3d3Lm5pY2VtaWNlLm5ldC9hbWMvCisKK0FuIGludGVyZmFjZSBmb3IgZXhjZXB0aW9uLWhhbmRsaW5nIGluIEFOU0kgQyAoQzg5IGFuZCBzdWJzZXF1ZW50IElTTworc3RhbmRhcmRzKSwgZGV2ZWxvcGVkIGpvaW50bHkgd2l0aCBDb3NtaW4gVHJ1dGEuCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwOCBBZGFtIE0uIENvc3RlbGxvIGFuZCBDb3NtaW4gVHJ1dGEuCisgICAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgbW9kaWZpZWQgb25seSBpZiBpdHMgYXV0aG9yIGFuZCB2ZXJzaW9uCisgICAgaW5mb3JtYXRpb24gaXMgdXBkYXRlZCBhY2N1cmF0ZWx5LCBhbmQgbWF5IGJlIHJlZGlzdHJpYnV0ZWQKKyAgICBvbmx5IGlmIGFjY29tcGFuaWVkIGJ5IHRoaXMgdW5hbHRlcmVkIG5vdGljZS4gIFN1YmplY3QgdG8gdGhvc2UKKyAgICByZXN0cmljdGlvbnMsIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gZG8gYW55dGhpbmcKKyAgICB3aXRoIHRoaXMgc29mdHdhcmUuICBUaGUgY29weXJpZ2h0IGhvbGRlcnMgbWFrZSBubyBndWFyYW50ZWVzCisgICAgcmVnYXJkaW5nIHRoaXMgc29mdHdhcmUsIGFuZCBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBhbnkgZGFtYWdlCisgICAgcmVzdWx0aW5nIGZyb20gaXRzIHVzZS4KKworVGhlIGNleGNlcHQgaW50ZXJmYWNlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggYW5kIGNhbm5vdCBpbnRlcmFjdAord2l0aCBzeXN0ZW0gZXhjZXB0aW9ucyAobGlrZSBkaXZpc2lvbiBieSB6ZXJvIG9yIG1lbW9yeSBzZWdtZW50YXRpb24KK3Zpb2xhdGlvbiksIGNvbXBpbGVyLWdlbmVyYXRlZCBleGNlcHRpb25zIChsaWtlIEMrKyBleGNlcHRpb25zKSwgb3IKK290aGVyIGV4Y2VwdGlvbi1oYW5kbGluZyBpbnRlcmZhY2VzLgorCitXaGVuIHVzaW5nIHRoaXMgaW50ZXJmYWNlIGFjcm9zcyBtdWx0aXBsZSAuYyBmaWxlcywgZG8gbm90IGluY2x1ZGUKK3RoaXMgaGVhZGVyIGZpbGUgZGlyZWN0bHkuICBJbnN0ZWFkLCBjcmVhdGUgYSB3cmFwcGVyIGhlYWRlciBmaWxlIHRoYXQKK2luY2x1ZGVzIHRoaXMgaGVhZGVyIGZpbGUgYW5kIHRoZW4gaW52b2tlcyB0aGUgZGVmaW5lX2V4Y2VwdGlvbl90eXBlCittYWNybyAoc2VlIGJlbG93KS4gIFRoZSAuYyBmaWxlcyBzaG91bGQgdGhlbiBpbmNsdWRlIHRoYXQgaGVhZGVyIGZpbGUuCisKK1RoZSBpbnRlcmZhY2UgY29uc2lzdHMgb2Ygb25lIHR5cGUsIG9uZSB3ZWxsLWtub3duIG5hbWUsIGFuZCBzaXggbWFjcm9zLgorCisKK2RlZmluZV9leGNlcHRpb25fdHlwZSh0eXBlX25hbWUpOworCisgICAgVGhpcyBtYWNybyBpcyB1c2VkIGxpa2UgYW4gZXh0ZXJuYWwgZGVjbGFyYXRpb24uICBJdCBzcGVjaWZpZXMKKyAgICB0aGUgdHlwZSBvZiBvYmplY3QgdGhhdCBnZXRzIGNvcGllZCBmcm9tIHRoZSBleGNlcHRpb24gdGhyb3dlciB0bworICAgIHRoZSBleGNlcHRpb24gY2F0Y2hlci4gIFRoZSB0eXBlX25hbWUgY2FuIGJlIGFueSB0eXBlIHRoYXQgY2FuIGJlCisgICAgYXNzaWduZWQgdG8sIHRoYXQgaXMsIGEgbm9uLWNvbnN0YW50IGFyaXRobWV0aWMgdHlwZSwgc3RydWN0LCB1bmlvbiwKKyAgICBvciBwb2ludGVyLiAgRXhhbXBsZXM6CisKKyAgICAgICAgZGVmaW5lX2V4Y2VwdGlvbl90eXBlKGludCk7CisKKyAgICAgICAgZW51bSBleGNlcHRpb24geyBvdXRfb2ZfbWVtb3J5LCBiYWRfYXJndW1lbnRzLCBkaXNrX2Z1bGwgfTsKKyAgICAgICAgZGVmaW5lX2V4Y2VwdGlvbl90eXBlKGVudW0gZXhjZXB0aW9uKTsKKworICAgICAgICBzdHJ1Y3QgZXhjZXB0aW9uIHsgaW50IGNvZGU7IGNvbnN0IGNoYXIgKm1zZzsgfTsKKyAgICAgICAgZGVmaW5lX2V4Y2VwdGlvbl90eXBlKHN0cnVjdCBleGNlcHRpb24pOworCisgICAgQmVjYXVzZSB0aHJvd2luZyBhbiBleGNlcHRpb24gY2F1c2VzIHRoZSBvYmplY3QgdG8gYmUgY29waWVkIChub3QKKyAgICBqdXN0IG9uY2UsIGJ1dCB0d2ljZSksIHByb2dyYW1tZXJzIG1heSB3aXNoIHRvIGNvbnNpZGVyIHNpemUgd2hlbgorICAgIGNob29zaW5nIHRoZSBleGNlcHRpb24gdHlwZS4KKworCitzdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQ7CisKKyAgICBUaGlzIHR5cGUgbWF5IGJlIHVzZWQgYWZ0ZXIgdGhlIGRlZmluZV9leGNlcHRpb25fdHlwZSgpIG1hY3JvIGhhcworICAgIGJlZW4gaW52b2tlZC4gIEEgc3RydWN0IGV4Y2VwdGlvbl9jb250ZXh0IG11c3QgYmUga25vd24gdG8gYm90aAorICAgIHRoZSB0aHJvd2VyIGFuZCB0aGUgY2F0Y2hlci4gIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlcmUgYmUgb25lCisgICAgY29udGV4dCBmb3IgZWFjaCB0aHJlYWQgdGhhdCB1c2VzIGV4Y2VwdGlvbnMuICBJdCB3b3VsZCBjZXJ0YWlubHkKKyAgICBiZSBkYW5nZXJvdXMgZm9yIG11bHRpcGxlIHRocmVhZHMgdG8gYWNjZXNzIHRoZSBzYW1lIGNvbnRleHQuCisgICAgT25lIHRocmVhZCBjYW4gdXNlIG11bHRpcGxlIGNvbnRleHRzLCBidXQgdGhhdCBpcyBsaWtlbHkgdG8gYmUKKyAgICBjb25mdXNpbmcgYW5kIG5vdCB0eXBpY2FsbHkgdXNlZnVsLiAgVGhlIGFwcGxpY2F0aW9uIGNhbiBhbGxvY2F0ZQorICAgIHRoaXMgc3RydWN0dXJlIGluIGFueSB3YXkgaXQgcGxlYXNlcy0tYXV0b21hdGljLCBzdGF0aWMsIG9yIGR5bmFtaWMuCisgICAgVGhlIGFwcGxpY2F0aW9uIHByb2dyYW1tZXIgc2hvdWxkIHByZXRlbmQgbm90IHRvIGtub3cgdGhlIHN0cnVjdHVyZQorICAgIG1lbWJlcnMsIHdoaWNoIGFyZSBzdWJqZWN0IHRvIGNoYW5nZS4KKworCitzdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQgKnRoZV9leGNlcHRpb25fY29udGV4dDsKKworICAgIFRoZSBUcnkvQ2F0Y2ggYW5kIFRocm93IHN0YXRlbWVudHMgKGRlc2NyaWJlZCBiZWxvdykgaW1wbGljaXRseQorICAgIHJlZmVyIHRvIGEgY29udGV4dCwgdXNpbmcgdGhlIG5hbWUgdGhlX2V4Y2VwdGlvbl9jb250ZXh0LiAgSXQgaXMKKyAgICB0aGUgYXBwbGljYXRpb24ncyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgdGhhdCB0aGlzIG5hbWUgeWllbGRzCisgICAgdGhlIGFkZHJlc3Mgb2YgYSBtdXRhYmxlIChub24tY29uc3RhbnQpIHN0cnVjdCBleGNlcHRpb25fY29udGV4dAorICAgIHdoZXJldmVyIHRob3NlIHN0YXRlbWVudHMgYXJlIHVzZWQuICBTdWJqZWN0IHRvIHRoYXQgY29uc3RyYWludCwgdGhlCisgICAgYXBwbGljYXRpb24gbWF5IGRlY2xhcmUgYSB2YXJpYWJsZSBvZiB0aGlzIG5hbWUgYW55d2hlcmUgaXQgbGlrZXMKKyAgICAoaW5zaWRlIGEgZnVuY3Rpb24sIGluIGEgcGFyYW1ldGVyIGxpc3QsIG9yIGV4dGVybmFsbHkpLCBhbmQgbWF5CisgICAgdXNlIHdoYXRldmVyIHN0b3JhZ2UgY2xhc3Mgc3BlY2lmaWVycyAoc3RhdGljLCBleHRlcm4sIGV0Yykgb3IgdHlwZQorICAgIHF1YWxpZmllcnMgKGNvbnN0LCB2b2xhdGlsZSwgZXRjKSBpdCBsaWtlcy4gIEV4YW1wbGVzOgorCisgICAgICAgIHN0YXRpYyBzdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQKKyAgICAgICAgICAqIGNvbnN0IHRoZV9leGNlcHRpb25fY29udGV4dCA9ICZmb287CisKKyAgICAgICAgeyBzdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQgKnRoZV9leGNlcHRpb25fY29udGV4dCA9IGJhcjsgLi4uIH0KKworICAgICAgICBpbnQgYmxhaChzdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQgKnRoZV9leGNlcHRpb25fY29udGV4dCwgLi4uKTsKKworICAgICAgICBleHRlcm4gc3RydWN0IGV4Y2VwdGlvbl9jb250ZXh0IHRoZV9leGNlcHRpb25fY29udGV4dFsxXTsKKworICAgIFRoZSBsYXN0IGV4YW1wbGUgaWxsdXN0cmF0ZXMgYSB0cmljayB0aGF0IGF2b2lkcyBjcmVhdGluZyBhIHBvaW50ZXIKKyAgICBvYmplY3Qgc2VwYXJhdGUgZnJvbSB0aGUgc3RydWN0dXJlIG9iamVjdC4KKworICAgIFRoZSBuYW1lIGNvdWxkIGV2ZW4gYmUgYSBtYWNybywgZm9yIGV4YW1wbGU6CisKKyAgICAgICAgc3RydWN0IGV4Y2VwdGlvbl9jb250ZXh0IGVjX2FycmF5W251bXRocmVhZHNdOworICAgICAgICAjZGVmaW5lIHRoZV9leGNlcHRpb25fY29udGV4dCAoZWNfYXJyYXkgKyB0aHJlYWRfaWQpCisKKyAgICBCZSBhd2FyZSB0aGF0IHRoZV9leGNlcHRpb25fY29udGV4dCBpcyB1c2VkIHNldmVyYWwgdGltZXMgYnkgdGhlCisgICAgVHJ5L0NhdGNoL1Rocm93IG1hY3Jvcywgc28gaXQgc2hvdWxkbid0IGJlIGV4cGVuc2l2ZSBvciBoYXZlIHNpZGUKKyAgICBlZmZlY3RzLiAgVGhlIGV4cGFuc2lvbiBtdXN0IGJlIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgYW4KKyAgICBpZGVudGlmaWVyLCBzbyBpdCdzIHNhZmVzdCB0byBwdXQgcGFyZW50aGVzZXMgYXJvdW5kIGl0LgorCisKK3ZvaWQgaW5pdF9leGNlcHRpb25fY29udGV4dChzdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQgKmVjKTsKKworICAgIEZvciBjb250ZXh0IHN0cnVjdHVyZXMgYWxsb2NhdGVkIHN0YXRpY2FsbHkgKGJ5IGFuIGV4dGVybmFsCisgICAgZGVmaW5pdGlvbiBvciB1c2luZyB0aGUgInN0YXRpYyIga2V5d29yZCksIHRoZSBpbXBsaWNpdAorICAgIGluaXRpYWxpemF0aW9uIHRvIGFsbCB6ZXJvcyBpcyBzdWZmaWNpZW50LCBidXQgY29udGV4dHMgYWxsb2NhdGVkCisgICAgYnkgb3RoZXIgbWVhbnMgbXVzdCBiZSBpbml0aWFsaXplZCB1c2luZyB0aGlzIG1hY3JvIGJlZm9yZSB0aGV5CisgICAgYXJlIHVzZWQgYnkgYSBUcnkvQ2F0Y2ggc3RhdGVtZW50LiAgSXQgZG9lcyBubyBoYXJtIHRvIGluaXRpYWxpemUKKyAgICBhIGNvbnRleHQgbW9yZSB0aGFuIG9uY2UgKGJ5IHVzaW5nIHRoaXMgbWFjcm8gb24gYSBzdGF0aWNhbGx5CisgICAgYWxsb2NhdGVkIGNvbnRleHQsIG9yIHVzaW5nIHRoaXMgbWFjcm8gdHdpY2Ugb24gdGhlIHNhbWUgY29udGV4dCksCisgICAgYnV0IGEgY29udGV4dCBtdXN0IG5vdCBiZSByZS1pbml0aWFsaXplZCBhZnRlciBpdCBoYXMgYmVlbiB1c2VkIGJ5IGEKKyAgICBUcnkvQ2F0Y2ggc3RhdGVtZW50LgorCisKK1RyeSBzdGF0ZW1lbnQKK0NhdGNoIChleHByZXNzaW9uKSBzdGF0ZW1lbnQKKworICAgIFRoZSBUcnkvQ2F0Y2gvVGhyb3cgbWFjcm9zIGFyZSBjYXBpdGFsaXplZCBpbiBvcmRlciB0byBhdm9pZAorICAgIGNvbmZ1c2lvbiB3aXRoIHRoZSBDKysga2V5d29yZHMsIHdoaWNoIGhhdmUgc3VidGx5IGRpZmZlcmVudAorICAgIHNlbWFudGljcy4KKworICAgIEEgVHJ5L0NhdGNoIHN0YXRlbWVudCBoYXMgYSBzeW50YXggc2ltaWxhciB0byBhbiBpZi9lbHNlIHN0YXRlbWVudCwKKyAgICBleGNlcHQgdGhhdCB0aGUgcGFyZW50aGVzaXplZCBleHByZXNzaW9uIGdvZXMgYWZ0ZXIgdGhlIHNlY29uZAorICAgIGtleXdvcmQgcmF0aGVyIHRoYW4gdGhlIGZpcnN0LiAgQXMgd2l0aCBpZi9lbHNlLCB0aGVyZSBhcmUgdHdvCisgICAgY2xhdXNlcywgZWFjaCBvZiB3aGljaCBtYXkgYmUgYSBzaW1wbGUgc3RhdGVtZW50IGVuZGluZyB3aXRoIGEKKyAgICBzZW1pY29sb24gb3IgYSBicmFjZS1lbmNsb3NlZCBjb21wb3VuZCBzdGF0ZW1lbnQuICBCdXQgd2hlcmVhcworICAgIHRoZSBlbHNlIGNsYXVzZSBpcyBvcHRpb25hbCwgdGhlIENhdGNoIGNsYXVzZSBpcyByZXF1aXJlZC4gIFRoZQorICAgIGV4cHJlc3Npb24gbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlIChzb21ldGhpbmcgY2FwYWJsZSBvZiBiZWluZworICAgIGFzc2lnbmVkIHRvKSBvZiB0aGUgc2FtZSB0eXBlIChkaXNyZWdhcmRpbmcgdHlwZSBxdWFsaWZpZXJzKSB0aGF0CisgICAgd2FzIHBhc3NlZCB0byBkZWZpbmVfZXhjZXB0aW9uX3R5cGUoKS4KKworICAgIElmIGEgVGhyb3cgdGhhdCB1c2VzIHRoZSBzYW1lIGV4Y2VwdGlvbiBjb250ZXh0IGFzIHRoZSBUcnkvQ2F0Y2ggaXMKKyAgICBleGVjdXRlZCB3aXRoaW4gdGhlIFRyeSBjbGF1c2UgKHR5cGljYWxseSB3aXRoaW4gYSBmdW5jdGlvbiBjYWxsZWQKKyAgICBieSB0aGUgVHJ5IGNsYXVzZSksIGFuZCB0aGUgZXhjZXB0aW9uIGlzIG5vdCBjYXVnaHQgYnkgYSBuZXN0ZWQKKyAgICBUcnkvQ2F0Y2ggc3RhdGVtZW50LCB0aGVuIGEgY29weSBvZiB0aGUgZXhjZXB0aW9uIHdpbGwgYmUgYXNzaWduZWQKKyAgICB0byB0aGUgZXhwcmVzc2lvbiwgYW5kIGNvbnRyb2wgd2lsbCBqdW1wIHRvIHRoZSBDYXRjaCBjbGF1c2UuICBJZiBubworICAgIHN1Y2ggVGhyb3cgaXMgZXhlY3V0ZWQsIHRoZW4gdGhlIGFzc2lnbm1lbnQgaXMgbm90IHBlcmZvcm1lZCwgYW5kCisgICAgdGhlIENhdGNoIGNsYXVzZSBpcyBub3QgZXhlY3V0ZWQuCisKKyAgICBUaGUgZXhwcmVzc2lvbiBpcyBub3QgZXZhbHVhdGVkIHVubGVzcyBhbmQgdW50aWwgdGhlIGV4Y2VwdGlvbiBpcworICAgIGNhdWdodCwgd2hpY2ggaXMgc2lnbmlmaWNhbnQgaWYgaXQgaGFzIHNpZGUgZWZmZWN0cywgZm9yIGV4YW1wbGU6CisKKyAgICAgICAgVHJ5IGZvbygpOworICAgICAgICBDYXRjaCAocFsrK2ldLmUpIHsgLi4uIH0KKworICAgIElNUE9SVEFOVDogSnVtcGluZyBpbnRvIG9yIG91dCBvZiBhIFRyeSBjbGF1c2UgKGZvciBleGFtcGxlIHZpYQorICAgIHJldHVybiwgYnJlYWssIGNvbnRpbnVlLCBnb3RvLCBsb25nam1wKSBpcyBmb3JiaWRkZW4tLXRoZSBjb21waWxlcgorICAgIHdpbGwgbm90IGNvbXBsYWluLCBidXQgYmFkIHRoaW5ncyB3aWxsIGhhcHBlbiBhdCBydW4tdGltZS4gIEp1bXBpbmcKKyAgICBpbnRvIG9yIG91dCBvZiBhIENhdGNoIGNsYXVzZSBpcyBva2F5LCBhbmQgc28gaXMganVtcGluZyBhcm91bmQKKyAgICBpbnNpZGUgYSBUcnkgY2xhdXNlLiAgSW4gbWFueSBjYXNlcyB3aGVyZSBvbmUgaXMgdGVtcHRlZCB0byByZXR1cm4KKyAgICBmcm9tIGEgVHJ5IGNsYXVzZSwgaXQgd2lsbCBzdWZmaWNlIHRvIHVzZSBUaHJvdywgYW5kIHRoZW4gcmV0dXJuCisgICAgZnJvbSB0aGUgQ2F0Y2ggY2xhdXNlLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gc2V0IGEgZmxhZyB2YXJpYWJsZSBhbmQKKyAgICB1c2UgZ290byB0byBqdW1wIHRvIHRoZSBlbmQgb2YgdGhlIFRyeSBjbGF1c2UsIHRoZW4gY2hlY2sgdGhlIGZsYWcKKyAgICBhZnRlciB0aGUgVHJ5L0NhdGNoIHN0YXRlbWVudC4KKworICAgIElNUE9SVEFOVDogVGhlIHZhbHVlcyBvZiBhbnkgbm9uLXZvbGF0aWxlIGF1dG9tYXRpYyB2YXJpYWJsZXMKKyAgICBjaGFuZ2VkIHdpdGhpbiB0aGUgVHJ5IGNsYXVzZSBhcmUgdW5kZWZpbmVkIGFmdGVyIGFuIGV4Y2VwdGlvbiBpcworICAgIGNhdWdodC4gIFRoZXJlZm9yZSwgdmFyaWFibGVzIG1vZGlmaWVkIGluc2lkZSB0aGUgVHJ5IGJsb2NrIHdob3NlCisgICAgdmFsdWVzIGFyZSBuZWVkZWQgbGF0ZXIgb3V0c2lkZSB0aGUgVHJ5IGJsb2NrIG11c3QgZWl0aGVyIHVzZSBzdGF0aWMKKyAgICBzdG9yYWdlIG9yIGJlIGRlY2xhcmVkIHdpdGggdGhlICJ2b2xhdGlsZSIgdHlwZSBxdWFsaWZpZXIuCisKKworVGhyb3cgZXhwcmVzc2lvbjsKKworICAgIEEgVGhyb3cgc3RhdGVtZW50IGlzIHZlcnkgbXVjaCBsaWtlIGEgcmV0dXJuIHN0YXRlbWVudCwgZXhjZXB0IHRoYXQKKyAgICB0aGUgZXhwcmVzc2lvbiBpcyByZXF1aXJlZC4gIFdoZXJlYXMgcmV0dXJuIGp1bXBzIGJhY2sgdG8gdGhlIHBsYWNlCisgICAgd2hlcmUgdGhlIGN1cnJlbnQgZnVuY3Rpb24gd2FzIGNhbGxlZCwgVGhyb3cganVtcHMgYmFjayB0byB0aGUgQ2F0Y2gKKyAgICBjbGF1c2Ugb2YgdGhlIGlubmVybW9zdCBlbmNsb3NpbmcgVHJ5IGNsYXVzZS4gIFRoZSBleHByZXNzaW9uIG11c3QKKyAgICBiZSBjb21wYXRpYmxlIHdpdGggdGhlIHR5cGUgcGFzc2VkIHRvIGRlZmluZV9leGNlcHRpb25fdHlwZSgpLiAgVGhlCisgICAgZXhjZXB0aW9uIG11c3QgYmUgY2F1Z2h0LCBvdGhlcndpc2UgdGhlIHByb2dyYW0gbWF5IGNyYXNoLgorCisgICAgU2xpZ2h0IGxpbWl0YXRpb246ICBJZiB0aGUgZXhwcmVzc2lvbiBpcyBhIGNvbW1hLWV4cHJlc3Npb24sIGl0IG11c3QKKyAgICBiZSBlbmNsb3NlZCBpbiBwYXJlbnRoZXNlcy4KKworCitUcnkgc3RhdGVtZW50CitDYXRjaF9hbm9ueW1vdXMgc3RhdGVtZW50CisKKyAgICBXaGVuIHRoZSB2YWx1ZSBvZiB0aGUgZXhjZXB0aW9uIGlzIG5vdCBuZWVkZWQsIGEgVHJ5L0NhdGNoIHN0YXRlbWVudAorICAgIGNhbiB1c2UgQ2F0Y2hfYW5vbnltb3VzIGluc3RlYWQgb2YgQ2F0Y2ggKGV4cHJlc3Npb24pLgorCisKK0V2ZXJ5dGhpbmcgYmVsb3cgdGhpcyBwb2ludCBpcyBmb3IgdGhlIGJlbmVmaXQgb2YgdGhlIGNvbXBpbGVyLiAgVGhlCithcHBsaWNhdGlvbiBwcm9ncmFtbWVyIHNob3VsZCBwcmV0ZW5kIG5vdCB0byBrbm93IGFueSBvZiBpdCwgYmVjYXVzZSBpdAoraXMgc3ViamVjdCB0byBjaGFuZ2UuCisKKz09PSovCisKKworI2lmbmRlZiBDRVhDRVBUX0gKKyNkZWZpbmUgQ0VYQ0VQVF9ICisKKworI2luY2x1ZGUgPHNldGptcC5oPgorCisjZGVmaW5lIGRlZmluZV9leGNlcHRpb25fdHlwZShldHlwZSkgXAorc3RydWN0IGV4Y2VwdGlvbl9jb250ZXh0IHsgXAorICBqbXBfYnVmICpwZW52OyBcCisgIGludCBjYXVnaHQ7IFwKKyAgdm9sYXRpbGUgc3RydWN0IHsgZXR5cGUgZXRtcDsgfSB2OyBcCit9CisKKy8qIGV0bXAgbXVzdCBiZSB2b2xhdGlsZSBiZWNhdXNlIHRoZSBhcHBsaWNhdGlvbiBtaWdodCB1c2UgYXV0b21hdGljICovCisvKiBzdG9yYWdlIGZvciB0aGVfZXhjZXB0aW9uX2NvbnRleHQsIGFuZCBldG1wIGlzIG1vZGlmaWVkIGJldHdlZW4gICAqLworLyogdGhlIGNhbGxzIHRvIHNldGptcCgpIGFuZCBsb25nam1wKCkuICBBIHdyYXBwZXIgc3RydWN0IGlzIHVzZWQgdG8gKi8KKy8qIGF2b2lkIHdhcm5pbmdzIGFib3V0IGEgZHVwbGljYXRlIHZvbGF0aWxlIHF1YWxpZmllciBpbiBjYXNlIGV0eXBlICovCisvKiBhbHJlYWR5IGluY2x1ZGVzIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIGluaXRfZXhjZXB0aW9uX2NvbnRleHQoZWMpICgodm9pZCkoKGVjKS0+cGVudiA9IDApKQorCisjZGVmaW5lIFRyeSBcCisgIHsgXAorICAgIGptcF9idWYgKmV4Y2VwdGlvbl9fcHJldiwgZXhjZXB0aW9uX19lbnY7IFwKKyAgICBleGNlcHRpb25fX3ByZXYgPSB0aGVfZXhjZXB0aW9uX2NvbnRleHQtPnBlbnY7IFwKKyAgICB0aGVfZXhjZXB0aW9uX2NvbnRleHQtPnBlbnYgPSAmZXhjZXB0aW9uX19lbnY7IFwKKyAgICBpZiAoc2V0am1wKGV4Y2VwdGlvbl9fZW52KSA9PSAwKSB7IFwKKyAgICAgIGRvCisKKyNkZWZpbmUgZXhjZXB0aW9uX19jYXRjaChhY3Rpb24pIFwKKyAgICAgIHdoaWxlICh0aGVfZXhjZXB0aW9uX2NvbnRleHQtPmNhdWdodCA9IDAsIFwKKyAgICAgICAgICAgICB0aGVfZXhjZXB0aW9uX2NvbnRleHQtPmNhdWdodCk7IFwKKyAgICB9IFwKKyAgICBlbHNlIHsgXAorICAgICAgdGhlX2V4Y2VwdGlvbl9jb250ZXh0LT5jYXVnaHQgPSAxOyBcCisgICAgfSBcCisgICAgdGhlX2V4Y2VwdGlvbl9jb250ZXh0LT5wZW52ID0gZXhjZXB0aW9uX19wcmV2OyBcCisgIH0gXAorICBpZiAoIXRoZV9leGNlcHRpb25fY29udGV4dC0+Y2F1Z2h0IHx8IGFjdGlvbikgeyB9IFwKKyAgZWxzZQorCisjZGVmaW5lIENhdGNoKGUpIGV4Y2VwdGlvbl9fY2F0Y2goKChlKSA9IHRoZV9leGNlcHRpb25fY29udGV4dC0+di5ldG1wLCAwKSkKKyNkZWZpbmUgQ2F0Y2hfYW5vbnltb3VzIGV4Y2VwdGlvbl9fY2F0Y2goMCkKKworLyogVHJ5IGVuZHMgd2l0aCBkbywgYW5kIENhdGNoIGJlZ2lucyB3aXRoIHdoaWxlKDApIGFuZCBlbmRzIHdpdGggICAgICovCisvKiBlbHNlLCB0byBlbnN1cmUgdGhhdCBUcnkvQ2F0Y2ggc3ludGF4IGlzIHNpbWlsYXIgdG8gaWYvZWxzZSAgICAgICAgKi8KKy8qIHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGUgMCBpbiB3aGlsZSgwKSBpcyBleHByZXNzZWQgYXMgeD0wLHggaW4gb3JkZXIgdG8gYXBwZWFzZSAgICAgICAgKi8KKy8qIGNvbXBpbGVycyB0aGF0IHdhcm4gYWJvdXQgY29uc3RhbnQgZXhwcmVzc2lvbnMgaW5zaWRlIHdoaWxlKCkuICAgICAqLworLyogTW9zdCBjb21waWxlcnMgc2hvdWxkIHN0aWxsIHJlY29nbml6ZSB0aGF0IHRoZSBjb25kaXRpb24gaXMgYWx3YXlzICovCisvKiBmYWxzZSBhbmQgYXZvaWQgZ2VuZXJhdGluZyBjb2RlIGZvciBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBUaHJvdyBcCisgIGZvciAoOzsgbG9uZ2ptcCgqdGhlX2V4Y2VwdGlvbl9jb250ZXh0LT5wZW52LCAxKSkgXAorICAgIHRoZV9leGNlcHRpb25fY29udGV4dC0+di5ldG1wID0KKworCisjZW5kaWYgLyogQ0VYQ0VQVF9IICovCmRpZmYgLS1naXQgYS9saWJwbmcvY29udHJpYi92aXN1cG5nL3Jlc291cmNlLmggYi9saWJwbmcvY29udHJpYi92aXN1cG5nL3Jlc291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYyMTc2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvcmVzb3VyY2UuaApAQCAtMCwwICsxLDIzIEBACisvL3t7Tk9fREVQRU5ERU5DSUVTfX0KKy8vIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIGdlbmVyYXRlZCBpbmNsdWRlIGZpbGUuCisvLyBVc2VkIGJ5IFZpc3VhbFBuZy5yYworLy8KKyNkZWZpbmUgSURNX0ZJTEVfT1BFTiAgICAgICAgICAgICAgICAgICA0MDAwMQorI2RlZmluZSBJRE1fRklMRV9TQVZFICAgICAgICAgICAgICAgICAgIDQwMDAyCisjZGVmaW5lIElETV9GSUxFX05FWFQgICAgICAgICAgICAgICAgICAgNDAwMDMKKyNkZWZpbmUgSURNX0ZJTEVfUFJFVklPVVMgICAgICAgICAgICAgICA0MDAwNAorI2RlZmluZSBJRE1fRklMRV9FWElUICAgICAgICAgICAgICAgICAgIDQwMDA1CisjZGVmaW5lIElETV9PUFRJT05TX0JBQ0tHUk9VTkQgICAgICAgICAgNDAwMDYKKyNkZWZpbmUgSURNX09QVElPTlNfU1RSRVRDSCAgICAgICAgICAgICA0MDAwNworI2RlZmluZSBJRE1fSEVMUF9BQk9VVCAgICAgICAgICAgICAgICAgIDQwMDA4CisKKy8vIE5leHQgZGVmYXVsdCB2YWx1ZXMgZm9yIG5ldyBvYmplY3RzCisvLworI2lmZGVmIEFQU1RVRElPX0lOVk9LRUQKKyNpZm5kZWYgQVBTVFVESU9fUkVBRE9OTFlfU1lNQk9MUworI2RlZmluZSBfQVBTX05FWFRfUkVTT1VSQ0VfVkFMVUUgICAgICAgIDExMworI2RlZmluZSBfQVBTX05FWFRfQ09NTUFORF9WQUxVRSAgICAgICAgIDQwMDA5CisjZGVmaW5lIF9BUFNfTkVYVF9DT05UUk9MX1ZBTFVFICAgICAgICAgMTAwMQorI2RlZmluZSBfQVBTX05FWFRfU1lNRURfVkFMVUUgICAgICAgICAgIDEwMQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnBuZy9leGFtcGxlLmMgYi9saWJwbmcvZXhhbXBsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NTkxZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvZXhhbXBsZS5jCkBAIC0wLDAgKzEsMTA2MSBAQAorCisjaWYgMCAvKiBpbiBjYXNlIHNvbWVvbmUgYWN0dWFsbHkgdHJpZXMgdG8gY29tcGlsZSB0aGlzICovCisKKy8qIGV4YW1wbGUuYyAtIGFuIGV4YW1wbGUgb2YgdXNpbmcgbGlicG5nCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4xNSBbTm92ZW1iZXIgMjAsIDIwMTRdCisgKiBNYWludGFpbmVkIDE5OTgtMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAqIE1haW50YWluZWQgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKKyAqIFdyaXR0ZW4gMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCisgKiBUbyB0aGUgZXh0ZW50IHBvc3NpYmxlIHVuZGVyIGxhdywgdGhlIGF1dGhvcnMgaGF2ZSB3YWl2ZWQKKyAqIGFsbCBjb3B5cmlnaHQgYW5kIHJlbGF0ZWQgb3IgbmVpZ2hib3JpbmcgcmlnaHRzIHRvIHRoaXMgZmlsZS4KKyAqIFRoaXMgd29yayBpcyBwdWJsaXNoZWQgZnJvbTogVW5pdGVkIFN0YXRlcy4KKyAqLworCisvKiBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBsaWJwbmcgdG8gcmVhZCBhbmQgd3JpdGUgUE5HIGZpbGVzLgorICogVGhlIGZpbGUgbGlicG5nLW1hbnVhbC50eHQgaXMgbXVjaCBtb3JlIHZlcmJvc2UgdGhlbiB0aGlzLiAgSWYgeW91IGhhdmUgbm90CisgKiByZWFkIGl0LCBkbyBzbyBmaXJzdC4gIFRoaXMgd2FzIGRlc2lnbmVkIHRvIGJlIGEgc3RhcnRpbmcgcG9pbnQgb2YgYW4KKyAqIGltcGxlbWVudGF0aW9uLiAgVGhpcyBpcyBub3Qgb2ZmaWNpYWxseSBwYXJ0IG9mIGxpYnBuZywgaXMgaGVyZWJ5IHBsYWNlZAorICogaW4gdGhlIHB1YmxpYyBkb21haW4sIGFuZCB0aGVyZWZvcmUgZG9lcyBub3QgcmVxdWlyZSBhIGNvcHlyaWdodCBub3RpY2UuCisgKgorICogVGhpcyBmaWxlIGRvZXMgbm90IGN1cnJlbnRseSBjb21waWxlLCBiZWNhdXNlIGl0IGlzIG1pc3NpbmcgY2VydGFpbgorICogcGFydHMsIGxpa2UgYWxsb2NhdGluZyBtZW1vcnkgdG8gaG9sZCBhbiBpbWFnZS4gIFlvdSB3aWxsIGhhdmUgdG8KKyAqIHN1cHBseSB0aGVzZSBwYXJ0cyB0byBnZXQgaXQgdG8gY29tcGlsZS4gIEZvciBhbiBleGFtcGxlIG9mIGEgbWluaW1hbAorICogd29ya2luZyBQTkcgcmVhZGVyL3dyaXRlciwgc2VlIHBuZ3Rlc3QuYywgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb247CisgKiBzZWUgYWxzbyB0aGUgcHJvZ3JhbXMgaW4gdGhlIGNvbnRyaWIgZGlyZWN0b3J5LgorICovCisKKy8qIFRoZSBzaW1wbGUsIGJ1dCByZXN0cmljdGVkLCBhcHByb2FjaCB0byByZWFkaW5nIGEgUE5HIGZpbGUgb3IgZGF0YSBzdHJlYW0KKyAqIGp1c3QgcmVxdWlyZXMgdHdvIGZ1bmN0aW9uIGNhbGxzLCBhcyBpbiB0aGUgZm9sbG93aW5nIGNvbXBsZXRlIHByb2dyYW0uCisgKiBXcml0aW5nIGEgZmlsZSBqdXN0IG5lZWRzIG9uZSBmdW5jdGlvbiBjYWxsLCBzbyBsb25nIGFzIHRoZSBkYXRhIGhhcyBhbgorICogYXBwcm9wcmlhdGUgbGF5b3V0LgorICoKKyAqIFRoZSBmb2xsb3dpbmcgY29kZSByZWFkcyBQTkcgaW1hZ2UgZGF0YSBmcm9tIGEgZmlsZSBhbmQgd3JpdGVzIGl0LCBpbiBhCisgKiBwb3RlbnRpYWxseSBuZXcgZm9ybWF0LCB0byBhIG5ldyBmaWxlLiAgV2hpbGUgdGhpcyBjb2RlIHdpbGwgY29tcGlsZSB0aGVyZSBpcworICogbWluaW1hbCAoaW5zdWZmaWNpZW50KSBlcnJvciBjaGVja2luZzsgZm9yIGEgbW9yZSByZWFsaXN0aWMgdmVyc2lvbiBsb29rIGF0CisgKiBjb250cmliL2V4YW1wbGVzL3BuZ3RvcG5nLmMKKyAqLworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8cG5nLmg+CisjaW5jbHVkZSA8emxpYi5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCit7CisgICBpZiAoYXJnYyA9PSAzKQorICAgeworICAgICAgcG5nX2ltYWdlIGltYWdlOyAvKiBUaGUgY29udHJvbCBzdHJ1Y3R1cmUgdXNlZCBieSBsaWJwbmcgKi8KKworICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgJ3BuZ19pbWFnZScgc3RydWN0dXJlLiAqLworICAgICAgbWVtc2V0KCZpbWFnZSwgMCwgKHNpemVvZiBpbWFnZSkpOworICAgICAgaW1hZ2UudmVyc2lvbiA9IFBOR19JTUFHRV9WRVJTSU9OOworCisgICAgICAvKiBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIGZpbGUgdG8gcmVhZDogKi8KKyAgICAgIGlmIChwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX2ZpbGUoJmltYWdlLCBhcmd2WzFdKSAhPSAwKQorICAgICAgeworICAgICAgICAgcG5nX2J5dGVwIGJ1ZmZlcjsKKworICAgICAgICAgLyogU2V0IHRoZSBmb3JtYXQgaW4gd2hpY2ggdG8gcmVhZCB0aGUgUE5HIGZpbGU7IHRoaXMgY29kZSBjaG9vc2VzIGEKKyAgICAgICAgICAqIHNpbXBsZSBzUkdCIGZvcm1hdCB3aXRoIGEgbm9uLWFzc29jaWF0ZWQgYWxwaGEgY2hhbm5lbCwgYWRlcXVhdGUgdG8KKyAgICAgICAgICAqIHN0b3JlIG1vc3QgaW1hZ2VzLgorICAgICAgICAgICovCisgICAgICAgICBpbWFnZS5mb3JtYXQgPSBQTkdfRk9STUFUX1JHQkE7CisKKyAgICAgICAgIC8qIE5vdyBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5IHRvIGhvbGQgdGhlIGltYWdlIGluIHRoaXMgZm9ybWF0OyB0aGUKKyAgICAgICAgICAqIFBOR19JTUFHRV9TSVpFIG1hY3JvIHVzZXMgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbWFnZSAod2lkdGgsCisgICAgICAgICAgKiBoZWlnaHQgYW5kIGZvcm1hdCkgc3RvcmVkIGluICdpbWFnZScuCisgICAgICAgICAgKi8KKyAgICAgICAgIGJ1ZmZlciA9IG1hbGxvYyhQTkdfSU1BR0VfU0laRShpbWFnZSkpOworCisgICAgICAgICAvKiBJZiBlbm91Z2ggbWVtb3J5IHdhcyBhdmFpbGFibGUgcmVhZCB0aGUgaW1hZ2UgaW4gdGhlIGRlc2lyZWQgZm9ybWF0CisgICAgICAgICAgKiB0aGVuIHdyaXRlIHRoZSByZXN1bHQgb3V0IHRvIHRoZSBuZXcgZmlsZS4gICdiYWNrZ3JvdW5kJyBpcyBub3QKKyAgICAgICAgICAqIG5lY2Vzc2FyeSB3aGVuIHJlYWRpbmcgdGhlIGltYWdlIGJlY2F1c2UgdGhlIGFscGhhIGNoYW5uZWwgaXMKKyAgICAgICAgICAqIHByZXNlcnZlZDsgaWYgaXQgd2VyZSB0byBiZSByZW1vdmVkLCBmb3IgZXhhbXBsZSBpZiB3ZSByZXF1ZXN0ZWQKKyAgICAgICAgICAqIFBOR19GT1JNQVRfUkdCLCB0aGVuIGVpdGhlciBhIHNvbGlkIGJhY2tncm91bmQgY29sb3Igd291bGQgaGF2ZSB0bworICAgICAgICAgICogYmUgc3VwcGxpZWQgb3IgdGhlIG91dHB1dCBidWZmZXIgd291bGQgaGF2ZSB0byBiZSBpbml0aWFsaXplZCB0byB0aGUKKyAgICAgICAgICAqIGFjdHVhbCBiYWNrZ3JvdW5kIG9mIHRoZSBpbWFnZS4KKyAgICAgICAgICAqCisgICAgICAgICAgKiBUaGUgZm91cnRoIGFyZ3VtZW50IHRvIHBuZ19pbWFnZV9maW5pc2hfcmVhZCBpcyB0aGUgJ3Jvd19zdHJpZGUnIC0KKyAgICAgICAgICAqIHRoaXMgaXMgdGhlIG51bWJlciBvZiBjb21wb25lbnRzIGFsbG9jYXRlZCBmb3IgdGhlIGltYWdlIGluIGVhY2gKKyAgICAgICAgICAqIHJvdy4gIEl0IGhhcyB0byBiZSBhdCBsZWFzdCBhcyBiaWcgYXMgdGhlIHZhbHVlIHJldHVybmVkIGJ5CisgICAgICAgICAgKiBQTkdfSU1BR0VfUk9XX1NUUklERSwgYnV0IGlmIHlvdSBqdXN0IGFsbG9jYXRlIHNwYWNlIGZvciB0aGUKKyAgICAgICAgICAqIGRlZmF1bHQsIG1pbmltdW0sIHNpemUgdXNpbmcgUE5HX0lNQUdFX1NJWkUgYXMgYWJvdmUgeW91IGNhbiBwYXNzCisgICAgICAgICAgKiB6ZXJvLgorICAgICAgICAgICoKKyAgICAgICAgICAqIFRoZSBmaW5hbCBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gYSBidWZmZXIgZm9yIHRoZSBjb2xvcm1hcDsKKyAgICAgICAgICAqIGNvbG9ybWFwcyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgZm9ybWF0IGFzIGEgcm93IG9mIGltYWdlIHBpeGVscyAoc28KKyAgICAgICAgICAqIHlvdSBjaG9vc2Ugd2hhdCBmb3JtYXQgdG8gbWFrZSB0aGUgY29sb3JtYXAgYnkgc2V0dGluZworICAgICAgICAgICogaW1hZ2UuZm9ybWF0KS4gIEEgY29sb3JtYXAgaXMgb25seSByZXR1cm5lZCBpZgorICAgICAgICAgICogUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQIGlzIGFsc28gc2V0IGluIGltYWdlLmZvcm1hdCwgc28gaW4gdGhpcworICAgICAgICAgICogY2FzZSBOVUxMIGlzIHBhc3NlZCBhcyB0aGUgZmluYWwgYXJndW1lbnQuICBJZiB5b3UgZG8gd2FudCB0byBmb3JjZQorICAgICAgICAgICogYWxsIGltYWdlcyBpbnRvIGFuIGluZGV4L2NvbG9yLW1hcHBlZCBmb3JtYXQgdGhlbiB5b3UgY2FuIHVzZToKKyAgICAgICAgICAqCisgICAgICAgICAgKiAgICBQTkdfSU1BR0VfQ09MT1JNQVBfU0laRShpbWFnZSkKKyAgICAgICAgICAqCisgICAgICAgICAgKiB0byBmaW5kIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNvbG9ybWFwIGluIGJ5dGVzLgorICAgICAgICAgICovCisgICAgICAgICBpZiAoYnVmZmVyICE9IE5VTEwgJiYKKyAgICAgICAgICAgIHBuZ19pbWFnZV9maW5pc2hfcmVhZCgmaW1hZ2UsIE5VTEwvKmJhY2tncm91bmQqLywgYnVmZmVyLAorICAgICAgICAgICAgICAgMC8qcm93X3N0cmlkZSovLCBOVUxMLypjb2xvcm1hcCovKSAhPSAwKQorICAgICAgICAgeworICAgICAgICAgICAgLyogTm93IHdyaXRlIHRoZSBpbWFnZSBvdXQgdG8gdGhlIHNlY29uZCBhcmd1bWVudC4gIEluIHRoZSB3cml0ZQorICAgICAgICAgICAgICogY2FsbCAnY29udmVydF90b184Yml0JyBhbGxvd3MgMTYtYml0IGRhdGEgdG8gYmUgc3F1YXNoZWQgZG93biB0bworICAgICAgICAgICAgICogOCBiaXRzOyB0aGlzIGlzbid0IG5lY2Vzc2FyeSBoZXJlIGJlY2F1c2UgdGhlIG9yaWdpbmFsIHJlYWQgd2FzCisgICAgICAgICAgICAgKiB0byB0aGUgOC1iaXQgZm9ybWF0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocG5nX2ltYWdlX3dyaXRlX3RvX2ZpbGUoJmltYWdlLCBhcmd2WzJdLCAwLypjb252ZXJ0X3RvXzhiaXQqLywKKyAgICAgICAgICAgICAgIGJ1ZmZlciwgMC8qcm93X3N0cmlkZSovLCBOVUxMLypjb2xvcm1hcCovKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLyogVGhlIGltYWdlIGhhcyBiZWVuIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5LiAqLworICAgICAgICAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgLyogQ2FsbGluZyBwbmdfZnJlZV9pbWFnZSBpcyBvcHRpb25hbCB1bmxlc3MgdGhlIHNpbXBsaWZpZWQgQVBJIHdhcworICAgICAgICAgICAgICogbm90IHJ1biB0byBjb21wbGV0aW9uLiAgSW4gdGhpcyBjYXNlIGlmIHRoZXJlIHdhc24ndCBlbm91Z2gKKyAgICAgICAgICAgICAqIG1lbW9yeSBmb3IgJ2J1ZmZlcicgd2UgZGlkbid0IGNvbXBsZXRlIHRoZSByZWFkLCBzbyB3ZSBtdXN0IGZyZWUKKyAgICAgICAgICAgICAqIHRoZSBpbWFnZToKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQorICAgICAgICAgICAgICAgcG5nX2ZyZWVfaW1hZ2UoJmltYWdlKTsKKworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgZnJlZShidWZmZXIpOworICAgICAgfQorCisgICAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZyByZWFkaW5nIG9yIHdyaXRpbmcgdGhlIGltYWdlLiAgbGlicG5nIHN0b3JlcyBhCisgICAgICAgKiB0ZXh0dWFsIG1lc3NhZ2UgaW4gdGhlICdwbmdfaW1hZ2UnIHN0cnVjdHVyZToKKyAgICAgICAqLworICAgICAgZnByaW50ZihzdGRlcnIsICJwbmd0b3BuZzogZXJyb3I6ICVzXG4iLCBpbWFnZS5tZXNzYWdlKTsKKyAgICAgIGV4aXQgKDEpOworICAgfQorCisgICBmcHJpbnRmKHN0ZGVyciwgInBuZ3RvcG5nOiB1c2FnZTogcG5ndG9wbmcgaW5wdXQtZmlsZSBvdXRwdXQtZmlsZVxuIik7CisgICBleGl0KDEpOworfQorCisvKiBUaGF0J3MgaXQgOy0pICBPZiBjb3Vyc2UgeW91IHByb2JhYmx5IHdhbnQgdG8gZG8gbW9yZSB3aXRoIFBORyBmaWxlcyB0aGFuCisgKiBqdXN0IGNvbnZlcnRpbmcgdGhlbSBhbGwgdG8gMzItYml0IFJHQkEgUE5HIGZpbGVzOyB5b3UgY2FuIGRvIHRoYXQgYmV0d2VlbgorICogdGhlIGNhbGwgdG8gcG5nX2ltYWdlX2ZpbmlzaF9yZWFkIGFuZCBwbmdfaW1hZ2Vfd3JpdGVfdG9fZmlsZS4gIFlvdSBjYW4gYWxzbworICogYXNrIGZvciB0aGUgaW1hZ2UgZGF0YSB0byBiZSBwcmVzZW50ZWQgaW4gYSBudW1iZXIgb2YgZGlmZmVyZW50IGZvcm1hdHMuICBZb3UKKyAqIGRvIHRoaXMgYnkgc2ltcGx5IGNoYW5naW5nIHRoZSAnZm9ybWF0JyBwYXJhbWV0ZXIgc2V0IGJlZm9yZSBhbGxvY2F0aW5nIHRoZQorICogYnVmZmVyLgorICoKKyAqIFRoZSBmb3JtYXQgcGFyYW1ldGVyIGNvbnNpc3RzIG9mIGZpdmUgZmxhZ3MgdGhhdCBkZWZpbmUgdmFyaW91cyBhc3BlY3RzIG9mCisgKiB0aGUgaW1hZ2UsIHlvdSBjYW4gc2ltcGx5IGFkZCB0aGVzZSB0b2dldGhlciB0byBnZXQgdGhlIGZvcm1hdCBvciB5b3UgY2FuIHVzZQorICogb25lIG9mIHRoZSBwcmVkZWZpbmVkIG1hY3JvcyBmcm9tIHBuZy5oIChhcyBhYm92ZSk6CisgKgorICogUE5HX0ZPUk1BVF9GTEFHX0NPTE9SOiBpZiBzZXQgdGhlIGltYWdlIHdpbGwgaGF2ZSB0aHJlZSBjb2xvciBjb21wb25lbnRzIHBlcgorICogICAgcGl4ZWwgKHJlZCwgZ3JlZW4gYW5kIGJsdWUpLCBpZiBub3Qgc2V0IHRoZSBpbWFnZSB3aWxsIGp1c3QgaGF2ZSBvbmUKKyAqICAgIGx1bWluYW5jZSAoZ3JheXNjYWxlKSBjb21wb25lbnQuCisgKgorICogUE5HX0ZPUk1BVF9GTEFHX0FMUEhBOiBpZiBzZXQgZWFjaCBwaXhlbCBpbiB0aGUgaW1hZ2Ugd2lsbCBoYXZlIGFuIGFkZGl0aW9uYWwKKyAqICAgIGFscGhhIHZhbHVlOyBhIGxpbmVhciB2YWx1ZSB0aGF0IGRlc2NyaWJlcyB0aGUgZGVncmVlIHRoZSBpbWFnZSBwaXhlbAorICogICAgY292ZXJzIChvdmVyd3JpdGVzKSB0aGUgY29udGVudHMgb2YgdGhlIGV4aXN0aW5nIHBpeGVsIG9uIHRoZSBkaXNwbGF5LgorICoKKyAqIFBOR19GT1JNQVRfRkxBR19MSU5FQVI6IGlmIHNldCB0aGUgY29tcG9uZW50cyBvZiBlYWNoIHBpeGVsIHdpbGwgYmUgcmV0dXJuZWQKKyAqICAgIGFzIGEgc2VyaWVzIG9mIDE2LWJpdCBsaW5lYXIgdmFsdWVzLCBpZiBub3Qgc2V0IHRoZSBjb21wb25lbnRzIHdpbGwgYmUKKyAqICAgIHJldHVybmVkIGFzIGEgc2VyaWVzIG9mIDgtYml0IHZhbHVlcyBlbmNvZGVkIGFjY29yZGluZyB0byB0aGUgJ3NSR0InCisgKiAgICBzdGFuZGFyZC4gIFRoZSA4LWJpdCBmb3JtYXQgaXMgdGhlIG5vcm1hbCBmb3JtYXQgZm9yIGltYWdlcyBpbnRlbmRlZCBmb3IKKyAqICAgIGRpcmVjdCBkaXNwbGF5LCBiZWNhdXNlIGFsbW9zdCBhbGwgZGlzcGxheSBkZXZpY2VzIGRvIHRoZSBpbnZlcnNlIG9mIHRoZQorICogICAgc1JHQiB0cmFuc2Zvcm1hdGlvbiB0byB0aGUgZGF0YSB0aGV5IHJlY2VpdmUuICBUaGUgMTYtYml0IGZvcm1hdCBpcyBtb3JlCisgKiAgICBjb21tb24gZm9yIHNjaWVudGlmaWMgZGF0YSBhbmQgaW1hZ2UgZGF0YSB0aGF0IG11c3QgYmUgZnVydGhlciBwcm9jZXNzZWQ7CisgKiAgICBiZWNhdXNlIGl0IGlzIGxpbmVhciBzaW1wbGUgbWF0aCBjYW4gYmUgZG9uZSBvbiB0aGUgY29tcG9uZW50IHZhbHVlcy4KKyAqICAgIFJlZ2FyZGxlc3Mgb2YgdGhlIHNldHRpbmcgb2YgdGhpcyBmbGFnIHRoZSBhbHBoYSBjaGFubmVsIGlzIGFsd2F5cyBsaW5lYXIsCisgKiAgICBhbHRob3VnaCBpdCB3aWxsIGJlIDggYml0cyBvciAxNiBiaXRzIHdpZGUgYXMgc3BlY2lmaWVkIGJ5IHRoZSBmbGFnLgorICoKKyAqIFBOR19GT1JNQVRfRkxBR19CR1I6IGlmIHNldCB0aGUgY29tcG9uZW50cyBvZiBhIGNvbG9yIHBpeGVsIHdpbGwgYmUgcmV0dXJuZWQKKyAqICAgIGluIHRoZSBvcmRlciBibHVlLCB0aGVuIGdyZWVuLCB0aGVuIHJlZC4gIElmIG5vdCBzZXQgdGhlIHBpeGVsIGNvbXBvbmVudHMKKyAqICAgIGFyZSBpbiB0aGUgb3JkZXIgcmVkLCB0aGVuIGdyZWVuLCB0aGVuIGJsdWUuCisgKgorICogUE5HX0ZPUk1BVF9GTEFHX0FGSVJTVDogaWYgc2V0IHRoZSBhbHBoYSBjaGFubmVsIChpZiBwcmVzZW50KSBwcmVjZWRlcyB0aGUKKyAqICAgIGNvbG9yIG9yIGdyYXlzY2FsZSBjb21wb25lbnRzLiAgSWYgbm90IHNldCB0aGUgYWxwaGEgY2hhbm5lbCBmb2xsb3dzIHRoZQorICogICAgY29tcG9uZW50cy4KKyAqCisgKiBZb3UgZG8gbm90IGhhdmUgdG8gcmVhZCBkaXJlY3RseSBmcm9tIGEgZmlsZS4gIFlvdSBjYW4gcmVhZCBmcm9tIG1lbW9yeSBvciwKKyAqIG9uIHN5c3RlbXMgdGhhdCBzdXBwb3J0IGl0LCBmcm9tIGEgPHN0ZGlvLmg+IEZJTEUqLiAgVGhpcyBpcyBjb250cm9sbGVkIGJ5CisgKiB0aGUgcGFydGljdWxhciBwbmdfaW1hZ2VfcmVhZF9mcm9tXyBmdW5jdGlvbiB5b3UgY2FsbCBhdCB0aGUgc3RhcnQuICBMaWtld2lzZQorICogb24gd3JpdGUgeW91IGNhbiB3cml0ZSB0byBhIEZJTEUqIGlmIHlvdXIgc3lzdGVtIHN1cHBvcnRzIGl0LiAgQ2hlY2sgdGhlCisgKiBtYWNybyBQTkdfU1RESU9fU1VQUE9SVEVEIHRvIHNlZSBpZiBzdGRpbyBzdXBwb3J0IGhhcyBiZWVuIGluY2x1ZGVkIGluIHlvdXIKKyAqIGxpYnBuZyBidWlsZC4KKyAqCisgKiBJZiB5b3UgcmVhZCAxNi1iaXQgKFBOR19GT1JNQVRfRkxBR19MSU5FQVIpIGRhdGEgeW91IG1heSBuZWVkIHRvIHdyaXRlIGl0IGluCisgKiB0aGUgOC1iaXQgZm9ybWF0IGZvciBkaXNwbGF5LiAgWW91IGRvIHRoaXMgYnkgc2V0dGluZyB0aGUgY29udmVydF90b184Yml0CisgKiBmbGFnIHRvICd0cnVlJy4KKyAqCisgKiBEb24ndCByZXBlYXRlZGx5IGNvbnZlcnQgYmV0d2VlbiB0aGUgOC1iaXQgYW5kIDE2LWJpdCBmb3Jtcy4gIFRoZXJlIGlzCisgKiBzaWduaWZpY2FudCBkYXRhIGxvc3Mgd2hlbiAxNi1iaXQgZGF0YSBpcyBjb252ZXJ0ZWQgdG8gdGhlIDgtYml0IGVuY29kaW5nIGFuZAorICogdGhlIGN1cnJlbnQgbGlicG5nIGltcGxlbWVudGF0aW9uIG9mIGNvbnZlcnNpb24gdG8gMTYtYml0IGlzIGFsc28KKyAqIHNpZ25pZmljYW50bHkgbG9zc3kuICBUaGUgbGF0dGVyIHdpbGwgYmUgZml4ZWQgaW4gdGhlIGZ1dHVyZSwgYnV0IHRoZSBmb3JtZXIKKyAqIGlzIHVuYXZvaWRhYmxlIC0gdGhlIDgtYml0IGZvcm1hdCBqdXN0IGRvZXNuJ3QgaGF2ZSBlbm91Z2ggcmVzb2x1dGlvbi4KKyAqLworCisvKiBJZiB5b3VyIHByb2dyYW0gbmVlZHMgbW9yZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBQTkcgZGF0YSBpdCByZWFkcywgb3IgaWYgeW91CisgKiBuZWVkIHRvIGRvIG1vcmUgY29tcGxleCB0cmFuc2Zvcm1hdGlvbnMsIG9yIG1pbmltaXplIHRyYW5zZm9ybWF0aW9ucywgb24gdGhlCisgKiBkYXRhIHlvdSByZWFkLCB0aGVuIHlvdSBtdXN0IHVzZSBvbmUgb2YgdGhlIHNldmVyYWwgbG93ZXIgbGV2ZWwgbGlicG5nCisgKiBpbnRlcmZhY2VzLgorICoKKyAqIEFsbCB0aGVzZSBpbnRlcmZhY2VzIHJlcXVpcmUgdGhhdCB5b3UgZG8geW91ciBvd24gZXJyb3IgaGFuZGxpbmcgLSB5b3VyCisgKiBwcm9ncmFtIG11c3QgYmUgYWJsZSB0byBhcnJhbmdlIGZvciBjb250cm9sIHRvIHJldHVybiB0byB5b3VyIG93biBjb2RlIGFueQorICogdGltZSBsaWJwbmcgZW5jb3VudGVycyBhIHByb2JsZW0uICBUaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHRvIGRvIHRoaXMsIGJ1dCB0aGUKKyAqIHN0YW5kYXJkIHdheSBpcyB0byB1c2UgdGhlIEFOU0ktQyAoQzkwKSA8c2V0am1wLmg+IGludGVyZmFjZSB0byBlc3RhYmxpc2ggYQorICogcmV0dXJuIHBvaW50IHdpdGhpbiB5b3VyIG93biBjb2RlLiAgWW91IG11c3QgZG8gdGhpcyBpZiB5b3UgZG8gbm90IHVzZSB0aGUKKyAqIHNpbXBsaWZpZWQgaW50ZXJmYWNlIChhYm92ZSkuCisgKgorICogVGhlIGZpcnN0IHN0ZXAgaXMgdG8gaW5jbHVkZSB0aGUgaGVhZGVyIGZpbGVzIHlvdSBuZWVkLCBpbmNsdWRpbmcgdGhlIGxpYnBuZworICogaGVhZGVyIGZpbGUuICBJbmNsdWRlIGFueSBzdGFuZGFyZCBoZWFkZXJzIGFuZCBmZWF0dXJlIHRlc3QgbWFjcm9zIHlvdXIKKyAqIHByb2dyYW0gcmVxdWlyZXMgYmVmb3JlIGluY2x1ZGluZyBwbmcuaDoKKyAqLworI2luY2x1ZGUgPHBuZy5oPgorCisgLyogVGhlIHBuZ19qbXBidWYoKSBtYWNybywgdXNlZCBpbiBlcnJvciBoYW5kbGluZywgYmVjYW1lIGF2YWlsYWJsZSBpbgorICAqIGxpYnBuZyB2ZXJzaW9uIDEuMC42LiAgSWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byBydW4geW91ciBjb2RlIHdpdGggb2xkZXIKKyAgKiB2ZXJzaW9ucyBvZiBsaWJwbmcsIHlvdSBtdXN0IGRlZmluZSB0aGUgbWFjcm8geW91cnNlbGYgKGJ1dCBvbmx5IGlmIGl0CisgICogaXMgbm90IGFscmVhZHkgZGVmaW5lZCBieSBsaWJwbmchKS4KKyAgKi8KKworI2lmbmRlZiBwbmdfam1wYnVmCisjICBkZWZpbmUgcG5nX2ptcGJ1ZihwbmdfcHRyKSAoKHBuZ19wdHIpLT5wbmdfam1wYnVmKQorI2VuZGlmCisKKy8qIENoZWNrIHRvIHNlZSBpZiBhIGZpbGUgaXMgYSBQTkcgZmlsZSB1c2luZyBwbmdfc2lnX2NtcCgpLiAgcG5nX3NpZ19jbXAoKQorICogcmV0dXJucyB6ZXJvIGlmIHRoZSBpbWFnZSBpcyBhIFBORyBhbmQgbm9uemVybyBpZiBpdCBpc24ndCBhIFBORy4KKyAqCisgKiBUaGUgZnVuY3Rpb24gY2hlY2tfaWZfcG5nKCkgc2hvd24gaGVyZSwgYnV0IG5vdCB1c2VkLCByZXR1cm5zIG5vbnplcm8gKHRydWUpCisgKiBpZiB0aGUgZmlsZSBjYW4gYmUgb3BlbmVkIGFuZCBpcyBhIFBORywgMCAoZmFsc2UpIG90aGVyd2lzZS4KKyAqCisgKiBJZiB0aGlzIGNhbGwgaXMgc3VjY2Vzc2Z1bCwgYW5kIHlvdSBhcmUgZ29pbmcgdG8ga2VlcCB0aGUgZmlsZSBvcGVuLAorICogeW91IHNob3VsZCBjYWxsIHBuZ19zZXRfc2lnX2J5dGVzKHBuZ19wdHIsIFBOR19CWVRFU19UT19DSEVDSyk7IG9uY2UKKyAqIHlvdSBoYXZlIGNyZWF0ZWQgdGhlIHBuZ19wdHIsIHNvIHRoYXQgbGlicG5nIGtub3dzIHlvdXIgYXBwbGljYXRpb24KKyAqIGhhcyByZWFkIHRoYXQgbWFueSBieXRlcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gIE1ha2Ugc3VyZSB5b3UKKyAqIGRvbid0IGNhbGwgcG5nX3NldF9zaWdfYnl0ZXMoKSB3aXRoIG1vcmUgdGhhbiA4IGJ5dGVzIHJlYWQgb3IgZ2l2ZSBpdAorICogYW4gaW5jb3JyZWN0IG51bWJlciBvZiBieXRlcyByZWFkLCBvciB5b3Ugd2lsbCBlaXRoZXIgaGF2ZSByZWFkIHRvbworICogbWFueSBieXRlcyAoeW91ciBmYXVsdCksIG9yIHlvdSBhcmUgdGVsbGluZyBsaWJwbmcgdG8gcmVhZCB0aGUgd3JvbmcKKyAqIG51bWJlciBvZiBtYWdpYyBieXRlcyAoYWxzbyB5b3VyIGZhdWx0KS4KKyAqCisgKiBNYW55IGFwcGxpY2F0aW9ucyBhbHJlYWR5IHJlYWQgdGhlIGZpcnN0IDIgb3IgNCBieXRlcyBmcm9tIHRoZSBzdGFydAorICogb2YgdGhlIGltYWdlIHRvIGRldGVybWluZSB0aGUgZmlsZSB0eXBlLCBzbyBpdCB3b3VsZCBiZSBlYXNpZXN0IGp1c3QKKyAqIHRvIHBhc3MgdGhlIGJ5dGVzIHRvIHBuZ19zaWdfY21wKCkgb3IgZXZlbiBza2lwIHRoYXQgaWYgeW91IGtub3cKKyAqIHlvdSBoYXZlIGEgUE5HIGZpbGUsIGFuZCBjYWxsIHBuZ19zZXRfc2lnX2J5dGVzKCkuCisgKi8KKyNkZWZpbmUgUE5HX0JZVEVTX1RPX0NIRUNLIDQKK2ludCBjaGVja19pZl9wbmcoY2hhciAqZmlsZV9uYW1lLCBGSUxFICoqZnApCit7CisgICBjaGFyIGJ1ZltQTkdfQllURVNfVE9fQ0hFQ0tdOworCisgICAvKiBPcGVuIHRoZSBwcm9zcGVjdGl2ZSBQTkcgZmlsZS4gKi8KKyAgIGlmICgoKmZwID0gZm9wZW4oZmlsZV9uYW1lLCAicmIiKSkgPT0gTlVMTCkKKyAgICAgIHJldHVybiAwOworCisgICAvKiBSZWFkIGluIHNvbWUgb2YgdGhlIHNpZ25hdHVyZSBieXRlcyAqLworICAgaWYgKGZyZWFkKGJ1ZiwgMSwgUE5HX0JZVEVTX1RPX0NIRUNLLCAqZnApICE9IFBOR19CWVRFU19UT19DSEVDSykKKyAgICAgIHJldHVybiAwOworCisgICAvKiBDb21wYXJlIHRoZSBmaXJzdCBQTkdfQllURVNfVE9fQ0hFQ0sgYnl0ZXMgb2YgdGhlIHNpZ25hdHVyZS4KKyAgICAgIFJldHVybiBub256ZXJvICh0cnVlKSBpZiB0aGV5IG1hdGNoICovCisKKyAgIHJldHVybighcG5nX3NpZ19jbXAoYnVmLCAocG5nX3NpemVfdCkwLCBQTkdfQllURVNfVE9fQ0hFQ0spKTsKK30KKworLyogUmVhZCBhIFBORyBmaWxlLiAgWW91IG1heSB3YW50IHRvIHJldHVybiBhbiBlcnJvciBjb2RlIGlmIHRoZSByZWFkCisgKiBmYWlscyAoZGVwZW5kaW5nIHVwb24gdGhlIGZhaWx1cmUpLiAgVGhlcmUgYXJlIHR3byAicHJvdG90eXBlcyIgZ2l2ZW4KKyAqIGhlcmUgLSBvbmUgd2hlcmUgd2UgYXJlIGdpdmVuIHRoZSBmaWxlbmFtZSwgYW5kIHdlIG5lZWQgdG8gb3BlbiB0aGUKKyAqIGZpbGUsIGFuZCB0aGUgb3RoZXIgd2hlcmUgd2UgYXJlIGdpdmVuIGFuIG9wZW4gZmlsZSAocG9zc2libHkgd2l0aAorICogc29tZSBvciBhbGwgb2YgdGhlIG1hZ2ljIGJ5dGVzIHJlYWQgLSBzZWUgY29tbWVudHMgYWJvdmUpLgorICovCisjaWZkZWYgb3Blbl9maWxlIC8qIHByb3RvdHlwZSAxICovCit2b2lkIHJlYWRfcG5nKGNoYXIgKmZpbGVfbmFtZSkgIC8qIFdlIG5lZWQgdG8gb3BlbiB0aGUgZmlsZSAqLworeworICAgcG5nX3N0cnVjdHAgcG5nX3B0cjsKKyAgIHBuZ19pbmZvcCBpbmZvX3B0cjsKKyAgIGludCBzaWdfcmVhZCA9IDA7CisgICBwbmdfdWludF8zMiB3aWR0aCwgaGVpZ2h0OworICAgaW50IGJpdF9kZXB0aCwgY29sb3JfdHlwZSwgaW50ZXJsYWNlX3R5cGU7CisgICBGSUxFICpmcDsKKworICAgaWYgKChmcCA9IGZvcGVuKGZpbGVfbmFtZSwgInJiIikpID09IE5VTEwpCisgICAgICByZXR1cm4gKEVSUk9SKTsKKworI2Vsc2Ugbm9fb3Blbl9maWxlIC8qIHByb3RvdHlwZSAyICovCit2b2lkIHJlYWRfcG5nKEZJTEUgKmZwLCBpbnQgc2lnX3JlYWQpICAvKiBGaWxlIGlzIGFscmVhZHkgb3BlbiAqLworeworICAgcG5nX3N0cnVjdHAgcG5nX3B0cjsKKyAgIHBuZ19pbmZvcCBpbmZvX3B0cjsKKyAgIHBuZ191aW50XzMyIHdpZHRoLCBoZWlnaHQ7CisgICBpbnQgYml0X2RlcHRoLCBjb2xvcl90eXBlLCBpbnRlcmxhY2VfdHlwZTsKKyNlbmRpZiBub19vcGVuX2ZpbGUgLyogT25seSB1c2Ugb25lIHByb3RvdHlwZSEgKi8KKworICAgLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBwbmdfc3RydWN0IHdpdGggdGhlIGRlc2lyZWQgZXJyb3IgaGFuZGxlcgorICAgICogZnVuY3Rpb25zLiAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBkZWZhdWx0IHN0ZGVyciBhbmQgbG9uZ2p1bXAgbWV0aG9kLAorICAgICogeW91IGNhbiBzdXBwbHkgTlVMTCBmb3IgdGhlIGxhc3QgdGhyZWUgcGFyYW1ldGVycy4gIFdlIGFsc28gc3VwcGx5IHRoZQorICAgICogdGhlIGNvbXBpbGVyIGhlYWRlciBmaWxlIHZlcnNpb24sIHNvIHRoYXQgd2Uga25vdyBpZiB0aGUgYXBwbGljYXRpb24KKyAgICAqIHdhcyBjb21waWxlZCB3aXRoIGEgY29tcGF0aWJsZSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiAgUkVRVUlSRUQKKyAgICAqLworICAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLAorICAgICAgcG5nX3ZvaWRwIHVzZXJfZXJyb3JfcHRyLCB1c2VyX2Vycm9yX2ZuLCB1c2VyX3dhcm5pbmdfZm4pOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgeworICAgICAgZmNsb3NlKGZwKTsKKyAgICAgIHJldHVybiAoRVJST1IpOworICAgfQorCisgICAvKiBBbGxvY2F0ZS9pbml0aWFsaXplIHRoZSBtZW1vcnkgZm9yIGltYWdlIGluZm9ybWF0aW9uLiAgUkVRVUlSRUQuICovCisgICBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7CisgICBpZiAoaW5mb19wdHIgPT0gTlVMTCkKKyAgIHsKKyAgICAgIGZjbG9zZShmcCk7CisgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgTlVMTCwgTlVMTCk7CisgICAgICByZXR1cm4gKEVSUk9SKTsKKyAgIH0KKworICAgLyogU2V0IGVycm9yIGhhbmRsaW5nIGlmIHlvdSBhcmUgdXNpbmcgdGhlIHNldGptcC9sb25nam1wIG1ldGhvZCAodGhpcyBpcworICAgICogdGhlIG5vcm1hbCBtZXRob2Qgb2YgZG9pbmcgdGhpbmdzIHdpdGggbGlicG5nKS4gIFJFUVVJUkVEIHVubGVzcyB5b3UKKyAgICAqIHNldCB1cCB5b3VyIG93biBlcnJvciBoYW5kbGVycyBpbiB0aGUgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCgpIGVhcmxpZXIuCisgICAgKi8KKworICAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZ19wdHIpKSkKKyAgIHsKKyAgICAgIC8qIEZyZWUgYWxsIG9mIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwbmdfcHRyIGFuZCBpbmZvX3B0ciAqLworICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7CisgICAgICBmY2xvc2UoZnApOworICAgICAgLyogSWYgd2UgZ2V0IGhlcmUsIHdlIGhhZCBhIHByb2JsZW0gcmVhZGluZyB0aGUgZmlsZSAqLworICAgICAgcmV0dXJuIChFUlJPUik7CisgICB9CisKKyAgIC8qIE9uZSBvZiB0aGUgZm9sbG93aW5nIEkvTyBpbml0aWFsaXphdGlvbiBtZXRob2RzIGlzIFJFUVVJUkVEICovCisjaWZkZWYgc3RyZWFtcyAvKiBQTkcgZmlsZSBJL08gbWV0aG9kIDEgKi8KKyAgIC8qIFNldCB1cCB0aGUgaW5wdXQgY29udHJvbCBpZiB5b3UgYXJlIHVzaW5nIHN0YW5kYXJkIEMgc3RyZWFtcyAqLworICAgcG5nX2luaXRfaW8ocG5nX3B0ciwgZnApOworCisjZWxzZSBub19zdHJlYW1zIC8qIFBORyBmaWxlIEkvTyBtZXRob2QgMiAqLworICAgLyogSWYgeW91IGFyZSB1c2luZyByZXBsYWNlbWVudCByZWFkIGZ1bmN0aW9ucywgaW5zdGVhZCBvZiBjYWxsaW5nCisgICAgKiBwbmdfaW5pdF9pbygpIGhlcmUgeW91IHdvdWxkIGNhbGw6CisgICAgKi8KKyAgIHBuZ19zZXRfcmVhZF9mbihwbmdfcHRyLCAodm9pZCAqKXVzZXJfaW9fcHRyLCB1c2VyX3JlYWRfZm4pOworICAgLyogd2hlcmUgdXNlcl9pb19wdHIgaXMgYSBzdHJ1Y3R1cmUgeW91IHdhbnQgYXZhaWxhYmxlIHRvIHRoZSBjYWxsYmFja3MgKi8KKyNlbmRpZiBub19zdHJlYW1zIC8qIFVzZSBvbmx5IG9uZSBJL08gbWV0aG9kISAqLworCisgICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgcmVhZCBzb21lIG9mIHRoZSBzaWduYXR1cmUgKi8KKyAgIHBuZ19zZXRfc2lnX2J5dGVzKHBuZ19wdHIsIHNpZ19yZWFkKTsKKworI2lmZGVmIGhpbGV2ZWwKKyAgIC8qCisgICAgKiBJZiB5b3UgaGF2ZSBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgaW4gdGhlIGVudGlyZSBpbWFnZSBhdCBvbmNlLAorICAgICogYW5kIHlvdSBuZWVkIHRvIHNwZWNpZnkgb25seSB0cmFuc2Zvcm1zIHRoYXQgY2FuIGJlIGNvbnRyb2xsZWQKKyAgICAqIHdpdGggb25lIG9mIHRoZSBQTkdfVFJBTlNGT1JNXyogYml0cyAodGhpcyBwcmVzZW50bHkgZXhjbHVkZXMKKyAgICAqIHF1YW50aXppbmcsIGZpbGxpbmcsIHNldHRpbmcgYmFja2dyb3VuZCwgYW5kIGRvaW5nIGdhbW1hCisgICAgKiBhZGp1c3RtZW50KSwgdGhlbiB5b3UgY2FuIHJlYWQgdGhlIGVudGlyZSBpbWFnZSAoaW5jbHVkaW5nCisgICAgKiBwaXhlbHMpIGludG8gdGhlIGluZm8gc3RydWN0dXJlIHdpdGggdGhpcyBjYWxsOgorICAgICovCisgICBwbmdfcmVhZF9wbmcocG5nX3B0ciwgaW5mb19wdHIsIHBuZ190cmFuc2Zvcm1zLCBOVUxMKTsKKworI2Vsc2UKKyAgIC8qIE9LLCB5b3UncmUgZG9pbmcgaXQgdGhlIGhhcmQgd2F5LCB3aXRoIHRoZSBsb3dlci1sZXZlbCBmdW5jdGlvbnMgKi8KKworICAgLyogVGhlIGNhbGwgdG8gcG5nX3JlYWRfaW5mbygpIGdpdmVzIHVzIGFsbCBvZiB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUKKyAgICAqIFBORyBmaWxlIGJlZm9yZSB0aGUgZmlyc3QgSURBVCAoaW1hZ2UgZGF0YSBjaHVuaykuICBSRVFVSVJFRAorICAgICovCisgICBwbmdfcmVhZF9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKKworICAgcG5nX2dldF9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCAmd2lkdGgsICZoZWlnaHQsICZiaXRfZGVwdGgsICZjb2xvcl90eXBlLAorICAgICAgICZpbnRlcmxhY2VfdHlwZSwgTlVMTCwgTlVMTCk7CisKKyAgIC8qIFNldCB1cCB0aGUgZGF0YSB0cmFuc2Zvcm1hdGlvbnMgeW91IHdhbnQuICBOb3RlIHRoYXQgdGhlc2UgYXJlIGFsbAorICAgICogb3B0aW9uYWwuICBPbmx5IGNhbGwgdGhlbSBpZiB5b3Ugd2FudC9uZWVkIHRoZW0uICBNYW55IG9mIHRoZQorICAgICogdHJhbnNmb3JtYXRpb25zIG9ubHkgd29yayBvbiBzcGVjaWZpYyB0eXBlcyBvZiBpbWFnZXMsIGFuZCBtYW55CisgICAgKiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgorICAgICovCisKKyAgIC8qIFRlbGwgbGlicG5nIHRvIHN0cmlwIDE2IGJpdHMvY29sb3IgZmlsZXMgZG93biB0byA4IGJpdHMvY29sb3IuCisgICAgKiBVc2UgYWNjdXJhdGUgc2NhbGluZyBpZiBpdCdzIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGp1c3QgY2hvcCBvZmYgdGhlCisgICAgKiBsb3cgYnl0ZS4KKyAgICAqLworI2lmZGVmIFBOR19SRUFEX1NDQUxFXzE2X1RPXzhfU1VQUE9SVEVECisgICAgcG5nX3NldF9zY2FsZV8xNihwbmdfcHRyKTsKKyNlbHNlCisgICBwbmdfc2V0X3N0cmlwXzE2KHBuZ19wdHIpOworI2VuZGlmCisKKyAgIC8qIFN0cmlwIGFscGhhIGJ5dGVzIGZyb20gdGhlIGlucHV0IGRhdGEgd2l0aG91dCBjb21iaW5pbmcgd2l0aCB0aGUKKyAgICAqIGJhY2tncm91bmQgKG5vdCByZWNvbW1lbmRlZCkuCisgICAgKi8KKyAgIHBuZ19zZXRfc3RyaXBfYWxwaGEocG5nX3B0cik7CisKKyAgIC8qIEV4dHJhY3QgbXVsdGlwbGUgcGl4ZWxzIHdpdGggYml0IGRlcHRocyBvZiAxLCAyLCBhbmQgNCBmcm9tIGEgc2luZ2xlCisgICAgKiBieXRlIGludG8gc2VwYXJhdGUgYnl0ZXMgKHVzZWZ1bCBmb3IgcGFsZXR0ZWQgYW5kIGdyYXlzY2FsZSBpbWFnZXMpLgorICAgICovCisgICBwbmdfc2V0X3BhY2tpbmcocG5nX3B0cik7CisKKyAgIC8qIENoYW5nZSB0aGUgb3JkZXIgb2YgcGFja2VkIHBpeGVscyB0byBsZWFzdCBzaWduaWZpY2FudCBiaXQgZmlyc3QKKyAgICAqIChub3QgdXNlZnVsIGlmIHlvdSBhcmUgdXNpbmcgcG5nX3NldF9wYWNraW5nKS4gKi8KKyAgIHBuZ19zZXRfcGFja3N3YXAocG5nX3B0cik7CisKKyAgIC8qIEV4cGFuZCBwYWxldHRlZCBjb2xvcnMgaW50byB0cnVlIFJHQiB0cmlwbGV0cyAqLworICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgICAgIHBuZ19zZXRfcGFsZXR0ZV90b19yZ2IocG5nX3B0cik7CisKKyAgIC8qIEV4cGFuZCBncmF5c2NhbGUgaW1hZ2VzIHRvIHRoZSBmdWxsIDggYml0cyBmcm9tIDEsIDIsIG9yIDQgYml0cy9waXhlbCAqLworICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSAmJiBiaXRfZGVwdGggPCA4KQorICAgICAgcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KHBuZ19wdHIpOworCisgICAvKiBFeHBhbmQgcGFsZXR0ZWQgb3IgUkdCIGltYWdlcyB3aXRoIHRyYW5zcGFyZW5jeSB0byBmdWxsIGFscGhhIGNoYW5uZWxzCisgICAgKiBzbyB0aGUgZGF0YSB3aWxsIGJlIGF2YWlsYWJsZSBhcyBSR0JBIHF1YXJ0ZXRzLgorICAgICovCisgICBpZiAocG5nX2dldF92YWxpZChwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0lORk9fdFJOUykgIT0gMCkKKyAgICAgIHBuZ19zZXRfdFJOU190b19hbHBoYShwbmdfcHRyKTsKKworICAgLyogU2V0IHRoZSBiYWNrZ3JvdW5kIGNvbG9yIHRvIGRyYXcgdHJhbnNwYXJlbnQgYW5kIGFscGhhIGltYWdlcyBvdmVyLgorICAgICogSXQgaXMgcG9zc2libGUgdG8gc2V0IHRoZSByZWQsIGdyZWVuLCBhbmQgYmx1ZSBjb21wb25lbnRzIGRpcmVjdGx5CisgICAgKiBmb3IgcGFsZXR0ZWQgaW1hZ2VzIGluc3RlYWQgb2Ygc3VwcGx5aW5nIGEgcGFsZXR0ZSBpbmRleC4gIE5vdGUgdGhhdAorICAgICogZXZlbiBpZiB0aGUgUE5HIGZpbGUgc3VwcGxpZXMgYSBiYWNrZ3JvdW5kLCB5b3UgYXJlIG5vdCByZXF1aXJlZCB0bworICAgICogdXNlIGl0IC0geW91IHNob3VsZCB1c2UgdGhlIChzb2xpZCkgYXBwbGljYXRpb24gYmFja2dyb3VuZCBpZiBpdCBoYXMgb25lLgorICAgICovCisKKyAgIHBuZ19jb2xvcl8xNiBteV9iYWNrZ3JvdW5kLCAqaW1hZ2VfYmFja2dyb3VuZDsKKworICAgaWYgKHBuZ19nZXRfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgJmltYWdlX2JhY2tncm91bmQpICE9IDApCisgICAgICBwbmdfc2V0X2JhY2tncm91bmQocG5nX3B0ciwgaW1hZ2VfYmFja2dyb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfQkFDS0dST1VORF9HQU1NQV9GSUxFLCAxLCAxLjApOworICAgZWxzZQorICAgICAgcG5nX3NldF9iYWNrZ3JvdW5kKHBuZ19wdHIsICZteV9iYWNrZ3JvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19CQUNLR1JPVU5EX0dBTU1BX1NDUkVFTiwgMCwgMS4wKTsKKworICAgLyogU29tZSBzdWdnZXN0aW9ucyBhcyB0byBob3cgdG8gZ2V0IGEgc2NyZWVuIGdhbW1hIHZhbHVlCisgICAgKgorICAgICogTm90ZSB0aGF0IHNjcmVlbiBnYW1tYSBpcyB0aGUgZGlzcGxheV9leHBvbmVudCwgd2hpY2ggaW5jbHVkZXMKKyAgICAqIHRoZSBDUlRfZXhwb25lbnQgYW5kIGFueSBjb3JyZWN0aW9uIGZvciB2aWV3aW5nIGNvbmRpdGlvbnMKKyAgICAqLworICAgaWYgKC8qIFdlIGhhdmUgYSB1c2VyLWRlZmluZWQgc2NyZWVuIGdhbW1hIHZhbHVlICovKQorICAgeworICAgICAgc2NyZWVuX2dhbW1hID0gdXNlci1kZWZpbmVkIHNjcmVlbl9nYW1tYTsKKyAgIH0KKyAgIC8qIFRoaXMgaXMgb25lIHdheSB0aGF0IGFwcGxpY2F0aW9ucyBzaGFyZSB0aGUgc2FtZSBzY3JlZW4gZ2FtbWEgdmFsdWUgKi8KKyAgIGVsc2UgaWYgKChnYW1tYV9zdHIgPSBnZXRlbnYoIlNDUkVFTl9HQU1NQSIpKSAhPSBOVUxMKQorICAgeworICAgICAgc2NyZWVuX2dhbW1hID0gYXRvZihnYW1tYV9zdHIpOworICAgfQorICAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBhbm90aGVyIHZhbHVlICovCisgICBlbHNlCisgICB7CisgICAgICBzY3JlZW5fZ2FtbWEgPSBQTkdfREVGQVVMVF9zUkdCOyAgLyogQSBnb29kIGd1ZXNzIGZvciBhIFBDIG1vbml0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBhIGRpbWx5IGxpdCByb29tICovCisgICAgICBzY3JlZW5fZ2FtbWEgPSBQTkdfR0FNTUFfTUFDXzE4IG9yIDEuMDsgLyogR29vZCBndWVzc2VzIGZvciBNYWMgc3lzdGVtcyAqLworICAgfQorCisgICAvKiBUZWxsIGxpYnBuZyB0byBoYW5kbGUgdGhlIGdhbW1hIGNvbnZlcnNpb24gZm9yIHlvdS4gIFRoZSBmaW5hbCBjYWxsCisgICAgKiBpcyBhIGdvb2QgZ3Vlc3MgZm9yIFBDIGdlbmVyYXRlZCBpbWFnZXMsIGJ1dCBpdCBzaG91bGQgYmUgY29uZmlndXJhYmxlCisgICAgKiBieSB0aGUgdXNlciBhdCBydW4gdGltZSBieSB0aGUgdXNlci4gIEl0IGlzIHN0cm9uZ2x5IHN1Z2dlc3RlZCB0aGF0CisgICAgKiB5b3VyIGFwcGxpY2F0aW9uIHN1cHBvcnQgZ2FtbWEgY29ycmVjdGlvbi4KKyAgICAqLworCisgICBpbnQgaW50ZW50OworCisgICBpZiAocG5nX2dldF9zUkdCKHBuZ19wdHIsIGluZm9fcHRyLCAmaW50ZW50KSAhPSAwKQorICAgICAgcG5nX3NldF9nYW1tYShwbmdfcHRyLCBzY3JlZW5fZ2FtbWEsIFBOR19ERUZBVUxUX3NSR0IpOworICAgZWxzZQorICAgeworICAgICAgZG91YmxlIGltYWdlX2dhbW1hOworICAgICAgaWYgKHBuZ19nZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgJmltYWdlX2dhbW1hKSAhPSAwKQorICAgICAgICAgcG5nX3NldF9nYW1tYShwbmdfcHRyLCBzY3JlZW5fZ2FtbWEsIGltYWdlX2dhbW1hKTsKKyAgICAgIGVsc2UKKyAgICAgICAgIHBuZ19zZXRfZ2FtbWEocG5nX3B0ciwgc2NyZWVuX2dhbW1hLCAwLjQ1NDU1KTsKKyAgIH0KKworI2lmZGVmIFBOR19SRUFEX1FVQU5USVpFX1NVUFBPUlRFRAorICAgLyogUXVhbnRpemUgUkdCIGZpbGVzIGRvd24gdG8gOC1iaXQgcGFsZXR0ZSBvciByZWR1Y2UgcGFsZXR0ZXMKKyAgICAqIHRvIHRoZSBudW1iZXIgb2YgY29sb3JzIGF2YWlsYWJsZSBvbiB5b3VyIHNjcmVlbi4KKyAgICAqLworICAgaWYgKChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpICE9IDApCisgICB7CisgICAgICBpbnQgbnVtX3BhbGV0dGU7CisgICAgICBwbmdfY29sb3JwIHBhbGV0dGU7CisKKyAgICAgIC8qIFRoaXMgcmVkdWNlcyB0aGUgaW1hZ2UgdG8gdGhlIGFwcGxpY2F0aW9uIHN1cHBsaWVkIHBhbGV0dGUgKi8KKyAgICAgIGlmICgvKiBXZSBoYXZlIG91ciBvd24gcGFsZXR0ZSAqLykKKyAgICAgIHsKKyAgICAgICAgIC8qIEFuIGFycmF5IG9mIGNvbG9ycyB0byB3aGljaCB0aGUgaW1hZ2Ugc2hvdWxkIGJlIHF1YW50aXplZCAqLworICAgICAgICAgcG5nX2NvbG9yIHN0ZF9jb2xvcl9jdWJlW01BWF9TQ1JFRU5fQ09MT1JTXTsKKworICAgICAgICAgcG5nX3NldF9xdWFudGl6ZShwbmdfcHRyLCBzdGRfY29sb3JfY3ViZSwgTUFYX1NDUkVFTl9DT0xPUlMsCisgICAgICAgICAgICBNQVhfU0NSRUVOX0NPTE9SUywgTlVMTCwgMCk7CisgICAgICB9CisgICAgICAvKiBUaGlzIHJlZHVjZXMgdGhlIGltYWdlIHRvIHRoZSBwYWxldHRlIHN1cHBsaWVkIGluIHRoZSBmaWxlICovCisgICAgICBlbHNlIGlmIChwbmdfZ2V0X1BMVEUocG5nX3B0ciwgaW5mb19wdHIsICZwYWxldHRlLCAmbnVtX3BhbGV0dGUpICE9IDApCisgICAgICB7CisgICAgICAgICBwbmdfdWludF8xNnAgaGlzdG9ncmFtID0gTlVMTDsKKworICAgICAgICAgcG5nX2dldF9oSVNUKHBuZ19wdHIsIGluZm9fcHRyLCAmaGlzdG9ncmFtKTsKKworICAgICAgICAgcG5nX3NldF9xdWFudGl6ZShwbmdfcHRyLCBwYWxldHRlLCBudW1fcGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heF9zY3JlZW5fY29sb3JzLCBoaXN0b2dyYW0sIDApOworICAgICAgfQorICAgfQorI2VuZGlmIC8qIFJFQURfUVVBTlRJWkUgKi8KKworICAgLyogSW52ZXJ0IG1vbm9jaHJvbWUgZmlsZXMgdG8gaGF2ZSAwIGFzIHdoaXRlIGFuZCAxIGFzIGJsYWNrICovCisgICBwbmdfc2V0X2ludmVydF9tb25vKHBuZ19wdHIpOworCisgICAvKiBJZiB5b3Ugd2FudCB0byBzaGlmdCB0aGUgcGl4ZWwgdmFsdWVzIGZyb20gdGhlIHJhbmdlIFswLDI1NV0gb3IKKyAgICAqIFswLDY1NTM1XSB0byB0aGUgb3JpZ2luYWwgWzAsN10gb3IgWzAsMzFdLCBvciB3aGF0ZXZlciByYW5nZSB0aGUKKyAgICAqIGNvbG9ycyB3ZXJlIG9yaWdpbmFsbHkgaW46CisgICAgKi8KKyAgIGlmIChwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfSU5GT19zQklUKSAhPSAwKQorICAgeworICAgICAgcG5nX2NvbG9yXzhwIHNpZ19iaXRfcDsKKworICAgICAgcG5nX2dldF9zQklUKHBuZ19wdHIsIGluZm9fcHRyLCAmc2lnX2JpdF9wKTsKKyAgICAgIHBuZ19zZXRfc2hpZnQocG5nX3B0ciwgc2lnX2JpdF9wKTsKKyAgIH0KKworICAgLyogRmxpcCB0aGUgUkdCIHBpeGVscyB0byBCR1IgKG9yIFJHQkEgdG8gQkdSQSkgKi8KKyAgIGlmICgoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKSAhPSAwKQorICAgICAgcG5nX3NldF9iZ3IocG5nX3B0cik7CisKKyAgIC8qIFN3YXAgdGhlIFJHQkEgb3IgR0EgZGF0YSB0byBBUkdCIG9yIEFHIChvciBCR1JBIHRvIEFCR1IpICovCisgICBwbmdfc2V0X3N3YXBfYWxwaGEocG5nX3B0cik7CisKKyAgIC8qIFN3YXAgYnl0ZXMgb2YgMTYtYml0IGZpbGVzIHRvIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QgKi8KKyAgIHBuZ19zZXRfc3dhcChwbmdfcHRyKTsKKworICAgLyogQWRkIGZpbGxlciAob3IgYWxwaGEpIGJ5dGUgKGJlZm9yZS9hZnRlciBlYWNoIFJHQiB0cmlwbGV0KSAqLworICAgcG5nX3NldF9maWxsZXIocG5nX3B0ciwgMHhmZmZmLCBQTkdfRklMTEVSX0FGVEVSKTsKKworI2lmZGVmIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAorICAgLyogVHVybiBvbiBpbnRlcmxhY2UgaGFuZGxpbmcuICBSRVFVSVJFRCBpZiB5b3UgYXJlIG5vdCB1c2luZworICAgICogcG5nX3JlYWRfaW1hZ2UoKS4gIFRvIHNlZSBob3cgdG8gaGFuZGxlIGludGVybGFjaW5nIHBhc3NlcywKKyAgICAqIHNlZSB0aGUgcG5nX3JlYWRfcm93KCkgbWV0aG9kIGJlbG93OgorICAgICovCisgICBudW1iZXJfcGFzc2VzID0gcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3B0cik7CisjZWxzZQorICAgbnVtYmVyX3Bhc3NlcyA9IDE7CisjZW5kaWYgLyogUkVBRF9JTlRFUkxBQ0lORyAqLworCisKKyAgIC8qIE9wdGlvbmFsIGNhbGwgdG8gZ2FtbWEgY29ycmVjdCBhbmQgYWRkIHRoZSBiYWNrZ3JvdW5kIHRvIHRoZSBwYWxldHRlCisgICAgKiBhbmQgdXBkYXRlIGluZm8gc3RydWN0dXJlLiAgUkVRVUlSRUQgaWYgeW91IGFyZSBleHBlY3RpbmcgbGlicG5nIHRvCisgICAgKiB1cGRhdGUgdGhlIHBhbGV0dGUgZm9yIHlvdSAoaWUgeW91IHNlbGVjdGVkIHN1Y2ggYSB0cmFuc2Zvcm0gYWJvdmUpLgorICAgICovCisgICBwbmdfcmVhZF91cGRhdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7CisKKyAgIC8qIEFsbG9jYXRlIHRoZSBtZW1vcnkgdG8gaG9sZCB0aGUgaW1hZ2UgdXNpbmcgdGhlIGZpZWxkcyBvZiBpbmZvX3B0ci4gKi8KKworICAgLyogVGhlIGVhc2llc3Qgd2F5IHRvIHJlYWQgdGhlIGltYWdlOiAqLworICAgcG5nX2J5dGVwIHJvd19wb2ludGVyc1toZWlnaHRdOworCisgICAvKiBDbGVhciB0aGUgcG9pbnRlciBhcnJheSAqLworICAgZm9yIChyb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKQorICAgICAgcm93X3BvaW50ZXJzW3Jvd10gPSBOVUxMOworCisgICBmb3IgKHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspCisgICAgICByb3dfcG9pbnRlcnNbcm93XSA9IHBuZ19tYWxsb2MocG5nX3B0ciwgcG5nX2dldF9yb3dieXRlcyhwbmdfcHRyLAorICAgICAgICAgaW5mb19wdHIpKTsKKworICAgLyogTm93IGl0J3MgdGltZSB0byByZWFkIHRoZSBpbWFnZS4gIE9uZSBvZiB0aGVzZSBtZXRob2RzIGlzIFJFUVVJUkVEICovCisjaWZkZWYgZW50aXJlIC8qIFJlYWQgdGhlIGVudGlyZSBpbWFnZSBpbiBvbmUgZ28gKi8KKyAgIHBuZ19yZWFkX2ltYWdlKHBuZ19wdHIsIHJvd19wb2ludGVycyk7CisKKyNlbHNlIG5vX2VudGlyZSAvKiBSZWFkIHRoZSBpbWFnZSBvbmUgb3IgbW9yZSBzY2FubGluZXMgYXQgYSB0aW1lICovCisgICAvKiBUaGUgb3RoZXIgd2F5IHRvIHJlYWQgaW1hZ2VzIC0gZGVhbCB3aXRoIGludGVybGFjaW5nOiAqLworCisgICBmb3IgKHBhc3MgPSAwOyBwYXNzIDwgbnVtYmVyX3Bhc3NlczsgcGFzcysrKQorICAgeworI2lmZGVmIHNpbmdsZSAvKiBSZWFkIHRoZSBpbWFnZSBhIHNpbmdsZSByb3cgYXQgYSB0aW1lICovCisgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisgICAgICB7CisgICAgICAgICBwbmdfcmVhZF9yb3dzKHBuZ19wdHIsICZyb3dfcG9pbnRlcnNbeV0sIE5VTEwsIDEpOworICAgICAgfQorCisjZWxzZSBub19zaW5nbGUgLyogUmVhZCB0aGUgaW1hZ2Ugc2V2ZXJhbCByb3dzIGF0IGEgdGltZSAqLworICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSArPSBudW1iZXJfb2Zfcm93cykKKyAgICAgIHsKKyNpZmRlZiBzcGFya2xlIC8qIFJlYWQgdGhlIGltYWdlIHVzaW5nIHRoZSAic3BhcmtsZSIgZWZmZWN0LiAqLworICAgICAgICAgcG5nX3JlYWRfcm93cyhwbmdfcHRyLCAmcm93X3BvaW50ZXJzW3ldLCBOVUxMLAorICAgICAgICAgICAgbnVtYmVyX29mX3Jvd3MpOworI2Vsc2Ugbm9fc3BhcmtsZSAvKiBSZWFkIHRoZSBpbWFnZSB1c2luZyB0aGUgInJlY3RhbmdsZSIgZWZmZWN0ICovCisgICAgICAgICBwbmdfcmVhZF9yb3dzKHBuZ19wdHIsIE5VTEwsICZyb3dfcG9pbnRlcnNbeV0sCisgICAgICAgICAgICBudW1iZXJfb2Zfcm93cyk7CisjZW5kaWYgbm9fc3BhcmtsZSAvKiBVc2Ugb25seSBvbmUgb2YgdGhlc2UgdHdvIG1ldGhvZHMgKi8KKyAgICAgIH0KKworICAgICAgLyogSWYgeW91IHdhbnQgdG8gZGlzcGxheSB0aGUgaW1hZ2UgYWZ0ZXIgZXZlcnkgcGFzcywgZG8gc28gaGVyZSAqLworI2VuZGlmIG5vX3NpbmdsZSAvKiBVc2Ugb25seSBvbmUgb2YgdGhlc2UgdHdvIG1ldGhvZHMgKi8KKyAgIH0KKyNlbmRpZiBub19lbnRpcmUgLyogVXNlIG9ubHkgb25lIG9mIHRoZXNlIHR3byBtZXRob2RzICovCisKKyAgIC8qIFJlYWQgcmVzdCBvZiBmaWxlLCBhbmQgZ2V0IGFkZGl0aW9uYWwgY2h1bmtzIGluIGluZm9fcHRyIC0gUkVRVUlSRUQgKi8KKyAgIHBuZ19yZWFkX2VuZChwbmdfcHRyLCBpbmZvX3B0cik7CisjZW5kaWYgaGlsZXZlbAorCisgICAvKiBBdCB0aGlzIHBvaW50IHlvdSBoYXZlIHJlYWQgdGhlIGVudGlyZSBpbWFnZSAqLworCisgICAvKiBDbGVhbiB1cCBhZnRlciB0aGUgcmVhZCwgYW5kIGZyZWUgYW55IG1lbW9yeSBhbGxvY2F0ZWQgLSBSRVFVSVJFRCAqLworICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7CisKKyAgIC8qIENsb3NlIHRoZSBmaWxlICovCisgICBmY2xvc2UoZnApOworCisgICAvKiBUaGF0J3MgaXQgKi8KKyAgIHJldHVybiAoT0spOworfQorCisvKiBQcm9ncmVzc2l2ZWx5IHJlYWQgYSBmaWxlICovCisKK2ludAoraW5pdGlhbGl6ZV9wbmdfcmVhZGVyKHBuZ19zdHJ1Y3RwICpwbmdfcHRyLCBwbmdfaW5mb3AgKmluZm9fcHRyKQoreworICAgLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBwbmdfc3RydWN0IHdpdGggdGhlIGRlc2lyZWQgZXJyb3IgaGFuZGxlcgorICAgICogZnVuY3Rpb25zLiAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBkZWZhdWx0IHN0ZGVyciBhbmQgbG9uZ2p1bXAgbWV0aG9kLAorICAgICogeW91IGNhbiBzdXBwbHkgTlVMTCBmb3IgdGhlIGxhc3QgdGhyZWUgcGFyYW1ldGVycy4gIFdlIGFsc28gY2hlY2sgdGhhdAorICAgICogdGhlIGxpYnJhcnkgdmVyc2lvbiBpcyBjb21wYXRpYmxlIGluIGNhc2Ugd2UgYXJlIHVzaW5nIGR5bmFtaWNhbGx5CisgICAgKiBsaW5rZWQgbGlicmFyaWVzLgorICAgICovCisgICAqcG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLAorICAgICAgIHBuZ192b2lkcCB1c2VyX2Vycm9yX3B0ciwgdXNlcl9lcnJvcl9mbiwgdXNlcl93YXJuaW5nX2ZuKTsKKworICAgaWYgKCpwbmdfcHRyID09IE5VTEwpCisgICB7CisgICAgICAqaW5mb19wdHIgPSBOVUxMOworICAgICAgcmV0dXJuIChFUlJPUik7CisgICB9CisKKyAgICppbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7CisKKyAgIGlmICgqaW5mb19wdHIgPT0gTlVMTCkKKyAgIHsKKyAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KHBuZ19wdHIsIGluZm9fcHRyLCBOVUxMKTsKKyAgICAgIHJldHVybiAoRVJST1IpOworICAgfQorCisgICBpZiAoc2V0am1wKHBuZ19qbXBidWYoKCpwbmdfcHRyKSkpKQorICAgeworICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QocG5nX3B0ciwgaW5mb19wdHIsIE5VTEwpOworICAgICAgcmV0dXJuIChFUlJPUik7CisgICB9CisKKyAgIC8qIFRoaXMgb25lJ3MgbmV3LiAgWW91IHdpbGwgbmVlZCB0byBwcm92aWRlIGFsbCB0aHJlZQorICAgICogZnVuY3Rpb24gY2FsbGJhY2tzLCBldmVuIGlmIHlvdSBhcmVuJ3QgdXNpbmcgdGhlbSBhbGwuCisgICAgKiBJZiB5b3UgYXJlbid0IHVzaW5nIGFsbCBmdW5jdGlvbnMsIHlvdSBjYW4gc3BlY2lmeSBOVUxMCisgICAgKiBwYXJhbWV0ZXJzLiAgRXZlbiB3aGVuIGFsbCB0aHJlZSBmdW5jdGlvbnMgYXJlIE5VTEwsCisgICAgKiB5b3UgbmVlZCB0byBjYWxsIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbigpLgorICAgICogVGhlc2UgZnVuY3Rpb25zIHNob3VsZG4ndCBiZSBkZXBlbmRlbnQgb24gZ2xvYmFsIG9yCisgICAgKiBzdGF0aWMgdmFyaWFibGVzIGlmIHlvdSBhcmUgZGVjb2Rpbmcgc2V2ZXJhbCBpbWFnZXMKKyAgICAqIHNpbXVsdGFuZW91c2x5LiAgWW91IHNob3VsZCBzdG9yZSBzdHJlYW0gc3BlY2lmaWMgZGF0YQorICAgICogaW4gYSBzZXBhcmF0ZSBzdHJ1Y3QsIGdpdmVuIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLAorICAgICogYW5kIHJldHJpZXZlIHRoZSBwb2ludGVyIGZyb20gaW5zaWRlIHRoZSBjYWxsYmFja3MgdXNpbmcKKyAgICAqIHRoZSBmdW5jdGlvbiBwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0cihwbmdfcHRyKS4KKyAgICAqLworICAgcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKCpwbmdfcHRyLCAodm9pZCAqKXN0cmVhbV9kYXRhLAorICAgICAgaW5mb19jYWxsYmFjaywgcm93X2NhbGxiYWNrLCBlbmRfY2FsbGJhY2spOworCisgICByZXR1cm4gKE9LKTsKK30KKworaW50Citwcm9jZXNzX2RhdGEocG5nX3N0cnVjdHAgKnBuZ19wdHIsIHBuZ19pbmZvcCAqaW5mb19wdHIsCisgICBwbmdfYnl0ZXAgYnVmZmVyLCBwbmdfdWludF8zMiBsZW5ndGgpCit7CisgICBpZiAoc2V0am1wKHBuZ19qbXBidWYoKCpwbmdfcHRyKSkpKQorICAgeworICAgICAgLyogRnJlZSB0aGUgcG5nX3B0ciBhbmQgaW5mb19wdHIgbWVtb3J5IG9uIGVycm9yICovCisgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdChwbmdfcHRyLCBpbmZvX3B0ciwgTlVMTCk7CisgICAgICByZXR1cm4gKEVSUk9SKTsKKyAgIH0KKworICAgLyogVGhpcyBvbmUncyBuZXcgYWxzby4gIFNpbXBseSBnaXZlIGl0IGNodW5rcyBvZiBkYXRhIGFzCisgICAgKiB0aGV5IGFycml2ZSBmcm9tIHRoZSBkYXRhIHN0cmVhbSAoaW4gb3JkZXIsIG9mIGNvdXJzZSkuCisgICAgKiBPbiBzZWdtZW50ZWQgbWFjaGluZXMsIGRvbid0IGdpdmUgaXQgYW55IG1vcmUgdGhhbiA2NEsuCisgICAgKiBUaGUgbGlicmFyeSBzZWVtcyB0byBydW4gZmluZSB3aXRoIHNpemVzIG9mIDRLLCBhbHRob3VnaAorICAgICogeW91IGNhbiBnaXZlIGl0IG11Y2ggbGVzcyBpZiBuZWNlc3NhcnkgKEkgYXNzdW1lIHlvdSBjYW4KKyAgICAqIGdpdmUgaXQgY2h1bmtzIG9mIDEgYnl0ZSwgYnV0IEkgaGF2ZW4ndCB0cmllZCB3aXRoIGxlc3MKKyAgICAqIHRoYW4gMjU2IGJ5dGVzIHlldCkuICBXaGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucywgeW91IG1heQorICAgICogd2FudCB0byBkaXNwbGF5IGFueSByb3dzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgaW4gdGhlIHJvdworICAgICogY2FsbGJhY2ssIGlmIHlvdSBhcmVuJ3QgYWxyZWFkeSBkaXNwbGF5aW5nIHRoZW0gdGhlcmUuCisgICAgKi8KKyAgIHBuZ19wcm9jZXNzX2RhdGEoKnBuZ19wdHIsICppbmZvX3B0ciwgYnVmZmVyLCBsZW5ndGgpOworICAgcmV0dXJuIChPSyk7Cit9CisKK2luZm9fY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm8pCit7CisgICAvKiBEbyBhbnkgc2V0dXAgaGVyZSwgaW5jbHVkaW5nIHNldHRpbmcgYW55IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbnMKKyAgICAqIG1lbnRpb25lZCBpbiB0aGUgUmVhZGluZyBQTkcgZmlsZXMgc2VjdGlvbi4gIEZvciBub3csIHlvdSBfbXVzdF8KKyAgICAqIGNhbGwgZWl0aGVyIHBuZ19zdGFydF9yZWFkX2ltYWdlKCkgb3IgcG5nX3JlYWRfdXBkYXRlX2luZm8oKQorICAgICogYWZ0ZXIgYWxsIHRoZSB0cmFuc2Zvcm1hdGlvbnMgYXJlIHNldCAoZXZlbiBpZiB5b3UgZG9uJ3Qgc2V0CisgICAgKiBhbnkpLiAgWW91IG1heSBzdGFydCBnZXR0aW5nIHJvd3MgYmVmb3JlIHBuZ19wcm9jZXNzX2RhdGEoKQorICAgICogcmV0dXJucywgc28gdGhpcyBpcyB5b3VyIGxhc3QgY2hhbmNlIHRvIHByZXBhcmUgZm9yIHRoYXQuCisgICAgKi8KK30KKworcm93X2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBuZXdfcm93LAorICAgcG5nX3VpbnRfMzIgcm93X251bSwgaW50IHBhc3MpCit7CisgICAvKgorICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGV2ZXJ5IHJvdyBpbiB0aGUgaW1hZ2UuICBJZiB0aGUKKyAgICAqIGltYWdlIGlzIGludGVybGFjZWQsIGFuZCB5b3UgdHVybmVkIG9uIHRoZSBpbnRlcmxhY2UgaGFuZGxlciwKKyAgICAqIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgZm9yIGV2ZXJ5IHJvdyBpbiBldmVyeSBwYXNzLgorICAgICoKKyAgICAqIEluIHRoaXMgZnVuY3Rpb24geW91IHdpbGwgcmVjZWl2ZSBhIHBvaW50ZXIgdG8gbmV3IHJvdyBkYXRhIGZyb20KKyAgICAqIGxpYnBuZyBjYWxsZWQgbmV3X3JvdyB0aGF0IGlzIHRvIHJlcGxhY2UgYSBjb3JyZXNwb25kaW5nIHJvdyAob2YKKyAgICAqIHRoZSBzYW1lIGRhdGEgZm9ybWF0KSBpbiBhIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgeW91ciBhcHBsaWNhdGlvbi4KKyAgICAqCisgICAgKiBUaGUgbmV3IHJvdyBkYXRhIHBvaW50ZXIgIm5ld19yb3ciIG1heSBiZSBOVUxMLCBpbmRpY2F0aW5nIHRoZXJlIGlzCisgICAgKiBubyBuZXcgZGF0YSB0byBiZSByZXBsYWNlZCAoaW4gY2FzZXMgb2YgaW50ZXJsYWNlIGxvYWRpbmcpLgorICAgICoKKyAgICAqIElmIG5ld19yb3cgaXMgbm90IE5VTEwgdGhlbiB5b3UgbmVlZCB0byBjYWxsCisgICAgKiBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3coKSB0byByZXBsYWNlIHRoZSBjb3JyZXNwb25kaW5nIHJvdyBhcworICAgICogc2hvd24gYmVsb3c6CisgICAgKi8KKworICAgLyogR2V0IHBvaW50ZXIgdG8gY29ycmVzcG9uZGluZyByb3cgaW4gb3VyCisgICAgKiBQTkcgcmVhZCBidWZmZXIuCisgICAgKi8KKyAgIHBuZ19ieXRlcCBvbGRfcm93ID0gKChwbmdfYnl0ZXAgKilvdXJfZGF0YSlbcm93X251bV07CisKKyNpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQKKyAgIC8qIElmIGJvdGggcm93cyBhcmUgYWxsb2NhdGVkIHRoZW4gY29weSB0aGUgbmV3IHJvdworICAgICogZGF0YSB0byB0aGUgY29ycmVzcG9uZGluZyByb3cgZGF0YS4KKyAgICAqLworICAgaWYgKChvbGRfcm93ICE9IE5VTEwpICYmIChuZXdfcm93ICE9IE5VTEwpKQorICAgcG5nX3Byb2dyZXNzaXZlX2NvbWJpbmVfcm93KHBuZ19wdHIsIG9sZF9yb3csIG5ld19yb3cpOworCisgICAvKgorICAgICogVGhlIHJvd3MgYW5kIHBhc3NlcyBhcmUgY2FsbGVkIGluIG9yZGVyLCBzbyB5b3UgZG9uJ3QgcmVhbGx5CisgICAgKiBuZWVkIHRoZSByb3dfbnVtIGFuZCBwYXNzLCBidXQgSSdtIHN1cHBseWluZyB0aGVtIGJlY2F1c2UgaXQKKyAgICAqIG1heSBtYWtlIHlvdXIgbGlmZSBlYXNpZXIuCisgICAgKgorICAgICogRm9yIHRoZSBub24tTlVMTCByb3dzIG9mIGludGVybGFjZWQgaW1hZ2VzLCB5b3UgbXVzdCBjYWxsCisgICAgKiBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3coKSBwYXNzaW5nIGluIHRoZSBuZXcgcm93IGFuZCB0aGUKKyAgICAqIG9sZCByb3csIGFzIGRlbW9uc3RyYXRlZCBhYm92ZS4gIFlvdSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIGZvcgorICAgICogTlVMTCByb3dzIChpdCB3aWxsIGp1c3QgcmV0dXJuKSBhbmQgZm9yIG5vbi1pbnRlcmxhY2VkIGltYWdlcworICAgICogKGl0IGp1c3QgZG9lcyB0aGUgbWVtY3B5IGZvciB5b3UpIGlmIGl0IHdpbGwgbWFrZSB0aGUgY29kZQorICAgICogZWFzaWVyLiAgVGh1cywgeW91IGNhbiBqdXN0IGRvIHRoaXMgZm9yIGFsbCBjYXNlczoKKyAgICAqLworCisgICBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3cocG5nX3B0ciwgb2xkX3JvdywgbmV3X3Jvdyk7CisKKyAgIC8qIHdoZXJlIG9sZF9yb3cgaXMgd2hhdCB3YXMgZGlzcGxheWVkIGZvciBwcmV2aW91cyByb3dzLiAgTm90ZQorICAgICogdGhhdCB0aGUgZmlyc3QgcGFzcyAocGFzcyA9PSAwIHJlYWxseSkgd2lsbCBjb21wbGV0ZWx5IGNvdmVyCisgICAgKiB0aGUgb2xkIHJvdywgc28gdGhlIHJvd3MgZG8gbm90IGhhdmUgdG8gYmUgaW5pdGlhbGl6ZWQuICBBZnRlcgorICAgICogdGhlIGZpcnN0IHBhc3MgKGFuZCBvbmx5IGZvciBpbnRlcmxhY2VkIGltYWdlcyksIHlvdSB3aWxsIGhhdmUKKyAgICAqIHRvIHBhc3MgdGhlIGN1cnJlbnQgcm93IGFzIG5ld19yb3csIGFuZCB0aGUgZnVuY3Rpb24gd2lsbCBjb21iaW5lCisgICAgKiB0aGUgb2xkIHJvdyBhbmQgdGhlIG5ldyByb3cuCisgICAgKi8KKyNlbmRpZiAvKiBSRUFEX0lOVEVSTEFDSU5HICovCit9CisKK2VuZF9jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mbykKK3sKKyAgIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHdob2xlIGltYWdlIGhhcyBiZWVuIHJlYWQsCisgICAgKiBpbmNsdWRpbmcgYW55IGNodW5rcyBhZnRlciB0aGUgaW1hZ2UgKHVwIHRvIGFuZCBpbmNsdWRpbmcKKyAgICAqIHRoZSBJRU5EKS4gIFlvdSB3aWxsIHVzdWFsbHkgaGF2ZSB0aGUgc2FtZSBpbmZvIGNodW5rIGFzIHlvdQorICAgICogaGFkIGluIHRoZSBoZWFkZXIsIGFsdGhvdWdoIHNvbWUgZGF0YSBtYXkgaGF2ZSBiZWVuIGFkZGVkCisgICAgKiB0byB0aGUgY29tbWVudHMgYW5kIHRpbWUgZmllbGRzLgorICAgICoKKyAgICAqIE1vc3QgcGVvcGxlIHdvbid0IGRvIG11Y2ggaGVyZSwgcGVyaGFwcyBzZXR0aW5nIGEgZmxhZyB0aGF0CisgICAgKiBtYXJrcyB0aGUgaW1hZ2UgYXMgZmluaXNoZWQuCisgICAgKi8KK30KKworLyogV3JpdGUgYSBwbmcgZmlsZSAqLwordm9pZCB3cml0ZV9wbmcoY2hhciAqZmlsZV9uYW1lIC8qICwgLi4uIG90aGVyIGltYWdlIGluZm9ybWF0aW9uIC4uLiAqLykKK3sKKyAgIEZJTEUgKmZwOworICAgcG5nX3N0cnVjdHAgcG5nX3B0cjsKKyAgIHBuZ19pbmZvcCBpbmZvX3B0cjsKKyAgIHBuZ19jb2xvcnAgcGFsZXR0ZTsKKworICAgLyogT3BlbiB0aGUgZmlsZSAqLworICAgZnAgPSBmb3BlbihmaWxlX25hbWUsICJ3YiIpOworICAgaWYgKGZwID09IE5VTEwpCisgICAgICByZXR1cm4gKEVSUk9SKTsKKworICAgLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBwbmdfc3RydWN0IHdpdGggdGhlIGRlc2lyZWQgZXJyb3IgaGFuZGxlcgorICAgICogZnVuY3Rpb25zLiAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBkZWZhdWx0IHN0ZGVyciBhbmQgbG9uZ2p1bXAgbWV0aG9kLAorICAgICogeW91IGNhbiBzdXBwbHkgTlVMTCBmb3IgdGhlIGxhc3QgdGhyZWUgcGFyYW1ldGVycy4gIFdlIGFsc28gY2hlY2sgdGhhdAorICAgICogdGhlIGxpYnJhcnkgdmVyc2lvbiBpcyBjb21wYXRpYmxlIHdpdGggdGhlIG9uZSB1c2VkIGF0IGNvbXBpbGUgdGltZSwKKyAgICAqIGluIGNhc2Ugd2UgYXJlIHVzaW5nIGR5bmFtaWNhbGx5IGxpbmtlZCBsaWJyYXJpZXMuICBSRVFVSVJFRC4KKyAgICAqLworICAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NUUklORywKKyAgICAgIHBuZ192b2lkcCB1c2VyX2Vycm9yX3B0ciwgdXNlcl9lcnJvcl9mbiwgdXNlcl93YXJuaW5nX2ZuKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgIHsKKyAgICAgIGZjbG9zZShmcCk7CisgICAgICByZXR1cm4gKEVSUk9SKTsKKyAgIH0KKworICAgLyogQWxsb2NhdGUvaW5pdGlhbGl6ZSB0aGUgaW1hZ2UgaW5mb3JtYXRpb24gZGF0YS4gIFJFUVVJUkVEICovCisgICBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7CisgICBpZiAoaW5mb19wdHIgPT0gTlVMTCkKKyAgIHsKKyAgICAgIGZjbG9zZShmcCk7CisgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsICBOVUxMKTsKKyAgICAgIHJldHVybiAoRVJST1IpOworICAgfQorCisgICAvKiBTZXQgZXJyb3IgaGFuZGxpbmcuICBSRVFVSVJFRCBpZiB5b3UgYXJlbid0IHN1cHBseWluZyB5b3VyIG93bgorICAgICogZXJyb3IgaGFuZGxpbmcgZnVuY3Rpb25zIGluIHRoZSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCgpIGNhbGwuCisgICAgKi8KKyAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpCisgICB7CisgICAgICAvKiBJZiB3ZSBnZXQgaGVyZSwgd2UgaGFkIGEgcHJvYmxlbSB3cml0aW5nIHRoZSBmaWxlICovCisgICAgICBmY2xvc2UoZnApOworICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIpOworICAgICAgcmV0dXJuIChFUlJPUik7CisgICB9CisKKyAgIC8qIE9uZSBvZiB0aGUgZm9sbG93aW5nIEkvTyBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgaXMgUkVRVUlSRUQgKi8KKworI2lmZGVmIHN0cmVhbXMgLyogSS9PIGluaXRpYWxpemF0aW9uIG1ldGhvZCAxICovCisgICAvKiBTZXQgdXAgdGhlIG91dHB1dCBjb250cm9sIGlmIHlvdSBhcmUgdXNpbmcgc3RhbmRhcmQgQyBzdHJlYW1zICovCisgICBwbmdfaW5pdF9pbyhwbmdfcHRyLCBmcCk7CisKKyNlbHNlIG5vX3N0cmVhbXMgLyogSS9PIGluaXRpYWxpemF0aW9uIG1ldGhvZCAyICovCisgICAvKiBJZiB5b3UgYXJlIHVzaW5nIHJlcGxhY2VtZW50IHdyaXRlIGZ1bmN0aW9ucywgaW5zdGVhZCBvZiBjYWxsaW5nCisgICAgKiBwbmdfaW5pdF9pbygpIGhlcmUgeW91IHdvdWxkIGNhbGwKKyAgICAqLworICAgcG5nX3NldF93cml0ZV9mbihwbmdfcHRyLCAodm9pZCAqKXVzZXJfaW9fcHRyLCB1c2VyX3dyaXRlX2ZuLAorICAgICAgdXNlcl9JT19mbHVzaF9mdW5jdGlvbik7CisgICAvKiB3aGVyZSB1c2VyX2lvX3B0ciBpcyBhIHN0cnVjdHVyZSB5b3Ugd2FudCBhdmFpbGFibGUgdG8gdGhlIGNhbGxiYWNrcyAqLworI2VuZGlmIG5vX3N0cmVhbXMgLyogT25seSB1c2Ugb25lIGluaXRpYWxpemF0aW9uIG1ldGhvZCAqLworCisjaWZkZWYgaGlsZXZlbAorICAgLyogVGhpcyBpcyB0aGUgZWFzeSB3YXkuICBVc2UgaXQgaWYgeW91IGFscmVhZHkgaGF2ZSBhbGwgdGhlCisgICAgKiBpbWFnZSBpbmZvIGxpdmluZyBpbiB0aGUgc3RydWN0dXJlLiAgWW91IGNvdWxkICJ8IiBtYW55CisgICAgKiBQTkdfVFJBTlNGT1JNIGZsYWdzIGludG8gdGhlIHBuZ190cmFuc2Zvcm1zIGludGVnZXIgaGVyZS4KKyAgICAqLworICAgcG5nX3dyaXRlX3BuZyhwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3RyYW5zZm9ybXMsIE5VTEwpOworCisjZWxzZQorICAgLyogVGhpcyBpcyB0aGUgaGFyZCB3YXkgKi8KKworICAgLyogU2V0IHRoZSBpbWFnZSBpbmZvcm1hdGlvbiBoZXJlLiAgV2lkdGggYW5kIGhlaWdodCBhcmUgdXAgdG8gMl4zMSwKKyAgICAqIGJpdF9kZXB0aCBpcyBvbmUgb2YgMSwgMiwgNCwgOCwgb3IgMTYsIGJ1dCB2YWxpZCB2YWx1ZXMgYWxzbyBkZXBlbmQgb24KKyAgICAqIHRoZSBjb2xvcl90eXBlIHNlbGVjdGVkLiBjb2xvcl90eXBlIGlzIG9uZSBvZiBQTkdfQ09MT1JfVFlQRV9HUkFZLAorICAgICogUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSwgUE5HX0NPTE9SX1RZUEVfUEFMRVRURSwgUE5HX0NPTE9SX1RZUEVfUkdCLAorICAgICogb3IgUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBLiAgaW50ZXJsYWNlIGlzIGVpdGhlciBQTkdfSU5URVJMQUNFX05PTkUgb3IKKyAgICAqIFBOR19JTlRFUkxBQ0VfQURBTTcsIGFuZCB0aGUgY29tcHJlc3Npb25fdHlwZSBhbmQgZmlsdGVyX3R5cGUgTVVTVAorICAgICogY3VycmVudGx5IGJlIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UgYW5kIFBOR19GSUxURVJfVFlQRV9CQVNFLiBSRVFVSVJFRAorICAgICovCisgICBwbmdfc2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIHdpZHRoLCBoZWlnaHQsIGJpdF9kZXB0aCwgUE5HX0NPTE9SX1RZUEVfPz8/LAorICAgICAgUE5HX0lOVEVSTEFDRV8/Pz8/LCBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFLCBQTkdfRklMVEVSX1RZUEVfQkFTRSk7CisKKyAgIC8qIFNldCB0aGUgcGFsZXR0ZSBpZiB0aGVyZSBpcyBvbmUuICBSRVFVSVJFRCBmb3IgaW5kZXhlZC1jb2xvciBpbWFnZXMgKi8KKyAgIHBhbGV0dGUgPSAocG5nX2NvbG9ycClwbmdfbWFsbG9jKHBuZ19wdHIsIFBOR19NQVhfUEFMRVRURV9MRU5HVEgKKyAgICAgICAgICAgICAqIChzaXplb2YgKHBuZ19jb2xvcikpKTsKKyAgIC8qIC4uLiBTZXQgcGFsZXR0ZSBjb2xvcnMgLi4uICovCisgICBwbmdfc2V0X1BMVEUocG5nX3B0ciwgaW5mb19wdHIsIHBhbGV0dGUsIFBOR19NQVhfUEFMRVRURV9MRU5HVEgpOworICAgLyogWW91IG11c3Qgbm90IGZyZWUgcGFsZXR0ZSBoZXJlLCBiZWNhdXNlIHBuZ19zZXRfUExURSBvbmx5IG1ha2VzIGEgbGluayB0bworICAgICogdGhlIHBhbGV0dGUgdGhhdCB5b3UgbWFsbG9jZWQuICBXYWl0IHVudGlsIHlvdSBhcmUgYWJvdXQgdG8gZGVzdHJveQorICAgICogdGhlIHBuZyBzdHJ1Y3R1cmUuCisgICAgKi8KKworICAgLyogT3B0aW9uYWwgc2lnbmlmaWNhbnQgYml0IChzQklUKSBjaHVuayAqLworICAgcG5nX2NvbG9yXzggc2lnX2JpdDsKKworICAgLyogSWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIGdyYXlzY2FsZSBpbWFnZSB0aGVuICovCisgICBzaWdfYml0LmdyYXkgPSB0cnVlX2JpdF9kZXB0aDsKKworICAgLyogT3RoZXJ3aXNlLCBpZiB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgY29sb3IgaW1hZ2UgdGhlbiAqLworICAgc2lnX2JpdC5yZWQgPSB0cnVlX3JlZF9iaXRfZGVwdGg7CisgICBzaWdfYml0LmdyZWVuID0gdHJ1ZV9ncmVlbl9iaXRfZGVwdGg7CisgICBzaWdfYml0LmJsdWUgPSB0cnVlX2JsdWVfYml0X2RlcHRoOworCisgICAvKiBJZiB0aGUgaW1hZ2UgaGFzIGFuIGFscGhhIGNoYW5uZWwgdGhlbiAqLworICAgc2lnX2JpdC5hbHBoYSA9IHRydWVfYWxwaGFfYml0X2RlcHRoOworCisgICBwbmdfc2V0X3NCSVQocG5nX3B0ciwgaW5mb19wdHIsICZzaWdfYml0KTsKKworCisgICAvKiBPcHRpb25hbCBnYW1tYSBjaHVuayBpcyBzdHJvbmdseSBzdWdnZXN0ZWQgaWYgeW91IGhhdmUgYW55IGd1ZXNzCisgICAgKiBhcyB0byB0aGUgY29ycmVjdCBnYW1tYSBvZiB0aGUgaW1hZ2UuCisgICAgKi8KKyAgIHBuZ19zZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgZ2FtbWEpOworCisgICAvKiBPcHRpb25hbGx5IHdyaXRlIGNvbW1lbnRzIGludG8gdGhlIGltYWdlICovCisgICB7CisgICAgICBwbmdfdGV4dCB0ZXh0X3B0clszXTsKKworICAgICAgY2hhciBrZXkwW109IlRpdGxlIjsKKyAgICAgIGNoYXIgdGV4dDBbXT0iTW9uYSBMaXNhIjsKKyAgICAgIHRleHRfcHRyWzBdLmtleSA9IGtleTA7CisgICAgICB0ZXh0X3B0clswXS50ZXh0ID0gdGV4dDA7CisgICAgICB0ZXh0X3B0clswXS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkU7CisgICAgICB0ZXh0X3B0clswXS5pdHh0X2xlbmd0aCA9IDA7CisgICAgICB0ZXh0X3B0clswXS5sYW5nID0gTlVMTDsKKyAgICAgIHRleHRfcHRyWzBdLmxhbmdfa2V5ID0gTlVMTDsKKworICAgICAgY2hhciBrZXkxW109IkF1dGhvciI7CisgICAgICBjaGFyIHRleHQxW109Ikxlb25hcmRvIERhVmluY2kiOworICAgICAgdGV4dF9wdHJbMV0ua2V5ID0ga2V5MTsKKyAgICAgIHRleHRfcHRyWzFdLnRleHQgPSB0ZXh0MTsKKyAgICAgIHRleHRfcHRyWzFdLmNvbXByZXNzaW9uID0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORTsKKyAgICAgIHRleHRfcHRyWzFdLml0eHRfbGVuZ3RoID0gMDsKKyAgICAgIHRleHRfcHRyWzFdLmxhbmcgPSBOVUxMOworICAgICAgdGV4dF9wdHJbMV0ubGFuZ19rZXkgPSBOVUxMOworCisgICAgICBjaGFyIGtleTJbXT0iRGVzY3JpcHRpb24iOworICAgICAgY2hhciB0ZXh0MltdPSI8bG9uZyB0ZXh0PiI7CisgICAgICB0ZXh0X3B0clsyXS5rZXkgPSBrZXkyOworICAgICAgdGV4dF9wdHJbMl0udGV4dCA9IHRleHQyOworICAgICAgdGV4dF9wdHJbMl0uY29tcHJlc3Npb24gPSBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0OworICAgICAgdGV4dF9wdHJbMl0uaXR4dF9sZW5ndGggPSAwOworICAgICAgdGV4dF9wdHJbMl0ubGFuZyA9IE5VTEw7CisgICAgICB0ZXh0X3B0clsyXS5sYW5nX2tleSA9IE5VTEw7CisKKyAgICAgIHBuZ19zZXRfdGV4dCh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCB0ZXh0X3B0ciwgMyk7CisgICB9CisKKyAgIC8qIE90aGVyIG9wdGlvbmFsIGNodW5rcyBsaWtlIGNIUk0sIGJLR0QsIHRSTlMsIHRJTUUsIG9GRnMsIHBIWXMgKi8KKworICAgLyogTm90ZSB0aGF0IGlmIHNSR0IgaXMgcHJlc2VudCB0aGUgZ0FNQSBhbmQgY0hSTSBjaHVua3MgbXVzdCBiZSBpZ25vcmVkCisgICAgKiBvbiByZWFkIGFuZCwgaWYgeW91ciBhcHBsaWNhdGlvbiBjaG9vc2VzIHRvIHdyaXRlIHRoZW0sIHRoZXkgbXVzdAorICAgICogYmUgd3JpdHRlbiBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHNSR0IgcHJvZmlsZQorICAgICovCisKKyAgIC8qIFdyaXRlIHRoZSBmaWxlIGhlYWRlciBpbmZvcm1hdGlvbi4gIFJFUVVJUkVEICovCisgICBwbmdfd3JpdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7CisKKyAgIC8qIElmIHlvdSB3YW50LCB5b3UgY2FuIHdyaXRlIHRoZSBpbmZvIGluIHR3byBzdGVwcywgaW4gY2FzZSB5b3UgbmVlZCB0bworICAgICogd3JpdGUgeW91ciBwcml2YXRlIGNodW5rIGFoZWFkIG9mIFBMVEU6CisgICAgKgorICAgICogICBwbmdfd3JpdGVfaW5mb19iZWZvcmVfUExURSh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyKTsKKyAgICAqICAgd3JpdGVfbXlfY2h1bmsoKTsKKyAgICAqICAgcG5nX3dyaXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOworICAgICoKKyAgICAqIEhvd2V2ZXIsIGdpdmVuIHRoZSBsZXZlbCBvZiBrbm93bi0gYW5kIHVua25vd24tY2h1bmsgc3VwcG9ydCBpbiAxLjIuMAorICAgICogYW5kIHVwLCB0aGlzIHNob3VsZCBubyBsb25nZXIgYmUgbmVjZXNzYXJ5LgorICAgICovCisKKyAgIC8qIE9uY2Ugd2Ugd3JpdGUgb3V0IHRoZSBoZWFkZXIsIHRoZSBjb21wcmVzc2lvbiB0eXBlIG9uIHRoZSB0ZXh0CisgICAgKiBjaHVuayBnZXRzIGNoYW5nZWQgdG8gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORV9XUiBvcgorICAgICogUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdF9XUiwgc28gaXQgZG9lc24ndCBnZXQgd3JpdHRlbiBvdXQgYWdhaW4KKyAgICAqIGF0IHRoZSBlbmQuCisgICAgKi8KKworICAgLyogU2V0IHVwIHRoZSB0cmFuc2Zvcm1hdGlvbnMgeW91IHdhbnQuICBOb3RlIHRoYXQgdGhlc2UgYXJlCisgICAgKiBhbGwgb3B0aW9uYWwuICBPbmx5IGNhbGwgdGhlbSBpZiB5b3Ugd2FudCB0aGVtLgorICAgICovCisKKyAgIC8qIEludmVydCBtb25vY2hyb21lIHBpeGVscyAqLworICAgcG5nX3NldF9pbnZlcnRfbW9ubyhwbmdfcHRyKTsKKworICAgLyogU2hpZnQgdGhlIHBpeGVscyB1cCB0byBhIGxlZ2FsIGJpdCBkZXB0aCBhbmQgZmlsbCBpbgorICAgICogYXMgYXBwcm9wcmlhdGUgdG8gY29ycmVjdGx5IHNjYWxlIHRoZSBpbWFnZS4KKyAgICAqLworICAgcG5nX3NldF9zaGlmdChwbmdfcHRyLCAmc2lnX2JpdCk7CisKKyAgIC8qIFBhY2sgcGl4ZWxzIGludG8gYnl0ZXMgKi8KKyAgIHBuZ19zZXRfcGFja2luZyhwbmdfcHRyKTsKKworICAgLyogU3dhcCBsb2NhdGlvbiBvZiBhbHBoYSBieXRlcyBmcm9tIEFSR0IgdG8gUkdCQSAqLworICAgcG5nX3NldF9zd2FwX2FscGhhKHBuZ19wdHIpOworCisgICAvKiBHZXQgcmlkIG9mIGZpbGxlciAoT1IgQUxQSEEpIGJ5dGVzLCBwYWNrIFhSR0IvUkdCWC9BUkdCL1JHQkEgaW50bworICAgICogUkdCICg0IGNoYW5uZWxzIC0+IDMgY2hhbm5lbHMpLiBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyBub3QgdXNlZC4KKyAgICAqLworICAgcG5nX3NldF9maWxsZXIocG5nX3B0ciwgMCwgUE5HX0ZJTExFUl9CRUZPUkUpOworCisgICAvKiBGbGlwIEJHUiBwaXhlbHMgdG8gUkdCICovCisgICBwbmdfc2V0X2JncihwbmdfcHRyKTsKKworICAgLyogU3dhcCBieXRlcyBvZiAxNi1iaXQgZmlsZXMgdG8gbW9zdCBzaWduaWZpY2FudCBieXRlIGZpcnN0ICovCisgICBwbmdfc2V0X3N3YXAocG5nX3B0cik7CisKKyAgIC8qIFN3YXAgYml0cyBvZiAxLWJpdCwgMi1iaXQsIDQtYml0IHBhY2tlZCBwaXhlbCBmb3JtYXRzICovCisgICBwbmdfc2V0X3BhY2tzd2FwKHBuZ19wdHIpOworCisgICAvKiBUdXJuIG9uIGludGVybGFjZSBoYW5kbGluZyBpZiB5b3UgYXJlIG5vdCB1c2luZyBwbmdfd3JpdGVfaW1hZ2UoKSAqLworICAgaWYgKGludGVybGFjaW5nICE9IDApCisgICAgICBudW1iZXJfcGFzc2VzID0gcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3B0cik7CisKKyAgIGVsc2UKKyAgICAgIG51bWJlcl9wYXNzZXMgPSAxOworCisgICAvKiBUaGUgZWFzaWVzdCB3YXkgdG8gd3JpdGUgdGhlIGltYWdlICh5b3UgbWF5IGhhdmUgYSBkaWZmZXJlbnQgbWVtb3J5CisgICAgKiBsYXlvdXQsIGhvd2V2ZXIsIHNvIGNob29zZSB3aGF0IGZpdHMgeW91ciBuZWVkcyBiZXN0KS4gIFlvdSBuZWVkIHRvCisgICAgKiB1c2UgdGhlIGZpcnN0IG1ldGhvZCBpZiB5b3UgYXJlbid0IGhhbmRsaW5nIGludGVybGFjaW5nIHlvdXJzZWxmLgorICAgICovCisgICBwbmdfdWludF8zMiBrLCBoZWlnaHQsIHdpZHRoOworCisgICAvKiBJbiB0aGlzIGV4YW1wbGUsICJpbWFnZSIgaXMgYSBvbmUtZGltZW5zaW9uYWwgYXJyYXkgb2YgYnl0ZXMgKi8KKyAgIHBuZ19ieXRlIGltYWdlW2hlaWdodCp3aWR0aCpieXRlc19wZXJfcGl4ZWxdOworCisgICBwbmdfYnl0ZXAgcm93X3BvaW50ZXJzW2hlaWdodF07CisKKyAgIGlmIChoZWlnaHQgPiBQTkdfVUlOVF8zMl9NQVgvKHNpemVvZiAocG5nX2J5dGVwKSkpCisgICAgIHBuZ19lcnJvciAocG5nX3B0ciwgIkltYWdlIGlzIHRvbyB0YWxsIHRvIHByb2Nlc3MgaW4gbWVtb3J5Iik7CisKKyAgIC8qIFNldCB1cCBwb2ludGVycyBpbnRvIHlvdXIgImltYWdlIiBieXRlIGFycmF5ICovCisgICBmb3IgKGsgPSAwOyBrIDwgaGVpZ2h0OyBrKyspCisgICAgIHJvd19wb2ludGVyc1trXSA9IGltYWdlICsgayp3aWR0aCpieXRlc19wZXJfcGl4ZWw7CisKKyAgIC8qIE9uZSBvZiB0aGUgZm9sbG93aW5nIG91dHB1dCBtZXRob2RzIGlzIFJFUVVJUkVEICovCisKKyNpZmRlZiBlbnRpcmUgLyogV3JpdGUgb3V0IHRoZSBlbnRpcmUgaW1hZ2UgZGF0YSBpbiBvbmUgY2FsbCAqLworICAgcG5nX3dyaXRlX2ltYWdlKHBuZ19wdHIsIHJvd19wb2ludGVycyk7CisKKyAgIC8qIFRoZSBvdGhlciB3YXkgdG8gd3JpdGUgdGhlIGltYWdlIC0gZGVhbCB3aXRoIGludGVybGFjaW5nICovCisKKyNlbHNlIG5vX2VudGlyZSAvKiBXcml0ZSBvdXQgdGhlIGltYWdlIGRhdGEgYnkgb25lIG9yIG1vcmUgc2NhbmxpbmVzICovCisKKyAgIC8qIFRoZSBudW1iZXIgb2YgcGFzc2VzIGlzIGVpdGhlciAxIGZvciBub24taW50ZXJsYWNlZCBpbWFnZXMsCisgICAgKiBvciA3IGZvciBpbnRlcmxhY2VkIGltYWdlcy4KKyAgICAqLworICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IG51bWJlcl9wYXNzZXM7IHBhc3MrKykKKyAgIHsKKyAgICAgIC8qIFdyaXRlIGEgZmV3IHJvd3MgYXQgYSB0aW1lLiAqLworICAgICAgcG5nX3dyaXRlX3Jvd3MocG5nX3B0ciwgJnJvd19wb2ludGVyc1tmaXJzdF9yb3ddLCBudW1iZXJfb2Zfcm93cyk7CisKKyAgICAgIC8qIElmIHlvdSBhcmUgb25seSB3cml0aW5nIG9uZSByb3cgYXQgYSB0aW1lLCB0aGlzIHdvcmtzICovCisgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisgICAgICAgICBwbmdfd3JpdGVfcm93cyhwbmdfcHRyLCAmcm93X3BvaW50ZXJzW3ldLCAxKTsKKyAgIH0KKyNlbmRpZiBub19lbnRpcmUgLyogVXNlIG9ubHkgb25lIG91dHB1dCBtZXRob2QgKi8KKworICAgLyogWW91IGNhbiB3cml0ZSBvcHRpb25hbCBjaHVua3MgbGlrZSB0RVh0LCB6VFh0LCBhbmQgdElNRSBhdCB0aGUgZW5kCisgICAgKiBhcyB3ZWxsLiAgU2hvdWxkbid0IGJlIG5lY2Vzc2FyeSBpbiAxLjIuMCBhbmQgdXAgYXMgYWxsIHRoZSBwdWJsaWMKKyAgICAqIGNodW5rcyBhcmUgc3VwcG9ydGVkIGFuZCB5b3UgY2FuIHVzZSBwbmdfc2V0X3Vua25vd25fY2h1bmtzKCkgdG8KKyAgICAqIHJlZ2lzdGVyIHVua25vd24gY2h1bmtzIGludG8gdGhlIGluZm8gc3RydWN0dXJlIHRvIGJlIHdyaXR0ZW4gb3V0LgorICAgICovCisKKyAgIC8qIEl0IGlzIFJFUVVJUkVEIHRvIGNhbGwgdGhpcyB0byBmaW5pc2ggd3JpdGluZyB0aGUgcmVzdCBvZiB0aGUgZmlsZSAqLworICAgcG5nX3dyaXRlX2VuZChwbmdfcHRyLCBpbmZvX3B0cik7CisjZW5kaWYgaGlsZXZlbAorCisgICAvKiBJZiB5b3UgcG5nX21hbGxvY2VkIGEgcGFsZXR0ZSwgZnJlZSBpdCBoZXJlIChkb24ndCBmcmVlIGluZm9fcHRyLT5wYWxldHRlLAorICAgICogYXMgcmVjb21tZW5kZWQgaW4gdmVyc2lvbnMgMS4wLjVtIGFuZCBlYXJsaWVyIG9mIHRoaXMgZXhhbXBsZTsgaWYKKyAgICAqIGxpYnBuZyBtYWxsb2NzIGluZm9fcHRyLT5wYWxldHRlLCBsaWJwbmcgd2lsbCBmcmVlIGl0KS4gIElmIHlvdQorICAgICogYWxsb2NhdGVkIGl0IHdpdGggbWFsbG9jKCkgaW5zdGVhZCBvZiBwbmdfbWFsbG9jKCksIHVzZSBmcmVlKCkgaW5zdGVhZAorICAgICogb2YgcG5nX2ZyZWUoKS4KKyAgICAqLworICAgcG5nX2ZyZWUocG5nX3B0ciwgcGFsZXR0ZSk7CisgICBwYWxldHRlID0gTlVMTDsKKworICAgLyogU2ltaWxhcmx5LCBpZiB5b3UgcG5nX21hbGxvY2VkIGFueSBkYXRhIHRoYXQgeW91IHBhc3NlZCBpbiB3aXRoCisgICAgKiBwbmdfc2V0X3NvbWV0aGluZygpLCBzdWNoIGFzIGEgaGlzdCBvciB0cmFucyBhcnJheSwgZnJlZSBpdCBoZXJlLAorICAgICogd2hlbiB5b3UgY2FuIGJlIHN1cmUgdGhhdCBsaWJwbmcgaXMgdGhyb3VnaCB3aXRoIGl0LgorICAgICovCisgICBwbmdfZnJlZShwbmdfcHRyLCB0cmFucyk7CisgICB0cmFucyA9IE5VTEw7CisgICAvKiBXaGVuZXZlciB5b3UgdXNlIHBuZ19mcmVlKCkgaXQgaXMgYSBnb29kIGlkZWEgdG8gc2V0IHRoZSBwb2ludGVyIHRvCisgICAgKiBOVUxMIGluIGNhc2UgeW91ciBhcHBsaWNhdGlvbiBpbmFkdmVydGVudGx5IHRyaWVzIHRvIHBuZ19mcmVlKCkgaXQKKyAgICAqIGFnYWluLiAgV2hlbiBwbmdfZnJlZSgpIHNlZXMgYSBOVUxMIGl0IHJldHVybnMgd2l0aG91dCBhY3Rpb24sIHRodXMKKyAgICAqIGF2b2lkaW5nIHRoZSBkb3VibGUtZnJlZSBzZWN1cml0eSBwcm9ibGVtLgorICAgICovCisKKyAgIC8qIENsZWFuIHVwIGFmdGVyIHRoZSB3cml0ZSwgYW5kIGZyZWUgYW55IG1lbW9yeSBhbGxvY2F0ZWQgKi8KKyAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyKTsKKworICAgLyogQ2xvc2UgdGhlIGZpbGUgKi8KKyAgIGZjbG9zZShmcCk7CisKKyAgIC8qIFRoYXQncyBpdCAqLworICAgcmV0dXJuIChPSyk7Cit9CisKKyNlbmRpZiAvKiBpZiAwICovCmRpZmYgLS1naXQgYS9saWJwbmcvbGlicG5nLWNvbmZpZy5pbiBiL2xpYnBuZy9saWJwbmctY29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YmY4ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvbGlicG5nLWNvbmZpZy5pbgpAQCAtMCwwICsxLDEyNyBAQAorIyEgL2Jpbi9zaAorCisjIGxpYnBuZy1jb25maWcKKyMgcHJvdmlkZXMgY29uZmlndXJhdGlvbiBpbmZvIGZvciBsaWJwbmcuCisKKyMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA0LCAyMDA2LCAyMDA3IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorCisjIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisjIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKworIyBNb2RlbGVkIGFmdGVyIGxpYnhtbC1jb25maWcuCisKK3ZlcnNpb249IkBQTkdMSUJfVkVSU0lPTkAiCitwcmVmaXg9IkBwcmVmaXhAIgorZXhlY19wcmVmaXg9IkBleGVjX3ByZWZpeEAiCitsaWJkaXI9IkBsaWJkaXJAIgoraW5jbHVkZWRpcj0iQGluY2x1ZGVkaXJAL2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAiCitsaWJzPSItbHBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAiCithbGxfbGlicz0iLWxwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAIEBMSUJTQCIKK0lfb3B0cz0iLUkke2luY2x1ZGVkaXJ9IgorTF9vcHRzPSItTCR7bGliZGlyfSIKK1Jfb3B0cz0iIgorY3BwZmxhZ3M9IiIKK2Njb3B0cz0iIgorbGRvcHRzPSIiCisKK3VzYWdlKCkKK3sKKyAgICBjYXQgPDxFT0YKK1VzYWdlOiAkMCBbT1BUSU9OXSAuLi4KKworS25vd24gdmFsdWVzIGZvciBPUFRJT04gYXJlOgorCisgIC0tcHJlZml4ICAgICAgICBwcmludCBsaWJwbmcgcHJlZml4CisgIC0tbGliZGlyICAgICAgICBwcmludCBwYXRoIHRvIGRpcmVjdG9yeSBjb250YWluaW5nIGxpYnJhcnkKKyAgLS1saWJzICAgICAgICAgIHByaW50IGxpYnJhcnkgbGlua2luZyBpbmZvcm1hdGlvbgorICAtLWNjb3B0cyAgICAgICAgcHJpbnQgY29tcGlsZXIgb3B0aW9ucworICAtLWNwcGZsYWdzICAgICAgcHJpbnQgcHJlLXByb2Nlc3NvciBmbGFncworICAtLWNmbGFncyAgICAgICAgcHJpbnQgcHJlcHJvY2Vzc29yIGZsYWdzLCBJX29wdHMsIGFuZCBjb21waWxlciBvcHRpb25zCisgIC0tSV9vcHRzICAgICAgICBwcmludCAiLUkiIGluY2x1ZGUgb3B0aW9ucworICAtLUxfb3B0cyAgICAgICAgcHJpbnQgbGlua2VyICItTCIgZmxhZ3MgZm9yIGR5bmFtaWMgbGlua2luZworICAtLVJfb3B0cyAgICAgICAgcHJpbnQgZHluYW1pYyBsaW5rZXIgIi1SIiBvciAiLXJwYXRoIiBmbGFncworICAtLWxkb3B0cyAgICAgICAgcHJpbnQgbGlua2VyIG9wdGlvbnMKKyAgLS1sZGZsYWdzICAgICAgIHByaW50IGxpbmtlciBmbGFncyAobGRvcHRzLCBMX29wdHMsIFJfb3B0cywgYW5kIGxpYnMpCisgIC0tc3RhdGljICAgICAgICByZXZpc2Ugc3Vic2VxdWVudCBvdXRwdXRzIGZvciBzdGF0aWMgbGlua2luZworICAtLWhlbHAgICAgICAgICAgcHJpbnQgdGhpcyBoZWxwIGFuZCBleGl0CisgIC0tdmVyc2lvbiAgICAgICBwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uCitFT0YKKworICAgIGV4aXQgJDEKK30KKworaWYgdGVzdCAkIyAtZXEgMDsgdGhlbgorICAgIHVzYWdlIDEKK2ZpCisKK3doaWxlIHRlc3QgJCMgLWd0IDA7IGRvCisgICAgY2FzZSAiJDEiIGluCisKKyAgICAtLXByZWZpeCkKKyAgICAgICAgZWNobyAke3ByZWZpeH0KKyAgICAgICAgOzsKKworICAgIC0tdmVyc2lvbikKKyAgICAgICAgZWNobyAke3ZlcnNpb259CisgICAgICAgIGV4aXQgMAorICAgICAgICA7OworCisgICAgLS1oZWxwKQorICAgICAgICB1c2FnZSAwCisgICAgICAgIDs7CisKKyAgICAtLWNjb3B0cykKKyAgICAgICAgZWNobyAke2Njb3B0c30KKyAgICAgICAgOzsKKworICAgIC0tY3BwZmxhZ3MpCisgICAgICAgIGVjaG8gJHtjcHBmbGFnc30KKyAgICAgICAgOzsKKworICAgIC0tY2ZsYWdzKQorICAgICAgICBlY2hvICR7SV9vcHRzfSAke2NwcGZsYWdzfSAke2Njb3B0c30KKyAgICAgICAgOzsKKworICAgIC0tbGliZGlyKQorICAgICAgICBlY2hvICR7bGliZGlyfQorICAgICAgICA7OworCisgICAgLS1saWJzKQorICAgICAgICBlY2hvICR7bGlic30KKyAgICAgICAgOzsKKworICAgIC0tSV9vcHRzKQorICAgICAgICBlY2hvICR7SV9vcHRzfQorICAgICAgICA7OworCisgICAgLS1MX29wdHMpCisgICAgICAgIGVjaG8gJHtMX29wdHN9CisgICAgICAgIDs7CisKKyAgICAtLVJfb3B0cykKKyAgICAgICAgZWNobyAke1Jfb3B0c30KKyAgICAgICAgOzsKKworICAgIC0tbGRvcHRzKQorICAgICAgICBlY2hvICR7bGRvcHRzfQorICAgICAgICA7OworCisgICAgLS1sZGZsYWdzKQorICAgICAgICBlY2hvICR7bGRvcHRzfSAke0xfb3B0c30gJHtSX29wdHN9ICR7bGlic30KKyAgICAgICAgOzsKKworICAgIC0tc3RhdGljKQorICAgICAgICBSX29wdHM9IiIKKyAgICAgICAgbGlicz0ke2FsbF9saWJzfQorICAgICAgICA7OworCisgICAgKikKKyAgICAgICAgdXNhZ2UKKyAgICAgICAgZXhpdCAxCisgICAgICAgIDs7CisgICAgZXNhYworICAgIHNoaWZ0Citkb25lCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvbGlicG5nL2xpYnBuZy1tYW51YWwudHh0IGIvbGlicG5nL2xpYnBuZy1tYW51YWwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZWViMmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvbGlicG5nLW1hbnVhbC50eHQKQEAgLTAsMCArMSw1Mzc0IEBACitsaWJwbmctbWFudWFsLnR4dCAtIEEgZGVzY3JpcHRpb24gb24gaG93IHRvIHVzZSBhbmQgbW9kaWZ5IGxpYnBuZworCisgbGlicG5nIHZlcnNpb24gMS42LjIwIC0gRGVjZW1iZXIgMywgMjAxNQorIFVwZGF0ZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorIDxnbGVubnJwIGF0IHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNSBHbGVubiBSYW5kZXJzLVBlaHJzb24KKworIFRoaXMgZG9jdW1lbnQgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyBhbmQgbGljZW5zZSBpbiBwbmcuaAorCisgQmFzZWQgb246CisKKyBsaWJwbmcgdmVyc2lvbnMgMC45NywgSmFudWFyeSAxOTk4LCB0aHJvdWdoIDEuNi4yMCAtIERlY2VtYmVyIDMsIDIwMTUKKyBVcGRhdGVkIGFuZCBkaXN0cmlidXRlZCBieSBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNSBHbGVubiBSYW5kZXJzLVBlaHJzb24KKworIGxpYnBuZyAxLjAgYmV0YSA2IC0gdmVyc2lvbiAwLjk2IC0gTWF5IDI4LCAxOTk3CisgVXBkYXRlZCBhbmQgZGlzdHJpYnV0ZWQgYnkgQW5kcmVhcyBEaWxnZXIKKyBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIKKworIGxpYnBuZyAxLjAgYmV0YSAyIC0gdmVyc2lvbiAwLjg4IC0gSmFudWFyeSAyNiwgMTk5NgorIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0Cisgbm90aWNlIGluIHBuZy5oLiBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMKKyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KKworIFVwZGF0ZWQvcmV3cml0dGVuIHBlciByZXF1ZXN0IGluIHRoZSBsaWJwbmcgRkFRCisgQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEZyYW5rIEouIFQuIFdvamNpaworIERlY2VtYmVyIDE4LCAxOTk1ICYgSmFudWFyeSAyMCwgMTk5NgorCisgVEFCTEUgT0YgQ09OVEVOVFMKKworICAgIEkuIEludHJvZHVjdGlvbgorICAgSUkuIFN0cnVjdHVyZXMKKyAgSUlJLiBSZWFkaW5nCisgICBJVi4gV3JpdGluZworICAgIFYuIFNpbXBsaWZpZWQgQVBJCisgICBWSS4gTW9kaWZ5aW5nL0N1c3RvbWl6aW5nIGxpYnBuZworICBWSUkuIE1ORyBzdXBwb3J0CisgVklJSS4gQ2hhbmdlcyB0byBMaWJwbmcgZnJvbSB2ZXJzaW9uIDAuODgKKyAgIElYLiBDaGFuZ2VzIHRvIExpYnBuZyBmcm9tIHZlcnNpb24gMS4wLnggdG8gMS4yLngKKyAgICBYLiBDaGFuZ2VzIHRvIExpYnBuZyBmcm9tIHZlcnNpb24gMS4wLngvMS4yLnggdG8gMS40LngKKyAgIFhJLiBDaGFuZ2VzIHRvIExpYnBuZyBmcm9tIHZlcnNpb24gMS40LnggdG8gMS41LngKKyAgWElJLiBDaGFuZ2VzIHRvIExpYnBuZyBmcm9tIHZlcnNpb24gMS41LnggdG8gMS42LngKKyBYSUlJLiBEZXRlY3RpbmcgbGlicG5nCisgIFhJVi4gU291cmNlIGNvZGUgcmVwb3NpdG9yeQorICAgWFYuIENvZGluZyBzdHlsZQorICBYVkkuIFkySyBDb21wbGlhbmNlIGluIGxpYnBuZworCitJLiBJbnRyb2R1Y3Rpb24KKworVGhpcyBmaWxlIGRlc2NyaWJlcyBob3cgdG8gdXNlIGFuZCBtb2RpZnkgdGhlIFBORyByZWZlcmVuY2UgbGlicmFyeQorKGtub3duIGFzIGxpYnBuZykgZm9yIHlvdXIgb3duIHVzZS4gIEluIGFkZGl0aW9uIHRvIHRoaXMKK2ZpbGUsIGV4YW1wbGUuYyBpcyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQgZm9yIHVzaW5nIHRoZSBsaWJyYXJ5LCBhcworaXQgaXMgaGVhdmlseSBjb21tZW50ZWQgYW5kIHNob3VsZCBpbmNsdWRlIGV2ZXJ5dGhpbmcgbW9zdCBwZW9wbGUKK3dpbGwgbmVlZC4gIFdlIGFzc3VtZSB0aGF0IGxpYnBuZyBpcyBhbHJlYWR5IGluc3RhbGxlZDsgc2VlIHRoZQorSU5TVEFMTCBmaWxlIGZvciBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGNvbmZpZ3VyZSBhbmQgaW5zdGFsbCBsaWJwbmcuCisKK0ZvciBleGFtcGxlcyBvZiBsaWJwbmcgdXNhZ2UsIHNlZSB0aGUgZmlsZXMgImV4YW1wbGUuYyIsICJwbmd0ZXN0LmMiLAorYW5kIHRoZSBmaWxlcyBpbiB0aGUgImNvbnRyaWIiIGRpcmVjdG9yeSwgYWxsIG9mIHdoaWNoIGFyZSBpbmNsdWRlZCBpbgordGhlIGxpYnBuZyBkaXN0cmlidXRpb24uCisKK0xpYnBuZyB3YXMgd3JpdHRlbiBhcyBhIGNvbXBhbmlvbiB0byB0aGUgUE5HIHNwZWNpZmljYXRpb24sIGFzIGEgd2F5CitvZiByZWR1Y2luZyB0aGUgYW1vdW50IG9mIHRpbWUgYW5kIGVmZm9ydCBpdCB0YWtlcyB0byBzdXBwb3J0IHRoZSBQTkcKK2ZpbGUgZm9ybWF0IGluIGFwcGxpY2F0aW9uIHByb2dyYW1zLgorCitUaGUgUE5HIHNwZWNpZmljYXRpb24gKHNlY29uZCBlZGl0aW9uKSwgTm92ZW1iZXIgMjAwMywgaXMgYXZhaWxhYmxlIGFzCithIFczQyBSZWNvbW1lbmRhdGlvbiBhbmQgYXMgYW4gSVNPIFN0YW5kYXJkIChJU08vSUVDIDE1OTQ4OjIwMDQgKEUpKSBhdAorPGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvUkVDLVBORy0yMDAzMTExMC8KK1RoZSBXM0MgYW5kIElTTyBkb2N1bWVudHMgaGF2ZSBpZGVudGljYWwgdGVjaG5pY2FsIGNvbnRlbnQuCisKK1RoZSBQTkctMS4yIHNwZWNpZmljYXRpb24gaXMgYXZhaWxhYmxlIGF0Cis8aHR0cDovL3BuZy1tbmcuc291cmNlZm9yZ2UubmV0L3B1Yi9wbmcvc3BlYy8xLjIvPi4KK0l0IGlzIHRlY2huaWNhbGx5IGVxdWl2YWxlbnQKK3RvIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiAoc2Vjb25kIGVkaXRpb24pIGJ1dCBoYXMgc29tZSBhZGRpdGlvbmFsIG1hdGVyaWFsLgorCitUaGUgUE5HLTEuMCBzcGVjaWZpY2F0aW9uIGlzIGF2YWlsYWJsZSBhcyBSRkMgMjA4MyAKKzxodHRwOi8vcG5nLW1uZy5zb3VyY2Vmb3JnZS5uZXQvcHViL3BuZy9zcGVjLzEuMC8+IGFuZCBhcyBhCitXM0MgUmVjb21tZW5kYXRpb24gPGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1wbmctOTYxMDAxPi4KKworU29tZSBhZGRpdGlvbmFsIGNodW5rcyBhcmUgZGVzY3JpYmVkIGluIHRoZSBzcGVjaWFsLXB1cnBvc2UgcHVibGljIGNodW5rcworZG9jdW1lbnRzIGF0IDxodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9zcGVjL3JlZ2lzdGVyLz4KKworT3RoZXIgaW5mb3JtYXRpb24KK2Fib3V0IFBORywgYW5kIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBsaWJwbmcsIGNhbiBiZSBmb3VuZCBhdCB0aGUgUE5HIGhvbWUKK3BhZ2UsIDxodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy8+LgorCitNb3N0IHVzZXJzIHdpbGwgbm90IGhhdmUgdG8gbW9kaWZ5IHRoZSBsaWJyYXJ5IHNpZ25pZmljYW50bHk7IGFkdmFuY2VkCit1c2VycyBtYXkgd2FudCB0byBtb2RpZnkgaXQgbW9yZS4gIEFsbCBhdHRlbXB0cyB3ZXJlIG1hZGUgdG8gbWFrZSBpdCBhcworY29tcGxldGUgYXMgcG9zc2libGUsIHdoaWxlIGtlZXBpbmcgdGhlIGNvZGUgZWFzeSB0byB1bmRlcnN0YW5kLgorQ3VycmVudGx5LCB0aGlzIGxpYnJhcnkgb25seSBzdXBwb3J0cyBDLiAgU3VwcG9ydCBmb3Igb3RoZXIgbGFuZ3VhZ2VzCitpcyBiZWluZyBjb25zaWRlcmVkLgorCitMaWJwbmcgaGFzIGJlZW4gZGVzaWduZWQgdG8gaGFuZGxlIG11bHRpcGxlIHNlc3Npb25zIGF0IG9uZSB0aW1lLAordG8gYmUgZWFzaWx5IG1vZGlmaWFibGUsIHRvIGJlIHBvcnRhYmxlIHRvIHRoZSB2YXN0IG1ham9yaXR5IG9mCittYWNoaW5lcyAoQU5TSSwgSyZSLCAxNi0sIDMyLSwgYW5kIDY0LWJpdCkgYXZhaWxhYmxlLCBhbmQgdG8gYmUgZWFzeQordG8gdXNlLiAgVGhlIHVsdGltYXRlIGdvYWwgb2YgbGlicG5nIGlzIHRvIHByb21vdGUgdGhlIGFjY2VwdGFuY2Ugb2YKK3RoZSBQTkcgZmlsZSBmb3JtYXQgaW4gd2hhdGV2ZXIgd2F5IHBvc3NpYmxlLiAgV2hpbGUgdGhlcmUgaXMgc3RpbGwKK3dvcmsgdG8gYmUgZG9uZSAoc2VlIHRoZSBUT0RPIGZpbGUpLCBsaWJwbmcgc2hvdWxkIGNvdmVyIHRoZQorbWFqb3JpdHkgb2YgdGhlIG5lZWRzIG9mIGl0cyB1c2Vycy4KKworTGlicG5nIHVzZXMgemxpYiBmb3IgaXRzIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIG9mIFBORyBmaWxlcy4KK0Z1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgemxpYiwgYW5kIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB6bGliLCBjYW4KK2JlIGZvdW5kIGF0IHRoZSB6bGliIGhvbWUgcGFnZSwgPGh0dHA6Ly96bGliLm5ldC8+LgorVGhlIHpsaWIgY29tcHJlc3Npb24gdXRpbGl0eSBpcyBhIGdlbmVyYWwgcHVycG9zZSB1dGlsaXR5IHRoYXQgaXMKK3VzZWZ1bCBmb3IgbW9yZSB0aGFuIFBORyBmaWxlcywgYW5kIGNhbiBiZSB1c2VkIHdpdGhvdXQgbGlicG5nLgorU2VlIHRoZSBkb2N1bWVudGF0aW9uIGRlbGl2ZXJlZCB3aXRoIHpsaWIgZm9yIG1vcmUgZGV0YWlscy4KK1lvdSBjYW4gdXN1YWxseSBmaW5kIHRoZSBzb3VyY2UgZmlsZXMgZm9yIHRoZSB6bGliIHV0aWxpdHkgd2hlcmV2ZXIgeW91CitmaW5kIHRoZSBsaWJwbmcgc291cmNlIGZpbGVzLgorCitMaWJwbmcgaXMgdGhyZWFkIHNhZmUsIHByb3ZpZGVkIHRoZSB0aHJlYWRzIGFyZSB1c2luZyBkaWZmZXJlbnQKK2luc3RhbmNlcyBvZiB0aGUgc3RydWN0dXJlcy4gIEVhY2ggdGhyZWFkIHNob3VsZCBoYXZlIGl0cyBvd24KK3BuZ19zdHJ1Y3QgYW5kIHBuZ19pbmZvIGluc3RhbmNlcywgYW5kIHRodXMgaXRzIG93biBpbWFnZS4KK0xpYnBuZyBkb2VzIG5vdCBwcm90ZWN0IGl0c2VsZiBhZ2FpbnN0IHR3byB0aHJlYWRzIHVzaW5nIHRoZQorc2FtZSBpbnN0YW5jZSBvZiBhIHN0cnVjdHVyZS4KKworSUkuIFN0cnVjdHVyZXMKKworVGhlcmUgYXJlIHR3byBtYWluIHN0cnVjdHVyZXMgdGhhdCBhcmUgaW1wb3J0YW50IHRvIGxpYnBuZywgcG5nX3N0cnVjdAorYW5kIHBuZ19pbmZvLiAgQm90aCBhcmUgaW50ZXJuYWwgc3RydWN0dXJlcyB0aGF0IGFyZSBubyBsb25nZXIgZXhwb3NlZAoraW4gdGhlIGxpYnBuZyBpbnRlcmZhY2UgKGFzIG9mIGxpYnBuZyAxLjUuMCkuCisKK1RoZSBwbmdfaW5mbyBzdHJ1Y3R1cmUgaXMgZGVzaWduZWQgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKK1BORyBmaWxlLiAgQXQgb25lIHRpbWUsIHRoZSBmaWVsZHMgb2YgcG5nX2luZm8gd2VyZSBpbnRlbmRlZCB0byBiZQorZGlyZWN0bHkgYWNjZXNzaWJsZSB0byB0aGUgdXNlci4gIEhvd2V2ZXIsIHRoaXMgdGVuZGVkIHRvIGNhdXNlIHByb2JsZW1zCit3aXRoIGFwcGxpY2F0aW9ucyB1c2luZyBkeW5hbWljYWxseSBsb2FkZWQgbGlicmFyaWVzLCBhbmQgYXMgYSByZXN1bHQKK2Egc2V0IG9mIGludGVyZmFjZSBmdW5jdGlvbnMgZm9yIHBuZ19pbmZvICh0aGUgcG5nX2dldF8qKCkgYW5kIHBuZ19zZXRfKigpCitmdW5jdGlvbnMpIHdhcyBkZXZlbG9wZWQsIGFuZCBkaXJlY3QgYWNjZXNzIHRvIHRoZSBwbmdfaW5mbyBmaWVsZHMgd2FzCitkZXByZWNhdGVkLi4KKworVGhlIHBuZ19zdHJ1Y3Qgc3RydWN0dXJlIGlzIHRoZSBvYmplY3QgdXNlZCBieSB0aGUgbGlicmFyeSB0byBkZWNvZGUgYQorc2luZ2xlIGltYWdlLiAgQXMgb2YgMS41LjAgdGhpcyBzdHJ1Y3R1cmUgaXMgYWxzbyBub3QgZXhwb3NlZC4KKworQWxtb3N0IGFsbCBsaWJwbmcgQVBJcyByZXF1aXJlIGEgcG9pbnRlciB0byBhIHBuZ19zdHJ1Y3QgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LgorTWFueSAoaW4gcGFydGljdWxhciB0aGUgcG5nX3NldCBhbmQgcG5nX2dldCBBUElzKSBhbHNvIHJlcXVpcmUgYSBwb2ludGVyCit0byBwbmdfaW5mbyBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LiAgU29tZSBhcHBsaWNhdGlvbiB2aXNpYmxlIG1hY3JvcworZGVmaW5lZCBpbiBwbmcuaCBkZXNpZ25lZCBmb3IgYmFzaWMgZGF0YSBhY2Nlc3MgKHJlYWRpbmcgYW5kIHdyaXRpbmcKK2ludGVnZXJzIGluIHRoZSBQTkcgZm9ybWF0KSBkb24ndCB0YWtlIGEgcG5nX2luZm8gcG9pbnRlciwgYnV0IGl0J3MgYWxtb3N0CithbHdheXMgc2FmZSB0byBhc3N1bWUgdGhhdCBhIChwbmdfc3RydWN0KikgaGFzIHRvIGJlIHBhc3NlZCB0byBjYWxsIGFuIEFQSQorZnVuY3Rpb24uCisKK1lvdSBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lIHBuZ19pbmZvIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggYW4gaW1hZ2UsCithcyBpbGx1c3RyYXRlZCBpbiBwbmd0ZXN0LmMsIG9uZSBmb3IgaW5mb3JtYXRpb24gdmFsaWQgcHJpb3IgdG8gdGhlCitJREFUIGNodW5rcyBhbmQgYW5vdGhlciAoY2FsbGVkICJlbmRfaW5mbyIgYmVsb3cpIGZvciB0aGluZ3MgYWZ0ZXIgdGhlbS4KKworVGhlIHBuZy5oIGhlYWRlciBmaWxlIGlzIGFuIGludmFsdWFibGUgcmVmZXJlbmNlIGZvciBwcm9ncmFtbWluZyB3aXRoIGxpYnBuZy4KK0FuZCB3aGlsZSBJJ20gb24gdGhlIHRvcGljLCBtYWtlIHN1cmUgeW91IGluY2x1ZGUgdGhlIGxpYnBuZyBoZWFkZXIgZmlsZToKKworI2luY2x1ZGUgPHBuZy5oPgorCithbmQgYWxzbyAoYXMgb2YgbGlicG5nLTEuNS4wKSB0aGUgemxpYiBoZWFkZXIgZmlsZSwgaWYgeW91IG5lZWQgaXQ6CisKKyNpbmNsdWRlIDx6bGliLmg+CisKK1R5cGVzCisKK1RoZSBwbmcuaCBoZWFkZXIgZmlsZSBkZWZpbmVzIGEgbnVtYmVyIG9mIGludGVncmFsIHR5cGVzIHVzZWQgYnkgdGhlCitBUElzLiAgTW9zdCBvZiB0aGVzZSBhcmUgZmFpcmx5IG9idmlvdXM7IGZvciBleGFtcGxlIHR5cGVzIGNvcnJlc3BvbmRpbmcKK3RvIGludGVnZXJzIG9mIHBhcnRpY3VsYXIgc2l6ZXMgYW5kIHR5cGVzIGZvciBwYXNzaW5nIGNvbG9yIHZhbHVlcy4KKworT25lIGV4Y2VwdGlvbiBpcyBob3cgbm9uLWludGVncmFsIG51bWJlcnMgYXJlIGhhbmRsZWQuICBGb3IgYXBwbGljYXRpb24KK2NvbnZlbmllbmNlIG1vc3QgQVBJcyB0aGF0IHRha2Ugc3VjaCBudW1iZXJzIGhhdmUgQyAoZG91YmxlKSBhcmd1bWVudHM7Citob3dldmVyLCBpbnRlcm5hbGx5IFBORywgYW5kIGxpYnBuZywgdXNlIDMyIGJpdCBzaWduZWQgaW50ZWdlcnMgYW5kIGVuY29kZQordGhlIHZhbHVlIGJ5IG11bHRpcGx5aW5nIGJ5IDEwMCwwMDAuICBBcyBvZiBsaWJwbmcgMS41LjAgYSBjb252ZW5pZW5jZQorbWFjcm8gUE5HX0ZQXzEgaXMgZGVmaW5lZCBpbiBwbmcuaCBhbG9uZyB3aXRoIGEgdHlwZSAocG5nX2ZpeGVkX3BvaW50KQord2hpY2ggaXMgc2ltcGx5IChwbmdfaW50XzMyKS4KKworQWxsIEFQSXMgdGhhdCB0YWtlIChkb3VibGUpIGFyZ3VtZW50cyBhbHNvIGhhdmUgYSBtYXRjaGluZyBBUEkgdGhhdAordGFrZXMgdGhlIGNvcnJlc3BvbmRpbmcgZml4ZWQgcG9pbnQgaW50ZWdlciBhcmd1bWVudHMuICBUaGUgZml4ZWQgcG9pbnQKK0FQSSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZmxvYXRpbmcgcG9pbnQgb25lIHdpdGggIl9maXhlZCIgYXBwZW5kZWQuCitUaGUgYWN0dWFsIHJhbmdlIG9mIHZhbHVlcyBwZXJtaXR0ZWQgaW4gdGhlIEFQSXMgaXMgZnJlcXVlbnRseSBsZXNzIHRoYW4KK3RoZSBmdWxsIHJhbmdlIG9mIChwbmdfZml4ZWRfcG9pbnQpICgtMjE0NzQgdG8gKzIxNDc0KS4gIFdoZW4gQVBJcyByZXF1aXJlCithIG5vbi1uZWdhdGl2ZSBhcmd1bWVudCB0aGUgdHlwZSBpcyByZWNvcmRlZCBhcyBwbmdfdWludF8zMiBhYm92ZS4gIENvbnN1bHQKK3RoZSBoZWFkZXIgZmlsZSBhbmQgdGhlIHRleHQgYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK1NwZWNpYWwgY2FyZSBtdXN0IGJlIHRha2Ugd2l0aCBzQ0FMIGNodW5rIGhhbmRsaW5nIGJlY2F1c2UgdGhlIGNodW5rIGl0c2VsZgordXNlcyBub24taW50ZWdyYWwgdmFsdWVzIGVuY29kZWQgYXMgc3RyaW5ncyBjb250YWluaW5nIGRlY2ltYWwgZmxvYXRpbmcgcG9pbnQKK251bWJlcnMuICBTZWUgdGhlIGNvbW1lbnRzIGluIHRoZSBoZWFkZXIgZmlsZS4KKworQ29uZmlndXJhdGlvbgorCitUaGUgbWFpbiBoZWFkZXIgZmlsZSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgYXJlIGZyZXF1ZW50bHkgcHJvdGVjdGVkIGJ5IEMKK3ByZXByb2Nlc3NpbmcgZGlyZWN0aXZlcyBvZiB0aGUgZm9ybToKKworICAgICNpZmRlZiBQTkdfZmVhdHVyZV9TVVBQT1JURUQKKyAgICBkZWNsYXJlLWZ1bmN0aW9uCisgICAgI2VuZGlmCisgICAgLi4uCisgICAgI2lmZGVmIFBOR19mZWF0dXJlX1NVUFBPUlRFRAorICAgIHVzZS1mdW5jdGlvbgorICAgICNlbmRpZgorCitUaGUgbGlicmFyeSBjYW4gYmUgYnVpbHQgd2l0aG91dCBzdXBwb3J0IGZvciB0aGVzZSBBUElzLCBhbHRob3VnaCBhCitzdGFuZGFyZCBidWlsZCB3aWxsIGhhdmUgYWxsIGltcGxlbWVudGVkIEFQSXMuICBBcHBsaWNhdGlvbiBwcm9ncmFtcworc2hvdWxkIGNoZWNrIHRoZSBmZWF0dXJlIG1hY3JvcyBiZWZvcmUgdXNpbmcgYW4gQVBJIGZvciBtYXhpbXVtCitwb3J0YWJpbGl0eS4gIEZyb20gbGlicG5nIDEuNS4wIHRoZSBmZWF0dXJlIG1hY3JvcyBzZXQgZHVyaW5nIHRoZSBidWlsZAorb2YgbGlicG5nIGFyZSByZWNvcmRlZCBpbiB0aGUgaGVhZGVyIGZpbGUgInBuZ2xpYmNvbmYuaCIgYW5kIHRoaXMgZmlsZQoraXMgYWx3YXlzIGluY2x1ZGVkIGJ5IHBuZy5oLgorCitJZiB5b3UgZG9uJ3QgbmVlZCB0byBjaGFuZ2UgdGhlIGxpYnJhcnkgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBkZWZhdWx0LCBza2lwIHRvCit0aGUgbmV4dCBzZWN0aW9uICgiUmVhZGluZyIpLgorCitOb3RpY2UgdGhhdCBzb21lIG9mIHRoZSBtYWtlZmlsZXMgaW4gdGhlICdzY3JpcHRzJyBkaXJlY3RvcnkgYW5kIChpbiAxLjUuMCkgYWxsCitvZiB0aGUgYnVpbGQgcHJvamVjdCBmaWxlcyBpbiB0aGUgJ3Byb2plY3RzJyBkaXJlY3Rvcnkgc2ltcGx5IGNvcHkKK3NjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0IHRvIHBuZ2xpYmNvbmYuaC4gIFRoaXMgbWVhbnMgdGhhdCB0aGVzZSBidWlsZAorc3lzdGVtcyBkbyBub3QgcGVybWl0IGVhc3kgYXV0by1jb25maWd1cmF0aW9uIG9mIHRoZSBsaWJyYXJ5IC0gdGhleSBvbmx5CitzdXBwb3J0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uCisKK1RoZSBlYXNpZXN0IHdheSB0byBtYWtlIG1pbm9yIGNoYW5nZXMgdG8gdGhlIGxpYnBuZyBjb25maWd1cmF0aW9uIHdoZW4KK2F1dG8tY29uZmlndXJhdGlvbiBpcyBzdXBwb3J0ZWQgaXMgdG8gYWRkIGRlZmluaXRpb25zIHRvIHRoZSBjb21tYW5kIGxpbmUKK3VzaW5nICh0eXBpY2FsbHkpIENQUEZMQUdTLiAgRm9yIGV4YW1wbGU6CisKK0NQUEZMQUdTPS1EUE5HX05PX0ZMT0FUSU5HX0FSSVRITUVUSUMKKword2lsbCBjaGFuZ2UgdGhlIGludGVybmFsIGxpYnBuZyBtYXRoIGltcGxlbWVudGF0aW9uIGZvciBnYW1tYSBjb3JyZWN0aW9uIGFuZAorb3RoZXIgYXJpdGhtZXRpYyBjYWxjdWxhdGlvbnMgdG8gZml4ZWQgcG9pbnQsIGF2b2lkaW5nIHRoZSBuZWVkIGZvciBmYXN0CitmbG9hdGluZyBwb2ludCBzdXBwb3J0LiAgVGhlIHJlc3VsdCBjYW4gYmUgc2VlbiBpbiB0aGUgZ2VuZXJhdGVkIHBuZ2xpYmNvbmYuaCAtCittYWtlIHN1cmUgaXQgY29udGFpbnMgdGhlIGNoYW5nZWQgZmVhdHVyZSBtYWNybyBzZXR0aW5nLgorCitJZiB5b3UgbmVlZCB0byBtYWtlIG1vcmUgZXh0ZW5zaXZlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyAtIG1vcmUgdGhhbiBvbmUgb3IgdHdvCitmZWF0dXJlIG1hY3JvIHNldHRpbmdzIC0geW91IGNhbiBlaXRoZXIgYWRkIC1EUE5HX1VTRVJfQ09ORklHIHRvIHRoZSBidWlsZAorY29tbWFuZCBsaW5lIGFuZCBwdXQgYSBsaXN0IG9mIGZlYXR1cmUgbWFjcm8gc2V0dGluZ3MgaW4gcG5ndXNyLmggb3IgeW91IGNhbiBzZXQKK0RGQV9YVFJBIChhIG1ha2VmaWxlIHZhcmlhYmxlKSB0byBhIGZpbGUgY29udGFpbmluZyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBpbiB0aGUKK2Zvcm0gb2YgJ29wdGlvbicgc2V0dGluZ3MuCisKK0EuIENoYW5naW5nIHBuZ2xpYmNvbmYuaAorCitBIHZhcmlldHkgb2YgbWV0aG9kcyBleGlzdCB0byBidWlsZCBsaWJwbmcuICBOb3QgYWxsIG9mIHRoZXNlIHN1cHBvcnQKK3JlY29uZmlndXJhdGlvbiBvZiBwbmdsaWJjb25mLmguICBUbyByZWNvbmZpZ3VyZSBwbmdsaWJjb25mLmggaXQgbXVzdCBlaXRoZXIgYmUKK3JlYnVpbHQgZnJvbSBzY3JpcHRzL3BuZ2xpYmNvbmYuZGZhIHVzaW5nIGF3ayBvciBpdCBtdXN0IGJlIGVkaXRlZCBieSBoYW5kLgorCitIYW5kIGVkaXRpbmcgaXMgYWNoaWV2ZWQgYnkgY29weWluZyBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdCB0bworcG5nbGliY29uZi5oIGFuZCBjaGFuZ2luZyB0aGUgbGluZXMgZGVmaW5pbmcgdGhlIHN1cHBvcnRlZCBmZWF0dXJlcywgcGF5aW5nCit2ZXJ5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgJ29wdGlvbicgaW5mb3JtYXRpb24gaW4gc2NyaXB0cy9wbmdsaWJjb25mLmRmYQordGhhdCBkZXNjcmliZXMgdGhvc2UgZmVhdHVyZXMgYW5kIHRoZWlyIHJlcXVpcmVtZW50cy4gIFRoaXMgaXMgZWFzeSB0byBnZXQKK3dyb25nLgorCitCLiBDb25maWd1cmF0aW9uIHVzaW5nIERGQV9YVFJBCisKK1JlYnVpbGRpbmcgZnJvbSBwbmdsaWJjb25mLmRmYSBpcyBlYXN5IGlmIGEgZnVuY3Rpb25pbmcgJ2F3aycsIG9yIGEgbGF0ZXIKK3ZhcmlhbnQgc3VjaCBhcyAnbmF3aycgb3IgJ2dhd2snLCBpcyBhdmFpbGFibGUuICBUaGUgY29uZmlndXJlIGJ1aWxkIHdpbGwKK2F1dG9tYXRpY2FsbHkgZmluZCBhbiBhcHByb3ByaWF0ZSBhd2sgYW5kIGJ1aWxkIHBuZ2xpYmNvbmYuaC4KK1RoZSBzY3JpcHRzL3BuZ2xpYmNvbmYubWFrIGZpbGUgY29udGFpbnMgYSBzZXQgb2YgbWFrZSBydWxlcyBmb3IgZG9pbmcgdGhlCitzYW1lIHRoaW5nIGlmIGNvbmZpZ3VyZSBpcyBub3QgdXNlZCwgYW5kIG1hbnkgb2YgdGhlIG1ha2VmaWxlcyBpbiB0aGUgc2NyaXB0cworZGlyZWN0b3J5IHVzZSB0aGlzIGFwcHJvYWNoLgorCitXaGVuIHJlYnVpbGRpbmcgc2ltcGx5IHdyaXRlIGEgbmV3IGZpbGUgY29udGFpbmluZyBjaGFuZ2VkIG9wdGlvbnMgYW5kIHNldAorREZBX1hUUkEgdG8gdGhlIG5hbWUgb2YgdGhpcyBmaWxlLiAgVGhpcyBjYXVzZXMgdGhlIGJ1aWxkIHRvIGFwcGVuZCB0aGUgbmV3IGZpbGUKK3RvIHRoZSBlbmQgb2Ygc2NyaXB0cy9wbmdsaWJjb25mLmRmYS4gIFRoZSBwbmd1c3IuZGZhIGZpbGUgc2hvdWxkIGNvbnRhaW4gbGluZXMKK29mIHRoZSBmb2xsb3dpbmcgZm9ybXM6CisKK2V2ZXJ5dGhpbmcgPSBvZmYKKworVGhpcyB0dXJucyBhbGwgb3B0aW9uYWwgZmVhdHVyZXMgb2ZmLiAgSW5jbHVkZSBpdCBhdCB0aGUgc3RhcnQgb2YgcG5ndXNyLmRmYSB0bworbWFrZSBpdCBlYXNpZXIgdG8gYnVpbGQgYSBtaW5pbWFsIGNvbmZpZ3VyYXRpb24uICBZb3Ugd2lsbCBuZWVkIHRvIHR1cm4gYXQgbGVhc3QKK3NvbWUgZmVhdHVyZXMgb24gYWZ0ZXJ3YXJkIHRvIGVuYWJsZSBlaXRoZXIgcmVhZGluZyBvciB3cml0aW5nIGNvZGUsIG9yIGJvdGguCisKK29wdGlvbiBmZWF0dXJlIG9uCitvcHRpb24gZmVhdHVyZSBvZmYKKworRW5hYmxlIG9yIGRpc2FibGUgYSBzaW5nbGUgZmVhdHVyZS4gIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGVuYWJsZSBvdGhlcgorZmVhdHVyZXMgcmVxdWlyZWQgYnkgYSBmZWF0dXJlIHRoYXQgaXMgdHVybmVkIG9uIG9yIGRpc2FibGUgb3RoZXIgZmVhdHVyZXMgdGhhdAorcmVxdWlyZSBhIGZlYXR1cmUgd2hpY2ggaXMgdHVybmVkIG9mZi4gIENvbmZsaWN0aW5nIHNldHRpbmdzIHdpbGwgY2F1c2UgYW4gZXJyb3IKK21lc3NhZ2UgdG8gYmUgZW1pdHRlZCBieSBhd2suCisKK3NldHRpbmcgZmVhdHVyZSBkZWZhdWx0IHZhbHVlCisKK0NoYW5nZXMgdGhlIGRlZmF1bHQgdmFsdWUgb2Ygc2V0dGluZyAnZmVhdHVyZScgdG8gJ3ZhbHVlJy4gIFRoZXJlIGFyZSBhIHNtYWxsCitudW1iZXIgb2Ygc2V0dGluZ3MgbGlzdGVkIGF0IHRoZSB0b3Agb2YgcG5nbGliY29uZi5oLCB0aGV5IGFyZSBkb2N1bWVudGVkIGluIHRoZQorc291cmNlIGNvZGUuICBNb3N0IG9mIHRoZXNlIHZhbHVlcyBoYXZlIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucyBmb3IgdGhlIGxpYnJhcnkKK2J1dCBtb3N0IG9mIHRoZW0gaGF2ZSBubyB2aXNpYmxlIGVmZmVjdCBvbiB0aGUgQVBJLiAgU29tZSBjYW4gYWxzbyBiZSBvdmVycmlkZGVuCitmcm9tIHRoZSBBUEkuCisKK1RoaXMgbWV0aG9kIG9mIGJ1aWxkaW5nIGEgY3VzdG9taXplZCBwbmdsaWJjb25mLmggaXMgaWxsdXN0cmF0ZWQgaW4KK2NvbnRyaWIvcG5nbWluaW0vKi4gIFNlZSB0aGUgIiQoUE5HQ09ORik6IiB0YXJnZXQgaW4gdGhlIG1ha2VmaWxlIGFuZAorcG5ndXNyLmRmYSBpbiB0aGVzZSBkaXJlY3Rvcmllcy4KKworQy4gQ29uZmlndXJhdGlvbiB1c2luZyBQTkdfVVNFUl9DT05GSUcKKworSWYgLURQTkdfVVNFUl9DT05GSUcgaXMgYWRkZWQgdG8gdGhlIENQUEZMQUdTIHdoZW4gcG5nbGliY29uZi5oIGlzIGJ1aWx0LAordGhlIGZpbGUgcG5ndXNyLmggd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGluY2x1ZGVkIGJlZm9yZSB0aGUgb3B0aW9ucyBpbgorc2NyaXB0cy9wbmdsaWJjb25mLmRmYSBhcmUgcHJvY2Vzc2VkLiAgWW91ciBwbmd1c3IuaCBmaWxlIHNob3VsZCBjb250YWluIG9ubHkKK21hY3JvIGRlZmluaXRpb25zIHR1cm5pbmcgZmVhdHVyZXMgb24gb3Igb2ZmIG9yIHNldHRpbmcgc2V0dGluZ3MuCisKK0FwYXJ0IGZyb20gdGhlIGdsb2JhbCBzZXR0aW5nICJldmVyeXRoaW5nID0gb2ZmIiBhbGwgdGhlIG9wdGlvbnMgbGlzdGVkIGFib3ZlCitjYW4gYmUgc2V0IHVzaW5nIG1hY3JvcyBpbiBwbmd1c3IuaDoKKworI2RlZmluZSBQTkdfZmVhdHVyZV9TVVBQT1JURUQKKworaXMgZXF1aXZhbGVudCB0bzoKKworb3B0aW9uIGZlYXR1cmUgb24KKworI2RlZmluZSBQTkdfTk9fZmVhdHVyZQorCitpcyBlcXVpdmFsZW50IHRvOgorCitvcHRpb24gZmVhdHVyZSBvZmYKKworI2RlZmluZSBQTkdfZmVhdHVyZSB2YWx1ZQorCitpcyBlcXVpdmFsZW50IHRvOgorCitzZXR0aW5nIGZlYXR1cmUgZGVmYXVsdCB2YWx1ZQorCitOb3RpY2UgdGhhdCBpbiBib3RoIGNhc2VzLCBwbmd1c3IuZGZhIGFuZCBwbmd1c3IuaCwgdGhlIGNvbnRlbnRzIG9mIHRoZQorcG5ndXNyIGZpbGUgeW91IHN1cHBseSBvdmVycmlkZSB0aGUgY29udGVudHMgb2Ygc2NyaXB0cy9wbmdsaWJjb25mLmRmYQorCitJZiBjb25mdXNpbmcgb3IgaW5jb21wcmVoZW5zaWJsZSBiZWhhdmlvciByZXN1bHRzIGl0IGlzIHBvc3NpYmxlIHRvCitleGFtaW5lIHRoZSBpbnRlcm1lZGlhdGUgZmlsZSBwbmdsaWJjb25mLmRmbiB0byBmaW5kIHRoZSBmdWxsIHNldCBvZgorZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBmb3IgZWFjaCBzZXR0aW5nIGFuZCBvcHRpb24uICBTaW1wbHkgbG9jYXRlIHRoZQorZmVhdHVyZSBpbiB0aGUgZmlsZSBhbmQgcmVhZCB0aGUgQyBjb21tZW50cyB0aGF0IHByZWNlZGUgaXQuCisKK1RoaXMgbWV0aG9kIGlzIGFsc28gaWxsdXN0cmF0ZWQgaW4gdGhlIGNvbnRyaWIvcG5nbWluaW0vKiBtYWtlZmlsZXMgYW5kCitwbmd1c3IuaC4KKworSUlJLiBSZWFkaW5nCisKK1dlJ2xsIG5vdyB3YWxrIHlvdSB0aHJvdWdoIHRoZSBwb3NzaWJsZSBmdW5jdGlvbnMgdG8gY2FsbCB3aGVuIHJlYWRpbmcKK2luIGEgUE5HIGZpbGUgc2VxdWVudGlhbGx5LCBicmllZmx5IGV4cGxhaW5pbmcgdGhlIHN5bnRheCBhbmQgcHVycG9zZQorb2YgZWFjaCBvbmUuICBTZWUgZXhhbXBsZS5jIGFuZCBwbmcuaCBmb3IgbW9yZSBkZXRhaWwuICBXaGlsZQorcHJvZ3Jlc3NpdmUgcmVhZGluZyBpcyBjb3ZlcmVkIGluIHRoZSBuZXh0IHNlY3Rpb24sIHlvdSB3aWxsIHN0aWxsCituZWVkIHNvbWUgb2YgdGhlIGZ1bmN0aW9ucyBkaXNjdXNzZWQgaW4gdGhpcyBzZWN0aW9uIHRvIHJlYWQgYSBQTkcKK2ZpbGUuCisKK1NldHVwCisKK1lvdSB3aWxsIHdhbnQgdG8gZG8gdGhlIEkvTyBpbml0aWFsaXphdGlvbigqKSBiZWZvcmUgeW91IGdldCBpbnRvIGxpYnBuZywKK3NvIGlmIGl0IGRvZXNuJ3Qgd29yaywgeW91IGRvbid0IGhhdmUgbXVjaCB0byB1bmRvLiAgT2YgY291cnNlLCB5b3UKK3dpbGwgYWxzbyB3YW50IHRvIGluc3VyZSB0aGF0IHlvdSBhcmUsIGluIGZhY3QsIGRlYWxpbmcgd2l0aCBhIFBORworZmlsZS4gIExpYnBuZyBwcm92aWRlcyBhIHNpbXBsZSBjaGVjayB0byBzZWUgaWYgYSBmaWxlIGlzIGEgUE5HIGZpbGUuCitUbyB1c2UgaXQsIHBhc3MgaW4gdGhlIGZpcnN0IDEgdG8gOCBieXRlcyBvZiB0aGUgZmlsZSB0byB0aGUgZnVuY3Rpb24KK3BuZ19zaWdfY21wKCksIGFuZCBpdCB3aWxsIHJldHVybiAwIChmYWxzZSkgaWYgdGhlIGJ5dGVzIG1hdGNoIHRoZQorY29ycmVzcG9uZGluZyBieXRlcyBvZiB0aGUgUE5HIHNpZ25hdHVyZSwgb3Igbm9uemVybyAodHJ1ZSkgb3RoZXJ3aXNlLgorT2YgY291cnNlLCB0aGUgbW9yZSBieXRlcyB5b3UgcGFzcyBpbiwgdGhlIGdyZWF0ZXIgdGhlIGFjY3VyYWN5IG9mIHRoZQorcHJlZGljdGlvbi4KKworSWYgeW91IGFyZSBpbnRlbmRpbmcgdG8ga2VlcCB0aGUgZmlsZSBwb2ludGVyIG9wZW4gZm9yIHVzZSBpbiBsaWJwbmcsCit5b3UgbXVzdCBlbnN1cmUgeW91IGRvbid0IHJlYWQgbW9yZSB0aGFuIDggYnl0ZXMgZnJvbSB0aGUgYmVnaW5uaW5nCitvZiB0aGUgZmlsZSwgYW5kIHlvdSBhbHNvIGhhdmUgdG8gbWFrZSBhIGNhbGwgdG8gcG5nX3NldF9zaWdfYnl0ZXMoKQord2l0aCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHlvdSByZWFkIGZyb20gdGhlIGJlZ2lubmluZy4gIExpYnBuZyB3aWxsCit0aGVuIG9ubHkgY2hlY2sgdGhlIGJ5dGVzIChpZiBhbnkpIHRoYXQgeW91ciBwcm9ncmFtIGRpZG4ndCByZWFkLgorCisoKik6IElmIHlvdSBhcmUgbm90IHVzaW5nIHRoZSBzdGFuZGFyZCBJL08gZnVuY3Rpb25zLCB5b3Ugd2lsbCBuZWVkCit0byByZXBsYWNlIHRoZW0gd2l0aCBjdXN0b20gZnVuY3Rpb25zLiAgU2VlIHRoZSBkaXNjdXNzaW9uIHVuZGVyCitDdXN0b21pemluZyBsaWJwbmcuCisKKyAgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVfbmFtZSwgInJiIik7CisgICAgaWYgKCFmcCkKKyAgICB7CisgICAgICAgcmV0dXJuIChFUlJPUik7CisgICAgfQorCisgICAgaWYgKGZyZWFkKGhlYWRlciwgMSwgbnVtYmVyLCBmcCkgIT0gbnVtYmVyKQorICAgIHsKKyAgICAgICByZXR1cm4gKEVSUk9SKTsKKyAgICB9CisKKyAgICBpc19wbmcgPSAhcG5nX3NpZ19jbXAoaGVhZGVyLCAwLCBudW1iZXIpOworICAgIGlmICghaXNfcG5nKQorICAgIHsKKyAgICAgICByZXR1cm4gKE5PVF9QTkcpOworICAgIH0KKworTmV4dCwgcG5nX3N0cnVjdCBhbmQgcG5nX2luZm8gbmVlZCB0byBiZSBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkLiAgSW4KK29yZGVyIHRvIGVuc3VyZSB0aGF0IHRoZSBzaXplIG9mIHRoZXNlIHN0cnVjdHVyZXMgaXMgY29ycmVjdCBldmVuIHdpdGggYQorZHluYW1pY2FsbHkgbGlua2VkIGxpYnBuZywgdGhlcmUgYXJlIGZ1bmN0aW9ucyB0byBpbml0aWFsaXplIGFuZAorYWxsb2NhdGUgdGhlIHN0cnVjdHVyZXMuICBXZSBhbHNvIHBhc3MgdGhlIGxpYnJhcnkgdmVyc2lvbiwgb3B0aW9uYWwKK3BvaW50ZXJzIHRvIGVycm9yIGhhbmRsaW5nIGZ1bmN0aW9ucywgYW5kIGEgcG9pbnRlciB0byBhIGRhdGEgc3RydWN0IGZvcgordXNlIGJ5IHRoZSBlcnJvciBmdW5jdGlvbnMsIGlmIG5lY2Vzc2FyeSAodGhlIHBvaW50ZXIgYW5kIGZ1bmN0aW9ucyBjYW4KK2JlIE5VTEwgaWYgdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlcnMgYXJlIHRvIGJlIHVzZWQpLiAgU2VlIHRoZSBzZWN0aW9uCitvbiBDaGFuZ2VzIHRvIExpYnBuZyBiZWxvdyByZWdhcmRpbmcgdGhlIG9sZCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMuCitUaGUgc3RydWN0dXJlIGFsbG9jYXRpb24gZnVuY3Rpb25zIHF1aWV0bHkgcmV0dXJuIE5VTEwgaWYgdGhleSBmYWlsIHRvCitjcmVhdGUgdGhlIHN0cnVjdHVyZSwgc28geW91ciBhcHBsaWNhdGlvbiBzaG91bGQgY2hlY2sgZm9yIHRoYXQuCisKKyAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdAorICAgICAgICAoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCAocG5nX3ZvaWRwKXVzZXJfZXJyb3JfcHRyLAorICAgICAgICB1c2VyX2Vycm9yX2ZuLCB1c2VyX3dhcm5pbmdfZm4pOworCisgICAgaWYgKCFwbmdfcHRyKQorICAgICAgIHJldHVybiAoRVJST1IpOworCisgICAgcG5nX2luZm9wIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKKworICAgIGlmICghaW5mb19wdHIpCisgICAgeworICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLAorICAgICAgICAgICAocG5nX2luZm9wcClOVUxMLCAocG5nX2luZm9wcClOVUxMKTsKKyAgICAgICByZXR1cm4gKEVSUk9SKTsKKyAgICB9CisKK0lmIHlvdSB3YW50IHRvIHVzZSB5b3VyIG93biBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcywKK3VzZSBhIGxpYnBuZyB0aGF0IHdhcyBidWlsdCB3aXRoIFBOR19VU0VSX01FTV9TVVBQT1JURUQgZGVmaW5lZCwgYW5kIHVzZQorcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yKCkgaW5zdGVhZCBvZiBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KCk6CisKKyAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yCisgICAgICAgIChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIChwbmdfdm9pZHApdXNlcl9lcnJvcl9wdHIsCisgICAgICAgIHVzZXJfZXJyb3JfZm4sIHVzZXJfd2FybmluZ19mbiwgKHBuZ192b2lkcCkKKyAgICAgICAgdXNlcl9tZW1fcHRyLCB1c2VyX21hbGxvY19mbiwgdXNlcl9mcmVlX2ZuKTsKKworVGhlIGVycm9yIGhhbmRsaW5nIHJvdXRpbmVzIHBhc3NlZCB0byBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KCkKK2FuZCB0aGUgbWVtb3J5IGFsbG9jL2ZyZWUgcm91dGluZXMgcGFzc2VkIHRvIHBuZ19jcmVhdGVfc3RydWN0XzIoKQorYXJlIG9ubHkgbmVjZXNzYXJ5IGlmIHlvdSBhcmUgbm90IHVzaW5nIHRoZSBsaWJwbmcgc3VwcGxpZWQgZXJyb3IKK2hhbmRsaW5nIGFuZCBtZW1vcnkgYWxsb2MvZnJlZSBmdW5jdGlvbnMuCisKK1doZW4gbGlicG5nIGVuY291bnRlcnMgYW4gZXJyb3IsIGl0IGV4cGVjdHMgdG8gbG9uZ2ptcCBiYWNrCit0byB5b3VyIHJvdXRpbmUuICBUaGVyZWZvcmUsIHlvdSB3aWxsIG5lZWQgdG8gY2FsbCBzZXRqbXAgYW5kIHBhc3MKK3lvdXIgcG5nX2ptcGJ1ZihwbmdfcHRyKS4gIElmIHlvdSByZWFkIHRoZSBmaWxlIGZyb20gZGlmZmVyZW50Cityb3V0aW5lcywgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhlIGxvbmdqbXAgYnVmZmVyIGV2ZXJ5IHRpbWUgeW91IGVudGVyCithIG5ldyByb3V0aW5lIHRoYXQgd2lsbCBjYWxsIGEgcG5nXyooKSBmdW5jdGlvbi4KKworU2VlIHlvdXIgZG9jdW1lbnRhdGlvbiBvZiBzZXRqbXAvbG9uZ2ptcCBmb3IgeW91ciBjb21waWxlciBmb3IgbW9yZQoraW5mb3JtYXRpb24gb24gc2V0am1wL2xvbmdqbXAuICBTZWUgdGhlIGRpc2N1c3Npb24gb24gbGlicG5nIGVycm9yCitoYW5kbGluZyBpbiB0aGUgQ3VzdG9taXppbmcgTGlicG5nIHNlY3Rpb24gYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24KK29uIHRoZSBsaWJwbmcgZXJyb3IgaGFuZGxpbmcuICBJZiBhbiBlcnJvciBvY2N1cnMsIGFuZCBsaWJwbmcgbG9uZ2ptcCdzCitiYWNrIHRvIHlvdXIgc2V0am1wLCB5b3Ugd2lsbCB3YW50IHRvIGNhbGwgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoKSB0bworZnJlZSBhbnkgbWVtb3J5LgorCisgICAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZ19wdHIpKSkKKyAgICB7CisgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwKKyAgICAgICAgICAgJmVuZF9pbmZvKTsKKyAgICAgICBmY2xvc2UoZnApOworICAgICAgIHJldHVybiAoRVJST1IpOworICAgIH0KKworUGFzcyAocG5nX2luZm9wcClOVUxMIGluc3RlYWQgb2YgJmVuZF9pbmZvIGlmIHlvdSBkaWRuJ3QgY3JlYXRlCithbiBlbmRfaW5mbyBzdHJ1Y3R1cmUuCisKK0lmIHlvdSB3b3VsZCByYXRoZXIgYXZvaWQgdGhlIGNvbXBsZXhpdHkgb2Ygc2V0am1wL2xvbmdqbXAgaXNzdWVzLAoreW91IGNhbiBjb21waWxlIGxpYnBuZyB3aXRoIFBOR19OT19TRVRKTVAsIGluIHdoaWNoIGNhc2UKK2Vycm9ycyB3aWxsIHJlc3VsdCBpbiBhIGNhbGwgdG8gUE5HX0FCT1JUKCkgd2hpY2ggZGVmYXVsdHMgdG8gYWJvcnQoKS4KKworWW91IGNhbiAjZGVmaW5lIFBOR19BQk9SVCgpIHRvIGEgZnVuY3Rpb24gdGhhdCBkb2VzIHNvbWV0aGluZworbW9yZSB1c2VmdWwgdGhhbiBhYm9ydCgpLCBhcyBsb25nIGFzIHlvdXIgZnVuY3Rpb24gZG9lcyBub3QKK3JldHVybi4KKworTm93IHlvdSBuZWVkIHRvIHNldCB1cCB0aGUgaW5wdXQgY29kZS4gIFRoZSBkZWZhdWx0IGZvciBsaWJwbmcgaXMgdG8KK3VzZSB0aGUgQyBmdW5jdGlvbiBmcmVhZCgpLiAgSWYgeW91IHVzZSB0aGlzLCB5b3Ugd2lsbCBuZWVkIHRvIHBhc3MgYQordmFsaWQgRklMRSAqIGluIHRoZSBmdW5jdGlvbiBwbmdfaW5pdF9pbygpLiAgQmUgc3VyZSB0aGF0IHRoZSBmaWxlIGlzCitvcGVuZWQgaW4gYmluYXJ5IG1vZGUuICBJZiB5b3Ugd2lzaCB0byBoYW5kbGUgcmVhZGluZyBkYXRhIGluIGFub3RoZXIKK3dheSwgeW91IG5lZWQgbm90IGNhbGwgdGhlIHBuZ19pbml0X2lvKCkgZnVuY3Rpb24sIGJ1dCB5b3UgbXVzdCB0aGVuCitpbXBsZW1lbnQgdGhlIGxpYnBuZyBJL08gbWV0aG9kcyBkaXNjdXNzZWQgaW4gdGhlIEN1c3RvbWl6aW5nIExpYnBuZworc2VjdGlvbiBiZWxvdy4KKworICAgIHBuZ19pbml0X2lvKHBuZ19wdHIsIGZwKTsKKworSWYgeW91IGhhZCBwcmV2aW91c2x5IG9wZW5lZCB0aGUgZmlsZSBhbmQgcmVhZCBhbnkgb2YgdGhlIHNpZ25hdHVyZSBmcm9tCit0aGUgYmVnaW5uaW5nIGluIG9yZGVyIHRvIHNlZSBpZiB0aGlzIHdhcyBhIFBORyBmaWxlLCB5b3UgbmVlZCB0byBsZXQKK2xpYnBuZyBrbm93IHRoYXQgdGhlcmUgYXJlIHNvbWUgYnl0ZXMgbWlzc2luZyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4KKworICAgIHBuZ19zZXRfc2lnX2J5dGVzKHBuZ19wdHIsIG51bWJlcik7CisKK1lvdSBjYW4gY2hhbmdlIHRoZSB6bGliIGNvbXByZXNzaW9uIGJ1ZmZlciBzaXplIHRvIGJlIHVzZWQgd2hpbGUKK3JlYWRpbmcgY29tcHJlc3NlZCBkYXRhIHdpdGgKKworICAgIHBuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUocG5nX3B0ciwgYnVmZmVyX3NpemUpOworCit3aGVyZSB0aGUgZGVmYXVsdCBzaXplIGlzIDgxOTIgYnl0ZXMuICBOb3RlIHRoYXQgdGhlIGJ1ZmZlciBzaXplCitpcyBjaGFuZ2VkIGltbWVkaWF0ZWx5IGFuZCB0aGUgYnVmZmVyIGlzIHJlYWxsb2NhdGVkIGltbWVkaWF0ZWx5LAoraW5zdGVhZCBvZiBzZXR0aW5nIGEgZmxhZyB0byBiZSBhY3RlZCB1cG9uIGxhdGVyLgorCitJZiB5b3Ugd2FudCBDUkMgZXJyb3JzIHRvIGJlIGhhbmRsZWQgaW4gYSBkaWZmZXJlbnQgbWFubmVyIHRoYW4KK3RoZSBkZWZhdWx0LCB1c2UKKworICAgIHBuZ19zZXRfY3JjX2FjdGlvbihwbmdfcHRyLCBjcml0X2FjdGlvbiwgYW5jaWxfYWN0aW9uKTsKKworVGhlIHZhbHVlcyBmb3IgcG5nX3NldF9jcmNfYWN0aW9uKCkgc2F5IGhvdyBsaWJwbmcgaXMgdG8gaGFuZGxlIENSQyBlcnJvcnMgaW4KK2FuY2lsbGFyeSBhbmQgY3JpdGljYWwgY2h1bmtzLCBhbmQgd2hldGhlciB0byB1c2UgdGhlIGRhdGEgY29udGFpbmVkCit0aGVyZWluLiAgTm90ZSB0aGF0IGl0IGlzIGltcG9zc2libGUgdG8gImRpc2NhcmQiIGRhdGEgaW4gYSBjcml0aWNhbAorY2h1bmsuCisKK0Nob2ljZXMgZm9yIChpbnQpIGNyaXRfYWN0aW9uIGFyZQorICAgUE5HX0NSQ19ERUZBVUxUICAgICAgMCAgZXJyb3IvcXVpdAorICAgUE5HX0NSQ19FUlJPUl9RVUlUICAgMSAgZXJyb3IvcXVpdAorICAgUE5HX0NSQ19XQVJOX1VTRSAgICAgMyAgd2Fybi91c2UgZGF0YQorICAgUE5HX0NSQ19RVUlFVF9VU0UgICAgNCAgcXVpZXQvdXNlIGRhdGEKKyAgIFBOR19DUkNfTk9fQ0hBTkdFICAgIDUgIHVzZSB0aGUgY3VycmVudCB2YWx1ZQorCitDaG9pY2VzIGZvciAoaW50KSBhbmNpbF9hY3Rpb24gYXJlCisgICBQTkdfQ1JDX0RFRkFVTFQgICAgICAwICBlcnJvci9xdWl0CisgICBQTkdfQ1JDX0VSUk9SX1FVSVQgICAxICBlcnJvci9xdWl0CisgICBQTkdfQ1JDX1dBUk5fRElTQ0FSRCAyICB3YXJuL2Rpc2NhcmQgZGF0YQorICAgUE5HX0NSQ19XQVJOX1VTRSAgICAgMyAgd2Fybi91c2UgZGF0YQorICAgUE5HX0NSQ19RVUlFVF9VU0UgICAgNCAgcXVpZXQvdXNlIGRhdGEKKyAgIFBOR19DUkNfTk9fQ0hBTkdFICAgIDUgIHVzZSB0aGUgY3VycmVudCB2YWx1ZQorCitTZXR0aW5nIHVwIGNhbGxiYWNrIGNvZGUKKworWW91IGNhbiBzZXQgdXAgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBoYW5kbGUgYW55IHVua25vd24gY2h1bmtzIGluIHRoZQoraW5wdXQgc3RyZWFtLiBZb3UgbXVzdCBzdXBwbHkgdGhlIGZ1bmN0aW9uCisKKyAgICByZWFkX2NodW5rX2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICAgICAgICBwbmdfdW5rbm93bl9jaHVua3AgY2h1bmspOworICAgIHsKKyAgICAgICAvKiBUaGUgdW5rbm93biBjaHVuayBzdHJ1Y3R1cmUgY29udGFpbnMgeW91cgorICAgICAgICAgIGNodW5rIGRhdGEsIGFsb25nIHdpdGggc2ltaWxhciBkYXRhIGZvciBhbnkgb3RoZXIKKyAgICAgICAgICB1bmtub3duIGNodW5rczogKi8KKworICAgICAgICAgICBwbmdfYnl0ZSBuYW1lWzVdOworICAgICAgICAgICBwbmdfYnl0ZSAqZGF0YTsKKyAgICAgICAgICAgcG5nX3NpemVfdCBzaXplOworCisgICAgICAgLyogTm90ZSB0aGF0IGxpYnBuZyBoYXMgYWxyZWFkeSB0YWtlbiBjYXJlIG9mCisgICAgICAgICAgdGhlIENSQyBoYW5kbGluZyAqLworCisgICAgICAgLyogcHV0IHlvdXIgY29kZSBoZXJlLiAgU2VhcmNoIGZvciB5b3VyIGNodW5rIGluIHRoZQorICAgICAgICAgIHVua25vd24gY2h1bmsgc3RydWN0dXJlLCBwcm9jZXNzIGl0LCBhbmQgcmV0dXJuIG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmc6ICovCisKKyAgICAgICByZXR1cm4gKC1uKTsgLyogY2h1bmsgaGFkIGFuIGVycm9yICovCisgICAgICAgcmV0dXJuICgwKTsgLyogZGlkIG5vdCByZWNvZ25pemUgKi8KKyAgICAgICByZXR1cm4gKG4pOyAvKiBzdWNjZXNzICovCisgICAgfQorCisoWW91IGNhbiBnaXZlIHlvdXIgZnVuY3Rpb24gYW5vdGhlciBuYW1lIHRoYXQgeW91IGxpa2UgaW5zdGVhZCBvZgorInJlYWRfY2h1bmtfY2FsbGJhY2siKQorCitUbyBpbmZvcm0gbGlicG5nIGFib3V0IHlvdXIgZnVuY3Rpb24sIHVzZQorCisgICAgcG5nX3NldF9yZWFkX3VzZXJfY2h1bmtfZm4ocG5nX3B0ciwgdXNlcl9jaHVua19wdHIsCisgICAgICAgIHJlYWRfY2h1bmtfY2FsbGJhY2spOworCitUaGlzIG5hbWVzIG5vdCBvbmx5IHRoZSBjYWxsYmFjayBmdW5jdGlvbiwgYnV0IGFsc28gYSB1c2VyIHBvaW50ZXIgdGhhdAoreW91IGNhbiByZXRyaWV2ZSB3aXRoCisKKyAgICBwbmdfZ2V0X3VzZXJfY2h1bmtfcHRyKHBuZ19wdHIpOworCitJZiB5b3UgY2FsbCB0aGUgcG5nX3NldF9yZWFkX3VzZXJfY2h1bmtfZm4oKSBmdW5jdGlvbiwgdGhlbiBhbGwgdW5rbm93bgorY2h1bmtzIHdoaWNoIHRoZSBjYWxsYmFjayBkb2VzIG5vdCBoYW5kbGUgd2lsbCBiZSBzYXZlZCB3aGVuIHJlYWQuICBZb3UgY2FuCitjYXVzZSB0aGVtIHRvIGJlIGRpc2NhcmRlZCBieSByZXR1cm5pbmcgJzEnICgiaGFuZGxlZCIpIGluc3RlYWQgb2YgJzAnLiAgVGhpcworYmVoYXZpb3Igd2lsbCBjaGFuZ2UgaW4gbGlicG5nIDEuNyBhbmQgdGhlIGRlZmF1bHQgaGFuZGxpbmcgc2V0IGJ5IHRoZQorcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKCkgZnVuY3Rpb24sIGRlc2NyaWJlZCBiZWxvdywgd2lsbCBiZSB1c2VkIHdoZW4gdGhlCitjYWxsYmFjayByZXR1cm5zIDAuICBJZiB5b3Ugd2FudCB0aGUgZXhpc3RpbmcgYmVoYXZpb3IgeW91IHNob3VsZCBzZXQgdGhlIGdsb2JhbAorZGVmYXVsdCB0byBQTkdfSEFORExFX0NIVU5LX0lGX1NBRkUgbm93OyB0aGlzIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgY3VycmVudAordmVyc2lvbnMgb2YgbGlicG5nIGFuZCB3aXRoIDEuNy4gIExpYnBuZyAxLjYgaXNzdWVzIGEgd2FybmluZyBpZiB5b3Uga2VlcCB0aGUKK2RlZmF1bHQsIG9yIFBOR19IQU5ETEVfQ0hVTktfTkVWRVIsIGFuZCB0aGUgY2FsbGJhY2sgcmV0dXJucyAwLgorCitBdCB0aGlzIHBvaW50LCB5b3UgY2FuIHNldCB1cCBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZQorY2FsbGVkIGFmdGVyIGVhY2ggcm93IGhhcyBiZWVuIHJlYWQsIHdoaWNoIHlvdSBjYW4gdXNlIHRvIGNvbnRyb2wKK2EgcHJvZ3Jlc3MgbWV0ZXIgb3IgdGhlIGxpa2UuICBJdCdzIGRlbW9uc3RyYXRlZCBpbiBwbmd0ZXN0LmMuCitZb3UgbXVzdCBzdXBwbHkgYSBmdW5jdGlvbgorCisgICAgdm9pZCByZWFkX3Jvd19jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgICAgIHBuZ191aW50XzMyIHJvdywgaW50IHBhc3MpOworICAgIHsKKyAgICAgIC8qIHB1dCB5b3VyIGNvZGUgaGVyZSAqLworICAgIH0KKworKFlvdSBjYW4gZ2l2ZSBpdCBhbm90aGVyIG5hbWUgdGhhdCB5b3UgbGlrZSBpbnN0ZWFkIG9mICJyZWFkX3Jvd19jYWxsYmFjayIpCisKK1RvIGluZm9ybSBsaWJwbmcgYWJvdXQgeW91ciBmdW5jdGlvbiwgdXNlCisKKyAgICBwbmdfc2V0X3JlYWRfc3RhdHVzX2ZuKHBuZ19wdHIsIHJlYWRfcm93X2NhbGxiYWNrKTsKKworV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0aGUgcm93IGhhcyBhbHJlYWR5IGJlZW4gY29tcGxldGVseSBwcm9jZXNzZWQgYW5kCit0aGUgJ3JvdycgYW5kICdwYXNzJyByZWZlciB0byB0aGUgbmV4dCByb3cgdG8gYmUgaGFuZGxlZC4gIEZvciB0aGUKK25vbi1pbnRlcmxhY2VkIGNhc2UgdGhlIHJvdyB0aGF0IHdhcyBqdXN0IGhhbmRsZWQgaXMgc2ltcGx5IG9uZSBsZXNzIHRoYW4gdGhlCitwYXNzZWQgaW4gcm93IG51bWJlciwgYW5kIHBhc3Mgd2lsbCBhbHdheXMgYmUgMC4gIEZvciB0aGUgaW50ZXJsYWNlZCBjYXNlIHRoZQorc2FtZSBhcHBsaWVzIHVubGVzcyB0aGUgcm93IHZhbHVlIGlzIDAsIGluIHdoaWNoIGNhc2UgdGhlIHJvdyBqdXN0IGhhbmRsZWQgd2FzCit0aGUgbGFzdCBvbmUgZnJvbSBvbmUgb2YgdGhlIHByZWNlZGluZyBwYXNzZXMuICBCZWNhdXNlIGludGVybGFjaW5nIG1heSBza2lwIGEKK3Bhc3MgeW91IGNhbm5vdCBiZSBzdXJlIHRoYXQgdGhlIHByZWNlZGluZyBwYXNzIGlzIGp1c3QgJ3Bhc3MtMScsIGlmIHlvdSByZWFsbHkKK25lZWQgdG8ga25vdyB3aGF0IHRoZSBsYXN0IHBhc3MgaXMgcmVjb3JkIChyb3cscGFzcykgZnJvbSB0aGUgY2FsbGJhY2sgYW5kIHVzZQordGhlIGxhc3QgcmVjb3JkZWQgdmFsdWUgZWFjaCB0aW1lLgorCitBcyB3aXRoIHRoZSB1c2VyIHRyYW5zZm9ybSB5b3UgY2FuIGZpbmQgdGhlIG91dHB1dCByb3cgdXNpbmcgdGhlCitQTkdfUk9XX0ZST01fUEFTU19ST1cgbWFjcm8uCisKK1Vua25vd24tY2h1bmsgaGFuZGxpbmcKKworTm93IHlvdSBnZXQgdG8gc2V0IHRoZSB3YXkgdGhlIGxpYnJhcnkgcHJvY2Vzc2VzIHVua25vd24gY2h1bmtzIGluIHRoZQoraW5wdXQgUE5HIHN0cmVhbS4gQm90aCBrbm93biBhbmQgdW5rbm93biBjaHVua3Mgd2lsbCBiZSByZWFkLiAgTm9ybWFsCitiZWhhdmlvciBpcyB0aGF0IGtub3duIGNodW5rcyB3aWxsIGJlIHBhcnNlZCBpbnRvIGluZm9ybWF0aW9uIGluCit2YXJpb3VzIGluZm9fcHRyIG1lbWJlcnMgd2hpbGUgdW5rbm93biBjaHVua3Mgd2lsbCBiZSBkaXNjYXJkZWQuIFRoaXMKK2JlaGF2aW9yIGNhbiBiZSB3YXN0ZWZ1bCBpZiB5b3VyIGFwcGxpY2F0aW9uIHdpbGwgbmV2ZXIgdXNlIHNvbWUga25vd24KK2NodW5rIHR5cGVzLiBUbyBjaGFuZ2UgdGhpcywgeW91IGNhbiBjYWxsOgorCisgICAgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKHBuZ19wdHIsIGtlZXAsCisgICAgICAgIGNodW5rX2xpc3QsIG51bV9jaHVua3MpOworCisgICAga2VlcCAgICAgICAtIDA6IGRlZmF1bHQgdW5rbm93biBjaHVuayBoYW5kbGluZworICAgICAgICAgICAgICAgICAxOiBpZ25vcmU7IGRvIG5vdCBrZWVwCisgICAgICAgICAgICAgICAgIDI6IGtlZXAgb25seSBpZiBzYWZlLXRvLWNvcHkKKyAgICAgICAgICAgICAgICAgMzoga2VlcCBldmVuIGlmIHVuc2FmZS10by1jb3B5CisKKyAgICAgICAgICAgICAgIFlvdSBjYW4gdXNlIHRoZXNlIGRlZmluaXRpb25zOgorICAgICAgICAgICAgICAgICBQTkdfSEFORExFX0NIVU5LX0FTX0RFRkFVTFQgICAwCisgICAgICAgICAgICAgICAgIFBOR19IQU5ETEVfQ0hVTktfTkVWRVIgICAgICAgIDEKKyAgICAgICAgICAgICAgICAgUE5HX0hBTkRMRV9DSFVOS19JRl9TQUZFICAgICAgMgorICAgICAgICAgICAgICAgICBQTkdfSEFORExFX0NIVU5LX0FMV0FZUyAgICAgICAzCisKKyAgICBjaHVua19saXN0IC0gbGlzdCBvZiBjaHVua3MgYWZmZWN0ZWQgKGEgYnl0ZSBzdHJpbmcsCisgICAgICAgICAgICAgICAgIGZpdmUgYnl0ZXMgcGVyIGNodW5rLCBOVUxMIG9yICdcMCcgaWYKKyAgICAgICAgICAgICAgICAgbnVtX2NodW5rcyBpcyBwb3NpdGl2ZTsgaWdub3JlZCBpZgorICAgICAgICAgICAgICAgICBudW1jaHVua3MgPD0gMCkuCisKKyAgICBudW1fY2h1bmtzIC0gbnVtYmVyIG9mIGNodW5rcyBhZmZlY3RlZDsgaWYgMCwgYWxsCisgICAgICAgICAgICAgICAgIHVua25vd24gY2h1bmtzIGFyZSBhZmZlY3RlZC4gIElmIHBvc2l0aXZlLAorICAgICAgICAgICAgICAgICBvbmx5IHRoZSBjaHVua3MgaW4gdGhlIGxpc3QgYXJlIGFmZmVjdGVkLAorICAgICAgICAgICAgICAgICBhbmQgaWYgbmVnYXRpdmUgYWxsIHVua25vd24gY2h1bmtzIGFuZAorICAgICAgICAgICAgICAgICBhbGwga25vd24gY2h1bmtzIGV4Y2VwdCBmb3IgdGhlIElIRFIsCisgICAgICAgICAgICAgICAgIFBMVEUsIHRSTlMsIElEQVQsIGFuZCBJRU5EIGNodW5rcyBhcmUKKyAgICAgICAgICAgICAgICAgYWZmZWN0ZWQuCisKK1Vua25vd24gY2h1bmtzIGRlY2xhcmVkIGluIHRoaXMgd2F5IHdpbGwgYmUgc2F2ZWQgYXMgcmF3IGRhdGEgb250byBhCitsaXN0IG9mIHBuZ191bmtub3duX2NodW5rIHN0cnVjdHVyZXMuICBJZiBhIGNodW5rIHRoYXQgaXMgbm9ybWFsbHkKK2tub3duIHRvIGxpYnBuZyBpcyBuYW1lZCBpbiB0aGUgbGlzdCwgaXQgd2lsbCBiZSBoYW5kbGVkIGFzIHVua25vd24sCithY2NvcmRpbmcgdG8gdGhlICJrZWVwIiBkaXJlY3RpdmUuICBJZiBhIGNodW5rIGlzIG5hbWVkIGluIHN1Y2Nlc3NpdmUKK2luc3RhbmNlcyBvZiBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MoKSwgdGhlIGZpbmFsIGluc3RhbmNlIHdpbGwKK3Rha2UgcHJlY2VkZW5jZS4gIFRoZSBJSERSIGFuZCBJRU5EIGNodW5rcyBzaG91bGQgbm90IGJlIG5hbWVkIGluCitjaHVua19saXN0OyBpZiB0aGV5IGFyZSwgbGlicG5nIHdpbGwgcHJvY2VzcyB0aGVtIG5vcm1hbGx5IGFueXdheS4KK0lmIHlvdSBrbm93IHRoYXQgeW91ciBhcHBsaWNhdGlvbiB3aWxsIG5ldmVyIG1ha2UgdXNlIG9mIHNvbWUgcGFydGljdWxhcgorY2h1bmtzLCB1c2UgUE5HX0hBTkRMRV9DSFVOS19ORVZFUiAob3IgMSkgYXMgZGVtb25zdHJhdGVkIGJlbG93LgorCitIZXJlIGlzIGFuIGV4YW1wbGUgb2YgdGhlIHVzYWdlIG9mIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcygpLAord2hlcmUgdGhlIHByaXZhdGUgInZwQWciIGNodW5rIHdpbGwgbGF0ZXIgYmUgcHJvY2Vzc2VkIGJ5IGEgdXNlciBjaHVuaworY2FsbGJhY2sgZnVuY3Rpb246CisKKyAgICBwbmdfYnl0ZSB2cEFnWzVdPXsxMTgsIDExMiwgIDY1LCAxMDMsIChwbmdfYnl0ZSkgJ1wwJ307CisKKyAgICAjaWYgZGVmaW5lZChQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEKQorICAgICAgcG5nX2J5dGUgdW51c2VkX2NodW5rc1tdPQorICAgICAgeworICAgICAgICAxMDQsICA3MywgIDgzLCAgODQsIChwbmdfYnl0ZSkgJ1wwJywgICAvKiBoSVNUICovCisgICAgICAgIDEwNSwgIDg0LCAgODgsIDExNiwgKHBuZ19ieXRlKSAnXDAnLCAgIC8qIGlUWHQgKi8KKyAgICAgICAgMTEyLCAgNjcsICA2NSwgIDc2LCAocG5nX2J5dGUpICdcMCcsICAgLyogcENBTCAqLworICAgICAgICAxMTUsICA2NywgIDY1LCAgNzYsIChwbmdfYnl0ZSkgJ1wwJywgICAvKiBzQ0FMICovCisgICAgICAgIDExNSwgIDgwLCAgNzYsICA4NCwgKHBuZ19ieXRlKSAnXDAnLCAgIC8qIHNQTFQgKi8KKyAgICAgICAgMTE2LCAgNzMsICA3NywgIDY5LCAocG5nX2J5dGUpICdcMCcsICAgLyogdElNRSAqLworICAgICAgfTsKKyAgICAjZW5kaWYKKworICAgIC4uLgorCisgICAgI2lmIGRlZmluZWQoUE5HX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkKKyAgICAgIC8qIGlnbm9yZSBhbGwgdW5rbm93biBjaHVua3MKKyAgICAgICAqICh1c2UgZ2xvYmFsIHNldHRpbmcgIjIiIGZvciBsaWJwbmcxNiBhbmQgZWFybGllcik6CisgICAgICAgKi8KKyAgICAgIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyhyZWFkX3B0ciwgMiwgTlVMTCwgMCk7CisKKyAgICAgIC8qIGV4Y2VwdCBmb3IgdnBBZzogKi8KKyAgICAgIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyhyZWFkX3B0ciwgMiwgdnBBZywgMSk7CisKKyAgICAgIC8qIGFsc28gaWdub3JlIHVudXNlZCBrbm93biBjaHVua3M6ICovCisgICAgICBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MocmVhZF9wdHIsIDEsIHVudXNlZF9jaHVua3MsCisgICAgICAgICAoaW50KShzaXplb2YgdW51c2VkX2NodW5rcykvNSk7CisgICAgI2VuZGlmCisKK1VzZXIgbGltaXRzCisKK1RoZSBQTkcgc3BlY2lmaWNhdGlvbiBhbGxvd3MgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgYW4gaW1hZ2UgdG8gYmUgYXMKK2xhcmdlIGFzIDJeMzEtMSAoMHg3ZmZmZmZmZiksIG9yIGFib3V0IDIuMTQ3IGJpbGxpb24gcm93cyBhbmQgY29sdW1ucy4KK0ZvciBzYWZldHksIGxpYnBuZyBpbXBvc2VzIGEgZGVmYXVsdCBsaW1pdCBvZiAxIG1pbGxpb24gcm93cyBhbmQgY29sdW1ucy4KK0xhcmdlciBpbWFnZXMgd2lsbCBiZSByZWplY3RlZCBpbW1lZGlhdGVseSB3aXRoIGEgcG5nX2Vycm9yKCkgY2FsbC4gSWYKK3lvdSB3aXNoIHRvIGNoYW5nZSB0aGVzZSBsaW1pdHMsIHlvdSBjYW4gdXNlCisKKyAgIHBuZ19zZXRfdXNlcl9saW1pdHMocG5nX3B0ciwgd2lkdGhfbWF4LCBoZWlnaHRfbWF4KTsKKwordG8gc2V0IHlvdXIgb3duIGxpbWl0cyAobGlicG5nIG1heSByZWplY3Qgc29tZSB2ZXJ5IHdpZGUgaW1hZ2VzCithbnl3YXkgYmVjYXVzZSBvZiBwb3RlbnRpYWwgYnVmZmVyIG92ZXJmbG93IGNvbmRpdGlvbnMpLgorCitZb3Ugc2hvdWxkIHB1dCB0aGlzIHN0YXRlbWVudCBhZnRlciB5b3UgY3JlYXRlIHRoZSBQTkcgc3RydWN0dXJlIGFuZAorYmVmb3JlIGNhbGxpbmcgcG5nX3JlYWRfaW5mbygpLCBwbmdfcmVhZF9wbmcoKSwgb3IgcG5nX3Byb2Nlc3NfZGF0YSgpLgorCitXaGVuIHdyaXRpbmcgYSBQTkcgZGF0YXN0cmVhbSwgcHV0IHRoaXMgc3RhdGVtZW50IGJlZm9yZSBjYWxsaW5nCitwbmdfd3JpdGVfaW5mbygpIG9yIHBuZ193cml0ZV9wbmcoKS4KKworSWYgeW91IG5lZWQgdG8gcmV0cmlldmUgdGhlIGxpbWl0cyB0aGF0IGFyZSBiZWluZyBhcHBsaWVkLCB1c2UKKworICAgd2lkdGhfbWF4ID0gcG5nX2dldF91c2VyX3dpZHRoX21heChwbmdfcHRyKTsKKyAgIGhlaWdodF9tYXggPSBwbmdfZ2V0X3VzZXJfaGVpZ2h0X21heChwbmdfcHRyKTsKKworVGhlIFBORyBzcGVjaWZpY2F0aW9uIHNldHMgbm8gbGltaXQgb24gdGhlIG51bWJlciBvZiBhbmNpbGxhcnkgY2h1bmtzCithbGxvd2VkIGluIGEgUE5HIGRhdGFzdHJlYW0uICBCeSBkZWZhdWx0LCBsaWJwbmcgaW1wb3NlcyBhIGxpbWl0IG9mCithIHRvdGFsIG9mIDEwMDAgc1BMVCwgdEVYdCwgaVRYdCwgelRYdCwgYW5kIHVua25vd24gY2h1bmtzIHRvIGJlIHN0b3JlZC4KK0lmIHlvdSBoYXZlIHNldCB1cCBib3RoIGluZm9fcHRyIGFuZCBlbmRfaW5mb19wdHIsIHRoZSBsaW1pdCBhcHBsaWVzCitzZXBhcmF0ZWx5IHRvIGVhY2guICBZb3UgY2FuIGNoYW5nZSB0aGUgbGltaXQgb24gdGhlIHRvdGFsIG51bWJlciBvZiBzdWNoCitjaHVua3MgdGhhdCB3aWxsIGJlIHN0b3JlZCwgd2l0aAorCisgICBwbmdfc2V0X2NodW5rX2NhY2hlX21heChwbmdfcHRyLCB1c2VyX2NodW5rX2NhY2hlX21heCk7CisKK3doZXJlIDB4N2ZmZmZmZmZMIG1lYW5zIHVubGltaXRlZC4gIFlvdSBjYW4gcmV0cmlldmUgdGhpcyBsaW1pdCB3aXRoCisKKyAgIGNodW5rX2NhY2hlX21heCA9IHBuZ19nZXRfY2h1bmtfY2FjaGVfbWF4KHBuZ19wdHIpOworCitMaWJwbmcgaW1wb3NlcyBhIGxpbWl0IG9mIDggTWVnYWJ5dGVzICg4LDAwMCwwMDAgYnl0ZXMpIG9uIHRoZSBhbW91bnQgb2YKK21lbW9yeSB0aGF0IGEgY29tcHJlc3NlZCBjaHVuayBvdGhlciB0aGFuIElEQVQgY2FuIG9jY3VweSwgd2hlbiBkZWNvbXByZXNzZWQuCitZb3UgY2FuIGNoYW5nZSB0aGlzIGxpbWl0IHdpdGgKKworICAgcG5nX3NldF9jaHVua19tYWxsb2NfbWF4KHBuZ19wdHIsIHVzZXJfY2h1bmtfbWFsbG9jX21heCk7CisKK2FuZCB5b3UgY2FuIHJldHJpZXZlIHRoZSBsaW1pdCB3aXRoCisKKyAgIGNodW5rX21hbGxvY19tYXggPSBwbmdfZ2V0X2NodW5rX21hbGxvY19tYXgocG5nX3B0cik7CisKK0FueSBjaHVua3MgdGhhdCB3b3VsZCBjYXVzZSBlaXRoZXIgb2YgdGhlc2UgbGltaXRzIHRvIGJlIGV4Y2VlZGVkIHdpbGwKK2JlIGlnbm9yZWQuCisKK0luZm9ybWF0aW9uIGFib3V0IHlvdXIgc3lzdGVtCisKK0lmIHlvdSBpbnRlbmQgdG8gZGlzcGxheSB0aGUgUE5HIG9yIHRvIGluY29ycG9yYXRlIGl0IGluIG90aGVyIGltYWdlIGRhdGEgeW91CituZWVkIHRvIHRlbGwgbGlicG5nIGluZm9ybWF0aW9uIGFib3V0IHlvdXIgZGlzcGxheSBvciBkcmF3aW5nIHN1cmZhY2Ugc28gdGhhdAorbGlicG5nIGNhbiBjb252ZXJ0IHRoZSB2YWx1ZXMgaW4gdGhlIGltYWdlIHRvIG1hdGNoIHRoZSBkaXNwbGF5LgorCitGcm9tIGxpYnBuZy0xLjUuNCB0aGlzIGluZm9ybWF0aW9uIGNhbiBiZSBzZXQgYmVmb3JlIHJlYWRpbmcgdGhlIFBORyBmaWxlCitoZWFkZXIuICBJbiBlYXJsaWVyIHZlcnNpb25zIHBuZ19zZXRfZ2FtbWEoKSBleGlzdGVkIGJ1dCBiZWhhdmVkIGluY29ycmVjdGx5IGlmCitjYWxsZWQgYmVmb3JlIHRoZSBQTkcgZmlsZSBoZWFkZXIgaGFkIGJlZW4gcmVhZCBhbmQgcG5nX3NldF9hbHBoYV9tb2RlKCkgZGlkIG5vdAorZXhpc3QuCisKK0lmIHlvdSBuZWVkIHRvIHN1cHBvcnQgdmVyc2lvbnMgcHJpb3IgdG8gbGlicG5nLTEuNS40IHRlc3QgdGhlIHZlcnNpb24gbnVtYmVyCithcyBpbGx1c3RyYXRlZCBiZWxvdyB1c2luZyAiUE5HX0xJQlBOR19WRVIgPj0gMTA1MDQiIGFuZCBmb2xsb3cgdGhlIHByb2NlZHVyZXMKK2Rlc2NyaWJlZCBpbiB0aGUgYXBwcm9wcmlhdGUgbWFudWFsIHBhZ2UuCisKK1lvdSBnaXZlIGxpYnBuZyB0aGUgZW5jb2RpbmcgZXhwZWN0ZWQgYnkgeW91ciBzeXN0ZW0gZXhwcmVzc2VkIGFzIGEgJ2dhbW1hJwordmFsdWUuICBZb3UgY2FuIGFsc28gc3BlY2lmeSBhIGRlZmF1bHQgZW5jb2RpbmcgZm9yIHRoZSBQTkcgZmlsZSBpbgorY2FzZSB0aGUgcmVxdWlyZWQgaW5mb3JtYXRpb24gaXMgbWlzc2luZyBmcm9tIHRoZSBmaWxlLiAgQnkgZGVmYXVsdCBsaWJwbmcKK2Fzc3VtZXMgdGhhdCB0aGUgUE5HIGRhdGEgbWF0Y2hlcyB5b3VyIHN5c3RlbSwgdG8ga2VlcCB0aGlzIGRlZmF1bHQgY2FsbDoKKworICAgcG5nX3NldF9nYW1tYShwbmdfcHRyLCBzY3JlZW5fZ2FtbWEsIG91dHB1dF9nYW1tYSk7CisKK29yIHlvdSBjYW4gdXNlIHRoZSBmaXhlZCBwb2ludCBlcXVpdmFsZW50OgorCisgICBwbmdfc2V0X2dhbW1hX2ZpeGVkKHBuZ19wdHIsIFBOR19GUF8xKnNjcmVlbl9nYW1tYSwKKyAgICAgIFBOR19GUF8xKm91dHB1dF9nYW1tYSk7CisKK0lmIHlvdSBkb24ndCBrbm93IHRoZSBnYW1tYSBmb3IgeW91ciBzeXN0ZW0gaXQgaXMgcHJvYmFibHkgMi4yIC0gYSBnb29kCithcHByb3hpbWF0aW9uIHRvIHRoZSBJRUMgc3RhbmRhcmQgZm9yIGRpc3BsYXkgc3lzdGVtcyAoc1JHQikuICBJZiBpbWFnZXMgYXJlCit0b28gY29udHJhc3R5IG9yIHdhc2hlZCBvdXQgeW91IGdvdCB0aGUgdmFsdWUgd3JvbmcgLSBjaGVjayB5b3VyIHN5c3RlbQorZG9jdW1lbnRhdGlvbiEKKworTWFueSBzeXN0ZW1zIHBlcm1pdCB0aGUgc3lzdGVtIGdhbW1hIHRvIGJlIGNoYW5nZWQgdmlhIGEgbG9va3VwIHRhYmxlIGluIHRoZQorZGlzcGxheSBkcml2ZXIsIGEgZmV3IHN5c3RlbXMsIGluY2x1ZGluZyBvbGRlciBNYWNzLCBjaGFuZ2UgdGhlIHJlc3BvbnNlIGJ5CitkZWZhdWx0LiAgQXMgb2YgMS41LjQgdGhyZWUgc3BlY2lhbCB2YWx1ZXMgYXJlIGF2YWlsYWJsZSB0byBoYW5kbGUgY29tbW9uCitzaXR1YXRpb25zOgorCisgICBQTkdfREVGQVVMVF9zUkdCOiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3lzdGVtIGNvbmZvcm1zIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgSUVDIDYxOTY2LTItMSBzdGFuZGFyZC4gIFRoaXMgbWF0Y2hlcyBhbG1vc3QKKyAgICAgICAgICAgICAgICAgICAgIGFsbCBzeXN0ZW1zLgorICAgUE5HX0dBTU1BX01BQ18xODogSW5kaWNhdGVzIHRoYXQgdGhlIHN5c3RlbSBpcyBhbiBvbGRlcgorICAgICAgICAgICAgICAgICAgICAgKHByZSBNYWMgT1MgMTAuNikgQXBwbGUgTWFjaW50b3NoIHN5c3RlbSB3aXRoCisgICAgICAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdCBzZXR0aW5ncy4KKyAgIFBOR19HQU1NQV9MSU5FQVI6IEp1c3QgdGhlIGZpeGVkIHBvaW50IHZhbHVlIGZvciAxLjAgLSBpbmRpY2F0ZXMKKyAgICAgICAgICAgICAgICAgICAgIHRoYXQgdGhlIHN5c3RlbSBleHBlY3RzIGRhdGEgd2l0aCBubyBnYW1tYQorICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcuCisKK1lvdSB3b3VsZCB1c2UgdGhlIGxpbmVhciAodW5lbmNvZGVkKSB2YWx1ZSBpZiB5b3UgbmVlZCB0byBwcm9jZXNzIHRoZSBwaXhlbAordmFsdWVzIGZ1cnRoZXIgYmVjYXVzZSB0aGlzIGF2b2lkcyB0aGUgbmVlZCB0byBkZWNvZGUgYW5kIHJlLWVuY29kZSBlYWNoCitjb21wb25lbnQgdmFsdWUgd2hlbmV2ZXIgYXJpdGhtZXRpYyBpcyBwZXJmb3JtZWQuICBBIGxvdCBvZiBncmFwaGljcyBzb2Z0d2FyZQordXNlcyBsaW5lYXIgdmFsdWVzIGZvciB0aGlzIHJlYXNvbiwgb2Z0ZW4gd2l0aCBoaWdoZXIgcHJlY2lzaW9uIGNvbXBvbmVudCB2YWx1ZXMKK3RvIHByZXNlcnZlIG92ZXJhbGwgYWNjdXJhY3kuCisKKworVGhlIG91dHB1dF9nYW1tYSB2YWx1ZSBleHByZXNzZXMgaG93IHRvIGRlY29kZSB0aGUgb3V0cHV0IHZhbHVlcywgbm90IGhvdwordGhleSBhcmUgZW5jb2RlZC4gIFRoZSB2YWx1ZXMgdXNlZCBjb3JyZXNwb25kIHRvIHRoZSBub3JtYWwgbnVtYmVycyB1c2VkIHRvCitkZXNjcmliZSB0aGUgb3ZlcmFsbCBnYW1tYSBvZiBhIGNvbXB1dGVyIGRpc3BsYXkgc3lzdGVtOyBmb3IgZXhhbXBsZSAyLjIgZm9yCithbiBzUkdCIGNvbmZvcm1hbnQgc3lzdGVtLiAgVGhlIHZhbHVlcyBhcmUgc2NhbGVkIGJ5IDEwMDAwMCBpbiB0aGUgX2ZpeGVkCit2ZXJzaW9uIG9mIHRoZSBBUEkgKHNvIDIyMDAwMCBmb3Igc1JHQi4pCisKK1RoZSBpbnZlcnNlIG9mIHRoZSB2YWx1ZSBpcyBhbHdheXMgdXNlZCB0byBwcm92aWRlIGEgZGVmYXVsdCBmb3IgdGhlIFBORyBmaWxlCitlbmNvZGluZyBpZiBpdCBoYXMgbm8gZ0FNQSBjaHVuayBhbmQgaWYgcG5nX3NldF9nYW1tYSgpIGhhcyBub3QgYmVlbiBjYWxsZWQKK3RvIG92ZXJyaWRlIHRoZSBQTkcgZ2FtbWEgaW5mb3JtYXRpb24uCisKK1doZW4gdGhlIEFMUEhBX09QVElNSVpFRCBtb2RlIGlzIHNlbGVjdGVkIHRoZSBvdXRwdXQgZ2FtbWEgaXMgdXNlZCB0byBlbmNvZGUKK29wYXF1ZSBwaXhlbHMgaG93ZXZlciBwaXhlbHMgd2l0aCBsb3dlciBhbHBoYSB2YWx1ZXMgYXJlIG5vdCBlbmNvZGVkLAorcmVnYXJkbGVzcyBvZiB0aGUgb3V0cHV0IGdhbW1hIHNldHRpbmcuCisKK1doZW4gdGhlIHN0YW5kYXJkIFBvcnRlciBEdWZmIGhhbmRsaW5nIGlzIHJlcXVlc3RlZCB3aXRoIG1vZGUgMSB0aGUgb3V0cHV0CitlbmNvZGluZyBpcyBzZXQgdG8gYmUgbGluZWFyIGFuZCB0aGUgb3V0cHV0X2dhbW1hIHZhbHVlIGlzIG9ubHkgcmVsZXZhbnQKK2FzIGEgZGVmYXVsdCBmb3IgaW5wdXQgZGF0YSB0aGF0IGhhcyBubyBnYW1tYSBpbmZvcm1hdGlvbi4gIFRoZSBsaW5lYXIgb3V0cHV0CitlbmNvZGluZyB3aWxsIGJlIG92ZXJyaWRkZW4gaWYgcG5nX3NldF9nYW1tYSgpIGlzIGNhbGxlZCAtIHRoZSByZXN1bHRzIG1heSBiZQoraGlnaGx5IHVuZXhwZWN0ZWQhCisKK1RoZSBmb2xsb3dpbmcgbnVtYmVycyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBzUkdCIHN0YW5kYXJkIGFuZCB0aGUgcmVzZWFyY2gKK2JlaGluZCBpdC4gIHNSR0IgaXMgZGVmaW5lZCB0byBiZSBhcHByb3hpbWF0ZWQgYnkgYSBQTkcgZ0FNQSBjaHVuayB2YWx1ZSBvZgorMC40NTQ1NSAoMS8yLjIpIGZvciBQTkcuICBUaGUgdmFsdWUgaW1wbGljaXRseSBpbmNsdWRlcyBhbnkgdmlld2luZworY29ycmVjdGlvbiByZXF1aXJlZCB0byB0YWtlIGFjY291bnQgb2YgYW55IGRpZmZlcmVuY2VzIGluIHRoZSBjb2xvcgorZW52aXJvbm1lbnQgb2YgdGhlIG9yaWdpbmFsIHNjZW5lIGFuZCB0aGUgaW50ZW5kZWQgZGlzcGxheSBlbnZpcm9ubWVudDsgdGhlCit2YWx1ZSBleHByZXNzZXMgaG93IHRvICpkZWNvZGUqIHRoZSBpbWFnZSBmb3IgZGlzcGxheSwgbm90IGhvdyB0aGUgb3JpZ2luYWwKK2RhdGEgd2FzICplbmNvZGVkKi4KKworc1JHQiBwcm92aWRlcyBhIHBlZyBmb3IgdGhlIFBORyBzdGFuZGFyZCBieSBkZWZpbmluZyBhIHZpZXdpbmcgZW52aXJvbm1lbnQuCitzUkdCIGl0c2VsZiwgYW5kIGVhcmxpZXIgVFYgc3RhbmRhcmRzLCBhY3R1YWxseSB1c2UgYSBtb3JlIGNvbXBsZXggdHJhbnNmb3JtCisoYSBsaW5lYXIgcG9ydGlvbiB0aGVuIGEgZ2FtbWEgMi40IHBvd2VyIGxhdykgdGhhbiBQTkcgY2FuIGV4cHJlc3MuICAoUE5HIGlzCitsaW1pdGVkIHRvIHNpbXBsZSBwb3dlciBsYXdzLikgIEJ5IHNheWluZyB0aGF0IGFuIGltYWdlIGZvciBkaXJlY3QgZGlzcGxheSBvbgorYW4gc1JHQiBjb25mb3JtYW50IHN5c3RlbSBzaG91bGQgYmUgc3RvcmVkIHdpdGggYSBnQU1BIGNodW5rIHZhbHVlIG9mIDQ1NDU1CisoMTEuMy4zLjIgYW5kIDExLjMuMy41IG9mIHRoZSBJU08gUE5HIHNwZWNpZmljYXRpb24pIHRoZSBQTkcgc3BlY2lmaWNhdGlvbgorbWFrZXMgaXQgcG9zc2libGUgdG8gZGVyaXZlIHZhbHVlcyBmb3Igb3RoZXIgZGlzcGxheSBzeXN0ZW1zIGFuZAorZW52aXJvbm1lbnRzLgorCitUaGUgTWFjIHZhbHVlIGlzIGRlZHVjZWQgZnJvbSB0aGUgc1JHQiBiYXNlZCBvbiBhbiBhc3N1bXB0aW9uIHRoYXQgdGhlIGFjdHVhbAorZXh0cmEgdmlld2luZyBjb3JyZWN0aW9uIHVzZWQgaW4gZWFybHkgTWFjIGRpc3BsYXkgc3lzdGVtcyB3YXMgaW1wbGVtZW50ZWQgYXMKK2EgcG93ZXIgMS40NSBsb29rdXAgdGFibGUuCisKK0FueSBzeXN0ZW0gd2hlcmUgYSBwcm9ncmFtbWFibGUgbG9va3VwIHRhYmxlIGlzIHVzZWQgb3Igd2hlcmUgdGhlIGJlaGF2aW9yIG9mCit0aGUgZmluYWwgZGlzcGxheSBkZXZpY2UgY2hhcmFjdGVyaXN0aWNzIGNhbiBiZSBjaGFuZ2VkIHJlcXVpcmVzIHN5c3RlbQorc3BlY2lmaWMgY29kZSB0byBvYnRhaW4gdGhlIGN1cnJlbnQgY2hhcmFjdGVyaXN0aWMuICBIb3dldmVyIHRoaXMgY2FuIGJlCitkaWZmaWN1bHQgYW5kIG1vc3QgUE5HIGdhbW1hIGNvcnJlY3Rpb24gb25seSByZXF1aXJlcyBhbiBhcHByb3hpbWF0ZSB2YWx1ZS4KKworQnkgZGVmYXVsdCwgaWYgcG5nX3NldF9hbHBoYV9tb2RlKCkgaXMgbm90IGNhbGxlZCwgbGlicG5nIGFzc3VtZXMgdGhhdCBhbGwKK3ZhbHVlcyBhcmUgdW5lbmNvZGVkLCBsaW5lYXIsIHZhbHVlcyBhbmQgdGhhdCB0aGUgb3V0cHV0IGRldmljZSBhbHNvIGhhcyBhCitsaW5lYXIgY2hhcmFjdGVyaXN0aWMuICBUaGlzIGlzIG9ubHkgdmVyeSByYXJlbHkgY29ycmVjdCAtIGl0IGlzIGludmFyaWFibHkKK2JldHRlciB0byBjYWxsIHBuZ19zZXRfYWxwaGFfbW9kZSgpIHdpdGggUE5HX0RFRkFVTFRfc1JHQiB0aGFuIHJlbHkgb24gdGhlCitkZWZhdWx0IGlmIHlvdSBkb24ndCBrbm93IHdoYXQgdGhlIHJpZ2h0IGFuc3dlciBpcyEKKworVGhlIHNwZWNpYWwgdmFsdWUgUE5HX0dBTU1BX01BQ18xOCBpbmRpY2F0ZXMgYW4gb2xkZXIgTWFjIHN5c3RlbSAocHJlIE1hYyBPUworMTAuNikgd2hpY2ggdXNlZCBhIGNvcnJlY3Rpb24gdGFibGUgdG8gaW1wbGVtZW50IGEgc29tZXdoYXQgbG93ZXIgZ2FtbWEgb24gYW4KK290aGVyd2lzZSBzUkdCIHN5c3RlbS4KKworQm90aCB0aGVzZSB2YWx1ZXMgYXJlIHJlc2VydmVkIChub3Qgc2ltcGxlIGdhbW1hIHZhbHVlcykgaW4gb3JkZXIgdG8gYWxsb3cKK21vcmUgcHJlY2lzZSBjb3JyZWN0aW9uIGludGVybmFsbHkgaW4gdGhlIGZ1dHVyZS4KKworTk9URTogdGhlIHZhbHVlcyBjYW4gYmUgcGFzc2VkIHRvIGVpdGhlciB0aGUgZml4ZWQgb3IgZmxvYXRpbmcKK3BvaW50IEFQSXMsIGJ1dCB0aGUgZmxvYXRpbmcgcG9pbnQgQVBJIHdpbGwgYWxzbyBhY2NlcHQgZmxvYXRpbmcgcG9pbnQKK3ZhbHVlcy4KKworVGhlIHNlY29uZCB0aGluZyB5b3UgbWF5IG5lZWQgdG8gdGVsbCBsaWJwbmcgYWJvdXQgaXMgaG93IHlvdXIgc3lzdGVtIGhhbmRsZXMKK2FscGhhIGNoYW5uZWwgaW5mb3JtYXRpb24uICBTb21lLCBidXQgbm90IGFsbCwgUE5HIGZpbGVzIGNvbnRhaW4gYW4gYWxwaGEKK2NoYW5uZWwuICBUbyBkaXNwbGF5IHRoZXNlIGZpbGVzIGNvcnJlY3RseSB5b3UgbmVlZCB0byBjb21wb3NlIHRoZSBkYXRhIG9udG8gYQorc3VpdGFibGUgYmFja2dyb3VuZCwgYXMgZGVzY3JpYmVkIGluIHRoZSBQTkcgc3BlY2lmaWNhdGlvbi4KKworTGlicG5nIG9ubHkgc3VwcG9ydHMgY29tcG9zaW5nIG9udG8gYSBzaW5nbGUgY29sb3IgKHVzaW5nIHBuZ19zZXRfYmFja2dyb3VuZDsKK3NlZSBiZWxvdykuICBPdGhlcndpc2UgeW91IG11c3QgZG8gdGhlIGNvbXBvc2l0aW9uIHlvdXJzZWxmIGFuZCwgaW4gdGhpcyBjYXNlLAoreW91IG1heSBuZWVkIHRvIGNhbGwgcG5nX3NldF9hbHBoYV9tb2RlOgorCisgICAjaWYgUE5HX0xJQlBOR19WRVIgPj0gMTA1MDQKKyAgICAgIHBuZ19zZXRfYWxwaGFfbW9kZShwbmdfcHRyLCBtb2RlLCBzY3JlZW5fZ2FtbWEpOworICAgI2Vsc2UKKyAgICAgIHBuZ19zZXRfZ2FtbWEocG5nX3B0ciwgc2NyZWVuX2dhbW1hLCAxLjAvc2NyZWVuX2dhbW1hKTsKKyAgICNlbmRpZgorCitUaGUgc2NyZWVuX2dhbW1hIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBhcmd1bWVudCB0byBwbmdfc2V0X2dhbW1hOyBob3dldmVyLAoraG93IGl0IGFmZmVjdHMgdGhlIG91dHB1dCBkZXBlbmRzIG9uIHRoZSBtb2RlLiAgcG5nX3NldF9hbHBoYV9tb2RlKCkgc2V0cyB0aGUKK2ZpbGUgZ2FtbWEgZGVmYXVsdCB0byAxL3NjcmVlbl9nYW1tYSwgc28gbm9ybWFsbHkgeW91IGRvbid0IG5lZWQgdG8gY2FsbAorcG5nX3NldF9nYW1tYS4gIElmIHlvdSBuZWVkIGRpZmZlcmVudCBkZWZhdWx0cyBjYWxsIHBuZ19zZXRfZ2FtbWEoKSBiZWZvcmUKK3BuZ19zZXRfYWxwaGFfbW9kZSgpIC0gaWYgeW91IGNhbGwgaXQgYWZ0ZXIgaXQgd2lsbCBvdmVycmlkZSB0aGUgc2V0dGluZ3MgbWFkZQorYnkgcG5nX3NldF9hbHBoYV9tb2RlKCkuCisKK1RoZSBtb2RlIGlzIGFzIGZvbGxvd3M6CisKKyAgICBQTkdfQUxQSEFfUE5HOiBUaGUgZGF0YSBpcyBlbmNvZGVkIGFjY29yZGluZyB0byB0aGUgUE5HCitzcGVjaWZpY2F0aW9uLiAgUmVkLCBncmVlbiBhbmQgYmx1ZSwgb3IgZ3JheSwgY29tcG9uZW50cyBhcmUKK2dhbW1hIGVuY29kZWQgY29sb3IgdmFsdWVzIGFuZCBhcmUgbm90IHByZW11bHRpcGxpZWQgYnkgdGhlCithbHBoYSB2YWx1ZS4gIFRoZSBhbHBoYSB2YWx1ZSBpcyBhIGxpbmVhciBtZWFzdXJlIG9mIHRoZQorY29udHJpYnV0aW9uIG9mIHRoZSBwaXhlbCB0byB0aGUgY29ycmVzcG9uZGluZyBmaW5hbCBvdXRwdXQgcGl4ZWwuCisKK1lvdSBzaG91bGQgbm9ybWFsbHkgdXNlIHRoaXMgZm9ybWF0IGlmIHlvdSBpbnRlbmQgdG8gcGVyZm9ybQorY29sb3IgY29ycmVjdGlvbiBvbiB0aGUgY29sb3IgdmFsdWVzOyBtb3N0LCBtYXliZSBhbGwsIGNvbG9yCitjb3JyZWN0aW9uIHNvZnR3YXJlIGhhcyBubyBoYW5kbGluZyBmb3IgdGhlIGFscGhhIGNoYW5uZWwgYW5kLAorYW55d2F5LCB0aGUgbWF0aCB0byBoYW5kbGUgcHJlLW11bHRpcGxpZWQgY29tcG9uZW50IHZhbHVlcyBpcwordW5uZWNlc3NhcmlseSBjb21wbGV4LgorCitCZWZvcmUgeW91IGRvIGFueSBhcml0aG1ldGljIG9uIHRoZSBjb21wb25lbnQgdmFsdWVzIHlvdSBuZWVkCit0byByZW1vdmUgdGhlIGdhbW1hIGVuY29kaW5nIGFuZCBtdWx0aXBseSBvdXQgdGhlIGFscGhhCitjaGFubmVsLiAgU2VlIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBkZXRhaWwuICBJdCBpcworaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB3aGVuIGFuIGltYWdlIHdpdGggYW4gYWxwaGEgY2hhbm5lbCBpcworc2NhbGVkLCBsaW5lYXIgZW5jb2RlZCwgcHJlLW11bHRpcGxpZWQgY29tcG9uZW50IHZhbHVlcyBtdXN0CitiZSB1c2VkIQorCitUaGUgcmVtYWluaW5nIG1vZGVzIGFzc3VtZSB5b3UgZG9uJ3QgbmVlZCB0byBkbyBhbnkgZnVydGhlciBjb2xvciBjb3JyZWN0aW9uIG9yCit0aGF0IGlmIHlvdSBkbywgeW91ciBjb2xvciBjb3JyZWN0aW9uIHNvZnR3YXJlIGtub3dzIGFsbCBhYm91dCBhbHBoYSAoaXQKK3Byb2JhYmx5IGRvZXNuJ3QhKS4gIFRoZXkgJ2Fzc29jaWF0ZScgdGhlIGFscGhhIHdpdGggdGhlIGNvbG9yIGluZm9ybWF0aW9uIGJ5CitzdG9yaW5nIGNvbG9yIGNoYW5uZWwgdmFsdWVzIHRoYXQgaGF2ZSBiZWVuIHNjYWxlZCBieSB0aGUgYWxwaGEuICBUaGUKK2FkdmFudGFnZSBpcyB0aGF0IHRoZSBjb2xvciBjaGFubmVscyBjYW4gYmUgcmVzYW1wbGVkICh0aGUgaW1hZ2UgY2FuIGJlCitzY2FsZWQpIGluIHRoaXMgZm9ybS4gIFRoZSBkaXNhZHZhbnRhZ2UgaXMgdGhhdCBub3JtYWwgcHJhY3RpY2UgaXMgdG8gc3RvcmUKK2xpbmVhciwgbm90IChnYW1tYSkgZW5jb2RlZCwgdmFsdWVzIGFuZCB0aGlzIHJlcXVpcmVzIDE2LWJpdCBjaGFubmVscyBmb3IKK3N0aWxsIGltYWdlcyByYXRoZXIgdGhhbiB0aGUgOC1iaXQgY2hhbm5lbHMgdGhhdCBhcmUganVzdCBhYm91dCBzdWZmaWNpZW50IGlmCitnYW1tYSBlbmNvZGluZyBpcyB1c2VkLiAgSW4gYWRkaXRpb24gYWxsIG5vbi10cmFuc3BhcmVudCBwaXhlbCB2YWx1ZXMsCitpbmNsdWRpbmcgY29tcGxldGVseSBvcGFxdWUgb25lcywgbXVzdCBiZSBnYW1tYSBlbmNvZGVkIHRvIHByb2R1Y2UgdGhlIGZpbmFsCitpbWFnZS4gIFRoZXNlIGFyZSB0aGUgJ1NUQU5EQVJEJywgJ0FTU09DSUFURUQnIG9yICdQUkVNVUxUSVBMSUVEJyBtb2RlcworZGVzY3JpYmVkIGJlbG93ICh0aGUgbGF0dGVyIGJlaW5nIHRoZSB0d28gY29tbW9uIG5hbWVzIGZvciBhc3NvY2lhdGVkIGFscGhhCitjb2xvciBjaGFubmVscykuIE5vdGUgdGhhdCBQTkcgZmlsZXMgYWx3YXlzIGNvbnRhaW4gbm9uLWFzc29jaWF0ZWQgY29sb3IKK2NoYW5uZWxzOyBwbmdfc2V0X2FscGhhX21vZGUoKSB3aXRoIG9uZSBvZiB0aGUgbW9kZXMgY2F1c2VzIHRoZSBkZWNvZGVyIHRvCitjb252ZXJ0IHRoZSBwaXhlbHMgdG8gYW4gYXNzb2NpYXRlZCBmb3JtIGJlZm9yZSByZXR1cm5pbmcgdGhlbSB0byB5b3VyCithcHBsaWNhdGlvbi4gCisKK1NpbmNlIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gcGVyZm9ybSBhcml0aG1ldGljIG9uIG9wYXF1ZSBjb2xvciB2YWx1ZXMgc28KK2xvbmcgYXMgdGhleSBhcmUgbm90IHRvIGJlIHJlc2FtcGxlZCBhbmQgYXJlIGluIHRoZSBmaW5hbCBjb2xvciBzcGFjZSBpdCBpcworcG9zc2libGUgdG8gb3B0aW1pemUgdGhlIGhhbmRsaW5nIG9mIGFscGhhIGJ5IHN0b3JpbmcgdGhlIG9wYXF1ZSBwaXhlbHMgaW4KK3RoZSBQTkcgZm9ybWF0IChhZGp1c3RlZCBmb3IgdGhlIG91dHB1dCBjb2xvciBzcGFjZSkgd2hpbGUgc3RvcmluZyBwYXJ0aWFsbHkKK29wYXF1ZSBwaXhlbHMgaW4gdGhlIHN0YW5kYXJkLCBsaW5lYXIsIGZvcm1hdC4gIFRoZSBhY2N1cmFjeSByZXF1aXJlZCBmb3IKK3N0YW5kYXJkIGFscGhhIGNvbXBvc2l0aW9uIGlzIHJlbGF0aXZlbHkgbG93LCBiZWNhdXNlIHRoZSBwaXhlbHMgYXJlCitpc29sYXRlZCwgdGhlcmVmb3JlIHR5cGljYWxseSB0aGUgYWNjdXJhY3kgbG9zcyBpbiBzdG9yaW5nIDgtYml0IGxpbmVhcgordmFsdWVzIGlzIGFjY2VwdGFibGUuICAoVGhpcyBpcyBub3QgdHJ1ZSBpZiB0aGUgYWxwaGEgY2hhbm5lbCBpcyB1c2VkIHRvCitzaW11bGF0ZSB0cmFuc3BhcmVuY3kgb3ZlciBsYXJnZSBhcmVhcyAtIHVzZSAxNiBiaXRzIG9yIHRoZSBQTkcgbW9kZSBpbgordGhpcyBjYXNlISkgIFRoaXMgaXMgdGhlICdPUFRJTUlaRUQnIG1vZGUuICBGb3IgdGhpcyBtb2RlIGEgcGl4ZWwgaXMKK3RyZWF0ZWQgYXMgb3BhcXVlIG9ubHkgaWYgdGhlIGFscGhhIHZhbHVlIGlzIGVxdWFsIHRvIHRoZSBtYXhpbXVtIHZhbHVlLgorCisgICAgUE5HX0FMUEhBX1NUQU5EQVJEOiAgVGhlIGRhdGEgbGlicG5nIHByb2R1Y2VzIGlzIGVuY29kZWQgaW4gdGhlCitzdGFuZGFyZCB3YXkgYXNzdW1lZCBieSBtb3N0IGNvcnJlY3RseSB3cml0dGVuIGdyYXBoaWNzIHNvZnR3YXJlLgorVGhlIGdhbW1hIGVuY29kaW5nIHdpbGwgYmUgcmVtb3ZlZCBieSBsaWJwbmcgYW5kIHRoZQorbGluZWFyIGNvbXBvbmVudCB2YWx1ZXMgd2lsbCBiZSBwcmUtbXVsdGlwbGllZCBieSB0aGUKK2FscGhhIGNoYW5uZWwuCisKK1dpdGggdGhpcyBmb3JtYXQgdGhlIGZpbmFsIGltYWdlIG11c3QgYmUgcmUtZW5jb2RlZCB0bworbWF0Y2ggdGhlIGRpc3BsYXkgZ2FtbWEgYmVmb3JlIHRoZSBpbWFnZSBpcyBkaXNwbGF5ZWQuCitJZiB5b3VyIHN5c3RlbSBkb2Vzbid0IGRvIHRoYXQsIHlldCBzdGlsbCBzZWVtcyB0bworcGVyZm9ybSBhcml0aG1ldGljIG9uIHRoZSBwaXhlbHMgd2l0aG91dCBkZWNvZGluZyB0aGVtLAoraXQgaXMgYnJva2VuIC0gY2hlY2sgb3V0IHRoZSBtb2RlcyBiZWxvdy4KKworV2l0aCBQTkdfQUxQSEFfU1RBTkRBUkQgbGlicG5nIGFsd2F5cyBwcm9kdWNlcyBsaW5lYXIKK2NvbXBvbmVudCB2YWx1ZXMsIHdoYXRldmVyIHNjcmVlbl9nYW1tYSB5b3Ugc3VwcGx5LiAgVGhlCitzY3JlZW5fZ2FtbWEgdmFsdWUgaXMsIGhvd2V2ZXIsIHVzZWQgYXMgYSBkZWZhdWx0IGZvcgordGhlIGZpbGUgZ2FtbWEgaWYgdGhlIFBORyBmaWxlIGhhcyBubyBnYW1tYSBpbmZvcm1hdGlvbi4KKworSWYgeW91IGNhbGwgcG5nX3NldF9nYW1tYSgpIGFmdGVyIHBuZ19zZXRfYWxwaGFfbW9kZSgpIHlvdQord2lsbCBvdmVycmlkZSB0aGUgbGluZWFyIGVuY29kaW5nLiAgSW5zdGVhZCB0aGUKK3ByZS1tdWx0aXBsaWVkIHBpeGVsIHZhbHVlcyB3aWxsIGJlIGdhbW1hIGVuY29kZWQgYnV0Cit0aGUgYWxwaGEgY2hhbm5lbCB3aWxsIHN0aWxsIGJlIGxpbmVhci4gIFRoaXMgbWF5CithY3R1YWxseSBtYXRjaCB0aGUgcmVxdWlyZW1lbnRzIG9mIHNvbWUgYnJva2VuIHNvZnR3YXJlLAorYnV0IGl0IGlzIHVubGlrZWx5LgorCitXaGlsZSBsaW5lYXIgOC1iaXQgZGF0YSBpcyBvZnRlbiB1c2VkIGl0IGhhcworaW5zdWZmaWNpZW50IHByZWNpc2lvbiBmb3IgYW55IGltYWdlIHdpdGggYSByZWFzb25hYmxlCitkeW5hbWljIHJhbmdlLiAgVG8gYXZvaWQgcHJvYmxlbXMsIGFuZCBpZiB5b3VyIHNvZnR3YXJlCitzdXBwb3J0cyBpdCwgdXNlIHBuZ19zZXRfZXhwYW5kXzE2KCkgdG8gZm9yY2UgYWxsCitjb21wb25lbnRzIHRvIDE2IGJpdHMuCisKKyAgICBQTkdfQUxQSEFfT1BUSU1JWkVEOiBUaGlzIG1vZGUgaXMgdGhlIHNhbWUgYXMgUE5HX0FMUEhBX1NUQU5EQVJECitleGNlcHQgdGhhdCBjb21wbGV0ZWx5IG9wYXF1ZSBwaXhlbHMgYXJlIGdhbW1hIGVuY29kZWQgYWNjb3JkaW5nIHRvCit0aGUgc2NyZWVuX2dhbW1hIHZhbHVlLiAgUGl4ZWxzIHdpdGggYWxwaGEgbGVzcyB0aGFuIDEuMAord2lsbCBzdGlsbCBoYXZlIGxpbmVhciBjb21wb25lbnRzLgorCitVc2UgdGhpcyBmb3JtYXQgaWYgeW91IGhhdmUgY29udHJvbCBvdmVyIHlvdXIKK2NvbXBvc2l0aW5nIHNvZnR3YXJlIGFuZCBzbyBkb24ndCBkbyBvdGhlciBhcml0aG1ldGljCisoc3VjaCBhcyBzY2FsaW5nKSBvbiB0aGUgZGF0YSB5b3UgZ2V0IGZyb20gbGlicG5nLiAgWW91cgorY29tcG9zaXRpbmcgc29mdHdhcmUgY2FuIHNpbXBseSBjb3B5IG9wYXF1ZSBwaXhlbHMgdG8KK3RoZSBvdXRwdXQgYnV0IHN0aWxsIGhhcyBsaW5lYXIgdmFsdWVzIGZvciB0aGUKK25vbi1vcGFxdWUgcGl4ZWxzLgorCitJbiBub3JtYWwgY29tcG9zaXRpbmcsIHdoZXJlIHRoZSBhbHBoYSBjaGFubmVsIGVuY29kZXMKK3BhcnRpYWwgcGl4ZWwgY292ZXJhZ2UgKGFzIG9wcG9zZWQgdG8gYnJvYWQgYXJlYQordHJhbnNsdWNlbmN5KSwgdGhlIGluYWNjdXJhY2llcyBvZiB0aGUgOC1iaXQKK3JlcHJlc2VudGF0aW9uIG9mIG5vbi1vcGFxdWUgcGl4ZWxzIGFyZSBpcnJlbGV2YW50LgorCitZb3UgY2FuIGFsc28gdHJ5IHRoaXMgZm9ybWF0IGlmIHlvdXIgc29mdHdhcmUgaXMgYnJva2VuOworaXQgbWlnaHQgbG9vayBiZXR0ZXIuCisKKyAgICBQTkdfQUxQSEFfQlJPS0VOOiBUaGlzIGlzIFBOR19BTFBIQV9TVEFOREFSRDsgaG93ZXZlciwgYWxsIGNvbXBvbmVudAordmFsdWVzLCBpbmNsdWRpbmcgdGhlIGFscGhhIGNoYW5uZWwgYXJlIGdhbW1hIGVuY29kZWQuICBUaGlzIGlzCiticm9rZW4gYmVjYXVzZSwgaW4gcHJhY3RpY2UsIG5vIGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyB0aGlzIGNob2ljZQorY29ycmVjdGx5IHVuZG9lcyB0aGUgZW5jb2RpbmcgYmVmb3JlIGhhbmRsaW5nIGFscGhhIGNvbXBvc2l0aW9uLiAgVXNlIHRoaXMKK2Nob2ljZSBvbmx5IGlmIG90aGVyIHNlcmlvdXMgZXJyb3JzIGluIHRoZSBzb2Z0d2FyZSBvciBoYXJkd2FyZSB5b3UgdXNlCittYW5kYXRlIGl0LiAgSW4gbW9zdCBjYXNlcyBvZiBicm9rZW4gc29mdHdhcmUgb3IgaGFyZHdhcmUgdGhlIGJ1ZyBpbiB0aGUKK2ZpbmFsIGRpc3BsYXkgbWFuaWZlc3RzIGFzIGEgc3VidGxlIGhhbG8gYXJvdW5kIGNvbXBvc2l0ZWQgcGFydHMgb2YgdGhlCitpbWFnZS4gIFlvdSBtYXkgbm90IGV2ZW4gcGVyY2VpdmUgdGhpcyBhcyBhIGhhbG87IHRoZSBjb21wb3NpdGVkIHBhcnQgb2YKK3RoZSBpbWFnZSBtYXkgc2ltcGx5IGFwcGVhciBzZXBhcmF0ZSBmcm9tIHRoZSBiYWNrZ3JvdW5kLCBhcyB0aG91Z2ggaXQgaGFkCitiZWVuIGN1dCBvdXQgb2YgcGFwZXIgYW5kIHBhc3RlZCBvbiBhZnRlcndhcmQuCisKK0lmIHlvdSBkb24ndCBoYXZlIHRvIGRlYWwgd2l0aCBidWdzIGluIHNvZnR3YXJlIG9yIGhhcmR3YXJlLCBvciBpZiB5b3UgY2FuIGZpeAordGhlbSwgdGhlcmUgYXJlIHRocmVlIHJlY29tbWVuZGVkIHdheXMgb2YgdXNpbmcgcG5nX3NldF9hbHBoYV9tb2RlKCk6CisKKyAgIHBuZ19zZXRfYWxwaGFfbW9kZShwbmdfcHRyLCBQTkdfQUxQSEFfUE5HLAorICAgICAgIHNjcmVlbl9nYW1tYSk7CisKK1lvdSBjYW4gZG8gY29sb3IgY29ycmVjdGlvbiBvbiB0aGUgcmVzdWx0IChsaWJwbmcgZG9lcyBub3QgY3VycmVudGx5CitzdXBwb3J0IGNvbG9yIGNvcnJlY3Rpb24gaW50ZXJuYWxseSkuICBXaGVuIHlvdSBoYW5kbGUgdGhlIGFscGhhIGNoYW5uZWwKK3lvdSBuZWVkIHRvIHVuZG8gdGhlIGdhbW1hIGVuY29kaW5nIGFuZCBtdWx0aXBseSBvdXQgdGhlIGFscGhhLgorCisgICBwbmdfc2V0X2FscGhhX21vZGUocG5nX3B0ciwgUE5HX0FMUEhBX1NUQU5EQVJELAorICAgICAgIHNjcmVlbl9nYW1tYSk7CisgICBwbmdfc2V0X2V4cGFuZF8xNihwbmdfcHRyKTsKKworSWYgeW91IGFyZSB1c2luZyB0aGUgaGlnaCBsZXZlbCBpbnRlcmZhY2UsIGRvbid0IGNhbGwgcG5nX3NldF9leHBhbmRfMTYoKTsKK2luc3RlYWQgcGFzcyBQTkdfVFJBTlNGT1JNX0VYUEFORF8xNiB0byB0aGUgaW50ZXJmYWNlLgorCitXaXRoIHRoaXMgbW9kZSB5b3UgY2FuJ3QgZG8gY29sb3IgY29ycmVjdGlvbiwgYnV0IHlvdSBjYW4gZG8gYXJpdGhtZXRpYywKK2luY2x1ZGluZyBjb21wb3NpdGlvbiBhbmQgc2NhbGluZywgb24gdGhlIGRhdGEgd2l0aG91dCBmdXJ0aGVyIHByb2Nlc3NpbmcuCisKKyAgIHBuZ19zZXRfYWxwaGFfbW9kZShwbmdfcHRyLCBQTkdfQUxQSEFfT1BUSU1JWkVELAorICAgICAgIHNjcmVlbl9nYW1tYSk7CisKK1lvdSBjYW4gYXZvaWQgdGhlIGV4cGFuc2lvbiB0byAxNi1iaXQgY29tcG9uZW50cyB3aXRoIHRoaXMgbW9kZSwgYnV0IHlvdQorbG9zZSB0aGUgYWJpbGl0eSB0byBzY2FsZSB0aGUgaW1hZ2Ugb3IgcGVyZm9ybSBvdGhlciBsaW5lYXIgYXJpdGhtZXRpYy4KK0FsbCB5b3UgY2FuIGRvIGlzIGNvbXBvc2UgdGhlIHJlc3VsdCBvbnRvIGEgbWF0Y2hpbmcgb3V0cHV0LiAgU2luY2UgdGhpcworbW9kZSBpcyBsaWJwbmctc3BlY2lmaWMgeW91IGFsc28gbmVlZCB0byB3cml0ZSB5b3VyIG93biBjb21wb3NpdGlvbgorc29mdHdhcmUuCisKK1RoZSBmb2xsb3dpbmcgYXJlIGV4YW1wbGVzIG9mIGNhbGxzIHRvIHBuZ19zZXRfYWxwaGFfbW9kZSB0byBhY2hpZXZlIHRoZQorcmVxdWlyZWQgb3ZlcmFsbCBnYW1tYSBjb3JyZWN0aW9uIGFuZCwgd2hlcmUgbmVjZXNzYXJ5LCBhbHBoYQorcHJlbXVsdGlwbGljYXRpb24uCisKKyAgICBwbmdfc2V0X2FscGhhX21vZGUocHAsIFBOR19BTFBIQV9QTkcsIFBOR19ERUZBVUxUX3NSR0IpOworCitUaGlzIGlzIHRoZSBkZWZhdWx0IGxpYnBuZyBoYW5kbGluZyBvZiB0aGUgYWxwaGEgY2hhbm5lbCAtIGl0IGlzIG5vdAorcHJlLW11bHRpcGxpZWQgaW50byB0aGUgY29sb3IgY29tcG9uZW50cy4gIEluIGFkZGl0aW9uIHRoZSBjYWxsIHN0YXRlcwordGhhdCB0aGUgb3V0cHV0IGlzIGZvciBhIHNSR0Igc3lzdGVtIGFuZCBjYXVzZXMgYWxsIFBORyBmaWxlcyB3aXRob3V0IGdBTUEKK2NodW5rcyB0byBiZSBhc3N1bWVkIHRvIGJlIGVuY29kZWQgdXNpbmcgc1JHQi4KKworICAgIHBuZ19zZXRfYWxwaGFfbW9kZShwcCwgUE5HX0FMUEhBX1BORywgUE5HX0dBTU1BX01BQyk7CisKK0luIHRoaXMgY2FzZSB0aGUgb3V0cHV0IGlzIGFzc3VtZWQgdG8gYmUgc29tZXRoaW5nIGxpa2UgYW4gc1JHQiBjb25mb3JtYW50CitkaXNwbGF5IHByZWNlZWRlZCBieSBhIHBvd2VyLWxhdyBsb29rdXAgdGFibGUgb2YgcG93ZXIgMS40NS4gIFRoaXMgaXMgaG93CitlYXJseSBNYWMgc3lzdGVtcyBiZWhhdmVkLgorCisgICAgcG5nX3NldF9hbHBoYV9tb2RlKHBwLCBQTkdfQUxQSEFfU1RBTkRBUkQsIFBOR19HQU1NQV9MSU5FQVIpOworCitUaGlzIGlzIHRoZSBjbGFzc2ljIEppbSBCbGlubiBhcHByb2FjaCBhbmQgd2lsbCB3b3JrIGluIGFjYWRlbWljCitlbnZpcm9ubWVudHMgd2hlcmUgZXZlcnl0aGluZyBpcyBkb25lIGJ5IHRoZSBib29rLiAgSXQgaGFzIHRoZSBzaG9ydGNvbWluZworb2YgYXNzdW1pbmcgdGhhdCBpbnB1dCBQTkcgZGF0YSB3aXRoIG5vIGdhbW1hIGluZm9ybWF0aW9uIGlzIGxpbmVhciAtIHRoaXMKK2lzIHVubGlrZWx5IHRvIGJlIGNvcnJlY3QgdW5sZXNzIHRoZSBQTkcgZmlsZXMgd2hlcmUgZ2VuZXJhdGVkIGxvY2FsbHkuCitNb3N0IG9mIHRoZSB0aW1lIHRoZSBvdXRwdXQgcHJlY2lzaW9uIHdpbGwgYmUgc28gbG93IGFzIHRvIHNob3cKK3NpZ25pZmljYW50IGJhbmRpbmcgaW4gZGFyayBhcmVhcyBvZiB0aGUgaW1hZ2UuCisKKyAgICBwbmdfc2V0X2V4cGFuZF8xNihwcCk7CisgICAgcG5nX3NldF9hbHBoYV9tb2RlKHBwLCBQTkdfQUxQSEFfU1RBTkRBUkQsIFBOR19ERUZBVUxUX3NSR0IpOworCitUaGlzIGlzIGEgc29tZXdoYXQgbW9yZSByZWFsaXN0aWMgSmltIEJsaW5uIGluc3BpcmVkIGFwcHJvYWNoLiAgUE5HIGZpbGVzCithcmUgYXNzdW1lZCB0byBoYXZlIHRoZSBzUkdCIGVuY29kaW5nIGlmIG5vdCBtYXJrZWQgd2l0aCBhIGdhbW1hIHZhbHVlIGFuZAordGhlIG91dHB1dCBpcyBhbHdheXMgMTYgYml0cyBwZXIgY29tcG9uZW50LiAgVGhpcyBwZXJtaXRzIGFjY3VyYXRlIHNjYWxpbmcKK2FuZCBwcm9jZXNzaW5nIG9mIHRoZSBkYXRhLiAgSWYgeW91IGtub3cgdGhhdCB5b3VyIGlucHV0IFBORyBmaWxlcyB3ZXJlCitnZW5lcmF0ZWQgbG9jYWxseSB5b3UgbWlnaHQgbmVlZCB0byByZXBsYWNlIFBOR19ERUZBVUxUX3NSR0Igd2l0aCB0aGUKK2NvcnJlY3QgdmFsdWUgZm9yIHlvdXIgc3lzdGVtLgorCisgICAgcG5nX3NldF9hbHBoYV9tb2RlKHBwLCBQTkdfQUxQSEFfT1BUSU1JWkVELCBQTkdfREVGQVVMVF9zUkdCKTsKKworSWYgeW91IGp1c3QgbmVlZCB0byBjb21wb3NpdGUgdGhlIFBORyBpbWFnZSBvbnRvIGFuIGV4aXN0aW5nIGJhY2tncm91bmQKK2FuZCBpZiB5b3UgY29udHJvbCB0aGUgY29kZSB0aGF0IGRvZXMgdGhpcyB5b3UgY2FuIHVzZSB0aGUgb3B0aW1pemF0aW9uCitzZXR0aW5nLiAgSW4gdGhpcyBjYXNlIHlvdSBqdXN0IGNvcHkgY29tcGxldGVseSBvcGFxdWUgcGl4ZWxzIHRvIHRoZQorb3V0cHV0LiAgRm9yIHBpeGVscyB0aGF0IGFyZSBub3QgY29tcGxldGVseSB0cmFuc3BhcmVudCAoeW91IGp1c3Qgc2tpcAordGhvc2UpIHlvdSBkbyB0aGUgY29tcG9zaXRpb24gbWF0aCB1c2luZyBwbmdfY29tcG9zaXRlIG9yIHBuZ19jb21wb3NpdGVfMTYKK2JlbG93IHRoZW4gZW5jb2RlIHRoZSByZXN1bHRhbnQgOC1iaXQgb3IgMTYtYml0IHZhbHVlcyB0byBtYXRjaCB0aGUgb3V0cHV0CitlbmNvZGluZy4KKworICAgIE90aGVyIGNhc2VzCisKK0lmIG5laXRoZXIgdGhlIFBORyBub3IgdGhlIHN0YW5kYXJkIGxpbmVhciBlbmNvZGluZyB3b3JrIGZvciB5b3UgYmVjYXVzZQorb2YgdGhlIHNvZnR3YXJlIG9yIGhhcmR3YXJlIHlvdSB1c2UgdGhlbiB5b3UgaGF2ZSBhIGJpZyBwcm9ibGVtLiAgVGhlIFBORworY2FzZSB3aWxsIHByb2JhYmx5IHJlc3VsdCBpbiBoYWxvcyBhcm91bmQgdGhlIGltYWdlLiAgVGhlIGxpbmVhciBlbmNvZGluZword2lsbCBwcm9iYWJseSByZXN1bHQgaW4gYSB3YXNoZWQgb3V0LCB0b28gYnJpZ2h0LCBpbWFnZSAoaXQncyBhY3R1YWxseSB0b28KK2NvbnRyYXN0eS4pICBUcnkgdGhlIEFMUEhBX09QVElNSVpFRCBtb2RlIGFib3ZlIC0gdGhpcyB3aWxsIHByb2JhYmx5CitzdWJzdGFudGlhbGx5IHJlZHVjZSB0aGUgaGFsb3MuICBBbHRlcm5hdGl2ZWx5IHRyeToKKworICAgIHBuZ19zZXRfYWxwaGFfbW9kZShwcCwgUE5HX0FMUEhBX0JST0tFTiwgUE5HX0RFRkFVTFRfc1JHQik7CisKK1RoaXMgb3B0aW9uIHdpbGwgYWxzbyByZWR1Y2UgdGhlIGhhbG9zLCBidXQgdGhlcmUgd2lsbCBiZSBzbGlnaHQgZGFyaworaGFsb3Mgcm91bmQgdGhlIG9wYXF1ZSBwYXJ0cyBvZiB0aGUgaW1hZ2Ugd2hlcmUgdGhlIGJhY2tncm91bmQgaXMgbGlnaHQuCitJbiB0aGUgT1BUSU1JWkVEIG1vZGUgdGhlIGhhbG9zIHdpbGwgYmUgbGlnaHQgaGFsb3Mgd2hlcmUgdGhlIGJhY2tncm91bmQKK2lzIGRhcmsuICBUYWtlIHlvdXIgcGljayAtIHRoZSBoYWxvcyBhcmUgdW5hdm9pZGFibGUgdW5sZXNzIHlvdSBjYW4gZ2V0Cit5b3VyIGhhcmR3YXJlL3NvZnR3YXJlIGZpeGVkISAgKFRoZSBPUFRJTUlaRUQgYXBwcm9hY2ggaXMgc2xpZ2h0bHkKK2Zhc3Rlci4pCisKK1doZW4gdGhlIGRlZmF1bHQgZ2FtbWEgb2YgUE5HIGZpbGVzIGRvZXNuJ3QgbWF0Y2ggdGhlIG91dHB1dCBnYW1tYS4KK0lmIHlvdSBoYXZlIFBORyBmaWxlcyB3aXRoIG5vIGdhbW1hIGluZm9ybWF0aW9uIHBuZ19zZXRfYWxwaGFfbW9kZSBhbGxvd3MKK3lvdSB0byBwcm92aWRlIGEgZGVmYXVsdCBnYW1tYSwgYnV0IGl0IGFsc28gc2V0cyB0aGUgb3VwdXQgZ2FtbWEgdG8gdGhlCittYXRjaGluZyB2YWx1ZS4gIElmIHlvdSBrbm93IHlvdXIgUE5HIGZpbGVzIGhhdmUgYSBnYW1tYSB0aGF0IGRvZXNuJ3QKK21hdGNoIHRoZSBvdXRwdXQgeW91IGNhbiB0YWtlIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0Citwbmdfc2V0X2FscGhhX21vZGUgYWx3YXlzIHNldHMgdGhlIG91dHB1dCBnYW1tYSBidXQgb25seSBzZXRzIHRoZSBQTkcKK2RlZmF1bHQgaWYgaXQgaXMgbm90IGFscmVhZHkgc2V0OgorCisgICAgcG5nX3NldF9hbHBoYV9tb2RlKHBwLCBQTkdfQUxQSEFfUE5HLCBQTkdfREVGQVVMVF9zUkdCKTsKKyAgICBwbmdfc2V0X2FscGhhX21vZGUocHAsIFBOR19BTFBIQV9QTkcsIFBOR19HQU1NQV9NQUMpOworCitUaGUgZmlyc3QgY2FsbCBzZXRzIGJvdGggdGhlIGRlZmF1bHQgYW5kIHRoZSBvdXRwdXQgZ2FtbWEgdmFsdWVzLCB0aGUKK3NlY29uZCBjYWxsIG92ZXJyaWRlcyB0aGUgb3V0cHV0IGdhbW1hIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGRlZmF1bHQuICBUaGlzCitpcyBlYXNpZXIgdGhhbiBhY2hpZXZpbmcgdGhlIHNhbWUgZWZmZWN0IHdpdGggcG5nX3NldF9nYW1tYS4gIFlvdSBtdXN0IHVzZQorUE5HX0FMUEhBX1BORyBmb3IgdGhlIGZpcnN0IGNhbGwgLSBpbnRlcm5hbCBjaGVja2luZyBpbiBwbmdfc2V0X2FscGhhIHdpbGwKK2ZpcmUgaWYgbW9yZSB0aGFuIG9uZSBjYWxsIHRvIHBuZ19zZXRfYWxwaGFfbW9kZSBhbmQgcG5nX3NldF9iYWNrZ3JvdW5kIGlzCittYWRlIGluIHRoZSBzYW1lIHJlYWQgb3BlcmF0aW9uLCBob3dldmVyIG11bHRpcGxlIGNhbGxzIHdpdGggUE5HX0FMUEhBX1BORworYXJlIGlnbm9yZWQuCisKK0lmIHlvdSBkb24ndCBuZWVkLCBvciBjYW4ndCBoYW5kbGUsIHRoZSBhbHBoYSBjaGFubmVsIHlvdSBjYW4gY2FsbAorcG5nX3NldF9iYWNrZ3JvdW5kKCkgdG8gcmVtb3ZlIGl0IGJ5IGNvbXBvc2l0aW5nIGFnYWluc3QgYSBmaXhlZCBjb2xvci4gIERvbid0CitjYWxsIHBuZ19zZXRfc3RyaXBfYWxwaGEoKSB0byBkbyB0aGlzIC0gaXQgd2lsbCBsZWF2ZSBzcHVyaW91cyBwaXhlbCB2YWx1ZXMgaW4KK3RyYW5zcGFyZW50IHBhcnRzIG9mIHRoaXMgaW1hZ2UuCisKKyAgIHBuZ19zZXRfYmFja2dyb3VuZChwbmdfcHRyLCAmYmFja2dyb3VuZF9jb2xvciwKKyAgICAgICBQTkdfQkFDS0dST1VORF9HQU1NQV9TQ1JFRU4sIDAsIDEpOworCitUaGUgYmFja2dyb3VuZF9jb2xvciBpcyBhbiBSR0Igb3IgZ3JheXNjYWxlIHZhbHVlIGFjY29yZGluZyB0byB0aGUgZGF0YSBmb3JtYXQKK2xpYnBuZyB3aWxsIHByb2R1Y2UgZm9yIHlvdS4gIEJlY2F1c2UgeW91IGRvbid0IHlldCBrbm93IHRoZSBmb3JtYXQgb2YgdGhlIFBORworZmlsZSwgaWYgeW91IGNhbGwgcG5nX3NldF9iYWNrZ3JvdW5kIGF0IHRoaXMgcG9pbnQgeW91IG11c3QgYXJyYW5nZSBmb3IgdGhlCitmb3JtYXQgcHJvZHVjZWQgYnkgbGlicG5nIHRvIGFsd2F5cyBoYXZlIDgtYml0IG9yIDE2LWJpdCBjb21wb25lbnRzIGFuZCB0aGVuCitzdG9yZSB0aGUgY29sb3IgYXMgYW4gOC1iaXQgb3IgMTYtYml0IGNvbG9yIGFzIGFwcHJvcHJpYXRlLiAgVGhlIGNvbG9yIGNvbnRhaW5zCitzZXBhcmF0ZSBncmF5IGFuZCBSR0IgY29tcG9uZW50IHZhbHVlcywgc28geW91IGNhbiBsZXQgbGlicG5nIHByb2R1Y2UgZ3JheSBvcgorUkdCIG91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIGlucHV0IGZvcm1hdCwgYnV0IGxvdyBiaXQgZGVwdGggZ3JheXNjYWxlIGltYWdlcworbXVzdCBhbHdheXMgYmUgY29udmVydGVkIHRvIGF0IGxlYXN0IDgtYml0IGZvcm1hdC4gIChFdmVuIHRob3VnaCBsb3cgYml0IGRlcHRoCitncmF5c2NhbGUgaW1hZ2VzIGNhbid0IGhhdmUgYW4gYWxwaGEgY2hhbm5lbCB0aGV5IGNhbiBoYXZlIGEgdHJhbnNwYXJlbnQKK2NvbG9yISkKKworWW91IHNldCB0aGUgdHJhbnNmb3JtcyB5b3UgbmVlZCBsYXRlciwgZWl0aGVyIGFzIGZsYWdzIHRvIHRoZSBoaWdoIGxldmVsCitpbnRlcmZhY2Ugb3IgbGlicG5nIEFQSSBjYWxscyBmb3IgdGhlIGxvdyBsZXZlbCBpbnRlcmZhY2UuICBGb3IgcmVmZXJlbmNlIHRoZQorc2V0dGluZ3MgYW5kIEFQSSBjYWxscyByZXF1aXJlZCBhcmU6CisKKzgtYml0IHZhbHVlczoKKyAgIFBOR19UUkFOU0ZPUk1fU0NBTEVfMTYgfCBQTkdfRVhQQU5ECisgICBwbmdfc2V0X2V4cGFuZChwbmdfcHRyKTsgcG5nX3NldF9zY2FsZV8xNihwbmdfcHRyKTsKKworICAgSWYgeW91IG11c3QgZ2V0IGV4YWN0bHkgdGhlIHNhbWUgaW5hY2N1cmF0ZSByZXN1bHRzCisgICBwcm9kdWNlZCBieSBkZWZhdWx0IGluIHZlcnNpb25zIHByaW9yIHRvIGxpYnBuZy0xLjUuNCwKKyAgIHVzZSBQTkdfVFJBTlNGT1JNX1NUUklQXzE2IGFuZCBwbmdfc2V0X3N0cmlwXzE2KHBuZ19wdHIpCisgICBpbnN0ZWFkLgorCisxNi1iaXQgdmFsdWVzOgorICAgUE5HX1RSQU5TRk9STV9FWFBBTkRfMTYKKyAgIHBuZ19zZXRfZXhwYW5kXzE2KHBuZ19wdHIpOworCitJbiBlaXRoZXIgY2FzZSBwYWxldHRlIGltYWdlIGRhdGEgd2lsbCBiZSBleHBhbmRlZCB0byBSR0IuICBJZiB5b3UganVzdCB3YW50Citjb2xvciBkYXRhIHlvdSBjYW4gYWRkIFBOR19UUkFOU0ZPUk1fR1JBWV9UT19SR0Igb3IgcG5nX3NldF9ncmF5X3RvX3JnYihwbmdfcHRyKQordG8gdGhlIGxpc3QuCisKK0NhbGxpbmcgcG5nX3NldF9iYWNrZ3JvdW5kIGJlZm9yZSB0aGUgUE5HIGZpbGUgaGVhZGVyIGlzIHJlYWQgd2lsbCBub3Qgd29yaworcHJpb3IgdG8gbGlicG5nLTEuNS40LiAgQmVjYXVzZSB0aGUgZmFpbHVyZSBtYXkgcmVzdWx0IGluIHVuZXhwZWN0ZWQgd2FybmluZ3Mgb3IKK2Vycm9ycyBpdCBpcyB0aGVyZWZvcmUgbXVjaCBzYWZlciB0byBjYWxsIHBuZ19zZXRfYmFja2dyb3VuZCBhZnRlciB0aGUgaGVhZCBoYXMKK2JlZW4gcmVhZC4gIFVuZm9ydHVuYXRlbHkgdGhpcyBtZWFucyB0aGF0IHByaW9yIHRvIGxpYnBuZy0xLjUuNCBpdCBjYW5ub3QgYmUKK3VzZWQgd2l0aCB0aGUgaGlnaCBsZXZlbCBpbnRlcmZhY2UuCisKK1RoZSBoaWdoLWxldmVsIHJlYWQgaW50ZXJmYWNlCisKK0F0IHRoaXMgcG9pbnQgdGhlcmUgYXJlIHR3byB3YXlzIHRvIHByb2NlZWQ7IHRocm91Z2ggdGhlIGhpZ2gtbGV2ZWwKK3JlYWQgaW50ZXJmYWNlLCBvciB0aHJvdWdoIGEgc2VxdWVuY2Ugb2YgbG93LWxldmVsIHJlYWQgb3BlcmF0aW9ucy4KK1lvdSBjYW4gdXNlIHRoZSBoaWdoLWxldmVsIGludGVyZmFjZSBpZiAoYSkgeW91IGFyZSB3aWxsaW5nIHRvIHJlYWQKK3RoZSBlbnRpcmUgaW1hZ2UgaW50byBtZW1vcnksIGFuZCAoYikgdGhlIGlucHV0IHRyYW5zZm9ybWF0aW9ucworeW91IHdhbnQgdG8gZG8gYXJlIGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBzZXQ6CisKKyAgICBQTkdfVFJBTlNGT1JNX0lERU5USVRZICAgICAgTm8gdHJhbnNmb3JtYXRpb24KKyAgICBQTkdfVFJBTlNGT1JNX1NDQUxFXzE2ICAgICAgU3RyaXAgMTYtYml0IHNhbXBsZXMgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOC1iaXQgYWNjdXJhdGVseQorICAgIFBOR19UUkFOU0ZPUk1fU1RSSVBfMTYgICAgICBDaG9wIDE2LWJpdCBzYW1wbGVzIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgtYml0IGxlc3MgYWNjdXJhdGVseQorICAgIFBOR19UUkFOU0ZPUk1fU1RSSVBfQUxQSEEgICBEaXNjYXJkIHRoZSBhbHBoYSBjaGFubmVsCisgICAgUE5HX1RSQU5TRk9STV9QQUNLSU5HICAgICAgIEV4cGFuZCAxLCAyIGFuZCA0LWJpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzIHRvIGJ5dGVzCisgICAgUE5HX1RSQU5TRk9STV9QQUNLU1dBUCAgICAgIENoYW5nZSBvcmRlciBvZiBwYWNrZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzIHRvIExTQiBmaXJzdAorICAgIFBOR19UUkFOU0ZPUk1fRVhQQU5EICAgICAgICBQZXJmb3JtIHNldF9leHBhbmQoKQorICAgIFBOR19UUkFOU0ZPUk1fSU5WRVJUX01PTk8gICBJbnZlcnQgbW9ub2Nocm9tZSBpbWFnZXMKKyAgICBQTkdfVFJBTlNGT1JNX1NISUZUICAgICAgICAgTm9ybWFsaXplIHBpeGVscyB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0JJVCBkZXB0aAorICAgIFBOR19UUkFOU0ZPUk1fQkdSICAgICAgICAgICBGbGlwIFJHQiB0byBCR1IsIFJHQkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gQkdSQQorICAgIFBOR19UUkFOU0ZPUk1fU1dBUF9BTFBIQSAgICBGbGlwIFJHQkEgdG8gQVJHQiBvciBHQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBBRworICAgIFBOR19UUkFOU0ZPUk1fSU5WRVJUX0FMUEhBICBDaGFuZ2UgYWxwaGEgZnJvbSBvcGFjaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRyYW5zcGFyZW5jeQorICAgIFBOR19UUkFOU0ZPUk1fU1dBUF9FTkRJQU4gICBCeXRlLXN3YXAgMTYtYml0IHNhbXBsZXMKKyAgICBQTkdfVFJBTlNGT1JNX0dSQVlfVE9fUkdCICAgRXhwYW5kIGdyYXlzY2FsZSBzYW1wbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFJHQiAob3IgR0EgdG8gUkdCQSkKKyAgICBQTkdfVFJBTlNGT1JNX0VYUEFORF8xNiAgICAgRXhwYW5kIHNhbXBsZXMgdG8gMTYgYml0cworCisoVGhpcyBleGNsdWRlcyBzZXR0aW5nIGEgYmFja2dyb3VuZCBjb2xvciwgZG9pbmcgZ2FtbWEgdHJhbnNmb3JtYXRpb24sCitxdWFudGl6aW5nLCBhbmQgc2V0dGluZyBmaWxsZXIuKSAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgc2ltcGx5IGRvIHRoaXM6CisKKyAgICBwbmdfcmVhZF9wbmcocG5nX3B0ciwgaW5mb19wdHIsIHBuZ190cmFuc2Zvcm1zLCBOVUxMKQorCit3aGVyZSBwbmdfdHJhbnNmb3JtcyBpcyBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIGJpdHdpc2UgT1Igb2Ygc29tZQorc2V0IG9mIHRyYW5zZm9ybWF0aW9uIGZsYWdzLiAgVGhpcyBjYWxsIGlzIGVxdWl2YWxlbnQgdG8gcG5nX3JlYWRfaW5mbygpLAorZm9sbG93ZWQgdGhlIHNldCBvZiB0cmFuc2Zvcm1hdGlvbnMgaW5kaWNhdGVkIGJ5IHRoZSB0cmFuc2Zvcm0gbWFzaywKK3RoZW4gcG5nX3JlYWRfaW1hZ2UoKSwgYW5kIGZpbmFsbHkgcG5nX3JlYWRfZW5kKCkuCisKKyhUaGUgZmluYWwgcGFyYW1ldGVyIG9mIHRoaXMgY2FsbCBpcyBub3QgeWV0IHVzZWQuICBTb21lZGF5IGl0IG1pZ2h0IHBvaW50Cit0byB0cmFuc2Zvcm1hdGlvbiBwYXJhbWV0ZXJzIHJlcXVpcmVkIGJ5IHNvbWUgZnV0dXJlIGlucHV0IHRyYW5zZm9ybS4pCisKK1lvdSBtdXN0IHVzZSBwbmdfdHJhbnNmb3JtcyBhbmQgbm90IGNhbGwgYW55IHBuZ19zZXRfdHJhbnNmb3JtKCkgZnVuY3Rpb25zCit3aGVuIHlvdSB1c2UgcG5nX3JlYWRfcG5nKCkuCisKK0FmdGVyIHlvdSBoYXZlIGNhbGxlZCBwbmdfcmVhZF9wbmcoKSwgeW91IGNhbiByZXRyaWV2ZSB0aGUgaW1hZ2UgZGF0YQord2l0aAorCisgICByb3dfcG9pbnRlcnMgPSBwbmdfZ2V0X3Jvd3MocG5nX3B0ciwgaW5mb19wdHIpOworCit3aGVyZSByb3dfcG9pbnRlcnMgaXMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gdGhlIHBpeGVsIGRhdGEgZm9yIGVhY2ggcm93OgorCisgICBwbmdfYnl0ZXAgcm93X3BvaW50ZXJzW2hlaWdodF07CisKK0lmIHlvdSBrbm93IHlvdXIgaW1hZ2Ugc2l6ZSBhbmQgcGl4ZWwgc2l6ZSBhaGVhZCBvZiB0aW1lLCB5b3UgY2FuIGFsbG9jYXRlCityb3dfcG9pbnRlcnMgcHJpb3IgdG8gY2FsbGluZyBwbmdfcmVhZF9wbmcoKSB3aXRoCisKKyAgIGlmIChoZWlnaHQgPiBQTkdfVUlOVF8zMl9NQVgvKHNpemVvZiAocG5nX2J5dGUpKSkKKyAgICAgIHBuZ19lcnJvciAocG5nX3B0ciwKKyAgICAgICAgICAiSW1hZ2UgaXMgdG9vIHRhbGwgdG8gcHJvY2VzcyBpbiBtZW1vcnkiKTsKKworICAgaWYgKHdpZHRoID4gUE5HX1VJTlRfMzJfTUFYL3BpeGVsX3NpemUpCisgICAgICBwbmdfZXJyb3IgKHBuZ19wdHIsCisgICAgICAgICAgIkltYWdlIGlzIHRvbyB3aWRlIHRvIHByb2Nlc3MgaW4gbWVtb3J5Iik7CisKKyAgIHJvd19wb2ludGVycyA9IHBuZ19tYWxsb2MocG5nX3B0ciwKKyAgICAgICBoZWlnaHQqKHNpemVvZiAocG5nX2J5dGVwKSkpOworCisgICBmb3IgKGludCBpPTA7IGk8aGVpZ2h0LCBpKyspCisgICAgICByb3dfcG9pbnRlcnNbaV09TlVMTDsgIC8qIHNlY3VyaXR5IHByZWNhdXRpb24gKi8KKworICAgZm9yIChpbnQgaT0wOyBpPGhlaWdodCwgaSsrKQorICAgICAgcm93X3BvaW50ZXJzW2ldPXBuZ19tYWxsb2MocG5nX3B0ciwKKyAgICAgICAgICB3aWR0aCpwaXhlbF9zaXplKTsKKworICAgcG5nX3NldF9yb3dzKHBuZ19wdHIsIGluZm9fcHRyLCAmcm93X3BvaW50ZXJzKTsKKworQWx0ZXJuYXRpdmVseSB5b3UgY291bGQgYWxsb2NhdGUgeW91ciBpbWFnZSBpbiBvbmUgYmlnIGJsb2NrIGFuZCBkZWZpbmUKK3Jvd19wb2ludGVyc1tpXSB0byBwb2ludCBpbnRvIHRoZSBwcm9wZXIgcGxhY2VzIGluIHlvdXIgYmxvY2suCisKK0lmIHlvdSB1c2UgcG5nX3NldF9yb3dzKCksIHRoZSBhcHBsaWNhdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZworcm93X3BvaW50ZXJzIChhbmQgcm93X3BvaW50ZXJzW2ldLCBpZiB0aGV5IHdlcmUgc2VwYXJhdGVseSBhbGxvY2F0ZWQpLgorCitJZiB5b3UgZG9uJ3QgYWxsb2NhdGUgcm93X3BvaW50ZXJzIGFoZWFkIG9mIHRpbWUsIHBuZ19yZWFkX3BuZygpIHdpbGwKK2RvIGl0LCBhbmQgaXQnbGwgYmUgZnJlZSdlZCBieSBsaWJwbmcgd2hlbiB5b3UgY2FsbCBwbmdfZGVzdHJveV8qKCkuCisKK1RoZSBsb3ctbGV2ZWwgcmVhZCBpbnRlcmZhY2UKKworSWYgeW91IGFyZSBnb2luZyB0aGUgbG93LWxldmVsIHJvdXRlLCB5b3UgYXJlIG5vdyByZWFkeSB0byByZWFkIGFsbAordGhlIGZpbGUgaW5mb3JtYXRpb24gdXAgdG8gdGhlIGFjdHVhbCBpbWFnZSBkYXRhLiAgWW91IGRvIHRoaXMgd2l0aCBhCitjYWxsIHRvIHBuZ19yZWFkX2luZm8oKS4KKworICAgIHBuZ19yZWFkX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOworCitUaGlzIHdpbGwgcHJvY2VzcyBhbGwgY2h1bmtzIHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nIHRoZSBpbWFnZSBkYXRhLgorCitUaGlzIGFsc28gY29waWVzIHNvbWUgb2YgdGhlIGRhdGEgZnJvbSB0aGUgUE5HIGZpbGUgaW50byB0aGUgZGVjb2RlIHN0cnVjdHVyZQorZm9yIHVzZSBpbiBsYXRlciB0cmFuc2Zvcm1hdGlvbnMuICBJbXBvcnRhbnQgaW5mb3JtYXRpb24gY29waWVkIGluIGlzOgorCisxKSBUaGUgUE5HIGZpbGUgZ2FtbWEgZnJvbSB0aGUgZ0FNQSBjaHVuay4gIFRoaXMgb3ZlcndyaXRlcyB0aGUgZGVmYXVsdCB2YWx1ZQorcHJvdmlkZWQgYnkgYW4gZWFybGllciBjYWxsIHRvIHBuZ19zZXRfZ2FtbWEgb3IgcG5nX3NldF9hbHBoYV9tb2RlLgorCisyKSBQcmlvciB0byBsaWJwbmctMS41LjQgdGhlIGJhY2tncm91bmQgY29sb3IgZnJvbSBhIGJLR2QgY2h1bmsuICBUaGlzCitkYW1hZ2VzIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSBhbiBlYXJsaWVyIGNhbGwgdG8gcG5nX3NldF9iYWNrZ3JvdW5kCityZXN1bHRpbmcgaW4gdW5leHBlY3RlZCBiZWhhdmlvci4gIExpYnBuZy0xLjUuNCBubyBsb25nZXIgZG9lcyB0aGlzLgorCiszKSBUaGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGJpdHMgaW4gZWFjaCBjb21wb25lbnQgdmFsdWUuICBMaWJwbmcgdXNlcyB0aGlzIHRvCitvcHRpbWl6ZSBnYW1tYSBoYW5kbGluZyBieSByZWR1Y2luZyB0aGUgaW50ZXJuYWwgbG9va3VwIHRhYmxlIHNpemVzLgorCis0KSBUaGUgdHJhbnNwYXJlbnQgY29sb3IgaW5mb3JtYXRpb24gZnJvbSBhIHRSTlMgY2h1bmsuICBUaGlzIGNhbiBiZSBtb2RpZmllZCBieQorYSBsYXRlciBjYWxsIHRvIHBuZ19zZXRfdFJOUy4KKworUXVlcnlpbmcgdGhlIGluZm8gc3RydWN0dXJlCisKK0Z1bmN0aW9ucyBhcmUgdXNlZCB0byBnZXQgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIGluZm9fcHRyIG9uY2UgaXQKK2hhcyBiZWVuIHJlYWQuICBOb3RlIHRoYXQgdGhlc2UgZmllbGRzIG1heSBub3QgYmUgY29tcGxldGVseSBmaWxsZWQKK2luIHVudGlsIHBuZ19yZWFkX2VuZCgpIGhhcyByZWFkIHRoZSBjaHVuayBkYXRhIGZvbGxvd2luZyB0aGUgaW1hZ2UuCisKKyAgICBwbmdfZ2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsICZ3aWR0aCwgJmhlaWdodCwKKyAgICAgICAmYml0X2RlcHRoLCAmY29sb3JfdHlwZSwgJmludGVybGFjZV90eXBlLAorICAgICAgICZjb21wcmVzc2lvbl90eXBlLCAmZmlsdGVyX21ldGhvZCk7CisKKyAgICB3aWR0aCAgICAgICAgICAtIGhvbGRzIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UKKyAgICAgICAgICAgICAgICAgICAgIGluIHBpeGVscyAodXAgdG8gMl4zMSkuCisKKyAgICBoZWlnaHQgICAgICAgICAtIGhvbGRzIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlCisgICAgICAgICAgICAgICAgICAgICBpbiBwaXhlbHMgKHVwIHRvIDJeMzEpLgorCisgICAgYml0X2RlcHRoICAgICAgLSBob2xkcyB0aGUgYml0IGRlcHRoIG9mIG9uZSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgIGltYWdlIGNoYW5uZWxzLiAgKHZhbGlkIHZhbHVlcyBhcmUKKyAgICAgICAgICAgICAgICAgICAgIDEsIDIsIDQsIDgsIDE2IGFuZCBkZXBlbmQgYWxzbyBvbgorICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbG9yX3R5cGUuICBTZWUgYWxzbworICAgICAgICAgICAgICAgICAgICAgc2lnbmlmaWNhbnQgYml0cyAoc0JJVCkgYmVsb3cpLgorCisgICAgY29sb3JfdHlwZSAgICAgLSBkZXNjcmliZXMgd2hpY2ggY29sb3IvYWxwaGEgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgcHJlc2VudC4KKyAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX0dSQVkKKyAgICAgICAgICAgICAgICAgICAgICAgIChiaXQgZGVwdGhzIDEsIDIsIDQsIDgsIDE2KQorICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgKGJpdCBkZXB0aHMgOCwgMTYpCisgICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFCisgICAgICAgICAgICAgICAgICAgICAgICAoYml0IGRlcHRocyAxLCAyLCA0LCA4KQorICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfUkdCCisgICAgICAgICAgICAgICAgICAgICAgICAoYml0X2RlcHRocyA4LCAxNikKKyAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgKGJpdF9kZXB0aHMgOCwgMTYpCisKKyAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9NQVNLX1BBTEVUVEUKKyAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9NQVNLX0NPTE9SCisgICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfTUFTS19BTFBIQQorCisgICAgaW50ZXJsYWNlX3R5cGUgLSAoUE5HX0lOVEVSTEFDRV9OT05FIG9yCisgICAgICAgICAgICAgICAgICAgICBQTkdfSU5URVJMQUNFX0FEQU03KQorCisgICAgY29tcHJlc3Npb25fdHlwZSAtIChtdXN0IGJlIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UKKyAgICAgICAgICAgICAgICAgICAgIGZvciBQTkcgMS4wKQorCisgICAgZmlsdGVyX21ldGhvZCAgLSAobXVzdCBiZSBQTkdfRklMVEVSX1RZUEVfQkFTRQorICAgICAgICAgICAgICAgICAgICAgZm9yIFBORyAxLjAsIGFuZCBjYW4gYWxzbyBiZQorICAgICAgICAgICAgICAgICAgICAgUE5HX0lOVFJBUElYRUxfRElGRkVSRU5DSU5HIGlmCisgICAgICAgICAgICAgICAgICAgICB0aGUgUE5HIGRhdGFzdHJlYW0gaXMgZW1iZWRkZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgIGEgTU5HLTEuMCBkYXRhc3RyZWFtKQorCisgICAgQW55IG9mIHdpZHRoLCBoZWlnaHQsIGNvbG9yX3R5cGUsIGJpdF9kZXB0aCwKKyAgICBpbnRlcmxhY2VfdHlwZSwgY29tcHJlc3Npb25fdHlwZSwgb3IgZmlsdGVyX21ldGhvZCBjYW4KKyAgICBiZSBOVUxMIGlmIHlvdSBhcmUgbm90IGludGVyZXN0ZWQgaW4gdGhlaXIgdmFsdWVzLgorCisgICAgTm90ZSB0aGF0IHBuZ19nZXRfSUhEUigpIHJldHVybnMgMzItYml0IGRhdGEgaW50bworICAgIHRoZSBhcHBsaWNhdGlvbidzIHdpZHRoIGFuZCBoZWlnaHQgdmFyaWFibGVzLgorICAgIFRoaXMgaXMgYW4gdW5zYWZlIHNpdHVhdGlvbiBpZiB0aGVzZSBhcmUgbm90IHBuZ191aW50XzMyCisgICAgdmFyaWFibGVzLiAgSW4gc3VjaCBzaXR1YXRpb25zLCB0aGUKKyAgICBwbmdfZ2V0X2ltYWdlX3dpZHRoKCkgYW5kIHBuZ19nZXRfaW1hZ2VfaGVpZ2h0KCkKKyAgICBmdW5jdGlvbnMgZGVzY3JpYmVkIGJlbG93IGFyZSBzYWZlci4KKworICAgIHdpZHRoICAgICAgICAgICAgPSBwbmdfZ2V0X2ltYWdlX3dpZHRoKHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOworCisgICAgaGVpZ2h0ICAgICAgICAgICA9IHBuZ19nZXRfaW1hZ2VfaGVpZ2h0KHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOworCisgICAgYml0X2RlcHRoICAgICAgICA9IHBuZ19nZXRfYml0X2RlcHRoKHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOworCisgICAgY29sb3JfdHlwZSAgICAgICA9IHBuZ19nZXRfY29sb3JfdHlwZShwbmdfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyKTsKKworICAgIGludGVybGFjZV90eXBlICAgPSBwbmdfZ2V0X2ludGVybGFjZV90eXBlKHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOworCisgICAgY29tcHJlc3Npb25fdHlwZSA9IHBuZ19nZXRfY29tcHJlc3Npb25fdHlwZShwbmdfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyKTsKKworICAgIGZpbHRlcl9tZXRob2QgICAgPSBwbmdfZ2V0X2ZpbHRlcl90eXBlKHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOworCisgICAgY2hhbm5lbHMgPSBwbmdfZ2V0X2NoYW5uZWxzKHBuZ19wdHIsIGluZm9fcHRyKTsKKworICAgIGNoYW5uZWxzICAgICAgIC0gbnVtYmVyIG9mIGNoYW5uZWxzIG9mIGluZm8gZm9yIHRoZQorICAgICAgICAgICAgICAgICAgICAgY29sb3IgdHlwZSAodmFsaWQgdmFsdWVzIGFyZSAxIChHUkFZLAorICAgICAgICAgICAgICAgICAgICAgUEFMRVRURSksIDIgKEdSQVlfQUxQSEEpLCAzIChSR0IpLAorICAgICAgICAgICAgICAgICAgICAgNCAoUkdCX0FMUEhBIG9yIFJHQiArIGZpbGxlciBieXRlKSkKKworICAgIHJvd2J5dGVzID0gcG5nX2dldF9yb3dieXRlcyhwbmdfcHRyLCBpbmZvX3B0cik7CisKKyAgICByb3dieXRlcyAgICAgICAtIG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gaG9sZCBhIHJvdworCisgICAgc2lnbmF0dXJlID0gcG5nX2dldF9zaWduYXR1cmUocG5nX3B0ciwgaW5mb19wdHIpOworCisgICAgc2lnbmF0dXJlICAgICAgLSBob2xkcyB0aGUgc2lnbmF0dXJlIHJlYWQgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgICAgIGZpbGUgKGlmIGFueSkuICBUaGUgZGF0YSBpcyBrZXB0IGluCisgICAgICAgICAgICAgICAgICAgICB0aGUgc2FtZSBvZmZzZXQgaXQgd291bGQgYmUgaWYgdGhlCisgICAgICAgICAgICAgICAgICAgICB3aG9sZSBzaWduYXR1cmUgd2VyZSByZWFkIChpLmUuIGlmIGFuCisgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBoYWQgYWxyZWFkeSByZWFkIGluIDQKKyAgICAgICAgICAgICAgICAgICAgIGJ5dGVzIG9mIHNpZ25hdHVyZSBiZWZvcmUgc3RhcnRpbmcKKyAgICAgICAgICAgICAgICAgICAgIGxpYnBuZywgdGhlIHJlbWFpbmluZyA0IGJ5dGVzIHdvdWxkCisgICAgICAgICAgICAgICAgICAgICBiZSBpbiBzaWduYXR1cmVbNF0gdGhyb3VnaCBzaWduYXR1cmVbN10KKyAgICAgICAgICAgICAgICAgICAgIChzZWUgcG5nX3NldF9zaWdfYnl0ZXMoKSkpLgorCitUaGVzZSBhcmUgYWxzbyBpbXBvcnRhbnQsIGJ1dCB0aGVpciB2YWxpZGl0eSBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIGNodW5rCitoYXMgYmVlbiByZWFkLiAgVGhlIHBuZ19nZXRfdmFsaWQocG5nX3B0ciwgaW5mb19wdHIsIFBOR19JTkZPXzxjaHVuaz4pIGFuZAorcG5nX2dldF88Y2h1bms+KHBuZ19wdHIsIGluZm9fcHRyLCAuLi4pIGZ1bmN0aW9ucyByZXR1cm4gbm9uLXplcm8gaWYgdGhlCitkYXRhIGhhcyBiZWVuIHJlYWQsIG9yIHplcm8gaWYgaXQgaXMgbWlzc2luZy4gIFRoZSBwYXJhbWV0ZXJzIHRvIHRoZQorcG5nX2dldF88Y2h1bms+IGFyZSBzZXQgZGlyZWN0bHkgaWYgdGhleSBhcmUgc2ltcGxlIGRhdGEgdHlwZXMsIG9yIGEKK3BvaW50ZXIgaW50byB0aGUgaW5mb19wdHIgaXMgcmV0dXJuZWQgZm9yIGFueSBjb21wbGV4IHR5cGVzLgorCitUaGUgY29sb3JzcGFjZSBkYXRhIGZyb20gZ0FNQSwgY0hSTSwgc1JHQiwgaUNDUCwgYW5kIHNCSVQgY2h1bmtzCitpcyBzaW1wbHkgcmV0dXJuZWQgdG8gZ2l2ZSB0aGUgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgaG93IHRoZQoraW1hZ2Ugd2FzIGVuY29kZWQuICBMaWJwbmcgaXRzZWxmIG9ubHkgZG9lcyB0cmFuc2Zvcm1hdGlvbnMgdXNpbmcgdGhlIGZpbGUKK2dhbW1hIHdoZW4gY29tYmluaW5nIHNlbWl0cmFuc3BhcmVudCBwaXhlbHMgd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvciwgYW5kLAorc2luY2UgbGlicG5nLTEuNi4wLCB3aGVuIGNvbnZlcnRpbmcgYmV0d2VlbiA4LWJpdCBzUkdCIGFuZCAxNi1iaXQgbGluZWFyIHBpeGVscword2l0aGluIHRoZSBzaW1wbGlmaWVkIEFQSS4gIExpYnBuZyBhbHNvIHVzZXMgdGhlIGZpbGUgZ2FtbWEgd2hlbiBjb252ZXJ0aW5nCitSR0IgdG8gZ3JheSwgYmVnaW5uaW5nIHdpdGggbGlicG5nLTEuMC41LCBpZiB0aGUgYXBwbGljYXRpb24gY2FsbHMKK3BuZ19zZXRfcmdiX3RvX2dyYXkoKSkuCisKKyAgICBwbmdfZ2V0X1BMVEUocG5nX3B0ciwgaW5mb19wdHIsICZwYWxldHRlLAorICAgICAgICAgICAgICAgICAgICAgJm51bV9wYWxldHRlKTsKKworICAgIHBhbGV0dGUgICAgICAgIC0gdGhlIHBhbGV0dGUgZm9yIHRoZSBmaWxlCisgICAgICAgICAgICAgICAgICAgICAoYXJyYXkgb2YgcG5nX2NvbG9yKQorCisgICAgbnVtX3BhbGV0dGUgICAgLSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgcGFsZXR0ZQorCisgICAgcG5nX2dldF9nQU1BKHBuZ19wdHIsIGluZm9fcHRyLCAmZmlsZV9nYW1tYSk7CisgICAgcG5nX2dldF9nQU1BX2ZpeGVkKHBuZ19wdHIsIGluZm9fcHRyLCAmaW50X2ZpbGVfZ2FtbWEpOworCisgICAgZmlsZV9nYW1tYSAgICAgLSB0aGUgZ2FtbWEgYXQgd2hpY2ggdGhlIGZpbGUgaXMKKyAgICAgICAgICAgICAgICAgICAgIHdyaXR0ZW4gKFBOR19JTkZPX2dBTUEpCisKKyAgICBpbnRfZmlsZV9nYW1tYSAtIDEwMCwwMDAgdGltZXMgdGhlIGdhbW1hIGF0IHdoaWNoIHRoZQorICAgICAgICAgICAgICAgICAgICAgZmlsZSBpcyB3cml0dGVuCisKKyAgICBwbmdfZ2V0X2NIUk0ocG5nX3B0ciwgaW5mb19wdHIsICAmd2hpdGVfeCwgJndoaXRlX3ksICZyZWRfeCwKKyAgICAgICAgICAgICAgICAgICAgICZyZWRfeSwgJmdyZWVuX3gsICZncmVlbl95LCAmYmx1ZV94LCAmYmx1ZV95KQorICAgIHBuZ19nZXRfY0hSTV9YWVoocG5nX3B0ciwgaW5mb19wdHIsICZyZWRfWCwgJnJlZF9ZLCAmcmVkX1osCisgICAgICAgICAgICAgICAgICAgICAmZ3JlZW5fWCwgJmdyZWVuX1ksICZncmVlbl9aLCAmYmx1ZV9YLCAmYmx1ZV9ZLAorICAgICAgICAgICAgICAgICAgICAgJmJsdWVfWikKKyAgICBwbmdfZ2V0X2NIUk1fZml4ZWQocG5nX3B0ciwgaW5mb19wdHIsICZpbnRfd2hpdGVfeCwKKyAgICAgICAgICAgICAgICAgICAgICZpbnRfd2hpdGVfeSwgJmludF9yZWRfeCwgJmludF9yZWRfeSwKKyAgICAgICAgICAgICAgICAgICAgICZpbnRfZ3JlZW5feCwgJmludF9ncmVlbl95LCAmaW50X2JsdWVfeCwKKyAgICAgICAgICAgICAgICAgICAgICZpbnRfYmx1ZV95KQorICAgIHBuZ19nZXRfY0hSTV9YWVpfZml4ZWQocG5nX3B0ciwgaW5mb19wdHIsICZpbnRfcmVkX1gsICZpbnRfcmVkX1ksCisgICAgICAgICAgICAgICAgICAgICAmaW50X3JlZF9aLCAmaW50X2dyZWVuX1gsICZpbnRfZ3JlZW5fWSwKKyAgICAgICAgICAgICAgICAgICAgICZpbnRfZ3JlZW5fWiwgJmludF9ibHVlX1gsICZpbnRfYmx1ZV9ZLAorICAgICAgICAgICAgICAgICAgICAgJmludF9ibHVlX1opCisKKyAgICB7d2hpdGUscmVkLGdyZWVuLGJsdWV9X3t4LHl9CisgICAgICAgICAgICAgICAgICAgICBBIGNvbG9yIHNwYWNlIGVuY29kaW5nIHNwZWNpZmllZCB1c2luZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgIGNocm9tYXRpY2l0aWVzIG9mIHRoZSBlbmQgcG9pbnRzIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgIHdoaXRlIHBvaW50LiAoUE5HX0lORk9fY0hSTSkKKworICAgIHtyZWQsZ3JlZW4sYmx1ZX1fe1gsWSxafQorICAgICAgICAgICAgICAgICAgICAgQSBjb2xvciBzcGFjZSBlbmNvZGluZyBzcGVjaWZpZWQgdXNpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyBlbmQgcG9pbnRzIC0gdGhlIENJRSB0cmlzdGltdWx1cworICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWNhdGlvbiBvZiB0aGUgaW50ZW5kZWQgY29sb3Igb2YgdGhlIHJlZCwKKyAgICAgICAgICAgICAgICAgICAgIGdyZWVuIGFuZCBibHVlIGNoYW5uZWxzIGluIHRoZSBQTkcgUkdCIGRhdGEuCisgICAgICAgICAgICAgICAgICAgICBUaGUgd2hpdGUgcG9pbnQgaXMgc2ltcGx5IHRoZSBzdW0gb2YgdGhlIHRocmVlCisgICAgICAgICAgICAgICAgICAgICBlbmQgcG9pbnRzLiAoUE5HX0lORk9fY0hSTSkKKworICAgIHBuZ19nZXRfc1JHQihwbmdfcHRyLCBpbmZvX3B0ciwgJnNyZ2JfaW50ZW50KTsKKworICAgIHNyZ2JfaW50ZW50IC0gICAgdGhlIHJlbmRlcmluZyBpbnRlbnQgKFBOR19JTkZPX3NSR0IpCisgICAgICAgICAgICAgICAgICAgICBUaGUgcHJlc2VuY2Ugb2YgdGhlIHNSR0IgY2h1bmsKKyAgICAgICAgICAgICAgICAgICAgIG1lYW5zIHRoYXQgdGhlIHBpeGVsIGRhdGEgaXMgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICBzUkdCIGNvbG9yIHNwYWNlLiAgVGhpcyBjaHVuayBhbHNvCisgICAgICAgICAgICAgICAgICAgICBpbXBsaWVzIHNwZWNpZmljIHZhbHVlcyBvZiBnQU1BIGFuZAorICAgICAgICAgICAgICAgICAgICAgY0hSTS4KKworICAgIHBuZ19nZXRfaUNDUChwbmdfcHRyLCBpbmZvX3B0ciwgJm5hbWUsCisgICAgICAgJmNvbXByZXNzaW9uX3R5cGUsICZwcm9maWxlLCAmcHJvZmxlbik7CisKKyAgICBuYW1lICAgICAgICAgICAgIC0gVGhlIHByb2ZpbGUgbmFtZS4KKworICAgIGNvbXByZXNzaW9uX3R5cGUgLSBUaGUgY29tcHJlc3Npb24gdHlwZTsgYWx3YXlzCisgICAgICAgICAgICAgICAgICAgICAgIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UgZm9yIFBORyAxLjAuCisgICAgICAgICAgICAgICAgICAgICAgIFlvdSBtYXkgZ2l2ZSBOVUxMIHRvIHRoaXMgYXJndW1lbnQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlIGl0LgorCisgICAgcHJvZmlsZSAgICAgICAgICAtIEludGVybmF0aW9uYWwgQ29sb3IgQ29uc29ydGl1bSBjb2xvcgorICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlIGRhdGEuIE1heSBjb250YWluIE5VTHMuCisKKyAgICBwcm9mbGVuICAgICAgICAgIC0gbGVuZ3RoIG9mIHByb2ZpbGUgZGF0YSBpbiBieXRlcy4KKworICAgIHBuZ19nZXRfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgJnNpZ19iaXQpOworCisgICAgc2lnX2JpdCAgICAgICAgLSB0aGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGJpdHMgZm9yCisgICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9fc0JJVCkgZWFjaCBvZiB0aGUgZ3JheSwKKyAgICAgICAgICAgICAgICAgICAgIHJlZCwgZ3JlZW4sIGFuZCBibHVlIGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgd2hpY2hldmVyIGFyZSBhcHByb3ByaWF0ZSBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICBnaXZlbiBjb2xvciB0eXBlIChwbmdfY29sb3JfMTYpCisKKyAgICBwbmdfZ2V0X3RSTlMocG5nX3B0ciwgaW5mb19wdHIsICZ0cmFuc19hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICZudW1fdHJhbnMsICZ0cmFuc19jb2xvcik7CisKKyAgICB0cmFuc19hbHBoYSAgICAtIGFycmF5IG9mIGFscGhhICh0cmFuc3BhcmVuY3kpCisgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzIGZvciBwYWxldHRlIChQTkdfSU5GT190Uk5TKQorCisgICAgbnVtX3RyYW5zICAgICAgLSBudW1iZXIgb2YgdHJhbnNwYXJlbnQgZW50cmllcworICAgICAgICAgICAgICAgICAgICAgKFBOR19JTkZPX3RSTlMpCisKKyAgICB0cmFuc19jb2xvciAgICAtIGdyYXlsZXZlbCBvciBjb2xvciBzYW1wbGUgdmFsdWVzIG9mCisgICAgICAgICAgICAgICAgICAgICB0aGUgc2luZ2xlIHRyYW5zcGFyZW50IGNvbG9yIGZvcgorICAgICAgICAgICAgICAgICAgICAgbm9uLXBhbGV0dGVkIGltYWdlcyAoUE5HX0lORk9fdFJOUykKKworICAgIHBuZ19nZXRfaElTVChwbmdfcHRyLCBpbmZvX3B0ciwgJmhpc3QpOworICAgICAgICAgICAgICAgICAgICAgKFBOR19JTkZPX2hJU1QpCisKKyAgICBoaXN0ICAgICAgICAgICAtIGhpc3RvZ3JhbSBvZiBwYWxldHRlIChhcnJheSBvZgorICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYpCisKKyAgICBwbmdfZ2V0X3RJTUUocG5nX3B0ciwgaW5mb19wdHIsICZtb2RfdGltZSk7CisKKyAgICBtb2RfdGltZSAgICAgICAtIHRpbWUgaW1hZ2Ugd2FzIGxhc3QgbW9kaWZpZWQKKyAgICAgICAgICAgICAgICAgICAgKFBOR19WQUxJRF90SU1FKQorCisgICAgcG5nX2dldF9iS0dEKHBuZ19wdHIsIGluZm9fcHRyLCAmYmFja2dyb3VuZCk7CisKKyAgICBiYWNrZ3JvdW5kICAgICAtIGJhY2tncm91bmQgY29sb3IgKG9mIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgIHBuZ19jb2xvcl8xNnApIChQTkdfVkFMSURfYktHRCkKKyAgICAgICAgICAgICAgICAgICAgIHZhbGlkIDE2LWJpdCByZWQsIGdyZWVuIGFuZCBibHVlCisgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsIHJlZ2FyZGxlc3Mgb2YgY29sb3JfdHlwZQorCisgICAgbnVtX2NvbW1lbnRzICAgPSBwbmdfZ2V0X3RleHQocG5nX3B0ciwgaW5mb19wdHIsCisgICAgICAgICAgICAgICAgICAgICAmdGV4dF9wdHIsICZudW1fdGV4dCk7CisKKyAgICBudW1fY29tbWVudHMgICAtIG51bWJlciBvZiBjb21tZW50cworCisgICAgdGV4dF9wdHIgICAgICAgLSBhcnJheSBvZiBwbmdfdGV4dCBob2xkaW5nIGltYWdlCisgICAgICAgICAgICAgICAgICAgICBjb21tZW50cworCisgICAgdGV4dF9wdHJbaV0uY29tcHJlc3Npb24gLSB0eXBlIG9mIGNvbXByZXNzaW9uIHVzZWQKKyAgICAgICAgICAgICAgICAgb24gInRleHQiIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19JVFhUX0NPTVBSRVNTSU9OX05PTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19JVFhUX0NPTVBSRVNTSU9OX3pUWHQKKworICAgIHRleHRfcHRyW2ldLmtleSAgIC0ga2V5d29yZCBmb3IgY29tbWVudC4gIE11c3QgY29udGFpbgorICAgICAgICAgICAgICAgICAgICAgICAgIDEtNzkgY2hhcmFjdGVycy4KKworICAgIHRleHRfcHRyW2ldLnRleHQgIC0gdGV4dCBjb21tZW50cyBmb3IgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQuICBDYW4gYmUgZW1wdHkuCisKKyAgICB0ZXh0X3B0cltpXS50ZXh0X2xlbmd0aCAtIGxlbmd0aCBvZiB0ZXh0IHN0cmluZywKKyAgICAgICAgICAgICAgICAgYWZ0ZXIgZGVjb21wcmVzc2lvbiwgMCBmb3IgaVRYdAorCisgICAgdGV4dF9wdHJbaV0uaXR4dF9sZW5ndGggLSBsZW5ndGggb2YgaXR4dCBzdHJpbmcsCisgICAgICAgICAgICAgICAgIGFmdGVyIGRlY29tcHJlc3Npb24sIDAgZm9yIHRFWHQvelRYdAorCisgICAgdGV4dF9wdHJbaV0ubGFuZyAgLSBsYW5ndWFnZSBvZiBjb21tZW50IChlbXB0eQorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmb3IgdW5rbm93bikuCisKKyAgICB0ZXh0X3B0cltpXS5sYW5nX2tleSAgLSBrZXl3b3JkIGluIFVURi04CisgICAgICAgICAgICAgICAgICAgICAgICAgKGVtcHR5IHN0cmluZyBmb3IgdW5rbm93bikuCisKKyAgICBOb3RlIHRoYXQgdGhlIGl0eHRfbGVuZ3RoLCBsYW5nLCBhbmQgbGFuZ19rZXkKKyAgICBtZW1iZXJzIG9mIHRoZSB0ZXh0X3B0ciBzdHJ1Y3R1cmUgb25seSBleGlzdCB3aGVuIHRoZQorICAgIGxpYnJhcnkgaXMgYnVpbHQgd2l0aCBpVFh0IGNodW5rIHN1cHBvcnQuICBQcmlvciB0bworICAgIGxpYnBuZy0xLjQuMCB0aGUgbGlicmFyeSB3YXMgYnVpbHQgYnkgZGVmYXVsdCB3aXRob3V0CisgICAgaVRYdCBzdXBwb3J0LiBBbHNvIG5vdGUgdGhhdCB3aGVuIGlUWHQgaXMgc3VwcG9ydGVkLAorICAgIHRoZXkgY29udGFpbiBOVUxMIHBvaW50ZXJzIHdoZW4gdGhlICJjb21wcmVzc2lvbiIKKyAgICBmaWVsZCBjb250YWlucyBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FIG9yCisgICAgUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdC4KKworICAgIG51bV90ZXh0ICAgICAgIC0gbnVtYmVyIG9mIGNvbW1lbnRzIChzYW1lIGFzCisgICAgICAgICAgICAgICAgICAgICBudW1fY29tbWVudHM7IHlvdSBjYW4gcHV0IE5VTEwgaGVyZQorICAgICAgICAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIGR1cGxpY2F0aW9uKQorCisgICAgTm90ZSB3aGlsZSBwbmdfc2V0X3RleHQoKSB3aWxsIGFjY2VwdCB0ZXh0LCBsYW5ndWFnZSwKKyAgICBhbmQgdHJhbnNsYXRlZCBrZXl3b3JkcyB0aGF0IGNhbiBiZSBOVUxMIHBvaW50ZXJzLCB0aGUKKyAgICBzdHJ1Y3R1cmUgcmV0dXJuZWQgYnkgcG5nX2dldF90ZXh0IHdpbGwgYWx3YXlzIGNvbnRhaW4KKyAgICByZWd1bGFyIHplcm8tdGVybWluYXRlZCBDIHN0cmluZ3MuICBUaGV5IG1pZ2h0IGJlCisgICAgZW1wdHkgc3RyaW5ncyBidXQgdGhleSB3aWxsIG5ldmVyIGJlIE5VTEwgcG9pbnRlcnMuCisKKyAgICBudW1fc3BhbGV0dGVzID0gcG5nX2dldF9zUExUKHBuZ19wdHIsIGluZm9fcHRyLAorICAgICAgICZwYWxldHRlX3B0cik7CisKKyAgICBudW1fc3BhbGV0dGVzICAtIG51bWJlciBvZiBzUExUIGNodW5rcyByZWFkLgorCisgICAgcGFsZXR0ZV9wdHIgICAgLSBhcnJheSBvZiBwYWxldHRlIHN0cnVjdHVyZXMgaG9sZGluZworICAgICAgICAgICAgICAgICAgICAgY29udGVudHMgb2Ygb25lIG9yIG1vcmUgc1BMVCBjaHVua3MKKyAgICAgICAgICAgICAgICAgICAgIHJlYWQuCisKKyAgICBwbmdfZ2V0X29GRnMocG5nX3B0ciwgaW5mb19wdHIsICZvZmZzZXRfeCwgJm9mZnNldF95LAorICAgICAgICZ1bml0X3R5cGUpOworCisgICAgb2Zmc2V0X3ggICAgICAgLSBwb3NpdGl2ZSBvZmZzZXQgZnJvbSB0aGUgbGVmdCBlZGdlCisgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgc2NyZWVuIChjYW4gYmUgbmVnYXRpdmUpCisKKyAgICBvZmZzZXRfeSAgICAgICAtIHBvc2l0aXZlIG9mZnNldCBmcm9tIHRoZSB0b3AgZWRnZQorICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHNjcmVlbiAoY2FuIGJlIG5lZ2F0aXZlKQorCisgICAgdW5pdF90eXBlICAgICAgLSBQTkdfT0ZGU0VUX1BJWEVMLCBQTkdfT0ZGU0VUX01JQ1JPTUVURVIKKworICAgIHBuZ19nZXRfcEhZcyhwbmdfcHRyLCBpbmZvX3B0ciwgJnJlc194LCAmcmVzX3ksCisgICAgICAgJnVuaXRfdHlwZSk7CisKKyAgICByZXNfeCAgICAgICAgICAtIHBpeGVscy91bml0IHBoeXNpY2FsIHJlc29sdXRpb24gaW4KKyAgICAgICAgICAgICAgICAgICAgIHggZGlyZWN0aW9uCisKKyAgICByZXNfeSAgICAgICAgICAtIHBpeGVscy91bml0IHBoeXNpY2FsIHJlc29sdXRpb24gaW4KKyAgICAgICAgICAgICAgICAgICAgIHggZGlyZWN0aW9uCisKKyAgICB1bml0X3R5cGUgICAgICAtIFBOR19SRVNPTFVUSU9OX1VOS05PV04sCisgICAgICAgICAgICAgICAgICAgICBQTkdfUkVTT0xVVElPTl9NRVRFUgorCisgICAgcG5nX2dldF9zQ0FMKHBuZ19wdHIsIGluZm9fcHRyLCAmdW5pdCwgJndpZHRoLAorICAgICAgICZoZWlnaHQpCisKKyAgICB1bml0ICAgICAgICAtIHBoeXNpY2FsIHNjYWxlIHVuaXRzIChhbiBpbnRlZ2VyKQorCisgICAgd2lkdGggICAgICAgLSB3aWR0aCBvZiBhIHBpeGVsIGluIHBoeXNpY2FsIHNjYWxlIHVuaXRzCisKKyAgICBoZWlnaHQgICAgICAtIGhlaWdodCBvZiBhIHBpeGVsIGluIHBoeXNpY2FsIHNjYWxlIHVuaXRzCisgICAgICAgICAgICAgICAgICh3aWR0aCBhbmQgaGVpZ2h0IGFyZSBkb3VibGVzKQorCisgICAgcG5nX2dldF9zQ0FMX3MocG5nX3B0ciwgaW5mb19wdHIsICZ1bml0LCAmd2lkdGgsCisgICAgICAgJmhlaWdodCkKKworICAgIHVuaXQgICAgICAgIC0gcGh5c2ljYWwgc2NhbGUgdW5pdHMgKGFuIGludGVnZXIpCisKKyAgICB3aWR0aCAgICAgICAtIHdpZHRoIG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKKyAgICAgICAgICAgICAgICAgIChleHByZXNzZWQgYXMgYSBzdHJpbmcpCisKKyAgICBoZWlnaHQgICAgICAtIGhlaWdodCBvZiBhIHBpeGVsIGluIHBoeXNpY2FsIHNjYWxlIHVuaXRzCisgICAgICAgICAgICAgICAgICh3aWR0aCBhbmQgaGVpZ2h0IGFyZSBzdHJpbmdzIGxpa2UgIjIuNTQiKQorCisgICAgbnVtX3Vua25vd25fY2h1bmtzID0gcG5nX2dldF91bmtub3duX2NodW5rcyhwbmdfcHRyLAorICAgICAgIGluZm9fcHRyLCAmdW5rbm93bnMpCisKKyAgICB1bmtub3ducyAgICAgICAgICAtIGFycmF5IG9mIHBuZ191bmtub3duX2NodW5rCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVzIGhvbGRpbmcgdW5rbm93biBjaHVua3MKKworICAgIHVua25vd25zW2ldLm5hbWUgIC0gbmFtZSBvZiB1bmtub3duIGNodW5rCisKKyAgICB1bmtub3duc1tpXS5kYXRhICAtIGRhdGEgb2YgdW5rbm93biBjaHVuaworCisgICAgdW5rbm93bnNbaV0uc2l6ZSAgLSBzaXplIG9mIHVua25vd24gY2h1bmsncyBkYXRhCisKKyAgICB1bmtub3duc1tpXS5sb2NhdGlvbiAtIHBvc2l0aW9uIG9mIGNodW5rIGluIGZpbGUKKworICAgIFRoZSB2YWx1ZSBvZiAiaSIgY29ycmVzcG9uZHMgdG8gdGhlIG9yZGVyIGluIHdoaWNoIHRoZQorICAgIGNodW5rcyB3ZXJlIHJlYWQgZnJvbSB0aGUgUE5HIGZpbGUgb3IgaW5zZXJ0ZWQgd2l0aCB0aGUKKyAgICBwbmdfc2V0X3Vua25vd25fY2h1bmtzKCkgZnVuY3Rpb24uCisKKyAgICBUaGUgdmFsdWUgb2YgImxvY2F0aW9uIiBpcyBhIGJpdHdpc2UgIm9yIiBvZgorCisgICAgICAgICBQTkdfSEFWRV9JSERSICAoMHgwMSkKKyAgICAgICAgIFBOR19IQVZFX1BMVEUgICgweDAyKQorICAgICAgICAgUE5HX0FGVEVSX0lEQVQgKDB4MDgpCisKK1RoZSBkYXRhIGZyb20gdGhlIHBIWXMgY2h1bmsgY2FuIGJlIHJldHJpZXZlZCBpbiBzZXZlcmFsIGNvbnZlbmllbnQKK2Zvcm1zOgorCisgICAgcmVzX3ggPSBwbmdfZ2V0X3hfcGl4ZWxzX3Blcl9tZXRlcihwbmdfcHRyLAorICAgICAgIGluZm9fcHRyKQorCisgICAgcmVzX3kgPSBwbmdfZ2V0X3lfcGl4ZWxzX3Blcl9tZXRlcihwbmdfcHRyLAorICAgICAgIGluZm9fcHRyKQorCisgICAgcmVzX3hfYW5kX3kgPSBwbmdfZ2V0X3BpeGVsc19wZXJfbWV0ZXIocG5nX3B0ciwKKyAgICAgICBpbmZvX3B0cikKKworICAgIHJlc194ID0gcG5nX2dldF94X3BpeGVsc19wZXJfaW5jaChwbmdfcHRyLAorICAgICAgIGluZm9fcHRyKQorCisgICAgcmVzX3kgPSBwbmdfZ2V0X3lfcGl4ZWxzX3Blcl9pbmNoKHBuZ19wdHIsCisgICAgICAgaW5mb19wdHIpCisKKyAgICByZXNfeF9hbmRfeSA9IHBuZ19nZXRfcGl4ZWxzX3Blcl9pbmNoKHBuZ19wdHIsCisgICAgICAgaW5mb19wdHIpCisKKyAgICBhc3BlY3RfcmF0aW8gPSBwbmdfZ2V0X3BpeGVsX2FzcGVjdF9yYXRpbyhwbmdfcHRyLAorICAgICAgIGluZm9fcHRyKQorCisgICAgRWFjaCBvZiB0aGVzZSByZXR1cm5zIDAgW3NpZ25pZnlpbmcgInVua25vd24iXSBpZgorICAgICAgIHRoZSBkYXRhIGlzIG5vdCBwcmVzZW50IG9yIGlmIHJlc194IGlzIDA7CisgICAgICAgcmVzX3hfYW5kX3kgaXMgMCBpZiByZXNfeCAhPSByZXNfeQorCisgICAgTm90ZSB0aGF0IGJlY2F1c2Ugb2YgdGhlIHdheSB0aGUgcmVzb2x1dGlvbnMgYXJlCisgICAgICAgc3RvcmVkIGludGVybmFsbHksIHRoZSBpbmNoIGNvbnZlcnNpb25zIHdvbid0CisgICAgICAgY29tZSBvdXQgdG8gZXhhY3RseSBldmVuIG51bWJlci4gIEZvciBleGFtcGxlLAorICAgICAgIDcyIGRwaSBpcyBzdG9yZWQgYXMgMC4yODM0NiBwaXhlbHMvbWV0ZXIsIGFuZAorICAgICAgIHdoZW4gdGhpcyBpcyByZXRyaWV2ZWQgaXQgaXMgNzEuOTk4OCBkcGksIHNvCisgICAgICAgYmUgc3VyZSB0byByb3VuZCB0aGUgcmV0dXJuZWQgdmFsdWUgYXBwcm9wcmlhdGVseQorICAgICAgIGlmIHlvdSB3YW50IHRvIGRpc3BsYXkgYSByZWFzb25hYmxlLWxvb2tpbmcgcmVzdWx0LgorCitUaGUgZGF0YSBmcm9tIHRoZSBvRkZzIGNodW5rIGNhbiBiZSByZXRyaWV2ZWQgaW4gc2V2ZXJhbCBjb252ZW5pZW50Citmb3JtczoKKworICAgIHhfb2Zmc2V0ID0gcG5nX2dldF94X29mZnNldF9taWNyb25zKHBuZ19wdHIsIGluZm9fcHRyKTsKKworICAgIHlfb2Zmc2V0ID0gcG5nX2dldF95X29mZnNldF9taWNyb25zKHBuZ19wdHIsIGluZm9fcHRyKTsKKworICAgIHhfb2Zmc2V0ID0gcG5nX2dldF94X29mZnNldF9pbmNoZXMocG5nX3B0ciwgaW5mb19wdHIpOworCisgICAgeV9vZmZzZXQgPSBwbmdfZ2V0X3lfb2Zmc2V0X2luY2hlcyhwbmdfcHRyLCBpbmZvX3B0cik7CisKKyAgICBFYWNoIG9mIHRoZXNlIHJldHVybnMgMCBbc2lnbmlmeWluZyAidW5rbm93biIgaWYgYm90aAorICAgICAgIHggYW5kIHkgYXJlIDBdIGlmIHRoZSBkYXRhIGlzIG5vdCBwcmVzZW50IG9yIGlmIHRoZQorICAgICAgIGNodW5rIGlzIHByZXNlbnQgYnV0IHRoZSB1bml0IGlzIHRoZSBwaXhlbC4gIFRoZQorICAgICAgIHJlbWFyayBhYm91dCBpbmV4YWN0IGluY2ggY29udmVyc2lvbnMgYXBwbGllcyBoZXJlCisgICAgICAgYXMgd2VsbCwgYmVjYXVzZSBhIHZhbHVlIGluIGluY2hlcyBjYW4ndCBhbHdheXMgYmUKKyAgICAgICBjb252ZXJ0ZWQgdG8gbWljcm9ucyBhbmQgYmFjayB3aXRob3V0IHNvbWUgbG9zcworICAgICAgIG9mIHByZWNpc2lvbi4KKworRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUKK1BORyBzcGVjaWZpY2F0aW9uIGZvciBjaHVuayBjb250ZW50cy4gIEJlIGNhcmVmdWwgd2l0aCB0cnVzdGluZworcm93Ynl0ZXMsIGFzIHNvbWUgb2YgdGhlIHRyYW5zZm9ybWF0aW9ucyBjb3VsZCBpbmNyZWFzZSB0aGUgc3BhY2UKK25lZWRlZCB0byBob2xkIGEgcm93IChleHBhbmQsIGZpbGxlciwgZ3JheV90b19yZ2IsIGV0Yy4pLgorU2VlIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCksIGJlbG93LgorCitBIHF1aWNrIHdvcmQgYWJvdXQgdGV4dF9wdHIgYW5kIG51bV90ZXh0LiAgUE5HIHN0b3JlcyBjb21tZW50cyBpbgora2V5d29yZC90ZXh0IHBhaXJzLCBvbmUgcGFpciBwZXIgY2h1bmssIHdpdGggbm8gbGltaXQgb24gdGhlIG51bWJlcgorb2YgdGV4dCBjaHVua3MsIGFuZCBhIDJeMzEgYnl0ZSBsaW1pdCBvbiB0aGVpciBzaXplLiAgV2hpbGUgdGhlcmUgYXJlCitzdWdnZXN0ZWQga2V5d29yZHMsIHRoZXJlIGlzIG5vIHJlcXVpcmVtZW50IHRvIHJlc3RyaWN0IHRoZSB1c2UgdG8gdGhlc2UKK3N0cmluZ3MuICBJdCBpcyBzdHJvbmdseSBzdWdnZXN0ZWQgdGhhdCBrZXl3b3JkcyBhbmQgdGV4dCBiZSBzZW5zaWJsZQordG8gaHVtYW5zICh0aGF0J3MgdGhlIHBvaW50KSwgc28gZG9uJ3QgdXNlIGFiYnJldmlhdGlvbnMuICBOb24tcHJpbnRpbmcKK3N5bWJvbHMgYXJlIG5vdCBhbGxvd2VkLiAgU2VlIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgorVGhlcmUgaXMgYWxzbyBubyByZXF1aXJlbWVudCB0byBoYXZlIHRleHQgYWZ0ZXIgdGhlIGtleXdvcmQuCisKK0tleXdvcmRzIHNob3VsZCBiZSBsaW1pdGVkIHRvIDc5IExhdGluLTEgY2hhcmFjdGVycyB3aXRob3V0IGxlYWRpbmcgb3IKK3RyYWlsaW5nIHNwYWNlcywgYnV0IG5vbi1jb25zZWN1dGl2ZSBzcGFjZXMgYXJlIGFsbG93ZWQgd2l0aGluIHRoZQora2V5d29yZC4gIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgdGhlIHNhbWUga2V5d29yZCBhbnkgbnVtYmVyIG9mIHRpbWVzLgorVGhlIHRleHRfcHRyIGlzIGFuIGFycmF5IG9mIHBuZ190ZXh0IHN0cnVjdHVyZXMsIGVhY2ggaG9sZGluZyBhCitwb2ludGVyIHRvIGEgbGFuZ3VhZ2Ugc3RyaW5nLCBhIHBvaW50ZXIgdG8gYSBrZXl3b3JkIGFuZCBhIHBvaW50ZXIgdG8KK2EgdGV4dCBzdHJpbmcuICBUaGUgdGV4dCBzdHJpbmcsIGxhbmd1YWdlIGNvZGUsIGFuZCB0cmFuc2xhdGVkCitrZXl3b3JkIG1heSBiZSBlbXB0eSBvciBOVUxMIHBvaW50ZXJzLiAgVGhlIGtleXdvcmQvdGV4dAorcGFpcnMgYXJlIHB1dCBpbnRvIHRoZSBhcnJheSBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IGFyZSByZWNlaXZlZC4KK0hvd2V2ZXIsIHNvbWUgb3IgYWxsIG9mIHRoZSB0ZXh0IGNodW5rcyBtYXkgYmUgYWZ0ZXIgdGhlIGltYWdlLCBzbywgdG8KK21ha2Ugc3VyZSB5b3UgaGF2ZSByZWFkIGFsbCB0aGUgdGV4dCBjaHVua3MsIGRvbid0IG1lc3Mgd2l0aCB0aGVzZQordW50aWwgYWZ0ZXIgeW91IHJlYWQgdGhlIHN0dWZmIGFmdGVyIHRoZSBpbWFnZS4gIFRoaXMgd2lsbCBiZQorbWVudGlvbmVkIGFnYWluIGJlbG93IGluIHRoZSBkaXNjdXNzaW9uIHRoYXQgZ29lcyB3aXRoIHBuZ19yZWFkX2VuZCgpLgorCitJbnB1dCB0cmFuc2Zvcm1hdGlvbnMKKworQWZ0ZXIgeW91J3ZlIHJlYWQgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiwgeW91IGNhbiBzZXQgdXAgdGhlIGxpYnJhcnkKK3RvIGhhbmRsZSBhbnkgc3BlY2lhbCB0cmFuc2Zvcm1hdGlvbnMgb2YgdGhlIGltYWdlIGRhdGEuICBUaGUgdmFyaW91cword2F5cyB0byB0cmFuc2Zvcm0gdGhlIGRhdGEgd2lsbCBiZSBkZXNjcmliZWQgaW4gdGhlIG9yZGVyIHRoYXQgdGhleQorc2hvdWxkIG9jY3VyLiAgVGhpcyBpcyBpbXBvcnRhbnQsIGFzIHNvbWUgb2YgdGhlc2UgY2hhbmdlIHRoZSBjb2xvcgordHlwZSBhbmQvb3IgYml0IGRlcHRoIG9mIHRoZSBkYXRhLCBhbmQgc29tZSBvdGhlcnMgb25seSB3b3JrIG9uCitjZXJ0YWluIGNvbG9yIHR5cGVzIGFuZCBiaXQgZGVwdGhzLgorCitUcmFuc2Zvcm1hdGlvbnMgeW91IHJlcXVlc3QgYXJlIGlnbm9yZWQgaWYgdGhleSBkb24ndCBoYXZlIGFueSBtZWFuaW5nIGZvciBhCitwYXJ0aWN1bGFyIGlucHV0IGRhdGEgZm9ybWF0LiAgSG93ZXZlciBzb21lIHRyYW5zZm9ybWF0aW9ucyBjYW4gaGF2ZSBhbiBlZmZlY3QKK2FzIGEgcmVzdWx0IG9mIGEgcHJldmlvdXMgdHJhbnNmb3JtYXRpb24uICBJZiB5b3Ugc3BlY2lmeSBhIGNvbnRyYWRpY3Rvcnkgc2V0IG9mCit0cmFuc2Zvcm1hdGlvbnMsIGZvciBleGFtcGxlIGJvdGggYWRkaW5nIGFuZCByZW1vdmluZyB0aGUgYWxwaGEgY2hhbm5lbCwgeW91CitjYW5ub3QgcHJlZGljdCB0aGUgZmluYWwgcmVzdWx0LgorCitUaGUgY29sb3IgdXNlZCBmb3IgdGhlIHRyYW5zcGFyZW5jeSB2YWx1ZXMgc2hvdWxkIGJlIHN1cHBsaWVkIGluIHRoZSBzYW1lCitmb3JtYXQvZGVwdGggYXMgdGhlIGN1cnJlbnQgaW1hZ2UgZGF0YS4gIEl0IGlzIHN0b3JlZCBpbiB0aGUgc2FtZSBmb3JtYXQvZGVwdGgKK2FzIHRoZSBpbWFnZSBkYXRhIGluIGEgdFJOUyBjaHVuaywgc28gdGhpcyBpcyB3aGF0IGxpYnBuZyBleHBlY3RzIGZvciB0aGlzIGRhdGEuCisKK1RoZSBjb2xvciB1c2VkIGZvciB0aGUgYmFja2dyb3VuZCB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBuZWVkX2V4cGFuZCBhcmd1bWVudCBhcworZGVzY3JpYmVkIGJlbG93LgorCitEYXRhIHdpbGwgYmUgZGVjb2RlZCBpbnRvIHRoZSBzdXBwbGllZCByb3cgYnVmZmVycyBwYWNrZWQgaW50byBieXRlcwordW5sZXNzIHRoZSBsaWJyYXJ5IGhhcyBiZWVuIHRvbGQgdG8gdHJhbnNmb3JtIGl0IGludG8gYW5vdGhlciBmb3JtYXQuCitGb3IgZXhhbXBsZSwgNCBiaXQvcGl4ZWwgcGFsZXR0ZWQgb3IgZ3JheXNjYWxlIGRhdGEgd2lsbCBiZSByZXR1cm5lZAorMiBwaXhlbHMvYnl0ZSB3aXRoIHRoZSBsZWZ0bW9zdCBwaXhlbCBpbiB0aGUgaGlnaC1vcmRlciBiaXRzIG9mIHRoZSBieXRlLAordW5sZXNzIHBuZ19zZXRfcGFja2luZygpIGlzIGNhbGxlZC4gIDgtYml0IFJHQiBkYXRhIHdpbGwgYmUgc3RvcmVkCitpbiBSR0IgUkdCIFJHQiBmb3JtYXQgdW5sZXNzIHBuZ19zZXRfZmlsbGVyKCkgb3IgcG5nX3NldF9hZGRfYWxwaGEoKQoraXMgY2FsbGVkIHRvIGluc2VydCBmaWxsZXIgYnl0ZXMsIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgZWFjaCBSR0IgdHJpcGxldC4KKworMTYtYml0IFJHQiBkYXRhIHdpbGwgYmUgcmV0dXJuZWQgUlJHR0JCIFJSR0dCQiwgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudAorYnl0ZSBvZiB0aGUgY29sb3IgdmFsdWUgZmlyc3QsIHVubGVzcyBwbmdfc2V0X3NjYWxlXzE2KCkgaXMgY2FsbGVkIHRvCit0cmFuc2Zvcm0gaXQgdG8gcmVndWxhciBSR0IgUkdCIHRyaXBsZXRzLCBvciBwbmdfc2V0X2ZpbGxlcigpIG9yCitwbmdfc2V0X2FkZCBhbHBoYSgpIGlzIGNhbGxlZCB0byBpbnNlcnQgdHdvIGZpbGxlciBieXRlcywgZWl0aGVyIGJlZm9yZQorb3IgYWZ0ZXIgZWFjaCBSUkdHQkIgdHJpcGxldC4gIFNpbWlsYXJseSwgOC1iaXQgb3IgMTYtYml0IGdyYXlzY2FsZSBkYXRhIGNhbgorYmUgbW9kaWZpZWQgd2l0aCBwbmdfc2V0X2ZpbGxlcigpLCBwbmdfc2V0X2FkZF9hbHBoYSgpLCBwbmdfc2V0X3N0cmlwXzE2KCksCitvciBwbmdfc2V0X3NjYWxlXzE2KCkuCisKK1RoZSBmb2xsb3dpbmcgY29kZSB0cmFuc2Zvcm1zIGdyYXlzY2FsZSBpbWFnZXMgb2YgbGVzcyB0aGFuIDggdG8gOCBiaXRzLAorY2hhbmdlcyBwYWxldHRlZCBpbWFnZXMgdG8gUkdCLCBhbmQgYWRkcyBhIGZ1bGwgYWxwaGEgY2hhbm5lbCBpZiB0aGVyZSBpcwordHJhbnNwYXJlbmN5IGluZm9ybWF0aW9uIGluIGEgdFJOUyBjaHVuay4gIFRoaXMgaXMgbW9zdCB1c2VmdWwgb24KK2dyYXlzY2FsZSBpbWFnZXMgd2l0aCBiaXQgZGVwdGhzIG9mIDIgb3IgNCBvciBpZiB0aGVyZSBpcyBhIG11bHRpcGxlLWltYWdlCit2aWV3aW5nIGFwcGxpY2F0aW9uIHRoYXQgd2lzaGVzIHRvIHRyZWF0IGFsbCBpbWFnZXMgaW4gdGhlIHNhbWUgd2F5LgorCisgICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgICAgICAgcG5nX3NldF9wYWxldHRlX3RvX3JnYihwbmdfcHRyKTsKKworICAgIGlmIChwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLAorICAgICAgICBQTkdfSU5GT190Uk5TKSkgcG5nX3NldF90Uk5TX3RvX2FscGhhKHBuZ19wdHIpOworCisgICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSAmJgorICAgICAgICBiaXRfZGVwdGggPCA4KSBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgocG5nX3B0cik7CisKK1RoZSBmaXJzdCB0d28gZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBhbGlhc2VzIGZvciBwbmdfc2V0X2V4cGFuZCgpLCBhZGRlZAoraW4gbGlicG5nIHZlcnNpb24gMS4wLjQsIHdpdGggdGhlIGZ1bmN0aW9uIG5hbWVzIGV4cGFuZGVkIHRvIGltcHJvdmUgY29kZQorcmVhZGFiaWxpdHkuICBJbiBzb21lIGZ1dHVyZSB2ZXJzaW9uIHRoZXkgbWF5IGFjdHVhbGx5IGRvIGRpZmZlcmVudAordGhpbmdzLgorCitBcyBvZiBsaWJwbmcgdmVyc2lvbiAxLjIuOSwgcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KCkgd2FzCithZGRlZC4gIEl0IGV4cGFuZHMgdGhlIHNhbXBsZSBkZXB0aCB3aXRob3V0IGNoYW5naW5nIHRSTlMgdG8gYWxwaGEuCisKK0FzIG9mIGxpYnBuZyB2ZXJzaW9uIDEuNS4yLCBwbmdfc2V0X2V4cGFuZF8xNigpIHdhcyBhZGRlZC4gIEl0IGJlaGF2ZXMgYXMKK3BuZ19zZXRfZXhwYW5kKCk7IGhvd2V2ZXIsIHRoZSByZXN1bHRhbnQgY2hhbm5lbHMgaGF2ZSAxNiBiaXRzIHJhdGhlciB0aGFuIDguCitVc2UgdGhpcyB3aGVuIHRoZSBvdXRwdXQgY29sb3Igb3IgZ3JheSBjaGFubmVscyBhcmUgbWFkZSBsaW5lYXIgdG8gYXZvaWQgZmFpcmx5CitzZXZlcmUgYWNjdXJhY3kgbG9zcy4KKworICAgaWYgKGJpdF9kZXB0aCA8IDE2KQorICAgICAgcG5nX3NldF9leHBhbmRfMTYocG5nX3B0cik7CisKK1BORyBjYW4gaGF2ZSBmaWxlcyB3aXRoIDE2IGJpdHMgcGVyIGNoYW5uZWwuICBJZiB5b3Ugb25seSBjYW4gaGFuZGxlCis4IGJpdHMgcGVyIGNoYW5uZWwsIHRoaXMgd2lsbCBzdHJpcCB0aGUgcGl4ZWxzIGRvd24gdG8gOC1iaXQuCisKKyAgICBpZiAoYml0X2RlcHRoID09IDE2KQorI2lmIFBOR19MSUJQTkdfVkVSID49IDEwNTA0CisgICAgICAgcG5nX3NldF9zY2FsZV8xNihwbmdfcHRyKTsKKyNlbHNlCisgICAgICAgcG5nX3NldF9zdHJpcF8xNihwbmdfcHRyKTsKKyNlbmRpZgorCisoVGhlIG1vcmUgYWNjdXJhdGUgInBuZ19zZXRfc2NhbGVfMTYoKSIgQVBJIGJlY2FtZSBhdmFpbGFibGUgaW4gbGlicG5nIHZlcnNpb24KKzEuNS40KS4KKworSWYgeW91IG5lZWQgdG8gcHJvY2VzcyB0aGUgYWxwaGEgY2hhbm5lbCBvbiB0aGUgaW1hZ2Ugc2VwYXJhdGVseSBmcm9tIHRoZSBpbWFnZQorZGF0YSAoZm9yIGV4YW1wbGUgaWYgeW91IGNvbnZlcnQgaXQgdG8gYSBiaXRtYXAgbWFzaykgaXQgaXMgcG9zc2libGUgdG8gaGF2ZQorbGlicG5nIHN0cmlwIHRoZSBjaGFubmVsIGxlYXZpbmcganVzdCBSR0Igb3IgZ3JheSBkYXRhOgorCisgICAgaWYgKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkKKyAgICAgICBwbmdfc2V0X3N0cmlwX2FscGhhKHBuZ19wdHIpOworCitJZiB5b3Ugc3RyaXAgdGhlIGFscGhhIGNoYW5uZWwgeW91IG5lZWQgdG8gZmluZCBzb21lIG90aGVyIHdheSBvZiBkZWFsaW5nIHdpdGgKK3RoZSBpbmZvcm1hdGlvbi4gIElmLCBpbnN0ZWFkLCB5b3Ugd2FudCB0byBjb252ZXJ0IHRoZSBpbWFnZSB0byBhbiBvcGFxdWUKK3ZlcnNpb24gd2l0aCBubyBhbHBoYSBjaGFubmVsIHVzZSBwbmdfc2V0X2JhY2tncm91bmQ7IHNlZSBiZWxvdy4KKworQXMgb2YgbGlicG5nIHZlcnNpb24gMS41LjIsIGFsbW9zdCBhbGwgdXNlZnVsIGV4cGFuc2lvbnMgYXJlIHN1cHBvcnRlZCwgdGhlCittYWpvciBvbW1pc3Npb25zIGFyZSBjb252ZXJzaW9uIG9mIGdyYXlzY2FsZSB0byBpbmRleGVkIGltYWdlcyAod2hpY2ggY2FuIGJlCitkb25lIHRyaXZpYWxseSBpbiB0aGUgYXBwbGljYXRpb24pIGFuZCBjb252ZXJzaW9uIG9mIGluZGV4ZWQgdG8gZ3JheXNjYWxlICh3aGljaAorY2FuIGJlIGRvbmUgYnkgYSB0cml2aWFsIG1hbmlwdWxhdGlvbiBvZiB0aGUgcGFsZXR0ZS4pCisKK0luIHRoZSBmb2xsb3dpbmcgdGFibGUsIHRoZSAwMSBtZWFucyBncmF5c2NhbGUgd2l0aCBkZXB0aDw4LCAzMSBtZWFucworaW5kZXhlZCB3aXRoIGRlcHRoPDgsIG90aGVyIG51bWVyYWxzIHJlcHJlc2VudCB0aGUgY29sb3IgdHlwZSwgIlQiIG1lYW5zCit0aGUgdFJOUyBjaHVuayBpcyBwcmVzZW50LCBBIG1lYW5zIGFuIGFscGhhIGNoYW5uZWwgaXMgcHJlc2VudCwgYW5kIE8KK21lYW5zIHRSTlMgb3IgYWxwaGEgaXMgcHJlc2VudCBidXQgYWxsIHBpeGVscyBpbiB0aGUgaW1hZ2UgYXJlIG9wYXF1ZS4KKworICBGUk9NICAwMSAgMzEgICAwICAwVCAgME8gICAyICAyVCAgMk8gICAzICAzVCAgM08gIDRBICA0TyAgNkEgIDZPCisgICBUTworICAgMDEgICAgLSAgW0ddICAtICAgLSAgIC0gICAtICAgLSAgIC0gICAtICAgLSAgIC0gICAtICAgLSAgIC0gICAtCisgICAzMSAgIFtRXSAgUSAgW1FdIFtRXSBbUV0gIFEgICBRICAgUSAgIFEgICBRICAgUSAgW1FdIFtRXSAgUSAgIFEKKyAgICAwICAgIDEgICBHICAgKyAgIC4gICAuICAgRyAgIEcgICBHICAgRyAgIEcgICBHICAgQiAgIEIgIEdCICBHQgorICAgMFQgICAgbHQgIEd0ICB0ICAgKyAgIC4gICBHdCAgRyAgIEcgICBHdCAgRyAgIEcgICBCdCAgQnQgR0J0IEdCdAorICAgME8gICAgbHQgIEd0ICB0ICAgLiAgICsgICBHdCAgR3QgIEcgICBHdCAgR3QgIEcgICBCdCAgQnQgR0J0IEdCdAorICAgIDIgICAgQyAgIFAgICBDICAgQyAgIEMgICArICAgLiAgIC4gICBDICAgLSAgIC0gIENCICBDQiAgIEIgICBCCisgICAyVCAgICBDdCAgLSAgIEN0ICBDICAgQyAgIHQgICArICAgdCAgIC0gICAtICAgLSAgQ0J0IENCdCAgQnQgIEJ0CisgICAyTyAgICBDdCAgLSAgIEN0ICBDICAgQyAgIHQgICB0ICAgKyAgIC0gICAtICAgLSAgQ0J0IENCdCAgQnQgIEJ0CisgICAgMyAgIFtRXSAgcCAgW1FdIFtRXSBbUV0gIFEgICBRICAgUSAgICsgICAuICAgLiAgW1FdIFtRXSAgUSAgIFEKKyAgIDNUICAgW1F0XSBwICBbUXRdW1FdIFtRXSAgUXQgIFF0ICBRdCAgdCAgICsgICB0ICBbUXRdW1F0XSBRdCAgUXQKKyAgIDNPICAgW1F0XSBwICBbUXRdW1FdIFtRXSAgUXQgIFF0ICBRdCAgdCAgIHQgICArICBbUXRdW1F0XSBRdCAgUXQKKyAgIDRBICAgIGxBICBHICAgQSAgIFQgICBUICAgR0EgIEdUICBHVCAgR0EgIEdUICBHVCAgKyAgIEJBICBHICBHQkEKKyAgIDRPICAgIGxBIEdCQSAgQSAgIFQgICBUICAgR0EgIEdUICBHVCAgR0EgIEdUICBHVCAgQkEgICsgIEdCQSAgRworICAgNkEgICAgQ0EgIFBBICBDQSAgQyAgIEMgICBBICAgVCAgdFQgICBQQSAgUCAgIFAgICBDICBDQkEgICsgICBCQQorICAgNk8gICAgQ0EgUEJBICBDQSAgQyAgIEMgICBBICB0VCAgIFQgICBQQSAgUCAgIFAgIENCQSAgQyAgIEJBICArCisKK1dpdGhpbiB0aGUgbWF0cml4LAorICAgICAiKyIgaWRlbnRpZmllcyBlbnRyaWVzIHdoZXJlICdmcm9tJyBhbmQgJ3RvJyBhcmUgdGhlIHNhbWUuCisgICAgICItIiBtZWFucyB0aGUgdHJhbnNmb3JtYXRpb24gaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgIi4iIG1lYW5zIG5vdGhpbmcgaXMgbmVjZXNzYXJ5IChhIHRSTlMgY2h1bmsgY2FuIGp1c3QgYmUgaWdub3JlZCkuCisgICAgICJ0IiBtZWFucyB0aGUgdHJhbnNmb3JtYXRpb24gaXMgb2J0YWluZWQgYnkgcG5nX3NldF90Uk5TLgorICAgICAiQSIgbWVhbnMgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIG9idGFpbmVkIGJ5IHBuZ19zZXRfYWRkX2FscGhhKCkuCisgICAgICJYIiBtZWFucyB0aGUgdHJhbnNmb3JtYXRpb24gaXMgb2J0YWluZWQgYnkgcG5nX3NldF9leHBhbmQoKS4KKyAgICAgIjEiIG1lYW5zIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBvYnRhaW5lZCBieQorICAgICAgICAgcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KCkgKGFuZCBieSBwbmdfc2V0X2V4cGFuZCgpCisgICAgICAgICBpZiB0aGVyZSBpcyBubyB0cmFuc3BhcmVuY3kgaW4gdGhlIG9yaWdpbmFsIG9yIHRoZSBmaW5hbAorICAgICAgICAgZm9ybWF0KS4KKyAgICAgIkMiIG1lYW5zIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBvYnRhaW5lZCBieSBwbmdfc2V0X2dyYXlfdG9fcmdiKCkuCisgICAgICJHIiBtZWFucyB0aGUgdHJhbnNmb3JtYXRpb24gaXMgb2J0YWluZWQgYnkgcG5nX3NldF9yZ2JfdG9fZ3JheSgpLgorICAgICAiUCIgbWVhbnMgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIG9idGFpbmVkIGJ5CisgICAgICAgICBwbmdfc2V0X2V4cGFuZF9wYWxldHRlX3RvX3JnYigpLgorICAgICAicCIgbWVhbnMgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIG9idGFpbmVkIGJ5IHBuZ19zZXRfcGFja2luZygpLgorICAgICAiUSIgbWVhbnMgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIG9idGFpbmVkIGJ5IHBuZ19zZXRfcXVhbnRpemUoKS4KKyAgICAgIlQiIG1lYW5zIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBvYnRhaW5lZCBieQorICAgICAgICAgcG5nX3NldF90Uk5TX3RvX2FscGhhKCkuCisgICAgICJCIiBtZWFucyB0aGUgdHJhbnNmb3JtYXRpb24gaXMgb2J0YWluZWQgYnkKKyAgICAgICAgIHBuZ19zZXRfYmFja2dyb3VuZCgpLCBvciBwbmdfc3RyaXBfYWxwaGEoKS4KKworV2hlbiBhbiBlbnRyeSBoYXMgbXVsdGlwbGUgdHJhbnNmb3JtcyBsaXN0ZWQgYWxsIGFyZSByZXF1aXJlZCB0byBjYXVzZSB0aGUKK3JpZ2h0IG92ZXJhbGwgdHJhbnNmb3JtYXRpb24uICBXaGVuIHR3byB0cmFuc2Zvcm1zIGFyZSBzZXBhcmF0ZWQgYnkgYSBjb21tYQorZWl0aGVyIHdpbGwgZG8gdGhlIGpvYi4gIFdoZW4gdHJhbnNmb3JtcyBhcmUgZW5jbG9zZWQgaW4gW10gdGhlIHRyYW5zZm9ybSBzaG91bGQKK2RvIHRoZSBqb2IgYnV0IHRoaXMgaXMgY3VycmVudGx5IHVuaW1wbGVtZW50ZWQgLSBhIGRpZmZlcmVudCBmb3JtYXQgd2lsbCByZXN1bHQKK2lmIHRoZSBzdWdnZXN0ZWQgdHJhbnNmb3JtYXRpb25zIGFyZSB1c2VkLgorCitJbiBQTkcgZmlsZXMsIHRoZSBhbHBoYSBjaGFubmVsIGluIGFuIGltYWdlCitpcyB0aGUgbGV2ZWwgb2Ygb3BhY2l0eS4gIElmIHlvdSBuZWVkIHRoZSBhbHBoYSBjaGFubmVsIGluIGFuIGltYWdlIHRvCitiZSB0aGUgbGV2ZWwgb2YgdHJhbnNwYXJlbmN5IGluc3RlYWQgb2Ygb3BhY2l0eSwgeW91IGNhbiBpbnZlcnQgdGhlCithbHBoYSBjaGFubmVsIChvciB0aGUgdFJOUyBjaHVuayBkYXRhKSBhZnRlciBpdCdzIHJlYWQsIHNvIHRoYXQgMCBpcworZnVsbHkgb3BhcXVlIGFuZCAyNTUgKGluIDgtYml0IG9yIHBhbGV0dGVkIGltYWdlcykgb3IgNjU1MzUgKGluIDE2LWJpdAoraW1hZ2VzKSBpcyBmdWxseSB0cmFuc3BhcmVudCwgd2l0aAorCisgICAgcG5nX3NldF9pbnZlcnRfYWxwaGEocG5nX3B0cik7CisKK1BORyBmaWxlcyBwYWNrIHBpeGVscyBvZiBiaXQgZGVwdGhzIDEsIDIsIGFuZCA0IGludG8gYnl0ZXMgYXMgc21hbGwgYXMKK3RoZXkgY2FuLCByZXN1bHRpbmcgaW4sIGZvciBleGFtcGxlLCA4IHBpeGVscyBwZXIgYnl0ZSBmb3IgMSBiaXQKK2ZpbGVzLiAgVGhpcyBjb2RlIGV4cGFuZHMgdG8gMSBwaXhlbCBwZXIgYnl0ZSB3aXRob3V0IGNoYW5naW5nIHRoZQordmFsdWVzIG9mIHRoZSBwaXhlbHM6CisKKyAgICBpZiAoYml0X2RlcHRoIDwgOCkKKyAgICAgICBwbmdfc2V0X3BhY2tpbmcocG5nX3B0cik7CisKK1BORyBmaWxlcyBoYXZlIHBvc3NpYmxlIGJpdCBkZXB0aHMgb2YgMSwgMiwgNCwgOCwgYW5kIDE2LiAgQWxsIHBpeGVscworc3RvcmVkIGluIGEgUE5HIGltYWdlIGhhdmUgYmVlbiAic2NhbGVkIiBvciAic2hpZnRlZCIgdXAgdG8gdGhlIG5leHQKK2hpZ2hlciBwb3NzaWJsZSBiaXQgZGVwdGggKGUuZy4gZnJvbSA1IGJpdHMvc2FtcGxlIGluIHRoZSByYW5nZSBbMCwzMV0KK3RvIDggYml0cy9zYW1wbGUgaW4gdGhlIHJhbmdlIFswLCAyNTVdKS4gIEhvd2V2ZXIsIGl0IGlzIGFsc28gcG9zc2libGUKK3RvIGNvbnZlcnQgdGhlIFBORyBwaXhlbCBkYXRhIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGJpdCBkZXB0aCBvZiB0aGUKK2ltYWdlLiAgVGhpcyBjYWxsIHJlZHVjZXMgdGhlIHBpeGVscyBiYWNrIGRvd24gdG8gdGhlIG9yaWdpbmFsIGJpdCBkZXB0aDoKKworICAgIHBuZ19jb2xvcl84cCBzaWdfYml0OworCisgICAgaWYgKHBuZ19nZXRfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgJnNpZ19iaXQpKQorICAgICAgIHBuZ19zZXRfc2hpZnQocG5nX3B0ciwgc2lnX2JpdCk7CisKK1BORyBmaWxlcyBzdG9yZSAzLWNvbG9yIHBpeGVscyBpbiByZWQsIGdyZWVuLCBibHVlIG9yZGVyLiAgVGhpcyBjb2RlCitjaGFuZ2VzIHRoZSBzdG9yYWdlIG9mIHRoZSBwaXhlbHMgdG8gYmx1ZSwgZ3JlZW4sIHJlZDoKKworICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiB8fAorICAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkKKyAgICAgICBwbmdfc2V0X2JncihwbmdfcHRyKTsKKworUE5HIGZpbGVzIHN0b3JlIFJHQiBwaXhlbHMgcGFja2VkIGludG8gMyBvciA2IGJ5dGVzLiBUaGlzIGNvZGUgZXhwYW5kcyB0aGVtCitpbnRvIDQgb3IgOCBieXRlcyBmb3Igd2luZG93aW5nIHN5c3RlbXMgdGhhdCBuZWVkIHRoZW0gaW4gdGhpcyBmb3JtYXQ6CisKKyAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpCisgICAgICAgcG5nX3NldF9maWxsZXIocG5nX3B0ciwgZmlsbGVyLCBQTkdfRklMTEVSX0JFRk9SRSk7CisKK3doZXJlICJmaWxsZXIiIGlzIHRoZSA4LWJpdCBvciAxNi1iaXQgbnVtYmVyIHRvIGZpbGwgd2l0aCwgYW5kIHRoZSBsb2NhdGlvbgoraXMgZWl0aGVyIFBOR19GSUxMRVJfQkVGT1JFIG9yIFBOR19GSUxMRVJfQUZURVIsIGRlcGVuZGluZyB1cG9uIHdoZXRoZXIKK3lvdSB3YW50IHRoZSBmaWxsZXIgYmVmb3JlIHRoZSBSR0Igb3IgYWZ0ZXIuIFdoZW4gZmlsbGluZyBhbiA4LWJpdCBwaXhlbCwKK3RoZSBsZWFzdCBzaWduaWZpY2FudCA4IGJpdHMgb2YgdGhlIG51bWJlciBhcmUgdXNlZCwgaWYgYSAxNi1iaXQgbnVtYmVyIGlzCitzdXBwbGllZC4gIFRoaXMgdHJhbnNmb3JtYXRpb24gZG9lcyBub3QgYWZmZWN0IGltYWdlcyB0aGF0IGFscmVhZHkgaGF2ZSBmdWxsCithbHBoYSBjaGFubmVscy4gIFRvIGFkZCBhbiBvcGFxdWUgYWxwaGEgY2hhbm5lbCwgdXNlIGZpbGxlcj0weGZmZmYgYW5kCitQTkdfRklMTEVSX0FGVEVSIHdoaWNoIHdpbGwgZ2VuZXJhdGUgUkdCQSBwaXhlbHMuCisKK05vdGUgdGhhdCBwbmdfc2V0X2ZpbGxlcigpIGRvZXMgbm90IGNoYW5nZSB0aGUgY29sb3IgdHlwZS4gIElmIHlvdSB3YW50Cit0byBkbyB0aGF0LCB5b3UgY2FuIGFkZCBhIHRydWUgYWxwaGEgY2hhbm5lbCB3aXRoCisKKyAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgfHwKKyAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpCisgICAgICAgcG5nX3NldF9hZGRfYWxwaGEocG5nX3B0ciwgZmlsbGVyLCBQTkdfRklMTEVSX0FGVEVSKTsKKword2hlcmUgImZpbGxlciIgY29udGFpbnMgdGhlIGFscGhhIHZhbHVlIHRvIGFzc2lnbiB0byBlYWNoIHBpeGVsLgorVGhlIHBuZ19zZXRfYWRkX2FscGhhKCkgZnVuY3Rpb24gd2FzIGFkZGVkIGluIGxpYnBuZy0xLjIuNy4KKworSWYgeW91IGFyZSByZWFkaW5nIGFuIGltYWdlIHdpdGggYW4gYWxwaGEgY2hhbm5lbCwgYW5kIHlvdSBuZWVkIHRoZQorZGF0YSBhcyBBUkdCIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBQTkcgZm9ybWF0IFJHQkE6CisKKyAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCisgICAgICAgcG5nX3NldF9zd2FwX2FscGhhKHBuZ19wdHIpOworCitGb3Igc29tZSB1c2VzLCB5b3UgbWF5IHdhbnQgYSBncmF5c2NhbGUgaW1hZ2UgdG8gYmUgcmVwcmVzZW50ZWQgYXMKK1JHQi4gIFRoaXMgY29kZSB3aWxsIGRvIHRoYXQgY29udmVyc2lvbjoKKworICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgfHwKKyAgICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQorICAgICAgIHBuZ19zZXRfZ3JheV90b19yZ2IocG5nX3B0cik7CisKK0NvbnZlcnNlbHksIHlvdSBjYW4gY29udmVydCBhbiBSR0Igb3IgUkdCQSBpbWFnZSB0byBncmF5c2NhbGUgb3IgZ3JheXNjYWxlCit3aXRoIGFscGhhLgorCisgICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCIHx8CisgICAgICAgIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQorICAgICAgIHBuZ19zZXRfcmdiX3RvX2dyYXkocG5nX3B0ciwgZXJyb3JfYWN0aW9uLAorICAgICAgICAgIGRvdWJsZSByZWRfd2VpZ2h0LCBkb3VibGUgZ3JlZW5fd2VpZ2h0KTsKKworICAgIGVycm9yX2FjdGlvbiA9IDE6IHNpbGVudGx5IGRvIHRoZSBjb252ZXJzaW9uCisKKyAgICBlcnJvcl9hY3Rpb24gPSAyOiBpc3N1ZSBhIHdhcm5pbmcgaWYgdGhlIG9yaWdpbmFsCisgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgaGFzIGFueSBwaXhlbCB3aGVyZQorICAgICAgICAgICAgICAgICAgICAgIHJlZCAhPSBncmVlbiBvciByZWQgIT0gYmx1ZQorCisgICAgZXJyb3JfYWN0aW9uID0gMzogaXNzdWUgYW4gZXJyb3IgYW5kIGFib3J0IHRoZQorICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb24gaWYgdGhlIG9yaWdpbmFsCisgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgaGFzIGFueSBwaXhlbCB3aGVyZQorICAgICAgICAgICAgICAgICAgICAgIHJlZCAhPSBncmVlbiBvciByZWQgIT0gYmx1ZQorCisgICAgcmVkX3dlaWdodDogICAgICAgd2VpZ2h0IG9mIHJlZCBjb21wb25lbnQKKworICAgIGdyZWVuX3dlaWdodDogICAgIHdlaWdodCBvZiBncmVlbiBjb21wb25lbnQKKyAgICAgICAgICAgICAgICAgICAgICBJZiBlaXRoZXIgd2VpZ2h0IGlzIG5lZ2F0aXZlLCBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0cyBhcmUgdXNlZC4KKworSW4gdGhlIGNvcnJlc3BvbmRpbmcgZml4ZWQgcG9pbnQgQVBJIHRoZSByZWRfd2VpZ2h0IGFuZCBncmVlbl93ZWlnaHQgdmFsdWVzIGFyZQorc2ltcGx5IHNjYWxlZCBieSAxMDAsMDAwOgorCisgICAgcG5nX3NldF9yZ2JfdG9fZ3JheShwbmdfcHRyLCBlcnJvcl9hY3Rpb24sCisgICAgICAgcG5nX2ZpeGVkX3BvaW50IHJlZF93ZWlnaHQsCisgICAgICAgcG5nX2ZpeGVkX3BvaW50IGdyZWVuX3dlaWdodCk7CisKK0lmIHlvdSBoYXZlIHNldCBlcnJvcl9hY3Rpb24gPSAxIG9yIDIsIHlvdSBjYW4KK2xhdGVyIGNoZWNrIHdoZXRoZXIgdGhlIGltYWdlIHJlYWxseSB3YXMgZ3JheSwgYWZ0ZXIgcHJvY2Vzc2luZwordGhlIGltYWdlIHJvd3MsIHdpdGggdGhlIHBuZ19nZXRfcmdiX3RvX2dyYXlfc3RhdHVzKHBuZ19wdHIpIGZ1bmN0aW9uLgorSXQgd2lsbCByZXR1cm4gYSBwbmdfYnl0ZSB0aGF0IGlzIHplcm8gaWYgdGhlIGltYWdlIHdhcyBncmF5IG9yCisxIGlmIHRoZXJlIHdlcmUgYW55IG5vbi1ncmF5IHBpeGVscy4gIEJhY2tncm91bmQgYW5kIHNCSVQgZGF0YQord2lsbCBiZSBzaWxlbnRseSBjb252ZXJ0ZWQgdG8gZ3JheXNjYWxlLCB1c2luZyB0aGUgZ3JlZW4gY2hhbm5lbAorZGF0YSBmb3Igc0JJVCwgcmVnYXJkbGVzcyBvZiB0aGUgZXJyb3JfYWN0aW9uIHNldHRpbmcuCisKK1RoZSBkZWZhdWx0IHZhbHVlcyBjb21lIGZyb20gdGhlIFBORyBmaWxlIGNIUk0gY2h1bmsgaWYgcHJlc2VudDsgb3RoZXJ3aXNlLCB0aGUKK2RlZmF1bHRzIGNvcnJlc3BvbmQgdG8gdGhlIElUVS1SIHJlY29tbWVuZGF0aW9uIDcwOSwgYW5kIGFsc28gdGhlIHNSR0IgY29sb3IKK3NwYWNlLCBhcyByZWNvbW1lbmRlZCBpbiB0aGUgQ2hhcmxlcyBQb3ludG9uJ3MgQ29sb3VyIEZBUSwKK0NvcHlyaWdodCAoYykgMjAwNi0xMS0yOCBDaGFybGVzIFBveW50b24sIGluIHNlY3Rpb24gOToKKworPGh0dHA6Ly93d3cucG95bnRvbi5jb20vbm90ZXMvY29sb3VyX2FuZF9nYW1tYS9Db2xvckZBUS5odG1sI1JURlRvQzk+CisKKyAgICBZID0gMC4yMTI2ICogUiArIDAuNzE1MiAqIEcgKyAwLjA3MjIgKiBCCisKK1ByZXZpb3VzIHZlcnNpb25zIG9mIHRoaXMgZG9jdW1lbnQsIDE5OTggdGhyb3VnaCAyMDAyLCByZWNvbW1lbmRlZCBhIHNsaWdodGx5CitkaWZmZXJlbnQgZm9ybXVsYToKKworICAgIFkgPSAwLjIxMjY3MSAqIFIgKyAwLjcxNTE2MCAqIEcgKyAwLjA3MjE2OSAqIEIKKworTGlicG5nIHVzZXMgYW4gaW50ZWdlciBhcHByb3hpbWF0aW9uOgorCisgICAgWSA9ICg2OTY4ICogUiArIDIzNDM0ICogRyArIDIzNjYgKiBCKS8zMjc2OAorCitUaGUgY2FsY3VsYXRpb24gaXMgZG9uZSBpbiBhIGxpbmVhciBjb2xvcnNwYWNlLCBpZiB0aGUgaW1hZ2UgZ2FtbWEKK2NhbiBiZSBkZXRlcm1pbmVkLgorCitUaGUgcG5nX3NldF9iYWNrZ3JvdW5kKCkgZnVuY3Rpb24gaGFzIGJlZW4gZGVzY3JpYmVkIGFscmVhZHk7IGl0IHRlbGxzIGxpYnBuZyB0bworY29tcG9zaXRlIGltYWdlcyB3aXRoIGFscGhhIG9yIHNpbXBsZSB0cmFuc3BhcmVuY3kgYWdhaW5zdCB0aGUgc3VwcGxpZWQKK2JhY2tncm91bmQgY29sb3IuICBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIHZlcnNpb25zIG9mIGxpYnBuZyBlYXJsaWVyIHRoYW4KK2xpYnBuZy0xLjUuNCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBjYWxsIHRoZSBmdW5jdGlvbiBhZnRlciByZWFkaW5nIHRoZSBmaWxlCitoZWFkZXIsIGV2ZW4gaWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIHRoZSBjb2xvciBpbiBhIGJLR0QgY2h1bmssIGlmIG9uZSBleGlzdHMuCisKK0lmIHRoZSBQTkcgZmlsZSBjb250YWlucyBhIGJLR0QgY2h1bmsgKFBOR19JTkZPX2JLR0QgdmFsaWQpLAoreW91IG1heSB1c2UgdGhpcyBjb2xvciwgb3Igc3VwcGx5IGFub3RoZXIgY29sb3IgbW9yZSBzdWl0YWJsZSBmb3IKK3RoZSBjdXJyZW50IGRpc3BsYXkgKGUuZy4sIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGZyb20gYSB3ZWIgcGFnZSkuICBZb3UKK25lZWQgdG8gdGVsbCBsaWJwbmcgaG93IHRoZSBjb2xvciBpcyByZXByZXNlbnRlZCwgYm90aCB0aGUgZm9ybWF0IG9mIHRoZQorY29tcG9uZW50IHZhbHVlcyBpbiB0aGUgY29sb3IgKHRoZSBudW1iZXIgb2YgYml0cykgYW5kIHRoZSBnYW1tYSBlbmNvZGluZyBvZiB0aGUKK2NvbG9yLiAgVGhlIGZ1bmN0aW9uIHRha2VzIHR3byBhcmd1bWVudHMsIGJhY2tncm91bmRfZ2FtbWFfbW9kZSBhbmQgbmVlZF9leHBhbmQKK3RvIGNvbnZleSB0aGlzIGluZm9ybWF0aW9uOyBob3dldmVyLCBvbmx5IHR3byBjb21iaW5hdGlvbnMgYXJlIGxpa2VseSB0byBiZQordXNlZnVsOgorCisgICAgcG5nX2NvbG9yXzE2IG15X2JhY2tncm91bmQ7CisgICAgcG5nX2NvbG9yXzE2cCBpbWFnZV9iYWNrZ3JvdW5kOworCisgICAgaWYgKHBuZ19nZXRfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgJmltYWdlX2JhY2tncm91bmQpKQorICAgICAgIHBuZ19zZXRfYmFja2dyb3VuZChwbmdfcHRyLCBpbWFnZV9iYWNrZ3JvdW5kLAorICAgICAgICAgICBQTkdfQkFDS0dST1VORF9HQU1NQV9GSUxFLCAxLypuZWVkcyB0byBiZSBleHBhbmRlZCovLCAxKTsKKyAgICBlbHNlCisgICAgICAgcG5nX3NldF9iYWNrZ3JvdW5kKHBuZ19wdHIsICZteV9iYWNrZ3JvdW5kLAorICAgICAgICAgICBQTkdfQkFDS0dST1VORF9HQU1NQV9TQ1JFRU4sIDAvKmRvIG5vdCBleHBhbmQqLywgMSk7CisKK1RoZSBzZWNvbmQgY2FsbCB3YXMgZGVzY3JpYmVkIGFib3ZlIC0gbXlfYmFja2dyb3VuZCBpcyBpbiB0aGUgZm9ybWF0IG9mIHRoZQorZmluYWwsIGRpc3BsYXksIG91dHB1dCBwcm9kdWNlZCBieSBsaWJwbmcuICBCZWNhdXNlIHlvdSBub3cga25vdyB0aGUgZm9ybWF0IG9mCit0aGUgUE5HIGl0IGlzIHBvc3NpYmxlIHRvIGF2b2lkIHRoZSBuZWVkIHRvIGNob29zZSBlaXRoZXIgOC1iaXQgb3IgMTYtYml0CitvdXRwdXQgYW5kIHRvIHJldGFpbiBwYWxldHRlIGltYWdlcyAodGhlIHBhbGV0dGUgY29sb3JzIHdpbGwgYmUgbW9kaWZpZWQKK2FwcHJvcHJpYXRlbHkgYW5kIHRoZSB0Uk5TIGNodW5rIHJlbW92ZWQuKSAgSG93ZXZlciwgaWYgeW91IGFyZSBkb2luZyB0aGlzLAordGFrZSBncmVhdCBjYXJlIG5vdCB0byBhc2sgZm9yIHRyYW5zZm9ybWF0aW9ucyB3aXRob3V0IGNoZWNraW5nIGZpcnN0IHRoYXQKK3RoZXkgYXBwbHkhCisKK0luIHRoZSBmaXJzdCBjYWxsIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGhhcyB0aGUgb3JpZ2luYWwgYml0IGRlcHRoIGFuZCBjb2xvciB0eXBlCitvZiB0aGUgUE5HIGZpbGUuICBTbywgZm9yIHBhbGV0dGUgaW1hZ2VzIHRoZSBjb2xvciBpcyBzdXBwbGllZCBhcyBhIHBhbGV0dGUKK2luZGV4IGFuZCBmb3IgbG93IGJpdCBncmV5c2NhbGUgaW1hZ2VzIHRoZSBjb2xvciBpcyBhIHJlZHVjZWQgYml0IHZhbHVlIGluCitpbWFnZV9iYWNrZ3JvdW5kLT5ncmF5LgorCitJZiB5b3UgZGlkbid0IGNhbGwgcG5nX3NldF9nYW1tYSgpIGJlZm9yZSByZWFkaW5nIHRoZSBmaWxlIGhlYWRlciwgZm9yIGV4YW1wbGUKK2lmIHlvdSBuZWVkIHlvdXIgY29kZSB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIGxpYnBuZyBwcmlvcgordG8gbGlicG5nLTEuNS40LCB0aGlzIGlzIHRoZSBwbGFjZSB0byBjYWxsIGl0LgorCitEbyBub3QgY2FsbCBpdCBpZiB5b3UgY2FsbGVkIHBuZ19zZXRfYWxwaGFfbW9kZSgpOyBkb2luZyBzbyB3aWxsIGRhbWFnZSB0aGUKK3NldHRpbmdzIHB1dCBpbiBwbGFjZSBieSBwbmdfc2V0X2FscGhhX21vZGUoKS4gIChJZiBwbmdfc2V0X2FscGhhX21vZGUoKSBpcworc3VwcG9ydGVkIHRoZW4geW91IGNhbiBjZXJ0YWlubHkgZG8gcG5nX3NldF9nYW1tYSgpIGJlZm9yZSByZWFkaW5nIHRoZSBQTkcKK2hlYWRlci4pCisKK1RoaXMgQVBJIHVuY29uZGl0aW9uYWxseSBzZXRzIHRoZSBzY3JlZW4gYW5kIGZpbGUgZ2FtbWEgdmFsdWVzLCBzbyBpdCB3aWxsCitvdmVycmlkZSB0aGUgdmFsdWUgaW4gdGhlIFBORyBmaWxlIHVubGVzcyBpdCBpcyBjYWxsZWQgYmVmb3JlIHRoZSBQTkcgZmlsZQorcmVhZGluZyBzdGFydHMuICBGb3IgdGhpcyByZWFzb24geW91IG11c3QgYWx3YXlzIGNhbGwgaXQgd2l0aCB0aGUgUE5HIGZpbGUKK3ZhbHVlIHdoZW4geW91IGNhbGwgaXQgaW4gdGhpcyBwb3NpdGlvbjoKKworICAgaWYgKHBuZ19nZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgJmZpbGVfZ2FtbWEpKQorICAgICAgcG5nX3NldF9nYW1tYShwbmdfcHRyLCBzY3JlZW5fZ2FtbWEsIGZpbGVfZ2FtbWEpOworCisgICBlbHNlCisgICAgICBwbmdfc2V0X2dhbW1hKHBuZ19wdHIsIHNjcmVlbl9nYW1tYSwgMC40NTQ1NSk7CisKK0lmIHlvdSBuZWVkIHRvIHJlZHVjZSBhbiBSR0IgZmlsZSB0byBhIHBhbGV0dGVkIGZpbGUsIG9yIGlmIGEgcGFsZXR0ZWQKK2ZpbGUgaGFzIG1vcmUgZW50cmllcyB0aGFuIHdpbGwgZml0IG9uIHlvdXIgc2NyZWVuLCBwbmdfc2V0X3F1YW50aXplKCkKK3dpbGwgZG8gdGhhdC4gIE5vdGUgdGhhdCB0aGlzIGlzIGEgc2ltcGxlIG1hdGNoIHF1YW50aXphdGlvbiB0aGF0IG1lcmVseQorZmluZHMgdGhlIGNsb3Nlc3QgY29sb3IgYXZhaWxhYmxlLiAgVGhpcyBzaG91bGQgd29yayBmYWlybHkgd2VsbCB3aXRoCitvcHRpbWl6ZWQgcGFsZXR0ZXMsIGJ1dCBmYWlybHkgYmFkbHkgd2l0aCBsaW5lYXIgY29sb3IgY3ViZXMuICBJZiB5b3UKK3Bhc3MgYSBwYWxldHRlIHRoYXQgaXMgbGFyZ2VyIHRoYW4gbWF4aW11bV9jb2xvcnMsIHRoZSBmaWxlIHdpbGwKK3JlZHVjZSB0aGUgbnVtYmVyIG9mIGNvbG9ycyBpbiB0aGUgcGFsZXR0ZSBzbyBpdCB3aWxsIGZpdCBpbnRvCittYXhpbXVtX2NvbG9ycy4gIElmIHRoZXJlIGlzIGEgaGlzdG9ncmFtLCBsaWJwbmcgd2lsbCB1c2UgaXQgdG8gbWFrZQorbW9yZSBpbnRlbGxpZ2VudCBjaG9pY2VzIHdoZW4gcmVkdWNpbmcgdGhlIHBhbGV0dGUuICBJZiB0aGVyZSBpcyBubworaGlzdG9ncmFtLCBpdCBtYXkgbm90IGRvIGFzIGdvb2QgYSBqb2IuCisKKyAgIGlmIChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpCisgICB7CisgICAgICBpZiAocG5nX2dldF92YWxpZChwbmdfcHRyLCBpbmZvX3B0ciwKKyAgICAgICAgICBQTkdfSU5GT19QTFRFKSkKKyAgICAgIHsKKyAgICAgICAgIHBuZ191aW50XzE2cCBoaXN0b2dyYW0gPSBOVUxMOworCisgICAgICAgICBwbmdfZ2V0X2hJU1QocG5nX3B0ciwgaW5mb19wdHIsCisgICAgICAgICAgICAgJmhpc3RvZ3JhbSk7CisgICAgICAgICBwbmdfc2V0X3F1YW50aXplKHBuZ19wdHIsIHBhbGV0dGUsIG51bV9wYWxldHRlLAorICAgICAgICAgICAgbWF4X3NjcmVlbl9jb2xvcnMsIGhpc3RvZ3JhbSwgMSk7CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHBuZ19jb2xvciBzdGRfY29sb3JfY3ViZVtNQVhfU0NSRUVOX0NPTE9SU10gPQorICAgICAgICAgICAgeyAuLi4gY29sb3JzIC4uLiB9OworCisgICAgICAgICBwbmdfc2V0X3F1YW50aXplKHBuZ19wdHIsIHN0ZF9jb2xvcl9jdWJlLAorICAgICAgICAgICAgTUFYX1NDUkVFTl9DT0xPUlMsIE1BWF9TQ1JFRU5fQ09MT1JTLAorICAgICAgICAgICAgTlVMTCwwKTsKKyAgICAgIH0KKyAgIH0KKworUE5HIGZpbGVzIGRlc2NyaWJlIG1vbm9jaHJvbWUgYXMgYmxhY2sgYmVpbmcgemVybyBhbmQgd2hpdGUgYmVpbmcgb25lLgorVGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgcmV2ZXJzZSB0aGlzIChtYWtlIGJsYWNrIGJlIG9uZSBhbmQgd2hpdGUgYmUKK3plcm8pOgorCisgICBpZiAoYml0X2RlcHRoID09IDEgJiYgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQorICAgICAgcG5nX3NldF9pbnZlcnRfbW9ubyhwbmdfcHRyKTsKKworVGhpcyBmdW5jdGlvbiBjYW4gYWxzbyBiZSB1c2VkIHRvIGludmVydCBncmF5c2NhbGUgYW5kIGdyYXktYWxwaGEgaW1hZ2VzOgorCisgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZIHx8CisgICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQorICAgICAgcG5nX3NldF9pbnZlcnRfbW9ubyhwbmdfcHRyKTsKKworUE5HIGZpbGVzIHN0b3JlIDE2LWJpdCBwaXhlbHMgaW4gbmV0d29yayBieXRlIG9yZGVyIChiaWctZW5kaWFuLAoraWUuIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBmaXJzdCkuICBUaGlzIGNvZGUgY2hhbmdlcyB0aGUgc3RvcmFnZSB0byB0aGUKK290aGVyIHdheSAobGl0dGxlLWVuZGlhbiwgaS5lLiBsZWFzdCBzaWduaWZpY2FudCBiaXRzIGZpcnN0LCB0aGUKK3dheSBQQ3Mgc3RvcmUgdGhlbSk6CisKKyAgICBpZiAoYml0X2RlcHRoID09IDE2KQorICAgICAgIHBuZ19zZXRfc3dhcChwbmdfcHRyKTsKKworSWYgeW91IGFyZSB1c2luZyBwYWNrZWQtcGl4ZWwgaW1hZ2VzICgxLCAyLCBvciA0IGJpdHMvcGl4ZWwpLCBhbmQgeW91CituZWVkIHRvIGNoYW5nZSB0aGUgb3JkZXIgdGhlIHBpeGVscyBhcmUgcGFja2VkIGludG8gYnl0ZXMsIHlvdSBjYW4gdXNlOgorCisgICAgaWYgKGJpdF9kZXB0aCA8IDgpCisgICAgICAgcG5nX3NldF9wYWNrc3dhcChwbmdfcHRyKTsKKworRmluYWxseSwgeW91IGNhbiB3cml0ZSB5b3VyIG93biB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiBpZiBub25lIG9mCit0aGUgZXhpc3Rpbmcgb25lcyBtZWV0cyB5b3VyIG5lZWRzLiAgVGhpcyBpcyBkb25lIGJ5IHNldHRpbmcgYSBjYWxsYmFjaword2l0aAorCisgICAgcG5nX3NldF9yZWFkX3VzZXJfdHJhbnNmb3JtX2ZuKHBuZ19wdHIsCisgICAgICAgIHJlYWRfdHJhbnNmb3JtX2ZuKTsKKworWW91IG11c3Qgc3VwcGx5IHRoZSBmdW5jdGlvbgorCisgICAgdm9pZCByZWFkX3RyYW5zZm9ybV9mbihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfcm93X2luZm9wCisgICAgICAgIHJvd19pbmZvLCBwbmdfYnl0ZXAgZGF0YSkKKworU2VlIHBuZ3Rlc3QuYyBmb3IgYSB3b3JraW5nIGV4YW1wbGUuICBZb3VyIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCithZnRlciBhbGwgb2YgdGhlIG90aGVyIHRyYW5zZm9ybWF0aW9ucyBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAgVGFrZSBjYXJlIHdpdGgKK2ludGVybGFjZWQgaW1hZ2VzIGlmIHlvdSBkbyB0aGUgaW50ZXJsYWNlIHlvdXJzZWxmIC0gdGhlIHdpZHRoIG9mIHRoZSByb3cgaXMgdGhlCit3aWR0aCBpbiAncm93X2luZm8nLCBub3QgdGhlIG92ZXJhbGwgaW1hZ2Ugd2lkdGguCisKK0lmIHN1cHBvcnRlZCwgbGlicG5nIHByb3ZpZGVzIHR3byBpbmZvcm1hdGlvbiByb3V0aW5lcyB0aGF0IHlvdSBjYW4gdXNlIHRvIGZpbmQKK3doZXJlIHlvdSBhcmUgaW4gcHJvY2Vzc2luZyB0aGUgaW1hZ2U6CisKKyAgIHBuZ19nZXRfY3VycmVudF9wYXNzX251bWJlcihwbmdfc3RydWN0cCBwbmdfcHRyKTsKKyAgIHBuZ19nZXRfY3VycmVudF9yb3dfbnVtYmVyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpOworCitEb24ndCB0cnkgdXNpbmcgdGhlc2Ugb3V0c2lkZSBhIHRyYW5zZm9ybSBjYWxsYmFjayAtIGZpcnN0bHkgdGhleSBhcmUgb25seQorc3VwcG9ydGVkIGlmIHVzZXIgdHJhbnNmb3JtcyBhcmUgc3VwcG9ydGVkLCBzZWNvbmRseSB0aGV5IG1heSB3ZWxsIHJldHVybgordW5leHBlY3RlZCByZXN1bHRzIHVubGVzcyB0aGUgcm93IGlzIGFjdHVhbGx5IGJlaW5nIHByb2Nlc3NlZCBhdCB0aGUgbW9tZW50IHRoZXkKK2FyZSBjYWxsZWQuCisKK1dpdGggaW50ZXJsYWNlZAoraW1hZ2VzIHRoZSB2YWx1ZSByZXR1cm5lZCBpcyB0aGUgcm93IGluIHRoZSBpbnB1dCBzdWItaW1hZ2UgaW1hZ2UuICBVc2UKK1BOR19ST1dfRlJPTV9QQVNTX1JPVyhyb3csIHBhc3MpIGFuZCBQTkdfQ09MX0ZST01fUEFTU19DT0woY29sLCBwYXNzKSB0bworZmluZCB0aGUgb3V0cHV0IHBpeGVsICh4LHkpIGdpdmVuIGFuIGludGVybGFjZWQgc3ViLWltYWdlIHBpeGVsIChyb3csY29sLHBhc3MpLgorCitUaGUgZGlzY3Vzc2lvbiBvZiBpbnRlcmxhY2UgaGFuZGxpbmcgYWJvdmUgY29udGFpbnMgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8KK3VzZSB0aGVzZSB2YWx1ZXMuCisKK1lvdSBjYW4gYWxzbyBzZXQgdXAgYSBwb2ludGVyIHRvIGEgdXNlciBzdHJ1Y3R1cmUgZm9yIHVzZSBieSB5b3VyCitjYWxsYmFjayBmdW5jdGlvbiwgYW5kIHlvdSBjYW4gaW5mb3JtIGxpYnBuZyB0aGF0IHlvdXIgdHJhbnNmb3JtCitmdW5jdGlvbiB3aWxsIGNoYW5nZSB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIG9yIGJpdCBkZXB0aCB3aXRoIHRoZQorZnVuY3Rpb24KKworICAgIHBuZ19zZXRfdXNlcl90cmFuc2Zvcm1faW5mbyhwbmdfcHRyLCB1c2VyX3B0ciwKKyAgICAgICAgdXNlcl9kZXB0aCwgdXNlcl9jaGFubmVscyk7CisKK1RoZSB1c2VyJ3MgYXBwbGljYXRpb24sIG5vdCBsaWJwbmcsIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nIGFuZAorZnJlZWluZyBhbnkgbWVtb3J5IHJlcXVpcmVkIGZvciB0aGUgdXNlciBzdHJ1Y3R1cmUuCisKK1lvdSBjYW4gcmV0cmlldmUgdGhlIHBvaW50ZXIgdmlhIHRoZSBmdW5jdGlvbgorcG5nX2dldF91c2VyX3RyYW5zZm9ybV9wdHIoKS4gIEZvciBleGFtcGxlOgorCisgICAgdm9pZHAgcmVhZF91c2VyX3RyYW5zZm9ybV9wdHIgPQorICAgICAgICBwbmdfZ2V0X3VzZXJfdHJhbnNmb3JtX3B0cihwbmdfcHRyKTsKKworVGhlIGxhc3QgdGhpbmcgdG8gaGFuZGxlIGlzIGludGVybGFjaW5nOyB0aGlzIGlzIGNvdmVyZWQgaW4gZGV0YWlsIGJlbG93LAorYnV0IHlvdSBtdXN0IGNhbGwgdGhlIGZ1bmN0aW9uIGhlcmUgaWYgeW91IHdhbnQgbGlicG5nIHRvIGhhbmRsZSBleHBhbnNpb24KK29mIHRoZSBpbnRlcmxhY2VkIGltYWdlLgorCisgICAgbnVtYmVyX29mX3Bhc3NlcyA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOworCitBZnRlciBzZXR0aW5nIHRoZSB0cmFuc2Zvcm1hdGlvbnMsIGxpYnBuZyBjYW4gdXBkYXRlIHlvdXIgcG5nX2luZm8KK3N0cnVjdHVyZSB0byByZWZsZWN0IGFueSB0cmFuc2Zvcm1hdGlvbnMgeW91J3ZlIHJlcXVlc3RlZCB3aXRoIHRoaXMKK2NhbGwuCisKKyAgICBwbmdfcmVhZF91cGRhdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7CisKK1RoaXMgaXMgbW9zdCB1c2VmdWwgdG8gdXBkYXRlIHRoZSBpbmZvIHN0cnVjdHVyZSdzIHJvd2J5dGVzCitmaWVsZCBzbyB5b3UgY2FuIHVzZSBpdCB0byBhbGxvY2F0ZSB5b3VyIGltYWdlIG1lbW9yeS4gIFRoaXMgZnVuY3Rpb24KK3dpbGwgYWxzbyB1cGRhdGUgeW91ciBwYWxldHRlIHdpdGggdGhlIGNvcnJlY3Qgc2NyZWVuX2dhbW1hIGFuZAorYmFja2dyb3VuZCBpZiB0aGVzZSBoYXZlIGJlZW4gZ2l2ZW4gd2l0aCB0aGUgY2FsbHMgYWJvdmUuICBZb3UgbWF5Citvbmx5IGNhbGwgcG5nX3JlYWRfdXBkYXRlX2luZm8oKSBvbmNlIHdpdGggYSBwYXJ0aWN1bGFyIGluZm9fcHRyLgorCitBZnRlciB5b3UgY2FsbCBwbmdfcmVhZF91cGRhdGVfaW5mbygpLCB5b3UgY2FuIGFsbG9jYXRlIGFueQorbWVtb3J5IHlvdSBuZWVkIHRvIGhvbGQgdGhlIGltYWdlLiAgVGhlIHJvdyBkYXRhIGlzIHNpbXBseQorcmF3IGJ5dGUgZGF0YSBmb3IgYWxsIGZvcm1zIG9mIGltYWdlcy4gIEFzIHRoZSBhY3R1YWwgYWxsb2NhdGlvbgordmFyaWVzIGFtb25nIGFwcGxpY2F0aW9ucywgbm8gZXhhbXBsZSB3aWxsIGJlIGdpdmVuLiAgSWYgeW91CithcmUgYWxsb2NhdGluZyBvbmUgbGFyZ2UgY2h1bmssIHlvdSB3aWxsIG5lZWQgdG8gYnVpbGQgYW4KK2FycmF5IG9mIHBvaW50ZXJzIHRvIGVhY2ggcm93LCBhcyBpdCB3aWxsIGJlIG5lZWRlZCBmb3Igc29tZQorb2YgdGhlIGZ1bmN0aW9ucyBiZWxvdy4KKworUmVtZW1iZXI6IEJlZm9yZSB5b3UgY2FsbCBwbmdfcmVhZF91cGRhdGVfaW5mbygpLCB0aGUgcG5nX2dldF8qKCkKK2Z1bmN0aW9ucyByZXR1cm4gdGhlIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBvcmlnaW5hbCBQTkcgaW1hZ2UuCitBZnRlciB5b3UgY2FsbCBwbmdfcmVhZF91cGRhdGVfaW5mbyB0aGUgdmFsdWVzIHJlZmVyIHRvIHRoZSBpbWFnZQordGhhdCBsaWJwbmcgd2lsbCBvdXRwdXQuICBDb25zZXF1ZW50bHkgeW91IG11c3QgY2FsbCBhbGwgdGhlIHBuZ19zZXRfCitmdW5jdGlvbnMgYmVmb3JlIHlvdSBjYWxsIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCkuICBUaGlzIGlzIHBhcnRpY3VsYXJseQoraW1wb3J0YW50IGZvciBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZygpIC0gaWYgeW91IGFyZSBnb2luZyB0byBjYWxsCitwbmdfcmVhZF91cGRhdGVfaW5mbygpIHlvdSBtdXN0IGNhbGwgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcoKSBiZWZvcmUKK2l0IHVubGVzcyB5b3Ugd2FudCB0byByZWNlaXZlIGludGVybGFjZWQgb3V0cHV0LgorCitSZWFkaW5nIGltYWdlIGRhdGEKKworQWZ0ZXIgeW91J3ZlIGFsbG9jYXRlZCBtZW1vcnksIHlvdSBjYW4gcmVhZCB0aGUgaW1hZ2UgZGF0YS4KK1RoZSBzaW1wbGVzdCB3YXkgdG8gZG8gdGhpcyBpcyBpbiBvbmUgZnVuY3Rpb24gY2FsbC4gIElmIHlvdSBhcmUKK2FsbG9jYXRpbmcgZW5vdWdoIG1lbW9yeSB0byBob2xkIHRoZSB3aG9sZSBpbWFnZSwgeW91IGNhbiBqdXN0CitjYWxsIHBuZ19yZWFkX2ltYWdlKCkgYW5kIGxpYnBuZyB3aWxsIHJlYWQgaW4gYWxsIHRoZSBpbWFnZSBkYXRhCithbmQgcHV0IGl0IGluIHRoZSBtZW1vcnkgYXJlYSBzdXBwbGllZC4gIFlvdSB3aWxsIG5lZWQgdG8gcGFzcyBpbgorYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gZWFjaCByb3cuCisKK1RoaXMgZnVuY3Rpb24gYXV0b21hdGljYWxseSBoYW5kbGVzIGludGVybGFjaW5nLCBzbyB5b3UgZG9uJ3QKK25lZWQgdG8gY2FsbCBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZygpICh1bmxlc3MgeW91IGNhbGwKK3BuZ19yZWFkX3VwZGF0ZV9pbmZvKCkpIG9yIGNhbGwgdGhpcyBmdW5jdGlvbiBtdWx0aXBsZSB0aW1lcywgb3IgYW55CitvZiB0aGF0IG90aGVyIHN0dWZmIG5lY2Vzc2FyeSB3aXRoIHBuZ19yZWFkX3Jvd3MoKS4KKworICAgcG5nX3JlYWRfaW1hZ2UocG5nX3B0ciwgcm93X3BvaW50ZXJzKTsKKword2hlcmUgcm93X3BvaW50ZXJzIGlzOgorCisgICBwbmdfYnl0ZXAgcm93X3BvaW50ZXJzW2hlaWdodF07CisKK1lvdSBjYW4gcG9pbnQgdG8gdm9pZCBvciBjaGFyIG9yIHdoYXRldmVyIHlvdSB1c2UgZm9yIHBpeGVscy4KKworSWYgeW91IGRvbid0IHdhbnQgdG8gcmVhZCBpbiB0aGUgd2hvbGUgaW1hZ2UgYXQgb25jZSwgeW91IGNhbgordXNlIHBuZ19yZWFkX3Jvd3MoKSBpbnN0ZWFkLiAgSWYgdGhlcmUgaXMgbm8gaW50ZXJsYWNpbmcgKGNoZWNrCitpbnRlcmxhY2VfdHlwZSA9PSBQTkdfSU5URVJMQUNFX05PTkUpLCB0aGlzIGlzIHNpbXBsZToKKworICAgIHBuZ19yZWFkX3Jvd3MocG5nX3B0ciwgcm93X3BvaW50ZXJzLCBOVUxMLAorICAgICAgICBudW1iZXJfb2Zfcm93cyk7CisKK3doZXJlIHJvd19wb2ludGVycyBpcyB0aGUgc2FtZSBhcyBpbiB0aGUgcG5nX3JlYWRfaW1hZ2UoKSBjYWxsLgorCitJZiB5b3UgYXJlIGRvaW5nIHRoaXMganVzdCBvbmUgcm93IGF0IGEgdGltZSwgeW91IGNhbiBkbyB0aGlzIHdpdGgKK2Egc2luZ2xlIHJvd19wb2ludGVyIGluc3RlYWQgb2YgYW4gYXJyYXkgb2Ygcm93X3BvaW50ZXJzOgorCisgICAgcG5nX2J5dGVwIHJvd19wb2ludGVyID0gcm93OworICAgIHBuZ19yZWFkX3JvdyhwbmdfcHRyLCByb3dfcG9pbnRlciwgTlVMTCk7CisKK0lmIHRoZSBmaWxlIGlzIGludGVybGFjZWQgKGludGVybGFjZV90eXBlICE9IDAgaW4gdGhlIElIRFIgY2h1bmspLCB0aGluZ3MKK2dldCBzb21ld2hhdCBoYXJkZXIuICBUaGUgb25seSBjdXJyZW50IChQTkcgU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMikKK2ludGVybGFjaW5nIHR5cGUgZm9yIFBORyBpcyAoaW50ZXJsYWNlX3R5cGUgPT0gUE5HX0lOVEVSTEFDRV9BREFNNyk7CithIHNvbWV3aGF0IGNvbXBsaWNhdGVkIDJEIGludGVybGFjZSBzY2hlbWUsIGtub3duIGFzIEFkYW03LCB0aGF0CiticmVha3MgZG93biBhbiBpbWFnZSBpbnRvIHNldmVuIHNtYWxsZXIgaW1hZ2VzIG9mIHZhcnlpbmcgc2l6ZSwgYmFzZWQKK29uIGFuIDh4OCBncmlkLiAgVGhpcyBudW1iZXIgaXMgZGVmaW5lZCAoZnJvbSBsaWJwbmcgMS41KSBhcworUE5HX0lOVEVSTEFDRV9BREFNN19QQVNTRVMgaW4gcG5nLmgKKworbGlicG5nIGNhbiBmaWxsIG91dCB0aG9zZSBpbWFnZXMgb3IgaXQgY2FuIGdpdmUgdGhlbSB0byB5b3UgImFzIGlzIi4KK0l0IGlzIGFsbW9zdCBhbHdheXMgYmV0dGVyIHRvIGhhdmUgbGlicG5nIGhhbmRsZSB0aGUgaW50ZXJsYWNpbmcgZm9yIHlvdS4KK0lmIHlvdSB3YW50IHRoZSBpbWFnZXMgZmlsbGVkIG91dCwgdGhlcmUgYXJlIHR3byB3YXlzIHRvIGRvIHRoYXQuICBUaGUgb25lCittZW50aW9uZWQgaW4gdGhlIFBORyBzcGVjaWZpY2F0aW9uIGlzIHRvIGV4cGFuZCBlYWNoIHBpeGVsIHRvIGNvdmVyCit0aG9zZSBwaXhlbHMgdGhhdCBoYXZlIG5vdCBiZWVuIHJlYWQgeWV0ICh0aGUgInJlY3RhbmdsZSIgbWV0aG9kKS4KK1RoaXMgcmVzdWx0cyBpbiBhIGJsb2NreSBpbWFnZSBmb3IgdGhlIGZpcnN0IHBhc3MsIHdoaWNoIGdyYWR1YWxseQorc21vb3RocyBvdXQgYXMgbW9yZSBwaXhlbHMgYXJlIHJlYWQuICBUaGUgb3RoZXIgbWV0aG9kIGlzIHRoZSAic3BhcmtsZSIKK21ldGhvZCwgd2hlcmUgcGl4ZWxzIGFyZSBkcmF3biBvbmx5IGluIHRoZWlyIGZpbmFsIGxvY2F0aW9ucywgd2l0aCB0aGUKK3Jlc3Qgb2YgdGhlIGltYWdlIHJlbWFpbmluZyB3aGF0ZXZlciBjb2xvcnMgdGhleSB3ZXJlIGluaXRpYWxpemVkIHRvCitiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSByZWFkLiAgVGhlIGZpcnN0IG1ldGhvZCB1c3VhbGx5IGxvb2tzIGJldHRlciwKK2J1dCB0ZW5kcyB0byBiZSBzbG93ZXIsIGFzIHRoZXJlIGFyZSBtb3JlIHBpeGVscyB0byBwdXQgaW4gdGhlIHJvd3MuCisKK0lmLCBhcyBpcyBsaWtlbHksIHlvdSB3YW50IGxpYnBuZyB0byBleHBhbmQgdGhlIGltYWdlcywgY2FsbCB0aGlzIGJlZm9yZQorY2FsbGluZyBwbmdfc3RhcnRfcmVhZF9pbWFnZSgpIG9yIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCk6CisKKyAgICBpZiAoaW50ZXJsYWNlX3R5cGUgPT0gUE5HX0lOVEVSTEFDRV9BREFNNykKKyAgICAgICBudW1iZXJfb2ZfcGFzc2VzCisgICAgICAgICAgID0gcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3B0cik7CisKK1RoaXMgd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiBwYXNzZXMgbmVlZGVkLiAgQ3VycmVudGx5LCB0aGlzIGlzIHNldmVuLAorYnV0IG1heSBjaGFuZ2UgaWYgYW5vdGhlciBpbnRlcmxhY2UgdHlwZSBpcyBhZGRlZC4gIFRoaXMgZnVuY3Rpb24gY2FuIGJlCitjYWxsZWQgZXZlbiBpZiB0aGUgZmlsZSBpcyBub3QgaW50ZXJsYWNlZCwgd2hlcmUgaXQgd2lsbCByZXR1cm4gb25lIHBhc3MuCitZb3UgdGhlbiBuZWVkIHRvIHJlYWQgdGhlIHdob2xlIGltYWdlICdudW1iZXJfb2ZfcGFzc2VzJyB0aW1lcy4gIEVhY2ggdGltZQord2lsbCBkaXN0cmlidXRlIHRoZSBwaXhlbHMgZnJvbSB0aGUgY3VycmVudCBwYXNzIHRvIHRoZSBjb3JyZWN0IHBsYWNlIGluCit0aGUgb3V0cHV0IGltYWdlLCBzbyB5b3UgbmVlZCB0byBzdXBwbHkgdGhlIHNhbWUgcm93cyB0byBwbmdfcmVhZF9yb3dzIGluCitlYWNoIHBhc3MuCisKK0lmIHlvdSBhcmUgbm90IGdvaW5nIHRvIGRpc3BsYXkgdGhlIGltYWdlIGFmdGVyIGVhY2ggcGFzcywgYnV0IGFyZQorZ29pbmcgdG8gd2FpdCB1bnRpbCB0aGUgZW50aXJlIGltYWdlIGlzIHJlYWQgaW4sIHVzZSB0aGUgc3BhcmtsZQorZWZmZWN0LiAgVGhpcyBlZmZlY3QgaXMgZmFzdGVyIGFuZCB0aGUgZW5kIHJlc3VsdCBvZiBlaXRoZXIgbWV0aG9kCitpcyBleGFjdGx5IHRoZSBzYW1lLiAgSWYgeW91IGFyZSBwbGFubmluZyBvbiBkaXNwbGF5aW5nIHRoZSBpbWFnZQorYWZ0ZXIgZWFjaCBwYXNzLCB0aGUgInJlY3RhbmdsZSIgZWZmZWN0IGlzIGdlbmVyYWxseSBjb25zaWRlcmVkIHRoZQorYmV0dGVyIGxvb2tpbmcgb25lLgorCitJZiB5b3Ugb25seSB3YW50IHRoZSAic3BhcmtsZSIgZWZmZWN0LCBqdXN0IGNhbGwgcG5nX3JlYWRfcm93cygpIGFzCitub3JtYWwsIHdpdGggdGhlIHRoaXJkIHBhcmFtZXRlciBOVUxMLiAgTWFrZSBzdXJlIHlvdSBtYWtlIHBhc3Mgb3ZlcgordGhlIGltYWdlIG51bWJlcl9vZl9wYXNzZXMgdGltZXMsIGFuZCB5b3UgZG9uJ3QgY2hhbmdlIHRoZSBkYXRhIGluIHRoZQorcm93cyBiZXR3ZWVuIGNhbGxzLiAgWW91IGNhbiBjaGFuZ2UgdGhlIGxvY2F0aW9ucyBvZiB0aGUgZGF0YSwganVzdAorbm90IHRoZSBkYXRhLiAgRWFjaCBwYXNzIG9ubHkgd3JpdGVzIHRoZSBwaXhlbHMgYXBwcm9wcmlhdGUgZm9yIHRoYXQKK3Bhc3MsIGFuZCBhc3N1bWVzIHRoZSBkYXRhIGZyb20gcHJldmlvdXMgcGFzc2VzIGlzIHN0aWxsIHZhbGlkLgorCisgICAgcG5nX3JlYWRfcm93cyhwbmdfcHRyLCByb3dfcG9pbnRlcnMsIE5VTEwsCisgICAgICAgIG51bWJlcl9vZl9yb3dzKTsKKworSWYgeW91IG9ubHkgd2FudCB0aGUgZmlyc3QgZWZmZWN0ICh0aGUgcmVjdGFuZ2xlcyksIGRvIHRoZSBzYW1lIGFzCitiZWZvcmUgZXhjZXB0IHBhc3MgdGhlIHJvdyBidWZmZXIgaW4gdGhlIHRoaXJkIHBhcmFtZXRlciwgYW5kIGxlYXZlCit0aGUgc2Vjb25kIHBhcmFtZXRlciBOVUxMLgorCisgICAgcG5nX3JlYWRfcm93cyhwbmdfcHRyLCBOVUxMLCByb3dfcG9pbnRlcnMsCisgICAgICAgIG51bWJlcl9vZl9yb3dzKTsKKworSWYgeW91IGRvbid0IHdhbnQgbGlicG5nIHRvIGhhbmRsZSB0aGUgaW50ZXJsYWNpbmcgZGV0YWlscywganVzdCBjYWxsCitwbmdfcmVhZF9yb3dzKCkgUE5HX0lOVEVSTEFDRV9BREFNN19QQVNTRVMgdGltZXMgdG8gcmVhZCBpbiBhbGwgdGhlIGltYWdlcy4KK0VhY2ggb2YgdGhlIGltYWdlcyBpcyBhIHZhbGlkIGltYWdlIGJ5IGl0c2VsZjsgaG93ZXZlciwgeW91IHdpbGwgYWxtb3N0CitjZXJ0YWlubHkgbmVlZCB0byBkaXN0cmlidXRlIHRoZSBwaXhlbHMgZnJvbSBlYWNoIHN1Yi1pbWFnZSB0byB0aGUKK2NvcnJlY3QgcGxhY2UuICBUaGlzIGlzIHdoZXJlIGV2ZXJ5dGhpbmcgZ2V0cyB2ZXJ5IHRyaWNreS4KKworSWYgeW91IHdhbnQgdG8gcmV0cmlldmUgdGhlIHNlcGFyYXRlIGltYWdlcyB5b3UgbXVzdCBwYXNzIHRoZSBjb3JyZWN0CitudW1iZXIgb2Ygcm93cyB0byBlYWNoIHN1Y2Nlc3NpdmUgY2FsbCBvZiBwbmdfcmVhZF9yb3dzKCkuICBUaGUgY2FsY3VsYXRpb24KK2dldHMgcHJldHR5IGNvbXBsaWNhdGVkIGZvciBzbWFsbCBpbWFnZXMsIHdoZXJlIHNvbWUgc3ViLWltYWdlcyBtYXkKK25vdCBldmVuIGV4aXN0IGJlY2F1c2UgZWl0aGVyIHRoZWlyIHdpZHRoIG9yIGhlaWdodCBlbmRzIHVwIHplcm8uCitsaWJwbmcgcHJvdmlkZXMgdHdvIG1hY3JvcyB0byBoZWxwIHlvdSBpbiAxLjUgYW5kIGxhdGVyIHZlcnNpb25zOgorCisgICBwbmdfdWludF8zMiB3aWR0aCA9IFBOR19QQVNTX0NPTFMoaW1hZ2Vfd2lkdGgsIHBhc3NfbnVtYmVyKTsKKyAgIHBuZ191aW50XzMyIGhlaWdodCA9IFBOR19QQVNTX1JPV1MoaW1hZ2VfaGVpZ2h0LCBwYXNzX251bWJlcik7CisKK1Jlc3BlY3RpdmVseSB0aGVzZSB0ZWxsIHlvdSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgc3ViLWltYWdlCitjb3JyZXNwb25kaW5nIHRvIHRoZSBudW1iZXJlZCBwYXNzLiAgJ3Bhc3MnIGlzIGluIGluIHRoZSByYW5nZSAwIHRvIDYgLQordGhpcyBjYW4gYmUgY29uZnVzaW5nIGJlY2F1c2UgdGhlIHNwZWNpZmljYXRpb24gcmVmZXJzIHRvIHRoZSBzYW1lIHBhc3NlcworYXMgMSB0byA3ISAgQmUgY2FyZWZ1bCwgeW91IG11c3QgY2hlY2sgYm90aCB0aGUgd2lkdGggYW5kIGhlaWdodCBiZWZvcmUKK2NhbGxpbmcgcG5nX3JlYWRfcm93cygpIGFuZCBub3QgY2FsbCBpdCBmb3IgdGhhdCBwYXNzIGlmIGVpdGhlciBpcyB6ZXJvLgorCitZb3UgY2FuLCBvZiBjb3Vyc2UsIHJlYWQgZWFjaCBzdWItaW1hZ2Ugcm93IGJ5IHJvdy4gIElmIHlvdSB3YW50IHRvCitwcm9kdWNlIG9wdGltYWwgY29kZSB0byBtYWtlIGEgcGl4ZWwtYnktcGl4ZWwgdHJhbnNmb3JtYXRpb24gb2YgYW4KK2ludGVybGFjZWQgaW1hZ2UgdGhpcyBpcyB0aGUgYmVzdCBhcHByb2FjaDsgcmVhZCBlYWNoIHJvdyBvZiBlYWNoIHBhc3MsCit0cmFuc2Zvcm0gaXQsIGFuZCB3cml0ZSBpdCBvdXQgdG8gYSBuZXcgaW50ZXJsYWNlZCBpbWFnZS4KKworSWYgeW91IHdhbnQgdG8gZGUtaW50ZXJsYWNlIHRoZSBpbWFnZSB5b3Vyc2VsZiBsaWJwbmcgcHJvdmlkZXMgZnVydGhlcgorbWFjcm9zIHRvIGhlbHAgdGhhdCB0ZWxsIHlvdSB3aGVyZSB0byBwbGFjZSB0aGUgcGl4ZWxzIGluIHRoZSBvdXRwdXQgaW1hZ2UuCitCZWNhdXNlIHRoZSBpbnRlcmxhY2luZyBzY2hlbWUgaXMgcmVjdGFuZ3VsYXIgLSBzdWItaW1hZ2UgcGl4ZWxzIGFyZSBhbHdheXMKK2FycmFuZ2VkIG9uIGEgcmVjdGFuZ3VsYXIgZ3JpZCAtIGFsbCB5b3UgbmVlZCB0byBrbm93IGZvciBlYWNoIHBhc3MgaXMgdGhlCitzdGFydGluZyBjb2x1bW4gYW5kIHJvdyBpbiB0aGUgb3V0cHV0IGltYWdlIG9mIHRoZSBmaXJzdCBwaXhlbCBwbHVzIHRoZQorc3BhY2luZyBiZXR3ZWVuIGVhY2ggcGl4ZWwuICBBcyBvZiBsaWJwbmcgMS41IHRoZXJlIGFyZSBmb3VyIG1hY3JvcyB0bworcmV0cmlldmUgdGhpcyBpbmZvcm1hdGlvbjoKKworICAgcG5nX3VpbnRfMzIgeCA9IFBOR19QQVNTX1NUQVJUX0NPTChwYXNzKTsKKyAgIHBuZ191aW50XzMyIHkgPSBQTkdfUEFTU19TVEFSVF9ST1cocGFzcyk7CisgICBwbmdfdWludF8zMiB4U3RlcCA9IDFVIDw8IFBOR19QQVNTX0NPTF9TSElGVChwYXNzKTsKKyAgIHBuZ191aW50XzMyIHlTdGVwID0gMVUgPDwgUE5HX1BBU1NfUk9XX1NISUZUKHBhc3MpOworCitUaGVzZSBhbGxvdyB5b3UgdG8gd3JpdGUgdGhlIG9idmlvdXMgbG9vcDoKKworICAgcG5nX3VpbnRfMzIgaW5wdXRfeSA9IDA7CisgICBwbmdfdWludF8zMiBvdXRwdXRfeSA9IFBOR19QQVNTX1NUQVJUX1JPVyhwYXNzKTsKKworICAgd2hpbGUgKG91dHB1dF95IDwgb3V0cHV0X2ltYWdlX2hlaWdodCkKKyAgIHsKKyAgICAgIHBuZ191aW50XzMyIGlucHV0X3ggPSAwOworICAgICAgcG5nX3VpbnRfMzIgb3V0cHV0X3ggPSBQTkdfUEFTU19TVEFSVF9DT0wocGFzcyk7CisKKyAgICAgIHdoaWxlIChvdXRwdXRfeCA8IG91dHB1dF9pbWFnZV93aWR0aCkKKyAgICAgIHsKKyAgICAgICAgIGltYWdlW291dHB1dF95XVtvdXRwdXRfeF0gPQorICAgICAgICAgICAgIHN1YmltYWdlW3Bhc3NdW2lucHV0X3ldW2lucHV0X3grK107CisKKyAgICAgICAgIG91dHB1dF94ICs9IHhTdGVwOworICAgICAgfQorCisgICAgICArK2lucHV0X3k7CisgICAgICBvdXRwdXRfeSArPSB5U3RlcDsKKyAgIH0KKworTm90aWNlIHRoYXQgdGhlIHN0ZXBzIGJldHdlZW4gc3VjY2Vzc2l2ZSBvdXRwdXQgcm93cyBhbmQgY29sdW1ucyBhcmUKK3JldHVybmVkIGFzIHNoaWZ0cy4gIFRoaXMgaXMgcG9zc2libGUgYmVjYXVzZSB0aGUgcGl4ZWxzIGluIHRoZSBzdWJpbWFnZXMKK2FyZSBhbHdheXMgYSBwb3dlciBvZiAyIGFwYXJ0IC0gMSwgMiwgNCBvciA4IHBpeGVscyAtIGluIHRoZSBvcmlnaW5hbAoraW1hZ2UuICBJbiBwcmFjdGljZSB5b3UgbWF5IG5lZWQgdG8gZGlyZWN0bHkgY2FsY3VsYXRlIHRoZSBvdXRwdXQgY29vcmRpbmF0ZQorZ2l2ZW4gYW4gaW5wdXQgY29vcmRpbmF0ZS4gIGxpYnBuZyBwcm92aWRlcyB0d28gZnVydGhlciBtYWNyb3MgZm9yIHRoaXMKK3B1cnBvc2U6CisKKyAgIHBuZ191aW50XzMyIG91dHB1dF94ID0gUE5HX0NPTF9GUk9NX1BBU1NfQ09MKGlucHV0X3gsIHBhc3MpOworICAgcG5nX3VpbnRfMzIgb3V0cHV0X3kgPSBQTkdfUk9XX0ZST01fUEFTU19ST1coaW5wdXRfeSwgcGFzcyk7CisKK0ZpbmFsbHkgYSBwYWlyIG9mIG1hY3JvcyBhcmUgcHJvdmlkZWQgdG8gdGVsbCB5b3UgaWYgYSBwYXJ0aWN1bGFyIGltYWdlCityb3cgb3IgY29sdW1uIGFwcGVhcnMgaW4gYSBnaXZlbiBwYXNzOgorCisgICBpbnQgY29sX2luX3Bhc3MgPSBQTkdfQ09MX0lOX0lOVEVSTEFDRV9QQVNTKG91dHB1dF94LCBwYXNzKTsKKyAgIGludCByb3dfaW5fcGFzcyA9IFBOR19ST1dfSU5fSU5URVJMQUNFX1BBU1Mob3V0cHV0X3ksIHBhc3MpOworCitCZWFyIGluIG1pbmQgdGhhdCB5b3Ugd2lsbCBwcm9iYWJseSBhbHNvIG5lZWQgdG8gY2hlY2sgdGhlIHdpZHRoIGFuZCBoZWlnaHQKK29mIHRoZSBwYXNzIGluIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSB0byBiZSBzdXJlIHRoZSBwYXNzIGV2ZW4gZXhpc3RzIQorCitXaXRoIGFueSBsdWNrIHlvdSBhcmUgY29udmluY2VkIGJ5IG5vdyB0aGF0IHlvdSBkb24ndCB3YW50IHRvIGRvIHlvdXIgb3duCitpbnRlcmxhY2UgaGFuZGxpbmcuICBJbiByZWFsaXR5IG5vcm1hbGx5IHRoZSBvbmx5IGdvb2QgcmVhc29uIGZvciBkb2luZyB0aGlzCitpcyBpZiB5b3UgYXJlIHByb2Nlc3NpbmcgUE5HIGZpbGVzIG9uIGEgcGl4ZWwtYnktcGl4ZWwgYmFzaXMgYW5kIGRvbid0IHdhbnQKK3RvIGxvYWQgdGhlIHdob2xlIGZpbGUgaW50byBtZW1vcnkgd2hlbiBpdCBpcyBpbnRlcmxhY2VkLgorCitsaWJwbmcgaW5jbHVkZXMgYSB0ZXN0IHByb2dyYW0sIHBuZ3ZhbGlkLCB0aGF0IGlsbHVzdHJhdGVzIHJlYWRpbmcgYW5kCit3cml0aW5nIG9mIGludGVybGFjZWQgaW1hZ2VzLiAgSWYgeW91IGNhbid0IGdldCBpbnRlcmxhY2luZyB0byB3b3JrIGluIHlvdXIKK2NvZGUgYW5kIGRvbid0IHdhbnQgdG8gbGVhdmUgaXQgdG8gbGlicG5nICh0aGUgcmVjb21tZW5kZWQgYXBwcm9hY2gpLCBzZWUKK2hvdyBwbmd2YWxpZC5jIGRvZXMgaXQuCisKK0ZpbmlzaGluZyBhIHNlcXVlbnRpYWwgcmVhZAorCitBZnRlciB5b3UgYXJlIGZpbmlzaGVkIHJlYWRpbmcgdGhlIGltYWdlIHRocm91Z2ggdGhlCitsb3ctbGV2ZWwgaW50ZXJmYWNlLCB5b3UgY2FuIGZpbmlzaCByZWFkaW5nIHRoZSBmaWxlLgorCitJZiB5b3Ugd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgY3JjIGFjdGlvbiBmb3IgaGFuZGxpbmcgQ1JDIGVycm9ycyBpbgorY2h1bmtzIGFmdGVyIHRoZSBpbWFnZSBkYXRhLCB5b3UgY2FuIGNhbGwgcG5nX3NldF9jcmNfYWN0aW9uKCkKK2FnYWluIGF0IHRoaXMgcG9pbnQuCisKK0lmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBjb21tZW50cyBvciB0aW1lLCB3aGljaCBtYXkgYmUgc3RvcmVkIGVpdGhlcgorYmVmb3JlIG9yIGFmdGVyIHRoZSBpbWFnZSBkYXRhLCB5b3Ugc2hvdWxkIHBhc3MgdGhlIHNlcGFyYXRlIHBuZ19pbmZvCitzdHJ1Y3QgaWYgeW91IHdhbnQgdG8ga2VlcCB0aGUgY29tbWVudHMgZnJvbSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBpbWFnZQorc2VwYXJhdGUuCisKKyAgICBwbmdfaW5mb3AgZW5kX2luZm8gPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOworCisgICAgaWYgKCFlbmRfaW5mbykKKyAgICB7CisgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwKKyAgICAgICAgICAgKHBuZ19pbmZvcHApTlVMTCk7CisgICAgICAgcmV0dXJuIChFUlJPUik7CisgICAgfQorCisgICBwbmdfcmVhZF9lbmQocG5nX3B0ciwgZW5kX2luZm8pOworCitJZiB5b3UgYXJlIG5vdCBpbnRlcmVzdGVkLCB5b3Ugc2hvdWxkIHN0aWxsIGNhbGwgcG5nX3JlYWRfZW5kKCkKK2J1dCB5b3UgY2FuIHBhc3MgTlVMTCwgYXZvaWRpbmcgdGhlIG5lZWQgdG8gY3JlYXRlIGFuIGVuZF9pbmZvIHN0cnVjdHVyZS4KK0lmIHlvdSBkbyB0aGlzLCBsaWJwbmcgd2lsbCBub3QgcHJvY2VzcyBhbnkgY2h1bmtzIGFmdGVyIElEQVQgb3RoZXIgdGhhbgorc2tpcHBpbmcgb3ZlciB0aGVtIGFuZCBwZXJoYXBzIChkZXBlbmRpbmcgb24gd2hldGhlciB5b3UgaGF2ZSBjYWxsZWQKK3BuZ19zZXRfY3JjX2FjdGlvbikgY2hlY2tpbmcgdGhlaXIgQ1JDcyB3aGlsZSBsb29raW5nIGZvciB0aGUgSUVORCBjaHVuay4KKworICAgcG5nX3JlYWRfZW5kKHBuZ19wdHIsIChwbmdfaW5mb3ApTlVMTCk7CisKK0lmIHlvdSBkb24ndCBjYWxsIHBuZ19yZWFkX2VuZCgpLCB0aGVuIHlvdXIgZmlsZSBwb2ludGVyIHdpbGwgYmUKK2xlZnQgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGNodW5rIGFmdGVyIHRoZSBsYXN0IElEQVQsIHdoaWNoIGlzIHByb2JhYmx5Citub3Qgd2hhdCB5b3Ugd2FudCBpZiB5b3UgZXhwZWN0IHRvIHJlYWQgc29tZXRoaW5nIGJleW9uZCB0aGUgZW5kIG9mCit0aGUgUE5HIGRhdGFzdHJlYW0uCisKK1doZW4geW91IGFyZSBkb25lLCB5b3UgY2FuIGZyZWUgYWxsIG1lbW9yeSBhbGxvY2F0ZWQgYnkgbGlicG5nIGxpa2UgdGhpczoKKworICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwKKyAgICAgICAmZW5kX2luZm8pOworCitvciwgaWYgeW91IGRpZG4ndCBjcmVhdGUgYW4gZW5kX2luZm8gc3RydWN0dXJlLAorCisgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLAorICAgICAgIChwbmdfaW5mb3BwKU5VTEwpOworCitJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGluZGl2aWR1YWxseSBmcmVlIHRoZSBpbmZvX3B0ciBtZW1iZXJzIHRoYXQKK3BvaW50IHRvIGxpYnBuZy1hbGxvY2F0ZWQgc3RvcmFnZSB3aXRoIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246CisKKyAgICBwbmdfZnJlZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBtYXNrLCBzZXEpCisKKyAgICBtYXNrIC0gaWRlbnRpZmllcyBkYXRhIHRvIGJlIGZyZWVkLCBhIG1hc2sKKyAgICAgICAgICAgY29udGFpbmluZyB0aGUgYml0d2lzZSBPUiBvZiBvbmUgb3IKKyAgICAgICAgICAgbW9yZSBvZgorICAgICAgICAgICAgIFBOR19GUkVFX1BMVEUsIFBOR19GUkVFX1RSTlMsCisgICAgICAgICAgICAgUE5HX0ZSRUVfSElTVCwgUE5HX0ZSRUVfSUNDUCwKKyAgICAgICAgICAgICBQTkdfRlJFRV9QQ0FMLCBQTkdfRlJFRV9ST1dTLAorICAgICAgICAgICAgIFBOR19GUkVFX1NDQUwsIFBOR19GUkVFX1NQTFQsCisgICAgICAgICAgICAgUE5HX0ZSRUVfVEVYVCwgUE5HX0ZSRUVfVU5LTiwKKyAgICAgICAgICAgb3Igc2ltcGx5IFBOR19GUkVFX0FMTAorCisgICAgc2VxICAtIHNlcXVlbmNlIG51bWJlciBvZiBpdGVtIHRvIGJlIGZyZWVkCisgICAgICAgICAgICgtMSBmb3IgYWxsIGl0ZW1zKQorCitUaGlzIGZ1bmN0aW9uIG1heSBiZSBzYWZlbHkgY2FsbGVkIHdoZW4gdGhlIHJlbGV2YW50IHN0b3JhZ2UgaGFzCithbHJlYWR5IGJlZW4gZnJlZWQsIG9yIGhhcyBub3QgeWV0IGJlZW4gYWxsb2NhdGVkLCBvciB3YXMgYWxsb2NhdGVkCitieSB0aGUgdXNlciBhbmQgbm90IGJ5IGxpYnBuZywgIGFuZCB3aWxsIGluIHRob3NlIGNhc2VzIGRvIG5vdGhpbmcuCitUaGUgInNlcSIgcGFyYW1ldGVyIGlzIGlnbm9yZWQgaWYgb25seSBvbmUgaXRlbSBvZiB0aGUgc2VsZWN0ZWQgZGF0YQordHlwZSwgc3VjaCBhcyBQTFRFLCBpcyBhbGxvd2VkLiAgSWYgInNlcSIgaXMgbm90IC0xLCBhbmQgbXVsdGlwbGUgaXRlbXMKK2FyZSBhbGxvd2VkIGZvciB0aGUgZGF0YSB0eXBlIGlkZW50aWZpZWQgaW4gdGhlIG1hc2ssIHN1Y2ggYXMgdGV4dCBvcgorc1BMVCwgb25seSB0aGUgbid0aCBpdGVtIGluIHRoZSBzdHJ1Y3R1cmUgaXMgZnJlZWQsIHdoZXJlIG4gaXMgInNlcSIuCisKK1RoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIG9ubHkgdG8gZnJlZSBkYXRhIHRoYXQgd2FzIGFsbG9jYXRlZCBpbnRlcm5hbGx5CitieSBsaWJwbmcuICBUaGlzIGNhbiBiZSBjaGFuZ2VkLCBzbyB0aGF0IGxpYnBuZyB3aWxsIG5vdCBmcmVlIHRoZSBkYXRhLAorb3Igc28gdGhhdCBpdCB3aWxsIGZyZWUgZGF0YSB0aGF0IHdhcyBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIgd2l0aCBwbmdfbWFsbG9jKCkKK29yIHBuZ19jYWxsb2MoKSBhbmQgcGFzc2VkIGluIHZpYSBhIHBuZ19zZXRfKigpIGZ1bmN0aW9uLCB3aXRoCisKKyAgICBwbmdfZGF0YV9mcmVlcihwbmdfcHRyLCBpbmZvX3B0ciwgZnJlZXIsIG1hc2spCisKKyAgICBmcmVlciAgLSBvbmUgb2YKKyAgICAgICAgICAgICAgIFBOR19ERVNUUk9ZX1dJTExfRlJFRV9EQVRBCisgICAgICAgICAgICAgICBQTkdfU0VUX1dJTExfRlJFRV9EQVRBCisgICAgICAgICAgICAgICBQTkdfVVNFUl9XSUxMX0ZSRUVfREFUQQorCisgICAgbWFzayAgIC0gd2hpY2ggZGF0YSBlbGVtZW50cyBhcmUgYWZmZWN0ZWQKKyAgICAgICAgICAgICBzYW1lIGNob2ljZXMgYXMgaW4gcG5nX2ZyZWVfZGF0YSgpCisKK1RoaXMgZnVuY3Rpb24gb25seSBhZmZlY3RzIGRhdGEgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZC4KK1lvdSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyIHJlYWRpbmcgdGhlIFBORyBkYXRhIGJ1dCBiZWZvcmUgY2FsbGluZworYW55IHBuZ19zZXRfKigpIGZ1bmN0aW9ucywgdG8gY29udHJvbCB3aGV0aGVyIHRoZSB1c2VyIG9yIHRoZSBwbmdfc2V0XyooKQorZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgYW55IGV4aXN0aW5nIGRhdGEgdGhhdCBtaWdodCBiZSBwcmVzZW50LAorYW5kIGFnYWluIGFmdGVyIHRoZSBwbmdfc2V0XyooKSBmdW5jdGlvbnMgdG8gY29udHJvbCB3aGV0aGVyIHRoZSB1c2VyCitvciBwbmdfZGVzdHJveV8qKCkgaXMgc3VwcG9zZWQgdG8gZnJlZSB0aGUgZGF0YS4gIFdoZW4gdGhlIHVzZXIgYXNzdW1lcworcmVzcG9uc2liaWxpdHkgZm9yIGxpYnBuZy1hbGxvY2F0ZWQgZGF0YSwgdGhlIGFwcGxpY2F0aW9uIG11c3QgdXNlCitwbmdfZnJlZSgpIHRvIGZyZWUgaXQsIGFuZCB3aGVuIHRoZSB1c2VyIHRyYW5zZmVycyByZXNwb25zaWJpbGl0eSB0byBsaWJwbmcKK2ZvciBkYXRhIHRoYXQgdGhlIHVzZXIgaGFzIGFsbG9jYXRlZCwgdGhlIHVzZXIgbXVzdCBoYXZlIHVzZWQgcG5nX21hbGxvYygpCitvciBwbmdfY2FsbG9jKCkgdG8gYWxsb2NhdGUgaXQuCisKK0lmIHlvdSBhbGxvY2F0ZWQgeW91ciByb3dfcG9pbnRlcnMgaW4gYSBzaW5nbGUgYmxvY2ssIGFzIHN1Z2dlc3RlZCBhYm92ZSBpbgordGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBoaWdoIGxldmVsIHJlYWQgaW50ZXJmYWNlLCB5b3UgbXVzdCBub3QgdHJhbnNmZXIKK3Jlc3BvbnNpYmlsaXR5IGZvciBmcmVlaW5nIGl0IHRvIHRoZSBwbmdfc2V0X3Jvd3Mgb3IgcG5nX3JlYWRfZGVzdHJveSBmdW5jdGlvbiwKK2JlY2F1c2UgdGhleSB3b3VsZCBhbHNvIHRyeSB0byBmcmVlIHRoZSBpbmRpdmlkdWFsIHJvd19wb2ludGVyc1tpXS4KKworSWYgeW91IGFsbG9jYXRlZCB0ZXh0X3B0ci50ZXh0LCB0ZXh0X3B0ci5sYW5nLCBhbmQgdGV4dF9wdHIudHJhbnNsYXRlZF9rZXl3b3JkCitzZXBhcmF0ZWx5LCBkbyBub3QgdHJhbnNmZXIgcmVzcG9uc2liaWxpdHkgZm9yIGZyZWVpbmcgdGV4dF9wdHIgdG8gbGlicG5nLAorYmVjYXVzZSB3aGVuIGxpYnBuZyBmaWxscyBhIHBuZ190ZXh0IHN0cnVjdHVyZSBpdCBjb21iaW5lcyB0aGVzZSBtZW1iZXJzIHdpdGgKK3RoZSBrZXkgbWVtYmVyLCBhbmQgcG5nX2ZyZWVfZGF0YSgpIHdpbGwgZnJlZSBvbmx5IHRleHRfcHRyLmtleS4gIFNpbWlsYXJseSwKK2lmIHlvdSB0cmFuc2ZlciByZXNwb25zaWJpbGl0eSBmb3IgZnJlZSdpbmcgdGV4dF9wdHIgZnJvbSBsaWJwbmcgdG8geW91cgorYXBwbGljYXRpb24sIHlvdXIgYXBwbGljYXRpb24gbXVzdCBub3Qgc2VwYXJhdGVseSBmcmVlIHRob3NlIG1lbWJlcnMuCisKK1RoZSBwbmdfZnJlZV9kYXRhKCkgZnVuY3Rpb24gd2lsbCB0dXJuIG9mZiB0aGUgInZhbGlkIiBmbGFnIGZvciBhbnl0aGluZworaXQgZnJlZXMuICBJZiB5b3UgbmVlZCB0byB0dXJuIHRoZSBmbGFnIG9mZiBmb3IgYSBjaHVuayB0aGF0IHdhcyBmcmVlZCBieQoreW91ciBhcHBsaWNhdGlvbiBpbnN0ZWFkIG9mIGJ5IGxpYnBuZywgeW91IGNhbiB1c2UKKworICAgIHBuZ19zZXRfaW52YWxpZChwbmdfcHRyLCBpbmZvX3B0ciwgbWFzayk7CisKKyAgICBtYXNrIC0gaWRlbnRpZmllcyB0aGUgY2h1bmtzIHRvIGJlIG1hZGUgaW52YWxpZCwKKyAgICAgICAgICAgY29udGFpbmluZyB0aGUgYml0d2lzZSBPUiBvZiBvbmUgb3IKKyAgICAgICAgICAgbW9yZSBvZgorICAgICAgICAgICAgIFBOR19JTkZPX2dBTUEsIFBOR19JTkZPX3NCSVQsCisgICAgICAgICAgICAgUE5HX0lORk9fY0hSTSwgUE5HX0lORk9fUExURSwKKyAgICAgICAgICAgICBQTkdfSU5GT190Uk5TLCBQTkdfSU5GT19iS0dELAorICAgICAgICAgICAgIFBOR19JTkZPX2hJU1QsIFBOR19JTkZPX3BIWXMsCisgICAgICAgICAgICAgUE5HX0lORk9fb0ZGcywgUE5HX0lORk9fdElNRSwKKyAgICAgICAgICAgICBQTkdfSU5GT19wQ0FMLCBQTkdfSU5GT19zUkdCLAorICAgICAgICAgICAgIFBOR19JTkZPX2lDQ1AsIFBOR19JTkZPX3NQTFQsCisgICAgICAgICAgICAgUE5HX0lORk9fc0NBTCwgUE5HX0lORk9fSURBVAorCitGb3IgYSBtb3JlIGNvbXBhY3QgZXhhbXBsZSBvZiByZWFkaW5nIGEgUE5HIGltYWdlLCBzZWUgdGhlIGZpbGUgZXhhbXBsZS5jLgorCitSZWFkaW5nIFBORyBmaWxlcyBwcm9ncmVzc2l2ZWx5CisKK1RoZSBwcm9ncmVzc2l2ZSByZWFkZXIgaXMgc2xpZ2h0bHkgZGlmZmVyZW50IGZyb20gdGhlIG5vbi1wcm9ncmVzc2l2ZQorcmVhZGVyLiAgSW5zdGVhZCBvZiBjYWxsaW5nIHBuZ19yZWFkX2luZm8oKSwgcG5nX3JlYWRfcm93cygpLCBhbmQKK3BuZ19yZWFkX2VuZCgpLCB5b3UgbWFrZSBvbmUgY2FsbCB0byBwbmdfcHJvY2Vzc19kYXRhKCksIHdoaWNoIGNhbGxzCitjYWxsYmFja3Mgd2hlbiBpdCBoYXMgdGhlIGluZm8sIGEgcm93LCBvciB0aGUgZW5kIG9mIHRoZSBpbWFnZS4gIFlvdQorc2V0IHVwIHRoZXNlIGNhbGxiYWNrcyB3aXRoIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbigpLiAgWW91IGRvbid0CitoYXZlIHRvIHdvcnJ5IGFib3V0IHRoZSBpbnB1dC9vdXRwdXQgZnVuY3Rpb25zIG9mIGxpYnBuZywgYXMgeW91IGFyZQorZ2l2aW5nIHRoZSBsaWJyYXJ5IHRoZSBkYXRhIGRpcmVjdGx5IGluIHBuZ19wcm9jZXNzX2RhdGEoKS4gIEkgd2lsbAorYXNzdW1lIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgc2VjdGlvbiBvbiByZWFkaW5nIFBORyBmaWxlcyBhYm92ZSwKK3NvIEkgd2lsbCBvbmx5IGhpZ2hsaWdodCB0aGUgZGlmZmVyZW5jZXMgKGFsdGhvdWdoIEkgd2lsbCBzaG93CithbGwgb2YgdGhlIGNvZGUpLgorCitwbmdfc3RydWN0cCBwbmdfcHRyOworcG5nX2luZm9wIGluZm9fcHRyOworCisgLyogIEFuIGV4YW1wbGUgY29kZSBmcmFnbWVudCBvZiBob3cgeW91IHdvdWxkCisgICAgIGluaXRpYWxpemUgdGhlIHByb2dyZXNzaXZlIHJlYWRlciBpbiB5b3VyCisgICAgIGFwcGxpY2F0aW9uLiAqLworIGludAorIGluaXRpYWxpemVfcG5nX3JlYWRlcigpCisgeworICAgIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0CisgICAgICAgIChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIChwbmdfdm9pZHApdXNlcl9lcnJvcl9wdHIsCisgICAgICAgICB1c2VyX2Vycm9yX2ZuLCB1c2VyX3dhcm5pbmdfZm4pOworCisgICAgaWYgKCFwbmdfcHRyKQorICAgICAgICByZXR1cm4gKEVSUk9SKTsKKworICAgIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKKworICAgIGlmICghaW5mb19wdHIpCisgICAgeworICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLAorICAgICAgICAgIChwbmdfaW5mb3BwKU5VTEwsIChwbmdfaW5mb3BwKU5VTEwpOworICAgICAgIHJldHVybiAoRVJST1IpOworICAgIH0KKworICAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpCisgICAgeworICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsCisgICAgICAgICAgKHBuZ19pbmZvcHApTlVMTCk7CisgICAgICAgcmV0dXJuIChFUlJPUik7CisgICAgfQorCisgICAgLyogVGhpcyBvbmUncyBuZXcuICBZb3UgY2FuIHByb3ZpZGUgZnVuY3Rpb25zCisgICAgICAgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGhlYWRlciBpbmZvIGlzIHZhbGlkLAorICAgICAgIHdoZW4gZWFjaCByb3cgaXMgY29tcGxldGVkLCBhbmQgd2hlbiB0aGUgaW1hZ2UKKyAgICAgICBpcyBmaW5pc2hlZC4gIElmIHlvdSBhcmVuJ3QgdXNpbmcgYWxsIGZ1bmN0aW9ucywKKyAgICAgICB5b3UgY2FuIHNwZWNpZnkgTlVMTCBwYXJhbWV0ZXJzLiAgRXZlbiB3aGVuIGFsbAorICAgICAgIHRocmVlIGZ1bmN0aW9ucyBhcmUgTlVMTCwgeW91IG5lZWQgdG8gY2FsbAorICAgICAgIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbigpLiAgWW91IGNhbiB1c2UKKyAgICAgICBhbnkgc3RydWN0IGFzIHRoZSB1c2VyX3B0ciAoY2FzdCB0byBhIHZvaWQgcG9pbnRlcgorICAgICAgIGZvciB0aGUgZnVuY3Rpb24gY2FsbCksIGFuZCByZXRyaWV2ZSB0aGUgcG9pbnRlcgorICAgICAgIGZyb20gaW5zaWRlIHRoZSBjYWxsYmFja3MgdXNpbmcgdGhlIGZ1bmN0aW9uCisKKyAgICAgICAgICBwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0cihwbmdfcHRyKTsKKworICAgICAgIHdoaWNoIHdpbGwgcmV0dXJuIGEgdm9pZCBwb2ludGVyLCB3aGljaCB5b3UgaGF2ZQorICAgICAgIHRvIGNhc3QgYXBwcm9wcmlhdGVseS4KKyAgICAgKi8KKyAgICBwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4ocG5nX3B0ciwgKHZvaWQgKil1c2VyX3B0ciwKKyAgICAgICAgaW5mb19jYWxsYmFjaywgcm93X2NhbGxiYWNrLCBlbmRfY2FsbGJhY2spOworCisgICAgcmV0dXJuIDA7CisgfQorCisgLyogQSBjb2RlIGZyYWdtZW50IHRoYXQgeW91IGNhbGwgYXMgeW91IHJlY2VpdmUgYmxvY2tzCisgICBvZiBkYXRhICovCisgaW50CisgcHJvY2Vzc19kYXRhKHBuZ19ieXRlcCBidWZmZXIsIHBuZ191aW50XzMyIGxlbmd0aCkKKyB7CisgICAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZ19wdHIpKSkKKyAgICB7CisgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwKKyAgICAgICAgICAgKHBuZ19pbmZvcHApTlVMTCk7CisgICAgICAgcmV0dXJuIChFUlJPUik7CisgICAgfQorCisgICAgLyogVGhpcyBvbmUncyBuZXcgYWxzby4gIFNpbXBseSBnaXZlIGl0IGEgY2h1bmsKKyAgICAgICBvZiBkYXRhIGZyb20gdGhlIGZpbGUgc3RyZWFtIChpbiBvcmRlciwgb2YKKyAgICAgICBjb3Vyc2UpLiAgT24gbWFjaGluZXMgd2l0aCBzZWdtZW50ZWQgbWVtb3J5CisgICAgICAgbW9kZWxzIG1hY2hpbmVzLCBkb24ndCBnaXZlIGl0IGFueSBtb3JlIHRoYW4KKyAgICAgICA2NEsuICBUaGUgbGlicmFyeSBzZWVtcyB0byBydW4gZmluZSB3aXRoIHNpemVzCisgICAgICAgb2YgNEsuIEFsdGhvdWdoIHlvdSBjYW4gZ2l2ZSBpdCBtdWNoIGxlc3MgaWYKKyAgICAgICBuZWNlc3NhcnkgKEkgYXNzdW1lIHlvdSBjYW4gZ2l2ZSBpdCBjaHVua3Mgb2YKKyAgICAgICAxIGJ5dGUsIEkgaGF2ZW4ndCB0cmllZCBsZXNzIHRoYW4gMjU2IGJ5dGVzCisgICAgICAgeWV0KS4gIFdoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zLCB5b3UgbWF5CisgICAgICAgd2FudCB0byBkaXNwbGF5IGFueSByb3dzIHRoYXQgd2VyZSBnZW5lcmF0ZWQKKyAgICAgICBpbiB0aGUgcm93IGNhbGxiYWNrIGlmIHlvdSBkb24ndCBhbHJlYWR5IGRvCisgICAgICAgc28gdGhlcmUuCisgICAgICovCisgICAgcG5nX3Byb2Nlc3NfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgYnVmZmVyLCBsZW5ndGgpOworCisgICAgLyogQXQgdGhpcyBwb2ludCB5b3UgY2FuIGNhbGwgcG5nX3Byb2Nlc3NfZGF0YV9za2lwIGlmCisgICAgICAgeW91IHdhbnQgdG8gaGFuZGxlIGRhdGEgdGhlIGxpYnJhcnkgd2lsbCBza2lwIHlvdXJzZWxmOworICAgICAgIGl0IHNpbXBseSByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcCAoYW5kIHN0b3BzCisgICAgICAgbGlicG5nIHNraXBwaW5nIHRoYXQgbnVtYmVyIG9mIGJ5dGVzIG9uIHRoZSBuZXh0CisgICAgICAgcG5nX3Byb2Nlc3NfZGF0YSBjYWxsKS4KKyAgICByZXR1cm4gMDsKKyB9CisKKyAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAoYXMgc2V0IGJ5CisgICAgcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKCkgYWJvdmUpIHdoZW4gZW5vdWdoIGRhdGEKKyAgICBoYXMgYmVlbiBzdXBwbGllZCBzbyBhbGwgb2YgdGhlIGhlYWRlciBoYXMgYmVlbgorICAgIHJlYWQuCisgKi8KKyB2b2lkCisgaW5mb19jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mbykKKyB7CisgICAgLyogRG8gYW55IHNldHVwIGhlcmUsIGluY2x1ZGluZyBzZXR0aW5nIGFueSBvZgorICAgICAgIHRoZSB0cmFuc2Zvcm1hdGlvbnMgbWVudGlvbmVkIGluIHRoZSBSZWFkaW5nCisgICAgICAgUE5HIGZpbGVzIHNlY3Rpb24uICBGb3Igbm93LCB5b3UgX211c3RfIGNhbGwKKyAgICAgICBlaXRoZXIgcG5nX3N0YXJ0X3JlYWRfaW1hZ2UoKSBvcgorICAgICAgIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCkgYWZ0ZXIgYWxsIHRoZQorICAgICAgIHRyYW5zZm9ybWF0aW9ucyBhcmUgc2V0IChldmVuIGlmIHlvdSBkb24ndCBzZXQKKyAgICAgICBhbnkpLiAgWW91IG1heSBzdGFydCBnZXR0aW5nIHJvd3MgYmVmb3JlCisgICAgICAgcG5nX3Byb2Nlc3NfZGF0YSgpIHJldHVybnMsIHNvIHRoaXMgaXMgeW91cgorICAgICAgIGxhc3QgY2hhbmNlIHRvIHByZXBhcmUgZm9yIHRoYXQuCisKKyAgICAgICBUaGlzIGlzIHdoZXJlIHlvdSB0dXJuIG9uIGludGVybGFjZSBoYW5kbGluZywKKyAgICAgICBhc3N1bWluZyB5b3UgZG9uJ3Qgd2FudCB0byBkbyBpdCB5b3Vyc2VsZi4KKworICAgICAgIElmIHlvdSBuZWVkIHRvIHlvdSBjYW4gc3RvcCB0aGUgcHJvY2Vzc2luZyBvZgorICAgICAgIHlvdXIgb3JpZ2luYWwgaW5wdXQgZGF0YSBhdCB0aGlzIHBvaW50IGJ5IGNhbGxpbmcKKyAgICAgICBwbmdfcHJvY2Vzc19kYXRhX3BhdXNlLiAgVGhpcyByZXR1cm5zIHRoZSBudW1iZXIKKyAgICAgICBvZiB1bnByb2Nlc3NlZCBieXRlcyBmcm9tIHRoZSBsYXN0IHBuZ19wcm9jZXNzX2RhdGEKKyAgICAgICBjYWxsIC0gaXQgaXMgdXAgdG8geW91IHRvIGVuc3VyZSB0aGF0IHRoZSBuZXh0IGNhbGwKKyAgICAgICBzZWVzIHRoZXNlIGJ5dGVzIGFnYWluLiAgSWYgeW91IGRvbid0IHdhbnQgdG8gYm90aGVyCisgICAgICAgd2l0aCB0aGlzIHlvdSBjYW4gZ2V0IGxpYnBuZyB0byBjYWNoZSB0aGUgdW5yZWFkCisgICAgICAgYnl0ZXMgYnkgc2V0dGluZyB0aGUgJ3NhdmUnIHBhcmFtZXRlciAoc2VlIHBuZy5oKSBidXQKKyAgICAgICB0aGVuIGxpYnBuZyB3aWxsIGhhdmUgdG8gY29weSB0aGUgZGF0YSBpbnRlcm5hbGx5LgorICAgICAqLworIH0KKworIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gZWFjaCByb3cgb2YgaW1hZ2UKKyAgICBkYXRhIGlzIGNvbXBsZXRlICovCisgdm9pZAorIHJvd19jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgbmV3X3JvdywKKyAgICBwbmdfdWludF8zMiByb3dfbnVtLCBpbnQgcGFzcykKKyB7CisgICAgLyogSWYgdGhlIGltYWdlIGlzIGludGVybGFjZWQsIGFuZCB5b3UgdHVybmVkCisgICAgICAgb24gdGhlIGludGVybGFjZSBoYW5kbGVyLCB0aGlzIGZ1bmN0aW9uIHdpbGwKKyAgICAgICBiZSBjYWxsZWQgZm9yIGV2ZXJ5IHJvdyBpbiBldmVyeSBwYXNzLiAgU29tZQorICAgICAgIG9mIHRoZXNlIHJvd3Mgd2lsbCBub3QgYmUgY2hhbmdlZCBmcm9tIHRoZQorICAgICAgIHByZXZpb3VzIHBhc3MuICBXaGVuIHRoZSByb3cgaXMgbm90IGNoYW5nZWQsCisgICAgICAgdGhlIG5ld19yb3cgdmFyaWFibGUgd2lsbCBiZSBOVUxMLiAgVGhlIHJvd3MKKyAgICAgICBhbmQgcGFzc2VzIGFyZSBjYWxsZWQgaW4gb3JkZXIsIHNvIHlvdSBkb24ndAorICAgICAgIHJlYWxseSBuZWVkIHRoZSByb3dfbnVtIGFuZCBwYXNzLCBidXQgSSdtCisgICAgICAgc3VwcGx5aW5nIHRoZW0gYmVjYXVzZSBpdCBtYXkgbWFrZSB5b3VyIGxpZmUKKyAgICAgICBlYXNpZXIuCisKKyAgICAgICBJZiB5b3UgZGlkIG5vdCB0dXJuIG9uIGludGVybGFjZSBoYW5kbGluZyB0aGVuCisgICAgICAgdGhlIGNhbGxiYWNrIGlzIGNhbGxlZCBmb3IgZWFjaCByb3cgb2YgZWFjaAorICAgICAgIHN1Yi1pbWFnZSB3aGVuIHRoZSBpbWFnZSBpcyBpbnRlcmxhY2VkLiAgSW4gdGhpcworICAgICAgIGNhc2UgJ3Jvd19udW0nIGlzIHRoZSByb3cgaW4gdGhlIHN1Yi1pbWFnZSwgbm90CisgICAgICAgdGhlIHJvdyBpbiB0aGUgb3V0cHV0IGltYWdlIGFzIGl0IGlzIGluIGFsbCBvdGhlcgorICAgICAgIGNhc2VzLgorCisgICAgICAgRm9yIHRoZSBub24tTlVMTCByb3dzIG9mIGludGVybGFjZWQgaW1hZ2VzIHdoZW4KKyAgICAgICB5b3UgaGF2ZSBzd2l0Y2hlZCBvbiBsaWJwbmcgaW50ZXJsYWNlIGhhbmRsaW5nLAorICAgICAgIHlvdSBtdXN0IGNhbGwgcG5nX3Byb2dyZXNzaXZlX2NvbWJpbmVfcm93KCkKKyAgICAgICBwYXNzaW5nIGluIHRoZSByb3cgYW5kIHRoZSBvbGQgcm93LiAgWW91IGNhbgorICAgICAgIGNhbGwgdGhpcyBmdW5jdGlvbiBmb3IgTlVMTCByb3dzIChpdCB3aWxsIGp1c3QKKyAgICAgICByZXR1cm4pIGFuZCBmb3Igbm9uLWludGVybGFjZWQgaW1hZ2VzIChpdCBqdXN0CisgICAgICAgZG9lcyB0aGUgbWVtY3B5IGZvciB5b3UpIGlmIGl0IHdpbGwgbWFrZSB0aGUKKyAgICAgICBjb2RlIGVhc2llci4gIFRodXMsIHlvdSBjYW4ganVzdCBkbyB0aGlzIGZvcgorICAgICAgIGFsbCBjYXNlcyBpZiB5b3Ugc3dpdGNoIG9uIGludGVybGFjZSBoYW5kbGluZzsKKyAgICAgKi8KKworICAgICAgICBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3cocG5nX3B0ciwgb2xkX3JvdywKKyAgICAgICAgICBuZXdfcm93KTsKKworICAgIC8qIHdoZXJlIG9sZF9yb3cgaXMgd2hhdCB3YXMgZGlzcGxheWVkCisgICAgICAgcHJldmlvdXNseSBmb3IgdGhlIHJvdy4gIE5vdGUgdGhhdCB0aGUgZmlyc3QKKyAgICAgICBwYXNzIChwYXNzID09IDAsIHJlYWxseSkgd2lsbCBjb21wbGV0ZWx5IGNvdmVyCisgICAgICAgdGhlIG9sZCByb3csIHNvIHRoZSByb3dzIGRvIG5vdCBoYXZlIHRvIGJlCisgICAgICAgaW5pdGlhbGl6ZWQuICBBZnRlciB0aGUgZmlyc3QgcGFzcyAoYW5kIG9ubHkKKyAgICAgICBmb3IgaW50ZXJsYWNlZCBpbWFnZXMpLCB5b3Ugd2lsbCBoYXZlIHRvIHBhc3MKKyAgICAgICB0aGUgY3VycmVudCByb3csIGFuZCB0aGUgZnVuY3Rpb24gd2lsbCBjb21iaW5lCisgICAgICAgdGhlIG9sZCByb3cgYW5kIHRoZSBuZXcgcm93LgorCisgICAgICAgWW91IGNhbiBhbHNvIGNhbGwgcG5nX3Byb2Nlc3NfZGF0YV9wYXVzZSBpbiB0aGlzCisgICAgICAgY2FsbGJhY2sgLSBzZWUgYWJvdmUuCisgICAgKi8KKyB9CisKKyB2b2lkCisgZW5kX2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvKQorIHsKKyAgICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgd2hvbGUgaW1hZ2UKKyAgICAgICBoYXMgYmVlbiByZWFkLCBpbmNsdWRpbmcgYW55IGNodW5rcyBhZnRlciB0aGUKKyAgICAgICBpbWFnZSAodXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgSUVORCkuICBZb3UKKyAgICAgICB3aWxsIHVzdWFsbHkgaGF2ZSB0aGUgc2FtZSBpbmZvIGNodW5rIGFzIHlvdQorICAgICAgIGhhZCBpbiB0aGUgaGVhZGVyLCBhbHRob3VnaCBzb21lIGRhdGEgbWF5IGhhdmUKKyAgICAgICBiZWVuIGFkZGVkIHRvIHRoZSBjb21tZW50cyBhbmQgdGltZSBmaWVsZHMuCisKKyAgICAgICBNb3N0IHBlb3BsZSB3b24ndCBkbyBtdWNoIGhlcmUsIHBlcmhhcHMgc2V0dGluZworICAgICAgIGEgZmxhZyB0aGF0IG1hcmtzIHRoZSBpbWFnZSBhcyBmaW5pc2hlZC4KKyAgICAgKi8KKyB9CisKKworCitJVi4gV3JpdGluZworCitNdWNoIG9mIHRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIHJlYWRpbmcuICBIb3dldmVyLCBldmVyeXRoaW5nIG9mCitpbXBvcnRhbmNlIGlzIHJlcGVhdGVkIGhlcmUsIHNvIHlvdSB3b24ndCBoYXZlIHRvIGNvbnN0YW50bHkgbG9vaworYmFjayB1cCBpbiB0aGUgcmVhZGluZyBzZWN0aW9uIHRvIHVuZGVyc3RhbmQgd3JpdGluZy4KKworU2V0dXAKKworWW91IHdpbGwgd2FudCB0byBkbyB0aGUgSS9PIGluaXRpYWxpemF0aW9uIGJlZm9yZSB5b3UgZ2V0IGludG8gbGlicG5nLAorc28gaWYgaXQgZG9lc24ndCB3b3JrLCB5b3UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0byB1bmRvLiBJZiB5b3UgYXJlIG5vdAordXNpbmcgdGhlIHN0YW5kYXJkIEkvTyBmdW5jdGlvbnMsIHlvdSB3aWxsIG5lZWQgdG8gcmVwbGFjZSB0aGVtIHdpdGgKK2N1c3RvbSB3cml0aW5nIGZ1bmN0aW9ucy4gIFNlZSB0aGUgZGlzY3Vzc2lvbiB1bmRlciBDdXN0b21pemluZyBsaWJwbmcuCisKKyAgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVfbmFtZSwgIndiIik7CisKKyAgICBpZiAoIWZwKQorICAgICAgIHJldHVybiAoRVJST1IpOworCitOZXh0LCBwbmdfc3RydWN0IGFuZCBwbmdfaW5mbyBuZWVkIHRvIGJlIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQuCitBcyB0aGVzZSBjYW4gYmUgYm90aCByZWxhdGl2ZWx5IGxhcmdlLCB5b3UgbWF5IG5vdCB3YW50IHRvIHN0b3JlIHRoZXNlCitvbiB0aGUgc3RhY2ssIHVubGVzcyB5b3UgaGF2ZSBzdGFjayBzcGFjZSB0byBzcGFyZS4gIE9mIGNvdXJzZSwgeW91Cit3aWxsIHdhbnQgdG8gY2hlY2sgaWYgdGhleSByZXR1cm4gTlVMTC4gIElmIHlvdSBhcmUgYWxzbyByZWFkaW5nLAoreW91IHdvbid0IHdhbnQgdG8gbmFtZSB5b3VyIHJlYWQgc3RydWN0dXJlIGFuZCB5b3VyIHdyaXRlIHN0cnVjdHVyZQorYm90aCAicG5nX3B0ciI7IHlvdSBjYW4gY2FsbCB0aGVtIGFueXRoaW5nIHlvdSBsaWtlLCBzdWNoIGFzCisicmVhZF9wdHIiIGFuZCAid3JpdGVfcHRyIi4gIExvb2sgYXQgcG5ndGVzdC5jLCBmb3IgZXhhbXBsZS4KKworICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdAorICAgICAgIChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIChwbmdfdm9pZHApdXNlcl9lcnJvcl9wdHIsCisgICAgICAgIHVzZXJfZXJyb3JfZm4sIHVzZXJfd2FybmluZ19mbik7CisKKyAgICBpZiAoIXBuZ19wdHIpCisgICAgICAgcmV0dXJuIChFUlJPUik7CisKKyAgICBwbmdfaW5mb3AgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOworICAgIGlmICghaW5mb19wdHIpCisgICAgeworICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwKKyAgICAgICAgICAgKHBuZ19pbmZvcHApTlVMTCk7CisgICAgICAgcmV0dXJuIChFUlJPUik7CisgICAgfQorCitJZiB5b3Ugd2FudCB0byB1c2UgeW91ciBvd24gbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMsCitkZWZpbmUgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCBhbmQgdXNlCitwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdF8yKCkgaW5zdGVhZCBvZiBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCgpOgorCisgICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0XzIKKyAgICAgICAoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCAocG5nX3ZvaWRwKXVzZXJfZXJyb3JfcHRyLAorICAgICAgICB1c2VyX2Vycm9yX2ZuLCB1c2VyX3dhcm5pbmdfZm4sIChwbmdfdm9pZHApCisgICAgICAgIHVzZXJfbWVtX3B0ciwgdXNlcl9tYWxsb2NfZm4sIHVzZXJfZnJlZV9mbik7CisKK0FmdGVyIHlvdSBoYXZlIHRoZXNlIHN0cnVjdHVyZXMsIHlvdSB3aWxsIG5lZWQgdG8gc2V0IHVwIHRoZQorZXJyb3IgaGFuZGxpbmcuICBXaGVuIGxpYnBuZyBlbmNvdW50ZXJzIGFuIGVycm9yLCBpdCBleHBlY3RzIHRvCitsb25nam1wKCkgYmFjayB0byB5b3VyIHJvdXRpbmUuICBUaGVyZWZvcmUsIHlvdSB3aWxsIG5lZWQgdG8gY2FsbAorc2V0am1wKCkgYW5kIHBhc3MgdGhlIHBuZ19qbXBidWYocG5nX3B0cikuICBJZiB5b3UKK3dyaXRlIHRoZSBmaWxlIGZyb20gZGlmZmVyZW50IHJvdXRpbmVzLCB5b3Ugd2lsbCBuZWVkIHRvIHVwZGF0ZQordGhlIHBuZ19qbXBidWYocG5nX3B0cikgZXZlcnkgdGltZSB5b3UgZW50ZXIgYSBuZXcgcm91dGluZSB0aGF0IHdpbGwKK2NhbGwgYSBwbmdfKigpIGZ1bmN0aW9uLiAgU2VlIHlvdXIgZG9jdW1lbnRhdGlvbiBvZiBzZXRqbXAvbG9uZ2ptcAorZm9yIHlvdXIgY29tcGlsZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc2V0am1wL2xvbmdqbXAuICBTZWUKK3RoZSBkaXNjdXNzaW9uIG9uIGxpYnBuZyBlcnJvciBoYW5kbGluZyBpbiB0aGUgQ3VzdG9taXppbmcgTGlicG5nCitzZWN0aW9uIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBsaWJwbmcgZXJyb3IgaGFuZGxpbmcuCisKKyAgICBpZiAoc2V0am1wKHBuZ19qbXBidWYocG5nX3B0cikpKQorICAgIHsKKyAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0cik7CisgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICByZXR1cm4gKEVSUk9SKTsKKyAgICB9CisgICAgLi4uCisgICAgcmV0dXJuOworCitJZiB5b3Ugd291bGQgcmF0aGVyIGF2b2lkIHRoZSBjb21wbGV4aXR5IG9mIHNldGptcC9sb25nam1wIGlzc3VlcywKK3lvdSBjYW4gY29tcGlsZSBsaWJwbmcgd2l0aCBQTkdfTk9fU0VUSk1QLCBpbiB3aGljaCBjYXNlCitlcnJvcnMgd2lsbCByZXN1bHQgaW4gYSBjYWxsIHRvIFBOR19BQk9SVCgpIHdoaWNoIGRlZmF1bHRzIHRvIGFib3J0KCkuCisKK1lvdSBjYW4gI2RlZmluZSBQTkdfQUJPUlQoKSB0byBhIGZ1bmN0aW9uIHRoYXQgZG9lcyBzb21ldGhpbmcKK21vcmUgdXNlZnVsIHRoYW4gYWJvcnQoKSwgYXMgbG9uZyBhcyB5b3VyIGZ1bmN0aW9uIGRvZXMgbm90CityZXR1cm4uCisKK0NoZWNraW5nIGZvciBpbnZhbGlkIHBhbGV0dGUgaW5kZXggb24gd3JpdGUgd2FzIGFkZGVkIGF0IGxpYnBuZworMS41LjEwLiAgSWYgYSBwaXhlbCBjb250YWlucyBhbiBpbnZhbGlkIChvdXQtb2YtcmFuZ2UpIGluZGV4IGxpYnBuZyBpc3N1ZXMKK2EgYmVuaWduIGVycm9yLiAgVGhpcyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgYmVjYXVzZSB0aGlzIGNvbmRpdGlvbiBpcyBhbgorZXJyb3IgYWNjb3JkaW5nIHRvIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiwgQ2xhdXNlIDExLjMuMiwgYnV0IHRoZSBlcnJvciBjYW4KK2JlIGlnbm9yZWQgaW4gZWFjaCBwbmdfcHRyIHdpdGgKKworICAgcG5nX3NldF9jaGVja19mb3JfaW52YWxpZF9pbmRleChwbmdfcHRyLCAwKTsKKworSWYgdGhlIGVycm9yIGlzIGlnbm9yZWQsIG9yIGlmIHBuZ19iZW5pZ25fZXJyb3IoKSB0cmVhdHMgaXQgYXMgYSB3YXJuaW5nLAorYW55IGludmFsaWQgcGl4ZWxzIGFyZSB3cml0dGVuIGFzLWlzIGJ5IHRoZSBlbmNvZGVyLCByZXN1bHRpbmcgaW4gYW4KK2ludmFsaWQgUE5HIGRhdGFzdHJlYW0gYXMgb3V0cHV0LiAgSW4gdGhpcyBjYXNlIHRoZSBhcHBsaWNhdGlvbiBpcworcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIHBpeGVsIGluZGV4ZXMgYXJlIGluIHJhbmdlIHdoZW4gaXQgd3JpdGVzCithIFBMVEUgY2h1bmsgd2l0aCBmZXdlciBlbnRyaWVzIHRoYW4gdGhlIGJpdCBkZXB0aCB3b3VsZCBhbGxvdy4KKworTm93IHlvdSBuZWVkIHRvIHNldCB1cCB0aGUgb3V0cHV0IGNvZGUuICBUaGUgZGVmYXVsdCBmb3IgbGlicG5nIGlzIHRvCit1c2UgdGhlIEMgZnVuY3Rpb24gZndyaXRlKCkuICBJZiB5b3UgdXNlIHRoaXMsIHlvdSB3aWxsIG5lZWQgdG8gcGFzcyBhCit2YWxpZCBGSUxFICogaW4gdGhlIGZ1bmN0aW9uIHBuZ19pbml0X2lvKCkuICBCZSBzdXJlIHRoYXQgdGhlIGZpbGUgaXMKK29wZW5lZCBpbiBiaW5hcnkgbW9kZS4gIEFnYWluLCBpZiB5b3Ugd2lzaCB0byBoYW5kbGUgd3JpdGluZyBkYXRhIGluCithbm90aGVyIHdheSwgc2VlIHRoZSBkaXNjdXNzaW9uIG9uIGxpYnBuZyBJL08gaGFuZGxpbmcgaW4gdGhlIEN1c3RvbWl6aW5nCitMaWJwbmcgc2VjdGlvbiBiZWxvdy4KKworICAgIHBuZ19pbml0X2lvKHBuZ19wdHIsIGZwKTsKKworSWYgeW91IGFyZSBlbWJlZGRpbmcgeW91ciBQTkcgaW50byBhIGRhdGFzdHJlYW0gc3VjaCBhcyBNTkcsIGFuZCBkb24ndAord2FudCBsaWJwbmcgdG8gd3JpdGUgdGhlIDgtYnl0ZSBzaWduYXR1cmUsIG9yIGlmIHlvdSBoYXZlIGFscmVhZHkKK3dyaXR0ZW4gdGhlIHNpZ25hdHVyZSBpbiB5b3VyIGFwcGxpY2F0aW9uLCB1c2UKKworICAgIHBuZ19zZXRfc2lnX2J5dGVzKHBuZ19wdHIsIDgpOworCit0byBpbmZvcm0gbGlicG5nIHRoYXQgaXQgc2hvdWxkIG5vdCB3cml0ZSBhIHNpZ25hdHVyZS4KKworV3JpdGUgY2FsbGJhY2tzCisKK0F0IHRoaXMgcG9pbnQsIHlvdSBjYW4gc2V0IHVwIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIGJlCitjYWxsZWQgYWZ0ZXIgZWFjaCByb3cgaGFzIGJlZW4gd3JpdHRlbiwgd2hpY2ggeW91IGNhbiB1c2UgdG8gY29udHJvbAorYSBwcm9ncmVzcyBtZXRlciBvciB0aGUgbGlrZS4gIEl0J3MgZGVtb25zdHJhdGVkIGluIHBuZ3Rlc3QuYy4KK1lvdSBtdXN0IHN1cHBseSBhIGZ1bmN0aW9uCisKKyAgICB2b2lkIHdyaXRlX3Jvd19jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdWludF8zMiByb3csCisgICAgICAgaW50IHBhc3MpOworICAgIHsKKyAgICAgIC8qIHB1dCB5b3VyIGNvZGUgaGVyZSAqLworICAgIH0KKworKFlvdSBjYW4gZ2l2ZSBpdCBhbm90aGVyIG5hbWUgdGhhdCB5b3UgbGlrZSBpbnN0ZWFkIG9mICJ3cml0ZV9yb3dfY2FsbGJhY2siKQorCitUbyBpbmZvcm0gbGlicG5nIGFib3V0IHlvdXIgZnVuY3Rpb24sIHVzZQorCisgICAgcG5nX3NldF93cml0ZV9zdGF0dXNfZm4ocG5nX3B0ciwgd3JpdGVfcm93X2NhbGxiYWNrKTsKKworV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0aGUgcm93IGhhcyBhbHJlYWR5IGJlZW4gY29tcGxldGVseSBwcm9jZXNzZWQgYW5kCitpdCBoYXMgYWxzbyBiZWVuIHdyaXR0ZW4gb3V0LiAgVGhlICdyb3cnIGFuZCAncGFzcycgcmVmZXIgdG8gdGhlIG5leHQgcm93IHRvIGJlCitoYW5kbGVkLiAgRm9yIHRoZQorbm9uLWludGVybGFjZWQgY2FzZSB0aGUgcm93IHRoYXQgd2FzIGp1c3QgaGFuZGxlZCBpcyBzaW1wbHkgb25lIGxlc3MgdGhhbiB0aGUKK3Bhc3NlZCBpbiByb3cgbnVtYmVyLCBhbmQgcGFzcyB3aWxsIGFsd2F5cyBiZSAwLiAgRm9yIHRoZSBpbnRlcmxhY2VkIGNhc2UgdGhlCitzYW1lIGFwcGxpZXMgdW5sZXNzIHRoZSByb3cgdmFsdWUgaXMgMCwgaW4gd2hpY2ggY2FzZSB0aGUgcm93IGp1c3QgaGFuZGxlZCB3YXMKK3RoZSBsYXN0IG9uZSBmcm9tIG9uZSBvZiB0aGUgcHJlY2VkaW5nIHBhc3Nlcy4gIEJlY2F1c2UgaW50ZXJsYWNpbmcgbWF5IHNraXAgYQorcGFzcyB5b3UgY2Fubm90IGJlIHN1cmUgdGhhdCB0aGUgcHJlY2VkaW5nIHBhc3MgaXMganVzdCAncGFzcy0xJywgaWYgeW91IHJlYWxseQorbmVlZCB0byBrbm93IHdoYXQgdGhlIGxhc3QgcGFzcyBpcyByZWNvcmQgKHJvdyxwYXNzKSBmcm9tIHRoZSBjYWxsYmFjayBhbmQgdXNlCit0aGUgbGFzdCByZWNvcmRlZCB2YWx1ZSBlYWNoIHRpbWUuCisKK0FzIHdpdGggdGhlIHVzZXIgdHJhbnNmb3JtIHlvdSBjYW4gZmluZCB0aGUgb3V0cHV0IHJvdyB1c2luZyB0aGUKK1BOR19ST1dfRlJPTV9QQVNTX1JPVyBtYWNyby4KKworWW91IG5vdyBoYXZlIHRoZSBvcHRpb24gb2YgbW9kaWZ5aW5nIGhvdyB0aGUgY29tcHJlc3Npb24gbGlicmFyeSB3aWxsCitydW4uICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgbWFpbmx5IGZvciB0ZXN0aW5nLCBidXQgbWF5IGJlIHVzZWZ1bAoraW4gc29tZSBjYXNlcywgbGlrZSBpZiB5b3UgbmVlZCB0byB3cml0ZSBQTkcgZmlsZXMgZXh0cmVtZWx5IGZhc3QgYW5kCithcmUgd2lsbGluZyB0byBnaXZlIHVwIHNvbWUgY29tcHJlc3Npb24sIG9yIGlmIHlvdSB3YW50IHRvIGdldCB0aGUKK21heGltdW0gcG9zc2libGUgY29tcHJlc3Npb24gYXQgdGhlIGV4cGVuc2Ugb2Ygc2xvd2VyIHdyaXRpbmcuICBJZiB5b3UKK2hhdmUgbm8gc3BlY2lhbCBuZWVkcyBpbiB0aGlzIGFyZWEsIGxldCB0aGUgbGlicmFyeSBkbyB3aGF0IGl0IHdhbnRzIGJ5Citub3QgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGF0IGFsbCwgYXMgaXQgaGFzIGJlZW4gdHVuZWQgdG8gZGVsaXZlciBhIGdvb2QKK3NwZWVkL2NvbXByZXNzaW9uIHJhdGlvLiBUaGUgc2Vjb25kIHBhcmFtZXRlciB0byBwbmdfc2V0X2ZpbHRlcigpIGlzCit0aGUgZmlsdGVyIG1ldGhvZCwgZm9yIHdoaWNoIHRoZSBvbmx5IHZhbGlkIHZhbHVlcyBhcmUgMCAoYXMgb2YgdGhlCitKdWx5IDE5OTkgUE5HIHNwZWNpZmljYXRpb24sIHZlcnNpb24gMS4yKSBvciA2NCAoaWYgeW91IGFyZSB3cml0aW5nCithIFBORyBkYXRhc3RyZWFtIHRoYXQgaXMgdG8gYmUgZW1iZWRkZWQgaW4gYSBNTkcgZGF0YXN0cmVhbSkuICBUaGUgdGhpcmQKK3BhcmFtZXRlciBpcyBhIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hpY2ggZmlsdGVyIHR5cGUocykgYXJlIHRvIGJlIHRlc3RlZAorZm9yIGVhY2ggc2NhbmxpbmUuICBTZWUgdGhlIFBORyBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBzcGVjaWZpYworZmlsdGVyIHR5cGVzLgorCisKKyAgICAvKiB0dXJuIG9uIG9yIG9mZiBmaWx0ZXJpbmcsIGFuZC9vciBjaG9vc2UKKyAgICAgICBzcGVjaWZpYyBmaWx0ZXJzLiAgWW91IGNhbiB1c2UgZWl0aGVyIGEgc2luZ2xlCisgICAgICAgUE5HX0ZJTFRFUl9WQUxVRV9OQU1FIG9yIHRoZSBiaXR3aXNlIE9SIG9mIG9uZQorICAgICAgIG9yIG1vcmUgUE5HX0ZJTFRFUl9OQU1FIG1hc2tzLgorICAgICAqLworICAgIHBuZ19zZXRfZmlsdGVyKHBuZ19wdHIsIDAsCisgICAgICAgUE5HX0ZJTFRFUl9OT05FICB8IFBOR19GSUxURVJfVkFMVUVfTk9ORSB8CisgICAgICAgUE5HX0ZJTFRFUl9TVUIgICB8IFBOR19GSUxURVJfVkFMVUVfU1VCICB8CisgICAgICAgUE5HX0ZJTFRFUl9VUCAgICB8IFBOR19GSUxURVJfVkFMVUVfVVAgICB8CisgICAgICAgUE5HX0ZJTFRFUl9BVkcgICB8IFBOR19GSUxURVJfVkFMVUVfQVZHICB8CisgICAgICAgUE5HX0ZJTFRFUl9QQUVUSCB8IFBOR19GSUxURVJfVkFMVUVfUEFFVEh8CisgICAgICAgUE5HX0FMTF9GSUxURVJTKTsKKworSWYgYW4gYXBwbGljYXRpb24gd2FudHMgdG8gc3RhcnQgYW5kIHN0b3AgdXNpbmcgcGFydGljdWxhciBmaWx0ZXJzIGR1cmluZworY29tcHJlc3Npb24sIGl0IHNob3VsZCBzdGFydCBvdXQgd2l0aCBhbGwgb2YgdGhlIGZpbHRlcnMgKHRvIGVuc3VyZSB0aGF0Cit0aGUgcHJldmlvdXMgcm93IG9mIHBpeGVscyB3aWxsIGJlIHN0b3JlZCBpbiBjYXNlIGl0J3MgbmVlZGVkIGxhdGVyKSwKK2FuZCB0aGVuIGFkZCBhbmQgcmVtb3ZlIHRoZW0gYWZ0ZXIgdGhlIHN0YXJ0IG9mIGNvbXByZXNzaW9uLgorCitJZiB5b3UgYXJlIHdyaXRpbmcgYSBQTkcgZGF0YXN0cmVhbSB0aGF0IGlzIHRvIGJlIGVtYmVkZGVkIGluIGEgTU5HCitkYXRhc3RyZWFtLCB0aGUgc2Vjb25kIHBhcmFtZXRlciBjYW4gYmUgZWl0aGVyIDAgb3IgNjQuCisKK1RoZSBwbmdfc2V0X2NvbXByZXNzaW9uXyooKSBmdW5jdGlvbnMgaW50ZXJmYWNlIHRvIHRoZSB6bGliIGNvbXByZXNzaW9uCitsaWJyYXJ5LCBhbmQgc2hvdWxkIG1vc3RseSBiZSBpZ25vcmVkIHVubGVzcyB5b3UgcmVhbGx5IGtub3cgd2hhdCB5b3UgYXJlCitkb2luZy4gIFRoZSBvbmx5IGdlbmVyYWxseSB1c2VmdWwgY2FsbCBpcyBwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsKCkKK3doaWNoIGNoYW5nZXMgaG93IG11Y2ggdGltZSB6bGliIHNwZW5kcyBvbiB0cnlpbmcgdG8gY29tcHJlc3MgdGhlIGltYWdlCitkYXRhLiAgU2VlIHRoZSBDb21wcmVzc2lvbiBMaWJyYXJ5ICh6bGliLmggYW5kIGFsZ29yaXRobS50eHQsIGRpc3RyaWJ1dGVkCit3aXRoIHpsaWIpIGZvciBkZXRhaWxzIG9uIHRoZSBjb21wcmVzc2lvbiBsZXZlbHMuCisKKyAgICAjaW5jbHVkZSB6bGliLmgKKworICAgIC8qIFNldCB0aGUgemxpYiBjb21wcmVzc2lvbiBsZXZlbCAqLworICAgIHBuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwocG5nX3B0ciwKKyAgICAgICAgWl9CRVNUX0NPTVBSRVNTSU9OKTsKKworICAgIC8qIFNldCBvdGhlciB6bGliIHBhcmFtZXRlcnMgZm9yIGNvbXByZXNzaW5nIElEQVQgKi8KKyAgICBwbmdfc2V0X2NvbXByZXNzaW9uX21lbV9sZXZlbChwbmdfcHRyLCA4KTsKKyAgICBwbmdfc2V0X2NvbXByZXNzaW9uX3N0cmF0ZWd5KHBuZ19wdHIsCisgICAgICAgIFpfREVGQVVMVF9TVFJBVEVHWSk7CisgICAgcG5nX3NldF9jb21wcmVzc2lvbl93aW5kb3dfYml0cyhwbmdfcHRyLCAxNSk7CisgICAgcG5nX3NldF9jb21wcmVzc2lvbl9tZXRob2QocG5nX3B0ciwgOCk7CisgICAgcG5nX3NldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZShwbmdfcHRyLCA4MTkyKQorCisgICAgLyogU2V0IHpsaWIgcGFyYW1ldGVycyBmb3IgdGV4dCBjb21wcmVzc2lvbgorICAgICAqIElmIHlvdSBkb24ndCBjYWxsIHRoZXNlLCB0aGUgcGFyYW1ldGVycworICAgICAqIGZhbGwgYmFjayBvbiB0aG9zZSBkZWZpbmVkIGZvciBJREFUIGNodW5rcworICAgICAqLworICAgIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwocG5nX3B0ciwgOCk7CisgICAgcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX3N0cmF0ZWd5KHBuZ19wdHIsCisgICAgICAgIFpfREVGQVVMVF9TVFJBVEVHWSk7CisgICAgcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX3dpbmRvd19iaXRzKHBuZ19wdHIsIDE1KTsKKyAgICBwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fbWV0aG9kKHBuZ19wdHIsIDgpOworCitTZXR0aW5nIHRoZSBjb250ZW50cyBvZiBpbmZvIGZvciBvdXRwdXQKKworWW91IG5vdyBuZWVkIHRvIGZpbGwgaW4gdGhlIHBuZ19pbmZvIHN0cnVjdHVyZSB3aXRoIGFsbCB0aGUgZGF0YSB5b3UKK3dpc2ggdG8gd3JpdGUgYmVmb3JlIHRoZSBhY3R1YWwgaW1hZ2UuICBOb3RlIHRoYXQgdGhlIG9ubHkgdGhpbmcgeW91CithcmUgYWxsb3dlZCB0byB3cml0ZSBhZnRlciB0aGUgaW1hZ2UgaXMgdGhlIHRleHQgY2h1bmtzIGFuZCB0aGUgdGltZQorY2h1bmsgKGFzIG9mIFBORyBTcGVjaWZpY2F0aW9uIDEuMiwgYW55d2F5KS4gIFNlZSBwbmdfd3JpdGVfZW5kKCkgYW5kCit0aGUgbGF0ZXN0IFBORyBzcGVjaWZpY2F0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoYXQuICBJZiB5b3UKK3dpc2ggdG8gd3JpdGUgdGhlbSBiZWZvcmUgdGhlIGltYWdlLCBmaWxsIHRoZW0gaW4gbm93LCBhbmQgZmxhZyB0aGF0CitkYXRhIGFzIGJlaW5nIHZhbGlkLiAgSWYgeW91IHdhbnQgdG8gd2FpdCB1bnRpbCBhZnRlciB0aGUgZGF0YSwgZG9uJ3QKK2ZpbGwgdGhlbSB1bnRpbCBwbmdfd3JpdGVfZW5kKCkuICBGb3IgYWxsIHRoZSBmaWVsZHMgaW4gcG5nX2luZm8gYW5kCit0aGVpciBkYXRhIHR5cGVzLCBzZWUgcG5nLmguICBGb3IgZXhwbGFuYXRpb25zIG9mIHdoYXQgdGhlIGZpZWxkcworY29udGFpbiwgc2VlIHRoZSBQTkcgc3BlY2lmaWNhdGlvbi4KKworU29tZSBvZiB0aGUgbW9yZSBpbXBvcnRhbnQgcGFydHMgb2YgdGhlIHBuZ19pbmZvIGFyZToKKworICAgIHBuZ19zZXRfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwgd2lkdGgsIGhlaWdodCwKKyAgICAgICBiaXRfZGVwdGgsIGNvbG9yX3R5cGUsIGludGVybGFjZV90eXBlLAorICAgICAgIGNvbXByZXNzaW9uX3R5cGUsIGZpbHRlcl9tZXRob2QpCisKKyAgICB3aWR0aCAgICAgICAgICAtIGhvbGRzIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UKKyAgICAgICAgICAgICAgICAgICAgIGluIHBpeGVscyAodXAgdG8gMl4zMSkuCisKKyAgICBoZWlnaHQgICAgICAgICAtIGhvbGRzIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlCisgICAgICAgICAgICAgICAgICAgICBpbiBwaXhlbHMgKHVwIHRvIDJeMzEpLgorCisgICAgYml0X2RlcHRoICAgICAgLSBob2xkcyB0aGUgYml0IGRlcHRoIG9mIG9uZSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgIGltYWdlIGNoYW5uZWxzLgorICAgICAgICAgICAgICAgICAgICAgKHZhbGlkIHZhbHVlcyBhcmUgMSwgMiwgNCwgOCwgMTYKKyAgICAgICAgICAgICAgICAgICAgIGFuZCBkZXBlbmQgYWxzbyBvbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgIGNvbG9yX3R5cGUuICBTZWUgYWxzbyBzaWduaWZpY2FudAorICAgICAgICAgICAgICAgICAgICAgYml0cyAoc0JJVCkgYmVsb3cpLgorCisgICAgY29sb3JfdHlwZSAgICAgLSBkZXNjcmliZXMgd2hpY2ggY29sb3IvYWxwaGEKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzIGFyZSBwcmVzZW50LgorICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfR1JBWQorICAgICAgICAgICAgICAgICAgICAgICAgKGJpdCBkZXB0aHMgMSwgMiwgNCwgOCwgMTYpCisgICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAoYml0IGRlcHRocyA4LCAxNikKKyAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX1BBTEVUVEUKKyAgICAgICAgICAgICAgICAgICAgICAgIChiaXQgZGVwdGhzIDEsIDIsIDQsIDgpCisgICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9SR0IKKyAgICAgICAgICAgICAgICAgICAgICAgIChiaXRfZGVwdGhzIDgsIDE2KQorICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAoYml0X2RlcHRocyA4LCAxNikKKworICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX01BU0tfUEFMRVRURQorICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX01BU0tfQ09MT1IKKyAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9NQVNLX0FMUEhBCisKKyAgICBpbnRlcmxhY2VfdHlwZSAtIFBOR19JTlRFUkxBQ0VfTk9ORSBvcgorICAgICAgICAgICAgICAgICAgICAgUE5HX0lOVEVSTEFDRV9BREFNNworCisgICAgY29tcHJlc3Npb25fdHlwZSAtIChtdXN0IGJlCisgICAgICAgICAgICAgICAgICAgICBQTkdfQ09NUFJFU1NJT05fVFlQRV9ERUZBVUxUKQorCisgICAgZmlsdGVyX21ldGhvZCAgLSAobXVzdCBiZSBQTkdfRklMVEVSX1RZUEVfREVGQVVMVAorICAgICAgICAgICAgICAgICAgICAgb3IsIGlmIHlvdSBhcmUgd3JpdGluZyBhIFBORyB0bworICAgICAgICAgICAgICAgICAgICAgYmUgZW1iZWRkZWQgaW4gYSBNTkcgZGF0YXN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgIGNhbiBhbHNvIGJlCisgICAgICAgICAgICAgICAgICAgICBQTkdfSU5UUkFQSVhFTF9ESUZGRVJFTkNJTkcpCisKK0lmIHlvdSBjYWxsIHBuZ19zZXRfSUhEUigpLCB0aGUgY2FsbCBtdXN0IGFwcGVhciBiZWZvcmUgYW55IG9mIHRoZQorb3RoZXIgcG5nX3NldF8qKCkgZnVuY3Rpb25zLCBiZWNhdXNlIHRoZXkgbWlnaHQgcmVxdWlyZSBhY2Nlc3MgdG8gc29tZSBvZgordGhlIElIRFIgc2V0dGluZ3MuICBUaGUgcmVtYWluaW5nIHBuZ19zZXRfKigpIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkCitpbiBhbnkgb3JkZXIuCisKK0lmIHlvdSB3aXNoLCB5b3UgY2FuIHJlc2V0IHRoZSBjb21wcmVzc2lvbl90eXBlLCBpbnRlcmxhY2VfdHlwZSwgb3IKK2ZpbHRlcl9tZXRob2QgbGF0ZXIgYnkgY2FsbGluZyBwbmdfc2V0X0lIRFIoKSBhZ2FpbjsgaWYgeW91IGRvIHRoaXMsIHRoZQord2lkdGgsIGhlaWdodCwgYml0X2RlcHRoLCBhbmQgY29sb3JfdHlwZSBtdXN0IGJlIHRoZSBzYW1lIGluIGVhY2ggY2FsbC4KKworICAgIHBuZ19zZXRfUExURShwbmdfcHRyLCBpbmZvX3B0ciwgcGFsZXR0ZSwKKyAgICAgICBudW1fcGFsZXR0ZSk7CisKKyAgICBwYWxldHRlICAgICAgICAtIHRoZSBwYWxldHRlIGZvciB0aGUgZmlsZQorICAgICAgICAgICAgICAgICAgICAgKGFycmF5IG9mIHBuZ19jb2xvcikKKyAgICBudW1fcGFsZXR0ZSAgICAtIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBwYWxldHRlCisKKworICAgIHBuZ19zZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgZmlsZV9nYW1tYSk7CisgICAgcG5nX3NldF9nQU1BX2ZpeGVkKHBuZ19wdHIsIGluZm9fcHRyLCBpbnRfZmlsZV9nYW1tYSk7CisKKyAgICBmaWxlX2dhbW1hICAgICAtIHRoZSBnYW1tYSBhdCB3aGljaCB0aGUgaW1hZ2Ugd2FzCisgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkIChQTkdfSU5GT19nQU1BKQorCisgICAgaW50X2ZpbGVfZ2FtbWEgLSAxMDAsMDAwIHRpbWVzIHRoZSBnYW1tYSBhdCB3aGljaAorICAgICAgICAgICAgICAgICAgICAgdGhlIGltYWdlIHdhcyBjcmVhdGVkCisKKyAgICBwbmdfc2V0X2NIUk0ocG5nX3B0ciwgaW5mb19wdHIsICB3aGl0ZV94LCB3aGl0ZV95LCByZWRfeCwgcmVkX3ksCisgICAgICAgICAgICAgICAgICAgICBncmVlbl94LCBncmVlbl95LCBibHVlX3gsIGJsdWVfeSkKKyAgICBwbmdfc2V0X2NIUk1fWFlaKHBuZ19wdHIsIGluZm9fcHRyLCByZWRfWCwgcmVkX1ksIHJlZF9aLCBncmVlbl9YLAorICAgICAgICAgICAgICAgICAgICAgZ3JlZW5fWSwgZ3JlZW5fWiwgYmx1ZV9YLCBibHVlX1ksIGJsdWVfWikKKyAgICBwbmdfc2V0X2NIUk1fZml4ZWQocG5nX3B0ciwgaW5mb19wdHIsIGludF93aGl0ZV94LCBpbnRfd2hpdGVfeSwKKyAgICAgICAgICAgICAgICAgICAgIGludF9yZWRfeCwgaW50X3JlZF95LCBpbnRfZ3JlZW5feCwgaW50X2dyZWVuX3ksCisgICAgICAgICAgICAgICAgICAgICBpbnRfYmx1ZV94LCBpbnRfYmx1ZV95KQorICAgIHBuZ19zZXRfY0hSTV9YWVpfZml4ZWQocG5nX3B0ciwgaW5mb19wdHIsIGludF9yZWRfWCwgaW50X3JlZF9ZLAorICAgICAgICAgICAgICAgICAgICAgaW50X3JlZF9aLCBpbnRfZ3JlZW5fWCwgaW50X2dyZWVuX1ksIGludF9ncmVlbl9aLAorICAgICAgICAgICAgICAgICAgICAgaW50X2JsdWVfWCwgaW50X2JsdWVfWSwgaW50X2JsdWVfWikKKworICAgIHt3aGl0ZSxyZWQsZ3JlZW4sYmx1ZX1fe3gseX0KKyAgICAgICAgICAgICAgICAgICAgIEEgY29sb3Igc3BhY2UgZW5jb2Rpbmcgc3BlY2lmaWVkIHVzaW5nIHRoZSBjaHJvbWF0aWNpdGllcworICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGVuZCBwb2ludHMgYW5kIHRoZSB3aGl0ZSBwb2ludC4KKworICAgIHtyZWQsZ3JlZW4sYmx1ZX1fe1gsWSxafQorICAgICAgICAgICAgICAgICAgICAgQSBjb2xvciBzcGFjZSBlbmNvZGluZyBzcGVjaWZpZWQgdXNpbmcgdGhlIGVuY29kaW5nIGVuZAorICAgICAgICAgICAgICAgICAgICAgcG9pbnRzIC0gdGhlIENJRSB0cmlzdGltdWx1cyBzcGVjaWZpY2F0aW9uIG9mIHRoZSBpbnRlbmRlZAorICAgICAgICAgICAgICAgICAgICAgY29sb3Igb2YgdGhlIHJlZCwgZ3JlZW4gYW5kIGJsdWUgY2hhbm5lbHMgaW4gdGhlIFBORyBSR0IKKyAgICAgICAgICAgICAgICAgICAgIGRhdGEuICBUaGUgd2hpdGUgcG9pbnQgaXMgc2ltcGx5IHRoZSBzdW0gb2YgdGhlIHRocmVlIGVuZAorICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLgorCisgICAgcG5nX3NldF9zUkdCKHBuZ19wdHIsIGluZm9fcHRyLCBzcmdiX2ludGVudCk7CisKKyAgICBzcmdiX2ludGVudCAgICAtIHRoZSByZW5kZXJpbmcgaW50ZW50CisgICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9fc1JHQikgVGhlIHByZXNlbmNlIG9mCisgICAgICAgICAgICAgICAgICAgICB0aGUgc1JHQiBjaHVuayBtZWFucyB0aGF0IHRoZSBwaXhlbAorICAgICAgICAgICAgICAgICAgICAgZGF0YSBpcyBpbiB0aGUgc1JHQiBjb2xvciBzcGFjZS4KKyAgICAgICAgICAgICAgICAgICAgIFRoaXMgY2h1bmsgYWxzbyBpbXBsaWVzIHNwZWNpZmljCisgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgb2YgZ0FNQSBhbmQgY0hSTS4gIFJlbmRlcmluZworICAgICAgICAgICAgICAgICAgICAgaW50ZW50IGlzIHRoZSBDU1MtMSBwcm9wZXJ0eSB0aGF0CisgICAgICAgICAgICAgICAgICAgICBoYXMgYmVlbiBkZWZpbmVkIGJ5IHRoZSBJbnRlcm5hdGlvbmFsCisgICAgICAgICAgICAgICAgICAgICBDb2xvciBDb25zb3J0aXVtCisgICAgICAgICAgICAgICAgICAgICAoaHR0cDovL3d3dy5jb2xvci5vcmcpLgorICAgICAgICAgICAgICAgICAgICAgSXQgY2FuIGJlIG9uZSBvZgorICAgICAgICAgICAgICAgICAgICAgUE5HX3NSR0JfSU5URU5UX1NBVFVSQVRJT04sCisgICAgICAgICAgICAgICAgICAgICBQTkdfc1JHQl9JTlRFTlRfUEVSQ0VQVFVBTCwKKyAgICAgICAgICAgICAgICAgICAgIFBOR19zUkdCX0lOVEVOVF9BQlNPTFVURSwgb3IKKyAgICAgICAgICAgICAgICAgICAgIFBOR19zUkdCX0lOVEVOVF9SRUxBVElWRS4KKworCisgICAgcG5nX3NldF9zUkdCX2dBTUFfYW5kX2NIUk0ocG5nX3B0ciwgaW5mb19wdHIsCisgICAgICAgc3JnYl9pbnRlbnQpOworCisgICAgc3JnYl9pbnRlbnQgICAgLSB0aGUgcmVuZGVyaW5nIGludGVudAorICAgICAgICAgICAgICAgICAgICAgKFBOR19JTkZPX3NSR0IpIFRoZSBwcmVzZW5jZSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgIHNSR0IgY2h1bmsgbWVhbnMgdGhhdCB0aGUgcGl4ZWwKKyAgICAgICAgICAgICAgICAgICAgIGRhdGEgaXMgaW4gdGhlIHNSR0IgY29sb3Igc3BhY2UuCisgICAgICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGFsc28gY2F1c2VzIGdBTUEgYW5kCisgICAgICAgICAgICAgICAgICAgICBjSFJNIGNodW5rcyB3aXRoIHRoZSBzcGVjaWZpYyB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgIHRoYXQgYXJlIGNvbnNpc3RlbnQgd2l0aCBzUkdCIHRvIGJlCisgICAgICAgICAgICAgICAgICAgICB3cml0dGVuLgorCisgICAgcG5nX3NldF9pQ0NQKHBuZ19wdHIsIGluZm9fcHRyLCBuYW1lLCBjb21wcmVzc2lvbl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLCBwcm9mbGVuKTsKKworICAgIG5hbWUgICAgICAgICAgICAgLSBUaGUgcHJvZmlsZSBuYW1lLgorCisgICAgY29tcHJlc3Npb25fdHlwZSAtIFRoZSBjb21wcmVzc2lvbiB0eXBlOyBhbHdheXMKKyAgICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSBmb3IgUE5HIDEuMC4KKyAgICAgICAgICAgICAgICAgICAgICAgWW91IG1heSBnaXZlIE5VTEwgdG8gdGhpcyBhcmd1bWVudCB0bworICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUgaXQuCisKKyAgICBwcm9maWxlICAgICAgICAgIC0gSW50ZXJuYXRpb25hbCBDb2xvciBDb25zb3J0aXVtIGNvbG9yCisgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUgZGF0YS4gTWF5IGNvbnRhaW4gTlVMcy4KKworICAgIHByb2ZsZW4gICAgICAgICAgLSBsZW5ndGggb2YgcHJvZmlsZSBkYXRhIGluIGJ5dGVzLgorCisgICAgcG5nX3NldF9zQklUKHBuZ19wdHIsIGluZm9fcHRyLCBzaWdfYml0KTsKKworICAgIHNpZ19iaXQgICAgICAgIC0gdGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBiaXRzIGZvcgorICAgICAgICAgICAgICAgICAgICAgKFBOR19JTkZPX3NCSVQpIGVhY2ggb2YgdGhlIGdyYXksIHJlZCwKKyAgICAgICAgICAgICAgICAgICAgIGdyZWVuLCBhbmQgYmx1ZSBjaGFubmVscywgd2hpY2hldmVyIGFyZQorICAgICAgICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgZm9yIHRoZSBnaXZlbiBjb2xvciB0eXBlCisgICAgICAgICAgICAgICAgICAgICAocG5nX2NvbG9yXzE2KQorCisgICAgcG5nX3NldF90Uk5TKHBuZ19wdHIsIGluZm9fcHRyLCB0cmFuc19hbHBoYSwKKyAgICAgICBudW1fdHJhbnMsIHRyYW5zX2NvbG9yKTsKKworICAgIHRyYW5zX2FscGhhICAgIC0gYXJyYXkgb2YgYWxwaGEgKHRyYW5zcGFyZW5jeSkKKyAgICAgICAgICAgICAgICAgICAgIGVudHJpZXMgZm9yIHBhbGV0dGUgKFBOR19JTkZPX3RSTlMpCisKKyAgICBudW1fdHJhbnMgICAgICAtIG51bWJlciBvZiB0cmFuc3BhcmVudCBlbnRyaWVzCisgICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9fdFJOUykKKworICAgIHRyYW5zX2NvbG9yICAgIC0gZ3JheWxldmVsIG9yIGNvbG9yIHNhbXBsZSB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgIChpbiBvcmRlciByZWQsIGdyZWVuLCBibHVlKSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgIHNpbmdsZSB0cmFuc3BhcmVudCBjb2xvciBmb3IKKyAgICAgICAgICAgICAgICAgICAgIG5vbi1wYWxldHRlZCBpbWFnZXMgKFBOR19JTkZPX3RSTlMpCisKKyAgICBwbmdfc2V0X2hJU1QocG5nX3B0ciwgaW5mb19wdHIsIGhpc3QpOworCisgICAgaGlzdCAgICAgICAgICAgLSBoaXN0b2dyYW0gb2YgcGFsZXR0ZSAoYXJyYXkgb2YKKyAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2KSAoUE5HX0lORk9faElTVCkKKworICAgIHBuZ19zZXRfdElNRShwbmdfcHRyLCBpbmZvX3B0ciwgbW9kX3RpbWUpOworCisgICAgbW9kX3RpbWUgICAgICAgLSB0aW1lIGltYWdlIHdhcyBsYXN0IG1vZGlmaWVkCisgICAgICAgICAgICAgICAgICAgICAoUE5HX1ZBTElEX3RJTUUpCisKKyAgICBwbmdfc2V0X2JLR0QocG5nX3B0ciwgaW5mb19wdHIsIGJhY2tncm91bmQpOworCisgICAgYmFja2dyb3VuZCAgICAgLSBiYWNrZ3JvdW5kIGNvbG9yIChvZiB0eXBlCisgICAgICAgICAgICAgICAgICAgICBwbmdfY29sb3JfMTZwKSAoUE5HX1ZBTElEX2JLR0QpCisKKyAgICBwbmdfc2V0X3RleHQocG5nX3B0ciwgaW5mb19wdHIsIHRleHRfcHRyLCBudW1fdGV4dCk7CisKKyAgICB0ZXh0X3B0ciAgICAgICAtIGFycmF5IG9mIHBuZ190ZXh0IGhvbGRpbmcgaW1hZ2UKKyAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzCisKKyAgICB0ZXh0X3B0cltpXS5jb21wcmVzc2lvbiAtIHR5cGUgb2YgY29tcHJlc3Npb24gdXNlZAorICAgICAgICAgICAgICAgICBvbiAidGV4dCIgUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORQorICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0lUWFRfQ09NUFJFU1NJT05fTk9ORQorICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0lUWFRfQ09NUFJFU1NJT05felRYdAorICAgIHRleHRfcHRyW2ldLmtleSAgIC0ga2V5d29yZCBmb3IgY29tbWVudC4gIE11c3QgY29udGFpbgorICAgICAgICAgICAgICAgICAxLTc5IGNoYXJhY3RlcnMuCisgICAgdGV4dF9wdHJbaV0udGV4dCAgLSB0ZXh0IGNvbW1lbnRzIGZvciBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZC4gIENhbiBiZSBOVUxMIG9yIGVtcHR5LgorICAgIHRleHRfcHRyW2ldLnRleHRfbGVuZ3RoIC0gbGVuZ3RoIG9mIHRleHQgc3RyaW5nLAorICAgICAgICAgICAgICAgICBhZnRlciBkZWNvbXByZXNzaW9uLCAwIGZvciBpVFh0CisgICAgdGV4dF9wdHJbaV0uaXR4dF9sZW5ndGggLSBsZW5ndGggb2YgaXR4dCBzdHJpbmcsCisgICAgICAgICAgICAgICAgIGFmdGVyIGRlY29tcHJlc3Npb24sIDAgZm9yIHRFWHQvelRYdAorICAgIHRleHRfcHRyW2ldLmxhbmcgIC0gbGFuZ3VhZ2Ugb2YgY29tbWVudCAoTlVMTCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5IGZvciB1bmtub3duKS4KKyAgICB0ZXh0X3B0cltpXS50cmFuc2xhdGVkX2tleXdvcmQgIC0ga2V5d29yZCBpbiBVVEYtOCAoTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGVtcHR5IGZvciB1bmtub3duKS4KKworICAgIE5vdGUgdGhhdCB0aGUgaXR4dF9sZW5ndGgsIGxhbmcsIGFuZCBsYW5nX2tleQorICAgIG1lbWJlcnMgb2YgdGhlIHRleHRfcHRyIHN0cnVjdHVyZSBvbmx5IGV4aXN0IHdoZW4gdGhlCisgICAgbGlicmFyeSBpcyBidWlsdCB3aXRoIGlUWHQgY2h1bmsgc3VwcG9ydC4gIFByaW9yIHRvCisgICAgbGlicG5nLTEuNC4wIHRoZSBsaWJyYXJ5IHdhcyBidWlsdCBieSBkZWZhdWx0IHdpdGhvdXQKKyAgICBpVFh0IHN1cHBvcnQuIEFsc28gbm90ZSB0aGF0IHdoZW4gaVRYdCBpcyBzdXBwb3J0ZWQsCisgICAgdGhleSBjb250YWluIE5VTEwgcG9pbnRlcnMgd2hlbiB0aGUgImNvbXByZXNzaW9uIgorICAgIGZpZWxkIGNvbnRhaW5zIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUgb3IKKyAgICBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0LgorCisgICAgbnVtX3RleHQgICAgICAgLSBudW1iZXIgb2YgY29tbWVudHMKKworICAgIHBuZ19zZXRfc1BMVChwbmdfcHRyLCBpbmZvX3B0ciwgJnBhbGV0dGVfcHRyLAorICAgICAgIG51bV9zcGFsZXR0ZXMpOworCisgICAgcGFsZXR0ZV9wdHIgICAgLSBhcnJheSBvZiBwbmdfc1BMVF9zdHJ1Y3Qgc3RydWN0dXJlcworICAgICAgICAgICAgICAgICAgICAgdG8gYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgcGFsZXR0ZXMKKyAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBpbmZvIHN0cnVjdHVyZS4KKyAgICBudW1fc3BhbGV0dGVzICAtIG51bWJlciBvZiBwYWxldHRlIHN0cnVjdHVyZXMgdG8gYmUKKyAgICAgICAgICAgICAgICAgICAgIGFkZGVkLgorCisgICAgcG5nX3NldF9vRkZzKHBuZ19wdHIsIGluZm9fcHRyLCBvZmZzZXRfeCwgb2Zmc2V0X3ksCisgICAgICAgIHVuaXRfdHlwZSk7CisKKyAgICBvZmZzZXRfeCAgLSBwb3NpdGl2ZSBvZmZzZXQgZnJvbSB0aGUgbGVmdAorICAgICAgICAgICAgICAgICAgICAgZWRnZSBvZiB0aGUgc2NyZWVuCisKKyAgICBvZmZzZXRfeSAgLSBwb3NpdGl2ZSBvZmZzZXQgZnJvbSB0aGUgdG9wCisgICAgICAgICAgICAgICAgICAgICBlZGdlIG9mIHRoZSBzY3JlZW4KKworICAgIHVuaXRfdHlwZSAtIFBOR19PRkZTRVRfUElYRUwsIFBOR19PRkZTRVRfTUlDUk9NRVRFUgorCisgICAgcG5nX3NldF9wSFlzKHBuZ19wdHIsIGluZm9fcHRyLCByZXNfeCwgcmVzX3ksCisgICAgICAgIHVuaXRfdHlwZSk7CisKKyAgICByZXNfeCAgICAgICAtIHBpeGVscy91bml0IHBoeXNpY2FsIHJlc29sdXRpb24KKyAgICAgICAgICAgICAgICAgIGluIHggZGlyZWN0aW9uCisKKyAgICByZXNfeSAgICAgICAtIHBpeGVscy91bml0IHBoeXNpY2FsIHJlc29sdXRpb24KKyAgICAgICAgICAgICAgICAgIGluIHkgZGlyZWN0aW9uCisKKyAgICB1bml0X3R5cGUgICAtIFBOR19SRVNPTFVUSU9OX1VOS05PV04sCisgICAgICAgICAgICAgICAgICBQTkdfUkVTT0xVVElPTl9NRVRFUgorCisgICAgcG5nX3NldF9zQ0FMKHBuZ19wdHIsIGluZm9fcHRyLCB1bml0LCB3aWR0aCwgaGVpZ2h0KQorCisgICAgdW5pdCAgICAgICAgLSBwaHlzaWNhbCBzY2FsZSB1bml0cyAoYW4gaW50ZWdlcikKKworICAgIHdpZHRoICAgICAgIC0gd2lkdGggb2YgYSBwaXhlbCBpbiBwaHlzaWNhbCBzY2FsZSB1bml0cworCisgICAgaGVpZ2h0ICAgICAgLSBoZWlnaHQgb2YgYSBwaXhlbCBpbiBwaHlzaWNhbCBzY2FsZSB1bml0cworICAgICAgICAgICAgICAgICAgKHdpZHRoIGFuZCBoZWlnaHQgYXJlIGRvdWJsZXMpCisKKyAgICBwbmdfc2V0X3NDQUxfcyhwbmdfcHRyLCBpbmZvX3B0ciwgdW5pdCwgd2lkdGgsIGhlaWdodCkKKworICAgIHVuaXQgICAgICAgIC0gcGh5c2ljYWwgc2NhbGUgdW5pdHMgKGFuIGludGVnZXIpCisKKyAgICB3aWR0aCAgICAgICAtIHdpZHRoIG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKKyAgICAgICAgICAgICAgICAgIGV4cHJlc3NlZCBhcyBhIHN0cmluZworCisgICAgaGVpZ2h0ICAgICAgLSBoZWlnaHQgb2YgYSBwaXhlbCBpbiBwaHlzaWNhbCBzY2FsZSB1bml0cworICAgICAgICAgICAgICAgICAod2lkdGggYW5kIGhlaWdodCBhcmUgc3RyaW5ncyBsaWtlICIyLjU0IikKKworICAgIHBuZ19zZXRfdW5rbm93bl9jaHVua3MocG5nX3B0ciwgaW5mb19wdHIsICZ1bmtub3ducywKKyAgICAgICBudW1fdW5rbm93bnMpCisKKyAgICB1bmtub3ducyAgICAgICAgICAtIGFycmF5IG9mIHBuZ191bmtub3duX2NodW5rCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVzIGhvbGRpbmcgdW5rbm93biBjaHVua3MKKyAgICB1bmtub3duc1tpXS5uYW1lICAtIG5hbWUgb2YgdW5rbm93biBjaHVuaworICAgIHVua25vd25zW2ldLmRhdGEgIC0gZGF0YSBvZiB1bmtub3duIGNodW5rCisgICAgdW5rbm93bnNbaV0uc2l6ZSAgLSBzaXplIG9mIHVua25vd24gY2h1bmsncyBkYXRhCisgICAgdW5rbm93bnNbaV0ubG9jYXRpb24gLSBwb3NpdGlvbiB0byB3cml0ZSBjaHVuayBpbiBmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiBkbyBub3Qgd3JpdGUgY2h1bmsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19IQVZFX0lIRFI6IGJlZm9yZSBQTFRFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfSEFWRV9QTFRFOiBiZWZvcmUgSURBVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0FGVEVSX0lEQVQ6IGFmdGVyIElEQVQKKworVGhlICJsb2NhdGlvbiIgbWVtYmVyIGlzIHNldCBhdXRvbWF0aWNhbGx5IGFjY29yZGluZyB0bword2hhdCBwYXJ0IG9mIHRoZSBvdXRwdXQgZmlsZSBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uCitZb3UgY2FuIGNoYW5nZSBpdHMgdmFsdWUgYWZ0ZXIgY2FsbGluZyBwbmdfc2V0X3Vua25vd25fY2h1bmtzKCkKK2FzIGRlbW9uc3RyYXRlZCBpbiBwbmd0ZXN0LmMuICBXaXRoaW4gZWFjaCBvZiB0aGUgImxvY2F0aW9ucyIsCit0aGUgY2h1bmtzIGFyZSBzZXF1ZW5jZWQgYWNjb3JkaW5nIHRvIHRoZWlyIHBvc2l0aW9uIGluIHRoZQorc3RydWN0dXJlICh0aGF0IGlzLCB0aGUgdmFsdWUgb2YgImkiLCB3aGljaCBpcyB0aGUgb3JkZXIgaW4gd2hpY2gKK3RoZSBjaHVuayB3YXMgZWl0aGVyIHJlYWQgZnJvbSB0aGUgaW5wdXQgZmlsZSBvciBkZWZpbmVkIHdpdGgKK3BuZ19zZXRfdW5rbm93bl9jaHVua3MpLgorCitBIHF1aWNrIHdvcmQgYWJvdXQgdGV4dCBhbmQgbnVtX3RleHQuICB0ZXh0IGlzIGFuIGFycmF5IG9mIHBuZ190ZXh0CitzdHJ1Y3R1cmVzLiAgbnVtX3RleHQgaXMgdGhlIG51bWJlciBvZiB2YWxpZCBzdHJ1Y3R1cmVzIGluIHRoZSBhcnJheS4KK0VhY2ggcG5nX3RleHQgc3RydWN0dXJlIGhvbGRzIGEgbGFuZ3VhZ2UgY29kZSwgYSBrZXl3b3JkLCBhIHRleHQgdmFsdWUsCithbmQgYSBjb21wcmVzc2lvbiB0eXBlLgorCitUaGUgY29tcHJlc3Npb24gdHlwZXMgaGF2ZSB0aGUgc2FtZSB2YWxpZCBudW1iZXJzIGFzIHRoZSBjb21wcmVzc2lvbgordHlwZXMgb2YgdGhlIGltYWdlIGRhdGEuICBDdXJyZW50bHksIHRoZSBvbmx5IHZhbGlkIG51bWJlciBpcyB6ZXJvLgorSG93ZXZlciwgeW91IGNhbiBzdG9yZSB0ZXh0IGVpdGhlciBjb21wcmVzc2VkIG9yIHVuY29tcHJlc3NlZCwgdW5saWtlCitpbWFnZXMsIHdoaWNoIGFsd2F5cyBoYXZlIHRvIGJlIGNvbXByZXNzZWQuICBTbyBpZiB5b3UgZG9uJ3Qgd2FudCB0aGUKK3RleHQgY29tcHJlc3NlZCwgc2V0IHRoZSBjb21wcmVzc2lvbiB0eXBlIHRvIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUuCitCZWNhdXNlIHRFWHQgYW5kIHpUWHQgY2h1bmtzIGRvbid0IGhhdmUgYSBsYW5ndWFnZSBmaWVsZCwgaWYgeW91CitzcGVjaWZ5IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUgb3IgUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdAorYW55IGxhbmd1YWdlIGNvZGUgb3IgdHJhbnNsYXRlZCBrZXl3b3JkIHdpbGwgbm90IGJlIHdyaXR0ZW4gb3V0LgorCitVbnRpbCB0ZXh0IGdldHMgYXJvdW5kIGEgZmV3IGh1bmRyZWQgYnl0ZXMsIGl0IGlzIG5vdCB3b3J0aCBjb21wcmVzc2luZyBpdC4KK0FmdGVyIHRoZSB0ZXh0IGhhcyBiZWVuIHdyaXR0ZW4gb3V0IHRvIHRoZSBmaWxlLCB0aGUgY29tcHJlc3Npb24gdHlwZQoraXMgc2V0IHRvIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkVfV1Igb3IgUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdF9XUiwKK3NvIHRoYXQgaXQgaXNuJ3Qgd3JpdHRlbiBvdXQgYWdhaW4gYXQgdGhlIGVuZCAoaW4gY2FzZSB5b3UgYXJlIGNhbGxpbmcKK3BuZ193cml0ZV9lbmQoKSB3aXRoIHRoZSBzYW1lIHN0cnVjdCkuCisKK1RoZSBrZXl3b3JkcyB0aGF0IGFyZSBnaXZlbiBpbiB0aGUgUE5HIFNwZWNpZmljYXRpb24gYXJlOgorCisgICAgVGl0bGUgICAgICAgICAgICBTaG9ydCAob25lIGxpbmUpIHRpdGxlIG9yCisgICAgICAgICAgICAgICAgICAgICBjYXB0aW9uIGZvciBpbWFnZQorCisgICAgQXV0aG9yICAgICAgICAgICBOYW1lIG9mIGltYWdlJ3MgY3JlYXRvcgorCisgICAgRGVzY3JpcHRpb24gICAgICBEZXNjcmlwdGlvbiBvZiBpbWFnZSAocG9zc2libHkgbG9uZykKKworICAgIENvcHlyaWdodCAgICAgICAgQ29weXJpZ2h0IG5vdGljZQorCisgICAgQ3JlYXRpb24gVGltZSAgICBUaW1lIG9mIG9yaWdpbmFsIGltYWdlIGNyZWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAodXN1YWxseSBSRkMgMTEyMyBmb3JtYXQsIHNlZSBiZWxvdykKKworICAgIFNvZnR3YXJlICAgICAgICAgU29mdHdhcmUgdXNlZCB0byBjcmVhdGUgdGhlIGltYWdlCisKKyAgICBEaXNjbGFpbWVyICAgICAgIExlZ2FsIGRpc2NsYWltZXIKKworICAgIFdhcm5pbmcgICAgICAgICAgV2FybmluZyBvZiBuYXR1cmUgb2YgY29udGVudAorCisgICAgU291cmNlICAgICAgICAgICBEZXZpY2UgdXNlZCB0byBjcmVhdGUgdGhlIGltYWdlCisKKyAgICBDb21tZW50ICAgICAgICAgIE1pc2NlbGxhbmVvdXMgY29tbWVudDsgY29udmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgZnJvbSBvdGhlciBpbWFnZSBmb3JtYXQKKworVGhlIGtleXdvcmQtdGV4dCBwYWlycyB3b3JrIGxpa2UgdGhpcy4gIEtleXdvcmRzIHNob3VsZCBiZSBzaG9ydAorc2ltcGxlIGRlc2NyaXB0aW9ucyBvZiB3aGF0IHRoZSBjb21tZW50IGlzIGFib3V0LiAgU29tZSB0eXBpY2FsCitrZXl3b3JkcyBhcmUgZm91bmQgaW4gdGhlIFBORyBzcGVjaWZpY2F0aW9uLCBhcyBpcyBzb21lIHJlY29tbWVuZGF0aW9ucworb24ga2V5d29yZHMuICBZb3UgY2FuIHJlcGVhdCBrZXl3b3JkcyBpbiBhIGZpbGUuICBZb3UgY2FuIGV2ZW4gd3JpdGUKK3NvbWUgdGV4dCBiZWZvcmUgdGhlIGltYWdlIGFuZCBzb21lIGFmdGVyLiAgRm9yIGV4YW1wbGUsIHlvdSBtYXkgd2FudAordG8gcHV0IGEgZGVzY3JpcHRpb24gb2YgdGhlIGltYWdlIGJlZm9yZSB0aGUgaW1hZ2UsIGJ1dCBsZWF2ZSB0aGUKK2Rpc2NsYWltZXIgdW50aWwgYWZ0ZXIsIHNvIHZpZXdlcnMgd29ya2luZyBvdmVyIG1vZGVtIGNvbm5lY3Rpb25zCitkb24ndCBoYXZlIHRvIHdhaXQgZm9yIHRoZSBkaXNjbGFpbWVyIHRvIGdvIG92ZXIgdGhlIG1vZGVtIGJlZm9yZQordGhleSBzdGFydCBzZWVpbmcgdGhlIGltYWdlLiAgRmluYWxseSwga2V5d29yZHMgc2hvdWxkIGJlIGZ1bGwKK3dvcmRzLCBub3QgYWJicmV2aWF0aW9ucy4gIEtleXdvcmRzIGFuZCB0ZXh0IGFyZSBpbiB0aGUgSVNPIDg4NTktMQorKExhdGluLTEpIGNoYXJhY3RlciBzZXQgKGEgc3VwZXJzZXQgb2YgcmVndWxhciBBU0NJSSkgYW5kIGNhbiBub3QKK2NvbnRhaW4gTlVMIGNoYXJhY3RlcnMsIGFuZCBzaG91bGQgbm90IGNvbnRhaW4gY29udHJvbCBvciBvdGhlcgordW5wcmludGFibGUgY2hhcmFjdGVycy4gIFRvIG1ha2UgdGhlIGNvbW1lbnRzIHdpZGVseSByZWFkYWJsZSwgc3RpY2sKK3dpdGggYmFzaWMgQVNDSUksIGFuZCBhdm9pZCBtYWNoaW5lIHNwZWNpZmljIGNoYXJhY3RlciBzZXQgZXh0ZW5zaW9ucworbGlrZSB0aGUgSUJNLVBDIGNoYXJhY3RlciBzZXQuICBUaGUga2V5d29yZCBtdXN0IGJlIHByZXNlbnQsIGJ1dAoreW91IGNhbiBsZWF2ZSBvZmYgdGhlIHRleHQgc3RyaW5nIG9uIG5vbi1jb21wcmVzc2VkIHBhaXJzLgorQ29tcHJlc3NlZCBwYWlycyBtdXN0IGhhdmUgYSB0ZXh0IHN0cmluZywgYXMgb25seSB0aGUgdGV4dCBzdHJpbmcKK2lzIGNvbXByZXNzZWQgYW55d2F5LCBzbyB0aGUgY29tcHJlc3Npb24gd291bGQgYmUgbWVhbmluZ2xlc3MuCisKK1BORyBzdXBwb3J0cyBtb2RpZmljYXRpb24gdGltZSB2aWEgdGhlIHBuZ190aW1lIHN0cnVjdHVyZS4gIFR3bworY29udmVyc2lvbiByb3V0aW5lcyBhcmUgcHJvdmlkZWQsIHBuZ19jb252ZXJ0X2Zyb21fdGltZV90KCkgZm9yCit0aW1lX3QgYW5kIHBuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtKCkgZm9yIHN0cnVjdCB0bS4gIFRoZQordGltZV90IHJvdXRpbmUgdXNlcyBnbXRpbWUoKS4gIFlvdSBkb24ndCBoYXZlIHRvIHVzZSBlaXRoZXIgb2YKK3RoZXNlLCBidXQgaWYgeW91IHdpc2ggdG8gZmlsbCBpbiB0aGUgcG5nX3RpbWUgc3RydWN0dXJlIGRpcmVjdGx5LAoreW91IHNob3VsZCBwcm92aWRlIHRoZSB0aW1lIGluIHVuaXZlcnNhbCB0aW1lIChHTVQpIGlmIHBvc3NpYmxlCitpbnN0ZWFkIG9mIHlvdXIgbG9jYWwgdGltZS4gIE5vdGUgdGhhdCB0aGUgeWVhciBudW1iZXIgaXMgdGhlIGZ1bGwKK3llYXIgKGUuZy4gMTk5OCwgcmF0aGVyIHRoYW4gOTggLSBQTkcgaXMgeWVhciAyMDAwIGNvbXBsaWFudCEpLCBhbmQKK3RoYXQgbW9udGhzIHN0YXJ0IHdpdGggMS4KKworSWYgeW91IHdhbnQgdG8gc3RvcmUgdGhlIHRpbWUgb2YgdGhlIG9yaWdpbmFsIGltYWdlIGNyZWF0aW9uLCB5b3Ugc2hvdWxkCit1c2UgYSBwbGFpbiB0RVh0IGNodW5rIHdpdGggdGhlICJDcmVhdGlvbiBUaW1lIiBrZXl3b3JkLiAgVGhpcyBpcworbmVjZXNzYXJ5IGJlY2F1c2UgdGhlICJjcmVhdGlvbiB0aW1lIiBvZiBhIFBORyBpbWFnZSBpcyBzb21ld2hhdCB2YWd1ZSwKK2RlcGVuZGluZyBvbiB3aGV0aGVyIHlvdSBtZWFuIHRoZSBQTkcgZmlsZSwgdGhlIHRpbWUgdGhlIGltYWdlIHdhcworY3JlYXRlZCBpbiBhIG5vbi1QTkcgZm9ybWF0LCBhIHN0aWxsIHBob3RvIGZyb20gd2hpY2ggdGhlIGltYWdlIHdhcworc2Nhbm5lZCwgb3IgcG9zc2libHkgdGhlIHN1YmplY3QgbWF0dGVyIGl0c2VsZi4gIEluIG9yZGVyIHRvIGZhY2lsaXRhdGUKK21hY2hpbmUtcmVhZGFibGUgZGF0ZXMsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlICJDcmVhdGlvbiBUaW1lIgordEVYdCBjaHVuayB1c2UgUkZDIDExMjMgZm9ybWF0IGRhdGVzIChlLmcuICIyMiBNYXkgMTk5NyAxODowNzoxMCBHTVQiKSwKK2FsdGhvdWdoIHRoaXMgaXNuJ3QgYSByZXF1aXJlbWVudC4gIFVubGlrZSB0aGUgdElNRSBjaHVuaywgdGhlCisiQ3JlYXRpb24gVGltZSIgdEVYdCBjaHVuayBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgYXV0b21hdGljYWxseSBjaGFuZ2VkCitieSB0aGUgc29mdHdhcmUuICBUbyBmYWNpbGl0YXRlIHRoZSB1c2Ugb2YgUkZDIDExMjMgZGF0ZXMsIGEgZnVuY3Rpb24KK3BuZ19jb252ZXJ0X3RvX3JmYzExMjNfYnVmZmVyKGJ1ZmZlciwgcG5nX3RpbWVwKSBpcyBwcm92aWRlZCB0bworY29udmVydCBmcm9tIFBORyB0aW1lIHRvIGFuIFJGQyAxMTIzIGZvcm1hdCBzdHJpbmcuICBUaGUgY2FsbGVyIG11c3QgcHJvdmlkZQorYSB3cml0ZWFibGUgYnVmZmVyIG9mIGF0IGxlYXN0IDI5IGJ5dGVzLgorCitXcml0aW5nIHVua25vd24gY2h1bmtzCisKK1lvdSBjYW4gdXNlIHRoZSBwbmdfc2V0X3Vua25vd25fY2h1bmtzIGZ1bmN0aW9uIHRvIHF1ZXVlIHVwIHByaXZhdGUgY2h1bmtzCitmb3Igd3JpdGluZy4gIFlvdSBnaXZlIGl0IGEgY2h1bmsgbmFtZSwgbG9jYXRpb24sIHJhdyBkYXRhLCBhbmQgYSBzaXplLiAgWW91CithbHNvIG11c3QgdXNlIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcygpIHRvIGVuc3VyZSB0aGF0IGxpYnBuZyB3aWxsCitoYW5kbGUgdGhlbS4gIFRoYXQncyBhbGwgdGhlcmUgaXMgdG8gaXQuICBUaGUgY2h1bmtzIHdpbGwgYmUgd3JpdHRlbiBieSB0aGUKK25leHQgZm9sbG93aW5nIHBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFLCBwbmdfd3JpdGVfaW5mbywgb3IgcG5nX3dyaXRlX2VuZAorZnVuY3Rpb24sIGRlcGVuZGluZyB1cG9uIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uICBBbnkgY2h1bmtzIHByZXZpb3VzbHkKK3JlYWQgaW50byB0aGUgaW5mbyBzdHJ1Y3R1cmUncyB1bmtub3duLWNodW5rIGxpc3Qgd2lsbCBhbHNvIGJlIHdyaXR0ZW4gb3V0CitpbiBhIHNlcXVlbmNlIHRoYXQgc2F0aXNmaWVzIHRoZSBQTkcgc3BlY2lmaWNhdGlvbidzIG9yZGVyaW5nIHJ1bGVzLgorCitIZXJlIGlzIGFuIGV4YW1wbGUgb2Ygd3JpdGluZyB0d28gcHJpdmF0ZSBjaHVua3MsIHByVnQgYW5kIG1pTkU6CisKKyAgICAjaWZkZWYgUE5HX1dSSVRFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAorICAgIC8qIFNldCB1bmtub3duIGNodW5rIGRhdGEgKi8KKyAgICBwbmdfdW5rbm93bl9jaHVuayB1bmtfY2h1bmtbMl07CisgICAgc3RyY3B5KChjaGFyICopIHVua19jaHVua1swXS5uYW1lLCAicHJWdCI7CisgICAgdW5rX2NodW5rWzBdLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSAiUFJJVkFURSBEQVRBIjsKKyAgICB1bmtfY2h1bmtbMF0uc2l6ZSA9IHN0cmxlbih1bmtfY2h1bmtbMF0uZGF0YSkrMTsKKyAgICB1bmtfY2h1bmtbMF0ubG9jYXRpb24gPSBQTkdfSEFWRV9JSERSOworICAgIHN0cmNweSgoY2hhciAqKSB1bmtfY2h1bmtbMV0ubmFtZSwgIm1pTkUiOworICAgIHVua19jaHVua1sxXS5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgIk1ZIENIVU5LIERBVEEiOworICAgIHVua19jaHVua1sxXS5zaXplID0gc3RybGVuKHVua19jaHVua1swXS5kYXRhKSsxOworICAgIHVua19jaHVua1sxXS5sb2NhdGlvbiA9IFBOR19BRlRFUl9JREFUOworICAgIHBuZ19zZXRfdW5rbm93bl9jaHVua3Mod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwKKyAgICAgICAgdW5rX2NodW5rLCAyKTsKKyAgICAvKiBOZWVkZWQgYmVjYXVzZSBtaU5FIGlzIG5vdCBzYWZlLXRvLWNvcHkgKi8KKyAgICBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MocG5nLCBQTkdfSEFORExFX0NIVU5LX0FMV0FZUywKKyAgICAgICAocG5nX2J5dGVwKSAibWlORSIsIDEpOworICAgICMgaWYgUE5HX0xJQlBOR19WRVIgPCAxMDYwMAorICAgICAgLyogRGVhbCB3aXRoIHVua25vd24gY2h1bmsgbG9jYXRpb24gYnVnIGluIDEuNS54IGFuZCBlYXJsaWVyICovCisgICAgICBwbmdfc2V0X3Vua25vd25fY2h1bmtfbG9jYXRpb24ocG5nLCBpbmZvLCAwLCBQTkdfSEFWRV9JSERSKTsKKyAgICAgIHBuZ19zZXRfdW5rbm93bl9jaHVua19sb2NhdGlvbihwbmcsIGluZm8sIDEsIFBOR19BRlRFUl9JREFUKTsKKyAgICAjIGVuZGlmCisgICAgIyBpZiBQTkdfTElCUE5HX1ZFUiA8IDEwNTAwCisgICAgICAvKiBQTkdfQUZURVJfSURBVCB3cml0ZXMgdHdvIGNvcGllcyBvZiB0aGUgY2h1bmsgcHJpb3IgdG8gbGlicG5nLTEuNS4wLAorICAgICAgICogb25lIGJlZm9yZSBJREFUIGFuZCBhbm90aGVyIGFmdGVyIElEQVQsIHNvIGRvbid0IHVzZSBpdDsgb25seSB1c2UKKyAgICAgICAqIFBOR19IQVZFX0lIRFIgbG9jYXRpb24uICBUaGlzIGNhbGwgcmVzZXRzIHRoZSBsb2NhdGlvbiBwcmV2aW91c2x5CisgICAgICAgKiBzZXQgYnkgYXNzaWdubWVudCBhbmQgcG5nX3NldF91bmtub3duX2NodW5rX2xvY2F0aW9uKCkgZm9yIGNodW5rIDEuCisgICAgICAgKi8KKyAgICAgIHBuZ19zZXRfdW5rbm93bl9jaHVua19sb2NhdGlvbihwbmcsIGluZm8sIDEsIFBOR19IQVZFX0lIRFIpOworICAgICMgZW5kaWYKKyAgICAjZW5kaWYKKworVGhlIGhpZ2gtbGV2ZWwgd3JpdGUgaW50ZXJmYWNlCisKK0F0IHRoaXMgcG9pbnQgdGhlcmUgYXJlIHR3byB3YXlzIHRvIHByb2NlZWQ7IHRocm91Z2ggdGhlIGhpZ2gtbGV2ZWwKK3dyaXRlIGludGVyZmFjZSwgb3IgdGhyb3VnaCBhIHNlcXVlbmNlIG9mIGxvdy1sZXZlbCB3cml0ZSBvcGVyYXRpb25zLgorWW91IGNhbiB1c2UgdGhlIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlIGlmIHlvdXIgaW1hZ2UgZGF0YSBpcyBwcmVzZW50CitpbiB0aGUgaW5mbyBzdHJ1Y3R1cmUuICBBbGwgZGVmaW5lZCBvdXRwdXQKK3RyYW5zZm9ybWF0aW9ucyBhcmUgcGVybWl0dGVkLCBlbmFibGVkIGJ5IHRoZSBmb2xsb3dpbmcgbWFza3MuCisKKyAgICBQTkdfVFJBTlNGT1JNX0lERU5USVRZICAgICAgTm8gdHJhbnNmb3JtYXRpb24KKyAgICBQTkdfVFJBTlNGT1JNX1BBQ0tJTkcgICAgICAgUGFjayAxLCAyIGFuZCA0LWJpdCBzYW1wbGVzCisgICAgUE5HX1RSQU5TRk9STV9QQUNLU1dBUCAgICAgIENoYW5nZSBvcmRlciBvZiBwYWNrZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzIHRvIExTQiBmaXJzdAorICAgIFBOR19UUkFOU0ZPUk1fSU5WRVJUX01PTk8gICBJbnZlcnQgbW9ub2Nocm9tZSBpbWFnZXMKKyAgICBQTkdfVFJBTlNGT1JNX1NISUZUICAgICAgICAgTm9ybWFsaXplIHBpeGVscyB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0JJVCBkZXB0aAorICAgIFBOR19UUkFOU0ZPUk1fQkdSICAgICAgICAgICBGbGlwIFJHQiB0byBCR1IsIFJHQkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gQkdSQQorICAgIFBOR19UUkFOU0ZPUk1fU1dBUF9BTFBIQSAgICBGbGlwIFJHQkEgdG8gQVJHQiBvciBHQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBBRworICAgIFBOR19UUkFOU0ZPUk1fSU5WRVJUX0FMUEhBICBDaGFuZ2UgYWxwaGEgZnJvbSBvcGFjaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRyYW5zcGFyZW5jeQorICAgIFBOR19UUkFOU0ZPUk1fU1dBUF9FTkRJQU4gICBCeXRlLXN3YXAgMTYtYml0IHNhbXBsZXMKKyAgICBQTkdfVFJBTlNGT1JNX1NUUklQX0ZJTExFUiAgICAgICAgU3RyaXAgb3V0IGZpbGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcyAoZGVwcmVjYXRlZCkuCisgICAgUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVJfQkVGT1JFIFN0cmlwIG91dCBsZWFkaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxlciBieXRlcworICAgIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSX0FGVEVSICBTdHJpcCBvdXQgdHJhaWxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbGVyIGJ5dGVzCisKK0lmIHlvdSBoYXZlIHZhbGlkIGltYWdlIGRhdGEgaW4gdGhlIGluZm8gc3RydWN0dXJlICh5b3UgY2FuIHVzZQorcG5nX3NldF9yb3dzKCkgdG8gcHV0IGltYWdlIGRhdGEgaW4gdGhlIGluZm8gc3RydWN0dXJlKSwgc2ltcGx5IGRvIHRoaXM6CisKKyAgICBwbmdfd3JpdGVfcG5nKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfdHJhbnNmb3JtcywgTlVMTCkKKword2hlcmUgcG5nX3RyYW5zZm9ybXMgaXMgYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBiaXR3aXNlIE9SIG9mIHNvbWUgc2V0IG9mCit0cmFuc2Zvcm1hdGlvbiBmbGFncy4gIFRoaXMgY2FsbCBpcyBlcXVpdmFsZW50IHRvIHBuZ193cml0ZV9pbmZvKCksCitmb2xsb3dlZCB0aGUgc2V0IG9mIHRyYW5zZm9ybWF0aW9ucyBpbmRpY2F0ZWQgYnkgdGhlIHRyYW5zZm9ybSBtYXNrLAordGhlbiBwbmdfd3JpdGVfaW1hZ2UoKSwgYW5kIGZpbmFsbHkgcG5nX3dyaXRlX2VuZCgpLgorCisoVGhlIGZpbmFsIHBhcmFtZXRlciBvZiB0aGlzIGNhbGwgaXMgbm90IHlldCB1c2VkLiAgU29tZWRheSBpdCBtaWdodCBwb2ludAordG8gdHJhbnNmb3JtYXRpb24gcGFyYW1ldGVycyByZXF1aXJlZCBieSBzb21lIGZ1dHVyZSBvdXRwdXQgdHJhbnNmb3JtLikKKworWW91IG11c3QgdXNlIHBuZ190cmFuc2Zvcm1zIGFuZCBub3QgY2FsbCBhbnkgcG5nX3NldF90cmFuc2Zvcm0oKSBmdW5jdGlvbnMKK3doZW4geW91IHVzZSBwbmdfd3JpdGVfcG5nKCkuCisKK1RoZSBsb3ctbGV2ZWwgd3JpdGUgaW50ZXJmYWNlCisKK0lmIHlvdSBhcmUgZ29pbmcgdGhlIGxvdy1sZXZlbCByb3V0ZSBpbnN0ZWFkLCB5b3UgYXJlIG5vdyByZWFkeSB0bword3JpdGUgYWxsIHRoZSBmaWxlIGluZm9ybWF0aW9uIHVwIHRvIHRoZSBhY3R1YWwgaW1hZ2UgZGF0YS4gIFlvdSBkbwordGhpcyB3aXRoIGEgY2FsbCB0byBwbmdfd3JpdGVfaW5mbygpLgorCisgICAgcG5nX3dyaXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOworCitOb3RlIHRoYXQgdGhlcmUgaXMgb25lIHRyYW5zZm9ybWF0aW9uIHlvdSBtYXkgbmVlZCB0byBkbyBiZWZvcmUKK3BuZ193cml0ZV9pbmZvKCkuICBJbiBQTkcgZmlsZXMsIHRoZSBhbHBoYSBjaGFubmVsIGluIGFuIGltYWdlIGlzIHRoZQorbGV2ZWwgb2Ygb3BhY2l0eS4gIElmIHlvdXIgZGF0YSBpcyBzdXBwbGllZCBhcyBhIGxldmVsIG9mIHRyYW5zcGFyZW5jeSwKK3lvdSBjYW4gaW52ZXJ0IHRoZSBhbHBoYSBjaGFubmVsIGJlZm9yZSB5b3Ugd3JpdGUgaXQsIHNvIHRoYXQgMCBpcworZnVsbHkgdHJhbnNwYXJlbnQgYW5kIDI1NSAoaW4gOC1iaXQgb3IgcGFsZXR0ZWQgaW1hZ2VzKSBvciA2NTUzNQorKGluIDE2LWJpdCBpbWFnZXMpIGlzIGZ1bGx5IG9wYXF1ZSwgd2l0aAorCisgICAgcG5nX3NldF9pbnZlcnRfYWxwaGEocG5nX3B0cik7CisKK1RoaXMgbXVzdCBhcHBlYXIgYmVmb3JlIHBuZ193cml0ZV9pbmZvKCkgaW5zdGVhZCBvZiBsYXRlciB3aXRoIHRoZQorb3RoZXIgdHJhbnNmb3JtYXRpb25zIGJlY2F1c2UgaW4gdGhlIGNhc2Ugb2YgcGFsZXR0ZWQgaW1hZ2VzIHRoZSB0Uk5TCitjaHVuayBkYXRhIGhhcyB0byBiZSBpbnZlcnRlZCBiZWZvcmUgdGhlIHRSTlMgY2h1bmsgaXMgd3JpdHRlbi4gIElmCit5b3VyIGltYWdlIGlzIG5vdCBhIHBhbGV0dGVkIGltYWdlLCB0aGUgdFJOUyBkYXRhICh3aGljaCBpbiBzdWNoIGNhc2VzCityZXByZXNlbnRzIGEgc2luZ2xlIGNvbG9yIHRvIGJlIHJlbmRlcmVkIGFzIHRyYW5zcGFyZW50KSB3b24ndCBuZWVkIHRvCitiZSBjaGFuZ2VkLCBhbmQgeW91IGNhbiBzYWZlbHkgZG8gdGhpcyB0cmFuc2Zvcm1hdGlvbiBhZnRlciB5b3VyCitwbmdfd3JpdGVfaW5mbygpIGNhbGwuCisKK0lmIHlvdSBuZWVkIHRvIHdyaXRlIGEgcHJpdmF0ZSBjaHVuayB0aGF0IHlvdSB3YW50IHRvIGFwcGVhciBiZWZvcmUKK3RoZSBQTFRFIGNodW5rIHdoZW4gUExURSBpcyBwcmVzZW50LCB5b3UgY2FuIHdyaXRlIHRoZSBQTkcgaW5mbyBpbgordHdvIHN0ZXBzLCBhbmQgaW5zZXJ0IGNvZGUgdG8gd3JpdGUgeW91ciBvd24gY2h1bmsgYmV0d2VlbiB0aGVtOgorCisgICAgcG5nX3dyaXRlX2luZm9fYmVmb3JlX1BMVEUocG5nX3B0ciwgaW5mb19wdHIpOworICAgIHBuZ19zZXRfdW5rbm93bl9jaHVua3MocG5nX3B0ciwgaW5mb19wdHIsIC4uLik7CisgICAgcG5nX3dyaXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOworCitBZnRlciB5b3UndmUgd3JpdHRlbiB0aGUgZmlsZSBpbmZvcm1hdGlvbiwgeW91IGNhbiBzZXQgdXAgdGhlIGxpYnJhcnkKK3RvIGhhbmRsZSBhbnkgc3BlY2lhbCB0cmFuc2Zvcm1hdGlvbnMgb2YgdGhlIGltYWdlIGRhdGEuICBUaGUgdmFyaW91cword2F5cyB0byB0cmFuc2Zvcm0gdGhlIGRhdGEgd2lsbCBiZSBkZXNjcmliZWQgaW4gdGhlIG9yZGVyIHRoYXQgdGhleQorc2hvdWxkIG9jY3VyLiAgVGhpcyBpcyBpbXBvcnRhbnQsIGFzIHNvbWUgb2YgdGhlc2UgY2hhbmdlIHRoZSBjb2xvcgordHlwZSBhbmQvb3IgYml0IGRlcHRoIG9mIHRoZSBkYXRhLCBhbmQgc29tZSBvdGhlcnMgb25seSB3b3JrIG9uCitjZXJ0YWluIGNvbG9yIHR5cGVzIGFuZCBiaXQgZGVwdGhzLiAgRXZlbiB0aG91Z2ggZWFjaCB0cmFuc2Zvcm1hdGlvbgorY2hlY2tzIHRvIHNlZSBpZiBpdCBoYXMgZGF0YSB0aGF0IGl0IGNhbiBkbyBzb21ldGhpbmcgd2l0aCwgeW91IHNob3VsZAorbWFrZSBzdXJlIHRvIG9ubHkgZW5hYmxlIGEgdHJhbnNmb3JtYXRpb24gaWYgaXQgd2lsbCBiZSB2YWxpZCBmb3IgdGhlCitkYXRhLiAgRm9yIGV4YW1wbGUsIGRvbid0IHN3YXAgcmVkIGFuZCBibHVlIG9uIGdyYXlzY2FsZSBkYXRhLgorCitQTkcgZmlsZXMgc3RvcmUgUkdCIHBpeGVscyBwYWNrZWQgaW50byAzIG9yIDYgYnl0ZXMuICBUaGlzIGNvZGUgdGVsbHMKK3RoZSBsaWJyYXJ5IHRvIHN0cmlwIGlucHV0IGRhdGEgdGhhdCBoYXMgNCBvciA4IGJ5dGVzIHBlciBwaXhlbCBkb3duCit0byAzIG9yIDYgYnl0ZXMgKG9yIHN0cmlwIDIgb3IgNC1ieXRlIGdyYXlzY2FsZStmaWxsZXIgZGF0YSB0byAxIG9yIDIKK2J5dGVzIHBlciBwaXhlbCkuCisKKyAgICBwbmdfc2V0X2ZpbGxlcihwbmdfcHRyLCAwLCBQTkdfRklMTEVSX0JFRk9SRSk7CisKK3doZXJlIHRoZSAwIGlzIHVudXNlZCwgYW5kIHRoZSBsb2NhdGlvbiBpcyBlaXRoZXIgUE5HX0ZJTExFUl9CRUZPUkUgb3IKK1BOR19GSUxMRVJfQUZURVIsIGRlcGVuZGluZyB1cG9uIHdoZXRoZXIgdGhlIGZpbGxlciBieXRlIGluIHRoZSBwaXhlbAoraXMgc3RvcmVkIFhSR0Igb3IgUkdCWC4KKworUE5HIGZpbGVzIHBhY2sgcGl4ZWxzIG9mIGJpdCBkZXB0aHMgMSwgMiwgYW5kIDQgaW50byBieXRlcyBhcyBzbWFsbCBhcwordGhleSBjYW4sIHJlc3VsdGluZyBpbiwgZm9yIGV4YW1wbGUsIDggcGl4ZWxzIHBlciBieXRlIGZvciAxIGJpdCBmaWxlcy4KK0lmIHRoZSBkYXRhIGlzIHN1cHBsaWVkIGF0IDEgcGl4ZWwgcGVyIGJ5dGUsIHVzZSB0aGlzIGNvZGUsIHdoaWNoIHdpbGwKK2NvcnJlY3RseSBwYWNrIHRoZSBwaXhlbHMgaW50byBhIHNpbmdsZSBieXRlOgorCisgICAgcG5nX3NldF9wYWNraW5nKHBuZ19wdHIpOworCitQTkcgZmlsZXMgcmVkdWNlIHBvc3NpYmxlIGJpdCBkZXB0aHMgdG8gMSwgMiwgNCwgOCwgYW5kIDE2LiAgSWYgeW91cgorZGF0YSBpcyBvZiBhbm90aGVyIGJpdCBkZXB0aCwgeW91IGNhbiB3cml0ZSBhbiBzQklUIGNodW5rIGludG8gdGhlCitmaWxlIHNvIHRoYXQgZGVjb2RlcnMgY2FuIHJlY292ZXIgdGhlIG9yaWdpbmFsIGRhdGEgaWYgZGVzaXJlZC4KKworICAgIC8qIFNldCB0aGUgdHJ1ZSBiaXQgZGVwdGggb2YgdGhlIGltYWdlIGRhdGEgKi8KKyAgICBpZiAoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKQorICAgIHsKKyAgICAgICBzaWdfYml0LnJlZCA9IHRydWVfYml0X2RlcHRoOworICAgICAgIHNpZ19iaXQuZ3JlZW4gPSB0cnVlX2JpdF9kZXB0aDsKKyAgICAgICBzaWdfYml0LmJsdWUgPSB0cnVlX2JpdF9kZXB0aDsKKyAgICB9CisKKyAgICBlbHNlCisgICAgeworICAgICAgIHNpZ19iaXQuZ3JheSA9IHRydWVfYml0X2RlcHRoOworICAgIH0KKworICAgIGlmIChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpCisgICAgeworICAgICAgIHNpZ19iaXQuYWxwaGEgPSB0cnVlX2JpdF9kZXB0aDsKKyAgICB9CisKKyAgICBwbmdfc2V0X3NCSVQocG5nX3B0ciwgaW5mb19wdHIsICZzaWdfYml0KTsKKworSWYgdGhlIGRhdGEgaXMgc3RvcmVkIGluIHRoZSByb3cgYnVmZmVyIGluIGEgYml0IGRlcHRoIG90aGVyIHRoYW4KK29uZSBzdXBwb3J0ZWQgYnkgUE5HIChlLmcuIDMgYml0IGRhdGEgaW4gdGhlIHJhbmdlIDAtNyBmb3IgYSA0LWJpdCBQTkcpLAordGhpcyB3aWxsIHNjYWxlIHRoZSB2YWx1ZXMgdG8gYXBwZWFyIHRvIGJlIHRoZSBjb3JyZWN0IGJpdCBkZXB0aCBhcworaXMgcmVxdWlyZWQgYnkgUE5HLgorCisgICAgcG5nX3NldF9zaGlmdChwbmdfcHRyLCAmc2lnX2JpdCk7CisKK1BORyBmaWxlcyBzdG9yZSAxNi1iaXQgcGl4ZWxzIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAoYmlnLWVuZGlhbiwKK2llLiBtb3N0IHNpZ25pZmljYW50IGJpdHMgZmlyc3QpLiAgVGhpcyBjb2RlIHdvdWxkIGJlIHVzZWQgaWYgdGhleSBhcmUKK3N1cHBsaWVkIHRoZSBvdGhlciB3YXkgKGxpdHRsZS1lbmRpYW4sIGkuZS4gbGVhc3Qgc2lnbmlmaWNhbnQgYml0cworZmlyc3QsIHRoZSB3YXkgUENzIHN0b3JlIHRoZW0pOgorCisgICAgaWYgKGJpdF9kZXB0aCA+IDgpCisgICAgICAgcG5nX3NldF9zd2FwKHBuZ19wdHIpOworCitJZiB5b3UgYXJlIHVzaW5nIHBhY2tlZC1waXhlbCBpbWFnZXMgKDEsIDIsIG9yIDQgYml0cy9waXhlbCksIGFuZCB5b3UKK25lZWQgdG8gY2hhbmdlIHRoZSBvcmRlciB0aGUgcGl4ZWxzIGFyZSBwYWNrZWQgaW50byBieXRlcywgeW91IGNhbiB1c2U6CisKKyAgICBpZiAoYml0X2RlcHRoIDwgOCkKKyAgICAgICBwbmdfc2V0X3BhY2tzd2FwKHBuZ19wdHIpOworCitQTkcgZmlsZXMgc3RvcmUgMyBjb2xvciBwaXhlbHMgaW4gcmVkLCBncmVlbiwgYmx1ZSBvcmRlci4gIFRoaXMgY29kZQord291bGQgYmUgdXNlZCBpZiB0aGV5IGFyZSBzdXBwbGllZCBhcyBibHVlLCBncmVlbiwgcmVkOgorCisgICAgcG5nX3NldF9iZ3IocG5nX3B0cik7CisKK1BORyBmaWxlcyBkZXNjcmliZSBtb25vY2hyb21lIGFzIGJsYWNrIGJlaW5nIHplcm8gYW5kIHdoaXRlIGJlaW5nCitvbmUuIFRoaXMgY29kZSB3b3VsZCBiZSB1c2VkIGlmIHRoZSBwaXhlbHMgYXJlIHN1cHBsaWVkIHdpdGggdGhpcyByZXZlcnNlZAorKGJsYWNrIGJlaW5nIG9uZSBhbmQgd2hpdGUgYmVpbmcgemVybyk6CisKKyAgICBwbmdfc2V0X2ludmVydF9tb25vKHBuZ19wdHIpOworCitGaW5hbGx5LCB5b3UgY2FuIHdyaXRlIHlvdXIgb3duIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIGlmIG5vbmUgb2YKK3RoZSBleGlzdGluZyBvbmVzIG1lZXRzIHlvdXIgbmVlZHMuICBUaGlzIGlzIGRvbmUgYnkgc2V0dGluZyBhIGNhbGxiYWNrCit3aXRoCisKKyAgICBwbmdfc2V0X3dyaXRlX3VzZXJfdHJhbnNmb3JtX2ZuKHBuZ19wdHIsCisgICAgICAgd3JpdGVfdHJhbnNmb3JtX2ZuKTsKKworWW91IG11c3Qgc3VwcGx5IHRoZSBmdW5jdGlvbgorCisgICAgdm9pZCB3cml0ZV90cmFuc2Zvcm1fZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3Jvd19pbmZvcAorICAgICAgIHJvd19pbmZvLCBwbmdfYnl0ZXAgZGF0YSkKKworU2VlIHBuZ3Rlc3QuYyBmb3IgYSB3b3JraW5nIGV4YW1wbGUuICBZb3VyIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCitiZWZvcmUgYW55IG9mIHRoZSBvdGhlciB0cmFuc2Zvcm1hdGlvbnMgYXJlIHByb2Nlc3NlZC4gIElmIHN1cHBvcnRlZAorbGlicG5nIGFsc28gc3VwcGxpZXMgYW4gaW5mb3JtYXRpb24gcm91dGluZSB0aGF0IG1heSBiZSBjYWxsZWQgZnJvbQoreW91ciBjYWxsYmFjazoKKworICAgcG5nX2dldF9jdXJyZW50X3Jvd19udW1iZXIocG5nX3B0cik7CisgICBwbmdfZ2V0X2N1cnJlbnRfcGFzc19udW1iZXIocG5nX3B0cik7CisKK1RoaXMgcmV0dXJucyB0aGUgY3VycmVudCByb3cgcGFzc2VkIHRvIHRoZSB0cmFuc2Zvcm0uICBXaXRoIGludGVybGFjZWQKK2ltYWdlcyB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgdGhlIHJvdyBpbiB0aGUgaW5wdXQgc3ViLWltYWdlIGltYWdlLiAgVXNlCitQTkdfUk9XX0ZST01fUEFTU19ST1cocm93LCBwYXNzKSBhbmQgUE5HX0NPTF9GUk9NX1BBU1NfQ09MKGNvbCwgcGFzcykgdG8KK2ZpbmQgdGhlIG91dHB1dCBwaXhlbCAoeCx5KSBnaXZlbiBhbiBpbnRlcmxhY2VkIHN1Yi1pbWFnZSBwaXhlbCAocm93LGNvbCxwYXNzKS4KKworVGhlIGRpc2N1c3Npb24gb2YgaW50ZXJsYWNlIGhhbmRsaW5nIGFib3ZlIGNvbnRhaW5zIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvCit1c2UgdGhlc2UgdmFsdWVzLgorCitZb3UgY2FuIGFsc28gc2V0IHVwIGEgcG9pbnRlciB0byBhIHVzZXIgc3RydWN0dXJlIGZvciB1c2UgYnkgeW91cgorY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgICBwbmdfc2V0X3VzZXJfdHJhbnNmb3JtX2luZm8ocG5nX3B0ciwgdXNlcl9wdHIsIDAsIDApOworCitUaGUgdXNlcl9jaGFubmVscyBhbmQgdXNlcl9kZXB0aCBwYXJhbWV0ZXJzIG9mIHRoaXMgZnVuY3Rpb24gYXJlIGlnbm9yZWQKK3doZW4gd3JpdGluZzsgeW91IGNhbiBzZXQgdGhlbSB0byB6ZXJvIGFzIHNob3duLgorCitZb3UgY2FuIHJldHJpZXZlIHRoZSBwb2ludGVyIHZpYSB0aGUgZnVuY3Rpb24gcG5nX2dldF91c2VyX3RyYW5zZm9ybV9wdHIoKS4KK0ZvciBleGFtcGxlOgorCisgICAgdm9pZHAgd3JpdGVfdXNlcl90cmFuc2Zvcm1fcHRyID0KKyAgICAgICBwbmdfZ2V0X3VzZXJfdHJhbnNmb3JtX3B0cihwbmdfcHRyKTsKKworSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBsaWJwbmcgZmx1c2ggYW55IHBlbmRpbmcgb3V0cHV0LCBlaXRoZXIgbWFudWFsbHksCitvciBhdXRvbWF0aWNhbGx5IGFmdGVyIGEgY2VydGFpbiBudW1iZXIgb2YgbGluZXMgaGF2ZSBiZWVuIHdyaXR0ZW4uICBUbworZmx1c2ggdGhlIG91dHB1dCBzdHJlYW0gYSBzaW5nbGUgdGltZSBjYWxsOgorCisgICAgcG5nX3dyaXRlX2ZsdXNoKHBuZ19wdHIpOworCithbmQgdG8gaGF2ZSBsaWJwbmcgZmx1c2ggdGhlIG91dHB1dCBzdHJlYW0gcGVyaW9kaWNhbGx5IGFmdGVyIGEgY2VydGFpbgorbnVtYmVyIG9mIHNjYW5saW5lcyBoYXZlIGJlZW4gd3JpdHRlbiwgY2FsbDoKKworICAgIHBuZ19zZXRfZmx1c2gocG5nX3B0ciwgbnJvd3MpOworCitOb3RlIHRoYXQgdGhlIGRpc3RhbmNlIGJldHdlZW4gcm93cyBpcyBmcm9tIHRoZSBsYXN0IHRpbWUgcG5nX3dyaXRlX2ZsdXNoKCkKK3dhcyBjYWxsZWQsIG9yIHRoZSBmaXJzdCByb3cgb2YgdGhlIGltYWdlIGlmIGl0IGhhcyBuZXZlciBiZWVuIGNhbGxlZC4KK1NvIGlmIHlvdSB3cml0ZSA1MCBsaW5lcywgYW5kIHRoZW4gcG5nX3NldF9mbHVzaCAyNSwgaXQgd2lsbCBmbHVzaCB0aGUKK291dHB1dCBvbiB0aGUgbmV4dCBzY2FubGluZSwgYW5kIGV2ZXJ5IDI1IGxpbmVzIHRoZXJlYWZ0ZXIsIHVubGVzcworcG5nX3dyaXRlX2ZsdXNoKCkgaXMgY2FsbGVkIGJlZm9yZSAyNSBtb3JlIGxpbmVzIGhhdmUgYmVlbiB3cml0dGVuLgorSWYgbnJvd3MgaXMgdG9vIHNtYWxsIChsZXNzIHRoYW4gYWJvdXQgMTAgbGluZXMgZm9yIGEgNjQwIHBpeGVsIHdpZGUKK1JHQiBpbWFnZSkgdGhlIGltYWdlIGNvbXByZXNzaW9uIG1heSBkZWNyZWFzZSBub3RpY2VhYmx5IChhbHRob3VnaCB0aGlzCittYXkgYmUgYWNjZXB0YWJsZSBmb3IgcmVhbC10aW1lIGFwcGxpY2F0aW9ucykuICBJbmZyZXF1ZW50IGZsdXNoaW5nIHdpbGwKK29ubHkgZGVncmFkZSB0aGUgY29tcHJlc3Npb24gcGVyZm9ybWFuY2UgYnkgYSBmZXcgcGVyY2VudCBvdmVyIGltYWdlcwordGhhdCBkbyBub3QgdXNlIGZsdXNoaW5nLgorCitXcml0aW5nIHRoZSBpbWFnZSBkYXRhCisKK1RoYXQncyBpdCBmb3IgdGhlIHRyYW5zZm9ybWF0aW9ucy4gIE5vdyB5b3UgY2FuIHdyaXRlIHRoZSBpbWFnZSBkYXRhLgorVGhlIHNpbXBsZXN0IHdheSB0byBkbyB0aGlzIGlzIGluIG9uZSBmdW5jdGlvbiBjYWxsLiAgSWYgeW91IGhhdmUgdGhlCit3aG9sZSBpbWFnZSBpbiBtZW1vcnksIHlvdSBjYW4ganVzdCBjYWxsIHBuZ193cml0ZV9pbWFnZSgpIGFuZCBsaWJwbmcKK3dpbGwgd3JpdGUgdGhlIGltYWdlLiAgWW91IHdpbGwgbmVlZCB0byBwYXNzIGluIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvCitlYWNoIHJvdy4gIFRoaXMgZnVuY3Rpb24gYXV0b21hdGljYWxseSBoYW5kbGVzIGludGVybGFjaW5nLCBzbyB5b3UgZG9uJ3QKK25lZWQgdG8gY2FsbCBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZygpIG9yIGNhbGwgdGhpcyBmdW5jdGlvbiBtdWx0aXBsZQordGltZXMsIG9yIGFueSBvZiB0aGF0IG90aGVyIHN0dWZmIG5lY2Vzc2FyeSB3aXRoIHBuZ193cml0ZV9yb3dzKCkuCisKKyAgICBwbmdfd3JpdGVfaW1hZ2UocG5nX3B0ciwgcm93X3BvaW50ZXJzKTsKKword2hlcmUgcm93X3BvaW50ZXJzIGlzOgorCisgICAgcG5nX2J5dGUgKnJvd19wb2ludGVyc1toZWlnaHRdOworCitZb3UgY2FuIHBvaW50IHRvIHZvaWQgb3IgY2hhciBvciB3aGF0ZXZlciB5b3UgdXNlIGZvciBwaXhlbHMuCisKK0lmIHlvdSBkb24ndCB3YW50IHRvIHdyaXRlIHRoZSB3aG9sZSBpbWFnZSBhdCBvbmNlLCB5b3UgY2FuCit1c2UgcG5nX3dyaXRlX3Jvd3MoKSBpbnN0ZWFkLiAgSWYgdGhlIGZpbGUgaXMgbm90IGludGVybGFjZWQsCit0aGlzIGlzIHNpbXBsZToKKworICAgIHBuZ193cml0ZV9yb3dzKHBuZ19wdHIsIHJvd19wb2ludGVycywKKyAgICAgICBudW1iZXJfb2Zfcm93cyk7CisKK3Jvd19wb2ludGVycyBpcyB0aGUgc2FtZSBhcyBpbiB0aGUgcG5nX3dyaXRlX2ltYWdlKCkgY2FsbC4KKworSWYgeW91IGFyZSBqdXN0IHdyaXRpbmcgb25lIHJvdyBhdCBhIHRpbWUsIHlvdSBjYW4gZG8gdGhpcyB3aXRoCithIHNpbmdsZSByb3dfcG9pbnRlciBpbnN0ZWFkIG9mIGFuIGFycmF5IG9mIHJvd19wb2ludGVyczoKKworICAgIHBuZ19ieXRlcCByb3dfcG9pbnRlciA9IHJvdzsKKworICAgIHBuZ193cml0ZV9yb3cocG5nX3B0ciwgcm93X3BvaW50ZXIpOworCitXaGVuIHRoZSBmaWxlIGlzIGludGVybGFjZWQsIHRoaW5ncyBjYW4gZ2V0IGEgZ29vZCBkZWFsIG1vcmUgY29tcGxpY2F0ZWQuCitUaGUgb25seSBjdXJyZW50bHkgKGFzIG9mIHRoZSBQTkcgU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMiwgZGF0ZWQgSnVseQorMTk5OSkgZGVmaW5lZCBpbnRlcmxhY2luZyBzY2hlbWUgZm9yIFBORyBmaWxlcyBpcyB0aGUgIkFkYW03IiBpbnRlcmxhY2UKK3NjaGVtZSwgdGhhdCBicmVha3MgZG93biBhbiBpbWFnZSBpbnRvIHNldmVuIHNtYWxsZXIgaW1hZ2VzIG9mIHZhcnlpbmcKK3NpemUuICBsaWJwbmcgd2lsbCBidWlsZCB0aGVzZSBpbWFnZXMgZm9yIHlvdSwgb3IgeW91IGNhbiBkbyB0aGVtCit5b3Vyc2VsZi4gIElmIHlvdSB3YW50IHRvIGJ1aWxkIHRoZW0geW91cnNlbGYsIHNlZSB0aGUgUE5HIHNwZWNpZmljYXRpb24KK2ZvciBkZXRhaWxzIG9mIHdoaWNoIHBpeGVscyB0byB3cml0ZSB3aGVuLgorCitJZiB5b3UgZG9uJ3Qgd2FudCBsaWJwbmcgdG8gaGFuZGxlIHRoZSBpbnRlcmxhY2luZyBkZXRhaWxzLCBqdXN0Cit1c2UgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcoKSBhbmQgY2FsbCBwbmdfd3JpdGVfcm93cygpIHRoZQorY29ycmVjdCBudW1iZXIgb2YgdGltZXMgdG8gd3JpdGUgYWxsIHRoZSBzdWItaW1hZ2VzCisocG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcoKSByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3ViLWltYWdlcy4pCisKK0lmIHlvdSB3YW50IGxpYnBuZyB0byBidWlsZCB0aGUgc3ViLWltYWdlcywgY2FsbCB0aGlzIGJlZm9yZSB5b3Ugc3RhcnQKK3dyaXRpbmcgYW55IHJvd3M6CisKKyAgICBudW1iZXJfb2ZfcGFzc2VzID0gcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3B0cik7CisKK1RoaXMgd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiBwYXNzZXMgbmVlZGVkLiAgQ3VycmVudGx5LCB0aGlzIGlzIHNldmVuLAorYnV0IG1heSBjaGFuZ2UgaWYgYW5vdGhlciBpbnRlcmxhY2UgdHlwZSBpcyBhZGRlZC4KKworVGhlbiB3cml0ZSB0aGUgY29tcGxldGUgaW1hZ2UgbnVtYmVyX29mX3Bhc3NlcyB0aW1lcy4KKworICAgIHBuZ193cml0ZV9yb3dzKHBuZ19wdHIsIHJvd19wb2ludGVycywgbnVtYmVyX29mX3Jvd3MpOworCitUaGluayBjYXJlZnVsbHkgYmVmb3JlIHlvdSB3cml0ZSBhbiBpbnRlcmxhY2VkIGltYWdlLiAgVHlwaWNhbGx5IGNvZGUgdGhhdAorcmVhZHMgc3VjaCBpbWFnZXMgcmVhZHMgYWxsIHRoZSBpbWFnZSBkYXRhIGludG8gbWVtb3J5LCB1bmNvbXByZXNzZWQsIGJlZm9yZQorZG9pbmcgYW55IHByb2Nlc3NpbmcuICBPbmx5IGNvZGUgdGhhdCBjYW4gZGlzcGxheSBhbiBpbWFnZSBvbiB0aGUgZmx5IGNhbgordGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGludGVybGFjaW5nIGFuZCBldmVuIHRoZW4gdGhlIGltYWdlIGhhcyB0byBiZSBleGFjdGx5Cit0aGUgY29ycmVjdCBzaXplIGZvciB0aGUgb3V0cHV0IGRldmljZSwgYmVjYXVzZSBzY2FsaW5nIGFuIGltYWdlIHJlcXVpcmVzCithZGphY2VudCBwaXhlbHMgYW5kIHRoZXNlIGFyZSBub3QgYXZhaWxhYmxlIHVudGlsIGFsbCB0aGUgcGFzc2VzIGhhdmUgYmVlbgorcmVhZC4KKworSWYgeW91IGRvIHdyaXRlIGFuIGludGVybGFjZWQgaW1hZ2UgeW91IHdpbGwgaGFyZGx5IGV2ZXIgbmVlZCB0byBoYW5kbGUKK3RoZSBpbnRlcmxhY2luZyB5b3Vyc2VsZi4gIENhbGwgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcoKSBhbmQgdXNlIHRoZQorYXBwcm9hY2ggZGVzY3JpYmVkIGFib3ZlLgorCitUaGUgb25seSB0aW1lIGl0IGlzIGNvbmNlaXZhYmxlIHRoYXQgeW91IHdpbGwgcmVhbGx5IG5lZWQgdG8gd3JpdGUgYW4KK2ludGVybGFjZWQgaW1hZ2UgcGFzcy1ieS1wYXNzIGlzIHdoZW4geW91IGhhdmUgcmVhZCBvbmUgcGFzcyBieSBwYXNzIGFuZAorbWFkZSBzb21lIHBpeGVsLWJ5LXBpeGVsIHRyYW5zZm9ybWF0aW9uIHRvIGl0LCBhcyBkZXNjcmliZWQgaW4gdGhlIHJlYWQKK2NvZGUgYWJvdmUuICBJbiB0aGlzIGNhc2UgdXNlIHRoZSBQTkdfUEFTU19ST1dTIGFuZCBQTkdfUEFTU19DT0xTIG1hY3JvcwordG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIGVhY2ggc3ViLWltYWdlIGluIHR1cm4gYW5kIHNpbXBseSB3cml0ZSB0aGUgcm93cworeW91IG9idGFpbmVkIGZyb20gdGhlIHJlYWQgY29kZS4KKworRmluaXNoaW5nIGEgc2VxdWVudGlhbCB3cml0ZQorCitBZnRlciB5b3UgYXJlIGZpbmlzaGVkIHdyaXRpbmcgdGhlIGltYWdlLCB5b3Ugc2hvdWxkIGZpbmlzaCB3cml0aW5nCit0aGUgZmlsZS4gIElmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiB3cml0aW5nIGNvbW1lbnRzIG9yIHRpbWUsIHlvdSBzaG91bGQKK3Bhc3MgYW4gYXBwcm9wcmlhdGVseSBmaWxsZWQgcG5nX2luZm8gcG9pbnRlci4gIElmIHlvdSBhcmUgbm90IGludGVyZXN0ZWQsCit5b3UgY2FuIHBhc3MgTlVMTC4KKworICAgIHBuZ193cml0ZV9lbmQocG5nX3B0ciwgaW5mb19wdHIpOworCitXaGVuIHlvdSBhcmUgZG9uZSwgeW91IGNhbiBmcmVlIGFsbCBtZW1vcnkgdXNlZCBieSBsaWJwbmcgbGlrZSB0aGlzOgorCisgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIpOworCitJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGluZGl2aWR1YWxseSBmcmVlIHRoZSBpbmZvX3B0ciBtZW1iZXJzIHRoYXQKK3BvaW50IHRvIGxpYnBuZy1hbGxvY2F0ZWQgc3RvcmFnZSB3aXRoIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246CisKKyAgICBwbmdfZnJlZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBtYXNrLCBzZXEpCisKKyAgICBtYXNrICAtIGlkZW50aWZpZXMgZGF0YSB0byBiZSBmcmVlZCwgYSBtYXNrCisgICAgICAgICAgICBjb250YWluaW5nIHRoZSBiaXR3aXNlIE9SIG9mIG9uZSBvcgorICAgICAgICAgICAgbW9yZSBvZgorICAgICAgICAgICAgICBQTkdfRlJFRV9QTFRFLCBQTkdfRlJFRV9UUk5TLAorICAgICAgICAgICAgICBQTkdfRlJFRV9ISVNULCBQTkdfRlJFRV9JQ0NQLAorICAgICAgICAgICAgICBQTkdfRlJFRV9QQ0FMLCBQTkdfRlJFRV9ST1dTLAorICAgICAgICAgICAgICBQTkdfRlJFRV9TQ0FMLCBQTkdfRlJFRV9TUExULAorICAgICAgICAgICAgICBQTkdfRlJFRV9URVhULCBQTkdfRlJFRV9VTktOLAorICAgICAgICAgICAgb3Igc2ltcGx5IFBOR19GUkVFX0FMTAorCisgICAgc2VxICAgLSBzZXF1ZW5jZSBudW1iZXIgb2YgaXRlbSB0byBiZSBmcmVlZAorICAgICAgICAgICAgKC0xIGZvciBhbGwgaXRlbXMpCisKK1RoaXMgZnVuY3Rpb24gbWF5IGJlIHNhZmVseSBjYWxsZWQgd2hlbiB0aGUgcmVsZXZhbnQgc3RvcmFnZSBoYXMKK2FscmVhZHkgYmVlbiBmcmVlZCwgb3IgaGFzIG5vdCB5ZXQgYmVlbiBhbGxvY2F0ZWQsIG9yIHdhcyBhbGxvY2F0ZWQKK2J5IHRoZSB1c2VyICBhbmQgbm90IGJ5IGxpYnBuZywgIGFuZCB3aWxsIGluIHRob3NlIGNhc2VzIGRvIG5vdGhpbmcuCitUaGUgInNlcSIgcGFyYW1ldGVyIGlzIGlnbm9yZWQgaWYgb25seSBvbmUgaXRlbSBvZiB0aGUgc2VsZWN0ZWQgZGF0YQordHlwZSwgc3VjaCBhcyBQTFRFLCBpcyBhbGxvd2VkLiAgSWYgInNlcSIgaXMgbm90IC0xLCBhbmQgbXVsdGlwbGUgaXRlbXMKK2FyZSBhbGxvd2VkIGZvciB0aGUgZGF0YSB0eXBlIGlkZW50aWZpZWQgaW4gdGhlIG1hc2ssIHN1Y2ggYXMgdGV4dCBvcgorc1BMVCwgb25seSB0aGUgbid0aCBpdGVtIGluIHRoZSBzdHJ1Y3R1cmUgaXMgZnJlZWQsIHdoZXJlIG4gaXMgInNlcSIuCisKK0lmIHlvdSBhbGxvY2F0ZWQgZGF0YSBzdWNoIGFzIGEgcGFsZXR0ZSB0aGF0IHlvdSBwYXNzZWQgaW4gdG8gbGlicG5nCit3aXRoIHBuZ19zZXRfKiwgeW91IG11c3Qgbm90IGZyZWUgaXQgdW50aWwganVzdCBiZWZvcmUgdGhlIGNhbGwgdG8KK3BuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgpLgorCitUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyBvbmx5IHRvIGZyZWUgZGF0YSB0aGF0IHdhcyBhbGxvY2F0ZWQgaW50ZXJuYWxseQorYnkgbGlicG5nLiAgVGhpcyBjYW4gYmUgY2hhbmdlZCwgc28gdGhhdCBsaWJwbmcgd2lsbCBub3QgZnJlZSB0aGUgZGF0YSwKK29yIHNvIHRoYXQgaXQgd2lsbCBmcmVlIGRhdGEgdGhhdCB3YXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyIHdpdGggcG5nX21hbGxvYygpCitvciBwbmdfY2FsbG9jKCkgYW5kIHBhc3NlZCBpbiB2aWEgYSBwbmdfc2V0XyooKSBmdW5jdGlvbiwgd2l0aAorCisgICAgcG5nX2RhdGFfZnJlZXIocG5nX3B0ciwgaW5mb19wdHIsIGZyZWVyLCBtYXNrKQorCisgICAgZnJlZXIgIC0gb25lIG9mCisgICAgICAgICAgICAgICBQTkdfREVTVFJPWV9XSUxMX0ZSRUVfREFUQQorICAgICAgICAgICAgICAgUE5HX1NFVF9XSUxMX0ZSRUVfREFUQQorICAgICAgICAgICAgICAgUE5HX1VTRVJfV0lMTF9GUkVFX0RBVEEKKworICAgIG1hc2sgICAtIHdoaWNoIGRhdGEgZWxlbWVudHMgYXJlIGFmZmVjdGVkCisgICAgICAgICAgICAgc2FtZSBjaG9pY2VzIGFzIGluIHBuZ19mcmVlX2RhdGEoKQorCitGb3IgZXhhbXBsZSwgdG8gdHJhbnNmZXIgcmVzcG9uc2liaWxpdHkgZm9yIHNvbWUgZGF0YSBmcm9tIGEgcmVhZCBzdHJ1Y3R1cmUKK3RvIGEgd3JpdGUgc3RydWN0dXJlLCB5b3UgY291bGQgdXNlCisKKyAgICBwbmdfZGF0YV9mcmVlcihyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwKKyAgICAgICBQTkdfVVNFUl9XSUxMX0ZSRUVfREFUQSwKKyAgICAgICBQTkdfRlJFRV9QTFRFfFBOR19GUkVFX3RSTlN8UE5HX0ZSRUVfaElTVCkKKworICAgIHBuZ19kYXRhX2ZyZWVyKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsCisgICAgICAgUE5HX0RFU1RST1lfV0lMTF9GUkVFX0RBVEEsCisgICAgICAgUE5HX0ZSRUVfUExURXxQTkdfRlJFRV90Uk5TfFBOR19GUkVFX2hJU1QpCisKK3RoZXJlYnkgYnJpZWZseSByZWFzc2lnbmluZyByZXNwb25zaWJpbGl0eSBmb3IgZnJlZWluZyB0byB0aGUgdXNlciBidXQKK2ltbWVkaWF0ZWx5IGFmdGVyd2FyZHMgcmVhc3NpZ25pbmcgaXQgb25jZSBtb3JlIHRvIHRoZSB3cml0ZV9kZXN0cm95CitmdW5jdGlvbi4gIEhhdmluZyBkb25lIHRoaXMsIGl0IHdvdWxkIHRoZW4gYmUgc2FmZSB0byBkZXN0cm95IHRoZSByZWFkCitzdHJ1Y3R1cmUgYW5kIGNvbnRpbnVlIHRvIHVzZSB0aGUgUExURSwgdFJOUywgYW5kIGhJU1QgZGF0YSBpbiB0aGUgd3JpdGUKK3N0cnVjdHVyZS4KKworVGhpcyBmdW5jdGlvbiBvbmx5IGFmZmVjdHMgZGF0YSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkLgorWW91IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGNhbGxpbmcgYWZ0ZXIgdGhlIHBuZ19zZXRfKigpIGZ1bmN0aW9ucwordG8gY29udHJvbCB3aGV0aGVyIHRoZSB1c2VyIG9yIHBuZ19kZXN0cm95XyooKSBpcyBzdXBwb3NlZCB0byBmcmVlIHRoZSBkYXRhLgorV2hlbiB0aGUgdXNlciBhc3N1bWVzIHJlc3BvbnNpYmlsaXR5IGZvciBsaWJwbmctYWxsb2NhdGVkIGRhdGEsIHRoZQorYXBwbGljYXRpb24gbXVzdCB1c2UKK3BuZ19mcmVlKCkgdG8gZnJlZSBpdCwgYW5kIHdoZW4gdGhlIHVzZXIgdHJhbnNmZXJzIHJlc3BvbnNpYmlsaXR5IHRvIGxpYnBuZworZm9yIGRhdGEgdGhhdCB0aGUgdXNlciBoYXMgYWxsb2NhdGVkLCB0aGUgdXNlciBtdXN0IGhhdmUgdXNlZCBwbmdfbWFsbG9jKCkKK29yIHBuZ19jYWxsb2MoKSB0byBhbGxvY2F0ZSBpdC4KKworSWYgeW91IGFsbG9jYXRlZCB0ZXh0X3B0ci50ZXh0LCB0ZXh0X3B0ci5sYW5nLCBhbmQgdGV4dF9wdHIudHJhbnNsYXRlZF9rZXl3b3JkCitzZXBhcmF0ZWx5LCBkbyBub3QgdHJhbnNmZXIgcmVzcG9uc2liaWxpdHkgZm9yIGZyZWVpbmcgdGV4dF9wdHIgdG8gbGlicG5nLAorYmVjYXVzZSB3aGVuIGxpYnBuZyBmaWxscyBhIHBuZ190ZXh0IHN0cnVjdHVyZSBpdCBjb21iaW5lcyB0aGVzZSBtZW1iZXJzIHdpdGgKK3RoZSBrZXkgbWVtYmVyLCBhbmQgcG5nX2ZyZWVfZGF0YSgpIHdpbGwgZnJlZSBvbmx5IHRleHRfcHRyLmtleS4gIFNpbWlsYXJseSwKK2lmIHlvdSB0cmFuc2ZlciByZXNwb25zaWJpbGl0eSBmb3IgZnJlZSdpbmcgdGV4dF9wdHIgZnJvbSBsaWJwbmcgdG8geW91cgorYXBwbGljYXRpb24sIHlvdXIgYXBwbGljYXRpb24gbXVzdCBub3Qgc2VwYXJhdGVseSBmcmVlIHRob3NlIG1lbWJlcnMuCitGb3IgYSBtb3JlIGNvbXBhY3QgZXhhbXBsZSBvZiB3cml0aW5nIGEgUE5HIGltYWdlLCBzZWUgdGhlIGZpbGUgZXhhbXBsZS5jLgorCitWLiBTaW1wbGlmaWVkIEFQSQorCitUaGUgc2ltcGxpZmllZCBBUEksIHdoaWNoIGJlY2FtZSBhdmFpbGFibGUgaW4gbGlicG5nLTEuNi4wLCBoaWRlcyB0aGUgZGV0YWlscworb2YgYm90aCBsaWJwbmcgYW5kIHRoZSBQTkcgZmlsZSBmb3JtYXQgaXRzZWxmLgorSXQgYWxsb3dzIFBORyBmaWxlcyB0byBiZSByZWFkIGludG8gYSB2ZXJ5IGxpbWl0ZWQgbnVtYmVyIG9mCitpbi1tZW1vcnkgYml0bWFwIGZvcm1hdHMgb3IgdG8gYmUgd3JpdHRlbiBmcm9tIHRoZSBzYW1lIGZvcm1hdHMuICBJZiB0aGVzZQorZm9ybWF0cyBkbyBub3QgYWNjb21tb2RhdGUgeW91ciBuZWVkcyB0aGVuIHlvdSBjYW4sIGFuZCBzaG91bGQsIHVzZSB0aGUgbW9yZQorc29waGlzdGljYXRlZCBBUElzIGFib3ZlIC0gdGhlc2Ugc3VwcG9ydCBhIHdpZGUgdmFyaWV0eSBvZiBpbi1tZW1vcnkgZm9ybWF0cworYW5kIGEgd2lkZSB2YXJpZXR5IG9mIHNvcGhpc3RpY2F0ZWQgdHJhbnNmb3JtYXRpb25zIHRvIHRob3NlIGZvcm1hdHMgYXMgd2VsbAorYXMgYSB3aWRlIHZhcmlldHkgb2YgQVBJcyB0byBtYW5pcHVsYXRlIGFuY2lsbGlhcnkgaW5mb3JtYXRpb24uCisKK1RvIHJlYWQgYSBQTkcgZmlsZSB1c2luZyB0aGUgc2ltcGxpZmllZCBBUEk6CisKKyAgMSkgRGVjbGFyZSBhICdwbmdfaW1hZ2UnIHN0cnVjdHVyZSAoc2VlIGJlbG93KSBvbiB0aGUgc3RhY2ssIHNldCB0aGUKKyAgICAgdmVyc2lvbiBmaWVsZCB0byBQTkdfSU1BR0VfVkVSU0lPTiBhbmQgdGhlICdvcGFxdWUnIHBvaW50ZXIgdG8gTlVMTAorICAgICAodGhpcyBpcyBSRVFVSVJFRCwgeW91ciBwcm9ncmFtIG1heSBjcmFzaCBpZiB5b3UgZG9uJ3QgZG8gaXQuKQorCisgIDIpIENhbGwgdGhlIGFwcHJvcHJpYXRlIHBuZ19pbWFnZV9iZWdpbl9yZWFkLi4uIGZ1bmN0aW9uLgorCisgIDMpIFNldCB0aGUgcG5nX2ltYWdlICdmb3JtYXQnIG1lbWJlciB0byB0aGUgcmVxdWlyZWQgc2FtcGxlIGZvcm1hdC4KKworICA0KSBBbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhlIGltYWdlIGFuZCwgaWYgcmVxdWlyZWQsIHRoZSBjb2xvci1tYXAuCisKKyAgNSkgQ2FsbCBwbmdfaW1hZ2VfZmluaXNoX3JlYWQgdG8gcmVhZCB0aGUgaW1hZ2UgYW5kLCBpZiByZXF1aXJlZCwgdGhlCisgICAgIGNvbG9yLW1hcCBpbnRvIHlvdXIgYnVmZmVycy4KKworVGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB0aGUgZm9ybWF0IG9mIHRoZSBQTkcgaW5wdXQgaXRzZWxmOyBhbGwgdmFsaWQKK2NvbG9yIHR5cGVzLCBiaXQgZGVwdGhzLCBhbmQgaW50ZXJsYWNlIG1ldGhvZHMgYXJlIGFjY2VwdGFibGUsIGFuZCB0aGUKK2lucHV0IGltYWdlIGlzIHRyYW5zZm9ybWVkIGFzIG5lY2Vzc2FyeSB0byB0aGUgcmVxdWVzdGVkIGluLW1lbW9yeSBmb3JtYXQKK2R1cmluZyB0aGUgcG5nX2ltYWdlX2ZpbmlzaF9yZWFkKCkgc3RlcC4gIFRoZSBvbmx5IGNhdmVhdCBpcyB0aGF0IGlmIHlvdQorcmVxdWVzdCBhIGNvbG9yLW1hcHBlZCBpbWFnZSBmcm9tIGEgUE5HIHRoYXQgaXMgZnVsbC1jb2xvciBvciBtYWtlcworY29tcGxleCB1c2Ugb2YgYW4gYWxwaGEgY2hhbm5lbCB0aGUgdHJhbnNmb3JtYXRpb24gaXMgZXh0cmVtZWx5IGxvc3N5IGFuZCB0aGUKK3Jlc3VsdCBtYXkgbG9vayB0ZXJyaWJsZS4KKworVG8gd3JpdGUgYSBQTkcgZmlsZSB1c2luZyB0aGUgc2ltcGxpZmllZCBBUEk6CisKKyAgMSkgRGVjbGFyZSBhICdwbmdfaW1hZ2UnIHN0cnVjdHVyZSBvbiB0aGUgc3RhY2sgYW5kIG1lbXNldCgpCisgICAgIGl0IHRvIGFsbCB6ZXJvLgorCisgIDIpIEluaXRpYWxpemUgdGhlIG1lbWJlcnMgb2YgdGhlIHN0cnVjdHVyZSB0aGF0IGRlc2NyaWJlIHRoZQorICAgICBpbWFnZSwgc2V0dGluZyB0aGUgJ2Zvcm1hdCcgbWVtYmVyIHRvIHRoZSBmb3JtYXQgb2YgdGhlCisgICAgIGltYWdlIHNhbXBsZXMuCisKKyAgMykgQ2FsbCB0aGUgYXBwcm9wcmlhdGUgcG5nX2ltYWdlX3dyaXRlLi4uIGZ1bmN0aW9uIHdpdGggYQorICAgICBwb2ludGVyIHRvIHRoZSBpbWFnZSBhbmQsIGlmIG5lY2Vzc2FyeSwgdGhlIGNvbG9yLW1hcCB0byB3cml0ZQorICAgICB0aGUgUE5HIGRhdGEuCisKK3BuZ19pbWFnZSBpcyBhIHN0cnVjdHVyZSB0aGF0IGRlc2NyaWJlcyB0aGUgaW4tbWVtb3J5IGZvcm1hdCBvZiBhbiBpbWFnZQord2hlbiBpdCBpcyBiZWluZyByZWFkIG9yIGRlZmluZXMgdGhlIGluLW1lbW9yeSBmb3JtYXQgb2YgYW4gaW1hZ2UgdGhhdCB5b3UKK25lZWQgdG8gd3JpdGUuICBUaGUgInBuZ19pbWFnZSIgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbWVtYmVyczoKKworICAgcG5nX2NvbnRyb2xwIG9wYXF1ZSAgSW5pdGlhbGl6ZSB0byBOVUxMLCBmcmVlIHdpdGggcG5nX2ltYWdlX2ZyZWUKKyAgIHBuZ191aW50XzMyICB2ZXJzaW9uIFNldCB0byBQTkdfSU1BR0VfVkVSU0lPTgorICAgcG5nX3VpbnRfMzIgIHdpZHRoICAgSW1hZ2Ugd2lkdGggaW4gcGl4ZWxzIChjb2x1bW5zKQorICAgcG5nX3VpbnRfMzIgIGhlaWdodCAgSW1hZ2UgaGVpZ2h0IGluIHBpeGVscyAocm93cykKKyAgIHBuZ191aW50XzMyICBmb3JtYXQgIEltYWdlIGZvcm1hdCBhcyBkZWZpbmVkIGJlbG93CisgICBwbmdfdWludF8zMiAgZmxhZ3MgICBBIGJpdCBtYXNrIGNvbnRhaW5pbmcgaW5mb3JtYXRpb25hbCBmbGFncworICAgcG5nX3VpbnRfMzIgIGNvbG9ybWFwX2VudHJpZXM7IE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjb2xvci1tYXAKKyAgIHBuZ191aW50XzMyICB3YXJuaW5nX29yX2Vycm9yOworICAgY2hhciAgICAgICAgIG1lc3NhZ2VbNjRdOworCitJbiB0aGUgZXZlbnQgb2YgYW4gZXJyb3Igb3Igd2FybmluZyB0aGUgIndhcm5pbmdfb3JfZXJyb3IiCitmaWVsZCB3aWxsIGJlIHNldCB0byBhIG5vbi16ZXJvIHZhbHVlIGFuZCB0aGUgJ21lc3NhZ2UnIGZpZWxkIHdpbGwgY29udGFpbgorYSAnXDAnIHRlcm1pbmF0ZWQgc3RyaW5nIHdpdGggdGhlIGxpYnBuZyBlcnJvciBvciB3YXJuaW5nIG1lc3NhZ2UuICBJZiBib3RoCit3YXJuaW5ncyBhbmQgYW4gZXJyb3Igd2VyZSBlbmNvdW50ZXJlZCwgb25seSB0aGUgZXJyb3IgaXMgcmVjb3JkZWQuICBJZiB0aGVyZQorYXJlIG11bHRpcGxlIHdhcm5pbmdzLCBvbmx5IHRoZSBmaXJzdCBvbmUgaXMgcmVjb3JkZWQuCisKK1RoZSB1cHBlciAzMCBiaXRzIG9mIHRoZSAid2FybmluZ19vcl9lcnJvciIgdmFsdWUgYXJlIHJlc2VydmVkOyB0aGUgbG93IHR3bworYml0cyBjb250YWluIGEgdHdvIGJpdCBjb2RlIHN1Y2ggdGhhdCBhIHZhbHVlIG1vcmUgdGhhbiAxIGluZGljYXRlcyBhIGZhaWx1cmUKK2luIHRoZSBBUEkganVzdCBjYWxsZWQ6CisKKyAgIDAgLSBubyB3YXJuaW5nIG9yIGVycm9yCisgICAxIC0gd2FybmluZworICAgMiAtIGVycm9yCisgICAzIC0gZXJyb3IgcHJlY2VkZWQgYnkgd2FybmluZworCitUaGUgcGl4ZWxzIChzYW1wbGVzKSBvZiB0aGUgaW1hZ2UgaGF2ZSBvbmUgdG8gZm91ciBjaGFubmVscyB3aG9zZSBjb21wb25lbnRzCitoYXZlIG9yaWdpbmFsIHZhbHVlcyBpbiB0aGUgcmFuZ2UgMCB0byAxLjA6CisKKyAgMTogQSBzaW5nbGUgZ3JheSBvciBsdW1pbmFuY2UgY2hhbm5lbCAoRykuCisgIDI6IEEgZ3JheS9sdW1pbmFuY2UgY2hhbm5lbCBhbmQgYW4gYWxwaGEgY2hhbm5lbCAoR0EpLgorICAzOiBUaHJlZSByZWQsIGdyZWVuLCBibHVlIGNvbG9yIGNoYW5uZWxzIChSR0IpLgorICA0OiBUaHJlZSBjb2xvciBjaGFubmVscyBhbmQgYW4gYWxwaGEgY2hhbm5lbCAoUkdCQSkuCisKK1RoZSBjaGFubmVscyBhcmUgZW5jb2RlZCBpbiBvbmUgb2YgdHdvIHdheXM6CisKKyAgYSkgQXMgYSBzbWFsbCBpbnRlZ2VyLCB2YWx1ZSAwLi4yNTUsIGNvbnRhaW5lZCBpbiBhIHNpbmdsZSBieXRlLiAgRm9yIHRoZQorYWxwaGEgY2hhbm5lbCB0aGUgb3JpZ2luYWwgdmFsdWUgaXMgc2ltcGx5IHZhbHVlLzI1NS4gIEZvciB0aGUgY29sb3Igb3IKK2x1bWluYW5jZSBjaGFubmVscyB0aGUgdmFsdWUgaXMgZW5jb2RlZCBhY2NvcmRpbmcgdG8gdGhlIHNSR0Igc3BlY2lmaWNhdGlvbgorYW5kIG1hdGNoZXMgdGhlIDgtYml0IGZvcm1hdCBleHBlY3RlZCBieSB0eXBpY2FsIGRpc3BsYXkgZGV2aWNlcy4KKworVGhlIGNvbG9yL2dyYXkgY2hhbm5lbHMgYXJlIG5vdCBzY2FsZWQgKHByZS1tdWx0aXBsaWVkKSBieSB0aGUgYWxwaGEKK2NoYW5uZWwgYW5kIGFyZSBzdWl0YWJsZSBmb3IgcGFzc2luZyB0byBjb2xvciBtYW5hZ2VtZW50IHNvZnR3YXJlLgorCisgIGIpIEFzIGEgdmFsdWUgaW4gdGhlIHJhbmdlIDAuLjY1NTM1LCBjb250YWluZWQgaW4gYSAyLWJ5dGUgaW50ZWdlciwgaW4KK3RoZSBuYXRpdmUgYnl0ZSBvcmRlciBvZiB0aGUgcGxhdGZvcm0gb24gd2hpY2ggdGhlIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuCitBbGwgY2hhbm5lbHMgY2FuIGJlIGNvbnZlcnRlZCB0byB0aGUgb3JpZ2luYWwgdmFsdWUgYnkgZGl2aWRpbmcgYnkgNjU1MzU7IGFsbAorY2hhbm5lbHMgYXJlIGxpbmVhci4gIENvbG9yIGNoYW5uZWxzIHVzZSB0aGUgUkdCIGVuY29kaW5nIChSR0IgZW5kLXBvaW50cykgb2YKK3RoZSBzUkdCIHNwZWNpZmljYXRpb24uICBUaGlzIGVuY29kaW5nIGlzIGlkZW50aWZpZWQgYnkgdGhlCitQTkdfRk9STUFUX0ZMQUdfTElORUFSIGZsYWcgYmVsb3cuCisKK1doZW4gdGhlIHNpbXBsaWZpZWQgQVBJIG5lZWRzIHRvIGNvbnZlcnQgYmV0d2VlbiBzUkdCIGFuZCBsaW5lYXIgY29sb3JzcGFjZXMsCit0aGUgYWN0dWFsIHNSR0IgdHJhbnNmZXIgY3VydmUgZGVmaW5lZCBpbiB0aGUgc1JHQiBzcGVjaWZpY2F0aW9uIChzZWUgdGhlCithcnRpY2xlIGF0IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU1JHQikgaXMgdXNlZCwgbm90IHRoZSBnYW1tYT0xLzIuMgorYXBwcm94aW1hdGlvbiB1c2VkIGVsc2V3aGVyZSBpbiBsaWJwbmcuCisKK1doZW4gYW4gYWxwaGEgY2hhbm5lbCBpcyBwcmVzZW50IGl0IGlzIGV4cGVjdGVkIHRvIGRlbm90ZSBwaXhlbCBjb3ZlcmFnZQorb2YgdGhlIGNvbG9yIG9yIGx1bWluYW5jZSBjaGFubmVscyBhbmQgaXMgcmV0dXJuZWQgYXMgYW4gYXNzb2NpYXRlZCBhbHBoYQorY2hhbm5lbDogdGhlIGNvbG9yL2dyYXkgY2hhbm5lbHMgYXJlIHNjYWxlZCAocHJlLW11bHRpcGxpZWQpIGJ5IHRoZSBhbHBoYQordmFsdWUuCisKK1RoZSBzYW1wbGVzIGFyZSBlaXRoZXIgY29udGFpbmVkIGRpcmVjdGx5IGluIHRoZSBpbWFnZSBkYXRhLCBiZXR3ZWVuIDEgYW5kIDgKK2J5dGVzIHBlciBwaXhlbCBhY2NvcmRpbmcgdG8gdGhlIGVuY29kaW5nLCBvciBhcmUgaGVsZCBpbiBhIGNvbG9yLW1hcCBpbmRleGVkCitieSBieXRlcyBpbiB0aGUgaW1hZ2UgZGF0YS4gIEluIHRoZSBjYXNlIG9mIGEgY29sb3ItbWFwIHRoZSBjb2xvci1tYXAgZW50cmllcworYXJlIGluZGl2aWR1YWwgc2FtcGxlcywgZW5jb2RlZCBhcyBhYm92ZSwgYW5kIHRoZSBpbWFnZSBkYXRhIGhhcyBvbmUgYnl0ZSBwZXIKK3BpeGVsIHRvIHNlbGVjdCB0aGUgcmVsZXZhbnQgc2FtcGxlIGZyb20gdGhlIGNvbG9yLW1hcC4KKworUE5HX0ZPUk1BVF8qCisKK1RoZSAjZGVmaW5lcyB0byBiZSB1c2VkIGluIHBuZ19pbWFnZTo6Zm9ybWF0LiAgRWFjaCAjZGVmaW5lIGlkZW50aWZpZXMgYQorcGFydGljdWxhciBsYXlvdXQgb2YgY2hhbm5lbCBkYXRhIGFuZCwgaWYgcHJlc2VudCwgYWxwaGEgdmFsdWVzLiAgVGhlcmUgYXJlCitzZXBhcmF0ZSBkZWZpbmVzIGZvciBlYWNoIG9mIHRoZSB0d28gY29tcG9uZW50IGVuY29kaW5ncy4KKworQSBmb3JtYXQgaXMgYnVpbHQgdXAgdXNpbmcgc2luZ2xlIGJpdCBmbGFnIHZhbHVlcy4gIEFsbCBjb21iaW5hdGlvbnMgYXJlCit2YWxpZC4gIEZvcm1hdHMgY2FuIGJlIGJ1aWx0IHVwIGZyb20gdGhlIGZsYWcgdmFsdWVzIG9yIHlvdSBjYW4gdXNlIG9uZSBvZgordGhlIHByZWRlZmluZWQgdmFsdWVzIGJlbG93LiAgV2hlbiB0ZXN0aW5nIGZvcm1hdHMgYWx3YXlzIHVzZSB0aGUgRk9STUFUX0ZMQUcKK21hY3JvcyB0byB0ZXN0IGZvciBpbmRpdmlkdWFsIGZlYXR1cmVzIC0gZnV0dXJlIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5IG1heQorYWRkIG5ldyBmbGFncy4KKworV2hlbiByZWFkaW5nIG9yIHdyaXRpbmcgY29sb3ItbWFwcGVkIGltYWdlcyB0aGUgZm9ybWF0IHNob3VsZCBiZSBzZXQgdG8gdGhlCitmb3JtYXQgb2YgdGhlIGVudHJpZXMgaW4gdGhlIGNvbG9yLW1hcCB0aGVuIHBuZ19pbWFnZV97cmVhZCx3cml0ZX1fY29sb3JtYXAKK2NhbGxlZCB0byByZWFkIG9yIHdyaXRlIHRoZSBjb2xvci1tYXAgYW5kIHNldCB0aGUgZm9ybWF0IGNvcnJlY3RseSBmb3IgdGhlCitpbWFnZSBkYXRhLiAgRG8gbm90IHNldCB0aGUgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQIGJpdCBkaXJlY3RseSEKKworTk9URTogbGlicG5nIGNhbiBiZSBidWlsdCB3aXRoIHBhcnRpY3VsYXIgZmVhdHVyZXMgZGlzYWJsZWQuIElmIHlvdSBzZWUKK2NvbXBpbGVyIGVycm9ycyBiZWNhdXNlIHRoZSBkZWZpbml0aW9uIG9mIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZsYWdzIGhhcyBiZWVuCitjb21waWxlZCBvdXQgaXQgaXMgYmVjYXVzZSBsaWJwbmcgZG9lcyBub3QgaGF2ZSB0aGUgcmVxdWlyZWQgc3VwcG9ydC4gIEl0IGlzCitwb3NzaWJsZSwgaG93ZXZlciwgZm9yIHRoZSBsaWJwbmcgY29uZmlndXJhdGlvbiB0byBlbmFibGUgdGhlIGZvcm1hdCBvbiBqdXN0CityZWFkIG9yIGp1c3Qgd3JpdGU7IGluIHRoYXQgY2FzZSB5b3UgbWF5IHNlZSBhbiBlcnJvciBhdCBydW4gdGltZS4KK1lvdSBjYW4gZ3VhcmQgYWdhaW5zdCB0aGlzIGJ5IGNoZWNraW5nIGZvciB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKK2FwcHJvcHJpYXRlICJfU1VQUE9SVEVEIiBtYWNybywgb25lIG9mOgorCisgICBQTkdfU0lNUExJRklFRF97UkVBRCxXUklURX1fe0JHUixBRklSU1R9X1NVUFBPUlRFRAorCisgICBQTkdfRk9STUFUX0ZMQUdfQUxQSEEgICAgZm9ybWF0IHdpdGggYW4gYWxwaGEgY2hhbm5lbAorICAgUE5HX0ZPUk1BVF9GTEFHX0NPTE9SICAgIGNvbG9yIGZvcm1hdDogb3RoZXJ3aXNlIGdyYXlzY2FsZQorICAgUE5HX0ZPUk1BVF9GTEFHX0xJTkVBUiAgIDItYnl0ZSBjaGFubmVscyBlbHNlIDEtYnl0ZQorICAgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQIGltYWdlIGRhdGEgaXMgY29sb3ItbWFwcGVkCisgICBQTkdfRk9STUFUX0ZMQUdfQkdSICAgICAgQkdSIGNvbG9ycywgZWxzZSBvcmRlciBpcyBSR0IKKyAgIFBOR19GT1JNQVRfRkxBR19BRklSU1QgICBhbHBoYSBjaGFubmVsIGNvbWVzIGZpcnN0CisKK1N1cHBvcnRlZCBmb3JtYXRzIGFyZSBhcyBmb2xsb3dzLiAgRnV0dXJlIHZlcnNpb25zIG9mIGxpYnBuZyBtYXkgc3VwcG9ydCBtb3JlCitmb3JtYXRzOyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHZlcnNpb25zIHNpbXBseSBjaGVjayBpZiB0aGUgZm9ybWF0CittYWNybyBpcyBkZWZpbmVkIHVzaW5nICNpZmRlZi4gIFRoZXNlIGRlZmluZXMgZGVzY3JpYmUgdGhlIGluLW1lbW9yeSBsYXlvdXQKK29mIHRoZSBjb21wb25lbnRzIG9mIHRoZSBwaXhlbHMgb2YgdGhlIGltYWdlLgorCitGaXJzdCB0aGUgc2luZ2xlIGJ5dGUgKHNSR0IpIGZvcm1hdHM6CisKKyAgIFBOR19GT1JNQVRfR1JBWQorICAgUE5HX0ZPUk1BVF9HQQorICAgUE5HX0ZPUk1BVF9BRworICAgUE5HX0ZPUk1BVF9SR0IKKyAgIFBOR19GT1JNQVRfQkdSCisgICBQTkdfRk9STUFUX1JHQkEKKyAgIFBOR19GT1JNQVRfQVJHQgorICAgUE5HX0ZPUk1BVF9CR1JBCisgICBQTkdfRk9STUFUX0FCR1IKKworVGhlbiB0aGUgbGluZWFyIDItYnl0ZSBmb3JtYXRzLiAgV2hlbiBuYW1pbmcgdGhlc2UgIlkiIGlzIHVzZWQgdG8KK2luZGljYXRlIGEgbHVtaW5hbmNlIChncmF5KSBjaGFubmVsLiAgVGhlIGNvbXBvbmVudCBvcmRlciB3aXRoaW4gdGhlIHBpeGVsCitpcyBhbHdheXMgdGhlIHNhbWUgLSB0aGVyZSBpcyBubyBwcm92aXNpb24gZm9yIHN3YXBwaW5nIHRoZSBvcmRlciBvZiB0aGUKK2NvbXBvbmVudHMgaW4gdGhlIGxpbmVhciBmb3JtYXQuICBUaGUgY29tcG9uZW50cyBhcmUgMTYtYml0IGludGVnZXJzIGluCit0aGUgbmF0aXZlIGJ5dGUgb3JkZXIgZm9yIHlvdXIgcGxhdGZvcm0sIGFuZCB0aGVyZSBpcyBubyBwcm92aXNpb24gZm9yCitzd2FwcGluZyB0aGUgYnl0ZXMgdG8gYSBkaWZmZXJlbnQgZW5kaWFuIGNvbmRpdGlvbi4KKworICAgUE5HX0ZPUk1BVF9MSU5FQVJfWQorICAgUE5HX0ZPUk1BVF9MSU5FQVJfWV9BTFBIQQorICAgUE5HX0ZPUk1BVF9MSU5FQVJfUkdCCisgICBQTkdfRk9STUFUX0xJTkVBUl9SR0JfQUxQSEEKKworV2l0aCBjb2xvci1tYXBwZWQgZm9ybWF0cyB0aGUgaW1hZ2UgZGF0YSBpcyBvbmUgYnl0ZSBmb3IgZWFjaCBwaXhlbC4gVGhlIGJ5dGUKK2lzIGFuIGluZGV4IGludG8gdGhlIGNvbG9yLW1hcCB3aGljaCBpcyBmb3JtYXR0ZWQgYXMgYWJvdmUuICBUbyBvYnRhaW4gYQorY29sb3ItbWFwcGVkIGZvcm1hdCBpdCBpcyBzdWZmaWNpZW50IGp1c3QgdG8gYWRkIHRoZSBQTkdfRk9NQVRfRkxBR19DT0xPUk1BUAordG8gb25lIG9mIHRoZSBhYm92ZSBkZWZpbml0aW9ucywgb3IgeW91IGNhbiB1c2Ugb25lIG9mIHRoZSBkZWZpbml0aW9ucyBiZWxvdy4KKworICAgUE5HX0ZPUk1BVF9SR0JfQ09MT1JNQVAKKyAgIFBOR19GT1JNQVRfQkdSX0NPTE9STUFQCisgICBQTkdfRk9STUFUX1JHQkFfQ09MT1JNQVAKKyAgIFBOR19GT1JNQVRfQVJHQl9DT0xPUk1BUAorICAgUE5HX0ZPUk1BVF9CR1JBX0NPTE9STUFQCisgICBQTkdfRk9STUFUX0FCR1JfQ09MT1JNQVAKKworUE5HX0lNQUdFIG1hY3JvcworCitUaGVzZSBhcmUgY29udmVuaWVuY2UgbWFjcm9zIHRvIGRlcml2ZSBpbmZvcm1hdGlvbiBmcm9tIGEgcG5nX2ltYWdlCitzdHJ1Y3R1cmUuICBUaGUgUE5HX0lNQUdFX1NBTVBMRV8gbWFjcm9zIHJldHVybiB2YWx1ZXMgYXBwcm9wcmlhdGUgdG8gdGhlCithY3R1YWwgaW1hZ2Ugc2FtcGxlIHZhbHVlcyAtIGVpdGhlciB0aGUgZW50cmllcyBpbiB0aGUgY29sb3ItbWFwIG9yIHRoZQorcGl4ZWxzIGluIHRoZSBpbWFnZS4gIFRoZSBQTkdfSU1BR0VfUElYRUxfIG1hY3JvcyByZXR1cm4gY29ycmVzcG9uZGluZyB2YWx1ZXMKK2ZvciB0aGUgcGl4ZWxzIGFuZCB3aWxsIGFsd2F5cyByZXR1cm4gMSBmb3IgY29sb3ItbWFwcGVkIGZvcm1hdHMuICBUaGUKK3JlbWFpbmluZyBtYWNyb3MgcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSByb3dzIGluIHRoZSBpbWFnZSBhbmQgdGhlCitjb21wbGV0ZSBpbWFnZS4KKworTk9URTogQWxsIHRoZSBtYWNyb3MgdGhhdCB0YWtlIGEgcG5nX2ltYWdlOjpmb3JtYXQgcGFyYW1ldGVyIGFyZSBjb21waWxlIHRpbWUKK2NvbnN0YW50cyBpZiB0aGUgZm9ybWF0IHBhcmFtZXRlciBpcywgaXRzZWxmLCBhIGNvbnN0YW50LiAgVGhlcmVmb3JlIHRoZXNlCittYWNyb3MgY2FuIGJlIHVzZWQgaW4gYXJyYXkgZGVjbGFyYXRpb25zIGFuZCBjYXNlIGxhYmVscyB3aGVyZSByZXF1aXJlZC4KK1NpbWlsYXJseSB0aGUgbWFjcm9zIGFyZSBhbHNvIHByZS1wcm9jZXNzb3IgY29uc3RhbnRzIChzaXplb2YgaXMgbm90IHVzZWQpIHNvCit0aGV5IGNhbiBiZSB1c2VkIGluICNpZiB0ZXN0cy4KKworICBQTkdfSU1BR0VfU0FNUExFX0NIQU5ORUxTKGZtdCkKKyAgICBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgY2hhbm5lbHMgaW4gYSBnaXZlbiBmb3JtYXQ6IDEuLjQKKworICBQTkdfSU1BR0VfU0FNUExFX0NPTVBPTkVOVF9TSVpFKGZtdCkKKyAgICBSZXR1cm5zIHRoZSBzaXplIGluIGJ5dGVzIG9mIGEgc2luZ2xlIGNvbXBvbmVudCBvZiBhIHBpeGVsIG9yIGNvbG9yLW1hcAorICAgIGVudHJ5IChhcyBhcHByb3ByaWF0ZSkgaW4gdGhlIGltYWdlOiAxIG9yIDIuCisKKyAgUE5HX0lNQUdFX1NBTVBMRV9TSVpFKGZtdCkKKyAgICBUaGlzIGlzIHRoZSBzaXplIG9mIHRoZSBzYW1wbGUgZGF0YSBmb3Igb25lIHNhbXBsZS4gIElmIHRoZSBpbWFnZSBpcworICAgIGNvbG9yLW1hcHBlZCBpdCBpcyB0aGUgc2l6ZSBvZiBvbmUgY29sb3ItbWFwIGVudHJ5IChhbmQgaW1hZ2UgcGl4ZWxzIGFyZQorICAgIG9uZSBieXRlIGluIHNpemUpLCBvdGhlcndpc2UgaXQgaXMgdGhlIHNpemUgb2Ygb25lIGltYWdlIHBpeGVsLgorCisgIFBOR19JTUFHRV9NQVhJTVVNX0NPTE9STUFQX0NPTVBPTkVOVFMoZm10KQorICAgIFRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNvbG9yLW1hcCByZXF1aXJlZCBieSB0aGUgZm9ybWF0IGV4cHJlc3NlZCBpbiBhCisgICAgY291bnQgb2YgY29tcG9uZW50cy4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gY29tcGlsZS10aW1lIGFsbG9jYXRlIGEKKyAgICBjb2xvci1tYXA6CisKKyAgICBwbmdfdWludF8xNiBjb2xvcm1hcFtQTkdfSU1BR0VfTUFYSU1VTV9DT0xPUk1BUF9DT01QT05FTlRTKGxpbmVhcl9mbXQpXTsKKworICAgIHBuZ19ieXRlIGNvbG9ybWFwW1BOR19JTUFHRV9NQVhJTVVNX0NPTE9STUFQX0NPTVBPTkVOVFMoc1JHQl9mbXQpXTsKKworICAgIEFsdGVybmF0aXZlbHkgdXNlIHRoZSBQTkdfSU1BR0VfQ09MT1JNQVBfU0laRSBtYWNybyBiZWxvdyB0byB1c2UgdGhlCisgICAgaW5mb3JtYXRpb24gZnJvbSBvbmUgb2YgdGhlIHBuZ19pbWFnZV9iZWdpbl9yZWFkXyBBUElzIGFuZCBkeW5hbWljYWxseQorICAgIGFsbG9jYXRlIHRoZSByZXF1aXJlZCBtZW1vcnkuCisKKyAgUE5HX0lNQUdFX0NPTE9STUFQX1NJWkUoZm10KQorICAgVGhlIHNpemUgb2YgdGhlIGNvbG9yLW1hcCByZXF1aXJlZCBieSB0aGUgZm9ybWF0OyB0aGlzIGlzIHRoZSBzaXplIG9mIHRoZQorICAgY29sb3ItbWFwIGJ1ZmZlciBwYXNzZWQgdG8gdGhlIHBuZ19pbWFnZV97cmVhZCx3cml0ZX1fY29sb3JtYXAgQVBJcy4gSXQgaXMKKyAgIGEgZml4ZWQgbnVtYmVyIGRldGVybWluZWQgYnkgdGhlIGZvcm1hdCBzbyBjYW4gZWFzaWx5IGJlIGFsbG9jYXRlZCBvbiB0aGUKKyAgIHN0YWNrIGlmIG5lY2Vzc2FyeS4KKworQ29ycmVzcG9uZGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGl4ZWxzCisKKyAgUE5HX0lNQUdFX1BJWEVMX0NIQU5ORUxTKGZtdCkKKyAgIFRoZSBudW1iZXIgb2Ygc2VwYXJhdGUgY2hhbm5lbHMgKGNvbXBvbmVudHMpIGluIGEgcGl4ZWw7IDEgZm9yIGEKKyAgIGNvbG9yLW1hcHBlZCBpbWFnZS4KKworICBQTkdfSU1BR0VfUElYRUxfQ09NUE9ORU5UX1NJWkUoZm10KVwKKyAgIFRoZSBzaXplLCBpbiBieXRlcywgb2YgZWFjaCBjb21wb25lbnQgaW4gYSBwaXhlbDsgMSBmb3IgYSBjb2xvci1tYXBwZWQKKyAgIGltYWdlLgorCisgIFBOR19JTUFHRV9QSVhFTF9TSVpFKGZtdCkKKyAgIFRoZSBzaXplLCBpbiBieXRlcywgb2YgYSBjb21wbGV0ZSBwaXhlbDsgMSBmb3IgYSBjb2xvci1tYXBwZWQgaW1hZ2UuCisKK0luZm9ybWF0aW9uIGFib3V0IHRoZSB3aG9sZSByb3csIG9yIHdob2xlIGltYWdlCisKKyAgUE5HX0lNQUdFX1JPV19TVFJJREUoaW1hZ2UpCisgICBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgY29tcG9uZW50cyBpbiBhIHNpbmdsZSByb3cgb2YgdGhlIGltYWdlOyB0aGlzCisgICBpcyB0aGUgbWluaW11bSAncm93IHN0cmlkZScsIHRoZSBtaW5pbXVtIGNvdW50IG9mIGNvbXBvbmVudHMgYmV0d2VlbiBlYWNoCisgICByb3cuICBGb3IgYSBjb2xvci1tYXBwZWQgaW1hZ2UgdGhpcyBpcyB0aGUgbWluaW11bSBudW1iZXIgb2YgYnl0ZXMgaW4gYQorICAgcm93LgorCisgICBJZiB5b3UgbmVlZCB0aGUgc3RyaWRlIG1lYXN1cmVkIGluIGJ5dGVzLCByb3dfc3RyaWRlX2J5dGVzIGlzCisgICBQTkdfSU1BR0VfUk9XX1NUUklERShpbWFnZSkgKiBQTkdfSU1BR0VfUElYRUxfQ09NUE9ORU5UX1NJWkUoZm10KQorICAgcGx1cyBhbnkgcGFkZGluZyBieXRlcyB0aGF0IHlvdXIgYXBwbGljYXRpb24gbWlnaHQgbmVlZCwgZm9yIGV4YW1wbGUKKyAgIHRvIHN0YXJ0IHRoZSBuZXh0IHJvdyBvbiBhIDQtYnl0ZSBib3VuZGFyeS4KKworICBQTkdfSU1BR0VfQlVGRkVSX1NJWkUoaW1hZ2UsIHJvd19zdHJpZGUpCisgICBSZXR1cm4gdGhlIHNpemUsIGluIGJ5dGVzLCBvZiBhbiBpbWFnZSBidWZmZXIgZ2l2ZW4gYSBwbmdfaW1hZ2UgYW5kIGEgcm93CisgICBzdHJpZGUgLSB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgdG8gbGVhdmUgc3BhY2UgZm9yIGluIGVhY2ggcm93LgorCisgIFBOR19JTUFHRV9TSVpFKGltYWdlKQorICAgUmV0dXJuIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIGltYWdlIGluIG1lbW9yeSBnaXZlbiBqdXN0IGEgcG5nX2ltYWdlOworICAgdGhlIHJvdyBzdHJpZGUgaXMgdGhlIG1pbmltdW0gc3RyaWRlIHJlcXVpcmVkIGZvciB0aGUgaW1hZ2UuCisKKyAgUE5HX0lNQUdFX0NPTE9STUFQX1NJWkUoaW1hZ2UpCisgICBSZXR1cm4gdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgY29sb3ItbWFwIG9mIHRoaXMgaW1hZ2UuICBJZiB0aGUgaW1hZ2UKKyAgIGZvcm1hdCBpcyBub3QgYSBjb2xvci1tYXAgZm9ybWF0IHRoaXMgd2lsbCByZXR1cm4gYSBzaXplIHN1ZmZpY2llbnQgZm9yCisgICAyNTYgZW50cmllcyBpbiB0aGUgZ2l2ZW4gZm9ybWF0OyBjaGVjayBQTkdfRk9STUFUX0ZMQUdfQ09MT1JNQVAgaWYKKyAgIHlvdSBkb24ndCB3YW50IHRvIGFsbG9jYXRlIGEgY29sb3ItbWFwIGluIHRoaXMgY2FzZS4KKworUE5HX0lNQUdFX0ZMQUdfKgorCitGbGFncyBjb250YWluaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGltYWdlIGFyZSBoZWxkIGluCit0aGUgJ2ZsYWdzJyBmaWVsZCBvZiBwbmdfaW1hZ2UuCisKKyAgUE5HX0lNQUdFX0ZMQUdfQ09MT1JTUEFDRV9OT1Rfc1JHQiA9PSAweDAxCisgICAgVGhpcyBpbmRpY2F0ZXMgdGhlIHRoZSBSR0IgdmFsdWVzIG9mIHRoZSBpbi1tZW1vcnkgYml0bWFwIGRvIG5vdAorICAgIGNvcnJlc3BvbmQgdG8gdGhlIHJlZCwgZ3JlZW4gYW5kIGJsdWUgZW5kLXBvaW50cyBkZWZpbmVkIGJ5IHNSR0IuCisKKyAgUE5HX0lNQUdFX0ZMQUdfRkFTVCA9PSAweDAyCisgICBPbiB3cml0ZSBlbXBoYXNpc2Ugc3BlZWQgb3ZlciBjb21wcmVzc2lvbjsgdGhlIHJlc3VsdGFudCBQTkcgZmlsZSB3aWxsIGJlCisgICBsYXJnZXIgYnV0IHdpbGwgYmUgcHJvZHVjZWQgc2lnbmlmaWNhbnRseSBmYXN0ZXIsIHBhcnRpY3VsYXIgZm9yIGxhcmdlCisgICBpbWFnZXMuICBEbyBub3QgdXNlIHRoaXMgb3B0aW9uIGZvciBpbWFnZXMgd2hpY2ggd2lsbCBiZSBkaXN0cmlidXRlZCwgb25seQorICAgdXNlZCBpdCB3aGVuIHByb2R1Y2luZyBpbnRlcm1lZGlhdGUgZmlsZXMgdGhhdCB3aWxsIGJlIHJlYWQgYmFjayBpbgorICAgcmVwZWF0ZWRseS4gIEZvciBhIHR5cGljYWwgMjQtYml0IGltYWdlIHRoZSBvcHRpb24gd2lsbCBkb3VibGUgdGhlIHJlYWQKKyAgIHNwZWVkIGF0IHRoZSBjb3N0IG9mIGluY3JlYXNpbmcgdGhlIGltYWdlIHNpemUgYnkgMjUlLCBob3dldmVyIGZvciBtYW55CisgICBtb3JlIGNvbXByZXNzaWJsZSBpbWFnZXMgdGhlIFBORyBmaWxlIGNhbiBiZSAxMCB0aW1lcyBsYXJnZXIgd2l0aCBvbmx5IGEKKyAgIHNsaWdodCBzcGVlZCBnYWluLgorCisgIFBOR19JTUFHRV9GTEFHXzE2QklUX3NSR0IgPT0gMHgwNAorICAgIE9uIHJlYWQgaWYgdGhlIGltYWdlIGlzIGEgMTYtYml0IHBlciBjb21wb25lbnQgaW1hZ2UgYW5kIHRoZXJlIGlzIG5vIGdBTUEKKyAgICBvciBzUkdCIGNodW5rIGFzc3VtZSB0aGF0IHRoZSBjb21wb25lbnRzIGFyZSBzUkdCIGVuY29kZWQuICBOb3RpY2UgdGhhdAorICAgIGltYWdlcyBvdXRwdXQgYnkgdGhlIHNpbXBsaWZpZWQgQVBJIGFsd2F5cyBoYXZlIGdhbW1hIGluZm9ybWF0aW9uOyBzZXR0aW5nCisgICAgdGhpcyBmbGFnIG9ubHkgYWZmZWN0cyB0aGUgaW50ZXJwcmV0YXRpb24gb2YgMTYtYml0IGltYWdlcyBmcm9tIGFuCisgICAgZXh0ZXJuYWwgc291cmNlLiAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUgYXBwbGljYXRpb24gZXhwb3NlIHRoaXMgZmxhZworICAgIHRvIHRoZSB1c2VyOyB0aGUgdXNlciBjYW4gbm9ybWFsbHkgZWFzaWx5IHJlY29nbml6ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCisgICAgbGluZWFyIGFuZCBzUkdCIGVuY29kaW5nLiAgVGhpcyBmbGFnIGhhcyBubyBlZmZlY3Qgb24gd3JpdGUgLSB0aGUgZGF0YQorICAgIHBhc3NlZCB0byB0aGUgd3JpdGUgQVBJcyBtdXN0IGhhdmUgdGhlIGNvcnJlY3QgZW5jb2RpbmcgKGFzIGRlZmluZWQKKyAgICBhYm92ZS4pCisKKyAgICBJZiB0aGUgZmxhZyBpcyBub3Qgc2V0ICh0aGUgZGVmYXVsdCkgaW5wdXQgMTYtYml0IHBlciBjb21wb25lbnQgZGF0YSBpcworICAgIGFzc3VtZWQgdG8gYmUgbGluZWFyLgorCisgICAgTk9URTogdGhlIGZsYWcgY2FuIG9ubHkgYmUgc2V0IGFmdGVyIHRoZSBwbmdfaW1hZ2VfYmVnaW5fcmVhZF8gY2FsbCwKKyAgICBiZWNhdXNlIHRoYXQgY2FsbCBpbml0aWFsaXplcyB0aGUgJ2ZsYWdzJyBmaWVsZC4KKworUkVBRCBBUElzCisKKyAgIFRoZSBwbmdfaW1hZ2UgcGFzc2VkIHRvIHRoZSByZWFkIEFQSXMgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgYnkgc2V0dGluZworICAgdGhlIHBuZ19jb250cm9scCBmaWVsZCAnb3BhcXVlJyB0byBOVUxMIChvciwgYmV0dGVyLCBtZW1zZXQgdGhlIHdob2xlIHRoaW5nLikKKworICAgaW50IHBuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fZmlsZSggcG5nX2ltYWdlcCBpbWFnZSwKKyAgICAgY29uc3QgY2hhciAqZmlsZV9uYW1lKQorCisgICAgIFRoZSBuYW1lZCBmaWxlIGlzIG9wZW5lZCBmb3IgcmVhZCBhbmQgdGhlIGltYWdlIGhlYWRlcgorICAgICBpcyBmaWxsZWQgaW4gZnJvbSB0aGUgUE5HIGhlYWRlciBpbiB0aGUgZmlsZS4KKworICAgaW50IHBuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fc3RkaW8gKHBuZ19pbWFnZXAgaW1hZ2UsCisgICAgIEZJTEUqIGZpbGUpCisKKyAgICAgIFRoZSBQTkcgaGVhZGVyIGlzIHJlYWQgZnJvbSB0aGUgc3RkaW8gRklMRSBvYmplY3QuCisKKyAgIGludCBwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX21lbW9yeShwbmdfaW1hZ2VwIGltYWdlLAorICAgICAgcG5nX2NvbnN0X3ZvaWRwIG1lbW9yeSwgcG5nX3NpemVfdCBzaXplKQorCisgICAgICBUaGUgUE5HIGhlYWRlciBpcyByZWFkIGZyb20gdGhlIGdpdmVuIG1lbW9yeSBidWZmZXIuCisKKyAgIGludCBwbmdfaW1hZ2VfZmluaXNoX3JlYWQocG5nX2ltYWdlcCBpbWFnZSwKKyAgICAgIHBuZ19jb2xvcnAgYmFja2dyb3VuZCwgdm9pZCAqYnVmZmVyLAorICAgICAgcG5nX2ludF8zMiByb3dfc3RyaWRlLCB2b2lkICpjb2xvcm1hcCkpOworCisgICAgICBGaW5pc2ggcmVhZGluZyB0aGUgaW1hZ2UgaW50byB0aGUgc3VwcGxpZWQgYnVmZmVyIGFuZAorICAgICAgY2xlYW4gdXAgdGhlIHBuZ19pbWFnZSBzdHJ1Y3R1cmUuCisKKyAgICAgIHJvd19zdHJpZGUgaXMgdGhlIHN0ZXAsIGluIHBuZ19ieXRlIG9yIHBuZ191aW50XzE2IHVuaXRzCisgICAgICBhcyBhcHByb3ByaWF0ZSwgYmV0d2VlbiBhZGphY2VudCByb3dzLiAgQSBwb3NpdGl2ZSBzdHJpZGUKKyAgICAgIGluZGljYXRlcyB0aGF0IHRoZSB0b3AtbW9zdCByb3cgaXMgZmlyc3QgaW4gdGhlIGJ1ZmZlciAtCisgICAgICB0aGUgbm9ybWFsIHRvcC1kb3duIGFycmFuZ2VtZW50LiAgQSBuZWdhdGl2ZSBzdHJpZGUKKyAgICAgIGluZGljYXRlcyB0aGF0IHRoZSBib3R0b20tbW9zdCByb3cgaXMgZmlyc3QgaW4gdGhlIGJ1ZmZlci4KKworICAgICAgYmFja2dyb3VuZCBuZWVkIG9ubHkgYmUgc3VwcGxpZWQgaWYgYW4gYWxwaGEgY2hhbm5lbCBtdXN0CisgICAgICBiZSByZW1vdmVkIGZyb20gYSBwbmdfYnl0ZSBmb3JtYXQgYW5kIHRoZSByZW1vdmFsIGlzIHRvIGJlCisgICAgICBkb25lIGJ5IGNvbXBvc2l0aW5nIG9uIGEgc29saWQgY29sb3I7IG90aGVyd2lzZSBpdCBtYXkgYmUKKyAgICAgIE5VTEwgYW5kIGFueSBjb21wb3NpdGlvbiB3aWxsIGJlIGRvbmUgZGlyZWN0bHkgb250byB0aGUKKyAgICAgIGJ1ZmZlci4gIFRoZSB2YWx1ZSBpcyBhbiBzUkdCIGNvbG9yIHRvIHVzZSBmb3IgdGhlCisgICAgICBiYWNrZ3JvdW5kLCBmb3IgZ3JheXNjYWxlIG91dHB1dCB0aGUgZ3JlZW4gY2hhbm5lbCBpcyB1c2VkLgorCisgICAgICBGb3IgbGluZWFyIG91dHB1dCByZW1vdmluZyB0aGUgYWxwaGEgY2hhbm5lbCBpcyBhbHdheXMgZG9uZQorICAgICAgYnkgY29tcG9zaXRpbmcgb24gYmxhY2suCisKKyAgIHZvaWQgcG5nX2ltYWdlX2ZyZWUocG5nX2ltYWdlcCBpbWFnZSkKKworICAgICAgRnJlZSBhbnkgZGF0YSBhbGxvY2F0ZWQgYnkgbGlicG5nIGluIGltYWdlLT5vcGFxdWUsCisgICAgICBzZXR0aW5nIHRoZSBwb2ludGVyIHRvIE5VTEwuICBNYXkgYmUgY2FsbGVkIGF0IGFueSB0aW1lCisgICAgICBhZnRlciB0aGUgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkLgorCitXaGVuIHRoZSBzaW1wbGlmaWVkIEFQSSBuZWVkcyB0byBjb252ZXJ0IGJldHdlZW4gc1JHQiBhbmQgbGluZWFyIGNvbG9yc3BhY2VzLAordGhlIGFjdHVhbCBzUkdCIHRyYW5zZmVyIGN1cnZlIGRlZmluZWQgaW4gdGhlIHNSR0Igc3BlY2lmaWNhdGlvbiAoc2VlIHRoZQorYXJ0aWNsZSBhdCBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NSR0IpIGlzIHVzZWQsIG5vdCB0aGUgZ2FtbWE9MS8yLjIKK2FwcHJveGltYXRpb24gdXNlZCBlbHNld2hlcmUgaW4gbGlicG5nLgorCitXUklURSBBUElTCisKK0ZvciB3cml0ZSB5b3UgbXVzdCBpbml0aWFsaXplIGEgcG5nX2ltYWdlIHN0cnVjdHVyZSB0byBkZXNjcmliZSB0aGUgaW1hZ2UgdG8KK2JlIHdyaXR0ZW46CisKKyAgIHZlcnNpb246IG11c3QgYmUgc2V0IHRvIFBOR19JTUFHRV9WRVJTSU9OCisgICBvcGFxdWU6IG11c3QgYmUgaW5pdGlhbGl6ZWQgdG8gTlVMTAorICAgd2lkdGg6IGltYWdlIHdpZHRoIGluIHBpeGVscworICAgaGVpZ2h0OiBpbWFnZSBoZWlnaHQgaW4gcm93cworICAgZm9ybWF0OiB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhIHlvdSB3aXNoIHRvIHdyaXRlCisgICBmbGFnczogc2V0IHRvIDAgdW5sZXNzIG9uZSBvZiB0aGUgZGVmaW5lZCBmbGFncyBhcHBsaWVzOyBzZXQKKyAgICAgIFBOR19JTUFHRV9GTEFHX0NPTE9SU1BBQ0VfTk9UX3NSR0IgZm9yIGNvbG9yIGZvcm1hdCBpbWFnZXMKKyAgICAgIHdoZXJlIHRoZSBSR0IgdmFsdWVzIGRvIG5vdCBjb3JyZXNwb25kIHRvIHRoZSBjb2xvcnMgaW4gc1JHQi4KKyAgIGNvbG9ybWFwX2VudHJpZXM6IHNldCB0byB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNvbG9yLW1hcCAoMCB0byAyNTYpCisKKyAgIGludCBwbmdfaW1hZ2Vfd3JpdGVfdG9fZmlsZSwgKHBuZ19pbWFnZXAgaW1hZ2UsCisgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgY29udmVydF90b184Yml0LCBjb25zdCB2b2lkICpidWZmZXIsCisgICAgICBwbmdfaW50XzMyIHJvd19zdHJpZGUsIGNvbnN0IHZvaWQgKmNvbG9ybWFwKSk7CisKKyAgICAgIFdyaXRlIHRoZSBpbWFnZSB0byB0aGUgbmFtZWQgZmlsZS4KKworICAgaW50IHBuZ19pbWFnZV93cml0ZV90b19zdGRpbyhwbmdfaW1hZ2VwIGltYWdlLCBGSUxFICpmaWxlLAorICAgICAgaW50IGNvbnZlcnRfdG9fOF9iaXQsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKKyAgICAgIHBuZ19pbnRfMzIgcm93X3N0cmlkZSwgY29uc3Qgdm9pZCAqY29sb3JtYXApCisKKyAgICAgIFdyaXRlIHRoZSBpbWFnZSB0byB0aGUgZ2l2ZW4gKEZJTEUqKS4KKworV2l0aCBhbGwgd3JpdGUgQVBJcyBpZiBpbWFnZSBpcyBpbiBvbmUgb2YgdGhlIGxpbmVhciBmb3JtYXRzIHdpdGgKKyhwbmdfdWludF8xNikgZGF0YSB0aGVuIHNldHRpbmcgY29udmVydF90b184X2JpdCB3aWxsIGNhdXNlIHRoZSBvdXRwdXQgdG8gYmUKK2EgKHBuZ19ieXRlKSBQTkcgZ2FtbWEgZW5jb2RlZCBhY2NvcmRpbmcgdG8gdGhlIHNSR0Igc3BlY2lmaWNhdGlvbiwgb3RoZXJ3aXNlCithIDE2LWJpdCBsaW5lYXIgZW5jb2RlZCBQTkcgZmlsZSBpcyB3cml0dGVuLgorCitXaXRoIGFsbCBBUElzIHJvd19zdHJpZGUgaXMgaGFuZGxlZCBhcyBpbiB0aGUgcmVhZCBBUElzIC0gaXQgaXMgdGhlIHNwYWNpbmcKK2Zyb20gb25lIHJvdyB0byB0aGUgbmV4dCBpbiBjb21wb25lbnQgc2l6ZWQgdW5pdHMgKGZsb2F0KSBhbmQgaWYgbmVnYXRpdmUKK2luZGljYXRlcyBhIGJvdHRvbS11cCByb3cgbGF5b3V0IGluIHRoZSBidWZmZXIuICBJZiB5b3UgcGFzcyB6ZXJvLCBsaWJwbmcgd2lsbAorY2FsY3VsYXRlIHRoZSByb3dfc3RyaWRlIGZvciB5b3UgZnJvbSB0aGUgd2lkdGggYW5kIG51bWJlciBvZiBjaGFubmVscy4KKworTm90ZSB0aGF0IHRoZSB3cml0ZSBBUEkgZG9lcyBub3Qgc3VwcG9ydCBpbnRlcmxhY2luZywgc3ViLTgtYml0IHBpeGVscywKK2luZGV4ZWQgKHBhbGV0dGVkKSBpbWFnZXMsIG9yIG1vc3QgYW5jaWxsYXJ5IGNodW5rcy4KKworVkkuIE1vZGlmeWluZy9DdXN0b21pemluZyBsaWJwbmcKKworVGhlcmUgYXJlIHR3byBpc3N1ZXMgaGVyZS4gIFRoZSBmaXJzdCBpcyBjaGFuZ2luZyBob3cgbGlicG5nIGRvZXMKK3N0YW5kYXJkIHRoaW5ncyBsaWtlIG1lbW9yeSBhbGxvY2F0aW9uLCBpbnB1dC9vdXRwdXQsIGFuZCBlcnJvciBoYW5kbGluZy4KK1RoZSBzZWNvbmQgZGVhbHMgd2l0aCBtb3JlIGNvbXBsaWNhdGVkIHRoaW5ncyBsaWtlIGFkZGluZyBuZXcgY2h1bmtzLAorYWRkaW5nIG5ldyB0cmFuc2Zvcm1hdGlvbnMsIGFuZCBnZW5lcmFsbHkgY2hhbmdpbmcgaG93IGxpYnBuZyB3b3Jrcy4KK0JvdGggb2YgdGhvc2UgYXJlIGNvbXBpbGUtdGltZSBpc3N1ZXM7IHRoYXQgaXMsIHRoZXkgYXJlIGdlbmVyYWxseQorZGV0ZXJtaW5lZCBhdCB0aGUgdGltZSB0aGUgY29kZSBpcyB3cml0dGVuLCBhbmQgdGhlcmUgaXMgcmFyZWx5IGEgbmVlZAordG8gcHJvdmlkZSB0aGUgdXNlciB3aXRoIGEgbWVhbnMgb2YgY2hhbmdpbmcgdGhlbS4KKworTWVtb3J5IGFsbG9jYXRpb24sIGlucHV0L291dHB1dCwgYW5kIGVycm9yIGhhbmRsaW5nCisKK0FsbCBvZiB0aGUgbWVtb3J5IGFsbG9jYXRpb24sIGlucHV0L291dHB1dCwgYW5kIGVycm9yIGhhbmRsaW5nIGluIGxpYnBuZworZ29lcyB0aHJvdWdoIGNhbGxiYWNrcyB0aGF0IGFyZSB1c2VyLXNldHRhYmxlLiAgVGhlIGRlZmF1bHQgcm91dGluZXMgYXJlCitpbiBwbmdtZW0uYywgcG5ncmlvLmMsIHBuZ3dpby5jLCBhbmQgcG5nZXJyb3IuYywgcmVzcGVjdGl2ZWx5LiAgVG8gY2hhbmdlCit0aGVzZSBmdW5jdGlvbnMsIGNhbGwgdGhlIGFwcHJvcHJpYXRlIHBuZ19zZXRfKl9mbigpIGZ1bmN0aW9uLgorCitNZW1vcnkgYWxsb2NhdGlvbiBpcyBkb25lIHRocm91Z2ggdGhlIGZ1bmN0aW9ucyBwbmdfbWFsbG9jKCksIHBuZ19jYWxsb2MoKSwKK2FuZCBwbmdfZnJlZSgpLiAgVGhlIHBuZ19tYWxsb2MoKSBhbmQgcG5nX2ZyZWUoKSBmdW5jdGlvbnMgY3VycmVudGx5IGp1c3QKK2NhbGwgdGhlIHN0YW5kYXJkIEMgZnVuY3Rpb25zIGFuZCBwbmdfY2FsbG9jKCkgY2FsbHMgcG5nX21hbGxvYygpIGFuZCB0aGVuCitjbGVhcnMgdGhlIG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkgdG8gemVybzsgbm90ZSB0aGF0IHBuZ19jYWxsb2MocG5nX3B0ciwgc2l6ZSkKK2lzIG5vdCB0aGUgc2FtZSBhcyB0aGUgY2FsbG9jKG51bWJlciwgc2l6ZSkgZnVuY3Rpb24gcHJvdmlkZWQgYnkgc3RkbGliLmguCitUaGVyZSBpcyBsaW1pdGVkIHN1cHBvcnQgZm9yIGNlcnRhaW4gc3lzdGVtcyB3aXRoIHNlZ21lbnRlZCBtZW1vcnkKK2FyY2hpdGVjdHVyZXMgYW5kIHRoZSB0eXBlcyBvZiBwb2ludGVycyBkZWNsYXJlZCBieSBwbmcuaCBtYXRjaCB0aGlzOyB5b3UKK3dpbGwgaGF2ZSB0byB1c2UgYXBwcm9wcmlhdGUgcG9pbnRlcnMgaW4geW91ciBhcHBsaWNhdGlvbi4gIElmIHlvdSBwcmVmZXIKK3RvIHVzZSBhIGRpZmZlcmVudCBtZXRob2Qgb2YgYWxsb2NhdGluZyBhbmQgZnJlZWluZyBkYXRhLCB5b3UgY2FuIHVzZQorcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yKCkgb3IgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMigpIHRvIHJlZ2lzdGVyIHlvdXIKK293biBmdW5jdGlvbnMgYXMgZGVzY3JpYmVkIGFib3ZlLiAgVGhlc2UgZnVuY3Rpb25zIGFsc28gcHJvdmlkZSBhIHZvaWQKK3BvaW50ZXIgdGhhdCBjYW4gYmUgcmV0cmlldmVkIHZpYQorCisgICAgbWVtX3B0cj1wbmdfZ2V0X21lbV9wdHIocG5nX3B0cik7CisKK1lvdXIgcmVwbGFjZW1lbnQgbWVtb3J5IGZ1bmN0aW9ucyBtdXN0IGhhdmUgcHJvdG90eXBlcyBhcyBmb2xsb3dzOgorCisgICAgcG5nX3ZvaWRwIG1hbGxvY19mbihwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgICAgIHBuZ19hbGxvY19zaXplX3Qgc2l6ZSk7CisKKyAgICB2b2lkIGZyZWVfZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3ZvaWRwIHB0cik7CisKK1lvdXIgbWFsbG9jX2ZuKCkgbXVzdCByZXR1cm4gTlVMTCBpbiBjYXNlIG9mIGZhaWx1cmUuICBUaGUgcG5nX21hbGxvYygpCitmdW5jdGlvbiB3aWxsIG5vcm1hbGx5IGNhbGwgcG5nX2Vycm9yKCkgaWYgaXQgcmVjZWl2ZXMgYSBOVUxMIGZyb20gdGhlCitzeXN0ZW0gbWVtb3J5IGFsbG9jYXRvciBvciBmcm9tIHlvdXIgcmVwbGFjZW1lbnQgbWFsbG9jX2ZuKCkuCisKK1lvdXIgZnJlZV9mbigpIHdpbGwgbmV2ZXIgYmUgY2FsbGVkIHdpdGggYSBOVUxMIHB0ciwgc2luY2UgbGlicG5nJ3MKK3BuZ19mcmVlKCkgY2hlY2tzIGZvciBOVUxMIGJlZm9yZSBjYWxsaW5nIGZyZWVfZm4oKS4KKworSW5wdXQvT3V0cHV0IGluIGxpYnBuZyBpcyBkb25lIHRocm91Z2ggcG5nX3JlYWQoKSBhbmQgcG5nX3dyaXRlKCksCit3aGljaCBjdXJyZW50bHkganVzdCBjYWxsIGZyZWFkKCkgYW5kIGZ3cml0ZSgpLiAgVGhlIEZJTEUgKiBpcyBzdG9yZWQgaW4KK3BuZ19zdHJ1Y3QgYW5kIGlzIGluaXRpYWxpemVkIHZpYSBwbmdfaW5pdF9pbygpLiAgSWYgeW91IHdpc2ggdG8gY2hhbmdlCit0aGUgbWV0aG9kIG9mIEkvTywgdGhlIGxpYnJhcnkgc3VwcGxpZXMgY2FsbGJhY2tzIHRoYXQgeW91IGNhbiBzZXQKK3Rocm91Z2ggdGhlIGZ1bmN0aW9uIHBuZ19zZXRfcmVhZF9mbigpIGFuZCBwbmdfc2V0X3dyaXRlX2ZuKCkgYXQgcnVuCit0aW1lLCBpbnN0ZWFkIG9mIGNhbGxpbmcgdGhlIHBuZ19pbml0X2lvKCkgZnVuY3Rpb24uICBUaGVzZSBmdW5jdGlvbnMKK2Fsc28gcHJvdmlkZSBhIHZvaWQgcG9pbnRlciB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgdmlhIHRoZSBmdW5jdGlvbgorcG5nX2dldF9pb19wdHIoKS4gIEZvciBleGFtcGxlOgorCisgICAgcG5nX3NldF9yZWFkX2ZuKHBuZ19zdHJ1Y3RwIHJlYWRfcHRyLAorICAgICAgICB2b2lkcCByZWFkX2lvX3B0ciwgcG5nX3J3X3B0ciByZWFkX2RhdGFfZm4pCisKKyAgICBwbmdfc2V0X3dyaXRlX2ZuKHBuZ19zdHJ1Y3RwIHdyaXRlX3B0ciwKKyAgICAgICAgdm9pZHAgd3JpdGVfaW9fcHRyLCBwbmdfcndfcHRyIHdyaXRlX2RhdGFfZm4sCisgICAgICAgIHBuZ19mbHVzaF9wdHIgb3V0cHV0X2ZsdXNoX2ZuKTsKKworICAgIHZvaWRwIHJlYWRfaW9fcHRyID0gcG5nX2dldF9pb19wdHIocmVhZF9wdHIpOworICAgIHZvaWRwIHdyaXRlX2lvX3B0ciA9IHBuZ19nZXRfaW9fcHRyKHdyaXRlX3B0cik7CisKK1RoZSByZXBsYWNlbWVudCBJL08gZnVuY3Rpb25zIG11c3QgaGF2ZSBwcm90b3R5cGVzIGFzIGZvbGxvd3M6CisKKyAgICB2b2lkIHVzZXJfcmVhZF9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICAgICAgIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCk7CisKKyAgICB2b2lkIHVzZXJfd3JpdGVfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgICAgICBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpOworCisgICAgdm9pZCB1c2VyX2ZsdXNoX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0cik7CisKK1RoZSB1c2VyX3JlYWRfZGF0YSgpIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBkZXRlY3RpbmcgYW5kCitoYW5kbGluZyBlbmQtb2YtZGF0YSBlcnJvcnMuCisKK1N1cHBseWluZyBOVUxMIGZvciB0aGUgcmVhZCwgd3JpdGUsIG9yIGZsdXNoIGZ1bmN0aW9ucyBzZXRzIHRoZW0gYmFjawordG8gdXNpbmcgdGhlIGRlZmF1bHQgQyBzdHJlYW0gZnVuY3Rpb25zLCB3aGljaCBleHBlY3QgdGhlIGlvX3B0ciB0bworcG9pbnQgdG8gYSBzdGFuZGFyZCAqRklMRSBzdHJ1Y3R1cmUuICBJdCBpcyBwcm9iYWJseSBhIG1pc3Rha2UKK3RvIHVzZSBOVUxMIGZvciBvbmUgb2Ygd3JpdGVfZGF0YV9mbiBhbmQgb3V0cHV0X2ZsdXNoX2ZuIGJ1dCBub3QgYm90aAorb2YgdGhlbSwgdW5sZXNzIHlvdSBoYXZlIGJ1aWx0IGxpYnBuZyB3aXRoIFBOR19OT19XUklURV9GTFVTSCBkZWZpbmVkLgorSXQgaXMgYW4gZXJyb3IgdG8gcmVhZCBmcm9tIGEgd3JpdGUgc3RyZWFtLCBhbmQgdmljZSB2ZXJzYS4KKworRXJyb3IgaGFuZGxpbmcgaW4gbGlicG5nIGlzIGRvbmUgdGhyb3VnaCBwbmdfZXJyb3IoKSBhbmQgcG5nX3dhcm5pbmcoKS4KK0Vycm9ycyBoYW5kbGVkIHRocm91Z2ggcG5nX2Vycm9yKCkgYXJlIGZhdGFsLCBtZWFuaW5nIHRoYXQgcG5nX2Vycm9yKCkKK3Nob3VsZCBuZXZlciByZXR1cm4gdG8gaXRzIGNhbGxlci4gIEN1cnJlbnRseSwgdGhpcyBpcyBoYW5kbGVkIHZpYQorc2V0am1wKCkgYW5kIGxvbmdqbXAoKSAodW5sZXNzIHlvdSBoYXZlIGNvbXBpbGVkIGxpYnBuZyB3aXRoCitQTkdfTk9fU0VUSk1QLCBpbiB3aGljaCBjYXNlIGl0IGlzIGhhbmRsZWQgdmlhIFBOR19BQk9SVCgpKSwKK2J1dCB5b3UgY291bGQgY2hhbmdlIHRoaXMgdG8gZG8gdGhpbmdzIGxpa2UgZXhpdCgpIGlmIHlvdSBzaG91bGQgd2lzaCwKK2FzIGxvbmcgYXMgeW91ciBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4uCisKK09uIG5vbi1mYXRhbCBlcnJvcnMsIHBuZ193YXJuaW5nKCkgaXMgY2FsbGVkCit0byBwcmludCBhIHdhcm5pbmcgbWVzc2FnZSwgYW5kIHRoZW4gY29udHJvbCByZXR1cm5zIHRvIHRoZSBjYWxsaW5nIGNvZGUuCitCeSBkZWZhdWx0IHBuZ19lcnJvcigpIGFuZCBwbmdfd2FybmluZygpIHByaW50IGEgbWVzc2FnZSBvbiBzdGRlcnIgdmlhCitmcHJpbnRmKCkgdW5sZXNzIHRoZSBsaWJyYXJ5IGlzIGNvbXBpbGVkIHdpdGggUE5HX05PX0NPTlNPTEVfSU8gZGVmaW5lZAorKGJlY2F1c2UgeW91IGRvbid0IHdhbnQgdGhlIG1lc3NhZ2VzKSBvciBQTkdfTk9fU1RESU8gZGVmaW5lZCAoYmVjYXVzZQorZnByaW50ZigpIGlzbid0IGF2YWlsYWJsZSkuICBJZiB5b3Ugd2lzaCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIHRoZSBlcnJvcgorZnVuY3Rpb25zLCB5b3Ugd2lsbCBuZWVkIHRvIHNldCB1cCB5b3VyIG93biBtZXNzYWdlIGNhbGxiYWNrcy4gIFRoZXNlCitmdW5jdGlvbnMgYXJlIG5vcm1hbGx5IHN1cHBsaWVkIGF0IHRoZSB0aW1lIHRoYXQgdGhlIHBuZ19zdHJ1Y3QgaXMgY3JlYXRlZC4KK0l0IGlzIGFsc28gcG9zc2libGUgdG8gcmVkaXJlY3QgZXJyb3JzIGFuZCB3YXJuaW5ncyB0byB5b3VyIG93biByZXBsYWNlbWVudAorZnVuY3Rpb25zIGFmdGVyIHBuZ19jcmVhdGVfKl9zdHJ1Y3QoKSBoYXMgYmVlbiBjYWxsZWQgYnkgY2FsbGluZzoKKworICAgIHBuZ19zZXRfZXJyb3JfZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgICAgICAgcG5nX3ZvaWRwIGVycm9yX3B0ciwgcG5nX2Vycm9yX3B0ciBlcnJvcl9mbiwKKyAgICAgICAgcG5nX2Vycm9yX3B0ciB3YXJuaW5nX2ZuKTsKKworICAgIHBuZ192b2lkcCBlcnJvcl9wdHIgPSBwbmdfZ2V0X2Vycm9yX3B0cihwbmdfcHRyKTsKKworSWYgTlVMTCBpcyBzdXBwbGllZCBmb3IgZWl0aGVyIGVycm9yX2ZuIG9yIHdhcm5pbmdfZm4sIHRoZW4gdGhlIGxpYnBuZworZGVmYXVsdCBmdW5jdGlvbiB3aWxsIGJlIHVzZWQsIGNhbGxpbmcgZnByaW50ZigpIGFuZC9vciBsb25nam1wKCkgaWYgYQorcHJvYmxlbSBpcyBlbmNvdW50ZXJlZC4gIFRoZSByZXBsYWNlbWVudCBlcnJvciBmdW5jdGlvbnMgc2hvdWxkIGhhdmUKK3BhcmFtZXRlcnMgYXMgZm9sbG93czoKKworICAgIHZvaWQgdXNlcl9lcnJvcl9mbihwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgICAgICBwbmdfY29uc3RfY2hhcnAgZXJyb3JfbXNnKTsKKworICAgIHZvaWQgdXNlcl93YXJuaW5nX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICAgICAgIHBuZ19jb25zdF9jaGFycCB3YXJuaW5nX21zZyk7CisKK1RoZSBtb3RpdmF0aW9uIGJlaGluZCB1c2luZyBzZXRqbXAoKSBhbmQgbG9uZ2ptcCgpIGlzIHRoZSBDKysgdGhyb3cgYW5kCitjYXRjaCBleGNlcHRpb24gaGFuZGxpbmcgbWV0aG9kcy4gIFRoaXMgbWFrZXMgdGhlIGNvZGUgbXVjaCBlYXNpZXIgdG8gd3JpdGUsCithcyB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGV2ZXJ5IHJldHVybiBjb2RlIG9mIGV2ZXJ5IGZ1bmN0aW9uIGNhbGwuCitIb3dldmVyLCB0aGVyZSBhcmUgc29tZSB1bmNlcnRhaW50aWVzIGFib3V0IHRoZSBzdGF0dXMgb2YgbG9jYWwgdmFyaWFibGVzCithZnRlciBhIGxvbmdqbXAsIHNvIHRoZSB1c2VyIG1heSB3YW50IHRvIGJlIGNhcmVmdWwgYWJvdXQgZG9pbmcgYW55dGhpbmcKK2FmdGVyIHNldGptcCByZXR1cm5zIG5vbi16ZXJvIGJlc2lkZXMgcmV0dXJuaW5nIGl0c2VsZi4gIENvbnN1bHQgeW91cgorY29tcGlsZXIgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLiAgRm9yIGFuIGFsdGVybmF0aXZlIGFwcHJvYWNoLCB5b3UKK21heSB3aXNoIHRvIHVzZSB0aGUgImNleGNlcHQiIGZhY2lsaXR5IChzZWUgaHR0cDovL2NleGNlcHQuc291cmNlZm9yZ2UubmV0KSwKK3doaWNoIGlzIGlsbHVzdHJhdGVkIGluIHBuZ3ZhbGlkLmMgYW5kIGluIGNvbnRyaWIvdmlzdXBuZy4KKworQmVnaW5uaW5nIGluIGxpYnBuZy0xLjQuMCwgdGhlIHBuZ19zZXRfYmVuaWduX2Vycm9ycygpIEFQSSBiZWNhbWUgYXZhaWxhYmxlLgorWW91IGNhbiB1c2UgdGhpcyB0byBoYW5kbGUgY2VydGFpbiBlcnJvcnMgKG5vcm1hbGx5IGhhbmRsZWQgYXMgZXJyb3JzKQorYXMgd2FybmluZ3MuCisKKyAgICBwbmdfc2V0X2Jlbmlnbl9lcnJvcnMgKHBuZ19wdHIsIGludCBhbGxvd2VkKTsKKworICAgIGFsbG93ZWQ6IDA6IHRyZWF0IHBuZ19iZW5pZ25fZXJyb3IoKSBhcyBhbiBlcnJvci4KKyAgICAgICAgICAgICAxOiB0cmVhdCBwbmdfYmVuaWduX2Vycm9yKCkgYXMgYSB3YXJuaW5nLgorCitBcyBvZiBsaWJwbmctMS42LjAsIHRoZSBkZWZhdWx0IGNvbmRpdGlvbiBpcyB0byB0cmVhdCBiZW5pZ24gZXJyb3JzIGFzCit3YXJuaW5ncyB3aGlsZSByZWFkaW5nIGFuZCBhcyBlcnJvcnMgd2hpbGUgd3JpdGluZy4KKworQ3VzdG9tIGNodW5rcworCitJZiB5b3UgbmVlZCB0byByZWFkIG9yIHdyaXRlIGN1c3RvbSBjaHVua3MsIHlvdSBtYXkgbmVlZCB0byBnZXQgZGVlcGVyCitpbnRvIHRoZSBsaWJwbmcgY29kZS4gIFRoZSBsaWJyYXJ5IG5vdyBoYXMgbWVjaGFuaXNtcyBmb3Igc3RvcmluZworYW5kIHdyaXRpbmcgY2h1bmtzIG9mIHVua25vd24gdHlwZTsgeW91IGNhbiBldmVuIGRlY2xhcmUgY2FsbGJhY2tzCitmb3IgY3VzdG9tIGNodW5rcy4gIEhvd2V2ZXIsIHRoaXMgbWF5IG5vdCBiZSBnb29kIGVub3VnaCBpZiB0aGUKK2xpYnJhcnkgY29kZSBpdHNlbGYgbmVlZHMgdG8ga25vdyBhYm91dCBpbnRlcmFjdGlvbnMgYmV0d2VlbiB5b3VyCitjaHVuayBhbmQgZXhpc3RpbmcgYGludHJpbnNpYycgY2h1bmtzLgorCitJZiB5b3UgbmVlZCB0byB3cml0ZSBhIG5ldyBpbnRyaW5zaWMgY2h1bmssIGZpcnN0IHJlYWQgdGhlIFBORworc3BlY2lmaWNhdGlvbi4gQWNxdWlyZSBhIGZpcnN0IGxldmVsIG9mIHVuZGVyc3RhbmRpbmcgb2YgaG93IGl0IHdvcmtzLgorUGF5IHBhcnRpY3VsYXIgYXR0ZW50aW9uIHRvIHRoZSBzZWN0aW9ucyB0aGF0IGRlc2NyaWJlIGNodW5rIG5hbWVzLAorYW5kIGxvb2sgYXQgaG93IG90aGVyIGNodW5rcyB3ZXJlIGRlc2lnbmVkLCBzbyB5b3UgY2FuIGRvIHRoaW5ncworc2ltaWxhcmx5LiAgU2Vjb25kLCBjaGVjayBvdXQgdGhlIHNlY3Rpb25zIG9mIGxpYnBuZyB0aGF0IHJlYWQgYW5kCit3cml0ZSBjaHVua3MuICBUcnkgdG8gZmluZCBhIGNodW5rIHRoYXQgaXMgc2ltaWxhciB0byB5b3VycyBhbmQgdXNlCitpdCBhcyBhIHRlbXBsYXRlLiAgTW9yZSBkZXRhaWxzIGNhbiBiZSBmb3VuZCBpbiB0aGUgY29tbWVudHMgaW5zaWRlCit0aGUgY29kZS4gIEl0IGlzIGJlc3QgdG8gaGFuZGxlIHByaXZhdGUgb3IgdW5rbm93biBjaHVua3MgaW4gYSBnZW5lcmljIG1ldGhvZCwKK3ZpYSBjYWxsYmFjayBmdW5jdGlvbnMsIGluc3RlYWQgb2YgYnkgbW9kaWZ5aW5nIGxpYnBuZyBmdW5jdGlvbnMuIFRoaXMKK2lzIGlsbHVzdHJhdGVkIGluIHBuZ3Rlc3QuYywgd2hpY2ggdXNlcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSBhCitwcml2YXRlICJ2cEFnIiBjaHVuayBhbmQgdGhlIG5ldyAic1RFUiIgY2h1bmssIHdoaWNoIGFyZSBib3RoIHVua25vd24gdG8KK2xpYnBuZy4KKworSWYgeW91IHdpc2ggdG8gd3JpdGUgeW91ciBvd24gdHJhbnNmb3JtYXRpb24gZm9yIHRoZSBkYXRhLCBsb29rIHRocm91Z2gKK3RoZSBwYXJ0IG9mIHRoZSBjb2RlIHRoYXQgZG9lcyB0aGUgdHJhbnNmb3JtYXRpb25zLCBhbmQgY2hlY2sgb3V0IHNvbWUgb2YKK3RoZSBzaW1wbGVyIG9uZXMgdG8gZ2V0IGFuIGlkZWEgb2YgaG93IHRoZXkgd29yay4gIFRyeSB0byBmaW5kIGEgc2ltaWxhcgordHJhbnNmb3JtYXRpb24gdG8gdGhlIG9uZSB5b3Ugd2FudCB0byBhZGQgYW5kIGNvcHkgb2ZmIG9mIGl0LiAgTW9yZSBkZXRhaWxzCitjYW4gYmUgZm91bmQgaW4gdGhlIGNvbW1lbnRzIGluc2lkZSB0aGUgY29kZSBpdHNlbGYuCisKK0NvbmZpZ3VyaW5nIGZvciBndWkvd2luZG93aW5nIHBsYXRmb3JtczoKKworWW91IHdpbGwgbmVlZCB0byB3cml0ZSBuZXcgZXJyb3IgYW5kIHdhcm5pbmcgZnVuY3Rpb25zIHRoYXQgdXNlIHRoZSBHVUkKK2ludGVyZmFjZSwgYXMgZGVzY3JpYmVkIHByZXZpb3VzbHksIGFuZCBzZXQgdGhlbSB0byBiZSB0aGUgZXJyb3IgYW5kCit3YXJuaW5nIGZ1bmN0aW9ucyBhdCB0aGUgdGltZSB0aGF0IHBuZ19jcmVhdGVfKl9zdHJ1Y3QoKSBpcyBjYWxsZWQsCitpbiBvcmRlciB0byBoYXZlIHRoZW0gYXZhaWxhYmxlIGR1cmluZyB0aGUgc3RydWN0dXJlIGluaXRpYWxpemF0aW9uLgorVGhleSBjYW4gYmUgY2hhbmdlZCBsYXRlciB2aWEgcG5nX3NldF9lcnJvcl9mbigpLiAgT24gc29tZSBjb21waWxlcnMsCit5b3UgbWF5IGFsc28gaGF2ZSB0byBjaGFuZ2UgdGhlIG1lbW9yeSBhbGxvY2F0b3JzIChwbmdfbWFsbG9jLCBldGMuKS4KKworQ29uZmlndXJpbmcgemxpYjoKKworVGhlcmUgYXJlIHNwZWNpYWwgZnVuY3Rpb25zIHRvIGNvbmZpZ3VyZSB0aGUgY29tcHJlc3Npb24uICBQZXJoYXBzIHRoZQorbW9zdCB1c2VmdWwgb25lIGNoYW5nZXMgdGhlIGNvbXByZXNzaW9uIGxldmVsLCB3aGljaCBjdXJyZW50bHkgdXNlcworaW5wdXQgY29tcHJlc3Npb24gdmFsdWVzIGluIHRoZSByYW5nZSAwIC0gOS4gIFRoZSBsaWJyYXJ5IG5vcm1hbGx5Cit1c2VzIHRoZSBkZWZhdWx0IGNvbXByZXNzaW9uIGxldmVsIChaX0RFRkFVTFRfQ09NUFJFU1NJT04gPSA2KS4gIFRlc3RzCitoYXZlIHNob3duIHRoYXQgZm9yIGEgbGFyZ2UgbWFqb3JpdHkgb2YgaW1hZ2VzLCBjb21wcmVzc2lvbiB2YWx1ZXMgaW4KK3RoZSByYW5nZSAzLTYgY29tcHJlc3MgbmVhcmx5IGFzIHdlbGwgYXMgaGlnaGVyIGxldmVscywgYW5kIGRvIHNvIG11Y2gKK2Zhc3Rlci4gIEZvciBvbmxpbmUgYXBwbGljYXRpb25zIGl0IG1heSBiZSBkZXNpcmFibGUgdG8gaGF2ZSBtYXhpbXVtIHNwZWVkCisoWl9CRVNUX1NQRUVEID0gMSkuICBXaXRoIHZlcnNpb25zIG9mIHpsaWIgYWZ0ZXIgdjAuOTksIHlvdSBjYW4gYWxzbworc3BlY2lmeSBubyBjb21wcmVzc2lvbiAoWl9OT19DT01QUkVTU0lPTiA9IDApLCBidXQgdGhpcyB3b3VsZCBjcmVhdGUKK2ZpbGVzIGxhcmdlciB0aGFuIGp1c3Qgc3RvcmluZyB0aGUgcmF3IGJpdG1hcC4gIFlvdSBjYW4gc3BlY2lmeSB0aGUKK2NvbXByZXNzaW9uIGxldmVsIGJ5IGNhbGxpbmc6CisKKyAgICAjaW5jbHVkZSB6bGliLmgKKyAgICBwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsKHBuZ19wdHIsIGxldmVsKTsKKworQW5vdGhlciB1c2VmdWwgb25lIGlzIHRvIHJlZHVjZSB0aGUgbWVtb3J5IGxldmVsIHVzZWQgYnkgdGhlIGxpYnJhcnkuCitUaGUgbWVtb3J5IGxldmVsIGRlZmF1bHRzIHRvIDgsIGJ1dCBpdCBjYW4gYmUgbG93ZXJlZCBpZiB5b3UgYXJlCitzaG9ydCBvbiBtZW1vcnkgKHJ1bm5pbmcgRE9TLCBmb3IgZXhhbXBsZSwgd2hlcmUgeW91IG9ubHkgaGF2ZSA2NDBLKS4KK05vdGUgdGhhdCB0aGUgbWVtb3J5IGxldmVsIGRvZXMgaGF2ZSBhbiBlZmZlY3Qgb24gY29tcHJlc3Npb247IGFtb25nCitvdGhlciB0aGluZ3MsIGxvd2VyIGxldmVscyB3aWxsIHJlc3VsdCBpbiBzZWN0aW9ucyBvZiBpbmNvbXByZXNzaWJsZQorZGF0YSBiZWluZyBlbWl0dGVkIGluIHNtYWxsZXIgc3RvcmVkIGJsb2Nrcywgd2l0aCBhIGNvcnJlc3BvbmRpbmdseQorbGFyZ2VyIHJlbGF0aXZlIG92ZXJoZWFkIG9mIHVwIHRvIDE1JSBpbiB0aGUgd29yc3QgY2FzZS4KKworICAgICNpbmNsdWRlIHpsaWIuaAorICAgIHBuZ19zZXRfY29tcHJlc3Npb25fbWVtX2xldmVsKHBuZ19wdHIsIGxldmVsKTsKKworVGhlIG90aGVyIGZ1bmN0aW9ucyBhcmUgZm9yIGNvbmZpZ3VyaW5nIHpsaWIuICBUaGV5IGFyZSBub3QgcmVjb21tZW5kZWQKK2ZvciBub3JtYWwgdXNlIGFuZCBtYXkgcmVzdWx0IGluIHdyaXRpbmcgYW4gaW52YWxpZCBQTkcgZmlsZS4gIFNlZQoremxpYi5oIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHdoYXQgdGhlc2UgbWVhbi4KKworICAgICNpbmNsdWRlIHpsaWIuaAorICAgIHBuZ19zZXRfY29tcHJlc3Npb25fc3RyYXRlZ3kocG5nX3B0ciwKKyAgICAgICAgc3RyYXRlZ3kpOworCisgICAgcG5nX3NldF9jb21wcmVzc2lvbl93aW5kb3dfYml0cyhwbmdfcHRyLAorICAgICAgICB3aW5kb3dfYml0cyk7CisKKyAgICBwbmdfc2V0X2NvbXByZXNzaW9uX21ldGhvZChwbmdfcHRyLCBtZXRob2QpOworCitUaGlzIGNvbnRyb2xzIHRoZSBzaXplIG9mIHRoZSBJREFUIGNodW5rcyAoZGVmYXVsdCA4MTkyKToKKworICAgIHBuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUocG5nX3B0ciwgc2l6ZSk7CisKK0FzIG9mIGxpYnBuZyB2ZXJzaW9uIDEuNS40LCBhZGRpdGlvbmFsIEFQSXMgYmVjYW1lCithdmFpbGFibGUgdG8gc2V0IHRoZXNlIHNlcGFyYXRlbHkgZm9yIG5vbi1JREFUCitjb21wcmVzc2VkIGNodW5rcyBzdWNoIGFzIHpUWHQsIGlUWHQsIGFuZCBpQ0NQOgorCisgICAgI2luY2x1ZGUgemxpYi5oCisgICAgI2lmIFBOR19MSUJQTkdfVkVSID49IDEwNTA0CisgICAgcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX2xldmVsKHBuZ19wdHIsIGxldmVsKTsKKworICAgIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwocG5nX3B0ciwgbGV2ZWwpOworCisgICAgcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX3N0cmF0ZWd5KHBuZ19wdHIsCisgICAgICAgIHN0cmF0ZWd5KTsKKworICAgIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl93aW5kb3dfYml0cyhwbmdfcHRyLAorICAgICAgICB3aW5kb3dfYml0cyk7CisKKyAgICBwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fbWV0aG9kKHBuZ19wdHIsIG1ldGhvZCk7CisgICAgI2VuZGlmCisKK0NvbnRyb2xsaW5nIHJvdyBmaWx0ZXJpbmcKKworSWYgeW91IHdhbnQgdG8gY29udHJvbCB3aGV0aGVyIGxpYnBuZyB1c2VzIGZpbHRlcmluZyBvciBub3QsIHdoaWNoCitmaWx0ZXJzIGFyZSB1c2VkLCBhbmQgaG93IGl0IGdvZXMgYWJvdXQgcGlja2luZyByb3cgZmlsdGVycywgeW91CitjYW4gY2FsbCBvbmUgb2YgdGhlc2UgZnVuY3Rpb25zLiAgVGhlIHNlbGVjdGlvbiBhbmQgY29uZmlndXJhdGlvbgorb2Ygcm93IGZpbHRlcnMgY2FuIGhhdmUgYSBzaWduaWZpY2FudCBpbXBhY3Qgb24gdGhlIHNpemUgYW5kCitlbmNvZGluZyBzcGVlZCBhbmQgYSBzb21ld2hhdCBsZXNzZXIgaW1wYWN0IG9uIHRoZSBkZWNvZGluZyBzcGVlZAorb2YgYW4gaW1hZ2UuICBGaWx0ZXJpbmcgaXMgZW5hYmxlZCBieSBkZWZhdWx0IGZvciBSR0IgYW5kIGdyYXlzY2FsZQoraW1hZ2VzICh3aXRoIGFuZCB3aXRob3V0IGFscGhhKSwgYnV0IG5vdCBmb3IgcGFsZXR0ZWQgaW1hZ2VzIG5vcgorZm9yIGFueSBpbWFnZXMgd2l0aCBiaXQgZGVwdGhzIGxlc3MgdGhhbiA4IGJpdHMvcGl4ZWwuCisKK1RoZSAnbWV0aG9kJyBwYXJhbWV0ZXIgc2V0cyB0aGUgbWFpbiBmaWx0ZXJpbmcgbWV0aG9kLCB3aGljaCBpcworY3VycmVudGx5IG9ubHkgJzAnIGluIHRoZSBQTkcgMS4yIHNwZWNpZmljYXRpb24uICBUaGUgJ2ZpbHRlcnMnCitwYXJhbWV0ZXIgc2V0cyB3aGljaCBmaWx0ZXIocyksIGlmIGFueSwgc2hvdWxkIGJlIHVzZWQgZm9yIGVhY2gKK3NjYW5saW5lLiAgUG9zc2libGUgdmFsdWVzIGFyZSBQTkdfQUxMX0ZJTFRFUlMgYW5kIFBOR19OT19GSUxURVJTCit0byB0dXJuIGZpbHRlcmluZyBvbiBhbmQgb2ZmLCByZXNwZWN0aXZlbHkuCisKK0luZGl2aWR1YWwgZmlsdGVyIHR5cGVzIGFyZSBQTkdfRklMVEVSX05PTkUsIFBOR19GSUxURVJfU1VCLAorUE5HX0ZJTFRFUl9VUCwgUE5HX0ZJTFRFUl9BVkcsIFBOR19GSUxURVJfUEFFVEgsIHdoaWNoIGNhbiBiZSBiaXR3aXNlCitPUmVkIHRvZ2V0aGVyIHdpdGggJ3wnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsdGVycyB0byB1c2UuCitUaGVzZSBmaWx0ZXJzIGFyZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gdGhlIFBORyBzcGVjaWZpY2F0aW9uLgorSWYgeW91IGludGVuZCB0byBjaGFuZ2UgdGhlIGZpbHRlciB0eXBlIGR1cmluZyB0aGUgY291cnNlIG9mIHdyaXRpbmcKK3RoZSBpbWFnZSwgeW91IHNob3VsZCBzdGFydCB3aXRoIGZsYWdzIHNldCBmb3IgYWxsIG9mIHRoZSBmaWx0ZXJzCit5b3UgaW50ZW5kIHRvIHVzZSBzbyB0aGF0IGxpYnBuZyBjYW4gaW5pdGlhbGl6ZSBpdHMgaW50ZXJuYWwKK3N0cnVjdHVyZXMgYXBwcm9wcmlhdGVseSBmb3IgYWxsIG9mIHRoZSBmaWx0ZXIgdHlwZXMuICAoTm90ZSB0aGF0IHRoaXMKK21lYW5zIHRoZSBmaXJzdCByb3cgbXVzdCBhbHdheXMgYmUgYWRhcHRpdmVseSBmaWx0ZXJlZCwgYmVjYXVzZSBsaWJwbmcKK2N1cnJlbnRseSBkb2VzIG5vdCBhbGxvY2F0ZSB0aGUgZmlsdGVyIGJ1ZmZlcnMgdW50aWwgcG5nX3dyaXRlX3JvdygpCitpcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lLikKKworICAgIGZpbHRlcnMgPSBQTkdfRklMVEVSX05PTkUgfCBQTkdfRklMVEVSX1NVQgorICAgICAgICAgICAgICBQTkdfRklMVEVSX1VQIHwgUE5HX0ZJTFRFUl9BVkcgfAorICAgICAgICAgICAgICBQTkdfRklMVEVSX1BBRVRIIHwgUE5HX0FMTF9GSUxURVJTOworCisgICAgcG5nX3NldF9maWx0ZXIocG5nX3B0ciwgUE5HX0ZJTFRFUl9UWVBFX0JBU0UsCisgICAgICAgZmlsdGVycyk7CisgICAgICAgICAgICAgIFRoZSBzZWNvbmQgcGFyYW1ldGVyIGNhbiBhbHNvIGJlCisgICAgICAgICAgICAgIFBOR19JTlRSQVBJWEVMX0RJRkZFUkVOQ0lORyBpZiB5b3UgYXJlCisgICAgICAgICAgICAgIHdyaXRpbmcgYSBQTkcgdG8gYmUgZW1iZWRkZWQgaW4gYSBNTkcKKyAgICAgICAgICAgICAgZGF0YXN0cmVhbS4gIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgdGhlCisgICAgICAgICAgICAgIHNhbWUgYXMgdGhlIHZhbHVlIG9mIGZpbHRlcl9tZXRob2QgdXNlZAorICAgICAgICAgICAgICBpbiBwbmdfc2V0X0lIRFIoKS4KKworUmVxdWVzdGluZyBkZWJ1ZyBwcmludG91dAorCitUaGUgbWFjcm8gZGVmaW5pdGlvbiBQTkdfREVCVUcgY2FuIGJlIHVzZWQgdG8gcmVxdWVzdCBkZWJ1Z2dpbmcKK3ByaW50b3V0LiAgU2V0IGl0IHRvIGFuIGludGVnZXIgdmFsdWUgaW4gdGhlIHJhbmdlIDAgdG8gMy4gIEhpZ2hlcgorbnVtYmVycyByZXN1bHQgaW4gaW5jcmVhc2luZyBhbW91bnRzIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoZQoraW5mb3JtYXRpb24gaXMgcHJpbnRlZCB0byB0aGUgInN0ZGVyciIgZmlsZSwgdW5sZXNzIGFub3RoZXIgZmlsZQorbmFtZSBpcyBzcGVjaWZpZWQgaW4gdGhlIFBOR19ERUJVR19GSUxFIG1hY3JvIGRlZmluaXRpb24uCisKK1doZW4gUE5HX0RFQlVHID4gMCwgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgKG1hY3JvcykgYmVjb21lIGF2YWlsYWJsZToKKworICAgcG5nX2RlYnVnKGxldmVsLCBtZXNzYWdlKQorICAgcG5nX2RlYnVnMShsZXZlbCwgbWVzc2FnZSwgcDEpCisgICBwbmdfZGVidWcyKGxldmVsLCBtZXNzYWdlLCBwMSwgcDIpCisKK2luIHdoaWNoICJsZXZlbCIgaXMgY29tcGFyZWQgdG8gUE5HX0RFQlVHIHRvIGRlY2lkZSB3aGV0aGVyIHRvIHByaW50Cit0aGUgbWVzc2FnZSwgIm1lc3NhZ2UiIGlzIHRoZSBmb3JtYXR0ZWQgc3RyaW5nIHRvIGJlIHByaW50ZWQsCithbmQgcDEgYW5kIHAyIGFyZSBwYXJhbWV0ZXJzIHRoYXQgYXJlIHRvIGJlIGVtYmVkZGVkIGluIHRoZSBzdHJpbmcKK2FjY29yZGluZyB0byBwcmludGYtc3R5bGUgZm9ybWF0dGluZyBkaXJlY3RpdmVzLiAgRm9yIGV4YW1wbGUsCisKKyAgIHBuZ19kZWJ1ZzEoMiwgImZvbz0lZCIsIGZvbyk7CisKK2lzIGV4cGFuZGVkIHRvCisKKyAgIGlmIChQTkdfREVCVUcgPiAyKQorICAgICAgZnByaW50ZihQTkdfREVCVUdfRklMRSwgImZvbz0lZFxuIiwgZm9vKTsKKworV2hlbiBQTkdfREVCVUcgaXMgZGVmaW5lZCBidXQgaXMgemVybywgdGhlIG1hY3JvcyBhcmVuJ3QgZGVmaW5lZCwgYnV0IHlvdQorY2FuIHN0aWxsIHVzZSBQTkdfREVCVUcgdG8gY29udHJvbCB5b3VyIG93biBkZWJ1Z2dpbmc6CisKKyAgICNpZmRlZiBQTkdfREVCVUcKKyAgICAgICBmcHJpbnRmKHN0ZGVyciwgLi4uCisgICAjZW5kaWYKKworV2hlbiBQTkdfREVCVUcgPSAxLCB0aGUgbWFjcm9zIGFyZSBkZWZpbmVkLCBidXQgb25seSBwbmdfZGVidWcgc3RhdGVtZW50cworaGF2aW5nIGxldmVsID0gMCB3aWxsIGJlIHByaW50ZWQuICBUaGVyZSBhcmVuJ3QgYW55IHN1Y2ggc3RhdGVtZW50cyBpbgordGhpcyB2ZXJzaW9uIG9mIGxpYnBuZywgYnV0IGlmIHlvdSBpbnNlcnQgc29tZSB0aGV5IHdpbGwgYmUgcHJpbnRlZC4KKworVklJLiAgTU5HIHN1cHBvcnQKKworVGhlIE1ORyBzcGVjaWZpY2F0aW9uIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9tbmcpIGFsbG93cworY2VydGFpbiBleHRlbnNpb25zIHRvIFBORyBmb3IgUE5HIGltYWdlcyB0aGF0IGFyZSBlbWJlZGRlZCBpbiBNTkcgZGF0YXN0cmVhbXMuCitMaWJwbmcgY2FuIHN1cHBvcnQgc29tZSBvZiB0aGVzZSBleHRlbnNpb25zLiAgVG8gZW5hYmxlIHRoZW0sIHVzZSB0aGUKK3BuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzKCkgZnVuY3Rpb246CisKKyAgIGZlYXR1cmVfc2V0ID0gcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMocG5nX3B0ciwgbWFzaykKKworICAgbWFzayBpcyBhIHBuZ191aW50XzMyIGNvbnRhaW5pbmcgdGhlIGJpdHdpc2UgT1Igb2YgdGhlCisgICAgICAgIGZlYXR1cmVzIHlvdSB3YW50IHRvIGVuYWJsZS4gIFRoZXNlIGluY2x1ZGUKKyAgICAgICAgUE5HX0ZMQUdfTU5HX0VNUFRZX1BMVEUKKyAgICAgICAgUE5HX0ZMQUdfTU5HX0ZJTFRFUl82NAorICAgICAgICBQTkdfQUxMX01OR19GRUFUVVJFUworCisgICBmZWF0dXJlX3NldCBpcyBhIHBuZ191aW50XzMyIHRoYXQgaXMgdGhlIGJpdHdpc2UgQU5EIG9mCisgICAgICB5b3VyIG1hc2sgd2l0aCB0aGUgc2V0IG9mIE1ORyBmZWF0dXJlcyB0aGF0IGlzCisgICAgICBzdXBwb3J0ZWQgYnkgdGhlIHZlcnNpb24gb2YgbGlicG5nIHRoYXQgeW91IGFyZSB1c2luZy4KKworSXQgaXMgYW4gZXJyb3IgdG8gdXNlIHRoaXMgZnVuY3Rpb24gd2hlbiByZWFkaW5nIG9yIHdyaXRpbmcgYSBzdGFuZGFsb25lCitQTkcgZmlsZSB3aXRoIHRoZSBQTkcgOC1ieXRlIHNpZ25hdHVyZS4gIFRoZSBQTkcgZGF0YXN0cmVhbSBtdXN0IGJlIHdyYXBwZWQKK2luIGEgTU5HIGRhdGFzdHJlYW0uICBBcyBhIG1pbmltdW0sIGl0IG11c3QgaGF2ZSB0aGUgTU5HIDgtYnl0ZSBzaWduYXR1cmUKK2FuZCB0aGUgTUhEUiBhbmQgTUVORCBjaHVua3MuICBMaWJwbmcgZG9lcyBub3QgcHJvdmlkZSBzdXBwb3J0IGZvciB0aGVzZQorb3IgYW55IG90aGVyIE1ORyBjaHVua3M7IHlvdXIgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIGl0cyBvd24gc3VwcG9ydCBmb3IKK3RoZW0uICBZb3UgbWF5IHdpc2ggdG8gY29uc2lkZXIgdXNpbmcgbGlibW5nIChhdmFpbGFibGUgYXQKK2h0dHA6Ly93d3cubGlibW5nLmNvbSkgaW5zdGVhZC4KKworVklJSS4gIENoYW5nZXMgdG8gTGlicG5nIGZyb20gdmVyc2lvbiAwLjg4CisKK0l0IHNob3VsZCBiZSBub3RlZCB0aGF0IHZlcnNpb25zIG9mIGxpYnBuZyBsYXRlciB0aGFuIDAuOTYgYXJlIG5vdAorZGlzdHJpYnV0ZWQgYnkgdGhlIG9yaWdpbmFsIGxpYnBuZyBhdXRob3IsIEd1eSBTY2hhbG5hdCwgbm9yIGJ5CitBbmRyZWFzIERpbGdlciwgd2hvIGhhZCB0YWtlbiBvdmVyIGZyb20gR3V5IGR1cmluZyAxOTk2IGFuZCAxOTk3LCBhbmQKK2Rpc3RyaWJ1dGVkIHZlcnNpb25zIDAuODkgdGhyb3VnaCAwLjk2LCBidXQgcmF0aGVyIGJ5IGFub3RoZXIgbWVtYmVyCitvZiB0aGUgb3JpZ2luYWwgUE5HIEdyb3VwLCBHbGVubiBSYW5kZXJzLVBlaHJzb24uICBHdXkgYW5kIEFuZHJlYXMgYXJlCitzdGlsbCBhbGl2ZSBhbmQgd2VsbCwgYnV0IHRoZXkgaGF2ZSBtb3ZlZCBvbiB0byBvdGhlciB0aGluZ3MuCisKK1RoZSBvbGQgbGlicG5nIGZ1bmN0aW9ucyBwbmdfcmVhZF9pbml0KCksIHBuZ193cml0ZV9pbml0KCksCitwbmdfaW5mb19pbml0KCksIHBuZ19yZWFkX2Rlc3Ryb3koKSwgYW5kIHBuZ193cml0ZV9kZXN0cm95KCkgaGF2ZSBiZWVuCittb3ZlZCB0byBQTkdfSU5URVJOQUwgaW4gdmVyc2lvbiAwLjk1IHRvIGRpc2NvdXJhZ2UgdGhlaXIgdXNlLiAgVGhlc2UKK2Z1bmN0aW9ucyB3aWxsIGJlIHJlbW92ZWQgZnJvbSBsaWJwbmcgdmVyc2lvbiAxLjQuMC4KKworVGhlIHByZWZlcnJlZCBtZXRob2Qgb2YgY3JlYXRpbmcgYW5kIGluaXRpYWxpemluZyB0aGUgbGlicG5nIHN0cnVjdHVyZXMgaXMKK3ZpYSB0aGUgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCgpLCBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCgpLCBhbmQKK3BuZ19jcmVhdGVfaW5mb19zdHJ1Y3QoKSBiZWNhdXNlIHRoZXkgaXNvbGF0ZSB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0dXJlcworZnJvbSB0aGUgYXBwbGljYXRpb24sIGFsbG93IHZlcnNpb24gZXJyb3IgY2hlY2tpbmcsIGFuZCBhbHNvIGFsbG93IHRoZQordXNlIG9mIGN1c3RvbSBlcnJvciBoYW5kbGluZyByb3V0aW5lcyBkdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uLCB3aGljaAordGhlIG9sZCBmdW5jdGlvbnMgZG8gbm90LiAgVGhlIGZ1bmN0aW9ucyBwbmdfcmVhZF9kZXN0cm95KCkgYW5kCitwbmdfd3JpdGVfZGVzdHJveSgpIGRvIG5vdCBhY3R1YWxseSBmcmVlIHRoZSBtZW1vcnkgdGhhdCBsaWJwbmcKK2FsbG9jYXRlZCBmb3IgdGhlc2Ugc3RydWN0cywgYnV0IGp1c3QgcmVzZXQgdGhlIGRhdGEgc3RydWN0dXJlcywgc28gdGhleQorY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgpIGFuZAorcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCkgaWYgeW91IGZlZWwgdGhlcmUgaXMgdG9vIG11Y2ggc3lzdGVtIG92ZXJoZWFkCithbGxvY2F0aW5nIGFuZCBmcmVlaW5nIHRoZSBwbmdfc3RydWN0IGZvciBlYWNoIGltYWdlIHJlYWQuCisKK1NldHRpbmcgdGhlIGVycm9yIGNhbGxiYWNrcyB2aWEgcG5nX3NldF9tZXNzYWdlX2ZuKCkgYmVmb3JlCitwbmdfcmVhZF9pbml0KCkgYXMgd2FzIHN1Z2dlc3RlZCBpbiBsaWJwbmctMC44OCBpcyBubyBsb25nZXIgc3VwcG9ydGVkCitiZWNhdXNlIHRoaXMgY2F1c2VkIGFwcGxpY2F0aW9ucyB0aGF0IGRvIG5vdCB1c2UgY3VzdG9tIGVycm9yIGZ1bmN0aW9ucwordG8gZmFpbCBpZiB0aGUgcG5nX3B0ciB3YXMgbm90IGluaXRpYWxpemVkIHRvIHplcm8uICBJdCBpcyBzdGlsbCBwb3NzaWJsZQordG8gc2V0IHRoZSBlcnJvciBjYWxsYmFja3MgQUZURVIgcG5nX3JlYWRfaW5pdCgpLCBvciB0byBjaGFuZ2UgdGhlbSB3aXRoCitwbmdfc2V0X2Vycm9yX2ZuKCksIHdoaWNoIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGZ1bmN0aW9uLCBidXQgd2l0aCBhIG5ldworbmFtZSB0byBmb3JjZSBjb21waWxhdGlvbiBlcnJvcnMgd2l0aCBhcHBsaWNhdGlvbnMgdGhhdCB0cnkgdG8gdXNlIHRoZSBvbGQKK21ldGhvZC4KKworU3VwcG9ydCBmb3IgdGhlIHNDQUwsIGlDQ1AsIGlUWHQsIGFuZCBzUExUIGNodW5rcyB3YXMgYWRkZWQgYXQgbGlicG5nLTEuMC42OworaG93ZXZlciwgaVRYdCBzdXBwb3J0IHdhcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0LgorCitTdGFydGluZyB3aXRoIHZlcnNpb24gMS4wLjcsIHlvdSBjYW4gZmluZCBvdXQgd2hpY2ggdmVyc2lvbiBvZiB0aGUgbGlicmFyeQoreW91IGFyZSB1c2luZyBhdCBydW4tdGltZToKKworICAgcG5nX3VpbnRfMzIgbGlicG5nX3ZuID0gcG5nX2FjY2Vzc192ZXJzaW9uX251bWJlcigpOworCitUaGUgbnVtYmVyIGxpYnBuZ192biBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBtYWpvciB2ZXJzaW9uLCBtaW5vcgordmVyc2lvbiB3aXRoIGxlYWRpbmcgemVybywgYW5kIHJlbGVhc2UgbnVtYmVyIHdpdGggbGVhZGluZyB6ZXJvLAorKGUuZy4sIGxpYnBuZ192biBmb3IgdmVyc2lvbiAxLjAuNyBpcyAxMDAwNykuCisKK05vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHRha2UgYSBwbmdfcHRyLCBzbyB5b3UgY2FuIGNhbGwgaXQKK2JlZm9yZSB5b3UndmUgY3JlYXRlZCBvbmUuCisKK1lvdSBjYW4gYWxzbyBjaGVjayB3aGljaCB2ZXJzaW9uIG9mIHBuZy5oIHlvdSB1c2VkIHdoZW4gY29tcGlsaW5nIHlvdXIKK2FwcGxpY2F0aW9uOgorCisgICBwbmdfdWludF8zMiBhcHBsaWNhdGlvbl92biA9IFBOR19MSUJQTkdfVkVSOworCitJWC4gIENoYW5nZXMgdG8gTGlicG5nIGZyb20gdmVyc2lvbiAxLjAueCB0byAxLjIueAorCitTdXBwb3J0IGZvciB1c2VyIG1lbW9yeSBtYW5hZ2VtZW50IHdhcyBlbmFibGVkIGJ5IGRlZmF1bHQuICBUbworYWNjb21wbGlzaCB0aGlzLCB0aGUgZnVuY3Rpb25zIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3RfMigpLAorcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMigpLCBwbmdfc2V0X21lbV9mbigpLCBwbmdfZ2V0X21lbV9wdHIoKSwKK3BuZ19tYWxsb2NfZGVmYXVsdCgpLCBhbmQgcG5nX2ZyZWVfZGVmYXVsdCgpIHdlcmUgYWRkZWQuCisKK1N1cHBvcnQgZm9yIHRoZSBpVFh0IGNodW5rIGhhcyBiZWVuIGVuYWJsZWQgYnkgZGVmYXVsdCBhcyBvZgordmVyc2lvbiAxLjIuNDEuCisKK1N1cHBvcnQgZm9yIGNlcnRhaW4gTU5HIGZlYXR1cmVzIHdhcyBlbmFibGVkLgorCitTdXBwb3J0IGZvciBudW1iZXJlZCBlcnJvciBtZXNzYWdlcyB3YXMgYWRkZWQuICBIb3dldmVyLCB3ZSBuZXZlciBnb3QKK2Fyb3VuZCB0byBhY3R1YWxseSBudW1iZXJpbmcgdGhlIGVycm9yIG1lc3NhZ2VzLiAgVGhlIGZ1bmN0aW9uCitwbmdfc2V0X3N0cmlwX2Vycm9yX251bWJlcnMoKSB3YXMgYWRkZWQgKE5vdGU6IHRoZSBwcm90b3R5cGUgZm9yIHRoaXMKK2Z1bmN0aW9uIHdhcyBpbmFkdmVydGVudGx5IHJlbW92ZWQgZnJvbSBwbmcuaCBpbiBQTkdfTk9fQVNTRU1CTEVSX0NPREUKK2J1aWxkcyBvZiBsaWJwbmctMS4yLjE1LiAgSXQgd2FzIHJlc3RvcmVkIGluIGxpYnBuZy0xLjIuMzYpLgorCitUaGUgcG5nX21hbGxvY193YXJuKCkgZnVuY3Rpb24gd2FzIGFkZGVkIGF0IGxpYnBuZy0xLjIuMy4gIFRoaXMgaXNzdWVzCithIHBuZ193YXJuaW5nIGFuZCByZXR1cm5zIE5VTEwgaW5zdGVhZCBvZiBhYm9ydGluZyB3aGVuIGl0IGZhaWxzIHRvCithY3F1aXJlIHRoZSByZXF1ZXN0ZWQgbWVtb3J5IGFsbG9jYXRpb24uCisKK1N1cHBvcnQgZm9yIHNldHRpbmcgdXNlciBsaW1pdHMgb24gaW1hZ2Ugd2lkdGggYW5kIGhlaWdodCB3YXMgZW5hYmxlZAorYnkgZGVmYXVsdC4gIFRoZSBmdW5jdGlvbnMgcG5nX3NldF91c2VyX2xpbWl0cygpLCBwbmdfZ2V0X3VzZXJfd2lkdGhfbWF4KCksCithbmQgcG5nX2dldF91c2VyX2hlaWdodF9tYXgoKSB3ZXJlIGFkZGVkIGF0IGxpYnBuZy0xLjIuNi4KKworVGhlIHBuZ19zZXRfYWRkX2FscGhhKCkgZnVuY3Rpb24gd2FzIGFkZGVkIGF0IGxpYnBuZy0xLjIuNy4KKworVGhlIGZ1bmN0aW9uIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOCgpIHdhcyBhZGRlZCBhdCBsaWJwbmctMS4yLjkuCitVbmxpa2UgcG5nX3NldF9ncmF5XzFfMl80X3RvXzgoKSwgdGhlIG5ldyBmdW5jdGlvbiBkb2VzIG5vdCBleHBhbmQgdGhlCit0Uk5TIGNodW5rIHRvIGFscGhhLiBUaGUgcG5nX3NldF9ncmF5XzFfMl80X3RvXzgoKSBmdW5jdGlvbiBpcworZGVwcmVjYXRlZC4KKworQSBudW1iZXIgb2YgbWFjcm8gZGVmaW5pdGlvbnMgaW4gc3VwcG9ydCBvZiBydW50aW1lIHNlbGVjdGlvbiBvZgorYXNzZW1ibGVyIGNvZGUgZmVhdHVyZXMgKGVzcGVjaWFsbHkgSW50ZWwgTU1YIGNvZGUgc3VwcG9ydCkgd2VyZQorYWRkZWQgYXQgbGlicG5nLTEuMi4wOgorCisgICAgUE5HX0FTTV9GTEFHX01NWF9TVVBQT1JUX0NPTVBJTEVECisgICAgUE5HX0FTTV9GTEFHX01NWF9TVVBQT1JUX0lOX0NQVQorICAgIFBOR19BU01fRkxBR19NTVhfUkVBRF9DT01CSU5FX1JPVworICAgIFBOR19BU01fRkxBR19NTVhfUkVBRF9JTlRFUkxBQ0UKKyAgICBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX1NVQgorICAgIFBOR19BU01fRkxBR19NTVhfUkVBRF9GSUxURVJfVVAKKyAgICBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX0FWRworICAgIFBOR19BU01fRkxBR19NTVhfUkVBRF9GSUxURVJfUEFFVEgKKyAgICBQTkdfQVNNX0ZMQUdTX0lOSVRJQUxJWkVECisgICAgUE5HX01NWF9SRUFEX0ZMQUdTCisgICAgUE5HX01NWF9GTEFHUworICAgIFBOR19NTVhfV1JJVEVfRkxBR1MKKyAgICBQTkdfTU1YX0ZMQUdTCisKK1dlIGFkZGVkIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGluIHN1cHBvcnQgb2YgcnVudGltZQorc2VsZWN0aW9uIG9mIGFzc2VtYmxlciBjb2RlIGZlYXR1cmVzOgorCisgICAgcG5nX2dldF9tbXhfZmxhZ21hc2soKQorICAgIHBuZ19zZXRfbW14X3RocmVzaG9sZHMoKQorICAgIHBuZ19nZXRfYXNtX2ZsYWdzKCkKKyAgICBwbmdfZ2V0X21teF9iaXRkZXB0aF90aHJlc2hvbGQoKQorICAgIHBuZ19nZXRfbW14X3Jvd2J5dGVzX3RocmVzaG9sZCgpCisgICAgcG5nX3NldF9hc21fZmxhZ3MoKQorCitXZSByZXBsYWNlZCBhbGwgb2YgdGhlc2UgZnVuY3Rpb25zIHdpdGggc2ltcGxlIHN0dWJzIGluIGxpYnBuZy0xLjIuMjAsCit3aGVuIHRoZSBJbnRlbCBhc3NlbWJsZXIgY29kZSB3YXMgcmVtb3ZlZCBkdWUgdG8gYSBsaWNlbnNpbmcgaXNzdWUuCisKK1RoZXNlIG1hY3JvcyBhcmUgZGVwcmVjYXRlZDoKKworICAgIFBOR19SRUFEX1RSQU5TRk9STVNfTk9UX1NVUFBPUlRFRAorICAgIFBOR19QUk9HUkVTU0lWRV9SRUFEX05PVF9TVVBQT1JURUQKKyAgICBQTkdfTk9fU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRAorICAgIFBOR19XUklURV9UUkFOU0ZPUk1TX05PVF9TVVBQT1JURUQKKyAgICBQTkdfUkVBRF9BTkNJTExBUllfQ0hVTktTX05PVF9TVVBQT1JURUQKKyAgICBQTkdfV1JJVEVfQU5DSUxMQVJZX0NIVU5LU19OT1RfU1VQUE9SVEVECisKK1RoZXkgaGF2ZSBiZWVuIHJlcGxhY2VkLCByZXNwZWN0aXZlbHksIGJ5OgorCisgICAgUE5HX05PX1JFQURfVFJBTlNGT1JNUworICAgIFBOR19OT19QUk9HUkVTU0lWRV9SRUFECisgICAgUE5HX05PX1NFUVVFTlRJQUxfUkVBRAorICAgIFBOR19OT19XUklURV9UUkFOU0ZPUk1TCisgICAgUE5HX05PX1JFQURfQU5DSUxMQVJZX0NIVU5LUworICAgIFBOR19OT19XUklURV9BTkNJTExBUllfQ0hVTktTCisKK1BOR19NQVhfVUlOVCB3YXMgcmVwbGFjZWQgd2l0aCBQTkdfVUlOVF8zMV9NQVguICBJdCBoYXMgYmVlbgorZGVwcmVjYXRlZCBzaW5jZSBsaWJwbmctMS4wLjE2IGFuZCBsaWJwbmctMS4yLjYuCisKK1RoZSBmdW5jdGlvbgorICAgIHBuZ19jaGVja19zaWcoc2lnLCBudW0pCit3YXMgcmVwbGFjZWQgd2l0aAorICAgICFwbmdfc2lnX2NtcChzaWcsIDAsIG51bSkKK0l0IGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgbGlicG5nLTAuOTAuCisKK1RoZSBmdW5jdGlvbgorICAgIHBuZ19zZXRfZ3JheV8xXzJfNF90b184KCkKK3doaWNoIGFsc28gZXhwYW5kcyB0Uk5TIHRvIGFscGhhIHdhcyByZXBsYWNlZCB3aXRoCisgICAgcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KCkKK3doaWNoIGRvZXMgbm90LiBJdCBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIGxpYnBuZy0xLjAuMTggYW5kIDEuMi45LgorCitYLiAgQ2hhbmdlcyB0byBMaWJwbmcgZnJvbSB2ZXJzaW9uIDEuMC54LzEuMi54IHRvIDEuNC54CisKK1ByaXZhdGUgbGlicG5nIHByb3RvdHlwZXMgYW5kIG1hY3JvIGRlZmluaXRpb25zIHdlcmUgbW92ZWQgZnJvbQorcG5nLmggYW5kIHBuZ2NvbmYuaCBpbnRvIGEgbmV3IHBuZ3ByaXYuaCBoZWFkZXIgZmlsZS4KKworRnVuY3Rpb25zIHBuZ19zZXRfYmVuaWduX2Vycm9ycygpLCBwbmdfYmVuaWduX2Vycm9yKCksIGFuZAorcG5nX2NodW5rX2Jlbmlnbl9lcnJvcigpIHdlcmUgYWRkZWQuCisKK1N1cHBvcnQgZm9yIHNldHRpbmcgdGhlIG1heGltdW0gYW1vdW50IG9mIG1lbW9yeSB0aGF0IHRoZSBhcHBsaWNhdGlvbgord2lsbCBhbGxvY2F0ZSBmb3IgcmVhZGluZyBjaHVua3Mgd2FzIGFkZGVkLCBhcyBhIHNlY3VyaXR5IG1lYXN1cmUuCitUaGUgZnVuY3Rpb25zIHBuZ19zZXRfY2h1bmtfY2FjaGVfbWF4KCkgYW5kIHBuZ19nZXRfY2h1bmtfY2FjaGVfbWF4KCkKK3dlcmUgYWRkZWQgdG8gdGhlIGxpYnJhcnkuCisKK1dlIGltcGxlbWVudGVkIHN1cHBvcnQgZm9yIEkvTyBzdGF0ZXMgYnkgYWRkaW5nIHBuZ19wdHIgbWVtYmVyIGlvX3N0YXRlCithbmQgZnVuY3Rpb25zIHBuZ19nZXRfaW9fY2h1bmtfbmFtZSgpIGFuZCBwbmdfZ2V0X2lvX3N0YXRlKCkgaW4gcG5nZ2V0LmMKKworV2UgYWRkZWQgUE5HX1RSQU5TRk9STV9HUkFZX1RPX1JHQiB0byB0aGUgYXZhaWxhYmxlIGhpZ2gtbGV2ZWwKK2lucHV0IHRyYW5zZm9ybXMuCisKK0NoZWNraW5nIGZvciBhbmQgcmVwb3J0aW5nIG9mIGVycm9ycyBpbiB0aGUgSUhEUiBjaHVuayBpcyBtb3JlIHRob3JvdWdoLgorCitTdXBwb3J0IGZvciBnbG9iYWwgYXJyYXlzIHdhcyByZW1vdmVkLCB0byBpbXByb3ZlIHRocmVhZCBzYWZldHkuCisKK1NvbWUgb2Jzb2xldGUvZGVwcmVjYXRlZCBtYWNyb3MgYW5kIGZ1bmN0aW9ucyBoYXZlIGJlZW4gcmVtb3ZlZC4KKworVHlwZWNhc3RlZCBOVUxMIGRlZmluaXRpb25zIHN1Y2ggYXMKKyAgICNkZWZpbmUgcG5nX3ZvaWRwX05VTEwgICAgICAgICAgICAocG5nX3ZvaWRwKU5VTEwKK3dlcmUgZWxpbWluYXRlZC4gIElmIHlvdSB1c2VkIHRoZXNlIGluIHlvdXIgYXBwbGljYXRpb24sIGp1c3QgdXNlCitOVUxMIGluc3RlYWQuCisKK1RoZSBwbmdfc3RydWN0IGFuZCBpbmZvX3N0cnVjdCBtZW1iZXJzICJ0cmFucyIgYW5kICJ0cmFuc192YWx1ZXMiIHdlcmUKK2NoYW5nZWQgdG8gInRyYW5zX2FscGhhIiBhbmQgInRyYW5zX2NvbG9yIiwgcmVzcGVjdGl2ZWx5LgorCitUaGUgb2Jzb2xldGUsIHVudXNlZCBwbmdnY2NyZC5jIGFuZCBwbmd2Y3JkLmMgZmlsZXMgYW5kIHJlbGF0ZWQgbWFrZWZpbGVzCit3ZXJlIHJlbW92ZWQuCisKK1RoZSBQTkdfMV8wX1ggYW5kIFBOR18xXzJfWCBtYWNyb3Mgd2VyZSBlbGltaW5hdGVkLgorCitUaGUgUE5HX0xFR0FDWV9TVVBQT1JURUQgbWFjcm8gd2FzIGVsaW1pbmF0ZWQuCisKK01hbnkgV0lOMzJfV0NFICNpZmRlZnMgd2VyZSByZW1vdmVkLgorCitUaGUgZnVuY3Rpb25zIHBuZ19yZWFkX2luaXQoaW5mb19wdHIpLCBwbmdfd3JpdGVfaW5pdChpbmZvX3B0ciksCitwbmdfaW5mb19pbml0KGluZm9fcHRyKSwgcG5nX3JlYWRfZGVzdHJveSgpLCBhbmQgcG5nX3dyaXRlX2Rlc3Ryb3koKQoraGF2ZSBiZWVuIHJlbW92ZWQuICBUaGV5IGhhdmUgYmVlbiBkZXByZWNhdGVkIHNpbmNlIGxpYnBuZy0wLjk1LgorCitUaGUgcG5nX3Blcm1pdF9lbXB0eV9wbHRlKCkgd2FzIHJlbW92ZWQuIEl0IGhhcyBiZWVuIGRlcHJlY2F0ZWQKK3NpbmNlIGxpYnBuZy0xLjAuOS4gIFVzZSBwbmdfcGVybWl0X21uZ19mZWF0dXJlcygpIGluc3RlYWQuCisKK1dlIHJlbW92ZWQgdGhlIG9ic29sZXRlIHN0dWIgZnVuY3Rpb25zIHBuZ19nZXRfbW14X2ZsYWdtYXNrKCksCitwbmdfc2V0X21teF90aHJlc2hvbGRzKCksIHBuZ19nZXRfYXNtX2ZsYWdzKCksCitwbmdfZ2V0X21teF9iaXRkZXB0aF90aHJlc2hvbGQoKSwgcG5nX2dldF9tbXhfcm93Ynl0ZXNfdGhyZXNob2xkKCksCitwbmdfc2V0X2FzbV9mbGFncygpLCBhbmQgcG5nX21teF9zdXBwb3J0ZWQoKQorCitXZSByZW1vdmVkIHRoZSBvYnNvbGV0ZSBwbmdfY2hlY2tfc2lnKCksIHBuZ19tZW1jcHlfY2hlY2soKSwgYW5kCitwbmdfbWVtc2V0X2NoZWNrKCkgZnVuY3Rpb25zLiAgSW5zdGVhZCB1c2UgIXBuZ19zaWdfY21wKCksIG1lbWNweSgpLAorYW5kIG1lbXNldCgpLCByZXNwZWN0aXZlbHkuCisKK1RoZSBmdW5jdGlvbiBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCgpIHdhcyByZW1vdmVkLiBJdCBoYXMgYmVlbgorZGVwcmVjYXRlZCBzaW5jZSBsaWJwbmctMS4wLjE4IGFuZCAxLjIuOSwgd2hlbiBpdCB3YXMgcmVwbGFjZWQgd2l0aAorcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KCkgYmVjYXVzZSB0aGUgZm9ybWVyIGZ1bmN0aW9uIGFsc28KK2V4cGFuZGVkIGFueSB0Uk5TIGNodW5rIHRvIGFuIGFscGhhIGNoYW5uZWwuCisKK01hY3JvcyBmb3IgcG5nX2dldF91aW50XzE2LCBwbmdfZ2V0X3VpbnRfMzIsIGFuZCBwbmdfZ2V0X2ludF8zMgord2VyZSBhZGRlZCBhbmQgYXJlIHVzZWQgYnkgZGVmYXVsdCBpbnN0ZWFkIG9mIHRoZSBjb3JyZXNwb25kaW5nCitmdW5jdGlvbnMuIFVuZm9ydHVuYXRlbHksCitmcm9tIGxpYnBuZy0xLjQuMCB1bnRpbCAxLjQuNCwgdGhlIHBuZ19nZXRfdWludF8xNiBtYWNybyAoYnV0IG5vdCB0aGUKK2Z1bmN0aW9uKSBpbmNvcnJlY3RseSByZXR1cm5lZCBhIHZhbHVlIG9mIHR5cGUgcG5nX3VpbnRfMzIuCisKK1dlIGNoYW5nZWQgdGhlIHByb3RvdHlwZSBmb3IgcG5nX21hbGxvYygpIGZyb20KKyAgICBwbmdfbWFsbG9jKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzMyIHNpemUpCit0bworICAgIHBuZ19tYWxsb2MocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2FsbG9jX3NpemVfdCBzaXplKQorCitUaGlzIGFsc28gYXBwbGllcyB0byB0aGUgcHJvdG90eXBlIGZvciB0aGUgdXNlciByZXBsYWNlbWVudCBtYWxsb2NfZm4oKS4KKworVGhlIHBuZ19jYWxsb2MoKSBmdW5jdGlvbiB3YXMgYWRkZWQgYW5kIGlzIHVzZWQgaW4gcGxhY2Ugb2YKK29mICJwbmdfbWFsbG9jKCk7IG1lbXNldCgpOyIgZXhjZXB0IGluIHRoZSBjYXNlIGluIHBuZ19yZWFkX3BuZygpCit3aGVyZSB0aGUgYXJyYXkgY29uc2lzdHMgb2YgcG9pbnRlcnM7IGluIHRoaXMgY2FzZSBhICJmb3IiIGxvb3AgaXMgdXNlZAorYWZ0ZXIgdGhlIHBuZ19tYWxsb2MoKSB0byBzZXQgdGhlIHBvaW50ZXJzIHRvIE5VTEwsIHRvIGdpdmUgcm9idXN0LgorYmVoYXZpb3IgaW4gY2FzZSB0aGUgYXBwbGljYXRpb24gcnVucyBvdXQgb2YgbWVtb3J5IHBhcnQtd2F5IHRocm91Z2gKK3RoZSBwcm9jZXNzLgorCitXZSBjaGFuZ2VkIHRoZSBwcm90b3R5cGVzIG9mIHBuZ19nZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUoKSBhbmQKK3BuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUoKSB0byB3b3JrIHdpdGggcG5nX3NpemVfdCBpbnN0ZWFkIG9mCitwbmdfdWludF8zMi4KKworU3VwcG9ydCBmb3IgbnVtYmVyZWQgZXJyb3IgbWVzc2FnZXMgd2FzIHJlbW92ZWQgYnkgZGVmYXVsdCwgc2luY2Ugd2UKK25ldmVyIGdvdCBhcm91bmQgdG8gYWN0dWFsbHkgbnVtYmVyaW5nIHRoZSBlcnJvciBtZXNzYWdlcy4gVGhlIGZ1bmN0aW9uCitwbmdfc2V0X3N0cmlwX2Vycm9yX251bWJlcnMoKSB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBsaWJyYXJ5IGJ5IGRlZmF1bHQuCisKK1RoZSBwbmdfemFsbG9jKCkgYW5kIHBuZ196ZnJlZSgpIGZ1bmN0aW9ucyBhcmUgbm8gbG9uZ2VyIGV4cG9ydGVkLgorVGhlIHBuZ196YWxsb2MoKSBmdW5jdGlvbiBubyBsb25nZXIgemVyb2VzIG91dCB0aGUgbWVtb3J5IHRoYXQgaXQKK2FsbG9jYXRlcy4gIEFwcGxpY2F0aW9ucyB0aGF0IGNhbGxlZCBwbmdfemFsbG9jKHBuZ19wdHIsIG51bWJlciwgc2l6ZSkKK2NhbiBjYWxsIHBuZ19jYWxsb2MocG5nX3B0ciwgbnVtYmVyKnNpemUpIGluc3RlYWQsIGFuZCBjYW4gY2FsbAorcG5nX2ZyZWUoKSBpbnN0ZWFkIG9mIHBuZ196ZnJlZSgpLgorCitTdXBwb3J0IGZvciBkaXRoZXJpbmcgd2FzIGRpc2FibGVkIGJ5IGRlZmF1bHQgaW4gbGlicG5nLTEuNC4wLCBiZWNhdXNlCitpdCBoYXMgbm90IGJlZW4gd2VsbCB0ZXN0ZWQgYW5kIGRvZXNuJ3QgYWN0dWFsbHkgImRpdGhlciIuCitUaGUgY29kZSB3YXMgbm90CityZW1vdmVkLCBob3dldmVyLCBhbmQgY291bGQgYmUgZW5hYmxlZCBieSBidWlsZGluZyBsaWJwbmcgd2l0aAorUE5HX1JFQURfRElUSEVSX1NVUFBPUlRFRCBkZWZpbmVkLiAgSW4gbGlicG5nLTEuNC4yLCB0aGlzIHN1cHBvcnQKK3dhcyByZS1lbmFibGVkLCBidXQgdGhlIGZ1bmN0aW9uIHdhcyByZW5hbWVkIHBuZ19zZXRfcXVhbnRpemUoKSB0bworcmVmbGVjdCBtb3JlIGFjY3VyYXRlbHkgd2hhdCBpdCBhY3R1YWxseSBkb2VzLiAgQXQgdGhlIHNhbWUgdGltZSwKK3RoZSBQTkdfRElUSEVSX1tSRUQsR1JFRU5fQkxVRV1fQklUUyBtYWNyb3Mgd2VyZSBhbHNvIHJlbmFtZWQgdG8KK1BOR19RVUFOVElaRV9bUkVELEdSRUVOLEJMVUVdX0JJVFMsIGFuZCBQTkdfUkVBRF9ESVRIRVJfU1VQUE9SVEVECit3YXMgcmVuYW1lZCB0byBQTkdfUkVBRF9RVUFOVElaRV9TVVBQT1JURUQuCisKK1dlIHJlbW92ZWQgdGhlIHRyYWlsaW5nICcuJyBmcm9tIHRoZSB3YXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcy4KKworWEkuICBDaGFuZ2VzIHRvIExpYnBuZyBmcm9tIHZlcnNpb24gMS40LnggdG8gMS41LngKKworRnJvbSBsaWJwbmctMS40LjAgdW50aWwgMS40LjQsIHRoZSBwbmdfZ2V0X3VpbnRfMTYgbWFjcm8gKGJ1dCBub3QgdGhlCitmdW5jdGlvbikgaW5jb3JyZWN0bHkgcmV0dXJuZWQgYSB2YWx1ZSBvZiB0eXBlIHBuZ191aW50XzMyLgorVGhlIGluY29ycmVjdCBtYWNybyB3YXMgcmVtb3ZlZCBmcm9tIGxpYnBuZy0xLjQuNS4KKworQ2hlY2tpbmcgZm9yIGludmFsaWQgcGFsZXR0ZSBpbmRleCBvbiB3cml0ZSB3YXMgYWRkZWQgYXQgbGlicG5nCisxLjUuMTAuICBJZiBhIHBpeGVsIGNvbnRhaW5zIGFuIGludmFsaWQgKG91dC1vZi1yYW5nZSkgaW5kZXggbGlicG5nIGlzc3VlcworYSBiZW5pZ24gZXJyb3IuICBUaGlzIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCBiZWNhdXNlIHRoaXMgY29uZGl0aW9uIGlzIGFuCitlcnJvciBhY2NvcmRpbmcgdG8gdGhlIFBORyBzcGVjaWZpY2F0aW9uLCBDbGF1c2UgMTEuMy4yLCBidXQgdGhlIGVycm9yIGNhbgorYmUgaWdub3JlZCBpbiBlYWNoIHBuZ19wdHIgd2l0aAorCisgICBwbmdfc2V0X2NoZWNrX2Zvcl9pbnZhbGlkX2luZGV4KHBuZ19wdHIsIGFsbG93ZWQpOworCisgICAgICBhbGxvd2VkICAtIG9uZSBvZgorICAgICAgICAgICAgICAgICAwOiBkaXNhYmxlIGJlbmlnbiBlcnJvciAoYWNjZXB0IHRoZQorICAgICAgICAgICAgICAgICAgICBpbnZhbGlkIGRhdGEgd2l0aG91dCB3YXJuaW5nKS4KKyAgICAgICAgICAgICAgICAgMTogZW5hYmxlIGJlbmlnbiBlcnJvciAodHJlYXQgdGhlCisgICAgICAgICAgICAgICAgICAgIGludmFsaWQgZGF0YSBhcyBhbiBlcnJvciBvciBhCisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcpLgorCitJZiB0aGUgZXJyb3IgaXMgaWdub3JlZCwgb3IgaWYgcG5nX2Jlbmlnbl9lcnJvcigpIHRyZWF0cyBpdCBhcyBhIHdhcm5pbmcsCithbnkgaW52YWxpZCBwaXhlbHMgYXJlIGRlY29kZWQgYXMgb3BhcXVlIGJsYWNrIGJ5IHRoZSBkZWNvZGVyIGFuZCB3cml0dGVuCithcy1pcyBieSB0aGUgZW5jb2Rlci4KKworUmV0cmlldmluZyB0aGUgbWF4aW11bSBwYWxldHRlIGluZGV4IGZvdW5kIHdhcyBhZGRlZCBhdCBsaWJwbmctMS41LjE1LgorVGhpcyBzdGF0ZW1lbnQgbXVzdCBhcHBlYXIgYWZ0ZXIgcG5nX3JlYWRfcG5nKCkgb3IgcG5nX3JlYWRfaW1hZ2UoKSB3aGlsZQorcmVhZGluZywgYW5kIGFmdGVyIHBuZ193cml0ZV9wbmcoKSBvciBwbmdfd3JpdGVfaW1hZ2UoKSB3aGlsZSB3cml0aW5nLgorCisgICBpbnQgbWF4X3BhbGV0dGUgPSBwbmdfZ2V0X3BhbGV0dGVfbWF4KHBuZ19wdHIsIGluZm9fcHRyKTsKKworVGhpcyB3aWxsIHJldHVybiB0aGUgbWF4aW11bSBwYWxldHRlIGluZGV4IGZvdW5kIGluIHRoZSBpbWFnZSwgb3IgIi0xIiBpZgordGhlIHBhbGV0dGUgd2FzIG5vdCBjaGVja2VkLCBvciAiMCIgaWYgbm8gcGFsZXR0ZSB3YXMgZm91bmQuICBOb3RlIHRoYXQgdGhpcworZG9lcyBub3QgYWNjb3VudCBmb3IgYW55IHBhbGV0dGUgaW5kZXggdXNlZCBieSBhbmNpbGxhcnkgY2h1bmtzIHN1Y2ggYXMgdGhlCitiS0dEIGNodW5rOyB5b3UgbXVzdCBjaGVjayB0aG9zZSBzZXBhcmF0ZWx5IHRvIGRldGVybWluZSB0aGUgbWF4aW11bQorcGFsZXR0ZSBpbmRleCBhY3R1YWxseSB1c2VkLgorCitUaGVyZSBhcmUgbm8gc3Vic3RhbnRpYWwgQVBJIGNoYW5nZXMgYmV0d2VlbiB0aGUgbm9uLWRlcHJlY2F0ZWQgcGFydHMgb2YKK3RoZSAxLjQuNSBBUEkgYW5kIHRoZSAxLjUuMCBBUEk7IGhvd2V2ZXIsIHRoZSBhYmlsaXR5IHRvIGRpcmVjdGx5IGFjY2VzcworbWVtYmVycyBvZiB0aGUgbWFpbiBsaWJwbmcgY29udHJvbCBzdHJ1Y3R1cmVzLCBwbmdfc3RydWN0IGFuZCBwbmdfaW5mbywKK2RlcHJlY2F0ZWQgaW4gZWFybGllciB2ZXJzaW9ucyBvZiBsaWJwbmcsIGhhcyBiZWVuIGNvbXBsZXRlbHkgcmVtb3ZlZCBmcm9tCitsaWJwbmcgMS41LgorCitXZSBubyBsb25nZXIgaW5jbHVkZSB6bGliLmggaW4gcG5nLmguICBUaGUgaW5jbHVkZSBzdGF0ZW1lbnQgaGFzIGJlZW4gbW92ZWQKK3RvIHBuZ3N0cnVjdC5oLCB3aGVyZSBpdCBpcyBub3QgYWNjZXNzaWJsZSBieSBhcHBsaWNhdGlvbnMuIEFwcGxpY2F0aW9ucyB0aGF0CituZWVkIGFjY2VzcyB0byBpbmZvcm1hdGlvbiBpbiB6bGliLmggd2lsbCBuZWVkIHRvIGFkZCB0aGUgJyNpbmNsdWRlICJ6bGliLmgiJworZGlyZWN0aXZlLiAgSXQgZG9lcyBub3QgbWF0dGVyIHdoZXRoZXIgdGhpcyBpcyBwbGFjZWQgcHJpb3IgdG8gb3IgYWZ0ZXIKK3RoZSAnIiNpbmNsdWRlIHBuZy5oIicgZGlyZWN0aXZlLgorCitUaGUgcG5nX3NwcmludGYoKSwgcG5nX3N0cmNweSgpLCBhbmQgcG5nX3N0cm5jcHkoKSBtYWNyb3MgYXJlIG5vIGxvbmdlciB1c2VkCithbmQgd2VyZSByZW1vdmVkLgorCitXZSBtb3ZlZCB0aGUgcG5nX3N0cmxlbigpLCBwbmdfbWVtY3B5KCksIHBuZ19tZW1zZXQoKSwgYW5kIHBuZ19tZW1jbXAoKQorbWFjcm9zIGludG8gYSBwcml2YXRlIGhlYWRlciBmaWxlIChwbmdwcml2LmgpIHRoYXQgaXMgbm90IGFjY2Vzc2libGUgdG8KK2FwcGxpY2F0aW9ucy4KKworSW4gcG5nX2dldF9pQ0NQLCB0aGUgdHlwZSBvZiAicHJvZmlsZSIgd2FzIGNoYW5nZWQgZnJvbSBwbmdfY2hhcnBwCit0byBwbmdfYnl0ZXBwLCBhbmQgaW4gcG5nX3NldF9pQ0NQLCBmcm9tIHBuZ19jaGFycCB0byBwbmdfY29uc3RfYnl0ZXAuCisKK1RoZXJlIGFyZSBjaGFuZ2VzIG9mIGZvcm0gaW4gcG5nLmgsIGluY2x1ZGluZyBuZXcgYW5kIGNoYW5nZWQgbWFjcm9zIHRvCitkZWNsYXJlIHBhcnRzIG9mIHRoZSBBUEkuICBTb21lIEFQSSBmdW5jdGlvbnMgd2l0aCBhcmd1bWVudHMgdGhhdCBhcmUKK3BvaW50ZXJzIHRvIGRhdGEgbm90IG1vZGlmaWVkIHdpdGhpbiB0aGUgZnVuY3Rpb24gaGF2ZSBiZWVuIGNvcnJlY3RlZCB0bworZGVjbGFyZSB0aGVzZSBhcmd1bWVudHMgd2l0aCBQTkdfQ09OU1QuCisKK011Y2ggb2YgdGhlIGludGVybmFsIHVzZSBvZiBDIG1hY3JvcyB0byBjb250cm9sIHRoZSBsaWJyYXJ5IGJ1aWxkIGhhcyBhbHNvCitjaGFuZ2VkIGFuZCBzb21lIG9mIHRoaXMgaXMgdmlzaWJsZSBpbiB0aGUgZXhwb3J0ZWQgaGVhZGVyIGZpbGVzLCBpbgorcGFydGljdWxhciB0aGUgdXNlIG9mIG1hY3JvcyB0byBjb250cm9sIGRhdGEgYW5kIEFQSSBlbGVtZW50cyB2aXNpYmxlCitkdXJpbmcgYXBwbGljYXRpb24gY29tcGlsYXRpb24gbWF5IHJlcXVpcmUgc2lnbmlmaWNhbnQgcmV2aXNpb24gdG8KK2FwcGxpY2F0aW9uIGNvZGUuICAoSXQgaXMgZXh0cmVtZWx5IHJhcmUgZm9yIGFuIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuKQorCitBbnkgcHJvZ3JhbSB0aGF0IGNvbXBpbGVkIGFnYWluc3QgbGlicG5nIDEuNCBhbmQgZGlkIG5vdCB1c2UgZGVwcmVjYXRlZAorZmVhdHVyZXMgb3IgYWNjZXNzIGludGVybmFsIGxpYnJhcnkgc3RydWN0dXJlcyBzaG91bGQgY29tcGlsZSBhbmQgd29yaworYWdhaW5zdCBsaWJwbmcgMS41LCBleGNlcHQgZm9yIHRoZSBjaGFuZ2UgaW4gdGhlIHByb3RvdHlwZSBmb3IKK3BuZ19nZXRfaUNDUCgpIGFuZCBwbmdfc2V0X2lDQ1AoKSBBUEkgZnVuY3Rpb25zIG1lbnRpb25lZCBhYm92ZS4KKworbGlicG5nIDEuNS4wIGFkZHMgUE5HXyBQQVNTIG1hY3JvcyB0byBoZWxwIGluIHRoZSByZWFkaW5nIGFuZCB3cml0aW5nIG9mCitpbnRlcmxhY2VkIGltYWdlcy4gIFRoZSBtYWNyb3MgcmV0dXJuIHRoZSBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyBpbgorZWFjaCBwYXNzIGFuZCBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlLWludGVybGFjZSBhbmQgKGlmCithYnNvbHV0ZWx5IG5lY2Vzc2FyeSkgaW50ZXJsYWNlIGFuIGltYWdlLgorCitsaWJwbmcgMS41LjAgYWRkcyBhbiBBUEkgcG5nX2xvbmdqbXAocG5nX3B0ciwgdmFsdWUpLiAgVGhpcyBBUEkgY2FsbHMKK3RoZSBhcHBsaWNhdGlvbi1wcm92aWRlZCBwbmdfbG9uZ2ptcF9wdHIgb24gdGhlIGludGVybmFsLCBidXQgYXBwbGljYXRpb24KK2luaXRpYWxpemVkLCBsb25nam1wIGJ1ZmZlci4gIEl0IGlzIHByb3ZpZGVkIGFzIGEgY29udmVuaWVuY2UgdG8gYXZvaWQKK3RoZSBuZWVkIHRvIHVzZSB0aGUgcG5nX2ptcGJ1ZiBtYWNybywgd2hpY2ggaGFkIHRoZSB1bm5lY2Vzc2FyeSBzaWRlCitlZmZlY3Qgb2YgcmVzZXR0aW5nIHRoZSBpbnRlcm5hbCBwbmdfbG9uZ2ptcF9wdHIgdmFsdWUuCisKK2xpYnBuZyAxLjUuMCBpbmNsdWRlcyBhIGNvbXBsZXRlIGZpeGVkIHBvaW50IEFQSS4gIEJ5IGRlZmF1bHQgdGhpcyBpcworcHJlc2VudCBhbG9uZyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGZsb2F0aW5nIHBvaW50IEFQSS4gIEluIGdlbmVyYWwgdGhlCitmaXhlZCBwb2ludCBBUEkgaXMgZmFzdGVyIGFuZCBzbWFsbGVyIHRoYW4gdGhlIGZsb2F0aW5nIHBvaW50IG9uZSBiZWNhdXNlCit0aGUgUE5HIGZpbGUgZm9ybWF0IHVzZWQgZml4ZWQgcG9pbnQsIG5vdCBmbG9hdGluZyBwb2ludC4gIFRoaXMgYXBwbGllcworZXZlbiBpZiB0aGUgbGlicmFyeSB1c2VzIGZsb2F0aW5nIHBvaW50IGluIGludGVybmFsIGNhbGN1bGF0aW9ucy4gIEEgbmV3CittYWNybywgUE5HX0ZMT0FUSU5HX0FSSVRITUVUSUNfU1VQUE9SVEVELCByZXZlYWxzIHdoZXRoZXIgdGhlIGxpYnJhcnkKK3VzZXMgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYyAodGhlIGRlZmF1bHQpIG9yIGZpeGVkIHBvaW50IGFyaXRobWV0aWMKK2ludGVybmFsbHkgZm9yIHBlcmZvcm1hbmNlIGNyaXRpY2FsIGNhbGN1bGF0aW9ucyBzdWNoIGFzIGdhbW1hIGNvcnJlY3Rpb24uCitJbiBzb21lIGNhc2VzLCB0aGUgZ2FtbWEgY2FsY3VsYXRpb25zIG1heSBwcm9kdWNlIHNsaWdodGx5IGRpZmZlcmVudAorcmVzdWx0cy4gIFRoaXMgaGFzIGNoYW5nZWQgdGhlIHJlc3VsdHMgaW4gcG5nX3JnYl90b19ncmF5IGFuZCBpbiBhbHBoYQorY29tcG9zaXRpb24gKHBuZ19zZXRfYmFja2dyb3VuZCBmb3IgZXhhbXBsZSkuIFRoaXMgYXBwbGllcyBldmVuIGlmIHRoZQorb3JpZ2luYWwgaW1hZ2Ugd2FzIGFscmVhZHkgbGluZWFyIChnYW1tYSA9PSAxLjApIGFuZCwgdGhlcmVmb3JlLCBpdCBpcworbm90IG5lY2Vzc2FyeSB0byBsaW5lYXJpemUgdGhlIGltYWdlLiAgVGhpcyBpcyBiZWNhdXNlIGxpYnBuZyBoYXMgKm5vdCoKK2JlZW4gY2hhbmdlZCB0byBvcHRpbWl6ZSB0aGF0IGNhc2UgY29ycmVjdGx5LCB5ZXQuCisKK0ZpeGVkIHBvaW50IHN1cHBvcnQgZm9yIHRoZSBzQ0FMIGNodW5rIGNvbWVzIHdpdGggYW4gaW1wb3J0YW50IGNhdmVhdDsKK3RoZSBzQ0FMIHNwZWNpZmljYXRpb24gdXNlcyBhIGRlY2ltYWwgZW5jb2Rpbmcgb2YgZmxvYXRpbmcgcG9pbnQgdmFsdWVzCithbmQgdGhlIGFjY3VyYWN5IG9mIFBORyBmaXhlZCBwb2ludCB2YWx1ZXMgaXMgaW5zdWZmaWNpZW50IGZvcgorcmVwcmVzZW50YXRpb24gb2YgdGhlc2UgdmFsdWVzLiBDb25zZXF1ZW50bHkgYSAic3RyaW5nIiBBUEkKKyhwbmdfZ2V0X3NDQUxfcyBhbmQgcG5nX3NldF9zQ0FMX3MpIGlzIHRoZSBvbmx5IHJlbGlhYmxlIHdheSBvZiByZWFkaW5nCithcmJpdHJhcnkgc0NBTCBjaHVua3MgaW4gdGhlIGFic2VuY2Ugb2YgZWl0aGVyIHRoZSBmbG9hdGluZyBwb2ludCBBUEkgb3IKK2ludGVybmFsIGZsb2F0aW5nIHBvaW50IGNhbGN1bGF0aW9ucy4gIFN0YXJ0aW5nIHdpdGggbGlicG5nLTEuNS4wLCBib3RoCitvZiB0aGVzZSBmdW5jdGlvbnMgYXJlIHByZXNlbnQgd2hlbiBQTkdfc0NBTF9TVVBQT1JURUQgaXMgZGVmaW5lZC4gIFByaW9yCit0byBsaWJwbmctMS41LjAsIHRoZWlyIHByZXNlbmNlIGFsc28gZGVwZW5kZWQgdXBvbiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECitiZWluZyBkZWZpbmVkIGFuZCBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEIG5vdCBiZWluZyBkZWZpbmVkLgorCitBcHBsaWNhdGlvbnMgbm8gbG9uZ2VyIG5lZWQgdG8gaW5jbHVkZSB0aGUgb3B0aW9uYWwgZGlzdHJpYnV0aW9uIGhlYWRlcgorZmlsZSBwbmd1c3IuaCBvciBkZWZpbmUgdGhlIGNvcnJlc3BvbmRpbmcgbWFjcm9zIGR1cmluZyBhcHBsaWNhdGlvbgorYnVpbGQgaW4gb3JkZXIgdG8gc2VlIHRoZSBjb3JyZWN0IHZhcmlhbnQgb2YgdGhlIGxpYnBuZyBBUEkuICBGcm9tIDEuNS4wCithcHBsaWNhdGlvbiBjb2RlIGNhbiBjaGVjayBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgX1NVUFBPUlRFRCBtYWNybzoKKworI2lmZGVmIFBOR19JTkNIX0NPTlZFUlNJT05TX1NVUFBPUlRFRAorICAgLyogY29kZSB0aGF0IHVzZXMgdGhlIGluY2ggY29udmVyc2lvbiBBUElzLiAqLworI2VuZGlmCisKK1RoaXMgbWFjcm8gd2lsbCBvbmx5IGJlIGRlZmluZWQgaWYgdGhlIGluY2ggY29udmVyc2lvbiBmdW5jdGlvbnMgaGF2ZSBiZWVuCitjb21waWxlZCBpbnRvIGxpYnBuZy4gIFRoZSBmdWxsIHNldCBvZiBtYWNyb3MsIGFuZCB3aGV0aGVyIG9yIG5vdCBzdXBwb3J0CitoYXMgYmVlbiBjb21waWxlZCBpbiwgYXJlIGF2YWlsYWJsZSBpbiB0aGUgaGVhZGVyIGZpbGUgcG5nbGliY29uZi5oLgorVGhpcyBoZWFkZXIgZmlsZSBpcyBzcGVjaWZpYyB0byB0aGUgbGlicG5nIGJ1aWxkLiAgTm90aWNlIHRoYXQgcHJpb3IgdG8KKzEuNS4wIHRoZSBfU1VQUE9SVEVEIG1hY3JvcyB3b3VsZCBhbHdheXMgaGF2ZSB0aGUgZGVmYXVsdCBkZWZpbml0aW9uIHVubGVzcworcmVzZXQgYnkgcG5ndXNyLmggb3IgYnkgZXhwbGljaXQgc2V0dGluZ3Mgb24gdGhlIGNvbXBpbGVyIGNvbW1hbmQgbGluZS4KK1RoZXNlIHNldHRpbmdzIG1heSBwcm9kdWNlIGNvbXBpbGVyIHdhcm5pbmdzIG9yIGVycm9ycyBpbiAxLjUuMCBiZWNhdXNlCitvZiBtYWNybyByZWRlZmluaXRpb24uCisKK0FwcGxpY2F0aW9ucyBjYW4gbm93IGNob29zZSB3aGV0aGVyIHRvIHVzZSB0aGVzZSBtYWNyb3Mgb3IgdG8gY2FsbCB0aGUKK2NvcnJlc3BvbmRpbmcgZnVuY3Rpb24gYnkgZGVmaW5pbmcgUE5HX1VTRV9SRUFEX01BQ1JPUyBvcgorUE5HX05PX1VTRV9SRUFEX01BQ1JPUyBiZWZvcmUgaW5jbHVkaW5nIHBuZy5oLiAgTm90aWNlIHRoYXQgdGhpcyBpcworb25seSBzdXBwb3J0ZWQgZnJvbSAxLjUuMDsgZGVmaW5pbmcgUE5HX05PX1VTRV9SRUFEX01BQ1JPUyBwcmlvciB0byAxLjUuMAord2lsbCBsZWFkIHRvIGEgbGluayBmYWlsdXJlLgorCitQcmlvciB0byBsaWJwbmctMS41LjQsIHRoZSB6bGliIGNvbXByZXNzb3IgdXNlZCB0aGUgc2FtZSBzZXQgb2YgcGFyYW1ldGVycword2hlbiBjb21wcmVzc2luZyB0aGUgSURBVCBkYXRhIGFuZCB0ZXh0dWFsIGRhdGEgc3VjaCBhcyB6VFh0IGFuZCBpQ0NQLgorSW4gbGlicG5nLTEuNS40IHdlIHJlaW5pdGlhbGl6ZWQgdGhlIHpsaWIgc3RyZWFtIGZvciBlYWNoIHR5cGUgb2YgZGF0YS4KK1dlIGFkZGVkIGZpdmUgcG5nX3NldF90ZXh0XyooKSBmdW5jdGlvbnMgZm9yIHNldHRpbmcgdGhlIHBhcmFtZXRlcnMgdG8KK3VzZSB3aXRoIHRleHR1YWwgZGF0YS4KKworUHJpb3IgdG8gbGlicG5nLTEuNS40LCB0aGUgUE5HX1JFQURfMTZfVE9fOF9BQ0NVUkFURV9TQ0FMRV9TVVBQT1JURUQKK29wdGlvbiB3YXMgb2ZmIGJ5IGRlZmF1bHQsIGFuZCBzbGlnaHRseSBpbmFjY3VyYXRlIHNjYWxpbmcgb2NjdXJyZWQuCitUaGlzIG9wdGlvbiBjYW4gbm8gbG9uZ2VyIGJlIHR1cm5lZCBvZmYsIGFuZCB0aGUgY2hvaWNlIG9mIGFjY3VyYXRlCitvciBpbmFjY3VyYXRlIDE2LXRvLTggc2NhbGluZyBpcyBieSB1c2luZyB0aGUgbmV3IHBuZ19zZXRfc2NhbGVfMTZfdG9fOCgpCitBUEkgZm9yIGFjY3VyYXRlIHNjYWxpbmcgb3IgdGhlIG9sZCBwbmdfc2V0X3N0cmlwXzE2X3RvXzgoKSBBUEkgZm9yIHNpbXBsZQorY2hvcHBpbmcuICBJbiBsaWJwbmctMS41LjQsIHRoZSBQTkdfUkVBRF8xNl9UT184X0FDQ1VSQVRFX1NDQUxFX1NVUFBPUlRFRAorbWFjcm8gYmVjYW1lIFBOR19SRUFEX1NDQUxFXzE2X1RPXzhfU1VQUE9SVEVELCBhbmQgdGhlIFBOR19SRUFEXzE2X1RPXzgKK21hY3JvIGJlY2FtZSBQTkdfUkVBRF9TVFJJUF8xNl9UT184X1NVUFBPUlRFRCwgdG8gZW5hYmxlIHRoZSB0d28KK3BuZ19zZXRfKl8xNl90b184KCkgZnVuY3Rpb25zIHNlcGFyYXRlbHkuCisKK1ByaW9yIHRvIGxpYnBuZy0xLjUuNCwgdGhlIHBuZ19zZXRfdXNlcl9saW1pdHMoKSBmdW5jdGlvbiBjb3VsZCBvbmx5IGJlCit1c2VkIHRvIHJlZHVjZSB0aGUgd2lkdGggYW5kIGhlaWdodCBsaW1pdHMgZnJvbSB0aGUgdmFsdWUgb2YKK1BOR19VU0VSX1dJRFRIX01BWCBhbmQgUE5HX1VTRVJfSEVJR0hUX01BWCwgYWx0aG91Z2ggdGhpcyBkb2N1bWVudCBzYWlkCit0aGF0IGl0IGNvdWxkIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlbS4gIE5vdyB0aGlzIGZ1bmN0aW9uIHdpbGwgcmVkdWNlIG9yCitpbmNyZWFzZSB0aGUgbGltaXRzLgorCitTdGFydGluZyBpbiBsaWJwbmctMS41LjEwLCB0aGUgdXNlciBsaW1pdHMgY2FuIGJlIHNldCBlbiBtYXNzZSB3aXRoIHRoZQorY29uZmlndXJhdGlvbiBvcHRpb24gUE5HX1NBRkVfTElNSVRTX1NVUFBPUlRFRC4gIElmIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQsCithIHNldCBvZiAic2FmZSIgbGltaXRzIGlzIGFwcGxpZWQgaW4gcG5ncHJpdi5oLiAgVGhlc2UgY2FuIGJlIG92ZXJyaWRkZW4gYnkKK2FwcGxpY2F0aW9uIGNhbGxzIHRvIHBuZ19zZXRfdXNlcl9saW1pdHMoKSwgcG5nX3NldF91c2VyX2NodW5rX2NhY2hlX21heCgpLAorYW5kL29yIHBuZ19zZXRfdXNlcl9tYWxsb2NfbWF4KCkgdGhhdCBpbmNyZWFzZSBvciBkZWNyZWFzZSB0aGUgbGltaXRzLiAgQWxzbywKK2luIGxpYnBuZy0xLjUuMTAgdGhlIGRlZmF1bHQgd2lkdGggYW5kIGhlaWdodCBsaW1pdHMgd2VyZSBpbmNyZWFzZWQKK2Zyb20gMSwwMDAsMDAwIHRvIDB4N2ZmZmZmZmYgKGkuZS4sIG1hZGUgdW5saW1pdGVkKS4gIFRoZXJlZm9yZSwgdGhlCitsaW1pdHMgYXJlIG5vdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgICAgICBzYWZlCisgICBwbmdfdXNlcl93aWR0aF9tYXggICAgICAgIDB4N2ZmZmZmZmYgICAgMSwwMDAsMDAwCisgICBwbmdfdXNlcl9oZWlnaHRfbWF4ICAgICAgIDB4N2ZmZmZmZmYgICAgMSwwMDAsMDAwCisgICBwbmdfdXNlcl9jaHVua19jYWNoZV9tYXggIDAgKHVubGltaXRlZCkgICAxMjgKKyAgIHBuZ191c2VyX2NodW5rX21hbGxvY19tYXggMCAodW5saW1pdGVkKSA4LDAwMCwwMDAKKworVGhlIHBuZ19zZXRfb3B0aW9uKCkgZnVuY3Rpb24gKGFuZCB0aGUgIm9wdGlvbnMiIG1lbWJlciBvZiB0aGUgcG5nIHN0cnVjdCkgd2FzCithZGRlZCB0byBsaWJwbmctMS41LjE1LCB3aXRoIG9wdGlvbiBQTkdfQVJNX05FT04uCisKK1RoZSBsaWJyYXJ5IG5vdyBzdXBwb3J0cyBhIGNvbXBsZXRlIGZpeGVkIHBvaW50IGltcGxlbWVudGF0aW9uIGFuZCBjYW4KK3RodXMgYmUgdXNlZCBvbiBzeXN0ZW1zIHRoYXQgaGF2ZSBubyBmbG9hdGluZyBwb2ludCBzdXBwb3J0IG9yIHZlcnkKK2xpbWl0ZWQgb3Igc2xvdyBzdXBwb3J0LiAgUHJldmlvdXNseSBnYW1tYSBjb3JyZWN0aW9uLCBhbiBlc3NlbnRpYWwgcGFydAorb2YgY29tcGxldGUgUE5HIHN1cHBvcnQsIHJlcXVpcmVkIHJlYXNvbmFibHkgZmFzdCBmbG9hdGluZyBwb2ludC4KKworQXMgcGFydCBvZiB0aGlzIHRoZSBjaG9pY2Ugb2YgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gaGFzIGJlZW4gbWFkZQoraW5kZXBlbmRlbnQgb2YgdGhlIGNob2ljZSBvZiBmaXhlZCB2ZXJzdXMgZmxvYXRpbmcgcG9pbnQgQVBJcyBhbmQgYWxsIHRoZQorbWlzc2luZyBmaXhlZCBwb2ludCBBUElzIGhhdmUgYmVlbiBpbXBsZW1lbnRlZC4KKworVGhlIGV4YWN0IG1lY2hhbmlzbSB1c2VkIHRvIGNvbnRyb2wgYXR0cmlidXRlcyBvZiBBUEkgZnVuY3Rpb25zIGhhcworY2hhbmdlZCwgYXMgZGVzY3JpYmVkIGluIHRoZSBJTlNUQUxMIGZpbGUuCisKK0EgbmV3IHRlc3QgcHJvZ3JhbSwgcG5ndmFsaWQsIGlzIHByb3ZpZGVkIGluIGFkZGl0aW9uIHRvIHBuZ3Rlc3QuCitwbmd2YWxpZCB2YWxpZGF0ZXMgdGhlIGFyaXRobWV0aWMgYWNjdXJhY3kgb2YgdGhlIGdhbW1hIGNvcnJlY3Rpb24KK2NhbGN1bGF0aW9ucyBhbmQgaW5jbHVkZXMgYSBudW1iZXIgb2YgdmFsaWRhdGlvbnMgb2YgdGhlIGZpbGUgZm9ybWF0LgorQSBzdWJzZXQgb2YgdGhlIGZ1bGwgcmFuZ2Ugb2YgdGVzdHMgaXMgcnVuIHdoZW4gIm1ha2UgY2hlY2siIGlzIGRvbmUKKyhpbiB0aGUgJ2NvbmZpZ3VyZScgYnVpbGQuKSAgcG5ndmFsaWQgYWxzbyBhbGxvd3MgdG90YWwgYWxsb2NhdGVkIG1lbW9yeQordXNhZ2UgdG8gYmUgZXZhbHVhdGVkIGFuZCBwZXJmb3JtcyBhZGRpdGlvbmFsIG1lbW9yeSBvdmVyd3JpdGUgdmFsaWRhdGlvbi4KKworTWFueSBjaGFuZ2VzIHRvIGluZGl2aWR1YWwgZmVhdHVyZSBtYWNyb3MgaGF2ZSBiZWVuIG1hZGUuIFRoZSBmb2xsb3dpbmcKK2FyZSB0aGUgY2hhbmdlcyBtb3N0IGxpa2VseSB0byBiZSBub3RpY2VkIGJ5IGxpYnJhcnkgYnVpbGRlcnMgd2hvCitjb25maWd1cmUgbGlicG5nOgorCisxKSBBbGwgZmVhdHVyZSBtYWNyb3Mgbm93IGhhdmUgY29uc2lzdGVudCBuYW1pbmc6CisKKyNkZWZpbmUgUE5HX05PX2ZlYXR1cmUgdHVybnMgdGhlIGZlYXR1cmUgb2ZmCisjZGVmaW5lIFBOR19mZWF0dXJlX1NVUFBPUlRFRCB0dXJucyB0aGUgZmVhdHVyZSBvbgorCitwbmdsaWJjb25mLmggY29udGFpbnMgb25lIGxpbmUgZm9yIGVhY2ggZmVhdHVyZSBtYWNybyB3aGljaCBpcyBlaXRoZXI6CisKKyNkZWZpbmUgUE5HX2ZlYXR1cmVfU1VQUE9SVEVECisKK2lmIHRoZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBvcjoKKworLyojdW5kZWYgUE5HX2ZlYXR1cmVfU1VQUE9SVEVEKi8KKworaWYgaXQgaXMgbm90LiAgTGlicmFyeSBjb2RlIGNvbnNpc3RlbnRseSBjaGVja3MgZm9yIHRoZSAnU1VQUE9SVEVEJyBtYWNyby4KK0l0IGRvZXMgbm90LCBhbmQgbGlicG5nIGFwcGxpY2F0aW9ucyBzaG91bGQgbm90LCBjaGVjayBmb3IgdGhlICdOTycgbWFjcm8KK3doaWNoIHdpbGwgbm90IG5vcm1hbGx5IGJlIGRlZmluZWQgZXZlbiBpZiB0aGUgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkLgorVGhlICdOTycgbWFjcm9zIGFyZSBvbmx5IHVzZWQgaW50ZXJuYWxseSBmb3Igc2V0dGluZyBvciBub3Qgc2V0dGluZyB0aGUKK2NvcnJlc3BvbmRpbmcgJ1NVUFBPUlRFRCcgbWFjcm9zLgorCitDb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZCBuYW1lcyBpcyBwcm92aWRlZCBhcyBmb2xsb3dzOgorCitQTkdfSU5DSF9DT05WRVJTSU9OUyB0dXJucyBvbiBQTkdfSU5DSF9DT05WRVJTSU9OU19TVVBQT1JURUQKKworQW5kIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgZGlzYWJsZSB0aGUgY29ycmVzcG9uZGluZyBmZWF0dXJlOgorCitQTkdfU0VUSk1QX05PVF9TVVBQT1JURUQgZGlzYWJsZXMgU0VUSk1QCitQTkdfUkVBRF9UUkFOU0ZPUk1TX05PVF9TVVBQT1JURUQgZGlzYWJsZXMgUkVBRF9UUkFOU0ZPUk1TCitQTkdfTk9fUkVBRF9DT01QT1NJVEVEX05PRElWIGRpc2FibGVzIFJFQURfQ09NUE9TSVRFX05PRElWCitQTkdfV1JJVEVfVFJBTlNGT1JNU19OT1RfU1VQUE9SVEVEIGRpc2FibGVzIFdSSVRFX1RSQU5TRk9STVMKK1BOR19SRUFEX0FOQ0lMTEFSWV9DSFVOS1NfTk9UX1NVUFBPUlRFRCBkaXNhYmxlcyBSRUFEX0FOQ0lMTEFSWV9DSFVOS1MKK1BOR19XUklURV9BTkNJTExBUllfQ0hVTktTX05PVF9TVVBQT1JURUQgZGlzYWJsZXMgV1JJVEVfQU5DSUxMQVJZX0NIVU5LUworCitMaWJyYXJ5IGJ1aWxkZXJzIHNob3VsZCByZW1vdmUgdXNlIG9mIHRoZSBhYm92ZSwgaW5jb25zaXN0ZW50LCBuYW1lcy4KKworMikgV2FybmluZyBhbmQgZXJyb3IgbWVzc2FnZSBmb3JtYXR0aW5nIHdhcyBwcmV2aW91c2x5IGNvbmRpdGlvbmFsIG9uCit0aGUgU1RESU8gZmVhdHVyZS4gVGhlIGxpYnJhcnkgaGFzIGJlZW4gY2hhbmdlZCB0byB1c2UgdGhlCitDT05TT0xFX0lPIGZlYXR1cmUgaW5zdGVhZC4gVGhpcyBtZWFucyB0aGF0IGlmIENPTlNPTEVfSU8gaXMgZGlzYWJsZWQKK3RoZSBsaWJyYXJ5IG5vIGxvbmdlciB1c2VzIHRoZSBwcmludGYoMykgZnVuY3Rpb25zLCBldmVuIHRob3VnaCB0aGUKK2RlZmF1bHQgcmVhZC93cml0ZSBpbXBsZW1lbnRhdGlvbnMgdXNlIChGSUxFKSBzdHlsZSBzdGRpby5oIGZ1bmN0aW9ucy4KKworMykgVGhyZWUgZmVhdHVyZSBtYWNyb3Mgbm93IGNvbnRyb2wgdGhlIGZpeGVkL2Zsb2F0aW5nIHBvaW50IGRlY2lzaW9uczoKKworUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCBlbmFibGVzIHRoZSBmbG9hdGluZyBwb2ludCBBUElzCisKK1BOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQgZW5hYmxlcyB0aGUgZml4ZWQgcG9pbnQgQVBJczsgaG93ZXZlciwgaW4KK3ByYWN0aWNlIHRoZXNlIGFyZSBub3JtYWxseSByZXF1aXJlZCBpbnRlcm5hbGx5IGFueXdheSAoYmVjYXVzZSB0aGUgUE5HCitmaWxlIGZvcm1hdCBpcyBmaXhlZCBwb2ludCksIHRoZXJlZm9yZSBpbiBtb3N0IGNhc2VzIFBOR19OT19GSVhFRF9QT0lOVAorbWVyZWx5IHN0b3BzIHRoZSBmdW5jdGlvbiBmcm9tIGJlaW5nIGV4cG9ydGVkLgorCitQTkdfRkxPQVRJTkdfQVJJVEhNRVRJQ19TVVBQT1JURUQgY2hvb3NlcyBiZXR3ZWVuIHRoZSBpbnRlcm5hbCBmbG9hdGluZworcG9pbnQgaW1wbGVtZW50YXRpb24gb3IgdGhlIGZpeGVkIHBvaW50IG9uZS4gIFR5cGljYWxseSB0aGUgZml4ZWQgcG9pbnQKK2ltcGxlbWVudGF0aW9uIGlzIGxhcmdlciBhbmQgc2xvd2VyIHRoYW4gdGhlIGZsb2F0aW5nIHBvaW50IGltcGxlbWVudGF0aW9uCitvbiBhIHN5c3RlbSB0aGF0IHN1cHBvcnRzIGZsb2F0aW5nIHBvaW50OyBob3dldmVyLCBpdCBtYXkgYmUgZmFzdGVyIG9uIGEKK3N5c3RlbSB3aGljaCBsYWNrcyBmbG9hdGluZyBwb2ludCBoYXJkd2FyZSBhbmQgdGhlcmVmb3JlIHVzZXMgYSBzb2Z0d2FyZQorZW11bGF0aW9uLgorCis0KSBBZGRlZCBQTkdfe1JFQUQsV1JJVEV9X0lOVF9GVU5DVElPTlNfU1VQUE9SVEVELiAgVGhpcyBhbGxvd3MgdGhlCitmdW5jdGlvbnMgdG8gcmVhZCBhbmQgd3JpdGUgaW50cyB0byBiZSBkaXNhYmxlZCBpbmRlcGVuZGVudGx5IG9mCitQTkdfVVNFX1JFQURfTUFDUk9TLCB3aGljaCBhbGxvd3MgbGlicG5nIHRvIGJlIGJ1aWx0IHdpdGggdGhlIGZ1bmN0aW9ucworZXZlbiB0aG91Z2ggdGhlIGRlZmF1bHQgaXMgdG8gdXNlIHRoZSBtYWNyb3MgLSB0aGlzIGFsbG93cyBhcHBsaWNhdGlvbnMKK3RvIGNob29zZSBhdCBhcHAgYnVpbGR0aW1lIHdoZXRoZXIgb3Igbm90IHRvIHVzZSBtYWNyb3MgKHByZXZpb3VzbHkKK2ltcG9zc2libGUgYmVjYXVzZSB0aGUgZnVuY3Rpb25zIHdlcmVuJ3QgaW4gdGhlIGRlZmF1bHQgYnVpbGQuKQorCitYSUkuICBDaGFuZ2VzIHRvIExpYnBuZyBmcm9tIHZlcnNpb24gMS41LnggdG8gMS42LngKKworQSAic2ltcGxpZmllZCBBUEkiIGhhcyBiZWVuIGFkZGVkIChzZWUgZG9jdW1lbnRhdGlvbiBpbiBwbmcuaCBhbmQgYSBzaW1wbGUKK2V4YW1wbGUgaW4gY29udHJpYi9leGFtcGxlcy9wbmd0b3BuZy5jKS4gIFRoZSBuZXcgcHVibGljbHkgdmlzaWJsZSBBUEkKK2luY2x1ZGVzIHRoZSBmb2xsb3dpbmc6CisKKyAgIG1hY3JvczoKKyAgICAgUE5HX0ZPUk1BVF8qCisgICAgIFBOR19JTUFHRV8qCisgICBzdHJ1Y3R1cmVzOgorICAgICBwbmdfY29udHJvbAorICAgICBwbmdfaW1hZ2UKKyAgIHJlYWQgZnVuY3Rpb25zCisgICAgIHBuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fZmlsZSgpCisgICAgIHBuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fc3RkaW8oKQorICAgICBwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX21lbW9yeSgpCisgICAgIHBuZ19pbWFnZV9maW5pc2hfcmVhZCgpCisgICAgIHBuZ19pbWFnZV9mcmVlKCkKKyAgIHdyaXRlIGZ1bmN0aW9ucworICAgICBwbmdfaW1hZ2Vfd3JpdGVfdG9fZmlsZSgpCisgICAgIHBuZ19pbWFnZV93cml0ZV90b19zdGRpbygpCisKK1N0YXJ0aW5nIHdpdGggbGlicG5nLTEuNi4wLCB5b3UgY2FuIGNvbmZpZ3VyZSBsaWJwbmcgdG8gcHJlZml4IGFsbCBleHBvcnRlZAorc3ltYm9scywgdXNpbmcgdGhlIFBOR19QUkVGSVggbWFjcm8uCisKK1dlIG5vIGxvbmdlciBpbmNsdWRlIHN0cmluZy5oIGluIHBuZy5oLiAgVGhlIGluY2x1ZGUgc3RhdGVtZW50IGhhcyBiZWVuIG1vdmVkCit0byBwbmdwcml2LmgsIHdoZXJlIGl0IGlzIG5vdCBhY2Nlc3NpYmxlIGJ5IGFwcGxpY2F0aW9ucy4gIEFwcGxpY2F0aW9ucyB0aGF0CituZWVkIGFjY2VzcyB0byBpbmZvcm1hdGlvbiBpbiBzdHJpbmcuaCBtdXN0IGFkZCBhbiAnI2luY2x1ZGUgPHN0cmluZy5oPicKK2RpcmVjdGl2ZS4gIEl0IGRvZXMgbm90IG1hdHRlciB3aGV0aGVyIHRoaXMgaXMgcGxhY2VkIHByaW9yIHRvIG9yIGFmdGVyCit0aGUgJyNpbmNsdWRlICJwbmcuaCInIGRpcmVjdGl2ZS4KKworVGhlIGZvbGxvd2luZyBBUEkgYXJlIG5vdyBERVBSRUNBVEVEOgorICAgcG5nX2luZm9faW5pdF8zKCkKKyAgIHBuZ19jb252ZXJ0X3RvX3JmYzExMjMoKSB3aGljaCBoYXMgYmVlbiByZXBsYWNlZAorICAgICB3aXRoIHBuZ19jb252ZXJ0X3RvX3JmYzExMjNfYnVmZmVyKCkKKyAgIHBuZ19tYWxsb2NfZGVmYXVsdCgpCisgICBwbmdfZnJlZV9kZWZhdWx0KCkKKyAgIHBuZ19yZXNldF96c3RyZWFtKCkKKworVGhlIGZvbGxvd2luZyBoYXZlIGJlZW4gcmVtb3ZlZDoKKyAgIHBuZ19nZXRfaW9fY2h1bmtfbmFtZSgpLCB3aGljaCBoYXMgYmVlbiByZXBsYWNlZAorICAgICB3aXRoIHBuZ19nZXRfaW9fY2h1bmtfdHlwZSgpLiAgVGhlIG5ldworICAgICBmdW5jdGlvbiByZXR1cm5zIGEgMzItYml0IGludGVnZXIgaW5zdGVhZCBvZgorICAgICBhIHN0cmluZy4KKyAgIFRoZSBwbmdfc2l6ZW9mKCksIHBuZ19zdHJsZW4oKSwgcG5nX21lbWNweSgpLCBwbmdfbWVtY21wKCksIGFuZAorICAgICBwbmdfbWVtc2V0KCkgbWFjcm9zIGFyZSBubyBsb25nZXIgdXNlZCBpbiB0aGUgbGlicG5nIHNvdXJjZXMgYW5kCisgICAgIGhhdmUgYmVlbiByZW1vdmVkLiAgVGhlc2UgaGFkIGFscmVhZHkgYmVlbiBtYWRlIGludmlzaWJsZSB0byBhcHBsaWNhdGlvbnMKKyAgICAgKGkuZS4sIGRlZmluZWQgaW4gdGhlIHByaXZhdGUgcG5ncHJpdi5oIGhlYWRlciBmaWxlKSBzaW5jZSBsaWJwbmctMS41LjAuCisKK1RoZSBzaWduYXR1cmVzIG9mIG1hbnkgZXhwb3J0ZWQgZnVuY3Rpb25zIHdlcmUgY2hhbmdlZCwgc3VjaCB0aGF0CisgICBwbmdfc3RydWN0cCBiZWNhbWUgcG5nX3N0cnVjdHJwIG9yIHBuZ19jb25zdF9zdHJ1Y3RycAorICAgcG5nX2luZm9wIGJlY2FtZSBwbmdfaW5mb3JwIG9yIHBuZ19jb25zdF9pbmZvcnAKK3doZXJlICJycCIgaW5kaWNhdGVzIGEgInJlc3RyaWN0ZWQgcG9pbnRlciIuCisKK0Ryb3BwZWQgc3VwcG9ydCBmb3IgMTYtYml0IHBsYXRmb3Jtcy4gVGhlIHN1cHBvcnQgZm9yIEZBUi9mYXIgdHlwZXMgaGFzCitiZWVuIGVsaW1pbmF0ZWQgYW5kIHRoZSBkZWZpbml0aW9uIG9mIHBuZ19hbGxvY19zaXplX3QgaXMgbm93IGNvbnRyb2xsZWQKK2J5IGEgZmxhZyBzbyB0aGF0ICdzbWFsbCBzaXplX3QnIHN5c3RlbXMgY2FuIHNlbGVjdCBpdCBpZiBuZWNlc3NhcnkuCisKK0Vycm9yIGRldGVjdGlvbiBpbiBzb21lIGNodW5rcyBoYXMgaW1wcm92ZWQ7IGluIHBhcnRpY3VsYXIgdGhlIGlDQ1AgY2h1bmsKK3JlYWRlciBub3cgZG9lcyBwcmV0dHkgY29tcGxldGUgdmFsaWRhdGlvbiBvZiB0aGUgYmFzaWMgZm9ybWF0LiAgU29tZSBiYWQKK3Byb2ZpbGVzIHRoYXQgd2VyZSBwcmV2aW91c2x5IGFjY2VwdGVkIGFyZSBub3cgYWNjZXB0ZWQgd2l0aCBhIHdhcm5pbmcgb3IKK3JlamVjdGVkLCBkZXBlbmRpbmcgdXBvbiB0aGUgcG5nX3NldF9iZW5pZ25fZXJyb3JzKCkgc2V0dGluZywgaW4gcGFydGljdWxhcgordGhlIHZlcnkgb2xkIGJyb2tlbiBNaWNyb3NvZnQvSFAgMzE0NC1ieXRlIHNSR0IgcHJvZmlsZS4gIFN0YXJ0aW5nIHdpdGgKK2xpYnBuZy0xLjYuMTEsIHJlY29nbml6aW5nIGFuZCBjaGVja2luZyBzUkdCIHByb2ZpbGVzIGNhbiBiZSBhdm9pZGVkIGJ5CittZWFucyBvZgorCisgICAgI2lmIGRlZmluZWQoUE5HX1NLSVBfc1JHQl9DSEVDS19QUk9GSUxFKSAmJiBcCisgICAgICAgIGRlZmluZWQoUE5HX1NFVF9PUFRJT05fU1VQUE9SVEVEKQorICAgICAgIHBuZ19zZXRfb3B0aW9uKHBuZ19wdHIsIFBOR19TS0lQX3NSR0JfQ0hFQ0tfUFJPRklMRSwKKyAgICAgICAgICAgUE5HX09QVElPTl9PTik7CisgICAgI2VuZGlmCisKK0l0J3Mgbm90IGEgZ29vZCBpZGVhIHRvIGRvIHRoaXMgaWYgeW91IGFyZSB1c2luZyB0aGUgInNpbXBsaWZpZWQgQVBJIiwKK3doaWNoIG5lZWRzIHRvIGJlIGFibGUgdG8gcmVjb2duaXplIHNSR0IgcHJvZmlsZXMgY29udmV5ZWQgdmlhIHRoZSBpQ0NQCitjaHVuay4KKworVGhlIFBORyBzcGVjIHJlcXVpcmVtZW50IHRoYXQgb25seSBncmF5c2NhbGUgcHJvZmlsZXMgbWF5IGFwcGVhciBpbiBpbWFnZXMKK3dpdGggY29sb3IgdHlwZSAwIG9yIDQgYW5kIHRoYXQgZXZlbiBpZiB0aGUgaW1hZ2Ugb25seSBjb250YWlucyBncmF5IHBpeGVscywKK29ubHkgUkdCIHByb2ZpbGVzIG1heSBhcHBlYXIgaW4gaW1hZ2VzIHdpdGggY29sb3IgdHlwZSAyLCAzLCBvciA2LCBpcyBub3cKK2VuZm9yY2VkLiAgVGhlIHNSR0IgY2h1bmsgaXMgYWxsb3dlZCB0byBhcHBlYXIgaW4gaW1hZ2VzIHdpdGggYW55IGNvbG9yIHR5cGUKK2FuZCBpcyBpbnRlcnByZXRlZCBieSBsaWJwbmcgdG8gY29udmV5IGEgb25lLXRyYWNlci1jdXJ2ZSBncmF5IHByb2ZpbGUgb3IgYQordGhyZWUtdHJhY2VyLWN1cnZlIFJHQiBwcm9maWxlIGFzIGFwcHJvcHJpYXRlLgorCitQcmlvciB0byBsaWJwbmctMS42LjAgYSB3YXJuaW5nIHdvdWxkIGJlIGlzc3VlZCBpZiB0aGUgaVRYdCBjaHVuayBjb250YWluZWQKK2FuIGVtcHR5IGxhbmd1YWdlIGZpZWxkIG9yIGFuIGVtcHR5IHRyYW5zbGF0ZWQga2V5d29yZC4gIEJvdGggb2YgdGhlc2UKK2FyZSBhbGxvd2VkIGJ5IHRoZSBQTkcgc3BlY2lmaWNhdGlvbiwgc28gdGhlc2Ugd2FybmluZ3MgYXJlIG5vIGxvbmdlciBpc3N1ZWQuCisKK1RoZSBsaWJyYXJ5IG5vdyBpc3N1ZXMgYW4gZXJyb3IgaWYgdGhlIGFwcGxpY2F0aW9uIGF0dGVtcHRzIHRvIHNldCBhCit0cmFuc2Zvcm0gYWZ0ZXIgaXQgY2FsbHMgcG5nX3JlYWRfdXBkYXRlX2luZm8oKSBvciBpZiBpdCBhdHRlbXB0cyB0byBjYWxsCitib3RoIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCkgYW5kIHBuZ19zdGFydF9yZWFkX2ltYWdlKCkgb3IgdG8gY2FsbCBlaXRoZXIKK29mIHRoZW0gbW9yZSB0aGFuIG9uY2UuCisKK1RoZSBkZWZhdWx0IGNvbmRpdGlvbiBmb3IgYmVuaWduX2Vycm9ycyBpcyBub3cgdG8gdHJlYXQgYmVuaWduIGVycm9ycyBhcword2FybmluZ3Mgd2hpbGUgcmVhZGluZyBhbmQgYXMgZXJyb3JzIHdoaWxlIHdyaXRpbmcuCisKK1RoZSBsaWJyYXJ5IG5vdyBpc3N1ZXMgYSB3YXJuaW5nIGlmIGJvdGggYmFja2dyb3VuZCBwcm9jZXNzaW5nIGFuZCBSR0IgdG8KK2dyYXkgYXJlIHVzZWQgd2hlbiBnYW1tYSBjb3JyZWN0aW9uIGhhcHBlbnMuIEFzIHdpdGggcHJldmlvdXMgdmVyc2lvbnMgb2YKK3RoZSBsaWJyYXJ5IHRoZSByZXN1bHRzIGFyZSBudW1lcmljYWxseSB2ZXJ5IGluY29ycmVjdCBpbiB0aGlzIGNhc2UuCisKK1RoZXJlIGFyZSBzb21lIG1pbm9yIGFyaXRobWV0aWMgY2hhbmdlcyBpbiBzb21lIHRyYW5zZm9ybXMgc3VjaCBhcworcG5nX3NldF9iYWNrZ3JvdW5kKCksIHRoYXQgbWlnaHQgYmUgZGV0ZWN0ZWQgYnkgY2VydGFpbiByZWdyZXNzaW9uIHRlc3RzLgorCitVbmtub3duIGNodW5rIGhhbmRsaW5nIGhhcyBiZWVuIGltcHJvdmVkIGludGVybmFsbHksIHdpdGhvdXQgYW55IEFQSSBjaGFuZ2UuCitUaGlzIGFkZHMgbW9yZSBjb3JyZWN0IG9wdGlvbiBjb250cm9sIG9mIHRoZSB1bmtub3duIGhhbmRsaW5nLCBjb3JyZWN0cworYSBwcmUtZXhpc3RpbmcgYnVnIHdoZXJlIHRoZSBwZXItY2h1bmsgJ2tlZXAnIHNldHRpbmcgaXMgaWdub3JlZCwgYW5kIG1ha2VzCitpdCBwb3NzaWJsZSB0byBza2lwIElEQVQgY2h1bmtzIGluIHRoZSBzZXF1ZW50aWFsIHJlYWRlci4KKworVGhlIG1hY2hpbmUtZ2VuZXJhdGVkIGNvbmZpZ3VyZSBmaWxlcyBhcmUgbm8gbG9uZ2VyIGluY2x1ZGVkIGluIGJyYW5jaGVzCitsaWJwbmcxNiBhbmQgbGF0ZXIgb2YgdGhlIEdJVCByZXBvc2l0b3J5LiAgVGhleSBjb250aW51ZSB0byBiZSBpbmNsdWRlZAoraW4gdGhlIHRhcmJhbGwgcmVsZWFzZXMsIGhvd2V2ZXIuCisKK0xpYnBuZy0xLjYuMCB0aHJvdWdoIDEuNi4yIHVzZWQgdGhlIENNRiBieXRlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBJREFUCitzdHJlYW0gdG8gc2V0IHRoZSBzaXplIG9mIHRoZSBzbGlkaW5nIHdpbmRvdyBmb3IgcmVhZGluZyBpbnN0ZWFkIG9mIHVzaW5nIHRoZQorZGVmYXVsdCAzMi1rYnl0ZSBzbGlkaW5nIHdpbmRvdyBzaXplLiAgSXQgd2FzIGRpc2NvdmVyZWQgdGhhdCB0aGVyZSBhcmUKK2h1bmRyZWRzIG9mIFBORyBmaWxlcyBpbiB0aGUgd2lsZCB0aGF0IGhhdmUgaW5jb3JyZWN0IENNRiBieXRlcyB0aGF0IGNhdXNlZAoremxpYiB0byBpc3N1ZSB0aGUgImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIiBlcnJvciBhbmQgcmVqZWN0IHRoZSBmaWxlLgorTGlicG5nLTEuNi4zIGFuZCBsYXRlciBjYWxjdWxhdGUgdGhlaXIgb3duIHNhZmUgQ01GIGZyb20gdGhlIGltYWdlIGRpbWVuc2lvbnMsCitwcm92aWRlIGEgd2F5IHRvIHJldmVydCB0byB0aGUgbGlicG5nLTEuNS54IGJlaGF2aW9yIChpZ25vcmluZyB0aGUgQ01GIGJ5dGVzCithbmQgdXNpbmcgYSAzMi1rYnl0ZSBzbGlkaW5nIHdpbmRvdyksIGJ5IHVzaW5nCisKKyAgICBwbmdfc2V0X29wdGlvbihwbmdfcHRyLCBQTkdfTUFYSU1VTV9JTkZMQVRFX1dJTkRPVywKKyAgICAgICAgUE5HX09QVElPTl9PTik7CisKK2FuZCBwcm92aWRlIGEgdG9vbCAoY29udHJpYi90b29scy9wbmdmaXgpIGZvciByZXdyaXRpbmcgYSBQTkcgZmlsZSB3aGlsZQorb3B0aW1pemluZyB0aGUgQ01GIGJ5dGVzIGluIGl0cyBJREFUIGNodW5rIGNvcnJlY3RseS4KKworTGlicG5nLTEuNi4wIGFuZCBsaWJwbmctMS42LjEgd3JvdGUgdW5jb21wcmVzc2VkIGlUWHQgY2h1bmtzIHdpdGggdGhlIHdyb25nCitsZW5ndGgsIHdoaWNoIHJlc3VsdGVkIGluIFBORyBmaWxlcyB0aGF0IGNhbm5vdCBiZSByZWFkIGJleW9uZCB0aGUgYmFkIGlUWHQKK2NodW5rLiAgVGhpcyBlcnJvciB3YXMgZml4ZWQgaW4gbGlicG5nLTEuNi4zLCBhbmQgYSB0b29sIChjYWxsZWQKK2NvbnRyaWIvdG9vbHMvcG5nLWZpeC1pdHh0KSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgbGlicG5nIGRpc3RyaWJ1dGlvbi4KKworU3RhcnRpbmcgd2l0aCBsaWJwbmctMS42LjE3LCB0aGUgUE5HX1NBRkVfTElNSVRTIG1hY3JvIHdhcyBlbGltaW5hdGVkCithbmQgc2FmZSBsaW1pdHMgYXJlIHVzZWQgYnkgZGVmYXVsdCAodXNlcnMgd2hvIG5lZWQgbGFyZ2VyIGxpbWl0cworY2FuIHN0aWxsIG92ZXJyaWRlIHRoZW0gYXQgY29tcGlsZSB0aW1lIG9yIHJ1biB0aW1lLCBhcyBkZXNjcmliZWQgYWJvdmUpLgorCitUaGUgbmV3IGxpbWl0cyBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCAgIHNwZWMgbGltaXQKKyAgIHBuZ191c2VyX3dpZHRoX21heCAgICAgICAgIDEsMDAwLDAwMCAgMiwxNDcsNDgzLDY0NworICAgcG5nX3VzZXJfaGVpZ2h0X21heCAgICAgICAgMSwwMDAsMDAwICAyLDE0Nyw0ODMsNjQ3CisgICBwbmdfdXNlcl9jaHVua19jYWNoZV9tYXggICAgICAgICAxMjggIHVubGltaXRlZAorICAgcG5nX3VzZXJfY2h1bmtfbWFsbG9jX21heCAgOCwwMDAsMDAwICB1bmxpbWl0ZWQKKworU3RhcnRpbmcgd2l0aCBsaWJwbmctMS42LjE4LCBhIFBOR19SRUxFQVNFX0JVSUxEIG1hY3JvIHdhcyBhZGRlZCwgd2hpY2ggYWxsb3dzCitsaWJyYXJ5IGJ1aWxkZXJzIHRvIGNvbnRyb2wgY29tcGlsYXRpb24gZm9yIGFuIGluc3RhbGxlZCBzeXN0ZW0gKGEgcmVsZWFzZSBidWlsZCkuCitJdCBjYW4gYmUgc2V0IGZvciB0ZXN0aW5nIGRlYnVnIG9yIGJldGEgYnVpbGRzIHRvIGVuc3VyZSB0aGF0IHRoZXkgd2lsbCBjb21waWxlCit3aGVuIHRoZSBidWlsZCB0eXBlIGlzIHN3aXRjaGVkIHRvIFJDIG9yIFNUQUJMRS4gSW4gZXNzZW5jZSB0aGlzIG92ZXJyaWRlcyB0aGUKK1BOR19MSUJQTkdfQlVJTERfQkFTRV9UWVBFIGRlZmluaXRpb24gd2hpY2ggaXMgbm90IGRpcmVjdGx5IHVzZXIgY29udHJvbGxhYmxlLgorCitTdGFydGluZyB3aXRoIGxpYnBuZy0xLjYuMTksIGF0dGVtcHRpbmcgdG8gc2V0IGFuIG92ZXItbGVuZ3RoIFBMVEUgY2h1bmsKK2lzIGFuIGVycm9yLiBQcmV2aW91c2x5IHRoaXMgcmVxdWlyZW1lbnQgb2YgdGhlIFBORyBzcGVjaWZpY2F0aW9uIHdhcyBub3QKK2VuZm9yY2VkLCBhbmQgdGhlIHBhbGV0dGUgd2FzIGFsd2F5cyBsaW1pdGVkIHRvIDI1NiBlbnRyaWVzLiBBbiBvdmVyLWxlbmd0aAorUExURSBjaHVuayBmb3VuZCBpbiBhbiBpbnB1dCBQTkcgaXMgc2lsZW50bHkgdHJ1bmNhdGVkLgorCitYSUlJLiAgRGV0ZWN0aW5nIGxpYnBuZworCitUaGUgcG5nX2dldF9pb19wdHIoKSBmdW5jdGlvbiBoYXMgYmVlbiBwcmVzZW50IHNpbmNlIGxpYnBuZy0wLjg4LCBoYXMgbmV2ZXIKK2NoYW5nZWQsIGFuZCBpcyB1bmFmZmVjdGVkIGJ5IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIG1hY3Jvcy4gIEl0IGlzIHRoZQorYmVzdCBjaG9pY2UgZm9yIHVzZSBpbiBjb25maWd1cmUgc2NyaXB0cyBmb3IgZGV0ZWN0aW5nIHRoZSBwcmVzZW5jZSBvZiBhbnkKK2xpYnBuZyB2ZXJzaW9uIHNpbmNlIDAuODguICBJbiBhbiBhdXRvY29uZiAiY29uZmlndXJlLmluIiB5b3UgY291bGQgdXNlCisKKyAgICBBQ19DSEVDS19MSUIocG5nLCBwbmdfZ2V0X2lvX3B0ciwgLi4uCisKK1hWLiBTb3VyY2UgY29kZSByZXBvc2l0b3J5CisKK1NpbmNlIGFib3V0IEZlYnJ1YXJ5IDIwMDksIHZlcnNpb24gMS4yLjM0LCBsaWJwbmcgaGFzIGJlZW4gdW5kZXIgImdpdCIgc291cmNlCitjb250cm9sLiAgVGhlIGdpdCByZXBvc2l0b3J5IHdhcyBidWlsdCBmcm9tIG9sZCBsaWJwbmcteC55LnoudGFyLmd6IGZpbGVzCitnb2luZyBiYWNrIHRvIHZlcnNpb24gMC43MC4gIFlvdSBjYW4gYWNjZXNzIHRoZSBnaXQgcmVwb3NpdG9yeSAocmVhZCBvbmx5KQorYXQKKworICAgIGdpdDovL2dpdC5jb2RlLnNmLm5ldC9wL2xpYnBuZy9jb2RlCisKK29yIHlvdSBjYW4gYnJvd3NlIGl0IHdpdGggYSB3ZWIgYnJvd3NlciBieSBzZWxlY3RpbmcgdGhlICJjb2RlIiBidXR0b24gYXQKKworICAgIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnBuZworCitQYXRjaGVzIGNhbiBiZSBzZW50IHRvIGdsZW5ucnAgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0IG9yIHRvCitwbmctbW5nLWltcGxlbWVudCBhdCBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQgb3IgeW91IGNhbiB1cGxvYWQgdGhlbSB0bwordGhlIGxpYnBuZyBidWcgdHJhY2tlciBhdAorCisgICAgaHR0cDovL2xpYnBuZy5zb3VyY2Vmb3JnZS5uZXQKKworV2UgYWxzbyBhY2NlcHQgcGF0Y2hlcyBidWlsdCBmcm9tIHRoZSB0YXIgb3IgemlwIGRpc3RyaWJ1dGlvbnMsIGFuZAorc2ltcGxlIHZlcmJhbCBkaXNjcmlwdGlvbnMgb2YgYnVnIGZpeGVzLCByZXBvcnRlZCBlaXRoZXIgdG8gdGhlCitTb3VyY2VGb3JnZSBidWcgdHJhY2tlciwgdG8gdGhlIHBuZy1tbmctaW1wbGVtZW50IGF0IGxpc3RzLnNmLm5ldAorbWFpbGluZyBsaXN0LCBvciBkaXJlY3RseSB0byBnbGVubnJwLgorCitYVi4gQ29kaW5nIHN0eWxlCisKK091ciBjb2Rpbmcgc3R5bGUgaXMgc2ltaWxhciB0byB0aGUgIkFsbG1hbiIgc3R5bGUKKyhTZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JbmRlbnRfc3R5bGUjQWxsbWFuX3N0eWxlKSwgd2l0aCBjdXJseQorYnJhY2VzIG9uIHNlcGFyYXRlIGxpbmVzOgorCisgICAgaWYgKGNvbmRpdGlvbikKKyAgICB7CisgICAgICAgYWN0aW9uOworICAgIH0KKworICAgIGVsc2UgaWYgKGFub3RoZXIgY29uZGl0aW9uKQorICAgIHsKKyAgICAgICBhbm90aGVyIGFjdGlvbjsKKyAgICB9CisKK1RoZSBicmFjZXMgY2FuIGJlIG9taXR0ZWQgZnJvbSBzaW1wbGUgb25lLWxpbmUgYWN0aW9uczoKKworICAgIGlmIChjb25kaXRpb24pCisgICAgICAgcmV0dXJuICgwKTsKKworV2UgdXNlIDMtc3BhY2UgaW5kZW50YXRpb24sIGV4Y2VwdCBmb3IgY29udGludWVkIHN0YXRlbWVudHMgd2hpY2gKK2FyZSB1c3VhbGx5IGluZGVudGVkIHRoZSBzYW1lIGFzIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBzdGF0ZW1lbnQKK3BsdXMgZm91ciBtb3JlIHNwYWNlcy4KKworRm9yIG1hY3JvIGRlZmluaXRpb25zIHdlIHVzZSAyLXNwYWNlIGluZGVudGF0aW9uLCBhbHdheXMgbGVhdmluZyB0aGUgIiMiCitpbiB0aGUgZmlyc3QgY29sdW1uLgorCisgICAgI2lmbmRlZiBQTkdfTk9fRkVBVFVSRQorICAgICMgIGlmbmRlZiBQTkdfRkVBVFVSRV9TVVBQT1JURUQKKyAgICAjICAgIGRlZmluZSBQTkdfRkVBVFVSRV9TVVBQT1JURUQKKyAgICAjICBlbmRpZgorICAgICNlbmRpZgorCitDb21tZW50cyBhcHBlYXIgd2l0aCB0aGUgbGVhZGluZyAiLyoiIGF0IHRoZSBzYW1lIGluZGVudGF0aW9uIGFzCit0aGUgc3RhdGVtZW50IHRoYXQgZm9sbG93cyB0aGUgY29tbWVudDoKKworICAgIC8qIFNpbmdsZS1saW5lIGNvbW1lbnQgKi8KKyAgICBzdGF0ZW1lbnQ7CisKKyAgICAvKiBUaGlzIGlzIGEgbXVsdGlwbGUtbGluZQorICAgICAqIGNvbW1lbnQuCisgICAgICovCisgICAgc3RhdGVtZW50OworCitWZXJ5IHNob3J0IGNvbW1lbnRzIGNhbiBiZSBwbGFjZWQgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgc3RhdGVtZW50Cit0byB3aGljaCB0aGV5IHBlcnRhaW46CisKKyAgICBzdGF0ZW1lbnQ7ICAgIC8qIGNvbW1lbnQgKi8KKworV2UgZG9uJ3QgdXNlIEMrKyBzdHlsZSAoIi8vIikgY29tbWVudHMuIFdlIGhhdmUsIGhvd2V2ZXIsCit1c2VkIHRoZW0gaW4gdGhlIHBhc3QgaW4gc29tZSBub3ctYWJhbmRvbmVkIE1NWCBhc3NlbWJsZXIKK2NvZGUuCisKK0Z1bmN0aW9ucyBhbmQgdGhlaXIgY3VybHkgYnJhY2VzIGFyZSBub3QgaW5kZW50ZWQsIGFuZAorZXhwb3J0ZWQgZnVuY3Rpb25zIGFyZSBtYXJrZWQgd2l0aCBQTkdBUEk6CisKKyAvKiBUaGlzIGlzIGEgcHVibGljIGZ1bmN0aW9uIHRoYXQgaXMgdmlzaWJsZSB0bworICAqIGFwcGxpY2F0aW9uIHByb2dyYW1tZXJzLiBJdCBkb2VzIHRodXMtYW5kLXNvLgorICAqLworIHZvaWQgUE5HQVBJCisgcG5nX2V4cG9ydGVkX2Z1bmN0aW9uKHBuZ19wdHIsIHBuZ19pbmZvLCBmb28pCisgeworICAgIGJvZHk7CisgfQorCitUaGUgcmV0dXJuIHR5cGUgYW5kIGRlY29yYXRpb25zIGFyZSBwbGFjZWQgb24gYSBzZXBhcmF0ZSBsaW5lCithaGVhZCBvZiB0aGUgZnVuY3Rpb24gbmFtZSwgYXMgaWxsdXN0cmF0ZWQgYWJvdmUuCisKK1RoZSBwcm90b3R5cGVzIGZvciBhbGwgZXhwb3J0ZWQgZnVuY3Rpb25zIGFwcGVhciBpbiBwbmcuaCwKK2Fib3ZlIHRoZSBjb21tZW50IHRoYXQgc2F5cworCisgICAgLyogTWFpbnRhaW5lcjogUHV0IG5ldyBwdWJsaWMgcHJvdG90eXBlcyBoZXJlIC4uLiAqLworCitXZSBtYXJrIGFsbCBub24tZXhwb3J0ZWQgZnVuY3Rpb25zIHdpdGggIi8qIFBSSVZBVEUgKi8iIjoKKworIHZvaWQgLyogUFJJVkFURSAqLworIHBuZ19ub25fZXhwb3J0ZWRfZnVuY3Rpb24ocG5nX3B0ciwgcG5nX2luZm8sIGZvbykKKyB7CisgICAgYm9keTsKKyB9CisKK1RoZSBwcm90b3R5cGVzIGZvciBub24tZXhwb3J0ZWQgZnVuY3Rpb25zIChleGNlcHQgZm9yIHRob3NlIGluCitwbmd0ZXN0KSBhcHBlYXIgaW4gcG5ncHJpdi5oIGFib3ZlIHRoZSBjb21tZW50IHRoYXQgc2F5cworCisgIC8qIE1haW50YWluZXI6IFB1dCBuZXcgcHJpdmF0ZSBwcm90b3R5cGVzIGhlcmUgXiAqLworCitUbyBhdm9pZCBwb2xsdXRpbmcgdGhlIGdsb2JhbCBuYW1lc3BhY2UsIHRoZSBuYW1lcyBvZiBhbGwgZXhwb3J0ZWQKK2Z1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGJlZ2luIHdpdGggInBuZ18iLCBhbmQgYWxsIHB1YmxpY2x5IHZpc2libGUgQworcHJlcHJvY2Vzc29yIG1hY3JvcyBiZWdpbiB3aXRoICJQTkciLiAgV2UgcmVxdWVzdCB0aGF0IGFwcGxpY2F0aW9ucyB0aGF0Cit1c2UgbGlicG5nICpub3QqIGJlZ2luIGFueSBvZiB0aGVpciBvd24gc3ltYm9scyB3aXRoIGVpdGhlciBvZiB0aGVzZSBzdHJpbmdzLgorCitXZSBwdXQgYSBzcGFjZSBhZnRlciB0aGUgInNpemVvZiIgb3BlcmF0b3IgYW5kIHdlIG9taXQgdGhlCitvcHRpb25hbCBwYXJlbnRoZXNlcyBhcm91bmQgaXRzIGFyZ3VtZW50IHdoZW4gdGhlIGFyZ3VtZW50CitpcyBhbiBleHByZXNzaW9uLCBub3QgYSB0eXBlIG5hbWUsIGFuZCB3ZSBhbHdheXMgZW5jbG9zZSB0aGUKK3NpemVvZiBvcGVyYXRvciwgd2l0aCBpdHMgYXJndW1lbnQsIGluIHBhcmVudGhlc2VzOgorCisgIChzaXplb2YgKHBuZ191aW50XzMyKSkKKyAgKHNpemVvZiBhcnJheSkKKworUHJpb3IgdG8gbGlicG5nLTEuNi4wIHdlIHVzZWQgYSAicG5nX3NpemVvZigpIiBtYWNybywgZm9ybWF0dGVkIGFzCit0aG91Z2ggaXQgd2VyZSBhIGZ1bmN0aW9uLgorCitDb250cm9sIGtleXdvcmRzIGlmLCBmb3IsIHdoaWxlLCBhbmQgc3dpdGNoIGFyZSBhbHdheXMgZm9sbG93ZWQgYnkgYSBzcGFjZQordG8gZGlzdGluZ3Vpc2ggdGhlbSBmcm9tIGZ1bmN0aW9uIGNhbGxzLCB3aGljaCBoYXZlIG5vIHRyYWlsaW5nIHNwYWNlLiAKKworV2UgcHV0IGEgc3BhY2UgYWZ0ZXIgZWFjaCBjb21tYSBhbmQgYWZ0ZXIgZWFjaCBzZW1pY29sb24KK2luICJmb3IiIHN0YXRlbWVudHMsIGFuZCB3ZSBwdXQgc3BhY2VzIGJlZm9yZSBhbmQgYWZ0ZXIgZWFjaAorQyBiaW5hcnkgb3BlcmF0b3IgYW5kIGFmdGVyICJmb3IiIG9yICJ3aGlsZSIsIGFuZCBiZWZvcmUKKyI/Ii4gIFdlIGRvbid0IHB1dCBhIHNwYWNlIGJldHdlZW4gYSB0eXBlY2FzdCBhbmQgdGhlIGV4cHJlc3Npb24KK2JlaW5nIGNhc3QsIG5vciBkbyB3ZSBwdXQgb25lIGJldHdlZW4gYSBmdW5jdGlvbiBuYW1lIGFuZCB0aGUKK2xlZnQgcGFyZW50aGVzaXMgdGhhdCBmb2xsb3dzIGl0OgorCisgICAgZm9yIChpID0gMjsgaSA+IDA7IC0taSkKKyAgICAgICB5W2ldID0gYSh4KSArIChpbnQpYjsKKworV2UgcHJlZmVyICNpZmRlZiBhbmQgI2lmbmRlZiB0byAjaWYgZGVmaW5lZCgpIGFuZCAjaWYgIWRlZmluZWQoKQord2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBtYWNybyBiZWluZyB0ZXN0ZWQuICBXZSBhbHdheXMgdXNlIHBhcmVudGhlc2VzCit3aXRoICJkZWZpbmVkIi4KKworV2UgZXhwcmVzcyBpbnRlZ2VyIGNvbnN0YW50cyB0aGF0IGFyZSB1c2VkIGFzIGJpdCBtYXNrcyBpbiBoZXggZm9ybWF0LAord2l0aCBhbiBldmVuIG51bWJlciBvZiBsb3dlci1jYXNlIGhleCBkaWdpdHMsIGFuZCB0byBtYWtlIHRoZW0gdW5zaWduZWQKKyhlLmcuLCAweDAwVSwgMHhmZlUsIDB4MDEwMFUpIGFuZCBsb25nIGlmIHRoZXkgYXJlIGdyZWF0ZXIgdGhhbiAweDdmZmYKKyhlLmcuLCAweGZmZmZVTCkuCisKK1dlIHByZWZlciB0byB1c2UgdW5kZXJzY29yZXMgcmF0aGVyIHRoYW4gY2FtZWxDYXNlIGluIG5hbWVzLCBleGNlcHQKK2ZvciBhIGZldyB0eXBlIG5hbWVzIHRoYXQgd2UgaW5oZXJpdCBmcm9tIHpsaWIuaC4KKworV2UgcHJlZmVyICJpZiAoc29tZXRoaW5nICE9IDApIiBhbmQgImlmIChzb21ldGhpbmcgPT0gMCkiCitvdmVyICJpZiAoc29tZXRoaW5nKSIgYW5kIGlmICIoIXNvbWV0aGluZykiLCByZXNwZWN0aXZlbHkuCisKK1dlIGRvIG5vdCB1c2UgdGhlIFRBQiBjaGFyYWN0ZXIgZm9yIGluZGVudGF0aW9uIGluIHRoZSBDIHNvdXJjZXMuCisKK0xpbmVzIGRvIG5vdCBleGNlZWQgODAgY2hhcmFjdGVycy4KKworT3RoZXIgcnVsZXMgY2FuIGJlIGluZmVycmVkIGJ5IGluc3BlY3RpbmcgdGhlIGxpYnBuZyBzb3VyY2UuCisKK1hWSS4gWTJLIENvbXBsaWFuY2UgaW4gbGlicG5nCisKK1NpbmNlIHRoZSBQTkcgRGV2ZWxvcG1lbnQgZ3JvdXAgaXMgYW4gYWQtaG9jIGJvZHksIHdlIGNhbid0IG1ha2UKK2FuIG9mZmljaWFsIGRlY2xhcmF0aW9uLgorCitUaGlzIGlzIHlvdXIgdW5vZmZpY2lhbCBhc3N1cmFuY2UgdGhhdCBsaWJwbmcgZnJvbSB2ZXJzaW9uIDAuNzEgYW5kCit1cHdhcmQgdGhyb3VnaCAxLjYuMjAgYXJlIFkySyBjb21wbGlhbnQuICBJdCBpcyBteSBiZWxpZWYgdGhhdCBlYXJsaWVyCit2ZXJzaW9ucyB3ZXJlIGFsc28gWTJLIGNvbXBsaWFudC4KKworTGlicG5nIG9ubHkgaGFzIHR3byB5ZWFyIGZpZWxkcy4gIE9uZSBpcyBhIDItYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyCit0aGF0IHdpbGwgaG9sZCB5ZWFycyB1cCB0byA2NTUzNS4gIFRoZSBvdGhlciwgd2hpY2ggaXMgZGVwcmVjYXRlZCwKK2hvbGRzIHRoZSBkYXRlIGluIHRleHQgZm9ybWF0LCBhbmQgd2lsbCBob2xkIHllYXJzIHVwIHRvIDk5OTkuCisKK1RoZSBpbnRlZ2VyIGlzCisgICAgInBuZ191aW50XzE2IHllYXIiIGluIHBuZ190aW1lX3N0cnVjdC4KKworVGhlIHN0cmluZyBpcworICAgICJjaGFyIHRpbWVfYnVmZmVyWzI5XSIgaW4gcG5nX3N0cnVjdC4gIFRoaXMgaXMgbm8gbG9uZ2VyIHVzZWQKK2luIGxpYnBuZy0xLjYueCBhbmQgd2lsbCBiZSByZW1vdmVkIGZyb20gbGlicG5nLTEuNy4wLgorCitUaGVyZSBhcmUgc2V2ZW4gdGltZS1yZWxhdGVkIGZ1bmN0aW9uczoKKworICAgIHBuZ19jb252ZXJ0X3RvX3JmY18xMTIzX2J1ZmZlcigpIGluIHBuZy5jCisgICAgICAoZm9ybWVybHkgcG5nX2NvbnZlcnRfdG9fcmZjXzExNTIoKSBpbiBlcnJvciwgYW5kCisgICAgICBhbHNvIGZvcm1lcmx5IHBuZ19jb252ZXJ0X3RvX3JmY18xMTIzKCkpCisgICAgcG5nX2NvbnZlcnRfZnJvbV9zdHJ1Y3RfdG0oKSBpbiBwbmd3cml0ZS5jLCBjYWxsZWQKKyAgICAgIGluIHBuZ3dyaXRlLmMKKyAgICBwbmdfY29udmVydF9mcm9tX3RpbWVfdCgpIGluIHBuZ3dyaXRlLmMKKyAgICBwbmdfZ2V0X3RJTUUoKSBpbiBwbmdnZXQuYworICAgIHBuZ19oYW5kbGVfdElNRSgpIGluIHBuZ3J1dGlsLmMsIGNhbGxlZCBpbiBwbmdyZWFkLmMKKyAgICBwbmdfc2V0X3RJTUUoKSBpbiBwbmdzZXQuYworICAgIHBuZ193cml0ZV90SU1FKCkgaW4gcG5nd3V0aWwuYywgY2FsbGVkIGluIHBuZ3dyaXRlLmMKKworQWxsIGFwcGVhciB0byBoYW5kbGUgZGF0ZXMgcHJvcGVybHkgaW4gYSBZMksgZW52aXJvbm1lbnQuICBUaGUKK3BuZ19jb252ZXJ0X2Zyb21fdGltZV90KCkgZnVuY3Rpb24gY2FsbHMgZ210aW1lKCkgdG8gY29udmVydCBmcm9tIHN5c3RlbQorY2xvY2sgdGltZSwgd2hpY2ggcmV0dXJucyAoeWVhciAtIDE5MDApLCB3aGljaCB3ZSBwcm9wZXJseSBjb252ZXJ0IHRvCit0aGUgZnVsbCA0LWRpZ2l0IHllYXIuICBUaGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgYXBwbGljYXRpb25zIHVzaW5nCitsaWJwbmcgYXJlIG5vdCBwYXNzaW5nIDQtZGlnaXQgeWVhcnMgaW50byB0aGUgcG5nX2NvbnZlcnRfdG9fcmZjXzExMjMoKQorZnVuY3Rpb24sIG9yIHRoYXQgdGhleSBhcmUgaW5jb3JyZWN0bHkgcGFzc2luZyBvbmx5IGEgMi1kaWdpdCB5ZWFyCitpbnN0ZWFkIG9mICJ5ZWFyIC0gMTkwMCIgaW50byB0aGUgcG5nX2NvbnZlcnRfZnJvbV9zdHJ1Y3RfdG0oKSBmdW5jdGlvbiwKK2J1dCB0aGlzIGlzIG5vdCB1bmRlciBvdXIgY29udHJvbC4gIFRoZSBsaWJwbmcgZG9jdW1lbnRhdGlvbiBoYXMgYWx3YXlzCitzdGF0ZWQgdGhhdCBpdCB3b3JrcyB3aXRoIDQtZGlnaXQgeWVhcnMsIGFuZCB0aGUgQVBJcyBoYXZlIGJlZW4KK2RvY3VtZW50ZWQgYXMgc3VjaC4KKworVGhlIHRJTUUgY2h1bmsgaXRzZWxmIGlzIGFsc28gWTJLIGNvbXBsaWFudC4gIEl0IHVzZXMgYSAyLWJ5dGUgdW5zaWduZWQKK2ludGVnZXIgdG8gaG9sZCB0aGUgeWVhciwgYW5kIGNhbiBob2xkIHllYXJzIGFzIGxhcmdlIGFzIDY1NTM1LgorCit6bGliLCB1cG9uIHdoaWNoIGxpYnBuZyBkZXBlbmRzLCBpcyBhbHNvIFkySyBjb21wbGlhbnQuICBJdCBjb250YWlucworbm8gZGF0ZS1yZWxhdGVkIGNvZGUuCisKKworICAgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgICBsaWJwbmcgbWFpbnRhaW5lcgorICAgUE5HIERldmVsb3BtZW50IEdyb3VwCmRpZmYgLS1naXQgYS9saWJwbmcvbGlicG5nLjMgYi9saWJwbmcvbGlicG5nLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU3ZDBlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9saWJwbmcuMwpAQCAtMCwwICsxLDYxMjAgQEAKKy5USCBMSUJQTkcgMyAiRGVjZW1iZXIgMywgMjAxNSIKKy5TSCBOQU1FCitsaWJwbmcgXC0gUG9ydGFibGUgTmV0d29yayBHcmFwaGljcyAoUE5HKSBSZWZlcmVuY2UgTGlicmFyeSAxLjYuMjAKKy5TSCBTWU5PUFNJUworXGZCCisjaW5jbHVkZSA8cG5nLmg+XGZQCisKK1xmQnBuZ191aW50XzMyIHBuZ19hY2Nlc3NfdmVyc2lvbl9udW1iZXIgXGZJKHZvaWRcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19iZW5pZ25fZXJyb3IgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9jaGFycCBcZkllcnJvclxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX2J1aWxkX2dyYXlzY2FsZV9wYWxldHRlIChpbnQgXGZQXGZJYml0X2RlcHRoXGZQXGZCLCBwbmdfY29sb3JwIFxmSXBhbGV0dGVcZlBcZkIpO1xmUAorCitcZkJwbmdfdm9pZHAgcG5nX2NhbGxvYyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2FsbG9jX3NpemVfdCBcZklzaXplXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfY2h1bmtfYmVuaWduX2Vycm9yIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfY2hhcnAgXGZJZXJyb3JcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19jaHVua19lcnJvciAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2NoYXJwIFxmSWVycm9yXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfY2h1bmtfd2FybmluZyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2NoYXJwIFxmSW1lc3NhZ2VcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtIChwbmdfdGltZXAgXGZQXGZJcHRpbWVcZlBcZkIsIHN0cnVjdCB0bSBGQVIgKiBcZkl0dGltZVxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QgKHBuZ190aW1lcCBcZlBcZklwdGltZVxmUFxmQiwgdGltZV90IFxmSXR0aW1lXGZQXGZCKTtcZlAKKworXGZCcG5nX2NoYXJwIHBuZ19jb252ZXJ0X3RvX3JmYzExMjMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ190aW1lcCBcZklwdGltZVxmUFxmQik7XGZQCisKK1xmQnBuZ19pbmZvcCBwbmdfY3JlYXRlX2luZm9fc3RydWN0IChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZCcG5nX3N0cnVjdHAgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCAocG5nX2NvbnN0X2NoYXJwIFxmUFxmSXVzZXJfcG5nX3ZlclxmUFxmQiwgcG5nX3ZvaWRwIFxmUFxmSWVycm9yX3B0clxmUFxmQiwgcG5nX2Vycm9yX3B0ciBcZlBcZkllcnJvcl9mblxmUFxmQiwgcG5nX2Vycm9yX3B0ciBcZkl3YXJuX2ZuXGZQXGZCKTtcZlAKKworXGZCcG5nX3N0cnVjdHAgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yIChwbmdfY29uc3RfY2hhcnAgXGZQXGZJdXNlcl9wbmdfdmVyXGZQXGZCLCBwbmdfdm9pZHAgXGZQXGZJZXJyb3JfcHRyXGZQXGZCLCBwbmdfZXJyb3JfcHRyIFxmUFxmSWVycm9yX2ZuXGZQXGZCLCBwbmdfZXJyb3JfcHRyIFxmUFxmSXdhcm5fZm5cZlBcZkIsIHBuZ192b2lkcCBcZlBcZkltZW1fcHRyXGZQXGZCLCBwbmdfbWFsbG9jX3B0ciBcZlBcZkltYWxsb2NfZm5cZlBcZkIsIHBuZ19mcmVlX3B0ciBcZklmcmVlX2ZuXGZQXGZCKTtcZlAKKworXGZCcG5nX3N0cnVjdHAgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QgKHBuZ19jb25zdF9jaGFycCBcZlBcZkl1c2VyX3BuZ192ZXJcZlBcZkIsIHBuZ192b2lkcCBcZlBcZkllcnJvcl9wdHJcZlBcZkIsIHBuZ19lcnJvcl9wdHIgXGZQXGZJZXJyb3JfZm5cZlBcZkIsIHBuZ19lcnJvcl9wdHIgXGZJd2Fybl9mblxmUFxmQik7XGZQCisKK1xmQnBuZ19zdHJ1Y3RwIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0XzIgKHBuZ19jb25zdF9jaGFycCBcZlBcZkl1c2VyX3BuZ192ZXJcZlBcZkIsIHBuZ192b2lkcCBcZlBcZkllcnJvcl9wdHJcZlBcZkIsIHBuZ19lcnJvcl9wdHIgXGZQXGZJZXJyb3JfZm5cZlBcZkIsIHBuZ19lcnJvcl9wdHIgXGZQXGZJd2Fybl9mblxmUFxmQiwgcG5nX3ZvaWRwIFxmUFxmSW1lbV9wdHJcZlBcZkIsIHBuZ19tYWxsb2NfcHRyIFxmUFxmSW1hbGxvY19mblxmUFxmQiwgcG5nX2ZyZWVfcHRyIFxmSWZyZWVfZm5cZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19kYXRhX2ZyZWVyIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIGludCBcZlBcZklmcmVlclxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJbWFzaylcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19kZXN0cm95X2luZm9fc3RydWN0IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3BwIFxmSWluZm9fcHRyX3B0clxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QgKHBuZ19zdHJ1Y3RwcCBcZlBcZklwbmdfcHRyX3B0clxmUFxmQiwgcG5nX2luZm9wcCBcZlBcZklpbmZvX3B0cl9wdHJcZlBcZkIsIHBuZ19pbmZvcHAgXGZJZW5kX2luZm9fcHRyX3B0clxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0IChwbmdfc3RydWN0cHAgXGZQXGZJcG5nX3B0cl9wdHJcZlBcZkIsIHBuZ19pbmZvcHAgXGZJaW5mb19wdHJfcHRyXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfZXJyIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfZXJyb3IgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9jaGFycCBcZkllcnJvclxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX2ZyZWUgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ192b2lkcCBcZklwdHJcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19mcmVlX2NodW5rX2xpc3QgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19mcmVlX2RlZmF1bHQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ192b2lkcCBcZklwdHJcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19mcmVlX2RhdGEgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgaW50IFxmSW51bVxmUFxmQik7XGZQCisKK1xmQnBuZ19ieXRlIHBuZ19nZXRfYml0X2RlcHRoIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAorCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X2JLR0QgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2NvbG9yXzE2cCBcZkkqYmFja2dyb3VuZFxmUFxmQik7XGZQCisKK1xmQnBuZ19ieXRlIHBuZ19nZXRfY2hhbm5lbHMgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmQnBuZ191aW50XzMyIHBuZ19nZXRfY0hSTSAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBkb3VibGUgXGZQXGZJKndoaXRlX3hcZlBcZkIsIGRvdWJsZSBcZlBcZkkqd2hpdGVfeVxmUFxmQiwgZG91YmxlIFxmUFxmSSpyZWRfeFxmUFxmQiwgZG91YmxlIFxmUFxmSSpyZWRfeVxmUFxmQiwgZG91YmxlIFxmUFxmSSpncmVlbl94XGZQXGZCLCBkb3VibGUgXGZQXGZJKmdyZWVuX3lcZlBcZkIsIGRvdWJsZSBcZlBcZkkqYmx1ZV94XGZQXGZCLCBkb3VibGUgXGZJKmJsdWVfeVxmUFxmQik7XGZQCisKK1xmQnBuZ191aW50XzMyIHBuZ19nZXRfY0hSTV9maXhlZCAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkkqd2hpdGVfeFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJKndoaXRlX3lcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSSpyZWRfeFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJKnJlZF95XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkkqZ3JlZW5feFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJKmdyZWVuX3lcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSSpibHVlX3hcZlBcZkIsIHBuZ191aW50XzMyIFxmSSpibHVlX3lcZlBcZkIpO1xmUAorCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X2NIUk1fWFlaIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIGRvdWJsZSBcZlBcZkkqcmVkX1hcZlBcZkIsIGRvdWJsZSBcZlBcZkkqcmVkX1lcZlBcZkIsIGRvdWJsZSBcZlBcZkkqcmVkX1pcZlBcZkIsIGRvdWJsZSBcZlBcZkkqZ3JlZW5fWFxmUFxmQiwgZG91YmxlIFxmUFxmSSpncmVlbl9ZXGZQXGZCLCBkb3VibGUgXGZQXGZJKmdyZWVuX1pcZlBcZkIsIGRvdWJsZSBcZlBcZkkqYmx1ZV9YXGZQXGZCLCBkb3VibGUgXGZQXGZJKmJsdWVfWVxmUFxmQiwgZG91YmxlIFxmSSpibHVlX1pcZlBcZkIpO1xmUAorCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X2NIUk1fWFlaX2ZpeGVkIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19maXhlZF9wb2ludCBcZlBcZkkqaW50X3JlZF9YXGZQXGZCLCBwbmdfZml4ZWRfcG9pbnQgXGZQXGZJKmludF9yZWRfWVxmUFxmQiwgcG5nX2ZpeGVkX3BvaW50IFxmUFxmSSppbnRfcmVkX1pcZlBcZkIsIHBuZ19maXhlZF9wb2ludCBcZlBcZkkqaW50X2dyZWVuX1hcZlBcZkIsIHBuZ19maXhlZF9wb2ludCBcZlBcZkkqaW50X2dyZWVuX1lcZlBcZkIsIHBuZ19maXhlZF9wb2ludCBcZlBcZkkqaW50X2dyZWVuX1pcZlBcZkIsIHBuZ19maXhlZF9wb2ludCBcZlBcZkkqaW50X2JsdWVfWFxmUFxmQiwgcG5nX2ZpeGVkX3BvaW50IFxmUFxmSSppbnRfYmx1ZV9ZXGZQXGZCLCBwbmdfZml4ZWRfcG9pbnQgXGZJKmludF9ibHVlX1pcZlBcZkIpO1xmUAorCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X2NodW5rX2NhY2hlX21heCAocG5nX2NvbnN0X3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmQnBuZ19hbGxvY19zaXplX3QgcG5nX2dldF9jaHVua19tYWxsb2NfbWF4IChwbmdfY29uc3Rfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZCcG5nX2J5dGUgcG5nX2dldF9jb2xvcl90eXBlIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAorCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X2NvbXByZXNzaW9uX2J1ZmZlcl9zaXplIChwbmdfY29uc3Rfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZCcG5nX2J5dGUgcG5nX2dldF9jb21wcmVzc2lvbl90eXBlIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAorCitcZkJwbmdfYnl0ZSBwbmdfZ2V0X2NvcHlyaWdodCAocG5nX2NvbnN0X3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmQnBuZ191aW50XzMyIHBuZ19nZXRfY3VycmVudF9yb3dfbnVtYmVyIFxmSShwbmdfY29uc3Rfc3RydWN0cFxmUFxmQik7XGZQCisKK1xmQnBuZ19ieXRlIHBuZ19nZXRfY3VycmVudF9wYXNzX251bWJlciBcZkkocG5nX2NvbnN0X3N0cnVjdHBcZlBcZkIpO1xmUAorCitcZkJwbmdfdm9pZHAgcG5nX2dldF9lcnJvcl9wdHIgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZkJwbmdfYnl0ZSBwbmdfZ2V0X2ZpbHRlcl90eXBlIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAorCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X2dBTUEgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgZG91YmxlIFxmSSpmaWxlX2dhbW1hXGZQXGZCKTtcZlAKKworXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9nQU1BX2ZpeGVkIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSSppbnRfZmlsZV9nYW1tYVxmUFxmQik7XGZQCisKK1xmQnBuZ19ieXRlIHBuZ19nZXRfaGVhZGVyX3ZlciAocG5nX2NvbnN0X3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmQnBuZ19ieXRlIHBuZ19nZXRfaGVhZGVyX3ZlcnNpb24gKHBuZ19jb25zdF9zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X2hJU1QgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMTZwIFxmSSpoaXN0XGZQXGZCKTtcZlAKKworXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9pQ0NQIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19jaGFycHAgXGZQXGZJbmFtZVxmUFxmQiwgaW50IFxmUFxmSSpjb21wcmVzc2lvbl90eXBlXGZQXGZCLCBwbmdfYnl0ZXBwIFxmUFxmSXByb2ZpbGVcZlBcZkIsIHBuZ191aW50XzMyIFxmSSpwcm9mbGVuXGZQXGZCKTtcZlAKKworXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9JSERSIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSSp3aWR0aFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJKmhlaWdodFxmUFxmQiwgaW50IFxmUFxmSSpiaXRfZGVwdGhcZlBcZkIsIGludCBcZlBcZkkqY29sb3JfdHlwZVxmUFxmQiwgaW50IFxmUFxmSSppbnRlcmxhY2VfdHlwZVxmUFxmQiwgaW50IFxmUFxmSSpjb21wcmVzc2lvbl90eXBlXGZQXGZCLCBpbnQgXGZJKmZpbHRlcl90eXBlXGZQXGZCKTtcZlAKKworXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9pbWFnZV9oZWlnaHQgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmQnBuZ191aW50XzMyIHBuZ19nZXRfaW1hZ2Vfd2lkdGggKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmQnBuZ19pbnRfMzIgcG5nX2dldF9pbnRfMzIgKHBuZ19ieXRlcCBcZklidWZcZlBcZkIpO1xmUAorCitcZkJwbmdfYnl0ZSBwbmdfZ2V0X2ludGVybGFjZV90eXBlIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAorCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X2lvX2NodW5rX3R5cGUgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZkJwbmdfdm9pZHAgcG5nX2dldF9pb19wdHIgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X2lvX3N0YXRlIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZCcG5nX2J5dGUgcG5nX2dldF9saWJwbmdfdmVyIChwbmdfY29uc3Rfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZCaW50IHBuZ19nZXRfcGFsZXR0ZV9tYXgocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKKworXGZCcG5nX3ZvaWRwIHBuZ19nZXRfbWVtX3B0ciAocG5nX2NvbnN0X3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmQnBuZ191aW50XzMyIHBuZ19nZXRfb0ZGcyAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkkqb2Zmc2V0X3hcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSSpvZmZzZXRfeVxmUFxmQiwgaW50IFxmSSp1bml0X3R5cGVcZlBcZkIpO1xmUAorCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X3BDQUwgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2NoYXJwIFxmUFxmSSpwdXJwb3NlXGZQXGZCLCBwbmdfaW50XzMyIFxmUFxmSSpYMFxmUFxmQiwgcG5nX2ludF8zMiBcZlBcZkkqWDFcZlBcZkIsIGludCBcZlBcZkkqdHlwZVxmUFxmQiwgaW50IFxmUFxmSSpucGFyYW1zXGZQXGZCLCBwbmdfY2hhcnAgXGZQXGZJKnVuaXRzXGZQXGZCLCBwbmdfY2hhcnBwIFxmSSpwYXJhbXNcZlBcZkIpO1xmUAorCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X3BIWXMgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJKnJlc194XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkkqcmVzX3lcZlBcZkIsIGludCBcZkkqdW5pdF90eXBlXGZQXGZCKTtcZlAKKworXGZCZmxvYXQgcG5nX2dldF9waXhlbF9hc3BlY3RfcmF0aW8gKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmQnBuZ191aW50XzMyIHBuZ19nZXRfcEhZc19kcGkgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJKnJlc194XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkkqcmVzX3lcZlBcZkIsIGludCBcZkkqdW5pdF90eXBlXGZQXGZCKTtcZlAKKworXGZCcG5nX2ZpeGVkX3BvaW50IHBuZ19nZXRfcGl4ZWxfYXNwZWN0X3JhdGlvX2ZpeGVkIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAorCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X3BpeGVsc19wZXJfaW5jaCAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKKworXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9waXhlbHNfcGVyX21ldGVyIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAorCitcZkJwbmdfdm9pZHAgcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X1BMVEUgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2NvbG9ycCBcZlBcZkkqcGFsZXR0ZVxmUFxmQiwgaW50IFxmSSpudW1fcGFsZXR0ZVxmUFxmQik7XGZQCisKK1xmQnBuZ19ieXRlIHBuZ19nZXRfcmdiX3RvX2dyYXlfc3RhdHVzIChwbmdfY29uc3Rfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9yb3dieXRlcyAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKKworXGZCcG5nX2J5dGVwcCBwbmdfZ2V0X3Jvd3MgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmQnBuZ191aW50XzMyIHBuZ19nZXRfc0JJVCAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfY29sb3JfOHAgXGZJKnNpZ19iaXRcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19nZXRfc0NBTCAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBpbnQqIFxmUFxmSXVuaXRcZlBcZkIsIGRvdWJsZSogXGZQXGZJd2lkdGhcZlBcZkIsIGRvdWJsZSogXGZJaGVpZ2h0XGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfZ2V0X3NDQUxfZml4ZWQgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgaW50KiBcZlBcZkl1bml0XGZQXGZCLCBwbmdfZml4ZWRfcG9pbnRwIFxmUFxmSXdpZHRoXGZQXGZCLCBwbmdfZml4ZWRfcG9pbnRwIFxmSWhlaWdodFxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX2dldF9zQ0FMX3MgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgaW50KiBcZlBcZkl1bml0XGZQXGZCLCBwbmdfY2hhcnBwIFxmUFxmSXdpZHRoXGZQXGZCLCBwbmdfY2hhcnBwIFxmSWhlaWdodFxmUFxmQik7XGZQCisKK1xmQnBuZ19ieXRlcCBwbmdfZ2V0X3NpZ25hdHVyZSAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKKworXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9zUExUIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19zcGFsZXR0ZV9wIFxmSSpzcGx0X3B0clxmUFxmQik7XGZQCisKK1xmQnBuZ191aW50XzMyIHBuZ19nZXRfc1JHQiAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBpbnQgXGZJKmZpbGVfc3JnYl9pbnRlbnRcZlBcZkIpO1xmUAorCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X3RleHQgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3RleHRwIFxmUFxmSSp0ZXh0X3B0clxmUFxmQiwgaW50IFxmSSpudW1fdGV4dFxmUFxmQik7XGZQCisKK1xmQnBuZ191aW50XzMyIHBuZ19nZXRfdElNRSAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdGltZXAgXGZJKm1vZF90aW1lXGZQXGZCKTtcZlAKKworXGZCcG5nX3VpbnRfMzIgcG5nX2dldF90Uk5TIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZkkqdHJhbnNfYWxwaGFcZlBcZkIsIGludCBcZlBcZkkqbnVtX3RyYW5zXGZQXGZCLCBwbmdfY29sb3JfMTZwIFxmSSp0cmFuc19jb2xvclxmUFxmQik7XGZQCisKK1xmQi8qIFRoaXMgZnVuY3Rpb24gaXMgcmVhbGx5IGFuIGlubGluZSBtYWNyby4gXGZJKi8KKworXGZCcG5nX3VpbnRfMTYgcG5nX2dldF91aW50XzE2IChwbmdfYnl0ZXAgXGZJYnVmXGZQXGZCKTtcZlAKKworXGZCcG5nX3VpbnRfMzIgcG5nX2dldF91aW50XzMxIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfYnl0ZXAgXGZJYnVmXGZQXGZCKTtcZlAKKworXGZCLyogVGhpcyBmdW5jdGlvbiBpcyByZWFsbHkgYW4gaW5saW5lIG1hY3JvLiBcZkkqLworCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X3VpbnRfMzIgKHBuZ19ieXRlcCBcZklidWZcZlBcZkIpO1xmUAorCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X3Vua25vd25fY2h1bmtzIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191bmtub3duX2NodW5rcHAgXGZJdW5rbm93bnNcZlBcZkIpO1xmUAorCitcZkJwbmdfdm9pZHAgcG5nX2dldF91c2VyX2NodW5rX3B0ciAocG5nX2NvbnN0X3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmQnBuZ191aW50XzMyIHBuZ19nZXRfdXNlcl9oZWlnaHRfbWF4IChwbmdfY29uc3Rfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZCcG5nX3ZvaWRwIHBuZ19nZXRfdXNlcl90cmFuc2Zvcm1fcHRyIChwbmdfY29uc3Rfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZCcG5nX3VpbnRfMzIgcG5nX2dldF91c2VyX3dpZHRoX21heCAocG5nX2NvbnN0X3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmQnBuZ191aW50XzMyIHBuZ19nZXRfdmFsaWQgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJZmxhZ1xmUFxmQik7XGZQCisKK1xmQmZsb2F0IHBuZ19nZXRfeF9vZmZzZXRfaW5jaGVzIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAorCitcZkJwbmdfZml4ZWRfcG9pbnQgcG5nX2dldF94X29mZnNldF9pbmNoZXNfZml4ZWQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmQnBuZ19pbnRfMzIgcG5nX2dldF94X29mZnNldF9taWNyb25zIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAorCitcZkJwbmdfaW50XzMyIHBuZ19nZXRfeF9vZmZzZXRfcGl4ZWxzIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAorCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X3hfcGl4ZWxzX3Blcl9pbmNoIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAorCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X3hfcGl4ZWxzX3Blcl9tZXRlciAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKKworXGZCZmxvYXQgcG5nX2dldF95X29mZnNldF9pbmNoZXMgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmQnBuZ19maXhlZF9wb2ludCBwbmdfZ2V0X3lfb2Zmc2V0X2luY2hlc19maXhlZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKKworXGZCcG5nX2ludF8zMiBwbmdfZ2V0X3lfb2Zmc2V0X21pY3JvbnMgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmQnBuZ19pbnRfMzIgcG5nX2dldF95X29mZnNldF9waXhlbHMgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmQnBuZ191aW50XzMyIHBuZ19nZXRfeV9waXhlbHNfcGVyX2luY2ggKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmQnBuZ191aW50XzMyIHBuZ19nZXRfeV9waXhlbHNfcGVyX21ldGVyIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAorCitcZkJpbnQgcG5nX2hhbmRsZV9hc191bmtub3duIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfYnl0ZXAgXGZJY2h1bmtfbmFtZVxmUFxmQik7XGZQCisKK1xmQmludCBwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX2ZpbGUgKHBuZ19pbWFnZXAgXGZQXGZJaW1hZ2VcZlBcZkIsIGNvbnN0IGNoYXIgXGZJKmZpbGVfbmFtZVxmUFxmQik7XGZQCisKK1xmQmludCBwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX3N0ZGlvIChwbmdfaW1hZ2VwIFxmUFxmSWltYWdlXGZQXGZCLCBGSUxFKiBcZklmaWxlXGZQXGZCKTtcZlAKKworXGZCaW50LCBwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX21lbW9yeSAocG5nX2ltYWdlcCBcZlBcZklpbWFnZVxmUFxmQiwgcG5nX2NvbnN0X3ZvaWRwIFxmUFxmSW1lbW9yeVxmUFxmQiwgcG5nX3NpemVfdCBcZklzaXplXGZQXGZCKTtcZlAKKworXGZCaW50IHBuZ19pbWFnZV9maW5pc2hfcmVhZCAocG5nX2ltYWdlcCBcZlBcZklpbWFnZVxmUFxmQiwgcG5nX2NvbG9ycCBcZlBcZkliYWNrZ3JvdW5kXGZQXGZCLCB2b2lkIFxmUFxmSSpidWZmZXJcZlBcZkIsIHBuZ19pbnRfMzIgXGZQXGZJcm93X3N0cmlkZVxmUFxmQiwgdm9pZCBcZkkqY29sb3JtYXBcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19pbWFnZV9mcmVlIChwbmdfaW1hZ2VwIFxmSWltYWdlXGZQXGZCKTtcZlAKKworXGZCaW50IHBuZ19pbWFnZV93cml0ZV90b19maWxlIChwbmdfaW1hZ2VwIFxmUFxmSWltYWdlXGZQXGZCLCBjb25zdCBjaGFyIFxmUFxmSSpmaWxlXGZQXGZCLCBpbnQgXGZQXGZJY29udmVydF90b184Yml0XGZQXGZCLCBjb25zdCB2b2lkIFxmUFxmSSpidWZmZXJcZlBcZkIsIHBuZ19pbnRfMzIgXGZQXGZJcm93X3N0cmlkZVxmUFxmQiwgdm9pZCBcZkkqY29sb3JtYXBcZlBcZkIpO1xmUAorCitcZkJpbnQgcG5nX2ltYWdlX3dyaXRlX3RvX3N0ZGlvIChwbmdfaW1hZ2VwIFxmUFxmSWltYWdlXGZQXGZCLCBGSUxFIFxmUFxmSSpmaWxlXGZQXGZCLCBpbnQgXGZQXGZJY29udmVydF90b184X2JpdFxmUFxmQiwgY29uc3Qgdm9pZCBcZlBcZkkqYnVmZmVyXGZQXGZCLCBwbmdfaW50XzMyIFxmUFxmSXJvd19zdHJpZGVcZlBcZkIsIHZvaWQgXGZJKmNvbG9ybWFwKVxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX2luZm9faW5pdF8zIChwbmdfaW5mb3BwIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfc2l6ZV90IFxmSXBuZ19pbmZvX3N0cnVjdF9zaXplXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfaW5pdF9pbyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgRklMRSBcZkkqZnBcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19sb25nam1wIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZJdmFsXGZQXGZCKTtcZlAKKworXGZCcG5nX3ZvaWRwIHBuZ19tYWxsb2MgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19hbGxvY19zaXplX3QgXGZJc2l6ZVxmUFxmQik7XGZQCisKK1xmQnBuZ192b2lkcCBwbmdfbWFsbG9jX2RlZmF1bHQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19hbGxvY19zaXplX3QgXGZJc2l6ZVxmUFxmQik7XGZQCisKK1xmQnBuZ192b2lkcCBwbmdfbWFsbG9jX3dhcm4gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19hbGxvY19zaXplX3QgXGZJc2l6ZVxmUFxmQik7XGZQCisKK1xmQnBuZ191aW50XzMyIHBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZkltbmdfZmVhdHVyZXNfcGVybWl0dGVkXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfcHJvY2Vzc19kYXRhIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklidWZmZXJcZlBcZkIsIHBuZ19zaXplX3QgXGZJYnVmZmVyX3NpemVcZlBcZkIpO1xmUAorCitcZkJwbmdfc2l6ZV90IHBuZ19wcm9jZXNzX2RhdGFfcGF1c2UgXGZQXGZJKHBuZ19zdHJ1Y3RwXGZQXGZCLCBpbnQgXGZJc2F2ZVxmUFxmQik7XGZQCisKK1xmQnBuZ191aW50XzMyIHBuZ19wcm9jZXNzX2RhdGFfc2tpcCBcZkkocG5nX3N0cnVjdHBcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19wcm9ncmVzc2l2ZV9jb21iaW5lX3JvdyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSW9sZF9yb3dcZlBcZkIsIHBuZ19ieXRlcCBcZkluZXdfcm93XGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfcmVhZF9lbmQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3JlYWRfaW1hZ2UgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcHAgXGZJaW1hZ2VcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19yZWFkX2luZm8gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3JlYWRfcG5nIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIGludCBcZlBcZkl0cmFuc2Zvcm1zXGZQXGZCLCBwbmdfdm9pZHAgXGZJcGFyYW1zXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfcmVhZF9yb3cgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklyb3dcZlBcZkIsIHBuZ19ieXRlcCBcZklkaXNwbGF5X3Jvd1xmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3JlYWRfcm93cyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwcCBcZlBcZklyb3dcZlBcZkIsIHBuZ19ieXRlcHAgXGZQXGZJZGlzcGxheV9yb3dcZlBcZkIsIHBuZ191aW50XzMyIFxmSW51bV9yb3dzXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfcmVhZF91cGRhdGVfaW5mbyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKKworXGZCaW50IHBuZ19yZXNldF96c3RyZWFtIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2F2ZV9pbnRfMzIgKHBuZ19ieXRlcCBcZlBcZklidWZcZlBcZkIsIHBuZ19pbnRfMzIgXGZJaVxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3NhdmVfdWludF8xNiAocG5nX2J5dGVwIFxmUFxmSWJ1ZlxmUFxmQiwgdW5zaWduZWQgaW50IFxmSWlcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zYXZlX3VpbnRfMzIgKHBuZ19ieXRlcCBcZlBcZklidWZcZlBcZkIsIHBuZ191aW50XzMyIFxmSWlcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfYWRkX2FscGhhIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZklmaWxsZXJcZlBcZkIsIGludCBcZklmbGFnc1xmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3NldF9hbHBoYV9tb2RlIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZQXGZJbW9kZVxmUFxmQiwgZG91YmxlIFxmSW91dHB1dF9nYW1tYVxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3NldF9hbHBoYV9tb2RlX2ZpeGVkIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZQXGZJbW9kZVxmUFxmQiwgcG5nX2ZpeGVkX3BvaW50IFxmSW91dHB1dF9nYW1tYVxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3NldF9iYWNrZ3JvdW5kIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29sb3JfMTZwIFxmUFxmSWJhY2tncm91bmRfY29sb3JcZlBcZkIsIGludCBcZlBcZkliYWNrZ3JvdW5kX2dhbW1hX2NvZGVcZlBcZkIsIGludCBcZlBcZkluZWVkX2V4cGFuZFxmUFxmQiwgZG91YmxlIFxmSWJhY2tncm91bmRfZ2FtbWFcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfYmFja2dyb3VuZF9maXhlZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbG9yXzE2cCBcZlBcZkliYWNrZ3JvdW5kX2NvbG9yXGZQXGZCLCBpbnQgXGZQXGZJYmFja2dyb3VuZF9nYW1tYV9jb2RlXGZQXGZCLCBpbnQgXGZQXGZJbmVlZF9leHBhbmRcZlBcZkIsIHBuZ191aW50XzMyIFxmSWJhY2tncm91bmRfZ2FtbWFcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfYmVuaWduX2Vycm9ycyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmSWFsbG93ZWRcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfYmdyIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X2JLR0QgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2NvbG9yXzE2cCBcZkliYWNrZ3JvdW5kXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X2NoZWNrX2Zvcl9pbnZhbGlkX2luZGV4KHBuZ19zdHJ1Y3RycCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZJYWxsb3dlZFxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3NldF9jSFJNIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIGRvdWJsZSBcZlBcZkl3aGl0ZV94XGZQXGZCLCBkb3VibGUgXGZQXGZJd2hpdGVfeVxmUFxmQiwgZG91YmxlIFxmUFxmSXJlZF94XGZQXGZCLCBkb3VibGUgXGZQXGZJcmVkX3lcZlBcZkIsIGRvdWJsZSBcZlBcZklncmVlbl94XGZQXGZCLCBkb3VibGUgXGZQXGZJZ3JlZW5feVxmUFxmQiwgZG91YmxlIFxmUFxmSWJsdWVfeFxmUFxmQiwgZG91YmxlIFxmSWJsdWVfeVxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3NldF9jSFJNX2ZpeGVkIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSXdoaXRlX3hcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSXdoaXRlX3lcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSXJlZF94XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZklyZWRfeVxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJZ3JlZW5feFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJZ3JlZW5feVxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJYmx1ZV94XGZQXGZCLCBwbmdfdWludF8zMiBcZklibHVlX3lcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfY0hSTV9YWVogKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgZG91YmxlIFxmUFxmSXJlZF9YXGZQXGZCLCBkb3VibGUgXGZQXGZJcmVkX1lcZlBcZkIsIGRvdWJsZSBcZlBcZklyZWRfWlxmUFxmQiwgZG91YmxlIFxmUFxmSWdyZWVuX1hcZlBcZkIsIGRvdWJsZSBcZlBcZklncmVlbl9ZXGZQXGZCLCBkb3VibGUgXGZQXGZJZ3JlZW5fWlxmUFxmQiwgZG91YmxlIFxmUFxmSWJsdWVfWFxmUFxmQiwgZG91YmxlIFxmUFxmSWJsdWVfWVxmUFxmQiwgZG91YmxlIFxmSWJsdWVfWlxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3NldF9jSFJNX1hZWl9maXhlZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfZml4ZWRfcG9pbnQgXGZQXGZJaW50X3JlZF9YXGZQXGZCLCBwbmdfZml4ZWRfcG9pbnQgXGZQXGZJaW50X3JlZF9ZXGZQXGZCLCBwbmdfZml4ZWRfcG9pbnQgXGZQXGZJaW50X3JlZF9aXGZQXGZCLCBwbmdfZml4ZWRfcG9pbnQgXGZQXGZJaW50X2dyZWVuX1hcZlBcZkIsIHBuZ19maXhlZF9wb2ludCBcZlBcZklpbnRfZ3JlZW5fWVxmUFxmQiwgcG5nX2ZpeGVkX3BvaW50IFxmUFxmSWludF9ncmVlbl9aXGZQXGZCLCBwbmdfZml4ZWRfcG9pbnQgXGZQXGZJaW50X2JsdWVfWFxmUFxmQiwgcG5nX2ZpeGVkX3BvaW50IFxmUFxmSWludF9ibHVlX1lcZlBcZkIsIHBuZ19maXhlZF9wb2ludCBcZklpbnRfYmx1ZV9aXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X2NodW5rX2NhY2hlX21heCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJdXNlcl9jaHVua19jYWNoZV9tYXhcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZklsZXZlbFxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3NldF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZkltZW1fbGV2ZWxcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfY29tcHJlc3Npb25fbWV0aG9kIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZJbWV0aG9kXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X2NvbXByZXNzaW9uX3N0cmF0ZWd5IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZJc3RyYXRlZ3lcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfY29tcHJlc3Npb25fd2luZG93X2JpdHMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZkl3aW5kb3dfYml0c1xmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3NldF9jcmNfYWN0aW9uIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZQXGZJY3JpdF9hY3Rpb25cZlBcZkIsIGludCBcZklhbmNpbF9hY3Rpb25cZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfZXJyb3JfZm4gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ192b2lkcCBcZlBcZkllcnJvcl9wdHJcZlBcZkIsIHBuZ19lcnJvcl9wdHIgXGZQXGZJZXJyb3JfZm5cZlBcZkIsIHBuZ19lcnJvcl9wdHIgXGZJd2FybmluZ19mblxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3NldF9leHBhbmQgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfZXhwYW5kXzE2IChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzggKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfZmlsbGVyIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZklmaWxsZXJcZlBcZkIsIGludCBcZklmbGFnc1xmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3NldF9maWx0ZXIgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZlBcZkltZXRob2RcZlBcZkIsIGludCBcZklmaWx0ZXJzXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X2ZpbHRlcl9oZXVyaXN0aWNzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZQXGZJaGV1cmlzdGljX21ldGhvZFxmUFxmQiwgaW50IFxmUFxmSW51bV93ZWlnaHRzXGZQXGZCLCBwbmdfZG91YmxlcCBcZlBcZklmaWx0ZXJfd2VpZ2h0c1xmUFxmQiwgcG5nX2RvdWJsZXAgXGZJZmlsdGVyX2Nvc3RzXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X2ZpbHRlcl9oZXVyaXN0aWNzX2ZpeGVkIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZQXGZJaGV1cmlzdGljX21ldGhvZFxmUFxmQiwgaW50IFxmUFxmSW51bV93ZWlnaHRzXGZQXGZCLCBwbmdfZml4ZWRfcG9pbnRfcCBcZlBcZklmaWx0ZXJfd2VpZ2h0c1xmUFxmQiwgcG5nX2ZpeGVkX3BvaW50X3AgXGZJZmlsdGVyX2Nvc3RzXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X2ZsdXNoIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZJbnJvd3NcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfZ2FtbWEgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGRvdWJsZSBcZlBcZklzY3JlZW5fZ2FtbWFcZlBcZkIsIGRvdWJsZSBcZklkZWZhdWx0X2ZpbGVfZ2FtbWFcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfZ2FtbWFfZml4ZWQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSXNjcmVlbl9nYW1tYVxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJZGVmYXVsdF9maWxlX2dhbW1hXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X2dBTUEgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgZG91YmxlIFxmSWZpbGVfZ2FtbWFcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfZ0FNQV9maXhlZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklmaWxlX2dhbW1hXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3NldF9ncmF5X3RvX3JnYiAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3NldF9oSVNUIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzE2cCBcZkloaXN0XGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X2lDQ1AgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2NvbnN0X2NoYXJwIFxmUFxmSW5hbWVcZlBcZkIsIGludCBcZlBcZkljb21wcmVzc2lvbl90eXBlXGZQXGZCLCBwbmdfY29uc3RfYnl0ZXAgXGZQXGZJcHJvZmlsZVxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJcHJvZmxlblxmUFxmQik7XGZQCisKK1xmQmludCBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3NldF9pbnZhbGlkIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIGludCBcZkltYXNrXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X2ludmVydF9hbHBoYSAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3NldF9pbnZlcnRfbW9ubyAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3NldF9JSERSIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSXdpZHRoXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkloZWlnaHRcZlBcZkIsIGludCBcZlBcZkliaXRfZGVwdGhcZlBcZkIsIGludCBcZlBcZkljb2xvcl90eXBlXGZQXGZCLCBpbnQgXGZQXGZJaW50ZXJsYWNlX3R5cGVcZlBcZkIsIGludCBcZlBcZkljb21wcmVzc2lvbl90eXBlXGZQXGZCLCBpbnQgXGZJZmlsdGVyX3R5cGVcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmUFxmSWtlZXBcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZkljaHVua19saXN0XGZQXGZCLCBpbnQgXGZJbnVtX2NodW5rc1xmUFxmQik7XGZQCisKK1xmQmptcF9idWYqIHBuZ19zZXRfbG9uZ2ptcF9mbiAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2xvbmdqbXBfcHRyIFxmUFxmSWxvbmdqbXBfZm5cZlBcZkIsIHNpemVfdCBcZklqbXBfYnVmX3NpemVcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfY2h1bmtfbWFsbG9jX21heCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2FsbG9jX3NpemVfdCBcZkl1c2VyX2NodW5rX2NhY2hlX21heFxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3NldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJc2l6ZVxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3NldF9tZW1fZm4gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ192b2lkcCBcZlBcZkltZW1fcHRyXGZQXGZCLCBwbmdfbWFsbG9jX3B0ciBcZlBcZkltYWxsb2NfZm5cZlBcZkIsIHBuZ19mcmVlX3B0ciBcZklmcmVlX2ZuXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X29GRnMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJb2Zmc2V0X3hcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSW9mZnNldF95XGZQXGZCLCBpbnQgXGZJdW5pdF90eXBlXGZQXGZCKTtcZlAKKworXGZCaW50IHBuZ19zZXRfb3B0aW9uKHBuZ19zdHJ1Y3RycCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZQXGZJb3B0aW9uXGZQXGZCLCBpbnQgXGZJb25vZmZcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfcGFja2luZyAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3NldF9wYWNrc3dhcCAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3NldF9wYWxldHRlX3RvX3JnYiAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3NldF9wQ0FMIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19jaGFycCBcZlBcZklwdXJwb3NlXGZQXGZCLCBwbmdfaW50XzMyIFxmUFxmSVgwXGZQXGZCLCBwbmdfaW50XzMyIFxmUFxmSVgxXGZQXGZCLCBpbnQgXGZQXGZJdHlwZVxmUFxmQiwgaW50IFxmUFxmSW5wYXJhbXNcZlBcZkIsIHBuZ19jaGFycCBcZlBcZkl1bml0c1xmUFxmQiwgcG5nX2NoYXJwcCBcZklwYXJhbXNcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfcEhZcyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZklyZXNfeFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJcmVzX3lcZlBcZkIsIGludCBcZkl1bml0X3R5cGVcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbiAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3ZvaWRwIFxmUFxmSXByb2dyZXNzaXZlX3B0clxmUFxmQiwgcG5nX3Byb2dyZXNzaXZlX2luZm9fcHRyIFxmUFxmSWluZm9fZm5cZlBcZkIsIHBuZ19wcm9ncmVzc2l2ZV9yb3dfcHRyIFxmUFxmSXJvd19mblxmUFxmQiwgcG5nX3Byb2dyZXNzaXZlX2VuZF9wdHIgXGZJZW5kX2ZuXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X1BMVEUgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2NvbG9ycCBcZlBcZklwYWxldHRlXGZQXGZCLCBpbnQgXGZJbnVtX3BhbGV0dGVcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfcXVhbnRpemUgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb2xvcnAgXGZQXGZJcGFsZXR0ZVxmUFxmQiwgaW50IFxmUFxmSW51bV9wYWxldHRlXGZQXGZCLCBpbnQgXGZQXGZJbWF4aW11bV9jb2xvcnNcZlBcZkIsIHBuZ191aW50XzE2cCBcZlBcZkloaXN0b2dyYW1cZlBcZkIsIGludCBcZklmdWxsX3F1YW50aXplXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X3JlYWRfZm4gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ192b2lkcCBcZlBcZklpb19wdHJcZlBcZkIsIHBuZ19yd19wdHIgXGZJcmVhZF9kYXRhX2ZuXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X3JlYWRfc3RhdHVzX2ZuIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfcmVhZF9zdGF0dXNfcHRyIFxmSXJlYWRfcm93X2ZuXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X3JlYWRfdXNlcl9jaHVua19mbiAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3ZvaWRwIFxmUFxmSXVzZXJfY2h1bmtfcHRyXGZQXGZCLCBwbmdfdXNlcl9jaHVua19wdHIgXGZJcmVhZF91c2VyX2NodW5rX2ZuXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X3JlYWRfdXNlcl90cmFuc2Zvcm1fZm4gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ191c2VyX3RyYW5zZm9ybV9wdHIgXGZJcmVhZF91c2VyX3RyYW5zZm9ybV9mblxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3NldF9yZ2JfdG9fZ3JheSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmUFxmSWVycm9yX2FjdGlvblxmUFxmQiwgZG91YmxlIFxmUFxmSXJlZFxmUFxmQiwgZG91YmxlIFxmSWdyZWVuXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X3JnYl90b19ncmF5X2ZpeGVkIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgZXJyb3JfYWN0aW9uIHBuZ191aW50XzMyIFxmUFxmSXJlZFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJZ3JlZW5cZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfcm93cyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfYnl0ZXBwIFxmSXJvd19wb2ludGVyc1xmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3NldF9zQklUIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19jb2xvcl84cCBcZklzaWdfYml0XGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X3NDQUwgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgaW50IFxmUFxmSXVuaXRcZlBcZkIsIGRvdWJsZSBcZlBcZkl3aWR0aFxmUFxmQiwgZG91YmxlIFxmSWhlaWdodFxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3NldF9zQ0FMX2ZpeGVkIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIGludCBcZlBcZkl1bml0XGZQXGZCLCBwbmdfZml4ZWRfcG9pbnQgXGZQXGZJd2lkdGhcZlBcZkIsIHBuZ19maXhlZF9wb2ludCBcZkloZWlnaHRcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfc0NBTF9zIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIGludCBcZlBcZkl1bml0XGZQXGZCLCBwbmdfY2hhcnAgXGZQXGZJd2lkdGhcZlBcZkIsIHBuZ19jaGFycCBcZkloZWlnaHRcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfc2NhbGVfMTYgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfc2hpZnQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb2xvcl84cCBcZkl0cnVlX2JpdHNcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfc2lnX2J5dGVzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZJbnVtX2J5dGVzXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X3NQTFQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3NwYWxldHRlX3AgXGZQXGZJc3BsdF9wdHJcZlBcZkIsIGludCBcZkludW1fc3BhbGV0dGVzXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X3NSR0IgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgaW50IFxmSXNyZ2JfaW50ZW50XGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X3NSR0JfZ0FNQV9hbmRfY0hSTSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBpbnQgXGZJc3JnYl9pbnRlbnRcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfc3RyaXBfMTYgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfc3RyaXBfYWxwaGEgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfc3RyaXBfZXJyb3JfbnVtYmVycyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJc3RyaXBfbW9kZVxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3NldF9zd2FwIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X3N3YXBfYWxwaGEgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfdGV4dCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdGV4dHAgXGZQXGZJdGV4dF9wdHJcZlBcZkIsIGludCBcZkludW1fdGV4dFxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX2xldmVsIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZJbGV2ZWxcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZkltZW1fbGV2ZWxcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9zdHJhdGVneSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmSXN0cmF0ZWd5XGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fd2luZG93X2JpdHMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZkl3aW5kb3dfYml0c1xmUFxmQik7XGZQCisKK1xmQnZvaWQgXGZQXGZJcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX21ldGhvZFxmUFxmQiwgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZkltZXRob2QpXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X3RJTUUgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3RpbWVwIFxmSW1vZF90aW1lXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X3RSTlMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSXRyYW5zX2FscGhhXGZQXGZCLCBpbnQgXGZQXGZJbnVtX3RyYW5zXGZQXGZCLCBwbmdfY29sb3JfMTZwIFxmSXRyYW5zX2NvbG9yXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X3RSTlNfdG9fYWxwaGEgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZkJwbmdfdWludF8zMiBwbmdfc2V0X3Vua25vd25fY2h1bmtzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191bmtub3duX2NodW5rcCBcZlBcZkl1bmtub3duc1xmUFxmQiwgaW50IFxmUFxmSW51bVxmUFxmQiwgaW50IFxmSWxvY2F0aW9uXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc2V0X3Vua25vd25fY2h1bmtfbG9jYXRpb24gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgaW50IFxmUFxmSWNodW5rXGZQXGZCLCBpbnQgXGZJbG9jYXRpb25cZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfdXNlcl9saW1pdHMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSXVzZXJfd2lkdGhfbWF4XGZQXGZCLCBwbmdfdWludF8zMiBcZkl1c2VyX2hlaWdodF9tYXhcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfdXNlcl90cmFuc2Zvcm1faW5mbyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3ZvaWRwIFxmUFxmSXVzZXJfdHJhbnNmb3JtX3B0clxmUFxmQiwgaW50IFxmUFxmSXVzZXJfdHJhbnNmb3JtX2RlcHRoXGZQXGZCLCBpbnQgXGZJdXNlcl90cmFuc2Zvcm1fY2hhbm5lbHNcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfd3JpdGVfZm4gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ192b2lkcCBcZlBcZklpb19wdHJcZlBcZkIsIHBuZ19yd19wdHIgXGZQXGZJd3JpdGVfZGF0YV9mblxmUFxmQiwgcG5nX2ZsdXNoX3B0ciBcZklvdXRwdXRfZmx1c2hfZm5cZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfd3JpdGVfc3RhdHVzX2ZuIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfd3JpdGVfc3RhdHVzX3B0ciBcZkl3cml0ZV9yb3dfZm5cZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ19zZXRfd3JpdGVfdXNlcl90cmFuc2Zvcm1fZm4gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ191c2VyX3RyYW5zZm9ybV9wdHIgXGZJd3JpdGVfdXNlcl90cmFuc2Zvcm1fZm5cZlBcZkIpO1xmUAorCitcZkJpbnQgcG5nX3NpZ19jbXAgKHBuZ19ieXRlcCBcZlBcZklzaWdcZlBcZkIsIHBuZ19zaXplX3QgXGZQXGZJc3RhcnRcZlBcZkIsIHBuZ19zaXplX3QgXGZJbnVtX3RvX2NoZWNrXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfc3RhcnRfcmVhZF9pbWFnZSAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3dhcm5pbmcgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9jaGFycCBcZkltZXNzYWdlXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfd3JpdGVfY2h1bmsgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZkljaHVua19uYW1lXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJZGF0YVxmUFxmQiwgcG5nX3NpemVfdCBcZklsZW5ndGhcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ193cml0ZV9jaHVua19kYXRhIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJZGF0YVxmUFxmQiwgcG5nX3NpemVfdCBcZklsZW5ndGhcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ193cml0ZV9jaHVua19lbmQgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ193cml0ZV9jaHVua19zdGFydCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSWNodW5rX25hbWVcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3dyaXRlX2VuZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKKworXGZCdm9pZCBwbmdfd3JpdGVfZmx1c2ggKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZkJ2b2lkIHBuZ193cml0ZV9pbWFnZSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwcCBcZklpbWFnZVxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3dyaXRlX2luZm8gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3dyaXRlX2luZm9fYmVmb3JlX1BMVEUgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3dyaXRlX3BuZyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBpbnQgXGZQXGZJdHJhbnNmb3Jtc1xmUFxmQiwgcG5nX3ZvaWRwIFxmSXBhcmFtc1xmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3dyaXRlX3JvdyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmSXJvd1xmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3dyaXRlX3Jvd3MgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcHAgXGZQXGZJcm93XGZQXGZCLCBwbmdfdWludF8zMiBcZkludW1fcm93c1xmUFxmQik7XGZQCisKK1xmQnZvaWQgcG5nX3dyaXRlX3NpZyAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKKy5TSCBERVNDUklQVElPTgorVGhlCisuSSBsaWJwbmcKK2xpYnJhcnkgc3VwcG9ydHMgZW5jb2RpbmcsIGRlY29kaW5nLCBhbmQgdmFyaW91cyBtYW5pcHVsYXRpb25zIG9mCit0aGUgUG9ydGFibGUgTmV0d29yayBHcmFwaGljcyAoUE5HKSBmb3JtYXQgaW1hZ2UgZmlsZXMuICBJdCB1c2VzIHRoZQorLklSIHpsaWIoMykKK2NvbXByZXNzaW9uIGxpYnJhcnkuCitGb2xsb3dpbmcgaXMgYSBjb3B5IG9mIHRoZSBsaWJwbmctbWFudWFsLnR4dCBmaWxlIHRoYXQgYWNjb21wYW5pZXMgbGlicG5nLgorLlNIIExJQlBORy5UWFQKK2xpYnBuZy1tYW51YWwudHh0IC0gQSBkZXNjcmlwdGlvbiBvbiBob3cgdG8gdXNlIGFuZCBtb2RpZnkgbGlicG5nCisKKyBsaWJwbmcgdmVyc2lvbiAxLjYuMjAgLSBEZWNlbWJlciAzLCAyMDE1CisgVXBkYXRlZCBhbmQgZGlzdHJpYnV0ZWQgYnkgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgPGdsZW5ucnAgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0PgorIENvcHlyaWdodCAoYykgMTk5OC0yMDE1IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorCisgVGhpcyBkb2N1bWVudCBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorIGFuZCBsaWNlbnNlIGluIHBuZy5oCisKKyBCYXNlZCBvbjoKKworIGxpYnBuZyB2ZXJzaW9ucyAwLjk3LCBKYW51YXJ5IDE5OTgsIHRocm91Z2ggMS42LjIwIC0gRGVjZW1iZXIgMywgMjAxNQorIFVwZGF0ZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorIENvcHlyaWdodCAoYykgMTk5OC0yMDE1IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorCisgbGlicG5nIDEuMCBiZXRhIDYgLSB2ZXJzaW9uIDAuOTYgLSBNYXkgMjgsIDE5OTcKKyBVcGRhdGVkIGFuZCBkaXN0cmlidXRlZCBieSBBbmRyZWFzIERpbGdlcgorIENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcgorCisgbGlicG5nIDEuMCBiZXRhIDIgLSB2ZXJzaW9uIDAuODggLSBKYW51YXJ5IDI2LCAxOTk2CisgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQKKyBub3RpY2UgaW4gcG5nLmguIENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYworIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgorCisgVXBkYXRlZC9yZXdyaXR0ZW4gcGVyIHJlcXVlc3QgaW4gdGhlIGxpYnBuZyBGQVEKKyBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgRnJhbmsgSi4gVC4gV29qY2lrCisgRGVjZW1iZXIgMTgsIDE5OTUgJiBKYW51YXJ5IDIwLCAxOTk2CisKKyBUQUJMRSBPRiBDT05URU5UUworCisgICAgSS4gSW50cm9kdWN0aW9uCisgICBJSS4gU3RydWN0dXJlcworICBJSUkuIFJlYWRpbmcKKyAgIElWLiBXcml0aW5nCisgICAgVi4gU2ltcGxpZmllZCBBUEkKKyAgIFZJLiBNb2RpZnlpbmcvQ3VzdG9taXppbmcgbGlicG5nCisgIFZJSS4gTU5HIHN1cHBvcnQKKyBWSUlJLiBDaGFuZ2VzIHRvIExpYnBuZyBmcm9tIHZlcnNpb24gMC44OAorICAgSVguIENoYW5nZXMgdG8gTGlicG5nIGZyb20gdmVyc2lvbiAxLjAueCB0byAxLjIueAorICAgIFguIENoYW5nZXMgdG8gTGlicG5nIGZyb20gdmVyc2lvbiAxLjAueC8xLjIueCB0byAxLjQueAorICAgWEkuIENoYW5nZXMgdG8gTGlicG5nIGZyb20gdmVyc2lvbiAxLjQueCB0byAxLjUueAorICBYSUkuIENoYW5nZXMgdG8gTGlicG5nIGZyb20gdmVyc2lvbiAxLjUueCB0byAxLjYueAorIFhJSUkuIERldGVjdGluZyBsaWJwbmcKKyAgWElWLiBTb3VyY2UgY29kZSByZXBvc2l0b3J5CisgICBYVi4gQ29kaW5nIHN0eWxlCisgIFhWSS4gWTJLIENvbXBsaWFuY2UgaW4gbGlicG5nCisKKy5TSCBJLiBJbnRyb2R1Y3Rpb24KKworVGhpcyBmaWxlIGRlc2NyaWJlcyBob3cgdG8gdXNlIGFuZCBtb2RpZnkgdGhlIFBORyByZWZlcmVuY2UgbGlicmFyeQorKGtub3duIGFzIGxpYnBuZykgZm9yIHlvdXIgb3duIHVzZS4gIEluIGFkZGl0aW9uIHRvIHRoaXMKK2ZpbGUsIGV4YW1wbGUuYyBpcyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQgZm9yIHVzaW5nIHRoZSBsaWJyYXJ5LCBhcworaXQgaXMgaGVhdmlseSBjb21tZW50ZWQgYW5kIHNob3VsZCBpbmNsdWRlIGV2ZXJ5dGhpbmcgbW9zdCBwZW9wbGUKK3dpbGwgbmVlZC4gIFdlIGFzc3VtZSB0aGF0IGxpYnBuZyBpcyBhbHJlYWR5IGluc3RhbGxlZDsgc2VlIHRoZQorSU5TVEFMTCBmaWxlIGZvciBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGNvbmZpZ3VyZSBhbmQgaW5zdGFsbCBsaWJwbmcuCisKK0ZvciBleGFtcGxlcyBvZiBsaWJwbmcgdXNhZ2UsIHNlZSB0aGUgZmlsZXMgImV4YW1wbGUuYyIsICJwbmd0ZXN0LmMiLAorYW5kIHRoZSBmaWxlcyBpbiB0aGUgImNvbnRyaWIiIGRpcmVjdG9yeSwgYWxsIG9mIHdoaWNoIGFyZSBpbmNsdWRlZCBpbgordGhlIGxpYnBuZyBkaXN0cmlidXRpb24uCisKK0xpYnBuZyB3YXMgd3JpdHRlbiBhcyBhIGNvbXBhbmlvbiB0byB0aGUgUE5HIHNwZWNpZmljYXRpb24sIGFzIGEgd2F5CitvZiByZWR1Y2luZyB0aGUgYW1vdW50IG9mIHRpbWUgYW5kIGVmZm9ydCBpdCB0YWtlcyB0byBzdXBwb3J0IHRoZSBQTkcKK2ZpbGUgZm9ybWF0IGluIGFwcGxpY2F0aW9uIHByb2dyYW1zLgorCitUaGUgUE5HIHNwZWNpZmljYXRpb24gKHNlY29uZCBlZGl0aW9uKSwgTm92ZW1iZXIgMjAwMywgaXMgYXZhaWxhYmxlIGFzCithIFczQyBSZWNvbW1lbmRhdGlvbiBhbmQgYXMgYW4gSVNPIFN0YW5kYXJkIChJU08vSUVDIDE1OTQ4OjIwMDQgKEUpKSBhdAorPGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvUkVDLVBORy0yMDAzMTExMC8KK1RoZSBXM0MgYW5kIElTTyBkb2N1bWVudHMgaGF2ZSBpZGVudGljYWwgdGVjaG5pY2FsIGNvbnRlbnQuCisKK1RoZSBQTkctMS4yIHNwZWNpZmljYXRpb24gaXMgYXZhaWxhYmxlIGF0Cis8aHR0cDovL3BuZy1tbmcuc291cmNlZm9yZ2UubmV0L3B1Yi9wbmcvc3BlYy8xLjIvPi4KK0l0IGlzIHRlY2huaWNhbGx5IGVxdWl2YWxlbnQKK3RvIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiAoc2Vjb25kIGVkaXRpb24pIGJ1dCBoYXMgc29tZSBhZGRpdGlvbmFsIG1hdGVyaWFsLgorCitUaGUgUE5HLTEuMCBzcGVjaWZpY2F0aW9uIGlzIGF2YWlsYWJsZSBhcyBSRkMgMjA4MyAKKzxodHRwOi8vcG5nLW1uZy5zb3VyY2Vmb3JnZS5uZXQvcHViL3BuZy9zcGVjLzEuMC8+IGFuZCBhcyBhCitXM0MgUmVjb21tZW5kYXRpb24gPGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1wbmctOTYxMDAxPi4KKworU29tZSBhZGRpdGlvbmFsIGNodW5rcyBhcmUgZGVzY3JpYmVkIGluIHRoZSBzcGVjaWFsLXB1cnBvc2UgcHVibGljIGNodW5rcworZG9jdW1lbnRzIGF0IDxodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9zcGVjL3JlZ2lzdGVyLz4KKworT3RoZXIgaW5mb3JtYXRpb24KK2Fib3V0IFBORywgYW5kIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBsaWJwbmcsIGNhbiBiZSBmb3VuZCBhdCB0aGUgUE5HIGhvbWUKK3BhZ2UsIDxodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy8+LgorCitNb3N0IHVzZXJzIHdpbGwgbm90IGhhdmUgdG8gbW9kaWZ5IHRoZSBsaWJyYXJ5IHNpZ25pZmljYW50bHk7IGFkdmFuY2VkCit1c2VycyBtYXkgd2FudCB0byBtb2RpZnkgaXQgbW9yZS4gIEFsbCBhdHRlbXB0cyB3ZXJlIG1hZGUgdG8gbWFrZSBpdCBhcworY29tcGxldGUgYXMgcG9zc2libGUsIHdoaWxlIGtlZXBpbmcgdGhlIGNvZGUgZWFzeSB0byB1bmRlcnN0YW5kLgorQ3VycmVudGx5LCB0aGlzIGxpYnJhcnkgb25seSBzdXBwb3J0cyBDLiAgU3VwcG9ydCBmb3Igb3RoZXIgbGFuZ3VhZ2VzCitpcyBiZWluZyBjb25zaWRlcmVkLgorCitMaWJwbmcgaGFzIGJlZW4gZGVzaWduZWQgdG8gaGFuZGxlIG11bHRpcGxlIHNlc3Npb25zIGF0IG9uZSB0aW1lLAordG8gYmUgZWFzaWx5IG1vZGlmaWFibGUsIHRvIGJlIHBvcnRhYmxlIHRvIHRoZSB2YXN0IG1ham9yaXR5IG9mCittYWNoaW5lcyAoQU5TSSwgSyZSLCAxNi0sIDMyLSwgYW5kIDY0LWJpdCkgYXZhaWxhYmxlLCBhbmQgdG8gYmUgZWFzeQordG8gdXNlLiAgVGhlIHVsdGltYXRlIGdvYWwgb2YgbGlicG5nIGlzIHRvIHByb21vdGUgdGhlIGFjY2VwdGFuY2Ugb2YKK3RoZSBQTkcgZmlsZSBmb3JtYXQgaW4gd2hhdGV2ZXIgd2F5IHBvc3NpYmxlLiAgV2hpbGUgdGhlcmUgaXMgc3RpbGwKK3dvcmsgdG8gYmUgZG9uZSAoc2VlIHRoZSBUT0RPIGZpbGUpLCBsaWJwbmcgc2hvdWxkIGNvdmVyIHRoZQorbWFqb3JpdHkgb2YgdGhlIG5lZWRzIG9mIGl0cyB1c2Vycy4KKworTGlicG5nIHVzZXMgemxpYiBmb3IgaXRzIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIG9mIFBORyBmaWxlcy4KK0Z1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgemxpYiwgYW5kIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB6bGliLCBjYW4KK2JlIGZvdW5kIGF0IHRoZSB6bGliIGhvbWUgcGFnZSwgPGh0dHA6Ly96bGliLm5ldC8+LgorVGhlIHpsaWIgY29tcHJlc3Npb24gdXRpbGl0eSBpcyBhIGdlbmVyYWwgcHVycG9zZSB1dGlsaXR5IHRoYXQgaXMKK3VzZWZ1bCBmb3IgbW9yZSB0aGFuIFBORyBmaWxlcywgYW5kIGNhbiBiZSB1c2VkIHdpdGhvdXQgbGlicG5nLgorU2VlIHRoZSBkb2N1bWVudGF0aW9uIGRlbGl2ZXJlZCB3aXRoIHpsaWIgZm9yIG1vcmUgZGV0YWlscy4KK1lvdSBjYW4gdXN1YWxseSBmaW5kIHRoZSBzb3VyY2UgZmlsZXMgZm9yIHRoZSB6bGliIHV0aWxpdHkgd2hlcmV2ZXIgeW91CitmaW5kIHRoZSBsaWJwbmcgc291cmNlIGZpbGVzLgorCitMaWJwbmcgaXMgdGhyZWFkIHNhZmUsIHByb3ZpZGVkIHRoZSB0aHJlYWRzIGFyZSB1c2luZyBkaWZmZXJlbnQKK2luc3RhbmNlcyBvZiB0aGUgc3RydWN0dXJlcy4gIEVhY2ggdGhyZWFkIHNob3VsZCBoYXZlIGl0cyBvd24KK3BuZ19zdHJ1Y3QgYW5kIHBuZ19pbmZvIGluc3RhbmNlcywgYW5kIHRodXMgaXRzIG93biBpbWFnZS4KK0xpYnBuZyBkb2VzIG5vdCBwcm90ZWN0IGl0c2VsZiBhZ2FpbnN0IHR3byB0aHJlYWRzIHVzaW5nIHRoZQorc2FtZSBpbnN0YW5jZSBvZiBhIHN0cnVjdHVyZS4KKworLlNIIElJLiBTdHJ1Y3R1cmVzCisKK1RoZXJlIGFyZSB0d28gbWFpbiBzdHJ1Y3R1cmVzIHRoYXQgYXJlIGltcG9ydGFudCB0byBsaWJwbmcsIHBuZ19zdHJ1Y3QKK2FuZCBwbmdfaW5mby4gIEJvdGggYXJlIGludGVybmFsIHN0cnVjdHVyZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIGV4cG9zZWQKK2luIHRoZSBsaWJwbmcgaW50ZXJmYWNlIChhcyBvZiBsaWJwbmcgMS41LjApLgorCitUaGUgcG5nX2luZm8gc3RydWN0dXJlIGlzIGRlc2lnbmVkIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCitQTkcgZmlsZS4gIEF0IG9uZSB0aW1lLCB0aGUgZmllbGRzIG9mIHBuZ19pbmZvIHdlcmUgaW50ZW5kZWQgdG8gYmUKK2RpcmVjdGx5IGFjY2Vzc2libGUgdG8gdGhlIHVzZXIuICBIb3dldmVyLCB0aGlzIHRlbmRlZCB0byBjYXVzZSBwcm9ibGVtcword2l0aCBhcHBsaWNhdGlvbnMgdXNpbmcgZHluYW1pY2FsbHkgbG9hZGVkIGxpYnJhcmllcywgYW5kIGFzIGEgcmVzdWx0CithIHNldCBvZiBpbnRlcmZhY2UgZnVuY3Rpb25zIGZvciBwbmdfaW5mbyAodGhlIHBuZ19nZXRfKigpIGFuZCBwbmdfc2V0XyooKQorZnVuY3Rpb25zKSB3YXMgZGV2ZWxvcGVkLCBhbmQgZGlyZWN0IGFjY2VzcyB0byB0aGUgcG5nX2luZm8gZmllbGRzIHdhcworZGVwcmVjYXRlZC4uCisKK1RoZSBwbmdfc3RydWN0IHN0cnVjdHVyZSBpcyB0aGUgb2JqZWN0IHVzZWQgYnkgdGhlIGxpYnJhcnkgdG8gZGVjb2RlIGEKK3NpbmdsZSBpbWFnZS4gIEFzIG9mIDEuNS4wIHRoaXMgc3RydWN0dXJlIGlzIGFsc28gbm90IGV4cG9zZWQuCisKK0FsbW9zdCBhbGwgbGlicG5nIEFQSXMgcmVxdWlyZSBhIHBvaW50ZXIgdG8gYSBwbmdfc3RydWN0IGFzIHRoZSBmaXJzdCBhcmd1bWVudC4KK01hbnkgKGluIHBhcnRpY3VsYXIgdGhlIHBuZ19zZXQgYW5kIHBuZ19nZXQgQVBJcykgYWxzbyByZXF1aXJlIGEgcG9pbnRlcgordG8gcG5nX2luZm8gYXMgdGhlIHNlY29uZCBhcmd1bWVudC4gIFNvbWUgYXBwbGljYXRpb24gdmlzaWJsZSBtYWNyb3MKK2RlZmluZWQgaW4gcG5nLmggZGVzaWduZWQgZm9yIGJhc2ljIGRhdGEgYWNjZXNzIChyZWFkaW5nIGFuZCB3cml0aW5nCitpbnRlZ2VycyBpbiB0aGUgUE5HIGZvcm1hdCkgZG9uJ3QgdGFrZSBhIHBuZ19pbmZvIHBvaW50ZXIsIGJ1dCBpdCdzIGFsbW9zdAorYWx3YXlzIHNhZmUgdG8gYXNzdW1lIHRoYXQgYSAocG5nX3N0cnVjdCopIGhhcyB0byBiZSBwYXNzZWQgdG8gY2FsbCBhbiBBUEkKK2Z1bmN0aW9uLgorCitZb3UgY2FuIGhhdmUgbW9yZSB0aGFuIG9uZSBwbmdfaW5mbyBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIGFuIGltYWdlLAorYXMgaWxsdXN0cmF0ZWQgaW4gcG5ndGVzdC5jLCBvbmUgZm9yIGluZm9ybWF0aW9uIHZhbGlkIHByaW9yIHRvIHRoZQorSURBVCBjaHVua3MgYW5kIGFub3RoZXIgKGNhbGxlZCAiZW5kX2luZm8iIGJlbG93KSBmb3IgdGhpbmdzIGFmdGVyIHRoZW0uCisKK1RoZSBwbmcuaCBoZWFkZXIgZmlsZSBpcyBhbiBpbnZhbHVhYmxlIHJlZmVyZW5jZSBmb3IgcHJvZ3JhbW1pbmcgd2l0aCBsaWJwbmcuCitBbmQgd2hpbGUgSSdtIG9uIHRoZSB0b3BpYywgbWFrZSBzdXJlIHlvdSBpbmNsdWRlIHRoZSBsaWJwbmcgaGVhZGVyIGZpbGU6CisKKyNpbmNsdWRlIDxwbmcuaD4KKworYW5kIGFsc28gKGFzIG9mIGxpYnBuZy0xLjUuMCkgdGhlIHpsaWIgaGVhZGVyIGZpbGUsIGlmIHlvdSBuZWVkIGl0OgorCisjaW5jbHVkZSA8emxpYi5oPgorCisuU1MgVHlwZXMKKworVGhlIHBuZy5oIGhlYWRlciBmaWxlIGRlZmluZXMgYSBudW1iZXIgb2YgaW50ZWdyYWwgdHlwZXMgdXNlZCBieSB0aGUKK0FQSXMuICBNb3N0IG9mIHRoZXNlIGFyZSBmYWlybHkgb2J2aW91czsgZm9yIGV4YW1wbGUgdHlwZXMgY29ycmVzcG9uZGluZwordG8gaW50ZWdlcnMgb2YgcGFydGljdWxhciBzaXplcyBhbmQgdHlwZXMgZm9yIHBhc3NpbmcgY29sb3IgdmFsdWVzLgorCitPbmUgZXhjZXB0aW9uIGlzIGhvdyBub24taW50ZWdyYWwgbnVtYmVycyBhcmUgaGFuZGxlZC4gIEZvciBhcHBsaWNhdGlvbgorY29udmVuaWVuY2UgbW9zdCBBUElzIHRoYXQgdGFrZSBzdWNoIG51bWJlcnMgaGF2ZSBDIChkb3VibGUpIGFyZ3VtZW50czsKK2hvd2V2ZXIsIGludGVybmFsbHkgUE5HLCBhbmQgbGlicG5nLCB1c2UgMzIgYml0IHNpZ25lZCBpbnRlZ2VycyBhbmQgZW5jb2RlCit0aGUgdmFsdWUgYnkgbXVsdGlwbHlpbmcgYnkgMTAwLDAwMC4gIEFzIG9mIGxpYnBuZyAxLjUuMCBhIGNvbnZlbmllbmNlCittYWNybyBQTkdfRlBfMSBpcyBkZWZpbmVkIGluIHBuZy5oIGFsb25nIHdpdGggYSB0eXBlIChwbmdfZml4ZWRfcG9pbnQpCit3aGljaCBpcyBzaW1wbHkgKHBuZ19pbnRfMzIpLgorCitBbGwgQVBJcyB0aGF0IHRha2UgKGRvdWJsZSkgYXJndW1lbnRzIGFsc28gaGF2ZSBhIG1hdGNoaW5nIEFQSSB0aGF0Cit0YWtlcyB0aGUgY29ycmVzcG9uZGluZyBmaXhlZCBwb2ludCBpbnRlZ2VyIGFyZ3VtZW50cy4gIFRoZSBmaXhlZCBwb2ludAorQVBJIGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBmbG9hdGluZyBwb2ludCBvbmUgd2l0aCAiX2ZpeGVkIiBhcHBlbmRlZC4KK1RoZSBhY3R1YWwgcmFuZ2Ugb2YgdmFsdWVzIHBlcm1pdHRlZCBpbiB0aGUgQVBJcyBpcyBmcmVxdWVudGx5IGxlc3MgdGhhbgordGhlIGZ1bGwgcmFuZ2Ugb2YgKHBuZ19maXhlZF9wb2ludCkgKFwtMjE0NzQgdG8gKzIxNDc0KS4gIFdoZW4gQVBJcyByZXF1aXJlCithIG5vbi1uZWdhdGl2ZSBhcmd1bWVudCB0aGUgdHlwZSBpcyByZWNvcmRlZCBhcyBwbmdfdWludF8zMiBhYm92ZS4gIENvbnN1bHQKK3RoZSBoZWFkZXIgZmlsZSBhbmQgdGhlIHRleHQgYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK1NwZWNpYWwgY2FyZSBtdXN0IGJlIHRha2Ugd2l0aCBzQ0FMIGNodW5rIGhhbmRsaW5nIGJlY2F1c2UgdGhlIGNodW5rIGl0c2VsZgordXNlcyBub24taW50ZWdyYWwgdmFsdWVzIGVuY29kZWQgYXMgc3RyaW5ncyBjb250YWluaW5nIGRlY2ltYWwgZmxvYXRpbmcgcG9pbnQKK251bWJlcnMuICBTZWUgdGhlIGNvbW1lbnRzIGluIHRoZSBoZWFkZXIgZmlsZS4KKworLlNTIENvbmZpZ3VyYXRpb24KKworVGhlIG1haW4gaGVhZGVyIGZpbGUgZnVuY3Rpb24gZGVjbGFyYXRpb25zIGFyZSBmcmVxdWVudGx5IHByb3RlY3RlZCBieSBDCitwcmVwcm9jZXNzaW5nIGRpcmVjdGl2ZXMgb2YgdGhlIGZvcm06CisKKyAgICAjaWZkZWYgUE5HX2ZlYXR1cmVfU1VQUE9SVEVECisgICAgZGVjbGFyZS1mdW5jdGlvbgorICAgICNlbmRpZgorICAgIC4uLgorICAgICNpZmRlZiBQTkdfZmVhdHVyZV9TVVBQT1JURUQKKyAgICB1c2UtZnVuY3Rpb24KKyAgICAjZW5kaWYKKworVGhlIGxpYnJhcnkgY2FuIGJlIGJ1aWx0IHdpdGhvdXQgc3VwcG9ydCBmb3IgdGhlc2UgQVBJcywgYWx0aG91Z2ggYQorc3RhbmRhcmQgYnVpbGQgd2lsbCBoYXZlIGFsbCBpbXBsZW1lbnRlZCBBUElzLiAgQXBwbGljYXRpb24gcHJvZ3JhbXMKK3Nob3VsZCBjaGVjayB0aGUgZmVhdHVyZSBtYWNyb3MgYmVmb3JlIHVzaW5nIGFuIEFQSSBmb3IgbWF4aW11bQorcG9ydGFiaWxpdHkuICBGcm9tIGxpYnBuZyAxLjUuMCB0aGUgZmVhdHVyZSBtYWNyb3Mgc2V0IGR1cmluZyB0aGUgYnVpbGQKK29mIGxpYnBuZyBhcmUgcmVjb3JkZWQgaW4gdGhlIGhlYWRlciBmaWxlICJwbmdsaWJjb25mLmgiIGFuZCB0aGlzIGZpbGUKK2lzIGFsd2F5cyBpbmNsdWRlZCBieSBwbmcuaC4KKworSWYgeW91IGRvbid0IG5lZWQgdG8gY2hhbmdlIHRoZSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgZGVmYXVsdCwgc2tpcCB0bwordGhlIG5leHQgc2VjdGlvbiAoIlJlYWRpbmciKS4KKworTm90aWNlIHRoYXQgc29tZSBvZiB0aGUgbWFrZWZpbGVzIGluIHRoZSAnc2NyaXB0cycgZGlyZWN0b3J5IGFuZCAoaW4gMS41LjApIGFsbAorb2YgdGhlIGJ1aWxkIHByb2plY3QgZmlsZXMgaW4gdGhlICdwcm9qZWN0cycgZGlyZWN0b3J5IHNpbXBseSBjb3B5CitzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdCB0byBwbmdsaWJjb25mLmguICBUaGlzIG1lYW5zIHRoYXQgdGhlc2UgYnVpbGQKK3N5c3RlbXMgZG8gbm90IHBlcm1pdCBlYXN5IGF1dG8tY29uZmlndXJhdGlvbiBvZiB0aGUgbGlicmFyeSAtIHRoZXkgb25seQorc3VwcG9ydCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLgorCitUaGUgZWFzaWVzdCB3YXkgdG8gbWFrZSBtaW5vciBjaGFuZ2VzIHRvIHRoZSBsaWJwbmcgY29uZmlndXJhdGlvbiB3aGVuCithdXRvLWNvbmZpZ3VyYXRpb24gaXMgc3VwcG9ydGVkIGlzIHRvIGFkZCBkZWZpbml0aW9ucyB0byB0aGUgY29tbWFuZCBsaW5lCit1c2luZyAodHlwaWNhbGx5KSBDUFBGTEFHUy4gIEZvciBleGFtcGxlOgorCitDUFBGTEFHUz1cLURQTkdfTk9fRkxPQVRJTkdfQVJJVEhNRVRJQworCit3aWxsIGNoYW5nZSB0aGUgaW50ZXJuYWwgbGlicG5nIG1hdGggaW1wbGVtZW50YXRpb24gZm9yIGdhbW1hIGNvcnJlY3Rpb24gYW5kCitvdGhlciBhcml0aG1ldGljIGNhbGN1bGF0aW9ucyB0byBmaXhlZCBwb2ludCwgYXZvaWRpbmcgdGhlIG5lZWQgZm9yIGZhc3QKK2Zsb2F0aW5nIHBvaW50IHN1cHBvcnQuICBUaGUgcmVzdWx0IGNhbiBiZSBzZWVuIGluIHRoZSBnZW5lcmF0ZWQgcG5nbGliY29uZi5oIC0KK21ha2Ugc3VyZSBpdCBjb250YWlucyB0aGUgY2hhbmdlZCBmZWF0dXJlIG1hY3JvIHNldHRpbmcuCisKK0lmIHlvdSBuZWVkIHRvIG1ha2UgbW9yZSBleHRlbnNpdmUgY29uZmlndXJhdGlvbiBjaGFuZ2VzIC0gbW9yZSB0aGFuIG9uZSBvciB0d28KK2ZlYXR1cmUgbWFjcm8gc2V0dGluZ3MgLSB5b3UgY2FuIGVpdGhlciBhZGQgXC1EUE5HX1VTRVJfQ09ORklHIHRvIHRoZSBidWlsZAorY29tbWFuZCBsaW5lIGFuZCBwdXQgYSBsaXN0IG9mIGZlYXR1cmUgbWFjcm8gc2V0dGluZ3MgaW4gcG5ndXNyLmggb3IgeW91IGNhbiBzZXQKK0RGQV9YVFJBIChhIG1ha2VmaWxlIHZhcmlhYmxlKSB0byBhIGZpbGUgY29udGFpbmluZyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBpbiB0aGUKK2Zvcm0gb2YgJ29wdGlvbicgc2V0dGluZ3MuCisKK0EuIENoYW5naW5nIHBuZ2xpYmNvbmYuaAorCitBIHZhcmlldHkgb2YgbWV0aG9kcyBleGlzdCB0byBidWlsZCBsaWJwbmcuICBOb3QgYWxsIG9mIHRoZXNlIHN1cHBvcnQKK3JlY29uZmlndXJhdGlvbiBvZiBwbmdsaWJjb25mLmguICBUbyByZWNvbmZpZ3VyZSBwbmdsaWJjb25mLmggaXQgbXVzdCBlaXRoZXIgYmUKK3JlYnVpbHQgZnJvbSBzY3JpcHRzL3BuZ2xpYmNvbmYuZGZhIHVzaW5nIGF3ayBvciBpdCBtdXN0IGJlIGVkaXRlZCBieSBoYW5kLgorCitIYW5kIGVkaXRpbmcgaXMgYWNoaWV2ZWQgYnkgY29weWluZyBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdCB0bworcG5nbGliY29uZi5oIGFuZCBjaGFuZ2luZyB0aGUgbGluZXMgZGVmaW5pbmcgdGhlIHN1cHBvcnRlZCBmZWF0dXJlcywgcGF5aW5nCit2ZXJ5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgJ29wdGlvbicgaW5mb3JtYXRpb24gaW4gc2NyaXB0cy9wbmdsaWJjb25mLmRmYQordGhhdCBkZXNjcmliZXMgdGhvc2UgZmVhdHVyZXMgYW5kIHRoZWlyIHJlcXVpcmVtZW50cy4gIFRoaXMgaXMgZWFzeSB0byBnZXQKK3dyb25nLgorCitCLiBDb25maWd1cmF0aW9uIHVzaW5nIERGQV9YVFJBCisKK1JlYnVpbGRpbmcgZnJvbSBwbmdsaWJjb25mLmRmYSBpcyBlYXN5IGlmIGEgZnVuY3Rpb25pbmcgJ2F3aycsIG9yIGEgbGF0ZXIKK3ZhcmlhbnQgc3VjaCBhcyAnbmF3aycgb3IgJ2dhd2snLCBpcyBhdmFpbGFibGUuICBUaGUgY29uZmlndXJlIGJ1aWxkIHdpbGwKK2F1dG9tYXRpY2FsbHkgZmluZCBhbiBhcHByb3ByaWF0ZSBhd2sgYW5kIGJ1aWxkIHBuZ2xpYmNvbmYuaC4KK1RoZSBzY3JpcHRzL3BuZ2xpYmNvbmYubWFrIGZpbGUgY29udGFpbnMgYSBzZXQgb2YgbWFrZSBydWxlcyBmb3IgZG9pbmcgdGhlCitzYW1lIHRoaW5nIGlmIGNvbmZpZ3VyZSBpcyBub3QgdXNlZCwgYW5kIG1hbnkgb2YgdGhlIG1ha2VmaWxlcyBpbiB0aGUgc2NyaXB0cworZGlyZWN0b3J5IHVzZSB0aGlzIGFwcHJvYWNoLgorCitXaGVuIHJlYnVpbGRpbmcgc2ltcGx5IHdyaXRlIGEgbmV3IGZpbGUgY29udGFpbmluZyBjaGFuZ2VkIG9wdGlvbnMgYW5kIHNldAorREZBX1hUUkEgdG8gdGhlIG5hbWUgb2YgdGhpcyBmaWxlLiAgVGhpcyBjYXVzZXMgdGhlIGJ1aWxkIHRvIGFwcGVuZCB0aGUgbmV3IGZpbGUKK3RvIHRoZSBlbmQgb2Ygc2NyaXB0cy9wbmdsaWJjb25mLmRmYS4gIFRoZSBwbmd1c3IuZGZhIGZpbGUgc2hvdWxkIGNvbnRhaW4gbGluZXMKK29mIHRoZSBmb2xsb3dpbmcgZm9ybXM6CisKK2V2ZXJ5dGhpbmcgPSBvZmYKKworVGhpcyB0dXJucyBhbGwgb3B0aW9uYWwgZmVhdHVyZXMgb2ZmLiAgSW5jbHVkZSBpdCBhdCB0aGUgc3RhcnQgb2YgcG5ndXNyLmRmYSB0bworbWFrZSBpdCBlYXNpZXIgdG8gYnVpbGQgYSBtaW5pbWFsIGNvbmZpZ3VyYXRpb24uICBZb3Ugd2lsbCBuZWVkIHRvIHR1cm4gYXQgbGVhc3QKK3NvbWUgZmVhdHVyZXMgb24gYWZ0ZXJ3YXJkIHRvIGVuYWJsZSBlaXRoZXIgcmVhZGluZyBvciB3cml0aW5nIGNvZGUsIG9yIGJvdGguCisKK29wdGlvbiBmZWF0dXJlIG9uCitvcHRpb24gZmVhdHVyZSBvZmYKKworRW5hYmxlIG9yIGRpc2FibGUgYSBzaW5nbGUgZmVhdHVyZS4gIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGVuYWJsZSBvdGhlcgorZmVhdHVyZXMgcmVxdWlyZWQgYnkgYSBmZWF0dXJlIHRoYXQgaXMgdHVybmVkIG9uIG9yIGRpc2FibGUgb3RoZXIgZmVhdHVyZXMgdGhhdAorcmVxdWlyZSBhIGZlYXR1cmUgd2hpY2ggaXMgdHVybmVkIG9mZi4gIENvbmZsaWN0aW5nIHNldHRpbmdzIHdpbGwgY2F1c2UgYW4gZXJyb3IKK21lc3NhZ2UgdG8gYmUgZW1pdHRlZCBieSBhd2suCisKK3NldHRpbmcgZmVhdHVyZSBkZWZhdWx0IHZhbHVlCisKK0NoYW5nZXMgdGhlIGRlZmF1bHQgdmFsdWUgb2Ygc2V0dGluZyAnZmVhdHVyZScgdG8gJ3ZhbHVlJy4gIFRoZXJlIGFyZSBhIHNtYWxsCitudW1iZXIgb2Ygc2V0dGluZ3MgbGlzdGVkIGF0IHRoZSB0b3Agb2YgcG5nbGliY29uZi5oLCB0aGV5IGFyZSBkb2N1bWVudGVkIGluIHRoZQorc291cmNlIGNvZGUuICBNb3N0IG9mIHRoZXNlIHZhbHVlcyBoYXZlIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucyBmb3IgdGhlIGxpYnJhcnkKK2J1dCBtb3N0IG9mIHRoZW0gaGF2ZSBubyB2aXNpYmxlIGVmZmVjdCBvbiB0aGUgQVBJLiAgU29tZSBjYW4gYWxzbyBiZSBvdmVycmlkZGVuCitmcm9tIHRoZSBBUEkuCisKK1RoaXMgbWV0aG9kIG9mIGJ1aWxkaW5nIGEgY3VzdG9taXplZCBwbmdsaWJjb25mLmggaXMgaWxsdXN0cmF0ZWQgaW4KK2NvbnRyaWIvcG5nbWluaW0vKi4gIFNlZSB0aGUgIiQoUE5HQ09ORik6IiB0YXJnZXQgaW4gdGhlIG1ha2VmaWxlIGFuZAorcG5ndXNyLmRmYSBpbiB0aGVzZSBkaXJlY3Rvcmllcy4KKworQy4gQ29uZmlndXJhdGlvbiB1c2luZyBQTkdfVVNFUl9DT05GSUcKKworSWYgXC1EUE5HX1VTRVJfQ09ORklHIGlzIGFkZGVkIHRvIHRoZSBDUFBGTEFHUyB3aGVuIHBuZ2xpYmNvbmYuaCBpcyBidWlsdCwKK3RoZSBmaWxlIHBuZ3Vzci5oIHdpbGwgYXV0b21hdGljYWxseSBiZSBpbmNsdWRlZCBiZWZvcmUgdGhlIG9wdGlvbnMgaW4KK3NjcmlwdHMvcG5nbGliY29uZi5kZmEgYXJlIHByb2Nlc3NlZC4gIFlvdXIgcG5ndXNyLmggZmlsZSBzaG91bGQgY29udGFpbiBvbmx5CittYWNybyBkZWZpbml0aW9ucyB0dXJuaW5nIGZlYXR1cmVzIG9uIG9yIG9mZiBvciBzZXR0aW5nIHNldHRpbmdzLgorCitBcGFydCBmcm9tIHRoZSBnbG9iYWwgc2V0dGluZyAiZXZlcnl0aGluZyA9IG9mZiIgYWxsIHRoZSBvcHRpb25zIGxpc3RlZCBhYm92ZQorY2FuIGJlIHNldCB1c2luZyBtYWNyb3MgaW4gcG5ndXNyLmg6CisKKyNkZWZpbmUgUE5HX2ZlYXR1cmVfU1VQUE9SVEVECisKK2lzIGVxdWl2YWxlbnQgdG86CisKK29wdGlvbiBmZWF0dXJlIG9uCisKKyNkZWZpbmUgUE5HX05PX2ZlYXR1cmUKKworaXMgZXF1aXZhbGVudCB0bzoKKworb3B0aW9uIGZlYXR1cmUgb2ZmCisKKyNkZWZpbmUgUE5HX2ZlYXR1cmUgdmFsdWUKKworaXMgZXF1aXZhbGVudCB0bzoKKworc2V0dGluZyBmZWF0dXJlIGRlZmF1bHQgdmFsdWUKKworTm90aWNlIHRoYXQgaW4gYm90aCBjYXNlcywgcG5ndXNyLmRmYSBhbmQgcG5ndXNyLmgsIHRoZSBjb250ZW50cyBvZiB0aGUKK3BuZ3VzciBmaWxlIHlvdSBzdXBwbHkgb3ZlcnJpZGUgdGhlIGNvbnRlbnRzIG9mIHNjcmlwdHMvcG5nbGliY29uZi5kZmEKKworSWYgY29uZnVzaW5nIG9yIGluY29tcHJlaGVuc2libGUgYmVoYXZpb3IgcmVzdWx0cyBpdCBpcyBwb3NzaWJsZSB0bworZXhhbWluZSB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgcG5nbGliY29uZi5kZm4gdG8gZmluZCB0aGUgZnVsbCBzZXQgb2YKK2RlcGVuZGVuY3kgaW5mb3JtYXRpb24gZm9yIGVhY2ggc2V0dGluZyBhbmQgb3B0aW9uLiAgU2ltcGx5IGxvY2F0ZSB0aGUKK2ZlYXR1cmUgaW4gdGhlIGZpbGUgYW5kIHJlYWQgdGhlIEMgY29tbWVudHMgdGhhdCBwcmVjZWRlIGl0LgorCitUaGlzIG1ldGhvZCBpcyBhbHNvIGlsbHVzdHJhdGVkIGluIHRoZSBjb250cmliL3BuZ21pbmltLyogbWFrZWZpbGVzIGFuZAorcG5ndXNyLmguCisKKy5TSCBJSUkuIFJlYWRpbmcKKworV2UnbGwgbm93IHdhbGsgeW91IHRocm91Z2ggdGhlIHBvc3NpYmxlIGZ1bmN0aW9ucyB0byBjYWxsIHdoZW4gcmVhZGluZworaW4gYSBQTkcgZmlsZSBzZXF1ZW50aWFsbHksIGJyaWVmbHkgZXhwbGFpbmluZyB0aGUgc3ludGF4IGFuZCBwdXJwb3NlCitvZiBlYWNoIG9uZS4gIFNlZSBleGFtcGxlLmMgYW5kIHBuZy5oIGZvciBtb3JlIGRldGFpbC4gIFdoaWxlCitwcm9ncmVzc2l2ZSByZWFkaW5nIGlzIGNvdmVyZWQgaW4gdGhlIG5leHQgc2VjdGlvbiwgeW91IHdpbGwgc3RpbGwKK25lZWQgc29tZSBvZiB0aGUgZnVuY3Rpb25zIGRpc2N1c3NlZCBpbiB0aGlzIHNlY3Rpb24gdG8gcmVhZCBhIFBORworZmlsZS4KKworLlNTIFNldHVwCisKK1lvdSB3aWxsIHdhbnQgdG8gZG8gdGhlIEkvTyBpbml0aWFsaXphdGlvbigqKSBiZWZvcmUgeW91IGdldCBpbnRvIGxpYnBuZywKK3NvIGlmIGl0IGRvZXNuJ3Qgd29yaywgeW91IGRvbid0IGhhdmUgbXVjaCB0byB1bmRvLiAgT2YgY291cnNlLCB5b3UKK3dpbGwgYWxzbyB3YW50IHRvIGluc3VyZSB0aGF0IHlvdSBhcmUsIGluIGZhY3QsIGRlYWxpbmcgd2l0aCBhIFBORworZmlsZS4gIExpYnBuZyBwcm92aWRlcyBhIHNpbXBsZSBjaGVjayB0byBzZWUgaWYgYSBmaWxlIGlzIGEgUE5HIGZpbGUuCitUbyB1c2UgaXQsIHBhc3MgaW4gdGhlIGZpcnN0IDEgdG8gOCBieXRlcyBvZiB0aGUgZmlsZSB0byB0aGUgZnVuY3Rpb24KK3BuZ19zaWdfY21wKCksIGFuZCBpdCB3aWxsIHJldHVybiAwIChmYWxzZSkgaWYgdGhlIGJ5dGVzIG1hdGNoIHRoZQorY29ycmVzcG9uZGluZyBieXRlcyBvZiB0aGUgUE5HIHNpZ25hdHVyZSwgb3Igbm9uemVybyAodHJ1ZSkgb3RoZXJ3aXNlLgorT2YgY291cnNlLCB0aGUgbW9yZSBieXRlcyB5b3UgcGFzcyBpbiwgdGhlIGdyZWF0ZXIgdGhlIGFjY3VyYWN5IG9mIHRoZQorcHJlZGljdGlvbi4KKworSWYgeW91IGFyZSBpbnRlbmRpbmcgdG8ga2VlcCB0aGUgZmlsZSBwb2ludGVyIG9wZW4gZm9yIHVzZSBpbiBsaWJwbmcsCit5b3UgbXVzdCBlbnN1cmUgeW91IGRvbid0IHJlYWQgbW9yZSB0aGFuIDggYnl0ZXMgZnJvbSB0aGUgYmVnaW5uaW5nCitvZiB0aGUgZmlsZSwgYW5kIHlvdSBhbHNvIGhhdmUgdG8gbWFrZSBhIGNhbGwgdG8gcG5nX3NldF9zaWdfYnl0ZXMoKQord2l0aCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHlvdSByZWFkIGZyb20gdGhlIGJlZ2lubmluZy4gIExpYnBuZyB3aWxsCit0aGVuIG9ubHkgY2hlY2sgdGhlIGJ5dGVzIChpZiBhbnkpIHRoYXQgeW91ciBwcm9ncmFtIGRpZG4ndCByZWFkLgorCisoKik6IElmIHlvdSBhcmUgbm90IHVzaW5nIHRoZSBzdGFuZGFyZCBJL08gZnVuY3Rpb25zLCB5b3Ugd2lsbCBuZWVkCit0byByZXBsYWNlIHRoZW0gd2l0aCBjdXN0b20gZnVuY3Rpb25zLiAgU2VlIHRoZSBkaXNjdXNzaW9uIHVuZGVyCitDdXN0b21pemluZyBsaWJwbmcuCisKKyAgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVfbmFtZSwgInJiIik7CisgICAgaWYgKCFmcCkKKyAgICB7CisgICAgICAgcmV0dXJuIChFUlJPUik7CisgICAgfQorCisgICAgaWYgKGZyZWFkKGhlYWRlciwgMSwgbnVtYmVyLCBmcCkgIT0gbnVtYmVyKQorICAgIHsKKyAgICAgICByZXR1cm4gKEVSUk9SKTsKKyAgICB9CisKKyAgICBpc19wbmcgPSAhcG5nX3NpZ19jbXAoaGVhZGVyLCAwLCBudW1iZXIpOworICAgIGlmICghaXNfcG5nKQorICAgIHsKKyAgICAgICByZXR1cm4gKE5PVF9QTkcpOworICAgIH0KKworTmV4dCwgcG5nX3N0cnVjdCBhbmQgcG5nX2luZm8gbmVlZCB0byBiZSBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkLiAgSW4KK29yZGVyIHRvIGVuc3VyZSB0aGF0IHRoZSBzaXplIG9mIHRoZXNlIHN0cnVjdHVyZXMgaXMgY29ycmVjdCBldmVuIHdpdGggYQorZHluYW1pY2FsbHkgbGlua2VkIGxpYnBuZywgdGhlcmUgYXJlIGZ1bmN0aW9ucyB0byBpbml0aWFsaXplIGFuZAorYWxsb2NhdGUgdGhlIHN0cnVjdHVyZXMuICBXZSBhbHNvIHBhc3MgdGhlIGxpYnJhcnkgdmVyc2lvbiwgb3B0aW9uYWwKK3BvaW50ZXJzIHRvIGVycm9yIGhhbmRsaW5nIGZ1bmN0aW9ucywgYW5kIGEgcG9pbnRlciB0byBhIGRhdGEgc3RydWN0IGZvcgordXNlIGJ5IHRoZSBlcnJvciBmdW5jdGlvbnMsIGlmIG5lY2Vzc2FyeSAodGhlIHBvaW50ZXIgYW5kIGZ1bmN0aW9ucyBjYW4KK2JlIE5VTEwgaWYgdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlcnMgYXJlIHRvIGJlIHVzZWQpLiAgU2VlIHRoZSBzZWN0aW9uCitvbiBDaGFuZ2VzIHRvIExpYnBuZyBiZWxvdyByZWdhcmRpbmcgdGhlIG9sZCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMuCitUaGUgc3RydWN0dXJlIGFsbG9jYXRpb24gZnVuY3Rpb25zIHF1aWV0bHkgcmV0dXJuIE5VTEwgaWYgdGhleSBmYWlsIHRvCitjcmVhdGUgdGhlIHN0cnVjdHVyZSwgc28geW91ciBhcHBsaWNhdGlvbiBzaG91bGQgY2hlY2sgZm9yIHRoYXQuCisKKyAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdAorICAgICAgICAoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCAocG5nX3ZvaWRwKXVzZXJfZXJyb3JfcHRyLAorICAgICAgICB1c2VyX2Vycm9yX2ZuLCB1c2VyX3dhcm5pbmdfZm4pOworCisgICAgaWYgKCFwbmdfcHRyKQorICAgICAgIHJldHVybiAoRVJST1IpOworCisgICAgcG5nX2luZm9wIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKKworICAgIGlmICghaW5mb19wdHIpCisgICAgeworICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLAorICAgICAgICAgICAocG5nX2luZm9wcClOVUxMLCAocG5nX2luZm9wcClOVUxMKTsKKyAgICAgICByZXR1cm4gKEVSUk9SKTsKKyAgICB9CisKK0lmIHlvdSB3YW50IHRvIHVzZSB5b3VyIG93biBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcywKK3VzZSBhIGxpYnBuZyB0aGF0IHdhcyBidWlsdCB3aXRoIFBOR19VU0VSX01FTV9TVVBQT1JURUQgZGVmaW5lZCwgYW5kIHVzZQorcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yKCkgaW5zdGVhZCBvZiBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KCk6CisKKyAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yCisgICAgICAgIChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIChwbmdfdm9pZHApdXNlcl9lcnJvcl9wdHIsCisgICAgICAgIHVzZXJfZXJyb3JfZm4sIHVzZXJfd2FybmluZ19mbiwgKHBuZ192b2lkcCkKKyAgICAgICAgdXNlcl9tZW1fcHRyLCB1c2VyX21hbGxvY19mbiwgdXNlcl9mcmVlX2ZuKTsKKworVGhlIGVycm9yIGhhbmRsaW5nIHJvdXRpbmVzIHBhc3NlZCB0byBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KCkKK2FuZCB0aGUgbWVtb3J5IGFsbG9jL2ZyZWUgcm91dGluZXMgcGFzc2VkIHRvIHBuZ19jcmVhdGVfc3RydWN0XzIoKQorYXJlIG9ubHkgbmVjZXNzYXJ5IGlmIHlvdSBhcmUgbm90IHVzaW5nIHRoZSBsaWJwbmcgc3VwcGxpZWQgZXJyb3IKK2hhbmRsaW5nIGFuZCBtZW1vcnkgYWxsb2MvZnJlZSBmdW5jdGlvbnMuCisKK1doZW4gbGlicG5nIGVuY291bnRlcnMgYW4gZXJyb3IsIGl0IGV4cGVjdHMgdG8gbG9uZ2ptcCBiYWNrCit0byB5b3VyIHJvdXRpbmUuICBUaGVyZWZvcmUsIHlvdSB3aWxsIG5lZWQgdG8gY2FsbCBzZXRqbXAgYW5kIHBhc3MKK3lvdXIgcG5nX2ptcGJ1ZihwbmdfcHRyKS4gIElmIHlvdSByZWFkIHRoZSBmaWxlIGZyb20gZGlmZmVyZW50Cityb3V0aW5lcywgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhlIGxvbmdqbXAgYnVmZmVyIGV2ZXJ5IHRpbWUgeW91IGVudGVyCithIG5ldyByb3V0aW5lIHRoYXQgd2lsbCBjYWxsIGEgcG5nXyooKSBmdW5jdGlvbi4KKworU2VlIHlvdXIgZG9jdW1lbnRhdGlvbiBvZiBzZXRqbXAvbG9uZ2ptcCBmb3IgeW91ciBjb21waWxlciBmb3IgbW9yZQoraW5mb3JtYXRpb24gb24gc2V0am1wL2xvbmdqbXAuICBTZWUgdGhlIGRpc2N1c3Npb24gb24gbGlicG5nIGVycm9yCitoYW5kbGluZyBpbiB0aGUgQ3VzdG9taXppbmcgTGlicG5nIHNlY3Rpb24gYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24KK29uIHRoZSBsaWJwbmcgZXJyb3IgaGFuZGxpbmcuICBJZiBhbiBlcnJvciBvY2N1cnMsIGFuZCBsaWJwbmcgbG9uZ2ptcCdzCitiYWNrIHRvIHlvdXIgc2V0am1wLCB5b3Ugd2lsbCB3YW50IHRvIGNhbGwgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoKSB0bworZnJlZSBhbnkgbWVtb3J5LgorCisgICAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZ19wdHIpKSkKKyAgICB7CisgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwKKyAgICAgICAgICAgJmVuZF9pbmZvKTsKKyAgICAgICBmY2xvc2UoZnApOworICAgICAgIHJldHVybiAoRVJST1IpOworICAgIH0KKworUGFzcyAocG5nX2luZm9wcClOVUxMIGluc3RlYWQgb2YgJmVuZF9pbmZvIGlmIHlvdSBkaWRuJ3QgY3JlYXRlCithbiBlbmRfaW5mbyBzdHJ1Y3R1cmUuCisKK0lmIHlvdSB3b3VsZCByYXRoZXIgYXZvaWQgdGhlIGNvbXBsZXhpdHkgb2Ygc2V0am1wL2xvbmdqbXAgaXNzdWVzLAoreW91IGNhbiBjb21waWxlIGxpYnBuZyB3aXRoIFBOR19OT19TRVRKTVAsIGluIHdoaWNoIGNhc2UKK2Vycm9ycyB3aWxsIHJlc3VsdCBpbiBhIGNhbGwgdG8gUE5HX0FCT1JUKCkgd2hpY2ggZGVmYXVsdHMgdG8gYWJvcnQoKS4KKworWW91IGNhbiAjZGVmaW5lIFBOR19BQk9SVCgpIHRvIGEgZnVuY3Rpb24gdGhhdCBkb2VzIHNvbWV0aGluZworbW9yZSB1c2VmdWwgdGhhbiBhYm9ydCgpLCBhcyBsb25nIGFzIHlvdXIgZnVuY3Rpb24gZG9lcyBub3QKK3JldHVybi4KKworTm93IHlvdSBuZWVkIHRvIHNldCB1cCB0aGUgaW5wdXQgY29kZS4gIFRoZSBkZWZhdWx0IGZvciBsaWJwbmcgaXMgdG8KK3VzZSB0aGUgQyBmdW5jdGlvbiBmcmVhZCgpLiAgSWYgeW91IHVzZSB0aGlzLCB5b3Ugd2lsbCBuZWVkIHRvIHBhc3MgYQordmFsaWQgRklMRSAqIGluIHRoZSBmdW5jdGlvbiBwbmdfaW5pdF9pbygpLiAgQmUgc3VyZSB0aGF0IHRoZSBmaWxlIGlzCitvcGVuZWQgaW4gYmluYXJ5IG1vZGUuICBJZiB5b3Ugd2lzaCB0byBoYW5kbGUgcmVhZGluZyBkYXRhIGluIGFub3RoZXIKK3dheSwgeW91IG5lZWQgbm90IGNhbGwgdGhlIHBuZ19pbml0X2lvKCkgZnVuY3Rpb24sIGJ1dCB5b3UgbXVzdCB0aGVuCitpbXBsZW1lbnQgdGhlIGxpYnBuZyBJL08gbWV0aG9kcyBkaXNjdXNzZWQgaW4gdGhlIEN1c3RvbWl6aW5nIExpYnBuZworc2VjdGlvbiBiZWxvdy4KKworICAgIHBuZ19pbml0X2lvKHBuZ19wdHIsIGZwKTsKKworSWYgeW91IGhhZCBwcmV2aW91c2x5IG9wZW5lZCB0aGUgZmlsZSBhbmQgcmVhZCBhbnkgb2YgdGhlIHNpZ25hdHVyZSBmcm9tCit0aGUgYmVnaW5uaW5nIGluIG9yZGVyIHRvIHNlZSBpZiB0aGlzIHdhcyBhIFBORyBmaWxlLCB5b3UgbmVlZCB0byBsZXQKK2xpYnBuZyBrbm93IHRoYXQgdGhlcmUgYXJlIHNvbWUgYnl0ZXMgbWlzc2luZyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4KKworICAgIHBuZ19zZXRfc2lnX2J5dGVzKHBuZ19wdHIsIG51bWJlcik7CisKK1lvdSBjYW4gY2hhbmdlIHRoZSB6bGliIGNvbXByZXNzaW9uIGJ1ZmZlciBzaXplIHRvIGJlIHVzZWQgd2hpbGUKK3JlYWRpbmcgY29tcHJlc3NlZCBkYXRhIHdpdGgKKworICAgIHBuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUocG5nX3B0ciwgYnVmZmVyX3NpemUpOworCit3aGVyZSB0aGUgZGVmYXVsdCBzaXplIGlzIDgxOTIgYnl0ZXMuICBOb3RlIHRoYXQgdGhlIGJ1ZmZlciBzaXplCitpcyBjaGFuZ2VkIGltbWVkaWF0ZWx5IGFuZCB0aGUgYnVmZmVyIGlzIHJlYWxsb2NhdGVkIGltbWVkaWF0ZWx5LAoraW5zdGVhZCBvZiBzZXR0aW5nIGEgZmxhZyB0byBiZSBhY3RlZCB1cG9uIGxhdGVyLgorCitJZiB5b3Ugd2FudCBDUkMgZXJyb3JzIHRvIGJlIGhhbmRsZWQgaW4gYSBkaWZmZXJlbnQgbWFubmVyIHRoYW4KK3RoZSBkZWZhdWx0LCB1c2UKKworICAgIHBuZ19zZXRfY3JjX2FjdGlvbihwbmdfcHRyLCBjcml0X2FjdGlvbiwgYW5jaWxfYWN0aW9uKTsKKworVGhlIHZhbHVlcyBmb3IgcG5nX3NldF9jcmNfYWN0aW9uKCkgc2F5IGhvdyBsaWJwbmcgaXMgdG8gaGFuZGxlIENSQyBlcnJvcnMgaW4KK2FuY2lsbGFyeSBhbmQgY3JpdGljYWwgY2h1bmtzLCBhbmQgd2hldGhlciB0byB1c2UgdGhlIGRhdGEgY29udGFpbmVkCit0aGVyZWluLiAgTm90ZSB0aGF0IGl0IGlzIGltcG9zc2libGUgdG8gImRpc2NhcmQiIGRhdGEgaW4gYSBjcml0aWNhbAorY2h1bmsuCisKK0Nob2ljZXMgZm9yIChpbnQpIGNyaXRfYWN0aW9uIGFyZQorICAgUE5HX0NSQ19ERUZBVUxUICAgICAgMCAgZXJyb3IvcXVpdAorICAgUE5HX0NSQ19FUlJPUl9RVUlUICAgMSAgZXJyb3IvcXVpdAorICAgUE5HX0NSQ19XQVJOX1VTRSAgICAgMyAgd2Fybi91c2UgZGF0YQorICAgUE5HX0NSQ19RVUlFVF9VU0UgICAgNCAgcXVpZXQvdXNlIGRhdGEKKyAgIFBOR19DUkNfTk9fQ0hBTkdFICAgIDUgIHVzZSB0aGUgY3VycmVudCB2YWx1ZQorCitDaG9pY2VzIGZvciAoaW50KSBhbmNpbF9hY3Rpb24gYXJlCisgICBQTkdfQ1JDX0RFRkFVTFQgICAgICAwICBlcnJvci9xdWl0CisgICBQTkdfQ1JDX0VSUk9SX1FVSVQgICAxICBlcnJvci9xdWl0CisgICBQTkdfQ1JDX1dBUk5fRElTQ0FSRCAyICB3YXJuL2Rpc2NhcmQgZGF0YQorICAgUE5HX0NSQ19XQVJOX1VTRSAgICAgMyAgd2Fybi91c2UgZGF0YQorICAgUE5HX0NSQ19RVUlFVF9VU0UgICAgNCAgcXVpZXQvdXNlIGRhdGEKKyAgIFBOR19DUkNfTk9fQ0hBTkdFICAgIDUgIHVzZSB0aGUgY3VycmVudCB2YWx1ZQorCisuU1MgU2V0dGluZyB1cCBjYWxsYmFjayBjb2RlCisKK1lvdSBjYW4gc2V0IHVwIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIGFueSB1bmtub3duIGNodW5rcyBpbiB0aGUKK2lucHV0IHN0cmVhbS4gWW91IG11c3Qgc3VwcGx5IHRoZSBmdW5jdGlvbgorCisgICAgcmVhZF9jaHVua19jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgICAgICAgcG5nX3Vua25vd25fY2h1bmtwIGNodW5rKTsKKyAgICB7CisgICAgICAgLyogVGhlIHVua25vd24gY2h1bmsgc3RydWN0dXJlIGNvbnRhaW5zIHlvdXIKKyAgICAgICAgICBjaHVuayBkYXRhLCBhbG9uZyB3aXRoIHNpbWlsYXIgZGF0YSBmb3IgYW55IG90aGVyCisgICAgICAgICAgdW5rbm93biBjaHVua3M6ICovCisKKyAgICAgICAgICAgcG5nX2J5dGUgbmFtZVs1XTsKKyAgICAgICAgICAgcG5nX2J5dGUgKmRhdGE7CisgICAgICAgICAgIHBuZ19zaXplX3Qgc2l6ZTsKKworICAgICAgIC8qIE5vdGUgdGhhdCBsaWJwbmcgaGFzIGFscmVhZHkgdGFrZW4gY2FyZSBvZgorICAgICAgICAgIHRoZSBDUkMgaGFuZGxpbmcgKi8KKworICAgICAgIC8qIHB1dCB5b3VyIGNvZGUgaGVyZS4gIFNlYXJjaCBmb3IgeW91ciBjaHVuayBpbiB0aGUKKyAgICAgICAgICB1bmtub3duIGNodW5rIHN0cnVjdHVyZSwgcHJvY2VzcyBpdCwgYW5kIHJldHVybiBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nOiAqLworCisgICAgICAgcmV0dXJuIChcLW4pOyAvKiBjaHVuayBoYWQgYW4gZXJyb3IgKi8KKyAgICAgICByZXR1cm4gKDApOyAvKiBkaWQgbm90IHJlY29nbml6ZSAqLworICAgICAgIHJldHVybiAobik7IC8qIHN1Y2Nlc3MgKi8KKyAgICB9CisKKyhZb3UgY2FuIGdpdmUgeW91ciBmdW5jdGlvbiBhbm90aGVyIG5hbWUgdGhhdCB5b3UgbGlrZSBpbnN0ZWFkIG9mCisicmVhZF9jaHVua19jYWxsYmFjayIpCisKK1RvIGluZm9ybSBsaWJwbmcgYWJvdXQgeW91ciBmdW5jdGlvbiwgdXNlCisKKyAgICBwbmdfc2V0X3JlYWRfdXNlcl9jaHVua19mbihwbmdfcHRyLCB1c2VyX2NodW5rX3B0ciwKKyAgICAgICAgcmVhZF9jaHVua19jYWxsYmFjayk7CisKK1RoaXMgbmFtZXMgbm90IG9ubHkgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLCBidXQgYWxzbyBhIHVzZXIgcG9pbnRlciB0aGF0Cit5b3UgY2FuIHJldHJpZXZlIHdpdGgKKworICAgIHBuZ19nZXRfdXNlcl9jaHVua19wdHIocG5nX3B0cik7CisKK0lmIHlvdSBjYWxsIHRoZSBwbmdfc2V0X3JlYWRfdXNlcl9jaHVua19mbigpIGZ1bmN0aW9uLCB0aGVuIGFsbCB1bmtub3duCitjaHVua3Mgd2hpY2ggdGhlIGNhbGxiYWNrIGRvZXMgbm90IGhhbmRsZSB3aWxsIGJlIHNhdmVkIHdoZW4gcmVhZC4gIFlvdSBjYW4KK2NhdXNlIHRoZW0gdG8gYmUgZGlzY2FyZGVkIGJ5IHJldHVybmluZyAnMScgKCJoYW5kbGVkIikgaW5zdGVhZCBvZiAnMCcuICBUaGlzCitiZWhhdmlvciB3aWxsIGNoYW5nZSBpbiBsaWJwbmcgMS43IGFuZCB0aGUgZGVmYXVsdCBoYW5kbGluZyBzZXQgYnkgdGhlCitwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MoKSBmdW5jdGlvbiwgZGVzY3JpYmVkIGJlbG93LCB3aWxsIGJlIHVzZWQgd2hlbiB0aGUKK2NhbGxiYWNrIHJldHVybnMgMC4gIElmIHlvdSB3YW50IHRoZSBleGlzdGluZyBiZWhhdmlvciB5b3Ugc2hvdWxkIHNldCB0aGUgZ2xvYmFsCitkZWZhdWx0IHRvIFBOR19IQU5ETEVfQ0hVTktfSUZfU0FGRSBub3c7IHRoaXMgaXMgY29tcGF0aWJsZSB3aXRoIGFsbCBjdXJyZW50Cit2ZXJzaW9ucyBvZiBsaWJwbmcgYW5kIHdpdGggMS43LiAgTGlicG5nIDEuNiBpc3N1ZXMgYSB3YXJuaW5nIGlmIHlvdSBrZWVwIHRoZQorZGVmYXVsdCwgb3IgUE5HX0hBTkRMRV9DSFVOS19ORVZFUiwgYW5kIHRoZSBjYWxsYmFjayByZXR1cm5zIDAuCisKK0F0IHRoaXMgcG9pbnQsIHlvdSBjYW4gc2V0IHVwIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIGJlCitjYWxsZWQgYWZ0ZXIgZWFjaCByb3cgaGFzIGJlZW4gcmVhZCwgd2hpY2ggeW91IGNhbiB1c2UgdG8gY29udHJvbAorYSBwcm9ncmVzcyBtZXRlciBvciB0aGUgbGlrZS4gIEl0J3MgZGVtb25zdHJhdGVkIGluIHBuZ3Rlc3QuYy4KK1lvdSBtdXN0IHN1cHBseSBhIGZ1bmN0aW9uCisKKyAgICB2b2lkIHJlYWRfcm93X2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICAgICAgcG5nX3VpbnRfMzIgcm93LCBpbnQgcGFzcyk7CisgICAgeworICAgICAgLyogcHV0IHlvdXIgY29kZSBoZXJlICovCisgICAgfQorCisoWW91IGNhbiBnaXZlIGl0IGFub3RoZXIgbmFtZSB0aGF0IHlvdSBsaWtlIGluc3RlYWQgb2YgInJlYWRfcm93X2NhbGxiYWNrIikKKworVG8gaW5mb3JtIGxpYnBuZyBhYm91dCB5b3VyIGZ1bmN0aW9uLCB1c2UKKworICAgIHBuZ19zZXRfcmVhZF9zdGF0dXNfZm4ocG5nX3B0ciwgcmVhZF9yb3dfY2FsbGJhY2spOworCitXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRoZSByb3cgaGFzIGFscmVhZHkgYmVlbiBjb21wbGV0ZWx5IHByb2Nlc3NlZCBhbmQKK3RoZSAncm93JyBhbmQgJ3Bhc3MnIHJlZmVyIHRvIHRoZSBuZXh0IHJvdyB0byBiZSBoYW5kbGVkLiAgRm9yIHRoZQorbm9uLWludGVybGFjZWQgY2FzZSB0aGUgcm93IHRoYXQgd2FzIGp1c3QgaGFuZGxlZCBpcyBzaW1wbHkgb25lIGxlc3MgdGhhbiB0aGUKK3Bhc3NlZCBpbiByb3cgbnVtYmVyLCBhbmQgcGFzcyB3aWxsIGFsd2F5cyBiZSAwLiAgRm9yIHRoZSBpbnRlcmxhY2VkIGNhc2UgdGhlCitzYW1lIGFwcGxpZXMgdW5sZXNzIHRoZSByb3cgdmFsdWUgaXMgMCwgaW4gd2hpY2ggY2FzZSB0aGUgcm93IGp1c3QgaGFuZGxlZCB3YXMKK3RoZSBsYXN0IG9uZSBmcm9tIG9uZSBvZiB0aGUgcHJlY2VkaW5nIHBhc3Nlcy4gIEJlY2F1c2UgaW50ZXJsYWNpbmcgbWF5IHNraXAgYQorcGFzcyB5b3UgY2Fubm90IGJlIHN1cmUgdGhhdCB0aGUgcHJlY2VkaW5nIHBhc3MgaXMganVzdCAncGFzc1wtMScsIGlmIHlvdSByZWFsbHkKK25lZWQgdG8ga25vdyB3aGF0IHRoZSBsYXN0IHBhc3MgaXMgcmVjb3JkIChyb3cscGFzcykgZnJvbSB0aGUgY2FsbGJhY2sgYW5kIHVzZQordGhlIGxhc3QgcmVjb3JkZWQgdmFsdWUgZWFjaCB0aW1lLgorCitBcyB3aXRoIHRoZSB1c2VyIHRyYW5zZm9ybSB5b3UgY2FuIGZpbmQgdGhlIG91dHB1dCByb3cgdXNpbmcgdGhlCitQTkdfUk9XX0ZST01fUEFTU19ST1cgbWFjcm8uCisKKy5TUyBVbmtub3duLWNodW5rIGhhbmRsaW5nCisKK05vdyB5b3UgZ2V0IHRvIHNldCB0aGUgd2F5IHRoZSBsaWJyYXJ5IHByb2Nlc3NlcyB1bmtub3duIGNodW5rcyBpbiB0aGUKK2lucHV0IFBORyBzdHJlYW0uIEJvdGgga25vd24gYW5kIHVua25vd24gY2h1bmtzIHdpbGwgYmUgcmVhZC4gIE5vcm1hbAorYmVoYXZpb3IgaXMgdGhhdCBrbm93biBjaHVua3Mgd2lsbCBiZSBwYXJzZWQgaW50byBpbmZvcm1hdGlvbiBpbgordmFyaW91cyBpbmZvX3B0ciBtZW1iZXJzIHdoaWxlIHVua25vd24gY2h1bmtzIHdpbGwgYmUgZGlzY2FyZGVkLiBUaGlzCitiZWhhdmlvciBjYW4gYmUgd2FzdGVmdWwgaWYgeW91ciBhcHBsaWNhdGlvbiB3aWxsIG5ldmVyIHVzZSBzb21lIGtub3duCitjaHVuayB0eXBlcy4gVG8gY2hhbmdlIHRoaXMsIHlvdSBjYW4gY2FsbDoKKworICAgIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyhwbmdfcHRyLCBrZWVwLAorICAgICAgICBjaHVua19saXN0LCBudW1fY2h1bmtzKTsKKworICAgIGtlZXAgICAgICAgLSAwOiBkZWZhdWx0IHVua25vd24gY2h1bmsgaGFuZGxpbmcKKyAgICAgICAgICAgICAgICAgMTogaWdub3JlOyBkbyBub3Qga2VlcAorICAgICAgICAgICAgICAgICAyOiBrZWVwIG9ubHkgaWYgc2FmZS10by1jb3B5CisgICAgICAgICAgICAgICAgIDM6IGtlZXAgZXZlbiBpZiB1bnNhZmUtdG8tY29weQorCisgICAgICAgICAgICAgICBZb3UgY2FuIHVzZSB0aGVzZSBkZWZpbml0aW9uczoKKyAgICAgICAgICAgICAgICAgUE5HX0hBTkRMRV9DSFVOS19BU19ERUZBVUxUICAgMAorICAgICAgICAgICAgICAgICBQTkdfSEFORExFX0NIVU5LX05FVkVSICAgICAgICAxCisgICAgICAgICAgICAgICAgIFBOR19IQU5ETEVfQ0hVTktfSUZfU0FGRSAgICAgIDIKKyAgICAgICAgICAgICAgICAgUE5HX0hBTkRMRV9DSFVOS19BTFdBWVMgICAgICAgMworCisgICAgY2h1bmtfbGlzdCAtIGxpc3Qgb2YgY2h1bmtzIGFmZmVjdGVkIChhIGJ5dGUgc3RyaW5nLAorICAgICAgICAgICAgICAgICBmaXZlIGJ5dGVzIHBlciBjaHVuaywgTlVMTCBvciAnXDAnIGlmCisgICAgICAgICAgICAgICAgIG51bV9jaHVua3MgaXMgcG9zaXRpdmU7IGlnbm9yZWQgaWYKKyAgICAgICAgICAgICAgICAgbnVtY2h1bmtzIDw9IDApLgorCisgICAgbnVtX2NodW5rcyAtIG51bWJlciBvZiBjaHVua3MgYWZmZWN0ZWQ7IGlmIDAsIGFsbAorICAgICAgICAgICAgICAgICB1bmtub3duIGNodW5rcyBhcmUgYWZmZWN0ZWQuICBJZiBwb3NpdGl2ZSwKKyAgICAgICAgICAgICAgICAgb25seSB0aGUgY2h1bmtzIGluIHRoZSBsaXN0IGFyZSBhZmZlY3RlZCwKKyAgICAgICAgICAgICAgICAgYW5kIGlmIG5lZ2F0aXZlIGFsbCB1bmtub3duIGNodW5rcyBhbmQKKyAgICAgICAgICAgICAgICAgYWxsIGtub3duIGNodW5rcyBleGNlcHQgZm9yIHRoZSBJSERSLAorICAgICAgICAgICAgICAgICBQTFRFLCB0Uk5TLCBJREFULCBhbmQgSUVORCBjaHVua3MgYXJlCisgICAgICAgICAgICAgICAgIGFmZmVjdGVkLgorCitVbmtub3duIGNodW5rcyBkZWNsYXJlZCBpbiB0aGlzIHdheSB3aWxsIGJlIHNhdmVkIGFzIHJhdyBkYXRhIG9udG8gYQorbGlzdCBvZiBwbmdfdW5rbm93bl9jaHVuayBzdHJ1Y3R1cmVzLiAgSWYgYSBjaHVuayB0aGF0IGlzIG5vcm1hbGx5Citrbm93biB0byBsaWJwbmcgaXMgbmFtZWQgaW4gdGhlIGxpc3QsIGl0IHdpbGwgYmUgaGFuZGxlZCBhcyB1bmtub3duLAorYWNjb3JkaW5nIHRvIHRoZSAia2VlcCIgZGlyZWN0aXZlLiAgSWYgYSBjaHVuayBpcyBuYW1lZCBpbiBzdWNjZXNzaXZlCitpbnN0YW5jZXMgb2YgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKCksIHRoZSBmaW5hbCBpbnN0YW5jZSB3aWxsCit0YWtlIHByZWNlZGVuY2UuICBUaGUgSUhEUiBhbmQgSUVORCBjaHVua3Mgc2hvdWxkIG5vdCBiZSBuYW1lZCBpbgorY2h1bmtfbGlzdDsgaWYgdGhleSBhcmUsIGxpYnBuZyB3aWxsIHByb2Nlc3MgdGhlbSBub3JtYWxseSBhbnl3YXkuCitJZiB5b3Uga25vdyB0aGF0IHlvdXIgYXBwbGljYXRpb24gd2lsbCBuZXZlciBtYWtlIHVzZSBvZiBzb21lIHBhcnRpY3VsYXIKK2NodW5rcywgdXNlIFBOR19IQU5ETEVfQ0hVTktfTkVWRVIgKG9yIDEpIGFzIGRlbW9uc3RyYXRlZCBiZWxvdy4KKworSGVyZSBpcyBhbiBleGFtcGxlIG9mIHRoZSB1c2FnZSBvZiBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MoKSwKK3doZXJlIHRoZSBwcml2YXRlICJ2cEFnIiBjaHVuayB3aWxsIGxhdGVyIGJlIHByb2Nlc3NlZCBieSBhIHVzZXIgY2h1bmsKK2NhbGxiYWNrIGZ1bmN0aW9uOgorCisgICAgcG5nX2J5dGUgdnBBZ1s1XT17MTE4LCAxMTIsICA2NSwgMTAzLCAocG5nX2J5dGUpICdcMCd9OworCisgICAgI2lmIGRlZmluZWQoUE5HX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkKKyAgICAgIHBuZ19ieXRlIHVudXNlZF9jaHVua3NbXT0KKyAgICAgIHsKKyAgICAgICAgMTA0LCAgNzMsICA4MywgIDg0LCAocG5nX2J5dGUpICdcMCcsICAgLyogaElTVCAqLworICAgICAgICAxMDUsICA4NCwgIDg4LCAxMTYsIChwbmdfYnl0ZSkgJ1wwJywgICAvKiBpVFh0ICovCisgICAgICAgIDExMiwgIDY3LCAgNjUsICA3NiwgKHBuZ19ieXRlKSAnXDAnLCAgIC8qIHBDQUwgKi8KKyAgICAgICAgMTE1LCAgNjcsICA2NSwgIDc2LCAocG5nX2J5dGUpICdcMCcsICAgLyogc0NBTCAqLworICAgICAgICAxMTUsICA4MCwgIDc2LCAgODQsIChwbmdfYnl0ZSkgJ1wwJywgICAvKiBzUExUICovCisgICAgICAgIDExNiwgIDczLCAgNzcsICA2OSwgKHBuZ19ieXRlKSAnXDAnLCAgIC8qIHRJTUUgKi8KKyAgICAgIH07CisgICAgI2VuZGlmCisKKyAgICAuLi4KKworICAgICNpZiBkZWZpbmVkKFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQpCisgICAgICAvKiBpZ25vcmUgYWxsIHVua25vd24gY2h1bmtzCisgICAgICAgKiAodXNlIGdsb2JhbCBzZXR0aW5nICIyIiBmb3IgbGlicG5nMTYgYW5kIGVhcmxpZXIpOgorICAgICAgICovCisgICAgICBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MocmVhZF9wdHIsIDIsIE5VTEwsIDApOworCisgICAgICAvKiBleGNlcHQgZm9yIHZwQWc6ICovCisgICAgICBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MocmVhZF9wdHIsIDIsIHZwQWcsIDEpOworCisgICAgICAvKiBhbHNvIGlnbm9yZSB1bnVzZWQga25vd24gY2h1bmtzOiAqLworICAgICAgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKHJlYWRfcHRyLCAxLCB1bnVzZWRfY2h1bmtzLAorICAgICAgICAgKGludCkoc2l6ZW9mIHVudXNlZF9jaHVua3MpLzUpOworICAgICNlbmRpZgorCisuU1MgVXNlciBsaW1pdHMKKworVGhlIFBORyBzcGVjaWZpY2F0aW9uIGFsbG93cyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiBhbiBpbWFnZSB0byBiZSBhcworbGFyZ2UgYXMgMl4oMzFcLTEgKDB4N2ZmZmZmZmYpLCBvciBhYm91dCAyLjE0NyBiaWxsaW9uIHJvd3MgYW5kIGNvbHVtbnMuCitGb3Igc2FmZXR5LCBsaWJwbmcgaW1wb3NlcyBhIGRlZmF1bHQgbGltaXQgb2YgMSBtaWxsaW9uIHJvd3MgYW5kIGNvbHVtbnMuCitMYXJnZXIgaW1hZ2VzIHdpbGwgYmUgcmVqZWN0ZWQgaW1tZWRpYXRlbHkgd2l0aCBhIHBuZ19lcnJvcigpIGNhbGwuIElmCit5b3Ugd2lzaCB0byBjaGFuZ2UgdGhlc2UgbGltaXRzLCB5b3UgY2FuIHVzZQorCisgICBwbmdfc2V0X3VzZXJfbGltaXRzKHBuZ19wdHIsIHdpZHRoX21heCwgaGVpZ2h0X21heCk7CisKK3RvIHNldCB5b3VyIG93biBsaW1pdHMgKGxpYnBuZyBtYXkgcmVqZWN0IHNvbWUgdmVyeSB3aWRlIGltYWdlcworYW55d2F5IGJlY2F1c2Ugb2YgcG90ZW50aWFsIGJ1ZmZlciBvdmVyZmxvdyBjb25kaXRpb25zKS4KKworWW91IHNob3VsZCBwdXQgdGhpcyBzdGF0ZW1lbnQgYWZ0ZXIgeW91IGNyZWF0ZSB0aGUgUE5HIHN0cnVjdHVyZSBhbmQKK2JlZm9yZSBjYWxsaW5nIHBuZ19yZWFkX2luZm8oKSwgcG5nX3JlYWRfcG5nKCksIG9yIHBuZ19wcm9jZXNzX2RhdGEoKS4KKworV2hlbiB3cml0aW5nIGEgUE5HIGRhdGFzdHJlYW0sIHB1dCB0aGlzIHN0YXRlbWVudCBiZWZvcmUgY2FsbGluZworcG5nX3dyaXRlX2luZm8oKSBvciBwbmdfd3JpdGVfcG5nKCkuCisKK0lmIHlvdSBuZWVkIHRvIHJldHJpZXZlIHRoZSBsaW1pdHMgdGhhdCBhcmUgYmVpbmcgYXBwbGllZCwgdXNlCisKKyAgIHdpZHRoX21heCA9IHBuZ19nZXRfdXNlcl93aWR0aF9tYXgocG5nX3B0cik7CisgICBoZWlnaHRfbWF4ID0gcG5nX2dldF91c2VyX2hlaWdodF9tYXgocG5nX3B0cik7CisKK1RoZSBQTkcgc3BlY2lmaWNhdGlvbiBzZXRzIG5vIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgYW5jaWxsYXJ5IGNodW5rcworYWxsb3dlZCBpbiBhIFBORyBkYXRhc3RyZWFtLiAgQnkgZGVmYXVsdCwgbGlicG5nIGltcG9zZXMgYSBsaW1pdCBvZgorYSB0b3RhbCBvZiAxMDAwIHNQTFQsIHRFWHQsIGlUWHQsIHpUWHQsIGFuZCB1bmtub3duIGNodW5rcyB0byBiZSBzdG9yZWQuCitJZiB5b3UgaGF2ZSBzZXQgdXAgYm90aCBpbmZvX3B0ciBhbmQgZW5kX2luZm9fcHRyLCB0aGUgbGltaXQgYXBwbGllcworc2VwYXJhdGVseSB0byBlYWNoLiAgWW91IGNhbiBjaGFuZ2UgdGhlIGxpbWl0IG9uIHRoZSB0b3RhbCBudW1iZXIgb2Ygc3VjaAorY2h1bmtzIHRoYXQgd2lsbCBiZSBzdG9yZWQsIHdpdGgKKworICAgcG5nX3NldF9jaHVua19jYWNoZV9tYXgocG5nX3B0ciwgdXNlcl9jaHVua19jYWNoZV9tYXgpOworCit3aGVyZSAweDdmZmZmZmZmTCBtZWFucyB1bmxpbWl0ZWQuICBZb3UgY2FuIHJldHJpZXZlIHRoaXMgbGltaXQgd2l0aAorCisgICBjaHVua19jYWNoZV9tYXggPSBwbmdfZ2V0X2NodW5rX2NhY2hlX21heChwbmdfcHRyKTsKKworTGlicG5nIGltcG9zZXMgYSBsaW1pdCBvZiA4IE1lZ2FieXRlcyAoOCwwMDAsMDAwIGJ5dGVzKSBvbiB0aGUgYW1vdW50IG9mCittZW1vcnkgdGhhdCBhIGNvbXByZXNzZWQgY2h1bmsgb3RoZXIgdGhhbiBJREFUIGNhbiBvY2N1cHksIHdoZW4gZGVjb21wcmVzc2VkLgorWW91IGNhbiBjaGFuZ2UgdGhpcyBsaW1pdCB3aXRoCisKKyAgIHBuZ19zZXRfY2h1bmtfbWFsbG9jX21heChwbmdfcHRyLCB1c2VyX2NodW5rX21hbGxvY19tYXgpOworCithbmQgeW91IGNhbiByZXRyaWV2ZSB0aGUgbGltaXQgd2l0aAorCisgICBjaHVua19tYWxsb2NfbWF4ID0gcG5nX2dldF9jaHVua19tYWxsb2NfbWF4KHBuZ19wdHIpOworCitBbnkgY2h1bmtzIHRoYXQgd291bGQgY2F1c2UgZWl0aGVyIG9mIHRoZXNlIGxpbWl0cyB0byBiZSBleGNlZWRlZCB3aWxsCitiZSBpZ25vcmVkLgorCisuU1MgSW5mb3JtYXRpb24gYWJvdXQgeW91ciBzeXN0ZW0KKworSWYgeW91IGludGVuZCB0byBkaXNwbGF5IHRoZSBQTkcgb3IgdG8gaW5jb3Jwb3JhdGUgaXQgaW4gb3RoZXIgaW1hZ2UgZGF0YSB5b3UKK25lZWQgdG8gdGVsbCBsaWJwbmcgaW5mb3JtYXRpb24gYWJvdXQgeW91ciBkaXNwbGF5IG9yIGRyYXdpbmcgc3VyZmFjZSBzbyB0aGF0CitsaWJwbmcgY2FuIGNvbnZlcnQgdGhlIHZhbHVlcyBpbiB0aGUgaW1hZ2UgdG8gbWF0Y2ggdGhlIGRpc3BsYXkuCisKK0Zyb20gbGlicG5nLTEuNS40IHRoaXMgaW5mb3JtYXRpb24gY2FuIGJlIHNldCBiZWZvcmUgcmVhZGluZyB0aGUgUE5HIGZpbGUKK2hlYWRlci4gIEluIGVhcmxpZXIgdmVyc2lvbnMgcG5nX3NldF9nYW1tYSgpIGV4aXN0ZWQgYnV0IGJlaGF2ZWQgaW5jb3JyZWN0bHkgaWYKK2NhbGxlZCBiZWZvcmUgdGhlIFBORyBmaWxlIGhlYWRlciBoYWQgYmVlbiByZWFkIGFuZCBwbmdfc2V0X2FscGhhX21vZGUoKSBkaWQgbm90CitleGlzdC4KKworSWYgeW91IG5lZWQgdG8gc3VwcG9ydCB2ZXJzaW9ucyBwcmlvciB0byBsaWJwbmctMS41LjQgdGVzdCB0aGUgdmVyc2lvbiBudW1iZXIKK2FzIGlsbHVzdHJhdGVkIGJlbG93IHVzaW5nICJQTkdfTElCUE5HX1ZFUiA+PSAxMDUwNCIgYW5kIGZvbGxvdyB0aGUgcHJvY2VkdXJlcworZGVzY3JpYmVkIGluIHRoZSBhcHByb3ByaWF0ZSBtYW51YWwgcGFnZS4KKworWW91IGdpdmUgbGlicG5nIHRoZSBlbmNvZGluZyBleHBlY3RlZCBieSB5b3VyIHN5c3RlbSBleHByZXNzZWQgYXMgYSAnZ2FtbWEnCit2YWx1ZS4gIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IGEgZGVmYXVsdCBlbmNvZGluZyBmb3IgdGhlIFBORyBmaWxlIGluCitjYXNlIHRoZSByZXF1aXJlZCBpbmZvcm1hdGlvbiBpcyBtaXNzaW5nIGZyb20gdGhlIGZpbGUuICBCeSBkZWZhdWx0IGxpYnBuZworYXNzdW1lcyB0aGF0IHRoZSBQTkcgZGF0YSBtYXRjaGVzIHlvdXIgc3lzdGVtLCB0byBrZWVwIHRoaXMgZGVmYXVsdCBjYWxsOgorCisgICBwbmdfc2V0X2dhbW1hKHBuZ19wdHIsIHNjcmVlbl9nYW1tYSwgb3V0cHV0X2dhbW1hKTsKKworb3IgeW91IGNhbiB1c2UgdGhlIGZpeGVkIHBvaW50IGVxdWl2YWxlbnQ6CisKKyAgIHBuZ19zZXRfZ2FtbWFfZml4ZWQocG5nX3B0ciwgUE5HX0ZQXzEqc2NyZWVuX2dhbW1hLAorICAgICAgUE5HX0ZQXzEqb3V0cHV0X2dhbW1hKTsKKworSWYgeW91IGRvbid0IGtub3cgdGhlIGdhbW1hIGZvciB5b3VyIHN5c3RlbSBpdCBpcyBwcm9iYWJseSAyLjIgLSBhIGdvb2QKK2FwcHJveGltYXRpb24gdG8gdGhlIElFQyBzdGFuZGFyZCBmb3IgZGlzcGxheSBzeXN0ZW1zIChzUkdCKS4gIElmIGltYWdlcyBhcmUKK3RvbyBjb250cmFzdHkgb3Igd2FzaGVkIG91dCB5b3UgZ290IHRoZSB2YWx1ZSB3cm9uZyAtIGNoZWNrIHlvdXIgc3lzdGVtCitkb2N1bWVudGF0aW9uIQorCitNYW55IHN5c3RlbXMgcGVybWl0IHRoZSBzeXN0ZW0gZ2FtbWEgdG8gYmUgY2hhbmdlZCB2aWEgYSBsb29rdXAgdGFibGUgaW4gdGhlCitkaXNwbGF5IGRyaXZlciwgYSBmZXcgc3lzdGVtcywgaW5jbHVkaW5nIG9sZGVyIE1hY3MsIGNoYW5nZSB0aGUgcmVzcG9uc2UgYnkKK2RlZmF1bHQuICBBcyBvZiAxLjUuNCB0aHJlZSBzcGVjaWFsIHZhbHVlcyBhcmUgYXZhaWxhYmxlIHRvIGhhbmRsZSBjb21tb24KK3NpdHVhdGlvbnM6CisKKyAgIFBOR19ERUZBVUxUX3NSR0I6IEluZGljYXRlcyB0aGF0IHRoZSBzeXN0ZW0gY29uZm9ybXMgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICBJRUMgNjE5NjYtMi0xIHN0YW5kYXJkLiAgVGhpcyBtYXRjaGVzIGFsbW9zdAorICAgICAgICAgICAgICAgICAgICAgYWxsIHN5c3RlbXMuCisgICBQTkdfR0FNTUFfTUFDXzE4OiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3lzdGVtIGlzIGFuIG9sZGVyCisgICAgICAgICAgICAgICAgICAgICAocHJlIE1hYyBPUyAxMC42KSBBcHBsZSBNYWNpbnRvc2ggc3lzdGVtIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgIHRoZSBkZWZhdWx0IHNldHRpbmdzLgorICAgUE5HX0dBTU1BX0xJTkVBUjogSnVzdCB0aGUgZml4ZWQgcG9pbnQgdmFsdWUgZm9yIDEuMCAtIGluZGljYXRlcworICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGUgc3lzdGVtIGV4cGVjdHMgZGF0YSB3aXRoIG5vIGdhbW1hCisgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZy4KKworWW91IHdvdWxkIHVzZSB0aGUgbGluZWFyICh1bmVuY29kZWQpIHZhbHVlIGlmIHlvdSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBpeGVsCit2YWx1ZXMgZnVydGhlciBiZWNhdXNlIHRoaXMgYXZvaWRzIHRoZSBuZWVkIHRvIGRlY29kZSBhbmQgcmUtZW5jb2RlIGVhY2gKK2NvbXBvbmVudCB2YWx1ZSB3aGVuZXZlciBhcml0aG1ldGljIGlzIHBlcmZvcm1lZC4gIEEgbG90IG9mIGdyYXBoaWNzIHNvZnR3YXJlCit1c2VzIGxpbmVhciB2YWx1ZXMgZm9yIHRoaXMgcmVhc29uLCBvZnRlbiB3aXRoIGhpZ2hlciBwcmVjaXNpb24gY29tcG9uZW50IHZhbHVlcwordG8gcHJlc2VydmUgb3ZlcmFsbCBhY2N1cmFjeS4KKworCitUaGUgb3V0cHV0X2dhbW1hIHZhbHVlIGV4cHJlc3NlcyBob3cgdG8gZGVjb2RlIHRoZSBvdXRwdXQgdmFsdWVzLCBub3QgaG93Cit0aGV5IGFyZSBlbmNvZGVkLiAgVGhlIHZhbHVlcyB1c2VkIGNvcnJlc3BvbmQgdG8gdGhlIG5vcm1hbCBudW1iZXJzIHVzZWQgdG8KK2Rlc2NyaWJlIHRoZSBvdmVyYWxsIGdhbW1hIG9mIGEgY29tcHV0ZXIgZGlzcGxheSBzeXN0ZW07IGZvciBleGFtcGxlIDIuMiBmb3IKK2FuIHNSR0IgY29uZm9ybWFudCBzeXN0ZW0uICBUaGUgdmFsdWVzIGFyZSBzY2FsZWQgYnkgMTAwMDAwIGluIHRoZSBfZml4ZWQKK3ZlcnNpb24gb2YgdGhlIEFQSSAoc28gMjIwMDAwIGZvciBzUkdCLikKKworVGhlIGludmVyc2Ugb2YgdGhlIHZhbHVlIGlzIGFsd2F5cyB1c2VkIHRvIHByb3ZpZGUgYSBkZWZhdWx0IGZvciB0aGUgUE5HIGZpbGUKK2VuY29kaW5nIGlmIGl0IGhhcyBubyBnQU1BIGNodW5rIGFuZCBpZiBwbmdfc2V0X2dhbW1hKCkgaGFzIG5vdCBiZWVuIGNhbGxlZAordG8gb3ZlcnJpZGUgdGhlIFBORyBnYW1tYSBpbmZvcm1hdGlvbi4KKworV2hlbiB0aGUgQUxQSEFfT1BUSU1JWkVEIG1vZGUgaXMgc2VsZWN0ZWQgdGhlIG91dHB1dCBnYW1tYSBpcyB1c2VkIHRvIGVuY29kZQorb3BhcXVlIHBpeGVscyBob3dldmVyIHBpeGVscyB3aXRoIGxvd2VyIGFscGhhIHZhbHVlcyBhcmUgbm90IGVuY29kZWQsCityZWdhcmRsZXNzIG9mIHRoZSBvdXRwdXQgZ2FtbWEgc2V0dGluZy4KKworV2hlbiB0aGUgc3RhbmRhcmQgUG9ydGVyIER1ZmYgaGFuZGxpbmcgaXMgcmVxdWVzdGVkIHdpdGggbW9kZSAxIHRoZSBvdXRwdXQKK2VuY29kaW5nIGlzIHNldCB0byBiZSBsaW5lYXIgYW5kIHRoZSBvdXRwdXRfZ2FtbWEgdmFsdWUgaXMgb25seSByZWxldmFudAorYXMgYSBkZWZhdWx0IGZvciBpbnB1dCBkYXRhIHRoYXQgaGFzIG5vIGdhbW1hIGluZm9ybWF0aW9uLiAgVGhlIGxpbmVhciBvdXRwdXQKK2VuY29kaW5nIHdpbGwgYmUgb3ZlcnJpZGRlbiBpZiBwbmdfc2V0X2dhbW1hKCkgaXMgY2FsbGVkIC0gdGhlIHJlc3VsdHMgbWF5IGJlCitoaWdobHkgdW5leHBlY3RlZCEKKworVGhlIGZvbGxvd2luZyBudW1iZXJzIGFyZSBkZXJpdmVkIGZyb20gdGhlIHNSR0Igc3RhbmRhcmQgYW5kIHRoZSByZXNlYXJjaAorYmVoaW5kIGl0LiAgc1JHQiBpcyBkZWZpbmVkIHRvIGJlIGFwcHJveGltYXRlZCBieSBhIFBORyBnQU1BIGNodW5rIHZhbHVlIG9mCiswLjQ1NDU1ICgxLzIuMikgZm9yIFBORy4gIFRoZSB2YWx1ZSBpbXBsaWNpdGx5IGluY2x1ZGVzIGFueSB2aWV3aW5nCitjb3JyZWN0aW9uIHJlcXVpcmVkIHRvIHRha2UgYWNjb3VudCBvZiBhbnkgZGlmZmVyZW5jZXMgaW4gdGhlIGNvbG9yCitlbnZpcm9ubWVudCBvZiB0aGUgb3JpZ2luYWwgc2NlbmUgYW5kIHRoZSBpbnRlbmRlZCBkaXNwbGF5IGVudmlyb25tZW50OyB0aGUKK3ZhbHVlIGV4cHJlc3NlcyBob3cgdG8gKmRlY29kZSogdGhlIGltYWdlIGZvciBkaXNwbGF5LCBub3QgaG93IHRoZSBvcmlnaW5hbAorZGF0YSB3YXMgKmVuY29kZWQqLgorCitzUkdCIHByb3ZpZGVzIGEgcGVnIGZvciB0aGUgUE5HIHN0YW5kYXJkIGJ5IGRlZmluaW5nIGEgdmlld2luZyBlbnZpcm9ubWVudC4KK3NSR0IgaXRzZWxmLCBhbmQgZWFybGllciBUViBzdGFuZGFyZHMsIGFjdHVhbGx5IHVzZSBhIG1vcmUgY29tcGxleCB0cmFuc2Zvcm0KKyhhIGxpbmVhciBwb3J0aW9uIHRoZW4gYSBnYW1tYSAyLjQgcG93ZXIgbGF3KSB0aGFuIFBORyBjYW4gZXhwcmVzcy4gIChQTkcgaXMKK2xpbWl0ZWQgdG8gc2ltcGxlIHBvd2VyIGxhd3MuKSAgQnkgc2F5aW5nIHRoYXQgYW4gaW1hZ2UgZm9yIGRpcmVjdCBkaXNwbGF5IG9uCithbiBzUkdCIGNvbmZvcm1hbnQgc3lzdGVtIHNob3VsZCBiZSBzdG9yZWQgd2l0aCBhIGdBTUEgY2h1bmsgdmFsdWUgb2YgNDU0NTUKKygxMS4zLjMuMiBhbmQgMTEuMy4zLjUgb2YgdGhlIElTTyBQTkcgc3BlY2lmaWNhdGlvbikgdGhlIFBORyBzcGVjaWZpY2F0aW9uCittYWtlcyBpdCBwb3NzaWJsZSB0byBkZXJpdmUgdmFsdWVzIGZvciBvdGhlciBkaXNwbGF5IHN5c3RlbXMgYW5kCitlbnZpcm9ubWVudHMuCisKK1RoZSBNYWMgdmFsdWUgaXMgZGVkdWNlZCBmcm9tIHRoZSBzUkdCIGJhc2VkIG9uIGFuIGFzc3VtcHRpb24gdGhhdCB0aGUgYWN0dWFsCitleHRyYSB2aWV3aW5nIGNvcnJlY3Rpb24gdXNlZCBpbiBlYXJseSBNYWMgZGlzcGxheSBzeXN0ZW1zIHdhcyBpbXBsZW1lbnRlZCBhcworYSBwb3dlciAxLjQ1IGxvb2t1cCB0YWJsZS4KKworQW55IHN5c3RlbSB3aGVyZSBhIHByb2dyYW1tYWJsZSBsb29rdXAgdGFibGUgaXMgdXNlZCBvciB3aGVyZSB0aGUgYmVoYXZpb3Igb2YKK3RoZSBmaW5hbCBkaXNwbGF5IGRldmljZSBjaGFyYWN0ZXJpc3RpY3MgY2FuIGJlIGNoYW5nZWQgcmVxdWlyZXMgc3lzdGVtCitzcGVjaWZpYyBjb2RlIHRvIG9idGFpbiB0aGUgY3VycmVudCBjaGFyYWN0ZXJpc3RpYy4gIEhvd2V2ZXIgdGhpcyBjYW4gYmUKK2RpZmZpY3VsdCBhbmQgbW9zdCBQTkcgZ2FtbWEgY29ycmVjdGlvbiBvbmx5IHJlcXVpcmVzIGFuIGFwcHJveGltYXRlIHZhbHVlLgorCitCeSBkZWZhdWx0LCBpZiBwbmdfc2V0X2FscGhhX21vZGUoKSBpcyBub3QgY2FsbGVkLCBsaWJwbmcgYXNzdW1lcyB0aGF0IGFsbAordmFsdWVzIGFyZSB1bmVuY29kZWQsIGxpbmVhciwgdmFsdWVzIGFuZCB0aGF0IHRoZSBvdXRwdXQgZGV2aWNlIGFsc28gaGFzIGEKK2xpbmVhciBjaGFyYWN0ZXJpc3RpYy4gIFRoaXMgaXMgb25seSB2ZXJ5IHJhcmVseSBjb3JyZWN0IC0gaXQgaXMgaW52YXJpYWJseQorYmV0dGVyIHRvIGNhbGwgcG5nX3NldF9hbHBoYV9tb2RlKCkgd2l0aCBQTkdfREVGQVVMVF9zUkdCIHRoYW4gcmVseSBvbiB0aGUKK2RlZmF1bHQgaWYgeW91IGRvbid0IGtub3cgd2hhdCB0aGUgcmlnaHQgYW5zd2VyIGlzIQorCitUaGUgc3BlY2lhbCB2YWx1ZSBQTkdfR0FNTUFfTUFDXzE4IGluZGljYXRlcyBhbiBvbGRlciBNYWMgc3lzdGVtIChwcmUgTWFjIE9TCisxMC42KSB3aGljaCB1c2VkIGEgY29ycmVjdGlvbiB0YWJsZSB0byBpbXBsZW1lbnQgYSBzb21ld2hhdCBsb3dlciBnYW1tYSBvbiBhbgorb3RoZXJ3aXNlIHNSR0Igc3lzdGVtLgorCitCb3RoIHRoZXNlIHZhbHVlcyBhcmUgcmVzZXJ2ZWQgKG5vdCBzaW1wbGUgZ2FtbWEgdmFsdWVzKSBpbiBvcmRlciB0byBhbGxvdworbW9yZSBwcmVjaXNlIGNvcnJlY3Rpb24gaW50ZXJuYWxseSBpbiB0aGUgZnV0dXJlLgorCitOT1RFOiB0aGUgdmFsdWVzIGNhbiBiZSBwYXNzZWQgdG8gZWl0aGVyIHRoZSBmaXhlZCBvciBmbG9hdGluZworcG9pbnQgQVBJcywgYnV0IHRoZSBmbG9hdGluZyBwb2ludCBBUEkgd2lsbCBhbHNvIGFjY2VwdCBmbG9hdGluZyBwb2ludAordmFsdWVzLgorCitUaGUgc2Vjb25kIHRoaW5nIHlvdSBtYXkgbmVlZCB0byB0ZWxsIGxpYnBuZyBhYm91dCBpcyBob3cgeW91ciBzeXN0ZW0gaGFuZGxlcworYWxwaGEgY2hhbm5lbCBpbmZvcm1hdGlvbi4gIFNvbWUsIGJ1dCBub3QgYWxsLCBQTkcgZmlsZXMgY29udGFpbiBhbiBhbHBoYQorY2hhbm5lbC4gIFRvIGRpc3BsYXkgdGhlc2UgZmlsZXMgY29ycmVjdGx5IHlvdSBuZWVkIHRvIGNvbXBvc2UgdGhlIGRhdGEgb250byBhCitzdWl0YWJsZSBiYWNrZ3JvdW5kLCBhcyBkZXNjcmliZWQgaW4gdGhlIFBORyBzcGVjaWZpY2F0aW9uLgorCitMaWJwbmcgb25seSBzdXBwb3J0cyBjb21wb3Npbmcgb250byBhIHNpbmdsZSBjb2xvciAodXNpbmcgcG5nX3NldF9iYWNrZ3JvdW5kOworc2VlIGJlbG93KS4gIE90aGVyd2lzZSB5b3UgbXVzdCBkbyB0aGUgY29tcG9zaXRpb24geW91cnNlbGYgYW5kLCBpbiB0aGlzIGNhc2UsCit5b3UgbWF5IG5lZWQgdG8gY2FsbCBwbmdfc2V0X2FscGhhX21vZGU6CisKKyAgICNpZiBQTkdfTElCUE5HX1ZFUiA+PSAxMDUwNAorICAgICAgcG5nX3NldF9hbHBoYV9tb2RlKHBuZ19wdHIsIG1vZGUsIHNjcmVlbl9nYW1tYSk7CisgICAjZWxzZQorICAgICAgcG5nX3NldF9nYW1tYShwbmdfcHRyLCBzY3JlZW5fZ2FtbWEsIDEuMC9zY3JlZW5fZ2FtbWEpOworICAgI2VuZGlmCisKK1RoZSBzY3JlZW5fZ2FtbWEgdmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhlIGFyZ3VtZW50IHRvIHBuZ19zZXRfZ2FtbWE7IGhvd2V2ZXIsCitob3cgaXQgYWZmZWN0cyB0aGUgb3V0cHV0IGRlcGVuZHMgb24gdGhlIG1vZGUuICBwbmdfc2V0X2FscGhhX21vZGUoKSBzZXRzIHRoZQorZmlsZSBnYW1tYSBkZWZhdWx0IHRvIDEvc2NyZWVuX2dhbW1hLCBzbyBub3JtYWxseSB5b3UgZG9uJ3QgbmVlZCB0byBjYWxsCitwbmdfc2V0X2dhbW1hLiAgSWYgeW91IG5lZWQgZGlmZmVyZW50IGRlZmF1bHRzIGNhbGwgcG5nX3NldF9nYW1tYSgpIGJlZm9yZQorcG5nX3NldF9hbHBoYV9tb2RlKCkgLSBpZiB5b3UgY2FsbCBpdCBhZnRlciBpdCB3aWxsIG92ZXJyaWRlIHRoZSBzZXR0aW5ncyBtYWRlCitieSBwbmdfc2V0X2FscGhhX21vZGUoKS4KKworVGhlIG1vZGUgaXMgYXMgZm9sbG93czoKKworICAgIFBOR19BTFBIQV9QTkc6IFRoZSBkYXRhIGlzIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBQTkcKK3NwZWNpZmljYXRpb24uICBSZWQsIGdyZWVuIGFuZCBibHVlLCBvciBncmF5LCBjb21wb25lbnRzIGFyZQorZ2FtbWEgZW5jb2RlZCBjb2xvciB2YWx1ZXMgYW5kIGFyZSBub3QgcHJlbXVsdGlwbGllZCBieSB0aGUKK2FscGhhIHZhbHVlLiAgVGhlIGFscGhhIHZhbHVlIGlzIGEgbGluZWFyIG1lYXN1cmUgb2YgdGhlCitjb250cmlidXRpb24gb2YgdGhlIHBpeGVsIHRvIHRoZSBjb3JyZXNwb25kaW5nIGZpbmFsIG91dHB1dCBwaXhlbC4KKworWW91IHNob3VsZCBub3JtYWxseSB1c2UgdGhpcyBmb3JtYXQgaWYgeW91IGludGVuZCB0byBwZXJmb3JtCitjb2xvciBjb3JyZWN0aW9uIG9uIHRoZSBjb2xvciB2YWx1ZXM7IG1vc3QsIG1heWJlIGFsbCwgY29sb3IKK2NvcnJlY3Rpb24gc29mdHdhcmUgaGFzIG5vIGhhbmRsaW5nIGZvciB0aGUgYWxwaGEgY2hhbm5lbCBhbmQsCithbnl3YXksIHRoZSBtYXRoIHRvIGhhbmRsZSBwcmUtbXVsdGlwbGllZCBjb21wb25lbnQgdmFsdWVzIGlzCit1bm5lY2Vzc2FyaWx5IGNvbXBsZXguCisKK0JlZm9yZSB5b3UgZG8gYW55IGFyaXRobWV0aWMgb24gdGhlIGNvbXBvbmVudCB2YWx1ZXMgeW91IG5lZWQKK3RvIHJlbW92ZSB0aGUgZ2FtbWEgZW5jb2RpbmcgYW5kIG11bHRpcGx5IG91dCB0aGUgYWxwaGEKK2NoYW5uZWwuICBTZWUgdGhlIFBORyBzcGVjaWZpY2F0aW9uIGZvciBtb3JlIGRldGFpbC4gIEl0IGlzCitpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHdoZW4gYW4gaW1hZ2Ugd2l0aCBhbiBhbHBoYSBjaGFubmVsIGlzCitzY2FsZWQsIGxpbmVhciBlbmNvZGVkLCBwcmUtbXVsdGlwbGllZCBjb21wb25lbnQgdmFsdWVzIG11c3QKK2JlIHVzZWQhCisKK1RoZSByZW1haW5pbmcgbW9kZXMgYXNzdW1lIHlvdSBkb24ndCBuZWVkIHRvIGRvIGFueSBmdXJ0aGVyIGNvbG9yIGNvcnJlY3Rpb24gb3IKK3RoYXQgaWYgeW91IGRvLCB5b3VyIGNvbG9yIGNvcnJlY3Rpb24gc29mdHdhcmUga25vd3MgYWxsIGFib3V0IGFscGhhIChpdAorcHJvYmFibHkgZG9lc24ndCEpLiAgVGhleSAnYXNzb2NpYXRlJyB0aGUgYWxwaGEgd2l0aCB0aGUgY29sb3IgaW5mb3JtYXRpb24gYnkKK3N0b3JpbmcgY29sb3IgY2hhbm5lbCB2YWx1ZXMgdGhhdCBoYXZlIGJlZW4gc2NhbGVkIGJ5IHRoZSBhbHBoYS4gIFRoZQorYWR2YW50YWdlIGlzIHRoYXQgdGhlIGNvbG9yIGNoYW5uZWxzIGNhbiBiZSByZXNhbXBsZWQgKHRoZSBpbWFnZSBjYW4gYmUKK3NjYWxlZCkgaW4gdGhpcyBmb3JtLiAgVGhlIGRpc2FkdmFudGFnZSBpcyB0aGF0IG5vcm1hbCBwcmFjdGljZSBpcyB0byBzdG9yZQorbGluZWFyLCBub3QgKGdhbW1hKSBlbmNvZGVkLCB2YWx1ZXMgYW5kIHRoaXMgcmVxdWlyZXMgMTYtYml0IGNoYW5uZWxzIGZvcgorc3RpbGwgaW1hZ2VzIHJhdGhlciB0aGFuIHRoZSA4LWJpdCBjaGFubmVscyB0aGF0IGFyZSBqdXN0IGFib3V0IHN1ZmZpY2llbnQgaWYKK2dhbW1hIGVuY29kaW5nIGlzIHVzZWQuICBJbiBhZGRpdGlvbiBhbGwgbm9uLXRyYW5zcGFyZW50IHBpeGVsIHZhbHVlcywKK2luY2x1ZGluZyBjb21wbGV0ZWx5IG9wYXF1ZSBvbmVzLCBtdXN0IGJlIGdhbW1hIGVuY29kZWQgdG8gcHJvZHVjZSB0aGUgZmluYWwKK2ltYWdlLiAgVGhlc2UgYXJlIHRoZSAnU1RBTkRBUkQnLCAnQVNTT0NJQVRFRCcgb3IgJ1BSRU1VTFRJUExJRUQnIG1vZGVzCitkZXNjcmliZWQgYmVsb3cgKHRoZSBsYXR0ZXIgYmVpbmcgdGhlIHR3byBjb21tb24gbmFtZXMgZm9yIGFzc29jaWF0ZWQgYWxwaGEKK2NvbG9yIGNoYW5uZWxzKS4gTm90ZSB0aGF0IFBORyBmaWxlcyBhbHdheXMgY29udGFpbiBub24tYXNzb2NpYXRlZCBjb2xvcgorY2hhbm5lbHM7IHBuZ19zZXRfYWxwaGFfbW9kZSgpIHdpdGggb25lIG9mIHRoZSBtb2RlcyBjYXVzZXMgdGhlIGRlY29kZXIgdG8KK2NvbnZlcnQgdGhlIHBpeGVscyB0byBhbiBhc3NvY2lhdGVkIGZvcm0gYmVmb3JlIHJldHVybmluZyB0aGVtIHRvIHlvdXIKK2FwcGxpY2F0aW9uLiAKKworU2luY2UgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBwZXJmb3JtIGFyaXRobWV0aWMgb24gb3BhcXVlIGNvbG9yIHZhbHVlcyBzbworbG9uZyBhcyB0aGV5IGFyZSBub3QgdG8gYmUgcmVzYW1wbGVkIGFuZCBhcmUgaW4gdGhlIGZpbmFsIGNvbG9yIHNwYWNlIGl0IGlzCitwb3NzaWJsZSB0byBvcHRpbWl6ZSB0aGUgaGFuZGxpbmcgb2YgYWxwaGEgYnkgc3RvcmluZyB0aGUgb3BhcXVlIHBpeGVscyBpbgordGhlIFBORyBmb3JtYXQgKGFkanVzdGVkIGZvciB0aGUgb3V0cHV0IGNvbG9yIHNwYWNlKSB3aGlsZSBzdG9yaW5nIHBhcnRpYWxseQorb3BhcXVlIHBpeGVscyBpbiB0aGUgc3RhbmRhcmQsIGxpbmVhciwgZm9ybWF0LiAgVGhlIGFjY3VyYWN5IHJlcXVpcmVkIGZvcgorc3RhbmRhcmQgYWxwaGEgY29tcG9zaXRpb24gaXMgcmVsYXRpdmVseSBsb3csIGJlY2F1c2UgdGhlIHBpeGVscyBhcmUKK2lzb2xhdGVkLCB0aGVyZWZvcmUgdHlwaWNhbGx5IHRoZSBhY2N1cmFjeSBsb3NzIGluIHN0b3JpbmcgOC1iaXQgbGluZWFyCit2YWx1ZXMgaXMgYWNjZXB0YWJsZS4gIChUaGlzIGlzIG5vdCB0cnVlIGlmIHRoZSBhbHBoYSBjaGFubmVsIGlzIHVzZWQgdG8KK3NpbXVsYXRlIHRyYW5zcGFyZW5jeSBvdmVyIGxhcmdlIGFyZWFzIC0gdXNlIDE2IGJpdHMgb3IgdGhlIFBORyBtb2RlIGluCit0aGlzIGNhc2UhKSAgVGhpcyBpcyB0aGUgJ09QVElNSVpFRCcgbW9kZS4gIEZvciB0aGlzIG1vZGUgYSBwaXhlbCBpcwordHJlYXRlZCBhcyBvcGFxdWUgb25seSBpZiB0aGUgYWxwaGEgdmFsdWUgaXMgZXF1YWwgdG8gdGhlIG1heGltdW0gdmFsdWUuCisKKyAgICBQTkdfQUxQSEFfU1RBTkRBUkQ6ICBUaGUgZGF0YSBsaWJwbmcgcHJvZHVjZXMgaXMgZW5jb2RlZCBpbiB0aGUKK3N0YW5kYXJkIHdheSBhc3N1bWVkIGJ5IG1vc3QgY29ycmVjdGx5IHdyaXR0ZW4gZ3JhcGhpY3Mgc29mdHdhcmUuCitUaGUgZ2FtbWEgZW5jb2Rpbmcgd2lsbCBiZSByZW1vdmVkIGJ5IGxpYnBuZyBhbmQgdGhlCitsaW5lYXIgY29tcG9uZW50IHZhbHVlcyB3aWxsIGJlIHByZS1tdWx0aXBsaWVkIGJ5IHRoZQorYWxwaGEgY2hhbm5lbC4KKworV2l0aCB0aGlzIGZvcm1hdCB0aGUgZmluYWwgaW1hZ2UgbXVzdCBiZSByZS1lbmNvZGVkIHRvCittYXRjaCB0aGUgZGlzcGxheSBnYW1tYSBiZWZvcmUgdGhlIGltYWdlIGlzIGRpc3BsYXllZC4KK0lmIHlvdXIgc3lzdGVtIGRvZXNuJ3QgZG8gdGhhdCwgeWV0IHN0aWxsIHNlZW1zIHRvCitwZXJmb3JtIGFyaXRobWV0aWMgb24gdGhlIHBpeGVscyB3aXRob3V0IGRlY29kaW5nIHRoZW0sCitpdCBpcyBicm9rZW4gLSBjaGVjayBvdXQgdGhlIG1vZGVzIGJlbG93LgorCitXaXRoIFBOR19BTFBIQV9TVEFOREFSRCBsaWJwbmcgYWx3YXlzIHByb2R1Y2VzIGxpbmVhcgorY29tcG9uZW50IHZhbHVlcywgd2hhdGV2ZXIgc2NyZWVuX2dhbW1hIHlvdSBzdXBwbHkuICBUaGUKK3NjcmVlbl9nYW1tYSB2YWx1ZSBpcywgaG93ZXZlciwgdXNlZCBhcyBhIGRlZmF1bHQgZm9yCit0aGUgZmlsZSBnYW1tYSBpZiB0aGUgUE5HIGZpbGUgaGFzIG5vIGdhbW1hIGluZm9ybWF0aW9uLgorCitJZiB5b3UgY2FsbCBwbmdfc2V0X2dhbW1hKCkgYWZ0ZXIgcG5nX3NldF9hbHBoYV9tb2RlKCkgeW91Cit3aWxsIG92ZXJyaWRlIHRoZSBsaW5lYXIgZW5jb2RpbmcuICBJbnN0ZWFkIHRoZQorcHJlLW11bHRpcGxpZWQgcGl4ZWwgdmFsdWVzIHdpbGwgYmUgZ2FtbWEgZW5jb2RlZCBidXQKK3RoZSBhbHBoYSBjaGFubmVsIHdpbGwgc3RpbGwgYmUgbGluZWFyLiAgVGhpcyBtYXkKK2FjdHVhbGx5IG1hdGNoIHRoZSByZXF1aXJlbWVudHMgb2Ygc29tZSBicm9rZW4gc29mdHdhcmUsCitidXQgaXQgaXMgdW5saWtlbHkuCisKK1doaWxlIGxpbmVhciA4LWJpdCBkYXRhIGlzIG9mdGVuIHVzZWQgaXQgaGFzCitpbnN1ZmZpY2llbnQgcHJlY2lzaW9uIGZvciBhbnkgaW1hZ2Ugd2l0aCBhIHJlYXNvbmFibGUKK2R5bmFtaWMgcmFuZ2UuICBUbyBhdm9pZCBwcm9ibGVtcywgYW5kIGlmIHlvdXIgc29mdHdhcmUKK3N1cHBvcnRzIGl0LCB1c2UgcG5nX3NldF9leHBhbmRfMTYoKSB0byBmb3JjZSBhbGwKK2NvbXBvbmVudHMgdG8gMTYgYml0cy4KKworICAgIFBOR19BTFBIQV9PUFRJTUlaRUQ6IFRoaXMgbW9kZSBpcyB0aGUgc2FtZSBhcyBQTkdfQUxQSEFfU1RBTkRBUkQKK2V4Y2VwdCB0aGF0IGNvbXBsZXRlbHkgb3BhcXVlIHBpeGVscyBhcmUgZ2FtbWEgZW5jb2RlZCBhY2NvcmRpbmcgdG8KK3RoZSBzY3JlZW5fZ2FtbWEgdmFsdWUuICBQaXhlbHMgd2l0aCBhbHBoYSBsZXNzIHRoYW4gMS4wCit3aWxsIHN0aWxsIGhhdmUgbGluZWFyIGNvbXBvbmVudHMuCisKK1VzZSB0aGlzIGZvcm1hdCBpZiB5b3UgaGF2ZSBjb250cm9sIG92ZXIgeW91cgorY29tcG9zaXRpbmcgc29mdHdhcmUgYW5kIHNvIGRvbid0IGRvIG90aGVyIGFyaXRobWV0aWMKKyhzdWNoIGFzIHNjYWxpbmcpIG9uIHRoZSBkYXRhIHlvdSBnZXQgZnJvbSBsaWJwbmcuICBZb3VyCitjb21wb3NpdGluZyBzb2Z0d2FyZSBjYW4gc2ltcGx5IGNvcHkgb3BhcXVlIHBpeGVscyB0bwordGhlIG91dHB1dCBidXQgc3RpbGwgaGFzIGxpbmVhciB2YWx1ZXMgZm9yIHRoZQorbm9uLW9wYXF1ZSBwaXhlbHMuCisKK0luIG5vcm1hbCBjb21wb3NpdGluZywgd2hlcmUgdGhlIGFscGhhIGNoYW5uZWwgZW5jb2RlcworcGFydGlhbCBwaXhlbCBjb3ZlcmFnZSAoYXMgb3Bwb3NlZCB0byBicm9hZCBhcmVhCit0cmFuc2x1Y2VuY3kpLCB0aGUgaW5hY2N1cmFjaWVzIG9mIHRoZSA4LWJpdAorcmVwcmVzZW50YXRpb24gb2Ygbm9uLW9wYXF1ZSBwaXhlbHMgYXJlIGlycmVsZXZhbnQuCisKK1lvdSBjYW4gYWxzbyB0cnkgdGhpcyBmb3JtYXQgaWYgeW91ciBzb2Z0d2FyZSBpcyBicm9rZW47CitpdCBtaWdodCBsb29rIGJldHRlci4KKworICAgIFBOR19BTFBIQV9CUk9LRU46IFRoaXMgaXMgUE5HX0FMUEhBX1NUQU5EQVJEOyBob3dldmVyLCBhbGwgY29tcG9uZW50Cit2YWx1ZXMsIGluY2x1ZGluZyB0aGUgYWxwaGEgY2hhbm5lbCBhcmUgZ2FtbWEgZW5jb2RlZC4gIFRoaXMgaXMKK2Jyb2tlbiBiZWNhdXNlLCBpbiBwcmFjdGljZSwgbm8gaW1wbGVtZW50YXRpb24gdGhhdCB1c2VzIHRoaXMgY2hvaWNlCitjb3JyZWN0bHkgdW5kb2VzIHRoZSBlbmNvZGluZyBiZWZvcmUgaGFuZGxpbmcgYWxwaGEgY29tcG9zaXRpb24uICBVc2UgdGhpcworY2hvaWNlIG9ubHkgaWYgb3RoZXIgc2VyaW91cyBlcnJvcnMgaW4gdGhlIHNvZnR3YXJlIG9yIGhhcmR3YXJlIHlvdSB1c2UKK21hbmRhdGUgaXQuICBJbiBtb3N0IGNhc2VzIG9mIGJyb2tlbiBzb2Z0d2FyZSBvciBoYXJkd2FyZSB0aGUgYnVnIGluIHRoZQorZmluYWwgZGlzcGxheSBtYW5pZmVzdHMgYXMgYSBzdWJ0bGUgaGFsbyBhcm91bmQgY29tcG9zaXRlZCBwYXJ0cyBvZiB0aGUKK2ltYWdlLiAgWW91IG1heSBub3QgZXZlbiBwZXJjZWl2ZSB0aGlzIGFzIGEgaGFsbzsgdGhlIGNvbXBvc2l0ZWQgcGFydCBvZgordGhlIGltYWdlIG1heSBzaW1wbHkgYXBwZWFyIHNlcGFyYXRlIGZyb20gdGhlIGJhY2tncm91bmQsIGFzIHRob3VnaCBpdCBoYWQKK2JlZW4gY3V0IG91dCBvZiBwYXBlciBhbmQgcGFzdGVkIG9uIGFmdGVyd2FyZC4KKworSWYgeW91IGRvbid0IGhhdmUgdG8gZGVhbCB3aXRoIGJ1Z3MgaW4gc29mdHdhcmUgb3IgaGFyZHdhcmUsIG9yIGlmIHlvdSBjYW4gZml4Cit0aGVtLCB0aGVyZSBhcmUgdGhyZWUgcmVjb21tZW5kZWQgd2F5cyBvZiB1c2luZyBwbmdfc2V0X2FscGhhX21vZGUoKToKKworICAgcG5nX3NldF9hbHBoYV9tb2RlKHBuZ19wdHIsIFBOR19BTFBIQV9QTkcsCisgICAgICAgc2NyZWVuX2dhbW1hKTsKKworWW91IGNhbiBkbyBjb2xvciBjb3JyZWN0aW9uIG9uIHRoZSByZXN1bHQgKGxpYnBuZyBkb2VzIG5vdCBjdXJyZW50bHkKK3N1cHBvcnQgY29sb3IgY29ycmVjdGlvbiBpbnRlcm5hbGx5KS4gIFdoZW4geW91IGhhbmRsZSB0aGUgYWxwaGEgY2hhbm5lbAoreW91IG5lZWQgdG8gdW5kbyB0aGUgZ2FtbWEgZW5jb2RpbmcgYW5kIG11bHRpcGx5IG91dCB0aGUgYWxwaGEuCisKKyAgIHBuZ19zZXRfYWxwaGFfbW9kZShwbmdfcHRyLCBQTkdfQUxQSEFfU1RBTkRBUkQsCisgICAgICAgc2NyZWVuX2dhbW1hKTsKKyAgIHBuZ19zZXRfZXhwYW5kXzE2KHBuZ19wdHIpOworCitJZiB5b3UgYXJlIHVzaW5nIHRoZSBoaWdoIGxldmVsIGludGVyZmFjZSwgZG9uJ3QgY2FsbCBwbmdfc2V0X2V4cGFuZF8xNigpOworaW5zdGVhZCBwYXNzIFBOR19UUkFOU0ZPUk1fRVhQQU5EXzE2IHRvIHRoZSBpbnRlcmZhY2UuCisKK1dpdGggdGhpcyBtb2RlIHlvdSBjYW4ndCBkbyBjb2xvciBjb3JyZWN0aW9uLCBidXQgeW91IGNhbiBkbyBhcml0aG1ldGljLAoraW5jbHVkaW5nIGNvbXBvc2l0aW9uIGFuZCBzY2FsaW5nLCBvbiB0aGUgZGF0YSB3aXRob3V0IGZ1cnRoZXIgcHJvY2Vzc2luZy4KKworICAgcG5nX3NldF9hbHBoYV9tb2RlKHBuZ19wdHIsIFBOR19BTFBIQV9PUFRJTUlaRUQsCisgICAgICAgc2NyZWVuX2dhbW1hKTsKKworWW91IGNhbiBhdm9pZCB0aGUgZXhwYW5zaW9uIHRvIDE2LWJpdCBjb21wb25lbnRzIHdpdGggdGhpcyBtb2RlLCBidXQgeW91Citsb3NlIHRoZSBhYmlsaXR5IHRvIHNjYWxlIHRoZSBpbWFnZSBvciBwZXJmb3JtIG90aGVyIGxpbmVhciBhcml0aG1ldGljLgorQWxsIHlvdSBjYW4gZG8gaXMgY29tcG9zZSB0aGUgcmVzdWx0IG9udG8gYSBtYXRjaGluZyBvdXRwdXQuICBTaW5jZSB0aGlzCittb2RlIGlzIGxpYnBuZy1zcGVjaWZpYyB5b3UgYWxzbyBuZWVkIHRvIHdyaXRlIHlvdXIgb3duIGNvbXBvc2l0aW9uCitzb2Z0d2FyZS4KKworVGhlIGZvbGxvd2luZyBhcmUgZXhhbXBsZXMgb2YgY2FsbHMgdG8gcG5nX3NldF9hbHBoYV9tb2RlIHRvIGFjaGlldmUgdGhlCityZXF1aXJlZCBvdmVyYWxsIGdhbW1hIGNvcnJlY3Rpb24gYW5kLCB3aGVyZSBuZWNlc3NhcnksIGFscGhhCitwcmVtdWx0aXBsaWNhdGlvbi4KKworICAgIHBuZ19zZXRfYWxwaGFfbW9kZShwcCwgUE5HX0FMUEhBX1BORywgUE5HX0RFRkFVTFRfc1JHQik7CisKK1RoaXMgaXMgdGhlIGRlZmF1bHQgbGlicG5nIGhhbmRsaW5nIG9mIHRoZSBhbHBoYSBjaGFubmVsIC0gaXQgaXMgbm90CitwcmUtbXVsdGlwbGllZCBpbnRvIHRoZSBjb2xvciBjb21wb25lbnRzLiAgSW4gYWRkaXRpb24gdGhlIGNhbGwgc3RhdGVzCit0aGF0IHRoZSBvdXRwdXQgaXMgZm9yIGEgc1JHQiBzeXN0ZW0gYW5kIGNhdXNlcyBhbGwgUE5HIGZpbGVzIHdpdGhvdXQgZ0FNQQorY2h1bmtzIHRvIGJlIGFzc3VtZWQgdG8gYmUgZW5jb2RlZCB1c2luZyBzUkdCLgorCisgICAgcG5nX3NldF9hbHBoYV9tb2RlKHBwLCBQTkdfQUxQSEFfUE5HLCBQTkdfR0FNTUFfTUFDKTsKKworSW4gdGhpcyBjYXNlIHRoZSBvdXRwdXQgaXMgYXNzdW1lZCB0byBiZSBzb21ldGhpbmcgbGlrZSBhbiBzUkdCIGNvbmZvcm1hbnQKK2Rpc3BsYXkgcHJlY2VlZGVkIGJ5IGEgcG93ZXItbGF3IGxvb2t1cCB0YWJsZSBvZiBwb3dlciAxLjQ1LiAgVGhpcyBpcyBob3cKK2Vhcmx5IE1hYyBzeXN0ZW1zIGJlaGF2ZWQuCisKKyAgICBwbmdfc2V0X2FscGhhX21vZGUocHAsIFBOR19BTFBIQV9TVEFOREFSRCwgUE5HX0dBTU1BX0xJTkVBUik7CisKK1RoaXMgaXMgdGhlIGNsYXNzaWMgSmltIEJsaW5uIGFwcHJvYWNoIGFuZCB3aWxsIHdvcmsgaW4gYWNhZGVtaWMKK2Vudmlyb25tZW50cyB3aGVyZSBldmVyeXRoaW5nIGlzIGRvbmUgYnkgdGhlIGJvb2suICBJdCBoYXMgdGhlIHNob3J0Y29taW5nCitvZiBhc3N1bWluZyB0aGF0IGlucHV0IFBORyBkYXRhIHdpdGggbm8gZ2FtbWEgaW5mb3JtYXRpb24gaXMgbGluZWFyIC0gdGhpcworaXMgdW5saWtlbHkgdG8gYmUgY29ycmVjdCB1bmxlc3MgdGhlIFBORyBmaWxlcyB3aGVyZSBnZW5lcmF0ZWQgbG9jYWxseS4KK01vc3Qgb2YgdGhlIHRpbWUgdGhlIG91dHB1dCBwcmVjaXNpb24gd2lsbCBiZSBzbyBsb3cgYXMgdG8gc2hvdworc2lnbmlmaWNhbnQgYmFuZGluZyBpbiBkYXJrIGFyZWFzIG9mIHRoZSBpbWFnZS4KKworICAgIHBuZ19zZXRfZXhwYW5kXzE2KHBwKTsKKyAgICBwbmdfc2V0X2FscGhhX21vZGUocHAsIFBOR19BTFBIQV9TVEFOREFSRCwgUE5HX0RFRkFVTFRfc1JHQik7CisKK1RoaXMgaXMgYSBzb21ld2hhdCBtb3JlIHJlYWxpc3RpYyBKaW0gQmxpbm4gaW5zcGlyZWQgYXBwcm9hY2guICBQTkcgZmlsZXMKK2FyZSBhc3N1bWVkIHRvIGhhdmUgdGhlIHNSR0IgZW5jb2RpbmcgaWYgbm90IG1hcmtlZCB3aXRoIGEgZ2FtbWEgdmFsdWUgYW5kCit0aGUgb3V0cHV0IGlzIGFsd2F5cyAxNiBiaXRzIHBlciBjb21wb25lbnQuICBUaGlzIHBlcm1pdHMgYWNjdXJhdGUgc2NhbGluZworYW5kIHByb2Nlc3Npbmcgb2YgdGhlIGRhdGEuICBJZiB5b3Uga25vdyB0aGF0IHlvdXIgaW5wdXQgUE5HIGZpbGVzIHdlcmUKK2dlbmVyYXRlZCBsb2NhbGx5IHlvdSBtaWdodCBuZWVkIHRvIHJlcGxhY2UgUE5HX0RFRkFVTFRfc1JHQiB3aXRoIHRoZQorY29ycmVjdCB2YWx1ZSBmb3IgeW91ciBzeXN0ZW0uCisKKyAgICBwbmdfc2V0X2FscGhhX21vZGUocHAsIFBOR19BTFBIQV9PUFRJTUlaRUQsIFBOR19ERUZBVUxUX3NSR0IpOworCitJZiB5b3UganVzdCBuZWVkIHRvIGNvbXBvc2l0ZSB0aGUgUE5HIGltYWdlIG9udG8gYW4gZXhpc3RpbmcgYmFja2dyb3VuZAorYW5kIGlmIHlvdSBjb250cm9sIHRoZSBjb2RlIHRoYXQgZG9lcyB0aGlzIHlvdSBjYW4gdXNlIHRoZSBvcHRpbWl6YXRpb24KK3NldHRpbmcuICBJbiB0aGlzIGNhc2UgeW91IGp1c3QgY29weSBjb21wbGV0ZWx5IG9wYXF1ZSBwaXhlbHMgdG8gdGhlCitvdXRwdXQuICBGb3IgcGl4ZWxzIHRoYXQgYXJlIG5vdCBjb21wbGV0ZWx5IHRyYW5zcGFyZW50ICh5b3UganVzdCBza2lwCit0aG9zZSkgeW91IGRvIHRoZSBjb21wb3NpdGlvbiBtYXRoIHVzaW5nIHBuZ19jb21wb3NpdGUgb3IgcG5nX2NvbXBvc2l0ZV8xNgorYmVsb3cgdGhlbiBlbmNvZGUgdGhlIHJlc3VsdGFudCA4LWJpdCBvciAxNi1iaXQgdmFsdWVzIHRvIG1hdGNoIHRoZSBvdXRwdXQKK2VuY29kaW5nLgorCisgICAgT3RoZXIgY2FzZXMKKworSWYgbmVpdGhlciB0aGUgUE5HIG5vciB0aGUgc3RhbmRhcmQgbGluZWFyIGVuY29kaW5nIHdvcmsgZm9yIHlvdSBiZWNhdXNlCitvZiB0aGUgc29mdHdhcmUgb3IgaGFyZHdhcmUgeW91IHVzZSB0aGVuIHlvdSBoYXZlIGEgYmlnIHByb2JsZW0uICBUaGUgUE5HCitjYXNlIHdpbGwgcHJvYmFibHkgcmVzdWx0IGluIGhhbG9zIGFyb3VuZCB0aGUgaW1hZ2UuICBUaGUgbGluZWFyIGVuY29kaW5nCit3aWxsIHByb2JhYmx5IHJlc3VsdCBpbiBhIHdhc2hlZCBvdXQsIHRvbyBicmlnaHQsIGltYWdlIChpdCdzIGFjdHVhbGx5IHRvbworY29udHJhc3R5LikgIFRyeSB0aGUgQUxQSEFfT1BUSU1JWkVEIG1vZGUgYWJvdmUgLSB0aGlzIHdpbGwgcHJvYmFibHkKK3N1YnN0YW50aWFsbHkgcmVkdWNlIHRoZSBoYWxvcy4gIEFsdGVybmF0aXZlbHkgdHJ5OgorCisgICAgcG5nX3NldF9hbHBoYV9tb2RlKHBwLCBQTkdfQUxQSEFfQlJPS0VOLCBQTkdfREVGQVVMVF9zUkdCKTsKKworVGhpcyBvcHRpb24gd2lsbCBhbHNvIHJlZHVjZSB0aGUgaGFsb3MsIGJ1dCB0aGVyZSB3aWxsIGJlIHNsaWdodCBkYXJrCitoYWxvcyByb3VuZCB0aGUgb3BhcXVlIHBhcnRzIG9mIHRoZSBpbWFnZSB3aGVyZSB0aGUgYmFja2dyb3VuZCBpcyBsaWdodC4KK0luIHRoZSBPUFRJTUlaRUQgbW9kZSB0aGUgaGFsb3Mgd2lsbCBiZSBsaWdodCBoYWxvcyB3aGVyZSB0aGUgYmFja2dyb3VuZAoraXMgZGFyay4gIFRha2UgeW91ciBwaWNrIC0gdGhlIGhhbG9zIGFyZSB1bmF2b2lkYWJsZSB1bmxlc3MgeW91IGNhbiBnZXQKK3lvdXIgaGFyZHdhcmUvc29mdHdhcmUgZml4ZWQhICAoVGhlIE9QVElNSVpFRCBhcHByb2FjaCBpcyBzbGlnaHRseQorZmFzdGVyLikKKworV2hlbiB0aGUgZGVmYXVsdCBnYW1tYSBvZiBQTkcgZmlsZXMgZG9lc24ndCBtYXRjaCB0aGUgb3V0cHV0IGdhbW1hLgorSWYgeW91IGhhdmUgUE5HIGZpbGVzIHdpdGggbm8gZ2FtbWEgaW5mb3JtYXRpb24gcG5nX3NldF9hbHBoYV9tb2RlIGFsbG93cworeW91IHRvIHByb3ZpZGUgYSBkZWZhdWx0IGdhbW1hLCBidXQgaXQgYWxzbyBzZXRzIHRoZSBvdXB1dCBnYW1tYSB0byB0aGUKK21hdGNoaW5nIHZhbHVlLiAgSWYgeW91IGtub3cgeW91ciBQTkcgZmlsZXMgaGF2ZSBhIGdhbW1hIHRoYXQgZG9lc24ndAorbWF0Y2ggdGhlIG91dHB1dCB5b3UgY2FuIHRha2UgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQKK3BuZ19zZXRfYWxwaGFfbW9kZSBhbHdheXMgc2V0cyB0aGUgb3V0cHV0IGdhbW1hIGJ1dCBvbmx5IHNldHMgdGhlIFBORworZGVmYXVsdCBpZiBpdCBpcyBub3QgYWxyZWFkeSBzZXQ6CisKKyAgICBwbmdfc2V0X2FscGhhX21vZGUocHAsIFBOR19BTFBIQV9QTkcsIFBOR19ERUZBVUxUX3NSR0IpOworICAgIHBuZ19zZXRfYWxwaGFfbW9kZShwcCwgUE5HX0FMUEhBX1BORywgUE5HX0dBTU1BX01BQyk7CisKK1RoZSBmaXJzdCBjYWxsIHNldHMgYm90aCB0aGUgZGVmYXVsdCBhbmQgdGhlIG91dHB1dCBnYW1tYSB2YWx1ZXMsIHRoZQorc2Vjb25kIGNhbGwgb3ZlcnJpZGVzIHRoZSBvdXRwdXQgZ2FtbWEgd2l0aG91dCBjaGFuZ2luZyB0aGUgZGVmYXVsdC4gIFRoaXMKK2lzIGVhc2llciB0aGFuIGFjaGlldmluZyB0aGUgc2FtZSBlZmZlY3Qgd2l0aCBwbmdfc2V0X2dhbW1hLiAgWW91IG11c3QgdXNlCitQTkdfQUxQSEFfUE5HIGZvciB0aGUgZmlyc3QgY2FsbCAtIGludGVybmFsIGNoZWNraW5nIGluIHBuZ19zZXRfYWxwaGEgd2lsbAorZmlyZSBpZiBtb3JlIHRoYW4gb25lIGNhbGwgdG8gcG5nX3NldF9hbHBoYV9tb2RlIGFuZCBwbmdfc2V0X2JhY2tncm91bmQgaXMKK21hZGUgaW4gdGhlIHNhbWUgcmVhZCBvcGVyYXRpb24sIGhvd2V2ZXIgbXVsdGlwbGUgY2FsbHMgd2l0aCBQTkdfQUxQSEFfUE5HCithcmUgaWdub3JlZC4KKworSWYgeW91IGRvbid0IG5lZWQsIG9yIGNhbid0IGhhbmRsZSwgdGhlIGFscGhhIGNoYW5uZWwgeW91IGNhbiBjYWxsCitwbmdfc2V0X2JhY2tncm91bmQoKSB0byByZW1vdmUgaXQgYnkgY29tcG9zaXRpbmcgYWdhaW5zdCBhIGZpeGVkIGNvbG9yLiAgRG9uJ3QKK2NhbGwgcG5nX3NldF9zdHJpcF9hbHBoYSgpIHRvIGRvIHRoaXMgLSBpdCB3aWxsIGxlYXZlIHNwdXJpb3VzIHBpeGVsIHZhbHVlcyBpbgordHJhbnNwYXJlbnQgcGFydHMgb2YgdGhpcyBpbWFnZS4KKworICAgcG5nX3NldF9iYWNrZ3JvdW5kKHBuZ19wdHIsICZiYWNrZ3JvdW5kX2NvbG9yLAorICAgICAgIFBOR19CQUNLR1JPVU5EX0dBTU1BX1NDUkVFTiwgMCwgMSk7CisKK1RoZSBiYWNrZ3JvdW5kX2NvbG9yIGlzIGFuIFJHQiBvciBncmF5c2NhbGUgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBkYXRhIGZvcm1hdAorbGlicG5nIHdpbGwgcHJvZHVjZSBmb3IgeW91LiAgQmVjYXVzZSB5b3UgZG9uJ3QgeWV0IGtub3cgdGhlIGZvcm1hdCBvZiB0aGUgUE5HCitmaWxlLCBpZiB5b3UgY2FsbCBwbmdfc2V0X2JhY2tncm91bmQgYXQgdGhpcyBwb2ludCB5b3UgbXVzdCBhcnJhbmdlIGZvciB0aGUKK2Zvcm1hdCBwcm9kdWNlZCBieSBsaWJwbmcgdG8gYWx3YXlzIGhhdmUgOC1iaXQgb3IgMTYtYml0IGNvbXBvbmVudHMgYW5kIHRoZW4KK3N0b3JlIHRoZSBjb2xvciBhcyBhbiA4LWJpdCBvciAxNi1iaXQgY29sb3IgYXMgYXBwcm9wcmlhdGUuICBUaGUgY29sb3IgY29udGFpbnMKK3NlcGFyYXRlIGdyYXkgYW5kIFJHQiBjb21wb25lbnQgdmFsdWVzLCBzbyB5b3UgY2FuIGxldCBsaWJwbmcgcHJvZHVjZSBncmF5IG9yCitSR0Igb3V0cHV0IGFjY29yZGluZyB0byB0aGUgaW5wdXQgZm9ybWF0LCBidXQgbG93IGJpdCBkZXB0aCBncmF5c2NhbGUgaW1hZ2VzCittdXN0IGFsd2F5cyBiZSBjb252ZXJ0ZWQgdG8gYXQgbGVhc3QgOC1iaXQgZm9ybWF0LiAgKEV2ZW4gdGhvdWdoIGxvdyBiaXQgZGVwdGgKK2dyYXlzY2FsZSBpbWFnZXMgY2FuJ3QgaGF2ZSBhbiBhbHBoYSBjaGFubmVsIHRoZXkgY2FuIGhhdmUgYSB0cmFuc3BhcmVudAorY29sb3IhKQorCitZb3Ugc2V0IHRoZSB0cmFuc2Zvcm1zIHlvdSBuZWVkIGxhdGVyLCBlaXRoZXIgYXMgZmxhZ3MgdG8gdGhlIGhpZ2ggbGV2ZWwKK2ludGVyZmFjZSBvciBsaWJwbmcgQVBJIGNhbGxzIGZvciB0aGUgbG93IGxldmVsIGludGVyZmFjZS4gIEZvciByZWZlcmVuY2UgdGhlCitzZXR0aW5ncyBhbmQgQVBJIGNhbGxzIHJlcXVpcmVkIGFyZToKKworOC1iaXQgdmFsdWVzOgorICAgUE5HX1RSQU5TRk9STV9TQ0FMRV8xNiB8IFBOR19FWFBBTkQKKyAgIHBuZ19zZXRfZXhwYW5kKHBuZ19wdHIpOyBwbmdfc2V0X3NjYWxlXzE2KHBuZ19wdHIpOworCisgICBJZiB5b3UgbXVzdCBnZXQgZXhhY3RseSB0aGUgc2FtZSBpbmFjY3VyYXRlIHJlc3VsdHMKKyAgIHByb2R1Y2VkIGJ5IGRlZmF1bHQgaW4gdmVyc2lvbnMgcHJpb3IgdG8gbGlicG5nLTEuNS40LAorICAgdXNlIFBOR19UUkFOU0ZPUk1fU1RSSVBfMTYgYW5kIHBuZ19zZXRfc3RyaXBfMTYocG5nX3B0cikKKyAgIGluc3RlYWQuCisKKzE2LWJpdCB2YWx1ZXM6CisgICBQTkdfVFJBTlNGT1JNX0VYUEFORF8xNgorICAgcG5nX3NldF9leHBhbmRfMTYocG5nX3B0cik7CisKK0luIGVpdGhlciBjYXNlIHBhbGV0dGUgaW1hZ2UgZGF0YSB3aWxsIGJlIGV4cGFuZGVkIHRvIFJHQi4gIElmIHlvdSBqdXN0IHdhbnQKK2NvbG9yIGRhdGEgeW91IGNhbiBhZGQgUE5HX1RSQU5TRk9STV9HUkFZX1RPX1JHQiBvciBwbmdfc2V0X2dyYXlfdG9fcmdiKHBuZ19wdHIpCit0byB0aGUgbGlzdC4KKworQ2FsbGluZyBwbmdfc2V0X2JhY2tncm91bmQgYmVmb3JlIHRoZSBQTkcgZmlsZSBoZWFkZXIgaXMgcmVhZCB3aWxsIG5vdCB3b3JrCitwcmlvciB0byBsaWJwbmctMS41LjQuICBCZWNhdXNlIHRoZSBmYWlsdXJlIG1heSByZXN1bHQgaW4gdW5leHBlY3RlZCB3YXJuaW5ncyBvcgorZXJyb3JzIGl0IGlzIHRoZXJlZm9yZSBtdWNoIHNhZmVyIHRvIGNhbGwgcG5nX3NldF9iYWNrZ3JvdW5kIGFmdGVyIHRoZSBoZWFkIGhhcworYmVlbiByZWFkLiAgVW5mb3J0dW5hdGVseSB0aGlzIG1lYW5zIHRoYXQgcHJpb3IgdG8gbGlicG5nLTEuNS40IGl0IGNhbm5vdCBiZQordXNlZCB3aXRoIHRoZSBoaWdoIGxldmVsIGludGVyZmFjZS4KKworLlNTIFRoZSBoaWdoLWxldmVsIHJlYWQgaW50ZXJmYWNlCisKK0F0IHRoaXMgcG9pbnQgdGhlcmUgYXJlIHR3byB3YXlzIHRvIHByb2NlZWQ7IHRocm91Z2ggdGhlIGhpZ2gtbGV2ZWwKK3JlYWQgaW50ZXJmYWNlLCBvciB0aHJvdWdoIGEgc2VxdWVuY2Ugb2YgbG93LWxldmVsIHJlYWQgb3BlcmF0aW9ucy4KK1lvdSBjYW4gdXNlIHRoZSBoaWdoLWxldmVsIGludGVyZmFjZSBpZiAoYSkgeW91IGFyZSB3aWxsaW5nIHRvIHJlYWQKK3RoZSBlbnRpcmUgaW1hZ2UgaW50byBtZW1vcnksIGFuZCAoYikgdGhlIGlucHV0IHRyYW5zZm9ybWF0aW9ucworeW91IHdhbnQgdG8gZG8gYXJlIGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBzZXQ6CisKKyAgICBQTkdfVFJBTlNGT1JNX0lERU5USVRZICAgICAgTm8gdHJhbnNmb3JtYXRpb24KKyAgICBQTkdfVFJBTlNGT1JNX1NDQUxFXzE2ICAgICAgU3RyaXAgMTYtYml0IHNhbXBsZXMgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOC1iaXQgYWNjdXJhdGVseQorICAgIFBOR19UUkFOU0ZPUk1fU1RSSVBfMTYgICAgICBDaG9wIDE2LWJpdCBzYW1wbGVzIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgtYml0IGxlc3MgYWNjdXJhdGVseQorICAgIFBOR19UUkFOU0ZPUk1fU1RSSVBfQUxQSEEgICBEaXNjYXJkIHRoZSBhbHBoYSBjaGFubmVsCisgICAgUE5HX1RSQU5TRk9STV9QQUNLSU5HICAgICAgIEV4cGFuZCAxLCAyIGFuZCA0LWJpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzIHRvIGJ5dGVzCisgICAgUE5HX1RSQU5TRk9STV9QQUNLU1dBUCAgICAgIENoYW5nZSBvcmRlciBvZiBwYWNrZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzIHRvIExTQiBmaXJzdAorICAgIFBOR19UUkFOU0ZPUk1fRVhQQU5EICAgICAgICBQZXJmb3JtIHNldF9leHBhbmQoKQorICAgIFBOR19UUkFOU0ZPUk1fSU5WRVJUX01PTk8gICBJbnZlcnQgbW9ub2Nocm9tZSBpbWFnZXMKKyAgICBQTkdfVFJBTlNGT1JNX1NISUZUICAgICAgICAgTm9ybWFsaXplIHBpeGVscyB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0JJVCBkZXB0aAorICAgIFBOR19UUkFOU0ZPUk1fQkdSICAgICAgICAgICBGbGlwIFJHQiB0byBCR1IsIFJHQkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gQkdSQQorICAgIFBOR19UUkFOU0ZPUk1fU1dBUF9BTFBIQSAgICBGbGlwIFJHQkEgdG8gQVJHQiBvciBHQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBBRworICAgIFBOR19UUkFOU0ZPUk1fSU5WRVJUX0FMUEhBICBDaGFuZ2UgYWxwaGEgZnJvbSBvcGFjaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRyYW5zcGFyZW5jeQorICAgIFBOR19UUkFOU0ZPUk1fU1dBUF9FTkRJQU4gICBCeXRlLXN3YXAgMTYtYml0IHNhbXBsZXMKKyAgICBQTkdfVFJBTlNGT1JNX0dSQVlfVE9fUkdCICAgRXhwYW5kIGdyYXlzY2FsZSBzYW1wbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFJHQiAob3IgR0EgdG8gUkdCQSkKKyAgICBQTkdfVFJBTlNGT1JNX0VYUEFORF8xNiAgICAgRXhwYW5kIHNhbXBsZXMgdG8gMTYgYml0cworCisoVGhpcyBleGNsdWRlcyBzZXR0aW5nIGEgYmFja2dyb3VuZCBjb2xvciwgZG9pbmcgZ2FtbWEgdHJhbnNmb3JtYXRpb24sCitxdWFudGl6aW5nLCBhbmQgc2V0dGluZyBmaWxsZXIuKSAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgc2ltcGx5IGRvIHRoaXM6CisKKyAgICBwbmdfcmVhZF9wbmcocG5nX3B0ciwgaW5mb19wdHIsIHBuZ190cmFuc2Zvcm1zLCBOVUxMKQorCit3aGVyZSBwbmdfdHJhbnNmb3JtcyBpcyBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIGJpdHdpc2UgT1Igb2Ygc29tZQorc2V0IG9mIHRyYW5zZm9ybWF0aW9uIGZsYWdzLiAgVGhpcyBjYWxsIGlzIGVxdWl2YWxlbnQgdG8gcG5nX3JlYWRfaW5mbygpLAorZm9sbG93ZWQgdGhlIHNldCBvZiB0cmFuc2Zvcm1hdGlvbnMgaW5kaWNhdGVkIGJ5IHRoZSB0cmFuc2Zvcm0gbWFzaywKK3RoZW4gcG5nX3JlYWRfaW1hZ2UoKSwgYW5kIGZpbmFsbHkgcG5nX3JlYWRfZW5kKCkuCisKKyhUaGUgZmluYWwgcGFyYW1ldGVyIG9mIHRoaXMgY2FsbCBpcyBub3QgeWV0IHVzZWQuICBTb21lZGF5IGl0IG1pZ2h0IHBvaW50Cit0byB0cmFuc2Zvcm1hdGlvbiBwYXJhbWV0ZXJzIHJlcXVpcmVkIGJ5IHNvbWUgZnV0dXJlIGlucHV0IHRyYW5zZm9ybS4pCisKK1lvdSBtdXN0IHVzZSBwbmdfdHJhbnNmb3JtcyBhbmQgbm90IGNhbGwgYW55IHBuZ19zZXRfdHJhbnNmb3JtKCkgZnVuY3Rpb25zCit3aGVuIHlvdSB1c2UgcG5nX3JlYWRfcG5nKCkuCisKK0FmdGVyIHlvdSBoYXZlIGNhbGxlZCBwbmdfcmVhZF9wbmcoKSwgeW91IGNhbiByZXRyaWV2ZSB0aGUgaW1hZ2UgZGF0YQord2l0aAorCisgICByb3dfcG9pbnRlcnMgPSBwbmdfZ2V0X3Jvd3MocG5nX3B0ciwgaW5mb19wdHIpOworCit3aGVyZSByb3dfcG9pbnRlcnMgaXMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gdGhlIHBpeGVsIGRhdGEgZm9yIGVhY2ggcm93OgorCisgICBwbmdfYnl0ZXAgcm93X3BvaW50ZXJzW2hlaWdodF07CisKK0lmIHlvdSBrbm93IHlvdXIgaW1hZ2Ugc2l6ZSBhbmQgcGl4ZWwgc2l6ZSBhaGVhZCBvZiB0aW1lLCB5b3UgY2FuIGFsbG9jYXRlCityb3dfcG9pbnRlcnMgcHJpb3IgdG8gY2FsbGluZyBwbmdfcmVhZF9wbmcoKSB3aXRoCisKKyAgIGlmIChoZWlnaHQgPiBQTkdfVUlOVF8zMl9NQVgvKHNpemVvZiAocG5nX2J5dGUpKSkKKyAgICAgIHBuZ19lcnJvciAocG5nX3B0ciwKKyAgICAgICAgICAiSW1hZ2UgaXMgdG9vIHRhbGwgdG8gcHJvY2VzcyBpbiBtZW1vcnkiKTsKKworICAgaWYgKHdpZHRoID4gUE5HX1VJTlRfMzJfTUFYL3BpeGVsX3NpemUpCisgICAgICBwbmdfZXJyb3IgKHBuZ19wdHIsCisgICAgICAgICAgIkltYWdlIGlzIHRvbyB3aWRlIHRvIHByb2Nlc3MgaW4gbWVtb3J5Iik7CisKKyAgIHJvd19wb2ludGVycyA9IHBuZ19tYWxsb2MocG5nX3B0ciwKKyAgICAgICBoZWlnaHQqKHNpemVvZiAocG5nX2J5dGVwKSkpOworCisgICBmb3IgKGludCBpPTA7IGk8aGVpZ2h0LCBpKyspCisgICAgICByb3dfcG9pbnRlcnNbaV09TlVMTDsgIC8qIHNlY3VyaXR5IHByZWNhdXRpb24gKi8KKworICAgZm9yIChpbnQgaT0wOyBpPGhlaWdodCwgaSsrKQorICAgICAgcm93X3BvaW50ZXJzW2ldPXBuZ19tYWxsb2MocG5nX3B0ciwKKyAgICAgICAgICB3aWR0aCpwaXhlbF9zaXplKTsKKworICAgcG5nX3NldF9yb3dzKHBuZ19wdHIsIGluZm9fcHRyLCAmcm93X3BvaW50ZXJzKTsKKworQWx0ZXJuYXRpdmVseSB5b3UgY291bGQgYWxsb2NhdGUgeW91ciBpbWFnZSBpbiBvbmUgYmlnIGJsb2NrIGFuZCBkZWZpbmUKK3Jvd19wb2ludGVyc1tpXSB0byBwb2ludCBpbnRvIHRoZSBwcm9wZXIgcGxhY2VzIGluIHlvdXIgYmxvY2suCisKK0lmIHlvdSB1c2UgcG5nX3NldF9yb3dzKCksIHRoZSBhcHBsaWNhdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZworcm93X3BvaW50ZXJzIChhbmQgcm93X3BvaW50ZXJzW2ldLCBpZiB0aGV5IHdlcmUgc2VwYXJhdGVseSBhbGxvY2F0ZWQpLgorCitJZiB5b3UgZG9uJ3QgYWxsb2NhdGUgcm93X3BvaW50ZXJzIGFoZWFkIG9mIHRpbWUsIHBuZ19yZWFkX3BuZygpIHdpbGwKK2RvIGl0LCBhbmQgaXQnbGwgYmUgZnJlZSdlZCBieSBsaWJwbmcgd2hlbiB5b3UgY2FsbCBwbmdfZGVzdHJveV8qKCkuCisKKy5TUyBUaGUgbG93LWxldmVsIHJlYWQgaW50ZXJmYWNlCisKK0lmIHlvdSBhcmUgZ29pbmcgdGhlIGxvdy1sZXZlbCByb3V0ZSwgeW91IGFyZSBub3cgcmVhZHkgdG8gcmVhZCBhbGwKK3RoZSBmaWxlIGluZm9ybWF0aW9uIHVwIHRvIHRoZSBhY3R1YWwgaW1hZ2UgZGF0YS4gIFlvdSBkbyB0aGlzIHdpdGggYQorY2FsbCB0byBwbmdfcmVhZF9pbmZvKCkuCisKKyAgICBwbmdfcmVhZF9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKKworVGhpcyB3aWxsIHByb2Nlc3MgYWxsIGNodW5rcyB1cCB0byBidXQgbm90IGluY2x1ZGluZyB0aGUgaW1hZ2UgZGF0YS4KKworVGhpcyBhbHNvIGNvcGllcyBzb21lIG9mIHRoZSBkYXRhIGZyb20gdGhlIFBORyBmaWxlIGludG8gdGhlIGRlY29kZSBzdHJ1Y3R1cmUKK2ZvciB1c2UgaW4gbGF0ZXIgdHJhbnNmb3JtYXRpb25zLiAgSW1wb3J0YW50IGluZm9ybWF0aW9uIGNvcGllZCBpbiBpczoKKworMSkgVGhlIFBORyBmaWxlIGdhbW1hIGZyb20gdGhlIGdBTUEgY2h1bmsuICBUaGlzIG92ZXJ3cml0ZXMgdGhlIGRlZmF1bHQgdmFsdWUKK3Byb3ZpZGVkIGJ5IGFuIGVhcmxpZXIgY2FsbCB0byBwbmdfc2V0X2dhbW1hIG9yIHBuZ19zZXRfYWxwaGFfbW9kZS4KKworMikgUHJpb3IgdG8gbGlicG5nLTEuNS40IHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGZyb20gYSBiS0dkIGNodW5rLiAgVGhpcworZGFtYWdlcyB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgYW4gZWFybGllciBjYWxsIHRvIHBuZ19zZXRfYmFja2dyb3VuZAorcmVzdWx0aW5nIGluIHVuZXhwZWN0ZWQgYmVoYXZpb3IuICBMaWJwbmctMS41LjQgbm8gbG9uZ2VyIGRvZXMgdGhpcy4KKworMykgVGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBiaXRzIGluIGVhY2ggY29tcG9uZW50IHZhbHVlLiAgTGlicG5nIHVzZXMgdGhpcyB0bworb3B0aW1pemUgZ2FtbWEgaGFuZGxpbmcgYnkgcmVkdWNpbmcgdGhlIGludGVybmFsIGxvb2t1cCB0YWJsZSBzaXplcy4KKworNCkgVGhlIHRyYW5zcGFyZW50IGNvbG9yIGluZm9ybWF0aW9uIGZyb20gYSB0Uk5TIGNodW5rLiAgVGhpcyBjYW4gYmUgbW9kaWZpZWQgYnkKK2EgbGF0ZXIgY2FsbCB0byBwbmdfc2V0X3RSTlMuCisKKy5TUyBRdWVyeWluZyB0aGUgaW5mbyBzdHJ1Y3R1cmUKKworRnVuY3Rpb25zIGFyZSB1c2VkIHRvIGdldCB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5mb19wdHIgb25jZSBpdAoraGFzIGJlZW4gcmVhZC4gIE5vdGUgdGhhdCB0aGVzZSBmaWVsZHMgbWF5IG5vdCBiZSBjb21wbGV0ZWx5IGZpbGxlZAoraW4gdW50aWwgcG5nX3JlYWRfZW5kKCkgaGFzIHJlYWQgdGhlIGNodW5rIGRhdGEgZm9sbG93aW5nIHRoZSBpbWFnZS4KKworICAgIHBuZ19nZXRfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwgJndpZHRoLCAmaGVpZ2h0LAorICAgICAgICZiaXRfZGVwdGgsICZjb2xvcl90eXBlLCAmaW50ZXJsYWNlX3R5cGUsCisgICAgICAgJmNvbXByZXNzaW9uX3R5cGUsICZmaWx0ZXJfbWV0aG9kKTsKKworICAgIHdpZHRoICAgICAgICAgIC0gaG9sZHMgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZQorICAgICAgICAgICAgICAgICAgICAgaW4gcGl4ZWxzICh1cCB0byAyXjMxKS4KKworICAgIGhlaWdodCAgICAgICAgIC0gaG9sZHMgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UKKyAgICAgICAgICAgICAgICAgICAgIGluIHBpeGVscyAodXAgdG8gMl4zMSkuCisKKyAgICBiaXRfZGVwdGggICAgICAtIGhvbGRzIHRoZSBiaXQgZGVwdGggb2Ygb25lIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgY2hhbm5lbHMuICAodmFsaWQgdmFsdWVzIGFyZQorICAgICAgICAgICAgICAgICAgICAgMSwgMiwgNCwgOCwgMTYgYW5kIGRlcGVuZCBhbHNvIG9uCisgICAgICAgICAgICAgICAgICAgICB0aGUgY29sb3JfdHlwZS4gIFNlZSBhbHNvCisgICAgICAgICAgICAgICAgICAgICBzaWduaWZpY2FudCBiaXRzIChzQklUKSBiZWxvdykuCisKKyAgICBjb2xvcl90eXBlICAgICAtIGRlc2NyaWJlcyB3aGljaCBjb2xvci9hbHBoYSBjaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBwcmVzZW50LgorICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfR1JBWQorICAgICAgICAgICAgICAgICAgICAgICAgKGJpdCBkZXB0aHMgMSwgMiwgNCwgOCwgMTYpCisgICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAoYml0IGRlcHRocyA4LCAxNikKKyAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX1BBTEVUVEUKKyAgICAgICAgICAgICAgICAgICAgICAgIChiaXQgZGVwdGhzIDEsIDIsIDQsIDgpCisgICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9SR0IKKyAgICAgICAgICAgICAgICAgICAgICAgIChiaXRfZGVwdGhzIDgsIDE2KQorICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAoYml0X2RlcHRocyA4LCAxNikKKworICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX01BU0tfUEFMRVRURQorICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX01BU0tfQ09MT1IKKyAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9NQVNLX0FMUEhBCisKKyAgICBpbnRlcmxhY2VfdHlwZSAtIChQTkdfSU5URVJMQUNFX05PTkUgb3IKKyAgICAgICAgICAgICAgICAgICAgIFBOR19JTlRFUkxBQ0VfQURBTTcpCisKKyAgICBjb21wcmVzc2lvbl90eXBlIC0gKG11c3QgYmUgUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRQorICAgICAgICAgICAgICAgICAgICAgZm9yIFBORyAxLjApCisKKyAgICBmaWx0ZXJfbWV0aG9kICAtIChtdXN0IGJlIFBOR19GSUxURVJfVFlQRV9CQVNFCisgICAgICAgICAgICAgICAgICAgICBmb3IgUE5HIDEuMCwgYW5kIGNhbiBhbHNvIGJlCisgICAgICAgICAgICAgICAgICAgICBQTkdfSU5UUkFQSVhFTF9ESUZGRVJFTkNJTkcgaWYKKyAgICAgICAgICAgICAgICAgICAgIHRoZSBQTkcgZGF0YXN0cmVhbSBpcyBlbWJlZGRlZCBpbgorICAgICAgICAgICAgICAgICAgICAgYSBNTkctMS4wIGRhdGFzdHJlYW0pCisKKyAgICBBbnkgb2Ygd2lkdGgsIGhlaWdodCwgY29sb3JfdHlwZSwgYml0X2RlcHRoLAorICAgIGludGVybGFjZV90eXBlLCBjb21wcmVzc2lvbl90eXBlLCBvciBmaWx0ZXJfbWV0aG9kIGNhbgorICAgIGJlIE5VTEwgaWYgeW91IGFyZSBub3QgaW50ZXJlc3RlZCBpbiB0aGVpciB2YWx1ZXMuCisKKyAgICBOb3RlIHRoYXQgcG5nX2dldF9JSERSKCkgcmV0dXJucyAzMi1iaXQgZGF0YSBpbnRvCisgICAgdGhlIGFwcGxpY2F0aW9uJ3Mgd2lkdGggYW5kIGhlaWdodCB2YXJpYWJsZXMuCisgICAgVGhpcyBpcyBhbiB1bnNhZmUgc2l0dWF0aW9uIGlmIHRoZXNlIGFyZSBub3QgcG5nX3VpbnRfMzIKKyAgICB2YXJpYWJsZXMuICBJbiBzdWNoIHNpdHVhdGlvbnMsIHRoZQorICAgIHBuZ19nZXRfaW1hZ2Vfd2lkdGgoKSBhbmQgcG5nX2dldF9pbWFnZV9oZWlnaHQoKQorICAgIGZ1bmN0aW9ucyBkZXNjcmliZWQgYmVsb3cgYXJlIHNhZmVyLgorCisgICAgd2lkdGggICAgICAgICAgICA9IHBuZ19nZXRfaW1hZ2Vfd2lkdGgocG5nX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0cik7CisKKyAgICBoZWlnaHQgICAgICAgICAgID0gcG5nX2dldF9pbWFnZV9oZWlnaHQocG5nX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0cik7CisKKyAgICBiaXRfZGVwdGggICAgICAgID0gcG5nX2dldF9iaXRfZGVwdGgocG5nX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0cik7CisKKyAgICBjb2xvcl90eXBlICAgICAgID0gcG5nX2dldF9jb2xvcl90eXBlKHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOworCisgICAgaW50ZXJsYWNlX3R5cGUgICA9IHBuZ19nZXRfaW50ZXJsYWNlX3R5cGUocG5nX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0cik7CisKKyAgICBjb21wcmVzc2lvbl90eXBlID0gcG5nX2dldF9jb21wcmVzc2lvbl90eXBlKHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOworCisgICAgZmlsdGVyX21ldGhvZCAgICA9IHBuZ19nZXRfZmlsdGVyX3R5cGUocG5nX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0cik7CisKKyAgICBjaGFubmVscyA9IHBuZ19nZXRfY2hhbm5lbHMocG5nX3B0ciwgaW5mb19wdHIpOworCisgICAgY2hhbm5lbHMgICAgICAgLSBudW1iZXIgb2YgY2hhbm5lbHMgb2YgaW5mbyBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICBjb2xvciB0eXBlICh2YWxpZCB2YWx1ZXMgYXJlIDEgKEdSQVksCisgICAgICAgICAgICAgICAgICAgICBQQUxFVFRFKSwgMiAoR1JBWV9BTFBIQSksIDMgKFJHQiksCisgICAgICAgICAgICAgICAgICAgICA0IChSR0JfQUxQSEEgb3IgUkdCICsgZmlsbGVyIGJ5dGUpKQorCisgICAgcm93Ynl0ZXMgPSBwbmdfZ2V0X3Jvd2J5dGVzKHBuZ19wdHIsIGluZm9fcHRyKTsKKworICAgIHJvd2J5dGVzICAgICAgIC0gbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byBob2xkIGEgcm93CisKKyAgICBzaWduYXR1cmUgPSBwbmdfZ2V0X3NpZ25hdHVyZShwbmdfcHRyLCBpbmZvX3B0cik7CisKKyAgICBzaWduYXR1cmUgICAgICAtIGhvbGRzIHRoZSBzaWduYXR1cmUgcmVhZCBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgICAgZmlsZSAoaWYgYW55KS4gIFRoZSBkYXRhIGlzIGtlcHQgaW4KKyAgICAgICAgICAgICAgICAgICAgIHRoZSBzYW1lIG9mZnNldCBpdCB3b3VsZCBiZSBpZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgIHdob2xlIHNpZ25hdHVyZSB3ZXJlIHJlYWQgKGkuZS4gaWYgYW4KKyAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGhhZCBhbHJlYWR5IHJlYWQgaW4gNAorICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgb2Ygc2lnbmF0dXJlIGJlZm9yZSBzdGFydGluZworICAgICAgICAgICAgICAgICAgICAgbGlicG5nLCB0aGUgcmVtYWluaW5nIDQgYnl0ZXMgd291bGQKKyAgICAgICAgICAgICAgICAgICAgIGJlIGluIHNpZ25hdHVyZVs0XSB0aHJvdWdoIHNpZ25hdHVyZVs3XQorICAgICAgICAgICAgICAgICAgICAgKHNlZSBwbmdfc2V0X3NpZ19ieXRlcygpKSkuCisKK1RoZXNlIGFyZSBhbHNvIGltcG9ydGFudCwgYnV0IHRoZWlyIHZhbGlkaXR5IGRlcGVuZHMgb24gd2hldGhlciB0aGUgY2h1bmsKK2hhcyBiZWVuIHJlYWQuICBUaGUgcG5nX2dldF92YWxpZChwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0lORk9fPGNodW5rPikgYW5kCitwbmdfZ2V0XzxjaHVuaz4ocG5nX3B0ciwgaW5mb19wdHIsIC4uLikgZnVuY3Rpb25zIHJldHVybiBub24temVybyBpZiB0aGUKK2RhdGEgaGFzIGJlZW4gcmVhZCwgb3IgemVybyBpZiBpdCBpcyBtaXNzaW5nLiAgVGhlIHBhcmFtZXRlcnMgdG8gdGhlCitwbmdfZ2V0XzxjaHVuaz4gYXJlIHNldCBkaXJlY3RseSBpZiB0aGV5IGFyZSBzaW1wbGUgZGF0YSB0eXBlcywgb3IgYQorcG9pbnRlciBpbnRvIHRoZSBpbmZvX3B0ciBpcyByZXR1cm5lZCBmb3IgYW55IGNvbXBsZXggdHlwZXMuCisKK1RoZSBjb2xvcnNwYWNlIGRhdGEgZnJvbSBnQU1BLCBjSFJNLCBzUkdCLCBpQ0NQLCBhbmQgc0JJVCBjaHVua3MKK2lzIHNpbXBseSByZXR1cm5lZCB0byBnaXZlIHRoZSBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCBob3cgdGhlCitpbWFnZSB3YXMgZW5jb2RlZC4gIExpYnBuZyBpdHNlbGYgb25seSBkb2VzIHRyYW5zZm9ybWF0aW9ucyB1c2luZyB0aGUgZmlsZQorZ2FtbWEgd2hlbiBjb21iaW5pbmcgc2VtaXRyYW5zcGFyZW50IHBpeGVscyB3aXRoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLCBhbmQsCitzaW5jZSBsaWJwbmctMS42LjAsIHdoZW4gY29udmVydGluZyBiZXR3ZWVuIDgtYml0IHNSR0IgYW5kIDE2LWJpdCBsaW5lYXIgcGl4ZWxzCit3aXRoaW4gdGhlIHNpbXBsaWZpZWQgQVBJLiAgTGlicG5nIGFsc28gdXNlcyB0aGUgZmlsZSBnYW1tYSB3aGVuIGNvbnZlcnRpbmcKK1JHQiB0byBncmF5LCBiZWdpbm5pbmcgd2l0aCBsaWJwbmctMS4wLjUsIGlmIHRoZSBhcHBsaWNhdGlvbiBjYWxscworcG5nX3NldF9yZ2JfdG9fZ3JheSgpKS4KKworICAgIHBuZ19nZXRfUExURShwbmdfcHRyLCBpbmZvX3B0ciwgJnBhbGV0dGUsCisgICAgICAgICAgICAgICAgICAgICAmbnVtX3BhbGV0dGUpOworCisgICAgcGFsZXR0ZSAgICAgICAgLSB0aGUgcGFsZXR0ZSBmb3IgdGhlIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgIChhcnJheSBvZiBwbmdfY29sb3IpCisKKyAgICBudW1fcGFsZXR0ZSAgICAtIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBwYWxldHRlCisKKyAgICBwbmdfZ2V0X2dBTUEocG5nX3B0ciwgaW5mb19wdHIsICZmaWxlX2dhbW1hKTsKKyAgICBwbmdfZ2V0X2dBTUFfZml4ZWQocG5nX3B0ciwgaW5mb19wdHIsICZpbnRfZmlsZV9nYW1tYSk7CisKKyAgICBmaWxlX2dhbW1hICAgICAtIHRoZSBnYW1tYSBhdCB3aGljaCB0aGUgZmlsZSBpcworICAgICAgICAgICAgICAgICAgICAgd3JpdHRlbiAoUE5HX0lORk9fZ0FNQSkKKworICAgIGludF9maWxlX2dhbW1hIC0gMTAwLDAwMCB0aW1lcyB0aGUgZ2FtbWEgYXQgd2hpY2ggdGhlCisgICAgICAgICAgICAgICAgICAgICBmaWxlIGlzIHdyaXR0ZW4KKworICAgIHBuZ19nZXRfY0hSTShwbmdfcHRyLCBpbmZvX3B0ciwgICZ3aGl0ZV94LCAmd2hpdGVfeSwgJnJlZF94LAorICAgICAgICAgICAgICAgICAgICAgJnJlZF95LCAmZ3JlZW5feCwgJmdyZWVuX3ksICZibHVlX3gsICZibHVlX3kpCisgICAgcG5nX2dldF9jSFJNX1hZWihwbmdfcHRyLCBpbmZvX3B0ciwgJnJlZF9YLCAmcmVkX1ksICZyZWRfWiwKKyAgICAgICAgICAgICAgICAgICAgICZncmVlbl9YLCAmZ3JlZW5fWSwgJmdyZWVuX1osICZibHVlX1gsICZibHVlX1ksCisgICAgICAgICAgICAgICAgICAgICAmYmx1ZV9aKQorICAgIHBuZ19nZXRfY0hSTV9maXhlZChwbmdfcHRyLCBpbmZvX3B0ciwgJmludF93aGl0ZV94LAorICAgICAgICAgICAgICAgICAgICAgJmludF93aGl0ZV95LCAmaW50X3JlZF94LCAmaW50X3JlZF95LAorICAgICAgICAgICAgICAgICAgICAgJmludF9ncmVlbl94LCAmaW50X2dyZWVuX3ksICZpbnRfYmx1ZV94LAorICAgICAgICAgICAgICAgICAgICAgJmludF9ibHVlX3kpCisgICAgcG5nX2dldF9jSFJNX1hZWl9maXhlZChwbmdfcHRyLCBpbmZvX3B0ciwgJmludF9yZWRfWCwgJmludF9yZWRfWSwKKyAgICAgICAgICAgICAgICAgICAgICZpbnRfcmVkX1osICZpbnRfZ3JlZW5fWCwgJmludF9ncmVlbl9ZLAorICAgICAgICAgICAgICAgICAgICAgJmludF9ncmVlbl9aLCAmaW50X2JsdWVfWCwgJmludF9ibHVlX1ksCisgICAgICAgICAgICAgICAgICAgICAmaW50X2JsdWVfWikKKworICAgIHt3aGl0ZSxyZWQsZ3JlZW4sYmx1ZX1fe3gseX0KKyAgICAgICAgICAgICAgICAgICAgIEEgY29sb3Igc3BhY2UgZW5jb2Rpbmcgc3BlY2lmaWVkIHVzaW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAgY2hyb21hdGljaXRpZXMgb2YgdGhlIGVuZCBwb2ludHMgYW5kIHRoZQorICAgICAgICAgICAgICAgICAgICAgd2hpdGUgcG9pbnQuIChQTkdfSU5GT19jSFJNKQorCisgICAge3JlZCxncmVlbixibHVlfV97WCxZLFp9CisgICAgICAgICAgICAgICAgICAgICBBIGNvbG9yIHNwYWNlIGVuY29kaW5nIHNwZWNpZmllZCB1c2luZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nIGVuZCBwb2ludHMgLSB0aGUgQ0lFIHRyaXN0aW11bHVzCisgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpY2F0aW9uIG9mIHRoZSBpbnRlbmRlZCBjb2xvciBvZiB0aGUgcmVkLAorICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gYW5kIGJsdWUgY2hhbm5lbHMgaW4gdGhlIFBORyBSR0IgZGF0YS4KKyAgICAgICAgICAgICAgICAgICAgIFRoZSB3aGl0ZSBwb2ludCBpcyBzaW1wbHkgdGhlIHN1bSBvZiB0aGUgdGhyZWUKKyAgICAgICAgICAgICAgICAgICAgIGVuZCBwb2ludHMuIChQTkdfSU5GT19jSFJNKQorCisgICAgcG5nX2dldF9zUkdCKHBuZ19wdHIsIGluZm9fcHRyLCAmc3JnYl9pbnRlbnQpOworCisgICAgc3JnYl9pbnRlbnQgLSAgICB0aGUgcmVuZGVyaW5nIGludGVudCAoUE5HX0lORk9fc1JHQikKKyAgICAgICAgICAgICAgICAgICAgIFRoZSBwcmVzZW5jZSBvZiB0aGUgc1JHQiBjaHVuaworICAgICAgICAgICAgICAgICAgICAgbWVhbnMgdGhhdCB0aGUgcGl4ZWwgZGF0YSBpcyBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgIHNSR0IgY29sb3Igc3BhY2UuICBUaGlzIGNodW5rIGFsc28KKyAgICAgICAgICAgICAgICAgICAgIGltcGxpZXMgc3BlY2lmaWMgdmFsdWVzIG9mIGdBTUEgYW5kCisgICAgICAgICAgICAgICAgICAgICBjSFJNLgorCisgICAgcG5nX2dldF9pQ0NQKHBuZ19wdHIsIGluZm9fcHRyLCAmbmFtZSwKKyAgICAgICAmY29tcHJlc3Npb25fdHlwZSwgJnByb2ZpbGUsICZwcm9mbGVuKTsKKworICAgIG5hbWUgICAgICAgICAgICAgLSBUaGUgcHJvZmlsZSBuYW1lLgorCisgICAgY29tcHJlc3Npb25fdHlwZSAtIFRoZSBjb21wcmVzc2lvbiB0eXBlOyBhbHdheXMKKyAgICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSBmb3IgUE5HIDEuMC4KKyAgICAgICAgICAgICAgICAgICAgICAgWW91IG1heSBnaXZlIE5VTEwgdG8gdGhpcyBhcmd1bWVudCB0bworICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUgaXQuCisKKyAgICBwcm9maWxlICAgICAgICAgIC0gSW50ZXJuYXRpb25hbCBDb2xvciBDb25zb3J0aXVtIGNvbG9yCisgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUgZGF0YS4gTWF5IGNvbnRhaW4gTlVMcy4KKworICAgIHByb2ZsZW4gICAgICAgICAgLSBsZW5ndGggb2YgcHJvZmlsZSBkYXRhIGluIGJ5dGVzLgorCisgICAgcG5nX2dldF9zQklUKHBuZ19wdHIsIGluZm9fcHRyLCAmc2lnX2JpdCk7CisKKyAgICBzaWdfYml0ICAgICAgICAtIHRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYml0cyBmb3IKKyAgICAgICAgICAgICAgICAgICAgIChQTkdfSU5GT19zQklUKSBlYWNoIG9mIHRoZSBncmF5LAorICAgICAgICAgICAgICAgICAgICAgcmVkLCBncmVlbiwgYW5kIGJsdWUgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICB3aGljaGV2ZXIgYXJlIGFwcHJvcHJpYXRlIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgIGdpdmVuIGNvbG9yIHR5cGUgKHBuZ19jb2xvcl8xNikKKworICAgIHBuZ19nZXRfdFJOUyhwbmdfcHRyLCBpbmZvX3B0ciwgJnRyYW5zX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgJm51bV90cmFucywgJnRyYW5zX2NvbG9yKTsKKworICAgIHRyYW5zX2FscGhhICAgIC0gYXJyYXkgb2YgYWxwaGEgKHRyYW5zcGFyZW5jeSkKKyAgICAgICAgICAgICAgICAgICAgIGVudHJpZXMgZm9yIHBhbGV0dGUgKFBOR19JTkZPX3RSTlMpCisKKyAgICBudW1fdHJhbnMgICAgICAtIG51bWJlciBvZiB0cmFuc3BhcmVudCBlbnRyaWVzCisgICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9fdFJOUykKKworICAgIHRyYW5zX2NvbG9yICAgIC0gZ3JheWxldmVsIG9yIGNvbG9yIHNhbXBsZSB2YWx1ZXMgb2YKKyAgICAgICAgICAgICAgICAgICAgIHRoZSBzaW5nbGUgdHJhbnNwYXJlbnQgY29sb3IgZm9yCisgICAgICAgICAgICAgICAgICAgICBub24tcGFsZXR0ZWQgaW1hZ2VzIChQTkdfSU5GT190Uk5TKQorCisgICAgcG5nX2dldF9oSVNUKHBuZ19wdHIsIGluZm9fcHRyLCAmaGlzdCk7CisgICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9faElTVCkKKworICAgIGhpc3QgICAgICAgICAgIC0gaGlzdG9ncmFtIG9mIHBhbGV0dGUgKGFycmF5IG9mCisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNikKKworICAgIHBuZ19nZXRfdElNRShwbmdfcHRyLCBpbmZvX3B0ciwgJm1vZF90aW1lKTsKKworICAgIG1vZF90aW1lICAgICAgIC0gdGltZSBpbWFnZSB3YXMgbGFzdCBtb2RpZmllZAorICAgICAgICAgICAgICAgICAgICAoUE5HX1ZBTElEX3RJTUUpCisKKyAgICBwbmdfZ2V0X2JLR0QocG5nX3B0ciwgaW5mb19wdHIsICZiYWNrZ3JvdW5kKTsKKworICAgIGJhY2tncm91bmQgICAgIC0gYmFja2dyb3VuZCBjb2xvciAob2YgdHlwZQorICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbG9yXzE2cCkgKFBOR19WQUxJRF9iS0dEKQorICAgICAgICAgICAgICAgICAgICAgdmFsaWQgMTYtYml0IHJlZCwgZ3JlZW4gYW5kIGJsdWUKKyAgICAgICAgICAgICAgICAgICAgIHZhbHVlcywgcmVnYXJkbGVzcyBvZiBjb2xvcl90eXBlCisKKyAgICBudW1fY29tbWVudHMgICA9IHBuZ19nZXRfdGV4dChwbmdfcHRyLCBpbmZvX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICZ0ZXh0X3B0ciwgJm51bV90ZXh0KTsKKworICAgIG51bV9jb21tZW50cyAgIC0gbnVtYmVyIG9mIGNvbW1lbnRzCisKKyAgICB0ZXh0X3B0ciAgICAgICAtIGFycmF5IG9mIHBuZ190ZXh0IGhvbGRpbmcgaW1hZ2UKKyAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzCisKKyAgICB0ZXh0X3B0cltpXS5jb21wcmVzc2lvbiAtIHR5cGUgb2YgY29tcHJlc3Npb24gdXNlZAorICAgICAgICAgICAgICAgICBvbiAidGV4dCIgUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORQorICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0lUWFRfQ09NUFJFU1NJT05fTk9ORQorICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0lUWFRfQ09NUFJFU1NJT05felRYdAorCisgICAgdGV4dF9wdHJbaV0ua2V5ICAgLSBrZXl3b3JkIGZvciBjb21tZW50LiAgTXVzdCBjb250YWluCisgICAgICAgICAgICAgICAgICAgICAgICAgMS03OSBjaGFyYWN0ZXJzLgorCisgICAgdGV4dF9wdHJbaV0udGV4dCAgLSB0ZXh0IGNvbW1lbnRzIGZvciBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZC4gIENhbiBiZSBlbXB0eS4KKworICAgIHRleHRfcHRyW2ldLnRleHRfbGVuZ3RoIC0gbGVuZ3RoIG9mIHRleHQgc3RyaW5nLAorICAgICAgICAgICAgICAgICBhZnRlciBkZWNvbXByZXNzaW9uLCAwIGZvciBpVFh0CisKKyAgICB0ZXh0X3B0cltpXS5pdHh0X2xlbmd0aCAtIGxlbmd0aCBvZiBpdHh0IHN0cmluZywKKyAgICAgICAgICAgICAgICAgYWZ0ZXIgZGVjb21wcmVzc2lvbiwgMCBmb3IgdEVYdC96VFh0CisKKyAgICB0ZXh0X3B0cltpXS5sYW5nICAtIGxhbmd1YWdlIG9mIGNvbW1lbnQgKGVtcHR5CisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZvciB1bmtub3duKS4KKworICAgIHRleHRfcHRyW2ldLmxhbmdfa2V5ICAtIGtleXdvcmQgaW4gVVRGLTgKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZW1wdHkgc3RyaW5nIGZvciB1bmtub3duKS4KKworICAgIE5vdGUgdGhhdCB0aGUgaXR4dF9sZW5ndGgsIGxhbmcsIGFuZCBsYW5nX2tleQorICAgIG1lbWJlcnMgb2YgdGhlIHRleHRfcHRyIHN0cnVjdHVyZSBvbmx5IGV4aXN0IHdoZW4gdGhlCisgICAgbGlicmFyeSBpcyBidWlsdCB3aXRoIGlUWHQgY2h1bmsgc3VwcG9ydC4gIFByaW9yIHRvCisgICAgbGlicG5nLTEuNC4wIHRoZSBsaWJyYXJ5IHdhcyBidWlsdCBieSBkZWZhdWx0IHdpdGhvdXQKKyAgICBpVFh0IHN1cHBvcnQuIEFsc28gbm90ZSB0aGF0IHdoZW4gaVRYdCBpcyBzdXBwb3J0ZWQsCisgICAgdGhleSBjb250YWluIE5VTEwgcG9pbnRlcnMgd2hlbiB0aGUgImNvbXByZXNzaW9uIgorICAgIGZpZWxkIGNvbnRhaW5zIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUgb3IKKyAgICBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0LgorCisgICAgbnVtX3RleHQgICAgICAgLSBudW1iZXIgb2YgY29tbWVudHMgKHNhbWUgYXMKKyAgICAgICAgICAgICAgICAgICAgIG51bV9jb21tZW50czsgeW91IGNhbiBwdXQgTlVMTCBoZXJlCisgICAgICAgICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgZHVwbGljYXRpb24pCisKKyAgICBOb3RlIHdoaWxlIHBuZ19zZXRfdGV4dCgpIHdpbGwgYWNjZXB0IHRleHQsIGxhbmd1YWdlLAorICAgIGFuZCB0cmFuc2xhdGVkIGtleXdvcmRzIHRoYXQgY2FuIGJlIE5VTEwgcG9pbnRlcnMsIHRoZQorICAgIHN0cnVjdHVyZSByZXR1cm5lZCBieSBwbmdfZ2V0X3RleHQgd2lsbCBhbHdheXMgY29udGFpbgorICAgIHJlZ3VsYXIgemVyby10ZXJtaW5hdGVkIEMgc3RyaW5ncy4gIFRoZXkgbWlnaHQgYmUKKyAgICBlbXB0eSBzdHJpbmdzIGJ1dCB0aGV5IHdpbGwgbmV2ZXIgYmUgTlVMTCBwb2ludGVycy4KKworICAgIG51bV9zcGFsZXR0ZXMgPSBwbmdfZ2V0X3NQTFQocG5nX3B0ciwgaW5mb19wdHIsCisgICAgICAgJnBhbGV0dGVfcHRyKTsKKworICAgIG51bV9zcGFsZXR0ZXMgIC0gbnVtYmVyIG9mIHNQTFQgY2h1bmtzIHJlYWQuCisKKyAgICBwYWxldHRlX3B0ciAgICAtIGFycmF5IG9mIHBhbGV0dGUgc3RydWN0dXJlcyBob2xkaW5nCisgICAgICAgICAgICAgICAgICAgICBjb250ZW50cyBvZiBvbmUgb3IgbW9yZSBzUExUIGNodW5rcworICAgICAgICAgICAgICAgICAgICAgcmVhZC4KKworICAgIHBuZ19nZXRfb0ZGcyhwbmdfcHRyLCBpbmZvX3B0ciwgJm9mZnNldF94LCAmb2Zmc2V0X3ksCisgICAgICAgJnVuaXRfdHlwZSk7CisKKyAgICBvZmZzZXRfeCAgICAgICAtIHBvc2l0aXZlIG9mZnNldCBmcm9tIHRoZSBsZWZ0IGVkZ2UKKyAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBzY3JlZW4gKGNhbiBiZSBuZWdhdGl2ZSkKKworICAgIG9mZnNldF95ICAgICAgIC0gcG9zaXRpdmUgb2Zmc2V0IGZyb20gdGhlIHRvcCBlZGdlCisgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgc2NyZWVuIChjYW4gYmUgbmVnYXRpdmUpCisKKyAgICB1bml0X3R5cGUgICAgICAtIFBOR19PRkZTRVRfUElYRUwsIFBOR19PRkZTRVRfTUlDUk9NRVRFUgorCisgICAgcG5nX2dldF9wSFlzKHBuZ19wdHIsIGluZm9fcHRyLCAmcmVzX3gsICZyZXNfeSwKKyAgICAgICAmdW5pdF90eXBlKTsKKworICAgIHJlc194ICAgICAgICAgIC0gcGl4ZWxzL3VuaXQgcGh5c2ljYWwgcmVzb2x1dGlvbiBpbgorICAgICAgICAgICAgICAgICAgICAgeCBkaXJlY3Rpb24KKworICAgIHJlc195ICAgICAgICAgIC0gcGl4ZWxzL3VuaXQgcGh5c2ljYWwgcmVzb2x1dGlvbiBpbgorICAgICAgICAgICAgICAgICAgICAgeCBkaXJlY3Rpb24KKworICAgIHVuaXRfdHlwZSAgICAgIC0gUE5HX1JFU09MVVRJT05fVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgIFBOR19SRVNPTFVUSU9OX01FVEVSCisKKyAgICBwbmdfZ2V0X3NDQUwocG5nX3B0ciwgaW5mb19wdHIsICZ1bml0LCAmd2lkdGgsCisgICAgICAgJmhlaWdodCkKKworICAgIHVuaXQgICAgICAgIC0gcGh5c2ljYWwgc2NhbGUgdW5pdHMgKGFuIGludGVnZXIpCisKKyAgICB3aWR0aCAgICAgICAtIHdpZHRoIG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKKworICAgIGhlaWdodCAgICAgIC0gaGVpZ2h0IG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKKyAgICAgICAgICAgICAgICAgKHdpZHRoIGFuZCBoZWlnaHQgYXJlIGRvdWJsZXMpCisKKyAgICBwbmdfZ2V0X3NDQUxfcyhwbmdfcHRyLCBpbmZvX3B0ciwgJnVuaXQsICZ3aWR0aCwKKyAgICAgICAmaGVpZ2h0KQorCisgICAgdW5pdCAgICAgICAgLSBwaHlzaWNhbCBzY2FsZSB1bml0cyAoYW4gaW50ZWdlcikKKworICAgIHdpZHRoICAgICAgIC0gd2lkdGggb2YgYSBwaXhlbCBpbiBwaHlzaWNhbCBzY2FsZSB1bml0cworICAgICAgICAgICAgICAgICAgKGV4cHJlc3NlZCBhcyBhIHN0cmluZykKKworICAgIGhlaWdodCAgICAgIC0gaGVpZ2h0IG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKKyAgICAgICAgICAgICAgICAgKHdpZHRoIGFuZCBoZWlnaHQgYXJlIHN0cmluZ3MgbGlrZSAiMi41NCIpCisKKyAgICBudW1fdW5rbm93bl9jaHVua3MgPSBwbmdfZ2V0X3Vua25vd25fY2h1bmtzKHBuZ19wdHIsCisgICAgICAgaW5mb19wdHIsICZ1bmtub3ducykKKworICAgIHVua25vd25zICAgICAgICAgIC0gYXJyYXkgb2YgcG5nX3Vua25vd25fY2h1bmsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZXMgaG9sZGluZyB1bmtub3duIGNodW5rcworCisgICAgdW5rbm93bnNbaV0ubmFtZSAgLSBuYW1lIG9mIHVua25vd24gY2h1bmsKKworICAgIHVua25vd25zW2ldLmRhdGEgIC0gZGF0YSBvZiB1bmtub3duIGNodW5rCisKKyAgICB1bmtub3duc1tpXS5zaXplICAtIHNpemUgb2YgdW5rbm93biBjaHVuaydzIGRhdGEKKworICAgIHVua25vd25zW2ldLmxvY2F0aW9uIC0gcG9zaXRpb24gb2YgY2h1bmsgaW4gZmlsZQorCisgICAgVGhlIHZhbHVlIG9mICJpIiBjb3JyZXNwb25kcyB0byB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlCisgICAgY2h1bmtzIHdlcmUgcmVhZCBmcm9tIHRoZSBQTkcgZmlsZSBvciBpbnNlcnRlZCB3aXRoIHRoZQorICAgIHBuZ19zZXRfdW5rbm93bl9jaHVua3MoKSBmdW5jdGlvbi4KKworICAgIFRoZSB2YWx1ZSBvZiAibG9jYXRpb24iIGlzIGEgYml0d2lzZSAib3IiIG9mCisKKyAgICAgICAgIFBOR19IQVZFX0lIRFIgICgweDAxKQorICAgICAgICAgUE5HX0hBVkVfUExURSAgKDB4MDIpCisgICAgICAgICBQTkdfQUZURVJfSURBVCAoMHgwOCkKKworVGhlIGRhdGEgZnJvbSB0aGUgcEhZcyBjaHVuayBjYW4gYmUgcmV0cmlldmVkIGluIHNldmVyYWwgY29udmVuaWVudAorZm9ybXM6CisKKyAgICByZXNfeCA9IHBuZ19nZXRfeF9waXhlbHNfcGVyX21ldGVyKHBuZ19wdHIsCisgICAgICAgaW5mb19wdHIpCisKKyAgICByZXNfeSA9IHBuZ19nZXRfeV9waXhlbHNfcGVyX21ldGVyKHBuZ19wdHIsCisgICAgICAgaW5mb19wdHIpCisKKyAgICByZXNfeF9hbmRfeSA9IHBuZ19nZXRfcGl4ZWxzX3Blcl9tZXRlcihwbmdfcHRyLAorICAgICAgIGluZm9fcHRyKQorCisgICAgcmVzX3ggPSBwbmdfZ2V0X3hfcGl4ZWxzX3Blcl9pbmNoKHBuZ19wdHIsCisgICAgICAgaW5mb19wdHIpCisKKyAgICByZXNfeSA9IHBuZ19nZXRfeV9waXhlbHNfcGVyX2luY2gocG5nX3B0ciwKKyAgICAgICBpbmZvX3B0cikKKworICAgIHJlc194X2FuZF95ID0gcG5nX2dldF9waXhlbHNfcGVyX2luY2gocG5nX3B0ciwKKyAgICAgICBpbmZvX3B0cikKKworICAgIGFzcGVjdF9yYXRpbyA9IHBuZ19nZXRfcGl4ZWxfYXNwZWN0X3JhdGlvKHBuZ19wdHIsCisgICAgICAgaW5mb19wdHIpCisKKyAgICBFYWNoIG9mIHRoZXNlIHJldHVybnMgMCBbc2lnbmlmeWluZyAidW5rbm93biJdIGlmCisgICAgICAgdGhlIGRhdGEgaXMgbm90IHByZXNlbnQgb3IgaWYgcmVzX3ggaXMgMDsKKyAgICAgICByZXNfeF9hbmRfeSBpcyAwIGlmIHJlc194ICE9IHJlc195CisKKyAgICBOb3RlIHRoYXQgYmVjYXVzZSBvZiB0aGUgd2F5IHRoZSByZXNvbHV0aW9ucyBhcmUKKyAgICAgICBzdG9yZWQgaW50ZXJuYWxseSwgdGhlIGluY2ggY29udmVyc2lvbnMgd29uJ3QKKyAgICAgICBjb21lIG91dCB0byBleGFjdGx5IGV2ZW4gbnVtYmVyLiAgRm9yIGV4YW1wbGUsCisgICAgICAgNzIgZHBpIGlzIHN0b3JlZCBhcyAwLjI4MzQ2IHBpeGVscy9tZXRlciwgYW5kCisgICAgICAgd2hlbiB0aGlzIGlzIHJldHJpZXZlZCBpdCBpcyA3MS45OTg4IGRwaSwgc28KKyAgICAgICBiZSBzdXJlIHRvIHJvdW5kIHRoZSByZXR1cm5lZCB2YWx1ZSBhcHByb3ByaWF0ZWx5CisgICAgICAgaWYgeW91IHdhbnQgdG8gZGlzcGxheSBhIHJlYXNvbmFibGUtbG9va2luZyByZXN1bHQuCisKK1RoZSBkYXRhIGZyb20gdGhlIG9GRnMgY2h1bmsgY2FuIGJlIHJldHJpZXZlZCBpbiBzZXZlcmFsIGNvbnZlbmllbnQKK2Zvcm1zOgorCisgICAgeF9vZmZzZXQgPSBwbmdfZ2V0X3hfb2Zmc2V0X21pY3JvbnMocG5nX3B0ciwgaW5mb19wdHIpOworCisgICAgeV9vZmZzZXQgPSBwbmdfZ2V0X3lfb2Zmc2V0X21pY3JvbnMocG5nX3B0ciwgaW5mb19wdHIpOworCisgICAgeF9vZmZzZXQgPSBwbmdfZ2V0X3hfb2Zmc2V0X2luY2hlcyhwbmdfcHRyLCBpbmZvX3B0cik7CisKKyAgICB5X29mZnNldCA9IHBuZ19nZXRfeV9vZmZzZXRfaW5jaGVzKHBuZ19wdHIsIGluZm9fcHRyKTsKKworICAgIEVhY2ggb2YgdGhlc2UgcmV0dXJucyAwIFtzaWduaWZ5aW5nICJ1bmtub3duIiBpZiBib3RoCisgICAgICAgeCBhbmQgeSBhcmUgMF0gaWYgdGhlIGRhdGEgaXMgbm90IHByZXNlbnQgb3IgaWYgdGhlCisgICAgICAgY2h1bmsgaXMgcHJlc2VudCBidXQgdGhlIHVuaXQgaXMgdGhlIHBpeGVsLiAgVGhlCisgICAgICAgcmVtYXJrIGFib3V0IGluZXhhY3QgaW5jaCBjb252ZXJzaW9ucyBhcHBsaWVzIGhlcmUKKyAgICAgICBhcyB3ZWxsLCBiZWNhdXNlIGEgdmFsdWUgaW4gaW5jaGVzIGNhbid0IGFsd2F5cyBiZQorICAgICAgIGNvbnZlcnRlZCB0byBtaWNyb25zIGFuZCBiYWNrIHdpdGhvdXQgc29tZSBsb3NzCisgICAgICAgb2YgcHJlY2lzaW9uLgorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZQorUE5HIHNwZWNpZmljYXRpb24gZm9yIGNodW5rIGNvbnRlbnRzLiAgQmUgY2FyZWZ1bCB3aXRoIHRydXN0aW5nCityb3dieXRlcywgYXMgc29tZSBvZiB0aGUgdHJhbnNmb3JtYXRpb25zIGNvdWxkIGluY3JlYXNlIHRoZSBzcGFjZQorbmVlZGVkIHRvIGhvbGQgYSByb3cgKGV4cGFuZCwgZmlsbGVyLCBncmF5X3RvX3JnYiwgZXRjLikuCitTZWUgcG5nX3JlYWRfdXBkYXRlX2luZm8oKSwgYmVsb3cuCisKK0EgcXVpY2sgd29yZCBhYm91dCB0ZXh0X3B0ciBhbmQgbnVtX3RleHQuICBQTkcgc3RvcmVzIGNvbW1lbnRzIGluCitrZXl3b3JkL3RleHQgcGFpcnMsIG9uZSBwYWlyIHBlciBjaHVuaywgd2l0aCBubyBsaW1pdCBvbiB0aGUgbnVtYmVyCitvZiB0ZXh0IGNodW5rcywgYW5kIGEgMl4zMSBieXRlIGxpbWl0IG9uIHRoZWlyIHNpemUuICBXaGlsZSB0aGVyZSBhcmUKK3N1Z2dlc3RlZCBrZXl3b3JkcywgdGhlcmUgaXMgbm8gcmVxdWlyZW1lbnQgdG8gcmVzdHJpY3QgdGhlIHVzZSB0byB0aGVzZQorc3RyaW5ncy4gIEl0IGlzIHN0cm9uZ2x5IHN1Z2dlc3RlZCB0aGF0IGtleXdvcmRzIGFuZCB0ZXh0IGJlIHNlbnNpYmxlCit0byBodW1hbnMgKHRoYXQncyB0aGUgcG9pbnQpLCBzbyBkb24ndCB1c2UgYWJicmV2aWF0aW9ucy4gIE5vbi1wcmludGluZworc3ltYm9scyBhcmUgbm90IGFsbG93ZWQuICBTZWUgdGhlIFBORyBzcGVjaWZpY2F0aW9uIGZvciBtb3JlIGRldGFpbHMuCitUaGVyZSBpcyBhbHNvIG5vIHJlcXVpcmVtZW50IHRvIGhhdmUgdGV4dCBhZnRlciB0aGUga2V5d29yZC4KKworS2V5d29yZHMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gNzkgTGF0aW4tMSBjaGFyYWN0ZXJzIHdpdGhvdXQgbGVhZGluZyBvcgordHJhaWxpbmcgc3BhY2VzLCBidXQgbm9uLWNvbnNlY3V0aXZlIHNwYWNlcyBhcmUgYWxsb3dlZCB3aXRoaW4gdGhlCitrZXl3b3JkLiAgSXQgaXMgcG9zc2libGUgdG8gaGF2ZSB0aGUgc2FtZSBrZXl3b3JkIGFueSBudW1iZXIgb2YgdGltZXMuCitUaGUgdGV4dF9wdHIgaXMgYW4gYXJyYXkgb2YgcG5nX3RleHQgc3RydWN0dXJlcywgZWFjaCBob2xkaW5nIGEKK3BvaW50ZXIgdG8gYSBsYW5ndWFnZSBzdHJpbmcsIGEgcG9pbnRlciB0byBhIGtleXdvcmQgYW5kIGEgcG9pbnRlciB0bworYSB0ZXh0IHN0cmluZy4gIFRoZSB0ZXh0IHN0cmluZywgbGFuZ3VhZ2UgY29kZSwgYW5kIHRyYW5zbGF0ZWQKK2tleXdvcmQgbWF5IGJlIGVtcHR5IG9yIE5VTEwgcG9pbnRlcnMuICBUaGUga2V5d29yZC90ZXh0CitwYWlycyBhcmUgcHV0IGludG8gdGhlIGFycmF5IGluIHRoZSBvcmRlciB0aGF0IHRoZXkgYXJlIHJlY2VpdmVkLgorSG93ZXZlciwgc29tZSBvciBhbGwgb2YgdGhlIHRleHQgY2h1bmtzIG1heSBiZSBhZnRlciB0aGUgaW1hZ2UsIHNvLCB0bworbWFrZSBzdXJlIHlvdSBoYXZlIHJlYWQgYWxsIHRoZSB0ZXh0IGNodW5rcywgZG9uJ3QgbWVzcyB3aXRoIHRoZXNlCit1bnRpbCBhZnRlciB5b3UgcmVhZCB0aGUgc3R1ZmYgYWZ0ZXIgdGhlIGltYWdlLiAgVGhpcyB3aWxsIGJlCittZW50aW9uZWQgYWdhaW4gYmVsb3cgaW4gdGhlIGRpc2N1c3Npb24gdGhhdCBnb2VzIHdpdGggcG5nX3JlYWRfZW5kKCkuCisKKy5TUyBJbnB1dCB0cmFuc2Zvcm1hdGlvbnMKKworQWZ0ZXIgeW91J3ZlIHJlYWQgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiwgeW91IGNhbiBzZXQgdXAgdGhlIGxpYnJhcnkKK3RvIGhhbmRsZSBhbnkgc3BlY2lhbCB0cmFuc2Zvcm1hdGlvbnMgb2YgdGhlIGltYWdlIGRhdGEuICBUaGUgdmFyaW91cword2F5cyB0byB0cmFuc2Zvcm0gdGhlIGRhdGEgd2lsbCBiZSBkZXNjcmliZWQgaW4gdGhlIG9yZGVyIHRoYXQgdGhleQorc2hvdWxkIG9jY3VyLiAgVGhpcyBpcyBpbXBvcnRhbnQsIGFzIHNvbWUgb2YgdGhlc2UgY2hhbmdlIHRoZSBjb2xvcgordHlwZSBhbmQvb3IgYml0IGRlcHRoIG9mIHRoZSBkYXRhLCBhbmQgc29tZSBvdGhlcnMgb25seSB3b3JrIG9uCitjZXJ0YWluIGNvbG9yIHR5cGVzIGFuZCBiaXQgZGVwdGhzLgorCitUcmFuc2Zvcm1hdGlvbnMgeW91IHJlcXVlc3QgYXJlIGlnbm9yZWQgaWYgdGhleSBkb24ndCBoYXZlIGFueSBtZWFuaW5nIGZvciBhCitwYXJ0aWN1bGFyIGlucHV0IGRhdGEgZm9ybWF0LiAgSG93ZXZlciBzb21lIHRyYW5zZm9ybWF0aW9ucyBjYW4gaGF2ZSBhbiBlZmZlY3QKK2FzIGEgcmVzdWx0IG9mIGEgcHJldmlvdXMgdHJhbnNmb3JtYXRpb24uICBJZiB5b3Ugc3BlY2lmeSBhIGNvbnRyYWRpY3Rvcnkgc2V0IG9mCit0cmFuc2Zvcm1hdGlvbnMsIGZvciBleGFtcGxlIGJvdGggYWRkaW5nIGFuZCByZW1vdmluZyB0aGUgYWxwaGEgY2hhbm5lbCwgeW91CitjYW5ub3QgcHJlZGljdCB0aGUgZmluYWwgcmVzdWx0LgorCitUaGUgY29sb3IgdXNlZCBmb3IgdGhlIHRyYW5zcGFyZW5jeSB2YWx1ZXMgc2hvdWxkIGJlIHN1cHBsaWVkIGluIHRoZSBzYW1lCitmb3JtYXQvZGVwdGggYXMgdGhlIGN1cnJlbnQgaW1hZ2UgZGF0YS4gIEl0IGlzIHN0b3JlZCBpbiB0aGUgc2FtZSBmb3JtYXQvZGVwdGgKK2FzIHRoZSBpbWFnZSBkYXRhIGluIGEgdFJOUyBjaHVuaywgc28gdGhpcyBpcyB3aGF0IGxpYnBuZyBleHBlY3RzIGZvciB0aGlzIGRhdGEuCisKK1RoZSBjb2xvciB1c2VkIGZvciB0aGUgYmFja2dyb3VuZCB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBuZWVkX2V4cGFuZCBhcmd1bWVudCBhcworZGVzY3JpYmVkIGJlbG93LgorCitEYXRhIHdpbGwgYmUgZGVjb2RlZCBpbnRvIHRoZSBzdXBwbGllZCByb3cgYnVmZmVycyBwYWNrZWQgaW50byBieXRlcwordW5sZXNzIHRoZSBsaWJyYXJ5IGhhcyBiZWVuIHRvbGQgdG8gdHJhbnNmb3JtIGl0IGludG8gYW5vdGhlciBmb3JtYXQuCitGb3IgZXhhbXBsZSwgNCBiaXQvcGl4ZWwgcGFsZXR0ZWQgb3IgZ3JheXNjYWxlIGRhdGEgd2lsbCBiZSByZXR1cm5lZAorMiBwaXhlbHMvYnl0ZSB3aXRoIHRoZSBsZWZ0bW9zdCBwaXhlbCBpbiB0aGUgaGlnaC1vcmRlciBiaXRzIG9mIHRoZSBieXRlLAordW5sZXNzIHBuZ19zZXRfcGFja2luZygpIGlzIGNhbGxlZC4gIDgtYml0IFJHQiBkYXRhIHdpbGwgYmUgc3RvcmVkCitpbiBSR0IgUkdCIFJHQiBmb3JtYXQgdW5sZXNzIHBuZ19zZXRfZmlsbGVyKCkgb3IgcG5nX3NldF9hZGRfYWxwaGEoKQoraXMgY2FsbGVkIHRvIGluc2VydCBmaWxsZXIgYnl0ZXMsIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgZWFjaCBSR0IgdHJpcGxldC4KKworMTYtYml0IFJHQiBkYXRhIHdpbGwgYmUgcmV0dXJuZWQgUlJHR0JCIFJSR0dCQiwgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudAorYnl0ZSBvZiB0aGUgY29sb3IgdmFsdWUgZmlyc3QsIHVubGVzcyBwbmdfc2V0X3NjYWxlXzE2KCkgaXMgY2FsbGVkIHRvCit0cmFuc2Zvcm0gaXQgdG8gcmVndWxhciBSR0IgUkdCIHRyaXBsZXRzLCBvciBwbmdfc2V0X2ZpbGxlcigpIG9yCitwbmdfc2V0X2FkZCBhbHBoYSgpIGlzIGNhbGxlZCB0byBpbnNlcnQgdHdvIGZpbGxlciBieXRlcywgZWl0aGVyIGJlZm9yZQorb3IgYWZ0ZXIgZWFjaCBSUkdHQkIgdHJpcGxldC4gIFNpbWlsYXJseSwgOC1iaXQgb3IgMTYtYml0IGdyYXlzY2FsZSBkYXRhIGNhbgorYmUgbW9kaWZpZWQgd2l0aCBwbmdfc2V0X2ZpbGxlcigpLCBwbmdfc2V0X2FkZF9hbHBoYSgpLCBwbmdfc2V0X3N0cmlwXzE2KCksCitvciBwbmdfc2V0X3NjYWxlXzE2KCkuCisKK1RoZSBmb2xsb3dpbmcgY29kZSB0cmFuc2Zvcm1zIGdyYXlzY2FsZSBpbWFnZXMgb2YgbGVzcyB0aGFuIDggdG8gOCBiaXRzLAorY2hhbmdlcyBwYWxldHRlZCBpbWFnZXMgdG8gUkdCLCBhbmQgYWRkcyBhIGZ1bGwgYWxwaGEgY2hhbm5lbCBpZiB0aGVyZSBpcwordHJhbnNwYXJlbmN5IGluZm9ybWF0aW9uIGluIGEgdFJOUyBjaHVuay4gIFRoaXMgaXMgbW9zdCB1c2VmdWwgb24KK2dyYXlzY2FsZSBpbWFnZXMgd2l0aCBiaXQgZGVwdGhzIG9mIDIgb3IgNCBvciBpZiB0aGVyZSBpcyBhIG11bHRpcGxlLWltYWdlCit2aWV3aW5nIGFwcGxpY2F0aW9uIHRoYXQgd2lzaGVzIHRvIHRyZWF0IGFsbCBpbWFnZXMgaW4gdGhlIHNhbWUgd2F5LgorCisgICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgICAgICAgcG5nX3NldF9wYWxldHRlX3RvX3JnYihwbmdfcHRyKTsKKworICAgIGlmIChwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLAorICAgICAgICBQTkdfSU5GT190Uk5TKSkgcG5nX3NldF90Uk5TX3RvX2FscGhhKHBuZ19wdHIpOworCisgICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSAmJgorICAgICAgICBiaXRfZGVwdGggPCA4KSBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgocG5nX3B0cik7CisKK1RoZSBmaXJzdCB0d28gZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBhbGlhc2VzIGZvciBwbmdfc2V0X2V4cGFuZCgpLCBhZGRlZAoraW4gbGlicG5nIHZlcnNpb24gMS4wLjQsIHdpdGggdGhlIGZ1bmN0aW9uIG5hbWVzIGV4cGFuZGVkIHRvIGltcHJvdmUgY29kZQorcmVhZGFiaWxpdHkuICBJbiBzb21lIGZ1dHVyZSB2ZXJzaW9uIHRoZXkgbWF5IGFjdHVhbGx5IGRvIGRpZmZlcmVudAordGhpbmdzLgorCitBcyBvZiBsaWJwbmcgdmVyc2lvbiAxLjIuOSwgcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KCkgd2FzCithZGRlZC4gIEl0IGV4cGFuZHMgdGhlIHNhbXBsZSBkZXB0aCB3aXRob3V0IGNoYW5naW5nIHRSTlMgdG8gYWxwaGEuCisKK0FzIG9mIGxpYnBuZyB2ZXJzaW9uIDEuNS4yLCBwbmdfc2V0X2V4cGFuZF8xNigpIHdhcyBhZGRlZC4gIEl0IGJlaGF2ZXMgYXMKK3BuZ19zZXRfZXhwYW5kKCk7IGhvd2V2ZXIsIHRoZSByZXN1bHRhbnQgY2hhbm5lbHMgaGF2ZSAxNiBiaXRzIHJhdGhlciB0aGFuIDguCitVc2UgdGhpcyB3aGVuIHRoZSBvdXRwdXQgY29sb3Igb3IgZ3JheSBjaGFubmVscyBhcmUgbWFkZSBsaW5lYXIgdG8gYXZvaWQgZmFpcmx5CitzZXZlcmUgYWNjdXJhY3kgbG9zcy4KKworICAgaWYgKGJpdF9kZXB0aCA8IDE2KQorICAgICAgcG5nX3NldF9leHBhbmRfMTYocG5nX3B0cik7CisKK1BORyBjYW4gaGF2ZSBmaWxlcyB3aXRoIDE2IGJpdHMgcGVyIGNoYW5uZWwuICBJZiB5b3Ugb25seSBjYW4gaGFuZGxlCis4IGJpdHMgcGVyIGNoYW5uZWwsIHRoaXMgd2lsbCBzdHJpcCB0aGUgcGl4ZWxzIGRvd24gdG8gOC1iaXQuCisKKyAgICBpZiAoYml0X2RlcHRoID09IDE2KQorI2lmIFBOR19MSUJQTkdfVkVSID49IDEwNTA0CisgICAgICAgcG5nX3NldF9zY2FsZV8xNihwbmdfcHRyKTsKKyNlbHNlCisgICAgICAgcG5nX3NldF9zdHJpcF8xNihwbmdfcHRyKTsKKyNlbmRpZgorCisoVGhlIG1vcmUgYWNjdXJhdGUgInBuZ19zZXRfc2NhbGVfMTYoKSIgQVBJIGJlY2FtZSBhdmFpbGFibGUgaW4gbGlicG5nIHZlcnNpb24KKzEuNS40KS4KKworSWYgeW91IG5lZWQgdG8gcHJvY2VzcyB0aGUgYWxwaGEgY2hhbm5lbCBvbiB0aGUgaW1hZ2Ugc2VwYXJhdGVseSBmcm9tIHRoZSBpbWFnZQorZGF0YSAoZm9yIGV4YW1wbGUgaWYgeW91IGNvbnZlcnQgaXQgdG8gYSBiaXRtYXAgbWFzaykgaXQgaXMgcG9zc2libGUgdG8gaGF2ZQorbGlicG5nIHN0cmlwIHRoZSBjaGFubmVsIGxlYXZpbmcganVzdCBSR0Igb3IgZ3JheSBkYXRhOgorCisgICAgaWYgKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkKKyAgICAgICBwbmdfc2V0X3N0cmlwX2FscGhhKHBuZ19wdHIpOworCitJZiB5b3Ugc3RyaXAgdGhlIGFscGhhIGNoYW5uZWwgeW91IG5lZWQgdG8gZmluZCBzb21lIG90aGVyIHdheSBvZiBkZWFsaW5nIHdpdGgKK3RoZSBpbmZvcm1hdGlvbi4gIElmLCBpbnN0ZWFkLCB5b3Ugd2FudCB0byBjb252ZXJ0IHRoZSBpbWFnZSB0byBhbiBvcGFxdWUKK3ZlcnNpb24gd2l0aCBubyBhbHBoYSBjaGFubmVsIHVzZSBwbmdfc2V0X2JhY2tncm91bmQ7IHNlZSBiZWxvdy4KKworQXMgb2YgbGlicG5nIHZlcnNpb24gMS41LjIsIGFsbW9zdCBhbGwgdXNlZnVsIGV4cGFuc2lvbnMgYXJlIHN1cHBvcnRlZCwgdGhlCittYWpvciBvbW1pc3Npb25zIGFyZSBjb252ZXJzaW9uIG9mIGdyYXlzY2FsZSB0byBpbmRleGVkIGltYWdlcyAod2hpY2ggY2FuIGJlCitkb25lIHRyaXZpYWxseSBpbiB0aGUgYXBwbGljYXRpb24pIGFuZCBjb252ZXJzaW9uIG9mIGluZGV4ZWQgdG8gZ3JheXNjYWxlICh3aGljaAorY2FuIGJlIGRvbmUgYnkgYSB0cml2aWFsIG1hbmlwdWxhdGlvbiBvZiB0aGUgcGFsZXR0ZS4pCisKK0luIHRoZSBmb2xsb3dpbmcgdGFibGUsIHRoZSAwMSBtZWFucyBncmF5c2NhbGUgd2l0aCBkZXB0aDw4LCAzMSBtZWFucworaW5kZXhlZCB3aXRoIGRlcHRoPDgsIG90aGVyIG51bWVyYWxzIHJlcHJlc2VudCB0aGUgY29sb3IgdHlwZSwgIlQiIG1lYW5zCit0aGUgdFJOUyBjaHVuayBpcyBwcmVzZW50LCBBIG1lYW5zIGFuIGFscGhhIGNoYW5uZWwgaXMgcHJlc2VudCwgYW5kIE8KK21lYW5zIHRSTlMgb3IgYWxwaGEgaXMgcHJlc2VudCBidXQgYWxsIHBpeGVscyBpbiB0aGUgaW1hZ2UgYXJlIG9wYXF1ZS4KKworICBGUk9NICAwMSAgMzEgICAwICAwVCAgME8gICAyICAyVCAgMk8gICAzICAzVCAgM08gIDRBICA0TyAgNkEgIDZPCisgICBUTworICAgMDEgICAgLSAgW0ddICAtICAgLSAgIC0gICAtICAgLSAgIC0gICAtICAgLSAgIC0gICAtICAgLSAgIC0gICAtCisgICAzMSAgIFtRXSAgUSAgW1FdIFtRXSBbUV0gIFEgICBRICAgUSAgIFEgICBRICAgUSAgW1FdIFtRXSAgUSAgIFEKKyAgICAwICAgIDEgICBHICAgKyAgIC4gICAuICAgRyAgIEcgICBHICAgRyAgIEcgICBHICAgQiAgIEIgIEdCICBHQgorICAgMFQgICAgbHQgIEd0ICB0ICAgKyAgIC4gICBHdCAgRyAgIEcgICBHdCAgRyAgIEcgICBCdCAgQnQgR0J0IEdCdAorICAgME8gICAgbHQgIEd0ICB0ICAgLiAgICsgICBHdCAgR3QgIEcgICBHdCAgR3QgIEcgICBCdCAgQnQgR0J0IEdCdAorICAgIDIgICAgQyAgIFAgICBDICAgQyAgIEMgICArICAgLiAgIC4gICBDICAgLSAgIC0gIENCICBDQiAgIEIgICBCCisgICAyVCAgICBDdCAgLSAgIEN0ICBDICAgQyAgIHQgICArICAgdCAgIC0gICAtICAgLSAgQ0J0IENCdCAgQnQgIEJ0CisgICAyTyAgICBDdCAgLSAgIEN0ICBDICAgQyAgIHQgICB0ICAgKyAgIC0gICAtICAgLSAgQ0J0IENCdCAgQnQgIEJ0CisgICAgMyAgIFtRXSAgcCAgW1FdIFtRXSBbUV0gIFEgICBRICAgUSAgICsgICAuICAgLiAgW1FdIFtRXSAgUSAgIFEKKyAgIDNUICAgW1F0XSBwICBbUXRdW1FdIFtRXSAgUXQgIFF0ICBRdCAgdCAgICsgICB0ICBbUXRdW1F0XSBRdCAgUXQKKyAgIDNPICAgW1F0XSBwICBbUXRdW1FdIFtRXSAgUXQgIFF0ICBRdCAgdCAgIHQgICArICBbUXRdW1F0XSBRdCAgUXQKKyAgIDRBICAgIGxBICBHICAgQSAgIFQgICBUICAgR0EgIEdUICBHVCAgR0EgIEdUICBHVCAgKyAgIEJBICBHICBHQkEKKyAgIDRPICAgIGxBIEdCQSAgQSAgIFQgICBUICAgR0EgIEdUICBHVCAgR0EgIEdUICBHVCAgQkEgICsgIEdCQSAgRworICAgNkEgICAgQ0EgIFBBICBDQSAgQyAgIEMgICBBICAgVCAgdFQgICBQQSAgUCAgIFAgICBDICBDQkEgICsgICBCQQorICAgNk8gICAgQ0EgUEJBICBDQSAgQyAgIEMgICBBICB0VCAgIFQgICBQQSAgUCAgIFAgIENCQSAgQyAgIEJBICArCisKK1dpdGhpbiB0aGUgbWF0cml4LAorICAgICAiKyIgaWRlbnRpZmllcyBlbnRyaWVzIHdoZXJlICdmcm9tJyBhbmQgJ3RvJyBhcmUgdGhlIHNhbWUuCisgICAgICItIiBtZWFucyB0aGUgdHJhbnNmb3JtYXRpb24gaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgIi4iIG1lYW5zIG5vdGhpbmcgaXMgbmVjZXNzYXJ5IChhIHRSTlMgY2h1bmsgY2FuIGp1c3QgYmUgaWdub3JlZCkuCisgICAgICJ0IiBtZWFucyB0aGUgdHJhbnNmb3JtYXRpb24gaXMgb2J0YWluZWQgYnkgcG5nX3NldF90Uk5TLgorICAgICAiQSIgbWVhbnMgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIG9idGFpbmVkIGJ5IHBuZ19zZXRfYWRkX2FscGhhKCkuCisgICAgICJYIiBtZWFucyB0aGUgdHJhbnNmb3JtYXRpb24gaXMgb2J0YWluZWQgYnkgcG5nX3NldF9leHBhbmQoKS4KKyAgICAgIjEiIG1lYW5zIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBvYnRhaW5lZCBieQorICAgICAgICAgcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KCkgKGFuZCBieSBwbmdfc2V0X2V4cGFuZCgpCisgICAgICAgICBpZiB0aGVyZSBpcyBubyB0cmFuc3BhcmVuY3kgaW4gdGhlIG9yaWdpbmFsIG9yIHRoZSBmaW5hbAorICAgICAgICAgZm9ybWF0KS4KKyAgICAgIkMiIG1lYW5zIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBvYnRhaW5lZCBieSBwbmdfc2V0X2dyYXlfdG9fcmdiKCkuCisgICAgICJHIiBtZWFucyB0aGUgdHJhbnNmb3JtYXRpb24gaXMgb2J0YWluZWQgYnkgcG5nX3NldF9yZ2JfdG9fZ3JheSgpLgorICAgICAiUCIgbWVhbnMgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIG9idGFpbmVkIGJ5CisgICAgICAgICBwbmdfc2V0X2V4cGFuZF9wYWxldHRlX3RvX3JnYigpLgorICAgICAicCIgbWVhbnMgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIG9idGFpbmVkIGJ5IHBuZ19zZXRfcGFja2luZygpLgorICAgICAiUSIgbWVhbnMgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIG9idGFpbmVkIGJ5IHBuZ19zZXRfcXVhbnRpemUoKS4KKyAgICAgIlQiIG1lYW5zIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBvYnRhaW5lZCBieQorICAgICAgICAgcG5nX3NldF90Uk5TX3RvX2FscGhhKCkuCisgICAgICJCIiBtZWFucyB0aGUgdHJhbnNmb3JtYXRpb24gaXMgb2J0YWluZWQgYnkKKyAgICAgICAgIHBuZ19zZXRfYmFja2dyb3VuZCgpLCBvciBwbmdfc3RyaXBfYWxwaGEoKS4KKworV2hlbiBhbiBlbnRyeSBoYXMgbXVsdGlwbGUgdHJhbnNmb3JtcyBsaXN0ZWQgYWxsIGFyZSByZXF1aXJlZCB0byBjYXVzZSB0aGUKK3JpZ2h0IG92ZXJhbGwgdHJhbnNmb3JtYXRpb24uICBXaGVuIHR3byB0cmFuc2Zvcm1zIGFyZSBzZXBhcmF0ZWQgYnkgYSBjb21tYQorZWl0aGVyIHdpbGwgZG8gdGhlIGpvYi4gIFdoZW4gdHJhbnNmb3JtcyBhcmUgZW5jbG9zZWQgaW4gW10gdGhlIHRyYW5zZm9ybSBzaG91bGQKK2RvIHRoZSBqb2IgYnV0IHRoaXMgaXMgY3VycmVudGx5IHVuaW1wbGVtZW50ZWQgLSBhIGRpZmZlcmVudCBmb3JtYXQgd2lsbCByZXN1bHQKK2lmIHRoZSBzdWdnZXN0ZWQgdHJhbnNmb3JtYXRpb25zIGFyZSB1c2VkLgorCitJbiBQTkcgZmlsZXMsIHRoZSBhbHBoYSBjaGFubmVsIGluIGFuIGltYWdlCitpcyB0aGUgbGV2ZWwgb2Ygb3BhY2l0eS4gIElmIHlvdSBuZWVkIHRoZSBhbHBoYSBjaGFubmVsIGluIGFuIGltYWdlIHRvCitiZSB0aGUgbGV2ZWwgb2YgdHJhbnNwYXJlbmN5IGluc3RlYWQgb2Ygb3BhY2l0eSwgeW91IGNhbiBpbnZlcnQgdGhlCithbHBoYSBjaGFubmVsIChvciB0aGUgdFJOUyBjaHVuayBkYXRhKSBhZnRlciBpdCdzIHJlYWQsIHNvIHRoYXQgMCBpcworZnVsbHkgb3BhcXVlIGFuZCAyNTUgKGluIDgtYml0IG9yIHBhbGV0dGVkIGltYWdlcykgb3IgNjU1MzUgKGluIDE2LWJpdAoraW1hZ2VzKSBpcyBmdWxseSB0cmFuc3BhcmVudCwgd2l0aAorCisgICAgcG5nX3NldF9pbnZlcnRfYWxwaGEocG5nX3B0cik7CisKK1BORyBmaWxlcyBwYWNrIHBpeGVscyBvZiBiaXQgZGVwdGhzIDEsIDIsIGFuZCA0IGludG8gYnl0ZXMgYXMgc21hbGwgYXMKK3RoZXkgY2FuLCByZXN1bHRpbmcgaW4sIGZvciBleGFtcGxlLCA4IHBpeGVscyBwZXIgYnl0ZSBmb3IgMSBiaXQKK2ZpbGVzLiAgVGhpcyBjb2RlIGV4cGFuZHMgdG8gMSBwaXhlbCBwZXIgYnl0ZSB3aXRob3V0IGNoYW5naW5nIHRoZQordmFsdWVzIG9mIHRoZSBwaXhlbHM6CisKKyAgICBpZiAoYml0X2RlcHRoIDwgOCkKKyAgICAgICBwbmdfc2V0X3BhY2tpbmcocG5nX3B0cik7CisKK1BORyBmaWxlcyBoYXZlIHBvc3NpYmxlIGJpdCBkZXB0aHMgb2YgMSwgMiwgNCwgOCwgYW5kIDE2LiAgQWxsIHBpeGVscworc3RvcmVkIGluIGEgUE5HIGltYWdlIGhhdmUgYmVlbiAic2NhbGVkIiBvciAic2hpZnRlZCIgdXAgdG8gdGhlIG5leHQKK2hpZ2hlciBwb3NzaWJsZSBiaXQgZGVwdGggKGUuZy4gZnJvbSA1IGJpdHMvc2FtcGxlIGluIHRoZSByYW5nZSBbMCwzMV0KK3RvIDggYml0cy9zYW1wbGUgaW4gdGhlIHJhbmdlIFswLCAyNTVdKS4gIEhvd2V2ZXIsIGl0IGlzIGFsc28gcG9zc2libGUKK3RvIGNvbnZlcnQgdGhlIFBORyBwaXhlbCBkYXRhIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGJpdCBkZXB0aCBvZiB0aGUKK2ltYWdlLiAgVGhpcyBjYWxsIHJlZHVjZXMgdGhlIHBpeGVscyBiYWNrIGRvd24gdG8gdGhlIG9yaWdpbmFsIGJpdCBkZXB0aDoKKworICAgIHBuZ19jb2xvcl84cCBzaWdfYml0OworCisgICAgaWYgKHBuZ19nZXRfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgJnNpZ19iaXQpKQorICAgICAgIHBuZ19zZXRfc2hpZnQocG5nX3B0ciwgc2lnX2JpdCk7CisKK1BORyBmaWxlcyBzdG9yZSAzLWNvbG9yIHBpeGVscyBpbiByZWQsIGdyZWVuLCBibHVlIG9yZGVyLiAgVGhpcyBjb2RlCitjaGFuZ2VzIHRoZSBzdG9yYWdlIG9mIHRoZSBwaXhlbHMgdG8gYmx1ZSwgZ3JlZW4sIHJlZDoKKworICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiB8fAorICAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkKKyAgICAgICBwbmdfc2V0X2JncihwbmdfcHRyKTsKKworUE5HIGZpbGVzIHN0b3JlIFJHQiBwaXhlbHMgcGFja2VkIGludG8gMyBvciA2IGJ5dGVzLiBUaGlzIGNvZGUgZXhwYW5kcyB0aGVtCitpbnRvIDQgb3IgOCBieXRlcyBmb3Igd2luZG93aW5nIHN5c3RlbXMgdGhhdCBuZWVkIHRoZW0gaW4gdGhpcyBmb3JtYXQ6CisKKyAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpCisgICAgICAgcG5nX3NldF9maWxsZXIocG5nX3B0ciwgZmlsbGVyLCBQTkdfRklMTEVSX0JFRk9SRSk7CisKK3doZXJlICJmaWxsZXIiIGlzIHRoZSA4LWJpdCBvciAxNi1iaXQgbnVtYmVyIHRvIGZpbGwgd2l0aCwgYW5kIHRoZSBsb2NhdGlvbgoraXMgZWl0aGVyIFBOR19GSUxMRVJfQkVGT1JFIG9yIFBOR19GSUxMRVJfQUZURVIsIGRlcGVuZGluZyB1cG9uIHdoZXRoZXIKK3lvdSB3YW50IHRoZSBmaWxsZXIgYmVmb3JlIHRoZSBSR0Igb3IgYWZ0ZXIuIFdoZW4gZmlsbGluZyBhbiA4LWJpdCBwaXhlbCwKK3RoZSBsZWFzdCBzaWduaWZpY2FudCA4IGJpdHMgb2YgdGhlIG51bWJlciBhcmUgdXNlZCwgaWYgYSAxNi1iaXQgbnVtYmVyIGlzCitzdXBwbGllZC4gIFRoaXMgdHJhbnNmb3JtYXRpb24gZG9lcyBub3QgYWZmZWN0IGltYWdlcyB0aGF0IGFscmVhZHkgaGF2ZSBmdWxsCithbHBoYSBjaGFubmVscy4gIFRvIGFkZCBhbiBvcGFxdWUgYWxwaGEgY2hhbm5lbCwgdXNlIGZpbGxlcj0weGZmZmYgYW5kCitQTkdfRklMTEVSX0FGVEVSIHdoaWNoIHdpbGwgZ2VuZXJhdGUgUkdCQSBwaXhlbHMuCisKK05vdGUgdGhhdCBwbmdfc2V0X2ZpbGxlcigpIGRvZXMgbm90IGNoYW5nZSB0aGUgY29sb3IgdHlwZS4gIElmIHlvdSB3YW50Cit0byBkbyB0aGF0LCB5b3UgY2FuIGFkZCBhIHRydWUgYWxwaGEgY2hhbm5lbCB3aXRoCisKKyAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgfHwKKyAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpCisgICAgICAgcG5nX3NldF9hZGRfYWxwaGEocG5nX3B0ciwgZmlsbGVyLCBQTkdfRklMTEVSX0FGVEVSKTsKKword2hlcmUgImZpbGxlciIgY29udGFpbnMgdGhlIGFscGhhIHZhbHVlIHRvIGFzc2lnbiB0byBlYWNoIHBpeGVsLgorVGhlIHBuZ19zZXRfYWRkX2FscGhhKCkgZnVuY3Rpb24gd2FzIGFkZGVkIGluIGxpYnBuZy0xLjIuNy4KKworSWYgeW91IGFyZSByZWFkaW5nIGFuIGltYWdlIHdpdGggYW4gYWxwaGEgY2hhbm5lbCwgYW5kIHlvdSBuZWVkIHRoZQorZGF0YSBhcyBBUkdCIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBQTkcgZm9ybWF0IFJHQkE6CisKKyAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCisgICAgICAgcG5nX3NldF9zd2FwX2FscGhhKHBuZ19wdHIpOworCitGb3Igc29tZSB1c2VzLCB5b3UgbWF5IHdhbnQgYSBncmF5c2NhbGUgaW1hZ2UgdG8gYmUgcmVwcmVzZW50ZWQgYXMKK1JHQi4gIFRoaXMgY29kZSB3aWxsIGRvIHRoYXQgY29udmVyc2lvbjoKKworICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgfHwKKyAgICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQorICAgICAgIHBuZ19zZXRfZ3JheV90b19yZ2IocG5nX3B0cik7CisKK0NvbnZlcnNlbHksIHlvdSBjYW4gY29udmVydCBhbiBSR0Igb3IgUkdCQSBpbWFnZSB0byBncmF5c2NhbGUgb3IgZ3JheXNjYWxlCit3aXRoIGFscGhhLgorCisgICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCIHx8CisgICAgICAgIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQorICAgICAgIHBuZ19zZXRfcmdiX3RvX2dyYXkocG5nX3B0ciwgZXJyb3JfYWN0aW9uLAorICAgICAgICAgIGRvdWJsZSByZWRfd2VpZ2h0LCBkb3VibGUgZ3JlZW5fd2VpZ2h0KTsKKworICAgIGVycm9yX2FjdGlvbiA9IDE6IHNpbGVudGx5IGRvIHRoZSBjb252ZXJzaW9uCisKKyAgICBlcnJvcl9hY3Rpb24gPSAyOiBpc3N1ZSBhIHdhcm5pbmcgaWYgdGhlIG9yaWdpbmFsCisgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgaGFzIGFueSBwaXhlbCB3aGVyZQorICAgICAgICAgICAgICAgICAgICAgIHJlZCAhPSBncmVlbiBvciByZWQgIT0gYmx1ZQorCisgICAgZXJyb3JfYWN0aW9uID0gMzogaXNzdWUgYW4gZXJyb3IgYW5kIGFib3J0IHRoZQorICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb24gaWYgdGhlIG9yaWdpbmFsCisgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgaGFzIGFueSBwaXhlbCB3aGVyZQorICAgICAgICAgICAgICAgICAgICAgIHJlZCAhPSBncmVlbiBvciByZWQgIT0gYmx1ZQorCisgICAgcmVkX3dlaWdodDogICAgICAgd2VpZ2h0IG9mIHJlZCBjb21wb25lbnQKKworICAgIGdyZWVuX3dlaWdodDogICAgIHdlaWdodCBvZiBncmVlbiBjb21wb25lbnQKKyAgICAgICAgICAgICAgICAgICAgICBJZiBlaXRoZXIgd2VpZ2h0IGlzIG5lZ2F0aXZlLCBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0cyBhcmUgdXNlZC4KKworSW4gdGhlIGNvcnJlc3BvbmRpbmcgZml4ZWQgcG9pbnQgQVBJIHRoZSByZWRfd2VpZ2h0IGFuZCBncmVlbl93ZWlnaHQgdmFsdWVzIGFyZQorc2ltcGx5IHNjYWxlZCBieSAxMDAsMDAwOgorCisgICAgcG5nX3NldF9yZ2JfdG9fZ3JheShwbmdfcHRyLCBlcnJvcl9hY3Rpb24sCisgICAgICAgcG5nX2ZpeGVkX3BvaW50IHJlZF93ZWlnaHQsCisgICAgICAgcG5nX2ZpeGVkX3BvaW50IGdyZWVuX3dlaWdodCk7CisKK0lmIHlvdSBoYXZlIHNldCBlcnJvcl9hY3Rpb24gPSAxIG9yIDIsIHlvdSBjYW4KK2xhdGVyIGNoZWNrIHdoZXRoZXIgdGhlIGltYWdlIHJlYWxseSB3YXMgZ3JheSwgYWZ0ZXIgcHJvY2Vzc2luZwordGhlIGltYWdlIHJvd3MsIHdpdGggdGhlIHBuZ19nZXRfcmdiX3RvX2dyYXlfc3RhdHVzKHBuZ19wdHIpIGZ1bmN0aW9uLgorSXQgd2lsbCByZXR1cm4gYSBwbmdfYnl0ZSB0aGF0IGlzIHplcm8gaWYgdGhlIGltYWdlIHdhcyBncmF5IG9yCisxIGlmIHRoZXJlIHdlcmUgYW55IG5vbi1ncmF5IHBpeGVscy4gIEJhY2tncm91bmQgYW5kIHNCSVQgZGF0YQord2lsbCBiZSBzaWxlbnRseSBjb252ZXJ0ZWQgdG8gZ3JheXNjYWxlLCB1c2luZyB0aGUgZ3JlZW4gY2hhbm5lbAorZGF0YSBmb3Igc0JJVCwgcmVnYXJkbGVzcyBvZiB0aGUgZXJyb3JfYWN0aW9uIHNldHRpbmcuCisKK1RoZSBkZWZhdWx0IHZhbHVlcyBjb21lIGZyb20gdGhlIFBORyBmaWxlIGNIUk0gY2h1bmsgaWYgcHJlc2VudDsgb3RoZXJ3aXNlLCB0aGUKK2RlZmF1bHRzIGNvcnJlc3BvbmQgdG8gdGhlIElUVS1SIHJlY29tbWVuZGF0aW9uIDcwOSwgYW5kIGFsc28gdGhlIHNSR0IgY29sb3IKK3NwYWNlLCBhcyByZWNvbW1lbmRlZCBpbiB0aGUgQ2hhcmxlcyBQb3ludG9uJ3MgQ29sb3VyIEZBUSwKK0NvcHlyaWdodCAoYykgMjAwNi0xMS0yOCBDaGFybGVzIFBveW50b24sIGluIHNlY3Rpb24gOToKKworPGh0dHA6Ly93d3cucG95bnRvbi5jb20vbm90ZXMvY29sb3VyX2FuZF9nYW1tYS9Db2xvckZBUS5odG1sI1JURlRvQzk+CisKKyAgICBZID0gMC4yMTI2ICogUiArIDAuNzE1MiAqIEcgKyAwLjA3MjIgKiBCCisKK1ByZXZpb3VzIHZlcnNpb25zIG9mIHRoaXMgZG9jdW1lbnQsIDE5OTggdGhyb3VnaCAyMDAyLCByZWNvbW1lbmRlZCBhIHNsaWdodGx5CitkaWZmZXJlbnQgZm9ybXVsYToKKworICAgIFkgPSAwLjIxMjY3MSAqIFIgKyAwLjcxNTE2MCAqIEcgKyAwLjA3MjE2OSAqIEIKKworTGlicG5nIHVzZXMgYW4gaW50ZWdlciBhcHByb3hpbWF0aW9uOgorCisgICAgWSA9ICg2OTY4ICogUiArIDIzNDM0ICogRyArIDIzNjYgKiBCKS8zMjc2OAorCitUaGUgY2FsY3VsYXRpb24gaXMgZG9uZSBpbiBhIGxpbmVhciBjb2xvcnNwYWNlLCBpZiB0aGUgaW1hZ2UgZ2FtbWEKK2NhbiBiZSBkZXRlcm1pbmVkLgorCitUaGUgcG5nX3NldF9iYWNrZ3JvdW5kKCkgZnVuY3Rpb24gaGFzIGJlZW4gZGVzY3JpYmVkIGFscmVhZHk7IGl0IHRlbGxzIGxpYnBuZyB0bworY29tcG9zaXRlIGltYWdlcyB3aXRoIGFscGhhIG9yIHNpbXBsZSB0cmFuc3BhcmVuY3kgYWdhaW5zdCB0aGUgc3VwcGxpZWQKK2JhY2tncm91bmQgY29sb3IuICBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIHZlcnNpb25zIG9mIGxpYnBuZyBlYXJsaWVyIHRoYW4KK2xpYnBuZy0xLjUuNCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBjYWxsIHRoZSBmdW5jdGlvbiBhZnRlciByZWFkaW5nIHRoZSBmaWxlCitoZWFkZXIsIGV2ZW4gaWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIHRoZSBjb2xvciBpbiBhIGJLR0QgY2h1bmssIGlmIG9uZSBleGlzdHMuCisKK0lmIHRoZSBQTkcgZmlsZSBjb250YWlucyBhIGJLR0QgY2h1bmsgKFBOR19JTkZPX2JLR0QgdmFsaWQpLAoreW91IG1heSB1c2UgdGhpcyBjb2xvciwgb3Igc3VwcGx5IGFub3RoZXIgY29sb3IgbW9yZSBzdWl0YWJsZSBmb3IKK3RoZSBjdXJyZW50IGRpc3BsYXkgKGUuZy4sIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGZyb20gYSB3ZWIgcGFnZSkuICBZb3UKK25lZWQgdG8gdGVsbCBsaWJwbmcgaG93IHRoZSBjb2xvciBpcyByZXByZXNlbnRlZCwgYm90aCB0aGUgZm9ybWF0IG9mIHRoZQorY29tcG9uZW50IHZhbHVlcyBpbiB0aGUgY29sb3IgKHRoZSBudW1iZXIgb2YgYml0cykgYW5kIHRoZSBnYW1tYSBlbmNvZGluZyBvZiB0aGUKK2NvbG9yLiAgVGhlIGZ1bmN0aW9uIHRha2VzIHR3byBhcmd1bWVudHMsIGJhY2tncm91bmRfZ2FtbWFfbW9kZSBhbmQgbmVlZF9leHBhbmQKK3RvIGNvbnZleSB0aGlzIGluZm9ybWF0aW9uOyBob3dldmVyLCBvbmx5IHR3byBjb21iaW5hdGlvbnMgYXJlIGxpa2VseSB0byBiZQordXNlZnVsOgorCisgICAgcG5nX2NvbG9yXzE2IG15X2JhY2tncm91bmQ7CisgICAgcG5nX2NvbG9yXzE2cCBpbWFnZV9iYWNrZ3JvdW5kOworCisgICAgaWYgKHBuZ19nZXRfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgJmltYWdlX2JhY2tncm91bmQpKQorICAgICAgIHBuZ19zZXRfYmFja2dyb3VuZChwbmdfcHRyLCBpbWFnZV9iYWNrZ3JvdW5kLAorICAgICAgICAgICBQTkdfQkFDS0dST1VORF9HQU1NQV9GSUxFLCAxLypuZWVkcyB0byBiZSBleHBhbmRlZCovLCAxKTsKKyAgICBlbHNlCisgICAgICAgcG5nX3NldF9iYWNrZ3JvdW5kKHBuZ19wdHIsICZteV9iYWNrZ3JvdW5kLAorICAgICAgICAgICBQTkdfQkFDS0dST1VORF9HQU1NQV9TQ1JFRU4sIDAvKmRvIG5vdCBleHBhbmQqLywgMSk7CisKK1RoZSBzZWNvbmQgY2FsbCB3YXMgZGVzY3JpYmVkIGFib3ZlIC0gbXlfYmFja2dyb3VuZCBpcyBpbiB0aGUgZm9ybWF0IG9mIHRoZQorZmluYWwsIGRpc3BsYXksIG91dHB1dCBwcm9kdWNlZCBieSBsaWJwbmcuICBCZWNhdXNlIHlvdSBub3cga25vdyB0aGUgZm9ybWF0IG9mCit0aGUgUE5HIGl0IGlzIHBvc3NpYmxlIHRvIGF2b2lkIHRoZSBuZWVkIHRvIGNob29zZSBlaXRoZXIgOC1iaXQgb3IgMTYtYml0CitvdXRwdXQgYW5kIHRvIHJldGFpbiBwYWxldHRlIGltYWdlcyAodGhlIHBhbGV0dGUgY29sb3JzIHdpbGwgYmUgbW9kaWZpZWQKK2FwcHJvcHJpYXRlbHkgYW5kIHRoZSB0Uk5TIGNodW5rIHJlbW92ZWQuKSAgSG93ZXZlciwgaWYgeW91IGFyZSBkb2luZyB0aGlzLAordGFrZSBncmVhdCBjYXJlIG5vdCB0byBhc2sgZm9yIHRyYW5zZm9ybWF0aW9ucyB3aXRob3V0IGNoZWNraW5nIGZpcnN0IHRoYXQKK3RoZXkgYXBwbHkhCisKK0luIHRoZSBmaXJzdCBjYWxsIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGhhcyB0aGUgb3JpZ2luYWwgYml0IGRlcHRoIGFuZCBjb2xvciB0eXBlCitvZiB0aGUgUE5HIGZpbGUuICBTbywgZm9yIHBhbGV0dGUgaW1hZ2VzIHRoZSBjb2xvciBpcyBzdXBwbGllZCBhcyBhIHBhbGV0dGUKK2luZGV4IGFuZCBmb3IgbG93IGJpdCBncmV5c2NhbGUgaW1hZ2VzIHRoZSBjb2xvciBpcyBhIHJlZHVjZWQgYml0IHZhbHVlIGluCitpbWFnZV9iYWNrZ3JvdW5kLT5ncmF5LgorCitJZiB5b3UgZGlkbid0IGNhbGwgcG5nX3NldF9nYW1tYSgpIGJlZm9yZSByZWFkaW5nIHRoZSBmaWxlIGhlYWRlciwgZm9yIGV4YW1wbGUKK2lmIHlvdSBuZWVkIHlvdXIgY29kZSB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIGxpYnBuZyBwcmlvcgordG8gbGlicG5nLTEuNS40LCB0aGlzIGlzIHRoZSBwbGFjZSB0byBjYWxsIGl0LgorCitEbyBub3QgY2FsbCBpdCBpZiB5b3UgY2FsbGVkIHBuZ19zZXRfYWxwaGFfbW9kZSgpOyBkb2luZyBzbyB3aWxsIGRhbWFnZSB0aGUKK3NldHRpbmdzIHB1dCBpbiBwbGFjZSBieSBwbmdfc2V0X2FscGhhX21vZGUoKS4gIChJZiBwbmdfc2V0X2FscGhhX21vZGUoKSBpcworc3VwcG9ydGVkIHRoZW4geW91IGNhbiBjZXJ0YWlubHkgZG8gcG5nX3NldF9nYW1tYSgpIGJlZm9yZSByZWFkaW5nIHRoZSBQTkcKK2hlYWRlci4pCisKK1RoaXMgQVBJIHVuY29uZGl0aW9uYWxseSBzZXRzIHRoZSBzY3JlZW4gYW5kIGZpbGUgZ2FtbWEgdmFsdWVzLCBzbyBpdCB3aWxsCitvdmVycmlkZSB0aGUgdmFsdWUgaW4gdGhlIFBORyBmaWxlIHVubGVzcyBpdCBpcyBjYWxsZWQgYmVmb3JlIHRoZSBQTkcgZmlsZQorcmVhZGluZyBzdGFydHMuICBGb3IgdGhpcyByZWFzb24geW91IG11c3QgYWx3YXlzIGNhbGwgaXQgd2l0aCB0aGUgUE5HIGZpbGUKK3ZhbHVlIHdoZW4geW91IGNhbGwgaXQgaW4gdGhpcyBwb3NpdGlvbjoKKworICAgaWYgKHBuZ19nZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgJmZpbGVfZ2FtbWEpKQorICAgICAgcG5nX3NldF9nYW1tYShwbmdfcHRyLCBzY3JlZW5fZ2FtbWEsIGZpbGVfZ2FtbWEpOworCisgICBlbHNlCisgICAgICBwbmdfc2V0X2dhbW1hKHBuZ19wdHIsIHNjcmVlbl9nYW1tYSwgMC40NTQ1NSk7CisKK0lmIHlvdSBuZWVkIHRvIHJlZHVjZSBhbiBSR0IgZmlsZSB0byBhIHBhbGV0dGVkIGZpbGUsIG9yIGlmIGEgcGFsZXR0ZWQKK2ZpbGUgaGFzIG1vcmUgZW50cmllcyB0aGFuIHdpbGwgZml0IG9uIHlvdXIgc2NyZWVuLCBwbmdfc2V0X3F1YW50aXplKCkKK3dpbGwgZG8gdGhhdC4gIE5vdGUgdGhhdCB0aGlzIGlzIGEgc2ltcGxlIG1hdGNoIHF1YW50aXphdGlvbiB0aGF0IG1lcmVseQorZmluZHMgdGhlIGNsb3Nlc3QgY29sb3IgYXZhaWxhYmxlLiAgVGhpcyBzaG91bGQgd29yayBmYWlybHkgd2VsbCB3aXRoCitvcHRpbWl6ZWQgcGFsZXR0ZXMsIGJ1dCBmYWlybHkgYmFkbHkgd2l0aCBsaW5lYXIgY29sb3IgY3ViZXMuICBJZiB5b3UKK3Bhc3MgYSBwYWxldHRlIHRoYXQgaXMgbGFyZ2VyIHRoYW4gbWF4aW11bV9jb2xvcnMsIHRoZSBmaWxlIHdpbGwKK3JlZHVjZSB0aGUgbnVtYmVyIG9mIGNvbG9ycyBpbiB0aGUgcGFsZXR0ZSBzbyBpdCB3aWxsIGZpdCBpbnRvCittYXhpbXVtX2NvbG9ycy4gIElmIHRoZXJlIGlzIGEgaGlzdG9ncmFtLCBsaWJwbmcgd2lsbCB1c2UgaXQgdG8gbWFrZQorbW9yZSBpbnRlbGxpZ2VudCBjaG9pY2VzIHdoZW4gcmVkdWNpbmcgdGhlIHBhbGV0dGUuICBJZiB0aGVyZSBpcyBubworaGlzdG9ncmFtLCBpdCBtYXkgbm90IGRvIGFzIGdvb2QgYSBqb2IuCisKKyAgIGlmIChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpCisgICB7CisgICAgICBpZiAocG5nX2dldF92YWxpZChwbmdfcHRyLCBpbmZvX3B0ciwKKyAgICAgICAgICBQTkdfSU5GT19QTFRFKSkKKyAgICAgIHsKKyAgICAgICAgIHBuZ191aW50XzE2cCBoaXN0b2dyYW0gPSBOVUxMOworCisgICAgICAgICBwbmdfZ2V0X2hJU1QocG5nX3B0ciwgaW5mb19wdHIsCisgICAgICAgICAgICAgJmhpc3RvZ3JhbSk7CisgICAgICAgICBwbmdfc2V0X3F1YW50aXplKHBuZ19wdHIsIHBhbGV0dGUsIG51bV9wYWxldHRlLAorICAgICAgICAgICAgbWF4X3NjcmVlbl9jb2xvcnMsIGhpc3RvZ3JhbSwgMSk7CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHBuZ19jb2xvciBzdGRfY29sb3JfY3ViZVtNQVhfU0NSRUVOX0NPTE9SU10gPQorICAgICAgICAgICAgeyAuLi4gY29sb3JzIC4uLiB9OworCisgICAgICAgICBwbmdfc2V0X3F1YW50aXplKHBuZ19wdHIsIHN0ZF9jb2xvcl9jdWJlLAorICAgICAgICAgICAgTUFYX1NDUkVFTl9DT0xPUlMsIE1BWF9TQ1JFRU5fQ09MT1JTLAorICAgICAgICAgICAgTlVMTCwwKTsKKyAgICAgIH0KKyAgIH0KKworUE5HIGZpbGVzIGRlc2NyaWJlIG1vbm9jaHJvbWUgYXMgYmxhY2sgYmVpbmcgemVybyBhbmQgd2hpdGUgYmVpbmcgb25lLgorVGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgcmV2ZXJzZSB0aGlzIChtYWtlIGJsYWNrIGJlIG9uZSBhbmQgd2hpdGUgYmUKK3plcm8pOgorCisgICBpZiAoYml0X2RlcHRoID09IDEgJiYgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQorICAgICAgcG5nX3NldF9pbnZlcnRfbW9ubyhwbmdfcHRyKTsKKworVGhpcyBmdW5jdGlvbiBjYW4gYWxzbyBiZSB1c2VkIHRvIGludmVydCBncmF5c2NhbGUgYW5kIGdyYXktYWxwaGEgaW1hZ2VzOgorCisgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZIHx8CisgICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQorICAgICAgcG5nX3NldF9pbnZlcnRfbW9ubyhwbmdfcHRyKTsKKworUE5HIGZpbGVzIHN0b3JlIDE2LWJpdCBwaXhlbHMgaW4gbmV0d29yayBieXRlIG9yZGVyIChiaWctZW5kaWFuLAoraWUuIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBmaXJzdCkuICBUaGlzIGNvZGUgY2hhbmdlcyB0aGUgc3RvcmFnZSB0byB0aGUKK290aGVyIHdheSAobGl0dGxlLWVuZGlhbiwgaS5lLiBsZWFzdCBzaWduaWZpY2FudCBiaXRzIGZpcnN0LCB0aGUKK3dheSBQQ3Mgc3RvcmUgdGhlbSk6CisKKyAgICBpZiAoYml0X2RlcHRoID09IDE2KQorICAgICAgIHBuZ19zZXRfc3dhcChwbmdfcHRyKTsKKworSWYgeW91IGFyZSB1c2luZyBwYWNrZWQtcGl4ZWwgaW1hZ2VzICgxLCAyLCBvciA0IGJpdHMvcGl4ZWwpLCBhbmQgeW91CituZWVkIHRvIGNoYW5nZSB0aGUgb3JkZXIgdGhlIHBpeGVscyBhcmUgcGFja2VkIGludG8gYnl0ZXMsIHlvdSBjYW4gdXNlOgorCisgICAgaWYgKGJpdF9kZXB0aCA8IDgpCisgICAgICAgcG5nX3NldF9wYWNrc3dhcChwbmdfcHRyKTsKKworRmluYWxseSwgeW91IGNhbiB3cml0ZSB5b3VyIG93biB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiBpZiBub25lIG9mCit0aGUgZXhpc3Rpbmcgb25lcyBtZWV0cyB5b3VyIG5lZWRzLiAgVGhpcyBpcyBkb25lIGJ5IHNldHRpbmcgYSBjYWxsYmFjaword2l0aAorCisgICAgcG5nX3NldF9yZWFkX3VzZXJfdHJhbnNmb3JtX2ZuKHBuZ19wdHIsCisgICAgICAgIHJlYWRfdHJhbnNmb3JtX2ZuKTsKKworWW91IG11c3Qgc3VwcGx5IHRoZSBmdW5jdGlvbgorCisgICAgdm9pZCByZWFkX3RyYW5zZm9ybV9mbihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfcm93X2luZm9wCisgICAgICAgIHJvd19pbmZvLCBwbmdfYnl0ZXAgZGF0YSkKKworU2VlIHBuZ3Rlc3QuYyBmb3IgYSB3b3JraW5nIGV4YW1wbGUuICBZb3VyIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCithZnRlciBhbGwgb2YgdGhlIG90aGVyIHRyYW5zZm9ybWF0aW9ucyBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAgVGFrZSBjYXJlIHdpdGgKK2ludGVybGFjZWQgaW1hZ2VzIGlmIHlvdSBkbyB0aGUgaW50ZXJsYWNlIHlvdXJzZWxmIC0gdGhlIHdpZHRoIG9mIHRoZSByb3cgaXMgdGhlCit3aWR0aCBpbiAncm93X2luZm8nLCBub3QgdGhlIG92ZXJhbGwgaW1hZ2Ugd2lkdGguCisKK0lmIHN1cHBvcnRlZCwgbGlicG5nIHByb3ZpZGVzIHR3byBpbmZvcm1hdGlvbiByb3V0aW5lcyB0aGF0IHlvdSBjYW4gdXNlIHRvIGZpbmQKK3doZXJlIHlvdSBhcmUgaW4gcHJvY2Vzc2luZyB0aGUgaW1hZ2U6CisKKyAgIHBuZ19nZXRfY3VycmVudF9wYXNzX251bWJlcihwbmdfc3RydWN0cCBwbmdfcHRyKTsKKyAgIHBuZ19nZXRfY3VycmVudF9yb3dfbnVtYmVyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpOworCitEb24ndCB0cnkgdXNpbmcgdGhlc2Ugb3V0c2lkZSBhIHRyYW5zZm9ybSBjYWxsYmFjayAtIGZpcnN0bHkgdGhleSBhcmUgb25seQorc3VwcG9ydGVkIGlmIHVzZXIgdHJhbnNmb3JtcyBhcmUgc3VwcG9ydGVkLCBzZWNvbmRseSB0aGV5IG1heSB3ZWxsIHJldHVybgordW5leHBlY3RlZCByZXN1bHRzIHVubGVzcyB0aGUgcm93IGlzIGFjdHVhbGx5IGJlaW5nIHByb2Nlc3NlZCBhdCB0aGUgbW9tZW50IHRoZXkKK2FyZSBjYWxsZWQuCisKK1dpdGggaW50ZXJsYWNlZAoraW1hZ2VzIHRoZSB2YWx1ZSByZXR1cm5lZCBpcyB0aGUgcm93IGluIHRoZSBpbnB1dCBzdWItaW1hZ2UgaW1hZ2UuICBVc2UKK1BOR19ST1dfRlJPTV9QQVNTX1JPVyhyb3csIHBhc3MpIGFuZCBQTkdfQ09MX0ZST01fUEFTU19DT0woY29sLCBwYXNzKSB0bworZmluZCB0aGUgb3V0cHV0IHBpeGVsICh4LHkpIGdpdmVuIGFuIGludGVybGFjZWQgc3ViLWltYWdlIHBpeGVsIChyb3csY29sLHBhc3MpLgorCitUaGUgZGlzY3Vzc2lvbiBvZiBpbnRlcmxhY2UgaGFuZGxpbmcgYWJvdmUgY29udGFpbnMgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8KK3VzZSB0aGVzZSB2YWx1ZXMuCisKK1lvdSBjYW4gYWxzbyBzZXQgdXAgYSBwb2ludGVyIHRvIGEgdXNlciBzdHJ1Y3R1cmUgZm9yIHVzZSBieSB5b3VyCitjYWxsYmFjayBmdW5jdGlvbiwgYW5kIHlvdSBjYW4gaW5mb3JtIGxpYnBuZyB0aGF0IHlvdXIgdHJhbnNmb3JtCitmdW5jdGlvbiB3aWxsIGNoYW5nZSB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIG9yIGJpdCBkZXB0aCB3aXRoIHRoZQorZnVuY3Rpb24KKworICAgIHBuZ19zZXRfdXNlcl90cmFuc2Zvcm1faW5mbyhwbmdfcHRyLCB1c2VyX3B0ciwKKyAgICAgICAgdXNlcl9kZXB0aCwgdXNlcl9jaGFubmVscyk7CisKK1RoZSB1c2VyJ3MgYXBwbGljYXRpb24sIG5vdCBsaWJwbmcsIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nIGFuZAorZnJlZWluZyBhbnkgbWVtb3J5IHJlcXVpcmVkIGZvciB0aGUgdXNlciBzdHJ1Y3R1cmUuCisKK1lvdSBjYW4gcmV0cmlldmUgdGhlIHBvaW50ZXIgdmlhIHRoZSBmdW5jdGlvbgorcG5nX2dldF91c2VyX3RyYW5zZm9ybV9wdHIoKS4gIEZvciBleGFtcGxlOgorCisgICAgdm9pZHAgcmVhZF91c2VyX3RyYW5zZm9ybV9wdHIgPQorICAgICAgICBwbmdfZ2V0X3VzZXJfdHJhbnNmb3JtX3B0cihwbmdfcHRyKTsKKworVGhlIGxhc3QgdGhpbmcgdG8gaGFuZGxlIGlzIGludGVybGFjaW5nOyB0aGlzIGlzIGNvdmVyZWQgaW4gZGV0YWlsIGJlbG93LAorYnV0IHlvdSBtdXN0IGNhbGwgdGhlIGZ1bmN0aW9uIGhlcmUgaWYgeW91IHdhbnQgbGlicG5nIHRvIGhhbmRsZSBleHBhbnNpb24KK29mIHRoZSBpbnRlcmxhY2VkIGltYWdlLgorCisgICAgbnVtYmVyX29mX3Bhc3NlcyA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOworCitBZnRlciBzZXR0aW5nIHRoZSB0cmFuc2Zvcm1hdGlvbnMsIGxpYnBuZyBjYW4gdXBkYXRlIHlvdXIgcG5nX2luZm8KK3N0cnVjdHVyZSB0byByZWZsZWN0IGFueSB0cmFuc2Zvcm1hdGlvbnMgeW91J3ZlIHJlcXVlc3RlZCB3aXRoIHRoaXMKK2NhbGwuCisKKyAgICBwbmdfcmVhZF91cGRhdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7CisKK1RoaXMgaXMgbW9zdCB1c2VmdWwgdG8gdXBkYXRlIHRoZSBpbmZvIHN0cnVjdHVyZSdzIHJvd2J5dGVzCitmaWVsZCBzbyB5b3UgY2FuIHVzZSBpdCB0byBhbGxvY2F0ZSB5b3VyIGltYWdlIG1lbW9yeS4gIFRoaXMgZnVuY3Rpb24KK3dpbGwgYWxzbyB1cGRhdGUgeW91ciBwYWxldHRlIHdpdGggdGhlIGNvcnJlY3Qgc2NyZWVuX2dhbW1hIGFuZAorYmFja2dyb3VuZCBpZiB0aGVzZSBoYXZlIGJlZW4gZ2l2ZW4gd2l0aCB0aGUgY2FsbHMgYWJvdmUuICBZb3UgbWF5Citvbmx5IGNhbGwgcG5nX3JlYWRfdXBkYXRlX2luZm8oKSBvbmNlIHdpdGggYSBwYXJ0aWN1bGFyIGluZm9fcHRyLgorCitBZnRlciB5b3UgY2FsbCBwbmdfcmVhZF91cGRhdGVfaW5mbygpLCB5b3UgY2FuIGFsbG9jYXRlIGFueQorbWVtb3J5IHlvdSBuZWVkIHRvIGhvbGQgdGhlIGltYWdlLiAgVGhlIHJvdyBkYXRhIGlzIHNpbXBseQorcmF3IGJ5dGUgZGF0YSBmb3IgYWxsIGZvcm1zIG9mIGltYWdlcy4gIEFzIHRoZSBhY3R1YWwgYWxsb2NhdGlvbgordmFyaWVzIGFtb25nIGFwcGxpY2F0aW9ucywgbm8gZXhhbXBsZSB3aWxsIGJlIGdpdmVuLiAgSWYgeW91CithcmUgYWxsb2NhdGluZyBvbmUgbGFyZ2UgY2h1bmssIHlvdSB3aWxsIG5lZWQgdG8gYnVpbGQgYW4KK2FycmF5IG9mIHBvaW50ZXJzIHRvIGVhY2ggcm93LCBhcyBpdCB3aWxsIGJlIG5lZWRlZCBmb3Igc29tZQorb2YgdGhlIGZ1bmN0aW9ucyBiZWxvdy4KKworUmVtZW1iZXI6IEJlZm9yZSB5b3UgY2FsbCBwbmdfcmVhZF91cGRhdGVfaW5mbygpLCB0aGUgcG5nX2dldF8qKCkKK2Z1bmN0aW9ucyByZXR1cm4gdGhlIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBvcmlnaW5hbCBQTkcgaW1hZ2UuCitBZnRlciB5b3UgY2FsbCBwbmdfcmVhZF91cGRhdGVfaW5mbyB0aGUgdmFsdWVzIHJlZmVyIHRvIHRoZSBpbWFnZQordGhhdCBsaWJwbmcgd2lsbCBvdXRwdXQuICBDb25zZXF1ZW50bHkgeW91IG11c3QgY2FsbCBhbGwgdGhlIHBuZ19zZXRfCitmdW5jdGlvbnMgYmVmb3JlIHlvdSBjYWxsIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCkuICBUaGlzIGlzIHBhcnRpY3VsYXJseQoraW1wb3J0YW50IGZvciBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZygpIC0gaWYgeW91IGFyZSBnb2luZyB0byBjYWxsCitwbmdfcmVhZF91cGRhdGVfaW5mbygpIHlvdSBtdXN0IGNhbGwgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcoKSBiZWZvcmUKK2l0IHVubGVzcyB5b3Ugd2FudCB0byByZWNlaXZlIGludGVybGFjZWQgb3V0cHV0LgorCisuU1MgUmVhZGluZyBpbWFnZSBkYXRhCisKK0FmdGVyIHlvdSd2ZSBhbGxvY2F0ZWQgbWVtb3J5LCB5b3UgY2FuIHJlYWQgdGhlIGltYWdlIGRhdGEuCitUaGUgc2ltcGxlc3Qgd2F5IHRvIGRvIHRoaXMgaXMgaW4gb25lIGZ1bmN0aW9uIGNhbGwuICBJZiB5b3UgYXJlCithbGxvY2F0aW5nIGVub3VnaCBtZW1vcnkgdG8gaG9sZCB0aGUgd2hvbGUgaW1hZ2UsIHlvdSBjYW4ganVzdAorY2FsbCBwbmdfcmVhZF9pbWFnZSgpIGFuZCBsaWJwbmcgd2lsbCByZWFkIGluIGFsbCB0aGUgaW1hZ2UgZGF0YQorYW5kIHB1dCBpdCBpbiB0aGUgbWVtb3J5IGFyZWEgc3VwcGxpZWQuICBZb3Ugd2lsbCBuZWVkIHRvIHBhc3MgaW4KK2FuIGFycmF5IG9mIHBvaW50ZXJzIHRvIGVhY2ggcm93LgorCitUaGlzIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkgaGFuZGxlcyBpbnRlcmxhY2luZywgc28geW91IGRvbid0CituZWVkIHRvIGNhbGwgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcoKSAodW5sZXNzIHlvdSBjYWxsCitwbmdfcmVhZF91cGRhdGVfaW5mbygpKSBvciBjYWxsIHRoaXMgZnVuY3Rpb24gbXVsdGlwbGUgdGltZXMsIG9yIGFueQorb2YgdGhhdCBvdGhlciBzdHVmZiBuZWNlc3Nhcnkgd2l0aCBwbmdfcmVhZF9yb3dzKCkuCisKKyAgIHBuZ19yZWFkX2ltYWdlKHBuZ19wdHIsIHJvd19wb2ludGVycyk7CisKK3doZXJlIHJvd19wb2ludGVycyBpczoKKworICAgcG5nX2J5dGVwIHJvd19wb2ludGVyc1toZWlnaHRdOworCitZb3UgY2FuIHBvaW50IHRvIHZvaWQgb3IgY2hhciBvciB3aGF0ZXZlciB5b3UgdXNlIGZvciBwaXhlbHMuCisKK0lmIHlvdSBkb24ndCB3YW50IHRvIHJlYWQgaW4gdGhlIHdob2xlIGltYWdlIGF0IG9uY2UsIHlvdSBjYW4KK3VzZSBwbmdfcmVhZF9yb3dzKCkgaW5zdGVhZC4gIElmIHRoZXJlIGlzIG5vIGludGVybGFjaW5nIChjaGVjaworaW50ZXJsYWNlX3R5cGUgPT0gUE5HX0lOVEVSTEFDRV9OT05FKSwgdGhpcyBpcyBzaW1wbGU6CisKKyAgICBwbmdfcmVhZF9yb3dzKHBuZ19wdHIsIHJvd19wb2ludGVycywgTlVMTCwKKyAgICAgICAgbnVtYmVyX29mX3Jvd3MpOworCit3aGVyZSByb3dfcG9pbnRlcnMgaXMgdGhlIHNhbWUgYXMgaW4gdGhlIHBuZ19yZWFkX2ltYWdlKCkgY2FsbC4KKworSWYgeW91IGFyZSBkb2luZyB0aGlzIGp1c3Qgb25lIHJvdyBhdCBhIHRpbWUsIHlvdSBjYW4gZG8gdGhpcyB3aXRoCithIHNpbmdsZSByb3dfcG9pbnRlciBpbnN0ZWFkIG9mIGFuIGFycmF5IG9mIHJvd19wb2ludGVyczoKKworICAgIHBuZ19ieXRlcCByb3dfcG9pbnRlciA9IHJvdzsKKyAgICBwbmdfcmVhZF9yb3cocG5nX3B0ciwgcm93X3BvaW50ZXIsIE5VTEwpOworCitJZiB0aGUgZmlsZSBpcyBpbnRlcmxhY2VkIChpbnRlcmxhY2VfdHlwZSAhPSAwIGluIHRoZSBJSERSIGNodW5rKSwgdGhpbmdzCitnZXQgc29tZXdoYXQgaGFyZGVyLiAgVGhlIG9ubHkgY3VycmVudCAoUE5HIFNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjIpCitpbnRlcmxhY2luZyB0eXBlIGZvciBQTkcgaXMgKGludGVybGFjZV90eXBlID09IFBOR19JTlRFUkxBQ0VfQURBTTcpOworYSBzb21ld2hhdCBjb21wbGljYXRlZCAyRCBpbnRlcmxhY2Ugc2NoZW1lLCBrbm93biBhcyBBZGFtNywgdGhhdAorYnJlYWtzIGRvd24gYW4gaW1hZ2UgaW50byBzZXZlbiBzbWFsbGVyIGltYWdlcyBvZiB2YXJ5aW5nIHNpemUsIGJhc2VkCitvbiBhbiA4eDggZ3JpZC4gIFRoaXMgbnVtYmVyIGlzIGRlZmluZWQgKGZyb20gbGlicG5nIDEuNSkgYXMKK1BOR19JTlRFUkxBQ0VfQURBTTdfUEFTU0VTIGluIHBuZy5oCisKK2xpYnBuZyBjYW4gZmlsbCBvdXQgdGhvc2UgaW1hZ2VzIG9yIGl0IGNhbiBnaXZlIHRoZW0gdG8geW91ICJhcyBpcyIuCitJdCBpcyBhbG1vc3QgYWx3YXlzIGJldHRlciB0byBoYXZlIGxpYnBuZyBoYW5kbGUgdGhlIGludGVybGFjaW5nIGZvciB5b3UuCitJZiB5b3Ugd2FudCB0aGUgaW1hZ2VzIGZpbGxlZCBvdXQsIHRoZXJlIGFyZSB0d28gd2F5cyB0byBkbyB0aGF0LiAgVGhlIG9uZQorbWVudGlvbmVkIGluIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiBpcyB0byBleHBhbmQgZWFjaCBwaXhlbCB0byBjb3ZlcgordGhvc2UgcGl4ZWxzIHRoYXQgaGF2ZSBub3QgYmVlbiByZWFkIHlldCAodGhlICJyZWN0YW5nbGUiIG1ldGhvZCkuCitUaGlzIHJlc3VsdHMgaW4gYSBibG9ja3kgaW1hZ2UgZm9yIHRoZSBmaXJzdCBwYXNzLCB3aGljaCBncmFkdWFsbHkKK3Ntb290aHMgb3V0IGFzIG1vcmUgcGl4ZWxzIGFyZSByZWFkLiAgVGhlIG90aGVyIG1ldGhvZCBpcyB0aGUgInNwYXJrbGUiCittZXRob2QsIHdoZXJlIHBpeGVscyBhcmUgZHJhd24gb25seSBpbiB0aGVpciBmaW5hbCBsb2NhdGlvbnMsIHdpdGggdGhlCityZXN0IG9mIHRoZSBpbWFnZSByZW1haW5pbmcgd2hhdGV2ZXIgY29sb3JzIHRoZXkgd2VyZSBpbml0aWFsaXplZCB0bworYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgcmVhZC4gIFRoZSBmaXJzdCBtZXRob2QgdXN1YWxseSBsb29rcyBiZXR0ZXIsCitidXQgdGVuZHMgdG8gYmUgc2xvd2VyLCBhcyB0aGVyZSBhcmUgbW9yZSBwaXhlbHMgdG8gcHV0IGluIHRoZSByb3dzLgorCitJZiwgYXMgaXMgbGlrZWx5LCB5b3Ugd2FudCBsaWJwbmcgdG8gZXhwYW5kIHRoZSBpbWFnZXMsIGNhbGwgdGhpcyBiZWZvcmUKK2NhbGxpbmcgcG5nX3N0YXJ0X3JlYWRfaW1hZ2UoKSBvciBwbmdfcmVhZF91cGRhdGVfaW5mbygpOgorCisgICAgaWYgKGludGVybGFjZV90eXBlID09IFBOR19JTlRFUkxBQ0VfQURBTTcpCisgICAgICAgbnVtYmVyX29mX3Bhc3NlcworICAgICAgICAgICA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOworCitUaGlzIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2YgcGFzc2VzIG5lZWRlZC4gIEN1cnJlbnRseSwgdGhpcyBpcyBzZXZlbiwKK2J1dCBtYXkgY2hhbmdlIGlmIGFub3RoZXIgaW50ZXJsYWNlIHR5cGUgaXMgYWRkZWQuICBUaGlzIGZ1bmN0aW9uIGNhbiBiZQorY2FsbGVkIGV2ZW4gaWYgdGhlIGZpbGUgaXMgbm90IGludGVybGFjZWQsIHdoZXJlIGl0IHdpbGwgcmV0dXJuIG9uZSBwYXNzLgorWW91IHRoZW4gbmVlZCB0byByZWFkIHRoZSB3aG9sZSBpbWFnZSAnbnVtYmVyX29mX3Bhc3NlcycgdGltZXMuICBFYWNoIHRpbWUKK3dpbGwgZGlzdHJpYnV0ZSB0aGUgcGl4ZWxzIGZyb20gdGhlIGN1cnJlbnQgcGFzcyB0byB0aGUgY29ycmVjdCBwbGFjZSBpbgordGhlIG91dHB1dCBpbWFnZSwgc28geW91IG5lZWQgdG8gc3VwcGx5IHRoZSBzYW1lIHJvd3MgdG8gcG5nX3JlYWRfcm93cyBpbgorZWFjaCBwYXNzLgorCitJZiB5b3UgYXJlIG5vdCBnb2luZyB0byBkaXNwbGF5IHRoZSBpbWFnZSBhZnRlciBlYWNoIHBhc3MsIGJ1dCBhcmUKK2dvaW5nIHRvIHdhaXQgdW50aWwgdGhlIGVudGlyZSBpbWFnZSBpcyByZWFkIGluLCB1c2UgdGhlIHNwYXJrbGUKK2VmZmVjdC4gIFRoaXMgZWZmZWN0IGlzIGZhc3RlciBhbmQgdGhlIGVuZCByZXN1bHQgb2YgZWl0aGVyIG1ldGhvZAoraXMgZXhhY3RseSB0aGUgc2FtZS4gIElmIHlvdSBhcmUgcGxhbm5pbmcgb24gZGlzcGxheWluZyB0aGUgaW1hZ2UKK2FmdGVyIGVhY2ggcGFzcywgdGhlICJyZWN0YW5nbGUiIGVmZmVjdCBpcyBnZW5lcmFsbHkgY29uc2lkZXJlZCB0aGUKK2JldHRlciBsb29raW5nIG9uZS4KKworSWYgeW91IG9ubHkgd2FudCB0aGUgInNwYXJrbGUiIGVmZmVjdCwganVzdCBjYWxsIHBuZ19yZWFkX3Jvd3MoKSBhcworbm9ybWFsLCB3aXRoIHRoZSB0aGlyZCBwYXJhbWV0ZXIgTlVMTC4gIE1ha2Ugc3VyZSB5b3UgbWFrZSBwYXNzIG92ZXIKK3RoZSBpbWFnZSBudW1iZXJfb2ZfcGFzc2VzIHRpbWVzLCBhbmQgeW91IGRvbid0IGNoYW5nZSB0aGUgZGF0YSBpbiB0aGUKK3Jvd3MgYmV0d2VlbiBjYWxscy4gIFlvdSBjYW4gY2hhbmdlIHRoZSBsb2NhdGlvbnMgb2YgdGhlIGRhdGEsIGp1c3QKK25vdCB0aGUgZGF0YS4gIEVhY2ggcGFzcyBvbmx5IHdyaXRlcyB0aGUgcGl4ZWxzIGFwcHJvcHJpYXRlIGZvciB0aGF0CitwYXNzLCBhbmQgYXNzdW1lcyB0aGUgZGF0YSBmcm9tIHByZXZpb3VzIHBhc3NlcyBpcyBzdGlsbCB2YWxpZC4KKworICAgIHBuZ19yZWFkX3Jvd3MocG5nX3B0ciwgcm93X3BvaW50ZXJzLCBOVUxMLAorICAgICAgICBudW1iZXJfb2Zfcm93cyk7CisKK0lmIHlvdSBvbmx5IHdhbnQgdGhlIGZpcnN0IGVmZmVjdCAodGhlIHJlY3RhbmdsZXMpLCBkbyB0aGUgc2FtZSBhcworYmVmb3JlIGV4Y2VwdCBwYXNzIHRoZSByb3cgYnVmZmVyIGluIHRoZSB0aGlyZCBwYXJhbWV0ZXIsIGFuZCBsZWF2ZQordGhlIHNlY29uZCBwYXJhbWV0ZXIgTlVMTC4KKworICAgIHBuZ19yZWFkX3Jvd3MocG5nX3B0ciwgTlVMTCwgcm93X3BvaW50ZXJzLAorICAgICAgICBudW1iZXJfb2Zfcm93cyk7CisKK0lmIHlvdSBkb24ndCB3YW50IGxpYnBuZyB0byBoYW5kbGUgdGhlIGludGVybGFjaW5nIGRldGFpbHMsIGp1c3QgY2FsbAorcG5nX3JlYWRfcm93cygpIFBOR19JTlRFUkxBQ0VfQURBTTdfUEFTU0VTIHRpbWVzIHRvIHJlYWQgaW4gYWxsIHRoZSBpbWFnZXMuCitFYWNoIG9mIHRoZSBpbWFnZXMgaXMgYSB2YWxpZCBpbWFnZSBieSBpdHNlbGY7IGhvd2V2ZXIsIHlvdSB3aWxsIGFsbW9zdAorY2VydGFpbmx5IG5lZWQgdG8gZGlzdHJpYnV0ZSB0aGUgcGl4ZWxzIGZyb20gZWFjaCBzdWItaW1hZ2UgdG8gdGhlCitjb3JyZWN0IHBsYWNlLiAgVGhpcyBpcyB3aGVyZSBldmVyeXRoaW5nIGdldHMgdmVyeSB0cmlja3kuCisKK0lmIHlvdSB3YW50IHRvIHJldHJpZXZlIHRoZSBzZXBhcmF0ZSBpbWFnZXMgeW91IG11c3QgcGFzcyB0aGUgY29ycmVjdAorbnVtYmVyIG9mIHJvd3MgdG8gZWFjaCBzdWNjZXNzaXZlIGNhbGwgb2YgcG5nX3JlYWRfcm93cygpLiAgVGhlIGNhbGN1bGF0aW9uCitnZXRzIHByZXR0eSBjb21wbGljYXRlZCBmb3Igc21hbGwgaW1hZ2VzLCB3aGVyZSBzb21lIHN1Yi1pbWFnZXMgbWF5Citub3QgZXZlbiBleGlzdCBiZWNhdXNlIGVpdGhlciB0aGVpciB3aWR0aCBvciBoZWlnaHQgZW5kcyB1cCB6ZXJvLgorbGlicG5nIHByb3ZpZGVzIHR3byBtYWNyb3MgdG8gaGVscCB5b3UgaW4gMS41IGFuZCBsYXRlciB2ZXJzaW9uczoKKworICAgcG5nX3VpbnRfMzIgd2lkdGggPSBQTkdfUEFTU19DT0xTKGltYWdlX3dpZHRoLCBwYXNzX251bWJlcik7CisgICBwbmdfdWludF8zMiBoZWlnaHQgPSBQTkdfUEFTU19ST1dTKGltYWdlX2hlaWdodCwgcGFzc19udW1iZXIpOworCitSZXNwZWN0aXZlbHkgdGhlc2UgdGVsbCB5b3UgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHN1Yi1pbWFnZQorY29ycmVzcG9uZGluZyB0byB0aGUgbnVtYmVyZWQgcGFzcy4gICdwYXNzJyBpcyBpbiBpbiB0aGUgcmFuZ2UgMCB0byA2IC0KK3RoaXMgY2FuIGJlIGNvbmZ1c2luZyBiZWNhdXNlIHRoZSBzcGVjaWZpY2F0aW9uIHJlZmVycyB0byB0aGUgc2FtZSBwYXNzZXMKK2FzIDEgdG8gNyEgIEJlIGNhcmVmdWwsIHlvdSBtdXN0IGNoZWNrIGJvdGggdGhlIHdpZHRoIGFuZCBoZWlnaHQgYmVmb3JlCitjYWxsaW5nIHBuZ19yZWFkX3Jvd3MoKSBhbmQgbm90IGNhbGwgaXQgZm9yIHRoYXQgcGFzcyBpZiBlaXRoZXIgaXMgemVyby4KKworWW91IGNhbiwgb2YgY291cnNlLCByZWFkIGVhY2ggc3ViLWltYWdlIHJvdyBieSByb3cuICBJZiB5b3Ugd2FudCB0bworcHJvZHVjZSBvcHRpbWFsIGNvZGUgdG8gbWFrZSBhIHBpeGVsLWJ5LXBpeGVsIHRyYW5zZm9ybWF0aW9uIG9mIGFuCitpbnRlcmxhY2VkIGltYWdlIHRoaXMgaXMgdGhlIGJlc3QgYXBwcm9hY2g7IHJlYWQgZWFjaCByb3cgb2YgZWFjaCBwYXNzLAordHJhbnNmb3JtIGl0LCBhbmQgd3JpdGUgaXQgb3V0IHRvIGEgbmV3IGludGVybGFjZWQgaW1hZ2UuCisKK0lmIHlvdSB3YW50IHRvIGRlLWludGVybGFjZSB0aGUgaW1hZ2UgeW91cnNlbGYgbGlicG5nIHByb3ZpZGVzIGZ1cnRoZXIKK21hY3JvcyB0byBoZWxwIHRoYXQgdGVsbCB5b3Ugd2hlcmUgdG8gcGxhY2UgdGhlIHBpeGVscyBpbiB0aGUgb3V0cHV0IGltYWdlLgorQmVjYXVzZSB0aGUgaW50ZXJsYWNpbmcgc2NoZW1lIGlzIHJlY3Rhbmd1bGFyIC0gc3ViLWltYWdlIHBpeGVscyBhcmUgYWx3YXlzCithcnJhbmdlZCBvbiBhIHJlY3Rhbmd1bGFyIGdyaWQgLSBhbGwgeW91IG5lZWQgdG8ga25vdyBmb3IgZWFjaCBwYXNzIGlzIHRoZQorc3RhcnRpbmcgY29sdW1uIGFuZCByb3cgaW4gdGhlIG91dHB1dCBpbWFnZSBvZiB0aGUgZmlyc3QgcGl4ZWwgcGx1cyB0aGUKK3NwYWNpbmcgYmV0d2VlbiBlYWNoIHBpeGVsLiAgQXMgb2YgbGlicG5nIDEuNSB0aGVyZSBhcmUgZm91ciBtYWNyb3MgdG8KK3JldHJpZXZlIHRoaXMgaW5mb3JtYXRpb246CisKKyAgIHBuZ191aW50XzMyIHggPSBQTkdfUEFTU19TVEFSVF9DT0wocGFzcyk7CisgICBwbmdfdWludF8zMiB5ID0gUE5HX1BBU1NfU1RBUlRfUk9XKHBhc3MpOworICAgcG5nX3VpbnRfMzIgeFN0ZXAgPSAxVSA8PCBQTkdfUEFTU19DT0xfU0hJRlQocGFzcyk7CisgICBwbmdfdWludF8zMiB5U3RlcCA9IDFVIDw8IFBOR19QQVNTX1JPV19TSElGVChwYXNzKTsKKworVGhlc2UgYWxsb3cgeW91IHRvIHdyaXRlIHRoZSBvYnZpb3VzIGxvb3A6CisKKyAgIHBuZ191aW50XzMyIGlucHV0X3kgPSAwOworICAgcG5nX3VpbnRfMzIgb3V0cHV0X3kgPSBQTkdfUEFTU19TVEFSVF9ST1cocGFzcyk7CisKKyAgIHdoaWxlIChvdXRwdXRfeSA8IG91dHB1dF9pbWFnZV9oZWlnaHQpCisgICB7CisgICAgICBwbmdfdWludF8zMiBpbnB1dF94ID0gMDsKKyAgICAgIHBuZ191aW50XzMyIG91dHB1dF94ID0gUE5HX1BBU1NfU1RBUlRfQ09MKHBhc3MpOworCisgICAgICB3aGlsZSAob3V0cHV0X3ggPCBvdXRwdXRfaW1hZ2Vfd2lkdGgpCisgICAgICB7CisgICAgICAgICBpbWFnZVtvdXRwdXRfeV1bb3V0cHV0X3hdID0KKyAgICAgICAgICAgICBzdWJpbWFnZVtwYXNzXVtpbnB1dF95XVtpbnB1dF94KytdOworCisgICAgICAgICBvdXRwdXRfeCArPSB4U3RlcDsKKyAgICAgIH0KKworICAgICAgKytpbnB1dF95OworICAgICAgb3V0cHV0X3kgKz0geVN0ZXA7CisgICB9CisKK05vdGljZSB0aGF0IHRoZSBzdGVwcyBiZXR3ZWVuIHN1Y2Nlc3NpdmUgb3V0cHV0IHJvd3MgYW5kIGNvbHVtbnMgYXJlCityZXR1cm5lZCBhcyBzaGlmdHMuICBUaGlzIGlzIHBvc3NpYmxlIGJlY2F1c2UgdGhlIHBpeGVscyBpbiB0aGUgc3ViaW1hZ2VzCithcmUgYWx3YXlzIGEgcG93ZXIgb2YgMiBhcGFydCAtIDEsIDIsIDQgb3IgOCBwaXhlbHMgLSBpbiB0aGUgb3JpZ2luYWwKK2ltYWdlLiAgSW4gcHJhY3RpY2UgeW91IG1heSBuZWVkIHRvIGRpcmVjdGx5IGNhbGN1bGF0ZSB0aGUgb3V0cHV0IGNvb3JkaW5hdGUKK2dpdmVuIGFuIGlucHV0IGNvb3JkaW5hdGUuICBsaWJwbmcgcHJvdmlkZXMgdHdvIGZ1cnRoZXIgbWFjcm9zIGZvciB0aGlzCitwdXJwb3NlOgorCisgICBwbmdfdWludF8zMiBvdXRwdXRfeCA9IFBOR19DT0xfRlJPTV9QQVNTX0NPTChpbnB1dF94LCBwYXNzKTsKKyAgIHBuZ191aW50XzMyIG91dHB1dF95ID0gUE5HX1JPV19GUk9NX1BBU1NfUk9XKGlucHV0X3ksIHBhc3MpOworCitGaW5hbGx5IGEgcGFpciBvZiBtYWNyb3MgYXJlIHByb3ZpZGVkIHRvIHRlbGwgeW91IGlmIGEgcGFydGljdWxhciBpbWFnZQorcm93IG9yIGNvbHVtbiBhcHBlYXJzIGluIGEgZ2l2ZW4gcGFzczoKKworICAgaW50IGNvbF9pbl9wYXNzID0gUE5HX0NPTF9JTl9JTlRFUkxBQ0VfUEFTUyhvdXRwdXRfeCwgcGFzcyk7CisgICBpbnQgcm93X2luX3Bhc3MgPSBQTkdfUk9XX0lOX0lOVEVSTEFDRV9QQVNTKG91dHB1dF95LCBwYXNzKTsKKworQmVhciBpbiBtaW5kIHRoYXQgeW91IHdpbGwgcHJvYmFibHkgYWxzbyBuZWVkIHRvIGNoZWNrIHRoZSB3aWR0aCBhbmQgaGVpZ2h0CitvZiB0aGUgcGFzcyBpbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUgdG8gYmUgc3VyZSB0aGUgcGFzcyBldmVuIGV4aXN0cyEKKworV2l0aCBhbnkgbHVjayB5b3UgYXJlIGNvbnZpbmNlZCBieSBub3cgdGhhdCB5b3UgZG9uJ3Qgd2FudCB0byBkbyB5b3VyIG93bgoraW50ZXJsYWNlIGhhbmRsaW5nLiAgSW4gcmVhbGl0eSBub3JtYWxseSB0aGUgb25seSBnb29kIHJlYXNvbiBmb3IgZG9pbmcgdGhpcworaXMgaWYgeW91IGFyZSBwcm9jZXNzaW5nIFBORyBmaWxlcyBvbiBhIHBpeGVsLWJ5LXBpeGVsIGJhc2lzIGFuZCBkb24ndCB3YW50Cit0byBsb2FkIHRoZSB3aG9sZSBmaWxlIGludG8gbWVtb3J5IHdoZW4gaXQgaXMgaW50ZXJsYWNlZC4KKworbGlicG5nIGluY2x1ZGVzIGEgdGVzdCBwcm9ncmFtLCBwbmd2YWxpZCwgdGhhdCBpbGx1c3RyYXRlcyByZWFkaW5nIGFuZAord3JpdGluZyBvZiBpbnRlcmxhY2VkIGltYWdlcy4gIElmIHlvdSBjYW4ndCBnZXQgaW50ZXJsYWNpbmcgdG8gd29yayBpbiB5b3VyCitjb2RlIGFuZCBkb24ndCB3YW50IHRvIGxlYXZlIGl0IHRvIGxpYnBuZyAodGhlIHJlY29tbWVuZGVkIGFwcHJvYWNoKSwgc2VlCitob3cgcG5ndmFsaWQuYyBkb2VzIGl0LgorCisuU1MgRmluaXNoaW5nIGEgc2VxdWVudGlhbCByZWFkCisKK0FmdGVyIHlvdSBhcmUgZmluaXNoZWQgcmVhZGluZyB0aGUgaW1hZ2UgdGhyb3VnaCB0aGUKK2xvdy1sZXZlbCBpbnRlcmZhY2UsIHlvdSBjYW4gZmluaXNoIHJlYWRpbmcgdGhlIGZpbGUuCisKK0lmIHlvdSB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCBjcmMgYWN0aW9uIGZvciBoYW5kbGluZyBDUkMgZXJyb3JzIGluCitjaHVua3MgYWZ0ZXIgdGhlIGltYWdlIGRhdGEsIHlvdSBjYW4gY2FsbCBwbmdfc2V0X2NyY19hY3Rpb24oKQorYWdhaW4gYXQgdGhpcyBwb2ludC4KKworSWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIGNvbW1lbnRzIG9yIHRpbWUsIHdoaWNoIG1heSBiZSBzdG9yZWQgZWl0aGVyCitiZWZvcmUgb3IgYWZ0ZXIgdGhlIGltYWdlIGRhdGEsIHlvdSBzaG91bGQgcGFzcyB0aGUgc2VwYXJhdGUgcG5nX2luZm8KK3N0cnVjdCBpZiB5b3Ugd2FudCB0byBrZWVwIHRoZSBjb21tZW50cyBmcm9tIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGltYWdlCitzZXBhcmF0ZS4KKworICAgIHBuZ19pbmZvcCBlbmRfaW5mbyA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7CisKKyAgICBpZiAoIWVuZF9pbmZvKQorICAgIHsKKyAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLAorICAgICAgICAgICAocG5nX2luZm9wcClOVUxMKTsKKyAgICAgICByZXR1cm4gKEVSUk9SKTsKKyAgICB9CisKKyAgIHBuZ19yZWFkX2VuZChwbmdfcHRyLCBlbmRfaW5mbyk7CisKK0lmIHlvdSBhcmUgbm90IGludGVyZXN0ZWQsIHlvdSBzaG91bGQgc3RpbGwgY2FsbCBwbmdfcmVhZF9lbmQoKQorYnV0IHlvdSBjYW4gcGFzcyBOVUxMLCBhdm9pZGluZyB0aGUgbmVlZCB0byBjcmVhdGUgYW4gZW5kX2luZm8gc3RydWN0dXJlLgorSWYgeW91IGRvIHRoaXMsIGxpYnBuZyB3aWxsIG5vdCBwcm9jZXNzIGFueSBjaHVua3MgYWZ0ZXIgSURBVCBvdGhlciB0aGFuCitza2lwcGluZyBvdmVyIHRoZW0gYW5kIHBlcmhhcHMgKGRlcGVuZGluZyBvbiB3aGV0aGVyIHlvdSBoYXZlIGNhbGxlZAorcG5nX3NldF9jcmNfYWN0aW9uKSBjaGVja2luZyB0aGVpciBDUkNzIHdoaWxlIGxvb2tpbmcgZm9yIHRoZSBJRU5EIGNodW5rLgorCisgICBwbmdfcmVhZF9lbmQocG5nX3B0ciwgKHBuZ19pbmZvcClOVUxMKTsKKworSWYgeW91IGRvbid0IGNhbGwgcG5nX3JlYWRfZW5kKCksIHRoZW4geW91ciBmaWxlIHBvaW50ZXIgd2lsbCBiZQorbGVmdCBwb2ludGluZyB0byB0aGUgZmlyc3QgY2h1bmsgYWZ0ZXIgdGhlIGxhc3QgSURBVCwgd2hpY2ggaXMgcHJvYmFibHkKK25vdCB3aGF0IHlvdSB3YW50IGlmIHlvdSBleHBlY3QgdG8gcmVhZCBzb21ldGhpbmcgYmV5b25kIHRoZSBlbmQgb2YKK3RoZSBQTkcgZGF0YXN0cmVhbS4KKworV2hlbiB5b3UgYXJlIGRvbmUsIHlvdSBjYW4gZnJlZSBhbGwgbWVtb3J5IGFsbG9jYXRlZCBieSBsaWJwbmcgbGlrZSB0aGlzOgorCisgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLAorICAgICAgICZlbmRfaW5mbyk7CisKK29yLCBpZiB5b3UgZGlkbid0IGNyZWF0ZSBhbiBlbmRfaW5mbyBzdHJ1Y3R1cmUsCisKKyAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsCisgICAgICAgKHBuZ19pbmZvcHApTlVMTCk7CisKK0l0IGlzIGFsc28gcG9zc2libGUgdG8gaW5kaXZpZHVhbGx5IGZyZWUgdGhlIGluZm9fcHRyIG1lbWJlcnMgdGhhdAorcG9pbnQgdG8gbGlicG5nLWFsbG9jYXRlZCBzdG9yYWdlIHdpdGggdGhlIGZvbGxvd2luZyBmdW5jdGlvbjoKKworICAgIHBuZ19mcmVlX2RhdGEocG5nX3B0ciwgaW5mb19wdHIsIG1hc2ssIHNlcSkKKworICAgIG1hc2sgLSBpZGVudGlmaWVzIGRhdGEgdG8gYmUgZnJlZWQsIGEgbWFzaworICAgICAgICAgICBjb250YWluaW5nIHRoZSBiaXR3aXNlIE9SIG9mIG9uZSBvcgorICAgICAgICAgICBtb3JlIG9mCisgICAgICAgICAgICAgUE5HX0ZSRUVfUExURSwgUE5HX0ZSRUVfVFJOUywKKyAgICAgICAgICAgICBQTkdfRlJFRV9ISVNULCBQTkdfRlJFRV9JQ0NQLAorICAgICAgICAgICAgIFBOR19GUkVFX1BDQUwsIFBOR19GUkVFX1JPV1MsCisgICAgICAgICAgICAgUE5HX0ZSRUVfU0NBTCwgUE5HX0ZSRUVfU1BMVCwKKyAgICAgICAgICAgICBQTkdfRlJFRV9URVhULCBQTkdfRlJFRV9VTktOLAorICAgICAgICAgICBvciBzaW1wbHkgUE5HX0ZSRUVfQUxMCisKKyAgICBzZXEgIC0gc2VxdWVuY2UgbnVtYmVyIG9mIGl0ZW0gdG8gYmUgZnJlZWQKKyAgICAgICAgICAgKFwtMSBmb3IgYWxsIGl0ZW1zKQorCitUaGlzIGZ1bmN0aW9uIG1heSBiZSBzYWZlbHkgY2FsbGVkIHdoZW4gdGhlIHJlbGV2YW50IHN0b3JhZ2UgaGFzCithbHJlYWR5IGJlZW4gZnJlZWQsIG9yIGhhcyBub3QgeWV0IGJlZW4gYWxsb2NhdGVkLCBvciB3YXMgYWxsb2NhdGVkCitieSB0aGUgdXNlciBhbmQgbm90IGJ5IGxpYnBuZywgIGFuZCB3aWxsIGluIHRob3NlIGNhc2VzIGRvIG5vdGhpbmcuCitUaGUgInNlcSIgcGFyYW1ldGVyIGlzIGlnbm9yZWQgaWYgb25seSBvbmUgaXRlbSBvZiB0aGUgc2VsZWN0ZWQgZGF0YQordHlwZSwgc3VjaCBhcyBQTFRFLCBpcyBhbGxvd2VkLiAgSWYgInNlcSIgaXMgbm90IFwtMSwgYW5kIG11bHRpcGxlIGl0ZW1zCithcmUgYWxsb3dlZCBmb3IgdGhlIGRhdGEgdHlwZSBpZGVudGlmaWVkIGluIHRoZSBtYXNrLCBzdWNoIGFzIHRleHQgb3IKK3NQTFQsIG9ubHkgdGhlIG4ndGggaXRlbSBpbiB0aGUgc3RydWN0dXJlIGlzIGZyZWVkLCB3aGVyZSBuIGlzICJzZXEiLgorCitUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyBvbmx5IHRvIGZyZWUgZGF0YSB0aGF0IHdhcyBhbGxvY2F0ZWQgaW50ZXJuYWxseQorYnkgbGlicG5nLiAgVGhpcyBjYW4gYmUgY2hhbmdlZCwgc28gdGhhdCBsaWJwbmcgd2lsbCBub3QgZnJlZSB0aGUgZGF0YSwKK29yIHNvIHRoYXQgaXQgd2lsbCBmcmVlIGRhdGEgdGhhdCB3YXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyIHdpdGggcG5nX21hbGxvYygpCitvciBwbmdfY2FsbG9jKCkgYW5kIHBhc3NlZCBpbiB2aWEgYSBwbmdfc2V0XyooKSBmdW5jdGlvbiwgd2l0aAorCisgICAgcG5nX2RhdGFfZnJlZXIocG5nX3B0ciwgaW5mb19wdHIsIGZyZWVyLCBtYXNrKQorCisgICAgZnJlZXIgIC0gb25lIG9mCisgICAgICAgICAgICAgICBQTkdfREVTVFJPWV9XSUxMX0ZSRUVfREFUQQorICAgICAgICAgICAgICAgUE5HX1NFVF9XSUxMX0ZSRUVfREFUQQorICAgICAgICAgICAgICAgUE5HX1VTRVJfV0lMTF9GUkVFX0RBVEEKKworICAgIG1hc2sgICAtIHdoaWNoIGRhdGEgZWxlbWVudHMgYXJlIGFmZmVjdGVkCisgICAgICAgICAgICAgc2FtZSBjaG9pY2VzIGFzIGluIHBuZ19mcmVlX2RhdGEoKQorCitUaGlzIGZ1bmN0aW9uIG9ubHkgYWZmZWN0cyBkYXRhIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQuCitZb3UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciByZWFkaW5nIHRoZSBQTkcgZGF0YSBidXQgYmVmb3JlIGNhbGxpbmcKK2FueSBwbmdfc2V0XyooKSBmdW5jdGlvbnMsIHRvIGNvbnRyb2wgd2hldGhlciB0aGUgdXNlciBvciB0aGUgcG5nX3NldF8qKCkKK2Z1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIGFueSBleGlzdGluZyBkYXRhIHRoYXQgbWlnaHQgYmUgcHJlc2VudCwKK2FuZCBhZ2FpbiBhZnRlciB0aGUgcG5nX3NldF8qKCkgZnVuY3Rpb25zIHRvIGNvbnRyb2wgd2hldGhlciB0aGUgdXNlcgorb3IgcG5nX2Rlc3Ryb3lfKigpIGlzIHN1cHBvc2VkIHRvIGZyZWUgdGhlIGRhdGEuICBXaGVuIHRoZSB1c2VyIGFzc3VtZXMKK3Jlc3BvbnNpYmlsaXR5IGZvciBsaWJwbmctYWxsb2NhdGVkIGRhdGEsIHRoZSBhcHBsaWNhdGlvbiBtdXN0IHVzZQorcG5nX2ZyZWUoKSB0byBmcmVlIGl0LCBhbmQgd2hlbiB0aGUgdXNlciB0cmFuc2ZlcnMgcmVzcG9uc2liaWxpdHkgdG8gbGlicG5nCitmb3IgZGF0YSB0aGF0IHRoZSB1c2VyIGhhcyBhbGxvY2F0ZWQsIHRoZSB1c2VyIG11c3QgaGF2ZSB1c2VkIHBuZ19tYWxsb2MoKQorb3IgcG5nX2NhbGxvYygpIHRvIGFsbG9jYXRlIGl0LgorCitJZiB5b3UgYWxsb2NhdGVkIHlvdXIgcm93X3BvaW50ZXJzIGluIGEgc2luZ2xlIGJsb2NrLCBhcyBzdWdnZXN0ZWQgYWJvdmUgaW4KK3RoZSBkZXNjcmlwdGlvbiBvZiB0aGUgaGlnaCBsZXZlbCByZWFkIGludGVyZmFjZSwgeW91IG11c3Qgbm90IHRyYW5zZmVyCityZXNwb25zaWJpbGl0eSBmb3IgZnJlZWluZyBpdCB0byB0aGUgcG5nX3NldF9yb3dzIG9yIHBuZ19yZWFkX2Rlc3Ryb3kgZnVuY3Rpb24sCitiZWNhdXNlIHRoZXkgd291bGQgYWxzbyB0cnkgdG8gZnJlZSB0aGUgaW5kaXZpZHVhbCByb3dfcG9pbnRlcnNbaV0uCisKK0lmIHlvdSBhbGxvY2F0ZWQgdGV4dF9wdHIudGV4dCwgdGV4dF9wdHIubGFuZywgYW5kIHRleHRfcHRyLnRyYW5zbGF0ZWRfa2V5d29yZAorc2VwYXJhdGVseSwgZG8gbm90IHRyYW5zZmVyIHJlc3BvbnNpYmlsaXR5IGZvciBmcmVlaW5nIHRleHRfcHRyIHRvIGxpYnBuZywKK2JlY2F1c2Ugd2hlbiBsaWJwbmcgZmlsbHMgYSBwbmdfdGV4dCBzdHJ1Y3R1cmUgaXQgY29tYmluZXMgdGhlc2UgbWVtYmVycyB3aXRoCit0aGUga2V5IG1lbWJlciwgYW5kIHBuZ19mcmVlX2RhdGEoKSB3aWxsIGZyZWUgb25seSB0ZXh0X3B0ci5rZXkuICBTaW1pbGFybHksCitpZiB5b3UgdHJhbnNmZXIgcmVzcG9uc2liaWxpdHkgZm9yIGZyZWUnaW5nIHRleHRfcHRyIGZyb20gbGlicG5nIHRvIHlvdXIKK2FwcGxpY2F0aW9uLCB5b3VyIGFwcGxpY2F0aW9uIG11c3Qgbm90IHNlcGFyYXRlbHkgZnJlZSB0aG9zZSBtZW1iZXJzLgorCitUaGUgcG5nX2ZyZWVfZGF0YSgpIGZ1bmN0aW9uIHdpbGwgdHVybiBvZmYgdGhlICJ2YWxpZCIgZmxhZyBmb3IgYW55dGhpbmcKK2l0IGZyZWVzLiAgSWYgeW91IG5lZWQgdG8gdHVybiB0aGUgZmxhZyBvZmYgZm9yIGEgY2h1bmsgdGhhdCB3YXMgZnJlZWQgYnkKK3lvdXIgYXBwbGljYXRpb24gaW5zdGVhZCBvZiBieSBsaWJwbmcsIHlvdSBjYW4gdXNlCisKKyAgICBwbmdfc2V0X2ludmFsaWQocG5nX3B0ciwgaW5mb19wdHIsIG1hc2spOworCisgICAgbWFzayAtIGlkZW50aWZpZXMgdGhlIGNodW5rcyB0byBiZSBtYWRlIGludmFsaWQsCisgICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIGJpdHdpc2UgT1Igb2Ygb25lIG9yCisgICAgICAgICAgIG1vcmUgb2YKKyAgICAgICAgICAgICBQTkdfSU5GT19nQU1BLCBQTkdfSU5GT19zQklULAorICAgICAgICAgICAgIFBOR19JTkZPX2NIUk0sIFBOR19JTkZPX1BMVEUsCisgICAgICAgICAgICAgUE5HX0lORk9fdFJOUywgUE5HX0lORk9fYktHRCwKKyAgICAgICAgICAgICBQTkdfSU5GT19oSVNULCBQTkdfSU5GT19wSFlzLAorICAgICAgICAgICAgIFBOR19JTkZPX29GRnMsIFBOR19JTkZPX3RJTUUsCisgICAgICAgICAgICAgUE5HX0lORk9fcENBTCwgUE5HX0lORk9fc1JHQiwKKyAgICAgICAgICAgICBQTkdfSU5GT19pQ0NQLCBQTkdfSU5GT19zUExULAorICAgICAgICAgICAgIFBOR19JTkZPX3NDQUwsIFBOR19JTkZPX0lEQVQKKworRm9yIGEgbW9yZSBjb21wYWN0IGV4YW1wbGUgb2YgcmVhZGluZyBhIFBORyBpbWFnZSwgc2VlIHRoZSBmaWxlIGV4YW1wbGUuYy4KKworLlNTIFJlYWRpbmcgUE5HIGZpbGVzIHByb2dyZXNzaXZlbHkKKworVGhlIHByb2dyZXNzaXZlIHJlYWRlciBpcyBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSB0aGUgbm9uLXByb2dyZXNzaXZlCityZWFkZXIuICBJbnN0ZWFkIG9mIGNhbGxpbmcgcG5nX3JlYWRfaW5mbygpLCBwbmdfcmVhZF9yb3dzKCksIGFuZAorcG5nX3JlYWRfZW5kKCksIHlvdSBtYWtlIG9uZSBjYWxsIHRvIHBuZ19wcm9jZXNzX2RhdGEoKSwgd2hpY2ggY2FsbHMKK2NhbGxiYWNrcyB3aGVuIGl0IGhhcyB0aGUgaW5mbywgYSByb3csIG9yIHRoZSBlbmQgb2YgdGhlIGltYWdlLiAgWW91CitzZXQgdXAgdGhlc2UgY2FsbGJhY2tzIHdpdGggcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKCkuICBZb3UgZG9uJ3QKK2hhdmUgdG8gd29ycnkgYWJvdXQgdGhlIGlucHV0L291dHB1dCBmdW5jdGlvbnMgb2YgbGlicG5nLCBhcyB5b3UgYXJlCitnaXZpbmcgdGhlIGxpYnJhcnkgdGhlIGRhdGEgZGlyZWN0bHkgaW4gcG5nX3Byb2Nlc3NfZGF0YSgpLiAgSSB3aWxsCithc3N1bWUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBzZWN0aW9uIG9uIHJlYWRpbmcgUE5HIGZpbGVzIGFib3ZlLAorc28gSSB3aWxsIG9ubHkgaGlnaGxpZ2h0IHRoZSBkaWZmZXJlbmNlcyAoYWx0aG91Z2ggSSB3aWxsIHNob3cKK2FsbCBvZiB0aGUgY29kZSkuCisKK3BuZ19zdHJ1Y3RwIHBuZ19wdHI7CitwbmdfaW5mb3AgaW5mb19wdHI7CisKKyAvKiAgQW4gZXhhbXBsZSBjb2RlIGZyYWdtZW50IG9mIGhvdyB5b3Ugd291bGQKKyAgICAgaW5pdGlhbGl6ZSB0aGUgcHJvZ3Jlc3NpdmUgcmVhZGVyIGluIHlvdXIKKyAgICAgYXBwbGljYXRpb24uICovCisgaW50CisgaW5pdGlhbGl6ZV9wbmdfcmVhZGVyKCkKKyB7CisgICAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QKKyAgICAgICAgKFBOR19MSUJQTkdfVkVSX1NUUklORywgKHBuZ192b2lkcCl1c2VyX2Vycm9yX3B0ciwKKyAgICAgICAgIHVzZXJfZXJyb3JfZm4sIHVzZXJfd2FybmluZ19mbik7CisKKyAgICBpZiAoIXBuZ19wdHIpCisgICAgICAgIHJldHVybiAoRVJST1IpOworCisgICAgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOworCisgICAgaWYgKCFpbmZvX3B0cikKKyAgICB7CisgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsCisgICAgICAgICAgKHBuZ19pbmZvcHApTlVMTCwgKHBuZ19pbmZvcHApTlVMTCk7CisgICAgICAgcmV0dXJuIChFUlJPUik7CisgICAgfQorCisgICAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZ19wdHIpKSkKKyAgICB7CisgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwKKyAgICAgICAgICAocG5nX2luZm9wcClOVUxMKTsKKyAgICAgICByZXR1cm4gKEVSUk9SKTsKKyAgICB9CisKKyAgICAvKiBUaGlzIG9uZSdzIG5ldy4gIFlvdSBjYW4gcHJvdmlkZSBmdW5jdGlvbnMKKyAgICAgICB0byBiZSBjYWxsZWQgd2hlbiB0aGUgaGVhZGVyIGluZm8gaXMgdmFsaWQsCisgICAgICAgd2hlbiBlYWNoIHJvdyBpcyBjb21wbGV0ZWQsIGFuZCB3aGVuIHRoZSBpbWFnZQorICAgICAgIGlzIGZpbmlzaGVkLiAgSWYgeW91IGFyZW4ndCB1c2luZyBhbGwgZnVuY3Rpb25zLAorICAgICAgIHlvdSBjYW4gc3BlY2lmeSBOVUxMIHBhcmFtZXRlcnMuICBFdmVuIHdoZW4gYWxsCisgICAgICAgdGhyZWUgZnVuY3Rpb25zIGFyZSBOVUxMLCB5b3UgbmVlZCB0byBjYWxsCisgICAgICAgcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKCkuICBZb3UgY2FuIHVzZQorICAgICAgIGFueSBzdHJ1Y3QgYXMgdGhlIHVzZXJfcHRyIChjYXN0IHRvIGEgdm9pZCBwb2ludGVyCisgICAgICAgZm9yIHRoZSBmdW5jdGlvbiBjYWxsKSwgYW5kIHJldHJpZXZlIHRoZSBwb2ludGVyCisgICAgICAgZnJvbSBpbnNpZGUgdGhlIGNhbGxiYWNrcyB1c2luZyB0aGUgZnVuY3Rpb24KKworICAgICAgICAgIHBuZ19nZXRfcHJvZ3Jlc3NpdmVfcHRyKHBuZ19wdHIpOworCisgICAgICAgd2hpY2ggd2lsbCByZXR1cm4gYSB2b2lkIHBvaW50ZXIsIHdoaWNoIHlvdSBoYXZlCisgICAgICAgdG8gY2FzdCBhcHByb3ByaWF0ZWx5LgorICAgICAqLworICAgIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbihwbmdfcHRyLCAodm9pZCAqKXVzZXJfcHRyLAorICAgICAgICBpbmZvX2NhbGxiYWNrLCByb3dfY2FsbGJhY2ssIGVuZF9jYWxsYmFjayk7CisKKyAgICByZXR1cm4gMDsKKyB9CisKKyAvKiBBIGNvZGUgZnJhZ21lbnQgdGhhdCB5b3UgY2FsbCBhcyB5b3UgcmVjZWl2ZSBibG9ja3MKKyAgIG9mIGRhdGEgKi8KKyBpbnQKKyBwcm9jZXNzX2RhdGEocG5nX2J5dGVwIGJ1ZmZlciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQorIHsKKyAgICBpZiAoc2V0am1wKHBuZ19qbXBidWYocG5nX3B0cikpKQorICAgIHsKKyAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLAorICAgICAgICAgICAocG5nX2luZm9wcClOVUxMKTsKKyAgICAgICByZXR1cm4gKEVSUk9SKTsKKyAgICB9CisKKyAgICAvKiBUaGlzIG9uZSdzIG5ldyBhbHNvLiAgU2ltcGx5IGdpdmUgaXQgYSBjaHVuaworICAgICAgIG9mIGRhdGEgZnJvbSB0aGUgZmlsZSBzdHJlYW0gKGluIG9yZGVyLCBvZgorICAgICAgIGNvdXJzZSkuICBPbiBtYWNoaW5lcyB3aXRoIHNlZ21lbnRlZCBtZW1vcnkKKyAgICAgICBtb2RlbHMgbWFjaGluZXMsIGRvbid0IGdpdmUgaXQgYW55IG1vcmUgdGhhbgorICAgICAgIDY0Sy4gIFRoZSBsaWJyYXJ5IHNlZW1zIHRvIHJ1biBmaW5lIHdpdGggc2l6ZXMKKyAgICAgICBvZiA0Sy4gQWx0aG91Z2ggeW91IGNhbiBnaXZlIGl0IG11Y2ggbGVzcyBpZgorICAgICAgIG5lY2Vzc2FyeSAoSSBhc3N1bWUgeW91IGNhbiBnaXZlIGl0IGNodW5rcyBvZgorICAgICAgIDEgYnl0ZSwgSSBoYXZlbid0IHRyaWVkIGxlc3MgdGhhbiAyNTYgYnl0ZXMKKyAgICAgICB5ZXQpLiAgV2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMsIHlvdSBtYXkKKyAgICAgICB3YW50IHRvIGRpc3BsYXkgYW55IHJvd3MgdGhhdCB3ZXJlIGdlbmVyYXRlZAorICAgICAgIGluIHRoZSByb3cgY2FsbGJhY2sgaWYgeW91IGRvbid0IGFscmVhZHkgZG8KKyAgICAgICBzbyB0aGVyZS4KKyAgICAgKi8KKyAgICBwbmdfcHJvY2Vzc19kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBidWZmZXIsIGxlbmd0aCk7CisKKyAgICAvKiBBdCB0aGlzIHBvaW50IHlvdSBjYW4gY2FsbCBwbmdfcHJvY2Vzc19kYXRhX3NraXAgaWYKKyAgICAgICB5b3Ugd2FudCB0byBoYW5kbGUgZGF0YSB0aGUgbGlicmFyeSB3aWxsIHNraXAgeW91cnNlbGY7CisgICAgICAgaXQgc2ltcGx5IHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwIChhbmQgc3RvcHMKKyAgICAgICBsaWJwbmcgc2tpcHBpbmcgdGhhdCBudW1iZXIgb2YgYnl0ZXMgb24gdGhlIG5leHQKKyAgICAgICBwbmdfcHJvY2Vzc19kYXRhIGNhbGwpLgorICAgIHJldHVybiAwOworIH0KKworIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIChhcyBzZXQgYnkKKyAgICBwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4oKSBhYm92ZSkgd2hlbiBlbm91Z2ggZGF0YQorICAgIGhhcyBiZWVuIHN1cHBsaWVkIHNvIGFsbCBvZiB0aGUgaGVhZGVyIGhhcyBiZWVuCisgICAgcmVhZC4KKyAqLworIHZvaWQKKyBpbmZvX2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvKQorIHsKKyAgICAvKiBEbyBhbnkgc2V0dXAgaGVyZSwgaW5jbHVkaW5nIHNldHRpbmcgYW55IG9mCisgICAgICAgdGhlIHRyYW5zZm9ybWF0aW9ucyBtZW50aW9uZWQgaW4gdGhlIFJlYWRpbmcKKyAgICAgICBQTkcgZmlsZXMgc2VjdGlvbi4gIEZvciBub3csIHlvdSBfbXVzdF8gY2FsbAorICAgICAgIGVpdGhlciBwbmdfc3RhcnRfcmVhZF9pbWFnZSgpIG9yCisgICAgICAgcG5nX3JlYWRfdXBkYXRlX2luZm8oKSBhZnRlciBhbGwgdGhlCisgICAgICAgdHJhbnNmb3JtYXRpb25zIGFyZSBzZXQgKGV2ZW4gaWYgeW91IGRvbid0IHNldAorICAgICAgIGFueSkuICBZb3UgbWF5IHN0YXJ0IGdldHRpbmcgcm93cyBiZWZvcmUKKyAgICAgICBwbmdfcHJvY2Vzc19kYXRhKCkgcmV0dXJucywgc28gdGhpcyBpcyB5b3VyCisgICAgICAgbGFzdCBjaGFuY2UgdG8gcHJlcGFyZSBmb3IgdGhhdC4KKworICAgICAgIFRoaXMgaXMgd2hlcmUgeW91IHR1cm4gb24gaW50ZXJsYWNlIGhhbmRsaW5nLAorICAgICAgIGFzc3VtaW5nIHlvdSBkb24ndCB3YW50IHRvIGRvIGl0IHlvdXJzZWxmLgorCisgICAgICAgSWYgeW91IG5lZWQgdG8geW91IGNhbiBzdG9wIHRoZSBwcm9jZXNzaW5nIG9mCisgICAgICAgeW91ciBvcmlnaW5hbCBpbnB1dCBkYXRhIGF0IHRoaXMgcG9pbnQgYnkgY2FsbGluZworICAgICAgIHBuZ19wcm9jZXNzX2RhdGFfcGF1c2UuICBUaGlzIHJldHVybnMgdGhlIG51bWJlcgorICAgICAgIG9mIHVucHJvY2Vzc2VkIGJ5dGVzIGZyb20gdGhlIGxhc3QgcG5nX3Byb2Nlc3NfZGF0YQorICAgICAgIGNhbGwgLSBpdCBpcyB1cCB0byB5b3UgdG8gZW5zdXJlIHRoYXQgdGhlIG5leHQgY2FsbAorICAgICAgIHNlZXMgdGhlc2UgYnl0ZXMgYWdhaW4uICBJZiB5b3UgZG9uJ3Qgd2FudCB0byBib3RoZXIKKyAgICAgICB3aXRoIHRoaXMgeW91IGNhbiBnZXQgbGlicG5nIHRvIGNhY2hlIHRoZSB1bnJlYWQKKyAgICAgICBieXRlcyBieSBzZXR0aW5nIHRoZSAnc2F2ZScgcGFyYW1ldGVyIChzZWUgcG5nLmgpIGJ1dAorICAgICAgIHRoZW4gbGlicG5nIHdpbGwgaGF2ZSB0byBjb3B5IHRoZSBkYXRhIGludGVybmFsbHkuCisgICAgICovCisgfQorCisgLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBlYWNoIHJvdyBvZiBpbWFnZQorICAgIGRhdGEgaXMgY29tcGxldGUgKi8KKyB2b2lkCisgcm93X2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBuZXdfcm93LAorICAgIHBuZ191aW50XzMyIHJvd19udW0sIGludCBwYXNzKQorIHsKKyAgICAvKiBJZiB0aGUgaW1hZ2UgaXMgaW50ZXJsYWNlZCwgYW5kIHlvdSB0dXJuZWQKKyAgICAgICBvbiB0aGUgaW50ZXJsYWNlIGhhbmRsZXIsIHRoaXMgZnVuY3Rpb24gd2lsbAorICAgICAgIGJlIGNhbGxlZCBmb3IgZXZlcnkgcm93IGluIGV2ZXJ5IHBhc3MuICBTb21lCisgICAgICAgb2YgdGhlc2Ugcm93cyB3aWxsIG5vdCBiZSBjaGFuZ2VkIGZyb20gdGhlCisgICAgICAgcHJldmlvdXMgcGFzcy4gIFdoZW4gdGhlIHJvdyBpcyBub3QgY2hhbmdlZCwKKyAgICAgICB0aGUgbmV3X3JvdyB2YXJpYWJsZSB3aWxsIGJlIE5VTEwuICBUaGUgcm93cworICAgICAgIGFuZCBwYXNzZXMgYXJlIGNhbGxlZCBpbiBvcmRlciwgc28geW91IGRvbid0CisgICAgICAgcmVhbGx5IG5lZWQgdGhlIHJvd19udW0gYW5kIHBhc3MsIGJ1dCBJJ20KKyAgICAgICBzdXBwbHlpbmcgdGhlbSBiZWNhdXNlIGl0IG1heSBtYWtlIHlvdXIgbGlmZQorICAgICAgIGVhc2llci4KKworICAgICAgIElmIHlvdSBkaWQgbm90IHR1cm4gb24gaW50ZXJsYWNlIGhhbmRsaW5nIHRoZW4KKyAgICAgICB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkIGZvciBlYWNoIHJvdyBvZiBlYWNoCisgICAgICAgc3ViLWltYWdlIHdoZW4gdGhlIGltYWdlIGlzIGludGVybGFjZWQuICBJbiB0aGlzCisgICAgICAgY2FzZSAncm93X251bScgaXMgdGhlIHJvdyBpbiB0aGUgc3ViLWltYWdlLCBub3QKKyAgICAgICB0aGUgcm93IGluIHRoZSBvdXRwdXQgaW1hZ2UgYXMgaXQgaXMgaW4gYWxsIG90aGVyCisgICAgICAgY2FzZXMuCisKKyAgICAgICBGb3IgdGhlIG5vbi1OVUxMIHJvd3Mgb2YgaW50ZXJsYWNlZCBpbWFnZXMgd2hlbgorICAgICAgIHlvdSBoYXZlIHN3aXRjaGVkIG9uIGxpYnBuZyBpbnRlcmxhY2UgaGFuZGxpbmcsCisgICAgICAgeW91IG11c3QgY2FsbCBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3coKQorICAgICAgIHBhc3NpbmcgaW4gdGhlIHJvdyBhbmQgdGhlIG9sZCByb3cuICBZb3UgY2FuCisgICAgICAgY2FsbCB0aGlzIGZ1bmN0aW9uIGZvciBOVUxMIHJvd3MgKGl0IHdpbGwganVzdAorICAgICAgIHJldHVybikgYW5kIGZvciBub24taW50ZXJsYWNlZCBpbWFnZXMgKGl0IGp1c3QKKyAgICAgICBkb2VzIHRoZSBtZW1jcHkgZm9yIHlvdSkgaWYgaXQgd2lsbCBtYWtlIHRoZQorICAgICAgIGNvZGUgZWFzaWVyLiAgVGh1cywgeW91IGNhbiBqdXN0IGRvIHRoaXMgZm9yCisgICAgICAgYWxsIGNhc2VzIGlmIHlvdSBzd2l0Y2ggb24gaW50ZXJsYWNlIGhhbmRsaW5nOworICAgICAqLworCisgICAgICAgIHBuZ19wcm9ncmVzc2l2ZV9jb21iaW5lX3JvdyhwbmdfcHRyLCBvbGRfcm93LAorICAgICAgICAgIG5ld19yb3cpOworCisgICAgLyogd2hlcmUgb2xkX3JvdyBpcyB3aGF0IHdhcyBkaXNwbGF5ZWQKKyAgICAgICBwcmV2aW91c2x5IGZvciB0aGUgcm93LiAgTm90ZSB0aGF0IHRoZSBmaXJzdAorICAgICAgIHBhc3MgKHBhc3MgPT0gMCwgcmVhbGx5KSB3aWxsIGNvbXBsZXRlbHkgY292ZXIKKyAgICAgICB0aGUgb2xkIHJvdywgc28gdGhlIHJvd3MgZG8gbm90IGhhdmUgdG8gYmUKKyAgICAgICBpbml0aWFsaXplZC4gIEFmdGVyIHRoZSBmaXJzdCBwYXNzIChhbmQgb25seQorICAgICAgIGZvciBpbnRlcmxhY2VkIGltYWdlcyksIHlvdSB3aWxsIGhhdmUgdG8gcGFzcworICAgICAgIHRoZSBjdXJyZW50IHJvdywgYW5kIHRoZSBmdW5jdGlvbiB3aWxsIGNvbWJpbmUKKyAgICAgICB0aGUgb2xkIHJvdyBhbmQgdGhlIG5ldyByb3cuCisKKyAgICAgICBZb3UgY2FuIGFsc28gY2FsbCBwbmdfcHJvY2Vzc19kYXRhX3BhdXNlIGluIHRoaXMKKyAgICAgICBjYWxsYmFjayAtIHNlZSBhYm92ZS4KKyAgICAqLworIH0KKworIHZvaWQKKyBlbmRfY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm8pCisgeworICAgIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoZSB3aG9sZSBpbWFnZQorICAgICAgIGhhcyBiZWVuIHJlYWQsIGluY2x1ZGluZyBhbnkgY2h1bmtzIGFmdGVyIHRoZQorICAgICAgIGltYWdlICh1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBJRU5EKS4gIFlvdQorICAgICAgIHdpbGwgdXN1YWxseSBoYXZlIHRoZSBzYW1lIGluZm8gY2h1bmsgYXMgeW91CisgICAgICAgaGFkIGluIHRoZSBoZWFkZXIsIGFsdGhvdWdoIHNvbWUgZGF0YSBtYXkgaGF2ZQorICAgICAgIGJlZW4gYWRkZWQgdG8gdGhlIGNvbW1lbnRzIGFuZCB0aW1lIGZpZWxkcy4KKworICAgICAgIE1vc3QgcGVvcGxlIHdvbid0IGRvIG11Y2ggaGVyZSwgcGVyaGFwcyBzZXR0aW5nCisgICAgICAgYSBmbGFnIHRoYXQgbWFya3MgdGhlIGltYWdlIGFzIGZpbmlzaGVkLgorICAgICAqLworIH0KKworCisKKy5TSCBJVi4gV3JpdGluZworCitNdWNoIG9mIHRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIHJlYWRpbmcuICBIb3dldmVyLCBldmVyeXRoaW5nIG9mCitpbXBvcnRhbmNlIGlzIHJlcGVhdGVkIGhlcmUsIHNvIHlvdSB3b24ndCBoYXZlIHRvIGNvbnN0YW50bHkgbG9vaworYmFjayB1cCBpbiB0aGUgcmVhZGluZyBzZWN0aW9uIHRvIHVuZGVyc3RhbmQgd3JpdGluZy4KKworLlNTIFNldHVwCisKK1lvdSB3aWxsIHdhbnQgdG8gZG8gdGhlIEkvTyBpbml0aWFsaXphdGlvbiBiZWZvcmUgeW91IGdldCBpbnRvIGxpYnBuZywKK3NvIGlmIGl0IGRvZXNuJ3Qgd29yaywgeW91IGRvbid0IGhhdmUgYW55dGhpbmcgdG8gdW5kby4gSWYgeW91IGFyZSBub3QKK3VzaW5nIHRoZSBzdGFuZGFyZCBJL08gZnVuY3Rpb25zLCB5b3Ugd2lsbCBuZWVkIHRvIHJlcGxhY2UgdGhlbSB3aXRoCitjdXN0b20gd3JpdGluZyBmdW5jdGlvbnMuICBTZWUgdGhlIGRpc2N1c3Npb24gdW5kZXIgQ3VzdG9taXppbmcgbGlicG5nLgorCisgICAgRklMRSAqZnAgPSBmb3BlbihmaWxlX25hbWUsICJ3YiIpOworCisgICAgaWYgKCFmcCkKKyAgICAgICByZXR1cm4gKEVSUk9SKTsKKworTmV4dCwgcG5nX3N0cnVjdCBhbmQgcG5nX2luZm8gbmVlZCB0byBiZSBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkLgorQXMgdGhlc2UgY2FuIGJlIGJvdGggcmVsYXRpdmVseSBsYXJnZSwgeW91IG1heSBub3Qgd2FudCB0byBzdG9yZSB0aGVzZQorb24gdGhlIHN0YWNrLCB1bmxlc3MgeW91IGhhdmUgc3RhY2sgc3BhY2UgdG8gc3BhcmUuICBPZiBjb3Vyc2UsIHlvdQord2lsbCB3YW50IHRvIGNoZWNrIGlmIHRoZXkgcmV0dXJuIE5VTEwuICBJZiB5b3UgYXJlIGFsc28gcmVhZGluZywKK3lvdSB3b24ndCB3YW50IHRvIG5hbWUgeW91ciByZWFkIHN0cnVjdHVyZSBhbmQgeW91ciB3cml0ZSBzdHJ1Y3R1cmUKK2JvdGggInBuZ19wdHIiOyB5b3UgY2FuIGNhbGwgdGhlbSBhbnl0aGluZyB5b3UgbGlrZSwgc3VjaCBhcworInJlYWRfcHRyIiBhbmQgIndyaXRlX3B0ciIuICBMb29rIGF0IHBuZ3Rlc3QuYywgZm9yIGV4YW1wbGUuCisKKyAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QKKyAgICAgICAoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCAocG5nX3ZvaWRwKXVzZXJfZXJyb3JfcHRyLAorICAgICAgICB1c2VyX2Vycm9yX2ZuLCB1c2VyX3dhcm5pbmdfZm4pOworCisgICAgaWYgKCFwbmdfcHRyKQorICAgICAgIHJldHVybiAoRVJST1IpOworCisgICAgcG5nX2luZm9wIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKKyAgICBpZiAoIWluZm9fcHRyKQorICAgIHsKKyAgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsCisgICAgICAgICAgIChwbmdfaW5mb3BwKU5VTEwpOworICAgICAgIHJldHVybiAoRVJST1IpOworICAgIH0KKworSWYgeW91IHdhbnQgdG8gdXNlIHlvdXIgb3duIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzLAorZGVmaW5lIFBOR19VU0VSX01FTV9TVVBQT1JURUQgYW5kIHVzZQorcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMigpIGluc3RlYWQgb2YgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QoKToKKworICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdF8yCisgICAgICAgKFBOR19MSUJQTkdfVkVSX1NUUklORywgKHBuZ192b2lkcCl1c2VyX2Vycm9yX3B0ciwKKyAgICAgICAgdXNlcl9lcnJvcl9mbiwgdXNlcl93YXJuaW5nX2ZuLCAocG5nX3ZvaWRwKQorICAgICAgICB1c2VyX21lbV9wdHIsIHVzZXJfbWFsbG9jX2ZuLCB1c2VyX2ZyZWVfZm4pOworCitBZnRlciB5b3UgaGF2ZSB0aGVzZSBzdHJ1Y3R1cmVzLCB5b3Ugd2lsbCBuZWVkIHRvIHNldCB1cCB0aGUKK2Vycm9yIGhhbmRsaW5nLiAgV2hlbiBsaWJwbmcgZW5jb3VudGVycyBhbiBlcnJvciwgaXQgZXhwZWN0cyB0bworbG9uZ2ptcCgpIGJhY2sgdG8geW91ciByb3V0aW5lLiAgVGhlcmVmb3JlLCB5b3Ugd2lsbCBuZWVkIHRvIGNhbGwKK3NldGptcCgpIGFuZCBwYXNzIHRoZSBwbmdfam1wYnVmKHBuZ19wdHIpLiAgSWYgeW91Cit3cml0ZSB0aGUgZmlsZSBmcm9tIGRpZmZlcmVudCByb3V0aW5lcywgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUKK3RoZSBwbmdfam1wYnVmKHBuZ19wdHIpIGV2ZXJ5IHRpbWUgeW91IGVudGVyIGEgbmV3IHJvdXRpbmUgdGhhdCB3aWxsCitjYWxsIGEgcG5nXyooKSBmdW5jdGlvbi4gIFNlZSB5b3VyIGRvY3VtZW50YXRpb24gb2Ygc2V0am1wL2xvbmdqbXAKK2ZvciB5b3VyIGNvbXBpbGVyIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHNldGptcC9sb25nam1wLiAgU2VlCit0aGUgZGlzY3Vzc2lvbiBvbiBsaWJwbmcgZXJyb3IgaGFuZGxpbmcgaW4gdGhlIEN1c3RvbWl6aW5nIExpYnBuZworc2VjdGlvbiBiZWxvdyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgbGlicG5nIGVycm9yIGhhbmRsaW5nLgorCisgICAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZ19wdHIpKSkKKyAgICB7CisgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIpOworICAgICAgIGZjbG9zZShmcCk7CisgICAgICAgcmV0dXJuIChFUlJPUik7CisgICAgfQorICAgIC4uLgorICAgIHJldHVybjsKKworSWYgeW91IHdvdWxkIHJhdGhlciBhdm9pZCB0aGUgY29tcGxleGl0eSBvZiBzZXRqbXAvbG9uZ2ptcCBpc3N1ZXMsCit5b3UgY2FuIGNvbXBpbGUgbGlicG5nIHdpdGggUE5HX05PX1NFVEpNUCwgaW4gd2hpY2ggY2FzZQorZXJyb3JzIHdpbGwgcmVzdWx0IGluIGEgY2FsbCB0byBQTkdfQUJPUlQoKSB3aGljaCBkZWZhdWx0cyB0byBhYm9ydCgpLgorCitZb3UgY2FuICNkZWZpbmUgUE5HX0FCT1JUKCkgdG8gYSBmdW5jdGlvbiB0aGF0IGRvZXMgc29tZXRoaW5nCittb3JlIHVzZWZ1bCB0aGFuIGFib3J0KCksIGFzIGxvbmcgYXMgeW91ciBmdW5jdGlvbiBkb2VzIG5vdAorcmV0dXJuLgorCitDaGVja2luZyBmb3IgaW52YWxpZCBwYWxldHRlIGluZGV4IG9uIHdyaXRlIHdhcyBhZGRlZCBhdCBsaWJwbmcKKzEuNS4xMC4gIElmIGEgcGl4ZWwgY29udGFpbnMgYW4gaW52YWxpZCAob3V0LW9mLXJhbmdlKSBpbmRleCBsaWJwbmcgaXNzdWVzCithIGJlbmlnbiBlcnJvci4gIFRoaXMgaXMgZW5hYmxlZCBieSBkZWZhdWx0IGJlY2F1c2UgdGhpcyBjb25kaXRpb24gaXMgYW4KK2Vycm9yIGFjY29yZGluZyB0byB0aGUgUE5HIHNwZWNpZmljYXRpb24sIENsYXVzZSAxMS4zLjIsIGJ1dCB0aGUgZXJyb3IgY2FuCitiZSBpZ25vcmVkIGluIGVhY2ggcG5nX3B0ciB3aXRoCisKKyAgIHBuZ19zZXRfY2hlY2tfZm9yX2ludmFsaWRfaW5kZXgocG5nX3B0ciwgMCk7CisKK0lmIHRoZSBlcnJvciBpcyBpZ25vcmVkLCBvciBpZiBwbmdfYmVuaWduX2Vycm9yKCkgdHJlYXRzIGl0IGFzIGEgd2FybmluZywKK2FueSBpbnZhbGlkIHBpeGVscyBhcmUgd3JpdHRlbiBhcy1pcyBieSB0aGUgZW5jb2RlciwgcmVzdWx0aW5nIGluIGFuCitpbnZhbGlkIFBORyBkYXRhc3RyZWFtIGFzIG91dHB1dC4gIEluIHRoaXMgY2FzZSB0aGUgYXBwbGljYXRpb24gaXMKK3Jlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHRoZSBwaXhlbCBpbmRleGVzIGFyZSBpbiByYW5nZSB3aGVuIGl0IHdyaXRlcworYSBQTFRFIGNodW5rIHdpdGggZmV3ZXIgZW50cmllcyB0aGFuIHRoZSBiaXQgZGVwdGggd291bGQgYWxsb3cuCisKK05vdyB5b3UgbmVlZCB0byBzZXQgdXAgdGhlIG91dHB1dCBjb2RlLiAgVGhlIGRlZmF1bHQgZm9yIGxpYnBuZyBpcyB0bwordXNlIHRoZSBDIGZ1bmN0aW9uIGZ3cml0ZSgpLiAgSWYgeW91IHVzZSB0aGlzLCB5b3Ugd2lsbCBuZWVkIHRvIHBhc3MgYQordmFsaWQgRklMRSAqIGluIHRoZSBmdW5jdGlvbiBwbmdfaW5pdF9pbygpLiAgQmUgc3VyZSB0aGF0IHRoZSBmaWxlIGlzCitvcGVuZWQgaW4gYmluYXJ5IG1vZGUuICBBZ2FpbiwgaWYgeW91IHdpc2ggdG8gaGFuZGxlIHdyaXRpbmcgZGF0YSBpbgorYW5vdGhlciB3YXksIHNlZSB0aGUgZGlzY3Vzc2lvbiBvbiBsaWJwbmcgSS9PIGhhbmRsaW5nIGluIHRoZSBDdXN0b21pemluZworTGlicG5nIHNlY3Rpb24gYmVsb3cuCisKKyAgICBwbmdfaW5pdF9pbyhwbmdfcHRyLCBmcCk7CisKK0lmIHlvdSBhcmUgZW1iZWRkaW5nIHlvdXIgUE5HIGludG8gYSBkYXRhc3RyZWFtIHN1Y2ggYXMgTU5HLCBhbmQgZG9uJ3QKK3dhbnQgbGlicG5nIHRvIHdyaXRlIHRoZSA4LWJ5dGUgc2lnbmF0dXJlLCBvciBpZiB5b3UgaGF2ZSBhbHJlYWR5Cit3cml0dGVuIHRoZSBzaWduYXR1cmUgaW4geW91ciBhcHBsaWNhdGlvbiwgdXNlCisKKyAgICBwbmdfc2V0X3NpZ19ieXRlcyhwbmdfcHRyLCA4KTsKKwordG8gaW5mb3JtIGxpYnBuZyB0aGF0IGl0IHNob3VsZCBub3Qgd3JpdGUgYSBzaWduYXR1cmUuCisKKy5TUyBXcml0ZSBjYWxsYmFja3MKKworQXQgdGhpcyBwb2ludCwgeW91IGNhbiBzZXQgdXAgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdpbGwgYmUKK2NhbGxlZCBhZnRlciBlYWNoIHJvdyBoYXMgYmVlbiB3cml0dGVuLCB3aGljaCB5b3UgY2FuIHVzZSB0byBjb250cm9sCithIHByb2dyZXNzIG1ldGVyIG9yIHRoZSBsaWtlLiAgSXQncyBkZW1vbnN0cmF0ZWQgaW4gcG5ndGVzdC5jLgorWW91IG11c3Qgc3VwcGx5IGEgZnVuY3Rpb24KKworICAgIHZvaWQgd3JpdGVfcm93X2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzMyIHJvdywKKyAgICAgICBpbnQgcGFzcyk7CisgICAgeworICAgICAgLyogcHV0IHlvdXIgY29kZSBoZXJlICovCisgICAgfQorCisoWW91IGNhbiBnaXZlIGl0IGFub3RoZXIgbmFtZSB0aGF0IHlvdSBsaWtlIGluc3RlYWQgb2YgIndyaXRlX3Jvd19jYWxsYmFjayIpCisKK1RvIGluZm9ybSBsaWJwbmcgYWJvdXQgeW91ciBmdW5jdGlvbiwgdXNlCisKKyAgICBwbmdfc2V0X3dyaXRlX3N0YXR1c19mbihwbmdfcHRyLCB3cml0ZV9yb3dfY2FsbGJhY2spOworCitXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRoZSByb3cgaGFzIGFscmVhZHkgYmVlbiBjb21wbGV0ZWx5IHByb2Nlc3NlZCBhbmQKK2l0IGhhcyBhbHNvIGJlZW4gd3JpdHRlbiBvdXQuICBUaGUgJ3JvdycgYW5kICdwYXNzJyByZWZlciB0byB0aGUgbmV4dCByb3cgdG8gYmUKK2hhbmRsZWQuICBGb3IgdGhlCitub24taW50ZXJsYWNlZCBjYXNlIHRoZSByb3cgdGhhdCB3YXMganVzdCBoYW5kbGVkIGlzIHNpbXBseSBvbmUgbGVzcyB0aGFuIHRoZQorcGFzc2VkIGluIHJvdyBudW1iZXIsIGFuZCBwYXNzIHdpbGwgYWx3YXlzIGJlIDAuICBGb3IgdGhlIGludGVybGFjZWQgY2FzZSB0aGUKK3NhbWUgYXBwbGllcyB1bmxlc3MgdGhlIHJvdyB2YWx1ZSBpcyAwLCBpbiB3aGljaCBjYXNlIHRoZSByb3cganVzdCBoYW5kbGVkIHdhcwordGhlIGxhc3Qgb25lIGZyb20gb25lIG9mIHRoZSBwcmVjZWRpbmcgcGFzc2VzLiAgQmVjYXVzZSBpbnRlcmxhY2luZyBtYXkgc2tpcCBhCitwYXNzIHlvdSBjYW5ub3QgYmUgc3VyZSB0aGF0IHRoZSBwcmVjZWRpbmcgcGFzcyBpcyBqdXN0ICdwYXNzXC0xJywgaWYgeW91IHJlYWxseQorbmVlZCB0byBrbm93IHdoYXQgdGhlIGxhc3QgcGFzcyBpcyByZWNvcmQgKHJvdyxwYXNzKSBmcm9tIHRoZSBjYWxsYmFjayBhbmQgdXNlCit0aGUgbGFzdCByZWNvcmRlZCB2YWx1ZSBlYWNoIHRpbWUuCisKK0FzIHdpdGggdGhlIHVzZXIgdHJhbnNmb3JtIHlvdSBjYW4gZmluZCB0aGUgb3V0cHV0IHJvdyB1c2luZyB0aGUKK1BOR19ST1dfRlJPTV9QQVNTX1JPVyBtYWNyby4KKworWW91IG5vdyBoYXZlIHRoZSBvcHRpb24gb2YgbW9kaWZ5aW5nIGhvdyB0aGUgY29tcHJlc3Npb24gbGlicmFyeSB3aWxsCitydW4uICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgbWFpbmx5IGZvciB0ZXN0aW5nLCBidXQgbWF5IGJlIHVzZWZ1bAoraW4gc29tZSBjYXNlcywgbGlrZSBpZiB5b3UgbmVlZCB0byB3cml0ZSBQTkcgZmlsZXMgZXh0cmVtZWx5IGZhc3QgYW5kCithcmUgd2lsbGluZyB0byBnaXZlIHVwIHNvbWUgY29tcHJlc3Npb24sIG9yIGlmIHlvdSB3YW50IHRvIGdldCB0aGUKK21heGltdW0gcG9zc2libGUgY29tcHJlc3Npb24gYXQgdGhlIGV4cGVuc2Ugb2Ygc2xvd2VyIHdyaXRpbmcuICBJZiB5b3UKK2hhdmUgbm8gc3BlY2lhbCBuZWVkcyBpbiB0aGlzIGFyZWEsIGxldCB0aGUgbGlicmFyeSBkbyB3aGF0IGl0IHdhbnRzIGJ5Citub3QgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGF0IGFsbCwgYXMgaXQgaGFzIGJlZW4gdHVuZWQgdG8gZGVsaXZlciBhIGdvb2QKK3NwZWVkL2NvbXByZXNzaW9uIHJhdGlvLiBUaGUgc2Vjb25kIHBhcmFtZXRlciB0byBwbmdfc2V0X2ZpbHRlcigpIGlzCit0aGUgZmlsdGVyIG1ldGhvZCwgZm9yIHdoaWNoIHRoZSBvbmx5IHZhbGlkIHZhbHVlcyBhcmUgMCAoYXMgb2YgdGhlCitKdWx5IDE5OTkgUE5HIHNwZWNpZmljYXRpb24sIHZlcnNpb24gMS4yKSBvciA2NCAoaWYgeW91IGFyZSB3cml0aW5nCithIFBORyBkYXRhc3RyZWFtIHRoYXQgaXMgdG8gYmUgZW1iZWRkZWQgaW4gYSBNTkcgZGF0YXN0cmVhbSkuICBUaGUgdGhpcmQKK3BhcmFtZXRlciBpcyBhIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hpY2ggZmlsdGVyIHR5cGUocykgYXJlIHRvIGJlIHRlc3RlZAorZm9yIGVhY2ggc2NhbmxpbmUuICBTZWUgdGhlIFBORyBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBzcGVjaWZpYworZmlsdGVyIHR5cGVzLgorCisKKyAgICAvKiB0dXJuIG9uIG9yIG9mZiBmaWx0ZXJpbmcsIGFuZC9vciBjaG9vc2UKKyAgICAgICBzcGVjaWZpYyBmaWx0ZXJzLiAgWW91IGNhbiB1c2UgZWl0aGVyIGEgc2luZ2xlCisgICAgICAgUE5HX0ZJTFRFUl9WQUxVRV9OQU1FIG9yIHRoZSBiaXR3aXNlIE9SIG9mIG9uZQorICAgICAgIG9yIG1vcmUgUE5HX0ZJTFRFUl9OQU1FIG1hc2tzLgorICAgICAqLworICAgIHBuZ19zZXRfZmlsdGVyKHBuZ19wdHIsIDAsCisgICAgICAgUE5HX0ZJTFRFUl9OT05FICB8IFBOR19GSUxURVJfVkFMVUVfTk9ORSB8CisgICAgICAgUE5HX0ZJTFRFUl9TVUIgICB8IFBOR19GSUxURVJfVkFMVUVfU1VCICB8CisgICAgICAgUE5HX0ZJTFRFUl9VUCAgICB8IFBOR19GSUxURVJfVkFMVUVfVVAgICB8CisgICAgICAgUE5HX0ZJTFRFUl9BVkcgICB8IFBOR19GSUxURVJfVkFMVUVfQVZHICB8CisgICAgICAgUE5HX0ZJTFRFUl9QQUVUSCB8IFBOR19GSUxURVJfVkFMVUVfUEFFVEh8CisgICAgICAgUE5HX0FMTF9GSUxURVJTKTsKKworSWYgYW4gYXBwbGljYXRpb24gd2FudHMgdG8gc3RhcnQgYW5kIHN0b3AgdXNpbmcgcGFydGljdWxhciBmaWx0ZXJzIGR1cmluZworY29tcHJlc3Npb24sIGl0IHNob3VsZCBzdGFydCBvdXQgd2l0aCBhbGwgb2YgdGhlIGZpbHRlcnMgKHRvIGVuc3VyZSB0aGF0Cit0aGUgcHJldmlvdXMgcm93IG9mIHBpeGVscyB3aWxsIGJlIHN0b3JlZCBpbiBjYXNlIGl0J3MgbmVlZGVkIGxhdGVyKSwKK2FuZCB0aGVuIGFkZCBhbmQgcmVtb3ZlIHRoZW0gYWZ0ZXIgdGhlIHN0YXJ0IG9mIGNvbXByZXNzaW9uLgorCitJZiB5b3UgYXJlIHdyaXRpbmcgYSBQTkcgZGF0YXN0cmVhbSB0aGF0IGlzIHRvIGJlIGVtYmVkZGVkIGluIGEgTU5HCitkYXRhc3RyZWFtLCB0aGUgc2Vjb25kIHBhcmFtZXRlciBjYW4gYmUgZWl0aGVyIDAgb3IgNjQuCisKK1RoZSBwbmdfc2V0X2NvbXByZXNzaW9uXyooKSBmdW5jdGlvbnMgaW50ZXJmYWNlIHRvIHRoZSB6bGliIGNvbXByZXNzaW9uCitsaWJyYXJ5LCBhbmQgc2hvdWxkIG1vc3RseSBiZSBpZ25vcmVkIHVubGVzcyB5b3UgcmVhbGx5IGtub3cgd2hhdCB5b3UgYXJlCitkb2luZy4gIFRoZSBvbmx5IGdlbmVyYWxseSB1c2VmdWwgY2FsbCBpcyBwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsKCkKK3doaWNoIGNoYW5nZXMgaG93IG11Y2ggdGltZSB6bGliIHNwZW5kcyBvbiB0cnlpbmcgdG8gY29tcHJlc3MgdGhlIGltYWdlCitkYXRhLiAgU2VlIHRoZSBDb21wcmVzc2lvbiBMaWJyYXJ5ICh6bGliLmggYW5kIGFsZ29yaXRobS50eHQsIGRpc3RyaWJ1dGVkCit3aXRoIHpsaWIpIGZvciBkZXRhaWxzIG9uIHRoZSBjb21wcmVzc2lvbiBsZXZlbHMuCisKKyAgICAjaW5jbHVkZSB6bGliLmgKKworICAgIC8qIFNldCB0aGUgemxpYiBjb21wcmVzc2lvbiBsZXZlbCAqLworICAgIHBuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwocG5nX3B0ciwKKyAgICAgICAgWl9CRVNUX0NPTVBSRVNTSU9OKTsKKworICAgIC8qIFNldCBvdGhlciB6bGliIHBhcmFtZXRlcnMgZm9yIGNvbXByZXNzaW5nIElEQVQgKi8KKyAgICBwbmdfc2V0X2NvbXByZXNzaW9uX21lbV9sZXZlbChwbmdfcHRyLCA4KTsKKyAgICBwbmdfc2V0X2NvbXByZXNzaW9uX3N0cmF0ZWd5KHBuZ19wdHIsCisgICAgICAgIFpfREVGQVVMVF9TVFJBVEVHWSk7CisgICAgcG5nX3NldF9jb21wcmVzc2lvbl93aW5kb3dfYml0cyhwbmdfcHRyLCAxNSk7CisgICAgcG5nX3NldF9jb21wcmVzc2lvbl9tZXRob2QocG5nX3B0ciwgOCk7CisgICAgcG5nX3NldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZShwbmdfcHRyLCA4MTkyKQorCisgICAgLyogU2V0IHpsaWIgcGFyYW1ldGVycyBmb3IgdGV4dCBjb21wcmVzc2lvbgorICAgICAqIElmIHlvdSBkb24ndCBjYWxsIHRoZXNlLCB0aGUgcGFyYW1ldGVycworICAgICAqIGZhbGwgYmFjayBvbiB0aG9zZSBkZWZpbmVkIGZvciBJREFUIGNodW5rcworICAgICAqLworICAgIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwocG5nX3B0ciwgOCk7CisgICAgcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX3N0cmF0ZWd5KHBuZ19wdHIsCisgICAgICAgIFpfREVGQVVMVF9TVFJBVEVHWSk7CisgICAgcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX3dpbmRvd19iaXRzKHBuZ19wdHIsIDE1KTsKKyAgICBwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fbWV0aG9kKHBuZ19wdHIsIDgpOworCisuU1MgU2V0dGluZyB0aGUgY29udGVudHMgb2YgaW5mbyBmb3Igb3V0cHV0CisKK1lvdSBub3cgbmVlZCB0byBmaWxsIGluIHRoZSBwbmdfaW5mbyBzdHJ1Y3R1cmUgd2l0aCBhbGwgdGhlIGRhdGEgeW91Cit3aXNoIHRvIHdyaXRlIGJlZm9yZSB0aGUgYWN0dWFsIGltYWdlLiAgTm90ZSB0aGF0IHRoZSBvbmx5IHRoaW5nIHlvdQorYXJlIGFsbG93ZWQgdG8gd3JpdGUgYWZ0ZXIgdGhlIGltYWdlIGlzIHRoZSB0ZXh0IGNodW5rcyBhbmQgdGhlIHRpbWUKK2NodW5rIChhcyBvZiBQTkcgU3BlY2lmaWNhdGlvbiAxLjIsIGFueXdheSkuICBTZWUgcG5nX3dyaXRlX2VuZCgpIGFuZAordGhlIGxhdGVzdCBQTkcgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGF0LiAgSWYgeW91Cit3aXNoIHRvIHdyaXRlIHRoZW0gYmVmb3JlIHRoZSBpbWFnZSwgZmlsbCB0aGVtIGluIG5vdywgYW5kIGZsYWcgdGhhdAorZGF0YSBhcyBiZWluZyB2YWxpZC4gIElmIHlvdSB3YW50IHRvIHdhaXQgdW50aWwgYWZ0ZXIgdGhlIGRhdGEsIGRvbid0CitmaWxsIHRoZW0gdW50aWwgcG5nX3dyaXRlX2VuZCgpLiAgRm9yIGFsbCB0aGUgZmllbGRzIGluIHBuZ19pbmZvIGFuZAordGhlaXIgZGF0YSB0eXBlcywgc2VlIHBuZy5oLiAgRm9yIGV4cGxhbmF0aW9ucyBvZiB3aGF0IHRoZSBmaWVsZHMKK2NvbnRhaW4sIHNlZSB0aGUgUE5HIHNwZWNpZmljYXRpb24uCisKK1NvbWUgb2YgdGhlIG1vcmUgaW1wb3J0YW50IHBhcnRzIG9mIHRoZSBwbmdfaW5mbyBhcmU6CisKKyAgICBwbmdfc2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgYml0X2RlcHRoLCBjb2xvcl90eXBlLCBpbnRlcmxhY2VfdHlwZSwKKyAgICAgICBjb21wcmVzc2lvbl90eXBlLCBmaWx0ZXJfbWV0aG9kKQorCisgICAgd2lkdGggICAgICAgICAgLSBob2xkcyB0aGUgd2lkdGggb2YgdGhlIGltYWdlCisgICAgICAgICAgICAgICAgICAgICBpbiBwaXhlbHMgKHVwIHRvIDJeMzEpLgorCisgICAgaGVpZ2h0ICAgICAgICAgLSBob2xkcyB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZQorICAgICAgICAgICAgICAgICAgICAgaW4gcGl4ZWxzICh1cCB0byAyXjMxKS4KKworICAgIGJpdF9kZXB0aCAgICAgIC0gaG9sZHMgdGhlIGJpdCBkZXB0aCBvZiBvbmUgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICBpbWFnZSBjaGFubmVscy4KKyAgICAgICAgICAgICAgICAgICAgICh2YWxpZCB2YWx1ZXMgYXJlIDEsIDIsIDQsIDgsIDE2CisgICAgICAgICAgICAgICAgICAgICBhbmQgZGVwZW5kIGFsc28gb24gdGhlCisgICAgICAgICAgICAgICAgICAgICBjb2xvcl90eXBlLiAgU2VlIGFsc28gc2lnbmlmaWNhbnQKKyAgICAgICAgICAgICAgICAgICAgIGJpdHMgKHNCSVQpIGJlbG93KS4KKworICAgIGNvbG9yX3R5cGUgICAgIC0gZGVzY3JpYmVzIHdoaWNoIGNvbG9yL2FscGhhCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVscyBhcmUgcHJlc2VudC4KKyAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX0dSQVkKKyAgICAgICAgICAgICAgICAgICAgICAgIChiaXQgZGVwdGhzIDEsIDIsIDQsIDgsIDE2KQorICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgKGJpdCBkZXB0aHMgOCwgMTYpCisgICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFCisgICAgICAgICAgICAgICAgICAgICAgICAoYml0IGRlcHRocyAxLCAyLCA0LCA4KQorICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfUkdCCisgICAgICAgICAgICAgICAgICAgICAgICAoYml0X2RlcHRocyA4LCAxNikKKyAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgKGJpdF9kZXB0aHMgOCwgMTYpCisKKyAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9NQVNLX1BBTEVUVEUKKyAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9NQVNLX0NPTE9SCisgICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfTUFTS19BTFBIQQorCisgICAgaW50ZXJsYWNlX3R5cGUgLSBQTkdfSU5URVJMQUNFX05PTkUgb3IKKyAgICAgICAgICAgICAgICAgICAgIFBOR19JTlRFUkxBQ0VfQURBTTcKKworICAgIGNvbXByZXNzaW9uX3R5cGUgLSAobXVzdCBiZQorICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTVBSRVNTSU9OX1RZUEVfREVGQVVMVCkKKworICAgIGZpbHRlcl9tZXRob2QgIC0gKG11c3QgYmUgUE5HX0ZJTFRFUl9UWVBFX0RFRkFVTFQKKyAgICAgICAgICAgICAgICAgICAgIG9yLCBpZiB5b3UgYXJlIHdyaXRpbmcgYSBQTkcgdG8KKyAgICAgICAgICAgICAgICAgICAgIGJlIGVtYmVkZGVkIGluIGEgTU5HIGRhdGFzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICBjYW4gYWxzbyBiZQorICAgICAgICAgICAgICAgICAgICAgUE5HX0lOVFJBUElYRUxfRElGRkVSRU5DSU5HKQorCitJZiB5b3UgY2FsbCBwbmdfc2V0X0lIRFIoKSwgdGhlIGNhbGwgbXVzdCBhcHBlYXIgYmVmb3JlIGFueSBvZiB0aGUKK290aGVyIHBuZ19zZXRfKigpIGZ1bmN0aW9ucywgYmVjYXVzZSB0aGV5IG1pZ2h0IHJlcXVpcmUgYWNjZXNzIHRvIHNvbWUgb2YKK3RoZSBJSERSIHNldHRpbmdzLiAgVGhlIHJlbWFpbmluZyBwbmdfc2V0XyooKSBmdW5jdGlvbnMgY2FuIGJlIGNhbGxlZAoraW4gYW55IG9yZGVyLgorCitJZiB5b3Ugd2lzaCwgeW91IGNhbiByZXNldCB0aGUgY29tcHJlc3Npb25fdHlwZSwgaW50ZXJsYWNlX3R5cGUsIG9yCitmaWx0ZXJfbWV0aG9kIGxhdGVyIGJ5IGNhbGxpbmcgcG5nX3NldF9JSERSKCkgYWdhaW47IGlmIHlvdSBkbyB0aGlzLCB0aGUKK3dpZHRoLCBoZWlnaHQsIGJpdF9kZXB0aCwgYW5kIGNvbG9yX3R5cGUgbXVzdCBiZSB0aGUgc2FtZSBpbiBlYWNoIGNhbGwuCisKKyAgICBwbmdfc2V0X1BMVEUocG5nX3B0ciwgaW5mb19wdHIsIHBhbGV0dGUsCisgICAgICAgbnVtX3BhbGV0dGUpOworCisgICAgcGFsZXR0ZSAgICAgICAgLSB0aGUgcGFsZXR0ZSBmb3IgdGhlIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgIChhcnJheSBvZiBwbmdfY29sb3IpCisgICAgbnVtX3BhbGV0dGUgICAgLSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgcGFsZXR0ZQorCisKKyAgICBwbmdfc2V0X2dBTUEocG5nX3B0ciwgaW5mb19wdHIsIGZpbGVfZ2FtbWEpOworICAgIHBuZ19zZXRfZ0FNQV9maXhlZChwbmdfcHRyLCBpbmZvX3B0ciwgaW50X2ZpbGVfZ2FtbWEpOworCisgICAgZmlsZV9nYW1tYSAgICAgLSB0aGUgZ2FtbWEgYXQgd2hpY2ggdGhlIGltYWdlIHdhcworICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCAoUE5HX0lORk9fZ0FNQSkKKworICAgIGludF9maWxlX2dhbW1hIC0gMTAwLDAwMCB0aW1lcyB0aGUgZ2FtbWEgYXQgd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgIHRoZSBpbWFnZSB3YXMgY3JlYXRlZAorCisgICAgcG5nX3NldF9jSFJNKHBuZ19wdHIsIGluZm9fcHRyLCAgd2hpdGVfeCwgd2hpdGVfeSwgcmVkX3gsIHJlZF95LAorICAgICAgICAgICAgICAgICAgICAgZ3JlZW5feCwgZ3JlZW5feSwgYmx1ZV94LCBibHVlX3kpCisgICAgcG5nX3NldF9jSFJNX1hZWihwbmdfcHRyLCBpbmZvX3B0ciwgcmVkX1gsIHJlZF9ZLCByZWRfWiwgZ3JlZW5fWCwKKyAgICAgICAgICAgICAgICAgICAgIGdyZWVuX1ksIGdyZWVuX1osIGJsdWVfWCwgYmx1ZV9ZLCBibHVlX1opCisgICAgcG5nX3NldF9jSFJNX2ZpeGVkKHBuZ19wdHIsIGluZm9fcHRyLCBpbnRfd2hpdGVfeCwgaW50X3doaXRlX3ksCisgICAgICAgICAgICAgICAgICAgICBpbnRfcmVkX3gsIGludF9yZWRfeSwgaW50X2dyZWVuX3gsIGludF9ncmVlbl95LAorICAgICAgICAgICAgICAgICAgICAgaW50X2JsdWVfeCwgaW50X2JsdWVfeSkKKyAgICBwbmdfc2V0X2NIUk1fWFlaX2ZpeGVkKHBuZ19wdHIsIGluZm9fcHRyLCBpbnRfcmVkX1gsIGludF9yZWRfWSwKKyAgICAgICAgICAgICAgICAgICAgIGludF9yZWRfWiwgaW50X2dyZWVuX1gsIGludF9ncmVlbl9ZLCBpbnRfZ3JlZW5fWiwKKyAgICAgICAgICAgICAgICAgICAgIGludF9ibHVlX1gsIGludF9ibHVlX1ksIGludF9ibHVlX1opCisKKyAgICB7d2hpdGUscmVkLGdyZWVuLGJsdWV9X3t4LHl9CisgICAgICAgICAgICAgICAgICAgICBBIGNvbG9yIHNwYWNlIGVuY29kaW5nIHNwZWNpZmllZCB1c2luZyB0aGUgY2hyb21hdGljaXRpZXMKKyAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBlbmQgcG9pbnRzIGFuZCB0aGUgd2hpdGUgcG9pbnQuCisKKyAgICB7cmVkLGdyZWVuLGJsdWV9X3tYLFksWn0KKyAgICAgICAgICAgICAgICAgICAgIEEgY29sb3Igc3BhY2UgZW5jb2Rpbmcgc3BlY2lmaWVkIHVzaW5nIHRoZSBlbmNvZGluZyBlbmQKKyAgICAgICAgICAgICAgICAgICAgIHBvaW50cyAtIHRoZSBDSUUgdHJpc3RpbXVsdXMgc3BlY2lmaWNhdGlvbiBvZiB0aGUgaW50ZW5kZWQKKyAgICAgICAgICAgICAgICAgICAgIGNvbG9yIG9mIHRoZSByZWQsIGdyZWVuIGFuZCBibHVlIGNoYW5uZWxzIGluIHRoZSBQTkcgUkdCCisgICAgICAgICAgICAgICAgICAgICBkYXRhLiAgVGhlIHdoaXRlIHBvaW50IGlzIHNpbXBseSB0aGUgc3VtIG9mIHRoZSB0aHJlZSBlbmQKKyAgICAgICAgICAgICAgICAgICAgIHBvaW50cy4KKworICAgIHBuZ19zZXRfc1JHQihwbmdfcHRyLCBpbmZvX3B0ciwgc3JnYl9pbnRlbnQpOworCisgICAgc3JnYl9pbnRlbnQgICAgLSB0aGUgcmVuZGVyaW5nIGludGVudAorICAgICAgICAgICAgICAgICAgICAgKFBOR19JTkZPX3NSR0IpIFRoZSBwcmVzZW5jZSBvZgorICAgICAgICAgICAgICAgICAgICAgdGhlIHNSR0IgY2h1bmsgbWVhbnMgdGhhdCB0aGUgcGl4ZWwKKyAgICAgICAgICAgICAgICAgICAgIGRhdGEgaXMgaW4gdGhlIHNSR0IgY29sb3Igc3BhY2UuCisgICAgICAgICAgICAgICAgICAgICBUaGlzIGNodW5rIGFsc28gaW1wbGllcyBzcGVjaWZpYworICAgICAgICAgICAgICAgICAgICAgdmFsdWVzIG9mIGdBTUEgYW5kIGNIUk0uICBSZW5kZXJpbmcKKyAgICAgICAgICAgICAgICAgICAgIGludGVudCBpcyB0aGUgQ1NTLTEgcHJvcGVydHkgdGhhdAorICAgICAgICAgICAgICAgICAgICAgaGFzIGJlZW4gZGVmaW5lZCBieSB0aGUgSW50ZXJuYXRpb25hbAorICAgICAgICAgICAgICAgICAgICAgQ29sb3IgQ29uc29ydGl1bQorICAgICAgICAgICAgICAgICAgICAgKGh0dHA6Ly93d3cuY29sb3Iub3JnKS4KKyAgICAgICAgICAgICAgICAgICAgIEl0IGNhbiBiZSBvbmUgb2YKKyAgICAgICAgICAgICAgICAgICAgIFBOR19zUkdCX0lOVEVOVF9TQVRVUkFUSU9OLAorICAgICAgICAgICAgICAgICAgICAgUE5HX3NSR0JfSU5URU5UX1BFUkNFUFRVQUwsCisgICAgICAgICAgICAgICAgICAgICBQTkdfc1JHQl9JTlRFTlRfQUJTT0xVVEUsIG9yCisgICAgICAgICAgICAgICAgICAgICBQTkdfc1JHQl9JTlRFTlRfUkVMQVRJVkUuCisKKworICAgIHBuZ19zZXRfc1JHQl9nQU1BX2FuZF9jSFJNKHBuZ19wdHIsIGluZm9fcHRyLAorICAgICAgIHNyZ2JfaW50ZW50KTsKKworICAgIHNyZ2JfaW50ZW50ICAgIC0gdGhlIHJlbmRlcmluZyBpbnRlbnQKKyAgICAgICAgICAgICAgICAgICAgIChQTkdfSU5GT19zUkdCKSBUaGUgcHJlc2VuY2Ugb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICBzUkdCIGNodW5rIG1lYW5zIHRoYXQgdGhlIHBpeGVsCisgICAgICAgICAgICAgICAgICAgICBkYXRhIGlzIGluIHRoZSBzUkdCIGNvbG9yIHNwYWNlLgorICAgICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBhbHNvIGNhdXNlcyBnQU1BIGFuZAorICAgICAgICAgICAgICAgICAgICAgY0hSTSBjaHVua3Mgd2l0aCB0aGUgc3BlY2lmaWMgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgICB0aGF0IGFyZSBjb25zaXN0ZW50IHdpdGggc1JHQiB0byBiZQorICAgICAgICAgICAgICAgICAgICAgd3JpdHRlbi4KKworICAgIHBuZ19zZXRfaUNDUChwbmdfcHRyLCBpbmZvX3B0ciwgbmFtZSwgY29tcHJlc3Npb25fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSwgcHJvZmxlbik7CisKKyAgICBuYW1lICAgICAgICAgICAgIC0gVGhlIHByb2ZpbGUgbmFtZS4KKworICAgIGNvbXByZXNzaW9uX3R5cGUgLSBUaGUgY29tcHJlc3Npb24gdHlwZTsgYWx3YXlzCisgICAgICAgICAgICAgICAgICAgICAgIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UgZm9yIFBORyAxLjAuCisgICAgICAgICAgICAgICAgICAgICAgIFlvdSBtYXkgZ2l2ZSBOVUxMIHRvIHRoaXMgYXJndW1lbnQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlIGl0LgorCisgICAgcHJvZmlsZSAgICAgICAgICAtIEludGVybmF0aW9uYWwgQ29sb3IgQ29uc29ydGl1bSBjb2xvcgorICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlIGRhdGEuIE1heSBjb250YWluIE5VTHMuCisKKyAgICBwcm9mbGVuICAgICAgICAgIC0gbGVuZ3RoIG9mIHByb2ZpbGUgZGF0YSBpbiBieXRlcy4KKworICAgIHBuZ19zZXRfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgc2lnX2JpdCk7CisKKyAgICBzaWdfYml0ICAgICAgICAtIHRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYml0cyBmb3IKKyAgICAgICAgICAgICAgICAgICAgIChQTkdfSU5GT19zQklUKSBlYWNoIG9mIHRoZSBncmF5LCByZWQsCisgICAgICAgICAgICAgICAgICAgICBncmVlbiwgYW5kIGJsdWUgY2hhbm5lbHMsIHdoaWNoZXZlciBhcmUKKyAgICAgICAgICAgICAgICAgICAgIGFwcHJvcHJpYXRlIGZvciB0aGUgZ2l2ZW4gY29sb3IgdHlwZQorICAgICAgICAgICAgICAgICAgICAgKHBuZ19jb2xvcl8xNikKKworICAgIHBuZ19zZXRfdFJOUyhwbmdfcHRyLCBpbmZvX3B0ciwgdHJhbnNfYWxwaGEsCisgICAgICAgbnVtX3RyYW5zLCB0cmFuc19jb2xvcik7CisKKyAgICB0cmFuc19hbHBoYSAgICAtIGFycmF5IG9mIGFscGhhICh0cmFuc3BhcmVuY3kpCisgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzIGZvciBwYWxldHRlIChQTkdfSU5GT190Uk5TKQorCisgICAgbnVtX3RyYW5zICAgICAgLSBudW1iZXIgb2YgdHJhbnNwYXJlbnQgZW50cmllcworICAgICAgICAgICAgICAgICAgICAgKFBOR19JTkZPX3RSTlMpCisKKyAgICB0cmFuc19jb2xvciAgICAtIGdyYXlsZXZlbCBvciBjb2xvciBzYW1wbGUgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgICAoaW4gb3JkZXIgcmVkLCBncmVlbiwgYmx1ZSkgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICBzaW5nbGUgdHJhbnNwYXJlbnQgY29sb3IgZm9yCisgICAgICAgICAgICAgICAgICAgICBub24tcGFsZXR0ZWQgaW1hZ2VzIChQTkdfSU5GT190Uk5TKQorCisgICAgcG5nX3NldF9oSVNUKHBuZ19wdHIsIGluZm9fcHRyLCBoaXN0KTsKKworICAgIGhpc3QgICAgICAgICAgIC0gaGlzdG9ncmFtIG9mIHBhbGV0dGUgKGFycmF5IG9mCisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNikgKFBOR19JTkZPX2hJU1QpCisKKyAgICBwbmdfc2V0X3RJTUUocG5nX3B0ciwgaW5mb19wdHIsIG1vZF90aW1lKTsKKworICAgIG1vZF90aW1lICAgICAgIC0gdGltZSBpbWFnZSB3YXMgbGFzdCBtb2RpZmllZAorICAgICAgICAgICAgICAgICAgICAgKFBOR19WQUxJRF90SU1FKQorCisgICAgcG5nX3NldF9iS0dEKHBuZ19wdHIsIGluZm9fcHRyLCBiYWNrZ3JvdW5kKTsKKworICAgIGJhY2tncm91bmQgICAgIC0gYmFja2dyb3VuZCBjb2xvciAob2YgdHlwZQorICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbG9yXzE2cCkgKFBOR19WQUxJRF9iS0dEKQorCisgICAgcG5nX3NldF90ZXh0KHBuZ19wdHIsIGluZm9fcHRyLCB0ZXh0X3B0ciwgbnVtX3RleHQpOworCisgICAgdGV4dF9wdHIgICAgICAgLSBhcnJheSBvZiBwbmdfdGV4dCBob2xkaW5nIGltYWdlCisgICAgICAgICAgICAgICAgICAgICBjb21tZW50cworCisgICAgdGV4dF9wdHJbaV0uY29tcHJlc3Npb24gLSB0eXBlIG9mIGNvbXByZXNzaW9uIHVzZWQKKyAgICAgICAgICAgICAgICAgb24gInRleHQiIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19JVFhUX0NPTVBSRVNTSU9OX05PTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19JVFhUX0NPTVBSRVNTSU9OX3pUWHQKKyAgICB0ZXh0X3B0cltpXS5rZXkgICAtIGtleXdvcmQgZm9yIGNvbW1lbnQuICBNdXN0IGNvbnRhaW4KKyAgICAgICAgICAgICAgICAgMS03OSBjaGFyYWN0ZXJzLgorICAgIHRleHRfcHRyW2ldLnRleHQgIC0gdGV4dCBjb21tZW50cyBmb3IgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQuICBDYW4gYmUgTlVMTCBvciBlbXB0eS4KKyAgICB0ZXh0X3B0cltpXS50ZXh0X2xlbmd0aCAtIGxlbmd0aCBvZiB0ZXh0IHN0cmluZywKKyAgICAgICAgICAgICAgICAgYWZ0ZXIgZGVjb21wcmVzc2lvbiwgMCBmb3IgaVRYdAorICAgIHRleHRfcHRyW2ldLml0eHRfbGVuZ3RoIC0gbGVuZ3RoIG9mIGl0eHQgc3RyaW5nLAorICAgICAgICAgICAgICAgICBhZnRlciBkZWNvbXByZXNzaW9uLCAwIGZvciB0RVh0L3pUWHQKKyAgICB0ZXh0X3B0cltpXS5sYW5nICAtIGxhbmd1YWdlIG9mIGNvbW1lbnQgKE5VTEwgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eSBmb3IgdW5rbm93bikuCisgICAgdGV4dF9wdHJbaV0udHJhbnNsYXRlZF9rZXl3b3JkICAtIGtleXdvcmQgaW4gVVRGLTggKE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvciBlbXB0eSBmb3IgdW5rbm93bikuCisKKyAgICBOb3RlIHRoYXQgdGhlIGl0eHRfbGVuZ3RoLCBsYW5nLCBhbmQgbGFuZ19rZXkKKyAgICBtZW1iZXJzIG9mIHRoZSB0ZXh0X3B0ciBzdHJ1Y3R1cmUgb25seSBleGlzdCB3aGVuIHRoZQorICAgIGxpYnJhcnkgaXMgYnVpbHQgd2l0aCBpVFh0IGNodW5rIHN1cHBvcnQuICBQcmlvciB0bworICAgIGxpYnBuZy0xLjQuMCB0aGUgbGlicmFyeSB3YXMgYnVpbHQgYnkgZGVmYXVsdCB3aXRob3V0CisgICAgaVRYdCBzdXBwb3J0LiBBbHNvIG5vdGUgdGhhdCB3aGVuIGlUWHQgaXMgc3VwcG9ydGVkLAorICAgIHRoZXkgY29udGFpbiBOVUxMIHBvaW50ZXJzIHdoZW4gdGhlICJjb21wcmVzc2lvbiIKKyAgICBmaWVsZCBjb250YWlucyBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FIG9yCisgICAgUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdC4KKworICAgIG51bV90ZXh0ICAgICAgIC0gbnVtYmVyIG9mIGNvbW1lbnRzCisKKyAgICBwbmdfc2V0X3NQTFQocG5nX3B0ciwgaW5mb19wdHIsICZwYWxldHRlX3B0ciwKKyAgICAgICBudW1fc3BhbGV0dGVzKTsKKworICAgIHBhbGV0dGVfcHRyICAgIC0gYXJyYXkgb2YgcG5nX3NQTFRfc3RydWN0IHN0cnVjdHVyZXMKKyAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHBhbGV0dGVzCisgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgaW5mbyBzdHJ1Y3R1cmUuCisgICAgbnVtX3NwYWxldHRlcyAgLSBudW1iZXIgb2YgcGFsZXR0ZSBzdHJ1Y3R1cmVzIHRvIGJlCisgICAgICAgICAgICAgICAgICAgICBhZGRlZC4KKworICAgIHBuZ19zZXRfb0ZGcyhwbmdfcHRyLCBpbmZvX3B0ciwgb2Zmc2V0X3gsIG9mZnNldF95LAorICAgICAgICB1bml0X3R5cGUpOworCisgICAgb2Zmc2V0X3ggIC0gcG9zaXRpdmUgb2Zmc2V0IGZyb20gdGhlIGxlZnQKKyAgICAgICAgICAgICAgICAgICAgIGVkZ2Ugb2YgdGhlIHNjcmVlbgorCisgICAgb2Zmc2V0X3kgIC0gcG9zaXRpdmUgb2Zmc2V0IGZyb20gdGhlIHRvcAorICAgICAgICAgICAgICAgICAgICAgZWRnZSBvZiB0aGUgc2NyZWVuCisKKyAgICB1bml0X3R5cGUgLSBQTkdfT0ZGU0VUX1BJWEVMLCBQTkdfT0ZGU0VUX01JQ1JPTUVURVIKKworICAgIHBuZ19zZXRfcEhZcyhwbmdfcHRyLCBpbmZvX3B0ciwgcmVzX3gsIHJlc195LAorICAgICAgICB1bml0X3R5cGUpOworCisgICAgcmVzX3ggICAgICAgLSBwaXhlbHMvdW5pdCBwaHlzaWNhbCByZXNvbHV0aW9uCisgICAgICAgICAgICAgICAgICBpbiB4IGRpcmVjdGlvbgorCisgICAgcmVzX3kgICAgICAgLSBwaXhlbHMvdW5pdCBwaHlzaWNhbCByZXNvbHV0aW9uCisgICAgICAgICAgICAgICAgICBpbiB5IGRpcmVjdGlvbgorCisgICAgdW5pdF90eXBlICAgLSBQTkdfUkVTT0xVVElPTl9VTktOT1dOLAorICAgICAgICAgICAgICAgICAgUE5HX1JFU09MVVRJT05fTUVURVIKKworICAgIHBuZ19zZXRfc0NBTChwbmdfcHRyLCBpbmZvX3B0ciwgdW5pdCwgd2lkdGgsIGhlaWdodCkKKworICAgIHVuaXQgICAgICAgIC0gcGh5c2ljYWwgc2NhbGUgdW5pdHMgKGFuIGludGVnZXIpCisKKyAgICB3aWR0aCAgICAgICAtIHdpZHRoIG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKKworICAgIGhlaWdodCAgICAgIC0gaGVpZ2h0IG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKKyAgICAgICAgICAgICAgICAgICh3aWR0aCBhbmQgaGVpZ2h0IGFyZSBkb3VibGVzKQorCisgICAgcG5nX3NldF9zQ0FMX3MocG5nX3B0ciwgaW5mb19wdHIsIHVuaXQsIHdpZHRoLCBoZWlnaHQpCisKKyAgICB1bml0ICAgICAgICAtIHBoeXNpY2FsIHNjYWxlIHVuaXRzIChhbiBpbnRlZ2VyKQorCisgICAgd2lkdGggICAgICAgLSB3aWR0aCBvZiBhIHBpeGVsIGluIHBoeXNpY2FsIHNjYWxlIHVuaXRzCisgICAgICAgICAgICAgICAgICBleHByZXNzZWQgYXMgYSBzdHJpbmcKKworICAgIGhlaWdodCAgICAgIC0gaGVpZ2h0IG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKKyAgICAgICAgICAgICAgICAgKHdpZHRoIGFuZCBoZWlnaHQgYXJlIHN0cmluZ3MgbGlrZSAiMi41NCIpCisKKyAgICBwbmdfc2V0X3Vua25vd25fY2h1bmtzKHBuZ19wdHIsIGluZm9fcHRyLCAmdW5rbm93bnMsCisgICAgICAgbnVtX3Vua25vd25zKQorCisgICAgdW5rbm93bnMgICAgICAgICAgLSBhcnJheSBvZiBwbmdfdW5rbm93bl9jaHVuaworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlcyBob2xkaW5nIHVua25vd24gY2h1bmtzCisgICAgdW5rbm93bnNbaV0ubmFtZSAgLSBuYW1lIG9mIHVua25vd24gY2h1bmsKKyAgICB1bmtub3duc1tpXS5kYXRhICAtIGRhdGEgb2YgdW5rbm93biBjaHVuaworICAgIHVua25vd25zW2ldLnNpemUgIC0gc2l6ZSBvZiB1bmtub3duIGNodW5rJ3MgZGF0YQorICAgIHVua25vd25zW2ldLmxvY2F0aW9uIC0gcG9zaXRpb24gdG8gd3JpdGUgY2h1bmsgaW4gZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogZG8gbm90IHdyaXRlIGNodW5rCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfSEFWRV9JSERSOiBiZWZvcmUgUExURQorICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0hBVkVfUExURTogYmVmb3JlIElEQVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19BRlRFUl9JREFUOiBhZnRlciBJREFUCisKK1RoZSAibG9jYXRpb24iIG1lbWJlciBpcyBzZXQgYXV0b21hdGljYWxseSBhY2NvcmRpbmcgdG8KK3doYXQgcGFydCBvZiB0aGUgb3V0cHV0IGZpbGUgaGFzIGFscmVhZHkgYmVlbiB3cml0dGVuLgorWW91IGNhbiBjaGFuZ2UgaXRzIHZhbHVlIGFmdGVyIGNhbGxpbmcgcG5nX3NldF91bmtub3duX2NodW5rcygpCithcyBkZW1vbnN0cmF0ZWQgaW4gcG5ndGVzdC5jLiAgV2l0aGluIGVhY2ggb2YgdGhlICJsb2NhdGlvbnMiLAordGhlIGNodW5rcyBhcmUgc2VxdWVuY2VkIGFjY29yZGluZyB0byB0aGVpciBwb3NpdGlvbiBpbiB0aGUKK3N0cnVjdHVyZSAodGhhdCBpcywgdGhlIHZhbHVlIG9mICJpIiwgd2hpY2ggaXMgdGhlIG9yZGVyIGluIHdoaWNoCit0aGUgY2h1bmsgd2FzIGVpdGhlciByZWFkIGZyb20gdGhlIGlucHV0IGZpbGUgb3IgZGVmaW5lZCB3aXRoCitwbmdfc2V0X3Vua25vd25fY2h1bmtzKS4KKworQSBxdWljayB3b3JkIGFib3V0IHRleHQgYW5kIG51bV90ZXh0LiAgdGV4dCBpcyBhbiBhcnJheSBvZiBwbmdfdGV4dAorc3RydWN0dXJlcy4gIG51bV90ZXh0IGlzIHRoZSBudW1iZXIgb2YgdmFsaWQgc3RydWN0dXJlcyBpbiB0aGUgYXJyYXkuCitFYWNoIHBuZ190ZXh0IHN0cnVjdHVyZSBob2xkcyBhIGxhbmd1YWdlIGNvZGUsIGEga2V5d29yZCwgYSB0ZXh0IHZhbHVlLAorYW5kIGEgY29tcHJlc3Npb24gdHlwZS4KKworVGhlIGNvbXByZXNzaW9uIHR5cGVzIGhhdmUgdGhlIHNhbWUgdmFsaWQgbnVtYmVycyBhcyB0aGUgY29tcHJlc3Npb24KK3R5cGVzIG9mIHRoZSBpbWFnZSBkYXRhLiAgQ3VycmVudGx5LCB0aGUgb25seSB2YWxpZCBudW1iZXIgaXMgemVyby4KK0hvd2V2ZXIsIHlvdSBjYW4gc3RvcmUgdGV4dCBlaXRoZXIgY29tcHJlc3NlZCBvciB1bmNvbXByZXNzZWQsIHVubGlrZQoraW1hZ2VzLCB3aGljaCBhbHdheXMgaGF2ZSB0byBiZSBjb21wcmVzc2VkLiAgU28gaWYgeW91IGRvbid0IHdhbnQgdGhlCit0ZXh0IGNvbXByZXNzZWQsIHNldCB0aGUgY29tcHJlc3Npb24gdHlwZSB0byBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FLgorQmVjYXVzZSB0RVh0IGFuZCB6VFh0IGNodW5rcyBkb24ndCBoYXZlIGEgbGFuZ3VhZ2UgZmllbGQsIGlmIHlvdQorc3BlY2lmeSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FIG9yIFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQKK2FueSBsYW5ndWFnZSBjb2RlIG9yIHRyYW5zbGF0ZWQga2V5d29yZCB3aWxsIG5vdCBiZSB3cml0dGVuIG91dC4KKworVW50aWwgdGV4dCBnZXRzIGFyb3VuZCBhIGZldyBodW5kcmVkIGJ5dGVzLCBpdCBpcyBub3Qgd29ydGggY29tcHJlc3NpbmcgaXQuCitBZnRlciB0aGUgdGV4dCBoYXMgYmVlbiB3cml0dGVuIG91dCB0byB0aGUgZmlsZSwgdGhlIGNvbXByZXNzaW9uIHR5cGUKK2lzIHNldCB0byBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FX1dSIG9yIFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHRfV1IsCitzbyB0aGF0IGl0IGlzbid0IHdyaXR0ZW4gb3V0IGFnYWluIGF0IHRoZSBlbmQgKGluIGNhc2UgeW91IGFyZSBjYWxsaW5nCitwbmdfd3JpdGVfZW5kKCkgd2l0aCB0aGUgc2FtZSBzdHJ1Y3QpLgorCitUaGUga2V5d29yZHMgdGhhdCBhcmUgZ2l2ZW4gaW4gdGhlIFBORyBTcGVjaWZpY2F0aW9uIGFyZToKKworICAgIFRpdGxlICAgICAgICAgICAgU2hvcnQgKG9uZSBsaW5lKSB0aXRsZSBvcgorICAgICAgICAgICAgICAgICAgICAgY2FwdGlvbiBmb3IgaW1hZ2UKKworICAgIEF1dGhvciAgICAgICAgICAgTmFtZSBvZiBpbWFnZSdzIGNyZWF0b3IKKworICAgIERlc2NyaXB0aW9uICAgICAgRGVzY3JpcHRpb24gb2YgaW1hZ2UgKHBvc3NpYmx5IGxvbmcpCisKKyAgICBDb3B5cmlnaHQgICAgICAgIENvcHlyaWdodCBub3RpY2UKKworICAgIENyZWF0aW9uIFRpbWUgICAgVGltZSBvZiBvcmlnaW5hbCBpbWFnZSBjcmVhdGlvbgorICAgICAgICAgICAgICAgICAgICAgKHVzdWFsbHkgUkZDIDExMjMgZm9ybWF0LCBzZWUgYmVsb3cpCisKKyAgICBTb2Z0d2FyZSAgICAgICAgIFNvZnR3YXJlIHVzZWQgdG8gY3JlYXRlIHRoZSBpbWFnZQorCisgICAgRGlzY2xhaW1lciAgICAgICBMZWdhbCBkaXNjbGFpbWVyCisKKyAgICBXYXJuaW5nICAgICAgICAgIFdhcm5pbmcgb2YgbmF0dXJlIG9mIGNvbnRlbnQKKworICAgIFNvdXJjZSAgICAgICAgICAgRGV2aWNlIHVzZWQgdG8gY3JlYXRlIHRoZSBpbWFnZQorCisgICAgQ29tbWVudCAgICAgICAgICBNaXNjZWxsYW5lb3VzIGNvbW1lbnQ7IGNvbnZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgIGZyb20gb3RoZXIgaW1hZ2UgZm9ybWF0CisKK1RoZSBrZXl3b3JkLXRleHQgcGFpcnMgd29yayBsaWtlIHRoaXMuICBLZXl3b3JkcyBzaG91bGQgYmUgc2hvcnQKK3NpbXBsZSBkZXNjcmlwdGlvbnMgb2Ygd2hhdCB0aGUgY29tbWVudCBpcyBhYm91dC4gIFNvbWUgdHlwaWNhbAora2V5d29yZHMgYXJlIGZvdW5kIGluIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiwgYXMgaXMgc29tZSByZWNvbW1lbmRhdGlvbnMKK29uIGtleXdvcmRzLiAgWW91IGNhbiByZXBlYXQga2V5d29yZHMgaW4gYSBmaWxlLiAgWW91IGNhbiBldmVuIHdyaXRlCitzb21lIHRleHQgYmVmb3JlIHRoZSBpbWFnZSBhbmQgc29tZSBhZnRlci4gIEZvciBleGFtcGxlLCB5b3UgbWF5IHdhbnQKK3RvIHB1dCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBpbWFnZSBiZWZvcmUgdGhlIGltYWdlLCBidXQgbGVhdmUgdGhlCitkaXNjbGFpbWVyIHVudGlsIGFmdGVyLCBzbyB2aWV3ZXJzIHdvcmtpbmcgb3ZlciBtb2RlbSBjb25uZWN0aW9ucworZG9uJ3QgaGF2ZSB0byB3YWl0IGZvciB0aGUgZGlzY2xhaW1lciB0byBnbyBvdmVyIHRoZSBtb2RlbSBiZWZvcmUKK3RoZXkgc3RhcnQgc2VlaW5nIHRoZSBpbWFnZS4gIEZpbmFsbHksIGtleXdvcmRzIHNob3VsZCBiZSBmdWxsCit3b3Jkcywgbm90IGFiYnJldmlhdGlvbnMuICBLZXl3b3JkcyBhbmQgdGV4dCBhcmUgaW4gdGhlIElTTyA4ODU5LTEKKyhMYXRpbi0xKSBjaGFyYWN0ZXIgc2V0IChhIHN1cGVyc2V0IG9mIHJlZ3VsYXIgQVNDSUkpIGFuZCBjYW4gbm90Citjb250YWluIE5VTCBjaGFyYWN0ZXJzLCBhbmQgc2hvdWxkIG5vdCBjb250YWluIGNvbnRyb2wgb3Igb3RoZXIKK3VucHJpbnRhYmxlIGNoYXJhY3RlcnMuICBUbyBtYWtlIHRoZSBjb21tZW50cyB3aWRlbHkgcmVhZGFibGUsIHN0aWNrCit3aXRoIGJhc2ljIEFTQ0lJLCBhbmQgYXZvaWQgbWFjaGluZSBzcGVjaWZpYyBjaGFyYWN0ZXIgc2V0IGV4dGVuc2lvbnMKK2xpa2UgdGhlIElCTS1QQyBjaGFyYWN0ZXIgc2V0LiAgVGhlIGtleXdvcmQgbXVzdCBiZSBwcmVzZW50LCBidXQKK3lvdSBjYW4gbGVhdmUgb2ZmIHRoZSB0ZXh0IHN0cmluZyBvbiBub24tY29tcHJlc3NlZCBwYWlycy4KK0NvbXByZXNzZWQgcGFpcnMgbXVzdCBoYXZlIGEgdGV4dCBzdHJpbmcsIGFzIG9ubHkgdGhlIHRleHQgc3RyaW5nCitpcyBjb21wcmVzc2VkIGFueXdheSwgc28gdGhlIGNvbXByZXNzaW9uIHdvdWxkIGJlIG1lYW5pbmdsZXNzLgorCitQTkcgc3VwcG9ydHMgbW9kaWZpY2F0aW9uIHRpbWUgdmlhIHRoZSBwbmdfdGltZSBzdHJ1Y3R1cmUuICBUd28KK2NvbnZlcnNpb24gcm91dGluZXMgYXJlIHByb3ZpZGVkLCBwbmdfY29udmVydF9mcm9tX3RpbWVfdCgpIGZvcgordGltZV90IGFuZCBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSgpIGZvciBzdHJ1Y3QgdG0uICBUaGUKK3RpbWVfdCByb3V0aW5lIHVzZXMgZ210aW1lKCkuICBZb3UgZG9uJ3QgaGF2ZSB0byB1c2UgZWl0aGVyIG9mCit0aGVzZSwgYnV0IGlmIHlvdSB3aXNoIHRvIGZpbGwgaW4gdGhlIHBuZ190aW1lIHN0cnVjdHVyZSBkaXJlY3RseSwKK3lvdSBzaG91bGQgcHJvdmlkZSB0aGUgdGltZSBpbiB1bml2ZXJzYWwgdGltZSAoR01UKSBpZiBwb3NzaWJsZQoraW5zdGVhZCBvZiB5b3VyIGxvY2FsIHRpbWUuICBOb3RlIHRoYXQgdGhlIHllYXIgbnVtYmVyIGlzIHRoZSBmdWxsCit5ZWFyIChlLmcuIDE5OTgsIHJhdGhlciB0aGFuIDk4IC0gUE5HIGlzIHllYXIgMjAwMCBjb21wbGlhbnQhKSwgYW5kCit0aGF0IG1vbnRocyBzdGFydCB3aXRoIDEuCisKK0lmIHlvdSB3YW50IHRvIHN0b3JlIHRoZSB0aW1lIG9mIHRoZSBvcmlnaW5hbCBpbWFnZSBjcmVhdGlvbiwgeW91IHNob3VsZAordXNlIGEgcGxhaW4gdEVYdCBjaHVuayB3aXRoIHRoZSAiQ3JlYXRpb24gVGltZSIga2V5d29yZC4gIFRoaXMgaXMKK25lY2Vzc2FyeSBiZWNhdXNlIHRoZSAiY3JlYXRpb24gdGltZSIgb2YgYSBQTkcgaW1hZ2UgaXMgc29tZXdoYXQgdmFndWUsCitkZXBlbmRpbmcgb24gd2hldGhlciB5b3UgbWVhbiB0aGUgUE5HIGZpbGUsIHRoZSB0aW1lIHRoZSBpbWFnZSB3YXMKK2NyZWF0ZWQgaW4gYSBub24tUE5HIGZvcm1hdCwgYSBzdGlsbCBwaG90byBmcm9tIHdoaWNoIHRoZSBpbWFnZSB3YXMKK3NjYW5uZWQsIG9yIHBvc3NpYmx5IHRoZSBzdWJqZWN0IG1hdHRlciBpdHNlbGYuICBJbiBvcmRlciB0byBmYWNpbGl0YXRlCittYWNoaW5lLXJlYWRhYmxlIGRhdGVzLCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoZSAiQ3JlYXRpb24gVGltZSIKK3RFWHQgY2h1bmsgdXNlIFJGQyAxMTIzIGZvcm1hdCBkYXRlcyAoZS5nLiAiMjIgTWF5IDE5OTcgMTg6MDc6MTAgR01UIiksCithbHRob3VnaCB0aGlzIGlzbid0IGEgcmVxdWlyZW1lbnQuICBVbmxpa2UgdGhlIHRJTUUgY2h1bmssIHRoZQorIkNyZWF0aW9uIFRpbWUiIHRFWHQgY2h1bmsgaXMgbm90IGV4cGVjdGVkIHRvIGJlIGF1dG9tYXRpY2FsbHkgY2hhbmdlZAorYnkgdGhlIHNvZnR3YXJlLiAgVG8gZmFjaWxpdGF0ZSB0aGUgdXNlIG9mIFJGQyAxMTIzIGRhdGVzLCBhIGZ1bmN0aW9uCitwbmdfY29udmVydF90b19yZmMxMTIzX2J1ZmZlcihidWZmZXIsIHBuZ190aW1lcCkgaXMgcHJvdmlkZWQgdG8KK2NvbnZlcnQgZnJvbSBQTkcgdGltZSB0byBhbiBSRkMgMTEyMyBmb3JtYXQgc3RyaW5nLiAgVGhlIGNhbGxlciBtdXN0IHByb3ZpZGUKK2Egd3JpdGVhYmxlIGJ1ZmZlciBvZiBhdCBsZWFzdCAyOSBieXRlcy4KKworLlNTIFdyaXRpbmcgdW5rbm93biBjaHVua3MKKworWW91IGNhbiB1c2UgdGhlIHBuZ19zZXRfdW5rbm93bl9jaHVua3MgZnVuY3Rpb24gdG8gcXVldWUgdXAgcHJpdmF0ZSBjaHVua3MKK2ZvciB3cml0aW5nLiAgWW91IGdpdmUgaXQgYSBjaHVuayBuYW1lLCBsb2NhdGlvbiwgcmF3IGRhdGEsIGFuZCBhIHNpemUuICBZb3UKK2Fsc28gbXVzdCB1c2UgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKCkgdG8gZW5zdXJlIHRoYXQgbGlicG5nIHdpbGwKK2hhbmRsZSB0aGVtLiAgVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdC4gIFRoZSBjaHVua3Mgd2lsbCBiZSB3cml0dGVuIGJ5IHRoZQorbmV4dCBmb2xsb3dpbmcgcG5nX3dyaXRlX2luZm9fYmVmb3JlX1BMVEUsIHBuZ193cml0ZV9pbmZvLCBvciBwbmdfd3JpdGVfZW5kCitmdW5jdGlvbiwgZGVwZW5kaW5nIHVwb24gdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4gIEFueSBjaHVua3MgcHJldmlvdXNseQorcmVhZCBpbnRvIHRoZSBpbmZvIHN0cnVjdHVyZSdzIHVua25vd24tY2h1bmsgbGlzdCB3aWxsIGFsc28gYmUgd3JpdHRlbiBvdXQKK2luIGEgc2VxdWVuY2UgdGhhdCBzYXRpc2ZpZXMgdGhlIFBORyBzcGVjaWZpY2F0aW9uJ3Mgb3JkZXJpbmcgcnVsZXMuCisKK0hlcmUgaXMgYW4gZXhhbXBsZSBvZiB3cml0aW5nIHR3byBwcml2YXRlIGNodW5rcywgcHJWdCBhbmQgbWlORToKKworICAgICNpZmRlZiBQTkdfV1JJVEVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECisgICAgLyogU2V0IHVua25vd24gY2h1bmsgZGF0YSAqLworICAgIHBuZ191bmtub3duX2NodW5rIHVua19jaHVua1syXTsKKyAgICBzdHJjcHkoKGNoYXIgKikgdW5rX2NodW5rWzBdLm5hbWUsICJwclZ0IjsKKyAgICB1bmtfY2h1bmtbMF0uZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopICJQUklWQVRFIERBVEEiOworICAgIHVua19jaHVua1swXS5zaXplID0gc3RybGVuKHVua19jaHVua1swXS5kYXRhKSsxOworICAgIHVua19jaHVua1swXS5sb2NhdGlvbiA9IFBOR19IQVZFX0lIRFI7CisgICAgc3RyY3B5KChjaGFyICopIHVua19jaHVua1sxXS5uYW1lLCAibWlORSI7CisgICAgdW5rX2NodW5rWzFdLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSAiTVkgQ0hVTksgREFUQSI7CisgICAgdW5rX2NodW5rWzFdLnNpemUgPSBzdHJsZW4odW5rX2NodW5rWzBdLmRhdGEpKzE7CisgICAgdW5rX2NodW5rWzFdLmxvY2F0aW9uID0gUE5HX0FGVEVSX0lEQVQ7CisgICAgcG5nX3NldF91bmtub3duX2NodW5rcyh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLAorICAgICAgICB1bmtfY2h1bmssIDIpOworICAgIC8qIE5lZWRlZCBiZWNhdXNlIG1pTkUgaXMgbm90IHNhZmUtdG8tY29weSAqLworICAgIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyhwbmcsIFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTLAorICAgICAgIChwbmdfYnl0ZXApICJtaU5FIiwgMSk7CisgICAgIyBpZiBQTkdfTElCUE5HX1ZFUiA8IDEwNjAwCisgICAgICAvKiBEZWFsIHdpdGggdW5rbm93biBjaHVuayBsb2NhdGlvbiBidWcgaW4gMS41LnggYW5kIGVhcmxpZXIgKi8KKyAgICAgIHBuZ19zZXRfdW5rbm93bl9jaHVua19sb2NhdGlvbihwbmcsIGluZm8sIDAsIFBOR19IQVZFX0lIRFIpOworICAgICAgcG5nX3NldF91bmtub3duX2NodW5rX2xvY2F0aW9uKHBuZywgaW5mbywgMSwgUE5HX0FGVEVSX0lEQVQpOworICAgICMgZW5kaWYKKyAgICAjIGlmIFBOR19MSUJQTkdfVkVSIDwgMTA1MDAKKyAgICAgIC8qIFBOR19BRlRFUl9JREFUIHdyaXRlcyB0d28gY29waWVzIG9mIHRoZSBjaHVuayBwcmlvciB0byBsaWJwbmctMS41LjAsCisgICAgICAgKiBvbmUgYmVmb3JlIElEQVQgYW5kIGFub3RoZXIgYWZ0ZXIgSURBVCwgc28gZG9uJ3QgdXNlIGl0OyBvbmx5IHVzZQorICAgICAgICogUE5HX0hBVkVfSUhEUiBsb2NhdGlvbi4gIFRoaXMgY2FsbCByZXNldHMgdGhlIGxvY2F0aW9uIHByZXZpb3VzbHkKKyAgICAgICAqIHNldCBieSBhc3NpZ25tZW50IGFuZCBwbmdfc2V0X3Vua25vd25fY2h1bmtfbG9jYXRpb24oKSBmb3IgY2h1bmsgMS4KKyAgICAgICAqLworICAgICAgcG5nX3NldF91bmtub3duX2NodW5rX2xvY2F0aW9uKHBuZywgaW5mbywgMSwgUE5HX0hBVkVfSUhEUik7CisgICAgIyBlbmRpZgorICAgICNlbmRpZgorCisuU1MgVGhlIGhpZ2gtbGV2ZWwgd3JpdGUgaW50ZXJmYWNlCisKK0F0IHRoaXMgcG9pbnQgdGhlcmUgYXJlIHR3byB3YXlzIHRvIHByb2NlZWQ7IHRocm91Z2ggdGhlIGhpZ2gtbGV2ZWwKK3dyaXRlIGludGVyZmFjZSwgb3IgdGhyb3VnaCBhIHNlcXVlbmNlIG9mIGxvdy1sZXZlbCB3cml0ZSBvcGVyYXRpb25zLgorWW91IGNhbiB1c2UgdGhlIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlIGlmIHlvdXIgaW1hZ2UgZGF0YSBpcyBwcmVzZW50CitpbiB0aGUgaW5mbyBzdHJ1Y3R1cmUuICBBbGwgZGVmaW5lZCBvdXRwdXQKK3RyYW5zZm9ybWF0aW9ucyBhcmUgcGVybWl0dGVkLCBlbmFibGVkIGJ5IHRoZSBmb2xsb3dpbmcgbWFza3MuCisKKyAgICBQTkdfVFJBTlNGT1JNX0lERU5USVRZICAgICAgTm8gdHJhbnNmb3JtYXRpb24KKyAgICBQTkdfVFJBTlNGT1JNX1BBQ0tJTkcgICAgICAgUGFjayAxLCAyIGFuZCA0LWJpdCBzYW1wbGVzCisgICAgUE5HX1RSQU5TRk9STV9QQUNLU1dBUCAgICAgIENoYW5nZSBvcmRlciBvZiBwYWNrZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzIHRvIExTQiBmaXJzdAorICAgIFBOR19UUkFOU0ZPUk1fSU5WRVJUX01PTk8gICBJbnZlcnQgbW9ub2Nocm9tZSBpbWFnZXMKKyAgICBQTkdfVFJBTlNGT1JNX1NISUZUICAgICAgICAgTm9ybWFsaXplIHBpeGVscyB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0JJVCBkZXB0aAorICAgIFBOR19UUkFOU0ZPUk1fQkdSICAgICAgICAgICBGbGlwIFJHQiB0byBCR1IsIFJHQkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gQkdSQQorICAgIFBOR19UUkFOU0ZPUk1fU1dBUF9BTFBIQSAgICBGbGlwIFJHQkEgdG8gQVJHQiBvciBHQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBBRworICAgIFBOR19UUkFOU0ZPUk1fSU5WRVJUX0FMUEhBICBDaGFuZ2UgYWxwaGEgZnJvbSBvcGFjaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRyYW5zcGFyZW5jeQorICAgIFBOR19UUkFOU0ZPUk1fU1dBUF9FTkRJQU4gICBCeXRlLXN3YXAgMTYtYml0IHNhbXBsZXMKKyAgICBQTkdfVFJBTlNGT1JNX1NUUklQX0ZJTExFUiAgICAgICAgU3RyaXAgb3V0IGZpbGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcyAoZGVwcmVjYXRlZCkuCisgICAgUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVJfQkVGT1JFIFN0cmlwIG91dCBsZWFkaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxlciBieXRlcworICAgIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSX0FGVEVSICBTdHJpcCBvdXQgdHJhaWxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbGVyIGJ5dGVzCisKK0lmIHlvdSBoYXZlIHZhbGlkIGltYWdlIGRhdGEgaW4gdGhlIGluZm8gc3RydWN0dXJlICh5b3UgY2FuIHVzZQorcG5nX3NldF9yb3dzKCkgdG8gcHV0IGltYWdlIGRhdGEgaW4gdGhlIGluZm8gc3RydWN0dXJlKSwgc2ltcGx5IGRvIHRoaXM6CisKKyAgICBwbmdfd3JpdGVfcG5nKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfdHJhbnNmb3JtcywgTlVMTCkKKword2hlcmUgcG5nX3RyYW5zZm9ybXMgaXMgYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBiaXR3aXNlIE9SIG9mIHNvbWUgc2V0IG9mCit0cmFuc2Zvcm1hdGlvbiBmbGFncy4gIFRoaXMgY2FsbCBpcyBlcXVpdmFsZW50IHRvIHBuZ193cml0ZV9pbmZvKCksCitmb2xsb3dlZCB0aGUgc2V0IG9mIHRyYW5zZm9ybWF0aW9ucyBpbmRpY2F0ZWQgYnkgdGhlIHRyYW5zZm9ybSBtYXNrLAordGhlbiBwbmdfd3JpdGVfaW1hZ2UoKSwgYW5kIGZpbmFsbHkgcG5nX3dyaXRlX2VuZCgpLgorCisoVGhlIGZpbmFsIHBhcmFtZXRlciBvZiB0aGlzIGNhbGwgaXMgbm90IHlldCB1c2VkLiAgU29tZWRheSBpdCBtaWdodCBwb2ludAordG8gdHJhbnNmb3JtYXRpb24gcGFyYW1ldGVycyByZXF1aXJlZCBieSBzb21lIGZ1dHVyZSBvdXRwdXQgdHJhbnNmb3JtLikKKworWW91IG11c3QgdXNlIHBuZ190cmFuc2Zvcm1zIGFuZCBub3QgY2FsbCBhbnkgcG5nX3NldF90cmFuc2Zvcm0oKSBmdW5jdGlvbnMKK3doZW4geW91IHVzZSBwbmdfd3JpdGVfcG5nKCkuCisKKy5TUyBUaGUgbG93LWxldmVsIHdyaXRlIGludGVyZmFjZQorCitJZiB5b3UgYXJlIGdvaW5nIHRoZSBsb3ctbGV2ZWwgcm91dGUgaW5zdGVhZCwgeW91IGFyZSBub3cgcmVhZHkgdG8KK3dyaXRlIGFsbCB0aGUgZmlsZSBpbmZvcm1hdGlvbiB1cCB0byB0aGUgYWN0dWFsIGltYWdlIGRhdGEuICBZb3UgZG8KK3RoaXMgd2l0aCBhIGNhbGwgdG8gcG5nX3dyaXRlX2luZm8oKS4KKworICAgIHBuZ193cml0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKKworTm90ZSB0aGF0IHRoZXJlIGlzIG9uZSB0cmFuc2Zvcm1hdGlvbiB5b3UgbWF5IG5lZWQgdG8gZG8gYmVmb3JlCitwbmdfd3JpdGVfaW5mbygpLiAgSW4gUE5HIGZpbGVzLCB0aGUgYWxwaGEgY2hhbm5lbCBpbiBhbiBpbWFnZSBpcyB0aGUKK2xldmVsIG9mIG9wYWNpdHkuICBJZiB5b3VyIGRhdGEgaXMgc3VwcGxpZWQgYXMgYSBsZXZlbCBvZiB0cmFuc3BhcmVuY3ksCit5b3UgY2FuIGludmVydCB0aGUgYWxwaGEgY2hhbm5lbCBiZWZvcmUgeW91IHdyaXRlIGl0LCBzbyB0aGF0IDAgaXMKK2Z1bGx5IHRyYW5zcGFyZW50IGFuZCAyNTUgKGluIDgtYml0IG9yIHBhbGV0dGVkIGltYWdlcykgb3IgNjU1MzUKKyhpbiAxNi1iaXQgaW1hZ2VzKSBpcyBmdWxseSBvcGFxdWUsIHdpdGgKKworICAgIHBuZ19zZXRfaW52ZXJ0X2FscGhhKHBuZ19wdHIpOworCitUaGlzIG11c3QgYXBwZWFyIGJlZm9yZSBwbmdfd3JpdGVfaW5mbygpIGluc3RlYWQgb2YgbGF0ZXIgd2l0aCB0aGUKK290aGVyIHRyYW5zZm9ybWF0aW9ucyBiZWNhdXNlIGluIHRoZSBjYXNlIG9mIHBhbGV0dGVkIGltYWdlcyB0aGUgdFJOUworY2h1bmsgZGF0YSBoYXMgdG8gYmUgaW52ZXJ0ZWQgYmVmb3JlIHRoZSB0Uk5TIGNodW5rIGlzIHdyaXR0ZW4uICBJZgoreW91ciBpbWFnZSBpcyBub3QgYSBwYWxldHRlZCBpbWFnZSwgdGhlIHRSTlMgZGF0YSAod2hpY2ggaW4gc3VjaCBjYXNlcworcmVwcmVzZW50cyBhIHNpbmdsZSBjb2xvciB0byBiZSByZW5kZXJlZCBhcyB0cmFuc3BhcmVudCkgd29uJ3QgbmVlZCB0bworYmUgY2hhbmdlZCwgYW5kIHlvdSBjYW4gc2FmZWx5IGRvIHRoaXMgdHJhbnNmb3JtYXRpb24gYWZ0ZXIgeW91cgorcG5nX3dyaXRlX2luZm8oKSBjYWxsLgorCitJZiB5b3UgbmVlZCB0byB3cml0ZSBhIHByaXZhdGUgY2h1bmsgdGhhdCB5b3Ugd2FudCB0byBhcHBlYXIgYmVmb3JlCit0aGUgUExURSBjaHVuayB3aGVuIFBMVEUgaXMgcHJlc2VudCwgeW91IGNhbiB3cml0ZSB0aGUgUE5HIGluZm8gaW4KK3R3byBzdGVwcywgYW5kIGluc2VydCBjb2RlIHRvIHdyaXRlIHlvdXIgb3duIGNodW5rIGJldHdlZW4gdGhlbToKKworICAgIHBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFKHBuZ19wdHIsIGluZm9fcHRyKTsKKyAgICBwbmdfc2V0X3Vua25vd25fY2h1bmtzKHBuZ19wdHIsIGluZm9fcHRyLCAuLi4pOworICAgIHBuZ193cml0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKKworQWZ0ZXIgeW91J3ZlIHdyaXR0ZW4gdGhlIGZpbGUgaW5mb3JtYXRpb24sIHlvdSBjYW4gc2V0IHVwIHRoZSBsaWJyYXJ5Cit0byBoYW5kbGUgYW55IHNwZWNpYWwgdHJhbnNmb3JtYXRpb25zIG9mIHRoZSBpbWFnZSBkYXRhLiAgVGhlIHZhcmlvdXMKK3dheXMgdG8gdHJhbnNmb3JtIHRoZSBkYXRhIHdpbGwgYmUgZGVzY3JpYmVkIGluIHRoZSBvcmRlciB0aGF0IHRoZXkKK3Nob3VsZCBvY2N1ci4gIFRoaXMgaXMgaW1wb3J0YW50LCBhcyBzb21lIG9mIHRoZXNlIGNoYW5nZSB0aGUgY29sb3IKK3R5cGUgYW5kL29yIGJpdCBkZXB0aCBvZiB0aGUgZGF0YSwgYW5kIHNvbWUgb3RoZXJzIG9ubHkgd29yayBvbgorY2VydGFpbiBjb2xvciB0eXBlcyBhbmQgYml0IGRlcHRocy4gIEV2ZW4gdGhvdWdoIGVhY2ggdHJhbnNmb3JtYXRpb24KK2NoZWNrcyB0byBzZWUgaWYgaXQgaGFzIGRhdGEgdGhhdCBpdCBjYW4gZG8gc29tZXRoaW5nIHdpdGgsIHlvdSBzaG91bGQKK21ha2Ugc3VyZSB0byBvbmx5IGVuYWJsZSBhIHRyYW5zZm9ybWF0aW9uIGlmIGl0IHdpbGwgYmUgdmFsaWQgZm9yIHRoZQorZGF0YS4gIEZvciBleGFtcGxlLCBkb24ndCBzd2FwIHJlZCBhbmQgYmx1ZSBvbiBncmF5c2NhbGUgZGF0YS4KKworUE5HIGZpbGVzIHN0b3JlIFJHQiBwaXhlbHMgcGFja2VkIGludG8gMyBvciA2IGJ5dGVzLiAgVGhpcyBjb2RlIHRlbGxzCit0aGUgbGlicmFyeSB0byBzdHJpcCBpbnB1dCBkYXRhIHRoYXQgaGFzIDQgb3IgOCBieXRlcyBwZXIgcGl4ZWwgZG93bgordG8gMyBvciA2IGJ5dGVzIChvciBzdHJpcCAyIG9yIDQtYnl0ZSBncmF5c2NhbGUrZmlsbGVyIGRhdGEgdG8gMSBvciAyCitieXRlcyBwZXIgcGl4ZWwpLgorCisgICAgcG5nX3NldF9maWxsZXIocG5nX3B0ciwgMCwgUE5HX0ZJTExFUl9CRUZPUkUpOworCit3aGVyZSB0aGUgMCBpcyB1bnVzZWQsIGFuZCB0aGUgbG9jYXRpb24gaXMgZWl0aGVyIFBOR19GSUxMRVJfQkVGT1JFIG9yCitQTkdfRklMTEVSX0FGVEVSLCBkZXBlbmRpbmcgdXBvbiB3aGV0aGVyIHRoZSBmaWxsZXIgYnl0ZSBpbiB0aGUgcGl4ZWwKK2lzIHN0b3JlZCBYUkdCIG9yIFJHQlguCisKK1BORyBmaWxlcyBwYWNrIHBpeGVscyBvZiBiaXQgZGVwdGhzIDEsIDIsIGFuZCA0IGludG8gYnl0ZXMgYXMgc21hbGwgYXMKK3RoZXkgY2FuLCByZXN1bHRpbmcgaW4sIGZvciBleGFtcGxlLCA4IHBpeGVscyBwZXIgYnl0ZSBmb3IgMSBiaXQgZmlsZXMuCitJZiB0aGUgZGF0YSBpcyBzdXBwbGllZCBhdCAxIHBpeGVsIHBlciBieXRlLCB1c2UgdGhpcyBjb2RlLCB3aGljaCB3aWxsCitjb3JyZWN0bHkgcGFjayB0aGUgcGl4ZWxzIGludG8gYSBzaW5nbGUgYnl0ZToKKworICAgIHBuZ19zZXRfcGFja2luZyhwbmdfcHRyKTsKKworUE5HIGZpbGVzIHJlZHVjZSBwb3NzaWJsZSBiaXQgZGVwdGhzIHRvIDEsIDIsIDQsIDgsIGFuZCAxNi4gIElmIHlvdXIKK2RhdGEgaXMgb2YgYW5vdGhlciBiaXQgZGVwdGgsIHlvdSBjYW4gd3JpdGUgYW4gc0JJVCBjaHVuayBpbnRvIHRoZQorZmlsZSBzbyB0aGF0IGRlY29kZXJzIGNhbiByZWNvdmVyIHRoZSBvcmlnaW5hbCBkYXRhIGlmIGRlc2lyZWQuCisKKyAgICAvKiBTZXQgdGhlIHRydWUgYml0IGRlcHRoIG9mIHRoZSBpbWFnZSBkYXRhICovCisgICAgaWYgKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikKKyAgICB7CisgICAgICAgc2lnX2JpdC5yZWQgPSB0cnVlX2JpdF9kZXB0aDsKKyAgICAgICBzaWdfYml0LmdyZWVuID0gdHJ1ZV9iaXRfZGVwdGg7CisgICAgICAgc2lnX2JpdC5ibHVlID0gdHJ1ZV9iaXRfZGVwdGg7CisgICAgfQorCisgICAgZWxzZQorICAgIHsKKyAgICAgICBzaWdfYml0LmdyYXkgPSB0cnVlX2JpdF9kZXB0aDsKKyAgICB9CisKKyAgICBpZiAoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKQorICAgIHsKKyAgICAgICBzaWdfYml0LmFscGhhID0gdHJ1ZV9iaXRfZGVwdGg7CisgICAgfQorCisgICAgcG5nX3NldF9zQklUKHBuZ19wdHIsIGluZm9fcHRyLCAmc2lnX2JpdCk7CisKK0lmIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgcm93IGJ1ZmZlciBpbiBhIGJpdCBkZXB0aCBvdGhlciB0aGFuCitvbmUgc3VwcG9ydGVkIGJ5IFBORyAoZS5nLiAzIGJpdCBkYXRhIGluIHRoZSByYW5nZSAwLTcgZm9yIGEgNC1iaXQgUE5HKSwKK3RoaXMgd2lsbCBzY2FsZSB0aGUgdmFsdWVzIHRvIGFwcGVhciB0byBiZSB0aGUgY29ycmVjdCBiaXQgZGVwdGggYXMKK2lzIHJlcXVpcmVkIGJ5IFBORy4KKworICAgIHBuZ19zZXRfc2hpZnQocG5nX3B0ciwgJnNpZ19iaXQpOworCitQTkcgZmlsZXMgc3RvcmUgMTYtYml0IHBpeGVscyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKGJpZy1lbmRpYW4sCitpZS4gbW9zdCBzaWduaWZpY2FudCBiaXRzIGZpcnN0KS4gIFRoaXMgY29kZSB3b3VsZCBiZSB1c2VkIGlmIHRoZXkgYXJlCitzdXBwbGllZCB0aGUgb3RoZXIgd2F5IChsaXR0bGUtZW5kaWFuLCBpLmUuIGxlYXN0IHNpZ25pZmljYW50IGJpdHMKK2ZpcnN0LCB0aGUgd2F5IFBDcyBzdG9yZSB0aGVtKToKKworICAgIGlmIChiaXRfZGVwdGggPiA4KQorICAgICAgIHBuZ19zZXRfc3dhcChwbmdfcHRyKTsKKworSWYgeW91IGFyZSB1c2luZyBwYWNrZWQtcGl4ZWwgaW1hZ2VzICgxLCAyLCBvciA0IGJpdHMvcGl4ZWwpLCBhbmQgeW91CituZWVkIHRvIGNoYW5nZSB0aGUgb3JkZXIgdGhlIHBpeGVscyBhcmUgcGFja2VkIGludG8gYnl0ZXMsIHlvdSBjYW4gdXNlOgorCisgICAgaWYgKGJpdF9kZXB0aCA8IDgpCisgICAgICAgcG5nX3NldF9wYWNrc3dhcChwbmdfcHRyKTsKKworUE5HIGZpbGVzIHN0b3JlIDMgY29sb3IgcGl4ZWxzIGluIHJlZCwgZ3JlZW4sIGJsdWUgb3JkZXIuICBUaGlzIGNvZGUKK3dvdWxkIGJlIHVzZWQgaWYgdGhleSBhcmUgc3VwcGxpZWQgYXMgYmx1ZSwgZ3JlZW4sIHJlZDoKKworICAgIHBuZ19zZXRfYmdyKHBuZ19wdHIpOworCitQTkcgZmlsZXMgZGVzY3JpYmUgbW9ub2Nocm9tZSBhcyBibGFjayBiZWluZyB6ZXJvIGFuZCB3aGl0ZSBiZWluZworb25lLiBUaGlzIGNvZGUgd291bGQgYmUgdXNlZCBpZiB0aGUgcGl4ZWxzIGFyZSBzdXBwbGllZCB3aXRoIHRoaXMgcmV2ZXJzZWQKKyhibGFjayBiZWluZyBvbmUgYW5kIHdoaXRlIGJlaW5nIHplcm8pOgorCisgICAgcG5nX3NldF9pbnZlcnRfbW9ubyhwbmdfcHRyKTsKKworRmluYWxseSwgeW91IGNhbiB3cml0ZSB5b3VyIG93biB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiBpZiBub25lIG9mCit0aGUgZXhpc3Rpbmcgb25lcyBtZWV0cyB5b3VyIG5lZWRzLiAgVGhpcyBpcyBkb25lIGJ5IHNldHRpbmcgYSBjYWxsYmFjaword2l0aAorCisgICAgcG5nX3NldF93cml0ZV91c2VyX3RyYW5zZm9ybV9mbihwbmdfcHRyLAorICAgICAgIHdyaXRlX3RyYW5zZm9ybV9mbik7CisKK1lvdSBtdXN0IHN1cHBseSB0aGUgZnVuY3Rpb24KKworICAgIHZvaWQgd3JpdGVfdHJhbnNmb3JtX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19yb3dfaW5mb3AKKyAgICAgICByb3dfaW5mbywgcG5nX2J5dGVwIGRhdGEpCisKK1NlZSBwbmd0ZXN0LmMgZm9yIGEgd29ya2luZyBleGFtcGxlLiAgWW91ciBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZAorYmVmb3JlIGFueSBvZiB0aGUgb3RoZXIgdHJhbnNmb3JtYXRpb25zIGFyZSBwcm9jZXNzZWQuICBJZiBzdXBwb3J0ZWQKK2xpYnBuZyBhbHNvIHN1cHBsaWVzIGFuIGluZm9ybWF0aW9uIHJvdXRpbmUgdGhhdCBtYXkgYmUgY2FsbGVkIGZyb20KK3lvdXIgY2FsbGJhY2s6CisKKyAgIHBuZ19nZXRfY3VycmVudF9yb3dfbnVtYmVyKHBuZ19wdHIpOworICAgcG5nX2dldF9jdXJyZW50X3Bhc3NfbnVtYmVyKHBuZ19wdHIpOworCitUaGlzIHJldHVybnMgdGhlIGN1cnJlbnQgcm93IHBhc3NlZCB0byB0aGUgdHJhbnNmb3JtLiAgV2l0aCBpbnRlcmxhY2VkCitpbWFnZXMgdGhlIHZhbHVlIHJldHVybmVkIGlzIHRoZSByb3cgaW4gdGhlIGlucHV0IHN1Yi1pbWFnZSBpbWFnZS4gIFVzZQorUE5HX1JPV19GUk9NX1BBU1NfUk9XKHJvdywgcGFzcykgYW5kIFBOR19DT0xfRlJPTV9QQVNTX0NPTChjb2wsIHBhc3MpIHRvCitmaW5kIHRoZSBvdXRwdXQgcGl4ZWwgKHgseSkgZ2l2ZW4gYW4gaW50ZXJsYWNlZCBzdWItaW1hZ2UgcGl4ZWwgKHJvdyxjb2wscGFzcykuCisKK1RoZSBkaXNjdXNzaW9uIG9mIGludGVybGFjZSBoYW5kbGluZyBhYm92ZSBjb250YWlucyBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0bwordXNlIHRoZXNlIHZhbHVlcy4KKworWW91IGNhbiBhbHNvIHNldCB1cCBhIHBvaW50ZXIgdG8gYSB1c2VyIHN0cnVjdHVyZSBmb3IgdXNlIGJ5IHlvdXIKK2NhbGxiYWNrIGZ1bmN0aW9uLgorCisgICAgcG5nX3NldF91c2VyX3RyYW5zZm9ybV9pbmZvKHBuZ19wdHIsIHVzZXJfcHRyLCAwLCAwKTsKKworVGhlIHVzZXJfY2hhbm5lbHMgYW5kIHVzZXJfZGVwdGggcGFyYW1ldGVycyBvZiB0aGlzIGZ1bmN0aW9uIGFyZSBpZ25vcmVkCit3aGVuIHdyaXRpbmc7IHlvdSBjYW4gc2V0IHRoZW0gdG8gemVybyBhcyBzaG93bi4KKworWW91IGNhbiByZXRyaWV2ZSB0aGUgcG9pbnRlciB2aWEgdGhlIGZ1bmN0aW9uIHBuZ19nZXRfdXNlcl90cmFuc2Zvcm1fcHRyKCkuCitGb3IgZXhhbXBsZToKKworICAgIHZvaWRwIHdyaXRlX3VzZXJfdHJhbnNmb3JtX3B0ciA9CisgICAgICAgcG5nX2dldF91c2VyX3RyYW5zZm9ybV9wdHIocG5nX3B0cik7CisKK0l0IGlzIHBvc3NpYmxlIHRvIGhhdmUgbGlicG5nIGZsdXNoIGFueSBwZW5kaW5nIG91dHB1dCwgZWl0aGVyIG1hbnVhbGx5LAorb3IgYXV0b21hdGljYWxseSBhZnRlciBhIGNlcnRhaW4gbnVtYmVyIG9mIGxpbmVzIGhhdmUgYmVlbiB3cml0dGVuLiAgVG8KK2ZsdXNoIHRoZSBvdXRwdXQgc3RyZWFtIGEgc2luZ2xlIHRpbWUgY2FsbDoKKworICAgIHBuZ193cml0ZV9mbHVzaChwbmdfcHRyKTsKKworYW5kIHRvIGhhdmUgbGlicG5nIGZsdXNoIHRoZSBvdXRwdXQgc3RyZWFtIHBlcmlvZGljYWxseSBhZnRlciBhIGNlcnRhaW4KK251bWJlciBvZiBzY2FubGluZXMgaGF2ZSBiZWVuIHdyaXR0ZW4sIGNhbGw6CisKKyAgICBwbmdfc2V0X2ZsdXNoKHBuZ19wdHIsIG5yb3dzKTsKKworTm90ZSB0aGF0IHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHJvd3MgaXMgZnJvbSB0aGUgbGFzdCB0aW1lIHBuZ193cml0ZV9mbHVzaCgpCit3YXMgY2FsbGVkLCBvciB0aGUgZmlyc3Qgcm93IG9mIHRoZSBpbWFnZSBpZiBpdCBoYXMgbmV2ZXIgYmVlbiBjYWxsZWQuCitTbyBpZiB5b3Ugd3JpdGUgNTAgbGluZXMsIGFuZCB0aGVuIHBuZ19zZXRfZmx1c2ggMjUsIGl0IHdpbGwgZmx1c2ggdGhlCitvdXRwdXQgb24gdGhlIG5leHQgc2NhbmxpbmUsIGFuZCBldmVyeSAyNSBsaW5lcyB0aGVyZWFmdGVyLCB1bmxlc3MKK3BuZ193cml0ZV9mbHVzaCgpIGlzIGNhbGxlZCBiZWZvcmUgMjUgbW9yZSBsaW5lcyBoYXZlIGJlZW4gd3JpdHRlbi4KK0lmIG5yb3dzIGlzIHRvbyBzbWFsbCAobGVzcyB0aGFuIGFib3V0IDEwIGxpbmVzIGZvciBhIDY0MCBwaXhlbCB3aWRlCitSR0IgaW1hZ2UpIHRoZSBpbWFnZSBjb21wcmVzc2lvbiBtYXkgZGVjcmVhc2Ugbm90aWNlYWJseSAoYWx0aG91Z2ggdGhpcworbWF5IGJlIGFjY2VwdGFibGUgZm9yIHJlYWwtdGltZSBhcHBsaWNhdGlvbnMpLiAgSW5mcmVxdWVudCBmbHVzaGluZyB3aWxsCitvbmx5IGRlZ3JhZGUgdGhlIGNvbXByZXNzaW9uIHBlcmZvcm1hbmNlIGJ5IGEgZmV3IHBlcmNlbnQgb3ZlciBpbWFnZXMKK3RoYXQgZG8gbm90IHVzZSBmbHVzaGluZy4KKworLlNTIFdyaXRpbmcgdGhlIGltYWdlIGRhdGEKKworVGhhdCdzIGl0IGZvciB0aGUgdHJhbnNmb3JtYXRpb25zLiAgTm93IHlvdSBjYW4gd3JpdGUgdGhlIGltYWdlIGRhdGEuCitUaGUgc2ltcGxlc3Qgd2F5IHRvIGRvIHRoaXMgaXMgaW4gb25lIGZ1bmN0aW9uIGNhbGwuICBJZiB5b3UgaGF2ZSB0aGUKK3dob2xlIGltYWdlIGluIG1lbW9yeSwgeW91IGNhbiBqdXN0IGNhbGwgcG5nX3dyaXRlX2ltYWdlKCkgYW5kIGxpYnBuZword2lsbCB3cml0ZSB0aGUgaW1hZ2UuICBZb3Ugd2lsbCBuZWVkIHRvIHBhc3MgaW4gYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8KK2VhY2ggcm93LiAgVGhpcyBmdW5jdGlvbiBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgaW50ZXJsYWNpbmcsIHNvIHlvdSBkb24ndAorbmVlZCB0byBjYWxsIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKCkgb3IgY2FsbCB0aGlzIGZ1bmN0aW9uIG11bHRpcGxlCit0aW1lcywgb3IgYW55IG9mIHRoYXQgb3RoZXIgc3R1ZmYgbmVjZXNzYXJ5IHdpdGggcG5nX3dyaXRlX3Jvd3MoKS4KKworICAgIHBuZ193cml0ZV9pbWFnZShwbmdfcHRyLCByb3dfcG9pbnRlcnMpOworCit3aGVyZSByb3dfcG9pbnRlcnMgaXM6CisKKyAgICBwbmdfYnl0ZSAqcm93X3BvaW50ZXJzW2hlaWdodF07CisKK1lvdSBjYW4gcG9pbnQgdG8gdm9pZCBvciBjaGFyIG9yIHdoYXRldmVyIHlvdSB1c2UgZm9yIHBpeGVscy4KKworSWYgeW91IGRvbid0IHdhbnQgdG8gd3JpdGUgdGhlIHdob2xlIGltYWdlIGF0IG9uY2UsIHlvdSBjYW4KK3VzZSBwbmdfd3JpdGVfcm93cygpIGluc3RlYWQuICBJZiB0aGUgZmlsZSBpcyBub3QgaW50ZXJsYWNlZCwKK3RoaXMgaXMgc2ltcGxlOgorCisgICAgcG5nX3dyaXRlX3Jvd3MocG5nX3B0ciwgcm93X3BvaW50ZXJzLAorICAgICAgIG51bWJlcl9vZl9yb3dzKTsKKworcm93X3BvaW50ZXJzIGlzIHRoZSBzYW1lIGFzIGluIHRoZSBwbmdfd3JpdGVfaW1hZ2UoKSBjYWxsLgorCitJZiB5b3UgYXJlIGp1c3Qgd3JpdGluZyBvbmUgcm93IGF0IGEgdGltZSwgeW91IGNhbiBkbyB0aGlzIHdpdGgKK2Egc2luZ2xlIHJvd19wb2ludGVyIGluc3RlYWQgb2YgYW4gYXJyYXkgb2Ygcm93X3BvaW50ZXJzOgorCisgICAgcG5nX2J5dGVwIHJvd19wb2ludGVyID0gcm93OworCisgICAgcG5nX3dyaXRlX3JvdyhwbmdfcHRyLCByb3dfcG9pbnRlcik7CisKK1doZW4gdGhlIGZpbGUgaXMgaW50ZXJsYWNlZCwgdGhpbmdzIGNhbiBnZXQgYSBnb29kIGRlYWwgbW9yZSBjb21wbGljYXRlZC4KK1RoZSBvbmx5IGN1cnJlbnRseSAoYXMgb2YgdGhlIFBORyBTcGVjaWZpY2F0aW9uIHZlcnNpb24gMS4yLCBkYXRlZCBKdWx5CisxOTk5KSBkZWZpbmVkIGludGVybGFjaW5nIHNjaGVtZSBmb3IgUE5HIGZpbGVzIGlzIHRoZSAiQWRhbTciIGludGVybGFjZQorc2NoZW1lLCB0aGF0IGJyZWFrcyBkb3duIGFuIGltYWdlIGludG8gc2V2ZW4gc21hbGxlciBpbWFnZXMgb2YgdmFyeWluZworc2l6ZS4gIGxpYnBuZyB3aWxsIGJ1aWxkIHRoZXNlIGltYWdlcyBmb3IgeW91LCBvciB5b3UgY2FuIGRvIHRoZW0KK3lvdXJzZWxmLiAgSWYgeW91IHdhbnQgdG8gYnVpbGQgdGhlbSB5b3Vyc2VsZiwgc2VlIHRoZSBQTkcgc3BlY2lmaWNhdGlvbgorZm9yIGRldGFpbHMgb2Ygd2hpY2ggcGl4ZWxzIHRvIHdyaXRlIHdoZW4uCisKK0lmIHlvdSBkb24ndCB3YW50IGxpYnBuZyB0byBoYW5kbGUgdGhlIGludGVybGFjaW5nIGRldGFpbHMsIGp1c3QKK3VzZSBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZygpIGFuZCBjYWxsIHBuZ193cml0ZV9yb3dzKCkgdGhlCitjb3JyZWN0IG51bWJlciBvZiB0aW1lcyB0byB3cml0ZSBhbGwgdGhlIHN1Yi1pbWFnZXMKKyhwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZygpIHJldHVybnMgdGhlIG51bWJlciBvZiBzdWItaW1hZ2VzLikKKworSWYgeW91IHdhbnQgbGlicG5nIHRvIGJ1aWxkIHRoZSBzdWItaW1hZ2VzLCBjYWxsIHRoaXMgYmVmb3JlIHlvdSBzdGFydAord3JpdGluZyBhbnkgcm93czoKKworICAgIG51bWJlcl9vZl9wYXNzZXMgPSBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyhwbmdfcHRyKTsKKworVGhpcyB3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mIHBhc3NlcyBuZWVkZWQuICBDdXJyZW50bHksIHRoaXMgaXMgc2V2ZW4sCitidXQgbWF5IGNoYW5nZSBpZiBhbm90aGVyIGludGVybGFjZSB0eXBlIGlzIGFkZGVkLgorCitUaGVuIHdyaXRlIHRoZSBjb21wbGV0ZSBpbWFnZSBudW1iZXJfb2ZfcGFzc2VzIHRpbWVzLgorCisgICAgcG5nX3dyaXRlX3Jvd3MocG5nX3B0ciwgcm93X3BvaW50ZXJzLCBudW1iZXJfb2Zfcm93cyk7CisKK1RoaW5rIGNhcmVmdWxseSBiZWZvcmUgeW91IHdyaXRlIGFuIGludGVybGFjZWQgaW1hZ2UuICBUeXBpY2FsbHkgY29kZSB0aGF0CityZWFkcyBzdWNoIGltYWdlcyByZWFkcyBhbGwgdGhlIGltYWdlIGRhdGEgaW50byBtZW1vcnksIHVuY29tcHJlc3NlZCwgYmVmb3JlCitkb2luZyBhbnkgcHJvY2Vzc2luZy4gIE9ubHkgY29kZSB0aGF0IGNhbiBkaXNwbGF5IGFuIGltYWdlIG9uIHRoZSBmbHkgY2FuCit0YWtlIGFkdmFudGFnZSBvZiB0aGUgaW50ZXJsYWNpbmcgYW5kIGV2ZW4gdGhlbiB0aGUgaW1hZ2UgaGFzIHRvIGJlIGV4YWN0bHkKK3RoZSBjb3JyZWN0IHNpemUgZm9yIHRoZSBvdXRwdXQgZGV2aWNlLCBiZWNhdXNlIHNjYWxpbmcgYW4gaW1hZ2UgcmVxdWlyZXMKK2FkamFjZW50IHBpeGVscyBhbmQgdGhlc2UgYXJlIG5vdCBhdmFpbGFibGUgdW50aWwgYWxsIHRoZSBwYXNzZXMgaGF2ZSBiZWVuCityZWFkLgorCitJZiB5b3UgZG8gd3JpdGUgYW4gaW50ZXJsYWNlZCBpbWFnZSB5b3Ugd2lsbCBoYXJkbHkgZXZlciBuZWVkIHRvIGhhbmRsZQordGhlIGludGVybGFjaW5nIHlvdXJzZWxmLiAgQ2FsbCBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZygpIGFuZCB1c2UgdGhlCithcHByb2FjaCBkZXNjcmliZWQgYWJvdmUuCisKK1RoZSBvbmx5IHRpbWUgaXQgaXMgY29uY2VpdmFibGUgdGhhdCB5b3Ugd2lsbCByZWFsbHkgbmVlZCB0byB3cml0ZSBhbgoraW50ZXJsYWNlZCBpbWFnZSBwYXNzLWJ5LXBhc3MgaXMgd2hlbiB5b3UgaGF2ZSByZWFkIG9uZSBwYXNzIGJ5IHBhc3MgYW5kCittYWRlIHNvbWUgcGl4ZWwtYnktcGl4ZWwgdHJhbnNmb3JtYXRpb24gdG8gaXQsIGFzIGRlc2NyaWJlZCBpbiB0aGUgcmVhZAorY29kZSBhYm92ZS4gIEluIHRoaXMgY2FzZSB1c2UgdGhlIFBOR19QQVNTX1JPV1MgYW5kIFBOR19QQVNTX0NPTFMgbWFjcm9zCit0byBkZXRlcm1pbmUgdGhlIHNpemUgb2YgZWFjaCBzdWItaW1hZ2UgaW4gdHVybiBhbmQgc2ltcGx5IHdyaXRlIHRoZSByb3dzCit5b3Ugb2J0YWluZWQgZnJvbSB0aGUgcmVhZCBjb2RlLgorCisuU1MgRmluaXNoaW5nIGEgc2VxdWVudGlhbCB3cml0ZQorCitBZnRlciB5b3UgYXJlIGZpbmlzaGVkIHdyaXRpbmcgdGhlIGltYWdlLCB5b3Ugc2hvdWxkIGZpbmlzaCB3cml0aW5nCit0aGUgZmlsZS4gIElmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiB3cml0aW5nIGNvbW1lbnRzIG9yIHRpbWUsIHlvdSBzaG91bGQKK3Bhc3MgYW4gYXBwcm9wcmlhdGVseSBmaWxsZWQgcG5nX2luZm8gcG9pbnRlci4gIElmIHlvdSBhcmUgbm90IGludGVyZXN0ZWQsCit5b3UgY2FuIHBhc3MgTlVMTC4KKworICAgIHBuZ193cml0ZV9lbmQocG5nX3B0ciwgaW5mb19wdHIpOworCitXaGVuIHlvdSBhcmUgZG9uZSwgeW91IGNhbiBmcmVlIGFsbCBtZW1vcnkgdXNlZCBieSBsaWJwbmcgbGlrZSB0aGlzOgorCisgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIpOworCitJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGluZGl2aWR1YWxseSBmcmVlIHRoZSBpbmZvX3B0ciBtZW1iZXJzIHRoYXQKK3BvaW50IHRvIGxpYnBuZy1hbGxvY2F0ZWQgc3RvcmFnZSB3aXRoIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246CisKKyAgICBwbmdfZnJlZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBtYXNrLCBzZXEpCisKKyAgICBtYXNrICAtIGlkZW50aWZpZXMgZGF0YSB0byBiZSBmcmVlZCwgYSBtYXNrCisgICAgICAgICAgICBjb250YWluaW5nIHRoZSBiaXR3aXNlIE9SIG9mIG9uZSBvcgorICAgICAgICAgICAgbW9yZSBvZgorICAgICAgICAgICAgICBQTkdfRlJFRV9QTFRFLCBQTkdfRlJFRV9UUk5TLAorICAgICAgICAgICAgICBQTkdfRlJFRV9ISVNULCBQTkdfRlJFRV9JQ0NQLAorICAgICAgICAgICAgICBQTkdfRlJFRV9QQ0FMLCBQTkdfRlJFRV9ST1dTLAorICAgICAgICAgICAgICBQTkdfRlJFRV9TQ0FMLCBQTkdfRlJFRV9TUExULAorICAgICAgICAgICAgICBQTkdfRlJFRV9URVhULCBQTkdfRlJFRV9VTktOLAorICAgICAgICAgICAgb3Igc2ltcGx5IFBOR19GUkVFX0FMTAorCisgICAgc2VxICAgLSBzZXF1ZW5jZSBudW1iZXIgb2YgaXRlbSB0byBiZSBmcmVlZAorICAgICAgICAgICAgKFwtMSBmb3IgYWxsIGl0ZW1zKQorCitUaGlzIGZ1bmN0aW9uIG1heSBiZSBzYWZlbHkgY2FsbGVkIHdoZW4gdGhlIHJlbGV2YW50IHN0b3JhZ2UgaGFzCithbHJlYWR5IGJlZW4gZnJlZWQsIG9yIGhhcyBub3QgeWV0IGJlZW4gYWxsb2NhdGVkLCBvciB3YXMgYWxsb2NhdGVkCitieSB0aGUgdXNlciAgYW5kIG5vdCBieSBsaWJwbmcsICBhbmQgd2lsbCBpbiB0aG9zZSBjYXNlcyBkbyBub3RoaW5nLgorVGhlICJzZXEiIHBhcmFtZXRlciBpcyBpZ25vcmVkIGlmIG9ubHkgb25lIGl0ZW0gb2YgdGhlIHNlbGVjdGVkIGRhdGEKK3R5cGUsIHN1Y2ggYXMgUExURSwgaXMgYWxsb3dlZC4gIElmICJzZXEiIGlzIG5vdCBcLTEsIGFuZCBtdWx0aXBsZSBpdGVtcworYXJlIGFsbG93ZWQgZm9yIHRoZSBkYXRhIHR5cGUgaWRlbnRpZmllZCBpbiB0aGUgbWFzaywgc3VjaCBhcyB0ZXh0IG9yCitzUExULCBvbmx5IHRoZSBuJ3RoIGl0ZW0gaW4gdGhlIHN0cnVjdHVyZSBpcyBmcmVlZCwgd2hlcmUgbiBpcyAic2VxIi4KKworSWYgeW91IGFsbG9jYXRlZCBkYXRhIHN1Y2ggYXMgYSBwYWxldHRlIHRoYXQgeW91IHBhc3NlZCBpbiB0byBsaWJwbmcKK3dpdGggcG5nX3NldF8qLCB5b3UgbXVzdCBub3QgZnJlZSBpdCB1bnRpbCBqdXN0IGJlZm9yZSB0aGUgY2FsbCB0bworcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCkuCisKK1RoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIG9ubHkgdG8gZnJlZSBkYXRhIHRoYXQgd2FzIGFsbG9jYXRlZCBpbnRlcm5hbGx5CitieSBsaWJwbmcuICBUaGlzIGNhbiBiZSBjaGFuZ2VkLCBzbyB0aGF0IGxpYnBuZyB3aWxsIG5vdCBmcmVlIHRoZSBkYXRhLAorb3Igc28gdGhhdCBpdCB3aWxsIGZyZWUgZGF0YSB0aGF0IHdhcyBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIgd2l0aCBwbmdfbWFsbG9jKCkKK29yIHBuZ19jYWxsb2MoKSBhbmQgcGFzc2VkIGluIHZpYSBhIHBuZ19zZXRfKigpIGZ1bmN0aW9uLCB3aXRoCisKKyAgICBwbmdfZGF0YV9mcmVlcihwbmdfcHRyLCBpbmZvX3B0ciwgZnJlZXIsIG1hc2spCisKKyAgICBmcmVlciAgLSBvbmUgb2YKKyAgICAgICAgICAgICAgIFBOR19ERVNUUk9ZX1dJTExfRlJFRV9EQVRBCisgICAgICAgICAgICAgICBQTkdfU0VUX1dJTExfRlJFRV9EQVRBCisgICAgICAgICAgICAgICBQTkdfVVNFUl9XSUxMX0ZSRUVfREFUQQorCisgICAgbWFzayAgIC0gd2hpY2ggZGF0YSBlbGVtZW50cyBhcmUgYWZmZWN0ZWQKKyAgICAgICAgICAgICBzYW1lIGNob2ljZXMgYXMgaW4gcG5nX2ZyZWVfZGF0YSgpCisKK0ZvciBleGFtcGxlLCB0byB0cmFuc2ZlciByZXNwb25zaWJpbGl0eSBmb3Igc29tZSBkYXRhIGZyb20gYSByZWFkIHN0cnVjdHVyZQordG8gYSB3cml0ZSBzdHJ1Y3R1cmUsIHlvdSBjb3VsZCB1c2UKKworICAgIHBuZ19kYXRhX2ZyZWVyKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLAorICAgICAgIFBOR19VU0VSX1dJTExfRlJFRV9EQVRBLAorICAgICAgIFBOR19GUkVFX1BMVEV8UE5HX0ZSRUVfdFJOU3xQTkdfRlJFRV9oSVNUKQorCisgICAgcG5nX2RhdGFfZnJlZXIod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwKKyAgICAgICBQTkdfREVTVFJPWV9XSUxMX0ZSRUVfREFUQSwKKyAgICAgICBQTkdfRlJFRV9QTFRFfFBOR19GUkVFX3RSTlN8UE5HX0ZSRUVfaElTVCkKKwordGhlcmVieSBicmllZmx5IHJlYXNzaWduaW5nIHJlc3BvbnNpYmlsaXR5IGZvciBmcmVlaW5nIHRvIHRoZSB1c2VyIGJ1dAoraW1tZWRpYXRlbHkgYWZ0ZXJ3YXJkcyByZWFzc2lnbmluZyBpdCBvbmNlIG1vcmUgdG8gdGhlIHdyaXRlX2Rlc3Ryb3kKK2Z1bmN0aW9uLiAgSGF2aW5nIGRvbmUgdGhpcywgaXQgd291bGQgdGhlbiBiZSBzYWZlIHRvIGRlc3Ryb3kgdGhlIHJlYWQKK3N0cnVjdHVyZSBhbmQgY29udGludWUgdG8gdXNlIHRoZSBQTFRFLCB0Uk5TLCBhbmQgaElTVCBkYXRhIGluIHRoZSB3cml0ZQorc3RydWN0dXJlLgorCitUaGlzIGZ1bmN0aW9uIG9ubHkgYWZmZWN0cyBkYXRhIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQuCitZb3UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiBiZWZvcmUgY2FsbGluZyBhZnRlciB0aGUgcG5nX3NldF8qKCkgZnVuY3Rpb25zCit0byBjb250cm9sIHdoZXRoZXIgdGhlIHVzZXIgb3IgcG5nX2Rlc3Ryb3lfKigpIGlzIHN1cHBvc2VkIHRvIGZyZWUgdGhlIGRhdGEuCitXaGVuIHRoZSB1c2VyIGFzc3VtZXMgcmVzcG9uc2liaWxpdHkgZm9yIGxpYnBuZy1hbGxvY2F0ZWQgZGF0YSwgdGhlCithcHBsaWNhdGlvbiBtdXN0IHVzZQorcG5nX2ZyZWUoKSB0byBmcmVlIGl0LCBhbmQgd2hlbiB0aGUgdXNlciB0cmFuc2ZlcnMgcmVzcG9uc2liaWxpdHkgdG8gbGlicG5nCitmb3IgZGF0YSB0aGF0IHRoZSB1c2VyIGhhcyBhbGxvY2F0ZWQsIHRoZSB1c2VyIG11c3QgaGF2ZSB1c2VkIHBuZ19tYWxsb2MoKQorb3IgcG5nX2NhbGxvYygpIHRvIGFsbG9jYXRlIGl0LgorCitJZiB5b3UgYWxsb2NhdGVkIHRleHRfcHRyLnRleHQsIHRleHRfcHRyLmxhbmcsIGFuZCB0ZXh0X3B0ci50cmFuc2xhdGVkX2tleXdvcmQKK3NlcGFyYXRlbHksIGRvIG5vdCB0cmFuc2ZlciByZXNwb25zaWJpbGl0eSBmb3IgZnJlZWluZyB0ZXh0X3B0ciB0byBsaWJwbmcsCitiZWNhdXNlIHdoZW4gbGlicG5nIGZpbGxzIGEgcG5nX3RleHQgc3RydWN0dXJlIGl0IGNvbWJpbmVzIHRoZXNlIG1lbWJlcnMgd2l0aAordGhlIGtleSBtZW1iZXIsIGFuZCBwbmdfZnJlZV9kYXRhKCkgd2lsbCBmcmVlIG9ubHkgdGV4dF9wdHIua2V5LiAgU2ltaWxhcmx5LAoraWYgeW91IHRyYW5zZmVyIHJlc3BvbnNpYmlsaXR5IGZvciBmcmVlJ2luZyB0ZXh0X3B0ciBmcm9tIGxpYnBuZyB0byB5b3VyCithcHBsaWNhdGlvbiwgeW91ciBhcHBsaWNhdGlvbiBtdXN0IG5vdCBzZXBhcmF0ZWx5IGZyZWUgdGhvc2UgbWVtYmVycy4KK0ZvciBhIG1vcmUgY29tcGFjdCBleGFtcGxlIG9mIHdyaXRpbmcgYSBQTkcgaW1hZ2UsIHNlZSB0aGUgZmlsZSBleGFtcGxlLmMuCisKKy5TSCBWLiBTaW1wbGlmaWVkIEFQSQorCitUaGUgc2ltcGxpZmllZCBBUEksIHdoaWNoIGJlY2FtZSBhdmFpbGFibGUgaW4gbGlicG5nLTEuNi4wLCBoaWRlcyB0aGUgZGV0YWlscworb2YgYm90aCBsaWJwbmcgYW5kIHRoZSBQTkcgZmlsZSBmb3JtYXQgaXRzZWxmLgorSXQgYWxsb3dzIFBORyBmaWxlcyB0byBiZSByZWFkIGludG8gYSB2ZXJ5IGxpbWl0ZWQgbnVtYmVyIG9mCitpbi1tZW1vcnkgYml0bWFwIGZvcm1hdHMgb3IgdG8gYmUgd3JpdHRlbiBmcm9tIHRoZSBzYW1lIGZvcm1hdHMuICBJZiB0aGVzZQorZm9ybWF0cyBkbyBub3QgYWNjb21tb2RhdGUgeW91ciBuZWVkcyB0aGVuIHlvdSBjYW4sIGFuZCBzaG91bGQsIHVzZSB0aGUgbW9yZQorc29waGlzdGljYXRlZCBBUElzIGFib3ZlIC0gdGhlc2Ugc3VwcG9ydCBhIHdpZGUgdmFyaWV0eSBvZiBpbi1tZW1vcnkgZm9ybWF0cworYW5kIGEgd2lkZSB2YXJpZXR5IG9mIHNvcGhpc3RpY2F0ZWQgdHJhbnNmb3JtYXRpb25zIHRvIHRob3NlIGZvcm1hdHMgYXMgd2VsbAorYXMgYSB3aWRlIHZhcmlldHkgb2YgQVBJcyB0byBtYW5pcHVsYXRlIGFuY2lsbGlhcnkgaW5mb3JtYXRpb24uCisKK1RvIHJlYWQgYSBQTkcgZmlsZSB1c2luZyB0aGUgc2ltcGxpZmllZCBBUEk6CisKKyAgMSkgRGVjbGFyZSBhICdwbmdfaW1hZ2UnIHN0cnVjdHVyZSAoc2VlIGJlbG93KSBvbiB0aGUgc3RhY2ssIHNldCB0aGUKKyAgICAgdmVyc2lvbiBmaWVsZCB0byBQTkdfSU1BR0VfVkVSU0lPTiBhbmQgdGhlICdvcGFxdWUnIHBvaW50ZXIgdG8gTlVMTAorICAgICAodGhpcyBpcyBSRVFVSVJFRCwgeW91ciBwcm9ncmFtIG1heSBjcmFzaCBpZiB5b3UgZG9uJ3QgZG8gaXQuKQorCisgIDIpIENhbGwgdGhlIGFwcHJvcHJpYXRlIHBuZ19pbWFnZV9iZWdpbl9yZWFkLi4uIGZ1bmN0aW9uLgorCisgIDMpIFNldCB0aGUgcG5nX2ltYWdlICdmb3JtYXQnIG1lbWJlciB0byB0aGUgcmVxdWlyZWQgc2FtcGxlIGZvcm1hdC4KKworICA0KSBBbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhlIGltYWdlIGFuZCwgaWYgcmVxdWlyZWQsIHRoZSBjb2xvci1tYXAuCisKKyAgNSkgQ2FsbCBwbmdfaW1hZ2VfZmluaXNoX3JlYWQgdG8gcmVhZCB0aGUgaW1hZ2UgYW5kLCBpZiByZXF1aXJlZCwgdGhlCisgICAgIGNvbG9yLW1hcCBpbnRvIHlvdXIgYnVmZmVycy4KKworVGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB0aGUgZm9ybWF0IG9mIHRoZSBQTkcgaW5wdXQgaXRzZWxmOyBhbGwgdmFsaWQKK2NvbG9yIHR5cGVzLCBiaXQgZGVwdGhzLCBhbmQgaW50ZXJsYWNlIG1ldGhvZHMgYXJlIGFjY2VwdGFibGUsIGFuZCB0aGUKK2lucHV0IGltYWdlIGlzIHRyYW5zZm9ybWVkIGFzIG5lY2Vzc2FyeSB0byB0aGUgcmVxdWVzdGVkIGluLW1lbW9yeSBmb3JtYXQKK2R1cmluZyB0aGUgcG5nX2ltYWdlX2ZpbmlzaF9yZWFkKCkgc3RlcC4gIFRoZSBvbmx5IGNhdmVhdCBpcyB0aGF0IGlmIHlvdQorcmVxdWVzdCBhIGNvbG9yLW1hcHBlZCBpbWFnZSBmcm9tIGEgUE5HIHRoYXQgaXMgZnVsbC1jb2xvciBvciBtYWtlcworY29tcGxleCB1c2Ugb2YgYW4gYWxwaGEgY2hhbm5lbCB0aGUgdHJhbnNmb3JtYXRpb24gaXMgZXh0cmVtZWx5IGxvc3N5IGFuZCB0aGUKK3Jlc3VsdCBtYXkgbG9vayB0ZXJyaWJsZS4KKworVG8gd3JpdGUgYSBQTkcgZmlsZSB1c2luZyB0aGUgc2ltcGxpZmllZCBBUEk6CisKKyAgMSkgRGVjbGFyZSBhICdwbmdfaW1hZ2UnIHN0cnVjdHVyZSBvbiB0aGUgc3RhY2sgYW5kIG1lbXNldCgpCisgICAgIGl0IHRvIGFsbCB6ZXJvLgorCisgIDIpIEluaXRpYWxpemUgdGhlIG1lbWJlcnMgb2YgdGhlIHN0cnVjdHVyZSB0aGF0IGRlc2NyaWJlIHRoZQorICAgICBpbWFnZSwgc2V0dGluZyB0aGUgJ2Zvcm1hdCcgbWVtYmVyIHRvIHRoZSBmb3JtYXQgb2YgdGhlCisgICAgIGltYWdlIHNhbXBsZXMuCisKKyAgMykgQ2FsbCB0aGUgYXBwcm9wcmlhdGUgcG5nX2ltYWdlX3dyaXRlLi4uIGZ1bmN0aW9uIHdpdGggYQorICAgICBwb2ludGVyIHRvIHRoZSBpbWFnZSBhbmQsIGlmIG5lY2Vzc2FyeSwgdGhlIGNvbG9yLW1hcCB0byB3cml0ZQorICAgICB0aGUgUE5HIGRhdGEuCisKK3BuZ19pbWFnZSBpcyBhIHN0cnVjdHVyZSB0aGF0IGRlc2NyaWJlcyB0aGUgaW4tbWVtb3J5IGZvcm1hdCBvZiBhbiBpbWFnZQord2hlbiBpdCBpcyBiZWluZyByZWFkIG9yIGRlZmluZXMgdGhlIGluLW1lbW9yeSBmb3JtYXQgb2YgYW4gaW1hZ2UgdGhhdCB5b3UKK25lZWQgdG8gd3JpdGUuICBUaGUgInBuZ19pbWFnZSIgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbWVtYmVyczoKKworICAgcG5nX2NvbnRyb2xwIG9wYXF1ZSAgSW5pdGlhbGl6ZSB0byBOVUxMLCBmcmVlIHdpdGggcG5nX2ltYWdlX2ZyZWUKKyAgIHBuZ191aW50XzMyICB2ZXJzaW9uIFNldCB0byBQTkdfSU1BR0VfVkVSU0lPTgorICAgcG5nX3VpbnRfMzIgIHdpZHRoICAgSW1hZ2Ugd2lkdGggaW4gcGl4ZWxzIChjb2x1bW5zKQorICAgcG5nX3VpbnRfMzIgIGhlaWdodCAgSW1hZ2UgaGVpZ2h0IGluIHBpeGVscyAocm93cykKKyAgIHBuZ191aW50XzMyICBmb3JtYXQgIEltYWdlIGZvcm1hdCBhcyBkZWZpbmVkIGJlbG93CisgICBwbmdfdWludF8zMiAgZmxhZ3MgICBBIGJpdCBtYXNrIGNvbnRhaW5pbmcgaW5mb3JtYXRpb25hbCBmbGFncworICAgcG5nX3VpbnRfMzIgIGNvbG9ybWFwX2VudHJpZXM7IE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjb2xvci1tYXAKKyAgIHBuZ191aW50XzMyICB3YXJuaW5nX29yX2Vycm9yOworICAgY2hhciAgICAgICAgIG1lc3NhZ2VbNjRdOworCitJbiB0aGUgZXZlbnQgb2YgYW4gZXJyb3Igb3Igd2FybmluZyB0aGUgIndhcm5pbmdfb3JfZXJyb3IiCitmaWVsZCB3aWxsIGJlIHNldCB0byBhIG5vbi16ZXJvIHZhbHVlIGFuZCB0aGUgJ21lc3NhZ2UnIGZpZWxkIHdpbGwgY29udGFpbgorYSAnXDAnIHRlcm1pbmF0ZWQgc3RyaW5nIHdpdGggdGhlIGxpYnBuZyBlcnJvciBvciB3YXJuaW5nIG1lc3NhZ2UuICBJZiBib3RoCit3YXJuaW5ncyBhbmQgYW4gZXJyb3Igd2VyZSBlbmNvdW50ZXJlZCwgb25seSB0aGUgZXJyb3IgaXMgcmVjb3JkZWQuICBJZiB0aGVyZQorYXJlIG11bHRpcGxlIHdhcm5pbmdzLCBvbmx5IHRoZSBmaXJzdCBvbmUgaXMgcmVjb3JkZWQuCisKK1RoZSB1cHBlciAzMCBiaXRzIG9mIHRoZSAid2FybmluZ19vcl9lcnJvciIgdmFsdWUgYXJlIHJlc2VydmVkOyB0aGUgbG93IHR3bworYml0cyBjb250YWluIGEgdHdvIGJpdCBjb2RlIHN1Y2ggdGhhdCBhIHZhbHVlIG1vcmUgdGhhbiAxIGluZGljYXRlcyBhIGZhaWx1cmUKK2luIHRoZSBBUEkganVzdCBjYWxsZWQ6CisKKyAgIDAgLSBubyB3YXJuaW5nIG9yIGVycm9yCisgICAxIC0gd2FybmluZworICAgMiAtIGVycm9yCisgICAzIC0gZXJyb3IgcHJlY2VkZWQgYnkgd2FybmluZworCitUaGUgcGl4ZWxzIChzYW1wbGVzKSBvZiB0aGUgaW1hZ2UgaGF2ZSBvbmUgdG8gZm91ciBjaGFubmVscyB3aG9zZSBjb21wb25lbnRzCitoYXZlIG9yaWdpbmFsIHZhbHVlcyBpbiB0aGUgcmFuZ2UgMCB0byAxLjA6CisKKyAgMTogQSBzaW5nbGUgZ3JheSBvciBsdW1pbmFuY2UgY2hhbm5lbCAoRykuCisgIDI6IEEgZ3JheS9sdW1pbmFuY2UgY2hhbm5lbCBhbmQgYW4gYWxwaGEgY2hhbm5lbCAoR0EpLgorICAzOiBUaHJlZSByZWQsIGdyZWVuLCBibHVlIGNvbG9yIGNoYW5uZWxzIChSR0IpLgorICA0OiBUaHJlZSBjb2xvciBjaGFubmVscyBhbmQgYW4gYWxwaGEgY2hhbm5lbCAoUkdCQSkuCisKK1RoZSBjaGFubmVscyBhcmUgZW5jb2RlZCBpbiBvbmUgb2YgdHdvIHdheXM6CisKKyAgYSkgQXMgYSBzbWFsbCBpbnRlZ2VyLCB2YWx1ZSAwLi4yNTUsIGNvbnRhaW5lZCBpbiBhIHNpbmdsZSBieXRlLiAgRm9yIHRoZQorYWxwaGEgY2hhbm5lbCB0aGUgb3JpZ2luYWwgdmFsdWUgaXMgc2ltcGx5IHZhbHVlLzI1NS4gIEZvciB0aGUgY29sb3Igb3IKK2x1bWluYW5jZSBjaGFubmVscyB0aGUgdmFsdWUgaXMgZW5jb2RlZCBhY2NvcmRpbmcgdG8gdGhlIHNSR0Igc3BlY2lmaWNhdGlvbgorYW5kIG1hdGNoZXMgdGhlIDgtYml0IGZvcm1hdCBleHBlY3RlZCBieSB0eXBpY2FsIGRpc3BsYXkgZGV2aWNlcy4KKworVGhlIGNvbG9yL2dyYXkgY2hhbm5lbHMgYXJlIG5vdCBzY2FsZWQgKHByZS1tdWx0aXBsaWVkKSBieSB0aGUgYWxwaGEKK2NoYW5uZWwgYW5kIGFyZSBzdWl0YWJsZSBmb3IgcGFzc2luZyB0byBjb2xvciBtYW5hZ2VtZW50IHNvZnR3YXJlLgorCisgIGIpIEFzIGEgdmFsdWUgaW4gdGhlIHJhbmdlIDAuLjY1NTM1LCBjb250YWluZWQgaW4gYSAyLWJ5dGUgaW50ZWdlciwgaW4KK3RoZSBuYXRpdmUgYnl0ZSBvcmRlciBvZiB0aGUgcGxhdGZvcm0gb24gd2hpY2ggdGhlIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuCitBbGwgY2hhbm5lbHMgY2FuIGJlIGNvbnZlcnRlZCB0byB0aGUgb3JpZ2luYWwgdmFsdWUgYnkgZGl2aWRpbmcgYnkgNjU1MzU7IGFsbAorY2hhbm5lbHMgYXJlIGxpbmVhci4gIENvbG9yIGNoYW5uZWxzIHVzZSB0aGUgUkdCIGVuY29kaW5nIChSR0IgZW5kLXBvaW50cykgb2YKK3RoZSBzUkdCIHNwZWNpZmljYXRpb24uICBUaGlzIGVuY29kaW5nIGlzIGlkZW50aWZpZWQgYnkgdGhlCitQTkdfRk9STUFUX0ZMQUdfTElORUFSIGZsYWcgYmVsb3cuCisKK1doZW4gdGhlIHNpbXBsaWZpZWQgQVBJIG5lZWRzIHRvIGNvbnZlcnQgYmV0d2VlbiBzUkdCIGFuZCBsaW5lYXIgY29sb3JzcGFjZXMsCit0aGUgYWN0dWFsIHNSR0IgdHJhbnNmZXIgY3VydmUgZGVmaW5lZCBpbiB0aGUgc1JHQiBzcGVjaWZpY2F0aW9uIChzZWUgdGhlCithcnRpY2xlIGF0IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU1JHQikgaXMgdXNlZCwgbm90IHRoZSBnYW1tYT0xLzIuMgorYXBwcm94aW1hdGlvbiB1c2VkIGVsc2V3aGVyZSBpbiBsaWJwbmcuCisKK1doZW4gYW4gYWxwaGEgY2hhbm5lbCBpcyBwcmVzZW50IGl0IGlzIGV4cGVjdGVkIHRvIGRlbm90ZSBwaXhlbCBjb3ZlcmFnZQorb2YgdGhlIGNvbG9yIG9yIGx1bWluYW5jZSBjaGFubmVscyBhbmQgaXMgcmV0dXJuZWQgYXMgYW4gYXNzb2NpYXRlZCBhbHBoYQorY2hhbm5lbDogdGhlIGNvbG9yL2dyYXkgY2hhbm5lbHMgYXJlIHNjYWxlZCAocHJlLW11bHRpcGxpZWQpIGJ5IHRoZSBhbHBoYQordmFsdWUuCisKK1RoZSBzYW1wbGVzIGFyZSBlaXRoZXIgY29udGFpbmVkIGRpcmVjdGx5IGluIHRoZSBpbWFnZSBkYXRhLCBiZXR3ZWVuIDEgYW5kIDgKK2J5dGVzIHBlciBwaXhlbCBhY2NvcmRpbmcgdG8gdGhlIGVuY29kaW5nLCBvciBhcmUgaGVsZCBpbiBhIGNvbG9yLW1hcCBpbmRleGVkCitieSBieXRlcyBpbiB0aGUgaW1hZ2UgZGF0YS4gIEluIHRoZSBjYXNlIG9mIGEgY29sb3ItbWFwIHRoZSBjb2xvci1tYXAgZW50cmllcworYXJlIGluZGl2aWR1YWwgc2FtcGxlcywgZW5jb2RlZCBhcyBhYm92ZSwgYW5kIHRoZSBpbWFnZSBkYXRhIGhhcyBvbmUgYnl0ZSBwZXIKK3BpeGVsIHRvIHNlbGVjdCB0aGUgcmVsZXZhbnQgc2FtcGxlIGZyb20gdGhlIGNvbG9yLW1hcC4KKworUE5HX0ZPUk1BVF8qCisKK1RoZSAjZGVmaW5lcyB0byBiZSB1c2VkIGluIHBuZ19pbWFnZTo6Zm9ybWF0LiAgRWFjaCAjZGVmaW5lIGlkZW50aWZpZXMgYQorcGFydGljdWxhciBsYXlvdXQgb2YgY2hhbm5lbCBkYXRhIGFuZCwgaWYgcHJlc2VudCwgYWxwaGEgdmFsdWVzLiAgVGhlcmUgYXJlCitzZXBhcmF0ZSBkZWZpbmVzIGZvciBlYWNoIG9mIHRoZSB0d28gY29tcG9uZW50IGVuY29kaW5ncy4KKworQSBmb3JtYXQgaXMgYnVpbHQgdXAgdXNpbmcgc2luZ2xlIGJpdCBmbGFnIHZhbHVlcy4gIEFsbCBjb21iaW5hdGlvbnMgYXJlCit2YWxpZC4gIEZvcm1hdHMgY2FuIGJlIGJ1aWx0IHVwIGZyb20gdGhlIGZsYWcgdmFsdWVzIG9yIHlvdSBjYW4gdXNlIG9uZSBvZgordGhlIHByZWRlZmluZWQgdmFsdWVzIGJlbG93LiAgV2hlbiB0ZXN0aW5nIGZvcm1hdHMgYWx3YXlzIHVzZSB0aGUgRk9STUFUX0ZMQUcKK21hY3JvcyB0byB0ZXN0IGZvciBpbmRpdmlkdWFsIGZlYXR1cmVzIC0gZnV0dXJlIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5IG1heQorYWRkIG5ldyBmbGFncy4KKworV2hlbiByZWFkaW5nIG9yIHdyaXRpbmcgY29sb3ItbWFwcGVkIGltYWdlcyB0aGUgZm9ybWF0IHNob3VsZCBiZSBzZXQgdG8gdGhlCitmb3JtYXQgb2YgdGhlIGVudHJpZXMgaW4gdGhlIGNvbG9yLW1hcCB0aGVuIHBuZ19pbWFnZV97cmVhZCx3cml0ZX1fY29sb3JtYXAKK2NhbGxlZCB0byByZWFkIG9yIHdyaXRlIHRoZSBjb2xvci1tYXAgYW5kIHNldCB0aGUgZm9ybWF0IGNvcnJlY3RseSBmb3IgdGhlCitpbWFnZSBkYXRhLiAgRG8gbm90IHNldCB0aGUgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQIGJpdCBkaXJlY3RseSEKKworTk9URTogbGlicG5nIGNhbiBiZSBidWlsdCB3aXRoIHBhcnRpY3VsYXIgZmVhdHVyZXMgZGlzYWJsZWQuIElmIHlvdSBzZWUKK2NvbXBpbGVyIGVycm9ycyBiZWNhdXNlIHRoZSBkZWZpbml0aW9uIG9mIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZsYWdzIGhhcyBiZWVuCitjb21waWxlZCBvdXQgaXQgaXMgYmVjYXVzZSBsaWJwbmcgZG9lcyBub3QgaGF2ZSB0aGUgcmVxdWlyZWQgc3VwcG9ydC4gIEl0IGlzCitwb3NzaWJsZSwgaG93ZXZlciwgZm9yIHRoZSBsaWJwbmcgY29uZmlndXJhdGlvbiB0byBlbmFibGUgdGhlIGZvcm1hdCBvbiBqdXN0CityZWFkIG9yIGp1c3Qgd3JpdGU7IGluIHRoYXQgY2FzZSB5b3UgbWF5IHNlZSBhbiBlcnJvciBhdCBydW4gdGltZS4KK1lvdSBjYW4gZ3VhcmQgYWdhaW5zdCB0aGlzIGJ5IGNoZWNraW5nIGZvciB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKK2FwcHJvcHJpYXRlICJfU1VQUE9SVEVEIiBtYWNybywgb25lIG9mOgorCisgICBQTkdfU0lNUExJRklFRF97UkVBRCxXUklURX1fe0JHUixBRklSU1R9X1NVUFBPUlRFRAorCisgICBQTkdfRk9STUFUX0ZMQUdfQUxQSEEgICAgZm9ybWF0IHdpdGggYW4gYWxwaGEgY2hhbm5lbAorICAgUE5HX0ZPUk1BVF9GTEFHX0NPTE9SICAgIGNvbG9yIGZvcm1hdDogb3RoZXJ3aXNlIGdyYXlzY2FsZQorICAgUE5HX0ZPUk1BVF9GTEFHX0xJTkVBUiAgIDItYnl0ZSBjaGFubmVscyBlbHNlIDEtYnl0ZQorICAgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQIGltYWdlIGRhdGEgaXMgY29sb3ItbWFwcGVkCisgICBQTkdfRk9STUFUX0ZMQUdfQkdSICAgICAgQkdSIGNvbG9ycywgZWxzZSBvcmRlciBpcyBSR0IKKyAgIFBOR19GT1JNQVRfRkxBR19BRklSU1QgICBhbHBoYSBjaGFubmVsIGNvbWVzIGZpcnN0CisKK1N1cHBvcnRlZCBmb3JtYXRzIGFyZSBhcyBmb2xsb3dzLiAgRnV0dXJlIHZlcnNpb25zIG9mIGxpYnBuZyBtYXkgc3VwcG9ydCBtb3JlCitmb3JtYXRzOyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHZlcnNpb25zIHNpbXBseSBjaGVjayBpZiB0aGUgZm9ybWF0CittYWNybyBpcyBkZWZpbmVkIHVzaW5nICNpZmRlZi4gIFRoZXNlIGRlZmluZXMgZGVzY3JpYmUgdGhlIGluLW1lbW9yeSBsYXlvdXQKK29mIHRoZSBjb21wb25lbnRzIG9mIHRoZSBwaXhlbHMgb2YgdGhlIGltYWdlLgorCitGaXJzdCB0aGUgc2luZ2xlIGJ5dGUgKHNSR0IpIGZvcm1hdHM6CisKKyAgIFBOR19GT1JNQVRfR1JBWQorICAgUE5HX0ZPUk1BVF9HQQorICAgUE5HX0ZPUk1BVF9BRworICAgUE5HX0ZPUk1BVF9SR0IKKyAgIFBOR19GT1JNQVRfQkdSCisgICBQTkdfRk9STUFUX1JHQkEKKyAgIFBOR19GT1JNQVRfQVJHQgorICAgUE5HX0ZPUk1BVF9CR1JBCisgICBQTkdfRk9STUFUX0FCR1IKKworVGhlbiB0aGUgbGluZWFyIDItYnl0ZSBmb3JtYXRzLiAgV2hlbiBuYW1pbmcgdGhlc2UgIlkiIGlzIHVzZWQgdG8KK2luZGljYXRlIGEgbHVtaW5hbmNlIChncmF5KSBjaGFubmVsLiAgVGhlIGNvbXBvbmVudCBvcmRlciB3aXRoaW4gdGhlIHBpeGVsCitpcyBhbHdheXMgdGhlIHNhbWUgLSB0aGVyZSBpcyBubyBwcm92aXNpb24gZm9yIHN3YXBwaW5nIHRoZSBvcmRlciBvZiB0aGUKK2NvbXBvbmVudHMgaW4gdGhlIGxpbmVhciBmb3JtYXQuICBUaGUgY29tcG9uZW50cyBhcmUgMTYtYml0IGludGVnZXJzIGluCit0aGUgbmF0aXZlIGJ5dGUgb3JkZXIgZm9yIHlvdXIgcGxhdGZvcm0sIGFuZCB0aGVyZSBpcyBubyBwcm92aXNpb24gZm9yCitzd2FwcGluZyB0aGUgYnl0ZXMgdG8gYSBkaWZmZXJlbnQgZW5kaWFuIGNvbmRpdGlvbi4KKworICAgUE5HX0ZPUk1BVF9MSU5FQVJfWQorICAgUE5HX0ZPUk1BVF9MSU5FQVJfWV9BTFBIQQorICAgUE5HX0ZPUk1BVF9MSU5FQVJfUkdCCisgICBQTkdfRk9STUFUX0xJTkVBUl9SR0JfQUxQSEEKKworV2l0aCBjb2xvci1tYXBwZWQgZm9ybWF0cyB0aGUgaW1hZ2UgZGF0YSBpcyBvbmUgYnl0ZSBmb3IgZWFjaCBwaXhlbC4gVGhlIGJ5dGUKK2lzIGFuIGluZGV4IGludG8gdGhlIGNvbG9yLW1hcCB3aGljaCBpcyBmb3JtYXR0ZWQgYXMgYWJvdmUuICBUbyBvYnRhaW4gYQorY29sb3ItbWFwcGVkIGZvcm1hdCBpdCBpcyBzdWZmaWNpZW50IGp1c3QgdG8gYWRkIHRoZSBQTkdfRk9NQVRfRkxBR19DT0xPUk1BUAordG8gb25lIG9mIHRoZSBhYm92ZSBkZWZpbml0aW9ucywgb3IgeW91IGNhbiB1c2Ugb25lIG9mIHRoZSBkZWZpbml0aW9ucyBiZWxvdy4KKworICAgUE5HX0ZPUk1BVF9SR0JfQ09MT1JNQVAKKyAgIFBOR19GT1JNQVRfQkdSX0NPTE9STUFQCisgICBQTkdfRk9STUFUX1JHQkFfQ09MT1JNQVAKKyAgIFBOR19GT1JNQVRfQVJHQl9DT0xPUk1BUAorICAgUE5HX0ZPUk1BVF9CR1JBX0NPTE9STUFQCisgICBQTkdfRk9STUFUX0FCR1JfQ09MT1JNQVAKKworUE5HX0lNQUdFIG1hY3JvcworCitUaGVzZSBhcmUgY29udmVuaWVuY2UgbWFjcm9zIHRvIGRlcml2ZSBpbmZvcm1hdGlvbiBmcm9tIGEgcG5nX2ltYWdlCitzdHJ1Y3R1cmUuICBUaGUgUE5HX0lNQUdFX1NBTVBMRV8gbWFjcm9zIHJldHVybiB2YWx1ZXMgYXBwcm9wcmlhdGUgdG8gdGhlCithY3R1YWwgaW1hZ2Ugc2FtcGxlIHZhbHVlcyAtIGVpdGhlciB0aGUgZW50cmllcyBpbiB0aGUgY29sb3ItbWFwIG9yIHRoZQorcGl4ZWxzIGluIHRoZSBpbWFnZS4gIFRoZSBQTkdfSU1BR0VfUElYRUxfIG1hY3JvcyByZXR1cm4gY29ycmVzcG9uZGluZyB2YWx1ZXMKK2ZvciB0aGUgcGl4ZWxzIGFuZCB3aWxsIGFsd2F5cyByZXR1cm4gMSBmb3IgY29sb3ItbWFwcGVkIGZvcm1hdHMuICBUaGUKK3JlbWFpbmluZyBtYWNyb3MgcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSByb3dzIGluIHRoZSBpbWFnZSBhbmQgdGhlCitjb21wbGV0ZSBpbWFnZS4KKworTk9URTogQWxsIHRoZSBtYWNyb3MgdGhhdCB0YWtlIGEgcG5nX2ltYWdlOjpmb3JtYXQgcGFyYW1ldGVyIGFyZSBjb21waWxlIHRpbWUKK2NvbnN0YW50cyBpZiB0aGUgZm9ybWF0IHBhcmFtZXRlciBpcywgaXRzZWxmLCBhIGNvbnN0YW50LiAgVGhlcmVmb3JlIHRoZXNlCittYWNyb3MgY2FuIGJlIHVzZWQgaW4gYXJyYXkgZGVjbGFyYXRpb25zIGFuZCBjYXNlIGxhYmVscyB3aGVyZSByZXF1aXJlZC4KK1NpbWlsYXJseSB0aGUgbWFjcm9zIGFyZSBhbHNvIHByZS1wcm9jZXNzb3IgY29uc3RhbnRzIChzaXplb2YgaXMgbm90IHVzZWQpIHNvCit0aGV5IGNhbiBiZSB1c2VkIGluICNpZiB0ZXN0cy4KKworICBQTkdfSU1BR0VfU0FNUExFX0NIQU5ORUxTKGZtdCkKKyAgICBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgY2hhbm5lbHMgaW4gYSBnaXZlbiBmb3JtYXQ6IDEuLjQKKworICBQTkdfSU1BR0VfU0FNUExFX0NPTVBPTkVOVF9TSVpFKGZtdCkKKyAgICBSZXR1cm5zIHRoZSBzaXplIGluIGJ5dGVzIG9mIGEgc2luZ2xlIGNvbXBvbmVudCBvZiBhIHBpeGVsIG9yIGNvbG9yLW1hcAorICAgIGVudHJ5IChhcyBhcHByb3ByaWF0ZSkgaW4gdGhlIGltYWdlOiAxIG9yIDIuCisKKyAgUE5HX0lNQUdFX1NBTVBMRV9TSVpFKGZtdCkKKyAgICBUaGlzIGlzIHRoZSBzaXplIG9mIHRoZSBzYW1wbGUgZGF0YSBmb3Igb25lIHNhbXBsZS4gIElmIHRoZSBpbWFnZSBpcworICAgIGNvbG9yLW1hcHBlZCBpdCBpcyB0aGUgc2l6ZSBvZiBvbmUgY29sb3ItbWFwIGVudHJ5IChhbmQgaW1hZ2UgcGl4ZWxzIGFyZQorICAgIG9uZSBieXRlIGluIHNpemUpLCBvdGhlcndpc2UgaXQgaXMgdGhlIHNpemUgb2Ygb25lIGltYWdlIHBpeGVsLgorCisgIFBOR19JTUFHRV9NQVhJTVVNX0NPTE9STUFQX0NPTVBPTkVOVFMoZm10KQorICAgIFRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNvbG9yLW1hcCByZXF1aXJlZCBieSB0aGUgZm9ybWF0IGV4cHJlc3NlZCBpbiBhCisgICAgY291bnQgb2YgY29tcG9uZW50cy4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gY29tcGlsZS10aW1lIGFsbG9jYXRlIGEKKyAgICBjb2xvci1tYXA6CisKKyAgICBwbmdfdWludF8xNiBjb2xvcm1hcFtQTkdfSU1BR0VfTUFYSU1VTV9DT0xPUk1BUF9DT01QT05FTlRTKGxpbmVhcl9mbXQpXTsKKworICAgIHBuZ19ieXRlIGNvbG9ybWFwW1BOR19JTUFHRV9NQVhJTVVNX0NPTE9STUFQX0NPTVBPTkVOVFMoc1JHQl9mbXQpXTsKKworICAgIEFsdGVybmF0aXZlbHkgdXNlIHRoZSBQTkdfSU1BR0VfQ09MT1JNQVBfU0laRSBtYWNybyBiZWxvdyB0byB1c2UgdGhlCisgICAgaW5mb3JtYXRpb24gZnJvbSBvbmUgb2YgdGhlIHBuZ19pbWFnZV9iZWdpbl9yZWFkXyBBUElzIGFuZCBkeW5hbWljYWxseQorICAgIGFsbG9jYXRlIHRoZSByZXF1aXJlZCBtZW1vcnkuCisKKyAgUE5HX0lNQUdFX0NPTE9STUFQX1NJWkUoZm10KQorICAgVGhlIHNpemUgb2YgdGhlIGNvbG9yLW1hcCByZXF1aXJlZCBieSB0aGUgZm9ybWF0OyB0aGlzIGlzIHRoZSBzaXplIG9mIHRoZQorICAgY29sb3ItbWFwIGJ1ZmZlciBwYXNzZWQgdG8gdGhlIHBuZ19pbWFnZV97cmVhZCx3cml0ZX1fY29sb3JtYXAgQVBJcy4gSXQgaXMKKyAgIGEgZml4ZWQgbnVtYmVyIGRldGVybWluZWQgYnkgdGhlIGZvcm1hdCBzbyBjYW4gZWFzaWx5IGJlIGFsbG9jYXRlZCBvbiB0aGUKKyAgIHN0YWNrIGlmIG5lY2Vzc2FyeS4KKworQ29ycmVzcG9uZGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGl4ZWxzCisKKyAgUE5HX0lNQUdFX1BJWEVMX0NIQU5ORUxTKGZtdCkKKyAgIFRoZSBudW1iZXIgb2Ygc2VwYXJhdGUgY2hhbm5lbHMgKGNvbXBvbmVudHMpIGluIGEgcGl4ZWw7IDEgZm9yIGEKKyAgIGNvbG9yLW1hcHBlZCBpbWFnZS4KKworICBQTkdfSU1BR0VfUElYRUxfQ09NUE9ORU5UX1NJWkUoZm10KVwKKyAgIFRoZSBzaXplLCBpbiBieXRlcywgb2YgZWFjaCBjb21wb25lbnQgaW4gYSBwaXhlbDsgMSBmb3IgYSBjb2xvci1tYXBwZWQKKyAgIGltYWdlLgorCisgIFBOR19JTUFHRV9QSVhFTF9TSVpFKGZtdCkKKyAgIFRoZSBzaXplLCBpbiBieXRlcywgb2YgYSBjb21wbGV0ZSBwaXhlbDsgMSBmb3IgYSBjb2xvci1tYXBwZWQgaW1hZ2UuCisKK0luZm9ybWF0aW9uIGFib3V0IHRoZSB3aG9sZSByb3csIG9yIHdob2xlIGltYWdlCisKKyAgUE5HX0lNQUdFX1JPV19TVFJJREUoaW1hZ2UpCisgICBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgY29tcG9uZW50cyBpbiBhIHNpbmdsZSByb3cgb2YgdGhlIGltYWdlOyB0aGlzCisgICBpcyB0aGUgbWluaW11bSAncm93IHN0cmlkZScsIHRoZSBtaW5pbXVtIGNvdW50IG9mIGNvbXBvbmVudHMgYmV0d2VlbiBlYWNoCisgICByb3cuICBGb3IgYSBjb2xvci1tYXBwZWQgaW1hZ2UgdGhpcyBpcyB0aGUgbWluaW11bSBudW1iZXIgb2YgYnl0ZXMgaW4gYQorICAgcm93LgorCisgICBJZiB5b3UgbmVlZCB0aGUgc3RyaWRlIG1lYXN1cmVkIGluIGJ5dGVzLCByb3dfc3RyaWRlX2J5dGVzIGlzCisgICBQTkdfSU1BR0VfUk9XX1NUUklERShpbWFnZSkgKiBQTkdfSU1BR0VfUElYRUxfQ09NUE9ORU5UX1NJWkUoZm10KQorICAgcGx1cyBhbnkgcGFkZGluZyBieXRlcyB0aGF0IHlvdXIgYXBwbGljYXRpb24gbWlnaHQgbmVlZCwgZm9yIGV4YW1wbGUKKyAgIHRvIHN0YXJ0IHRoZSBuZXh0IHJvdyBvbiBhIDQtYnl0ZSBib3VuZGFyeS4KKworICBQTkdfSU1BR0VfQlVGRkVSX1NJWkUoaW1hZ2UsIHJvd19zdHJpZGUpCisgICBSZXR1cm4gdGhlIHNpemUsIGluIGJ5dGVzLCBvZiBhbiBpbWFnZSBidWZmZXIgZ2l2ZW4gYSBwbmdfaW1hZ2UgYW5kIGEgcm93CisgICBzdHJpZGUgLSB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgdG8gbGVhdmUgc3BhY2UgZm9yIGluIGVhY2ggcm93LgorCisgIFBOR19JTUFHRV9TSVpFKGltYWdlKQorICAgUmV0dXJuIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIGltYWdlIGluIG1lbW9yeSBnaXZlbiBqdXN0IGEgcG5nX2ltYWdlOworICAgdGhlIHJvdyBzdHJpZGUgaXMgdGhlIG1pbmltdW0gc3RyaWRlIHJlcXVpcmVkIGZvciB0aGUgaW1hZ2UuCisKKyAgUE5HX0lNQUdFX0NPTE9STUFQX1NJWkUoaW1hZ2UpCisgICBSZXR1cm4gdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgY29sb3ItbWFwIG9mIHRoaXMgaW1hZ2UuICBJZiB0aGUgaW1hZ2UKKyAgIGZvcm1hdCBpcyBub3QgYSBjb2xvci1tYXAgZm9ybWF0IHRoaXMgd2lsbCByZXR1cm4gYSBzaXplIHN1ZmZpY2llbnQgZm9yCisgICAyNTYgZW50cmllcyBpbiB0aGUgZ2l2ZW4gZm9ybWF0OyBjaGVjayBQTkdfRk9STUFUX0ZMQUdfQ09MT1JNQVAgaWYKKyAgIHlvdSBkb24ndCB3YW50IHRvIGFsbG9jYXRlIGEgY29sb3ItbWFwIGluIHRoaXMgY2FzZS4KKworUE5HX0lNQUdFX0ZMQUdfKgorCitGbGFncyBjb250YWluaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGltYWdlIGFyZSBoZWxkIGluCit0aGUgJ2ZsYWdzJyBmaWVsZCBvZiBwbmdfaW1hZ2UuCisKKyAgUE5HX0lNQUdFX0ZMQUdfQ09MT1JTUEFDRV9OT1Rfc1JHQiA9PSAweDAxCisgICAgVGhpcyBpbmRpY2F0ZXMgdGhlIHRoZSBSR0IgdmFsdWVzIG9mIHRoZSBpbi1tZW1vcnkgYml0bWFwIGRvIG5vdAorICAgIGNvcnJlc3BvbmQgdG8gdGhlIHJlZCwgZ3JlZW4gYW5kIGJsdWUgZW5kLXBvaW50cyBkZWZpbmVkIGJ5IHNSR0IuCisKKyAgUE5HX0lNQUdFX0ZMQUdfRkFTVCA9PSAweDAyCisgICBPbiB3cml0ZSBlbXBoYXNpc2Ugc3BlZWQgb3ZlciBjb21wcmVzc2lvbjsgdGhlIHJlc3VsdGFudCBQTkcgZmlsZSB3aWxsIGJlCisgICBsYXJnZXIgYnV0IHdpbGwgYmUgcHJvZHVjZWQgc2lnbmlmaWNhbnRseSBmYXN0ZXIsIHBhcnRpY3VsYXIgZm9yIGxhcmdlCisgICBpbWFnZXMuICBEbyBub3QgdXNlIHRoaXMgb3B0aW9uIGZvciBpbWFnZXMgd2hpY2ggd2lsbCBiZSBkaXN0cmlidXRlZCwgb25seQorICAgdXNlZCBpdCB3aGVuIHByb2R1Y2luZyBpbnRlcm1lZGlhdGUgZmlsZXMgdGhhdCB3aWxsIGJlIHJlYWQgYmFjayBpbgorICAgcmVwZWF0ZWRseS4gIEZvciBhIHR5cGljYWwgMjQtYml0IGltYWdlIHRoZSBvcHRpb24gd2lsbCBkb3VibGUgdGhlIHJlYWQKKyAgIHNwZWVkIGF0IHRoZSBjb3N0IG9mIGluY3JlYXNpbmcgdGhlIGltYWdlIHNpemUgYnkgMjUlLCBob3dldmVyIGZvciBtYW55CisgICBtb3JlIGNvbXByZXNzaWJsZSBpbWFnZXMgdGhlIFBORyBmaWxlIGNhbiBiZSAxMCB0aW1lcyBsYXJnZXIgd2l0aCBvbmx5IGEKKyAgIHNsaWdodCBzcGVlZCBnYWluLgorCisgIFBOR19JTUFHRV9GTEFHXzE2QklUX3NSR0IgPT0gMHgwNAorICAgIE9uIHJlYWQgaWYgdGhlIGltYWdlIGlzIGEgMTYtYml0IHBlciBjb21wb25lbnQgaW1hZ2UgYW5kIHRoZXJlIGlzIG5vIGdBTUEKKyAgICBvciBzUkdCIGNodW5rIGFzc3VtZSB0aGF0IHRoZSBjb21wb25lbnRzIGFyZSBzUkdCIGVuY29kZWQuICBOb3RpY2UgdGhhdAorICAgIGltYWdlcyBvdXRwdXQgYnkgdGhlIHNpbXBsaWZpZWQgQVBJIGFsd2F5cyBoYXZlIGdhbW1hIGluZm9ybWF0aW9uOyBzZXR0aW5nCisgICAgdGhpcyBmbGFnIG9ubHkgYWZmZWN0cyB0aGUgaW50ZXJwcmV0YXRpb24gb2YgMTYtYml0IGltYWdlcyBmcm9tIGFuCisgICAgZXh0ZXJuYWwgc291cmNlLiAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUgYXBwbGljYXRpb24gZXhwb3NlIHRoaXMgZmxhZworICAgIHRvIHRoZSB1c2VyOyB0aGUgdXNlciBjYW4gbm9ybWFsbHkgZWFzaWx5IHJlY29nbml6ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCisgICAgbGluZWFyIGFuZCBzUkdCIGVuY29kaW5nLiAgVGhpcyBmbGFnIGhhcyBubyBlZmZlY3Qgb24gd3JpdGUgLSB0aGUgZGF0YQorICAgIHBhc3NlZCB0byB0aGUgd3JpdGUgQVBJcyBtdXN0IGhhdmUgdGhlIGNvcnJlY3QgZW5jb2RpbmcgKGFzIGRlZmluZWQKKyAgICBhYm92ZS4pCisKKyAgICBJZiB0aGUgZmxhZyBpcyBub3Qgc2V0ICh0aGUgZGVmYXVsdCkgaW5wdXQgMTYtYml0IHBlciBjb21wb25lbnQgZGF0YSBpcworICAgIGFzc3VtZWQgdG8gYmUgbGluZWFyLgorCisgICAgTk9URTogdGhlIGZsYWcgY2FuIG9ubHkgYmUgc2V0IGFmdGVyIHRoZSBwbmdfaW1hZ2VfYmVnaW5fcmVhZF8gY2FsbCwKKyAgICBiZWNhdXNlIHRoYXQgY2FsbCBpbml0aWFsaXplcyB0aGUgJ2ZsYWdzJyBmaWVsZC4KKworUkVBRCBBUElzCisKKyAgIFRoZSBwbmdfaW1hZ2UgcGFzc2VkIHRvIHRoZSByZWFkIEFQSXMgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgYnkgc2V0dGluZworICAgdGhlIHBuZ19jb250cm9scCBmaWVsZCAnb3BhcXVlJyB0byBOVUxMIChvciwgYmV0dGVyLCBtZW1zZXQgdGhlIHdob2xlIHRoaW5nLikKKworICAgaW50IHBuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fZmlsZSggcG5nX2ltYWdlcCBpbWFnZSwKKyAgICAgY29uc3QgY2hhciAqZmlsZV9uYW1lKQorCisgICAgIFRoZSBuYW1lZCBmaWxlIGlzIG9wZW5lZCBmb3IgcmVhZCBhbmQgdGhlIGltYWdlIGhlYWRlcgorICAgICBpcyBmaWxsZWQgaW4gZnJvbSB0aGUgUE5HIGhlYWRlciBpbiB0aGUgZmlsZS4KKworICAgaW50IHBuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fc3RkaW8gKHBuZ19pbWFnZXAgaW1hZ2UsCisgICAgIEZJTEUqIGZpbGUpCisKKyAgICAgIFRoZSBQTkcgaGVhZGVyIGlzIHJlYWQgZnJvbSB0aGUgc3RkaW8gRklMRSBvYmplY3QuCisKKyAgIGludCBwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX21lbW9yeShwbmdfaW1hZ2VwIGltYWdlLAorICAgICAgcG5nX2NvbnN0X3ZvaWRwIG1lbW9yeSwgcG5nX3NpemVfdCBzaXplKQorCisgICAgICBUaGUgUE5HIGhlYWRlciBpcyByZWFkIGZyb20gdGhlIGdpdmVuIG1lbW9yeSBidWZmZXIuCisKKyAgIGludCBwbmdfaW1hZ2VfZmluaXNoX3JlYWQocG5nX2ltYWdlcCBpbWFnZSwKKyAgICAgIHBuZ19jb2xvcnAgYmFja2dyb3VuZCwgdm9pZCAqYnVmZmVyLAorICAgICAgcG5nX2ludF8zMiByb3dfc3RyaWRlLCB2b2lkICpjb2xvcm1hcCkpOworCisgICAgICBGaW5pc2ggcmVhZGluZyB0aGUgaW1hZ2UgaW50byB0aGUgc3VwcGxpZWQgYnVmZmVyIGFuZAorICAgICAgY2xlYW4gdXAgdGhlIHBuZ19pbWFnZSBzdHJ1Y3R1cmUuCisKKyAgICAgIHJvd19zdHJpZGUgaXMgdGhlIHN0ZXAsIGluIHBuZ19ieXRlIG9yIHBuZ191aW50XzE2IHVuaXRzCisgICAgICBhcyBhcHByb3ByaWF0ZSwgYmV0d2VlbiBhZGphY2VudCByb3dzLiAgQSBwb3NpdGl2ZSBzdHJpZGUKKyAgICAgIGluZGljYXRlcyB0aGF0IHRoZSB0b3AtbW9zdCByb3cgaXMgZmlyc3QgaW4gdGhlIGJ1ZmZlciAtCisgICAgICB0aGUgbm9ybWFsIHRvcC1kb3duIGFycmFuZ2VtZW50LiAgQSBuZWdhdGl2ZSBzdHJpZGUKKyAgICAgIGluZGljYXRlcyB0aGF0IHRoZSBib3R0b20tbW9zdCByb3cgaXMgZmlyc3QgaW4gdGhlIGJ1ZmZlci4KKworICAgICAgYmFja2dyb3VuZCBuZWVkIG9ubHkgYmUgc3VwcGxpZWQgaWYgYW4gYWxwaGEgY2hhbm5lbCBtdXN0CisgICAgICBiZSByZW1vdmVkIGZyb20gYSBwbmdfYnl0ZSBmb3JtYXQgYW5kIHRoZSByZW1vdmFsIGlzIHRvIGJlCisgICAgICBkb25lIGJ5IGNvbXBvc2l0aW5nIG9uIGEgc29saWQgY29sb3I7IG90aGVyd2lzZSBpdCBtYXkgYmUKKyAgICAgIE5VTEwgYW5kIGFueSBjb21wb3NpdGlvbiB3aWxsIGJlIGRvbmUgZGlyZWN0bHkgb250byB0aGUKKyAgICAgIGJ1ZmZlci4gIFRoZSB2YWx1ZSBpcyBhbiBzUkdCIGNvbG9yIHRvIHVzZSBmb3IgdGhlCisgICAgICBiYWNrZ3JvdW5kLCBmb3IgZ3JheXNjYWxlIG91dHB1dCB0aGUgZ3JlZW4gY2hhbm5lbCBpcyB1c2VkLgorCisgICAgICBGb3IgbGluZWFyIG91dHB1dCByZW1vdmluZyB0aGUgYWxwaGEgY2hhbm5lbCBpcyBhbHdheXMgZG9uZQorICAgICAgYnkgY29tcG9zaXRpbmcgb24gYmxhY2suCisKKyAgIHZvaWQgcG5nX2ltYWdlX2ZyZWUocG5nX2ltYWdlcCBpbWFnZSkKKworICAgICAgRnJlZSBhbnkgZGF0YSBhbGxvY2F0ZWQgYnkgbGlicG5nIGluIGltYWdlLT5vcGFxdWUsCisgICAgICBzZXR0aW5nIHRoZSBwb2ludGVyIHRvIE5VTEwuICBNYXkgYmUgY2FsbGVkIGF0IGFueSB0aW1lCisgICAgICBhZnRlciB0aGUgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkLgorCitXaGVuIHRoZSBzaW1wbGlmaWVkIEFQSSBuZWVkcyB0byBjb252ZXJ0IGJldHdlZW4gc1JHQiBhbmQgbGluZWFyIGNvbG9yc3BhY2VzLAordGhlIGFjdHVhbCBzUkdCIHRyYW5zZmVyIGN1cnZlIGRlZmluZWQgaW4gdGhlIHNSR0Igc3BlY2lmaWNhdGlvbiAoc2VlIHRoZQorYXJ0aWNsZSBhdCBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NSR0IpIGlzIHVzZWQsIG5vdCB0aGUgZ2FtbWE9MS8yLjIKK2FwcHJveGltYXRpb24gdXNlZCBlbHNld2hlcmUgaW4gbGlicG5nLgorCitXUklURSBBUElTCisKK0ZvciB3cml0ZSB5b3UgbXVzdCBpbml0aWFsaXplIGEgcG5nX2ltYWdlIHN0cnVjdHVyZSB0byBkZXNjcmliZSB0aGUgaW1hZ2UgdG8KK2JlIHdyaXR0ZW46CisKKyAgIHZlcnNpb246IG11c3QgYmUgc2V0IHRvIFBOR19JTUFHRV9WRVJTSU9OCisgICBvcGFxdWU6IG11c3QgYmUgaW5pdGlhbGl6ZWQgdG8gTlVMTAorICAgd2lkdGg6IGltYWdlIHdpZHRoIGluIHBpeGVscworICAgaGVpZ2h0OiBpbWFnZSBoZWlnaHQgaW4gcm93cworICAgZm9ybWF0OiB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhIHlvdSB3aXNoIHRvIHdyaXRlCisgICBmbGFnczogc2V0IHRvIDAgdW5sZXNzIG9uZSBvZiB0aGUgZGVmaW5lZCBmbGFncyBhcHBsaWVzOyBzZXQKKyAgICAgIFBOR19JTUFHRV9GTEFHX0NPTE9SU1BBQ0VfTk9UX3NSR0IgZm9yIGNvbG9yIGZvcm1hdCBpbWFnZXMKKyAgICAgIHdoZXJlIHRoZSBSR0IgdmFsdWVzIGRvIG5vdCBjb3JyZXNwb25kIHRvIHRoZSBjb2xvcnMgaW4gc1JHQi4KKyAgIGNvbG9ybWFwX2VudHJpZXM6IHNldCB0byB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNvbG9yLW1hcCAoMCB0byAyNTYpCisKKyAgIGludCBwbmdfaW1hZ2Vfd3JpdGVfdG9fZmlsZSwgKHBuZ19pbWFnZXAgaW1hZ2UsCisgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgY29udmVydF90b184Yml0LCBjb25zdCB2b2lkICpidWZmZXIsCisgICAgICBwbmdfaW50XzMyIHJvd19zdHJpZGUsIGNvbnN0IHZvaWQgKmNvbG9ybWFwKSk7CisKKyAgICAgIFdyaXRlIHRoZSBpbWFnZSB0byB0aGUgbmFtZWQgZmlsZS4KKworICAgaW50IHBuZ19pbWFnZV93cml0ZV90b19zdGRpbyhwbmdfaW1hZ2VwIGltYWdlLCBGSUxFICpmaWxlLAorICAgICAgaW50IGNvbnZlcnRfdG9fOF9iaXQsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKKyAgICAgIHBuZ19pbnRfMzIgcm93X3N0cmlkZSwgY29uc3Qgdm9pZCAqY29sb3JtYXApCisKKyAgICAgIFdyaXRlIHRoZSBpbWFnZSB0byB0aGUgZ2l2ZW4gKEZJTEUqKS4KKworV2l0aCBhbGwgd3JpdGUgQVBJcyBpZiBpbWFnZSBpcyBpbiBvbmUgb2YgdGhlIGxpbmVhciBmb3JtYXRzIHdpdGgKKyhwbmdfdWludF8xNikgZGF0YSB0aGVuIHNldHRpbmcgY29udmVydF90b184X2JpdCB3aWxsIGNhdXNlIHRoZSBvdXRwdXQgdG8gYmUKK2EgKHBuZ19ieXRlKSBQTkcgZ2FtbWEgZW5jb2RlZCBhY2NvcmRpbmcgdG8gdGhlIHNSR0Igc3BlY2lmaWNhdGlvbiwgb3RoZXJ3aXNlCithIDE2LWJpdCBsaW5lYXIgZW5jb2RlZCBQTkcgZmlsZSBpcyB3cml0dGVuLgorCitXaXRoIGFsbCBBUElzIHJvd19zdHJpZGUgaXMgaGFuZGxlZCBhcyBpbiB0aGUgcmVhZCBBUElzIC0gaXQgaXMgdGhlIHNwYWNpbmcKK2Zyb20gb25lIHJvdyB0byB0aGUgbmV4dCBpbiBjb21wb25lbnQgc2l6ZWQgdW5pdHMgKGZsb2F0KSBhbmQgaWYgbmVnYXRpdmUKK2luZGljYXRlcyBhIGJvdHRvbS11cCByb3cgbGF5b3V0IGluIHRoZSBidWZmZXIuICBJZiB5b3UgcGFzcyB6ZXJvLCBsaWJwbmcgd2lsbAorY2FsY3VsYXRlIHRoZSByb3dfc3RyaWRlIGZvciB5b3UgZnJvbSB0aGUgd2lkdGggYW5kIG51bWJlciBvZiBjaGFubmVscy4KKworTm90ZSB0aGF0IHRoZSB3cml0ZSBBUEkgZG9lcyBub3Qgc3VwcG9ydCBpbnRlcmxhY2luZywgc3ViLTgtYml0IHBpeGVscywKK2luZGV4ZWQgKHBhbGV0dGVkKSBpbWFnZXMsIG9yIG1vc3QgYW5jaWxsYXJ5IGNodW5rcy4KKworLlNIIFZJLiBNb2RpZnlpbmcvQ3VzdG9taXppbmcgbGlicG5nCisKK1RoZXJlIGFyZSB0d28gaXNzdWVzIGhlcmUuICBUaGUgZmlyc3QgaXMgY2hhbmdpbmcgaG93IGxpYnBuZyBkb2VzCitzdGFuZGFyZCB0aGluZ3MgbGlrZSBtZW1vcnkgYWxsb2NhdGlvbiwgaW5wdXQvb3V0cHV0LCBhbmQgZXJyb3IgaGFuZGxpbmcuCitUaGUgc2Vjb25kIGRlYWxzIHdpdGggbW9yZSBjb21wbGljYXRlZCB0aGluZ3MgbGlrZSBhZGRpbmcgbmV3IGNodW5rcywKK2FkZGluZyBuZXcgdHJhbnNmb3JtYXRpb25zLCBhbmQgZ2VuZXJhbGx5IGNoYW5naW5nIGhvdyBsaWJwbmcgd29ya3MuCitCb3RoIG9mIHRob3NlIGFyZSBjb21waWxlLXRpbWUgaXNzdWVzOyB0aGF0IGlzLCB0aGV5IGFyZSBnZW5lcmFsbHkKK2RldGVybWluZWQgYXQgdGhlIHRpbWUgdGhlIGNvZGUgaXMgd3JpdHRlbiwgYW5kIHRoZXJlIGlzIHJhcmVseSBhIG5lZWQKK3RvIHByb3ZpZGUgdGhlIHVzZXIgd2l0aCBhIG1lYW5zIG9mIGNoYW5naW5nIHRoZW0uCisKK01lbW9yeSBhbGxvY2F0aW9uLCBpbnB1dC9vdXRwdXQsIGFuZCBlcnJvciBoYW5kbGluZworCitBbGwgb2YgdGhlIG1lbW9yeSBhbGxvY2F0aW9uLCBpbnB1dC9vdXRwdXQsIGFuZCBlcnJvciBoYW5kbGluZyBpbiBsaWJwbmcKK2dvZXMgdGhyb3VnaCBjYWxsYmFja3MgdGhhdCBhcmUgdXNlci1zZXR0YWJsZS4gIFRoZSBkZWZhdWx0IHJvdXRpbmVzIGFyZQoraW4gcG5nbWVtLmMsIHBuZ3Jpby5jLCBwbmd3aW8uYywgYW5kIHBuZ2Vycm9yLmMsIHJlc3BlY3RpdmVseS4gIFRvIGNoYW5nZQordGhlc2UgZnVuY3Rpb25zLCBjYWxsIHRoZSBhcHByb3ByaWF0ZSBwbmdfc2V0XypfZm4oKSBmdW5jdGlvbi4KKworTWVtb3J5IGFsbG9jYXRpb24gaXMgZG9uZSB0aHJvdWdoIHRoZSBmdW5jdGlvbnMgcG5nX21hbGxvYygpLCBwbmdfY2FsbG9jKCksCithbmQgcG5nX2ZyZWUoKS4gIFRoZSBwbmdfbWFsbG9jKCkgYW5kIHBuZ19mcmVlKCkgZnVuY3Rpb25zIGN1cnJlbnRseSBqdXN0CitjYWxsIHRoZSBzdGFuZGFyZCBDIGZ1bmN0aW9ucyBhbmQgcG5nX2NhbGxvYygpIGNhbGxzIHBuZ19tYWxsb2MoKSBhbmQgdGhlbgorY2xlYXJzIHRoZSBuZXdseSBhbGxvY2F0ZWQgbWVtb3J5IHRvIHplcm87IG5vdGUgdGhhdCBwbmdfY2FsbG9jKHBuZ19wdHIsIHNpemUpCitpcyBub3QgdGhlIHNhbWUgYXMgdGhlIGNhbGxvYyhudW1iZXIsIHNpemUpIGZ1bmN0aW9uIHByb3ZpZGVkIGJ5IHN0ZGxpYi5oLgorVGhlcmUgaXMgbGltaXRlZCBzdXBwb3J0IGZvciBjZXJ0YWluIHN5c3RlbXMgd2l0aCBzZWdtZW50ZWQgbWVtb3J5CithcmNoaXRlY3R1cmVzIGFuZCB0aGUgdHlwZXMgb2YgcG9pbnRlcnMgZGVjbGFyZWQgYnkgcG5nLmggbWF0Y2ggdGhpczsgeW91Cit3aWxsIGhhdmUgdG8gdXNlIGFwcHJvcHJpYXRlIHBvaW50ZXJzIGluIHlvdXIgYXBwbGljYXRpb24uICBJZiB5b3UgcHJlZmVyCit0byB1c2UgYSBkaWZmZXJlbnQgbWV0aG9kIG9mIGFsbG9jYXRpbmcgYW5kIGZyZWVpbmcgZGF0YSwgeW91IGNhbiB1c2UKK3BuZ19jcmVhdGVfcmVhZF9zdHJ1Y3RfMigpIG9yIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0XzIoKSB0byByZWdpc3RlciB5b3VyCitvd24gZnVuY3Rpb25zIGFzIGRlc2NyaWJlZCBhYm92ZS4gIFRoZXNlIGZ1bmN0aW9ucyBhbHNvIHByb3ZpZGUgYSB2b2lkCitwb2ludGVyIHRoYXQgY2FuIGJlIHJldHJpZXZlZCB2aWEKKworICAgIG1lbV9wdHI9cG5nX2dldF9tZW1fcHRyKHBuZ19wdHIpOworCitZb3VyIHJlcGxhY2VtZW50IG1lbW9yeSBmdW5jdGlvbnMgbXVzdCBoYXZlIHByb3RvdHlwZXMgYXMgZm9sbG93czoKKworICAgIHBuZ192b2lkcCBtYWxsb2NfZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgICAgICBwbmdfYWxsb2Nfc2l6ZV90IHNpemUpOworCisgICAgdm9pZCBmcmVlX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ192b2lkcCBwdHIpOworCitZb3VyIG1hbGxvY19mbigpIG11c3QgcmV0dXJuIE5VTEwgaW4gY2FzZSBvZiBmYWlsdXJlLiAgVGhlIHBuZ19tYWxsb2MoKQorZnVuY3Rpb24gd2lsbCBub3JtYWxseSBjYWxsIHBuZ19lcnJvcigpIGlmIGl0IHJlY2VpdmVzIGEgTlVMTCBmcm9tIHRoZQorc3lzdGVtIG1lbW9yeSBhbGxvY2F0b3Igb3IgZnJvbSB5b3VyIHJlcGxhY2VtZW50IG1hbGxvY19mbigpLgorCitZb3VyIGZyZWVfZm4oKSB3aWxsIG5ldmVyIGJlIGNhbGxlZCB3aXRoIGEgTlVMTCBwdHIsIHNpbmNlIGxpYnBuZydzCitwbmdfZnJlZSgpIGNoZWNrcyBmb3IgTlVMTCBiZWZvcmUgY2FsbGluZyBmcmVlX2ZuKCkuCisKK0lucHV0L091dHB1dCBpbiBsaWJwbmcgaXMgZG9uZSB0aHJvdWdoIHBuZ19yZWFkKCkgYW5kIHBuZ193cml0ZSgpLAord2hpY2ggY3VycmVudGx5IGp1c3QgY2FsbCBmcmVhZCgpIGFuZCBmd3JpdGUoKS4gIFRoZSBGSUxFICogaXMgc3RvcmVkIGluCitwbmdfc3RydWN0IGFuZCBpcyBpbml0aWFsaXplZCB2aWEgcG5nX2luaXRfaW8oKS4gIElmIHlvdSB3aXNoIHRvIGNoYW5nZQordGhlIG1ldGhvZCBvZiBJL08sIHRoZSBsaWJyYXJ5IHN1cHBsaWVzIGNhbGxiYWNrcyB0aGF0IHlvdSBjYW4gc2V0Cit0aHJvdWdoIHRoZSBmdW5jdGlvbiBwbmdfc2V0X3JlYWRfZm4oKSBhbmQgcG5nX3NldF93cml0ZV9mbigpIGF0IHJ1bgordGltZSwgaW5zdGVhZCBvZiBjYWxsaW5nIHRoZSBwbmdfaW5pdF9pbygpIGZ1bmN0aW9uLiAgVGhlc2UgZnVuY3Rpb25zCithbHNvIHByb3ZpZGUgYSB2b2lkIHBvaW50ZXIgdGhhdCBjYW4gYmUgcmV0cmlldmVkIHZpYSB0aGUgZnVuY3Rpb24KK3BuZ19nZXRfaW9fcHRyKCkuICBGb3IgZXhhbXBsZToKKworICAgIHBuZ19zZXRfcmVhZF9mbihwbmdfc3RydWN0cCByZWFkX3B0ciwKKyAgICAgICAgdm9pZHAgcmVhZF9pb19wdHIsIHBuZ19yd19wdHIgcmVhZF9kYXRhX2ZuKQorCisgICAgcG5nX3NldF93cml0ZV9mbihwbmdfc3RydWN0cCB3cml0ZV9wdHIsCisgICAgICAgIHZvaWRwIHdyaXRlX2lvX3B0ciwgcG5nX3J3X3B0ciB3cml0ZV9kYXRhX2ZuLAorICAgICAgICBwbmdfZmx1c2hfcHRyIG91dHB1dF9mbHVzaF9mbik7CisKKyAgICB2b2lkcCByZWFkX2lvX3B0ciA9IHBuZ19nZXRfaW9fcHRyKHJlYWRfcHRyKTsKKyAgICB2b2lkcCB3cml0ZV9pb19wdHIgPSBwbmdfZ2V0X2lvX3B0cih3cml0ZV9wdHIpOworCitUaGUgcmVwbGFjZW1lbnQgSS9PIGZ1bmN0aW9ucyBtdXN0IGhhdmUgcHJvdG90eXBlcyBhcyBmb2xsb3dzOgorCisgICAgdm9pZCB1c2VyX3JlYWRfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgICAgICBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpOworCisgICAgdm9pZCB1c2VyX3dyaXRlX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgICAgICAgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKTsKKworICAgIHZvaWQgdXNlcl9mbHVzaF9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpOworCitUaGUgdXNlcl9yZWFkX2RhdGEoKSBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZGV0ZWN0aW5nIGFuZAoraGFuZGxpbmcgZW5kLW9mLWRhdGEgZXJyb3JzLgorCitTdXBwbHlpbmcgTlVMTCBmb3IgdGhlIHJlYWQsIHdyaXRlLCBvciBmbHVzaCBmdW5jdGlvbnMgc2V0cyB0aGVtIGJhY2sKK3RvIHVzaW5nIHRoZSBkZWZhdWx0IEMgc3RyZWFtIGZ1bmN0aW9ucywgd2hpY2ggZXhwZWN0IHRoZSBpb19wdHIgdG8KK3BvaW50IHRvIGEgc3RhbmRhcmQgKkZJTEUgc3RydWN0dXJlLiAgSXQgaXMgcHJvYmFibHkgYSBtaXN0YWtlCit0byB1c2UgTlVMTCBmb3Igb25lIG9mIHdyaXRlX2RhdGFfZm4gYW5kIG91dHB1dF9mbHVzaF9mbiBidXQgbm90IGJvdGgKK29mIHRoZW0sIHVubGVzcyB5b3UgaGF2ZSBidWlsdCBsaWJwbmcgd2l0aCBQTkdfTk9fV1JJVEVfRkxVU0ggZGVmaW5lZC4KK0l0IGlzIGFuIGVycm9yIHRvIHJlYWQgZnJvbSBhIHdyaXRlIHN0cmVhbSwgYW5kIHZpY2UgdmVyc2EuCisKK0Vycm9yIGhhbmRsaW5nIGluIGxpYnBuZyBpcyBkb25lIHRocm91Z2ggcG5nX2Vycm9yKCkgYW5kIHBuZ193YXJuaW5nKCkuCitFcnJvcnMgaGFuZGxlZCB0aHJvdWdoIHBuZ19lcnJvcigpIGFyZSBmYXRhbCwgbWVhbmluZyB0aGF0IHBuZ19lcnJvcigpCitzaG91bGQgbmV2ZXIgcmV0dXJuIHRvIGl0cyBjYWxsZXIuICBDdXJyZW50bHksIHRoaXMgaXMgaGFuZGxlZCB2aWEKK3NldGptcCgpIGFuZCBsb25nam1wKCkgKHVubGVzcyB5b3UgaGF2ZSBjb21waWxlZCBsaWJwbmcgd2l0aAorUE5HX05PX1NFVEpNUCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBoYW5kbGVkIHZpYSBQTkdfQUJPUlQoKSksCitidXQgeW91IGNvdWxkIGNoYW5nZSB0aGlzIHRvIGRvIHRoaW5ncyBsaWtlIGV4aXQoKSBpZiB5b3Ugc2hvdWxkIHdpc2gsCithcyBsb25nIGFzIHlvdXIgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuLgorCitPbiBub24tZmF0YWwgZXJyb3JzLCBwbmdfd2FybmluZygpIGlzIGNhbGxlZAordG8gcHJpbnQgYSB3YXJuaW5nIG1lc3NhZ2UsIGFuZCB0aGVuIGNvbnRyb2wgcmV0dXJucyB0byB0aGUgY2FsbGluZyBjb2RlLgorQnkgZGVmYXVsdCBwbmdfZXJyb3IoKSBhbmQgcG5nX3dhcm5pbmcoKSBwcmludCBhIG1lc3NhZ2Ugb24gc3RkZXJyIHZpYQorZnByaW50ZigpIHVubGVzcyB0aGUgbGlicmFyeSBpcyBjb21waWxlZCB3aXRoIFBOR19OT19DT05TT0xFX0lPIGRlZmluZWQKKyhiZWNhdXNlIHlvdSBkb24ndCB3YW50IHRoZSBtZXNzYWdlcykgb3IgUE5HX05PX1NURElPIGRlZmluZWQgKGJlY2F1c2UKK2ZwcmludGYoKSBpc24ndCBhdmFpbGFibGUpLiAgSWYgeW91IHdpc2ggdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZiB0aGUgZXJyb3IKK2Z1bmN0aW9ucywgeW91IHdpbGwgbmVlZCB0byBzZXQgdXAgeW91ciBvd24gbWVzc2FnZSBjYWxsYmFja3MuICBUaGVzZQorZnVuY3Rpb25zIGFyZSBub3JtYWxseSBzdXBwbGllZCBhdCB0aGUgdGltZSB0aGF0IHRoZSBwbmdfc3RydWN0IGlzIGNyZWF0ZWQuCitJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHJlZGlyZWN0IGVycm9ycyBhbmQgd2FybmluZ3MgdG8geW91ciBvd24gcmVwbGFjZW1lbnQKK2Z1bmN0aW9ucyBhZnRlciBwbmdfY3JlYXRlXypfc3RydWN0KCkgaGFzIGJlZW4gY2FsbGVkIGJ5IGNhbGxpbmc6CisKKyAgICBwbmdfc2V0X2Vycm9yX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICAgICAgIHBuZ192b2lkcCBlcnJvcl9wdHIsIHBuZ19lcnJvcl9wdHIgZXJyb3JfZm4sCisgICAgICAgIHBuZ19lcnJvcl9wdHIgd2FybmluZ19mbik7CisKKyAgICBwbmdfdm9pZHAgZXJyb3JfcHRyID0gcG5nX2dldF9lcnJvcl9wdHIocG5nX3B0cik7CisKK0lmIE5VTEwgaXMgc3VwcGxpZWQgZm9yIGVpdGhlciBlcnJvcl9mbiBvciB3YXJuaW5nX2ZuLCB0aGVuIHRoZSBsaWJwbmcKK2RlZmF1bHQgZnVuY3Rpb24gd2lsbCBiZSB1c2VkLCBjYWxsaW5nIGZwcmludGYoKSBhbmQvb3IgbG9uZ2ptcCgpIGlmIGEKK3Byb2JsZW0gaXMgZW5jb3VudGVyZWQuICBUaGUgcmVwbGFjZW1lbnQgZXJyb3IgZnVuY3Rpb25zIHNob3VsZCBoYXZlCitwYXJhbWV0ZXJzIGFzIGZvbGxvd3M6CisKKyAgICB2b2lkIHVzZXJfZXJyb3JfZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgICAgICAgcG5nX2NvbnN0X2NoYXJwIGVycm9yX21zZyk7CisKKyAgICB2b2lkIHVzZXJfd2FybmluZ19mbihwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgICAgICBwbmdfY29uc3RfY2hhcnAgd2FybmluZ19tc2cpOworCitUaGUgbW90aXZhdGlvbiBiZWhpbmQgdXNpbmcgc2V0am1wKCkgYW5kIGxvbmdqbXAoKSBpcyB0aGUgQysrIHRocm93IGFuZAorY2F0Y2ggZXhjZXB0aW9uIGhhbmRsaW5nIG1ldGhvZHMuICBUaGlzIG1ha2VzIHRoZSBjb2RlIG11Y2ggZWFzaWVyIHRvIHdyaXRlLAorYXMgdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBldmVyeSByZXR1cm4gY29kZSBvZiBldmVyeSBmdW5jdGlvbiBjYWxsLgorSG93ZXZlciwgdGhlcmUgYXJlIHNvbWUgdW5jZXJ0YWludGllcyBhYm91dCB0aGUgc3RhdHVzIG9mIGxvY2FsIHZhcmlhYmxlcworYWZ0ZXIgYSBsb25nam1wLCBzbyB0aGUgdXNlciBtYXkgd2FudCB0byBiZSBjYXJlZnVsIGFib3V0IGRvaW5nIGFueXRoaW5nCithZnRlciBzZXRqbXAgcmV0dXJucyBub24temVybyBiZXNpZGVzIHJldHVybmluZyBpdHNlbGYuICBDb25zdWx0IHlvdXIKK2NvbXBpbGVyIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscy4gIEZvciBhbiBhbHRlcm5hdGl2ZSBhcHByb2FjaCwgeW91CittYXkgd2lzaCB0byB1c2UgdGhlICJjZXhjZXB0IiBmYWNpbGl0eSAoc2VlIGh0dHA6Ly9jZXhjZXB0LnNvdXJjZWZvcmdlLm5ldCksCit3aGljaCBpcyBpbGx1c3RyYXRlZCBpbiBwbmd2YWxpZC5jIGFuZCBpbiBjb250cmliL3Zpc3VwbmcuCisKK0JlZ2lubmluZyBpbiBsaWJwbmctMS40LjAsIHRoZSBwbmdfc2V0X2Jlbmlnbl9lcnJvcnMoKSBBUEkgYmVjYW1lIGF2YWlsYWJsZS4KK1lvdSBjYW4gdXNlIHRoaXMgdG8gaGFuZGxlIGNlcnRhaW4gZXJyb3JzIChub3JtYWxseSBoYW5kbGVkIGFzIGVycm9ycykKK2FzIHdhcm5pbmdzLgorCisgICAgcG5nX3NldF9iZW5pZ25fZXJyb3JzIChwbmdfcHRyLCBpbnQgYWxsb3dlZCk7CisKKyAgICBhbGxvd2VkOiAwOiB0cmVhdCBwbmdfYmVuaWduX2Vycm9yKCkgYXMgYW4gZXJyb3IuCisgICAgICAgICAgICAgMTogdHJlYXQgcG5nX2Jlbmlnbl9lcnJvcigpIGFzIGEgd2FybmluZy4KKworQXMgb2YgbGlicG5nLTEuNi4wLCB0aGUgZGVmYXVsdCBjb25kaXRpb24gaXMgdG8gdHJlYXQgYmVuaWduIGVycm9ycyBhcword2FybmluZ3Mgd2hpbGUgcmVhZGluZyBhbmQgYXMgZXJyb3JzIHdoaWxlIHdyaXRpbmcuCisKKy5TUyBDdXN0b20gY2h1bmtzCisKK0lmIHlvdSBuZWVkIHRvIHJlYWQgb3Igd3JpdGUgY3VzdG9tIGNodW5rcywgeW91IG1heSBuZWVkIHRvIGdldCBkZWVwZXIKK2ludG8gdGhlIGxpYnBuZyBjb2RlLiAgVGhlIGxpYnJhcnkgbm93IGhhcyBtZWNoYW5pc21zIGZvciBzdG9yaW5nCithbmQgd3JpdGluZyBjaHVua3Mgb2YgdW5rbm93biB0eXBlOyB5b3UgY2FuIGV2ZW4gZGVjbGFyZSBjYWxsYmFja3MKK2ZvciBjdXN0b20gY2h1bmtzLiAgSG93ZXZlciwgdGhpcyBtYXkgbm90IGJlIGdvb2QgZW5vdWdoIGlmIHRoZQorbGlicmFyeSBjb2RlIGl0c2VsZiBuZWVkcyB0byBrbm93IGFib3V0IGludGVyYWN0aW9ucyBiZXR3ZWVuIHlvdXIKK2NodW5rIGFuZCBleGlzdGluZyBgaW50cmluc2ljJyBjaHVua3MuCisKK0lmIHlvdSBuZWVkIHRvIHdyaXRlIGEgbmV3IGludHJpbnNpYyBjaHVuaywgZmlyc3QgcmVhZCB0aGUgUE5HCitzcGVjaWZpY2F0aW9uLiBBY3F1aXJlIGEgZmlyc3QgbGV2ZWwgb2YgdW5kZXJzdGFuZGluZyBvZiBob3cgaXQgd29ya3MuCitQYXkgcGFydGljdWxhciBhdHRlbnRpb24gdG8gdGhlIHNlY3Rpb25zIHRoYXQgZGVzY3JpYmUgY2h1bmsgbmFtZXMsCithbmQgbG9vayBhdCBob3cgb3RoZXIgY2h1bmtzIHdlcmUgZGVzaWduZWQsIHNvIHlvdSBjYW4gZG8gdGhpbmdzCitzaW1pbGFybHkuICBTZWNvbmQsIGNoZWNrIG91dCB0aGUgc2VjdGlvbnMgb2YgbGlicG5nIHRoYXQgcmVhZCBhbmQKK3dyaXRlIGNodW5rcy4gIFRyeSB0byBmaW5kIGEgY2h1bmsgdGhhdCBpcyBzaW1pbGFyIHRvIHlvdXJzIGFuZCB1c2UKK2l0IGFzIGEgdGVtcGxhdGUuICBNb3JlIGRldGFpbHMgY2FuIGJlIGZvdW5kIGluIHRoZSBjb21tZW50cyBpbnNpZGUKK3RoZSBjb2RlLiAgSXQgaXMgYmVzdCB0byBoYW5kbGUgcHJpdmF0ZSBvciB1bmtub3duIGNodW5rcyBpbiBhIGdlbmVyaWMgbWV0aG9kLAordmlhIGNhbGxiYWNrIGZ1bmN0aW9ucywgaW5zdGVhZCBvZiBieSBtb2RpZnlpbmcgbGlicG5nIGZ1bmN0aW9ucy4gVGhpcworaXMgaWxsdXN0cmF0ZWQgaW4gcG5ndGVzdC5jLCB3aGljaCB1c2VzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIGEKK3ByaXZhdGUgInZwQWciIGNodW5rIGFuZCB0aGUgbmV3ICJzVEVSIiBjaHVuaywgd2hpY2ggYXJlIGJvdGggdW5rbm93biB0bworbGlicG5nLgorCitJZiB5b3Ugd2lzaCB0byB3cml0ZSB5b3VyIG93biB0cmFuc2Zvcm1hdGlvbiBmb3IgdGhlIGRhdGEsIGxvb2sgdGhyb3VnaAordGhlIHBhcnQgb2YgdGhlIGNvZGUgdGhhdCBkb2VzIHRoZSB0cmFuc2Zvcm1hdGlvbnMsIGFuZCBjaGVjayBvdXQgc29tZSBvZgordGhlIHNpbXBsZXIgb25lcyB0byBnZXQgYW4gaWRlYSBvZiBob3cgdGhleSB3b3JrLiAgVHJ5IHRvIGZpbmQgYSBzaW1pbGFyCit0cmFuc2Zvcm1hdGlvbiB0byB0aGUgb25lIHlvdSB3YW50IHRvIGFkZCBhbmQgY29weSBvZmYgb2YgaXQuICBNb3JlIGRldGFpbHMKK2NhbiBiZSBmb3VuZCBpbiB0aGUgY29tbWVudHMgaW5zaWRlIHRoZSBjb2RlIGl0c2VsZi4KKworLlNTIENvbmZpZ3VyaW5nIGZvciBndWkvd2luZG93aW5nIHBsYXRmb3JtczoKKworWW91IHdpbGwgbmVlZCB0byB3cml0ZSBuZXcgZXJyb3IgYW5kIHdhcm5pbmcgZnVuY3Rpb25zIHRoYXQgdXNlIHRoZSBHVUkKK2ludGVyZmFjZSwgYXMgZGVzY3JpYmVkIHByZXZpb3VzbHksIGFuZCBzZXQgdGhlbSB0byBiZSB0aGUgZXJyb3IgYW5kCit3YXJuaW5nIGZ1bmN0aW9ucyBhdCB0aGUgdGltZSB0aGF0IHBuZ19jcmVhdGVfKl9zdHJ1Y3QoKSBpcyBjYWxsZWQsCitpbiBvcmRlciB0byBoYXZlIHRoZW0gYXZhaWxhYmxlIGR1cmluZyB0aGUgc3RydWN0dXJlIGluaXRpYWxpemF0aW9uLgorVGhleSBjYW4gYmUgY2hhbmdlZCBsYXRlciB2aWEgcG5nX3NldF9lcnJvcl9mbigpLiAgT24gc29tZSBjb21waWxlcnMsCit5b3UgbWF5IGFsc28gaGF2ZSB0byBjaGFuZ2UgdGhlIG1lbW9yeSBhbGxvY2F0b3JzIChwbmdfbWFsbG9jLCBldGMuKS4KKworLlNTIENvbmZpZ3VyaW5nIHpsaWI6CisKK1RoZXJlIGFyZSBzcGVjaWFsIGZ1bmN0aW9ucyB0byBjb25maWd1cmUgdGhlIGNvbXByZXNzaW9uLiAgUGVyaGFwcyB0aGUKK21vc3QgdXNlZnVsIG9uZSBjaGFuZ2VzIHRoZSBjb21wcmVzc2lvbiBsZXZlbCwgd2hpY2ggY3VycmVudGx5IHVzZXMKK2lucHV0IGNvbXByZXNzaW9uIHZhbHVlcyBpbiB0aGUgcmFuZ2UgMCAtIDkuICBUaGUgbGlicmFyeSBub3JtYWxseQordXNlcyB0aGUgZGVmYXVsdCBjb21wcmVzc2lvbiBsZXZlbCAoWl9ERUZBVUxUX0NPTVBSRVNTSU9OID0gNikuICBUZXN0cworaGF2ZSBzaG93biB0aGF0IGZvciBhIGxhcmdlIG1ham9yaXR5IG9mIGltYWdlcywgY29tcHJlc3Npb24gdmFsdWVzIGluCit0aGUgcmFuZ2UgMy02IGNvbXByZXNzIG5lYXJseSBhcyB3ZWxsIGFzIGhpZ2hlciBsZXZlbHMsIGFuZCBkbyBzbyBtdWNoCitmYXN0ZXIuICBGb3Igb25saW5lIGFwcGxpY2F0aW9ucyBpdCBtYXkgYmUgZGVzaXJhYmxlIHRvIGhhdmUgbWF4aW11bSBzcGVlZAorKFpfQkVTVF9TUEVFRCA9IDEpLiAgV2l0aCB2ZXJzaW9ucyBvZiB6bGliIGFmdGVyIHYwLjk5LCB5b3UgY2FuIGFsc28KK3NwZWNpZnkgbm8gY29tcHJlc3Npb24gKFpfTk9fQ09NUFJFU1NJT04gPSAwKSwgYnV0IHRoaXMgd291bGQgY3JlYXRlCitmaWxlcyBsYXJnZXIgdGhhbiBqdXN0IHN0b3JpbmcgdGhlIHJhdyBiaXRtYXAuICBZb3UgY2FuIHNwZWNpZnkgdGhlCitjb21wcmVzc2lvbiBsZXZlbCBieSBjYWxsaW5nOgorCisgICAgI2luY2x1ZGUgemxpYi5oCisgICAgcG5nX3NldF9jb21wcmVzc2lvbl9sZXZlbChwbmdfcHRyLCBsZXZlbCk7CisKK0Fub3RoZXIgdXNlZnVsIG9uZSBpcyB0byByZWR1Y2UgdGhlIG1lbW9yeSBsZXZlbCB1c2VkIGJ5IHRoZSBsaWJyYXJ5LgorVGhlIG1lbW9yeSBsZXZlbCBkZWZhdWx0cyB0byA4LCBidXQgaXQgY2FuIGJlIGxvd2VyZWQgaWYgeW91IGFyZQorc2hvcnQgb24gbWVtb3J5IChydW5uaW5nIERPUywgZm9yIGV4YW1wbGUsIHdoZXJlIHlvdSBvbmx5IGhhdmUgNjQwSykuCitOb3RlIHRoYXQgdGhlIG1lbW9yeSBsZXZlbCBkb2VzIGhhdmUgYW4gZWZmZWN0IG9uIGNvbXByZXNzaW9uOyBhbW9uZworb3RoZXIgdGhpbmdzLCBsb3dlciBsZXZlbHMgd2lsbCByZXN1bHQgaW4gc2VjdGlvbnMgb2YgaW5jb21wcmVzc2libGUKK2RhdGEgYmVpbmcgZW1pdHRlZCBpbiBzbWFsbGVyIHN0b3JlZCBibG9ja3MsIHdpdGggYSBjb3JyZXNwb25kaW5nbHkKK2xhcmdlciByZWxhdGl2ZSBvdmVyaGVhZCBvZiB1cCB0byAxNSUgaW4gdGhlIHdvcnN0IGNhc2UuCisKKyAgICAjaW5jbHVkZSB6bGliLmgKKyAgICBwbmdfc2V0X2NvbXByZXNzaW9uX21lbV9sZXZlbChwbmdfcHRyLCBsZXZlbCk7CisKK1RoZSBvdGhlciBmdW5jdGlvbnMgYXJlIGZvciBjb25maWd1cmluZyB6bGliLiAgVGhleSBhcmUgbm90IHJlY29tbWVuZGVkCitmb3Igbm9ybWFsIHVzZSBhbmQgbWF5IHJlc3VsdCBpbiB3cml0aW5nIGFuIGludmFsaWQgUE5HIGZpbGUuICBTZWUKK3psaWIuaCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB3aGF0IHRoZXNlIG1lYW4uCisKKyAgICAjaW5jbHVkZSB6bGliLmgKKyAgICBwbmdfc2V0X2NvbXByZXNzaW9uX3N0cmF0ZWd5KHBuZ19wdHIsCisgICAgICAgIHN0cmF0ZWd5KTsKKworICAgIHBuZ19zZXRfY29tcHJlc3Npb25fd2luZG93X2JpdHMocG5nX3B0ciwKKyAgICAgICAgd2luZG93X2JpdHMpOworCisgICAgcG5nX3NldF9jb21wcmVzc2lvbl9tZXRob2QocG5nX3B0ciwgbWV0aG9kKTsKKworVGhpcyBjb250cm9scyB0aGUgc2l6ZSBvZiB0aGUgSURBVCBjaHVua3MgKGRlZmF1bHQgODE5Mik6CisKKyAgICBwbmdfc2V0X2NvbXByZXNzaW9uX2J1ZmZlcl9zaXplKHBuZ19wdHIsIHNpemUpOworCitBcyBvZiBsaWJwbmcgdmVyc2lvbiAxLjUuNCwgYWRkaXRpb25hbCBBUElzIGJlY2FtZQorYXZhaWxhYmxlIHRvIHNldCB0aGVzZSBzZXBhcmF0ZWx5IGZvciBub24tSURBVAorY29tcHJlc3NlZCBjaHVua3Mgc3VjaCBhcyB6VFh0LCBpVFh0LCBhbmQgaUNDUDoKKworICAgICNpbmNsdWRlIHpsaWIuaAorICAgICNpZiBQTkdfTElCUE5HX1ZFUiA+PSAxMDUwNAorICAgIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9sZXZlbChwbmdfcHRyLCBsZXZlbCk7CisKKyAgICBwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fbWVtX2xldmVsKHBuZ19wdHIsIGxldmVsKTsKKworICAgIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9zdHJhdGVneShwbmdfcHRyLAorICAgICAgICBzdHJhdGVneSk7CisKKyAgICBwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fd2luZG93X2JpdHMocG5nX3B0ciwKKyAgICAgICAgd2luZG93X2JpdHMpOworCisgICAgcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX21ldGhvZChwbmdfcHRyLCBtZXRob2QpOworICAgICNlbmRpZgorCisuU1MgQ29udHJvbGxpbmcgcm93IGZpbHRlcmluZworCitJZiB5b3Ugd2FudCB0byBjb250cm9sIHdoZXRoZXIgbGlicG5nIHVzZXMgZmlsdGVyaW5nIG9yIG5vdCwgd2hpY2gKK2ZpbHRlcnMgYXJlIHVzZWQsIGFuZCBob3cgaXQgZ29lcyBhYm91dCBwaWNraW5nIHJvdyBmaWx0ZXJzLCB5b3UKK2NhbiBjYWxsIG9uZSBvZiB0aGVzZSBmdW5jdGlvbnMuICBUaGUgc2VsZWN0aW9uIGFuZCBjb25maWd1cmF0aW9uCitvZiByb3cgZmlsdGVycyBjYW4gaGF2ZSBhIHNpZ25pZmljYW50IGltcGFjdCBvbiB0aGUgc2l6ZSBhbmQKK2VuY29kaW5nIHNwZWVkIGFuZCBhIHNvbWV3aGF0IGxlc3NlciBpbXBhY3Qgb24gdGhlIGRlY29kaW5nIHNwZWVkCitvZiBhbiBpbWFnZS4gIEZpbHRlcmluZyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgZm9yIFJHQiBhbmQgZ3JheXNjYWxlCitpbWFnZXMgKHdpdGggYW5kIHdpdGhvdXQgYWxwaGEpLCBidXQgbm90IGZvciBwYWxldHRlZCBpbWFnZXMgbm9yCitmb3IgYW55IGltYWdlcyB3aXRoIGJpdCBkZXB0aHMgbGVzcyB0aGFuIDggYml0cy9waXhlbC4KKworVGhlICdtZXRob2QnIHBhcmFtZXRlciBzZXRzIHRoZSBtYWluIGZpbHRlcmluZyBtZXRob2QsIHdoaWNoIGlzCitjdXJyZW50bHkgb25seSAnMCcgaW4gdGhlIFBORyAxLjIgc3BlY2lmaWNhdGlvbi4gIFRoZSAnZmlsdGVycycKK3BhcmFtZXRlciBzZXRzIHdoaWNoIGZpbHRlcihzKSwgaWYgYW55LCBzaG91bGQgYmUgdXNlZCBmb3IgZWFjaAorc2NhbmxpbmUuICBQb3NzaWJsZSB2YWx1ZXMgYXJlIFBOR19BTExfRklMVEVSUyBhbmQgUE5HX05PX0ZJTFRFUlMKK3RvIHR1cm4gZmlsdGVyaW5nIG9uIGFuZCBvZmYsIHJlc3BlY3RpdmVseS4KKworSW5kaXZpZHVhbCBmaWx0ZXIgdHlwZXMgYXJlIFBOR19GSUxURVJfTk9ORSwgUE5HX0ZJTFRFUl9TVUIsCitQTkdfRklMVEVSX1VQLCBQTkdfRklMVEVSX0FWRywgUE5HX0ZJTFRFUl9QQUVUSCwgd2hpY2ggY2FuIGJlIGJpdHdpc2UKK09SZWQgdG9nZXRoZXIgd2l0aCAnfCcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWx0ZXJzIHRvIHVzZS4KK1RoZXNlIGZpbHRlcnMgYXJlIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBpbiB0aGUgUE5HIHNwZWNpZmljYXRpb24uCitJZiB5b3UgaW50ZW5kIHRvIGNoYW5nZSB0aGUgZmlsdGVyIHR5cGUgZHVyaW5nIHRoZSBjb3Vyc2Ugb2Ygd3JpdGluZwordGhlIGltYWdlLCB5b3Ugc2hvdWxkIHN0YXJ0IHdpdGggZmxhZ3Mgc2V0IGZvciBhbGwgb2YgdGhlIGZpbHRlcnMKK3lvdSBpbnRlbmQgdG8gdXNlIHNvIHRoYXQgbGlicG5nIGNhbiBpbml0aWFsaXplIGl0cyBpbnRlcm5hbAorc3RydWN0dXJlcyBhcHByb3ByaWF0ZWx5IGZvciBhbGwgb2YgdGhlIGZpbHRlciB0eXBlcy4gIChOb3RlIHRoYXQgdGhpcworbWVhbnMgdGhlIGZpcnN0IHJvdyBtdXN0IGFsd2F5cyBiZSBhZGFwdGl2ZWx5IGZpbHRlcmVkLCBiZWNhdXNlIGxpYnBuZworY3VycmVudGx5IGRvZXMgbm90IGFsbG9jYXRlIHRoZSBmaWx0ZXIgYnVmZmVycyB1bnRpbCBwbmdfd3JpdGVfcm93KCkKK2lzIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUuKQorCisgICAgZmlsdGVycyA9IFBOR19GSUxURVJfTk9ORSB8IFBOR19GSUxURVJfU1VCCisgICAgICAgICAgICAgIFBOR19GSUxURVJfVVAgfCBQTkdfRklMVEVSX0FWRyB8CisgICAgICAgICAgICAgIFBOR19GSUxURVJfUEFFVEggfCBQTkdfQUxMX0ZJTFRFUlM7CisKKyAgICBwbmdfc2V0X2ZpbHRlcihwbmdfcHRyLCBQTkdfRklMVEVSX1RZUEVfQkFTRSwKKyAgICAgICBmaWx0ZXJzKTsKKyAgICAgICAgICAgICAgVGhlIHNlY29uZCBwYXJhbWV0ZXIgY2FuIGFsc28gYmUKKyAgICAgICAgICAgICAgUE5HX0lOVFJBUElYRUxfRElGRkVSRU5DSU5HIGlmIHlvdSBhcmUKKyAgICAgICAgICAgICAgd3JpdGluZyBhIFBORyB0byBiZSBlbWJlZGRlZCBpbiBhIE1ORworICAgICAgICAgICAgICBkYXRhc3RyZWFtLiAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSB0aGUKKyAgICAgICAgICAgICAgc2FtZSBhcyB0aGUgdmFsdWUgb2YgZmlsdGVyX21ldGhvZCB1c2VkCisgICAgICAgICAgICAgIGluIHBuZ19zZXRfSUhEUigpLgorCisuU1MgUmVxdWVzdGluZyBkZWJ1ZyBwcmludG91dAorCitUaGUgbWFjcm8gZGVmaW5pdGlvbiBQTkdfREVCVUcgY2FuIGJlIHVzZWQgdG8gcmVxdWVzdCBkZWJ1Z2dpbmcKK3ByaW50b3V0LiAgU2V0IGl0IHRvIGFuIGludGVnZXIgdmFsdWUgaW4gdGhlIHJhbmdlIDAgdG8gMy4gIEhpZ2hlcgorbnVtYmVycyByZXN1bHQgaW4gaW5jcmVhc2luZyBhbW91bnRzIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoZQoraW5mb3JtYXRpb24gaXMgcHJpbnRlZCB0byB0aGUgInN0ZGVyciIgZmlsZSwgdW5sZXNzIGFub3RoZXIgZmlsZQorbmFtZSBpcyBzcGVjaWZpZWQgaW4gdGhlIFBOR19ERUJVR19GSUxFIG1hY3JvIGRlZmluaXRpb24uCisKK1doZW4gUE5HX0RFQlVHID4gMCwgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgKG1hY3JvcykgYmVjb21lIGF2YWlsYWJsZToKKworICAgcG5nX2RlYnVnKGxldmVsLCBtZXNzYWdlKQorICAgcG5nX2RlYnVnMShsZXZlbCwgbWVzc2FnZSwgcDEpCisgICBwbmdfZGVidWcyKGxldmVsLCBtZXNzYWdlLCBwMSwgcDIpCisKK2luIHdoaWNoICJsZXZlbCIgaXMgY29tcGFyZWQgdG8gUE5HX0RFQlVHIHRvIGRlY2lkZSB3aGV0aGVyIHRvIHByaW50Cit0aGUgbWVzc2FnZSwgIm1lc3NhZ2UiIGlzIHRoZSBmb3JtYXR0ZWQgc3RyaW5nIHRvIGJlIHByaW50ZWQsCithbmQgcDEgYW5kIHAyIGFyZSBwYXJhbWV0ZXJzIHRoYXQgYXJlIHRvIGJlIGVtYmVkZGVkIGluIHRoZSBzdHJpbmcKK2FjY29yZGluZyB0byBwcmludGYtc3R5bGUgZm9ybWF0dGluZyBkaXJlY3RpdmVzLiAgRm9yIGV4YW1wbGUsCisKKyAgIHBuZ19kZWJ1ZzEoMiwgImZvbz0lZCIsIGZvbyk7CisKK2lzIGV4cGFuZGVkIHRvCisKKyAgIGlmIChQTkdfREVCVUcgPiAyKQorICAgICAgZnByaW50ZihQTkdfREVCVUdfRklMRSwgImZvbz0lZFxlbiIsIGZvbyk7CisKK1doZW4gUE5HX0RFQlVHIGlzIGRlZmluZWQgYnV0IGlzIHplcm8sIHRoZSBtYWNyb3MgYXJlbid0IGRlZmluZWQsIGJ1dCB5b3UKK2NhbiBzdGlsbCB1c2UgUE5HX0RFQlVHIHRvIGNvbnRyb2wgeW91ciBvd24gZGVidWdnaW5nOgorCisgICAjaWZkZWYgUE5HX0RFQlVHCisgICAgICAgZnByaW50ZihzdGRlcnIsIC4uLgorICAgI2VuZGlmCisKK1doZW4gUE5HX0RFQlVHID0gMSwgdGhlIG1hY3JvcyBhcmUgZGVmaW5lZCwgYnV0IG9ubHkgcG5nX2RlYnVnIHN0YXRlbWVudHMKK2hhdmluZyBsZXZlbCA9IDAgd2lsbCBiZSBwcmludGVkLiAgVGhlcmUgYXJlbid0IGFueSBzdWNoIHN0YXRlbWVudHMgaW4KK3RoaXMgdmVyc2lvbiBvZiBsaWJwbmcsIGJ1dCBpZiB5b3UgaW5zZXJ0IHNvbWUgdGhleSB3aWxsIGJlIHByaW50ZWQuCisKKy5TSCBWSUkuICBNTkcgc3VwcG9ydAorCitUaGUgTU5HIHNwZWNpZmljYXRpb24gKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL21uZykgYWxsb3dzCitjZXJ0YWluIGV4dGVuc2lvbnMgdG8gUE5HIGZvciBQTkcgaW1hZ2VzIHRoYXQgYXJlIGVtYmVkZGVkIGluIE1ORyBkYXRhc3RyZWFtcy4KK0xpYnBuZyBjYW4gc3VwcG9ydCBzb21lIG9mIHRoZXNlIGV4dGVuc2lvbnMuICBUbyBlbmFibGUgdGhlbSwgdXNlIHRoZQorcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMoKSBmdW5jdGlvbjoKKworICAgZmVhdHVyZV9zZXQgPSBwbmdfcGVybWl0X21uZ19mZWF0dXJlcyhwbmdfcHRyLCBtYXNrKQorCisgICBtYXNrIGlzIGEgcG5nX3VpbnRfMzIgY29udGFpbmluZyB0aGUgYml0d2lzZSBPUiBvZiB0aGUKKyAgICAgICAgZmVhdHVyZXMgeW91IHdhbnQgdG8gZW5hYmxlLiAgVGhlc2UgaW5jbHVkZQorICAgICAgICBQTkdfRkxBR19NTkdfRU1QVFlfUExURQorICAgICAgICBQTkdfRkxBR19NTkdfRklMVEVSXzY0CisgICAgICAgIFBOR19BTExfTU5HX0ZFQVRVUkVTCisKKyAgIGZlYXR1cmVfc2V0IGlzIGEgcG5nX3VpbnRfMzIgdGhhdCBpcyB0aGUgYml0d2lzZSBBTkQgb2YKKyAgICAgIHlvdXIgbWFzayB3aXRoIHRoZSBzZXQgb2YgTU5HIGZlYXR1cmVzIHRoYXQgaXMKKyAgICAgIHN1cHBvcnRlZCBieSB0aGUgdmVyc2lvbiBvZiBsaWJwbmcgdGhhdCB5b3UgYXJlIHVzaW5nLgorCitJdCBpcyBhbiBlcnJvciB0byB1c2UgdGhpcyBmdW5jdGlvbiB3aGVuIHJlYWRpbmcgb3Igd3JpdGluZyBhIHN0YW5kYWxvbmUKK1BORyBmaWxlIHdpdGggdGhlIFBORyA4LWJ5dGUgc2lnbmF0dXJlLiAgVGhlIFBORyBkYXRhc3RyZWFtIG11c3QgYmUgd3JhcHBlZAoraW4gYSBNTkcgZGF0YXN0cmVhbS4gIEFzIGEgbWluaW11bSwgaXQgbXVzdCBoYXZlIHRoZSBNTkcgOC1ieXRlIHNpZ25hdHVyZQorYW5kIHRoZSBNSERSIGFuZCBNRU5EIGNodW5rcy4gIExpYnBuZyBkb2VzIG5vdCBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZXNlCitvciBhbnkgb3RoZXIgTU5HIGNodW5rczsgeW91ciBhcHBsaWNhdGlvbiBtdXN0IHByb3ZpZGUgaXRzIG93biBzdXBwb3J0IGZvcgordGhlbS4gIFlvdSBtYXkgd2lzaCB0byBjb25zaWRlciB1c2luZyBsaWJtbmcgKGF2YWlsYWJsZSBhdAoraHR0cDovL3d3dy5saWJtbmcuY29tKSBpbnN0ZWFkLgorCisuU0ggVklJSS4gIENoYW5nZXMgdG8gTGlicG5nIGZyb20gdmVyc2lvbiAwLjg4CisKK0l0IHNob3VsZCBiZSBub3RlZCB0aGF0IHZlcnNpb25zIG9mIGxpYnBuZyBsYXRlciB0aGFuIDAuOTYgYXJlIG5vdAorZGlzdHJpYnV0ZWQgYnkgdGhlIG9yaWdpbmFsIGxpYnBuZyBhdXRob3IsIEd1eSBTY2hhbG5hdCwgbm9yIGJ5CitBbmRyZWFzIERpbGdlciwgd2hvIGhhZCB0YWtlbiBvdmVyIGZyb20gR3V5IGR1cmluZyAxOTk2IGFuZCAxOTk3LCBhbmQKK2Rpc3RyaWJ1dGVkIHZlcnNpb25zIDAuODkgdGhyb3VnaCAwLjk2LCBidXQgcmF0aGVyIGJ5IGFub3RoZXIgbWVtYmVyCitvZiB0aGUgb3JpZ2luYWwgUE5HIEdyb3VwLCBHbGVubiBSYW5kZXJzLVBlaHJzb24uICBHdXkgYW5kIEFuZHJlYXMgYXJlCitzdGlsbCBhbGl2ZSBhbmQgd2VsbCwgYnV0IHRoZXkgaGF2ZSBtb3ZlZCBvbiB0byBvdGhlciB0aGluZ3MuCisKK1RoZSBvbGQgbGlicG5nIGZ1bmN0aW9ucyBwbmdfcmVhZF9pbml0KCksIHBuZ193cml0ZV9pbml0KCksCitwbmdfaW5mb19pbml0KCksIHBuZ19yZWFkX2Rlc3Ryb3koKSwgYW5kIHBuZ193cml0ZV9kZXN0cm95KCkgaGF2ZSBiZWVuCittb3ZlZCB0byBQTkdfSU5URVJOQUwgaW4gdmVyc2lvbiAwLjk1IHRvIGRpc2NvdXJhZ2UgdGhlaXIgdXNlLiAgVGhlc2UKK2Z1bmN0aW9ucyB3aWxsIGJlIHJlbW92ZWQgZnJvbSBsaWJwbmcgdmVyc2lvbiAxLjQuMC4KKworVGhlIHByZWZlcnJlZCBtZXRob2Qgb2YgY3JlYXRpbmcgYW5kIGluaXRpYWxpemluZyB0aGUgbGlicG5nIHN0cnVjdHVyZXMgaXMKK3ZpYSB0aGUgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCgpLCBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCgpLCBhbmQKK3BuZ19jcmVhdGVfaW5mb19zdHJ1Y3QoKSBiZWNhdXNlIHRoZXkgaXNvbGF0ZSB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0dXJlcworZnJvbSB0aGUgYXBwbGljYXRpb24sIGFsbG93IHZlcnNpb24gZXJyb3IgY2hlY2tpbmcsIGFuZCBhbHNvIGFsbG93IHRoZQordXNlIG9mIGN1c3RvbSBlcnJvciBoYW5kbGluZyByb3V0aW5lcyBkdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uLCB3aGljaAordGhlIG9sZCBmdW5jdGlvbnMgZG8gbm90LiAgVGhlIGZ1bmN0aW9ucyBwbmdfcmVhZF9kZXN0cm95KCkgYW5kCitwbmdfd3JpdGVfZGVzdHJveSgpIGRvIG5vdCBhY3R1YWxseSBmcmVlIHRoZSBtZW1vcnkgdGhhdCBsaWJwbmcKK2FsbG9jYXRlZCBmb3IgdGhlc2Ugc3RydWN0cywgYnV0IGp1c3QgcmVzZXQgdGhlIGRhdGEgc3RydWN0dXJlcywgc28gdGhleQorY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgpIGFuZAorcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCkgaWYgeW91IGZlZWwgdGhlcmUgaXMgdG9vIG11Y2ggc3lzdGVtIG92ZXJoZWFkCithbGxvY2F0aW5nIGFuZCBmcmVlaW5nIHRoZSBwbmdfc3RydWN0IGZvciBlYWNoIGltYWdlIHJlYWQuCisKK1NldHRpbmcgdGhlIGVycm9yIGNhbGxiYWNrcyB2aWEgcG5nX3NldF9tZXNzYWdlX2ZuKCkgYmVmb3JlCitwbmdfcmVhZF9pbml0KCkgYXMgd2FzIHN1Z2dlc3RlZCBpbiBsaWJwbmctMC44OCBpcyBubyBsb25nZXIgc3VwcG9ydGVkCitiZWNhdXNlIHRoaXMgY2F1c2VkIGFwcGxpY2F0aW9ucyB0aGF0IGRvIG5vdCB1c2UgY3VzdG9tIGVycm9yIGZ1bmN0aW9ucwordG8gZmFpbCBpZiB0aGUgcG5nX3B0ciB3YXMgbm90IGluaXRpYWxpemVkIHRvIHplcm8uICBJdCBpcyBzdGlsbCBwb3NzaWJsZQordG8gc2V0IHRoZSBlcnJvciBjYWxsYmFja3MgQUZURVIgcG5nX3JlYWRfaW5pdCgpLCBvciB0byBjaGFuZ2UgdGhlbSB3aXRoCitwbmdfc2V0X2Vycm9yX2ZuKCksIHdoaWNoIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGZ1bmN0aW9uLCBidXQgd2l0aCBhIG5ldworbmFtZSB0byBmb3JjZSBjb21waWxhdGlvbiBlcnJvcnMgd2l0aCBhcHBsaWNhdGlvbnMgdGhhdCB0cnkgdG8gdXNlIHRoZSBvbGQKK21ldGhvZC4KKworU3VwcG9ydCBmb3IgdGhlIHNDQUwsIGlDQ1AsIGlUWHQsIGFuZCBzUExUIGNodW5rcyB3YXMgYWRkZWQgYXQgbGlicG5nLTEuMC42OworaG93ZXZlciwgaVRYdCBzdXBwb3J0IHdhcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0LgorCitTdGFydGluZyB3aXRoIHZlcnNpb24gMS4wLjcsIHlvdSBjYW4gZmluZCBvdXQgd2hpY2ggdmVyc2lvbiBvZiB0aGUgbGlicmFyeQoreW91IGFyZSB1c2luZyBhdCBydW4tdGltZToKKworICAgcG5nX3VpbnRfMzIgbGlicG5nX3ZuID0gcG5nX2FjY2Vzc192ZXJzaW9uX251bWJlcigpOworCitUaGUgbnVtYmVyIGxpYnBuZ192biBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBtYWpvciB2ZXJzaW9uLCBtaW5vcgordmVyc2lvbiB3aXRoIGxlYWRpbmcgemVybywgYW5kIHJlbGVhc2UgbnVtYmVyIHdpdGggbGVhZGluZyB6ZXJvLAorKGUuZy4sIGxpYnBuZ192biBmb3IgdmVyc2lvbiAxLjAuNyBpcyAxMDAwNykuCisKK05vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHRha2UgYSBwbmdfcHRyLCBzbyB5b3UgY2FuIGNhbGwgaXQKK2JlZm9yZSB5b3UndmUgY3JlYXRlZCBvbmUuCisKK1lvdSBjYW4gYWxzbyBjaGVjayB3aGljaCB2ZXJzaW9uIG9mIHBuZy5oIHlvdSB1c2VkIHdoZW4gY29tcGlsaW5nIHlvdXIKK2FwcGxpY2F0aW9uOgorCisgICBwbmdfdWludF8zMiBhcHBsaWNhdGlvbl92biA9IFBOR19MSUJQTkdfVkVSOworCisuU0ggSVguICBDaGFuZ2VzIHRvIExpYnBuZyBmcm9tIHZlcnNpb24gMS4wLnggdG8gMS4yLngKKworU3VwcG9ydCBmb3IgdXNlciBtZW1vcnkgbWFuYWdlbWVudCB3YXMgZW5hYmxlZCBieSBkZWZhdWx0LiAgVG8KK2FjY29tcGxpc2ggdGhpcywgdGhlIGZ1bmN0aW9ucyBwbmdfY3JlYXRlX3JlYWRfc3RydWN0XzIoKSwKK3BuZ19jcmVhdGVfd3JpdGVfc3RydWN0XzIoKSwgcG5nX3NldF9tZW1fZm4oKSwgcG5nX2dldF9tZW1fcHRyKCksCitwbmdfbWFsbG9jX2RlZmF1bHQoKSwgYW5kIHBuZ19mcmVlX2RlZmF1bHQoKSB3ZXJlIGFkZGVkLgorCitTdXBwb3J0IGZvciB0aGUgaVRYdCBjaHVuayBoYXMgYmVlbiBlbmFibGVkIGJ5IGRlZmF1bHQgYXMgb2YKK3ZlcnNpb24gMS4yLjQxLgorCitTdXBwb3J0IGZvciBjZXJ0YWluIE1ORyBmZWF0dXJlcyB3YXMgZW5hYmxlZC4KKworU3VwcG9ydCBmb3IgbnVtYmVyZWQgZXJyb3IgbWVzc2FnZXMgd2FzIGFkZGVkLiAgSG93ZXZlciwgd2UgbmV2ZXIgZ290Cithcm91bmQgdG8gYWN0dWFsbHkgbnVtYmVyaW5nIHRoZSBlcnJvciBtZXNzYWdlcy4gIFRoZSBmdW5jdGlvbgorcG5nX3NldF9zdHJpcF9lcnJvcl9udW1iZXJzKCkgd2FzIGFkZGVkIChOb3RlOiB0aGUgcHJvdG90eXBlIGZvciB0aGlzCitmdW5jdGlvbiB3YXMgaW5hZHZlcnRlbnRseSByZW1vdmVkIGZyb20gcG5nLmggaW4gUE5HX05PX0FTU0VNQkxFUl9DT0RFCitidWlsZHMgb2YgbGlicG5nLTEuMi4xNS4gIEl0IHdhcyByZXN0b3JlZCBpbiBsaWJwbmctMS4yLjM2KS4KKworVGhlIHBuZ19tYWxsb2Nfd2FybigpIGZ1bmN0aW9uIHdhcyBhZGRlZCBhdCBsaWJwbmctMS4yLjMuICBUaGlzIGlzc3VlcworYSBwbmdfd2FybmluZyBhbmQgcmV0dXJucyBOVUxMIGluc3RlYWQgb2YgYWJvcnRpbmcgd2hlbiBpdCBmYWlscyB0bworYWNxdWlyZSB0aGUgcmVxdWVzdGVkIG1lbW9yeSBhbGxvY2F0aW9uLgorCitTdXBwb3J0IGZvciBzZXR0aW5nIHVzZXIgbGltaXRzIG9uIGltYWdlIHdpZHRoIGFuZCBoZWlnaHQgd2FzIGVuYWJsZWQKK2J5IGRlZmF1bHQuICBUaGUgZnVuY3Rpb25zIHBuZ19zZXRfdXNlcl9saW1pdHMoKSwgcG5nX2dldF91c2VyX3dpZHRoX21heCgpLAorYW5kIHBuZ19nZXRfdXNlcl9oZWlnaHRfbWF4KCkgd2VyZSBhZGRlZCBhdCBsaWJwbmctMS4yLjYuCisKK1RoZSBwbmdfc2V0X2FkZF9hbHBoYSgpIGZ1bmN0aW9uIHdhcyBhZGRlZCBhdCBsaWJwbmctMS4yLjcuCisKK1RoZSBmdW5jdGlvbiBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgoKSB3YXMgYWRkZWQgYXQgbGlicG5nLTEuMi45LgorVW5saWtlIHBuZ19zZXRfZ3JheV8xXzJfNF90b184KCksIHRoZSBuZXcgZnVuY3Rpb24gZG9lcyBub3QgZXhwYW5kIHRoZQordFJOUyBjaHVuayB0byBhbHBoYS4gVGhlIHBuZ19zZXRfZ3JheV8xXzJfNF90b184KCkgZnVuY3Rpb24gaXMKK2RlcHJlY2F0ZWQuCisKK0EgbnVtYmVyIG9mIG1hY3JvIGRlZmluaXRpb25zIGluIHN1cHBvcnQgb2YgcnVudGltZSBzZWxlY3Rpb24gb2YKK2Fzc2VtYmxlciBjb2RlIGZlYXR1cmVzIChlc3BlY2lhbGx5IEludGVsIE1NWCBjb2RlIHN1cHBvcnQpIHdlcmUKK2FkZGVkIGF0IGxpYnBuZy0xLjIuMDoKKworICAgIFBOR19BU01fRkxBR19NTVhfU1VQUE9SVF9DT01QSUxFRAorICAgIFBOR19BU01fRkxBR19NTVhfU1VQUE9SVF9JTl9DUFUKKyAgICBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfQ09NQklORV9ST1cKKyAgICBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfSU5URVJMQUNFCisgICAgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0ZJTFRFUl9TVUIKKyAgICBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX1VQCisgICAgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0ZJTFRFUl9BVkcKKyAgICBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX1BBRVRICisgICAgUE5HX0FTTV9GTEFHU19JTklUSUFMSVpFRAorICAgIFBOR19NTVhfUkVBRF9GTEFHUworICAgIFBOR19NTVhfRkxBR1MKKyAgICBQTkdfTU1YX1dSSVRFX0ZMQUdTCisgICAgUE5HX01NWF9GTEFHUworCitXZSBhZGRlZCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBpbiBzdXBwb3J0IG9mIHJ1bnRpbWUKK3NlbGVjdGlvbiBvZiBhc3NlbWJsZXIgY29kZSBmZWF0dXJlczoKKworICAgIHBuZ19nZXRfbW14X2ZsYWdtYXNrKCkKKyAgICBwbmdfc2V0X21teF90aHJlc2hvbGRzKCkKKyAgICBwbmdfZ2V0X2FzbV9mbGFncygpCisgICAgcG5nX2dldF9tbXhfYml0ZGVwdGhfdGhyZXNob2xkKCkKKyAgICBwbmdfZ2V0X21teF9yb3dieXRlc190aHJlc2hvbGQoKQorICAgIHBuZ19zZXRfYXNtX2ZsYWdzKCkKKworV2UgcmVwbGFjZWQgYWxsIG9mIHRoZXNlIGZ1bmN0aW9ucyB3aXRoIHNpbXBsZSBzdHVicyBpbiBsaWJwbmctMS4yLjIwLAord2hlbiB0aGUgSW50ZWwgYXNzZW1ibGVyIGNvZGUgd2FzIHJlbW92ZWQgZHVlIHRvIGEgbGljZW5zaW5nIGlzc3VlLgorCitUaGVzZSBtYWNyb3MgYXJlIGRlcHJlY2F0ZWQ6CisKKyAgICBQTkdfUkVBRF9UUkFOU0ZPUk1TX05PVF9TVVBQT1JURUQKKyAgICBQTkdfUFJPR1JFU1NJVkVfUkVBRF9OT1RfU1VQUE9SVEVECisgICAgUE5HX05PX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQKKyAgICBQTkdfV1JJVEVfVFJBTlNGT1JNU19OT1RfU1VQUE9SVEVECisgICAgUE5HX1JFQURfQU5DSUxMQVJZX0NIVU5LU19OT1RfU1VQUE9SVEVECisgICAgUE5HX1dSSVRFX0FOQ0lMTEFSWV9DSFVOS1NfTk9UX1NVUFBPUlRFRAorCitUaGV5IGhhdmUgYmVlbiByZXBsYWNlZCwgcmVzcGVjdGl2ZWx5LCBieToKKworICAgIFBOR19OT19SRUFEX1RSQU5TRk9STVMKKyAgICBQTkdfTk9fUFJPR1JFU1NJVkVfUkVBRAorICAgIFBOR19OT19TRVFVRU5USUFMX1JFQUQKKyAgICBQTkdfTk9fV1JJVEVfVFJBTlNGT1JNUworICAgIFBOR19OT19SRUFEX0FOQ0lMTEFSWV9DSFVOS1MKKyAgICBQTkdfTk9fV1JJVEVfQU5DSUxMQVJZX0NIVU5LUworCitQTkdfTUFYX1VJTlQgd2FzIHJlcGxhY2VkIHdpdGggUE5HX1VJTlRfMzFfTUFYLiAgSXQgaGFzIGJlZW4KK2RlcHJlY2F0ZWQgc2luY2UgbGlicG5nLTEuMC4xNiBhbmQgbGlicG5nLTEuMi42LgorCitUaGUgZnVuY3Rpb24KKyAgICBwbmdfY2hlY2tfc2lnKHNpZywgbnVtKQord2FzIHJlcGxhY2VkIHdpdGgKKyAgICAhcG5nX3NpZ19jbXAoc2lnLCAwLCBudW0pCitJdCBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIGxpYnBuZy0wLjkwLgorCitUaGUgZnVuY3Rpb24KKyAgICBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCgpCit3aGljaCBhbHNvIGV4cGFuZHMgdFJOUyB0byBhbHBoYSB3YXMgcmVwbGFjZWQgd2l0aAorICAgIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOCgpCit3aGljaCBkb2VzIG5vdC4gSXQgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSBsaWJwbmctMS4wLjE4IGFuZCAxLjIuOS4KKworLlNIIFguICBDaGFuZ2VzIHRvIExpYnBuZyBmcm9tIHZlcnNpb24gMS4wLngvMS4yLnggdG8gMS40LngKKworUHJpdmF0ZSBsaWJwbmcgcHJvdG90eXBlcyBhbmQgbWFjcm8gZGVmaW5pdGlvbnMgd2VyZSBtb3ZlZCBmcm9tCitwbmcuaCBhbmQgcG5nY29uZi5oIGludG8gYSBuZXcgcG5ncHJpdi5oIGhlYWRlciBmaWxlLgorCitGdW5jdGlvbnMgcG5nX3NldF9iZW5pZ25fZXJyb3JzKCksIHBuZ19iZW5pZ25fZXJyb3IoKSwgYW5kCitwbmdfY2h1bmtfYmVuaWduX2Vycm9yKCkgd2VyZSBhZGRlZC4KKworU3VwcG9ydCBmb3Igc2V0dGluZyB0aGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IHRoYXQgdGhlIGFwcGxpY2F0aW9uCit3aWxsIGFsbG9jYXRlIGZvciByZWFkaW5nIGNodW5rcyB3YXMgYWRkZWQsIGFzIGEgc2VjdXJpdHkgbWVhc3VyZS4KK1RoZSBmdW5jdGlvbnMgcG5nX3NldF9jaHVua19jYWNoZV9tYXgoKSBhbmQgcG5nX2dldF9jaHVua19jYWNoZV9tYXgoKQord2VyZSBhZGRlZCB0byB0aGUgbGlicmFyeS4KKworV2UgaW1wbGVtZW50ZWQgc3VwcG9ydCBmb3IgSS9PIHN0YXRlcyBieSBhZGRpbmcgcG5nX3B0ciBtZW1iZXIgaW9fc3RhdGUKK2FuZCBmdW5jdGlvbnMgcG5nX2dldF9pb19jaHVua19uYW1lKCkgYW5kIHBuZ19nZXRfaW9fc3RhdGUoKSBpbiBwbmdnZXQuYworCitXZSBhZGRlZCBQTkdfVFJBTlNGT1JNX0dSQVlfVE9fUkdCIHRvIHRoZSBhdmFpbGFibGUgaGlnaC1sZXZlbAoraW5wdXQgdHJhbnNmb3Jtcy4KKworQ2hlY2tpbmcgZm9yIGFuZCByZXBvcnRpbmcgb2YgZXJyb3JzIGluIHRoZSBJSERSIGNodW5rIGlzIG1vcmUgdGhvcm91Z2guCisKK1N1cHBvcnQgZm9yIGdsb2JhbCBhcnJheXMgd2FzIHJlbW92ZWQsIHRvIGltcHJvdmUgdGhyZWFkIHNhZmV0eS4KKworU29tZSBvYnNvbGV0ZS9kZXByZWNhdGVkIG1hY3JvcyBhbmQgZnVuY3Rpb25zIGhhdmUgYmVlbiByZW1vdmVkLgorCitUeXBlY2FzdGVkIE5VTEwgZGVmaW5pdGlvbnMgc3VjaCBhcworICAgI2RlZmluZSBwbmdfdm9pZHBfTlVMTCAgICAgICAgICAgIChwbmdfdm9pZHApTlVMTAord2VyZSBlbGltaW5hdGVkLiAgSWYgeW91IHVzZWQgdGhlc2UgaW4geW91ciBhcHBsaWNhdGlvbiwganVzdCB1c2UKK05VTEwgaW5zdGVhZC4KKworVGhlIHBuZ19zdHJ1Y3QgYW5kIGluZm9fc3RydWN0IG1lbWJlcnMgInRyYW5zIiBhbmQgInRyYW5zX3ZhbHVlcyIgd2VyZQorY2hhbmdlZCB0byAidHJhbnNfYWxwaGEiIGFuZCAidHJhbnNfY29sb3IiLCByZXNwZWN0aXZlbHkuCisKK1RoZSBvYnNvbGV0ZSwgdW51c2VkIHBuZ2djY3JkLmMgYW5kIHBuZ3ZjcmQuYyBmaWxlcyBhbmQgcmVsYXRlZCBtYWtlZmlsZXMKK3dlcmUgcmVtb3ZlZC4KKworVGhlIFBOR18xXzBfWCBhbmQgUE5HXzFfMl9YIG1hY3JvcyB3ZXJlIGVsaW1pbmF0ZWQuCisKK1RoZSBQTkdfTEVHQUNZX1NVUFBPUlRFRCBtYWNybyB3YXMgZWxpbWluYXRlZC4KKworTWFueSBXSU4zMl9XQ0UgI2lmZGVmcyB3ZXJlIHJlbW92ZWQuCisKK1RoZSBmdW5jdGlvbnMgcG5nX3JlYWRfaW5pdChpbmZvX3B0ciksIHBuZ193cml0ZV9pbml0KGluZm9fcHRyKSwKK3BuZ19pbmZvX2luaXQoaW5mb19wdHIpLCBwbmdfcmVhZF9kZXN0cm95KCksIGFuZCBwbmdfd3JpdGVfZGVzdHJveSgpCitoYXZlIGJlZW4gcmVtb3ZlZC4gIFRoZXkgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgbGlicG5nLTAuOTUuCisKK1RoZSBwbmdfcGVybWl0X2VtcHR5X3BsdGUoKSB3YXMgcmVtb3ZlZC4gSXQgaGFzIGJlZW4gZGVwcmVjYXRlZAorc2luY2UgbGlicG5nLTEuMC45LiAgVXNlIHBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzKCkgaW5zdGVhZC4KKworV2UgcmVtb3ZlZCB0aGUgb2Jzb2xldGUgc3R1YiBmdW5jdGlvbnMgcG5nX2dldF9tbXhfZmxhZ21hc2soKSwKK3BuZ19zZXRfbW14X3RocmVzaG9sZHMoKSwgcG5nX2dldF9hc21fZmxhZ3MoKSwKK3BuZ19nZXRfbW14X2JpdGRlcHRoX3RocmVzaG9sZCgpLCBwbmdfZ2V0X21teF9yb3dieXRlc190aHJlc2hvbGQoKSwKK3BuZ19zZXRfYXNtX2ZsYWdzKCksIGFuZCBwbmdfbW14X3N1cHBvcnRlZCgpCisKK1dlIHJlbW92ZWQgdGhlIG9ic29sZXRlIHBuZ19jaGVja19zaWcoKSwgcG5nX21lbWNweV9jaGVjaygpLCBhbmQKK3BuZ19tZW1zZXRfY2hlY2soKSBmdW5jdGlvbnMuICBJbnN0ZWFkIHVzZSAhcG5nX3NpZ19jbXAoKSwgbWVtY3B5KCksCithbmQgbWVtc2V0KCksIHJlc3BlY3RpdmVseS4KKworVGhlIGZ1bmN0aW9uIHBuZ19zZXRfZ3JheV8xXzJfNF90b184KCkgd2FzIHJlbW92ZWQuIEl0IGhhcyBiZWVuCitkZXByZWNhdGVkIHNpbmNlIGxpYnBuZy0xLjAuMTggYW5kIDEuMi45LCB3aGVuIGl0IHdhcyByZXBsYWNlZCB3aXRoCitwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgoKSBiZWNhdXNlIHRoZSBmb3JtZXIgZnVuY3Rpb24gYWxzbworZXhwYW5kZWQgYW55IHRSTlMgY2h1bmsgdG8gYW4gYWxwaGEgY2hhbm5lbC4KKworTWFjcm9zIGZvciBwbmdfZ2V0X3VpbnRfMTYsIHBuZ19nZXRfdWludF8zMiwgYW5kIHBuZ19nZXRfaW50XzMyCit3ZXJlIGFkZGVkIGFuZCBhcmUgdXNlZCBieSBkZWZhdWx0IGluc3RlYWQgb2YgdGhlIGNvcnJlc3BvbmRpbmcKK2Z1bmN0aW9ucy4gVW5mb3J0dW5hdGVseSwKK2Zyb20gbGlicG5nLTEuNC4wIHVudGlsIDEuNC40LCB0aGUgcG5nX2dldF91aW50XzE2IG1hY3JvIChidXQgbm90IHRoZQorZnVuY3Rpb24pIGluY29ycmVjdGx5IHJldHVybmVkIGEgdmFsdWUgb2YgdHlwZSBwbmdfdWludF8zMi4KKworV2UgY2hhbmdlZCB0aGUgcHJvdG90eXBlIGZvciBwbmdfbWFsbG9jKCkgZnJvbQorICAgIHBuZ19tYWxsb2MocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgc2l6ZSkKK3RvCisgICAgcG5nX21hbGxvYyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYWxsb2Nfc2l6ZV90IHNpemUpCisKK1RoaXMgYWxzbyBhcHBsaWVzIHRvIHRoZSBwcm90b3R5cGUgZm9yIHRoZSB1c2VyIHJlcGxhY2VtZW50IG1hbGxvY19mbigpLgorCitUaGUgcG5nX2NhbGxvYygpIGZ1bmN0aW9uIHdhcyBhZGRlZCBhbmQgaXMgdXNlZCBpbiBwbGFjZSBvZgorb2YgInBuZ19tYWxsb2MoKTsgbWVtc2V0KCk7IiBleGNlcHQgaW4gdGhlIGNhc2UgaW4gcG5nX3JlYWRfcG5nKCkKK3doZXJlIHRoZSBhcnJheSBjb25zaXN0cyBvZiBwb2ludGVyczsgaW4gdGhpcyBjYXNlIGEgImZvciIgbG9vcCBpcyB1c2VkCithZnRlciB0aGUgcG5nX21hbGxvYygpIHRvIHNldCB0aGUgcG9pbnRlcnMgdG8gTlVMTCwgdG8gZ2l2ZSByb2J1c3QuCitiZWhhdmlvciBpbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiBydW5zIG91dCBvZiBtZW1vcnkgcGFydC13YXkgdGhyb3VnaAordGhlIHByb2Nlc3MuCisKK1dlIGNoYW5nZWQgdGhlIHByb3RvdHlwZXMgb2YgcG5nX2dldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZSgpIGFuZAorcG5nX3NldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZSgpIHRvIHdvcmsgd2l0aCBwbmdfc2l6ZV90IGluc3RlYWQgb2YKK3BuZ191aW50XzMyLgorCitTdXBwb3J0IGZvciBudW1iZXJlZCBlcnJvciBtZXNzYWdlcyB3YXMgcmVtb3ZlZCBieSBkZWZhdWx0LCBzaW5jZSB3ZQorbmV2ZXIgZ290IGFyb3VuZCB0byBhY3R1YWxseSBudW1iZXJpbmcgdGhlIGVycm9yIG1lc3NhZ2VzLiBUaGUgZnVuY3Rpb24KK3BuZ19zZXRfc3RyaXBfZXJyb3JfbnVtYmVycygpIHdhcyByZW1vdmVkIGZyb20gdGhlIGxpYnJhcnkgYnkgZGVmYXVsdC4KKworVGhlIHBuZ196YWxsb2MoKSBhbmQgcG5nX3pmcmVlKCkgZnVuY3Rpb25zIGFyZSBubyBsb25nZXIgZXhwb3J0ZWQuCitUaGUgcG5nX3phbGxvYygpIGZ1bmN0aW9uIG5vIGxvbmdlciB6ZXJvZXMgb3V0IHRoZSBtZW1vcnkgdGhhdCBpdAorYWxsb2NhdGVzLiAgQXBwbGljYXRpb25zIHRoYXQgY2FsbGVkIHBuZ196YWxsb2MocG5nX3B0ciwgbnVtYmVyLCBzaXplKQorY2FuIGNhbGwgcG5nX2NhbGxvYyhwbmdfcHRyLCBudW1iZXIqc2l6ZSkgaW5zdGVhZCwgYW5kIGNhbiBjYWxsCitwbmdfZnJlZSgpIGluc3RlYWQgb2YgcG5nX3pmcmVlKCkuCisKK1N1cHBvcnQgZm9yIGRpdGhlcmluZyB3YXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBpbiBsaWJwbmctMS40LjAsIGJlY2F1c2UKK2l0IGhhcyBub3QgYmVlbiB3ZWxsIHRlc3RlZCBhbmQgZG9lc24ndCBhY3R1YWxseSAiZGl0aGVyIi4KK1RoZSBjb2RlIHdhcyBub3QKK3JlbW92ZWQsIGhvd2V2ZXIsIGFuZCBjb3VsZCBiZSBlbmFibGVkIGJ5IGJ1aWxkaW5nIGxpYnBuZyB3aXRoCitQTkdfUkVBRF9ESVRIRVJfU1VQUE9SVEVEIGRlZmluZWQuICBJbiBsaWJwbmctMS40LjIsIHRoaXMgc3VwcG9ydAord2FzIHJlLWVuYWJsZWQsIGJ1dCB0aGUgZnVuY3Rpb24gd2FzIHJlbmFtZWQgcG5nX3NldF9xdWFudGl6ZSgpIHRvCityZWZsZWN0IG1vcmUgYWNjdXJhdGVseSB3aGF0IGl0IGFjdHVhbGx5IGRvZXMuICBBdCB0aGUgc2FtZSB0aW1lLAordGhlIFBOR19ESVRIRVJfW1JFRCxHUkVFTl9CTFVFXV9CSVRTIG1hY3JvcyB3ZXJlIGFsc28gcmVuYW1lZCB0bworUE5HX1FVQU5USVpFX1tSRUQsR1JFRU4sQkxVRV1fQklUUywgYW5kIFBOR19SRUFEX0RJVEhFUl9TVVBQT1JURUQKK3dhcyByZW5hbWVkIHRvIFBOR19SRUFEX1FVQU5USVpFX1NVUFBPUlRFRC4KKworV2UgcmVtb3ZlZCB0aGUgdHJhaWxpbmcgJy4nIGZyb20gdGhlIHdhcm5pbmcgYW5kIGVycm9yIG1lc3NhZ2VzLgorCisuU0ggWEkuICBDaGFuZ2VzIHRvIExpYnBuZyBmcm9tIHZlcnNpb24gMS40LnggdG8gMS41LngKKworRnJvbSBsaWJwbmctMS40LjAgdW50aWwgMS40LjQsIHRoZSBwbmdfZ2V0X3VpbnRfMTYgbWFjcm8gKGJ1dCBub3QgdGhlCitmdW5jdGlvbikgaW5jb3JyZWN0bHkgcmV0dXJuZWQgYSB2YWx1ZSBvZiB0eXBlIHBuZ191aW50XzMyLgorVGhlIGluY29ycmVjdCBtYWNybyB3YXMgcmVtb3ZlZCBmcm9tIGxpYnBuZy0xLjQuNS4KKworQ2hlY2tpbmcgZm9yIGludmFsaWQgcGFsZXR0ZSBpbmRleCBvbiB3cml0ZSB3YXMgYWRkZWQgYXQgbGlicG5nCisxLjUuMTAuICBJZiBhIHBpeGVsIGNvbnRhaW5zIGFuIGludmFsaWQgKG91dC1vZi1yYW5nZSkgaW5kZXggbGlicG5nIGlzc3VlcworYSBiZW5pZ24gZXJyb3IuICBUaGlzIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCBiZWNhdXNlIHRoaXMgY29uZGl0aW9uIGlzIGFuCitlcnJvciBhY2NvcmRpbmcgdG8gdGhlIFBORyBzcGVjaWZpY2F0aW9uLCBDbGF1c2UgMTEuMy4yLCBidXQgdGhlIGVycm9yIGNhbgorYmUgaWdub3JlZCBpbiBlYWNoIHBuZ19wdHIgd2l0aAorCisgICBwbmdfc2V0X2NoZWNrX2Zvcl9pbnZhbGlkX2luZGV4KHBuZ19wdHIsIGFsbG93ZWQpOworCisgICAgICBhbGxvd2VkICAtIG9uZSBvZgorICAgICAgICAgICAgICAgICAwOiBkaXNhYmxlIGJlbmlnbiBlcnJvciAoYWNjZXB0IHRoZQorICAgICAgICAgICAgICAgICAgICBpbnZhbGlkIGRhdGEgd2l0aG91dCB3YXJuaW5nKS4KKyAgICAgICAgICAgICAgICAgMTogZW5hYmxlIGJlbmlnbiBlcnJvciAodHJlYXQgdGhlCisgICAgICAgICAgICAgICAgICAgIGludmFsaWQgZGF0YSBhcyBhbiBlcnJvciBvciBhCisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcpLgorCitJZiB0aGUgZXJyb3IgaXMgaWdub3JlZCwgb3IgaWYgcG5nX2Jlbmlnbl9lcnJvcigpIHRyZWF0cyBpdCBhcyBhIHdhcm5pbmcsCithbnkgaW52YWxpZCBwaXhlbHMgYXJlIGRlY29kZWQgYXMgb3BhcXVlIGJsYWNrIGJ5IHRoZSBkZWNvZGVyIGFuZCB3cml0dGVuCithcy1pcyBieSB0aGUgZW5jb2Rlci4KKworUmV0cmlldmluZyB0aGUgbWF4aW11bSBwYWxldHRlIGluZGV4IGZvdW5kIHdhcyBhZGRlZCBhdCBsaWJwbmctMS41LjE1LgorVGhpcyBzdGF0ZW1lbnQgbXVzdCBhcHBlYXIgYWZ0ZXIgcG5nX3JlYWRfcG5nKCkgb3IgcG5nX3JlYWRfaW1hZ2UoKSB3aGlsZQorcmVhZGluZywgYW5kIGFmdGVyIHBuZ193cml0ZV9wbmcoKSBvciBwbmdfd3JpdGVfaW1hZ2UoKSB3aGlsZSB3cml0aW5nLgorCisgICBpbnQgbWF4X3BhbGV0dGUgPSBwbmdfZ2V0X3BhbGV0dGVfbWF4KHBuZ19wdHIsIGluZm9fcHRyKTsKKworVGhpcyB3aWxsIHJldHVybiB0aGUgbWF4aW11bSBwYWxldHRlIGluZGV4IGZvdW5kIGluIHRoZSBpbWFnZSwgb3IgIlwtMSIgaWYKK3RoZSBwYWxldHRlIHdhcyBub3QgY2hlY2tlZCwgb3IgIjAiIGlmIG5vIHBhbGV0dGUgd2FzIGZvdW5kLiAgTm90ZSB0aGF0IHRoaXMKK2RvZXMgbm90IGFjY291bnQgZm9yIGFueSBwYWxldHRlIGluZGV4IHVzZWQgYnkgYW5jaWxsYXJ5IGNodW5rcyBzdWNoIGFzIHRoZQorYktHRCBjaHVuazsgeW91IG11c3QgY2hlY2sgdGhvc2Ugc2VwYXJhdGVseSB0byBkZXRlcm1pbmUgdGhlIG1heGltdW0KK3BhbGV0dGUgaW5kZXggYWN0dWFsbHkgdXNlZC4KKworVGhlcmUgYXJlIG5vIHN1YnN0YW50aWFsIEFQSSBjaGFuZ2VzIGJldHdlZW4gdGhlIG5vbi1kZXByZWNhdGVkIHBhcnRzIG9mCit0aGUgMS40LjUgQVBJIGFuZCB0aGUgMS41LjAgQVBJOyBob3dldmVyLCB0aGUgYWJpbGl0eSB0byBkaXJlY3RseSBhY2Nlc3MKK21lbWJlcnMgb2YgdGhlIG1haW4gbGlicG5nIGNvbnRyb2wgc3RydWN0dXJlcywgcG5nX3N0cnVjdCBhbmQgcG5nX2luZm8sCitkZXByZWNhdGVkIGluIGVhcmxpZXIgdmVyc2lvbnMgb2YgbGlicG5nLCBoYXMgYmVlbiBjb21wbGV0ZWx5IHJlbW92ZWQgZnJvbQorbGlicG5nIDEuNS4KKworV2Ugbm8gbG9uZ2VyIGluY2x1ZGUgemxpYi5oIGluIHBuZy5oLiAgVGhlIGluY2x1ZGUgc3RhdGVtZW50IGhhcyBiZWVuIG1vdmVkCit0byBwbmdzdHJ1Y3QuaCwgd2hlcmUgaXQgaXMgbm90IGFjY2Vzc2libGUgYnkgYXBwbGljYXRpb25zLiBBcHBsaWNhdGlvbnMgdGhhdAorbmVlZCBhY2Nlc3MgdG8gaW5mb3JtYXRpb24gaW4gemxpYi5oIHdpbGwgbmVlZCB0byBhZGQgdGhlICcjaW5jbHVkZSAiemxpYi5oIicKK2RpcmVjdGl2ZS4gIEl0IGRvZXMgbm90IG1hdHRlciB3aGV0aGVyIHRoaXMgaXMgcGxhY2VkIHByaW9yIHRvIG9yIGFmdGVyCit0aGUgJyIjaW5jbHVkZSBwbmcuaCInIGRpcmVjdGl2ZS4KKworVGhlIHBuZ19zcHJpbnRmKCksIHBuZ19zdHJjcHkoKSwgYW5kIHBuZ19zdHJuY3B5KCkgbWFjcm9zIGFyZSBubyBsb25nZXIgdXNlZAorYW5kIHdlcmUgcmVtb3ZlZC4KKworV2UgbW92ZWQgdGhlIHBuZ19zdHJsZW4oKSwgcG5nX21lbWNweSgpLCBwbmdfbWVtc2V0KCksIGFuZCBwbmdfbWVtY21wKCkKK21hY3JvcyBpbnRvIGEgcHJpdmF0ZSBoZWFkZXIgZmlsZSAocG5ncHJpdi5oKSB0aGF0IGlzIG5vdCBhY2Nlc3NpYmxlIHRvCithcHBsaWNhdGlvbnMuCisKK0luIHBuZ19nZXRfaUNDUCwgdGhlIHR5cGUgb2YgInByb2ZpbGUiIHdhcyBjaGFuZ2VkIGZyb20gcG5nX2NoYXJwcAordG8gcG5nX2J5dGVwcCwgYW5kIGluIHBuZ19zZXRfaUNDUCwgZnJvbSBwbmdfY2hhcnAgdG8gcG5nX2NvbnN0X2J5dGVwLgorCitUaGVyZSBhcmUgY2hhbmdlcyBvZiBmb3JtIGluIHBuZy5oLCBpbmNsdWRpbmcgbmV3IGFuZCBjaGFuZ2VkIG1hY3JvcyB0bworZGVjbGFyZSBwYXJ0cyBvZiB0aGUgQVBJLiAgU29tZSBBUEkgZnVuY3Rpb25zIHdpdGggYXJndW1lbnRzIHRoYXQgYXJlCitwb2ludGVycyB0byBkYXRhIG5vdCBtb2RpZmllZCB3aXRoaW4gdGhlIGZ1bmN0aW9uIGhhdmUgYmVlbiBjb3JyZWN0ZWQgdG8KK2RlY2xhcmUgdGhlc2UgYXJndW1lbnRzIHdpdGggUE5HX0NPTlNULgorCitNdWNoIG9mIHRoZSBpbnRlcm5hbCB1c2Ugb2YgQyBtYWNyb3MgdG8gY29udHJvbCB0aGUgbGlicmFyeSBidWlsZCBoYXMgYWxzbworY2hhbmdlZCBhbmQgc29tZSBvZiB0aGlzIGlzIHZpc2libGUgaW4gdGhlIGV4cG9ydGVkIGhlYWRlciBmaWxlcywgaW4KK3BhcnRpY3VsYXIgdGhlIHVzZSBvZiBtYWNyb3MgdG8gY29udHJvbCBkYXRhIGFuZCBBUEkgZWxlbWVudHMgdmlzaWJsZQorZHVyaW5nIGFwcGxpY2F0aW9uIGNvbXBpbGF0aW9uIG1heSByZXF1aXJlIHNpZ25pZmljYW50IHJldmlzaW9uIHRvCithcHBsaWNhdGlvbiBjb2RlLiAgKEl0IGlzIGV4dHJlbWVseSByYXJlIGZvciBhbiBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLikKKworQW55IHByb2dyYW0gdGhhdCBjb21waWxlZCBhZ2FpbnN0IGxpYnBuZyAxLjQgYW5kIGRpZCBub3QgdXNlIGRlcHJlY2F0ZWQKK2ZlYXR1cmVzIG9yIGFjY2VzcyBpbnRlcm5hbCBsaWJyYXJ5IHN0cnVjdHVyZXMgc2hvdWxkIGNvbXBpbGUgYW5kIHdvcmsKK2FnYWluc3QgbGlicG5nIDEuNSwgZXhjZXB0IGZvciB0aGUgY2hhbmdlIGluIHRoZSBwcm90b3R5cGUgZm9yCitwbmdfZ2V0X2lDQ1AoKSBhbmQgcG5nX3NldF9pQ0NQKCkgQVBJIGZ1bmN0aW9ucyBtZW50aW9uZWQgYWJvdmUuCisKK2xpYnBuZyAxLjUuMCBhZGRzIFBOR18gUEFTUyBtYWNyb3MgdG8gaGVscCBpbiB0aGUgcmVhZGluZyBhbmQgd3JpdGluZyBvZgoraW50ZXJsYWNlZCBpbWFnZXMuICBUaGUgbWFjcm9zIHJldHVybiB0aGUgbnVtYmVyIG9mIHJvd3MgYW5kIGNvbHVtbnMgaW4KK2VhY2ggcGFzcyBhbmQgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBkZS1pbnRlcmxhY2UgYW5kIChpZgorYWJzb2x1dGVseSBuZWNlc3NhcnkpIGludGVybGFjZSBhbiBpbWFnZS4KKworbGlicG5nIDEuNS4wIGFkZHMgYW4gQVBJIHBuZ19sb25nam1wKHBuZ19wdHIsIHZhbHVlKS4gIFRoaXMgQVBJIGNhbGxzCit0aGUgYXBwbGljYXRpb24tcHJvdmlkZWQgcG5nX2xvbmdqbXBfcHRyIG9uIHRoZSBpbnRlcm5hbCwgYnV0IGFwcGxpY2F0aW9uCitpbml0aWFsaXplZCwgbG9uZ2ptcCBidWZmZXIuICBJdCBpcyBwcm92aWRlZCBhcyBhIGNvbnZlbmllbmNlIHRvIGF2b2lkCit0aGUgbmVlZCB0byB1c2UgdGhlIHBuZ19qbXBidWYgbWFjcm8sIHdoaWNoIGhhZCB0aGUgdW5uZWNlc3Nhcnkgc2lkZQorZWZmZWN0IG9mIHJlc2V0dGluZyB0aGUgaW50ZXJuYWwgcG5nX2xvbmdqbXBfcHRyIHZhbHVlLgorCitsaWJwbmcgMS41LjAgaW5jbHVkZXMgYSBjb21wbGV0ZSBmaXhlZCBwb2ludCBBUEkuICBCeSBkZWZhdWx0IHRoaXMgaXMKK3ByZXNlbnQgYWxvbmcgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBmbG9hdGluZyBwb2ludCBBUEkuICBJbiBnZW5lcmFsIHRoZQorZml4ZWQgcG9pbnQgQVBJIGlzIGZhc3RlciBhbmQgc21hbGxlciB0aGFuIHRoZSBmbG9hdGluZyBwb2ludCBvbmUgYmVjYXVzZQordGhlIFBORyBmaWxlIGZvcm1hdCB1c2VkIGZpeGVkIHBvaW50LCBub3QgZmxvYXRpbmcgcG9pbnQuICBUaGlzIGFwcGxpZXMKK2V2ZW4gaWYgdGhlIGxpYnJhcnkgdXNlcyBmbG9hdGluZyBwb2ludCBpbiBpbnRlcm5hbCBjYWxjdWxhdGlvbnMuICBBIG5ldworbWFjcm8sIFBOR19GTE9BVElOR19BUklUSE1FVElDX1NVUFBPUlRFRCwgcmV2ZWFscyB3aGV0aGVyIHRoZSBsaWJyYXJ5Cit1c2VzIGZsb2F0aW5nIHBvaW50IGFyaXRobWV0aWMgKHRoZSBkZWZhdWx0KSBvciBmaXhlZCBwb2ludCBhcml0aG1ldGljCitpbnRlcm5hbGx5IGZvciBwZXJmb3JtYW5jZSBjcml0aWNhbCBjYWxjdWxhdGlvbnMgc3VjaCBhcyBnYW1tYSBjb3JyZWN0aW9uLgorSW4gc29tZSBjYXNlcywgdGhlIGdhbW1hIGNhbGN1bGF0aW9ucyBtYXkgcHJvZHVjZSBzbGlnaHRseSBkaWZmZXJlbnQKK3Jlc3VsdHMuICBUaGlzIGhhcyBjaGFuZ2VkIHRoZSByZXN1bHRzIGluIHBuZ19yZ2JfdG9fZ3JheSBhbmQgaW4gYWxwaGEKK2NvbXBvc2l0aW9uIChwbmdfc2V0X2JhY2tncm91bmQgZm9yIGV4YW1wbGUpLiBUaGlzIGFwcGxpZXMgZXZlbiBpZiB0aGUKK29yaWdpbmFsIGltYWdlIHdhcyBhbHJlYWR5IGxpbmVhciAoZ2FtbWEgPT0gMS4wKSBhbmQsIHRoZXJlZm9yZSwgaXQgaXMKK25vdCBuZWNlc3NhcnkgdG8gbGluZWFyaXplIHRoZSBpbWFnZS4gIFRoaXMgaXMgYmVjYXVzZSBsaWJwbmcgaGFzICpub3QqCitiZWVuIGNoYW5nZWQgdG8gb3B0aW1pemUgdGhhdCBjYXNlIGNvcnJlY3RseSwgeWV0LgorCitGaXhlZCBwb2ludCBzdXBwb3J0IGZvciB0aGUgc0NBTCBjaHVuayBjb21lcyB3aXRoIGFuIGltcG9ydGFudCBjYXZlYXQ7Cit0aGUgc0NBTCBzcGVjaWZpY2F0aW9uIHVzZXMgYSBkZWNpbWFsIGVuY29kaW5nIG9mIGZsb2F0aW5nIHBvaW50IHZhbHVlcworYW5kIHRoZSBhY2N1cmFjeSBvZiBQTkcgZml4ZWQgcG9pbnQgdmFsdWVzIGlzIGluc3VmZmljaWVudCBmb3IKK3JlcHJlc2VudGF0aW9uIG9mIHRoZXNlIHZhbHVlcy4gQ29uc2VxdWVudGx5IGEgInN0cmluZyIgQVBJCisocG5nX2dldF9zQ0FMX3MgYW5kIHBuZ19zZXRfc0NBTF9zKSBpcyB0aGUgb25seSByZWxpYWJsZSB3YXkgb2YgcmVhZGluZworYXJiaXRyYXJ5IHNDQUwgY2h1bmtzIGluIHRoZSBhYnNlbmNlIG9mIGVpdGhlciB0aGUgZmxvYXRpbmcgcG9pbnQgQVBJIG9yCitpbnRlcm5hbCBmbG9hdGluZyBwb2ludCBjYWxjdWxhdGlvbnMuICBTdGFydGluZyB3aXRoIGxpYnBuZy0xLjUuMCwgYm90aAorb2YgdGhlc2UgZnVuY3Rpb25zIGFyZSBwcmVzZW50IHdoZW4gUE5HX3NDQUxfU1VQUE9SVEVEIGlzIGRlZmluZWQuICBQcmlvcgordG8gbGlicG5nLTEuNS4wLCB0aGVpciBwcmVzZW5jZSBhbHNvIGRlcGVuZGVkIHVwb24gUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAorYmVpbmcgZGVmaW5lZCBhbmQgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCBub3QgYmVpbmcgZGVmaW5lZC4KKworQXBwbGljYXRpb25zIG5vIGxvbmdlciBuZWVkIHRvIGluY2x1ZGUgdGhlIG9wdGlvbmFsIGRpc3RyaWJ1dGlvbiBoZWFkZXIKK2ZpbGUgcG5ndXNyLmggb3IgZGVmaW5lIHRoZSBjb3JyZXNwb25kaW5nIG1hY3JvcyBkdXJpbmcgYXBwbGljYXRpb24KK2J1aWxkIGluIG9yZGVyIHRvIHNlZSB0aGUgY29ycmVjdCB2YXJpYW50IG9mIHRoZSBsaWJwbmcgQVBJLiAgRnJvbSAxLjUuMAorYXBwbGljYXRpb24gY29kZSBjYW4gY2hlY2sgZm9yIHRoZSBjb3JyZXNwb25kaW5nIF9TVVBQT1JURUQgbWFjcm86CisKKyNpZmRlZiBQTkdfSU5DSF9DT05WRVJTSU9OU19TVVBQT1JURUQKKyAgIC8qIGNvZGUgdGhhdCB1c2VzIHRoZSBpbmNoIGNvbnZlcnNpb24gQVBJcy4gKi8KKyNlbmRpZgorCitUaGlzIG1hY3JvIHdpbGwgb25seSBiZSBkZWZpbmVkIGlmIHRoZSBpbmNoIGNvbnZlcnNpb24gZnVuY3Rpb25zIGhhdmUgYmVlbgorY29tcGlsZWQgaW50byBsaWJwbmcuICBUaGUgZnVsbCBzZXQgb2YgbWFjcm9zLCBhbmQgd2hldGhlciBvciBub3Qgc3VwcG9ydAoraGFzIGJlZW4gY29tcGlsZWQgaW4sIGFyZSBhdmFpbGFibGUgaW4gdGhlIGhlYWRlciBmaWxlIHBuZ2xpYmNvbmYuaC4KK1RoaXMgaGVhZGVyIGZpbGUgaXMgc3BlY2lmaWMgdG8gdGhlIGxpYnBuZyBidWlsZC4gIE5vdGljZSB0aGF0IHByaW9yIHRvCisxLjUuMCB0aGUgX1NVUFBPUlRFRCBtYWNyb3Mgd291bGQgYWx3YXlzIGhhdmUgdGhlIGRlZmF1bHQgZGVmaW5pdGlvbiB1bmxlc3MKK3Jlc2V0IGJ5IHBuZ3Vzci5oIG9yIGJ5IGV4cGxpY2l0IHNldHRpbmdzIG9uIHRoZSBjb21waWxlciBjb21tYW5kIGxpbmUuCitUaGVzZSBzZXR0aW5ncyBtYXkgcHJvZHVjZSBjb21waWxlciB3YXJuaW5ncyBvciBlcnJvcnMgaW4gMS41LjAgYmVjYXVzZQorb2YgbWFjcm8gcmVkZWZpbml0aW9uLgorCitBcHBsaWNhdGlvbnMgY2FuIG5vdyBjaG9vc2Ugd2hldGhlciB0byB1c2UgdGhlc2UgbWFjcm9zIG9yIHRvIGNhbGwgdGhlCitjb3JyZXNwb25kaW5nIGZ1bmN0aW9uIGJ5IGRlZmluaW5nIFBOR19VU0VfUkVBRF9NQUNST1Mgb3IKK1BOR19OT19VU0VfUkVBRF9NQUNST1MgYmVmb3JlIGluY2x1ZGluZyBwbmcuaC4gIE5vdGljZSB0aGF0IHRoaXMgaXMKK29ubHkgc3VwcG9ydGVkIGZyb20gMS41LjA7IGRlZmluaW5nIFBOR19OT19VU0VfUkVBRF9NQUNST1MgcHJpb3IgdG8gMS41LjAKK3dpbGwgbGVhZCB0byBhIGxpbmsgZmFpbHVyZS4KKworUHJpb3IgdG8gbGlicG5nLTEuNS40LCB0aGUgemxpYiBjb21wcmVzc29yIHVzZWQgdGhlIHNhbWUgc2V0IG9mIHBhcmFtZXRlcnMKK3doZW4gY29tcHJlc3NpbmcgdGhlIElEQVQgZGF0YSBhbmQgdGV4dHVhbCBkYXRhIHN1Y2ggYXMgelRYdCBhbmQgaUNDUC4KK0luIGxpYnBuZy0xLjUuNCB3ZSByZWluaXRpYWxpemVkIHRoZSB6bGliIHN0cmVhbSBmb3IgZWFjaCB0eXBlIG9mIGRhdGEuCitXZSBhZGRlZCBmaXZlIHBuZ19zZXRfdGV4dF8qKCkgZnVuY3Rpb25zIGZvciBzZXR0aW5nIHRoZSBwYXJhbWV0ZXJzIHRvCit1c2Ugd2l0aCB0ZXh0dWFsIGRhdGEuCisKK1ByaW9yIHRvIGxpYnBuZy0xLjUuNCwgdGhlIFBOR19SRUFEXzE2X1RPXzhfQUNDVVJBVEVfU0NBTEVfU1VQUE9SVEVECitvcHRpb24gd2FzIG9mZiBieSBkZWZhdWx0LCBhbmQgc2xpZ2h0bHkgaW5hY2N1cmF0ZSBzY2FsaW5nIG9jY3VycmVkLgorVGhpcyBvcHRpb24gY2FuIG5vIGxvbmdlciBiZSB0dXJuZWQgb2ZmLCBhbmQgdGhlIGNob2ljZSBvZiBhY2N1cmF0ZQorb3IgaW5hY2N1cmF0ZSAxNi10by04IHNjYWxpbmcgaXMgYnkgdXNpbmcgdGhlIG5ldyBwbmdfc2V0X3NjYWxlXzE2X3RvXzgoKQorQVBJIGZvciBhY2N1cmF0ZSBzY2FsaW5nIG9yIHRoZSBvbGQgcG5nX3NldF9zdHJpcF8xNl90b184KCkgQVBJIGZvciBzaW1wbGUKK2Nob3BwaW5nLiAgSW4gbGlicG5nLTEuNS40LCB0aGUgUE5HX1JFQURfMTZfVE9fOF9BQ0NVUkFURV9TQ0FMRV9TVVBQT1JURUQKK21hY3JvIGJlY2FtZSBQTkdfUkVBRF9TQ0FMRV8xNl9UT184X1NVUFBPUlRFRCwgYW5kIHRoZSBQTkdfUkVBRF8xNl9UT184CittYWNybyBiZWNhbWUgUE5HX1JFQURfU1RSSVBfMTZfVE9fOF9TVVBQT1JURUQsIHRvIGVuYWJsZSB0aGUgdHdvCitwbmdfc2V0XypfMTZfdG9fOCgpIGZ1bmN0aW9ucyBzZXBhcmF0ZWx5LgorCitQcmlvciB0byBsaWJwbmctMS41LjQsIHRoZSBwbmdfc2V0X3VzZXJfbGltaXRzKCkgZnVuY3Rpb24gY291bGQgb25seSBiZQordXNlZCB0byByZWR1Y2UgdGhlIHdpZHRoIGFuZCBoZWlnaHQgbGltaXRzIGZyb20gdGhlIHZhbHVlIG9mCitQTkdfVVNFUl9XSURUSF9NQVggYW5kIFBOR19VU0VSX0hFSUdIVF9NQVgsIGFsdGhvdWdoIHRoaXMgZG9jdW1lbnQgc2FpZAordGhhdCBpdCBjb3VsZCBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZW0uICBOb3cgdGhpcyBmdW5jdGlvbiB3aWxsIHJlZHVjZSBvcgoraW5jcmVhc2UgdGhlIGxpbWl0cy4KKworU3RhcnRpbmcgaW4gbGlicG5nLTEuNS4xMCwgdGhlIHVzZXIgbGltaXRzIGNhbiBiZSBzZXQgZW4gbWFzc2Ugd2l0aCB0aGUKK2NvbmZpZ3VyYXRpb24gb3B0aW9uIFBOR19TQUZFX0xJTUlUU19TVVBQT1JURUQuICBJZiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkLAorYSBzZXQgb2YgInNhZmUiIGxpbWl0cyBpcyBhcHBsaWVkIGluIHBuZ3ByaXYuaC4gIFRoZXNlIGNhbiBiZSBvdmVycmlkZGVuIGJ5CithcHBsaWNhdGlvbiBjYWxscyB0byBwbmdfc2V0X3VzZXJfbGltaXRzKCksIHBuZ19zZXRfdXNlcl9jaHVua19jYWNoZV9tYXgoKSwKK2FuZC9vciBwbmdfc2V0X3VzZXJfbWFsbG9jX21heCgpIHRoYXQgaW5jcmVhc2Ugb3IgZGVjcmVhc2UgdGhlIGxpbWl0cy4gIEFsc28sCitpbiBsaWJwbmctMS41LjEwIHRoZSBkZWZhdWx0IHdpZHRoIGFuZCBoZWlnaHQgbGltaXRzIHdlcmUgaW5jcmVhc2VkCitmcm9tIDEsMDAwLDAwMCB0byAweDdmZmZmZmZmIChpLmUuLCBtYWRlIHVubGltaXRlZCkuICBUaGVyZWZvcmUsIHRoZQorbGltaXRzIGFyZSBub3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ICAgICAgc2FmZQorICAgcG5nX3VzZXJfd2lkdGhfbWF4ICAgICAgICAweDdmZmZmZmZmICAgIDEsMDAwLDAwMAorICAgcG5nX3VzZXJfaGVpZ2h0X21heCAgICAgICAweDdmZmZmZmZmICAgIDEsMDAwLDAwMAorICAgcG5nX3VzZXJfY2h1bmtfY2FjaGVfbWF4ICAwICh1bmxpbWl0ZWQpICAgMTI4CisgICBwbmdfdXNlcl9jaHVua19tYWxsb2NfbWF4IDAgKHVubGltaXRlZCkgOCwwMDAsMDAwCisKK1RoZSBwbmdfc2V0X29wdGlvbigpIGZ1bmN0aW9uIChhbmQgdGhlICJvcHRpb25zIiBtZW1iZXIgb2YgdGhlIHBuZyBzdHJ1Y3QpIHdhcworYWRkZWQgdG8gbGlicG5nLTEuNS4xNSwgd2l0aCBvcHRpb24gUE5HX0FSTV9ORU9OLgorCitUaGUgbGlicmFyeSBub3cgc3VwcG9ydHMgYSBjb21wbGV0ZSBmaXhlZCBwb2ludCBpbXBsZW1lbnRhdGlvbiBhbmQgY2FuCit0aHVzIGJlIHVzZWQgb24gc3lzdGVtcyB0aGF0IGhhdmUgbm8gZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBvciB2ZXJ5CitsaW1pdGVkIG9yIHNsb3cgc3VwcG9ydC4gIFByZXZpb3VzbHkgZ2FtbWEgY29ycmVjdGlvbiwgYW4gZXNzZW50aWFsIHBhcnQKK29mIGNvbXBsZXRlIFBORyBzdXBwb3J0LCByZXF1aXJlZCByZWFzb25hYmx5IGZhc3QgZmxvYXRpbmcgcG9pbnQuCisKK0FzIHBhcnQgb2YgdGhpcyB0aGUgY2hvaWNlIG9mIGludGVybmFsIGltcGxlbWVudGF0aW9uIGhhcyBiZWVuIG1hZGUKK2luZGVwZW5kZW50IG9mIHRoZSBjaG9pY2Ugb2YgZml4ZWQgdmVyc3VzIGZsb2F0aW5nIHBvaW50IEFQSXMgYW5kIGFsbCB0aGUKK21pc3NpbmcgZml4ZWQgcG9pbnQgQVBJcyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQuCisKK1RoZSBleGFjdCBtZWNoYW5pc20gdXNlZCB0byBjb250cm9sIGF0dHJpYnV0ZXMgb2YgQVBJIGZ1bmN0aW9ucyBoYXMKK2NoYW5nZWQsIGFzIGRlc2NyaWJlZCBpbiB0aGUgSU5TVEFMTCBmaWxlLgorCitBIG5ldyB0ZXN0IHByb2dyYW0sIHBuZ3ZhbGlkLCBpcyBwcm92aWRlZCBpbiBhZGRpdGlvbiB0byBwbmd0ZXN0LgorcG5ndmFsaWQgdmFsaWRhdGVzIHRoZSBhcml0aG1ldGljIGFjY3VyYWN5IG9mIHRoZSBnYW1tYSBjb3JyZWN0aW9uCitjYWxjdWxhdGlvbnMgYW5kIGluY2x1ZGVzIGEgbnVtYmVyIG9mIHZhbGlkYXRpb25zIG9mIHRoZSBmaWxlIGZvcm1hdC4KK0Egc3Vic2V0IG9mIHRoZSBmdWxsIHJhbmdlIG9mIHRlc3RzIGlzIHJ1biB3aGVuICJtYWtlIGNoZWNrIiBpcyBkb25lCisoaW4gdGhlICdjb25maWd1cmUnIGJ1aWxkLikgIHBuZ3ZhbGlkIGFsc28gYWxsb3dzIHRvdGFsIGFsbG9jYXRlZCBtZW1vcnkKK3VzYWdlIHRvIGJlIGV2YWx1YXRlZCBhbmQgcGVyZm9ybXMgYWRkaXRpb25hbCBtZW1vcnkgb3ZlcndyaXRlIHZhbGlkYXRpb24uCisKK01hbnkgY2hhbmdlcyB0byBpbmRpdmlkdWFsIGZlYXR1cmUgbWFjcm9zIGhhdmUgYmVlbiBtYWRlLiBUaGUgZm9sbG93aW5nCithcmUgdGhlIGNoYW5nZXMgbW9zdCBsaWtlbHkgdG8gYmUgbm90aWNlZCBieSBsaWJyYXJ5IGJ1aWxkZXJzIHdobworY29uZmlndXJlIGxpYnBuZzoKKworMSkgQWxsIGZlYXR1cmUgbWFjcm9zIG5vdyBoYXZlIGNvbnNpc3RlbnQgbmFtaW5nOgorCisjZGVmaW5lIFBOR19OT19mZWF0dXJlIHR1cm5zIHRoZSBmZWF0dXJlIG9mZgorI2RlZmluZSBQTkdfZmVhdHVyZV9TVVBQT1JURUQgdHVybnMgdGhlIGZlYXR1cmUgb24KKworcG5nbGliY29uZi5oIGNvbnRhaW5zIG9uZSBsaW5lIGZvciBlYWNoIGZlYXR1cmUgbWFjcm8gd2hpY2ggaXMgZWl0aGVyOgorCisjZGVmaW5lIFBOR19mZWF0dXJlX1NVUFBPUlRFRAorCitpZiB0aGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgb3I6CisKKy8qI3VuZGVmIFBOR19mZWF0dXJlX1NVUFBPUlRFRCovCisKK2lmIGl0IGlzIG5vdC4gIExpYnJhcnkgY29kZSBjb25zaXN0ZW50bHkgY2hlY2tzIGZvciB0aGUgJ1NVUFBPUlRFRCcgbWFjcm8uCitJdCBkb2VzIG5vdCwgYW5kIGxpYnBuZyBhcHBsaWNhdGlvbnMgc2hvdWxkIG5vdCwgY2hlY2sgZm9yIHRoZSAnTk8nIG1hY3JvCit3aGljaCB3aWxsIG5vdCBub3JtYWxseSBiZSBkZWZpbmVkIGV2ZW4gaWYgdGhlIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZC4KK1RoZSAnTk8nIG1hY3JvcyBhcmUgb25seSB1c2VkIGludGVybmFsbHkgZm9yIHNldHRpbmcgb3Igbm90IHNldHRpbmcgdGhlCitjb3JyZXNwb25kaW5nICdTVVBQT1JURUQnIG1hY3Jvcy4KKworQ29tcGF0aWJpbGl0eSB3aXRoIHRoZSBvbGQgbmFtZXMgaXMgcHJvdmlkZWQgYXMgZm9sbG93czoKKworUE5HX0lOQ0hfQ09OVkVSU0lPTlMgdHVybnMgb24gUE5HX0lOQ0hfQ09OVkVSU0lPTlNfU1VQUE9SVEVECisKK0FuZCB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGRpc2FibGUgdGhlIGNvcnJlc3BvbmRpbmcgZmVhdHVyZToKKworUE5HX1NFVEpNUF9OT1RfU1VQUE9SVEVEIGRpc2FibGVzIFNFVEpNUAorUE5HX1JFQURfVFJBTlNGT1JNU19OT1RfU1VQUE9SVEVEIGRpc2FibGVzIFJFQURfVFJBTlNGT1JNUworUE5HX05PX1JFQURfQ09NUE9TSVRFRF9OT0RJViBkaXNhYmxlcyBSRUFEX0NPTVBPU0lURV9OT0RJVgorUE5HX1dSSVRFX1RSQU5TRk9STVNfTk9UX1NVUFBPUlRFRCBkaXNhYmxlcyBXUklURV9UUkFOU0ZPUk1TCitQTkdfUkVBRF9BTkNJTExBUllfQ0hVTktTX05PVF9TVVBQT1JURUQgZGlzYWJsZXMgUkVBRF9BTkNJTExBUllfQ0hVTktTCitQTkdfV1JJVEVfQU5DSUxMQVJZX0NIVU5LU19OT1RfU1VQUE9SVEVEIGRpc2FibGVzIFdSSVRFX0FOQ0lMTEFSWV9DSFVOS1MKKworTGlicmFyeSBidWlsZGVycyBzaG91bGQgcmVtb3ZlIHVzZSBvZiB0aGUgYWJvdmUsIGluY29uc2lzdGVudCwgbmFtZXMuCisKKzIpIFdhcm5pbmcgYW5kIGVycm9yIG1lc3NhZ2UgZm9ybWF0dGluZyB3YXMgcHJldmlvdXNseSBjb25kaXRpb25hbCBvbgordGhlIFNURElPIGZlYXR1cmUuIFRoZSBsaWJyYXJ5IGhhcyBiZWVuIGNoYW5nZWQgdG8gdXNlIHRoZQorQ09OU09MRV9JTyBmZWF0dXJlIGluc3RlYWQuIFRoaXMgbWVhbnMgdGhhdCBpZiBDT05TT0xFX0lPIGlzIGRpc2FibGVkCit0aGUgbGlicmFyeSBubyBsb25nZXIgdXNlcyB0aGUgcHJpbnRmKDMpIGZ1bmN0aW9ucywgZXZlbiB0aG91Z2ggdGhlCitkZWZhdWx0IHJlYWQvd3JpdGUgaW1wbGVtZW50YXRpb25zIHVzZSAoRklMRSkgc3R5bGUgc3RkaW8uaCBmdW5jdGlvbnMuCisKKzMpIFRocmVlIGZlYXR1cmUgbWFjcm9zIG5vdyBjb250cm9sIHRoZSBmaXhlZC9mbG9hdGluZyBwb2ludCBkZWNpc2lvbnM6CisKK1BOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQgZW5hYmxlcyB0aGUgZmxvYXRpbmcgcG9pbnQgQVBJcworCitQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVEIGVuYWJsZXMgdGhlIGZpeGVkIHBvaW50IEFQSXM7IGhvd2V2ZXIsIGluCitwcmFjdGljZSB0aGVzZSBhcmUgbm9ybWFsbHkgcmVxdWlyZWQgaW50ZXJuYWxseSBhbnl3YXkgKGJlY2F1c2UgdGhlIFBORworZmlsZSBmb3JtYXQgaXMgZml4ZWQgcG9pbnQpLCB0aGVyZWZvcmUgaW4gbW9zdCBjYXNlcyBQTkdfTk9fRklYRURfUE9JTlQKK21lcmVseSBzdG9wcyB0aGUgZnVuY3Rpb24gZnJvbSBiZWluZyBleHBvcnRlZC4KKworUE5HX0ZMT0FUSU5HX0FSSVRITUVUSUNfU1VQUE9SVEVEIGNob29zZXMgYmV0d2VlbiB0aGUgaW50ZXJuYWwgZmxvYXRpbmcKK3BvaW50IGltcGxlbWVudGF0aW9uIG9yIHRoZSBmaXhlZCBwb2ludCBvbmUuICBUeXBpY2FsbHkgdGhlIGZpeGVkIHBvaW50CitpbXBsZW1lbnRhdGlvbiBpcyBsYXJnZXIgYW5kIHNsb3dlciB0aGFuIHRoZSBmbG9hdGluZyBwb2ludCBpbXBsZW1lbnRhdGlvbgorb24gYSBzeXN0ZW0gdGhhdCBzdXBwb3J0cyBmbG9hdGluZyBwb2ludDsgaG93ZXZlciwgaXQgbWF5IGJlIGZhc3RlciBvbiBhCitzeXN0ZW0gd2hpY2ggbGFja3MgZmxvYXRpbmcgcG9pbnQgaGFyZHdhcmUgYW5kIHRoZXJlZm9yZSB1c2VzIGEgc29mdHdhcmUKK2VtdWxhdGlvbi4KKworNCkgQWRkZWQgUE5HX3tSRUFELFdSSVRFfV9JTlRfRlVOQ1RJT05TX1NVUFBPUlRFRC4gIFRoaXMgYWxsb3dzIHRoZQorZnVuY3Rpb25zIHRvIHJlYWQgYW5kIHdyaXRlIGludHMgdG8gYmUgZGlzYWJsZWQgaW5kZXBlbmRlbnRseSBvZgorUE5HX1VTRV9SRUFEX01BQ1JPUywgd2hpY2ggYWxsb3dzIGxpYnBuZyB0byBiZSBidWlsdCB3aXRoIHRoZSBmdW5jdGlvbnMKK2V2ZW4gdGhvdWdoIHRoZSBkZWZhdWx0IGlzIHRvIHVzZSB0aGUgbWFjcm9zIC0gdGhpcyBhbGxvd3MgYXBwbGljYXRpb25zCit0byBjaG9vc2UgYXQgYXBwIGJ1aWxkdGltZSB3aGV0aGVyIG9yIG5vdCB0byB1c2UgbWFjcm9zIChwcmV2aW91c2x5CitpbXBvc3NpYmxlIGJlY2F1c2UgdGhlIGZ1bmN0aW9ucyB3ZXJlbid0IGluIHRoZSBkZWZhdWx0IGJ1aWxkLikKKworLlNIIFhJSS4gIENoYW5nZXMgdG8gTGlicG5nIGZyb20gdmVyc2lvbiAxLjUueCB0byAxLjYueAorCitBICJzaW1wbGlmaWVkIEFQSSIgaGFzIGJlZW4gYWRkZWQgKHNlZSBkb2N1bWVudGF0aW9uIGluIHBuZy5oIGFuZCBhIHNpbXBsZQorZXhhbXBsZSBpbiBjb250cmliL2V4YW1wbGVzL3BuZ3RvcG5nLmMpLiAgVGhlIG5ldyBwdWJsaWNseSB2aXNpYmxlIEFQSQoraW5jbHVkZXMgdGhlIGZvbGxvd2luZzoKKworICAgbWFjcm9zOgorICAgICBQTkdfRk9STUFUXyoKKyAgICAgUE5HX0lNQUdFXyoKKyAgIHN0cnVjdHVyZXM6CisgICAgIHBuZ19jb250cm9sCisgICAgIHBuZ19pbWFnZQorICAgcmVhZCBmdW5jdGlvbnMKKyAgICAgcG5nX2ltYWdlX2JlZ2luX3JlYWRfZnJvbV9maWxlKCkKKyAgICAgcG5nX2ltYWdlX2JlZ2luX3JlYWRfZnJvbV9zdGRpbygpCisgICAgIHBuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fbWVtb3J5KCkKKyAgICAgcG5nX2ltYWdlX2ZpbmlzaF9yZWFkKCkKKyAgICAgcG5nX2ltYWdlX2ZyZWUoKQorICAgd3JpdGUgZnVuY3Rpb25zCisgICAgIHBuZ19pbWFnZV93cml0ZV90b19maWxlKCkKKyAgICAgcG5nX2ltYWdlX3dyaXRlX3RvX3N0ZGlvKCkKKworU3RhcnRpbmcgd2l0aCBsaWJwbmctMS42LjAsIHlvdSBjYW4gY29uZmlndXJlIGxpYnBuZyB0byBwcmVmaXggYWxsIGV4cG9ydGVkCitzeW1ib2xzLCB1c2luZyB0aGUgUE5HX1BSRUZJWCBtYWNyby4KKworV2Ugbm8gbG9uZ2VyIGluY2x1ZGUgc3RyaW5nLmggaW4gcG5nLmguICBUaGUgaW5jbHVkZSBzdGF0ZW1lbnQgaGFzIGJlZW4gbW92ZWQKK3RvIHBuZ3ByaXYuaCwgd2hlcmUgaXQgaXMgbm90IGFjY2Vzc2libGUgYnkgYXBwbGljYXRpb25zLiAgQXBwbGljYXRpb25zIHRoYXQKK25lZWQgYWNjZXNzIHRvIGluZm9ybWF0aW9uIGluIHN0cmluZy5oIG11c3QgYWRkIGFuICcjaW5jbHVkZSA8c3RyaW5nLmg+JworZGlyZWN0aXZlLiAgSXQgZG9lcyBub3QgbWF0dGVyIHdoZXRoZXIgdGhpcyBpcyBwbGFjZWQgcHJpb3IgdG8gb3IgYWZ0ZXIKK3RoZSAnI2luY2x1ZGUgInBuZy5oIicgZGlyZWN0aXZlLgorCitUaGUgZm9sbG93aW5nIEFQSSBhcmUgbm93IERFUFJFQ0FURUQ6CisgICBwbmdfaW5mb19pbml0XzMoKQorICAgcG5nX2NvbnZlcnRfdG9fcmZjMTEyMygpIHdoaWNoIGhhcyBiZWVuIHJlcGxhY2VkCisgICAgIHdpdGggcG5nX2NvbnZlcnRfdG9fcmZjMTEyM19idWZmZXIoKQorICAgcG5nX21hbGxvY19kZWZhdWx0KCkKKyAgIHBuZ19mcmVlX2RlZmF1bHQoKQorICAgcG5nX3Jlc2V0X3pzdHJlYW0oKQorCitUaGUgZm9sbG93aW5nIGhhdmUgYmVlbiByZW1vdmVkOgorICAgcG5nX2dldF9pb19jaHVua19uYW1lKCksIHdoaWNoIGhhcyBiZWVuIHJlcGxhY2VkCisgICAgIHdpdGggcG5nX2dldF9pb19jaHVua190eXBlKCkuICBUaGUgbmV3CisgICAgIGZ1bmN0aW9uIHJldHVybnMgYSAzMi1iaXQgaW50ZWdlciBpbnN0ZWFkIG9mCisgICAgIGEgc3RyaW5nLgorICAgVGhlIHBuZ19zaXplb2YoKSwgcG5nX3N0cmxlbigpLCBwbmdfbWVtY3B5KCksIHBuZ19tZW1jbXAoKSwgYW5kCisgICAgIHBuZ19tZW1zZXQoKSBtYWNyb3MgYXJlIG5vIGxvbmdlciB1c2VkIGluIHRoZSBsaWJwbmcgc291cmNlcyBhbmQKKyAgICAgaGF2ZSBiZWVuIHJlbW92ZWQuICBUaGVzZSBoYWQgYWxyZWFkeSBiZWVuIG1hZGUgaW52aXNpYmxlIHRvIGFwcGxpY2F0aW9ucworICAgICAoaS5lLiwgZGVmaW5lZCBpbiB0aGUgcHJpdmF0ZSBwbmdwcml2LmggaGVhZGVyIGZpbGUpIHNpbmNlIGxpYnBuZy0xLjUuMC4KKworVGhlIHNpZ25hdHVyZXMgb2YgbWFueSBleHBvcnRlZCBmdW5jdGlvbnMgd2VyZSBjaGFuZ2VkLCBzdWNoIHRoYXQKKyAgIHBuZ19zdHJ1Y3RwIGJlY2FtZSBwbmdfc3RydWN0cnAgb3IgcG5nX2NvbnN0X3N0cnVjdHJwCisgICBwbmdfaW5mb3AgYmVjYW1lIHBuZ19pbmZvcnAgb3IgcG5nX2NvbnN0X2luZm9ycAord2hlcmUgInJwIiBpbmRpY2F0ZXMgYSAicmVzdHJpY3RlZCBwb2ludGVyIi4KKworRHJvcHBlZCBzdXBwb3J0IGZvciAxNi1iaXQgcGxhdGZvcm1zLiBUaGUgc3VwcG9ydCBmb3IgRkFSL2ZhciB0eXBlcyBoYXMKK2JlZW4gZWxpbWluYXRlZCBhbmQgdGhlIGRlZmluaXRpb24gb2YgcG5nX2FsbG9jX3NpemVfdCBpcyBub3cgY29udHJvbGxlZAorYnkgYSBmbGFnIHNvIHRoYXQgJ3NtYWxsIHNpemVfdCcgc3lzdGVtcyBjYW4gc2VsZWN0IGl0IGlmIG5lY2Vzc2FyeS4KKworRXJyb3IgZGV0ZWN0aW9uIGluIHNvbWUgY2h1bmtzIGhhcyBpbXByb3ZlZDsgaW4gcGFydGljdWxhciB0aGUgaUNDUCBjaHVuaworcmVhZGVyIG5vdyBkb2VzIHByZXR0eSBjb21wbGV0ZSB2YWxpZGF0aW9uIG9mIHRoZSBiYXNpYyBmb3JtYXQuICBTb21lIGJhZAorcHJvZmlsZXMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgYWNjZXB0ZWQgYXJlIG5vdyBhY2NlcHRlZCB3aXRoIGEgd2FybmluZyBvcgorcmVqZWN0ZWQsIGRlcGVuZGluZyB1cG9uIHRoZSBwbmdfc2V0X2Jlbmlnbl9lcnJvcnMoKSBzZXR0aW5nLCBpbiBwYXJ0aWN1bGFyCit0aGUgdmVyeSBvbGQgYnJva2VuIE1pY3Jvc29mdC9IUCAzMTQ0LWJ5dGUgc1JHQiBwcm9maWxlLiAgU3RhcnRpbmcgd2l0aAorbGlicG5nLTEuNi4xMSwgcmVjb2duaXppbmcgYW5kIGNoZWNraW5nIHNSR0IgcHJvZmlsZXMgY2FuIGJlIGF2b2lkZWQgYnkKK21lYW5zIG9mCisKKyAgICAjaWYgZGVmaW5lZChQTkdfU0tJUF9zUkdCX0NIRUNLX1BST0ZJTEUpICYmIFwKKyAgICAgICAgZGVmaW5lZChQTkdfU0VUX09QVElPTl9TVVBQT1JURUQpCisgICAgICAgcG5nX3NldF9vcHRpb24ocG5nX3B0ciwgUE5HX1NLSVBfc1JHQl9DSEVDS19QUk9GSUxFLAorICAgICAgICAgICBQTkdfT1BUSU9OX09OKTsKKyAgICAjZW5kaWYKKworSXQncyBub3QgYSBnb29kIGlkZWEgdG8gZG8gdGhpcyBpZiB5b3UgYXJlIHVzaW5nIHRoZSAic2ltcGxpZmllZCBBUEkiLAord2hpY2ggbmVlZHMgdG8gYmUgYWJsZSB0byByZWNvZ25pemUgc1JHQiBwcm9maWxlcyBjb252ZXllZCB2aWEgdGhlIGlDQ1AKK2NodW5rLgorCitUaGUgUE5HIHNwZWMgcmVxdWlyZW1lbnQgdGhhdCBvbmx5IGdyYXlzY2FsZSBwcm9maWxlcyBtYXkgYXBwZWFyIGluIGltYWdlcword2l0aCBjb2xvciB0eXBlIDAgb3IgNCBhbmQgdGhhdCBldmVuIGlmIHRoZSBpbWFnZSBvbmx5IGNvbnRhaW5zIGdyYXkgcGl4ZWxzLAorb25seSBSR0IgcHJvZmlsZXMgbWF5IGFwcGVhciBpbiBpbWFnZXMgd2l0aCBjb2xvciB0eXBlIDIsIDMsIG9yIDYsIGlzIG5vdworZW5mb3JjZWQuICBUaGUgc1JHQiBjaHVuayBpcyBhbGxvd2VkIHRvIGFwcGVhciBpbiBpbWFnZXMgd2l0aCBhbnkgY29sb3IgdHlwZQorYW5kIGlzIGludGVycHJldGVkIGJ5IGxpYnBuZyB0byBjb252ZXkgYSBvbmUtdHJhY2VyLWN1cnZlIGdyYXkgcHJvZmlsZSBvciBhCit0aHJlZS10cmFjZXItY3VydmUgUkdCIHByb2ZpbGUgYXMgYXBwcm9wcmlhdGUuCisKK1ByaW9yIHRvIGxpYnBuZy0xLjYuMCBhIHdhcm5pbmcgd291bGQgYmUgaXNzdWVkIGlmIHRoZSBpVFh0IGNodW5rIGNvbnRhaW5lZAorYW4gZW1wdHkgbGFuZ3VhZ2UgZmllbGQgb3IgYW4gZW1wdHkgdHJhbnNsYXRlZCBrZXl3b3JkLiAgQm90aCBvZiB0aGVzZQorYXJlIGFsbG93ZWQgYnkgdGhlIFBORyBzcGVjaWZpY2F0aW9uLCBzbyB0aGVzZSB3YXJuaW5ncyBhcmUgbm8gbG9uZ2VyIGlzc3VlZC4KKworVGhlIGxpYnJhcnkgbm93IGlzc3VlcyBhbiBlcnJvciBpZiB0aGUgYXBwbGljYXRpb24gYXR0ZW1wdHMgdG8gc2V0IGEKK3RyYW5zZm9ybSBhZnRlciBpdCBjYWxscyBwbmdfcmVhZF91cGRhdGVfaW5mbygpIG9yIGlmIGl0IGF0dGVtcHRzIHRvIGNhbGwKK2JvdGggcG5nX3JlYWRfdXBkYXRlX2luZm8oKSBhbmQgcG5nX3N0YXJ0X3JlYWRfaW1hZ2UoKSBvciB0byBjYWxsIGVpdGhlcgorb2YgdGhlbSBtb3JlIHRoYW4gb25jZS4KKworVGhlIGRlZmF1bHQgY29uZGl0aW9uIGZvciBiZW5pZ25fZXJyb3JzIGlzIG5vdyB0byB0cmVhdCBiZW5pZ24gZXJyb3JzIGFzCit3YXJuaW5ncyB3aGlsZSByZWFkaW5nIGFuZCBhcyBlcnJvcnMgd2hpbGUgd3JpdGluZy4KKworVGhlIGxpYnJhcnkgbm93IGlzc3VlcyBhIHdhcm5pbmcgaWYgYm90aCBiYWNrZ3JvdW5kIHByb2Nlc3NpbmcgYW5kIFJHQiB0bworZ3JheSBhcmUgdXNlZCB3aGVuIGdhbW1hIGNvcnJlY3Rpb24gaGFwcGVucy4gQXMgd2l0aCBwcmV2aW91cyB2ZXJzaW9ucyBvZgordGhlIGxpYnJhcnkgdGhlIHJlc3VsdHMgYXJlIG51bWVyaWNhbGx5IHZlcnkgaW5jb3JyZWN0IGluIHRoaXMgY2FzZS4KKworVGhlcmUgYXJlIHNvbWUgbWlub3IgYXJpdGhtZXRpYyBjaGFuZ2VzIGluIHNvbWUgdHJhbnNmb3JtcyBzdWNoIGFzCitwbmdfc2V0X2JhY2tncm91bmQoKSwgdGhhdCBtaWdodCBiZSBkZXRlY3RlZCBieSBjZXJ0YWluIHJlZ3Jlc3Npb24gdGVzdHMuCisKK1Vua25vd24gY2h1bmsgaGFuZGxpbmcgaGFzIGJlZW4gaW1wcm92ZWQgaW50ZXJuYWxseSwgd2l0aG91dCBhbnkgQVBJIGNoYW5nZS4KK1RoaXMgYWRkcyBtb3JlIGNvcnJlY3Qgb3B0aW9uIGNvbnRyb2wgb2YgdGhlIHVua25vd24gaGFuZGxpbmcsIGNvcnJlY3RzCithIHByZS1leGlzdGluZyBidWcgd2hlcmUgdGhlIHBlci1jaHVuayAna2VlcCcgc2V0dGluZyBpcyBpZ25vcmVkLCBhbmQgbWFrZXMKK2l0IHBvc3NpYmxlIHRvIHNraXAgSURBVCBjaHVua3MgaW4gdGhlIHNlcXVlbnRpYWwgcmVhZGVyLgorCitUaGUgbWFjaGluZS1nZW5lcmF0ZWQgY29uZmlndXJlIGZpbGVzIGFyZSBubyBsb25nZXIgaW5jbHVkZWQgaW4gYnJhbmNoZXMKK2xpYnBuZzE2IGFuZCBsYXRlciBvZiB0aGUgR0lUIHJlcG9zaXRvcnkuICBUaGV5IGNvbnRpbnVlIHRvIGJlIGluY2x1ZGVkCitpbiB0aGUgdGFyYmFsbCByZWxlYXNlcywgaG93ZXZlci4KKworTGlicG5nLTEuNi4wIHRocm91Z2ggMS42LjIgdXNlZCB0aGUgQ01GIGJ5dGVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIElEQVQKK3N0cmVhbSB0byBzZXQgdGhlIHNpemUgb2YgdGhlIHNsaWRpbmcgd2luZG93IGZvciByZWFkaW5nIGluc3RlYWQgb2YgdXNpbmcgdGhlCitkZWZhdWx0IDMyLWtieXRlIHNsaWRpbmcgd2luZG93IHNpemUuICBJdCB3YXMgZGlzY292ZXJlZCB0aGF0IHRoZXJlIGFyZQoraHVuZHJlZHMgb2YgUE5HIGZpbGVzIGluIHRoZSB3aWxkIHRoYXQgaGF2ZSBpbmNvcnJlY3QgQ01GIGJ5dGVzIHRoYXQgY2F1c2VkCit6bGliIHRvIGlzc3VlIHRoZSAiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siIGVycm9yIGFuZCByZWplY3QgdGhlIGZpbGUuCitMaWJwbmctMS42LjMgYW5kIGxhdGVyIGNhbGN1bGF0ZSB0aGVpciBvd24gc2FmZSBDTUYgZnJvbSB0aGUgaW1hZ2UgZGltZW5zaW9ucywKK3Byb3ZpZGUgYSB3YXkgdG8gcmV2ZXJ0IHRvIHRoZSBsaWJwbmctMS41LnggYmVoYXZpb3IgKGlnbm9yaW5nIHRoZSBDTUYgYnl0ZXMKK2FuZCB1c2luZyBhIDMyLWtieXRlIHNsaWRpbmcgd2luZG93KSwgYnkgdXNpbmcKKworICAgIHBuZ19zZXRfb3B0aW9uKHBuZ19wdHIsIFBOR19NQVhJTVVNX0lORkxBVEVfV0lORE9XLAorICAgICAgICBQTkdfT1BUSU9OX09OKTsKKworYW5kIHByb3ZpZGUgYSB0b29sIChjb250cmliL3Rvb2xzL3BuZ2ZpeCkgZm9yIHJld3JpdGluZyBhIFBORyBmaWxlIHdoaWxlCitvcHRpbWl6aW5nIHRoZSBDTUYgYnl0ZXMgaW4gaXRzIElEQVQgY2h1bmsgY29ycmVjdGx5LgorCitMaWJwbmctMS42LjAgYW5kIGxpYnBuZy0xLjYuMSB3cm90ZSB1bmNvbXByZXNzZWQgaVRYdCBjaHVua3Mgd2l0aCB0aGUgd3JvbmcKK2xlbmd0aCwgd2hpY2ggcmVzdWx0ZWQgaW4gUE5HIGZpbGVzIHRoYXQgY2Fubm90IGJlIHJlYWQgYmV5b25kIHRoZSBiYWQgaVRYdAorY2h1bmsuICBUaGlzIGVycm9yIHdhcyBmaXhlZCBpbiBsaWJwbmctMS42LjMsIGFuZCBhIHRvb2wgKGNhbGxlZAorY29udHJpYi90b29scy9wbmctZml4LWl0eHQpIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBsaWJwbmcgZGlzdHJpYnV0aW9uLgorCitTdGFydGluZyB3aXRoIGxpYnBuZy0xLjYuMTcsIHRoZSBQTkdfU0FGRV9MSU1JVFMgbWFjcm8gd2FzIGVsaW1pbmF0ZWQKK2FuZCBzYWZlIGxpbWl0cyBhcmUgdXNlZCBieSBkZWZhdWx0ICh1c2VycyB3aG8gbmVlZCBsYXJnZXIgbGltaXRzCitjYW4gc3RpbGwgb3ZlcnJpZGUgdGhlbSBhdCBjb21waWxlIHRpbWUgb3IgcnVuIHRpbWUsIGFzIGRlc2NyaWJlZCBhYm92ZSkuCisKK1RoZSBuZXcgbGltaXRzIGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ICAgc3BlYyBsaW1pdAorICAgcG5nX3VzZXJfd2lkdGhfbWF4ICAgICAgICAgMSwwMDAsMDAwICAyLDE0Nyw0ODMsNjQ3CisgICBwbmdfdXNlcl9oZWlnaHRfbWF4ICAgICAgICAxLDAwMCwwMDAgIDIsMTQ3LDQ4Myw2NDcKKyAgIHBuZ191c2VyX2NodW5rX2NhY2hlX21heCAgICAgICAgIDEyOCAgdW5saW1pdGVkCisgICBwbmdfdXNlcl9jaHVua19tYWxsb2NfbWF4ICA4LDAwMCwwMDAgIHVubGltaXRlZAorCitTdGFydGluZyB3aXRoIGxpYnBuZy0xLjYuMTgsIGEgUE5HX1JFTEVBU0VfQlVJTEQgbWFjcm8gd2FzIGFkZGVkLCB3aGljaCBhbGxvd3MKK2xpYnJhcnkgYnVpbGRlcnMgdG8gY29udHJvbCBjb21waWxhdGlvbiBmb3IgYW4gaW5zdGFsbGVkIHN5c3RlbSAoYSByZWxlYXNlIGJ1aWxkKS4KK0l0IGNhbiBiZSBzZXQgZm9yIHRlc3RpbmcgZGVidWcgb3IgYmV0YSBidWlsZHMgdG8gZW5zdXJlIHRoYXQgdGhleSB3aWxsIGNvbXBpbGUKK3doZW4gdGhlIGJ1aWxkIHR5cGUgaXMgc3dpdGNoZWQgdG8gUkMgb3IgU1RBQkxFLiBJbiBlc3NlbmNlIHRoaXMgb3ZlcnJpZGVzIHRoZQorUE5HX0xJQlBOR19CVUlMRF9CQVNFX1RZUEUgZGVmaW5pdGlvbiB3aGljaCBpcyBub3QgZGlyZWN0bHkgdXNlciBjb250cm9sbGFibGUuCisKK1N0YXJ0aW5nIHdpdGggbGlicG5nLTEuNi4xOSwgYXR0ZW1wdGluZyB0byBzZXQgYW4gb3Zlci1sZW5ndGggUExURSBjaHVuaworaXMgYW4gZXJyb3IuIFByZXZpb3VzbHkgdGhpcyByZXF1aXJlbWVudCBvZiB0aGUgUE5HIHNwZWNpZmljYXRpb24gd2FzIG5vdAorZW5mb3JjZWQsIGFuZCB0aGUgcGFsZXR0ZSB3YXMgYWx3YXlzIGxpbWl0ZWQgdG8gMjU2IGVudHJpZXMuIEFuIG92ZXItbGVuZ3RoCitQTFRFIGNodW5rIGZvdW5kIGluIGFuIGlucHV0IFBORyBpcyBzaWxlbnRseSB0cnVuY2F0ZWQuCisKKy5TSCBYSUlJLiAgRGV0ZWN0aW5nIGxpYnBuZworCitUaGUgcG5nX2dldF9pb19wdHIoKSBmdW5jdGlvbiBoYXMgYmVlbiBwcmVzZW50IHNpbmNlIGxpYnBuZy0wLjg4LCBoYXMgbmV2ZXIKK2NoYW5nZWQsIGFuZCBpcyB1bmFmZmVjdGVkIGJ5IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIG1hY3Jvcy4gIEl0IGlzIHRoZQorYmVzdCBjaG9pY2UgZm9yIHVzZSBpbiBjb25maWd1cmUgc2NyaXB0cyBmb3IgZGV0ZWN0aW5nIHRoZSBwcmVzZW5jZSBvZiBhbnkKK2xpYnBuZyB2ZXJzaW9uIHNpbmNlIDAuODguICBJbiBhbiBhdXRvY29uZiAiY29uZmlndXJlLmluIiB5b3UgY291bGQgdXNlCisKKyAgICBBQ19DSEVDS19MSUIocG5nLCBwbmdfZ2V0X2lvX3B0ciwgLi4uCisKKy5TSCBYVi4gU291cmNlIGNvZGUgcmVwb3NpdG9yeQorCitTaW5jZSBhYm91dCBGZWJydWFyeSAyMDA5LCB2ZXJzaW9uIDEuMi4zNCwgbGlicG5nIGhhcyBiZWVuIHVuZGVyICJnaXQiIHNvdXJjZQorY29udHJvbC4gIFRoZSBnaXQgcmVwb3NpdG9yeSB3YXMgYnVpbHQgZnJvbSBvbGQgbGlicG5nLXgueS56LnRhci5neiBmaWxlcworZ29pbmcgYmFjayB0byB2ZXJzaW9uIDAuNzAuICBZb3UgY2FuIGFjY2VzcyB0aGUgZ2l0IHJlcG9zaXRvcnkgKHJlYWQgb25seSkKK2F0CisKKyAgICBnaXQ6Ly9naXQuY29kZS5zZi5uZXQvcC9saWJwbmcvY29kZQorCitvciB5b3UgY2FuIGJyb3dzZSBpdCB3aXRoIGEgd2ViIGJyb3dzZXIgYnkgc2VsZWN0aW5nIHRoZSAiY29kZSIgYnV0dG9uIGF0CisKKyAgICBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJwbmcKKworUGF0Y2hlcyBjYW4gYmUgc2VudCB0byBnbGVubnJwIGF0IHVzZXJzLnNvdXJjZWZvcmdlLm5ldCBvciB0bworcG5nLW1uZy1pbXBsZW1lbnQgYXQgbGlzdHMuc291cmNlZm9yZ2UubmV0IG9yIHlvdSBjYW4gdXBsb2FkIHRoZW0gdG8KK3RoZSBsaWJwbmcgYnVnIHRyYWNrZXIgYXQKKworICAgIGh0dHA6Ly9saWJwbmcuc291cmNlZm9yZ2UubmV0CisKK1dlIGFsc28gYWNjZXB0IHBhdGNoZXMgYnVpbHQgZnJvbSB0aGUgdGFyIG9yIHppcCBkaXN0cmlidXRpb25zLCBhbmQKK3NpbXBsZSB2ZXJiYWwgZGlzY3JpcHRpb25zIG9mIGJ1ZyBmaXhlcywgcmVwb3J0ZWQgZWl0aGVyIHRvIHRoZQorU291cmNlRm9yZ2UgYnVnIHRyYWNrZXIsIHRvIHRoZSBwbmctbW5nLWltcGxlbWVudCBhdCBsaXN0cy5zZi5uZXQKK21haWxpbmcgbGlzdCwgb3IgZGlyZWN0bHkgdG8gZ2xlbm5ycC4KKworLlNIIFhWLiBDb2Rpbmcgc3R5bGUKKworT3VyIGNvZGluZyBzdHlsZSBpcyBzaW1pbGFyIHRvIHRoZSAiQWxsbWFuIiBzdHlsZQorKFNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0luZGVudF9zdHlsZSNBbGxtYW5fc3R5bGUpLCB3aXRoIGN1cmx5CiticmFjZXMgb24gc2VwYXJhdGUgbGluZXM6CisKKyAgICBpZiAoY29uZGl0aW9uKQorICAgIHsKKyAgICAgICBhY3Rpb247CisgICAgfQorCisgICAgZWxzZSBpZiAoYW5vdGhlciBjb25kaXRpb24pCisgICAgeworICAgICAgIGFub3RoZXIgYWN0aW9uOworICAgIH0KKworVGhlIGJyYWNlcyBjYW4gYmUgb21pdHRlZCBmcm9tIHNpbXBsZSBvbmUtbGluZSBhY3Rpb25zOgorCisgICAgaWYgKGNvbmRpdGlvbikKKyAgICAgICByZXR1cm4gKDApOworCitXZSB1c2UgMy1zcGFjZSBpbmRlbnRhdGlvbiwgZXhjZXB0IGZvciBjb250aW51ZWQgc3RhdGVtZW50cyB3aGljaAorYXJlIHVzdWFsbHkgaW5kZW50ZWQgdGhlIHNhbWUgYXMgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIHN0YXRlbWVudAorcGx1cyBmb3VyIG1vcmUgc3BhY2VzLgorCitGb3IgbWFjcm8gZGVmaW5pdGlvbnMgd2UgdXNlIDItc3BhY2UgaW5kZW50YXRpb24sIGFsd2F5cyBsZWF2aW5nIHRoZSAiIyIKK2luIHRoZSBmaXJzdCBjb2x1bW4uCisKKyAgICAjaWZuZGVmIFBOR19OT19GRUFUVVJFCisgICAgIyAgaWZuZGVmIFBOR19GRUFUVVJFX1NVUFBPUlRFRAorICAgICMgICAgZGVmaW5lIFBOR19GRUFUVVJFX1NVUFBPUlRFRAorICAgICMgIGVuZGlmCisgICAgI2VuZGlmCisKK0NvbW1lbnRzIGFwcGVhciB3aXRoIHRoZSBsZWFkaW5nICIvKiIgYXQgdGhlIHNhbWUgaW5kZW50YXRpb24gYXMKK3RoZSBzdGF0ZW1lbnQgdGhhdCBmb2xsb3dzIHRoZSBjb21tZW50OgorCisgICAgLyogU2luZ2xlLWxpbmUgY29tbWVudCAqLworICAgIHN0YXRlbWVudDsKKworICAgIC8qIFRoaXMgaXMgYSBtdWx0aXBsZS1saW5lCisgICAgICogY29tbWVudC4KKyAgICAgKi8KKyAgICBzdGF0ZW1lbnQ7CisKK1Zlcnkgc2hvcnQgY29tbWVudHMgY2FuIGJlIHBsYWNlZCBhZnRlciB0aGUgZW5kIG9mIHRoZSBzdGF0ZW1lbnQKK3RvIHdoaWNoIHRoZXkgcGVydGFpbjoKKworICAgIHN0YXRlbWVudDsgICAgLyogY29tbWVudCAqLworCitXZSBkb24ndCB1c2UgQysrIHN0eWxlICgiLy8iKSBjb21tZW50cy4gV2UgaGF2ZSwgaG93ZXZlciwKK3VzZWQgdGhlbSBpbiB0aGUgcGFzdCBpbiBzb21lIG5vdy1hYmFuZG9uZWQgTU1YIGFzc2VtYmxlcgorY29kZS4KKworRnVuY3Rpb25zIGFuZCB0aGVpciBjdXJseSBicmFjZXMgYXJlIG5vdCBpbmRlbnRlZCwgYW5kCitleHBvcnRlZCBmdW5jdGlvbnMgYXJlIG1hcmtlZCB3aXRoIFBOR0FQSToKKworIC8qIFRoaXMgaXMgYSBwdWJsaWMgZnVuY3Rpb24gdGhhdCBpcyB2aXNpYmxlIHRvCisgICogYXBwbGljYXRpb24gcHJvZ3JhbW1lcnMuIEl0IGRvZXMgdGh1cy1hbmQtc28uCisgICovCisgdm9pZCBQTkdBUEkKKyBwbmdfZXhwb3J0ZWRfZnVuY3Rpb24ocG5nX3B0ciwgcG5nX2luZm8sIGZvbykKKyB7CisgICAgYm9keTsKKyB9CisKK1RoZSByZXR1cm4gdHlwZSBhbmQgZGVjb3JhdGlvbnMgYXJlIHBsYWNlZCBvbiBhIHNlcGFyYXRlIGxpbmUKK2FoZWFkIG9mIHRoZSBmdW5jdGlvbiBuYW1lLCBhcyBpbGx1c3RyYXRlZCBhYm92ZS4KKworVGhlIHByb3RvdHlwZXMgZm9yIGFsbCBleHBvcnRlZCBmdW5jdGlvbnMgYXBwZWFyIGluIHBuZy5oLAorYWJvdmUgdGhlIGNvbW1lbnQgdGhhdCBzYXlzCisKKyAgICAvKiBNYWludGFpbmVyOiBQdXQgbmV3IHB1YmxpYyBwcm90b3R5cGVzIGhlcmUgLi4uICovCisKK1dlIG1hcmsgYWxsIG5vbi1leHBvcnRlZCBmdW5jdGlvbnMgd2l0aCAiLyogUFJJVkFURSAqLyIiOgorCisgdm9pZCAvKiBQUklWQVRFICovCisgcG5nX25vbl9leHBvcnRlZF9mdW5jdGlvbihwbmdfcHRyLCBwbmdfaW5mbywgZm9vKQorIHsKKyAgICBib2R5OworIH0KKworVGhlIHByb3RvdHlwZXMgZm9yIG5vbi1leHBvcnRlZCBmdW5jdGlvbnMgKGV4Y2VwdCBmb3IgdGhvc2UgaW4KK3BuZ3Rlc3QpIGFwcGVhciBpbiBwbmdwcml2LmggYWJvdmUgdGhlIGNvbW1lbnQgdGhhdCBzYXlzCisKKyAgLyogTWFpbnRhaW5lcjogUHV0IG5ldyBwcml2YXRlIHByb3RvdHlwZXMgaGVyZSBeICovCisKK1RvIGF2b2lkIHBvbGx1dGluZyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSwgdGhlIG5hbWVzIG9mIGFsbCBleHBvcnRlZAorZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgYmVnaW4gd2l0aCAicG5nXyIsIGFuZCBhbGwgcHVibGljbHkgdmlzaWJsZSBDCitwcmVwcm9jZXNzb3IgbWFjcm9zIGJlZ2luIHdpdGggIlBORyIuICBXZSByZXF1ZXN0IHRoYXQgYXBwbGljYXRpb25zIHRoYXQKK3VzZSBsaWJwbmcgKm5vdCogYmVnaW4gYW55IG9mIHRoZWlyIG93biBzeW1ib2xzIHdpdGggZWl0aGVyIG9mIHRoZXNlIHN0cmluZ3MuCisKK1dlIHB1dCBhIHNwYWNlIGFmdGVyIHRoZSAic2l6ZW9mIiBvcGVyYXRvciBhbmQgd2Ugb21pdCB0aGUKK29wdGlvbmFsIHBhcmVudGhlc2VzIGFyb3VuZCBpdHMgYXJndW1lbnQgd2hlbiB0aGUgYXJndW1lbnQKK2lzIGFuIGV4cHJlc3Npb24sIG5vdCBhIHR5cGUgbmFtZSwgYW5kIHdlIGFsd2F5cyBlbmNsb3NlIHRoZQorc2l6ZW9mIG9wZXJhdG9yLCB3aXRoIGl0cyBhcmd1bWVudCwgaW4gcGFyZW50aGVzZXM6CisKKyAgKHNpemVvZiAocG5nX3VpbnRfMzIpKQorICAoc2l6ZW9mIGFycmF5KQorCitQcmlvciB0byBsaWJwbmctMS42LjAgd2UgdXNlZCBhICJwbmdfc2l6ZW9mKCkiIG1hY3JvLCBmb3JtYXR0ZWQgYXMKK3Rob3VnaCBpdCB3ZXJlIGEgZnVuY3Rpb24uCisKK0NvbnRyb2wga2V5d29yZHMgaWYsIGZvciwgd2hpbGUsIGFuZCBzd2l0Y2ggYXJlIGFsd2F5cyBmb2xsb3dlZCBieSBhIHNwYWNlCit0byBkaXN0aW5ndWlzaCB0aGVtIGZyb20gZnVuY3Rpb24gY2FsbHMsIHdoaWNoIGhhdmUgbm8gdHJhaWxpbmcgc3BhY2UuIAorCitXZSBwdXQgYSBzcGFjZSBhZnRlciBlYWNoIGNvbW1hIGFuZCBhZnRlciBlYWNoIHNlbWljb2xvbgoraW4gImZvciIgc3RhdGVtZW50cywgYW5kIHdlIHB1dCBzcGFjZXMgYmVmb3JlIGFuZCBhZnRlciBlYWNoCitDIGJpbmFyeSBvcGVyYXRvciBhbmQgYWZ0ZXIgImZvciIgb3IgIndoaWxlIiwgYW5kIGJlZm9yZQorIj8iLiAgV2UgZG9uJ3QgcHV0IGEgc3BhY2UgYmV0d2VlbiBhIHR5cGVjYXN0IGFuZCB0aGUgZXhwcmVzc2lvbgorYmVpbmcgY2FzdCwgbm9yIGRvIHdlIHB1dCBvbmUgYmV0d2VlbiBhIGZ1bmN0aW9uIG5hbWUgYW5kIHRoZQorbGVmdCBwYXJlbnRoZXNpcyB0aGF0IGZvbGxvd3MgaXQ6CisKKyAgICBmb3IgKGkgPSAyOyBpID4gMDsgXC1cLWkpCisgICAgICAgeVtpXSA9IGEoeCkgKyAoaW50KWI7CisKK1dlIHByZWZlciAjaWZkZWYgYW5kICNpZm5kZWYgdG8gI2lmIGRlZmluZWQoKSBhbmQgI2lmICFkZWZpbmVkKCkKK3doZW4gdGhlcmUgaXMgb25seSBvbmUgbWFjcm8gYmVpbmcgdGVzdGVkLiAgV2UgYWx3YXlzIHVzZSBwYXJlbnRoZXNlcword2l0aCAiZGVmaW5lZCIuCisKK1dlIGV4cHJlc3MgaW50ZWdlciBjb25zdGFudHMgdGhhdCBhcmUgdXNlZCBhcyBiaXQgbWFza3MgaW4gaGV4IGZvcm1hdCwKK3dpdGggYW4gZXZlbiBudW1iZXIgb2YgbG93ZXItY2FzZSBoZXggZGlnaXRzLCBhbmQgdG8gbWFrZSB0aGVtIHVuc2lnbmVkCisoZS5nLiwgMHgwMFUsIDB4ZmZVLCAweDAxMDBVKSBhbmQgbG9uZyBpZiB0aGV5IGFyZSBncmVhdGVyIHRoYW4gMHg3ZmZmCisoZS5nLiwgMHhmZmZmVUwpLgorCitXZSBwcmVmZXIgdG8gdXNlIHVuZGVyc2NvcmVzIHJhdGhlciB0aGFuIGNhbWVsQ2FzZSBpbiBuYW1lcywgZXhjZXB0Citmb3IgYSBmZXcgdHlwZSBuYW1lcyB0aGF0IHdlIGluaGVyaXQgZnJvbSB6bGliLmguCisKK1dlIHByZWZlciAiaWYgKHNvbWV0aGluZyAhPSAwKSIgYW5kICJpZiAoc29tZXRoaW5nID09IDApIgorb3ZlciAiaWYgKHNvbWV0aGluZykiIGFuZCBpZiAiKCFzb21ldGhpbmcpIiwgcmVzcGVjdGl2ZWx5LgorCitXZSBkbyBub3QgdXNlIHRoZSBUQUIgY2hhcmFjdGVyIGZvciBpbmRlbnRhdGlvbiBpbiB0aGUgQyBzb3VyY2VzLgorCitMaW5lcyBkbyBub3QgZXhjZWVkIDgwIGNoYXJhY3RlcnMuCisKK090aGVyIHJ1bGVzIGNhbiBiZSBpbmZlcnJlZCBieSBpbnNwZWN0aW5nIHRoZSBsaWJwbmcgc291cmNlLgorCisuU0ggWFZJLiBZMksgQ29tcGxpYW5jZSBpbiBsaWJwbmcKKworU2luY2UgdGhlIFBORyBEZXZlbG9wbWVudCBncm91cCBpcyBhbiBhZC1ob2MgYm9keSwgd2UgY2FuJ3QgbWFrZQorYW4gb2ZmaWNpYWwgZGVjbGFyYXRpb24uCisKK1RoaXMgaXMgeW91ciB1bm9mZmljaWFsIGFzc3VyYW5jZSB0aGF0IGxpYnBuZyBmcm9tIHZlcnNpb24gMC43MSBhbmQKK3Vwd2FyZCB0aHJvdWdoIDEuNi4yMCBhcmUgWTJLIGNvbXBsaWFudC4gIEl0IGlzIG15IGJlbGllZiB0aGF0IGVhcmxpZXIKK3ZlcnNpb25zIHdlcmUgYWxzbyBZMksgY29tcGxpYW50LgorCitMaWJwbmcgb25seSBoYXMgdHdvIHllYXIgZmllbGRzLiAgT25lIGlzIGEgMi1ieXRlIHVuc2lnbmVkIGludGVnZXIKK3RoYXQgd2lsbCBob2xkIHllYXJzIHVwIHRvIDY1NTM1LiAgVGhlIG90aGVyLCB3aGljaCBpcyBkZXByZWNhdGVkLAoraG9sZHMgdGhlIGRhdGUgaW4gdGV4dCBmb3JtYXQsIGFuZCB3aWxsIGhvbGQgeWVhcnMgdXAgdG8gOTk5OS4KKworVGhlIGludGVnZXIgaXMKKyAgICAicG5nX3VpbnRfMTYgeWVhciIgaW4gcG5nX3RpbWVfc3RydWN0LgorCitUaGUgc3RyaW5nIGlzCisgICAgImNoYXIgdGltZV9idWZmZXJbMjldIiBpbiBwbmdfc3RydWN0LiAgVGhpcyBpcyBubyBsb25nZXIgdXNlZAoraW4gbGlicG5nLTEuNi54IGFuZCB3aWxsIGJlIHJlbW92ZWQgZnJvbSBsaWJwbmctMS43LjAuCisKK1RoZXJlIGFyZSBzZXZlbiB0aW1lLXJlbGF0ZWQgZnVuY3Rpb25zOgorCisgICAgcG5nX2NvbnZlcnRfdG9fcmZjXzExMjNfYnVmZmVyKCkgaW4gcG5nLmMKKyAgICAgIChmb3JtZXJseSBwbmdfY29udmVydF90b19yZmNfMTE1MigpIGluIGVycm9yLCBhbmQKKyAgICAgIGFsc28gZm9ybWVybHkgcG5nX2NvbnZlcnRfdG9fcmZjXzExMjMoKSkKKyAgICBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSgpIGluIHBuZ3dyaXRlLmMsIGNhbGxlZAorICAgICAgaW4gcG5nd3JpdGUuYworICAgIHBuZ19jb252ZXJ0X2Zyb21fdGltZV90KCkgaW4gcG5nd3JpdGUuYworICAgIHBuZ19nZXRfdElNRSgpIGluIHBuZ2dldC5jCisgICAgcG5nX2hhbmRsZV90SU1FKCkgaW4gcG5ncnV0aWwuYywgY2FsbGVkIGluIHBuZ3JlYWQuYworICAgIHBuZ19zZXRfdElNRSgpIGluIHBuZ3NldC5jCisgICAgcG5nX3dyaXRlX3RJTUUoKSBpbiBwbmd3dXRpbC5jLCBjYWxsZWQgaW4gcG5nd3JpdGUuYworCitBbGwgYXBwZWFyIHRvIGhhbmRsZSBkYXRlcyBwcm9wZXJseSBpbiBhIFkySyBlbnZpcm9ubWVudC4gIFRoZQorcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QoKSBmdW5jdGlvbiBjYWxscyBnbXRpbWUoKSB0byBjb252ZXJ0IGZyb20gc3lzdGVtCitjbG9jayB0aW1lLCB3aGljaCByZXR1cm5zICh5ZWFyIC0gMTkwMCksIHdoaWNoIHdlIHByb3Blcmx5IGNvbnZlcnQgdG8KK3RoZSBmdWxsIDQtZGlnaXQgeWVhci4gIFRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCBhcHBsaWNhdGlvbnMgdXNpbmcKK2xpYnBuZyBhcmUgbm90IHBhc3NpbmcgNC1kaWdpdCB5ZWFycyBpbnRvIHRoZSBwbmdfY29udmVydF90b19yZmNfMTEyMygpCitmdW5jdGlvbiwgb3IgdGhhdCB0aGV5IGFyZSBpbmNvcnJlY3RseSBwYXNzaW5nIG9ubHkgYSAyLWRpZ2l0IHllYXIKK2luc3RlYWQgb2YgInllYXIgLSAxOTAwIiBpbnRvIHRoZSBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSgpIGZ1bmN0aW9uLAorYnV0IHRoaXMgaXMgbm90IHVuZGVyIG91ciBjb250cm9sLiAgVGhlIGxpYnBuZyBkb2N1bWVudGF0aW9uIGhhcyBhbHdheXMKK3N0YXRlZCB0aGF0IGl0IHdvcmtzIHdpdGggNC1kaWdpdCB5ZWFycywgYW5kIHRoZSBBUElzIGhhdmUgYmVlbgorZG9jdW1lbnRlZCBhcyBzdWNoLgorCitUaGUgdElNRSBjaHVuayBpdHNlbGYgaXMgYWxzbyBZMksgY29tcGxpYW50LiAgSXQgdXNlcyBhIDItYnl0ZSB1bnNpZ25lZAoraW50ZWdlciB0byBob2xkIHRoZSB5ZWFyLCBhbmQgY2FuIGhvbGQgeWVhcnMgYXMgbGFyZ2UgYXMgNjU1MzUuCisKK3psaWIsIHVwb24gd2hpY2ggbGlicG5nIGRlcGVuZHMsIGlzIGFsc28gWTJLIGNvbXBsaWFudC4gIEl0IGNvbnRhaW5zCitubyBkYXRlLXJlbGF0ZWQgY29kZS4KKworCisgICBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAgIGxpYnBuZyBtYWludGFpbmVyCisgICBQTkcgRGV2ZWxvcG1lbnQgR3JvdXAKKworLlNIIE5PVEUKKworTm90ZSBhYm91dCBsaWJwbmcgdmVyc2lvbiBudW1iZXJzOgorCitEdWUgdG8gdmFyaW91cyBtaXNjb21tdW5pY2F0aW9ucywgdW5mb3Jlc2VlbiBjb2RlIGluY29tcGF0aWJpbGl0aWVzCithbmQgb2NjYXNpb25hbCBmYWN0b3JzIG91dHNpZGUgdGhlIGF1dGhvcnMnIGNvbnRyb2wsIHZlcnNpb24gbnVtYmVyaW5nCitvbiB0aGUgbGlicmFyeSBoYXMgbm90IGFsd2F5cyBiZWVuIGNvbnNpc3RlbnQgYW5kIHN0cmFpZ2h0Zm9yd2FyZC4KK1RoZSBmb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyBtYXR0ZXJzIHNpbmNlIHZlcnNpb24gMC44OWMsIHdoaWNoIHdhcwordGhlIGZpcnN0IHdpZGVseSB1c2VkIHJlbGVhc2U6CisKKyBzb3VyY2UgICAgICAgICAgICAgcG5nLmggIHBuZy5oICBzaGFyZWQtbGliCisgdmVyc2lvbiAgICAgICAgICAgIHN0cmluZyAgIGludCAgdmVyc2lvbgorIC0tLS0tLS0gICAgICAgICAgICAtLS0tLS0gIC0tLS0tIC0tLS0tLS0tLS0KKyAwLjg5YyAiMS4wIGJldGEgMyIgICAgIDAuODkgICAgICA4OSAgMS4wLjg5CisgMC45MCAgIjEuMCBiZXRhIDQiICAgICAwLjkwICAgICAgOTAgIDAuOTAgIFtzaG91bGQgaGF2ZSBiZWVuIDIuMC45MF0KKyAwLjk1ICAiMS4wIGJldGEgNSIgICAgIDAuOTUgICAgICA5NSAgMC45NSAgW3Nob3VsZCBoYXZlIGJlZW4gMi4wLjk1XQorIDAuOTYgICIxLjAgYmV0YSA2IiAgICAgMC45NiAgICAgIDk2ICAwLjk2ICBbc2hvdWxkIGhhdmUgYmVlbiAyLjAuOTZdCisgMC45N2IgIjEuMDAuOTcgYmV0YSA3IiAxLjAwLjk3ICAgOTcgIDEuMC4xIFtzaG91bGQgaGF2ZSBiZWVuIDIuMC45N10KKyAwLjk3YyAgICAgICAgICAgICAgICAgIDAuOTcgICAgICA5NyAgMi4wLjk3CisgMC45OCAgICAgICAgICAgICAgICAgICAwLjk4ICAgICAgOTggIDIuMC45OAorIDAuOTkgICAgICAgICAgICAgICAgICAgMC45OSAgICAgIDk4ICAyLjAuOTkKKyAwLjk5YS1tICAgICAgICAgICAgICAgIDAuOTkgICAgICA5OSAgMi4wLjk5CisgMS4wMCAgICAgICAgICAgICAgICAgICAxLjAwICAgICAxMDAgIDIuMS4wIFsxMDAgc2hvdWxkIGJlIDEwMDAwXQorIDEuMC4wICAgICAgKGZyb20gaGVyZSBvbiwgdGhlICAgMTAwICAyLjEuMCBbMTAwIHNob3VsZCBiZSAxMDAwMF0KKyAxLjAuMSAgICAgICBwbmcuaCBzdHJpbmcgaXMgICAxMDAwMSAgMi4xLjAKKyAxLjAuMWEtZSAgICBpZGVudGljYWwgdG8gdGhlICAxMDAwMiAgZnJvbSBoZXJlIG9uLCB0aGUgc2hhcmVkIGxpYnJhcnkKKyAxLjAuMiAgICAgICBzb3VyY2UgdmVyc2lvbikgICAxMDAwMiAgaXMgMi5WIHdoZXJlIFYgaXMgdGhlIHNvdXJjZSBjb2RlCisgMS4wLjJhLWIgICAgICAgICAgICAgICAgICAgICAgMTAwMDMgIHZlcnNpb24sIGV4Y2VwdCBhcyBub3RlZC4KKyAxLjAuMyAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMworIDEuMC4zYS1kICAgICAgICAgICAgICAgICAgICAgIDEwMDA0CisgMS4wLjQgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDQKKyAxLjAuNGEtZiAgICAgICAgICAgICAgICAgICAgICAxMDAwNQorIDEuMC41ICgrIDIgcGF0Y2hlcykgICAgICAgICAgIDEwMDA1CisgMS4wLjVhLWQgICAgICAgICAgICAgICAgICAgICAgMTAwMDYKKyAxLjAuNWUtciAgICAgICAgICAgICAgICAgICAgICAxMDEwMCAobm90IHNvdXJjZSBjb21wYXRpYmxlKQorIDEuMC41cy12ICAgICAgICAgICAgICAgICAgICAgIDEwMDA2IChub3QgYmluYXJ5IGNvbXBhdGlibGUpCisgMS4wLjYgKCsgMyBwYXRjaGVzKSAgICAgICAgICAgMTAwMDYgKHN0aWxsIGJpbmFyeSBpbmNvbXBhdGlibGUpCisgMS4wLjZkLWYgICAgICAgICAgICAgICAgICAgICAgMTAwMDcgKHN0aWxsIGJpbmFyeSBpbmNvbXBhdGlibGUpCisgMS4wLjZnICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDcKKyAxLjAuNmggICAgICAgICAgICAgICAgICAgICAgICAxMDAwNyAgMTAuNmggKHRlc3RpbmcgeHkueiBzby1udW1iZXJpbmcpCisgMS4wLjZpICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDcgIDEwLjZpCisgMS4wLjZqICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDcgIDIuMS4wLjZqIChpbmNvbXBhdGlibGUgd2l0aCAxLjAuMCkKKyAxLjAuN2JldGExMS0xNCAgICAgICAgRExMTlVNICAxMDAwNyAgMi4xLjAuN2JldGExMS0xNCAoYmluYXJ5IGNvbXBhdGlibGUpCisgMS4wLjdiZXRhMTUtMTggICAgICAgICAgIDEgICAgMTAwMDcgIDIuMS4wLjdiZXRhMTUtMTggKGJpbmFyeSBjb21wYXRpYmxlKQorIDEuMC43cmMxLTIgICAgICAgICAgICAgICAxICAgIDEwMDA3ICAyLjEuMC43cmMxLTIgKGJpbmFyeSBjb21wYXRpYmxlKQorIDEuMC43ICAgICAgICAgICAgICAgICAgICAxICAgIDEwMDA3ICAoc3RpbGwgY29tcGF0aWJsZSkKKyAuLi4KKyAxLjAuMTkgICAgICAgICAgICAgICAgICAxMCAgICAxMDAxOSAgMTAuc28uMC4xOVsuMF0KKyAuLi4KKyAxLjIuNTMgICAgICAgICAgICAgICAgICAxMyAgICAxMDI1MyAgMTIuc28uMC41M1suMF0KKyAuLi4KKyAxLjUuMjMgICAgICAgICAgICAgICAgICAxNSAgICAxMDUyMyAgMTUuc28uMTUuMjNbLjBdCisgLi4uCisgMS42LjIwICAgICAgICAgICAgICAgICAgMTYgICAgMTA2MjAgIDE2LnNvLjE2LjIwWy4wXQorCitIZW5jZWZvcnRoIHRoZSBzb3VyY2UgdmVyc2lvbiB3aWxsIG1hdGNoIHRoZSBzaGFyZWQtbGlicmFyeSBtaW5vcgorYW5kIHBhdGNoIG51bWJlcnM7IHRoZSBzaGFyZWQtbGlicmFyeSBtYWpvciB2ZXJzaW9uIG51bWJlciB3aWxsIGJlCit1c2VkIGZvciBjaGFuZ2VzIGluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGFzIGl0IGlzIGludGVuZGVkLiAgVGhlCitQTkdfUE5HTElCX1ZFUiBtYWNybywgd2hpY2ggaXMgbm90IHVzZWQgd2l0aGluIGxpYnBuZyBidXQgaXMgYXZhaWxhYmxlCitmb3IgYXBwbGljYXRpb25zLCBpcyBhbiB1bnNpZ25lZCBpbnRlZ2VyIG9mIHRoZSBmb3JtIHh5eXp6IGNvcnJlc3BvbmRpbmcKK3RvIHRoZSBzb3VyY2UgdmVyc2lvbiB4LnkueiAobGVhZGluZyB6ZXJvcyBpbiB5IGFuZCB6KS4gIEJldGEgdmVyc2lvbnMKK3dlcmUgZ2l2ZW4gdGhlIHByZXZpb3VzIHB1YmxpYyByZWxlYXNlIG51bWJlciBwbHVzIGEgbGV0dGVyLCB1bnRpbAordmVyc2lvbiAxLjAuNmo7IGZyb20gdGhlbiBvbiB0aGV5IHdlcmUgZ2l2ZW4gdGhlIHVwY29taW5nIHB1YmxpYworcmVsZWFzZSBudW1iZXIgcGx1cyAiYmV0YU5OIiBvciAicmNOTiIuCisKKy5TSCAiU0VFIEFMU08iCisuSVIgbGlicG5ncGYoMykgIiwgIiBwbmcoNSkKKy5MUAorLklSIGxpYnBuZyA6CisuSVAKK2h0dHA6Ly9saWJwbmcuc291cmNlZm9yZ2UubmV0IChmb2xsb3cgdGhlIFtET1dOTE9BRF0gbGluaykKK2h0dHA6Ly93d3cubGlicG5nLm9yZy9wdWIvcG5nCisKKy5MUAorLklSIHpsaWIgOgorLklQCisoZ2VuZXJhbGx5KSBhdCB0aGUgc2FtZSBsb2NhdGlvbiBhcworLkkgbGlicG5nCitvciBhdAorLmJyCitmdHA6Ly9mdHAuaW5mby16aXAub3JnL3B1Yi9pbmZvemlwL3psaWIKKworLkxQCisuSVIgUE5HIHNwZWNpZmljYXRpb246IFJGQyAyMDgzCisuSVAKKyhnZW5lcmFsbHkpIGF0IHRoZSBzYW1lIGxvY2F0aW9uIGFzCisuSSBsaWJwbmcKK29yIGF0CisuYnIKK2Z0cDovL2Z0cC5yZmMtZWRpdG9yLm9yZzovaW4tbm90ZXMvcmZjMjA4My50eHQKKy5icgorb3IgKGFzIGEgVzNDIFJlY29tbWVuZGF0aW9uKSBhdAorLmJyCitodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtcG5nLmh0bWwKKworLkxQCitJbiB0aGUgY2FzZSBvZiBhbnkgaW5jb25zaXN0ZW5jeSBiZXR3ZWVuIHRoZSBQTkcgc3BlY2lmaWNhdGlvbgorYW5kIHRoaXMgbGlicmFyeSwgdGhlIHNwZWNpZmljYXRpb24gdGFrZXMgcHJlY2VkZW5jZS4KKworLlNIIEFVVEhPUlMKK1RoaXMgbWFuIHBhZ2U6IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorPGdsZW5ucnAgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCitUaGUgY29udHJpYnV0aW5nIGF1dGhvcnMgd291bGQgbGlrZSB0byB0aGFuayBhbGwgdGhvc2Ugd2hvIGhlbHBlZAord2l0aCB0ZXN0aW5nLCBidWcgZml4ZXMsIGFuZCBwYXRpZW5jZS4gIFRoaXMgd291bGRuJ3QgaGF2ZSBiZWVuCitwb3NzaWJsZSB3aXRob3V0IGFsbCBvZiB5b3UuCisKK1RoYW5rcyB0byBGcmFuayBKLiBULiBXb2pjaWsgZm9yIGhlbHBpbmcgd2l0aCB0aGUgZG9jdW1lbnRhdGlvbi4KKworTGlicG5nIHZlcnNpb24gMS42LjIwIC0gRGVjZW1iZXIgMywgMjAxNToKK0luaXRpYWxseSBjcmVhdGVkIGluIDE5OTUgYnkgR3V5IEVyaWMgU2NoYWxuYXQsIHRoZW4gb2YgR3JvdXAgNDIsIEluYy4KK0N1cnJlbnRseSBtYWludGFpbmVkIGJ5IEdsZW5uIFJhbmRlcnMtUGVocnNvbiAoZ2xlbm5ycCBhdCB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQpLgorCitTdXBwb3J0ZWQgYnkgdGhlIFBORyBkZXZlbG9wbWVudCBncm91cAorLmJyCitwbmctbW5nLWltcGxlbWVudCBhdCBsaXN0cy5zZi5uZXQKKyhzdWJzY3JpcHRpb24gcmVxdWlyZWQ7IHZpc2l0CitwbmctbW5nLWltcGxlbWVudCBhdCBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQgKHN1YnNjcmlwdGlvbiByZXF1aXJlZDsgdmlzaXQKK2h0dHBzOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL3BuZy1tbmctaW1wbGVtZW50Cit0byBzdWJzY3JpYmUpLgorCisuU0ggTk9USUNFUzoKKworVGhpcyBjb3B5IG9mIHRoZSBsaWJwbmcgbm90aWNlcyBpcyBwcm92aWRlZCBmb3IgeW91ciBjb252ZW5pZW5jZS4gIEluIGNhc2Ugb2YKK2FueSBkaXNjcmVwYW5jeSBiZXR3ZWVuIHRoaXMgY29weSBhbmQgdGhlIG5vdGljZXMgaW4gdGhlIGZpbGUgcG5nLmggdGhhdCBpcworaW5jbHVkZWQgaW4gdGhlIGxpYnBuZyBkaXN0cmlidXRpb24sIHRoZSBsYXR0ZXIgc2hhbGwgcHJldmFpbC4KKworQ09QWVJJR0hUIE5PVElDRSwgRElTQ0xBSU1FUiwgYW5kIExJQ0VOU0U6CisKK0lmIHlvdSBtb2RpZnkgbGlicG5nIHlvdSBtYXkgaW5zZXJ0IGFkZGl0aW9uYWwgbm90aWNlcyBpbW1lZGlhdGVseSBmb2xsb3dpbmcKK3RoaXMgc2VudGVuY2UuCisKK1RoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisKK2xpYnBuZyB2ZXJzaW9ucyAxLjAuNywgSnVseSAxLCAyMDAwLCB0aHJvdWdoIDEuNi4yMCwgRGVjZW1iZXIgMywgMjAxNSwgYXJlCitDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiwgMjAwNCwgMjAwNi0yMDE1IEdsZW5uIFJhbmRlcnMtUGVocnNvbiwgYXJlCitkZXJpdmVkIGZyb20gbGlicG5nLTEuMC42LCBhbmQgYXJlIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZQorZGlzY2xhaW1lciBhbmQgbGljZW5zZSBhcyBsaWJwbmctMS4wLjYgd2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWxzCithZGRlZCB0byB0aGUgbGlzdCBvZiBDb250cmlidXRpbmcgQXV0aG9yczoKKworICAgU2ltb24tUGllcnJlIENhZGlldXgKKyAgIEVyaWMgUy4gUmF5bW9uZAorICAgTWFucyBSdWxsZ2FyZAorICAgQ29zbWluIFRydXRhCisgICBHaWxsZXMgVm9sbGFudAorICAgSmFtZXMgWXUKKworYW5kIHdpdGggdGhlIGZvbGxvd2luZyBhZGRpdGlvbnMgdG8gdGhlIGRpc2NsYWltZXI6CisKKyAgIFRoZXJlIGlzIG5vIHdhcnJhbnR5IGFnYWluc3QgaW50ZXJmZXJlbmNlIHdpdGggeW91ciBlbmpveW1lbnQgb2YgdGhlCisgICBsaWJyYXJ5IG9yIGFnYWluc3QgaW5mcmluZ2VtZW50LiAgVGhlcmUgaXMgbm8gd2FycmFudHkgdGhhdCBvdXIKKyAgIGVmZm9ydHMgb3IgdGhlIGxpYnJhcnkgd2lsbCBmdWxmaWxsIGFueSBvZiB5b3VyIHBhcnRpY3VsYXIgcHVycG9zZXMKKyAgIG9yIG5lZWRzLiAgVGhpcyBsaWJyYXJ5IGlzIHByb3ZpZGVkIHdpdGggYWxsIGZhdWx0cywgYW5kIHRoZSBlbnRpcmUKKyAgIHJpc2sgb2Ygc2F0aXNmYWN0b3J5IHF1YWxpdHksIHBlcmZvcm1hbmNlLCBhY2N1cmFjeSwgYW5kIGVmZm9ydCBpcyB3aXRoCisgICB0aGUgdXNlci4KKworbGlicG5nIHZlcnNpb25zIDAuOTcsIEphbnVhcnkgMTk5OCwgdGhyb3VnaCAxLjAuNiwgTWFyY2ggMjAsIDIwMDAsIGFyZQorQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgR2xlbm4gUmFuZGVycy1QZWhyc29uLCBhcmUgZGVyaXZlZCBmcm9tCitsaWJwbmctMC45NiwgYW5kIGFyZSBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNhbWUgZGlzY2xhaW1lciBhbmQKK2xpY2Vuc2UgYXMgbGlicG5nLTAuOTYsIHdpdGggdGhlIGZvbGxvd2luZyBpbmRpdmlkdWFscyBhZGRlZCB0byB0aGUgbGlzdAorb2YgQ29udHJpYnV0aW5nIEF1dGhvcnM6CisKKyAgIFRvbSBMYW5lCisgICBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAgIFdpbGxlbSB2YW4gU2NoYWlrCisKK2xpYnBuZyB2ZXJzaW9ucyAwLjg5LCBKdW5lIDE5OTYsIHRocm91Z2ggMC45NiwgTWF5IDE5OTcsIGFyZQorQ29weXJpZ2h0IChjKSAxOTk2LTE5OTcgQW5kcmVhcyBEaWxnZXIsIGFyZSBkZXJpdmVkIGZyb20gbGlicG5nLTAuODgsCithbmQgYXJlIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzCitsaWJwbmctMC44OCwgd2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWxzIGFkZGVkIHRvIHRoZSBsaXN0IG9mCitDb250cmlidXRpbmcgQXV0aG9yczoKKworICAgSm9obiBCb3dsZXIKKyAgIEtldmluIEJyYWNleQorICAgU2FtIEJ1c2hlbGwKKyAgIE1hZ251cyBIb2xtZ3JlbgorICAgR3JlZyBSb2Vsb2ZzCisgICBUb20gVGFubmVyCisKK2xpYnBuZyB2ZXJzaW9ucyAwLjUsIE1heSAxOTk1LCB0aHJvdWdoIDAuODgsIEphbnVhcnkgMTk5NiwgYXJlCitDb3B5cmlnaHQgKGMpIDE5OTUtMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KKworRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGNvcHlyaWdodCBhbmQgbGljZW5zZSwgIkNvbnRyaWJ1dGluZyBBdXRob3JzIgoraXMgZGVmaW5lZCBhcyB0aGUgZm9sbG93aW5nIHNldCBvZiBpbmRpdmlkdWFsczoKKworICAgQW5kcmVhcyBEaWxnZXIKKyAgIERhdmUgTWFydGluZGFsZQorICAgR3V5IEVyaWMgU2NoYWxuYXQKKyAgIFBhdWwgU2NobWlkdAorICAgVGltIFdlZ25lcgorCitUaGUgUE5HIFJlZmVyZW5jZSBMaWJyYXJ5IGlzIHN1cHBsaWVkICJBUyBJUyIuICBUaGUgQ29udHJpYnV0aW5nIEF1dGhvcnMKK2FuZCBHcm91cCA0MiwgSW5jLiBkaXNjbGFpbSBhbGwgd2FycmFudGllcywgZXhwcmVzc2VkIG9yIGltcGxpZWQsCitpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBvZgorZml0bmVzcyBmb3IgYW55IHB1cnBvc2UuICBUaGUgQ29udHJpYnV0aW5nIEF1dGhvcnMgYW5kIEdyb3VwIDQyLCBJbmMuCithc3N1bWUgbm8gbGlhYmlsaXR5IGZvciBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHdoaWNoIG1heSByZXN1bHQgZnJvbSB0aGUgdXNlIG9mIHRoZSBQTkcKK1JlZmVyZW5jZSBMaWJyYXJ5LCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCitzb3VyY2UgY29kZSwgb3IgcG9ydGlvbnMgaGVyZW9mLCBmb3IgYW55IHB1cnBvc2UsIHdpdGhvdXQgZmVlLCBzdWJqZWN0Cit0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKworICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc291cmNlIGNvZGUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQuCisKKyAgMi4gQWx0ZXJlZCB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2ggYW5kIG11c3Qgbm90CisgICAgIGJlIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb3VyY2UuCisKKyAgMy4gVGhpcyBDb3B5cmlnaHQgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55CisgICAgIHNvdXJjZSBvciBhbHRlcmVkIHNvdXJjZSBkaXN0cmlidXRpb24uCisKK1RoZSBDb250cmlidXRpbmcgQXV0aG9ycyBhbmQgR3JvdXAgNDIsIEluYy4gc3BlY2lmaWNhbGx5IHBlcm1pdCwgd2l0aG91dAorZmVlLCBhbmQgZW5jb3VyYWdlIHRoZSB1c2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBhcyBhIGNvbXBvbmVudCB0bworc3VwcG9ydGluZyB0aGUgUE5HIGZpbGUgZm9ybWF0IGluIGNvbW1lcmNpYWwgcHJvZHVjdHMuICBJZiB5b3UgdXNlIHRoaXMKK3NvdXJjZSBjb2RlIGluIGEgcHJvZHVjdCwgYWNrbm93bGVkZ21lbnQgaXMgbm90IHJlcXVpcmVkIGJ1dCB3b3VsZCBiZQorYXBwcmVjaWF0ZWQuCisKK0VORCBPRiBDT1BZUklHSFQgTk9USUNFLCBESVNDTEFJTUVSLCBhbmQgTElDRU5TRS4KKworQSAicG5nX2dldF9jb3B5cmlnaHQiIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgZm9yIGNvbnZlbmllbnQgdXNlIGluICJhYm91dCIKK2JveGVzIGFuZCB0aGUgbGlrZToKKworICAgcHJpbnRmKCIlcyIsIHBuZ19nZXRfY29weXJpZ2h0KE5VTEwpKTsKKworQWxzbywgdGhlIFBORyBsb2dvIChpbiBQTkcgZm9ybWF0LCBvZiBjb3Vyc2UpIGlzIHN1cHBsaWVkIGluIHRoZQorZmlsZXMgInBuZ2Jhci5wbmciIGFuZCAicG5nYmFyLmpwZyAoODh4MzEpIGFuZCAicG5nbm93LnBuZyIgKDk4eDMxKS4KKworTGlicG5nIGlzIE9TSSBDZXJ0aWZpZWQgT3BlbiBTb3VyY2UgU29mdHdhcmUuICBPU0kgQ2VydGlmaWVkIE9wZW4gU291cmNlIGlzCithIGNlcnRpZmljYXRpb24gbWFyayBvZiB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4gT1NJIGhhcyBub3QgYWRkcmVzc2VkCit0aGUgYWRkaXRpb25hbCBkaXNjbGFpbWVycyBpbnNlcnRlZCBhdCB2ZXJzaW9uIDEuMC43LgorCitHbGVubiBSYW5kZXJzLVBlaHJzb24KK2dsZW5ucnAgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0CitEZWNlbWJlciAzLCAyMDE1CisKKy5cIiBlbmQgb2YgbWFuIHBhZ2UKKwpkaWZmIC0tZ2l0IGEvbGlicG5nL2xpYnBuZy5wYy5pbiBiL2xpYnBuZy9saWJwbmcucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U3ZTJjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9saWJwbmcucGMuaW4KQEAgLTAsMCArMSwxMSBAQAorcHJlZml4PUBwcmVmaXhACitleGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACitsaWJkaXI9QGxpYmRpckAKK2luY2x1ZGVkaXI9QGluY2x1ZGVkaXJAL2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAKKworTmFtZTogbGlicG5nCitEZXNjcmlwdGlvbjogTG9hZHMgYW5kIHNhdmVzIFBORyBmaWxlcworVmVyc2lvbjogQFBOR0xJQl9WRVJTSU9OQAorTGliczogLUwke2xpYmRpcn0gLWxwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JACitMaWJzLnByaXZhdGU6IEBMSUJTQAorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL2xpYnBuZy9saWJwbmdwZi4zIGIvbGlicG5nL2xpYnBuZ3BmLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRhMDg0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9saWJwbmdwZi4zCkBAIC0wLDAgKzEsMTggQEAKKy5USCBMSUJQTkdQRiAzICJEZWNlbWJlciAzLCAyMDE1IgorLlNIIE5BTUUKK2xpYnBuZyBcLSBQb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzIChQTkcpIFJlZmVyZW5jZSBMaWJyYXJ5IDEuNi4yMAorKHByaXZhdGUgZnVuY3Rpb25zKQorLlNIIFNZTk9QU0lTCitcZkIjaW5jbHVkZSBcZkkicG5ncHJpdi5oIgorCitcZkJBcyBvZiBsaWJwbmcgdmVyc2lvbiBcZlBcZkkxLjUuMVxmUFxmQiwgdGhpcyBzZWN0aW9uIGlzIG5vIGxvbmdlciBcZlBcZkltYWludGFpbmVkXGZQXGZCLCBub3cgdGhhdCB0aGUgcHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIGFyZSBoaWRkZW4gaW4gcG5ncHJpdi5oIGFuZCBub3QgYWNjZXNzaWJsZSB0byBhcHBsaWNhdGlvbnMuIExvb2sgaW4gcG5ncHJpdi5oIGZvciB0aGUgcHJvdG90eXBlcyBhbmQgYSBzaG9ydCBkZXNjcmlwdGlvbiBvZiBlYWNoIFxmSWZ1bmN0aW9uLgorCisuU0ggREVTQ1JJUFRJT04KK1RoZSBmdW5jdGlvbnMgcHJldmlvdXNseSBsaXN0ZWQgaGVyZSBhcmUgdXNlZCBwcml2YXRlbHkgYnkgbGlicG5nIGFuZCBhcmUgbm90CithdmFpbGFibGUgZm9yIHVzZSBieSBhcHBsaWNhdGlvbnMuICBUaGV5IGFyZSBub3QgImV4cG9ydGVkIiB0byBhcHBsaWNhdGlvbnMKK3VzaW5nIHNoYXJlZCBsaWJyYXJpZXMuCisKKy5TSCBTRUUgQUxTTworLkJSICJwbmciKDUpLCAiIGxpYnBuZyIoMyksICIgemxpYiIoMyksICIgZGVmbGF0ZSIoNSksICIgIiBhbmQgIiB6bGliIig1KQorLlNIIEFVVEhPUgorR2xlbm4gUmFuZGVycy1QZWhyc29uCmRpZmYgLS1naXQgYS9saWJwbmcvcG5nLjUgYi9saWJwbmcvcG5nLjUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZhMzI3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9wbmcuNQpAQCAtMCwwICsxLDc0IEBACisuVEggUE5HIDUgIkRlY2VtYmVyIDMsIDIwMTUiCisuU0ggTkFNRQorcG5nIFwtIFBvcnRhYmxlIE5ldHdvcmsgR3JhcGhpY3MgKFBORykgZm9ybWF0CisuU0ggREVTQ1JJUFRJT04KK1BORyAoUG9ydGFibGUgTmV0d29yayBHcmFwaGljcykgaXMgYW4gZXh0ZW5zaWJsZSBmaWxlIGZvcm1hdCBmb3IgdGhlCitsb3NzbGVzcywgcG9ydGFibGUsIHdlbGwtY29tcHJlc3NlZCBzdG9yYWdlIG9mIHJhc3RlciBpbWFnZXMuIFBORyBwcm92aWRlcworYSBwYXRlbnQtZnJlZSByZXBsYWNlbWVudCBmb3IgR0lGIGFuZCBjYW4gYWxzbyByZXBsYWNlIG1hbnkKK2NvbW1vbiB1c2VzIG9mIFRJRkYuIEluZGV4ZWQtY29sb3IsIGdyYXlzY2FsZSwgYW5kIHRydWVjb2xvciBpbWFnZXMgYXJlCitzdXBwb3J0ZWQsIHBsdXMgYW4gb3B0aW9uYWwgYWxwaGEgY2hhbm5lbC4gU2FtcGxlIGRlcHRocyByYW5nZSBmcm9tCisxIHRvIDE2IGJpdHMuCisuYnIKKworUE5HIGlzIGRlc2lnbmVkIHRvIHdvcmsgd2VsbCBpbiBvbmxpbmUgdmlld2luZyBhcHBsaWNhdGlvbnMsIHN1Y2ggYXMgdGhlCitXb3JsZCBXaWRlIFdlYiwgc28gaXQgaXMgZnVsbHkgc3RyZWFtYWJsZSB3aXRoIGEgcHJvZ3Jlc3NpdmUgZGlzcGxheQorb3B0aW9uLiBQTkcgaXMgcm9idXN0LCBwcm92aWRpbmcgYm90aCBmdWxsIGZpbGUgaW50ZWdyaXR5IGNoZWNraW5nIGFuZAorZmFzdCwgc2ltcGxlIGRldGVjdGlvbiBvZiBjb21tb24gdHJhbnNtaXNzaW9uIGVycm9ycy4gQWxzbywgUE5HIGNhbiBzdG9yZQorZ2FtbWEgYW5kIGNocm9tYXRpY2l0eSBkYXRhIGZvciBpbXByb3ZlZCBjb2xvciBtYXRjaGluZyBvbiBoZXRlcm9nZW5lb3VzCitwbGF0Zm9ybXMuCisKKy5TSCAiU0VFIEFMU08iCisuQlIgImxpYnBuZyIoMyksICIgbGlicG5ncGYiKDMpLCAiIHpsaWIiKDMpLCAiIGRlZmxhdGUiKDUpLCAiICIgYW5kICIgemxpYiIoNSkKKy5MUAorUE5HIHNwZWNpZmljYXRpb24gKHNlY29uZCBlZGl0aW9uKSwgTm92ZW1iZXIgMjAwMzoKKy5JUAorLmJyCisgIDxodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAzL1JFQy1QTkctMjAwMzExMTAvCitQTkcgMS4yIHNwZWNpZmljYXRpb24sIEp1bHkgMTk5OToKKy5JUAorLmJyCitodHRwOi8vcG5nLW1uZy5zb3VyY2Vmb3JnZS5uZXQvcHViL3BuZy9zcGVjLzEuMi8KKy5MUAorUE5HIDEuMCBzcGVjaWZpY2F0aW9uLCBPY3RvYmVyIDE5OTY6CisuSVAKKy5icgorUkZDIDIwODMKKy5JUAorLmJyCitmdHA6Ly9kcy5pbnRlcm5pYy5uZXQvcmZjL3JmYzIwODMudHh0CisuYnIKK29yIChhcyBhIFczQyBSZWNvbW1lbmRhdGlvbikgYXQKKy5icgoraHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXBuZy05NjEwMDEKKy5TSCBBVVRIT1JTCitUaGlzIG1hbiBwYWdlOiBHbGVubiBSYW5kZXJzLVBlaHJzb24KKy5MUAorUG9ydGFibGUgTmV0d29yayBHcmFwaGljcyAoUE5HKSBTcGVjaWZpY2F0aW9uIChTZWNvbmQgRWRpdGlvbikKK0luZm9ybWF0aW9uIHRlY2hub2xvZ3kgLSBDb21wdXRlciBncmFwaGljcyBhbmQgaW1hZ2UgcHJvY2Vzc2luZyAtCitQb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzIChQTkcpOiBGdW5jdGlvbmFsIHNwZWNpZmljYXRpb24uCitJU08vSUVDIDE1OTQ4OjIwMDMgKEUpIChOb3ZlbWJlciAxMCwgMjAwMyk6IERhdmlkIER1Y2UgYW5kIG90aGVycy4KKy5MUAorUG9ydGFibGUgTmV0d29yayBHcmFwaGljcyAoUE5HKSBTcGVjaWZpY2F0aW9uIFZlcnNpb24gMS4yIChKdWx5IDgsIDE5OTkpOgorR2xlbm4gUmFuZGVycy1QZWhyc29uIGFuZCBvdGhlcnMgKHBuZy1saXN0KS4KKy5MUAorUG9ydGFibGUgTmV0d29yayBHcmFwaGljcyAoUE5HKSBTcGVjaWZpY2F0aW9uIFZlcnNpb24gMS4wIChPY3RvYmVyIDEsIDE5OTYpOgorVGhvbWFzIEJvdXRlbGwgYW5kIG90aGVycyAocG5nLWxpc3QpLgorLkxQCisKKworLlNIIENPUFlSSUdIVCBOT1RJQ0UKKy5MUAorVGhpcyBtYW4gcGFnZSBpcyBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNiBHbGVubiBSYW5kZXJzLVBlaHJzb24uICBTZWUgcG5nLmgKK2ZvciBjb25kaXRpb25zIG9mIHVzZSBhbmQgZGlzdHJpYnV0aW9uLgorLkxQCitUaGUgUE5HIFNwZWNpZmljYXRpb24gKFNlY29uZCBFZGl0aW9uKSBpcworQ29weXJpZ2h0IChjKSAyMDAzIFczQy4gKE1JVCwgRVJDSU0sIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorLkxQCitUaGUgUE5HLTEuMiBzcGVjaWZpY2F0aW9uIGlzIGNvcHlyaWdodCAoYykgMTk5OSBHbGVubiBSYW5kZXJzLVBlaHJzb24uCitTZWUgdGhlIHNwZWNpZmljYXRpb24gZm9yIGNvbmRpdGlvbnMgb2YgdXNlIGFuZCBkaXN0cmlidXRpb24uCisuTFAKK1RoZSBQTkctMS4wIHNwZWNpZmljYXRpb24gaXMgY29weXJpZ2h0IChjKSAxOTk2IE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mCitUZWNobm9sb2d5LiAgU2VlIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBjb25kaXRpb25zIG9mIHVzZSBhbmQgZGlzdHJpYnV0aW9uLgorLkxQCisuXCIgZW5kIG9mIG1hbiBwYWdlCisKZGlmZiAtLWdpdCBhL2xpYnBuZy9wbmcuYyBiL2xpYnBuZy9wbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTgzZTNmCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3BuZy5jCkBAIC0wLDAgKzEsNDQ5OCBAQAorCisvKiBwbmcuYyAtIGxvY2F0aW9uIGZvciBnZW5lcmFsIHB1cnBvc2UgbGlicG5nIGZ1bmN0aW9ucworICoKKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS42LjE5IFtOb3ZlbWJlciAxMiwgMjAxNV0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDE1IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCisgKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCisgKi8KKworI2luY2x1ZGUgInBuZ3ByaXYuaCIKKworLyogR2VuZXJhdGUgYSBjb21waWxlciBlcnJvciBpZiB0aGVyZSBpcyBhbiBvbGQgcG5nLmggaW4gdGhlIHNlYXJjaCBwYXRoLiAqLwordHlwZWRlZiBwbmdfbGlicG5nX3ZlcnNpb25fMV82XzIwIFlvdXJfcG5nX2hfaXNfbm90X3ZlcnNpb25fMV82XzIwOworCisvKiBUZWxscyBsaWJwbmcgdGhhdCB3ZSBoYXZlIGFscmVhZHkgaGFuZGxlZCB0aGUgZmlyc3QgIm51bV9ieXRlcyIgYnl0ZXMKKyAqIG9mIHRoZSBQTkcgZmlsZSBzaWduYXR1cmUuICBJZiB0aGUgUE5HIGRhdGEgaXMgZW1iZWRkZWQgaW50byBhbm90aGVyCisgKiBzdHJlYW0gd2UgY2FuIHNldCBudW1fYnl0ZXMgPSA4IHNvIHRoYXQgbGlicG5nIHdpbGwgbm90IGF0dGVtcHQgdG8gcmVhZAorICogb3Igd3JpdGUgYW55IG9mIHRoZSBtYWdpYyBieXRlcyBiZWZvcmUgaXQgc3RhcnRzIG9uIHRoZSBJSERSLgorICovCisKKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3NpZ19ieXRlcyhwbmdfc3RydWN0cnAgcG5nX3B0ciwgaW50IG51bV9ieXRlcykKK3sKKyAgIHVuc2lnbmVkIGludCBuYiA9ICh1bnNpZ25lZCBpbnQpbnVtX2J5dGVzOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfc2lnX2J5dGVzIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIGlmIChudW1fYnl0ZXMgPCAwKQorICAgICAgbmIgPSAwOworCisgICBpZiAobmIgPiA4KQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJUb28gbWFueSBieXRlcyBmb3IgUE5HIHNpZ25hdHVyZSIpOworCisgICBwbmdfcHRyLT5zaWdfYnl0ZXMgPSAocG5nX2J5dGUpbmI7Cit9CisKKy8qIENoZWNrcyB3aGV0aGVyIHRoZSBzdXBwbGllZCBieXRlcyBtYXRjaCB0aGUgUE5HIHNpZ25hdHVyZS4gIFdlIGFsbG93CisgKiBjaGVja2luZyBsZXNzIHRoYW4gdGhlIGZ1bGwgOC1ieXRlIHNpZ25hdHVyZSBzbyB0aGF0IHRob3NlIGFwcHMgdGhhdAorICogYWxyZWFkeSByZWFkIHRoZSBmaXJzdCBmZXcgYnl0ZXMgb2YgYSBmaWxlIHRvIGRldGVybWluZSB0aGUgZmlsZSB0eXBlCisgKiBjYW4gc2ltcGx5IGNoZWNrIHRoZSByZW1haW5pbmcgYnl0ZXMgZm9yIGV4dHJhIGFzc3VyYW5jZS4gIFJldHVybnMKKyAqIGFuIGludGVnZXIgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHplcm8gaWYgc2lnIGlzIGZvdW5kLAorICogcmVzcGVjdGl2ZWx5LCB0byBiZSBsZXNzIHRoYW4sIHRvIG1hdGNoLCBvciBiZSBncmVhdGVyIHRoYW4gdGhlIGNvcnJlY3QKKyAqIFBORyBzaWduYXR1cmUgKHRoaXMgaXMgdGhlIHNhbWUgYmVoYXZpb3IgYXMgc3RyY21wLCBtZW1jbXAsIGV0YykuCisgKi8KK2ludCBQTkdBUEkKK3BuZ19zaWdfY21wKHBuZ19jb25zdF9ieXRlcCBzaWcsIHBuZ19zaXplX3Qgc3RhcnQsIHBuZ19zaXplX3QgbnVtX3RvX2NoZWNrKQoreworICAgcG5nX2J5dGUgcG5nX3NpZ25hdHVyZVs4XSA9IHsxMzcsIDgwLCA3OCwgNzEsIDEzLCAxMCwgMjYsIDEwfTsKKworICAgaWYgKG51bV90b19jaGVjayA+IDgpCisgICAgICBudW1fdG9fY2hlY2sgPSA4OworCisgICBlbHNlIGlmIChudW1fdG9fY2hlY2sgPCAxKQorICAgICAgcmV0dXJuICgtMSk7CisKKyAgIGlmIChzdGFydCA+IDcpCisgICAgICByZXR1cm4gKC0xKTsKKworICAgaWYgKHN0YXJ0ICsgbnVtX3RvX2NoZWNrID4gOCkKKyAgICAgIG51bV90b19jaGVjayA9IDggLSBzdGFydDsKKworICAgcmV0dXJuICgoaW50KShtZW1jbXAoJnNpZ1tzdGFydF0sICZwbmdfc2lnbmF0dXJlW3N0YXJ0XSwgbnVtX3RvX2NoZWNrKSkpOworfQorCisjZW5kaWYgLyogUkVBRCAqLworCisjaWYgZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NVUFBPUlRFRCkKKy8qIEZ1bmN0aW9uIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgemxpYiAqLworUE5HX0ZVTkNUSU9OKHZvaWRwZiAvKiBQUklWQVRFICovLAorcG5nX3phbGxvYywodm9pZHBmIHBuZ19wdHIsIHVJbnQgaXRlbXMsIHVJbnQgc2l6ZSksUE5HX0FMTE9DQVRFRCkKK3sKKyAgIHBuZ19hbGxvY19zaXplX3QgbnVtX2J5dGVzID0gc2l6ZTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybiBOVUxMOworCisgICBpZiAoaXRlbXMgPj0gKH4ocG5nX2FsbG9jX3NpemVfdCkwKS9zaXplKQorICAgeworICAgICAgcG5nX3dhcm5pbmcgKHBuZ192b2lkY2FzdChwbmdfc3RydWN0cnAsIHBuZ19wdHIpLAorICAgICAgICAgIlBvdGVudGlhbCBvdmVyZmxvdyBpbiBwbmdfemFsbG9jKCkiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorCisgICBudW1fYnl0ZXMgKj0gaXRlbXM7CisgICByZXR1cm4gcG5nX21hbGxvY193YXJuKHBuZ192b2lkY2FzdChwbmdfc3RydWN0cnAsIHBuZ19wdHIpLCBudW1fYnl0ZXMpOworfQorCisvKiBGdW5jdGlvbiB0byBmcmVlIG1lbW9yeSBmb3IgemxpYiAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfemZyZWUodm9pZHBmIHBuZ19wdHIsIHZvaWRwZiBwdHIpCit7CisgICBwbmdfZnJlZShwbmdfdm9pZGNhc3QocG5nX2NvbnN0X3N0cnVjdHJwLHBuZ19wdHIpLCBwdHIpOworfQorCisvKiBSZXNldCB0aGUgQ1JDIHZhcmlhYmxlIHRvIDMyIGJpdHMgb2YgMSdzLiAgQ2FyZSBtdXN0IGJlIHRha2VuCisgKiBpbiBjYXNlIENSQyBpcyA+IDMyIGJpdHMgdG8gbGVhdmUgdGhlIHRvcCBiaXRzIDAuCisgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3Jlc2V0X2NyYyhwbmdfc3RydWN0cnAgcG5nX3B0cikKK3sKKyAgIC8qIFRoZSBjYXN0IGlzIHNhZmUgYmVjYXVzZSB0aGUgY3JjIGlzIGEgMzItYml0IHZhbHVlLiAqLworICAgcG5nX3B0ci0+Y3JjID0gKHBuZ191aW50XzMyKWNyYzMyKDAsIFpfTlVMTCwgMCk7Cit9CisKKy8qIENhbGN1bGF0ZSB0aGUgQ1JDIG92ZXIgYSBzZWN0aW9uIG9mIGRhdGEuICBXZSBjYW4gb25seSBwYXNzIGFzCisgKiBtdWNoIGRhdGEgdG8gdGhpcyByb3V0aW5lIGFzIHRoZSBsYXJnZXN0IHNpbmdsZSBidWZmZXIgc2l6ZS4gIFdlCisgKiBhbHNvIGNoZWNrIHRoYXQgdGhpcyBkYXRhIHdpbGwgYWN0dWFsbHkgYmUgdXNlZCBiZWZvcmUgZ29pbmcgdG8gdGhlCisgKiB0cm91YmxlIG9mIGNhbGN1bGF0aW5nIGl0LgorICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19jYWxjdWxhdGVfY3JjKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfYnl0ZXAgcHRyLCBwbmdfc2l6ZV90IGxlbmd0aCkKK3sKKyAgIGludCBuZWVkX2NyYyA9IDE7CisKKyAgIGlmIChQTkdfQ0hVTktfQU5DSUxMQVJZKHBuZ19wdHItPmNodW5rX25hbWUpICE9IDApCisgICB7CisgICAgICBpZiAoKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9NQVNLKSA9PQorICAgICAgICAgIChQTkdfRkxBR19DUkNfQU5DSUxMQVJZX1VTRSB8IFBOR19GTEFHX0NSQ19BTkNJTExBUllfTk9XQVJOKSkKKyAgICAgICAgIG5lZWRfY3JjID0gMDsKKyAgIH0KKworICAgZWxzZSAvKiBjcml0aWNhbCAqLworICAgeworICAgICAgaWYgKChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0NSQ19DUklUSUNBTF9JR05PUkUpICE9IDApCisgICAgICAgICBuZWVkX2NyYyA9IDA7CisgICB9CisKKyAgIC8qICd1TG9uZycgaXMgZGVmaW5lZCBpbiB6bGliLmggYXMgdW5zaWduZWQgbG9uZzsgdGhpcyBtZWFucyB0aGF0IG9uIHNvbWUKKyAgICAqIHN5c3RlbXMgaXQgaXMgYSA2NC1iaXQgdmFsdWUuICBjcmMzMiwgaG93ZXZlciwgcmV0dXJucyAzMiBiaXRzIHNvIHRoZQorICAgICogZm9sbG93aW5nIGNhc3QgaXMgc2FmZS4gICd1SW50JyBtYXkgYmUgbm8gbW9yZSB0aGFuIDE2IGJpdHMsIHNvIGl0IGlzCisgICAgKiBuZWNlc3NhcnkgdG8gcGVyZm9ybSBhIGxvb3AgaGVyZS4KKyAgICAqLworICAgaWYgKG5lZWRfY3JjICE9IDAgJiYgbGVuZ3RoID4gMCkKKyAgIHsKKyAgICAgIHVMb25nIGNyYyA9IHBuZ19wdHItPmNyYzsgLyogU2hvdWxkIG5ldmVyIGlzc3VlIGEgd2FybmluZyAqLworCisgICAgICBkbworICAgICAgeworICAgICAgICAgdUludCBzYWZlX2xlbmd0aCA9ICh1SW50KWxlbmd0aDsKKyNpZm5kZWYgX19DT1ZFUklUWV9fCisgICAgICAgICBpZiAoc2FmZV9sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHNhZmVfbGVuZ3RoID0gKHVJbnQpLTE7IC8qIGV2aWwsIGJ1dCBzYWZlICovCisjZW5kaWYKKworICAgICAgICAgY3JjID0gY3JjMzIoY3JjLCBwdHIsIHNhZmVfbGVuZ3RoKTsKKworICAgICAgICAgLyogVGhlIGZvbGxvd2luZyBzaG91bGQgbmV2ZXIgaXNzdWUgY29tcGlsZXIgd2FybmluZ3M7IGlmIHRoZXkgZG8gdGhlCisgICAgICAgICAgKiB0YXJnZXQgc3lzdGVtIGhhcyBjaGFyYWN0ZXJpc3RpY3MgdGhhdCB3aWxsIHByb2JhYmx5IHZpb2xhdGUgb3RoZXIKKyAgICAgICAgICAqIGFzc3VtcHRpb25zIHdpdGhpbiB0aGUgbGlicG5nIGNvZGUuCisgICAgICAgICAgKi8KKyAgICAgICAgIHB0ciArPSBzYWZlX2xlbmd0aDsKKyAgICAgICAgIGxlbmd0aCAtPSBzYWZlX2xlbmd0aDsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChsZW5ndGggPiAwKTsKKworICAgICAgLyogQW5kIHRoZSBmb2xsb3dpbmcgaXMgYWx3YXlzIHNhZmUgYmVjYXVzZSB0aGUgY3JjIGlzIG9ubHkgMzIgYml0cy4gKi8KKyAgICAgIHBuZ19wdHItPmNyYyA9IChwbmdfdWludF8zMiljcmM7CisgICB9Cit9CisKKy8qIENoZWNrIGEgdXNlciBzdXBwbGllZCB2ZXJzaW9uIG51bWJlciwgY2FsbGVkIGZyb20gYm90aCByZWFkIGFuZCB3cml0ZQorICogZnVuY3Rpb25zIHRoYXQgY3JlYXRlIGEgcG5nX3N0cnVjdC4KKyAqLworaW50CitwbmdfdXNlcl92ZXJzaW9uX2NoZWNrKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgdXNlcl9wbmdfdmVyKQoreworICAgICAvKiBMaWJwbmcgdmVyc2lvbnMgMS4wLjAgYW5kIGxhdGVyIGFyZSBiaW5hcnkgY29tcGF0aWJsZSBpZiB0aGUgdmVyc2lvbgorICAgICAgKiBzdHJpbmcgbWF0Y2hlcyB0aHJvdWdoIHRoZSBzZWNvbmQgJy4nOyB3ZSBtdXN0IHJlY29tcGlsZSBhbnkKKyAgICAgICogYXBwbGljYXRpb25zIHRoYXQgdXNlIGFueSBvbGRlciBsaWJyYXJ5IHZlcnNpb24uCisgICAgICAqLworCisgICBpZiAodXNlcl9wbmdfdmVyICE9IE5VTEwpCisgICB7CisgICAgICBpbnQgaSA9IC0xOworICAgICAgaW50IGZvdW5kX2RvdHMgPSAwOworCisgICAgICBkbworICAgICAgeworICAgICAgICAgaSsrOworICAgICAgICAgaWYgKHVzZXJfcG5nX3ZlcltpXSAhPSBQTkdfTElCUE5HX1ZFUl9TVFJJTkdbaV0pCisgICAgICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19MSUJSQVJZX01JU01BVENIOworICAgICAgICAgaWYgKHVzZXJfcG5nX3ZlcltpXSA9PSAnLicpCisgICAgICAgICAgICBmb3VuZF9kb3RzKys7CisgICAgICB9IHdoaWxlIChmb3VuZF9kb3RzIDwgMiAmJiB1c2VyX3BuZ192ZXJbaV0gIT0gMCAmJgorICAgICAgICAgICAgUE5HX0xJQlBOR19WRVJfU1RSSU5HW2ldICE9IDApOworICAgfQorCisgICBlbHNlCisgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19MSUJSQVJZX01JU01BVENIOworCisgICBpZiAoKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfTElCUkFSWV9NSVNNQVRDSCkgIT0gMCkKKyAgIHsKKyNpZmRlZiBQTkdfV0FSTklOR1NfU1VQUE9SVEVECisgICAgICBzaXplX3QgcG9zID0gMDsKKyAgICAgIGNoYXIgbVsxMjhdOworCisgICAgICBwb3MgPSBwbmdfc2FmZWNhdChtLCAoc2l6ZW9mIG0pLCBwb3MsCisgICAgICAgICAgIkFwcGxpY2F0aW9uIGJ1aWx0IHdpdGggbGlicG5nLSIpOworICAgICAgcG9zID0gcG5nX3NhZmVjYXQobSwgKHNpemVvZiBtKSwgcG9zLCB1c2VyX3BuZ192ZXIpOworICAgICAgcG9zID0gcG5nX3NhZmVjYXQobSwgKHNpemVvZiBtKSwgcG9zLCAiIGJ1dCBydW5uaW5nIHdpdGggIik7CisgICAgICBwb3MgPSBwbmdfc2FmZWNhdChtLCAoc2l6ZW9mIG0pLCBwb3MsIFBOR19MSUJQTkdfVkVSX1NUUklORyk7CisgICAgICBQTkdfVU5VU0VEKHBvcykKKworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgbSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19FUlJPUl9OVU1CRVJTX1NVUFBPUlRFRAorICAgICAgcG5nX3B0ci0+ZmxhZ3MgPSAwOworI2VuZGlmCisKKyAgICAgIHJldHVybiAwOworICAgfQorCisgICAvKiBTdWNjZXNzIHJldHVybi4gKi8KKyAgIHJldHVybiAxOworfQorCisvKiBHZW5lcmljIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHBuZ19zdHJ1Y3QgZm9yIGVpdGhlciByZWFkIG9yIHdyaXRlIC0gdGhpcworICogY29udGFpbnMgdGhlIGNvbW1vbiBpbml0aWFsaXphdGlvbi4KKyAqLworUE5HX0ZVTkNUSU9OKHBuZ19zdHJ1Y3RwIC8qIFBSSVZBVEUgKi8sCitwbmdfY3JlYXRlX3BuZ19zdHJ1Y3QsKHBuZ19jb25zdF9jaGFycCB1c2VyX3BuZ192ZXIsIHBuZ192b2lkcCBlcnJvcl9wdHIsCisgICAgcG5nX2Vycm9yX3B0ciBlcnJvcl9mbiwgcG5nX2Vycm9yX3B0ciB3YXJuX2ZuLCBwbmdfdm9pZHAgbWVtX3B0ciwKKyAgICBwbmdfbWFsbG9jX3B0ciBtYWxsb2NfZm4sIHBuZ19mcmVlX3B0ciBmcmVlX2ZuKSxQTkdfQUxMT0NBVEVEKQoreworICAgcG5nX3N0cnVjdCBjcmVhdGVfc3RydWN0OworIyAgaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKKyAgICAgIGptcF9idWYgY3JlYXRlX2ptcF9idWY7CisjICBlbmRpZgorCisgICAvKiBUaGlzIHRlbXBvcmFyeSBzdGFjay1hbGxvY2F0ZWQgc3RydWN0dXJlIGlzIHVzZWQgdG8gcHJvdmlkZSBhIHBsYWNlIHRvCisgICAgKiBidWlsZCBlbm91Z2ggY29udGV4dCB0byBhbGxvdyB0aGUgdXNlciBwcm92aWRlZCBtZW1vcnkgYWxsb2NhdG9yIChpZiBhbnkpCisgICAgKiB0byBiZSBjYWxsZWQuCisgICAgKi8KKyAgIG1lbXNldCgmY3JlYXRlX3N0cnVjdCwgMCwgKHNpemVvZiBjcmVhdGVfc3RydWN0KSk7CisKKyAgIC8qIEFkZGVkIGF0IGxpYnBuZy0xLjIuNiAqLworIyAgaWZkZWYgUE5HX1VTRVJfTElNSVRTX1NVUFBPUlRFRAorICAgICAgY3JlYXRlX3N0cnVjdC51c2VyX3dpZHRoX21heCA9IFBOR19VU0VSX1dJRFRIX01BWDsKKyAgICAgIGNyZWF0ZV9zdHJ1Y3QudXNlcl9oZWlnaHRfbWF4ID0gUE5HX1VTRVJfSEVJR0hUX01BWDsKKworIyAgICAgaWZkZWYgUE5HX1VTRVJfQ0hVTktfQ0FDSEVfTUFYCisgICAgICAvKiBBZGRlZCBhdCBsaWJwbmctMS4yLjQzIGFuZCAxLjQuMCAqLworICAgICAgY3JlYXRlX3N0cnVjdC51c2VyX2NodW5rX2NhY2hlX21heCA9IFBOR19VU0VSX0NIVU5LX0NBQ0hFX01BWDsKKyMgICAgIGVuZGlmCisKKyMgICAgIGlmZGVmIFBOR19VU0VSX0NIVU5LX01BTExPQ19NQVgKKyAgICAgIC8qIEFkZGVkIGF0IGxpYnBuZy0xLjIuNDMgYW5kIDEuNC4xLCByZXF1aXJlZCBvbmx5IGZvciByZWFkIGJ1dCBleGlzdHMKKyAgICAgICAqIGluIHBuZ19zdHJ1Y3QgcmVnYXJkbGVzcy4KKyAgICAgICAqLworICAgICAgY3JlYXRlX3N0cnVjdC51c2VyX2NodW5rX21hbGxvY19tYXggPSBQTkdfVVNFUl9DSFVOS19NQUxMT0NfTUFYOworIyAgICAgZW5kaWYKKyMgIGVuZGlmCisKKyAgIC8qIFRoZSBmb2xsb3dpbmcgdHdvIEFQSSBjYWxscyBzaW1wbHkgc2V0IGZpZWxkcyBpbiBwbmdfc3RydWN0LCBzbyBpdCBpcyBzYWZlCisgICAgKiB0byBkbyB0aGVtIG5vdyBldmVuIHRob3VnaCBlcnJvciBoYW5kbGluZyBpcyBub3QgeWV0IHNldCB1cC4KKyAgICAqLworIyAgaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAorICAgICAgcG5nX3NldF9tZW1fZm4oJmNyZWF0ZV9zdHJ1Y3QsIG1lbV9wdHIsIG1hbGxvY19mbiwgZnJlZV9mbik7CisjICBlbHNlCisgICAgICBQTkdfVU5VU0VEKG1lbV9wdHIpCisgICAgICBQTkdfVU5VU0VEKG1hbGxvY19mbikKKyAgICAgIFBOR19VTlVTRUQoZnJlZV9mbikKKyMgIGVuZGlmCisKKyAgIC8qICgqZXJyb3JfZm4pIGNhbiByZXR1cm4gY29udHJvbCB0byB0aGUgY2FsbGVyIGFmdGVyIHRoZSBlcnJvcl9wdHIgaXMgc2V0LAorICAgICogdGhpcyB3aWxsIHJlc3VsdCBpbiBhIG1lbW9yeSBsZWFrIHVubGVzcyB0aGUgZXJyb3JfZm4gZG9lcyBzb21ldGhpbmcKKyAgICAqIGV4dHJlbWVseSBzb3BoaXN0aWNhdGVkLiAgVGhlIGRlc2lnbiBsYWNrcyBtZXJpdCBidXQgaXMgaW1wbGljaXQgaW4gdGhlCisgICAgKiBBUEkuCisgICAgKi8KKyAgIHBuZ19zZXRfZXJyb3JfZm4oJmNyZWF0ZV9zdHJ1Y3QsIGVycm9yX3B0ciwgZXJyb3JfZm4sIHdhcm5fZm4pOworCisjICBpZmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRAorICAgICAgaWYgKCFzZXRqbXAoY3JlYXRlX2ptcF9idWYpKQorIyAgZW5kaWYKKyAgICAgIHsKKyMgIGlmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECisgICAgICAgICAvKiBUZW1wb3JhcmlseSBmYWtlIG91dCB0aGUgbG9uZ2ptcCBpbmZvcm1hdGlvbiB1bnRpbCB3ZSBoYXZlCisgICAgICAgICAgKiBzdWNjZXNzZnVsbHkgY29tcGxldGVkIHRoaXMgZnVuY3Rpb24uICBUaGlzIG9ubHkgd29ya3MgaWYgd2UgaGF2ZQorICAgICAgICAgICogc2V0am1wKCkgc3VwcG9ydCBjb21waWxlZCBpbiwgYnV0IGl0IGlzIHNhZmUgLSB0aGlzIHN0dWZmIHNob3VsZAorICAgICAgICAgICogbmV2ZXIgaGFwcGVuLgorICAgICAgICAgICovCisgICAgICAgICBjcmVhdGVfc3RydWN0LmptcF9idWZfcHRyID0gJmNyZWF0ZV9qbXBfYnVmOworICAgICAgICAgY3JlYXRlX3N0cnVjdC5qbXBfYnVmX3NpemUgPSAwOyAvKnN0YWNrIGFsbG9jYXRpb24qLworICAgICAgICAgY3JlYXRlX3N0cnVjdC5sb25nam1wX2ZuID0gbG9uZ2ptcDsKKyMgIGVuZGlmCisgICAgICAgICAvKiBDYWxsIHRoZSBnZW5lcmFsIHZlcnNpb24gY2hlY2tlciAoc2hhcmVkIHdpdGggcmVhZCBhbmQgd3JpdGUgY29kZSk6CisgICAgICAgICAgKi8KKyAgICAgICAgIGlmIChwbmdfdXNlcl92ZXJzaW9uX2NoZWNrKCZjcmVhdGVfc3RydWN0LCB1c2VyX3BuZ192ZXIpICE9IDApCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfc3RydWN0cnAgcG5nX3B0ciA9IHBuZ192b2lkY2FzdChwbmdfc3RydWN0cnAsCisgICAgICAgICAgICAgICBwbmdfbWFsbG9jX3dhcm4oJmNyZWF0ZV9zdHJ1Y3QsIChzaXplb2YgKnBuZ19wdHIpKSk7CisKKyAgICAgICAgICAgIGlmIChwbmdfcHRyICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvKiBwbmdfcHRyLT56c3RyZWFtIGhvbGRzIGEgYmFjay1wb2ludGVyIHRvIHRoZSBwbmdfc3RydWN0LCBzbworICAgICAgICAgICAgICAgICogdGhpcyBjYW4gb25seSBiZSBkb25lIG5vdzoKKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgY3JlYXRlX3N0cnVjdC56c3RyZWFtLnphbGxvYyA9IHBuZ196YWxsb2M7CisgICAgICAgICAgICAgICBjcmVhdGVfc3RydWN0LnpzdHJlYW0uemZyZWUgPSBwbmdfemZyZWU7CisgICAgICAgICAgICAgICBjcmVhdGVfc3RydWN0LnpzdHJlYW0ub3BhcXVlID0gcG5nX3B0cjsKKworIyAgICAgICAgICAgICAgaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKKyAgICAgICAgICAgICAgIC8qIEVsaW1pbmF0ZSB0aGUgbG9jYWwgZXJyb3IgaGFuZGxpbmc6ICovCisgICAgICAgICAgICAgICBjcmVhdGVfc3RydWN0LmptcF9idWZfcHRyID0gTlVMTDsKKyAgICAgICAgICAgICAgIGNyZWF0ZV9zdHJ1Y3Quam1wX2J1Zl9zaXplID0gMDsKKyAgICAgICAgICAgICAgIGNyZWF0ZV9zdHJ1Y3QubG9uZ2ptcF9mbiA9IDA7CisjICAgICAgICAgICAgICBlbmRpZgorCisgICAgICAgICAgICAgICAqcG5nX3B0ciA9IGNyZWF0ZV9zdHJ1Y3Q7CisKKyAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgdGhlIHN1Y2Nlc3NmdWwgcmV0dXJuIHBvaW50ICovCisgICAgICAgICAgICAgICByZXR1cm4gcG5nX3B0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgLyogQSBsb25nam1wIGJlY2F1c2Ugb2YgYSBidWcgaW4gdGhlIGFwcGxpY2F0aW9uIHN0b3JhZ2UgYWxsb2NhdG9yIG9yIGEKKyAgICAqIHNpbXBsZSBmYWlsdXJlIHRvIGFsbG9jYXRlIHRoZSBwbmdfc3RydWN0LgorICAgICovCisgICByZXR1cm4gTlVMTDsKK30KKworLyogQWxsb2NhdGUgdGhlIG1lbW9yeSBmb3IgYW4gaW5mb19zdHJ1Y3QgZm9yIHRoZSBhcHBsaWNhdGlvbi4gKi8KK1BOR19GVU5DVElPTihwbmdfaW5mb3AsUE5HQVBJCitwbmdfY3JlYXRlX2luZm9fc3RydWN0LChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciksUE5HX0FMTE9DQVRFRCkKK3sKKyAgIHBuZ19pbmZvcnAgaW5mb19wdHI7CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdCIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIC8qIFVzZSB0aGUgaW50ZXJuYWwgQVBJIHRoYXQgZG9lcyBub3QgKG9yIGF0IGxlYXN0IHNob3VsZCBub3QpIGVycm9yIG91dCwgc28KKyAgICAqIHRoYXQgdGhpcyBjYWxsIGFsd2F5cyByZXR1cm5zIG9rLiAgVGhlIGFwcGxpY2F0aW9uIHR5cGljYWxseSBzZXRzIHVwIHRoZQorICAgICogZXJyb3IgaGFuZGxpbmcgKmFmdGVyKiBjcmVhdGluZyB0aGUgaW5mb19zdHJ1Y3QgYmVjYXVzZSB0aGlzIGlzIHRoZSB3YXkgaXQKKyAgICAqIGhhcyBhbHdheXMgYmVlbiBkb25lIGluICdleGFtcGxlLmMnLgorICAgICovCisgICBpbmZvX3B0ciA9IHBuZ192b2lkY2FzdChwbmdfaW5mb3JwLCBwbmdfbWFsbG9jX2Jhc2UocG5nX3B0ciwKKyAgICAgIChzaXplb2YgKmluZm9fcHRyKSkpOworCisgICBpZiAoaW5mb19wdHIgIT0gTlVMTCkKKyAgICAgIG1lbXNldChpbmZvX3B0ciwgMCwgKHNpemVvZiAqaW5mb19wdHIpKTsKKworICAgcmV0dXJuIGluZm9fcHRyOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGZyZWVzIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIGEgc2luZ2xlIGluZm8gc3RydWN0LgorICogTm9ybWFsbHksIG9uZSB3b3VsZCB1c2UgZWl0aGVyIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCkgb3IKKyAqIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgpIHRvIGZyZWUgYW4gaW5mbyBzdHJ1Y3QsIGJ1dCB0aGlzIG1heSBiZQorICogdXNlZnVsIGZvciBzb21lIGFwcGxpY2F0aW9ucy4gIEZyb20gbGlicG5nIDEuNi4wIHRoaXMgZnVuY3Rpb24gaXMgYWxzbyB1c2VkCisgKiBpbnRlcm5hbGx5IHRvIGltcGxlbWVudCB0aGUgcG5nX2luZm8gcmVsZWFzZSBwYXJ0IG9mIHRoZSAnc3RydWN0JyBkZXN0cm95CisgKiBBUElzLiAgVGhpcyBlbnN1cmVzIHRoYXQgYWxsIHBvc3NpYmxlIGFwcHJvYWNoZXMgZnJlZSB0aGUgc2FtZSBkYXRhIChhbGwgb2YKKyAqIGl0KS4KKyAqLwordm9pZCBQTkdBUEkKK3BuZ19kZXN0cm95X2luZm9fc3RydWN0KHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3BwIGluZm9fcHRyX3B0cikKK3sKKyAgIHBuZ19pbmZvcnAgaW5mb19wdHIgPSBOVUxMOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kZXN0cm95X2luZm9fc3RydWN0Iik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIGlmIChpbmZvX3B0cl9wdHIgIT0gTlVMTCkKKyAgICAgIGluZm9fcHRyID0gKmluZm9fcHRyX3B0cjsKKworICAgaWYgKGluZm9fcHRyICE9IE5VTEwpCisgICB7CisgICAgICAvKiBEbyB0aGlzIGZpcnN0IGluIGNhc2Ugb2YgYW4gZXJyb3IgYmVsb3c7IGlmIHRoZSBhcHAgaW1wbGVtZW50cyBpdHMgb3duCisgICAgICAgKiBtZW1vcnkgbWFuYWdlbWVudCB0aGlzIGNhbiBsZWFkIHRvIHBuZ19mcmVlIGNhbGxpbmcgcG5nX2Vycm9yLCB3aGljaAorICAgICAgICogd2lsbCBhYm9ydCB0aGlzIHJvdXRpbmUgYW5kIHJldHVybiBjb250cm9sIHRvIHRoZSBhcHAgZXJyb3IgaGFuZGxlci4KKyAgICAgICAqIEFuIGluZmluaXRlIGxvb3AgbWF5IHJlc3VsdCBpZiBpdCB0aGVuIHRyaWVzIHRvIGZyZWUgdGhlIHNhbWUgaW5mbworICAgICAgICogcHRyLgorICAgICAgICovCisgICAgICAqaW5mb19wdHJfcHRyID0gTlVMTDsKKworICAgICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0ZSRUVfQUxMLCAtMSk7CisgICAgICBtZW1zZXQoaW5mb19wdHIsIDAsIChzaXplb2YgKmluZm9fcHRyKSk7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0cik7CisgICB9Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcyBub3cgYW4gaW50ZXJuYWwgZnVuY3Rpb24gKDAuODkpCisgKiBhbmQgYXBwbGljYXRpb25zIHVzaW5nIGl0IGFyZSB1cmdlZCB0byB1c2UgcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdCgpCisgKiBpbnN0ZWFkLiAgVXNlIGRlcHJlY2F0ZWQgaW4gMS42LjAsIGludGVybmFsIHVzZSByZW1vdmVkICh1c2VkIGludGVybmFsbHkgaXQKKyAqIGlzIGp1c3QgYSBtZW1zZXQpLgorICoKKyAqIE5PVEU6IGl0IGlzIGFsbW9zdCBpbmNvbmNlaXZhYmxlIHRoYXQgdGhpcyBBUEkgaXMgdXNlZCBiZWNhdXNlIGl0IGJ5cGFzc2VzCisgKiB0aGUgdXNlci1tZW1vcnkgbWVjaGFuaXNtIGFuZCB0aGUgdXNlciBlcnJvciBoYW5kbGluZy93YXJuaW5nIG1lY2hhbmlzbXMgaW4KKyAqIHRob3NlIGNhc2VzIHdoZXJlIGl0IGRvZXMgYW55dGhpbmcgb3RoZXIgdGhhbiBhIG1lbXNldC4KKyAqLworUE5HX0ZVTkNUSU9OKHZvaWQsUE5HQVBJCitwbmdfaW5mb19pbml0XzMsKHBuZ19pbmZvcHAgcHRyX3B0ciwgcG5nX3NpemVfdCBwbmdfaW5mb19zdHJ1Y3Rfc2l6ZSksCisgICBQTkdfREVQUkVDQVRFRCkKK3sKKyAgIHBuZ19pbmZvcnAgaW5mb19wdHIgPSAqcHRyX3B0cjsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaW5mb19pbml0XzMiKTsKKworICAgaWYgKGluZm9fcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIGlmICgoc2l6ZW9mIChwbmdfaW5mbykpID4gcG5nX2luZm9fc3RydWN0X3NpemUpCisgICB7CisgICAgICAqcHRyX3B0ciA9IE5VTEw7CisgICAgICAvKiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgd2h5IHRoaXMgQVBJIHNob3VsZCBub3QgYmUgdXNlZDogKi8KKyAgICAgIGZyZWUoaW5mb19wdHIpOworICAgICAgaW5mb19wdHIgPSBwbmdfdm9pZGNhc3QocG5nX2luZm9ycCwgcG5nX21hbGxvY19iYXNlKE5VTEwsCisgICAgICAgICAoc2l6ZW9mICppbmZvX3B0cikpKTsKKyAgICAgIGlmIChpbmZvX3B0ciA9PSBOVUxMKQorICAgICAgICAgcmV0dXJuOworICAgICAgKnB0cl9wdHIgPSBpbmZvX3B0cjsKKyAgIH0KKworICAgLyogU2V0IGV2ZXJ5dGhpbmcgdG8gMCAqLworICAgbWVtc2V0KGluZm9fcHRyLCAwLCAoc2l6ZW9mICppbmZvX3B0cikpOworfQorCisvKiBUaGUgZm9sbG93aW5nIEFQSSBpcyBub3QgY2FsbGVkIGludGVybmFsbHkgKi8KK3ZvaWQgUE5HQVBJCitwbmdfZGF0YV9mcmVlcihwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwKKyAgIGludCBmcmVlciwgcG5nX3VpbnRfMzIgbWFzaykKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RhdGFfZnJlZXIiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBpZiAoZnJlZXIgPT0gUE5HX0RFU1RST1lfV0lMTF9GUkVFX0RBVEEpCisgICAgICBpbmZvX3B0ci0+ZnJlZV9tZSB8PSBtYXNrOworCisgICBlbHNlIGlmIChmcmVlciA9PSBQTkdfVVNFUl9XSUxMX0ZSRUVfREFUQSkKKyAgICAgIGluZm9fcHRyLT5mcmVlX21lICY9IH5tYXNrOworCisgICBlbHNlCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlVua25vd24gZnJlZXIgcGFyYW1ldGVyIGluIHBuZ19kYXRhX2ZyZWVyIik7Cit9CisKK3ZvaWQgUE5HQVBJCitwbmdfZnJlZV9kYXRhKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBtYXNrLAorICAgaW50IG51bSkKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2ZyZWVfZGF0YSIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyNpZmRlZiBQTkdfVEVYVF9TVVBQT1JURUQKKyAgIC8qIEZyZWUgdGV4dCBpdGVtIG51bSBvciAoaWYgbnVtID09IC0xKSBhbGwgdGV4dCBpdGVtcyAqLworICAgaWYgKGluZm9fcHRyLT50ZXh0ICE9IDAgJiYKKyAgICAgICAoKG1hc2sgJiBQTkdfRlJFRV9URVhUKSAmIGluZm9fcHRyLT5mcmVlX21lKSAhPSAwKQorICAgeworICAgICAgaWYgKG51bSAhPSAtMSkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT50ZXh0W251bV0ua2V5KTsKKyAgICAgICAgIGluZm9fcHRyLT50ZXh0W251bV0ua2V5ID0gTlVMTDsKKyAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgaW50IGk7CisKKyAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmZvX3B0ci0+bnVtX3RleHQ7IGkrKykKKyAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT50ZXh0W2ldLmtleSk7CisKKyAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT50ZXh0KTsKKyAgICAgICAgIGluZm9fcHRyLT50ZXh0ID0gTlVMTDsKKyAgICAgICAgIGluZm9fcHRyLT5udW1fdGV4dCA9IDA7CisgICAgICB9CisgICB9CisjZW5kaWYKKworI2lmZGVmIFBOR190Uk5TX1NVUFBPUlRFRAorICAgLyogRnJlZSBhbnkgdFJOUyBlbnRyeSAqLworICAgaWYgKCgobWFzayAmIFBOR19GUkVFX1RSTlMpICYgaW5mb19wdHItPmZyZWVfbWUpICE9IDApCisgICB7CisgICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gflBOR19JTkZPX3RSTlM7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+dHJhbnNfYWxwaGEpOworICAgICAgaW5mb19wdHItPnRyYW5zX2FscGhhID0gTlVMTDsKKyAgICAgIGluZm9fcHRyLT5udW1fdHJhbnMgPSAwOworICAgfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfc0NBTF9TVVBQT1JURUQKKyAgIC8qIEZyZWUgYW55IHNDQUwgZW50cnkgKi8KKyAgIGlmICgoKG1hc2sgJiBQTkdfRlJFRV9TQ0FMKSAmIGluZm9fcHRyLT5mcmVlX21lKSAhPSAwKQorICAgeworICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPnNjYWxfc193aWR0aCk7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+c2NhbF9zX2hlaWdodCk7CisgICAgICBpbmZvX3B0ci0+c2NhbF9zX3dpZHRoID0gTlVMTDsKKyAgICAgIGluZm9fcHRyLT5zY2FsX3NfaGVpZ2h0ID0gTlVMTDsKKyAgICAgIGluZm9fcHRyLT52YWxpZCAmPSB+UE5HX0lORk9fc0NBTDsKKyAgIH0KKyNlbmRpZgorCisjaWZkZWYgUE5HX3BDQUxfU1VQUE9SVEVECisgICAvKiBGcmVlIGFueSBwQ0FMIGVudHJ5ICovCisgICBpZiAoKChtYXNrICYgUE5HX0ZSRUVfUENBTCkgJiBpbmZvX3B0ci0+ZnJlZV9tZSkgIT0gMCkKKyAgIHsKKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT5wY2FsX3B1cnBvc2UpOworICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPnBjYWxfdW5pdHMpOworICAgICAgaW5mb19wdHItPnBjYWxfcHVycG9zZSA9IE5VTEw7CisgICAgICBpbmZvX3B0ci0+cGNhbF91bml0cyA9IE5VTEw7CisKKyAgICAgIGlmIChpbmZvX3B0ci0+cGNhbF9wYXJhbXMgIT0gTlVMTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5mb19wdHItPnBjYWxfbnBhcmFtczsgaSsrKQorICAgICAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPnBjYWxfcGFyYW1zW2ldKTsKKworICAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPnBjYWxfcGFyYW1zKTsKKyAgICAgICAgICAgIGluZm9fcHRyLT5wY2FsX3BhcmFtcyA9IE5VTEw7CisgICAgICAgICB9CisgICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gflBOR19JTkZPX3BDQUw7CisgICB9CisjZW5kaWYKKworI2lmZGVmIFBOR19pQ0NQX1NVUFBPUlRFRAorICAgLyogRnJlZSBhbnkgcHJvZmlsZSBlbnRyeSAqLworICAgaWYgKCgobWFzayAmIFBOR19GUkVFX0lDQ1ApICYgaW5mb19wdHItPmZyZWVfbWUpICE9IDApCisgICB7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+aWNjcF9uYW1lKTsKKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT5pY2NwX3Byb2ZpbGUpOworICAgICAgaW5mb19wdHItPmljY3BfbmFtZSA9IE5VTEw7CisgICAgICBpbmZvX3B0ci0+aWNjcF9wcm9maWxlID0gTlVMTDsKKyAgICAgIGluZm9fcHRyLT52YWxpZCAmPSB+UE5HX0lORk9faUNDUDsKKyAgIH0KKyNlbmRpZgorCisjaWZkZWYgUE5HX3NQTFRfU1VQUE9SVEVECisgICAvKiBGcmVlIGEgZ2l2ZW4gc1BMVCBlbnRyeSwgb3IgKGlmIG51bSA9PSAtMSkgYWxsIHNQTFQgZW50cmllcyAqLworICAgaWYgKGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzICE9IDAgJiYKKyAgICAgICAoKG1hc2sgJiBQTkdfRlJFRV9TUExUKSAmIGluZm9fcHRyLT5mcmVlX21lKSAhPSAwKQorICAgeworICAgICAgaWYgKG51bSAhPSAtMSkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzW251bV0ubmFtZSk7CisgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+c3BsdF9wYWxldHRlc1tudW1dLmVudHJpZXMpOworICAgICAgICAgaW5mb19wdHItPnNwbHRfcGFsZXR0ZXNbbnVtXS5uYW1lID0gTlVMTDsKKyAgICAgICAgIGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzW251bV0uZW50cmllcyA9IE5VTEw7CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGludCBpOworCisgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5mb19wdHItPnNwbHRfcGFsZXR0ZXNfbnVtOyBpKyspCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+c3BsdF9wYWxldHRlc1tpXS5uYW1lKTsKKyAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzW2ldLmVudHJpZXMpOworICAgICAgICAgfQorCisgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+c3BsdF9wYWxldHRlcyk7CisgICAgICAgICBpbmZvX3B0ci0+c3BsdF9wYWxldHRlcyA9IE5VTEw7CisgICAgICAgICBpbmZvX3B0ci0+c3BsdF9wYWxldHRlc19udW0gPSAwOworICAgICAgICAgaW5mb19wdHItPnZhbGlkICY9IH5QTkdfSU5GT19zUExUOworICAgICAgfQorICAgfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfU1RPUkVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECisgICBpZiAoaW5mb19wdHItPnVua25vd25fY2h1bmtzICE9IDAgJiYKKyAgICAgICAoKG1hc2sgJiBQTkdfRlJFRV9VTktOKSAmIGluZm9fcHRyLT5mcmVlX21lKSAhPSAwKQorICAgeworICAgICAgaWYgKG51bSAhPSAtMSkKKyAgICAgIHsKKyAgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3NbbnVtXS5kYXRhKTsKKyAgICAgICAgICBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3NbbnVtXS5kYXRhID0gTlVMTDsKKyAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgaW50IGk7CisKKyAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3NfbnVtOyBpKyspCisgICAgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3NbaV0uZGF0YSk7CisKKyAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT51bmtub3duX2NodW5rcyk7CisgICAgICAgICBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3MgPSBOVUxMOworICAgICAgICAgaW5mb19wdHItPnVua25vd25fY2h1bmtzX251bSA9IDA7CisgICAgICB9CisgICB9CisjZW5kaWYKKworI2lmZGVmIFBOR19oSVNUX1NVUFBPUlRFRAorICAgLyogRnJlZSBhbnkgaElTVCBlbnRyeSAqLworICAgaWYgKCgobWFzayAmIFBOR19GUkVFX0hJU1QpICYgaW5mb19wdHItPmZyZWVfbWUpICE9IDApCisgICB7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+aGlzdCk7CisgICAgICBpbmZvX3B0ci0+aGlzdCA9IE5VTEw7CisgICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gflBOR19JTkZPX2hJU1Q7CisgICB9CisjZW5kaWYKKworICAgLyogRnJlZSBhbnkgUExURSBlbnRyeSB0aGF0IHdhcyBpbnRlcm5hbGx5IGFsbG9jYXRlZCAqLworICAgaWYgKCgobWFzayAmIFBOR19GUkVFX1BMVEUpICYgaW5mb19wdHItPmZyZWVfbWUpICE9IDApCisgICB7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+cGFsZXR0ZSk7CisgICAgICBpbmZvX3B0ci0+cGFsZXR0ZSA9IE5VTEw7CisgICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gflBOR19JTkZPX1BMVEU7CisgICAgICBpbmZvX3B0ci0+bnVtX3BhbGV0dGUgPSAwOworICAgfQorCisjaWZkZWYgUE5HX0lORk9fSU1BR0VfU1VQUE9SVEVECisgICAvKiBGcmVlIGFueSBpbWFnZSBiaXRzIGF0dGFjaGVkIHRvIHRoZSBpbmZvIHN0cnVjdHVyZSAqLworICAgaWYgKCgobWFzayAmIFBOR19GUkVFX1JPV1MpICYgaW5mb19wdHItPmZyZWVfbWUpICE9IDApCisgICB7CisgICAgICBpZiAoaW5mb19wdHItPnJvd19wb2ludGVycyAhPSAwKQorICAgICAgeworICAgICAgICAgcG5nX3VpbnRfMzIgcm93OworICAgICAgICAgZm9yIChyb3cgPSAwOyByb3cgPCBpbmZvX3B0ci0+aGVpZ2h0OyByb3crKykKKyAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT5yb3dfcG9pbnRlcnNbcm93XSk7CisKKyAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT5yb3dfcG9pbnRlcnMpOworICAgICAgICAgaW5mb19wdHItPnJvd19wb2ludGVycyA9IE5VTEw7CisgICAgICB9CisgICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gflBOR19JTkZPX0lEQVQ7CisgICB9CisjZW5kaWYKKworICAgaWYgKG51bSAhPSAtMSkKKyAgICAgIG1hc2sgJj0gflBOR19GUkVFX01VTDsKKworICAgaW5mb19wdHItPmZyZWVfbWUgJj0gfm1hc2s7Cit9CisjZW5kaWYgLyogUkVBRCB8fCBXUklURSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBpb19wdHIgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyCisgKiBmdW5jdGlvbnMuICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGZyZWUgYW55IG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhpcworICogcG9pbnRlciBiZWZvcmUgcG5nX3dyaXRlX2Rlc3Ryb3koKSBvciBwbmdfcmVhZF9kZXN0cm95KCkgYXJlIGNhbGxlZC4KKyAqLworcG5nX3ZvaWRwIFBOR0FQSQorcG5nX2dldF9pb19wdHIocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpCit7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuIChOVUxMKTsKKworICAgcmV0dXJuIChwbmdfcHRyLT5pb19wdHIpOworfQorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NVUFBPUlRFRCkKKyMgIGlmZGVmIFBOR19TVERJT19TVVBQT1JURUQKKy8qIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgaW5wdXQvb3V0cHV0IGZ1bmN0aW9ucyBmb3IgdGhlIFBORyBmaWxlLiAgSWYgeW91CisgKiB1c2UgeW91ciBvd24gcmVhZCBvciB3cml0ZSByb3V0aW5lcywgeW91IGNhbiBjYWxsIGVpdGhlciBwbmdfc2V0X3JlYWRfZm4oKQorICogb3IgcG5nX3NldF93cml0ZV9mbigpIGluc3RlYWQgb2YgcG5nX2luaXRfaW8oKS4gIElmIHlvdSBoYXZlIGRlZmluZWQKKyAqIFBOR19OT19TVERJTyBvciBvdGhlcndpc2UgZGlzYWJsZWQgUE5HX1NURElPX1NVUFBPUlRFRCwgeW91IG11c3QgdXNlIGEKKyAqIGZ1bmN0aW9uIG9mIHlvdXIgb3duIGJlY2F1c2UgIkZJTEUgKiIgaXNuJ3QgbmVjZXNzYXJpbHkgYXZhaWxhYmxlLgorICovCit2b2lkIFBOR0FQSQorcG5nX2luaXRfaW8ocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19GSUxFX3AgZnApCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19pbml0X2lvIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIHBuZ19wdHItPmlvX3B0ciA9IChwbmdfdm9pZHApZnA7Cit9CisjICBlbmRpZgorCisjICBpZmRlZiBQTkdfU0FWRV9JTlRfMzJfU1VQUE9SVEVECisvKiBQTkcgc2lnbmVkIGludGVnZXJzIGFyZSBzYXZlZCBpbiAzMi1iaXQgMidzIGNvbXBsZW1lbnQgZm9ybWF0LiAgQU5TSSBDLTkwCisgKiBkZWZpbmVzIGEgY2FzdCBvZiBhIHNpZ25lZCBpbnRlZ2VyIHRvIGFuIHVuc2lnbmVkIGludGVnZXIgZWl0aGVyIHRvIHByZXNlcnZlCisgKiB0aGUgdmFsdWUsIGlmIGl0IGlzIHBvc2l0aXZlLCBvciB0byBjYWxjdWxhdGU6CisgKgorICogICAgIChVTlNJR05FRF9NQVgrMSkgKyBpbnRlZ2VyCisgKgorICogV2hlcmUgVU5TSUdORURfTUFYIGlzIHRoZSBhcHByb3ByaWF0ZSBtYXhpbXVtIHVuc2lnbmVkIHZhbHVlLCBzbyB3aGVuIHRoZQorICogbmVnYXRpdmUgaW50ZWdyYWwgdmFsdWUgaXMgYWRkZWQgdGhlIHJlc3VsdCB3aWxsIGJlIGFuIHVuc2lnbmVkIHZhbHVlCisgKiBjb3JyZXNwbmRpbmcgdG8gdGhlIDIncyBjb21wbGVtZW50IHJlcHJlc2VudGF0aW9uLgorICovCit2b2lkIFBOR0FQSQorcG5nX3NhdmVfaW50XzMyKHBuZ19ieXRlcCBidWYsIHBuZ19pbnRfMzIgaSkKK3sKKyAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmLCBpKTsKK30KKyMgIGVuZGlmCisKKyMgIGlmZGVmIFBOR19USU1FX1JGQzExMjNfU1VQUE9SVEVECisvKiBDb252ZXJ0IHRoZSBzdXBwbGllZCB0aW1lIGludG8gYW4gUkZDIDExMjMgc3RyaW5nIHN1aXRhYmxlIGZvciB1c2UgaW4KKyAqIGEgIkNyZWF0aW9uIFRpbWUiIG9yIG90aGVyIHRleHQtYmFzZWQgdGltZSBzdHJpbmcuCisgKi8KK2ludCBQTkdBUEkKK3BuZ19jb252ZXJ0X3RvX3JmYzExMjNfYnVmZmVyKGNoYXIgb3V0WzI5XSwgcG5nX2NvbnN0X3RpbWVwIHB0aW1lKQoreworICAgc3RhdGljIFBOR19DT05TVCBjaGFyIHNob3J0X21vbnRoc1sxMl1bNF0gPQorICAgICAgICB7IkphbiIsICJGZWIiLCAiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwKKyAgICAgICAgICJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyJ9OworCisgICBpZiAob3V0ID09IE5VTEwpCisgICAgICByZXR1cm4gMDsKKworICAgaWYgKHB0aW1lLT55ZWFyID4gOTk5OSAvKiBSRkMxMTIzIGxpbWl0YXRpb24gKi8gfHwKKyAgICAgICBwdGltZS0+bW9udGggPT0gMCAgICB8fCAgcHRpbWUtPm1vbnRoID4gMTIgIHx8CisgICAgICAgcHRpbWUtPmRheSAgID09IDAgICAgfHwgIHB0aW1lLT5kYXkgICA+IDMxICB8fAorICAgICAgIHB0aW1lLT5ob3VyICA+IDIzICAgIHx8ICBwdGltZS0+bWludXRlID4gNTkgfHwKKyAgICAgICBwdGltZS0+c2Vjb25kID4gNjApCisgICAgICByZXR1cm4gMDsKKworICAgeworICAgICAgc2l6ZV90IHBvcyA9IDA7CisgICAgICBjaGFyIG51bWJlcl9idWZbNV07IC8qIGVub3VnaCBmb3IgYSBmb3VyLWRpZ2l0IHllYXIgKi8KKworIyAgICAgZGVmaW5lIEFQUEVORF9TVFJJTkcoc3RyaW5nKSBwb3MgPSBwbmdfc2FmZWNhdChvdXQsIDI5LCBwb3MsIChzdHJpbmcpKQorIyAgICAgZGVmaW5lIEFQUEVORF9OVU1CRVIoZm9ybWF0LCB2YWx1ZSlcCisgICAgICAgICBBUFBFTkRfU1RSSU5HKFBOR19GT1JNQVRfTlVNQkVSKG51bWJlcl9idWYsIGZvcm1hdCwgKHZhbHVlKSkpCisjICAgICBkZWZpbmUgQVBQRU5EKGNoKSBpZiAocG9zIDwgMjgpIG91dFtwb3MrK10gPSAoY2gpCisKKyAgICAgIEFQUEVORF9OVU1CRVIoUE5HX05VTUJFUl9GT1JNQVRfdSwgKHVuc2lnbmVkKXB0aW1lLT5kYXkpOworICAgICAgQVBQRU5EKCcgJyk7CisgICAgICBBUFBFTkRfU1RSSU5HKHNob3J0X21vbnRoc1socHRpbWUtPm1vbnRoIC0gMSldKTsKKyAgICAgIEFQUEVORCgnICcpOworICAgICAgQVBQRU5EX05VTUJFUihQTkdfTlVNQkVSX0ZPUk1BVF91LCBwdGltZS0+eWVhcik7CisgICAgICBBUFBFTkQoJyAnKTsKKyAgICAgIEFQUEVORF9OVU1CRVIoUE5HX05VTUJFUl9GT1JNQVRfMDJ1LCAodW5zaWduZWQpcHRpbWUtPmhvdXIpOworICAgICAgQVBQRU5EKCc6Jyk7CisgICAgICBBUFBFTkRfTlVNQkVSKFBOR19OVU1CRVJfRk9STUFUXzAydSwgKHVuc2lnbmVkKXB0aW1lLT5taW51dGUpOworICAgICAgQVBQRU5EKCc6Jyk7CisgICAgICBBUFBFTkRfTlVNQkVSKFBOR19OVU1CRVJfRk9STUFUXzAydSwgKHVuc2lnbmVkKXB0aW1lLT5zZWNvbmQpOworICAgICAgQVBQRU5EX1NUUklORygiICswMDAwIik7IC8qIFRoaXMgcmVsaWFibHkgdGVybWluYXRlcyB0aGUgYnVmZmVyICovCisgICAgICBQTkdfVU5VU0VEIChwb3MpCisKKyMgICAgIHVuZGVmIEFQUEVORAorIyAgICAgdW5kZWYgQVBQRU5EX05VTUJFUgorIyAgICAgdW5kZWYgQVBQRU5EX1NUUklORworICAgfQorCisgICByZXR1cm4gMTsKK30KKworIyAgICBpZiBQTkdfTElCUE5HX1ZFUiA8IDEwNzAwCisvKiBUbyBkbzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgZnJvbSBsaWJwbmctMS43ICovCisvKiBPcmlnaW5hbCBBUEkgdGhhdCB1c2VzIGEgcHJpdmF0ZSBidWZmZXIgaW4gcG5nX3N0cnVjdC4KKyAqIERlcHJlY2F0ZWQgYmVjYXVzZSBpdCBjYXVzZXMgcG5nX3N0cnVjdCB0byBjYXJyeSBhIHNwdXJpb3VzIHRlbXBvcmFyeQorICogYnVmZmVyIChwbmdfc3RydWN0Ojp0aW1lX2J1ZmZlciksIGJldHRlciB0byBoYXZlIHRoZSBjYWxsZXIgcGFzcyB0aGlzIGluLgorICovCitwbmdfY29uc3RfY2hhcnAgUE5HQVBJCitwbmdfY29udmVydF90b19yZmMxMTIzKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfdGltZXAgcHRpbWUpCit7CisgICBpZiAocG5nX3B0ciAhPSBOVUxMKQorICAgeworICAgICAgLyogVGhlIG9ubHkgZmFpbHVyZSBhYm92ZSBpZiBwbmdfcHRyICE9IE5VTEwgaXMgZnJvbSBhbiBpbnZhbGlkIHB0aW1lICovCisgICAgICBpZiAocG5nX2NvbnZlcnRfdG9fcmZjMTEyM19idWZmZXIocG5nX3B0ci0+dGltZV9idWZmZXIsIHB0aW1lKSA9PSAwKQorICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIklnbm9yaW5nIGludmFsaWQgdGltZSB2YWx1ZSIpOworCisgICAgICBlbHNlCisgICAgICAgICByZXR1cm4gcG5nX3B0ci0+dGltZV9idWZmZXI7CisgICB9CisKKyAgIHJldHVybiBOVUxMOworfQorIyAgICBlbmRpZiAvKiBMSUJQTkdfVkVSIDwgMTA3MDAgKi8KKyMgIGVuZGlmIC8qIFRJTUVfUkZDMTEyMyAqLworCisjZW5kaWYgLyogUkVBRCB8fCBXUklURSAqLworCitwbmdfY29uc3RfY2hhcnAgUE5HQVBJCitwbmdfZ2V0X2NvcHlyaWdodChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikKK3sKKyAgIFBOR19VTlVTRUQocG5nX3B0cikgIC8qIFNpbGVuY2UgY29tcGlsZXIgd2FybmluZyBhYm91dCB1bnVzZWQgcG5nX3B0ciAqLworI2lmZGVmIFBOR19TVFJJTkdfQ09QWVJJR0hUCisgICByZXR1cm4gUE5HX1NUUklOR19DT1BZUklHSFQKKyNlbHNlCisjICBpZmRlZiBfX1NURENfXworICAgcmV0dXJuIFBOR19TVFJJTkdfTkVXTElORSBcCisgICAgICAibGlicG5nIHZlcnNpb24gMS42LjIwIC0gRGVjZW1iZXIgMywgMjAxNSIgUE5HX1NUUklOR19ORVdMSU5FIFwKKyAgICAgICJDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNSBHbGVubiBSYW5kZXJzLVBlaHJzb24iIFBOR19TVFJJTkdfTkVXTElORSBcCisgICAgICAiQ29weXJpZ2h0IChjKSAxOTk2LTE5OTcgQW5kcmVhcyBEaWxnZXIiIFBOR19TVFJJTkdfTkVXTElORSBcCisgICAgICAiQ29weXJpZ2h0IChjKSAxOTk1LTE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuIiBcCisgICAgICBQTkdfU1RSSU5HX05FV0xJTkU7CisjICBlbHNlCisgICByZXR1cm4gImxpYnBuZyB2ZXJzaW9uIDEuNi4yMCAtIERlY2VtYmVyIDMsIDIwMTVcCisgICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNSBHbGVubiBSYW5kZXJzLVBlaHJzb25cCisgICAgICBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5NyBBbmRyZWFzIERpbGdlclwKKyAgICAgIENvcHlyaWdodCAoYykgMTk5NS0xOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLiI7CisjICBlbmRpZgorI2VuZGlmCit9CisKKy8qIFRoZSBmb2xsb3dpbmcgcmV0dXJuIHRoZSBsaWJyYXJ5IHZlcnNpb24gYXMgYSBzaG9ydCBzdHJpbmcgaW4gdGhlCisgKiBmb3JtYXQgMS4wLjAgdGhyb3VnaCA5OS45OS45OXp6LiAgVG8gZ2V0IHRoZSB2ZXJzaW9uIG9mICouaCBmaWxlcworICogdXNlZCB3aXRoIHlvdXIgYXBwbGljYXRpb24sIHByaW50IG91dCBQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIHdoaWNoCisgKiBpcyBkZWZpbmVkIGluIHBuZy5oLgorICogTm90ZTogbm93IHRoZXJlIGlzIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiBwbmdfZ2V0X2xpYnBuZ192ZXIoKSBhbmQKKyAqIHBuZ19nZXRfaGVhZGVyX3ZlcigpLiAgRHVlIHRvIHRoZSB2ZXJzaW9uX25uX25uX25uIHR5cGVkZWYgZ3VhcmQsCisgKiBpdCBpcyBndWFyYW50ZWVkIHRoYXQgcG5nLmMgdXNlcyB0aGUgY29ycmVjdCB2ZXJzaW9uIG9mIHBuZy5oLgorICovCitwbmdfY29uc3RfY2hhcnAgUE5HQVBJCitwbmdfZ2V0X2xpYnBuZ192ZXIocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpCit7CisgICAvKiBWZXJzaW9uIG9mICouYyBmaWxlcyB1c2VkIHdoZW4gYnVpbGRpbmcgbGlicG5nICovCisgICByZXR1cm4gcG5nX2dldF9oZWFkZXJfdmVyKHBuZ19wdHIpOworfQorCitwbmdfY29uc3RfY2hhcnAgUE5HQVBJCitwbmdfZ2V0X2hlYWRlcl92ZXIocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpCit7CisgICAvKiBWZXJzaW9uIG9mICouaCBmaWxlcyB1c2VkIHdoZW4gYnVpbGRpbmcgbGlicG5nICovCisgICBQTkdfVU5VU0VEKHBuZ19wdHIpICAvKiBTaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBuZ19wdHIgKi8KKyAgIHJldHVybiBQTkdfTElCUE5HX1ZFUl9TVFJJTkc7Cit9CisKK3BuZ19jb25zdF9jaGFycCBQTkdBUEkKK3BuZ19nZXRfaGVhZGVyX3ZlcnNpb24ocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpCit7CisgICAvKiBSZXR1cm5zIGxvbmdlciBzdHJpbmcgY29udGFpbmluZyBib3RoIHZlcnNpb24gYW5kIGRhdGUgKi8KKyAgIFBOR19VTlVTRUQocG5nX3B0cikgIC8qIFNpbGVuY2UgY29tcGlsZXIgd2FybmluZyBhYm91dCB1bnVzZWQgcG5nX3B0ciAqLworI2lmZGVmIF9fU1REQ19fCisgICByZXR1cm4gUE5HX0hFQURFUl9WRVJTSU9OX1NUUklORworIyAgaWZuZGVmIFBOR19SRUFEX1NVUFBPUlRFRAorICAgICAgIiAoTk8gUkVBRCBTVVBQT1JUKSIKKyMgIGVuZGlmCisgICAgICBQTkdfU1RSSU5HX05FV0xJTkU7CisjZWxzZQorICAgcmV0dXJuIFBOR19IRUFERVJfVkVSU0lPTl9TVFJJTkc7CisjZW5kaWYKK30KKworI2lmZGVmIFBOR19CVUlMRF9HUkFZU0NBTEVfUEFMRVRURV9TVVBQT1JURUQKKy8qIE5PVEU6IHRoaXMgcm91dGluZSBpcyBub3QgdXNlZCBpbnRlcm5hbGx5ISAqLworLyogQnVpbGQgYSBncmF5c2NhbGUgcGFsZXR0ZS4gIFBhbGV0dGUgaXMgYXNzdW1lZCB0byBiZSAxIDw8IGJpdF9kZXB0aAorICogbGFyZ2Ugb2YgcG5nX2NvbG9yLiAgVGhpcyBsZXRzIGdyYXlzY2FsZSBpbWFnZXMgYmUgdHJlYXRlZCBhcworICogcGFsZXR0ZWQuICBNb3N0IHVzZWZ1bCBmb3IgZ2FtbWEgY29ycmVjdGlvbiBhbmQgc2ltcGxpZmljYXRpb24KKyAqIG9mIGNvZGUuICBUaGlzIEFQSSBpcyBub3QgdXNlZCBpbnRlcm5hbGx5LgorICovCit2b2lkIFBOR0FQSQorcG5nX2J1aWxkX2dyYXlzY2FsZV9wYWxldHRlKGludCBiaXRfZGVwdGgsIHBuZ19jb2xvcnAgcGFsZXR0ZSkKK3sKKyAgIGludCBudW1fcGFsZXR0ZTsKKyAgIGludCBjb2xvcl9pbmM7CisgICBpbnQgaTsKKyAgIGludCB2OworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19idWlsZF9ncmF5c2NhbGVfcGFsZXR0ZSIpOworCisgICBpZiAocGFsZXR0ZSA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBzd2l0Y2ggKGJpdF9kZXB0aCkKKyAgIHsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgIG51bV9wYWxldHRlID0gMjsKKyAgICAgICAgIGNvbG9yX2luYyA9IDB4ZmY7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAyOgorICAgICAgICAgbnVtX3BhbGV0dGUgPSA0OworICAgICAgICAgY29sb3JfaW5jID0gMHg1NTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDQ6CisgICAgICAgICBudW1fcGFsZXR0ZSA9IDE2OworICAgICAgICAgY29sb3JfaW5jID0gMHgxMTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDg6CisgICAgICAgICBudW1fcGFsZXR0ZSA9IDI1NjsKKyAgICAgICAgIGNvbG9yX2luYyA9IDE7CisgICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIG51bV9wYWxldHRlID0gMDsKKyAgICAgICAgIGNvbG9yX2luYyA9IDA7CisgICAgICAgICBicmVhazsKKyAgIH0KKworICAgZm9yIChpID0gMCwgdiA9IDA7IGkgPCBudW1fcGFsZXR0ZTsgaSsrLCB2ICs9IGNvbG9yX2luYykKKyAgIHsKKyAgICAgIHBhbGV0dGVbaV0ucmVkID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7CisgICAgICBwYWxldHRlW2ldLmdyZWVuID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7CisgICAgICBwYWxldHRlW2ldLmJsdWUgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsKKyAgIH0KK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1NFVF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKK2ludCBQTkdBUEkKK3BuZ19oYW5kbGVfYXNfdW5rbm93bihwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2J5dGVwIGNodW5rX25hbWUpCit7CisgICAvKiBDaGVjayBjaHVua19uYW1lIGFuZCByZXR1cm4gImtlZXAiIHZhbHVlIGlmIGl0J3Mgb24gdGhlIGxpc3QsIGVsc2UgMCAqLworICAgcG5nX2NvbnN0X2J5dGVwIHAsIHBfZW5kOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGNodW5rX25hbWUgPT0gTlVMTCB8fCBwbmdfcHRyLT5udW1fY2h1bmtfbGlzdCA9PSAwKQorICAgICAgcmV0dXJuIFBOR19IQU5ETEVfQ0hVTktfQVNfREVGQVVMVDsKKworICAgcF9lbmQgPSBwbmdfcHRyLT5jaHVua19saXN0OworICAgcCA9IHBfZW5kICsgcG5nX3B0ci0+bnVtX2NodW5rX2xpc3QqNTsgLyogYmV5b25kIGVuZCAqLworCisgICAvKiBUaGUgY29kZSBpcyB0aGUgZmlmdGggYnl0ZSBhZnRlciBlYWNoIGZvdXIgYnl0ZSBzdHJpbmcuICBIaXN0b3JpY2FsbHkgdGhpcworICAgICogY29kZSB3YXMgYWx3YXlzIHNlYXJjaGVkIGZyb20gdGhlIGVuZCBvZiB0aGUgbGlzdCwgdGhpcyBpcyBubyBsb25nZXIKKyAgICAqIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSAnc2V0JyByb3V0aW5lIGhhbmRsZXMgZHVwbGljYXRlIGVudHJpZXMgY29ycmVjdHkuCisgICAgKi8KKyAgIGRvIC8qIG51bV9jaHVua19saXN0ID4gMCwgc28gYXQgbGVhc3Qgb25lICovCisgICB7CisgICAgICBwIC09IDU7CisKKyAgICAgIGlmIChtZW1jbXAoY2h1bmtfbmFtZSwgcCwgNCkgPT0gMCkKKyAgICAgICAgIHJldHVybiBwWzRdOworICAgfQorICAgd2hpbGUgKHAgPiBwX2VuZCk7CisKKyAgIC8qIFRoaXMgbWVhbnMgdGhhdCBrbm93biBjaHVua3Mgc2hvdWxkIGJlIHByb2Nlc3NlZCBhbmQgdW5rbm93biBjaHVua3Mgc2hvdWxkCisgICAgKiBiZSBoYW5kbGVkIGFjY29yZGluZyB0byB0aGUgdmFsdWUgb2YgcG5nX3B0ci0+dW5rbm93bl9kZWZhdWx0OyB0aGlzIGNhbiBiZQorICAgICogY29uZnVzaW5nIGJlY2F1c2UsIGFzIGEgcmVzdWx0LCB0aGVyZSBhcmUgdHdvIGxldmVscyBvZiBkZWZhdWx0aW5nIGZvcgorICAgICogdW5rbm93biBjaHVua3MuCisgICAgKi8KKyAgIHJldHVybiBQTkdfSEFORExFX0NIVU5LX0FTX0RFRkFVTFQ7Cit9CisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkgfHxcCisgICBkZWZpbmVkKFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQpCitpbnQgLyogUFJJVkFURSAqLworcG5nX2NodW5rX3Vua25vd25faGFuZGxpbmcocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ191aW50XzMyIGNodW5rX25hbWUpCit7CisgICBwbmdfYnl0ZSBjaHVua19zdHJpbmdbNV07CisKKyAgIFBOR19DU1RSSU5HX0ZST01fQ0hVTksoY2h1bmtfc3RyaW5nLCBjaHVua19uYW1lKTsKKyAgIHJldHVybiBwbmdfaGFuZGxlX2FzX3Vua25vd24ocG5nX3B0ciwgY2h1bmtfc3RyaW5nKTsKK30KKyNlbmRpZiAvKiBSRUFEX1VOS05PV05fQ0hVTktTIHx8IEhBTkRMRV9BU19VTktOT1dOICovCisjZW5kaWYgLyogU0VUX1VOS05PV05fQ0hVTktTICovCisKKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKKy8qIFRoaXMgZnVuY3Rpb24sIGFkZGVkIHRvIGxpYnBuZy0xLjAuNmcsIGlzIHVudGVzdGVkLiAqLworaW50IFBOR0FQSQorcG5nX3Jlc2V0X3pzdHJlYW0ocG5nX3N0cnVjdHJwIHBuZ19wdHIpCit7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAvKiBXQVJOSU5HOiB0aGlzIHJlc2V0cyB0aGUgd2luZG93IGJpdHMgdG8gdGhlIG1heGltdW0hICovCisgICByZXR1cm4gKGluZmxhdGVSZXNldCgmcG5nX3B0ci0+enN0cmVhbSkpOworfQorI2VuZGlmIC8qIFJFQUQgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3YXMgYWRkZWQgdG8gbGlicG5nLTEuMC43ICovCitwbmdfdWludF8zMiBQTkdBUEkKK3BuZ19hY2Nlc3NfdmVyc2lvbl9udW1iZXIodm9pZCkKK3sKKyAgIC8qIFZlcnNpb24gb2YgKi5jIGZpbGVzIHVzZWQgd2hlbiBidWlsZGluZyBsaWJwbmcgKi8KKyAgIHJldHVybigocG5nX3VpbnRfMzIpUE5HX0xJQlBOR19WRVIpOworfQorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NVUFBPUlRFRCkKKy8qIEVuc3VyZSB0aGF0IHBuZ19wdHItPnpzdHJlYW0ubXNnIGhvbGRzIHNvbWUgYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZSBzdHJpbmcuCisgKiBJZiBpdCBkb2Vzbid0ICdyZXQnIGlzIHVzZWQgdG8gc2V0IGl0IHRvIHNvbWV0aGluZyBhcHByb3ByaWF0ZSwgZXZlbiBpbiBjYXNlcworICogbGlrZSBaX09LIG9yIFpfU1RSRUFNX0VORCB3aGVyZSB0aGUgZXJyb3IgY29kZSBpcyBhcHBhcmVudGx5IGEgc3VjY2VzcyBjb2RlLgorICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ196c3RyZWFtX2Vycm9yKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgcmV0KQoreworICAgLyogVHJhbnNsYXRlICdyZXQnIGludG8gYW4gYXBwcm9wcmlhdGUgZXJyb3Igc3RyaW5nLCBwcmlvcml0eSBpcyBnaXZlbiB0byB0aGUKKyAgICAqIG9uZSBpbiB6c3RyZWFtIGlmIHNldC4gIFRoaXMgYWx3YXlzIHJldHVybnMgYSBzdHJpbmcsIGV2ZW4gaW4gY2FzZXMgbGlrZQorICAgICogWl9PSyBvciBaX1NUUkVBTV9FTkQgd2hlcmUgdGhlIGVycm9yIGNvZGUgaXMgYSBzdWNjZXNzIGNvZGUuCisgICAgKi8KKyAgIGlmIChwbmdfcHRyLT56c3RyZWFtLm1zZyA9PSBOVUxMKSBzd2l0Y2ggKHJldCkKKyAgIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICBjYXNlIFpfT0s6CisgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLm1zZyA9IFBOR1pfTVNHX0NBU1QoInVuZXhwZWN0ZWQgemxpYiByZXR1cm4gY29kZSIpOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgWl9TVFJFQU1fRU5EOgorICAgICAgICAgLyogTm9ybWFsIGV4aXQgKi8KKyAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0ubXNnID0gUE5HWl9NU0dfQ0FTVCgidW5leHBlY3RlZCBlbmQgb2YgTFogc3RyZWFtIik7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBaX05FRURfRElDVDoKKyAgICAgICAgIC8qIFRoaXMgbWVhbnMgdGhlIGRlZmxhdGUgc3RyZWFtIGRpZCBub3QgaGF2ZSBhIGRpY3Rpb25hcnk7IHRoaXMKKyAgICAgICAgICAqIGluZGljYXRlcyBhIGJvZ3VzIFBORy4KKyAgICAgICAgICAqLworICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5tc2cgPSBQTkdaX01TR19DQVNUKCJtaXNzaW5nIExaIGRpY3Rpb25hcnkiKTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFpfRVJSTk86CisgICAgICAgICAvKiBneiBBUElzIG9ubHk6IHNob3VsZCBub3QgaGFwcGVuICovCisgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLm1zZyA9IFBOR1pfTVNHX0NBU1QoInpsaWIgSU8gZXJyb3IiKTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFpfU1RSRUFNX0VSUk9SOgorICAgICAgICAgLyogaW50ZXJuYWwgbGlicG5nIGVycm9yICovCisgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLm1zZyA9IFBOR1pfTVNHX0NBU1QoImJhZCBwYXJhbWV0ZXJzIHRvIHpsaWIiKTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFpfREFUQV9FUlJPUjoKKyAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0ubXNnID0gUE5HWl9NU0dfQ0FTVCgiZGFtYWdlZCBMWiBzdHJlYW0iKTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFpfTUVNX0VSUk9SOgorICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5tc2cgPSBQTkdaX01TR19DQVNUKCJpbnN1ZmZpY2llbnQgbWVtb3J5Iik7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBaX0JVRl9FUlJPUjoKKyAgICAgICAgIC8qIEVuZCBvZiBpbnB1dCBvciBvdXRwdXQ7IG5vdCBhIHByb2JsZW0gaWYgdGhlIGNhbGxlciBpcyBkb2luZworICAgICAgICAgICogaW5jcmVtZW50YWwgcmVhZCBvciB3cml0ZS4KKyAgICAgICAgICAqLworICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5tc2cgPSBQTkdaX01TR19DQVNUKCJ0cnVuY2F0ZWQiKTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFpfVkVSU0lPTl9FUlJPUjoKKyAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0ubXNnID0gUE5HWl9NU0dfQ0FTVCgidW5zdXBwb3J0ZWQgemxpYiB2ZXJzaW9uIik7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBQTkdfVU5FWFBFQ1RFRF9aTElCX1JFVFVSTjoKKyAgICAgICAgIC8qIENvbXBpbGUgZXJyb3JzIGhlcmUgbWVhbiB0aGF0IHpsaWIgbm93IHVzZXMgdGhlIHZhbHVlIGNvLW9wdGVkIGluCisgICAgICAgICAgKiBwbmdwcml2LmggZm9yIFBOR19VTkVYUEVDVEVEX1pMSUJfUkVUVVJOOyB1cGRhdGUgdGhlIHN3aXRjaCBhYm92ZQorICAgICAgICAgICogYW5kIGNoYW5nZSBwbmdwcml2LmguICBOb3RlIHRoYXQgdGhpcyBtZXNzYWdlIGlzICIuLi4gcmV0dXJuIiwKKyAgICAgICAgICAqIHdoZXJlYXMgdGhlIGRlZmF1bHQvWl9PSyBvbmUgaXMgIi4uLiByZXR1cm4gY29kZSIuCisgICAgICAgICAgKi8KKyAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0ubXNnID0gUE5HWl9NU0dfQ0FTVCgidW5leHBlY3RlZCB6bGliIHJldHVybiIpOworICAgICAgICAgYnJlYWs7CisgICB9Cit9CisKKy8qIHBuZ19jb252ZXJ0X3NpemU6IGEgUE5HQVBJIGJ1dCBubyBsb25nZXIgaW4gcG5nLmgsIHNvIGRlbGV0ZWQKKyAqIGF0IGxpYnBuZyAxLjUuNSEKKyAqLworCisvKiBBZGRlZCBhdCBsaWJwbmcgdmVyc2lvbiAxLjIuMzQgYW5kIDEuNC4wIChtb3ZlZCBmcm9tIHBuZ3NldC5jKSAqLworI2lmZGVmIFBOR19HQU1NQV9TVVBQT1JURUQgLyogYWx3YXlzIHNldCBpZiBDT0xPUlNQQUNFICovCitzdGF0aWMgaW50CitwbmdfY29sb3JzcGFjZV9jaGVja19nYW1tYShwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgIHBuZ19jb2xvcnNwYWNlcnAgY29sb3JzcGFjZSwgcG5nX2ZpeGVkX3BvaW50IGdBTUEsIGludCBmcm9tKQorICAgLyogVGhpcyBpcyBjYWxsZWQgdG8gY2hlY2sgYSBuZXcgZ2FtbWEgdmFsdWUgYWdhaW5zdCBhbiBleGlzdGluZyBvbmUuICBUaGUKKyAgICAqIHJvdXRpbmUgcmV0dXJucyBmYWxzZSBpZiB0aGUgbmV3IGdhbW1hIHZhbHVlIHNob3VsZCBub3QgYmUgd3JpdHRlbi4KKyAgICAqCisgICAgKiAnZnJvbScgc2F5cyB3aGVyZSB0aGUgbmV3IGdhbW1hIHZhbHVlIGNvbWVzIGZyb206CisgICAgKgorICAgICogICAgMDogdGhlIG5ldyBnYW1tYSB2YWx1ZSBpcyB0aGUgbGlicG5nIGVzdGltYXRlIGZvciBhbiBJQ0MgcHJvZmlsZQorICAgICogICAgMTogdGhlIG5ldyBnYW1tYSB2YWx1ZSBjb21lcyBmcm9tIGEgZ0FNQSBjaHVuaworICAgICogICAgMjogdGhlIG5ldyBnYW1tYSB2YWx1ZSBjb21lcyBmcm9tIGFuIHNSR0IgY2h1bmsKKyAgICAqLworeworICAgcG5nX2ZpeGVkX3BvaW50IGd0ZXN0OworCisgICBpZiAoKGNvbG9yc3BhY2UtPmZsYWdzICYgUE5HX0NPTE9SU1BBQ0VfSEFWRV9HQU1NQSkgIT0gMCAmJgorICAgICAgKHBuZ19tdWxkaXYoJmd0ZXN0LCBjb2xvcnNwYWNlLT5nYW1tYSwgUE5HX0ZQXzEsIGdBTUEpID09IDAgIHx8CisgICAgICBwbmdfZ2FtbWFfc2lnbmlmaWNhbnQoZ3Rlc3QpICE9IDApKQorICAgeworICAgICAgLyogRWl0aGVyIHRoaXMgaXMgYW4gc1JHQiBpbWFnZSwgaW4gd2hpY2ggY2FzZSB0aGUgY2FsY3VsYXRlZCBnYW1tYQorICAgICAgICogYXBwcm94aW1hdGlvbiBzaG91bGQgbWF0Y2gsIG9yIHRoaXMgaXMgYW4gaW1hZ2Ugd2l0aCBhIHByb2ZpbGUgYW5kIHRoZQorICAgICAgICogdmFsdWUgbGlicG5nIGNhbGN1bGF0ZXMgZm9yIHRoZSBnYW1tYSBvZiB0aGUgcHJvZmlsZSBkb2VzIG5vdCBtYXRjaCB0aGUKKyAgICAgICAqIHZhbHVlIHJlY29yZGVkIGluIHRoZSBmaWxlLiAgVGhlIGZvcm1lciwgc1JHQiwgY2FzZSBpcyBhbiBlcnJvciwgdGhlCisgICAgICAgKiBsYXR0ZXIgaXMganVzdCBhIHdhcm5pbmcuCisgICAgICAgKi8KKyAgICAgIGlmICgoY29sb3JzcGFjZS0+ZmxhZ3MgJiBQTkdfQ09MT1JTUEFDRV9GUk9NX3NSR0IpICE9IDAgfHwgZnJvbSA9PSAyKQorICAgICAgeworICAgICAgICAgcG5nX2NodW5rX3JlcG9ydChwbmdfcHRyLCAiZ2FtbWEgdmFsdWUgZG9lcyBub3QgbWF0Y2ggc1JHQiIsCisgICAgICAgICAgICBQTkdfQ0hVTktfRVJST1IpOworICAgICAgICAgLyogRG8gbm90IG92ZXJ3cml0ZSBhbiBzUkdCIHZhbHVlICovCisgICAgICAgICByZXR1cm4gZnJvbSA9PSAyOworICAgICAgfQorCisgICAgICBlbHNlIC8qIHNSR0IgdGFnIG5vdCBpbnZvbHZlZCAqLworICAgICAgeworICAgICAgICAgcG5nX2NodW5rX3JlcG9ydChwbmdfcHRyLCAiZ2FtbWEgdmFsdWUgZG9lcyBub3QgbWF0Y2ggbGlicG5nIGVzdGltYXRlIiwKKyAgICAgICAgICAgIFBOR19DSFVOS19XQVJOSU5HKTsKKyAgICAgICAgIHJldHVybiBmcm9tID09IDE7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiAxOworfQorCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19jb2xvcnNwYWNlX3NldF9nYW1tYShwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgIHBuZ19jb2xvcnNwYWNlcnAgY29sb3JzcGFjZSwgcG5nX2ZpeGVkX3BvaW50IGdBTUEpCit7CisgICAvKiBDaGFuZ2VkIGluIGxpYnBuZy0xLjUuNCB0byBsaW1pdCB0aGUgdmFsdWVzIHRvIGVuc3VyZSBvdmVyZmxvdyBjYW4ndAorICAgICogb2NjdXIuICBTaW5jZSB0aGUgZml4ZWQgcG9pbnQgcmVwcmVzZW50YXRpb24gaXMgYXN5bWV0cmljYWwgaXQgaXMKKyAgICAqIHBvc3NpYmxlIGZvciAxL2dhbW1hIHRvIG92ZXJmbG93IHRoZSBsaW1pdCBvZiAyMTQ3NCBhbmQgdGhpcyBtZWFucyB0aGUKKyAgICAqIGdhbW1hIHZhbHVlIG11c3QgYmUgYXQgbGVhc3QgNS8xMDAwMDAgYW5kIGhlbmNlIGF0IG1vc3QgMjAwMDAuMC4gIEZvcgorICAgICogc2FmZXR5IHRoZSBsaW1pdHMgaGVyZSBhcmUgYSBsaXR0bGUgbmFycm93ZXIuICBUaGUgdmFsdWVzIGFyZSAwLjAwMDE2IHRvCisgICAgKiA2MjUwLjAsIHdoaWNoIGFyZSB0cnVseSByaWRpY3Vsb3VzIGdhbW1hIHZhbHVlcyAoYW5kIHdpbGwgcHJvZHVjZQorICAgICogZGlzcGxheXMgdGhhdCBhcmUgYWxsIGJsYWNrIG9yIGFsbCB3aGl0ZS4pCisgICAgKgorICAgICogSW4gMS42LjAgdGhpcyB0ZXN0IHJlcGxhY2VzIHRoZSBvbmVzIGluIHBuZ3J1dGlsLmMsIGluIHRoZSBnQU1BIGNodW5rCisgICAgKiBoYW5kbGluZyBjb2RlLCB3aGljaCBvbmx5IHJlcXVpcmVkIHRoZSB2YWx1ZSB0byBiZSA+MC4KKyAgICAqLworICAgcG5nX2NvbnN0X2NoYXJwIGVycm1zZzsKKworICAgaWYgKGdBTUEgPCAxNiB8fCBnQU1BID4gNjI1MDAwMDAwKQorICAgICAgZXJybXNnID0gImdhbW1hIHZhbHVlIG91dCBvZiByYW5nZSI7CisKKyMgIGlmZGVmIFBOR19SRUFEX2dBTUFfU1VQUE9SVEVECisgICAvKiBBbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gc2V0IHRoZSBnYW1tYSB2YWx1ZSBtb3JlIHRoYW4gb25jZSAqLworICAgZWxzZSBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSVNfUkVBRF9TVFJVQ1QpICE9IDAgJiYKKyAgICAgIChjb2xvcnNwYWNlLT5mbGFncyAmIFBOR19DT0xPUlNQQUNFX0ZST01fZ0FNQSkgIT0gMCkKKyAgICAgIGVycm1zZyA9ICJkdXBsaWNhdGUiOworIyAgZW5kaWYKKworICAgLyogRG8gbm90aGluZyBpZiB0aGUgY29sb3JzcGFjZSBpcyBhbHJlYWR5IGludmFsaWQgKi8KKyAgIGVsc2UgaWYgKChjb2xvcnNwYWNlLT5mbGFncyAmIFBOR19DT0xPUlNQQUNFX0lOVkFMSUQpICE9IDApCisgICAgICByZXR1cm47CisKKyAgIGVsc2UKKyAgIHsKKyAgICAgIGlmIChwbmdfY29sb3JzcGFjZV9jaGVja19nYW1tYShwbmdfcHRyLCBjb2xvcnNwYWNlLCBnQU1BLAorICAgICAgICAgIDEvKmZyb20gZ0FNQSovKSAhPSAwKQorICAgICAgeworICAgICAgICAgLyogU3RvcmUgdGhpcyBnYW1tYSB2YWx1ZS4gKi8KKyAgICAgICAgIGNvbG9yc3BhY2UtPmdhbW1hID0gZ0FNQTsKKyAgICAgICAgIGNvbG9yc3BhY2UtPmZsYWdzIHw9CisgICAgICAgICAgICAoUE5HX0NPTE9SU1BBQ0VfSEFWRV9HQU1NQSB8IFBOR19DT0xPUlNQQUNFX0ZST01fZ0FNQSk7CisgICAgICB9CisKKyAgICAgIC8qIEF0IHByZXNlbnQgaWYgdGhlIGNoZWNrX2dhbW1hIHRlc3QgZmFpbHMgdGhlIGdhbW1hIG9mIHRoZSBjb2xvcnNwYWNlIGlzCisgICAgICAgKiBub3QgdXBkYXRlZCBob3dldmVyIHRoZSBjb2xvcnNwYWNlIGlzIG5vdCBpbnZhbGlkYXRlZC4gIFRoaXMKKyAgICAgICAqIGNvcnJlc3BvbmRzIHRvIHRoZSBjYXNlIHdoZXJlIHRoZSBleGlzdGluZyBnYW1tYSBjb21lcyBmcm9tIGFuIHNSR0IKKyAgICAgICAqIGNodW5rIG9yIHByb2ZpbGUuICBBbiBlcnJvciBtZXNzYWdlIGhhcyBhbHJlYWR5IGJlZW4gb3V0cHV0LgorICAgICAgICovCisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8qIEVycm9yIGV4aXQgLSBlcnJtc2cgaGFzIGJlZW4gc2V0LiAqLworICAgY29sb3JzcGFjZS0+ZmxhZ3MgfD0gUE5HX0NPTE9SU1BBQ0VfSU5WQUxJRDsKKyAgIHBuZ19jaHVua19yZXBvcnQocG5nX3B0ciwgZXJybXNnLCBQTkdfQ0hVTktfV1JJVEVfRVJST1IpOworfQorCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19jb2xvcnNwYWNlX3N5bmNfaW5mbyhwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0cikKK3sKKyAgIGlmICgoaW5mb19wdHItPmNvbG9yc3BhY2UuZmxhZ3MgJiBQTkdfQ09MT1JTUEFDRV9JTlZBTElEKSAhPSAwKQorICAgeworICAgICAgLyogRXZlcnl0aGluZyBpcyBpbnZhbGlkICovCisgICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gfihQTkdfSU5GT19nQU1BfFBOR19JTkZPX2NIUk18UE5HX0lORk9fc1JHQnwKKyAgICAgICAgIFBOR19JTkZPX2lDQ1ApOworCisjICAgICBpZmRlZiBQTkdfQ09MT1JTUEFDRV9TVVBQT1JURUQKKyAgICAgIC8qIENsZWFuIHVwIHRoZSBpQ0NQIHByb2ZpbGUgbm93IGlmIGl0IHdvbid0IGJlIHVzZWQuICovCisgICAgICBwbmdfZnJlZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfRlJFRV9JQ0NQLCAtMS8qbm90IHVzZWQqLyk7CisjICAgICBlbHNlCisgICAgICBQTkdfVU5VU0VEKHBuZ19wdHIpCisjICAgICBlbmRpZgorICAgfQorCisgICBlbHNlCisgICB7CisjICAgICBpZmRlZiBQTkdfQ09MT1JTUEFDRV9TVVBQT1JURUQKKyAgICAgIC8qIExlYXZlIHRoZSBJTkZPX2lDQ1AgZmxhZyBzZXQgaWYgdGhlIHBuZ3NldC5jIGNvZGUgaGFzIGFscmVhZHkgc2V0CisgICAgICAgKiBpdDsgdGhpcyBhbGxvd3MgYSBQTkcgdG8gY29udGFpbiBhIHByb2ZpbGUgd2hpY2ggbWF0Y2hlcyBzUkdCIGFuZAorICAgICAgICogeWV0IHN0aWxsIGhhdmUgdGhhdCBwcm9maWxlIHJldHJpZXZhYmxlIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgICAqLworICAgICAgaWYgKChpbmZvX3B0ci0+Y29sb3JzcGFjZS5mbGFncyAmIFBOR19DT0xPUlNQQUNFX01BVENIRVNfc1JHQikgIT0gMCkKKyAgICAgICAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19zUkdCOworCisgICAgICBlbHNlCisgICAgICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gflBOR19JTkZPX3NSR0I7CisKKyAgICAgIGlmICgoaW5mb19wdHItPmNvbG9yc3BhY2UuZmxhZ3MgJiBQTkdfQ09MT1JTUEFDRV9IQVZFX0VORFBPSU5UUykgIT0gMCkKKyAgICAgICAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19jSFJNOworCisgICAgICBlbHNlCisgICAgICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gflBOR19JTkZPX2NIUk07CisjICAgICBlbmRpZgorCisgICAgICBpZiAoKGluZm9fcHRyLT5jb2xvcnNwYWNlLmZsYWdzICYgUE5HX0NPTE9SU1BBQ0VfSEFWRV9HQU1NQSkgIT0gMCkKKyAgICAgICAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19nQU1BOworCisgICAgICBlbHNlCisgICAgICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gflBOR19JTkZPX2dBTUE7CisgICB9Cit9CisKKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2NvbG9yc3BhY2Vfc3luYyhwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0cikKK3sKKyAgIGlmIChpbmZvX3B0ciA9PSBOVUxMKSAvKiByZWR1Y2UgY29kZSBzaXplOyBjaGVjayBoZXJlIG5vdCBpbiB0aGUgY2FsbGVyICovCisgICAgICByZXR1cm47CisKKyAgIGluZm9fcHRyLT5jb2xvcnNwYWNlID0gcG5nX3B0ci0+Y29sb3JzcGFjZTsKKyAgIHBuZ19jb2xvcnNwYWNlX3N5bmNfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBHQU1NQSAqLworCisjaWZkZWYgUE5HX0NPTE9SU1BBQ0VfU1VQUE9SVEVECisvKiBBZGRlZCBhdCBsaWJwbmctMS41LjUgdG8gc3VwcG9ydCByZWFkIGFuZCB3cml0ZSBvZiB0cnVlIENJRVhZWiB2YWx1ZXMgZm9yCisgKiBjSFJNLCBhcyBvcHBvc2VkIHRvIHVzaW5nIGNocm9tYXRpY2l0aWVzLiAgVGhlc2UgaW50ZXJuYWwgQVBJcyByZXR1cm4KKyAqIG5vbi16ZXJvIG9uIGEgcGFyYW1ldGVyIGVycm9yLiAgVGhlIFgsIFkgYW5kIFogdmFsdWVzIGFyZSByZXF1aXJlZCB0byBiZQorICogcG9zaXRpdmUgYW5kIGxlc3MgdGhhbiAxLjAuCisgKi8KK3N0YXRpYyBpbnQKK3BuZ194eV9mcm9tX1hZWihwbmdfeHkgKnh5LCBjb25zdCBwbmdfWFlaICpYWVopCit7CisgICBwbmdfaW50XzMyIGQsIGR3aGl0ZSwgd2hpdGVYLCB3aGl0ZVk7CisKKyAgIGQgPSBYWVotPnJlZF9YICsgWFlaLT5yZWRfWSArIFhZWi0+cmVkX1o7CisgICBpZiAocG5nX211bGRpdigmeHktPnJlZHgsIFhZWi0+cmVkX1gsIFBOR19GUF8xLCBkKSA9PSAwKQorICAgICAgcmV0dXJuIDE7CisgICBpZiAocG5nX211bGRpdigmeHktPnJlZHksIFhZWi0+cmVkX1ksIFBOR19GUF8xLCBkKSA9PSAwKQorICAgICAgcmV0dXJuIDE7CisgICBkd2hpdGUgPSBkOworICAgd2hpdGVYID0gWFlaLT5yZWRfWDsKKyAgIHdoaXRlWSA9IFhZWi0+cmVkX1k7CisKKyAgIGQgPSBYWVotPmdyZWVuX1ggKyBYWVotPmdyZWVuX1kgKyBYWVotPmdyZWVuX1o7CisgICBpZiAocG5nX211bGRpdigmeHktPmdyZWVueCwgWFlaLT5ncmVlbl9YLCBQTkdfRlBfMSwgZCkgPT0gMCkKKyAgICAgIHJldHVybiAxOworICAgaWYgKHBuZ19tdWxkaXYoJnh5LT5ncmVlbnksIFhZWi0+Z3JlZW5fWSwgUE5HX0ZQXzEsIGQpID09IDApCisgICAgICByZXR1cm4gMTsKKyAgIGR3aGl0ZSArPSBkOworICAgd2hpdGVYICs9IFhZWi0+Z3JlZW5fWDsKKyAgIHdoaXRlWSArPSBYWVotPmdyZWVuX1k7CisKKyAgIGQgPSBYWVotPmJsdWVfWCArIFhZWi0+Ymx1ZV9ZICsgWFlaLT5ibHVlX1o7CisgICBpZiAocG5nX211bGRpdigmeHktPmJsdWV4LCBYWVotPmJsdWVfWCwgUE5HX0ZQXzEsIGQpID09IDApCisgICAgICByZXR1cm4gMTsKKyAgIGlmIChwbmdfbXVsZGl2KCZ4eS0+Ymx1ZXksIFhZWi0+Ymx1ZV9ZLCBQTkdfRlBfMSwgZCkgPT0gMCkKKyAgICAgIHJldHVybiAxOworICAgZHdoaXRlICs9IGQ7CisgICB3aGl0ZVggKz0gWFlaLT5ibHVlX1g7CisgICB3aGl0ZVkgKz0gWFlaLT5ibHVlX1k7CisKKyAgIC8qIFRoZSByZWZlcmVuY2Ugd2hpdGUgaXMgc2ltcGx5IHRoZSBzdW0gb2YgdGhlIGVuZC1wb2ludCAoWCxZLFopIHZlY3RvcnMsCisgICAgKiB0aHVzOgorICAgICovCisgICBpZiAocG5nX211bGRpdigmeHktPndoaXRleCwgd2hpdGVYLCBQTkdfRlBfMSwgZHdoaXRlKSA9PSAwKQorICAgICAgcmV0dXJuIDE7CisgICBpZiAocG5nX211bGRpdigmeHktPndoaXRleSwgd2hpdGVZLCBQTkdfRlBfMSwgZHdoaXRlKSA9PSAwKQorICAgICAgcmV0dXJuIDE7CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwbmdfWFlaX2Zyb21feHkocG5nX1hZWiAqWFlaLCBjb25zdCBwbmdfeHkgKnh5KQoreworICAgcG5nX2ZpeGVkX3BvaW50IHJlZF9pbnZlcnNlLCBncmVlbl9pbnZlcnNlLCBibHVlX3NjYWxlOworICAgcG5nX2ZpeGVkX3BvaW50IGxlZnQsIHJpZ2h0LCBkZW5vbWluYXRvcjsKKworICAgLyogQ2hlY2sgeHkgYW5kLCBpbXBsaWNpdGx5LCB6LiAgTm90ZSB0aGF0IHdpZGUgZ2FtdXQgY29sb3Igc3BhY2VzIHR5cGljYWxseQorICAgICogaGF2ZSBlbmQgcG9pbnRzIHdpdGggMCB0cmlzdGltdWx1cyB2YWx1ZXMgKHRoZXNlIGFyZSBpbXBvc3NpYmxlIGVuZAorICAgICogcG9pbnRzLCBidXQgdGhleSBhcmUgdXNlZCB0byBjb3ZlciB0aGUgcG9zc2libGUgY29sb3JzKS4gIFdlIGNoZWNrCisgICAgKiB4eS0+d2hpdGV5IGFnYWluc3QgNSwgbm90IDAsIHRvIGF2b2lkIGEgcG9zc2libGUgaW50ZWdlciBvdmVyZmxvdy4KKyAgICAqLworICAgaWYgKHh5LT5yZWR4ICAgPCAwIHx8IHh5LT5yZWR4ID4gUE5HX0ZQXzEpIHJldHVybiAxOworICAgaWYgKHh5LT5yZWR5ICAgPCAwIHx8IHh5LT5yZWR5ID4gUE5HX0ZQXzEteHktPnJlZHgpIHJldHVybiAxOworICAgaWYgKHh5LT5ncmVlbnggPCAwIHx8IHh5LT5ncmVlbnggPiBQTkdfRlBfMSkgcmV0dXJuIDE7CisgICBpZiAoeHktPmdyZWVueSA8IDAgfHwgeHktPmdyZWVueSA+IFBOR19GUF8xLXh5LT5ncmVlbngpIHJldHVybiAxOworICAgaWYgKHh5LT5ibHVleCAgPCAwIHx8IHh5LT5ibHVleCA+IFBOR19GUF8xKSByZXR1cm4gMTsKKyAgIGlmICh4eS0+Ymx1ZXkgIDwgMCB8fCB4eS0+Ymx1ZXkgPiBQTkdfRlBfMS14eS0+Ymx1ZXgpIHJldHVybiAxOworICAgaWYgKHh5LT53aGl0ZXggPCAwIHx8IHh5LT53aGl0ZXggPiBQTkdfRlBfMSkgcmV0dXJuIDE7CisgICBpZiAoeHktPndoaXRleSA8IDUgfHwgeHktPndoaXRleSA+IFBOR19GUF8xLXh5LT53aGl0ZXgpIHJldHVybiAxOworCisgICAvKiBUaGUgcmV2ZXJzZSBjYWxjdWxhdGlvbiBpcyBtb3JlIGRpZmZpY3VsdCBiZWNhdXNlIHRoZSBvcmlnaW5hbCB0cmlzdGltdWx1cworICAgICogdmFsdWUgaGFkIDkgaW5kZXBlbmRlbnQgdmFsdWVzIChyZWQsZ3JlZW4sYmx1ZSl4KFgsWSxaKSBob3dldmVyIG9ubHkgOAorICAgICogZGVyaXZlZCB2YWx1ZXMgd2VyZSByZWNvcmRlZCBpbiB0aGUgY0hSTSBjaHVuazsKKyAgICAqIChyZWQsZ3JlZW4sYmx1ZSx3aGl0ZSl4KHgseSkuICBUaGlzIGxvc2VzIG9uZSBkZWdyZWUgb2YgZnJlZWRvbSBhbmQKKyAgICAqIHRoZXJlZm9yZSBhbiBhcmJpdHJhcnkgbmludGggdmFsdWUgaGFzIHRvIGJlIGludHJvZHVjZWQgdG8gdW5kbyB0aGUKKyAgICAqIG9yaWdpbmFsIHRyYW5zZm9ybWF0aW9ucy4KKyAgICAqCisgICAgKiBUaGluayBvZiB0aGUgb3JpZ2luYWwgZW5kLXBvaW50cyBhcyBwb2ludHMgaW4gKFgsWSxaKSBzcGFjZS4gIFRoZQorICAgICogY2hyb21hdGljaXR5IHZhbHVlcyAoYykgaGF2ZSB0aGUgcHJvcGVydHk6CisgICAgKgorICAgICogICAgICAgICAgIEMKKyAgICAqICAgYyA9IC0tLS0tLS0tLQorICAgICogICAgICAgWCArIFkgKyBaCisgICAgKgorICAgICogRm9yIGVhY2ggYyAoeCx5LHopIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgb3JpZ2luYWwgQyAoWCxZLFopLiAgVGh1cyB0aGUKKyAgICAqIHRocmVlIGNocm9tYXRpY2l0eSB2YWx1ZXMgKHgseSx6KSBmb3IgZWFjaCBlbmQtcG9pbnQgb2JleSB0aGUKKyAgICAqIHJlbGF0aW9uc2hpcDoKKyAgICAqCisgICAgKiAgIHggKyB5ICsgeiA9IDEKKyAgICAqCisgICAgKiBUaGlzIGRlc2NyaWJlcyB0aGUgcGxhbmUgaW4gKFgsWSxaKSBzcGFjZSB0aGF0IGludGVyc2VjdHMgZWFjaCBheGlzIGF0IHRoZQorICAgICogdmFsdWUgMS4wOyBjYWxsIHRoaXMgdGhlIGNocm9tYXRpY2l0eSBwbGFuZS4gIFRodXMgdGhlIGNocm9tYXRpY2l0eQorICAgICogY2FsY3VsYXRpb24gaGFzIHNjYWxlZCBlYWNoIGVuZC1wb2ludCBzbyB0aGF0IGl0IGlzIG9uIHRoZSB4K3krej0xIHBsYW5lCisgICAgKiBhbmQgY2hyb21hdGljaXR5IGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHZlY3RvciBmcm9tIHRoZSBvcmlnaW4gdG8gdGhlCisgICAgKiAoWCxZLFopIHZhbHVlIHdpdGggdGhlIGNocm9tYXRpY2l0eSBwbGFuZS4KKyAgICAqCisgICAgKiBUbyBmdWxseSBpbnZlcnQgdGhlIGNocm9tYXRpY2l0eSBjYWxjdWxhdGlvbiB3ZSB3b3VsZCBuZWVkIHRoZSB0aHJlZQorICAgICogZW5kLXBvaW50IHNjYWxlIGZhY3RvcnMsIChyZWQtc2NhbGUsIGdyZWVuLXNjYWxlLCBibHVlLXNjYWxlKSwgYnV0IHRoZXNlCisgICAgKiB3ZXJlIG5vdCByZWNvcmRlZC4gIEluc3RlYWQgd2UgY2FsY3VsYXRlZCB0aGUgcmVmZXJlbmNlIHdoaXRlIChYLFksWikgYW5kCisgICAgKiByZWNvcmRlZCB0aGUgY2hyb21hdGljaXR5IG9mIHRoaXMuICBUaGUgcmVmZXJlbmNlIHdoaXRlIChYLFksWikgd291bGQgaGF2ZQorICAgICogZ2l2ZW4gYWxsIHRocmVlIG9mIHRoZSBzY2FsZSBmYWN0b3JzIHNpbmNlOgorICAgICoKKyAgICAqICAgIGNvbG9yLUMgPSBjb2xvci1jICogY29sb3Itc2NhbGUKKyAgICAqICAgIHdoaXRlLUMgPSByZWQtQyArIGdyZWVuLUMgKyBibHVlLUMKKyAgICAqICAgICAgICAgICAgPSByZWQtYypyZWQtc2NhbGUgKyBncmVlbi1jKmdyZWVuLXNjYWxlICsgYmx1ZS1jKmJsdWUtc2NhbGUKKyAgICAqCisgICAgKiBCdXQgY0hSTSByZWNvcmRzIG9ubHkgd2hpdGUteCBhbmQgd2hpdGUteSwgc28gd2UgaGF2ZSBsb3N0IHRoZSB3aGl0ZSBzY2FsZQorICAgICogZmFjdG9yOgorICAgICoKKyAgICAqICAgIHdoaXRlLUMgPSB3aGl0ZS1jKndoaXRlLXNjYWxlCisgICAgKgorICAgICogVG8gaGFuZGxlIHRoaXMgdGhlIGludmVyc2UgdHJhbnNmb3JtYXRpb24gbWFrZXMgYW4gYXJiaXRyYXJ5IGFzc3VtcHRpb24KKyAgICAqIGFib3V0IHdoaXRlLXNjYWxlOgorICAgICoKKyAgICAqICAgIEFzc3VtZTogd2hpdGUtWSA9IDEuMAorICAgICogICAgSGVuY2U6ICB3aGl0ZS1zY2FsZSA9IDEvd2hpdGUteQorICAgICogICAgT3I6ICAgICByZWQtWSArIGdyZWVuLVkgKyBibHVlLVkgPSAxLjAKKyAgICAqCisgICAgKiBOb3RpY2UgdGhlIGxhc3Qgc3RhdGVtZW50IG9mIHRoZSBhc3N1bXB0aW9uIGdpdmVzIGFuIGVxdWF0aW9uIGluIHRocmVlIG9mCisgICAgKiB0aGUgbmluZSB2YWx1ZXMgd2Ugd2FudCB0byBjYWxjdWxhdGUuICA4IG1vcmUgZXF1YXRpb25zIGNvbWUgZnJvbSB0aGUKKyAgICAqIGFib3ZlIHJvdXRpbmUgYXMgc3VtbWFyaXNlZCBhdCB0aGUgdG9wIGFib3ZlICh0aGUgY2hyb21hdGljaXR5CisgICAgKiBjYWxjdWxhdGlvbik6CisgICAgKgorICAgICogICAgR2l2ZW46IGNvbG9yLXggPSBjb2xvci1YIC8gKGNvbG9yLVggKyBjb2xvci1ZICsgY29sb3ItWikKKyAgICAqICAgIEhlbmNlOiAoY29sb3IteCAtIDEpKmNvbG9yLVggKyBjb2xvci54KmNvbG9yLVkgKyBjb2xvci54KmNvbG9yLVogPSAwCisgICAgKgorICAgICogVGhpcyBpcyA5IHNpbXVsdGFuZW91cyBlcXVhdGlvbnMgaW4gdGhlIDkgdmFyaWFibGVzICJjb2xvci1DIiBhbmQgY2FuIGJlCisgICAgKiBzb2x2ZWQgYnkgQ3JhbWVyJ3MgcnVsZS4gIENyYW1lcidzIHJ1bGUgcmVxdWlyZXMgY2FsY3VsYXRpbmcgMTAgOXg5IG1hdHJpeAorICAgICogZGV0ZXJtaW5hbnRzLCBob3dldmVyIHRoaXMgaXMgbm90IGFzIGJhZCBhcyBpdCBzZWVtcyBiZWNhdXNlIG9ubHkgMjggb2YKKyAgICAqIHRoZSB0b3RhbCBvZiA5MCB0ZXJtcyBpbiB0aGUgdmFyaW91cyBtYXRyaWNlcyBhcmUgbm9uLXplcm8uICBOZXZlcnRoZWxlc3MKKyAgICAqIENyYW1lcidzIHJ1bGUgaXMgbm90b3Jpb3VzbHkgbnVtZXJpY2FsbHkgdW5zdGFibGUgYmVjYXVzZSB0aGUgZGV0ZXJtaW5hbnQKKyAgICAqIGNhbGN1bGF0aW9uIGludm9sdmVzIHRoZSBkaWZmZXJlbmNlIG9mIGxhcmdlLCBidXQgc2ltaWxhciwgbnVtYmVycy4gIEl0IGlzCisgICAgKiBkaWZmaWN1bHQgdG8gYmUgc3VyZSB0aGF0IHRoZSBjYWxjdWxhdGlvbiBpcyBzdGFibGUgZm9yIHJlYWwgd29ybGQgdmFsdWVzCisgICAgKiBhbmQgaXQgaXMgY2VydGFpbiB0aGF0IGl0IGJlY29tZXMgdW5zdGFibGUgd2hlcmUgdGhlIGVuZCBwb2ludHMgYXJlIGNsb3NlCisgICAgKiB0b2dldGhlci4KKyAgICAqCisgICAgKiBTbyB0aGlzIGNvZGUgdXNlcyB0aGUgcGVyaGFwcyBzbGlnaHRseSBsZXNzIG9wdGltYWwgYnV0IG1vcmUKKyAgICAqIHVuZGVyc3RhbmRhYmxlIGFuZCB0b3RhbGx5IG9idmlvdXMgYXBwcm9hY2ggb2YgY2FsY3VsYXRpbmcgY29sb3Itc2NhbGUuCisgICAgKgorICAgICogVGhpcyBhbGdvcml0aG0gZGVwZW5kcyBvbiB0aGUgcHJlY2lzaW9uIGluIHdoaXRlLXNjYWxlIGFuZCB0aGF0IGlzCisgICAgKiAoMS93aGl0ZS15KSwgc28gd2UgY2FuIGltbWVkaWF0ZWx5IHNlZSB0aGF0IGFzIHdoaXRlLXkgYXBwcm9hY2hlcyAwIHRoZQorICAgICogYWNjdXJhY3kgaW5oZXJlbnQgaW4gdGhlIGNIUk0gY2h1bmsgZHJvcHMgb2ZmIHN1YnN0YW50aWFsbHkuCisgICAgKgorICAgICogbGlicG5nIGFyaXRobWV0aWM6IGEgc2ltcGxlIGludmVyc2lvbiBvZiB0aGUgYWJvdmUgZXF1YXRpb25zCisgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAqCisgICAgKiAgICB3aGl0ZV9zY2FsZSA9IDEvd2hpdGUteQorICAgICogICAgd2hpdGUtWCA9IHdoaXRlLXggKiB3aGl0ZS1zY2FsZQorICAgICogICAgd2hpdGUtWSA9IDEuMAorICAgICogICAgd2hpdGUtWiA9ICgxIC0gd2hpdGUteCAtIHdoaXRlLXkpICogd2hpdGVfc2NhbGUKKyAgICAqCisgICAgKiAgICB3aGl0ZS1DID0gcmVkLUMgKyBncmVlbi1DICsgYmx1ZS1DCisgICAgKiAgICAgICAgICAgID0gcmVkLWMqcmVkLXNjYWxlICsgZ3JlZW4tYypncmVlbi1zY2FsZSArIGJsdWUtYypibHVlLXNjYWxlCisgICAgKgorICAgICogVGhpcyBnaXZlcyB1cyB0aHJlZSBlcXVhdGlvbnMgaW4gKHJlZC1zY2FsZSxncmVlbi1zY2FsZSxibHVlLXNjYWxlKSB3aGVyZQorICAgICogYWxsIHRoZSBjb2VmZmljaWVudHMgYXJlIG5vdyBrbm93bjoKKyAgICAqCisgICAgKiAgICByZWQteCpyZWQtc2NhbGUgKyBncmVlbi14KmdyZWVuLXNjYWxlICsgYmx1ZS14KmJsdWUtc2NhbGUKKyAgICAqICAgICAgID0gd2hpdGUteC93aGl0ZS15CisgICAgKiAgICByZWQteSpyZWQtc2NhbGUgKyBncmVlbi15KmdyZWVuLXNjYWxlICsgYmx1ZS15KmJsdWUtc2NhbGUgPSAxCisgICAgKiAgICByZWQteipyZWQtc2NhbGUgKyBncmVlbi16KmdyZWVuLXNjYWxlICsgYmx1ZS16KmJsdWUtc2NhbGUKKyAgICAqICAgICAgID0gKDEgLSB3aGl0ZS14IC0gd2hpdGUteSkvd2hpdGUteQorICAgICoKKyAgICAqIEluIHRoZSBsYXN0IGVxdWF0aW9uIGNvbG9yLXogaXMgKDEgLSBjb2xvci14IC0gY29sb3IteSkgc28gd2UgY2FuIGFkZCBhbGwKKyAgICAqIHRocmVlIGVxdWF0aW9ucyB0b2dldGhlciB0byBnZXQgYW4gYWx0ZXJuYXRpdmUgdGhpcmQ6CisgICAgKgorICAgICogICAgcmVkLXNjYWxlICsgZ3JlZW4tc2NhbGUgKyBibHVlLXNjYWxlID0gMS93aGl0ZS15ID0gd2hpdGUtc2NhbGUKKyAgICAqCisgICAgKiBTbyBub3cgd2UgaGF2ZSBhIENyYW1lcidzIHJ1bGUgc29sdXRpb24gd2hlcmUgdGhlIGRldGVybWluYW50cyBhcmUganVzdAorICAgICogM3gzIC0gZmFyIG1vcmUgdHJhY3RpYmxlLiAgVW5mb3J0dW5hdGVseSAzeDMgZGV0ZXJtaW5hbnRzIHN0aWxsIGludm9sdmUKKyAgICAqIG11bHRpcGxpY2F0aW9uIG9mIHRocmVlIGNvZWZmaWNpZW50cyBzbyB3ZSBjYW4ndCBndWFyYW50ZWUgdG8gYXZvaWQKKyAgICAqIG92ZXJmbG93IGluIHRoZSBsaWJwbmcgZml4ZWQgcG9pbnQgcmVwcmVzZW50YXRpb24uICBVc2luZyBDcmFtZXIncyBydWxlIGluCisgICAgKiBmbG9hdGluZyBwb2ludCBpcyBwcm9iYWJseSBhIGdvb2QgY2hvaWNlIGhlcmUsIGJ1dCBpdCdzIG5vdCBhbiBvcHRpb24gZm9yCisgICAgKiBmaXhlZCBwb2ludC4gIEluc3RlYWQgcHJvY2VlZCB0byBzaW1wbGlmeSB0aGUgZmlyc3QgdHdvIGVxdWF0aW9ucyBieQorICAgICogZWxpbWluYXRpbmcgd2hhdCBpcyBsaWtlbHkgdG8gYmUgdGhlIGxhcmdlc3QgdmFsdWUsIGJsdWUtc2NhbGU6CisgICAgKgorICAgICogICAgYmx1ZS1zY2FsZSA9IHdoaXRlLXNjYWxlIC0gcmVkLXNjYWxlIC0gZ3JlZW4tc2NhbGUKKyAgICAqCisgICAgKiBIZW5jZToKKyAgICAqCisgICAgKiAgICAocmVkLXggLSBibHVlLXgpKnJlZC1zY2FsZSArIChncmVlbi14IC0gYmx1ZS14KSpncmVlbi1zY2FsZSA9CisgICAgKiAgICAgICAgICAgICAgICAod2hpdGUteCAtIGJsdWUteCkqd2hpdGUtc2NhbGUKKyAgICAqCisgICAgKiAgICAocmVkLXkgLSBibHVlLXkpKnJlZC1zY2FsZSArIChncmVlbi15IC0gYmx1ZS15KSpncmVlbi1zY2FsZSA9CisgICAgKiAgICAgICAgICAgICAgICAxIC0gYmx1ZS15KndoaXRlLXNjYWxlCisgICAgKgorICAgICogQW5kIG5vdyB3ZSBjYW4gdHJpdmlhbGx5IHNvbHZlIGZvciAocmVkLXNjYWxlLGdyZWVuLXNjYWxlKToKKyAgICAqCisgICAgKiAgICBncmVlbi1zY2FsZSA9CisgICAgKiAgICAgICAgICAgICAgICAod2hpdGUteCAtIGJsdWUteCkqd2hpdGUtc2NhbGUgLSAocmVkLXggLSBibHVlLXgpKnJlZC1zY2FsZQorICAgICogICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuLXggLSBibHVlLXgKKyAgICAqCisgICAgKiAgICByZWQtc2NhbGUgPQorICAgICogICAgICAgICAgICAgICAgMSAtIGJsdWUteSp3aGl0ZS1zY2FsZSAtIChncmVlbi15IC0gYmx1ZS15KSAqIGdyZWVuLXNjYWxlCisgICAgKiAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZC15IC0gYmx1ZS15CisgICAgKgorICAgICogSGVuY2U6CisgICAgKgorICAgICogICAgcmVkLXNjYWxlID0KKyAgICAqICAgICAgICAgICggKGdyZWVuLXggLSBibHVlLXgpICogKHdoaXRlLXkgLSBibHVlLXkpIC0KKyAgICAqICAgICAgICAgICAgKGdyZWVuLXkgLSBibHVlLXkpICogKHdoaXRlLXggLSBibHVlLXgpICkgLyB3aGl0ZS15CisgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgKiAgKGdyZWVuLXggLSBibHVlLXgpKihyZWQteSAtIGJsdWUteSktKGdyZWVuLXkgLSBibHVlLXkpKihyZWQteCAtIGJsdWUteCkKKyAgICAqCisgICAgKiAgICBncmVlbi1zY2FsZSA9CisgICAgKiAgICAgICAgICAoIChyZWQteSAtIGJsdWUteSkgKiAod2hpdGUteCAtIGJsdWUteCkgLQorICAgICogICAgICAgICAgICAocmVkLXggLSBibHVlLXgpICogKHdoaXRlLXkgLSBibHVlLXkpICkgLyB3aGl0ZS15CisgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgKiAgKGdyZWVuLXggLSBibHVlLXgpKihyZWQteSAtIGJsdWUteSktKGdyZWVuLXkgLSBibHVlLXkpKihyZWQteCAtIGJsdWUteCkKKyAgICAqCisgICAgKiBBY2N1cmFjeToKKyAgICAqIFRoZSBpbnB1dCB2YWx1ZXMgaGF2ZSA1IGRlY2ltYWwgZGlnaXRzIG9mIGFjY3VyYWN5LiAgVGhlIHZhbHVlcyBhcmUgYWxsIGluCisgICAgKiB0aGUgcmFuZ2UgMCA8IHZhbHVlIDwgMSwgc28gc2ltcGxlIHByb2R1Y3RzIGFyZSBpbiB0aGUgc2FtZSByYW5nZSBidXQgbWF5CisgICAgKiBuZWVkIHVwIHRvIDEwIGRlY2ltYWwgZGlnaXRzIHRvIHByZXNlcnZlIHRoZSBvcmlnaW5hbCBwcmVjaXNpb24gYW5kIGF2b2lkCisgICAgKiB1bmRlcmZsb3cuICBCZWNhdXNlIHdlIGFyZSB1c2luZyBhIDMyLWJpdCBzaWduZWQgcmVwcmVzZW50YXRpb24gd2UgY2Fubm90CisgICAgKiBtYXRjaCB0aGlzOyB0aGUgYmVzdCBpcyBhIGxpdHRsZSBvdmVyIDkgZGVjaW1hbCBkaWdpdHMsIGxlc3MgdGhhbiAxMC4KKyAgICAqCisgICAgKiBUaGUgYXBwcm9hY2ggdXNlZCBoZXJlIGlzIHRvIHByZXNlcnZlIHRoZSBtYXhpbXVtIHByZWNpc2lvbiB3aXRoaW4gdGhlCisgICAgKiBzaWduZWQgcmVwcmVzZW50YXRpb24uICBCZWNhdXNlIHRoZSByZWQtc2NhbGUgY2FsY3VsYXRpb24gYWJvdmUgdXNlcyB0aGUKKyAgICAqIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gcHJvZHVjdHMgb2YgdmFsdWVzIHRoYXQgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgLTEuLisxCisgICAgKiBpdCBpcyBzdWZmaWNpZW50IHRvIGRpdmlkZSB0aGUgcHJvZHVjdCBieSA3OyBjZWlsKDEwMCwwMDAvMzI3NjcqMikuICBUaGUKKyAgICAqIGZhY3RvciBpcyBpcnJlbGV2YW50IGluIHRoZSBjYWxjdWxhdGlvbiBiZWNhdXNlIGl0IGlzIGFwcGxpZWQgdG8gYm90aAorICAgICogbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvci4KKyAgICAqCisgICAgKiBOb3RlIHRoYXQgdGhlIHZhbHVlcyBvZiB0aGUgZGlmZmVyZW5jZXMgb2YgdGhlIHByb2R1Y3RzIG9mIHRoZQorICAgICogY2hyb21hdGljaXRpZXMgaW4gdGhlIGFib3ZlIGVxdWF0aW9ucyB0ZW5kIHRvIGJlIHNtYWxsLCBmb3IgZXhhbXBsZSBmb3IKKyAgICAqIHRoZSBzUkdCIGNocm9tYXRpY2l0aWVzIHRoZXkgYXJlOgorICAgICoKKyAgICAqIHJlZCBudW1lcmF0b3I6ICAgIC0wLjA0NzUxCisgICAgKiBncmVlbiBudW1lcmF0b3I6ICAtMC4wODc4OAorICAgICogZGVub21pbmF0b3I6ICAgICAgLTAuMjI0MSAod2l0aG91dCB3aGl0ZS15IG11bHRpcGxpY2F0aW9uKQorICAgICoKKyAgICAqICBUaGUgcmVzdWx0YW50IFkgY29lZmZpY2llbnRzIGZyb20gdGhlIGNocm9tYXRpY2l0aWVzIG9mIHNvbWUgd2lkZWx5IHVzZWQKKyAgICAqICBjb2xvciBzcGFjZSBkZWZpbml0aW9ucyBhcmUgKHRvIDE1IGRlY2ltYWwgcGxhY2VzKToKKyAgICAqCisgICAgKiAgc1JHQgorICAgICogICAgMC4yMTI2MzkwMDU4NzE1MTAgMC43MTUxNjg2Nzg3Njc3NTYgMC4wNzIxOTIzMTUzNjA3MzQKKyAgICAqICBLb2RhayBQcm9QaG90bworICAgICogICAgMC4yODgwNzExMjgyMjkyOTMgMC43MTE4NDMyMTc4MTAxMDIgMC4wMDAwODU2NTM5NjA2MDUKKyAgICAqICBBZG9iZSBSR0IKKyAgICAqICAgIDAuMjk3MzQ0OTc1MjUwNTM2IDAuNjI3MzYzNTY2MjU1NDY2IDAuMDc1MjkxNDU4NDkzOTk4CisgICAgKiAgQWRvYmUgV2lkZSBHYW11dCBSR0IKKyAgICAqICAgIDAuMjU4NzI4MjQzMDQwMTEzIDAuNzI0NjgyMzE0OTQ4NTY2IDAuMDE2NTg5NDQyMDExMzIxCisgICAgKi8KKyAgIC8qIEJ5IHRoZSBhcmd1bWVudCwgYWJvdmUgb3ZlcmZsb3cgc2hvdWxkIGJlIGltcG9zc2libGUgaGVyZS4gVGhlIHJldHVybgorICAgICogdmFsdWUgb2YgMiBpbmRpY2F0ZXMgYW4gaW50ZXJuYWwgZXJyb3IgdG8gdGhlIGNhbGxlci4KKyAgICAqLworICAgaWYgKHBuZ19tdWxkaXYoJmxlZnQsIHh5LT5ncmVlbngteHktPmJsdWV4LCB4eS0+cmVkeSAtIHh5LT5ibHVleSwgNykgPT0gMCkKKyAgICAgIHJldHVybiAyOworICAgaWYgKHBuZ19tdWxkaXYoJnJpZ2h0LCB4eS0+Z3JlZW55LXh5LT5ibHVleSwgeHktPnJlZHggLSB4eS0+Ymx1ZXgsIDcpID09IDApCisgICAgICByZXR1cm4gMjsKKyAgIGRlbm9taW5hdG9yID0gbGVmdCAtIHJpZ2h0OworCisgICAvKiBOb3cgZmluZCB0aGUgcmVkIG51bWVyYXRvci4gKi8KKyAgIGlmIChwbmdfbXVsZGl2KCZsZWZ0LCB4eS0+Z3JlZW54LXh5LT5ibHVleCwgeHktPndoaXRleS14eS0+Ymx1ZXksIDcpID09IDApCisgICAgICByZXR1cm4gMjsKKyAgIGlmIChwbmdfbXVsZGl2KCZyaWdodCwgeHktPmdyZWVueS14eS0+Ymx1ZXksIHh5LT53aGl0ZXgteHktPmJsdWV4LCA3KSA9PSAwKQorICAgICAgcmV0dXJuIDI7CisKKyAgIC8qIE92ZXJmbG93IGlzIHBvc3NpYmxlIGhlcmUgYW5kIGl0IGluZGljYXRlcyBhbiBleHRyZW1lIHNldCBvZiBQTkcgY0hSTQorICAgICogY2h1bmsgdmFsdWVzLiAgVGhpcyBjYWxjdWxhdGlvbiBhY3R1YWxseSByZXR1cm5zIHRoZSByZWNpcHJvY2FsIG9mIHRoZQorICAgICogc2NhbGUgdmFsdWUgYmVjYXVzZSB0aGlzIGFsbG93cyB1cyB0byBkZWxheSB0aGUgbXVsdGlwbGljYXRpb24gb2Ygd2hpdGUteQorICAgICogaW50byB0aGUgZGVub21pbmF0b3IsIHdoaWNoIHRlbmRzIHRvIHByb2R1Y2UgYSBzbWFsbCBudW1iZXIuCisgICAgKi8KKyAgIGlmIChwbmdfbXVsZGl2KCZyZWRfaW52ZXJzZSwgeHktPndoaXRleSwgZGVub21pbmF0b3IsIGxlZnQtcmlnaHQpID09IDAgfHwKKyAgICAgICByZWRfaW52ZXJzZSA8PSB4eS0+d2hpdGV5IC8qIHIrZytiIHNjYWxlcyA9IHdoaXRlIHNjYWxlICovKQorICAgICAgcmV0dXJuIDE7CisKKyAgIC8qIFNpbWlsYXJseSBmb3IgZ3JlZW5faW52ZXJzZTogKi8KKyAgIGlmIChwbmdfbXVsZGl2KCZsZWZ0LCB4eS0+cmVkeS14eS0+Ymx1ZXksIHh5LT53aGl0ZXgteHktPmJsdWV4LCA3KSA9PSAwKQorICAgICAgcmV0dXJuIDI7CisgICBpZiAocG5nX211bGRpdigmcmlnaHQsIHh5LT5yZWR4LXh5LT5ibHVleCwgeHktPndoaXRleS14eS0+Ymx1ZXksIDcpID09IDApCisgICAgICByZXR1cm4gMjsKKyAgIGlmIChwbmdfbXVsZGl2KCZncmVlbl9pbnZlcnNlLCB4eS0+d2hpdGV5LCBkZW5vbWluYXRvciwgbGVmdC1yaWdodCkgPT0gMCB8fAorICAgICAgIGdyZWVuX2ludmVyc2UgPD0geHktPndoaXRleSkKKyAgICAgIHJldHVybiAxOworCisgICAvKiBBbmQgdGhlIGJsdWUgc2NhbGUsIHRoZSBjaGVja3MgYWJvdmUgZ3VhcmFudGVlIHRoaXMgY2FuJ3Qgb3ZlcmZsb3cgYnV0IGl0CisgICAgKiBjYW4gc3RpbGwgcHJvZHVjZSAwIGZvciBleHRyZW1lIGNIUk0gdmFsdWVzLgorICAgICovCisgICBibHVlX3NjYWxlID0gcG5nX3JlY2lwcm9jYWwoeHktPndoaXRleSkgLSBwbmdfcmVjaXByb2NhbChyZWRfaW52ZXJzZSkgLQorICAgICAgIHBuZ19yZWNpcHJvY2FsKGdyZWVuX2ludmVyc2UpOworICAgaWYgKGJsdWVfc2NhbGUgPD0gMCkKKyAgICAgIHJldHVybiAxOworCisKKyAgIC8qIEFuZCBmaWxsIGluIHRoZSBwbmdfWFlaOiAqLworICAgaWYgKHBuZ19tdWxkaXYoJlhZWi0+cmVkX1gsIHh5LT5yZWR4LCBQTkdfRlBfMSwgcmVkX2ludmVyc2UpID09IDApCisgICAgICByZXR1cm4gMTsKKyAgIGlmIChwbmdfbXVsZGl2KCZYWVotPnJlZF9ZLCB4eS0+cmVkeSwgUE5HX0ZQXzEsIHJlZF9pbnZlcnNlKSA9PSAwKQorICAgICAgcmV0dXJuIDE7CisgICBpZiAocG5nX211bGRpdigmWFlaLT5yZWRfWiwgUE5HX0ZQXzEgLSB4eS0+cmVkeCAtIHh5LT5yZWR5LCBQTkdfRlBfMSwKKyAgICAgICByZWRfaW52ZXJzZSkgPT0gMCkKKyAgICAgIHJldHVybiAxOworCisgICBpZiAocG5nX211bGRpdigmWFlaLT5ncmVlbl9YLCB4eS0+Z3JlZW54LCBQTkdfRlBfMSwgZ3JlZW5faW52ZXJzZSkgPT0gMCkKKyAgICAgIHJldHVybiAxOworICAgaWYgKHBuZ19tdWxkaXYoJlhZWi0+Z3JlZW5fWSwgeHktPmdyZWVueSwgUE5HX0ZQXzEsIGdyZWVuX2ludmVyc2UpID09IDApCisgICAgICByZXR1cm4gMTsKKyAgIGlmIChwbmdfbXVsZGl2KCZYWVotPmdyZWVuX1osIFBOR19GUF8xIC0geHktPmdyZWVueCAtIHh5LT5ncmVlbnksIFBOR19GUF8xLAorICAgICAgIGdyZWVuX2ludmVyc2UpID09IDApCisgICAgICByZXR1cm4gMTsKKworICAgaWYgKHBuZ19tdWxkaXYoJlhZWi0+Ymx1ZV9YLCB4eS0+Ymx1ZXgsIGJsdWVfc2NhbGUsIFBOR19GUF8xKSA9PSAwKQorICAgICAgcmV0dXJuIDE7CisgICBpZiAocG5nX211bGRpdigmWFlaLT5ibHVlX1ksIHh5LT5ibHVleSwgYmx1ZV9zY2FsZSwgUE5HX0ZQXzEpID09IDApCisgICAgICByZXR1cm4gMTsKKyAgIGlmIChwbmdfbXVsZGl2KCZYWVotPmJsdWVfWiwgUE5HX0ZQXzEgLSB4eS0+Ymx1ZXggLSB4eS0+Ymx1ZXksIGJsdWVfc2NhbGUsCisgICAgICAgUE5HX0ZQXzEpID09IDApCisgICAgICByZXR1cm4gMTsKKworICAgcmV0dXJuIDA7IC8qc3VjY2VzcyovCit9CisKK3N0YXRpYyBpbnQKK3BuZ19YWVpfbm9ybWFsaXplKHBuZ19YWVogKlhZWikKK3sKKyAgIHBuZ19pbnRfMzIgWTsKKworICAgaWYgKFhZWi0+cmVkX1kgPCAwIHx8IFhZWi0+Z3JlZW5fWSA8IDAgfHwgWFlaLT5ibHVlX1kgPCAwIHx8CisgICAgICBYWVotPnJlZF9YIDwgMCB8fCBYWVotPmdyZWVuX1ggPCAwIHx8IFhZWi0+Ymx1ZV9YIDwgMCB8fAorICAgICAgWFlaLT5yZWRfWiA8IDAgfHwgWFlaLT5ncmVlbl9aIDwgMCB8fCBYWVotPmJsdWVfWiA8IDApCisgICAgICByZXR1cm4gMTsKKworICAgLyogTm9ybWFsaXplIGJ5IHNjYWxpbmcgc28gdGhlIHN1bSBvZiB0aGUgZW5kLXBvaW50IFkgdmFsdWVzIGlzIFBOR19GUF8xLgorICAgICogSU1QTEVNRU5UQVRJT04gTk9URTogQU5TSSByZXF1aXJlcyBzaWduZWQgb3ZlcmZsb3cgbm90IHRvIG9jY3VyLCB0aGVyZWZvcmUKKyAgICAqIHJlbHlpbmcgb24gYWRkaXRpb24gb2YgdHdvIHBvc2l0aXZlIHZhbHVlcyBwcm9kdWNpbmcgYSBuZWdhdGl2ZSBvbmUgaXMgbm90CisgICAgKiBzYWZlLgorICAgICovCisgICBZID0gWFlaLT5yZWRfWTsKKyAgIGlmICgweDdmZmZmZmZmIC0gWSA8IFhZWi0+Z3JlZW5fWCkKKyAgICAgIHJldHVybiAxOworICAgWSArPSBYWVotPmdyZWVuX1k7CisgICBpZiAoMHg3ZmZmZmZmZiAtIFkgPCBYWVotPmJsdWVfWCkKKyAgICAgIHJldHVybiAxOworICAgWSArPSBYWVotPmJsdWVfWTsKKworICAgaWYgKFkgIT0gUE5HX0ZQXzEpCisgICB7CisgICAgICBpZiAocG5nX211bGRpdigmWFlaLT5yZWRfWCwgWFlaLT5yZWRfWCwgUE5HX0ZQXzEsIFkpID09IDApCisgICAgICAgICByZXR1cm4gMTsKKyAgICAgIGlmIChwbmdfbXVsZGl2KCZYWVotPnJlZF9ZLCBYWVotPnJlZF9ZLCBQTkdfRlBfMSwgWSkgPT0gMCkKKyAgICAgICAgIHJldHVybiAxOworICAgICAgaWYgKHBuZ19tdWxkaXYoJlhZWi0+cmVkX1osIFhZWi0+cmVkX1osIFBOR19GUF8xLCBZKSA9PSAwKQorICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgIGlmIChwbmdfbXVsZGl2KCZYWVotPmdyZWVuX1gsIFhZWi0+Z3JlZW5fWCwgUE5HX0ZQXzEsIFkpID09IDApCisgICAgICAgICByZXR1cm4gMTsKKyAgICAgIGlmIChwbmdfbXVsZGl2KCZYWVotPmdyZWVuX1ksIFhZWi0+Z3JlZW5fWSwgUE5HX0ZQXzEsIFkpID09IDApCisgICAgICAgICByZXR1cm4gMTsKKyAgICAgIGlmIChwbmdfbXVsZGl2KCZYWVotPmdyZWVuX1osIFhZWi0+Z3JlZW5fWiwgUE5HX0ZQXzEsIFkpID09IDApCisgICAgICAgICByZXR1cm4gMTsKKworICAgICAgaWYgKHBuZ19tdWxkaXYoJlhZWi0+Ymx1ZV9YLCBYWVotPmJsdWVfWCwgUE5HX0ZQXzEsIFkpID09IDApCisgICAgICAgICByZXR1cm4gMTsKKyAgICAgIGlmIChwbmdfbXVsZGl2KCZYWVotPmJsdWVfWSwgWFlaLT5ibHVlX1ksIFBOR19GUF8xLCBZKSA9PSAwKQorICAgICAgICAgcmV0dXJuIDE7CisgICAgICBpZiAocG5nX211bGRpdigmWFlaLT5ibHVlX1osIFhZWi0+Ymx1ZV9aLCBQTkdfRlBfMSwgWSkgPT0gMCkKKyAgICAgICAgIHJldHVybiAxOworICAgfQorCisgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcG5nX2NvbG9yc3BhY2VfZW5kcG9pbnRzX21hdGNoKGNvbnN0IHBuZ194eSAqeHkxLCBjb25zdCBwbmdfeHkgKnh5MiwgaW50IGRlbHRhKQoreworICAgLyogQWxsb3cgYW4gZXJyb3Igb2YgKy8tMC4wMSAoYWJzb2x1dGUgdmFsdWUpIG9uIGVhY2ggY2hyb21hdGljaXR5ICovCisgICBpZiAoUE5HX09VVF9PRl9SQU5HRSh4eTEtPndoaXRleCwgeHkyLT53aGl0ZXgsZGVsdGEpIHx8CisgICAgICAgUE5HX09VVF9PRl9SQU5HRSh4eTEtPndoaXRleSwgeHkyLT53aGl0ZXksZGVsdGEpIHx8CisgICAgICAgUE5HX09VVF9PRl9SQU5HRSh4eTEtPnJlZHgsICAgeHkyLT5yZWR4LCAgZGVsdGEpIHx8CisgICAgICAgUE5HX09VVF9PRl9SQU5HRSh4eTEtPnJlZHksICAgeHkyLT5yZWR5LCAgZGVsdGEpIHx8CisgICAgICAgUE5HX09VVF9PRl9SQU5HRSh4eTEtPmdyZWVueCwgeHkyLT5ncmVlbngsZGVsdGEpIHx8CisgICAgICAgUE5HX09VVF9PRl9SQU5HRSh4eTEtPmdyZWVueSwgeHkyLT5ncmVlbnksZGVsdGEpIHx8CisgICAgICAgUE5HX09VVF9PRl9SQU5HRSh4eTEtPmJsdWV4LCAgeHkyLT5ibHVleCwgZGVsdGEpIHx8CisgICAgICAgUE5HX09VVF9PRl9SQU5HRSh4eTEtPmJsdWV5LCAgeHkyLT5ibHVleSwgZGVsdGEpKQorICAgICAgcmV0dXJuIDA7CisgICByZXR1cm4gMTsKK30KKworLyogQWRkZWQgaW4gbGlicG5nLTEuNi4wLCBhIGRpZmZlcmVudCBjaGVjayBmb3IgdGhlIHZhbGlkaXR5IG9mIGEgc2V0IG9mIGNIUk0KKyAqIGNodW5rIGNocm9tYXRpY2l0aWVzLiAgRWFybGllciBjaGVja3MgdXNlZCB0byBzaW1wbHkgbG9vayBmb3IgdGhlIG92ZXJmbG93CisgKiBjb25kaXRpb24gKHdoZXJlIHRoZSBkZXRlcm1pbmFudCBvZiB0aGUgbWF0cml4IHRvIHNvbHZlIGZvciBYWVogZW5kcyB1cCB6ZXJvCisgKiBiZWNhdXNlIHRoZSBjaHJvbWF0aWNpdHkgdmFsdWVzIGFyZSBub3QgYWxsIGRpc3RpbmN0LikgIERlc3BpdGUgdGhpcyBpdCBpcworICogdGhlb3JldGljYWxseSBwb3NzaWJsZSB0byBwcm9kdWNlIGNocm9tYXRpY2l0aWVzIHRoYXQgYXJlIGFwcGFyZW50bHkgdmFsaWQKKyAqIGJ1dCB0aGF0IHJhcGlkbHkgZGVncmFkZSB0byBpbnZhbGlkLCBwb3RlbnRpYWxseSBjcmFzaGluZywgc2V0cyBiZWNhdXNlIG9mCisgKiBhcml0aG1ldGljIGluYWNjdXJhY2llcyB3aGVuIGNhbGN1bGF0aW9ucyBhcmUgcGVyZm9ybWVkIG9uIHRoZW0uICBUaGUgbmV3CisgKiBjaGVjayBpcyB0byByb3VuZC10cmlwIHh5IC0+IFhZWiAtPiB4eSBhbmQgdGhlbiBjaGVjayB0aGF0IHRoZSByZXN1bHQgaXMKKyAqIHdpdGhpbiBhIHNtYWxsIHBlcmNlbnRhZ2Ugb2YgdGhlIG9yaWdpbmFsLgorICovCitzdGF0aWMgaW50CitwbmdfY29sb3JzcGFjZV9jaGVja194eShwbmdfWFlaICpYWVosIGNvbnN0IHBuZ194eSAqeHkpCit7CisgICBpbnQgcmVzdWx0OworICAgcG5nX3h5IHh5X3Rlc3Q7CisKKyAgIC8qIEFzIGEgc2lkZS1lZmZlY3QgdGhpcyByb3V0aW5lIGFsc28gcmV0dXJucyB0aGUgWFlaIGVuZHBvaW50cy4gKi8KKyAgIHJlc3VsdCA9IHBuZ19YWVpfZnJvbV94eShYWVosIHh5KTsKKyAgIGlmIChyZXN1bHQgIT0gMCkKKyAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgIHJlc3VsdCA9IHBuZ194eV9mcm9tX1hZWigmeHlfdGVzdCwgWFlaKTsKKyAgIGlmIChyZXN1bHQgIT0gMCkKKyAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgIGlmIChwbmdfY29sb3JzcGFjZV9lbmRwb2ludHNfbWF0Y2goeHksICZ4eV90ZXN0LAorICAgICAgIDUvKmFjdHVhbGx5LCB0aGUgbWF0aCBpcyBwcmV0dHkgYWNjdXJhdGUqLykgIT0gMCkKKyAgICAgIHJldHVybiAwOworCisgICAvKiBUb28gbXVjaCBzbGlwICovCisgICByZXR1cm4gMTsKK30KKworLyogVGhpcyBpcyB0aGUgY2hlY2sgZ29pbmcgdGhlIG90aGVyIHdheS4gIFRoZSBYWVogaXMgbW9kaWZpZWQgdG8gbm9ybWFsaXplIGl0CisgKiAoYW5vdGhlciBzaWRlLWVmZmVjdCkgYW5kIHRoZSB4eSBjaHJvbWF0aWNpdGllcyBhcmUgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBpbnQKK3BuZ19jb2xvcnNwYWNlX2NoZWNrX1hZWihwbmdfeHkgKnh5LCBwbmdfWFlaICpYWVopCit7CisgICBpbnQgcmVzdWx0OworICAgcG5nX1hZWiBYWVp0ZW1wOworCisgICByZXN1bHQgPSBwbmdfWFlaX25vcm1hbGl6ZShYWVopOworICAgaWYgKHJlc3VsdCAhPSAwKQorICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgcmVzdWx0ID0gcG5nX3h5X2Zyb21fWFlaKHh5LCBYWVopOworICAgaWYgKHJlc3VsdCAhPSAwKQorICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgWFladGVtcCA9ICpYWVo7CisgICByZXR1cm4gcG5nX2NvbG9yc3BhY2VfY2hlY2tfeHkoJlhZWnRlbXAsIHh5KTsKK30KKworLyogVXNlZCB0byBjaGVjayBmb3IgYW4gZW5kcG9pbnQgbWF0Y2ggYWdhaW5zdCBzUkdCICovCitzdGF0aWMgY29uc3QgcG5nX3h5IHNSR0JfeHkgPSAvKiBGcm9tIElUVS1SIEJULjcwOS0zICovCit7CisgICAvKiBjb2xvciAgICAgIHggICAgICAgeSAqLworICAgLyogcmVkICAgKi8gNjQwMDAsIDMzMDAwLAorICAgLyogZ3JlZW4gKi8gMzAwMDAsIDYwMDAwLAorICAgLyogYmx1ZSAgKi8gMTUwMDAsICA2MDAwLAorICAgLyogd2hpdGUgKi8gMzEyNzAsIDMyOTAwCit9OworCitzdGF0aWMgaW50CitwbmdfY29sb3JzcGFjZV9zZXRfeHlfYW5kX1hZWihwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgIHBuZ19jb2xvcnNwYWNlcnAgY29sb3JzcGFjZSwgY29uc3QgcG5nX3h5ICp4eSwgY29uc3QgcG5nX1hZWiAqWFlaLAorICAgaW50IHByZWZlcnJlZCkKK3sKKyAgIGlmICgoY29sb3JzcGFjZS0+ZmxhZ3MgJiBQTkdfQ09MT1JTUEFDRV9JTlZBTElEKSAhPSAwKQorICAgICAgcmV0dXJuIDA7CisKKyAgIC8qIFRoZSBjb25zaXN0ZW5jeSBjaGVjayBpcyBwZXJmb3JtZWQgb24gdGhlIGNocm9tYXRpY2l0aWVzOyB0aGlzIGZhY3RvcnMgb3V0CisgICAgKiB2YXJpYXRpb25zIGJlY2F1c2Ugb2YgdGhlIG5vcm1hbGl6YXRpb24gKG9yIG5vdCkgb2YgdGhlIGVuZCBwb2ludCBZCisgICAgKiB2YWx1ZXMuCisgICAgKi8KKyAgIGlmIChwcmVmZXJyZWQgPCAyICYmCisgICAgICAgKGNvbG9yc3BhY2UtPmZsYWdzICYgUE5HX0NPTE9SU1BBQ0VfSEFWRV9FTkRQT0lOVFMpICE9IDApCisgICB7CisgICAgICAvKiBUaGUgZW5kIHBvaW50cyBtdXN0IGJlIHJlYXNvbmFibHkgY2xvc2UgdG8gYW55IHdlIGFscmVhZHkgaGF2ZS4gIFRoZQorICAgICAgICogZm9sbG93aW5nIGFsbG93cyBhbiBlcnJvciBvZiB1cCB0byArLy0uMDAxCisgICAgICAgKi8KKyAgICAgIGlmIChwbmdfY29sb3JzcGFjZV9lbmRwb2ludHNfbWF0Y2goeHksICZjb2xvcnNwYWNlLT5lbmRfcG9pbnRzX3h5LAorICAgICAgICAgIDEwMCkgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgIGNvbG9yc3BhY2UtPmZsYWdzIHw9IFBOR19DT0xPUlNQQUNFX0lOVkFMSUQ7CisgICAgICAgICBwbmdfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJpbmNvbnNpc3RlbnQgY2hyb21hdGljaXRpZXMiKTsKKyAgICAgICAgIHJldHVybiAwOyAvKiBmYWlsZWQgKi8KKyAgICAgIH0KKworICAgICAgLyogT25seSBvdmVyd3JpdGUgd2l0aCBwcmVmZXJyZWQgdmFsdWVzICovCisgICAgICBpZiAocHJlZmVycmVkID09IDApCisgICAgICAgICByZXR1cm4gMTsgLyogb2ssIGJ1dCBubyBjaGFuZ2UgKi8KKyAgIH0KKworICAgY29sb3JzcGFjZS0+ZW5kX3BvaW50c194eSA9ICp4eTsKKyAgIGNvbG9yc3BhY2UtPmVuZF9wb2ludHNfWFlaID0gKlhZWjsKKyAgIGNvbG9yc3BhY2UtPmZsYWdzIHw9IFBOR19DT0xPUlNQQUNFX0hBVkVfRU5EUE9JTlRTOworCisgICAvKiBUaGUgZW5kIHBvaW50cyBhcmUgbm9ybWFsbHkgcXVvdGVkIHRvIHR3byBkZWNpbWFsIGRpZ2l0cywgc28gYWxsb3cgKy8tMC4wMQorICAgICogb24gdGhpcyB0ZXN0LgorICAgICovCisgICBpZiAocG5nX2NvbG9yc3BhY2VfZW5kcG9pbnRzX21hdGNoKHh5LCAmc1JHQl94eSwgMTAwMCkgIT0gMCkKKyAgICAgIGNvbG9yc3BhY2UtPmZsYWdzIHw9IFBOR19DT0xPUlNQQUNFX0VORFBPSU5UU19NQVRDSF9zUkdCOworCisgICBlbHNlCisgICAgICBjb2xvcnNwYWNlLT5mbGFncyAmPSBQTkdfQ09MT1JTUEFDRV9DQU5DRUwoCisgICAgICAgICBQTkdfQ09MT1JTUEFDRV9FTkRQT0lOVFNfTUFUQ0hfc1JHQik7CisKKyAgIHJldHVybiAyOyAvKiBvayBhbmQgY2hhbmdlZCAqLworfQorCitpbnQgLyogUFJJVkFURSAqLworcG5nX2NvbG9yc3BhY2Vfc2V0X2Nocm9tYXRpY2l0aWVzKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLCBjb25zdCBwbmdfeHkgKnh5LCBpbnQgcHJlZmVycmVkKQoreworICAgLyogV2UgbXVzdCBjaGVjayB0aGUgZW5kIHBvaW50cyB0byBlbnN1cmUgdGhleSBhcmUgcmVhc29uYWJsZSAtIGluIHRoZSBwYXN0CisgICAgKiBjb2xvciBtYW5hZ2VtZW50IHN5c3RlbXMgaGF2ZSBjcmFzaGVkIGFzIGEgcmVzdWx0IG9mIGdldHRpbmcgYm9ndXMKKyAgICAqIGNvbG9yYW50IHZhbHVlcywgd2hpbGUgdGhpcyBpc24ndCB0aGUgZmF1bHQgb2YgbGlicG5nIGl0IGlzIHRoZQorICAgICogcmVzcG9uc2liaWxpdHkgb2YgbGlicG5nIGJlY2F1c2UgUE5HIGNhcnJpZXMgdGhlIGJvbWIgYW5kIGxpYnBuZyBpcyBpbiBhCisgICAgKiBwb3NpdGlvbiB0byBwcm90ZWN0IGFnYWluc3QgaXQuCisgICAgKi8KKyAgIHBuZ19YWVogWFlaOworCisgICBzd2l0Y2ggKHBuZ19jb2xvcnNwYWNlX2NoZWNrX3h5KCZYWVosIHh5KSkKKyAgIHsKKyAgICAgIGNhc2UgMDogLyogc3VjY2VzcyAqLworICAgICAgICAgcmV0dXJuIHBuZ19jb2xvcnNwYWNlX3NldF94eV9hbmRfWFlaKHBuZ19wdHIsIGNvbG9yc3BhY2UsIHh5LCAmWFlaLAorICAgICAgICAgICAgcHJlZmVycmVkKTsKKworICAgICAgY2FzZSAxOgorICAgICAgICAgLyogV2UgY2FuJ3QgaW52ZXJ0IHRoZSBjaHJvbWF0aWNpdGllcyBzbyB3ZSBjYW4ndCBwcm9kdWNlIHZhbHVlIFhZWgorICAgICAgICAgICogdmFsdWVzLiAgTGlrZWx5IGFzIG5vdCBhIGNvbG9yIG1hbmFnZW1lbnQgc3lzdGVtIHdpbGwgZmFpbCB0b28uCisgICAgICAgICAgKi8KKyAgICAgICAgIGNvbG9yc3BhY2UtPmZsYWdzIHw9IFBOR19DT0xPUlNQQUNFX0lOVkFMSUQ7CisgICAgICAgICBwbmdfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJpbnZhbGlkIGNocm9tYXRpY2l0aWVzIik7CisgICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIC8qIGxpYnBuZyBpcyBicm9rZW47IHRoaXMgc2hvdWxkIGJlIGEgd2FybmluZyBidXQgaWYgaXQgaGFwcGVucyB3ZQorICAgICAgICAgICogd2FudCBlcnJvciByZXBvcnRzIHNvIGZvciB0aGUgbW9tZW50IGl0IGlzIGFuIGVycm9yLgorICAgICAgICAgICovCisgICAgICAgICBjb2xvcnNwYWNlLT5mbGFncyB8PSBQTkdfQ09MT1JTUEFDRV9JTlZBTElEOworICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJpbnRlcm5hbCBlcnJvciBjaGVja2luZyBjaHJvbWF0aWNpdGllcyIpOworICAgfQorCisgICByZXR1cm4gMDsgLyogZmFpbGVkICovCit9CisKK2ludCAvKiBQUklWQVRFICovCitwbmdfY29sb3JzcGFjZV9zZXRfZW5kcG9pbnRzKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLCBjb25zdCBwbmdfWFlaICpYWVpfaW4sIGludCBwcmVmZXJyZWQpCit7CisgICBwbmdfWFlaIFhZWiA9ICpYWVpfaW47CisgICBwbmdfeHkgeHk7CisKKyAgIHN3aXRjaCAocG5nX2NvbG9yc3BhY2VfY2hlY2tfWFlaKCZ4eSwgJlhZWikpCisgICB7CisgICAgICBjYXNlIDA6CisgICAgICAgICByZXR1cm4gcG5nX2NvbG9yc3BhY2Vfc2V0X3h5X2FuZF9YWVoocG5nX3B0ciwgY29sb3JzcGFjZSwgJnh5LCAmWFlaLAorICAgICAgICAgICAgcHJlZmVycmVkKTsKKworICAgICAgY2FzZSAxOgorICAgICAgICAgLyogRW5kIHBvaW50cyBhcmUgaW52YWxpZC4gKi8KKyAgICAgICAgIGNvbG9yc3BhY2UtPmZsYWdzIHw9IFBOR19DT0xPUlNQQUNFX0lOVkFMSUQ7CisgICAgICAgICBwbmdfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJpbnZhbGlkIGVuZCBwb2ludHMiKTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAgY29sb3JzcGFjZS0+ZmxhZ3MgfD0gUE5HX0NPTE9SU1BBQ0VfSU5WQUxJRDsKKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiaW50ZXJuYWwgZXJyb3IgY2hlY2tpbmcgY2hyb21hdGljaXRpZXMiKTsKKyAgIH0KKworICAgcmV0dXJuIDA7IC8qIGZhaWxlZCAqLworfQorCisjaWYgZGVmaW5lZChQTkdfc1JHQl9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX2lDQ1BfU1VQUE9SVEVEKQorLyogRXJyb3IgbWVzc2FnZSBnZW5lcmF0aW9uICovCitzdGF0aWMgY2hhcgorcG5nX2ljY190YWdfY2hhcihwbmdfdWludF8zMiBieXRlKQoreworICAgYnl0ZSAmPSAweGZmOworICAgaWYgKGJ5dGUgPj0gMzIgJiYgYnl0ZSA8PSAxMjYpCisgICAgICByZXR1cm4gKGNoYXIpYnl0ZTsKKyAgIGVsc2UKKyAgICAgIHJldHVybiAnPyc7Cit9CisKK3N0YXRpYyB2b2lkCitwbmdfaWNjX3RhZ19uYW1lKGNoYXIgKm5hbWUsIHBuZ191aW50XzMyIHRhZykKK3sKKyAgIG5hbWVbMF0gPSAnXCcnOworICAgbmFtZVsxXSA9IHBuZ19pY2NfdGFnX2NoYXIodGFnID4+IDI0KTsKKyAgIG5hbWVbMl0gPSBwbmdfaWNjX3RhZ19jaGFyKHRhZyA+PiAxNik7CisgICBuYW1lWzNdID0gcG5nX2ljY190YWdfY2hhcih0YWcgPj4gIDgpOworICAgbmFtZVs0XSA9IHBuZ19pY2NfdGFnX2NoYXIodGFnICAgICAgKTsKKyAgIG5hbWVbNV0gPSAnXCcnOworfQorCitzdGF0aWMgaW50Citpc19JQ0Nfc2lnbmF0dXJlX2NoYXIocG5nX2FsbG9jX3NpemVfdCBpdCkKK3sKKyAgIHJldHVybiBpdCA9PSAzMiB8fCAoaXQgPj0gNDggJiYgaXQgPD0gNTcpIHx8IChpdCA+PSA2NSAmJiBpdCA8PSA5MCkgfHwKKyAgICAgIChpdCA+PSA5NyAmJiBpdCA8PSAxMjIpOworfQorCitzdGF0aWMgaW50Citpc19JQ0Nfc2lnbmF0dXJlKHBuZ19hbGxvY19zaXplX3QgaXQpCit7CisgICByZXR1cm4gaXNfSUNDX3NpZ25hdHVyZV9jaGFyKGl0ID4+IDI0KSAvKiBjaGVja3MgYWxsIHRoZSB0b3AgYml0cyAqLyAmJgorICAgICAgaXNfSUNDX3NpZ25hdHVyZV9jaGFyKChpdCA+PiAxNikgJiAweGZmKSAmJgorICAgICAgaXNfSUNDX3NpZ25hdHVyZV9jaGFyKChpdCA+PiA4KSAmIDB4ZmYpICYmCisgICAgICBpc19JQ0Nfc2lnbmF0dXJlX2NoYXIoaXQgJiAweGZmKTsKK30KKworc3RhdGljIGludAorcG5nX2ljY19wcm9maWxlX2Vycm9yKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29sb3JzcGFjZXJwIGNvbG9yc3BhY2UsCisgICBwbmdfY29uc3RfY2hhcnAgbmFtZSwgcG5nX2FsbG9jX3NpemVfdCB2YWx1ZSwgcG5nX2NvbnN0X2NoYXJwIHJlYXNvbikKK3sKKyAgIHNpemVfdCBwb3M7CisgICBjaGFyIG1lc3NhZ2VbMTk2XTsgLyogc2VlIGJlbG93IGZvciBjYWxjdWxhdGlvbiAqLworCisgICBpZiAoY29sb3JzcGFjZSAhPSBOVUxMKQorICAgICAgY29sb3JzcGFjZS0+ZmxhZ3MgfD0gUE5HX0NPTE9SU1BBQ0VfSU5WQUxJRDsKKworICAgcG9zID0gcG5nX3NhZmVjYXQobWVzc2FnZSwgKHNpemVvZiBtZXNzYWdlKSwgMCwgInByb2ZpbGUgJyIpOyAvKiA5IGNoYXJzICovCisgICBwb3MgPSBwbmdfc2FmZWNhdChtZXNzYWdlLCBwb3MrNzksIHBvcywgbmFtZSk7IC8qIFRydW5jYXRlIHRvIDc5IGNoYXJzICovCisgICBwb3MgPSBwbmdfc2FmZWNhdChtZXNzYWdlLCAoc2l6ZW9mIG1lc3NhZ2UpLCBwb3MsICInOiAiKTsgLyogKzIgPSA5MCAqLworICAgaWYgKGlzX0lDQ19zaWduYXR1cmUodmFsdWUpICE9IDApCisgICB7CisgICAgICAvKiBTbyAndmFsdWUnIGlzIGF0IG1vc3QgNCBieXRlcyBhbmQgdGhlIGZvbGxvd2luZyBjYXN0IGlzIHNhZmUgKi8KKyAgICAgIHBuZ19pY2NfdGFnX25hbWUobWVzc2FnZStwb3MsIChwbmdfdWludF8zMil2YWx1ZSk7CisgICAgICBwb3MgKz0gNjsgLyogdG90YWwgKzg7IGxlc3MgdGhhbiB0aGUgZWxzZSBjbGF1c2UgKi8KKyAgICAgIG1lc3NhZ2VbcG9zKytdID0gJzonOworICAgICAgbWVzc2FnZVtwb3MrK10gPSAnICc7CisgICB9CisjICBpZmRlZiBQTkdfV0FSTklOR1NfU1VQUE9SVEVECisgICBlbHNlCisgICAgICB7CisgICAgICAgICBjaGFyIG51bWJlcltQTkdfTlVNQkVSX0JVRkZFUl9TSVpFXTsgLyogKzI0ID0gMTE0Ki8KKworICAgICAgICAgcG9zID0gcG5nX3NhZmVjYXQobWVzc2FnZSwgKHNpemVvZiBtZXNzYWdlKSwgcG9zLAorICAgICAgICAgICAgcG5nX2Zvcm1hdF9udW1iZXIobnVtYmVyLCBudW1iZXIrKHNpemVvZiBudW1iZXIpLAorICAgICAgICAgICAgICAgUE5HX05VTUJFUl9GT1JNQVRfeCwgdmFsdWUpKTsKKyAgICAgICAgIHBvcyA9IHBuZ19zYWZlY2F0KG1lc3NhZ2UsIChzaXplb2YgbWVzc2FnZSksIHBvcywgImg6ICIpOyAvKisyID0gMTE2Ki8KKyAgICAgIH0KKyMgIGVuZGlmCisgICAvKiBUaGUgJ3JlYXNvbicgaXMgYW4gYXJiaXRyYXJ5IG1lc3NhZ2UsIGFsbG93ICs3OSBtYXhpbXVtIDE5NSAqLworICAgcG9zID0gcG5nX3NhZmVjYXQobWVzc2FnZSwgKHNpemVvZiBtZXNzYWdlKSwgcG9zLCByZWFzb24pOworICAgUE5HX1VOVVNFRChwb3MpCisKKyAgIC8qIFRoaXMgaXMgcmVjb3ZlcmFibGUsIGJ1dCBtYWtlIGl0IHVuY29uZGl0aW9uYWxseSBhbiBhcHBfZXJyb3Igb24gd3JpdGUgdG8KKyAgICAqIGF2b2lkIHdyaXRpbmcgaW52YWxpZCBJQ0MgcHJvZmlsZXMgaW50byBQTkcgZmlsZXMgKGkuZS4sIHdlIGhhbmRsZSB0aGVtCisgICAgKiBvbiByZWFkLCB3aXRoIGEgd2FybmluZywgYnV0IG9uIHdyaXRlIHVubGVzcyB0aGUgYXBwIHR1cm5zIG9mZgorICAgICogYXBwbGljYXRpb24gZXJyb3JzIHRoZSBQTkcgd29uJ3QgYmUgd3JpdHRlbi4pCisgICAgKi8KKyAgIHBuZ19jaHVua19yZXBvcnQocG5nX3B0ciwgbWVzc2FnZSwKKyAgICAgIChjb2xvcnNwYWNlICE9IE5VTEwpID8gUE5HX0NIVU5LX0VSUk9SIDogUE5HX0NIVU5LX1dSSVRFX0VSUk9SKTsKKworICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogc1JHQiB8fCBpQ0NQICovCisKKyNpZmRlZiBQTkdfc1JHQl9TVVBQT1JURUQKK2ludCAvKiBQUklWQVRFICovCitwbmdfY29sb3JzcGFjZV9zZXRfc1JHQihwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLAorICAgaW50IGludGVudCkKK3sKKyAgIC8qIHNSR0Igc2V0cyBrbm93biBnYW1tYSwgZW5kIHBvaW50cyBhbmQgKGZyb20gdGhlIGNodW5rKSBpbnRlbnQuICovCisgICAvKiBJTVBPUlRBTlQ6IHRoZXNlIGFyZSBub3QgbmVjZXNzYXJpbHkgdGhlIHZhbHVlcyBmb3VuZCBpbiBhbiBJQ0MgcHJvZmlsZQorICAgICogYmVjYXVzZSBJQ0MgcHJvZmlsZXMgc3RvcmUgdmFsdWVzIGFkYXB0ZWQgdG8gYSBENTAgZW52aXJvbm1lbnQ7IGl0IGlzCisgICAgKiBleHBlY3RlZCB0aGF0IHRoZSBJQ0MgcHJvZmlsZSBtZWRpYVdoaXRlUG9pbnRUYWcgd2lsbCBiZSBENTA7IHNlZSB0aGUKKyAgICAqIGNoZWNrcyBhbmQgY29kZSBlbHNld2hlcmUgdG8gdW5kZXJzdGFuZCB0aGlzIGJldHRlci4KKyAgICAqCisgICAgKiBUaGVzZSBYWVogdmFsdWVzLCB3aGljaCBhcmUgYWNjdXJhdGUgdG8gNWRwLCBwcm9kdWNlIHJnYiB0byBncmF5CisgICAgKiBjb2VmZmljaWVudHMgb2YgKDY5NjgsMjM0MzUsMjM2NiksIHdoaWNoIGFyZSByZWR1Y2VkIChiZWNhdXNlIHRoZXkgYWRkIHVwCisgICAgKiB0byAzMjc2OSBub3QgMzI3NjgpIHRvICg2OTY4LDIzNDM0LDIzNjYpLiAgVGhlc2UgYXJlIHRoZSB2YWx1ZXMgdGhhdAorICAgICogbGlicG5nIGhhcyB0cmFkaXRpb25hbGx5IHVzZWQgKGFuZCBhcmUgdGhlIGJlc3QgdmFsdWVzIGdpdmVuIHRoZSAxNWJpdAorICAgICogYWxnb3JpdGhtIHVzZWQgYnkgdGhlIHJnYiB0byBncmF5IGNvZGUuKQorICAgICovCisgICBzdGF0aWMgY29uc3QgcG5nX1hZWiBzUkdCX1hZWiA9IC8qIEQ2NSBYWVogKCpub3QqIHRoZSBENTAgYWRhcHRlZCB2YWx1ZXMhKSAqLworICAgeworICAgICAgLyogY29sb3IgICAgICBYICAgICAgWSAgICAgIFogKi8KKyAgICAgIC8qIHJlZCAgICovIDQxMjM5LCAyMTI2NCwgIDE5MzMsCisgICAgICAvKiBncmVlbiAqLyAzNTc1OCwgNzE1MTcsIDExOTE5LAorICAgICAgLyogYmx1ZSAgKi8gMTgwNDgsICA3MjE5LCA5NTA1MworICAgfTsKKworICAgLyogRG8gbm90aGluZyBpZiB0aGUgY29sb3JzcGFjZSBpcyBhbHJlYWR5IGludmFsaWRhdGVkLiAqLworICAgaWYgKChjb2xvcnNwYWNlLT5mbGFncyAmIFBOR19DT0xPUlNQQUNFX0lOVkFMSUQpICE9IDApCisgICAgICByZXR1cm4gMDsKKworICAgLyogQ2hlY2sgdGhlIGludGVudCwgdGhlbiBjaGVjayBmb3IgZXhpc3Rpbmcgc2V0dGluZ3MuICBJdCBpcyB2YWxpZCBmb3IgdGhlCisgICAgKiBQTkcgZmlsZSB0byBoYXZlIGNIUk0gb3IgZ0FNQSBjaHVua3MgYWxvbmcgd2l0aCBzUkdCLCBidXQgdGhlIHZhbHVlcyBtdXN0CisgICAgKiBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGNvcnJlY3QgdmFsdWVzLiAgSWYsIGhvd2V2ZXIsIHRoaXMgZnVuY3Rpb24gaXMKKyAgICAqIGNhbGxlZCBiZWxvdyBiZWNhdXNlIGFuIGlDQ1AgY2h1bmsgbWF0Y2hlcyBzUkdCIHRoZW4gaXQgaXMgcXVpdGUKKyAgICAqIGNvbmNlaXZhYmxlIHRoYXQgYW4gb2xkZXIgYXBwIHJlY29yZGVkIGluY29ycmVjdCBnQU1BIGFuZCBjSFJNIGJlY2F1c2Ugb2YKKyAgICAqIGFuIGluY29ycmVjdCBjYWxjdWxhdGlvbiBiYXNlZCBvbiB0aGUgdmFsdWVzIGluIHRoZSBwcm9maWxlIC0gdGhpcyBkb2VzCisgICAgKiAqbm90KiBpbnZhbGlkYXRlIHRoZSBwcm9maWxlICh0aG91Z2ggaXQgc3RpbGwgcHJvZHVjZXMgYW4gZXJyb3IsIHdoaWNoIGNhbgorICAgICogYmUgaWdub3JlZC4pCisgICAgKi8KKyAgIGlmIChpbnRlbnQgPCAwIHx8IGludGVudCA+PSBQTkdfc1JHQl9JTlRFTlRfTEFTVCkKKyAgICAgIHJldHVybiBwbmdfaWNjX3Byb2ZpbGVfZXJyb3IocG5nX3B0ciwgY29sb3JzcGFjZSwgInNSR0IiLAorICAgICAgICAgKHVuc2lnbmVkKWludGVudCwgImludmFsaWQgc1JHQiByZW5kZXJpbmcgaW50ZW50Iik7CisKKyAgIGlmICgoY29sb3JzcGFjZS0+ZmxhZ3MgJiBQTkdfQ09MT1JTUEFDRV9IQVZFX0lOVEVOVCkgIT0gMCAmJgorICAgICAgY29sb3JzcGFjZS0+cmVuZGVyaW5nX2ludGVudCAhPSBpbnRlbnQpCisgICAgICByZXR1cm4gcG5nX2ljY19wcm9maWxlX2Vycm9yKHBuZ19wdHIsIGNvbG9yc3BhY2UsICJzUkdCIiwKKyAgICAgICAgICh1bnNpZ25lZClpbnRlbnQsICJpbmNvbnNpc3RlbnQgcmVuZGVyaW5nIGludGVudHMiKTsKKworICAgaWYgKChjb2xvcnNwYWNlLT5mbGFncyAmIFBOR19DT0xPUlNQQUNFX0ZST01fc1JHQikgIT0gMCkKKyAgIHsKKyAgICAgIHBuZ19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImR1cGxpY2F0ZSBzUkdCIGluZm9ybWF0aW9uIGlnbm9yZWQiKTsKKyAgICAgIHJldHVybiAwOworICAgfQorCisgICAvKiBJZiB0aGUgc3RhbmRhcmQgc1JHQiBjSFJNIGNodW5rIGRvZXMgbm90IG1hdGNoIHRoZSBvbmUgZnJvbSB0aGUgUE5HIGZpbGUKKyAgICAqIHdhcm4gYnV0IG92ZXJ3cml0ZSB0aGUgdmFsdWUgd2l0aCB0aGUgY29ycmVjdCBvbmUuCisgICAgKi8KKyAgIGlmICgoY29sb3JzcGFjZS0+ZmxhZ3MgJiBQTkdfQ09MT1JTUEFDRV9IQVZFX0VORFBPSU5UUykgIT0gMCAmJgorICAgICAgIXBuZ19jb2xvcnNwYWNlX2VuZHBvaW50c19tYXRjaCgmc1JHQl94eSwgJmNvbG9yc3BhY2UtPmVuZF9wb2ludHNfeHksCisgICAgICAgICAxMDApKQorICAgICAgcG5nX2NodW5rX3JlcG9ydChwbmdfcHRyLCAiY0hSTSBjaHVuayBkb2VzIG5vdCBtYXRjaCBzUkdCIiwKKyAgICAgICAgIFBOR19DSFVOS19FUlJPUik7CisKKyAgIC8qIFRoaXMgY2hlY2sgaXMganVzdCBkb25lIGZvciB0aGUgZXJyb3IgcmVwb3J0aW5nIC0gdGhlIHJvdXRpbmUgYWx3YXlzCisgICAgKiByZXR1cm5zIHRydWUgd2hlbiB0aGUgJ2Zyb20nIGFyZ3VtZW50IGNvcnJlc3BvbmRzIHRvIHNSR0IgKDIpLgorICAgICovCisgICAodm9pZClwbmdfY29sb3JzcGFjZV9jaGVja19nYW1tYShwbmdfcHRyLCBjb2xvcnNwYWNlLCBQTkdfR0FNTUFfc1JHQl9JTlZFUlNFLAorICAgICAgMi8qZnJvbSBzUkdCKi8pOworCisgICAvKiBpbnRlbnQ6IGJ1Z3MgaW4gR0NDIGZvcmNlICdpbnQnIHRvIGJlIHVzZWQgYXMgdGhlIHBhcmFtZXRlciB0eXBlLiAqLworICAgY29sb3JzcGFjZS0+cmVuZGVyaW5nX2ludGVudCA9IChwbmdfdWludF8xNilpbnRlbnQ7CisgICBjb2xvcnNwYWNlLT5mbGFncyB8PSBQTkdfQ09MT1JTUEFDRV9IQVZFX0lOVEVOVDsKKworICAgLyogZW5kcG9pbnRzICovCisgICBjb2xvcnNwYWNlLT5lbmRfcG9pbnRzX3h5ID0gc1JHQl94eTsKKyAgIGNvbG9yc3BhY2UtPmVuZF9wb2ludHNfWFlaID0gc1JHQl9YWVo7CisgICBjb2xvcnNwYWNlLT5mbGFncyB8PQorICAgICAgKFBOR19DT0xPUlNQQUNFX0hBVkVfRU5EUE9JTlRTfFBOR19DT0xPUlNQQUNFX0VORFBPSU5UU19NQVRDSF9zUkdCKTsKKworICAgLyogZ2FtbWEgKi8KKyAgIGNvbG9yc3BhY2UtPmdhbW1hID0gUE5HX0dBTU1BX3NSR0JfSU5WRVJTRTsKKyAgIGNvbG9yc3BhY2UtPmZsYWdzIHw9IFBOR19DT0xPUlNQQUNFX0hBVkVfR0FNTUE7CisKKyAgIC8qIEZpbmFsbHkgcmVjb3JkIHRoYXQgd2UgaGF2ZSBhbiBzUkdCIHByb2ZpbGUgKi8KKyAgIGNvbG9yc3BhY2UtPmZsYWdzIHw9CisgICAgICAoUE5HX0NPTE9SU1BBQ0VfTUFUQ0hFU19zUkdCfFBOR19DT0xPUlNQQUNFX0ZST01fc1JHQik7CisKKyAgIHJldHVybiAxOyAvKiBzZXQgKi8KK30KKyNlbmRpZiAvKiBzUkdCICovCisKKyNpZmRlZiBQTkdfaUNDUF9TVVBQT1JURUQKKy8qIEVuY29kZWQgdmFsdWUgb2YgRDUwIGFzIGFuIElDQyBYWVpOdW1iZXIuICBGcm9tIHRoZSBJQ0MgMjAxMCBzcGVjIHRoZSB2YWx1ZQorICogaXMgWFlaKDAuOTY0MiwxLjAsMC44MjQ5KSwgd2hpY2ggc2NhbGVzIHRvOgorICoKKyAqICAgICg2MzE4OS44MTEyLCA2NTUzNiwgNTQwNjAuNjQ2NCkKKyAqLworc3RhdGljIGNvbnN0IHBuZ19ieXRlIEQ1MF9uQ0lFWFlaWzEyXSA9CisgICB7IDB4MDAsIDB4MDAsIDB4ZjYsIDB4ZDYsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZDMsIDB4MmQgfTsKKworaW50IC8qIFBSSVZBVEUgKi8KK3BuZ19pY2NfY2hlY2tfbGVuZ3RoKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29sb3JzcGFjZXJwIGNvbG9yc3BhY2UsCisgICBwbmdfY29uc3RfY2hhcnAgbmFtZSwgcG5nX3VpbnRfMzIgcHJvZmlsZV9sZW5ndGgpCit7CisgICBpZiAocHJvZmlsZV9sZW5ndGggPCAxMzIpCisgICAgICByZXR1cm4gcG5nX2ljY19wcm9maWxlX2Vycm9yKHBuZ19wdHIsIGNvbG9yc3BhY2UsIG5hbWUsIHByb2ZpbGVfbGVuZ3RoLAorICAgICAgICAgInRvbyBzaG9ydCIpOworCisgICByZXR1cm4gMTsKK30KKworaW50IC8qIFBSSVZBVEUgKi8KK3BuZ19pY2NfY2hlY2tfaGVhZGVyKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29sb3JzcGFjZXJwIGNvbG9yc3BhY2UsCisgICBwbmdfY29uc3RfY2hhcnAgbmFtZSwgcG5nX3VpbnRfMzIgcHJvZmlsZV9sZW5ndGgsCisgICBwbmdfY29uc3RfYnl0ZXAgcHJvZmlsZS8qIGZpcnN0IDEzMiBieXRlcyBvbmx5ICovLCBpbnQgY29sb3JfdHlwZSkKK3sKKyAgIHBuZ191aW50XzMyIHRlbXA7CisKKyAgIC8qIExlbmd0aCBjaGVjazsgdGhpcyBjYW5ub3QgYmUgaWdub3JlZCBpbiB0aGlzIGNvZGUgYmVjYXVzZSBwcm9maWxlX2xlbmd0aAorICAgICogaXMgdXNlZCBsYXRlciB0byBjaGVjayB0aGUgdGFnIHRhYmxlLCBzbyBldmVuIGlmIHRoZSBwcm9maWxlIHNlZW1zIG92ZXIKKyAgICAqIGxvbmcgcHJvZmlsZV9sZW5ndGggZnJvbSB0aGUgY2FsbGVyIG11c3QgYmUgY29ycmVjdC4gIFRoZSBjYWxsZXIgY2FuIGZpeAorICAgICogdGhpcyB1cCBvbiByZWFkIG9yIHdyaXRlIGJ5IGp1c3QgcGFzc2luZyBpbiB0aGUgcHJvZmlsZSBoZWFkZXIgbGVuZ3RoLgorICAgICovCisgICB0ZW1wID0gcG5nX2dldF91aW50XzMyKHByb2ZpbGUpOworICAgaWYgKHRlbXAgIT0gcHJvZmlsZV9sZW5ndGgpCisgICAgICByZXR1cm4gcG5nX2ljY19wcm9maWxlX2Vycm9yKHBuZ19wdHIsIGNvbG9yc3BhY2UsIG5hbWUsIHRlbXAsCisgICAgICAgICAibGVuZ3RoIGRvZXMgbm90IG1hdGNoIHByb2ZpbGUiKTsKKworICAgdGVtcCA9IChwbmdfdWludF8zMikgKCoocHJvZmlsZSs4KSk7CisgICBpZiAodGVtcCA+IDMgJiYgKHByb2ZpbGVfbGVuZ3RoICYgMykpCisgICAgICByZXR1cm4gcG5nX2ljY19wcm9maWxlX2Vycm9yKHBuZ19wdHIsIGNvbG9yc3BhY2UsIG5hbWUsIHByb2ZpbGVfbGVuZ3RoLAorICAgICAgICAgImludmFsaWQgbGVuZ3RoIik7CisKKyAgIHRlbXAgPSBwbmdfZ2V0X3VpbnRfMzIocHJvZmlsZSsxMjgpOyAvKiB0YWcgY291bnQ6IDEyIGJ5dGVzL3RhZyAqLworICAgaWYgKHRlbXAgPiAzNTc5MTM5MzAgfHwgLyogKDJeMzItNC0xMzIpLzEyOiBtYXhpbXVtIHBvc3NpYmxlIHRhZyBjb3VudCAqLworICAgICAgcHJvZmlsZV9sZW5ndGggPCAxMzIrMTIqdGVtcCkgLyogdHJ1bmNhdGVkIHRhZyB0YWJsZSAqLworICAgICAgcmV0dXJuIHBuZ19pY2NfcHJvZmlsZV9lcnJvcihwbmdfcHRyLCBjb2xvcnNwYWNlLCBuYW1lLCB0ZW1wLAorICAgICAgICAgInRhZyBjb3VudCB0b28gbGFyZ2UiKTsKKworICAgLyogVGhlICdpbnRlbnQnIG11c3QgYmUgdmFsaWQgb3Igd2UgY2FuJ3Qgc3RvcmUgaXQsIElDQyBsaW1pdHMgdGhlIGludGVudCB0bworICAgICogMTYgYml0cy4KKyAgICAqLworICAgdGVtcCA9IHBuZ19nZXRfdWludF8zMihwcm9maWxlKzY0KTsKKyAgIGlmICh0ZW1wID49IDB4ZmZmZikgLyogVGhlIElDQyBsaW1pdCAqLworICAgICAgcmV0dXJuIHBuZ19pY2NfcHJvZmlsZV9lcnJvcihwbmdfcHRyLCBjb2xvcnNwYWNlLCBuYW1lLCB0ZW1wLAorICAgICAgICAgImludmFsaWQgcmVuZGVyaW5nIGludGVudCIpOworCisgICAvKiBUaGlzIGlzIGp1c3QgYSB3YXJuaW5nIGJlY2F1c2UgdGhlIHByb2ZpbGUgbWF5IGJlIHZhbGlkIGluIGZ1dHVyZQorICAgICogdmVyc2lvbnMuCisgICAgKi8KKyAgIGlmICh0ZW1wID49IFBOR19zUkdCX0lOVEVOVF9MQVNUKQorICAgICAgKHZvaWQpcG5nX2ljY19wcm9maWxlX2Vycm9yKHBuZ19wdHIsIE5VTEwsIG5hbWUsIHRlbXAsCisgICAgICAgICAiaW50ZW50IG91dHNpZGUgZGVmaW5lZCByYW5nZSIpOworCisgICAvKiBBdCB0aGlzIHBvaW50IHRoZSB0YWcgdGFibGUgY2FuJ3QgYmUgY2hlY2tlZCBiZWNhdXNlIGl0IGhhc24ndCBuZWNlc3NhcmlseQorICAgICogYmVlbiBsb2FkZWQ7IGhvd2V2ZXIsIHZhcmlvdXMgaGVhZGVyIGZpZWxkcyBjYW4gYmUgY2hlY2tlZC4gIFRoZXNlIGNoZWNrcworICAgICogYXJlIGZvciB2YWx1ZXMgcGVybWl0dGVkIGJ5IHRoZSBQTkcgc3BlYyBpbiBhbiBJQ0MgcHJvZmlsZTsgdGhlIFBORyBzcGVjCisgICAgKiByZXN0cmljdHMgdGhlIHByb2ZpbGVzIHRoYXQgY2FuIGJlIHBhc3NlZCBpbiBhbiBpQ0NQIGNodW5rICh0aGV5IG11c3QgYmUKKyAgICAqIGFwcHJvcHJpYXRlIHRvIHByb2Nlc3NpbmcgUE5HIGRhdGEhKQorICAgICovCisKKyAgIC8qIERhdGEgY2hlY2tzIChjb3VsZCBiZSBza2lwcGVkKS4gIFRoZXNlIGNoZWNrcyBtdXN0IGJlIGluZGVwZW5kZW50IG9mIHRoZQorICAgICogdmVyc2lvbiBudW1iZXI7IGhvd2V2ZXIsIHRoZSB2ZXJzaW9uIG51bWJlciBkb2Vzbid0IGFjY29tb2RhdGUgY2hhbmdlcyBpbgorICAgICogdGhlIGhlYWRlciBmaWVsZHMgKGp1c3QgdGhlIGtub3duIHRhZ3MgYW5kIHRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUKKyAgICAqIGRhdGEuKQorICAgICovCisgICB0ZW1wID0gcG5nX2dldF91aW50XzMyKHByb2ZpbGUrMzYpOyAvKiBzaWduYXR1cmUgJ2FzY3AnICovCisgICBpZiAodGVtcCAhPSAweDYxNjM3MzcwKQorICAgICAgcmV0dXJuIHBuZ19pY2NfcHJvZmlsZV9lcnJvcihwbmdfcHRyLCBjb2xvcnNwYWNlLCBuYW1lLCB0ZW1wLAorICAgICAgICAgImludmFsaWQgc2lnbmF0dXJlIik7CisKKyAgIC8qIEN1cnJlbnRseSB0aGUgUENTIGlsbHVtaW5hbnQvYWRvcHRlZCB3aGl0ZSBwb2ludCAodGhlIGNvbXB1dGF0aW9uYWwKKyAgICAqIHdoaXRlIHBvaW50KSBhcmUgcmVxdWlyZWQgdG8gYmUgRDUwLAorICAgICogaG93ZXZlciB0aGUgcHJvZmlsZSBjb250YWlucyBhIHJlY29yZCBvZiB0aGUgaWxsdW1pbmFudCBzbyBwZXJoYXBzIElDQworICAgICogZXhwZWN0cyB0byBiZSBhYmxlIHRvIGNoYW5nZSB0aGlzIGluIHRoZSBmdXR1cmUgKGRlc3BpdGUgdGhlIHJhdGlvbmFsZSBpbgorICAgICogdGhlIGludHJvZHVjdGlvbiBmb3IgdXNpbmcgYSBmaXhlZCBQQ1MgYWRvcHRlZCB3aGl0ZS4pICBDb25zZXF1ZW50bHkgdGhlCisgICAgKiBmb2xsb3dpbmcgaXMganVzdCBhIHdhcm5pbmcuCisgICAgKi8KKyAgIGlmIChtZW1jbXAocHJvZmlsZSs2OCwgRDUwX25DSUVYWVosIDEyKSAhPSAwKQorICAgICAgKHZvaWQpcG5nX2ljY19wcm9maWxlX2Vycm9yKHBuZ19wdHIsIE5VTEwsIG5hbWUsIDAvKm5vIHRhZyB2YWx1ZSovLAorICAgICAgICAgIlBDUyBpbGx1bWluYW50IGlzIG5vdCBENTAiKTsKKworICAgLyogVGhlIFBORyBzcGVjIHJlcXVpcmVzIHRoaXM6CisgICAgKiAiSWYgdGhlIGlDQ1AgY2h1bmsgaXMgcHJlc2VudCwgdGhlIGltYWdlIHNhbXBsZXMgY29uZm9ybSB0byB0aGUgY29sb3VyCisgICAgKiBzcGFjZSByZXByZXNlbnRlZCBieSB0aGUgZW1iZWRkZWQgSUNDIHByb2ZpbGUgYXMgZGVmaW5lZCBieSB0aGUKKyAgICAqIEludGVybmF0aW9uYWwgQ29sb3IgQ29uc29ydGl1bSBbSUNDXS4gVGhlIGNvbG91ciBzcGFjZSBvZiB0aGUgSUNDIHByb2ZpbGUKKyAgICAqIHNoYWxsIGJlIGFuIFJHQiBjb2xvdXIgc3BhY2UgZm9yIGNvbG91ciBpbWFnZXMgKFBORyBjb2xvdXIgdHlwZXMgMiwgMywgYW5kCisgICAgKiA2KSwgb3IgYSBncmV5c2NhbGUgY29sb3VyIHNwYWNlIGZvciBncmV5c2NhbGUgaW1hZ2VzIChQTkcgY29sb3VyIHR5cGVzIDAKKyAgICAqIGFuZCA0KS4iCisgICAgKgorICAgICogVGhpcyBjaGVja2luZyBjb2RlIGVuc3VyZXMgdGhlIGVtYmVkZGVkIHByb2ZpbGUgKG9uIGVpdGhlciByZWFkIG9yIHdyaXRlKQorICAgICogY29uZm9ybXMgdG8gdGhlIHNwZWNpZmljYXRpb24gcmVxdWlyZW1lbnRzLiAgTm90aWNlIHRoYXQgYW4gSUNDICdncmF5JworICAgICogY29sb3Itc3BhY2UgcHJvZmlsZSBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gdG8gdHJhbnNmb3JtIHRoZSBtb25vY2hyb21lCisgICAgKiBkYXRhIHRvIFhZWiBvciBMKmEqYiAoYWNjb3JkaW5nIHRvIHdoaWNoIFBDUyB0aGUgcHJvZmlsZSB1c2VzKSBhbmQgdGhpcworICAgICogc2hvdWxkIGJlIHVzZWQgaW4gcHJlZmVyZW5jZSB0byB0aGUgc3RhbmRhcmQgbGlicG5nIEsgY2hhbm5lbCByZXBsaWNhdGlvbgorICAgICogaW50byBSLCBHIGFuZCBCIGNoYW5uZWxzLgorICAgICoKKyAgICAqIFByZXZpb3VzbHkgaXQgd2FzIHN1Z2dlc3RlZCB0aGF0IGFuIFJHQiBwcm9maWxlIG9uIGdyYXlzY2FsZSBkYXRhIGNvdWxkIGJlCisgICAgKiBoYW5kbGVkLiAgSG93ZXZlciBpdCBpdCBpcyBjbGVhciB0aGF0IHVzaW5nIGFuIFJHQiBwcm9maWxlIGluIHRoaXMgY29udGV4dAorICAgICogbXVzdCBiZSBhbiBlcnJvciAtIHRoZXJlIGlzIG5vIHNwZWNpZmljYXRpb24gb2Ygd2hhdCBpdCBtZWFucy4gIFRodXMgaXQgaXMKKyAgICAqIGFsbW9zdCBjZXJ0YWlubHkgbW9yZSBjb3JyZWN0IHRvIGlnbm9yZSB0aGUgcHJvZmlsZS4KKyAgICAqLworICAgdGVtcCA9IHBuZ19nZXRfdWludF8zMihwcm9maWxlKzE2KTsgLyogZGF0YSBjb2xvdXIgc3BhY2UgZmllbGQgKi8KKyAgIHN3aXRjaCAodGVtcCkKKyAgIHsKKyAgICAgIGNhc2UgMHg1MjQ3NDIyMDogLyogJ1JHQiAnICovCisgICAgICAgICBpZiAoKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBwbmdfaWNjX3Byb2ZpbGVfZXJyb3IocG5nX3B0ciwgY29sb3JzcGFjZSwgbmFtZSwgdGVtcCwKKyAgICAgICAgICAgICAgICJSR0IgY29sb3Igc3BhY2Ugbm90IHBlcm1pdHRlZCBvbiBncmF5c2NhbGUgUE5HIik7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAweDQ3NTI0MTU5OiAvKiAnR1JBWScgKi8KKyAgICAgICAgIGlmICgoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIHBuZ19pY2NfcHJvZmlsZV9lcnJvcihwbmdfcHRyLCBjb2xvcnNwYWNlLCBuYW1lLCB0ZW1wLAorICAgICAgICAgICAgICAgIkdyYXkgY29sb3Igc3BhY2Ugbm90IHBlcm1pdHRlZCBvbiBSR0IgUE5HIik7CisgICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHJldHVybiBwbmdfaWNjX3Byb2ZpbGVfZXJyb3IocG5nX3B0ciwgY29sb3JzcGFjZSwgbmFtZSwgdGVtcCwKKyAgICAgICAgICAgICJpbnZhbGlkIElDQyBwcm9maWxlIGNvbG9yIHNwYWNlIik7CisgICB9CisKKyAgIC8qIEl0IGlzIHVwIHRvIHRoZSBhcHBsaWNhdGlvbiB0byBjaGVjayB0aGF0IHRoZSBwcm9maWxlIGNsYXNzIG1hdGNoZXMgdGhlCisgICAgKiBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHM7IHRoZSBzcGVjIHByb3ZpZGVzIG5vIGd1aWRhbmNlLCBidXQgaXQncyBwcmV0dHkKKyAgICAqIHdlaXJkIGlmIHRoZSBwcm9maWxlIGlzIG5vdCBzY2FubmVyICgnc2NucicpLCBtb25pdG9yICgnbW50cicpLCBwcmludGVyCisgICAgKiAoJ3BydHInKSBvciAnc3BhYycgKGZvciBnZW5lcmljIGNvbG9yIHNwYWNlcykuICBJc3N1ZSBhIHdhcm5pbmcgaW4gdGhlc2UKKyAgICAqIGNhc2VzLiAgSXNzdWUgYW4gZXJyb3IgZm9yIGRldmljZSBsaW5rIG9yIGFic3RyYWN0IHByb2ZpbGVzIC0gdGhlc2UgZG9uJ3QKKyAgICAqIGNvbnRhaW4gdGhlIHJlY29yZHMgbmVjZXNzYXJ5IHRvIHRyYW5zZm9ybSB0aGUgY29sb3Itc3BhY2UgdG8gYW55dGhpbmcKKyAgICAqIG90aGVyIHRoYW4gdGhlIHRhcmdldCBkZXZpY2UgKGFuZCBub3QgZXZlbiB0aGF0IGZvciBhbiBhYnN0cmFjdCBwcm9maWxlKS4KKyAgICAqIFByb2ZpbGVzIG9mIHRoZXNlIGNsYXNzZXMgbWF5IG5vdCBiZSBlbWJlZGRlZCBpbiBpbWFnZXMuCisgICAgKi8KKyAgIHRlbXAgPSBwbmdfZ2V0X3VpbnRfMzIocHJvZmlsZSsxMik7IC8qIHByb2ZpbGUvZGV2aWNlIGNsYXNzICovCisgICBzd2l0Y2ggKHRlbXApCisgICB7CisgICAgICBjYXNlIDB4NzM2MzZlNzI6IC8qICdzY25yJyAqLworICAgICAgY2FzZSAweDZkNmU3NDcyOiAvKiAnbW50cicgKi8KKyAgICAgIGNhc2UgMHg3MDcyNzQ3MjogLyogJ3BydHInICovCisgICAgICBjYXNlIDB4NzM3MDYxNjM6IC8qICdzcGFjJyAqLworICAgICAgICAgLyogQWxsIHN1cHBvcnRlZCAqLworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMHg2MTYyNzM3NDogLyogJ2Fic3QnICovCisgICAgICAgICAvKiBNYXkgbm90IGJlIGVtYmVkZGVkIGluIGFuIGltYWdlICovCisgICAgICAgICByZXR1cm4gcG5nX2ljY19wcm9maWxlX2Vycm9yKHBuZ19wdHIsIGNvbG9yc3BhY2UsIG5hbWUsIHRlbXAsCisgICAgICAgICAgICAiaW52YWxpZCBlbWJlZGRlZCBBYnN0cmFjdCBJQ0MgcHJvZmlsZSIpOworCisgICAgICBjYXNlIDB4NmM2OTZlNmI6IC8qICdsaW5rJyAqLworICAgICAgICAgLyogRGV2aWNlTGluayBwcm9maWxlcyBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgaW4gYSBub24tZGV2aWNlIHNwZWNpZmljCisgICAgICAgICAgKiBmYXNoaW9uLCBpZiBhbiBhcHAgdXNlcyB0aGUgQVRvQjBUYWcgaW4gdGhlIHByb2ZpbGUgdGhlIHJlc3VsdHMgYXJlCisgICAgICAgICAgKiB1bmRlZmluZWQgdW5sZXNzIHRoZSByZXN1bHQgaXMgc2VudCB0byB0aGUgaW50ZW5kZWQgZGV2aWNlLAorICAgICAgICAgICogdGhlcmVmb3JlIGEgRGV2aWNlTGluayBwcm9maWxlIHNob3VsZCBub3QgYmUgZm91bmQgZW1iZWRkZWQgaW4gYQorICAgICAgICAgICogUE5HLgorICAgICAgICAgICovCisgICAgICAgICByZXR1cm4gcG5nX2ljY19wcm9maWxlX2Vycm9yKHBuZ19wdHIsIGNvbG9yc3BhY2UsIG5hbWUsIHRlbXAsCisgICAgICAgICAgICAidW5leHBlY3RlZCBEZXZpY2VMaW5rIElDQyBwcm9maWxlIGNsYXNzIik7CisKKyAgICAgIGNhc2UgMHg2ZTZkNjM2YzogLyogJ25tY2wnICovCisgICAgICAgICAvKiBBIE5hbWVkQ29sb3IgcHJvZmlsZSBpcyBhbHNvIGRldmljZSBzcGVjaWZpYywgaG93ZXZlciBpdCBkb2Vzbid0CisgICAgICAgICAgKiBjb250YWluIGFuIEFUb0IwIHRhZyB0aGF0IGlzIG9wZW4gdG8gbWlzaW50ZXJwcmV0YXRpb24uICBBbG1vc3QKKyAgICAgICAgICAqIGNlcnRhaW5seSBpdCB3aWxsIGZhaWwgdGhlIHRlc3RzIGJlbG93LgorICAgICAgICAgICovCisgICAgICAgICAodm9pZClwbmdfaWNjX3Byb2ZpbGVfZXJyb3IocG5nX3B0ciwgTlVMTCwgbmFtZSwgdGVtcCwKKyAgICAgICAgICAgICJ1bmV4cGVjdGVkIE5hbWVkQ29sb3IgSUNDIHByb2ZpbGUgY2xhc3MiKTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAgLyogVG8gYWxsb3cgZm9yIGZ1dHVyZSBlbmhhbmNlbWVudHMgdG8gdGhlIHByb2ZpbGUgYWNjZXB0IHVucmVjb2duaXplZAorICAgICAgICAgICogcHJvZmlsZSBjbGFzc2VzIHdpdGggYSB3YXJuaW5nLCB0aGVzZSB0aGVuIGhpdCB0aGUgdGVzdCBiZWxvdyBvbiB0aGUKKyAgICAgICAgICAqIHRhZyBjb250ZW50IHRvIGVuc3VyZSB0aGV5IGFyZSBiYWNrd2FyZCBjb21wYXRpYmxlIHdpdGggb25lIG9mIHRoZQorICAgICAgICAgICogdW5kZXJzdG9vZCBwcm9maWxlcy4KKyAgICAgICAgICAqLworICAgICAgICAgKHZvaWQpcG5nX2ljY19wcm9maWxlX2Vycm9yKHBuZ19wdHIsIE5VTEwsIG5hbWUsIHRlbXAsCisgICAgICAgICAgICAidW5yZWNvZ25pemVkIElDQyBwcm9maWxlIGNsYXNzIik7CisgICAgICAgICBicmVhazsKKyAgIH0KKworICAgLyogRm9yIGFueSBwcm9maWxlIG90aGVyIHRoYW4gYSBkZXZpY2UgbGluayBvbmUgdGhlIFBDUyBtdXN0IGJlIGVuY29kZWQKKyAgICAqIGVpdGhlciBpbiBYWVogb3IgTGFiLgorICAgICovCisgICB0ZW1wID0gcG5nX2dldF91aW50XzMyKHByb2ZpbGUrMjApOworICAgc3dpdGNoICh0ZW1wKQorICAgeworICAgICAgY2FzZSAweDU4NTk1YTIwOiAvKiAnWFlaICcgKi8KKyAgICAgIGNhc2UgMHg0YzYxNjIyMDogLyogJ0xhYiAnICovCisgICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHJldHVybiBwbmdfaWNjX3Byb2ZpbGVfZXJyb3IocG5nX3B0ciwgY29sb3JzcGFjZSwgbmFtZSwgdGVtcCwKKyAgICAgICAgICAgICJ1bmV4cGVjdGVkIElDQyBQQ1MgZW5jb2RpbmciKTsKKyAgIH0KKworICAgcmV0dXJuIDE7Cit9CisKK2ludCAvKiBQUklWQVRFICovCitwbmdfaWNjX2NoZWNrX3RhZ190YWJsZShwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLAorICAgcG5nX2NvbnN0X2NoYXJwIG5hbWUsIHBuZ191aW50XzMyIHByb2ZpbGVfbGVuZ3RoLAorICAgcG5nX2NvbnN0X2J5dGVwIHByb2ZpbGUgLyogaGVhZGVyIHBsdXMgd2hvbGUgdGFnIHRhYmxlICovKQoreworICAgcG5nX3VpbnRfMzIgdGFnX2NvdW50ID0gcG5nX2dldF91aW50XzMyKHByb2ZpbGUrMTI4KTsKKyAgIHBuZ191aW50XzMyIGl0YWc7CisgICBwbmdfY29uc3RfYnl0ZXAgdGFnID0gcHJvZmlsZSsxMzI7IC8qIFRoZSBmaXJzdCB0YWcgKi8KKworICAgLyogRmlyc3Qgc2NhbiBhbGwgdGhlIHRhZ3MgaW4gdGhlIHRhYmxlIGFuZCBhZGQgYml0cyB0byB0aGUgaWNjX2luZm8gdmFsdWUKKyAgICAqICh0ZW1wb3JhcmlseSBpbiAndGFncycpLgorICAgICovCisgICBmb3IgKGl0YWc9MDsgaXRhZyA8IHRhZ19jb3VudDsgKytpdGFnLCB0YWcgKz0gMTIpCisgICB7CisgICAgICBwbmdfdWludF8zMiB0YWdfaWQgPSBwbmdfZ2V0X3VpbnRfMzIodGFnKzApOworICAgICAgcG5nX3VpbnRfMzIgdGFnX3N0YXJ0ID0gcG5nX2dldF91aW50XzMyKHRhZys0KTsgLyogbXVzdCBiZSBhbGlnbmVkICovCisgICAgICBwbmdfdWludF8zMiB0YWdfbGVuZ3RoID0gcG5nX2dldF91aW50XzMyKHRhZys4KTsvKiBub3QgcGFkZGVkICovCisKKyAgICAgIC8qIFRoZSBJQ0Mgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBleGNsdWRlIHplcm8gbGVuZ3RoIHRhZ3MsIHRoZXJlZm9yZSB0aGUKKyAgICAgICAqIHN0YXJ0IG1pZ2h0IGFjdHVhbGx5IGJlIGFueXdoZXJlIGlmIHRoZXJlIGlzIG5vIGRhdGEsIGJ1dCB0aGlzIHdvdWxkIGJlCisgICAgICAgKiBhIGNsZWFyIGFidXNlIG9mIHRoZSBpbnRlbnQgb2YgdGhlIHN0YW5kYXJkIHNvIHRoZSBzdGFydCBpcyBjaGVja2VkIGZvcgorICAgICAgICogYmVpbmcgaW4gcmFuZ2UuICBBbGwgZGVmaW5lZCB0YWcgdHlwZXMgaGF2ZSBhbiA4IGJ5dGUgaGVhZGVyIC0gYSA0IGJ5dGUKKyAgICAgICAqIHR5cGUgc2lnbmF0dXJlIHRoZW4gMC4KKyAgICAgICAqLworICAgICAgaWYgKCh0YWdfc3RhcnQgJiAzKSAhPSAwKQorICAgICAgeworICAgICAgICAgLyogQ05IUDczMFMuaWNjIHNoaXBwZWQgd2l0aCBNaWNyb3NvZnQgV2luZG93cyA2NCB2aW9sYXRlcyB0aGlzLCBpdCBpcworICAgICAgICAgICogb25seSBhIHdhcm5pbmcgaGVyZSBiZWNhdXNlIGxpYnBuZyBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZQorICAgICAgICAgICogYWxpZ25tZW50LgorICAgICAgICAgICovCisgICAgICAgICAodm9pZClwbmdfaWNjX3Byb2ZpbGVfZXJyb3IocG5nX3B0ciwgTlVMTCwgbmFtZSwgdGFnX2lkLAorICAgICAgICAgICAgIklDQyBwcm9maWxlIHRhZyBzdGFydCBub3QgYSBtdWx0aXBsZSBvZiA0Iik7CisgICAgICB9CisKKyAgICAgIC8qIFRoaXMgaXMgYSBoYXJkIGVycm9yOyBwb3RlbnRpYWxseSBpdCBjYW4gY2F1c2UgcmVhZCBvdXRzaWRlIHRoZQorICAgICAgICogcHJvZmlsZS4KKyAgICAgICAqLworICAgICAgaWYgKHRhZ19zdGFydCA+IHByb2ZpbGVfbGVuZ3RoIHx8IHRhZ19sZW5ndGggPiBwcm9maWxlX2xlbmd0aCAtIHRhZ19zdGFydCkKKyAgICAgICAgIHJldHVybiBwbmdfaWNjX3Byb2ZpbGVfZXJyb3IocG5nX3B0ciwgY29sb3JzcGFjZSwgbmFtZSwgdGFnX2lkLAorICAgICAgICAgICAgIklDQyBwcm9maWxlIHRhZyBvdXRzaWRlIHByb2ZpbGUiKTsKKyAgIH0KKworICAgcmV0dXJuIDE7IC8qIHN1Y2Nlc3MsIG1heWJlIHdpdGggd2FybmluZ3MgKi8KK30KKworI2lmZGVmIFBOR19zUkdCX1NVUFBPUlRFRAorI2lmIFBOR19zUkdCX1BST0ZJTEVfQ0hFQ0tTID49IDAKKy8qIEluZm9ybWF0aW9uIGFib3V0IHRoZSBrbm93biBJQ0Mgc1JHQiBwcm9maWxlcyAqLworc3RhdGljIGNvbnN0IHN0cnVjdAoreworICAgcG5nX3VpbnRfMzIgYWRsZXIsIGNyYywgbGVuZ3RoOworICAgcG5nX3VpbnRfMzIgbWQ1WzRdOworICAgcG5nX2J5dGUgICAgaGF2ZV9tZDU7CisgICBwbmdfYnl0ZSAgICBpc19icm9rZW47CisgICBwbmdfdWludF8xNiBpbnRlbnQ7CisKKyMgIGRlZmluZSBQTkdfTUQ1KGEsYixjLGQpIHsgYSwgYiwgYywgZCB9LCAoYSE9MCl8fChiIT0wKXx8KGMhPTApfHwoZCE9MCkKKyMgIGRlZmluZSBQTkdfSUNDX0NIRUNLU1VNKGFkbGVyLCBjcmMsIG1kNSwgaW50ZW50LCBicm9rZSwgZGF0ZSwgbGVuZ3RoLCBmbmFtZSlcCisgICAgICB7IGFkbGVyLCBjcmMsIGxlbmd0aCwgbWQ1LCBicm9rZSwgaW50ZW50IH0sCisKK30gcG5nX3NSR0JfY2hlY2tzW10gPQoreworICAgLyogVGhpcyBkYXRhIGNvbWVzIGZyb20gY29udHJpYi90b29scy9jaGVja3N1bS1pY2MgcnVuIG9uIGRvd25sb2FkcyBvZgorICAgICogYWxsIGZvdXIgSUNDIHNSR0IgcHJvZmlsZXMgZnJvbSB3d3cuY29sb3Iub3JnLgorICAgICovCisgICAvKiBhZGxlcjMyLCBjcmMzMiwgTUQ1WzRdLCBpbnRlbnQsIGRhdGUsIGxlbmd0aCwgZmlsZS1uYW1lICovCisgICBQTkdfSUNDX0NIRUNLU1VNKDB4MGEzZmQ5ZjYsIDB4M2I4NzcyYjksCisgICAgICBQTkdfTUQ1KDB4MjlmODNkZGUsIDB4YWZmMjU1YWUsIDB4Nzg0MmZhZTQsIDB4Y2E4MzM5MGQpLCAwLCAwLAorICAgICAgIjIwMDkvMDMvMjcgMjE6MzY6MzEiLCAzMDQ4LCAic1JHQl9JRUM2MTk2Ni0yLTFfYmxhY2tfc2NhbGVkLmljYyIpCisKKyAgIC8qIElDQyBzUkdCIHYyIHBlcmNlcHR1YWwgbm8gYmxhY2stY29tcGVuc2F0aW9uOiAqLworICAgUE5HX0lDQ19DSEVDS1NVTSgweDQ5MDllNWUxLCAweDQyN2ViYjIxLAorICAgICAgUE5HX01ENSgweGM5NWJkNjM3LCAweGU5NWQ4YTNiLCAweDBkZjM4Zjk5LCAweGMxMzIwMzg5KSwgMSwgMCwKKyAgICAgICIyMDA5LzAzLzI3IDIxOjM3OjQ1IiwgMzA1MiwgInNSR0JfSUVDNjE5NjYtMi0xX25vX2JsYWNrX3NjYWxpbmcuaWNjIikKKworICAgUE5HX0lDQ19DSEVDS1NVTSgweGZkMjE0NGExLCAweDMwNmZkOGFlLAorICAgICAgUE5HX01ENSgweGZjNjYzMzc4LCAweDM3ZTI4ODZiLCAweGZkNzJlOTgzLCAweDgyMjhmMWI4KSwgMCwgMCwKKyAgICAgICIyMDA5LzA4LzEwIDE3OjI4OjAxIiwgNjA5ODgsICJzUkdCX3Y0X0lDQ19wcmVmZXJlbmNlX2Rpc3BsYXljbGFzcy5pY2MiKQorCisgICAvKiBJQ0Mgc1JHQiB2NCBwZXJjZXB0dWFsICovCisgICBQTkdfSUNDX0NIRUNLU1VNKDB4MjA5YzM1ZDIsIDB4YmJlZjc4MTIsCisgICAgICBQTkdfTUQ1KDB4MzQ1NjJhYmYsIDB4OTk0Y2NkMDYsIDB4NmQyYzU3MjEsIDB4ZDBkNjhjNWQpLCAwLCAwLAorICAgICAgIjIwMDcvMDcvMjUgMDA6MDU6MzciLCA2MDk2MCwgInNSR0JfdjRfSUNDX3ByZWZlcmVuY2UuaWNjIikKKworICAgLyogVGhlIGZvbGxvd2luZyBwcm9maWxlcyBoYXZlIG5vIGtub3duIE1ENSBjaGVja3N1bS4gSWYgdGhlcmUgaXMgYSBtYXRjaAorICAgICogb24gdGhlIChlbXB0eSkgTUQ1IHRoZSBvdGhlciBmaWVsZHMgYXJlIHVzZWQgdG8gYXR0ZW1wdCBhIG1hdGNoIGFuZAorICAgICogYSB3YXJuaW5nIGlzIHByb2R1Y2VkLiAgVGhlIGZpcnN0IHR3byBvZiB0aGVzZSBwcm9maWxlcyBoYXZlIGEgJ2NwcnQnIHRhZworICAgICogd2hpY2ggc3VnZ2VzdHMgdGhhdCB0aGV5IHdlcmUgYWxzbyBtYWRlIGJ5IEhld2xldHQgUGFja2FyZC4KKyAgICAqLworICAgUE5HX0lDQ19DSEVDS1NVTSgweGEwNTRkNzYyLCAweDVkNTEyOWNlLAorICAgICAgUE5HX01ENSgweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwKSwgMSwgMCwKKyAgICAgICIyMDA0LzA3LzIxIDE4OjU3OjQyIiwgMzAyNCwgInNSR0JfSUVDNjE5NjYtMi0xX25vQlBDLmljYyIpCisKKyAgIC8qIFRoaXMgaXMgYSAnbW50cicgKGRpc3BsYXkpIHByb2ZpbGUgd2l0aCBhIG1lZGlhV2hpdGVQb2ludFRhZyB0aGF0IGRvZXMgbm90CisgICAgKiBtYXRjaCB0aGUgRDUwIFBDUyBpbGx1bWluYW50IGluIHRoZSBoZWFkZXIgKGl0IGlzIGluIGZhY3QgdGhlIEQ2NSB2YWx1ZXMsCisgICAgKiBzbyB0aGUgd2hpdGUgcG9pbnQgaXMgcmVjb3JkZWQgYXMgdGhlIHVuLWFkYXB0ZWQgdmFsdWUuKSAgVGhlIHByb2ZpbGVzCisgICAgKiBiZWxvdyBvbmx5IGRpZmZlciBpbiBvbmUgYnl0ZSAtIHRoZSBpbnRlbnQgLSBhbmQgYXJlIGJhc2ljYWxseSB0aGUgc2FtZSBhcworICAgICogdGhlIHByZXZpb3VzIHByb2ZpbGUgZXhjZXB0IGZvciB0aGUgbWVkaWFXaGl0ZVBvaW50VGFnIGVycm9yIGFuZCBhIG1pc3NpbmcKKyAgICAqIGNocm9tYXRpY0FkYXB0YXRpb25UYWcuCisgICAgKi8KKyAgIFBOR19JQ0NfQ0hFQ0tTVU0oMHhmNzg0ZjNmYiwgMHgxODJlYTU1MiwKKyAgICAgIFBOR19NRDUoMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCksIDAsIDEvKmJyb2tlbiovLAorICAgICAgIjE5OTgvMDIvMDkgMDY6NDk6MDAiLCAzMTQ0LCAiSFAtTWljcm9zb2Z0IHNSR0IgdjIgcGVyY2VwdHVhbCIpCisKKyAgIFBOR19JQ0NfQ0hFQ0tTVU0oMHgwMzk4ZjNmYywgMHhmMjllNTI2ZCwKKyAgICAgIFBOR19NRDUoMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCksIDEsIDEvKmJyb2tlbiovLAorICAgICAgIjE5OTgvMDIvMDkgMDY6NDk6MDAiLCAzMTQ0LCAiSFAtTWljcm9zb2Z0IHNSR0IgdjIgbWVkaWEtcmVsYXRpdmUiKQorfTsKKworc3RhdGljIGludAorcG5nX2NvbXBhcmVfSUNDX3Byb2ZpbGVfd2l0aF9zUkdCKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgcG5nX2NvbnN0X2J5dGVwIHByb2ZpbGUsIHVMb25nIGFkbGVyKQoreworICAgLyogVGhlIHF1aWNrIGNoZWNrIGlzIHRvIHZlcmlmeSBqdXN0IHRoZSBNRDUgc2lnbmF0dXJlIGFuZCB0cnVzdCB0aGUKKyAgICAqIHJlc3Qgb2YgdGhlIGRhdGEuICBCZWNhdXNlIHRoZSBwcm9maWxlIGhhcyBhbHJlYWR5IGJlZW4gdmVyaWZpZWQgZm9yCisgICAgKiBjb3JyZWN0bmVzcyB0aGlzIGlzIHNhZmUuICBwbmdfY29sb3JzcGFjZV9zZXRfc1JHQiB3aWxsIGNoZWNrIHRoZSAnaW50ZW50JworICAgICogZmllbGQgdG9vLCBzbyBpZiB0aGUgcHJvZmlsZSBoYXMgYmVlbiBlZGl0ZWQgd2l0aCBhbiBpbnRlbnQgbm90IGRlZmluZWQKKyAgICAqIGJ5IHNSR0IgKGJ1dCBtYXliZSBkZWZpbmVkIGJ5IGEgbGF0ZXIgSUNDIHNwZWNpZmljYXRpb24pIHRoZSByZWFkIG9mCisgICAgKiB0aGUgcHJvZmlsZSB3aWxsIGZhaWwgYXQgdGhhdCBwb2ludC4KKyAgICAqLworCisgICBwbmdfdWludF8zMiBsZW5ndGggPSAwOworICAgcG5nX3VpbnRfMzIgaW50ZW50ID0gMHgxMDAwMDsgLyogaW52YWxpZCAqLworI2lmIFBOR19zUkdCX1BST0ZJTEVfQ0hFQ0tTID4gMQorICAgdUxvbmcgY3JjID0gMDsgLyogdGhlIHZhbHVlIGZvciAwIGxlbmd0aCBkYXRhICovCisjZW5kaWYKKyAgIHVuc2lnbmVkIGludCBpOworCisjaWZkZWYgUE5HX1NFVF9PUFRJT05fU1VQUE9SVEVECisgICAvKiBGaXJzdCBzZWUgaWYgUE5HX1NLSVBfc1JHQl9DSEVDS19QUk9GSUxFIGhhcyBiZWVuIHNldCB0byAib24iICovCisgICBpZiAoKChwbmdfcHRyLT5vcHRpb25zID4+IFBOR19TS0lQX3NSR0JfQ0hFQ0tfUFJPRklMRSkgJiAzKSA9PQorICAgICAgICAgICAgICAgUE5HX09QVElPTl9PTikKKyAgICAgIHJldHVybiAwOworI2VuZGlmCisKKyAgIGZvciAoaT0wOyBpIDwgKHNpemVvZiBwbmdfc1JHQl9jaGVja3MpIC8gKHNpemVvZiBwbmdfc1JHQl9jaGVja3NbMF0pOyArK2kpCisgICB7CisgICAgICBpZiAocG5nX2dldF91aW50XzMyKHByb2ZpbGUrODQpID09IHBuZ19zUkdCX2NoZWNrc1tpXS5tZDVbMF0gJiYKKyAgICAgICAgIHBuZ19nZXRfdWludF8zMihwcm9maWxlKzg4KSA9PSBwbmdfc1JHQl9jaGVja3NbaV0ubWQ1WzFdICYmCisgICAgICAgICBwbmdfZ2V0X3VpbnRfMzIocHJvZmlsZSs5MikgPT0gcG5nX3NSR0JfY2hlY2tzW2ldLm1kNVsyXSAmJgorICAgICAgICAgcG5nX2dldF91aW50XzMyKHByb2ZpbGUrOTYpID09IHBuZ19zUkdCX2NoZWNrc1tpXS5tZDVbM10pCisgICAgICB7CisgICAgICAgICAvKiBUaGlzIG1heSBiZSBvbmUgb2YgdGhlIG9sZCBIUCBwcm9maWxlcyB3aXRob3V0IGFuIE1ENSwgaW4gdGhhdAorICAgICAgICAgICogY2FzZSB3ZSBjYW4gb25seSB1c2UgdGhlIGxlbmd0aCBhbmQgQWRsZXIzMiAobm90ZSB0aGF0IHRoZXNlCisgICAgICAgICAgKiBhcmUgbm90IHVzZWQgYnkgZGVmYXVsdCBpZiB0aGVyZSBpcyBhbiBNRDUhKQorICAgICAgICAgICovCisjICAgICAgICBpZiBQTkdfc1JHQl9QUk9GSUxFX0NIRUNLUyA9PSAwCisgICAgICAgICAgICBpZiAocG5nX3NSR0JfY2hlY2tzW2ldLmhhdmVfbWQ1ICE9IDApCisgICAgICAgICAgICAgICByZXR1cm4gMStwbmdfc1JHQl9jaGVja3NbaV0uaXNfYnJva2VuOworIyAgICAgICAgZW5kaWYKKworICAgICAgICAgLyogUHJvZmlsZSBpcyB1bnNpZ25lZCBvciBtb3JlIGNoZWNrcyBoYXZlIGJlZW4gY29uZmlndXJlZCBpbi4gKi8KKyAgICAgICAgIGlmIChsZW5ndGggPT0gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGxlbmd0aCA9IHBuZ19nZXRfdWludF8zMihwcm9maWxlKTsKKyAgICAgICAgICAgIGludGVudCA9IHBuZ19nZXRfdWludF8zMihwcm9maWxlKzY0KTsKKyAgICAgICAgIH0KKworICAgICAgICAgLyogTGVuZ3RoICphbmQqIGludGVudCBtdXN0IG1hdGNoICovCisgICAgICAgICBpZiAobGVuZ3RoID09IChwbmdfdWludF8zMikgcG5nX3NSR0JfY2hlY2tzW2ldLmxlbmd0aCAmJgorICAgICAgICAgICAgaW50ZW50ID09IChwbmdfdWludF8zMikgcG5nX3NSR0JfY2hlY2tzW2ldLmludGVudCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE5vdyBjYWxjdWxhdGUgdGhlIGFkbGVyMzIgaWYgbm90IGRvbmUgYWxyZWFkeS4gKi8KKyAgICAgICAgICAgIGlmIChhZGxlciA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgYWRsZXIgPSBhZGxlcjMyKDAsIE5VTEwsIDApOworICAgICAgICAgICAgICAgYWRsZXIgPSBhZGxlcjMyKGFkbGVyLCBwcm9maWxlLCBsZW5ndGgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYWRsZXIgPT0gcG5nX3NSR0JfY2hlY2tzW2ldLmFkbGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLyogVGhlc2UgYmFzaWMgY2hlY2tzIHN1Z2dlc3QgdGhhdCB0aGUgZGF0YSBoYXMgbm90IGJlZW4KKyAgICAgICAgICAgICAgICAqIG1vZGlmaWVkLCBidXQgaWYgdGhlIGNoZWNrIGxldmVsIGlzIG1vcmUgdGhhbiAxIHBlcmZvcm0KKyAgICAgICAgICAgICAgICAqIG91ciBvd24gY3JjMzIgY2hlY2tzdW0gb24gdGhlIGRhdGEuCisgICAgICAgICAgICAgICAgKi8KKyMgICAgICAgICAgICAgIGlmIFBOR19zUkdCX1BST0ZJTEVfQ0hFQ0tTID4gMQorICAgICAgICAgICAgICAgICAgaWYgKGNyYyA9PSAwKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgY3JjID0gY3JjMzIoMCwgTlVMTCwgMCk7CisgICAgICAgICAgICAgICAgICAgICBjcmMgPSBjcmMzMihjcmMsIHByb2ZpbGUsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIC8qIFNvIHRoaXMgY2hlY2sgbXVzdCBwYXNzIGZvciB0aGUgJ3JldHVybicgYmVsb3cgdG8gaGFwcGVuLgorICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBpZiAoY3JjID09IHBuZ19zUkdCX2NoZWNrc1tpXS5jcmMpCisjICAgICAgICAgICAgICBlbmRpZgorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKHBuZ19zUkdCX2NoZWNrc1tpXS5pc19icm9rZW4gIT0gMCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIC8qIFRoZXNlIHByb2ZpbGVzIGFyZSBrbm93biB0byBoYXZlIGJhZCBkYXRhIHRoYXQgbWF5IGNhdXNlCisgICAgICAgICAgICAgICAgICAgICAgKiBwcm9ibGVtcyBpZiB0aGV5IGFyZSB1c2VkLCB0aGVyZWZvcmUgYXR0ZW1wdCB0bworICAgICAgICAgICAgICAgICAgICAgICogZGlzY291cmFnZSB0aGVpciB1c2UsIHNraXAgdGhlICdoYXZlX21kNScgd2FybmluZyBiZWxvdywKKyAgICAgICAgICAgICAgICAgICAgICAqIHdoaWNoIGlzIG1hZGUgaXJyZWxldmFudCBieSB0aGlzIGVycm9yLgorICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICBwbmdfY2h1bmtfcmVwb3J0KHBuZ19wdHIsICJrbm93biBpbmNvcnJlY3Qgc1JHQiBwcm9maWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBOR19DSFVOS19FUlJPUik7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIC8qIFdhcm4gdGhhdCB0aGlzIGJlaW5nIGRvbmU7IHRoaXMgaXNuJ3QgZXZlbiBhbiBlcnJvciBzaW5jZQorICAgICAgICAgICAgICAgICAgICogdGhlIHByb2ZpbGUgaXMgcGVyZmVjdGx5IHZhbGlkLCBidXQgaXQgd291bGQgYmUgbmljZSBpZgorICAgICAgICAgICAgICAgICAgICogcGVvcGxlIHVzZWQgdGhlIHVwLXRvLWRhdGUgb25lcy4KKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocG5nX3NSR0JfY2hlY2tzW2ldLmhhdmVfbWQ1ID09IDApCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBwbmdfY2h1bmtfcmVwb3J0KHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAib3V0LW9mLWRhdGUgc1JHQiBwcm9maWxlIHdpdGggbm8gc2lnbmF0dXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBOR19DSFVOS19XQVJOSU5HKTsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgcmV0dXJuIDErcG5nX3NSR0JfY2hlY2tzW2ldLmlzX2Jyb2tlbjsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworIyBpZiBQTkdfc1JHQl9QUk9GSUxFX0NIRUNLUyA+IDAKKyAgICAgICAgIC8qIFRoZSBzaWduYXR1cmUgbWF0Y2hlZCwgYnV0IHRoZSBwcm9maWxlIGhhZCBiZWVuIGNoYW5nZWQgaW4gc29tZQorICAgICAgICAgICogd2F5LiAgVGhpcyBwcm9iYWJseSBpbmRpY2F0ZXMgYSBkYXRhIGVycm9yIG9yIHVuaW5mb3JtZWQgaGFja2luZy4KKyAgICAgICAgICAqIEZhbGwgdGhyb3VnaCB0byAibm8gbWF0Y2giLgorICAgICAgICAgICovCisgICAgICAgICBwbmdfY2h1bmtfcmVwb3J0KHBuZ19wdHIsCisgICAgICAgICAgICAgIk5vdCByZWNvZ25pemluZyBrbm93biBzUkdCIHByb2ZpbGUgdGhhdCBoYXMgYmVlbiBlZGl0ZWQiLAorICAgICAgICAgICAgIFBOR19DSFVOS19XQVJOSU5HKTsKKyAgICAgICAgIGJyZWFrOworIyBlbmRpZgorICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICByZXR1cm4gMDsgLyogbm8gbWF0Y2ggKi8KK30KKyNlbmRpZiAvKiBQTkdfc1JHQl9QUk9GSUxFX0NIRUNLUyA+PSAwICovCisKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2ljY19zZXRfc1JHQihwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgIHBuZ19jb2xvcnNwYWNlcnAgY29sb3JzcGFjZSwgcG5nX2NvbnN0X2J5dGVwIHByb2ZpbGUsIHVMb25nIGFkbGVyKQoreworICAgLyogSXMgdGhpcyBwcm9maWxlIG9uZSBvZiB0aGUga25vd24gSUNDIHNSR0IgcHJvZmlsZXM/ICBJZiBpdCBpcywganVzdCBzZXQKKyAgICAqIHRoZSBzUkdCIGluZm9ybWF0aW9uLgorICAgICovCisjaWYgUE5HX3NSR0JfUFJPRklMRV9DSEVDS1MgPj0gMAorICAgaWYgKHBuZ19jb21wYXJlX0lDQ19wcm9maWxlX3dpdGhfc1JHQihwbmdfcHRyLCBwcm9maWxlLCBhZGxlcikgIT0gMCkKKyNlbmRpZgorICAgICAgKHZvaWQpcG5nX2NvbG9yc3BhY2Vfc2V0X3NSR0IocG5nX3B0ciwgY29sb3JzcGFjZSwKKyAgICAgICAgIChpbnQpLyphbHJlYWR5IGNoZWNrZWQqL3BuZ19nZXRfdWludF8zMihwcm9maWxlKzY0KSk7Cit9CisjZW5kaWYgLyogc1JHQiAqLworCitpbnQgLyogUFJJVkFURSAqLworcG5nX2NvbG9yc3BhY2Vfc2V0X0lDQyhwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLAorICAgcG5nX2NvbnN0X2NoYXJwIG5hbWUsIHBuZ191aW50XzMyIHByb2ZpbGVfbGVuZ3RoLCBwbmdfY29uc3RfYnl0ZXAgcHJvZmlsZSwKKyAgIGludCBjb2xvcl90eXBlKQoreworICAgaWYgKChjb2xvcnNwYWNlLT5mbGFncyAmIFBOR19DT0xPUlNQQUNFX0lOVkFMSUQpICE9IDApCisgICAgICByZXR1cm4gMDsKKworICAgaWYgKHBuZ19pY2NfY2hlY2tfbGVuZ3RoKHBuZ19wdHIsIGNvbG9yc3BhY2UsIG5hbWUsIHByb2ZpbGVfbGVuZ3RoKSAhPSAwICYmCisgICAgICAgcG5nX2ljY19jaGVja19oZWFkZXIocG5nX3B0ciwgY29sb3JzcGFjZSwgbmFtZSwgcHJvZmlsZV9sZW5ndGgsIHByb2ZpbGUsCisgICAgICAgICAgY29sb3JfdHlwZSkgIT0gMCAmJgorICAgICAgIHBuZ19pY2NfY2hlY2tfdGFnX3RhYmxlKHBuZ19wdHIsIGNvbG9yc3BhY2UsIG5hbWUsIHByb2ZpbGVfbGVuZ3RoLAorICAgICAgICAgIHByb2ZpbGUpICE9IDApCisgICB7CisjICAgICBpZmRlZiBQTkdfc1JHQl9TVVBQT1JURUQKKyAgICAgICAgIC8qIElmIG5vIHNSR0Igc3VwcG9ydCwgZG9uJ3QgdHJ5IHN0b3Jpbmcgc1JHQiBpbmZvcm1hdGlvbiAqLworICAgICAgICAgcG5nX2ljY19zZXRfc1JHQihwbmdfcHRyLCBjb2xvcnNwYWNlLCBwcm9maWxlLCAwKTsKKyMgICAgIGVuZGlmCisgICAgICByZXR1cm4gMTsKKyAgIH0KKworICAgLyogRmFpbHVyZSBjYXNlICovCisgICByZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBpQ0NQICovCisKKyNpZmRlZiBQTkdfUkVBRF9SR0JfVE9fR1JBWV9TVVBQT1JURUQKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2NvbG9yc3BhY2Vfc2V0X3JnYl9jb2VmZmljaWVudHMocG5nX3N0cnVjdHJwIHBuZ19wdHIpCit7CisgICAvKiBTZXQgdGhlIHJnYl90b19ncmF5IGNvZWZmaWNpZW50cyBmcm9tIHRoZSBjb2xvcnNwYWNlLiAqLworICAgaWYgKHBuZ19wdHItPnJnYl90b19ncmF5X2NvZWZmaWNpZW50c19zZXQgPT0gMCAmJgorICAgICAgKHBuZ19wdHItPmNvbG9yc3BhY2UuZmxhZ3MgJiBQTkdfQ09MT1JTUEFDRV9IQVZFX0VORFBPSU5UUykgIT0gMCkKKyAgIHsKKyAgICAgIC8qIHBuZ19zZXRfYmFja2dyb3VuZCBoYXMgbm90IGJlZW4gY2FsbGVkLCBnZXQgdGhlIGNvZWZmaWNpZW50cyBmcm9tIHRoZSBZCisgICAgICAgKiB2YWx1ZXMgb2YgdGhlIGNvbG9yc3BhY2UgY29sb3JhbnRzLgorICAgICAgICovCisgICAgICBwbmdfZml4ZWRfcG9pbnQgciA9IHBuZ19wdHItPmNvbG9yc3BhY2UuZW5kX3BvaW50c19YWVoucmVkX1k7CisgICAgICBwbmdfZml4ZWRfcG9pbnQgZyA9IHBuZ19wdHItPmNvbG9yc3BhY2UuZW5kX3BvaW50c19YWVouZ3JlZW5fWTsKKyAgICAgIHBuZ19maXhlZF9wb2ludCBiID0gcG5nX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX1hZWi5ibHVlX1k7CisgICAgICBwbmdfZml4ZWRfcG9pbnQgdG90YWwgPSByK2crYjsKKworICAgICAgaWYgKHRvdGFsID4gMCAmJgorICAgICAgICAgciA+PSAwICYmIHBuZ19tdWxkaXYoJnIsIHIsIDMyNzY4LCB0b3RhbCkgJiYgciA+PSAwICYmIHIgPD0gMzI3NjggJiYKKyAgICAgICAgIGcgPj0gMCAmJiBwbmdfbXVsZGl2KCZnLCBnLCAzMjc2OCwgdG90YWwpICYmIGcgPj0gMCAmJiBnIDw9IDMyNzY4ICYmCisgICAgICAgICBiID49IDAgJiYgcG5nX211bGRpdigmYiwgYiwgMzI3NjgsIHRvdGFsKSAmJiBiID49IDAgJiYgYiA8PSAzMjc2OCAmJgorICAgICAgICAgcitnK2IgPD0gMzI3NjkpCisgICAgICB7CisgICAgICAgICAvKiBXZSBhbGxvdyAwIGNvZWZmaWNpZW50cyBoZXJlLiAgcitnK2IgbWF5IGJlIDMyNzY5IGlmIHR3byBvcgorICAgICAgICAgICogYWxsIG9mIHRoZSBjb2VmZmljaWVudHMgd2VyZSByb3VuZGVkIHVwLiAgSGFuZGxlIHRoaXMgYnkKKyAgICAgICAgICAqIHJlZHVjaW5nIHRoZSAqbGFyZ2VzdCogY29lZmZpY2llbnQgYnkgMTsgdGhpcyBtYXRjaGVzIHRoZQorICAgICAgICAgICogYXBwcm9hY2ggdXNlZCBmb3IgdGhlIGRlZmF1bHQgY29lZmZpY2llbnRzIGluIHBuZ3J0cmFuLmMKKyAgICAgICAgICAqLworICAgICAgICAgaW50IGFkZCA9IDA7CisKKyAgICAgICAgIGlmIChyK2crYiA+IDMyNzY4KQorICAgICAgICAgICAgYWRkID0gLTE7CisgICAgICAgICBlbHNlIGlmIChyK2crYiA8IDMyNzY4KQorICAgICAgICAgICAgYWRkID0gMTsKKworICAgICAgICAgaWYgKGFkZCAhPSAwKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKGcgPj0gciAmJiBnID49IGIpCisgICAgICAgICAgICAgICBnICs9IGFkZDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHIgPj0gZyAmJiByID49IGIpCisgICAgICAgICAgICAgICByICs9IGFkZDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIGIgKz0gYWRkOworICAgICAgICAgfQorCisgICAgICAgICAvKiBDaGVjayBmb3IgYW4gaW50ZXJuYWwgZXJyb3IuICovCisgICAgICAgICBpZiAocitnK2IgIT0gMzI3NjgpCisgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwKKyAgICAgICAgICAgICAgICJpbnRlcm5hbCBlcnJvciBoYW5kbGluZyBjSFJNIGNvZWZmaWNpZW50cyIpOworCisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfcHRyLT5yZ2JfdG9fZ3JheV9yZWRfY29lZmYgICA9IChwbmdfdWludF8xNilyOworICAgICAgICAgICAgcG5nX3B0ci0+cmdiX3RvX2dyYXlfZ3JlZW5fY29lZmYgPSAocG5nX3VpbnRfMTYpZzsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogVGhpcyBpcyBhIHBuZ19lcnJvciBhdCBwcmVzZW50IGV2ZW4gdGhvdWdoIGl0IGNvdWxkIGJlIGlnbm9yZWQgLQorICAgICAgICogaXQgc2hvdWxkIG5ldmVyIGhhcHBlbiwgYnV0IGl0IGlzIGltcG9ydGFudCB0aGF0IGlmIGl0IGRvZXMsIHRoZQorICAgICAgICogYnVnIGlzIGZpeGVkLgorICAgICAgICovCisgICAgICBlbHNlCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImludGVybmFsIGVycm9yIGhhbmRsaW5nIGNIUk0tPlhZWiIpOworICAgfQorfQorI2VuZGlmIC8qIFJFQURfUkdCX1RPX0dSQVkgKi8KKworI2VuZGlmIC8qIENPTE9SU1BBQ0UgKi8KKworI2lmZGVmIF9fR05VQ19fCisvKiBUaGlzIGV4aXN0cyBzb2xlbHkgdG8gd29yayByb3VuZCBhIHdhcm5pbmcgZnJvbSBHTlUgQy4gKi8KK3N0YXRpYyBpbnQgLyogUFJJVkFURSAqLworcG5nX2d0KHNpemVfdCBhLCBzaXplX3QgYikKK3sKKyAgICByZXR1cm4gYSA+IGI7Cit9CisjZWxzZQorIyAgIGRlZmluZSBwbmdfZ3QoYSxiKSAoKGEpID4gKGIpKQorI2VuZGlmCisKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2NoZWNrX0lIRFIocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICBwbmdfdWludF8zMiB3aWR0aCwgcG5nX3VpbnRfMzIgaGVpZ2h0LCBpbnQgYml0X2RlcHRoLAorICAgaW50IGNvbG9yX3R5cGUsIGludCBpbnRlcmxhY2VfdHlwZSwgaW50IGNvbXByZXNzaW9uX3R5cGUsCisgICBpbnQgZmlsdGVyX3R5cGUpCit7CisgICBpbnQgZXJyb3IgPSAwOworCisgICAvKiBDaGVjayBmb3Igd2lkdGggYW5kIGhlaWdodCB2YWxpZCB2YWx1ZXMgKi8KKyAgIGlmICh3aWR0aCA9PSAwKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkltYWdlIHdpZHRoIGlzIHplcm8gaW4gSUhEUiIpOworICAgICAgZXJyb3IgPSAxOworICAgfQorCisgICBpZiAod2lkdGggPiBQTkdfVUlOVF8zMV9NQVgpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBpbWFnZSB3aWR0aCBpbiBJSERSIik7CisgICAgICBlcnJvciA9IDE7CisgICB9CisKKyAgIGlmIChwbmdfZ3QoKCh3aWR0aCArIDcpICYgKH43KSksCisgICAgICAgKChQTkdfU0laRV9NQVgKKyAgICAgICAgICAgLSA0OCAgICAgICAgLyogYmlnX3Jvd19idWYgaGFjayAqLworICAgICAgICAgICAtIDEpICAgICAgICAvKiBmaWx0ZXIgYnl0ZSAqLworICAgICAgICAgICAvIDgpICAgICAgICAvKiA4LWJ5dGUgUkdCQSBwaXhlbHMgKi8KKyAgICAgICAgICAgLSAxKSkgICAgICAgLyogZXh0cmEgbWF4X3BpeGVsX2RlcHRoIHBhZCAqLworICAgeworICAgICAgLyogVGhlIHNpemUgb2YgdGhlIHJvdyBtdXN0IGJlIHdpdGhpbiB0aGUgbGltaXRzIG9mIHRoaXMgYXJjaGl0ZWN0dXJlLgorICAgICAgICogQmVjYXVzZSB0aGUgcmVhZCBjb2RlIGNhbiBwZXJmb3JtIGFyYml0cmFyeSB0cmFuc2Zvcm1hdGlvbnMgdGhlCisgICAgICAgKiBtYXhpbXVtIHNpemUgaXMgY2hlY2tlZCBoZXJlLiAgQmVjYXVzZSB0aGUgY29kZSBpbiBwbmdfcmVhZF9zdGFydF9yb3cKKyAgICAgICAqIGFkZHMgZXh0cmEgc3BhY2UgImZvciBzYWZldHkncyBzYWtlIiBpbiBzZXZlcmFsIHBsYWNlcyBhIGNvbnNlcnZhdGl2ZQorICAgICAgICogbGltaXQgaXMgdXNlZCBoZXJlLgorICAgICAgICoKKyAgICAgICAqIE5PVEU6IGl0IHdvdWxkIGJlIGZhciBiZXR0ZXIgdG8gY2hlY2sgdGhlIHNpemUgdGhhdCBpcyBhY3R1YWxseSB1c2VkLAorICAgICAgICogYnV0IHRoZSBlZmZlY3QgaW4gdGhlIHJlYWwgd29ybGQgaXMgbWlub3IgYW5kIHRoZSBjaGFuZ2VzIGFyZSBtb3JlCisgICAgICAgKiBleHRlbnNpdmUsIHRoZXJlZm9yZSBtdWNoIG1vcmUgZGFuZ2Vyb3VzIGFuZCBtdWNoIG1vcmUgZGlmZmljdWx0IHRvCisgICAgICAgKiB3cml0ZSBpbiBhIHdheSB0aGF0IGF2b2lkcyBjb21waWxlciB3YXJuaW5ncy4KKyAgICAgICAqLworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkltYWdlIHdpZHRoIGlzIHRvbyBsYXJnZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmUiKTsKKyAgICAgIGVycm9yID0gMTsKKyAgIH0KKworI2lmZGVmIFBOR19TRVRfVVNFUl9MSU1JVFNfU1VQUE9SVEVECisgICBpZiAod2lkdGggPiBwbmdfcHRyLT51c2VyX3dpZHRoX21heCkKKyNlbHNlCisgICBpZiAod2lkdGggPiBQTkdfVVNFUl9XSURUSF9NQVgpCisjZW5kaWYKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbWFnZSB3aWR0aCBleGNlZWRzIHVzZXIgbGltaXQgaW4gSUhEUiIpOworICAgICAgZXJyb3IgPSAxOworICAgfQorCisgICBpZiAoaGVpZ2h0ID09IDApCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW1hZ2UgaGVpZ2h0IGlzIHplcm8gaW4gSUhEUiIpOworICAgICAgZXJyb3IgPSAxOworICAgfQorCisgICBpZiAoaGVpZ2h0ID4gUE5HX1VJTlRfMzFfTUFYKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgaW1hZ2UgaGVpZ2h0IGluIElIRFIiKTsKKyAgICAgIGVycm9yID0gMTsKKyAgIH0KKworI2lmZGVmIFBOR19TRVRfVVNFUl9MSU1JVFNfU1VQUE9SVEVECisgICBpZiAoaGVpZ2h0ID4gcG5nX3B0ci0+dXNlcl9oZWlnaHRfbWF4KQorI2Vsc2UKKyAgIGlmIChoZWlnaHQgPiBQTkdfVVNFUl9IRUlHSFRfTUFYKQorI2VuZGlmCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW1hZ2UgaGVpZ2h0IGV4Y2VlZHMgdXNlciBsaW1pdCBpbiBJSERSIik7CisgICAgICBlcnJvciA9IDE7CisgICB9CisKKyAgIC8qIENoZWNrIG90aGVyIHZhbHVlcyAqLworICAgaWYgKGJpdF9kZXB0aCAhPSAxICYmIGJpdF9kZXB0aCAhPSAyICYmIGJpdF9kZXB0aCAhPSA0ICYmCisgICAgICAgYml0X2RlcHRoICE9IDggJiYgYml0X2RlcHRoICE9IDE2KQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgYml0IGRlcHRoIGluIElIRFIiKTsKKyAgICAgIGVycm9yID0gMTsKKyAgIH0KKworICAgaWYgKGNvbG9yX3R5cGUgPCAwIHx8IGNvbG9yX3R5cGUgPT0gMSB8fAorICAgICAgIGNvbG9yX3R5cGUgPT0gNSB8fCBjb2xvcl90eXBlID4gNikKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGNvbG9yIHR5cGUgaW4gSUhEUiIpOworICAgICAgZXJyb3IgPSAxOworICAgfQorCisgICBpZiAoKChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpICYmIGJpdF9kZXB0aCA+IDgpIHx8CisgICAgICAgKChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiB8fAorICAgICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBIHx8CisgICAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkgJiYgYml0X2RlcHRoIDwgOCkpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBjb2xvciB0eXBlL2JpdCBkZXB0aCBjb21iaW5hdGlvbiBpbiBJSERSIik7CisgICAgICBlcnJvciA9IDE7CisgICB9CisKKyAgIGlmIChpbnRlcmxhY2VfdHlwZSA+PSBQTkdfSU5URVJMQUNFX0xBU1QpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVW5rbm93biBpbnRlcmxhY2UgbWV0aG9kIGluIElIRFIiKTsKKyAgICAgIGVycm9yID0gMTsKKyAgIH0KKworICAgaWYgKGNvbXByZXNzaW9uX3R5cGUgIT0gUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJVbmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCBpbiBJSERSIik7CisgICAgICBlcnJvciA9IDE7CisgICB9CisKKyNpZmRlZiBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRAorICAgLyogQWNjZXB0IGZpbHRlcl9tZXRob2QgNjQgKGludHJhcGl4ZWwgZGlmZmVyZW5jaW5nKSBvbmx5IGlmCisgICAgKiAxLiBMaWJwbmcgd2FzIGNvbXBpbGVkIHdpdGggUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQgYW5kCisgICAgKiAyLiBMaWJwbmcgZGlkIG5vdCByZWFkIGEgUE5HIHNpZ25hdHVyZSAodGhpcyBmaWx0ZXJfbWV0aG9kIGlzIG9ubHkKKyAgICAqICAgIHVzZWQgaW4gUE5HIGRhdGFzdHJlYW1zIHRoYXQgYXJlIGVtYmVkZGVkIGluIE1ORyBkYXRhc3RyZWFtcykgYW5kCisgICAgKiAzLiBUaGUgYXBwbGljYXRpb24gY2FsbGVkIHBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzIHdpdGggYSBtYXNrIHRoYXQKKyAgICAqICAgIGluY2x1ZGVkIFBOR19GTEFHX01OR19GSUxURVJfNjQgYW5kCisgICAgKiA0LiBUaGUgZmlsdGVyX21ldGhvZCBpcyA2NCBhbmQKKyAgICAqIDUuIFRoZSBjb2xvcl90eXBlIGlzIFJHQiBvciBSR0JBCisgICAgKi8KKyAgIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX1BOR19TSUdOQVRVUkUpICE9IDAgJiYKKyAgICAgICBwbmdfcHRyLT5tbmdfZmVhdHVyZXNfcGVybWl0dGVkICE9IDApCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTU5HIGZlYXR1cmVzIGFyZSBub3QgYWxsb3dlZCBpbiBhIFBORyBkYXRhc3RyZWFtIik7CisKKyAgIGlmIChmaWx0ZXJfdHlwZSAhPSBQTkdfRklMVEVSX1RZUEVfQkFTRSkKKyAgIHsKKyAgICAgIGlmICghKChwbmdfcHRyLT5tbmdfZmVhdHVyZXNfcGVybWl0dGVkICYgUE5HX0ZMQUdfTU5HX0ZJTFRFUl82NCkgIT0gMCAmJgorICAgICAgICAgIChmaWx0ZXJfdHlwZSA9PSBQTkdfSU5UUkFQSVhFTF9ESUZGRVJFTkNJTkcpICYmCisgICAgICAgICAgKChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfUE5HX1NJR05BVFVSRSkgPT0gMCkgJiYKKyAgICAgICAgICAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgfHwKKyAgICAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkpKQorICAgICAgeworICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVua25vd24gZmlsdGVyIG1ldGhvZCBpbiBJSERSIik7CisgICAgICAgICBlcnJvciA9IDE7CisgICAgICB9CisKKyAgICAgIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX1BOR19TSUdOQVRVUkUpICE9IDApCisgICAgICB7CisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBmaWx0ZXIgbWV0aG9kIGluIElIRFIiKTsKKyAgICAgICAgIGVycm9yID0gMTsKKyAgICAgIH0KKyAgIH0KKworI2Vsc2UKKyAgIGlmIChmaWx0ZXJfdHlwZSAhPSBQTkdfRklMVEVSX1RZUEVfQkFTRSkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJVbmtub3duIGZpbHRlciBtZXRob2QgaW4gSUhEUiIpOworICAgICAgZXJyb3IgPSAxOworICAgfQorI2VuZGlmCisKKyAgIGlmIChlcnJvciA9PSAxKQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbnZhbGlkIElIRFIgZGF0YSIpOworfQorCisjaWYgZGVmaW5lZChQTkdfc0NBTF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX3BDQUxfU1VQUE9SVEVEKQorLyogQVNDSUkgdG8gZnAgZnVuY3Rpb25zICovCisvKiBDaGVjayBhbiBBU0NJSSBmb3JtYXRlZCBmbG9hdGluZyBwb2ludCB2YWx1ZSwgc2VlIHRoZSBtb3JlIGRldGFpbGVkCisgKiBjb21tZW50cyBpbiBwbmdwcml2LmgKKyAqLworLyogVGhlIGZvbGxvd2luZyBpcyB1c2VkIGludGVybmFsbHkgdG8gcHJlc2VydmUgdGhlIHN0aWNreSBmbGFncyAqLworI2RlZmluZSBwbmdfZnBfYWRkKHN0YXRlLCBmbGFncykgKChzdGF0ZSkgfD0gKGZsYWdzKSkKKyNkZWZpbmUgcG5nX2ZwX3NldChzdGF0ZSwgdmFsdWUpICgoc3RhdGUpID0gKHZhbHVlKSB8ICgoc3RhdGUpICYgUE5HX0ZQX1NUSUNLWSkpCisKK2ludCAvKiBQUklWQVRFICovCitwbmdfY2hlY2tfZnBfbnVtYmVyKHBuZ19jb25zdF9jaGFycCBzdHJpbmcsIHBuZ19zaXplX3Qgc2l6ZSwgaW50ICpzdGF0ZXAsCisgICBwbmdfc2l6ZV90cCB3aGVyZWFtaSkKK3sKKyAgIGludCBzdGF0ZSA9ICpzdGF0ZXA7CisgICBwbmdfc2l6ZV90IGkgPSAqd2hlcmVhbWk7CisKKyAgIHdoaWxlIChpIDwgc2l6ZSkKKyAgIHsKKyAgICAgIGludCB0eXBlOworICAgICAgLyogRmlyc3QgZmluZCB0aGUgdHlwZSBvZiB0aGUgbmV4dCBjaGFyYWN0ZXIgKi8KKyAgICAgIHN3aXRjaCAoc3RyaW5nW2ldKQorICAgICAgeworICAgICAgY2FzZSA0MzogIHR5cGUgPSBQTkdfRlBfU0FXX1NJR047ICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0NTogIHR5cGUgPSBQTkdfRlBfU0FXX1NJR04gKyBQTkdfRlBfTkVHQVRJVkU7IGJyZWFrOworICAgICAgY2FzZSA0NjogIHR5cGUgPSBQTkdfRlBfU0FXX0RPVDsgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0ODogIHR5cGUgPSBQTkdfRlBfU0FXX0RJR0lUOyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0OTogY2FzZSA1MDogY2FzZSA1MTogY2FzZSA1MjoKKyAgICAgIGNhc2UgNTM6IGNhc2UgNTQ6IGNhc2UgNTU6IGNhc2UgNTY6CisgICAgICBjYXNlIDU3OiAgdHlwZSA9IFBOR19GUF9TQVdfRElHSVQgKyBQTkdfRlBfTk9OWkVSTzsgYnJlYWs7CisgICAgICBjYXNlIDY5OgorICAgICAgY2FzZSAxMDE6IHR5cGUgPSBQTkdfRlBfU0FXX0U7ICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDogIGdvdG8gUE5HX0ZQX0VuZDsKKyAgICAgIH0KKworICAgICAgLyogTm93IGRlYWwgd2l0aCB0aGlzIHR5cGUgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50CisgICAgICAgKiBzdGF0ZSwgdGhlIHR5cGUgaXMgYXJyYW5nZWQgdG8gbm90IG92ZXJsYXAgdGhlCisgICAgICAgKiBiaXRzIG9mIHRoZSBQTkdfRlBfU1RBVEUuCisgICAgICAgKi8KKyAgICAgIHN3aXRjaCAoKHN0YXRlICYgUE5HX0ZQX1NUQVRFKSArICh0eXBlICYgUE5HX0ZQX1NBV19BTlkpKQorICAgICAgeworICAgICAgY2FzZSBQTkdfRlBfSU5URUdFUiArIFBOR19GUF9TQVdfU0lHTjoKKyAgICAgICAgIGlmICgoc3RhdGUgJiBQTkdfRlBfU0FXX0FOWSkgIT0gMCkKKyAgICAgICAgICAgIGdvdG8gUE5HX0ZQX0VuZDsgLyogbm90IGEgcGFydCBvZiB0aGUgbnVtYmVyICovCisKKyAgICAgICAgIHBuZ19mcF9hZGQoc3RhdGUsIHR5cGUpOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUE5HX0ZQX0lOVEVHRVIgKyBQTkdfRlBfU0FXX0RPVDoKKyAgICAgICAgIC8qIE9rIGFzIHRyYWlsZXIsIG9rIGFzIGxlYWQgb2YgZnJhY3Rpb24uICovCisgICAgICAgICBpZiAoKHN0YXRlICYgUE5HX0ZQX1NBV19ET1QpICE9IDApIC8qIHR3byBkb3RzICovCisgICAgICAgICAgICBnb3RvIFBOR19GUF9FbmQ7CisKKyAgICAgICAgIGVsc2UgaWYgKChzdGF0ZSAmIFBOR19GUF9TQVdfRElHSVQpICE9IDApIC8qIHRyYWlsaW5nIGRvdD8gKi8KKyAgICAgICAgICAgIHBuZ19mcF9hZGQoc3RhdGUsIHR5cGUpOworCisgICAgICAgICBlbHNlCisgICAgICAgICAgICBwbmdfZnBfc2V0KHN0YXRlLCBQTkdfRlBfRlJBQ1RJT04gfCB0eXBlKTsKKworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUE5HX0ZQX0lOVEVHRVIgKyBQTkdfRlBfU0FXX0RJR0lUOgorICAgICAgICAgaWYgKChzdGF0ZSAmIFBOR19GUF9TQVdfRE9UKSAhPSAwKSAvKiBkZWxheWVkIGZyYWN0aW9uICovCisgICAgICAgICAgICBwbmdfZnBfc2V0KHN0YXRlLCBQTkdfRlBfRlJBQ1RJT04gfCBQTkdfRlBfU0FXX0RPVCk7CisKKyAgICAgICAgIHBuZ19mcF9hZGQoc3RhdGUsIHR5cGUgfCBQTkdfRlBfV0FTX1ZBTElEKTsKKworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUE5HX0ZQX0lOVEVHRVIgKyBQTkdfRlBfU0FXX0U6CisgICAgICAgICBpZiAoKHN0YXRlICYgUE5HX0ZQX1NBV19ESUdJVCkgPT0gMCkKKyAgICAgICAgICAgIGdvdG8gUE5HX0ZQX0VuZDsKKworICAgICAgICAgcG5nX2ZwX3NldChzdGF0ZSwgUE5HX0ZQX0VYUE9ORU5UKTsKKworICAgICAgICAgYnJlYWs7CisKKyAgIC8qIGNhc2UgUE5HX0ZQX0ZSQUNUSU9OICsgUE5HX0ZQX1NBV19TSUdOOgorICAgICAgICAgZ290byBQTkdfRlBfRW5kOyAqKiBubyBzaWduIGluIGZyYWN0aW9uICovCisKKyAgIC8qIGNhc2UgUE5HX0ZQX0ZSQUNUSU9OICsgUE5HX0ZQX1NBV19ET1Q6CisgICAgICAgICBnb3RvIFBOR19GUF9FbmQ7ICoqIEJlY2F1c2UgU0FXX0RPVCBpcyBhbHdheXMgc2V0ICovCisKKyAgICAgIGNhc2UgUE5HX0ZQX0ZSQUNUSU9OICsgUE5HX0ZQX1NBV19ESUdJVDoKKyAgICAgICAgIHBuZ19mcF9hZGQoc3RhdGUsIHR5cGUgfCBQTkdfRlBfV0FTX1ZBTElEKTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBOR19GUF9GUkFDVElPTiArIFBOR19GUF9TQVdfRToKKyAgICAgICAgIC8qIFRoaXMgaXMgY29ycmVjdCBiZWNhdXNlIHRoZSB0cmFpbGluZyAnLicgb24gYW4KKyAgICAgICAgICAqIGludGVnZXIgaXMgaGFuZGxlZCBhYm92ZSAtIHNvIHdlIGNhbiBvbmx5IGdldCBoZXJlCisgICAgICAgICAgKiB3aXRoIHRoZSBzZXF1ZW5jZSAiLkUiICh3aXRoIG5vIHByZWNlZGluZyBkaWdpdHMpLgorICAgICAgICAgICovCisgICAgICAgICBpZiAoKHN0YXRlICYgUE5HX0ZQX1NBV19ESUdJVCkgPT0gMCkKKyAgICAgICAgICAgIGdvdG8gUE5HX0ZQX0VuZDsKKworICAgICAgICAgcG5nX2ZwX3NldChzdGF0ZSwgUE5HX0ZQX0VYUE9ORU5UKTsKKworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUE5HX0ZQX0VYUE9ORU5UICsgUE5HX0ZQX1NBV19TSUdOOgorICAgICAgICAgaWYgKChzdGF0ZSAmIFBOR19GUF9TQVdfQU5ZKSAhPSAwKQorICAgICAgICAgICAgZ290byBQTkdfRlBfRW5kOyAvKiBub3QgYSBwYXJ0IG9mIHRoZSBudW1iZXIgKi8KKworICAgICAgICAgcG5nX2ZwX2FkZChzdGF0ZSwgUE5HX0ZQX1NBV19TSUdOKTsKKworICAgICAgICAgYnJlYWs7CisKKyAgIC8qIGNhc2UgUE5HX0ZQX0VYUE9ORU5UICsgUE5HX0ZQX1NBV19ET1Q6CisgICAgICAgICBnb3RvIFBOR19GUF9FbmQ7ICovCisKKyAgICAgIGNhc2UgUE5HX0ZQX0VYUE9ORU5UICsgUE5HX0ZQX1NBV19ESUdJVDoKKyAgICAgICAgIHBuZ19mcF9hZGQoc3RhdGUsIFBOR19GUF9TQVdfRElHSVQgfCBQTkdfRlBfV0FTX1ZBTElEKTsKKworICAgICAgICAgYnJlYWs7CisKKyAgIC8qIGNhc2UgUE5HX0ZQX0VYUE9ORVhUICsgUE5HX0ZQX1NBV19FOgorICAgICAgICAgZ290byBQTkdfRlBfRW5kOyAqLworCisgICAgICBkZWZhdWx0OiBnb3RvIFBOR19GUF9FbmQ7IC8qIEkuZS4gYnJlYWsgMiAqLworICAgICAgfQorCisgICAgICAvKiBUaGUgY2hhcmFjdGVyIHNlZW1zIG9rLCBjb250aW51ZS4gKi8KKyAgICAgICsraTsKKyAgIH0KKworUE5HX0ZQX0VuZDoKKyAgIC8qIEhlcmUgYXQgdGhlIGVuZCwgdXBkYXRlIHRoZSBzdGF0ZSBhbmQgcmV0dXJuIHRoZSBjb3JyZWN0CisgICAgKiByZXR1cm4gY29kZS4KKyAgICAqLworICAgKnN0YXRlcCA9IHN0YXRlOworICAgKndoZXJlYW1pID0gaTsKKworICAgcmV0dXJuIChzdGF0ZSAmIFBOR19GUF9TQVdfRElHSVQpICE9IDA7Cit9CisKKworLyogVGhlIHNhbWUgYnV0IGZvciBhIGNvbXBsZXRlIHN0cmluZy4gKi8KK2ludAorcG5nX2NoZWNrX2ZwX3N0cmluZyhwbmdfY29uc3RfY2hhcnAgc3RyaW5nLCBwbmdfc2l6ZV90IHNpemUpCit7CisgICBpbnQgICAgICAgIHN0YXRlPTA7CisgICBwbmdfc2l6ZV90IGNoYXJfaW5kZXg9MDsKKworICAgaWYgKHBuZ19jaGVja19mcF9udW1iZXIoc3RyaW5nLCBzaXplLCAmc3RhdGUsICZjaGFyX2luZGV4KSAhPSAwICYmCisgICAgICAoY2hhcl9pbmRleCA9PSBzaXplIHx8IHN0cmluZ1tjaGFyX2luZGV4XSA9PSAwKSkKKyAgICAgIHJldHVybiBzdGF0ZSAvKiBtdXN0IGJlIG5vbi16ZXJvIC0gc2VlIGFib3ZlICovOworCisgICByZXR1cm4gMDsgLyogaS5lLiBmYWlsICovCit9CisjZW5kaWYgLyogcENBTCB8fCBzQ0FMICovCisKKyNpZmRlZiBQTkdfc0NBTF9TVVBQT1JURUQKKyMgIGlmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKKy8qIFV0aWxpdHkgdXNlZCBiZWxvdyAtIGEgc2ltcGxlIGFjY3VyYXRlIHBvd2VyIG9mIHRlbiBmcm9tIGFuIGludGVncmFsCisgKiBleHBvbmVudC4KKyAqLworc3RhdGljIGRvdWJsZQorcG5nX3BvdzEwKGludCBwb3dlcikKK3sKKyAgIGludCByZWNpcCA9IDA7CisgICBkb3VibGUgZCA9IDE7CisKKyAgIC8qIEhhbmRsZSBuZWdhdGl2ZSBleHBvbmVudCB3aXRoIGEgcmVjaXByb2NhbCBhdCB0aGUgZW5kIGJlY2F1c2UKKyAgICAqIDEwIGlzIGV4YWN0IHdoZXJlYXMgLjEgaXMgaW5leGFjdCBpbiBiYXNlIDIKKyAgICAqLworICAgaWYgKHBvd2VyIDwgMCkKKyAgIHsKKyAgICAgIGlmIChwb3dlciA8IERCTF9NSU5fMTBfRVhQKSByZXR1cm4gMDsKKyAgICAgIHJlY2lwID0gMSwgcG93ZXIgPSAtcG93ZXI7CisgICB9CisKKyAgIGlmIChwb3dlciA+IDApCisgICB7CisgICAgICAvKiBEZWNvbXBvc2UgcG93ZXIgYml0d2lzZS4gKi8KKyAgICAgIGRvdWJsZSBtdWx0ID0gMTA7CisgICAgICBkbworICAgICAgeworICAgICAgICAgaWYgKHBvd2VyICYgMSkgZCAqPSBtdWx0OworICAgICAgICAgbXVsdCAqPSBtdWx0OworICAgICAgICAgcG93ZXIgPj49IDE7CisgICAgICB9CisgICAgICB3aGlsZSAocG93ZXIgPiAwKTsKKworICAgICAgaWYgKHJlY2lwICE9IDApIGQgPSAxL2Q7CisgICB9CisgICAvKiBlbHNlIHBvd2VyIGlzIDAgYW5kIGQgaXMgMSAqLworCisgICByZXR1cm4gZDsKK30KKworLyogRnVuY3Rpb24gdG8gZm9ybWF0IGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUgaW4gQVNDSUkgd2l0aCBhIGdpdmVuCisgKiBwcmVjaXNpb24uCisgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2FzY2lpX2Zyb21fZnAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jaGFycCBhc2NpaSwgcG5nX3NpemVfdCBzaXplLAorICAgIGRvdWJsZSBmcCwgdW5zaWduZWQgaW50IHByZWNpc2lvbikKK3sKKyAgIC8qIFdlIHVzZSBzdGFuZGFyZCBmdW5jdGlvbnMgZnJvbSBtYXRoLmgsIGJ1dCBub3QgcHJpbnRmIGJlY2F1c2UKKyAgICAqIHRoYXQgd291bGQgcmVxdWlyZSBzdGRpby4gIFRoZSBjYWxsZXIgbXVzdCBzdXBwbHkgYSBidWZmZXIgb2YKKyAgICAqIHN1ZmZpY2llbnQgc2l6ZSBvciB3ZSB3aWxsIHBuZ19lcnJvci4gIFRoZSB0ZXN0cyBvbiBzaXplIGFuZAorICAgICogdGhlIHNwYWNlIGluIGFzY2lpW10gY29uc3VtZWQgYXJlIGluZGljYXRlZCBiZWxvdy4KKyAgICAqLworICAgaWYgKHByZWNpc2lvbiA8IDEpCisgICAgICBwcmVjaXNpb24gPSBEQkxfRElHOworCisgICAvKiBFbmZvcmNlIHRoZSBsaW1pdCBvZiB0aGUgaW1wbGVtZW50YXRpb24gcHJlY2lzaW9uIHRvby4gKi8KKyAgIGlmIChwcmVjaXNpb24gPiBEQkxfRElHKzEpCisgICAgICBwcmVjaXNpb24gPSBEQkxfRElHKzE7CisKKyAgIC8qIEJhc2ljIHNhbml0eSBjaGVja3MgKi8KKyAgIGlmIChzaXplID49IHByZWNpc2lvbis1KSAvKiBTZWUgdGhlIHJlcXVpcmVtZW50cyBiZWxvdy4gKi8KKyAgIHsKKyAgICAgIGlmIChmcCA8IDApCisgICAgICB7CisgICAgICAgICBmcCA9IC1mcDsKKyAgICAgICAgICphc2NpaSsrID0gNDU7IC8qICctJyAgUExVUyAxIFRPVEFMIDEgKi8KKyAgICAgICAgIC0tc2l6ZTsKKyAgICAgIH0KKworICAgICAgaWYgKGZwID49IERCTF9NSU4gJiYgZnAgPD0gREJMX01BWCkKKyAgICAgIHsKKyAgICAgICAgIGludCBleHBfYjEwOyAgIC8qIEEgYmFzZSAxMCBleHBvbmVudCAqLworICAgICAgICAgZG91YmxlIGJhc2U7ICAgLyogMTBeZXhwX2IxMCAqLworCisgICAgICAgICAvKiBGaXJzdCBleHRyYWN0IGEgYmFzZSAxMCBleHBvbmVudCBvZiB0aGUgbnVtYmVyLAorICAgICAgICAgICogdGhlIGNhbGN1bGF0aW9uIGJlbG93IHJvdW5kcyBkb3duIHdoZW4gY29udmVydGluZworICAgICAgICAgICogZnJvbSBiYXNlIDIgdG8gYmFzZSAxMCAobXVsdGlwbHkgYnkgbG9nMTAoMikgLQorICAgICAgICAgICogMC4zMDEwLCBidXQgNzcvMjU2IGlzIDAuMzAwOCwgc28gZXhwX2IxMCBuZWVkcyB0bworICAgICAgICAgICogYmUgaW5jcmVhc2VkLiAgTm90ZSB0aGF0IHRoZSBhcml0aG1ldGljIHNoaWZ0CisgICAgICAgICAgKiBwZXJmb3JtcyBhIGZsb29yKCkgdW5saWtlIEMgYXJpdGhtZXRpYyAtIHVzaW5nIGEKKyAgICAgICAgICAqIEMgbXVsdGlwbHkgd291bGQgYnJlYWsgdGhlIGZvbGxvd2luZyBmb3IgbmVnYXRpdmUKKyAgICAgICAgICAqIGV4cG9uZW50cy4KKyAgICAgICAgICAqLworICAgICAgICAgKHZvaWQpZnJleHAoZnAsICZleHBfYjEwKTsgLyogZXhwb25lbnQgdG8gYmFzZSAyICovCisKKyAgICAgICAgIGV4cF9iMTAgPSAoZXhwX2IxMCAqIDc3KSA+PiA4OyAvKiA8PSBleHBvbmVudCB0byBiYXNlIDEwICovCisKKyAgICAgICAgIC8qIEF2b2lkIHVuZGVyZmxvdyBoZXJlLiAqLworICAgICAgICAgYmFzZSA9IHBuZ19wb3cxMChleHBfYjEwKTsgLyogTWF5IHVuZGVyZmxvdyAqLworCisgICAgICAgICB3aGlsZSAoYmFzZSA8IERCTF9NSU4gfHwgYmFzZSA8IGZwKQorICAgICAgICAgeworICAgICAgICAgICAgLyogQW5kIHRoaXMgbWF5IG92ZXJmbG93LiAqLworICAgICAgICAgICAgZG91YmxlIHRlc3QgPSBwbmdfcG93MTAoZXhwX2IxMCsxKTsKKworICAgICAgICAgICAgaWYgKHRlc3QgPD0gREJMX01BWCkKKyAgICAgICAgICAgICAgICsrZXhwX2IxMCwgYmFzZSA9IHRlc3Q7CisKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICAvKiBOb3JtYWxpemUgZnAgYW5kIGNvcnJlY3QgZXhwX2IxMCwgYWZ0ZXIgdGhpcyBmcCBpcyBpbiB0aGUKKyAgICAgICAgICAqIHJhbmdlIFsuMSwxKSBhbmQgZXhwX2IxMCBpcyBib3RoIHRoZSBleHBvbmVudCBhbmQgdGhlIGRpZ2l0CisgICAgICAgICAgKiAqYmVmb3JlKiB3aGljaCB0aGUgZGVjaW1hbCBwb2ludCBzaG91bGQgYmUgaW5zZXJ0ZWQKKyAgICAgICAgICAqIChzdGFydGluZyB3aXRoIDAgZm9yIHRoZSBmaXJzdCBkaWdpdCkuICBOb3RlIHRoYXQgdGhpcworICAgICAgICAgICogd29ya3MgZXZlbiBpZiAxMF5leHBfYjEwIGlzIG91dCBvZiByYW5nZSBiZWNhdXNlIG9mIHRoZQorICAgICAgICAgICogdGVzdCBvbiBEQkxfTUFYIGFib3ZlLgorICAgICAgICAgICovCisgICAgICAgICBmcCAvPSBiYXNlOworICAgICAgICAgd2hpbGUgKGZwID49IDEpIGZwIC89IDEwLCArK2V4cF9iMTA7CisKKyAgICAgICAgIC8qIEJlY2F1c2Ugb2YgdGhlIGNvZGUgYWJvdmUgZnAgbWF5LCBhdCB0aGlzIHBvaW50LCBiZQorICAgICAgICAgICogbGVzcyB0aGFuIC4xLCB0aGlzIGlzIG9rIGJlY2F1c2UgdGhlIGNvZGUgYmVsb3cgY2FuCisgICAgICAgICAgKiBoYW5kbGUgdGhlIGxlYWRpbmcgemVyb3MgdGhpcyBnZW5lcmF0ZXMsIHNvIG5vIGF0dGVtcHQKKyAgICAgICAgICAqIGlzIG1hZGUgdG8gY29ycmVjdCB0aGF0IGhlcmUuCisgICAgICAgICAgKi8KKworICAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IGN6ZXJvLCBjbGVhZCwgY2RpZ2l0czsKKyAgICAgICAgICAgIGNoYXIgZXhwb25lbnRbMTBdOworCisgICAgICAgICAgICAvKiBBbGxvdyB1cCB0byB0d28gbGVhZGluZyB6ZXJvcyAtIHRoaXMgd2lsbCBub3QgbGVuZ3RoZW4KKyAgICAgICAgICAgICAqIHRoZSBudW1iZXIgY29tcGFyZWQgdG8gdXNpbmcgRS1uLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoZXhwX2IxMCA8IDAgJiYgZXhwX2IxMCA+IC0zKSAvKiBQTFVTIDMgVE9UQUwgNCAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgY3plcm8gPSAtZXhwX2IxMDsgLyogUExVUyAyIGRpZ2l0czogVE9UQUwgMyAqLworICAgICAgICAgICAgICAgZXhwX2IxMCA9IDA7ICAgICAgLyogRG90IGFkZGVkIGJlbG93IGJlZm9yZSBmaXJzdCBvdXRwdXQuICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICBjemVybyA9IDA7ICAgIC8qIE5vIHplcm9zIHRvIGFkZCAqLworCisgICAgICAgICAgICAvKiBHZW5lcmF0ZSB0aGUgZGlnaXQgbGlzdCwgc3RyaXBwaW5nIHRyYWlsaW5nIHplcm9zIGFuZAorICAgICAgICAgICAgICogaW5zZXJ0aW5nIGEgJy4nIGJlZm9yZSBhIGRpZ2l0IGlmIHRoZSBleHBvbmVudCBpcyAwLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBjbGVhZCA9IGN6ZXJvOyAvKiBDb3VudCBvZiBsZWFkaW5nIHplcm9zICovCisgICAgICAgICAgICBjZGlnaXRzID0gMDsgICAvKiBDb3VudCBvZiBkaWdpdHMgaW4gbGlzdC4gKi8KKworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGRvdWJsZSBkOworCisgICAgICAgICAgICAgICBmcCAqPSAxMDsKKyAgICAgICAgICAgICAgIC8qIFVzZSBtb2RmIGhlcmUsIG5vdCBmbG9vciBhbmQgc3VidHJhY3QsIHNvIHRoYXQKKyAgICAgICAgICAgICAgICAqIHRoZSBzZXBhcmF0aW9uIGlzIGRvbmUgaW4gb25lIHN0ZXAuICBBdCB0aGUgZW5kCisgICAgICAgICAgICAgICAgKiBvZiB0aGUgbG9vcCBkb24ndCBicmVhayB0aGUgbnVtYmVyIGludG8gcGFydHMgc28KKyAgICAgICAgICAgICAgICAqIHRoYXQgdGhlIGZpbmFsIGRpZ2l0IGlzIHJvdW5kZWQuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIGlmIChjZGlnaXRzK2N6ZXJvKzEgPCBwcmVjaXNpb24rY2xlYWQpCisgICAgICAgICAgICAgICAgICBmcCA9IG1vZGYoZnAsICZkKTsKKworICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZCA9IGZsb29yKGZwICsgLjUpOworCisgICAgICAgICAgICAgICAgICBpZiAoZCA+IDkpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAvKiBSb3VuZGluZyB1cCB0byAxMCwgaGFuZGxlIHRoYXQgaGVyZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgIGlmIChjemVybyA+IDApCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAtLWN6ZXJvLCBkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZGlnaXRzID09IDApIC0tY2xlYWQ7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2RpZ2l0cyA+IDAgJiYgZCA+IDkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAqLS1hc2NpaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cF9iMTAgIT0gKC0xKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrZXhwX2IxMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gNDYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9ICotLWFzY2lpLCArK3NpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBZHZhbmNlIGV4cF9iMTAgdG8gJzEnLCBzbyB0aGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZGVjaW1hbCBwb2ludCBoYXBwZW5zIGFmdGVyIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcHJldmlvdXMgZGlnaXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cF9iMTAgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWNkaWdpdHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gY2ggLSA0NzsgIC8qIEkuZS4gMSsoY2gtNDgpICovCisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpZCB3ZSByZWFjaCB0aGUgYmVnaW5uaW5nPyBJZiBzbyBhZGp1c3QgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBleHBvbmVudCBidXQgdGFrZSBpbnRvIGFjY291bnQgdGhlIGxlYWRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGRlY2ltYWwgcG9pbnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkID4gOSkgIC8qIGNkaWdpdHMgPT0gMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cF9iMTAgPT0gKC0xKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlYWRpbmcgZGVjaW1hbCBwb2ludCAocGx1cyB6ZXJvcz8pLCBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd2UgbG9zZSB0aGUgZGVjaW1hbCBwb2ludCBoZXJlIGl0IG11c3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJlIHJlZW50ZXJlZCBiZWxvdy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gKi0tYXNjaWk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSA0NikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrc2l6ZSwgZXhwX2IxMCA9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVsc2UgbG9zdCBhIGxlYWRpbmcgemVybywgc28gJ2V4cF9iMTAnIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdGlsbCBvayBhdCAoLTEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrZXhwX2IxMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW4gYWxsIGNhc2VzIHdlIG91dHB1dCBhICcxJyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBmcCA9IDA7IC8qIEd1YXJhbnRlZXMgdGVybWluYXRpb24gYmVsb3cuICovCisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGlmIChkID09IDApCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICArK2N6ZXJvOworICAgICAgICAgICAgICAgICAgaWYgKGNkaWdpdHMgPT0gMCkgKytjbGVhZDsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGVkIGVtYmVkZGVkIHplcm9zIGluIHRoZSBkaWdpdCBjb3VudC4gKi8KKyAgICAgICAgICAgICAgICAgIGNkaWdpdHMgKz0gY3plcm8gLSBjbGVhZDsKKyAgICAgICAgICAgICAgICAgIGNsZWFkID0gMDsKKworICAgICAgICAgICAgICAgICAgd2hpbGUgKGN6ZXJvID4gMCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIC8qIGV4cF9iMTAgPT0gKC0xKSBtZWFucyB3ZSBqdXN0IG91dHB1dCB0aGUgZGVjaW1hbAorICAgICAgICAgICAgICAgICAgICAgICogcGxhY2UgLSBhZnRlciB0aGUgRFAgZG9uJ3QgYWRqdXN0ICdleHBfYjEwJyBhbnkKKyAgICAgICAgICAgICAgICAgICAgICAqIG1vcmUhCisgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgIGlmIChleHBfYjEwICE9ICgtMSkpCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwX2IxMCA9PSAwKSAqYXNjaWkrKyA9IDQ2LCAtLXNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBQTFVTIDE6IFRPVEFMIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC0tZXhwX2IxMDsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICphc2NpaSsrID0gNDgsIC0tY3plcm87CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGlmIChleHBfYjEwICE9ICgtMSkpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwX2IxMCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgKmFzY2lpKysgPSA0NiwgLS1zaXplOyAvKiBjb3VudGVkIGFib3ZlICovCisKKyAgICAgICAgICAgICAgICAgICAgIC0tZXhwX2IxMDsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICphc2NpaSsrID0gKGNoYXIpKDQ4ICsgKGludClkKSwgKytjZGlnaXRzOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKGNkaWdpdHMrY3plcm8gPCBwcmVjaXNpb24rY2xlYWQgJiYgZnAgPiBEQkxfTUlOKTsKKworICAgICAgICAgICAgLyogVGhlIHRvdGFsIG91dHB1dCBjb3VudCAobWF4KSBpcyBub3cgNCtwcmVjaXNpb24gKi8KKworICAgICAgICAgICAgLyogQ2hlY2sgZm9yIGFuIGV4cG9uZW50LCBpZiB3ZSBkb24ndCBuZWVkIG9uZSB3ZSBhcmUKKyAgICAgICAgICAgICAqIGRvbmUgYW5kIGp1c3QgbmVlZCB0byB0ZXJtaW5hdGUgdGhlIHN0cmluZy4gIEF0CisgICAgICAgICAgICAgKiB0aGlzIHBvaW50IGV4cF9iMTA9PSgtMSkgaXMgZWZmZWN0aXZlbHkgaWYgZmxhZyAtIGl0IGdvdAorICAgICAgICAgICAgICogdG8gJy0xJyBiZWNhdXNlIG9mIHRoZSBkZWNyZW1lbnQgYWZ0ZXIgb3V0cHV0dGluZworICAgICAgICAgICAgICogdGhlIGRlY2ltYWwgcG9pbnQgYWJvdmUgKHRoZSBleHBvbmVudCByZXF1aXJlZCBpcworICAgICAgICAgICAgICogKm5vdCogLTEhKQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoZXhwX2IxMCA+PSAoLTEpICYmIGV4cF9iMTAgPD0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8qIFRoZSBmb2xsb3dpbmcgb25seSBoYXBwZW5zIGlmIHdlIGRpZG4ndCBvdXRwdXQgdGhlCisgICAgICAgICAgICAgICAgKiBsZWFkaW5nIHplcm9zIGFib3ZlIGZvciBuZWdhdGl2ZSBleHBvbmVudCwgc28gdGhpcworICAgICAgICAgICAgICAgICogZG9lc24ndCBhZGQgdG8gdGhlIGRpZ2l0IHJlcXVpcmVtZW50LiAgTm90ZSB0aGF0IHRoZQorICAgICAgICAgICAgICAgICogdHdvIHplcm9zIGhlcmUgY2FuIG9ubHkgYmUgb3V0cHV0IGlmIHRoZSB0d28gbGVhZGluZworICAgICAgICAgICAgICAgICogemVyb3Mgd2VyZSAqbm90KiBvdXRwdXQsIHNvIHRoaXMgZG9lc24ndCBpbmNyZWFzZQorICAgICAgICAgICAgICAgICogdGhlIG91dHB1dCBjb3VudC4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgd2hpbGUgKC0tZXhwX2IxMCA+PSAwKSAqYXNjaWkrKyA9IDQ4OworCisgICAgICAgICAgICAgICAqYXNjaWkgPSAwOworCisgICAgICAgICAgICAgICAvKiBUb3RhbCBidWZmZXIgcmVxdWlyZW1lbnQgKGluY2x1ZGluZyB0aGUgJ1wwJykgaXMKKyAgICAgICAgICAgICAgICAqIDUrcHJlY2lzaW9uIC0gc2VlIGNoZWNrIGF0IHRoZSBzdGFydC4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBIZXJlIGlmIGFuIGV4cG9uZW50IGlzIHJlcXVpcmVkLCBhZGp1c3Qgc2l6ZSBmb3IKKyAgICAgICAgICAgICAqIHRoZSBkaWdpdHMgd2Ugb3V0cHV0IGJ1dCBkaWQgbm90IGNvdW50LiAgVGhlIHRvdGFsCisgICAgICAgICAgICAgKiBkaWdpdCBvdXRwdXQgaGVyZSBzbyBmYXIgaXMgYXQgbW9zdCAxK3ByZWNpc2lvbiAtIG5vCisgICAgICAgICAgICAgKiBkZWNpbWFsIHBvaW50IGFuZCBubyBsZWFkaW5nIG9yIHRyYWlsaW5nIHplcm9zIGhhdmUKKyAgICAgICAgICAgICAqIGJlZW4gb3V0cHV0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzaXplIC09IGNkaWdpdHM7CisKKyAgICAgICAgICAgICphc2NpaSsrID0gNjksIC0tc2l6ZTsgICAgLyogJ0UnOiBQTFVTIDEgVE9UQUwgMitwcmVjaXNpb24gKi8KKworICAgICAgICAgICAgLyogVGhlIGZvbGxvd2luZyB1c2Ugb2YgYW4gdW5zaWduZWQgdGVtcG9yYXJ5IGF2b2lkcyBhbWJpZ3VpdGllcyBpbgorICAgICAgICAgICAgICogdGhlIHNpZ25lZCBhcml0aG1ldGljIG9uIGV4cF9iMTAgYW5kIHBlcm1pdHMgR0NDIGF0IGxlYXN0IHRvIGRvCisgICAgICAgICAgICAgKiBiZXR0ZXIgb3B0aW1pemF0aW9uLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdWV4cF9iMTA7CisKKyAgICAgICAgICAgICAgIGlmIChleHBfYjEwIDwgMCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICphc2NpaSsrID0gNDUsIC0tc2l6ZTsgLyogJy0nOiBQTFVTIDEgVE9UQUwgMytwcmVjaXNpb24gKi8KKyAgICAgICAgICAgICAgICAgIHVleHBfYjEwID0gLWV4cF9iMTA7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHVleHBfYjEwID0gZXhwX2IxMDsKKworICAgICAgICAgICAgICAgY2RpZ2l0cyA9IDA7CisKKyAgICAgICAgICAgICAgIHdoaWxlICh1ZXhwX2IxMCA+IDApCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBleHBvbmVudFtjZGlnaXRzKytdID0gKGNoYXIpKDQ4ICsgdWV4cF9iMTAgJSAxMCk7CisgICAgICAgICAgICAgICAgICB1ZXhwX2IxMCAvPSAxMDsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogTmVlZCBhbm90aGVyIHNpemUgY2hlY2sgaGVyZSBmb3IgdGhlIGV4cG9uZW50IGRpZ2l0cywgc28KKyAgICAgICAgICAgICAqIHRoaXMgbmVlZCBub3QgYmUgY29uc2lkZXJlZCBhYm92ZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHNpemUgPiBjZGlnaXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgd2hpbGUgKGNkaWdpdHMgPiAwKSAqYXNjaWkrKyA9IGV4cG9uZW50Wy0tY2RpZ2l0c107CisKKyAgICAgICAgICAgICAgICphc2NpaSA9IDA7CisKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCEoZnAgPj0gREJMX01JTikpCisgICAgICB7CisgICAgICAgICAqYXNjaWkrKyA9IDQ4OyAvKiAnMCcgKi8KKyAgICAgICAgICphc2NpaSA9IDA7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICAqYXNjaWkrKyA9IDEwNTsgLyogJ2knICovCisgICAgICAgICAqYXNjaWkrKyA9IDExMDsgLyogJ24nICovCisgICAgICAgICAqYXNjaWkrKyA9IDEwMjsgLyogJ2YnICovCisgICAgICAgICAqYXNjaWkgPSAwOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgfQorCisgICAvKiBIZXJlIG9uIGJ1ZmZlciB0b28gc21hbGwuICovCisgICBwbmdfZXJyb3IocG5nX3B0ciwgIkFTQ0lJIGNvbnZlcnNpb24gYnVmZmVyIHRvbyBzbWFsbCIpOworfQorCisjICBlbmRpZiAvKiBGTE9BVElOR19QT0lOVCAqLworCisjICBpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECisvKiBGdW5jdGlvbiB0byBmb3JtYXQgYSBmaXhlZCBwb2ludCB2YWx1ZSBpbiBBU0NJSS4KKyAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfYXNjaWlfZnJvbV9maXhlZChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NoYXJwIGFzY2lpLAorICAgIHBuZ19zaXplX3Qgc2l6ZSwgcG5nX2ZpeGVkX3BvaW50IGZwKQoreworICAgLyogUmVxdWlyZSBzcGFjZSBmb3IgMTAgZGVjaW1hbCBkaWdpdHMsIGEgZGVjaW1hbCBwb2ludCwgYSBtaW51cyBzaWduIGFuZCBhCisgICAgKiB0cmFpbGluZyBcMCwgMTMgY2hhcmFjdGVyczoKKyAgICAqLworICAgaWYgKHNpemUgPiAxMikKKyAgIHsKKyAgICAgIHBuZ191aW50XzMyIG51bTsKKworICAgICAgLyogQXZvaWQgb3ZlcmZsb3cgaGVyZSBvbiB0aGUgbWluaW11bSBpbnRlZ2VyLiAqLworICAgICAgaWYgKGZwIDwgMCkKKyAgICAgICAgICphc2NpaSsrID0gNDUsIG51bSA9IC1mcDsKKyAgICAgIGVsc2UKKyAgICAgICAgIG51bSA9IGZwOworCisgICAgICBpZiAobnVtIDw9IDB4ODAwMDAwMDApIC8qIGVsc2Ugb3ZlcmZsb3dlZCAqLworICAgICAgeworICAgICAgICAgdW5zaWduZWQgaW50IG5kaWdpdHMgPSAwLCBmaXJzdCA9IDE2IC8qIGZsYWcgdmFsdWUgKi87CisgICAgICAgICBjaGFyIGRpZ2l0c1sxMF07CisKKyAgICAgICAgIHdoaWxlIChudW0pCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBTcGxpdCB0aGUgbG93IGRpZ2l0IG9mZiBudW06ICovCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdG1wID0gbnVtLzEwOworICAgICAgICAgICAgbnVtIC09IHRtcCoxMDsKKyAgICAgICAgICAgIGRpZ2l0c1tuZGlnaXRzKytdID0gKGNoYXIpKDQ4ICsgbnVtKTsKKyAgICAgICAgICAgIC8qIFJlY29yZCB0aGUgZmlyc3Qgbm9uLXplcm8gZGlnaXQsIG5vdGUgdGhhdCB0aGlzIGlzIGEgbnVtYmVyCisgICAgICAgICAgICAgKiBzdGFydGluZyBhdCAxLCBpdCdzIG5vdCBhY3R1YWxseSB0aGUgYXJyYXkgaW5kZXguCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChmaXJzdCA9PSAxNiAmJiBudW0gPiAwKQorICAgICAgICAgICAgICAgZmlyc3QgPSBuZGlnaXRzOworICAgICAgICAgICAgbnVtID0gdG1wOworICAgICAgICAgfQorCisgICAgICAgICBpZiAobmRpZ2l0cyA+IDApCisgICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAobmRpZ2l0cyA+IDUpICphc2NpaSsrID0gZGlnaXRzWy0tbmRpZ2l0c107CisgICAgICAgICAgICAvKiBUaGUgcmVtYWluaW5nIGRpZ2l0cyBhcmUgZnJhY3Rpb25hbCBkaWdpdHMsIG5kaWdpdHMgaXMgJzUnIG9yCisgICAgICAgICAgICAgKiBzbWFsbGVyIGF0IHRoaXMgcG9pbnQuICBJdCBpcyBjZXJ0YWlubHkgbm90IHplcm8uICBDaGVjayBmb3IgYQorICAgICAgICAgICAgICogbm9uLXplcm8gZnJhY3Rpb25hbCBkaWdpdDoKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKGZpcnN0IDw9IDUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICAgICAgICAgICAgICphc2NpaSsrID0gNDY7IC8qIGRlY2ltYWwgcG9pbnQgKi8KKyAgICAgICAgICAgICAgIC8qIG5kaWdpdHMgbWF5IGJlIDw1IGZvciBzbWFsbCBudW1iZXJzLCBvdXRwdXQgbGVhZGluZyB6ZXJvcworICAgICAgICAgICAgICAgICogdGhlbiBuZGlnaXRzIGRpZ2l0cyB0byBmaXJzdDoKKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgaSA9IDU7CisgICAgICAgICAgICAgICB3aGlsZSAobmRpZ2l0cyA8IGkpICphc2NpaSsrID0gNDgsIC0taTsKKyAgICAgICAgICAgICAgIHdoaWxlIChuZGlnaXRzID49IGZpcnN0KSAqYXNjaWkrKyA9IGRpZ2l0c1stLW5kaWdpdHNdOworICAgICAgICAgICAgICAgLyogRG9uJ3Qgb3V0cHV0IHRoZSB0cmFpbGluZyB6ZXJvcyEgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICphc2NpaSsrID0gNDg7CisKKyAgICAgICAgIC8qIEFuZCBudWxsIHRlcm1pbmF0ZSB0aGUgc3RyaW5nOiAqLworICAgICAgICAgKmFzY2lpID0gMDsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgIH0KKworICAgLyogSGVyZSBvbiBidWZmZXIgdG9vIHNtYWxsLiAqLworICAgcG5nX2Vycm9yKHBuZ19wdHIsICJBU0NJSSBjb252ZXJzaW9uIGJ1ZmZlciB0b28gc21hbGwiKTsKK30KKyMgICBlbmRpZiAvKiBGSVhFRF9QT0lOVCAqLworI2VuZGlmIC8qIFNDQUwgKi8KKworI2lmIGRlZmluZWQoUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCkgJiYgXAorICAgIWRlZmluZWQoUE5HX0ZJWEVEX1BPSU5UX01BQ1JPX1NVUFBPUlRFRCkgJiYgXAorICAgKGRlZmluZWQoUE5HX2dBTUFfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19jSFJNX1NVUFBPUlRFRCkgfHwgXAorICAgZGVmaW5lZChQTkdfc0NBTF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpIHx8IFwKKyAgIGRlZmluZWQoUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVEKSkgfHwgXAorICAgKGRlZmluZWQoUE5HX3NDQUxfU1VQUE9SVEVEKSAmJiBcCisgICBkZWZpbmVkKFBOR19GTE9BVElOR19BUklUSE1FVElDX1NVUFBPUlRFRCkpCitwbmdfZml4ZWRfcG9pbnQKK3BuZ19maXhlZChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgZG91YmxlIGZwLCBwbmdfY29uc3RfY2hhcnAgdGV4dCkKK3sKKyAgIGRvdWJsZSByID0gZmxvb3IoMTAwMDAwICogZnAgKyAuNSk7CisKKyAgIGlmIChyID4gMjE0NzQ4MzY0Ny4gfHwgciA8IC0yMTQ3NDgzNjQ4LikKKyAgICAgIHBuZ19maXhlZF9lcnJvcihwbmdfcHRyLCB0ZXh0KTsKKworIyAgaWZuZGVmIFBOR19FUlJPUl9URVhUX1NVUFBPUlRFRAorICAgUE5HX1VOVVNFRCh0ZXh0KQorIyAgZW5kaWYKKworICAgcmV0dXJuIChwbmdfZml4ZWRfcG9pbnQpcjsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfR0FNTUFfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19DT0xPUlNQQUNFX1NVUFBPUlRFRCkgfHxcCisgICAgZGVmaW5lZChQTkdfSU5DSF9DT05WRVJTSU9OU19TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfcEhZc19TVVBQT1JURUQpCisvKiBtdWxkaXYgZnVuY3Rpb25zICovCisvKiBUaGlzIEFQSSB0YWtlcyBzaWduZWQgYXJndW1lbnRzIGFuZCByb3VuZHMgdGhlIHJlc3VsdCB0byB0aGUgbmVhcmVzdAorICogaW50ZWdlciAob3IsIGZvciBhIGZpeGVkIHBvaW50IG51bWJlciAtIHRoZSBzdGFuZGFyZCBhcmd1bWVudCAtIHRvCisgKiB0aGUgbmVhcmVzdCAuMDAwMDEpLiAgT3ZlcmZsb3cgYW5kIGRpdmlkZSBieSB6ZXJvIGFyZSBzaWduYWxsZWQgaW4KKyAqIHRoZSByZXN1bHQsIGEgYm9vbGVhbiAtIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gb3ZlcmZsb3cuCisgKi8KK2ludAorcG5nX211bGRpdihwbmdfZml4ZWRfcG9pbnRfcCByZXMsIHBuZ19maXhlZF9wb2ludCBhLCBwbmdfaW50XzMyIHRpbWVzLAorICAgIHBuZ19pbnRfMzIgZGl2aXNvcikKK3sKKyAgIC8qIFJldHVybiBhICogdGltZXMgLyBkaXZpc29yLCByb3VuZGVkLiAqLworICAgaWYgKGRpdmlzb3IgIT0gMCkKKyAgIHsKKyAgICAgIGlmIChhID09IDAgfHwgdGltZXMgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgICpyZXMgPSAwOworICAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisjaWZkZWYgUE5HX0ZMT0FUSU5HX0FSSVRITUVUSUNfU1VQUE9SVEVECisgICAgICAgICBkb3VibGUgciA9IGE7CisgICAgICAgICByICo9IHRpbWVzOworICAgICAgICAgciAvPSBkaXZpc29yOworICAgICAgICAgciA9IGZsb29yKHIrLjUpOworCisgICAgICAgICAvKiBBIHBuZ19maXhlZF9wb2ludCBpcyBhIDMyLWJpdCBpbnRlZ2VyLiAqLworICAgICAgICAgaWYgKHIgPD0gMjE0NzQ4MzY0Ny4gJiYgciA+PSAtMjE0NzQ4MzY0OC4pCisgICAgICAgICB7CisgICAgICAgICAgICAqcmVzID0gKHBuZ19maXhlZF9wb2ludClyOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICB9CisjZWxzZQorICAgICAgICAgaW50IG5lZ2F0aXZlID0gMDsKKyAgICAgICAgIHBuZ191aW50XzMyIEEsIFQsIEQ7CisgICAgICAgICBwbmdfdWludF8zMiBzMTYsIHMzMiwgczAwOworCisgICAgICAgICBpZiAoYSA8IDApCisgICAgICAgICAgICBuZWdhdGl2ZSA9IDEsIEEgPSAtYTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEEgPSBhOworCisgICAgICAgICBpZiAodGltZXMgPCAwKQorICAgICAgICAgICAgbmVnYXRpdmUgPSAhbmVnYXRpdmUsIFQgPSAtdGltZXM7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBUID0gdGltZXM7CisKKyAgICAgICAgIGlmIChkaXZpc29yIDwgMCkKKyAgICAgICAgICAgIG5lZ2F0aXZlID0gIW5lZ2F0aXZlLCBEID0gLWRpdmlzb3I7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBEID0gZGl2aXNvcjsKKworICAgICAgICAgLyogRm9sbG93aW5nIGNhbid0IG92ZXJmbG93IGJlY2F1c2UgdGhlIGFyZ3VtZW50cyBvbmx5CisgICAgICAgICAgKiBoYXZlIDMxIGJpdHMgZWFjaCwgaG93ZXZlciB0aGUgcmVzdWx0IG1heSBiZSAzMiBiaXRzLgorICAgICAgICAgICovCisgICAgICAgICBzMTYgPSAoQSA+PiAxNikgKiAoVCAmIDB4ZmZmZikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgKEEgJiAweGZmZmYpICogKFQgPj4gMTYpOworICAgICAgICAgLyogQ2FuJ3Qgb3ZlcmZsb3cgYmVjYXVzZSB0aGUgYSp0aW1lcyBiaXQgaXMgb25seSAzMAorICAgICAgICAgICogYml0cyBhdCBtb3N0LgorICAgICAgICAgICovCisgICAgICAgICBzMzIgPSAoQSA+PiAxNikgKiAoVCA+PiAxNikgKyAoczE2ID4+IDE2KTsKKyAgICAgICAgIHMwMCA9IChBICYgMHhmZmZmKSAqIChUICYgMHhmZmZmKTsKKworICAgICAgICAgczE2ID0gKHMxNiAmIDB4ZmZmZikgPDwgMTY7CisgICAgICAgICBzMDAgKz0gczE2OworCisgICAgICAgICBpZiAoczAwIDwgczE2KQorICAgICAgICAgICAgKytzMzI7IC8qIGNhcnJ5ICovCisKKyAgICAgICAgIGlmIChzMzIgPCBEKSAvKiBlbHNlIG92ZXJmbG93ICovCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBzMzIuczAwIGlzIG5vdyB0aGUgNjQtYml0IHByb2R1Y3QsIGRvIGEgc3RhbmRhcmQKKyAgICAgICAgICAgICAqIGRpdmlzaW9uLCB3ZSBrbm93IHRoYXQgczMyIDwgRCwgc28gdGhlIG1heGltdW0KKyAgICAgICAgICAgICAqIHJlcXVpcmVkIHNoaWZ0IGlzIDMxLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbnQgYml0c2hpZnQgPSAzMjsKKyAgICAgICAgICAgIHBuZ19maXhlZF9wb2ludCByZXN1bHQgPSAwOyAvKiBOT1RFOiBzaWduZWQgKi8KKworICAgICAgICAgICAgd2hpbGUgKC0tYml0c2hpZnQgPj0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ191aW50XzMyIGQzMiwgZDAwOworCisgICAgICAgICAgICAgICBpZiAoYml0c2hpZnQgPiAwKQorICAgICAgICAgICAgICAgICAgZDMyID0gRCA+PiAoMzItYml0c2hpZnQpLCBkMDAgPSBEIDw8IGJpdHNoaWZ0OworCisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBkMzIgPSAwLCBkMDAgPSBEOworCisgICAgICAgICAgICAgICBpZiAoczMyID4gZDMyKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKHMwMCA8IGQwMCkgLS1zMzI7IC8qIGNhcnJ5ICovCisgICAgICAgICAgICAgICAgICBzMzIgLT0gZDMyLCBzMDAgLT0gZDAwLCByZXN1bHQgKz0gMTw8Yml0c2hpZnQ7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIGlmIChzMzIgPT0gZDMyICYmIHMwMCA+PSBkMDApCisgICAgICAgICAgICAgICAgICAgICBzMzIgPSAwLCBzMDAgLT0gZDAwLCByZXN1bHQgKz0gMTw8Yml0c2hpZnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIEhhbmRsZSB0aGUgcm91bmRpbmcuICovCisgICAgICAgICAgICBpZiAoczAwID49IChEID4+IDEpKQorICAgICAgICAgICAgICAgKytyZXN1bHQ7CisKKyAgICAgICAgICAgIGlmIChuZWdhdGl2ZSAhPSAwKQorICAgICAgICAgICAgICAgcmVzdWx0ID0gLXJlc3VsdDsKKworICAgICAgICAgICAgLyogQ2hlY2sgZm9yIG92ZXJmbG93LiAqLworICAgICAgICAgICAgaWYgKChuZWdhdGl2ZSAhPSAwICYmIHJlc3VsdCA8PSAwKSB8fAorICAgICAgICAgICAgICAgIChuZWdhdGl2ZSA9PSAwICYmIHJlc3VsdCA+PSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICpyZXMgPSByZXN1bHQ7CisgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyNlbmRpZgorICAgICAgfQorICAgfQorCisgICByZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBSRUFEX0dBTU1BIHx8IElOQ0hfQ09OVkVSU0lPTlMgKi8KKworI2lmIGRlZmluZWQoUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19JTkNIX0NPTlZFUlNJT05TX1NVUFBPUlRFRCkKKy8qIFRoZSBmb2xsb3dpbmcgaXMgZm9yIHdoZW4gdGhlIGNhbGxlciBkb2Vzbid0IG11Y2ggY2FyZSBhYm91dCB0aGUKKyAqIHJlc3VsdC4KKyAqLworcG5nX2ZpeGVkX3BvaW50CitwbmdfbXVsZGl2X3dhcm4ocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19maXhlZF9wb2ludCBhLCBwbmdfaW50XzMyIHRpbWVzLAorICAgIHBuZ19pbnRfMzIgZGl2aXNvcikKK3sKKyAgIHBuZ19maXhlZF9wb2ludCByZXN1bHQ7CisKKyAgIGlmIChwbmdfbXVsZGl2KCZyZXN1bHQsIGEsIHRpbWVzLCBkaXZpc29yKSAhPSAwKQorICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgImZpeGVkIHBvaW50IG92ZXJmbG93IGlnbm9yZWQiKTsKKyAgIHJldHVybiAwOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfR0FNTUFfU1VQUE9SVEVEIC8qIG1vcmUgZml4ZWQgcG9pbnQgZnVuY3Rpb25zIGZvciBnYW1tYSAqLworLyogQ2FsY3VsYXRlIGEgcmVjaXByb2NhbCwgcmV0dXJuIDAgb24gZGl2LWJ5LXplcm8gb3Igb3ZlcmZsb3cuICovCitwbmdfZml4ZWRfcG9pbnQKK3BuZ19yZWNpcHJvY2FsKHBuZ19maXhlZF9wb2ludCBhKQoreworI2lmZGVmIFBOR19GTE9BVElOR19BUklUSE1FVElDX1NVUFBPUlRFRAorICAgZG91YmxlIHIgPSBmbG9vcigxRTEwL2ErLjUpOworCisgICBpZiAociA8PSAyMTQ3NDgzNjQ3LiAmJiByID49IC0yMTQ3NDgzNjQ4LikKKyAgICAgIHJldHVybiAocG5nX2ZpeGVkX3BvaW50KXI7CisjZWxzZQorICAgcG5nX2ZpeGVkX3BvaW50IHJlczsKKworICAgaWYgKHBuZ19tdWxkaXYoJnJlcywgMTAwMDAwLCAxMDAwMDAsIGEpICE9IDApCisgICAgICByZXR1cm4gcmVzOworI2VuZGlmCisKKyAgIHJldHVybiAwOyAvKiBlcnJvci9vdmVyZmxvdyAqLworfQorCisvKiBUaGlzIGlzIHRoZSBzaGFyZWQgdGVzdCBvbiB3aGV0aGVyIGEgZ2FtbWEgdmFsdWUgaXMgJ3NpZ25pZmljYW50JyAtIHdoZXRoZXIKKyAqIGl0IGlzIHdvcnRoIGRvaW5nIGdhbW1hIGNvcnJlY3Rpb24uCisgKi8KK2ludCAvKiBQUklWQVRFICovCitwbmdfZ2FtbWFfc2lnbmlmaWNhbnQocG5nX2ZpeGVkX3BvaW50IGdhbW1hX3ZhbCkKK3sKKyAgIHJldHVybiBnYW1tYV92YWwgPCBQTkdfRlBfMSAtIFBOR19HQU1NQV9USFJFU0hPTERfRklYRUQgfHwKKyAgICAgICBnYW1tYV92YWwgPiBQTkdfRlBfMSArIFBOR19HQU1NQV9USFJFU0hPTERfRklYRUQ7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAorI2lmZGVmIFBOR18xNkJJVF9TVVBQT1JURUQKKy8qIEEgbG9jYWwgY29udmVuaWVuY2Ugcm91dGluZS4gKi8KK3N0YXRpYyBwbmdfZml4ZWRfcG9pbnQKK3BuZ19wcm9kdWN0MihwbmdfZml4ZWRfcG9pbnQgYSwgcG5nX2ZpeGVkX3BvaW50IGIpCit7CisgICAvKiBUaGUgcmVxdWlyZWQgcmVzdWx0IGlzIDEvYSAqIDEvYjsgdGhlIGZvbGxvd2luZyBwcmVzZXJ2ZXMgYWNjdXJhY3kuICovCisjaWZkZWYgUE5HX0ZMT0FUSU5HX0FSSVRITUVUSUNfU1VQUE9SVEVECisgICBkb3VibGUgciA9IGEgKiAxRS01OworICAgciAqPSBiOworICAgciA9IGZsb29yKHIrLjUpOworCisgICBpZiAociA8PSAyMTQ3NDgzNjQ3LiAmJiByID49IC0yMTQ3NDgzNjQ4LikKKyAgICAgIHJldHVybiAocG5nX2ZpeGVkX3BvaW50KXI7CisjZWxzZQorICAgcG5nX2ZpeGVkX3BvaW50IHJlczsKKworICAgaWYgKHBuZ19tdWxkaXYoJnJlcywgYSwgYiwgMTAwMDAwKSAhPSAwKQorICAgICAgcmV0dXJuIHJlczsKKyNlbmRpZgorCisgICByZXR1cm4gMDsgLyogb3ZlcmZsb3cgKi8KK30KKyNlbmRpZiAvKiAxNkJJVCAqLworCisvKiBUaGUgaW52ZXJzZSBvZiB0aGUgYWJvdmUuICovCitwbmdfZml4ZWRfcG9pbnQKK3BuZ19yZWNpcHJvY2FsMihwbmdfZml4ZWRfcG9pbnQgYSwgcG5nX2ZpeGVkX3BvaW50IGIpCit7CisgICAvKiBUaGUgcmVxdWlyZWQgcmVzdWx0IGlzIDEvYSAqIDEvYjsgdGhlIGZvbGxvd2luZyBwcmVzZXJ2ZXMgYWNjdXJhY3kuICovCisjaWZkZWYgUE5HX0ZMT0FUSU5HX0FSSVRITUVUSUNfU1VQUE9SVEVECisgICBpZiAoYSAhPSAwICYmIGIgIT0gMCkKKyAgIHsKKyAgICAgIGRvdWJsZSByID0gMUUxNS9hOworICAgICAgciAvPSBiOworICAgICAgciA9IGZsb29yKHIrLjUpOworCisgICAgICBpZiAociA8PSAyMTQ3NDgzNjQ3LiAmJiByID49IC0yMTQ3NDgzNjQ4LikKKyAgICAgICAgIHJldHVybiAocG5nX2ZpeGVkX3BvaW50KXI7CisgICB9CisjZWxzZQorICAgLyogVGhpcyBtYXkgb3ZlcmZsb3cgYmVjYXVzZSB0aGUgcmFuZ2Ugb2YgcG5nX2ZpeGVkX3BvaW50IGlzbid0IHN5bW1ldHJpYywKKyAgICAqIGJ1dCB0aGlzIEFQSSBpcyBvbmx5IHVzZWQgZm9yIHRoZSBwcm9kdWN0IG9mIGZpbGUgYW5kIHNjcmVlbiBnYW1tYSBzbyBpdAorICAgICogZG9lc24ndCBtYXR0ZXIgdGhhdCB0aGUgc21hbGxlc3QgbnVtYmVyIGl0IGNhbiBwcm9kdWNlIGlzIDEvMjE0NzQsIG5vdAorICAgICogMS8xMDAwMDAKKyAgICAqLworICAgcG5nX2ZpeGVkX3BvaW50IHJlcyA9IHBuZ19wcm9kdWN0MihhLCBiKTsKKworICAgaWYgKHJlcyAhPSAwKQorICAgICAgcmV0dXJuIHBuZ19yZWNpcHJvY2FsKHJlcyk7CisjZW5kaWYKKworICAgcmV0dXJuIDA7IC8qIG92ZXJmbG93ICovCit9CisjZW5kaWYgLyogUkVBRF9HQU1NQSAqLworCisjaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEIC8qIGdhbW1hIHRhYmxlIGNvZGUgKi8KKyNpZm5kZWYgUE5HX0ZMT0FUSU5HX0FSSVRITUVUSUNfU1VQUE9SVEVECisvKiBGaXhlZCBwb2ludCBnYW1tYS4KKyAqCisgKiBUaGUgY29kZSB0byBjYWxjdWxhdGUgdGhlIHRhYmxlcyB1c2VkIGJlbG93IGNhbiBiZSBmb3VuZCBpbiB0aGUgc2hlbGwgc2NyaXB0CisgKiBjb250cmliL3Rvb2xzL2ludGdhbW1hLnNoCisgKgorICogVG8gY2FsY3VsYXRlIGdhbW1hIHRoaXMgY29kZSBpbXBsZW1lbnRzIGZhc3QgbG9nKCkgYW5kIGV4cCgpIGNhbGxzIHVzaW5nIG9ubHkKKyAqIGZpeGVkIHBvaW50IGFyaXRobWV0aWMuICBUaGlzIGNvZGUgaGFzIHN1ZmZpY2llbnQgcHJlY2lzaW9uIGZvciBlaXRoZXIgOC1iaXQKKyAqIG9yIDE2LWJpdCBzYW1wbGUgdmFsdWVzLgorICoKKyAqIFRoZSB0YWJsZXMgdXNlZCBoZXJlIHdlcmUgY2FsY3VsYXRlZCB1c2luZyBzaW1wbGUgJ2JjJyBwcm9ncmFtcywgYnV0IEMgZG91YmxlCisgKiBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYyB3b3VsZCB3b3JrIGZpbmUuCisgKgorICogOC1iaXQgbG9nIHRhYmxlCisgKiAgIFRoaXMgaXMgYSB0YWJsZSBvZiAtbG9nKHZhbHVlLzI1NSkvbG9nKDIpIGZvciAndmFsdWUnIGluIHRoZSByYW5nZSAxMjggdG8KKyAqICAgMjU1LCBzbyBpdCdzIHRoZSBiYXNlIDIgbG9nYXJpdGhtIG9mIGEgbm9ybWFsaXplZCA4LWJpdCBmbG9hdGluZyBwb2ludAorICogICBtYW50aXNzYS4gIFRoZSBudW1iZXJzIGFyZSAzMi1iaXQgZnJhY3Rpb25zLgorICovCitzdGF0aWMgY29uc3QgcG5nX3VpbnRfMzIKK3BuZ184Yml0X2wyWzEyOF0gPQoreworICAgNDI3MDcxNTQ5MlUsIDQyMjI0OTQ3OTdVLCA0MTc0NjQ2NDY3VSwgNDEyNzE2NDc5M1UsIDQwODAwNDQyMDFVLCA0MDMzMjc5MjM5VSwKKyAgIDM5ODY4NjQ1ODBVLCAzOTQwNzk1MDE1VSwgMzg5NTA2NTQ0OVUsIDM4NDk2NzA5MDJVLCAzODA0NjA2NDk5VSwgMzc1OTg2NzQ3NFUsCisgICAzNzE1NDQ5MTYyVSwgMzY3MTM0Njk5N1UsIDM2Mjc1NTY1MTFVLCAzNTg0MDczMzI5VSwgMzU0MDg5MzE2OFUsIDM0OTgwMTE4MzRVLAorICAgMzQ1NTQyNTIyMFUsIDM0MTMxMjkzMDFVLCAzMzcxMTIwMTM3VSwgMzMyOTM5Mzg2NFUsIDMyODc5NDY3MDBVLCAzMjQ2Nzc0OTMzVSwKKyAgIDMyMDU4NzQ5MzBVLCAzMTY1MjQzMTI1VSwgMzEyNDg3NjAyNVUsIDMwODQ3NzAyMDJVLCAzMDQ0OTIyMjk2VSwgMzAwNTMyOTAxMVUsCisgICAyOTY1OTg3MTEzVSwgMjkyNjg5MzQzMlUsIDI4ODgwNDQ4NTNVLCAyODQ5NDM4MzIzVSwgMjgxMTA3MDg0NFUsIDI3NzI5Mzk0NzRVLAorICAgMjczNTA0MTMyNlUsIDI2OTczNzM1NjJVLCAyNjU5OTMzNDAwVSwgMjYyMjcxODEwNFUsIDI1ODU3MjQ5OTFVLCAyNTQ4OTUxNDI0VSwKKyAgIDI1MTIzOTQ4MTBVLCAyNDc2MDUyNjA2VSwgMjQzOTkyMjMxMVUsIDI0MDQwMDE0NjhVLCAyMzY4Mjg3NjYzVSwgMjMzMjc3ODUyM1UsCisgICAyMjk3NDcxNzE1VSwgMjI2MjM2NDk0N1UsIDIyMjc0NTU5NjRVLCAyMTkyNzQyNTUxVSwgMjE1ODIyMjUyOVUsIDIxMjM4OTM3NTRVLAorICAgMjA4OTc1NDExOVUsIDIwNTU4MDE1NTJVLCAyMDIyMDM0MDEzVSwgMTk4ODQ0OTQ5N1UsIDE5NTUwNDYwMzFVLCAxOTIxODIxNjcyVSwKKyAgIDE4ODg3NzQ1MTFVLCAxODU1OTAyNjY4VSwgMTgyMzIwNDI5MVUsIDE3OTA2Nzc1NjBVLCAxNzU4MzIwNjgyVSwgMTcyNjEzMTg5M1UsCisgICAxNjk0MTA5NDU0VSwgMTY2MjI1MTY1N1UsIDE2MzA1NTY4MTVVLCAxNTk5MDIzMjcxVSwgMTU2NzY0OTM5MVUsIDE1MzY0MzM1NjdVLAorICAgMTUwNTM3NDIxNFUsIDE0NzQ0Njk3NzBVLCAxNDQzNzE4NzAwVSwgMTQxMzExOTQ4N1UsIDEzODI2NzA2MzlVLCAxMzUyMzcwNjg2VSwKKyAgIDEzMjIyMTgxNzlVLCAxMjkyMjExNjg5VSwgMTI2MjM0OTgxMFUsIDEyMzI2MzExNTNVLCAxMjAzMDU0MzUyVSwgMTE3MzYxODA1OVUsCisgICAxMTQ0MzIwOTQ2VSwgMTExNTE2MTcwMVUsIDEwODYxMzkwMzRVLCAxMDU3MjUxNjcyVSwgMTAyODQ5ODM1OFUsIDk5OTg3Nzg1NFUsCisgICA5NzEzODg5NDBVLCA5NDMwMzA0MTBVLCA5MTQ4MDEwNzZVLCA4ODY2OTk3NjdVLCA4NTg3MjUzMjdVLCA4MzA4NzY2MTRVLAorICAgODAzMTUyNTA1VSwgNzc1NTUxODkwVSwgNzQ4MDczNjcyVSwgNzIwNzE2NzcxVSwgNjkzNDgwMTIwVSwgNjY2MzYyNjY3VSwKKyAgIDYzOTM2MzM3NFUsIDYxMjQ4MTIxNVUsIDU4NTcxNTE3N1UsIDU1OTA2NDI2M1UsIDUzMjUyNzQ4NlUsIDUwNjEwMzg3MlUsCisgICA0Nzk3OTI0NjFVLCA0NTM1OTIzMDNVLCA0Mjc1MDI0NjNVLCA0MDE1MjIwMTRVLCAzNzU2NTAwNDNVLCAzNDk4ODU2NDhVLAorICAgMzI0MjI3OTM4VSwgMjk4Njc2MDM0VSwgMjczMjI5MDY2VSwgMjQ3ODg2MTc2VSwgMjIyNjQ2NTE2VSwgMTk3NTA5MjQ4VSwKKyAgIDE3MjQ3MzU0NVUsIDE0NzUzODU5MFUsIDEyMjcwMzU3NFUsIDk3OTY3NzAxVSwgNzMzMzAxODJVLCA0ODc5MDIzNlUsCisgICAyNDM0NzA5NlUsIDBVCisKKyNpZiAwCisgICAvKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgdmFsdWVzIGZvciAxNi1iaXQgdGFibGVzIC0gdGhlc2Ugd29yayBmaW5lIGZvciB0aGUKKyAgICAqIDgtYml0IGNvbnZlcnNpb25zIGJ1dCBwcm9kdWNlIHZlcnkgc2xpZ2h0bHkgbGFyZ2VyIGVycm9ycyBpbiB0aGUgMTYtYml0CisgICAgKiBsb2cgKGFib3V0IDEuMiBhcyBvcHBvc2VkIHRvIDAuNyBhYnNvbHV0ZSBlcnJvciBpbiB0aGUgZmluYWwgdmFsdWUpLiAgVG8KKyAgICAqIHVzZSB0aGVzZSBhbGwgdGhlIHNoaWZ0cyBiZWxvdyBtdXN0IGJlIGFkanVzdGVkIGFwcHJvcHJpYXRlbHkuCisgICAgKi8KKyAgIDY1MTY2LCA2NDQzMCwgNjM3MDAsIDYyOTc2LCA2MjI1NywgNjE1NDMsIDYwODM1LCA2MDEzMiwgNTk0MzQsIDU4NzQxLCA1ODA1NCwKKyAgIDU3MzcxLCA1NjY5MywgNTYwMjAsIDU1MzUyLCA1NDY4OSwgNTQwMzAsIDUzMzc1LCA1MjcyNiwgNTIwODAsIDUxNDM5LCA1MDgwMywKKyAgIDUwMTcwLCA0OTU0MiwgNDg5MTgsIDQ4Mjk4LCA0NzY4MiwgNDcwNzAsIDQ2NDYyLCA0NTg1OCwgNDUyNTcsIDQ0NjYxLCA0NDA2OCwKKyAgIDQzNDc5LCA0Mjg5NCwgNDIzMTIsIDQxNzMzLCA0MTE1OSwgNDA1ODcsIDQwMDIwLCAzOTQ1NSwgMzg4OTQsIDM4MzM2LCAzNzc4MiwKKyAgIDM3MjMwLCAzNjY4MiwgMzYxMzcsIDM1NTk1LCAzNTA1NywgMzQ1MjEsIDMzOTg4LCAzMzQ1OSwgMzI5MzIsIDMyNDA4LCAzMTg4NywKKyAgIDMxMzY5LCAzMDg1NCwgMzAzNDEsIDI5ODMyLCAyOTMyNSwgMjg4MjAsIDI4MzE5LCAyNzgyMCwgMjczMjQsIDI2ODMwLCAyNjMzOSwKKyAgIDI1ODUwLCAyNTM2NCwgMjQ4ODAsIDI0Mzk5LCAyMzkyMCwgMjM0NDQsIDIyOTcwLCAyMjQ5OSwgMjIwMjksIDIxNTYyLCAyMTA5OCwKKyAgIDIwNjM2LCAyMDE3NSwgMTk3MTgsIDE5MjYyLCAxODgwOCwgMTgzNTcsIDE3OTA4LCAxNzQ2MSwgMTcwMTYsIDE2NTczLCAxNjEzMiwKKyAgIDE1Njk0LCAxNTI1NywgMTQ4MjIsIDE0MzkwLCAxMzk1OSwgMTM1MzAsIDEzMTAzLCAxMjY3OCwgMTIyNTUsIDExODM0LCAxMTQxNSwKKyAgIDEwOTk3LCAxMDU4MiwgMTAxNjgsIDk3NTYsIDkzNDYsIDg5MzcsIDg1MzEsIDgxMjYsIDc3MjMsIDczMjEsIDY5MjEsIDY1MjMsCisgICA2MTI3LCA1NzMyLCA1MzM5LCA0OTQ3LCA0NTU3LCA0MTY5LCAzNzgyLCAzMzk3LCAzMDE0LCAyNjMyLCAyMjUxLCAxODcyLCAxNDk1LAorICAgMTExOSwgNzQ0LCAzNzIKKyNlbmRpZgorfTsKKworc3RhdGljIHBuZ19pbnRfMzIKK3BuZ19sb2c4Yml0KHVuc2lnbmVkIGludCB4KQoreworICAgdW5zaWduZWQgaW50IGxnMiA9IDA7CisgICAvKiBFYWNoIHRpbWUgJ3gnIGlzIG11bHRpcGxpZWQgYnkgMiwgMSBtdXN0IGJlIHN1YnRyYWN0ZWQgb2ZmIHRoZSBmaW5hbCBsb2csCisgICAgKiBiZWNhdXNlIHRoZSBsb2cgaXMgYWN0dWFsbHkgbmVnYXRlIHRoYXQgbWVhbnMgYWRkaW5nIDEuICBUaGUgZmluYWwKKyAgICAqIHJldHVybmVkIHZhbHVlIHRodXMgaGFzIHRoZSByYW5nZSAwIChmb3IgMjU1IGlucHV0KSB0byA3Ljk5NCAoZm9yIDEKKyAgICAqIGlucHV0KSwgcmV0dXJuIC0xIGZvciB0aGUgb3ZlcmZsb3cgKGxvZyAwKSBjYXNlLCAtIHNvIHRoZSByZXN1bHQgaXMKKyAgICAqIGFsd2F5cyBhdCBtb3N0IDE5IGJpdHMuCisgICAgKi8KKyAgIGlmICgoeCAmPSAweGZmKSA9PSAwKQorICAgICAgcmV0dXJuIC0xOworCisgICBpZiAoKHggJiAweGYwKSA9PSAwKQorICAgICAgbGcyICA9IDQsIHggPDw9IDQ7CisKKyAgIGlmICgoeCAmIDB4YzApID09IDApCisgICAgICBsZzIgKz0gMiwgeCA8PD0gMjsKKworICAgaWYgKCh4ICYgMHg4MCkgPT0gMCkKKyAgICAgIGxnMiArPSAxLCB4IDw8PSAxOworCisgICAvKiByZXN1bHQgaXMgYXQgbW9zdCAxOSBiaXRzLCBzbyB0aGlzIGNhc3QgaXMgc2FmZTogKi8KKyAgIHJldHVybiAocG5nX2ludF8zMikoKGxnMiA8PCAxNikgKyAoKHBuZ184Yml0X2wyW3gtMTI4XSszMjc2OCk+PjE2KSk7Cit9CisKKy8qIFRoZSBhYm92ZSBnaXZlcyBleGFjdCAodG8gMTYgYmluYXJ5IHBsYWNlcykgbG9nMiB2YWx1ZXMgZm9yIDgtYml0IGltYWdlcywKKyAqIGZvciAxNi1iaXQgaW1hZ2VzIHdlIHVzZSB0aGUgbW9zdCBzaWduaWZpY2FudCA4IGJpdHMgb2YgdGhlIDE2LWJpdCB2YWx1ZSB0bworICogZ2V0IGFuIGFwcHJveGltYXRpb24gdGhlbiBtdWx0aXBseSB0aGUgYXBwcm94aW1hdGlvbiBieSBhIGNvcnJlY3Rpb24gZmFjdG9yCisgKiBkZXRlcm1pbmVkIGJ5IHRoZSByZW1haW5pbmcgdXAgdG8gOCBiaXRzLiAgVGhpcyByZXF1aXJlcyBhbiBhZGRpdGlvbmFsIHN0ZXAKKyAqIGluIHRoZSAxNi1iaXQgY2FzZS4KKyAqCisgKiBXZSB3YW50IGxvZzIodmFsdWUvNjU1MzUpLCB3ZSBoYXZlIGxvZzIodicvMjU1KSwgd2hlcmU6CisgKgorICogICAgdmFsdWUgPSB2JyAqIDI1NiArIHYnJworICogICAgICAgICAgPSB2JyAqIGYKKyAqCisgKiBTbyBmIGlzIHZhbHVlL3YnLCB3aGljaCBpcyBlcXVhbCB0byAoMjU2K3YnJy92Jykgc2luY2UgdicgaXMgaW4gdGhlIHJhbmdlIDEyOAorICogdG8gMjU1IGFuZCB2JycgaXMgaW4gdGhlIHJhbmdlIDAgdG8gMjU1IGYgd2lsbCBiZSBpbiB0aGUgcmFuZ2UgMjU2IHRvIGxlc3MKKyAqIHRoYW4gMjU4LiAgVGhlIGZpbmFsIGZhY3RvciBhbHNvIG5lZWRzIHRvIGNvcnJlY3QgZm9yIHRoZSBmYWN0IHRoYXQgb3VyIDgtYml0CisgKiB2YWx1ZSBpcyBzY2FsZWQgYnkgMjU1LCB3aGVyZWFzIHRoZSAxNi1iaXQgdmFsdWVzIG11c3QgYmUgc2NhbGVkIGJ5IDY1NTM1LgorICoKKyAqIFRoaXMgZ2l2ZXMgYSBmaW5hbCBmb3JtdWxhIHVzaW5nIGEgY2FsY3VsYXRlZCB2YWx1ZSAneCcgd2hpY2ggaXMgdmFsdWUvdicgYW5kCisgKiBzY2FsaW5nIGJ5IDY1NTM2IHRvIG1hdGNoIHRoZSBhYm92ZSB0YWJsZToKKyAqCisgKiAgIGxvZzIoeC8yNTcpICogNjU1MzYKKyAqCisgKiBTaW5jZSB0aGVzZSBudW1iZXJzIGFyZSBzbyBjbG9zZSB0byAnMScgd2UgY2FuIHVzZSBzaW1wbGUgbGluZWFyCisgKiBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIHR3byBlbmQgdmFsdWVzIDI1Ni8yNTcgKHJlc3VsdCAtMzY4LjYxKSBhbmQgMjU4LzI1NworICogKHJlc3VsdCAzNjcuMTc5KS4gIFRoZSB2YWx1ZXMgdXNlZCBiZWxvdyBhcmUgc2NhbGVkIGJ5IGEgZnVydGhlciA2NCB0byBnaXZlCisgKiAxNi1iaXQgcHJlY2lzaW9uIGluIHRoZSBpbnRlcnBvbGF0aW9uOgorICoKKyAqIFN0YXJ0ICgyNTYpOiAtMjM1OTEKKyAqIFplcm8gICgyNTcpOiAgICAgIDAKKyAqIEVuZCAgICgyNTgpOiAgMjM0OTkKKyAqLworI2lmZGVmIFBOR18xNkJJVF9TVVBQT1JURUQKK3N0YXRpYyBwbmdfaW50XzMyCitwbmdfbG9nMTZiaXQocG5nX3VpbnRfMzIgeCkKK3sKKyAgIHVuc2lnbmVkIGludCBsZzIgPSAwOworCisgICAvKiBBcyBhYm92ZSwgYnV0IG5vdyB0aGUgaW5wdXQgaGFzIDE2IGJpdHMuICovCisgICBpZiAoKHggJj0gMHhmZmZmKSA9PSAwKQorICAgICAgcmV0dXJuIC0xOworCisgICBpZiAoKHggJiAweGZmMDApID09IDApCisgICAgICBsZzIgID0gOCwgeCA8PD0gODsKKworICAgaWYgKCh4ICYgMHhmMDAwKSA9PSAwKQorICAgICAgbGcyICs9IDQsIHggPDw9IDQ7CisKKyAgIGlmICgoeCAmIDB4YzAwMCkgPT0gMCkKKyAgICAgIGxnMiArPSAyLCB4IDw8PSAyOworCisgICBpZiAoKHggJiAweDgwMDApID09IDApCisgICAgICBsZzIgKz0gMSwgeCA8PD0gMTsKKworICAgLyogQ2FsY3VsYXRlIHRoZSBiYXNlIGxvZ2FyaXRobSBmcm9tIHRoZSB0b3AgOCBiaXRzIGFzIGEgMjgtYml0IGZyYWN0aW9uYWwKKyAgICAqIHZhbHVlLgorICAgICovCisgICBsZzIgPDw9IDI4OworICAgbGcyICs9IChwbmdfOGJpdF9sMlsoeD4+OCktMTI4XSs4KSA+PiA0OworCisgICAvKiBOb3cgd2UgbmVlZCB0byBpbnRlcnBvbGF0ZSB0aGUgZmFjdG9yLCB0aGlzIHJlcXVpcmVzIGEgZGl2aXNpb24gYnkgdGhlIHRvcAorICAgICogOCBiaXRzLiAgRG8gdGhpcyB3aXRoIG1heGltdW0gcHJlY2lzaW9uLgorICAgICovCisgICB4ID0gKCh4IDw8IDE2KSArICh4ID4+IDkpKSAvICh4ID4+IDgpOworCisgICAvKiBTaW5jZSB3ZSBkaXZpZGVkIGJ5IHRoZSB0b3AgOCBiaXRzIG9mICd4JyB0aGVyZSB3aWxsIGJlIGEgJzEnIGF0IDE8PDI0LAorICAgICogdGhlIHZhbHVlIGF0IDE8PDE2IChpZ25vcmluZyB0aGlzKSB3aWxsIGJlIDAgb3IgMTsgdGhpcyBnaXZlcyB1cyBleGFjdGx5CisgICAgKiAxNiBiaXRzIHRvIGludGVycG9sYXRlIHRvIGdldCB0aGUgbG93IGJpdHMgb2YgdGhlIHJlc3VsdC4gIFJvdW5kIHRoZQorICAgICogYW5zd2VyLiAgTm90ZSB0aGF0IHRoZSBlbmQgcG9pbnQgdmFsdWVzIGFyZSBzY2FsZWQgYnkgNjQgdG8gcmV0YWluIG92ZXJhbGwKKyAgICAqIHByZWNpc2lvbiBhbmQgdGhhdCAnbGcyJyBpcyBjdXJyZW50IHNjYWxlZCBieSBhbiBleHRyYSAxMiBiaXRzLCBzbyBhZGp1c3QKKyAgICAqIHRoZSBvdmVyYWxsIHNjYWxpbmcgYnkgNi0xMi4gIFJvdW5kIGF0IGV2ZXJ5IHN0ZXAuCisgICAgKi8KKyAgIHggLT0gMVUgPDwgMjQ7CisKKyAgIGlmICh4IDw9IDY1NTM2VSkgLyogPD0gJzI1NycgKi8KKyAgICAgIGxnMiArPSAoKDIzNTkxVSAqICg2NTUzNlUteCkpICsgKDFVIDw8ICgxNis2LTEyLTEpKSkgPj4gKDE2KzYtMTIpOworCisgICBlbHNlCisgICAgICBsZzIgLT0gKCgyMzQ5OVUgKiAoeC02NTUzNlUpKSArICgxVSA8PCAoMTYrNi0xMi0xKSkpID4+ICgxNis2LTEyKTsKKworICAgLyogU2FmZSwgYmVjYXVzZSB0aGUgcmVzdWx0IGNhbid0IGhhdmUgbW9yZSB0aGFuIDIwIGJpdHM6ICovCisgICByZXR1cm4gKHBuZ19pbnRfMzIpKChsZzIgKyAyMDQ4KSA+PiAxMik7Cit9CisjZW5kaWYgLyogMTZCSVQgKi8KKworLyogVGhlICdleHAoKScgY2FzZSBtdXN0IGludmVydCB0aGUgYWJvdmUsIHRha2luZyBhIDIwLWJpdCBmaXhlZCBwb2ludAorICogbG9nYXJpdGhtaWMgdmFsdWUgYW5kIHJldHVybmluZyBhIDE2IG9yIDgtYml0IG51bWJlciBhcyBhcHByb3ByaWF0ZS4gIEluCisgKiBlYWNoIGNhc2Ugb25seSB0aGUgbG93IDE2IGJpdHMgYXJlIHJlbGV2YW50IC0gdGhlIGZyYWN0aW9uIC0gc2luY2UgdGhlCisgKiBpbnRlZ2VyIGJpdHMgKHRoZSB0b3AgNCkgc2ltcGx5IGRldGVybWluZSBhIHNoaWZ0LgorICoKKyAqIFRoZSB3b3JzdCBjYXNlIGlzIHRoZSAxNi1iaXQgZGlzdGluY3Rpb24gYmV0d2VlbiA2NTUzNSBhbmQgNjU1MzQuIFRoaXMKKyAqIHJlcXVpcmVzIHBlcmhhcHMgc3B1cmlvdXMgYWNjdXJhY3kgaW4gdGhlIGRlY29kaW5nIG9mIHRoZSBsb2dhcml0aG0gdG8KKyAqIGRpc3Rpbmd1aXNoIGxvZzIoNjU1MzUvNjU1MzQuNSkgLSAxMF4tNSBvciAxNyBiaXRzLiAgVGhlcmUgaXMgbGl0dGxlIGNoYW5jZQorICogb2YgZ2V0dGluZyB0aGlzIGFjY3VyYWN5IGluIHByYWN0aWNlLgorICoKKyAqIFRvIGRlYWwgd2l0aCB0aGlzIHRoZSBmb2xsb3dpbmcgZXhwKCkgZnVuY3Rpb24gd29ya3Mgb3V0IHRoZSBleHBvbmVudCBvZiB0aGUKKyAqIGZyYXRpb25hbCBwYXJ0IG9mIHRoZSBsb2dhcml0aG0gYnkgdXNpbmcgYW4gYWNjdXJhdGUgMzItYml0IHZhbHVlIGZyb20gdGhlCisgKiB0b3AgZm91ciBmcmFjdGlvbmFsIGJpdHMgdGhlbiBtdWx0aXBseWluZyBpbiB0aGUgcmVtYWluaW5nIGJpdHMuCisgKi8KK3N0YXRpYyBjb25zdCBwbmdfdWludF8zMgorcG5nXzMyYml0X2V4cFsxNl0gPQoreworICAgLyogTk9URTogdGhlIGZpcnN0IGVudHJ5IGlzIGRlbGliZXJhdGVseSBzZXQgdG8gdGhlIG1heGltdW0gMzItYml0IHZhbHVlLiAqLworICAgNDI5NDk2NzI5NVUsIDQxMTI4NzQ3NzNVLCAzOTM4NTAyMzc2VSwgMzc3MTUyMjc5NlUsIDM2MTE2MjI2MDNVLCAzNDU4NTAxNjUzVSwKKyAgIDMzMTE4NzI1MjlVLCAzMTcxNDU5OTk5VSwgMzAzNzAwMDUwMFUsIDI5MDgyNDE2NDJVLCAyNzg0OTQxNzM4VSwgMjY2Njg2OTM0NVUsCisgICAyNTUzODAyODM0VSwgMjQ0NTUyOTk3MlUsIDIzNDE4NDc1MjRVLCAyMjQyNTYwODcyVQorfTsKKworLyogQWRqdXN0bWVudCB0YWJsZTsgcHJvdmlkZWQgdG8gZXhwbGFpbiB0aGUgbnVtYmVycyBpbiB0aGUgY29kZSBiZWxvdy4gKi8KKyNpZiAwCitmb3IgKGk9MTE7aT49MDstLWkpeyBwcmludCBpLCAiICIsICgxIC0gZSgtKDJeaSkvNjU1MzYqbCgyKSkpICogMl4oMzItaSksICJcbiJ9CisgICAxMSA0NDkzNy42NDI4NDg2NTU0ODc1MTIwODQ0OAorICAgMTAgNDUxODAuOTg3MzQ4NDU1ODUxMDExNjA0NDgKKyAgICA5IDQ1MzAzLjMxOTM2OTgwNjg3MzU5MzExODcyCisgICAgOCA0NTM2NC42NTExMDU5NTMyMzAxODg3MDc4NAorICAgIDcgNDUzOTUuMzU4NTAzNjE3ODk2MjQ2MTQ5MTIKKyAgICA2IDQ1NDEwLjcyMjU5NzE1MTAyMDM3NTA4MDk2CisgICAgNSA0NTQxOC40MDcyNDQxMzIyMDcyMjMxMTE2OAorICAgIDQgNDU0MjIuMjUwMjE3ODY4OTgxNzMwMDE3MjgKKyAgICAzIDQ1NDI0LjE3MTg2NzMyMjk4NDE5MDQ0MzUyCisgICAgMiA0NTQyNS4xMzI3MzI2OTk0MDgxMTQ2NDcwNAorICAgIDEgNDU0MjUuNjEzMTc1NTUwMzU1NTg2NDE2NjQKKyAgICAwIDQ1NDI1Ljg1MzM5OTUxNjU0OTQzODUwNDk2CisjZW5kaWYKKworc3RhdGljIHBuZ191aW50XzMyCitwbmdfZXhwKHBuZ19maXhlZF9wb2ludCB4KQoreworICAgaWYgKHggPiAwICYmIHggPD0gMHhmZmZmZikgLyogRWxzZSBvdmVyZmxvdyBvciB6ZXJvICh1bmRlcmZsb3cpICovCisgICB7CisgICAgICAvKiBPYnRhaW4gYSA0LWJpdCBhcHByb3hpbWF0aW9uICovCisgICAgICBwbmdfdWludF8zMiBlID0gcG5nXzMyYml0X2V4cFsoeCA+PiAxMikgJiAweDBmXTsKKworICAgICAgLyogSW5jb3Jwb3JhdGUgdGhlIGxvdyAxMiBiaXRzIC0gdGhlc2UgZGVjcmVhc2UgdGhlIHJldHVybmVkIHZhbHVlIGJ5CisgICAgICAgKiBtdWx0aXBseWluZyBieSBhIG51bWJlciBsZXNzIHRoYW4gMSBpZiB0aGUgYml0IGlzIHNldC4gIFRoZSBtdWx0aXBsaWVyCisgICAgICAgKiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhYm92ZSB0YWJsZSBhbmQgdGhlIHNoaWZ0LiBOb3RpY2UgdGhhdCB0aGUgdmFsdWVzCisgICAgICAgKiBjb252ZXJnZSBvbiA0NTQyNiBhbmQgdGhpcyBpcyB1c2VkIHRvIGFsbG93IGxpbmVhciBpbnRlcnBvbGF0aW9uIG9mIHRoZQorICAgICAgICogbG93IGJpdHMuCisgICAgICAgKi8KKyAgICAgIGlmICh4ICYgMHg4MDApCisgICAgICAgICBlIC09ICgoKGUgPj4gMTYpICogNDQ5MzhVKSArICAxNlUpID4+IDU7CisKKyAgICAgIGlmICh4ICYgMHg0MDApCisgICAgICAgICBlIC09ICgoKGUgPj4gMTYpICogNDUxODFVKSArICAzMlUpID4+IDY7CisKKyAgICAgIGlmICh4ICYgMHgyMDApCisgICAgICAgICBlIC09ICgoKGUgPj4gMTYpICogNDUzMDNVKSArICA2NFUpID4+IDc7CisKKyAgICAgIGlmICh4ICYgMHgxMDApCisgICAgICAgICBlIC09ICgoKGUgPj4gMTYpICogNDUzNjVVKSArIDEyOFUpID4+IDg7CisKKyAgICAgIGlmICh4ICYgMHgwODApCisgICAgICAgICBlIC09ICgoKGUgPj4gMTYpICogNDUzOTVVKSArIDI1NlUpID4+IDk7CisKKyAgICAgIGlmICh4ICYgMHgwNDApCisgICAgICAgICBlIC09ICgoKGUgPj4gMTYpICogNDU0MTBVKSArIDUxMlUpID4+IDEwOworCisgICAgICAvKiBBbmQgaGFuZGxlIHRoZSBsb3cgNiBiaXRzIGluIGEgc2luZ2xlIGJsb2NrLiAqLworICAgICAgZSAtPSAoKChlID4+IDE2KSAqIDM1NVUgKiAoeCAmIDB4M2ZVKSkgKyAyNTZVKSA+PiA5OworCisgICAgICAvKiBIYW5kbGUgdGhlIHVwcGVyIGJpdHMgb2YgeC4gKi8KKyAgICAgIGUgPj49IHggPj4gMTY7CisgICAgICByZXR1cm4gZTsKKyAgIH0KKworICAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCisgICBpZiAoeCA8PSAwKQorICAgICAgcmV0dXJuIHBuZ18zMmJpdF9leHBbMF07CisKKyAgIC8qIEVsc2UgdW5kZXJmbG93ICovCisgICByZXR1cm4gMDsKK30KKworc3RhdGljIHBuZ19ieXRlCitwbmdfZXhwOGJpdChwbmdfZml4ZWRfcG9pbnQgbGcyKQoreworICAgLyogR2V0IGEgMzItYml0IHZhbHVlOiAqLworICAgcG5nX3VpbnRfMzIgeCA9IHBuZ19leHAobGcyKTsKKworICAgLyogQ29udmVydCB0aGUgMzItYml0IHZhbHVlIHRvIDAuLjI1NSBieSBtdWx0aXBseWluZyBieSAyNTYtMS4gTm90ZSB0aGF0IHRoZQorICAgICogc2Vjb25kLCByb3VuZGluZywgc3RlcCBjYW4ndCBvdmVyZmxvdyBiZWNhdXNlIG9mIHRoZSBmaXJzdCwgc3VidHJhY3Rpb24sCisgICAgKiBzdGVwLgorICAgICovCisgICB4IC09IHggPj4gODsKKyAgIHJldHVybiAocG5nX2J5dGUpKCgoeCArIDB4N2ZmZmZmVSkgPj4gMjQpICYgMHhmZik7Cit9CisKKyNpZmRlZiBQTkdfMTZCSVRfU1VQUE9SVEVECitzdGF0aWMgcG5nX3VpbnRfMTYKK3BuZ19leHAxNmJpdChwbmdfZml4ZWRfcG9pbnQgbGcyKQoreworICAgLyogR2V0IGEgMzItYml0IHZhbHVlOiAqLworICAgcG5nX3VpbnRfMzIgeCA9IHBuZ19leHAobGcyKTsKKworICAgLyogQ29udmVydCB0aGUgMzItYml0IHZhbHVlIHRvIDAuLjY1NTM1IGJ5IG11bHRpcGx5aW5nIGJ5IDY1NTM2LTE6ICovCisgICB4IC09IHggPj4gMTY7CisgICByZXR1cm4gKHBuZ191aW50XzE2KSgoeCArIDMyNzY3VSkgPj4gMTYpOworfQorI2VuZGlmIC8qIDE2QklUICovCisjZW5kaWYgLyogRkxPQVRJTkdfQVJJVEhNRVRJQyAqLworCitwbmdfYnl0ZQorcG5nX2dhbW1hXzhiaXRfY29ycmVjdCh1bnNpZ25lZCBpbnQgdmFsdWUsIHBuZ19maXhlZF9wb2ludCBnYW1tYV92YWwpCit7CisgICBpZiAodmFsdWUgPiAwICYmIHZhbHVlIDwgMjU1KQorICAgeworIyAgICAgaWZkZWYgUE5HX0ZMT0FUSU5HX0FSSVRITUVUSUNfU1VQUE9SVEVECisgICAgICAgICAvKiAndmFsdWUnIGlzIHVuc2lnbmVkLCBBTlNJLUM5MCByZXF1aXJlcyB0aGUgY29tcGlsZXIgdG8gY29ycmVjdGx5CisgICAgICAgICAgKiBjb252ZXJ0IHRoaXMgdG8gYSBmbG9hdGluZyBwb2ludCB2YWx1ZS4gIFRoaXMgaW5jbHVkZXMgdmFsdWVzIHRoYXQKKyAgICAgICAgICAqIHdvdWxkIG92ZXJmbG93IGlmICd2YWx1ZScgd2VyZSB0byBiZSBjb252ZXJ0ZWQgdG8gJ2ludCcuCisgICAgICAgICAgKgorICAgICAgICAgICogQXBwYXJlbnRseSBHQ0MsIGhvd2V2ZXIsIGRvZXMgYW4gaW50ZXJtZWRpYXRlIGNvbnZlcnNpb24gdG8gKGludCkKKyAgICAgICAgICAqIG9uIHNvbWUgKEFSTSkgYnV0IG5vdCBhbGwgKHg4NikgcGxhdGZvcm1zLCBwb3NzaWJseSBiZWNhdXNlIG9mCisgICAgICAgICAgKiBoYXJkd2FyZSBGUCBsaW1pdGF0aW9ucy4gIChFLmcuIGlmIHRoZSBoYXJkd2FyZSBjb252ZXJzaW9uIGFsd2F5cworICAgICAgICAgICogYXNzdW1lcyB0aGUgaW50ZWdlciByZWdpc3RlciBjb250YWlucyBhIHNpZ25lZCB2YWx1ZS4pICBUaGlzIHJlc3VsdHMKKyAgICAgICAgICAqIGluIEFOU0ktQyB1bmRlZmluZWQgYmVoYXZpb3IgZm9yIGxhcmdlIHZhbHVlcy4KKyAgICAgICAgICAqCisgICAgICAgICAgKiBPdGhlciBpbXBsZW1lbnRhdGlvbnMgb24gdGhlIHNhbWUgbWFjaGluZSBtaWdodCBhY3R1YWxseSBiZSBBTlNJLUM5MAorICAgICAgICAgICogY29uZm9ybWFudCBhbmQgdGhlcmVmb3JlIGNvbXBpbGUgc3B1cmlvdXMgZXh0cmEgY29kZSBmb3IgdGhlIGxhcmdlCisgICAgICAgICAgKiB2YWx1ZXMuCisgICAgICAgICAgKgorICAgICAgICAgICogV2UgY2FuIGJlIHJlYXNvbmFibHkgc3VyZSB0aGF0IGFuIHVuc2lnbmVkIHRvIGZsb2F0IGNvbnZlcnNpb24KKyAgICAgICAgICAqIHdvbid0IGJlIGZhc3RlciB0aGFuIGFuIGludCB0byBmbG9hdCBvbmUuICBUaGVyZWZvcmUgdGhpcyBjb2RlCisgICAgICAgICAgKiBhc3N1bWVzIHJlc3BvbnNpYmlsaXR5IGZvciB0aGUgdW5kZWZpbmVkIGJlaGF2aW9yLCB3aGljaCBpdCBrbm93cworICAgICAgICAgICogY2FuJ3QgaGFwcGVuIGJlY2F1c2Ugb2YgdGhlIGNoZWNrIGFib3ZlLgorICAgICAgICAgICoKKyAgICAgICAgICAqIE5vdGUgdGhlIGFyZ3VtZW50IHRvIHRoaXMgcm91dGluZSBpcyBhbiAodW5zaWduZWQgaW50KSBiZWNhdXNlLCBvbgorICAgICAgICAgICogMTYtYml0IHBsYXRmb3JtcywgaXQgaXMgYXNzaWduZWQgYSB2YWx1ZSB3aGljaCBtaWdodCBiZSBvdXQgb2YKKyAgICAgICAgICAqIHJhbmdlIGZvciBhbiAoaW50KTsgdGhhdCB3b3VsZCByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW9yIGluIHRoZQorICAgICAgICAgICogY2FsbGVyIGlmIHRoZSAqYXJndW1lbnQqICgndmFsdWUnKSB3ZXJlIHRvIGJlIGRlY2xhcmVkIChpbnQpLgorICAgICAgICAgICovCisgICAgICAgICBkb3VibGUgciA9IGZsb29yKDI1NSpwb3coKGludCkvKlNBRkUqL3ZhbHVlLzI1NS4sZ2FtbWFfdmFsKi4wMDAwMSkrLjUpOworICAgICAgICAgcmV0dXJuIChwbmdfYnl0ZSlyOworIyAgICAgZWxzZQorICAgICAgICAgcG5nX2ludF8zMiBsZzIgPSBwbmdfbG9nOGJpdCh2YWx1ZSk7CisgICAgICAgICBwbmdfZml4ZWRfcG9pbnQgcmVzOworCisgICAgICAgICBpZiAocG5nX211bGRpdigmcmVzLCBnYW1tYV92YWwsIGxnMiwgUE5HX0ZQXzEpICE9IDApCisgICAgICAgICAgICByZXR1cm4gcG5nX2V4cDhiaXQocmVzKTsKKworICAgICAgICAgLyogT3ZlcmZsb3cuICovCisgICAgICAgICB2YWx1ZSA9IDA7CisjICAgICBlbmRpZgorICAgfQorCisgICByZXR1cm4gKHBuZ19ieXRlKSh2YWx1ZSAmIDB4ZmYpOworfQorCisjaWZkZWYgUE5HXzE2QklUX1NVUFBPUlRFRAorcG5nX3VpbnRfMTYKK3BuZ19nYW1tYV8xNmJpdF9jb3JyZWN0KHVuc2lnbmVkIGludCB2YWx1ZSwgcG5nX2ZpeGVkX3BvaW50IGdhbW1hX3ZhbCkKK3sKKyAgIGlmICh2YWx1ZSA+IDAgJiYgdmFsdWUgPCA2NTUzNSkKKyAgIHsKKyMgICAgIGlmZGVmIFBOR19GTE9BVElOR19BUklUSE1FVElDX1NVUFBPUlRFRAorICAgICAgICAgLyogVGhlIHNhbWUgKHVuc2lnbmVkIGludCktPihkb3VibGUpIGNvbnN0cmFpbnRzIGFwcGx5IGhlcmUgYXMgYWJvdmUsCisgICAgICAgICAgKiBob3dldmVyIGluIHRoaXMgY2FzZSB0aGUgKHVuc2lnbmVkIGludCkgdG8gKGludCkgY29udmVyc2lvbiBjYW4KKyAgICAgICAgICAqIG92ZXJmbG93IG9uIGFuIEFOU0ktQzkwIGNvbXBsaWFudCBzeXN0ZW0gc28gdGhlIGNhc3QgbmVlZHMgdG8gZW5zdXJlCisgICAgICAgICAgKiB0aGF0IHRoaXMgaXMgbm90IHBvc3NpYmxlLgorICAgICAgICAgICovCisgICAgICAgICBkb3VibGUgciA9IGZsb29yKDY1NTM1KnBvdygocG5nX2ludF8zMil2YWx1ZS82NTUzNS4sCisgICAgICAgICAgICAgICAgICAgICBnYW1tYV92YWwqLjAwMDAxKSsuNSk7CisgICAgICAgICByZXR1cm4gKHBuZ191aW50XzE2KXI7CisjICAgICBlbHNlCisgICAgICAgICBwbmdfaW50XzMyIGxnMiA9IHBuZ19sb2cxNmJpdCh2YWx1ZSk7CisgICAgICAgICBwbmdfZml4ZWRfcG9pbnQgcmVzOworCisgICAgICAgICBpZiAocG5nX211bGRpdigmcmVzLCBnYW1tYV92YWwsIGxnMiwgUE5HX0ZQXzEpICE9IDApCisgICAgICAgICAgICByZXR1cm4gcG5nX2V4cDE2Yml0KHJlcyk7CisKKyAgICAgICAgIC8qIE92ZXJmbG93LiAqLworICAgICAgICAgdmFsdWUgPSAwOworIyAgICAgZW5kaWYKKyAgIH0KKworICAgcmV0dXJuIChwbmdfdWludF8xNil2YWx1ZTsKK30KKyNlbmRpZiAvKiAxNkJJVCAqLworCisvKiBUaGlzIGRvZXMgdGhlIHJpZ2h0IHRoaW5nIGJhc2VkIG9uIHRoZSBiaXRfZGVwdGggZmllbGQgb2YgdGhlCisgKiBwbmdfc3RydWN0LCBpbnRlcnByZXRpbmcgdmFsdWVzIGFzIDgtYml0IG9yIDE2LWJpdC4gIFdoaWxlIHRoZSByZXN1bHQKKyAqIGlzIG5vbWluYWxseSBhIDE2LWJpdCB2YWx1ZSBpZiBiaXQgZGVwdGggaXMgOCB0aGVuIHRoZSByZXN1bHQgaXMKKyAqIDgtYml0IChhcyBhcmUgdGhlIGFyZ3VtZW50cy4pCisgKi8KK3BuZ191aW50XzE2IC8qIFBSSVZBVEUgKi8KK3BuZ19nYW1tYV9jb3JyZWN0KHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCB1bnNpZ25lZCBpbnQgdmFsdWUsCisgICAgcG5nX2ZpeGVkX3BvaW50IGdhbW1hX3ZhbCkKK3sKKyAgIGlmIChwbmdfcHRyLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgIHJldHVybiBwbmdfZ2FtbWFfOGJpdF9jb3JyZWN0KHZhbHVlLCBnYW1tYV92YWwpOworCisjaWZkZWYgUE5HXzE2QklUX1NVUFBPUlRFRAorICAgZWxzZQorICAgICAgcmV0dXJuIHBuZ19nYW1tYV8xNmJpdF9jb3JyZWN0KHZhbHVlLCBnYW1tYV92YWwpOworI2Vsc2UKKyAgICAgIC8qIHNob3VsZCBub3QgcmVhY2ggdGhpcyAqLworICAgICAgcmV0dXJuIDA7CisjZW5kaWYgLyogMTZCSVQgKi8KK30KKworI2lmZGVmIFBOR18xNkJJVF9TVVBQT1JURUQKKy8qIEludGVybmFsIGZ1bmN0aW9uIHRvIGJ1aWxkIGEgc2luZ2xlIDE2LWJpdCB0YWJsZSAtIHRoZSB0YWJsZSBjb25zaXN0cyBvZgorICogJ251bScgMjU2IGVudHJ5IHN1YnRhYmxlcywgd2hlcmUgJ251bScgaXMgZGV0ZXJtaW5lZCBieSAnc2hpZnQnIC0gdGhlIGFtb3VudAorICogdG8gc2hpZnQgdGhlIGlucHV0IHZhbHVlcyByaWdodCAob3IgMTYtbnVtYmVyX29mX3NpZ25pZmlhbnRfYml0cykuCisgKgorICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCB0aGUgdGFibGUgZ2V0cyBjbGVhbmVkIHVwIG9uCisgKiBwbmdfZXJyb3IgKGkuZS4gaWYgb25lIG9mIHRoZSBtYWxsb2NzIGJlbG93IGZhaWxzKSAtIGkuZS4gdGhlICp0YWJsZSBhcmd1bWVudAorICogc2hvdWxkIGJlIHNvbWV3aGVyZSB0aGF0IHdpbGwgYmUgY2xlYW5lZC4KKyAqLworc3RhdGljIHZvaWQKK3BuZ19idWlsZF8xNmJpdF90YWJsZShwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3VpbnRfMTZwcCAqcHRhYmxlLAorICAgUE5HX0NPTlNUIHVuc2lnbmVkIGludCBzaGlmdCwgUE5HX0NPTlNUIHBuZ19maXhlZF9wb2ludCBnYW1tYV92YWwpCit7CisgICAvKiBWYXJpb3VzIHZhbHVlcyBkZXJpdmVkIGZyb20gJ3NoaWZ0JzogKi8KKyAgIFBOR19DT05TVCB1bnNpZ25lZCBpbnQgbnVtID0gMVUgPDwgKDhVIC0gc2hpZnQpOworI2lmZGVmIFBOR19GTE9BVElOR19BUklUSE1FVElDX1NVUFBPUlRFRAorICAgLyogQ1NFIHRoZSBkaXZpc2lvbiBhbmQgd29yayByb3VuZCB3YWNreSBHQ0Mgd2FybmluZ3MgKHNlZSB0aGUgY29tbWVudHMKKyAgICAqIGluIHBuZ19nYW1tYV84Yml0X2NvcnJlY3QgZm9yIHdoZXJlIHRoZXNlIGNvbWUgZnJvbS4pCisgICAgKi8KKyAgIFBOR19DT05TVCBkb3VibGUgZm1heCA9IDEuLygoKHBuZ19pbnRfMzIpMSA8PCAoMTZVIC0gc2hpZnQpKS0xKTsKKyNlbmRpZgorICAgUE5HX0NPTlNUIHVuc2lnbmVkIGludCBtYXggPSAoMVUgPDwgKDE2VSAtIHNoaWZ0KSktMVU7CisgICBQTkdfQ09OU1QgdW5zaWduZWQgaW50IG1heF9ieV8yID0gMVUgPDwgKDE1VS1zaGlmdCk7CisgICB1bnNpZ25lZCBpbnQgaTsKKworICAgcG5nX3VpbnRfMTZwcCB0YWJsZSA9ICpwdGFibGUgPQorICAgICAgIChwbmdfdWludF8xNnBwKXBuZ19jYWxsb2MocG5nX3B0ciwgbnVtICogKHNpemVvZiAocG5nX3VpbnRfMTZwKSkpOworCisgICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCisgICB7CisgICAgICBwbmdfdWludF8xNnAgc3ViX3RhYmxlID0gdGFibGVbaV0gPQorICAgICAgICAgIChwbmdfdWludF8xNnApcG5nX21hbGxvYyhwbmdfcHRyLCAyNTYgKiAoc2l6ZW9mIChwbmdfdWludF8xNikpKTsKKworICAgICAgLyogVGhlICd0aHJlc2hvbGQnIHRlc3QgaXMgcmVwZWF0ZWQgaGVyZSBiZWNhdXNlIGl0IGNhbiBhcmlzZSBmb3Igb25lIG9mCisgICAgICAgKiB0aGUgMTYtYml0IHRhYmxlcyBldmVuIGlmIHRoZSBvdGhlcnMgZG9uJ3QgaGl0IGl0LgorICAgICAgICovCisgICAgICBpZiAocG5nX2dhbW1hX3NpZ25pZmljYW50KGdhbW1hX3ZhbCkgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgIC8qIFRoZSBvbGQgY29kZSB3b3VsZCBvdmVyZmxvdyBhdCB0aGUgZW5kIGFuZCB0aGlzIHdvdWxkIGNhdXNlIHRoZQorICAgICAgICAgICogJ3BvdycgZnVuY3Rpb24gdG8gcmV0dXJuIGEgcmVzdWx0ID4xLCByZXN1bHRpbmcgaW4gYW4KKyAgICAgICAgICAqIGFyaXRobWV0aWMgZXJyb3IuICBUaGlzIGNvZGUgZm9sbG93cyB0aGUgc3BlYyBleGFjdGx5OyBpZyBpcworICAgICAgICAgICogdGhlIHJlY292ZXJlZCBpbnB1dCBzYW1wbGUsIGl0IGFsd2F5cyBoYXMgOC0xNiBiaXRzLgorICAgICAgICAgICoKKyAgICAgICAgICAqIFdlIHdhbnQgaW5wdXQgKiA2NTUzNS9tYXgsIHJvdW5kZWQsIHRoZSBhcml0aG1ldGljIGZpdHMgaW4gMzIKKyAgICAgICAgICAqIGJpdHMgKHVuc2lnbmVkKSBzbyBsb25nIGFzIG1heCA8PSAzMjc2Ny4KKyAgICAgICAgICAqLworICAgICAgICAgdW5zaWduZWQgaW50IGo7CisgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjU2OyBqKyspCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfdWludF8zMiBpZyA9IChqIDw8ICg4LXNoaWZ0KSkgKyBpOworIyAgICAgICAgICAgaWZkZWYgUE5HX0ZMT0FUSU5HX0FSSVRITUVUSUNfU1VQUE9SVEVECisgICAgICAgICAgICAgICAvKiBJbmxpbmUgdGhlICdtYXgnIHNjYWxpbmcgb3BlcmF0aW9uOiAqLworICAgICAgICAgICAgICAgLyogU2VlIHBuZ19nYW1tYV84Yml0X2NvcnJlY3QgZm9yIHdoeSB0aGUgY2FzdCB0byAoaW50KSBpcworICAgICAgICAgICAgICAgICogcmVxdWlyZWQgaGVyZS4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgZG91YmxlIGQgPSBmbG9vcig2NTUzNS4qcG93KGlnKmZtYXgsIGdhbW1hX3ZhbCouMDAwMDEpKy41KTsKKyAgICAgICAgICAgICAgIHN1Yl90YWJsZVtqXSA9IChwbmdfdWludF8xNilkOworIyAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgaWYgKHNoaWZ0ICE9IDApCisgICAgICAgICAgICAgICAgICBpZyA9IChpZyAqIDY1NTM1VSArIG1heF9ieV8yKS9tYXg7CisKKyAgICAgICAgICAgICAgIHN1Yl90YWJsZVtqXSA9IHBuZ19nYW1tYV8xNmJpdF9jb3JyZWN0KGlnLCBnYW1tYV92YWwpOworIyAgICAgICAgICAgZW5kaWYKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIC8qIFdlIG11c3Qgc3RpbGwgYnVpbGQgYSB0YWJsZSwgYnV0IGRvIGl0IHRoZSBmYXN0IHdheS4gKi8KKyAgICAgICAgIHVuc2lnbmVkIGludCBqOworCisgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjU2OyBqKyspCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfdWludF8zMiBpZyA9IChqIDw8ICg4LXNoaWZ0KSkgKyBpOworCisgICAgICAgICAgICBpZiAoc2hpZnQgIT0gMCkKKyAgICAgICAgICAgICAgIGlnID0gKGlnICogNjU1MzVVICsgbWF4X2J5XzIpL21heDsKKworICAgICAgICAgICAgc3ViX3RhYmxlW2pdID0gKHBuZ191aW50XzE2KWlnOworICAgICAgICAgfQorICAgICAgfQorICAgfQorfQorCisvKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIGV4cGVjdHMgdGhlICppbnZlcnNlKiBvZiB0aGUgb3ZlcmFsbCBnYW1tYSB0cmFuc2Zvcm1hdGlvbgorICogcmVxdWlyZWQuCisgKi8KK3N0YXRpYyB2b2lkCitwbmdfYnVpbGRfMTZ0bzhfdGFibGUocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ191aW50XzE2cHAgKnB0YWJsZSwKKyAgIFBOR19DT05TVCB1bnNpZ25lZCBpbnQgc2hpZnQsIFBOR19DT05TVCBwbmdfZml4ZWRfcG9pbnQgZ2FtbWFfdmFsKQoreworICAgUE5HX0NPTlNUIHVuc2lnbmVkIGludCBudW0gPSAxVSA8PCAoOFUgLSBzaGlmdCk7CisgICBQTkdfQ09OU1QgdW5zaWduZWQgaW50IG1heCA9ICgxVSA8PCAoMTZVIC0gc2hpZnQpKS0xVTsKKyAgIHVuc2lnbmVkIGludCBpOworICAgcG5nX3VpbnRfMzIgbGFzdDsKKworICAgcG5nX3VpbnRfMTZwcCB0YWJsZSA9ICpwdGFibGUgPQorICAgICAgIChwbmdfdWludF8xNnBwKXBuZ19jYWxsb2MocG5nX3B0ciwgbnVtICogKHNpemVvZiAocG5nX3VpbnRfMTZwKSkpOworCisgICAvKiAnbnVtJyBpcyB0aGUgbnVtYmVyIG9mIHRhYmxlcyBhbmQgYWxzbyB0aGUgbnVtYmVyIG9mIGxvdyBiaXRzIG9mIGxvdworICAgICogYml0cyBvZiB0aGUgaW5wdXQgMTYtYml0IHZhbHVlIHVzZWQgdG8gc2VsZWN0IGEgdGFibGUuICBFYWNoIHRhYmxlIGlzCisgICAgKiBpdHNlbGYgaW5kZXhlZCBieSB0aGUgaGlnaCA4IGJpdHMgb2YgdGhlIHZhbHVlLgorICAgICovCisgICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCisgICAgICB0YWJsZVtpXSA9IChwbmdfdWludF8xNnApcG5nX21hbGxvYyhwbmdfcHRyLAorICAgICAgICAgIDI1NiAqIChzaXplb2YgKHBuZ191aW50XzE2KSkpOworCisgICAvKiAnZ2FtbWFfdmFsJyBpcyBzZXQgdG8gdGhlIHJlY2lwcm9jYWwgb2YgdGhlIHZhbHVlIGNhbGN1bGF0ZWQgYWJvdmUsIHNvCisgICAgKiBwb3cob3V0LGcpIGlzIGFuICppbnB1dCogdmFsdWUuICAnbGFzdCcgaXMgdGhlIGxhc3QgaW5wdXQgdmFsdWUgc2V0LgorICAgICoKKyAgICAqIEluIHRoZSBsb29wICdpJyBpcyB1c2VkIHRvIGZpbmQgb3V0cHV0IHZhbHVlcy4gIFNpbmNlIHRoZSBvdXRwdXQgaXMKKyAgICAqIDgtYml0IHRoZXJlIGFyZSBvbmx5IDI1NiBwb3NzaWJsZSB2YWx1ZXMuICBUaGUgdGFibGVzIGFyZSBzZXQgdXAgdG8KKyAgICAqIHNlbGVjdCB0aGUgY2xvc2VzdCBwb3NzaWJsZSBvdXRwdXQgdmFsdWUgZm9yIGVhY2ggaW5wdXQgYnkgZmluZGluZworICAgICogdGhlIGlucHV0IHZhbHVlIGF0IHRoZSBib3VuZGFyeSBiZXR3ZWVuIGVhY2ggcGFpciBvZiBvdXRwdXQgdmFsdWVzCisgICAgKiBhbmQgZmlsbGluZyB0aGUgdGFibGUgdXAgdG8gdGhhdCBib3VuZGFyeSB3aXRoIHRoZSBsb3dlciBvdXRwdXQKKyAgICAqIHZhbHVlLgorICAgICoKKyAgICAqIFRoZSBib3VuZGFyeSB2YWx1ZXMgYXJlIDAuNSwxLjUuLjI1My41LDI1NC41LiAgU2luY2UgdGhlc2UgYXJlIDktYml0CisgICAgKiB2YWx1ZXMgdGhlIGNvZGUgYmVsb3cgdXNlcyBhIDE2LWJpdCB2YWx1ZSBpbiBpOyB0aGUgdmFsdWVzIHN0YXJ0IGF0CisgICAgKiAxMjguNSAoZm9yIDAuNSkgYW5kIHN0ZXAgYnkgMjU3LCBmb3IgYSB0b3RhbCBvZiAyNTQgdmFsdWVzICh0aGUgbGFzdAorICAgICogZW50cmllcyBhcmUgZmlsbGVkIHdpdGggMjU1KS4gIFN0YXJ0IGkgYXQgMTI4IGFuZCBmaWxsIGFsbCAnbGFzdCcKKyAgICAqIHRhYmxlIGVudHJpZXMgPD0gJ21heCcKKyAgICAqLworICAgbGFzdCA9IDA7CisgICBmb3IgKGkgPSAwOyBpIDwgMjU1OyArK2kpIC8qIDgtYml0IG91dHB1dCB2YWx1ZSAqLworICAgeworICAgICAgLyogRmluZCB0aGUgY29ycmVzcG9uZGluZyBtYXhpbXVtIGlucHV0IHZhbHVlICovCisgICAgICBwbmdfdWludF8xNiBvdXQgPSAocG5nX3VpbnRfMTYpKGkgKiAyNTdVKTsgLyogMTYtYml0IG91dHB1dCB2YWx1ZSAqLworCisgICAgICAvKiBGaW5kIHRoZSBib3VuZGFyeSB2YWx1ZSBpbiAxNiBiaXRzOiAqLworICAgICAgcG5nX3VpbnRfMzIgYm91bmQgPSBwbmdfZ2FtbWFfMTZiaXRfY29ycmVjdChvdXQrMTI4VSwgZ2FtbWFfdmFsKTsKKworICAgICAgLyogQWRqdXN0IChyb3VuZCkgdG8gKDE2LXNoaWZ0KSBiaXRzOiAqLworICAgICAgYm91bmQgPSAoYm91bmQgKiBtYXggKyAzMjc2OFUpLzY1NTM1VSArIDFVOworCisgICAgICB3aGlsZSAobGFzdCA8IGJvdW5kKQorICAgICAgeworICAgICAgICAgdGFibGVbbGFzdCAmICgweGZmVSA+PiBzaGlmdCldW2xhc3QgPj4gKDhVIC0gc2hpZnQpXSA9IG91dDsKKyAgICAgICAgIGxhc3QrKzsKKyAgICAgIH0KKyAgIH0KKworICAgLyogQW5kIGZpbGwgaW4gdGhlIGZpbmFsIGVudHJpZXMuICovCisgICB3aGlsZSAobGFzdCA8IChudW0gPDwgOCkpCisgICB7CisgICAgICB0YWJsZVtsYXN0ICYgKDB4ZmYgPj4gc2hpZnQpXVtsYXN0ID4+ICg4VSAtIHNoaWZ0KV0gPSA2NTUzNVU7CisgICAgICBsYXN0Kys7CisgICB9Cit9CisjZW5kaWYgLyogMTZCSVQgKi8KKworLyogQnVpbGQgYSBzaW5nbGUgOC1iaXQgdGFibGU6IHNhbWUgYXMgdGhlIDE2LWJpdCBjYXNlIGJ1dCBtdWNoIHNpbXBsZXIgKGFuZAorICogdHlwaWNhbGx5IG11Y2ggZmFzdGVyKS4gIE5vdGUgdGhhdCBsaWJwbmcgY3VycmVudGx5IGRvZXMgbm8gc0JJVCBwcm9jZXNzaW5nCisgKiAoYXBwYXJlbnRseSBjb250cmFyeSB0byB0aGUgc3BlYykgc28gYSAyNTYtZW50cnkgdGFibGUgaXMgYWx3YXlzIGdlbmVyYXRlZC4KKyAqLworc3RhdGljIHZvaWQKK3BuZ19idWlsZF84Yml0X3RhYmxlKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfYnl0ZXBwIHB0YWJsZSwKKyAgIFBOR19DT05TVCBwbmdfZml4ZWRfcG9pbnQgZ2FtbWFfdmFsKQoreworICAgdW5zaWduZWQgaW50IGk7CisgICBwbmdfYnl0ZXAgdGFibGUgPSAqcHRhYmxlID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsIDI1Nik7CisKKyAgIGlmIChwbmdfZ2FtbWFfc2lnbmlmaWNhbnQoZ2FtbWFfdmFsKSAhPSAwKQorICAgICAgZm9yIChpPTA7IGk8MjU2OyBpKyspCisgICAgICAgICB0YWJsZVtpXSA9IHBuZ19nYW1tYV84Yml0X2NvcnJlY3QoaSwgZ2FtbWFfdmFsKTsKKworICAgZWxzZQorICAgICAgZm9yIChpPTA7IGk8MjU2OyArK2kpCisgICAgICAgICB0YWJsZVtpXSA9IChwbmdfYnl0ZSkoaSAmIDB4ZmYpOworfQorCisvKiBVc2VkIGZyb20gcG5nX3JlYWRfZGVzdHJveSBhbmQgYmVsb3cgdG8gcmVsZWFzZSB0aGUgbWVtb3J5IHVzZWQgYnkgdGhlIGdhbW1hCisgKiB0YWJsZXMuCisgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2Rlc3Ryb3lfZ2FtbWFfdGFibGUocG5nX3N0cnVjdHJwIHBuZ19wdHIpCit7CisgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5nYW1tYV90YWJsZSk7CisgICBwbmdfcHRyLT5nYW1tYV90YWJsZSA9IE5VTEw7CisKKyNpZmRlZiBQTkdfMTZCSVRfU1VQUE9SVEVECisgICBpZiAocG5nX3B0ci0+Z2FtbWFfMTZfdGFibGUgIT0gTlVMTCkKKyAgIHsKKyAgICAgIGludCBpOworICAgICAgaW50IGlzdG9wID0gKDEgPDwgKDggLSBwbmdfcHRyLT5nYW1tYV9zaGlmdCkpOworICAgICAgZm9yIChpID0gMDsgaSA8IGlzdG9wOyBpKyspCisgICAgICB7CisgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5nYW1tYV8xNl90YWJsZVtpXSk7CisgICAgICB9CisgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5nYW1tYV8xNl90YWJsZSk7CisgICBwbmdfcHRyLT5nYW1tYV8xNl90YWJsZSA9IE5VTEw7CisgICB9CisjZW5kaWYgLyogMTZCSVQgKi8KKworI2lmIGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpIHx8IFwKKyAgIGRlZmluZWQoUE5HX1JFQURfQUxQSEFfTU9ERV9TVVBQT1JURUQpIHx8IFwKKyAgIGRlZmluZWQoUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVEKQorICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Z2FtbWFfZnJvbV8xKTsKKyAgIHBuZ19wdHItPmdhbW1hX2Zyb21fMSA9IE5VTEw7CisgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5nYW1tYV90b18xKTsKKyAgIHBuZ19wdHItPmdhbW1hX3RvXzEgPSBOVUxMOworCisjaWZkZWYgUE5HXzE2QklUX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHItPmdhbW1hXzE2X2Zyb21fMSAhPSBOVUxMKQorICAgeworICAgICAgaW50IGk7CisgICAgICBpbnQgaXN0b3AgPSAoMSA8PCAoOCAtIHBuZ19wdHItPmdhbW1hX3NoaWZ0KSk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrKykKKyAgICAgIHsKKyAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmdhbW1hXzE2X2Zyb21fMVtpXSk7CisgICAgICB9CisgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5nYW1tYV8xNl9mcm9tXzEpOworICAgcG5nX3B0ci0+Z2FtbWFfMTZfZnJvbV8xID0gTlVMTDsKKyAgIH0KKyAgIGlmIChwbmdfcHRyLT5nYW1tYV8xNl90b18xICE9IE5VTEwpCisgICB7CisgICAgICBpbnQgaTsKKyAgICAgIGludCBpc3RvcCA9ICgxIDw8ICg4IC0gcG5nX3B0ci0+Z2FtbWFfc2hpZnQpKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBpc3RvcDsgaSsrKQorICAgICAgeworICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Z2FtbWFfMTZfdG9fMVtpXSk7CisgICAgICB9CisgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5nYW1tYV8xNl90b18xKTsKKyAgIHBuZ19wdHItPmdhbW1hXzE2X3RvXzEgPSBOVUxMOworICAgfQorI2VuZGlmIC8qIDE2QklUICovCisjZW5kaWYgLyogUkVBRF9CQUNLR1JPVU5EIHx8IFJFQURfQUxQSEFfTU9ERSB8fCBSR0JfVE9fR1JBWSAqLworfQorCisvKiBXZSBidWlsZCB0aGUgOC0gb3IgMTYtYml0IGdhbW1hIHRhYmxlcyBoZXJlLiAgTm90ZSB0aGF0IGZvciAxNi1iaXQKKyAqIHRhYmxlcywgd2UgZG9uJ3QgbWFrZSBhIGZ1bGwgdGFibGUgaWYgd2UgYXJlIHJlZHVjaW5nIHRvIDgtYml0IGluCisgKiB0aGUgZnV0dXJlLiAgTm90ZSBhbHNvIGhvdyB0aGUgZ2FtbWFfMTYgdGFibGVzIGFyZSBzZWdtZW50ZWQgc28gdGhhdAorICogd2UgZG9uJ3QgbmVlZCB0byBhbGxvY2F0ZSA+IDY0SyBjaHVua3MgZm9yIGEgZnVsbCAxNi1iaXQgdGFibGUuCisgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2J1aWxkX2dhbW1hX3RhYmxlKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgYml0X2RlcHRoKQoreworICBwbmdfZGVidWcoMSwgImluIHBuZ19idWlsZF9nYW1tYV90YWJsZSIpOworCisgIC8qIFJlbW92ZSBhbnkgZXhpc3RpbmcgdGFibGU7IHRoaXMgY29wZXMgd2l0aCBtdWx0aXBsZSBjYWxscyB0bworICAgKiBwbmdfcmVhZF91cGRhdGVfaW5mby4gIFRoZSB3YXJuaW5nIGlzIGJlY2F1c2UgYnVpbGRpbmcgdGhlIGdhbW1hIHRhYmxlcworICAgKiBtdWx0aXBsZSB0aW1lcyBpcyBhIHBlcmZvcm1hbmNlIGhpdCAtIGl0J3MgaGFybWxlc3MgYnV0IHRoZSBhYmlsaXR5IHRvIGNhbGwKKyAgICogcG5nX3JlYWRfdXBkYXRlX2luZm8oKSBtdWx0aXBsZSB0aW1lcyBpcyBuZXcgaW4gMS41LjYgc28gaXQgc2VlbXMgc2Vuc2libGUKKyAgICogdG8gd2FybiBpZiB0aGUgYXBwIGludHJvZHVjZXMgc3VjaCBhIGhpdC4KKyAgICovCisgIGlmIChwbmdfcHRyLT5nYW1tYV90YWJsZSAhPSBOVUxMIHx8IHBuZ19wdHItPmdhbW1hXzE2X3RhYmxlICE9IE5VTEwpCisgIHsKKyAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiZ2FtbWEgdGFibGUgYmVpbmcgcmVidWlsdCIpOworICAgIHBuZ19kZXN0cm95X2dhbW1hX3RhYmxlKHBuZ19wdHIpOworICB9CisKKyAgaWYgKGJpdF9kZXB0aCA8PSA4KQorICB7CisgICAgIHBuZ19idWlsZF84Yml0X3RhYmxlKHBuZ19wdHIsICZwbmdfcHRyLT5nYW1tYV90YWJsZSwKKyAgICAgICAgIHBuZ19wdHItPnNjcmVlbl9nYW1tYSA+IDAgPyAgcG5nX3JlY2lwcm9jYWwyKHBuZ19wdHItPmNvbG9yc3BhY2UuZ2FtbWEsCisgICAgICAgICBwbmdfcHRyLT5zY3JlZW5fZ2FtbWEpIDogUE5HX0ZQXzEpOworCisjaWYgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkgfHwgXAorICAgZGVmaW5lZChQTkdfUkVBRF9BTFBIQV9NT0RFX1NVUFBPUlRFRCkgfHwgXAorICAgZGVmaW5lZChQTkdfUkVBRF9SR0JfVE9fR1JBWV9TVVBQT1JURUQpCisgICAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgKFBOR19DT01QT1NFIHwgUE5HX1JHQl9UT19HUkFZKSkgIT0gMCkKKyAgICAgeworICAgICAgICBwbmdfYnVpbGRfOGJpdF90YWJsZShwbmdfcHRyLCAmcG5nX3B0ci0+Z2FtbWFfdG9fMSwKKyAgICAgICAgICAgIHBuZ19yZWNpcHJvY2FsKHBuZ19wdHItPmNvbG9yc3BhY2UuZ2FtbWEpKTsKKworICAgICAgICBwbmdfYnVpbGRfOGJpdF90YWJsZShwbmdfcHRyLCAmcG5nX3B0ci0+Z2FtbWFfZnJvbV8xLAorICAgICAgICAgICAgcG5nX3B0ci0+c2NyZWVuX2dhbW1hID4gMCA/ICBwbmdfcmVjaXByb2NhbChwbmdfcHRyLT5zY3JlZW5fZ2FtbWEpIDoKKyAgICAgICAgICAgIHBuZ19wdHItPmNvbG9yc3BhY2UuZ2FtbWEvKiBQcm9iYWJseSBkb2luZyByZ2JfdG9fZ3JheSAqLyk7CisgICAgIH0KKyNlbmRpZiAvKiBSRUFEX0JBQ0tHUk9VTkQgfHwgUkVBRF9BTFBIQV9NT0RFIHx8IFJHQl9UT19HUkFZICovCisgIH0KKyNpZmRlZiBQTkdfMTZCSVRfU1VQUE9SVEVECisgIGVsc2UKKyAgeworICAgICBwbmdfYnl0ZSBzaGlmdCwgc2lnX2JpdDsKKworICAgICBpZiAoKHBuZ19wdHItPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikgIT0gMCkKKyAgICAgeworICAgICAgICBzaWdfYml0ID0gcG5nX3B0ci0+c2lnX2JpdC5yZWQ7CisKKyAgICAgICAgaWYgKHBuZ19wdHItPnNpZ19iaXQuZ3JlZW4gPiBzaWdfYml0KQorICAgICAgICAgICBzaWdfYml0ID0gcG5nX3B0ci0+c2lnX2JpdC5ncmVlbjsKKworICAgICAgICBpZiAocG5nX3B0ci0+c2lnX2JpdC5ibHVlID4gc2lnX2JpdCkKKyAgICAgICAgICAgc2lnX2JpdCA9IHBuZ19wdHItPnNpZ19iaXQuYmx1ZTsKKyAgICAgfQorICAgICBlbHNlCisgICAgICAgIHNpZ19iaXQgPSBwbmdfcHRyLT5zaWdfYml0LmdyYXk7CisKKyAgICAgLyogMTYtYml0IGdhbW1hIGNvZGUgdXNlcyB0aGlzIGVxdWF0aW9uOgorICAgICAgKgorICAgICAgKiAgIG92ID0gdGFibGVbKGl2ICYgMHhmZikgPj4gZ2FtbWFfc2hpZnRdW2l2ID4+IDhdCisgICAgICAqCisgICAgICAqIFdoZXJlICdpdicgaXMgdGhlIGlucHV0IGNvbG9yIHZhbHVlIGFuZCAnb3YnIGlzIHRoZSBvdXRwdXQgdmFsdWUgLQorICAgICAgKiBwb3coaXYsIGdhbW1hKS4KKyAgICAgICoKKyAgICAgICogVGh1cyB0aGUgZ2FtbWEgdGFibGUgY29uc2lzdHMgb2YgdXAgdG8gMjU2IDI1Ni1lbnRyeSB0YWJsZXMuICBUaGUgdGFibGUKKyAgICAgICogaXMgc2VsZWN0ZWQgYnkgdGhlICg4LWdhbW1hX3NoaWZ0KSBtb3N0IHNpZ25pZmljYW50IG9mIHRoZSBsb3cgOCBiaXRzIG9mCisgICAgICAqIHRoZSBjb2xvciB2YWx1ZSB0aGVuIGluZGV4ZWQgYnkgdGhlIHVwcGVyIDggYml0czoKKyAgICAgICoKKyAgICAgICogICB0YWJsZVtsb3cgYml0c11baGlnaCA4IGJpdHNdCisgICAgICAqCisgICAgICAqIFNvIHRoZSB0YWJsZSAnbicgY29ycmVzcG9uZHMgdG8gYWxsIHRob3NlICdpdicgb2Y6CisgICAgICAqCisgICAgICAqICAgPGFsbCBoaWdoIDgtYml0IHZhbHVlcz48biA8PCBnYW1tYV9zaGlmdD4uLjwobisxIDw8IGdhbW1hX3NoaWZ0KS0xPgorICAgICAgKgorICAgICAgKi8KKyAgICAgaWYgKHNpZ19iaXQgPiAwICYmIHNpZ19iaXQgPCAxNlUpCisgICAgICAgIC8qIHNoaWZ0ID09IGluc2lnbmlmaWNhbnQgYml0cyAqLworICAgICAgICBzaGlmdCA9IChwbmdfYnl0ZSkoKDE2VSAtIHNpZ19iaXQpICYgMHhmZik7CisKKyAgICAgZWxzZQorICAgICAgICBzaGlmdCA9IDA7IC8qIGtlZXAgYWxsIDE2IGJpdHMgKi8KKworICAgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIChQTkdfMTZfVE9fOCB8IFBOR19TQ0FMRV8xNl9UT184KSkgIT0gMCkKKyAgICAgeworICAgICAgICAvKiBQTkdfTUFYX0dBTU1BXzggaXMgdGhlIG51bWJlciBvZiBiaXRzIHRvIGtlZXAgLSBlZmZlY3RpdmVseQorICAgICAgICAgKiB0aGUgc2lnbmlmaWNhbnQgYml0cyBpbiB0aGUgKmlucHV0KiB3aGVuIHRoZSBvdXRwdXQgd2lsbAorICAgICAgICAgKiBldmVudHVhbGx5IGJlIDggYml0cy4gIEJ5IGRlZmF1bHQgaXQgaXMgMTEuCisgICAgICAgICAqLworICAgICAgICBpZiAoc2hpZnQgPCAoMTZVIC0gUE5HX01BWF9HQU1NQV84KSkKKyAgICAgICAgICAgc2hpZnQgPSAoMTZVIC0gUE5HX01BWF9HQU1NQV84KTsKKyAgICAgfQorCisgICAgIGlmIChzaGlmdCA+IDhVKQorICAgICAgICBzaGlmdCA9IDhVOyAvKiBHdWFyYW50ZWVzIGF0IGxlYXN0IG9uZSB0YWJsZSEgKi8KKworICAgICBwbmdfcHRyLT5nYW1tYV9zaGlmdCA9IHNoaWZ0OworCisgICAgIC8qIE5PVEU6IHByaW9yIHRvIDEuNS40IHRoaXMgdGVzdCB1c2VkIHRvIGluY2x1ZGUgUE5HX0JBQ0tHUk9VTkQgKG5vdworICAgICAgKiBQTkdfQ09NUE9TRSkuICBUaGlzIGVmZmVjdGl2ZWx5IHNtYXNoZWQgdGhlIGJhY2tncm91bmQgY2FsY3VsYXRpb24gZm9yCisgICAgICAqIDE2LWJpdCBvdXRwdXQgYmVjYXVzZSB0aGUgOC1iaXQgdGFibGUgYXNzdW1lcyB0aGUgcmVzdWx0IHdpbGwgYmUgcmVkdWNlZAorICAgICAgKiB0byA4IGJpdHMuCisgICAgICAqLworICAgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIChQTkdfMTZfVE9fOCB8IFBOR19TQ0FMRV8xNl9UT184KSkgIT0gMCkKKyAgICAgICAgIHBuZ19idWlsZF8xNnRvOF90YWJsZShwbmdfcHRyLCAmcG5nX3B0ci0+Z2FtbWFfMTZfdGFibGUsIHNoaWZ0LAorICAgICAgICAgcG5nX3B0ci0+c2NyZWVuX2dhbW1hID4gMCA/IHBuZ19wcm9kdWN0MihwbmdfcHRyLT5jb2xvcnNwYWNlLmdhbW1hLAorICAgICAgICAgcG5nX3B0ci0+c2NyZWVuX2dhbW1hKSA6IFBOR19GUF8xKTsKKworICAgICBlbHNlCisgICAgICAgICBwbmdfYnVpbGRfMTZiaXRfdGFibGUocG5nX3B0ciwgJnBuZ19wdHItPmdhbW1hXzE2X3RhYmxlLCBzaGlmdCwKKyAgICAgICAgIHBuZ19wdHItPnNjcmVlbl9nYW1tYSA+IDAgPyBwbmdfcmVjaXByb2NhbDIocG5nX3B0ci0+Y29sb3JzcGFjZS5nYW1tYSwKKyAgICAgICAgIHBuZ19wdHItPnNjcmVlbl9nYW1tYSkgOiBQTkdfRlBfMSk7CisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKSB8fCBcCisgICBkZWZpbmVkKFBOR19SRUFEX0FMUEhBX01PREVfU1VQUE9SVEVEKSB8fCBcCisgICBkZWZpbmVkKFBOR19SRUFEX1JHQl9UT19HUkFZX1NVUFBPUlRFRCkKKyAgICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiAoUE5HX0NPTVBPU0UgfCBQTkdfUkdCX1RPX0dSQVkpKSAhPSAwKQorICAgICB7CisgICAgICAgIHBuZ19idWlsZF8xNmJpdF90YWJsZShwbmdfcHRyLCAmcG5nX3B0ci0+Z2FtbWFfMTZfdG9fMSwgc2hpZnQsCisgICAgICAgICAgICBwbmdfcmVjaXByb2NhbChwbmdfcHRyLT5jb2xvcnNwYWNlLmdhbW1hKSk7CisKKyAgICAgICAgLyogTm90aWNlIHRoYXQgdGhlICcxNiBmcm9tIDEnIHRhYmxlIHNob3VsZCBiZSBmdWxsIHByZWNpc2lvbiwgaG93ZXZlcgorICAgICAgICAgKiB0aGUgbG9va3VwIG9uIHRoaXMgdGFibGUgc3RpbGwgdXNlcyBnYW1tYV9zaGlmdCwgc28gaXQgY2FuJ3QgYmUuCisgICAgICAgICAqIFRPRE86IGZpeCB0aGlzLgorICAgICAgICAgKi8KKyAgICAgICAgcG5nX2J1aWxkXzE2Yml0X3RhYmxlKHBuZ19wdHIsICZwbmdfcHRyLT5nYW1tYV8xNl9mcm9tXzEsIHNoaWZ0LAorICAgICAgICAgICAgcG5nX3B0ci0+c2NyZWVuX2dhbW1hID4gMCA/IHBuZ19yZWNpcHJvY2FsKHBuZ19wdHItPnNjcmVlbl9nYW1tYSkgOgorICAgICAgICAgICAgcG5nX3B0ci0+Y29sb3JzcGFjZS5nYW1tYS8qIFByb2JhYmx5IGRvaW5nIHJnYl90b19ncmF5ICovKTsKKyAgICAgfQorI2VuZGlmIC8qIFJFQURfQkFDS0dST1VORCB8fCBSRUFEX0FMUEhBX01PREUgfHwgUkdCX1RPX0dSQVkgKi8KKyAgfQorI2VuZGlmIC8qIDE2QklUICovCit9CisjZW5kaWYgLyogUkVBRF9HQU1NQSAqLworCisvKiBIQVJEV0FSRSBPUiBTT0ZUV0FSRSBPUFRJT04gU1VQUE9SVCAqLworI2lmZGVmIFBOR19TRVRfT1BUSU9OX1NVUFBPUlRFRAoraW50IFBOR0FQSQorcG5nX3NldF9vcHRpb24ocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBvcHRpb24sIGludCBvbm9mZikKK3sKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgb3B0aW9uID49IDAgJiYgb3B0aW9uIDwgUE5HX09QVElPTl9ORVhUICYmCisgICAgICAob3B0aW9uICYgMSkgPT0gMCkKKyAgIHsKKyAgICAgIGludCBtYXNrID0gMyA8PCBvcHRpb247CisgICAgICBpbnQgc2V0dGluZyA9ICgyICsgKG9ub2ZmICE9IDApKSA8PCBvcHRpb247CisgICAgICBpbnQgY3VycmVudCA9IHBuZ19wdHItPm9wdGlvbnM7CisKKyAgICAgIHBuZ19wdHItPm9wdGlvbnMgPSAocG5nX2J5dGUpKCgoY3VycmVudCAmIH5tYXNrKSB8IHNldHRpbmcpICYgMHhmZik7CisKKyAgICAgIHJldHVybiAoY3VycmVudCAmIG1hc2spID4+IG9wdGlvbjsKKyAgIH0KKworICAgcmV0dXJuIFBOR19PUFRJT05fSU5WQUxJRDsKK30KKyNlbmRpZgorCisvKiBzUkdCIHN1cHBvcnQgKi8KKyNpZiBkZWZpbmVkKFBOR19TSU1QTElGSUVEX1JFQURfU1VQUE9SVEVEKSB8fFwKKyAgIGRlZmluZWQoUE5HX1NJTVBMSUZJRURfV1JJVEVfU1VQUE9SVEVEKQorLyogc1JHQiBjb252ZXJzaW9uIHRhYmxlczsgdGhlc2UgYXJlIG1hY2hpbmUgZ2VuZXJhdGVkIHdpdGggdGhlIGNvZGUgaW4KKyAqIGNvbnRyaWIvdG9vbHMvbWFrZXNSR0IuYy4gIFRoZSBhY3R1YWwgc1JHQiB0cmFuc2ZlciBjdXJ2ZSBkZWZpbmVkIGluIHRoZQorICogc3BlY2lmaWNhdGlvbiAoc2VlIHRoZSBhcnRpY2xlIGF0IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU1JHQikKKyAqIGlzIHVzZWQsIG5vdCB0aGUgZ2FtbWE9MS8yLjIgYXBwcm94aW1hdGlvbiB1c2UgZWxzZXdoZXJlIGluIGxpYnBuZy4KKyAqIFRoZSBzUkdCIHRvIGxpbmVhciB0YWJsZSBpcyBleGFjdCAodG8gdGhlIG5lYXJlc3QgMTYtYml0IGxpbmVhciBmcmFjdGlvbikuCisgKiBUaGUgaW52ZXJzZSAobGluZWFyIHRvIHNSR0IpIHRhYmxlIGhhcyBhY2N1cmFjaWVzIGFzIGZvbGxvd3M6CisgKgorICogRm9yIGFsbCBwb3NzaWJsZSAoMjU1KjY1NTM1KzEpIGlucHV0IHZhbHVlczoKKyAqCisgKiAgICBlcnJvcjogLTAuNTE1NTY2IC0gMC42MjU5NzEsIDc5NDQxICgwLjQ3NTM2OSUpIG9mIHJlYWRpbmdzIGluZXhhY3QKKyAqCisgKiBGb3IgdGhlIGlucHV0IHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSA2NTUzNiAxNi1iaXQgdmFsdWVzOgorICoKKyAqICAgIGVycm9yOiAtMC41MTM3MjcgLSAwLjYwNzc1OSwgMzA4ICgwLjQ2OTk3OCUpIG9mIHJlYWRpbmdzIGluZXhhY3QKKyAqCisgKiBJbiBhbGwgY2FzZXMgdGhlIGluZXhhY3QgcmVhZGluZ3MgYXJlIG9ubHkgb2ZmIGJ5IG9uZS4KKyAqLworCisjaWZkZWYgUE5HX1NJTVBMSUZJRURfUkVBRF9TVVBQT1JURUQKKy8qIFRoZSBjb252ZXJ0LXRvLXNSR0IgdGFibGUgaXMgb25seSBjdXJyZW50bHkgcmVxdWlyZWQgZm9yIHJlYWQuICovCitjb25zdCBwbmdfdWludF8xNiBwbmdfc1JHQl90YWJsZVsyNTZdID0KK3sKKyAgIDAsMjAsNDAsNjAsODAsOTksMTE5LDEzOSwKKyAgIDE1OSwxNzksMTk5LDIxOSwyNDEsMjY0LDI4OCwzMTMsCisgICAzNDAsMzY3LDM5Niw0MjcsNDU4LDQ5MSw1MjYsNTYyLAorICAgNTk5LDYzNyw2NzcsNzE4LDc2MSw4MDUsODUxLDg5OCwKKyAgIDk0Nyw5OTcsMTA0OCwxMTAxLDExNTYsMTIxMiwxMjcwLDEzMzAsCisgICAxMzkxLDE0NTMsMTUxNywxNTgzLDE2NTEsMTcyMCwxNzkwLDE4NjMsCisgICAxOTM3LDIwMTMsMjA5MCwyMTcwLDIyNTAsMjMzMywyNDE4LDI1MDQsCisgICAyNTkyLDI2ODEsMjc3MywyODY2LDI5NjEsMzA1OCwzMTU3LDMyNTgsCisgICAzMzYwLDM0NjQsMzU3MCwzNjc4LDM3ODgsMzkwMCw0MDE0LDQxMjksCisgICA0MjQ3LDQzNjYsNDQ4OCw0NjExLDQ3MzYsNDg2NCw0OTkzLDUxMjQsCisgICA1MjU3LDUzOTIsNTUzMCw1NjY5LDU4MTAsNTk1Myw2MDk5LDYyNDYsCisgICA2Mzk1LDY1NDcsNjcwMCw2ODU2LDcwMTQsNzE3NCw3MzM1LDc1MDAsCisgICA3NjY2LDc4MzQsODAwNCw4MTc3LDgzNTIsODUyOCw4NzA4LDg4ODksCisgICA5MDcyLDkyNTgsOTQ0NSw5NjM1LDk4MjgsMTAwMjIsMTAyMTksMTA0MTcsCisgICAxMDYxOSwxMDgyMiwxMTAyOCwxMTIzNSwxMTQ0NiwxMTY1OCwxMTg3MywxMjA5MCwKKyAgIDEyMzA5LDEyNTMwLDEyNzU0LDEyOTgwLDEzMjA5LDEzNDQwLDEzNjczLDEzOTA5LAorICAgMTQxNDYsMTQzODcsMTQ2MjksMTQ4NzQsMTUxMjIsMTUzNzEsMTU2MjMsMTU4NzgsCisgICAxNjEzNSwxNjM5NCwxNjY1NiwxNjkyMCwxNzE4NywxNzQ1NiwxNzcyNywxODAwMSwKKyAgIDE4Mjc3LDE4NTU2LDE4ODM3LDE5MTIxLDE5NDA3LDE5Njk2LDE5OTg3LDIwMjgxLAorICAgMjA1NzcsMjA4NzYsMjExNzcsMjE0ODEsMjE3ODcsMjIwOTYsMjI0MDcsMjI3MjEsCisgICAyMzAzOCwyMzM1NywyMzY3OCwyNDAwMiwyNDMyOSwyNDY1OCwyNDk5MCwyNTMyNSwKKyAgIDI1NjYyLDI2MDAxLDI2MzQ0LDI2Njg4LDI3MDM2LDI3Mzg2LDI3NzM5LDI4MDk0LAorICAgMjg0NTIsMjg4MTMsMjkxNzYsMjk1NDIsMjk5MTEsMzAyODIsMzA2NTYsMzEwMzMsCisgICAzMTQxMiwzMTc5NCwzMjE3OSwzMjU2NywzMjk1NywzMzM1MCwzMzc0NSwzNDE0MywKKyAgIDM0NTQ0LDM0OTQ4LDM1MzU1LDM1NzY0LDM2MTc2LDM2NTkxLDM3MDA4LDM3NDI5LAorICAgMzc4NTIsMzgyNzgsMzg3MDYsMzkxMzgsMzk1NzIsNDAwMDksNDA0NDksNDA4OTEsCisgICA0MTMzNyw0MTc4NSw0MjIzNiw0MjY5MCw0MzE0Nyw0MzYwNiw0NDA2OSw0NDUzNCwKKyAgIDQ1MDAyLDQ1NDczLDQ1OTQ3LDQ2NDIzLDQ2OTAzLDQ3Mzg1LDQ3ODcxLDQ4MzU5LAorICAgNDg4NTAsNDkzNDQsNDk4NDEsNTAzNDEsNTA4NDQsNTEzNDksNTE4NTgsNTIzNjksCisgICA1Mjg4NCw1MzQwMSw1MzkyMSw1NDQ0NSw1NDk3MSw1NTUwMCw1NjAzMiw1NjU2NywKKyAgIDU3MTA1LDU3NjQ2LDU4MTkwLDU4NzM3LDU5Mjg3LDU5ODQwLDYwMzk2LDYwOTU1LAorICAgNjE1MTcsNjIwODIsNjI2NTAsNjMyMjEsNjM3OTUsNjQzNzIsNjQ5NTIsNjU1MzUKK307CisjZW5kaWYgLyogU0lNUExJRklFRF9SRUFEICovCisKKy8qIFRoZSBiYXNlL2RlbHRhIHRhYmxlcyBhcmUgcmVxdWlyZWQgZm9yIGJvdGggcmVhZCBhbmQgd3JpdGUgKGJ1dCBjdXJyZW50bHkKKyAqIG9ubHkgdGhlIHNpbXBsaWZpZWQgdmVyc2lvbnMuKQorICovCitjb25zdCBwbmdfdWludF8xNiBwbmdfc1JHQl9iYXNlWzUxMl0gPQoreworICAgMTI4LDE3ODIsMzM4Myw0NjQ0LDU2NzUsNjU2NCw3MzU3LDgwNzQsCisgICA4NzMyLDkzNDYsOTkyMSwxMDQ2MywxMDk3NywxMTQ2NiwxMTkzNSwxMjM4NCwKKyAgIDEyODE2LDEzMjMzLDEzNjM0LDE0MDI0LDE0NDAyLDE0NzY5LDE1MTI1LDE1NDczLAorICAgMTU4MTIsMTYxNDIsMTY0NjYsMTY3ODEsMTcwOTAsMTczOTMsMTc2OTAsMTc5ODEsCisgICAxODI2NiwxODU0NiwxODgyMiwxOTA5MywxOTM1OSwxOTYyMSwxOTg3OSwyMDEzMywKKyAgIDIwMzgzLDIwNjMwLDIwODczLDIxMTEzLDIxMzQ5LDIxNTgzLDIxODEzLDIyMDQxLAorICAgMjIyNjUsMjI0ODcsMjI3MDcsMjI5MjMsMjMxMzgsMjMzNTAsMjM1NTksMjM3NjcsCisgICAyMzk3MiwyNDE3NSwyNDM3NiwyNDU3NSwyNDc3MiwyNDk2NywyNTE2MCwyNTM1MiwKKyAgIDI1NTQyLDI1NzMwLDI1OTE2LDI2MTAxLDI2Mjg0LDI2NDY1LDI2NjQ1LDI2ODIzLAorICAgMjcwMDAsMjcxNzYsMjczNTAsMjc1MjMsMjc2OTUsMjc4NjUsMjgwMzQsMjgyMDEsCisgICAyODM2OCwyODUzMywyODY5NywyODg2MCwyOTAyMSwyOTE4MiwyOTM0MSwyOTUwMCwKKyAgIDI5NjU3LDI5ODEzLDI5OTY5LDMwMTIzLDMwMjc2LDMwNDI5LDMwNTgwLDMwNzMwLAorICAgMzA4ODAsMzEwMjgsMzExNzYsMzEzMjMsMzE0NjksMzE2MTQsMzE3NTgsMzE5MDIsCisgICAzMjA0NSwzMjE4NiwzMjMyNywzMjQ2OCwzMjYwNywzMjc0NiwzMjg4NCwzMzAyMSwKKyAgIDMzMTU4LDMzMjk0LDMzNDI5LDMzNTY0LDMzNjk3LDMzODMxLDMzOTYzLDM0MDk1LAorICAgMzQyMjYsMzQzNTcsMzQ0ODYsMzQ2MTYsMzQ3NDQsMzQ4NzMsMzUwMDAsMzUxMjcsCisgICAzNTI1MywzNTM3OSwzNTUwNCwzNTYyOSwzNTc1MywzNTg3NiwzNTk5OSwzNjEyMiwKKyAgIDM2MjQ0LDM2MzY1LDM2NDg2LDM2NjA2LDM2NzI2LDM2ODQ1LDM2OTY0LDM3MDgzLAorICAgMzcyMDEsMzczMTgsMzc0MzUsMzc1NTEsMzc2NjgsMzc3ODMsMzc4OTgsMzgwMTMsCisgICAzODEyNywzODI0MSwzODM1NCwzODQ2NywzODU4MCwzODY5MiwzODgwMywzODkxNSwKKyAgIDM5MDI2LDM5MTM2LDM5MjQ2LDM5MzU2LDM5NDY1LDM5NTc0LDM5NjgyLDM5NzkwLAorICAgMzk4OTgsNDAwMDUsNDAxMTIsNDAyMTksNDAzMjUsNDA0MzEsNDA1MzcsNDA2NDIsCisgICA0MDc0Nyw0MDg1MSw0MDk1NSw0MTA1OSw0MTE2Myw0MTI2Niw0MTM2OSw0MTQ3MSwKKyAgIDQxNTczLDQxNjc1LDQxNzc3LDQxODc4LDQxOTc5LDQyMDc5LDQyMTc5LDQyMjc5LAorICAgNDIzNzksNDI0NzgsNDI1NzcsNDI2NzYsNDI3NzUsNDI4NzMsNDI5NzEsNDMwNjgsCisgICA0MzE2NSw0MzI2Miw0MzM1OSw0MzQ1Niw0MzU1Miw0MzY0OCw0Mzc0Myw0MzgzOSwKKyAgIDQzOTM0LDQ0MDI4LDQ0MTIzLDQ0MjE3LDQ0MzExLDQ0NDA1LDQ0NDk5LDQ0NTkyLAorICAgNDQ2ODUsNDQ3NzgsNDQ4NzAsNDQ5NjIsNDUwNTQsNDUxNDYsNDUyMzgsNDUzMjksCisgICA0NTQyMCw0NTUxMSw0NTYwMSw0NTY5Miw0NTc4Miw0NTg3Miw0NTk2MSw0NjA1MSwKKyAgIDQ2MTQwLDQ2MjI5LDQ2MzE4LDQ2NDA2LDQ2NDk0LDQ2NTgzLDQ2NjcwLDQ2NzU4LAorICAgNDY4NDYsNDY5MzMsNDcwMjAsNDcxMDcsNDcxOTMsNDcyODAsNDczNjYsNDc0NTIsCisgICA0NzUzOCw0NzYyMyw0NzcwOSw0Nzc5NCw0Nzg3OSw0Nzk2NCw0ODA0OCw0ODEzMywKKyAgIDQ4MjE3LDQ4MzAxLDQ4Mzg1LDQ4NDY4LDQ4NTUyLDQ4NjM1LDQ4NzE4LDQ4ODAxLAorICAgNDg4ODQsNDg5NjYsNDkwNDgsNDkxMzEsNDkyMTMsNDkyOTQsNDkzNzYsNDk0NTgsCisgICA0OTUzOSw0OTYyMCw0OTcwMSw0OTc4Miw0OTg2Miw0OTk0Myw1MDAyMyw1MDEwMywKKyAgIDUwMTgzLDUwMjYzLDUwMzQyLDUwNDIyLDUwNTAxLDUwNTgwLDUwNjU5LDUwNzM4LAorICAgNTA4MTYsNTA4OTUsNTA5NzMsNTEwNTEsNTExMjksNTEyMDcsNTEyODUsNTEzNjIsCisgICA1MTQzOSw1MTUxNyw1MTU5NCw1MTY3MSw1MTc0Nyw1MTgyNCw1MTkwMCw1MTk3NywKKyAgIDUyMDUzLDUyMTI5LDUyMjA1LDUyMjgwLDUyMzU2LDUyNDMyLDUyNTA3LDUyNTgyLAorICAgNTI2NTcsNTI3MzIsNTI4MDcsNTI4ODEsNTI5NTYsNTMwMzAsNTMxMDQsNTMxNzgsCisgICA1MzI1Miw1MzMyNiw1MzQwMCw1MzQ3Myw1MzU0Niw1MzYyMCw1MzY5Myw1Mzc2NiwKKyAgIDUzODM5LDUzOTExLDUzOTg0LDU0MDU2LDU0MTI5LDU0MjAxLDU0MjczLDU0MzQ1LAorICAgNTQ0MTcsNTQ0ODksNTQ1NjAsNTQ2MzIsNTQ3MDMsNTQ3NzQsNTQ4NDUsNTQ5MTYsCisgICA1NDk4Nyw1NTA1OCw1NTEyOSw1NTE5OSw1NTI2OSw1NTM0MCw1NTQxMCw1NTQ4MCwKKyAgIDU1NTUwLDU1NjIwLDU1Njg5LDU1NzU5LDU1ODI4LDU1ODk4LDU1OTY3LDU2MDM2LAorICAgNTYxMDUsNTYxNzQsNTYyNDMsNTYzMTEsNTYzODAsNTY0NDgsNTY1MTcsNTY1ODUsCisgICA1NjY1Myw1NjcyMSw1Njc4OSw1Njg1Nyw1NjkyNCw1Njk5Miw1NzA1OSw1NzEyNywKKyAgIDU3MTk0LDU3MjYxLDU3MzI4LDU3Mzk1LDU3NDYyLDU3NTI5LDU3NTk1LDU3NjYyLAorICAgNTc3MjgsNTc3OTUsNTc4NjEsNTc5MjcsNTc5OTMsNTgwNTksNTgxMjUsNTgxOTEsCisgICA1ODI1Niw1ODMyMiw1ODM4Nyw1ODQ1Myw1ODUxOCw1ODU4Myw1ODY0OCw1ODcxMywKKyAgIDU4Nzc4LDU4ODQzLDU4OTA4LDU4OTcyLDU5MDM3LDU5MTAxLDU5MTY1LDU5MjMwLAorICAgNTkyOTQsNTkzNTgsNTk0MjIsNTk0ODYsNTk1NDksNTk2MTMsNTk2NzcsNTk3NDAsCisgICA1OTgwNCw1OTg2Nyw1OTkzMCw1OTk5Myw2MDA1Niw2MDExOSw2MDE4Miw2MDI0NSwKKyAgIDYwMzA4LDYwMzcwLDYwNDMzLDYwNDk1LDYwNTU4LDYwNjIwLDYwNjgyLDYwNzQ0LAorICAgNjA4MDYsNjA4NjgsNjA5MzAsNjA5OTIsNjEwNTQsNjExMTUsNjExNzcsNjEyMzgsCisgICA2MTMwMCw2MTM2MSw2MTQyMiw2MTQ4Myw2MTU0NCw2MTYwNSw2MTY2Niw2MTcyNywKKyAgIDYxNzg4LDYxODQ4LDYxOTA5LDYxOTY5LDYyMDMwLDYyMDkwLDYyMTUwLDYyMjExLAorICAgNjIyNzEsNjIzMzEsNjIzOTEsNjI0NTAsNjI1MTAsNjI1NzAsNjI2MzAsNjI2ODksCisgICA2Mjc0OSw2MjgwOCw2Mjg2Nyw2MjkyNyw2Mjk4Niw2MzA0NSw2MzEwNCw2MzE2MywKKyAgIDYzMjIyLDYzMjgxLDYzMzQwLDYzMzk4LDYzNDU3LDYzNTE1LDYzNTc0LDYzNjMyLAorICAgNjM2OTEsNjM3NDksNjM4MDcsNjM4NjUsNjM5MjMsNjM5ODEsNjQwMzksNjQwOTcsCisgICA2NDE1NSw2NDIxMiw2NDI3MCw2NDMyOCw2NDM4NSw2NDQ0Myw2NDUwMCw2NDU1NywKKyAgIDY0NjE0LDY0NjcyLDY0NzI5LDY0Nzg2LDY0ODQzLDY0OTAwLDY0OTU2LDY1MDEzLAorICAgNjUwNzAsNjUxMjYsNjUxODMsNjUyMzksNjUyOTYsNjUzNTIsNjU0MDksNjU0NjUKK307CisKK2NvbnN0IHBuZ19ieXRlIHBuZ19zUkdCX2RlbHRhWzUxMl0gPQoreworICAgMjA3LDIwMSwxNTgsMTI5LDExMywxMDAsOTAsODIsNzcsNzIsNjgsNjQsNjEsNTksNTYsNTQsCisgICA1Miw1MCw0OSw0Nyw0Niw0NSw0Myw0Miw0MSw0MCwzOSwzOSwzOCwzNywzNiwzNiwKKyAgIDM1LDM0LDM0LDMzLDMzLDMyLDMyLDMxLDMxLDMwLDMwLDMwLDI5LDI5LDI4LDI4LAorICAgMjgsMjcsMjcsMjcsMjcsMjYsMjYsMjYsMjUsMjUsMjUsMjUsMjQsMjQsMjQsMjQsCisgICAyMywyMywyMywyMywyMywyMiwyMiwyMiwyMiwyMiwyMiwyMSwyMSwyMSwyMSwyMSwKKyAgIDIxLDIwLDIwLDIwLDIwLDIwLDIwLDIwLDIwLDE5LDE5LDE5LDE5LDE5LDE5LDE5LAorICAgMTksMTgsMTgsMTgsMTgsMTgsMTgsMTgsMTgsMTgsMTgsMTcsMTcsMTcsMTcsMTcsCisgICAxNywxNywxNywxNywxNywxNywxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwKKyAgIDE2LDE2LDE2LDE2LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorICAgMTUsMTUsMTUsMTUsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsCisgICAxNCwxNCwxNCwxNCwxNCwxNCwxNCwxMywxMywxMywxMywxMywxMywxMywxMywxMywKKyAgIDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEyLDEyLAorICAgMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsCisgICAxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMSwxMSwxMSwxMSwKKyAgIDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLAorICAgMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsCisgICAxMSwxMCwxMCwxMCwxMCwxMCwxMCwxMCwxMCwxMCwxMCwxMCwxMCwxMCwxMCwxMCwKKyAgIDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLAorICAgMTAsMTAsMTAsMTAsMTAsMTAsMTAsMTAsMTAsMTAsMTAsMTAsMTAsMTAsMTAsMTAsCisgICAxMCw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSwKKyAgIDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksCisgICA5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LAorICAgOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSwKKyAgIDksOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsCisgICA4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LAorICAgOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCwKKyAgIDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsCisgICA4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LAorICAgOCw4LDgsOCw4LDgsOCw4LDgsNyw3LDcsNyw3LDcsNywKKyAgIDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsCisgICA3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LAorICAgNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNworfTsKKyNlbmRpZiAvKiBTSU1QTElGSUVEIFJFQUQvV1JJVEUgc1JHQiBzdXBwb3J0ICovCisKKy8qIFNJTVBMSUZJRUQgUkVBRC9XUklURSBTVVBQT1JUICovCisjaWYgZGVmaW5lZChQTkdfU0lNUExJRklFRF9SRUFEX1NVUFBPUlRFRCkgfHxcCisgICBkZWZpbmVkKFBOR19TSU1QTElGSUVEX1dSSVRFX1NVUFBPUlRFRCkKK3N0YXRpYyBpbnQKK3BuZ19pbWFnZV9mcmVlX2Z1bmN0aW9uKHBuZ192b2lkcCBhcmd1bWVudCkKK3sKKyAgIHBuZ19pbWFnZXAgaW1hZ2UgPSBwbmdfdm9pZGNhc3QocG5nX2ltYWdlcCwgYXJndW1lbnQpOworICAgcG5nX2NvbnRyb2xwIGNwID0gaW1hZ2UtPm9wYXF1ZTsKKyAgIHBuZ19jb250cm9sIGM7CisKKyAgIC8qIERvdWJsZSBjaGVjayB0aGF0IHdlIGhhdmUgYSBwbmdfcHRyIC0gaXQgc2hvdWxkIGJlIGltcG9zc2libGUgdG8gZ2V0IGhlcmUKKyAgICAqIHdpdGhvdXQgb25lLgorICAgICovCisgICBpZiAoY3AtPnBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybiAwOworCisgICAvKiBGaXJzdCBmcmVlIGFueSBkYXRhIGhlbGQgaW4gdGhlIGNvbnRyb2wgc3RydWN0dXJlLiAqLworIyAgaWZkZWYgUE5HX1NURElPX1NVUFBPUlRFRAorICAgICAgaWYgKGNwLT5vd25lZF9maWxlICE9IDApCisgICAgICB7CisgICAgICAgICBGSUxFICpmcCA9IHBuZ192b2lkY2FzdChGSUxFKiwgY3AtPnBuZ19wdHItPmlvX3B0cik7CisgICAgICAgICBjcC0+b3duZWRfZmlsZSA9IDA7CisKKyAgICAgICAgIC8qIElnbm9yZSBlcnJvcnMgaGVyZS4gKi8KKyAgICAgICAgIGlmIChmcCAhPSBOVUxMKQorICAgICAgICAgeworICAgICAgICAgICAgY3AtPnBuZ19wdHItPmlvX3B0ciA9IE5VTEw7CisgICAgICAgICAgICAodm9pZClmY2xvc2UoZnApOworICAgICAgICAgfQorICAgICAgfQorIyAgZW5kaWYKKworICAgLyogQ29weSB0aGUgY29udHJvbCBzdHJ1Y3R1cmUgc28gdGhhdCB0aGUgb3JpZ2luYWwsIGFsbG9jYXRlZCwgdmVyc2lvbiBjYW4gYmUKKyAgICAqIHNhZmVseSBmcmVlZC4gIE5vdGljZSB0aGF0IGEgcG5nX2Vycm9yIGhlcmUgc3RvcHMgdGhlIHJlbWFpbmRlciBvZiB0aGUKKyAgICAqIGNsZWFudXAsIGJ1dCB0aGlzIGlzIHByb2JhYmx5IGZpbmUgYmVjYXVzZSB0aGF0IHdvdWxkIGluZGljYXRlIGJhZCBtZW1vcnkKKyAgICAqIHByb2JsZW1zIGFueXdheS4KKyAgICAqLworICAgYyA9ICpjcDsKKyAgIGltYWdlLT5vcGFxdWUgPSAmYzsKKyAgIHBuZ19mcmVlKGMucG5nX3B0ciwgY3ApOworCisgICAvKiBUaGVuIHRoZSBzdHJ1Y3R1cmVzLCBjYWxsaW5nIHRoZSBjb3JyZWN0IEFQSS4gKi8KKyAgIGlmIChjLmZvcl93cml0ZSAhPSAwKQorICAgeworIyAgICAgaWZkZWYgUE5HX1NJTVBMSUZJRURfV1JJVEVfU1VQUE9SVEVECisgICAgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJmMucG5nX3B0ciwgJmMuaW5mb19wdHIpOworIyAgICAgZWxzZQorICAgICAgICAgcG5nX2Vycm9yKGMucG5nX3B0ciwgInNpbXBsaWZpZWQgd3JpdGUgbm90IHN1cHBvcnRlZCIpOworIyAgICAgZW5kaWYKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyMgICAgIGlmZGVmIFBOR19TSU1QTElGSUVEX1JFQURfU1VQUE9SVEVECisgICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmYy5wbmdfcHRyLCAmYy5pbmZvX3B0ciwgTlVMTCk7CisjICAgICBlbHNlCisgICAgICAgICBwbmdfZXJyb3IoYy5wbmdfcHRyLCAic2ltcGxpZmllZCByZWFkIG5vdCBzdXBwb3J0ZWQiKTsKKyMgICAgIGVuZGlmCisgICB9CisKKyAgIC8qIFN1Y2Nlc3MuICovCisgICByZXR1cm4gMTsKK30KKwordm9pZCBQTkdBUEkKK3BuZ19pbWFnZV9mcmVlKHBuZ19pbWFnZXAgaW1hZ2UpCit7CisgICAvKiBTYWZlbHkgY2FsbCB0aGUgcmVhbCBmdW5jdGlvbiwgYnV0IG9ubHkgaWYgZG9pbmcgc28gaXMgc2FmZSBhdCB0aGlzIHBvaW50CisgICAgKiAoaWYgbm90IGluc2lkZSBhbiBlcnJvciBoYW5kbGluZyBjb250ZXh0KS4gIE90aGVyd2lzZSBhc3N1bWUKKyAgICAqIHBuZ19zYWZlX2V4ZWN1dGUgd2lsbCBjYWxsIHRoaXMgQVBJIGFmdGVyIHRoZSByZXR1cm4uCisgICAgKi8KKyAgIGlmIChpbWFnZSAhPSBOVUxMICYmIGltYWdlLT5vcGFxdWUgIT0gTlVMTCAmJgorICAgICAgaW1hZ2UtPm9wYXF1ZS0+ZXJyb3JfYnVmID09IE5VTEwpCisgICB7CisgICAgICAvKiBJZ25vcmUgZXJyb3JzIGhlcmU6ICovCisgICAgICAodm9pZClwbmdfc2FmZV9leGVjdXRlKGltYWdlLCBwbmdfaW1hZ2VfZnJlZV9mdW5jdGlvbiwgaW1hZ2UpOworICAgICAgaW1hZ2UtPm9wYXF1ZSA9IE5VTEw7CisgICB9Cit9CisKK2ludCAvKiBQUklWQVRFICovCitwbmdfaW1hZ2VfZXJyb3IocG5nX2ltYWdlcCBpbWFnZSwgcG5nX2NvbnN0X2NoYXJwIGVycm9yX21lc3NhZ2UpCit7CisgICAvKiBVdGlsaXR5IHRvIGxvZyBhbiBlcnJvci4gKi8KKyAgIHBuZ19zYWZlY2F0KGltYWdlLT5tZXNzYWdlLCAoc2l6ZW9mIGltYWdlLT5tZXNzYWdlKSwgMCwgZXJyb3JfbWVzc2FnZSk7CisgICBpbWFnZS0+d2FybmluZ19vcl9lcnJvciB8PSBQTkdfSU1BR0VfRVJST1I7CisgICBwbmdfaW1hZ2VfZnJlZShpbWFnZSk7CisgICByZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIFNJTVBMSUZJRUQgUkVBRC9XUklURSAqLworI2VuZGlmIC8qIFJFQUQgfHwgV1JJVEUgKi8KZGlmZiAtLWdpdCBhL2xpYnBuZy9wbmcuaCBiL2xpYnBuZy9wbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWMzZWU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3BuZy5oCkBAIC0wLDAgKzEsMzE0OCBAQAorCisvKiBwbmcuaCAtIGhlYWRlciBmaWxlIGZvciBQTkcgcmVmZXJlbmNlIGxpYnJhcnkKKyAqCisgKiBsaWJwbmcgdmVyc2lvbiAxLjYuMjAsIERlY2VtYmVyIDMsIDIwMTUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNSBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQorICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UgKFNlZSBMSUNFTlNFLCBiZWxvdykKKyAqCisgKiBBdXRob3JzIGFuZCBtYWludGFpbmVyczoKKyAqICAgbGlicG5nIHZlcnNpb25zIDAuNzEsIE1heSAxOTk1LCB0aHJvdWdoIDAuODgsIEphbnVhcnkgMTk5NjogR3V5IFNjaGFsbmF0CisgKiAgIGxpYnBuZyB2ZXJzaW9ucyAwLjg5LCBKdW5lIDE5OTYsIHRocm91Z2ggMC45NiwgTWF5IDE5OTc6IEFuZHJlYXMgRGlsZ2VyCisgKiAgIGxpYnBuZyB2ZXJzaW9ucyAwLjk3LCBKYW51YXJ5IDE5OTgsIHRocm91Z2ggMS42LjIwLCBEZWNlbWJlciAzLCAyMDE1OgorICogICAgIEdsZW5uIFJhbmRlcnMtUGVocnNvbi4KKyAqICAgU2VlIGFsc28gIkNvbnRyaWJ1dGluZyBBdXRob3JzIiwgYmVsb3cuCisgKi8KKworLyoKKyAqIENPUFlSSUdIVCBOT1RJQ0UsIERJU0NMQUlNRVIsIGFuZCBMSUNFTlNFOgorICoKKyAqIElmIHlvdSBtb2RpZnkgbGlicG5nIHlvdSBtYXkgaW5zZXJ0IGFkZGl0aW9uYWwgbm90aWNlcyBpbW1lZGlhdGVseSBmb2xsb3dpbmcKKyAqIHRoaXMgc2VudGVuY2UuCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyAqCisgKiBsaWJwbmcgdmVyc2lvbnMgMS4wLjcsIEp1bHkgMSwgMjAwMCwgdGhyb3VnaCAxLjYuMjAsIERlY2VtYmVyIDMsIDIwMTUsIGFyZQorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIsIDIwMDQsIDIwMDYtMjAxNSBHbGVubiBSYW5kZXJzLVBlaHJzb24sIGFyZQorICogZGVyaXZlZCBmcm9tIGxpYnBuZy0xLjAuNiwgYW5kIGFyZSBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNhbWUKKyAqIGRpc2NsYWltZXIgYW5kIGxpY2Vuc2UgYXMgbGlicG5nLTEuMC42IHdpdGggdGhlIGZvbGxvd2luZyBpbmRpdmlkdWFscworICogYWRkZWQgdG8gdGhlIGxpc3Qgb2YgQ29udHJpYnV0aW5nIEF1dGhvcnM6CisgKgorICogICAgU2ltb24tUGllcnJlIENhZGlldXgKKyAqICAgIEVyaWMgUy4gUmF5bW9uZAorICogICAgTWFucyBSdWxsZ2FyZAorICogICAgQ29zbWluIFRydXRhCisgKiAgICBHaWxsZXMgVm9sbGFudAorICogICAgSmFtZXMgWXUKKyAqCisgKiBhbmQgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGl0aW9ucyB0byB0aGUgZGlzY2xhaW1lcjoKKyAqCisgKiAgICBUaGVyZSBpcyBubyB3YXJyYW50eSBhZ2FpbnN0IGludGVyZmVyZW5jZSB3aXRoIHlvdXIgZW5qb3ltZW50IG9mIHRoZQorICogICAgbGlicmFyeSBvciBhZ2FpbnN0IGluZnJpbmdlbWVudC4gIFRoZXJlIGlzIG5vIHdhcnJhbnR5IHRoYXQgb3VyCisgKiAgICBlZmZvcnRzIG9yIHRoZSBsaWJyYXJ5IHdpbGwgZnVsZmlsbCBhbnkgb2YgeW91ciBwYXJ0aWN1bGFyIHB1cnBvc2VzCisgKiAgICBvciBuZWVkcy4gIFRoaXMgbGlicmFyeSBpcyBwcm92aWRlZCB3aXRoIGFsbCBmYXVsdHMsIGFuZCB0aGUgZW50aXJlCisgKiAgICByaXNrIG9mIHNhdGlzZmFjdG9yeSBxdWFsaXR5LCBwZXJmb3JtYW5jZSwgYWNjdXJhY3ksIGFuZCBlZmZvcnQgaXMgd2l0aAorICogICAgdGhlIHVzZXIuCisgKgorICogbGlicG5nIHZlcnNpb25zIDAuOTcsIEphbnVhcnkgMTk5OCwgdGhyb3VnaCAxLjAuNiwgTWFyY2ggMjAsIDIwMDAsIGFyZQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgR2xlbm4gUmFuZGVycy1QZWhyc29uLCBhcmUgZGVyaXZlZCBmcm9tCisgKiBsaWJwbmctMC45NiwgYW5kIGFyZSBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNhbWUgZGlzY2xhaW1lciBhbmQKKyAqIGxpY2Vuc2UgYXMgbGlicG5nLTAuOTYsIHdpdGggdGhlIGZvbGxvd2luZyBpbmRpdmlkdWFscyBhZGRlZCB0byB0aGUgbGlzdAorICogb2YgQ29udHJpYnV0aW5nIEF1dGhvcnM6CisgKgorICogICAgVG9tIExhbmUKKyAqICAgIEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogICAgV2lsbGVtIHZhbiBTY2hhaWsKKyAqCisgKiBsaWJwbmcgdmVyc2lvbnMgMC44OSwgSnVuZSAxOTk2LCB0aHJvdWdoIDAuOTYsIE1heSAxOTk3LCBhcmUKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk3IEFuZHJlYXMgRGlsZ2VyLCBhcmUgZGVyaXZlZCBmcm9tIGxpYnBuZy0wLjg4LAorICogYW5kIGFyZSBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNhbWUgZGlzY2xhaW1lciBhbmQgbGljZW5zZSBhcworICogbGlicG5nLTAuODgsIHdpdGggdGhlIGZvbGxvd2luZyBpbmRpdmlkdWFscyBhZGRlZCB0byB0aGUgbGlzdCBvZgorICogQ29udHJpYnV0aW5nIEF1dGhvcnM6CisgKgorICogICAgSm9obiBCb3dsZXIKKyAqICAgIEtldmluIEJyYWNleQorICogICAgU2FtIEJ1c2hlbGwKKyAqICAgIE1hZ251cyBIb2xtZ3JlbgorICogICAgR3JlZyBSb2Vsb2ZzCisgKiAgICBUb20gVGFubmVyCisgKgorICogbGlicG5nIHZlcnNpb25zIDAuNSwgTWF5IDE5OTUsIHRocm91Z2ggMC44OCwgSmFudWFyeSAxOTk2LCBhcmUKKyAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgorICoKKyAqIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UsICJDb250cmlidXRpbmcgQXV0aG9ycyIKKyAqIGlzIGRlZmluZWQgYXMgdGhlIGZvbGxvd2luZyBzZXQgb2YgaW5kaXZpZHVhbHM6CisgKgorICogICAgQW5kcmVhcyBEaWxnZXIKKyAqICAgIERhdmUgTWFydGluZGFsZQorICogICAgR3V5IEVyaWMgU2NoYWxuYXQKKyAqICAgIFBhdWwgU2NobWlkdAorICogICAgVGltIFdlZ25lcgorICoKKyAqIFRoZSBQTkcgUmVmZXJlbmNlIExpYnJhcnkgaXMgc3VwcGxpZWQgIkFTIElTIi4gIFRoZSBDb250cmlidXRpbmcgQXV0aG9ycworICogYW5kIEdyb3VwIDQyLCBJbmMuIGRpc2NsYWltIGFsbCB3YXJyYW50aWVzLCBleHByZXNzZWQgb3IgaW1wbGllZCwKKyAqIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGUgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIG9mCisgKiBmaXRuZXNzIGZvciBhbnkgcHVycG9zZS4gIFRoZSBDb250cmlidXRpbmcgQXV0aG9ycyBhbmQgR3JvdXAgNDIsIEluYy4KKyAqIGFzc3VtZSBubyBsaWFiaWxpdHkgZm9yIGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKKyAqIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgd2hpY2ggbWF5IHJlc3VsdCBmcm9tIHRoZSB1c2Ugb2YgdGhlIFBORworICogUmVmZXJlbmNlIExpYnJhcnksIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc291cmNlIGNvZGUsIG9yIHBvcnRpb25zIGhlcmVvZiwgZm9yIGFueSBwdXJwb3NlLCB3aXRob3V0IGZlZSwgc3ViamVjdAorICogdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisgKgorICogICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc291cmNlIGNvZGUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQuCisgKgorICogICAyLiBBbHRlcmVkIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCBhbmQgbXVzdCBub3QKKyAqICAgICAgYmUgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvdXJjZS4KKyAqCisgKiAgIDMuIFRoaXMgQ29weXJpZ2h0IG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueQorICogICAgICBzb3VyY2Ugb3IgYWx0ZXJlZCBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRoZSBDb250cmlidXRpbmcgQXV0aG9ycyBhbmQgR3JvdXAgNDIsIEluYy4gc3BlY2lmaWNhbGx5IHBlcm1pdCwgd2l0aG91dAorICogZmVlLCBhbmQgZW5jb3VyYWdlIHRoZSB1c2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBhcyBhIGNvbXBvbmVudCB0bworICogc3VwcG9ydGluZyB0aGUgUE5HIGZpbGUgZm9ybWF0IGluIGNvbW1lcmNpYWwgcHJvZHVjdHMuICBJZiB5b3UgdXNlIHRoaXMKKyAqIHNvdXJjZSBjb2RlIGluIGEgcHJvZHVjdCwgYWNrbm93bGVkZ21lbnQgaXMgbm90IHJlcXVpcmVkIGJ1dCB3b3VsZCBiZQorICogYXBwcmVjaWF0ZWQuCisgKgorICogRU5EIE9GIENPUFlSSUdIVCBOT1RJQ0UsIERJU0NMQUlNRVIsIGFuZCBMSUNFTlNFLgorICovCisKKy8qCisgKiBBICJwbmdfZ2V0X2NvcHlyaWdodCIgZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCBmb3IgY29udmVuaWVudCB1c2UgaW4gImFib3V0IgorICogYm94ZXMgYW5kIHRoZSBsaWtlOgorICoKKyAqICAgIHByaW50ZigiJXMiLCBwbmdfZ2V0X2NvcHlyaWdodChOVUxMKSk7CisgKgorICogQWxzbywgdGhlIFBORyBsb2dvIChpbiBQTkcgZm9ybWF0LCBvZiBjb3Vyc2UpIGlzIHN1cHBsaWVkIGluIHRoZQorICogZmlsZXMgInBuZ2Jhci5wbmciIGFuZCAicG5nYmFyLmpwZyAoODh4MzEpIGFuZCAicG5nbm93LnBuZyIgKDk4eDMxKS4KKyAqLworCisvKgorICogTGlicG5nIGlzIE9TSSBDZXJ0aWZpZWQgT3BlbiBTb3VyY2UgU29mdHdhcmUuICBPU0kgQ2VydGlmaWVkIE9wZW4gU291cmNlIGlzCisgKiBhIGNlcnRpZmljYXRpb24gbWFyayBvZiB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4gT1NJIGhhcyBub3QgYWRkcmVzc2VkCisgKiB0aGUgYWRkaXRpb25hbCBkaXNjbGFpbWVycyBpbnNlcnRlZCBhdCB2ZXJzaW9uIDEuMC43LgorICovCisKKy8qCisgKiBUaGUgY29udHJpYnV0aW5nIGF1dGhvcnMgd291bGQgbGlrZSB0byB0aGFuayBhbGwgdGhvc2Ugd2hvIGhlbHBlZAorICogd2l0aCB0ZXN0aW5nLCBidWcgZml4ZXMsIGFuZCBwYXRpZW5jZS4gIFRoaXMgd291bGRuJ3QgaGF2ZSBiZWVuCisgKiBwb3NzaWJsZSB3aXRob3V0IGFsbCBvZiB5b3UuCisgKgorICogVGhhbmtzIHRvIEZyYW5rIEouIFQuIFdvamNpayBmb3IgaGVscGluZyB3aXRoIHRoZSBkb2N1bWVudGF0aW9uLgorICovCisKKy8qIE5vdGUgYWJvdXQgbGlicG5nIHZlcnNpb24gbnVtYmVyczoKKyAqCisgKiAgICBEdWUgdG8gdmFyaW91cyBtaXNjb21tdW5pY2F0aW9ucywgdW5mb3Jlc2VlbiBjb2RlIGluY29tcGF0aWJpbGl0aWVzCisgKiAgICBhbmQgb2NjYXNpb25hbCBmYWN0b3JzIG91dHNpZGUgdGhlIGF1dGhvcnMnIGNvbnRyb2wsIHZlcnNpb24gbnVtYmVyaW5nCisgKiAgICBvbiB0aGUgbGlicmFyeSBoYXMgbm90IGFsd2F5cyBiZWVuIGNvbnNpc3RlbnQgYW5kIHN0cmFpZ2h0Zm9yd2FyZC4KKyAqICAgIFRoZSBmb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyBtYXR0ZXJzIHNpbmNlIHZlcnNpb24gMC44OWMsIHdoaWNoIHdhcworICogICAgdGhlIGZpcnN0IHdpZGVseSB1c2VkIHJlbGVhc2U6CisgKgorICogICAgc291cmNlICAgICAgICAgICAgICAgICBwbmcuaCAgcG5nLmggIHNoYXJlZC1saWIKKyAqICAgIHZlcnNpb24gICAgICAgICAgICAgICAgc3RyaW5nICAgaW50ICB2ZXJzaW9uCisgKiAgICAtLS0tLS0tICAgICAgICAgICAgICAgIC0tLS0tLSAtLS0tLSAgLS0tLS0tLS0tLQorICogICAgMC44OWMgIjEuMCBiZXRhIDMiICAgICAwLjg5ICAgICAgODkgIDEuMC44OQorICogICAgMC45MCAgIjEuMCBiZXRhIDQiICAgICAwLjkwICAgICAgOTAgIDAuOTAgIFtzaG91bGQgaGF2ZSBiZWVuIDIuMC45MF0KKyAqICAgIDAuOTUgICIxLjAgYmV0YSA1IiAgICAgMC45NSAgICAgIDk1ICAwLjk1ICBbc2hvdWxkIGhhdmUgYmVlbiAyLjAuOTVdCisgKiAgICAwLjk2ICAiMS4wIGJldGEgNiIgICAgIDAuOTYgICAgICA5NiAgMC45NiAgW3Nob3VsZCBoYXZlIGJlZW4gMi4wLjk2XQorICogICAgMC45N2IgIjEuMDAuOTcgYmV0YSA3IiAxLjAwLjk3ICAgOTcgIDEuMC4xIFtzaG91bGQgaGF2ZSBiZWVuIDIuMC45N10KKyAqICAgIDAuOTdjICAgICAgICAgICAgICAgICAgMC45NyAgICAgIDk3ICAyLjAuOTcKKyAqICAgIDAuOTggICAgICAgICAgICAgICAgICAgMC45OCAgICAgIDk4ICAyLjAuOTgKKyAqICAgIDAuOTkgICAgICAgICAgICAgICAgICAgMC45OSAgICAgIDk4ICAyLjAuOTkKKyAqICAgIDAuOTlhLW0gICAgICAgICAgICAgICAgMC45OSAgICAgIDk5ICAyLjAuOTkKKyAqICAgIDEuMDAgICAgICAgICAgICAgICAgICAgMS4wMCAgICAgMTAwICAyLjEuMCBbMTAwIHNob3VsZCBiZSAxMDAwMF0KKyAqICAgIDEuMC4wICAgICAgKGZyb20gaGVyZSBvbiwgdGhlICAgMTAwICAyLjEuMCBbMTAwIHNob3VsZCBiZSAxMDAwMF0KKyAqICAgIDEuMC4xICAgICAgIHBuZy5oIHN0cmluZyBpcyAgIDEwMDAxICAyLjEuMAorICogICAgMS4wLjFhLWUgICAgaWRlbnRpY2FsIHRvIHRoZSAgMTAwMDIgIGZyb20gaGVyZSBvbiwgdGhlIHNoYXJlZCBsaWJyYXJ5CisgKiAgICAxLjAuMiAgICAgICBzb3VyY2UgdmVyc2lvbikgICAxMDAwMiAgaXMgMi5WIHdoZXJlIFYgaXMgdGhlIHNvdXJjZSBjb2RlCisgKiAgICAxLjAuMmEtYiAgICAgICAgICAgICAgICAgICAgICAxMDAwMyAgdmVyc2lvbiwgZXhjZXB0IGFzIG5vdGVkLgorICogICAgMS4wLjMgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDMKKyAqICAgIDEuMC4zYS1kICAgICAgICAgICAgICAgICAgICAgIDEwMDA0CisgKiAgICAxLjAuNCAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwNAorICogICAgMS4wLjRhLWYgICAgICAgICAgICAgICAgICAgICAgMTAwMDUKKyAqICAgIDEuMC41ICgrIDIgcGF0Y2hlcykgICAgICAgICAgIDEwMDA1CisgKiAgICAxLjAuNWEtZCAgICAgICAgICAgICAgICAgICAgICAxMDAwNgorICogICAgMS4wLjVlLXIgICAgICAgICAgICAgICAgICAgICAgMTAxMDAgKG5vdCBzb3VyY2UgY29tcGF0aWJsZSkKKyAqICAgIDEuMC41cy12ICAgICAgICAgICAgICAgICAgICAgIDEwMDA2IChub3QgYmluYXJ5IGNvbXBhdGlibGUpCisgKiAgICAxLjAuNiAoKyAzIHBhdGNoZXMpICAgICAgICAgICAxMDAwNiAoc3RpbGwgYmluYXJ5IGluY29tcGF0aWJsZSkKKyAqICAgIDEuMC42ZC1mICAgICAgICAgICAgICAgICAgICAgIDEwMDA3IChzdGlsbCBiaW5hcnkgaW5jb21wYXRpYmxlKQorICogICAgMS4wLjZnICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDcKKyAqICAgIDEuMC42aCAgICAgICAgICAgICAgICAgICAgICAgIDEwMDA3ICAxMC42aCAodGVzdGluZyB4eS56IHNvLW51bWJlcmluZykKKyAqICAgIDEuMC42aSAgICAgICAgICAgICAgICAgICAgICAgIDEwMDA3ICAxMC42aQorICogICAgMS4wLjZqICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDcgIDIuMS4wLjZqIChpbmNvbXBhdGlibGUgd2l0aCAxLjAuMCkKKyAqICAgIDEuMC43YmV0YTExLTE0ICAgICAgICBETExOVU0gIDEwMDA3ICAyLjEuMC43YmV0YTExLTE0IChiaW5hcnkgY29tcGF0aWJsZSkKKyAqICAgIDEuMC43YmV0YTE1LTE4ICAgICAgICAgICAxICAgIDEwMDA3ICAyLjEuMC43YmV0YTE1LTE4IChiaW5hcnkgY29tcGF0aWJsZSkKKyAqICAgIDEuMC43cmMxLTIgICAgICAgICAgICAgICAxICAgIDEwMDA3ICAyLjEuMC43cmMxLTIgKGJpbmFyeSBjb21wYXRpYmxlKQorICogICAgMS4wLjcgICAgICAgICAgICAgICAgICAgIDEgICAgMTAwMDcgIChzdGlsbCBjb21wYXRpYmxlKQorICogICAgLi4uCisgKiAgICAxLjAuMTkgICAgICAgICAgICAgICAgICAxMCAgICAxMDAxOSAgMTAuc28uMC4xOVsuMF0KKyAqICAgIC4uLgorICogICAgMS4yLjUzICAgICAgICAgICAgICAgICAgMTMgICAgMTAyNTMgIDEyLnNvLjAuNTNbLjBdCisgKiAgICAuLi4KKyAqICAgIDEuNS4yMyAgICAgICAgICAgICAgICAgIDE1ICAgIDEwNTIzICAxNS5zby4xNS4yM1suMF0KKyAqICAgIC4uLgorICogICAgMS42LjIwICAgICAgICAgICAgICAgICAgMTYgICAgMTA2MjAgIDE2LnNvLjE2LjIwWy4wXQorICoKKyAqICAgIEhlbmNlZm9ydGggdGhlIHNvdXJjZSB2ZXJzaW9uIHdpbGwgbWF0Y2ggdGhlIHNoYXJlZC1saWJyYXJ5IG1ham9yCisgKiAgICBhbmQgbWlub3IgbnVtYmVyczsgdGhlIHNoYXJlZC1saWJyYXJ5IG1ham9yIHZlcnNpb24gbnVtYmVyIHdpbGwgYmUKKyAqICAgIHVzZWQgZm9yIGNoYW5nZXMgaW4gYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgYXMgaXQgaXMgaW50ZW5kZWQuICBUaGUKKyAqICAgIFBOR19MSUJQTkdfVkVSIG1hY3JvLCB3aGljaCBpcyBub3QgdXNlZCB3aXRoaW4gbGlicG5nIGJ1dCBpcyBhdmFpbGFibGUKKyAqICAgIGZvciBhcHBsaWNhdGlvbnMsIGlzIGFuIHVuc2lnbmVkIGludGVnZXIgb2YgdGhlIGZvcm0geHl5enogY29ycmVzcG9uZGluZworICogICAgdG8gdGhlIHNvdXJjZSB2ZXJzaW9uIHgueS56IChsZWFkaW5nIHplcm9zIGluIHkgYW5kIHopLiAgQmV0YSB2ZXJzaW9ucworICogICAgd2VyZSBnaXZlbiB0aGUgcHJldmlvdXMgcHVibGljIHJlbGVhc2UgbnVtYmVyIHBsdXMgYSBsZXR0ZXIsIHVudGlsCisgKiAgICB2ZXJzaW9uIDEuMC42ajsgZnJvbSB0aGVuIG9uIHRoZXkgd2VyZSBnaXZlbiB0aGUgdXBjb21pbmcgcHVibGljCisgKiAgICByZWxlYXNlIG51bWJlciBwbHVzICJiZXRhTk4iIG9yICJyY05OIi4KKyAqCisgKiAgICBCaW5hcnkgaW5jb21wYXRpYmlsaXR5IGV4aXN0cyBvbmx5IHdoZW4gYXBwbGljYXRpb25zIG1ha2UgZGlyZWN0IGFjY2VzcworICogICAgdG8gdGhlIGluZm9fcHRyIG9yIHBuZ19wdHIgbWVtYmVycyB0aHJvdWdoIHBuZy5oLCBhbmQgdGhlIGNvbXBpbGVkCisgKiAgICBhcHBsaWNhdGlvbiBpcyBsb2FkZWQgd2l0aCBhIGRpZmZlcmVudCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LgorICoKKyAqICAgIERMTE5VTSB3aWxsIGNoYW5nZSBlYWNoIHRpbWUgdGhlcmUgYXJlIGZvcndhcmQgb3IgYmFja3dhcmQgY2hhbmdlcworICogICAgaW4gYmluYXJ5IGNvbXBhdGliaWxpdHkgKGUuZy4sIHdoZW4gYSBuZXcgZmVhdHVyZSBpcyBhZGRlZCkuCisgKgorICogU2VlIGxpYnBuZy50eHQgb3IgbGlicG5nLjMgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBUaGUgUE5HIHNwZWNpZmljYXRpb24KKyAqIGlzIGF2YWlsYWJsZSBhcyBhIFczQyBSZWNvbW1lbmRhdGlvbiBhbmQgYXMgYW4gSVNPIFNwZWNpZmljYXRpb24sCisgKiA8aHR0cDovL3d3dy53My5vcmcvVFIvMjAwMy9SRUMtUE5HLTIwMDMxMTEwLworICovCisKKy8qCisgKiBZMksgY29tcGxpYW5jZSBpbiBsaWJwbmc6CisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogICAgRGVjZW1iZXIgMywgMjAxNQorICoKKyAqICAgIFNpbmNlIHRoZSBQTkcgRGV2ZWxvcG1lbnQgZ3JvdXAgaXMgYW4gYWQtaG9jIGJvZHksIHdlIGNhbid0IG1ha2UKKyAqICAgIGFuIG9mZmljaWFsIGRlY2xhcmF0aW9uLgorICoKKyAqICAgIFRoaXMgaXMgeW91ciB1bm9mZmljaWFsIGFzc3VyYW5jZSB0aGF0IGxpYnBuZyBmcm9tIHZlcnNpb24gMC43MSBhbmQKKyAqICAgIHVwd2FyZCB0aHJvdWdoIDEuNi4yMCBhcmUgWTJLIGNvbXBsaWFudC4gIEl0IGlzIG15IGJlbGllZiB0aGF0CisgKiAgICBlYXJsaWVyIHZlcnNpb25zIHdlcmUgYWxzbyBZMksgY29tcGxpYW50LgorICoKKyAqICAgIExpYnBuZyBvbmx5IGhhcyB0d28geWVhciBmaWVsZHMuICBPbmUgaXMgYSAyLWJ5dGUgdW5zaWduZWQgaW50ZWdlcgorICogICAgdGhhdCB3aWxsIGhvbGQgeWVhcnMgdXAgdG8gNjU1MzUuICBUaGUgb3RoZXIsIHdoaWNoIGlzIGRlcHJlY2F0ZWQsCisgKiAgICBob2xkcyB0aGUgZGF0ZSBpbiB0ZXh0IGZvcm1hdCwgYW5kIHdpbGwgaG9sZCB5ZWFycyB1cCB0byA5OTk5LgorICoKKyAqICAgIFRoZSBpbnRlZ2VyIGlzCisgKiAgICAgICAgInBuZ191aW50XzE2IHllYXIiIGluIHBuZ190aW1lX3N0cnVjdC4KKyAqCisgKiAgICBUaGUgc3RyaW5nIGlzCisgKiAgICAgICAgImNoYXIgdGltZV9idWZmZXJbMjldIiBpbiBwbmdfc3RydWN0LiAgVGhpcyBpcyBubyBsb25nZXIgdXNlZAorICogICAgaW4gbGlicG5nLTEuNi54IGFuZCB3aWxsIGJlIHJlbW92ZWQgZnJvbSBsaWJwbmctMS43LjAuCisgKgorICogICAgVGhlcmUgYXJlIHNldmVuIHRpbWUtcmVsYXRlZCBmdW5jdGlvbnM6CisgKiAgICAgICAgcG5nLmM6IHBuZ19jb252ZXJ0X3RvX3JmY18xMTIzX2J1ZmZlcigpIGluIHBuZy5jCisgKiAgICAgICAgICAoZm9ybWVybHkgcG5nX2NvbnZlcnRfdG9fcmZjXzExMjMoKSBwcmlvciB0byBsaWJwbmctMS41LnggYW5kCisgKiAgICAgICAgICBwbmdfY29udmVydF90b19yZmNfMTE1MigpIGluIGVycm9yIHByaW9yIHRvIGxpYnBuZy0wLjk4KQorICogICAgICAgIHBuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtKCkgaW4gcG5nd3JpdGUuYywgY2FsbGVkIGluIHBuZ3dyaXRlLmMKKyAqICAgICAgICBwbmdfY29udmVydF9mcm9tX3RpbWVfdCgpIGluIHBuZ3dyaXRlLmMKKyAqICAgICAgICBwbmdfZ2V0X3RJTUUoKSBpbiBwbmdnZXQuYworICogICAgICAgIHBuZ19oYW5kbGVfdElNRSgpIGluIHBuZ3J1dGlsLmMsIGNhbGxlZCBpbiBwbmdyZWFkLmMKKyAqICAgICAgICBwbmdfc2V0X3RJTUUoKSBpbiBwbmdzZXQuYworICogICAgICAgIHBuZ193cml0ZV90SU1FKCkgaW4gcG5nd3V0aWwuYywgY2FsbGVkIGluIHBuZ3dyaXRlLmMKKyAqCisgKiAgICBBbGwgaGFuZGxlIGRhdGVzIHByb3Blcmx5IGluIGEgWTJLIGVudmlyb25tZW50LiAgVGhlCisgKiAgICBwbmdfY29udmVydF9mcm9tX3RpbWVfdCgpIGZ1bmN0aW9uIGNhbGxzIGdtdGltZSgpIHRvIGNvbnZlcnQgZnJvbSBzeXN0ZW0KKyAqICAgIGNsb2NrIHRpbWUsIHdoaWNoIHJldHVybnMgKHllYXIgLSAxOTAwKSwgd2hpY2ggd2UgcHJvcGVybHkgY29udmVydCB0bworICogICAgdGhlIGZ1bGwgNC1kaWdpdCB5ZWFyLiAgVGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IGxpYnBuZyBhcHBsaWNhdGlvbnMKKyAqICAgIGFyZSBub3QgcGFzc2luZyA0LWRpZ2l0IHllYXJzIGludG8gdGhlIHBuZ19jb252ZXJ0X3RvX3JmY18xMTIzX2J1ZmZlcigpCisgKiAgICBmdW5jdGlvbiwgb3IgdGhhdCB0aGV5IGFyZSBpbmNvcnJlY3RseSBwYXNzaW5nIG9ubHkgYSAyLWRpZ2l0IHllYXIKKyAqICAgIGluc3RlYWQgb2YgInllYXIgLSAxOTAwIiBpbnRvIHRoZSBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSgpIGZ1bmN0aW9uLAorICogICAgYnV0IHRoaXMgaXMgbm90IHVuZGVyIG91ciBjb250cm9sLiAgVGhlIGxpYnBuZyBkb2N1bWVudGF0aW9uIGhhcyBhbHdheXMKKyAqICAgIHN0YXRlZCB0aGF0IGl0IHdvcmtzIHdpdGggNC1kaWdpdCB5ZWFycywgYW5kIHRoZSBBUElzIGhhdmUgYmVlbgorICogICAgZG9jdW1lbnRlZCBhcyBzdWNoLgorICoKKyAqICAgIFRoZSB0SU1FIGNodW5rIGl0c2VsZiBpcyBhbHNvIFkySyBjb21wbGlhbnQuICBJdCB1c2VzIGEgMi1ieXRlIHVuc2lnbmVkCisgKiAgICBpbnRlZ2VyIHRvIGhvbGQgdGhlIHllYXIsIGFuZCBjYW4gaG9sZCB5ZWFycyBhcyBsYXJnZSBhcyA2NTUzNS4KKyAqCisgKiAgICB6bGliLCB1cG9uIHdoaWNoIGxpYnBuZyBkZXBlbmRzLCBpcyBhbHNvIFkySyBjb21wbGlhbnQuICBJdCBjb250YWlucworICogICAgbm8gZGF0ZS1yZWxhdGVkIGNvZGUuCisgKgorICogICAgICAgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKiAgICAgICBsaWJwbmcgbWFpbnRhaW5lcgorICogICAgICAgUE5HIERldmVsb3BtZW50IEdyb3VwCisgKi8KKworI2lmbmRlZiBQTkdfSAorI2RlZmluZSBQTkdfSAorCisvKiBUaGlzIGlzIG5vdCB0aGUgcGxhY2UgdG8gbGVhcm4gaG93IHRvIHVzZSBsaWJwbmcuIFRoZSBmaWxlIGxpYnBuZy1tYW51YWwudHh0CisgKiBkZXNjcmliZXMgaG93IHRvIHVzZSBsaWJwbmcsIGFuZCB0aGUgZmlsZSBleGFtcGxlLmMgc3VtbWFyaXplcyBpdAorICogd2l0aCBzb21lIGNvZGUgb24gd2hpY2ggdG8gYnVpbGQuICBUaGlzIGZpbGUgaXMgdXNlZnVsIGZvciBsb29raW5nCisgKiBhdCB0aGUgYWN0dWFsIGZ1bmN0aW9uIGRlZmluaXRpb25zIGFuZCBzdHJ1Y3R1cmUgY29tcG9uZW50cy4gIElmIHRoYXQKKyAqIGZpbGUgaGFzIGJlZW4gc3RyaXBwZWQgZnJvbSB5b3VyIGNvcHkgb2YgbGlicG5nLCB5b3UgY2FuIGZpbmQgaXQgYXQKKyAqIDxodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9saWJwbmctbWFudWFsLnR4dD4KKyAqCisgKiBJZiB5b3UganVzdCBuZWVkIHRvIHJlYWQgYSBQTkcgZmlsZSBhbmQgZG9uJ3Qgd2FudCB0byByZWFkIHRoZSBkb2N1bWVudGF0aW9uCisgKiBza2lwIHRvIHRoZSBlbmQgb2YgdGhpcyBmaWxlIGFuZCByZWFkIHRoZSBzZWN0aW9uIGVudGl0bGVkICdzaW1wbGlmaWVkIEFQSScuCisgKi8KKworLyogVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgcG5nLmggLSB0aGlzIHNob3VsZCBtYXRjaCB0aGUgdmVyc2lvbiBpbiBwbmcuYyAqLworI2RlZmluZSBQTkdfTElCUE5HX1ZFUl9TVFJJTkcgIjEuNi4yMCIKKyNkZWZpbmUgUE5HX0hFQURFUl9WRVJTSU9OX1NUUklORyBcCisgICAgICIgbGlicG5nIHZlcnNpb24gMS42LjIwIC0gRGVjZW1iZXIgMywgMjAxNVxuIgorCisjZGVmaW5lIFBOR19MSUJQTkdfVkVSX1NPTlVNICAgMTYKKyNkZWZpbmUgUE5HX0xJQlBOR19WRVJfRExMTlVNICAxNgorCisvKiBUaGVzZSBzaG91bGQgbWF0Y2ggdGhlIGZpcnN0IDMgY29tcG9uZW50cyBvZiBQTkdfTElCUE5HX1ZFUl9TVFJJTkc6ICovCisjZGVmaW5lIFBOR19MSUJQTkdfVkVSX01BSk9SICAgMQorI2RlZmluZSBQTkdfTElCUE5HX1ZFUl9NSU5PUiAgIDYKKyNkZWZpbmUgUE5HX0xJQlBOR19WRVJfUkVMRUFTRSAyMAorCisvKiBUaGlzIHNob3VsZCBtYXRjaCB0aGUgbnVtZXJpYyBwYXJ0IG9mIHRoZSBmaW5hbCBjb21wb25lbnQgb2YKKyAqIFBOR19MSUJQTkdfVkVSX1NUUklORywgb21pdHRpbmcgYW55IGxlYWRpbmcgemVybzoKKyAqLworCisjZGVmaW5lIFBOR19MSUJQTkdfVkVSX0JVSUxEICAwCisKKy8qIFJlbGVhc2UgU3RhdHVzICovCisjZGVmaW5lIFBOR19MSUJQTkdfQlVJTERfQUxQSEEgICAgMQorI2RlZmluZSBQTkdfTElCUE5HX0JVSUxEX0JFVEEgICAgIDIKKyNkZWZpbmUgUE5HX0xJQlBOR19CVUlMRF9SQyAgICAgICAzCisjZGVmaW5lIFBOR19MSUJQTkdfQlVJTERfU1RBQkxFICAgNAorI2RlZmluZSBQTkdfTElCUE5HX0JVSUxEX1JFTEVBU0VfU1RBVFVTX01BU0sgNworCisvKiBSZWxlYXNlLVNwZWNpZmljIEZsYWdzICovCisjZGVmaW5lIFBOR19MSUJQTkdfQlVJTERfUEFUQ0ggICAgOCAvKiBDYW4gYmUgT1InZWQgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0xJQlBOR19CVUlMRF9TVEFCTEUgb25seSAqLworI2RlZmluZSBQTkdfTElCUE5HX0JVSUxEX1BSSVZBVEUgMTYgLyogQ2Fubm90IGJlIE9SJ2VkIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19MSUJQTkdfQlVJTERfU1BFQ0lBTCAqLworI2RlZmluZSBQTkdfTElCUE5HX0JVSUxEX1NQRUNJQUwgMzIgLyogQ2Fubm90IGJlIE9SJ2VkIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19MSUJQTkdfQlVJTERfUFJJVkFURSAqLworCisjZGVmaW5lIFBOR19MSUJQTkdfQlVJTERfQkFTRV9UWVBFIFBOR19MSUJQTkdfQlVJTERfU1RBQkxFCisKKy8qIENhcmVmdWwgaGVyZS4gIEF0IG9uZSB0aW1lLCBHdXkgd2FudGVkIHRvIHVzZSAwODIsIGJ1dCB0aGF0IHdvdWxkIGJlIG9jdGFsLgorICogV2UgbXVzdCBub3QgaW5jbHVkZSBsZWFkaW5nIHplcm9zLgorICogVmVyc2lvbnMgMC43IHRocm91Z2ggMS4wLjAgd2VyZSBpbiB0aGUgcmFuZ2UgMCB0byAxMDAgaGVyZSAob25seQorICogdmVyc2lvbiAxLjAuMCB3YXMgbWlzLW51bWJlcmVkIDEwMCBpbnN0ZWFkIG9mIDEwMDAwKS4gIEZyb20KKyAqIHZlcnNpb24gMS4wLjEgaXQncyAgICB4eHl5enosIHdoZXJlIHg9bWFqb3IsIHk9bWlub3IsIHo9cmVsZWFzZQorICovCisjZGVmaW5lIFBOR19MSUJQTkdfVkVSIDEwNjIwIC8qIDEuNi4yMCAqLworCisvKiBMaWJyYXJ5IGNvbmZpZ3VyYXRpb246IHRoZXNlIG9wdGlvbnMgY2Fubm90IGJlIGNoYW5nZWQgYWZ0ZXIKKyAqIHRoZSBsaWJyYXJ5IGhhcyBiZWVuIGJ1aWx0LgorICovCisjaWZuZGVmIFBOR0xDT05GX0gKKyAgICAvKiBJZiBwbmdsaWJjb25mLmggaXMgbWlzc2luZywgeW91IGNhbgorICAgICAqIGNvcHkgc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQgdG8gcG5nbGliY29uZi5oCisgICAgICovCisjICAgaW5jbHVkZSAicG5nbGliY29uZi5oIgorI2VuZGlmCisKKyNpZm5kZWYgUE5HX1ZFUlNJT05fSU5GT19PTkxZCisgICAvKiBNYWNoaW5lIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uICovCisjICBpbmNsdWRlICJwbmdjb25mLmgiCisjZW5kaWYKKworLyoKKyAqIEFkZGVkIGF0IGxpYnBuZy0xLjIuOAorICoKKyAqIFJlZiBNU0ROOiBQcml2YXRlIGFzIHByaW9yaXR5IG92ZXIgU3BlY2lhbAorICogVlNfRkZfUFJJVkFURUJVSUxEIEZpbGUgKndhcyBub3QqIGJ1aWx0IHVzaW5nIHN0YW5kYXJkIHJlbGVhc2UKKyAqIHByb2NlZHVyZXMuIElmIHRoaXMgdmFsdWUgaXMgZ2l2ZW4sIHRoZSBTdHJpbmdGaWxlSW5mbyBibG9jayBtdXN0CisgKiBjb250YWluIGEgUHJpdmF0ZUJ1aWxkIHN0cmluZy4KKyAqCisgKiBWU19GRl9TUEVDSUFMQlVJTEQgRmlsZSAqd2FzKiBidWlsdCBieSB0aGUgb3JpZ2luYWwgY29tcGFueSB1c2luZworICogc3RhbmRhcmQgcmVsZWFzZSBwcm9jZWR1cmVzIGJ1dCBpcyBhIHZhcmlhdGlvbiBvZiB0aGUgc3RhbmRhcmQKKyAqIGZpbGUgb2YgdGhlIHNhbWUgdmVyc2lvbiBudW1iZXIuIElmIHRoaXMgdmFsdWUgaXMgZ2l2ZW4sIHRoZQorICogU3RyaW5nRmlsZUluZm8gYmxvY2sgbXVzdCBjb250YWluIGEgU3BlY2lhbEJ1aWxkIHN0cmluZy4KKyAqLworCisjaWZkZWYgUE5HX1VTRVJfUFJJVkFURUJVSUxEIC8qIEZyb20gcG5nbGliY29uZi5oICovCisjICBkZWZpbmUgUE5HX0xJQlBOR19CVUlMRF9UWVBFIFwKKyAgICAgICAoUE5HX0xJQlBOR19CVUlMRF9CQVNFX1RZUEUgfCBQTkdfTElCUE5HX0JVSUxEX1BSSVZBVEUpCisjZWxzZQorIyAgaWZkZWYgUE5HX0xJQlBOR19TUEVDSUFMQlVJTEQKKyMgICAgZGVmaW5lIFBOR19MSUJQTkdfQlVJTERfVFlQRSBcCisgICAgICAgICAoUE5HX0xJQlBOR19CVUlMRF9CQVNFX1RZUEUgfCBQTkdfTElCUE5HX0JVSUxEX1NQRUNJQUwpCisjICBlbHNlCisjICAgIGRlZmluZSBQTkdfTElCUE5HX0JVSUxEX1RZUEUgKFBOR19MSUJQTkdfQlVJTERfQkFTRV9UWVBFKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFBOR19WRVJTSU9OX0lORk9fT05MWQorCisvKiBJbmhpYml0IEMrKyBuYW1lLW1hbmdsaW5nIGZvciBsaWJwbmcgZnVuY3Rpb25zIGJ1dCBub3QgZm9yIHN5c3RlbSBjYWxscy4gKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyogVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgQyBmaWxlcywgc3RvcmVkIGluIHBuZy5jLiAgVGhpcyBoYWQgYmV0dGVyIG1hdGNoCisgKiB0aGUgdmVyc2lvbiBhYm92ZS4KKyAqLworI2RlZmluZSBwbmdfbGlicG5nX3ZlciBwbmdfZ2V0X2hlYWRlcl92ZXIoTlVMTCkKKworLyogVGhpcyBmaWxlIGlzIGFycmFuZ2VkIGluIHNldmVyYWwgc2VjdGlvbnM6CisgKgorICogMS4gW29taXR0ZWRdCisgKiAyLiBBbnkgY29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgY2FuIGJlIHNwZWNpZmllZCBieSBmb3IgdGhlIGFwcGxpY2F0aW9uCisgKiAgICBjb2RlIHdoZW4gaXQgaXMgYnVpbHQuICAoQnVpbGQgdGltZSBjb25maWd1cmF0aW9uIGlzIGluIHBuZ2xpYmNvbmYuaCkKKyAqIDMuIFR5cGUgZGVmaW5pdGlvbnMgKGJhc2UgdHlwZXMgYXJlIGRlZmluZWQgaW4gcG5nY29uZi5oKSwgc3RydWN0dXJlCisgKiAgICBkZWZpbml0aW9ucy4KKyAqIDQuIEV4cG9ydGVkIGxpYnJhcnkgZnVuY3Rpb25zLgorICogNS4gU2ltcGxpZmllZCBBUEkuCisgKiA2LiBJbXBsZW1lbnRhdGlvbiBvcHRpb25zLgorICoKKyAqIFRoZSBsaWJyYXJ5IHNvdXJjZSBjb2RlIGhhcyBhZGRpdGlvbmFsIGZpbGVzIChwcmluY2lwYWxseSBwbmdwcml2LmgpIHRoYXQKKyAqIGFsbG93IGNvbmZpZ3VyYXRpb24gb2YgdGhlIGxpYnJhcnkuCisgKi8KKworLyogU2VjdGlvbiAxOiBbb21pdHRlZF0gKi8KKworLyogU2VjdGlvbiAyOiBydW4gdGltZSBjb25maWd1cmF0aW9uCisgKiBTZWUgcG5nbGliY29uZi5oIGZvciBidWlsZCB0aW1lIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBSdW4gdGltZSBjb25maWd1cmF0aW9uIGFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gY2hvb3NlIGJldHdlZW4KKyAqIGltcGxlbWVudGF0aW9ucyBvZiBjZXJ0YWluIGFyaXRobWV0aWMgQVBJcy4gIFRoZSBkZWZhdWx0IGlzIHNldAorICogYXQgYnVpbGQgdGltZSBhbmQgcmVjb3JkZWQgaW4gcG5nbGliY29uZi5oLCBidXQgaXQgaXMgc2FmZSB0bworICogb3ZlcnJpZGUgdGhlc2UgKGFuZCBvbmx5IHRoZXNlKSBzZXR0aW5ncy4gIE5vdGUgdGhhdCB0aGlzIHdvbid0CisgKiBjaGFuZ2Ugd2hhdCB0aGUgbGlicmFyeSBkb2VzLCBvbmx5IGFwcGxpY2F0aW9uIGNvZGUsIGFuZCB0aGUKKyAqIHNldHRpbmdzIGNhbiAoYW5kIHByb2JhYmx5IHNob3VsZCkgYmUgbWFkZSBvbiBhIHBlci1maWxlIGJhc2lzCisgKiBieSBzZXR0aW5nIHRoZSAjZGVmaW5lcyBiZWZvcmUgaW5jbHVkaW5nIHBuZy5oCisgKgorICogVXNlIG1hY3JvcyB0byByZWFkIGludGVnZXJzIGZyb20gUE5HIGRhdGEgb3IgdXNlIHRoZSBleHBvcnRlZAorICogZnVuY3Rpb25zPworICogICBQTkdfVVNFX1JFQURfTUFDUk9TOiB1c2UgdGhlIG1hY3JvcyAoc2VlIGJlbG93KSAgTm90ZSB0aGF0CisgKiAgICAgdGhlIG1hY3JvcyBldmFsdWF0ZSB0aGVpciBhcmd1bWVudCBtdWx0aXBsZSB0aW1lcy4KKyAqICAgUE5HX05PX1VTRV9SRUFEX01BQ1JPUzogY2FsbCB0aGUgcmVsZXZhbnQgbGlicmFyeSBmdW5jdGlvbi4KKyAqCisgKiBVc2UgdGhlIGFsdGVybmF0aXZlIGFsZ29yaXRobSBmb3IgY29tcG9zaXRpbmcgYWxwaGEgc2FtcGxlcyB0aGF0CisgKiBkb2VzIG5vdCB1c2UgZGl2aXNpb24/CisgKiAgIFBOR19SRUFEX0NPTVBPU0lURV9OT0RJVl9TVVBQT1JURUQ6IHVzZSB0aGUgJ25vIGRpdmlzaW9uJworICogICAgICBhbGdvcml0aG0uCisgKiAgIFBOR19OT19SRUFEX0NPTVBPU0lURV9OT0RJVjogdXNlIHRoZSAnZGl2aXNpb24nIGFsZ29yaXRobS4KKyAqCisgKiBIb3cgdG8gaGFuZGxlIGJlbmlnbiBlcnJvcnMgaWYgUE5HX0FMTE9XX0JFTklHTl9FUlJPUlMgaXMKKyAqIGZhbHNlPworICogICBQTkdfQUxMT1dfQkVOSUdOX0VSUk9SUzogbWFwIGNhbGxzIHRvIHRoZSBiZW5pZ24gZXJyb3IKKyAqICAgICAgQVBJcyB0byBwbmdfd2FybmluZy4KKyAqIE90aGVyd2lzZSB0aGUgY2FsbHMgYXJlIG1hcHBlZCB0byBwbmdfZXJyb3IuCisgKi8KKworLyogU2VjdGlvbiAzOiB0eXBlIGRlZmluaXRpb25zLCBpbmNsdWRpbmcgc3RydWN0dXJlcyBhbmQgY29tcGlsZSB0aW1lCisgKiBjb25zdGFudHMuCisgKiBTZWUgcG5nY29uZi5oIGZvciBiYXNlIHR5cGVzIHRoYXQgdmFyeSBieSBtYWNoaW5lL3N5c3RlbQorICovCisKKy8qIFRoaXMgdHJpZ2dlcnMgYSBjb21waWxlciBlcnJvciBpbiBwbmcuYywgaWYgcG5nLmMgYW5kIHBuZy5oCisgKiBkbyBub3QgYWdyZWUgdXBvbiB0aGUgdmVyc2lvbiBudW1iZXIuCisgKi8KK3R5cGVkZWYgY2hhciogcG5nX2xpYnBuZ192ZXJzaW9uXzFfNl8yMDsKKworLyogQmFzaWMgY29udHJvbCBzdHJ1Y3Rpb25zLiAgUmVhZCBsaWJwbmctbWFudWFsLnR4dCBvciBsaWJwbmcuMyBmb3IgbW9yZSBpbmZvLgorICoKKyAqIHBuZ19zdHJ1Y3QgaXMgdGhlIGNhY2hlIG9mIGluZm9ybWF0aW9uIHVzZWQgd2hpbGUgcmVhZGluZyBvciB3cml0aW5nIGEgc2luZ2xlCisgKiBQTkcgZmlsZS4gIE9uZSBvZiB0aGVzZSBpcyBhbHdheXMgcmVxdWlyZWQsIGFsdGhvdWdoIHRoZSBzaW1wbGlmaWVkIEFQSQorICogKGJlbG93KSBoaWRlcyB0aGUgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uIG9mIGl0LgorICovCit0eXBlZGVmIHN0cnVjdCBwbmdfc3RydWN0X2RlZiBwbmdfc3RydWN0OwordHlwZWRlZiBjb25zdCBwbmdfc3RydWN0ICogcG5nX2NvbnN0X3N0cnVjdHA7Cit0eXBlZGVmIHBuZ19zdHJ1Y3QgKiBwbmdfc3RydWN0cDsKK3R5cGVkZWYgcG5nX3N0cnVjdCAqICogcG5nX3N0cnVjdHBwOworCisvKiBwbmdfaW5mbyBjb250YWlucyBpbmZvcm1hdGlvbiByZWFkIGZyb20gb3IgdG8gYmUgd3JpdHRlbiB0byBhIFBORyBmaWxlLiAgT25lCisgKiBvciBtb3JlIG9mIHRoZXNlIG11c3QgZXhpc3Qgd2hpbGUgcmVhZGluZyBvciBjcmVhdGluZyBhIFBORyBmaWxlLiAgVGhlCisgKiBpbmZvcm1hdGlvbiBpcyBub3QgdXNlZCBieSBsaWJwbmcgZHVyaW5nIHJlYWQgYnV0IGlzIHVzZWQgdG8gY29udHJvbCB3aGF0CisgKiBnZXRzIHdyaXR0ZW4gd2hlbiBhIFBORyBmaWxlIGlzIGNyZWF0ZWQuICAicG5nX2dldF8iIGZ1bmN0aW9uIGNhbGxzIHJlYWQKKyAqIGluZm9ybWF0aW9uIGR1cmluZyByZWFkIGFuZCAicG5nX3NldF8iIGZ1bmN0aW9ucyBjYWxscyB3cml0ZSBpbmZvcm1hdGlvbgorICogd2hlbiBjcmVhdGluZyBhIFBORy4KKyAqIGJlZW4gbW92ZWQgaW50byBhIHNlcGFyYXRlIGhlYWRlciBmaWxlIHRoYXQgaXMgbm90IGFjY2Vzc2libGUgdG8KKyAqIGFwcGxpY2F0aW9ucy4gIFJlYWQgbGlicG5nLW1hbnVhbC50eHQgb3IgbGlicG5nLjMgZm9yIG1vcmUgaW5mby4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcG5nX2luZm9fZGVmIHBuZ19pbmZvOwordHlwZWRlZiBwbmdfaW5mbyAqIHBuZ19pbmZvcDsKK3R5cGVkZWYgY29uc3QgcG5nX2luZm8gKiBwbmdfY29uc3RfaW5mb3A7Cit0eXBlZGVmIHBuZ19pbmZvICogKiBwbmdfaW5mb3BwOworCisvKiBUeXBlcyB3aXRoIG5hbWVzIGVuZGluZyAncCcgYXJlIHBvaW50ZXIgdHlwZXMuICBUaGUgY29ycmVzcG9uZGluZyB0eXBlcyB3aXRoCisgKiBuYW1lcyBlbmRpbmcgJ3JwJyBhcmUgaWRlbnRpY2FsIHBvaW50ZXIgdHlwZXMgZXhjZXB0IHRoYXQgdGhlIHBvaW50ZXIgaXMKKyAqIG1hcmtlZCAncmVzdHJpY3QnLCB3aGljaCBtZWFucyB0aGF0IGl0IGlzIHRoZSBvbmx5IHBvaW50ZXIgdG8gdGhlIG9iamVjdAorICogcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi4gIEFwcGxpY2F0aW9ucyBzaG91bGQgbm90IHVzZSB0aGUgJ3Jlc3RyaWN0JyB0eXBlczsKKyAqIGl0IGlzIGFsd2F5cyB2YWxpZCB0byBwYXNzICdwJyB0byBhIHBvaW50ZXIgd2l0aCBhIGZ1bmN0aW9uIGFyZ3VtZW50IG9mIHRoZQorICogY29ycmVzcG9uZGluZyAncnAnIHR5cGUuICBEaWZmZXJlbnQgY29tcGlsZXJzIGhhdmUgZGlmZmVyZW50IHJ1bGVzIHdpdGgKKyAqIHJlZ2FyZCB0byB0eXBlIG1hdGNoaW5nIGluIHRoZSBwcmVzZW5jZSBvZiAncmVzdHJpY3QnLiAgRm9yIGJhY2t3YXJkCisgKiBjb21wYXRpYmlsaXR5IGxpYnBuZyBjYWxsYmFja3MgbmV2ZXIgaGF2ZSAncmVzdHJpY3QnIGluIHRoZWlyIHBhcmFtZXRlcnMgYW5kLAorICogY29uc2VxdWVudGlhbGx5LCB3cml0aW5nIHBvcnRhYmxlIGFwcGxpY2F0aW9uIGNvZGUgaXMgZXh0cmVtZWx5IGRpZmZpY3VsdCBpZgorICogYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHVzZSAncmVzdHJpY3QnLgorICovCit0eXBlZGVmIHBuZ19zdHJ1Y3QgKiBQTkdfUkVTVFJJQ1QgcG5nX3N0cnVjdHJwOwordHlwZWRlZiBjb25zdCBwbmdfc3RydWN0ICogUE5HX1JFU1RSSUNUIHBuZ19jb25zdF9zdHJ1Y3RycDsKK3R5cGVkZWYgcG5nX2luZm8gKiBQTkdfUkVTVFJJQ1QgcG5nX2luZm9ycDsKK3R5cGVkZWYgY29uc3QgcG5nX2luZm8gKiBQTkdfUkVTVFJJQ1QgcG5nX2NvbnN0X2luZm9ycDsKKworLyogVGhyZWUgY29sb3IgZGVmaW5pdGlvbnMuICBUaGUgb3JkZXIgb2YgdGhlIHJlZCwgZ3JlZW4sIGFuZCBibHVlLCAoYW5kIHRoZQorICogZXhhY3Qgc2l6ZSkgaXMgbm90IGltcG9ydGFudCwgYWx0aG91Z2ggdGhlIHNpemUgb2YgdGhlIGZpZWxkcyBuZWVkIHRvCisgKiBiZSBwbmdfYnl0ZSBvciBwbmdfdWludF8xNiAoYXMgZGVmaW5lZCBiZWxvdykuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBuZ19jb2xvcl9zdHJ1Y3QKK3sKKyAgIHBuZ19ieXRlIHJlZDsKKyAgIHBuZ19ieXRlIGdyZWVuOworICAgcG5nX2J5dGUgYmx1ZTsKK30gcG5nX2NvbG9yOwordHlwZWRlZiBwbmdfY29sb3IgKiBwbmdfY29sb3JwOwordHlwZWRlZiBjb25zdCBwbmdfY29sb3IgKiBwbmdfY29uc3RfY29sb3JwOwordHlwZWRlZiBwbmdfY29sb3IgKiAqIHBuZ19jb2xvcnBwOworCit0eXBlZGVmIHN0cnVjdCBwbmdfY29sb3JfMTZfc3RydWN0Cit7CisgICBwbmdfYnl0ZSBpbmRleDsgICAgLyogdXNlZCBmb3IgcGFsZXR0ZSBmaWxlcyAqLworICAgcG5nX3VpbnRfMTYgcmVkOyAgIC8qIGZvciB1c2UgaW4gcmVkIGdyZWVuIGJsdWUgZmlsZXMgKi8KKyAgIHBuZ191aW50XzE2IGdyZWVuOworICAgcG5nX3VpbnRfMTYgYmx1ZTsKKyAgIHBuZ191aW50XzE2IGdyYXk7ICAvKiBmb3IgdXNlIGluIGdyYXlzY2FsZSBmaWxlcyAqLworfSBwbmdfY29sb3JfMTY7Cit0eXBlZGVmIHBuZ19jb2xvcl8xNiAqIHBuZ19jb2xvcl8xNnA7Cit0eXBlZGVmIGNvbnN0IHBuZ19jb2xvcl8xNiAqIHBuZ19jb25zdF9jb2xvcl8xNnA7Cit0eXBlZGVmIHBuZ19jb2xvcl8xNiAqICogcG5nX2NvbG9yXzE2cHA7CisKK3R5cGVkZWYgc3RydWN0IHBuZ19jb2xvcl84X3N0cnVjdAoreworICAgcG5nX2J5dGUgcmVkOyAgIC8qIGZvciB1c2UgaW4gcmVkIGdyZWVuIGJsdWUgZmlsZXMgKi8KKyAgIHBuZ19ieXRlIGdyZWVuOworICAgcG5nX2J5dGUgYmx1ZTsKKyAgIHBuZ19ieXRlIGdyYXk7ICAvKiBmb3IgdXNlIGluIGdyYXlzY2FsZSBmaWxlcyAqLworICAgcG5nX2J5dGUgYWxwaGE7IC8qIGZvciBhbHBoYSBjaGFubmVsIGZpbGVzICovCit9IHBuZ19jb2xvcl84OwordHlwZWRlZiBwbmdfY29sb3JfOCAqIHBuZ19jb2xvcl84cDsKK3R5cGVkZWYgY29uc3QgcG5nX2NvbG9yXzggKiBwbmdfY29uc3RfY29sb3JfOHA7Cit0eXBlZGVmIHBuZ19jb2xvcl84ICogKiBwbmdfY29sb3JfOHBwOworCisvKgorICogVGhlIGZvbGxvd2luZyB0d28gc3RydWN0dXJlcyBhcmUgdXNlZCBmb3IgdGhlIGluLWNvcmUgcmVwcmVzZW50YXRpb24KKyAqIG9mIHNQTFQgY2h1bmtzLgorICovCit0eXBlZGVmIHN0cnVjdCBwbmdfc1BMVF9lbnRyeV9zdHJ1Y3QKK3sKKyAgIHBuZ191aW50XzE2IHJlZDsKKyAgIHBuZ191aW50XzE2IGdyZWVuOworICAgcG5nX3VpbnRfMTYgYmx1ZTsKKyAgIHBuZ191aW50XzE2IGFscGhhOworICAgcG5nX3VpbnRfMTYgZnJlcXVlbmN5OworfSBwbmdfc1BMVF9lbnRyeTsKK3R5cGVkZWYgcG5nX3NQTFRfZW50cnkgKiBwbmdfc1BMVF9lbnRyeXA7Cit0eXBlZGVmIGNvbnN0IHBuZ19zUExUX2VudHJ5ICogcG5nX2NvbnN0X3NQTFRfZW50cnlwOwordHlwZWRlZiBwbmdfc1BMVF9lbnRyeSAqICogcG5nX3NQTFRfZW50cnlwcDsKKworLyogIFdoZW4gdGhlIGRlcHRoIG9mIHRoZSBzUExUIHBhbGV0dGUgaXMgOCBiaXRzLCB0aGUgY29sb3IgYW5kIGFscGhhIHNhbXBsZXMKKyAqICBvY2N1cHkgdGhlIExTQiBvZiB0aGVpciByZXNwZWN0aXZlIG1lbWJlcnMsIGFuZCB0aGUgTVNCIG9mIGVhY2ggbWVtYmVyCisgKiAgaXMgemVyby1maWxsZWQuICBUaGUgZnJlcXVlbmN5IG1lbWJlciBhbHdheXMgb2NjdXBpZXMgdGhlIGZ1bGwgMTYgYml0cy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBwbmdfc1BMVF9zdHJ1Y3QKK3sKKyAgIHBuZ19jaGFycCBuYW1lOyAgICAgICAgICAgLyogcGFsZXR0ZSBuYW1lICovCisgICBwbmdfYnl0ZSBkZXB0aDsgICAgICAgICAgIC8qIGRlcHRoIG9mIHBhbGV0dGUgc2FtcGxlcyAqLworICAgcG5nX3NQTFRfZW50cnlwIGVudHJpZXM7ICAvKiBwYWxldHRlIGVudHJpZXMgKi8KKyAgIHBuZ19pbnRfMzIgbmVudHJpZXM7ICAgICAgLyogbnVtYmVyIG9mIHBhbGV0dGUgZW50cmllcyAqLworfSBwbmdfc1BMVF90OwordHlwZWRlZiBwbmdfc1BMVF90ICogcG5nX3NQTFRfdHA7Cit0eXBlZGVmIGNvbnN0IHBuZ19zUExUX3QgKiBwbmdfY29uc3Rfc1BMVF90cDsKK3R5cGVkZWYgcG5nX3NQTFRfdCAqICogcG5nX3NQTFRfdHBwOworCisjaWZkZWYgUE5HX1RFWFRfU1VQUE9SVEVECisvKiBwbmdfdGV4dCBob2xkcyB0aGUgY29udGVudHMgb2YgYSB0ZXh0L3p0eHQvaXR4dCBjaHVuayBpbiBhIFBORyBmaWxlLAorICogYW5kIHdoZXRoZXIgdGhhdCBjb250ZW50cyBpcyBjb21wcmVzc2VkIG9yIG5vdC4gIFRoZSAia2V5IiBmaWVsZAorICogcG9pbnRzIHRvIGEgcmVndWxhciB6ZXJvLXRlcm1pbmF0ZWQgQyBzdHJpbmcuICBUaGUgInRleHQiIGZpZWxkcyBjYW4gYmUgYQorICogcmVndWxhciBDIHN0cmluZywgYW4gZW1wdHkgc3RyaW5nLCBvciBhIE5VTEwgcG9pbnRlci4KKyAqIEhvd2V2ZXIsIHRoZSBzdHJ1Y3R1cmUgcmV0dXJuZWQgYnkgcG5nX2dldF90ZXh0KCkgd2lsbCBhbHdheXMgY29udGFpbgorICogdGhlICJ0ZXh0IiBmaWVsZCBhcyBhIHJlZ3VsYXIgemVyby10ZXJtaW5hdGVkIEMgc3RyaW5nIChwb3NzaWJseQorICogZW1wdHkpLCBuZXZlciBhIE5VTEwgcG9pbnRlciwgc28gaXQgY2FuIGJlIHNhZmVseSB1c2VkIGluIHByaW50ZigpIGFuZAorICogb3RoZXIgc3RyaW5nLWhhbmRsaW5nIGZ1bmN0aW9ucy4gIE5vdGUgdGhhdCB0aGUgIml0eHRfbGVuZ3RoIiwgImxhbmciLCBhbmQKKyAqICJsYW5nX2tleSIgbWVtYmVycyBvZiB0aGUgc3RydWN0dXJlIG9ubHkgZXhpc3Qgd2hlbiB0aGUgbGlicmFyeSBpcyBidWlsdAorICogd2l0aCBpVFh0IGNodW5rIHN1cHBvcnQuICBQcmlvciB0byBsaWJwbmctMS40LjAgdGhlIGxpYnJhcnkgd2FzIGJ1aWx0IGJ5CisgKiBkZWZhdWx0IHdpdGhvdXQgaVRYdCBzdXBwb3J0LiBBbHNvIG5vdGUgdGhhdCB3aGVuIGlUWHQgKmlzKiBzdXBwb3J0ZWQsCisgKiB0aGUgImxhbmciIGFuZCAibGFuZ19rZXkiIGZpZWxkcyBjb250YWluIE5VTEwgcG9pbnRlcnMgd2hlbiB0aGUKKyAqICJjb21wcmVzc2lvbiIgZmllbGQgY29udGFpbnMgKiBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FIG9yCisgKiBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0LiBOb3RlIHRoYXQgdGhlICJjb21wcmVzc2lvbiB2YWx1ZSIgaXMgbm90IHRoZQorICogc2FtZSBhcyB3aGF0IGFwcGVhcnMgaW4gdGhlIFBORyB0RVh0L3pUWHQvaVRYdCBjaHVuaydzICJjb21wcmVzc2lvbiBmbGFnIgorICogd2hpY2ggaXMgYWx3YXlzIDAgb3IgMSwgb3IgaXRzICJjb21wcmVzc2lvbiBtZXRob2QiIHdoaWNoIGlzIGFsd2F5cyAwLgorICovCit0eXBlZGVmIHN0cnVjdCBwbmdfdGV4dF9zdHJ1Y3QKK3sKKyAgIGludCAgY29tcHJlc3Npb247ICAgICAgIC8qIGNvbXByZXNzaW9uIHZhbHVlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTogdEVYdCwgbm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogelRYdCwgZGVmbGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogaVRYdCwgbm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjogaVRYdCwgZGVmbGF0ZSAgKi8KKyAgIHBuZ19jaGFycCBrZXk7ICAgICAgICAgIC8qIGtleXdvcmQsIDEtNzkgY2hhcmFjdGVyIGRlc2NyaXB0aW9uIG9mICJ0ZXh0IiAqLworICAgcG5nX2NoYXJwIHRleHQ7ICAgICAgICAgLyogY29tbWVudCwgbWF5IGJlIGFuIGVtcHR5IHN0cmluZyAoaWUgIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBhIE5VTEwgcG9pbnRlciAqLworICAgcG5nX3NpemVfdCB0ZXh0X2xlbmd0aDsgLyogbGVuZ3RoIG9mIHRoZSB0ZXh0IHN0cmluZyAqLworICAgcG5nX3NpemVfdCBpdHh0X2xlbmd0aDsgLyogbGVuZ3RoIG9mIHRoZSBpdHh0IHN0cmluZyAqLworICAgcG5nX2NoYXJwIGxhbmc7ICAgICAgICAgLyogbGFuZ3VhZ2UgY29kZSwgMC03OSBjaGFyYWN0ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBhIE5VTEwgcG9pbnRlciAqLworICAgcG5nX2NoYXJwIGxhbmdfa2V5OyAgICAgLyoga2V5d29yZCB0cmFuc2xhdGVkIFVURi04IHN0cmluZywgMCBvciBtb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFycyBvciBhIE5VTEwgcG9pbnRlciAqLworfSBwbmdfdGV4dDsKK3R5cGVkZWYgcG5nX3RleHQgKiBwbmdfdGV4dHA7Cit0eXBlZGVmIGNvbnN0IHBuZ190ZXh0ICogcG5nX2NvbnN0X3RleHRwOwordHlwZWRlZiBwbmdfdGV4dCAqICogcG5nX3RleHRwcDsKKyNlbmRpZgorCisvKiBTdXBwb3J0ZWQgY29tcHJlc3Npb24gdHlwZXMgZm9yIHRleHQgaW4gUE5HIGZpbGVzICh0RVh0LCBhbmQgelRYdCkuCisgKiBUaGUgdmFsdWVzIG9mIHRoZSBQTkdfVEVYVF9DT01QUkVTU0lPTl8gZGVmaW5lcyBzaG91bGQgTk9UIGJlIGNoYW5nZWQuICovCisjZGVmaW5lIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkVfV1IgLTMKKyNkZWZpbmUgUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdF9XUiAtMgorI2RlZmluZSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FICAgIC0xCisjZGVmaW5lIFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQgICAgIDAKKyNkZWZpbmUgUE5HX0lUWFRfQ09NUFJFU1NJT05fTk9ORSAgICAgMQorI2RlZmluZSBQTkdfSVRYVF9DT01QUkVTU0lPTl96VFh0ICAgICAyCisjZGVmaW5lIFBOR19URVhUX0NPTVBSRVNTSU9OX0xBU1QgICAgIDMgIC8qIE5vdCBhIHZhbGlkIHZhbHVlICovCisKKy8qIHBuZ190aW1lIGlzIGEgd2F5IHRvIGhvbGQgdGhlIHRpbWUgaW4gYW4gbWFjaGluZSBpbmRlcGVuZGVudCB3YXkuCisgKiBUd28gY29udmVyc2lvbnMgYXJlIHByb3ZpZGVkLCBib3RoIGZyb20gdGltZV90IGFuZCBzdHJ1Y3QgdG0uICBUaGVyZQorICogaXMgbm8gcG9ydGFibGUgd2F5IHRvIGNvbnZlcnQgdG8gZWl0aGVyIG9mIHRoZXNlIHN0cnVjdHVyZXMsIGFzIGZhcgorICogYXMgSSBrbm93LiAgSWYgeW91IGtub3cgb2YgYSBwb3J0YWJsZSB3YXksIHNlbmQgaXQgdG8gbWUuICBBcyBhIHNpZGUKKyAqIG5vdGUgLSBQTkcgaGFzIGFsd2F5cyBiZWVuIFllYXIgMjAwMCBjb21wbGlhbnQhCisgKi8KK3R5cGVkZWYgc3RydWN0IHBuZ190aW1lX3N0cnVjdAoreworICAgcG5nX3VpbnRfMTYgeWVhcjsgLyogZnVsbCB5ZWFyLCBhcyBpbiwgMTk5NSAqLworICAgcG5nX2J5dGUgbW9udGg7ICAgLyogbW9udGggb2YgeWVhciwgMSAtIDEyICovCisgICBwbmdfYnl0ZSBkYXk7ICAgICAvKiBkYXkgb2YgbW9udGgsIDEgLSAzMSAqLworICAgcG5nX2J5dGUgaG91cjsgICAgLyogaG91ciBvZiBkYXksIDAgLSAyMyAqLworICAgcG5nX2J5dGUgbWludXRlOyAgLyogbWludXRlIG9mIGhvdXIsIDAgLSA1OSAqLworICAgcG5nX2J5dGUgc2Vjb25kOyAgLyogc2Vjb25kIG9mIG1pbnV0ZSwgMCAtIDYwIChmb3IgbGVhcCBzZWNvbmRzKSAqLworfSBwbmdfdGltZTsKK3R5cGVkZWYgcG5nX3RpbWUgKiBwbmdfdGltZXA7Cit0eXBlZGVmIGNvbnN0IHBuZ190aW1lICogcG5nX2NvbnN0X3RpbWVwOwordHlwZWRlZiBwbmdfdGltZSAqICogcG5nX3RpbWVwcDsKKworI2lmIGRlZmluZWQoUE5HX1NUT1JFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkgfHxcCisgICBkZWZpbmVkKFBOR19VU0VSX0NIVU5LU19TVVBQT1JURUQpCisvKiBwbmdfdW5rbm93bl9jaHVuayBpcyBhIHN0cnVjdHVyZSB0byBob2xkIHF1ZXVlZCBjaHVua3MgZm9yIHdoaWNoIHRoZXJlIGlzCisgKiBubyBzcGVjaWZpYyBzdXBwb3J0LiAgVGhlIGlkZWEgaXMgdGhhdCB3ZSBjYW4gdXNlIHRoaXMgdG8gcXVldWUKKyAqIHVwIHByaXZhdGUgY2h1bmtzIGZvciBvdXRwdXQgZXZlbiB0aG91Z2ggdGhlIGxpYnJhcnkgZG9lc24ndCBhY3R1YWxseQorICoga25vdyBhYm91dCB0aGVpciBzZW1hbnRpY3MuCisgKgorICogVGhlIGRhdGEgaW4gdGhlIHN0cnVjdHVyZSBpcyBzZXQgYnkgbGlicG5nIG9uIHJlYWQgYW5kIHVzZWQgb24gd3JpdGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBuZ191bmtub3duX2NodW5rX3QKK3sKKyAgICBwbmdfYnl0ZSBuYW1lWzVdOyAvKiBUZXh0dWFsIGNodW5rIG5hbWUgd2l0aCAnXDAnIHRlcm1pbmF0b3IgKi8KKyAgICBwbmdfYnl0ZSAqZGF0YTsgICAvKiBEYXRhLCBzaG91bGQgbm90IGJlIG1vZGlmaWVkIG9uIHJlYWQhICovCisgICAgcG5nX3NpemVfdCBzaXplOworCisgICAgLyogT24gd3JpdGUgJ2xvY2F0aW9uJyBtdXN0IGJlIHNldCB1c2luZyB0aGUgZmxhZyB2YWx1ZXMgbGlzdGVkIGJlbG93LgorICAgICAqIE5vdGljZSB0aGF0IG9uIHJlYWQgaXQgaXMgc2V0IGJ5IGxpYnBuZyBob3dldmVyIHRoZSB2YWx1ZXMgc3RvcmVkIGhhdmUKKyAgICAgKiBtb3JlIGJpdHMgc2V0IHRoYW4gYXJlIGxpc3RlZCBiZWxvdy4gIEFsd2F5cyB0cmVhdCB0aGUgdmFsdWUgYXMgYQorICAgICAqIGJpdG1hc2suICBPbiB3cml0ZSBzZXQgb25seSBvbmUgYml0IC0gc2V0dGluZyBtdWx0aXBsZSBiaXRzIG1heSBjYXVzZSB0aGUKKyAgICAgKiBjaHVuayB0byBiZSB3cml0dGVuIGluIG11bHRpcGxlIHBsYWNlcy4KKyAgICAgKi8KKyAgICBwbmdfYnl0ZSBsb2NhdGlvbjsgLyogbW9kZSBvZiBvcGVyYXRpb24gYXQgcmVhZCB0aW1lICovCit9CitwbmdfdW5rbm93bl9jaHVuazsKKwordHlwZWRlZiBwbmdfdW5rbm93bl9jaHVuayAqIHBuZ191bmtub3duX2NodW5rcDsKK3R5cGVkZWYgY29uc3QgcG5nX3Vua25vd25fY2h1bmsgKiBwbmdfY29uc3RfdW5rbm93bl9jaHVua3A7Cit0eXBlZGVmIHBuZ191bmtub3duX2NodW5rICogKiBwbmdfdW5rbm93bl9jaHVua3BwOworI2VuZGlmCisKKy8qIEZsYWcgdmFsdWVzIGZvciB0aGUgdW5rbm93biBjaHVuayBsb2NhdGlvbiBieXRlLiAqLworI2RlZmluZSBQTkdfSEFWRV9JSERSICAweDAxCisjZGVmaW5lIFBOR19IQVZFX1BMVEUgIDB4MDIKKyNkZWZpbmUgUE5HX0FGVEVSX0lEQVQgMHgwOAorCisvKiBNYXhpbXVtIHBvc2l0aXZlIGludGVnZXIgdXNlZCBpbiBQTkcgaXMgKDJeMzEpLTEgKi8KKyNkZWZpbmUgUE5HX1VJTlRfMzFfTUFYICgocG5nX3VpbnRfMzIpMHg3ZmZmZmZmZkwpCisjZGVmaW5lIFBOR19VSU5UXzMyX01BWCAoKHBuZ191aW50XzMyKSgtMSkpCisjZGVmaW5lIFBOR19TSVpFX01BWCAoKHBuZ19zaXplX3QpKC0xKSkKKworLyogVGhlc2UgYXJlIGNvbnN0YW50cyBmb3IgZml4ZWQgcG9pbnQgdmFsdWVzIGVuY29kZWQgaW4gdGhlCisgKiBQTkcgc3BlY2lmaWNhdGlvbiBtYW5uZXIgKHgxMDAwMDApCisgKi8KKyNkZWZpbmUgUE5HX0ZQXzEgICAgMTAwMDAwCisjZGVmaW5lIFBOR19GUF9IQUxGICA1MDAwMAorI2RlZmluZSBQTkdfRlBfTUFYICAoKHBuZ19maXhlZF9wb2ludCkweDdmZmZmZmZmTCkKKyNkZWZpbmUgUE5HX0ZQX01JTiAgKC1QTkdfRlBfTUFYKQorCisvKiBUaGVzZSBkZXNjcmliZSB0aGUgY29sb3JfdHlwZSBmaWVsZCBpbiBwbmdfaW5mby4gKi8KKy8qIGNvbG9yIHR5cGUgbWFza3MgKi8KKyNkZWZpbmUgUE5HX0NPTE9SX01BU0tfUEFMRVRURSAgICAxCisjZGVmaW5lIFBOR19DT0xPUl9NQVNLX0NPTE9SICAgICAgMgorI2RlZmluZSBQTkdfQ09MT1JfTUFTS19BTFBIQSAgICAgIDQKKworLyogY29sb3IgdHlwZXMuICBOb3RlIHRoYXQgbm90IGFsbCBjb21iaW5hdGlvbnMgYXJlIGxlZ2FsICovCisjZGVmaW5lIFBOR19DT0xPUl9UWVBFX0dSQVkgMAorI2RlZmluZSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFICAoUE5HX0NPTE9SX01BU0tfQ09MT1IgfCBQTkdfQ09MT1JfTUFTS19QQUxFVFRFKQorI2RlZmluZSBQTkdfQ09MT1JfVFlQRV9SR0IgICAgICAgIChQTkdfQ09MT1JfTUFTS19DT0xPUikKKyNkZWZpbmUgUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBICAoUE5HX0NPTE9SX01BU0tfQ09MT1IgfCBQTkdfQ09MT1JfTUFTS19BTFBIQSkKKyNkZWZpbmUgUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSAoUE5HX0NPTE9SX01BU0tfQUxQSEEpCisvKiBhbGlhc2VzICovCisjZGVmaW5lIFBOR19DT0xPUl9UWVBFX1JHQkEgIFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQQorI2RlZmluZSBQTkdfQ09MT1JfVFlQRV9HQSAgUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQQorCisvKiBUaGlzIGlzIGZvciBjb21wcmVzc2lvbiB0eXBlLiBQTkcgMS4wLTEuMiBvbmx5IGRlZmluZSB0aGUgc2luZ2xlIHR5cGUuICovCisjZGVmaW5lIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UgMCAvKiBEZWZsYXRlIG1ldGhvZCA4LCAzMksgd2luZG93ICovCisjZGVmaW5lIFBOR19DT01QUkVTU0lPTl9UWVBFX0RFRkFVTFQgUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRQorCisvKiBUaGlzIGlzIGZvciBmaWx0ZXIgdHlwZS4gUE5HIDEuMC0xLjIgb25seSBkZWZpbmUgdGhlIHNpbmdsZSB0eXBlLiAqLworI2RlZmluZSBQTkdfRklMVEVSX1RZUEVfQkFTRSAgICAgIDAgLyogU2luZ2xlIHJvdyBwZXItYnl0ZSBmaWx0ZXJpbmcgKi8KKyNkZWZpbmUgUE5HX0lOVFJBUElYRUxfRElGRkVSRU5DSU5HIDY0IC8qIFVzZWQgb25seSBpbiBNTkcgZGF0YXN0cmVhbXMgKi8KKyNkZWZpbmUgUE5HX0ZJTFRFUl9UWVBFX0RFRkFVTFQgICBQTkdfRklMVEVSX1RZUEVfQkFTRQorCisvKiBUaGVzZSBhcmUgZm9yIHRoZSBpbnRlcmxhY2luZyB0eXBlLiAgVGhlc2UgdmFsdWVzIHNob3VsZCBOT1QgYmUgY2hhbmdlZC4gKi8KKyNkZWZpbmUgUE5HX0lOVEVSTEFDRV9OT05FICAgICAgICAwIC8qIE5vbi1pbnRlcmxhY2VkIGltYWdlICovCisjZGVmaW5lIFBOR19JTlRFUkxBQ0VfQURBTTcgICAgICAgMSAvKiBBZGFtNyBpbnRlcmxhY2luZyAqLworI2RlZmluZSBQTkdfSU5URVJMQUNFX0xBU1QgICAgICAgIDIgLyogTm90IGEgdmFsaWQgdmFsdWUgKi8KKworLyogVGhlc2UgYXJlIGZvciB0aGUgb0ZGcyBjaHVuay4gIFRoZXNlIHZhbHVlcyBzaG91bGQgTk9UIGJlIGNoYW5nZWQuICovCisjZGVmaW5lIFBOR19PRkZTRVRfUElYRUwgICAgICAgICAgMCAvKiBPZmZzZXQgaW4gcGl4ZWxzICovCisjZGVmaW5lIFBOR19PRkZTRVRfTUlDUk9NRVRFUiAgICAgMSAvKiBPZmZzZXQgaW4gbWljcm9tZXRlcnMgKDEvMTBeNiBtZXRlcikgKi8KKyNkZWZpbmUgUE5HX09GRlNFVF9MQVNUICAgICAgICAgICAyIC8qIE5vdCBhIHZhbGlkIHZhbHVlICovCisKKy8qIFRoZXNlIGFyZSBmb3IgdGhlIHBDQUwgY2h1bmsuICBUaGVzZSB2YWx1ZXMgc2hvdWxkIE5PVCBiZSBjaGFuZ2VkLiAqLworI2RlZmluZSBQTkdfRVFVQVRJT05fTElORUFSICAgICAgIDAgLyogTGluZWFyIHRyYW5zZm9ybWF0aW9uICovCisjZGVmaW5lIFBOR19FUVVBVElPTl9CQVNFX0UgICAgICAgMSAvKiBFeHBvbmVudGlhbCBiYXNlIGUgdHJhbnNmb3JtICovCisjZGVmaW5lIFBOR19FUVVBVElPTl9BUkJJVFJBUlkgICAgMiAvKiBBcmJpdHJhcnkgYmFzZSBleHBvbmVudGlhbCB0cmFuc2Zvcm0gKi8KKyNkZWZpbmUgUE5HX0VRVUFUSU9OX0hZUEVSQk9MSUMgICAzIC8qIEh5cGVyYm9saWMgc2luZSB0cmFuc2Zvcm1hdGlvbiAqLworI2RlZmluZSBQTkdfRVFVQVRJT05fTEFTVCAgICAgICAgIDQgLyogTm90IGEgdmFsaWQgdmFsdWUgKi8KKworLyogVGhlc2UgYXJlIGZvciB0aGUgc0NBTCBjaHVuay4gIFRoZXNlIHZhbHVlcyBzaG91bGQgTk9UIGJlIGNoYW5nZWQuICovCisjZGVmaW5lIFBOR19TQ0FMRV9VTktOT1dOICAgICAgICAgMCAvKiB1bmtub3duIHVuaXQgKGltYWdlIHNjYWxlKSAqLworI2RlZmluZSBQTkdfU0NBTEVfTUVURVIgICAgICAgICAgIDEgLyogbWV0ZXJzIHBlciBwaXhlbCAqLworI2RlZmluZSBQTkdfU0NBTEVfUkFESUFOICAgICAgICAgIDIgLyogcmFkaWFucyBwZXIgcGl4ZWwgKi8KKyNkZWZpbmUgUE5HX1NDQUxFX0xBU1QgICAgICAgICAgICAzIC8qIE5vdCBhIHZhbGlkIHZhbHVlICovCisKKy8qIFRoZXNlIGFyZSBmb3IgdGhlIHBIWXMgY2h1bmsuICBUaGVzZSB2YWx1ZXMgc2hvdWxkIE5PVCBiZSBjaGFuZ2VkLiAqLworI2RlZmluZSBQTkdfUkVTT0xVVElPTl9VTktOT1dOICAgIDAgLyogcGl4ZWxzL3Vua25vd24gdW5pdCAoYXNwZWN0IHJhdGlvKSAqLworI2RlZmluZSBQTkdfUkVTT0xVVElPTl9NRVRFUiAgICAgIDEgLyogcGl4ZWxzL21ldGVyICovCisjZGVmaW5lIFBOR19SRVNPTFVUSU9OX0xBU1QgICAgICAgMiAvKiBOb3QgYSB2YWxpZCB2YWx1ZSAqLworCisvKiBUaGVzZSBhcmUgZm9yIHRoZSBzUkdCIGNodW5rLiAgVGhlc2UgdmFsdWVzIHNob3VsZCBOT1QgYmUgY2hhbmdlZC4gKi8KKyNkZWZpbmUgUE5HX3NSR0JfSU5URU5UX1BFUkNFUFRVQUwgMAorI2RlZmluZSBQTkdfc1JHQl9JTlRFTlRfUkVMQVRJVkUgICAxCisjZGVmaW5lIFBOR19zUkdCX0lOVEVOVF9TQVRVUkFUSU9OIDIKKyNkZWZpbmUgUE5HX3NSR0JfSU5URU5UX0FCU09MVVRFICAgMworI2RlZmluZSBQTkdfc1JHQl9JTlRFTlRfTEFTVCAgICAgICA0IC8qIE5vdCBhIHZhbGlkIHZhbHVlICovCisKKy8qIFRoaXMgaXMgZm9yIHRleHQgY2h1bmtzICovCisjZGVmaW5lIFBOR19LRVlXT1JEX01BWF9MRU5HVEggICAgIDc5CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgaW4gUExURS9zUExUL3RSTlMgYXJyYXlzICovCisjZGVmaW5lIFBOR19NQVhfUEFMRVRURV9MRU5HVEggICAgMjU2CisKKy8qIFRoZXNlIGRldGVybWluZSBpZiBhbiBhbmNpbGxhcnkgY2h1bmsncyBkYXRhIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSByZWFkCisgKiBmcm9tIHRoZSBQTkcgaGVhZGVyLCBvciBpZiB0aGUgYXBwbGljYXRpb24gaGFzIGZpbGxlZCBpbiB0aGUgY29ycmVzcG9uZGluZworICogZGF0YSBpbiB0aGUgaW5mb19zdHJ1Y3QgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFRoZSB2YWx1ZXMKKyAqIG9mIHRoZSBQTkdfSU5GT188Y2h1bms+IGRlZmluZXMgc2hvdWxkIE5PVCBiZSBjaGFuZ2VkLgorICovCisjZGVmaW5lIFBOR19JTkZPX2dBTUEgMHgwMDAxCisjZGVmaW5lIFBOR19JTkZPX3NCSVQgMHgwMDAyCisjZGVmaW5lIFBOR19JTkZPX2NIUk0gMHgwMDA0CisjZGVmaW5lIFBOR19JTkZPX1BMVEUgMHgwMDA4CisjZGVmaW5lIFBOR19JTkZPX3RSTlMgMHgwMDEwCisjZGVmaW5lIFBOR19JTkZPX2JLR0QgMHgwMDIwCisjZGVmaW5lIFBOR19JTkZPX2hJU1QgMHgwMDQwCisjZGVmaW5lIFBOR19JTkZPX3BIWXMgMHgwMDgwCisjZGVmaW5lIFBOR19JTkZPX29GRnMgMHgwMTAwCisjZGVmaW5lIFBOR19JTkZPX3RJTUUgMHgwMjAwCisjZGVmaW5lIFBOR19JTkZPX3BDQUwgMHgwNDAwCisjZGVmaW5lIFBOR19JTkZPX3NSR0IgMHgwODAwICAgLyogR1ItUCwgMC45NmEgKi8KKyNkZWZpbmUgUE5HX0lORk9faUNDUCAweDEwMDAgICAvKiBFU1IsIDEuMC42ICovCisjZGVmaW5lIFBOR19JTkZPX3NQTFQgMHgyMDAwICAgLyogRVNSLCAxLjAuNiAqLworI2RlZmluZSBQTkdfSU5GT19zQ0FMIDB4NDAwMCAgIC8qIEVTUiwgMS4wLjYgKi8KKyNpZiBJTlRfTUFYID49IDB4ODAwMCAvKiBlbHNlIHRoaXMgbWlnaHQgYnJlYWsgKi8KKyNkZWZpbmUgUE5HX0lORk9fSURBVCAweDgwMDAgICAvKiBFU1IsIDEuMC42ICovCisjZW5kaWYKKworLyogVGhpcyBpcyB1c2VkIGZvciB0aGUgdHJhbnNmb3JtYXRpb24gcm91dGluZXMsIGFzIHNvbWUgb2YgdGhlbQorICogY2hhbmdlIHRoZXNlIHZhbHVlcyBmb3IgdGhlIHJvdy4gIEl0IGFsc28gc2hvdWxkIGVuYWJsZSB1c2luZworICogdGhlIHJvdXRpbmVzIGZvciBvdGhlciBwdXJwb3Nlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcG5nX3Jvd19pbmZvX3N0cnVjdAoreworICAgcG5nX3VpbnRfMzIgd2lkdGg7ICAgIC8qIHdpZHRoIG9mIHJvdyAqLworICAgcG5nX3NpemVfdCByb3dieXRlczsgIC8qIG51bWJlciBvZiBieXRlcyBpbiByb3cgKi8KKyAgIHBuZ19ieXRlIGNvbG9yX3R5cGU7ICAvKiBjb2xvciB0eXBlIG9mIHJvdyAqLworICAgcG5nX2J5dGUgYml0X2RlcHRoOyAgIC8qIGJpdCBkZXB0aCBvZiByb3cgKi8KKyAgIHBuZ19ieXRlIGNoYW5uZWxzOyAgICAvKiBudW1iZXIgb2YgY2hhbm5lbHMgKDEsIDIsIDMsIG9yIDQpICovCisgICBwbmdfYnl0ZSBwaXhlbF9kZXB0aDsgLyogYml0cyBwZXIgcGl4ZWwgKGRlcHRoICogY2hhbm5lbHMpICovCit9IHBuZ19yb3dfaW5mbzsKKwordHlwZWRlZiBwbmdfcm93X2luZm8gKiBwbmdfcm93X2luZm9wOwordHlwZWRlZiBwbmdfcm93X2luZm8gKiAqIHBuZ19yb3dfaW5mb3BwOworCisvKiBUaGVzZSBhcmUgdGhlIGZ1bmN0aW9uIHR5cGVzIGZvciB0aGUgSS9PIGZ1bmN0aW9ucyBhbmQgZm9yIHRoZSBmdW5jdGlvbnMKKyAqIHRoYXQgYWxsb3cgdGhlIHVzZXIgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgSS9PIGZ1bmN0aW9ucyB3aXRoIGhpcyBvciBoZXIKKyAqIG93bi4gIFRoZSBwbmdfZXJyb3JfcHRyIHR5cGUgc2hvdWxkIG1hdGNoIHRoYXQgb2YgdXNlci1zdXBwbGllZCB3YXJuaW5nCisgKiBhbmQgZXJyb3IgZnVuY3Rpb25zLCB3aGlsZSB0aGUgcG5nX3J3X3B0ciB0eXBlIHNob3VsZCBtYXRjaCB0aGF0IG9mIHRoZQorICogdXNlciByZWFkL3dyaXRlIGRhdGEgZnVuY3Rpb25zLiAgTm90ZSB0aGF0IHRoZSAnd3JpdGUnIGZ1bmN0aW9uIG11c3Qgbm90CisgKiBtb2RpZnkgdGhlIGJ1ZmZlciBpdCBpcyBwYXNzZWQuIFRoZSAncmVhZCcgZnVuY3Rpb24sIG9uIHRoZSBvdGhlciBoYW5kLCBpcworICogZXhwZWN0ZWQgdG8gcmV0dXJuIHRoZSByZWFkIGRhdGEgaW4gdGhlIGJ1ZmZlci4KKyAqLwordHlwZWRlZiBQTkdfQ0FMTEJBQ0sodm9pZCwgKnBuZ19lcnJvcl9wdHIsIChwbmdfc3RydWN0cCwgcG5nX2NvbnN0X2NoYXJwKSk7Cit0eXBlZGVmIFBOR19DQUxMQkFDSyh2b2lkLCAqcG5nX3J3X3B0ciwgKHBuZ19zdHJ1Y3RwLCBwbmdfYnl0ZXAsIHBuZ19zaXplX3QpKTsKK3R5cGVkZWYgUE5HX0NBTExCQUNLKHZvaWQsICpwbmdfZmx1c2hfcHRyLCAocG5nX3N0cnVjdHApKTsKK3R5cGVkZWYgUE5HX0NBTExCQUNLKHZvaWQsICpwbmdfcmVhZF9zdGF0dXNfcHRyLCAocG5nX3N0cnVjdHAsIHBuZ191aW50XzMyLAorICAgIGludCkpOwordHlwZWRlZiBQTkdfQ0FMTEJBQ0sodm9pZCwgKnBuZ193cml0ZV9zdGF0dXNfcHRyLCAocG5nX3N0cnVjdHAsIHBuZ191aW50XzMyLAorICAgIGludCkpOworCisjaWZkZWYgUE5HX0lOREVYX1NVUFBPUlRFRAordHlwZWRlZiBQTkdfQ0FMTEJBQ0sodm9pZCwgKnBuZ19zZWVrX3B0ciwgKHBuZ19zdHJ1Y3RwLCBwbmdfdWludF8zMikpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQKK3R5cGVkZWYgUE5HX0NBTExCQUNLKHZvaWQsICpwbmdfcHJvZ3Jlc3NpdmVfaW5mb19wdHIsIChwbmdfc3RydWN0cCwgcG5nX2luZm9wKSk7Cit0eXBlZGVmIFBOR19DQUxMQkFDSyh2b2lkLCAqcG5nX3Byb2dyZXNzaXZlX2VuZF9wdHIsIChwbmdfc3RydWN0cCwgcG5nX2luZm9wKSk7CisKKy8qIFRoZSBmb2xsb3dpbmcgY2FsbGJhY2sgcmVjZWl2ZXMgcG5nX3VpbnRfMzIgcm93X251bWJlciwgaW50IHBhc3MgZm9yIHRoZQorICogcG5nX2J5dGVwIGRhdGEgb2YgdGhlIHJvdy4gIFdoZW4gdHJhbnNmb3JtaW5nIGFuIGludGVybGFjZWQgaW1hZ2UgdGhlCisgKiByb3cgbnVtYmVyIGlzIHRoZSByb3cgbnVtYmVyIHdpdGhpbiB0aGUgc3ViLWltYWdlIG9mIHRoZSBpbnRlcmxhY2UgcGFzcywgc28KKyAqIHRoZSB2YWx1ZSB3aWxsIGluY3JlYXNlIHRvIHRoZSBoZWlnaHQgb2YgdGhlIHN1Yi1pbWFnZSAobm90IHRoZSBmdWxsIGltYWdlKQorICogdGhlbiByZXNldCB0byAwIGZvciB0aGUgbmV4dCBwYXNzLgorICoKKyAqIFVzZSBQTkdfUk9XX0ZST01fUEFTU19ST1cocm93LCBwYXNzKSBhbmQgUE5HX0NPTF9GUk9NX1BBU1NfQ09MKGNvbCwgcGFzcykgdG8KKyAqIGZpbmQgdGhlIG91dHB1dCBwaXhlbCAoeCx5KSBnaXZlbiBhbiBpbnRlcmxhY2VkIHN1Yi1pbWFnZSBwaXhlbAorICogKHJvdyxjb2wscGFzcykuICAoU2VlIGJlbG93IGZvciB0aGVzZSBtYWNyb3MuKQorICovCit0eXBlZGVmIFBOR19DQUxMQkFDSyh2b2lkLCAqcG5nX3Byb2dyZXNzaXZlX3Jvd19wdHIsIChwbmdfc3RydWN0cCwgcG5nX2J5dGVwLAorICAgIHBuZ191aW50XzMyLCBpbnQpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpIHx8IFwKKyAgICBkZWZpbmVkKFBOR19XUklURV9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpCit0eXBlZGVmIFBOR19DQUxMQkFDSyh2b2lkLCAqcG5nX3VzZXJfdHJhbnNmb3JtX3B0ciwgKHBuZ19zdHJ1Y3RwLCBwbmdfcm93X2luZm9wLAorICAgIHBuZ19ieXRlcCkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfVVNFUl9DSFVOS1NfU1VQUE9SVEVECit0eXBlZGVmIFBOR19DQUxMQkFDSyhpbnQsICpwbmdfdXNlcl9jaHVua19wdHIsIChwbmdfc3RydWN0cCwKKyAgICBwbmdfdW5rbm93bl9jaHVua3ApKTsKKyNlbmRpZgorI2lmZGVmIFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKKy8qIG5vdCB1c2VkIGFueXdoZXJlICovCisvKiB0eXBlZGVmIFBOR19DQUxMQkFDSyh2b2lkLCAqcG5nX3Vua25vd25fY2h1bmtfcHRyLCAocG5nX3N0cnVjdHApKTsgKi8KKyNlbmRpZgorCisjaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKKy8qIFRoaXMgbXVzdCBtYXRjaCB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBpbiA8c2V0am1wLmg+LCBhbmQgdGhlIGFwcGxpY2F0aW9uCisgKiBtdXN0IGluY2x1ZGUgdGhpcyBiZWZvcmUgcG5nLmggdG8gb2J0YWluIHRoZSBkZWZpbml0aW9uIG9mIGptcF9idWYuICBUaGUKKyAqIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIHRvIGJlIFBOR19OT1JFVFVSTiwgYnV0IHRoaXMgaXMgbm90IGNoZWNrZWQuICBJZiB0aGUKKyAqIGZ1bmN0aW9uIGRvZXMgcmV0dXJuIHRoZSBhcHBsaWNhdGlvbiB3aWxsIGNyYXNoIHZpYSBhbiBhYm9ydCgpIG9yIHNpbWlsYXIKKyAqIHN5c3RlbSBsZXZlbCBjYWxsLgorICoKKyAqIElmIHlvdSBnZXQgYSB3YXJuaW5nIGhlcmUgd2hpbGUgYnVpbGRpbmcgdGhlIGxpYnJhcnkgeW91IG1heSBuZWVkIHRvIG1ha2UKKyAqIGNoYW5nZXMgdG8gZW5zdXJlIHRoYXQgcG5nbGliY29uZi5oIHJlY29yZHMgdGhlIGNhbGxpbmcgY29udmVudGlvbiB1c2VkIGJ5CisgKiB5b3VyIGNvbXBpbGVyLiAgVGhpcyBtYXkgYmUgdmVyeSBkaWZmaWN1bHQgLSB0cnkgdXNpbmcgYSBkaWZmZXJlbnQgY29tcGlsZXIKKyAqIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5IQorICovCitQTkdfRlVOQ1RJT04odm9pZCwgKFBOR0NBUEkgKnBuZ19sb25nam1wX3B0ciksIFBOR0FSRygoam1wX2J1ZiwgaW50KSksIHR5cGVkZWYpOworI2VuZGlmCisKKy8qIFRyYW5zZm9ybSBtYXNrcyBmb3IgdGhlIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fSURFTlRJVFkgICAgICAgMHgwMDAwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fU1RSSVBfMTYgICAgICAgMHgwMDAxICAgIC8qIHJlYWQgb25seSAqLworI2RlZmluZSBQTkdfVFJBTlNGT1JNX1NUUklQX0FMUEhBICAgIDB4MDAwMiAgICAvKiByZWFkIG9ubHkgKi8KKyNkZWZpbmUgUE5HX1RSQU5TRk9STV9QQUNLSU5HICAgICAgICAweDAwMDQgICAgLyogcmVhZCBhbmQgd3JpdGUgKi8KKyNkZWZpbmUgUE5HX1RSQU5TRk9STV9QQUNLU1dBUCAgICAgICAweDAwMDggICAgLyogcmVhZCBhbmQgd3JpdGUgKi8KKyNkZWZpbmUgUE5HX1RSQU5TRk9STV9FWFBBTkQgICAgICAgICAweDAwMTAgICAgLyogcmVhZCBvbmx5ICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fSU5WRVJUX01PTk8gICAgMHgwMDIwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fU0hJRlQgICAgICAgICAgMHgwMDQwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fQkdSICAgICAgICAgICAgMHgwMDgwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fU1dBUF9BTFBIQSAgICAgMHgwMTAwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fU1dBUF9FTkRJQU4gICAgMHgwMjAwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fSU5WRVJUX0FMUEhBICAgMHgwNDAwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSICAgMHgwODAwICAgIC8qIHdyaXRlIG9ubHkgKi8KKy8qIEFkZGVkIHRvIGxpYnBuZy0xLjIuMzQgKi8KKyNkZWZpbmUgUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVJfQkVGT1JFIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSX0FGVEVSIDB4MTAwMCAvKiB3cml0ZSBvbmx5ICovCisvKiBBZGRlZCB0byBsaWJwbmctMS40LjAgKi8KKyNkZWZpbmUgUE5HX1RSQU5TRk9STV9HUkFZX1RPX1JHQiAgIDB4MjAwMCAgICAgIC8qIHJlYWQgb25seSAqLworLyogQWRkZWQgdG8gbGlicG5nLTEuNS40ICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fRVhQQU5EXzE2ICAgICAweDQwMDAgICAgICAvKiByZWFkIG9ubHkgKi8KKyNpZiBJTlRfTUFYID49IDB4ODAwMCAvKiBlbHNlIHRoaXMgbWlnaHQgYnJlYWsgKi8KKyNkZWZpbmUgUE5HX1RSQU5TRk9STV9TQ0FMRV8xNiAgICAgIDB4ODAwMCAgICAgIC8qIHJlYWQgb25seSAqLworI2VuZGlmCisKKy8qIEZsYWdzIGZvciBNTkcgc3VwcG9ydGVkIGZlYXR1cmVzICovCisjZGVmaW5lIFBOR19GTEFHX01OR19FTVBUWV9QTFRFICAgICAweDAxCisjZGVmaW5lIFBOR19GTEFHX01OR19GSUxURVJfNjQgICAgICAweDA0CisjZGVmaW5lIFBOR19BTExfTU5HX0ZFQVRVUkVTICAgICAgICAweDA1CisKKy8qIE5PVEU6IHByaW9yIHRvIDEuNSB0aGVzZSBmdW5jdGlvbnMgaGFkIG5vICdBUEknIHN0eWxlIGRlY2xhcmF0aW9uLAorICogdGhpcyBhbGxvd2VkIHRoZSB6bGliIGRlZmF1bHQgZnVuY3Rpb25zIHRvIGJlIHVzZWQgb24gV2luZG93cworICogcGxhdGZvcm1zLiAgSW4gMS41IHRoZSB6bGliIGRlZmF1bHQgbWFsbG9jICh3aGljaCBqdXN0IGNhbGxzIG1hbGxvYyBhbmQKKyAqIGlnbm9yZXMgdGhlIGZpcnN0IGFyZ3VtZW50KSBzaG91bGQgYmUgY29tcGxldGVseSBjb21wYXRpYmxlIHdpdGggdGhlCisgKiBmb2xsb3dpbmcuCisgKi8KK3R5cGVkZWYgUE5HX0NBTExCQUNLKHBuZ192b2lkcCwgKnBuZ19tYWxsb2NfcHRyLCAocG5nX3N0cnVjdHAsCisgICAgcG5nX2FsbG9jX3NpemVfdCkpOwordHlwZWRlZiBQTkdfQ0FMTEJBQ0sodm9pZCwgKnBuZ19mcmVlX3B0ciwgKHBuZ19zdHJ1Y3RwLCBwbmdfdm9pZHApKTsKKworLyogU2VjdGlvbiA0OiBleHBvcnRlZCBmdW5jdGlvbnMKKyAqIEhlcmUgYXJlIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9ucyBtb3N0IGNvbW1vbmx5IHVzZWQuICBUaGlzIGlzIG5vdAorICogdGhlIHBsYWNlIHRvIGZpbmQgb3V0IGhvdyB0byB1c2UgbGlicG5nLiAgU2VlIGxpYnBuZy1tYW51YWwudHh0IGZvciB0aGUKKyAqIGZ1bGwgZXhwbGFuYXRpb24sIHNlZSBleGFtcGxlLmMgZm9yIHRoZSBzdW1tYXJ5LiAgVGhpcyBqdXN0IHByb3ZpZGVzCisgKiBhIHNpbXBsZSBvbmUgbGluZSBkZXNjcmlwdGlvbiBvZiB0aGUgdXNlIG9mIGVhY2ggZnVuY3Rpb24uCisgKgorICogVGhlIFBOR19FWFBPUlQoKSBhbmQgUE5HX0VYUE9SVEEoKSBtYWNyb3MgdXNlZCBiZWxvdyBhcmUgZGVmaW5lZCBpbgorICogcG5nY29uZi5oIGFuZCBpbiB0aGUgKi5kZm4gZmlsZXMgaW4gdGhlIHNjcmlwdHMgZGlyZWN0b3J5LgorICoKKyAqICAgUE5HX0VYUE9SVChvcmRpbmFsLCB0eXBlLCBuYW1lLCAoYXJncykpOworICoKKyAqICAgICAgIG9yZGluYWw6ICAgIG9yZGluYWwgdGhhdCBpcyB1c2VkIHdoaWxlIGJ1aWxkaW5nCisgKiAgICAgICAgICAgICAgICAgICAqLmRlZiBmaWxlcy4gVGhlIG9yZGluYWwgdmFsdWUgaXMgb25seQorICogICAgICAgICAgICAgICAgICAgcmVsZXZhbnQgd2hlbiBwcmVwcm9jZXNzaW5nIHBuZy5oIHdpdGgKKyAqICAgICAgICAgICAgICAgICAgIHRoZSAqLmRmbiBmaWxlcyBmb3IgYnVpbGRpbmcgc3ltYm9sIHRhYmxlCisgKiAgICAgICAgICAgICAgICAgICBlbnRyaWVzLCBhbmQgYXJlIHJlbW92ZWQgYnkgcG5nY29uZi5oLgorICogICAgICAgdHlwZTogICAgICAgcmV0dXJuIHR5cGUgb2YgdGhlIGZ1bmN0aW9uCisgKiAgICAgICBuYW1lOiAgICAgICBmdW5jdGlvbiBuYW1lCisgKiAgICAgICBhcmdzOiAgICAgICBmdW5jdGlvbiBhcmd1bWVudHMsIHdpdGggdHlwZXMKKyAqCisgKiBXaGVuIHdlIHdpc2ggdG8gYXBwZW5kIGF0dHJpYnV0ZXMgdG8gYSBmdW5jdGlvbiBwcm90b3R5cGUgd2UgdXNlCisgKiB0aGUgUE5HX0VYUE9SVEEoKSBtYWNybyBpbnN0ZWFkLgorICoKKyAqICAgUE5HX0VYUE9SVEEob3JkaW5hbCwgdHlwZSwgbmFtZSwgKGFyZ3MpLCBhdHRyaWJ1dGVzKTsKKyAqCisgKiAgICAgICBvcmRpbmFsLCB0eXBlLCBuYW1lLCBhbmQgYXJnczogc2FtZSBhcyBpbiBQTkdfRVhQT1JUKCkuCisgKiAgICAgICBhdHRyaWJ1dGVzOiBmdW5jdGlvbiBhdHRyaWJ1dGVzCisgKi8KKworLyogUmV0dXJucyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGxpYnJhcnkgKi8KK1BOR19FWFBPUlQoMSwgcG5nX3VpbnRfMzIsIHBuZ19hY2Nlc3NfdmVyc2lvbl9udW1iZXIsICh2b2lkKSk7CisKKy8qIFRlbGwgbGliIHdlIGhhdmUgYWxyZWFkeSBoYW5kbGVkIHRoZSBmaXJzdCA8bnVtX2J5dGVzPiBtYWdpYyBieXRlcy4KKyAqIEhhbmRsaW5nIG1vcmUgdGhhbiA4IGJ5dGVzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSBpcyBhbiBlcnJvci4KKyAqLworUE5HX0VYUE9SVCgyLCB2b2lkLCBwbmdfc2V0X3NpZ19ieXRlcywgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgbnVtX2J5dGVzKSk7CisKKy8qIENoZWNrIHNpZ1tzdGFydF0gdGhyb3VnaCBzaWdbc3RhcnQgKyBudW1fdG9fY2hlY2sgLSAxXSB0byBzZWUgaWYgaXQncyBhCisgKiBQTkcgZmlsZS4gIFJldHVybnMgemVybyBpZiB0aGUgc3VwcGxpZWQgYnl0ZXMgbWF0Y2ggdGhlIDgtYnl0ZSBQTkcKKyAqIHNpZ25hdHVyZSwgYW5kIG5vbi16ZXJvIG90aGVyd2lzZS4gIEhhdmluZyBudW1fdG9fY2hlY2sgPT0gMCBvcgorICogc3RhcnQgPiA3IHdpbGwgYWx3YXlzIGZhaWwgKGllIHJldHVybiBub24temVybykuCisgKi8KK1BOR19FWFBPUlQoMywgaW50LCBwbmdfc2lnX2NtcCwgKHBuZ19jb25zdF9ieXRlcCBzaWcsIHBuZ19zaXplX3Qgc3RhcnQsCisgICAgcG5nX3NpemVfdCBudW1fdG9fY2hlY2spKTsKKworLyogU2ltcGxlIHNpZ25hdHVyZSBjaGVja2luZyBmdW5jdGlvbi4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgY2FsbGluZworICogcG5nX2NoZWNrX3NpZyhzaWcsIG4pIDo9ICFwbmdfc2lnX2NtcChzaWcsIDAsIG4pLgorICovCisjZGVmaW5lIHBuZ19jaGVja19zaWcoc2lnLCBuKSAhcG5nX3NpZ19jbXAoKHNpZyksIDAsIChuKSkKKworLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgcG5nX3B0ciBzdHJ1Y3QgZm9yIHJlYWRpbmcsIGFuZCBhbnkgb3RoZXIgbWVtb3J5LiAqLworUE5HX0VYUE9SVEEoNCwgcG5nX3N0cnVjdHAsIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QsCisgICAgKHBuZ19jb25zdF9jaGFycCB1c2VyX3BuZ192ZXIsIHBuZ192b2lkcCBlcnJvcl9wdHIsCisgICAgcG5nX2Vycm9yX3B0ciBlcnJvcl9mbiwgcG5nX2Vycm9yX3B0ciB3YXJuX2ZuKSwKKyAgICBQTkdfQUxMT0NBVEVEKTsKKworLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgcG5nX3B0ciBzdHJ1Y3QgZm9yIHdyaXRpbmcsIGFuZCBhbnkgb3RoZXIgbWVtb3J5ICovCitQTkdfRVhQT1JUQSg1LCBwbmdfc3RydWN0cCwgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QsCisgICAgKHBuZ19jb25zdF9jaGFycCB1c2VyX3BuZ192ZXIsIHBuZ192b2lkcCBlcnJvcl9wdHIsIHBuZ19lcnJvcl9wdHIgZXJyb3JfZm4sCisgICAgcG5nX2Vycm9yX3B0ciB3YXJuX2ZuKSwKKyAgICBQTkdfQUxMT0NBVEVEKTsKKworUE5HX0VYUE9SVCg2LCBwbmdfc2l6ZV90LCBwbmdfZ2V0X2NvbXByZXNzaW9uX2J1ZmZlcl9zaXplLAorICAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikpOworCitQTkdfRVhQT1JUKDcsIHZvaWQsIHBuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfc2l6ZV90IHNpemUpKTsKKworLyogTW92ZWQgZnJvbSBwbmdjb25mLmggaW4gMS40LjAgYW5kIG1vZGlmaWVkIHRvIGVuc3VyZSBzZXRqbXAvbG9uZ2ptcAorICogbWF0Y2ggdXAuCisgKi8KKyNpZmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRAorLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBqbXBfYnVmIGJ1aWx0IGluIHRvICpwbmdfcHRyLiAgSXQgbXVzdCBiZQorICogc3VwcGxpZWQgd2l0aCBhbiBhcHByb3ByaWF0ZSAnbG9uZ2ptcCcgZnVuY3Rpb24gdG8gdXNlIG9uIHRoYXQgam1wX2J1ZgorICogdW5sZXNzIHRoZSBkZWZhdWx0IGVycm9yIGZ1bmN0aW9uIGlzIG92ZXJyaWRkZW4gaW4gd2hpY2ggY2FzZSBOVUxMIGlzCisgKiBhY2NlcHRhYmxlLiAgVGhlIHNpemUgb2YgdGhlIGptcF9idWYgaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSBhY3R1YWwgc2l6ZQorICogYWxsb2NhdGVkIGJ5IHRoZSBsaWJyYXJ5IC0gdGhlIGNhbGwgd2lsbCByZXR1cm4gTlVMTCBvbiBhIG1pc21hdGNoCisgKiBpbmRpY2F0aW5nIGFuIEFCSSBtaXNtYXRjaC4KKyAqLworUE5HX0VYUE9SVCg4LCBqbXBfYnVmKiwgcG5nX3NldF9sb25nam1wX2ZuLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2xvbmdqbXBfcHRyIGxvbmdqbXBfZm4sIHNpemVfdCBqbXBfYnVmX3NpemUpKTsKKyMgIGRlZmluZSBwbmdfam1wYnVmKHBuZ19wdHIpIFwKKyAgICAgICgqcG5nX3NldF9sb25nam1wX2ZuKChwbmdfcHRyKSwgbG9uZ2ptcCwgKHNpemVvZiAoam1wX2J1ZikpKSkKKyNlbHNlCisjICBkZWZpbmUgcG5nX2ptcGJ1ZihwbmdfcHRyKSBcCisgICAgICAoTElCUE5HX1dBU19DT01QSUxFRF9XSVRIX19QTkdfTk9fU0VUSk1QKQorI2VuZGlmCisvKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIGJ5IGxpYnBuZyBhcHBsaWNhdGlvbnMgaW4gcGxhY2Ugb2YKKyAqIGxvbmdqbXAocG5nX3B0ci0+am1wYnVmLCB2YWwpLiAgSWYgbG9uZ2ptcF9mbigpIGhhcyBiZWVuIHNldCwgaXQKKyAqIHdpbGwgdXNlIGl0OyBvdGhlcndpc2UgaXQgd2lsbCBjYWxsIFBOR19BQk9SVCgpLiAgVGhpcyBmdW5jdGlvbiB3YXMKKyAqIGFkZGVkIGluIGxpYnBuZy0xLjUuMC4KKyAqLworUE5HX0VYUE9SVEEoOSwgdm9pZCwgcG5nX2xvbmdqbXAsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgaW50IHZhbCksCisgICAgUE5HX05PUkVUVVJOKTsKKworI2lmZGVmIFBOR19SRUFEX1NVUFBPUlRFRAorLyogUmVzZXQgdGhlIGNvbXByZXNzaW9uIHN0cmVhbSAqLworUE5HX0VYUE9SVEEoMTAsIGludCwgcG5nX3Jlc2V0X3pzdHJlYW0sIChwbmdfc3RydWN0cnAgcG5nX3B0ciksIFBOR19ERVBSRUNBVEVEKTsKKyNlbmRpZgorCisvKiBOZXcgZnVuY3Rpb25zIGFkZGVkIGluIGxpYnBuZy0xLjAuMiAobm90IGVuYWJsZWQgYnkgZGVmYXVsdCB1bnRpbCAxLjIuMCkgKi8KKyNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECitQTkdfRVhQT1JUQSgxMSwgcG5nX3N0cnVjdHAsIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3RfMiwKKyAgICAocG5nX2NvbnN0X2NoYXJwIHVzZXJfcG5nX3ZlciwgcG5nX3ZvaWRwIGVycm9yX3B0ciwgcG5nX2Vycm9yX3B0ciBlcnJvcl9mbiwKKyAgICBwbmdfZXJyb3JfcHRyIHdhcm5fZm4sCisgICAgcG5nX3ZvaWRwIG1lbV9wdHIsIHBuZ19tYWxsb2NfcHRyIG1hbGxvY19mbiwgcG5nX2ZyZWVfcHRyIGZyZWVfZm4pLAorICAgIFBOR19BTExPQ0FURUQpOworUE5HX0VYUE9SVEEoMTIsIHBuZ19zdHJ1Y3RwLCBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdF8yLAorICAgIChwbmdfY29uc3RfY2hhcnAgdXNlcl9wbmdfdmVyLCBwbmdfdm9pZHAgZXJyb3JfcHRyLCBwbmdfZXJyb3JfcHRyIGVycm9yX2ZuLAorICAgIHBuZ19lcnJvcl9wdHIgd2Fybl9mbiwKKyAgICBwbmdfdm9pZHAgbWVtX3B0ciwgcG5nX21hbGxvY19wdHIgbWFsbG9jX2ZuLCBwbmdfZnJlZV9wdHIgZnJlZV9mbiksCisgICAgUE5HX0FMTE9DQVRFRCk7CisjZW5kaWYKKworLyogV3JpdGUgdGhlIFBORyBmaWxlIHNpZ25hdHVyZS4gKi8KK1BOR19FWFBPUlQoMTMsIHZvaWQsIHBuZ193cml0ZV9zaWcsIChwbmdfc3RydWN0cnAgcG5nX3B0cikpOworCisvKiBXcml0ZSBhIFBORyBjaHVuayAtIHNpemUsIHR5cGUsIChvcHRpb25hbCkgZGF0YSwgQ1JDLiAqLworUE5HX0VYUE9SVCgxNCwgdm9pZCwgcG5nX3dyaXRlX2NodW5rLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9ieXRlcAorICAgIGNodW5rX25hbWUsIHBuZ19jb25zdF9ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCkpOworCisvKiBXcml0ZSB0aGUgc3RhcnQgb2YgYSBQTkcgY2h1bmsgLSBsZW5ndGggYW5kIGNodW5rIG5hbWUuICovCitQTkdfRVhQT1JUKDE1LCB2b2lkLCBwbmdfd3JpdGVfY2h1bmtfc3RhcnQsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfYnl0ZXAgY2h1bmtfbmFtZSwgcG5nX3VpbnRfMzIgbGVuZ3RoKSk7CisKKy8qIFdyaXRlIHRoZSBkYXRhIG9mIGEgUE5HIGNodW5rIHN0YXJ0ZWQgd2l0aCBwbmdfd3JpdGVfY2h1bmtfc3RhcnQoKS4gKi8KK1BOR19FWFBPUlQoMTYsIHZvaWQsIHBuZ193cml0ZV9jaHVua19kYXRhLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbnN0X2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKSk7CisKKy8qIEZpbmlzaCBhIGNodW5rIHN0YXJ0ZWQgd2l0aCBwbmdfd3JpdGVfY2h1bmtfc3RhcnQoKSAoaW5jbHVkZXMgQ1JDKS4gKi8KK1BOR19FWFBPUlQoMTcsIHZvaWQsIHBuZ193cml0ZV9jaHVua19lbmQsIChwbmdfc3RydWN0cnAgcG5nX3B0cikpOworCisvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgaW5mbyBzdHJ1Y3R1cmUgKi8KK1BOR19FWFBPUlRBKDE4LCBwbmdfaW5mb3AsIHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciksCisgICAgUE5HX0FMTE9DQVRFRCk7CisKKy8qIERFUFJFQ0FURUQ6IHRoaXMgZnVuY3Rpb24gYWxsb3dlZCBpbml0IHN0cnVjdHVyZXMgdG8gYmUgY3JlYXRlZCB1c2luZyB0aGUKKyAqIGRlZmF1bHQgYWxsb2NhdGlvbiBtZXRob2QgKHR5cGljYWxseSBtYWxsb2MpLiAgVXNlIGlzIGRlcHJlY2F0ZWQgaW4gMS42LjAgYW5kCisgKiB0aGUgQVBJIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgorICovCitQTkdfRVhQT1JUQSgxOSwgdm9pZCwgcG5nX2luZm9faW5pdF8zLCAocG5nX2luZm9wcCBpbmZvX3B0ciwKKyAgICBwbmdfc2l6ZV90IHBuZ19pbmZvX3N0cnVjdF9zaXplKSwgUE5HX0RFUFJFQ0FURUQpOworCisvKiBXcml0ZXMgYWxsIHRoZSBQTkcgaW5mb3JtYXRpb24gYmVmb3JlIHRoZSBpbWFnZS4gKi8KK1BOR19FWFBPUlQoMjAsIHZvaWQsIHBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFLAorICAgIChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikpOworUE5HX0VYUE9SVCgyMSwgdm9pZCwgcG5nX3dyaXRlX2luZm8sCisgICAgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyKSk7CisKKyNpZmRlZiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRAorLyogUmVhZCB0aGUgaW5mb3JtYXRpb24gYmVmb3JlIHRoZSBhY3R1YWwgaW1hZ2UgZGF0YS4gKi8KK1BOR19FWFBPUlQoMjIsIHZvaWQsIHBuZ19yZWFkX2luZm8sCisgICAgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19USU1FX1JGQzExMjNfU1VQUE9SVEVECisgICAvKiBDb252ZXJ0IHRvIGEgVVMgc3RyaW5nIGZvcm1hdDogdGhlcmUgaXMgbm8gbG9jYWxpemF0aW9uIHN1cHBvcnQgaW4gdGhpcworICAgICogcm91dGluZS4gIFRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiB1c2VkIGEgMjkgY2hhcmFjdGVyIGJ1ZmZlciBpbgorICAgICogcG5nX3N0cnVjdCwgdGhpcyB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLgorICAgICovCisjaWYgUE5HX0xJQlBOR19WRVIgPCAxMDcwMAorLyogVG8gZG86IHJlbW92ZSB0aGlzIGZyb20gbGlicG5nMTcgKGFuZCBmcm9tIGxpYnBuZzE3L3BuZy5jIGFuZCBwbmdzdHJ1Y3QuaCkgKi8KK1BOR19FWFBPUlRBKDIzLCBwbmdfY29uc3RfY2hhcnAsIHBuZ19jb252ZXJ0X3RvX3JmYzExMjMsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfdGltZXAgcHRpbWUpLFBOR19ERVBSRUNBVEVEKTsKKyNlbmRpZgorUE5HX0VYUE9SVCgyNDEsIGludCwgcG5nX2NvbnZlcnRfdG9fcmZjMTEyM19idWZmZXIsIChjaGFyIG91dFsyOV0sCisgICAgcG5nX2NvbnN0X3RpbWVwIHB0aW1lKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19DT05WRVJUX3RJTUVfU1VQUE9SVEVECisvKiBDb252ZXJ0IGZyb20gYSBzdHJ1Y3QgdG0gdG8gcG5nX3RpbWUgKi8KK1BOR19FWFBPUlQoMjQsIHZvaWQsIHBuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtLCAocG5nX3RpbWVwIHB0aW1lLAorICAgIGNvbnN0IHN0cnVjdCB0bSAqIHR0aW1lKSk7CisKKy8qIENvbnZlcnQgZnJvbSB0aW1lX3QgdG8gcG5nX3RpbWUuICBVc2VzIGdtdGltZSgpICovCitQTkdfRVhQT1JUKDI1LCB2b2lkLCBwbmdfY29udmVydF9mcm9tX3RpbWVfdCwgKHBuZ190aW1lcCBwdGltZSwgdGltZV90IHR0aW1lKSk7CisjZW5kaWYgLyogQ09OVkVSVF90SU1FICovCisKKyNpZmRlZiBQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVECisvKiBFeHBhbmQgZGF0YSB0byAyNC1iaXQgUkdCLCBvciA4LWJpdCBncmF5c2NhbGUsIHdpdGggYWxwaGEgaWYgYXZhaWxhYmxlLiAqLworUE5HX0VYUE9SVCgyNiwgdm9pZCwgcG5nX3NldF9leHBhbmQsIChwbmdfc3RydWN0cnAgcG5nX3B0cikpOworUE5HX0VYUE9SVCgyNywgdm9pZCwgcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184LCAocG5nX3N0cnVjdHJwIHBuZ19wdHIpKTsKK1BOR19FWFBPUlQoMjgsIHZvaWQsIHBuZ19zZXRfcGFsZXR0ZV90b19yZ2IsIChwbmdfc3RydWN0cnAgcG5nX3B0cikpOworUE5HX0VYUE9SVCgyOSwgdm9pZCwgcG5nX3NldF90Uk5TX3RvX2FscGhhLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfRVhQQU5EXzE2X1NVUFBPUlRFRAorLyogRXhwYW5kIHRvIDE2LWJpdCBjaGFubmVscywgZm9yY2VzIGNvbnZlcnNpb24gb2YgcGFsZXR0ZSB0byBSR0IgYW5kIGV4cGFuc2lvbgorICogb2YgYSB0Uk5TIGNodW5rIGlmIHByZXNlbnQuCisgKi8KK1BOR19FWFBPUlQoMjIxLCB2b2lkLCBwbmdfc2V0X2V4cGFuZF8xNiwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX1JFQURfQkdSX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfQkdSX1NVUFBPUlRFRCkKKy8qIFVzZSBibHVlLCBncmVlbiwgcmVkIG9yZGVyIGZvciBwaXhlbHMuICovCitQTkdfRVhQT1JUKDMwLCB2b2lkLCBwbmdfc2V0X2JnciwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0dSQVlfVE9fUkdCX1NVUFBPUlRFRAorLyogRXhwYW5kIHRoZSBncmF5c2NhbGUgdG8gMjQtYml0IFJHQiBpZiBuZWNlc3NhcnkuICovCitQTkdfRVhQT1JUKDMxLCB2b2lkLCBwbmdfc2V0X2dyYXlfdG9fcmdiLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVECisvKiBSZWR1Y2UgUkdCIHRvIGdyYXlzY2FsZS4gKi8KKyNkZWZpbmUgUE5HX0VSUk9SX0FDVElPTl9OT05FICAxCisjZGVmaW5lIFBOR19FUlJPUl9BQ1RJT05fV0FSTiAgMgorI2RlZmluZSBQTkdfRVJST1JfQUNUSU9OX0VSUk9SIDMKKyNkZWZpbmUgUE5HX1JHQl9UT19HUkFZX0RFRkFVTFQgKC0xKS8qZm9yIHJlZC9ncmVlbiBjb2VmZmljaWVudHMqLworCitQTkdfRlBfRVhQT1JUKDMyLCB2b2lkLCBwbmdfc2V0X3JnYl90b19ncmF5LCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgaW50IGVycm9yX2FjdGlvbiwgZG91YmxlIHJlZCwgZG91YmxlIGdyZWVuKSkKK1BOR19GSVhFRF9FWFBPUlQoMzMsIHZvaWQsIHBuZ19zZXRfcmdiX3RvX2dyYXlfZml4ZWQsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBpbnQgZXJyb3JfYWN0aW9uLCBwbmdfZml4ZWRfcG9pbnQgcmVkLCBwbmdfZml4ZWRfcG9pbnQgZ3JlZW4pKQorCitQTkdfRVhQT1JUKDM0LCBwbmdfYnl0ZSwgcG5nX2dldF9yZ2JfdG9fZ3JheV9zdGF0dXMsIChwbmdfY29uc3Rfc3RydWN0cnAKKyAgICBwbmdfcHRyKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19CVUlMRF9HUkFZU0NBTEVfUEFMRVRURV9TVVBQT1JURUQKK1BOR19FWFBPUlQoMzUsIHZvaWQsIHBuZ19idWlsZF9ncmF5c2NhbGVfcGFsZXR0ZSwgKGludCBiaXRfZGVwdGgsCisgICAgcG5nX2NvbG9ycCBwYWxldHRlKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0FMUEhBX01PREVfU1VQUE9SVEVECisvKiBIb3cgdGhlIGFscGhhIGNoYW5uZWwgaXMgaW50ZXJwcmV0ZWQgLSB0aGlzIGFmZmVjdHMgaG93IHRoZSBjb2xvciBjaGFubmVscworICogb2YgYSBQTkcgZmlsZSBhcmUgcmV0dXJuZWQgdG8gdGhlIGNhbGxpbmcgYXBwbGljYXRpb24gd2hlbiBhbiBhbHBoYSBjaGFubmVsLAorICogb3IgYSB0Uk5TIGNodW5rIGluIGEgcGFsZXR0ZSBmaWxlLCBpcyBwcmVzZW50LgorICoKKyAqIFRoaXMgaGFzIG5vIGVmZmVjdCBvbiB0aGUgd2F5IHBpeGVscyBhcmUgd3JpdHRlbiBpbnRvIGEgUE5HIG91dHB1dAorICogZGF0YXN0cmVhbS4gVGhlIGNvbG9yIHNhbXBsZXMgaW4gYSBQTkcgZGF0YXN0cmVhbSBhcmUgbmV2ZXIgcHJlbXVsdGlwbGllZAorICogd2l0aCB0aGUgYWxwaGEgc2FtcGxlcy4KKyAqCisgKiBUaGUgZGVmYXVsdCBpcyB0byByZXR1cm4gZGF0YSBhY2NvcmRpbmcgdG8gdGhlIFBORyBzcGVjaWZpY2F0aW9uOiB0aGUgYWxwaGEKKyAqIGNoYW5uZWwgaXMgYSBsaW5lYXIgbWVhc3VyZSBvZiB0aGUgY29udHJpYnV0aW9uIG9mIHRoZSBwaXhlbCB0byB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgY29tcG9zaXRlZCBwaXhlbCwgYW5kIHRoZSBjb2xvciBjaGFubmVscyBhcmUgdW5hc3NvY2lhdGVkCisgKiAobm90IHByZW11bHRpcGxpZWQpLiAgVGhlIGdhbW1hIGVuY29kZWQgY29sb3IgY2hhbm5lbHMgbXVzdCBiZSBzY2FsZWQKKyAqIGFjY29yZGluZyB0byB0aGUgY29udHJpYnV0aW9uIGFuZCB0byBkbyB0aGlzIGl0IGlzIG5lY2Vzc2FyeSB0byB1bmRvCisgKiB0aGUgZW5jb2RpbmcsIHNjYWxlIHRoZSBjb2xvciB2YWx1ZXMsIHBlcmZvcm0gdGhlIGNvbXBvc2l0aW9uIGFuZCByZWVuY29kZQorICogdGhlIHZhbHVlcy4gIFRoaXMgaXMgdGhlICdQTkcnIG1vZGUuCisgKgorICogVGhlIGFsdGVybmF0aXZlIGlzIHRvICdhc3NvY2lhdGUnIHRoZSBhbHBoYSB3aXRoIHRoZSBjb2xvciBpbmZvcm1hdGlvbiBieQorICogc3RvcmluZyBjb2xvciBjaGFubmVsIHZhbHVlcyB0aGF0IGhhdmUgYmVlbiBzY2FsZWQgYnkgdGhlIGFscGhhLgorICogaW1hZ2UuICBUaGVzZSBhcmUgdGhlICdTVEFOREFSRCcsICdBU1NPQ0lBVEVEJyBvciAnUFJFTVVMVElQTElFRCcgbW9kZXMKKyAqICh0aGUgbGF0dGVyIGJlaW5nIHRoZSB0d28gY29tbW9uIG5hbWVzIGZvciBhc3NvY2lhdGVkIGFscGhhIGNvbG9yIGNoYW5uZWxzKS4KKyAqCisgKiBGb3IgdGhlICdPUFRJTUlaRUQnIG1vZGUsIGEgcGl4ZWwgaXMgdHJlYXRlZCBhcyBvcGFxdWUgb25seSBpZiB0aGUgYWxwaGEKKyAqIHZhbHVlIGlzIGVxdWFsIHRvIHRoZSBtYXhpbXVtIHZhbHVlLgorICoKKyAqIFRoZSBmaW5hbCBjaG9pY2UgaXMgdG8gZ2FtbWEgZW5jb2RlIHRoZSBhbHBoYSBjaGFubmVsIGFzIHdlbGwuICBUaGlzIGlzCisgKiBicm9rZW4gYmVjYXVzZSwgaW4gcHJhY3RpY2UsIG5vIGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyB0aGlzIGNob2ljZQorICogY29ycmVjdGx5IHVuZG9lcyB0aGUgZW5jb2RpbmcgYmVmb3JlIGhhbmRsaW5nIGFscGhhIGNvbXBvc2l0aW9uLiAgVXNlIHRoaXMKKyAqIGNob2ljZSBvbmx5IGlmIG90aGVyIHNlcmlvdXMgZXJyb3JzIGluIHRoZSBzb2Z0d2FyZSBvciBoYXJkd2FyZSB5b3UgdXNlCisgKiBtYW5kYXRlIGl0OyB0aGUgdHlwaWNhbCBzZXJpb3VzIGVycm9yIGlzIGZvciBkYXJrIGhhbG9zIHRvIGFwcGVhciBhcm91bmQKKyAqIG9wYXF1ZSBhcmVhcyBvZiB0aGUgY29tcG9zaXRlZCBQTkcgaW1hZ2UgYmVjYXVzZSBvZiBhcml0aG1ldGljIG92ZXJmbG93LgorICoKKyAqIFRoZSBBUEkgZnVuY3Rpb24gcG5nX3NldF9hbHBoYV9tb2RlIHNwZWNpZmllcyB3aGljaCBvZiB0aGVzZSBjaG9pY2VzIHRvIHVzZQorICogd2l0aCBhbiBlbnVtZXJhdGVkICdtb2RlJyB2YWx1ZSBhbmQgdGhlIGdhbW1hIG9mIHRoZSByZXF1aXJlZCBvdXRwdXQ6CisgKi8KKyNkZWZpbmUgUE5HX0FMUEhBX1BORyAgICAgICAgICAgMCAvKiBhY2NvcmRpbmcgdG8gdGhlIFBORyBzdGFuZGFyZCAqLworI2RlZmluZSBQTkdfQUxQSEFfU1RBTkRBUkQgICAgICAxIC8qIGFjY29yZGluZyB0byBQb3J0ZXIvRHVmZiAqLworI2RlZmluZSBQTkdfQUxQSEFfQVNTT0NJQVRFRCAgICAxIC8qIGFzIGFib3ZlOyB0aGlzIGlzIHRoZSBub3JtYWwgcHJhY3RpY2UgKi8KKyNkZWZpbmUgUE5HX0FMUEhBX1BSRU1VTFRJUExJRUQgMSAvKiBhcyBhYm92ZSAqLworI2RlZmluZSBQTkdfQUxQSEFfT1BUSU1JWkVEICAgICAyIC8qICdQTkcnIGZvciBvcGFxdWUgcGl4ZWxzLCBlbHNlICdTVEFOREFSRCcgKi8KKyNkZWZpbmUgUE5HX0FMUEhBX0JST0tFTiAgICAgICAgMyAvKiB0aGUgYWxwaGEgY2hhbm5lbCBpcyBnYW1tYSBlbmNvZGVkICovCisKK1BOR19GUF9FWFBPUlQoMjI3LCB2b2lkLCBwbmdfc2V0X2FscGhhX21vZGUsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwgaW50IG1vZGUsCisgICAgZG91YmxlIG91dHB1dF9nYW1tYSkpCitQTkdfRklYRURfRVhQT1JUKDIyOCwgdm9pZCwgcG5nX3NldF9hbHBoYV9tb2RlX2ZpeGVkLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgaW50IG1vZGUsIHBuZ19maXhlZF9wb2ludCBvdXRwdXRfZ2FtbWEpKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19HQU1NQV9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfQUxQSEFfTU9ERV9TVVBQT1JURUQpCisvKiBUaGUgb3V0cHV0X2dhbW1hIHZhbHVlIGlzIGEgc2NyZWVuIGdhbW1hIGluIGxpYnBuZyB0ZXJtaW5vbG9neTogaXQgZXhwcmVzc2VzCisgKiBob3cgdG8gZGVjb2RlIHRoZSBvdXRwdXQgdmFsdWVzLCBub3QgaG93IHRoZXkgYXJlIGVuY29kZWQuCisgKi8KKyNkZWZpbmUgUE5HX0RFRkFVTFRfc1JHQiAtMSAgICAgICAvKiBzUkdCIGdhbW1hIGFuZCBjb2xvciBzcGFjZSAqLworI2RlZmluZSBQTkdfR0FNTUFfTUFDXzE4IC0yICAgICAgIC8qIE9sZCBNYWMgJzEuOCcgZ2FtbWEgYW5kIGNvbG9yIHNwYWNlICovCisjZGVmaW5lIFBOR19HQU1NQV9zUkdCICAgMjIwMDAwICAgLyogVGVsZXZpc2lvbiBzdGFuZGFyZHMtLW1hdGNoZXMgc1JHQiBnYW1tYSAqLworI2RlZmluZSBQTkdfR0FNTUFfTElORUFSIFBOR19GUF8xIC8qIExpbmVhciAqLworI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIGV4YW1wbGVzIG9mIGNhbGxzIHRvIHBuZ19zZXRfYWxwaGFfbW9kZSB0byBhY2hpZXZlIHRoZQorICogcmVxdWlyZWQgb3ZlcmFsbCBnYW1tYSBjb3JyZWN0aW9uIGFuZCwgd2hlcmUgbmVjZXNzYXJ5LCBhbHBoYQorICogcHJlbXVsdGlwbGljYXRpb24uCisgKgorICogcG5nX3NldF9hbHBoYV9tb2RlKHBwLCBQTkdfQUxQSEFfUE5HLCBQTkdfREVGQVVMVF9zUkdCKTsKKyAqICAgIFRoaXMgaXMgdGhlIGRlZmF1bHQgbGlicG5nIGhhbmRsaW5nIG9mIHRoZSBhbHBoYSBjaGFubmVsIC0gaXQgaXMgbm90CisgKiAgICBwcmUtbXVsdGlwbGllZCBpbnRvIHRoZSBjb2xvciBjb21wb25lbnRzLiAgSW4gYWRkaXRpb24gdGhlIGNhbGwgc3RhdGVzCisgKiAgICB0aGF0IHRoZSBvdXRwdXQgaXMgZm9yIGEgc1JHQiBzeXN0ZW0gYW5kIGNhdXNlcyBhbGwgUE5HIGZpbGVzIHdpdGhvdXQgZ0FNQQorICogICAgY2h1bmtzIHRvIGJlIGFzc3VtZWQgdG8gYmUgZW5jb2RlZCB1c2luZyBzUkdCLgorICoKKyAqIHBuZ19zZXRfYWxwaGFfbW9kZShwcCwgUE5HX0FMUEhBX1BORywgUE5HX0dBTU1BX01BQyk7CisgKiAgICBJbiB0aGlzIGNhc2UgdGhlIG91dHB1dCBpcyBhc3N1bWVkIHRvIGJlIHNvbWV0aGluZyBsaWtlIGFuIHNSR0IgY29uZm9ybWFudAorICogICAgZGlzcGxheSBwcmVjZWVkZWQgYnkgYSBwb3dlci1sYXcgbG9va3VwIHRhYmxlIG9mIHBvd2VyIDEuNDUuICBUaGlzIGlzIGhvdworICogICAgZWFybHkgTWFjIHN5c3RlbXMgYmVoYXZlZC4KKyAqCisgKiBwbmdfc2V0X2FscGhhX21vZGUocHAsIFBOR19BTFBIQV9TVEFOREFSRCwgUE5HX0dBTU1BX0xJTkVBUik7CisgKiAgICBUaGlzIGlzIHRoZSBjbGFzc2ljIEppbSBCbGlubiBhcHByb2FjaCBhbmQgd2lsbCB3b3JrIGluIGFjYWRlbWljCisgKiAgICBlbnZpcm9ubWVudHMgd2hlcmUgZXZlcnl0aGluZyBpcyBkb25lIGJ5IHRoZSBib29rLiAgSXQgaGFzIHRoZSBzaG9ydGNvbWluZworICogICAgb2YgYXNzdW1pbmcgdGhhdCBpbnB1dCBQTkcgZGF0YSB3aXRoIG5vIGdhbW1hIGluZm9ybWF0aW9uIGlzIGxpbmVhciAtIHRoaXMKKyAqICAgIGlzIHVubGlrZWx5IHRvIGJlIGNvcnJlY3QgdW5sZXNzIHRoZSBQTkcgZmlsZXMgd2hlcmUgZ2VuZXJhdGVkIGxvY2FsbHkuCisgKiAgICBNb3N0IG9mIHRoZSB0aW1lIHRoZSBvdXRwdXQgcHJlY2lzaW9uIHdpbGwgYmUgc28gbG93IGFzIHRvIHNob3cKKyAqICAgIHNpZ25pZmljYW50IGJhbmRpbmcgaW4gZGFyayBhcmVhcyBvZiB0aGUgaW1hZ2UuCisgKgorICogcG5nX3NldF9leHBhbmRfMTYocHApOworICogcG5nX3NldF9hbHBoYV9tb2RlKHBwLCBQTkdfQUxQSEFfU1RBTkRBUkQsIFBOR19ERUZBVUxUX3NSR0IpOworICogICAgVGhpcyBpcyBhIHNvbWV3aGF0IG1vcmUgcmVhbGlzdGljIEppbSBCbGlubiBpbnNwaXJlZCBhcHByb2FjaC4gIFBORyBmaWxlcworICogICAgYXJlIGFzc3VtZWQgdG8gaGF2ZSB0aGUgc1JHQiBlbmNvZGluZyBpZiBub3QgbWFya2VkIHdpdGggYSBnYW1tYSB2YWx1ZSBhbmQKKyAqICAgIHRoZSBvdXRwdXQgaXMgYWx3YXlzIDE2IGJpdHMgcGVyIGNvbXBvbmVudC4gIFRoaXMgcGVybWl0cyBhY2N1cmF0ZSBzY2FsaW5nCisgKiAgICBhbmQgcHJvY2Vzc2luZyBvZiB0aGUgZGF0YS4gIElmIHlvdSBrbm93IHRoYXQgeW91ciBpbnB1dCBQTkcgZmlsZXMgd2VyZQorICogICAgZ2VuZXJhdGVkIGxvY2FsbHkgeW91IG1pZ2h0IG5lZWQgdG8gcmVwbGFjZSBQTkdfREVGQVVMVF9zUkdCIHdpdGggdGhlCisgKiAgICBjb3JyZWN0IHZhbHVlIGZvciB5b3VyIHN5c3RlbS4KKyAqCisgKiBwbmdfc2V0X2FscGhhX21vZGUocHAsIFBOR19BTFBIQV9PUFRJTUlaRUQsIFBOR19ERUZBVUxUX3NSR0IpOworICogICAgSWYgeW91IGp1c3QgbmVlZCB0byBjb21wb3NpdGUgdGhlIFBORyBpbWFnZSBvbnRvIGFuIGV4aXN0aW5nIGJhY2tncm91bmQKKyAqICAgIGFuZCBpZiB5b3UgY29udHJvbCB0aGUgY29kZSB0aGF0IGRvZXMgdGhpcyB5b3UgY2FuIHVzZSB0aGUgb3B0aW1pemF0aW9uCisgKiAgICBzZXR0aW5nLiAgSW4gdGhpcyBjYXNlIHlvdSBqdXN0IGNvcHkgY29tcGxldGVseSBvcGFxdWUgcGl4ZWxzIHRvIHRoZQorICogICAgb3V0cHV0LiAgRm9yIHBpeGVscyB0aGF0IGFyZSBub3QgY29tcGxldGVseSB0cmFuc3BhcmVudCAoeW91IGp1c3Qgc2tpcAorICogICAgdGhvc2UpIHlvdSBkbyB0aGUgY29tcG9zaXRpb24gbWF0aCB1c2luZyBwbmdfY29tcG9zaXRlIG9yIHBuZ19jb21wb3NpdGVfMTYKKyAqICAgIGJlbG93IHRoZW4gZW5jb2RlIHRoZSByZXN1bHRhbnQgOC1iaXQgb3IgMTYtYml0IHZhbHVlcyB0byBtYXRjaCB0aGUgb3V0cHV0CisgKiAgICBlbmNvZGluZy4KKyAqCisgKiBPdGhlciBjYXNlcworICogICAgSWYgbmVpdGhlciB0aGUgUE5HIG5vciB0aGUgc3RhbmRhcmQgbGluZWFyIGVuY29kaW5nIHdvcmsgZm9yIHlvdSBiZWNhdXNlCisgKiAgICBvZiB0aGUgc29mdHdhcmUgb3IgaGFyZHdhcmUgeW91IHVzZSB0aGVuIHlvdSBoYXZlIGEgYmlnIHByb2JsZW0uICBUaGUgUE5HCisgKiAgICBjYXNlIHdpbGwgcHJvYmFibHkgcmVzdWx0IGluIGhhbG9zIGFyb3VuZCB0aGUgaW1hZ2UuICBUaGUgbGluZWFyIGVuY29kaW5nCisgKiAgICB3aWxsIHByb2JhYmx5IHJlc3VsdCBpbiBhIHdhc2hlZCBvdXQsIHRvbyBicmlnaHQsIGltYWdlIChpdCdzIGFjdHVhbGx5IHRvbworICogICAgY29udHJhc3R5LikgIFRyeSB0aGUgQUxQSEFfT1BUSU1JWkVEIG1vZGUgYWJvdmUgLSB0aGlzIHdpbGwgcHJvYmFibHkKKyAqICAgIHN1YnN0YW50aWFsbHkgcmVkdWNlIHRoZSBoYWxvcy4gIEFsdGVybmF0aXZlbHkgdHJ5OgorICoKKyAqIHBuZ19zZXRfYWxwaGFfbW9kZShwcCwgUE5HX0FMUEhBX0JST0tFTiwgUE5HX0RFRkFVTFRfc1JHQik7CisgKiAgICBUaGlzIG9wdGlvbiB3aWxsIGFsc28gcmVkdWNlIHRoZSBoYWxvcywgYnV0IHRoZXJlIHdpbGwgYmUgc2xpZ2h0IGRhcmsKKyAqICAgIGhhbG9zIHJvdW5kIHRoZSBvcGFxdWUgcGFydHMgb2YgdGhlIGltYWdlIHdoZXJlIHRoZSBiYWNrZ3JvdW5kIGlzIGxpZ2h0LgorICogICAgSW4gdGhlIE9QVElNSVpFRCBtb2RlIHRoZSBoYWxvcyB3aWxsIGJlIGxpZ2h0IGhhbG9zIHdoZXJlIHRoZSBiYWNrZ3JvdW5kCisgKiAgICBpcyBkYXJrLiAgVGFrZSB5b3VyIHBpY2sgLSB0aGUgaGFsb3MgYXJlIHVuYXZvaWRhYmxlIHVubGVzcyB5b3UgY2FuIGdldAorICogICAgeW91ciBoYXJkd2FyZS9zb2Z0d2FyZSBmaXhlZCEgIChUaGUgT1BUSU1JWkVEIGFwcHJvYWNoIGlzIHNsaWdodGx5CisgKiAgICBmYXN0ZXIuKQorICoKKyAqIFdoZW4gdGhlIGRlZmF1bHQgZ2FtbWEgb2YgUE5HIGZpbGVzIGRvZXNuJ3QgbWF0Y2ggdGhlIG91dHB1dCBnYW1tYS4KKyAqICAgIElmIHlvdSBoYXZlIFBORyBmaWxlcyB3aXRoIG5vIGdhbW1hIGluZm9ybWF0aW9uIHBuZ19zZXRfYWxwaGFfbW9kZSBhbGxvd3MKKyAqICAgIHlvdSB0byBwcm92aWRlIGEgZGVmYXVsdCBnYW1tYSwgYnV0IGl0IGFsc28gc2V0cyB0aGUgb3VwdXQgZ2FtbWEgdG8gdGhlCisgKiAgICBtYXRjaGluZyB2YWx1ZS4gIElmIHlvdSBrbm93IHlvdXIgUE5HIGZpbGVzIGhhdmUgYSBnYW1tYSB0aGF0IGRvZXNuJ3QKKyAqICAgIG1hdGNoIHRoZSBvdXRwdXQgeW91IGNhbiB0YWtlIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0CisgKiAgICBwbmdfc2V0X2FscGhhX21vZGUgYWx3YXlzIHNldHMgdGhlIG91dHB1dCBnYW1tYSBidXQgb25seSBzZXRzIHRoZSBQTkcKKyAqICAgIGRlZmF1bHQgaWYgaXQgaXMgbm90IGFscmVhZHkgc2V0OgorICoKKyAqIHBuZ19zZXRfYWxwaGFfbW9kZShwcCwgUE5HX0FMUEhBX1BORywgUE5HX0RFRkFVTFRfc1JHQik7CisgKiBwbmdfc2V0X2FscGhhX21vZGUocHAsIFBOR19BTFBIQV9QTkcsIFBOR19HQU1NQV9NQUMpOworICogICAgVGhlIGZpcnN0IGNhbGwgc2V0cyBib3RoIHRoZSBkZWZhdWx0IGFuZCB0aGUgb3V0cHV0IGdhbW1hIHZhbHVlcywgdGhlCisgKiAgICBzZWNvbmQgY2FsbCBvdmVycmlkZXMgdGhlIG91dHB1dCBnYW1tYSB3aXRob3V0IGNoYW5naW5nIHRoZSBkZWZhdWx0LiAgVGhpcworICogICAgaXMgZWFzaWVyIHRoYW4gYWNoaWV2aW5nIHRoZSBzYW1lIGVmZmVjdCB3aXRoIHBuZ19zZXRfZ2FtbWEuICBZb3UgbXVzdCB1c2UKKyAqICAgIFBOR19BTFBIQV9QTkcgZm9yIHRoZSBmaXJzdCBjYWxsIC0gaW50ZXJuYWwgY2hlY2tpbmcgaW4gcG5nX3NldF9hbHBoYSB3aWxsCisgKiAgICBmaXJlIGlmIG1vcmUgdGhhbiBvbmUgY2FsbCB0byBwbmdfc2V0X2FscGhhX21vZGUgYW5kIHBuZ19zZXRfYmFja2dyb3VuZCBpcworICogICAgbWFkZSBpbiB0aGUgc2FtZSByZWFkIG9wZXJhdGlvbiwgaG93ZXZlciBtdWx0aXBsZSBjYWxscyB3aXRoIFBOR19BTFBIQV9QTkcKKyAqICAgIGFyZSBpZ25vcmVkLgorICovCisKKyNpZmRlZiBQTkdfUkVBRF9TVFJJUF9BTFBIQV9TVVBQT1JURUQKK1BOR19FWFBPUlQoMzYsIHZvaWQsIHBuZ19zZXRfc3RyaXBfYWxwaGEsIChwbmdfc3RydWN0cnAgcG5nX3B0cikpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NXQVBfQUxQSEFfU1VQUE9SVEVEKSB8fCBcCisgICAgZGVmaW5lZChQTkdfV1JJVEVfU1dBUF9BTFBIQV9TVVBQT1JURUQpCitQTkdfRVhQT1JUKDM3LCB2b2lkLCBwbmdfc2V0X3N3YXBfYWxwaGEsIChwbmdfc3RydWN0cnAgcG5nX3B0cikpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQpIHx8IFwKKyAgICBkZWZpbmVkKFBOR19XUklURV9JTlZFUlRfQUxQSEFfU1VQUE9SVEVEKQorUE5HX0VYUE9SVCgzOCwgdm9pZCwgcG5nX3NldF9pbnZlcnRfYWxwaGEsIChwbmdfc3RydWN0cnAgcG5nX3B0cikpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX0ZJTExFUl9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX0ZJTExFUl9TVVBQT1JURUQpCisvKiBBZGQgYSBmaWxsZXIgYnl0ZSB0byA4LWJpdCBvciAxNi1iaXQgR3JheSBvciAyNC1iaXQgb3IgNDgtYml0IFJHQiBpbWFnZXMuICovCitQTkdfRVhQT1JUKDM5LCB2b2lkLCBwbmdfc2V0X2ZpbGxlciwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfdWludF8zMiBmaWxsZXIsCisgICAgaW50IGZsYWdzKSk7CisvKiBUaGUgdmFsdWVzIG9mIHRoZSBQTkdfRklMTEVSXyBkZWZpbmVzIHNob3VsZCBOT1QgYmUgY2hhbmdlZCAqLworIyAgZGVmaW5lIFBOR19GSUxMRVJfQkVGT1JFIDAKKyMgIGRlZmluZSBQTkdfRklMTEVSX0FGVEVSIDEKKy8qIEFkZCBhbiBhbHBoYSBieXRlIHRvIDgtYml0IG9yIDE2LWJpdCBHcmF5IG9yIDI0LWJpdCBvciA0OC1iaXQgUkdCIGltYWdlcy4gKi8KK1BOR19FWFBPUlQoNDAsIHZvaWQsIHBuZ19zZXRfYWRkX2FscGhhLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX3VpbnRfMzIgZmlsbGVyLCBpbnQgZmxhZ3MpKTsKKyNlbmRpZiAvKiBSRUFEX0ZJTExFUiB8fCBXUklURV9GSUxMRVIgKi8KKworI2lmIGRlZmluZWQoUE5HX1JFQURfU1dBUF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NXQVBfU1VQUE9SVEVEKQorLyogU3dhcCBieXRlcyBpbiAxNi1iaXQgZGVwdGggZmlsZXMuICovCitQTkdfRVhQT1JUKDQxLCB2b2lkLCBwbmdfc2V0X3N3YXAsIChwbmdfc3RydWN0cnAgcG5nX3B0cikpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1BBQ0tfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9QQUNLX1NVUFBPUlRFRCkKKy8qIFVzZSAxIGJ5dGUgcGVyIHBpeGVsIGluIDEsIDIsIG9yIDQtYml0IGRlcHRoIGZpbGVzLiAqLworUE5HX0VYUE9SVCg0Miwgdm9pZCwgcG5nX3NldF9wYWNraW5nLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQpIHx8IFwKKyAgICBkZWZpbmVkKFBOR19XUklURV9QQUNLU1dBUF9TVVBQT1JURUQpCisvKiBTd2FwIHBhY2tpbmcgb3JkZXIgb2YgcGl4ZWxzIGluIGJ5dGVzLiAqLworUE5HX0VYUE9SVCg0Mywgdm9pZCwgcG5nX3NldF9wYWNrc3dhcCwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX1JFQURfU0hJRlRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TSElGVF9TVVBQT1JURUQpCisvKiBDb252ZXJ0cyBmaWxlcyB0byBsZWdhbCBiaXQgZGVwdGhzLiAqLworUE5HX0VYUE9SVCg0NCwgdm9pZCwgcG5nX3NldF9zaGlmdCwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfY29sb3JfOHAKKyAgICB0cnVlX2JpdHMpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQpIHx8IFwKKyAgICBkZWZpbmVkKFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQpCisvKiBIYXZlIHRoZSBjb2RlIGhhbmRsZSB0aGUgaW50ZXJsYWNpbmcuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFzc2VzLgorICogTVVTVCBiZSBjYWxsZWQgYmVmb3JlIHBuZ19yZWFkX3VwZGF0ZV9pbmZvIG9yIHBuZ19zdGFydF9yZWFkX2ltYWdlLAorICogb3RoZXJ3aXNlIGl0IHdpbGwgbm90IGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0LiAgTm90ZSB0aGF0IGl0IGlzIHN0aWxsCisgKiBuZWNlc3NhcnkgdG8gY2FsbCBwbmdfcmVhZF9yb3cgb3IgcG5nX3JlYWRfcm93cyBwbmdfZ2V0X2ltYWdlX2hlaWdodAorICogdGltZXMgZm9yIGVhY2ggcGFzcy4KKyovCitQTkdfRVhQT1JUKDQ1LCBpbnQsIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9JTlZFUlRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9JTlZFUlRfU1VQUE9SVEVEKQorLyogSW52ZXJ0IG1vbm9jaHJvbWUgZmlsZXMgKi8KK1BOR19FWFBPUlQoNDYsIHZvaWQsIHBuZ19zZXRfaW52ZXJ0X21vbm8sIChwbmdfc3RydWN0cnAgcG5nX3B0cikpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRAorLyogSGFuZGxlIGFscGhhIGFuZCB0Uk5TIGJ5IHJlcGxhY2luZyB3aXRoIGEgYmFja2dyb3VuZCBjb2xvci4gIFByaW9yIHRvCisgKiBsaWJwbmctMS41LjQgdGhpcyBBUEkgbXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgUE5HIGZpbGUgaGVhZGVyIGhhcyBiZWVuCisgKiByZWFkLiAgRG9pbmcgc28gd2lsbCByZXN1bHQgaW4gdW5leHBlY3RlZCBiZWhhdmlvciBhbmQgcG9zc2libGUgd2FybmluZ3Mgb3IKKyAqIGVycm9ycyBpZiB0aGUgUE5HIGZpbGUgY29udGFpbnMgYSBiS0dEIGNodW5rLgorICovCitQTkdfRlBfRVhQT1JUKDQ3LCB2b2lkLCBwbmdfc2V0X2JhY2tncm91bmQsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfY29sb3JfMTZwIGJhY2tncm91bmRfY29sb3IsIGludCBiYWNrZ3JvdW5kX2dhbW1hX2NvZGUsCisgICAgaW50IG5lZWRfZXhwYW5kLCBkb3VibGUgYmFja2dyb3VuZF9nYW1tYSkpCitQTkdfRklYRURfRVhQT1JUKDIxNSwgdm9pZCwgcG5nX3NldF9iYWNrZ3JvdW5kX2ZpeGVkLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbnN0X2NvbG9yXzE2cCBiYWNrZ3JvdW5kX2NvbG9yLCBpbnQgYmFja2dyb3VuZF9nYW1tYV9jb2RlLAorICAgIGludCBuZWVkX2V4cGFuZCwgcG5nX2ZpeGVkX3BvaW50IGJhY2tncm91bmRfZ2FtbWEpKQorI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQKKyMgIGRlZmluZSBQTkdfQkFDS0dST1VORF9HQU1NQV9VTktOT1dOIDAKKyMgIGRlZmluZSBQTkdfQkFDS0dST1VORF9HQU1NQV9TQ1JFRU4gIDEKKyMgIGRlZmluZSBQTkdfQkFDS0dST1VORF9HQU1NQV9GSUxFICAgIDIKKyMgIGRlZmluZSBQTkdfQkFDS0dST1VORF9HQU1NQV9VTklRVUUgIDMKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfU0NBTEVfMTZfVE9fOF9TVVBQT1JURUQKKy8qIFNjYWxlIGEgMTYtYml0IGRlcHRoIGZpbGUgZG93biB0byA4LWJpdCwgYWNjdXJhdGVseS4gKi8KK1BOR19FWFBPUlQoMjI5LCB2b2lkLCBwbmdfc2V0X3NjYWxlXzE2LCAocG5nX3N0cnVjdHJwIHBuZ19wdHIpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfU1RSSVBfMTZfVE9fOF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfMTZfVE9fOCBTVVBQT1JURUQgLyogTmFtZSBwcmlvciB0byAxLjUuNCAqLworLyogU3RyaXAgdGhlIHNlY29uZCBieXRlIG9mIGluZm9ybWF0aW9uIGZyb20gYSAxNi1iaXQgZGVwdGggZmlsZS4gKi8KK1BOR19FWFBPUlQoNDgsIHZvaWQsIHBuZ19zZXRfc3RyaXBfMTYsIChwbmdfc3RydWN0cnAgcG5nX3B0cikpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9RVUFOVElaRV9TVVBQT1JURUQKKy8qIFR1cm4gb24gcXVhbnRpemluZywgYW5kIHJlZHVjZSB0aGUgcGFsZXR0ZSB0byB0aGUgbnVtYmVyIG9mIGNvbG9ycworICogYXZhaWxhYmxlLgorICovCitQTkdfRVhQT1JUKDQ5LCB2b2lkLCBwbmdfc2V0X3F1YW50aXplLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbG9ycCBwYWxldHRlLCBpbnQgbnVtX3BhbGV0dGUsIGludCBtYXhpbXVtX2NvbG9ycywKKyAgICBwbmdfY29uc3RfdWludF8xNnAgaGlzdG9ncmFtLCBpbnQgZnVsbF9xdWFudGl6ZSkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKKy8qIFRoZSB0aHJlc2hvbGQgb24gZ2FtbWEgcHJvY2Vzc2luZyBpcyBjb25maWd1cmFibGUgYnV0IGhhcmQtd2lyZWQgaW50byB0aGUKKyAqIGxpYnJhcnkuICBUaGUgZm9sbG93aW5nIGlzIHRoZSBmbG9hdGluZyBwb2ludCB2YXJpYW50LgorICovCisjZGVmaW5lIFBOR19HQU1NQV9USFJFU0hPTEQgKFBOR19HQU1NQV9USFJFU0hPTERfRklYRUQqLjAwMDAxKQorCisvKiBIYW5kbGUgZ2FtbWEgY29ycmVjdGlvbi4gU2NyZWVuX2dhbW1hPShkaXNwbGF5X2V4cG9uZW50KS4KKyAqIE5PVEU6IHRoaXMgQVBJIHNpbXBseSBzZXRzIHRoZSBzY3JlZW4gYW5kIGZpbGUgZ2FtbWEgdmFsdWVzLiBJdCB3aWxsCisgKiB0aGVyZWZvcmUgb3ZlcnJpZGUgdGhlIHZhbHVlIGZvciBnYW1tYSBpbiBhIFBORyBmaWxlIGlmIGl0IGlzIGNhbGxlZCBhZnRlcgorICogdGhlIGZpbGUgaGVhZGVyIGhhcyBiZWVuIHJlYWQgLSB1c2Ugd2l0aCBjYXJlICAtIGNhbGwgYmVmb3JlIHJlYWRpbmcgdGhlIFBORworICogZmlsZSBmb3IgYmVzdCByZXN1bHRzIQorICoKKyAqIFRoZXNlIHJvdXRpbmVzIGFjY2VwdCB0aGUgc2FtZSBnYW1tYSB2YWx1ZXMgYXMgcG5nX3NldF9hbHBoYV9tb2RlIChkZXNjcmliZWQKKyAqIGFib3ZlKS4gIFRoZSBQTkdfR0FNTUFfIGRlZmluZXMgYW5kIFBOR19ERUZBVUxUX3NSR0IgY2FuIGJlIHBhc3NlZCB0byBlaXRoZXIKKyAqIEFQSSAoZmxvYXRpbmcgcG9pbnQgb3IgZml4ZWQuKSAgTm90aWNlLCBob3dldmVyLCB0aGF0IHRoZSAnZmlsZV9nYW1tYScgdmFsdWUKKyAqIGlzIHRoZSBpbnZlcnNlIG9mIGEgJ3NjcmVlbiBnYW1tYScgdmFsdWUuCisgKi8KK1BOR19GUF9FWFBPUlQoNTAsIHZvaWQsIHBuZ19zZXRfZ2FtbWEsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBkb3VibGUgc2NyZWVuX2dhbW1hLCBkb3VibGUgb3ZlcnJpZGVfZmlsZV9nYW1tYSkpCitQTkdfRklYRURfRVhQT1JUKDIwOCwgdm9pZCwgcG5nX3NldF9nYW1tYV9maXhlZCwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19maXhlZF9wb2ludCBzY3JlZW5fZ2FtbWEsIHBuZ19maXhlZF9wb2ludCBvdmVycmlkZV9maWxlX2dhbW1hKSkKKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRAorLyogU2V0IGhvdyBtYW55IGxpbmVzIGJldHdlZW4gb3V0cHV0IGZsdXNoZXMgLSAwIGZvciBubyBmbHVzaGluZyAqLworUE5HX0VYUE9SVCg1MSwgdm9pZCwgcG5nX3NldF9mbHVzaCwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgbnJvd3MpKTsKKy8qIEZsdXNoIHRoZSBjdXJyZW50IFBORyBvdXRwdXQgYnVmZmVyICovCitQTkdfRVhQT1JUKDUyLCB2b2lkLCBwbmdfd3JpdGVfZmx1c2gsIChwbmdfc3RydWN0cnAgcG5nX3B0cikpOworI2VuZGlmCisKKy8qIE9wdGlvbmFsIHVwZGF0ZSBwYWxldHRlIHdpdGggcmVxdWVzdGVkIHRyYW5zZm9ybWF0aW9ucyAqLworUE5HX0VYUE9SVCg1Mywgdm9pZCwgcG5nX3N0YXJ0X3JlYWRfaW1hZ2UsIChwbmdfc3RydWN0cnAgcG5nX3B0cikpOworCisvKiBPcHRpb25hbCBjYWxsIHRvIHVwZGF0ZSB0aGUgdXNlcnMgaW5mbyBzdHJ1Y3R1cmUgKi8KK1BOR19FWFBPUlQoNTQsIHZvaWQsIHBuZ19yZWFkX3VwZGF0ZV9pbmZvLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0cikpOworCisjaWZkZWYgUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQKKy8qIFJlYWQgb25lIG9yIG1vcmUgcm93cyBvZiBpbWFnZSBkYXRhLiAqLworUE5HX0VYUE9SVCg1NSwgdm9pZCwgcG5nX3JlYWRfcm93cywgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfYnl0ZXBwIHJvdywKKyAgICBwbmdfYnl0ZXBwIGRpc3BsYXlfcm93LCBwbmdfdWludF8zMiBudW1fcm93cykpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRAorLyogUmVhZCBhIHJvdyBvZiBkYXRhLiAqLworUE5HX0VYUE9SVCg1Niwgdm9pZCwgcG5nX3JlYWRfcm93LCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19ieXRlcCByb3csCisgICAgcG5nX2J5dGVwIGRpc3BsYXlfcm93KSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVECisvKiBSZWFkIHRoZSB3aG9sZSBpbWFnZSBpbnRvIG1lbW9yeSBhdCBvbmNlLiAqLworUE5HX0VYUE9SVCg1Nywgdm9pZCwgcG5nX3JlYWRfaW1hZ2UsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2J5dGVwcCBpbWFnZSkpOworI2VuZGlmCisKKy8qIFdyaXRlIGEgcm93IG9mIGltYWdlIGRhdGEgKi8KK1BOR19FWFBPUlQoNTgsIHZvaWQsIHBuZ193cml0ZV9yb3csIChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfYnl0ZXAgcm93KSk7CisKKy8qIFdyaXRlIGEgZmV3IHJvd3Mgb2YgaW1hZ2UgZGF0YTogKCpyb3cpIGlzIG5vdCB3cml0dGVuOyBob3dldmVyLCB0aGUgdHlwZQorICogaXMgZGVjbGFyZWQgYXMgd3JpdGVhYmxlIHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCBwcmV2aW91cyB2ZXJzaW9ucworICogb2YgbGlicG5nIGFuZCB0byBhbGxvdyB0aGUgJ2Rpc3BsYXlfcm93JyBhcnJheSBmcm9tIHJlYWRfcm93cyB0byBiZSBwYXNzZWQKKyAqIHVuY2hhbmdlZCB0byB3cml0ZV9yb3dzLgorICovCitQTkdfRVhQT1JUKDU5LCB2b2lkLCBwbmdfd3JpdGVfcm93cywgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfYnl0ZXBwIHJvdywKKyAgICBwbmdfdWludF8zMiBudW1fcm93cykpOworCisvKiBXcml0ZSB0aGUgaW1hZ2UgZGF0YSAqLworUE5HX0VYUE9SVCg2MCwgdm9pZCwgcG5nX3dyaXRlX2ltYWdlLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19ieXRlcHAgaW1hZ2UpKTsKKworLyogV3JpdGUgdGhlIGVuZCBvZiB0aGUgUE5HIGZpbGUuICovCitQTkdfRVhQT1JUKDYxLCB2b2lkLCBwbmdfd3JpdGVfZW5kLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0cikpOworCisjaWZkZWYgUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQKKy8qIFJlYWQgdGhlIGVuZCBvZiB0aGUgUE5HIGZpbGUuICovCitQTkdfRVhQT1JUKDYyLCB2b2lkLCBwbmdfcmVhZF9lbmQsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0cikpOworI2VuZGlmCisKKy8qIEZyZWUgYW55IG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIHBuZ19pbmZvX3N0cnVjdCAqLworUE5HX0VYUE9SVCg2Mywgdm9pZCwgcG5nX2Rlc3Ryb3lfaW5mb19zdHJ1Y3QsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3BwIGluZm9fcHRyX3B0cikpOworCisvKiBGcmVlIGFueSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwbmdfc3RydWN0IGFuZCB0aGUgcG5nX2luZm9fc3RydWN0cyAqLworUE5HX0VYUE9SVCg2NCwgdm9pZCwgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QsIChwbmdfc3RydWN0cHAgcG5nX3B0cl9wdHIsCisgICAgcG5nX2luZm9wcCBpbmZvX3B0cl9wdHIsIHBuZ19pbmZvcHAgZW5kX2luZm9fcHRyX3B0cikpOworCisvKiBGcmVlIGFueSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwbmdfc3RydWN0IGFuZCB0aGUgcG5nX2luZm9fc3RydWN0cyAqLworUE5HX0VYUE9SVCg2NSwgdm9pZCwgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0LCAocG5nX3N0cnVjdHBwIHBuZ19wdHJfcHRyLAorICAgIHBuZ19pbmZvcHAgaW5mb19wdHJfcHRyKSk7CisKKy8qIFNldCB0aGUgbGlicG5nIG1ldGhvZCBvZiBoYW5kbGluZyBjaHVuayBDUkMgZXJyb3JzICovCitQTkdfRVhQT1JUKDY2LCB2b2lkLCBwbmdfc2V0X2NyY19hY3Rpb24sIChwbmdfc3RydWN0cnAgcG5nX3B0ciwgaW50IGNyaXRfYWN0aW9uLAorICAgIGludCBhbmNpbF9hY3Rpb24pKTsKKworLyogVmFsdWVzIGZvciBwbmdfc2V0X2NyY19hY3Rpb24oKSBzYXkgaG93IHRvIGhhbmRsZSBDUkMgZXJyb3JzIGluCisgKiBhbmNpbGxhcnkgYW5kIGNyaXRpY2FsIGNodW5rcywgYW5kIHdoZXRoZXIgdG8gdXNlIHRoZSBkYXRhIGNvbnRhaW5lZAorICogdGhlcmVpbi4gIE5vdGUgdGhhdCBpdCBpcyBpbXBvc3NpYmxlIHRvICJkaXNjYXJkIiBkYXRhIGluIGEgY3JpdGljYWwKKyAqIGNodW5rLiAgRm9yIHZlcnNpb25zIHByaW9yIHRvIDAuOTAsIHRoZSBhY3Rpb24gd2FzIGFsd2F5cyBlcnJvci9xdWl0LAorICogd2hlcmVhcyBpbiB2ZXJzaW9uIDAuOTAgYW5kIGxhdGVyLCB0aGUgYWN0aW9uIGZvciBDUkMgZXJyb3JzIGluIGFuY2lsbGFyeQorICogY2h1bmtzIGlzIHdhcm4vZGlzY2FyZC4gIFRoZXNlIHZhbHVlcyBzaG91bGQgTk9UIGJlIGNoYW5nZWQuCisgKgorICogICAgICB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOmNyaXRpY2FsICAgICBhY3Rpb246YW5jaWxsYXJ5CisgKi8KKyNkZWZpbmUgUE5HX0NSQ19ERUZBVUxUICAgICAgIDAgIC8qIGVycm9yL3F1aXQgICAgICAgICAgd2Fybi9kaXNjYXJkIGRhdGEgKi8KKyNkZWZpbmUgUE5HX0NSQ19FUlJPUl9RVUlUICAgIDEgIC8qIGVycm9yL3F1aXQgICAgICAgICAgZXJyb3IvcXVpdCAgICAgICAgKi8KKyNkZWZpbmUgUE5HX0NSQ19XQVJOX0RJU0NBUkQgIDIgIC8qIChJTlZBTElEKSAgICAgICAgICAgd2Fybi9kaXNjYXJkIGRhdGEgKi8KKyNkZWZpbmUgUE5HX0NSQ19XQVJOX1VTRSAgICAgIDMgIC8qIHdhcm4vdXNlIGRhdGEgICAgICAgd2Fybi91c2UgZGF0YSAgICAgKi8KKyNkZWZpbmUgUE5HX0NSQ19RVUlFVF9VU0UgICAgIDQgIC8qIHF1aWV0L3VzZSBkYXRhICAgICAgcXVpZXQvdXNlIGRhdGEgICAgKi8KKyNkZWZpbmUgUE5HX0NSQ19OT19DSEFOR0UgICAgIDUgIC8qIHVzZSBjdXJyZW50IHZhbHVlICAgdXNlIGN1cnJlbnQgdmFsdWUgKi8KKworI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKKy8qIFRoZXNlIGZ1bmN0aW9ucyBnaXZlIHRoZSB1c2VyIGNvbnRyb2wgb3ZlciB0aGUgc2Nhbi1saW5lIGZpbHRlcmluZyBpbgorICogbGlicG5nIGFuZCB0aGUgY29tcHJlc3Npb24gbWV0aG9kcyB1c2VkIGJ5IHpsaWIuICBUaGVzZSBmdW5jdGlvbnMgYXJlCisgKiBtYWlubHkgdXNlZnVsIGZvciB0ZXN0aW5nLCBhcyB0aGUgZGVmYXVsdHMgc2hvdWxkIHdvcmsgd2l0aCBtb3N0IHVzZXJzLgorICogVGhvc2UgdXNlcnMgd2hvIGFyZSB0aWdodCBvbiBtZW1vcnkgb3Igd2FudCBmYXN0ZXIgcGVyZm9ybWFuY2UgYXQgdGhlCisgKiBleHBlbnNlIG9mIGNvbXByZXNzaW9uIGNhbiBtb2RpZnkgdGhlbS4gIFNlZSB0aGUgY29tcHJlc3Npb24gbGlicmFyeQorICogaGVhZGVyIGZpbGUgKHpsaWIuaCkgZm9yIGFuIGV4cGxpbmF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBmdW5jdGlvbnMuCisgKi8KKworLyogU2V0IHRoZSBmaWx0ZXJpbmcgbWV0aG9kKHMpIHVzZWQgYnkgbGlicG5nLiAgQ3VycmVudGx5LCB0aGUgb25seSB2YWxpZAorICogdmFsdWUgZm9yICJtZXRob2QiIGlzIDAuCisgKi8KK1BOR19FWFBPUlQoNjcsIHZvaWQsIHBuZ19zZXRfZmlsdGVyLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBtZXRob2QsCisgICAgaW50IGZpbHRlcnMpKTsKKyNlbmRpZiAvKiBXUklURSAqLworCisvKiBGbGFncyBmb3IgcG5nX3NldF9maWx0ZXIoKSB0byBzYXkgd2hpY2ggZmlsdGVycyB0byB1c2UuICBUaGUgZmxhZ3MKKyAqIGFyZSBjaG9zZW4gc28gdGhhdCB0aGV5IGRvbid0IGNvbmZsaWN0IHdpdGggcmVhbCBmaWx0ZXIgdHlwZXMKKyAqIGJlbG93LCBpbiBjYXNlIHRoZXkgYXJlIHN1cHBsaWVkIGluc3RlYWQgb2YgdGhlICNkZWZpbmVkIGNvbnN0YW50cy4KKyAqIFRoZXNlIHZhbHVlcyBzaG91bGQgTk9UIGJlIGNoYW5nZWQuCisgKi8KKyNkZWZpbmUgUE5HX05PX0ZJTFRFUlMgICAgIDB4MDAKKyNkZWZpbmUgUE5HX0ZJTFRFUl9OT05FICAgIDB4MDgKKyNkZWZpbmUgUE5HX0ZJTFRFUl9TVUIgICAgIDB4MTAKKyNkZWZpbmUgUE5HX0ZJTFRFUl9VUCAgICAgIDB4MjAKKyNkZWZpbmUgUE5HX0ZJTFRFUl9BVkcgICAgIDB4NDAKKyNkZWZpbmUgUE5HX0ZJTFRFUl9QQUVUSCAgIDB4ODAKKyNkZWZpbmUgUE5HX0FMTF9GSUxURVJTIChQTkdfRklMVEVSX05PTkUgfCBQTkdfRklMVEVSX1NVQiB8IFBOR19GSUxURVJfVVAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0ZJTFRFUl9BVkcgfCBQTkdfRklMVEVSX1BBRVRIKQorCisvKiBGaWx0ZXIgdmFsdWVzIChub3QgZmxhZ3MpIC0gdXNlZCBpbiBwbmd3cml0ZS5jLCBwbmd3dXRpbC5jIGZvciBub3cuCisgKiBUaGVzZSBkZWZpbmVzIHNob3VsZCBOT1QgYmUgY2hhbmdlZC4KKyAqLworI2RlZmluZSBQTkdfRklMVEVSX1ZBTFVFX05PTkUgIDAKKyNkZWZpbmUgUE5HX0ZJTFRFUl9WQUxVRV9TVUIgICAxCisjZGVmaW5lIFBOR19GSUxURVJfVkFMVUVfVVAgICAgMgorI2RlZmluZSBQTkdfRklMVEVSX1ZBTFVFX0FWRyAgIDMKKyNkZWZpbmUgUE5HX0ZJTFRFUl9WQUxVRV9QQUVUSCA0CisjZGVmaW5lIFBOR19GSUxURVJfVkFMVUVfTEFTVCAgNQorCisjaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAorI2lmZGVmIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVEIC8qIERFUFJFQ0FURUQgKi8KK1BOR19GUF9FWFBPUlQoNjgsIHZvaWQsIHBuZ19zZXRfZmlsdGVyX2hldXJpc3RpY3MsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBpbnQgaGV1cmlzdGljX21ldGhvZCwgaW50IG51bV93ZWlnaHRzLCBwbmdfY29uc3RfZG91YmxlcCBmaWx0ZXJfd2VpZ2h0cywKKyAgICBwbmdfY29uc3RfZG91YmxlcCBmaWx0ZXJfY29zdHMpKQorUE5HX0ZJWEVEX0VYUE9SVCgyMDksIHZvaWQsIHBuZ19zZXRfZmlsdGVyX2hldXJpc3RpY3NfZml4ZWQsCisgICAgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgaGV1cmlzdGljX21ldGhvZCwgaW50IG51bV93ZWlnaHRzLAorICAgIHBuZ19jb25zdF9maXhlZF9wb2ludF9wIGZpbHRlcl93ZWlnaHRzLAorICAgIHBuZ19jb25zdF9maXhlZF9wb2ludF9wIGZpbHRlcl9jb3N0cykpCisjZW5kaWYgLyogV1JJVEVfV0VJR0hURURfRklMVEVSICovCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIG5vIGxvbmdlciB1c2VkIGFuZCB3aWxsIGJlIHJlbW92ZWQgZnJvbSBsaWJwbmctMS43OiAqLworI2RlZmluZSBQTkdfRklMVEVSX0hFVVJJU1RJQ19ERUZBVUxUICAgIDAgIC8qIEN1cnJlbnRseSAiVU5XRUlHSFRFRCIgKi8KKyNkZWZpbmUgUE5HX0ZJTFRFUl9IRVVSSVNUSUNfVU5XRUlHSFRFRCAxICAvKiBVc2VkIGJ5IGxpYnBuZyA8IDAuOTUgKi8KKyNkZWZpbmUgUE5HX0ZJTFRFUl9IRVVSSVNUSUNfV0VJR0hURUQgICAyICAvKiBFeHBlcmltZW50YWwgZmVhdHVyZSAqLworI2RlZmluZSBQTkdfRklMVEVSX0hFVVJJU1RJQ19MQVNUICAgICAgIDMgIC8qIE5vdCBhIHZhbGlkIHZhbHVlICovCisKKy8qIFNldCB0aGUgbGlicmFyeSBjb21wcmVzc2lvbiBsZXZlbC4gIEN1cnJlbnRseSwgdmFsaWQgdmFsdWVzIHJhbmdlIGZyb20KKyAqIDAgLSA5LCBjb3JyZXNwb25kaW5nIGRpcmVjdGx5IHRvIHRoZSB6bGliIGNvbXByZXNzaW9uIGxldmVscyAwIC0gOQorICogKDAgLSBubyBjb21wcmVzc2lvbiwgOSAtICJtYXhpbWFsIiBjb21wcmVzc2lvbikuICBOb3RlIHRoYXQgdGVzdHMgaGF2ZQorICogc2hvd24gdGhhdCB6bGliIGNvbXByZXNzaW9uIGxldmVscyAzLTYgdXN1YWxseSBwZXJmb3JtIGFzIHdlbGwgYXMgbGV2ZWwgOQorICogZm9yIFBORyBpbWFnZXMsIGFuZCBkbyBjb25zaWRlcmFibHkgZmV3ZXIgY2FjbHVsYXRpb25zLiAgSW4gdGhlIGZ1dHVyZSwKKyAqIHRoZXNlIHZhbHVlcyBtYXkgbm90IGNvcnJlc3BvbmQgZGlyZWN0bHkgdG8gdGhlIHpsaWIgY29tcHJlc3Npb24gbGV2ZWxzLgorICovCisjaWZkZWYgUE5HX1dSSVRFX0NVU1RPTUlaRV9DT01QUkVTU0lPTl9TVVBQT1JURUQKK1BOR19FWFBPUlQoNjksIHZvaWQsIHBuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBpbnQgbGV2ZWwpKTsKKworUE5HX0VYUE9SVCg3MCwgdm9pZCwgcG5nX3NldF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBpbnQgbWVtX2xldmVsKSk7CisKK1BOR19FWFBPUlQoNzEsIHZvaWQsIHBuZ19zZXRfY29tcHJlc3Npb25fc3RyYXRlZ3ksIChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBpbnQgc3RyYXRlZ3kpKTsKKworLyogSWYgUE5HX1dSSVRFX09QVElNSVpFX0NNRl9TVVBQT1JURUQgaXMgZGVmaW5lZCwgbGlicG5nIHdpbGwgdXNlIGEKKyAqIHNtYWxsZXIgdmFsdWUgb2Ygd2luZG93X2JpdHMgaWYgaXQgY2FuIGRvIHNvIHNhZmVseS4KKyAqLworUE5HX0VYUE9SVCg3Miwgdm9pZCwgcG5nX3NldF9jb21wcmVzc2lvbl93aW5kb3dfYml0cywgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIGludCB3aW5kb3dfYml0cykpOworCitQTkdfRVhQT1JUKDczLCB2b2lkLCBwbmdfc2V0X2NvbXByZXNzaW9uX21ldGhvZCwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIGludCBtZXRob2QpKTsKKyNlbmRpZiAvKiBXUklURV9DVVNUT01JWkVfQ09NUFJFU1NJT04gKi8KKworI2lmZGVmIFBOR19XUklURV9DVVNUT01JWkVfWlRYVF9DT01QUkVTU0lPTl9TVVBQT1JURUQKKy8qIEFsc28gc2V0IHpsaWIgcGFyYW1ldGVycyBmb3IgY29tcHJlc3Npbmcgbm9uLUlEQVQgY2h1bmtzICovCitQTkdfRVhQT1JUKDIyMiwgdm9pZCwgcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX2xldmVsLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgaW50IGxldmVsKSk7CisKK1BOR19FWFBPUlQoMjIzLCB2b2lkLCBwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fbWVtX2xldmVsLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgaW50IG1lbV9sZXZlbCkpOworCitQTkdfRVhQT1JUKDIyNCwgdm9pZCwgcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX3N0cmF0ZWd5LCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgaW50IHN0cmF0ZWd5KSk7CisKKy8qIElmIFBOR19XUklURV9PUFRJTUlaRV9DTUZfU1VQUE9SVEVEIGlzIGRlZmluZWQsIGxpYnBuZyB3aWxsIHVzZSBhCisgKiBzbWFsbGVyIHZhbHVlIG9mIHdpbmRvd19iaXRzIGlmIGl0IGNhbiBkbyBzbyBzYWZlbHkuCisgKi8KK1BOR19FWFBPUlQoMjI1LCB2b2lkLCBwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fd2luZG93X2JpdHMsCisgICAgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgd2luZG93X2JpdHMpKTsKKworUE5HX0VYUE9SVCgyMjYsIHZvaWQsIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9tZXRob2QsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBpbnQgbWV0aG9kKSk7CisjZW5kaWYgLyogV1JJVEVfQ1VTVE9NSVpFX1pUWFRfQ09NUFJFU1NJT04gKi8KKyNlbmRpZiAvKiBXUklURSAqLworCisvKiBUaGVzZSBuZXh0IGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGZvciBpbnB1dC9vdXRwdXQsIG1lbW9yeSwgYW5kIGVycm9yCisgKiBoYW5kbGluZy4gIFRoZXkgYXJlIGluIHRoZSBmaWxlIHBuZ3Jpby5jLCBwbmd3aW8uYywgYW5kIHBuZ2Vycm9yLmMsCisgKiBhbmQgY2FsbCBzdGFuZGFyZCBDIEkvTyByb3V0aW5lcyBzdWNoIGFzIGZyZWFkKCksIGZ3cml0ZSgpLCBhbmQKKyAqIGZwcmludGYoKS4gIFRoZXNlIGZ1bmN0aW9ucyBjYW4gYmUgbWFkZSB0byB1c2Ugb3RoZXIgSS9PIHJvdXRpbmVzCisgKiBhdCBydW4gdGltZSBmb3IgdGhvc2UgYXBwbGljYXRpb25zIHRoYXQgbmVlZCB0byBoYW5kbGUgSS9PIGluIGEKKyAqIGRpZmZlcmVudCBtYW5uZXIgYnkgY2FsbGluZyBwbmdfc2V0Xz8/P19mbigpLiAgU2VlIGxpYnBuZy1tYW51YWwudHh0IGZvcgorICogbW9yZSBpbmZvcm1hdGlvbi4KKyAqLworCisjaWZkZWYgUE5HX1NURElPX1NVUFBPUlRFRAorLyogSW5pdGlhbGl6ZSB0aGUgaW5wdXQvb3V0cHV0IGZvciB0aGUgUE5HIGZpbGUgdG8gdGhlIGRlZmF1bHQgZnVuY3Rpb25zLiAqLworUE5HX0VYUE9SVCg3NCwgdm9pZCwgcG5nX2luaXRfaW8sIChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX0ZJTEVfcCBmcCkpOworI2VuZGlmCisKKy8qIFJlcGxhY2UgdGhlIChlcnJvciBhbmQgYWJvcnQpLCBhbmQgd2FybmluZyBmdW5jdGlvbnMgd2l0aCB1c2VyCisgKiBzdXBwbGllZCBmdW5jdGlvbnMuICBJZiBubyBtZXNzYWdlcyBhcmUgdG8gYmUgcHJpbnRlZCB5b3UgbXVzdCBzdGlsbAorICogd3JpdGUgYW5kIHVzZSByZXBsYWNlbWVudCBmdW5jdGlvbnMuIFRoZSByZXBsYWNlbWVudCBlcnJvcl9mbiBzaG91bGQKKyAqIHN0aWxsIGRvIGEgbG9uZ2ptcCB0byB0aGUgbGFzdCBzZXRqbXAgbG9jYXRpb24gaWYgeW91IGFyZSB1c2luZyB0aGlzCisgKiBtZXRob2Qgb2YgZXJyb3IgaGFuZGxpbmcuICBJZiBlcnJvcl9mbiBvciB3YXJuaW5nX2ZuIGlzIE5VTEwsIHRoZQorICogZGVmYXVsdCBmdW5jdGlvbiB3aWxsIGJlIHVzZWQuCisgKi8KKworUE5HX0VYUE9SVCg3NSwgdm9pZCwgcG5nX3NldF9lcnJvcl9mbiwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ192b2lkcCBlcnJvcl9wdHIsIHBuZ19lcnJvcl9wdHIgZXJyb3JfZm4sIHBuZ19lcnJvcl9wdHIgd2FybmluZ19mbikpOworCisvKiBSZXR1cm4gdGhlIHVzZXIgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9yIGZ1bmN0aW9ucyAqLworUE5HX0VYUE9SVCg3NiwgcG5nX3ZvaWRwLCBwbmdfZ2V0X2Vycm9yX3B0ciwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyKSk7CisKKy8qIFJlcGxhY2UgdGhlIGRlZmF1bHQgZGF0YSBvdXRwdXQgZnVuY3Rpb25zIHdpdGggYSB1c2VyIHN1cHBsaWVkIG9uZShzKS4KKyAqIElmIGJ1ZmZlcmVkIG91dHB1dCBpcyBub3QgdXNlZCwgdGhlbiBvdXRwdXRfZmx1c2hfZm4gY2FuIGJlIHNldCB0byBOVUxMLgorICogSWYgUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRCBpcyBub3QgZGVmaW5lZCBhdCBsaWJwbmcgY29tcGlsZSB0aW1lCisgKiBvdXRwdXRfZmx1c2hfZm4gd2lsbCBiZSBpZ25vcmVkIChhbmQgdGh1cyBjYW4gYmUgTlVMTCkuCisgKiBJdCBpcyBwcm9iYWJseSBhIG1pc3Rha2UgdG8gdXNlIE5VTEwgZm9yIG91dHB1dF9mbHVzaF9mbiBpZgorICogd3JpdGVfZGF0YV9mbiBpcyBub3QgYWxzbyBOVUxMIHVubGVzcyB5b3UgaGF2ZSBidWlsdCBsaWJwbmcgd2l0aAorICogUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRCB1bmRlZmluZWQsIGJlY2F1c2UgaW4gdGhpcyBjYXNlIGxpYnBuZydzCisgKiBkZWZhdWx0IGZsdXNoIGZ1bmN0aW9uLCB3aGljaCB1c2VzIHRoZSBzdGFuZGFyZCAqRklMRSBzdHJ1Y3R1cmUsIHdpbGwKKyAqIGJlIHVzZWQuCisgKi8KK1BOR19FWFBPUlQoNzcsIHZvaWQsIHBuZ19zZXRfd3JpdGVfZm4sIChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3ZvaWRwIGlvX3B0ciwKKyAgICBwbmdfcndfcHRyIHdyaXRlX2RhdGFfZm4sIHBuZ19mbHVzaF9wdHIgb3V0cHV0X2ZsdXNoX2ZuKSk7CisKKy8qIFJlcGxhY2UgdGhlIGRlZmF1bHQgZGF0YSBpbnB1dCBmdW5jdGlvbiB3aXRoIGEgdXNlciBzdXBwbGllZCBvbmUuICovCitQTkdfRVhQT1JUKDc4LCB2b2lkLCBwbmdfc2V0X3JlYWRfZm4sIChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3ZvaWRwIGlvX3B0ciwKKyAgICBwbmdfcndfcHRyIHJlYWRfZGF0YV9mbikpOworCisvKiBSZXR1cm4gdGhlIHVzZXIgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggdGhlIEkvTyBmdW5jdGlvbnMgKi8KK1BOR19FWFBPUlQoNzksIHBuZ192b2lkcCwgcG5nX2dldF9pb19wdHIsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikpOworCitQTkdfRVhQT1JUKDgwLCB2b2lkLCBwbmdfc2V0X3JlYWRfc3RhdHVzX2ZuLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX3JlYWRfc3RhdHVzX3B0ciByZWFkX3Jvd19mbikpOworCitQTkdfRVhQT1JUKDgxLCB2b2lkLCBwbmdfc2V0X3dyaXRlX3N0YXR1c19mbiwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ193cml0ZV9zdGF0dXNfcHRyIHdyaXRlX3Jvd19mbikpOworCisjaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAorLyogUmVwbGFjZSB0aGUgZGVmYXVsdCBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMgd2l0aCB1c2VyIHN1cHBsaWVkIG9uZShzKS4gKi8KK1BOR19FWFBPUlQoODIsIHZvaWQsIHBuZ19zZXRfbWVtX2ZuLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ192b2lkcCBtZW1fcHRyLAorICAgIHBuZ19tYWxsb2NfcHRyIG1hbGxvY19mbiwgcG5nX2ZyZWVfcHRyIGZyZWVfZm4pKTsKKy8qIFJldHVybiB0aGUgdXNlciBwb2ludGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVtb3J5IGZ1bmN0aW9ucyAqLworUE5HX0VYUE9SVCg4MywgcG5nX3ZvaWRwLCBwbmdfZ2V0X21lbV9wdHIsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQKK1BOR19FWFBPUlQoODQsIHZvaWQsIHBuZ19zZXRfcmVhZF91c2VyX3RyYW5zZm9ybV9mbiwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ191c2VyX3RyYW5zZm9ybV9wdHIgcmVhZF91c2VyX3RyYW5zZm9ybV9mbikpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVECitQTkdfRVhQT1JUKDg1LCB2b2lkLCBwbmdfc2V0X3dyaXRlX3VzZXJfdHJhbnNmb3JtX2ZuLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX3VzZXJfdHJhbnNmb3JtX3B0ciB3cml0ZV91c2VyX3RyYW5zZm9ybV9mbikpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfVVNFUl9UUkFOU0ZPUk1fUFRSX1NVUFBPUlRFRAorUE5HX0VYUE9SVCg4Niwgdm9pZCwgcG5nX3NldF91c2VyX3RyYW5zZm9ybV9pbmZvLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX3ZvaWRwIHVzZXJfdHJhbnNmb3JtX3B0ciwgaW50IHVzZXJfdHJhbnNmb3JtX2RlcHRoLAorICAgIGludCB1c2VyX3RyYW5zZm9ybV9jaGFubmVscykpOworLyogUmV0dXJuIHRoZSB1c2VyIHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIHRyYW5zZm9ybSBmdW5jdGlvbnMgKi8KK1BOR19FWFBPUlQoODcsIHBuZ192b2lkcCwgcG5nX2dldF91c2VyX3RyYW5zZm9ybV9wdHIsCisgICAgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19VU0VSX1RSQU5TRk9STV9JTkZPX1NVUFBPUlRFRAorLyogUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSByb3cgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4gIE5vdGUgdGhhdCB0aGVzZQorICogQVBJcyBkbyBub3QgZmFpbCBidXQgd2lsbCByZXR1cm4gdW5leHBlY3RlZCByZXN1bHRzIGlmIGNhbGxlZCBvdXRzaWRlIGEgdXNlcgorICogdHJhbnNmb3JtIGNhbGxiYWNrLiAgQWxzbyBub3RlIHRoYXQgd2hlbiB0cmFuc2Zvcm1pbmcgYW4gaW50ZXJsYWNlZCBpbWFnZSB0aGUKKyAqIHJvdyBudW1iZXIgaXMgdGhlIHJvdyBudW1iZXIgd2l0aGluIHRoZSBzdWItaW1hZ2Ugb2YgdGhlIGludGVybGFjZSBwYXNzLCBzbworICogdGhlIHZhbHVlIHdpbGwgaW5jcmVhc2UgdG8gdGhlIGhlaWdodCBvZiB0aGUgc3ViLWltYWdlIChub3QgdGhlIGZ1bGwgaW1hZ2UpCisgKiB0aGVuIHJlc2V0IHRvIDAgZm9yIHRoZSBuZXh0IHBhc3MuCisgKgorICogVXNlIFBOR19ST1dfRlJPTV9QQVNTX1JPVyhyb3csIHBhc3MpIGFuZCBQTkdfQ09MX0ZST01fUEFTU19DT0woY29sLCBwYXNzKSB0bworICogZmluZCB0aGUgb3V0cHV0IHBpeGVsICh4LHkpIGdpdmVuIGFuIGludGVybGFjZWQgc3ViLWltYWdlIHBpeGVsCisgKiAocm93LGNvbCxwYXNzKS4gIChTZWUgYmVsb3cgZm9yIHRoZXNlIG1hY3Jvcy4pCisgKi8KK1BOR19FWFBPUlQoMjE3LCBwbmdfdWludF8zMiwgcG5nX2dldF9jdXJyZW50X3Jvd19udW1iZXIsIChwbmdfY29uc3Rfc3RydWN0cnApKTsKK1BOR19FWFBPUlQoMjE4LCBwbmdfYnl0ZSwgcG5nX2dldF9jdXJyZW50X3Bhc3NfbnVtYmVyLCAocG5nX2NvbnN0X3N0cnVjdHJwKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX1VTRVJfQ0hVTktTX1NVUFBPUlRFRAorLyogVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgb25seSBmb3IgKnVua25vd24qIGNodW5rcy4gIElmCisgKiBQTkdfSEFORExFX0FTX1VOS05PV05fU1VQUE9SVEVEIGlzIHNldCB0aGVuIGl0IGlzIHBvc3NpYmxlIHRvIHNldCBrbm93bgorICogY2h1bmtzIHRvIGJlIHRyZWF0ZWQgYXMgdW5rbm93biwgaG93ZXZlciBpbiB0aGlzIGNhc2UgdGhlIGNhbGxiYWNrIG11c3QgZG8KKyAqIGFueSBwcm9jZXNzaW5nIHJlcXVpcmVkIGJ5IHRoZSBjaHVuayAoZS5nLiBieSBjYWxsaW5nIHRoZSBhcHByb3ByaWF0ZQorICogcG5nX3NldF8gQVBJcy4pCisgKgorICogVGhlcmUgaXMgbm8gd3JpdGUgc3VwcG9ydCAtIG9uIHdyaXRlLCBieSBkZWZhdWx0LCBhbGwgdGhlIGNodW5rcyBpbiB0aGUKKyAqICd1bmtub3duJyBsaXN0IGFyZSB3cml0dGVuIGluIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uCisgKgorICogVGhlIGludGVnZXIgcmV0dXJuIGZyb20gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGludGVycHJldGVkIHRodXM6CisgKgorICogbmVnYXRpdmU6IEFuIGVycm9yIG9jY3VycmVkOyBwbmdfY2h1bmtfZXJyb3Igd2lsbCBiZSBjYWxsZWQuCisgKiAgICAgemVybzogVGhlIGNodW5rIHdhcyBub3QgaGFuZGxlZCwgdGhlIGNodW5rIHdpbGwgYmUgc2F2ZWQuIEEgY3JpdGljYWwKKyAqICAgICAgICAgICBjaHVuayB3aWxsIGNhdXNlIGFuIGVycm9yIGF0IHRoaXMgcG9pbnQgdW5sZXNzIGl0IGlzIHRvIGJlIHNhdmVkLgorICogcG9zaXRpdmU6IFRoZSBjaHVuayB3YXMgaGFuZGxlZCwgbGlicG5nIHdpbGwgaWdub3JlL2Rpc2NhcmQgaXQuCisgKgorICogU2VlICJJTlRFUkFDVElPTiBXVElIIFVTRVIgQ0hVTksgQ0FMTEJBQ0tTIiBiZWxvdyBmb3IgaW1wb3J0YW50IG5vdGVzIGFib3V0CisgKiBob3cgdGhpcyBiZWhhdmlvciB3aWxsIGNoYW5nZSBpbiBsaWJwbmcgMS43CisgKi8KK1BOR19FWFBPUlQoODgsIHZvaWQsIHBuZ19zZXRfcmVhZF91c2VyX2NodW5rX2ZuLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX3ZvaWRwIHVzZXJfY2h1bmtfcHRyLCBwbmdfdXNlcl9jaHVua19wdHIgcmVhZF91c2VyX2NodW5rX2ZuKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19VU0VSX0NIVU5LU19TVVBQT1JURUQKK1BOR19FWFBPUlQoODksIHBuZ192b2lkcCwgcG5nX2dldF91c2VyX2NodW5rX3B0ciwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRAorLyogU2V0cyB0aGUgZnVuY3Rpb24gY2FsbGJhY2tzIGZvciB0aGUgcHVzaCByZWFkZXIsIGFuZCBhIHBvaW50ZXIgdG8gYQorICogdXNlci1kZWZpbmVkIHN0cnVjdHVyZSBhdmFpbGFibGUgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucy4KKyAqLworUE5HX0VYUE9SVCg5MCwgdm9pZCwgcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX3ZvaWRwIHByb2dyZXNzaXZlX3B0ciwgcG5nX3Byb2dyZXNzaXZlX2luZm9fcHRyIGluZm9fZm4sCisgICAgcG5nX3Byb2dyZXNzaXZlX3Jvd19wdHIgcm93X2ZuLCBwbmdfcHJvZ3Jlc3NpdmVfZW5kX3B0ciBlbmRfZm4pKTsKKworLyogUmV0dXJucyB0aGUgdXNlciBwb2ludGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHVzaCByZWFkIGZ1bmN0aW9ucyAqLworUE5HX0VYUE9SVCg5MSwgcG5nX3ZvaWRwLCBwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0ciwKKyAgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpKTsKKworLyogRnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gZGF0YSBiZWNvbWVzIGF2YWlsYWJsZSAqLworUE5HX0VYUE9SVCg5Miwgdm9pZCwgcG5nX3Byb2Nlc3NfZGF0YSwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ19ieXRlcCBidWZmZXIsIHBuZ19zaXplX3QgYnVmZmVyX3NpemUpKTsKKworLyogQSBmdW5jdGlvbiB3aGljaCBtYXkgYmUgY2FsbGVkICpvbmx5KiB3aXRoaW4gcG5nX3Byb2Nlc3NfZGF0YSB0byBzdG9wIHRoZQorICogcHJvY2Vzc2luZyBvZiBhbnkgbW9yZSBkYXRhLiAgVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcworICogcmVtYWluaW5nLCBleGNsdWRpbmcgYW55IHRoYXQgbGlicG5nIGhhcyBjYWNoZWQgaW50ZXJuYWxseS4gIEEgc3Vic2VxdWVudAorICogY2FsbCB0byBwbmdfcHJvY2Vzc19kYXRhIG11c3Qgc3VwcGx5IHRoZXNlIGJ5dGVzIGFnYWluLiAgSWYgdGhlIGFyZ3VtZW50CisgKiAnc2F2ZScgaXMgc2V0IHRvIHRydWUgdGhlIHJvdXRpbmUgd2lsbCBmaXJzdCBzYXZlIGFsbCB0aGUgcGVuZGluZyBkYXRhIGFuZAorICogd2lsbCBhbHdheXMgcmV0dXJuIDAuCisgKi8KK1BOR19FWFBPUlQoMjE5LCBwbmdfc2l6ZV90LCBwbmdfcHJvY2Vzc19kYXRhX3BhdXNlLCAocG5nX3N0cnVjdHJwLCBpbnQgc2F2ZSkpOworCisvKiBBIGZ1bmN0aW9uIHdoaWNoIG1heSBiZSBjYWxsZWQgKm9ubHkqIG91dHNpZGUgKGFmdGVyKSBhIGNhbGwgdG8KKyAqIHBuZ19wcm9jZXNzX2RhdGEuICBJdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSB0byBza2lwIGluIHRoZQorICogaW5wdXQuICBOb3JtYWxseSBpdCB3aWxsIHJldHVybiAwLCBidXQgaWYgaXQgcmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlIHRoZQorICogYXBwbGljYXRpb24gbXVzdCBza2lwIHRoYW4gbnVtYmVyIG9mIGJ5dGVzIG9mIGlucHV0IGRhdGEgYW5kIHBhc3MgdGhlCisgKiBmb2xsb3dpbmcgZGF0YSB0byB0aGUgbmV4dCBjYWxsIHRvIHBuZ19wcm9jZXNzX2RhdGEuCisgKi8KK1BOR19FWFBPUlQoMjIwLCBwbmdfdWludF8zMiwgcG5nX3Byb2Nlc3NfZGF0YV9za2lwLCAocG5nX3N0cnVjdHJwKSk7CisKKy8qIEZ1bmN0aW9uIHRoYXQgY29tYmluZXMgcm93cy4gICduZXdfcm93JyBpcyBhIGZsYWcgdGhhdCBzaG91bGQgY29tZSBmcm9tCisgKiB0aGUgY2FsbGJhY2sgYW5kIGJlIG5vbi1OVUxMIGlmIGFueXRoaW5nIG5lZWRzIHRvIGJlIGRvbmU7IHRoZSBsaWJyYXJ5CisgKiBzdG9yZXMgaXRzIG93biB2ZXJzaW9uIG9mIHRoZSBuZXcgZGF0YSBpbnRlcm5hbGx5IGFuZCBpZ25vcmVzIHRoZSBwYXNzZWQKKyAqIGluIHZhbHVlLgorICovCitQTkdfRVhQT1JUKDkzLCB2b2lkLCBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3csIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfYnl0ZXAgb2xkX3JvdywgcG5nX2NvbnN0X2J5dGVwIG5ld19yb3cpKTsKKyNlbmRpZiAvKiBQUk9HUkVTU0lWRV9SRUFEICovCisKK1BOR19FWFBPUlRBKDk0LCBwbmdfdm9pZHAsIHBuZ19tYWxsb2MsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfYWxsb2Nfc2l6ZV90IHNpemUpLCBQTkdfQUxMT0NBVEVEKTsKKy8qIEFkZGVkIGF0IGxpYnBuZyB2ZXJzaW9uIDEuNC4wICovCitQTkdfRVhQT1JUQSg5NSwgcG5nX3ZvaWRwLCBwbmdfY2FsbG9jLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2FsbG9jX3NpemVfdCBzaXplKSwgUE5HX0FMTE9DQVRFRCk7CisKKy8qIEFkZGVkIGF0IGxpYnBuZyB2ZXJzaW9uIDEuMi40ICovCitQTkdfRVhQT1JUQSg5NiwgcG5nX3ZvaWRwLCBwbmdfbWFsbG9jX3dhcm4sIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfYWxsb2Nfc2l6ZV90IHNpemUpLCBQTkdfQUxMT0NBVEVEKTsKKworLyogRnJlZXMgYSBwb2ludGVyIGFsbG9jYXRlZCBieSBwbmdfbWFsbG9jKCkgKi8KK1BOR19FWFBPUlQoOTcsIHZvaWQsIHBuZ19mcmVlLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ192b2lkcCBwdHIpKTsKKworLyogRnJlZSBkYXRhIHRoYXQgd2FzIGFsbG9jYXRlZCBpbnRlcm5hbGx5ICovCitQTkdfRVhQT1JUKDk4LCB2b2lkLCBwbmdfZnJlZV9kYXRhLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgZnJlZV9tZSwgaW50IG51bSkpOworCisvKiBSZWFzc2lnbiByZXNwb25zaWJpbGl0eSBmb3IgZnJlZWluZyBleGlzdGluZyBkYXRhLCB3aGV0aGVyIGFsbG9jYXRlZAorICogYnkgbGlicG5nIG9yIGJ5IHRoZSBhcHBsaWNhdGlvbjsgdGhpcyB3b3JrcyBvbiB0aGUgcG5nX2luZm8gc3RydWN0dXJlIHBhc3NlZAorICogaW4sIGl0IGRvZXMgbm90IGNoYW5nZSB0aGUgc3RhdGUgZm9yIG90aGVyIHBuZ19pbmZvIHN0cnVjdHVyZXMuCisgKgorICogSXQgaXMgdW5saWtlbHkgdGhhdCB0aGlzIGZ1bmN0aW9uIHdvcmtzIGNvcnJlY3RseSBhcyBvZiAxLjYuMCBhbmQgdXNpbmcgaXQKKyAqIG1heSByZXN1bHQgZWl0aGVyIGluIG1lbW9yeSBsZWFrcyBvciBkb3VibGUgZnJlZSBvZiBhbGxvY2F0ZWQgZGF0YS4KKyAqLworUE5HX0VYUE9SVCg5OSwgdm9pZCwgcG5nX2RhdGFfZnJlZXIsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBpbnQgZnJlZXIsIHBuZ191aW50XzMyIG1hc2spKTsKKworI2lmZGVmIFBOR19JTkRFWF9TVVBQT1JURUQKKy8qIEJ1aWxkIGltYWdlIGluZGV4IGZvciBwYXJ0aWFsIGltYWdlIGRlY29kaW5nLiAqLworUE5HX0VYUE9SVCgzMDAsIHZvaWQsIHBuZ19idWlsZF9pbmRleCwgKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKK1BOR19FWFBPUlQoMzAxLCB2b2lkLCBwbmdfY29uZmlndXJlX2RlY29kZXIsCisgICAgKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGludCAqcm93X29mZnNldCwgaW50IHBhc3MpKTsKKy8qIFNldCB0aGUgZGF0YSBzZWVrIGZ1bmN0aW9uIHdpdGggYSB1c2VyIHN1cHBsaWVkIG9uZS4KKyAqIFJFUVVJUkVEIGJ5IHBhcnRpYWwgaW1hZ2UgZGVjb2RlLgorICovCitQTkdfRVhQT1JUKDMwMiwgdm9pZCwgcG5nX3NldF9zZWVrX2ZuLCAocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19zZWVrX3B0ciBzZWVrX2RhdGFfZm4pKTsKKy8qIFVwZGF0ZSB0aGUgZGVjb2RlciBzdGF0dXMgdG8gdGhlIGdpdmVuIHBhc3MgKi8KK1BOR19FWFBPUlQoMzAzLCB2b2lkLCBwbmdfc2V0X2ludGVybGFjZWRfcGFzcywgKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGludCBwYXNzKSk7CisjZW5kaWYKKworLyogQXNzaWdubWVudHMgZm9yIHBuZ19kYXRhX2ZyZWVyICovCisjZGVmaW5lIFBOR19ERVNUUk9ZX1dJTExfRlJFRV9EQVRBIDEKKyNkZWZpbmUgUE5HX1NFVF9XSUxMX0ZSRUVfREFUQSAxCisjZGVmaW5lIFBOR19VU0VSX1dJTExfRlJFRV9EQVRBIDIKKy8qIEZsYWdzIGZvciBwbmdfcHRyLT5mcmVlX21lIGFuZCBpbmZvX3B0ci0+ZnJlZV9tZSAqLworI2RlZmluZSBQTkdfRlJFRV9ISVNUIDB4MDAwOAorI2RlZmluZSBQTkdfRlJFRV9JQ0NQIDB4MDAxMAorI2RlZmluZSBQTkdfRlJFRV9TUExUIDB4MDAyMAorI2RlZmluZSBQTkdfRlJFRV9ST1dTIDB4MDA0MAorI2RlZmluZSBQTkdfRlJFRV9QQ0FMIDB4MDA4MAorI2RlZmluZSBQTkdfRlJFRV9TQ0FMIDB4MDEwMAorI2lmZGVmIFBOR19TVE9SRV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKKyMgIGRlZmluZSBQTkdfRlJFRV9VTktOIDB4MDIwMAorI2VuZGlmCisvKiAgICAgIFBOR19GUkVFX0xJU1QgMHgwNDAwICAgIHJlbW92ZWQgaW4gMS42LjAgYmVjYXVzZSBpdCBpcyBpZ25vcmVkICovCisjZGVmaW5lIFBOR19GUkVFX1BMVEUgMHgxMDAwCisjZGVmaW5lIFBOR19GUkVFX1RSTlMgMHgyMDAwCisjZGVmaW5lIFBOR19GUkVFX1RFWFQgMHg0MDAwCisjZGVmaW5lIFBOR19GUkVFX0FMTCAgMHg3ZmZmCisjZGVmaW5lIFBOR19GUkVFX01VTCAgMHg0MjIwIC8qIFBOR19GUkVFX1NQTFR8UE5HX0ZSRUVfVEVYVHxQTkdfRlJFRV9VTktOICovCisKKyNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECitQTkdfRVhQT1JUQSgxMDAsIHBuZ192b2lkcCwgcG5nX21hbGxvY19kZWZhdWx0LCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2FsbG9jX3NpemVfdCBzaXplKSwgUE5HX0FMTE9DQVRFRCBQTkdfREVQUkVDQVRFRCk7CitQTkdfRVhQT1JUQSgxMDEsIHZvaWQsIHBuZ19mcmVlX2RlZmF1bHQsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfdm9pZHAgcHRyKSwgUE5HX0RFUFJFQ0FURUQpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfRVJST1JfVEVYVF9TVVBQT1JURUQKKy8qIEZhdGFsIGVycm9yIGluIFBORyBpbWFnZSBvZiBsaWJwbmcgLSBjYW4ndCBjb250aW51ZSAqLworUE5HX0VYUE9SVEEoMTAyLCB2b2lkLCBwbmdfZXJyb3IsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfY2hhcnAgZXJyb3JfbWVzc2FnZSksIFBOR19OT1JFVFVSTik7CisKKy8qIFRoZSBzYW1lLCBidXQgdGhlIGNodW5rIG5hbWUgaXMgcHJlcGVuZGVkIHRvIHRoZSBlcnJvciBzdHJpbmcuICovCitQTkdfRVhQT1JUQSgxMDMsIHZvaWQsIHBuZ19jaHVua19lcnJvciwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19jb25zdF9jaGFycCBlcnJvcl9tZXNzYWdlKSwgUE5HX05PUkVUVVJOKTsKKworI2Vsc2UKKy8qIEZhdGFsIGVycm9yIGluIFBORyBpbWFnZSBvZiBsaWJwbmcgLSBjYW4ndCBjb250aW51ZSAqLworUE5HX0VYUE9SVEEoMTA0LCB2b2lkLCBwbmdfZXJyLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpLCBQTkdfTk9SRVRVUk4pOworIyAgZGVmaW5lIHBuZ19lcnJvcihzMSxzMikgcG5nX2VycihzMSkKKyMgIGRlZmluZSBwbmdfY2h1bmtfZXJyb3IoczEsczIpIHBuZ19lcnIoczEpCisjZW5kaWYKKworI2lmZGVmIFBOR19XQVJOSU5HU19TVVBQT1JURUQKKy8qIE5vbi1mYXRhbCBlcnJvciBpbiBsaWJwbmcuICBDYW4gY29udGludWUsIGJ1dCBtYXkgaGF2ZSBhIHByb2JsZW0uICovCitQTkdfRVhQT1JUKDEwNSwgdm9pZCwgcG5nX3dhcm5pbmcsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfY2hhcnAgd2FybmluZ19tZXNzYWdlKSk7CisKKy8qIE5vbi1mYXRhbCBlcnJvciBpbiBsaWJwbmcsIGNodW5rIG5hbWUgaXMgcHJlcGVuZGVkIHRvIG1lc3NhZ2UuICovCitQTkdfRVhQT1JUKDEwNiwgdm9pZCwgcG5nX2NodW5rX3dhcm5pbmcsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfY2hhcnAgd2FybmluZ19tZXNzYWdlKSk7CisjZWxzZQorIyAgZGVmaW5lIHBuZ193YXJuaW5nKHMxLHMyKSAoKHZvaWQpKHMxKSkKKyMgIGRlZmluZSBwbmdfY2h1bmtfd2FybmluZyhzMSxzMikgKCh2b2lkKShzMSkpCisjZW5kaWYKKworI2lmZGVmIFBOR19CRU5JR05fRVJST1JTX1NVUFBPUlRFRAorLyogQmVuaWduIGVycm9yIGluIGxpYnBuZy4gIENhbiBjb250aW51ZSwgYnV0IG1heSBoYXZlIGEgcHJvYmxlbS4KKyAqIFVzZXIgY2FuIGNob29zZSB3aGV0aGVyIHRvIGhhbmRsZSBhcyBhIGZhdGFsIGVycm9yIG9yIGFzIGEgd2FybmluZy4gKi8KK1BOR19FWFBPUlQoMTA3LCB2b2lkLCBwbmdfYmVuaWduX2Vycm9yLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbnN0X2NoYXJwIHdhcm5pbmdfbWVzc2FnZSkpOworCisjaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECisvKiBTYW1lLCBjaHVuayBuYW1lIGlzIHByZXBlbmRlZCB0byBtZXNzYWdlIChvbmx5IGR1cmluZyByZWFkKSAqLworUE5HX0VYUE9SVCgxMDgsIHZvaWQsIHBuZ19jaHVua19iZW5pZ25fZXJyb3IsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfY2hhcnAgd2FybmluZ19tZXNzYWdlKSk7CisjZW5kaWYKKworUE5HX0VYUE9SVCgxMDksIHZvaWQsIHBuZ19zZXRfYmVuaWduX2Vycm9ycywKKyAgICAocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBhbGxvd2VkKSk7CisjZWxzZQorIyAgaWZkZWYgUE5HX0FMTE9XX0JFTklHTl9FUlJPUlMKKyMgICAgZGVmaW5lIHBuZ19iZW5pZ25fZXJyb3IgcG5nX3dhcm5pbmcKKyMgICAgZGVmaW5lIHBuZ19jaHVua19iZW5pZ25fZXJyb3IgcG5nX2NodW5rX3dhcm5pbmcKKyMgIGVsc2UKKyMgICAgZGVmaW5lIHBuZ19iZW5pZ25fZXJyb3IgcG5nX2Vycm9yCisjICAgIGRlZmluZSBwbmdfY2h1bmtfYmVuaWduX2Vycm9yIHBuZ19jaHVua19lcnJvcgorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBUaGUgcG5nX3NldF88Y2h1bms+IGZ1bmN0aW9ucyBhcmUgZm9yIHN0b3JpbmcgdmFsdWVzIGluIHRoZSBwbmdfaW5mb19zdHJ1Y3QuCisgKiBTaW1pbGFybHksIHRoZSBwbmdfZ2V0XzxjaHVuaz4gY2FsbHMgYXJlIHVzZWQgdG8gcmVhZCB2YWx1ZXMgZnJvbSB0aGUKKyAqIHBuZ19pbmZvX3N0cnVjdCwgZWl0aGVyIHN0b3JpbmcgdGhlIHBhcmFtZXRlcnMgaW4gdGhlIHBhc3NlZCB2YXJpYWJsZXMsIG9yCisgKiBzZXR0aW5nIHBvaW50ZXJzIGludG8gdGhlIHBuZ19pbmZvX3N0cnVjdCB3aGVyZSB0aGUgZGF0YSBpcyBzdG9yZWQuICBUaGUKKyAqIHBuZ19nZXRfPGNodW5rPiBmdW5jdGlvbnMgcmV0dXJuIGEgbm9uLXplcm8gdmFsdWUgaWYgdGhlIGRhdGEgd2FzIGF2YWlsYWJsZQorICogaW4gaW5mb19wdHIsIG9yIHJldHVybiB6ZXJvIGFuZCBkbyBub3QgY2hhbmdlIGFueSBvZiB0aGUgcGFyYW1ldGVycyBpZiB0aGUKKyAqIGRhdGEgd2FzIG5vdCBhdmFpbGFibGUuCisgKgorICogVGhlc2UgZnVuY3Rpb25zIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgZGlyZWN0bHkgYWNjZXNzaW5nIHBuZ19pbmZvCisgKiB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIGZ1dHVyZSBjaGFuZ2VzIGluIHRoZSBzaXplIGFuZCBpbnRlcm5hbCBsYXlvdXQgb2YKKyAqIHBuZ19pbmZvX3N0cnVjdC4KKyAqLworLyogUmV0dXJucyAiZmxhZyIgaWYgY2h1bmsgZGF0YSBpcyB2YWxpZCBpbiBpbmZvX3B0ci4gKi8KK1BOR19FWFBPUlQoMTEwLCBwbmdfdWludF8zMiwgcG5nX2dldF92YWxpZCwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGZsYWcpKTsKKworLyogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIHRvIGhvbGQgYSB0cmFuc2Zvcm1lZCByb3cuICovCitQTkdfRVhQT1JUKDExMSwgcG5nX3NpemVfdCwgcG5nX2dldF9yb3dieXRlcywgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpKTsKKworI2lmZGVmIFBOR19JTkZPX0lNQUdFX1NVUFBPUlRFRAorLyogUmV0dXJucyByb3dfcG9pbnRlcnMsIHdoaWNoIGlzIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIHNjYW5saW5lcyB0aGF0IHdhcworICogcmV0dXJuZWQgZnJvbSBwbmdfcmVhZF9wbmcoKS4KKyAqLworUE5HX0VYUE9SVCgxMTIsIHBuZ19ieXRlcHAsIHBuZ19nZXRfcm93cywgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpKTsKKworLyogU2V0IHJvd19wb2ludGVycywgd2hpY2ggaXMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gc2NhbmxpbmVzIGZvciB1c2UKKyAqIGJ5IHBuZ193cml0ZV9wbmcoKS4KKyAqLworUE5HX0VYUE9SVCgxMTMsIHZvaWQsIHBuZ19zZXRfcm93cywgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ19ieXRlcHAgcm93X3BvaW50ZXJzKSk7CisjZW5kaWYKKworLyogUmV0dXJucyBudW1iZXIgb2YgY29sb3IgY2hhbm5lbHMgaW4gaW1hZ2UuICovCitQTkdfRVhQT1JUKDExNCwgcG5nX2J5dGUsIHBuZ19nZXRfY2hhbm5lbHMsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyKSk7CisKKyNpZmRlZiBQTkdfRUFTWV9BQ0NFU1NfU1VQUE9SVEVECisvKiBSZXR1cm5zIGltYWdlIHdpZHRoIGluIHBpeGVscy4gKi8KK1BOR19FWFBPUlQoMTE1LCBwbmdfdWludF8zMiwgcG5nX2dldF9pbWFnZV93aWR0aCwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpKTsKKworLyogUmV0dXJucyBpbWFnZSBoZWlnaHQgaW4gcGl4ZWxzLiAqLworUE5HX0VYUE9SVCgxMTYsIHBuZ191aW50XzMyLCBwbmdfZ2V0X2ltYWdlX2hlaWdodCwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpKTsKKworLyogUmV0dXJucyBpbWFnZSBiaXRfZGVwdGguICovCitQTkdfRVhQT1JUKDExNywgcG5nX2J5dGUsIHBuZ19nZXRfYml0X2RlcHRoLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikpOworCisvKiBSZXR1cm5zIGltYWdlIGNvbG9yX3R5cGUuICovCitQTkdfRVhQT1JUKDExOCwgcG5nX2J5dGUsIHBuZ19nZXRfY29sb3JfdHlwZSwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpKTsKKworLyogUmV0dXJucyBpbWFnZSBmaWx0ZXJfdHlwZS4gKi8KK1BOR19FWFBPUlQoMTE5LCBwbmdfYnl0ZSwgcG5nX2dldF9maWx0ZXJfdHlwZSwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpKTsKKworLyogUmV0dXJucyBpbWFnZSBpbnRlcmxhY2VfdHlwZS4gKi8KK1BOR19FWFBPUlQoMTIwLCBwbmdfYnl0ZSwgcG5nX2dldF9pbnRlcmxhY2VfdHlwZSwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpKTsKKworLyogUmV0dXJucyBpbWFnZSBjb21wcmVzc2lvbl90eXBlLiAqLworUE5HX0VYUE9SVCgxMjEsIHBuZ19ieXRlLCBwbmdfZ2V0X2NvbXByZXNzaW9uX3R5cGUsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyKSk7CisKKy8qIFJldHVybnMgaW1hZ2UgcmVzb2x1dGlvbiBpbiBwaXhlbHMgcGVyIG1ldGVyLCBmcm9tIHBIWXMgY2h1bmsgZGF0YS4gKi8KK1BOR19FWFBPUlQoMTIyLCBwbmdfdWludF8zMiwgcG5nX2dldF9waXhlbHNfcGVyX21ldGVyLAorICAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikpOworUE5HX0VYUE9SVCgxMjMsIHBuZ191aW50XzMyLCBwbmdfZ2V0X3hfcGl4ZWxzX3Blcl9tZXRlciwKKyAgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpKTsKK1BOR19FWFBPUlQoMTI0LCBwbmdfdWludF8zMiwgcG5nX2dldF95X3BpeGVsc19wZXJfbWV0ZXIsCisgICAgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyKSk7CisKKy8qIFJldHVybnMgcGl4ZWwgYXNwZWN0IHJhdGlvLCBjb21wdXRlZCBmcm9tIHBIWXMgY2h1bmsgZGF0YS4gICovCitQTkdfRlBfRVhQT1JUKDEyNSwgZmxvYXQsIHBuZ19nZXRfcGl4ZWxfYXNwZWN0X3JhdGlvLAorICAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikpCitQTkdfRklYRURfRVhQT1JUKDIxMCwgcG5nX2ZpeGVkX3BvaW50LCBwbmdfZ2V0X3BpeGVsX2FzcGVjdF9yYXRpb19maXhlZCwKKyAgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpKQorCisvKiBSZXR1cm5zIGltYWdlIHgsIHkgb2Zmc2V0IGluIHBpeGVscyBvciBtaWNyb25zLCBmcm9tIG9GRnMgY2h1bmsgZGF0YS4gKi8KK1BOR19FWFBPUlQoMTI2LCBwbmdfaW50XzMyLCBwbmdfZ2V0X3hfb2Zmc2V0X3BpeGVscywKKyAgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpKTsKK1BOR19FWFBPUlQoMTI3LCBwbmdfaW50XzMyLCBwbmdfZ2V0X3lfb2Zmc2V0X3BpeGVscywKKyAgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpKTsKK1BOR19FWFBPUlQoMTI4LCBwbmdfaW50XzMyLCBwbmdfZ2V0X3hfb2Zmc2V0X21pY3JvbnMsCisgICAgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyKSk7CitQTkdfRVhQT1JUKDEyOSwgcG5nX2ludF8zMiwgcG5nX2dldF95X29mZnNldF9taWNyb25zLAorICAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikpOworCisjZW5kaWYgLyogRUFTWV9BQ0NFU1MgKi8KKworI2lmZGVmIFBOR19SRUFEX1NVUFBPUlRFRAorLyogUmV0dXJucyBwb2ludGVyIHRvIHNpZ25hdHVyZSBzdHJpbmcgcmVhZCBmcm9tIFBORyBoZWFkZXIgKi8KK1BOR19FWFBPUlQoMTMwLCBwbmdfY29uc3RfYnl0ZXAsIHBuZ19nZXRfc2lnbmF0dXJlLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfYktHRF9TVVBQT1JURUQKK1BOR19FWFBPUlQoMTMxLCBwbmdfdWludF8zMiwgcG5nX2dldF9iS0dELCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX2NvbG9yXzE2cCAqYmFja2dyb3VuZCkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfYktHRF9TVVBQT1JURUQKK1BOR19FWFBPUlQoMTMyLCB2b2lkLCBwbmdfc2V0X2JLR0QsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfY29uc3RfY29sb3JfMTZwIGJhY2tncm91bmQpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX2NIUk1fU1VQUE9SVEVECitQTkdfRlBfRVhQT1JUKDEzMywgcG5nX3VpbnRfMzIsIHBuZ19nZXRfY0hSTSwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIsIGRvdWJsZSAqd2hpdGVfeCwgZG91YmxlICp3aGl0ZV95LCBkb3VibGUgKnJlZF94LAorICAgIGRvdWJsZSAqcmVkX3ksIGRvdWJsZSAqZ3JlZW5feCwgZG91YmxlICpncmVlbl95LCBkb3VibGUgKmJsdWVfeCwKKyAgICBkb3VibGUgKmJsdWVfeSkpCitQTkdfRlBfRVhQT1JUKDIzMCwgcG5nX3VpbnRfMzIsIHBuZ19nZXRfY0hSTV9YWVosIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyLCBkb3VibGUgKnJlZF9YLCBkb3VibGUgKnJlZF9ZLCBkb3VibGUgKnJlZF9aLAorICAgIGRvdWJsZSAqZ3JlZW5fWCwgZG91YmxlICpncmVlbl9ZLCBkb3VibGUgKmdyZWVuX1osIGRvdWJsZSAqYmx1ZV9YLAorICAgIGRvdWJsZSAqYmx1ZV9ZLCBkb3VibGUgKmJsdWVfWikpCitQTkdfRklYRURfRVhQT1JUKDEzNCwgcG5nX3VpbnRfMzIsIHBuZ19nZXRfY0hSTV9maXhlZCwKKyAgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIsCisgICAgcG5nX2ZpeGVkX3BvaW50ICppbnRfd2hpdGVfeCwgcG5nX2ZpeGVkX3BvaW50ICppbnRfd2hpdGVfeSwKKyAgICBwbmdfZml4ZWRfcG9pbnQgKmludF9yZWRfeCwgcG5nX2ZpeGVkX3BvaW50ICppbnRfcmVkX3ksCisgICAgcG5nX2ZpeGVkX3BvaW50ICppbnRfZ3JlZW5feCwgcG5nX2ZpeGVkX3BvaW50ICppbnRfZ3JlZW5feSwKKyAgICBwbmdfZml4ZWRfcG9pbnQgKmludF9ibHVlX3gsIHBuZ19maXhlZF9wb2ludCAqaW50X2JsdWVfeSkpCitQTkdfRklYRURfRVhQT1JUKDIzMSwgcG5nX3VpbnRfMzIsIHBuZ19nZXRfY0hSTV9YWVpfZml4ZWQsCisgICAgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyLAorICAgIHBuZ19maXhlZF9wb2ludCAqaW50X3JlZF9YLCBwbmdfZml4ZWRfcG9pbnQgKmludF9yZWRfWSwKKyAgICBwbmdfZml4ZWRfcG9pbnQgKmludF9yZWRfWiwgcG5nX2ZpeGVkX3BvaW50ICppbnRfZ3JlZW5fWCwKKyAgICBwbmdfZml4ZWRfcG9pbnQgKmludF9ncmVlbl9ZLCBwbmdfZml4ZWRfcG9pbnQgKmludF9ncmVlbl9aLAorICAgIHBuZ19maXhlZF9wb2ludCAqaW50X2JsdWVfWCwgcG5nX2ZpeGVkX3BvaW50ICppbnRfYmx1ZV9ZLAorICAgIHBuZ19maXhlZF9wb2ludCAqaW50X2JsdWVfWikpCisjZW5kaWYKKworI2lmZGVmIFBOR19jSFJNX1NVUFBPUlRFRAorUE5HX0ZQX0VYUE9SVCgxMzUsIHZvaWQsIHBuZ19zZXRfY0hSTSwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsCisgICAgZG91YmxlIHdoaXRlX3gsIGRvdWJsZSB3aGl0ZV95LCBkb3VibGUgcmVkX3gsIGRvdWJsZSByZWRfeSwgZG91YmxlIGdyZWVuX3gsCisgICAgZG91YmxlIGdyZWVuX3ksIGRvdWJsZSBibHVlX3gsIGRvdWJsZSBibHVlX3kpKQorUE5HX0ZQX0VYUE9SVCgyMzIsIHZvaWQsIHBuZ19zZXRfY0hSTV9YWVosIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBkb3VibGUgcmVkX1gsIGRvdWJsZSByZWRfWSwgZG91YmxlIHJlZF9aLAorICAgIGRvdWJsZSBncmVlbl9YLCBkb3VibGUgZ3JlZW5fWSwgZG91YmxlIGdyZWVuX1osIGRvdWJsZSBibHVlX1gsCisgICAgZG91YmxlIGJsdWVfWSwgZG91YmxlIGJsdWVfWikpCitQTkdfRklYRURfRVhQT1JUKDEzNiwgdm9pZCwgcG5nX3NldF9jSFJNX2ZpeGVkLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX2ZpeGVkX3BvaW50IGludF93aGl0ZV94LAorICAgIHBuZ19maXhlZF9wb2ludCBpbnRfd2hpdGVfeSwgcG5nX2ZpeGVkX3BvaW50IGludF9yZWRfeCwKKyAgICBwbmdfZml4ZWRfcG9pbnQgaW50X3JlZF95LCBwbmdfZml4ZWRfcG9pbnQgaW50X2dyZWVuX3gsCisgICAgcG5nX2ZpeGVkX3BvaW50IGludF9ncmVlbl95LCBwbmdfZml4ZWRfcG9pbnQgaW50X2JsdWVfeCwKKyAgICBwbmdfZml4ZWRfcG9pbnQgaW50X2JsdWVfeSkpCitQTkdfRklYRURfRVhQT1JUKDIzMywgdm9pZCwgcG5nX3NldF9jSFJNX1hZWl9maXhlZCwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ19maXhlZF9wb2ludCBpbnRfcmVkX1gsIHBuZ19maXhlZF9wb2ludCBpbnRfcmVkX1ksCisgICAgcG5nX2ZpeGVkX3BvaW50IGludF9yZWRfWiwgcG5nX2ZpeGVkX3BvaW50IGludF9ncmVlbl9YLAorICAgIHBuZ19maXhlZF9wb2ludCBpbnRfZ3JlZW5fWSwgcG5nX2ZpeGVkX3BvaW50IGludF9ncmVlbl9aLAorICAgIHBuZ19maXhlZF9wb2ludCBpbnRfYmx1ZV9YLCBwbmdfZml4ZWRfcG9pbnQgaW50X2JsdWVfWSwKKyAgICBwbmdfZml4ZWRfcG9pbnQgaW50X2JsdWVfWikpCisjZW5kaWYKKworI2lmZGVmIFBOR19nQU1BX1NVUFBPUlRFRAorUE5HX0ZQX0VYUE9SVCgxMzcsIHBuZ191aW50XzMyLCBwbmdfZ2V0X2dBTUEsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyLCBkb3VibGUgKmZpbGVfZ2FtbWEpKQorUE5HX0ZJWEVEX0VYUE9SVCgxMzgsIHBuZ191aW50XzMyLCBwbmdfZ2V0X2dBTUFfZml4ZWQsCisgICAgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyLAorICAgIHBuZ19maXhlZF9wb2ludCAqaW50X2ZpbGVfZ2FtbWEpKQorI2VuZGlmCisKKyNpZmRlZiBQTkdfZ0FNQV9TVVBQT1JURUQKK1BOR19GUF9FWFBPUlQoMTM5LCB2b2lkLCBwbmdfc2V0X2dBTUEsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBkb3VibGUgZmlsZV9nYW1tYSkpCitQTkdfRklYRURfRVhQT1JUKDE0MCwgdm9pZCwgcG5nX3NldF9nQU1BX2ZpeGVkLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX2ZpeGVkX3BvaW50IGludF9maWxlX2dhbW1hKSkKKyNlbmRpZgorCisjaWZkZWYgUE5HX2hJU1RfU1VQUE9SVEVECitQTkdfRVhQT1JUKDE0MSwgcG5nX3VpbnRfMzIsIHBuZ19nZXRfaElTVCwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzE2cCAqaGlzdCkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfaElTVF9TVVBQT1JURUQKK1BOR19FWFBPUlQoMTQyLCB2b2lkLCBwbmdfc2V0X2hJU1QsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfY29uc3RfdWludF8xNnAgaGlzdCkpOworI2VuZGlmCisKK1BOR19FWFBPUlQoMTQzLCBwbmdfdWludF8zMiwgcG5nX2dldF9JSERSLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgKndpZHRoLCBwbmdfdWludF8zMiAqaGVpZ2h0LAorICAgIGludCAqYml0X2RlcHRoLCBpbnQgKmNvbG9yX3R5cGUsIGludCAqaW50ZXJsYWNlX21ldGhvZCwKKyAgICBpbnQgKmNvbXByZXNzaW9uX21ldGhvZCwgaW50ICpmaWx0ZXJfbWV0aG9kKSk7CisKK1BOR19FWFBPUlQoMTQ0LCB2b2lkLCBwbmdfc2V0X0lIRFIsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiB3aWR0aCwgcG5nX3VpbnRfMzIgaGVpZ2h0LCBpbnQgYml0X2RlcHRoLAorICAgIGludCBjb2xvcl90eXBlLCBpbnQgaW50ZXJsYWNlX21ldGhvZCwgaW50IGNvbXByZXNzaW9uX21ldGhvZCwKKyAgICBpbnQgZmlsdGVyX21ldGhvZCkpOworCisjaWZkZWYgUE5HX29GRnNfU1VQUE9SVEVECitQTkdfRVhQT1JUKDE0NSwgcG5nX3VpbnRfMzIsIHBuZ19nZXRfb0ZGcywgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0ciwgcG5nX2ludF8zMiAqb2Zmc2V0X3gsIHBuZ19pbnRfMzIgKm9mZnNldF95LAorICAgaW50ICp1bml0X3R5cGUpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX29GRnNfU1VQUE9SVEVECitQTkdfRVhQT1JUKDE0Niwgdm9pZCwgcG5nX3NldF9vRkZzLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX2ludF8zMiBvZmZzZXRfeCwgcG5nX2ludF8zMiBvZmZzZXRfeSwKKyAgICBpbnQgdW5pdF90eXBlKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19wQ0FMX1NVUFBPUlRFRAorUE5HX0VYUE9SVCgxNDcsIHBuZ191aW50XzMyLCBwbmdfZ2V0X3BDQUwsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfY2hhcnAgKnB1cnBvc2UsIHBuZ19pbnRfMzIgKlgwLAorICAgIHBuZ19pbnRfMzIgKlgxLCBpbnQgKnR5cGUsIGludCAqbnBhcmFtcywgcG5nX2NoYXJwICp1bml0cywKKyAgICBwbmdfY2hhcnBwICpwYXJhbXMpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX3BDQUxfU1VQUE9SVEVECitQTkdfRVhQT1JUKDE0OCwgdm9pZCwgcG5nX3NldF9wQ0FMLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX2NvbnN0X2NoYXJwIHB1cnBvc2UsIHBuZ19pbnRfMzIgWDAsIHBuZ19pbnRfMzIgWDEsCisgICAgaW50IHR5cGUsIGludCBucGFyYW1zLCBwbmdfY29uc3RfY2hhcnAgdW5pdHMsIHBuZ19jaGFycHAgcGFyYW1zKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19wSFlzX1NVUFBPUlRFRAorUE5HX0VYUE9SVCgxNDksIHBuZ191aW50XzMyLCBwbmdfZ2V0X3BIWXMsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiAqcmVzX3gsIHBuZ191aW50XzMyICpyZXNfeSwKKyAgICBpbnQgKnVuaXRfdHlwZSkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfcEhZc19TVVBQT1JURUQKK1BOR19FWFBPUlQoMTUwLCB2b2lkLCBwbmdfc2V0X3BIWXMsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiByZXNfeCwgcG5nX3VpbnRfMzIgcmVzX3ksIGludCB1bml0X3R5cGUpKTsKKyNlbmRpZgorCitQTkdfRVhQT1JUKDE1MSwgcG5nX3VpbnRfMzIsIHBuZ19nZXRfUExURSwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX2NvbG9ycCAqcGFsZXR0ZSwgaW50ICpudW1fcGFsZXR0ZSkpOworCitQTkdfRVhQT1JUKDE1Miwgdm9pZCwgcG5nX3NldF9QTFRFLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX2NvbnN0X2NvbG9ycCBwYWxldHRlLCBpbnQgbnVtX3BhbGV0dGUpKTsKKworI2lmZGVmIFBOR19zQklUX1NVUFBPUlRFRAorUE5HX0VYUE9SVCgxNTMsIHBuZ191aW50XzMyLCBwbmdfZ2V0X3NCSVQsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfY29sb3JfOHAgKnNpZ19iaXQpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX3NCSVRfU1VQUE9SVEVECitQTkdfRVhQT1JUKDE1NCwgdm9pZCwgcG5nX3NldF9zQklULCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX2NvbnN0X2NvbG9yXzhwIHNpZ19iaXQpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX3NSR0JfU1VQUE9SVEVECitQTkdfRVhQT1JUKDE1NSwgcG5nX3VpbnRfMzIsIHBuZ19nZXRfc1JHQiwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIsIGludCAqZmlsZV9zcmdiX2ludGVudCkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfc1JHQl9TVVBQT1JURUQKK1BOR19FWFBPUlQoMTU2LCB2b2lkLCBwbmdfc2V0X3NSR0IsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBpbnQgc3JnYl9pbnRlbnQpKTsKK1BOR19FWFBPUlQoMTU3LCB2b2lkLCBwbmdfc2V0X3NSR0JfZ0FNQV9hbmRfY0hSTSwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIGludCBzcmdiX2ludGVudCkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfaUNDUF9TVVBQT1JURUQKK1BOR19FWFBPUlQoMTU4LCBwbmdfdWludF8zMiwgcG5nX2dldF9pQ0NQLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX2NoYXJwcCBuYW1lLCBpbnQgKmNvbXByZXNzaW9uX3R5cGUsCisgICAgcG5nX2J5dGVwcCBwcm9maWxlLCBwbmdfdWludF8zMiAqcHJvZmxlbikpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfaUNDUF9TVVBQT1JURUQKK1BOR19FWFBPUlQoMTU5LCB2b2lkLCBwbmdfc2V0X2lDQ1AsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfY29uc3RfY2hhcnAgbmFtZSwgaW50IGNvbXByZXNzaW9uX3R5cGUsCisgICAgcG5nX2NvbnN0X2J5dGVwIHByb2ZpbGUsIHBuZ191aW50XzMyIHByb2ZsZW4pKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX3NQTFRfU1VQUE9SVEVECitQTkdfRVhQT1JUKDE2MCwgaW50LCBwbmdfZ2V0X3NQTFQsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfc1BMVF90cHAgZW50cmllcykpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfc1BMVF9TVVBQT1JURUQKK1BOR19FWFBPUlQoMTYxLCB2b2lkLCBwbmdfc2V0X3NQTFQsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfY29uc3Rfc1BMVF90cCBlbnRyaWVzLCBpbnQgbmVudHJpZXMpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1RFWFRfU1VQUE9SVEVECisvKiBwbmdfZ2V0X3RleHQgYWxzbyByZXR1cm5zIHRoZSBudW1iZXIgb2YgdGV4dCBjaHVua3MgaW4gKm51bV90ZXh0ICovCitQTkdfRVhQT1JUKDE2MiwgaW50LCBwbmdfZ2V0X3RleHQsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdGV4dHAgKnRleHRfcHRyLCBpbnQgKm51bV90ZXh0KSk7CisjZW5kaWYKKworLyogTm90ZSB3aGlsZSBwbmdfc2V0X3RleHQoKSB3aWxsIGFjY2VwdCBhIHN0cnVjdHVyZSB3aG9zZSB0ZXh0LAorICogbGFuZ3VhZ2UsIGFuZCAgdHJhbnNsYXRlZCBrZXl3b3JkcyBhcmUgTlVMTCBwb2ludGVycywgdGhlIHN0cnVjdHVyZQorICogcmV0dXJuZWQgYnkgcG5nX2dldF90ZXh0IHdpbGwgYWx3YXlzIGNvbnRhaW4gcmVndWxhcgorICogemVyby10ZXJtaW5hdGVkIEMgc3RyaW5ncy4gIFRoZXkgbWlnaHQgYmUgZW1wdHkgc3RyaW5ncyBidXQKKyAqIHRoZXkgd2lsbCBuZXZlciBiZSBOVUxMIHBvaW50ZXJzLgorICovCisKKyNpZmRlZiBQTkdfVEVYVF9TVVBQT1JURUQKK1BOR19FWFBPUlQoMTYzLCB2b2lkLCBwbmdfc2V0X3RleHQsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfY29uc3RfdGV4dHAgdGV4dF9wdHIsIGludCBudW1fdGV4dCkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfdElNRV9TVVBQT1JURUQKK1BOR19FWFBPUlQoMTY0LCBwbmdfdWludF8zMiwgcG5nX2dldF90SU1FLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3RpbWVwICptb2RfdGltZSkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfdElNRV9TVVBQT1JURUQKK1BOR19FWFBPUlQoMTY1LCB2b2lkLCBwbmdfc2V0X3RJTUUsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfY29uc3RfdGltZXAgbW9kX3RpbWUpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX3RSTlNfU1VQUE9SVEVECitQTkdfRVhQT1JUKDE2NiwgcG5nX3VpbnRfMzIsIHBuZ19nZXRfdFJOUywgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ19ieXRlcCAqdHJhbnNfYWxwaGEsIGludCAqbnVtX3RyYW5zLAorICAgIHBuZ19jb2xvcl8xNnAgKnRyYW5zX2NvbG9yKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR190Uk5TX1NVUFBPUlRFRAorUE5HX0VYUE9SVCgxNjcsIHZvaWQsIHBuZ19zZXRfdFJOUywgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ19jb25zdF9ieXRlcCB0cmFuc19hbHBoYSwgaW50IG51bV90cmFucywKKyAgICBwbmdfY29uc3RfY29sb3JfMTZwIHRyYW5zX2NvbG9yKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19zQ0FMX1NVUFBPUlRFRAorUE5HX0ZQX0VYUE9SVCgxNjgsIHBuZ191aW50XzMyLCBwbmdfZ2V0X3NDQUwsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyLCBpbnQgKnVuaXQsIGRvdWJsZSAqd2lkdGgsIGRvdWJsZSAqaGVpZ2h0KSkKKyNpZiBkZWZpbmVkKFBOR19GTE9BVElOR19BUklUSE1FVElDX1NVUFBPUlRFRCkgfHwgXAorICAgZGVmaW5lZChQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEKQorLyogTk9URTogdGhpcyBBUEkgaXMgY3VycmVudGx5IGltcGxlbWVudGVkIHVzaW5nIGZsb2F0aW5nIHBvaW50IGFyaXRobWV0aWMsCisgKiBjb25zZXF1ZW50bHkgaXQgY2FuIG9ubHkgYmUgdXNlZCBvbiBzeXN0ZW1zIHdpdGggZmxvYXRpbmcgcG9pbnQgc3VwcG9ydC4KKyAqIEluIGFueSBjYXNlIHRoZSByYW5nZSBvZiB2YWx1ZXMgc3VwcG9ydGVkIGJ5IHBuZ19maXhlZF9wb2ludCBpcyBzbWFsbCBhbmQgaXQKKyAqIGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHBuZ19nZXRfc0NBTF9zIGJlIHVzZWQgaW5zdGVhZC4KKyAqLworUE5HX0ZJWEVEX0VYUE9SVCgyMTQsIHBuZ191aW50XzMyLCBwbmdfZ2V0X3NDQUxfZml4ZWQsCisgICAgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyLCBpbnQgKnVuaXQsCisgICAgcG5nX2ZpeGVkX3BvaW50ICp3aWR0aCwgcG5nX2ZpeGVkX3BvaW50ICpoZWlnaHQpKQorI2VuZGlmCitQTkdfRVhQT1JUKDE2OSwgcG5nX3VpbnRfMzIsIHBuZ19nZXRfc0NBTF9zLAorICAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0ciwgaW50ICp1bml0LAorICAgIHBuZ19jaGFycHAgc3dpZHRoLCBwbmdfY2hhcnBwIHNoZWlnaHQpKTsKKworUE5HX0ZQX0VYUE9SVCgxNzAsIHZvaWQsIHBuZ19zZXRfc0NBTCwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIGludCB1bml0LCBkb3VibGUgd2lkdGgsIGRvdWJsZSBoZWlnaHQpKQorUE5HX0ZJWEVEX0VYUE9SVCgyMTMsIHZvaWQsIHBuZ19zZXRfc0NBTF9maXhlZCwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgaW50IHVuaXQsIHBuZ19maXhlZF9wb2ludCB3aWR0aCwKKyAgIHBuZ19maXhlZF9wb2ludCBoZWlnaHQpKQorUE5HX0VYUE9SVCgxNzEsIHZvaWQsIHBuZ19zZXRfc0NBTF9zLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgaW50IHVuaXQsCisgICAgcG5nX2NvbnN0X2NoYXJwIHN3aWR0aCwgcG5nX2NvbnN0X2NoYXJwIHNoZWlnaHQpKTsKKyNlbmRpZiAvKiBzQ0FMICovCisKKyNpZmRlZiBQTkdfU0VUX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAorLyogUHJvdmlkZSB0aGUgZGVmYXVsdCBoYW5kbGluZyBmb3IgYWxsIHVua25vd24gY2h1bmtzIG9yLCBvcHRpb25hbGx5LCBmb3IKKyAqIHNwZWNpZmljIHVua25vd24gY2h1bmtzLgorICoKKyAqIE5PVEU6IHByaW9yIHRvIDEuNi4wIHRoZSBoYW5kbGluZyBzcGVjaWZpZWQgZm9yIHBhcnRpY3VsYXIgY2h1bmtzIG9uIHJlYWQgd2FzCisgKiBpZ25vcmVkIGFuZCB0aGUgZGVmYXVsdCB3YXMgdXNlZCwgdGhlIHBlci1jaHVuayBzZXR0aW5nIG9ubHkgaGFkIGFuIGVmZmVjdCBvbgorICogd3JpdGUuICBJZiB5b3Ugd2lzaCB0byBoYXZlIGNodW5rLXNwZWNpZmljIGhhbmRsaW5nIG9uIHJlYWQgaW4gY29kZSB0aGF0IG11c3QKKyAqIHdvcmsgb24gZWFybGllciB2ZXJzaW9ucyB5b3UgbXVzdCB1c2UgYSB1c2VyIGNodW5rIGNhbGxiYWNrIHRvIHNwZWNpZnkgdGhlCisgKiBkZXNpcmVkIGhhbmRsaW5nIChrZWVwIG9yIGRpc2NhcmQuKQorICoKKyAqIFRoZSAna2VlcCcgcGFyYW1ldGVyIGlzIGEgUE5HX0hBTkRMRV9DSFVOS18gdmFsdWUgYXMgbGlzdGVkIGJlbG93LiAgVGhlCisgKiBwYXJhbWV0ZXIgaXMgaW50ZXJwcmV0ZWQgYXMgZm9sbG93czoKKyAqCisgKiBSRUFEOgorICogICAgUE5HX0hBTkRMRV9DSFVOS19BU19ERUZBVUxUOgorICogICAgICAgS25vd24gY2h1bmtzOiBkbyBub3JtYWwgbGlicG5nIHByb2Nlc3NpbmcsIGRvIG5vdCBrZWVwIHRoZSBjaHVuayAoYnV0CisgKiAgICAgICAgICBzZWUgdGhlIGNvbW1lbnRzIGJlbG93IGFib3V0IFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQpCisgKiAgICAgICBVbmtub3duIGNodW5rczogZm9yIGEgc3BlY2lmaWMgY2h1bmsgdXNlIHRoZSBnbG9iYWwgZGVmYXVsdCwgd2hlbiB1c2VkCisgKiAgICAgICAgICBhcyB0aGUgZGVmYXVsdCBkaXNjYXJkIHRoZSBjaHVuayBkYXRhLgorICogICAgUE5HX0hBTkRMRV9DSFVOS19ORVZFUjoKKyAqICAgICAgIERpc2NhcmQgdGhlIGNodW5rIGRhdGEuCisgKiAgICBQTkdfSEFORExFX0NIVU5LX0lGX1NBRkU6CisgKiAgICAgICBLZWVwIHRoZSBjaHVuayBkYXRhIGlmIHRoZSBjaHVuayBpcyBub3QgY3JpdGljYWwgZWxzZSByYWlzZSBhIGNodW5rCisgKiAgICAgICBlcnJvci4KKyAqICAgIFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTOgorICogICAgICAgS2VlcCB0aGUgY2h1bmsgZGF0YS4KKyAqCisgKiBJZiB0aGUgY2h1bmsgZGF0YSBpcyBzYXZlZCBpdCBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIHBuZ19nZXRfdW5rbm93bl9jaHVua3MsCisgKiBiZWxvdy4gIE5vdGljZSB0aGF0IHNwZWNpZnlpbmcgIkFTX0RFRkFVTFQiIGFzIGEgZ2xvYmFsIGRlZmF1bHQgaXMgZXF1aXZhbGVudAorICogdG8gc3BlY2lmeWluZyAiTkVWRVIiLCBob3dldmVyIHdoZW4gIkFTX0RFRkFVTFQiIGlzIHVzZWQgZm9yIHNwZWNpZmljIGNodW5rcworICogaXQgc2ltcGx5IHJlc2V0cyB0aGUgYmVoYXZpb3IgdG8gdGhlIGxpYnBuZyBkZWZhdWx0LgorICoKKyAqIElOVEVSQUNUSU9OIFdUSUggVVNFUiBDSFVOSyBDQUxMQkFDS1M6CisgKiBUaGUgcGVyLWNodW5rIGhhbmRsaW5nIGlzIGFsd2F5cyB1c2VkIHdoZW4gdGhlcmUgaXMgYSBwbmdfdXNlcl9jaHVua19wdHIKKyAqIGNhbGxiYWNrIGFuZCB0aGUgY2FsbGJhY2sgcmV0dXJucyAwOyB0aGUgY2h1bmsgaXMgdGhlbiBhbHdheXMgc3RvcmVkICp1bmxlc3MqCisgKiBpdCBpcyBjcml0aWNhbCBhbmQgdGhlIHBlci1jaHVuayBzZXR0aW5nIGlzIG90aGVyIHRoYW4gQUxXQVlTLiAgTm90aWNlIHRoYXQKKyAqIHRoZSBnbG9iYWwgZGVmYXVsdCBpcyAqbm90KiB1c2VkIGluIHRoaXMgY2FzZS4gIChJbiBlZmZlY3QgdGhlIHBlci1jaHVuaworICogdmFsdWUgaXMgaW5jcmVtZW50ZWQgdG8gYXQgbGVhc3QgSUZfU0FGRS4pCisgKgorICogSU1QT1JUQU5UIE5PVEU6IHRoaXMgYmVoYXZpb3Igd2lsbCBjaGFuZ2UgaW4gbGlicG5nIDEuNyAtIHRoZSBnbG9iYWwgYW5kCisgKiBwZXItY2h1bmsgZGVmYXVsdHMgd2lsbCBiZSBob25vcmVkLiAgSWYgeW91IHdhbnQgdG8gcHJlc2VydmUgdGhlIGN1cnJlbnQKKyAqIGJlaGF2aW9yIHdoZW4geW91ciBjYWxsYmFjayByZXR1cm5zIDAgeW91IG11c3Qgc2V0IFBOR19IQU5ETEVfQ0hVTktfSUZfU0FGRQorICogYXMgdGhlIGRlZmF1bHQgLSBpZiB5b3UgZG9uJ3QgZG8gdGhpcyBsaWJwbmcgMS42IHdpbGwgaXNzdWUgYSB3YXJuaW5nLgorICoKKyAqIElmIHlvdSB3YW50IHVuaGFuZGxlZCB1bmtub3duIGNodW5rcyB0byBiZSBkaXNjYXJkZWQgaW4gbGlicG5nIDEuNiBhbmQKKyAqIGVhcmxpZXIgc2ltcGx5IHJldHVybiAnMScgKGhhbmRsZWQpLgorICoKKyAqIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQ6CisgKiAgICBJZiB0aGlzIGlzICpub3QqIHNldCBrbm93biBjaHVua3Mgd2lsbCBhbHdheXMgYmUgaGFuZGxlZCBieSBsaWJwbmcgYW5kCisgKiAgICB3aWxsIG5ldmVyIGJlIHN0b3JlZCBpbiB0aGUgdW5rbm93biBjaHVuayBsaXN0LiAgS25vd24gY2h1bmtzIGxpc3RlZCB0bworICogICAgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzIHdpbGwgaGF2ZSBubyBlZmZlY3QuICBJZiBpdCBpcyBzZXQgdGhlbiBrbm93bgorICogICAgY2h1bmtzIGxpc3RlZCB3aXRoIGEga2VlcCBvdGhlciB0aGFuIEFTX0RFRkFVTFQgd2lsbCAqbmV2ZXIqIGJlIHByb2Nlc3NlZAorICogICAgYnkgbGlicG5nLCBpbiBhZGRpdGlvbiBjcml0aWNhbCBjaHVua3MgbXVzdCBlaXRoZXIgYmUgcHJvY2Vzc2VkIGJ5IHRoZQorICogICAgY2FsbGJhY2sgb3Igc2F2ZWQuCisgKgorICogICAgVGhlIElIRFIgYW5kIElFTkQgY2h1bmtzIG11c3Qgbm90IGJlIGxpc3RlZC4gIEJlY2F1c2UgdGhpcyB0dXJucyBvZmYgdGhlCisgKiAgICBkZWZhdWx0IGhhbmRsaW5nIGZvciBjaHVua3MgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgcmVjb2duaXplZCB0aGUKKyAqICAgIGJlaGF2aW9yIG9mIGxpYnBuZyB0cmFuc2Zvcm1hdGlvbnMgbWF5IHdlbGwgYmVjb21lIGluY29ycmVjdCEKKyAqCisgKiBXUklURToKKyAqICAgIFdoZW4gd3JpdGluZyBjaHVua3MgdGhlIG9wdGlvbnMgb25seSBhcHBseSB0byB0aGUgY2h1bmtzIHNwZWNpZmllZCBieQorICogICAgcG5nX3NldF91bmtub3duX2NodW5rcyAoYmVsb3cpLCBsaWJwbmcgd2lsbCAqYWx3YXlzKiB3cml0ZSBrbm93biBjaHVua3MKKyAqICAgIHJlcXVpcmVkIGJ5IHBuZ19zZXRfIGNhbGxzIGFuZCB3aWxsIGFsd2F5cyB3cml0ZSB0aGUgY29yZSBjcml0aWNhbCBjaHVua3MKKyAqICAgIChhcyByZXF1aXJlZCBmb3IgUExURSkuCisgKgorICogICAgRWFjaCBjaHVuayBpbiB0aGUgcG5nX3NldF91bmtub3duX2NodW5rcyBsaXN0IGlzIGxvb2tlZCB1cCBpbiB0aGUKKyAqICAgIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyBsaXN0IHRvIGZpbmQgdGhlIGtlZXAgc2V0dGluZywgdGhpcyBpcyB0aGVuCisgKiAgICBpbnRlcnByZXRlZCBhcyBmb2xsb3dzOgorICoKKyAqICAgIFBOR19IQU5ETEVfQ0hVTktfQVNfREVGQVVMVDoKKyAqICAgICAgIFdyaXRlIHNhZmUtdG8tY29weSBjaHVua3MgYW5kIHdyaXRlIG90aGVyIGNodW5rcyBpZiB0aGUgZ2xvYmFsCisgKiAgICAgICBkZWZhdWx0IGlzIHNldCB0byBfQUxXQVlTLCBvdGhlcndpc2UgZG9uJ3Qgd3JpdGUgdGhpcyBjaHVuay4KKyAqICAgIFBOR19IQU5ETEVfQ0hVTktfTkVWRVI6CisgKiAgICAgICBEbyBub3Qgd3JpdGUgdGhlIGNodW5rLgorICogICAgUE5HX0hBTkRMRV9DSFVOS19JRl9TQUZFOgorICogICAgICAgV3JpdGUgdGhlIGNodW5rIGlmIGl0IGlzIHNhZmUtdG8tY29weSwgb3RoZXJ3aXNlIGRvIG5vdCB3cml0ZSBpdC4KKyAqICAgIFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTOgorICogICAgICAgV3JpdGUgdGhlIGNodW5rLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyBlZmZlY3RpdmVseSB0aGUgb3Bwb3NpdGUgb2YgdGhlIHJlYWQgY2FzZSAtCisgKiBpbiByZWFkIHVua25vd24gY2h1bmtzIGFyZSBub3Qgc3RvcmVkIGJ5IGRlZmF1bHQsIGluIHdyaXRlIHRoZXkgYXJlIHdyaXR0ZW4KKyAqIGJ5IGRlZmF1bHQuICBBbHNvIHRoZSBiZWhhdmlvciBvZiBQTkdfSEFORExFX0NIVU5LX0lGX1NBRkUgaXMgdmVyeSBkaWZmZXJlbnQKKyAqIC0gb24gd3JpdGUgdGhlIHNhZmUtdG8tY29weSBiaXQgaXMgY2hlY2tlZCwgb24gcmVhZCB0aGUgY3JpdGljYWwgYml0IGlzCisgKiBjaGVja2VkIGFuZCBvbiByZWFkIGlmIHRoZSBjaHVuayBpcyBjcml0aWNhbCBhbiBlcnJvciB3aWxsIGJlIHJhaXNlZC4KKyAqCisgKiBudW1fY2h1bmtzOgorICogPT09PT09PT09PT0KKyAqICAgIElmIG51bV9jaHVua3MgaXMgcG9zaXRpdmUsIHRoZW4gdGhlICJrZWVwIiBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBtYW5uZXIKKyAqICAgIGZvciBoYW5kbGluZyBvbmx5IHRob3NlIGNodW5rcyBhcHBlYXJpbmcgaW4gdGhlIGNodW5rX2xpc3QgYXJyYXksCisgKiAgICBvdGhlcndpc2UgdGhlIGNodW5rIGxpc3QgYXJyYXkgaXMgaWdub3JlZC4KKyAqCisgKiAgICBJZiBudW1fY2h1bmtzIGlzIDAgdGhlICJrZWVwIiBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvcgorICogICAgdW5rbm93biBjaHVua3MsIGFzIGRlc2NyaWJlZCBhYm92ZS4KKyAqCisgKiAgICBJZiBudW1fY2h1bmtzIGlzIG5lZ2F0aXZlLCB0aGVuIHRoZSAia2VlcCIgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbWFubmVyCisgKiAgICBmb3IgaGFuZGxpbmcgYWxsIHVua25vd24gY2h1bmtzIHBsdXMgYWxsIGNodW5rcyByZWNvZ25pemVkIGJ5IGxpYnBuZworICogICAgZXhjZXB0IGZvciB0aGUgSUhEUiwgUExURSwgdFJOUywgSURBVCwgYW5kIElFTkQgY2h1bmtzICh3aGljaCBjb250aW51ZSB0bworICogICAgYmUgcHJvY2Vzc2VkIGJ5IGxpYnBuZy4KKyAqLworUE5HX0VYUE9SVCgxNzIsIHZvaWQsIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcywgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIGludCBrZWVwLCBwbmdfY29uc3RfYnl0ZXAgY2h1bmtfbGlzdCwgaW50IG51bV9jaHVua3MpKTsKKworLyogVGhlICJrZWVwIiBQTkdfSEFORExFX0NIVU5LXyBwYXJhbWV0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgY2h1bmsgaXMgcmV0dXJuZWQ7CisgKiB0aGUgcmVzdWx0IGlzIHRoZXJlZm9yZSB0cnVlIChub24temVybykgaWYgc3BlY2lhbCBoYW5kbGluZyBpcyByZXF1aXJlZCwKKyAqIGZhbHNlIGZvciB0aGUgZGVmYXVsdCBoYW5kbGluZy4KKyAqLworUE5HX0VYUE9SVCgxNzMsIGludCwgcG5nX2hhbmRsZV9hc191bmtub3duLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbnN0X2J5dGVwIGNodW5rX25hbWUpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1NUT1JFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAorUE5HX0VYUE9SVCgxNzQsIHZvaWQsIHBuZ19zZXRfdW5rbm93bl9jaHVua3MsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfY29uc3RfdW5rbm93bl9jaHVua3AgdW5rbm93bnMsCisgICAgaW50IG51bV91bmtub3ducykpOworICAgLyogTk9URTogcHJpb3IgdG8gMS42LjAgdGhpcyByb3V0aW5lIHNldCB0aGUgJ2xvY2F0aW9uJyBmaWVsZCBvZiB0aGUgYWRkZWQKKyAgICAqIHVua25vd25zIHRvIHRoZSBsb2NhdGlvbiBjdXJyZW50bHkgc3RvcmVkIGluIHRoZSBwbmdfc3RydWN0LiAgVGhpcyBpcworICAgICogaW52YXJpYWJseSB0aGUgd3JvbmcgdmFsdWUgb24gd3JpdGUuICBUbyBmaXggdGhpcyBjYWxsIHRoZSBmb2xsb3dpbmcgQVBJCisgICAgKiBmb3IgZWFjaCBjaHVuayBpbiB0aGUgbGlzdCB3aXRoIHRoZSBjb3JyZWN0IGxvY2F0aW9uLiAgSWYgeW91IGtub3cgeW91cgorICAgICogY29kZSB3b24ndCBiZSBjb21waWxlZCBvbiBlYXJsaWVyIHZlcnNpb25zIHlvdSBjYW4gcmVseSBvbgorICAgICogcG5nX3NldF91bmtub3duX2NodW5rcyh3cml0ZS1wdHIsIHBuZ19nZXRfdW5rbm93bl9jaHVua3MocmVhZC1wdHIpKSBkb2luZworICAgICogdGhlIGNvcnJlY3QgdGhpbmcuCisgICAgKi8KKworUE5HX0VYUE9SVCgxNzUsIHZvaWQsIHBuZ19zZXRfdW5rbm93bl9jaHVua19sb2NhdGlvbiwKKyAgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIGludCBjaHVuaywgaW50IGxvY2F0aW9uKSk7CisKK1BOR19FWFBPUlQoMTc2LCBpbnQsIHBuZ19nZXRfdW5rbm93bl9jaHVua3MsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdW5rbm93bl9jaHVua3BwIGVudHJpZXMpKTsKKyNlbmRpZgorCisvKiBQbmdfZnJlZV9kYXRhKCkgd2lsbCB0dXJuIG9mZiB0aGUgInZhbGlkIiBmbGFnIGZvciBhbnl0aGluZyBpdCBmcmVlcy4KKyAqIElmIHlvdSBuZWVkIHRvIHR1cm4gaXQgb2ZmIGZvciBhIGNodW5rIHRoYXQgeW91ciBhcHBsaWNhdGlvbiBoYXMgZnJlZWQsCisgKiB5b3UgY2FuIHVzZSBwbmdfc2V0X2ludmFsaWQocG5nX3B0ciwgaW5mb19wdHIsIFBOR19JTkZPX0NITkspOworICovCitQTkdfRVhQT1JUKDE3Nywgdm9pZCwgcG5nX3NldF9pbnZhbGlkLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgaW50IG1hc2spKTsKKworI2lmZGVmIFBOR19JTkZPX0lNQUdFX1NVUFBPUlRFRAorLyogVGhlICJwYXJhbXMiIHBvaW50ZXIgaXMgY3VycmVudGx5IG5vdCB1c2VkIGFuZCBpcyBmb3IgZnV0dXJlIGV4cGFuc2lvbi4gKi8KKyNpZmRlZiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRAorUE5HX0VYUE9SVCgxNzgsIHZvaWQsIHBuZ19yZWFkX3BuZywgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLAorICAgIGludCB0cmFuc2Zvcm1zLCBwbmdfdm9pZHAgcGFyYW1zKSk7CisjZW5kaWYKKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECitQTkdfRVhQT1JUKDE3OSwgdm9pZCwgcG5nX3dyaXRlX3BuZywgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLAorICAgIGludCB0cmFuc2Zvcm1zLCBwbmdfdm9pZHAgcGFyYW1zKSk7CisjZW5kaWYKKyNlbmRpZgorCitQTkdfRVhQT1JUKDE4MCwgcG5nX2NvbnN0X2NoYXJwLCBwbmdfZ2V0X2NvcHlyaWdodCwKKyAgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpKTsKK1BOR19FWFBPUlQoMTgxLCBwbmdfY29uc3RfY2hhcnAsIHBuZ19nZXRfaGVhZGVyX3ZlciwKKyAgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpKTsKK1BOR19FWFBPUlQoMTgyLCBwbmdfY29uc3RfY2hhcnAsIHBuZ19nZXRfaGVhZGVyX3ZlcnNpb24sCisgICAgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyKSk7CitQTkdfRVhQT1JUKDE4MywgcG5nX2NvbnN0X2NoYXJwLCBwbmdfZ2V0X2xpYnBuZ192ZXIsCisgICAgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyKSk7CisKKyNpZmRlZiBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRAorUE5HX0VYUE9SVCgxODQsIHBuZ191aW50XzMyLCBwbmdfcGVybWl0X21uZ19mZWF0dXJlcywgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ191aW50XzMyIG1uZ19mZWF0dXJlc19wZXJtaXR0ZWQpKTsKKyNlbmRpZgorCisvKiBGb3IgdXNlIGluIHBuZ19zZXRfa2VlcF91bmtub3duLCBhZGRlZCB0byB2ZXJzaW9uIDEuMi42ICovCisjZGVmaW5lIFBOR19IQU5ETEVfQ0hVTktfQVNfREVGQVVMVCAgIDAKKyNkZWZpbmUgUE5HX0hBTkRMRV9DSFVOS19ORVZFUiAgICAgICAgMQorI2RlZmluZSBQTkdfSEFORExFX0NIVU5LX0lGX1NBRkUgICAgICAyCisjZGVmaW5lIFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTICAgICAgIDMKKyNkZWZpbmUgUE5HX0hBTkRMRV9DSFVOS19MQVNUICAgICAgICAgNAorCisvKiBTdHJpcCB0aGUgcHJlcGVuZGVkIGVycm9yIG51bWJlcnMgKCIjbm5uICIpIGZyb20gZXJyb3IgYW5kIHdhcm5pbmcKKyAqIG1lc3NhZ2VzIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhlIGVycm9yIG9yIHdhcm5pbmcgaGFuZGxlci4KKyAqLworI2lmZGVmIFBOR19FUlJPUl9OVU1CRVJTX1NVUFBPUlRFRAorUE5HX0VYUE9SVCgxODUsIHZvaWQsIHBuZ19zZXRfc3RyaXBfZXJyb3JfbnVtYmVycywgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ191aW50XzMyIHN0cmlwX21vZGUpKTsKKyNlbmRpZgorCisvKiBBZGRlZCBpbiBsaWJwbmctMS4yLjYgKi8KKyNpZmRlZiBQTkdfU0VUX1VTRVJfTElNSVRTX1NVUFBPUlRFRAorUE5HX0VYUE9SVCgxODYsIHZvaWQsIHBuZ19zZXRfdXNlcl9saW1pdHMsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfdWludF8zMiB1c2VyX3dpZHRoX21heCwgcG5nX3VpbnRfMzIgdXNlcl9oZWlnaHRfbWF4KSk7CitQTkdfRVhQT1JUKDE4NywgcG5nX3VpbnRfMzIsIHBuZ19nZXRfdXNlcl93aWR0aF9tYXgsCisgICAgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyKSk7CitQTkdfRVhQT1JUKDE4OCwgcG5nX3VpbnRfMzIsIHBuZ19nZXRfdXNlcl9oZWlnaHRfbWF4LAorICAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikpOworLyogQWRkZWQgaW4gbGlicG5nLTEuNC4wICovCitQTkdfRVhQT1JUKDE4OSwgdm9pZCwgcG5nX3NldF9jaHVua19jYWNoZV9tYXgsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfdWludF8zMiB1c2VyX2NodW5rX2NhY2hlX21heCkpOworUE5HX0VYUE9SVCgxOTAsIHBuZ191aW50XzMyLCBwbmdfZ2V0X2NodW5rX2NhY2hlX21heCwKKyAgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpKTsKKy8qIEFkZGVkIGluIGxpYnBuZy0xLjQuMSAqLworUE5HX0VYUE9SVCgxOTEsIHZvaWQsIHBuZ19zZXRfY2h1bmtfbWFsbG9jX21heCwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19hbGxvY19zaXplX3QgdXNlcl9jaHVua19jYWNoZV9tYXgpKTsKK1BOR19FWFBPUlQoMTkyLCBwbmdfYWxsb2Nfc2l6ZV90LCBwbmdfZ2V0X2NodW5rX21hbGxvY19tYXgsCisgICAgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyKSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX0lOQ0hfQ09OVkVSU0lPTlNfU1VQUE9SVEVEKQorUE5HX0VYUE9SVCgxOTMsIHBuZ191aW50XzMyLCBwbmdfZ2V0X3BpeGVsc19wZXJfaW5jaCwKKyAgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpKTsKKworUE5HX0VYUE9SVCgxOTQsIHBuZ191aW50XzMyLCBwbmdfZ2V0X3hfcGl4ZWxzX3Blcl9pbmNoLAorICAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikpOworCitQTkdfRVhQT1JUKDE5NSwgcG5nX3VpbnRfMzIsIHBuZ19nZXRfeV9waXhlbHNfcGVyX2luY2gsCisgICAgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyKSk7CisKK1BOR19GUF9FWFBPUlQoMTk2LCBmbG9hdCwgcG5nX2dldF94X29mZnNldF9pbmNoZXMsCisgICAgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyKSkKKyNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVEIC8qIG90aGVyd2lzZSBub3QgaW1wbGVtZW50ZWQuICovCitQTkdfRklYRURfRVhQT1JUKDIxMSwgcG5nX2ZpeGVkX3BvaW50LCBwbmdfZ2V0X3hfb2Zmc2V0X2luY2hlc19maXhlZCwKKyAgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpKQorI2VuZGlmCisKK1BOR19GUF9FWFBPUlQoMTk3LCBmbG9hdCwgcG5nX2dldF95X29mZnNldF9pbmNoZXMsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyKSkKKyNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVEIC8qIG90aGVyd2lzZSBub3QgaW1wbGVtZW50ZWQuICovCitQTkdfRklYRURfRVhQT1JUKDIxMiwgcG5nX2ZpeGVkX3BvaW50LCBwbmdfZ2V0X3lfb2Zmc2V0X2luY2hlc19maXhlZCwKKyAgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpKQorI2VuZGlmCisKKyMgIGlmZGVmIFBOR19wSFlzX1NVUFBPUlRFRAorUE5HX0VYUE9SVCgxOTgsIHBuZ191aW50XzMyLCBwbmdfZ2V0X3BIWXNfZHBpLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgKnJlc194LCBwbmdfdWludF8zMiAqcmVzX3ksCisgICAgaW50ICp1bml0X3R5cGUpKTsKKyMgIGVuZGlmIC8qIHBIWXMgKi8KKyNlbmRpZiAgLyogSU5DSF9DT05WRVJTSU9OUyAqLworCisvKiBBZGRlZCBpbiBsaWJwbmctMS40LjAgKi8KKyNpZmRlZiBQTkdfSU9fU1RBVEVfU1VQUE9SVEVECitQTkdfRVhQT1JUKDE5OSwgcG5nX3VpbnRfMzIsIHBuZ19nZXRfaW9fc3RhdGUsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikpOworCisvKiBSZW1vdmVkIGZyb20gbGlicG5nIDEuNjsgdXNlIHBuZ19nZXRfaW9fY2h1bmtfdHlwZS4gKi8KK1BOR19SRU1PVkVEKDIwMCwgcG5nX2NvbnN0X2J5dGVwLCBwbmdfZ2V0X2lvX2NodW5rX25hbWUsIChwbmdfc3RydWN0cnAgcG5nX3B0ciksCisgICAgUE5HX0RFUFJFQ0FURUQpCisKK1BOR19FWFBPUlQoMjE2LCBwbmdfdWludF8zMiwgcG5nX2dldF9pb19jaHVua190eXBlLAorICAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikpOworCisvKiBUaGUgZmxhZ3MgcmV0dXJuZWQgYnkgcG5nX2dldF9pb19zdGF0ZSgpIGFyZSB0aGUgZm9sbG93aW5nOiAqLworIyAgZGVmaW5lIFBOR19JT19OT05FICAgICAgICAweDAwMDAgICAvKiBubyBJL08gYXQgdGhpcyBtb21lbnQgKi8KKyMgIGRlZmluZSBQTkdfSU9fUkVBRElORyAgICAgMHgwMDAxICAgLyogY3VycmVudGx5IHJlYWRpbmcgKi8KKyMgIGRlZmluZSBQTkdfSU9fV1JJVElORyAgICAgMHgwMDAyICAgLyogY3VycmVudGx5IHdyaXRpbmcgKi8KKyMgIGRlZmluZSBQTkdfSU9fU0lHTkFUVVJFICAgMHgwMDEwICAgLyogY3VycmVudGx5IGF0IHRoZSBmaWxlIHNpZ25hdHVyZSAqLworIyAgZGVmaW5lIFBOR19JT19DSFVOS19IRFIgICAweDAwMjAgICAvKiBjdXJyZW50bHkgYXQgdGhlIGNodW5rIGhlYWRlciAqLworIyAgZGVmaW5lIFBOR19JT19DSFVOS19EQVRBICAweDAwNDAgICAvKiBjdXJyZW50bHkgYXQgdGhlIGNodW5rIGRhdGEgKi8KKyMgIGRlZmluZSBQTkdfSU9fQ0hVTktfQ1JDICAgMHgwMDgwICAgLyogY3VycmVudGx5IGF0IHRoZSBjaHVuayBjcmMgKi8KKyMgIGRlZmluZSBQTkdfSU9fTUFTS19PUCAgICAgMHgwMDBmICAgLyogY3VycmVudCBvcGVyYXRpb246IHJlYWRpbmcvd3JpdGluZyAqLworIyAgZGVmaW5lIFBOR19JT19NQVNLX0xPQyAgICAweDAwZjAgICAvKiBjdXJyZW50IGxvY2F0aW9uOiBzaWcvaGRyL2RhdGEvY3JjICovCisjZW5kaWYgLyogSU9fU1RBVEUgKi8KKworLyogSW50ZXJsYWNlIHN1cHBvcnQuICBUaGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgYWx3YXlzIGRlZmluZWQgc28gdGhhdCBpZgorICogbGlicG5nIGludGVybGFjZSBoYW5kbGluZyBpcyB0dXJuZWQgb2ZmIHRoZSBtYWNyb3MgbWF5IGJlIHVzZWQgdG8gaGFuZGxlCisgKiBpbnRlcmxhY2VkIGltYWdlcyB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uLgorICovCisjZGVmaW5lIFBOR19JTlRFUkxBQ0VfQURBTTdfUEFTU0VTIDcKKworLyogVHdvIG1hY3JvcyB0byByZXR1cm4gdGhlIGZpcnN0IHJvdyBhbmQgZmlyc3QgY29sdW1uIG9mIHRoZSBvcmlnaW5hbCwKKyAqIGZ1bGwsIGltYWdlIHdoaWNoIGFwcGVhcnMgaW4gYSBnaXZlbiBwYXNzLiAgJ3Bhc3MnIGlzIGluIHRoZSByYW5nZSAwCisgKiB0byA2IGFuZCB0aGUgcmVzdWx0IGlzIGluIHRoZSByYW5nZSAwIHRvIDcuCisgKi8KKyNkZWZpbmUgUE5HX1BBU1NfU1RBUlRfUk9XKHBhc3MpICgoKDEmfihwYXNzKSk8PCgzLSgocGFzcyk+PjEpKSkmNykKKyNkZWZpbmUgUE5HX1BBU1NfU1RBUlRfQ09MKHBhc3MpICgoKDEmIChwYXNzKSk8PCgzLSgoKHBhc3MpKzEpPj4xKSkpJjcpCisKKy8qIEEgbWFjcm8gdG8gcmV0dXJuIHRoZSBvZmZzZXQgYmV0d2VlbiBwaXhlbHMgaW4gdGhlIG91dHB1dCByb3cgZm9yIGEgcGFpciBvZgorICogcGl4ZWxzIGluIHRoZSBpbnB1dCAtIGVmZmVjdGl2ZWx5IHRoZSBpbnZlcnNlIG9mIHRoZSAnQ09MX1NISUZUJyBtYWNybyB0aGF0CisgKiBmb2xsb3dzLiAgTm90ZSB0aGF0IFJPV19PRkZTRVQgaXMgdGhlIG9mZnNldCBmcm9tIG9uZSByb3cgdG8gdGhlIG5leHQgd2hlcmVhcworICogQ09MX09GRlNFVCBpcyBmcm9tIG9uZSBjb2x1bW4gdG8gdGhlIG5leHQsIHdpdGhpbiBhIHJvdy4KKyAqLworI2RlZmluZSBQTkdfUEFTU19ST1dfT0ZGU0VUKHBhc3MpICgocGFzcyk+Mj8oOD4+KCgocGFzcyktMSk+PjEpKTo4KQorI2RlZmluZSBQTkdfUEFTU19DT0xfT0ZGU0VUKHBhc3MpICgxPDwoKDctKHBhc3MpKT4+MSkpCisKKy8qIFR3byBtYWNyb3MgdG8gaGVscCBldmFsdWF0ZSB0aGUgbnVtYmVyIG9mIHJvd3Mgb3IgY29sdW1ucyBpbiBlYWNoCisgKiBwYXNzLiAgVGhpcyBpcyBleHByZXNzZWQgYXMgYSBzaGlmdCAtIGVmZmVjdGl2ZWx5IGxvZzIgb2YgdGhlIG51bWJlciBvcgorICogcm93cyBvciBjb2x1bW5zIGluIGVhY2ggOHg4IHRpbGUgb2YgdGhlIG9yaWdpbmFsIGltYWdlLgorICovCisjZGVmaW5lIFBOR19QQVNTX1JPV19TSElGVChwYXNzKSAoKHBhc3MpPjI/KDgtKHBhc3MpKT4+MTozKQorI2RlZmluZSBQTkdfUEFTU19DT0xfU0hJRlQocGFzcykgKChwYXNzKT4xPyg3LShwYXNzKSk+PjE6MykKKworLyogSGVuY2UgdHdvIG1hY3JvcyB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiByb3dzIG9yIGNvbHVtbnMgaW4gYSBnaXZlbgorICogcGFzcyBvZiBhbiBpbWFnZSBnaXZlbiBpdHMgaGVpZ2h0IG9yIHdpZHRoLiAgSW4gZmFjdCB0aGVzZSBtYWNyb3MgbWF5CisgKiByZXR1cm4gbm9uLXplcm8gZXZlbiB0aG91Z2ggdGhlIHN1Yi1pbWFnZSBpcyBlbXB0eSwgYmVjYXVzZSB0aGUgb3RoZXIKKyAqIGRpbWVuc2lvbiBtYXkgYmUgZW1wdHkgZm9yIGEgc21hbGwgaW1hZ2UuCisgKi8KKyNkZWZpbmUgUE5HX1BBU1NfUk9XUyhoZWlnaHQsIHBhc3MpICgoKGhlaWdodCkrKCgoMTw8UE5HX1BBU1NfUk9XX1NISUZUKHBhc3MpKVwKKyAgIC0xKS1QTkdfUEFTU19TVEFSVF9ST1cocGFzcykpKT4+UE5HX1BBU1NfUk9XX1NISUZUKHBhc3MpKQorI2RlZmluZSBQTkdfUEFTU19DT0xTKHdpZHRoLCBwYXNzKSAoKCh3aWR0aCkrKCgoMTw8UE5HX1BBU1NfQ09MX1NISUZUKHBhc3MpKVwKKyAgIC0xKS1QTkdfUEFTU19TVEFSVF9DT0wocGFzcykpKT4+UE5HX1BBU1NfQ09MX1NISUZUKHBhc3MpKQorCisvKiBGb3IgdGhlIHJlYWRlciByb3cgY2FsbGJhY2tzIChib3RoIHByb2dyZXNzaXZlIGFuZCBzZXF1ZW50aWFsKSBpdCBpcworICogbmVjZXNzYXJ5IHRvIGZpbmQgdGhlIHJvdyBpbiB0aGUgb3V0cHV0IGltYWdlIGdpdmVuIGEgcm93IGluIGFuIGludGVybGFjZWQKKyAqIGltYWdlLCBzbyB0d28gbW9yZSBtYWNyb3M6CisgKi8KKyNkZWZpbmUgUE5HX1JPV19GUk9NX1BBU1NfUk9XKHlfaW4sIHBhc3MpIFwKKyAgICgoKHlfaW4pPDxQTkdfUEFTU19ST1dfU0hJRlQocGFzcykpK1BOR19QQVNTX1NUQVJUX1JPVyhwYXNzKSkKKyNkZWZpbmUgUE5HX0NPTF9GUk9NX1BBU1NfQ09MKHhfaW4sIHBhc3MpIFwKKyAgICgoKHhfaW4pPDxQTkdfUEFTU19DT0xfU0hJRlQocGFzcykpK1BOR19QQVNTX1NUQVJUX0NPTChwYXNzKSkKKworLyogVHdvIG1hY3JvcyB3aGljaCByZXR1cm4gYSBib29sZWFuICgwIG9yIDEpIHNheWluZyB3aGV0aGVyIHRoZSBnaXZlbiByb3cKKyAqIG9yIGNvbHVtbiBpcyBpbiBhIHBhcnRpY3VsYXIgcGFzcy4gIFRoZXNlIHVzZSBhIGNvbW1vbiB1dGlsaXR5IG1hY3JvIHRoYXQKKyAqIHJldHVybnMgYSBtYXNrIGZvciBhIGdpdmVuIHBhc3MgLSB0aGUgb2Zmc2V0ICdvZmYnIHNlbGVjdHMgdGhlIHJvdyBvcgorICogY29sdW1uIHZlcnNpb24uICBUaGUgbWFzayBoYXMgdGhlIGFwcHJvcHJpYXRlIGJpdCBzZXQgZm9yIGVhY2ggY29sdW1uIGluCisgKiB0aGUgdGlsZS4KKyAqLworI2RlZmluZSBQTkdfUEFTU19NQVNLKHBhc3Msb2ZmKSAoIFwKKyAgICgoMHgxMTAxNDVBRj4+KCgoNy0ob2ZmKSktKHBhc3MpKTw8MikpICYgMHhGKSB8IFwKKyAgICgoMHgwMTE0NUFGMD4+KCgoNy0ob2ZmKSktKHBhc3MpKTw8MikpICYgMHhGMCkpCisKKyNkZWZpbmUgUE5HX1JPV19JTl9JTlRFUkxBQ0VfUEFTUyh5LCBwYXNzKSBcCisgICAoKFBOR19QQVNTX01BU0socGFzcywwKSA+PiAoKHkpJjcpKSAmIDEpCisjZGVmaW5lIFBOR19DT0xfSU5fSU5URVJMQUNFX1BBU1MoeCwgcGFzcykgXAorICAgKChQTkdfUEFTU19NQVNLKHBhc3MsMSkgPj4gKCh4KSY3KSkgJiAxKQorCisjaWZkZWYgUE5HX1JFQURfQ09NUE9TSVRFX05PRElWX1NVUFBPUlRFRAorLyogV2l0aCB0aGVzZSByb3V0aW5lcyB3ZSBhdm9pZCBhbiBpbnRlZ2VyIGRpdmlkZSwgd2hpY2ggd2lsbCBiZSBzbG93ZXIgb24KKyAqIG1vc3QgbWFjaGluZXMuICBIb3dldmVyLCBpdCBkb2VzIHRha2UgbW9yZSBvcGVyYXRpb25zIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcKKyAqIGRpdmlkZSBtZXRob2QsIHNvIGl0IG1heSBiZSBzbG93ZXIgb24gYSBmZXcgUklTQyBzeXN0ZW1zLiAgVGhlcmUgYXJlIHR3bworICogc2hpZnRzIChieSA4IG9yIDE2IGJpdHMpIGFuZCBhbiBhZGRpdGlvbiwgdmVyc3VzIGEgc2luZ2xlIGludGVnZXIgZGl2aWRlLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgcm91bmRpbmcgZmFjdG9ycyBhcmUgTk9UIHN1cHBvc2VkIHRvIGJlIHRoZSBzYW1lISAgMTI4IGFuZAorICogMzI3NjggYXJlIGNvcnJlY3QgZm9yIHRoZSBOT0RJViBjb2RlOyAxMjcgYW5kIDMyNzY3IGFyZSBjb3JyZWN0IGZvciB0aGUKKyAqIHN0YW5kYXJkIG1ldGhvZC4KKyAqCisgKiBbT3B0aW1pemVkIGNvZGUgYnkgR3JlZyBSb2Vsb2ZzIGFuZCBNYXJrIEFkbGVyLi4uYmxhbWUgdXMgZm9yIGJ1Z3MuIDotKSBdCisgKi8KKworIC8qIGZnIGFuZCBiZyBzaG91bGQgYmUgaW4gYGdhbW1hIDEuMCcgc3BhY2U7IGFscGhhIGlzIHRoZSBvcGFjaXR5ICovCisKKyMgIGRlZmluZSBwbmdfY29tcG9zaXRlKGNvbXBvc2l0ZSwgZmcsIGFscGhhLCBiZykgICAgICAgICBcCisgICAgIHsgcG5nX3VpbnRfMTYgdGVtcCA9IChwbmdfdWludF8xNikoKHBuZ191aW50XzE2KShmZykgXAorICAgICAgICAgICAqIChwbmdfdWludF8xNikoYWxwaGEpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgKyAocG5nX3VpbnRfMTYpKGJnKSoocG5nX3VpbnRfMTYpKDI1NSAgICAgICAgICBcCisgICAgICAgICAgIC0gKHBuZ191aW50XzE2KShhbHBoYSkpICsgMTI4KTsgICAgICAgICAgICAgICAgXAorICAgICAgIChjb21wb3NpdGUpID0gKHBuZ19ieXRlKSgoKHRlbXAgKyAodGVtcCA+PiA4KSkgPj4gOCkgJiAweGZmKTsgfQorCisjICBkZWZpbmUgcG5nX2NvbXBvc2l0ZV8xNihjb21wb3NpdGUsIGZnLCBhbHBoYSwgYmcpICAgICAgIFwKKyAgICAgeyBwbmdfdWludF8zMiB0ZW1wID0gKHBuZ191aW50XzMyKSgocG5nX3VpbnRfMzIpKGZnKSAgXAorICAgICAgICAgICAqIChwbmdfdWludF8zMikoYWxwaGEpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICsgKHBuZ191aW50XzMyKShiZykqKDY1NTM1ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgLSAocG5nX3VpbnRfMzIpKGFscGhhKSkgKyAzMjc2OCk7ICAgICAgICAgICAgICAgXAorICAgICAgIChjb21wb3NpdGUpID0gKHBuZ191aW50XzE2KSgweGZmZmYgJiAoKHRlbXAgKyAodGVtcCA+PiAxNikpID4+IDE2KSk7IH0KKworI2Vsc2UgIC8qIFN0YW5kYXJkIG1ldGhvZCB1c2luZyBpbnRlZ2VyIGRpdmlzaW9uICovCisKKyMgIGRlZmluZSBwbmdfY29tcG9zaXRlKGNvbXBvc2l0ZSwgZmcsIGFscGhhLCBiZykgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIChjb21wb3NpdGUpID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgKHBuZ19ieXRlKSgweGZmICYgKCgocG5nX3VpbnRfMTYpKGZnKSAqIChwbmdfdWludF8xNikoYWxwaGEpICsgIFwKKyAgICAgICAgIChwbmdfdWludF8xNikoYmcpICogKHBuZ191aW50XzE2KSgyNTUgLSAocG5nX3VpbnRfMTYpKGFscGhhKSkgKyBcCisgICAgICAgICAxMjcpIC8gMjU1KSkKKworIyAgZGVmaW5lIHBuZ19jb21wb3NpdGVfMTYoY29tcG9zaXRlLCBmZywgYWxwaGEsIGJnKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIChjb21wb3NpdGUpID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIChwbmdfdWludF8xNikoMHhmZmZmICYgKCgocG5nX3VpbnRfMzIpKGZnKSAqIChwbmdfdWludF8zMikoYWxwaGEpICsgXAorICAgICAgICAgKHBuZ191aW50XzMyKShiZykqKHBuZ191aW50XzMyKSg2NTUzNSAtIChwbmdfdWludF8zMikoYWxwaGEpKSArICAgICBcCisgICAgICAgICAzMjc2NykgLyA2NTUzNSkpCisjZW5kaWYgLyogUkVBRF9DT01QT1NJVEVfTk9ESVYgKi8KKworI2lmZGVmIFBOR19SRUFEX0lOVF9GVU5DVElPTlNfU1VQUE9SVEVECitQTkdfRVhQT1JUKDIwMSwgcG5nX3VpbnRfMzIsIHBuZ19nZXRfdWludF8zMiwgKHBuZ19jb25zdF9ieXRlcCBidWYpKTsKK1BOR19FWFBPUlQoMjAyLCBwbmdfdWludF8xNiwgcG5nX2dldF91aW50XzE2LCAocG5nX2NvbnN0X2J5dGVwIGJ1ZikpOworUE5HX0VYUE9SVCgyMDMsIHBuZ19pbnRfMzIsIHBuZ19nZXRfaW50XzMyLCAocG5nX2NvbnN0X2J5dGVwIGJ1ZikpOworI2VuZGlmCisKK1BOR19FWFBPUlQoMjA0LCBwbmdfdWludF8zMiwgcG5nX2dldF91aW50XzMxLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbnN0X2J5dGVwIGJ1ZikpOworLyogTm8gcG5nX2dldF9pbnRfMTYgLS0gbWF5IGJlIGFkZGVkIGlmIHRoZXJlJ3MgYSByZWFsIG5lZWQgZm9yIGl0LiAqLworCisvKiBQbGFjZSBhIDMyLWJpdCBudW1iZXIgaW50byBhIGJ1ZmZlciBpbiBQTkcgYnl0ZSBvcmRlciAoYmlnLWVuZGlhbikuICovCisjaWZkZWYgUE5HX1dSSVRFX0lOVF9GVU5DVElPTlNfU1VQUE9SVEVECitQTkdfRVhQT1JUKDIwNSwgdm9pZCwgcG5nX3NhdmVfdWludF8zMiwgKHBuZ19ieXRlcCBidWYsIHBuZ191aW50XzMyIGkpKTsKKyNlbmRpZgorI2lmZGVmIFBOR19TQVZFX0lOVF8zMl9TVVBQT1JURUQKK1BOR19FWFBPUlQoMjA2LCB2b2lkLCBwbmdfc2F2ZV9pbnRfMzIsIChwbmdfYnl0ZXAgYnVmLCBwbmdfaW50XzMyIGkpKTsKKyNlbmRpZgorCisvKiBQbGFjZSBhIDE2LWJpdCBudW1iZXIgaW50byBhIGJ1ZmZlciBpbiBQTkcgYnl0ZSBvcmRlci4KKyAqIFRoZSBwYXJhbWV0ZXIgaXMgZGVjbGFyZWQgdW5zaWduZWQgaW50LCBub3QgcG5nX3VpbnRfMTYsCisgKiBqdXN0IHRvIGF2b2lkIHBvdGVudGlhbCBwcm9ibGVtcyBvbiBwcmUtQU5TSSBDIGNvbXBpbGVycy4KKyAqLworI2lmZGVmIFBOR19XUklURV9JTlRfRlVOQ1RJT05TX1NVUFBPUlRFRAorUE5HX0VYUE9SVCgyMDcsIHZvaWQsIHBuZ19zYXZlX3VpbnRfMTYsIChwbmdfYnl0ZXAgYnVmLCB1bnNpZ25lZCBpbnQgaSkpOworLyogTm8gcG5nX3NhdmVfaW50XzE2IC0tIG1heSBiZSBhZGRlZCBpZiB0aGVyZSdzIGEgcmVhbCBuZWVkIGZvciBpdC4gKi8KKyNlbmRpZgorCisjaWZkZWYgUE5HX1VTRV9SRUFEX01BQ1JPUworLyogSW5saW5lIG1hY3JvcyB0byBkbyBkaXJlY3QgcmVhZHMgb2YgYnl0ZXMgZnJvbSB0aGUgaW5wdXQgYnVmZmVyLgorICogVGhlIHBuZ19nZXRfaW50XzMyKCkgcm91dGluZSBhc3N1bWVzIHdlIGFyZSB1c2luZyB0d28ncyBjb21wbGVtZW50CisgKiBmb3JtYXQgZm9yIG5lZ2F0aXZlIHZhbHVlcywgd2hpY2ggaXMgYWxtb3N0IGNlcnRhaW5seSB0cnVlLgorICovCisjICBkZWZpbmUgUE5HX2dldF91aW50XzMyKGJ1ZikgXAorICAgICAoKChwbmdfdWludF8zMikoKihidWYpKSA8PCAyNCkgKyBcCisgICAgICAoKHBuZ191aW50XzMyKSgqKChidWYpICsgMSkpIDw8IDE2KSArIFwKKyAgICAgICgocG5nX3VpbnRfMzIpKCooKGJ1ZikgKyAyKSkgPDwgOCkgKyBcCisgICAgICAoKHBuZ191aW50XzMyKSgqKChidWYpICsgMykpKSkKKworICAgLyogRnJvbSBsaWJwbmctMS40LjAgdW50aWwgMS40LjQsIHRoZSBwbmdfZ2V0X3VpbnRfMTYgbWFjcm8gKGJ1dCBub3QgdGhlCisgICAgKiBmdW5jdGlvbikgaW5jb3JyZWN0bHkgcmV0dXJuZWQgYSB2YWx1ZSBvZiB0eXBlIHBuZ191aW50XzMyLgorICAgICovCisjICBkZWZpbmUgUE5HX2dldF91aW50XzE2KGJ1ZikgXAorICAgICAoKHBuZ191aW50XzE2KSBcCisgICAgICAoKCh1bnNpZ25lZCBpbnQpKCooYnVmKSkgPDwgOCkgKyBcCisgICAgICAgKCh1bnNpZ25lZCBpbnQpKCooKGJ1ZikgKyAxKSkpKSkKKworIyAgZGVmaW5lIFBOR19nZXRfaW50XzMyKGJ1ZikgXAorICAgICAoKHBuZ19pbnRfMzIpKCgqKGJ1ZikgJiAweDgwKSBcCisgICAgICA/IC0oKHBuZ19pbnRfMzIpKCgocG5nX2dldF91aW50XzMyKGJ1ZileMHhmZmZmZmZmZlUpKzFVKSYweDdmZmZmZmZmVSkpIFwKKyAgICAgIDogKHBuZ19pbnRfMzIpcG5nX2dldF91aW50XzMyKGJ1ZikpKQorCisgICAvKiBJZiBQTkdfUFJFRklYIGlzIGRlZmluZWQgdGhlIHNhbWUgdGhpbmcgYXMgYmVsb3cgaGFwcGVucyBpbiBwbmdsaWJjb25mLmgsCisgICAgKiBidXQgZGVmaW5pbmcgYSBtYWNybyBuYW1lIHByZWZpeGVkIHdpdGggUE5HX1BSRUZJWC4KKyAgICAqLworIyAgaWZuZGVmIFBOR19QUkVGSVgKKyMgICAgIGRlZmluZSBwbmdfZ2V0X3VpbnRfMzIoYnVmKSBQTkdfZ2V0X3VpbnRfMzIoYnVmKQorIyAgICAgZGVmaW5lIHBuZ19nZXRfdWludF8xNihidWYpIFBOR19nZXRfdWludF8xNihidWYpCisjICAgICBkZWZpbmUgcG5nX2dldF9pbnRfMzIoYnVmKSAgUE5HX2dldF9pbnRfMzIoYnVmKQorIyAgZW5kaWYKKyNlbHNlCisjICBpZmRlZiBQTkdfUFJFRklYCisgICAgICAvKiBObyBtYWNyb3M7IHJldmVydCB0byB0aGUgKHJlZGVmaW5lZCkgZnVuY3Rpb24gKi8KKyMgICAgIGRlZmluZSBQTkdfZ2V0X3VpbnRfMzIgKHBuZ19nZXRfdWludF8zMikKKyMgICAgIGRlZmluZSBQTkdfZ2V0X3VpbnRfMTYgKHBuZ19nZXRfdWludF8xNikKKyMgICAgIGRlZmluZSBQTkdfZ2V0X2ludF8zMiAgKHBuZ19nZXRfaW50XzMyKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgUE5HX0NIRUNLX0ZPUl9JTlZBTElEX0lOREVYX1NVUFBPUlRFRAorUE5HX0VYUE9SVCgyNDIsIHZvaWQsIHBuZ19zZXRfY2hlY2tfZm9yX2ludmFsaWRfaW5kZXgsCisgICAgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgYWxsb3dlZCkpOworIyAgaWZkZWYgUE5HX0dFVF9QQUxFVFRFX01BWF9TVVBQT1JURUQKK1BOR19FWFBPUlQoMjQzLCBpbnQsIHBuZ19nZXRfcGFsZXR0ZV9tYXgsIChwbmdfY29uc3Rfc3RydWN0cCBwbmdfcHRyLAorICAgIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0cikpOworIyAgZW5kaWYKKyNlbmRpZiAvKiBDSEVDS19GT1JfSU5WQUxJRF9JTkRFWCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2VjdGlvbiA1OiBTSU1QTElGSUVEIEFQSQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBQbGVhc2UgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBpbiBsaWJwbmctbWFudWFsLnR4dCAoVE9ETzogd3JpdGUgc2FpZAorICogZG9jdW1lbnRhdGlvbikgaWYgeW91IGRvbid0IHVuZGVyc3RhbmQgd2hhdCBmb2xsb3dzLgorICoKKyAqIFRoZSBzaW1wbGlmaWVkIEFQSSBoaWRlcyB0aGUgZGV0YWlscyBvZiBib3RoIGxpYnBuZyBhbmQgdGhlIFBORyBmaWxlIGZvcm1hdAorICogaXRzZWxmLiAgSXQgYWxsb3dzIFBORyBmaWxlcyB0byBiZSByZWFkIGludG8gYSB2ZXJ5IGxpbWl0ZWQgbnVtYmVyIG9mCisgKiBpbi1tZW1vcnkgYml0bWFwIGZvcm1hdHMgb3IgdG8gYmUgd3JpdHRlbiBmcm9tIHRoZSBzYW1lIGZvcm1hdHMuICBJZiB0aGVzZQorICogZm9ybWF0cyBkbyBub3QgYWNjb21vZGF0ZSB5b3VyIG5lZWRzIHRoZW4geW91IGNhbiwgYW5kIHNob3VsZCwgdXNlIHRoZSBtb3JlCisgKiBzb3BoaXN0aWNhdGVkIEFQSXMgYWJvdmUgLSB0aGVzZSBzdXBwb3J0IGEgd2lkZSB2YXJpZXR5IG9mIGluLW1lbW9yeSBmb3JtYXRzCisgKiBhbmQgYSB3aWRlIHZhcmlldHkgb2Ygc29waGlzdGljYXRlZCB0cmFuc2Zvcm1hdGlvbnMgdG8gdGhvc2UgZm9ybWF0cyBhcyB3ZWxsCisgKiBhcyBhIHdpZGUgdmFyaWV0eSBvZiBBUElzIHRvIG1hbmlwdWxhdGUgYW5jaWxsYXJ5IGluZm9ybWF0aW9uLgorICoKKyAqIFRvIHJlYWQgYSBQTkcgZmlsZSB1c2luZyB0aGUgc2ltcGxpZmllZCBBUEk6CisgKgorICogMSkgRGVjbGFyZSBhICdwbmdfaW1hZ2UnIHN0cnVjdHVyZSAoc2VlIGJlbG93KSBvbiB0aGUgc3RhY2ssIHNldCB0aGUKKyAqICAgIHZlcnNpb24gZmllbGQgdG8gUE5HX0lNQUdFX1ZFUlNJT04gYW5kIHRoZSAnb3BhcXVlJyBwb2ludGVyIHRvIE5VTEwKKyAqICAgICh0aGlzIGlzIFJFUVVJUkVELCB5b3VyIHByb2dyYW0gbWF5IGNyYXNoIGlmIHlvdSBkb24ndCBkbyBpdC4pCisgKiAyKSBDYWxsIHRoZSBhcHByb3ByaWF0ZSBwbmdfaW1hZ2VfYmVnaW5fcmVhZC4uLiBmdW5jdGlvbi4KKyAqIDMpIFNldCB0aGUgcG5nX2ltYWdlICdmb3JtYXQnIG1lbWJlciB0byB0aGUgcmVxdWlyZWQgc2FtcGxlIGZvcm1hdC4KKyAqIDQpIEFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGUgaW1hZ2UgYW5kLCBpZiByZXF1aXJlZCwgdGhlIGNvbG9yLW1hcC4KKyAqIDUpIENhbGwgcG5nX2ltYWdlX2ZpbmlzaF9yZWFkIHRvIHJlYWQgdGhlIGltYWdlIGFuZCwgaWYgcmVxdWlyZWQsIHRoZQorICogICAgY29sb3ItbWFwIGludG8geW91ciBidWZmZXJzLgorICoKKyAqIFRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdGhlIGZvcm1hdCBvZiB0aGUgUE5HIGlucHV0IGl0c2VsZjsgYWxsIHZhbGlkCisgKiBjb2xvciB0eXBlcywgYml0IGRlcHRocywgYW5kIGludGVybGFjZSBtZXRob2RzIGFyZSBhY2NlcHRhYmxlLCBhbmQgdGhlCisgKiBpbnB1dCBpbWFnZSBpcyB0cmFuc2Zvcm1lZCBhcyBuZWNlc3NhcnkgdG8gdGhlIHJlcXVlc3RlZCBpbi1tZW1vcnkgZm9ybWF0CisgKiBkdXJpbmcgdGhlIHBuZ19pbWFnZV9maW5pc2hfcmVhZCgpIHN0ZXAuICBUaGUgb25seSBjYXZlYXQgaXMgdGhhdCBpZiB5b3UKKyAqIHJlcXVlc3QgYSBjb2xvci1tYXBwZWQgaW1hZ2UgZnJvbSBhIFBORyB0aGF0IGlzIGZ1bGwtY29sb3Igb3IgbWFrZXMKKyAqIGNvbXBsZXggdXNlIG9mIGFuIGFscGhhIGNoYW5uZWwgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIGV4dHJlbWVseSBsb3NzeSBhbmQgdGhlCisgKiByZXN1bHQgbWF5IGxvb2sgdGVycmlibGUuCisgKgorICogVG8gd3JpdGUgYSBQTkcgZmlsZSB1c2luZyB0aGUgc2ltcGxpZmllZCBBUEk6CisgKgorICogMSkgRGVjbGFyZSBhICdwbmdfaW1hZ2UnIHN0cnVjdHVyZSBvbiB0aGUgc3RhY2sgYW5kIG1lbXNldCgpIGl0IHRvIGFsbCB6ZXJvLgorICogMikgSW5pdGlhbGl6ZSB0aGUgbWVtYmVycyBvZiB0aGUgc3RydWN0dXJlIHRoYXQgZGVzY3JpYmUgdGhlIGltYWdlLCBzZXR0aW5nCisgKiAgICB0aGUgJ2Zvcm1hdCcgbWVtYmVyIHRvIHRoZSBmb3JtYXQgb2YgdGhlIGltYWdlIHNhbXBsZXMuCisgKiAzKSBDYWxsIHRoZSBhcHByb3ByaWF0ZSBwbmdfaW1hZ2Vfd3JpdGUuLi4gZnVuY3Rpb24gd2l0aCBhIHBvaW50ZXIgdG8gdGhlCisgKiAgICBpbWFnZSBhbmQsIGlmIG5lY2Vzc2FyeSwgdGhlIGNvbG9yLW1hcCB0byB3cml0ZSB0aGUgUE5HIGRhdGEuCisgKgorICogcG5nX2ltYWdlIGlzIGEgc3RydWN0dXJlIHRoYXQgZGVzY3JpYmVzIHRoZSBpbi1tZW1vcnkgZm9ybWF0IG9mIGFuIGltYWdlCisgKiB3aGVuIGl0IGlzIGJlaW5nIHJlYWQgb3IgZGVmaW5lcyB0aGUgaW4tbWVtb3J5IGZvcm1hdCBvZiBhbiBpbWFnZSB0aGF0IHlvdQorICogbmVlZCB0byB3cml0ZToKKyAqLworI2lmIGRlZmluZWQoUE5HX1NJTVBMSUZJRURfUkVBRF9TVVBQT1JURUQpIHx8IFwKKyAgICBkZWZpbmVkKFBOR19TSU1QTElGSUVEX1dSSVRFX1NVUFBPUlRFRCkKKworI2RlZmluZSBQTkdfSU1BR0VfVkVSU0lPTiAxCisKK3R5cGVkZWYgc3RydWN0IHBuZ19jb250cm9sICpwbmdfY29udHJvbHA7Cit0eXBlZGVmIHN0cnVjdAoreworICAgcG5nX2NvbnRyb2xwIG9wYXF1ZTsgICAgLyogSW5pdGlhbGl6ZSB0byBOVUxMLCBmcmVlIHdpdGggcG5nX2ltYWdlX2ZyZWUgKi8KKyAgIHBuZ191aW50XzMyICB2ZXJzaW9uOyAgIC8qIFNldCB0byBQTkdfSU1BR0VfVkVSU0lPTiAqLworICAgcG5nX3VpbnRfMzIgIHdpZHRoOyAgICAgLyogSW1hZ2Ugd2lkdGggaW4gcGl4ZWxzIChjb2x1bW5zKSAqLworICAgcG5nX3VpbnRfMzIgIGhlaWdodDsgICAgLyogSW1hZ2UgaGVpZ2h0IGluIHBpeGVscyAocm93cykgKi8KKyAgIHBuZ191aW50XzMyICBmb3JtYXQ7ICAgIC8qIEltYWdlIGZvcm1hdCBhcyBkZWZpbmVkIGJlbG93ICovCisgICBwbmdfdWludF8zMiAgZmxhZ3M7ICAgICAvKiBBIGJpdCBtYXNrIGNvbnRhaW5pbmcgaW5mb3JtYXRpb25hbCBmbGFncyAqLworICAgcG5nX3VpbnRfMzIgIGNvbG9ybWFwX2VudHJpZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY29sb3ItbWFwICovCisKKyAgIC8qIEluIHRoZSBldmVudCBvZiBhbiBlcnJvciBvciB3YXJuaW5nIHRoZSBmb2xsb3dpbmcgZmllbGQgd2lsbCBiZSBzZXQgdG8gYQorICAgICogbm9uLXplcm8gdmFsdWUgYW5kIHRoZSAnbWVzc2FnZScgZmllbGQgd2lsbCBjb250YWluIGEgJ1wwJyB0ZXJtaW5hdGVkCisgICAgKiBzdHJpbmcgd2l0aCB0aGUgbGlicG5nIGVycm9yIG9yIHdhcm5pbmcgbWVzc2FnZS4gIElmIGJvdGggd2FybmluZ3MgYW5kCisgICAgKiBhbiBlcnJvciB3ZXJlIGVuY291bnRlcmVkLCBvbmx5IHRoZSBlcnJvciBpcyByZWNvcmRlZC4gIElmIHRoZXJlCisgICAgKiBhcmUgbXVsdGlwbGUgd2FybmluZ3MsIG9ubHkgdGhlIGZpcnN0IG9uZSBpcyByZWNvcmRlZC4KKyAgICAqCisgICAgKiBUaGUgdXBwZXIgMzAgYml0cyBvZiB0aGlzIHZhbHVlIGFyZSByZXNlcnZlZCwgdGhlIGxvdyB0d28gYml0cyBjb250YWluCisgICAgKiBhIHZhbHVlIGFzIGZvbGxvd3M6CisgICAgKi8KKyMgIGRlZmluZSBQTkdfSU1BR0VfV0FSTklORyAxCisjICBkZWZpbmUgUE5HX0lNQUdFX0VSUk9SIDIKKyAgIC8qCisgICAgKiBUaGUgcmVzdWx0IGlzIGEgdHdvLWJpdCBjb2RlIHN1Y2ggdGhhdCBhIHZhbHVlIG1vcmUgdGhhbiAxIGluZGljYXRlcworICAgICogYSBmYWlsdXJlIGluIHRoZSBBUEkganVzdCBjYWxsZWQ6CisgICAgKgorICAgICogICAgMCAtIG5vIHdhcm5pbmcgb3IgZXJyb3IKKyAgICAqICAgIDEgLSB3YXJuaW5nCisgICAgKiAgICAyIC0gZXJyb3IKKyAgICAqICAgIDMgLSBlcnJvciBwcmVjZWRlZCBieSB3YXJuaW5nCisgICAgKi8KKyMgIGRlZmluZSBQTkdfSU1BR0VfRkFJTEVEKHBuZ19jbnRybCkgKCgoKHBuZ19jbnRybCkud2FybmluZ19vcl9lcnJvcikmMHgwMyk+MSkKKworICAgcG5nX3VpbnRfMzIgIHdhcm5pbmdfb3JfZXJyb3I7CisKKyAgIGNoYXIgICAgICAgICBtZXNzYWdlWzY0XTsKK30gcG5nX2ltYWdlLCAqcG5nX2ltYWdlcDsKKworLyogVGhlIHNhbXBsZXMgb2YgdGhlIGltYWdlIGhhdmUgb25lIHRvIGZvdXIgY2hhbm5lbHMgd2hvc2UgY29tcG9uZW50cyBoYXZlCisgKiBvcmlnaW5hbCB2YWx1ZXMgaW4gdGhlIHJhbmdlIDAgdG8gMS4wOgorICoKKyAqIDE6IEEgc2luZ2xlIGdyYXkgb3IgbHVtaW5hbmNlIGNoYW5uZWwgKEcpLgorICogMjogQSBncmF5L2x1bWluYW5jZSBjaGFubmVsIGFuZCBhbiBhbHBoYSBjaGFubmVsIChHQSkuCisgKiAzOiBUaHJlZSByZWQsIGdyZWVuLCBibHVlIGNvbG9yIGNoYW5uZWxzIChSR0IpLgorICogNDogVGhyZWUgY29sb3IgY2hhbm5lbHMgYW5kIGFuIGFscGhhIGNoYW5uZWwgKFJHQkEpLgorICoKKyAqIFRoZSBjb21wb25lbnRzIGFyZSBlbmNvZGVkIGluIG9uZSBvZiB0d28gd2F5czoKKyAqCisgKiBhKSBBcyBhIHNtYWxsIGludGVnZXIsIHZhbHVlIDAuLjI1NSwgY29udGFpbmVkIGluIGEgc2luZ2xlIGJ5dGUuICBGb3IgdGhlCisgKiBhbHBoYSBjaGFubmVsIHRoZSBvcmlnaW5hbCB2YWx1ZSBpcyBzaW1wbHkgdmFsdWUvMjU1LiAgRm9yIHRoZSBjb2xvciBvcgorICogbHVtaW5hbmNlIGNoYW5uZWxzIHRoZSB2YWx1ZSBpcyBlbmNvZGVkIGFjY29yZGluZyB0byB0aGUgc1JHQiBzcGVjaWZpY2F0aW9uCisgKiBhbmQgbWF0Y2hlcyB0aGUgOC1iaXQgZm9ybWF0IGV4cGVjdGVkIGJ5IHR5cGljYWwgZGlzcGxheSBkZXZpY2VzLgorICoKKyAqIFRoZSBjb2xvci9ncmF5IGNoYW5uZWxzIGFyZSBub3Qgc2NhbGVkIChwcmUtbXVsdGlwbGllZCkgYnkgdGhlIGFscGhhCisgKiBjaGFubmVsIGFuZCBhcmUgc3VpdGFibGUgZm9yIHBhc3NpbmcgdG8gY29sb3IgbWFuYWdlbWVudCBzb2Z0d2FyZS4KKyAqCisgKiBiKSBBcyBhIHZhbHVlIGluIHRoZSByYW5nZSAwLi42NTUzNSwgY29udGFpbmVkIGluIGEgMi1ieXRlIGludGVnZXIuICBBbGwKKyAqIGNoYW5uZWxzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gdGhlIG9yaWdpbmFsIHZhbHVlIGJ5IGRpdmlkaW5nIGJ5IDY1NTM1OyBhbGwKKyAqIGNoYW5uZWxzIGFyZSBsaW5lYXIuICBDb2xvciBjaGFubmVscyB1c2UgdGhlIFJHQiBlbmNvZGluZyAoUkdCIGVuZC1wb2ludHMpIG9mCisgKiB0aGUgc1JHQiBzcGVjaWZpY2F0aW9uLiAgVGhpcyBlbmNvZGluZyBpcyBpZGVudGlmaWVkIGJ5IHRoZQorICogUE5HX0ZPUk1BVF9GTEFHX0xJTkVBUiBmbGFnIGJlbG93LgorICoKKyAqIFdoZW4gdGhlIHNpbXBsaWZpZWQgQVBJIG5lZWRzIHRvIGNvbnZlcnQgYmV0d2VlbiBzUkdCIGFuZCBsaW5lYXIgY29sb3JzcGFjZXMsCisgKiB0aGUgYWN0dWFsIHNSR0IgdHJhbnNmZXIgY3VydmUgZGVmaW5lZCBpbiB0aGUgc1JHQiBzcGVjaWZpY2F0aW9uIChzZWUgdGhlCisgKiBhcnRpY2xlIGF0IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU1JHQikgaXMgdXNlZCwgbm90IHRoZSBnYW1tYT0xLzIuMgorICogYXBwcm94aW1hdGlvbiB1c2VkIGVsc2V3aGVyZSBpbiBsaWJwbmcuCisgKgorICogV2hlbiBhbiBhbHBoYSBjaGFubmVsIGlzIHByZXNlbnQgaXQgaXMgZXhwZWN0ZWQgdG8gZGVub3RlIHBpeGVsIGNvdmVyYWdlCisgKiBvZiB0aGUgY29sb3Igb3IgbHVtaW5hbmNlIGNoYW5uZWxzIGFuZCBpcyByZXR1cm5lZCBhcyBhbiBhc3NvY2lhdGVkIGFscGhhCisgKiBjaGFubmVsOiB0aGUgY29sb3IvZ3JheSBjaGFubmVscyBhcmUgc2NhbGVkIChwcmUtbXVsdGlwbGllZCkgYnkgdGhlIGFscGhhCisgKiB2YWx1ZS4KKyAqCisgKiBUaGUgc2FtcGxlcyBhcmUgZWl0aGVyIGNvbnRhaW5lZCBkaXJlY3RseSBpbiB0aGUgaW1hZ2UgZGF0YSwgYmV0d2VlbiAxIGFuZCA4CisgKiBieXRlcyBwZXIgcGl4ZWwgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZywgb3IgYXJlIGhlbGQgaW4gYSBjb2xvci1tYXAgaW5kZXhlZAorICogYnkgYnl0ZXMgaW4gdGhlIGltYWdlIGRhdGEuICBJbiB0aGUgY2FzZSBvZiBhIGNvbG9yLW1hcCB0aGUgY29sb3ItbWFwIGVudHJpZXMKKyAqIGFyZSBpbmRpdmlkdWFsIHNhbXBsZXMsIGVuY29kZWQgYXMgYWJvdmUsIGFuZCB0aGUgaW1hZ2UgZGF0YSBoYXMgb25lIGJ5dGUgcGVyCisgKiBwaXhlbCB0byBzZWxlY3QgdGhlIHJlbGV2YW50IHNhbXBsZSBmcm9tIHRoZSBjb2xvci1tYXAuCisgKi8KKworLyogUE5HX0ZPUk1BVF8qCisgKgorICogI2RlZmluZXMgdG8gYmUgdXNlZCBpbiBwbmdfaW1hZ2U6OmZvcm1hdC4gIEVhY2ggI2RlZmluZSBpZGVudGlmaWVzIGEKKyAqIHBhcnRpY3VsYXIgbGF5b3V0IG9mIHNhbXBsZSBkYXRhIGFuZCwgaWYgcHJlc2VudCwgYWxwaGEgdmFsdWVzLiAgVGhlcmUgYXJlCisgKiBzZXBhcmF0ZSBkZWZpbmVzIGZvciBlYWNoIG9mIHRoZSB0d28gY29tcG9uZW50IGVuY29kaW5ncy4KKyAqCisgKiBBIGZvcm1hdCBpcyBidWlsdCB1cCB1c2luZyBzaW5nbGUgYml0IGZsYWcgdmFsdWVzLiAgQWxsIGNvbWJpbmF0aW9ucyBhcmUKKyAqIHZhbGlkLiAgRm9ybWF0cyBjYW4gYmUgYnVpbHQgdXAgZnJvbSB0aGUgZmxhZyB2YWx1ZXMgb3IgeW91IGNhbiB1c2Ugb25lIG9mCisgKiB0aGUgcHJlZGVmaW5lZCB2YWx1ZXMgYmVsb3cuICBXaGVuIHRlc3RpbmcgZm9ybWF0cyBhbHdheXMgdXNlIHRoZSBGT1JNQVRfRkxBRworICogbWFjcm9zIHRvIHRlc3QgZm9yIGluZGl2aWR1YWwgZmVhdHVyZXMgLSBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnkgbWF5CisgKiBhZGQgbmV3IGZsYWdzLgorICoKKyAqIFdoZW4gcmVhZGluZyBvciB3cml0aW5nIGNvbG9yLW1hcHBlZCBpbWFnZXMgdGhlIGZvcm1hdCBzaG91bGQgYmUgc2V0IHRvIHRoZQorICogZm9ybWF0IG9mIHRoZSBlbnRyaWVzIGluIHRoZSBjb2xvci1tYXAgdGhlbiBwbmdfaW1hZ2Vfe3JlYWQsd3JpdGV9X2NvbG9ybWFwCisgKiBjYWxsZWQgdG8gcmVhZCBvciB3cml0ZSB0aGUgY29sb3ItbWFwIGFuZCBzZXQgdGhlIGZvcm1hdCBjb3JyZWN0bHkgZm9yIHRoZQorICogaW1hZ2UgZGF0YS4gIERvIG5vdCBzZXQgdGhlIFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCBiaXQgZGlyZWN0bHkhCisgKgorICogTk9URTogbGlicG5nIGNhbiBiZSBidWlsdCB3aXRoIHBhcnRpY3VsYXIgZmVhdHVyZXMgZGlzYWJsZWQuIElmIHlvdSBzZWUKKyAqIGNvbXBpbGVyIGVycm9ycyBiZWNhdXNlIHRoZSBkZWZpbml0aW9uIG9mIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZsYWdzIGhhcyBiZWVuCisgKiBjb21waWxlZCBvdXQgaXQgaXMgYmVjYXVzZSBsaWJwbmcgZG9lcyBub3QgaGF2ZSB0aGUgcmVxdWlyZWQgc3VwcG9ydC4gIEl0IGlzCisgKiBwb3NzaWJsZSwgaG93ZXZlciwgZm9yIHRoZSBsaWJwbmcgY29uZmlndXJhdGlvbiB0byBlbmFibGUgdGhlIGZvcm1hdCBvbiBqdXN0CisgKiByZWFkIG9yIGp1c3Qgd3JpdGU7IGluIHRoYXQgY2FzZSB5b3UgbWF5IHNlZSBhbiBlcnJvciBhdCBydW4gdGltZS4gIFlvdSBjYW4KKyAqIGd1YXJkIGFnYWluc3QgdGhpcyBieSBjaGVja2luZyBmb3IgdGhlIGRlZmluaXRpb24gb2YgdGhlIGFwcHJvcHJpYXRlCisgKiAiX1NVUFBPUlRFRCIgbWFjcm8sIG9uZSBvZjoKKyAqCisgKiAgICBQTkdfU0lNUExJRklFRF97UkVBRCxXUklURX1fe0JHUixBRklSU1R9X1NVUFBPUlRFRAorICovCisjZGVmaW5lIFBOR19GT1JNQVRfRkxBR19BTFBIQSAgICAweDAxVSAvKiBmb3JtYXQgd2l0aCBhbiBhbHBoYSBjaGFubmVsICovCisjZGVmaW5lIFBOR19GT1JNQVRfRkxBR19DT0xPUiAgICAweDAyVSAvKiBjb2xvciBmb3JtYXQ6IG90aGVyd2lzZSBncmF5c2NhbGUgKi8KKyNkZWZpbmUgUE5HX0ZPUk1BVF9GTEFHX0xJTkVBUiAgIDB4MDRVIC8qIDItYnl0ZSBjaGFubmVscyBlbHNlIDEtYnl0ZSAqLworI2RlZmluZSBQTkdfRk9STUFUX0ZMQUdfQ09MT1JNQVAgMHgwOFUgLyogaW1hZ2UgZGF0YSBpcyBjb2xvci1tYXBwZWQgKi8KKworI2lmZGVmIFBOR19GT1JNQVRfQkdSX1NVUFBPUlRFRAorIyAgZGVmaW5lIFBOR19GT1JNQVRfRkxBR19CR1IgICAgMHgxMFUgLyogQkdSIGNvbG9ycywgZWxzZSBvcmRlciBpcyBSR0IgKi8KKyNlbmRpZgorCisjaWZkZWYgUE5HX0ZPUk1BVF9BRklSU1RfU1VQUE9SVEVECisjICBkZWZpbmUgUE5HX0ZPUk1BVF9GTEFHX0FGSVJTVCAweDIwVSAvKiBhbHBoYSBjaGFubmVsIGNvbWVzIGZpcnN0ICovCisjZW5kaWYKKworLyogQ29tbW9ubHkgdXNlZCBmb3JtYXRzIGhhdmUgcHJlZGVmaW5lZCBtYWNyb3MuCisgKgorICogRmlyc3QgdGhlIHNpbmdsZSBieXRlIChzUkdCKSBmb3JtYXRzOgorICovCisjZGVmaW5lIFBOR19GT1JNQVRfR1JBWSAwCisjZGVmaW5lIFBOR19GT1JNQVRfR0EgICBQTkdfRk9STUFUX0ZMQUdfQUxQSEEKKyNkZWZpbmUgUE5HX0ZPUk1BVF9BRyAgIChQTkdfRk9STUFUX0dBfFBOR19GT1JNQVRfRkxBR19BRklSU1QpCisjZGVmaW5lIFBOR19GT1JNQVRfUkdCICBQTkdfRk9STUFUX0ZMQUdfQ09MT1IKKyNkZWZpbmUgUE5HX0ZPUk1BVF9CR1IgIChQTkdfRk9STUFUX0ZMQUdfQ09MT1J8UE5HX0ZPUk1BVF9GTEFHX0JHUikKKyNkZWZpbmUgUE5HX0ZPUk1BVF9SR0JBIChQTkdfRk9STUFUX1JHQnxQTkdfRk9STUFUX0ZMQUdfQUxQSEEpCisjZGVmaW5lIFBOR19GT1JNQVRfQVJHQiAoUE5HX0ZPUk1BVF9SR0JBfFBOR19GT1JNQVRfRkxBR19BRklSU1QpCisjZGVmaW5lIFBOR19GT1JNQVRfQkdSQSAoUE5HX0ZPUk1BVF9CR1J8UE5HX0ZPUk1BVF9GTEFHX0FMUEhBKQorI2RlZmluZSBQTkdfRk9STUFUX0FCR1IgKFBOR19GT1JNQVRfQkdSQXxQTkdfRk9STUFUX0ZMQUdfQUZJUlNUKQorCisvKiBUaGVuIHRoZSBsaW5lYXIgMi1ieXRlIGZvcm1hdHMuICBXaGVuIG5hbWluZyB0aGVzZSAiWSIgaXMgdXNlZCB0bworICogaW5kaWNhdGUgYSBsdW1pbmFuY2UgKGdyYXkpIGNoYW5uZWwuCisgKi8KKyNkZWZpbmUgUE5HX0ZPUk1BVF9MSU5FQVJfWSBQTkdfRk9STUFUX0ZMQUdfTElORUFSCisjZGVmaW5lIFBOR19GT1JNQVRfTElORUFSX1lfQUxQSEEgKFBOR19GT1JNQVRfRkxBR19MSU5FQVJ8UE5HX0ZPUk1BVF9GTEFHX0FMUEhBKQorI2RlZmluZSBQTkdfRk9STUFUX0xJTkVBUl9SR0IgKFBOR19GT1JNQVRfRkxBR19MSU5FQVJ8UE5HX0ZPUk1BVF9GTEFHX0NPTE9SKQorI2RlZmluZSBQTkdfRk9STUFUX0xJTkVBUl9SR0JfQUxQSEEgXAorICAgKFBOR19GT1JNQVRfRkxBR19MSU5FQVJ8UE5HX0ZPUk1BVF9GTEFHX0NPTE9SfFBOR19GT1JNQVRfRkxBR19BTFBIQSkKKworLyogV2l0aCBjb2xvci1tYXBwZWQgZm9ybWF0cyB0aGUgaW1hZ2UgZGF0YSBpcyBvbmUgYnl0ZSBmb3IgZWFjaCBwaXhlbCwgdGhlIGJ5dGUKKyAqIGlzIGFuIGluZGV4IGludG8gdGhlIGNvbG9yLW1hcCB3aGljaCBpcyBmb3JtYXR0ZWQgYXMgYWJvdmUuICBUbyBvYnRhaW4gYQorICogY29sb3ItbWFwcGVkIGZvcm1hdCBpdCBpcyBzdWZmaWNpZW50IGp1c3QgdG8gYWRkIHRoZSBQTkdfRk9NQVRfRkxBR19DT0xPUk1BUAorICogdG8gb25lIG9mIHRoZSBhYm92ZSBkZWZpbml0aW9ucywgb3IgeW91IGNhbiB1c2Ugb25lIG9mIHRoZSBkZWZpbml0aW9ucyBiZWxvdy4KKyAqLworI2RlZmluZSBQTkdfRk9STUFUX1JHQl9DT0xPUk1BUCAgKFBOR19GT1JNQVRfUkdCfFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCkKKyNkZWZpbmUgUE5HX0ZPUk1BVF9CR1JfQ09MT1JNQVAgIChQTkdfRk9STUFUX0JHUnxQTkdfRk9STUFUX0ZMQUdfQ09MT1JNQVApCisjZGVmaW5lIFBOR19GT1JNQVRfUkdCQV9DT0xPUk1BUCAoUE5HX0ZPUk1BVF9SR0JBfFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCkKKyNkZWZpbmUgUE5HX0ZPUk1BVF9BUkdCX0NPTE9STUFQIChQTkdfRk9STUFUX0FSR0J8UE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQKQorI2RlZmluZSBQTkdfRk9STUFUX0JHUkFfQ09MT1JNQVAgKFBOR19GT1JNQVRfQkdSQXxQTkdfRk9STUFUX0ZMQUdfQ09MT1JNQVApCisjZGVmaW5lIFBOR19GT1JNQVRfQUJHUl9DT0xPUk1BUCAoUE5HX0ZPUk1BVF9BQkdSfFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCkKKworLyogUE5HX0lNQUdFIG1hY3JvcworICoKKyAqIFRoZXNlIGFyZSBjb252ZW5pZW5jZSBtYWNyb3MgdG8gZGVyaXZlIGluZm9ybWF0aW9uIGZyb20gYSBwbmdfaW1hZ2UKKyAqIHN0cnVjdHVyZS4gIFRoZSBQTkdfSU1BR0VfU0FNUExFXyBtYWNyb3MgcmV0dXJuIHZhbHVlcyBhcHByb3ByaWF0ZSB0byB0aGUKKyAqIGFjdHVhbCBpbWFnZSBzYW1wbGUgdmFsdWVzIC0gZWl0aGVyIHRoZSBlbnRyaWVzIGluIHRoZSBjb2xvci1tYXAgb3IgdGhlCisgKiBwaXhlbHMgaW4gdGhlIGltYWdlLiAgVGhlIFBOR19JTUFHRV9QSVhFTF8gbWFjcm9zIHJldHVybiBjb3JyZXNwb25kaW5nIHZhbHVlcworICogZm9yIHRoZSBwaXhlbHMgYW5kIHdpbGwgYWx3YXlzIHJldHVybiAxIGZvciBjb2xvci1tYXBwZWQgZm9ybWF0cy4gIFRoZQorICogcmVtYWluaW5nIG1hY3JvcyByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJvd3MgaW4gdGhlIGltYWdlIGFuZCB0aGUKKyAqIGNvbXBsZXRlIGltYWdlLgorICoKKyAqIE5PVEU6IEFsbCB0aGUgbWFjcm9zIHRoYXQgdGFrZSBhIHBuZ19pbWFnZTo6Zm9ybWF0IHBhcmFtZXRlciBhcmUgY29tcGlsZSB0aW1lCisgKiBjb25zdGFudHMgaWYgdGhlIGZvcm1hdCBwYXJhbWV0ZXIgaXMsIGl0c2VsZiwgYSBjb25zdGFudC4gIFRoZXJlZm9yZSB0aGVzZQorICogbWFjcm9zIGNhbiBiZSB1c2VkIGluIGFycmF5IGRlY2xhcmF0aW9ucyBhbmQgY2FzZSBsYWJlbHMgd2hlcmUgcmVxdWlyZWQuCisgKiBTaW1pbGFybHkgdGhlIG1hY3JvcyBhcmUgYWxzbyBwcmUtcHJvY2Vzc29yIGNvbnN0YW50cyAoc2l6ZW9mIGlzIG5vdCB1c2VkKSBzbworICogdGhleSBjYW4gYmUgdXNlZCBpbiAjaWYgdGVzdHMuCisgKgorICogRmlyc3QgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzYW1wbGVzLgorICovCisjZGVmaW5lIFBOR19JTUFHRV9TQU1QTEVfQ0hBTk5FTFMoZm10KVwKKyAgICgoKGZtdCkmKFBOR19GT1JNQVRfRkxBR19DT0xPUnxQTkdfRk9STUFUX0ZMQUdfQUxQSEEpKSsxKQorICAgLyogUmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgY2hhbm5lbHMgaW4gYSBnaXZlbiBmb3JtYXQ6IDEuLjQgKi8KKworI2RlZmluZSBQTkdfSU1BR0VfU0FNUExFX0NPTVBPTkVOVF9TSVpFKGZtdClcCisgICAoKCgoZm10KSAmIFBOR19GT1JNQVRfRkxBR19MSU5FQVIpID4+IDIpKzEpCisgICAvKiBSZXR1cm4gdGhlIHNpemUgaW4gYnl0ZXMgb2YgYSBzaW5nbGUgY29tcG9uZW50IG9mIGEgcGl4ZWwgb3IgY29sb3ItbWFwCisgICAgKiBlbnRyeSAoYXMgYXBwcm9wcmlhdGUpIGluIHRoZSBpbWFnZTogMSBvciAyLgorICAgICovCisKKyNkZWZpbmUgUE5HX0lNQUdFX1NBTVBMRV9TSVpFKGZtdClcCisgICAoUE5HX0lNQUdFX1NBTVBMRV9DSEFOTkVMUyhmbXQpICogUE5HX0lNQUdFX1NBTVBMRV9DT01QT05FTlRfU0laRShmbXQpKQorICAgLyogVGhpcyBpcyB0aGUgc2l6ZSBvZiB0aGUgc2FtcGxlIGRhdGEgZm9yIG9uZSBzYW1wbGUuICBJZiB0aGUgaW1hZ2UgaXMKKyAgICAqIGNvbG9yLW1hcHBlZCBpdCBpcyB0aGUgc2l6ZSBvZiBvbmUgY29sb3ItbWFwIGVudHJ5IChhbmQgaW1hZ2UgcGl4ZWxzIGFyZQorICAgICogb25lIGJ5dGUgaW4gc2l6ZSksIG90aGVyd2lzZSBpdCBpcyB0aGUgc2l6ZSBvZiBvbmUgaW1hZ2UgcGl4ZWwuCisgICAgKi8KKworI2RlZmluZSBQTkdfSU1BR0VfTUFYSU1VTV9DT0xPUk1BUF9DT01QT05FTlRTKGZtdClcCisgICAoUE5HX0lNQUdFX1NBTVBMRV9DSEFOTkVMUyhmbXQpICogMjU2KQorICAgLyogVGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY29sb3ItbWFwIHJlcXVpcmVkIGJ5IHRoZSBmb3JtYXQgZXhwcmVzc2VkIGluIGEKKyAgICAqIGNvdW50IG9mIGNvbXBvbmVudHMuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGNvbXBpbGUtdGltZSBhbGxvY2F0ZSBhCisgICAgKiBjb2xvci1tYXA6CisgICAgKgorICAgICogcG5nX3VpbnRfMTYgY29sb3JtYXBbUE5HX0lNQUdFX01BWElNVU1fQ09MT1JNQVBfQ09NUE9ORU5UUyhsaW5lYXJfZm10KV07CisgICAgKgorICAgICogcG5nX2J5dGUgY29sb3JtYXBbUE5HX0lNQUdFX01BWElNVU1fQ09MT1JNQVBfQ09NUE9ORU5UUyhzUkdCX2ZtdCldOworICAgICoKKyAgICAqIEFsdGVybmF0aXZlbHkgdXNlIHRoZSBQTkdfSU1BR0VfQ09MT1JNQVBfU0laRSBtYWNybyBiZWxvdyB0byB1c2UgdGhlCisgICAgKiBpbmZvcm1hdGlvbiBmcm9tIG9uZSBvZiB0aGUgcG5nX2ltYWdlX2JlZ2luX3JlYWRfIEFQSXMgYW5kIGR5bmFtaWNhbGx5CisgICAgKiBhbGxvY2F0ZSB0aGUgcmVxdWlyZWQgbWVtb3J5LgorICAgICovCisKKy8qIENvcnJlc3BvbmRpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBpeGVscyAqLworI2RlZmluZSBQTkdfSU1BR0VfUElYRUxfKHRlc3QsZm10KVwKKyAgICgoKGZtdCkmUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQKT8xOnRlc3QoZm10KSkKKworI2RlZmluZSBQTkdfSU1BR0VfUElYRUxfQ0hBTk5FTFMoZm10KVwKKyAgIFBOR19JTUFHRV9QSVhFTF8oUE5HX0lNQUdFX1NBTVBMRV9DSEFOTkVMUyxmbXQpCisgICAvKiBUaGUgbnVtYmVyIG9mIHNlcGFyYXRlIGNoYW5uZWxzIChjb21wb25lbnRzKSBpbiBhIHBpeGVsOyAxIGZvciBhCisgICAgKiBjb2xvci1tYXBwZWQgaW1hZ2UuCisgICAgKi8KKworI2RlZmluZSBQTkdfSU1BR0VfUElYRUxfQ09NUE9ORU5UX1NJWkUoZm10KVwKKyAgIFBOR19JTUFHRV9QSVhFTF8oUE5HX0lNQUdFX1NBTVBMRV9DT01QT05FTlRfU0laRSxmbXQpCisgICAvKiBUaGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIGVhY2ggY29tcG9uZW50IGluIGEgcGl4ZWw7IDEgZm9yIGEgY29sb3ItbWFwcGVkCisgICAgKiBpbWFnZS4KKyAgICAqLworCisjZGVmaW5lIFBOR19JTUFHRV9QSVhFTF9TSVpFKGZtdCkgUE5HX0lNQUdFX1BJWEVMXyhQTkdfSU1BR0VfU0FNUExFX1NJWkUsZm10KQorICAgLyogVGhlIHNpemUsIGluIGJ5dGVzLCBvZiBhIGNvbXBsZXRlIHBpeGVsOyAxIGZvciBhIGNvbG9yLW1hcHBlZCBpbWFnZS4gKi8KKworLyogSW5mb3JtYXRpb24gYWJvdXQgdGhlIHdob2xlIHJvdywgb3Igd2hvbGUgaW1hZ2UgKi8KKyNkZWZpbmUgUE5HX0lNQUdFX1JPV19TVFJJREUoaW1hZ2UpXAorICAgKFBOR19JTUFHRV9QSVhFTF9DSEFOTkVMUygoaW1hZ2UpLmZvcm1hdCkgKiAoaW1hZ2UpLndpZHRoKQorICAgLyogUmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgY29tcG9uZW50cyBpbiBhIHNpbmdsZSByb3cgb2YgdGhlIGltYWdlOyB0aGlzCisgICAgKiBpcyB0aGUgbWluaW11bSAncm93IHN0cmlkZScsIHRoZSBtaW5pbXVtIGNvdW50IG9mIGNvbXBvbmVudHMgYmV0d2VlbiBlYWNoCisgICAgKiByb3cuICBGb3IgYSBjb2xvci1tYXBwZWQgaW1hZ2UgdGhpcyBpcyB0aGUgbWluaW11bSBudW1iZXIgb2YgYnl0ZXMgaW4gYQorICAgICogcm93LgorICAgICovCisKKyNkZWZpbmUgUE5HX0lNQUdFX0JVRkZFUl9TSVpFKGltYWdlLCByb3dfc3RyaWRlKVwKKyAgIChQTkdfSU1BR0VfUElYRUxfQ09NUE9ORU5UX1NJWkUoKGltYWdlKS5mb3JtYXQpKihpbWFnZSkuaGVpZ2h0Kihyb3dfc3RyaWRlKSkKKyAgIC8qIFJldHVybiB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIGFuIGltYWdlIGJ1ZmZlciBnaXZlbiBhIHBuZ19pbWFnZSBhbmQgYSByb3cKKyAgICAqIHN0cmlkZSAtIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyB0byBsZWF2ZSBzcGFjZSBmb3IgaW4gZWFjaCByb3cuCisgICAgKi8KKworI2RlZmluZSBQTkdfSU1BR0VfU0laRShpbWFnZSlcCisgICBQTkdfSU1BR0VfQlVGRkVSX1NJWkUoaW1hZ2UsIFBOR19JTUFHRV9ST1dfU1RSSURFKGltYWdlKSkKKyAgIC8qIFJldHVybiB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBpbWFnZSBpbiBtZW1vcnkgZ2l2ZW4ganVzdCBhIHBuZ19pbWFnZTsKKyAgICAqIHRoZSByb3cgc3RyaWRlIGlzIHRoZSBtaW5pbXVtIHN0cmlkZSByZXF1aXJlZCBmb3IgdGhlIGltYWdlLgorICAgICovCisKKyNkZWZpbmUgUE5HX0lNQUdFX0NPTE9STUFQX1NJWkUoaW1hZ2UpXAorICAgKFBOR19JTUFHRV9TQU1QTEVfU0laRSgoaW1hZ2UpLmZvcm1hdCkgKiAoaW1hZ2UpLmNvbG9ybWFwX2VudHJpZXMpCisgICAvKiBSZXR1cm4gdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgY29sb3ItbWFwIG9mIHRoaXMgaW1hZ2UuICBJZiB0aGUgaW1hZ2UKKyAgICAqIGZvcm1hdCBpcyBub3QgYSBjb2xvci1tYXAgZm9ybWF0IHRoaXMgd2lsbCByZXR1cm4gYSBzaXplIHN1ZmZpY2llbnQgZm9yCisgICAgKiAyNTYgZW50cmllcyBpbiB0aGUgZ2l2ZW4gZm9ybWF0OyBjaGVjayBQTkdfRk9STUFUX0ZMQUdfQ09MT1JNQVAgaWYKKyAgICAqIHlvdSBkb24ndCB3YW50IHRvIGFsbG9jYXRlIGEgY29sb3ItbWFwIGluIHRoaXMgY2FzZS4KKyAgICAqLworCisvKiBQTkdfSU1BR0VfRkxBR18qCisgKgorICogRmxhZ3MgY29udGFpbmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbWFnZSBhcmUgaGVsZCBpbiB0aGUKKyAqICdmbGFncycgZmllbGQgb2YgcG5nX2ltYWdlLgorICovCisjZGVmaW5lIFBOR19JTUFHRV9GTEFHX0NPTE9SU1BBQ0VfTk9UX3NSR0IgMHgwMQorICAgLyogVGhpcyBpbmRpY2F0ZXMgdGhlIHRoZSBSR0IgdmFsdWVzIG9mIHRoZSBpbi1tZW1vcnkgYml0bWFwIGRvIG5vdAorICAgICogY29ycmVzcG9uZCB0byB0aGUgcmVkLCBncmVlbiBhbmQgYmx1ZSBlbmQtcG9pbnRzIGRlZmluZWQgYnkgc1JHQi4KKyAgICAqLworCisjZGVmaW5lIFBOR19JTUFHRV9GTEFHX0ZBU1QgMHgwMgorICAgLyogT24gd3JpdGUgZW1waGFzaXNlIHNwZWVkIG92ZXIgY29tcHJlc3Npb247IHRoZSByZXN1bHRhbnQgUE5HIGZpbGUgd2lsbCBiZQorICAgICogbGFyZ2VyIGJ1dCB3aWxsIGJlIHByb2R1Y2VkIHNpZ25pZmljYW50bHkgZmFzdGVyLCBwYXJ0aWN1bGFyIGZvciBsYXJnZQorICAgICogaW1hZ2VzLiAgRG8gbm90IHVzZSB0aGlzIG9wdGlvbiBmb3IgaW1hZ2VzIHdoaWNoIHdpbGwgYmUgZGlzdHJpYnV0ZWQsIG9ubHkKKyAgICAqIHVzZWQgaXQgd2hlbiBwcm9kdWNpbmcgaW50ZXJtZWRpYXRlIGZpbGVzIHRoYXQgd2lsbCBiZSByZWFkIGJhY2sgaW4KKyAgICAqIHJlcGVhdGVkbHkuICBGb3IgYSB0eXBpY2FsIDI0LWJpdCBpbWFnZSB0aGUgb3B0aW9uIHdpbGwgZG91YmxlIHRoZSByZWFkCisgICAgKiBzcGVlZCBhdCB0aGUgY29zdCBvZiBpbmNyZWFzaW5nIHRoZSBpbWFnZSBzaXplIGJ5IDI1JSwgaG93ZXZlciBmb3IgbWFueQorICAgICogbW9yZSBjb21wcmVzc2libGUgaW1hZ2VzIHRoZSBQTkcgZmlsZSBjYW4gYmUgMTAgdGltZXMgbGFyZ2VyIHdpdGggb25seSBhCisgICAgKiBzbGlnaHQgc3BlZWQgZ2Fpbi4KKyAgICAqLworCisjZGVmaW5lIFBOR19JTUFHRV9GTEFHXzE2QklUX3NSR0IgMHgwNAorICAgLyogT24gcmVhZCBpZiB0aGUgaW1hZ2UgaXMgYSAxNi1iaXQgcGVyIGNvbXBvbmVudCBpbWFnZSBhbmQgdGhlcmUgaXMgbm8gZ0FNQQorICAgICogb3Igc1JHQiBjaHVuayBhc3N1bWUgdGhhdCB0aGUgY29tcG9uZW50cyBhcmUgc1JHQiBlbmNvZGVkLiAgTm90aWNlIHRoYXQKKyAgICAqIGltYWdlcyBvdXRwdXQgYnkgdGhlIHNpbXBsaWZpZWQgQVBJIGFsd2F5cyBoYXZlIGdhbW1hIGluZm9ybWF0aW9uOyBzZXR0aW5nCisgICAgKiB0aGlzIGZsYWcgb25seSBhZmZlY3RzIHRoZSBpbnRlcnByZXRhdGlvbiBvZiAxNi1iaXQgaW1hZ2VzIGZyb20gYW4KKyAgICAqIGV4dGVybmFsIHNvdXJjZS4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGV4cG9zZSB0aGlzIGZsYWcKKyAgICAqIHRvIHRoZSB1c2VyOyB0aGUgdXNlciBjYW4gbm9ybWFsbHkgZWFzaWx5IHJlY29nbml6ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCisgICAgKiBsaW5lYXIgYW5kIHNSR0IgZW5jb2RpbmcuICBUaGlzIGZsYWcgaGFzIG5vIGVmZmVjdCBvbiB3cml0ZSAtIHRoZSBkYXRhCisgICAgKiBwYXNzZWQgdG8gdGhlIHdyaXRlIEFQSXMgbXVzdCBoYXZlIHRoZSBjb3JyZWN0IGVuY29kaW5nIChhcyBkZWZpbmVkCisgICAgKiBhYm92ZS4pCisgICAgKgorICAgICogSWYgdGhlIGZsYWcgaXMgbm90IHNldCAodGhlIGRlZmF1bHQpIGlucHV0IDE2LWJpdCBwZXIgY29tcG9uZW50IGRhdGEgaXMKKyAgICAqIGFzc3VtZWQgdG8gYmUgbGluZWFyLgorICAgICoKKyAgICAqIE5PVEU6IHRoZSBmbGFnIGNhbiBvbmx5IGJlIHNldCBhZnRlciB0aGUgcG5nX2ltYWdlX2JlZ2luX3JlYWRfIGNhbGwsCisgICAgKiBiZWNhdXNlIHRoYXQgY2FsbCBpbml0aWFsaXplcyB0aGUgJ2ZsYWdzJyBmaWVsZC4KKyAgICAqLworCisjaWZkZWYgUE5HX1NJTVBMSUZJRURfUkVBRF9TVVBQT1JURUQKKy8qIFJFQUQgQVBJcworICogLS0tLS0tLS0tCisgKgorICogVGhlIHBuZ19pbWFnZSBwYXNzZWQgdG8gdGhlIHJlYWQgQVBJcyBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXplZCBieSBzZXR0aW5nCisgKiB0aGUgcG5nX2NvbnRyb2xwIGZpZWxkICdvcGFxdWUnIHRvIE5VTEwgKG9yLCBzYWZlciwgbWVtc2V0IHRoZSB3aG9sZSB0aGluZy4pCisgKi8KKyNpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECitQTkdfRVhQT1JUKDIzNCwgaW50LCBwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX2ZpbGUsIChwbmdfaW1hZ2VwIGltYWdlLAorICAgY29uc3QgY2hhciAqZmlsZV9uYW1lKSk7CisgICAvKiBUaGUgbmFtZWQgZmlsZSBpcyBvcGVuZWQgZm9yIHJlYWQgYW5kIHRoZSBpbWFnZSBoZWFkZXIgaXMgZmlsbGVkIGluCisgICAgKiBmcm9tIHRoZSBQTkcgaGVhZGVyIGluIHRoZSBmaWxlLgorICAgICovCisKK1BOR19FWFBPUlQoMjM1LCBpbnQsIHBuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fc3RkaW8sIChwbmdfaW1hZ2VwIGltYWdlLAorICAgRklMRSogZmlsZSkpOworICAgLyogVGhlIFBORyBoZWFkZXIgaXMgcmVhZCBmcm9tIHRoZSBzdGRpbyBGSUxFIG9iamVjdC4gKi8KKyNlbmRpZiAvKiBTVERJTyAqLworCitQTkdfRVhQT1JUKDIzNiwgaW50LCBwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX21lbW9yeSwgKHBuZ19pbWFnZXAgaW1hZ2UsCisgICBwbmdfY29uc3Rfdm9pZHAgbWVtb3J5LCBwbmdfc2l6ZV90IHNpemUpKTsKKyAgIC8qIFRoZSBQTkcgaGVhZGVyIGlzIHJlYWQgZnJvbSB0aGUgZ2l2ZW4gbWVtb3J5IGJ1ZmZlci4gKi8KKworUE5HX0VYUE9SVCgyMzcsIGludCwgcG5nX2ltYWdlX2ZpbmlzaF9yZWFkLCAocG5nX2ltYWdlcCBpbWFnZSwKKyAgIHBuZ19jb25zdF9jb2xvcnAgYmFja2dyb3VuZCwgdm9pZCAqYnVmZmVyLCBwbmdfaW50XzMyIHJvd19zdHJpZGUsCisgICB2b2lkICpjb2xvcm1hcCkpOworICAgLyogRmluaXNoIHJlYWRpbmcgdGhlIGltYWdlIGludG8gdGhlIHN1cHBsaWVkIGJ1ZmZlciBhbmQgY2xlYW4gdXAgdGhlCisgICAgKiBwbmdfaW1hZ2Ugc3RydWN0dXJlLgorICAgICoKKyAgICAqIHJvd19zdHJpZGUgaXMgdGhlIHN0ZXAsIGluIGJ5dGUgb3IgMi1ieXRlIHVuaXRzIGFzIGFwcHJvcHJpYXRlLAorICAgICogYmV0d2VlbiBhZGphY2VudCByb3dzLiAgQSBwb3NpdGl2ZSBzdHJpZGUgaW5kaWNhdGVzIHRoYXQgdGhlIHRvcC1tb3N0IHJvdworICAgICogaXMgZmlyc3QgaW4gdGhlIGJ1ZmZlciAtIHRoZSBub3JtYWwgdG9wLWRvd24gYXJyYW5nZW1lbnQuICBBIG5lZ2F0aXZlCisgICAgKiBzdHJpZGUgaW5kaWNhdGVzIHRoYXQgdGhlIGJvdHRvbS1tb3N0IHJvdyBpcyBmaXJzdCBpbiB0aGUgYnVmZmVyLgorICAgICoKKyAgICAqIGJhY2tncm91bmQgbmVlZCBvbmx5IGJlIHN1cHBsaWVkIGlmIGFuIGFscGhhIGNoYW5uZWwgbXVzdCBiZSByZW1vdmVkIGZyb20KKyAgICAqIGEgcG5nX2J5dGUgZm9ybWF0IGFuZCB0aGUgcmVtb3ZhbCBpcyB0byBiZSBkb25lIGJ5IGNvbXBvc2l0aW5nIG9uIGEgc29saWQKKyAgICAqIGNvbG9yOyBvdGhlcndpc2UgaXQgbWF5IGJlIE5VTEwgYW5kIGFueSBjb21wb3NpdGlvbiB3aWxsIGJlIGRvbmUgZGlyZWN0bHkKKyAgICAqIG9udG8gdGhlIGJ1ZmZlci4gIFRoZSB2YWx1ZSBpcyBhbiBzUkdCIGNvbG9yIHRvIHVzZSBmb3IgdGhlIGJhY2tncm91bmQsCisgICAgKiBmb3IgZ3JheXNjYWxlIG91dHB1dCB0aGUgZ3JlZW4gY2hhbm5lbCBpcyB1c2VkLgorICAgICoKKyAgICAqIGJhY2tncm91bmQgbXVzdCBiZSBzdXBwbGllZCB3aGVuIGFuIGFscGhhIGNoYW5uZWwgbXVzdCBiZSByZW1vdmVkIGZyb20gYQorICAgICogc2luZ2xlIGJ5dGUgY29sb3ItbWFwcGVkIG91dHB1dCBmb3JtYXQsIGluIG90aGVyIHdvcmRzIGlmOgorICAgICoKKyAgICAqIDEpIFRoZSBvcmlnaW5hbCBmb3JtYXQgZnJvbSBwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tXyogaGFkCisgICAgKiAgICBQTkdfRk9STUFUX0ZMQUdfQUxQSEEgc2V0LgorICAgICogMikgVGhlIGZvcm1hdCBzZXQgYnkgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90LgorICAgICogMykgVGhlIGZvcm1hdCBzZXQgYnkgdGhlIGFwcGxpY2F0aW9uIGhhcyBQTkdfRk9STUFUX0ZMQUdfQ09MT1JNQVAgc2V0IGFuZAorICAgICogICAgUE5HX0ZPUk1BVF9GTEFHX0xJTkVBUiAqbm90KiBzZXQuCisgICAgKgorICAgICogRm9yIGxpbmVhciBvdXRwdXQgcmVtb3ZpbmcgdGhlIGFscGhhIGNoYW5uZWwgaXMgYWx3YXlzIGRvbmUgYnkgY29tcG9zaXRpbmcKKyAgICAqIG9uIGJsYWNrIGFuZCBiYWNrZ3JvdW5kIGlzIGlnbm9yZWQuCisgICAgKgorICAgICogY29sb3JtYXAgbXVzdCBiZSBzdXBwbGllZCB3aGVuIFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCBpcyBzZXQuICBJdCBtdXN0CisgICAgKiBiZSBhdCBsZWFzdCB0aGUgc2l6ZSAoaW4gYnl0ZXMpIHJldHVybmVkIGJ5IFBOR19JTUFHRV9DT0xPUk1BUF9TSVpFLgorICAgICogaW1hZ2UtPmNvbG9ybWFwX2VudHJpZXMgd2lsbCBiZSB1cGRhdGVkIHRvIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGVudHJpZXMKKyAgICAqIHdyaXR0ZW4gdG8gdGhlIGNvbG9ybWFwOyB0aGlzIG1heSBiZSBsZXNzIHRoYW4gdGhlIG9yaWdpbmFsIHZhbHVlLgorICAgICovCisKK1BOR19FWFBPUlQoMjM4LCB2b2lkLCBwbmdfaW1hZ2VfZnJlZSwgKHBuZ19pbWFnZXAgaW1hZ2UpKTsKKyAgIC8qIEZyZWUgYW55IGRhdGEgYWxsb2NhdGVkIGJ5IGxpYnBuZyBpbiBpbWFnZS0+b3BhcXVlLCBzZXR0aW5nIHRoZSBwb2ludGVyIHRvCisgICAgKiBOVUxMLiAgTWF5IGJlIGNhbGxlZCBhdCBhbnkgdGltZSBhZnRlciB0aGUgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkLgorICAgICovCisjZW5kaWYgLyogU0lNUExJRklFRF9SRUFEICovCisKKyNpZmRlZiBQTkdfU0lNUExJRklFRF9XUklURV9TVVBQT1JURUQKKyNpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECisvKiBXUklURSBBUElTCisgKiAtLS0tLS0tLS0tCisgKiBGb3Igd3JpdGUgeW91IG11c3QgaW5pdGlhbGl6ZSBhIHBuZ19pbWFnZSBzdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgdGhlIGltYWdlIHRvCisgKiBiZSB3cml0dGVuLiAgVG8gZG8gdGhpcyB1c2UgbWVtc2V0IHRvIHNldCB0aGUgd2hvbGUgc3RydWN0dXJlIHRvIDAgdGhlbgorICogaW5pdGlhbGl6ZSBmaWVsZHMgZGVzY3JpYmluZyB5b3VyIGltYWdlLgorICoKKyAqIHZlcnNpb246IG11c3QgYmUgc2V0IHRvIFBOR19JTUFHRV9WRVJTSU9OCisgKiBvcGFxdWU6IG11c3QgYmUgaW5pdGlhbGl6ZWQgdG8gTlVMTAorICogd2lkdGg6IGltYWdlIHdpZHRoIGluIHBpeGVscworICogaGVpZ2h0OiBpbWFnZSBoZWlnaHQgaW4gcm93cworICogZm9ybWF0OiB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhIChpbWFnZSBhbmQgY29sb3ItbWFwKSB5b3Ugd2lzaCB0byB3cml0ZQorICogZmxhZ3M6IHNldCB0byAwIHVubGVzcyBvbmUgb2YgdGhlIGRlZmluZWQgZmxhZ3MgYXBwbGllczsgc2V0CisgKiAgICBQTkdfSU1BR0VfRkxBR19DT0xPUlNQQUNFX05PVF9zUkdCIGZvciBjb2xvciBmb3JtYXQgaW1hZ2VzIHdoZXJlIHRoZSBSR0IKKyAqICAgIHZhbHVlcyBkbyBub3QgY29ycmVzcG9uZCB0byB0aGUgY29sb3JzIGluIHNSR0IuCisgKiBjb2xvcm1hcF9lbnRyaWVzOiBzZXQgdG8gdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjb2xvci1tYXAgKDAgdG8gMjU2KQorICovCitQTkdfRVhQT1JUKDIzOSwgaW50LCBwbmdfaW1hZ2Vfd3JpdGVfdG9fZmlsZSwgKHBuZ19pbWFnZXAgaW1hZ2UsCisgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgY29udmVydF90b184Yml0LCBjb25zdCB2b2lkICpidWZmZXIsCisgICBwbmdfaW50XzMyIHJvd19zdHJpZGUsIGNvbnN0IHZvaWQgKmNvbG9ybWFwKSk7CisgICAvKiBXcml0ZSB0aGUgaW1hZ2UgdG8gdGhlIG5hbWVkIGZpbGUuICovCisKK1BOR19FWFBPUlQoMjQwLCBpbnQsIHBuZ19pbWFnZV93cml0ZV90b19zdGRpbywgKHBuZ19pbWFnZXAgaW1hZ2UsIEZJTEUgKmZpbGUsCisgICBpbnQgY29udmVydF90b184X2JpdCwgY29uc3Qgdm9pZCAqYnVmZmVyLCBwbmdfaW50XzMyIHJvd19zdHJpZGUsCisgICBjb25zdCB2b2lkICpjb2xvcm1hcCkpOworICAgLyogV3JpdGUgdGhlIGltYWdlIHRvIHRoZSBnaXZlbiAoRklMRSopLiAqLworCisvKiBXaXRoIGJvdGggd3JpdGUgQVBJcyBpZiBpbWFnZSBpcyBpbiBvbmUgb2YgdGhlIGxpbmVhciBmb3JtYXRzIHdpdGggMTYtYml0CisgKiBkYXRhIHRoZW4gc2V0dGluZyBjb252ZXJ0X3RvXzhfYml0IHdpbGwgY2F1c2UgdGhlIG91dHB1dCB0byBiZSBhbiA4LWJpdCBQTkcKKyAqIGdhbW1hIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBzUkdCIHNwZWNpZmljYXRpb24sIG90aGVyd2lzZSBhIDE2LWJpdCBsaW5lYXIKKyAqIGVuY29kZWQgUE5HIGZpbGUgaXMgd3JpdHRlbi4KKyAqCisgKiBXaXRoIGNvbG9yLW1hcHBlZCBkYXRhIGZvcm1hdHMgdGhlIGNvbG9ybWFwIHBhcmFtZXRlciBwb2ludCB0byBhIGNvbG9yLW1hcAorICogd2l0aCBhdCBsZWFzdCBpbWFnZS0+Y29sb3JtYXBfZW50cmllcyBlbmNvZGVkIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0LiAgSWYKKyAqIHRoZSBmb3JtYXQgaXMgbGluZWFyIHRoZSB3cml0dGVuIFBORyBjb2xvci1tYXAgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gc1JHQgorICogcmVnYXJkbGVzcyBvZiB0aGUgY29udmVydF90b184X2JpdCBmbGFnLgorICoKKyAqIFdpdGggYWxsIEFQSXMgcm93X3N0cmlkZSBpcyBoYW5kbGVkIGFzIGluIHRoZSByZWFkIEFQSXMgLSBpdCBpcyB0aGUgc3BhY2luZworICogZnJvbSBvbmUgcm93IHRvIHRoZSBuZXh0IGluIGNvbXBvbmVudCBzaXplZCB1bml0cyAoMSBvciAyIGJ5dGVzKSBhbmQgaWYKKyAqIG5lZ2F0aXZlIGluZGljYXRlcyBhIGJvdHRvbS11cCByb3cgbGF5b3V0IGluIHRoZSBidWZmZXIuICBJZiByb3dfc3RyaWRlIGlzIHplcm8sCisgKiBsaWJwbmcgd2lsbCBjYWxjdWxhdGUgaXQgZm9yIHlvdSBmcm9tIHRoZSBpbWFnZSB3aWR0aCBhbmQgbnVtYmVyIG9mIGNoYW5uZWxzLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgd3JpdGUgQVBJIGRvZXMgbm90IHN1cHBvcnQgaW50ZXJsYWNpbmcsIHN1Yi04LWJpdCBwaXhlbHMsIGluZGV4ZWQKKyAqIFBORyAoY29sb3JfdHlwZSAzKSBvciBtb3N0IGFuY2lsbGFyeSBjaHVua3MuCisgKi8KKyNlbmRpZiAvKiBTVERJTyAqLworI2VuZGlmIC8qIFNJTVBMSUZJRURfV1JJVEUgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgRU5EIE9GIFNJTVBMSUZJRUQgQVBJCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VuZGlmIC8qIFNJTVBMSUZJRURfe1JFQUR8V1JJVEV9ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTZWN0aW9uIDY6IElNUExFTUVOVEFUSU9OIE9QVElPTlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU3VwcG9ydCBmb3IgYXJiaXRyYXJ5IGltcGxlbWVudGF0aW9uLXNwZWNpZmljIG9wdGltaXphdGlvbnMuICBUaGUgQVBJIGFsbG93cworICogcGFydGljdWxhciBvcHRpb25zIHRvIGJlIHR1cm5lZCBvbiBvciBvZmYuICAnT3B0aW9uJyBpcyB0aGUgbnVtYmVyIG9mIHRoZQorICogb3B0aW9uIGFuZCAnb25vZmYnIGlzIDAgKG9mZikgb3Igbm9uLTAgKG9uKS4gIFRoZSB2YWx1ZSByZXR1cm5lZCBpcyBnaXZlbgorICogYnkgdGhlIFBOR19PUFRJT05fIGRlZmluZXMgYmVsb3cuCisgKgorICogSEFSRFdBUkU6IG5vcm1hbGx5IGhhcmR3YXJlIGNhcGFiaWxpdGVzLCBzdWNoIGFzIHRoZSBJbnRlbCBTU0UgaW5zdHJ1Y3Rpb25zLAorICogICAgICAgICAgIGFyZSBkZXRlY3RlZCBhdCBydW4gdGltZSwgaG93ZXZlciBzb21ldGltZXMgaXQgbWF5IGJlIGltcG9zc2libGUKKyAqICAgICAgICAgICB0byBkbyB0aGlzIGluIHVzZXIgbW9kZSwgaW4gd2hpY2ggY2FzZSBpdCBpcyBuZWNlc3NhcnkgdG8gZGlzY292ZXIKKyAqICAgICAgICAgICB0aGUgY2FwYWJpbGl0aWVzIGluIGFuIE9TIHNwZWNpZmljIHdheS4gIFN1Y2ggY2FwYWJpbGl0aWVzIGFyZQorICogICAgICAgICAgIGxpc3RlZCBoZXJlIHdoZW4gbGlicG5nIGhhcyBzdXBwb3J0IGZvciB0aGVtIGFuZCBtdXN0IGJlIHR1cm5lZAorICogICAgICAgICAgIE9OIGJ5IHRoZSBhcHBsaWNhdGlvbiBpZiBwcmVzZW50LgorICoKKyAqIFNPRlRXQVJFOiBzb21ldGltZXMgc29mdHdhcmUgb3B0aW1pemF0aW9ucyBhY3R1YWxseSByZXN1bHQgaW4gcGVyZm9ybWFuY2UKKyAqICAgICAgICAgICBkZWNyZWFzZSBvbiBzb21lIGFyY2hpdGVjdHVyZXMgb3Igc3lzdGVtcywgb3Igd2l0aCBzb21lIHNldHMgb2YKKyAqICAgICAgICAgICBQTkcgaW1hZ2VzLiAgJ1NvZnR3YXJlJyBvcHRpb25zIGFsbG93IHN1Y2ggb3B0aW1pemF0aW9ucyB0byBiZQorICogICAgICAgICAgIHNlbGVjdGVkIGF0IHJ1biB0aW1lLgorICovCisjaWZkZWYgUE5HX1NFVF9PUFRJT05fU1VQUE9SVEVECisjaWZkZWYgUE5HX0FSTV9ORU9OX0FQSV9TVVBQT1JURUQKKyMgIGRlZmluZSBQTkdfQVJNX05FT04gICAwIC8qIEhBUkRXQVJFOiBBUk0gTmVvbiBTSU1EIGluc3RydWN0aW9ucyBzdXBwb3J0ZWQgKi8KKyNlbmRpZgorI2RlZmluZSBQTkdfTUFYSU1VTV9JTkZMQVRFX1dJTkRPVyAyIC8qIFNPRlRXQVJFOiBmb3JjZSBtYXhpbXVtIHdpbmRvdyAqLworI2RlZmluZSBQTkdfU0tJUF9zUkdCX0NIRUNLX1BST0ZJTEUgNCAvKiBTT0ZUV0FSRTogQ2hlY2sgSUNDIHByb2ZpbGUgZm9yIHNSR0IgKi8KKyNkZWZpbmUgUE5HX09QVElPTl9ORVhUICA2IC8qIE5leHQgb3B0aW9uIC0gbnVtYmVycyBtdXN0IGJlIGV2ZW4gKi8KKworLyogUmV0dXJuIHZhbHVlczogTk9URTogdGhlcmUgYXJlIGZvdXIgdmFsdWVzIGFuZCAnb2ZmJyBpcyAqbm90KiB6ZXJvICovCisjZGVmaW5lIFBOR19PUFRJT05fVU5TRVQgICAwIC8qIFVuc2V0IC0gZGVmYXVsdHMgdG8gb2ZmICovCisjZGVmaW5lIFBOR19PUFRJT05fSU5WQUxJRCAxIC8qIE9wdGlvbiBudW1iZXIgb3V0IG9mIHJhbmdlICovCisjZGVmaW5lIFBOR19PUFRJT05fT0ZGICAgICAyCisjZGVmaW5lIFBOR19PUFRJT05fT04gICAgICAzCisKK1BOR19FWFBPUlQoMjQ0LCBpbnQsIHBuZ19zZXRfb3B0aW9uLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBvcHRpb24sCisgICBpbnQgb25vZmYpKTsKKyNlbmRpZiAvKiBTRVRfT1BUSU9OICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgRU5EIE9GIEhBUkRXQVJFIEFORCBTT0ZUV0FSRSBPUFRJT05TCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBNYWludGFpbmVyOiBQdXQgbmV3IHB1YmxpYyBwcm90b3R5cGVzIGhlcmUgXiwgaW4gbGlicG5nLjMsIGluIHByb2plY3QKKyAqIGRlZnMsIGFuZCBpbiBzY3JpcHRzL3N5bWJvbHMuZGVmLgorICovCisKKy8qIFRoZSBsYXN0IG9yZGluYWwgbnVtYmVyICh0aGlzIGlzIHRoZSAqbGFzdCogb25lIGFscmVhZHkgdXNlZDsgdGhlIG5leHQKKyAqIG9uZSB0byB1c2UgaXMgb25lIG1vcmUgdGhhbiB0aGlzLikKKyAqLworI2lmZGVmIFBOR19FWFBPUlRfTEFTVF9PUkRJTkFMCisgIFBOR19FWFBPUlRfTEFTVF9PUkRJTkFMKDI0NCk7CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFBOR19WRVJTSU9OX0lORk9fT05MWSAqLworLyogRG8gbm90IHB1dCBhbnl0aGluZyBwYXN0IHRoaXMgbGluZSAqLworI2VuZGlmIC8qIFBOR19IICovCmRpZmYgLS1naXQgYS9saWJwbmcvcG5nYmFyLmpwZyBiL2xpYnBuZy9wbmdiYXIuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYmE4ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvcG5nYmFyLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJwbmcvcG5nYmFyLnBuZyBiL2xpYnBuZy9wbmdiYXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5Nzk4YzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvcG5nYmFyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJwbmcvcG5nY29uZi5oIGIvbGlicG5nL3BuZ2NvbmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmYyNTAwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3BuZ2NvbmYuaApAQCAtMCwwICsxLDYyMiBAQAorCisvKiBwbmdjb25mLmggLSBtYWNoaW5lIGNvbmZpZ3VyYWJsZSBmaWxlIGZvciBsaWJwbmcKKyAqCisgKiBsaWJwbmcgdmVyc2lvbiAxLjYuMjAsIERlY2VtYmVyIDMsIDIwMTUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNSBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQorICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisgKiBhbmQgbGljZW5zZSBpbiBwbmcuaAorICoKKyAqIEFueSBtYWNoaW5lIHNwZWNpZmljIGNvZGUgaXMgbmVhciB0aGUgZnJvbnQgb2YgdGhpcyBmaWxlLCBzbyBpZiB5b3UKKyAqIGFyZSBjb25maWd1cmluZyBsaWJwbmcgZm9yIGEgbWFjaGluZSwgeW91IG1heSB3YW50IHRvIHJlYWQgdGhlIHNlY3Rpb24KKyAqIHN0YXJ0aW5nIGhlcmUgZG93biB0byB3aGVyZSBpdCBzdGFydHMgdG8gdHlwZWRlZiBwbmdfY29sb3IsIHBuZ190ZXh0LAorICogYW5kIHBuZ19pbmZvLgorICovCisKKyNpZm5kZWYgUE5HQ09ORl9ICisjZGVmaW5lIFBOR0NPTkZfSAorCisjaWZuZGVmIFBOR19CVUlMRElOR19TWU1CT0xfVEFCTEUgLyogZWxzZSBpbmNsdWRlcyBtYXkgY2F1c2UgcHJvYmxlbXMgKi8KKworLyogRnJvbSBsaWJwbmcgMS42LjAgbGlicG5nIHJlcXVpcmVzIGFuIEFOU0kgWDMuMTU5LTE5ODkgKCJJU09DOTAiKSBjb21wbGlhbnQgQworICogY29tcGlsZXIgZm9yIGNvcnJlY3QgY29tcGlsYXRpb24uICBUaGUgZm9sbG93aW5nIGhlYWRlciBmaWxlcyBhcmUgcmVxdWlyZWQgYnkKKyAqIHRoZSBzdGFuZGFyZC4gIElmIHlvdXIgY29tcGlsZXIgZG9lc24ndCBwcm92aWRlIHRoZXNlIGhlYWRlciBmaWxlcywgb3IgdGhleQorICogZG8gbm90IG1hdGNoIHRoZSBzdGFuZGFyZCwgeW91IHdpbGwgbmVlZCB0byBwcm92aWRlL2ltcHJvdmUgdGhlbS4KKyAqLworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKiBMaWJyYXJ5IGhlYWRlciBmaWxlcy4gIFRoZXNlIGhlYWRlciBmaWxlcyBhcmUgYWxsIGRlZmluZWQgYnkgSVNPQzkwOyBsaWJwbmcKKyAqIGV4cGVjdHMgY29uZm9ybWFudCBpbXBsZW1lbnRhdGlvbnMsIGhvd2V2ZXIsIGFuIElTT0M5MCBjb25mb3JtYW50IHN5c3RlbSBuZWVkCisgKiBub3QgcHJvdmlkZSB0aGVzZSBoZWFkZXIgZmlsZXMgaWYgdGhlIGZ1bmN0aW9uYWxpdHkgY2Fubm90IGJlIGltcGxlbWVudGVkLgorICogSW4gdGhpcyBjYXNlIGl0IHdpbGwgYmUgbmVjZXNzYXJ5IHRvIGRpc2FibGUgdGhlIHJlbGV2YW50IHBhcnRzIG9mIGxpYnBuZyBpbgorICogdGhlIGJ1aWxkIG9mIHBuZ2xpYmNvbmYuaC4KKyAqCisgKiBQcmlvciB0byAxLjYuMCBzdHJpbmcuaCB3YXMgaW5jbHVkZWQgaGVyZTsgdGhlIEFQSSBjaGFuZ2VzIGluIDEuNi4wIHRvIG5vdAorICogaW5jbHVkZSB0aGlzIHVubmVjZXNzYXJ5IGhlYWRlciBmaWxlLgorICovCisKKyNpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECisgICAvKiBSZXF1aXJlZCBmb3IgdGhlIGRlZmluaXRpb24gb2YgRklMRTogKi8KKyMgIGluY2x1ZGUgPHN0ZGlvLmg+CisjZW5kaWYKKworI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECisgICAvKiBSZXF1aXJlZCBmb3IgdGhlIGRlZmluaXRpb24gb2Ygam1wX2J1ZiBhbmQgdGhlIGRlY2xhcmF0aW9uIG9mIGxvbmdqbXA6ICovCisjICBpbmNsdWRlIDxzZXRqbXAuaD4KKyNlbmRpZgorCisjaWZkZWYgUE5HX0NPTlZFUlRfdElNRV9TVVBQT1JURUQKKyAgIC8qIFJlcXVpcmVkIGZvciBzdHJ1Y3QgdG06ICovCisjICBpbmNsdWRlIDx0aW1lLmg+CisjZW5kaWYKKworI2VuZGlmIC8qIFBOR19CVUlMRElOR19TWU1CT0xfVEFCTEUgKi8KKworLyogUHJpb3IgdG8gMS42LjAgaXQgd2FzIHBvc3NpYmxlIHRvIHR1cm4gb2ZmICdjb25zdCcgaW4gZGVjbGFyYXRpb25zIHVzaW5nCisgKiBQTkdfTk9fQ09OU1Q7IHRoaXMgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBleGNlcHQgZm9yIGRhdGEgZGVjbGFyYXRpb25zIHdoaWNoCisgKiBhcHBhcmVudGx5IHN0aWxsIGNhdXNlIHByb2JsZW1zIGluIDIwMTEgb24gc29tZSBjb21waWxlcnMuCisgKi8KKyNkZWZpbmUgUE5HX0NPTlNUIGNvbnN0IC8qIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgb25seSAqLworCisvKiBUaGlzIGNvbnRyb2xzIG9wdGltaXphdGlvbiBvZiB0aGUgcmVhZGluZyBvZiAxNi1iaXQgYW5kIDMyLWJpdCB2YWx1ZXMKKyAqIGZyb20gUE5HIGZpbGVzLiAgSXQgY2FuIGJlIHNldCBvbiBhIHBlci1hcHAtZmlsZSBiYXNpcyAtIGl0CisgKiBqdXN0IGNoYW5nZXMgd2hldGhlciBhIG1hY3JvIGlzIHVzZWQgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLgorICogVGhlIGxpYnJhcnkgYnVpbGRlciBzZXRzIHRoZSBkZWZhdWx0OyBpZiByZWFkIGZ1bmN0aW9ucyBhcmUgbm90CisgKiBidWlsdCBpbnRvIHRoZSBsaWJyYXJ5IHRoZSBtYWNybyBpbXBsZW1lbnRhdGlvbiBpcyBmb3JjZWQgb24uCisgKi8KKyNpZm5kZWYgUE5HX1JFQURfSU5UX0ZVTkNUSU9OU19TVVBQT1JURUQKKyMgIGRlZmluZSBQTkdfVVNFX1JFQURfTUFDUk9TCisjZW5kaWYKKyNpZiAhZGVmaW5lZChQTkdfTk9fVVNFX1JFQURfTUFDUk9TKSAmJiAhZGVmaW5lZChQTkdfVVNFX1JFQURfTUFDUk9TKQorIyAgaWYgUE5HX0RFRkFVTFRfUkVBRF9NQUNST1MKKyMgICAgZGVmaW5lIFBOR19VU0VfUkVBRF9NQUNST1MKKyMgIGVuZGlmCisjZW5kaWYKKworLyogQ09NUElMRVIgU1BFQ0lGSUMgT1BUSU9OUy4KKyAqCisgKiBUaGVzZSBvcHRpb25zIGFyZSBwcm92aWRlZCBzbyB0aGF0IGEgdmFyaWV0eSBvZiBkaWZmaWN1bHQgY29tcGlsZXJzCisgKiBjYW4gYmUgdXNlZC4gIFNvbWUgYXJlIGZpeGVkIGF0IGJ1aWxkIHRpbWUgKGUuZy4gUE5HX0FQSV9SVUxFCisgKiBiZWxvdykgYnV0IHN0aWxsIGhhdmUgY29tcGlsZXIgc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zLCBvdGhlcnMKKyAqIG1heSBiZSBjaGFuZ2VkIG9uIGEgcGVyLWZpbGUgYmFzaXMgd2hlbiBjb21waWxpbmcgYWdhaW5zdCBsaWJwbmcuCisgKi8KKworLyogVGhlIFBOR0FSRyBtYWNybyB3YXMgdXNlZCBpbiB2ZXJzaW9ucyBvZiBsaWJwbmcgcHJpb3IgdG8gMS42LjAgdG8gcHJvdGVjdAorICogYWdhaW5zdCBsZWdhY3kgKHByZSBJU09DOTApIGNvbXBpbGVycyB0aGF0IGRpZCBub3QgdW5kZXJzdGFuZCBmdW5jdGlvbgorICogcHJvdG90eXBlcy4gIEl0IGlzIG5vdCByZXF1aXJlZCBmb3IgbW9kZXJuIEMgY29tcGlsZXJzLgorICovCisjaWZuZGVmIFBOR0FSRworIyAgZGVmaW5lIFBOR0FSRyhhcmdsaXN0KSBhcmdsaXN0CisjZW5kaWYKKworLyogRnVuY3Rpb24gY2FsbGluZyBjb252ZW50aW9ucy4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBOb3JtYWxseSBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHNwZWNpZnkgdG8gdGhlIGNvbXBpbGVyIGhvdyB0byBjYWxsCisgKiBhIGZ1bmN0aW9uIC0gaXQganVzdCBkb2VzIGl0IC0gaG93ZXZlciBvbiB4ODYgc3lzdGVtcyBkZXJpdmVkIGZyb20KKyAqIE1pY3Jvc29mdCBhbmQgQm9ybGFuZCBDIGNvbXBpbGVycyAoJ0lCTSBQQycsICdET1MnLCAnV2luZG93cycgc3lzdGVtcworICogYW5kIHNvbWUgb3RoZXJzKSB0aGVyZSBhcmUgbXVsdGlwbGUgd2F5cyB0byBjYWxsIGEgZnVuY3Rpb24gYW5kIHRoZQorICogZGVmYXVsdCBjYW4gYmUgY2hhbmdlZCBvbiB0aGUgY29tcGlsZXIgY29tbWFuZCBsaW5lLiAgRm9yIHRoaXMgcmVhc29uCisgKiBsaWJwbmcgc3BlY2lmaWVzIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gb2YgZXZlcnkgZXhwb3J0ZWQgZnVuY3Rpb24gYW5kCisgKiBldmVyeSBmdW5jdGlvbiBjYWxsZWQgdmlhIGEgdXNlciBzdXBwbGllZCBmdW5jdGlvbiBwb2ludGVyLiAgVGhpcyBpcworICogZG9uZSBpbiB0aGlzIGZpbGUgYnkgZGVmaW5pbmcgdGhlIGZvbGxvd2luZyBtYWNyb3M6CisgKgorICogUE5HQVBJICAgIENhbGxpbmcgY29udmVudGlvbiBmb3IgZXhwb3J0ZWQgZnVuY3Rpb25zLgorICogUE5HQ0JBUEkgIENhbGxpbmcgY29udmVudGlvbiBmb3IgdXNlciBwcm92aWRlZCAoY2FsbGJhY2spIGZ1bmN0aW9ucy4KKyAqIFBOR0NBUEkgICBDYWxsaW5nIGNvbnZlbnRpb24gdXNlZCBieSB0aGUgQU5TSS1DIGxpYnJhcnkgKHJlcXVpcmVkCisgKiAgICAgICAgICAgZm9yIGxvbmdqbXAgY2FsbGJhY2tzIGFuZCBzb21ldGltZXMgdXNlZCBpbnRlcm5hbGx5IHRvCisgKiAgICAgICAgICAgc3BlY2lmeSB0aGUgY2FsbGluZyBjb252ZW50aW9uIGZvciB6bGliKS4KKyAqCisgKiBUaGVzZSBtYWNyb3Mgc2hvdWxkIG5ldmVyIGJlIG92ZXJyaWRkZW4uICBJZiBpdCBpcyBuZWNlc3NhcnkgdG8KKyAqIGNoYW5nZSBjYWxsaW5nIGNvbnZlbnRpb24gaW4gYSBwcml2YXRlIGJ1aWxkIHRoaXMgY2FuIGJlIGRvbmUKKyAqIGJ5IHNldHRpbmcgUE5HX0FQSV9SVUxFICh3aGljaCBkZWZhdWx0cyB0byAwKSB0byBvbmUgb2YgdGhlIHZhbHVlcworICogYmVsb3cgdG8gc2VsZWN0IHRoZSBjb3JyZWN0ICdBUEknIHZhcmlhbnRzLgorICoKKyAqIFBOR19BUElfUlVMRT0wIFVzZSBQTkdDQVBJIC0gdGhlICdDJyBjYWxsaW5nIGNvbnZlbnRpb24gLSB0aHJvdWdob3V0LgorICogICAgICAgICAgICAgICAgVGhpcyBpcyBjb3JyZWN0IGluIGV2ZXJ5IGtub3duIGVudmlyb25tZW50LgorICogUE5HX0FQSV9SVUxFPTEgVXNlIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGNvbnZlbnRpb24gZm9yIFBOR0FQSSBhbmQKKyAqICAgICAgICAgICAgICAgIHRoZSAnQycgY2FsbGluZyBjb252ZW50aW9uIChmcm9tIFBOR0NBUEkpIGZvcgorICogICAgICAgICAgICAgICAgY2FsbGJhY2tzIChQTkdDQkFQSSkuICBUaGlzIGlzIG5vIGxvbmdlciByZXF1aXJlZAorICogICAgICAgICAgICAgICAgaW4gYW55IGtub3duIGVudmlyb25tZW50IC0gaWYgaXQgaGFzIHRvIGJlIHVzZWQKKyAqICAgICAgICAgICAgICAgIHBsZWFzZSBwb3N0IGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBwcm9ibGVtIHRvIHRoZQorICogICAgICAgICAgICAgICAgbGlicG5nIG1haWxpbmcgbGlzdC4KKyAqCisgKiBUaGVzZSBjYXNlcyBvbmx5IGRpZmZlciBpZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBkb2VzIG5vdCB1c2UgdGhlIEMKKyAqIGNhbGxpbmcgY29udmVudGlvbiwgYXQgcHJlc2VudCB0aGlzIGp1c3QgbWVhbnMgdGhlIGFib3ZlIGNhc2VzCisgKiAoeDg2IERPUy9XaW5kb3dzIHN5dGVtcykgYW5kLCBldmVuIHRoZW4sIHRoaXMgZG9lcyBub3QgYXBwbHkgdG8KKyAqIEN5Z3dpbiBydW5uaW5nIG9uIHRob3NlIHN5c3RlbXMuCisgKgorICogTm90ZSB0aGF0IHRoZSB2YWx1ZSBtdXN0IGJlIGRlZmluZWQgaW4gcG5nbGliY29uZi5oIHNvIHRoYXQgd2hhdAorICogdGhlIGFwcGxpY2F0aW9uIHVzZXMgdG8gY2FsbCB0aGUgbGlicmFyeSBtYXRjaGVzIHRoZSBjb252ZW50aW9ucworICogc2V0IHdoZW4gYnVpbGRpbmcgdGhlIGxpYnJhcnkuCisgKi8KKworLyogU3ltYm9sIGV4cG9ydAorICogPT09PT09PT09PT09PQorICogV2hlbiBidWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5IGl0IGlzIGFsbW9zdCBhbHdheXMgbmVjZXNzYXJ5IHRvIHRlbGwKKyAqIHRoZSBjb21waWxlciB3aGljaCBzeW1ib2xzIHRvIGV4cG9ydC4gIFRoZSBwbmcuaCBtYWNybyAnUE5HX0VYUE9SVCcKKyAqIGlzIHVzZWQgdG8gbWFyayB0aGUgc3ltYm9scy4gIE9uIHNvbWUgc3lzdGVtcyB0aGVzZSBzeW1ib2xzIGNhbiBiZQorICogZXh0cmFjdGVkIGF0IGxpbmsgdGltZSBhbmQgbmVlZCBubyBzcGVjaWFsIHByb2Nlc3NpbmcgYnkgdGhlIGNvbXBpbGVyLAorICogb24gb3RoZXIgc3lzdGVtcyB0aGUgc3ltYm9scyBhcmUgZmxhZ2dlZCBieSB0aGUgY29tcGlsZXIgYW5kIGp1c3QKKyAqIHRoZSBkZWNsYXJhdGlvbiByZXF1aXJlcyBhIHNwZWNpYWwgdGFnIGFwcGxpZWQgKHVuZm9ydHVuYXRlbHkpIGluIGEKKyAqIGNvbXBpbGVyIGRlcGVuZGVudCB3YXkuICBTb21lIHN5c3RlbXMgY2FuIGRvIGVpdGhlci4KKyAqCisgKiBBIHNtYWxsIG51bWJlciBvZiBvbGRlciBzeXN0ZW1zIGFsc28gcmVxdWlyZSBhIHN5bWJvbCBmcm9tIGEgRExMIHRvCisgKiBiZSBmbGFnZ2VkIHRvIHRoZSBwcm9ncmFtIHRoYXQgY2FsbHMgaXQuICBUaGlzIGlzIGEgcHJvYmxlbSBiZWNhdXNlCisgKiB3ZSBkbyBub3Qga25vdyBpbiB0aGUgaGVhZGVyIGZpbGUgaW5jbHVkZWQgYnkgYXBwbGljYXRpb24gY29kZSB0aGF0CisgKiB0aGUgc3ltYm9sIHdpbGwgY29tZSBmcm9tIGEgc2hhcmVkIGxpYnJhcnksIGFzIG9wcG9zZWQgdG8gYSBzdGF0aWNhbGx5CisgKiBsaW5rZWQgb25lLiAgRm9yIHRoaXMgcmVhc29uIHRoZSBhcHBsaWNhdGlvbiBtdXN0IHRlbGwgdXMgYnkgc2V0dGluZworICogdGhlIG1hZ2ljIGZsYWcgUE5HX1VTRV9ETEwgdG8gdHVybiBvbiB0aGUgc3BlY2lhbCBwcm9jZXNzaW5nIGJlZm9yZQorICogaXQgaW5jbHVkZXMgcG5nLmguCisgKgorICogRm91ciBhZGRpdGlvbmFsIG1hY3JvcyBhcmUgdXNlZCB0byBtYWtlIHRoaXMgaGFwcGVuOgorICoKKyAqIFBOR19JTVBFWFAgVGhlIG1hZ2ljIChpZiBhbnkpIHRvIGNhdXNlIGEgc3ltYm9sIHRvIGJlIGV4cG9ydGVkIGZyb20KKyAqICAgICAgICAgICAgdGhlIGJ1aWxkIG9yIGltcG9ydGVkIGlmIFBOR19VU0VfRExMIGlzIHNldCAtIGNvbXBpbGVyCisgKiAgICAgICAgICAgIGFuZCBzeXN0ZW0gc3BlY2lmaWMuCisgKgorICogUE5HX0VYUE9SVF9UWVBFKHR5cGUpIEEgbWFjcm8gdGhhdCBwcmUgb3IgYXBwZW5kcyBQTkdfSU1QRVhQIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnLCBjb21waWxlciBzcGVjaWZpYy4KKyAqCisgKiBQTkdfRExMX0VYUE9SVCBTZXQgdG8gdGhlIG1hZ2ljIHRvIHVzZSBkdXJpbmcgYSBsaWJwbmcgYnVpbGQgdG8KKyAqICAgICAgICAgICAgICAgIG1ha2UgYSBzeW1ib2wgZXhwb3J0ZWQgZnJvbSB0aGUgRExMLiAgTm90IHVzZWQgaW4gdGhlCisgKiAgICAgICAgICAgICAgICBwdWJsaWMgaGVhZGVyIGZpbGVzOyBzZWUgcG5ncHJpdi5oIGZvciBob3cgaXQgaXMgdXNlZAorICogICAgICAgICAgICAgICAgaW4gdGhlIGxpYnBuZyBidWlsZC4KKyAqCisgKiBQTkdfRExMX0lNUE9SVCBTZXQgdG8gdGhlIG1hZ2ljIHRvIGZvcmNlIHRoZSBsaWJwbmcgc3ltYm9scyB0byBjb21lCisgKiAgICAgICAgICAgICAgICBmcm9tIGEgRExMIC0gdXNlZCB0byBkZWZpbmUgUE5HX0lNUEVYUCB3aGVuCisgKiAgICAgICAgICAgICAgICBQTkdfVVNFX0RMTCBpcyBzZXQuCisgKi8KKworLyogU3lzdGVtIHNwZWNpZmljIGRpc2NvdmVyeS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUaGlzIGNvZGUgaXMgdXNlZCBhdCBidWlsZCB0aW1lIHRvIGZpbmQgUE5HX0lNUEVYUCwgdGhlIEFQSSBzZXR0aW5ncworICogYW5kIFBOR19FWFBPUlRfVFlQRSgpLCBpdCBtYXkgYWxzbyBzZXQgYSBtYWNybyB0byBpbmRpY2F0ZSB0aGUgRExMCisgKiBpbXBvcnQgcHJvY2Vzc2luZyBpcyBwb3NzaWJsZS4gIE9uIFdpbmRvd3Mgc3lzdGVtcyBpdCBhbHNvIHNldHMKKyAqIGNvbXBpbGVyLXNwZWNpZmljIG1hY3JvcyB0byB0aGUgdmFsdWVzIHJlcXVpcmVkIHRvIGNoYW5nZSB0aGUgY2FsbGluZworICogY29udmVudGlvbnMgb2YgdGhlIHZhcmlvdXMgZnVuY3Rpb25zLgorICovCisjaWYgZGVmaW5lZChfV2luZG93cykgfHwgZGVmaW5lZChfV0lORE9XUykgfHwgZGVmaW5lZChXSU4zMikgfHxcCisgICAgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisgIC8qIFdpbmRvd3Mgc3lzdGVtIChET1MgZG9lc24ndCBzdXBwb3J0IERMTHMpLiAgSW5jbHVkZXMgYnVpbGRzIHVuZGVyIEN5Z3dpbiBvcgorICAgKiBNaW5HVyBvbiBhbnkgYXJjaGl0ZWN0dXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgV2luZG93cy4gIEFsc28gaW5jbHVkZXMKKyAgICogV2F0Y29tIGJ1aWxkcyBidXQgdGhlc2UgbmVlZCBzcGVjaWFsIHRyZWF0bWVudCBiZWNhdXNlIHRoZXkgYXJlIG5vdAorICAgKiBjb21wYXRpYmxlIHdpdGggR0NDIG9yIFZpc3VhbCBDIGJlY2F1c2Ugb2YgZGlmZmVyZW50IGNhbGxpbmcgY29udmVudGlvbnMuCisgICAqLworIyAgaWYgUE5HX0FQSV9SVUxFID09IDIKKyAgICAvKiBJZiB0aGlzIGxpbmUgcmVzdWx0cyBpbiBhbiBlcnJvciwgZWl0aGVyIGJlY2F1c2UgX193YXRjYWxsIGlzIG5vdAorICAgICAqIHVuZGVyc3Rvb2Qgb3IgYmVjYXVzZSBvZiBhIHJlZGVmaW5lIGp1c3QgYmVsb3cgeW91IGNhbm5vdCB1c2UgKnRoaXMqCisgICAgICogYnVpbGQgb2YgdGhlIGxpYnJhcnkgd2l0aCB0aGUgY29tcGlsZXIgeW91IGFyZSB1c2luZy4gICpUaGlzKiBidWlsZCB3YXMKKyAgICAgKiBidWlsZCB1c2luZyBXYXRjb20gYW5kIGFwcGxpY2F0aW9ucyBtdXN0IGFsc28gYmUgYnVpbHQgdXNpbmcgV2F0Y29tIQorICAgICAqLworIyAgICBkZWZpbmUgUE5HQ0FQSSBfX3dhdGNhbGwKKyMgIGVuZGlmCisKKyMgIGlmIGRlZmluZWQoX19HTlVDX18pIHx8IChkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gODAwKSkKKyMgICAgZGVmaW5lIFBOR0NBUEkgX19jZGVjbAorIyAgICBpZiBQTkdfQVBJX1JVTEUgPT0gMQorICAgICAgIC8qIElmIHRoaXMgbGluZSByZXN1bHRzIGluIGFuIGVycm9yIF9fc3RkY2FsbCBpcyBub3QgdW5kZXJzdG9vZCBhbmQKKyAgICAgICAgKiBQTkdfQVBJX1JVTEUgc2hvdWxkIG5vdCBoYXZlIGJlZW4gc2V0IHRvICcxJy4KKyAgICAgICAgKi8KKyMgICAgICBkZWZpbmUgUE5HQVBJIF9fc3RkY2FsbAorIyAgICBlbmRpZgorIyAgZWxzZQorICAgIC8qIEFuIG9sZGVyIGNvbXBpbGVyLCBvciBvbmUgbm90IGRldGVjdGVkIChlcnJvbmVvdXNseSkgYWJvdmUsCisgICAgICogaWYgbmVjZXNzYXJ5IG92ZXJyaWRlIG9uIHRoZSBjb21tYW5kIGxpbmUgdG8gZ2V0IHRoZSBjb3JyZWN0CisgICAgICogdmFyaWFudHMgZm9yIHRoZSBjb21waWxlci4KKyAgICAgKi8KKyMgICAgaWZuZGVmIFBOR0NBUEkKKyMgICAgICBkZWZpbmUgUE5HQ0FQSSBfY2RlY2wKKyMgICAgZW5kaWYKKyMgICAgaWYgUE5HX0FQSV9SVUxFID09IDEgJiYgIWRlZmluZWQoUE5HQVBJKQorIyAgICAgIGRlZmluZSBQTkdBUEkgX3N0ZGNhbGwKKyMgICAgZW5kaWYKKyMgIGVuZGlmIC8qIGNvbXBpbGVyL2FwaSAqLworCisgIC8qIE5PVEU6IFBOR0NCQVBJIGFsd2F5cyBkZWZhdWx0cyB0byBQTkdDQVBJLiAqLworCisjICBpZiBkZWZpbmVkKFBOR0FQSSkgJiYgIWRlZmluZWQoUE5HX1VTRVJfUFJJVkFURUJVSUxEKQorIyAgICAgZXJyb3IgIlBOR19VU0VSX1BSSVZBVEVCVUlMRCBtdXN0IGJlIGRlZmluZWQgaWYgUE5HQVBJIGlzIGNoYW5nZWQiCisjICBlbmRpZgorCisjICBpZiAoZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPCA4MDApIHx8XAorICAgICAgKGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiBfX0JPUkxBTkRDX18gPCAweDUwMCkKKyAgICAvKiBvbGRlciBCb3JsYW5kIGFuZCBNU0MKKyAgICAgKiBjb21waWxlcnMgdXNlZCAnX19leHBvcnQnIGFuZCByZXF1aXJlZCB0aGlzIHRvIGJlIGFmdGVyCisgICAgICogdGhlIHR5cGUuCisgICAgICovCisjICAgIGlmbmRlZiBQTkdfRVhQT1JUX1RZUEUKKyMgICAgICBkZWZpbmUgUE5HX0VYUE9SVF9UWVBFKHR5cGUpIHR5cGUgUE5HX0lNUEVYUAorIyAgICBlbmRpZgorIyAgICBkZWZpbmUgUE5HX0RMTF9FWFBPUlQgX19leHBvcnQKKyMgIGVsc2UgLyogbmV3ZXIgY29tcGlsZXIgKi8KKyMgICAgZGVmaW5lIFBOR19ETExfRVhQT1JUIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgICBpZm5kZWYgUE5HX0RMTF9JTVBPUlQKKyMgICAgICBkZWZpbmUgUE5HX0RMTF9JTVBPUlQgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgIGVuZGlmCisjICBlbmRpZiAvKiBjb21waWxlciAqLworCisjZWxzZSAvKiAhV2luZG93cyAqLworIyAgaWYgKGRlZmluZWQoX19JQk1DX18pIHx8IGRlZmluZWQoX19JQk1DUFBfXykpICYmIGRlZmluZWQoX19PUzJfXykKKyMgICAgZGVmaW5lIFBOR0FQSSBfU3lzdGVtCisjICBlbHNlIC8qICFXaW5kb3dzL3g4NiAmJiAhT1MvMiAqLworICAgIC8qIFVzZSB0aGUgZGVmYXVsdHMsIG9yIGRlZmluZSBQTkcqQVBJIG9uIHRoZSBjb21tYW5kIGxpbmUgKGJ1dAorICAgICAqIHRoaXMgd2lsbCBoYXZlIHRvIGJlIGRvbmUgZm9yIGV2ZXJ5IGNvbXBpbGUhKQorICAgICAqLworIyAgZW5kaWYgLyogb3RoZXIgc3lzdGVtLCAhT1MvMiAqLworI2VuZGlmIC8qICFXaW5kb3dzL3g4NiAqLworCisvKiBOb3cgZG8gYWxsIHRoZSBkZWZhdWx0aW5nIC4gKi8KKyNpZm5kZWYgUE5HQ0FQSQorIyAgZGVmaW5lIFBOR0NBUEkKKyNlbmRpZgorI2lmbmRlZiBQTkdDQkFQSQorIyAgZGVmaW5lIFBOR0NCQVBJIFBOR0NBUEkKKyNlbmRpZgorI2lmbmRlZiBQTkdBUEkKKyMgIGRlZmluZSBQTkdBUEkgUE5HQ0FQSQorI2VuZGlmCisKKy8qIFBOR19JTVBFWFAgbWF5IGJlIHNldCBvbiB0aGUgY29tcGlsYXRpb24gc3lzdGVtIGNvbW1hbmQgbGluZSBvciAoaWYgbm90IHNldCkKKyAqIHRoZW4gaW4gYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUgd2hlbiBidWlsZGluZyB0aGUgbGlicmFyeSwgb3RoZXJ3aXNlICh3aGVuCisgKiB1c2luZyB0aGUgbGlicmFyeSkgaXQgaXMgc2V0IGhlcmUuCisgKi8KKyNpZm5kZWYgUE5HX0lNUEVYUAorIyAgaWYgZGVmaW5lZChQTkdfVVNFX0RMTCkgJiYgZGVmaW5lZChQTkdfRExMX0lNUE9SVCkKKyAgICAgLyogVGhpcyBmb3JjZXMgdXNlIG9mIGEgRExMLCBkaXNhbGxvd2luZyBzdGF0aWMgbGlua2luZyAqLworIyAgICBkZWZpbmUgUE5HX0lNUEVYUCBQTkdfRExMX0lNUE9SVAorIyAgZW5kaWYKKworIyAgaWZuZGVmIFBOR19JTVBFWFAKKyMgICAgZGVmaW5lIFBOR19JTVBFWFAKKyMgIGVuZGlmCisjZW5kaWYKKworLyogSW4gMS41LjIgdGhlIGRlZmluaXRpb24gb2YgUE5HX0ZVTkNUSU9OIGhhcyBiZWVuIGNoYW5nZWQgdG8gYWx3YXlzIHRyZWF0CisgKiAnYXR0cmlidXRlcycgYXMgYSBzdG9yYWdlIGNsYXNzIC0gdGhlIGF0dHJpYnV0ZXMgZ28gYXQgdGhlIHN0YXJ0IG9mIHRoZQorICogZnVuY3Rpb24gZGVmaW5pdGlvbiwgYW5kIGF0dHJpYnV0ZXMgYXJlIGFsd2F5cyBhcHBlbmRlZCByZWdhcmRsZXNzIG9mIHRoZQorICogY29tcGlsZXIuICBUaGlzIGNvbnNpZGVyYWJseSBzaW1wbGlmaWVzIHRoZXNlIG1hY3JvcyBidXQgbWF5IGNhdXNlIHByb2JsZW1zCisgKiBpZiBhbnkgY29tcGlsZXJzIGJvdGggbmVlZCBmdW5jdGlvbiBhdHRyaWJ1dGVzIGFuZCBmYWlsIHRvIGhhbmRsZSB0aGVtIGFzCisgKiBhIHN0b3JhZ2UgY2xhc3MgKHRoaXMgaXMgdW5saWtlbHkuKQorICovCisjaWZuZGVmIFBOR19GVU5DVElPTgorIyAgZGVmaW5lIFBOR19GVU5DVElPTih0eXBlLCBuYW1lLCBhcmdzLCBhdHRyaWJ1dGVzKSBhdHRyaWJ1dGVzIHR5cGUgbmFtZSBhcmdzCisjZW5kaWYKKworI2lmbmRlZiBQTkdfRVhQT1JUX1RZUEUKKyMgIGRlZmluZSBQTkdfRVhQT1JUX1RZUEUodHlwZSkgUE5HX0lNUEVYUCB0eXBlCisjZW5kaWYKKworICAgLyogVGhlIG9yZGluYWwgdmFsdWUgaXMgb25seSByZWxldmFudCB3aGVuIHByZXByb2Nlc3NpbmcgcG5nLmggZm9yIHN5bWJvbAorICAgICogdGFibGUgZW50cmllcywgc28gd2UgZGlzY2FyZCBpdCBoZXJlLiAgU2VlIHRoZSAuZGZuIGZpbGVzIGluIHRoZQorICAgICogc2NyaXB0cyBkaXJlY3RvcnkuCisgICAgKi8KKworI2lmbmRlZiBQTkdfRVhQT1JUQQorIyAgZGVmaW5lIFBOR19FWFBPUlRBKG9yZGluYWwsIHR5cGUsIG5hbWUsIGFyZ3MsIGF0dHJpYnV0ZXMpIFwKKyAgICAgIFBOR19GVU5DVElPTihQTkdfRVhQT1JUX1RZUEUodHlwZSksIChQTkdBUEkgbmFtZSksIFBOR0FSRyhhcmdzKSwgXAorICAgICAgUE5HX0xJTktBR0VfQVBJIGF0dHJpYnV0ZXMpCisjZW5kaWYKKworLyogQU5TSS1DIChDOTApIGRvZXMgbm90IHBlcm1pdCBhIG1hY3JvIHRvIGJlIGludm9rZWQgd2l0aCBhbiBlbXB0eSBhcmd1bWVudCwKKyAqIHNvIG1ha2Ugc29tZXRoaW5nIG5vbi1lbXB0eSB0byBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudDoKKyAqLworI2RlZmluZSBQTkdfRU1QVFkgLyplbXB0eSBsaXN0Ki8KKworI2RlZmluZSBQTkdfRVhQT1JUKG9yZGluYWwsIHR5cGUsIG5hbWUsIGFyZ3MpIFwKKyAgIFBOR19FWFBPUlRBKG9yZGluYWwsIHR5cGUsIG5hbWUsIGFyZ3MsIFBOR19FTVBUWSkKKworLyogVXNlIFBOR19SRU1PVkVEIHRvIGNvbW1lbnQgb3V0IGEgcmVtb3ZlZCBpbnRlcmZhY2UuICovCisjaWZuZGVmIFBOR19SRU1PVkVECisjICBkZWZpbmUgUE5HX1JFTU9WRUQob3JkaW5hbCwgdHlwZSwgbmFtZSwgYXJncywgYXR0cmlidXRlcykKKyNlbmRpZgorCisjaWZuZGVmIFBOR19DQUxMQkFDSworIyAgZGVmaW5lIFBOR19DQUxMQkFDSyh0eXBlLCBuYW1lLCBhcmdzKSB0eXBlIChQTkdDQkFQSSBuYW1lKSBQTkdBUkcoYXJncykKKyNlbmRpZgorCisvKiBTdXBwb3J0IGZvciBjb21waWxlciBzcGVjaWZpYyBmdW5jdGlvbiBhdHRyaWJ1dGVzLiAgVGhlc2UgYXJlIHVzZWQKKyAqIHNvIHRoYXQgd2hlcmUgY29tcGlsZXIgc3VwcG9ydCBpcyBhdmFpbGFibGUgaW5jb3JyZWN0IHVzZSBvZiBBUEkKKyAqIGZ1bmN0aW9ucyBpbiBwbmcuaCB3aWxsIGdlbmVyYXRlIGNvbXBpbGVyIHdhcm5pbmdzLgorICoKKyAqIEFkZGVkIGF0IGxpYnBuZy0xLjIuNDEuCisgKi8KKworI2lmbmRlZiBQTkdfTk9fUEVEQU5USUNfV0FSTklOR1MKKyMgIGlmbmRlZiBQTkdfUEVEQU5USUNfV0FSTklOR1NfU1VQUE9SVEVECisjICAgIGRlZmluZSBQTkdfUEVEQU5USUNfV0FSTklOR1NfU1VQUE9SVEVECisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBQTkdfUEVEQU5USUNfV0FSTklOR1NfU1VQUE9SVEVECisgIC8qIFN1cHBvcnQgZm9yIGNvbXBpbGVyIHNwZWNpZmljIGZ1bmN0aW9uIGF0dHJpYnV0ZXMuICBUaGVzZSBhcmUgdXNlZAorICAgKiBzbyB0aGF0IHdoZXJlIGNvbXBpbGVyIHN1cHBvcnQgaXMgYXZhaWxhYmxlLCBpbmNvcnJlY3QgdXNlIG9mIEFQSQorICAgKiBmdW5jdGlvbnMgaW4gcG5nLmggd2lsbCBnZW5lcmF0ZSBjb21waWxlciB3YXJuaW5ncy4gIEFkZGVkIGF0IGxpYnBuZworICAgKiB2ZXJzaW9uIDEuMi40MS4gIERpc2FibGluZyB0aGVzZSByZW1vdmVzIHRoZSB3YXJuaW5ncyBidXQgbWF5IGFsc28gcHJvZHVjZQorICAgKiBsZXNzIGVmZmljaWVudCBjb2RlLgorICAgKi8KKyMgIGlmIGRlZmluZWQoX19jbGFuZ19fKSAmJiBkZWZpbmVkKF9faGFzX2F0dHJpYnV0ZSkKKyAgICAgLyogQ2xhbmcgZGVmaW5lcyBib3RoIF9fY2xhbmdfXyBhbmQgX19HTlVDX18uIENoZWNrIF9fY2xhbmdfXyBmaXJzdC4gKi8KKyMgICAgaWYgIWRlZmluZWQoUE5HX1VTRV9SRVNVTFQpICYmIF9faGFzX2F0dHJpYnV0ZShfX3dhcm5fdW51c2VkX3Jlc3VsdF9fKQorIyAgICAgIGRlZmluZSBQTkdfVVNFX1JFU1VMVCBfX2F0dHJpYnV0ZV9fKChfX3dhcm5fdW51c2VkX3Jlc3VsdF9fKSkKKyMgICAgZW5kaWYKKyMgICAgaWYgIWRlZmluZWQoUE5HX05PUkVUVVJOKSAmJiBfX2hhc19hdHRyaWJ1dGUoX19ub3JldHVybl9fKQorIyAgICAgIGRlZmluZSBQTkdfTk9SRVRVUk4gX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSkKKyMgICAgZW5kaWYKKyMgICAgaWYgIWRlZmluZWQoUE5HX0FMTE9DQVRFRCkgJiYgX19oYXNfYXR0cmlidXRlKF9fbWFsbG9jX18pCisjICAgICAgZGVmaW5lIFBOR19BTExPQ0FURUQgX19hdHRyaWJ1dGVfXygoX19tYWxsb2NfXykpCisjICAgIGVuZGlmCisjICAgIGlmICFkZWZpbmVkKFBOR19ERVBSRUNBVEVEKSAmJiBfX2hhc19hdHRyaWJ1dGUoX19kZXByZWNhdGVkX18pCisjICAgICAgZGVmaW5lIFBOR19ERVBSRUNBVEVEIF9fYXR0cmlidXRlX18oKF9fZGVwcmVjYXRlZF9fKSkKKyMgICAgZW5kaWYKKyMgICAgaWYgIWRlZmluZWQoUE5HX1BSSVZBVEUpCisjICAgICAgaWZkZWYgX19oYXNfZXh0ZW5zaW9uCisjICAgICAgICBpZiBfX2hhc19leHRlbnNpb24oYXR0cmlidXRlX3VuYXZhaWxhYmxlX3dpdGhfbWVzc2FnZSkKKyMgICAgICAgICAgZGVmaW5lIFBOR19QUklWQVRFIF9fYXR0cmlidXRlX18oKF9fdW5hdmFpbGFibGVfXyhcCisgICAgICAgICAgICAgIlRoaXMgZnVuY3Rpb24gaXMgbm90IGV4cG9ydGVkIGJ5IGxpYnBuZy4iKSkpCisjICAgICAgICBlbmRpZgorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICAgIGlmbmRlZiBQTkdfUkVTVFJJQ1QKKyMgICAgICBkZWZpbmUgUE5HX1JFU1RSSUNUIF9fcmVzdHJpY3QKKyMgICAgZW5kaWYKKworIyAgZWxpZiBkZWZpbmVkKF9fR05VQ19fKQorIyAgICBpZm5kZWYgUE5HX1VTRV9SRVNVTFQKKyMgICAgICBkZWZpbmUgUE5HX1VTRV9SRVNVTFQgX19hdHRyaWJ1dGVfXygoX193YXJuX3VudXNlZF9yZXN1bHRfXykpCisjICAgIGVuZGlmCisjICAgIGlmbmRlZiBQTkdfTk9SRVRVUk4KKyMgICAgICBkZWZpbmUgUE5HX05PUkVUVVJOICAgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSkKKyMgICAgZW5kaWYKKyMgICAgaWYgX19HTlVDX18gPj0gMworIyAgICAgIGlmbmRlZiBQTkdfQUxMT0NBVEVECisjICAgICAgICBkZWZpbmUgUE5HX0FMTE9DQVRFRCAgX19hdHRyaWJ1dGVfXygoX19tYWxsb2NfXykpCisjICAgICAgZW5kaWYKKyMgICAgICBpZm5kZWYgUE5HX0RFUFJFQ0FURUQKKyMgICAgICAgIGRlZmluZSBQTkdfREVQUkVDQVRFRCBfX2F0dHJpYnV0ZV9fKChfX2RlcHJlY2F0ZWRfXykpCisjICAgICAgZW5kaWYKKyMgICAgICBpZm5kZWYgUE5HX1BSSVZBVEUKKyMgICAgICAgIGlmIDAgLyogRG9lc24ndCB3b3JrIHNvIHdlIHVzZSBkZXByZWNhdGVkIGluc3RlYWQqLworIyAgICAgICAgICBkZWZpbmUgUE5HX1BSSVZBVEUgXAorICAgICAgICAgICAgX19hdHRyaWJ1dGVfXygod2FybmluZygiVGhpcyBmdW5jdGlvbiBpcyBub3QgZXhwb3J0ZWQgYnkgbGlicG5nLiIpKSkKKyMgICAgICAgIGVsc2UKKyMgICAgICAgICAgZGVmaW5lIFBOR19QUklWQVRFIFwKKyAgICAgICAgICAgIF9fYXR0cmlidXRlX18oKF9fZGVwcmVjYXRlZF9fKSkKKyMgICAgICAgIGVuZGlmCisjICAgICAgZW5kaWYKKyMgICAgICBpZiAoKF9fR05VQ19fID4gMykgfHwgIWRlZmluZWQoX19HTlVDX01JTk9SX18pIHx8IChfX0dOVUNfTUlOT1JfXyA+PSAxKSkKKyMgICAgICAgIGlmbmRlZiBQTkdfUkVTVFJJQ1QKKyMgICAgICAgICAgZGVmaW5lIFBOR19SRVNUUklDVCBfX3Jlc3RyaWN0CisjICAgICAgICBlbmRpZgorIyAgICAgIGVuZGlmIC8qIF9fR05VQ19fLl9fR05VQ19NSU5PUl9fID4gMy4wICovCisjICAgIGVuZGlmIC8qIF9fR05VQ19fID49IDMgKi8KKworIyAgZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAgJiYgKF9NU0NfVkVSID49IDEzMDApCisjICAgIGlmbmRlZiBQTkdfVVNFX1JFU1VMVAorIyAgICAgIGRlZmluZSBQTkdfVVNFX1JFU1VMVCAvKiBub3Qgc3VwcG9ydGVkICovCisjICAgIGVuZGlmCisjICAgIGlmbmRlZiBQTkdfTk9SRVRVUk4KKyMgICAgICBkZWZpbmUgUE5HX05PUkVUVVJOICAgX19kZWNsc3BlYyhub3JldHVybikKKyMgICAgZW5kaWYKKyMgICAgaWZuZGVmIFBOR19BTExPQ0FURUQKKyMgICAgICBpZiAoX01TQ19WRVIgPj0gMTQwMCkKKyMgICAgICAgIGRlZmluZSBQTkdfQUxMT0NBVEVEIF9fZGVjbHNwZWMocmVzdHJpY3QpCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgICAgaWZuZGVmIFBOR19ERVBSRUNBVEVECisjICAgICAgZGVmaW5lIFBOR19ERVBSRUNBVEVEIF9fZGVjbHNwZWMoZGVwcmVjYXRlZCkKKyMgICAgZW5kaWYKKyMgICAgaWZuZGVmIFBOR19QUklWQVRFCisjICAgICAgZGVmaW5lIFBOR19QUklWQVRFIF9fZGVjbHNwZWMoZGVwcmVjYXRlZCkKKyMgICAgZW5kaWYKKyMgICAgaWZuZGVmIFBOR19SRVNUUklDVAorIyAgICAgIGlmIChfTVNDX1ZFUiA+PSAxNDAwKQorIyAgICAgICAgZGVmaW5lIFBOR19SRVNUUklDVCBfX3Jlc3RyaWN0CisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKworIyAgZWxpZiBkZWZpbmVkKF9fV0FUQ09NQ19fKQorIyAgICBpZm5kZWYgUE5HX1JFU1RSSUNUCisjICAgICAgZGVmaW5lIFBOR19SRVNUUklDVCBfX3Jlc3RyaWN0CisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmIC8qIFBOR19QRURBTlRJQ19XQVJOSU5HUyAqLworCisjaWZuZGVmIFBOR19ERVBSRUNBVEVECisjICBkZWZpbmUgUE5HX0RFUFJFQ0FURUQgIC8qIFVzZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgKi8KKyNlbmRpZgorI2lmbmRlZiBQTkdfVVNFX1JFU1VMVAorIyAgZGVmaW5lIFBOR19VU0VfUkVTVUxUICAvKiBUaGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjaGVja2VkICovCisjZW5kaWYKKyNpZm5kZWYgUE5HX05PUkVUVVJOCisjICBkZWZpbmUgUE5HX05PUkVUVVJOICAgIC8qIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuICovCisjZW5kaWYKKyNpZm5kZWYgUE5HX0FMTE9DQVRFRAorIyAgZGVmaW5lIFBOR19BTExPQ0FURUQgICAvKiBUaGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBpcyBuZXcgbWVtb3J5ICovCisjZW5kaWYKKyNpZm5kZWYgUE5HX1BSSVZBVEUKKyMgIGRlZmluZSBQTkdfUFJJVkFURSAgICAgLyogVGhpcyBpcyBhIHByaXZhdGUgbGlicG5nIGZ1bmN0aW9uICovCisjZW5kaWYKKyNpZm5kZWYgUE5HX1JFU1RSSUNUCisjICBkZWZpbmUgUE5HX1JFU1RSSUNUICAgIC8qIFRoZSBDOTkgInJlc3RyaWN0IiBmZWF0dXJlICovCisjZW5kaWYKKworI2lmbmRlZiBQTkdfRlBfRVhQT1JUICAgICAvKiBBIGZsb2F0aW5nIHBvaW50IEFQSS4gKi8KKyMgIGlmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKKyMgICAgIGRlZmluZSBQTkdfRlBfRVhQT1JUKG9yZGluYWwsIHR5cGUsIG5hbWUsIGFyZ3MpXAorICAgICAgICAgUE5HX0VYUE9SVChvcmRpbmFsLCB0eXBlLCBuYW1lLCBhcmdzKTsKKyMgIGVsc2UgICAgICAgICAgICAgICAgICAgLyogTm8gZmxvYXRpbmcgcG9pbnQgQVBJcyAqLworIyAgICAgZGVmaW5lIFBOR19GUF9FWFBPUlQob3JkaW5hbCwgdHlwZSwgbmFtZSwgYXJncykKKyMgIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgUE5HX0ZJWEVEX0VYUE9SVCAgLyogQSBmaXhlZCBwb2ludCBBUEkuICovCisjICBpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECisjICAgICBkZWZpbmUgUE5HX0ZJWEVEX0VYUE9SVChvcmRpbmFsLCB0eXBlLCBuYW1lLCBhcmdzKVwKKyAgICAgICAgIFBOR19FWFBPUlQob3JkaW5hbCwgdHlwZSwgbmFtZSwgYXJncyk7CisjICBlbHNlICAgICAgICAgICAgICAgICAgIC8qIE5vIGZpeGVkIHBvaW50IEFQSXMgKi8KKyMgICAgIGRlZmluZSBQTkdfRklYRURfRVhQT1JUKG9yZGluYWwsIHR5cGUsIG5hbWUsIGFyZ3MpCisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgUE5HX0JVSUxESU5HX1NZTUJPTF9UQUJMRQorLyogU29tZSB0eXBlZGVmcyB0byBnZXQgdXMgc3RhcnRlZC4gIFRoZXNlIHNob3VsZCBiZSBzYWZlIG9uIG1vc3Qgb2YgdGhlIGNvbW1vbgorICogcGxhdGZvcm1zLgorICoKKyAqIHBuZ191aW50XzMyIGFuZCBwbmdfaW50XzMyIG1heSwgY3VycmVudGx5LCBiZSBsYXJnZXIgdGhhbiByZXF1aXJlZCB0byBob2xkIGEKKyAqIDMyLWJpdCB2YWx1ZSBob3dldmVyIHRoaXMgaXMgbm90IG5vcm1hbGx5IGFkdmlzYWJsZS4KKyAqCisgKiBwbmdfdWludF8xNiBhbmQgcG5nX2ludF8xNiBzaG91bGQgYWx3YXlzIGJlIHR3byBieXRlcyBpbiBzaXplIC0gdGhpcyBpcworICogdmVyaWZpZWQgYXQgbGlicmFyeSBidWlsZCB0aW1lLgorICoKKyAqIHBuZ19ieXRlIG11c3QgYWx3YXlzIGJlIG9uZSBieXRlIGluIHNpemUuCisgKgorICogVGhlIGNoZWNrcyBiZWxvdyB1c2UgY29uc3RhbnRzIGZyb20gbGltaXRzLmgsIGFzIGRlZmluZWQgYnkgdGhlIElTT0M5MAorICogc3RhbmRhcmQuCisgKi8KKyNpZiBDSEFSX0JJVCA9PSA4ICYmIFVDSEFSX01BWCA9PSAyNTUKKyAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciBwbmdfYnl0ZTsKKyNlbHNlCisjICBlcnJvciAibGlicG5nIHJlcXVpcmVzIDgtYml0IGJ5dGVzIgorI2VuZGlmCisKKyNpZiBJTlRfTUlOID09IC0zMjc2OCAmJiBJTlRfTUFYID09IDMyNzY3CisgICB0eXBlZGVmIGludCBwbmdfaW50XzE2OworI2VsaWYgU0hSVF9NSU4gPT0gLTMyNzY4ICYmIFNIUlRfTUFYID09IDMyNzY3CisgICB0eXBlZGVmIHNob3J0IHBuZ19pbnRfMTY7CisjZWxzZQorIyAgZXJyb3IgImxpYnBuZyByZXF1aXJlcyBhIHNpZ25lZCAxNi1iaXQgdHlwZSIKKyNlbmRpZgorCisjaWYgVUlOVF9NQVggPT0gNjU1MzUKKyAgIHR5cGVkZWYgdW5zaWduZWQgaW50IHBuZ191aW50XzE2OworI2VsaWYgVVNIUlRfTUFYID09IDY1NTM1CisgICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHBuZ191aW50XzE2OworI2Vsc2UKKyMgIGVycm9yICJsaWJwbmcgcmVxdWlyZXMgYW4gdW5zaWduZWQgMTYtYml0IHR5cGUiCisjZW5kaWYKKworI2lmIElOVF9NSU4gPCAtMjE0NzQ4MzY0NiAmJiBJTlRfTUFYID4gMjE0NzQ4MzY0NgorICAgdHlwZWRlZiBpbnQgcG5nX2ludF8zMjsKKyNlbGlmIExPTkdfTUlOIDwgLTIxNDc0ODM2NDYgJiYgTE9OR19NQVggPiAyMTQ3NDgzNjQ2CisgICB0eXBlZGVmIGxvbmcgaW50IHBuZ19pbnRfMzI7CisjZWxzZQorIyAgZXJyb3IgImxpYnBuZyByZXF1aXJlcyBhIHNpZ25lZCAzMi1iaXQgKG9yIG1vcmUpIHR5cGUiCisjZW5kaWYKKworI2lmIFVJTlRfTUFYID4gNDI5NDk2NzI5NAorICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgcG5nX3VpbnRfMzI7CisjZWxpZiBVTE9OR19NQVggPiA0Mjk0OTY3Mjk0CisgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IHBuZ191aW50XzMyOworI2Vsc2UKKyMgIGVycm9yICJsaWJwbmcgcmVxdWlyZXMgYW4gdW5zaWduZWQgMzItYml0IChvciBtb3JlKSB0eXBlIgorI2VuZGlmCisKKy8qIFByaW9yIHRvIDEuNi4wIGl0IHdhcyBwb3NzaWJsZSB0byBkaXNhYmxlIHRoZSB1c2Ugb2Ygc2l6ZV90LCAxLjYuMCwgaG93ZXZlciwKKyAqIHJlcXVpcmVzIGFuIElTT0M5MCBjb21waWxlciBhbmQgcmVsaWVzIG9uIGNvbnNpc3RlbnQgYmVoYXZpb3Igb2Ygc2l6ZW9mLgorICovCit0eXBlZGVmIHNpemVfdCBwbmdfc2l6ZV90OwordHlwZWRlZiBwdHJkaWZmX3QgcG5nX3B0cmRpZmZfdDsKKworLyogbGlicG5nIG5lZWRzIHRvIGtub3cgdGhlIG1heGltdW0gdmFsdWUgb2YgJ3NpemVfdCcgYW5kIHRoaXMgY29udHJvbHMgdGhlCisgKiBkZWZpbml0aW9uIG9mIHBuZ19hbGxvY19zaXplX3QsIGJlbG93LiAgVGhpcyBtYXhpbXVtIHZhbHVlIG9mIHNpemVfdCBsaW1pdHMKKyAqIGJ1dCBkb2VzIG5vdCBjb250cm9sIHRoZSBtYXhpbXVtIGFsbG9jYXRpb25zIHRoZSBsaWJyYXJ5IG1ha2VzIC0gdGhlcmUgaXMKKyAqIGRpcmVjdCBhcHBsaWNhdGlvbiBjb250cm9sIG9mIHRoaXMgdGhyb3VnaCBwbmdfc2V0X3VzZXJfbGltaXRzKCkuCisgKi8KKyNpZm5kZWYgUE5HX1NNQUxMX1NJWkVfVAorICAgLyogQ29tcGlsZXIgc3BlY2lmaWMgdGVzdHMgZm9yIHN5c3RlbXMgd2hlcmUgc2l6ZV90IGlzIGtub3duIHRvIGJlIGxlc3MgdGhhbgorICAgICogMzIgYml0cyAoc29tZSBvZiB0aGVzZSBzeXN0ZW1zIG1heSBubyBsb25nZXIgd29yayBiZWNhdXNlIG9mIHRoZSBsYWNrIG9mCisgICAgKiAnZmFyJyBzdXBwb3J0OyBzZWUgYWJvdmUuKQorICAgICovCisjICBpZiAoZGVmaW5lZChfX1RVUkJPQ19fKSAmJiAhZGVmaW5lZChfX0ZMQVRfXykpIHx8XAorICAgKGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoTUFYU0VHXzY0SykpCisjICAgICBkZWZpbmUgUE5HX1NNQUxMX1NJWkVfVAorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBwbmdfYWxsb2Nfc2l6ZV90IGlzIGd1YXJhbnRlZWQgdG8gYmUgbm8gc21hbGxlciB0aGFuIHBuZ19zaXplX3QsIGFuZCBubworICogc21hbGxlciB0aGFuIHBuZ191aW50XzMyLiAgQ2FzdHMgZnJvbSBwbmdfc2l6ZV90IG9yIHBuZ191aW50XzMyIHRvCisgKiBwbmdfYWxsb2Nfc2l6ZV90IGFyZSBub3QgbmVjZXNzYXJ5OyBpbiBmYWN0LCBpdCBpcyByZWNvbW1lbmRlZCBub3QgdG8gdXNlCisgKiB0aGVtIGF0IGFsbCBzbyB0aGF0IHRoZSBjb21waWxlciBjYW4gY29tcGxhaW4gd2hlbiBzb21ldGhpbmcgdHVybnMgb3V0IHRvIGJlCisgKiBwcm9ibGVtYXRpYy4KKyAqCisgKiBDYXN0cyBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uIChmcm9tIHBuZ19hbGxvY19zaXplX3QgdG8gcG5nX3NpemVfdCBvcgorICogcG5nX3VpbnRfMzIpIHNob3VsZCBiZSBleHBsaWNpdGx5IGFwcGxpZWQ7IGhvd2V2ZXIsIHdlIGRvIG5vdCBleHBlY3QgdG8KKyAqIGVuY291bnRlciBwcmFjdGljYWwgc2l0dWF0aW9ucyB0aGF0IHJlcXVpcmUgc3VjaCBjb252ZXJzaW9ucy4KKyAqCisgKiBQTkdfU01BTExfU0laRV9UIG11c3QgYmUgZGVmaW5lZCBpZiB0aGUgbWF4aW11bSB2YWx1ZSBvZiBzaXplX3QgaXMgbGVzcyB0aGFuCisgKiA0Mjk0OTY3Mjk1IC0gaS5lLiBsZXNzIHRoYW4gdGhlIG1heGltdW0gdmFsdWUgb2YgcG5nX3VpbnRfMzIuCisgKi8KKyNpZmRlZiBQTkdfU01BTExfU0laRV9UCisgICB0eXBlZGVmIHBuZ191aW50XzMyIHBuZ19hbGxvY19zaXplX3Q7CisjZWxzZQorICAgdHlwZWRlZiBwbmdfc2l6ZV90IHBuZ19hbGxvY19zaXplX3Q7CisjZW5kaWYKKworLyogUHJpb3IgdG8gMS42LjAgbGlicG5nIG9mZmVyZWQgbGltaXRlZCBzdXBwb3J0IGZvciBNaWNyb3NvZnQgQyBjb21waWxlcgorICogaW1wbGVtZW50YXRpb25zIG9mIEludGVsIENQVSBzcGVjaWZpYyBzdXBwb3J0IG9mIHVzZXItbW9kZSBzZWdtZW50ZWQgYWRkcmVzcworICogc3BhY2VzLCB3aGVyZSAxNi1iaXQgcG9pbnRlcnMgYWRkcmVzcyBtb3JlIHRoYW4gNjU1MzYgYnl0ZXMgb2YgbWVtb3J5IHVzaW5nCisgKiBzZXBhcmF0ZSAnc2VnbWVudCcgcmVnaXN0ZXJzLiAgVGhlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHR3byBkaWZmZXJlbnQKKyAqIHR5cGVzIG9mIHBvaW50ZXIgKG9ubHkgb25lIG9mIHdoaWNoIGluY2x1ZGVzIHRoZSBzZWdtZW50IHZhbHVlLikKKyAqCisgKiBJZiByZXF1aXJlZCB0aGlzIHN1cHBvcnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gMS4yIG9mIGxpYnBuZyBhbmQgbWF5IGJlCisgKiBhdmFpbGFibGUgaW4gdmVyc2lvbnMgdGhyb3VnaCAxLjUsIGFsdGhvdWdoIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgY29kZSBoYXMKKyAqIG5vdCBiZWVuIHZlcmlmaWVkIHJlY2VudGx5LgorICovCisKKy8qIFR5cGVkZWYgZm9yIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgdGhhdCBhcmUgY29udmVydGVkIHRvIGZpeGVkLXBvaW50IHdpdGggYQorICogbXVsdGlwbGUgb2YgMTAwLDAwMCwgZS5nLiwgZ2FtbWEKKyAqLwordHlwZWRlZiBwbmdfaW50XzMyIHBuZ19maXhlZF9wb2ludDsKKworLyogQWRkIHR5cGVkZWZzIGZvciBwb2ludGVycyAqLwordHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgICAgKiBwbmdfdm9pZHA7Cit0eXBlZGVmIGNvbnN0IHZvaWQgICAgICAgICAgICAqIHBuZ19jb25zdF92b2lkcDsKK3R5cGVkZWYgcG5nX2J5dGUgICAgICAgICAgICAgICogcG5nX2J5dGVwOwordHlwZWRlZiBjb25zdCBwbmdfYnl0ZSAgICAgICAgKiBwbmdfY29uc3RfYnl0ZXA7Cit0eXBlZGVmIHBuZ191aW50XzMyICAgICAgICAgICAqIHBuZ191aW50XzMycDsKK3R5cGVkZWYgY29uc3QgcG5nX3VpbnRfMzIgICAgICogcG5nX2NvbnN0X3VpbnRfMzJwOwordHlwZWRlZiBwbmdfaW50XzMyICAgICAgICAgICAgKiBwbmdfaW50XzMycDsKK3R5cGVkZWYgY29uc3QgcG5nX2ludF8zMiAgICAgICogcG5nX2NvbnN0X2ludF8zMnA7Cit0eXBlZGVmIHBuZ191aW50XzE2ICAgICAgICAgICAqIHBuZ191aW50XzE2cDsKK3R5cGVkZWYgY29uc3QgcG5nX3VpbnRfMTYgICAgICogcG5nX2NvbnN0X3VpbnRfMTZwOwordHlwZWRlZiBwbmdfaW50XzE2ICAgICAgICAgICAgKiBwbmdfaW50XzE2cDsKK3R5cGVkZWYgY29uc3QgcG5nX2ludF8xNiAgICAgICogcG5nX2NvbnN0X2ludF8xNnA7Cit0eXBlZGVmIGNoYXIgICAgICAgICAgICAgICAgICAqIHBuZ19jaGFycDsKK3R5cGVkZWYgY29uc3QgY2hhciAgICAgICAgICAgICogcG5nX2NvbnN0X2NoYXJwOwordHlwZWRlZiBwbmdfZml4ZWRfcG9pbnQgICAgICAgKiBwbmdfZml4ZWRfcG9pbnRfcDsKK3R5cGVkZWYgY29uc3QgcG5nX2ZpeGVkX3BvaW50ICogcG5nX2NvbnN0X2ZpeGVkX3BvaW50X3A7Cit0eXBlZGVmIHBuZ19zaXplX3QgICAgICAgICAgICAqIHBuZ19zaXplX3RwOwordHlwZWRlZiBjb25zdCBwbmdfc2l6ZV90ICAgICAgKiBwbmdfY29uc3Rfc2l6ZV90cDsKKworI2lmZGVmIFBOR19TVERJT19TVVBQT1JURUQKK3R5cGVkZWYgRklMRSAgICAgICAgICAgICogcG5nX0ZJTEVfcDsKKyNlbmRpZgorCisjaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAordHlwZWRlZiBkb3VibGUgICAgICAgKiBwbmdfZG91YmxlcDsKK3R5cGVkZWYgY29uc3QgZG91YmxlICogcG5nX2NvbnN0X2RvdWJsZXA7CisjZW5kaWYKKworLyogUG9pbnRlcnMgdG8gcG9pbnRlcnM7IGkuZS4gYXJyYXlzICovCit0eXBlZGVmIHBuZ19ieXRlICAgICAgICAqICogcG5nX2J5dGVwcDsKK3R5cGVkZWYgcG5nX3VpbnRfMzIgICAgICogKiBwbmdfdWludF8zMnBwOwordHlwZWRlZiBwbmdfaW50XzMyICAgICAgKiAqIHBuZ19pbnRfMzJwcDsKK3R5cGVkZWYgcG5nX3VpbnRfMTYgICAgICogKiBwbmdfdWludF8xNnBwOwordHlwZWRlZiBwbmdfaW50XzE2ICAgICAgKiAqIHBuZ19pbnRfMTZwcDsKK3R5cGVkZWYgY29uc3QgY2hhciAgICAgICogKiBwbmdfY29uc3RfY2hhcnBwOwordHlwZWRlZiBjaGFyICAgICAgICAgICAgKiAqIHBuZ19jaGFycHA7Cit0eXBlZGVmIHBuZ19maXhlZF9wb2ludCAqICogcG5nX2ZpeGVkX3BvaW50X3BwOworI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKK3R5cGVkZWYgZG91YmxlICAgICAgICAgICogKiBwbmdfZG91YmxlcHA7CisjZW5kaWYKKworLyogUG9pbnRlcnMgdG8gcG9pbnRlcnMgdG8gcG9pbnRlcnM7IGkuZS4sIHBvaW50ZXIgdG8gYXJyYXkgKi8KK3R5cGVkZWYgY2hhciAgICAgICAgICAgICogKiAqIHBuZ19jaGFycHBwOworCisjZW5kaWYgLyogUE5HX0JVSUxESU5HX1NZTUJPTF9UQUJMRSAqLworCisjZW5kaWYgLyogUE5HQ09ORl9IICovCmRpZmYgLS1naXQgYS9saWJwbmcvcG5nZGVidWcuaCBiL2xpYnBuZy9wbmdkZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMDFiMTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvcG5nZGVidWcuaApAQCAtMCwwICsxLDE1MyBAQAorCisvKiBwbmdkZWJ1Zy5oIC0gRGVidWdnaW5nIG1hY3JvcyBmb3IgbGlicG5nLCBhbHNvIHVzZWQgaW4gcG5ndGVzdC5jCisgKgorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuOCBbRGVjZW1iZXIgMTksIDIwMTNdCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMyBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQorICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisgKiBhbmQgbGljZW5zZSBpbiBwbmcuaAorICovCisKKy8qIERlZmluZSBQTkdfREVCVUcgYXQgY29tcGlsZSB0aW1lIGZvciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBIaWdoZXIKKyAqIG51bWJlcnMgZm9yIFBOR19ERUJVRyBtZWFuIG1vcmUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyBoYXMKKyAqIG9ubHkgYmVlbiBhZGRlZCBzaW5jZSB2ZXJzaW9uIDAuOTUgc28gaXQgaXMgbm90IGltcGxlbWVudGVkIHRocm91Z2hvdXQKKyAqIGxpYnBuZyB5ZXQsIGJ1dCBtb3JlIHN1cHBvcnQgd2lsbCBiZSBhZGRlZCBhcyBuZWVkZWQuCisgKgorICogcG5nX2RlYnVnWzEtMl0/KGxldmVsLCBtZXNzYWdlICxhcmd7MC0yfSkKKyAqICAgRXhwYW5kcyB0byBhIHN0YXRlbWVudCAoZWl0aGVyIGEgc2ltcGxlIGV4cHJlc3Npb24gb3IgYSBjb21wb3VuZAorICogICBkby4ud2hpbGUoMCkgc3RhdGVtZW50KSB0aGF0IG91dHB1dHMgYSBtZXNzYWdlIHdpdGggcGFyYW1ldGVyCisgKiAgIHN1YnN0aXR1dGlvbiBpZiBQTkdfREVCVUcgaXMgZGVmaW5lZCB0byAyIG9yIG1vcmUuICBJZiBQTkdfREVCVUcKKyAqICAgaXMgdW5kZWZpbmVkLCAwIG9yIDEgZXZlcnkgcG5nX2RlYnVnIGV4cGFuZHMgdG8gYSBzaW1wbGUgZXhwcmVzc2lvbgorICogICAoYWN0dWFsbHkgKCh2b2lkKTApKS4KKyAqCisgKiAgIGxldmVsOiBsZXZlbCBvZiBkZXRhaWwgb2YgbWVzc2FnZSwgc3RhcnRpbmcgYXQgMC4gIEEgbGV2ZWwgJ24nCisgKiAgICAgICAgICBtZXNzYWdlIGlzIHByZWNlZGVkIGJ5ICduJyAzLXNwYWNlIGluZGVudGF0aW9ucyAobm90IGltcGxlbWVudGVkCisgKiAgICAgICAgICBvbiBNaWNyb3NvZnQgY29tcGlsZXJzIHVubGVzcyBQTkdfREVCVUdfRklMRSBpcyBhbHNvCisgKiAgICAgICAgICBkZWZpbmVkLCB0byBhbGxvdyBkZWJ1ZyBETEwgY29tcGlsYXRpb24gd2l0aCBubyBzdGFuZGFyZCBJTykuCisgKiAgIG1lc3NhZ2U6IGEgcHJpbnRmKDMpIHN0eWxlIHRleHQgc3RyaW5nLiAgQSB0cmFpbGluZyAnXG4nIGlzIGFkZGVkCisgKiAgICAgICAgICAgIHRvIHRoZSBtZXNzYWdlLgorICogICBhcmc6IDAgdG8gMiBhcmd1bWVudHMgZm9yIHByaW50ZigzKSBzdHlsZSBzdWJzdGl0dXRpb24gaW4gbWVzc2FnZS4KKyAqLworI2lmbmRlZiBQTkdERUJVR19ICisjZGVmaW5lIFBOR0RFQlVHX0gKKy8qIFRoZXNlIHNldHRpbmdzIGNvbnRyb2wgdGhlIGZvcm1hdHRpbmcgb2YgbWVzc2FnZXMgaW4gcG5nLmMgYW5kIHBuZ2Vycm9yLmMgKi8KKy8qIE1vdmVkIHRvIHBuZ2RlYnVnLmggYXQgMS41LjAgKi8KKyMgIGlmbmRlZiBQTkdfTElURVJBTF9TSEFSUAorIyAgICBkZWZpbmUgUE5HX0xJVEVSQUxfU0hBUlAgMHgyMworIyAgZW5kaWYKKyMgIGlmbmRlZiBQTkdfTElURVJBTF9MRUZUX1NRVUFSRV9CUkFDS0VUCisjICAgIGRlZmluZSBQTkdfTElURVJBTF9MRUZUX1NRVUFSRV9CUkFDS0VUIDB4NWIKKyMgIGVuZGlmCisjICBpZm5kZWYgUE5HX0xJVEVSQUxfUklHSFRfU1FVQVJFX0JSQUNLRVQKKyMgICAgZGVmaW5lIFBOR19MSVRFUkFMX1JJR0hUX1NRVUFSRV9CUkFDS0VUIDB4NWQKKyMgIGVuZGlmCisjICBpZm5kZWYgUE5HX1NUUklOR19ORVdMSU5FCisjICAgIGRlZmluZSBQTkdfU1RSSU5HX05FV0xJTkUgIlxuIgorIyAgZW5kaWYKKworI2lmZGVmIFBOR19ERUJVRworIyAgaWYgKFBOR19ERUJVRyA+IDApCisjICAgIGlmICFkZWZpbmVkKFBOR19ERUJVR19GSUxFKSAmJiBkZWZpbmVkKF9NU0NfVkVSKQorIyAgICAgIGluY2x1ZGUgPGNydGRiZy5oPgorIyAgICAgIGlmIChQTkdfREVCVUcgPiAxKQorIyAgICAgICAgaWZuZGVmIF9ERUJVRworIyAgICAgICAgICBkZWZpbmUgX0RFQlVHCisjICAgICAgICBlbmRpZgorIyAgICAgICAgaWZuZGVmIHBuZ19kZWJ1ZworIyAgICAgICAgICBkZWZpbmUgcG5nX2RlYnVnKGwsbSkgIF9SUFQwKF9DUlRfV0FSTixtIFBOR19TVFJJTkdfTkVXTElORSkKKyMgICAgICAgIGVuZGlmCisjICAgICAgICBpZm5kZWYgcG5nX2RlYnVnMQorIyAgICAgICAgICBkZWZpbmUgcG5nX2RlYnVnMShsLG0scDEpICBfUlBUMShfQ1JUX1dBUk4sbSBQTkdfU1RSSU5HX05FV0xJTkUscDEpCisjICAgICAgICBlbmRpZgorIyAgICAgICAgaWZuZGVmIHBuZ19kZWJ1ZzIKKyMgICAgICAgICAgZGVmaW5lIHBuZ19kZWJ1ZzIobCxtLHAxLHAyKSBcCisgICAgICAgICAgICAgX1JQVDIoX0NSVF9XQVJOLG0gUE5HX1NUUklOR19ORVdMSU5FLHAxLHAyKQorIyAgICAgICAgZW5kaWYKKyMgICAgICBlbmRpZgorIyAgICBlbHNlIC8qIFBOR19ERUJVR19GSUxFIHx8ICFfTVNDX1ZFUiAqLworIyAgICAgIGlmbmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECisjICAgICAgICBpbmNsdWRlIDxzdGRpby5oPiAvKiBub3QgaW5jbHVkZWQgeWV0ICovCisjICAgICAgZW5kaWYKKyMgICAgICBpZm5kZWYgUE5HX0RFQlVHX0ZJTEUKKyMgICAgICAgIGRlZmluZSBQTkdfREVCVUdfRklMRSBzdGRlcnIKKyMgICAgICBlbmRpZiAvKiBQTkdfREVCVUdfRklMRSAqLworCisjICAgICAgaWYgKFBOR19ERUJVRyA+IDEpCisjICAgICAgICBpZmRlZiBfX1NURENfXworIyAgICAgICAgICBpZm5kZWYgcG5nX2RlYnVnCisjICAgICAgICAgICAgZGVmaW5lIHBuZ19kZWJ1ZyhsLG0pIFwKKyAgICAgICBkbyB7IFwKKyAgICAgICBpbnQgbnVtX3RhYnM9bDsgXAorICAgICAgIGZwcmludGYoUE5HX0RFQlVHX0ZJTEUsIiVzIiBtIFBOR19TVFJJTkdfTkVXTElORSwobnVtX3RhYnM9PTEgPyAiICAgIiA6IFwKKyAgICAgICAgIChudW1fdGFicz09MiA/ICIgICAgICAiIDogKG51bV90YWJzPjIgPyAiICAgICAgICAgIiA6ICIiKSkpKTsgXAorICAgICAgIH0gd2hpbGUgKDApCisjICAgICAgICAgIGVuZGlmCisjICAgICAgICAgIGlmbmRlZiBwbmdfZGVidWcxCisjICAgICAgICAgICAgZGVmaW5lIHBuZ19kZWJ1ZzEobCxtLHAxKSBcCisgICAgICAgZG8geyBcCisgICAgICAgaW50IG51bV90YWJzPWw7IFwKKyAgICAgICBmcHJpbnRmKFBOR19ERUJVR19GSUxFLCIlcyIgbSBQTkdfU1RSSU5HX05FV0xJTkUsKG51bV90YWJzPT0xID8gIiAgICIgOiBcCisgICAgICAgICAobnVtX3RhYnM9PTIgPyAiICAgICAgIiA6IChudW1fdGFicz4yID8gIiAgICAgICAgICIgOiAiIikpKSxwMSk7IFwKKyAgICAgICB9IHdoaWxlICgwKQorIyAgICAgICAgICBlbmRpZgorIyAgICAgICAgICBpZm5kZWYgcG5nX2RlYnVnMgorIyAgICAgICAgICAgIGRlZmluZSBwbmdfZGVidWcyKGwsbSxwMSxwMikgXAorICAgICAgIGRvIHsgXAorICAgICAgIGludCBudW1fdGFicz1sOyBcCisgICAgICAgZnByaW50ZihQTkdfREVCVUdfRklMRSwiJXMiIG0gUE5HX1NUUklOR19ORVdMSU5FLChudW1fdGFicz09MSA/ICIgICAiIDogXAorICAgICAgICAgKG51bV90YWJzPT0yID8gIiAgICAgICIgOiAobnVtX3RhYnM+MiA/ICIgICAgICAgICAiIDogIiIpKSkscDEscDIpO1wKKyAgICAgICB9IHdoaWxlICgwKQorIyAgICAgICAgICBlbmRpZgorIyAgICAgICAgZWxzZSAvKiBfX1NUREMgX18gKi8KKyMgICAgICAgICAgaWZuZGVmIHBuZ19kZWJ1ZworIyAgICAgICAgICAgIGRlZmluZSBwbmdfZGVidWcobCxtKSBcCisgICAgICAgZG8geyBcCisgICAgICAgaW50IG51bV90YWJzPWw7IFwKKyAgICAgICBjaGFyIGZvcm1hdFsyNTZdOyBcCisgICAgICAgc25wcmludGYoZm9ybWF0LDI1NiwiJXMlcyVzIiwobnVtX3RhYnM9PTEgPyAiXHQiIDogXAorICAgICAgICAgKG51bV90YWJzPT0yID8gIlx0XHQiOihudW1fdGFicz4yID8gIlx0XHRcdCI6IiIpKSksIFwKKyAgICAgICAgIG0sUE5HX1NUUklOR19ORVdMSU5FKTsgXAorICAgICAgIGZwcmludGYoUE5HX0RFQlVHX0ZJTEUsZm9ybWF0KTsgXAorICAgICAgIH0gd2hpbGUgKDApCisjICAgICAgICAgIGVuZGlmCisjICAgICAgICAgIGlmbmRlZiBwbmdfZGVidWcxCisjICAgICAgICAgICAgZGVmaW5lIHBuZ19kZWJ1ZzEobCxtLHAxKSBcCisgICAgICAgZG8geyBcCisgICAgICAgaW50IG51bV90YWJzPWw7IFwKKyAgICAgICBjaGFyIGZvcm1hdFsyNTZdOyBcCisgICAgICAgc25wcmludGYoZm9ybWF0LDI1NiwiJXMlcyVzIiwobnVtX3RhYnM9PTEgPyAiXHQiIDogXAorICAgICAgICAgKG51bV90YWJzPT0yID8gIlx0XHQiOihudW1fdGFicz4yID8gIlx0XHRcdCI6IiIpKSksIFwKKyAgICAgICAgIG0sUE5HX1NUUklOR19ORVdMSU5FKTsgXAorICAgICAgIGZwcmludGYoUE5HX0RFQlVHX0ZJTEUsZm9ybWF0LHAxKTsgXAorICAgICAgIH0gd2hpbGUgKDApCisjICAgICAgICAgIGVuZGlmCisjICAgICAgICAgIGlmbmRlZiBwbmdfZGVidWcyCisjICAgICAgICAgICAgZGVmaW5lIHBuZ19kZWJ1ZzIobCxtLHAxLHAyKSBcCisgICAgICAgZG8geyBcCisgICAgICAgaW50IG51bV90YWJzPWw7IFwKKyAgICAgICBjaGFyIGZvcm1hdFsyNTZdOyBcCisgICAgICAgc25wcmludGYoZm9ybWF0LDI1NiwiJXMlcyVzIiwobnVtX3RhYnM9PTEgPyAiXHQiIDogXAorICAgICAgICAgKG51bV90YWJzPT0yID8gIlx0XHQiOihudW1fdGFicz4yID8gIlx0XHRcdCI6IiIpKSksIFwKKyAgICAgICAgIG0sUE5HX1NUUklOR19ORVdMSU5FKTsgXAorICAgICAgIGZwcmludGYoUE5HX0RFQlVHX0ZJTEUsZm9ybWF0LHAxLHAyKTsgXAorICAgICAgIH0gd2hpbGUgKDApCisjICAgICAgICAgIGVuZGlmCisjICAgICAgICBlbmRpZiAvKiBfX1NUREMgX18gKi8KKyMgICAgICBlbmRpZiAvKiAoUE5HX0RFQlVHID4gMSkgKi8KKworIyAgICBlbmRpZiAvKiBfTVNDX1ZFUiAqLworIyAgZW5kaWYgLyogKFBOR19ERUJVRyA+IDApICovCisjZW5kaWYgLyogUE5HX0RFQlVHICovCisjaWZuZGVmIHBuZ19kZWJ1ZworIyAgZGVmaW5lIHBuZ19kZWJ1ZyhsLCBtKSAoKHZvaWQpMCkKKyNlbmRpZgorI2lmbmRlZiBwbmdfZGVidWcxCisjICBkZWZpbmUgcG5nX2RlYnVnMShsLCBtLCBwMSkgKCh2b2lkKTApCisjZW5kaWYKKyNpZm5kZWYgcG5nX2RlYnVnMgorIyAgZGVmaW5lIHBuZ19kZWJ1ZzIobCwgbSwgcDEsIHAyKSAoKHZvaWQpMCkKKyNlbmRpZgorI2VuZGlmIC8qIFBOR0RFQlVHX0ggKi8KZGlmZiAtLWdpdCBhL2xpYnBuZy9wbmdlcnJvci5jIGIvbGlicG5nL3BuZ2Vycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRiOTU5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9wbmdlcnJvci5jCkBAIC0wLDAgKzEsOTYzIEBACisKKy8qIHBuZ2Vycm9yLmMgLSBzdHViIGZ1bmN0aW9ucyBmb3IgaS9vIGFuZCBtZW1vcnkgYWxsb2NhdGlvbgorICoKKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS42LjE1IFtOb3ZlbWJlciAyMCwgMjAxNF0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDE0IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCisgKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCisgKgorICogVGhpcyBmaWxlIHByb3ZpZGVzIGEgbG9jYXRpb24gZm9yIGFsbCBlcnJvciBoYW5kbGluZy4gIFVzZXJzIHdobworICogbmVlZCBzcGVjaWFsIGVycm9yIGhhbmRsaW5nIGFyZSBleHBlY3RlZCB0byB3cml0ZSByZXBsYWNlbWVudCBmdW5jdGlvbnMKKyAqIGFuZCB1c2UgcG5nX3NldF9lcnJvcl9mbigpIHRvIHVzZSB0aG9zZSBmdW5jdGlvbnMuICBTZWUgdGhlIGluc3RydWN0aW9ucworICogYXQgZWFjaCBmdW5jdGlvbi4KKyAqLworCisjaW5jbHVkZSAicG5ncHJpdi5oIgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NVUFBPUlRFRCkKKworc3RhdGljIFBOR19GVU5DVElPTih2b2lkLCBwbmdfZGVmYXVsdF9lcnJvcixQTkdBUkcoKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19jb25zdF9jaGFycCBlcnJvcl9tZXNzYWdlKSksUE5HX05PUkVUVVJOKTsKKworI2lmZGVmIFBOR19XQVJOSU5HU19TVVBQT1JURUQKK3N0YXRpYyB2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19kZWZhdWx0X3dhcm5pbmcgUE5HQVJHKChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgIHBuZ19jb25zdF9jaGFycCB3YXJuaW5nX21lc3NhZ2UpKTsKKyNlbmRpZiAvKiBXQVJOSU5HUyAqLworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciB0aGVyZSBpcyBhIGZhdGFsIGVycm9yLiAgVGhpcyBmdW5jdGlvbgorICogc2hvdWxkIG5vdCBiZSBjaGFuZ2VkLiAgSWYgdGhlcmUgaXMgYSBuZWVkIHRvIGhhbmRsZSBlcnJvcnMgZGlmZmVyZW50bHksCisgKiB5b3Ugc2hvdWxkIHN1cHBseSBhIHJlcGxhY2VtZW50IGVycm9yIGZ1bmN0aW9uIGFuZCB1c2UgcG5nX3NldF9lcnJvcl9mbigpCisgKiB0byByZXBsYWNlIHRoZSBlcnJvciBmdW5jdGlvbiBhdCBydW4tdGltZS4KKyAqLworI2lmZGVmIFBOR19FUlJPUl9URVhUX1NVUFBPUlRFRAorUE5HX0ZVTkNUSU9OKHZvaWQsUE5HQVBJCitwbmdfZXJyb3IsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgZXJyb3JfbWVzc2FnZSksCisgICBQTkdfTk9SRVRVUk4pCit7CisjaWZkZWYgUE5HX0VSUk9SX05VTUJFUlNfU1VQUE9SVEVECisgICBjaGFyIG1zZ1sxNl07CisgICBpZiAocG5nX3B0ciAhPSBOVUxMKQorICAgeworICAgICAgaWYgKChwbmdfcHRyLT5mbGFncyAmCisgICAgICAgICAoUE5HX0ZMQUdfU1RSSVBfRVJST1JfTlVNQkVSU3xQTkdfRkxBR19TVFJJUF9FUlJPUl9URVhUKSkgIT0gMAorICAgICAgeworICAgICAgICAgaWYgKCplcnJvcl9tZXNzYWdlID09IFBOR19MSVRFUkFMX1NIQVJQKQorICAgICAgICAgeworICAgICAgICAgICAgLyogU3RyaXAgIiNubm5uICIgZnJvbSBiZWdpbm5pbmcgb2YgZXJyb3IgbWVzc2FnZS4gKi8KKyAgICAgICAgICAgIGludCBvZmZzZXQ7CisgICAgICAgICAgICBmb3IgKG9mZnNldCA9IDE7IG9mZnNldDwxNTsgb2Zmc2V0KyspCisgICAgICAgICAgICAgICBpZiAoZXJyb3JfbWVzc2FnZVtvZmZzZXRdID09ICcgJykKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBpZiAoKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfU1RSSVBfRVJST1JfVEVYVCkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG9mZnNldCAtIDE7IGkrKykKKyAgICAgICAgICAgICAgICAgIG1zZ1tpXSA9IGVycm9yX21lc3NhZ2VbaSArIDFdOworICAgICAgICAgICAgICAgbXNnW2kgLSAxXSA9ICdcMCc7CisgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gbXNnOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlICs9IG9mZnNldDsKKyAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgaWYgKChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX1NUUklQX0VSUk9SX1RFWFQpICE9IDApCisgICAgICAgICB7CisgICAgICAgICAgICBtc2dbMF0gPSAnMCc7CisgICAgICAgICAgICBtc2dbMV0gPSAnXDAnOworICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9IG1zZzsKKyAgICAgICAgIH0KKyAgICAgICB9CisgICAgIH0KKyAgIH0KKyNlbmRpZgorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBwbmdfcHRyLT5lcnJvcl9mbiAhPSBOVUxMKQorICAgICAgKCoocG5nX3B0ci0+ZXJyb3JfZm4pKShwbmdfY29uc3RjYXN0KHBuZ19zdHJ1Y3RycCxwbmdfcHRyKSwKKyAgICAgICAgICBlcnJvcl9tZXNzYWdlKTsKKworICAgLyogSWYgdGhlIGN1c3RvbSBoYW5kbGVyIGRvZXNuJ3QgZXhpc3QsIG9yIGlmIGl0IHJldHVybnMsCisgICAgICB1c2UgdGhlIGRlZmF1bHQgaGFuZGxlciwgd2hpY2ggd2lsbCBub3QgcmV0dXJuLiAqLworICAgcG5nX2RlZmF1bHRfZXJyb3IocG5nX3B0ciwgZXJyb3JfbWVzc2FnZSk7Cit9CisjZWxzZQorUE5HX0ZVTkNUSU9OKHZvaWQsUE5HQVBJCitwbmdfZXJyLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciksUE5HX05PUkVUVVJOKQoreworICAgLyogUHJpb3IgdG8gMS41LjIgdGhlIGVycm9yX2ZuIHJlY2VpdmVkIGEgTlVMTCBwb2ludGVyLCBleHByZXNzZWQKKyAgICAqIGVycm9uZW91c2x5IGFzICdcMCcsIGluc3RlYWQgb2YgdGhlIGVtcHR5IHN0cmluZyAiIi4gIFRoaXMgd2FzCisgICAgKiBhcHBhcmVudGx5IGFuIGVycm9yLCBpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjIuMjAsIGFuZCBwbmdfZGVmYXVsdF9lcnJvcgorICAgICogd2lsbCBjcmFzaCBpbiB0aGlzIGNhc2UuCisgICAgKi8KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgcG5nX3B0ci0+ZXJyb3JfZm4gIT0gTlVMTCkKKyAgICAgICgqKHBuZ19wdHItPmVycm9yX2ZuKSkocG5nX2NvbnN0Y2FzdChwbmdfc3RydWN0cnAscG5nX3B0ciksICIiKTsKKworICAgLyogSWYgdGhlIGN1c3RvbSBoYW5kbGVyIGRvZXNuJ3QgZXhpc3QsIG9yIGlmIGl0IHJldHVybnMsCisgICAgICB1c2UgdGhlIGRlZmF1bHQgaGFuZGxlciwgd2hpY2ggd2lsbCBub3QgcmV0dXJuLiAqLworICAgcG5nX2RlZmF1bHRfZXJyb3IocG5nX3B0ciwgIiIpOworfQorI2VuZGlmIC8qIEVSUk9SX1RFWFQgKi8KKworLyogVXRpbGl0eSB0byBzYWZlbHkgYXBwZW5kcyBzdHJpbmdzIHRvIGEgYnVmZmVyLiAgVGhpcyBuZXZlciBlcnJvcnMgb3V0IHNvCisgKiBlcnJvciBjaGVja2luZyBpcyBub3QgcmVxdWlyZWQgaW4gdGhlIGNhbGxlci4KKyAqLworc2l6ZV90Citwbmdfc2FmZWNhdChwbmdfY2hhcnAgYnVmZmVyLCBzaXplX3QgYnVmc2l6ZSwgc2l6ZV90IHBvcywKKyAgIHBuZ19jb25zdF9jaGFycCBzdHJpbmcpCit7CisgICBpZiAoYnVmZmVyICE9IE5VTEwgJiYgcG9zIDwgYnVmc2l6ZSkKKyAgIHsKKyAgICAgIGlmIChzdHJpbmcgIT0gTlVMTCkKKyAgICAgICAgIHdoaWxlICgqc3RyaW5nICE9ICdcMCcgJiYgcG9zIDwgYnVmc2l6ZS0xKQorICAgICAgICAgICBidWZmZXJbcG9zKytdID0gKnN0cmluZysrOworCisgICAgICBidWZmZXJbcG9zXSA9ICdcMCc7CisgICB9CisKKyAgIHJldHVybiBwb3M7Cit9CisKKyNpZiBkZWZpbmVkKFBOR19XQVJOSU5HU19TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1RJTUVfUkZDMTEyM19TVVBQT1JURUQpCisvKiBVdGlsaXR5IHRvIGR1bXAgYW4gdW5zaWduZWQgdmFsdWUgaW50byBhIGJ1ZmZlciwgZ2l2ZW4gYSBzdGFydCBwb2ludGVyIGFuZAorICogYW5kIGVuZCBwb2ludGVyICh3aGljaCBzaG91bGQgcG9pbnQganVzdCAqYmV5b25kKiB0aGUgZW5kIG9mIHRoZSBidWZmZXIhKQorICogUmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGZvcm1hdHRlZCBzdHJpbmcuCisgKi8KK3BuZ19jaGFycAorcG5nX2Zvcm1hdF9udW1iZXIocG5nX2NvbnN0X2NoYXJwIHN0YXJ0LCBwbmdfY2hhcnAgZW5kLCBpbnQgZm9ybWF0LAorICAgcG5nX2FsbG9jX3NpemVfdCBudW1iZXIpCit7CisgICBpbnQgY291bnQgPSAwOyAgICAvKiBudW1iZXIgb2YgZGlnaXRzIG91dHB1dCAqLworICAgaW50IG1pbmNvdW50ID0gMTsgLyogbWluaW11bSBudW1iZXIgcmVxdWlyZWQgKi8KKyAgIGludCBvdXRwdXQgPSAwOyAgIC8qIGRpZ2l0IG91dHB1dCAoZm9yIHRoZSBmaXhlZCBwb2ludCBmb3JtYXQpICovCisKKyAgICotLWVuZCA9ICdcMCc7CisKKyAgIC8qIFRoaXMgaXMgd3JpdHRlbiBzbyB0aGF0IHRoZSBsb29wIGFsd2F5cyBydW5zIGF0IGxlYXN0IG9uY2UsIGV2ZW4gd2l0aAorICAgICogbnVtYmVyIHplcm8uCisgICAgKi8KKyAgIHdoaWxlIChlbmQgPiBzdGFydCAmJiAobnVtYmVyICE9IDAgfHwgY291bnQgPCBtaW5jb3VudCkpCisgICB7CisKKyAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGRpZ2l0c1tdID0gIjAxMjM0NTY3ODlBQkNERUYiOworCisgICAgICBzd2l0Y2ggKGZvcm1hdCkKKyAgICAgIHsKKyAgICAgICAgIGNhc2UgUE5HX05VTUJFUl9GT1JNQVRfZml4ZWQ6CisgICAgICAgICAgICAvKiBOZWVkcyBmaXZlIGRpZ2l0cyAodGhlIGZyYWN0aW9uKSAqLworICAgICAgICAgICAgbWluY291bnQgPSA1OworICAgICAgICAgICAgaWYgKG91dHB1dCAhPSAwIHx8IG51bWJlciAlIDEwICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAqLS1lbmQgPSBkaWdpdHNbbnVtYmVyICUgMTBdOworICAgICAgICAgICAgICAgb3V0cHV0ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG51bWJlciAvPSAxMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIFBOR19OVU1CRVJfRk9STUFUXzAydToKKyAgICAgICAgICAgIC8qIEV4cGVjdHMgYXQgbGVhc3QgMiBkaWdpdHMuICovCisgICAgICAgICAgICBtaW5jb3VudCA9IDI7CisgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKworICAgICAgICAgY2FzZSBQTkdfTlVNQkVSX0ZPUk1BVF91OgorICAgICAgICAgICAgKi0tZW5kID0gZGlnaXRzW251bWJlciAlIDEwXTsKKyAgICAgICAgICAgIG51bWJlciAvPSAxMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIFBOR19OVU1CRVJfRk9STUFUXzAyeDoKKyAgICAgICAgICAgIC8qIFRoaXMgZm9ybWF0IGV4cGVjdHMgYXQgbGVhc3QgdHdvIGRpZ2l0cyAqLworICAgICAgICAgICAgbWluY291bnQgPSAyOworICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgIGNhc2UgUE5HX05VTUJFUl9GT1JNQVRfeDoKKyAgICAgICAgICAgICotLWVuZCA9IGRpZ2l0c1tudW1iZXIgJiAweGZdOworICAgICAgICAgICAgbnVtYmVyID4+PSA0OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGRlZmF1bHQ6IC8qIGFuIGVycm9yICovCisgICAgICAgICAgICBudW1iZXIgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8qIEtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBkaWdpdHMgYWRkZWQgKi8KKyAgICAgICsrY291bnQ7CisKKyAgICAgIC8qIEZsb2F0IGEgZml4ZWQgbnVtYmVyIGhlcmU6ICovCisgICAgICBpZiAoKGZvcm1hdCA9PSBQTkdfTlVNQkVSX0ZPUk1BVF9maXhlZCkgJiYgKGNvdW50ID09IDUpICYmIChlbmQgPiBzdGFydCkpCisgICAgICB7CisgICAgICAgICAvKiBFbmQgb2YgdGhlIGZyYWN0aW9uLCBidXQgbWF5YmUgbm90aGluZyB3YXMgb3V0cHV0PyAgSW4gdGhhdCBjYXNlCisgICAgICAgICAgKiBkcm9wIHRoZSBkZWNpbWFsIHBvaW50LiAgSWYgdGhlIG51bWJlciBpcyBhIHRydWUgemVybyBoYW5kbGUgdGhhdAorICAgICAgICAgICogaGVyZS4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKG91dHB1dCAhPSAwKQorICAgICAgICAgICAgKi0tZW5kID0gJy4nOworICAgICAgICAgZWxzZSBpZiAobnVtYmVyID09IDApIC8qIGFuZCAhb3V0cHV0ICovCisgICAgICAgICAgICAqLS1lbmQgPSAnMCc7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiBlbmQ7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19XQVJOSU5HU19TVVBQT1JURUQKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIHRoZXJlIGlzIGEgbm9uLWZhdGFsIGVycm9yLiAgVGhpcyBmdW5jdGlvbgorICogc2hvdWxkIG5vdCBiZSBjaGFuZ2VkLiAgSWYgdGhlcmUgaXMgYSBuZWVkIHRvIGhhbmRsZSB3YXJuaW5ncyBkaWZmZXJlbnRseSwKKyAqIHlvdSBzaG91bGQgc3VwcGx5IGEgcmVwbGFjZW1lbnQgd2FybmluZyBmdW5jdGlvbiBhbmQgdXNlCisgKiBwbmdfc2V0X2Vycm9yX2ZuKCkgdG8gcmVwbGFjZSB0aGUgd2FybmluZyBmdW5jdGlvbiBhdCBydW4tdGltZS4KKyAqLwordm9pZCBQTkdBUEkKK3BuZ193YXJuaW5nKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgd2FybmluZ19tZXNzYWdlKQoreworICAgaW50IG9mZnNldCA9IDA7CisgICBpZiAocG5nX3B0ciAhPSBOVUxMKQorICAgeworI2lmZGVmIFBOR19FUlJPUl9OVU1CRVJTX1NVUFBPUlRFRAorICAgaWYgKChwbmdfcHRyLT5mbGFncyAmCisgICAgICAgKFBOR19GTEFHX1NUUklQX0VSUk9SX05VTUJFUlN8UE5HX0ZMQUdfU1RSSVBfRVJST1JfVEVYVCkpICE9IDApCisjZW5kaWYKKyAgICAgIHsKKyAgICAgICAgIGlmICgqd2FybmluZ19tZXNzYWdlID09IFBOR19MSVRFUkFMX1NIQVJQKQorICAgICAgICAgeworICAgICAgICAgICAgZm9yIChvZmZzZXQgPSAxOyBvZmZzZXQgPCAxNTsgb2Zmc2V0KyspCisgICAgICAgICAgICAgICBpZiAod2FybmluZ19tZXNzYWdlW29mZnNldF0gPT0gJyAnKQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIHBuZ19wdHItPndhcm5pbmdfZm4gIT0gTlVMTCkKKyAgICAgICgqKHBuZ19wdHItPndhcm5pbmdfZm4pKShwbmdfY29uc3RjYXN0KHBuZ19zdHJ1Y3RycCxwbmdfcHRyKSwKKyAgICAgICAgIHdhcm5pbmdfbWVzc2FnZSArIG9mZnNldCk7CisgICBlbHNlCisgICAgICBwbmdfZGVmYXVsdF93YXJuaW5nKHBuZ19wdHIsIHdhcm5pbmdfbWVzc2FnZSArIG9mZnNldCk7Cit9CisKKy8qIFRoZXNlIGZ1bmN0aW9ucyBzdXBwb3J0ICdmb3JtYXR0ZWQnIHdhcm5pbmcgbWVzc2FnZXMgd2l0aCB1cCB0bworICogUE5HX1dBUk5JTkdfUEFSQU1FVEVSX0NPVU5UIHBhcmFtZXRlcnMuICBJbiB0aGUgZm9ybWF0IHN0cmluZyB0aGUgcGFyYW1ldGVyCisgKiBpcyBpbnRyb2R1Y2VkIGJ5IEA8bnVtYmVyPiwgd2hlcmUgJ251bWJlcicgc3RhcnRzIGF0IDEuICBUaGlzIGZvbGxvd3MgdGhlCisgKiBzdGFuZGFyZCBlc3RhYmxpc2hlZCBieSBYL09wZW4gZm9yIGludGVybmF0aW9uYWxpemFibGUgZXJyb3IgbWVzc2FnZXMuCisgKi8KK3ZvaWQKK3BuZ193YXJuaW5nX3BhcmFtZXRlcihwbmdfd2FybmluZ19wYXJhbWV0ZXJzIHAsIGludCBudW1iZXIsCisgICBwbmdfY29uc3RfY2hhcnAgc3RyaW5nKQoreworICAgaWYgKG51bWJlciA+IDAgJiYgbnVtYmVyIDw9IFBOR19XQVJOSU5HX1BBUkFNRVRFUl9DT1VOVCkKKyAgICAgICh2b2lkKXBuZ19zYWZlY2F0KHBbbnVtYmVyLTFdLCAoc2l6ZW9mIHBbbnVtYmVyLTFdKSwgMCwgc3RyaW5nKTsKK30KKwordm9pZAorcG5nX3dhcm5pbmdfcGFyYW1ldGVyX3Vuc2lnbmVkKHBuZ193YXJuaW5nX3BhcmFtZXRlcnMgcCwgaW50IG51bWJlciwgaW50IGZvcm1hdCwKKyAgIHBuZ19hbGxvY19zaXplX3QgdmFsdWUpCit7CisgICBjaGFyIGJ1ZmZlcltQTkdfTlVNQkVSX0JVRkZFUl9TSVpFXTsKKyAgIHBuZ193YXJuaW5nX3BhcmFtZXRlcihwLCBudW1iZXIsIFBOR19GT1JNQVRfTlVNQkVSKGJ1ZmZlciwgZm9ybWF0LCB2YWx1ZSkpOworfQorCit2b2lkCitwbmdfd2FybmluZ19wYXJhbWV0ZXJfc2lnbmVkKHBuZ193YXJuaW5nX3BhcmFtZXRlcnMgcCwgaW50IG51bWJlciwgaW50IGZvcm1hdCwKKyAgIHBuZ19pbnRfMzIgdmFsdWUpCit7CisgICBwbmdfYWxsb2Nfc2l6ZV90IHU7CisgICBwbmdfY2hhcnAgc3RyOworICAgY2hhciBidWZmZXJbUE5HX05VTUJFUl9CVUZGRVJfU0laRV07CisKKyAgIC8qIEF2b2lkIG92ZXJmbG93IGJ5IGRvaW5nIHRoZSBuZWdhdGUgaW4gYSBwbmdfYWxsb2Nfc2l6ZV90OiAqLworICAgdSA9IChwbmdfYWxsb2Nfc2l6ZV90KXZhbHVlOworICAgaWYgKHZhbHVlIDwgMCkKKyAgICAgIHUgPSB+dSArIDE7CisKKyAgIHN0ciA9IFBOR19GT1JNQVRfTlVNQkVSKGJ1ZmZlciwgZm9ybWF0LCB1KTsKKworICAgaWYgKHZhbHVlIDwgMCAmJiBzdHIgPiBidWZmZXIpCisgICAgICAqLS1zdHIgPSAnLSc7CisKKyAgIHBuZ193YXJuaW5nX3BhcmFtZXRlcihwLCBudW1iZXIsIHN0cik7Cit9CisKK3ZvaWQKK3BuZ19mb3JtYXR0ZWRfd2FybmluZyhwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3dhcm5pbmdfcGFyYW1ldGVycyBwLAorICAgcG5nX2NvbnN0X2NoYXJwIG1lc3NhZ2UpCit7CisgICAvKiBUaGUgaW50ZXJuYWwgYnVmZmVyIGlzIGp1c3QgMTkyIGJ5dGVzIC0gZW5vdWdoIGZvciBhbGwgb3VyIG1lc3NhZ2VzLAorICAgICogb3ZlcmZsb3cgZG9lc24ndCBoYXBwZW4gYmVjYXVzZSB0aGlzIGNvZGUgY2hlY2tzISAgSWYgc29tZW9uZSBmaWd1cmVzCisgICAgKiBvdXQgaG93IHRvIHNlbmQgdXMgYSBtZXNzYWdlIGxvbmdlciB0aGFuIDE5MiBieXRlcywgYWxsIHRoYXQgd2lsbAorICAgICogaGFwcGVuIGlzIHRoYXQgdGhlIG1lc3NhZ2Ugd2lsbCBiZSB0cnVuY2F0ZWQgYXBwcm9wcmlhdGVseS4KKyAgICAqLworICAgc2l6ZV90IGkgPSAwOyAvKiBJbmRleCBpbiB0aGUgbXNnW10gYnVmZmVyOiAqLworICAgY2hhciBtc2dbMTkyXTsKKworICAgLyogRWFjaCBpdGVyYXRpb24gdGhyb3VnaCB0aGUgZm9sbG93aW5nIGxvb3Agd3JpdGVzIGF0IG1vc3Qgb25lIGNoYXJhY3RlcgorICAgICogdG8gbXNnW2krK10gdGhlbiByZXR1cm5zIGhlcmUgdG8gdmFsaWRhdGUgdGhhdCB0aGVyZSBpcyBzdGlsbCBzcGFjZSBmb3IKKyAgICAqIHRoZSB0cmFpbGluZyAnXDAnLiAgSXQgbWF5IChpbiB0aGUgY2FzZSBvZiBhIHBhcmFtZXRlcikgcmVhZCBtb3JlIHRoYW4KKyAgICAqIG9uZSBjaGFyYWN0ZXIgZnJvbSBtZXNzYWdlW107IGl0IG11c3QgY2hlY2sgZm9yICdcMCcgYW5kIGNvbnRpbnVlIHRvIHRoZQorICAgICogdGVzdCBpZiBpdCBmaW5kcyB0aGUgZW5kIG9mIHN0cmluZy4KKyAgICAqLworICAgd2hpbGUgKGk8KHNpemVvZiBtc2cpLTEgJiYgKm1lc3NhZ2UgIT0gJ1wwJykKKyAgIHsKKyAgICAgIC8qICdAJyBhdCBlbmQgb2Ygc3RyaW5nIGlzIG5vdyBqdXN0IHByaW50ZWQgKHByZXZpb3VzbHkgaXQgd2FzIHNraXBwZWQpOworICAgICAgICogaXQgaXMgYW4gZXJyb3IgaW4gdGhlIGNhbGxpbmcgY29kZSB0byB0ZXJtaW5hdGUgdGhlIHN0cmluZyB3aXRoIEAuCisgICAgICAgKi8KKyAgICAgIGlmIChwICE9IE5VTEwgJiYgKm1lc3NhZ2UgPT0gJ0AnICYmIG1lc3NhZ2VbMV0gIT0gJ1wwJykKKyAgICAgIHsKKyAgICAgICAgIGludCBwYXJhbWV0ZXJfY2hhciA9ICorK21lc3NhZ2U7IC8qIENvbnN1bWUgdGhlICdAJyAqLworICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgdmFsaWRfcGFyYW1ldGVyc1tdID0gIjEyMzQ1Njc4OSI7CisgICAgICAgICBpbnQgcGFyYW1ldGVyID0gMDsKKworICAgICAgICAgLyogU2VhcmNoIGZvciB0aGUgcGFyYW1ldGVyIGRpZ2l0LCB0aGUgaW5kZXggaW4gdGhlIHN0cmluZyBpcyB0aGUKKyAgICAgICAgICAqIHBhcmFtZXRlciB0byB1c2UuCisgICAgICAgICAgKi8KKyAgICAgICAgIHdoaWxlICh2YWxpZF9wYXJhbWV0ZXJzW3BhcmFtZXRlcl0gIT0gcGFyYW1ldGVyX2NoYXIgJiYKKyAgICAgICAgICAgIHZhbGlkX3BhcmFtZXRlcnNbcGFyYW1ldGVyXSAhPSAnXDAnKQorICAgICAgICAgICAgKytwYXJhbWV0ZXI7CisKKyAgICAgICAgIC8qIElmIHRoZSBwYXJhbWV0ZXIgZGlnaXQgaXMgb3V0IG9mIHJhbmdlIGl0IHdpbGwganVzdCBnZXQgcHJpbnRlZC4gKi8KKyAgICAgICAgIGlmIChwYXJhbWV0ZXIgPCBQTkdfV0FSTklOR19QQVJBTUVURVJfQ09VTlQpCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBBcHBlbmQgdGhpcyBwYXJhbWV0ZXIgKi8KKyAgICAgICAgICAgIHBuZ19jb25zdF9jaGFycCBwYXJtID0gcFtwYXJhbWV0ZXJdOworICAgICAgICAgICAgcG5nX2NvbnN0X2NoYXJwIHBlbmQgPSBwW3BhcmFtZXRlcl0gKyAoc2l6ZW9mIHBbcGFyYW1ldGVyXSk7CisKKyAgICAgICAgICAgIC8qIE5vIG5lZWQgdG8gY29weSB0aGUgdHJhaWxpbmcgJ1wwJyBoZXJlLCBidXQgdGhlcmUgaXMgbm8gZ3VhcmFudGVlCisgICAgICAgICAgICAgKiB0aGF0IHBhcm1bXSBoYXMgYmVlbiBpbml0aWFsaXplZCwgc28gdGhlcmUgaXMgbm8gZ3VhcmFudGVlIG9mIGEKKyAgICAgICAgICAgICAqIHRyYWlsaW5nICdcMCc6CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHdoaWxlIChpPChzaXplb2YgbXNnKS0xICYmICpwYXJtICE9ICdcMCcgJiYgcGFybSA8IHBlbmQpCisgICAgICAgICAgICAgICBtc2dbaSsrXSA9ICpwYXJtKys7CisKKyAgICAgICAgICAgIC8qIENvbnN1bWUgdGhlIHBhcmFtZXRlciBkaWdpdCB0b286ICovCisgICAgICAgICAgICArK21lc3NhZ2U7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgIH0KKworICAgICAgICAgLyogZWxzZSBub3QgYSBwYXJhbWV0ZXIgYW5kIHRoZXJlIGlzIGEgY2hhcmFjdGVyIGFmdGVyIHRoZSBAIHNpZ247IGp1c3QKKyAgICAgICAgICAqIGNvcHkgdGhhdC4gIFRoaXMgaXMga25vd24gbm90IHRvIGJlICdcMCcgYmVjYXVzZSBvZiB0aGUgdGVzdCBhYm92ZS4KKyAgICAgICAgICAqLworICAgICAgfQorCisgICAgICAvKiBBdCB0aGlzIHBvaW50ICptZXNzYWdlIGNhbid0IGJlICdcMCcsIGV2ZW4gaW4gdGhlIGJhZCBwYXJhbWV0ZXIgY2FzZQorICAgICAgICogYWJvdmUgd2hlcmUgdGhlcmUgaXMgYSBsb25lICdAJyBhdCB0aGUgZW5kIG9mIHRoZSBtZXNzYWdlIHN0cmluZy4KKyAgICAgICAqLworICAgICAgbXNnW2krK10gPSAqbWVzc2FnZSsrOworICAgfQorCisgICAvKiBpIGlzIGFsd2F5cyBsZXNzIHRoYW4gKHNpemVvZiBtc2cpLCBzbzogKi8KKyAgIG1zZ1tpXSA9ICdcMCc7CisKKyAgIC8qIEFuZCB0aGlzIGlzIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZS4gSXQgbWF5IGJlIGxhcmdlciB0aGFuCisgICAgKiBQTkdfTUFYX0VSUk9SX1RFWFQsIGJ1dCB0aGF0IGlzIG9ubHkgdXNlZCBmb3IgJ2NodW5rJyBlcnJvcnMgYW5kIHRoZXNlCisgICAgKiBhcmUgbm90IChjdXJyZW50bHkpIGZvcm1hdHRlZC4KKyAgICAqLworICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgbXNnKTsKK30KKyNlbmRpZiAvKiBXQVJOSU5HUyAqLworCisjaWZkZWYgUE5HX0JFTklHTl9FUlJPUlNfU1VQUE9SVEVECit2b2lkIFBOR0FQSQorcG5nX2Jlbmlnbl9lcnJvcihwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIGVycm9yX21lc3NhZ2UpCit7CisgICBpZiAoKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfQkVOSUdOX0VSUk9SU19XQVJOKSAhPSAwKQorICAgeworIyAgICAgaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECisgICAgICAgICBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSVNfUkVBRF9TVFJVQ1QpICE9IDAgJiYKKyAgICAgICAgICAgIHBuZ19wdHItPmNodW5rX25hbWUgIT0gMCkKKyAgICAgICAgICAgIHBuZ19jaHVua193YXJuaW5nKHBuZ19wdHIsIGVycm9yX21lc3NhZ2UpOworICAgICAgICAgZWxzZQorIyAgICAgZW5kaWYKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsIGVycm9yX21lc3NhZ2UpOworICAgfQorCisgICBlbHNlCisgICB7CisjICAgICBpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKKyAgICAgICAgIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19JU19SRUFEX1NUUlVDVCkgIT0gMCAmJgorICAgICAgICAgICAgcG5nX3B0ci0+Y2h1bmtfbmFtZSAhPSAwKQorICAgICAgICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsIGVycm9yX21lc3NhZ2UpOworICAgICAgICAgZWxzZQorIyAgICAgZW5kaWYKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCBlcnJvcl9tZXNzYWdlKTsKKyAgIH0KKworIyAgaWZuZGVmIFBOR19FUlJPUl9URVhUX1NVUFBPUlRFRAorICAgICAgUE5HX1VOVVNFRChlcnJvcl9tZXNzYWdlKQorIyAgZW5kaWYKK30KKwordm9pZCAvKiBQUklWQVRFICovCitwbmdfYXBwX3dhcm5pbmcocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBlcnJvcl9tZXNzYWdlKQoreworICBpZiAoKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfQVBQX1dBUk5JTkdTX1dBUk4pICE9IDApCisgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsIGVycm9yX21lc3NhZ2UpOworICBlbHNlCisgICAgIHBuZ19lcnJvcihwbmdfcHRyLCBlcnJvcl9tZXNzYWdlKTsKKworIyAgaWZuZGVmIFBOR19FUlJPUl9URVhUX1NVUFBPUlRFRAorICAgICAgUE5HX1VOVVNFRChlcnJvcl9tZXNzYWdlKQorIyAgZW5kaWYKK30KKwordm9pZCAvKiBQUklWQVRFICovCitwbmdfYXBwX2Vycm9yKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgZXJyb3JfbWVzc2FnZSkKK3sKKyAgaWYgKChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0FQUF9FUlJPUlNfV0FSTikgIT0gMCkKKyAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgZXJyb3JfbWVzc2FnZSk7CisgIGVsc2UKKyAgICAgcG5nX2Vycm9yKHBuZ19wdHIsIGVycm9yX21lc3NhZ2UpOworCisjICBpZm5kZWYgUE5HX0VSUk9SX1RFWFRfU1VQUE9SVEVECisgICAgICBQTkdfVU5VU0VEKGVycm9yX21lc3NhZ2UpCisjICBlbmRpZgorfQorI2VuZGlmIC8qIEJFTklHTl9FUlJPUlMgKi8KKworI2RlZmluZSBQTkdfTUFYX0VSUk9SX1RFWFQgMTk2IC8qIEN1cnJlbnRseSBsaW1pdGVkIGJ5IHByb2ZpbGVfZXJyb3IgaW4gcG5nLmMgKi8KKyNpZiBkZWZpbmVkKFBOR19XQVJOSU5HU19TVVBQT1JURUQpIHx8IFwKKyAgIChkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfRVJST1JfVEVYVF9TVVBQT1JURUQpKQorLyogVGhlc2UgdXRpbGl0aWVzIGFyZSB1c2VkIGludGVybmFsbHkgdG8gYnVpbGQgYW4gZXJyb3IgbWVzc2FnZSB0aGF0IHJlbGF0ZXMKKyAqIHRvIHRoZSBjdXJyZW50IGNodW5rLiAgVGhlIGNodW5rIG5hbWUgY29tZXMgZnJvbSBwbmdfcHRyLT5jaHVua19uYW1lLAorICogd2hpY2ggaXMgdXNlZCB0byBwcmVmaXggdGhlIG1lc3NhZ2UuICBUaGUgbWVzc2FnZSBpcyBsaW1pdGVkIGluIGxlbmd0aAorICogdG8gNjMgYnl0ZXMuIFRoZSBuYW1lIGNoYXJhY3RlcnMgYXJlIG91dHB1dCBhcyBoZXggZGlnaXRzIHdyYXBwZWQgaW4gW10KKyAqIGlmIHRoZSBjaGFyYWN0ZXIgaXMgaW52YWxpZC4KKyAqLworI2RlZmluZSBpc25vbmFscGhhKGMpICgoYykgPCA2NSB8fCAoYykgPiAxMjIgfHwgKChjKSA+IDkwICYmIChjKSA8IDk3KSkKK3N0YXRpYyBQTkdfQ09OU1QgY2hhciBwbmdfZGlnaXRbMTZdID0geworICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLAorICAgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJworfTsKKworc3RhdGljIHZvaWQgLyogUFJJVkFURSAqLworcG5nX2Zvcm1hdF9idWZmZXIocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jaGFycCBidWZmZXIsIHBuZ19jb25zdF9jaGFycAorICAgIGVycm9yX21lc3NhZ2UpCit7CisgICBwbmdfdWludF8zMiBjaHVua19uYW1lID0gcG5nX3B0ci0+Y2h1bmtfbmFtZTsKKyAgIGludCBpb3V0ID0gMCwgaXNoaWZ0ID0gMjQ7CisKKyAgIHdoaWxlIChpc2hpZnQgPj0gMCkKKyAgIHsKKyAgICAgIGludCBjID0gKGludCkoY2h1bmtfbmFtZSA+PiBpc2hpZnQpICYgMHhmZjsKKworICAgICAgaXNoaWZ0IC09IDg7CisgICAgICBpZiAoaXNub25hbHBoYShjKSAhPSAwKQorICAgICAgeworICAgICAgICAgYnVmZmVyW2lvdXQrK10gPSBQTkdfTElURVJBTF9MRUZUX1NRVUFSRV9CUkFDS0VUOworICAgICAgICAgYnVmZmVyW2lvdXQrK10gPSBwbmdfZGlnaXRbKGMgJiAweGYwKSA+PiA0XTsKKyAgICAgICAgIGJ1ZmZlcltpb3V0KytdID0gcG5nX2RpZ2l0W2MgJiAweDBmXTsKKyAgICAgICAgIGJ1ZmZlcltpb3V0KytdID0gUE5HX0xJVEVSQUxfUklHSFRfU1FVQVJFX0JSQUNLRVQ7CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGJ1ZmZlcltpb3V0KytdID0gKGNoYXIpYzsKKyAgICAgIH0KKyAgIH0KKworICAgaWYgKGVycm9yX21lc3NhZ2UgPT0gTlVMTCkKKyAgICAgIGJ1ZmZlcltpb3V0XSA9ICdcMCc7CisKKyAgIGVsc2UKKyAgIHsKKyAgICAgIGludCBpaW4gPSAwOworCisgICAgICBidWZmZXJbaW91dCsrXSA9ICc6JzsKKyAgICAgIGJ1ZmZlcltpb3V0KytdID0gJyAnOworCisgICAgICB3aGlsZSAoaWluIDwgUE5HX01BWF9FUlJPUl9URVhULTEgJiYgZXJyb3JfbWVzc2FnZVtpaW5dICE9ICdcMCcpCisgICAgICAgICBidWZmZXJbaW91dCsrXSA9IGVycm9yX21lc3NhZ2VbaWluKytdOworCisgICAgICAvKiBpaW4gPCBQTkdfTUFYX0VSUk9SX1RFWFQsIHNvIHRoZSBmb2xsb3dpbmcgaXMgc2FmZTogKi8KKyAgICAgIGJ1ZmZlcltpb3V0XSA9ICdcMCc7CisgICB9Cit9CisjZW5kaWYgLyogV0FSTklOR1MgfHwgRVJST1JfVEVYVCAqLworCisjaWYgZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX0VSUk9SX1RFWFRfU1VQUE9SVEVEKQorUE5HX0ZVTkNUSU9OKHZvaWQsUE5HQVBJCitwbmdfY2h1bmtfZXJyb3IsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgZXJyb3JfbWVzc2FnZSksCisgICBQTkdfTk9SRVRVUk4pCit7CisgICBjaGFyIG1zZ1sxOCtQTkdfTUFYX0VSUk9SX1RFWFRdOworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCBlcnJvcl9tZXNzYWdlKTsKKworICAgZWxzZQorICAgeworICAgICAgcG5nX2Zvcm1hdF9idWZmZXIocG5nX3B0ciwgbXNnLCBlcnJvcl9tZXNzYWdlKTsKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCBtc2cpOworICAgfQorfQorI2VuZGlmIC8qIFJFQUQgJiYgRVJST1JfVEVYVCAqLworCisjaWZkZWYgUE5HX1dBUk5JTkdTX1NVUFBPUlRFRAordm9pZCBQTkdBUEkKK3BuZ19jaHVua193YXJuaW5nKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgd2FybmluZ19tZXNzYWdlKQoreworICAgY2hhciBtc2dbMTgrUE5HX01BWF9FUlJPUl9URVhUXTsKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCB3YXJuaW5nX21lc3NhZ2UpOworCisgICBlbHNlCisgICB7CisgICAgICBwbmdfZm9ybWF0X2J1ZmZlcihwbmdfcHRyLCBtc2csIHdhcm5pbmdfbWVzc2FnZSk7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCBtc2cpOworICAgfQorfQorI2VuZGlmIC8qIFdBUk5JTkdTICovCisKKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKKyNpZmRlZiBQTkdfQkVOSUdOX0VSUk9SU19TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAKKyAgICBlcnJvcl9tZXNzYWdlKQoreworICAgaWYgKChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0JFTklHTl9FUlJPUlNfV0FSTikgIT0gMCkKKyAgICAgIHBuZ19jaHVua193YXJuaW5nKHBuZ19wdHIsIGVycm9yX21lc3NhZ2UpOworCisgICBlbHNlCisgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgZXJyb3JfbWVzc2FnZSk7CisKKyMgIGlmbmRlZiBQTkdfRVJST1JfVEVYVF9TVVBQT1JURUQKKyAgICAgIFBOR19VTlVTRUQoZXJyb3JfbWVzc2FnZSkKKyMgIGVuZGlmCit9CisjZW5kaWYKKyNlbmRpZiAvKiBSRUFEICovCisKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2NodW5rX3JlcG9ydChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIG1lc3NhZ2UsIGludCBlcnJvcikKK3sKKyMgIGlmbmRlZiBQTkdfV0FSTklOR1NfU1VQUE9SVEVECisgICAgICBQTkdfVU5VU0VEKG1lc3NhZ2UpCisjICBlbmRpZgorCisgICAvKiBUaGlzIGlzIGFsd2F5cyBzdXBwb3J0ZWQsIGJ1dCBmb3IganVzdCByZWFkIG9yIGp1c3Qgd3JpdGUgaXQKKyAgICAqIHVuY29uZGl0aW9uYWxseSBkb2VzIHRoZSByaWdodCB0aGluZy4KKyAgICAqLworIyAgaWYgZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX1dSSVRFX1NVUFBPUlRFRCkKKyAgICAgIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19JU19SRUFEX1NUUlVDVCkgIT0gMCkKKyMgIGVuZGlmCisKKyMgIGlmZGVmIFBOR19SRUFEX1NVUFBPUlRFRAorICAgICAgeworICAgICAgICAgaWYgKGVycm9yIDwgUE5HX0NIVU5LX0VSUk9SKQorICAgICAgICAgICAgcG5nX2NodW5rX3dhcm5pbmcocG5nX3B0ciwgbWVzc2FnZSk7CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgbWVzc2FnZSk7CisgICAgICB9CisjICBlbmRpZgorCisjICBpZiBkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfV1JJVEVfU1VQUE9SVEVEKQorICAgICAgZWxzZSBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSVNfUkVBRF9TVFJVQ1QpID09IDApCisjICBlbmRpZgorCisjICBpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECisgICAgICB7CisgICAgICAgICBpZiAoZXJyb3IgPCBQTkdfQ0hVTktfV1JJVEVfRVJST1IpCisgICAgICAgICAgICBwbmdfYXBwX3dhcm5pbmcocG5nX3B0ciwgbWVzc2FnZSk7CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBuZ19hcHBfZXJyb3IocG5nX3B0ciwgbWVzc2FnZSk7CisgICAgICB9CisjICBlbmRpZgorfQorCisjaWZkZWYgUE5HX0VSUk9SX1RFWFRfU1VQUE9SVEVECisjaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorUE5HX0ZVTkNUSU9OKHZvaWQsCitwbmdfZml4ZWRfZXJyb3IsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgbmFtZSksUE5HX05PUkVUVVJOKQoreworIyAgZGVmaW5lIGZpeGVkX21lc3NhZ2UgImZpeGVkIHBvaW50IG92ZXJmbG93IGluICIKKyMgIGRlZmluZSBmaXhlZF9tZXNzYWdlX2xuICgoc2l6ZW9mIGZpeGVkX21lc3NhZ2UpLTEpCisgICBpbnQgIGlpbjsKKyAgIGNoYXIgbXNnW2ZpeGVkX21lc3NhZ2VfbG4rUE5HX01BWF9FUlJPUl9URVhUXTsKKyAgIG1lbWNweShtc2csIGZpeGVkX21lc3NhZ2UsIGZpeGVkX21lc3NhZ2VfbG4pOworICAgaWluID0gMDsKKyAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICB3aGlsZSAoaWluIDwgKFBOR19NQVhfRVJST1JfVEVYVC0xKSAmJiBuYW1lW2lpbl0gIT0gMCkKKyAgICAgIHsKKyAgICAgICAgIG1zZ1tmaXhlZF9tZXNzYWdlX2xuICsgaWluXSA9IG5hbWVbaWluXTsKKyAgICAgICAgICsraWluOworICAgICAgfQorICAgbXNnW2ZpeGVkX21lc3NhZ2VfbG4gKyBpaW5dID0gMDsKKyAgIHBuZ19lcnJvcihwbmdfcHRyLCBtc2cpOworfQorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECisvKiBUaGlzIEFQSSBvbmx5IGV4aXN0cyBpZiBBTlNJLUMgc3R5bGUgZXJyb3IgaGFuZGxpbmcgaXMgdXNlZCwKKyAqIG90aGVyd2lzZSBpdCBpcyBuZWNlc3NhcnkgZm9yIHBuZ19kZWZhdWx0X2Vycm9yIHRvIGJlIG92ZXJyaWRkZW4uCisgKi8KK2ptcF9idWYqIFBOR0FQSQorcG5nX3NldF9sb25nam1wX2ZuKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfbG9uZ2ptcF9wdHIgbG9uZ2ptcF9mbiwKKyAgICBzaXplX3Qgam1wX2J1Zl9zaXplKQoreworICAgLyogRnJvbSBsaWJwbmcgMS42LjAgdGhlIGFwcCBnZXRzIG9uZSBjaGFuY2UgdG8gc2V0IGEgJ2ptcGJ1Zl9zaXplJyB2YWx1ZQorICAgICogYW5kIGl0IG11c3Qgbm90IGNoYW5nZSBhZnRlciB0aGF0LiAgTGlicG5nIGRvZXNuJ3QgY2FyZSBob3cgYmlnIHRoZQorICAgICogYnVmZmVyIGlzLCBqdXN0IHRoYXQgaXQgZG9lc24ndCBjaGFuZ2UuCisgICAgKgorICAgICogSWYgdGhlIGJ1ZmZlciBzaXplIGlzIG5vICpsYXJnZXIqIHRoYW4gdGhlIHNpemUgb2Ygam1wX2J1ZiB3aGVuIGxpYnBuZyBpcworICAgICogY29tcGlsZWQgYSBidWlsdCBpbiBqbXBfYnVmIGlzIHJldHVybmVkOyB0aGlzIHByZXNlcnZlcyB0aGUgcHJlLTEuNi4wCisgICAgKiBzZW1hbnRpY3MgdGhhdCB0aGlzIGNhbGwgd2lsbCBub3QgZmFpbC4gIElmIHRoZSBzaXplIGlzIGxhcmdlciwgaG93ZXZlciwKKyAgICAqIHRoZSBidWZmZXIgaXMgYWxsb2NhdGVkIGFuZCB0aGlzIG1heSBmYWlsLCBjYXVzaW5nIHRoZSBmdW5jdGlvbiB0byByZXR1cm4KKyAgICAqIE5VTEwuCisgICAgKi8KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgaWYgKHBuZ19wdHItPmptcF9idWZfcHRyID09IE5VTEwpCisgICB7CisgICAgICBwbmdfcHRyLT5qbXBfYnVmX3NpemUgPSAwOyAvKiBub3QgYWxsb2NhdGVkICovCisKKyAgICAgIGlmIChqbXBfYnVmX3NpemUgPD0gKHNpemVvZiBwbmdfcHRyLT5qbXBfYnVmX2xvY2FsKSkKKyAgICAgICAgIHBuZ19wdHItPmptcF9idWZfcHRyID0gJnBuZ19wdHItPmptcF9idWZfbG9jYWw7CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHBuZ19wdHItPmptcF9idWZfcHRyID0gcG5nX3ZvaWRjYXN0KGptcF9idWYgKiwKKyAgICAgICAgICAgIHBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCBqbXBfYnVmX3NpemUpKTsKKworICAgICAgICAgaWYgKHBuZ19wdHItPmptcF9idWZfcHRyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsgLyogbmV3IE5VTEwgcmV0dXJuIG9uIE9PTSAqLworCisgICAgICAgICBwbmdfcHRyLT5qbXBfYnVmX3NpemUgPSBqbXBfYnVmX3NpemU7CisgICAgICB9CisgICB9CisKKyAgIGVsc2UgLyogQWxyZWFkeSBhbGxvY2F0ZWQ6IGNoZWNrIHRoZSBzaXplICovCisgICB7CisgICAgICBzaXplX3Qgc2l6ZSA9IHBuZ19wdHItPmptcF9idWZfc2l6ZTsKKworICAgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgIHNpemUgPSAoc2l6ZW9mIHBuZ19wdHItPmptcF9idWZfbG9jYWwpOworICAgICAgICAgaWYgKHBuZ19wdHItPmptcF9idWZfcHRyICE9ICZwbmdfcHRyLT5qbXBfYnVmX2xvY2FsKQorICAgICAgICAgeworICAgICAgICAgICAgLyogVGhpcyBpcyBhbiBpbnRlcm5hbCBlcnJvciBpbiBsaWJwbmc6IHNvbWVob3cgd2UgaGF2ZSBiZWVuIGxlZnQKKyAgICAgICAgICAgICAqIHdpdGggYSBzdGFjayBhbGxvY2F0ZWQgam1wX2J1ZiB3aGVuIHRoZSBhcHBsaWNhdGlvbiByZWdhaW5lZAorICAgICAgICAgICAgICogY29udHJvbC4gIEl0J3MgYWx3YXlzIHBvc3NpYmxlIHRvIGZpeCB0aGlzIHVwLCBidXQgZm9yIHRoZSBtb21lbnQKKyAgICAgICAgICAgICAqIHRoaXMgaXMgYSBwbmdfZXJyb3IgYmVjYXVzZSB0aGF0IG1ha2VzIGl0IGVhc3kgdG8gZGV0ZWN0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkxpYnBuZyBqbXBfYnVmIHN0aWxsIGFsbG9jYXRlZCIpOworICAgICAgICAgICAgLyogcG5nX3B0ci0+am1wX2J1Zl9wdHIgPSAmcG5nX3B0ci0+am1wX2J1Zl9sb2NhbDsgKi8KKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHNpemUgIT0gam1wX2J1Zl9zaXplKQorICAgICAgeworICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkFwcGxpY2F0aW9uIGptcF9idWYgc2l6ZSBjaGFuZ2VkIik7CisgICAgICAgICByZXR1cm4gTlVMTDsgLyogY2FsbGVyIHdpbGwgcHJvYmFibHkgY3Jhc2g6IG5vIGNob2ljZSBoZXJlICovCisgICAgICB9CisgICB9CisKKyAgIC8qIEZpbmFsbHkgZmlsbCBpbiB0aGUgZnVuY3Rpb24sIG5vdyB3ZSBoYXZlIGEgc2F0aXNmYWN0b3J5IGJ1ZmZlci4gSXQgaXMKKyAgICAqIHZhbGlkIHRvIGNoYW5nZSB0aGUgZnVuY3Rpb24gb24gZXZlcnkgY2FsbC4KKyAgICAqLworICAgcG5nX3B0ci0+bG9uZ2ptcF9mbiA9IGxvbmdqbXBfZm47CisgICByZXR1cm4gcG5nX3B0ci0+am1wX2J1Zl9wdHI7Cit9CisKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2ZyZWVfam1wYnVmKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQoreworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCkKKyAgIHsKKyAgICAgIGptcF9idWYgKmpiID0gcG5nX3B0ci0+am1wX2J1Zl9wdHI7CisKKyAgICAgIC8qIEEgc2l6ZSBvZiAwIGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBsb2NhbCwgc3RhY2ssIGFsbG9jYXRpb24gb2YgdGhlCisgICAgICAgKiBwb2ludGVyOyB1c2VkIGhlcmUgYW5kIGluIHBuZy5jCisgICAgICAgKi8KKyAgICAgIGlmIChqYiAhPSBOVUxMICYmIHBuZ19wdHItPmptcF9idWZfc2l6ZSA+IDApCisgICAgICB7CisKKyAgICAgICAgIC8qIFRoaXMgc3R1ZmYgaXMgc28gdGhhdCBhIGZhaWx1cmUgdG8gZnJlZSB0aGUgZXJyb3IgY29udHJvbCBzdHJ1Y3R1cmUKKyAgICAgICAgICAqIGRvZXMgbm90IGxlYXZlIGxpYnBuZyBpbiBhIHN0YXRlIHdpdGggbm8gdmFsaWQgZXJyb3IgaGFuZGxpbmc6IHRoZQorICAgICAgICAgICogZnJlZSBhbHdheXMgc3VjY2VlZHMsIGlmIHRoZXJlIGlzIGFuIGVycm9yIGl0IGdldHMgaWdub3JlZC4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKGpiICE9ICZwbmdfcHRyLT5qbXBfYnVmX2xvY2FsKQorICAgICAgICAgeworICAgICAgICAgICAgLyogTWFrZSBhbiBpbnRlcm5hbCwgbGlicG5nLCBqbXBfYnVmIHRvIHJldHVybiBoZXJlICovCisgICAgICAgICAgICBqbXBfYnVmIGZyZWVfam1wX2J1ZjsKKworICAgICAgICAgICAgaWYgKCFzZXRqbXAoZnJlZV9qbXBfYnVmKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19wdHItPmptcF9idWZfcHRyID0gJmZyZWVfam1wX2J1ZjsgLyogY29tZSBiYWNrIGhlcmUgKi8KKyAgICAgICAgICAgICAgIHBuZ19wdHItPmptcF9idWZfc2l6ZSA9IDA7IC8qIHN0YWNrIGFsbG9jYXRpb24gKi8KKyAgICAgICAgICAgICAgIHBuZ19wdHItPmxvbmdqbXBfZm4gPSBsb25nam1wOworICAgICAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgamIpOyAvKiBSZXR1cm4gdG8gc2V0am1wIG9uIGVycm9yICovCisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qICpBbHdheXMqIGNhbmNlbCBldmVyeXRoaW5nIG91dDogKi8KKyAgICAgIHBuZ19wdHItPmptcF9idWZfc2l6ZSA9IDA7CisgICAgICBwbmdfcHRyLT5qbXBfYnVmX3B0ciA9IE5VTEw7CisgICAgICBwbmdfcHRyLT5sb25nam1wX2ZuID0gMDsKKyAgIH0KK30KKyNlbmRpZgorCisvKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGVycm9yIGhhbmRsaW5nIGZ1bmN0aW9uLiAgTm90ZSB0aGF0IHJlcGxhY2VtZW50cyBmb3IKKyAqIHRoaXMgZnVuY3Rpb24gTVVTVCBOT1QgUkVUVVJOLCBvciB0aGUgcHJvZ3JhbSB3aWxsIGxpa2VseSBjcmFzaC4gIFRoaXMKKyAqIGZ1bmN0aW9uIGlzIHVzZWQgYnkgZGVmYXVsdCwgb3IgaWYgdGhlIHByb2dyYW0gc3VwcGxpZXMgTlVMTCBmb3IgdGhlCisgKiBlcnJvciBmdW5jdGlvbiBwb2ludGVyIGluIHBuZ19zZXRfZXJyb3JfZm4oKS4KKyAqLworc3RhdGljIFBOR19GVU5DVElPTih2b2lkIC8qIFBSSVZBVEUgKi8sCitwbmdfZGVmYXVsdF9lcnJvciwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBlcnJvcl9tZXNzYWdlKSwKKyAgIFBOR19OT1JFVFVSTikKK3sKKyNpZmRlZiBQTkdfQ09OU09MRV9JT19TVVBQT1JURUQKKyNpZmRlZiBQTkdfRVJST1JfTlVNQkVSU19TVVBQT1JURUQKKyAgIC8qIENoZWNrIG9uIE5VTEwgb25seSBhZGRlZCBpbiAxLjUuNCAqLworICAgaWYgKGVycm9yX21lc3NhZ2UgIT0gTlVMTCAmJiAqZXJyb3JfbWVzc2FnZSA9PSBQTkdfTElURVJBTF9TSEFSUCkKKyAgIHsKKyAgICAgIC8qIFN0cmlwICIjbm5ubiAiIGZyb20gYmVnaW5uaW5nIG9mIGVycm9yIG1lc3NhZ2UuICovCisgICAgICBpbnQgb2Zmc2V0OworICAgICAgY2hhciBlcnJvcl9udW1iZXJbMTZdOworICAgICAgZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQ8MTU7IG9mZnNldCsrKQorICAgICAgeworICAgICAgICAgZXJyb3JfbnVtYmVyW29mZnNldF0gPSBlcnJvcl9tZXNzYWdlW29mZnNldCArIDFdOworICAgICAgICAgaWYgKGVycm9yX21lc3NhZ2Vbb2Zmc2V0XSA9PSAnICcpCisgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKChvZmZzZXQgPiAxKSAmJiAob2Zmc2V0IDwgMTUpKQorICAgICAgeworICAgICAgICAgZXJyb3JfbnVtYmVyW29mZnNldCAtIDFdID0gJ1wwJzsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibGlicG5nIGVycm9yIG5vLiAlczogJXMiLAorICAgICAgICAgICAgIGVycm9yX251bWJlciwgZXJyb3JfbWVzc2FnZSArIG9mZnNldCArIDEpOworICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBOR19TVFJJTkdfTkVXTElORSk7CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibGlicG5nIGVycm9yOiAlcywgb2Zmc2V0PSVkIiwKKyAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlLCBvZmZzZXQpOworICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBOR19TVFJJTkdfTkVXTElORSk7CisgICAgICB9CisgICB9CisgICBlbHNlCisjZW5kaWYKKyAgIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAibGlicG5nIGVycm9yOiAlcyIsIGVycm9yX21lc3NhZ2UgPyBlcnJvcl9tZXNzYWdlIDoKKyAgICAgICAgICJ1bmRlZmluZWQiKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCBQTkdfU1RSSU5HX05FV0xJTkUpOworICAgfQorI2Vsc2UKKyAgIFBOR19VTlVTRUQoZXJyb3JfbWVzc2FnZSkgLyogTWFrZSBjb21waWxlciBoYXBweSAqLworI2VuZGlmCisgICBwbmdfbG9uZ2ptcChwbmdfcHRyLCAxKTsKK30KKworUE5HX0ZVTkNUSU9OKHZvaWQsUE5HQVBJCitwbmdfbG9uZ2ptcCwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIGludCB2YWwpLFBOR19OT1JFVFVSTikKK3sKKyNpZmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBwbmdfcHRyLT5sb25nam1wX2ZuICE9IE5VTEwgJiYKKyAgICAgICBwbmdfcHRyLT5qbXBfYnVmX3B0ciAhPSBOVUxMKQorICAgICAgcG5nX3B0ci0+bG9uZ2ptcF9mbigqcG5nX3B0ci0+am1wX2J1Zl9wdHIsIHZhbCk7CisjZWxzZQorICAgUE5HX1VOVVNFRChwbmdfcHRyKQorICAgUE5HX1VOVVNFRCh2YWwpCisjZW5kaWYKKworICAgLyogSWYgY29udHJvbCByZWFjaGVzIHRoaXMgcG9pbnQsIHBuZ19sb25nam1wKCkgbXVzdCBub3QgcmV0dXJuLiBUaGUgb25seQorICAgICogY2hvaWNlIGlzIHRvIHRlcm1pbmF0ZSB0aGUgd2hvbGUgcHJvY2VzcyAob3IgbWF5YmUgdGhlIHRocmVhZCk7IHRvIGRvCisgICAgKiB0aGlzIHRoZSBBTlNJLUMgYWJvcnQoKSBmdW5jdGlvbiBpcyB1c2VkIHVubGVzcyBhIGRpZmZlcmVudCBtZXRob2QgaXMKKyAgICAqIGltcGxlbWVudGVkIGJ5IG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBzZXR0aW5nIGZvcgorICAgICogUE5HX0FCT1JUKCkuCisgICAgKi8KKyAgIFBOR19BQk9SVCgpOworfQorCisjaWZkZWYgUE5HX1dBUk5JTkdTX1NVUFBPUlRFRAorLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhIHdhcm5pbmcsIGJ1dCB0aGUgbGlicmFyeSB0aGlua3MKKyAqIGl0IGNhbiBjb250aW51ZSBhbnl3YXkuICBSZXBsYWNlbWVudCBmdW5jdGlvbnMgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZworICogaGVyZSBpZiB5b3UgZG9uJ3Qgd2FudCB0aGVtIHRvLiAgSW4gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiwgcG5nX3B0ciBpcworICogbm90IHVzZWQsIGJ1dCBpdCBpcyBwYXNzZWQgaW4gY2FzZSBpdCBtYXkgYmUgdXNlZnVsLgorICovCitzdGF0aWMgdm9pZCAvKiBQUklWQVRFICovCitwbmdfZGVmYXVsdF93YXJuaW5nKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgd2FybmluZ19tZXNzYWdlKQoreworI2lmZGVmIFBOR19DT05TT0xFX0lPX1NVUFBPUlRFRAorIyAgaWZkZWYgUE5HX0VSUk9SX05VTUJFUlNfU1VQUE9SVEVECisgICBpZiAoKndhcm5pbmdfbWVzc2FnZSA9PSBQTkdfTElURVJBTF9TSEFSUCkKKyAgIHsKKyAgICAgIGludCBvZmZzZXQ7CisgICAgICBjaGFyIHdhcm5pbmdfbnVtYmVyWzE2XTsKKyAgICAgIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgMTU7IG9mZnNldCsrKQorICAgICAgeworICAgICAgICAgd2FybmluZ19udW1iZXJbb2Zmc2V0XSA9IHdhcm5pbmdfbWVzc2FnZVtvZmZzZXQgKyAxXTsKKyAgICAgICAgIGlmICh3YXJuaW5nX21lc3NhZ2Vbb2Zmc2V0XSA9PSAnICcpCisgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKChvZmZzZXQgPiAxKSAmJiAob2Zmc2V0IDwgMTUpKQorICAgICAgeworICAgICAgICAgd2FybmluZ19udW1iZXJbb2Zmc2V0ICsgMV0gPSAnXDAnOworICAgICAgICAgZnByaW50ZihzdGRlcnIsICJsaWJwbmcgd2FybmluZyBuby4gJXM6ICVzIiwKKyAgICAgICAgICAgICB3YXJuaW5nX251bWJlciwgd2FybmluZ19tZXNzYWdlICsgb2Zmc2V0KTsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQTkdfU1RSSU5HX05FV0xJTkUpOworICAgICAgfQorCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImxpYnBuZyB3YXJuaW5nOiAlcyIsCisgICAgICAgICAgICAgd2FybmluZ19tZXNzYWdlKTsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQTkdfU1RSSU5HX05FV0xJTkUpOworICAgICAgfQorICAgfQorICAgZWxzZQorIyAgZW5kaWYKKworICAgeworICAgICAgZnByaW50ZihzdGRlcnIsICJsaWJwbmcgd2FybmluZzogJXMiLCB3YXJuaW5nX21lc3NhZ2UpOworICAgICAgZnByaW50ZihzdGRlcnIsIFBOR19TVFJJTkdfTkVXTElORSk7CisgICB9CisjZWxzZQorICAgUE5HX1VOVVNFRCh3YXJuaW5nX21lc3NhZ2UpIC8qIE1ha2UgY29tcGlsZXIgaGFwcHkgKi8KKyNlbmRpZgorICAgUE5HX1VOVVNFRChwbmdfcHRyKSAvKiBNYWtlIGNvbXBpbGVyIGhhcHB5ICovCit9CisjZW5kaWYgLyogV0FSTklOR1MgKi8KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gd2FudHMgdG8gdXNlIGFub3RoZXIgbWV0aG9kCisgKiBvZiBoYW5kbGluZyBlcnJvcnMgYW5kIHdhcm5pbmdzLiAgTm90ZSB0aGF0IHRoZSBlcnJvciBmdW5jdGlvbiBNVVNUIE5PVAorICogcmV0dXJuIHRvIHRoZSBjYWxsaW5nIHJvdXRpbmUgb3Igc2VyaW91cyBwcm9ibGVtcyB3aWxsIG9jY3VyLiAgVGhlIHJldHVybgorICogbWV0aG9kIHVzZWQgaW4gdGhlIGRlZmF1bHQgcm91dGluZSBjYWxscyBsb25nam1wKHBuZ19wdHItPmptcF9idWZfcHRyLCAxKQorICovCit2b2lkIFBOR0FQSQorcG5nX3NldF9lcnJvcl9mbihwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3ZvaWRwIGVycm9yX3B0ciwKKyAgICBwbmdfZXJyb3JfcHRyIGVycm9yX2ZuLCBwbmdfZXJyb3JfcHRyIHdhcm5pbmdfZm4pCit7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBwbmdfcHRyLT5lcnJvcl9wdHIgPSBlcnJvcl9wdHI7CisgICBwbmdfcHRyLT5lcnJvcl9mbiA9IGVycm9yX2ZuOworI2lmZGVmIFBOR19XQVJOSU5HU19TVVBQT1JURUQKKyAgIHBuZ19wdHItPndhcm5pbmdfZm4gPSB3YXJuaW5nX2ZuOworI2Vsc2UKKyAgIFBOR19VTlVTRUQod2FybmluZ19mbikKKyNlbmRpZgorfQorCisKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGVycm9yX3B0ciBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIKKyAqIGZ1bmN0aW9ucy4gIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZnJlZSBhbnkgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgKiBwb2ludGVyIGJlZm9yZSBwbmdfd3JpdGVfZGVzdHJveSBhbmQgcG5nX3JlYWRfZGVzdHJveSBhcmUgY2FsbGVkLgorICovCitwbmdfdm9pZHAgUE5HQVBJCitwbmdfZ2V0X2Vycm9yX3B0cihwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikKK3sKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgcmV0dXJuICgocG5nX3ZvaWRwKXBuZ19wdHItPmVycm9yX3B0cik7Cit9CisKKworI2lmZGVmIFBOR19FUlJPUl9OVU1CRVJTX1NVUFBPUlRFRAordm9pZCBQTkdBUEkKK3BuZ19zZXRfc3RyaXBfZXJyb3JfbnVtYmVycyhwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgc3RyaXBfbW9kZSkKK3sKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwpCisgICB7CisgICAgICBwbmdfcHRyLT5mbGFncyAmPQorICAgICAgICAgKCh+KFBOR19GTEFHX1NUUklQX0VSUk9SX05VTUJFUlMgfAorICAgICAgICAgUE5HX0ZMQUdfU1RSSVBfRVJST1JfVEVYVCkpJnN0cmlwX21vZGUpOworICAgfQorfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19TSU1QTElGSUVEX1JFQURfU1VQUE9SVEVEKSB8fFwKKyAgIGRlZmluZWQoUE5HX1NJTVBMSUZJRURfV1JJVEVfU1VQUE9SVEVEKQorICAgLyogQ3VycmVudGx5IHRoZSBhYm92ZSBib3RoIGRlcGVuZCBvbiBTRVRKTVBfU1VQUE9SVEVELCBob3dldmVyIGl0IHdvdWxkIGJlCisgICAgKiBwb3NzaWJsZSB0byBpbXBsZW1lbnQgd2l0aG91dCBzZXRqbXAgc3VwcG9ydCBqdXN0IHNvIGxvbmcgYXMgdGhlcmUgaXMgc29tZQorICAgICogd2F5IHRvIGhhbmRsZSB0aGUgZXJyb3IgcmV0dXJuIGhlcmU6CisgICAgKi8KK1BOR19GVU5DVElPTih2b2lkIC8qIFBSSVZBVEUgKi8sIChQTkdDQkFQSQorcG5nX3NhZmVfZXJyb3IpLChwbmdfc3RydWN0cCBwbmdfbm9uY29uc3RfcHRyLCBwbmdfY29uc3RfY2hhcnAgZXJyb3JfbWVzc2FnZSksCisgICBQTkdfTk9SRVRVUk4pCit7CisgICBjb25zdCBwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciA9IHBuZ19ub25jb25zdF9wdHI7CisgICBwbmdfaW1hZ2VwIGltYWdlID0gcG5nX3ZvaWRjYXN0KHBuZ19pbWFnZXAsIHBuZ19wdHItPmVycm9yX3B0cik7CisKKyAgIC8qIEFuIGVycm9yIGlzIGFsd2F5cyBsb2dnZWQgaGVyZSwgb3ZlcndyaXRpbmcgYW55dGhpbmcgKHR5cGljYWxseSBhIHdhcm5pbmcpCisgICAgKiB0aGF0IGlzIGFscmVhZHkgdGhlcmU6CisgICAgKi8KKyAgIGlmIChpbWFnZSAhPSBOVUxMKQorICAgeworICAgICAgcG5nX3NhZmVjYXQoaW1hZ2UtPm1lc3NhZ2UsIChzaXplb2YgaW1hZ2UtPm1lc3NhZ2UpLCAwLCBlcnJvcl9tZXNzYWdlKTsKKyAgICAgIGltYWdlLT53YXJuaW5nX29yX2Vycm9yIHw9IFBOR19JTUFHRV9FUlJPUjsKKworICAgICAgLyogUmV0cmlldmUgdGhlIGptcF9idWYgZnJvbSB3aXRoaW4gdGhlIHBuZ19jb250cm9sLCBtYWtpbmcgdGhpcyB3b3JrIGZvcgorICAgICAgICogQysrIGNvbXBpbGF0aW9uIHRvbyBpcyBwcmV0dHkgdHJpY2t5OiBDKysgd2FudHMgYSBwb2ludGVyIHRvIHRoZSBmaXJzdAorICAgICAgICogZWxlbWVudCBvZiBhIGptcF9idWYsIGJ1dCBDIGRvZXNuJ3QgdGVsbCB1cyB0aGUgdHlwZSBvZiB0aGF0LgorICAgICAgICovCisgICAgICBpZiAoaW1hZ2UtPm9wYXF1ZSAhPSBOVUxMICYmIGltYWdlLT5vcGFxdWUtPmVycm9yX2J1ZiAhPSBOVUxMKQorICAgICAgICAgbG9uZ2ptcChwbmdfY29udHJvbF9qbXBfYnVmKGltYWdlLT5vcGFxdWUpLCAxKTsKKworICAgICAgLyogTWlzc2luZyBsb25nam1wIGJ1ZmZlciwgdGhlIGZvbGxvd2luZyBpcyB0byBoZWxwIGRlYnVnZ2luZzogKi8KKyAgICAgIHsKKyAgICAgICAgIHNpemVfdCBwb3MgPSBwbmdfc2FmZWNhdChpbWFnZS0+bWVzc2FnZSwgKHNpemVvZiBpbWFnZS0+bWVzc2FnZSksIDAsCisgICAgICAgICAgICAiYmFkIGxvbmdqbXA6ICIpOworICAgICAgICAgcG5nX3NhZmVjYXQoaW1hZ2UtPm1lc3NhZ2UsIChzaXplb2YgaW1hZ2UtPm1lc3NhZ2UpLCBwb3MsCisgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSk7CisgICAgICB9CisgICB9CisKKyAgIC8qIEhlcmUgb24gYW4gaW50ZXJuYWwgcHJvZ3JhbW1pbmcgZXJyb3IuICovCisgICBhYm9ydCgpOworfQorCisjaWZkZWYgUE5HX1dBUk5JTkdTX1NVUFBPUlRFRAordm9pZCAvKiBQUklWQVRFICovIFBOR0NCQVBJCitwbmdfc2FmZV93YXJuaW5nKHBuZ19zdHJ1Y3RwIHBuZ19ub25jb25zdF9wdHIsIHBuZ19jb25zdF9jaGFycCB3YXJuaW5nX21lc3NhZ2UpCit7CisgICBjb25zdCBwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciA9IHBuZ19ub25jb25zdF9wdHI7CisgICBwbmdfaW1hZ2VwIGltYWdlID0gcG5nX3ZvaWRjYXN0KHBuZ19pbWFnZXAsIHBuZ19wdHItPmVycm9yX3B0cik7CisKKyAgIC8qIEEgd2FybmluZyBpcyBvbmx5IGxvZ2dlZCBpZiB0aGVyZSBpcyBubyBwcmlvciB3YXJuaW5nIG9yIGVycm9yLiAqLworICAgaWYgKGltYWdlLT53YXJuaW5nX29yX2Vycm9yID09IDApCisgICB7CisgICAgICBwbmdfc2FmZWNhdChpbWFnZS0+bWVzc2FnZSwgKHNpemVvZiBpbWFnZS0+bWVzc2FnZSksIDAsIHdhcm5pbmdfbWVzc2FnZSk7CisgICAgICBpbWFnZS0+d2FybmluZ19vcl9lcnJvciB8PSBQTkdfSU1BR0VfV0FSTklORzsKKyAgIH0KK30KKyNlbmRpZgorCitpbnQgLyogUFJJVkFURSAqLworcG5nX3NhZmVfZXhlY3V0ZShwbmdfaW1hZ2VwIGltYWdlX2luLCBpbnQgKCpmdW5jdGlvbikocG5nX3ZvaWRwKSwgcG5nX3ZvaWRwIGFyZykKK3sKKyAgIHZvbGF0aWxlIHBuZ19pbWFnZXAgaW1hZ2UgPSBpbWFnZV9pbjsKKyAgIHZvbGF0aWxlIGludCByZXN1bHQ7CisgICB2b2xhdGlsZSBwbmdfdm9pZHAgc2F2ZWRfZXJyb3JfYnVmOworICAgam1wX2J1ZiBzYWZlX2ptcGJ1ZjsKKworICAgLyogU2FmZWx5IGV4ZWN1dGUgZnVuY3Rpb24oYXJnKSB3aXRoIHBuZ19lcnJvciByZXR1cm5pbmcgdG8gdGhpcyBmdW5jdGlvbi4gKi8KKyAgIHNhdmVkX2Vycm9yX2J1ZiA9IGltYWdlLT5vcGFxdWUtPmVycm9yX2J1ZjsKKyAgIHJlc3VsdCA9IHNldGptcChzYWZlX2ptcGJ1ZikgPT0gMDsKKworICAgaWYgKHJlc3VsdCAhPSAwKQorICAgeworCisgICAgICBpbWFnZS0+b3BhcXVlLT5lcnJvcl9idWYgPSBzYWZlX2ptcGJ1ZjsKKyAgICAgIHJlc3VsdCA9IGZ1bmN0aW9uKGFyZyk7CisgICB9CisKKyAgIGltYWdlLT5vcGFxdWUtPmVycm9yX2J1ZiA9IHNhdmVkX2Vycm9yX2J1ZjsKKworICAgLyogQW5kIGRvIHRoZSBjbGVhbnVwIHByaW9yIHRvIGFueSBmYWlsdXJlIHJldHVybi4gKi8KKyAgIGlmIChyZXN1bHQgPT0gMCkKKyAgICAgIHBuZ19pbWFnZV9mcmVlKGltYWdlKTsKKworICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZiAvKiBTSU1QTElGSUVEIFJFQUQgfHwgU0lNUExJRklFRF9XUklURSAqLworI2VuZGlmIC8qIFJFQUQgfHwgV1JJVEUgKi8KZGlmZiAtLWdpdCBhL2xpYnBuZy9wbmdnZXQuYyBiL2xpYnBuZy9wbmdnZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDNhNmE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3BuZ2dldC5jCkBAIC0wLDAgKzEsMTIxOSBAQAorCisvKiBwbmdnZXQuYyAtIHJldHJpZXZhbCBvZiB2YWx1ZXMgZnJvbSBpbmZvIHN0cnVjdAorICoKKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS42LjE3IFtNYXJjaCAyNiwgMjAxNV0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDE1IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCisgKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCisgKgorICovCisKKyNpbmNsdWRlICJwbmdwcml2LmgiCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1VQUE9SVEVEKQorCitwbmdfdWludF8zMiBQTkdBUEkKK3BuZ19nZXRfdmFsaWQocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIsCisgICAgcG5nX3VpbnRfMzIgZmxhZykKK3sKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkKKyAgICAgIHJldHVybihpbmZvX3B0ci0+dmFsaWQgJiBmbGFnKTsKKworICAgcmV0dXJuKDApOworfQorCitwbmdfc2l6ZV90IFBOR0FQSQorcG5nX2dldF9yb3dieXRlcyhwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikKK3sKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkKKyAgICAgIHJldHVybihpbmZvX3B0ci0+cm93Ynl0ZXMpOworCisgICByZXR1cm4oMCk7Cit9CisKKyNpZmRlZiBQTkdfSU5GT19JTUFHRV9TVVBQT1JURUQKK3BuZ19ieXRlcHAgUE5HQVBJCitwbmdfZ2V0X3Jvd3MocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpCit7CisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwpCisgICAgICByZXR1cm4oaW5mb19wdHItPnJvd19wb2ludGVycyk7CisKKyAgIHJldHVybigwKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX0VBU1lfQUNDRVNTX1NVUFBPUlRFRAorLyogRWFzeSBhY2Nlc3MgdG8gaW5mbywgYWRkZWQgaW4gbGlicG5nLTAuOTkgKi8KK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX2dldF9pbWFnZV93aWR0aChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikKK3sKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkKKyAgICAgIHJldHVybiBpbmZvX3B0ci0+d2lkdGg7CisKKyAgIHJldHVybiAoMCk7Cit9CisKK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX2dldF9pbWFnZV9oZWlnaHQocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpCit7CisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwpCisgICAgICByZXR1cm4gaW5mb19wdHItPmhlaWdodDsKKworICAgcmV0dXJuICgwKTsKK30KKworcG5nX2J5dGUgUE5HQVBJCitwbmdfZ2V0X2JpdF9kZXB0aChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikKK3sKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkKKyAgICAgIHJldHVybiBpbmZvX3B0ci0+Yml0X2RlcHRoOworCisgICByZXR1cm4gKDApOworfQorCitwbmdfYnl0ZSBQTkdBUEkKK3BuZ19nZXRfY29sb3JfdHlwZShwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikKK3sKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkKKyAgICAgIHJldHVybiBpbmZvX3B0ci0+Y29sb3JfdHlwZTsKKworICAgcmV0dXJuICgwKTsKK30KKworcG5nX2J5dGUgUE5HQVBJCitwbmdfZ2V0X2ZpbHRlcl90eXBlKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyKQoreworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQorICAgICAgcmV0dXJuIGluZm9fcHRyLT5maWx0ZXJfdHlwZTsKKworICAgcmV0dXJuICgwKTsKK30KKworcG5nX2J5dGUgUE5HQVBJCitwbmdfZ2V0X2ludGVybGFjZV90eXBlKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyKQoreworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQorICAgICAgcmV0dXJuIGluZm9fcHRyLT5pbnRlcmxhY2VfdHlwZTsKKworICAgcmV0dXJuICgwKTsKK30KKworcG5nX2J5dGUgUE5HQVBJCitwbmdfZ2V0X2NvbXByZXNzaW9uX3R5cGUocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpCit7CisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwpCisgICAgICByZXR1cm4gaW5mb19wdHItPmNvbXByZXNzaW9uX3R5cGU7CisKKyAgIHJldHVybiAoMCk7Cit9CisKK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX2dldF94X3BpeGVsc19wZXJfbWV0ZXIocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAKKyAgIGluZm9fcHRyKQoreworI2lmZGVmIFBOR19wSFlzX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmCisgICAgICAgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3BIWXMpICE9IDApCisgICAgICB7CisgICAgICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLAorICAgICAgICAgICAgICJwbmdfZ2V0X3hfcGl4ZWxzX3Blcl9tZXRlciIpOworCisgICAgICAgICBpZiAoaW5mb19wdHItPnBoeXNfdW5pdF90eXBlID09IFBOR19SRVNPTFVUSU9OX01FVEVSKQorICAgICAgICAgICAgcmV0dXJuIChpbmZvX3B0ci0+eF9waXhlbHNfcGVyX3VuaXQpOworICAgICAgfQorI2Vsc2UKKyAgIFBOR19VTlVTRUQocG5nX3B0cikKKyAgIFBOR19VTlVTRUQoaW5mb19wdHIpCisjZW5kaWYKKworICAgcmV0dXJuICgwKTsKK30KKworcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X3lfcGl4ZWxzX3Blcl9tZXRlcihwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycAorICAgIGluZm9fcHRyKQoreworI2lmZGVmIFBOR19wSFlzX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmCisgICAgICAgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3BIWXMpICE9IDApCisgICB7CisgICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLAorICAgICAgICAgICJwbmdfZ2V0X3lfcGl4ZWxzX3Blcl9tZXRlciIpOworCisgICAgICBpZiAoaW5mb19wdHItPnBoeXNfdW5pdF90eXBlID09IFBOR19SRVNPTFVUSU9OX01FVEVSKQorICAgICAgICAgcmV0dXJuIChpbmZvX3B0ci0+eV9waXhlbHNfcGVyX3VuaXQpOworICAgfQorI2Vsc2UKKyAgIFBOR19VTlVTRUQocG5nX3B0cikKKyAgIFBOR19VTlVTRUQoaW5mb19wdHIpCisjZW5kaWYKKworICAgcmV0dXJuICgwKTsKK30KKworcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X3BpeGVsc19wZXJfbWV0ZXIocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpCit7CisjaWZkZWYgUE5HX3BIWXNfU1VQUE9SVEVECisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYKKyAgICAgICAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fcEhZcykgIT0gMCkKKyAgIHsKKyAgICAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJwbmdfZ2V0X3BpeGVsc19wZXJfbWV0ZXIiKTsKKworICAgICAgaWYgKGluZm9fcHRyLT5waHlzX3VuaXRfdHlwZSA9PSBQTkdfUkVTT0xVVElPTl9NRVRFUiAmJgorICAgICAgICAgIGluZm9fcHRyLT54X3BpeGVsc19wZXJfdW5pdCA9PSBpbmZvX3B0ci0+eV9waXhlbHNfcGVyX3VuaXQpCisgICAgICAgICByZXR1cm4gKGluZm9fcHRyLT54X3BpeGVsc19wZXJfdW5pdCk7CisgICB9CisjZWxzZQorICAgUE5HX1VOVVNFRChwbmdfcHRyKQorICAgUE5HX1VOVVNFRChpbmZvX3B0cikKKyNlbmRpZgorCisgICByZXR1cm4gKDApOworfQorCisjaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorZmxvYXQgUE5HQVBJCitwbmdfZ2V0X3BpeGVsX2FzcGVjdF9yYXRpbyhwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycAorICAgaW5mb19wdHIpCit7CisjaWZkZWYgUE5HX1JFQURfcEhZc19TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJgorICAgICAgIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19wSFlzKSAhPSAwKQorICAgeworICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgInBuZ19nZXRfYXNwZWN0X3JhdGlvIik7CisKKyAgICAgIGlmIChpbmZvX3B0ci0+eF9waXhlbHNfcGVyX3VuaXQgIT0gMCkKKyAgICAgICAgIHJldHVybiAoKGZsb2F0KSgoZmxvYXQpaW5mb19wdHItPnlfcGl4ZWxzX3Blcl91bml0CisgICAgICAgICAgICAgLyhmbG9hdClpbmZvX3B0ci0+eF9waXhlbHNfcGVyX3VuaXQpKTsKKyAgIH0KKyNlbHNlCisgICBQTkdfVU5VU0VEKHBuZ19wdHIpCisgICBQTkdfVU5VU0VEKGluZm9fcHRyKQorI2VuZGlmCisKKyAgIHJldHVybiAoKGZsb2F0KTAuMCk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKK3BuZ19maXhlZF9wb2ludCBQTkdBUEkKK3BuZ19nZXRfcGl4ZWxfYXNwZWN0X3JhdGlvX2ZpeGVkKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpCit7CisjaWZkZWYgUE5HX1JFQURfcEhZc19TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJgorICAgICAgIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19wSFlzKSAhPSAwICYmCisgICAgICAgaW5mb19wdHItPnhfcGl4ZWxzX3Blcl91bml0ID4gMCAmJiBpbmZvX3B0ci0+eV9waXhlbHNfcGVyX3VuaXQgPiAwICYmCisgICAgICAgaW5mb19wdHItPnhfcGl4ZWxzX3Blcl91bml0IDw9IFBOR19VSU5UXzMxX01BWCAmJgorICAgICAgIGluZm9fcHRyLT55X3BpeGVsc19wZXJfdW5pdCA8PSBQTkdfVUlOVF8zMV9NQVgpCisgICB7CisgICAgICBwbmdfZml4ZWRfcG9pbnQgcmVzOworCisgICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAicG5nX2dldF9hc3BlY3RfcmF0aW9fZml4ZWQiKTsKKworICAgICAgLyogVGhlIGZvbGxvd2luZyBjYXN0cyB3b3JrIGJlY2F1c2UgYSBQTkcgNCBieXRlIGludGVnZXIgb25seSBoYXMgYSB2YWxpZAorICAgICAgICogcmFuZ2Ugb2YgMC4uMl4zMS0xOyBvdGhlcndpc2UgdGhlIGNhc3QgbWlnaHQgb3ZlcmZsb3cuCisgICAgICAgKi8KKyAgICAgIGlmIChwbmdfbXVsZGl2KCZyZXMsIChwbmdfaW50XzMyKWluZm9fcHRyLT55X3BpeGVsc19wZXJfdW5pdCwgUE5HX0ZQXzEsCisgICAgICAgICAgKHBuZ19pbnRfMzIpaW5mb19wdHItPnhfcGl4ZWxzX3Blcl91bml0KSAhPSAwKQorICAgICAgICAgcmV0dXJuIHJlczsKKyAgIH0KKyNlbHNlCisgICBQTkdfVU5VU0VEKHBuZ19wdHIpCisgICBQTkdfVU5VU0VEKGluZm9fcHRyKQorI2VuZGlmCisKKyAgIHJldHVybiAwOworfQorI2VuZGlmCisKK3BuZ19pbnRfMzIgUE5HQVBJCitwbmdfZ2V0X3hfb2Zmc2V0X21pY3JvbnMocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpCit7CisjaWZkZWYgUE5HX29GRnNfU1VQUE9SVEVECisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYKKyAgICAgICAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fb0ZGcykgIT0gMCkKKyAgIHsKKyAgICAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJwbmdfZ2V0X3hfb2Zmc2V0X21pY3JvbnMiKTsKKworICAgICAgaWYgKGluZm9fcHRyLT5vZmZzZXRfdW5pdF90eXBlID09IFBOR19PRkZTRVRfTUlDUk9NRVRFUikKKyAgICAgICAgIHJldHVybiAoaW5mb19wdHItPnhfb2Zmc2V0KTsKKyAgIH0KKyNlbHNlCisgICBQTkdfVU5VU0VEKHBuZ19wdHIpCisgICBQTkdfVU5VU0VEKGluZm9fcHRyKQorI2VuZGlmCisKKyAgIHJldHVybiAoMCk7Cit9CisKK3BuZ19pbnRfMzIgUE5HQVBJCitwbmdfZ2V0X3lfb2Zmc2V0X21pY3JvbnMocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpCit7CisjaWZkZWYgUE5HX29GRnNfU1VQUE9SVEVECisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYKKyAgICAgICAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fb0ZGcykgIT0gMCkKKyAgIHsKKyAgICAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJwbmdfZ2V0X3lfb2Zmc2V0X21pY3JvbnMiKTsKKworICAgICAgaWYgKGluZm9fcHRyLT5vZmZzZXRfdW5pdF90eXBlID09IFBOR19PRkZTRVRfTUlDUk9NRVRFUikKKyAgICAgICAgIHJldHVybiAoaW5mb19wdHItPnlfb2Zmc2V0KTsKKyAgIH0KKyNlbHNlCisgICBQTkdfVU5VU0VEKHBuZ19wdHIpCisgICBQTkdfVU5VU0VEKGluZm9fcHRyKQorI2VuZGlmCisKKyAgIHJldHVybiAoMCk7Cit9CisKK3BuZ19pbnRfMzIgUE5HQVBJCitwbmdfZ2V0X3hfb2Zmc2V0X3BpeGVscyhwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikKK3sKKyNpZmRlZiBQTkdfb0ZGc19TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJgorICAgICAgIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19vRkZzKSAhPSAwKQorICAgeworICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgInBuZ19nZXRfeF9vZmZzZXRfcGl4ZWxzIik7CisKKyAgICAgIGlmIChpbmZvX3B0ci0+b2Zmc2V0X3VuaXRfdHlwZSA9PSBQTkdfT0ZGU0VUX1BJWEVMKQorICAgICAgICAgcmV0dXJuIChpbmZvX3B0ci0+eF9vZmZzZXQpOworICAgfQorI2Vsc2UKKyAgIFBOR19VTlVTRUQocG5nX3B0cikKKyAgIFBOR19VTlVTRUQoaW5mb19wdHIpCisjZW5kaWYKKworICAgcmV0dXJuICgwKTsKK30KKworcG5nX2ludF8zMiBQTkdBUEkKK3BuZ19nZXRfeV9vZmZzZXRfcGl4ZWxzKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyKQoreworI2lmZGVmIFBOR19vRkZzX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmCisgICAgICAgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX29GRnMpICE9IDApCisgICB7CisgICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAicG5nX2dldF95X29mZnNldF9waXhlbHMiKTsKKworICAgICAgaWYgKGluZm9fcHRyLT5vZmZzZXRfdW5pdF90eXBlID09IFBOR19PRkZTRVRfUElYRUwpCisgICAgICAgICByZXR1cm4gKGluZm9fcHRyLT55X29mZnNldCk7CisgICB9CisjZWxzZQorICAgUE5HX1VOVVNFRChwbmdfcHRyKQorICAgUE5HX1VOVVNFRChpbmZvX3B0cikKKyNlbmRpZgorCisgICByZXR1cm4gKDApOworfQorCisjaWZkZWYgUE5HX0lOQ0hfQ09OVkVSU0lPTlNfU1VQUE9SVEVECitzdGF0aWMgcG5nX3VpbnRfMzIKK3BwaV9mcm9tX3BwbShwbmdfdWludF8zMiBwcG0pCit7CisjaWYgMAorICAgLyogVGhlIGNvbnZlcnNpb24gaXMgKigyLjU0LzEwMCksIGluIGJpbmFyeSAoMzIgZGlnaXRzKToKKyAgICAqIC4wMDAwMDExMDEwMDAwMDAwMTAwMTExMDEwMTAwMTAwMQorICAgICovCisgICBwbmdfdWludF8zMiB0MTAwMSwgdDExMDE7CisgICBwcG0gPj49IDE7ICAgICAgICAgICAgICAgICAgLyogLjEgKi8KKyAgIHQxMDAxID0gcHBtICsgKHBwbSA+PiAzKTsgICAvKiAuMTAwMSAqLworICAgdDExMDEgPSB0MTAwMSArIChwcG0gPj4gMSk7IC8qIC4xMTAxICovCisgICBwcG0gPj49IDIwOyAgICAgICAgICAgICAgICAgLyogLjAwMDAwMDAwMDAwMDAwMDAwMDAwMSAqLworICAgdDExMDEgKz0gdDExMDEgPj4gMTU7ICAgICAgIC8qIC4xMTAxMDAwMDAwMDAwMDAxMTAxICovCisgICB0MTAwMSA+Pj0gMTE7ICAgICAgICAgICAgICAgLyogLjAwMDAwMDAwMDAwMTAwMSAqLworICAgdDEwMDEgKz0gdDEwMDEgPj4gMTI7ICAgICAgIC8qIC4wMDAwMDAwMDAwMDEwMDEwMDAwMDAwMDEwMDEgKi8KKyAgIHBwbSArPSB0MTAwMTsgICAgICAgICAgICAgICAvKiAuMDAwMDAwMDAwMDAxMDAxMDAwMDAxMDAxMDAxICovCisgICBwcG0gKz0gdDExMDE7ICAgICAgICAgICAgICAgLyogLjExMDEwMDAwMDAwMTAwMTExMDEwMTAwMTAwMSAqLworICAgcmV0dXJuIChwcG0gKyAxNikgPj4gNTsvKiAuMDAwMDAxMTAxMDAwMDAwMDEwMDExMTAxMDEwMDEwMDEgKi8KKyNlbHNlCisgICAvKiBUaGUgYXJndW1lbnQgaXMgYSBQTkcgdW5zaWduZWQgaW50ZWdlciwgc28gaXQgaXMgbm90IHBlcm1pdHRlZAorICAgICogdG8gYmUgYmlnZ2VyIHRoYW4gMl4zMS4KKyAgICAqLworICAgcG5nX2ZpeGVkX3BvaW50IHJlc3VsdDsKKyAgIGlmIChwcG0gPD0gUE5HX1VJTlRfMzFfTUFYICYmIHBuZ19tdWxkaXYoJnJlc3VsdCwgKHBuZ19pbnRfMzIpcHBtLCAxMjcsCisgICAgICAgNTAwMCkgIT0gMCkKKyAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgIC8qIE92ZXJmbG93LiAqLworICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X3BpeGVsc19wZXJfaW5jaChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikKK3sKKyAgIHJldHVybiBwcGlfZnJvbV9wcG0ocG5nX2dldF9waXhlbHNfcGVyX21ldGVyKHBuZ19wdHIsIGluZm9fcHRyKSk7Cit9CisKK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX2dldF94X3BpeGVsc19wZXJfaW5jaChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikKK3sKKyAgIHJldHVybiBwcGlfZnJvbV9wcG0ocG5nX2dldF94X3BpeGVsc19wZXJfbWV0ZXIocG5nX3B0ciwgaW5mb19wdHIpKTsKK30KKworcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X3lfcGl4ZWxzX3Blcl9pbmNoKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyKQoreworICAgcmV0dXJuIHBwaV9mcm9tX3BwbShwbmdfZ2V0X3lfcGl4ZWxzX3Blcl9tZXRlcihwbmdfcHRyLCBpbmZvX3B0cikpOworfQorCisjaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAorc3RhdGljIHBuZ19maXhlZF9wb2ludAorcG5nX2ZpeGVkX2luY2hlc19mcm9tX21pY3JvbnMocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbnRfMzIgbWljcm9ucykKK3sKKyAgIC8qIENvbnZlcnQgZnJvbSBtZXRyZXMgKiAxLDAwMCwwMDAgdG8gaW5jaGVzICogMTAwLDAwMCwgbWV0ZXJzIHRvCisgICAgKiBpbmNoZXMgaXMgc2ltcGx5ICooMTAwLzIuNTQpLCBzbyB3ZSB3YW50ICooMTAvMi41NCkgPT0gNTAwLzEyNy4KKyAgICAqIE5vdGljZSB0aGF0IHRoaXMgY2FuIG92ZXJmbG93IC0gYSB3YXJuaW5nIGlzIG91dHB1dCBhbmQgMCBpcworICAgICogcmV0dXJuZWQuCisgICAgKi8KKyAgIHJldHVybiBwbmdfbXVsZGl2X3dhcm4ocG5nX3B0ciwgbWljcm9ucywgNTAwLCAxMjcpOworfQorCitwbmdfZml4ZWRfcG9pbnQgUE5HQVBJCitwbmdfZ2V0X3hfb2Zmc2V0X2luY2hlc19maXhlZChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyKQoreworICAgcmV0dXJuIHBuZ19maXhlZF9pbmNoZXNfZnJvbV9taWNyb25zKHBuZ19wdHIsCisgICAgICAgcG5nX2dldF94X29mZnNldF9taWNyb25zKHBuZ19wdHIsIGluZm9fcHRyKSk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKK3BuZ19maXhlZF9wb2ludCBQTkdBUEkKK3BuZ19nZXRfeV9vZmZzZXRfaW5jaGVzX2ZpeGVkKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpCit7CisgICByZXR1cm4gcG5nX2ZpeGVkX2luY2hlc19mcm9tX21pY3JvbnMocG5nX3B0ciwKKyAgICAgICBwbmdfZ2V0X3lfb2Zmc2V0X21pY3JvbnMocG5nX3B0ciwgaW5mb19wdHIpKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorZmxvYXQgUE5HQVBJCitwbmdfZ2V0X3hfb2Zmc2V0X2luY2hlcyhwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikKK3sKKyAgIC8qIFRvIGF2b2lkIHRoZSBvdmVyZmxvdyBkbyB0aGUgY29udmVyc2lvbiBkaXJlY3RseSBpbiBmbG9hdGluZworICAgICogcG9pbnQuCisgICAgKi8KKyAgIHJldHVybiAoZmxvYXQpKHBuZ19nZXRfeF9vZmZzZXRfbWljcm9ucyhwbmdfcHRyLCBpbmZvX3B0cikgKiAuMDAwMDM5MzcpOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECitmbG9hdCBQTkdBUEkKK3BuZ19nZXRfeV9vZmZzZXRfaW5jaGVzKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyKQoreworICAgLyogVG8gYXZvaWQgdGhlIG92ZXJmbG93IGRvIHRoZSBjb252ZXJzaW9uIGRpcmVjdGx5IGluIGZsb2F0aW5nCisgICAgKiBwb2ludC4KKyAgICAqLworICAgcmV0dXJuIChmbG9hdCkocG5nX2dldF95X29mZnNldF9taWNyb25zKHBuZ19wdHIsIGluZm9fcHRyKSAqIC4wMDAwMzkzNyk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19wSFlzX1NVUFBPUlRFRAorcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X3BIWXNfZHBpKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyLAorICAgIHBuZ191aW50XzMyICpyZXNfeCwgcG5nX3VpbnRfMzIgKnJlc195LCBpbnQgKnVuaXRfdHlwZSkKK3sKKyAgIHBuZ191aW50XzMyIHJldHZhbCA9IDA7CisKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJgorICAgICAgIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19wSFlzKSAhPSAwKQorICAgeworICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgInBIWXMiKTsKKworICAgICAgaWYgKHJlc194ICE9IE5VTEwpCisgICAgICB7CisgICAgICAgICAqcmVzX3ggPSBpbmZvX3B0ci0+eF9waXhlbHNfcGVyX3VuaXQ7CisgICAgICAgICByZXR2YWwgfD0gUE5HX0lORk9fcEhZczsKKyAgICAgIH0KKworICAgICAgaWYgKHJlc195ICE9IE5VTEwpCisgICAgICB7CisgICAgICAgICAqcmVzX3kgPSBpbmZvX3B0ci0+eV9waXhlbHNfcGVyX3VuaXQ7CisgICAgICAgICByZXR2YWwgfD0gUE5HX0lORk9fcEhZczsKKyAgICAgIH0KKworICAgICAgaWYgKHVuaXRfdHlwZSAhPSBOVUxMKQorICAgICAgeworICAgICAgICAgKnVuaXRfdHlwZSA9IChpbnQpaW5mb19wdHItPnBoeXNfdW5pdF90eXBlOworICAgICAgICAgcmV0dmFsIHw9IFBOR19JTkZPX3BIWXM7CisKKyAgICAgICAgIGlmICgqdW5pdF90eXBlID09IDEpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAocmVzX3ggIT0gTlVMTCkgKnJlc194ID0gKHBuZ191aW50XzMyKSgqcmVzX3ggKiAuMDI1NCArIC41MCk7CisgICAgICAgICAgICBpZiAocmVzX3kgIT0gTlVMTCkgKnJlc195ID0gKHBuZ191aW50XzMyKSgqcmVzX3kgKiAuMDI1NCArIC41MCk7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiAocmV0dmFsKTsKK30KKyNlbmRpZiAvKiBwSFlzICovCisjZW5kaWYgIC8qIElOQ0hfQ09OVkVSU0lPTlMgKi8KKworLyogcG5nX2dldF9jaGFubmVscyByZWFsbHkgYmVsb25ncyBpbiBoZXJlLCB0b28sIGJ1dCBpdCdzIGJlZW4gYXJvdW5kIGxvbmdlciAqLworCisjZW5kaWYgIC8qIEVBU1lfQUNDRVNTICovCisKKworcG5nX2J5dGUgUE5HQVBJCitwbmdfZ2V0X2NoYW5uZWxzKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyKQoreworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQorICAgICAgcmV0dXJuKGluZm9fcHRyLT5jaGFubmVscyk7CisKKyAgIHJldHVybiAoMCk7Cit9CisKKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKK3BuZ19jb25zdF9ieXRlcCBQTkdBUEkKK3BuZ19nZXRfc2lnbmF0dXJlKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyKQoreworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQorICAgICAgcmV0dXJuKGluZm9fcHRyLT5zaWduYXR1cmUpOworCisgICByZXR1cm4gKE5VTEwpOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfYktHRF9TVVBQT1JURUQKK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX2dldF9iS0dEKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLAorICAgcG5nX2NvbG9yXzE2cCAqYmFja2dyb3VuZCkKK3sKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJgorICAgICAgIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19iS0dEKSAhPSAwICYmCisgICAgICAgYmFja2dyb3VuZCAhPSBOVUxMKQorICAgeworICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgImJLR0QiKTsKKworICAgICAgKmJhY2tncm91bmQgPSAmKGluZm9fcHRyLT5iYWNrZ3JvdW5kKTsKKyAgICAgIHJldHVybiAoUE5HX0lORk9fYktHRCk7CisgICB9CisKKyAgIHJldHVybiAoMCk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19jSFJNX1NVUFBPUlRFRAorLyogVGhlIFhZWiBBUElzIHdlcmUgYWRkZWQgaW4gMS41LjUgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGNvZGUgYWRkZWQgYXQgdGhlCisgKiBzYW1lIHRpbWUgdG8gY29ycmVjdCB0aGUgcmdiIGdyYXlzY2FsZSBjb2VmZmljaWVudCBkZWZhdWx0cyBvYnRhaW5lZCBmcm9tIHRoZQorICogY0hSTSBjaHVuayBpbiAxLjUuNAorICovCisjICBpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECitwbmdfdWludF8zMiBQTkdBUEkKK3BuZ19nZXRfY0hSTShwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0ciwKKyAgICBkb3VibGUgKndoaXRlX3gsIGRvdWJsZSAqd2hpdGVfeSwgZG91YmxlICpyZWRfeCwgZG91YmxlICpyZWRfeSwKKyAgICBkb3VibGUgKmdyZWVuX3gsIGRvdWJsZSAqZ3JlZW5feSwgZG91YmxlICpibHVlX3gsIGRvdWJsZSAqYmx1ZV95KQoreworICAgLyogUXVpZXQgQVBJIGNoYW5nZTogdGhpcyBjb2RlIHVzZWQgdG8gb25seSByZXR1cm4gdGhlIGVuZCBwb2ludHMgaWYgYSBjSFJNCisgICAgKiBjaHVuayB3YXMgcHJlc2VudCwgYnV0IHRoZSBlbmQgcG9pbnRzIGNhbiBhbHNvIGNvbWUgZnJvbSBpQ0NQIG9yIHNSR0IKKyAgICAqIGNodW5rcywgc28gaW4gMS42LjAgdGhlIHBuZ19nZXRfIEFQSXMgcmV0dXJuIHRoZSBlbmQgcG9pbnRzIHJlZ2FyZGxlc3MgYW5kCisgICAgKiB0aGUgcG5nX3NldF8gQVBJcyBtZXJlbHkgY2hlY2sgdGhhdCBzZXQgZW5kIHBvaW50cyBhcmUgbXV0dWFsbHkKKyAgICAqIGNvbnNpc3RlbnQuCisgICAgKi8KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJgorICAgICAgKGluZm9fcHRyLT5jb2xvcnNwYWNlLmZsYWdzICYgUE5HX0NPTE9SU1BBQ0VfSEFWRV9FTkRQT0lOVFMpICE9IDApCisgICB7CisgICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAiY0hSTSIpOworCisgICAgICBpZiAod2hpdGVfeCAhPSBOVUxMKQorICAgICAgICAgKndoaXRlX3ggPSBwbmdfZmxvYXQocG5nX3B0ciwKKyAgICAgICAgICAgIGluZm9fcHRyLT5jb2xvcnNwYWNlLmVuZF9wb2ludHNfeHkud2hpdGV4LCAiY0hSTSB3aGl0ZSBYIik7CisgICAgICBpZiAod2hpdGVfeSAhPSBOVUxMKQorICAgICAgICAgKndoaXRlX3kgPSBwbmdfZmxvYXQocG5nX3B0ciwKKyAgICAgICAgICAgIGluZm9fcHRyLT5jb2xvcnNwYWNlLmVuZF9wb2ludHNfeHkud2hpdGV5LCAiY0hSTSB3aGl0ZSBZIik7CisgICAgICBpZiAocmVkX3ggIT0gTlVMTCkKKyAgICAgICAgICpyZWRfeCA9IHBuZ19mbG9hdChwbmdfcHRyLCBpbmZvX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX3h5LnJlZHgsCisgICAgICAgICAgICAiY0hSTSByZWQgWCIpOworICAgICAgaWYgKHJlZF95ICE9IE5VTEwpCisgICAgICAgICAqcmVkX3kgPSBwbmdfZmxvYXQocG5nX3B0ciwgaW5mb19wdHItPmNvbG9yc3BhY2UuZW5kX3BvaW50c194eS5yZWR5LAorICAgICAgICAgICAgImNIUk0gcmVkIFkiKTsKKyAgICAgIGlmIChncmVlbl94ICE9IE5VTEwpCisgICAgICAgICAqZ3JlZW5feCA9IHBuZ19mbG9hdChwbmdfcHRyLAorICAgICAgICAgICAgaW5mb19wdHItPmNvbG9yc3BhY2UuZW5kX3BvaW50c194eS5ncmVlbngsICJjSFJNIGdyZWVuIFgiKTsKKyAgICAgIGlmIChncmVlbl95ICE9IE5VTEwpCisgICAgICAgICAqZ3JlZW5feSA9IHBuZ19mbG9hdChwbmdfcHRyLAorICAgICAgICAgICAgaW5mb19wdHItPmNvbG9yc3BhY2UuZW5kX3BvaW50c194eS5ncmVlbnksICJjSFJNIGdyZWVuIFkiKTsKKyAgICAgIGlmIChibHVlX3ggIT0gTlVMTCkKKyAgICAgICAgICpibHVlX3ggPSBwbmdfZmxvYXQocG5nX3B0ciwgaW5mb19wdHItPmNvbG9yc3BhY2UuZW5kX3BvaW50c194eS5ibHVleCwKKyAgICAgICAgICAgICJjSFJNIGJsdWUgWCIpOworICAgICAgaWYgKGJsdWVfeSAhPSBOVUxMKQorICAgICAgICAgKmJsdWVfeSA9IHBuZ19mbG9hdChwbmdfcHRyLCBpbmZvX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX3h5LmJsdWV5LAorICAgICAgICAgICAgImNIUk0gYmx1ZSBZIik7CisgICAgICByZXR1cm4gKFBOR19JTkZPX2NIUk0pOworICAgfQorCisgICByZXR1cm4gKDApOworfQorCitwbmdfdWludF8zMiBQTkdBUEkKK3BuZ19nZXRfY0hSTV9YWVoocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIsCisgICBkb3VibGUgKnJlZF9YLCBkb3VibGUgKnJlZF9ZLCBkb3VibGUgKnJlZF9aLCBkb3VibGUgKmdyZWVuX1gsCisgICBkb3VibGUgKmdyZWVuX1ksIGRvdWJsZSAqZ3JlZW5fWiwgZG91YmxlICpibHVlX1gsIGRvdWJsZSAqYmx1ZV9ZLAorICAgZG91YmxlICpibHVlX1opCit7CisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYKKyAgICAgIChpbmZvX3B0ci0+Y29sb3JzcGFjZS5mbGFncyAmIFBOR19DT0xPUlNQQUNFX0hBVkVfRU5EUE9JTlRTKSAhPSAwKQorICAgeworICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgImNIUk1fWFlaKGZsb2F0KSIpOworCisgICAgICBpZiAocmVkX1ggIT0gTlVMTCkKKyAgICAgICAgICpyZWRfWCA9IHBuZ19mbG9hdChwbmdfcHRyLCBpbmZvX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX1hZWi5yZWRfWCwKKyAgICAgICAgICAgICJjSFJNIHJlZCBYIik7CisgICAgICBpZiAocmVkX1kgIT0gTlVMTCkKKyAgICAgICAgICpyZWRfWSA9IHBuZ19mbG9hdChwbmdfcHRyLCBpbmZvX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX1hZWi5yZWRfWSwKKyAgICAgICAgICAgICJjSFJNIHJlZCBZIik7CisgICAgICBpZiAocmVkX1ogIT0gTlVMTCkKKyAgICAgICAgICpyZWRfWiA9IHBuZ19mbG9hdChwbmdfcHRyLCBpbmZvX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX1hZWi5yZWRfWiwKKyAgICAgICAgICAgICJjSFJNIHJlZCBaIik7CisgICAgICBpZiAoZ3JlZW5fWCAhPSBOVUxMKQorICAgICAgICAgKmdyZWVuX1ggPSBwbmdfZmxvYXQocG5nX3B0ciwKKyAgICAgICAgICAgIGluZm9fcHRyLT5jb2xvcnNwYWNlLmVuZF9wb2ludHNfWFlaLmdyZWVuX1gsICJjSFJNIGdyZWVuIFgiKTsKKyAgICAgIGlmIChncmVlbl9ZICE9IE5VTEwpCisgICAgICAgICAqZ3JlZW5fWSA9IHBuZ19mbG9hdChwbmdfcHRyLAorICAgICAgICAgICAgaW5mb19wdHItPmNvbG9yc3BhY2UuZW5kX3BvaW50c19YWVouZ3JlZW5fWSwgImNIUk0gZ3JlZW4gWSIpOworICAgICAgaWYgKGdyZWVuX1ogIT0gTlVMTCkKKyAgICAgICAgICpncmVlbl9aID0gcG5nX2Zsb2F0KHBuZ19wdHIsCisgICAgICAgICAgICBpbmZvX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX1hZWi5ncmVlbl9aLCAiY0hSTSBncmVlbiBaIik7CisgICAgICBpZiAoYmx1ZV9YICE9IE5VTEwpCisgICAgICAgICAqYmx1ZV9YID0gcG5nX2Zsb2F0KHBuZ19wdHIsCisgICAgICAgICAgICBpbmZvX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX1hZWi5ibHVlX1gsICJjSFJNIGJsdWUgWCIpOworICAgICAgaWYgKGJsdWVfWSAhPSBOVUxMKQorICAgICAgICAgKmJsdWVfWSA9IHBuZ19mbG9hdChwbmdfcHRyLAorICAgICAgICAgICAgaW5mb19wdHItPmNvbG9yc3BhY2UuZW5kX3BvaW50c19YWVouYmx1ZV9ZLCAiY0hSTSBibHVlIFkiKTsKKyAgICAgIGlmIChibHVlX1ogIT0gTlVMTCkKKyAgICAgICAgICpibHVlX1ogPSBwbmdfZmxvYXQocG5nX3B0ciwKKyAgICAgICAgICAgIGluZm9fcHRyLT5jb2xvcnNwYWNlLmVuZF9wb2ludHNfWFlaLmJsdWVfWiwgImNIUk0gYmx1ZSBaIik7CisgICAgICByZXR1cm4gKFBOR19JTkZPX2NIUk0pOworICAgfQorCisgICByZXR1cm4gKDApOworfQorIyAgZW5kaWYKKworIyAgaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAorcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X2NIUk1fWFlaX2ZpeGVkKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyLAorICAgIHBuZ19maXhlZF9wb2ludCAqaW50X3JlZF9YLCBwbmdfZml4ZWRfcG9pbnQgKmludF9yZWRfWSwKKyAgICBwbmdfZml4ZWRfcG9pbnQgKmludF9yZWRfWiwgcG5nX2ZpeGVkX3BvaW50ICppbnRfZ3JlZW5fWCwKKyAgICBwbmdfZml4ZWRfcG9pbnQgKmludF9ncmVlbl9ZLCBwbmdfZml4ZWRfcG9pbnQgKmludF9ncmVlbl9aLAorICAgIHBuZ19maXhlZF9wb2ludCAqaW50X2JsdWVfWCwgcG5nX2ZpeGVkX3BvaW50ICppbnRfYmx1ZV9ZLAorICAgIHBuZ19maXhlZF9wb2ludCAqaW50X2JsdWVfWikKK3sKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJgorICAgICAgKGluZm9fcHRyLT5jb2xvcnNwYWNlLmZsYWdzICYgUE5HX0NPTE9SU1BBQ0VfSEFWRV9FTkRQT0lOVFMpICE9IDApCisgICB7CisgICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAiY0hSTV9YWVoiKTsKKworICAgICAgaWYgKGludF9yZWRfWCAhPSBOVUxMKQorICAgICAgICAgKmludF9yZWRfWCA9IGluZm9fcHRyLT5jb2xvcnNwYWNlLmVuZF9wb2ludHNfWFlaLnJlZF9YOworICAgICAgaWYgKGludF9yZWRfWSAhPSBOVUxMKQorICAgICAgICAgKmludF9yZWRfWSA9IGluZm9fcHRyLT5jb2xvcnNwYWNlLmVuZF9wb2ludHNfWFlaLnJlZF9ZOworICAgICAgaWYgKGludF9yZWRfWiAhPSBOVUxMKQorICAgICAgICAgKmludF9yZWRfWiA9IGluZm9fcHRyLT5jb2xvcnNwYWNlLmVuZF9wb2ludHNfWFlaLnJlZF9aOworICAgICAgaWYgKGludF9ncmVlbl9YICE9IE5VTEwpCisgICAgICAgICAqaW50X2dyZWVuX1ggPSBpbmZvX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX1hZWi5ncmVlbl9YOworICAgICAgaWYgKGludF9ncmVlbl9ZICE9IE5VTEwpCisgICAgICAgICAqaW50X2dyZWVuX1kgPSBpbmZvX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX1hZWi5ncmVlbl9ZOworICAgICAgaWYgKGludF9ncmVlbl9aICE9IE5VTEwpCisgICAgICAgICAqaW50X2dyZWVuX1ogPSBpbmZvX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX1hZWi5ncmVlbl9aOworICAgICAgaWYgKGludF9ibHVlX1ggIT0gTlVMTCkKKyAgICAgICAgICppbnRfYmx1ZV9YID0gaW5mb19wdHItPmNvbG9yc3BhY2UuZW5kX3BvaW50c19YWVouYmx1ZV9YOworICAgICAgaWYgKGludF9ibHVlX1kgIT0gTlVMTCkKKyAgICAgICAgICppbnRfYmx1ZV9ZID0gaW5mb19wdHItPmNvbG9yc3BhY2UuZW5kX3BvaW50c19YWVouYmx1ZV9ZOworICAgICAgaWYgKGludF9ibHVlX1ogIT0gTlVMTCkKKyAgICAgICAgICppbnRfYmx1ZV9aID0gaW5mb19wdHItPmNvbG9yc3BhY2UuZW5kX3BvaW50c19YWVouYmx1ZV9aOworICAgICAgcmV0dXJuIChQTkdfSU5GT19jSFJNKTsKKyAgIH0KKworICAgcmV0dXJuICgwKTsKK30KKworcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X2NIUk1fZml4ZWQocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIsCisgICAgcG5nX2ZpeGVkX3BvaW50ICp3aGl0ZV94LCBwbmdfZml4ZWRfcG9pbnQgKndoaXRlX3ksIHBuZ19maXhlZF9wb2ludCAqcmVkX3gsCisgICAgcG5nX2ZpeGVkX3BvaW50ICpyZWRfeSwgcG5nX2ZpeGVkX3BvaW50ICpncmVlbl94LCBwbmdfZml4ZWRfcG9pbnQgKmdyZWVuX3ksCisgICAgcG5nX2ZpeGVkX3BvaW50ICpibHVlX3gsIHBuZ19maXhlZF9wb2ludCAqYmx1ZV95KQoreworICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgImNIUk0iKTsKKworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmCisgICAgICAoaW5mb19wdHItPmNvbG9yc3BhY2UuZmxhZ3MgJiBQTkdfQ09MT1JTUEFDRV9IQVZFX0VORFBPSU5UUykgIT0gMCkKKyAgIHsKKyAgICAgIGlmICh3aGl0ZV94ICE9IE5VTEwpCisgICAgICAgICAqd2hpdGVfeCA9IGluZm9fcHRyLT5jb2xvcnNwYWNlLmVuZF9wb2ludHNfeHkud2hpdGV4OworICAgICAgaWYgKHdoaXRlX3kgIT0gTlVMTCkKKyAgICAgICAgICp3aGl0ZV95ID0gaW5mb19wdHItPmNvbG9yc3BhY2UuZW5kX3BvaW50c194eS53aGl0ZXk7CisgICAgICBpZiAocmVkX3ggIT0gTlVMTCkKKyAgICAgICAgICpyZWRfeCA9IGluZm9fcHRyLT5jb2xvcnNwYWNlLmVuZF9wb2ludHNfeHkucmVkeDsKKyAgICAgIGlmIChyZWRfeSAhPSBOVUxMKQorICAgICAgICAgKnJlZF95ID0gaW5mb19wdHItPmNvbG9yc3BhY2UuZW5kX3BvaW50c194eS5yZWR5OworICAgICAgaWYgKGdyZWVuX3ggIT0gTlVMTCkKKyAgICAgICAgICpncmVlbl94ID0gaW5mb19wdHItPmNvbG9yc3BhY2UuZW5kX3BvaW50c194eS5ncmVlbng7CisgICAgICBpZiAoZ3JlZW5feSAhPSBOVUxMKQorICAgICAgICAgKmdyZWVuX3kgPSBpbmZvX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX3h5LmdyZWVueTsKKyAgICAgIGlmIChibHVlX3ggIT0gTlVMTCkKKyAgICAgICAgICpibHVlX3ggPSBpbmZvX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX3h5LmJsdWV4OworICAgICAgaWYgKGJsdWVfeSAhPSBOVUxMKQorICAgICAgICAgKmJsdWVfeSA9IGluZm9fcHRyLT5jb2xvcnNwYWNlLmVuZF9wb2ludHNfeHkuYmx1ZXk7CisgICAgICByZXR1cm4gKFBOR19JTkZPX2NIUk0pOworICAgfQorCisgICByZXR1cm4gKDApOworfQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgUE5HX2dBTUFfU1VQUE9SVEVECisjICBpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECitwbmdfdWludF8zMiBQTkdBUEkKK3BuZ19nZXRfZ0FNQV9maXhlZChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0ciwKKyAgICBwbmdfZml4ZWRfcG9pbnQgKmZpbGVfZ2FtbWEpCit7CisgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAiZ0FNQSIpOworCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYKKyAgICAgIChpbmZvX3B0ci0+Y29sb3JzcGFjZS5mbGFncyAmIFBOR19DT0xPUlNQQUNFX0hBVkVfR0FNTUEpICE9IDAgJiYKKyAgICAgIGZpbGVfZ2FtbWEgIT0gTlVMTCkKKyAgIHsKKyAgICAgICpmaWxlX2dhbW1hID0gaW5mb19wdHItPmNvbG9yc3BhY2UuZ2FtbWE7CisgICAgICByZXR1cm4gKFBOR19JTkZPX2dBTUEpOworICAgfQorCisgICByZXR1cm4gKDApOworfQorIyAgZW5kaWYKKworIyAgaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X2dBTUEocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIsCisgICAgZG91YmxlICpmaWxlX2dhbW1hKQoreworICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgImdBTUEoZmxvYXQpIik7CisKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJgorICAgICAgKGluZm9fcHRyLT5jb2xvcnNwYWNlLmZsYWdzICYgUE5HX0NPTE9SU1BBQ0VfSEFWRV9HQU1NQSkgIT0gMCAmJgorICAgICAgZmlsZV9nYW1tYSAhPSBOVUxMKQorICAgeworICAgICAgKmZpbGVfZ2FtbWEgPSBwbmdfZmxvYXQocG5nX3B0ciwgaW5mb19wdHItPmNvbG9yc3BhY2UuZ2FtbWEsCisgICAgICAgICAicG5nX2dldF9nQU1BIik7CisgICAgICByZXR1cm4gKFBOR19JTkZPX2dBTUEpOworICAgfQorCisgICByZXR1cm4gKDApOworfQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgUE5HX3NSR0JfU1VQUE9SVEVECitwbmdfdWludF8zMiBQTkdBUEkKK3BuZ19nZXRfc1JHQihwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0ciwKKyAgICBpbnQgKmZpbGVfc3JnYl9pbnRlbnQpCit7CisgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAic1JHQiIpOworCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYKKyAgICAgIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19zUkdCKSAhPSAwICYmIGZpbGVfc3JnYl9pbnRlbnQgIT0gTlVMTCkKKyAgIHsKKyAgICAgICpmaWxlX3NyZ2JfaW50ZW50ID0gaW5mb19wdHItPmNvbG9yc3BhY2UucmVuZGVyaW5nX2ludGVudDsKKyAgICAgIHJldHVybiAoUE5HX0lORk9fc1JHQik7CisgICB9CisKKyAgIHJldHVybiAoMCk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19pQ0NQX1NVUFBPUlRFRAorcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X2lDQ1AocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsCisgICAgcG5nX2NoYXJwcCBuYW1lLCBpbnQgKmNvbXByZXNzaW9uX3R5cGUsCisgICAgcG5nX2J5dGVwcCBwcm9maWxlLCBwbmdfdWludF8zMiAqcHJvZmxlbikKK3sKKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJpQ0NQIik7CisKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJgorICAgICAgIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19pQ0NQKSAhPSAwICYmCisgICAgICAgbmFtZSAhPSBOVUxMICYmIGNvbXByZXNzaW9uX3R5cGUgIT0gTlVMTCAmJiBwcm9maWxlICE9IE5VTEwgJiYKKyAgICAgICAgICAgcHJvZmxlbiAhPSBOVUxMKQorICAgeworICAgICAgKm5hbWUgPSBpbmZvX3B0ci0+aWNjcF9uYW1lOworICAgICAgKnByb2ZpbGUgPSBpbmZvX3B0ci0+aWNjcF9wcm9maWxlOworICAgICAgKnByb2ZsZW4gPSBwbmdfZ2V0X3VpbnRfMzIoaW5mb19wdHItPmljY3BfcHJvZmlsZSk7CisgICAgICAvKiBUaGlzIGlzIHNvbWV3aGF0IGlycmVsZXZhbnQgc2luY2UgdGhlIHByb2ZpbGUgZGF0YSByZXR1cm5lZCBoYXMKKyAgICAgICAqIGFjdHVhbGx5IGJlZW4gdW5jb21wcmVzc2VkLgorICAgICAgICovCisgICAgICAqY29tcHJlc3Npb25fdHlwZSA9IFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0U7CisgICAgICByZXR1cm4gKFBOR19JTkZPX2lDQ1ApOworICAgfQorCisgICByZXR1cm4gKDApOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfc1BMVF9TVVBQT1JURUQKK2ludCBQTkdBUEkKK3BuZ19nZXRfc1BMVChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwKKyAgICBwbmdfc1BMVF90cHAgc3BhbGV0dGVzKQoreworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmIHNwYWxldHRlcyAhPSBOVUxMKQorICAgeworICAgICAgKnNwYWxldHRlcyA9IGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzOworICAgICAgcmV0dXJuIGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzX251bTsKKyAgIH0KKworICAgcmV0dXJuICgwKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX2hJU1RfU1VQUE9SVEVECitwbmdfdWludF8zMiBQTkdBUEkKK3BuZ19nZXRfaElTVChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwKKyAgICBwbmdfdWludF8xNnAgKmhpc3QpCit7CisgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAiaElTVCIpOworCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYKKyAgICAgICAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9faElTVCkgIT0gMCAmJiBoaXN0ICE9IE5VTEwpCisgICB7CisgICAgICAqaGlzdCA9IGluZm9fcHRyLT5oaXN0OworICAgICAgcmV0dXJuIChQTkdfSU5GT19oSVNUKTsKKyAgIH0KKworICAgcmV0dXJuICgwKTsKK30KKyNlbmRpZgorCitwbmdfdWludF8zMiBQTkdBUEkKK3BuZ19nZXRfSUhEUihwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0ciwKKyAgICBwbmdfdWludF8zMiAqd2lkdGgsIHBuZ191aW50XzMyICpoZWlnaHQsIGludCAqYml0X2RlcHRoLAorICAgIGludCAqY29sb3JfdHlwZSwgaW50ICppbnRlcmxhY2VfdHlwZSwgaW50ICpjb21wcmVzc2lvbl90eXBlLAorICAgIGludCAqZmlsdGVyX3R5cGUpCit7CisgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAiSUhEUiIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCisgICAgICByZXR1cm4gKDApOworCisgICBpZiAod2lkdGggIT0gTlVMTCkKKyAgICAgICAqd2lkdGggPSBpbmZvX3B0ci0+d2lkdGg7CisKKyAgIGlmIChoZWlnaHQgIT0gTlVMTCkKKyAgICAgICAqaGVpZ2h0ID0gaW5mb19wdHItPmhlaWdodDsKKworICAgaWYgKGJpdF9kZXB0aCAhPSBOVUxMKQorICAgICAgICpiaXRfZGVwdGggPSBpbmZvX3B0ci0+Yml0X2RlcHRoOworCisgICBpZiAoY29sb3JfdHlwZSAhPSBOVUxMKQorICAgICAgICpjb2xvcl90eXBlID0gaW5mb19wdHItPmNvbG9yX3R5cGU7CisKKyAgIGlmIChjb21wcmVzc2lvbl90eXBlICE9IE5VTEwpCisgICAgICAqY29tcHJlc3Npb25fdHlwZSA9IGluZm9fcHRyLT5jb21wcmVzc2lvbl90eXBlOworCisgICBpZiAoZmlsdGVyX3R5cGUgIT0gTlVMTCkKKyAgICAgICpmaWx0ZXJfdHlwZSA9IGluZm9fcHRyLT5maWx0ZXJfdHlwZTsKKworICAgaWYgKGludGVybGFjZV90eXBlICE9IE5VTEwpCisgICAgICAqaW50ZXJsYWNlX3R5cGUgPSBpbmZvX3B0ci0+aW50ZXJsYWNlX3R5cGU7CisKKyAgIC8qIFRoaXMgaXMgcmVkdW5kYW50IGlmIHdlIGNhbiBiZSBzdXJlIHRoYXQgdGhlIGluZm9fcHRyIHZhbHVlcyB3ZXJlIGFsbAorICAgICogYXNzaWduZWQgaW4gcG5nX3NldF9JSERSKCkuICBXZSBkbyB0aGUgY2hlY2sgYW55aG93IGluIGNhc2UgYW4KKyAgICAqIGFwcGxpY2F0aW9uIGhhcyBpZ25vcmVkIG91ciBhZHZpY2Ugbm90IHRvIG1lc3Mgd2l0aCB0aGUgbWVtYmVycworICAgICogb2YgaW5mb19wdHIgZGlyZWN0bHkuCisgICAgKi8KKyAgIHBuZ19jaGVja19JSERSKHBuZ19wdHIsIGluZm9fcHRyLT53aWR0aCwgaW5mb19wdHItPmhlaWdodCwKKyAgICAgICBpbmZvX3B0ci0+Yml0X2RlcHRoLCBpbmZvX3B0ci0+Y29sb3JfdHlwZSwgaW5mb19wdHItPmludGVybGFjZV90eXBlLAorICAgICAgIGluZm9fcHRyLT5jb21wcmVzc2lvbl90eXBlLCBpbmZvX3B0ci0+ZmlsdGVyX3R5cGUpOworCisgICByZXR1cm4gKDEpOworfQorCisjaWZkZWYgUE5HX29GRnNfU1VQUE9SVEVECitwbmdfdWludF8zMiBQTkdBUEkKK3BuZ19nZXRfb0ZGcyhwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0ciwKKyAgICBwbmdfaW50XzMyICpvZmZzZXRfeCwgcG5nX2ludF8zMiAqb2Zmc2V0X3ksIGludCAqdW5pdF90eXBlKQoreworICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgIm9GRnMiKTsKKworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmCisgICAgICAgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX29GRnMpICE9IDAgJiYKKyAgICAgICBvZmZzZXRfeCAhPSBOVUxMICYmIG9mZnNldF95ICE9IE5VTEwgJiYgdW5pdF90eXBlICE9IE5VTEwpCisgICB7CisgICAgICAqb2Zmc2V0X3ggPSBpbmZvX3B0ci0+eF9vZmZzZXQ7CisgICAgICAqb2Zmc2V0X3kgPSBpbmZvX3B0ci0+eV9vZmZzZXQ7CisgICAgICAqdW5pdF90eXBlID0gKGludClpbmZvX3B0ci0+b2Zmc2V0X3VuaXRfdHlwZTsKKyAgICAgIHJldHVybiAoUE5HX0lORk9fb0ZGcyk7CisgICB9CisKKyAgIHJldHVybiAoMCk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19wQ0FMX1NVUFBPUlRFRAorcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X3BDQUwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsCisgICAgcG5nX2NoYXJwICpwdXJwb3NlLCBwbmdfaW50XzMyICpYMCwgcG5nX2ludF8zMiAqWDEsIGludCAqdHlwZSwgaW50ICpucGFyYW1zLAorICAgIHBuZ19jaGFycCAqdW5pdHMsIHBuZ19jaGFycHAgKnBhcmFtcykKK3sKKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJwQ0FMIik7CisKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJgorICAgICAgIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19wQ0FMKSAhPSAwICYmCisgICAgICAgcHVycG9zZSAhPSBOVUxMICYmIFgwICE9IE5VTEwgJiYgWDEgIT0gTlVMTCAmJiB0eXBlICE9IE5VTEwgJiYKKyAgICAgICBucGFyYW1zICE9IE5VTEwgJiYgdW5pdHMgIT0gTlVMTCAmJiBwYXJhbXMgIT0gTlVMTCkKKyAgIHsKKyAgICAgICpwdXJwb3NlID0gaW5mb19wdHItPnBjYWxfcHVycG9zZTsKKyAgICAgICpYMCA9IGluZm9fcHRyLT5wY2FsX1gwOworICAgICAgKlgxID0gaW5mb19wdHItPnBjYWxfWDE7CisgICAgICAqdHlwZSA9IChpbnQpaW5mb19wdHItPnBjYWxfdHlwZTsKKyAgICAgICpucGFyYW1zID0gKGludClpbmZvX3B0ci0+cGNhbF9ucGFyYW1zOworICAgICAgKnVuaXRzID0gaW5mb19wdHItPnBjYWxfdW5pdHM7CisgICAgICAqcGFyYW1zID0gaW5mb19wdHItPnBjYWxfcGFyYW1zOworICAgICAgcmV0dXJuIChQTkdfSU5GT19wQ0FMKTsKKyAgIH0KKworICAgcmV0dXJuICgwKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX3NDQUxfU1VQUE9SVEVECisjICBpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECisjICAgIGlmIGRlZmluZWQoUE5HX0ZMT0FUSU5HX0FSSVRITUVUSUNfU1VQUE9SVEVEKSB8fCBcCisgICAgICAgICBkZWZpbmVkKFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQpCitwbmdfdWludF8zMiBQTkdBUEkKK3BuZ19nZXRfc0NBTF9maXhlZChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0ciwKKyAgICBpbnQgKnVuaXQsIHBuZ19maXhlZF9wb2ludCAqd2lkdGgsIHBuZ19maXhlZF9wb2ludCAqaGVpZ2h0KQoreworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmCisgICAgICAgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3NDQUwpICE9IDApCisgICB7CisgICAgICAqdW5pdCA9IGluZm9fcHRyLT5zY2FsX3VuaXQ7CisgICAgICAvKlRPRE86IG1ha2UgdGhpcyB3b3JrIHdpdGhvdXQgRlAgc3VwcG9ydDsgdGhlIEFQSSBpcyBjdXJyZW50bHkgZWxpbWluYXRlZAorICAgICAgICogaWYgbmVpdGhlciBmbG9hdGluZyBwb2ludCBBUElzIG5vciBpbnRlcm5hbCBmbG9hdGluZyBwb2ludCBhcml0aG1ldGljCisgICAgICAgKiBhcmUgZW5hYmxlZC4KKyAgICAgICAqLworICAgICAgKndpZHRoID0gcG5nX2ZpeGVkKHBuZ19wdHIsIGF0b2YoaW5mb19wdHItPnNjYWxfc193aWR0aCksICJzQ0FMIHdpZHRoIik7CisgICAgICAqaGVpZ2h0ID0gcG5nX2ZpeGVkKHBuZ19wdHIsIGF0b2YoaW5mb19wdHItPnNjYWxfc19oZWlnaHQpLAorICAgICAgICAgInNDQUwgaGVpZ2h0Iik7CisgICAgICByZXR1cm4gKFBOR19JTkZPX3NDQUwpOworICAgfQorCisgICByZXR1cm4oMCk7Cit9CisjICAgIGVuZGlmIC8qIEZMT0FUSU5HX0FSSVRITUVUSUMgKi8KKyMgIGVuZGlmIC8qIEZJWEVEX1BPSU5UICovCisjICBpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECitwbmdfdWludF8zMiBQTkdBUEkKK3BuZ19nZXRfc0NBTChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0ciwKKyAgICBpbnQgKnVuaXQsIGRvdWJsZSAqd2lkdGgsIGRvdWJsZSAqaGVpZ2h0KQoreworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmCisgICAgICAgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3NDQUwpICE9IDApCisgICB7CisgICAgICAqdW5pdCA9IGluZm9fcHRyLT5zY2FsX3VuaXQ7CisgICAgICAqd2lkdGggPSBhdG9mKGluZm9fcHRyLT5zY2FsX3Nfd2lkdGgpOworICAgICAgKmhlaWdodCA9IGF0b2YoaW5mb19wdHItPnNjYWxfc19oZWlnaHQpOworICAgICAgcmV0dXJuIChQTkdfSU5GT19zQ0FMKTsKKyAgIH0KKworICAgcmV0dXJuKDApOworfQorIyAgZW5kaWYgLyogRkxPQVRJTkcgUE9JTlQgKi8KK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX2dldF9zQ0FMX3MocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIsCisgICAgaW50ICp1bml0LCBwbmdfY2hhcnBwIHdpZHRoLCBwbmdfY2hhcnBwIGhlaWdodCkKK3sKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJgorICAgICAgIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19zQ0FMKSAhPSAwKQorICAgeworICAgICAgKnVuaXQgPSBpbmZvX3B0ci0+c2NhbF91bml0OworICAgICAgKndpZHRoID0gaW5mb19wdHItPnNjYWxfc193aWR0aDsKKyAgICAgICpoZWlnaHQgPSBpbmZvX3B0ci0+c2NhbF9zX2hlaWdodDsKKyAgICAgIHJldHVybiAoUE5HX0lORk9fc0NBTCk7CisgICB9CisKKyAgIHJldHVybigwKTsKK30KKyNlbmRpZiAvKiBzQ0FMICovCisKKyNpZmRlZiBQTkdfcEhZc19TVVBQT1JURUQKK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX2dldF9wSFlzKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyLAorICAgIHBuZ191aW50XzMyICpyZXNfeCwgcG5nX3VpbnRfMzIgKnJlc195LCBpbnQgKnVuaXRfdHlwZSkKK3sKKyAgIHBuZ191aW50XzMyIHJldHZhbCA9IDA7CisKKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJwSFlzIik7CisKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJgorICAgICAgIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19wSFlzKSAhPSAwKQorICAgeworICAgICAgaWYgKHJlc194ICE9IE5VTEwpCisgICAgICB7CisgICAgICAgICAqcmVzX3ggPSBpbmZvX3B0ci0+eF9waXhlbHNfcGVyX3VuaXQ7CisgICAgICAgICByZXR2YWwgfD0gUE5HX0lORk9fcEhZczsKKyAgICAgIH0KKworICAgICAgaWYgKHJlc195ICE9IE5VTEwpCisgICAgICB7CisgICAgICAgICAqcmVzX3kgPSBpbmZvX3B0ci0+eV9waXhlbHNfcGVyX3VuaXQ7CisgICAgICAgICByZXR2YWwgfD0gUE5HX0lORk9fcEhZczsKKyAgICAgIH0KKworICAgICAgaWYgKHVuaXRfdHlwZSAhPSBOVUxMKQorICAgICAgeworICAgICAgICAgKnVuaXRfdHlwZSA9IChpbnQpaW5mb19wdHItPnBoeXNfdW5pdF90eXBlOworICAgICAgICAgcmV0dmFsIHw9IFBOR19JTkZPX3BIWXM7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiAocmV0dmFsKTsKK30KKyNlbmRpZiAvKiBwSFlzICovCisKK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX2dldF9QTFRFKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLAorICAgIHBuZ19jb2xvcnAgKnBhbGV0dGUsIGludCAqbnVtX3BhbGV0dGUpCit7CisgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAiUExURSIpOworCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYKKyAgICAgICAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fUExURSkgIT0gMCAmJiBwYWxldHRlICE9IE5VTEwpCisgICB7CisgICAgICAqcGFsZXR0ZSA9IGluZm9fcHRyLT5wYWxldHRlOworICAgICAgKm51bV9wYWxldHRlID0gaW5mb19wdHItPm51bV9wYWxldHRlOworICAgICAgcG5nX2RlYnVnMSgzLCAibnVtX3BhbGV0dGUgPSAlZCIsICpudW1fcGFsZXR0ZSk7CisgICAgICByZXR1cm4gKFBOR19JTkZPX1BMVEUpOworICAgfQorCisgICByZXR1cm4gKDApOworfQorCisjaWZkZWYgUE5HX3NCSVRfU1VQUE9SVEVECitwbmdfdWludF8zMiBQTkdBUEkKK3BuZ19nZXRfc0JJVChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwKKyAgICBwbmdfY29sb3JfOHAgKnNpZ19iaXQpCit7CisgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAic0JJVCIpOworCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYKKyAgICAgICAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc0JJVCkgIT0gMCAmJiBzaWdfYml0ICE9IE5VTEwpCisgICB7CisgICAgICAqc2lnX2JpdCA9ICYoaW5mb19wdHItPnNpZ19iaXQpOworICAgICAgcmV0dXJuIChQTkdfSU5GT19zQklUKTsKKyAgIH0KKworICAgcmV0dXJuICgwKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1RFWFRfU1VQUE9SVEVECitpbnQgUE5HQVBJCitwbmdfZ2V0X3RleHQocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsCisgICAgcG5nX3RleHRwICp0ZXh0X3B0ciwgaW50ICpudW1fdGV4dCkKK3sKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ci0+bnVtX3RleHQgPiAwKQorICAgeworICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gMHglbHggcmV0cmlldmFsIGZ1bmN0aW9uIiwKKyAgICAgICAgICh1bnNpZ25lZCBsb25nKXBuZ19wdHItPmNodW5rX25hbWUpOworCisgICAgICBpZiAodGV4dF9wdHIgIT0gTlVMTCkKKyAgICAgICAgICp0ZXh0X3B0ciA9IGluZm9fcHRyLT50ZXh0OworCisgICAgICBpZiAobnVtX3RleHQgIT0gTlVMTCkKKyAgICAgICAgICpudW1fdGV4dCA9IGluZm9fcHRyLT5udW1fdGV4dDsKKworICAgICAgcmV0dXJuIGluZm9fcHRyLT5udW1fdGV4dDsKKyAgIH0KKworICAgaWYgKG51bV90ZXh0ICE9IE5VTEwpCisgICAgICAqbnVtX3RleHQgPSAwOworCisgICByZXR1cm4oMCk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR190SU1FX1NVUFBPUlRFRAorcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X3RJTUUocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsCisgICAgcG5nX3RpbWVwICptb2RfdGltZSkKK3sKKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJ0SU1FIik7CisKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJgorICAgICAgIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT190SU1FKSAhPSAwICYmIG1vZF90aW1lICE9IE5VTEwpCisgICB7CisgICAgICAqbW9kX3RpbWUgPSAmKGluZm9fcHRyLT5tb2RfdGltZSk7CisgICAgICByZXR1cm4gKFBOR19JTkZPX3RJTUUpOworICAgfQorCisgICByZXR1cm4gKDApOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfdFJOU19TVVBQT1JURUQKK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX2dldF90Uk5TKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLAorICAgIHBuZ19ieXRlcCAqdHJhbnNfYWxwaGEsIGludCAqbnVtX3RyYW5zLCBwbmdfY29sb3JfMTZwICp0cmFuc19jb2xvcikKK3sKKyAgIHBuZ191aW50XzMyIHJldHZhbCA9IDA7CisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYKKyAgICAgICAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fdFJOUykgIT0gMCkKKyAgIHsKKyAgICAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJ0Uk5TIik7CisKKyAgICAgIGlmIChpbmZvX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQorICAgICAgeworICAgICAgICAgaWYgKHRyYW5zX2FscGhhICE9IE5VTEwpCisgICAgICAgICB7CisgICAgICAgICAgICAqdHJhbnNfYWxwaGEgPSBpbmZvX3B0ci0+dHJhbnNfYWxwaGE7CisgICAgICAgICAgICByZXR2YWwgfD0gUE5HX0lORk9fdFJOUzsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYgKHRyYW5zX2NvbG9yICE9IE5VTEwpCisgICAgICAgICAgICAqdHJhbnNfY29sb3IgPSAmKGluZm9fcHRyLT50cmFuc19jb2xvcik7CisgICAgICB9CisKKyAgICAgIGVsc2UgLyogaWYgKGluZm9fcHRyLT5jb2xvcl90eXBlICE9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpICovCisgICAgICB7CisgICAgICAgICBpZiAodHJhbnNfY29sb3IgIT0gTlVMTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgICp0cmFuc19jb2xvciA9ICYoaW5mb19wdHItPnRyYW5zX2NvbG9yKTsKKyAgICAgICAgICAgIHJldHZhbCB8PSBQTkdfSU5GT190Uk5TOworICAgICAgICAgfQorCisgICAgICAgICBpZiAodHJhbnNfYWxwaGEgIT0gTlVMTCkKKyAgICAgICAgICAgICp0cmFuc19hbHBoYSA9IE5VTEw7CisgICAgICB9CisKKyAgICAgIGlmIChudW1fdHJhbnMgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgICpudW1fdHJhbnMgPSBpbmZvX3B0ci0+bnVtX3RyYW5zOworICAgICAgICAgcmV0dmFsIHw9IFBOR19JTkZPX3RSTlM7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiAocmV0dmFsKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1NUT1JFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAoraW50IFBOR0FQSQorcG5nX2dldF91bmtub3duX2NodW5rcyhwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwKKyAgICBwbmdfdW5rbm93bl9jaHVua3BwIHVua25vd25zKQoreworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmIHVua25vd25zICE9IE5VTEwpCisgICB7CisgICAgICAqdW5rbm93bnMgPSBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3M7CisgICAgICByZXR1cm4gaW5mb19wdHItPnVua25vd25fY2h1bmtzX251bTsKKyAgIH0KKworICAgcmV0dXJuICgwKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVECitwbmdfYnl0ZSBQTkdBUEkKK3BuZ19nZXRfcmdiX3RvX2dyYXlfc3RhdHVzIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikKK3sKKyAgIHJldHVybiAocG5nX2J5dGUpKHBuZ19wdHIgPyBwbmdfcHRyLT5yZ2JfdG9fZ3JheV9zdGF0dXMgOiAwKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1VTRVJfQ0hVTktTX1NVUFBPUlRFRAorcG5nX3ZvaWRwIFBOR0FQSQorcG5nX2dldF91c2VyX2NodW5rX3B0cihwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikKK3sKKyAgIHJldHVybiAocG5nX3B0ciA/IHBuZ19wdHItPnVzZXJfY2h1bmtfcHRyIDogTlVMTCk7Cit9CisjZW5kaWYKKworcG5nX3NpemVfdCBQTkdBUEkKK3BuZ19nZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpCit7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuIDA7CisKKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECisgICAgICBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSVNfUkVBRF9TVFJVQ1QpICE9IDApCisjZW5kaWYKKyAgIHsKKyNpZmRlZiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRAorICAgICAgICAgcmV0dXJuIHBuZ19wdHItPklEQVRfcmVhZF9zaXplOworI2Vsc2UKKyAgICAgICAgIHJldHVybiBQTkdfSURBVF9SRUFEX1NJWkU7CisjZW5kaWYKKyAgIH0KKworI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKKyAgICAgIGVsc2UKKyAgICAgICAgIHJldHVybiBwbmdfcHRyLT56YnVmZmVyX3NpemU7CisjZW5kaWYKK30KKworI2lmZGVmIFBOR19TRVRfVVNFUl9MSU1JVFNfU1VQUE9SVEVECisvKiBUaGVzZSBmdW5jdGlvbnMgd2VyZSBhZGRlZCB0byBsaWJwbmcgMS4yLjYgYW5kIHdlcmUgZW5hYmxlZAorICogYnkgZGVmYXVsdCBpbiBsaWJwbmctMS40LjAgKi8KK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX2dldF91c2VyX3dpZHRoX21heCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpCit7CisgICByZXR1cm4gKHBuZ19wdHIgPyBwbmdfcHRyLT51c2VyX3dpZHRoX21heCA6IDApOworfQorCitwbmdfdWludF8zMiBQTkdBUEkKK3BuZ19nZXRfdXNlcl9oZWlnaHRfbWF4IChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikKK3sKKyAgIHJldHVybiAocG5nX3B0ciA/IHBuZ19wdHItPnVzZXJfaGVpZ2h0X21heCA6IDApOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHdhcyBhZGRlZCB0byBsaWJwbmcgMS40LjAgKi8KK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX2dldF9jaHVua19jYWNoZV9tYXggKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyKQoreworICAgcmV0dXJuIChwbmdfcHRyID8gcG5nX3B0ci0+dXNlcl9jaHVua19jYWNoZV9tYXggOiAwKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiB3YXMgYWRkZWQgdG8gbGlicG5nIDEuNC4xICovCitwbmdfYWxsb2Nfc2l6ZV90IFBOR0FQSQorcG5nX2dldF9jaHVua19tYWxsb2NfbWF4IChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikKK3sKKyAgIHJldHVybiAocG5nX3B0ciA/IHBuZ19wdHItPnVzZXJfY2h1bmtfbWFsbG9jX21heCA6IDApOworfQorI2VuZGlmIC8qIFNFVF9VU0VSX0xJTUlUUyAqLworCisvKiBUaGVzZSBmdW5jdGlvbnMgd2VyZSBhZGRlZCB0byBsaWJwbmcgMS40LjAgKi8KKyNpZmRlZiBQTkdfSU9fU1RBVEVfU1VQUE9SVEVECitwbmdfdWludF8zMiBQTkdBUEkKK3BuZ19nZXRfaW9fc3RhdGUgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyKQoreworICAgcmV0dXJuIHBuZ19wdHItPmlvX3N0YXRlOworfQorCitwbmdfdWludF8zMiBQTkdBUEkKK3BuZ19nZXRfaW9fY2h1bmtfdHlwZSAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpCit7CisgICByZXR1cm4gcG5nX3B0ci0+Y2h1bmtfbmFtZTsKK30KKyNlbmRpZiAvKiBJT19TVEFURSAqLworCisjaWZkZWYgUE5HX0NIRUNLX0ZPUl9JTlZBTElEX0lOREVYX1NVUFBPUlRFRAorIyAgaWZkZWYgUE5HX0dFVF9QQUxFVFRFX01BWF9TVVBQT1JURUQKK2ludCBQTkdBUEkKK3BuZ19nZXRfcGFsZXR0ZV9tYXgocG5nX2NvbnN0X3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyKQoreworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQorICAgICAgcmV0dXJuIHBuZ19wdHItPm51bV9wYWxldHRlX21heDsKKworICAgcmV0dXJuICgtMSk7Cit9CisjICBlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAvKiBSRUFEIHx8IFdSSVRFICovCmRpZmYgLS1naXQgYS9saWJwbmcvcG5naW5mby5oIGIvbGlicG5nL3BuZ2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmQyNjRiCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3BuZ2luZm8uaApAQCAtMCwwICsxLDI1OSBAQAorCisvKiBwbmdpbmZvLmggLSBoZWFkZXIgZmlsZSBmb3IgUE5HIHJlZmVyZW5jZSBsaWJyYXJ5CisgKgorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMSBbTWFyY2ggMjgsIDIwMTNdCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMyBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQorICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisgKiBhbmQgbGljZW5zZSBpbiBwbmcuaAorICovCisKKyAvKiBwbmdfaW5mbyBpcyBhIHN0cnVjdHVyZSB0aGF0IGhvbGRzIHRoZSBpbmZvcm1hdGlvbiBpbiBhIFBORyBmaWxlIHNvCisgKiB0aGF0IHRoZSBhcHBsaWNhdGlvbiBjYW4gZmluZCBvdXQgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgaW1hZ2UuCisgKiBJZiB5b3UgYXJlIHJlYWRpbmcgdGhlIGZpbGUsIHRoaXMgc3RydWN0dXJlIHdpbGwgdGVsbCB5b3Ugd2hhdCBpcworICogaW4gdGhlIFBORyBmaWxlLiAgSWYgeW91IGFyZSB3cml0aW5nIHRoZSBmaWxlLCBmaWxsIGluIHRoZSBpbmZvcm1hdGlvbgorICogeW91IHdhbnQgdG8gcHV0IGludG8gdGhlIFBORyBmaWxlLCB1c2luZyBwbmdfc2V0XyooKSBmdW5jdGlvbnMsIHRoZW4KKyAqIGNhbGwgcG5nX3dyaXRlX2luZm8oKS4KKyAqCisgKiBUaGUgbmFtZXMgY2hvc2VuIHNob3VsZCBiZSB2ZXJ5IGNsb3NlIHRvIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiwgc28KKyAqIGNvbnN1bHQgdGhhdCBkb2N1bWVudCBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1lYW5pbmcgb2YgZWFjaCBmaWVsZC4KKyAqCisgKiBXaXRoIGxpYnBuZyA8IDAuOTUsIGl0IHdhcyBvbmx5IHBvc3NpYmxlIHRvIGRpcmVjdGx5IHNldCBhbmQgcmVhZCB0aGUKKyAqIHRoZSB2YWx1ZXMgaW4gdGhlIHBuZ19pbmZvX3N0cnVjdCwgd2hpY2ggbWVhbnQgdGhhdCB0aGUgY29udGVudHMgYW5kCisgKiBvcmRlciBvZiB0aGUgdmFsdWVzIGhhZCB0byByZW1haW4gZml4ZWQuICBXaXRoIGxpYnBuZyAwLjk1IGFuZCBsYXRlciwKKyAqIGhvd2V2ZXIsIHRoZXJlIGFyZSBub3cgZnVuY3Rpb25zIHRoYXQgYWJzdHJhY3QgdGhlIGNvbnRlbnRzIG9mCisgKiBwbmdfaW5mb19zdHJ1Y3QgZnJvbSB0aGUgYXBwbGljYXRpb24sIHNvIHRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIHVzZQorICogbGlicG5nIHdpdGggZHluYW1pYyBsaWJyYXJpZXMsIGFuZCBldmVuIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZQorICogbGlicmFyaWVzIHRoYXQgZG9uJ3QgaGF2ZSBhbGwgb2YgdGhlIGxpYnBuZyBhbmNpbGxhcnkgY2h1bmstaGFuZGluZworICogZnVuY3Rpb25hbGl0eS4gIEluIGxpYnBuZy0xLjUuMCB0aGlzIHdhcyBtb3ZlZCBpbnRvIGEgc2VwYXJhdGUgcHJpdmF0ZQorICogZmlsZSB0aGF0IGlzIG5vdCB2aXNpYmxlIHRvIGFwcGxpY2F0aW9ucy4KKyAqCisgKiBUaGUgZm9sbG93aW5nIG1lbWJlcnMgbWF5IGhhdmUgYWxsb2NhdGVkIHN0b3JhZ2UgYXR0YWNoZWQgdGhhdCBzaG91bGQgYmUKKyAqIGNsZWFuZWQgdXAgYmVmb3JlIHRoZSBzdHJ1Y3R1cmUgaXMgZGlzY2FyZGVkOiBwYWxldHRlLCB0cmFucywgdGV4dCwKKyAqIHBjYWxfcHVycG9zZSwgcGNhbF91bml0cywgcGNhbF9wYXJhbXMsIGhpc3QsIGljY3BfbmFtZSwgaWNjcF9wcm9maWxlLAorICogc3BsdF9wYWxldHRlcywgc2NhbF91bml0LCByb3dfcG9pbnRlcnMsIGFuZCB1bmtub3ducy4gICBCeSBkZWZhdWx0LCB0aGVzZQorICogYXJlIGF1dG9tYXRpY2FsbHkgZnJlZWQgd2hlbiB0aGUgaW5mbyBzdHJ1Y3R1cmUgaXMgZGVhbGxvY2F0ZWQsIGlmIHRoZXkgd2VyZQorICogYWxsb2NhdGVkIGludGVybmFsbHkgYnkgbGlicG5nLiAgVGhpcyBiZWhhdmlvciBjYW4gYmUgY2hhbmdlZCBieSBtZWFucworICogb2YgdGhlIHBuZ19kYXRhX2ZyZWVyKCkgZnVuY3Rpb24uCisgKgorICogTW9yZSBhbGxvY2F0aW9uIGRldGFpbHM6IGFsbCB0aGUgY2h1bmstcmVhZGluZyBmdW5jdGlvbnMgdGhhdAorICogY2hhbmdlIHRoZXNlIG1lbWJlcnMgZ28gdGhyb3VnaCB0aGUgY29ycmVzcG9uZGluZyBwbmdfc2V0XyoKKyAqIGZ1bmN0aW9ucy4gIEEgZnVuY3Rpb24gdG8gY2xlYXIgdGhlc2UgbWVtYmVycyBpcyBhdmFpbGFibGU6IHNlZQorICogcG5nX2ZyZWVfZGF0YSgpLiAgVGhlIHBuZ19zZXRfKiBmdW5jdGlvbnMgZG8gbm90IGRlcGVuZCBvbiBiZWluZworICogYWJsZSB0byBwb2ludCBpbmZvIHN0cnVjdHVyZSBtZW1iZXJzIHRvIGFueSBvZiB0aGUgc3RvcmFnZSB0aGV5IGFyZQorICogcGFzc2VkICh0aGV5IG1ha2UgdGhlaXIgb3duIGNvcGllcyksIEVYQ0VQVCB0aGF0IHRoZSBwbmdfc2V0X3RleHQKKyAqIGZ1bmN0aW9ucyB1c2UgdGhlIHNhbWUgc3RvcmFnZSBwYXNzZWQgdG8gdGhlbSBpbiB0aGUgdGV4dF9wdHIgb3IKKyAqIGl0eHRfcHRyIHN0cnVjdHVyZSBhcmd1bWVudCwgYW5kIHRoZSBwbmdfc2V0X3Jvd3MgYW5kIHBuZ19zZXRfdW5rbm93bnMKKyAqIGZ1bmN0aW9ucyBkbyBub3QgbWFrZSB0aGVpciBvd24gY29waWVzLgorICovCisjaWZuZGVmIFBOR0lORk9fSAorI2RlZmluZSBQTkdJTkZPX0gKKworc3RydWN0IHBuZ19pbmZvX2RlZgoreworICAgLyogVGhlIGZvbGxvd2luZyBhcmUgbmVjZXNzYXJ5IGZvciBldmVyeSBQTkcgZmlsZSAqLworICAgcG5nX3VpbnRfMzIgd2lkdGg7ICAvKiB3aWR0aCBvZiBpbWFnZSBpbiBwaXhlbHMgKGZyb20gSUhEUikgKi8KKyAgIHBuZ191aW50XzMyIGhlaWdodDsgLyogaGVpZ2h0IG9mIGltYWdlIGluIHBpeGVscyAoZnJvbSBJSERSKSAqLworICAgcG5nX3VpbnRfMzIgdmFsaWQ7ICAvKiB2YWxpZCBjaHVuayBkYXRhIChzZWUgUE5HX0lORk9fIGJlbG93KSAqLworICAgcG5nX3NpemVfdCByb3dieXRlczsgLyogYnl0ZXMgbmVlZGVkIHRvIGhvbGQgYW4gdW50cmFuc2Zvcm1lZCByb3cgKi8KKyAgIHBuZ19jb2xvcnAgcGFsZXR0ZTsgICAgICAvKiBhcnJheSBvZiBjb2xvciB2YWx1ZXMgKHZhbGlkICYgUE5HX0lORk9fUExURSkgKi8KKyAgIHBuZ191aW50XzE2IG51bV9wYWxldHRlOyAvKiBudW1iZXIgb2YgY29sb3IgZW50cmllcyBpbiAicGFsZXR0ZSIgKFBMVEUpICovCisgICBwbmdfdWludF8xNiBudW1fdHJhbnM7ICAgLyogbnVtYmVyIG9mIHRyYW5zcGFyZW50IHBhbGV0dGUgY29sb3IgKHRSTlMpICovCisgICBwbmdfYnl0ZSBiaXRfZGVwdGg7ICAgICAgLyogMSwgMiwgNCwgOCwgb3IgMTYgYml0cy9jaGFubmVsIChmcm9tIElIRFIpICovCisgICBwbmdfYnl0ZSBjb2xvcl90eXBlOyAgICAgLyogc2VlIFBOR19DT0xPUl9UWVBFXyBiZWxvdyAoZnJvbSBJSERSKSAqLworICAgLyogVGhlIGZvbGxvd2luZyB0aHJlZSBzaG91bGQgaGF2ZSBiZWVuIG5hbWVkICpfbWV0aG9kIG5vdCAqX3R5cGUgKi8KKyAgIHBuZ19ieXRlIGNvbXByZXNzaW9uX3R5cGU7IC8qIG11c3QgYmUgUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSAoSUhEUikgKi8KKyAgIHBuZ19ieXRlIGZpbHRlcl90eXBlOyAgICAvKiBtdXN0IGJlIFBOR19GSUxURVJfVFlQRV9CQVNFIChmcm9tIElIRFIpICovCisgICBwbmdfYnl0ZSBpbnRlcmxhY2VfdHlwZTsgLyogT25lIG9mIFBOR19JTlRFUkxBQ0VfTk9ORSwgUE5HX0lOVEVSTEFDRV9BREFNNyAqLworCisgICAvKiBUaGUgZm9sbG93aW5nIGFyZSBzZXQgYnkgcG5nX3NldF9JSERSLCBjYWxsZWQgZnJvbSB0aGUgYXBwbGljYXRpb24gb24KKyAgICAqIHdyaXRlLCBidXQgdGhlIGFyZSBuZXZlciBhY3R1YWxseSB1c2VkIGJ5IHRoZSB3cml0ZSBjb2RlLgorICAgICovCisgICBwbmdfYnl0ZSBjaGFubmVsczsgICAgICAgLyogbnVtYmVyIG9mIGRhdGEgY2hhbm5lbHMgcGVyIHBpeGVsICgxLCAyLCAzLCA0KSAqLworICAgcG5nX2J5dGUgcGl4ZWxfZGVwdGg7ICAgIC8qIG51bWJlciBvZiBiaXRzIHBlciBwaXhlbCAqLworICAgcG5nX2J5dGUgc3BhcmVfYnl0ZTsgICAgIC8qIHRvIGFsaWduIHRoZSBkYXRhLCBhbmQgZm9yIGZ1dHVyZSB1c2UgKi8KKworI2lmZGVmIFBOR19SRUFEX1NVUFBPUlRFRAorICAgLyogVGhpcyBpcyBuZXZlciBzZXQgZHVyaW5nIHdyaXRlICovCisgICBwbmdfYnl0ZSBzaWduYXR1cmVbOF07ICAgLyogbWFnaWMgYnl0ZXMgcmVhZCBieSBsaWJwbmcgZnJvbSBzdGFydCBvZiBmaWxlICovCisjZW5kaWYKKworICAgLyogVGhlIHJlc3Qgb2YgdGhlIGRhdGEgaXMgb3B0aW9uYWwuICBJZiB5b3UgYXJlIHJlYWRpbmcsIGNoZWNrIHRoZQorICAgICogdmFsaWQgZmllbGQgdG8gc2VlIGlmIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGVzZSBhcmUgdmFsaWQuICBJZiB5b3UKKyAgICAqIGFyZSB3cml0aW5nLCBzZXQgdGhlIHZhbGlkIGZpZWxkIHRvIHRob3NlIGNodW5rcyB5b3Ugd2FudCB3cml0dGVuLAorICAgICogYW5kIGluaXRpYWxpemUgdGhlIGFwcHJvcHJpYXRlIGZpZWxkcyBiZWxvdy4KKyAgICAqLworCisjaWYgZGVmaW5lZChQTkdfQ09MT1JTUEFDRV9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX0dBTU1BX1NVUFBPUlRFRCkKKyAgIC8qIHBuZ19jb2xvcnNwYWNlIG9ubHkgY29udGFpbnMgJ2ZsYWdzJyBpZiBuZWl0aGVyIEdBTU1BIG9yIENPTE9SU1BBQ0UgYXJlCisgICAgKiBkZWZpbmVkLiAgV2hlbiBDT0xPUlNQQUNFIGlzIHN3aXRjaGVkIG9uIGFsbCB0aGUgY29sb3JzcGFjZS1kZWZpbmluZworICAgICogY2h1bmtzIHNob3VsZCBiZSBlbmFibGVkLCB3aGVuIEdBTU1BIGlzIHN3aXRjaGVkIG9uIGFsbCB0aGUgZ2FtbWEtZGVmaW5pbmcKKyAgICAqIGNodW5rcyBzaG91bGQgYmUgZW5hYmxlZC4gIElmIHRoaXMgaXMgbm90IGRvbmUgaXQgYmVjb21lcyBwb3NzaWJsZSB0byByZWFkCisgICAgKiBpbmNvbnNpc3RlbnQgUE5HIGZpbGVzIGFuZCBhc3NpZ24gYSBwcm9iYWJseSBpbmNvcnJlY3QgaW50ZXJwcmV0YXRpb24gdG8KKyAgICAqIHRoZSBpbmZvcm1hdGlvbi4gIChJbiBvdGhlciB3b3JkcywgYnkgY2FyZWZ1bGx5IGNob29zaW5nIHdoaWNoIGNodW5rcyB0bworICAgICogcmVjb2duaXplIHRoZSBzeXN0ZW0gY29uZmlndXJhdGlvbiBjYW4gc2VsZWN0IGFuIGludGVycHJldGF0aW9uIGZvciBQTkcKKyAgICAqIGZpbGVzIGNvbnRhaW5pbmcgYW1iaWd1b3VzIGRhdGEgYW5kIHRoaXMgd2lsbCByZXN1bHQgaW4gaW5jb25zaXN0ZW50CisgICAgKiBiZWhhdmlvciBiZXR3ZWVuIGRpZmZlcmVudCBsaWJwbmcgYnVpbGRzISkKKyAgICAqLworICAgcG5nX2NvbG9yc3BhY2UgY29sb3JzcGFjZTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX2lDQ1BfU1VQUE9SVEVECisgICAvKiBpQ0NQIGNodW5rIGRhdGEuICovCisgICBwbmdfY2hhcnAgaWNjcF9uYW1lOyAgICAgLyogcHJvZmlsZSBuYW1lICovCisgICBwbmdfYnl0ZXAgaWNjcF9wcm9maWxlOyAgLyogSW50ZXJuYXRpb25hbCBDb2xvciBDb25zb3J0aXVtIHByb2ZpbGUgZGF0YSAqLworICAgcG5nX3VpbnRfMzIgaWNjcF9wcm9mbGVuOyAgLyogSUNDIHByb2ZpbGUgZGF0YSBsZW5ndGggKi8KKyNlbmRpZgorCisjaWZkZWYgUE5HX1RFWFRfU1VQUE9SVEVECisgICAvKiBUaGUgdEVYdCwgYW5kIHpUWHQgY2h1bmtzIGNvbnRhaW4gaHVtYW4tcmVhZGFibGUgdGV4dHVhbCBkYXRhIGluCisgICAgKiB1bmNvbXByZXNzZWQsIGNvbXByZXNzZWQsIGFuZCBvcHRpb25hbGx5IGNvbXByZXNzZWQgZm9ybXMsIHJlc3BlY3RpdmVseS4KKyAgICAqIFRoZSBkYXRhIGluICJ0ZXh0IiBpcyBhbiBhcnJheSBvZiBwb2ludGVycyB0byB1bmNvbXByZXNzZWQsCisgICAgKiBudWxsLXRlcm1pbmF0ZWQgQyBzdHJpbmdzLiBFYWNoIGNodW5rIGhhcyBhIGtleXdvcmQgdGhhdCBkZXNjcmliZXMgdGhlCisgICAgKiB0ZXh0dWFsIGRhdGEgY29udGFpbmVkIGluIHRoYXQgY2h1bmsuICBLZXl3b3JkcyBhcmUgbm90IHJlcXVpcmVkIHRvIGJlCisgICAgKiB1bmlxdWUsIGFuZCB0aGUgdGV4dCBzdHJpbmcgbWF5IGJlIGVtcHR5LiAgQW55IG51bWJlciBvZiB0ZXh0IGNodW5rcyBtYXkKKyAgICAqIGJlIGluIGFuIGltYWdlLgorICAgICovCisgICBpbnQgbnVtX3RleHQ7IC8qIG51bWJlciBvZiBjb21tZW50cyByZWFkIG9yIGNvbW1lbnRzIHRvIHdyaXRlICovCisgICBpbnQgbWF4X3RleHQ7IC8qIGN1cnJlbnQgc2l6ZSBvZiB0ZXh0IGFycmF5ICovCisgICBwbmdfdGV4dHAgdGV4dDsgLyogYXJyYXkgb2YgY29tbWVudHMgcmVhZCBvciBjb21tZW50cyB0byB3cml0ZSAqLworI2VuZGlmIC8qIFRFWFQgKi8KKworI2lmZGVmIFBOR190SU1FX1NVUFBPUlRFRAorICAgLyogVGhlIHRJTUUgY2h1bmsgaG9sZHMgdGhlIGxhc3QgdGltZSB0aGUgZGlzcGxheWVkIGltYWdlIGRhdGEgd2FzCisgICAgKiBtb2RpZmllZC4gIFNlZSB0aGUgcG5nX3RpbWUgc3RydWN0IGZvciB0aGUgY29udGVudHMgb2YgdGhpcyBzdHJ1Y3QuCisgICAgKi8KKyAgIHBuZ190aW1lIG1vZF90aW1lOworI2VuZGlmCisKKyNpZmRlZiBQTkdfc0JJVF9TVVBQT1JURUQKKyAgIC8qIFRoZSBzQklUIGNodW5rIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGhpZ2gtb3JkZXIgYml0cworICAgICogaW4gdGhlIHBpeGVsIGRhdGEuICBWYWx1ZXMgYXJlIGluIHRoZSByYW5nZSBbMSwgYml0X2RlcHRoXSwgYW5kIGFyZQorICAgICogb25seSBzcGVjaWZpZWQgZm9yIHRoZSBjaGFubmVscyBpbiB0aGUgcGl4ZWwgZGF0YS4gIFRoZSBjb250ZW50cyBvZgorICAgICogdGhlIGxvdy1vcmRlciBiaXRzIGlzIG5vdCBzcGVjaWZpZWQuICBEYXRhIGlzIHZhbGlkIGlmCisgICAgKiAodmFsaWQgJiBQTkdfSU5GT19zQklUKSBpcyBub24temVyby4KKyAgICAqLworICAgcG5nX2NvbG9yXzggc2lnX2JpdDsgLyogc2lnbmlmaWNhbnQgYml0cyBpbiBjb2xvciBjaGFubmVscyAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR190Uk5TX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVEKSB8fCBcCitkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKQorICAgLyogVGhlIHRSTlMgY2h1bmsgc3VwcGxpZXMgdHJhbnNwYXJlbmN5IGRhdGEgZm9yIHBhbGV0dGVkIGltYWdlcyBhbmQKKyAgICAqIG90aGVyIGltYWdlIHR5cGVzIHRoYXQgZG9uJ3QgbmVlZCBhIGZ1bGwgYWxwaGEgY2hhbm5lbC4gIFRoZXJlIGFyZQorICAgICogIm51bV90cmFucyIgdHJhbnNwYXJlbmN5IHZhbHVlcyBmb3IgYSBwYWxldHRlZCBpbWFnZSwgc3RvcmVkIGluIHRoZQorICAgICogc2FtZSBvcmRlciBhcyB0aGUgcGFsZXR0ZSBjb2xvcnMsIHN0YXJ0aW5nIGZyb20gaW5kZXggMC4gIFZhbHVlcworICAgICogZm9yIHRoZSBkYXRhIGFyZSBpbiB0aGUgcmFuZ2UgWzAsIDI1NV0sIHJhbmdpbmcgZnJvbSBmdWxseSB0cmFuc3BhcmVudAorICAgICogdG8gZnVsbHkgb3BhcXVlLCByZXNwZWN0aXZlbHkuICBGb3Igbm9uLXBhbGV0dGVkIGltYWdlcywgdGhlcmUgaXMgYQorICAgICogc2luZ2xlIGNvbG9yIHNwZWNpZmllZCB0aGF0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGZ1bGx5IHRyYW5zcGFyZW50LgorICAgICogRGF0YSBpcyB2YWxpZCBpZiAodmFsaWQgJiBQTkdfSU5GT190Uk5TKSBpcyBub24temVyby4KKyAgICAqLworICAgcG5nX2J5dGVwIHRyYW5zX2FscGhhOyAgICAvKiBhbHBoYSB2YWx1ZXMgZm9yIHBhbGV0dGVkIGltYWdlICovCisgICBwbmdfY29sb3JfMTYgdHJhbnNfY29sb3I7IC8qIHRyYW5zcGFyZW50IGNvbG9yIGZvciBub24tcGFsZXR0ZSBpbWFnZSAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19iS0dEX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkKKyAgIC8qIFRoZSBiS0dEIGNodW5rIGdpdmVzIHRoZSBzdWdnZXN0ZWQgaW1hZ2UgYmFja2dyb3VuZCBjb2xvciBpZiB0aGUKKyAgICAqIGRpc3BsYXkgcHJvZ3JhbSBkb2VzIG5vdCBoYXZlIGl0cyBvd24gYmFja2dyb3VuZCBjb2xvciBhbmQgdGhlIGltYWdlCisgICAgKiBpcyBuZWVkcyB0byBjb21wb3NpdGVkIG9udG8gYSBiYWNrZ3JvdW5kIGJlZm9yZSBkaXNwbGF5LiAgVGhlIGNvbG9ycworICAgICogaW4gImJhY2tncm91bmQiIGFyZSBub3JtYWxseSBpbiB0aGUgc2FtZSBjb2xvciBzcGFjZS9kZXB0aCBhcyB0aGUKKyAgICAqIHBpeGVsIGRhdGEuICBEYXRhIGlzIHZhbGlkIGlmICh2YWxpZCAmIFBOR19JTkZPX2JLR0QpIGlzIG5vbi16ZXJvLgorICAgICovCisgICBwbmdfY29sb3JfMTYgYmFja2dyb3VuZDsKKyNlbmRpZgorCisjaWZkZWYgUE5HX29GRnNfU1VQUE9SVEVECisgICAvKiBUaGUgb0ZGcyBjaHVuayBnaXZlcyB0aGUgb2Zmc2V0IGluICJvZmZzZXRfdW5pdF90eXBlIiB1bml0cyByaWdodHdhcmRzCisgICAgKiBhbmQgZG93bndhcmRzIGZyb20gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZGlzcGxheSwgcGFnZSwgb3Igb3RoZXIKKyAgICAqIGFwcGxpY2F0aW9uLXNwZWNpZmljIGNvLW9yZGluYXRlIHNwYWNlLiAgU2VlIHRoZSBQTkdfT0ZGU0VUXyBkZWZpbmVzCisgICAgKiBiZWxvdyBmb3IgdGhlIHVuaXQgdHlwZXMuICBWYWxpZCBpZiAodmFsaWQgJiBQTkdfSU5GT19vRkZzKSBub24temVyby4KKyAgICAqLworICAgcG5nX2ludF8zMiB4X29mZnNldDsgLyogeCBvZmZzZXQgb24gcGFnZSAqLworICAgcG5nX2ludF8zMiB5X29mZnNldDsgLyogeSBvZmZzZXQgb24gcGFnZSAqLworICAgcG5nX2J5dGUgb2Zmc2V0X3VuaXRfdHlwZTsgLyogb2Zmc2V0IHVuaXRzIHR5cGUgKi8KKyNlbmRpZgorCisjaWZkZWYgUE5HX3BIWXNfU1VQUE9SVEVECisgICAvKiBUaGUgcEhZcyBjaHVuayBnaXZlcyB0aGUgcGh5c2ljYWwgcGl4ZWwgZGVuc2l0eSBvZiB0aGUgaW1hZ2UgZm9yCisgICAgKiBkaXNwbGF5IG9yIHByaW50aW5nIGluICJwaHlzX3VuaXRfdHlwZSIgdW5pdHMgKHNlZSBQTkdfUkVTT0xVVElPTl8KKyAgICAqIGRlZmluZXMgYmVsb3cpLiAgRGF0YSBpcyB2YWxpZCBpZiAodmFsaWQgJiBQTkdfSU5GT19wSFlzKSBpcyBub24temVyby4KKyAgICAqLworICAgcG5nX3VpbnRfMzIgeF9waXhlbHNfcGVyX3VuaXQ7IC8qIGhvcml6b250YWwgcGl4ZWwgZGVuc2l0eSAqLworICAgcG5nX3VpbnRfMzIgeV9waXhlbHNfcGVyX3VuaXQ7IC8qIHZlcnRpY2FsIHBpeGVsIGRlbnNpdHkgKi8KKyAgIHBuZ19ieXRlIHBoeXNfdW5pdF90eXBlOyAvKiByZXNvbHV0aW9uIHR5cGUgKHNlZSBQTkdfUkVTT0xVVElPTl8gYmVsb3cpICovCisjZW5kaWYKKworI2lmZGVmIFBOR19oSVNUX1NVUFBPUlRFRAorICAgLyogVGhlIGhJU1QgY2h1bmsgY29udGFpbnMgdGhlIHJlbGF0aXZlIGZyZXF1ZW5jeSBvciBpbXBvcnRhbmNlIG9mIHRoZQorICAgICogdmFyaW91cyBwYWxldHRlIGVudHJpZXMsIHNvIHRoYXQgYSB2aWV3ZXIgY2FuIGludGVsbGlnZW50bHkgc2VsZWN0IGEKKyAgICAqIHJlZHVjZWQtY29sb3IgcGFsZXR0ZSwgaWYgcmVxdWlyZWQuICBEYXRhIGlzIGFuIGFycmF5IG9mICJudW1fcGFsZXR0ZSIKKyAgICAqIHZhbHVlcyBpbiB0aGUgcmFuZ2UgWzAsNjU1MzVdLiBEYXRhIHZhbGlkIGlmICh2YWxpZCAmIFBOR19JTkZPX2hJU1QpCisgICAgKiBpcyBub24temVyby4KKyAgICAqLworICAgcG5nX3VpbnRfMTZwIGhpc3Q7CisjZW5kaWYKKworI2lmZGVmIFBOR19wQ0FMX1NVUFBPUlRFRAorICAgLyogVGhlIHBDQUwgY2h1bmsgZGVzY3JpYmVzIGEgdHJhbnNmb3JtYXRpb24gYmV0d2VlbiB0aGUgc3RvcmVkIHBpeGVsCisgICAgKiB2YWx1ZXMgYW5kIG9yaWdpbmFsIHBoeXNpY2FsIGRhdGEgdmFsdWVzIHVzZWQgdG8gY3JlYXRlIHRoZSBpbWFnZS4KKyAgICAqIFRoZSBpbnRlZ2VyIHJhbmdlIFswLCAyXmJpdF9kZXB0aCAtIDFdIG1hcHMgdG8gdGhlIGZsb2F0aW5nLXBvaW50CisgICAgKiByYW5nZSBnaXZlbiBieSBbcGNhbF9YMCwgcGNhbF9YMV0sIGFuZCBhcmUgZnVydGhlciB0cmFuc2Zvcm1lZCBieSBhCisgICAgKiAocG9zc2libHkgbm9uLWxpbmVhcikgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gZ2l2ZW4gYnkgInBjYWxfdHlwZSIKKyAgICAqIGFuZCAicGNhbF9wYXJhbXMiIGludG8gInBjYWxfdW5pdHMiLiAgUGxlYXNlIHNlZSB0aGUgUE5HX0VRVUFUSU9OXworICAgICogZGVmaW5lcyBiZWxvdywgYW5kIHRoZSBQTkctR3JvdXAncyBQTkcgZXh0ZW5zaW9ucyBkb2N1bWVudCBmb3IgYQorICAgICogY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zZm9ybWF0aW9ucyBhbmQgaG93IHRoZXkgc2hvdWxkIGJlCisgICAgKiBpbXBsZW1lbnRlZCwgYW5kIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBBU0NJSSBwYXJhbWV0ZXIgc3RyaW5ncy4KKyAgICAqIERhdGEgdmFsdWVzIGFyZSB2YWxpZCBpZiAodmFsaWQgJiBQTkdfSU5GT19wQ0FMKSBub24temVyby4KKyAgICAqLworICAgcG5nX2NoYXJwIHBjYWxfcHVycG9zZTsgIC8qIHBDQUwgY2h1bmsgZGVzY3JpcHRpb24gc3RyaW5nICovCisgICBwbmdfaW50XzMyIHBjYWxfWDA7ICAgICAgLyogbWluaW11bSB2YWx1ZSAqLworICAgcG5nX2ludF8zMiBwY2FsX1gxOyAgICAgIC8qIG1heGltdW0gdmFsdWUgKi8KKyAgIHBuZ19jaGFycCBwY2FsX3VuaXRzOyAgICAvKiBMYXRpbi0xIHN0cmluZyBnaXZpbmcgcGh5c2ljYWwgdW5pdHMgKi8KKyAgIHBuZ19jaGFycHAgcGNhbF9wYXJhbXM7ICAvKiBBU0NJSSBzdHJpbmdzIGNvbnRhaW5pbmcgcGFyYW1ldGVyIHZhbHVlcyAqLworICAgcG5nX2J5dGUgcGNhbF90eXBlOyAgICAgIC8qIGVxdWF0aW9uIHR5cGUgKHNlZSBQTkdfRVFVQVRJT05fIGJlbG93KSAqLworICAgcG5nX2J5dGUgcGNhbF9ucGFyYW1zOyAgIC8qIG51bWJlciBvZiBwYXJhbWV0ZXJzIGdpdmVuIGluIHBjYWxfcGFyYW1zICovCisjZW5kaWYKKworLyogTmV3IG1lbWJlcnMgYWRkZWQgaW4gbGlicG5nLTEuMC42ICovCisgICBwbmdfdWludF8zMiBmcmVlX21lOyAgICAgLyogZmxhZ3MgaXRlbXMgbGlicG5nIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nICovCisKKyNpZmRlZiBQTkdfU1RPUkVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECisgICAvKiBTdG9yYWdlIGZvciB1bmtub3duIGNodW5rcyB0aGF0IHRoZSBsaWJyYXJ5IGRvZXNuJ3QgcmVjb2duaXplLiAqLworICAgcG5nX3Vua25vd25fY2h1bmtwIHVua25vd25fY2h1bmtzOworCisgICAvKiBUaGUgdHlwZSBvZiB0aGlzIGZpZWxkIGlzIGxpbWl0ZWQgYnkgdGhlIHR5cGUgb2YKKyAgICAqIHBuZ19zdHJ1Y3Q6OnVzZXJfY2h1bmtfY2FjaGVfbWF4LCBlbHNlIG92ZXJmbG93IGNhbiBvY2N1ci4KKyAgICAqLworICAgaW50ICAgICAgICAgICAgICAgIHVua25vd25fY2h1bmtzX251bTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX3NQTFRfU1VQUE9SVEVECisgICAvKiBEYXRhIG9uIHNQTFQgY2h1bmtzICh0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZSkuICovCisgICBwbmdfc1BMVF90cCBzcGx0X3BhbGV0dGVzOworICAgaW50ICAgICAgICAgc3BsdF9wYWxldHRlc19udW07IC8qIE1hdGNoIHR5cGUgcmV0dXJuZWQgYnkgcG5nX2dldCBBUEkgKi8KKyNlbmRpZgorCisjaWZkZWYgUE5HX3NDQUxfU1VQUE9SVEVECisgICAvKiBUaGUgc0NBTCBjaHVuayBkZXNjcmliZXMgdGhlIGFjdHVhbCBwaHlzaWNhbCBkaW1lbnNpb25zIG9mIHRoZQorICAgICogc3ViamVjdCBtYXR0ZXIgb2YgdGhlIGdyYXBoaWMuICBUaGUgY2h1bmsgY29udGFpbnMgYSB1bml0IHNwZWNpZmljYXRpb24KKyAgICAqIGEgYnl0ZSB2YWx1ZSwgYW5kIHR3byBBU0NJSSBzdHJpbmdzIHJlcHJlc2VudGluZyBmbG9hdGluZy1wb2ludAorICAgICogdmFsdWVzLiAgVGhlIHZhbHVlcyBhcmUgd2lkdGggYW5kIGhlaWdodCBjb3JyZXNwb25zaW5nIHRvIG9uZSBwaXhlbAorICAgICogaW4gdGhlIGltYWdlLiAgRGF0YSB2YWx1ZXMgYXJlIHZhbGlkIGlmICh2YWxpZCAmIFBOR19JTkZPX3NDQUwpIGlzCisgICAgKiBub24temVyby4KKyAgICAqLworICAgcG5nX2J5dGUgc2NhbF91bml0OyAgICAgICAgIC8qIHVuaXQgb2YgcGh5c2ljYWwgc2NhbGUgKi8KKyAgIHBuZ19jaGFycCBzY2FsX3Nfd2lkdGg7ICAgICAvKiBzdHJpbmcgY29udGFpbmluZyBoZWlnaHQgKi8KKyAgIHBuZ19jaGFycCBzY2FsX3NfaGVpZ2h0OyAgICAvKiBzdHJpbmcgY29udGFpbmluZyB3aWR0aCAqLworI2VuZGlmCisKKyNpZmRlZiBQTkdfSU5GT19JTUFHRV9TVVBQT1JURUQKKyAgIC8qIE1lbW9yeSBoYXMgYmVlbiBhbGxvY2F0ZWQgaWYgKHZhbGlkICYgUE5HX0FMTE9DQVRFRF9JTkZPX1JPV1MpCisgICAgICBub24temVybyAqLworICAgLyogRGF0YSB2YWxpZCBpZiAodmFsaWQgJiBQTkdfSU5GT19JREFUKSBub24temVybyAqLworICAgcG5nX2J5dGVwcCByb3dfcG9pbnRlcnM7ICAgICAgICAvKiB0aGUgaW1hZ2UgYml0cyAqLworI2VuZGlmCisKK307CisjZW5kaWYgLyogUE5HSU5GT19IICovCmRpZmYgLS1naXQgYS9saWJwbmcvcG5nbGliY29uZi5oIGIvbGlicG5nL3BuZ2xpYmNvbmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjAxYTkzCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3BuZ2xpYmNvbmYuaApAQCAtMCwwICsxLDIxNSBAQAorLyogbGlicG5nIDEuNi4xOSBTVEFOREFSRCBBUEkgREVGSU5JVElPTiAqLworCisvKiBwbmdsaWJjb25mLmggLSBsaWJyYXJ5IGJ1aWxkIGNvbmZpZ3VyYXRpb24gKi8KKworLyogTGlicG5nIHZlcnNpb24gMS42LjE5IC0gTm92ZW1iZXIgMTIsIDIwMTUgKi8KKworLyogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTUgR2xlbm4gUmFuZGVycy1QZWhyc29uICovCisKKy8qIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuICovCisvKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyICovCisvKiBhbmQgbGljZW5zZSBpbiBwbmcuaCAqLworCisvKiBwbmdsaWJjb25mLmggKi8KKy8qIE1hY2hpbmUgZ2VuZXJhdGVkIGZpbGU6IERPIE5PVCBFRElUICovCisvKiBEZXJpdmVkIGZyb206IHNjcmlwdHMvcG5nbGliY29uZi5kZmEgKi8KKyNpZm5kZWYgUE5HTENPTkZfSAorI2RlZmluZSBQTkdMQ09ORl9ICisvKiBvcHRpb25zICovCisjZGVmaW5lIFBOR18xNkJJVF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX0FMSUdORURfTUVNT1JZX1NVUFBPUlRFRAorLyojdW5kZWYgUE5HX0FSTV9ORU9OX0FQSV9TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX0FSTV9ORU9OX0NIRUNLX1NVUFBPUlRFRCovCisjZGVmaW5lIFBOR19CRU5JR05fRVJST1JTX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfQkVOSUdOX1JFQURfRVJST1JTX1NVUFBPUlRFRAorLyojdW5kZWYgUE5HX0JFTklHTl9XUklURV9FUlJPUlNfU1VQUE9SVEVEKi8KKyNkZWZpbmUgUE5HX0JVSUxEX0dSQVlTQ0FMRV9QQUxFVFRFX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfQ0hFQ0tfRk9SX0lOVkFMSURfSU5ERVhfU1VQUE9SVEVECisjZGVmaW5lIFBOR19DT0xPUlNQQUNFX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfQ09OU09MRV9JT19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX0NPTlZFUlRfdElNRV9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX0VBU1lfQUNDRVNTX1NVUFBPUlRFRAorLyojdW5kZWYgUE5HX0VSUk9SX05VTUJFUlNfU1VQUE9SVEVEKi8KKyNkZWZpbmUgUE5HX0VSUk9SX1RFWFRfU1VQUE9SVEVECisjZGVmaW5lIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX0ZMT0FUSU5HX0FSSVRITUVUSUNfU1VQUE9SVEVECisjZGVmaW5lIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX0ZPUk1BVF9BRklSU1RfU1VQUE9SVEVECisjZGVmaW5lIFBOR19GT1JNQVRfQkdSX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfR0FNTUFfU1VQUE9SVEVECisjZGVmaW5lIFBOR19HRVRfUEFMRVRURV9NQVhfU1VQUE9SVEVECisjZGVmaW5lIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX0lOQ0hfQ09OVkVSU0lPTlNfU1VQUE9SVEVECisjZGVmaW5lIFBOR19JTkRFWF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX0lORk9fSU1BR0VfU1VQUE9SVEVECisjZGVmaW5lIFBOR19JT19TVEFURV9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1BPSU5URVJfSU5ERVhJTkdfU1VQUE9SVEVECisjZGVmaW5lIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF8xNkJJVF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfQUxQSEFfTU9ERV9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfQU5DSUxMQVJZX0NIVU5LU19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfQkdSX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9DSEVDS19GT1JfSU5WQUxJRF9JTkRFWF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfQ09NUE9TSVRFX05PRElWX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9DT01QUkVTU0VEX1RFWFRfU1VQUE9SVEVECisjZGVmaW5lIFBOR19SRUFEX0VYUEFORF8xNl9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVECisjZGVmaW5lIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9HRVRfUEFMRVRURV9NQVhfU1VQUE9SVEVECisjZGVmaW5lIFBOR19SRUFEX0dSQVlfVE9fUkdCX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfSU5UX0ZVTkNUSU9OU19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9JTlZFUlRfU1VQUE9SVEVECisjZGVmaW5lIFBOR19SRUFEX09QVF9QTFRFX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfUEFDS19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfUVVBTlRJWkVfU1VQUE9SVEVECisjZGVmaW5lIFBOR19SRUFEX1JHQl9UT19HUkFZX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9TQ0FMRV8xNl9UT184X1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9TSElGVF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfU1RSSVBfMTZfVE9fOF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfU1RSSVBfQUxQSEFfU1VQUE9SVEVECisjZGVmaW5lIFBOR19SRUFEX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9TV0FQX0FMUEhBX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9TV0FQX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9URVhUX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9UUkFOU0ZPUk1TX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfVVNFUl9DSFVOS1NfU1VQUE9SVEVECisjZGVmaW5lIFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9iS0dEX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9jSFJNX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9nQU1BX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9oSVNUX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9pQ0NQX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9pVFh0X1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9vRkZzX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9wQ0FMX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9wSFlzX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9zQklUX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9zQ0FMX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9zUExUX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF90RVh0X1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF90SU1FX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF90Uk5TX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF96VFh0X1NVUFBPUlRFRAorI2RlZmluZSBQTkdfU0FWRV9JTlRfMzJfU1VQUE9SVEVECisjZGVmaW5lIFBOR19TQVZFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfU0VUSk1QX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfU0VUX09QVElPTl9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1NFVF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1NFVF9VU0VSX0xJTUlUU19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1NJTVBMSUZJRURfUkVBRF9BRklSU1RfU1VQUE9SVEVECisjZGVmaW5lIFBOR19TSU1QTElGSUVEX1JFQURfQkdSX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfU0lNUExJRklFRF9SRUFEX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfU0lNUExJRklFRF9XUklURV9BRklSU1RfU1VQUE9SVEVECisjZGVmaW5lIFBOR19TSU1QTElGSUVEX1dSSVRFX0JHUl9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1NJTVBMSUZJRURfV1JJVEVfU1VQUE9SVEVECisjZGVmaW5lIFBOR19TVERJT19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1NUT1JFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfVEVYVF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1RJTUVfUkZDMTEyM19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfVVNFUl9DSFVOS1NfU1VQUE9SVEVECisjZGVmaW5lIFBOR19VU0VSX0xJTUlUU19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfVVNFUl9UUkFOU0ZPUk1fSU5GT19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1VTRVJfVFJBTlNGT1JNX1BUUl9TVVBQT1JURUQKKy8qICN1bmRlZiBQTkdfV0FSTklOR1NfU1VQUE9SVEVEICovCisjZGVmaW5lIFBOR19XUklURV8xNkJJVF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX0FOQ0lMTEFSWV9DSFVOS1NfU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV9CR1JfU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV9DSEVDS19GT1JfSU5WQUxJRF9JTkRFWF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX0NPTVBSRVNTRURfVEVYVF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX0NVU1RPTUlaRV9DT01QUkVTU0lPTl9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX0NVU1RPTUlaRV9aVFhUX0NPTVBSRVNTSU9OX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfV1JJVEVfRklMTEVSX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfV1JJVEVfRklMVEVSX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV9HRVRfUEFMRVRURV9NQVhfU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX0lOVF9GVU5DVElPTlNfU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV9JTlZFUlRfQUxQSEFfU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV9JTlZFUlRfU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV9PUFRJTUlaRV9DTUZfU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV9QQUNLU1dBUF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX1BBQ0tfU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV9TSElGVF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfV1JJVEVfU1dBUF9BTFBIQV9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX1NXQVBfU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV9URVhUX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfV1JJVEVfVFJBTlNGT1JNU19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfV1JJVEVfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV9iS0dEX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfV1JJVEVfY0hSTV9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX2dBTUFfU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV9oSVNUX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfV1JJVEVfaUNDUF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX2lUWHRfU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV9vRkZzX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfV1JJVEVfcENBTF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX3BIWXNfU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV9zQklUX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfV1JJVEVfc0NBTF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX3NQTFRfU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV9zUkdCX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfV1JJVEVfdEVYdF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX3RJTUVfU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV90Uk5TX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfV1JJVEVfelRYdF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX2JLR0RfU1VQUE9SVEVECisjZGVmaW5lIFBOR19jSFJNX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfZ0FNQV9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX2hJU1RfU1VQUE9SVEVECisjZGVmaW5lIFBOR19pQ0NQX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfaVRYdF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX29GRnNfU1VQUE9SVEVECisjZGVmaW5lIFBOR19wQ0FMX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfcEhZc19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX3NCSVRfU1VQUE9SVEVECisjZGVmaW5lIFBOR19zQ0FMX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfc1BMVF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX3NSR0JfU1VQUE9SVEVECisjZGVmaW5lIFBOR190RVh0X1NVUFBPUlRFRAorI2RlZmluZSBQTkdfdElNRV9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX3RSTlNfU1VQUE9SVEVECisjZGVmaW5lIFBOR196VFh0X1NVUFBPUlRFRAorLyogZW5kIG9mIG9wdGlvbnMgKi8KKy8qIHNldHRpbmdzICovCisjZGVmaW5lIFBOR19BUElfUlVMRSAwCisjZGVmaW5lIFBOR19ERUZBVUxUX1JFQURfTUFDUk9TIDEKKyNkZWZpbmUgUE5HX0dBTU1BX1RIUkVTSE9MRF9GSVhFRCA1MDAwCisjZGVmaW5lIFBOR19JREFUX1JFQURfU0laRSBQTkdfWkJVRl9TSVpFCisjZGVmaW5lIFBOR19JTkZMQVRFX0JVRl9TSVpFIDEwMjQKKyNkZWZpbmUgUE5HX0xJTktBR0VfQVBJIGV4dGVybgorI2RlZmluZSBQTkdfTElOS0FHRV9DQUxMQkFDSyBleHRlcm4KKyNkZWZpbmUgUE5HX0xJTktBR0VfREFUQSBleHRlcm4KKyNkZWZpbmUgUE5HX0xJTktBR0VfRlVOQ1RJT04gZXh0ZXJuCisjZGVmaW5lIFBOR19NQVhfR0FNTUFfOCAxMQorI2RlZmluZSBQTkdfUVVBTlRJWkVfQkxVRV9CSVRTIDUKKyNkZWZpbmUgUE5HX1FVQU5USVpFX0dSRUVOX0JJVFMgNQorI2RlZmluZSBQTkdfUVVBTlRJWkVfUkVEX0JJVFMgNQorI2RlZmluZSBQTkdfVEVYVF9aX0RFRkFVTFRfQ09NUFJFU1NJT04gKC0xKQorI2RlZmluZSBQTkdfVEVYVF9aX0RFRkFVTFRfU1RSQVRFR1kgMAorI2RlZmluZSBQTkdfVVNFUl9DSFVOS19DQUNIRV9NQVggMTAwMAorI2RlZmluZSBQTkdfVVNFUl9DSFVOS19NQUxMT0NfTUFYIDgwMDAwMDAKKyNkZWZpbmUgUE5HX1VTRVJfSEVJR0hUX01BWCAxMDAwMDAwCisjZGVmaW5lIFBOR19VU0VSX1dJRFRIX01BWCAxMDAwMDAwCisjZGVmaW5lIFBOR19aQlVGX1NJWkUgODE5MgorI2RlZmluZSBQTkdfWkxJQl9WRVJOVU0gMCAvKiB1bmtub3duICovCisjZGVmaW5lIFBOR19aX0RFRkFVTFRfQ09NUFJFU1NJT04gKC0xKQorI2RlZmluZSBQTkdfWl9ERUZBVUxUX05PRklMVEVSX1NUUkFURUdZIDAKKyNkZWZpbmUgUE5HX1pfREVGQVVMVF9TVFJBVEVHWSAxCisjZGVmaW5lIFBOR19zQ0FMX1BSRUNJU0lPTiA1CisjZGVmaW5lIFBOR19zUkdCX1BST0ZJTEVfQ0hFQ0tTIDIKKy8qIGVuZCBvZiBzZXR0aW5ncyAqLworI2VuZGlmIC8qIFBOR0xDT05GX0ggKi8KZGlmZiAtLWdpdCBhL2xpYnBuZy9wbmdtZW0uYyBiL2xpYnBuZy9wbmdtZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWFjNTU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3BuZ21lbS5jCkBAIC0wLDAgKzEsMjg0IEBACisKKy8qIHBuZ21lbS5jIC0gc3R1YiBmdW5jdGlvbnMgZm9yIG1lbW9yeSBhbGxvY2F0aW9uCisgKgorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMTUgW05vdmVtYmVyIDIwLCAyMDE0XQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKKyAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKyAqCisgKiBUaGlzIGZpbGUgcHJvdmlkZXMgYSBsb2NhdGlvbiBmb3IgYWxsIG1lbW9yeSBhbGxvY2F0aW9uLiAgVXNlcnMgd2hvCisgKiBuZWVkIHNwZWNpYWwgbWVtb3J5IGhhbmRsaW5nIGFyZSBleHBlY3RlZCB0byBzdXBwbHkgcmVwbGFjZW1lbnQKKyAqIGZ1bmN0aW9ucyBmb3IgcG5nX21hbGxvYygpIGFuZCBwbmdfZnJlZSgpLCBhbmQgdG8gdXNlCisgKiBwbmdfY3JlYXRlX3JlYWRfc3RydWN0XzIoKSBhbmQgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMigpIHRvCisgKiBpZGVudGlmeSB0aGUgcmVwbGFjZW1lbnQgZnVuY3Rpb25zLgorICovCisKKyNpbmNsdWRlICJwbmdwcml2LmgiCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1VQUE9SVEVEKQorLyogRnJlZSBhIHBuZ19zdHJ1Y3QgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2Rlc3Ryb3lfcG5nX3N0cnVjdChwbmdfc3RydWN0cnAgcG5nX3B0cikKK3sKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwpCisgICB7CisgICAgICAvKiBwbmdfZnJlZSBtaWdodCBjYWxsIHBuZ19lcnJvciBhbmQgbWF5IGNlcnRhaW5seSBjYWxsCisgICAgICAgKiBwbmdfZ2V0X21lbV9wdHIsIHNvIGZha2UgYSB0ZW1wb3JhcnkgcG5nX3N0cnVjdCB0byBzdXBwb3J0IHRoaXMuCisgICAgICAgKi8KKyAgICAgIHBuZ19zdHJ1Y3QgZHVtbXlfc3RydWN0ID0gKnBuZ19wdHI7CisgICAgICBtZW1zZXQocG5nX3B0ciwgMCwgKHNpemVvZiAqcG5nX3B0cikpOworICAgICAgcG5nX2ZyZWUoJmR1bW15X3N0cnVjdCwgcG5nX3B0cik7CisKKyMgICAgIGlmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECisgICAgICAgICAvKiBXZSBtYXkgaGF2ZSBhIGptcF9idWYgbGVmdCB0byBkZWFsbG9jYXRlLiAqLworICAgICAgICAgcG5nX2ZyZWVfam1wYnVmKCZkdW1teV9zdHJ1Y3QpOworIyAgICAgZW5kaWYKKyAgIH0KK30KKworLyogQWxsb2NhdGUgbWVtb3J5LiAgRm9yIHJlYXNvbmFibGUgZmlsZXMsIHNpemUgc2hvdWxkIG5ldmVyIGV4Y2VlZAorICogNjRLLiAgSG93ZXZlciwgemxpYiBtYXkgYWxsb2NhdGUgbW9yZSB0aGFuIDY0SyBpZiB5b3UgZG9uJ3QgdGVsbAorICogaXQgbm90IHRvLiAgU2VlIHpjb25mLmggYW5kIHBuZy5oIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgemxpYiBkb2VzCisgKiBuZWVkIHRvIGFsbG9jYXRlIGV4YWN0bHkgNjRLLCBzbyB3aGF0ZXZlciB5b3UgY2FsbCBoZXJlIG11c3QKKyAqIGhhdmUgdGhlIGFiaWxpdHkgdG8gZG8gdGhhdC4KKyAqLworUE5HX0ZVTkNUSU9OKHBuZ192b2lkcCxQTkdBUEkKK3BuZ19jYWxsb2MsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfYWxsb2Nfc2l6ZV90IHNpemUpLFBOR19BTExPQ0FURUQpCit7CisgICBwbmdfdm9pZHAgcmV0OworCisgICByZXQgPSBwbmdfbWFsbG9jKHBuZ19wdHIsIHNpemUpOworCisgICBpZiAocmV0ICE9IE5VTEwpCisgICAgICBtZW1zZXQocmV0LCAwLCBzaXplKTsKKworICAgcmV0dXJuIHJldDsKK30KKworLyogcG5nX21hbGxvY19iYXNlLCBhbiBpbnRlcm5hbCBmdW5jdGlvbiBhZGRlZCBhdCBsaWJwbmcgMS42LjAsIGRvZXMgdGhlIHdvcmsgb2YKKyAqIGFsbG9jYXRpbmcgbWVtb3J5LCB0YWtpbmcgaW50byBhY2NvdW50IGxpbWl0cyBhbmQgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRC4KKyAqIENoZWNraW5nIGFuZCBlcnJvciBoYW5kbGluZyBtdXN0IGhhcHBlbiBvdXRzaWRlIHRoaXMgcm91dGluZTsgaXQgcmV0dXJucyBOVUxMCisgKiBpZiB0aGUgYWxsb2NhdGlvbiBjYW5ub3QgYmUgZG9uZSAoZm9yIGFueSByZWFzb24uKQorICovCitQTkdfRlVOQ1RJT04ocG5nX3ZvaWRwIC8qIFBSSVZBVEUgKi8sCitwbmdfbWFsbG9jX2Jhc2UsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfYWxsb2Nfc2l6ZV90IHNpemUpLAorICAgUE5HX0FMTE9DQVRFRCkKK3sKKyAgIC8qIE1vdmVkIHRvIHBuZ19tYWxsb2NfYmFzZSBmcm9tIHBuZ19tYWxsb2NfZGVmYXVsdCBpbiAxLjYuMDsgdGhlIERPUworICAgICogYWxsb2NhdG9ycyBoYXZlIGFsc28gYmVlbiByZW1vdmVkIGluIDEuNi4wLCBzbyBhbnkgMTYtYml0IHN5c3RlbSBub3cgaGFzCisgICAgKiB0byBpbXBsZW1lbnQgYSB1c2VyIG1lbW9yeSBoYW5kbGVyLiAgVGhpcyBjaGVja3MgdG8gYmUgc3VyZSBpdCBpc24ndAorICAgICogY2FsbGVkIHdpdGggYmlnIG51bWJlcnMuCisgICAgKi8KKyNpZm5kZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAorICAgUE5HX1VOVVNFRChwbmdfcHRyKQorI2VuZGlmCisKKyAgIC8qIFNvbWUgY29tcGlsZXJzIGNvbXBsYWluIHRoYXQgdGhpcyBpcyBhbHdheXMgdHJ1ZS4gIEhvd2V2ZXIsIGl0CisgICAgKiBjYW4gYmUgZmFsc2Ugd2hlbiBpbnRlZ2VyIG92ZXJmbG93IGhhcHBlbnMuCisgICAgKi8KKyAgIGlmIChzaXplID4gMCAmJiBzaXplIDw9IFBOR19TSVpFX01BWAorIyAgICAgaWZkZWYgUE5HX01BWF9NQUxMT0NfNjRLCisgICAgICAgICAmJiBzaXplIDw9IDY1NTM2VQorIyAgICAgZW5kaWYKKyAgICAgICkKKyAgIHsKKyNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECisgICAgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIHBuZ19wdHItPm1hbGxvY19mbiAhPSBOVUxMKQorICAgICAgICAgcmV0dXJuIHBuZ19wdHItPm1hbGxvY19mbihwbmdfY29uc3RjYXN0KHBuZ19zdHJ1Y3RycCxwbmdfcHRyKSwgc2l6ZSk7CisKKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgcmV0dXJuIG1hbGxvYygoc2l6ZV90KXNpemUpOyAvKiBjaGVja2VkIGZvciB0cnVuY2F0aW9uIGFib3ZlICovCisgICB9CisKKyAgIGVsc2UKKyAgICAgIHJldHVybiBOVUxMOworfQorCisjaWYgZGVmaW5lZChQTkdfVEVYVF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX3NQTFRfU1VQUE9SVEVEKSB8fFwKKyAgIGRlZmluZWQoUE5HX1NUT1JFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkKKy8qIFRoaXMgaXMgcmVhbGx5IGhlcmUgb25seSB0byB3b3JrIHJvdW5kIGEgc3B1cmlvdXMgd2FybmluZyBpbiBHQ0MgNC42IGFuZCA0LjcKKyAqIHRoYXQgYXJpc2VzIGJlY2F1c2Ugb2YgdGhlIGNoZWNrcyBpbiBwbmdfcmVhbGxvY19hcnJheSB0aGF0IGFyZSByZXBlYXRlZCBpbgorICogcG5nX21hbGxvY19hcnJheS4KKyAqLworc3RhdGljIHBuZ192b2lkcAorcG5nX21hbGxvY19hcnJheV9jaGVja2VkKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgbmVsZW1lbnRzLAorICAgc2l6ZV90IGVsZW1lbnRfc2l6ZSkKK3sKKyAgIHBuZ19hbGxvY19zaXplX3QgcmVxID0gbmVsZW1lbnRzOyAvKiBrbm93biB0byBiZSA+IDAgKi8KKworICAgaWYgKHJlcSA8PSBQTkdfU0laRV9NQVgvZWxlbWVudF9zaXplKQorICAgICAgcmV0dXJuIHBuZ19tYWxsb2NfYmFzZShwbmdfcHRyLCByZXEgKiBlbGVtZW50X3NpemUpOworCisgICAvKiBUaGUgZmFpbHVyZSBjYXNlIHdoZW4gdGhlIHJlcXVlc3QgaXMgdG9vIGxhcmdlICovCisgICByZXR1cm4gTlVMTDsKK30KKworUE5HX0ZVTkNUSU9OKHBuZ192b2lkcCAvKiBQUklWQVRFICovLAorcG5nX21hbGxvY19hcnJheSwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIGludCBuZWxlbWVudHMsCisgICBzaXplX3QgZWxlbWVudF9zaXplKSxQTkdfQUxMT0NBVEVEKQoreworICAgaWYgKG5lbGVtZW50cyA8PSAwIHx8IGVsZW1lbnRfc2l6ZSA9PSAwKQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJpbnRlcm5hbCBlcnJvcjogYXJyYXkgYWxsb2MiKTsKKworICAgcmV0dXJuIHBuZ19tYWxsb2NfYXJyYXlfY2hlY2tlZChwbmdfcHRyLCBuZWxlbWVudHMsIGVsZW1lbnRfc2l6ZSk7Cit9CisKK1BOR19GVU5DVElPTihwbmdfdm9pZHAgLyogUFJJVkFURSAqLywKK3BuZ19yZWFsbG9jX2FycmF5LChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X3ZvaWRwIG9sZF9hcnJheSwKKyAgIGludCBvbGRfZWxlbWVudHMsIGludCBhZGRfZWxlbWVudHMsIHNpemVfdCBlbGVtZW50X3NpemUpLFBOR19BTExPQ0FURUQpCit7CisgICAvKiBUaGVzZSBhcmUgaW50ZXJuYWwgZXJyb3JzOiAqLworICAgaWYgKGFkZF9lbGVtZW50cyA8PSAwIHx8IGVsZW1lbnRfc2l6ZSA9PSAwIHx8IG9sZF9lbGVtZW50cyA8IDAgfHwKKyAgICAgIChvbGRfYXJyYXkgPT0gTlVMTCAmJiBvbGRfZWxlbWVudHMgPiAwKSkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiaW50ZXJuYWwgZXJyb3I6IGFycmF5IHJlYWxsb2MiKTsKKworICAgLyogQ2hlY2sgZm9yIG92ZXJmbG93IG9uIHRoZSBlbGVtZW50cyBjb3VudCAoc28gdGhlIGNhbGxlciBkb2VzIG5vdCBoYXZlIHRvCisgICAgKiBjaGVjay4pCisgICAgKi8KKyAgIGlmIChhZGRfZWxlbWVudHMgPD0gSU5UX01BWCAtIG9sZF9lbGVtZW50cykKKyAgIHsKKyAgICAgIHBuZ192b2lkcCBuZXdfYXJyYXkgPSBwbmdfbWFsbG9jX2FycmF5X2NoZWNrZWQocG5nX3B0ciwKKyAgICAgICAgIG9sZF9lbGVtZW50cythZGRfZWxlbWVudHMsIGVsZW1lbnRfc2l6ZSk7CisKKyAgICAgIGlmIChuZXdfYXJyYXkgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIC8qIEJlY2F1c2UgcG5nX21hbGxvY19hcnJheSB3b3JrZWQgdGhlIHNpemUgY2FsY3VsYXRpb25zIGJlbG93IGNhbm5vdAorICAgICAgICAgICogb3ZlcmZsb3cuCisgICAgICAgICAgKi8KKyAgICAgICAgIGlmIChvbGRfZWxlbWVudHMgPiAwKQorICAgICAgICAgICAgbWVtY3B5KG5ld19hcnJheSwgb2xkX2FycmF5LCBlbGVtZW50X3NpemUqKHVuc2lnbmVkKW9sZF9lbGVtZW50cyk7CisKKyAgICAgICAgIG1lbXNldCgoY2hhciopbmV3X2FycmF5ICsgZWxlbWVudF9zaXplKih1bnNpZ25lZClvbGRfZWxlbWVudHMsIDAsCisgICAgICAgICAgICBlbGVtZW50X3NpemUqKHVuc2lnbmVkKWFkZF9lbGVtZW50cyk7CisKKyAgICAgICAgIHJldHVybiBuZXdfYXJyYXk7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiBOVUxMOyAvKiBlcnJvciAqLworfQorI2VuZGlmIC8qIFRFWFQgfHwgc1BMVCB8fCBTVE9SRV9VTktOT1dOX0NIVU5LUyAqLworCisvKiBWYXJpb3VzIGZ1bmN0aW9ucyB0aGF0IGhhdmUgZGlmZmVyZW50IGVycm9yIGhhbmRsaW5nIGFyZSBkZXJpdmVkIGZyb20gdGhpcy4KKyAqIHBuZ19tYWxsb2MgYWx3YXlzIGV4aXN0cywgYnV0IGlmIFBOR19VU0VSX01FTV9TVVBQT1JURUQgaXMgZGVmaW5lZCBhIHNlcGFyYXRlCisgKiBmdW5jdGlvbiBwbmdfbWFsbG9jX2RlZmF1bHQgaXMgYWxzbyBwcm92aWRlZC4KKyAqLworUE5HX0ZVTkNUSU9OKHBuZ192b2lkcCxQTkdBUEkKK3BuZ19tYWxsb2MsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfYWxsb2Nfc2l6ZV90IHNpemUpLFBOR19BTExPQ0FURUQpCit7CisgICBwbmdfdm9pZHAgcmV0OworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIHJldCA9IHBuZ19tYWxsb2NfYmFzZShwbmdfcHRyLCBzaXplKTsKKworICAgaWYgKHJldCA9PSBOVUxMKQorICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiT3V0IG9mIG1lbW9yeSIpOyAvKiAnbScgbWVhbnMgcG5nX21hbGxvYyAqLworCisgICByZXR1cm4gcmV0OworfQorCisjaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAorUE5HX0ZVTkNUSU9OKHBuZ192b2lkcCxQTkdBUEkKK3BuZ19tYWxsb2NfZGVmYXVsdCwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19hbGxvY19zaXplX3Qgc2l6ZSksCisgICBQTkdfQUxMT0NBVEVEIFBOR19ERVBSRUNBVEVEKQoreworICAgcG5nX3ZvaWRwIHJldDsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybiBOVUxMOworCisgICAvKiBQYXNzaW5nICdOVUxMJyBoZXJlIGJ5cGFzc2VzIHRoZSBhcHBsaWNhdGlvbiBwcm92aWRlZCBtZW1vcnkgaGFuZGxlci4gKi8KKyAgIHJldCA9IHBuZ19tYWxsb2NfYmFzZShOVUxMLyp1c2UgbWFsbG9jKi8sIHNpemUpOworCisgICBpZiAocmV0ID09IE5VTEwpCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk91dCBvZiBNZW1vcnkiKTsgLyogJ00nIG1lYW5zIHBuZ19tYWxsb2NfZGVmYXVsdCAqLworCisgICByZXR1cm4gcmV0OworfQorI2VuZGlmIC8qIFVTRVJfTUVNICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2FzIGFkZGVkIGF0IGxpYnBuZyB2ZXJzaW9uIDEuMi4zLiAgVGhlIHBuZ19tYWxsb2Nfd2FybigpCisgKiBmdW5jdGlvbiB3aWxsIGlzc3VlIGEgcG5nX3dhcm5pbmcgYW5kIHJldHVybiBOVUxMIGluc3RlYWQgb2YgaXNzdWluZyBhCisgKiBwbmdfZXJyb3IsIGlmIGl0IGZhaWxzIHRvIGFsbG9jYXRlIHRoZSByZXF1ZXN0ZWQgbWVtb3J5LgorICovCitQTkdfRlVOQ1RJT04ocG5nX3ZvaWRwLFBOR0FQSQorcG5nX21hbGxvY193YXJuLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2FsbG9jX3NpemVfdCBzaXplKSwKKyAgIFBOR19BTExPQ0FURUQpCit7CisgICBpZiAocG5nX3B0ciAhPSBOVUxMKQorICAgeworICAgICAgcG5nX3ZvaWRwIHJldCA9IHBuZ19tYWxsb2NfYmFzZShwbmdfcHRyLCBzaXplKTsKKworICAgICAgaWYgKHJldCAhPSBOVUxMKQorICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk91dCBvZiBtZW1vcnkiKTsKKyAgIH0KKworICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIEZyZWUgYSBwb2ludGVyIGFsbG9jYXRlZCBieSBwbmdfbWFsbG9jKCkuICBJZiBwdHIgaXMgTlVMTCwgcmV0dXJuCisgKiB3aXRob3V0IHRha2luZyBhbnkgYWN0aW9uLgorICovCit2b2lkIFBOR0FQSQorcG5nX2ZyZWUocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ192b2lkcCBwdHIpCit7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IHB0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisjaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHItPmZyZWVfZm4gIT0gTlVMTCkKKyAgICAgIHBuZ19wdHItPmZyZWVfZm4ocG5nX2NvbnN0Y2FzdChwbmdfc3RydWN0cnAscG5nX3B0ciksIHB0cik7CisKKyAgIGVsc2UKKyAgICAgIHBuZ19mcmVlX2RlZmF1bHQocG5nX3B0ciwgcHRyKTsKK30KKworUE5HX0ZVTkNUSU9OKHZvaWQsUE5HQVBJCitwbmdfZnJlZV9kZWZhdWx0LChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3ZvaWRwIHB0ciksUE5HX0RFUFJFQ0FURUQpCit7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IHB0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworI2VuZGlmIC8qIFVTRVJfTUVNICovCisKKyAgIGZyZWUocHRyKTsKK30KKworI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHdhbnRzIHRvIHVzZSBhbm90aGVyIG1ldGhvZAorICogb2YgYWxsb2NhdGluZyBhbmQgZnJlZWluZyBtZW1vcnkuCisgKi8KK3ZvaWQgUE5HQVBJCitwbmdfc2V0X21lbV9mbihwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3ZvaWRwIG1lbV9wdHIsIHBuZ19tYWxsb2NfcHRyCisgIG1hbGxvY19mbiwgcG5nX2ZyZWVfcHRyIGZyZWVfZm4pCit7CisgICBpZiAocG5nX3B0ciAhPSBOVUxMKQorICAgeworICAgICAgcG5nX3B0ci0+bWVtX3B0ciA9IG1lbV9wdHI7CisgICAgICBwbmdfcHRyLT5tYWxsb2NfZm4gPSBtYWxsb2NfZm47CisgICAgICBwbmdfcHRyLT5mcmVlX2ZuID0gZnJlZV9mbjsKKyAgIH0KK30KKworLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbWVtX3B0ciBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIKKyAqIGZ1bmN0aW9ucy4gIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZnJlZSBhbnkgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgKiBwb2ludGVyIGJlZm9yZSBwbmdfd3JpdGVfZGVzdHJveSBhbmQgcG5nX3JlYWRfZGVzdHJveSBhcmUgY2FsbGVkLgorICovCitwbmdfdm9pZHAgUE5HQVBJCitwbmdfZ2V0X21lbV9wdHIocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpCit7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIHJldHVybiBwbmdfcHRyLT5tZW1fcHRyOworfQorI2VuZGlmIC8qIFVTRVJfTUVNICovCisjZW5kaWYgLyogUkVBRCB8fCBXUklURSAqLwpkaWZmIC0tZ2l0IGEvbGlicG5nL3BuZ25vdy5wbmcgYi9saWJwbmcvcG5nbm93LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjc5M2ViCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3BuZ25vdy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicG5nL3BuZ3ByZWFkLmMgYi9saWJwbmcvcG5ncHJlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWZmYzQwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3BuZ3ByZWFkLmMKQEAgLTAsMCArMSwxMDg1IEBACisKKy8qIHBuZ3ByZWFkLmMgLSByZWFkIGEgcG5nIGZpbGUgaW4gcHVzaCBtb2RlCisgKgorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMTggW0p1bHkgMjMsIDIwMTVdCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNSBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQorICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisgKiBhbmQgbGljZW5zZSBpbiBwbmcuaAorICovCisKKyNpbmNsdWRlICJwbmdwcml2LmgiCisKKyNpZmRlZiBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQKKworLyogUHVzaCBtb2RlbCBtb2RlcyAqLworI2RlZmluZSBQTkdfUkVBRF9TSUdfTU9ERSAgIDAKKyNkZWZpbmUgUE5HX1JFQURfQ0hVTktfTU9ERSAxCisjZGVmaW5lIFBOR19SRUFEX0lEQVRfTU9ERSAgMgorI2RlZmluZSBQTkdfUkVBRF90RVh0X01PREUgIDQKKyNkZWZpbmUgUE5HX1JFQURfelRYdF9NT0RFICA1CisjZGVmaW5lIFBOR19SRUFEX0RPTkVfTU9ERSAgNgorI2RlZmluZSBQTkdfUkVBRF9pVFh0X01PREUgIDcKKyNkZWZpbmUgUE5HX0VSUk9SX01PREUgICAgICA4CisKKyNkZWZpbmUgUE5HX1BVU0hfU0FWRV9CVUZGRVJfSUZfRlVMTCBcCitpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggKyA0ID4gcG5nX3B0ci0+YnVmZmVyX3NpemUpIFwKKyAgIHsgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7IHJldHVybjsgfQorI2RlZmluZSBQTkdfUFVTSF9TQVZFX0JVRkZFUl9JRl9MVChOKSBcCitpZiAocG5nX3B0ci0+YnVmZmVyX3NpemUgPCBOKSBcCisgICB7IHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOyByZXR1cm47IH0KKwordm9pZCBQTkdBUEkKK3BuZ19wcm9jZXNzX2RhdGEocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsCisgICAgcG5nX2J5dGVwIGJ1ZmZlciwgcG5nX3NpemVfdCBidWZmZXJfc2l6ZSkKK3sKKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgcG5nX3B1c2hfcmVzdG9yZV9idWZmZXIocG5nX3B0ciwgYnVmZmVyLCBidWZmZXJfc2l6ZSk7CisKKyAgIHdoaWxlIChwbmdfcHRyLT5idWZmZXJfc2l6ZSkKKyAgIHsKKyAgICAgIHBuZ19wcm9jZXNzX3NvbWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0cik7CisgICB9Cit9CisKK3BuZ19zaXplX3QgUE5HQVBJCitwbmdfcHJvY2Vzc19kYXRhX3BhdXNlKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgc2F2ZSkKK3sKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwpCisgICB7CisgICAgICAvKiBJdCdzIGVhc2llc3QgZm9yIHRoZSBjYWxsZXIgaWYgd2UgZG8gdGhlIHNhdmU7IHRoZW4gdGhlIGNhbGxlciBkb2Vzbid0CisgICAgICAgKiBoYXZlIHRvIHN1cHBseSB0aGUgc2FtZSBkYXRhIGFnYWluOgorICAgICAgICovCisgICAgICBpZiAoc2F2ZSAhPSAwKQorICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICAvKiBUaGlzIGluY2x1ZGVzIGFueSBwZW5kaW5nIHNhdmVkIGJ5dGVzOiAqLworICAgICAgICAgcG5nX3NpemVfdCByZW1haW5pbmcgPSBwbmdfcHRyLT5idWZmZXJfc2l6ZTsKKyAgICAgICAgIHBuZ19wdHItPmJ1ZmZlcl9zaXplID0gMDsKKworICAgICAgICAgLyogU28gc3VidHJhY3QgdGhlIHNhdmVkIGJ1ZmZlciBzaXplLCB1bmxlc3MgYWxsIHRoZSBkYXRhCisgICAgICAgICAgKiBpcyBhY3R1YWxseSAnc2F2ZWQnLCBpbiB3aGljaCBjYXNlIHdlIGp1c3QgcmV0dXJuIDAKKyAgICAgICAgICAqLworICAgICAgICAgaWYgKHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemUgPCByZW1haW5pbmcpCisgICAgICAgICAgICByZXR1cm4gcmVtYWluaW5nIC0gcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZTsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX3Byb2Nlc3NfZGF0YV9za2lwKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQoreworICAvKiBUT0RPOiBEZXByZWNhdGUgYW5kIHJlbW92ZSB0aGlzIEFQSS4KKyAgICogU29tZXdoZXJlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIHNlZW1zIHRvIGhhdmUgYmVlbiBsb3N0LAorICAgKiBvciBhYmFuZG9uZWQuICBJdCB3YXMgb25seSB0byBzdXBwb3J0IHNvbWUgaW50ZXJuYWwgYmFjay1kb29yIGFjY2VzcworICAgKiB0byBwbmdfc3RydWN0KSBpbiBsaWJwbmctMS40LnguCisgICAqLworICAgcG5nX2FwcF93YXJuaW5nKHBuZ19wdHIsCisicG5nX3Byb2Nlc3NfZGF0YV9za2lwIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiBhbnkgY3VycmVudCB2ZXJzaW9uIG9mIGxpYnBuZyIpOworICAgcmV0dXJuIDA7Cit9CisKKy8qIFdoYXQgd2UgZG8gd2l0aCB0aGUgaW5jb21pbmcgZGF0YSBkZXBlbmRzIG9uIHdoYXQgd2Ugd2VyZSBwcmV2aW91c2x5CisgKiBkb2luZyBiZWZvcmUgd2UgcmFuIG91dCBvZiBkYXRhLi4uCisgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3Byb2Nlc3Nfc29tZV9kYXRhKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyKQoreworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgc3dpdGNoIChwbmdfcHRyLT5wcm9jZXNzX21vZGUpCisgICB7CisgICAgICBjYXNlIFBOR19SRUFEX1NJR19NT0RFOgorICAgICAgeworICAgICAgICAgcG5nX3B1c2hfcmVhZF9zaWcocG5nX3B0ciwgaW5mb19wdHIpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgUE5HX1JFQURfQ0hVTktfTU9ERToKKyAgICAgIHsKKyAgICAgICAgIHBuZ19wdXNoX3JlYWRfY2h1bmsocG5nX3B0ciwgaW5mb19wdHIpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgUE5HX1JFQURfSURBVF9NT0RFOgorICAgICAgeworICAgICAgICAgcG5nX3B1c2hfcmVhZF9JREFUKHBuZ19wdHIpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICB7CisgICAgICAgICBwbmdfcHRyLT5idWZmZXJfc2l6ZSA9IDA7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgIH0KK30KKworLyogUmVhZCBhbnkgcmVtYWluaW5nIHNpZ25hdHVyZSBieXRlcyBmcm9tIHRoZSBzdHJlYW0gYW5kIGNvbXBhcmUgdGhlbSB3aXRoCisgKiB0aGUgY29ycmVjdCBQTkcgc2lnbmF0dXJlLiAgSXQgaXMgcG9zc2libGUgdGhhdCB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkCisgKiB3aXRoIGJ5dGVzIGFscmVhZHkgcmVhZCBmcm9tIHRoZSBzaWduYXR1cmUsIGVpdGhlciBiZWNhdXNlIHRoZXkgaGF2ZSBiZWVuCisgKiBjaGVja2VkIGJ5IHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uLCBvciBiZWNhdXNlIG9mIG11bHRpcGxlIGNhbGxzIHRvIHRoaXMKKyAqIHJvdXRpbmUuCisgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3B1c2hfcmVhZF9zaWcocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIpCit7CisgICBwbmdfc2l6ZV90IG51bV9jaGVja2VkID0gcG5nX3B0ci0+c2lnX2J5dGVzLCAvKiBTQUZFLCBkb2VzIG5vdCBleGNlZWQgOCAqLworICAgICAgIG51bV90b19jaGVjayA9IDggLSBudW1fY2hlY2tlZDsKKworICAgaWYgKHBuZ19wdHItPmJ1ZmZlcl9zaXplIDwgbnVtX3RvX2NoZWNrKQorICAgeworICAgICAgbnVtX3RvX2NoZWNrID0gcG5nX3B0ci0+YnVmZmVyX3NpemU7CisgICB9CisKKyAgIHBuZ19wdXNoX2ZpbGxfYnVmZmVyKHBuZ19wdHIsICYoaW5mb19wdHItPnNpZ25hdHVyZVtudW1fY2hlY2tlZF0pLAorICAgICAgIG51bV90b19jaGVjayk7CisgICBwbmdfcHRyLT5zaWdfYnl0ZXMgPSAocG5nX2J5dGUpKHBuZ19wdHItPnNpZ19ieXRlcyArIG51bV90b19jaGVjayk7CisKKyAgIGlmIChwbmdfc2lnX2NtcChpbmZvX3B0ci0+c2lnbmF0dXJlLCBudW1fY2hlY2tlZCwgbnVtX3RvX2NoZWNrKSkKKyAgIHsKKyAgICAgIGlmIChudW1fY2hlY2tlZCA8IDQgJiYKKyAgICAgICAgICBwbmdfc2lnX2NtcChpbmZvX3B0ci0+c2lnbmF0dXJlLCBudW1fY2hlY2tlZCwgbnVtX3RvX2NoZWNrIC0gNCkpCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk5vdCBhIFBORyBmaWxlIik7CisKKyAgICAgIGVsc2UKKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiUE5HIGZpbGUgY29ycnVwdGVkIGJ5IEFTQ0lJIGNvbnZlcnNpb24iKTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIGlmIChwbmdfcHRyLT5zaWdfYnl0ZXMgPj0gOCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19wdHItPnByb2Nlc3NfbW9kZSA9IFBOR19SRUFEX0NIVU5LX01PREU7CisgICAgICB9CisgICB9Cit9CisKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3B1c2hfcmVhZF9jaHVuayhwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0cikKK3sKKyAgIHBuZ191aW50XzMyIGNodW5rX25hbWU7CisjaWZkZWYgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRAorICAgaW50IGtlZXA7IC8qIHVua25vd24gaGFuZGxpbmcgbWV0aG9kICovCisjZW5kaWYKKworICAgLyogRmlyc3Qgd2UgbWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIGRhdGEgZm9yIHRoZSA0LWJ5dGUgY2h1bmsgbmFtZQorICAgICogYW5kIHRoZSA0LWJ5dGUgY2h1bmsgbGVuZ3RoIGJlZm9yZSBwcm9jZWVkaW5nIHdpdGggZGVjb2RpbmcgdGhlCisgICAgKiBjaHVuayBkYXRhLiAgVG8gZnVsbHkgZGVjb2RlIGVhY2ggb2YgdGhlc2UgY2h1bmtzLCB3ZSBhbHNvIG1ha2UKKyAgICAqIHN1cmUgd2UgaGF2ZSBlbm91Z2ggZGF0YSBpbiB0aGUgYnVmZmVyIGZvciB0aGUgNC1ieXRlIENSQyBhdCB0aGUKKyAgICAqIGVuZCBvZiBldmVyeSBjaHVuayAoZXhjZXB0IElEQVQsIHdoaWNoIGlzIGhhbmRsZWQgc2VwYXJhdGVseSkuCisgICAgKi8KKyAgIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0NIVU5LX0hFQURFUikgPT0gMCkKKyAgIHsKKyAgICAgIHBuZ19ieXRlIGNodW5rX2xlbmd0aFs0XTsKKyAgICAgIHBuZ19ieXRlIGNodW5rX3RhZ1s0XTsKKworICAgICAgUE5HX1BVU0hfU0FWRV9CVUZGRVJfSUZfTFQoOCkKKyAgICAgIHBuZ19wdXNoX2ZpbGxfYnVmZmVyKHBuZ19wdHIsIGNodW5rX2xlbmd0aCwgNCk7CisgICAgICBwbmdfcHRyLT5wdXNoX2xlbmd0aCA9IHBuZ19nZXRfdWludF8zMShwbmdfcHRyLCBjaHVua19sZW5ndGgpOworICAgICAgcG5nX3Jlc2V0X2NyYyhwbmdfcHRyKTsKKyAgICAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBjaHVua190YWcsIDQpOworICAgICAgcG5nX3B0ci0+Y2h1bmtfbmFtZSA9IFBOR19DSFVOS19GUk9NX1NUUklORyhjaHVua190YWcpOworICAgICAgcG5nX2NoZWNrX2NodW5rX25hbWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtfbmFtZSk7CisgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX0NIVU5LX0hFQURFUjsKKyAgIH0KKworICAgY2h1bmtfbmFtZSA9IHBuZ19wdHItPmNodW5rX25hbWU7CisKKyAgIGlmIChjaHVua19uYW1lID09IHBuZ19JREFUKQorICAgeworICAgICAgaWYgKChwbmdfcHRyLT5tb2RlICYgUE5HX0FGVEVSX0lEQVQpICE9IDApCisgICAgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX0NIVU5LX0FGVEVSX0lEQVQ7CisKKyAgICAgIC8qIElmIHdlIHJlYWNoIGFuIElEQVQgY2h1bmssIHRoaXMgbWVhbnMgd2UgaGF2ZSByZWFkIGFsbCBvZiB0aGUKKyAgICAgICAqIGhlYWRlciBjaHVua3MsIGFuZCB3ZSBjYW4gc3RhcnQgcmVhZGluZyB0aGUgaW1hZ2UgKG9yIGlmIHRoaXMKKyAgICAgICAqIGlzIGNhbGxlZCBhZnRlciB0aGUgaW1hZ2UgaGFzIGJlZW4gcmVhZCAtIHdlIGhhdmUgYW4gZXJyb3IpLgorICAgICAgICovCisgICAgICBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSA9PSAwKQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIElIRFIgYmVmb3JlIElEQVQiKTsKKworICAgICAgZWxzZSBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFICYmCisgICAgICAgICAgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9QTFRFKSA9PSAwKQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIFBMVEUgYmVmb3JlIElEQVQiKTsKKworICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfSEFWRV9JREFUOworICAgICAgcG5nX3B0ci0+cHJvY2Vzc19tb2RlID0gUE5HX1JFQURfSURBVF9NT0RFOworCisgICAgICBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9DSFVOS19BRlRFUl9JREFUKSA9PSAwKQorICAgICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoID09IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19BRlRFUl9JREFUKSAhPSAwKQorICAgICAgICAgcG5nX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiVG9vIG1hbnkgSURBVHMgZm91bmQiKTsKKyAgIH0KKworICAgaWYgKGNodW5rX25hbWUgPT0gcG5nX0lIRFIpCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggIT0gMTMpCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgSUhEUiBsZW5ndGgiKTsKKworICAgICAgUE5HX1BVU0hfU0FWRV9CVUZGRVJfSUZfRlVMTAorICAgICAgcG5nX2hhbmRsZV9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7CisgICB9CisKKyAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX0lFTkQpCisgICB7CisgICAgICBQTkdfUFVTSF9TQVZFX0JVRkZFUl9JRl9GVUxMCisgICAgICBwbmdfaGFuZGxlX0lFTkQocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKKworICAgICAgcG5nX3B0ci0+cHJvY2Vzc19tb2RlID0gUE5HX1JFQURfRE9ORV9NT0RFOworICAgICAgcG5nX3B1c2hfaGF2ZV9lbmQocG5nX3B0ciwgaW5mb19wdHIpOworICAgfQorCisjaWZkZWYgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRAorICAgZWxzZSBpZiAoKGtlZXAgPSBwbmdfY2h1bmtfdW5rbm93bl9oYW5kbGluZyhwbmdfcHRyLCBjaHVua19uYW1lKSkgIT0gMCkKKyAgIHsKKyAgICAgIFBOR19QVVNIX1NBVkVfQlVGRkVSX0lGX0ZVTEwKKyAgICAgIHBuZ19oYW5kbGVfdW5rbm93bihwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgsIGtlZXApOworCisgICAgICBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfUExURSkKKyAgICAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfUExURTsKKyAgIH0KKyNlbmRpZgorCisgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19QTFRFKQorICAgeworICAgICAgUE5HX1BVU0hfU0FWRV9CVUZGRVJfSUZfRlVMTAorICAgICAgcG5nX2hhbmRsZV9QTFRFKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7CisgICB9CisKKyAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX0lEQVQpCisgICB7CisgICAgICBwbmdfcHRyLT5pZGF0X3NpemUgPSBwbmdfcHRyLT5wdXNoX2xlbmd0aDsKKyAgICAgIHBuZ19wdHItPnByb2Nlc3NfbW9kZSA9IFBOR19SRUFEX0lEQVRfTU9ERTsKKyAgICAgIHBuZ19wdXNoX2hhdmVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7CisgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9CisgICAgICAgICAgKHVJbnQpIFBOR19ST1dCWVRFUyhwbmdfcHRyLT5waXhlbF9kZXB0aCwKKyAgICAgICAgICBwbmdfcHRyLT5pd2lkdGgpICsgMTsKKyAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBwbmdfcHRyLT5yb3dfYnVmOworICAgICAgcmV0dXJuOworICAgfQorCisjaWZkZWYgUE5HX1JFQURfZ0FNQV9TVVBQT1JURUQKKyAgIGVsc2UgaWYgKHBuZ19wdHItPmNodW5rX25hbWUgPT0gcG5nX2dBTUEpCisgICB7CisgICAgICBQTkdfUFVTSF9TQVZFX0JVRkZFUl9JRl9GVUxMCisgICAgICBwbmdfaGFuZGxlX2dBTUEocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKKyAgIH0KKworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfc0JJVF9TVVBQT1JURUQKKyAgIGVsc2UgaWYgKHBuZ19wdHItPmNodW5rX25hbWUgPT0gcG5nX3NCSVQpCisgICB7CisgICAgICBQTkdfUFVTSF9TQVZFX0JVRkZFUl9JRl9GVUxMCisgICAgICBwbmdfaGFuZGxlX3NCSVQocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKKyAgIH0KKworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfY0hSTV9TVVBQT1JURUQKKyAgIGVsc2UgaWYgKHBuZ19wdHItPmNodW5rX25hbWUgPT0gcG5nX2NIUk0pCisgICB7CisgICAgICBQTkdfUFVTSF9TQVZFX0JVRkZFUl9JRl9GVUxMCisgICAgICBwbmdfaGFuZGxlX2NIUk0ocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKKyAgIH0KKworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfc1JHQl9TVVBQT1JURUQKKyAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX3NSR0IpCisgICB7CisgICAgICBQTkdfUFVTSF9TQVZFX0JVRkZFUl9JRl9GVUxMCisgICAgICBwbmdfaGFuZGxlX3NSR0IocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKKyAgIH0KKworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfaUNDUF9TVVBQT1JURUQKKyAgIGVsc2UgaWYgKHBuZ19wdHItPmNodW5rX25hbWUgPT0gcG5nX2lDQ1ApCisgICB7CisgICAgICBQTkdfUFVTSF9TQVZFX0JVRkZFUl9JRl9GVUxMCisgICAgICBwbmdfaGFuZGxlX2lDQ1AocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKKyAgIH0KKworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfc1BMVF9TVVBQT1JURUQKKyAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX3NQTFQpCisgICB7CisgICAgICBQTkdfUFVTSF9TQVZFX0JVRkZFUl9JRl9GVUxMCisgICAgICBwbmdfaGFuZGxlX3NQTFQocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKKyAgIH0KKworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfdFJOU19TVVBQT1JURUQKKyAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX3RSTlMpCisgICB7CisgICAgICBQTkdfUFVTSF9TQVZFX0JVRkZFUl9JRl9GVUxMCisgICAgICBwbmdfaGFuZGxlX3RSTlMocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKKyAgIH0KKworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfYktHRF9TVVBQT1JURUQKKyAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX2JLR0QpCisgICB7CisgICAgICBQTkdfUFVTSF9TQVZFX0JVRkZFUl9JRl9GVUxMCisgICAgICBwbmdfaGFuZGxlX2JLR0QocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKKyAgIH0KKworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfaElTVF9TVVBQT1JURUQKKyAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX2hJU1QpCisgICB7CisgICAgICBQTkdfUFVTSF9TQVZFX0JVRkZFUl9JRl9GVUxMCisgICAgICBwbmdfaGFuZGxlX2hJU1QocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKKyAgIH0KKworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfcEhZc19TVVBQT1JURUQKKyAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX3BIWXMpCisgICB7CisgICAgICBQTkdfUFVTSF9TQVZFX0JVRkZFUl9JRl9GVUxMCisgICAgICBwbmdfaGFuZGxlX3BIWXMocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKKyAgIH0KKworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfb0ZGc19TVVBQT1JURUQKKyAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX29GRnMpCisgICB7CisgICAgICBQTkdfUFVTSF9TQVZFX0JVRkZFUl9JRl9GVUxMCisgICAgICBwbmdfaGFuZGxlX29GRnMocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKKyAgIH0KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfcENBTF9TVVBQT1JURUQKKyAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX3BDQUwpCisgICB7CisgICAgICBQTkdfUFVTSF9TQVZFX0JVRkZFUl9JRl9GVUxMCisgICAgICBwbmdfaGFuZGxlX3BDQUwocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKKyAgIH0KKworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfc0NBTF9TVVBQT1JURUQKKyAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX3NDQUwpCisgICB7CisgICAgICBQTkdfUFVTSF9TQVZFX0JVRkZFUl9JRl9GVUxMCisgICAgICBwbmdfaGFuZGxlX3NDQUwocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKKyAgIH0KKworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfdElNRV9TVVBQT1JURUQKKyAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX3RJTUUpCisgICB7CisgICAgICBQTkdfUFVTSF9TQVZFX0JVRkZFUl9JRl9GVUxMCisgICAgICBwbmdfaGFuZGxlX3RJTUUocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKKyAgIH0KKworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfdEVYdF9TVVBQT1JURUQKKyAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX3RFWHQpCisgICB7CisgICAgICBQTkdfUFVTSF9TQVZFX0JVRkZFUl9JRl9GVUxMCisgICAgICBwbmdfaGFuZGxlX3RFWHQocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKKyAgIH0KKworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfelRYdF9TVVBQT1JURUQKKyAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX3pUWHQpCisgICB7CisgICAgICBQTkdfUFVTSF9TQVZFX0JVRkZFUl9JRl9GVUxMCisgICAgICBwbmdfaGFuZGxlX3pUWHQocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKKyAgIH0KKworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfaVRYdF9TVVBQT1JURUQKKyAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX2lUWHQpCisgICB7CisgICAgICBQTkdfUFVTSF9TQVZFX0JVRkZFUl9JRl9GVUxMCisgICAgICBwbmdfaGFuZGxlX2lUWHQocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKKyAgIH0KKyNlbmRpZgorCisgICBlbHNlCisgICB7CisgICAgICBQTkdfUFVTSF9TQVZFX0JVRkZFUl9JRl9GVUxMCisgICAgICBwbmdfaGFuZGxlX3Vua25vd24ocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoLAorICAgICAgICAgUE5HX0hBTkRMRV9DSFVOS19BU19ERUZBVUxUKTsKKyAgIH0KKworICAgcG5nX3B0ci0+bW9kZSAmPSB+UE5HX0hBVkVfQ0hVTktfSEVBREVSOworfQorCit2b2lkIFBOR0NCQVBJCitwbmdfcHVzaF9maWxsX2J1ZmZlcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgYnVmZmVyLCBwbmdfc2l6ZV90IGxlbmd0aCkKK3sKKyAgIHBuZ19ieXRlcCBwdHI7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIHB0ciA9IGJ1ZmZlcjsKKyAgIGlmIChwbmdfcHRyLT5zYXZlX2J1ZmZlcl9zaXplICE9IDApCisgICB7CisgICAgICBwbmdfc2l6ZV90IHNhdmVfc2l6ZTsKKworICAgICAgaWYgKGxlbmd0aCA8IHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemUpCisgICAgICAgICBzYXZlX3NpemUgPSBsZW5ndGg7CisKKyAgICAgIGVsc2UKKyAgICAgICAgIHNhdmVfc2l6ZSA9IHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemU7CisKKyAgICAgIG1lbWNweShwdHIsIHBuZ19wdHItPnNhdmVfYnVmZmVyX3B0ciwgc2F2ZV9zaXplKTsKKyAgICAgIGxlbmd0aCAtPSBzYXZlX3NpemU7CisgICAgICBwdHIgKz0gc2F2ZV9zaXplOworICAgICAgcG5nX3B0ci0+YnVmZmVyX3NpemUgLT0gc2F2ZV9zaXplOworICAgICAgcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSAtPSBzYXZlX3NpemU7CisgICAgICBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9wdHIgKz0gc2F2ZV9zaXplOworICAgfQorICAgaWYgKGxlbmd0aCAhPSAwICYmIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3NpemUgIT0gMCkKKyAgIHsKKyAgICAgIHBuZ19zaXplX3Qgc2F2ZV9zaXplOworCisgICAgICBpZiAobGVuZ3RoIDwgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSkKKyAgICAgICAgIHNhdmVfc2l6ZSA9IGxlbmd0aDsKKworICAgICAgZWxzZQorICAgICAgICAgc2F2ZV9zaXplID0gcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZTsKKworICAgICAgbWVtY3B5KHB0ciwgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfcHRyLCBzYXZlX3NpemUpOworICAgICAgcG5nX3B0ci0+YnVmZmVyX3NpemUgLT0gc2F2ZV9zaXplOworICAgICAgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSAtPSBzYXZlX3NpemU7CisgICAgICBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9wdHIgKz0gc2F2ZV9zaXplOworICAgfQorfQorCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQoreworICAgaWYgKHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemUgIT0gMCkKKyAgIHsKKyAgICAgIGlmIChwbmdfcHRyLT5zYXZlX2J1ZmZlcl9wdHIgIT0gcG5nX3B0ci0+c2F2ZV9idWZmZXIpCisgICAgICB7CisgICAgICAgICBwbmdfc2l6ZV90IGksIGlzdG9wOworICAgICAgICAgcG5nX2J5dGVwIHNwOworICAgICAgICAgcG5nX2J5dGVwIGRwOworCisgICAgICAgICBpc3RvcCA9IHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemU7CisgICAgICAgICBmb3IgKGkgPSAwLCBzcCA9IHBuZ19wdHItPnNhdmVfYnVmZmVyX3B0ciwgZHAgPSBwbmdfcHRyLT5zYXZlX2J1ZmZlcjsKKyAgICAgICAgICAgICBpIDwgaXN0b3A7IGkrKywgc3ArKywgZHArKykKKyAgICAgICAgIHsKKyAgICAgICAgICAgICpkcCA9ICpzcDsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKyAgIGlmIChwbmdfcHRyLT5zYXZlX2J1ZmZlcl9zaXplICsgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSA+CisgICAgICAgcG5nX3B0ci0+c2F2ZV9idWZmZXJfbWF4KQorICAgeworICAgICAgcG5nX3NpemVfdCBuZXdfbWF4OworICAgICAgcG5nX2J5dGVwIG9sZF9idWZmZXI7CisKKyAgICAgIGlmIChwbmdfcHRyLT5zYXZlX2J1ZmZlcl9zaXplID4gUE5HX1NJWkVfTUFYIC0KKyAgICAgICAgICAocG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSArIDI1NikpCisgICAgICB7CisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlBvdGVudGlhbCBvdmVyZmxvdyBvZiBzYXZlX2J1ZmZlciIpOworICAgICAgfQorCisgICAgICBuZXdfbWF4ID0gcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSArIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3NpemUgKyAyNTY7CisgICAgICBvbGRfYnVmZmVyID0gcG5nX3B0ci0+c2F2ZV9idWZmZXI7CisgICAgICBwbmdfcHRyLT5zYXZlX2J1ZmZlciA9IChwbmdfYnl0ZXApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsCisgICAgICAgICAgKHBuZ19zaXplX3QpbmV3X21heCk7CisKKyAgICAgIGlmIChwbmdfcHRyLT5zYXZlX2J1ZmZlciA9PSBOVUxMKQorICAgICAgeworICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgb2xkX2J1ZmZlcik7CisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkluc3VmZmljaWVudCBtZW1vcnkgZm9yIHNhdmVfYnVmZmVyIik7CisgICAgICB9CisKKyAgICAgIG1lbWNweShwbmdfcHRyLT5zYXZlX2J1ZmZlciwgb2xkX2J1ZmZlciwgcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSk7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBvbGRfYnVmZmVyKTsKKyAgICAgIHBuZ19wdHItPnNhdmVfYnVmZmVyX21heCA9IG5ld19tYXg7CisgICB9CisgICBpZiAocG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSkKKyAgIHsKKyAgICAgIG1lbWNweShwbmdfcHRyLT5zYXZlX2J1ZmZlciArIHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemUsCisgICAgICAgICBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9wdHIsIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3NpemUpOworICAgICAgcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSArPSBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplOworICAgICAgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSA9IDA7CisgICB9CisgICBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9wdHIgPSBwbmdfcHRyLT5zYXZlX2J1ZmZlcjsKKyAgIHBuZ19wdHItPmJ1ZmZlcl9zaXplID0gMDsKK30KKwordm9pZCAvKiBQUklWQVRFICovCitwbmdfcHVzaF9yZXN0b3JlX2J1ZmZlcihwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2J5dGVwIGJ1ZmZlciwKKyAgIHBuZ19zaXplX3QgYnVmZmVyX2xlbmd0aCkKK3sKKyAgIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyID0gYnVmZmVyOworICAgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSA9IGJ1ZmZlcl9sZW5ndGg7CisgICBwbmdfcHRyLT5idWZmZXJfc2l6ZSA9IGJ1ZmZlcl9sZW5ndGggKyBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9zaXplOworICAgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfcHRyID0gcG5nX3B0ci0+Y3VycmVudF9idWZmZXI7Cit9CisKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3B1c2hfcmVhZF9JREFUKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQoreworICAgaWYgKChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfQ0hVTktfSEVBREVSKSA9PSAwKQorICAgeworICAgICAgcG5nX2J5dGUgY2h1bmtfbGVuZ3RoWzRdOworICAgICAgcG5nX2J5dGUgY2h1bmtfdGFnWzRdOworCisgICAgICAvKiBUT0RPOiB0aGlzIGNvZGUgY2FuIGJlIGNvbW1vbmVkIHVwIHdpdGggdGhlIHNhbWUgY29kZSBpbiBwdXNoX3JlYWQgKi8KKyAgICAgIFBOR19QVVNIX1NBVkVfQlVGRkVSX0lGX0xUKDgpCisgICAgICBwbmdfcHVzaF9maWxsX2J1ZmZlcihwbmdfcHRyLCBjaHVua19sZW5ndGgsIDQpOworICAgICAgcG5nX3B0ci0+cHVzaF9sZW5ndGggPSBwbmdfZ2V0X3VpbnRfMzEocG5nX3B0ciwgY2h1bmtfbGVuZ3RoKTsKKyAgICAgIHBuZ19yZXNldF9jcmMocG5nX3B0cik7CisgICAgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgY2h1bmtfdGFnLCA0KTsKKyAgICAgIHBuZ19wdHItPmNodW5rX25hbWUgPSBQTkdfQ0hVTktfRlJPTV9TVFJJTkcoY2h1bmtfdGFnKTsKKyAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfQ0hVTktfSEVBREVSOworCisgICAgICBpZiAocG5nX3B0ci0+Y2h1bmtfbmFtZSAhPSBwbmdfSURBVCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19wdHItPnByb2Nlc3NfbW9kZSA9IFBOR19SRUFEX0NIVU5LX01PREU7CisKKyAgICAgICAgIGlmICgocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19aU1RSRUFNX0VOREVEKSA9PSAwKQorICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJOb3QgZW5vdWdoIGNvbXByZXNzZWQgZGF0YSIpOworCisgICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHBuZ19wdHItPmlkYXRfc2l6ZSA9IHBuZ19wdHItPnB1c2hfbGVuZ3RoOworICAgfQorCisgICBpZiAocG5nX3B0ci0+aWRhdF9zaXplICE9IDAgJiYgcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSAhPSAwKQorICAgeworICAgICAgcG5nX3NpemVfdCBzYXZlX3NpemUgPSBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9zaXplOworICAgICAgcG5nX3VpbnRfMzIgaWRhdF9zaXplID0gcG5nX3B0ci0+aWRhdF9zaXplOworCisgICAgICAvKiBXZSB3YW50IHRoZSBzbWFsbGVyIG9mICdpZGF0X3NpemUnIGFuZCAnY3VycmVudF9idWZmZXJfc2l6ZScsIGJ1dCB0aGV5CisgICAgICAgKiBhcmUgb2YgZGlmZmVyZW50IHR5cGVzIGFuZCB3ZSBkb24ndCBrbm93IHdoaWNoIHZhcmlhYmxlIGhhcyB0aGUgZmV3ZXN0CisgICAgICAgKiBiaXRzLiAgQ2FyZWZ1bGx5IHNlbGVjdCB0aGUgc21hbGxlciBhbmQgY2FzdCBpdCB0byB0aGUgdHlwZSBvZiB0aGUKKyAgICAgICAqIGxhcmdlciAtIHRoaXMgY2Fubm90IG92ZXJmbG93LiAgRG8gbm90IGNhc3QgaW4gdGhlIGZvbGxvd2luZyB0ZXN0IC0gaXQKKyAgICAgICAqIHdpbGwgYnJlYWsgb24gZWl0aGVyIDE2LWJpdCBvciA2NC1iaXQgcGxhdGZvcm1zLgorICAgICAgICovCisgICAgICBpZiAoaWRhdF9zaXplIDwgc2F2ZV9zaXplKQorICAgICAgICAgc2F2ZV9zaXplID0gKHBuZ19zaXplX3QpaWRhdF9zaXplOworCisgICAgICBlbHNlCisgICAgICAgICBpZGF0X3NpemUgPSAocG5nX3VpbnRfMzIpc2F2ZV9zaXplOworCisgICAgICBwbmdfY2FsY3VsYXRlX2NyYyhwbmdfcHRyLCBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9wdHIsIHNhdmVfc2l6ZSk7CisKKyAgICAgIHBuZ19wcm9jZXNzX0lEQVRfZGF0YShwbmdfcHRyLCBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9wdHIsIHNhdmVfc2l6ZSk7CisKKyAgICAgIHBuZ19wdHItPmlkYXRfc2l6ZSAtPSBpZGF0X3NpemU7CisgICAgICBwbmdfcHRyLT5idWZmZXJfc2l6ZSAtPSBzYXZlX3NpemU7CisgICAgICBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9zaXplIC09IHNhdmVfc2l6ZTsKKyAgICAgIHBuZ19wdHItPnNhdmVfYnVmZmVyX3B0ciArPSBzYXZlX3NpemU7CisgICB9CisKKyAgIGlmIChwbmdfcHRyLT5pZGF0X3NpemUgIT0gMCAmJiBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplICE9IDApCisgICB7CisgICAgICBwbmdfc2l6ZV90IHNhdmVfc2l6ZSA9IHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3NpemU7CisgICAgICBwbmdfdWludF8zMiBpZGF0X3NpemUgPSBwbmdfcHRyLT5pZGF0X3NpemU7CisKKyAgICAgIC8qIFdlIHdhbnQgdGhlIHNtYWxsZXIgb2YgJ2lkYXRfc2l6ZScgYW5kICdjdXJyZW50X2J1ZmZlcl9zaXplJywgYnV0IHRoZXkKKyAgICAgICAqIGFyZSBvZiBkaWZmZXJlbnQgdHlwZXMgYW5kIHdlIGRvbid0IGtub3cgd2hpY2ggdmFyaWFibGUgaGFzIHRoZSBmZXdlc3QKKyAgICAgICAqIGJpdHMuICBDYXJlZnVsbHkgc2VsZWN0IHRoZSBzbWFsbGVyIGFuZCBjYXN0IGl0IHRvIHRoZSB0eXBlIG9mIHRoZQorICAgICAgICogbGFyZ2VyIC0gdGhpcyBjYW5ub3Qgb3ZlcmZsb3cuCisgICAgICAgKi8KKyAgICAgIGlmIChpZGF0X3NpemUgPCBzYXZlX3NpemUpCisgICAgICAgICBzYXZlX3NpemUgPSAocG5nX3NpemVfdClpZGF0X3NpemU7CisKKyAgICAgIGVsc2UKKyAgICAgICAgIGlkYXRfc2l6ZSA9IChwbmdfdWludF8zMilzYXZlX3NpemU7CisKKyAgICAgIHBuZ19jYWxjdWxhdGVfY3JjKHBuZ19wdHIsIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3B0ciwgc2F2ZV9zaXplKTsKKworICAgICAgcG5nX3Byb2Nlc3NfSURBVF9kYXRhKHBuZ19wdHIsIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3B0ciwgc2F2ZV9zaXplKTsKKworICAgICAgcG5nX3B0ci0+aWRhdF9zaXplIC09IGlkYXRfc2l6ZTsKKyAgICAgIHBuZ19wdHItPmJ1ZmZlcl9zaXplIC09IHNhdmVfc2l6ZTsKKyAgICAgIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3NpemUgLT0gc2F2ZV9zaXplOworICAgICAgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfcHRyICs9IHNhdmVfc2l6ZTsKKyAgIH0KKworICAgaWYgKHBuZ19wdHItPmlkYXRfc2l6ZSA9PSAwKQorICAgeworICAgICAgUE5HX1BVU0hfU0FWRV9CVUZGRVJfSUZfTFQoNCkKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApOworICAgICAgcG5nX3B0ci0+bW9kZSAmPSB+UE5HX0hBVkVfQ0hVTktfSEVBREVSOworICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfQUZURVJfSURBVDsKKyAgICAgIHBuZ19wdHItPnpvd25lciA9IDA7CisgICB9Cit9CisKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3Byb2Nlc3NfSURBVF9kYXRhKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfYnl0ZXAgYnVmZmVyLAorICAgcG5nX3NpemVfdCBidWZmZXJfbGVuZ3RoKQoreworICAgLyogVGhlIGNhbGxlciBjaGVja3MgZm9yIGEgbm9uLXplcm8gYnVmZmVyIGxlbmd0aC4gKi8KKyAgIGlmICghKGJ1ZmZlcl9sZW5ndGggPiAwKSB8fCBidWZmZXIgPT0gTlVMTCkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTm8gSURBVCBkYXRhIChpbnRlcm5hbCBlcnJvcikiKTsKKworICAgLyogVGhpcyByb3V0aW5lIG11c3QgcHJvY2VzcyBhbGwgdGhlIGRhdGEgaXQgaGFzIGJlZW4gZ2l2ZW4KKyAgICAqIGJlZm9yZSByZXR1cm5pbmcsIGNhbGxpbmcgdGhlIHJvdyBjYWxsYmFjayBhcyByZXF1aXJlZCB0bworICAgICogaGFuZGxlIHRoZSB1bmNvbXByZXNzZWQgcmVzdWx0cy4KKyAgICAqLworICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X2luID0gYnVmZmVyOworICAgLyogVE9ETzogV0FSTklORzogVFJVTkNBVElPTiBFUlJPUjogREFOR0VSIFdJTEwgUk9CSU5TT046ICovCisgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luID0gKHVJbnQpYnVmZmVyX2xlbmd0aDsKKworICAgLyogS2VlcCBnb2luZyB1bnRpbCB0aGUgZGVjb21wcmVzc2VkIGRhdGEgaXMgYWxsIHByb2Nlc3NlZAorICAgICogb3IgdGhlIHN0cmVhbSBtYXJrZWQgYXMgZmluaXNoZWQuCisgICAgKi8KKyAgIHdoaWxlIChwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luID4gMCAmJgorICAgICAgKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfWlNUUkVBTV9FTkRFRCkgPT0gMCkKKyAgIHsKKyAgICAgIGludCByZXQ7CisKKyAgICAgIC8qIFdlIGhhdmUgZGF0YSBmb3IgemxpYiwgYnV0IHdlIG11c3QgY2hlY2sgdGhhdCB6bGliCisgICAgICAgKiBoYXMgc29tZXBsYWNlIHRvIHB1dCB0aGUgcmVzdWx0cy4gIEl0IGRvZXNuJ3QgbWF0dGVyCisgICAgICAgKiBpZiB3ZSBkb24ndCBleHBlY3QgYW55IHJlc3VsdHMgLS0gaXQgbWF5IGJlIHRoZSBpbnB1dAorICAgICAgICogZGF0YSBpcyBqdXN0IHRoZSBMWiBlbmQgY29kZS4KKyAgICAgICAqLworICAgICAgaWYgKCEocG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPiAwKSkKKyAgICAgIHsKKyAgICAgICAgIC8qIFRPRE86IFdBUk5JTkc6IFRSVU5DQVRJT04gRVJST1I6IERBTkdFUiBXSUxMIFJPQklOU09OOiAqLworICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPSAodUludCkoUE5HX1JPV0JZVEVTKHBuZ19wdHItPnBpeGVsX2RlcHRoLAorICAgICAgICAgICAgIHBuZ19wdHItPml3aWR0aCkgKyAxKTsKKworICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X291dCA9IHBuZ19wdHItPnJvd19idWY7CisgICAgICB9CisKKyAgICAgIC8qIFVzaW5nIFpfU1lOQ19GTFVTSCBoZXJlIG1lYW5zIHRoYXQgYW4gdW50ZXJtaW5hdGVkCisgICAgICAgKiBMWiBzdHJlYW0gKGEgc3RyZWFtIHdpdGggYSBtaXNzaW5nIGVuZCBjb2RlKSBjYW4gc3RpbGwKKyAgICAgICAqIGJlIGhhbmRsZWQsIG90aGVyd2lzZSAoWl9OT19GTFVTSCkgYSBmdXR1cmUgemxpYgorICAgICAgICogaW1wbGVtZW50YXRpb24gbWlnaHQgZGVmZXIgb3V0cHV0IGFuZCB0aGVyZWZvcmUKKyAgICAgICAqIGNoYW5nZSB0aGUgY3VycmVudCBiZWhhdmlvciAoc2VlIGNvbW1lbnRzIGluIGluZmxhdGUuYworICAgICAgICogZm9yIHdoeSB0aGlzIGRvZXNuJ3QgaGFwcGVuIGF0IHByZXNlbnQgd2l0aCB6bGliIDEuMi41KS4KKyAgICAgICAqLworICAgICAgcmV0ID0gUE5HX0lORkxBVEUocG5nX3B0ciwgWl9TWU5DX0ZMVVNIKTsKKworICAgICAgLyogQ2hlY2sgZm9yIGFueSBmYWlsdXJlIGJlZm9yZSBwcm9jZWVkaW5nLiAqLworICAgICAgaWYgKHJldCAhPSBaX09LICYmIHJldCAhPSBaX1NUUkVBTV9FTkQpCisgICAgICB7CisgICAgICAgICAvKiBUZXJtaW5hdGUgdGhlIGRlY29tcHJlc3Npb24uICovCisgICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19aU1RSRUFNX0VOREVEOworICAgICAgICAgcG5nX3B0ci0+em93bmVyID0gMDsKKworICAgICAgICAgLyogVGhpcyBtYXkgYmUgYSB0cnVuY2F0ZWQgc3RyZWFtIChtaXNzaW5nIG9yCisgICAgICAgICAgKiBkYW1hZ2VkIGVuZCBjb2RlKS4gIFRyZWF0IHRoYXQgYXMgYSB3YXJuaW5nLgorICAgICAgICAgICovCisgICAgICAgICBpZiAocG5nX3B0ci0+cm93X251bWJlciA+PSBwbmdfcHRyLT5udW1fcm93cyB8fAorICAgICAgICAgICAgIHBuZ19wdHItPnBhc3MgPiA2KQorICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlRydW5jYXRlZCBjb21wcmVzc2VkIGRhdGEgaW4gSURBVCIpOworCisgICAgICAgICBlbHNlCisgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkRlY29tcHJlc3Npb24gZXJyb3IgaW4gSURBVCIpOworCisgICAgICAgICAvKiBTa2lwIHRoZSBjaGVjayBvbiB1bnByb2Nlc3NlZCBpbnB1dCAqLworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICAvKiBEaWQgaW5mbGF0ZSBvdXRwdXQgYW55IGRhdGE/ICovCisgICAgICBpZiAocG5nX3B0ci0+enN0cmVhbS5uZXh0X291dCAhPSBwbmdfcHRyLT5yb3dfYnVmKQorICAgICAgeworICAgICAgICAgLyogSXMgdGhpcyB1bmV4cGVjdGVkIGRhdGEgYWZ0ZXIgdGhlIGxhc3Qgcm93PworICAgICAgICAgICogSWYgaXQgaXMsIGFydGlmaWNpYWxseSB0ZXJtaW5hdGUgdGhlIExaIG91dHB1dAorICAgICAgICAgICogaGVyZS4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKHBuZ19wdHItPnJvd19udW1iZXIgPj0gcG5nX3B0ci0+bnVtX3Jvd3MgfHwKKyAgICAgICAgICAgICBwbmdfcHRyLT5wYXNzID4gNikKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEV4dHJhIGRhdGEuICovCisgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiRXh0cmEgY29tcHJlc3NlZCBkYXRhIGluIElEQVQiKTsKKyAgICAgICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX1pTVFJFQU1fRU5ERUQ7CisgICAgICAgICAgICBwbmdfcHRyLT56b3duZXIgPSAwOworCisgICAgICAgICAgICAvKiBEbyBubyBtb3JlIHByb2Nlc3Npbmc7IHNraXAgdGhlIHVucHJvY2Vzc2VkCisgICAgICAgICAgICAgKiBpbnB1dCBjaGVjayBiZWxvdy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgfQorCisgICAgICAgICAvKiBEbyB3ZSBoYXZlIGEgY29tcGxldGUgcm93PyAqLworICAgICAgICAgaWYgKHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID09IDApCisgICAgICAgICAgICBwbmdfcHVzaF9wcm9jZXNzX3JvdyhwbmdfcHRyKTsKKyAgICAgIH0KKworICAgICAgLyogQW5kIGNoZWNrIGZvciB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uICovCisgICAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VORCkKKyAgICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX1pTVFJFQU1fRU5ERUQ7CisgICB9CisKKyAgIC8qIEFsbCB0aGUgZGF0YSBzaG91bGQgaGF2ZSBiZWVuIHByb2Nlc3NlZCwgaWYgYW55dGhpbmcKKyAgICAqIGlzIGxlZnQgYXQgdGhpcyBwb2ludCB3ZSBoYXZlIGJ5dGVzIG9mIElEQVQgZGF0YQorICAgICogYWZ0ZXIgdGhlIHpsaWIgZW5kIGNvZGUuCisgICAgKi8KKyAgIGlmIChwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luID4gMCkKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJFeHRyYSBjb21wcmVzc2lvbiBkYXRhIGluIElEQVQiKTsKK30KKwordm9pZCAvKiBQUklWQVRFICovCitwbmdfcHVzaF9wcm9jZXNzX3Jvdyhwbmdfc3RydWN0cnAgcG5nX3B0cikKK3sKKyAgIC8qIDEuNS42OiByb3dfaW5mbyBtb3ZlZCBvdXQgb2YgcG5nX3N0cnVjdCB0byBhIGxvY2FsIGhlcmUuICovCisgICBwbmdfcm93X2luZm8gcm93X2luZm87CisKKyAgIHJvd19pbmZvLndpZHRoID0gcG5nX3B0ci0+aXdpZHRoOyAvKiBOT1RFOiB3aWR0aCBvZiBjdXJyZW50IGludGVybGFjZWQgcm93ICovCisgICByb3dfaW5mby5jb2xvcl90eXBlID0gcG5nX3B0ci0+Y29sb3JfdHlwZTsKKyAgIHJvd19pbmZvLmJpdF9kZXB0aCA9IHBuZ19wdHItPmJpdF9kZXB0aDsKKyAgIHJvd19pbmZvLmNoYW5uZWxzID0gcG5nX3B0ci0+Y2hhbm5lbHM7CisgICByb3dfaW5mby5waXhlbF9kZXB0aCA9IHBuZ19wdHItPnBpeGVsX2RlcHRoOworICAgcm93X2luZm8ucm93Ynl0ZXMgPSBQTkdfUk9XQllURVMocm93X2luZm8ucGl4ZWxfZGVwdGgsIHJvd19pbmZvLndpZHRoKTsKKworICAgaWYgKHBuZ19wdHItPnJvd19idWZbMF0gPiBQTkdfRklMVEVSX1ZBTFVFX05PTkUpCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+cm93X2J1ZlswXSA8IFBOR19GSUxURVJfVkFMVUVfTEFTVCkKKyAgICAgICAgIHBuZ19yZWFkX2ZpbHRlcl9yb3cocG5nX3B0ciwgJnJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwKKyAgICAgICAgICAgIHBuZ19wdHItPnByZXZfcm93ICsgMSwgcG5nX3B0ci0+cm93X2J1ZlswXSk7CisgICAgICBlbHNlCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImJhZCBhZGFwdGl2ZSBmaWx0ZXIgdmFsdWUiKTsKKyAgIH0KKworICAgLyogbGlicG5nIDEuNS42OiB0aGUgZm9sbG93aW5nIGxpbmUgd2FzIGNvcHlpbmcgcG5nX3B0ci0+cm93Ynl0ZXMgYmVmb3JlCisgICAgKiAxLjUuNiwgd2hpbGUgdGhlIGJ1ZmZlciByZWFsbHkgaXMgdGhpcyBiaWcgaW4gY3VycmVudCB2ZXJzaW9ucyBvZiBsaWJwbmcKKyAgICAqIGl0IG1heSBub3QgYmUgaW4gdGhlIGZ1dHVyZSwgc28gdGhpcyB3YXMgY2hhbmdlZCBqdXN0IHRvIGNvcHkgdGhlCisgICAgKiBpbnRlcmxhY2VkIHJvdyBjb3VudDoKKyAgICAqLworICAgbWVtY3B5KHBuZ19wdHItPnByZXZfcm93LCBwbmdfcHRyLT5yb3dfYnVmLCByb3dfaW5mby5yb3dieXRlcyArIDEpOworCisjaWZkZWYgUE5HX1JFQURfVFJBTlNGT1JNU19TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgIT0gMCkKKyAgICAgIHBuZ19kb19yZWFkX3RyYW5zZm9ybWF0aW9ucyhwbmdfcHRyLCAmcm93X2luZm8pOworI2VuZGlmCisKKyAgIC8qIFRoZSB0cmFuc2Zvcm1lZCBwaXhlbCBkZXB0aCBzaG91bGQgbWF0Y2ggdGhlIGRlcHRoIG5vdyBpbiByb3dfaW5mby4gKi8KKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1lZF9waXhlbF9kZXB0aCA9PSAwKQorICAgeworICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtZWRfcGl4ZWxfZGVwdGggPSByb3dfaW5mby5waXhlbF9kZXB0aDsKKyAgICAgIGlmIChyb3dfaW5mby5waXhlbF9kZXB0aCA+IHBuZ19wdHItPm1heGltdW1fcGl4ZWxfZGVwdGgpCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInByb2dyZXNzaXZlIHJvdyBvdmVyZmxvdyIpOworICAgfQorCisgICBlbHNlIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1lZF9waXhlbF9kZXB0aCAhPSByb3dfaW5mby5waXhlbF9kZXB0aCkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiaW50ZXJuYWwgcHJvZ3Jlc3NpdmUgcm93IHNpemUgY2FsY3VsYXRpb24gZXJyb3IiKTsKKworCisjaWZkZWYgUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVECisgICAvKiBFeHBhbmQgaW50ZXJsYWNlZCByb3dzIHRvIGZ1bGwgc2l6ZSAqLworICAgaWYgKHBuZ19wdHItPmludGVybGFjZWQgIT0gMCAmJgorICAgICAgIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5URVJMQUNFKSAhPSAwKQorICAgeworICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPCA2KQorICAgICAgICAgcG5nX2RvX3JlYWRfaW50ZXJsYWNlKCZyb3dfaW5mbywgcG5nX3B0ci0+cm93X2J1ZiArIDEsIHBuZ19wdHItPnBhc3MsCisgICAgICAgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMpOworCisgICAgICBzd2l0Y2ggKHBuZ19wdHItPnBhc3MpCisgICAgICB7CisgICAgICAgICBjYXNlIDA6CisgICAgICAgICB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4ICYmIHBuZ19wdHItPnBhc3MgPT0gMDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOworICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOyAvKiBVcGRhdGVzIHBuZ19wdHItPnBhc3MgKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPT0gMikgLyogUGFzcyAxIG1pZ2h0IGJlIGVtcHR5ICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNCAmJiBwbmdfcHRyLT5wYXNzID09IDI7IGkrKykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBuZ19wdXNoX2hhdmVfcm93KHBuZ19wdHIsIE5VTEwpOworICAgICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocG5nX3B0ci0+cGFzcyA9PSA0ICYmIHBuZ19wdHItPmhlaWdodCA8PSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDIgJiYgcG5nX3B0ci0+cGFzcyA9PSA0OyBpKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyhwbmdfcHRyKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPT0gNiAmJiBwbmdfcHRyLT5oZWlnaHQgPD0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBjYXNlIDE6CisgICAgICAgICB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4ICYmIHBuZ19wdHItPnBhc3MgPT0gMTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOworICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocG5nX3B0ci0+cGFzcyA9PSAyKSAvKiBTa2lwIHRvcCA0IGdlbmVyYXRlZCByb3dzICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNCAmJiBwbmdfcHRyLT5wYXNzID09IDI7IGkrKykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBuZ19wdXNoX2hhdmVfcm93KHBuZ19wdHIsIE5VTEwpOworICAgICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKworICAgICAgICAgY2FzZSAyOgorICAgICAgICAgeworICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0ICYmIHBuZ19wdHItPnBhc3MgPT0gMjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOworICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNCAmJiBwbmdfcHRyLT5wYXNzID09IDI7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19wdXNoX2hhdmVfcm93KHBuZ19wdHIsIE5VTEwpOworICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocG5nX3B0ci0+cGFzcyA9PSA0KSAvKiBQYXNzIDMgbWlnaHQgYmUgZW1wdHkgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyICYmIHBuZ19wdHItPnBhc3MgPT0gNDsgaSsrKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgTlVMTCk7CisgICAgICAgICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBjYXNlIDM6CisgICAgICAgICB7CisgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQgJiYgcG5nX3B0ci0+cGFzcyA9PSAzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7CisgICAgICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT5wYXNzID09IDQpIC8qIFNraXAgdG9wIHR3byBnZW5lcmF0ZWQgcm93cyAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDIgJiYgcG5nX3B0ci0+cGFzcyA9PSA0OyBpKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyhwbmdfcHRyKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisKKyAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMiAmJiBwbmdfcHRyLT5wYXNzID09IDQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19wdXNoX2hhdmVfcm93KHBuZ19wdHIsIHBuZ19wdHItPnJvd19idWYgKyAxKTsKKyAgICAgICAgICAgICAgIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyhwbmdfcHRyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDIgJiYgcG5nX3B0ci0+cGFzcyA9PSA0OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBOVUxMKTsKKyAgICAgICAgICAgICAgIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyhwbmdfcHRyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPT0gNikgLyogUGFzcyA1IG1pZ2h0IGJlIGVtcHR5ICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBOVUxMKTsKKyAgICAgICAgICAgICAgIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyhwbmdfcHRyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisKKyAgICAgICAgIGNhc2UgNToKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMiAmJiBwbmdfcHRyLT5wYXNzID09IDU7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19wdXNoX2hhdmVfcm93KHBuZ19wdHIsIHBuZ19wdHItPnJvd19idWYgKyAxKTsKKyAgICAgICAgICAgICAgIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyhwbmdfcHRyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPT0gNikgLyogU2tpcCB0b3AgZ2VuZXJhdGVkIHJvdyAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgTlVMTCk7CisgICAgICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgY2FzZSA2OgorICAgICAgICAgeworICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOworICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOworCisgICAgICAgICAgICBpZiAocG5nX3B0ci0+cGFzcyAhPSA2KQorICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIHBuZ19wdXNoX2hhdmVfcm93KHBuZ19wdHIsIE5VTEwpOworICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOworICAgICAgICAgfQorICAgICAgfQorICAgfQorICAgZWxzZQorI2VuZGlmCisgICB7CisgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7CisgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7CisgICB9Cit9CisKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQoreworI2lmZGVmIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAorICAgLyogQXJyYXlzIHRvIGZhY2lsaXRhdGUgZWFzeSBpbnRlcmxhY2luZyAtIHVzZSBwYXNzICgwIC0gNikgYXMgaW5kZXggKi8KKworICAgLyogU3RhcnQgb2YgaW50ZXJsYWNlIGJsb2NrICovCisgICBzdGF0aWMgUE5HX0NPTlNUIHBuZ19ieXRlIHBuZ19wYXNzX3N0YXJ0W10gPSB7MCwgNCwgMCwgMiwgMCwgMSwgMH07CisKKyAgIC8qIE9mZnNldCB0byBuZXh0IGludGVybGFjZSBibG9jayAqLworICAgc3RhdGljIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfcGFzc19pbmNbXSA9IHs4LCA4LCA0LCA0LCAyLCAyLCAxfTsKKworICAgLyogU3RhcnQgb2YgaW50ZXJsYWNlIGJsb2NrIGluIHRoZSB5IGRpcmVjdGlvbiAqLworICAgc3RhdGljIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfcGFzc195c3RhcnRbXSA9IHswLCAwLCA0LCAwLCAyLCAwLCAxfTsKKworICAgLyogT2Zmc2V0IHRvIG5leHQgaW50ZXJsYWNlIGJsb2NrIGluIHRoZSB5IGRpcmVjdGlvbiAqLworICAgc3RhdGljIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfcGFzc195aW5jW10gPSB7OCwgOCwgOCwgNCwgNCwgMiwgMn07CisKKyAgIC8qIEhlaWdodCBvZiBpbnRlcmxhY2UgYmxvY2suICBUaGlzIGlzIG5vdCBjdXJyZW50bHkgdXNlZCAtIGlmIHlvdSBuZWVkCisgICAgKiBpdCwgdW5jb21tZW50IGl0IGhlcmUgYW5kIGluIHBuZy5oCisgICBzdGF0aWMgUE5HX0NPTlNUIHBuZ19ieXRlIHBuZ19wYXNzX2hlaWdodFtdID0gezgsIDgsIDQsIDQsIDIsIDIsIDF9OworICAgKi8KKyNlbmRpZgorCisgICBwbmdfcHRyLT5yb3dfbnVtYmVyKys7CisgICBpZiAocG5nX3B0ci0+cm93X251bWJlciA8IHBuZ19wdHItPm51bV9yb3dzKQorICAgICAgcmV0dXJuOworCisjaWZkZWYgUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVECisgICBpZiAocG5nX3B0ci0+aW50ZXJsYWNlZCAhPSAwKQorICAgeworICAgICAgcG5nX3B0ci0+cm93X251bWJlciA9IDA7CisgICAgICBtZW1zZXQocG5nX3B0ci0+cHJldl9yb3csIDAsIHBuZ19wdHItPnJvd2J5dGVzICsgMSk7CisKKyAgICAgIGRvCisgICAgICB7CisgICAgICAgICBwbmdfcHRyLT5wYXNzKys7CisgICAgICAgICBpZiAoKHBuZ19wdHItPnBhc3MgPT0gMSAmJiBwbmdfcHRyLT53aWR0aCA8IDUpIHx8CisgICAgICAgICAgICAgKHBuZ19wdHItPnBhc3MgPT0gMyAmJiBwbmdfcHRyLT53aWR0aCA8IDMpIHx8CisgICAgICAgICAgICAgKHBuZ19wdHItPnBhc3MgPT0gNSAmJiBwbmdfcHRyLT53aWR0aCA8IDIpKQorICAgICAgICAgICAgcG5nX3B0ci0+cGFzcysrOworCisgICAgICAgICBpZiAocG5nX3B0ci0+cGFzcyA+IDcpCisgICAgICAgICAgICBwbmdfcHRyLT5wYXNzLS07CisKKyAgICAgICAgIGlmIChwbmdfcHRyLT5wYXNzID49IDcpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgcG5nX3B0ci0+aXdpZHRoID0gKHBuZ19wdHItPndpZHRoICsKKyAgICAgICAgICAgICBwbmdfcGFzc19pbmNbcG5nX3B0ci0+cGFzc10gLSAxIC0KKyAgICAgICAgICAgICBwbmdfcGFzc19zdGFydFtwbmdfcHRyLT5wYXNzXSkgLworICAgICAgICAgICAgIHBuZ19wYXNzX2luY1twbmdfcHRyLT5wYXNzXTsKKworICAgICAgICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5URVJMQUNFKSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIHBuZ19wdHItPm51bV9yb3dzID0gKHBuZ19wdHItPmhlaWdodCArCisgICAgICAgICAgICAgcG5nX3Bhc3NfeWluY1twbmdfcHRyLT5wYXNzXSAtIDEgLQorICAgICAgICAgICAgIHBuZ19wYXNzX3lzdGFydFtwbmdfcHRyLT5wYXNzXSkgLworICAgICAgICAgICAgIHBuZ19wYXNzX3lpbmNbcG5nX3B0ci0+cGFzc107CisKKyAgICAgIH0gd2hpbGUgKHBuZ19wdHItPml3aWR0aCA9PSAwIHx8IHBuZ19wdHItPm51bV9yb3dzID09IDApOworICAgfQorI2VuZGlmIC8qIFJFQURfSU5URVJMQUNJTkcgKi8KK30KKwordm9pZCAvKiBQUklWQVRFICovCitwbmdfcHVzaF9oYXZlX2luZm8ocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIpCit7CisgICBpZiAocG5nX3B0ci0+aW5mb19mbiAhPSBOVUxMKQorICAgICAgKCoocG5nX3B0ci0+aW5mb19mbikpKHBuZ19wdHIsIGluZm9fcHRyKTsKK30KKwordm9pZCAvKiBQUklWQVRFICovCitwbmdfcHVzaF9oYXZlX2VuZChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0cikKK3sKKyAgIGlmIChwbmdfcHRyLT5lbmRfZm4gIT0gTlVMTCkKKyAgICAgICgqKHBuZ19wdHItPmVuZF9mbikpKHBuZ19wdHIsIGluZm9fcHRyKTsKK30KKwordm9pZCAvKiBQUklWQVRFICovCitwbmdfcHVzaF9oYXZlX3Jvdyhwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2J5dGVwIHJvdykKK3sKKyAgIGlmIChwbmdfcHRyLT5yb3dfZm4gIT0gTlVMTCkKKyAgICAgICgqKHBuZ19wdHItPnJvd19mbikpKHBuZ19wdHIsIHJvdywgcG5nX3B0ci0+cm93X251bWJlciwKKyAgICAgICAgIChpbnQpcG5nX3B0ci0+cGFzcyk7Cit9CisKKyNpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3cocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19ieXRlcCBvbGRfcm93LAorICAgIHBuZ19jb25zdF9ieXRlcCBuZXdfcm93KQoreworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgLyogbmV3X3JvdyBpcyBhIGZsYWcgaGVyZSAtIGlmIGl0IGlzIE5VTEwgdGhlbiB0aGUgYXBwIGNhbGxiYWNrIHdhcyBjYWxsZWQKKyAgICAqIGZyb20gYW4gZW1wdHkgcm93IChzZWUgdGhlIGNhbGxzIHRvIHBuZ19zdHJ1Y3Q6OnJvd19mbiBiZWxvdyksIG90aGVyd2lzZQorICAgICogaXQgbXVzdCBiZSBwbmdfcHRyLT5yb3dfYnVmKzEKKyAgICAqLworICAgaWYgKG5ld19yb3cgIT0gTlVMTCkKKyAgICAgIHBuZ19jb21iaW5lX3JvdyhwbmdfcHRyLCBvbGRfcm93LCAxLypibG9ja3kgZGlzcGxheSovKTsKK30KKyNlbmRpZiAvKiBSRUFEX0lOVEVSTEFDSU5HICovCisKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4ocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ192b2lkcCBwcm9ncmVzc2l2ZV9wdHIsCisgICAgcG5nX3Byb2dyZXNzaXZlX2luZm9fcHRyIGluZm9fZm4sIHBuZ19wcm9ncmVzc2l2ZV9yb3dfcHRyIHJvd19mbiwKKyAgICBwbmdfcHJvZ3Jlc3NpdmVfZW5kX3B0ciBlbmRfZm4pCit7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBwbmdfcHRyLT5pbmZvX2ZuID0gaW5mb19mbjsKKyAgIHBuZ19wdHItPnJvd19mbiA9IHJvd19mbjsKKyAgIHBuZ19wdHItPmVuZF9mbiA9IGVuZF9mbjsKKworICAgcG5nX3NldF9yZWFkX2ZuKHBuZ19wdHIsIHByb2dyZXNzaXZlX3B0ciwgcG5nX3B1c2hfZmlsbF9idWZmZXIpOworfQorCitwbmdfdm9pZHAgUE5HQVBJCitwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0cihwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikKK3sKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm4gKE5VTEwpOworCisgICByZXR1cm4gcG5nX3B0ci0+aW9fcHRyOworfQorI2VuZGlmIC8qIFBST0dSRVNTSVZFX1JFQUQgKi8KZGlmZiAtLWdpdCBhL2xpYnBuZy9wbmdwcml2LmggYi9saWJwbmcvcG5ncHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmN2NjNzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvcG5ncHJpdi5oCkBAIC0wLDAgKzEsMTkzNiBAQAorCisvKiBwbmdwcml2LmggLSBwcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgdXNlIGluc2lkZSBsaWJwbmcKKyAqCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4xOCBbSnVseSAyMywgMjAxNV0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDE1IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCisgKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCisgKi8KKworLyogVGhlIHN5bWJvbHMgZGVjbGFyZWQgaW4gdGhpcyBmaWxlIChpbmNsdWRpbmcgdGhlIGZ1bmN0aW9ucyBkZWNsYXJlZAorICogYXMgZXh0ZXJuKSBhcmUgUFJJVkFURS4gIFRoZXkgYXJlIG5vdCBwYXJ0IG9mIHRoZSBsaWJwbmcgcHVibGljCisgKiBpbnRlcmZhY2UsIGFuZCBhcmUgbm90IHJlY29tbWVuZGVkIGZvciB1c2UgYnkgcmVndWxhciBhcHBsaWNhdGlvbnMuCisgKiBTb21lIG9mIHRoZW0gbWF5IGJlY29tZSBwdWJsaWMgaW4gdGhlIGZ1dHVyZTsgb3RoZXJzIG1heSBzdGF5IHByaXZhdGUsCisgKiBjaGFuZ2UgaW4gYW4gaW5jb21wYXRpYmxlIHdheSwgb3IgZXZlbiBkaXNhcHBlYXIuCisgKiBBbHRob3VnaCB0aGUgbGlicG5nIHVzZXJzIGFyZSBub3QgZm9yYmlkZGVuIHRvIGluY2x1ZGUgdGhpcyBoZWFkZXIsCisgKiB0aGV5IHNob3VsZCBiZSB3ZWxsIGF3YXJlIG9mIHRoZSBpc3N1ZXMgdGhhdCBtYXkgYXJpc2UgZnJvbSBkb2luZyBzby4KKyAqLworCisjaWZuZGVmIFBOR1BSSVZfSAorI2RlZmluZSBQTkdQUklWX0gKKworLyogRmVhdHVyZSBUZXN0IE1hY3Jvcy4gIFRoZSBmb2xsb3dpbmcgYXJlIGRlZmluZWQgaGVyZSB0byBlbnN1cmUgdGhhdCBjb3JyZWN0bHkKKyAqIGltcGxlbWVudGVkIGxpYnJhcmllcyByZXZlYWwgdGhlIEFQSXMgbGlicG5nIG5lZWRzIHRvIGJ1aWxkIGFuZCBoaWRlIHRob3NlCisgKiB0aGF0IGFyZSBub3QgbmVlZGVkIGFuZCBwb3RlbnRpYWxseSBkYW1hZ2luZyB0byB0aGUgY29tcGlsYXRpb24uCisgKgorICogRmVhdHVyZSBUZXN0IE1hY3JvcyBtdXN0IGJlIGRlZmluZWQgYmVmb3JlIGFueSBzeXN0ZW0gaGVhZGVyIGlzIGluY2x1ZGVkIChzZWUKKyAqIFBPU0lYIDEwMDMuMSAyLjguMiAiUE9TSVggU3ltYm9scy4iCisgKgorICogVGhlc2UgbWFjcm9zIG9ubHkgaGF2ZSBhbiBlZmZlY3QgaWYgdGhlIG9wZXJhdGluZyBzeXN0ZW0gc3VwcG9ydHMgZWl0aGVyCisgKiBQT1NJWCAxMDAzLjEgb3IgQzk5LCBvciBib3RoLiAgT24gb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMgKHBhcnRpY3VsYXJseQorICogV2luZG93cy9WaXN1YWwgU3R1ZGlvKSB0aGVyZSBpcyBubyBlZmZlY3Q7IHRoZSBPUyBzcGVjaWZpYyB0ZXN0cyBiZWxvdyBhcmUKKyAqIHN0aWxsIHJlcXVpcmVkIChhcyBvZiAyMDExLTA1LTAyLikKKyAqLworI2RlZmluZSBfUE9TSVhfU09VUkNFIDEgLyogSnVzdCB0aGUgUE9TSVggMTAwMy4xIGFuZCBDODkgQVBJcyAqLworCisjaWZuZGVmIFBOR19WRVJTSU9OX0lORk9fT05MWQorLyogU3RhbmRhcmQgbGlicmFyeSBoZWFkZXJzIG5vdCByZXF1aXJlZCBieSBwbmcuaDogKi8KKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyAgaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKworI2RlZmluZSBQTkdMSUJfQlVJTEQgLypsaWJwbmcgaXMgYmVpbmcgYnVpbHQsIG5vdCB1c2VkKi8KKworLyogSWYgSEFWRV9DT05GSUdfSCBpcyBkZWZpbmVkIGR1cmluZyB0aGUgYnVpbGQgdGhlbiB0aGUgYnVpbGQgc3lzdGVtIG11c3QKKyAqIHByb3ZpZGUgYW4gYXBwcm9wcmlhdGUgImNvbmZpZy5oIiBmaWxlIG9uIHRoZSBpbmNsdWRlIHBhdGguICBUaGUgaGVhZGVyIGZpbGUKKyAqIG11c3QgcHJvdmlkZSBkZWZpbml0aW9ucyBhcyByZXF1aXJlZCBiZWxvdyAoc2VhcmNoIGZvciAiSEFWRV9DT05GSUdfSCIpOworICogc2VlIGNvbmZpZ3VyZS5hYyBmb3IgbW9yZSBkZXRhaWxzIG9mIHRoZSByZXF1aXJlbWVudHMuICBUaGUgbWFjcm8KKyAqICJQTkdfTk9fQ09ORklHX0giIGlzIHByb3ZpZGVkIGZvciBtYWludGFpbmVycyB0byB0ZXN0IGZvciBkZXBlbmRlbmNpZXMgb24KKyAqICdjb25maWd1cmUnOyBkZWZpbmUgdGhpcyBtYWNybyB0byBwcmV2ZW50IHRoZSBjb25maWd1cmUgYnVpbGQgaW5jbHVkaW5nIHRoZQorICogY29uZmlndXJlIGdlbmVyYXRlZCBjb25maWcuaC4gIExpYnBuZyBpcyBleHBlY3RlZCB0byBjb21waWxlIHdpdGhvdXQgKmFueSoKKyAqIHNwZWNpYWwgYnVpbGQgc3lzdGVtIHN1cHBvcnQgb24gYSByZWFzb25hYmx5IEFOU0ktQyBjb21wbGlhbnQgc3lzdGVtLgorICovCisjaWYgZGVmaW5lZChIQVZFX0NPTkZJR19IKSAmJiAhZGVmaW5lZChQTkdfTk9fQ09ORklHX0gpCisjICBpbmNsdWRlIDxjb25maWcuaD4KKworICAgLyogUGljayB1cCB0aGUgZGVmaW5pdGlvbiBvZiAncmVzdHJpY3QnIGZyb20gY29uZmlnLmggaWYgaXQgd2FzIHJlYWQ6ICovCisjICBkZWZpbmUgUE5HX1JFU1RSSUNUIHJlc3RyaWN0CisjZW5kaWYKKworLyogVG8gc3VwcG9ydCBzeW1ib2wgcHJlZml4aW5nIGl0IGlzIG5lY2Vzc2FyeSB0byBrbm93ICpiZWZvcmUqIGluY2x1ZGluZyBwbmcuaAorICogd2hldGhlciB0aGUgZml4ZWQgcG9pbnQgKGFuZCBtYXliZSBvdGhlcikgQVBJcyBhcmUgZXhwb3J0ZWQsIGJlY2F1c2UgaWYgdGhleQorICogYXJlIG5vdCBpbnRlcm5hbCBkZWZpbml0aW9ucyBtYXkgYmUgcmVxdWlyZWQuICBUaGlzIGlzIGhhbmRsZWQgYmVsb3cganVzdAorICogYmVmb3JlIHBuZy5oIGlzIGluY2x1ZGVkLCBidXQgbG9hZCB0aGUgY29uZmlndXJhdGlvbiBub3cgaWYgaXQgaXMgYXZhaWxhYmxlLgorICovCisjaWZuZGVmIFBOR0xDT05GX0gKKyMgIGluY2x1ZGUgInBuZ2xpYmNvbmYuaCIKKyNlbmRpZgorCisvKiBMb2NhbCByZW5hbWVzIG1heSBjaGFuZ2Ugbm9uLWV4cG9ydGVkIEFQSSBmdW5jdGlvbnMgZnJvbSBwbmcuaCAqLworI2lmIGRlZmluZWQoUE5HX1BSRUZJWCkgJiYgIWRlZmluZWQoUE5HUFJFRklYX0gpCisjICBpbmNsdWRlICJwbmdwcmVmaXguaCIKKyNlbmRpZgorCisjaWZkZWYgUE5HX1VTRVJfQ09ORklHCisjICBpbmNsdWRlICJwbmd1c3IuaCIKKyAgIC8qIFRoZXNlIHNob3VsZCBoYXZlIGJlZW4gZGVmaW5lZCBpbiBwbmd1c3IuaCAqLworIyAgaWZuZGVmIFBOR19VU0VSX1BSSVZBVEVCVUlMRAorIyAgICBkZWZpbmUgUE5HX1VTRVJfUFJJVkFURUJVSUxEICJDdXN0b20gbGlicG5nIGJ1aWxkIgorIyAgZW5kaWYKKyMgIGlmbmRlZiBQTkdfVVNFUl9ETExGTkFNRV9QT1NURklYCisjICAgIGRlZmluZSBQTkdfVVNFUl9ETExGTkFNRV9QT1NURklYICJDYiIKKyMgIGVuZGlmCisjZW5kaWYKKworLyogQ29tcGlsZSB0aW1lIG9wdGlvbnMuCisgKiA9PT09PT09PT09PT09PT09PT09PT0KKyAqIEluIGEgbXVsdGktYXJjaCBidWlsZCB0aGUgY29tcGlsZXIgbWF5IGNvbXBpbGUgdGhlIGNvZGUgc2V2ZXJhbCB0aW1lcyBmb3IgdGhlCisgKiBzYW1lIG9iamVjdCBtb2R1bGUsIHByb2R1Y2luZyBkaWZmZXJlbnQgYmluYXJpZXMgZm9yIGRpZmZlcmVudCBhcmNoaXRlY3R1cmVzLgorICogV2hlbiB0aGlzIGhhcHBlbnMgY29uZmlndXJlLXRpbWUgc2V0dGluZyBvZiB0aGUgdGFyZ2V0IGhvc3Qgb3B0aW9ucyBjYW5ub3QgYmUKKyAqIGRvbmUgYW5kIHRoaXMgaW50ZXJmZXJlcyB3aXRoIHRoZSBoYW5kbGluZyBvZiB0aGUgQVJNIE5FT04gb3B0aW1pemF0aW9ucywgYW5kCisgKiBwb3NzaWJseSBvdGhlciBzaW1pbGFyIG9wdGltaXphdGlvbnMuICBQdXQgYWRkaXRpb25hbCB0ZXN0cyBoZXJlOyBpbiBnZW5lcmFsCisgKiB0aGlzIGlzIG5lZWRlZCB3aGVuIHRoZSBzYW1lIG9wdGlvbiBjYW4gYmUgY2hhbmdlZCBhdCBib3RoIGNvbXBpbGUgdGltZSBhbmQKKyAqIHJ1biB0aW1lIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0IE9TIChpLmUuIGlPUyB2cyBBbmRyb2lkLikKKyAqCisgKiBOT1RFOiBzeW1ib2wgcHJlZml4aW5nIGRvZXMgbm90IHBhc3MgJChDRkxBR1MpIHRvIHRoZSBwcmVwcm9jZXNzb3IsIGJlY2F1c2UKKyAqIHRoaXMgaXMgbm90IHBvc3NpYmxlIHdpdGggY2VydGFpbiBjb21waWxlcnMgKE9yYWNsZSBTVU4gT1MgQ0MpLCBhcyBhIHJlc3VsdAorICogaXQgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IGFsbCBleHRlcm4gZnVuY3Rpb25zIHRoYXQgKm1pZ2h0KiBiZSB1c2VkCisgKiByZWdhcmRsZXNzIG9mICQoQ0ZMQUdTKSBnZXQgZGVjbGFyZWQgaW4gdGhpcyBmaWxlLiAgVGhlIHRlc3Qgb24gX19BUk1fTkVPTl9fCisgKiBiZWxvdyBpcyBvbmUgZXhhbXBsZSBvZiB0aGlzIGJlaGF2aW9yIGJlY2F1c2UgaXQgaXMgY29udHJvbGxlZCBieSB0aGUKKyAqIHByZXNlbmNlIG9yIG5vdCBvZiAtbWZwdT1uZW9uIG9uIHRoZSBHQ0MgY29tbWFuZCBsaW5lLCBpdCBpcyBwb3NzaWJsZSB0byBkbworICogdGhpcyBpbiAkKENDKSwgZS5nLiAiQ0M9Z2NjIC1tZnB1PW5lb24iLCBidXQgcGVvcGxlIHdobyBidWlsZCBsaWJwbmcgcmFyZWx5CisgKiBkbyB0aGlzLgorICovCisjaWZuZGVmIFBOR19BUk1fTkVPTl9PUFQKKyAgIC8qIEFSTSBORU9OIG9wdGltaXphdGlvbnMgYXJlIGJlaW5nIGNvbnRyb2xsZWQgYnkgdGhlIGNvbXBpbGVyIHNldHRpbmdzLAorICAgICogdHlwaWNhbGx5IHRoZSB0YXJnZXQgRlBVLiAgSWYgdGhlIEZQVSBoYXMgYmVlbiBzZXQgdG8gTkVPTiAoLW1mcHU9bmVvbgorICAgICogd2l0aCBHQ0MpIHRoZW4gdGhlIGNvbXBpbGVyIHdpbGwgZGVmaW5lIF9fQVJNX05FT05fXyBhbmQgd2UgY2FuIHJlbHkKKyAgICAqIHVuY29uZGl0aW9uYWxseSBvbiBORU9OIGluc3RydWN0aW9ucyBub3QgY3Jhc2hpbmcsIG90aGVyd2lzZSB3ZSBtdXN0CisgICAgKiBkaXNhYmxlIHVzZSBvZiBORU9OIGluc3RydWN0aW9ucy4KKyAgICAqCisgICAgKiBOT1RFOiBhdCBwcmVzZW50IHRoZXNlIG9wdGltaXphdGlvbnMgZGVwZW5kIG9uICdBTElHTkVEX01FTU9SWScsIHNvIHRoZXkKKyAgICAqIGNhbiBvbmx5IGJlIHR1cm5lZCBvbiBhdXRvbWF0aWNhbGx5IGlmIHRoYXQgaXMgc3VwcG9ydGVkIHRvby4gIElmCisgICAgKiBQTkdfQVJNX05FT05fT1BUIGlzIHNldCBpbiBDUFBGTEFHUyAodG8gPjApIHRoZW4gYXJtL2FybV9pbml0LmMgd2lsbCBmYWlsCisgICAgKiB0byBjb21waWxlIHdpdGggYW4gYXBwcm9wcmlhdGUgI2Vycm9yIGlmIEFMSUdORURfTUVNT1JZIGhhcyBiZWVuIHR1cm5lZAorICAgICogb2ZmLgorICAgICoKKyAgICAqIE5vdGUgdGhhdCBnY2MtNC45IGRlZmluZXMgX19BUk1fTkVPTiBpbnN0ZWFkIG9mIHRoZSBkZXByZWNhdGVkCisgICAgKiBfX0FSTV9ORU9OX18sIHNvIHdlIGNoZWNrIGJvdGggdmFyaWFudHMuCisgICAgKgorICAgICogVG8gZGlzYWJsZSBBUk1fTkVPTiBvcHRpbWl6YXRpb25zIGVudGlyZWx5LCBhbmQgc2tpcCBjb21waWxpbmcgdGhlCisgICAgKiBhc3NvY2lhdGVkIGFzc2VtYmxlciBjb2RlLCBwYXNzIC0tZW5hYmxlLWFybS1uZW9uPW5vIHRvIGNvbmZpZ3VyZQorICAgICogb3IgcHV0IC1EUE5HX0FSTV9ORU9OX09QVD0wIGluIENQUEZMQUdTLgorICAgICovCisjICBpZiAoZGVmaW5lZChfX0FSTV9ORU9OX18pIHx8IGRlZmluZWQoX19BUk1fTkVPTikpICYmIFwKKyAgIGRlZmluZWQoUE5HX0FMSUdORURfTUVNT1JZX1NVUFBPUlRFRCkKKyMgICAgIGRlZmluZSBQTkdfQVJNX05FT05fT1BUIDIKKyMgIGVsc2UKKyMgICAgIGRlZmluZSBQTkdfQVJNX05FT05fT1BUIDAKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIFBOR19BUk1fTkVPTl9PUFQgPiAwCisgICAvKiBORU9OIG9wdGltaXphdGlvbnMgYXJlIHRvIGJlIGF0IGxlYXN0IGNvbnNpZGVyZWQgYnkgbGlicG5nLCBzbyBlbmFibGUgdGhlCisgICAgKiBjYWxsYmFja3MgdG8gZG8gdGhpcy4KKyAgICAqLworIyAgZGVmaW5lIFBOR19GSUxURVJfT1BUSU1JWkFUSU9OUyBwbmdfaW5pdF9maWx0ZXJfZnVuY3Rpb25zX25lb24KKworICAgLyogQnkgZGVmYXVsdCB0aGUgJ2ludHJpbnNpY3MnIGNvZGUgaW4gYXJtL2ZpbHRlcl9uZW9uX2ludHJpbnNpY3MuYyBpcyB1c2VkCisgICAgKiBpZiBwb3NzaWJsZSAtIGlmIF9fQVJNX05FT05fXyBpcyBzZXQgYW5kIHRoZSBjb21waWxlciB2ZXJzaW9uIGlzIG5vdCBrbm93bgorICAgICogdG8gYmUgYnJva2VuLiAgVGhpcyBpcyBjb250cm9sbGVkIGJ5IFBOR19BUk1fTkVPTl9JTVBMRU1FTlRBVElPTiB3aGljaCBjYW4KKyAgICAqIGJlOgorICAgICoKKyAgICAqICAgIDEgIFRoZSBpbnRyaW5zaWNzIGNvZGUgKHRoZSBkZWZhdWx0IHdpdGggX19BUk1fTkVPTl9fKQorICAgICogICAgMiAgVGhlIGhhbmQgY29kZWQgYXNzZW1ibGVyICh0aGUgZGVmYXVsdCB3aXRob3V0IF9fQVJNX05FT05fXykKKyAgICAqCisgICAgKiBJdCBpcyBwb3NzaWJsZSB0byBzZXQgUE5HX0FSTV9ORU9OX0lNUExFTUVOVEFUSU9OIGluIENQUEZMQUdTLCBob3dldmVyCisgICAgKiB0aGlzIGlzICpOT1QqIHN1cHBvcnRlZCBhbmQgbWF5IGNlYXNlIHRvIHdvcmsgZXZlbiBhZnRlciBhIG1pbm9yIHJldmlzaW9uCisgICAgKiB0byBsaWJwbmcuICBJdCAqaXMqIHZhbGlkIHRvIGRvIHRoaXMgZm9yIHRlc3RpbmcgcHVycG9zZXMsIGUuZy4gc3BlZWQKKyAgICAqIHRlc3Rpbmcgb3IgYSBuZXcgY29tcGlsZXIsIGJ1dCB0aGUgcmVzdWx0cyBzaG91bGQgYmUgY29tbXVuaWNhdGVkIHRvIHRoZQorICAgICogbGlicG5nIGltcGxlbWVudGF0aW9uIGxpc3QgZm9yIGluY29ycG9yYXRpb24gaW4gdGhlIG5leHQgbWlub3IgcmVsZWFzZS4KKyAgICAqLworIyAgaWZuZGVmIFBOR19BUk1fTkVPTl9JTVBMRU1FTlRBVElPTgorIyAgICAgaWYgZGVmaW5lZChfX0FSTV9ORU9OX18pIHx8IGRlZmluZWQoX19BUk1fTkVPTikKKyMgICAgICAgIGlmIGRlZmluZWQoX19jbGFuZ19fKQorICAgICAgICAgICAgLyogQXQgcHJlc2VudCBpdCBpcyB1bmtub3duIGJ5IHRoZSBsaWJwbmcgZGV2ZWxvcGVycyB3aGljaCB2ZXJzaW9ucworICAgICAgICAgICAgICogb2YgY2xhbmcgc3VwcG9ydCB0aGUgaW50cmluc2ljcywgaG93ZXZlciBzb21lIG9yIHBlcmhhcHMgYWxsCisgICAgICAgICAgICAgKiB2ZXJzaW9ucyBkbyBub3Qgd29yayB3aXRoIHRoZSBhc3NlbWJsZXIgc28gdGhpcyBtYXkgYmUKKyAgICAgICAgICAgICAqIGlycmVsZXZhbnQsIHNvIGp1c3QgdXNlIHRoZSBkZWZhdWx0IChkbyBub3RoaW5nIGhlcmUuKQorICAgICAgICAgICAgICovCisjICAgICAgICBlbGlmIGRlZmluZWQoX19HTlVDX18pCisgICAgICAgICAgICAvKiBHQ0MgNC41LjQgTkVPTiBzdXBwb3J0IGlzIGtub3duIHRvIGJlIGJyb2tlbi4gIDQuNi4zIGlzIGtub3duIHRvCisgICAgICAgICAgICAgKiB3b3JrLCBzbyBpZiB0aGlzICppcyogR0NDLCBvciBHKyssIGxvb2sgZm9yIGEgdmVyc2lvbiA+NC41CisgICAgICAgICAgICAgKi8KKyMgICAgICAgICAgIGlmIF9fR05VQ19fIDwgNCB8fCAoX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA8IDYpCisjICAgICAgICAgICAgICBkZWZpbmUgUE5HX0FSTV9ORU9OX0lNUExFTUVOVEFUSU9OIDIKKyMgICAgICAgICAgIGVuZGlmIC8qIG5vIEdOVUMgc3VwcG9ydCAqLworIyAgICAgICAgZW5kaWYgLyogX19HTlVDX18gKi8KKyMgICAgIGVsc2UgLyogIWRlZmluZWQgX19BUk1fTkVPTl9fICovCisgICAgICAgICAvKiBUaGUgJ2ludHJpbnNpY3MnIGNvZGUgc2ltcGx5IHdvbid0IGNvbXBpbGUgd2l0aG91dCB0aGlzIC1tZnB1PW5lb246CisgICAgICAgICAgKi8KKyMgICAgICAgIGRlZmluZSBQTkdfQVJNX05FT05fSU1QTEVNRU5UQVRJT04gMgorIyAgICAgZW5kaWYgLyogX19BUk1fTkVPTl9fICovCisjICBlbmRpZiAvKiAhUE5HX0FSTV9ORU9OX0lNUExFTUVOVEFUSU9OICovCisKKyMgIGlmbmRlZiBQTkdfQVJNX05FT05fSU1QTEVNRU5UQVRJT04KKyAgICAgIC8qIFVzZSB0aGUgaW50cmluc2ljcyBjb2RlIGJ5IGRlZmF1bHQuICovCisjICAgICBkZWZpbmUgUE5HX0FSTV9ORU9OX0lNUExFTUVOVEFUSU9OIDEKKyMgIGVuZGlmCisjZW5kaWYgLyogUE5HX0FSTV9ORU9OX09QVCA+IDAgKi8KKworLyogSXMgdGhpcyBhIGJ1aWxkIG9mIGEgRExMIHdoZXJlIGNvbXBpbGF0aW9uIG9mIHRoZSBvYmplY3QgbW9kdWxlcyByZXF1aXJlcworICogZGlmZmVyZW50IHByZXByb2Nlc3NvciBzZXR0aW5ncyB0byB0aG9zZSByZXF1aXJlZCBmb3IgYSBzaW1wbGUgbGlicmFyeT8gIElmCisgKiBzbyBQTkdfQlVJTERfRExMIG11c3QgYmUgc2V0LgorICoKKyAqIElmIGxpYnBuZyBpcyB1c2VkIGluc2lkZSBhIERMTCBidXQgdGhhdCBETEwgZG9lcyBub3QgZXhwb3J0IHRoZSBsaWJwbmcgQVBJcworICogUE5HX0JVSUxEX0RMTCBtdXN0IG5vdCBiZSBzZXQuICBUbyBhdm9pZCB0aGUgY29kZSBiZWxvdyBraWNraW5nIGluIGJ1aWxkIGEKKyAqIHN0YXRpYyBsaWJyYXJ5IG9mIGxpYnBuZyB0aGVuIGxpbmsgdGhlIERMTCBhZ2FpbnN0IHRoYXQuCisgKi8KKyNpZm5kZWYgUE5HX0JVSUxEX0RMTAorIyAgaWZkZWYgRExMX0VYUE9SVAorICAgICAgLyogVGhpcyBpcyBzZXQgYnkgbGlidG9vbCB3aGVuIGZpbGVzIGFyZSBjb21waWxlZCBmb3IgYSBETEw7IGxpYnRvb2wKKyAgICAgICAqIGFsd2F5cyBjb21waWxlcyB0d2ljZSwgZXZlbiBvbiBzeXN0ZW1zIHdoZXJlIGl0IGlzbid0IG5lY2Vzc2FyeS4gIFNldAorICAgICAgICogUE5HX0JVSUxEX0RMTCBpbiBjYXNlIGl0IGlzIG5lY2Vzc2FyeToKKyAgICAgICAqLworIyAgICAgZGVmaW5lIFBOR19CVUlMRF9ETEwKKyMgIGVsc2UKKyMgICAgIGlmZGVmIF9XSU5ETEwKKyAgICAgICAgIC8qIFRoaXMgaXMgc2V0IGJ5IHRoZSBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBJREUgaW4gcHJvamVjdHMgdGhhdAorICAgICAgICAgICogYnVpbGQgYSBETEwuICBJdCBjYW4ndCBlYXNpbHkgYmUgcmVtb3ZlZCBmcm9tIHRob3NlIHByb2plY3RzIChpdAorICAgICAgICAgICogaXNuJ3QgdmlzaWJsZSBpbiB0aGUgVmlzdWFsIFN0dWRpbyBVSSkgc28gaXQgaXMgYSBmYWlybHkgcmVsaWFibGUKKyAgICAgICAgICAqIGluZGljYXRpb24gdGhhdCBQTkdfSU1QRVhQIG5lZWRzIHRvIGJlIHNldCB0byB0aGUgRExMIGV4cG9ydAorICAgICAgICAgICogYXR0cmlidXRlcy4KKyAgICAgICAgICAqLworIyAgICAgICAgZGVmaW5lIFBOR19CVUlMRF9ETEwKKyMgICAgIGVsc2UKKyMgICAgICAgIGlmZGVmIF9fRExMX18KKyAgICAgICAgICAgIC8qIFRoaXMgaXMgc2V0IGJ5IHRoZSBCb3JsYW5kIEMgc3lzdGVtIHdoZW4gY29tcGlsaW5nIGZvciBhIERMTAorICAgICAgICAgICAgICogKGFzIGFib3ZlLikKKyAgICAgICAgICAgICAqLworIyAgICAgICAgICAgZGVmaW5lIFBOR19CVUlMRF9ETEwKKyMgICAgICAgIGVsc2UKKyAgICAgICAgICAgIC8qIEFkZCBhZGRpdGlvbmFsIGNvbXBpbGVyIGNhc2VzIGhlcmUuICovCisjICAgICAgICBlbmRpZgorIyAgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYgLyogU2V0dGluZyBQTkdfQlVJTERfRExMIGlmIHJlcXVpcmVkICovCisKKy8qIFNlZSBwbmdjb25mLmggZm9yIG1vcmUgZGV0YWlsczogdGhlIGJ1aWxkZXIgb2YgdGhlIGxpYnJhcnkgbWF5IHNldCB0aGlzIG9uCisgKiB0aGUgY29tbWFuZCBsaW5lIHRvIHRoZSByaWdodCB0aGluZyBmb3IgdGhlIHNwZWNpZmljIGNvbXBpbGF0aW9uIHN5c3RlbSBvciBpdAorICogbWF5IGJlIGF1dG9tYWdpY2FsbHkgc2V0IGFib3ZlIChhdCBwcmVzZW50IHdlIGtub3cgb2Ygbm8gc3lzdGVtIHdoZXJlIGl0IGRvZXMKKyAqIG5lZWQgdG8gYmUgc2V0IG9uIHRoZSBjb21tYW5kIGxpbmUuKQorICoKKyAqIFBOR19JTVBFWFAgbXVzdCBiZSBzZXQgaGVyZSB3aGVuIGJ1aWxkaW5nIHRoZSBsaWJyYXJ5IHRvIHByZXZlbnQgcG5nY29uZi5oCisgKiBzZXR0aW5nIGl0IHRvIHRoZSAiaW1wb3J0IiBzZXR0aW5nIGZvciBhIERMTCBidWlsZC4KKyAqLworI2lmbmRlZiBQTkdfSU1QRVhQCisjICBpZmRlZiBQTkdfQlVJTERfRExMCisjICAgICBkZWZpbmUgUE5HX0lNUEVYUCBQTkdfRExMX0VYUE9SVAorIyAgZWxzZQorICAgICAgLyogTm90IGJ1aWxkaW5nIGEgRExMLCBvciB0aGUgRExMIGRvZXNuJ3QgcmVxdWlyZSBzcGVjaWZpYyBleHBvcnQKKyAgICAgICAqIGRlZmluaXRpb25zLgorICAgICAgICovCisjICAgICBkZWZpbmUgUE5HX0lNUEVYUAorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBObyB3YXJuaW5ncyBmb3IgcHJpdmF0ZSBvciBkZXByZWNhdGVkIGZ1bmN0aW9ucyBpbiB0aGUgYnVpbGQ6ICovCisjaWZuZGVmIFBOR19ERVBSRUNBVEVECisjICBkZWZpbmUgUE5HX0RFUFJFQ0FURUQKKyNlbmRpZgorI2lmbmRlZiBQTkdfUFJJVkFURQorIyAgZGVmaW5lIFBOR19QUklWQVRFCisjZW5kaWYKKworLyogU3ltYm9sIHByZXByb2Nlc3Npbmcgc3VwcG9ydC4KKyAqCisgKiBUbyBlbmFibGUgbGlzdGluZyBnbG9iYWwsIGJ1dCBpbnRlcm5hbCwgc3ltYm9scyB0aGUgZm9sbG93aW5nIG1hY3JvcyBzaG91bGQKKyAqIGFsd2F5cyBiZSB1c2VkIHRvIGRlY2xhcmUgYW4gZXh0ZXJuIGRhdGEgb3IgZnVuY3Rpb24gb2JqZWN0IGluIHRoaXMgZmlsZS4KKyAqLworI2lmbmRlZiBQTkdfSU5URVJOQUxfREFUQQorIyAgZGVmaW5lIFBOR19JTlRFUk5BTF9EQVRBKHR5cGUsIG5hbWUsIGFycmF5KSBQTkdfTElOS0FHRV9EQVRBIHR5cGUgbmFtZSBhcnJheQorI2VuZGlmCisKKyNpZm5kZWYgUE5HX0lOVEVSTkFMX0ZVTkNUSU9OCisjICBkZWZpbmUgUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHR5cGUsIG5hbWUsIGFyZ3MsIGF0dHJpYnV0ZXMpXAorICAgICAgUE5HX0xJTktBR0VfRlVOQ1RJT04gUE5HX0ZVTkNUSU9OKHR5cGUsIG5hbWUsIGFyZ3MsIFBOR19FTVBUWSBhdHRyaWJ1dGVzKQorI2VuZGlmCisKKyNpZm5kZWYgUE5HX0lOVEVSTkFMX0NBTExCQUNLCisjICBkZWZpbmUgUE5HX0lOVEVSTkFMX0NBTExCQUNLKHR5cGUsIG5hbWUsIGFyZ3MsIGF0dHJpYnV0ZXMpXAorICAgICAgUE5HX0xJTktBR0VfQ0FMTEJBQ0sgUE5HX0ZVTkNUSU9OKHR5cGUsIChQTkdDQkFQSSBuYW1lKSwgYXJncyxcCisgICAgICAgICBQTkdfRU1QVFkgYXR0cmlidXRlcykKKyNlbmRpZgorCisvKiBJZiBmbG9hdGluZyBvciBmaXhlZCBwb2ludCBBUElzIGFyZSBkaXNhYmxlZCB0aGV5IG1heSBzdGlsbCBiZSBjb21waWxlZAorICogaW50ZXJuYWxseS4gIFRvIGhhbmRsZSB0aGlzIG1ha2Ugc3VyZSB0aGV5IGFyZSBkZWNsYXJlZCBhcyB0aGUgYXBwcm9wcmlhdGUKKyAqIGludGVybmFsIGV4dGVybiBmdW5jdGlvbiAob3RoZXJ3aXNlIHRoZSBzeW1ib2wgcHJlZml4aW5nIHN0dWZmIHdvbid0IHdvcmsgYW5kCisgKiB0aGUgZnVuY3Rpb25zIHdpbGwgYmUgdXNlZCB3aXRob3V0IGRlZmluaXRpb25zLikKKyAqCisgKiBOT1RFOiBhbHRob3VnaCBhbGwgdGhlIEFQSSBmdW5jdGlvbnMgYXJlIGRlY2xhcmVkIGhlcmUgdGhleSBhcmUgbm90IGFsbAorICogYWN0dWFsbHkgYnVpbHQhICBCZWNhdXNlIHRoZSBkZWNsYXJhdGlvbnMgYXJlIHN0aWxsIG1hZGUgaXQgaXMgbmVjZXNzYXJ5IHRvCisgKiBmYWtlIG91dCB0eXBlcyB0aGF0IHRoZXkgZGVwZW5kIG9uLgorICovCisjaWZuZGVmIFBOR19GUF9FWFBPUlQKKyMgIGlmbmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECisjICAgICBkZWZpbmUgUE5HX0ZQX0VYUE9SVChvcmRpbmFsLCB0eXBlLCBuYW1lLCBhcmdzKVwKKyAgICAgICAgIFBOR19JTlRFUk5BTF9GVU5DVElPTih0eXBlLCBuYW1lLCBhcmdzLCBQTkdfRU1QVFkpOworIyAgICAgaWZuZGVmIFBOR19WRVJTSU9OX0lORk9fT05MWQorICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgcG5nX2luY29tcGxldGUgcG5nX2RvdWJsZTsKKyAgICAgICAgIHR5cGVkZWYgcG5nX2RvdWJsZSogICAgICAgICAgIHBuZ19kb3VibGVwOworICAgICAgICAgdHlwZWRlZiBjb25zdCBwbmdfZG91YmxlKiAgICAgcG5nX2NvbnN0X2RvdWJsZXA7CisgICAgICAgICB0eXBlZGVmIHBuZ19kb3VibGUqKiAgICAgICAgICBwbmdfZG91YmxlcHA7CisjICAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBQTkdfRklYRURfRVhQT1JUCisjICBpZm5kZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAorIyAgICAgZGVmaW5lIFBOR19GSVhFRF9FWFBPUlQob3JkaW5hbCwgdHlwZSwgbmFtZSwgYXJncylcCisgICAgICAgICBQTkdfSU5URVJOQUxfRlVOQ1RJT04odHlwZSwgbmFtZSwgYXJncywgUE5HX0VNUFRZKTsKKyMgIGVuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgInBuZy5oIgorCisvKiBwbmdjb25mLmggZG9lcyBub3Qgc2V0IFBOR19ETExfRVhQT1JUIHVubGVzcyBpdCBpcyByZXF1aXJlZCwgc286ICovCisjaWZuZGVmIFBOR19ETExfRVhQT1JUCisjICBkZWZpbmUgUE5HX0RMTF9FWFBPUlQKKyNlbmRpZgorCisvKiBUaGlzIGlzIGEgZ2xvYmFsIHN3aXRjaCB0byBzZXQgdGhlIGNvbXBpbGF0aW9uIGZvciBhbiBpbnN0YWxsZWQgc3lzdGVtCisgKiAoYSByZWxlYXNlIGJ1aWxkKS4gIEl0IGNhbiBiZSBzZXQgZm9yIHRlc3RpbmcgZGVidWcgYnVpbGRzIHRvIGVuc3VyZSB0aGF0CisgKiB0aGV5IHdpbGwgY29tcGlsZSB3aGVuIHRoZSBidWlsZCB0eXBlIGlzIHN3aXRjaGVkIHRvIFJDIG9yIFNUQUJMRSwgdGhlCisgKiBkZWZhdWx0IGlzIGp1c3QgdG8gdXNlIFBOR19MSUJQTkdfQlVJTERfQkFTRV9UWVBFLiAgU2V0IHRoaXMgaW4gQ1BQRkxBR1MKKyAqIHdpdGggZWl0aGVyOgorICoKKyAqICAgLURQTkdfUkVMRUFTRV9CVUlMRCBUdXJucyBvbiB0aGUgcmVsZWFzZSBjb21waWxlIHBhdGgKKyAqICAgLURQTkdfUkVMRUFTRV9CVUlMRD0wIFR1cm5zIGl0IG9mZgorICogb3IgaW4geW91ciBwbmd1c3IuaCB3aXRoCisgKiAgICNkZWZpbmUgUE5HX1JFTEVBU0VfQlVJTEQ9MSBUdXJucyBvbiB0aGUgcmVsZWFzZSBjb21waWxlIHBhdGgKKyAqICAgI2RlZmluZSBQTkdfUkVMRUFTRV9CVUlMRD0wIFR1cm5zIGl0IG9mZgorICovCisjaWZuZGVmIFBOR19SRUxFQVNFX0JVSUxECisjICBkZWZpbmUgUE5HX1JFTEVBU0VfQlVJTEQgKFBOR19MSUJQTkdfQlVJTERfQkFTRV9UWVBFID49IFBOR19MSUJQTkdfQlVJTERfUkMpCisjZW5kaWYKKworLyogU0VDVVJJVFkgYW5kIFNBRkVUWToKKyAqCisgKiBsaWJwbmcgaXMgYnVpbHQgd2l0aCBzdXBwb3J0IGZvciBpbnRlcm5hbCBsaW1pdHMgb24gaW1hZ2UgZGltZW5zaW9ucyBhbmQKKyAqIG1lbW9yeSB1c2FnZS4gIFRoZXNlIGFyZSBkb2N1bWVudGVkIGluIHNjcmlwdHMvcG5nbGliY29uZi5kZmEgb2YgdGhlCisgKiBzb3VyY2UgYW5kIHJlY29yZGVkIGluIHRoZSBtYWNoaW5lIGdlbmVyYXRlZCBoZWFkZXIgZmlsZSBwbmdsaWJjb25mLmguCisgKi8KKworLyogSWYgeW91IGFyZSBydW5uaW5nIG9uIGEgbWFjaGluZSB3aGVyZSB5b3UgY2Fubm90IGFsbG9jYXRlIG1vcmUKKyAqIHRoYW4gNjRLIG9mIG1lbW9yeSBhdCBvbmNlLCB1bmNvbW1lbnQgdGhpcy4gIFdoaWxlIGxpYnBuZyB3aWxsIG5vdAorICogbm9ybWFsbHkgbmVlZCB0aGF0IG11Y2ggbWVtb3J5IGluIGEgY2h1bmsgKHVubGVzcyB5b3UgbG9hZCB1cCBhIHZlcnkKKyAqIGxhcmdlIGZpbGUpLCB6bGliIG5lZWRzIHRvIGtub3cgaG93IGJpZyBvZiBhIGNodW5rIGl0IGNhbiB1c2UsIGFuZAorICogbGlicG5nIHRodXMgbWFrZXMgc3VyZSB0byBjaGVjayBhbnkgbWVtb3J5IGFsbG9jYXRpb24gdG8gdmVyaWZ5IGl0CisgKiB3aWxsIGZpdCBpbnRvIG1lbW9yeS4KKyAqCisgKiB6bGliIHByb3ZpZGVzICdNQVhTRUdfNjRLJyB3aGljaCwgaWYgZGVmaW5lZCwgaW5kaWNhdGVzIHRoZQorICogc2FtZSBsaW1pdCBhbmQgcG5nY29uZi5oIChhbHJlYWR5IGluY2x1ZGVkKSBzZXRzIHRoZSBsaW1pdAorICogaWYgY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcyBhcmUgZGV0ZWN0ZWQuCisgKi8KKyNpZiBkZWZpbmVkKE1BWFNFR182NEspICYmICFkZWZpbmVkKFBOR19NQVhfTUFMTE9DXzY0SykKKyMgIGRlZmluZSBQTkdfTUFYX01BTExPQ182NEsKKyNlbmRpZgorCisjaWZuZGVmIFBOR19VTlVTRUQKKy8qIFVudXNlZCBmb3JtYWwgcGFyYW1ldGVyIHdhcm5pbmdzIGFyZSBzaWxlbmNlZCB1c2luZyB0aGUgZm9sbG93aW5nIG1hY3JvCisgKiB3aGljaCBpcyBleHBlY3RlZCB0byBoYXZlIG5vIGJhZCBlZmZlY3RzIG9uIHBlcmZvcm1hbmNlIChvcHRpbWl6aW5nCisgKiBjb21waWxlcnMgd2lsbCBwcm9iYWJseSByZW1vdmUgaXQgZW50aXJlbHkpLiAgTm90ZSB0aGF0IGlmIHlvdSByZXBsYWNlCisgKiBpdCB3aXRoIHNvbWV0aGluZyBvdGhlciB0aGFuIHdoaXRlc3BhY2UsIHlvdSBtdXN0IGluY2x1ZGUgdGhlIHRlcm1pbmF0aW5nCisgKiBzZW1pY29sb24uCisgKi8KKyMgIGRlZmluZSBQTkdfVU5VU0VEKHBhcmFtKSAodm9pZClwYXJhbTsKKyNlbmRpZgorCisvKiBKdXN0IGEgbGl0dGxlIGNoZWNrIHRoYXQgc29tZW9uZSBoYXNuJ3QgdHJpZWQgdG8gZGVmaW5lIHNvbWV0aGluZworICogY29udHJhZGljdG9yeS4KKyAqLworI2lmIChQTkdfWkJVRl9TSVpFID4gNjU1MzZMKSAmJiBkZWZpbmVkKFBOR19NQVhfTUFMTE9DXzY0SykKKyMgIHVuZGVmIFBOR19aQlVGX1NJWkUKKyMgIGRlZmluZSBQTkdfWkJVRl9TSVpFIDY1NTM2TAorI2VuZGlmCisKKy8qIElmIHdhcm5pbmdzIG9yIGVycm9ycyBhcmUgdHVybmVkIG9mZiB0aGUgY29kZSBpcyBkaXNhYmxlZCBvciByZWRpcmVjdGVkIGhlcmUuCisgKiBGcm9tIDEuNS40IGZ1bmN0aW9ucyBoYXZlIGJlZW4gYWRkZWQgdG8gYWxsb3cgdmVyeSBsaW1pdGVkIGZvcm1hdHRpbmcgb2YKKyAqIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzIC0gdGhpcyBjb2RlIHdpbGwgYWxzbyBiZSBkaXNhYmxlZCBoZXJlLgorICovCisjaWZkZWYgUE5HX1dBUk5JTkdTX1NVUFBPUlRFRAorIyAgZGVmaW5lIFBOR19XQVJOSU5HX1BBUkFNRVRFUlMocCkgcG5nX3dhcm5pbmdfcGFyYW1ldGVycyBwOworI2Vsc2UKKyMgIGRlZmluZSBwbmdfd2FybmluZ19wYXJhbWV0ZXIocCxudW1iZXIsc3RyaW5nKSAoKHZvaWQpMCkKKyMgIGRlZmluZSBwbmdfd2FybmluZ19wYXJhbWV0ZXJfdW5zaWduZWQocCxudW1iZXIsZm9ybWF0LHZhbHVlKSAoKHZvaWQpMCkKKyMgIGRlZmluZSBwbmdfd2FybmluZ19wYXJhbWV0ZXJfc2lnbmVkKHAsbnVtYmVyLGZvcm1hdCx2YWx1ZSkgKCh2b2lkKTApCisjICBkZWZpbmUgcG5nX2Zvcm1hdHRlZF93YXJuaW5nKHBwLHAsbWVzc2FnZSkgKCh2b2lkKShwcCkpCisjICBkZWZpbmUgUE5HX1dBUk5JTkdfUEFSQU1FVEVSUyhwKQorI2VuZGlmCisjaWZuZGVmIFBOR19FUlJPUl9URVhUX1NVUFBPUlRFRAorIyAgZGVmaW5lIHBuZ19maXhlZF9lcnJvcihzMSxzMikgcG5nX2VycihzMSkKKyNlbmRpZgorCisvKiBDIGFsbG93cyB1cC1jYXN0cyBmcm9tICh2b2lkKikgdG8gYW55IHBvaW50ZXIgYW5kIChjb25zdCB2b2lkKikgdG8gYW55CisgKiBwb2ludGVyIHRvIGEgY29uc3Qgb2JqZWN0LiAgQysrIHJlZ2FyZHMgdGhpcyBhcyBhIHR5cGUgZXJyb3IgYW5kIHJlcXVpcmVzIGFuCisgKiBleHBsaWNpdCwgc3RhdGljLCBjYXN0IGFuZCBwcm92aWRlcyB0aGUgc3RhdGljX2Nhc3Q8PiBydW5lIHRvIGVuc3VyZSB0aGF0CisgKiBjb25zdCBpcyBub3QgY2FzdCBhd2F5LgorICovCisjaWZkZWYgX19jcGx1c3BsdXMKKyMgIGRlZmluZSBwbmdfdm9pZGNhc3QodHlwZSwgdmFsdWUpIHN0YXRpY19jYXN0PHR5cGU+KHZhbHVlKQorIyAgZGVmaW5lIHBuZ19jb25zdGNhc3QodHlwZSwgdmFsdWUpIGNvbnN0X2Nhc3Q8dHlwZT4odmFsdWUpCisjICBkZWZpbmUgcG5nX2FsaWduY2FzdCh0eXBlLCB2YWx1ZSkgXAorICAgc3RhdGljX2Nhc3Q8dHlwZT4oc3RhdGljX2Nhc3Q8dm9pZCo+KHZhbHVlKSkKKyMgIGRlZmluZSBwbmdfYWxpZ25jYXN0Y29uc3QodHlwZSwgdmFsdWUpIFwKKyAgIHN0YXRpY19jYXN0PHR5cGU+KHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPih2YWx1ZSkpCisjZWxzZQorIyAgZGVmaW5lIHBuZ192b2lkY2FzdCh0eXBlLCB2YWx1ZSkgKHZhbHVlKQorIyAgZGVmaW5lIHBuZ19jb25zdGNhc3QodHlwZSwgdmFsdWUpICgodHlwZSkodmFsdWUpKQorIyAgZGVmaW5lIHBuZ19hbGlnbmNhc3QodHlwZSwgdmFsdWUpICgodm9pZCopKHZhbHVlKSkKKyMgIGRlZmluZSBwbmdfYWxpZ25jYXN0Y29uc3QodHlwZSwgdmFsdWUpICgoY29uc3Qgdm9pZCopKHZhbHVlKSkKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisvKiBTb21lIGZpeGVkIHBvaW50IEFQSXMgYXJlIHN0aWxsIHJlcXVpcmVkIGV2ZW4gaWYgbm90IGV4cG9ydGVkIGJlY2F1c2UKKyAqIHRoZXkgZ2V0IHVzZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgZmxvYXRpbmcgcG9pbnQgQVBJcy4gIFRoaXMgbWFnaWMKKyAqIGRlYWxzIHdpdGggdGhpczoKKyAqLworI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKKyMgIGRlZmluZSBQTkdGQVBJIFBOR0FQSQorI2Vsc2UKKyMgIGRlZmluZSBQTkdGQVBJIC8qIFBSSVZBVEUgKi8KKyNlbmRpZgorCisjaWZuZGVmIFBOR19WRVJTSU9OX0lORk9fT05MWQorLyogT3RoZXIgZGVmaW5lcyBzcGVjaWZpYyB0byBjb21waWxlcnMgY2FuIGdvIGhlcmUuICBUcnkgdG8ga2VlcAorICogdGhlbSBpbnNpZGUgYW4gYXBwcm9wcmlhdGUgaWZkZWYvZW5kaWYgcGFpciBmb3IgcG9ydGFiaWxpdHkuCisgKi8KKyNpZiBkZWZpbmVkKFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQpIHx8XAorICAgIGRlZmluZWQoUE5HX0ZMT0FUSU5HX0FSSVRITUVUSUNfU1VQUE9SVEVEKQorICAgLyogcG5nLmMgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBBTlNJLUMgY29uc3RhbnRzIGlmIHRoZSBjb252ZXJzaW9uIG9mCisgICAgKiBmbG9hdGluZyBwb2ludCB0byBBU0NJSSBpcyBpbXBsZW1lbnRlZCB0aGVyZWluOgorICAgICoKKyAgICAqICBEQkxfRElHICBNYXhpbXVtIG51bWJlciBvZiBkZWNpbWFsIGRpZ2l0cyAoY2FuIGJlIHNldCB0byBhbnkgY29uc3RhbnQpCisgICAgKiAgREJMX01JTiAgU21hbGxlc3Qgbm9ybWFsaXplZCBmcCBudW1iZXIgKGNhbiBiZSBzZXQgdG8gYW4gYXJiaXRyYXJ5IHZhbHVlKQorICAgICogIERCTF9NQVggIE1heGltdW0gZmxvYXRpbmcgcG9pbnQgbnVtYmVyIChjYW4gYmUgc2V0IHRvIGFuIGFyYml0cmFyeSB2YWx1ZSkKKyAgICAqLworIyAgaW5jbHVkZSA8ZmxvYXQuaD4KKworIyAgaWYgKGRlZmluZWQoX19NV0VSS1NfXykgJiYgZGVmaW5lZChtYWNpbnRvc2gpKSB8fCBkZWZpbmVkKGFwcGxlYykgfHwgXAorICAgIGRlZmluZWQoVEhJTktfQykgfHwgZGVmaW5lZChfX1NDX18pIHx8IGRlZmluZWQoVEFSR0VUX09TX01BQykKKyAgICAgLyogV2UgbmVlZCB0byBjaGVjayB0aGF0IDxtYXRoLmg+IGhhc24ndCBhbHJlYWR5IGJlZW4gaW5jbHVkZWQgZWFybGllcgorICAgICAgKiBhcyBpdCBzZWVtcyBpdCBkb2Vzbid0IGFncmVlIHdpdGggPGZwLmg+LCB5ZXQgd2Ugc2hvdWxkIHJlYWxseSB1c2UKKyAgICAgICogPGZwLmg+IGlmIHBvc3NpYmxlLgorICAgICAgKi8KKyMgICAgaWYgIWRlZmluZWQoX19NQVRIX0hfXykgJiYgIWRlZmluZWQoX19NQVRIX0gpICYmICFkZWZpbmVkKF9fY21hdGhfXykKKyMgICAgICBpbmNsdWRlIDxmcC5oPgorIyAgICBlbmRpZgorIyAgZWxzZQorIyAgICBpbmNsdWRlIDxtYXRoLmg+CisjICBlbmRpZgorIyAgaWYgZGVmaW5lZChfQU1JR0EpICYmIGRlZmluZWQoX19TQVNDKSAmJiBkZWZpbmVkKF9NNjg4ODEpCisgICAgIC8qIEFtaWdhIFNBUy9DOiBXZSBtdXN0IGluY2x1ZGUgYnVpbHRpbiBGUFUgZnVuY3Rpb25zIHdoZW4gY29tcGlsaW5nIHVzaW5nCisgICAgICAqIE1BVEg9Njg4ODEKKyAgICAgICovCisjICAgIGluY2x1ZGUgPG02ODg4MS5oPgorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBUaGlzIHByb3ZpZGVzIHRoZSBub24tQU5TSSAoZmFyKSBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcy4gKi8KKyNpZiBkZWZpbmVkKF9fVFVSQk9DX18pICYmIGRlZmluZWQoX19NU0RPU19fKQorIyAgaW5jbHVkZSA8bWVtLmg+CisjICBpbmNsdWRlIDxhbGxvYy5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XaW5kb3dzKSB8fCBkZWZpbmVkKF9XSU5ET1dTKSB8fCBcCisgICAgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKQorIyAgaW5jbHVkZSA8d2luZG93cy5oPiAgLyogZGVmaW5lcyBfV0lORE9XU18gbWFjcm8gKi8KKyNlbmRpZgorI2VuZGlmIC8qIFBOR19WRVJTSU9OX0lORk9fT05MWSAqLworCisvKiBNb3ZlZCBoZXJlIGFyb3VuZCAxLjUuMGJldGEzNiBmcm9tIHBuZ2NvbmYuaCAqLworLyogVXNlcnMgbWF5IHdhbnQgdG8gdXNlIHRoZXNlIHNvIHRoZXkgYXJlIG5vdCBwcml2YXRlLiAgQW55IGxpYnJhcnkKKyAqIGZ1bmN0aW9ucyB0aGF0IGFyZSBwYXNzZWQgZmFyIGRhdGEgbXVzdCBiZSBtb2RlbC1pbmRlcGVuZGVudC4KKyAqLworCisvKiBNZW1vcnkgbW9kZWwvcGxhdGZvcm0gaW5kZXBlbmRlbnQgZm5zICovCisjaWZuZGVmIFBOR19BQk9SVAorIyAgaWZkZWYgX1dJTkRPV1NfCisjICAgIGRlZmluZSBQTkdfQUJPUlQoKSBFeGl0UHJvY2VzcygwKQorIyAgZWxzZQorIyAgICBkZWZpbmUgUE5HX0FCT1JUKCkgYWJvcnQoKQorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBUaGVzZSBtYWNyb3MgbWF5IG5lZWQgdG8gYmUgYXJjaGl0ZWN0dXJlIGRlcGVuZGVudC4gKi8KKyNkZWZpbmUgUE5HX0FMSUdOX05PTkUgICAwIC8qIGRvIG5vdCB1c2UgZGF0YSBhbGlnbm1lbnQgKi8KKyNkZWZpbmUgUE5HX0FMSUdOX0FMV0FZUyAxIC8qIGFzc3VtZSB1bmFsaWduZWQgYWNjZXNzZXMgYXJlIE9LICovCisjaWZkZWYgb2Zmc2V0b2YKKyMgIGRlZmluZSBQTkdfQUxJR05fT0ZGU0VUIDIgLyogdXNlIG9mZnNldG9mIHRvIGRldGVybWluZSBhbGlnbm1lbnQgKi8KKyNlbHNlCisjICBkZWZpbmUgUE5HX0FMSUdOX09GRlNFVCAtMSAvKiBwcmV2ZW50IHRoZSB1c2Ugb2YgdGhpcyAqLworI2VuZGlmCisjZGVmaW5lIFBOR19BTElHTl9TSVpFICAgMyAvKiB1c2Ugc2l6ZW9mIHRvIGRldGVybWluZSBhbGlnbm1lbnQgKi8KKworI2lmbmRlZiBQTkdfQUxJR05fVFlQRQorICAgLyogRGVmYXVsdCB0byB1c2luZyBhbGlnbmVkIGFjY2VzcyBvcHRpbWl6YXRpb25zIGFuZCByZXF1aXJpbmcgYWxpZ25tZW50IHRvIGEKKyAgICAqIG11bHRpcGxlIG9mIHRoZSBkYXRhIHR5cGUgc2l6ZS4gIE92ZXJyaWRlIGluIGEgY29tcGlsZXIgc3BlY2lmaWMgZmFzaGlvbgorICAgICogaWYgbmVjZXNzYXJ5IGJ5IGluc2VydGluZyB0ZXN0cyBoZXJlOgorICAgICovCisjICBkZWZpbmUgUE5HX0FMSUdOX1RZUEUgUE5HX0FMSUdOX1NJWkUKKyNlbmRpZgorCisjaWYgUE5HX0FMSUdOX1RZUEUgPT0gUE5HX0FMSUdOX1NJWkUKKyAgIC8qIFRoaXMgaXMgdXNlZCBiZWNhdXNlIGluIHNvbWUgY29tcGlsZXIgaW1wbGVtZW50YXRpb25zIG5vbi1hbGlnbmVkCisgICAgKiBzdHJ1Y3R1cmUgbWVtYmVycyBhcmUgc3VwcG9ydGVkLCBzbyB0aGUgb2Zmc2V0b2YgYXBwcm9hY2ggYmVsb3cgZmFpbHMuCisgICAgKiBTZXQgUE5HX0FMSUdOX1NJWkU9MCBmb3IgY29tcGlsZXIgY29tYmluYXRpb25zIHdoZXJlIHVuYWxpZ25lZCBhY2Nlc3MKKyAgICAqIGlzIGdvb2QgZm9yIHBlcmZvcm1hbmNlLiAgRG8gbm90IGRvIHRoaXMgdW5sZXNzIHlvdSBoYXZlIHRlc3RlZCB0aGUgcmVzdWx0CisgICAgKiBhbmQgdW5kZXJzdGFuZCBpdC4KKyAgICAqLworIyAgZGVmaW5lIHBuZ19hbGlnbm9mKHR5cGUpIChzaXplb2YgKHR5cGUpKQorI2Vsc2UKKyMgIGlmIFBOR19BTElHTl9UWVBFID09IFBOR19BTElHTl9PRkZTRVQKKyMgICAgIGRlZmluZSBwbmdfYWxpZ25vZih0eXBlKSBvZmZzZXRvZihzdHJ1Y3R7Y2hhciBjOyB0eXBlIHQ7fSwgdCkKKyMgIGVsc2UKKyMgICAgIGlmIFBOR19BTElHTl9UWVBFID09IFBOR19BTElHTl9BTFdBWVMKKyMgICAgICAgIGRlZmluZSBwbmdfYWxpZ25vZih0eXBlKSAoMSkKKyMgICAgIGVuZGlmCisgICAgICAvKiBFbHNlIGxlYXZlIHBuZ19hbGlnbm9mIHVuZGVmaW5lZCB0byBwcmV2ZW50IHVzZSB0aGVyZW9mICovCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFRoaXMgaW1wbGljaXRseSBhc3N1bWVzIGFsaWdubWVudCBpcyBhbHdheXMgdG8gYSBwb3dlciBvZiAyLiAqLworI2lmZGVmIHBuZ19hbGlnbm9mCisjICBkZWZpbmUgcG5nX2lzYWxpZ25lZChwdHIsIHR5cGUpXAorICAgKCgoKGNvbnN0IGNoYXIqKXB0ci0oY29uc3QgY2hhciopMCkgJiAocG5nX2FsaWdub2YodHlwZSktMSkpID09IDApCisjZWxzZQorIyAgZGVmaW5lIHBuZ19pc2FsaWduZWQocHRyLCB0eXBlKSAwCisjZW5kaWYKKworLyogRW5kIG9mIG1lbW9yeSBtb2RlbC9wbGF0Zm9ybSBpbmRlcGVuZGVudCBzdXBwb3J0ICovCisvKiBFbmQgb2YgMS41LjBiZXRhMzYgbW92ZSBmcm9tIHBuZ2NvbmYuaCAqLworCisvKiBDT05TVEFOVFMgYW5kIFVUSUxJVFkgTUFDUk9TCisgKiBUaGVzZSBhcmUgdXNlZCBpbnRlcm5hbGx5IGJ5IGxpYnBuZyBhbmQgbm90IGV4cG9zZWQgaW4gdGhlIEFQSQorICovCisKKy8qIFZhcmlvdXMgbW9kZXMgb2Ygb3BlcmF0aW9uLiAgTm90ZSB0aGF0IGFmdGVyIGFuIGluaXQsIG1vZGUgaXMgc2V0IHRvCisgKiB6ZXJvIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgc3RydWN0dXJlIGlzIGNyZWF0ZWQuICBUaHJlZSBvZiB0aGVzZQorICogYXJlIGRlZmluZWQgaW4gcG5nLmggYmVjYXVzZSB0aGV5IG5lZWQgdG8gYmUgdmlzaWJsZSB0byBhcHBsaWNhdGlvbnMKKyAqIHRoYXQgY2FsbCBwbmdfc2V0X3Vua25vd25fY2h1bmsoKS4KKyAqLworLyogI2RlZmluZSBQTkdfSEFWRV9JSERSICAgICAgICAgICAgMHgwMSAoZGVmaW5lZCBpbiBwbmcuaCkgKi8KKy8qICNkZWZpbmUgUE5HX0hBVkVfUExURSAgICAgICAgICAgIDB4MDIgKGRlZmluZWQgaW4gcG5nLmgpICovCisjZGVmaW5lIFBOR19IQVZFX0lEQVQgICAgICAgICAgICAgICAweDA0CisvKiAjZGVmaW5lIFBOR19BRlRFUl9JREFUICAgICAgICAgICAweDA4IChkZWZpbmVkIGluIHBuZy5oKSAqLworI2RlZmluZSBQTkdfSEFWRV9JRU5EICAgICAgICAgICAgICAgMHgxMAorICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgMHgyMCAodW51c2VkKSAqLworICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgMHg0MCAodW51c2VkKSAqLworICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgMHg4MCAodW51c2VkKSAqLworI2RlZmluZSBQTkdfSEFWRV9DSFVOS19IRUFERVIgICAgICAweDEwMAorI2RlZmluZSBQTkdfV1JPVEVfdElNRSAgICAgICAgICAgICAweDIwMAorI2RlZmluZSBQTkdfV1JPVEVfSU5GT19CRUZPUkVfUExURSAweDQwMAorI2RlZmluZSBQTkdfQkFDS0dST1VORF9JU19HUkFZICAgICAweDgwMAorI2RlZmluZSBQTkdfSEFWRV9QTkdfU0lHTkFUVVJFICAgIDB4MTAwMAorI2RlZmluZSBQTkdfSEFWRV9DSFVOS19BRlRFUl9JREFUIDB4MjAwMCAvKiBIYXZlIGFub3RoZXIgY2h1bmsgYWZ0ZXIgSURBVCAqLworICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgIDB4NDAwMCAodW51c2VkKSAqLworI2RlZmluZSBQTkdfSVNfUkVBRF9TVFJVQ1QgICAgICAgIDB4ODAwMCAvKiBFbHNlIGlzIGEgd3JpdGUgc3RydWN0ICovCisKKy8qIEZsYWdzIGZvciB0aGUgdHJhbnNmb3JtYXRpb25zIHRoZSBQTkcgbGlicmFyeSBkb2VzIG9uIHRoZSBpbWFnZSBkYXRhICovCisjZGVmaW5lIFBOR19CR1IgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBQTkdfSU5URVJMQUNFICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgUE5HX1BBQ0sgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFBOR19TSElGVCAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBQTkdfU1dBUF9CWVRFUyAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgUE5HX0lOVkVSVF9NT05PICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFBOR19RVUFOVElaRSAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBQTkdfQ09NUE9TRSAgICAgICAgICAgICAweDAwODAgICAgIC8qIFdhcyBQTkdfQkFDS0dST1VORCAqLworI2RlZmluZSBQTkdfQkFDS0dST1VORF9FWFBBTkQgICAweDAxMDAKKyNkZWZpbmUgUE5HX0VYUEFORF8xNiAgICAgICAgICAgMHgwMjAwICAgICAvKiBBZGRlZCB0byBsaWJwbmcgMS41LjIgKi8KKyNkZWZpbmUgUE5HXzE2X1RPXzggICAgICAgICAgICAgMHgwNDAwICAgICAvKiBCZWNvbWVzICdjaG9wJyBpbiAxLjUuNCAqLworI2RlZmluZSBQTkdfUkdCQSAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgUE5HX0VYUEFORCAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFBOR19HQU1NQSAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBQTkdfR1JBWV9UT19SR0IgICAgICAgICAweDQwMDAKKyNkZWZpbmUgUE5HX0ZJTExFUiAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIFBOR19QQUNLU1dBUCAgICAgICAgICAgMHgxMDAwMAorI2RlZmluZSBQTkdfU1dBUF9BTFBIQSAgICAgICAgIDB4MjAwMDAKKyNkZWZpbmUgUE5HX1NUUklQX0FMUEhBICAgICAgICAweDQwMDAwCisjZGVmaW5lIFBOR19JTlZFUlRfQUxQSEEgICAgICAgMHg4MDAwMAorI2RlZmluZSBQTkdfVVNFUl9UUkFOU0ZPUk0gICAgMHgxMDAwMDAKKyNkZWZpbmUgUE5HX1JHQl9UT19HUkFZX0VSUiAgIDB4MjAwMDAwCisjZGVmaW5lIFBOR19SR0JfVE9fR1JBWV9XQVJOICAweDQwMDAwMAorI2RlZmluZSBQTkdfUkdCX1RPX0dSQVkgICAgICAgMHg2MDAwMDAgLyogdHdvIGJpdHMsIFJHQl9UT19HUkFZX0VSUnxXQVJOICovCisjZGVmaW5lIFBOR19FTkNPREVfQUxQSEEgICAgICAweDgwMDAwMCAvKiBBZGRlZCB0byBsaWJwbmctMS41LjQgKi8KKyNkZWZpbmUgUE5HX0FERF9BTFBIQSAgICAgICAgMHgxMDAwMDAwIC8qIEFkZGVkIHRvIGxpYnBuZy0xLjIuNyAqLworI2RlZmluZSBQTkdfRVhQQU5EX3RSTlMgICAgICAweDIwMDAwMDAgLyogQWRkZWQgdG8gbGlicG5nLTEuMi45ICovCisjZGVmaW5lIFBOR19TQ0FMRV8xNl9UT184ICAgIDB4NDAwMDAwMCAvKiBBZGRlZCB0byBsaWJwbmctMS41LjQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogICAgMHg4MDAwMDAwIHVudXNlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiAgIDB4MTAwMDAwMDAgdW51c2VkICovCisgICAgICAgICAgICAgICAgICAgICAgIC8qICAgMHgyMDAwMDAwMCB1bnVzZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogICAweDQwMDAwMDAwIHVudXNlZCAqLworLyogRmxhZ3MgZm9yIHBuZ19jcmVhdGVfc3RydWN0ICovCisjZGVmaW5lIFBOR19TVFJVQ1RfUE5HICAgMHgwMDAxCisjZGVmaW5lIFBOR19TVFJVQ1RfSU5GTyAgMHgwMDAyCisKKy8qIEZsYWdzIGZvciB0aGUgcG5nX3B0ci0+ZmxhZ3MgcmF0aGVyIHRoYW4gZGVjbGFyaW5nIGEgYnl0ZSBmb3IgZWFjaCBvbmUgKi8KKyNkZWZpbmUgUE5HX0ZMQUdfWkxJQl9DVVNUT01fU1RSQVRFR1kgICAgIDB4MDAwMQorI2RlZmluZSBQTkdfRkxBR19aU1RSRUFNX0lOSVRJQUxJWkVEICAgICAgMHgwMDAyIC8qIEFkZGVkIHRvIGxpYnBuZy0xLjYuMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgMHgwMDA0ICAgIHVudXNlZCAqLworI2RlZmluZSBQTkdfRkxBR19aU1RSRUFNX0VOREVEICAgICAgICAgICAgMHgwMDA4IC8qIEFkZGVkIHRvIGxpYnBuZy0xLjYuMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgMHgwMDEwICAgIHVudXNlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgMHgwMDIwICAgIHVudXNlZCAqLworI2RlZmluZSBQTkdfRkxBR19ST1dfSU5JVCAgICAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFBOR19GTEFHX0ZJTExFUl9BRlRFUiAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9VU0UgICAgICAgIDB4MDEwMAorI2RlZmluZSBQTkdfRkxBR19DUkNfQU5DSUxMQVJZX05PV0FSTiAgICAgMHgwMjAwCisjZGVmaW5lIFBOR19GTEFHX0NSQ19DUklUSUNBTF9VU0UgICAgICAgICAweDA0MDAKKyNkZWZpbmUgUE5HX0ZMQUdfQ1JDX0NSSVRJQ0FMX0lHTk9SRSAgICAgIDB4MDgwMAorI2RlZmluZSBQTkdfRkxBR19BU1NVTUVfc1JHQiAgICAgICAgICAgICAgMHgxMDAwIC8qIEFkZGVkIHRvIGxpYnBuZy0xLjUuNCAqLworI2RlZmluZSBQTkdfRkxBR19PUFRJTUlaRV9BTFBIQSAgICAgICAgICAgMHgyMDAwIC8qIEFkZGVkIHRvIGxpYnBuZy0xLjUuNCAqLworI2RlZmluZSBQTkdfRkxBR19ERVRFQ1RfVU5JTklUSUFMSVpFRCAgICAgMHg0MDAwIC8qIEFkZGVkIHRvIGxpYnBuZy0xLjUuNCAqLworLyogI2RlZmluZSBQTkdfRkxBR19LRUVQX1VOS05PV05fQ0hVTktTICAgICAgMHg4MDAwICovCisvKiAjZGVmaW5lIFBOR19GTEFHX0tFRVBfVU5TQUZFX0NIVU5LUyAgICAgIDB4MTAwMDAgKi8KKyNkZWZpbmUgUE5HX0ZMQUdfTElCUkFSWV9NSVNNQVRDSCAgICAgICAgMHgyMDAwMAorI2RlZmluZSBQTkdfRkxBR19TVFJJUF9FUlJPUl9OVU1CRVJTICAgICAweDQwMDAwCisjZGVmaW5lIFBOR19GTEFHX1NUUklQX0VSUk9SX1RFWFQgICAgICAgIDB4ODAwMDAKKyNkZWZpbmUgUE5HX0ZMQUdfQkVOSUdOX0VSUk9SU19XQVJOICAgICAweDEwMDAwMCAvKiBBZGRlZCB0byBsaWJwbmctMS40LjAgKi8KKyNkZWZpbmUgUE5HX0ZMQUdfQVBQX1dBUk5JTkdTX1dBUk4gICAgICAweDIwMDAwMCAvKiBBZGRlZCB0byBsaWJwbmctMS42LjAgKi8KKyNkZWZpbmUgUE5HX0ZMQUdfQVBQX0VSUk9SU19XQVJOICAgICAgICAweDQwMDAwMCAvKiBBZGRlZCB0byBsaWJwbmctMS42LjAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAweDgwMDAwMCAgICB1bnVzZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIDB4MTAwMDAwMCAgICB1bnVzZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIDB4MjAwMDAwMCAgICB1bnVzZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIDB4NDAwMDAwMCAgICB1bnVzZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIDB4ODAwMDAwMCAgICB1bnVzZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMHgxMDAwMDAwMCAgICB1bnVzZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMHgyMDAwMDAwMCAgICB1bnVzZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMHg0MDAwMDAwMCAgICB1bnVzZWQgKi8KKworI2RlZmluZSBQTkdfRkxBR19DUkNfQU5DSUxMQVJZX01BU0sgKFBOR19GTEFHX0NSQ19BTkNJTExBUllfVVNFIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19GTEFHX0NSQ19BTkNJTExBUllfTk9XQVJOKQorCisjZGVmaW5lIFBOR19GTEFHX0NSQ19DUklUSUNBTF9NQVNLICAoUE5HX0ZMQUdfQ1JDX0NSSVRJQ0FMX1VTRSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfRkxBR19DUkNfQ1JJVElDQUxfSUdOT1JFKQorCisjZGVmaW5lIFBOR19GTEFHX0NSQ19NQVNLICAgICAgICAgICAoUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9NQVNLIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19GTEFHX0NSQ19DUklUSUNBTF9NQVNLKQorCisvKiBTYXZlIHR5cGluZyBhbmQgbWFrZSBjb2RlIGVhc2llciB0byB1bmRlcnN0YW5kICovCisKKyNkZWZpbmUgUE5HX0NPTE9SX0RJU1QoYzEsIGMyKSAoYWJzKChpbnQpKChjMSkucmVkKSAtIChpbnQpKChjMikucmVkKSkgKyBcCisgICBhYnMoKGludCkoKGMxKS5ncmVlbikgLSAoaW50KSgoYzIpLmdyZWVuKSkgKyBcCisgICBhYnMoKGludCkoKGMxKS5ibHVlKSAtIChpbnQpKChjMikuYmx1ZSkpKQorCisvKiBBZGRlZCB0byBsaWJwbmctMS42LjA6IHNjYWxlIGEgMTYtYml0IHZhbHVlIGluIHRoZSByYW5nZSAwLi42NTUzNSB0byAwLi4yNTUKKyAqIGJ5IGRpdmlkaW5nIGJ5IDI1NyAqd2l0aCByb3VuZGluZyouICBUaGlzIG1hY3JvIGlzIGV4YWN0IGZvciB0aGUgZ2l2ZW4gcmFuZ2UuCisgKiBTZWUgdGhlIGRpc2NvdXJzZSBpbiBwbmdydHJhbi5jIHBuZ19kb19zY2FsZV8xNl90b184LiAgVGhlIHZhbHVlcyBpbiB0aGUKKyAqIG1hY3JvIHdlcmUgZXN0YWJsaXNoZWQgYnkgZXhwZXJpbWVudCAobW9kaWZ5aW5nIHRoZSBhZGRlZCB2YWx1ZSkuICBUaGUgbWFjcm8KKyAqIGhhcyBhIHNlY29uZCB2YXJpYW50IHRoYXQgdGFrZXMgYSB2YWx1ZSBhbHJlYWR5IHNjYWxlZCBieSAyNTUgYW5kIGRpdmlkZXMgYnkKKyAqIDY1NTM1IC0gdGhpcyBoYXMgYSBtYXhpbXVtIGVycm9yIG9mIC41MDIuICBPdmVyIHRoZSByYW5nZSAwLi42NTUzNSo2NTUzNSBpdAorICogb25seSBnaXZlcyBvZmYtYnktb25lIGVycm9ycyBhbmQgb25seSBmb3IgMC41JSAoMSBpbiAyMDApIG9mIHRoZSB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgUE5HX0RJVjY1NTM1KHYyNCkgKCgodjI0KSArIDMyODk1KSA+PiAxNikKKyNkZWZpbmUgUE5HX0RJVjI1Nyh2MTYpIFBOR19ESVY2NTUzNSgocG5nX3VpbnRfMzIpKHYxNikgKiAyNTUpCisKKy8qIEFkZGVkIHRvIGxpYnBuZy0xLjIuNiBKQiAqLworI2RlZmluZSBQTkdfUk9XQllURVMocGl4ZWxfYml0cywgd2lkdGgpIFwKKyAgICAoKHBpeGVsX2JpdHMpID49IDggPyBcCisgICAgKChwbmdfc2l6ZV90KSh3aWR0aCkgKiAoKChwbmdfc2l6ZV90KShwaXhlbF9iaXRzKSkgPj4gMykpIDogXAorICAgICgoICgocG5nX3NpemVfdCkod2lkdGgpICogKChwbmdfc2l6ZV90KShwaXhlbF9iaXRzKSkpICsgNykgPj4gMykgKQorCisvKiBQTkdfT1VUX09GX1JBTkdFIHJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBvdXRzaWRlIHRoZSByYW5nZQorICogaWRlYWwtZGVsdGEuLmlkZWFsK2RlbHRhLiAgRWFjaCBhcmd1bWVudCBpcyBldmFsdWF0ZWQgdHdpY2UuCisgKiAiaWRlYWwiIGFuZCAiZGVsdGEiIHNob3VsZCBiZSBjb25zdGFudHMsIG5vcm1hbGx5IHNpbXBsZQorICogaW50ZWdlcnMsICJ2YWx1ZSIgYSB2YXJpYWJsZS4gQWRkZWQgdG8gbGlicG5nLTEuMi42IEpCCisgKi8KKyNkZWZpbmUgUE5HX09VVF9PRl9SQU5HRSh2YWx1ZSwgaWRlYWwsIGRlbHRhKSBcCisgICAoICh2YWx1ZSkgPCAoaWRlYWwpLShkZWx0YSkgfHwgKHZhbHVlKSA+IChpZGVhbCkrKGRlbHRhKSApCisKKy8qIENvbnZlcnNpb25zIGJldHdlZW4gZml4ZWQgYW5kIGZsb2F0aW5nIHBvaW50LCBvbmx5IGRlZmluZWQgaWYKKyAqIHJlcXVpcmVkICh0byBtYWtlIHN1cmUgdGhlIGNvZGUgZG9lc24ndCBhY2NpZGVudGFsbHkgdXNlIGZsb2F0CisgKiB3aGVuIGl0IGlzIHN1cHBvc2VkbHkgZGlzYWJsZWQuKQorICovCisjaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorLyogVGhlIGZsb2F0aW5nIHBvaW50IGNvbnZlcnNpb24gY2FuJ3Qgb3ZlcmZsb3csIHRob3VnaCBpdCBjYW4gYW5kCisgKiBkb2VzIGxvc2UgYWNjdXJhY3kgcmVsYXRpdmUgdG8gdGhlIG9yaWdpbmFsIGZpeGVkIHBvaW50IHZhbHVlLgorICogSW4gcHJhY3RpY2UgdGhpcyBkb2Vzbid0IG1hdHRlciBiZWNhdXNlIHBuZ19maXhlZF9wb2ludCBvbmx5CisgKiBzdG9yZXMgbnVtYmVycyB3aXRoIHZlcnkgbG93IHByZWNpc2lvbi4gIFRoZSBwbmdfcHRyIGFuZCBzCisgKiBhcmd1bWVudHMgYXJlIHVudXNlZCBieSBkZWZhdWx0IGJ1dCBhcmUgdGhlcmUgaW4gY2FzZSBlcnJvcgorICogY2hlY2tpbmcgYmVjb21lcyBhIHJlcXVpcmVtZW50LgorICovCisjZGVmaW5lIHBuZ19mbG9hdChwbmdfcHRyLCBmaXhlZCwgcykgKC4wMDAwMSAqIChmaXhlZCkpCisKKy8qIFRoZSBmaXhlZCBwb2ludCBjb252ZXJzaW9uIHBlcmZvcm1zIHJhbmdlIGNoZWNraW5nIGFuZCBldmFsdWF0ZXMKKyAqIGl0cyBhcmd1bWVudCBtdWx0aXBsZSB0aW1lcywgc28gbXVzdCBiZSB1c2VkIHdpdGggY2FyZS4gIFRoZQorICogcmFuZ2UgY2hlY2tpbmcgdXNlcyB0aGUgUE5HIHNwZWNpZmljYXRpb24gdmFsdWVzIGZvciBhIHNpZ25lZAorICogMzItYml0IGZpeGVkIHBvaW50IHZhbHVlIGV4Y2VwdCB0aGF0IHRoZSB2YWx1ZXMgYXJlIGRlbGliZXJhdGVseQorICogcm91bmRlZC10by16ZXJvIHRvIGFuIGludGVncmFsIHZhbHVlIC0gMjE0NzQgKDIxNDc0LjgzIGlzIHJvdWdobHkKKyAqICgyXjMxLTEpICogMTAwMDAwKS4gJ3MnIGlzIGEgc3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoZSB2YWx1ZSBiZWluZworICogY29udmVydGVkLgorICoKKyAqIE5PVEU6IHRoaXMgbWFjcm8gd2lsbCByYWlzZSBhIHBuZ19lcnJvciBpZiB0aGUgcmFuZ2UgY2hlY2sgZmFpbHMsCisgKiB0aGVyZWZvcmUgaXQgaXMgbm9ybWFsbHkgb25seSBhcHByb3ByaWF0ZSB0byB1c2UgdGhpcyBvbiB2YWx1ZXMKKyAqIHRoYXQgY29tZSBmcm9tIEFQSSBjYWxscyBvciBvdGhlciBzb3VyY2VzIHdoZXJlIGFuIG91dCBvZiByYW5nZQorICogZXJyb3IgaW5kaWNhdGVzIGEgcHJvZ3JhbW1pbmcgZXJyb3IsIG5vdCBhIGRhdGEgZXJyb3IhCisgKgorICogTk9URTogYnkgZGVmYXVsdCB0aGlzIGlzIG9mZiAtIHRoZSBtYWNybyBpcyBub3QgdXNlZCAtIGJlY2F1c2UgdGhlCisgKiBmdW5jdGlvbiBjYWxsIHNhdmVzIGEgbG90IG9mIGNvZGUuCisgKi8KKyNpZmRlZiBQTkdfRklYRURfUE9JTlRfTUFDUk9fU1VQUE9SVEVECisjZGVmaW5lIHBuZ19maXhlZChwbmdfcHRyLCBmcCwgcykgKChmcCkgPD0gMjE0NzQgJiYgKGZwKSA+PSAtMjE0NzQgP1wKKyAgICAoKHBuZ19maXhlZF9wb2ludCkoMTAwMDAwICogKGZwKSkpIDogKHBuZ19maXhlZF9lcnJvcihwbmdfcHRyLCBzKSwwKSkKKyNlbmRpZgorLyogZWxzZSB0aGUgY29ycmVzcG9uZGluZyBmdW5jdGlvbiBpcyBkZWZpbmVkIGJlbG93LCBpbnNpZGUgdGhlIHNjb3BlIG9mIHRoZQorICogY3BsdXNwbHVzIHRlc3QuCisgKi8KKyNlbmRpZgorCisvKiBDb25zdGFudHMgZm9yIGtub3duIGNodW5rIHR5cGVzLiAgSWYgeW91IG5lZWQgdG8gYWRkIGEgY2h1bmssIGRlZmluZSB0aGUgbmFtZQorICogaGVyZS4gIEZvciBoaXN0b3JpY2FsIHJlYXNvbnMgdGhlc2UgY29uc3RhbnRzIGhhdmUgdGhlIGZvcm0gcG5nXzxuYW1lPjsgaS5lLgorICogdGhlIHByZWZpeCBpcyBsb3dlciBjYXNlLiAgUGxlYXNlIHVzZSBkZWNpbWFsIHZhbHVlcyBhcyB0aGUgcGFyYW1ldGVycyB0bworICogbWF0Y2ggdGhlIElTTyBQTkcgc3BlY2lmaWNhdGlvbiBhbmQgdG8gYXZvaWQgcmVseWluZyBvbiB0aGUgQyBsb2NhbGUKKyAqIGludGVycHJldGF0aW9uIG9mIGNoYXJhY3RlciB2YWx1ZXMuCisgKgorICogUHJpb3IgdG8gMS41LjYgdGhlc2UgY29uc3RhbnRzIHdlcmUgc3RyaW5ncywgYXMgb2YgMS41LjYgcG5nX3VpbnRfMzIgdmFsdWVzCisgKiBhcmUgY29tcHV0ZWQgYW5kIGEgbmV3IG1hY3JvIChQTkdfU1RSSU5HX0ZST01fQ0hVTkspIGFkZGVkIHRvIGFsbG93IGEgc3RyaW5nCisgKiB0byBiZSBnZW5lcmF0ZWQgaWYgcmVxdWlyZWQuCisgKgorICogUE5HXzMyYiBjb3JyZWN0bHkgcHJvZHVjZXMgYSB2YWx1ZSBzaGlmdGVkIGJ5IHVwIHRvIDI0IGJpdHMsIGV2ZW4gb24KKyAqIGFyY2hpdGVjdHVyZXMgd2hlcmUgKGludCkgaXMgb25seSAxNiBiaXRzLgorICovCisjZGVmaW5lIFBOR18zMmIoYixzKSAoKHBuZ191aW50XzMyKShiKSA8PCAocykpCisjZGVmaW5lIFBOR19VMzIoYjEsYjIsYjMsYjQpIFwKKyAgIChQTkdfMzJiKGIxLDI0KSB8IFBOR18zMmIoYjIsMTYpIHwgUE5HXzMyYihiMyw4KSB8IFBOR18zMmIoYjQsMCkpCisKKy8qIENvbnN0YW50cyBmb3Iga25vd24gY2h1bmsgdHlwZXMuCisgKgorICogTUFJTlRBSU5FUlM6IElmIHlvdSBuZWVkIHRvIGFkZCBhIGNodW5rLCBkZWZpbmUgdGhlIG5hbWUgaGVyZS4KKyAqIEZvciBoaXN0b3JpY2FsIHJlYXNvbnMgdGhlc2UgY29uc3RhbnRzIGhhdmUgdGhlIGZvcm0gcG5nXzxuYW1lPjsgaS5lLgorICogdGhlIHByZWZpeCBpcyBsb3dlciBjYXNlLiAgUGxlYXNlIHVzZSBkZWNpbWFsIHZhbHVlcyBhcyB0aGUgcGFyYW1ldGVycyB0bworICogbWF0Y2ggdGhlIElTTyBQTkcgc3BlY2lmaWNhdGlvbiBhbmQgdG8gYXZvaWQgcmVseWluZyBvbiB0aGUgQyBsb2NhbGUKKyAqIGludGVycHJldGF0aW9uIG9mIGNoYXJhY3RlciB2YWx1ZXMuICBQbGVhc2Uga2VlcCB0aGUgbGlzdCBzb3J0ZWQuCisgKgorICogTm90aWNlIHRoYXQgUE5HX1UzMiBpcyB1c2VkIHRvIGRlZmluZSBhIDMyLWJpdCB2YWx1ZSBmb3IgdGhlIDQgYnl0ZSBjaHVuaworICogdHlwZS4gIEluIGZhY3QgdGhlIHNwZWNpZmljYXRpb24gZG9lcyBub3QgZXhwcmVzcyBjaHVuayB0eXBlcyB0aGlzIHdheSwKKyAqIGhvd2V2ZXIgdXNpbmcgYSAzMi1iaXQgdmFsdWUgbWVhbnMgdGhhdCB0aGUgY2h1bmsgdHlwZSBjYW4gYmUgcmVhZCBmcm9tIHRoZQorICogc3RyZWFtIHVzaW5nIGV4YWN0bHkgdGhlIHNhbWUgY29kZSBhcyB1c2VkIGZvciBhIDMyLWJpdCB1bnNpZ25lZCB2YWx1ZSBhbmQKKyAqIGNhbiBiZSBleGFtaW5lZCBmYXIgbW9yZSBlZmZpY2llbnRseSAodXNpbmcgb25lIGFyaXRobWV0aWMgY29tcGFyZSkuCisgKgorICogUHJpb3IgdG8gMS41LjYgdGhlIGNodW5rIHR5cGUgY29uc3RhbnRzIHdlcmUgZXhwcmVzc2VkIGFzIEMgc3RyaW5ncy4gIFRoZQorICogbGlicG5nIEFQSSBzdGlsbCB1c2VzIHN0cmluZ3MgZm9yICd1bmtub3duJyBjaHVua3MgYW5kIGEgbWFjcm8sCisgKiBQTkdfU1RSSU5HX0ZST01fQ0hVTkssIGFsbG93cyBhIHN0cmluZyB0byBiZSBnZW5lcmF0ZWQgaWYgcmVxdWlyZWQuICBOb3RpY2UKKyAqIHRoYXQgZm9yIHBvcnRhYmxlIGNvZGUgbnVtZXJpYyB2YWx1ZXMgbXVzdCBzdGlsbCBiZSB1c2VkOyB0aGUgc3RyaW5nICJJSERSIgorICogaXMgbm90IHBvcnRhYmxlIGFuZCBuZWl0aGVyIGlzIFBOR19VMzIoJ0knLCAnSCcsICdEJywgJ1InKS4KKyAqCisgKiBJbiAxLjcuMCB0aGUgZGVmaW5pdGlvbnMgd2lsbCBiZSBtYWRlIHB1YmxpYyBpbiBwbmcuaCB0byBhdm9pZCBoYXZpbmcgdG8KKyAqIGR1cGxpY2F0ZSB0aGUgc2FtZSBkZWZpbml0aW9ucyBpbiBhcHBsaWNhdGlvbiBjb2RlLgorICovCisjZGVmaW5lIHBuZ19JREFUIFBOR19VMzIoIDczLCAgNjgsICA2NSwgIDg0KQorI2RlZmluZSBwbmdfSUVORCBQTkdfVTMyKCA3MywgIDY5LCAgNzgsICA2OCkKKyNkZWZpbmUgcG5nX0lIRFIgUE5HX1UzMiggNzMsICA3MiwgIDY4LCAgODIpCisjZGVmaW5lIHBuZ19QTFRFIFBOR19VMzIoIDgwLCAgNzYsICA4NCwgIDY5KQorI2RlZmluZSBwbmdfYktHRCBQTkdfVTMyKCA5OCwgIDc1LCAgNzEsICA2OCkKKyNkZWZpbmUgcG5nX2NIUk0gUE5HX1UzMiggOTksICA3MiwgIDgyLCAgNzcpCisjZGVmaW5lIHBuZ19mUkFjIFBOR19VMzIoMTAyLCAgODIsICA2NSwgIDk5KSAvKiByZWdpc3RlcmVkLCBub3QgZGVmaW5lZCAqLworI2RlZmluZSBwbmdfZ0FNQSBQTkdfVTMyKDEwMywgIDY1LCAgNzcsICA2NSkKKyNkZWZpbmUgcG5nX2dJRmcgUE5HX1UzMigxMDMsICA3MywgIDcwLCAxMDMpCisjZGVmaW5lIHBuZ19nSUZ0IFBOR19VMzIoMTAzLCAgNzMsICA3MCwgMTE2KSAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIHBuZ19nSUZ4IFBOR19VMzIoMTAzLCAgNzMsICA3MCwgMTIwKQorI2RlZmluZSBwbmdfaElTVCBQTkdfVTMyKDEwNCwgIDczLCAgODMsICA4NCkKKyNkZWZpbmUgcG5nX2lDQ1AgUE5HX1UzMigxMDUsICA2NywgIDY3LCAgODApCisjZGVmaW5lIHBuZ19pVFh0IFBOR19VMzIoMTA1LCAgODQsICA4OCwgMTE2KQorI2RlZmluZSBwbmdfb0ZGcyBQTkdfVTMyKDExMSwgIDcwLCAgNzAsIDExNSkKKyNkZWZpbmUgcG5nX3BDQUwgUE5HX1UzMigxMTIsICA2NywgIDY1LCAgNzYpCisjZGVmaW5lIHBuZ19wSFlzIFBOR19VMzIoMTEyLCAgNzIsICA4OSwgMTE1KQorI2RlZmluZSBwbmdfc0JJVCBQTkdfVTMyKDExNSwgIDY2LCAgNzMsICA4NCkKKyNkZWZpbmUgcG5nX3NDQUwgUE5HX1UzMigxMTUsICA2NywgIDY1LCAgNzYpCisjZGVmaW5lIHBuZ19zUExUIFBOR19VMzIoMTE1LCAgODAsICA3NiwgIDg0KQorI2RlZmluZSBwbmdfc1JHQiBQTkdfVTMyKDExNSwgIDgyLCAgNzEsICA2NikKKyNkZWZpbmUgcG5nX3NURVIgUE5HX1UzMigxMTUsICA4NCwgIDY5LCAgODIpCisjZGVmaW5lIHBuZ190RVh0IFBOR19VMzIoMTE2LCAgNjksICA4OCwgMTE2KQorI2RlZmluZSBwbmdfdElNRSBQTkdfVTMyKDExNiwgIDczLCAgNzcsICA2OSkKKyNkZWZpbmUgcG5nX3RSTlMgUE5HX1UzMigxMTYsICA4MiwgIDc4LCAgODMpCisjZGVmaW5lIHBuZ196VFh0IFBOR19VMzIoMTIyLCAgODQsICA4OCwgMTE2KQorCisvKiBUaGUgZm9sbG93aW5nIHdpbGwgd29yayBvbiAoc2lnbmVkIGNoYXIqKSBzdHJpbmdzLCB3aGVyZWFzIHRoZSBnZXRfdWludF8zMgorICogbWFjcm8gd2lsbCBmYWlsIG9uIHRvcC1iaXQtc2V0IHZhbHVlcyBiZWNhdXNlIG9mIHRoZSBzaWduIGV4dGVuc2lvbi4KKyAqLworI2RlZmluZSBQTkdfQ0hVTktfRlJPTV9TVFJJTkcocylcCisgICBQTkdfVTMyKDB4ZmYgJiAocylbMF0sIDB4ZmYgJiAocylbMV0sIDB4ZmYgJiAocylbMl0sIDB4ZmYgJiAocylbM10pCisKKy8qIFRoaXMgdXNlcyAoY2hhciksIG5vdCAocG5nX2J5dGUpIHRvIGF2b2lkIHdhcm5pbmdzIG9uIHN5c3RlbXMgd2hlcmUgKGNoYXIpIGlzCisgKiBzaWduZWQgYW5kIHRoZSBhcmd1bWVudCBpcyBhIChjaGFyW10pICBUaGlzIG1hY3JvIHdpbGwgZmFpbCBtaXNlcmFibHkgb24KKyAqIHN5c3RlbXMgd2hlcmUgKGNoYXIpIGlzIG1vcmUgdGhhbiA4IGJpdHMuCisgKi8KKyNkZWZpbmUgUE5HX1NUUklOR19GUk9NX0NIVU5LKHMsYylcCisgICAodm9pZCkoKChjaGFyKikocykpWzBdPShjaGFyKSgoKGMpPj4yNCkgJiAweGZmKSwgXAorICAgKChjaGFyKikocykpWzFdPShjaGFyKSgoKGMpPj4xNikgJiAweGZmKSxcCisgICAoKGNoYXIqKShzKSlbMl09KGNoYXIpKCgoYyk+PjgpICYgMHhmZiksIFwKKyAgICgoY2hhciopKHMpKVszXT0oY2hhcikoKGMgJiAweGZmKSkpCisKKy8qIERvIHRoZSBzYW1lIGJ1dCB0ZXJtaW5hdGUgd2l0aCBhIG51bGwgY2hhcmFjdGVyLiAqLworI2RlZmluZSBQTkdfQ1NUUklOR19GUk9NX0NIVU5LKHMsYylcCisgICAodm9pZCkoUE5HX1NUUklOR19GUk9NX0NIVU5LKHMsYyksICgoY2hhciopKHMpKVs0XSA9IDApCisKKy8qIFRlc3Qgb24gZmxhZyB2YWx1ZXMgYXMgZGVmaW5lZCBpbiB0aGUgc3BlYyAoc2VjdGlvbiA1LjQpOiAqLworI2RlZmluZSBQTkdfQ0hVTktfQU5DSUxMQVJZKGMpICAgKDEgJiAoKGMpID4+IDI5KSkKKyNkZWZpbmUgUE5HX0NIVU5LX0NSSVRJQ0FMKGMpICAgICAoIVBOR19DSFVOS19BTkNJTExBUlkoYykpCisjZGVmaW5lIFBOR19DSFVOS19QUklWQVRFKGMpICAgICAgKDEgJiAoKGMpID4+IDIxKSkKKyNkZWZpbmUgUE5HX0NIVU5LX1JFU0VSVkVEKGMpICAgICAoMSAmICgoYykgPj4gMTMpKQorI2RlZmluZSBQTkdfQ0hVTktfU0FGRV9UT19DT1BZKGMpICgxICYgKChjKSA+PiAgNSkpCisKKy8qIEdhbW1hIHZhbHVlcyAobmV3IGF0IGxpYnBuZy0xLjUuNCk6ICovCisjZGVmaW5lIFBOR19HQU1NQV9NQUNfT0xEIDE1MTcyNCAgLyogQXNzdW1lICcxLjgnIGlzIHJlYWxseSAyLjIvMS40NSEgKi8KKyNkZWZpbmUgUE5HX0dBTU1BX01BQ19JTlZFUlNFIDY1OTA5CisjZGVmaW5lIFBOR19HQU1NQV9zUkdCX0lOVkVSU0UgNDU0NTUKKworLyogQWxtb3N0IGV2ZXJ5dGhpbmcgYmVsb3cgaXMgQyBzcGVjaWZpYzsgdGhlICNkZWZpbmVzIGFib3ZlIGNhbiBiZSB1c2VkIGluCisgKiBub24tQyBjb2RlIChzbyBsb25nIGFzIGl0IGlzIEMtcHJlcHJvY2Vzc2VkKSB0aGUgcmVzdCBvZiB0aGlzIHN0dWZmIGNhbm5vdC4KKyAqLworI2lmbmRlZiBQTkdfVkVSU0lPTl9JTkZPX09OTFkKKworI2luY2x1ZGUgInBuZ3N0cnVjdC5oIgorI2luY2x1ZGUgInBuZ2luZm8uaCIKKworLyogVmFsaWRhdGUgdGhlIGluY2x1ZGUgcGF0aHMgLSB0aGUgaW5jbHVkZSBwYXRoIHVzZWQgdG8gZ2VuZXJhdGUgcG5nbGliY29uZi5oCisgKiBtdXN0IG1hdGNoIHRoYXQgdXNlZCBpbiB0aGUgYnVpbGQsIG9yIHdlIG11c3QgYmUgdXNpbmcgcG5nbGliY29uZi5oLnByZWJ1aWx0OgorICovCisjaWYgUE5HX1pMSUJfVkVSTlVNICE9IDAgJiYgUE5HX1pMSUJfVkVSTlVNICE9IFpMSUJfVkVSTlVNCisjICBlcnJvciBaTElCX1ZFUk5VTSAhPSBQTkdfWkxJQl9WRVJOVU0gXAorICAgICAgIi1JIChpbmNsdWRlIHBhdGgpIGVycm9yOiBzZWUgdGhlIG5vdGVzIGluIHBuZ3ByaXYuaCIKKyAgIC8qIFRoaXMgbWVhbnMgdGhhdCB3aGVuIHBuZ2xpYmNvbmYuaCB3YXMgYnVpbHQgdGhlIGNvcHkgb2YgemxpYi5oIHRoYXQgaXQKKyAgICAqIHVzZWQgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBvbmUgYmVpbmcgdXNlZCBoZXJlLiAgQmVjYXVzZSB0aGUgYnVpbGQgb2YKKyAgICAqIGxpYnBuZyBtYWtlcyBkZWNpc2lvbnMgdG8gdXNlIGluZmxhdGVJbml0MiBhbmQgaW5mbGF0ZVJlc2V0MiBiYXNlZCBvbiB0aGUKKyAgICAqIHpsaWIgdmVyc2lvbiBudW1iZXIgYW5kIGJlY2F1c2UgdGhpcyBhZmZlY3RzIGhhbmRsaW5nIG9mIGNlcnRhaW4gYnJva2VuCisgICAgKiBQTkcgZmlsZXMgdGhlIC1JIGRpcmVjdGl2ZXMgbXVzdCBtYXRjaC4KKyAgICAqCisgICAgKiBUaGUgbW9zdCBsaWtlbHkgZXhwbGFuYXRpb24gaXMgdGhhdCB5b3UgcGFzc2VkIGEgLUkgaW4gQ0ZMQUdTLiBUaGlzIHdpbGwKKyAgICAqIG5vdCB3b3JrOyBhbGwgdGhlIHByZXByb2Nlc3NvciBkaXJlY3RvcmllcyBhbmQgaW4gcGFydGljdWxhciBhbGwgdGhlIC1JCisgICAgKiBkaXJlY3RpdmVzIG11c3QgYmUgaW4gQ1BQRkxBR1MuCisgICAgKi8KKyNlbmRpZgorCisvKiBUaGlzIGlzIHVzZWQgZm9yIDE2LWJpdCBnYW1tYSB0YWJsZXMgLS0gb25seSB0aGUgdG9wIGxldmVsIHBvaW50ZXJzIGFyZQorICogY29uc3Q7IHRoaXMgY291bGQgYmUgY2hhbmdlZDoKKyAqLwordHlwZWRlZiBjb25zdCBwbmdfdWludF8xNnAgKiBwbmdfY29uc3RfdWludF8xNnBwOworCisvKiBBZGRlZCB0byBsaWJwbmctMS41Ljc6IHNSR0IgY29udmVyc2lvbiB0YWJsZXMgKi8KKyNpZiBkZWZpbmVkKFBOR19TSU1QTElGSUVEX1JFQURfU1VQUE9SVEVEKSB8fFwKKyAgIGRlZmluZWQoUE5HX1NJTVBMSUZJRURfV1JJVEVfU1VQUE9SVEVEKQorI2lmZGVmIFBOR19TSU1QTElGSUVEX1JFQURfU1VQUE9SVEVECitQTkdfSU5URVJOQUxfREFUQShjb25zdCBwbmdfdWludF8xNiwgcG5nX3NSR0JfdGFibGUsIFsyNTZdKTsKKyAgIC8qIENvbnZlcnQgZnJvbSBhbiBzUkdCIGVuY29kZWQgdmFsdWUgMC4uMjU1IHRvIGEgMTYtYml0IGxpbmVhciB2YWx1ZSwKKyAgICAqIDAuLjY1NTM1LiAgVGhpcyB0YWJsZSBnaXZlcyB0aGUgY2xvc2VzdCAxNi1iaXQgYW5zd2VycyAobm8gZXJyb3JzKS4KKyAgICAqLworI2VuZGlmCisKK1BOR19JTlRFUk5BTF9EQVRBKGNvbnN0IHBuZ191aW50XzE2LCBwbmdfc1JHQl9iYXNlLCBbNTEyXSk7CitQTkdfSU5URVJOQUxfREFUQShjb25zdCBwbmdfYnl0ZSwgcG5nX3NSR0JfZGVsdGEsIFs1MTJdKTsKKworI2RlZmluZSBQTkdfc1JHQl9GUk9NX0xJTkVBUihsaW5lYXIpIFwKKyAgKChwbmdfYnl0ZSkoMHhmZiAmICgocG5nX3NSR0JfYmFzZVsobGluZWFyKT4+MTVdIFwKKyAgICsgKCgoKGxpbmVhcikgJiAweDdmZmYpKnBuZ19zUkdCX2RlbHRhWyhsaW5lYXIpPj4xNV0pPj4xMikpID4+IDgpKSkKKyAgIC8qIEdpdmVuIGEgdmFsdWUgJ2xpbmVhcicgaW4gdGhlIHJhbmdlIDAuLjI1NSo2NTUzNSBjYWxjdWxhdGUgdGhlIDgtYml0IHNSR0IKKyAgICAqIGVuY29kZWQgdmFsdWUgd2l0aCBtYXhpbXVtIGVycm9yIDAuNjQ2MzY1LiAgTm90ZSB0aGF0IHRoZSBpbnB1dCBpcyBub3QgYQorICAgICogMTYtYml0IHZhbHVlOyBpdCBoYXMgYmVlbiBtdWx0aXBsaWVkIGJ5IDI1NSEgKi8KKyNlbmRpZiAvKiBTSU1QTElGSUVEX1JFQUQvV1JJVEUgKi8KKworCisvKiBJbmhpYml0IEMrKyBuYW1lLW1hbmdsaW5nIGZvciBsaWJwbmcgZnVuY3Rpb25zIGJ1dCBub3QgZm9yIHN5c3RlbSBjYWxscy4gKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyogSW50ZXJuYWwgZnVuY3Rpb25zOyB0aGVzZSBhcmUgbm90IGV4cG9ydGVkIGZyb20gYSBETEwgaG93ZXZlciBiZWNhdXNlIHRoZXkKKyAqIGFyZSB1c2VkIHdpdGhpbiBzZXZlcmFsIG9mIHRoZSBDIHNvdXJjZSBmaWxlcyB0aGV5IGhhdmUgdG8gYmUgQyBleHRlcm4uCisgKgorICogQWxsIG9mIHRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIGRlY2xhcmVkIHdpdGggUE5HX0lOVEVSTkFMX0ZVTkNUSU9OLgorICovCisKKy8qIFpsaWIgc3VwcG9ydCAqLworI2RlZmluZSBQTkdfVU5FWFBFQ1RFRF9aTElCX1JFVFVSTiAoLTcpCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCwgcG5nX3pzdHJlYW1fZXJyb3IsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgcmV0KSwKKyAgIFBOR19FTVBUWSk7CisgICAvKiBVc2VkIGJ5IHRoZSB6bGliIGhhbmRsaW5nIGZ1bmN0aW9ucyB0byBlbnN1cmUgdGhhdCB6X3N0cmVhbTo6bXNnIGlzIGFsd2F5cworICAgICogc2V0IGJlZm9yZSB0aGV5IHJldHVybi4KKyAgICAqLworCisjaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2ZyZWVfYnVmZmVyX2xpc3QsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgcG5nX2NvbXByZXNzaW9uX2J1ZmZlcnAgKmxpc3QpLFBOR19FTVBUWSk7CisgICAvKiBGcmVlIHRoZSBidWZmZXIgbGlzdCB1c2VkIGJ5IHRoZSBjb21wcmVzc2VkIHdyaXRlIGNvZGUuICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCkgJiYgXAorICAgIWRlZmluZWQoUE5HX0ZJWEVEX1BPSU5UX01BQ1JPX1NVUFBPUlRFRCkgJiYgXAorICAgKGRlZmluZWQoUE5HX2dBTUFfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19jSFJNX1NVUFBPUlRFRCkgfHwgXAorICAgZGVmaW5lZChQTkdfc0NBTF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpIHx8IFwKKyAgIGRlZmluZWQoUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVEKSkgfHwgXAorICAgKGRlZmluZWQoUE5HX3NDQUxfU1VQUE9SVEVEKSAmJiBcCisgICBkZWZpbmVkKFBOR19GTE9BVElOR19BUklUSE1FVElDX1NVUFBPUlRFRCkpCitQTkdfSU5URVJOQUxfRlVOQ1RJT04ocG5nX2ZpeGVkX3BvaW50LHBuZ19maXhlZCwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICBkb3VibGUgZnAsIHBuZ19jb25zdF9jaGFycCB0ZXh0KSxQTkdfRU1QVFkpOworI2VuZGlmCisKKy8qIENoZWNrIHRoZSB1c2VyIHZlcnNpb24gc3RyaW5nIGZvciBjb21wYXRpYmlsaXR5LCByZXR1cm5zIGZhbHNlIGlmIHRoZSB2ZXJzaW9uCisgKiBudW1iZXJzIGFyZW4ndCBjb21wYXRpYmxlLgorICovCitQTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ191c2VyX3ZlcnNpb25fY2hlY2ssKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgcG5nX2NvbnN0X2NoYXJwIHVzZXJfcG5nX3ZlciksUE5HX0VNUFRZKTsKKworLyogSW50ZXJuYWwgYmFzZSBhbGxvY2F0b3IgLSBubyBtZXNzYWdlcywgTlVMTCBvbiBmYWlsdXJlIHRvIGFsbG9jYXRlLiAgVGhpcworICogZG9lcywgaG93ZXZlciwgY2FsbCB0aGUgYXBwbGljYXRpb24gcHJvdmlkZWQgYWxsb2NhdG9yIGFuZCB0aGF0IGNvdWxkIGNhbGwKKyAqIHBuZ19lcnJvciAoYWx0aG91Z2ggdGhhdCB3b3VsZCBiZSBhIGJ1ZyBpbiB0aGUgYXBwbGljYXRpb24gaW1wbGVtZW50YXRpb24uKQorICovCitQTkdfSU5URVJOQUxfRlVOQ1RJT04ocG5nX3ZvaWRwLHBuZ19tYWxsb2NfYmFzZSwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICBwbmdfYWxsb2Nfc2l6ZV90IHNpemUpLFBOR19BTExPQ0FURUQpOworCisjaWYgZGVmaW5lZChQTkdfVEVYVF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX3NQTFRfU1VQUE9SVEVEKSB8fFwKKyAgIGRlZmluZWQoUE5HX1NUT1JFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkKKy8qIEludGVybmFsIGFycmF5IGFsbG9jYXRvciwgb3V0cHV0cyBubyBlcnJvciBvciB3YXJuaW5nIG1lc3NhZ2VzIG9uIGZhaWx1cmUsCisgKiBqdXN0IHJldHVybnMgTlVMTC4KKyAqLworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHBuZ192b2lkcCxwbmdfbWFsbG9jX2FycmF5LChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgIGludCBuZWxlbWVudHMsIHNpemVfdCBlbGVtZW50X3NpemUpLFBOR19BTExPQ0FURUQpOworCisvKiBUaGUgc2FtZSBidXQgYW4gZXhpc3RpbmcgYXJyYXkgaXMgZXh0ZW5kZWQgYnkgYWRkX2VsZW1lbnRzLiAgVGhpcyBmdW5jdGlvbgorICogYWxzbyBtZW1zZXRzIHRoZSBuZXcgZWxlbWVudHMgdG8gMCBhbmQgY29waWVzIHRoZSBvbGQgZWxlbWVudHMuICBUaGUgb2xkCisgKiBhcnJheSBpcyBub3QgZnJlZWQgb3IgYWx0ZXJlZC4KKyAqLworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHBuZ192b2lkcCxwbmdfcmVhbGxvY19hcnJheSwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICBwbmdfY29uc3Rfdm9pZHAgYXJyYXksIGludCBvbGRfZWxlbWVudHMsIGludCBhZGRfZWxlbWVudHMsCisgICBzaXplX3QgZWxlbWVudF9zaXplKSxQTkdfQUxMT0NBVEVEKTsKKyNlbmRpZiAvKiB0ZXh0LCBzUExUIG9yIHVua25vd24gY2h1bmtzICovCisKKy8qIE1hZ2ljIHRvIGNyZWF0ZSBhIHN0cnVjdCB3aGVuIHRoZXJlIGlzIG5vIHN0cnVjdCB0byBjYWxsIHRoZSB1c2VyIHN1cHBsaWVkCisgKiBtZW1vcnkgYWxsb2NhdG9ycy4gIEJlY2F1c2UgZXJyb3IgaGFuZGxpbmcgaGFzIG5vdCBiZWVuIHNldCB1cCB0aGUgbWVtb3J5CisgKiBoYW5kbGVycyBjYW4ndCBzYWZlbHkgY2FsbCBwbmdfZXJyb3IsIGJ1dCB0aGlzIGlzIGFuIG9ic2N1cmUgYW5kIHVuZG9jdW1lbnRlZAorICogcmVzdHJpY3Rpb24gc28gbGlicG5nIGhhcyB0byBhc3N1bWUgdGhhdCB0aGUgJ2ZyZWUnIGhhbmRsZXIsIGF0IGxlYXN0LCBtaWdodAorICogY2FsbCBwbmdfZXJyb3IuCisgKi8KK1BOR19JTlRFUk5BTF9GVU5DVElPTihwbmdfc3RydWN0cCxwbmdfY3JlYXRlX3BuZ19zdHJ1Y3QsCisgICAocG5nX2NvbnN0X2NoYXJwIHVzZXJfcG5nX3ZlciwgcG5nX3ZvaWRwIGVycm9yX3B0ciwgcG5nX2Vycm9yX3B0ciBlcnJvcl9mbiwKKyAgICBwbmdfZXJyb3JfcHRyIHdhcm5fZm4sIHBuZ192b2lkcCBtZW1fcHRyLCBwbmdfbWFsbG9jX3B0ciBtYWxsb2NfZm4sCisgICAgcG5nX2ZyZWVfcHRyIGZyZWVfZm4pLFBOR19BTExPQ0FURUQpOworCisvKiBGcmVlIG1lbW9yeSBmcm9tIGludGVybmFsIGxpYnBuZyBzdHJ1Y3QgKi8KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kZXN0cm95X3BuZ19zdHJ1Y3QsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSwKKyAgIFBOR19FTVBUWSk7CisKKy8qIEZyZWUgYW4gYWxsb2NhdGVkIGptcF9idWYgKGFsd2F5cyBzdWNjZWVkcykgKi8KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19mcmVlX2ptcGJ1ZiwocG5nX3N0cnVjdHJwIHBuZ19wdHIpLFBOR19FTVBUWSk7CisKKy8qIEZ1bmN0aW9uIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgemxpYi4gIFBOR0FQSSBpcyBkaXNhbGxvd2VkLiAqLworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWRwZixwbmdfemFsbG9jLCh2b2lkcGYgcG5nX3B0ciwgdUludCBpdGVtcywgdUludCBzaXplKSwKKyAgIFBOR19BTExPQ0FURUQpOworCisvKiBGdW5jdGlvbiB0byBmcmVlIG1lbW9yeSBmb3IgemxpYi4gIFBOR0FQSSBpcyBkaXNhbGxvd2VkLiAqLworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3pmcmVlLCh2b2lkcGYgcG5nX3B0ciwgdm9pZHBmIHB0ciksUE5HX0VNUFRZKTsKKworLyogTmV4dCBmb3VyIGZ1bmN0aW9ucyBhcmUgdXNlZCBpbnRlcm5hbGx5IGFzIGNhbGxiYWNrcy4gIFBOR0NCQVBJIGlzIHJlcXVpcmVkCisgKiBidXQgbm90IFBOR19FWFBPUlQuICBQTkdBUEkgYWRkZWQgYXQgbGlicG5nIHZlcnNpb24gMS4yLjMsIGNoYW5nZWQgdG8KKyAqIFBOR0NCQVBJIGF0IDEuNS4wCisgKi8KKworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQgUE5HQ0JBUEkscG5nX2RlZmF1bHRfcmVhZF9kYXRhLChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCksUE5HX0VNUFRZKTsKKworI2lmZGVmIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRAorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQgUE5HQ0JBUEkscG5nX3B1c2hfZmlsbF9idWZmZXIsKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICAgcG5nX2J5dGVwIGJ1ZmZlciwgcG5nX3NpemVfdCBsZW5ndGgpLFBOR19FTVBUWSk7CisjZW5kaWYKKworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQgUE5HQ0JBUEkscG5nX2RlZmF1bHRfd3JpdGVfZGF0YSwocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgICBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpLFBOR19FTVBUWSk7CisKKyNpZmRlZiBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVECisjICBpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCBQTkdDQkFQSSxwbmdfZGVmYXVsdF9mbHVzaCwocG5nX3N0cnVjdHAgcG5nX3B0ciksCisgICBQTkdfRU1QVFkpOworIyAgZW5kaWYKKyNlbmRpZgorCisvKiBSZXNldCB0aGUgQ1JDIHZhcmlhYmxlICovCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcmVzZXRfY3JjLChwbmdfc3RydWN0cnAgcG5nX3B0ciksUE5HX0VNUFRZKTsKKworLyogV3JpdGUgdGhlICJkYXRhIiBidWZmZXIgdG8gd2hhdGV2ZXIgb3V0cHV0IHlvdSBhcmUgdXNpbmcgKi8KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV9kYXRhLChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpLFBOR19FTVBUWSk7CisKKy8qIFJlYWQgYW5kIGNoZWNrIHRoZSBQTkcgZmlsZSBzaWduYXR1cmUgKi8KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19yZWFkX3NpZywocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICBwbmdfaW5mb3JwIGluZm9fcHRyKSxQTkdfRU1QVFkpOworCisvKiBSZWFkIHRoZSBjaHVuayBoZWFkZXIgKGxlbmd0aCArIHR5cGUgbmFtZSkgKi8KK1BOR19JTlRFUk5BTF9GVU5DVElPTihwbmdfdWludF8zMixwbmdfcmVhZF9jaHVua19oZWFkZXIsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSwKKyAgIFBOR19FTVBUWSk7CisKKy8qIFJlYWQgZGF0YSBmcm9tIHdoYXRldmVyIGlucHV0IHlvdSBhcmUgdXNpbmcgaW50byB0aGUgImRhdGEiIGJ1ZmZlciAqLworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3JlYWRfZGF0YSwocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19ieXRlcCBkYXRhLAorICAgIHBuZ19zaXplX3QgbGVuZ3RoKSxQTkdfRU1QVFkpOworCisvKiBSZWFkIGJ5dGVzIGludG8gYnVmLCBhbmQgdXBkYXRlIHBuZ19wdHItPmNyYyAqLworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2NyY19yZWFkLChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2J5dGVwIGJ1ZiwKKyAgICBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7CisKKy8qIFJlYWQgInNraXAiIGJ5dGVzLCByZWFkIHRoZSBmaWxlIGNyYywgYW5kIChvcHRpb25hbGx5KSB2ZXJpZnkgcG5nX3B0ci0+Y3JjICovCitQTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ19jcmNfZmluaXNoLChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgIHBuZ191aW50XzMyIHNraXApLFBOR19FTVBUWSk7CisKKy8qIFJlYWQgdGhlIENSQyBmcm9tIHRoZSBmaWxlIGFuZCBjb21wYXJlIGl0IHRvIHRoZSBsaWJwbmcgY2FsY3VsYXRlZCBDUkMgKi8KK1BOR19JTlRFUk5BTF9GVU5DVElPTihpbnQscG5nX2NyY19lcnJvciwocG5nX3N0cnVjdHJwIHBuZ19wdHIpLFBOR19FTVBUWSk7CisKKy8qIENhbGN1bGF0ZSB0aGUgQ1JDIG92ZXIgYSBzZWN0aW9uIG9mIGRhdGEuICBOb3RlIHRoYXQgd2UgYXJlIG9ubHkKKyAqIHBhc3NpbmcgYSBtYXhpbXVtIG9mIDY0SyBvbiBzeXN0ZW1zIHRoYXQgaGF2ZSB0aGlzIGFzIGEgbWVtb3J5IGxpbWl0LAorICogc2luY2UgdGhpcyBpcyB0aGUgbWF4aW11bSBidWZmZXIgc2l6ZSB3ZSBjYW4gc3BlY2lmeS4KKyAqLworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2NhbGN1bGF0ZV9jcmMsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgcG5nX2NvbnN0X2J5dGVwIHB0ciwgcG5nX3NpemVfdCBsZW5ndGgpLFBOR19FTVBUWSk7CisKKyNpZmRlZiBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVECitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZmx1c2gsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSxQTkdfRU1QVFkpOworI2VuZGlmCisKKy8qIFdyaXRlIHZhcmlvdXMgY2h1bmtzICovCisKKy8qIFdyaXRlIHRoZSBJSERSIGNodW5rLCBhbmQgdXBkYXRlIHRoZSBwbmdfc3RydWN0IHdpdGggdGhlIG5lY2Vzc2FyeQorICogaW5mb3JtYXRpb24uCisgKi8KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV9JSERSLChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgIHBuZ191aW50XzMyIHdpZHRoLCBwbmdfdWludF8zMiBoZWlnaHQsIGludCBiaXRfZGVwdGgsIGludCBjb2xvcl90eXBlLAorICAgaW50IGNvbXByZXNzaW9uX21ldGhvZCwgaW50IGZpbHRlcl9tZXRob2QsIGludCBpbnRlcmxhY2VfbWV0aG9kKSxQTkdfRU1QVFkpOworCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfUExURSwocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICBwbmdfY29uc3RfY29sb3JwIHBhbGV0dGUsIHBuZ191aW50XzMyIG51bV9wYWwpLFBOR19FTVBUWSk7CisKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19jb21wcmVzc19JREFULChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgIHBuZ19jb25zdF9ieXRlcCByb3dfZGF0YSwgcG5nX2FsbG9jX3NpemVfdCByb3dfZGF0YV9sZW5ndGgsIGludCBmbHVzaCksCisgICBQTkdfRU1QVFkpOworCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfSUVORCwocG5nX3N0cnVjdHJwIHBuZ19wdHIpLFBOR19FTVBUWSk7CisKKyNpZmRlZiBQTkdfV1JJVEVfZ0FNQV9TVVBQT1JURUQKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV9nQU1BX2ZpeGVkLChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfZml4ZWRfcG9pbnQgZmlsZV9nYW1tYSksUE5HX0VNUFRZKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX3NCSVRfU1VQUE9SVEVECitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfc0JJVCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbnN0X2NvbG9yXzhwIHNiaXQsIGludCBjb2xvcl90eXBlKSxQTkdfRU1QVFkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfY0hSTV9TVVBQT1JURUQKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV9jSFJNX2ZpeGVkLChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBjb25zdCBwbmdfeHkgKnh5KSwgUE5HX0VNUFRZKTsKKyAgICAvKiBUaGUgeHkgdmFsdWUgbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSB2YWxpZGF0ZWQgKi8KKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX3NSR0JfU1VQUE9SVEVECitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfc1JHQiwocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgaW50IGludGVudCksUE5HX0VNUFRZKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX2lDQ1BfU1VQUE9SVEVECitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfaUNDUCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICBwbmdfY29uc3RfY2hhcnAgbmFtZSwgcG5nX2NvbnN0X2J5dGVwIHByb2ZpbGUpLCBQTkdfRU1QVFkpOworICAgLyogVGhlIHByb2ZpbGUgbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSB2YWxpZGF0ZWQgZm9yIGNvcnJlY3RuZXNzLCB0aGUKKyAgICAqIGxlbmd0aCBjb21lcyBmcm9tIHRoZSBmaXJzdCBmb3VyIGJ5dGVzLiAgT25seSB0aGUgYmFzZSwgZGVmbGF0ZSwKKyAgICAqIGNvbXByZXNzaW9uIGlzIHN1cHBvcnRlZC4KKyAgICAqLworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfc1BMVF9TVVBQT1JURUQKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV9zUExULChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3Rfc1BMVF90cCBwYWxldHRlKSxQTkdfRU1QVFkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfdFJOU19TVVBQT1JURUQKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV90Uk5TLChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfYnl0ZXAgdHJhbnMsIHBuZ19jb25zdF9jb2xvcl8xNnAgdmFsdWVzLCBpbnQgbnVtYmVyLAorICAgIGludCBjb2xvcl90eXBlKSxQTkdfRU1QVFkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfYktHRF9TVVBQT1JURUQKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV9iS0dELChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfY29sb3JfMTZwIHZhbHVlcywgaW50IGNvbG9yX3R5cGUpLFBOR19FTVBUWSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9oSVNUX1NVUFBPUlRFRAorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX2hJU1QsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19jb25zdF91aW50XzE2cCBoaXN0LCBpbnQgbnVtX2hpc3QpLFBOR19FTVBUWSk7CisjZW5kaWYKKworLyogQ2h1bmtzIHRoYXQgaGF2ZSBrZXl3b3JkcyAqLworI2lmZGVmIFBOR19XUklURV90RVh0X1NVUFBPUlRFRAorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX3RFWHQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgcG5nX2NvbnN0X2NoYXJwIGtleSwgcG5nX2NvbnN0X2NoYXJwIHRleHQsIHBuZ19zaXplX3QgdGV4dF9sZW4pLFBOR19FTVBUWSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV96VFh0X1NVUFBPUlRFRAorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX3pUWHQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAKKyAgICBrZXksIHBuZ19jb25zdF9jaGFycCB0ZXh0LCBpbnQgY29tcHJlc3Npb24pLFBOR19FTVBUWSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9pVFh0X1NVUFBPUlRFRAorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX2lUWHQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIGludCBjb21wcmVzc2lvbiwgcG5nX2NvbnN0X2NoYXJwIGtleSwgcG5nX2NvbnN0X2NoYXJwIGxhbmcsCisgICAgcG5nX2NvbnN0X2NoYXJwIGxhbmdfa2V5LCBwbmdfY29uc3RfY2hhcnAgdGV4dCksUE5HX0VNUFRZKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1RFWFRfU1VQUE9SVEVEICAvKiBBZGRlZCBhdCB2ZXJzaW9uIDEuMC4xNCBhbmQgMS4yLjQgKi8KK1BOR19JTlRFUk5BTF9GVU5DVElPTihpbnQscG5nX3NldF90ZXh0XzIsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ19jb25zdF90ZXh0cCB0ZXh0X3B0ciwgaW50IG51bV90ZXh0KSxQTkdfRU1QVFkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfb0ZGc19TVVBQT1JURUQKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV9vRkZzLChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW50XzMyIHhfb2Zmc2V0LCBwbmdfaW50XzMyIHlfb2Zmc2V0LCBpbnQgdW5pdF90eXBlKSxQTkdfRU1QVFkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfcENBTF9TVVBQT1JURUQKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV9wQ0FMLChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY2hhcnAgcHVycG9zZSwgcG5nX2ludF8zMiBYMCwgcG5nX2ludF8zMiBYMSwgaW50IHR5cGUsIGludCBucGFyYW1zLAorICAgIHBuZ19jb25zdF9jaGFycCB1bml0cywgcG5nX2NoYXJwcCBwYXJhbXMpLFBOR19FTVBUWSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9wSFlzX1NVUFBPUlRFRAorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX3BIWXMsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ191aW50XzMyIHhfcGl4ZWxzX3Blcl91bml0LCBwbmdfdWludF8zMiB5X3BpeGVsc19wZXJfdW5pdCwKKyAgICBpbnQgdW5pdF90eXBlKSxQTkdfRU1QVFkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfdElNRV9TVVBQT1JURUQKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV90SU1FLChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfdGltZXAgbW9kX3RpbWUpLFBOR19FTVBUWSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9zQ0FMX1NVUFBPUlRFRAorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX3NDQUxfcywocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgaW50IHVuaXQsIHBuZ19jb25zdF9jaGFycCB3aWR0aCwgcG5nX2NvbnN0X2NoYXJwIGhlaWdodCksUE5HX0VNUFRZKTsKKyNlbmRpZgorCisvKiBDYWxsZWQgd2hlbiBmaW5pc2hlZCBwcm9jZXNzaW5nIGEgcm93IG9mIGRhdGEgKi8KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV9maW5pc2hfcm93LChwbmdfc3RydWN0cnAgcG5nX3B0ciksCisgICAgUE5HX0VNUFRZKTsKKworLyogSW50ZXJuYWwgdXNlIG9ubHkuICAgQ2FsbGVkIGJlZm9yZSBmaXJzdCByb3cgb2YgZGF0YSAqLworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX3N0YXJ0X3JvdywocG5nX3N0cnVjdHJwIHBuZ19wdHIpLAorICAgIFBOR19FTVBUWSk7CisKKy8qIENvbWJpbmUgYSByb3cgb2YgZGF0YSwgZGVhbGluZyB3aXRoIGFscGhhLCBldGMuIGlmIHJlcXVlc3RlZC4gICdyb3cnIGlzIGFuCisgKiBhcnJheSBvZiBwbmdfcHRyLT53aWR0aCBwaXhlbHMuICBJZiB0aGUgaW1hZ2UgaXMgbm90IGludGVybGFjZWQgb3IgdGhpcworICogaXMgdGhlIGZpbmFsIHBhc3MgdGhpcyBqdXN0IGRvZXMgYSBtZW1jcHksIG90aGVyd2lzZSB0aGUgImRpc3BsYXkiIGZsYWcKKyAqIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gY29weSBwaXhlbHMgdGhhdCBhcmUgbm90IGluIHRoZSBjdXJyZW50IHBhc3MuCisgKgorICogQmVjYXVzZSAncG5nX2RvX3JlYWRfaW50ZXJsYWNlJyAoYmVsb3cpIHJlcGxpY2F0ZXMgcGl4ZWxzIHRoaXMgYWxsb3dzIHRoaXMKKyAqIGZ1bmN0aW9uIHRvIGFjaGlldmUgdGhlIGRvY3VtZW50ZWQgJ2Jsb2NreScgYXBwZWFyYW5jZSBkdXJpbmcgaW50ZXJsYWNlZCByZWFkCisgKiBpZiBkaXNwbGF5IGlzIDEgYW5kIHRoZSAnc3BhcmtsZScgYXBwZWFyYW5jZSwgd2hlcmUgZXhpc3RpbmcgcGl4ZWxzIGluICdyb3cnCisgKiBhcmUgbm90IGNoYW5nZWQgaWYgdGhleSBhcmUgbm90IGluIHRoZSBjdXJyZW50IHBhc3MsIHdoZW4gZGlzcGxheSBpcyAwLgorICoKKyAqICdkaXNwbGF5JyBtdXN0IGJlIDAgb3IgMSwgb3RoZXJ3aXNlIHRoZSBtZW1jcHkgd2lsbCBiZSBkb25lIHJlZ2FyZGxlc3MuCisgKgorICogVGhlIEFQSSBhbHdheXMgcmVhZHMgZnJvbSB0aGUgcG5nX3N0cnVjdCByb3cgYnVmZmVyIGFuZCBhbHdheXMgYXNzdW1lcyB0aGF0CisgKiBpdCBpcyBmdWxsIHdpZHRoIChwbmdfZG9fcmVhZF9pbnRlcmxhY2UgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQuKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgb25seSBldmVyIHVzZWQgdG8gd3JpdGUgdG8gcm93IGJ1ZmZlcnMgcHJvdmlkZWQgYnkgdGhlCisgKiBjYWxsZXIgb2YgdGhlIHJlbGV2YW50IGxpYnBuZyBBUEkgYW5kIHRoZSByb3cgbXVzdCBoYXZlIGFscmVhZHkgYmVlbgorICogdHJhbnNmb3JtZWQgYnkgdGhlIHJlYWQgdHJhbnNmb3JtYXRpb25zLgorICoKKyAqIFRoZSBQTkdfVVNFX0NPTVBJTEVfVElNRV9NQVNLUyBvcHRpb24gY2F1c2VzIGdlbmVyYXRpb24gb2YgcHJlLWNvbXB1dGVkCisgKiBiaXRtYXNrcyBmb3IgdXNlIHdpdGhpbiB0aGUgY29kZSwgb3RoZXJ3aXNlIHJ1bnRpbWUgZ2VuZXJhdGVkIG1hc2tzIGFyZSB1c2VkLgorICogVGhlIGRlZmF1bHQgaXMgY29tcGlsZSB0aW1lIG1hc2tzLgorICovCisjaWZuZGVmIFBOR19VU0VfQ09NUElMRV9USU1FX01BU0tTCisjICBkZWZpbmUgUE5HX1VTRV9DT01QSUxFX1RJTUVfTUFTS1MgMQorI2VuZGlmCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfY29tYmluZV9yb3csKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19ieXRlcCByb3csIGludCBkaXNwbGF5KSxQTkdfRU1QVFkpOworCisjaWZkZWYgUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVECisvKiBFeHBhbmQgYW4gaW50ZXJsYWNlZCByb3c6IHRoZSAncm93X2luZm8nIGRlc2NyaWJlcyB0aGUgcGFzcyBkYXRhIHRoYXQgaGFzCisgKiBiZWVuIHJlYWQgaW4gYW5kIG11c3QgY29ycmVzcG9uZCB0byB0aGUgcGl4ZWxzIGluICdyb3cnLCB0aGUgcGl4ZWxzIGFyZQorICogZXhwYW5kZWQgKG1vdmVkIGFwYXJ0KSBpbiAncm93JyB0byBtYXRjaCB0aGUgZmluYWwgbGF5b3V0LCB3aGVuIGRvaW5nIHRoaXMKKyAqIHRoZSBwaXhlbHMgYXJlICpyZXBsaWNhdGVkKiB0byB0aGUgaW50ZXJ2ZW5pbmcgc3BhY2UuICBUaGlzIGlzIGVzc2VudGlhbCBmb3IKKyAqIHRoZSBjb3JyZWN0IG9wZXJhdGlvbiBvZiBwbmdfY29tYmluZV9yb3csIGFib3ZlLgorICovCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fcmVhZF9pbnRlcmxhY2UsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sCisgICAgcG5nX2J5dGVwIHJvdywgaW50IHBhc3MsIHBuZ191aW50XzMyIHRyYW5zZm9ybWF0aW9ucyksUE5HX0VNUFRZKTsKKyNlbmRpZgorCisvKiBHUlIgVE8gRE8gKDIuMCBvciB3aGVuZXZlcik6ICBzaW1wbGlmeSBvdGhlciBpbnRlcm5hbCBjYWxsaW5nIGludGVyZmFjZXMgKi8KKworI2lmZGVmIFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQKKy8qIEdyYWIgcGl4ZWxzIG91dCBvZiBhIHJvdyBmb3IgYW4gaW50ZXJsYWNlZCBwYXNzICovCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fd3JpdGVfaW50ZXJsYWNlLChwbmdfcm93X2luZm9wIHJvd19pbmZvLAorICAgIHBuZ19ieXRlcCByb3csIGludCBwYXNzKSxQTkdfRU1QVFkpOworI2VuZGlmCisKKy8qIFVuZmlsdGVyIGEgcm93OiBjaGVjayB0aGUgZmlsdGVyIHZhbHVlIGJlZm9yZSBjYWxsaW5nIHRoaXMsIHRoZXJlIGlzIG5vIHBvaW50CisgKiBjYWxsaW5nIGl0IGZvciBQTkdfRklMVEVSX1ZBTFVFX05PTkUuCisgKi8KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19yZWFkX2ZpbHRlcl9yb3csKHBuZ19zdHJ1Y3RycCBwcCwgcG5nX3Jvd19pbmZvcAorICAgIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LCBwbmdfY29uc3RfYnl0ZXAgcHJldl9yb3csIGludCBmaWx0ZXIpLFBOR19FTVBUWSk7CisKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19yZWFkX2ZpbHRlcl9yb3dfdXBfbmVvbiwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywKKyAgICBwbmdfYnl0ZXAgcm93LCBwbmdfY29uc3RfYnl0ZXAgcHJldl9yb3cpLFBOR19FTVBUWSk7CitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcmVhZF9maWx0ZXJfcm93X3N1YjNfbmVvbiwocG5nX3Jvd19pbmZvcAorICAgIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LCBwbmdfY29uc3RfYnl0ZXAgcHJldl9yb3cpLFBOR19FTVBUWSk7CitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcmVhZF9maWx0ZXJfcm93X3N1YjRfbmVvbiwocG5nX3Jvd19pbmZvcAorICAgIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LCBwbmdfY29uc3RfYnl0ZXAgcHJldl9yb3cpLFBOR19FTVBUWSk7CitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcmVhZF9maWx0ZXJfcm93X2F2ZzNfbmVvbiwocG5nX3Jvd19pbmZvcAorICAgIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LCBwbmdfY29uc3RfYnl0ZXAgcHJldl9yb3cpLFBOR19FTVBUWSk7CitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcmVhZF9maWx0ZXJfcm93X2F2ZzRfbmVvbiwocG5nX3Jvd19pbmZvcAorICAgIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LCBwbmdfY29uc3RfYnl0ZXAgcHJldl9yb3cpLFBOR19FTVBUWSk7CitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcmVhZF9maWx0ZXJfcm93X3BhZXRoM19uZW9uLChwbmdfcm93X2luZm9wCisgICAgcm93X2luZm8sIHBuZ19ieXRlcCByb3csIHBuZ19jb25zdF9ieXRlcCBwcmV2X3JvdyksUE5HX0VNUFRZKTsKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19yZWFkX2ZpbHRlcl9yb3dfcGFldGg0X25lb24sKHBuZ19yb3dfaW5mb3AKKyAgICByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywgcG5nX2NvbnN0X2J5dGVwIHByZXZfcm93KSxQTkdfRU1QVFkpOworCisvKiBDaG9vc2UgdGhlIGJlc3QgZmlsdGVyIHRvIHVzZSBhbmQgZmlsdGVyIHRoZSByb3cgZGF0YSAqLworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX2ZpbmRfZmlsdGVyLChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfcm93X2luZm9wIHJvd19pbmZvKSxQTkdfRU1QVFkpOworCisjaWZkZWYgUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19yZWFkX0lEQVRfZGF0YSwocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICBwbmdfYnl0ZXAgb3V0cHV0LCBwbmdfYWxsb2Nfc2l6ZV90IGF2YWlsX291dCksUE5HX0VNUFRZKTsKKyAgIC8qIFJlYWQgJ2F2YWlsX291dCcgYnl0ZXMgb2YgZGF0YSBmcm9tIHRoZSBJREFUIHN0cmVhbS4gIElmIHRoZSBvdXRwdXQgYnVmZmVyCisgICAgKiBpcyBOVUxMIHRoZSBmdW5jdGlvbiBjaGVja3MsIGluc3RlYWQsIGZvciB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uICBJbiB0aGlzCisgICAgKiBjYXNlIGEgYmVuaWduIGVycm9yIHdpbGwgYmUgaXNzdWVkIGlmIHRoZSBzdHJlYW0gZW5kIGlzIG5vdCBmb3VuZCBvciBpZgorICAgICogZXh0cmEgZGF0YSBoYXMgdG8gYmUgY29uc3VtZWQuCisgICAgKi8KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19yZWFkX2ZpbmlzaF9JREFULChwbmdfc3RydWN0cnAgcG5nX3B0ciksCisgICBQTkdfRU1QVFkpOworICAgLyogVGhpcyBjbGVhbnMgdXAgd2hlbiB0aGUgSURBVCBMWiBzdHJlYW0gZG9lcyBub3QgZW5kIHdoZW4gdGhlIGxhc3QgaW1hZ2UKKyAgICAqIGJ5dGUgaXMgcmVhZDsgdGhlcmUgaXMgc3RpbGwgc29tZSBwZW5kaW5nIGlucHV0LgorICAgICovCisKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19yZWFkX2ZpbmlzaF9yb3csKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSwKKyAgIFBOR19FTVBUWSk7CisgICAvKiBGaW5pc2ggYSByb3cgd2hpbGUgcmVhZGluZywgZGVhbGluZyB3aXRoIGludGVybGFjaW5nIHBhc3NlcywgZXRjLiAqLworI2VuZGlmIC8qIFNFUVVFTlRJQUxfUkVBRCAqLworCisvKiBJbml0aWFsaXplIHRoZSByb3cgYnVmZmVycywgZXRjLiAqLworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3JlYWRfc3RhcnRfcm93LChwbmdfc3RydWN0cnAgcG5nX3B0ciksUE5HX0VNUFRZKTsKKworI2lmIFBOR19aTElCX1ZFUk5VTSA+PSAweDEyNDAKK1BOR19JTlRFUk5BTF9GVU5DVElPTihpbnQscG5nX3psaWJfaW5mbGF0ZSwocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBmbHVzaCksCisgICAgICBQTkdfRU1QVFkpOworIyAgZGVmaW5lIFBOR19JTkZMQVRFKHBwLCBmbHVzaCkgcG5nX3psaWJfaW5mbGF0ZShwcCwgZmx1c2gpCisjZWxzZSAvKiBabGliIDwgMS4yLjQgKi8KKyMgIGRlZmluZSBQTkdfSU5GTEFURShwcCwgZmx1c2gpIGluZmxhdGUoJihwcCktPnpzdHJlYW0sIGZsdXNoKQorI2VuZGlmIC8qIFpsaWIgPCAxLjIuNCAqLworCisjaWZkZWYgUE5HX1JFQURfVFJBTlNGT1JNU19TVVBQT1JURUQKKy8qIE9wdGlvbmFsIGNhbGwgdG8gdXBkYXRlIHRoZSB1c2VycyBpbmZvIHN0cnVjdHVyZSAqLworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3JlYWRfdHJhbnNmb3JtX2luZm8sKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIpLFBOR19FTVBUWSk7CisjZW5kaWYKKworLyogU2hhcmVkIHRyYW5zZm9ybSBmdW5jdGlvbnMsIGRlZmluZWQgaW4gcG5ndHJhbi5jICovCisjaWYgZGVmaW5lZChQTkdfV1JJVEVfRklMTEVSX1NVUFBPUlRFRCkgfHwgXAorICAgIGRlZmluZWQoUE5HX1JFQURfU1RSSVBfQUxQSEFfU1VQUE9SVEVEKQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX3N0cmlwX2NoYW5uZWwsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sCisgICAgcG5nX2J5dGVwIHJvdywgaW50IGF0X3N0YXJ0KSxQTkdfRU1QVFkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfMTZCSVRfU1VQUE9SVEVECisjaWYgZGVmaW5lZChQTkdfUkVBRF9TV0FQX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1dBUF9TVVBQT1JURUQpCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fc3dhcCwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywKKyAgICBwbmdfYnl0ZXAgcm93KSxQTkdfRU1QVFkpOworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX1JFQURfUEFDS1NXQVBfU1VQUE9SVEVEKSB8fCBcCisgICAgZGVmaW5lZChQTkdfV1JJVEVfUEFDS1NXQVBfU1VQUE9SVEVEKQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX3BhY2tzd2FwLChwbmdfcm93X2luZm9wIHJvd19pbmZvLAorICAgIHBuZ19ieXRlcCByb3cpLFBOR19FTVBUWSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX1JFQURfSU5WRVJUX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfSU5WRVJUX1NVUFBPUlRFRCkKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb19pbnZlcnQsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sCisgICAgcG5nX2J5dGVwIHJvdyksUE5HX0VNUFRZKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9CR1JfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9CR1JfU1VQUE9SVEVEKQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX2JnciwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywKKyAgICBwbmdfYnl0ZXAgcm93KSxQTkdfRU1QVFkpOworI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgZGVjb2RlcyB0aGUgYXBwcm9wcmlhdGUgY2h1bmtzLCBhbmQgZG9lcyBlcnJvciBjb3JyZWN0aW9uLAorICogdGhlbiBjYWxscyB0aGUgYXBwcm9wcmlhdGUgY2FsbGJhY2sgZm9yIHRoZSBjaHVuayBpZiBpdCBpcyB2YWxpZC4KKyAqLworCisvKiBEZWNvZGUgdGhlIElIRFIgY2h1bmsgKi8KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfSUhEUiwocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2hhbmRsZV9QTFRFLChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7CitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX0lFTkQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsKKworI2lmZGVmIFBOR19SRUFEX2JLR0RfU1VQUE9SVEVECitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX2JLR0QsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfY0hSTV9TVVBQT1JURUQKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfY0hSTSwocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9nQU1BX1NVUFBPUlRFRAorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2hhbmRsZV9nQU1BLChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX2hJU1RfU1VQUE9SVEVECitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX2hJU1QsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfaUNDUF9TVVBQT1JURUQKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfaUNDUCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOworI2VuZGlmIC8qIFJFQURfaUNDUCAqLworCisjaWZkZWYgUE5HX1JFQURfaVRYdF9TVVBQT1JURUQKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfaVRYdCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9vRkZzX1NVUFBPUlRFRAorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2hhbmRsZV9vRkZzLChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX3BDQUxfU1VQUE9SVEVECitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX3BDQUwsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfcEhZc19TVVBQT1JURUQKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfcEhZcywocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9zQklUX1NVUFBPUlRFRAorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2hhbmRsZV9zQklULChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX3NDQUxfU1VQUE9SVEVECitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX3NDQUwsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfc1BMVF9TVVBQT1JURUQKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfc1BMVCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOworI2VuZGlmIC8qIFJFQURfc1BMVCAqLworCisjaWZkZWYgUE5HX1JFQURfc1JHQl9TVVBQT1JURUQKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfc1JHQiwocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF90RVh0X1NVUFBPUlRFRAorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2hhbmRsZV90RVh0LChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX3RJTUVfU1VQUE9SVEVECitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX3RJTUUsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfdFJOU19TVVBQT1JURUQKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfdFJOUywocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF96VFh0X1NVUFBPUlRFRAorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2hhbmRsZV96VFh0LChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7CisjZW5kaWYKKworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2NoZWNrX2NodW5rX25hbWUsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ191aW50XzMyIGNodW5rX25hbWUpLFBOR19FTVBUWSk7CisKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfdW5rbm93biwocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoLCBpbnQga2VlcCksUE5HX0VNUFRZKTsKKyAgIC8qIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIHVua25vd24gY2h1bmtzLiAgVGhlICdrZWVwJworICAgICogYXJndW1lbnQgaXMgZWl0aGVyIG5vbi16ZXJvIGZvciBhIGtub3duIGNodW5rIHRoYXQgaGFzIGJlZW4gc2V0IHRvIGJlCisgICAgKiBoYW5kbGVkIGFzIHVua25vd24gb3IgemVybyBmb3IgYW4gdW5rbm93biBjaHVuay4gIEJ5IGRlZmF1bHQgdGhlIGZ1bmN0aW9uCisgICAgKiBqdXN0IHNraXBzIHRoZSBjaHVuayBvciBlcnJvcnMgb3V0IGlmIGl0IGlzIGNyaXRpY2FsLgorICAgICovCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkgfHxcCisgICAgZGVmaW5lZChQTkdfSEFORExFX0FTX1VOS05PV05fU1VQUE9SVEVEKQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfY2h1bmtfdW5rbm93bl9oYW5kbGluZywKKyAgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ191aW50XzMyIGNodW5rX25hbWUpLFBOR19FTVBUWSk7CisgICAvKiBFeGFjdGx5IGFzIHRoZSBBUEkgcG5nX2hhbmRsZV9hc191bmtub3duKCkgZXhjZXB0IHRoYXQgdGhlIGFyZ3VtZW50IGlzIGEKKyAgICAqIDMyLWJpdCBjaHVuayBuYW1lLCBub3QgYSBzdHJpbmcuCisgICAgKi8KKyNlbmRpZiAvKiBSRUFEX1VOS05PV05fQ0hVTktTIHx8IEhBTkRMRV9BU19VTktOT1dOICovCisKKy8qIEhhbmRsZSB0aGUgdHJhbnNmb3JtYXRpb25zIGZvciByZWFkaW5nIGFuZCB3cml0aW5nICovCisjaWZkZWYgUE5HX1JFQURfVFJBTlNGT1JNU19TVVBQT1JURUQKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb19yZWFkX3RyYW5zZm9ybWF0aW9ucywocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICBwbmdfcm93X2luZm9wIHJvd19pbmZvKSxQTkdfRU1QVFkpOworI2VuZGlmCisjaWZkZWYgUE5HX1dSSVRFX1RSQU5TRk9STVNfU1VQUE9SVEVECitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fd3JpdGVfdHJhbnNmb3JtYXRpb25zLChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgIHBuZ19yb3dfaW5mb3Agcm93X2luZm8pLFBOR19FTVBUWSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX1RSQU5TRk9STVNfU1VQUE9SVEVECitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaW5pdF9yZWFkX3RyYW5zZm9ybWF0aW9ucywocG5nX3N0cnVjdHJwIHBuZ19wdHIpLAorICAgIFBOR19FTVBUWSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRAorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3B1c2hfcmVhZF9jaHVuaywocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciksUE5HX0VNUFRZKTsKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX3JlYWRfc2lnLChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyKSxQTkdfRU1QVFkpOworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3B1c2hfY2hlY2tfY3JjLChwbmdfc3RydWN0cnAgcG5nX3B0ciksUE5HX0VNUFRZKTsKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX3NhdmVfYnVmZmVyLChwbmdfc3RydWN0cnAgcG5nX3B0ciksCisgICAgUE5HX0VNUFRZKTsKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX3Jlc3RvcmVfYnVmZmVyLChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfYnl0ZXAgYnVmZmVyLCBwbmdfc2l6ZV90IGJ1ZmZlcl9sZW5ndGgpLFBOR19FTVBUWSk7CitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcHVzaF9yZWFkX0lEQVQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSxQTkdfRU1QVFkpOworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3Byb2Nlc3NfSURBVF9kYXRhLChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfYnl0ZXAgYnVmZmVyLCBwbmdfc2l6ZV90IGJ1ZmZlcl9sZW5ndGgpLFBOR19FTVBUWSk7CitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcHVzaF9wcm9jZXNzX3JvdywocG5nX3N0cnVjdHJwIHBuZ19wdHIpLAorICAgIFBOR19FTVBUWSk7CitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcHVzaF9oYW5kbGVfdW5rbm93biwocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7CitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcHVzaF9oYXZlX2luZm8sKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgcG5nX2luZm9ycCBpbmZvX3B0ciksUE5HX0VNUFRZKTsKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX2hhdmVfZW5kLChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgIHBuZ19pbmZvcnAgaW5mb19wdHIpLFBOR19FTVBUWSk7CitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcHVzaF9oYXZlX3JvdywocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgIHBuZ19ieXRlcCByb3cpLFBOR19FTVBUWSk7CitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcHVzaF9yZWFkX2VuZCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciksUE5HX0VNUFRZKTsKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wcm9jZXNzX3NvbWVfZGF0YSwocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciksUE5HX0VNUFRZKTsKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdywocG5nX3N0cnVjdHJwIHBuZ19wdHIpLAorICAgIFBOR19FTVBUWSk7CisjICBpZmRlZiBQTkdfUkVBRF90RVh0X1NVUFBPUlRFRAorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3B1c2hfaGFuZGxlX3RFWHQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX3JlYWRfdEVYdCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciksUE5HX0VNUFRZKTsKKyMgIGVuZGlmCisjICBpZmRlZiBQTkdfUkVBRF96VFh0X1NVUFBPUlRFRAorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3B1c2hfaGFuZGxlX3pUWHQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX3JlYWRfelRYdCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciksUE5HX0VNUFRZKTsKKyMgIGVuZGlmCisjICBpZmRlZiBQTkdfUkVBRF9pVFh0X1NVUFBPUlRFRAorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3B1c2hfaGFuZGxlX2lUWHQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX3JlYWRfaVRYdCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciksUE5HX0VNUFRZKTsKKyMgIGVuZGlmCisKKyNlbmRpZiAvKiBQUk9HUkVTU0lWRV9SRUFEICovCisKKy8qIEFkZGVkIGF0IGxpYnBuZyB2ZXJzaW9uIDEuNi4wICovCisjaWZkZWYgUE5HX0dBTU1BX1NVUFBPUlRFRAorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2NvbG9yc3BhY2Vfc2V0X2dhbW1hLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29sb3JzcGFjZXJwIGNvbG9yc3BhY2UsIHBuZ19maXhlZF9wb2ludCBnQU1BKSwgUE5HX0VNUFRZKTsKKyAgIC8qIFNldCB0aGUgY29sb3JzcGFjZSBnYW1tYSB3aXRoIGEgdmFsdWUgcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uIG9yIGJ5CisgICAgKiB0aGUgZ0FNQSBjaHVuayBvbiByZWFkLiAgVGhlIHZhbHVlIHdpbGwgb3ZlcnJpZGUgYW55dGhpbmcgc2V0IGJ5IGFuIElDQworICAgICogcHJvZmlsZS4KKyAgICAqLworCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfY29sb3JzcGFjZV9zeW5jX2luZm8sKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIpLCBQTkdfRU1QVFkpOworICAgIC8qIFN5bmNocm9uaXplIHRoZSBpbmZvICd2YWxpZCcgZmxhZ3Mgd2l0aCB0aGUgY29sb3JzcGFjZSAqLworCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfY29sb3JzcGFjZV9zeW5jLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyKSwgUE5HX0VNUFRZKTsKKyAgICAvKiBDb3B5IHRoZSBwbmdfc3RydWN0IGNvbG9yc3BhY2UgdG8gdGhlIGluZm9fc3RydWN0IGFuZCBjYWxsIHRoZSBhYm92ZSB0bworICAgICAqIHN5bmNocm9uaXplIHRoZSBmbGFncy4gIENoZWNrcyBmb3IgTlVMTCBpbmZvX3B0ciBhbmQgZG9lcyBub3RoaW5nLgorICAgICAqLworI2VuZGlmCisKKy8qIEFkZGVkIGF0IGxpYnBuZyB2ZXJzaW9uIDEuNC4wICovCisjaWZkZWYgUE5HX0NPTE9SU1BBQ0VfU1VQUE9SVEVECisvKiBUaGVzZSBpbnRlcm5hbCBmdW5jdGlvbnMgYXJlIGZvciBtYWludGFpbmluZyB0aGUgY29sb3JzcGFjZSBzdHJ1Y3R1cmUgd2l0aGluCisgKiBhIHBuZ19pbmZvIG9yIHBuZ19zdHJ1Y3QgKG9yLCBpbmRlZWQsIGJvdGgpLgorICovCitQTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ19jb2xvcnNwYWNlX3NldF9jaHJvbWF0aWNpdGllcywKKyAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLCBjb25zdCBwbmdfeHkgKnh5LAorICAgIGludCBwcmVmZXJyZWQpLCBQTkdfRU1QVFkpOworCitQTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ19jb2xvcnNwYWNlX3NldF9lbmRwb2ludHMsCisgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb2xvcnNwYWNlcnAgY29sb3JzcGFjZSwgY29uc3QgcG5nX1hZWiAqWFlaLAorICAgIGludCBwcmVmZXJyZWQpLCBQTkdfRU1QVFkpOworCisjaWZkZWYgUE5HX3NSR0JfU1VQUE9SVEVECitQTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ19jb2xvcnNwYWNlX3NldF9zUkdCLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgIHBuZ19jb2xvcnNwYWNlcnAgY29sb3JzcGFjZSwgaW50IGludGVudCksIFBOR19FTVBUWSk7CisgICAvKiBUaGlzIGRvZXMgc2V0IHRoZSBjb2xvcnNwYWNlIGdBTUEgYW5kIGNIUk0gdmFsdWVzIHRvbywgYnV0IGRvZXNuJ3Qgc2V0IHRoZQorICAgICogZmxhZ3MgdG8gd3JpdGUgdGhlbSwgaWYgaXQgcmV0dXJucyBmYWxzZSB0aGVyZSB3YXMgYSBwcm9ibGVtIGFuZCBhbiBlcnJvcgorICAgICogbWVzc2FnZSBoYXMgYWxyZWFkeSBiZWVuIG91dHB1dCAoYnV0IHRoZSBjb2xvcnNwYWNlIG1heSBzdGlsbCBuZWVkIHRvIGJlCisgICAgKiBzeW5jZWQgdG8gcmVjb3JkIHRoZSBpbnZhbGlkIGZsYWcpLgorICAgICovCisjZW5kaWYgLyogc1JHQiAqLworCisjaWZkZWYgUE5HX2lDQ1BfU1VQUE9SVEVECitQTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ19jb2xvcnNwYWNlX3NldF9JQ0MsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLCBwbmdfY29uc3RfY2hhcnAgbmFtZSwKKyAgIHBuZ191aW50XzMyIHByb2ZpbGVfbGVuZ3RoLCBwbmdfY29uc3RfYnl0ZXAgcHJvZmlsZSwgaW50IGNvbG9yX3R5cGUpLAorICAgUE5HX0VNUFRZKTsKKyAgIC8qIFRoZSAnbmFtZScgaXMgdXNlZCBmb3IgaW5mb3JtYXRpb24gb25seSAqLworCisvKiBSb3V0aW5lcyBmb3IgY2hlY2tpbmcgcGFydHMgb2YgYW4gSUNDIHByb2ZpbGUuICovCitQTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ19pY2NfY2hlY2tfbGVuZ3RoLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgIHBuZ19jb2xvcnNwYWNlcnAgY29sb3JzcGFjZSwgcG5nX2NvbnN0X2NoYXJwIG5hbWUsCisgICBwbmdfdWludF8zMiBwcm9maWxlX2xlbmd0aCksIFBOR19FTVBUWSk7CitQTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ19pY2NfY2hlY2tfaGVhZGVyLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgIHBuZ19jb2xvcnNwYWNlcnAgY29sb3JzcGFjZSwgcG5nX2NvbnN0X2NoYXJwIG5hbWUsCisgICBwbmdfdWludF8zMiBwcm9maWxlX2xlbmd0aCwKKyAgIHBuZ19jb25zdF9ieXRlcCBwcm9maWxlIC8qIGZpcnN0IDEzMiBieXRlcyBvbmx5ICovLCBpbnQgY29sb3JfdHlwZSksCisgICBQTkdfRU1QVFkpOworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfaWNjX2NoZWNrX3RhZ190YWJsZSwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICBwbmdfY29sb3JzcGFjZXJwIGNvbG9yc3BhY2UsIHBuZ19jb25zdF9jaGFycCBuYW1lLAorICAgcG5nX3VpbnRfMzIgcHJvZmlsZV9sZW5ndGgsCisgICBwbmdfY29uc3RfYnl0ZXAgcHJvZmlsZSAvKiBoZWFkZXIgcGx1cyB3aG9sZSB0YWcgdGFibGUgKi8pLCBQTkdfRU1QVFkpOworI2lmZGVmIFBOR19zUkdCX1NVUFBPUlRFRAorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2ljY19zZXRfc1JHQiwoCisgICBwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLAorICAgcG5nX2NvbnN0X2J5dGVwIHByb2ZpbGUsIHVMb25nIGFkbGVyKSwgUE5HX0VNUFRZKTsKKyAgIC8qICdhZGxlcicgaXMgdGhlIEFkbGVyMzIgY2hlY2tzdW0gb2YgdGhlIHVuY29tcHJlc3NlZCBwcm9maWxlIGRhdGEuIEl0IG1heQorICAgICogYmUgemVybyB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIG5vdCBhdmFpbGFibGUuICBJdCBpcyB1c2VkLCBpZiBwcm92aWRlZCwKKyAgICAqIGFzIGEgZmFzdCBjaGVjayBvbiB0aGUgcHJvZmlsZSB3aGVuIGNoZWNraW5nIHRvIHNlZSBpZiBpdCBpcyBzUkdCLgorICAgICovCisjZW5kaWYKKyNlbmRpZiAvKiBpQ0NQICovCisKKyNpZmRlZiBQTkdfUkVBRF9SR0JfVE9fR1JBWV9TVVBQT1JURUQKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19jb2xvcnNwYWNlX3NldF9yZ2JfY29lZmZpY2llbnRzLAorICAgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSwgUE5HX0VNUFRZKTsKKyAgIC8qIFNldCB0aGUgcmdiX3RvX2dyYXkgY29lZmZpY2llbnRzIGZyb20gdGhlIGNvbG9yc3BhY2UgWSB2YWx1ZXMgKi8KKyNlbmRpZiAvKiBSRUFEX1JHQl9UT19HUkFZICovCisjZW5kaWYgLyogQ09MT1JTUEFDRSAqLworCisvKiBBZGRlZCBhdCBsaWJwbmcgdmVyc2lvbiAxLjQuMCAqLworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2NoZWNrX0lIRFIsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ191aW50XzMyIHdpZHRoLCBwbmdfdWludF8zMiBoZWlnaHQsIGludCBiaXRfZGVwdGgsCisgICAgaW50IGNvbG9yX3R5cGUsIGludCBpbnRlcmxhY2VfdHlwZSwgaW50IGNvbXByZXNzaW9uX3R5cGUsCisgICAgaW50IGZpbHRlcl90eXBlKSxQTkdfRU1QVFkpOworCisvKiBBZGRlZCBhdCBsaWJwbmcgdmVyc2lvbiAxLjUuMTAgKi8KKyNpZiBkZWZpbmVkKFBOR19SRUFEX0NIRUNLX0ZPUl9JTlZBTElEX0lOREVYX1NVUFBPUlRFRCkgfHwgXAorICAgIGRlZmluZWQoUE5HX1dSSVRFX0NIRUNLX0ZPUl9JTlZBTElEX0lOREVYX1NVUFBPUlRFRCkKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb19jaGVja19wYWxldHRlX2luZGV4ZXMsCisgICAocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19yb3dfaW5mb3Agcm93X2luZm8pLFBOR19FTVBUWSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfRVJST1JfVEVYVF9TVVBQT1JURUQpCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZml4ZWRfZXJyb3IsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgcG5nX2NvbnN0X2NoYXJwIG5hbWUpLFBOR19OT1JFVFVSTik7CisjZW5kaWYKKworLyogUHV0cyAnc3RyaW5nJyBpbnRvICdidWZmZXInIGF0IGJ1ZmZlcltwb3NdLCB0YWtpbmcgY2FyZSBuZXZlciB0byBvdmVyd3JpdGUKKyAqIHRoZSBlbmQuICBBbHdheXMgbGVhdmVzIHRoZSBidWZmZXIgbnVsIHRlcm1pbmF0ZWQuICBOZXZlciBlcnJvcnMgb3V0IChhbmQKKyAqIHRoZXJlIGlzIG5vIGVycm9yIGNvZGUuKQorICovCitQTkdfSU5URVJOQUxfRlVOQ1RJT04oc2l6ZV90LHBuZ19zYWZlY2F0LChwbmdfY2hhcnAgYnVmZmVyLCBzaXplX3QgYnVmc2l6ZSwKKyAgIHNpemVfdCBwb3MsIHBuZ19jb25zdF9jaGFycCBzdHJpbmcpLFBOR19FTVBUWSk7CisKKy8qIFZhcmlvdXMgaW50ZXJuYWwgZnVuY3Rpb25zIHRvIGhhbmRsZSBmb3JtYXR0ZWQgd2FybmluZyBtZXNzYWdlcywgY3VycmVudGx5CisgKiBvbmx5IGltcGxlbWVudGVkIGZvciB3YXJuaW5ncy4KKyAqLworI2lmIGRlZmluZWQoUE5HX1dBUk5JTkdTX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfVElNRV9SRkMxMTIzX1NVUFBPUlRFRCkKKy8qIFV0aWxpdHkgdG8gZHVtcCBhbiB1bnNpZ25lZCB2YWx1ZSBpbnRvIGEgYnVmZmVyLCBnaXZlbiBhIHN0YXJ0IHBvaW50ZXIgYW5kCisgKiBhbmQgZW5kIHBvaW50ZXIgKHdoaWNoIHNob3VsZCBwb2ludCBqdXN0ICpiZXlvbmQqIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciEpCisgKiBSZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgZm9ybWF0dGVkIHN0cmluZy4gIFRoaXMgdXRpbGl0eSBvbmx5CisgKiBkb2VzIHVuc2lnbmVkIHZhbHVlcy4KKyAqLworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHBuZ19jaGFycCxwbmdfZm9ybWF0X251bWJlciwocG5nX2NvbnN0X2NoYXJwIHN0YXJ0LAorICAgcG5nX2NoYXJwIGVuZCwgaW50IGZvcm1hdCwgcG5nX2FsbG9jX3NpemVfdCBudW1iZXIpLFBOR19FTVBUWSk7CisKKy8qIENvbnZlbmllbmNlIG1hY3JvIHRoYXQgdGFrZXMgYW4gYXJyYXk6ICovCisjZGVmaW5lIFBOR19GT1JNQVRfTlVNQkVSKGJ1ZmZlcixmb3JtYXQsbnVtYmVyKSBcCisgICBwbmdfZm9ybWF0X251bWJlcihidWZmZXIsIGJ1ZmZlciArIChzaXplb2YgYnVmZmVyKSwgZm9ybWF0LCBudW1iZXIpCisKKy8qIFN1Z2dlc3RlZCBzaXplIGZvciBhIG51bWJlciBidWZmZXIgKGVub3VnaCBmb3IgNjQgYml0cyBhbmQgYSBzaWduISkgKi8KKyNkZWZpbmUgUE5HX05VTUJFUl9CVUZGRVJfU0laRSAyNAorCisvKiBUaGVzZSBhcmUgdGhlIGludGVnZXIgZm9ybWF0cyBjdXJyZW50bHkgc3VwcG9ydGVkLCB0aGUgbmFtZSBpcyBmb3JtZWQgZnJvbQorICogdGhlIHN0YW5kYXJkIHByaW50ZigzKSBmb3JtYXQgc3RyaW5nLgorICovCisjZGVmaW5lIFBOR19OVU1CRVJfRk9STUFUX3UgICAgIDEgLyogY2hvc2UgdW5zaWduZWQgQVBJISAqLworI2RlZmluZSBQTkdfTlVNQkVSX0ZPUk1BVF8wMnUgICAyCisjZGVmaW5lIFBOR19OVU1CRVJfRk9STUFUX2QgICAgIDEgLyogY2hvc2Ugc2lnbmVkIEFQSSEgKi8KKyNkZWZpbmUgUE5HX05VTUJFUl9GT1JNQVRfMDJkICAgMgorI2RlZmluZSBQTkdfTlVNQkVSX0ZPUk1BVF94ICAgICAzCisjZGVmaW5lIFBOR19OVU1CRVJfRk9STUFUXzAyeCAgIDQKKyNkZWZpbmUgUE5HX05VTUJFUl9GT1JNQVRfZml4ZWQgNSAvKiBjaG9vc2UgdGhlIHNpZ25lZCBBUEkgKi8KKyNlbmRpZgorCisjaWZkZWYgUE5HX1dBUk5JTkdTX1NVUFBPUlRFRAorLyogTmV3IGRlZmluZXMgYW5kIG1lbWJlcnMgYWRkaW5nIGluIGxpYnBuZy0xLjUuNCAqLworIyAgZGVmaW5lIFBOR19XQVJOSU5HX1BBUkFNRVRFUl9TSVpFIDMyCisjICBkZWZpbmUgUE5HX1dBUk5JTkdfUEFSQU1FVEVSX0NPVU5UIDggLyogTWF4aW11bSA5OyBzZWUgcG5nZXJyb3IuYyAqLworCisvKiBBbiBsLXZhbHVlIG9mIHRoaXMgdHlwZSBoYXMgdG8gYmUgcGFzc2VkIHRvIHRoZSBBUElzIGJlbG93IHRvIGNhY2hlIHRoZQorICogdmFsdWVzIG9mIHRoZSBwYXJhbWV0ZXJzIHRvIGEgZm9ybWF0dGVkIHdhcm5pbmcgbWVzc2FnZS4KKyAqLwordHlwZWRlZiBjaGFyIHBuZ193YXJuaW5nX3BhcmFtZXRlcnNbUE5HX1dBUk5JTkdfUEFSQU1FVEVSX0NPVU5UXVsKKyAgIFBOR19XQVJOSU5HX1BBUkFNRVRFUl9TSVpFXTsKKworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dhcm5pbmdfcGFyYW1ldGVyLChwbmdfd2FybmluZ19wYXJhbWV0ZXJzIHAsCisgICBpbnQgbnVtYmVyLCBwbmdfY29uc3RfY2hhcnAgc3RyaW5nKSxQTkdfRU1QVFkpOworICAgLyogUGFyYW1ldGVycyBhcmUgbGltaXRlZCBpbiBzaXplIHRvIFBOR19XQVJOSU5HX1BBUkFNRVRFUl9TSVpFIGNoYXJhY3RlcnMsCisgICAgKiBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nICdcMCcuCisgICAgKi8KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193YXJuaW5nX3BhcmFtZXRlcl91bnNpZ25lZCwKKyAgIChwbmdfd2FybmluZ19wYXJhbWV0ZXJzIHAsIGludCBudW1iZXIsIGludCBmb3JtYXQsIHBuZ19hbGxvY19zaXplX3QgdmFsdWUpLAorICAgUE5HX0VNUFRZKTsKKyAgIC8qIFVzZSBwbmdfYWxsb2Nfc2l6ZV90IGJlY2F1c2UgaXQgaXMgYW4gdW5zaWduZWQgdHlwZSBhcyBiaWcgYXMgYW55IHdlCisgICAgKiBuZWVkIHRvIG91dHB1dC4gIFVzZSB0aGUgZm9sbG93aW5nIGZvciBhIHNpZ25lZCB2YWx1ZS4KKyAgICAqLworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dhcm5pbmdfcGFyYW1ldGVyX3NpZ25lZCwKKyAgIChwbmdfd2FybmluZ19wYXJhbWV0ZXJzIHAsIGludCBudW1iZXIsIGludCBmb3JtYXQsIHBuZ19pbnRfMzIgdmFsdWUpLAorICAgUE5HX0VNUFRZKTsKKworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2Zvcm1hdHRlZF93YXJuaW5nLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgIHBuZ193YXJuaW5nX3BhcmFtZXRlcnMgcCwgcG5nX2NvbnN0X2NoYXJwIG1lc3NhZ2UpLFBOR19FTVBUWSk7CisgICAvKiAnbWVzc2FnZScgZm9sbG93cyB0aGUgWC9PcGVuIGFwcHJvYWNoIG9mIHVzaW5nIEAxLCBAMiB0byBpbnNlcnQKKyAgICAqIHBhcmFtZXRlcnMgcHJldmlvdXNseSBzdXBwbGllZCB1c2luZyB0aGUgYWJvdmUgZnVuY3Rpb25zLiAgRXJyb3JzIGluCisgICAgKiBzcGVjaWZ5aW5nIHRoZSBwYXJhbWV0ZXJzIHdpbGwgc2ltcGx5IHJlc3VsdCBpbiBnYXJiYWdlIHN1YnN0aXR1dGlvbnMuCisgICAgKi8KKyNlbmRpZgorCisjaWZkZWYgUE5HX0JFTklHTl9FUlJPUlNfU1VQUE9SVEVECisvKiBBcHBsaWNhdGlvbiBlcnJvcnMgKG5ldyBpbiAxLjYpOyB1c2UgdGhlc2UgZnVuY3Rpb25zIChkZWNsYXJlZCBiZWxvdykgZm9yCisgKiBlcnJvcnMgaW4gdGhlIHBhcmFtZXRlcnMgb3Igb3JkZXIgb2YgQVBJIGZ1bmN0aW9uIGNhbGxzIG9uIHJlYWQuICBUaGUKKyAqICd3YXJuaW5nJyBzaG91bGQgYmUgdXNlZCBmb3IgYW4gZXJyb3IgdGhhdCBjYW4gYmUgaGFuZGxlZCBjb21wbGV0ZWx5OyB0aGUKKyAqICdlcnJvcicgZm9yIG9uZSB3aGljaCBjYW4gYmUgaGFuZGxlZCBzYWZlbHkgYnV0IHdoaWNoIG1heSBsb3NlIGFwcGxpY2F0aW9uCisgKiBpbmZvcm1hdGlvbiBvciBzZXR0aW5ncy4KKyAqCisgKiBCeSBkZWZhdWx0IHRoZXNlIGJvdGggcmVzdWx0IGluIGEgcG5nX2Vycm9yIGNhbGwgcHJpb3IgdG8gcmVsZWFzZSwgd2hpbGUgaW4gYQorICogcmVsZWFzZWQgdmVyc2lvbiB0aGUgJ3dhcm5pbmcnIGlzIGp1c3QgYSB3YXJuaW5nLiAgSG93ZXZlciBpZiB0aGUgYXBwbGljYXRpb24KKyAqIGV4cGxpY2l0bHkgZGlzYWJsZXMgYmVuaWduIGVycm9ycyAoZXhwbGljaXRseSBwZXJtaXR0aW5nIHRoZSBjb2RlIHRvIGxvc2UKKyAqIGluZm9ybWF0aW9uKSB0aGV5IGJvdGggdHVybiBpbnRvIHdhcm5pbmdzLgorICoKKyAqIElmIGJlbmlnbiBlcnJvcnMgYXJlbid0IHN1cHBvcnRlZCB0aGV5IGVuZCB1cCBhcyB0aGUgY29ycmVzcG9uZGluZyBiYXNlIGNhbGwKKyAqIChwbmdfd2FybmluZyBvciBwbmdfZXJyb3IuKQorICovCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfYXBwX3dhcm5pbmcsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgcG5nX2NvbnN0X2NoYXJwIG1lc3NhZ2UpLFBOR19FTVBUWSk7CisgICAvKiBUaGUgYXBwbGljYXRpb24gcHJvdmlkZWQgaW52YWxpZCBwYXJhbWV0ZXJzIHRvIGFuIEFQSSBmdW5jdGlvbiBvciBjYWxsZWQKKyAgICAqIGFuIEFQSSBmdW5jdGlvbiBhdCB0aGUgd3JvbmcgdGltZSwgbGlicG5nIGNhbiBjb21wbGV0ZWx5IHJlY292ZXIuCisgICAgKi8KKworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2FwcF9lcnJvciwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICBwbmdfY29uc3RfY2hhcnAgbWVzc2FnZSksUE5HX0VNUFRZKTsKKyAgIC8qIEFzIGFib3ZlIGJ1dCBsaWJwbmcgd2lsbCBpZ25vcmUgdGhlIGNhbGwsIG9yIGF0dGVtcHQgc29tZSBvdGhlciBwYXJ0aWFsCisgICAgKiByZWNvdmVyeSBmcm9tIHRoZSBlcnJvci4KKyAgICAqLworI2Vsc2UKKyMgIGRlZmluZSBwbmdfYXBwX3dhcm5pbmcocHAscykgcG5nX3dhcm5pbmcocHAscykKKyMgIGRlZmluZSBwbmdfYXBwX2Vycm9yKHBwLHMpIHBuZ19lcnJvcihwcCxzKQorI2VuZGlmCisKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19jaHVua19yZXBvcnQsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgcG5nX2NvbnN0X2NoYXJwIG1lc3NhZ2UsIGludCBlcnJvciksUE5HX0VNUFRZKTsKKyAgIC8qIFJlcG9ydCBhIHJlY292ZXJhYmxlIGlzc3VlIGluIGNodW5rIGRhdGEuICBPbiByZWFkIHRoaXMgaXMgdXNlZCB0byByZXBvcnQKKyAgICAqIGEgcHJvYmxlbSBmb3VuZCB3aGlsZSByZWFkaW5nIGEgcGFydGljdWxhciBjaHVuayBhbmQgdGhlCisgICAgKiBwbmdfY2h1bmtfYmVuaWduX2Vycm9yIG9yIHBuZ19jaHVua193YXJuaW5nIGZ1bmN0aW9uIGlzIHVzZWQgYXMKKyAgICAqIGFwcHJvcHJpYXRlLiAgT24gd3JpdGUgdGhpcyBpcyB1c2VkIHRvIHJlcG9ydCBhbiBlcnJvciB0aGF0IGNvbWVzIGZyb20KKyAgICAqIGRhdGEgc2V0IHZpYSBhbiBhcHBsaWNhdGlvbiBjYWxsIHRvIGEgcG5nX3NldF8gQVBJIGFuZCBwbmdfYXBwX2Vycm9yIG9yCisgICAgKiBwbmdfYXBwX3dhcm5pbmcgaXMgdXNlZCBhcyBhcHByb3ByaWF0ZS4KKyAgICAqCisgICAgKiBUaGUgJ2Vycm9yJyBwYXJhbWV0ZXIgbXVzdCBoYXZlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgICAqLworI2RlZmluZSBQTkdfQ0hVTktfV0FSTklORyAgICAgMCAvKiBuZXZlciBhbiBlcnJvciAqLworI2RlZmluZSBQTkdfQ0hVTktfV1JJVEVfRVJST1IgMSAvKiBhbiBlcnJvciBvbmx5IG9uIHdyaXRlICovCisjZGVmaW5lIFBOR19DSFVOS19FUlJPUiAgICAgICAyIC8qIGFsd2F5cyBhbiBlcnJvciAqLworCisvKiBBU0NJSSB0byBGUCBpbnRlcmZhY2VzLCBjdXJyZW50bHkgb25seSBpbXBsZW1lbnRlZCBpZiBzQ0FMCisgKiBzdXBwb3J0IGlzIHJlcXVpcmVkLgorICovCisjaWYgZGVmaW5lZChQTkdfc0NBTF9TVVBQT1JURUQpCisvKiBNQVhfRElHSVRTIGlzIGFjdHVhbGx5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGFuIHNDQUwKKyAqIHdpZHRoIG9yIGhlaWdodCwgZGVyaXZlZCBmcm9tIHRoZSBwcmVjaXNpb24gKG51bWJlciBvZiBzaWduaWZpY2FudAorICogZGlnaXRzIC0gYSBidWlsZCB0aW1lIHNldHRhYmxlIG9wdGlvbikgYW5kIGFzc3VtcHRpb25zIGFib3V0IHRoZQorICogbWF4aW11bSByaWRpY3Vsb3VzIGV4cG9uZW50LgorICovCisjZGVmaW5lIFBOR19zQ0FMX01BWF9ESUdJVFMgKFBOR19zQ0FMX1BSRUNJU0lPTisxLyouKi8rMS8qRSovKzEwLypleHBvbmVudCovKQorCisjaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2FzY2lpX2Zyb21fZnAsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgcG5nX2NoYXJwIGFzY2lpLCBwbmdfc2l6ZV90IHNpemUsIGRvdWJsZSBmcCwgdW5zaWduZWQgaW50IHByZWNpc2lvbiksCisgICBQTkdfRU1QVFkpOworI2VuZGlmIC8qIEZMT0FUSU5HX1BPSU5UICovCisKKyNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfYXNjaWlfZnJvbV9maXhlZCwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICBwbmdfY2hhcnAgYXNjaWksIHBuZ19zaXplX3Qgc2l6ZSwgcG5nX2ZpeGVkX3BvaW50IGZwKSxQTkdfRU1QVFkpOworI2VuZGlmIC8qIEZJWEVEX1BPSU5UICovCisjZW5kaWYgLyogc0NBTCAqLworCisjaWYgZGVmaW5lZChQTkdfc0NBTF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX3BDQUxfU1VQUE9SVEVEKQorLyogQW4gaW50ZXJuYWwgQVBJIHRvIHZhbGlkYXRlIHRoZSBmb3JtYXQgb2YgYSBmbG9hdGluZyBwb2ludCBudW1iZXIuCisgKiBUaGUgcmVzdWx0IGlzIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBjaGFyYWN0ZXIuICBJZiB0aGUgbnVtYmVyIGlzCisgKiBub3QgdmFsaWQgaXQgd2lsbCBiZSB0aGUgaW5kZXggb2YgYSBjaGFyYWN0ZXIgaW4gdGhlIHN1cHBvc2VkIG51bWJlci4KKyAqCisgKiBUaGUgZm9ybWF0IG9mIGEgbnVtYmVyIGlzIGRlZmluZWQgaW4gdGhlIFBORyBleHRlbnNpb25zIHNwZWNpZmljYXRpb24KKyAqIGFuZCB0aGlzIEFQSSBpcyBzdHJpY3RseSBjb25mb3JtYW50IHRvIHRoYXQgc3BlYywgbm90IGFueW9uZSBlbHNlcyEKKyAqCisgKiBUaGUgZm9ybWF0IGFzIGEgcmVndWxhciBleHByZXNzaW9uIGlzOgorICoKKyAqIFsrLV0/WzAtOV0rLj8oW0VlXVsrLV0/WzAtOV0rKT8KKyAqCisgKiBvcjoKKyAqCisgKiBbKy1dPy5bMC05XSsoLlswLTldKyk/KFtFZV1bKy1dP1swLTldKyk/CisgKgorICogVGhlIGNvbXBsZXhpdHkgaXMgdGhhdCBlaXRoZXIgaW50ZWdlciBvciBmcmFjdGlvbiBtdXN0IGJlIHByZXNlbnQgYW5kIHRoZQorICogZnJhY3Rpb24gaXMgcGVybWl0dGVkIHRvIGhhdmUgbm8gZGlnaXRzIG9ubHkgaWYgdGhlIGludGVnZXIgaXMgcHJlc2VudC4KKyAqCisgKiBOT1RFOiBUaGUgZGFuZ2xpbmcgRSBwcm9ibGVtLgorICogICBUaGVyZSBpcyBhIFBORyB2YWxpZCBmbG9hdGluZyBwb2ludCBudW1iZXIgaW4gdGhlIGZvbGxvd2luZzoKKyAqCisgKiAgICAgICBQTkcgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBhcmUgbm90IGdyZWVkeS4KKyAqCisgKiAgIFdvcmtpbmcgdGhpcyBvdXQgcmVxdWlyZXMgKlRXTyogY2hhcmFjdGVyIGxvb2thaGVhZCAoYmVjYXVzZSBvZiB0aGUKKyAqICAgc2lnbiksIHRoZSBwYXJzZXIgZG9lcyBub3QgZG8gdGhpcyAtIGl0IHdpbGwgZmFpbCBhdCB0aGUgJ3InIC0gdGhpcworICogICBkb2Vzbid0IG1hdHRlciBmb3IgUE5HIHNDQUwgY2h1bmsgdmFsdWVzLCBidXQgaXQgcmVxdWlyZXMgbW9yZSBjYXJlCisgKiAgIGlmIHRoZSB2YWx1ZSB3ZXJlIGV2ZXIgdG8gYmUgZW1iZWRkZWQgaW4gc29tZXRoaW5nIG1vcmUgY29tcGxleC4gIFVzZQorICogICBBTlNJLUMgc3RydG9kIGlmIHlvdSBuZWVkIHRoZSBsb29rYWhlYWQuCisgKi8KKy8qIFN0YXRlIHRhYmxlIGZvciB0aGUgcGFyc2VyLiAqLworI2RlZmluZSBQTkdfRlBfSU5URUdFUiAgICAwICAvKiBiZWZvcmUgb3IgaW4gaW50ZWdlciAqLworI2RlZmluZSBQTkdfRlBfRlJBQ1RJT04gICAxICAvKiBiZWZvcmUgb3IgaW4gZnJhY3Rpb24gKi8KKyNkZWZpbmUgUE5HX0ZQX0VYUE9ORU5UICAgMiAgLyogYmVmb3JlIG9yIGluIGV4cG9uZW50ICovCisjZGVmaW5lIFBOR19GUF9TVEFURSAgICAgIDMgIC8qIG1hc2sgZm9yIHRoZSBhYm92ZSAqLworI2RlZmluZSBQTkdfRlBfU0FXX1NJR04gICA0ICAvKiBTYXcgKy8tIGluIGN1cnJlbnQgc3RhdGUgKi8KKyNkZWZpbmUgUE5HX0ZQX1NBV19ESUdJVCAgOCAgLyogU2F3IGEgZGlnaXQgaW4gY3VycmVudCBzdGF0ZSAqLworI2RlZmluZSBQTkdfRlBfU0FXX0RPVCAgIDE2ICAvKiBTYXcgYSBkb3QgaW4gY3VycmVudCBzdGF0ZSAqLworI2RlZmluZSBQTkdfRlBfU0FXX0UgICAgIDMyICAvKiBTYXcgYW4gRSAob3IgZSkgaW4gY3VycmVudCBzdGF0ZSAqLworI2RlZmluZSBQTkdfRlBfU0FXX0FOWSAgIDYwICAvKiBTYXcgYW55IG9mIHRoZSBhYm92ZSA0ICovCisKKy8qIFRoZXNlIHRocmVlIHZhbHVlcyBkb24ndCBhZmZlY3QgdGhlIHBhcnNlci4gIFRoZXkgYXJlIHNldCBidXQgbm90IHVzZWQuCisgKi8KKyNkZWZpbmUgUE5HX0ZQX1dBU19WQUxJRCA2NCAgLyogUHJlY2VkaW5nIHN1YnN0cmluZyBpcyBhIHZhbGlkIGZwIG51bWJlciAqLworI2RlZmluZSBQTkdfRlBfTkVHQVRJVkUgMTI4ICAvKiBBIG5lZ2F0aXZlIG51bWJlciwgaW5jbHVkaW5nICItMCIgKi8KKyNkZWZpbmUgUE5HX0ZQX05PTlpFUk8gIDI1NiAgLyogQSBub24temVybyB2YWx1ZSAqLworI2RlZmluZSBQTkdfRlBfU1RJQ0tZICAgNDQ4ICAvKiBUaGUgYWJvdmUgdGhyZWUgZmxhZ3MgKi8KKworLyogVGhpcyBpcyBhdmFpbGFibGUgZm9yIHRoZSBjYWxsZXIgdG8gc3RvcmUgaW4gJ3N0YXRlJyBpZiByZXF1aXJlZC4gIERvIG5vdAorICogY2FsbCB0aGUgcGFyc2VyIGFmdGVyIHNldHRpbmcgaXQgKHRoZSBwYXJzZXIgc29tZXRpbWVzIGNsZWFycyBpdC4pCisgKi8KKyNkZWZpbmUgUE5HX0ZQX0lOVkFMSUQgIDUxMiAgLyogQXZhaWxhYmxlIGZvciBjYWxsZXJzIGFzIGEgZGlzdGluY3QgdmFsdWUgKi8KKworLyogUmVzdWx0IGNvZGVzIGZvciB0aGUgcGFyc2VyIChib29sZWFuIC0gdHJ1ZSBtZWFudHMgb2ssIGZhbHNlIG1lYW5zCisgKiBub3Qgb2sgeWV0LikKKyAqLworI2RlZmluZSBQTkdfRlBfTUFZQkUgICAgICAwICAvKiBUaGUgbnVtYmVyIG1heSBiZSB2YWxpZCBpbiB0aGUgZnV0dXJlICovCisjZGVmaW5lIFBOR19GUF9PSyAgICAgICAgIDEgIC8qIFRoZSBudW1iZXIgaXMgdmFsaWQgKi8KKworLyogVGVzdHMgb24gdGhlIHN0aWNreSBub24temVybyBhbmQgbmVnYXRpdmUgZmxhZ3MuICBUbyBwYXNzIHRoZXNlIGNoZWNrcworICogdGhlIHN0YXRlIG11c3QgYWxzbyBpbmRpY2F0ZSB0aGF0IHRoZSB3aG9sZSBudW1iZXIgaXMgdmFsaWQgLSB0aGlzIGlzCisgKiBhY2hpZXZlZCBieSB0ZXN0aW5nIFBOR19GUF9TQVdfRElHSVQgKHNlZSB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHdoeSB0aGlzCisgKiBpcyBlcXVpdmFsZW50IHRvIFBOR19GUF9PSyBhYm92ZS4pCisgKi8KKyNkZWZpbmUgUE5HX0ZQX05aX01BU0sgKFBOR19GUF9TQVdfRElHSVQgfCBQTkdfRlBfTkVHQVRJVkUgfCBQTkdfRlBfTk9OWkVSTykKKyAgIC8qIE5aX01BU0s6IHRoZSBzdHJpbmcgaXMgdmFsaWQgYW5kIGEgbm9uLXplcm8gbmVnYXRpdmUgdmFsdWUgKi8KKyNkZWZpbmUgUE5HX0ZQX1pfTUFTSyAoUE5HX0ZQX1NBV19ESUdJVCB8IFBOR19GUF9OT05aRVJPKQorICAgLyogWiBNQVNLOiB0aGUgc3RyaW5nIGlzIHZhbGlkIGFuZCBhIG5vbi16ZXJvIHZhbHVlLiAqLworICAgLyogUE5HX0ZQX1NBV19ESUdJVDogdGhlIHN0cmluZyBpcyB2YWxpZC4gKi8KKyNkZWZpbmUgUE5HX0ZQX0lTX1pFUk8oc3RhdGUpICgoKHN0YXRlKSAmIFBOR19GUF9aX01BU0spID09IFBOR19GUF9TQVdfRElHSVQpCisjZGVmaW5lIFBOR19GUF9JU19QT1NJVElWRShzdGF0ZSkgKCgoc3RhdGUpICYgUE5HX0ZQX05aX01BU0spID09IFBOR19GUF9aX01BU0spCisjZGVmaW5lIFBOR19GUF9JU19ORUdBVElWRShzdGF0ZSkgKCgoc3RhdGUpICYgUE5HX0ZQX05aX01BU0spID09IFBOR19GUF9OWl9NQVNLKQorCisvKiBUaGUgYWN0dWFsIHBhcnNlci4gIFRoaXMgY2FuIGJlIGNhbGxlZCByZXBlYXRlZGx5LiBJdCB1cGRhdGVzCisgKiB0aGUgaW5kZXggaW50byB0aGUgc3RyaW5nIGFuZCB0aGUgc3RhdGUgdmFyaWFibGUgKHdoaWNoIG11c3QKKyAqIGJlIGluaXRpYWxpemVkIHRvIDApLiAgSXQgcmV0dXJucyBhIHJlc3VsdCBjb2RlLCBhcyBhYm92ZS4gIFRoZXJlCisgKiBpcyBubyBwb2ludCBjYWxsaW5nIHRoZSBwYXJzZXIgYW55IG1vcmUgaWYgaXQgZmFpbHMgdG8gYWR2YW5jZSB0bworICogdGhlIGVuZCBvZiB0aGUgc3RyaW5nIC0gaXQgaXMgc3R1Y2sgb24gYW4gaW52YWxpZCBjaGFyYWN0ZXIgKG9yCisgKiB0ZXJtaW5hdGVkIGJ5ICdcMCcpLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgcG9pbnRlciB3aWxsIGNvbnN1bWUgYW4gRSBvciBldmVuIGFuIEUrIGFuZCB0aGVuIGxlYXZlCisgKiBhICdtYXliZScgc3RhdGUgZXZlbiB0aG91Z2ggYSBwcmVjZWRpbmcgaW50ZWdlci5mcmFjdGlvbiBpcyB2YWxpZC4KKyAqIFRoZSBQTkdfRlBfV0FTX1ZBTElEIGZsYWcgaW5kaWNhdGVzIHRoYXQgYSBwcmVjZWRpbmcgc3Vic3RyaW5nIHdhcworICogYSB2YWxpZCBudW1iZXIuICBJdCdzIHBvc3NpYmxlIHRvIHJlY292ZXIgZnJvbSB0aGlzIGJ5IGNhbGxpbmcKKyAqIHRoZSBwYXJzZXIgYWdhaW4gKGZyb20gdGhlIHN0YXJ0LCB3aXRoIHN0YXRlIDApIGJ1dCB3aXRoIGEgc3RyaW5nCisgKiB0aGF0IG9taXRzIHRoZSBsYXN0IGNoYXJhY3RlciAoaS5lLiBzZXQgdGhlIHNpemUgdG8gdGhlIGluZGV4IG9mCisgKiB0aGUgcHJvYmxlbSBjaGFyYWN0ZXIuKSAgVGhpcyBoYXMgbm90IGJlZW4gdGVzdGVkIHdpdGhpbiBsaWJwbmcuCisgKi8KK1BOR19JTlRFUk5BTF9GVU5DVElPTihpbnQscG5nX2NoZWNrX2ZwX251bWJlciwocG5nX2NvbnN0X2NoYXJwIHN0cmluZywKKyAgIHBuZ19zaXplX3Qgc2l6ZSwgaW50ICpzdGF0ZXAsIHBuZ19zaXplX3RwIHdoZXJlYW1pKSxQTkdfRU1QVFkpOworCisvKiBUaGlzIGlzIHRoZSBzYW1lIGJ1dCBpdCBjaGVja3MgYSBjb21wbGV0ZSBzdHJpbmcgYW5kIHJldHVybnMgdHJ1ZQorICogb25seSBpZiBpdCBqdXN0IGNvbnRhaW5zIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLiAgQXMgb2YgMS41LjQgdGhpcworICogZnVuY3Rpb24gYWxzbyByZXR1cm5zIHRoZSBzdGF0ZSBhdCB0aGUgZW5kIG9mIHBhcnNpbmcgdGhlIG51bWJlciBpZgorICogaXQgd2FzIHZhbGlkIChvdGhlcndpc2UgaXQgcmV0dXJucyAwLikgIFRoaXMgY2FuIGJlIHVzZWQgZm9yIHRlc3RpbmcKKyAqIGZvciBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlcyB1c2luZyB0aGUgc3RpY2t5IGZsYWcuCisgKi8KK1BOR19JTlRFUk5BTF9GVU5DVElPTihpbnQscG5nX2NoZWNrX2ZwX3N0cmluZywocG5nX2NvbnN0X2NoYXJwIHN0cmluZywKKyAgIHBuZ19zaXplX3Qgc2l6ZSksUE5HX0VNUFRZKTsKKyNlbmRpZiAvKiBwQ0FMIHx8IHNDQUwgKi8KKworI2lmIGRlZmluZWQoUE5HX0dBTU1BX1NVUFBPUlRFRCkgfHxcCisgICAgZGVmaW5lZChQTkdfSU5DSF9DT05WRVJTSU9OU19TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfcEhZc19TVVBQT1JURUQpCisvKiBBZGRlZCBhdCBsaWJwbmcgdmVyc2lvbiAxLjUuMCAqLworLyogVGhpcyBpcyBhIHV0aWxpdHkgdG8gcHJvdmlkZSBhKnRpbWVzL2RpdiAocm91bmRlZCkgYW5kIGluZGljYXRlCisgKiBpZiB0aGVyZSBpcyBhbiBvdmVyZmxvdy4gIFRoZSByZXN1bHQgaXMgYSBib29sZWFuIC0gZmFsc2UgKDApCisgKiBmb3Igb3ZlcmZsb3csIHRydWUgKDEpIGlmIG5vIG92ZXJmbG93LCBpbiB3aGljaCBjYXNlICpyZXMKKyAqIGhvbGRzIHRoZSByZXN1bHQuCisgKi8KK1BOR19JTlRFUk5BTF9GVU5DVElPTihpbnQscG5nX211bGRpdiwocG5nX2ZpeGVkX3BvaW50X3AgcmVzLCBwbmdfZml4ZWRfcG9pbnQgYSwKKyAgIHBuZ19pbnRfMzIgbXVsdGlwbGllZF9ieSwgcG5nX2ludF8zMiBkaXZpZGVkX2J5KSxQTkdfRU1QVFkpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfSU5DSF9DT05WRVJTSU9OU19TVVBQT1JURUQpCisvKiBTYW1lIGRlYWwsIGJ1dCBpc3N1ZSBhIHdhcm5pbmcgb24gb3ZlcmZsb3cgYW5kIHJldHVybiAwLiAqLworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHBuZ19maXhlZF9wb2ludCxwbmdfbXVsZGl2X3dhcm4sCisgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19maXhlZF9wb2ludCBhLCBwbmdfaW50XzMyIG11bHRpcGxpZWRfYnksCisgICBwbmdfaW50XzMyIGRpdmlkZWRfYnkpLFBOR19FTVBUWSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19HQU1NQV9TVVBQT1JURUQKKy8qIENhbGN1bGF0ZSBhIHJlY2lwcm9jYWwgLSB1c2VkIGZvciBnYW1tYSB2YWx1ZXMuICBUaGlzIHJldHVybnMKKyAqIDAgaWYgdGhlIGFyZ3VtZW50IGlzIDAgaW4gb3JkZXIgdG8gbWFpbnRhaW4gYW4gdW5kZWZpbmVkIHZhbHVlOworICogdGhlcmUgYXJlIG5vIHdhcm5pbmdzLgorICovCitQTkdfSU5URVJOQUxfRlVOQ1RJT04ocG5nX2ZpeGVkX3BvaW50LHBuZ19yZWNpcHJvY2FsLChwbmdfZml4ZWRfcG9pbnQgYSksCisgICBQTkdfRU1QVFkpOworCisjaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECisvKiBUaGUgc2FtZSBidXQgZ2l2ZXMgYSByZWNpcHJvY2FsIG9mIHRoZSBwcm9kdWN0IG9mIHR3byBmaXhlZCBwb2ludAorICogdmFsdWVzLiAgQWNjdXJhY3kgaXMgc3VpdGFibGUgZm9yIGdhbW1hIGNhbGN1bGF0aW9ucyBidXQgdGhpcyBpcworICogbm90IGV4YWN0IC0gdXNlIHBuZ19tdWxkaXYgZm9yIHRoYXQuICBPbmx5IHJlcXVpcmVkIGF0IHByZXNlbnQgb24gcmVhZC4KKyAqLworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHBuZ19maXhlZF9wb2ludCxwbmdfcmVjaXByb2NhbDIsKHBuZ19maXhlZF9wb2ludCBhLAorICAgcG5nX2ZpeGVkX3BvaW50IGIpLFBOR19FTVBUWSk7CisjZW5kaWYKKworLyogUmV0dXJuIHRydWUgaWYgdGhlIGdhbW1hIHZhbHVlIGlzIHNpZ25pZmljYW50bHkgZGlmZmVyZW50IGZyb20gMS4wICovCitQTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ19nYW1tYV9zaWduaWZpY2FudCwocG5nX2ZpeGVkX3BvaW50IGdhbW1hX3ZhbHVlKSwKKyAgIFBOR19FTVBUWSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAorLyogSW50ZXJuYWwgZml4ZWQgcG9pbnQgZ2FtbWEgY29ycmVjdGlvbi4gIFRoZXNlIEFQSXMgYXJlIGNhbGxlZCBhcworICogcmVxdWlyZWQgdG8gY29udmVydCBzaW5nbGUgdmFsdWVzIC0gdGhleSBkb24ndCBuZWVkIHRvIGJlIGZhc3QsCisgKiB0aGV5IGFyZSBub3QgdXNlZCB3aGVuIHByb2Nlc3NpbmcgaW1hZ2UgcGl4ZWwgdmFsdWVzLgorICoKKyAqIFdoaWxlIHRoZSBpbnB1dCBpcyBhbiAndW5zaWduZWQnIHZhbHVlIGl0IG11c3QgYWN0dWFsbHkgYmUgdGhlCisgKiBjb3JyZWN0IGJpdCB2YWx1ZSAtIDAuLjI1NSBvciAwLi42NTUzNSBhcyByZXF1aXJlZC4KKyAqLworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHBuZ191aW50XzE2LHBuZ19nYW1tYV9jb3JyZWN0LChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgIHVuc2lnbmVkIGludCB2YWx1ZSwgcG5nX2ZpeGVkX3BvaW50IGdhbW1hX3ZhbHVlKSxQTkdfRU1QVFkpOworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHBuZ191aW50XzE2LHBuZ19nYW1tYV8xNmJpdF9jb3JyZWN0LCh1bnNpZ25lZCBpbnQgdmFsdWUsCisgICBwbmdfZml4ZWRfcG9pbnQgZ2FtbWFfdmFsdWUpLFBOR19FTVBUWSk7CitQTkdfSU5URVJOQUxfRlVOQ1RJT04ocG5nX2J5dGUscG5nX2dhbW1hXzhiaXRfY29ycmVjdCwodW5zaWduZWQgaW50IHZhbHVlLAorICAgcG5nX2ZpeGVkX3BvaW50IGdhbW1hX3ZhbHVlKSxQTkdfRU1QVFkpOworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2Rlc3Ryb3lfZ2FtbWFfdGFibGUsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSwKKyAgIFBOR19FTVBUWSk7CitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfYnVpbGRfZ2FtbWFfdGFibGUsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgaW50IGJpdF9kZXB0aCksUE5HX0VNUFRZKTsKKyNlbmRpZgorCisvKiBTSU1QTElGSUVEIFJFQUQvV1JJVEUgU1VQUE9SVCAqLworI2lmIGRlZmluZWQoUE5HX1NJTVBMSUZJRURfUkVBRF9TVVBQT1JURUQpIHx8XAorICAgZGVmaW5lZChQTkdfU0lNUExJRklFRF9XUklURV9TVVBQT1JURUQpCisvKiBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIHRoYXQgcG5nX2ltYWdlOjpvcGFxdWUgcG9pbnRzIHRvLiAqLwordHlwZWRlZiBzdHJ1Y3QgcG5nX2NvbnRyb2wKK3sKKyAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHI7CisgICBwbmdfaW5mb3AgICBpbmZvX3B0cjsKKyAgIHBuZ192b2lkcCAgIGVycm9yX2J1ZjsgICAgICAgICAgIC8qIEFsd2F5cyBhIGptcF9idWYgYXQgcHJlc2VudC4gKi8KKworICAgcG5nX2NvbnN0X2J5dGVwIG1lbW9yeTsgICAgICAgICAgLyogTWVtb3J5IGJ1ZmZlci4gKi8KKyAgIHBuZ19zaXplX3QgICAgICBzaXplOyAgICAgICAgICAgIC8qIFNpemUgb2YgdGhlIG1lbW9yeSBidWZmZXIuICovCisKKyAgIHVuc2lnbmVkIGludCBmb3Jfd3JpdGUgICAgICAgOjE7IC8qIE90aGVyd2lzZSBpdCBpcyBhIHJlYWQgc3RydWN0dXJlICovCisgICB1bnNpZ25lZCBpbnQgb3duZWRfZmlsZSAgICAgIDoxOyAvKiBXZSBvd24gdGhlIGZpbGUgaW4gaW9fcHRyICovCit9IHBuZ19jb250cm9sOworCisvKiBSZXR1cm4gdGhlIHBvaW50ZXIgdG8gdGhlIGptcF9idWYgZnJvbSBhIHBuZ19jb250cm9sOiBuZWNlc3NhcnkgYmVjYXVzZSBDCisgKiBkb2VzIG5vdCByZXZlYWwgdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnRzIG9mIGptcF9idWYuCisgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworIyAgZGVmaW5lIHBuZ19jb250cm9sX2ptcF9idWYocGMpICgoKGptcF9idWYqKSgocGMpLT5lcnJvcl9idWYpKVswXSkKKyNlbHNlCisjICBkZWZpbmUgcG5nX2NvbnRyb2xfam1wX2J1ZihwYykgKChwYyktPmVycm9yX2J1ZikKKyNlbmRpZgorCisvKiBVdGlsaXR5IHRvIHNhZmVseSBleGVjdXRlIGEgcGllY2Ugb2YgbGlicG5nIGNvZGUgY2F0Y2hpbmcgYW5kIGxvZ2dpbmcgYW55CisgKiBlcnJvcnMgdGhhdCBtaWdodCBvY2N1ci4gIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlIChlaXRoZXIKKyAqIG9mIHRoZSBmdW5jdGlvbiBvciBhcyBhIHJlc3VsdCBvZiBhIHBuZ19lcnJvci4pCisgKi8KK1BOR19JTlRFUk5BTF9DQUxMQkFDSyh2b2lkLHBuZ19zYWZlX2Vycm9yLChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2NvbnN0X2NoYXJwIGVycm9yX21lc3NhZ2UpLFBOR19OT1JFVFVSTik7CisKKyNpZmRlZiBQTkdfV0FSTklOR1NfU1VQUE9SVEVECitQTkdfSU5URVJOQUxfQ0FMTEJBQ0sodm9pZCxwbmdfc2FmZV93YXJuaW5nLChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2NvbnN0X2NoYXJwIHdhcm5pbmdfbWVzc2FnZSksUE5HX0VNUFRZKTsKKyNlbHNlCisjICBkZWZpbmUgcG5nX3NhZmVfd2FybmluZyAwLypkdW1teSBhcmd1bWVudCovCisjZW5kaWYKKworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfc2FmZV9leGVjdXRlLChwbmdfaW1hZ2VwIGltYWdlLAorICAgaW50ICgqZnVuY3Rpb24pKHBuZ192b2lkcCksIHBuZ192b2lkcCBhcmcpLFBOR19FTVBUWSk7CisKKy8qIFV0aWxpdHkgdG8gbG9nIGFuIGVycm9yOyB0aGlzIGFsc28gY2xlYW5zIHVwIHRoZSBwbmdfaW1hZ2U7IHRoZSBmdW5jdGlvbgorICogYWx3YXlzIHJldHVybnMgMCAoZmFsc2UpLgorICovCitQTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ19pbWFnZV9lcnJvciwocG5nX2ltYWdlcCBpbWFnZSwKKyAgIHBuZ19jb25zdF9jaGFycCBlcnJvcl9tZXNzYWdlKSxQTkdfRU1QVFkpOworCisjaWZuZGVmIFBOR19TSU1QTElGSUVEX1JFQURfU1VQUE9SVEVECisvKiBwbmdfaW1hZ2VfZnJlZSBpcyB1c2VkIGJ5IHRoZSB3cml0ZSBjb2RlIGJ1dCBub3QgZXhwb3J0ZWQgKi8KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLCBwbmdfaW1hZ2VfZnJlZSwgKHBuZ19pbWFnZXAgaW1hZ2UpLCBQTkdfRU1QVFkpOworI2VuZGlmIC8qICFTSU1QTElGSUVEX1JFQUQgKi8KKworI2VuZGlmIC8qIFNJTVBMSUZJRUQgUkVBRC9XUklURSAqLworCisvKiBUaGVzZSBhcmUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIGZvciBoYXJkd2FyZSBzcGVjaWZpYyBQTkcgZmlsdGVyCisgKiBvcHRpbWl6YXRpb25zOyBsaXN0IHRoZXNlIGhlcmUgdGhlbiBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIG9uZSBhdCBjb21waWxlCisgKiB0aW1lIHVzaW5nIHRoZSBtYWNybyBQTkdfRklMVEVSX09QVElNSVpBVElPTlMuICBJZiB0aGUgbWFjcm8gaXMgbm90IGRlZmluZWQKKyAqIHRoZSBnZW5lcmljIGNvZGUgaXMgdXNlZC4KKyAqLworI2lmZGVmIFBOR19GSUxURVJfT1BUSU1JWkFUSU9OUworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQsIFBOR19GSUxURVJfT1BUSU1JWkFUSU9OUywgKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICB1bnNpZ25lZCBpbnQgYnBwKSwgUE5HX0VNUFRZKTsKKyAgIC8qIEp1c3QgZGVjbGFyZSB0aGUgb3B0aW1pemF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkICovCisjZWxzZQorICAgLyogTGlzdCAqYWxsKiB0aGUgcG9zc2libGUgb3B0aW1pemF0aW9ucyBoZXJlIC0gdGhpcyBicmFuY2ggaXMgcmVxdWlyZWQgaWYKKyAgICAqIHRoZSBidWlsZGVyIG9mIGxpYnBuZyBwYXNzZXMgdGhlIGRlZmluaXRpb24gb2YgUE5HX0ZJTFRFUl9PUFRJTUlaQVRJT05TIGluCisgICAgKiBDRkxBR1MgaW4gcGxhY2Ugb2YgQ1BQRkxBR1MgKmFuZCogdXNlcyBzeW1ib2wgcHJlZml4aW5nLgorICAgICovCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCwgcG5nX2luaXRfZmlsdGVyX2Z1bmN0aW9uc19uZW9uLAorICAgKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHVuc2lnbmVkIGludCBicHApLCBQTkdfRU1QVFkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfSU5ERVhfU1VQUE9SVEVECitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCwgcG5nX3NlZWtfZGF0YSwgKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfdWludF8zMiBsZW5ndGgpLCBQTkdfRU1QVFkpOworUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCwgcG5nX29wdF9jcmNfZmluaXNoLChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgIHBuZ191aW50XzMyIHNraXApLCBQTkdfRU1QVFkpOworI2VuZGlmCisKKy8qIE1haW50YWluZXI6IFB1dCBuZXcgcHJpdmF0ZSBwcm90b3R5cGVzIGhlcmUgXiAqLworCisjaW5jbHVkZSAicG5nZGVidWcuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFBOR19WRVJTSU9OX0lORk9fT05MWSAqLworI2VuZGlmIC8qIFBOR1BSSVZfSCAqLwpkaWZmIC0tZ2l0IGEvbGlicG5nL3BuZ3JlYWQuYyBiL2xpYnBuZy9wbmdyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY5OTYwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9wbmdyZWFkLmMKQEAgLTAsMCArMSw0MzA3IEBACisKKy8qIHBuZ3JlYWQuYyAtIHJlYWQgYSBQTkcgZmlsZQorICoKKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS42LjE3IFtNYXJjaCAyNiwgMjAxNV0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDE1IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCisgKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRoYXQgYW4gYXBwbGljYXRpb24gY2FsbHMgZGlyZWN0bHkgdG8KKyAqIHJlYWQgYSBQTkcgZmlsZSBvciBzdHJlYW0uCisgKi8KKworI2luY2x1ZGUgInBuZ3ByaXYuaCIKKyNpZiBkZWZpbmVkKFBOR19TSU1QTElGSUVEX1JFQURfU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19TVERJT19TVVBQT1JURUQpCisjICBpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKKworLyogQ3JlYXRlIGEgUE5HIHN0cnVjdHVyZSBmb3IgcmVhZGluZywgYW5kIGFsbG9jYXRlIGFueSBtZW1vcnkgbmVlZGVkLiAqLworUE5HX0ZVTkNUSU9OKHBuZ19zdHJ1Y3RwLFBOR0FQSQorcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCwocG5nX2NvbnN0X2NoYXJwIHVzZXJfcG5nX3ZlciwgcG5nX3ZvaWRwIGVycm9yX3B0ciwKKyAgICBwbmdfZXJyb3JfcHRyIGVycm9yX2ZuLCBwbmdfZXJyb3JfcHRyIHdhcm5fZm4pLFBOR19BTExPQ0FURUQpCit7CisjaWZuZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKKyAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3BuZ19zdHJ1Y3QodXNlcl9wbmdfdmVyLCBlcnJvcl9wdHIsCisgICAgICBlcnJvcl9mbiwgd2Fybl9mbiwgTlVMTCwgTlVMTCwgTlVMTCk7CisjZWxzZQorICAgcmV0dXJuIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3RfMih1c2VyX3BuZ192ZXIsIGVycm9yX3B0ciwgZXJyb3JfZm4sCisgICAgICAgd2Fybl9mbiwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKKy8qIEFsdGVybmF0ZSBjcmVhdGUgUE5HIHN0cnVjdHVyZSBmb3IgcmVhZGluZywgYW5kIGFsbG9jYXRlIGFueSBtZW1vcnkKKyAqIG5lZWRlZC4KKyAqLworUE5HX0ZVTkNUSU9OKHBuZ19zdHJ1Y3RwLFBOR0FQSQorcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yLChwbmdfY29uc3RfY2hhcnAgdXNlcl9wbmdfdmVyLCBwbmdfdm9pZHAgZXJyb3JfcHRyLAorICAgIHBuZ19lcnJvcl9wdHIgZXJyb3JfZm4sIHBuZ19lcnJvcl9wdHIgd2Fybl9mbiwgcG5nX3ZvaWRwIG1lbV9wdHIsCisgICAgcG5nX21hbGxvY19wdHIgbWFsbG9jX2ZuLCBwbmdfZnJlZV9wdHIgZnJlZV9mbiksUE5HX0FMTE9DQVRFRCkKK3sKKyAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3BuZ19zdHJ1Y3QodXNlcl9wbmdfdmVyLCBlcnJvcl9wdHIsCisgICAgICBlcnJvcl9mbiwgd2Fybl9mbiwgbWVtX3B0ciwgbWFsbG9jX2ZuLCBmcmVlX2ZuKTsKKyNlbmRpZiAvKiBVU0VSX01FTSAqLworCisgICBpZiAocG5nX3B0ciAhPSBOVUxMKQorICAgeworICAgICAgcG5nX3B0ci0+bW9kZSA9IFBOR19JU19SRUFEX1NUUlVDVDsKKworICAgICAgLyogQWRkZWQgaW4gbGlicG5nLTEuNi4wOyB0aGlzIGNhbiBiZSB1c2VkIHRvIGRldGVjdCBhIHJlYWQgc3RydWN0dXJlIGlmCisgICAgICAgKiByZXF1aXJlZCAoaXQgd2lsbCBiZSB6ZXJvIGluIGEgd3JpdGUgc3RydWN0dXJlLikKKyAgICAgICAqLworIyAgICAgaWZkZWYgUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQKKyAgICAgICAgIHBuZ19wdHItPklEQVRfcmVhZF9zaXplID0gUE5HX0lEQVRfUkVBRF9TSVpFOworIyAgICAgZW5kaWYKKworIyAgICAgaWZkZWYgUE5HX0JFTklHTl9SRUFEX0VSUk9SU19TVVBQT1JURUQKKyAgICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX0JFTklHTl9FUlJPUlNfV0FSTjsKKworICAgICAgICAgLyogSW4gc3RhYmxlIGJ1aWxkcyBvbmx5IHdhcm4gaWYgYW4gYXBwbGljYXRpb24gZXJyb3IgY2FuIGJlIGNvbXBsZXRlbHkKKyAgICAgICAgICAqIGhhbmRsZWQuCisgICAgICAgICAgKi8KKyMgICAgICAgIGlmIFBOR19SRUxFQVNFX0JVSUxECisgICAgICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19BUFBfV0FSTklOR1NfV0FSTjsKKyMgICAgICAgIGVuZGlmCisjICAgICBlbmRpZgorCisgICAgICAvKiBUT0RPOiBkZWxheSB0aGlzLCBpdCBjYW4gYmUgZG9uZSBpbiBwbmdfaW5pdF9pbyAoaWYgdGhlIGFwcCBkb2Vzbid0CisgICAgICAgKiBkbyBpdCBpdHNlbGYpIGF2b2lkaW5nIHNldHRpbmcgdGhlIGRlZmF1bHQgZnVuY3Rpb24gaWYgaXQgaXMgbm90CisgICAgICAgKiByZXF1aXJlZC4KKyAgICAgICAqLworICAgICAgcG5nX3NldF9yZWFkX2ZuKHBuZ19wdHIsIE5VTEwsIE5VTEwpOworCisjaWZkZWYgUE5HX0lOREVYX1NVUFBPUlRFRAorICAgICAgcG5nX3B0ci0+aW5kZXggPSBOVUxMOworI2VuZGlmCisgICB9CisKKyAgIHJldHVybiBwbmdfcHRyOworfQorCisKKyNpZmRlZiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRAorLyogUmVhZCB0aGUgaW5mb3JtYXRpb24gYmVmb3JlIHRoZSBhY3R1YWwgaW1hZ2UgZGF0YS4gIFRoaXMgaGFzIGJlZW4KKyAqIGNoYW5nZWQgaW4gdjAuOTAgdG8gYWxsb3cgcmVhZGluZyBhIGZpbGUgdGhhdCBhbHJlYWR5IGhhcyB0aGUgbWFnaWMKKyAqIGJ5dGVzIHJlYWQgZnJvbSB0aGUgc3RyZWFtLiAgWW91IGNhbiB0ZWxsIGxpYnBuZyBob3cgbWFueSBieXRlcyBoYXZlCisgKiBiZWVuIHJlYWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0gKHVwIHRvIHRoZSBtYXhpbXVtIG9mIDgpCisgKiB2aWEgcG5nX3NldF9zaWdfYnl0ZXMoKSwgYW5kIHdlIHdpbGwgb25seSBjaGVjayB0aGUgcmVtYWluaW5nIGJ5dGVzCisgKiBoZXJlLiAgVGhlIGFwcGxpY2F0aW9uIGNhbiB0aGVuIGhhdmUgYWNjZXNzIHRvIHRoZSBzaWduYXR1cmUgYnl0ZXMgd2UKKyAqIHJlYWQgaWYgaXQgaXMgZGV0ZXJtaW5lZCB0aGF0IHRoaXMgaXNuJ3QgYSB2YWxpZCBQTkcgZmlsZS4KKyAqLwordm9pZCBQTkdBUEkKK3BuZ19yZWFkX2luZm8ocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIpCit7CisjaWZkZWYgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRAorICAgaW50IGtlZXA7CisjZW5kaWYKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfcmVhZF9pbmZvIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgLyogUmVhZCBhbmQgY2hlY2sgdGhlIFBORyBmaWxlIHNpZ25hdHVyZS4gKi8KKyAgIHBuZ19yZWFkX3NpZyhwbmdfcHRyLCBpbmZvX3B0cik7CisKKyAgIGZvciAoOzspCisgICB7CisgICAgICBwbmdfdWludF8zMiBsZW5ndGggPSBwbmdfcmVhZF9jaHVua19oZWFkZXIocG5nX3B0cik7CisgICAgICBwbmdfdWludF8zMiBjaHVua19uYW1lID0gcG5nX3B0ci0+Y2h1bmtfbmFtZTsKKworICAgICAgLyogSURBVCBsb2dpYyBuZWVkcyB0byBoYXBwZW4gaGVyZSB0byBzaW1wbGlmeSBnZXR0aW5nIHRoZSB0d28gZmxhZ3MKKyAgICAgICAqIHJpZ2h0LgorICAgICAgICovCisgICAgICBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfSURBVCkKKyAgICAgIHsKKyAgICAgICAgIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpID09IDApCisgICAgICAgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgSUhEUiBiZWZvcmUgSURBVCIpOworCisgICAgICAgICBlbHNlIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgJiYKKyAgICAgICAgICAgICAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX1BMVEUpID09IDApCisgICAgICAgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgUExURSBiZWZvcmUgSURBVCIpOworCisgICAgICAgICBlbHNlIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19BRlRFUl9JREFUKSAhPSAwKQorICAgICAgICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiVG9vIG1hbnkgSURBVHMgZm91bmQiKTsKKworICAgICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfSEFWRV9JREFUOworICAgICAgfQorCisgICAgICBlbHNlIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpICE9IDApCisgICAgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19BRlRFUl9JREFUOworCisgICAgICAvKiBUaGlzIHNob3VsZCBiZSBhIGJpbmFyeSBzdWJkaXZpc2lvbiBzZWFyY2ggb3IgYSBoYXNoIGZvcgorICAgICAgICogbWF0Y2hpbmcgdGhlIGNodW5rIG5hbWUgcmF0aGVyIHRoYW4gYSBsaW5lYXIgc2VhcmNoLgorICAgICAgICovCisgICAgICBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfSUhEUikKKyAgICAgICAgIHBuZ19oYW5kbGVfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKKworICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfSUVORCkKKyAgICAgICAgIHBuZ19oYW5kbGVfSUVORChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKKworI2lmZGVmIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQKKyAgICAgIGVsc2UgaWYgKChrZWVwID0gcG5nX2NodW5rX3Vua25vd25faGFuZGxpbmcocG5nX3B0ciwgY2h1bmtfbmFtZSkpICE9IDApCisgICAgICB7CisgICAgICAgICBwbmdfaGFuZGxlX3Vua25vd24ocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCwga2VlcCk7CisKKyAgICAgICAgIGlmIChjaHVua19uYW1lID09IHBuZ19QTFRFKQorICAgICAgICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfSEFWRV9QTFRFOworCisgICAgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19JREFUKQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX3B0ci0+aWRhdF9zaXplID0gMDsgLyogSXQgaGFzIGJlZW4gY29uc3VtZWQgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19QTFRFKQorICAgICAgICAgcG5nX2hhbmRsZV9QTFRFKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOworCisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19JREFUKQorICAgICAgeworICAgICAgICAgcG5nX3B0ci0+aWRhdF9zaXplID0gbGVuZ3RoOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyNpZmRlZiBQTkdfUkVBRF9iS0dEX1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfYktHRCkKKyAgICAgICAgIHBuZ19oYW5kbGVfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfY0hSTV9TVVBQT1JURUQKKyAgICAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX2NIUk0pCisgICAgICAgICBwbmdfaGFuZGxlX2NIUk0ocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX2dBTUFfU1VQUE9SVEVECisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19nQU1BKQorICAgICAgICAgcG5nX2hhbmRsZV9nQU1BKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9oSVNUX1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfaElTVCkKKyAgICAgICAgIHBuZ19oYW5kbGVfaElTVChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfb0ZGc19TVVBQT1JURUQKKyAgICAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX29GRnMpCisgICAgICAgICBwbmdfaGFuZGxlX29GRnMocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX3BDQUxfU1VQUE9SVEVECisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19wQ0FMKQorICAgICAgICAgcG5nX2hhbmRsZV9wQ0FMKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9zQ0FMX1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfc0NBTCkKKyAgICAgICAgIHBuZ19oYW5kbGVfc0NBTChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfcEhZc19TVVBQT1JURUQKKyAgICAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX3BIWXMpCisgICAgICAgICBwbmdfaGFuZGxlX3BIWXMocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX3NCSVRfU1VQUE9SVEVECisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19zQklUKQorICAgICAgICAgcG5nX2hhbmRsZV9zQklUKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfc1JHQikKKyAgICAgICAgIHBuZ19oYW5kbGVfc1JHQihwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfaUNDUF9TVVBQT1JURUQKKyAgICAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX2lDQ1ApCisgICAgICAgICBwbmdfaGFuZGxlX2lDQ1AocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX3NQTFRfU1VQUE9SVEVECisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19zUExUKQorICAgICAgICAgcG5nX2hhbmRsZV9zUExUKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF90RVh0X1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfdEVYdCkKKyAgICAgICAgIHBuZ19oYW5kbGVfdEVYdChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfdElNRV9TVVBQT1JURUQKKyAgICAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX3RJTUUpCisgICAgICAgICBwbmdfaGFuZGxlX3RJTUUocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX3RSTlNfU1VQUE9SVEVECisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ190Uk5TKQorICAgICAgICAgcG5nX2hhbmRsZV90Uk5TKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF96VFh0X1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfelRYdCkKKyAgICAgICAgIHBuZ19oYW5kbGVfelRYdChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfaVRYdF9TVVBQT1JURUQKKyAgICAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX2lUWHQpCisgICAgICAgICBwbmdfaGFuZGxlX2lUWHQocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisjZW5kaWYKKworICAgICAgZWxzZQorICAgICAgICAgcG5nX2hhbmRsZV91bmtub3duKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgsCisgICAgICAgICAgICBQTkdfSEFORExFX0NIVU5LX0FTX0RFRkFVTFQpOworICAgfQorfQorI2VuZGlmIC8qIFNFUVVFTlRJQUxfUkVBRCAqLworCisvKiBPcHRpb25hbCBjYWxsIHRvIHVwZGF0ZSB0aGUgdXNlcnMgaW5mb19wdHIgc3RydWN0dXJlICovCit2b2lkIFBOR0FQSQorcG5nX3JlYWRfdXBkYXRlX2luZm8ocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19yZWFkX3VwZGF0ZV9pbmZvIik7CisKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwpCisgICB7CisjaWZkZWYgUE5HX0lOREVYX1NVUFBPUlRFRAorICAgICAgaWYgKHBuZ19wdHItPmluZGV4KSB7CisgICAgICAgICBwbmdfcmVhZF9zdGFydF9yb3cocG5nX3B0cik7CisgICAgICB9CisjZW5kaWYKKyAgICAgIGlmICgocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19ST1dfSU5JVCkgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19yZWFkX3N0YXJ0X3JvdyhwbmdfcHRyKTsKKworIyAgICAgICAgaWZkZWYgUE5HX1JFQURfVFJBTlNGT1JNU19TVVBQT1JURUQKKyAgICAgICAgICAgIHBuZ19yZWFkX3RyYW5zZm9ybV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKKyMgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFBOR19VTlVTRUQoaW5mb19wdHIpCisjICAgICAgICBlbmRpZgorICAgICAgfQorI2lmbmRlZiBQTkdfSU5ERVhfU1VQUE9SVEVECisgICAgICAvKiBOZXcgaW4gMS42LjAgdGhpcyBhdm9pZHMgdGhlIGJ1ZyBvZiBkb2luZyB0aGUgaW5pdGlhbGl6YXRpb25zIHR3aWNlICovCisgICAgICBlbHNlCisgICAgICAgICBwbmdfYXBwX2Vycm9yKHBuZ19wdHIsCisgICAgICAgICAgICAicG5nX3JlYWRfdXBkYXRlX2luZm8vcG5nX3N0YXJ0X3JlYWRfaW1hZ2U6IGR1cGxpY2F0ZSBjYWxsIik7CisjZW5kaWYKKyAgIH0KK30KKworI2lmZGVmIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVECisvKiBJbml0aWFsaXplIHBhbGV0dGUsIGJhY2tncm91bmQsIGV0YywgYWZ0ZXIgdHJhbnNmb3JtYXRpb25zCisgKiBhcmUgc2V0LCBidXQgYmVmb3JlIGFueSByZWFkaW5nIHRha2VzIHBsYWNlLiAgVGhpcyBhbGxvd3MKKyAqIHRoZSB1c2VyIHRvIG9idGFpbiBhIGdhbW1hLWNvcnJlY3RlZCBwYWxldHRlLCBmb3IgZXhhbXBsZS4KKyAqIElmIHRoZSB1c2VyIGRvZXNuJ3QgY2FsbCB0aGlzLCB3ZSB3aWxsIGRvIGl0IG91cnNlbHZlcy4KKyAqLwordm9pZCBQTkdBUEkKK3BuZ19zdGFydF9yZWFkX2ltYWdlKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc3RhcnRfcmVhZF9pbWFnZSIpOworCisgICBpZiAocG5nX3B0ciAhPSBOVUxMKQorICAgeworICAgICAgaWYgKChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX1JPV19JTklUKSA9PSAwKQorICAgICAgICAgcG5nX3JlYWRfc3RhcnRfcm93KHBuZ19wdHIpOworCisgICAgICAvKiBOZXcgaW4gMS42LjAgdGhpcyBhdm9pZHMgdGhlIGJ1ZyBvZiBkb2luZyB0aGUgaW5pdGlhbGl6YXRpb25zIHR3aWNlICovCisgICAgICBlbHNlCisgICAgICAgICBwbmdfYXBwX2Vycm9yKHBuZ19wdHIsCisgICAgICAgICAgICAicG5nX3N0YXJ0X3JlYWRfaW1hZ2UvcG5nX3JlYWRfdXBkYXRlX2luZm86IGR1cGxpY2F0ZSBjYWxsIik7CisgICB9Cit9CisjZW5kaWYgLyogU0VRVUVOVElBTF9SRUFEICovCisKKyNpZmRlZiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRAorI2lmZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVECisvKiBVbmRvZXMgaW50cmFwaXhlbCBkaWZmZXJlbmNpbmcsCisgKiBOT1RFOiB0aGlzIGlzIGFwcGFyZW50bHkgb25seSBzdXBwb3J0ZWQgaW4gdGhlICdzZXF1ZW50aWFsJyByZWFkZXIuCisgKi8KK3N0YXRpYyB2b2lkCitwbmdfZG9fcmVhZF9pbnRyYXBpeGVsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3cpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19yZWFkX2ludHJhcGl4ZWwiKTsKKworICAgaWYgKAorICAgICAgIChyb3dfaW5mby0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKSAhPSAwKQorICAgeworICAgICAgaW50IGJ5dGVzX3Blcl9waXhlbDsKKyAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKKworICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19ieXRlcCBycDsKKyAgICAgICAgIHBuZ191aW50XzMyIGk7CisKKyAgICAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpCisgICAgICAgICAgICBieXRlc19wZXJfcGl4ZWwgPSAzOworCisgICAgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCisgICAgICAgICAgICBieXRlc19wZXJfcGl4ZWwgPSA0OworCisgICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgIGZvciAoaSA9IDAsIHJwID0gcm93OyBpIDwgcm93X3dpZHRoOyBpKyssIHJwICs9IGJ5dGVzX3Blcl9waXhlbCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgICoocnApID0gKHBuZ19ieXRlKSgoMjU2ICsgKnJwICsgKihycCArIDEpKSAmIDB4ZmYpOworICAgICAgICAgICAgKihycCsyKSA9IChwbmdfYnl0ZSkoKDI1NiArICoocnAgKyAyKSArICoocnAgKyAxKSkgJiAweGZmKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpCisgICAgICB7CisgICAgICAgICBwbmdfYnl0ZXAgcnA7CisgICAgICAgICBwbmdfdWludF8zMiBpOworCisgICAgICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQorICAgICAgICAgICAgYnl0ZXNfcGVyX3BpeGVsID0gNjsKKworICAgICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQorICAgICAgICAgICAgYnl0ZXNfcGVyX3BpeGVsID0gODsKKworICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICBmb3IgKGkgPSAwLCBycCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrLCBycCArPSBieXRlc19wZXJfcGl4ZWwpCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfdWludF8zMiBzMCAgID0gKCoocnAgICAgKSA8PCA4KSB8ICoocnAgKyAxKTsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIHMxICAgPSAoKihycCArIDIpIDw8IDgpIHwgKihycCArIDMpOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgczIgICA9ICgqKHJwICsgNCkgPDwgOCkgfCAqKHJwICsgNSk7CisgICAgICAgICAgICBwbmdfdWludF8zMiByZWQgID0gKHMwICsgczEgKyA2NTUzNikgJiAweGZmZmY7CisgICAgICAgICAgICBwbmdfdWludF8zMiBibHVlID0gKHMyICsgczEgKyA2NTUzNikgJiAweGZmZmY7CisgICAgICAgICAgICAqKHJwICAgICkgPSAocG5nX2J5dGUpKChyZWQgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICoocnAgKyAxKSA9IChwbmdfYnl0ZSkocmVkICYgMHhmZik7CisgICAgICAgICAgICAqKHJwICsgNCkgPSAocG5nX2J5dGUpKChibHVlID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICAqKHJwICsgNSkgPSAocG5nX2J5dGUpKGJsdWUgJiAweGZmKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KK30KKyNlbmRpZiAvKiBNTkdfRkVBVFVSRVMgKi8KKwordm9pZCBQTkdBUEkKK3BuZ19yZWFkX3Jvdyhwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2J5dGVwIHJvdywgcG5nX2J5dGVwIGRzcF9yb3cpCit7CisgICBwbmdfcm93X2luZm8gcm93X2luZm87CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIHBuZ19kZWJ1ZzIoMSwgImluIHBuZ19yZWFkX3JvdyAocm93ICVsdSwgcGFzcyAlZCkiLAorICAgICAgICh1bnNpZ25lZCBsb25nKXBuZ19wdHItPnJvd19udW1iZXIsIHBuZ19wdHItPnBhc3MpOworCisgICAvKiBwbmdfcmVhZF9zdGFydF9yb3cgc2V0cyB0aGUgaW5mb3JtYXRpb24gKGluIHBhcnRpY3VsYXIgaXdpZHRoKSBmb3IgdGhpcworICAgICogaW50ZXJsYWNlIHBhc3MuCisgICAgKi8KKyAgIGlmICgocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19ST1dfSU5JVCkgPT0gMCkKKyAgICAgIHBuZ19yZWFkX3N0YXJ0X3JvdyhwbmdfcHRyKTsKKworICAgLyogMS41LjY6IHJvd19pbmZvIG1vdmVkIG91dCBvZiBwbmdfc3RydWN0IHRvIGEgbG9jYWwgaGVyZS4gKi8KKyAgIHJvd19pbmZvLndpZHRoID0gcG5nX3B0ci0+aXdpZHRoOyAvKiBOT1RFOiB3aWR0aCBvZiBjdXJyZW50IGludGVybGFjZWQgcm93ICovCisgICByb3dfaW5mby5jb2xvcl90eXBlID0gcG5nX3B0ci0+Y29sb3JfdHlwZTsKKyAgIHJvd19pbmZvLmJpdF9kZXB0aCA9IHBuZ19wdHItPmJpdF9kZXB0aDsKKyAgIHJvd19pbmZvLmNoYW5uZWxzID0gcG5nX3B0ci0+Y2hhbm5lbHM7CisgICByb3dfaW5mby5waXhlbF9kZXB0aCA9IHBuZ19wdHItPnBpeGVsX2RlcHRoOworICAgcm93X2luZm8ucm93Ynl0ZXMgPSBQTkdfUk9XQllURVMocm93X2luZm8ucGl4ZWxfZGVwdGgsIHJvd19pbmZvLndpZHRoKTsKKworI2lmZGVmIFBOR19XQVJOSU5HU19TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT5yb3dfbnVtYmVyID09IDAgJiYgcG5nX3B0ci0+cGFzcyA9PSAwKQorICAgeworICAgLyogQ2hlY2sgZm9yIHRyYW5zZm9ybXMgdGhhdCBoYXZlIGJlZW4gc2V0IGJ1dCB3ZXJlIGRlZmluZWQgb3V0ICovCisjaWYgZGVmaW5lZChQTkdfV1JJVEVfSU5WRVJUX1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoUE5HX1JFQURfSU5WRVJUX1NVUFBPUlRFRCkKKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVkVSVF9NT05PKSAhPSAwKQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlBOR19SRUFEX0lOVkVSVF9TVVBQT1JURUQgaXMgbm90IGRlZmluZWQiKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfV1JJVEVfRklMTEVSX1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRCkKKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0ZJTExFUikgIT0gMCkKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkIik7CisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX1dSSVRFX1BBQ0tTV0FQX1NVUFBPUlRFRCkgJiYgXAorICAgICFkZWZpbmVkKFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRCkKKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1BBQ0tTV0FQKSAhPSAwKQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRCBpcyBub3QgZGVmaW5lZCIpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19XUklURV9QQUNLX1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoUE5HX1JFQURfUEFDS19TVVBQT1JURUQpCisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLKSAhPSAwKQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlBOR19SRUFEX1BBQ0tfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkIik7CisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX1dSSVRFX1NISUZUX1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoUE5HX1JFQURfU0hJRlRfU1VQUE9SVEVEKQorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfU0hJRlQpICE9IDApCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiUE5HX1JFQURfU0hJRlRfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkIik7CisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX1dSSVRFX0JHUl9TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19SRUFEX0JHUl9TVVBQT1JURUQpCisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19CR1IpICE9IDApCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiUE5HX1JFQURfQkdSX1NVUFBPUlRFRCBpcyBub3QgZGVmaW5lZCIpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19XUklURV9TV0FQX1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoUE5HX1JFQURfU1dBUF9TVVBQT1JURUQpCisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19TV0FQX0JZVEVTKSAhPSAwKQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlBOR19SRUFEX1NXQVBfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkIik7CisjZW5kaWYKKyAgIH0KKyNlbmRpZiAvKiBXQVJOSU5HUyAqLworCisjaWZkZWYgUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVECisgICAvKiBJZiBpbnRlcmxhY2VkIGFuZCB3ZSBkbyBub3QgbmVlZCBhIG5ldyByb3csIGNvbWJpbmUgcm93IGFuZCByZXR1cm4uCisgICAgKiBOb3RpY2UgdGhhdCB0aGUgcGl4ZWxzIHdlIGhhdmUgZnJvbSBwcmV2aW91cyByb3dzIGhhdmUgYmVlbiB0cmFuc2Zvcm1lZAorICAgICogYWxyZWFkeTsgd2UgY2FuIG9ubHkgY29tYmluZSBsaWtlIHdpdGggbGlrZSAodHJhbnNmb3JtZWQgb3IKKyAgICAqIHVudHJhbnNmb3JtZWQpIGFuZCwgYmVjYXVzZSBvZiB0aGUgbGlicG5nIEFQSSBmb3IgaW50ZXJsYWNlZCBpbWFnZXMsIHRoaXMKKyAgICAqIG1lYW5zIHdlIG11c3QgdHJhbnNmb3JtIGJlZm9yZSBkZS1pbnRlcmxhY2luZy4KKyAgICAqLworICAgaWYgKHBuZ19wdHItPmludGVybGFjZWQgIT0gMCAmJgorICAgICAgIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5URVJMQUNFKSAhPSAwKQorICAgeworICAgICAgc3dpdGNoIChwbmdfcHRyLT5wYXNzKQorICAgICAgeworICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgaWYgKHBuZ19wdHItPnJvd19udW1iZXIgJiAweDA3KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKGRzcF9yb3cgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgIHBuZ19jb21iaW5lX3JvdyhwbmdfcHRyLCBkc3Bfcm93LCAxLypkaXNwbGF5Ki8pOworICAgICAgICAgICAgICAgcG5nX3JlYWRfZmluaXNoX3JvdyhwbmdfcHRyKTsKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBpZiAoKHBuZ19wdHItPnJvd19udW1iZXIgJiAweDA3KSB8fCBwbmdfcHRyLT53aWR0aCA8IDUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZiAoZHNwX3JvdyAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgcG5nX2NvbWJpbmVfcm93KHBuZ19wdHIsIGRzcF9yb3csIDEvKmRpc3BsYXkqLyk7CisKKyAgICAgICAgICAgICAgIHBuZ19yZWFkX2ZpbmlzaF9yb3cocG5nX3B0cik7CisgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMHgwNykgIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmIChkc3Bfcm93ICE9IE5VTEwgJiYgKHBuZ19wdHItPnJvd19udW1iZXIgJiA0KSkKKyAgICAgICAgICAgICAgICAgIHBuZ19jb21iaW5lX3JvdyhwbmdfcHRyLCBkc3Bfcm93LCAxLypkaXNwbGF5Ki8pOworCisgICAgICAgICAgICAgICBwbmdfcmVhZF9maW5pc2hfcm93KHBuZ19wdHIpOworICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGlmICgocG5nX3B0ci0+cm93X251bWJlciAmIDMpIHx8IHBuZ19wdHItPndpZHRoIDwgMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmIChkc3Bfcm93ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICBwbmdfY29tYmluZV9yb3cocG5nX3B0ciwgZHNwX3JvdywgMS8qZGlzcGxheSovKTsKKworICAgICAgICAgICAgICAgcG5nX3JlYWRfZmluaXNoX3JvdyhwbmdfcHRyKTsKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBpZiAoKHBuZ19wdHItPnJvd19udW1iZXIgJiAzKSAhPSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKGRzcF9yb3cgIT0gTlVMTCAmJiAocG5nX3B0ci0+cm93X251bWJlciAmIDIpKQorICAgICAgICAgICAgICAgICAgcG5nX2NvbWJpbmVfcm93KHBuZ19wdHIsIGRzcF9yb3csIDEvKmRpc3BsYXkqLyk7CisKKyAgICAgICAgICAgICAgIHBuZ19yZWFkX2ZpbmlzaF9yb3cocG5nX3B0cik7CisgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMSkgfHwgcG5nX3B0ci0+d2lkdGggPCAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKGRzcF9yb3cgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgIHBuZ19jb21iaW5lX3JvdyhwbmdfcHRyLCBkc3Bfcm93LCAxLypkaXNwbGF5Ki8pOworCisgICAgICAgICAgICAgICBwbmdfcmVhZF9maW5pc2hfcm93KHBuZ19wdHIpOworICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBpZiAoKHBuZ19wdHItPnJvd19udW1iZXIgJiAxKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX3JlYWRfZmluaXNoX3JvdyhwbmdfcHRyKTsKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgfQorI2VuZGlmCisKKyAgIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpID09IDApCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgYXR0ZW1wdCB0byByZWFkIHJvdyBkYXRhIik7CisKKyAgIC8qIEZpbGwgdGhlIHJvdyB3aXRoIElEQVQgZGF0YTogKi8KKyAgIHBuZ19yZWFkX0lEQVRfZGF0YShwbmdfcHRyLCBwbmdfcHRyLT5yb3dfYnVmLCByb3dfaW5mby5yb3dieXRlcyArIDEpOworCisgICBpZiAocG5nX3B0ci0+cm93X2J1ZlswXSA+IFBOR19GSUxURVJfVkFMVUVfTk9ORSkKKyAgIHsKKyAgICAgIGlmIChwbmdfcHRyLT5yb3dfYnVmWzBdIDwgUE5HX0ZJTFRFUl9WQUxVRV9MQVNUKQorICAgICAgICAgcG5nX3JlYWRfZmlsdGVyX3JvdyhwbmdfcHRyLCAmcm93X2luZm8sIHBuZ19wdHItPnJvd19idWYgKyAxLAorICAgICAgICAgICAgcG5nX3B0ci0+cHJldl9yb3cgKyAxLCBwbmdfcHRyLT5yb3dfYnVmWzBdKTsKKyAgICAgIGVsc2UKKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiYmFkIGFkYXB0aXZlIGZpbHRlciB2YWx1ZSIpOworICAgfQorCisgICAvKiBsaWJwbmcgMS41LjY6IHRoZSBmb2xsb3dpbmcgbGluZSB3YXMgY29weWluZyBwbmdfcHRyLT5yb3dieXRlcyBiZWZvcmUKKyAgICAqIDEuNS42LCB3aGlsZSB0aGUgYnVmZmVyIHJlYWxseSBpcyB0aGlzIGJpZyBpbiBjdXJyZW50IHZlcnNpb25zIG9mIGxpYnBuZworICAgICogaXQgbWF5IG5vdCBiZSBpbiB0aGUgZnV0dXJlLCBzbyB0aGlzIHdhcyBjaGFuZ2VkIGp1c3QgdG8gY29weSB0aGUKKyAgICAqIGludGVybGFjZWQgY291bnQ6CisgICAgKi8KKyAgIG1lbWNweShwbmdfcHRyLT5wcmV2X3JvdywgcG5nX3B0ci0+cm93X2J1Ziwgcm93X2luZm8ucm93Ynl0ZXMgKyAxKTsKKworI2lmZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVECisgICBpZiAoKHBuZ19wdHItPm1uZ19mZWF0dXJlc19wZXJtaXR0ZWQgJiBQTkdfRkxBR19NTkdfRklMVEVSXzY0KSAhPSAwICYmCisgICAgICAgKHBuZ19wdHItPmZpbHRlcl90eXBlID09IFBOR19JTlRSQVBJWEVMX0RJRkZFUkVOQ0lORykpCisgICB7CisgICAgICAvKiBJbnRyYXBpeGVsIGRpZmZlcmVuY2luZyAqLworICAgICAgcG5nX2RvX3JlYWRfaW50cmFwaXhlbCgmcm93X2luZm8sIHBuZ19wdHItPnJvd19idWYgKyAxKTsKKyAgIH0KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfVFJBTlNGT1JNU19TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMpCisgICAgICBwbmdfZG9fcmVhZF90cmFuc2Zvcm1hdGlvbnMocG5nX3B0ciwgJnJvd19pbmZvKTsKKyNlbmRpZgorCisgICAvKiBUaGUgdHJhbnNmb3JtZWQgcGl4ZWwgZGVwdGggc2hvdWxkIG1hdGNoIHRoZSBkZXB0aCBub3cgaW4gcm93X2luZm8uICovCisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtZWRfcGl4ZWxfZGVwdGggPT0gMCkKKyAgIHsKKyAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWVkX3BpeGVsX2RlcHRoID0gcm93X2luZm8ucGl4ZWxfZGVwdGg7CisgICAgICBpZiAocm93X2luZm8ucGl4ZWxfZGVwdGggPiBwbmdfcHRyLT5tYXhpbXVtX3BpeGVsX2RlcHRoKQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJzZXF1ZW50aWFsIHJvdyBvdmVyZmxvdyIpOworICAgfQorCisgICBlbHNlIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1lZF9waXhlbF9kZXB0aCAhPSByb3dfaW5mby5waXhlbF9kZXB0aCkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiaW50ZXJuYWwgc2VxdWVudGlhbCByb3cgc2l6ZSBjYWxjdWxhdGlvbiBlcnJvciIpOworCisjaWZkZWYgUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVECisgICAvKiBFeHBhbmQgaW50ZXJsYWNlZCByb3dzIHRvIGZ1bGwgc2l6ZSAqLworICAgaWYgKHBuZ19wdHItPmludGVybGFjZWQgIT0gMCAmJgorICAgICAgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlRFUkxBQ0UpICE9IDApCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+cGFzcyA8IDYpCisgICAgICAgICBwbmdfZG9fcmVhZF9pbnRlcmxhY2UoJnJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwgcG5nX3B0ci0+cGFzcywKKyAgICAgICAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyk7CisKKyAgICAgIGlmIChkc3Bfcm93ICE9IE5VTEwpCisgICAgICAgICBwbmdfY29tYmluZV9yb3cocG5nX3B0ciwgZHNwX3JvdywgMS8qZGlzcGxheSovKTsKKworICAgICAgaWYgKHJvdyAhPSBOVUxMKQorICAgICAgICAgcG5nX2NvbWJpbmVfcm93KHBuZ19wdHIsIHJvdywgMC8qcm93Ki8pOworICAgfQorCisgICBlbHNlCisjZW5kaWYKKyAgIHsKKyAgICAgIGlmIChyb3cgIT0gTlVMTCkKKyAgICAgICAgIHBuZ19jb21iaW5lX3JvdyhwbmdfcHRyLCByb3csIC0xLyppZ25vcmVkKi8pOworCisgICAgICBpZiAoZHNwX3JvdyAhPSBOVUxMKQorICAgICAgICAgcG5nX2NvbWJpbmVfcm93KHBuZ19wdHIsIGRzcF9yb3csIC0xLyppZ25vcmVkKi8pOworICAgfQorICAgcG5nX3JlYWRfZmluaXNoX3JvdyhwbmdfcHRyKTsKKworICAgaWYgKHBuZ19wdHItPnJlYWRfcm93X2ZuICE9IE5VTEwpCisgICAgICAoKihwbmdfcHRyLT5yZWFkX3Jvd19mbikpKHBuZ19wdHIsIHBuZ19wdHItPnJvd19udW1iZXIsIHBuZ19wdHItPnBhc3MpOworCit9CisjZW5kaWYgLyogU0VRVUVOVElBTF9SRUFEICovCisKKyNpZmRlZiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRAorLyogUmVhZCBvbmUgb3IgbW9yZSByb3dzIG9mIGltYWdlIGRhdGEuICBJZiB0aGUgaW1hZ2UgaXMgaW50ZXJsYWNlZCwKKyAqIGFuZCBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZygpIGhhcyBiZWVuIGNhbGxlZCwgdGhlIHJvd3MgbmVlZCB0bworICogY29udGFpbiB0aGUgY29udGVudHMgb2YgdGhlIHJvd3MgZnJvbSB0aGUgcHJldmlvdXMgcGFzcy4gIElmIHRoZQorICogaW1hZ2UgaGFzIGFscGhhIG9yIHRyYW5zcGFyZW5jeSwgYW5kIHBuZ19oYW5kbGVfYWxwaGEoKVsqXSBoYXMgYmVlbgorICogY2FsbGVkLCB0aGUgcm93cyBjb250ZW50cyBtdXN0IGJlIGluaXRpYWxpemVkIHRvIHRoZSBjb250ZW50cyBvZiB0aGUKKyAqIHNjcmVlbi4KKyAqCisgKiAicm93IiBob2xkcyB0aGUgYWN0dWFsIGltYWdlLCBhbmQgcGl4ZWxzIGFyZSBwbGFjZWQgaW4gaXQKKyAqIGFzIHRoZXkgYXJyaXZlLiAgSWYgdGhlIGltYWdlIGlzIGRpc3BsYXllZCBhZnRlciBlYWNoIHBhc3MsIGl0IHdpbGwKKyAqIGFwcGVhciB0byAic3BhcmtsZSIgaW4uICAiZGlzcGxheV9yb3ciIGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgYQorICogImNodW5reSIgcHJvZ3Jlc3NpdmUgaW1hZ2UsIHdpdGggZmluZXIgZGV0YWlsIGFkZGVkIGFzIGl0IGJlY29tZXMKKyAqIGF2YWlsYWJsZS4gIElmIHlvdSBkbyBub3Qgd2FudCB0aGlzICJjaHVua3kiIGRpc3BsYXksIHlvdSBtYXkgcGFzcworICogTlVMTCBmb3IgZGlzcGxheV9yb3cuICBJZiB5b3UgZG8gbm90IHdhbnQgdGhlIHNwYXJrbGUgZGlzcGxheSwgYW5kCisgKiB5b3UgaGF2ZSBub3QgY2FsbGVkIHBuZ19oYW5kbGVfYWxwaGEoKSwgeW91IG1heSBwYXNzIE5VTEwgZm9yIHJvd3MuCisgKiBJZiB5b3UgaGF2ZSBjYWxsZWQgcG5nX2hhbmRsZV9hbHBoYSgpLCBhbmQgdGhlIGltYWdlIGhhcyBlaXRoZXIgYW4KKyAqIGFscGhhIGNoYW5uZWwgb3IgYSB0cmFuc3BhcmVuY3kgY2h1bmssIHlvdSBtdXN0IHByb3ZpZGUgYSBidWZmZXIgZm9yCisgKiByb3dzLiAgSW4gdGhpcyBjYXNlLCB5b3UgZG8gbm90IGhhdmUgdG8gcHJvdmlkZSBhIGRpc3BsYXlfcm93IGJ1ZmZlcgorICogYWxzbywgYnV0IHlvdSBtYXkuICBJZiB0aGUgaW1hZ2UgaXMgbm90IGludGVybGFjZWQsIG9yIGlmIHlvdSBoYXZlCisgKiBub3QgY2FsbGVkIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKCksIHRoZSBkaXNwbGF5X3JvdyBidWZmZXIgd2lsbAorICogYmUgaWdub3JlZCwgc28gcGFzcyBOVUxMIHRvIGl0LgorICoKKyAqIFsqXSBwbmdfaGFuZGxlX2FscGhhKCkgZG9lcyBub3QgZXhpc3QgeWV0LCBhcyBvZiB0aGlzIHZlcnNpb24gb2YgbGlicG5nCisgKi8KKwordm9pZCBQTkdBUEkKK3BuZ19yZWFkX3Jvd3MocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19ieXRlcHAgcm93LAorICAgIHBuZ19ieXRlcHAgZGlzcGxheV9yb3csIHBuZ191aW50XzMyIG51bV9yb3dzKQoreworICAgcG5nX3VpbnRfMzIgaTsKKyAgIHBuZ19ieXRlcHAgcnA7CisgICBwbmdfYnl0ZXBwIGRwOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19yZWFkX3Jvd3MiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgcnAgPSByb3c7CisgICBkcCA9IGRpc3BsYXlfcm93OworICAgaWYgKHJwICE9IE5VTEwgJiYgZHAgIT0gTlVMTCkKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcm93czsgaSsrKQorICAgICAgeworICAgICAgICAgcG5nX2J5dGVwIHJwdHIgPSAqcnArKzsKKyAgICAgICAgIHBuZ19ieXRlcCBkcHRyID0gKmRwKys7CisKKyAgICAgICAgIHBuZ19yZWFkX3JvdyhwbmdfcHRyLCBycHRyLCBkcHRyKTsKKyAgICAgIH0KKworICAgZWxzZSBpZiAocnAgIT0gTlVMTCkKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcm93czsgaSsrKQorICAgICAgeworICAgICAgICAgcG5nX2J5dGVwIHJwdHIgPSAqcnA7CisgICAgICAgICBwbmdfcmVhZF9yb3cocG5nX3B0ciwgcnB0ciwgTlVMTCk7CisgICAgICAgICBycCsrOworICAgICAgfQorCisgICBlbHNlIGlmIChkcCAhPSBOVUxMKQorICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9yb3dzOyBpKyspCisgICAgICB7CisgICAgICAgICBwbmdfYnl0ZXAgZHB0ciA9ICpkcDsKKyAgICAgICAgIHBuZ19yZWFkX3JvdyhwbmdfcHRyLCBOVUxMLCBkcHRyKTsKKyAgICAgICAgIGRwKys7CisgICAgICB9Cit9CisjZW5kaWYgLyogU0VRVUVOVElBTF9SRUFEICovCisKKyNpZmRlZiBQTkdfSU5ERVhfU1VQUE9SVEVECisjZGVmaW5lIElEQVRfSEVBREVSX1NJWkUgOAorCisvKiBTZXQgdGhlIHBuZyByZWFkIHBvc2l0aW9uIHRvIGEgbmV3IHBvc2l0aW9uIGJhc2VkIG9uIGlkYXRfcG9zaXRpb24gYW5kCisgKiBvZmZzZXQuCisgKi8KK3ZvaWQKK3BuZ19zZXRfcmVhZF9vZmZzZXQocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgICAgIHBuZ191aW50XzMyIGlkYXRfcG9zaXRpb24sIHBuZ191aW50XzMyIGJ5dGVzX2xlZnQpCit7CisgICBwbmdfc2Vla19kYXRhKHBuZ19wdHIsIGlkYXRfcG9zaXRpb24pOworICAgcG5nX3B0ci0+aWRhdF9zaXplID0gcG5nX3JlYWRfY2h1bmtfaGVhZGVyKHBuZ19wdHIpOworCisgICAvLyBXZSBuZWVkIHRvIGFkZCBiYWNrIElEQVRfSEVBREVSX1NJWkUgYmVjYXVzZSBpbiB6bGliJ3MgcGVyc3BlY3RpdmUsCisgICAvLyBJREFUX0hFQURFUiBpbiBQTkcgaXMgYWxyZWFkeSBzdHJpcHBlZCBvdXQuCisgICBwbmdfc2Vla19kYXRhKHBuZ19wdHIsIGlkYXRfcG9zaXRpb24gKyBJREFUX0hFQURFUl9TSVpFICsgcG5nX3B0ci0+aWRhdF9zaXplIC0gYnl0ZXNfbGVmdCk7CisgICBwbmdfcHRyLT5pZGF0X3NpemUgPSBieXRlc19sZWZ0OworfQorCisvKiBDb25maWd1cmUgcG5nIGRlY29kZXIgdG8gZGVjb2RlIHRoZSBwYXNzIHN0YXJ0aW5nIGZyb20gKnJvdy4KKyAqIFRoZSByZXF1ZXN0ZWQgcm93IG1heSBiZSBhZGp1c3RlZCB0byBhbGlnbiB3aXRoIGFuIGluZGV4aW5nIHJvdy4KKyAqIFRoZSBhY3R1YWwgcm93IGZvciB0aGUgZGVjb2RlciB0byBzdGFydCBpdHMgZGVjb2Rpbmcgd2lsbCBiZSByZXR1cm5lZCBpbgorICogKnJvdy4KKyAqLwordm9pZCBQTkdBUEkKK3BuZ19jb25maWd1cmVfZGVjb2Rlcihwbmdfc3RydWN0cCBwbmdfcHRyLCBpbnQgKnJvdywgaW50IHBhc3MpCit7CisgICBwbmdfaW5kZXhwIGluZGV4ID0gcG5nX3B0ci0+aW5kZXg7CisgICBpbnQgbiA9ICpyb3cgLyBpbmRleC0+c3RlcFtwYXNzXTsKKyAgIHBuZ19saW5lX2luZGV4cCBsaW5lX2luZGV4ID0gaW5kZXgtPnBhc3NfbGluZV9pbmRleFtwYXNzXVtuXTsKKworICAgLy8gQWRqdXN0IHJvdyB0byBhbiBpbmRleGluZyByb3cuCisgICAqcm93ID0gbiAqIGluZGV4LT5zdGVwW3Bhc3NdOworICAgcG5nX3B0ci0+cm93X251bWJlciA9ICpyb3c7CisKKyNpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT5pbnRlcmxhY2VkKQorICAgICAgcG5nX3NldF9pbnRlcmxhY2VkX3Bhc3MocG5nX3B0ciwgcGFzcyk7CisjZW5kaWYKKworICAgbG9uZyByb3dfYnl0ZV9sZW5ndGggPQorICAgICAgUE5HX1JPV0JZVEVTKHBuZ19wdHItPnBpeGVsX2RlcHRoLCBwbmdfcHRyLT5pd2lkdGgpICsgMTsKKworICAgaW5mbGF0ZUVuZCgmcG5nX3B0ci0+enN0cmVhbSk7CisgICBpbmZsYXRlQ29weSgmcG5nX3B0ci0+enN0cmVhbSwgbGluZV9pbmRleC0+el9zdGF0ZSk7CisKKyAgIC8vIFNldCB0aGUgcG5nIHJlYWQgcG9zaXRpb24gdG8gbGluZV9pbmRleC4KKyAgIHBuZ19zZXRfcmVhZF9vZmZzZXQocG5nX3B0ciwgbGluZV9pbmRleC0+c3RyZWFtX2lkYXRfcG9zaXRpb24sCisgICAgICAgICBsaW5lX2luZGV4LT5ieXRlc19sZWZ0X2luX2lkYXQpOworICAgbWVtY3B5KHBuZ19wdHItPnByZXZfcm93LCBsaW5lX2luZGV4LT5wcmV2X3Jvdywgcm93X2J5dGVfbGVuZ3RoKTsKKyAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPSAwOworfQorCisvKiBCdWlsZCB0aGUgbGluZSBpbmRleCBhbmQgc3RvcmUgdGhlIGluZGV4IGluIHBuZ19wdHItPmluZGV4LgorICovCit2b2lkIFBOR0FQSQorcG5nX2J1aWxkX2luZGV4KHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCit7CisgICAvLyBudW1iZXIgb2Ygcm93cyBpbiBhIDh4OCBibG9jayBmb3IgZWFjaCBpbnRlcmxhY2VkIHBhc3MuCisgICBpbnQgbnVtYmVyX3Jvd3NfaW5fcGFzc1s3XSA9IHsxLCAxLCAxLCAyLCAyLCA0LCA0fTsKKworICAgaW50IHJldDsKKyAgIHBuZ191aW50XzMyIGksIGo7CisgICBwbmdfYnl0ZXAgcnA7CisgICBpbnQgcCwgcGFzc19udW1iZXIgPSAxOworCisjaWZkZWYgUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVECisgICBwYXNzX251bWJlciA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOworI2VuZGlmCisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIHBuZ19yZWFkX3N0YXJ0X3JvdyhwbmdfcHRyKTsKKworI2lmZGVmIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAorICAgaWYgKCFwbmdfcHRyLT5pbnRlcmxhY2VkKQorI2VuZGlmCisgICB7CisgICAgICBudW1iZXJfcm93c19pbl9wYXNzWzBdID0gODsKKyAgIH0KKworICAgLy8gQWxsb2NhdGUgYSBidWZmZXIgYmlnIGVub3VnaCBmb3IgYW55IHRyYW5zZm9ybS4KKyAgIHJwID0gcG5nX21hbGxvYyhwbmdfcHRyLCBQTkdfUk9XQllURVMocG5nX3B0ci0+bWF4aW11bV9waXhlbF9kZXB0aCwgcG5nX3B0ci0+d2lkdGgpKTsKKworICAgcG5nX2luZGV4cCBpbmRleCA9IHBuZ19tYWxsb2MocG5nX3B0ciwgc2l6ZW9mKHBuZ19pbmRleCkpOworICAgcG5nX3B0ci0+aW5kZXggPSBpbmRleDsKKworICAgaW5kZXgtPnN0cmVhbV9pZGF0X3Bvc2l0aW9uID0gcG5nX3B0ci0+dG90YWxfZGF0YV9yZWFkIC0gSURBVF9IRUFERVJfU0laRTsKKworICAgLy8gU2V0IHRoZSBkZWZhdWx0IHNpemUgb2YgaW5kZXggaW4gZWFjaCBwYXNzIHRvIDAsCisgICAvLyBzbyB0aGF0IHdlIGNhbiBmcmVlIGluZGV4IGNvcnJlY3RseSBpbiBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdC4KKyAgIGZvciAocCA9IDA7IHAgPCA3OyBwKyspCisgICAgICBpbmRleC0+c2l6ZVtwXSA9IDA7CisKKyAgIGZvciAocCA9IDA7IHAgPCBwYXNzX251bWJlcjsgcCsrKQorICAgeworICAgICAgLy8gV2UgYWRqdXN0IHRoZSBpbmRleCBzdGVwIGluIGVhY2ggcGFzcyB0byBtYWtlIHN1cmUgZWFjaCBwYXNzCisgICAgICAvLyBoYXMgcm91Z2hseSB0aGUgc2FtZSBzaXplIG9mIGluZGV4LgorICAgICAgLy8gVGhpcyB3YXksIHdlIHdvbid0IGNvbnN1bWUgdG8gbXVjaCBtZW1vcnkgaW4gcmVjb3JkaW5nIGluZGV4LgorICAgICAgaW5kZXgtPnN0ZXBbcF0gPSBJTkRFWF9TQU1QTEVfU0laRSAqICg4IC8gbnVtYmVyX3Jvd3NfaW5fcGFzc1twXSk7CisgICAgICBjb25zdCBwbmdfdWludF8zMiB0ZW1wX3NpemUgPQorICAgICAgICAgKHBuZ19wdHItPmhlaWdodCArIGluZGV4LT5zdGVwW3BdIC0gMSkgLyBpbmRleC0+c3RlcFtwXTsKKyAgICAgIGluZGV4LT5wYXNzX2xpbmVfaW5kZXhbcF0gPQorICAgICAgICAgcG5nX21hbGxvYyhwbmdfcHRyLCB0ZW1wX3NpemUgKiBzaXplb2YocG5nX2xpbmVfaW5kZXhwKSk7CisKKyAgICAgIC8vIEdldCB0aGUgcm93X2J5dGVfbGVuZ3RoIHNlZW4gYnkgdGhlIGZpbHRlci4gVGhpcyB2YWx1ZSBtYXkgYmUKKyAgICAgIC8vIGRpZmZlcmVudCBmcm9tIHRoZSByb3dfYnl0ZV9sZW5ndGggb2YgYSBiaXRtYXAgaW4gdGhlIGNhc2Ugb2YKKyAgICAgIC8vIGNvbG9yIHBhbGV0dGUgbW9kZS4KKyAgICAgIGludCByb3dfYnl0ZV9sZW5ndGggPQorICAgICAgICAgUE5HX1JPV0JZVEVTKHBuZ19wdHItPnBpeGVsX2RlcHRoLCBwbmdfcHRyLT5pd2lkdGgpICsgMTsKKworICAgICAgLy8gTm93LCB3ZSByZWNvcmQgaW5kZXggZm9yIGVhY2ggaW5kZXhpbmcgcm93LgorICAgICAgZm9yIChpID0gMDsgaSA8IHRlbXBfc2l6ZTsgaSsrKQorICAgICAgeworICAgICAgICAgcG5nX2xpbmVfaW5kZXhwIGxpbmVfaW5kZXggPSBwbmdfbWFsbG9jKHBuZ19wdHIsIHNpemVvZihwbmdfbGluZV9pbmRleCkpOworICAgICAgICAgaW5kZXgtPnBhc3NfbGluZV9pbmRleFtwXVtpXSA9IGxpbmVfaW5kZXg7CisKKyAgICAgICAgIGxpbmVfaW5kZXgtPnpfc3RhdGUgPSBwbmdfbWFsbG9jKHBuZ19wdHIsIHNpemVvZih6X3N0cmVhbSkpOworICAgICAgICAgaW5mbGF0ZUNvcHkobGluZV9pbmRleC0+el9zdGF0ZSwgJnBuZ19wdHItPnpzdHJlYW0pOworICAgICAgICAgbGluZV9pbmRleC0+cHJldl9yb3cgPSBwbmdfbWFsbG9jKHBuZ19wdHIsIHJvd19ieXRlX2xlbmd0aCk7CisgICAgICAgICBtZW1jcHkobGluZV9pbmRleC0+cHJldl9yb3csIHBuZ19wdHItPnByZXZfcm93LCByb3dfYnl0ZV9sZW5ndGgpOworICAgICAgICAgbGluZV9pbmRleC0+c3RyZWFtX2lkYXRfcG9zaXRpb24gPSBpbmRleC0+c3RyZWFtX2lkYXRfcG9zaXRpb247CisgICAgICAgICBsaW5lX2luZGV4LT5ieXRlc19sZWZ0X2luX2lkYXQgPSBwbmdfcHRyLT5pZGF0X3NpemUgKyBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luOworCisgICAgICAgICAvLyBpbmNyZW1lbnQgdGhlIHNpemUgbm93IHRoYXQgd2UgaGF2ZSB0aGUgYmFja2luZyBkYXRhIHN0cnVjdHVyZXMuCisgICAgICAgICAvLyBUaGlzIHByZXZlbnRzIGEgY3Jhc2ggaW4gdGhlIGV2ZW50IHRoYXQgcG5nX3JlYWRfcm93IGZhaWxzIGFuZAorICAgICAgICAgLy8gd2UgbmVlZCB0byBjbGVhbnVwIHRoZSBwYXJ0aWFsbHkgY29uc3RydWN0ZWQgcG5nX2luZGV4X3N0cnVjdDsKKyAgICAgICAgIGluZGV4LT5zaXplW3BdICs9IDE7CisKKyAgICAgICAgIC8vIFNraXAgdGhlICJzdGVwIiBudW1iZXIgb2Ygcm93cyB0byB0aGUgbmV4dCBpbmRleGluZyByb3cuCisgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaW5kZXgtPnN0ZXBbcF0gJiYKKyAgICAgICAgICAgICAgIGkgKiBpbmRleC0+c3RlcFtwXSArIGogPCBwbmdfcHRyLT5oZWlnaHQ7IGorKykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19yZWFkX3JvdyhwbmdfcHRyLCBycCwgTlVMTCk7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisgICBwbmdfZnJlZShwbmdfcHRyLCBycCk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVECisvKiBSZWFkIHRoZSBlbnRpcmUgaW1hZ2UuICBJZiB0aGUgaW1hZ2UgaGFzIGFuIGFscGhhIGNoYW5uZWwgb3IgYSB0Uk5TCisgKiBjaHVuaywgYW5kIHlvdSBoYXZlIGNhbGxlZCBwbmdfaGFuZGxlX2FscGhhKClbKl0sIHlvdSB3aWxsIG5lZWQgdG8KKyAqIGluaXRpYWxpemUgdGhlIGltYWdlIHRvIHRoZSBjdXJyZW50IGltYWdlIHRoYXQgUE5HIHdpbGwgYmUgb3ZlcmxheWluZy4KKyAqIFdlIHNldCB0aGUgbnVtX3Jvd3MgYWdhaW4gaGVyZSwgaW4gY2FzZSBpdCB3YXMgaW5jb3JyZWN0bHkgc2V0IGluCisgKiBwbmdfcmVhZF9zdGFydF9yb3coKSBieSBhIGNhbGwgdG8gcG5nX3JlYWRfdXBkYXRlX2luZm8oKSBvcgorICogcG5nX3N0YXJ0X3JlYWRfaW1hZ2UoKSBpZiBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZygpIHdhc24ndCBjYWxsZWQKKyAqIHByaW9yIHRvIGVpdGhlciBvZiB0aGVzZSBmdW5jdGlvbnMgbGlrZSBpdCBzaG91bGQgaGF2ZSBiZWVuLiAgWW91IGNhbgorICogb25seSBjYWxsIHRoaXMgZnVuY3Rpb24gb25jZS4gIElmIHlvdSBkZXNpcmUgdG8gaGF2ZSBhbiBpbWFnZSBmb3IKKyAqIGVhY2ggcGFzcyBvZiBhIGludGVybGFjZWQgaW1hZ2UsIHVzZSBwbmdfcmVhZF9yb3dzKCkgaW5zdGVhZC4KKyAqCisgKiBbKl0gcG5nX2hhbmRsZV9hbHBoYSgpIGRvZXMgbm90IGV4aXN0IHlldCwgYXMgb2YgdGhpcyB2ZXJzaW9uIG9mIGxpYnBuZworICovCit2b2lkIFBOR0FQSQorcG5nX3JlYWRfaW1hZ2UocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19ieXRlcHAgaW1hZ2UpCit7CisgICBwbmdfdWludF8zMiBpLCBpbWFnZV9oZWlnaHQ7CisgICBpbnQgcGFzcywgajsKKyAgIHBuZ19ieXRlcHAgcnA7CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3JlYWRfaW1hZ2UiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworI2lmZGVmIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAorICAgaWYgKChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX1JPV19JTklUKSA9PSAwKQorICAgeworICAgICAgcGFzcyA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOworICAgICAgLyogQW5kIG1ha2Ugc3VyZSB0cmFuc2Zvcm1zIGFyZSBpbml0aWFsaXplZC4gKi8KKyAgICAgIHBuZ19zdGFydF9yZWFkX2ltYWdlKHBuZ19wdHIpOworICAgfQorICAgZWxzZQorICAgeworICAgICAgaWYgKHBuZ19wdHItPmludGVybGFjZWQgIT0gMCAmJgorICAgICAgICAgIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5URVJMQUNFKSA9PSAwKQorICAgICAgeworICAgICAgICAgLyogQ2FsbGVyIGNhbGxlZCBwbmdfc3RhcnRfcmVhZF9pbWFnZSBvciBwbmdfcmVhZF91cGRhdGVfaW5mbyB3aXRob3V0CisgICAgICAgICAgKiBmaXJzdCB0dXJuaW5nIG9uIHRoZSBQTkdfSU5URVJMQUNFIHRyYW5zZm9ybS4gIFdlIGNhbiBmaXggdGhpcyBoZXJlLAorICAgICAgICAgICogYnV0IHRoZSBjYWxsZXIgc2hvdWxkIGRvIGl0IQorICAgICAgICAgICovCisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW50ZXJsYWNlIGhhbmRsaW5nIHNob3VsZCBiZSB0dXJuZWQgb24gd2hlbiAiCisgICAgICAgICAgICAidXNpbmcgcG5nX3JlYWRfaW1hZ2UiKTsKKyAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIGlzIHNldCBjb3JyZWN0bHkgKi8KKyAgICAgICAgIHBuZ19wdHItPm51bV9yb3dzID0gcG5nX3B0ci0+aGVpZ2h0OworICAgICAgfQorCisgICAgICAvKiBPYnRhaW4gdGhlIHBhc3MgbnVtYmVyLCB3aGljaCBhbHNvIHR1cm5zIG9uIHRoZSBQTkdfSU5URVJMQUNFIGZsYWcgaW4KKyAgICAgICAqIHRoZSBhYm92ZSBlcnJvciBjYXNlLgorICAgICAgICovCisgICAgICBwYXNzID0gcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3B0cik7CisgICB9CisjZWxzZQorICAgaWYgKHBuZ19wdHItPmludGVybGFjZWQpCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwKKyAgICAgICAgICAiQ2Fubm90IHJlYWQgaW50ZXJsYWNlZCBpbWFnZSAtLSBpbnRlcmxhY2UgaGFuZGxlciBkaXNhYmxlZCIpOworCisgICBwYXNzID0gMTsKKyNlbmRpZgorCisgICBpbWFnZV9oZWlnaHQ9cG5nX3B0ci0+aGVpZ2h0OworCisgICBmb3IgKGogPSAwOyBqIDwgcGFzczsgaisrKQorICAgeworICAgICAgcnAgPSBpbWFnZTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBpbWFnZV9oZWlnaHQ7IGkrKykKKyAgICAgIHsKKyAgICAgICAgIHBuZ19yZWFkX3JvdyhwbmdfcHRyLCAqcnAsIE5VTEwpOworICAgICAgICAgcnArKzsKKyAgICAgIH0KKyAgIH0KK30KKyNlbmRpZiAvKiBTRVFVRU5USUFMX1JFQUQgKi8KKworI2lmZGVmIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVECisvKiBSZWFkIHRoZSBlbmQgb2YgdGhlIFBORyBmaWxlLiAgV2lsbCBub3QgcmVhZCBwYXN0IHRoZSBlbmQgb2YgdGhlCisgKiBmaWxlLCB3aWxsIHZlcmlmeSB0aGUgZW5kIGlzIGFjY3VyYXRlLCBhbmQgd2lsbCByZWFkIGFueSBjb21tZW50cworICogb3IgdGltZSBpbmZvcm1hdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLCBpZiBpbmZvIGlzIG5vdCBOVUxMLgorICovCit2b2lkIFBOR0FQSQorcG5nX3JlYWRfZW5kKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyKQoreworI2lmZGVmIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQKKyAgIGludCBrZWVwOworI2VuZGlmCisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3JlYWRfZW5kIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIC8qIElmIHBuZ19yZWFkX2VuZCBpcyBjYWxsZWQgaW4gdGhlIG1pZGRsZSBvZiByZWFkaW5nIHRoZSByb3dzIHRoZXJlIG1heQorICAgICogc3RpbGwgYmUgcGVuZGluZyBJREFUIGRhdGEgYW5kIGFuIG93bmVkIHpzdHJlYW0uICBEZWFsIHdpdGggdGhpcyBoZXJlLgorICAgICovCisjaWZkZWYgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRAorICAgaWYgKHBuZ19jaHVua191bmtub3duX2hhbmRsaW5nKHBuZ19wdHIsIHBuZ19JREFUKSA9PSAwKQorI2VuZGlmCisgICAgICBwbmdfcmVhZF9maW5pc2hfSURBVChwbmdfcHRyKTsKKworI2lmZGVmIFBOR19SRUFEX0NIRUNLX0ZPUl9JTlZBTElEX0lOREVYX1NVUFBPUlRFRAorICAgLyogUmVwb3J0IGludmFsaWQgcGFsZXR0ZSBpbmRleDsgYWRkZWQgYXQgbGlibmctMS41LjEwICovCisgICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFICYmCisgICAgICBwbmdfcHRyLT5udW1fcGFsZXR0ZV9tYXggPiBwbmdfcHRyLT5udW1fcGFsZXR0ZSkKKyAgICAgcG5nX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiUmVhZCBwYWxldHRlIGluZGV4IGV4Y2VlZGluZyBudW1fcGFsZXR0ZSIpOworI2VuZGlmCisKKyAgIGRvCisgICB7CisgICAgICBwbmdfdWludF8zMiBsZW5ndGggPSBwbmdfcmVhZF9jaHVua19oZWFkZXIocG5nX3B0cik7CisgICAgICBwbmdfdWludF8zMiBjaHVua19uYW1lID0gcG5nX3B0ci0+Y2h1bmtfbmFtZTsKKworICAgICAgaWYgKGNodW5rX25hbWUgPT0gcG5nX0lFTkQpCisgICAgICAgICBwbmdfaGFuZGxlX0lFTkQocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisKKyAgICAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX0lIRFIpCisgICAgICAgICBwbmdfaGFuZGxlX0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisKKyAgICAgIGVsc2UgaWYgKGluZm9fcHRyID09IE5VTEwpCisgICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworCisjaWZkZWYgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAoKGtlZXAgPSBwbmdfY2h1bmtfdW5rbm93bl9oYW5kbGluZyhwbmdfcHRyLCBjaHVua19uYW1lKSkgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgIGlmIChjaHVua19uYW1lID09IHBuZ19JREFUKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKChsZW5ndGggPiAwKSB8fAorICAgICAgICAgICAgICAgIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfQ0hVTktfQUZURVJfSURBVCkgIT0gMCkKKyAgICAgICAgICAgICAgIHBuZ19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIlRvbyBtYW55IElEQVRzIGZvdW5kIik7CisgICAgICAgICB9CisgICAgICAgICBwbmdfaGFuZGxlX3Vua25vd24ocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCwga2VlcCk7CisgICAgICAgICBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfUExURSkKKyAgICAgICAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfUExURTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19JREFUKQorICAgICAgeworICAgICAgICAgLyogWmVybyBsZW5ndGggSURBVHMgYXJlIGxlZ2FsIGFmdGVyIHRoZSBsYXN0IElEQVQgaGFzIGJlZW4KKyAgICAgICAgICAqIHJlYWQsIGJ1dCBub3QgYWZ0ZXIgb3RoZXIgY2h1bmtzIGhhdmUgYmVlbiByZWFkLgorICAgICAgICAgICovCisgICAgICAgICBpZiAoKGxlbmd0aCA+IDApIHx8IChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfQ0hVTktfQUZURVJfSURBVCkgIT0gMCkKKyAgICAgICAgICAgIHBuZ19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIlRvbyBtYW55IElEQVRzIGZvdW5kIik7CisKKyAgICAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19QTFRFKQorICAgICAgICAgcG5nX2hhbmRsZV9QTFRFKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOworCisjaWZkZWYgUE5HX1JFQURfYktHRF9TVVBQT1JURUQKKyAgICAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX2JLR0QpCisgICAgICAgICBwbmdfaGFuZGxlX2JLR0QocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX2NIUk1fU1VQUE9SVEVECisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19jSFJNKQorICAgICAgICAgcG5nX2hhbmRsZV9jSFJNKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9nQU1BX1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfZ0FNQSkKKyAgICAgICAgIHBuZ19oYW5kbGVfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfaElTVF9TVVBQT1JURUQKKyAgICAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX2hJU1QpCisgICAgICAgICBwbmdfaGFuZGxlX2hJU1QocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX29GRnNfU1VQUE9SVEVECisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19vRkZzKQorICAgICAgICAgcG5nX2hhbmRsZV9vRkZzKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9wQ0FMX1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfcENBTCkKKyAgICAgICAgIHBuZ19oYW5kbGVfcENBTChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfc0NBTF9TVVBQT1JURUQKKyAgICAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX3NDQUwpCisgICAgICAgICBwbmdfaGFuZGxlX3NDQUwocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX3BIWXNfU1VQUE9SVEVECisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19wSFlzKQorICAgICAgICAgcG5nX2hhbmRsZV9wSFlzKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9zQklUX1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfc0JJVCkKKyAgICAgICAgIHBuZ19oYW5kbGVfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfc1JHQl9TVVBQT1JURUQKKyAgICAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX3NSR0IpCisgICAgICAgICBwbmdfaGFuZGxlX3NSR0IocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX2lDQ1BfU1VQUE9SVEVECisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19pQ0NQKQorICAgICAgICAgcG5nX2hhbmRsZV9pQ0NQKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9zUExUX1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfc1BMVCkKKyAgICAgICAgIHBuZ19oYW5kbGVfc1BMVChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfdEVYdF9TVVBQT1JURUQKKyAgICAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX3RFWHQpCisgICAgICAgICBwbmdfaGFuZGxlX3RFWHQocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX3RJTUVfU1VQUE9SVEVECisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ190SU1FKQorICAgICAgICAgcG5nX2hhbmRsZV90SU1FKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF90Uk5TX1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfdFJOUykKKyAgICAgICAgIHBuZ19oYW5kbGVfdFJOUyhwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfelRYdF9TVVBQT1JURUQKKyAgICAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX3pUWHQpCisgICAgICAgICBwbmdfaGFuZGxlX3pUWHQocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX2lUWHRfU1VQUE9SVEVECisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19pVFh0KQorICAgICAgICAgcG5nX2hhbmRsZV9pVFh0KHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOworI2VuZGlmCisKKyAgICAgIGVsc2UKKyAgICAgICAgIHBuZ19oYW5kbGVfdW5rbm93bihwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoLAorICAgICAgICAgICAgUE5HX0hBTkRMRV9DSFVOS19BU19ERUZBVUxUKTsKKyAgIH0gd2hpbGUgKChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUVORCkgPT0gMCk7Cit9CisjZW5kaWYgLyogU0VRVUVOVElBTF9SRUFEICovCisKKy8qIEZyZWUgYWxsIG1lbW9yeSB1c2VkIGluIHRoZSByZWFkIHN0cnVjdCAqLworc3RhdGljIHZvaWQKK3BuZ19yZWFkX2Rlc3Ryb3kocG5nX3N0cnVjdHJwIHBuZ19wdHIpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19yZWFkX2Rlc3Ryb3kiKTsKKworI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAorICAgcG5nX2Rlc3Ryb3lfZ2FtbWFfdGFibGUocG5nX3B0cik7CisjZW5kaWYKKworICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+YmlnX3Jvd19idWYpOworICAgcG5nX3B0ci0+YmlnX3Jvd19idWYgPSBOVUxMOworICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+YmlnX3ByZXZfcm93KTsKKyAgIHBuZ19wdHItPmJpZ19wcmV2X3JvdyA9IE5VTEw7CisgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5yZWFkX2J1ZmZlcik7CisgICBwbmdfcHRyLT5yZWFkX2J1ZmZlciA9IE5VTEw7CisKKyNpZmRlZiBQTkdfUkVBRF9RVUFOVElaRV9TVVBQT1JURUQKKyAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnBhbGV0dGVfbG9va3VwKTsKKyAgIHBuZ19wdHItPnBhbGV0dGVfbG9va3VwID0gTlVMTDsKKyAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnF1YW50aXplX2luZGV4KTsKKyAgIHBuZ19wdHItPnF1YW50aXplX2luZGV4ID0gTlVMTDsKKyNlbmRpZgorCisgICBpZiAoKHBuZ19wdHItPmZyZWVfbWUgJiBQTkdfRlJFRV9QTFRFKSAhPSAwKQorICAgeworICAgICAgcG5nX3pmcmVlKHBuZ19wdHIsIHBuZ19wdHItPnBhbGV0dGUpOworICAgICAgcG5nX3B0ci0+cGFsZXR0ZSA9IE5VTEw7CisgICB9CisgICBwbmdfcHRyLT5mcmVlX21lICY9IH5QTkdfRlJFRV9QTFRFOworCisjaWYgZGVmaW5lZChQTkdfdFJOU19TVVBQT1JURUQpIHx8IFwKKyAgICBkZWZpbmVkKFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpCisgICBpZiAoKHBuZ19wdHItPmZyZWVfbWUgJiBQTkdfRlJFRV9UUk5TKSAhPSAwKQorICAgeworICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+dHJhbnNfYWxwaGEpOworICAgICAgcG5nX3B0ci0+dHJhbnNfYWxwaGEgPSBOVUxMOworICAgfQorICAgcG5nX3B0ci0+ZnJlZV9tZSAmPSB+UE5HX0ZSRUVfVFJOUzsKKyNlbmRpZgorCisgICBpbmZsYXRlRW5kKCZwbmdfcHRyLT56c3RyZWFtKTsKKworI2lmZGVmIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRAorICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+c2F2ZV9idWZmZXIpOworICAgcG5nX3B0ci0+c2F2ZV9idWZmZXIgPSBOVUxMOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19TVE9SRV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQpICYmIFwKKyAgIGRlZmluZWQoUE5HX1JFQURfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEKQorICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+dW5rbm93bl9jaHVuay5kYXRhKTsKKyAgIHBuZ19wdHItPnVua25vd25fY2h1bmsuZGF0YSA9IE5VTEw7CisjZW5kaWYKKworI2lmZGVmIFBOR19TRVRfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECisgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua19saXN0KTsKKyAgIHBuZ19wdHItPmNodW5rX2xpc3QgPSBOVUxMOworI2VuZGlmCisKKyNpZmRlZiBQTkdfSU5ERVhfU1VQUE9SVEVECisgICBpZiAocG5nX3B0ci0+aW5kZXgpIHsKKyAgICAgIHVuc2lnbmVkIGludCBpLCBwOworICAgICAgcG5nX2luZGV4cCBpbmRleCA9IHBuZ19wdHItPmluZGV4OworICAgICAgZm9yIChwID0gMDsgcCA8IDc7IHArKykgeworICAgICAgICAgZm9yIChpID0gMDsgaSA8IGluZGV4LT5zaXplW3BdOyBpKyspIHsKKyAgICAgICAgICAgIGluZmxhdGVFbmQoaW5kZXgtPnBhc3NfbGluZV9pbmRleFtwXVtpXS0+el9zdGF0ZSk7CisgICAgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmRleC0+cGFzc19saW5lX2luZGV4W3BdW2ldLT56X3N0YXRlKTsKKyAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZGV4LT5wYXNzX2xpbmVfaW5kZXhbcF1baV0tPnByZXZfcm93KTsKKyAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZGV4LT5wYXNzX2xpbmVfaW5kZXhbcF1baV0pOworICAgICAgICAgfQorICAgICAgICAgaWYgKGluZGV4LT5zaXplW3BdICE9IDApIHsKKyAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZGV4LT5wYXNzX2xpbmVfaW5kZXhbcF0pOworICAgICAgICAgfQorICAgICAgfQorICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5kZXgpOworICAgfQorI2VuZGlmCisKKyAgIC8qIE5PVEU6IHRoZSAnc2V0am1wJyBidWZmZXIgbWF5IHN0aWxsIGJlIGFsbG9jYXRlZCBhbmQgdGhlIG1lbW9yeSBhbmQgZXJyb3IKKyAgICAqIGNhbGxiYWNrcyBhcmUgc3RpbGwgc2V0IGF0IHRoaXMgcG9pbnQuICBUaGV5IGFyZSByZXF1aXJlZCB0byBjb21wbGV0ZSB0aGUKKyAgICAqIGRlc3RydWN0aW9uIG9mIHRoZSBwbmdfc3RydWN0IGl0c2VsZi4KKyAgICAqLworfQorCisvKiBGcmVlIGFsbCBtZW1vcnkgdXNlZCBieSB0aGUgcmVhZCAqLwordm9pZCBQTkdBUEkKK3BuZ19kZXN0cm95X3JlYWRfc3RydWN0KHBuZ19zdHJ1Y3RwcCBwbmdfcHRyX3B0ciwgcG5nX2luZm9wcCBpbmZvX3B0cl9wdHIsCisgICAgcG5nX2luZm9wcCBlbmRfaW5mb19wdHJfcHRyKQoreworICAgcG5nX3N0cnVjdHJwIHBuZ19wdHIgPSBOVUxMOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0Iik7CisKKyAgIGlmIChwbmdfcHRyX3B0ciAhPSBOVUxMKQorICAgICAgcG5nX3B0ciA9ICpwbmdfcHRyX3B0cjsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgLyogbGlicG5nIDEuNi4wOiB1c2UgdGhlIEFQSSB0byBkZXN0cm95IGluZm8gc3RydWN0cyB0byBlbnN1cmUgY29uc2lzdGVudAorICAgICogYmVoYXZpb3IuICBQcmlvciB0byAxLjYuMCBsaWJwbmcgZGlkIGV4dHJhICdpbmZvJyBkZXN0cnVjdGlvbiBpbiB0aGlzIEFQSS4KKyAgICAqIFRoZSBleHRyYSB3YXMsIGFwcGFyZW50bHksIHVubmVjZXNzYXJ5IHlldCB0aGlzIGhpZGVzIG1lbW9yeSBsZWFrIGJ1Z3MuCisgICAgKi8KKyAgIHBuZ19kZXN0cm95X2luZm9fc3RydWN0KHBuZ19wdHIsIGVuZF9pbmZvX3B0cl9wdHIpOworICAgcG5nX2Rlc3Ryb3lfaW5mb19zdHJ1Y3QocG5nX3B0ciwgaW5mb19wdHJfcHRyKTsKKworICAgKnBuZ19wdHJfcHRyID0gTlVMTDsKKyAgIHBuZ19yZWFkX2Rlc3Ryb3kocG5nX3B0cik7CisgICBwbmdfZGVzdHJveV9wbmdfc3RydWN0KHBuZ19wdHIpOworfQorCit2b2lkIFBOR0FQSQorcG5nX3NldF9yZWFkX3N0YXR1c19mbihwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3JlYWRfc3RhdHVzX3B0ciByZWFkX3Jvd19mbikKK3sKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIHBuZ19wdHItPnJlYWRfcm93X2ZuID0gcmVhZF9yb3dfZm47Cit9CisKKworI2lmZGVmIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVECisjaWZkZWYgUE5HX0lORk9fSU1BR0VfU1VQUE9SVEVECit2b2lkIFBOR0FQSQorcG5nX3JlYWRfcG5nKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5zZm9ybXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkcCBwYXJhbXMpCit7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIC8qIHBuZ19yZWFkX2luZm8oKSBnaXZlcyB1cyBhbGwgb2YgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlCisgICAgKiBQTkcgZmlsZSBiZWZvcmUgdGhlIGZpcnN0IElEQVQgKGltYWdlIGRhdGEgY2h1bmspLgorICAgICovCisgICBwbmdfcmVhZF9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKKyAgIGlmIChpbmZvX3B0ci0+aGVpZ2h0ID4gUE5HX1VJTlRfMzJfTUFYLyhzaXplb2YgKHBuZ19ieXRlcCkpKQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbWFnZSBpcyB0b28gaGlnaCB0byBwcm9jZXNzIHdpdGggcG5nX3JlYWRfcG5nKCkiKTsKKworICAgLyogLS0tLS0tLS0tLS0tLS0gaW1hZ2UgdHJhbnNmb3JtYXRpb25zIHN0YXJ0IGhlcmUgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgLyogbGlicG5nIDEuNi4xMDogYWRkIGNvZGUgdG8gY2F1c2UgYSBwbmdfYXBwX2Vycm9yIGlmIGEgc2VsZWN0ZWQgVFJBTlNGT1JNCisgICAgKiBpcyBub3QgaW1wbGVtZW50ZWQuICBUaGlzIHdpbGwgb25seSBoYXBwZW4gaW4gZGUtY29uZmlndXJlZCAobm9uLWRlZmF1bHQpCisgICAgKiBsaWJwbmcgYnVpbGRzLiAgVGhlIHJlc3VsdHMgY2FuIGJlIHVuZXhwZWN0ZWQgLSBwbmdfcmVhZF9wbmcgbWF5IHJldHVybgorICAgICogc2hvcnQgb3IgbWFsLWZvcm1lZCByb3dzIGJlY2F1c2UgdGhlIHRyYW5zZm9ybSBpcyBza2lwcGVkLgorICAgICovCisKKyAgIC8qIFRlbGwgbGlicG5nIHRvIHN0cmlwIDE2LWJpdC9jb2xvciBmaWxlcyBkb3duIHRvIDggYml0cyBwZXIgY29sb3IuCisgICAgKi8KKyAgIGlmICgodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fU0NBTEVfMTYpICE9IDApCisgICAgICAvKiBBZGRlZCBhdCBsaWJwbmctMS41LjQuICJzdHJpcF8xNiIgcHJvZHVjZXMgdGhlIHNhbWUgcmVzdWx0IHRoYXQgaXQKKyAgICAgICAqIGRpZCBpbiBlYXJsaWVyIHZlcnNpb25zLCB3aGlsZSAic2NhbGVfMTYiIGlzIG5vdyBtb3JlIGFjY3VyYXRlLgorICAgICAgICovCisjaWZkZWYgUE5HX1JFQURfU0NBTEVfMTZfVE9fOF9TVVBQT1JURUQKKyAgICAgIHBuZ19zZXRfc2NhbGVfMTYocG5nX3B0cik7CisjZWxzZQorICAgICAgcG5nX2FwcF9lcnJvcihwbmdfcHRyLCAiUE5HX1RSQU5TRk9STV9TQ0FMRV8xNiBub3Qgc3VwcG9ydGVkIik7CisjZW5kaWYKKworICAgLyogSWYgYm90aCBTQ0FMRSBhbmQgU1RSSVAgYXJlIHJlcXVpcmVkIHBuZ3J0cmFuIHdpbGwgZWZmZWN0aXZlbHkgY2FuY2VsIHRoZQorICAgICogbGF0dGVyIGJ5IGRvaW5nIFNDQUxFIGZpcnN0LiAgVGhpcyBpcyBvayBhbmQgYWxsb3dzIGFwcHMgbm90IHRvIGNoZWNrIGZvcgorICAgICogd2hpY2ggaXMgc3VwcG9ydGVkIHRvIGdldCB0aGUgcmlnaHQgYW5zd2VyLgorICAgICovCisgICBpZiAoKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX1NUUklQXzE2KSAhPSAwKQorI2lmZGVmIFBOR19SRUFEX1NUUklQXzE2X1RPXzhfU1VQUE9SVEVECisgICAgICBwbmdfc2V0X3N0cmlwXzE2KHBuZ19wdHIpOworI2Vsc2UKKyAgICAgIHBuZ19hcHBfZXJyb3IocG5nX3B0ciwgIlBOR19UUkFOU0ZPUk1fU1RSSVBfMTYgbm90IHN1cHBvcnRlZCIpOworI2VuZGlmCisKKyAgIC8qIFN0cmlwIGFscGhhIGJ5dGVzIGZyb20gdGhlIGlucHV0IGRhdGEgd2l0aG91dCBjb21iaW5pbmcgd2l0aAorICAgICogdGhlIGJhY2tncm91bmQgKG5vdCByZWNvbW1lbmRlZCkuCisgICAgKi8KKyAgIGlmICgodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fU1RSSVBfQUxQSEEpICE9IDApCisjaWZkZWYgUE5HX1JFQURfU1RSSVBfQUxQSEFfU1VQUE9SVEVECisgICAgICBwbmdfc2V0X3N0cmlwX2FscGhhKHBuZ19wdHIpOworI2Vsc2UKKyAgICAgIHBuZ19hcHBfZXJyb3IocG5nX3B0ciwgIlBOR19UUkFOU0ZPUk1fU1RSSVBfQUxQSEEgbm90IHN1cHBvcnRlZCIpOworI2VuZGlmCisKKyAgIC8qIEV4dHJhY3QgbXVsdGlwbGUgcGl4ZWxzIHdpdGggYml0IGRlcHRocyBvZiAxLCAyLCBvciA0IGZyb20gYSBzaW5nbGUKKyAgICAqIGJ5dGUgaW50byBzZXBhcmF0ZSBieXRlcyAodXNlZnVsIGZvciBwYWxldHRlZCBhbmQgZ3JheXNjYWxlIGltYWdlcykuCisgICAgKi8KKyAgIGlmICgodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fUEFDS0lORykgIT0gMCkKKyNpZmRlZiBQTkdfUkVBRF9QQUNLX1NVUFBPUlRFRAorICAgICAgcG5nX3NldF9wYWNraW5nKHBuZ19wdHIpOworI2Vsc2UKKyAgICAgIHBuZ19hcHBfZXJyb3IocG5nX3B0ciwgIlBOR19UUkFOU0ZPUk1fUEFDS0lORyBub3Qgc3VwcG9ydGVkIik7CisjZW5kaWYKKworICAgLyogQ2hhbmdlIHRoZSBvcmRlciBvZiBwYWNrZWQgcGl4ZWxzIHRvIGxlYXN0IHNpZ25pZmljYW50IGJpdCBmaXJzdAorICAgICogKG5vdCB1c2VmdWwgaWYgeW91IGFyZSB1c2luZyBwbmdfc2V0X3BhY2tpbmcpLgorICAgICovCisgICBpZiAoKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX1BBQ0tTV0FQKSAhPSAwKQorI2lmZGVmIFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRAorICAgICAgcG5nX3NldF9wYWNrc3dhcChwbmdfcHRyKTsKKyNlbHNlCisgICAgICBwbmdfYXBwX2Vycm9yKHBuZ19wdHIsICJQTkdfVFJBTlNGT1JNX1BBQ0tTV0FQIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorCisgICAvKiBFeHBhbmQgcGFsZXR0ZWQgY29sb3JzIGludG8gdHJ1ZSBSR0IgdHJpcGxldHMKKyAgICAqIEV4cGFuZCBncmF5c2NhbGUgaW1hZ2VzIHRvIGZ1bGwgOCBiaXRzIGZyb20gMSwgMiwgb3IgNCBiaXRzL3BpeGVsCisgICAgKiBFeHBhbmQgcGFsZXR0ZWQgb3IgUkdCIGltYWdlcyB3aXRoIHRyYW5zcGFyZW5jeSB0byBmdWxsIGFscGhhCisgICAgKiBjaGFubmVscyBzbyB0aGUgZGF0YSB3aWxsIGJlIGF2YWlsYWJsZSBhcyBSR0JBIHF1YXJ0ZXRzLgorICAgICovCisgICBpZiAoKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX0VYUEFORCkgIT0gMCkKKyNpZmRlZiBQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVECisgICAgICBwbmdfc2V0X2V4cGFuZChwbmdfcHRyKTsKKyNlbHNlCisgICAgICBwbmdfYXBwX2Vycm9yKHBuZ19wdHIsICJQTkdfVFJBTlNGT1JNX0VYUEFORCBub3Qgc3VwcG9ydGVkIik7CisjZW5kaWYKKworICAgLyogV2UgZG9uJ3QgaGFuZGxlIGJhY2tncm91bmQgY29sb3Igb3IgZ2FtbWEgdHJhbnNmb3JtYXRpb24gb3IgcXVhbnRpemluZy4KKyAgICAqLworCisgICAvKiBJbnZlcnQgbW9ub2Nocm9tZSBmaWxlcyB0byBoYXZlIDAgYXMgd2hpdGUgYW5kIDEgYXMgYmxhY2sKKyAgICAqLworICAgaWYgKCh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9JTlZFUlRfTU9OTykgIT0gMCkKKyNpZmRlZiBQTkdfUkVBRF9JTlZFUlRfU1VQUE9SVEVECisgICAgICBwbmdfc2V0X2ludmVydF9tb25vKHBuZ19wdHIpOworI2Vsc2UKKyAgICAgIHBuZ19hcHBfZXJyb3IocG5nX3B0ciwgIlBOR19UUkFOU0ZPUk1fSU5WRVJUX01PTk8gbm90IHN1cHBvcnRlZCIpOworI2VuZGlmCisKKyAgIC8qIElmIHlvdSB3YW50IHRvIHNoaWZ0IHRoZSBwaXhlbCB2YWx1ZXMgZnJvbSB0aGUgcmFuZ2UgWzAsMjU1XSBvcgorICAgICogWzAsNjU1MzVdIHRvIHRoZSBvcmlnaW5hbCBbMCw3XSBvciBbMCwzMV0sIG9yIHdoYXRldmVyIHJhbmdlIHRoZQorICAgICogY29sb3JzIHdlcmUgb3JpZ2luYWxseSBpbjoKKyAgICAqLworICAgaWYgKCh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9TSElGVCkgIT0gMCkKKyNpZmRlZiBQTkdfUkVBRF9TSElGVF9TVVBQT1JURUQKKyAgICAgIGlmICgoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc0JJVCkgIT0gMCkKKyAgICAgICAgIHBuZ19zZXRfc2hpZnQocG5nX3B0ciwgJmluZm9fcHRyLT5zaWdfYml0KTsKKyNlbHNlCisgICAgICBwbmdfYXBwX2Vycm9yKHBuZ19wdHIsICJQTkdfVFJBTlNGT1JNX1NISUZUIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorCisgICAvKiBGbGlwIHRoZSBSR0IgcGl4ZWxzIHRvIEJHUiAob3IgUkdCQSB0byBCR1JBKSAqLworICAgaWYgKCh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9CR1IpICE9IDApCisjaWZkZWYgUE5HX1JFQURfQkdSX1NVUFBPUlRFRAorICAgICAgcG5nX3NldF9iZ3IocG5nX3B0cik7CisjZWxzZQorICAgICAgcG5nX2FwcF9lcnJvcihwbmdfcHRyLCAiUE5HX1RSQU5TRk9STV9CR1Igbm90IHN1cHBvcnRlZCIpOworI2VuZGlmCisKKyAgIC8qIFN3YXAgdGhlIFJHQkEgb3IgR0EgZGF0YSB0byBBUkdCIG9yIEFHIChvciBCR1JBIHRvIEFCR1IpICovCisgICBpZiAoKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX1NXQVBfQUxQSEEpICE9IDApCisjaWZkZWYgUE5HX1JFQURfU1dBUF9BTFBIQV9TVVBQT1JURUQKKyAgICAgIHBuZ19zZXRfc3dhcF9hbHBoYShwbmdfcHRyKTsKKyNlbHNlCisgICAgICBwbmdfYXBwX2Vycm9yKHBuZ19wdHIsICJQTkdfVFJBTlNGT1JNX1NXQVBfQUxQSEEgbm90IHN1cHBvcnRlZCIpOworI2VuZGlmCisKKyAgIC8qIFN3YXAgYnl0ZXMgb2YgMTYtYml0IGZpbGVzIHRvIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QgKi8KKyAgIGlmICgodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fU1dBUF9FTkRJQU4pICE9IDApCisjaWZkZWYgUE5HX1JFQURfU1dBUF9TVVBQT1JURUQKKyAgICAgIHBuZ19zZXRfc3dhcChwbmdfcHRyKTsKKyNlbHNlCisgICAgICBwbmdfYXBwX2Vycm9yKHBuZ19wdHIsICJQTkdfVFJBTlNGT1JNX1NXQVBfRU5ESUFOIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorCisvKiBBZGRlZCBhdCBsaWJwbmctMS4yLjQxICovCisgICAvKiBJbnZlcnQgdGhlIGFscGhhIGNoYW5uZWwgZnJvbSBvcGFjaXR5IHRvIHRyYW5zcGFyZW5jeSAqLworICAgaWYgKCh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9JTlZFUlRfQUxQSEEpICE9IDApCisjaWZkZWYgUE5HX1JFQURfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRAorICAgICAgcG5nX3NldF9pbnZlcnRfYWxwaGEocG5nX3B0cik7CisjZWxzZQorICAgICAgcG5nX2FwcF9lcnJvcihwbmdfcHRyLCAiUE5HX1RSQU5TRk9STV9JTlZFUlRfQUxQSEEgbm90IHN1cHBvcnRlZCIpOworI2VuZGlmCisKKy8qIEFkZGVkIGF0IGxpYnBuZy0xLjIuNDEgKi8KKyAgIC8qIEV4cGFuZCBncmF5c2NhbGUgaW1hZ2UgdG8gUkdCICovCisgICBpZiAoKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX0dSQVlfVE9fUkdCKSAhPSAwKQorI2lmZGVmIFBOR19SRUFEX0dSQVlfVE9fUkdCX1NVUFBPUlRFRAorICAgICAgcG5nX3NldF9ncmF5X3RvX3JnYihwbmdfcHRyKTsKKyNlbHNlCisgICAgICBwbmdfYXBwX2Vycm9yKHBuZ19wdHIsICJQTkdfVFJBTlNGT1JNX0dSQVlfVE9fUkdCIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorCisvKiBBZGRlZCBhdCBsaWJwbmctMS41LjQgKi8KKyAgIGlmICgodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fRVhQQU5EXzE2KSAhPSAwKQorI2lmZGVmIFBOR19SRUFEX0VYUEFORF8xNl9TVVBQT1JURUQKKyAgICAgIHBuZ19zZXRfZXhwYW5kXzE2KHBuZ19wdHIpOworI2Vsc2UKKyAgICAgIHBuZ19hcHBfZXJyb3IocG5nX3B0ciwgIlBOR19UUkFOU0ZPUk1fRVhQQU5EXzE2IG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorCisgICAvKiBXZSBkb24ndCBoYW5kbGUgYWRkaW5nIGZpbGxlciBieXRlcyAqLworCisgICAvKiBXZSB1c2UgcG5nX3JlYWRfaW1hZ2UgYW5kIHJlbHkgb24gdGhhdCBmb3IgaW50ZXJsYWNlIGhhbmRsaW5nLCBidXQgd2UgYWxzbworICAgICogY2FsbCBwbmdfcmVhZF91cGRhdGVfaW5mbyB0aGVyZWZvcmUgbXVzdCB0dXJuIG9uIGludGVybGFjZSBoYW5kbGluZyBub3c6CisgICAgKi8KKyAgICh2b2lkKXBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOworCisgICAvKiBPcHRpb25hbCBjYWxsIHRvIGdhbW1hIGNvcnJlY3QgYW5kIGFkZCB0aGUgYmFja2dyb3VuZCB0byB0aGUgcGFsZXR0ZQorICAgICogYW5kIHVwZGF0ZSBpbmZvIHN0cnVjdHVyZS4gIFJFUVVJUkVEIGlmIHlvdSBhcmUgZXhwZWN0aW5nIGxpYnBuZyB0bworICAgICogdXBkYXRlIHRoZSBwYWxldHRlIGZvciB5b3UgKGkuZS4sIHlvdSBzZWxlY3RlZCBzdWNoIGEgdHJhbnNmb3JtIGFib3ZlKS4KKyAgICAqLworICAgcG5nX3JlYWRfdXBkYXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOworCisgICAvKiAtLS0tLS0tLS0tLS0tLSBpbWFnZSB0cmFuc2Zvcm1hdGlvbnMgZW5kIGhlcmUgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICBwbmdfZnJlZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfRlJFRV9ST1dTLCAwKTsKKyAgIGlmIChpbmZvX3B0ci0+cm93X3BvaW50ZXJzID09IE5VTEwpCisgICB7CisgICAgICBwbmdfdWludF8zMiBpcHRyOworCisgICAgICBpbmZvX3B0ci0+cm93X3BvaW50ZXJzID0gcG5nX3ZvaWRjYXN0KHBuZ19ieXRlcHAsIHBuZ19tYWxsb2MocG5nX3B0ciwKKyAgICAgICAgICBpbmZvX3B0ci0+aGVpZ2h0ICogKHNpemVvZiAocG5nX2J5dGVwKSkpKTsKKworICAgICAgZm9yIChpcHRyPTA7IGlwdHI8aW5mb19wdHItPmhlaWdodDsgaXB0cisrKQorICAgICAgICAgaW5mb19wdHItPnJvd19wb2ludGVyc1tpcHRyXSA9IE5VTEw7CisKKyAgICAgIGluZm9fcHRyLT5mcmVlX21lIHw9IFBOR19GUkVFX1JPV1M7CisKKyAgICAgIGZvciAoaXB0ciA9IDA7IGlwdHIgPCBpbmZvX3B0ci0+aGVpZ2h0OyBpcHRyKyspCisgICAgICAgICBpbmZvX3B0ci0+cm93X3BvaW50ZXJzW2lwdHJdID0gcG5nX3ZvaWRjYXN0KHBuZ19ieXRlcCwKKyAgICAgICAgICAgICBwbmdfbWFsbG9jKHBuZ19wdHIsIGluZm9fcHRyLT5yb3dieXRlcykpOworICAgfQorCisgICBwbmdfcmVhZF9pbWFnZShwbmdfcHRyLCBpbmZvX3B0ci0+cm93X3BvaW50ZXJzKTsKKyAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19JREFUOworCisgICAvKiBSZWFkIHJlc3Qgb2YgZmlsZSwgYW5kIGdldCBhZGRpdGlvbmFsIGNodW5rcyBpbiBpbmZvX3B0ciAtIFJFUVVJUkVEICovCisgICBwbmdfcmVhZF9lbmQocG5nX3B0ciwgaW5mb19wdHIpOworCisgICBQTkdfVU5VU0VEKHBhcmFtcykKK30KKyNlbmRpZiAvKiBJTkZPX0lNQUdFICovCisjZW5kaWYgLyogU0VRVUVOVElBTF9SRUFEICovCisKKyNpZmRlZiBQTkdfU0lNUExJRklFRF9SRUFEX1NVUFBPUlRFRAorLyogU0lNUExJRklFRCBSRUFECisgKgorICogVGhpcyBjb2RlIGN1cnJlbnRseSByZWxpZXMgb24gdGhlIHNlcXVlbnRpYWwgcmVhZGVyLCB0aG91Z2ggaXQgY291bGQgZWFzaWx5CisgKiBiZSBtYWRlIHRvIHdvcmsgd2l0aCB0aGUgcHJvZ3Jlc3NpdmUgb25lLgorICovCisvKiBBcmd1bWVudHMgdG8gcG5nX2ltYWdlX2ZpbmlzaF9yZWFkOiAqLworCisvKiBFbmNvZGluZyBvZiBQTkcgZGF0YSAodXNlZCBieSB0aGUgY29sb3ItbWFwIGNvZGUpICovCisjICBkZWZpbmUgUF9OT1RTRVQgIDAgLyogRmlsZSBlbmNvZGluZyBub3QgeWV0IGtub3duICovCisjICBkZWZpbmUgUF9zUkdCICAgIDEgLyogOC1iaXQgZW5jb2RlZCB0byBzUkdCIGdhbW1hICovCisjICBkZWZpbmUgUF9MSU5FQVIgIDIgLyogMTYtYml0IGxpbmVhcjogbm90IGVuY29kZWQsIE5PVCBwcmUtbXVsdGlwbGllZCEgKi8KKyMgIGRlZmluZSBQX0ZJTEUgICAgMyAvKiA4LWJpdCBlbmNvZGVkIHRvIGZpbGUgZ2FtbWEsIG5vdCBzUkdCIG9yIGxpbmVhciAqLworIyAgZGVmaW5lIFBfTElORUFSOCA0IC8qIDgtYml0IGxpbmVhcjogb25seSBmcm9tIGEgZmlsZSB2YWx1ZSAqLworCisvKiBDb2xvci1tYXAgcHJvY2Vzc2luZzogYWZ0ZXIgbGlicG5nIGhhcyBydW4gb24gdGhlIFBORyBpbWFnZSBmdXJ0aGVyCisgKiBwcm9jZXNzaW5nIG1heSBiZSBuZWVkZWQgdG8gY29udmVydCB0aGUgZGF0YSB0byBjb2xvci1tYXAgaW5kaWNlcy4KKyAqLworI2RlZmluZSBQTkdfQ01BUF9OT05FICAgICAgMAorI2RlZmluZSBQTkdfQ01BUF9HQSAgICAgICAgMSAvKiBQcm9jZXNzIEdBIGRhdGEgdG8gYSBjb2xvci1tYXAgd2l0aCBhbHBoYSAqLworI2RlZmluZSBQTkdfQ01BUF9UUkFOUyAgICAgMiAvKiBQcm9jZXNzIEdBIGRhdGEgdG8gYSBiYWNrZ3JvdW5kIGluZGV4ICovCisjZGVmaW5lIFBOR19DTUFQX1JHQiAgICAgICAzIC8qIFByb2Nlc3MgUkdCIGRhdGEgKi8KKyNkZWZpbmUgUE5HX0NNQVBfUkdCX0FMUEhBIDQgLyogUHJvY2VzcyBSR0JBIGRhdGEgKi8KKworLyogVGhlIGZvbGxvd2luZyBkb2N1bWVudCB3aGVyZSB0aGUgYmFja2dyb3VuZCBpcyBmb3IgZWFjaCBwcm9jZXNzaW5nIGNhc2UuICovCisjZGVmaW5lIFBOR19DTUFQX05PTkVfQkFDS0dST1VORCAgICAgIDI1NgorI2RlZmluZSBQTkdfQ01BUF9HQV9CQUNLR1JPVU5EICAgICAgICAyMzEKKyNkZWZpbmUgUE5HX0NNQVBfVFJBTlNfQkFDS0dST1VORCAgICAgMjU0CisjZGVmaW5lIFBOR19DTUFQX1JHQl9CQUNLR1JPVU5EICAgICAgIDI1NgorI2RlZmluZSBQTkdfQ01BUF9SR0JfQUxQSEFfQkFDS0dST1VORCAyMTYKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIC8qIEFyZ3VtZW50czogKi8KKyAgIHBuZ19pbWFnZXAgaW1hZ2U7CisgICBwbmdfdm9pZHAgIGJ1ZmZlcjsKKyAgIHBuZ19pbnRfMzIgcm93X3N0cmlkZTsKKyAgIHBuZ192b2lkcCAgY29sb3JtYXA7CisgICBwbmdfY29uc3RfY29sb3JwIGJhY2tncm91bmQ7CisgICAvKiBMb2NhbCB2YXJpYWJsZXM6ICovCisgICBwbmdfdm9pZHAgICAgICAgbG9jYWxfcm93OworICAgcG5nX3ZvaWRwICAgICAgIGZpcnN0X3JvdzsKKyAgIHB0cmRpZmZfdCAgICAgICByb3dfYnl0ZXM7ICAgICAgICAgICAvKiBzdGVwIGJldHdlZW4gcm93cyAqLworICAgaW50ICAgICAgICAgICAgIGZpbGVfZW5jb2Rpbmc7ICAgICAgIC8qIEVfIHZhbHVlcyBhYm92ZSAqLworICAgcG5nX2ZpeGVkX3BvaW50IGdhbW1hX3RvX2xpbmVhcjsgICAgIC8qIEZvciBQX0ZJTEUsIHJlY2lwcm9jYWwgb2YgZ2FtbWEgKi8KKyAgIGludCAgICAgICAgICAgICBjb2xvcm1hcF9wcm9jZXNzaW5nOyAvKiBQTkdfQ01BUF8gdmFsdWVzIGFib3ZlICovCit9IHBuZ19pbWFnZV9yZWFkX2NvbnRyb2w7CisKKy8qIERvIGFsbCB0aGUgKnNhZmUqIGluaXRpYWxpemF0aW9uIC0gJ3NhZmUnIG1lYW5zIHRoYXQgcG5nX2Vycm9yIHdvbid0IGJlCisgKiBjYWxsZWQsIHNvIHNldHRpbmcgdXAgdGhlIGptcF9idWYgaXMgbm90IHJlcXVpcmVkLiAgVGhpcyBtZWFucyB0aGF0IGFueXRoaW5nCisgKiBjYWxsZWQgZnJvbSBoZXJlIG11c3QgKm5vdCogY2FsbCBwbmdfbWFsbG9jIC0gaXQgaGFzIHRvIGNhbGwgcG5nX21hbGxvY193YXJuCisgKiBpbnN0ZWFkIHNvIHRoYXQgY29udHJvbCBpcyByZXR1cm5lZCBzYWZlbHkgYmFjayB0byB0aGlzIHJvdXRpbmUuCisgKi8KK3N0YXRpYyBpbnQKK3BuZ19pbWFnZV9yZWFkX2luaXQocG5nX2ltYWdlcCBpbWFnZSkKK3sKKyAgIGlmIChpbWFnZS0+b3BhcXVlID09IE5VTEwpCisgICB7CisgICAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIGltYWdlLAorICAgICAgICAgIHBuZ19zYWZlX2Vycm9yLCBwbmdfc2FmZV93YXJuaW5nKTsKKworICAgICAgLyogQW5kIHNldCB0aGUgcmVzdCBvZiB0aGUgc3RydWN0dXJlIHRvIE5VTEwgdG8gZW5zdXJlIHRoYXQgdGhlIHZhcmlvdXMKKyAgICAgICAqIGZpZWxkcyBhcmUgY29uc2lzdGVudC4KKyAgICAgICAqLworICAgICAgbWVtc2V0KGltYWdlLCAwLCAoc2l6ZW9mICppbWFnZSkpOworICAgICAgaW1hZ2UtPnZlcnNpb24gPSBQTkdfSU1BR0VfVkVSU0lPTjsKKworICAgICAgaWYgKHBuZ19wdHIgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19pbmZvcCBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7CisKKyAgICAgICAgIGlmIChpbmZvX3B0ciAhPSBOVUxMKQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2NvbnRyb2xwIGNvbnRyb2wgPSBwbmdfdm9pZGNhc3QocG5nX2NvbnRyb2xwLAorICAgICAgICAgICAgICAgcG5nX21hbGxvY193YXJuKHBuZ19wdHIsIChzaXplb2YgKmNvbnRyb2wpKSk7CisKKyAgICAgICAgICAgIGlmIChjb250cm9sICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBtZW1zZXQoY29udHJvbCwgMCwgKHNpemVvZiAqY29udHJvbCkpOworCisgICAgICAgICAgICAgICBjb250cm9sLT5wbmdfcHRyID0gcG5nX3B0cjsKKyAgICAgICAgICAgICAgIGNvbnRyb2wtPmluZm9fcHRyID0gaW5mb19wdHI7CisgICAgICAgICAgICAgICBjb250cm9sLT5mb3Jfd3JpdGUgPSAwOworCisgICAgICAgICAgICAgICBpbWFnZS0+b3BhcXVlID0gY29udHJvbDsKKyAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBFcnJvciBjbGVhbiB1cCAqLworICAgICAgICAgICAgcG5nX2Rlc3Ryb3lfaW5mb19zdHJ1Y3QocG5nX3B0ciwgJmluZm9fcHRyKTsKKyAgICAgICAgIH0KKworICAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsIE5VTEwsIE5VTEwpOworICAgICAgfQorCisgICAgICByZXR1cm4gcG5nX2ltYWdlX2Vycm9yKGltYWdlLCAicG5nX2ltYWdlX3JlYWQ6IG91dCBvZiBtZW1vcnkiKTsKKyAgIH0KKworICAgcmV0dXJuIHBuZ19pbWFnZV9lcnJvcihpbWFnZSwgInBuZ19pbWFnZV9yZWFkOiBvcGFxdWUgcG9pbnRlciBub3QgTlVMTCIpOworfQorCisvKiBVdGlsaXR5IHRvIGZpbmQgdGhlIGJhc2UgZm9ybWF0IG9mIGEgUE5HIGZpbGUgZnJvbSBhIHBuZ19zdHJ1Y3QuICovCitzdGF0aWMgcG5nX3VpbnRfMzIKK3BuZ19pbWFnZV9mb3JtYXQocG5nX3N0cnVjdHJwIHBuZ19wdHIpCit7CisgICBwbmdfdWludF8zMiBmb3JtYXQgPSAwOworCisgICBpZiAoKHBuZ19wdHItPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikgIT0gMCkKKyAgICAgIGZvcm1hdCB8PSBQTkdfRk9STUFUX0ZMQUdfQ09MT1I7CisKKyAgIGlmICgocG5nX3B0ci0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKSAhPSAwKQorICAgICAgZm9ybWF0IHw9IFBOR19GT1JNQVRfRkxBR19BTFBIQTsKKworICAgLyogVXNlIHBuZ19wdHIgaGVyZSwgbm90IGluZm9fcHRyLCBiZWNhdXNlIGJ5IGV4YW1pbmF0aW9uIHBuZ19oYW5kbGVfdFJOUworICAgICogc2V0cyB0aGUgcG5nX3N0cnVjdCBmaWVsZHM7IHRoYXQncyBhbGwgd2UgYXJlIGludGVyZXN0ZWQgaW4gaGVyZS4gIFRoZQorICAgICogcHJlY2lzZSBpbnRlcmFjdGlvbiB3aXRoIGFuIGFwcCBjYWxsIHRvIHBuZ19zZXRfdFJOUyBhbmQgUE5HIGZpbGUgcmVhZGluZworICAgICogaXMgdW5jbGVhci4KKyAgICAqLworICAgZWxzZSBpZiAocG5nX3B0ci0+bnVtX3RyYW5zID4gMCkKKyAgICAgIGZvcm1hdCB8PSBQTkdfRk9STUFUX0ZMQUdfQUxQSEE7CisKKyAgIGlmIChwbmdfcHRyLT5iaXRfZGVwdGggPT0gMTYpCisgICAgICBmb3JtYXQgfD0gUE5HX0ZPUk1BVF9GTEFHX0xJTkVBUjsKKworICAgaWYgKChwbmdfcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfUEFMRVRURSkgIT0gMCkKKyAgICAgIGZvcm1hdCB8PSBQTkdfRk9STUFUX0ZMQUdfQ09MT1JNQVA7CisKKyAgIHJldHVybiBmb3JtYXQ7Cit9CisKKy8qIElzIHRoZSBnaXZlbiBnYW1tYSBzaWduaWZpY2FudGx5IGRpZmZlcmVudCBmcm9tIHNSR0I/ICBUaGUgdGVzdCBpcyB0aGUgc2FtZQorICogb25lIHVzZWQgaW4gcG5ncnRyYW4uYyB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8gZG8gZ2FtbWEgY29ycmVjdGlvbi4gIFRoZQorICogYXJpdGhtZXRpYyBvcHRpbWl6ZXMgdGhlIGRpdmlzaW9uIGJ5IHVzaW5nIHRoZSBmYWN0IHRoYXQgdGhlIGludmVyc2Ugb2YgdGhlCisgKiBmaWxlIHNSR0IgZ2FtbWEgaXMgMi4yCisgKi8KK3N0YXRpYyBpbnQKK3BuZ19nYW1tYV9ub3Rfc1JHQihwbmdfZml4ZWRfcG9pbnQgZykKK3sKKyAgIGlmIChnIDwgUE5HX0ZQXzEpCisgICB7CisgICAgICAvKiBBbiB1bmluaXRpYWxpemVkIGdhbW1hIGlzIGFzc3VtZWQgdG8gYmUgc1JHQiBmb3IgdGhlIHNpbXBsaWZpZWQgQVBJLiAqLworICAgICAgaWYgKGcgPT0gMCkKKyAgICAgICAgIHJldHVybiAwOworCisgICAgICByZXR1cm4gcG5nX2dhbW1hX3NpZ25pZmljYW50KChnICogMTEgKyAyKS81IC8qIGkuZS4gKjIuMiwgcm91bmRlZCAqLyk7CisgICB9CisKKyAgIHJldHVybiAxOworfQorCisvKiBEbyB0aGUgbWFpbiBib2R5IG9mIGEgJ3BuZ19pbWFnZV9iZWdpbl9yZWFkJyBmdW5jdGlvbjsgcmVhZCB0aGUgUE5HIGZpbGUKKyAqIGhlYWRlciBhbmQgZmlsbCBpbiBhbGwgdGhlIGluZm9ybWF0aW9uLiAgVGhpcyBpcyBleGVjdXRlZCBpbiBhIHNhZmUgY29udGV4dCwKKyAqIHVubGlrZSB0aGUgaW5pdCByb3V0aW5lIGFib3ZlLgorICovCitzdGF0aWMgaW50CitwbmdfaW1hZ2VfcmVhZF9oZWFkZXIocG5nX3ZvaWRwIGFyZ3VtZW50KQoreworICAgcG5nX2ltYWdlcCBpbWFnZSA9IHBuZ192b2lkY2FzdChwbmdfaW1hZ2VwLCBhcmd1bWVudCk7CisgICBwbmdfc3RydWN0cnAgcG5nX3B0ciA9IGltYWdlLT5vcGFxdWUtPnBuZ19wdHI7CisgICBwbmdfaW5mb3JwIGluZm9fcHRyID0gaW1hZ2UtPm9wYXF1ZS0+aW5mb19wdHI7CisKKyAgIHBuZ19zZXRfYmVuaWduX2Vycm9ycyhwbmdfcHRyLCAxLyp3YXJuKi8pOworICAgcG5nX3JlYWRfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7CisKKyAgIC8qIERvIHRoaXMgdGhlIGZhc3Qgd2F5OyBqdXN0IHJlYWQgZGlyZWN0bHkgb3V0IG9mIHBuZ19zdHJ1Y3QuICovCisgICBpbWFnZS0+d2lkdGggPSBwbmdfcHRyLT53aWR0aDsKKyAgIGltYWdlLT5oZWlnaHQgPSBwbmdfcHRyLT5oZWlnaHQ7CisKKyAgIHsKKyAgICAgIHBuZ191aW50XzMyIGZvcm1hdCA9IHBuZ19pbWFnZV9mb3JtYXQocG5nX3B0cik7CisKKyAgICAgIGltYWdlLT5mb3JtYXQgPSBmb3JtYXQ7CisKKyNpZmRlZiBQTkdfQ09MT1JTUEFDRV9TVVBQT1JURUQKKyAgICAgIC8qIERvZXMgdGhlIGNvbG9yc3BhY2UgbWF0Y2ggc1JHQj8gIElmIHRoZXJlIGlzIG5vIGNvbG9yIGVuZHBvaW50CisgICAgICAgKiAoY29sb3JhbnQpIGluZm9ybWF0aW9uIGFzc3VtZSB5ZXMsIG90aGVyd2lzZSByZXF1aXJlIHRoZQorICAgICAgICogJ0VORFBPSU5UU19NQVRDSFBfc1JHQicgY29sb3JzcGFjZSBmbGFnIHRvIGhhdmUgYmVlbiBzZXQuICBJZiB0aGUKKyAgICAgICAqIGNvbG9yc3BhY2UgaGFzIGJlZW4gZGV0ZXJtaW5lZCB0byBiZSBpbnZhbGlkIGlnbm9yZSBpdC4KKyAgICAgICAqLworICAgICAgaWYgKChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQ09MT1IpICE9IDAgJiYgKChwbmdfcHRyLT5jb2xvcnNwYWNlLmZsYWdzCisgICAgICAgICAmIChQTkdfQ09MT1JTUEFDRV9IQVZFX0VORFBPSU5UU3xQTkdfQ09MT1JTUEFDRV9FTkRQT0lOVFNfTUFUQ0hfc1JHQnwKKyAgICAgICAgICAgIFBOR19DT0xPUlNQQUNFX0lOVkFMSUQpKSA9PSBQTkdfQ09MT1JTUEFDRV9IQVZFX0VORFBPSU5UUykpCisgICAgICAgICBpbWFnZS0+ZmxhZ3MgfD0gUE5HX0lNQUdFX0ZMQUdfQ09MT1JTUEFDRV9OT1Rfc1JHQjsKKyNlbmRpZgorICAgfQorCisgICAvKiBXZSBuZWVkIHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIHJlZ2FyZGxlc3Mgb2YgdGhlIGZvcm1hdCB0aGUKKyAgICAqIGFwcGxpY2F0aW9uIHNldHMgaGVyZS4KKyAgICAqLworICAgeworICAgICAgcG5nX3VpbnRfMzIgY21hcF9lbnRyaWVzOworCisgICAgICBzd2l0Y2ggKHBuZ19wdHItPmNvbG9yX3R5cGUpCisgICAgICB7CisgICAgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX0dSQVk6CisgICAgICAgICAgICBjbWFwX2VudHJpZXMgPSAxVSA8PCBwbmdfcHRyLT5iaXRfZGVwdGg7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFOgorICAgICAgICAgICAgY21hcF9lbnRyaWVzID0gcG5nX3B0ci0+bnVtX3BhbGV0dGU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGNtYXBfZW50cmllcyA9IDI1NjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoY21hcF9lbnRyaWVzID4gMjU2KQorICAgICAgICAgY21hcF9lbnRyaWVzID0gMjU2OworCisgICAgICBpbWFnZS0+Y29sb3JtYXBfZW50cmllcyA9IGNtYXBfZW50cmllczsKKyAgIH0KKworICAgcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECitpbnQgUE5HQVBJCitwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX3N0ZGlvKHBuZ19pbWFnZXAgaW1hZ2UsIEZJTEUqIGZpbGUpCit7CisgICBpZiAoaW1hZ2UgIT0gTlVMTCAmJiBpbWFnZS0+dmVyc2lvbiA9PSBQTkdfSU1BR0VfVkVSU0lPTikKKyAgIHsKKyAgICAgIGlmIChmaWxlICE9IE5VTEwpCisgICAgICB7CisgICAgICAgICBpZiAocG5nX2ltYWdlX3JlYWRfaW5pdChpbWFnZSkgIT0gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoaXMgaXMgc2xpZ2h0bHkgZXZpbCwgYnV0IHBuZ19pbml0X2lvIGRvZXNuJ3QgZG8gYW55dGhpbmcgb3RoZXIKKyAgICAgICAgICAgICAqIHRoYW4gdGhpcyBhbmQgd2UgaGF2ZW4ndCBjaGFuZ2VkIHRoZSBzdGFuZGFyZCBJTyBmdW5jdGlvbnMgc28KKyAgICAgICAgICAgICAqIHRoaXMgc2F2ZXMgYSAnc2FmZScgZnVuY3Rpb24uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGltYWdlLT5vcGFxdWUtPnBuZ19wdHItPmlvX3B0ciA9IGZpbGU7CisgICAgICAgICAgICByZXR1cm4gcG5nX3NhZmVfZXhlY3V0ZShpbWFnZSwgcG5nX2ltYWdlX3JlYWRfaGVhZGVyLCBpbWFnZSk7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgICAgIHJldHVybiBwbmdfaW1hZ2VfZXJyb3IoaW1hZ2UsCisgICAgICAgICAgICAicG5nX2ltYWdlX2JlZ2luX3JlYWRfZnJvbV9zdGRpbzogaW52YWxpZCBhcmd1bWVudCIpOworICAgfQorCisgICBlbHNlIGlmIChpbWFnZSAhPSBOVUxMKQorICAgICAgcmV0dXJuIHBuZ19pbWFnZV9lcnJvcihpbWFnZSwKKyAgICAgICAgICJwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX3N0ZGlvOiBpbmNvcnJlY3QgUE5HX0lNQUdFX1ZFUlNJT04iKTsKKworICAgcmV0dXJuIDA7Cit9CisKK2ludCBQTkdBUEkKK3BuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fZmlsZShwbmdfaW1hZ2VwIGltYWdlLCBjb25zdCBjaGFyICpmaWxlX25hbWUpCit7CisgICBpZiAoaW1hZ2UgIT0gTlVMTCAmJiBpbWFnZS0+dmVyc2lvbiA9PSBQTkdfSU1BR0VfVkVSU0lPTikKKyAgIHsKKyAgICAgIGlmIChmaWxlX25hbWUgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIEZJTEUgKmZwID0gZm9wZW4oZmlsZV9uYW1lLCAicmIiKTsKKworICAgICAgICAgaWYgKGZwICE9IE5VTEwpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAocG5nX2ltYWdlX3JlYWRfaW5pdChpbWFnZSkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGltYWdlLT5vcGFxdWUtPnBuZ19wdHItPmlvX3B0ciA9IGZwOworICAgICAgICAgICAgICAgaW1hZ2UtPm9wYXF1ZS0+b3duZWRfZmlsZSA9IDE7CisgICAgICAgICAgICAgICByZXR1cm4gcG5nX3NhZmVfZXhlY3V0ZShpbWFnZSwgcG5nX2ltYWdlX3JlYWRfaGVhZGVyLCBpbWFnZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIENsZWFuIHVwOiBqdXN0IHRoZSBvcGVuZWQgZmlsZS4gKi8KKyAgICAgICAgICAgICh2b2lkKWZjbG9zZShmcCk7CisgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBwbmdfaW1hZ2VfZXJyb3IoaW1hZ2UsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgICAgIHJldHVybiBwbmdfaW1hZ2VfZXJyb3IoaW1hZ2UsCisgICAgICAgICAgICAicG5nX2ltYWdlX2JlZ2luX3JlYWRfZnJvbV9maWxlOiBpbnZhbGlkIGFyZ3VtZW50Iik7CisgICB9CisKKyAgIGVsc2UgaWYgKGltYWdlICE9IE5VTEwpCisgICAgICByZXR1cm4gcG5nX2ltYWdlX2Vycm9yKGltYWdlLAorICAgICAgICAgInBuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fZmlsZTogaW5jb3JyZWN0IFBOR19JTUFHRV9WRVJTSU9OIik7CisKKyAgIHJldHVybiAwOworfQorI2VuZGlmIC8qIFNURElPICovCisKK3N0YXRpYyB2b2lkIFBOR0NCQVBJCitwbmdfaW1hZ2VfbWVtb3J5X3JlYWQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIG91dCwgcG5nX3NpemVfdCBuZWVkKQoreworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCkKKyAgIHsKKyAgICAgIHBuZ19pbWFnZXAgaW1hZ2UgPSBwbmdfdm9pZGNhc3QocG5nX2ltYWdlcCwgcG5nX3B0ci0+aW9fcHRyKTsKKyAgICAgIGlmIChpbWFnZSAhPSBOVUxMKQorICAgICAgeworICAgICAgICAgcG5nX2NvbnRyb2xwIGNwID0gaW1hZ2UtPm9wYXF1ZTsKKyAgICAgICAgIGlmIChjcCAhPSBOVUxMKQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2NvbnN0X2J5dGVwIG1lbW9yeSA9IGNwLT5tZW1vcnk7CisgICAgICAgICAgICBwbmdfc2l6ZV90IHNpemUgPSBjcC0+c2l6ZTsKKworICAgICAgICAgICAgaWYgKG1lbW9yeSAhPSBOVUxMICYmIHNpemUgPj0gbmVlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIG1lbWNweShvdXQsIG1lbW9yeSwgbmVlZCk7CisgICAgICAgICAgICAgICBjcC0+bWVtb3J5ID0gbWVtb3J5ICsgbmVlZDsKKyAgICAgICAgICAgICAgIGNwLT5zaXplID0gc2l6ZSAtIG5lZWQ7CisgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAicmVhZCBiZXlvbmQgZW5kIG9mIGRhdGEiKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJpbnZhbGlkIG1lbW9yeSByZWFkIik7CisgICB9Cit9CisKK2ludCBQTkdBUEkgcG5nX2ltYWdlX2JlZ2luX3JlYWRfZnJvbV9tZW1vcnkocG5nX2ltYWdlcCBpbWFnZSwKKyAgIHBuZ19jb25zdF92b2lkcCBtZW1vcnksIHBuZ19zaXplX3Qgc2l6ZSkKK3sKKyAgIGlmIChpbWFnZSAhPSBOVUxMICYmIGltYWdlLT52ZXJzaW9uID09IFBOR19JTUFHRV9WRVJTSU9OKQorICAgeworICAgICAgaWYgKG1lbW9yeSAhPSBOVUxMICYmIHNpemUgPiAwKQorICAgICAgeworICAgICAgICAgaWYgKHBuZ19pbWFnZV9yZWFkX2luaXQoaW1hZ2UpICE9IDApCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBOb3cgc2V0IHRoZSBJTyBmdW5jdGlvbnMgdG8gcmVhZCBmcm9tIHRoZSBtZW1vcnkgYnVmZmVyIGFuZAorICAgICAgICAgICAgICogc3RvcmUgaXQgaW50byBpb19wdHIuICBBZ2FpbiBkbyB0aGlzIGluLXBsYWNlIHRvIGF2b2lkIGNhbGxpbmcgYQorICAgICAgICAgICAgICogbGlicG5nIGZ1bmN0aW9uIHRoYXQgcmVxdWlyZXMgZXJyb3IgaGFuZGxpbmcuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGltYWdlLT5vcGFxdWUtPm1lbW9yeSA9IHBuZ192b2lkY2FzdChwbmdfY29uc3RfYnl0ZXAsIG1lbW9yeSk7CisgICAgICAgICAgICBpbWFnZS0+b3BhcXVlLT5zaXplID0gc2l6ZTsKKyAgICAgICAgICAgIGltYWdlLT5vcGFxdWUtPnBuZ19wdHItPmlvX3B0ciA9IGltYWdlOworICAgICAgICAgICAgaW1hZ2UtPm9wYXF1ZS0+cG5nX3B0ci0+cmVhZF9kYXRhX2ZuID0gcG5nX2ltYWdlX21lbW9yeV9yZWFkOworCisgICAgICAgICAgICByZXR1cm4gcG5nX3NhZmVfZXhlY3V0ZShpbWFnZSwgcG5nX2ltYWdlX3JlYWRfaGVhZGVyLCBpbWFnZSk7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgICAgIHJldHVybiBwbmdfaW1hZ2VfZXJyb3IoaW1hZ2UsCisgICAgICAgICAgICAicG5nX2ltYWdlX2JlZ2luX3JlYWRfZnJvbV9tZW1vcnk6IGludmFsaWQgYXJndW1lbnQiKTsKKyAgIH0KKworICAgZWxzZSBpZiAoaW1hZ2UgIT0gTlVMTCkKKyAgICAgIHJldHVybiBwbmdfaW1hZ2VfZXJyb3IoaW1hZ2UsCisgICAgICAgICAicG5nX2ltYWdlX2JlZ2luX3JlYWRfZnJvbV9tZW1vcnk6IGluY29ycmVjdCBQTkdfSU1BR0VfVkVSU0lPTiIpOworCisgICByZXR1cm4gMDsKK30KKworLyogVXRpbGl0eSBmdW5jdGlvbiB0byBza2lwIGNodW5rcyB0aGF0IGFyZSBub3QgdXNlZCBieSB0aGUgc2ltcGxpZmllZCBpbWFnZQorICogcmVhZCBmdW5jdGlvbnMgYW5kIGFuIGFwcHJvcHJpYXRlIG1hY3JvIHRvIGNhbGwgaXQuCisgKi8KKyNpZmRlZiBQTkdfSEFORExFX0FTX1VOS05PV05fU1VQUE9SVEVECitzdGF0aWMgdm9pZAorcG5nX2ltYWdlX3NraXBfdW51c2VkX2NodW5rcyhwbmdfc3RydWN0cnAgcG5nX3B0cikKK3sKKyAgIC8qIFByZXBhcmUgdGhlIHJlYWRlciB0byBpZ25vcmUgYWxsIHJlY29nbml6ZWQgY2h1bmtzIHdob3NlIGRhdGEgd2lsbCBub3QKKyAgICAqIGJlIHVzZWQsIGkuZS4sIGFsbCBjaHVua3MgcmVjb2duaXplZCBieSBsaWJwbmcgZXhjZXB0IGZvciB0aG9zZQorICAgICogaW52b2x2ZWQgaW4gYmFzaWMgaW1hZ2UgcmVhZGluZzoKKyAgICAqCisgICAgKiAgICBJSERSLCBQTFRFLCBJREFULCBJRU5ECisgICAgKgorICAgICogT3IgaW1hZ2UgZGF0YSBoYW5kbGluZzoKKyAgICAqCisgICAgKiAgICB0Uk5TLCBiS0dELCBnQU1BLCBjSFJNLCBzUkdCLCBbaUNDUF0gYW5kIHNCSVQuCisgICAgKgorICAgICogVGhpcyBwcm92aWRlcyBhIHNtYWxsIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGFuZCBlbGltaW5hdGVzIGFueQorICAgICogcG90ZW50aWFsIHZ1bG5lcmFiaWxpdHkgdG8gc2VjdXJpdHkgcHJvYmxlbXMgaW4gdGhlIHVudXNlZCBjaHVua3MuCisgICAgKgorICAgICogQXQgcHJlc2VudCB0aGUgaUNDUCBjaHVuayBkYXRhIGlzbid0IHVzZWQsIHNvIGlDQ1AgY2h1bmsgY2FuIGJlIGlnbm9yZWQKKyAgICAqIHRvby4gIFRoaXMgYWxsb3dzIHRoZSBzaW1wbGlmaWVkIEFQSSB0byBiZSBjb21waWxlZCB3aXRob3V0IGlDQ1Agc3VwcG9ydCwKKyAgICAqIGhvd2V2ZXIgaWYgdGhlIHN1cHBvcnQgaXMgdGhlcmUgdGhlIGNodW5rIGlzIHN0aWxsIGNoZWNrZWQgdG8gZGV0ZWN0CisgICAgKiBlcnJvcnMgKHdoaWNoIGFyZSB1bmZvcnR1bmF0ZWx5IHF1aXRlIGNvbW1vbi4pCisgICAgKi8KKyAgIHsKKyAgICAgICAgIHN0YXRpYyBQTkdfQ09OU1QgcG5nX2J5dGUgY2h1bmtzX3RvX3Byb2Nlc3NbXSA9IHsKKyAgICAgICAgICAgIDk4LCAgNzUsICA3MSwgIDY4LCAnXDAnLCAgLyogYktHRCAqLworICAgICAgICAgICAgOTksICA3MiwgIDgyLCAgNzcsICdcMCcsICAvKiBjSFJNICovCisgICAgICAgICAgIDEwMywgIDY1LCAgNzcsICA2NSwgJ1wwJywgIC8qIGdBTUEgKi8KKyMgICAgICAgIGlmZGVmIFBOR19SRUFEX2lDQ1BfU1VQUE9SVEVECisgICAgICAgICAgIDEwNSwgIDY3LCAgNjcsICA4MCwgJ1wwJywgIC8qIGlDQ1AgKi8KKyMgICAgICAgIGVuZGlmCisgICAgICAgICAgIDExNSwgIDY2LCAgNzMsICA4NCwgJ1wwJywgIC8qIHNCSVQgKi8KKyAgICAgICAgICAgMTE1LCAgODIsICA3MSwgIDY2LCAnXDAnLCAgLyogc1JHQiAqLworICAgICAgICAgICB9OworCisgICAgICAgLyogSWdub3JlIHVua25vd24gY2h1bmtzIGFuZCBhbGwgb3RoZXIgY2h1bmtzIGV4Y2VwdCBmb3IgdGhlCisgICAgICAgICogSUhEUiwgUExURSwgdFJOUywgSURBVCwgYW5kIElFTkQgY2h1bmtzLgorICAgICAgICAqLworICAgICAgIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyhwbmdfcHRyLCBQTkdfSEFORExFX0NIVU5LX05FVkVSLAorICAgICAgICAgTlVMTCwgLTEpOworCisgICAgICAgLyogQnV0IGRvIG5vdCBpZ25vcmUgaW1hZ2UgZGF0YSBoYW5kbGluZyBjaHVua3MgKi8KKyAgICAgICBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MocG5nX3B0ciwgUE5HX0hBTkRMRV9DSFVOS19BU19ERUZBVUxULAorICAgICAgICAgY2h1bmtzX3RvX3Byb2Nlc3MsIChpbnQpLypTQUZFKi8oc2l6ZW9mIGNodW5rc190b19wcm9jZXNzKS81KTsKKyAgICB9Cit9CisKKyMgIGRlZmluZSBQTkdfU0tJUF9DSFVOS1MocCkgcG5nX2ltYWdlX3NraXBfdW51c2VkX2NodW5rcyhwKQorI2Vsc2UKKyMgIGRlZmluZSBQTkdfU0tJUF9DSFVOS1MocCkgKCh2b2lkKTApCisjZW5kaWYgLyogSEFORExFX0FTX1VOS05PV04gKi8KKworLyogVGhlIGZvbGxvd2luZyBtYWNybyBnaXZlcyB0aGUgZXhhY3Qgcm91bmRlZCBhbnN3ZXIgZm9yIGFsbCB2YWx1ZXMgaW4gdGhlCisgKiByYW5nZSAwLi4yNTUgKGl0IGFjdHVhbGx5IGRpdmlkZXMgYnkgNTEuMiwgYnV0IHRoZSByb3VuZGluZyBzdGlsbCBnZW5lcmF0ZXMKKyAqIHRoZSBjb3JyZWN0IG51bWJlcnMgMC4uNQorICovCisjZGVmaW5lIFBOR19ESVY1MSh2OCkgKCgodjgpICogNSArIDEzMCkgPj4gOCkKKworLyogVXRpbGl0eSBmdW5jdGlvbnMgdG8gbWFrZSBwYXJ0aWN1bGFyIGNvbG9yLW1hcHMgKi8KK3N0YXRpYyB2b2lkCitzZXRfZmlsZV9lbmNvZGluZyhwbmdfaW1hZ2VfcmVhZF9jb250cm9sICpkaXNwbGF5KQoreworICAgcG5nX2ZpeGVkX3BvaW50IGcgPSBkaXNwbGF5LT5pbWFnZS0+b3BhcXVlLT5wbmdfcHRyLT5jb2xvcnNwYWNlLmdhbW1hOworICAgaWYgKHBuZ19nYW1tYV9zaWduaWZpY2FudChnKSAhPSAwKQorICAgeworICAgICAgaWYgKHBuZ19nYW1tYV9ub3Rfc1JHQihnKSAhPSAwKQorICAgICAgeworICAgICAgICAgZGlzcGxheS0+ZmlsZV9lbmNvZGluZyA9IFBfRklMRTsKKyAgICAgICAgIGRpc3BsYXktPmdhbW1hX3RvX2xpbmVhciA9IHBuZ19yZWNpcHJvY2FsKGcpOworICAgICAgfQorCisgICAgICBlbHNlCisgICAgICAgICBkaXNwbGF5LT5maWxlX2VuY29kaW5nID0gUF9zUkdCOworICAgfQorCisgICBlbHNlCisgICAgICBkaXNwbGF5LT5maWxlX2VuY29kaW5nID0gUF9MSU5FQVI4OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CitkZWNvZGVfZ2FtbWEocG5nX2ltYWdlX3JlYWRfY29udHJvbCAqZGlzcGxheSwgcG5nX3VpbnRfMzIgdmFsdWUsIGludCBlbmNvZGluZykKK3sKKyAgIGlmIChlbmNvZGluZyA9PSBQX0ZJTEUpIC8qIGRvdWJsZSBjaGVjayAqLworICAgICAgZW5jb2RpbmcgPSBkaXNwbGF5LT5maWxlX2VuY29kaW5nOworCisgICBpZiAoZW5jb2RpbmcgPT0gUF9OT1RTRVQpIC8qIG11c3QgYmUgdGhlIGZpbGUgZW5jb2RpbmcgKi8KKyAgIHsKKyAgICAgIHNldF9maWxlX2VuY29kaW5nKGRpc3BsYXkpOworICAgICAgZW5jb2RpbmcgPSBkaXNwbGF5LT5maWxlX2VuY29kaW5nOworICAgfQorCisgICBzd2l0Y2ggKGVuY29kaW5nKQorICAgeworICAgICAgY2FzZSBQX0ZJTEU6CisgICAgICAgICB2YWx1ZSA9IHBuZ19nYW1tYV8xNmJpdF9jb3JyZWN0KHZhbHVlKjI1NywgZGlzcGxheS0+Z2FtbWFfdG9fbGluZWFyKTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBfc1JHQjoKKyAgICAgICAgIHZhbHVlID0gcG5nX3NSR0JfdGFibGVbdmFsdWVdOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUF9MSU5FQVI6CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBQX0xJTkVBUjg6CisgICAgICAgICB2YWx1ZSAqPSAyNTc7CisgICAgICAgICBicmVhazsKKworI2lmZGVmIF9fR05VQ19fCisgICAgICBkZWZhdWx0OgorICAgICAgICAgcG5nX2Vycm9yKGRpc3BsYXktPmltYWdlLT5vcGFxdWUtPnBuZ19wdHIsCisgICAgICAgICAgICAidW5leHBlY3RlZCBlbmNvZGluZyAoaW50ZXJuYWwgZXJyb3IpIik7CisjZW5kaWYKKyAgIH0KKworICAgcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgcG5nX3VpbnRfMzIKK3BuZ19jb2xvcm1hcF9jb21wb3NlKHBuZ19pbWFnZV9yZWFkX2NvbnRyb2wgKmRpc3BsYXksCisgICBwbmdfdWludF8zMiBmb3JlZ3JvdW5kLCBpbnQgZm9yZWdyb3VuZF9lbmNvZGluZywgcG5nX3VpbnRfMzIgYWxwaGEsCisgICBwbmdfdWludF8zMiBiYWNrZ3JvdW5kLCBpbnQgZW5jb2RpbmcpCit7CisgICAvKiBUaGUgZmlsZSB2YWx1ZSBpcyBjb21wb3NlZCBvbiB0aGUgYmFja2dyb3VuZCwgdGhlIGJhY2tncm91bmQgaGFzIHRoZSBnaXZlbgorICAgICogZW5jb2RpbmcgYW5kIHNvIGRvZXMgdGhlIHJlc3VsdCwgdGhlIGZpbGUgaXMgZW5jb2RlZCB3aXRoIFBfRklMRSBhbmQgdGhlCisgICAgKiBmaWxlIGFuZCBhbHBoYSBhcmUgOC1iaXQgdmFsdWVzLiAgVGhlIChvdXRwdXQpIGVuY29kaW5nIHdpbGwgYWx3YXlzIGJlCisgICAgKiBQX0xJTkVBUiBvciBQX3NSR0IuCisgICAgKi8KKyAgIHBuZ191aW50XzMyIGYgPSBkZWNvZGVfZ2FtbWEoZGlzcGxheSwgZm9yZWdyb3VuZCwgZm9yZWdyb3VuZF9lbmNvZGluZyk7CisgICBwbmdfdWludF8zMiBiID0gZGVjb2RlX2dhbW1hKGRpc3BsYXksIGJhY2tncm91bmQsIGVuY29kaW5nKTsKKworICAgLyogVGhlIGFscGhhIGlzIGFsd2F5cyBhbiA4LWJpdCB2YWx1ZSAoaXQgY29tZXMgZnJvbSB0aGUgcGFsZXR0ZSksIHRoZSB2YWx1ZQorICAgICogc2NhbGVkIGJ5IDI1NSBpcyB3aGF0IFBOR19zUkdCX0ZST01fTElORUFSIHJlcXVpcmVzLgorICAgICovCisgICBmID0gZiAqIGFscGhhICsgYiAqICgyNTUtYWxwaGEpOworCisgICBpZiAoZW5jb2RpbmcgPT0gUF9MSU5FQVIpCisgICB7CisgICAgICAvKiBTY2FsZSB0byA2NTUzNTsgZGl2aWRlIGJ5IDI1NSwgYXBwcm94aW1hdGVseSAoaW4gZmFjdCB0aGlzIGlzIGV4dHJlbWVseQorICAgICAgICogYWNjdXJhdGUsIGl0IGRpdmlkZXMgYnkgMjU1LjAwMDAwMDA1OTM3MTgxNDE0NTU2LCB3aXRoIG5vIG92ZXJmbG93LikKKyAgICAgICAqLworICAgICAgZiAqPSAyNTc7IC8qIE5vdyBzY2FsZWQgYnkgNjU1MzUgKi8KKyAgICAgIGYgKz0gZiA+PiAxNjsKKyAgICAgIGYgPSAoZiszMjc2OCkgPj4gMTY7CisgICB9CisKKyAgIGVsc2UgLyogUF9zUkdCICovCisgICAgICBmID0gUE5HX3NSR0JfRlJPTV9MSU5FQVIoZik7CisKKyAgIHJldHVybiBmOworfQorCisvKiBOT1RFOiBQX0xJTkVBUiB2YWx1ZXMgdG8gdGhpcyByb3V0aW5lIG11c3QgYmUgMTYtYml0LCBidXQgUF9GSUxFIHZhbHVlcyBtdXN0CisgKiBiZSA4LWJpdC4KKyAqLworc3RhdGljIHZvaWQKK3BuZ19jcmVhdGVfY29sb3JtYXBfZW50cnkocG5nX2ltYWdlX3JlYWRfY29udHJvbCAqZGlzcGxheSwKKyAgIHBuZ191aW50XzMyIGlwLCBwbmdfdWludF8zMiByZWQsIHBuZ191aW50XzMyIGdyZWVuLCBwbmdfdWludF8zMiBibHVlLAorICAgcG5nX3VpbnRfMzIgYWxwaGEsIGludCBlbmNvZGluZykKK3sKKyAgIHBuZ19pbWFnZXAgaW1hZ2UgPSBkaXNwbGF5LT5pbWFnZTsKKyAgIGNvbnN0IGludCBvdXRwdXRfZW5jb2RpbmcgPSAoaW1hZ2UtPmZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19MSU5FQVIpICE9IDAgPworICAgICAgUF9MSU5FQVIgOiBQX3NSR0I7CisgICBjb25zdCBpbnQgY29udmVydF90b19ZID0gKGltYWdlLT5mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQ09MT1IpID09IDAgJiYKKyAgICAgIChyZWQgIT0gZ3JlZW4gfHwgZ3JlZW4gIT0gYmx1ZSk7CisKKyAgIGlmIChpcCA+IDI1NSkKKyAgICAgIHBuZ19lcnJvcihpbWFnZS0+b3BhcXVlLT5wbmdfcHRyLCAiY29sb3ItbWFwIGluZGV4IG91dCBvZiByYW5nZSIpOworCisgICAvKiBVcGRhdGUgdGhlIGNhY2hlIHdpdGggd2hldGhlciB0aGUgZmlsZSBnYW1tYSBpcyBzaWduaWZpY2FudGx5IGRpZmZlcmVudAorICAgICogZnJvbSBzUkdCLgorICAgICovCisgICBpZiAoZW5jb2RpbmcgPT0gUF9GSUxFKQorICAgeworICAgICAgaWYgKGRpc3BsYXktPmZpbGVfZW5jb2RpbmcgPT0gUF9OT1RTRVQpCisgICAgICAgICBzZXRfZmlsZV9lbmNvZGluZyhkaXNwbGF5KTsKKworICAgICAgLyogTm90ZSB0aGF0IHRoZSBjYWNoZWQgdmFsdWUgbWF5IGJlIFBfRklMRSB0b28sIGJ1dCBpZiBpdCBpcyB0aGVuIHRoZQorICAgICAgICogZ2FtbWFfdG9fbGluZWFyIG1lbWJlciBoYXMgYmVlbiBzZXQuCisgICAgICAgKi8KKyAgICAgIGVuY29kaW5nID0gZGlzcGxheS0+ZmlsZV9lbmNvZGluZzsKKyAgIH0KKworICAgaWYgKGVuY29kaW5nID09IFBfRklMRSkKKyAgIHsKKyAgICAgIHBuZ19maXhlZF9wb2ludCBnID0gZGlzcGxheS0+Z2FtbWFfdG9fbGluZWFyOworCisgICAgICByZWQgPSBwbmdfZ2FtbWFfMTZiaXRfY29ycmVjdChyZWQqMjU3LCBnKTsKKyAgICAgIGdyZWVuID0gcG5nX2dhbW1hXzE2Yml0X2NvcnJlY3QoZ3JlZW4qMjU3LCBnKTsKKyAgICAgIGJsdWUgPSBwbmdfZ2FtbWFfMTZiaXRfY29ycmVjdChibHVlKjI1NywgZyk7CisKKyAgICAgIGlmIChjb252ZXJ0X3RvX1kgIT0gMCB8fCBvdXRwdXRfZW5jb2RpbmcgPT0gUF9MSU5FQVIpCisgICAgICB7CisgICAgICAgICBhbHBoYSAqPSAyNTc7CisgICAgICAgICBlbmNvZGluZyA9IFBfTElORUFSOworICAgICAgfQorCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICByZWQgPSBQTkdfc1JHQl9GUk9NX0xJTkVBUihyZWQgKiAyNTUpOworICAgICAgICAgZ3JlZW4gPSBQTkdfc1JHQl9GUk9NX0xJTkVBUihncmVlbiAqIDI1NSk7CisgICAgICAgICBibHVlID0gUE5HX3NSR0JfRlJPTV9MSU5FQVIoYmx1ZSAqIDI1NSk7CisgICAgICAgICBlbmNvZGluZyA9IFBfc1JHQjsKKyAgICAgIH0KKyAgIH0KKworICAgZWxzZSBpZiAoZW5jb2RpbmcgPT0gUF9MSU5FQVI4KQorICAgeworICAgICAgLyogVGhpcyBlbmNvZGluZyBvY2N1cnMgcXVpdGUgZnJlcXVlbnRseSBpbiB0ZXN0IGNhc2VzIGJlY2F1c2UgUG5nU3VpdGUKKyAgICAgICAqIGluY2x1ZGVzIGEgZ0FNQSAxLjAgY2h1bmsgd2l0aCBtb3N0IGltYWdlcy4KKyAgICAgICAqLworICAgICAgcmVkICo9IDI1NzsKKyAgICAgIGdyZWVuICo9IDI1NzsKKyAgICAgIGJsdWUgKj0gMjU3OworICAgICAgYWxwaGEgKj0gMjU3OworICAgICAgZW5jb2RpbmcgPSBQX0xJTkVBUjsKKyAgIH0KKworICAgZWxzZSBpZiAoZW5jb2RpbmcgPT0gUF9zUkdCICYmCisgICAgICAgKGNvbnZlcnRfdG9fWSAgIT0gMCB8fCBvdXRwdXRfZW5jb2RpbmcgPT0gUF9MSU5FQVIpKQorICAgeworICAgICAgLyogVGhlIHZhbHVlcyBhcmUgOC1iaXQgc1JHQiB2YWx1ZXMsIGJ1dCBtdXN0IGJlIGNvbnZlcnRlZCB0byAxNi1iaXQKKyAgICAgICAqIGxpbmVhci4KKyAgICAgICAqLworICAgICAgcmVkID0gcG5nX3NSR0JfdGFibGVbcmVkXTsKKyAgICAgIGdyZWVuID0gcG5nX3NSR0JfdGFibGVbZ3JlZW5dOworICAgICAgYmx1ZSA9IHBuZ19zUkdCX3RhYmxlW2JsdWVdOworICAgICAgYWxwaGEgKj0gMjU3OworICAgICAgZW5jb2RpbmcgPSBQX0xJTkVBUjsKKyAgIH0KKworICAgLyogVGhpcyBpcyBzZXQgaWYgdGhlIGNvbG9yIGlzbid0IGdyYXkgYnV0IHRoZSBvdXRwdXQgaXMuICovCisgICBpZiAoZW5jb2RpbmcgPT0gUF9MSU5FQVIpCisgICB7CisgICAgICBpZiAoY29udmVydF90b19ZICE9IDApCisgICAgICB7CisgICAgICAgICAvKiBOT1RFOiB0aGVzZSB2YWx1ZXMgYXJlIGNvcGllZCBmcm9tIHBuZ19kb19yZ2JfdG9fZ3JheSAqLworICAgICAgICAgcG5nX3VpbnRfMzIgeSA9IChwbmdfdWludF8zMik2OTY4ICogcmVkICArIChwbmdfdWludF8zMikyMzQzNCAqIGdyZWVuICsKKyAgICAgICAgICAgIChwbmdfdWludF8zMikyMzY2ICogYmx1ZTsKKworICAgICAgICAgaWYgKG91dHB1dF9lbmNvZGluZyA9PSBQX0xJTkVBUikKKyAgICAgICAgICAgIHkgPSAoeSArIDE2Mzg0KSA+PiAxNTsKKworICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgLyogeSBpcyBzY2FsZWQgYnkgMzI3NjgsIHdlIG5lZWQgaXQgc2NhbGVkIGJ5IDI1NTogKi8KKyAgICAgICAgICAgIHkgPSAoeSArIDEyOCkgPj4gODsKKyAgICAgICAgICAgIHkgKj0gMjU1OworICAgICAgICAgICAgeSA9IFBOR19zUkdCX0ZST01fTElORUFSKCh5ICsgNjQpID4+IDcpOworICAgICAgICAgICAgYWxwaGEgPSBQTkdfRElWMjU3KGFscGhhKTsKKyAgICAgICAgICAgIGVuY29kaW5nID0gUF9zUkdCOworICAgICAgICAgfQorCisgICAgICAgICBibHVlID0gcmVkID0gZ3JlZW4gPSB5OworICAgICAgfQorCisgICAgICBlbHNlIGlmIChvdXRwdXRfZW5jb2RpbmcgPT0gUF9zUkdCKQorICAgICAgeworICAgICAgICAgcmVkID0gUE5HX3NSR0JfRlJPTV9MSU5FQVIocmVkICogMjU1KTsKKyAgICAgICAgIGdyZWVuID0gUE5HX3NSR0JfRlJPTV9MSU5FQVIoZ3JlZW4gKiAyNTUpOworICAgICAgICAgYmx1ZSA9IFBOR19zUkdCX0ZST01fTElORUFSKGJsdWUgKiAyNTUpOworICAgICAgICAgYWxwaGEgPSBQTkdfRElWMjU3KGFscGhhKTsKKyAgICAgICAgIGVuY29kaW5nID0gUF9zUkdCOworICAgICAgfQorICAgfQorCisgICBpZiAoZW5jb2RpbmcgIT0gb3V0cHV0X2VuY29kaW5nKQorICAgICAgcG5nX2Vycm9yKGltYWdlLT5vcGFxdWUtPnBuZ19wdHIsICJiYWQgZW5jb2RpbmcgKGludGVybmFsIGVycm9yKSIpOworCisgICAvKiBTdG9yZSB0aGUgdmFsdWUuICovCisgICB7CisjICAgICBpZmRlZiBQTkdfRk9STUFUX0FGSVJTVF9TVVBQT1JURUQKKyAgICAgICAgIGNvbnN0IGludCBhZmlyc3QgPSAoaW1hZ2UtPmZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BRklSU1QpICE9IDAgJiYKKyAgICAgICAgICAgIChpbWFnZS0+Zm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FMUEhBKSAhPSAwOworIyAgICAgZWxzZQorIyAgICAgICAgZGVmaW5lIGFmaXJzdCAwCisjICAgICBlbmRpZgorIyAgICAgaWZkZWYgUE5HX0ZPUk1BVF9CR1JfU1VQUE9SVEVECisgICAgICAgICBjb25zdCBpbnQgYmdyID0gKGltYWdlLT5mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQkdSKSAhPSAwID8gMiA6IDA7CisjICAgICBlbHNlCisjICAgICAgICBkZWZpbmUgYmdyIDAKKyMgICAgIGVuZGlmCisKKyAgICAgIGlmIChvdXRwdXRfZW5jb2RpbmcgPT0gUF9MSU5FQVIpCisgICAgICB7CisgICAgICAgICBwbmdfdWludF8xNnAgZW50cnkgPSBwbmdfdm9pZGNhc3QocG5nX3VpbnRfMTZwLCBkaXNwbGF5LT5jb2xvcm1hcCk7CisKKyAgICAgICAgIGVudHJ5ICs9IGlwICogUE5HX0lNQUdFX1NBTVBMRV9DSEFOTkVMUyhpbWFnZS0+Zm9ybWF0KTsKKworICAgICAgICAgLyogVGhlIGxpbmVhciAxNi1iaXQgdmFsdWVzIG11c3QgYmUgcHJlLW11bHRpcGxpZWQgYnkgdGhlIGFscGhhIGNoYW5uZWwKKyAgICAgICAgICAqIHZhbHVlLCBpZiBsZXNzIHRoYW4gNjU1MzUgKHRoaXMgaXMsIGVmZmVjdGl2ZWx5LCBjb21wb3NpdGUgb24gYmxhY2sKKyAgICAgICAgICAqIGlmIHRoZSBhbHBoYSBjaGFubmVsIGlzIHJlbW92ZWQuKQorICAgICAgICAgICovCisgICAgICAgICBzd2l0Y2ggKFBOR19JTUFHRV9TQU1QTEVfQ0hBTk5FTFMoaW1hZ2UtPmZvcm1hdCkpCisgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICBlbnRyeVthZmlyc3QgPyAwIDogM10gPSAocG5nX3VpbnRfMTYpYWxwaGE7CisgICAgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgaWYgKGFscGhhIDwgNjU1MzUpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoYWxwaGEgPiAwKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgYmx1ZSA9IChibHVlICogYWxwaGEgKyAzMjc2N1UpLzY1NTM1VTsKKyAgICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKGdyZWVuICogYWxwaGEgKyAzMjc2N1UpLzY1NTM1VTsKKyAgICAgICAgICAgICAgICAgICAgIHJlZCA9IChyZWQgKiBhbHBoYSArIDMyNzY3VSkvNjU1MzVVOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICByZWQgPSBncmVlbiA9IGJsdWUgPSAwOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZW50cnlbYWZpcnN0ICsgKDIgXiBiZ3IpXSA9IChwbmdfdWludF8xNilibHVlOworICAgICAgICAgICAgICAgZW50cnlbYWZpcnN0ICsgMV0gPSAocG5nX3VpbnRfMTYpZ3JlZW47CisgICAgICAgICAgICAgICBlbnRyeVthZmlyc3QgKyBiZ3JdID0gKHBuZ191aW50XzE2KXJlZDsKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICBlbnRyeVsxIF4gYWZpcnN0XSA9IChwbmdfdWludF8xNilhbHBoYTsKKyAgICAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLworCisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICBpZiAoYWxwaGEgPCA2NTUzNSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmIChhbHBoYSA+IDApCisgICAgICAgICAgICAgICAgICAgICBncmVlbiA9IChncmVlbiAqIGFscGhhICsgMzI3NjdVKS82NTUzNVU7CisKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgIGdyZWVuID0gMDsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVudHJ5W2FmaXJzdF0gPSAocG5nX3VpbnRfMTYpZ3JlZW47CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBlbHNlIC8qIG91dHB1dCBlbmNvZGluZyBpcyBQX3NSR0IgKi8KKyAgICAgIHsKKyAgICAgICAgIHBuZ19ieXRlcCBlbnRyeSA9IHBuZ192b2lkY2FzdChwbmdfYnl0ZXAsIGRpc3BsYXktPmNvbG9ybWFwKTsKKworICAgICAgICAgZW50cnkgKz0gaXAgKiBQTkdfSU1BR0VfU0FNUExFX0NIQU5ORUxTKGltYWdlLT5mb3JtYXQpOworCisgICAgICAgICBzd2l0Y2ggKFBOR19JTUFHRV9TQU1QTEVfQ0hBTk5FTFMoaW1hZ2UtPmZvcm1hdCkpCisgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICBlbnRyeVthZmlyc3QgPyAwIDogM10gPSAocG5nX2J5dGUpYWxwaGE7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICBlbnRyeVthZmlyc3QgKyAoMiBeIGJncildID0gKHBuZ19ieXRlKWJsdWU7CisgICAgICAgICAgICAgICBlbnRyeVthZmlyc3QgKyAxXSA9IChwbmdfYnl0ZSlncmVlbjsKKyAgICAgICAgICAgICAgIGVudHJ5W2FmaXJzdCArIGJncl0gPSAocG5nX2J5dGUpcmVkOworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgIGVudHJ5WzEgXiBhZmlyc3RdID0gKHBuZ19ieXRlKWFscGhhOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgZW50cnlbYWZpcnN0XSA9IChwbmdfYnl0ZSlncmVlbjsKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICB9CisKKyMgICAgIGlmZGVmIGFmaXJzdAorIyAgICAgICAgdW5kZWYgYWZpcnN0CisjICAgICBlbmRpZgorIyAgICAgaWZkZWYgYmdyCisjICAgICAgICB1bmRlZiBiZ3IKKyMgICAgIGVuZGlmCisgICB9Cit9CisKK3N0YXRpYyBpbnQKK21ha2VfZ3JheV9maWxlX2NvbG9ybWFwKHBuZ19pbWFnZV9yZWFkX2NvbnRyb2wgKmRpc3BsYXkpCit7CisgICB1bnNpZ25lZCBpbnQgaTsKKworICAgZm9yIChpPTA7IGk8MjU2OyArK2kpCisgICAgICBwbmdfY3JlYXRlX2NvbG9ybWFwX2VudHJ5KGRpc3BsYXksIGksIGksIGksIGksIDI1NSwgUF9GSUxFKTsKKworICAgcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQKK21ha2VfZ3JheV9jb2xvcm1hcChwbmdfaW1hZ2VfcmVhZF9jb250cm9sICpkaXNwbGF5KQoreworICAgdW5zaWduZWQgaW50IGk7CisKKyAgIGZvciAoaT0wOyBpPDI1NjsgKytpKQorICAgICAgcG5nX2NyZWF0ZV9jb2xvcm1hcF9lbnRyeShkaXNwbGF5LCBpLCBpLCBpLCBpLCAyNTUsIFBfc1JHQik7CisKKyAgIHJldHVybiBpOworfQorI2RlZmluZSBQTkdfR1JBWV9DT0xPUk1BUF9FTlRSSUVTIDI1NgorCitzdGF0aWMgaW50CittYWtlX2dhX2NvbG9ybWFwKHBuZ19pbWFnZV9yZWFkX2NvbnRyb2wgKmRpc3BsYXkpCit7CisgICB1bnNpZ25lZCBpbnQgaSwgYTsKKworICAgLyogQWxwaGEgaXMgcmV0YWluZWQsIHRoZSBvdXRwdXQgd2lsbCBiZSBhIGNvbG9yLW1hcCB3aXRoIGVudHJpZXMKKyAgICAqIHNlbGVjdGVkIGJ5IHNpeCBsZXZlbHMgb2YgYWxwaGEuICBPbmUgdHJhbnNwYXJlbnQgZW50cnksIDYgZ3JheQorICAgICogbGV2ZWxzIGZvciBhbGwgdGhlIGludGVybWVkaWF0ZSBhbHBoYSB2YWx1ZXMsIGxlYXZpbmcgMjMwIGVudHJpZXMKKyAgICAqIGZvciB0aGUgb3BhcXVlIGdyYXlzLiAgVGhlIGNvbG9yLW1hcCBlbnRyaWVzIGFyZSB0aGUgc2l4IHZhbHVlcworICAgICogWzAuLjVdKjUxLCB0aGUgR0EgcHJvY2Vzc2luZyB1c2VzIFBOR19ESVY1MSh2YWx1ZSkgdG8gZmluZCB0aGUKKyAgICAqIHJlbGV2YW50IGVudHJ5LgorICAgICoKKyAgICAqIGlmIChhbHBoYSA+IDIyOSkgLy8gb3BhcXVlCisgICAgKiB7CisgICAgKiAgICAvLyBUaGUgMjMxIGVudHJpZXMgYXJlIHNlbGVjdGVkIHRvIG1ha2UgdGhlIG1hdGggYmVsb3cgd29yazoKKyAgICAqICAgIGJhc2UgPSAwOworICAgICogICAgZW50cnkgPSAoMjMxICogZ3JheSArIDEyOCkgPj4gODsKKyAgICAqIH0KKyAgICAqIGVsc2UgaWYgKGFscGhhIDwgMjYpIC8vIHRyYW5zcGFyZW50CisgICAgKiB7CisgICAgKiAgICBiYXNlID0gMjMxOworICAgICogICAgZW50cnkgPSAwOworICAgICogfQorICAgICogZWxzZSAvLyBwYXJ0aWFsbHkgb3BhcXVlCisgICAgKiB7CisgICAgKiAgICBiYXNlID0gMjI2ICsgNiAqIFBOR19ESVY1MShhbHBoYSk7CisgICAgKiAgICBlbnRyeSA9IFBOR19ESVY1MShncmF5KTsKKyAgICAqIH0KKyAgICAqLworICAgaSA9IDA7CisgICB3aGlsZSAoaSA8IDIzMSkKKyAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBncmF5ID0gKGkgKiAyNTYgKyAxMTUpIC8gMjMxOworICAgICAgcG5nX2NyZWF0ZV9jb2xvcm1hcF9lbnRyeShkaXNwbGF5LCBpKyssIGdyYXksIGdyYXksIGdyYXksIDI1NSwgUF9zUkdCKTsKKyAgIH0KKworICAgLyogMjU1IGlzIHVzZWQgaGVyZSBmb3IgdGhlIGNvbXBvbmVudCB2YWx1ZXMgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIGNvZGUKKyAgICAqIHRoYXQgdW5kb2VzIHByZW11bHRpcGxpY2F0aW9uIGluIHBuZ3dyaXRlLmMuCisgICAgKi8KKyAgIHBuZ19jcmVhdGVfY29sb3JtYXBfZW50cnkoZGlzcGxheSwgaSsrLCAyNTUsIDI1NSwgMjU1LCAwLCBQX3NSR0IpOworCisgICBmb3IgKGE9MTsgYTw1OyArK2EpCisgICB7CisgICAgICB1bnNpZ25lZCBpbnQgZzsKKworICAgICAgZm9yIChnPTA7IGc8NjsgKytnKQorICAgICAgICAgcG5nX2NyZWF0ZV9jb2xvcm1hcF9lbnRyeShkaXNwbGF5LCBpKyssIGcqNTEsIGcqNTEsIGcqNTEsIGEqNTEsCisgICAgICAgICAgICBQX3NSR0IpOworICAgfQorCisgICByZXR1cm4gaTsKK30KKworI2RlZmluZSBQTkdfR0FfQ09MT1JNQVBfRU5UUklFUyAyNTYKKworc3RhdGljIGludAorbWFrZV9yZ2JfY29sb3JtYXAocG5nX2ltYWdlX3JlYWRfY29udHJvbCAqZGlzcGxheSkKK3sKKyAgIHVuc2lnbmVkIGludCBpLCByOworCisgICAvKiBCdWlsZCBhIDZ4Nng2IG9wYXF1ZSBSR0IgY3ViZSAqLworICAgZm9yIChpPXI9MDsgcjw2OyArK3IpCisgICB7CisgICAgICB1bnNpZ25lZCBpbnQgZzsKKworICAgICAgZm9yIChnPTA7IGc8NjsgKytnKQorICAgICAgeworICAgICAgICAgdW5zaWduZWQgaW50IGI7CisKKyAgICAgICAgIGZvciAoYj0wOyBiPDY7ICsrYikKKyAgICAgICAgICAgIHBuZ19jcmVhdGVfY29sb3JtYXBfZW50cnkoZGlzcGxheSwgaSsrLCByKjUxLCBnKjUxLCBiKjUxLCAyNTUsCisgICAgICAgICAgICAgICBQX3NSR0IpOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gaTsKK30KKworI2RlZmluZSBQTkdfUkdCX0NPTE9STUFQX0VOVFJJRVMgMjE2CisKKy8qIFJldHVybiBhIHBhbGV0dGUgaW5kZXggdG8gdGhlIGFib3ZlIHBhbGV0dGUgZ2l2ZW4gdGhyZWUgOC1iaXQgc1JHQiB2YWx1ZXMuICovCisjZGVmaW5lIFBOR19SR0JfSU5ERVgocixnLGIpIFwKKyAgICgocG5nX2J5dGUpKDYgKiAoNiAqIFBOR19ESVY1MShyKSArIFBOR19ESVY1MShnKSkgKyBQTkdfRElWNTEoYikpKQorCitzdGF0aWMgaW50CitwbmdfaW1hZ2VfcmVhZF9jb2xvcm1hcChwbmdfdm9pZHAgYXJndW1lbnQpCit7CisgICBwbmdfaW1hZ2VfcmVhZF9jb250cm9sICpkaXNwbGF5ID0KKyAgICAgIHBuZ192b2lkY2FzdChwbmdfaW1hZ2VfcmVhZF9jb250cm9sKiwgYXJndW1lbnQpOworICAgY29uc3QgcG5nX2ltYWdlcCBpbWFnZSA9IGRpc3BsYXktPmltYWdlOworCisgICBjb25zdCBwbmdfc3RydWN0cnAgcG5nX3B0ciA9IGltYWdlLT5vcGFxdWUtPnBuZ19wdHI7CisgICBjb25zdCBwbmdfdWludF8zMiBvdXRwdXRfZm9ybWF0ID0gaW1hZ2UtPmZvcm1hdDsKKyAgIGNvbnN0IGludCBvdXRwdXRfZW5jb2RpbmcgPSAob3V0cHV0X2Zvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19MSU5FQVIpICE9IDAgPworICAgICAgUF9MSU5FQVIgOiBQX3NSR0I7CisKKyAgIHVuc2lnbmVkIGludCBjbWFwX2VudHJpZXM7CisgICB1bnNpZ25lZCBpbnQgb3V0cHV0X3Byb2Nlc3Npbmc7ICAgICAgICAvKiBPdXRwdXQgcHJvY2Vzc2luZyBvcHRpb24gKi8KKyAgIHVuc2lnbmVkIGludCBkYXRhX2VuY29kaW5nID0gUF9OT1RTRVQ7IC8qIEVuY29kaW5nIGxpYnBuZyBtdXN0IHByb2R1Y2UgKi8KKworICAgLyogQmFja2dyb3VuZCBpbmZvcm1hdGlvbjsgdGhlIGJhY2tncm91bmQgY29sb3IgYW5kIHRoZSBpbmRleCBvZiB0aGlzIGNvbG9yCisgICAgKiBpbiB0aGUgY29sb3ItbWFwIGlmIGl0IGV4aXN0cyAoZWxzZSAyNTYpLgorICAgICovCisgICB1bnNpZ25lZCBpbnQgYmFja2dyb3VuZF9pbmRleCA9IDI1NjsKKyAgIHBuZ191aW50XzMyIGJhY2tfciwgYmFja19nLCBiYWNrX2I7CisKKyAgIC8qIEZsYWdzIHRvIGFjY3VtdWxhdGUgdGhpbmdzIHRoYXQgbmVlZCB0byBiZSBkb25lIHRvIHRoZSBpbnB1dC4gKi8KKyAgIGludCBleHBhbmRfdFJOUyA9IDA7CisKKyAgIC8qIEV4Y2x1ZGUgdGhlIE5ZSSBmZWF0dXJlIG9mIGNvbXBvc2l0aW5nIG9udG8gYSBjb2xvci1tYXBwZWQgYnVmZmVyOyBpdCBpcworICAgICogdmVyeSBkaWZmaWN1bHQgdG8gZG8sIHRoZSByZXN1bHRzIGxvb2sgYXdmdWwsIGFuZCBpdCBpcyBkaWZmaWN1bHQgdG8gc2VlCisgICAgKiB3aGF0IHBvc3NpYmxlIHVzZSBpdCBpcyBiZWNhdXNlIHRoZSBhcHBsaWNhdGlvbiBjYW4ndCBjb250cm9sIHRoZQorICAgICogY29sb3ItbWFwLgorICAgICovCisgICBpZiAoKChwbmdfcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpICE9IDAgfHwKKyAgICAgICAgIHBuZ19wdHItPm51bV90cmFucyA+IDApIC8qIGFscGhhIGluIGlucHV0ICovICYmCisgICAgICAoKG91dHB1dF9mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQUxQSEEpID09IDApIC8qIG5vIGFscGhhIGluIG91dHB1dCAqLykKKyAgIHsKKyAgICAgIGlmIChvdXRwdXRfZW5jb2RpbmcgPT0gUF9MSU5FQVIpIC8qIGNvbXBvc2Ugb24gYmxhY2sgKi8KKyAgICAgICAgIGJhY2tfYiA9IGJhY2tfZyA9IGJhY2tfciA9IDA7CisKKyAgICAgIGVsc2UgaWYgKGRpc3BsYXktPmJhY2tncm91bmQgPT0gTlVMTCAvKiBubyB3YXkgdG8gcmVtb3ZlIGl0ICovKQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsCisgICAgICAgICAgICAiYSBiYWNrZ3JvdW5kIGNvbG9yIG11c3QgYmUgc3VwcGxpZWQgdG8gcmVtb3ZlIGFscGhhL3RyYW5zcGFyZW5jeSIpOworCisgICAgICAvKiBHZXQgYSBjb3B5IG9mIHRoZSBiYWNrZ3JvdW5kIGNvbG9yICh0aGlzIGF2b2lkcyByZXBlYXRpbmcgdGhlIGNoZWNrcworICAgICAgICogYmVsb3cuKSAgVGhlIGVuY29kaW5nIGlzIDgtYml0IHNSR0Igb3IgMTYtYml0IGxpbmVhciwgZGVwZW5kaW5nIG9uIHRoZQorICAgICAgICogb3V0cHV0IGZvcm1hdC4KKyAgICAgICAqLworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgYmFja19nID0gZGlzcGxheS0+YmFja2dyb3VuZC0+Z3JlZW47CisgICAgICAgICBpZiAoKG91dHB1dF9mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQ09MT1IpICE9IDApCisgICAgICAgICB7CisgICAgICAgICAgICBiYWNrX3IgPSBkaXNwbGF5LT5iYWNrZ3JvdW5kLT5yZWQ7CisgICAgICAgICAgICBiYWNrX2IgPSBkaXNwbGF5LT5iYWNrZ3JvdW5kLT5ibHVlOworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgICAgYmFja19iID0gYmFja19yID0gYmFja19nOworICAgICAgfQorICAgfQorCisgICBlbHNlIGlmIChvdXRwdXRfZW5jb2RpbmcgPT0gUF9MSU5FQVIpCisgICAgICBiYWNrX2IgPSBiYWNrX3IgPSBiYWNrX2cgPSA2NTUzNTsKKworICAgZWxzZQorICAgICAgYmFja19iID0gYmFja19yID0gYmFja19nID0gMjU1OworCisgICAvKiBEZWZhdWx0IHRoZSBpbnB1dCBmaWxlIGdhbW1hIGlmIHJlcXVpcmVkIC0gdGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZQorICAgICogbGlicG5nIGFzc3VtZXMgdGhhdCBpZiBubyBnYW1tYSBpbmZvcm1hdGlvbiBpcyBwcmVzZW50IHRoZSBkYXRhIGlzIGluIHRoZQorICAgICogb3V0cHV0IGZvcm1hdCwgYnV0IHRoZSBzaW1wbGlmaWVkIEFQSSBkZWR1Y2VzIHRoZSBnYW1tYSBmcm9tIHRoZSBpbnB1dAorICAgICogZm9ybWF0LgorICAgICovCisgICBpZiAoKHBuZ19wdHItPmNvbG9yc3BhY2UuZmxhZ3MgJiBQTkdfQ09MT1JTUEFDRV9IQVZFX0dBTU1BKSA9PSAwKQorICAgeworICAgICAgLyogRG8gdGhpcyBkaXJlY3RseSwgbm90IHVzaW5nIHRoZSBwbmdfY29sb3JzcGFjZSBmdW5jdGlvbnMsIHRvIGVuc3VyZQorICAgICAgICogdGhhdCBpdCBoYXBwZW5zIGV2ZW4gaWYgdGhlIGNvbG9yc3BhY2UgaXMgaW52YWxpZCAodGhvdWdoIHByb2JhYmx5IGlmCisgICAgICAgKiBpdCBpcyB0aGUgc2V0dGluZyB3aWxsIGJlIGlnbm9yZWQpICBOb3RlIHRoYXQgdGhlIHNhbWUgdGhpbmcgY2FuIGJlCisgICAgICAgKiBhY2hpZXZlZCBhdCB0aGUgYXBwbGljYXRpb24gaW50ZXJmYWNlIHdpdGggcG5nX3NldF9nQU1BLgorICAgICAgICovCisgICAgICBpZiAocG5nX3B0ci0+Yml0X2RlcHRoID09IDE2ICYmCisgICAgICAgICAoaW1hZ2UtPmZsYWdzICYgUE5HX0lNQUdFX0ZMQUdfMTZCSVRfc1JHQikgPT0gMCkKKyAgICAgICAgIHBuZ19wdHItPmNvbG9yc3BhY2UuZ2FtbWEgPSBQTkdfR0FNTUFfTElORUFSOworCisgICAgICBlbHNlCisgICAgICAgICBwbmdfcHRyLT5jb2xvcnNwYWNlLmdhbW1hID0gUE5HX0dBTU1BX3NSR0JfSU5WRVJTRTsKKworICAgICAgcG5nX3B0ci0+Y29sb3JzcGFjZS5mbGFncyB8PSBQTkdfQ09MT1JTUEFDRV9IQVZFX0dBTU1BOworICAgfQorCisgICAvKiBEZWNpZGUgd2hhdCB0byBkbyBiYXNlZCBvbiB0aGUgUE5HIGNvbG9yIHR5cGUgb2YgdGhlIGlucHV0IGRhdGEuICBUaGUKKyAgICAqIHV0aWxpdHkgZnVuY3Rpb24gcG5nX2NyZWF0ZV9jb2xvcm1hcF9lbnRyeSBkZWFscyB3aXRoIG1vc3QgYXNwZWN0cyBvZiB0aGUKKyAgICAqIG91dHB1dCB0cmFuc2Zvcm1hdGlvbnM7IHRoaXMgY29kZSB3b3JrcyBvdXQgaG93IHRvIHByb2R1Y2UgYnl0ZXMgb2YKKyAgICAqIGNvbG9yLW1hcCBlbnRyaWVzIGZyb20gdGhlIG9yaWdpbmFsIGZvcm1hdC4KKyAgICAqLworICAgc3dpdGNoIChwbmdfcHRyLT5jb2xvcl90eXBlKQorICAgeworICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkFZOgorICAgICAgICAgaWYgKHBuZ19wdHItPmJpdF9kZXB0aCA8PSA4KQorICAgICAgICAgeworICAgICAgICAgICAgLyogVGhlcmUgYXQgbW9zdCAyNTYgY29sb3JzIGluIHRoZSBvdXRwdXQsIHJlZ2FyZGxlc3Mgb2YKKyAgICAgICAgICAgICAqIHRyYW5zcGFyZW5jeS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgdW5zaWduZWQgaW50IHN0ZXAsIGksIHZhbCwgdHJhbnMgPSAyNTYvKmlnbm9yZSovLCBiYWNrX2FscGhhID0gMDsKKworICAgICAgICAgICAgY21hcF9lbnRyaWVzID0gMVUgPDwgcG5nX3B0ci0+Yml0X2RlcHRoOworICAgICAgICAgICAgaWYgKGNtYXBfZW50cmllcyA+IGltYWdlLT5jb2xvcm1hcF9lbnRyaWVzKQorICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJncmF5WzhdIGNvbG9yLW1hcDogdG9vIGZldyBlbnRyaWVzIik7CisKKyAgICAgICAgICAgIHN0ZXAgPSAyNTUgLyAoY21hcF9lbnRyaWVzIC0gMSk7CisgICAgICAgICAgICBvdXRwdXRfcHJvY2Vzc2luZyA9IFBOR19DTUFQX05PTkU7CisKKyAgICAgICAgICAgIC8qIElmIHRoZXJlIGlzIGEgdFJOUyBjaHVuayB0aGVuIHRoaXMgZWl0aGVyIHNlbGVjdHMgYSB0cmFuc3BhcmVudAorICAgICAgICAgICAgICogdmFsdWUgb3IsIGlmIHRoZSBvdXRwdXQgaGFzIG5vIGFscGhhLCB0aGUgYmFja2dyb3VuZCBjb2xvci4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHBuZ19wdHItPm51bV90cmFucyA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICB0cmFucyA9IHBuZ19wdHItPnRyYW5zX2NvbG9yLmdyYXk7CisKKyAgICAgICAgICAgICAgIGlmICgob3V0cHV0X2Zvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BTFBIQSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgIGJhY2tfYWxwaGEgPSBvdXRwdXRfZW5jb2RpbmcgPT0gUF9MSU5FQVIgPyA2NTUzNSA6IDI1NTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogcG5nX2NyZWF0ZV9jb2xvcm1hcF9lbnRyeSBqdXN0IHRha2VzIGFuIFJHQkEgYW5kIHdyaXRlcyB0aGUKKyAgICAgICAgICAgICAqIGNvcnJlc3BvbmRpbmcgY29sb3ItbWFwIGVudHJ5IHVzaW5nIHRoZSBmb3JtYXQgZnJvbSAnaW1hZ2UnLAorICAgICAgICAgICAgICogaW5jbHVkaW5nIHRoZSByZXF1aXJlZCBjb252ZXJzaW9uIHRvIHNSR0Igb3IgbGluZWFyIGFzCisgICAgICAgICAgICAgKiBhcHByb3ByaWF0ZS4gIFRoZSBpbnB1dCB2YWx1ZXMgYXJlIGFsd2F5cyBlaXRoZXIgc1JHQiAoaWYgdGhlCisgICAgICAgICAgICAgKiBnYW1tYSBjb3JyZWN0aW9uIGZsYWcgaXMgMCkgb3IgMC4uMjU1IHNjYWxlZCBmaWxlIGVuY29kZWQgdmFsdWVzCisgICAgICAgICAgICAgKiAoaWYgdGhlIGZ1bmN0aW9uIG11c3QgZ2FtbWEgY29ycmVjdCB0aGVtKS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZm9yIChpPXZhbD0wOyBpPGNtYXBfZW50cmllczsgKytpLCB2YWwgKz0gc3RlcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8qICdpJyBpcyBhIGZpbGUgdmFsdWUuICBXaGlsZSB0aGlzIHdpbGwgcmVzdWx0IGluIGR1cGxpY2F0ZWQKKyAgICAgICAgICAgICAgICAqIGVudHJpZXMgZm9yIDgtYml0IG5vbi1zUkdCIGVuY29kZWQgZmlsZXMgaXQgaXMgbmVjZXNzYXJ5IHRvCisgICAgICAgICAgICAgICAgKiBoYXZlIG5vbi1nYW1tYSBjb3JyZWN0ZWQgdmFsdWVzIHRvIGRvIHRSTlMgaGFuZGxpbmcuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIGlmIChpICE9IHRyYW5zKQorICAgICAgICAgICAgICAgICAgcG5nX2NyZWF0ZV9jb2xvcm1hcF9lbnRyeShkaXNwbGF5LCBpLCB2YWwsIHZhbCwgdmFsLCAyNTUsCisgICAgICAgICAgICAgICAgICAgICBQX0ZJTEUvKjgtYml0IHdpdGggZmlsZSBnYW1tYSovKTsKKworICAgICAgICAgICAgICAgLyogRWxzZSB0aGlzIGVudHJ5IGlzIHRyYW5zcGFyZW50LiAgVGhlIGNvbG9ycyBkb24ndCBtYXR0ZXIgaWYKKyAgICAgICAgICAgICAgICAqIHRoZXJlIGlzIGFuIGFscGhhIGNoYW5uZWwgKGJhY2tfYWxwaGEgPT0gMCksIGJ1dCBpdCBkb2VzIG5vCisgICAgICAgICAgICAgICAgKiBoYXJtIHRvIHBhc3MgdGhlbSBpbjsgdGhlIHZhbHVlcyBhcmUgbm90IHNldCBhYm92ZSBzbyB0aGlzCisgICAgICAgICAgICAgICAgKiBwYXNzZXMgaW4gd2hpdGUuCisgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICogTk9URTogdGhpcyBwcmVzZXJ2ZXMgdGhlIGZ1bGwgcHJlY2lzaW9uIG9mIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICAgICAgICAgICogc3VwcGxpZWQgYmFja2dyb3VuZCBjb2xvciB3aGVuIGl0IGlzIHVzZWQuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHBuZ19jcmVhdGVfY29sb3JtYXBfZW50cnkoZGlzcGxheSwgaSwgYmFja19yLCBiYWNrX2csIGJhY2tfYiwKKyAgICAgICAgICAgICAgICAgICAgIGJhY2tfYWxwaGEsIG91dHB1dF9lbmNvZGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFdlIG5lZWQgbGlicG5nIHRvIHByZXNlcnZlIHRoZSBvcmlnaW5hbCBlbmNvZGluZy4gKi8KKyAgICAgICAgICAgIGRhdGFfZW5jb2RpbmcgPSBQX0ZJTEU7CisKKyAgICAgICAgICAgIC8qIFRoZSByb3dzIGZyb20gbGlicG5nLCB3aGlsZSB0ZWNobmljYWxseSBncmF5IHZhbHVlcywgYXJlIG5vdyBhbHNvCisgICAgICAgICAgICAgKiBjb2xvci1tYXAgaW5kaWNlczsgaG93ZXZlciwgdGhleSBtYXkgbmVlZCB0byBiZSBleHBhbmRlZCB0byAxCisgICAgICAgICAgICAgKiBieXRlIHBlciBwaXhlbC4gIFRoaXMgaXMgd2hhdCBwbmdfc2V0X3BhY2tpbmcgZG9lcyAoaS5lLiwgaXQKKyAgICAgICAgICAgICAqIHVucGFja3MgdGhlIGJpdCB2YWx1ZXMgaW50byBieXRlcy4pCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT5iaXRfZGVwdGggPCA4KQorICAgICAgICAgICAgICAgcG5nX3NldF9wYWNraW5nKHBuZ19wdHIpOworICAgICAgICAgfQorCisgICAgICAgICBlbHNlIC8qIGJpdCBkZXB0aCBpcyAxNiAqLworICAgICAgICAgeworICAgICAgICAgICAgLyogVGhlIDE2LWJpdCBpbnB1dCB2YWx1ZXMgY2FuIGJlIGNvbnZlcnRlZCBkaXJlY3RseSB0byA4LWJpdCBnYW1tYQorICAgICAgICAgICAgICogZW5jb2RlZCB2YWx1ZXM7IGhvd2V2ZXIsIGlmIGEgdFJOUyBjaHVuayBpcyBwcmVzZW50IDI1NyBjb2xvci1tYXAKKyAgICAgICAgICAgICAqIGVudHJpZXMgYXJlIHJlcXVpcmVkLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBleHRyYSBlbnRyeSByZXF1aXJlcworICAgICAgICAgICAgICogc3BlY2lhbCBwcm9jZXNzaW5nOyBhZGQgYW4gYWxwaGEgY2hhbm5lbCwgc2FjcmlmaWNlIGdyYXkgbGV2ZWwKKyAgICAgICAgICAgICAqIDI1NCBhbmQgY29udmVydCB0cmFuc3BhcmVudCAoYWxwaGE9PTApIGVudHJpZXMgdG8gdGhhdC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBVc2UgbGlicG5nIHRvIGNob3AgdGhlIGRhdGEgdG8gOCBiaXRzLiAgQ29udmVydCBpdCB0byBzUkdCIGF0IHRoZQorICAgICAgICAgICAgICogc2FtZSB0aW1lIHRvIG1pbmltaXplIHF1YWxpdHkgbG9zcy4gIElmIGEgdFJOUyBjaHVuayBpcyBwcmVzZW50CisgICAgICAgICAgICAgKiB0aGlzIG1lYW5zIGxpYnBuZyBtdXN0IGhhbmRsZSBpdCB0b287IG90aGVyd2lzZSBpdCBpcyBpbXBvc3NpYmxlCisgICAgICAgICAgICAgKiB0byBkbyB0aGUgZXhhY3QgbWF0Y2ggb24gdGhlIDE2LWJpdCB2YWx1ZS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBJZiB0aGUgb3V0cHV0IGhhcyBubyBhbHBoYSBjaGFubmVsICphbmQqIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGlzCisgICAgICAgICAgICAgKiBncmF5IHRoZW4gaXQgaXMgcG9zc2libGUgdG8gbGV0IGxpYnBuZyBoYW5kbGUgdGhlIHN1YnN0aXR1dGlvbiBieQorICAgICAgICAgICAgICogZW5zdXJpbmcgdGhhdCB0aGUgY29ycmVzcG9uZGluZyBncmF5IGxldmVsIG1hdGNoZXMgdGhlIGJhY2tncm91bmQKKyAgICAgICAgICAgICAqIGNvbG9yIGV4YWN0bHkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGRhdGFfZW5jb2RpbmcgPSBQX3NSR0I7CisKKyAgICAgICAgICAgIGlmIChQTkdfR1JBWV9DT0xPUk1BUF9FTlRSSUVTID4gaW1hZ2UtPmNvbG9ybWFwX2VudHJpZXMpCisgICAgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImdyYXlbMTZdIGNvbG9yLW1hcDogdG9vIGZldyBlbnRyaWVzIik7CisKKyAgICAgICAgICAgIGNtYXBfZW50cmllcyA9IG1ha2VfZ3JheV9jb2xvcm1hcChkaXNwbGF5KTsKKworICAgICAgICAgICAgaWYgKHBuZ19wdHItPm51bV90cmFucyA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYmFja19hbHBoYTsKKworICAgICAgICAgICAgICAgaWYgKChvdXRwdXRfZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FMUEhBKSAhPSAwKQorICAgICAgICAgICAgICAgICAgYmFja19hbHBoYSA9IDA7CisKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmIChiYWNrX3IgPT0gYmFja19nICYmIGJhY2tfZyA9PSBiYWNrX2IpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAvKiBCYWNrZ3JvdW5kIGlzIGdyYXk7IG5vIHNwZWNpYWwgcHJvY2Vzc2luZyB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgKiByZXF1aXJlZC4KKyAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbG9yXzE2IGM7CisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8zMiBncmF5ID0gYmFja19nOworCisgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0X2VuY29kaW5nID09IFBfTElORUFSKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZ3JheSA9IFBOR19zUkdCX0ZST01fTElORUFSKGdyYXkgKiAyNTUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbmQgbWFrZSBzdXJlIHRoZSBjb3JyZXNwb25kaW5nIHBhbGV0dGUgZW50cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIG1hdGNoZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19jcmVhdGVfY29sb3JtYXBfZW50cnkoZGlzcGxheSwgZ3JheSwgYmFja19nLCBiYWNrX2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrX2csIDY1NTM1LCBQX0xJTkVBUik7CisgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBiYWNrZ3JvdW5kIHBhc3NlZCB0byBsaWJwbmcsIGhvd2V2ZXIsIG11c3QgYmUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgKiBzUkdCIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICBjLmluZGV4ID0gMDsgLyp1bnVzZWQqLworICAgICAgICAgICAgICAgICAgICAgYy5ncmF5ID0gYy5yZWQgPSBjLmdyZWVuID0gYy5ibHVlID0gKHBuZ191aW50XzE2KWdyYXk7CisKKyAgICAgICAgICAgICAgICAgICAgIC8qIE5PVEU6IGRvZXMgdGhpcyB3b3JrIHdpdGhvdXQgZXhwYW5kaW5nIHRSTlMgdG8gYWxwaGE/CisgICAgICAgICAgICAgICAgICAgICAgKiBJdCBzaG91bGQgYmUgdGhlIGNvbG9yLT5ncmF5IGNhc2UgYmVsb3cgYXBwYXJlbnRseQorICAgICAgICAgICAgICAgICAgICAgICogZG9lc24ndC4KKyAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgcG5nX3NldF9iYWNrZ3JvdW5kX2ZpeGVkKHBuZ19wdHIsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0JBQ0tHUk9VTkRfR0FNTUFfU0NSRUVOLCAwLypuZWVkX2V4cGFuZCovLAorICAgICAgICAgICAgICAgICAgICAgICAgMC8qZ2FtbWE6IG5vdCB1c2VkKi8pOworCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfcHJvY2Vzc2luZyA9IFBOR19DTUFQX05PTkU7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBfX0NPVkVSSVRZX18KKyAgICAgICAgICAgICAgICAgLyogQ292ZXJpdHkgY2xhaW1zIHRoYXQgb3V0cHV0X2VuY29kaW5nIGNhbm5vdCBiZSAyIChQX0xJTkVBUikKKyAgICAgICAgICAgICAgICAgICogaGVyZS4KKyAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBiYWNrX2FscGhhID0gMjU1OworI2Vsc2UKKyAgICAgICAgICAgICAgICAgIGJhY2tfYWxwaGEgPSBvdXRwdXRfZW5jb2RpbmcgPT0gUF9MSU5FQVIgPyA2NTUzNSA6IDI1NTsKKyNlbmRpZgorICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAvKiBvdXRwdXRfcHJvY2Vzc2luZyBtZWFucyB0aGF0IHRoZSBsaWJwbmctcHJvY2Vzc2VkIHJvdyB3aWxsIGJlCisgICAgICAgICAgICAgICAgKiA4LWJpdCBHQSBhbmQgaXQgaGFzIHRvIGJlIHByb2Nlc3NpbmcgdG8gc2luZ2xlIGJ5dGUgY29sb3ItbWFwCisgICAgICAgICAgICAgICAgKiB2YWx1ZXMuICBFbnRyeSAyNTQgaXMgcmVwbGFjZWQgYnkgZWl0aGVyIGEgY29tcGxldGVseQorICAgICAgICAgICAgICAgICogdHJhbnNwYXJlbnQgZW50cnkgb3IgYnkgdGhlIGJhY2tncm91bmQgY29sb3IgYXQgZnVsbAorICAgICAgICAgICAgICAgICogcHJlY2lzaW9uIChhbmQgdGhlIGJhY2tncm91bmQgY29sb3IgaXMgbm90IGEgc2ltcGxlIGdyYXkKKyAgICAgICAgICAgICAgICAqIGxldmVsIGluIHRoaXMgY2FzZS4pCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIGV4cGFuZF90Uk5TID0gMTsKKyAgICAgICAgICAgICAgIG91dHB1dF9wcm9jZXNzaW5nID0gUE5HX0NNQVBfVFJBTlM7CisgICAgICAgICAgICAgICBiYWNrZ3JvdW5kX2luZGV4ID0gMjU0OworCisgICAgICAgICAgICAgICAvKiBBbmQgc2V0IChvdmVyd3JpdGUpIGNvbG9yLW1hcCBlbnRyeSAyNTQgdG8gdGhlIGFjdHVhbAorICAgICAgICAgICAgICAgICogYmFja2dyb3VuZCBjb2xvciBhdCBmdWxsIHByZWNpc2lvbi4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgcG5nX2NyZWF0ZV9jb2xvcm1hcF9lbnRyeShkaXNwbGF5LCAyNTQsIGJhY2tfciwgYmFja19nLCBiYWNrX2IsCisgICAgICAgICAgICAgICAgICBiYWNrX2FscGhhLCBvdXRwdXRfZW5jb2RpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICBvdXRwdXRfcHJvY2Vzc2luZyA9IFBOR19DTUFQX05PTkU7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBOgorICAgICAgICAgLyogOC1iaXQgb3IgMTYtYml0IFBORyB3aXRoIHR3byBjaGFubmVscyAtIGdyYXkgYW5kIGFscGhhLiAgQSBtaW5pbXVtCisgICAgICAgICAgKiBvZiA2NTUzNiBjb21iaW5hdGlvbnMuICBJZiwgaG93ZXZlciwgdGhlIGFscGhhIGNoYW5uZWwgaXMgdG8gYmUKKyAgICAgICAgICAqIHJlbW92ZWQgdGhlcmUgYXJlIG9ubHkgMjU2IHBvc3NpYmlsaXRpZXMgaWYgdGhlIGJhY2tncm91bmQgaXMgZ3JheS4KKyAgICAgICAgICAqIChPdGhlcndpc2UgdGhlcmUgaXMgYSBzdWJzZXQgb2YgdGhlIDY1NTM2IHBvc3NpYmlsaXRpZXMgZGVmaW5lZCBieQorICAgICAgICAgICogdGhlIHRyaWFuZ2xlIGJldHdlZW4gYmxhY2ssIHdoaXRlIGFuZCB0aGUgYmFja2dyb3VuZCBjb2xvci4pCisgICAgICAgICAgKgorICAgICAgICAgICogUmVkdWNlIDE2LWJpdCBmaWxlcyB0byA4LWJpdCBhbmQgc1JHQiBlbmNvZGUgdGhlIHJlc3VsdC4gIE5vIG5lZWQgdG8KKyAgICAgICAgICAqIHdvcnJ5IGFib3V0IHRSTlMgbWF0Y2hpbmcgLSB0Uk5TIGlzIGlnbm9yZWQgaWYgdGhlcmUgaXMgYW4gYWxwaGEKKyAgICAgICAgICAqIGNoYW5uZWwuCisgICAgICAgICAgKi8KKyAgICAgICAgIGRhdGFfZW5jb2RpbmcgPSBQX3NSR0I7CisKKyAgICAgICAgIGlmICgob3V0cHV0X2Zvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BTFBIQSkgIT0gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChQTkdfR0FfQ09MT1JNQVBfRU5UUklFUyA+IGltYWdlLT5jb2xvcm1hcF9lbnRyaWVzKQorICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJncmF5K2FscGhhIGNvbG9yLW1hcDogdG9vIGZldyBlbnRyaWVzIik7CisKKyAgICAgICAgICAgIGNtYXBfZW50cmllcyA9IG1ha2VfZ2FfY29sb3JtYXAoZGlzcGxheSk7CisKKyAgICAgICAgICAgIGJhY2tncm91bmRfaW5kZXggPSBQTkdfQ01BUF9HQV9CQUNLR1JPVU5EOworICAgICAgICAgICAgb3V0cHV0X3Byb2Nlc3NpbmcgPSBQTkdfQ01BUF9HQTsKKyAgICAgICAgIH0KKworICAgICAgICAgZWxzZSAvKiBhbHBoYSBpcyByZW1vdmVkICovCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBBbHBoYSBtdXN0IGJlIHJlbW92ZWQgYXMgdGhlIFBORyBkYXRhIGlzIHByb2Nlc3NlZCB3aGVuIHRoZQorICAgICAgICAgICAgICogYmFja2dyb3VuZCBpcyBhIGNvbG9yIGJlY2F1c2UgdGhlIEcgYW5kIEEgY2hhbm5lbHMgYXJlCisgICAgICAgICAgICAgKiBpbmRlcGVuZGVudCBhbmQgdGhlIHZlY3RvciBhZGRpdGlvbiAobm9uLXBhcmFsbGVsIHZlY3RvcnMpIGlzIGEKKyAgICAgICAgICAgICAqIDItRCBwcm9ibGVtLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFRoaXMgY2FuIGJlIHJlZHVjZWQgdG8gdGhlIHNhbWUgYWxnb3JpdGhtIGFzIGFib3ZlIGJ5IG1ha2luZyBhCisgICAgICAgICAgICAgKiBjb2xvcm1hcCBjb250YWluaW5nIGdyYXkgbGV2ZWxzIChmb3IgdGhlIG9wYXF1ZSBncmF5cyksIGEKKyAgICAgICAgICAgICAqIGJhY2tncm91bmQgZW50cnkgKGZvciBhIHRyYW5zcGFyZW50IHBpeGVsKSBhbmQgYSBzZXQgb2YgZm91ciBzaXgKKyAgICAgICAgICAgICAqIGxldmVsIGNvbG9yIHZhbHVlcywgb25lIHNldCBmb3IgZWFjaCBpbnRlcm1lZGlhdGUgYWxwaGEgdmFsdWUuCisgICAgICAgICAgICAgKiBTZWUgdGhlIGNvbW1lbnRzIGluIG1ha2VfZ2FfY29sb3JtYXAgZm9yIGhvdyB0aGlzIHdvcmtzIGluIHRoZQorICAgICAgICAgICAgICogcGVyLXBpeGVsIHByb2Nlc3NpbmcuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogSWYgdGhlIGJhY2tncm91bmQgaXMgZ3JheSwgaG93ZXZlciwgd2Ugb25seSBuZWVkIGEgMjU2IGVudHJ5IGdyYXkKKyAgICAgICAgICAgICAqIGxldmVsIGNvbG9yIG1hcC4gIEl0IGlzIHN1ZmZpY2llbnQgdG8gbWFrZSB0aGUgZW50cnkgZ2VuZXJhdGVkCisgICAgICAgICAgICAgKiBmb3IgdGhlIGJhY2tncm91bmQgY29sb3IgYmUgZXhhY3RseSB0aGUgY29sb3Igc3BlY2lmaWVkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoKG91dHB1dF9mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQ09MT1IpID09IDAgfHwKKyAgICAgICAgICAgICAgIChiYWNrX3IgPT0gYmFja19nICYmIGJhY2tfZyA9PSBiYWNrX2IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLyogQmFja2dyb3VuZCBpcyBncmF5OyBubyBzcGVjaWFsIHByb2Nlc3Npbmcgd2lsbCBiZSByZXF1aXJlZC4gKi8KKyAgICAgICAgICAgICAgIHBuZ19jb2xvcl8xNiBjOworICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgZ3JheSA9IGJhY2tfZzsKKworICAgICAgICAgICAgICAgaWYgKFBOR19HUkFZX0NPTE9STUFQX0VOVFJJRVMgPiBpbWFnZS0+Y29sb3JtYXBfZW50cmllcykKKyAgICAgICAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiZ3JheS1hbHBoYSBjb2xvci1tYXA6IHRvbyBmZXcgZW50cmllcyIpOworCisgICAgICAgICAgICAgICBjbWFwX2VudHJpZXMgPSBtYWtlX2dyYXlfY29sb3JtYXAoZGlzcGxheSk7CisKKyAgICAgICAgICAgICAgIGlmIChvdXRwdXRfZW5jb2RpbmcgPT0gUF9MSU5FQVIpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBncmF5ID0gUE5HX3NSR0JfRlJPTV9MSU5FQVIoZ3JheSAqIDI1NSk7CisKKyAgICAgICAgICAgICAgICAgIC8qIEFuZCBtYWtlIHN1cmUgdGhlIGNvcnJlc3BvbmRpbmcgcGFsZXR0ZSBlbnRyeSBtYXRjaGVzLiAqLworICAgICAgICAgICAgICAgICAgcG5nX2NyZWF0ZV9jb2xvcm1hcF9lbnRyeShkaXNwbGF5LCBncmF5LCBiYWNrX2csIGJhY2tfZywKKyAgICAgICAgICAgICAgICAgICAgIGJhY2tfZywgNjU1MzUsIFBfTElORUFSKTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgLyogVGhlIGJhY2tncm91bmQgcGFzc2VkIHRvIGxpYnBuZywgaG93ZXZlciwgbXVzdCBiZSB0aGUgc1JHQgorICAgICAgICAgICAgICAgICogdmFsdWUuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIGMuaW5kZXggPSAwOyAvKnVudXNlZCovCisgICAgICAgICAgICAgICBjLmdyYXkgPSBjLnJlZCA9IGMuZ3JlZW4gPSBjLmJsdWUgPSAocG5nX3VpbnRfMTYpZ3JheTsKKworICAgICAgICAgICAgICAgcG5nX3NldF9iYWNrZ3JvdW5kX2ZpeGVkKHBuZ19wdHIsICZjLAorICAgICAgICAgICAgICAgICAgUE5HX0JBQ0tHUk9VTkRfR0FNTUFfU0NSRUVOLCAwLypuZWVkX2V4cGFuZCovLAorICAgICAgICAgICAgICAgICAgMC8qZ2FtbWE6IG5vdCB1c2VkKi8pOworCisgICAgICAgICAgICAgICBvdXRwdXRfcHJvY2Vzc2luZyA9IFBOR19DTUFQX05PTkU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ191aW50XzMyIGksIGE7CisKKyAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgdGhlIHNhbWUgYXMgcG5nX21ha2VfZ2FfY29sb3JtYXAsIGFib3ZlLCBleGNlcHQgdGhhdAorICAgICAgICAgICAgICAgICogdGhlIGVudHJpZXMgYXJlIGFsbCBvcGFxdWUuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIGlmIChQTkdfR0FfQ09MT1JNQVBfRU5UUklFUyA+IGltYWdlLT5jb2xvcm1hcF9lbnRyaWVzKQorICAgICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJnYS1hbHBoYSBjb2xvci1tYXA6IHRvbyBmZXcgZW50cmllcyIpOworCisgICAgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgICAgIHdoaWxlIChpIDwgMjMxKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgZ3JheSA9IChpICogMjU2ICsgMTE1KSAvIDIzMTsKKyAgICAgICAgICAgICAgICAgIHBuZ19jcmVhdGVfY29sb3JtYXBfZW50cnkoZGlzcGxheSwgaSsrLCBncmF5LCBncmF5LCBncmF5LAorICAgICAgICAgICAgICAgICAgICAgMjU1LCBQX3NSR0IpOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAvKiBOT1RFOiB0aGlzIHByZXNlcnZlcyB0aGUgZnVsbCBwcmVjaXNpb24gb2YgdGhlIGFwcGxpY2F0aW9uCisgICAgICAgICAgICAgICAgKiBiYWNrZ3JvdW5kIGNvbG9yLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICBiYWNrZ3JvdW5kX2luZGV4ID0gaTsKKyAgICAgICAgICAgICAgIHBuZ19jcmVhdGVfY29sb3JtYXBfZW50cnkoZGlzcGxheSwgaSsrLCBiYWNrX3IsIGJhY2tfZywgYmFja19iLAorI2lmZGVmIF9fQ09WRVJJVFlfXworICAgICAgICAgICAgICAgICAvKiBDb3Zlcml0eSBjbGFpbXMgdGhhdCBvdXRwdXRfZW5jb2RpbmcgY2Fubm90IGJlIDIgKFBfTElORUFSKQorICAgICAgICAgICAgICAgICAgKiBoZXJlLgorICAgICAgICAgICAgICAgICAgKi8gMjU1VSwKKyNlbHNlCisgICAgICAgICAgICAgICAgICBvdXRwdXRfZW5jb2RpbmcgPT0gUF9MSU5FQVIgPyA2NTUzNVUgOiAyNTVVLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICBvdXRwdXRfZW5jb2RpbmcpOworCisgICAgICAgICAgICAgICAvKiBGb3Igbm9uLW9wYXF1ZSBpbnB1dCBjb21wb3NpdGUgb24gdGhlIHNSR0IgYmFja2dyb3VuZCAtIHRoaXMKKyAgICAgICAgICAgICAgICAqIHJlcXVpcmVzIGludmVydGluZyB0aGUgZW5jb2RpbmcgZm9yIGVhY2ggY29tcG9uZW50LiAgVGhlIGlucHV0CisgICAgICAgICAgICAgICAgKiBpcyBzdGlsbCBjb252ZXJ0ZWQgdG8gdGhlIHNSR0IgZW5jb2RpbmcgYmVjYXVzZSB0aGlzIGlzIGEKKyAgICAgICAgICAgICAgICAqIHJlYXNvbmFibGUgYXBwcm94aW1hdGUgdG8gdGhlIGxvZ2FyaXRobWljIGN1cnZlIG9mIGh1bWFuCisgICAgICAgICAgICAgICAgKiB2aXN1YWwgc2Vuc2l0aXZpdHksIGF0IGxlYXN0IG92ZXIgdGhlIG5hcnJvdyByYW5nZSB3aGljaCBQTkcKKyAgICAgICAgICAgICAgICAqIHJlcHJlc2VudHMuICBDb25zZXF1ZW50bHkgJ0cnIGlzIGFsd2F5cyBzUkdCIGVuY29kZWQsIHdoaWxlCisgICAgICAgICAgICAgICAgKiAnQScgaXMgbGluZWFyLiAgV2UgbmVlZCB0aGUgbGluZWFyIGJhY2tncm91bmQgY29sb3JzLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICBpZiAob3V0cHV0X2VuY29kaW5nID09IFBfc1JHQikgLyogZWxzZSBhbHJlYWR5IGxpbmVhciAqLworICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyogVGhpcyBtYXkgcHJvZHVjZSBhIHZhbHVlIG5vdCBleGFjdGx5IG1hdGNoaW5nIHRoZQorICAgICAgICAgICAgICAgICAgICogYmFja2dyb3VuZCwgYnV0IHRoYXQncyBvayBiZWNhdXNlIHRoZXNlIG51bWJlcnMgYXJlIG9ubHkKKyAgICAgICAgICAgICAgICAgICAqIHVzZWQgd2hlbiBhbHBoYSAhPSAwCisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIGJhY2tfciA9IHBuZ19zUkdCX3RhYmxlW2JhY2tfcl07CisgICAgICAgICAgICAgICAgICBiYWNrX2cgPSBwbmdfc1JHQl90YWJsZVtiYWNrX2ddOworICAgICAgICAgICAgICAgICAgYmFja19iID0gcG5nX3NSR0JfdGFibGVbYmFja19iXTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgZm9yIChhPTE7IGE8NTsgKythKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGc7CisKKyAgICAgICAgICAgICAgICAgIC8qIFBOR19zUkdCX0ZST01fTElORUFSIGV4cGVjdHMgYSAxNi1iaXQgbGluZWFyIHZhbHVlIHNjYWxlZAorICAgICAgICAgICAgICAgICAgICogYnkgYW4gOC1iaXQgYWxwaGEgdmFsdWUgKDAuLjI1NSkuCisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIHBuZ191aW50XzMyIGFscGhhID0gNTEgKiBhOworICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgYmFja19yeCA9ICgyNTUtYWxwaGEpICogYmFja19yOworICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgYmFja19neCA9ICgyNTUtYWxwaGEpICogYmFja19nOworICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgYmFja19ieCA9ICgyNTUtYWxwaGEpICogYmFja19iOworCisgICAgICAgICAgICAgICAgICBmb3IgKGc9MDsgZzw2OyArK2cpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8zMiBncmF5ID0gcG5nX3NSR0JfdGFibGVbZyo1MV0gKiBhbHBoYTsKKworICAgICAgICAgICAgICAgICAgICAgcG5nX2NyZWF0ZV9jb2xvcm1hcF9lbnRyeShkaXNwbGF5LCBpKyssCisgICAgICAgICAgICAgICAgICAgICAgICBQTkdfc1JHQl9GUk9NX0xJTkVBUihncmF5ICsgYmFja19yeCksCisgICAgICAgICAgICAgICAgICAgICAgICBQTkdfc1JHQl9GUk9NX0xJTkVBUihncmF5ICsgYmFja19neCksCisgICAgICAgICAgICAgICAgICAgICAgICBQTkdfc1JHQl9GUk9NX0xJTkVBUihncmF5ICsgYmFja19ieCksIDI1NSwgUF9zUkdCKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgY21hcF9lbnRyaWVzID0gaTsKKyAgICAgICAgICAgICAgIG91dHB1dF9wcm9jZXNzaW5nID0gUE5HX0NNQVBfR0E7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9SR0I6CisgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQToKKyAgICAgICAgIC8qIEV4Y2x1ZGUgdGhlIGNhc2Ugd2hlcmUgdGhlIG91dHB1dCBpcyBncmF5OyB3ZSBjYW4gYWx3YXlzIGhhbmRsZSB0aGlzCisgICAgICAgICAgKiB3aXRoIHRoZSBjYXNlcyBhYm92ZS4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKChvdXRwdXRfZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9SKSA9PSAwKQorICAgICAgICAgeworICAgICAgICAgICAgLyogVGhlIGNvbG9yLW1hcCB3aWxsIGJlIGdyYXlzY2FsZSwgc28gd2UgbWF5IGFzIHdlbGwgY29udmVydCB0aGUKKyAgICAgICAgICAgICAqIGlucHV0IFJHQiB2YWx1ZXMgdG8gYSBzaW1wbGUgZ3JheXNjYWxlIGFuZCB1c2UgdGhlIGdyYXlzY2FsZQorICAgICAgICAgICAgICogY29kZSBhYm92ZS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBOT1RFOiBjYWxsaW5nIHRoaXMgYXBwYXJlbnRseSBkYW1hZ2VzIHRoZSByZWNvZ25pdGlvbiBvZiB0aGUKKyAgICAgICAgICAgICAqIHRyYW5zcGFyZW50IGNvbG9yIGluIGJhY2tncm91bmQgY29sb3IgaGFuZGxpbmc7IGNhbGwKKyAgICAgICAgICAgICAqIHBuZ19zZXRfdFJOU190b19hbHBoYSBiZWZvcmUgcG5nX3NldF9iYWNrZ3JvdW5kX2ZpeGVkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwbmdfc2V0X3JnYl90b19ncmF5X2ZpeGVkKHBuZ19wdHIsIFBOR19FUlJPUl9BQ1RJT05fTk9ORSwgLTEsCisgICAgICAgICAgICAgICAtMSk7CisgICAgICAgICAgICBkYXRhX2VuY29kaW5nID0gUF9zUkdCOworCisgICAgICAgICAgICAvKiBUaGUgb3V0cHV0IHdpbGwgbm93IGJlIG9uZSBvciB0d28gOC1iaXQgZ3JheSBvciBncmF5K2FscGhhCisgICAgICAgICAgICAgKiBjaGFubmVscy4gIFRoZSBtb3JlIGNvbXBsZXggY2FzZSBhcmlzZXMgd2hlbiB0aGUgaW5wdXQgaGFzIGFscGhhLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBIHx8CisgICAgICAgICAgICAgICBwbmdfcHRyLT5udW1fdHJhbnMgPiAwKSAmJgorICAgICAgICAgICAgICAgKG91dHB1dF9mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQUxQSEEpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvKiBCb3RoIGlucHV0IGFuZCBvdXRwdXQgaGF2ZSBhbiBhbHBoYSBjaGFubmVsLCBzbyBubyBiYWNrZ3JvdW5kCisgICAgICAgICAgICAgICAgKiBwcm9jZXNzaW5nIGlzIHJlcXVpcmVkOyBqdXN0IG1hcCB0aGUgR0EgYnl0ZXMgdG8gdGhlIHJpZ2h0CisgICAgICAgICAgICAgICAgKiBjb2xvci1tYXAgZW50cnkuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIGV4cGFuZF90Uk5TID0gMTsKKworICAgICAgICAgICAgICAgaWYgKFBOR19HQV9DT0xPUk1BUF9FTlRSSUVTID4gaW1hZ2UtPmNvbG9ybWFwX2VudHJpZXMpCisgICAgICAgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInJnYltnYV0gY29sb3ItbWFwOiB0b28gZmV3IGVudHJpZXMiKTsKKworICAgICAgICAgICAgICAgY21hcF9lbnRyaWVzID0gbWFrZV9nYV9jb2xvcm1hcChkaXNwbGF5KTsKKyAgICAgICAgICAgICAgIGJhY2tncm91bmRfaW5kZXggPSBQTkdfQ01BUF9HQV9CQUNLR1JPVU5EOworICAgICAgICAgICAgICAgb3V0cHV0X3Byb2Nlc3NpbmcgPSBQTkdfQ01BUF9HQTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLyogRWl0aGVyIHRoZSBpbnB1dCBvciB0aGUgb3V0cHV0IGhhcyBubyBhbHBoYSBjaGFubmVsLCBzbyB0aGVyZQorICAgICAgICAgICAgICAgICogd2lsbCBiZSBubyBub24tb3BhcXVlIHBpeGVscyBpbiB0aGUgY29sb3ItbWFwOyBpdCB3aWxsIGp1c3QgYmUKKyAgICAgICAgICAgICAgICAqIGdyYXlzY2FsZS4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgaWYgKFBOR19HUkFZX0NPTE9STUFQX0VOVFJJRVMgPiBpbWFnZS0+Y29sb3JtYXBfZW50cmllcykKKyAgICAgICAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAicmdiW2dyYXldIGNvbG9yLW1hcDogdG9vIGZldyBlbnRyaWVzIik7CisKKyAgICAgICAgICAgICAgIC8qIElkZWFsbHkgdGhpcyBjb2RlIHdvdWxkIHVzZSBsaWJwbmcgdG8gZG8gdGhlIGdhbW1hIGNvcnJlY3Rpb24sCisgICAgICAgICAgICAgICAgKiBidXQgaWYgYW4gaW5wdXQgYWxwaGEgY2hhbm5lbCBpcyB0byBiZSByZW1vdmVkIHdlIHdpbGwgaGl0IHRoZQorICAgICAgICAgICAgICAgICogbGlicG5nIGJ1ZyBpbiBnYW1tYStjb21wb3NlK3JnYi10by1ncmF5ICh0aGUgZG91YmxlIGdhbW1hCisgICAgICAgICAgICAgICAgKiBjb3JyZWN0aW9uIGJ1ZykuICBGaXggdGhpcyBieSBkcm9wcGluZyB0aGUgZ2FtbWEgY29ycmVjdGlvbiBpbgorICAgICAgICAgICAgICAgICogdGhpcyBjYXNlIGFuZCBkb2luZyBpdCBpbiB0aGUgcGFsZXR0ZTsgdGhpcyB3aWxsIHJlc3VsdCBpbgorICAgICAgICAgICAgICAgICogZHVwbGljYXRlIHBhbGV0dGUgZW50cmllcywgYnV0IHRoYXQncyBiZXR0ZXIgdGhhbiB0aGUKKyAgICAgICAgICAgICAgICAqIGFsdGVybmF0aXZlIG9mIGRvdWJsZSBnYW1tYSBjb3JyZWN0aW9uLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICBpZiAoKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBIHx8CisgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5udW1fdHJhbnMgPiAwKSAmJgorICAgICAgICAgICAgICAgICAgcG5nX2dhbW1hX25vdF9zUkdCKHBuZ19wdHItPmNvbG9yc3BhY2UuZ2FtbWEpICE9IDApCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBjbWFwX2VudHJpZXMgPSBtYWtlX2dyYXlfZmlsZV9jb2xvcm1hcChkaXNwbGF5KTsKKyAgICAgICAgICAgICAgICAgIGRhdGFfZW5jb2RpbmcgPSBQX0ZJTEU7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIGNtYXBfZW50cmllcyA9IG1ha2VfZ3JheV9jb2xvcm1hcChkaXNwbGF5KTsKKworICAgICAgICAgICAgICAgLyogQnV0IGlmIHRoZSBpbnB1dCBoYXMgYWxwaGEgb3IgdHJhbnNwYXJlbmN5IGl0IG11c3QgYmUgcmVtb3ZlZAorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEgfHwKKyAgICAgICAgICAgICAgICAgIHBuZ19wdHItPm51bV90cmFucyA+IDApCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwbmdfY29sb3JfMTYgYzsKKyAgICAgICAgICAgICAgICAgIHBuZ191aW50XzMyIGdyYXkgPSBiYWNrX2c7CisKKyAgICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGJhY2tncm91bmQgZXhpc3RzIGluCisgICAgICAgICAgICAgICAgICAgKiB0aGUgY29sb3JtYXAgYW5kIHRoYXQgY29tcGxldGVseSB0cmFuc3BhcmVudCBwaXhlbHMgbWFwIHRvCisgICAgICAgICAgICAgICAgICAgKiBpdC4gIEFjaGlldmUgdGhpcyBzaW1wbHkgYnkgZW5zdXJpbmcgdGhhdCB0aGUgZW50cnkKKyAgICAgICAgICAgICAgICAgICAqIHNlbGVjdGVkIGZvciB0aGUgYmFja2dyb3VuZCByZWFsbHkgaXMgdGhlIGJhY2tncm91bmQgY29sb3IuCisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChkYXRhX2VuY29kaW5nID09IFBfRklMRSkgLyogZnJvbSB0aGUgZml4dXAgYWJvdmUgKi8KKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBhcHAgc3VwcGxpZWQgYSBncmF5IHdoaWNoIGlzIGluIG91dHB1dF9lbmNvZGluZywgd2UKKyAgICAgICAgICAgICAgICAgICAgICAqIG5lZWQgdG8gY29udmVydCBpdCB0byBhIHZhbHVlIG9mIHRoZSBpbnB1dCAoUF9GSUxFKQorICAgICAgICAgICAgICAgICAgICAgICogZW5jb2RpbmcgdGhlbiBzZXQgdGhpcyBwYWxldHRlIGVudHJ5IHRvIHRoZSByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICogb3V0cHV0IGVuY29kaW5nLgorICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0X2VuY29kaW5nID09IFBfc1JHQikKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyYXkgPSBwbmdfc1JHQl90YWJsZVtncmF5XTsgLyogbm93IFBfTElORUFSICovCisKKyAgICAgICAgICAgICAgICAgICAgIGdyYXkgPSBQTkdfRElWMjU3KHBuZ19nYW1tYV8xNmJpdF9jb3JyZWN0KGdyYXksCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5jb2xvcnNwYWNlLmdhbW1hKSk7IC8qIG5vdyBQX0ZJTEUgKi8KKworICAgICAgICAgICAgICAgICAgICAgLyogQW5kIG1ha2Ugc3VyZSB0aGUgY29ycmVzcG9uZGluZyBwYWxldHRlIGVudHJ5IGNvbnRhaW5zCisgICAgICAgICAgICAgICAgICAgICAgKiBleGFjdGx5IHRoZSByZXF1aXJlZCBzUkdCIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICBwbmdfY3JlYXRlX2NvbG9ybWFwX2VudHJ5KGRpc3BsYXksIGdyYXksIGJhY2tfZywgYmFja19nLAorICAgICAgICAgICAgICAgICAgICAgICAgYmFja19nLCAwLyp1bnVzZWQqLywgb3V0cHV0X2VuY29kaW5nKTsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgZWxzZSBpZiAob3V0cHV0X2VuY29kaW5nID09IFBfTElORUFSKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgZ3JheSA9IFBOR19zUkdCX0ZST01fTElORUFSKGdyYXkgKiAyNTUpOworCisgICAgICAgICAgICAgICAgICAgICAvKiBBbmQgbWFrZSBzdXJlIHRoZSBjb3JyZXNwb25kaW5nIHBhbGV0dGUgZW50cnkgbWF0Y2hlcy4KKyAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgcG5nX2NyZWF0ZV9jb2xvcm1hcF9lbnRyeShkaXNwbGF5LCBncmF5LCBiYWNrX2csIGJhY2tfZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tfZywgMC8qdW51c2VkKi8sIFBfTElORUFSKTsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgLyogVGhlIGJhY2tncm91bmQgcGFzc2VkIHRvIGxpYnBuZywgaG93ZXZlciwgbXVzdCBiZSB0aGUKKyAgICAgICAgICAgICAgICAgICAqIG91dHB1dCAobm9ybWFsbHkgc1JHQikgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIGMuaW5kZXggPSAwOyAvKnVudXNlZCovCisgICAgICAgICAgICAgICAgICBjLmdyYXkgPSBjLnJlZCA9IGMuZ3JlZW4gPSBjLmJsdWUgPSAocG5nX3VpbnRfMTYpZ3JheTsKKworICAgICAgICAgICAgICAgICAgLyogTk9URTogdGhlIGZvbGxvd2luZyBpcyBhcHBhcmVudGx5IGEgYnVnIGluIGxpYnBuZy4gV2l0aG91dAorICAgICAgICAgICAgICAgICAgICogaXQgdGhlIHRyYW5zcGFyZW50IGNvbG9yIHJlY29nbml0aW9uIGluCisgICAgICAgICAgICAgICAgICAgKiBwbmdfc2V0X2JhY2tncm91bmRfZml4ZWQgc2VlbXMgdG8gZ28gd3JvbmcuCisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIGV4cGFuZF90Uk5TID0gMTsKKyAgICAgICAgICAgICAgICAgIHBuZ19zZXRfYmFja2dyb3VuZF9maXhlZChwbmdfcHRyLCAmYywKKyAgICAgICAgICAgICAgICAgICAgIFBOR19CQUNLR1JPVU5EX0dBTU1BX1NDUkVFTiwgMC8qbmVlZF9leHBhbmQqLywKKyAgICAgICAgICAgICAgICAgICAgIDAvKmdhbW1hOiBub3QgdXNlZCovKTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgb3V0cHV0X3Byb2Nlc3NpbmcgPSBQTkdfQ01BUF9OT05FOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICBlbHNlIC8qIG91dHB1dCBpcyBjb2xvciAqLworICAgICAgICAgeworICAgICAgICAgICAgLyogV2UgY291bGQgdXNlIHBuZ19xdWFudGl6ZSBoZXJlIHNvIGxvbmcgYXMgdGhlcmUgaXMgbm8gdHJhbnNwYXJlbnQKKyAgICAgICAgICAgICAqIGNvbG9yIG9yIGFscGhhOyBwbmdfcXVhbnRpemUgaWdub3JlcyBhbHBoYS4gIEVhc2llciBvdmVyYWxsIGp1c3QKKyAgICAgICAgICAgICAqIHRvIGRvIGl0IG9uY2UgYW5kIHVzaW5nIFBOR19ESVY1MSBvbiB0aGUgNng2eDYgcmVkdWNlZCBSR0IgY3ViZS4KKyAgICAgICAgICAgICAqIENvbnNlcXVlbnRseSB3ZSBhbHdheXMgd2FudCBsaWJwbmcgdG8gcHJvZHVjZSBzUkdCIGRhdGEuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGRhdGFfZW5jb2RpbmcgPSBQX3NSR0I7CisKKyAgICAgICAgICAgIC8qIElzIHRoZXJlIGFueSB0cmFuc3BhcmVuY3kgb3IgYWxwaGE/ICovCisgICAgICAgICAgICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEgfHwKKyAgICAgICAgICAgICAgIHBuZ19wdHItPm51bV90cmFucyA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvKiBJcyB0aGVyZSBhbHBoYSBpbiB0aGUgb3V0cHV0IHRvbz8gIElmIHNvIGFsbCBmb3VyIGNoYW5uZWxzIGFyZQorICAgICAgICAgICAgICAgICogcHJvY2Vzc2VkIGludG8gYSBzcGVjaWFsIFJHQiBjdWJlIHdpdGggYWxwaGEgc3VwcG9ydC4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgaWYgKChvdXRwdXRfZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FMUEhBKSAhPSAwKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgcjsKKworICAgICAgICAgICAgICAgICAgaWYgKFBOR19SR0JfQ09MT1JNQVBfRU5UUklFUysxKzI3ID4gaW1hZ2UtPmNvbG9ybWFwX2VudHJpZXMpCisgICAgICAgICAgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInJnYithbHBoYSBjb2xvci1tYXA6IHRvbyBmZXcgZW50cmllcyIpOworCisgICAgICAgICAgICAgICAgICBjbWFwX2VudHJpZXMgPSBtYWtlX3JnYl9jb2xvcm1hcChkaXNwbGF5KTsKKworICAgICAgICAgICAgICAgICAgLyogQWRkIGEgdHJhbnNwYXJlbnQgZW50cnkuICovCisgICAgICAgICAgICAgICAgICBwbmdfY3JlYXRlX2NvbG9ybWFwX2VudHJ5KGRpc3BsYXksIGNtYXBfZW50cmllcywgMjU1LCAyNTUsCisgICAgICAgICAgICAgICAgICAgICAyNTUsIDAsIFBfc1JHQik7CisKKyAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgc3RvcmVkIGFzIHRoZSBiYWNrZ3JvdW5kIGluZGV4IGZvciB0aGUgcHJvY2Vzc2luZworICAgICAgICAgICAgICAgICAgICogYWxnb3JpdGhtLgorICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kX2luZGV4ID0gY21hcF9lbnRyaWVzKys7CisKKyAgICAgICAgICAgICAgICAgIC8qIEFkZCAyNyByLGcsYiBlbnRyaWVzIGVhY2ggd2l0aCBhbHBoYSAwLjUuICovCisgICAgICAgICAgICAgICAgICBmb3IgKHI9MDsgcjwyNTY7IHIgPSAociA8PCAxKSB8IDB4N2YpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8zMiBnOworCisgICAgICAgICAgICAgICAgICAgICBmb3IgKGc9MDsgZzwyNTY7IGcgPSAoZyA8PCAxKSB8IDB4N2YpCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8zMiBiOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGdlbmVyYXRlcyBjb21wb25lbnRzIHdpdGggdGhlIHZhbHVlcyAwLCAxMjcgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAyNTUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChiPTA7IGI8MjU2OyBiID0gKGIgPDwgMSkgfCAweDdmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NyZWF0ZV9jb2xvcm1hcF9lbnRyeShkaXNwbGF5LCBjbWFwX2VudHJpZXMrKywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsIGcsIGIsIDEyOCwgUF9zUkdCKTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgZXhwYW5kX3RSTlMgPSAxOworICAgICAgICAgICAgICAgICAgb3V0cHV0X3Byb2Nlc3NpbmcgPSBQTkdfQ01BUF9SR0JfQUxQSEE7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIEFscGhhL3RyYW5zcGFyZW5jeSBtdXN0IGJlIHJlbW92ZWQuICBUaGUgYmFja2dyb3VuZCBtdXN0CisgICAgICAgICAgICAgICAgICAgKiBleGlzdCBpbiB0aGUgY29sb3IgbWFwIChhY2hpZXZlZCBieSBzZXR0aW5nIGFkZGluZyBpdCBhZnRlcgorICAgICAgICAgICAgICAgICAgICogdGhlIDY2NiBjb2xvci1tYXApLiAgSWYgdGhlIHN0YW5kYXJkIHByb2Nlc3NpbmcgY29kZSB3aWxsCisgICAgICAgICAgICAgICAgICAgKiBwaWNrIHVwIHRoaXMgZW50cnkgYXV0b21hdGljYWxseSB0aGF0J3MgYWxsIHRoYXQgaXMKKyAgICAgICAgICAgICAgICAgICAqIHJlcXVpcmVkOyBsaWJwbmcgY2FuIGJlIGNhbGxlZCB0byBkbyB0aGUgYmFja2dyb3VuZAorICAgICAgICAgICAgICAgICAgICogcHJvY2Vzc2luZy4KKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNhbXBsZV9zaXplID0KKyAgICAgICAgICAgICAgICAgICAgIFBOR19JTUFHRV9TQU1QTEVfU0laRShvdXRwdXRfZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgIHBuZ191aW50XzMyIHIsIGcsIGI7IC8qIHNSR0IgYmFja2dyb3VuZCAqLworCisgICAgICAgICAgICAgICAgICBpZiAoUE5HX1JHQl9DT0xPUk1BUF9FTlRSSUVTKzErMjcgPiBpbWFnZS0+Y29sb3JtYXBfZW50cmllcykKKyAgICAgICAgICAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAicmdiLWFscGhhIGNvbG9yLW1hcDogdG9vIGZldyBlbnRyaWVzIik7CisKKyAgICAgICAgICAgICAgICAgIGNtYXBfZW50cmllcyA9IG1ha2VfcmdiX2NvbG9ybWFwKGRpc3BsYXkpOworCisgICAgICAgICAgICAgICAgICBwbmdfY3JlYXRlX2NvbG9ybWFwX2VudHJ5KGRpc3BsYXksIGNtYXBfZW50cmllcywgYmFja19yLAorICAgICAgICAgICAgICAgICAgICAgICAgYmFja19nLCBiYWNrX2IsIDAvKnVudXNlZCovLCBvdXRwdXRfZW5jb2RpbmcpOworCisgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0X2VuY29kaW5nID09IFBfTElORUFSKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgciA9IFBOR19zUkdCX0ZST01fTElORUFSKGJhY2tfciAqIDI1NSk7CisgICAgICAgICAgICAgICAgICAgICBnID0gUE5HX3NSR0JfRlJPTV9MSU5FQVIoYmFja19nICogMjU1KTsKKyAgICAgICAgICAgICAgICAgICAgIGIgPSBQTkdfc1JHQl9GUk9NX0xJTkVBUihiYWNrX2IgKiAyNTUpOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICByID0gYmFja19yOworICAgICAgICAgICAgICAgICAgICAgZyA9IGJhY2tfZzsKKyAgICAgICAgICAgICAgICAgICAgIGIgPSBiYWNrX2c7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIC8qIENvbXBhcmUgdGhlIG5ld2x5LWNyZWF0ZWQgY29sb3ItbWFwIGVudHJ5IHdpdGggdGhlIG9uZSB0aGUKKyAgICAgICAgICAgICAgICAgICAqIFBOR19DTUFQX1JHQiBhbGdvcml0aG0gd2lsbCB1c2UuICBJZiB0aGUgdHdvIGVudHJpZXMgZG9uJ3QKKyAgICAgICAgICAgICAgICAgICAqIG1hdGNoLCBhZGQgdGhlIG5ldyBvbmUgYW5kIHNldCB0aGlzIGFzIHRoZSBiYWNrZ3JvdW5kCisgICAgICAgICAgICAgICAgICAgKiBpbmRleC4KKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgaWYgKG1lbWNtcCgocG5nX2NvbnN0X2J5dGVwKWRpc3BsYXktPmNvbG9ybWFwICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9zaXplICogY21hcF9lbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgKHBuZ19jb25zdF9ieXRlcClkaXNwbGF5LT5jb2xvcm1hcCArCisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVfc2l6ZSAqIFBOR19SR0JfSU5ERVgocixnLGIpLAorICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3NpemUpICE9IDApCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgYmFja2dyb3VuZCBjb2xvciBtdXN0IGJlIGFkZGVkLiAqLworICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZF9pbmRleCA9IGNtYXBfZW50cmllcysrOworCisgICAgICAgICAgICAgICAgICAgICAvKiBBZGQgMjcgcixnLGIgZW50cmllcyBlYWNoIHdpdGggY3JlYXRlZCBieSBjb21wb3Npbmcgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICogdGhlIGJhY2tncm91bmQgYXQgYWxwaGEgMC41LgorICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICBmb3IgKHI9MDsgcjwyNTY7IHIgPSAociA8PCAxKSB8IDB4N2YpCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGc9MDsgZzwyNTY7IGcgPSAoZyA8PCAxKSB8IDB4N2YpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGdlbmVyYXRlcyBjb21wb25lbnRzIHdpdGggdGhlIHZhbHVlcyAwLCAxMjcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCAyNTUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChiPTA7IGI8MjU2OyBiID0gKGIgPDwgMSkgfCAweDdmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NyZWF0ZV9jb2xvcm1hcF9lbnRyeShkaXNwbGF5LCBjbWFwX2VudHJpZXMrKywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19jb2xvcm1hcF9jb21wb3NlKGRpc3BsYXksIHIsIFBfc1JHQiwgMTI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja19yLCBvdXRwdXRfZW5jb2RpbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbG9ybWFwX2NvbXBvc2UoZGlzcGxheSwgZywgUF9zUkdCLCAxMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrX2csIG91dHB1dF9lbmNvZGluZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29sb3JtYXBfY29tcG9zZShkaXNwbGF5LCBiLCBQX3NSR0IsIDEyOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tfYiwgb3V0cHV0X2VuY29kaW5nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAvKnVudXNlZCovLCBvdXRwdXRfZW5jb2RpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICBleHBhbmRfdFJOUyA9IDE7CisgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfcHJvY2Vzc2luZyA9IFBOR19DTUFQX1JHQl9BTFBIQTsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgZWxzZSAvKiBiYWNrZ3JvdW5kIGNvbG9yIGlzIGluIHRoZSBzdGFuZGFyZCBjb2xvci1tYXAgKi8KKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHBuZ19jb2xvcl8xNiBjOworCisgICAgICAgICAgICAgICAgICAgICBjLmluZGV4ID0gMDsgLyp1bnVzZWQqLworICAgICAgICAgICAgICAgICAgICAgYy5yZWQgPSAocG5nX3VpbnRfMTYpYmFja19yOworICAgICAgICAgICAgICAgICAgICAgYy5ncmF5ID0gYy5ncmVlbiA9IChwbmdfdWludF8xNiliYWNrX2c7CisgICAgICAgICAgICAgICAgICAgICBjLmJsdWUgPSAocG5nX3VpbnRfMTYpYmFja19iOworCisgICAgICAgICAgICAgICAgICAgICBwbmdfc2V0X2JhY2tncm91bmRfZml4ZWQocG5nX3B0ciwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICBQTkdfQkFDS0dST1VORF9HQU1NQV9TQ1JFRU4sIDAvKm5lZWRfZXhwYW5kKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAwLypnYW1tYTogbm90IHVzZWQqLyk7CisKKyAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9wcm9jZXNzaW5nID0gUE5HX0NNQVBfUkdCOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbHNlIC8qIG5vIGFscGhhIG9yIHRyYW5zcGFyZW5jeSBpbiB0aGUgaW5wdXQgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8qIEFscGhhIGluIHRoZSBvdXRwdXQgaXMgaXJyZWxldmFudCwgc2ltcGx5IG1hcCB0aGUgb3BhcXVlIGlucHV0CisgICAgICAgICAgICAgICAgKiBwaXhlbHMgdG8gdGhlIDZ4Nng2IGNvbG9yLW1hcC4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgaWYgKFBOR19SR0JfQ09MT1JNQVBfRU5UUklFUyA+IGltYWdlLT5jb2xvcm1hcF9lbnRyaWVzKQorICAgICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJyZ2IgY29sb3ItbWFwOiB0b28gZmV3IGVudHJpZXMiKTsKKworICAgICAgICAgICAgICAgY21hcF9lbnRyaWVzID0gbWFrZV9yZ2JfY29sb3JtYXAoZGlzcGxheSk7CisgICAgICAgICAgICAgICBvdXRwdXRfcHJvY2Vzc2luZyA9IFBOR19DTUFQX1JHQjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1BBTEVUVEU6CisgICAgICAgICAvKiBJdCdzIGFscmVhZHkgZ290IGEgY29sb3ItbWFwLiAgSXQgbWF5IGJlIG5lY2Vzc2FyeSB0byBlbGltaW5hdGUgdGhlCisgICAgICAgICAgKiB0Uk5TIGVudHJpZXMgdGhvdWdoLgorICAgICAgICAgICovCisgICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3RyYW5zID0gcG5nX3B0ci0+bnVtX3RyYW5zOworICAgICAgICAgICAgcG5nX2NvbnN0X2J5dGVwIHRyYW5zID0gbnVtX3RyYW5zID4gMCA/IHBuZ19wdHItPnRyYW5zX2FscGhhIDogTlVMTDsKKyAgICAgICAgICAgIHBuZ19jb25zdF9jb2xvcnAgY29sb3JtYXAgPSBwbmdfcHRyLT5wYWxldHRlOworICAgICAgICAgICAgY29uc3QgaW50IGRvX2JhY2tncm91bmQgPSB0cmFucyAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAob3V0cHV0X2Zvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BTFBIQSkgPT0gMDsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBpOworCisgICAgICAgICAgICAvKiBKdXN0IGluIGNhc2U6ICovCisgICAgICAgICAgICBpZiAodHJhbnMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgIG51bV90cmFucyA9IDA7CisKKyAgICAgICAgICAgIG91dHB1dF9wcm9jZXNzaW5nID0gUE5HX0NNQVBfTk9ORTsKKyAgICAgICAgICAgIGRhdGFfZW5jb2RpbmcgPSBQX0ZJTEU7IC8qIERvbid0IGNoYW5nZSBmcm9tIGNvbG9yLW1hcCBpbmRpY2VzICovCisgICAgICAgICAgICBjbWFwX2VudHJpZXMgPSBwbmdfcHRyLT5udW1fcGFsZXR0ZTsKKyAgICAgICAgICAgIGlmIChjbWFwX2VudHJpZXMgPiAyNTYpCisgICAgICAgICAgICAgICBjbWFwX2VudHJpZXMgPSAyNTY7CisKKyAgICAgICAgICAgIGlmIChjbWFwX2VudHJpZXMgPiBpbWFnZS0+Y29sb3JtYXBfZW50cmllcykKKyAgICAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAicGFsZXR0ZSBjb2xvci1tYXA6IHRvbyBmZXcgZW50cmllcyIpOworCisgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IGNtYXBfZW50cmllczsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKGRvX2JhY2tncm91bmQgIT0gMCAmJiBpIDwgbnVtX3RyYW5zICYmIHRyYW5zW2ldIDwgMjU1KQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zW2ldID09IDApCisgICAgICAgICAgICAgICAgICAgICBwbmdfY3JlYXRlX2NvbG9ybWFwX2VudHJ5KGRpc3BsYXksIGksIGJhY2tfciwgYmFja19nLAorICAgICAgICAgICAgICAgICAgICAgICAgYmFja19iLCAwLCBvdXRwdXRfZW5jb2RpbmcpOworCisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAvKiBNdXN0IGNvbXBvc2UgdGhlIFBORyBmaWxlIGNvbG9yIGluIHRoZSBjb2xvci1tYXAgZW50cnkKKyAgICAgICAgICAgICAgICAgICAgICAqIG9uIHRoZSBzUkdCIGNvbG9yIGluICdiYWNrJy4KKyAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgcG5nX2NyZWF0ZV9jb2xvcm1hcF9lbnRyeShkaXNwbGF5LCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbG9ybWFwX2NvbXBvc2UoZGlzcGxheSwgY29sb3JtYXBbaV0ucmVkLCBQX0ZJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1tpXSwgYmFja19yLCBvdXRwdXRfZW5jb2RpbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbG9ybWFwX2NvbXBvc2UoZGlzcGxheSwgY29sb3JtYXBbaV0uZ3JlZW4sIFBfRklMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zW2ldLCBiYWNrX2csIG91dHB1dF9lbmNvZGluZyksCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29sb3JtYXBfY29tcG9zZShkaXNwbGF5LCBjb2xvcm1hcFtpXS5ibHVlLCBQX0ZJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1tpXSwgYmFja19iLCBvdXRwdXRfZW5jb2RpbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2VuY29kaW5nID09IFBfTElORUFSID8gdHJhbnNbaV0gKiAyNTdVIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2VuY29kaW5nKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgcG5nX2NyZWF0ZV9jb2xvcm1hcF9lbnRyeShkaXNwbGF5LCBpLCBjb2xvcm1hcFtpXS5yZWQsCisgICAgICAgICAgICAgICAgICAgICBjb2xvcm1hcFtpXS5ncmVlbiwgY29sb3JtYXBbaV0uYmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGkgPCBudW1fdHJhbnMgPyB0cmFuc1tpXSA6IDI1NVUsIFBfRklMRS8qOC1iaXQqLyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFRoZSBQTkcgZGF0YSBtYXkgaGF2ZSBpbmRpY2VzIHBhY2tlZCBpbiBmZXdlciB0aGFuIDggYml0cywgaXQKKyAgICAgICAgICAgICAqIG11c3QgYmUgZXhwYW5kZWQgaWYgc28uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT5iaXRfZGVwdGggPCA4KQorICAgICAgICAgICAgICAgcG5nX3NldF9wYWNraW5nKHBuZ19wdHIpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImludmFsaWQgUE5HIGNvbG9yIHR5cGUiKTsKKyAgICAgICAgIC8qTk9UIFJFQUNIRUQqLworICAgfQorCisgICAvKiBOb3cgZGVhbCB3aXRoIHRoZSBvdXRwdXQgcHJvY2Vzc2luZyAqLworICAgaWYgKGV4cGFuZF90Uk5TICE9IDAgJiYgcG5nX3B0ci0+bnVtX3RyYW5zID4gMCAmJgorICAgICAgIChwbmdfcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpID09IDApCisgICAgICBwbmdfc2V0X3RSTlNfdG9fYWxwaGEocG5nX3B0cik7CisKKyAgIHN3aXRjaCAoZGF0YV9lbmNvZGluZykKKyAgIHsKKyAgICAgIGNhc2UgUF9zUkdCOgorICAgICAgICAgLyogQ2hhbmdlIHRvIDgtYml0IHNSR0IgKi8KKyAgICAgICAgIHBuZ19zZXRfYWxwaGFfbW9kZV9maXhlZChwbmdfcHRyLCBQTkdfQUxQSEFfUE5HLCBQTkdfR0FNTUFfc1JHQik7CisgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKworICAgICAgY2FzZSBQX0ZJTEU6CisgICAgICAgICBpZiAocG5nX3B0ci0+Yml0X2RlcHRoID4gOCkKKyAgICAgICAgICAgIHBuZ19zZXRfc2NhbGVfMTYocG5nX3B0cik7CisgICAgICAgICBicmVhazsKKworI2lmZGVmIF9fR05VQ19fCisgICAgICBkZWZhdWx0OgorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJiYWQgZGF0YSBvcHRpb24gKGludGVybmFsIGVycm9yKSIpOworI2VuZGlmCisgICB9CisKKyAgIGlmIChjbWFwX2VudHJpZXMgPiAyNTYgfHwgY21hcF9lbnRyaWVzID4gaW1hZ2UtPmNvbG9ybWFwX2VudHJpZXMpCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImNvbG9yIG1hcCBvdmVyZmxvdyAoQkFEIGludGVybmFsIGVycm9yKSIpOworCisgICBpbWFnZS0+Y29sb3JtYXBfZW50cmllcyA9IGNtYXBfZW50cmllczsKKworICAgLyogRG91YmxlIGNoZWNrIHVzaW5nIHRoZSByZWNvcmRlZCBiYWNrZ3JvdW5kIGluZGV4ICovCisgICBzd2l0Y2ggKG91dHB1dF9wcm9jZXNzaW5nKQorICAgeworICAgICAgY2FzZSBQTkdfQ01BUF9OT05FOgorICAgICAgICAgaWYgKGJhY2tncm91bmRfaW5kZXggIT0gUE5HX0NNQVBfTk9ORV9CQUNLR1JPVU5EKQorICAgICAgICAgICAgZ290byBiYWRfYmFja2dyb3VuZDsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBOR19DTUFQX0dBOgorICAgICAgICAgaWYgKGJhY2tncm91bmRfaW5kZXggIT0gUE5HX0NNQVBfR0FfQkFDS0dST1VORCkKKyAgICAgICAgICAgIGdvdG8gYmFkX2JhY2tncm91bmQ7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBQTkdfQ01BUF9UUkFOUzoKKyAgICAgICAgIGlmIChiYWNrZ3JvdW5kX2luZGV4ID49IGNtYXBfZW50cmllcyB8fAorICAgICAgICAgICAgYmFja2dyb3VuZF9pbmRleCAhPSBQTkdfQ01BUF9UUkFOU19CQUNLR1JPVU5EKQorICAgICAgICAgICAgZ290byBiYWRfYmFja2dyb3VuZDsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBOR19DTUFQX1JHQjoKKyAgICAgICAgIGlmIChiYWNrZ3JvdW5kX2luZGV4ICE9IFBOR19DTUFQX1JHQl9CQUNLR1JPVU5EKQorICAgICAgICAgICAgZ290byBiYWRfYmFja2dyb3VuZDsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBOR19DTUFQX1JHQl9BTFBIQToKKyAgICAgICAgIGlmIChiYWNrZ3JvdW5kX2luZGV4ICE9IFBOR19DTUFQX1JHQl9BTFBIQV9CQUNLR1JPVU5EKQorICAgICAgICAgICAgZ290byBiYWRfYmFja2dyb3VuZDsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJiYWQgcHJvY2Vzc2luZyBvcHRpb24gKGludGVybmFsIGVycm9yKSIpOworCisgICAgICBiYWRfYmFja2dyb3VuZDoKKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiYmFkIGJhY2tncm91bmQgaW5kZXggKGludGVybmFsIGVycm9yKSIpOworICAgfQorCisgICBkaXNwbGF5LT5jb2xvcm1hcF9wcm9jZXNzaW5nID0gb3V0cHV0X3Byb2Nlc3Npbmc7CisKKyAgIHJldHVybiAxLypvayovOworfQorCisvKiBUaGUgZmluYWwgcGFydCBvZiB0aGUgY29sb3ItbWFwIHJlYWQgY2FsbGVkIGZyb20gcG5nX2ltYWdlX2ZpbmlzaF9yZWFkLiAqLworc3RhdGljIGludAorcG5nX2ltYWdlX3JlYWRfYW5kX21hcChwbmdfdm9pZHAgYXJndW1lbnQpCit7CisgICBwbmdfaW1hZ2VfcmVhZF9jb250cm9sICpkaXNwbGF5ID0gcG5nX3ZvaWRjYXN0KHBuZ19pbWFnZV9yZWFkX2NvbnRyb2wqLAorICAgICAgYXJndW1lbnQpOworICAgcG5nX2ltYWdlcCBpbWFnZSA9IGRpc3BsYXktPmltYWdlOworICAgcG5nX3N0cnVjdHJwIHBuZ19wdHIgPSBpbWFnZS0+b3BhcXVlLT5wbmdfcHRyOworICAgaW50IHBhc3NlczsKKworICAgLyogQ2FsbGVkIHdoZW4gdGhlIGxpYnBuZyBkYXRhIG11c3QgYmUgdHJhbnNmb3JtZWQgaW50byB0aGUgY29sb3ItbWFwcGVkCisgICAgKiBmb3JtLiAgVGhlcmUgaXMgYSBsb2NhbCByb3cgYnVmZmVyIGluIGRpc3BsYXktPmxvY2FsIGFuZCB0aGlzIHJvdXRpbmUgbXVzdAorICAgICogZG8gdGhlIGludGVybGFjZSBoYW5kbGluZy4KKyAgICAqLworICAgc3dpdGNoIChwbmdfcHRyLT5pbnRlcmxhY2VkKQorICAgeworICAgICAgY2FzZSBQTkdfSU5URVJMQUNFX05PTkU6CisgICAgICAgICBwYXNzZXMgPSAxOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUE5HX0lOVEVSTEFDRV9BREFNNzoKKyAgICAgICAgIHBhc3NlcyA9IFBOR19JTlRFUkxBQ0VfQURBTTdfUEFTU0VTOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInVua25vd24gaW50ZXJsYWNlIHR5cGUiKTsKKyAgIH0KKworICAgeworICAgICAgcG5nX3VpbnRfMzIgIGhlaWdodCA9IGltYWdlLT5oZWlnaHQ7CisgICAgICBwbmdfdWludF8zMiAgd2lkdGggPSBpbWFnZS0+d2lkdGg7CisgICAgICBpbnQgICAgICAgICAgcHJvYyA9IGRpc3BsYXktPmNvbG9ybWFwX3Byb2Nlc3Npbmc7CisgICAgICBwbmdfYnl0ZXAgICAgZmlyc3Rfcm93ID0gcG5nX3ZvaWRjYXN0KHBuZ19ieXRlcCwgZGlzcGxheS0+Zmlyc3Rfcm93KTsKKyAgICAgIHB0cmRpZmZfdCAgICBzdGVwX3JvdyA9IGRpc3BsYXktPnJvd19ieXRlczsKKyAgICAgIGludCBwYXNzOworCisgICAgICBmb3IgKHBhc3MgPSAwOyBwYXNzIDwgcGFzc2VzOyArK3Bhc3MpCisgICAgICB7CisgICAgICAgICB1bnNpZ25lZCBpbnQgICAgIHN0YXJ0eCwgc3RlcHgsIHN0ZXB5OworICAgICAgICAgcG5nX3VpbnRfMzIgICAgICB5OworCisgICAgICAgICBpZiAocG5nX3B0ci0+aW50ZXJsYWNlZCA9PSBQTkdfSU5URVJMQUNFX0FEQU03KQorICAgICAgICAgeworICAgICAgICAgICAgLyogVGhlIHJvdyBtYXkgYmUgZW1wdHkgZm9yIGEgc2hvcnQgaW1hZ2U6ICovCisgICAgICAgICAgICBpZiAoUE5HX1BBU1NfQ09MUyh3aWR0aCwgcGFzcykgPT0gMCkKKyAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBzdGFydHggPSBQTkdfUEFTU19TVEFSVF9DT0wocGFzcyk7CisgICAgICAgICAgICBzdGVweCA9IFBOR19QQVNTX0NPTF9PRkZTRVQocGFzcyk7CisgICAgICAgICAgICB5ID0gUE5HX1BBU1NfU1RBUlRfUk9XKHBhc3MpOworICAgICAgICAgICAgc3RlcHkgPSBQTkdfUEFTU19ST1dfT0ZGU0VUKHBhc3MpOworICAgICAgICAgfQorCisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICB5ID0gMDsKKyAgICAgICAgICAgIHN0YXJ0eCA9IDA7CisgICAgICAgICAgICBzdGVweCA9IHN0ZXB5ID0gMTsKKyAgICAgICAgIH0KKworICAgICAgICAgZm9yICg7IHk8aGVpZ2h0OyB5ICs9IHN0ZXB5KQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIGlucm93ID0gcG5nX3ZvaWRjYXN0KHBuZ19ieXRlcCwgZGlzcGxheS0+bG9jYWxfcm93KTsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBvdXRyb3cgPSBmaXJzdF9yb3cgKyB5ICogc3RlcF9yb3c7CisgICAgICAgICAgICBwbmdfY29uc3RfYnl0ZXAgZW5kX3JvdyA9IG91dHJvdyArIHdpZHRoOworCisgICAgICAgICAgICAvKiBSZWFkIHJlYWQgdGhlIGxpYnBuZyBkYXRhIGludG8gdGhlIHRlbXBvcmFyeSBidWZmZXIuICovCisgICAgICAgICAgICBwbmdfcmVhZF9yb3cocG5nX3B0ciwgaW5yb3csIE5VTEwpOworCisgICAgICAgICAgICAvKiBOb3cgcHJvY2VzcyB0aGUgcm93IGFjY29yZGluZyB0byB0aGUgcHJvY2Vzc2luZyBvcHRpb24sIG5vdGUKKyAgICAgICAgICAgICAqIHRoYXQgdGhlIGNhbGxlciB2ZXJpZmllcyB0aGF0IHRoZSBmb3JtYXQgb2YgdGhlIGxpYnBuZyBvdXRwdXQKKyAgICAgICAgICAgICAqIGRhdGEgaXMgYXMgcmVxdWlyZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG91dHJvdyArPSBzdGFydHg7CisgICAgICAgICAgICBzd2l0Y2ggKHByb2MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBjYXNlIFBOR19DTUFQX0dBOgorICAgICAgICAgICAgICAgICAgZm9yICg7IG91dHJvdyA8IGVuZF9yb3c7IG91dHJvdyArPSBzdGVweCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBkYXRhIGlzIGFsd2F5cyBpbiB0aGUgUE5HIG9yZGVyICovCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZ3JheSA9ICppbnJvdysrOworICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGFscGhhID0gKmlucm93Kys7CisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZW50cnk7CisKKyAgICAgICAgICAgICAgICAgICAgIC8qIE5PVEU6IHRoaXMgY29kZSBpcyBjb3BpZWQgYXMgYSBjb21tZW50IGluCisgICAgICAgICAgICAgICAgICAgICAgKiBtYWtlX2dhX2NvbG9ybWFwIGFib3ZlLiAgUGxlYXNlIHVwZGF0ZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAqIGNvbW1lbnQgaWYgeW91IGNoYW5nZSB0aGlzIGNvZGUhCisgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgIGlmIChhbHBoYSA+IDIyOSkgLyogb3BhcXVlICovCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSA9ICgyMzEgKiBncmF5ICsgMTI4KSA+PiA4OworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYWxwaGEgPCAyNikgLyogdHJhbnNwYXJlbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gMjMxOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgZWxzZSAvKiBwYXJ0aWFsbHkgb3BhcXVlICovCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IDIyNiArIDYgKiBQTkdfRElWNTEoYWxwaGEpICsgUE5HX0RJVjUxKGdyYXkpOworICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAqb3V0cm93ID0gKHBuZ19ieXRlKWVudHJ5OworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgIGNhc2UgUE5HX0NNQVBfVFJBTlM6CisgICAgICAgICAgICAgICAgICBmb3IgKDsgb3V0cm93IDwgZW5kX3Jvdzsgb3V0cm93ICs9IHN0ZXB4KQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgcG5nX2J5dGUgZ3JheSA9ICppbnJvdysrOworICAgICAgICAgICAgICAgICAgICAgcG5nX2J5dGUgYWxwaGEgPSAqaW5yb3crKzsKKworICAgICAgICAgICAgICAgICAgICAgaWYgKGFscGhhID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAqb3V0cm93ID0gUE5HX0NNQVBfVFJBTlNfQkFDS0dST1VORDsKKworICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZ3JheSAhPSBQTkdfQ01BUF9UUkFOU19CQUNLR1JPVU5EKQorICAgICAgICAgICAgICAgICAgICAgICAgKm91dHJvdyA9IGdyYXk7CisKKyAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICpvdXRyb3cgPSAocG5nX2J5dGUpKFBOR19DTUFQX1RSQU5TX0JBQ0tHUk9VTkQrMSk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgY2FzZSBQTkdfQ01BUF9SR0I6CisgICAgICAgICAgICAgICAgICBmb3IgKDsgb3V0cm93IDwgZW5kX3Jvdzsgb3V0cm93ICs9IHN0ZXB4KQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgKm91dHJvdyA9IFBOR19SR0JfSU5ERVgoaW5yb3dbMF0sIGlucm93WzFdLCBpbnJvd1syXSk7CisgICAgICAgICAgICAgICAgICAgICBpbnJvdyArPSAzOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgIGNhc2UgUE5HX0NNQVBfUkdCX0FMUEhBOgorICAgICAgICAgICAgICAgICAgZm9yICg7IG91dHJvdyA8IGVuZF9yb3c7IG91dHJvdyArPSBzdGVweCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBhbHBoYSA9IGlucm93WzNdOworCisgICAgICAgICAgICAgICAgICAgICAvKiBCZWNhdXNlIHRoZSBhbHBoYSBlbnRyaWVzIG9ubHkgaG9sZCBhbHBoYT09MC41IHZhbHVlcworICAgICAgICAgICAgICAgICAgICAgICogc3BsaXQgdGhlIHByb2Nlc3NpbmcgYXQgYWxwaGE9PTAuMjUgKDY0KSBhbmQgMC43NQorICAgICAgICAgICAgICAgICAgICAgICogKDE5NikuCisgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgICAgICAgaWYgKGFscGhhID49IDE5NikKKyAgICAgICAgICAgICAgICAgICAgICAgICpvdXRyb3cgPSBQTkdfUkdCX0lOREVYKGlucm93WzBdLCBpbnJvd1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucm93WzJdKTsKKworICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYWxwaGEgPCA2NCkKKyAgICAgICAgICAgICAgICAgICAgICAgICpvdXRyb3cgPSBQTkdfQ01BUF9SR0JfQUxQSEFfQkFDS0dST1VORDsKKworICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogTGlrZXdpc2UgdGhlcmUgYXJlIHRocmVlIGVudHJpZXMgZm9yIGVhY2ggb2YgciwgZworICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIGIuICBXZSBjb3VsZCBzZWxlY3QgdGhlIGVudHJ5IGJ5IHBvcGNvdW50IG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgdG9wIHR3byBiaXRzIG9uIHRob3NlIGFyY2hpdGVjdHVyZXMgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICogc3VwcG9ydCBpdCwgdGhpcyBpcyB3aGF0IHRoZSBjb2RlIGJlbG93IGRvZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBjcnVkZWx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYmFja19pID0gUE5HX0NNQVBfUkdCX0FMUEhBX0JBQ0tHUk9VTkQrMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogSGVyZSBhcmUgaG93IHRoZSB2YWx1ZXMgbWFwOgorICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIDB4MDAgLi4gMHgzZiAtPiAwCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAweDQwIC4uIDB4YmYgLT4gMQorICAgICAgICAgICAgICAgICAgICAgICAgICogMHhjMCAuLiAweGZmIC0+IDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBTbywgYXMgYWJvdmUgd2l0aCB0aGUgZXhwbGljaXQgYWxwaGEgY2hlY2tzLCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGJyZWFrcG9pbnRzIGFyZSBhdCA2NCBhbmQgMTk2LgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5yb3dbMF0gJiAweDgwKSBiYWNrX2kgKz0gOTsgLyogcmVkICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5yb3dbMF0gJiAweDQwKSBiYWNrX2kgKz0gOTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnJvd1swXSAmIDB4ODApIGJhY2tfaSArPSAzOyAvKiBncmVlbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucm93WzBdICYgMHg0MCkgYmFja19pICs9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5yb3dbMF0gJiAweDgwKSBiYWNrX2kgKz0gMTsgLyogYmx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucm93WzBdICYgMHg0MCkgYmFja19pICs9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICpvdXRyb3cgPSAocG5nX2J5dGUpYmFja19pOworICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICBpbnJvdyArPSA0OworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK3BuZ19pbWFnZV9yZWFkX2NvbG9ybWFwcGVkKHBuZ192b2lkcCBhcmd1bWVudCkKK3sKKyAgIHBuZ19pbWFnZV9yZWFkX2NvbnRyb2wgKmRpc3BsYXkgPSBwbmdfdm9pZGNhc3QocG5nX2ltYWdlX3JlYWRfY29udHJvbCosCisgICAgICBhcmd1bWVudCk7CisgICBwbmdfaW1hZ2VwIGltYWdlID0gZGlzcGxheS0+aW1hZ2U7CisgICBwbmdfY29udHJvbHAgY29udHJvbCA9IGltYWdlLT5vcGFxdWU7CisgICBwbmdfc3RydWN0cnAgcG5nX3B0ciA9IGNvbnRyb2wtPnBuZ19wdHI7CisgICBwbmdfaW5mb3JwIGluZm9fcHRyID0gY29udHJvbC0+aW5mb19wdHI7CisKKyAgIGludCBwYXNzZXMgPSAwOyAvKiBBcyBhIGZsYWcgKi8KKworICAgUE5HX1NLSVBfQ0hVTktTKHBuZ19wdHIpOworCisgICAvKiBVcGRhdGUgdGhlICdpbmZvJyBzdHJ1Y3R1cmUgYW5kIG1ha2Ugc3VyZSB0aGUgcmVzdWx0IGlzIGFzIHJlcXVpcmVkOyBmaXJzdAorICAgICogbWFrZSBzdXJlIHRvIHR1cm4gb24gdGhlIGludGVybGFjZSBoYW5kbGluZyBpZiBpdCB3aWxsIGJlIHJlcXVpcmVkCisgICAgKiAoYmVjYXVzZSBpdCBjYW4ndCBiZSB0dXJuZWQgb24gKmFmdGVyKiB0aGUgY2FsbCB0byBwbmdfcmVhZF91cGRhdGVfaW5mbyEpCisgICAgKi8KKyAgIGlmIChkaXNwbGF5LT5jb2xvcm1hcF9wcm9jZXNzaW5nID09IFBOR19DTUFQX05PTkUpCisgICAgICBwYXNzZXMgPSBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyhwbmdfcHRyKTsKKworICAgcG5nX3JlYWRfdXBkYXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOworCisgICAvKiBUaGUgZXhwZWN0ZWQgb3V0cHV0IGNhbiBiZSBkZWR1Y2VkIGZyb20gdGhlIGNvbG9ybWFwX3Byb2Nlc3Npbmcgb3B0aW9uLiAqLworICAgc3dpdGNoIChkaXNwbGF5LT5jb2xvcm1hcF9wcm9jZXNzaW5nKQorICAgeworICAgICAgY2FzZSBQTkdfQ01BUF9OT05FOgorICAgICAgICAgLyogT3V0cHV0IG11c3QgYmUgb25lIGNoYW5uZWwgYW5kIG9uZSBieXRlIHBlciBwaXhlbCwgdGhlIG91dHB1dAorICAgICAgICAgICogZW5jb2RpbmcgY2FuIGJlIGFueXRoaW5nLgorICAgICAgICAgICovCisgICAgICAgICBpZiAoKGluZm9fcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgfHwKKyAgICAgICAgICAgIGluZm9fcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpICYmCisgICAgICAgICAgICBpbmZvX3B0ci0+Yml0X2RlcHRoID09IDgpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgZ290byBiYWRfb3V0cHV0OworCisgICAgICBjYXNlIFBOR19DTUFQX1RSQU5TOgorICAgICAgY2FzZSBQTkdfQ01BUF9HQToKKyAgICAgICAgIC8qIE91dHB1dCBtdXN0IGJlIHR3byBjaGFubmVscyBhbmQgdGhlICdHJyBvbmUgbXVzdCBiZSBzUkdCLCB0aGUgbGF0dGVyCisgICAgICAgICAgKiBjYW4gYmUgY2hlY2tlZCB3aXRoIGFuIGV4YWN0IG51bWJlciBiZWNhdXNlIGl0IHNob3VsZCBoYXZlIGJlZW4gc2V0CisgICAgICAgICAgKiB0byB0aGlzIG51bWJlciBhYm92ZSEKKyAgICAgICAgICAqLworICAgICAgICAgaWYgKGluZm9fcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEgJiYKKyAgICAgICAgICAgIGluZm9fcHRyLT5iaXRfZGVwdGggPT0gOCAmJgorICAgICAgICAgICAgcG5nX3B0ci0+c2NyZWVuX2dhbW1hID09IFBOR19HQU1NQV9zUkdCICYmCisgICAgICAgICAgICBpbWFnZS0+Y29sb3JtYXBfZW50cmllcyA9PSAyNTYpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgZ290byBiYWRfb3V0cHV0OworCisgICAgICBjYXNlIFBOR19DTUFQX1JHQjoKKyAgICAgICAgIC8qIE91dHB1dCBtdXN0IGJlIDgtYml0IHNSR0IgZW5jb2RlZCBSR0IgKi8KKyAgICAgICAgIGlmIChpbmZvX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgJiYKKyAgICAgICAgICAgIGluZm9fcHRyLT5iaXRfZGVwdGggPT0gOCAmJgorICAgICAgICAgICAgcG5nX3B0ci0+c2NyZWVuX2dhbW1hID09IFBOR19HQU1NQV9zUkdCICYmCisgICAgICAgICAgICBpbWFnZS0+Y29sb3JtYXBfZW50cmllcyA9PSAyMTYpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgZ290byBiYWRfb3V0cHV0OworCisgICAgICBjYXNlIFBOR19DTUFQX1JHQl9BTFBIQToKKyAgICAgICAgIC8qIE91dHB1dCBtdXN0IGJlIDgtYml0IHNSR0IgZW5jb2RlZCBSR0JBICovCisgICAgICAgICBpZiAoaW5mb19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBICYmCisgICAgICAgICAgICBpbmZvX3B0ci0+Yml0X2RlcHRoID09IDggJiYKKyAgICAgICAgICAgIHBuZ19wdHItPnNjcmVlbl9nYW1tYSA9PSBQTkdfR0FNTUFfc1JHQiAmJgorICAgICAgICAgICAgaW1hZ2UtPmNvbG9ybWFwX2VudHJpZXMgPT0gMjQ0IC8qIDIxNiArIDEgKyAyNyAqLykKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAvKiBnb3RvIGJhZF9vdXRwdXQ7ICovCisgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKworICAgICAgZGVmYXVsdDoKKyAgICAgIGJhZF9vdXRwdXQ6CisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImJhZCBjb2xvci1tYXAgcHJvY2Vzc2luZyAoaW50ZXJuYWwgZXJyb3IpIik7CisgICB9CisKKyAgIC8qIE5vdyByZWFkIHRoZSByb3dzLiAgRG8gdGhpcyBoZXJlIGlmIGl0IGlzIHBvc3NpYmxlIHRvIHJlYWQgZGlyZWN0bHkgaW50bworICAgICogdGhlIG91dHB1dCBidWZmZXIsIG90aGVyd2lzZSBhbGxvY2F0ZSBhIGxvY2FsIHJvdyBidWZmZXIgb2YgdGhlIG1heGltdW0KKyAgICAqIHNpemUgbGlicG5nIHJlcXVpcmVzIGFuZCBjYWxsIHRoZSByZWxldmFudCBwcm9jZXNzaW5nIHJvdXRpbmUgc2FmZWx5LgorICAgICovCisgICB7CisgICAgICBwbmdfdm9pZHAgZmlyc3Rfcm93ID0gZGlzcGxheS0+YnVmZmVyOworICAgICAgcHRyZGlmZl90IHJvd19ieXRlcyA9IGRpc3BsYXktPnJvd19zdHJpZGU7CisKKyAgICAgIC8qIFRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbiBpcyBkZXNpZ25lZCB0byB3b3JrIGNvcnJlY3RseSB3aGV0aGVyIGl0IGdpdmVzCisgICAgICAgKiBhIHNpZ25lZCBvciBhbiB1bnNpZ25lZCByZXN1bHQuCisgICAgICAgKi8KKyAgICAgIGlmIChyb3dfYnl0ZXMgPCAwKQorICAgICAgeworICAgICAgICAgY2hhciAqcHRyID0gcG5nX3ZvaWRjYXN0KGNoYXIqLCBmaXJzdF9yb3cpOworICAgICAgICAgcHRyICs9IChpbWFnZS0+aGVpZ2h0LTEpICogKC1yb3dfYnl0ZXMpOworICAgICAgICAgZmlyc3Rfcm93ID0gcG5nX3ZvaWRjYXN0KHBuZ192b2lkcCwgcHRyKTsKKyAgICAgIH0KKworICAgICAgZGlzcGxheS0+Zmlyc3Rfcm93ID0gZmlyc3Rfcm93OworICAgICAgZGlzcGxheS0+cm93X2J5dGVzID0gcm93X2J5dGVzOworICAgfQorCisgICBpZiAocGFzc2VzID09IDApCisgICB7CisgICAgICBpbnQgcmVzdWx0OworICAgICAgcG5nX3ZvaWRwIHJvdyA9IHBuZ19tYWxsb2MocG5nX3B0ciwgcG5nX2dldF9yb3dieXRlcyhwbmdfcHRyLCBpbmZvX3B0cikpOworCisgICAgICBkaXNwbGF5LT5sb2NhbF9yb3cgPSByb3c7CisgICAgICByZXN1bHQgPSBwbmdfc2FmZV9leGVjdXRlKGltYWdlLCBwbmdfaW1hZ2VfcmVhZF9hbmRfbWFwLCBkaXNwbGF5KTsKKyAgICAgIGRpc3BsYXktPmxvY2FsX3JvdyA9IE5VTEw7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCByb3cpOworCisgICAgICByZXR1cm4gcmVzdWx0OworICAgfQorCisgICBlbHNlCisgICB7CisgICAgICBwbmdfYWxsb2Nfc2l6ZV90IHJvd19ieXRlcyA9IGRpc3BsYXktPnJvd19ieXRlczsKKworICAgICAgd2hpbGUgKC0tcGFzc2VzID49IDApCisgICAgICB7CisgICAgICAgICBwbmdfdWludF8zMiAgICAgIHkgPSBpbWFnZS0+aGVpZ2h0OworICAgICAgICAgcG5nX2J5dGVwICAgICAgICByb3cgPSBwbmdfdm9pZGNhc3QocG5nX2J5dGVwLCBkaXNwbGF5LT5maXJzdF9yb3cpOworCisgICAgICAgICB3aGlsZSAoeS0tID4gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19yZWFkX3JvdyhwbmdfcHRyLCByb3csIE5VTEwpOworICAgICAgICAgICAgcm93ICs9IHJvd19ieXRlczsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIDE7CisgICB9Cit9CisKKy8qIEp1c3QgdGhlIHJvdyByZWFkaW5nIHBhcnQgb2YgcG5nX2ltYWdlX3JlYWQuICovCitzdGF0aWMgaW50CitwbmdfaW1hZ2VfcmVhZF9jb21wb3NpdGUocG5nX3ZvaWRwIGFyZ3VtZW50KQoreworICAgcG5nX2ltYWdlX3JlYWRfY29udHJvbCAqZGlzcGxheSA9IHBuZ192b2lkY2FzdChwbmdfaW1hZ2VfcmVhZF9jb250cm9sKiwKKyAgICAgIGFyZ3VtZW50KTsKKyAgIHBuZ19pbWFnZXAgaW1hZ2UgPSBkaXNwbGF5LT5pbWFnZTsKKyAgIHBuZ19zdHJ1Y3RycCBwbmdfcHRyID0gaW1hZ2UtPm9wYXF1ZS0+cG5nX3B0cjsKKyAgIGludCBwYXNzZXM7CisKKyAgIHN3aXRjaCAocG5nX3B0ci0+aW50ZXJsYWNlZCkKKyAgIHsKKyAgICAgIGNhc2UgUE5HX0lOVEVSTEFDRV9OT05FOgorICAgICAgICAgcGFzc2VzID0gMTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBOR19JTlRFUkxBQ0VfQURBTTc6CisgICAgICAgICBwYXNzZXMgPSBQTkdfSU5URVJMQUNFX0FEQU03X1BBU1NFUzsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJ1bmtub3duIGludGVybGFjZSB0eXBlIik7CisgICB9CisKKyAgIHsKKyAgICAgIHBuZ191aW50XzMyICBoZWlnaHQgPSBpbWFnZS0+aGVpZ2h0OworICAgICAgcG5nX3VpbnRfMzIgIHdpZHRoID0gaW1hZ2UtPndpZHRoOworICAgICAgcHRyZGlmZl90ICAgIHN0ZXBfcm93ID0gZGlzcGxheS0+cm93X2J5dGVzOworICAgICAgdW5zaWduZWQgaW50IGNoYW5uZWxzID0KKyAgICAgICAgICAoaW1hZ2UtPmZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19DT0xPUikgIT0gMCA/IDMgOiAxOworICAgICAgaW50IHBhc3M7CisKKyAgICAgIGZvciAocGFzcyA9IDA7IHBhc3MgPCBwYXNzZXM7ICsrcGFzcykKKyAgICAgIHsKKyAgICAgICAgIHVuc2lnbmVkIGludCAgICAgc3RhcnR4LCBzdGVweCwgc3RlcHk7CisgICAgICAgICBwbmdfdWludF8zMiAgICAgIHk7CisKKyAgICAgICAgIGlmIChwbmdfcHRyLT5pbnRlcmxhY2VkID09IFBOR19JTlRFUkxBQ0VfQURBTTcpCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGUgcm93IG1heSBiZSBlbXB0eSBmb3IgYSBzaG9ydCBpbWFnZTogKi8KKyAgICAgICAgICAgIGlmIChQTkdfUEFTU19DT0xTKHdpZHRoLCBwYXNzKSA9PSAwKQorICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIHN0YXJ0eCA9IFBOR19QQVNTX1NUQVJUX0NPTChwYXNzKSAqIGNoYW5uZWxzOworICAgICAgICAgICAgc3RlcHggPSBQTkdfUEFTU19DT0xfT0ZGU0VUKHBhc3MpICogY2hhbm5lbHM7CisgICAgICAgICAgICB5ID0gUE5HX1BBU1NfU1RBUlRfUk9XKHBhc3MpOworICAgICAgICAgICAgc3RlcHkgPSBQTkdfUEFTU19ST1dfT0ZGU0VUKHBhc3MpOworICAgICAgICAgfQorCisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICB5ID0gMDsKKyAgICAgICAgICAgIHN0YXJ0eCA9IDA7CisgICAgICAgICAgICBzdGVweCA9IGNoYW5uZWxzOworICAgICAgICAgICAgc3RlcHkgPSAxOworICAgICAgICAgfQorCisgICAgICAgICBmb3IgKDsgeTxoZWlnaHQ7IHkgKz0gc3RlcHkpCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgaW5yb3cgPSBwbmdfdm9pZGNhc3QocG5nX2J5dGVwLCBkaXNwbGF5LT5sb2NhbF9yb3cpOworICAgICAgICAgICAgcG5nX2J5dGVwIG91dHJvdzsKKyAgICAgICAgICAgIHBuZ19jb25zdF9ieXRlcCBlbmRfcm93OworCisgICAgICAgICAgICAvKiBSZWFkIHRoZSByb3csIHdoaWNoIGlzIHBhY2tlZDogKi8KKyAgICAgICAgICAgIHBuZ19yZWFkX3JvdyhwbmdfcHRyLCBpbnJvdywgTlVMTCk7CisKKyAgICAgICAgICAgIG91dHJvdyA9IHBuZ192b2lkY2FzdChwbmdfYnl0ZXAsIGRpc3BsYXktPmZpcnN0X3Jvdyk7CisgICAgICAgICAgICBvdXRyb3cgKz0geSAqIHN0ZXBfcm93OworICAgICAgICAgICAgZW5kX3JvdyA9IG91dHJvdyArIHdpZHRoICogY2hhbm5lbHM7CisKKyAgICAgICAgICAgIC8qIE5vdyBkbyB0aGUgY29tcG9zaXRpb24gb24gZWFjaCBwaXhlbCBpbiB0aGlzIHJvdy4gKi8KKyAgICAgICAgICAgIG91dHJvdyArPSBzdGFydHg7CisgICAgICAgICAgICBmb3IgKDsgb3V0cm93IDwgZW5kX3Jvdzsgb3V0cm93ICs9IHN0ZXB4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX2J5dGUgYWxwaGEgPSBpbnJvd1tjaGFubmVsc107CisKKyAgICAgICAgICAgICAgIGlmIChhbHBoYSA+IDApIC8qIGVsc2Ugbm8gY2hhbmdlIHRvIHRoZSBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjOworCisgICAgICAgICAgICAgICAgICBmb3IgKGM9MDsgYzxjaGFubmVsczsgKytjKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgY29tcG9uZW50ID0gaW5yb3dbY107CisKKyAgICAgICAgICAgICAgICAgICAgIGlmIChhbHBoYSA8IDI1NSkgLyogZWxzZSBqdXN0IHVzZSBjb21wb25lbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgUE5HX09QVElNSVpFRF9BTFBIQSwgdGhlIGNvbXBvbmVudCB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICogaXMgYSBsaW5lYXIgOC1iaXQgdmFsdWUuICBDb21iaW5lIHRoaXMgd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGN1cnJlbnQgb3V0cm93W2NdIHZhbHVlIHdoaWNoIGlzIHNSR0IgZW5jb2RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIEFyaXRobWV0aWMgaGVyZSBpcyAxNi1iaXRzIHRvIHByZXNlcnZlIHRoZSBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHZhbHVlcyBjb3JyZWN0bHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCAqPSAyNTcqMjU1OyAvKiA9NjU1MzUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCArPSAoMjU1LWFscGhhKSpwbmdfc1JHQl90YWJsZVtvdXRyb3dbY11dOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBTbyAnY29tcG9uZW50JyBpcyBzY2FsZWQgYnkgMjU1KjY1NTM1IGFuZCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlcmVmb3JlIGFwcHJvcHJpYXRlIGZvciB0aGUgc1JHQiB0byBsaW5lYXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGNvbnZlcnNpb24gdGFibGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IFBOR19zUkdCX0ZST01fTElORUFSKGNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgIG91dHJvd1tjXSA9IChwbmdfYnl0ZSljb21wb25lbnQ7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGlucm93ICs9IGNoYW5uZWxzKzE7IC8qIGNvbXBvbmVudHMgYW5kIGFscGhhIGNoYW5uZWwgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIDE7Cit9CisKKy8qIFRoZSBkb19sb2NhbF9iYWNrZ3JvdW5kIGNhc2U7IGNhbGxlZCB3aGVuIGFsbCB0aGUgZm9sbG93aW5nIHRyYW5zZm9ybXMgYXJlIHRvCisgKiBiZSBkb25lOgorICoKKyAqIFBOR19SR0JfVE9fR1JBWQorICogUE5HX0NPTVBPU0lURQorICogUE5HX0dBTU1BCisgKgorICogVGhpcyBpcyBhIHdvcmstYXJvdW5kIGZvciB0aGUgZmFjdCB0aGF0IGJvdGggdGhlIFBOR19SR0JfVE9fR1JBWSBhbmQKKyAqIFBOR19DT01QT1NJVEUgY29kZSBwZXJmb3JtcyBnYW1tYSBjb3JyZWN0aW9uLCBzbyB3ZSBnZXQgZG91YmxlIGdhbW1hCisgKiBjb3JyZWN0aW9uLiAgVGhlIGZpeC11cCBpcyB0byBwcmV2ZW50IHRoZSBQTkdfQ09NUE9TSVRFIG9wZXJhdGlvbiBmcm9tCisgKiBoYXBwZW5pbmcgaW5zaWRlIGxpYnBuZywgc28gdGhpcyByb3V0aW5lIHNlZXMgYW4gOCBvciAxNi1iaXQgZ3JheSthbHBoYQorICogcm93IGFuZCBoYW5kbGVzIHRoZSByZW1vdmFsIG9yIHByZS1tdWx0aXBsaWNhdGlvbiBvZiB0aGUgYWxwaGEgY2hhbm5lbC4KKyAqLworc3RhdGljIGludAorcG5nX2ltYWdlX3JlYWRfYmFja2dyb3VuZChwbmdfdm9pZHAgYXJndW1lbnQpCit7CisgICBwbmdfaW1hZ2VfcmVhZF9jb250cm9sICpkaXNwbGF5ID0gcG5nX3ZvaWRjYXN0KHBuZ19pbWFnZV9yZWFkX2NvbnRyb2wqLAorICAgICAgYXJndW1lbnQpOworICAgcG5nX2ltYWdlcCBpbWFnZSA9IGRpc3BsYXktPmltYWdlOworICAgcG5nX3N0cnVjdHJwIHBuZ19wdHIgPSBpbWFnZS0+b3BhcXVlLT5wbmdfcHRyOworICAgcG5nX2luZm9ycCBpbmZvX3B0ciA9IGltYWdlLT5vcGFxdWUtPmluZm9fcHRyOworICAgcG5nX3VpbnRfMzIgaGVpZ2h0ID0gaW1hZ2UtPmhlaWdodDsKKyAgIHBuZ191aW50XzMyIHdpZHRoID0gaW1hZ2UtPndpZHRoOworICAgaW50IHBhc3MsIHBhc3NlczsKKworICAgLyogRG91YmxlIGNoZWNrIHRoZSBjb252b2x1dGVkIGxvZ2ljIGJlbG93LiAgV2UgZXhwZWN0IHRvIGdldCBoZXJlIHdpdGgKKyAgICAqIGxpYnBuZyBkb2luZyByZ2IgdG8gZ3JheSBhbmQgZ2FtbWEgY29ycmVjdGlvbiBidXQgYmFja2dyb3VuZCBwcm9jZXNzaW5nCisgICAgKiBsZWZ0IHRvIHRoZSBwbmdfaW1hZ2VfcmVhZF9iYWNrZ3JvdW5kIGZ1bmN0aW9uLiAgVGhlIHJvd3MgbGlicG5nIHByb2R1Y2UKKyAgICAqIG1pZ2h0IGJlIDggb3IgMTYtYml0IGJ1dCBzaG91bGQgYWx3YXlzIGhhdmUgdHdvIGNoYW5uZWxzOyBncmF5IHBsdXMgYWxwaGEuCisgICAgKi8KKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1JHQl9UT19HUkFZKSA9PSAwKQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJsb3N0IHJnYiB0byBncmF5Iik7CisKKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0NPTVBPU0UpICE9IDApCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInVuZXhwZWN0ZWQgY29tcG9zZSIpOworCisgICBpZiAocG5nX2dldF9jaGFubmVscyhwbmdfcHRyLCBpbmZvX3B0cikgIT0gMikKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAibG9zdC9nYWluZWQgY2hhbm5lbHMiKTsKKworICAgLyogRXhwZWN0IHRoZSA4LWJpdCBjYXNlIHRvIGFsd2F5cyByZW1vdmUgdGhlIGFscGhhIGNoYW5uZWwgKi8KKyAgIGlmICgoaW1hZ2UtPmZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19MSU5FQVIpID09IDAgJiYKKyAgICAgIChpbWFnZS0+Zm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FMUEhBKSAhPSAwKQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJ1bmV4cGVjdGVkIDgtYml0IHRyYW5zZm9ybWF0aW9uIik7CisKKyAgIHN3aXRjaCAocG5nX3B0ci0+aW50ZXJsYWNlZCkKKyAgIHsKKyAgICAgIGNhc2UgUE5HX0lOVEVSTEFDRV9OT05FOgorICAgICAgICAgcGFzc2VzID0gMTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBOR19JTlRFUkxBQ0VfQURBTTc6CisgICAgICAgICBwYXNzZXMgPSBQTkdfSU5URVJMQUNFX0FEQU03X1BBU1NFUzsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJ1bmtub3duIGludGVybGFjZSB0eXBlIik7CisgICB9CisKKyAgIC8qIFVzZSBkaXJlY3QgYWNjZXNzIHRvIGluZm9fcHRyIGhlcmUgYmVjYXVzZSBvdGhlcndpc2UgdGhlIHNpbXBsaWZpZWQgQVBJCisgICAgKiB3b3VsZCByZXF1aXJlIFBOR19FQVNZX0FDQ0VTU19TVVBQT1JURUQgKGp1c3QgZm9yIHRoaXMuKSAgTm90ZSB0aGlzIGlzCisgICAgKiBjaGVja2luZyB0aGUgdmFsdWUgYWZ0ZXIgbGlicG5nIGV4cGFuc2lvbnMsIG5vdCB0aGUgb3JpZ2luYWwgdmFsdWUgaW4gdGhlCisgICAgKiBQTkcuCisgICAgKi8KKyAgIHN3aXRjaCAoaW5mb19wdHItPmJpdF9kZXB0aCkKKyAgIHsKKyAgICAgIGNhc2UgODoKKyAgICAgICAgIC8qIDgtYml0IHNSR0IgZ3JheSB2YWx1ZXMgd2l0aCBhbiBhbHBoYSBjaGFubmVsOyB0aGUgYWxwaGEgY2hhbm5lbCBpcworICAgICAgICAgICogdG8gYmUgcmVtb3ZlZCBieSBjb21wb3Npbmcgb24gYSBiYWNrZ3JvdW5kOiBlaXRoZXIgdGhlIHJvdyBpZgorICAgICAgICAgICogZGlzcGxheS0+YmFja2dyb3VuZCBpcyBOVUxMIG9yIGRpc3BsYXktPmJhY2tncm91bmQtPmdyZWVuIGlmIG5vdC4KKyAgICAgICAgICAqIFVubGlrZSB0aGUgY29kZSBhYm92ZSBBTFBIQV9PUFRJTUlaRUQgaGFzICpub3QqIGJlZW4gZG9uZS4KKyAgICAgICAgICAqLworICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIGZpcnN0X3JvdyA9IHBuZ192b2lkY2FzdChwbmdfYnl0ZXAsIGRpc3BsYXktPmZpcnN0X3Jvdyk7CisgICAgICAgICAgICBwdHJkaWZmX3Qgc3RlcF9yb3cgPSBkaXNwbGF5LT5yb3dfYnl0ZXM7CisKKyAgICAgICAgICAgIGZvciAocGFzcyA9IDA7IHBhc3MgPCBwYXNzZXM7ICsrcGFzcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19ieXRlcCAgICAgICAgcm93ID0gcG5nX3ZvaWRjYXN0KHBuZ19ieXRlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXktPmZpcnN0X3Jvdyk7CisgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgIHN0YXJ0eCwgc3RlcHgsIHN0ZXB5OworICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgICAgICB5OworCisgICAgICAgICAgICAgICBpZiAocG5nX3B0ci0+aW50ZXJsYWNlZCA9PSBQTkdfSU5URVJMQUNFX0FEQU03KQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyogVGhlIHJvdyBtYXkgYmUgZW1wdHkgZm9yIGEgc2hvcnQgaW1hZ2U6ICovCisgICAgICAgICAgICAgICAgICBpZiAoUE5HX1BBU1NfQ09MUyh3aWR0aCwgcGFzcykgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICBzdGFydHggPSBQTkdfUEFTU19TVEFSVF9DT0wocGFzcyk7CisgICAgICAgICAgICAgICAgICBzdGVweCA9IFBOR19QQVNTX0NPTF9PRkZTRVQocGFzcyk7CisgICAgICAgICAgICAgICAgICB5ID0gUE5HX1BBU1NfU1RBUlRfUk9XKHBhc3MpOworICAgICAgICAgICAgICAgICAgc3RlcHkgPSBQTkdfUEFTU19ST1dfT0ZGU0VUKHBhc3MpOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICB5ID0gMDsKKyAgICAgICAgICAgICAgICAgIHN0YXJ0eCA9IDA7CisgICAgICAgICAgICAgICAgICBzdGVweCA9IHN0ZXB5ID0gMTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgaWYgKGRpc3BsYXktPmJhY2tncm91bmQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGZvciAoOyB5PGhlaWdodDsgeSArPSBzdGVweSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlcCBpbnJvdyA9IHBuZ192b2lkY2FzdChwbmdfYnl0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LT5sb2NhbF9yb3cpOworICAgICAgICAgICAgICAgICAgICAgcG5nX2J5dGVwIG91dHJvdyA9IGZpcnN0X3JvdyArIHkgKiBzdGVwX3JvdzsKKyAgICAgICAgICAgICAgICAgICAgIHBuZ19jb25zdF9ieXRlcCBlbmRfcm93ID0gb3V0cm93ICsgd2lkdGg7CisKKyAgICAgICAgICAgICAgICAgICAgIC8qIFJlYWQgdGhlIHJvdywgd2hpY2ggaXMgcGFja2VkOiAqLworICAgICAgICAgICAgICAgICAgICAgcG5nX3JlYWRfcm93KHBuZ19wdHIsIGlucm93LCBOVUxMKTsKKworICAgICAgICAgICAgICAgICAgICAgLyogTm93IGRvIHRoZSBjb21wb3NpdGlvbiBvbiBlYWNoIHBpeGVsIGluIHRoaXMgcm93LiAqLworICAgICAgICAgICAgICAgICAgICAgb3V0cm93ICs9IHN0YXJ0eDsKKyAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBvdXRyb3cgPCBlbmRfcm93OyBvdXRyb3cgKz0gc3RlcHgpCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfYnl0ZSBhbHBoYSA9IGlucm93WzFdOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxwaGEgPiAwKSAvKiBlbHNlIG5vIGNoYW5nZSB0byB0aGUgb3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8zMiBjb21wb25lbnQgPSBpbnJvd1swXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFscGhhIDwgMjU1KSAvKiBlbHNlIGp1c3QgdXNlIGNvbXBvbmVudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2luY2UgUE5HX09QVElNSVpFRF9BTFBIQSB3YXMgbm90IHNldCBpdCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbmVjZXNzYXJ5IHRvIGludmVydCB0aGUgc1JHQiB0cmFuc2ZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZnVuY3Rpb24gYW5kIG11bHRpcGx5IHRoZSBhbHBoYSBvdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IHBuZ19zUkdCX3RhYmxlW2NvbXBvbmVudF0gKiBhbHBoYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCArPSBwbmdfc1JHQl90YWJsZVtvdXRyb3dbMF1dICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyNTUtYWxwaGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50ID0gUE5HX3NSR0JfRlJPTV9MSU5FQVIoY29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cm93WzBdID0gKHBuZ19ieXRlKWNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaW5yb3cgKz0gMjsgLyogZ3JheSBhbmQgYWxwaGEgY2hhbm5lbCAqLworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBlbHNlIC8qIGNvbnN0YW50IGJhY2tncm91bmQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIGJhY2tncm91bmQ4ID0gZGlzcGxheS0+YmFja2dyb3VuZC0+Z3JlZW47CisgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBiYWNrZ3JvdW5kID0gcG5nX3NSR0JfdGFibGVbYmFja2dyb3VuZDhdOworCisgICAgICAgICAgICAgICAgICBmb3IgKDsgeTxoZWlnaHQ7IHkgKz0gc3RlcHkpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBwbmdfYnl0ZXAgaW5yb3cgPSBwbmdfdm9pZGNhc3QocG5nX2J5dGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheS0+bG9jYWxfcm93KTsKKyAgICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlcCBvdXRyb3cgPSBmaXJzdF9yb3cgKyB5ICogc3RlcF9yb3c7CisgICAgICAgICAgICAgICAgICAgICBwbmdfY29uc3RfYnl0ZXAgZW5kX3JvdyA9IG91dHJvdyArIHdpZHRoOworCisgICAgICAgICAgICAgICAgICAgICAvKiBSZWFkIHRoZSByb3csIHdoaWNoIGlzIHBhY2tlZDogKi8KKyAgICAgICAgICAgICAgICAgICAgIHBuZ19yZWFkX3JvdyhwbmdfcHRyLCBpbnJvdywgTlVMTCk7CisKKyAgICAgICAgICAgICAgICAgICAgIC8qIE5vdyBkbyB0aGUgY29tcG9zaXRpb24gb24gZWFjaCBwaXhlbCBpbiB0aGlzIHJvdy4gKi8KKyAgICAgICAgICAgICAgICAgICAgIG91dHJvdyArPSBzdGFydHg7CisgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgb3V0cm93IDwgZW5kX3Jvdzsgb3V0cm93ICs9IHN0ZXB4KQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2J5dGUgYWxwaGEgPSBpbnJvd1sxXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFscGhhID4gMCkgLyogZWxzZSB1c2UgYmFja2dyb3VuZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgY29tcG9uZW50ID0gaW5yb3dbMF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbHBoYSA8IDI1NSkgLyogZWxzZSBqdXN0IHVzZSBjb21wb25lbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IHBuZ19zUkdCX3RhYmxlW2NvbXBvbmVudF0gKiBhbHBoYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCArPSBiYWNrZ3JvdW5kICogKDI1NS1hbHBoYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBQTkdfc1JHQl9GUk9NX0xJTkVBUihjb21wb25lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRyb3dbMF0gPSAocG5nX2J5dGUpY29tcG9uZW50OworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRyb3dbMF0gPSBiYWNrZ3JvdW5kODsKKworICAgICAgICAgICAgICAgICAgICAgICAgaW5yb3cgKz0gMjsgLyogZ3JheSBhbmQgYWxwaGEgY2hhbm5lbCAqLworICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICByb3cgKz0gZGlzcGxheS0+cm93X2J5dGVzOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMTY6CisgICAgICAgICAvKiAxNi1iaXQgbGluZWFyIHdpdGggcHJlLW11bHRpcGxpZWQgYWxwaGE7IHRoZSBwcmUtbXVsdGlwbGljYXRpb24gbXVzdAorICAgICAgICAgICogc3RpbGwgYmUgZG9uZSBhbmQsIG1heWJlLCB0aGUgYWxwaGEgY2hhbm5lbCByZW1vdmVkLiAgVGhpcyBjb2RlIGFsc28KKyAgICAgICAgICAqIGhhbmRsZXMgdGhlIGFscGhhLWZpcnN0IG9wdGlvbi4KKyAgICAgICAgICAqLworICAgICAgICAgeworICAgICAgICAgICAgcG5nX3VpbnRfMTZwIGZpcnN0X3JvdyA9IHBuZ192b2lkY2FzdChwbmdfdWludF8xNnAsCisgICAgICAgICAgICAgICBkaXNwbGF5LT5maXJzdF9yb3cpOworICAgICAgICAgICAgLyogVGhlIGRpdmlzaW9uIGJ5IHR3byBpcyBzYWZlIGJlY2F1c2UgdGhlIGNhbGxlciBwYXNzZWQgaW4gYQorICAgICAgICAgICAgICogc3RyaWRlIHdoaWNoIHdhcyBtdWx0aXBsaWVkIGJ5IDIgKGJlbG93KSB0byBnZXQgcm93X2J5dGVzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdHJkaWZmX3QgICAgc3RlcF9yb3cgPSBkaXNwbGF5LT5yb3dfYnl0ZXMgLyAyOworICAgICAgICAgICAgaW50IHByZXNlcnZlX2FscGhhID0gKGltYWdlLT5mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQUxQSEEpICE9IDA7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgb3V0Y2hhbm5lbHMgPSAxK3ByZXNlcnZlX2FscGhhOworICAgICAgICAgICAgaW50IHN3YXBfYWxwaGEgPSAwOworCisjICAgICAgICAgICBpZmRlZiBQTkdfU0lNUExJRklFRF9SRUFEX0FGSVJTVF9TVVBQT1JURUQKKyAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZV9hbHBoYSAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgKGltYWdlLT5mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQUZJUlNUKSAhPSAwKQorICAgICAgICAgICAgICAgICAgc3dhcF9hbHBoYSA9IDE7CisjICAgICAgICAgICBlbmRpZgorCisgICAgICAgICAgICBmb3IgKHBhc3MgPSAwOyBwYXNzIDwgcGFzc2VzOyArK3Bhc3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgIHN0YXJ0eCwgc3RlcHgsIHN0ZXB5OworICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgICAgICB5OworCisgICAgICAgICAgICAgICAvKiBUaGUgJ3gnIHN0YXJ0IGFuZCBzdGVwIGFyZSBhZGp1c3RlZCB0byBvdXRwdXQgY29tcG9uZW50cyBoZXJlLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICBpZiAocG5nX3B0ci0+aW50ZXJsYWNlZCA9PSBQTkdfSU5URVJMQUNFX0FEQU03KQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyogVGhlIHJvdyBtYXkgYmUgZW1wdHkgZm9yIGEgc2hvcnQgaW1hZ2U6ICovCisgICAgICAgICAgICAgICAgICBpZiAoUE5HX1BBU1NfQ09MUyh3aWR0aCwgcGFzcykgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICBzdGFydHggPSBQTkdfUEFTU19TVEFSVF9DT0wocGFzcykgKiBvdXRjaGFubmVsczsKKyAgICAgICAgICAgICAgICAgIHN0ZXB4ID0gUE5HX1BBU1NfQ09MX09GRlNFVChwYXNzKSAqIG91dGNoYW5uZWxzOworICAgICAgICAgICAgICAgICAgeSA9IFBOR19QQVNTX1NUQVJUX1JPVyhwYXNzKTsKKyAgICAgICAgICAgICAgICAgIHN0ZXB5ID0gUE5HX1BBU1NfUk9XX09GRlNFVChwYXNzKTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgeSA9IDA7CisgICAgICAgICAgICAgICAgICBzdGFydHggPSAwOworICAgICAgICAgICAgICAgICAgc3RlcHggPSBvdXRjaGFubmVsczsKKyAgICAgICAgICAgICAgICAgIHN0ZXB5ID0gMTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgZm9yICg7IHk8aGVpZ2h0OyB5ICs9IHN0ZXB5KQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcG5nX2NvbnN0X3VpbnRfMTZwIGlucm93OworICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTZwIG91dHJvdyA9IGZpcnN0X3JvdyArIHkqc3RlcF9yb3c7CisgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNnAgZW5kX3JvdyA9IG91dHJvdyArIHdpZHRoICogb3V0Y2hhbm5lbHM7CisKKyAgICAgICAgICAgICAgICAgIC8qIFJlYWQgdGhlIHJvdywgd2hpY2ggaXMgcGFja2VkOiAqLworICAgICAgICAgICAgICAgICAgcG5nX3JlYWRfcm93KHBuZ19wdHIsIHBuZ192b2lkY2FzdChwbmdfYnl0ZXAsCisgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LT5sb2NhbF9yb3cpLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgIGlucm93ID0gcG5nX3ZvaWRjYXN0KHBuZ19jb25zdF91aW50XzE2cCwgZGlzcGxheS0+bG9jYWxfcm93KTsKKworICAgICAgICAgICAgICAgICAgLyogTm93IGRvIHRoZSBwcmUtbXVsdGlwbGljYXRpb24gb24gZWFjaCBwaXhlbCBpbiB0aGlzIHJvdy4KKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgb3V0cm93ICs9IHN0YXJ0eDsKKyAgICAgICAgICAgICAgICAgIGZvciAoOyBvdXRyb3cgPCBlbmRfcm93OyBvdXRyb3cgKz0gc3RlcHgpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8zMiBjb21wb25lbnQgPSBpbnJvd1swXTsKKyAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGFscGhhID0gaW5yb3dbMV07CisKKyAgICAgICAgICAgICAgICAgICAgIGlmIChhbHBoYSA+IDApIC8qIGVsc2UgMCAqLworICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFscGhhIDwgNjU1MzUpIC8qIGVsc2UganVzdCB1c2UgY29tcG9uZW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgKj0gYWxwaGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgKz0gMzI3Njc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgLz0gNjU1MzU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgIG91dHJvd1tzd2FwX2FscGhhXSA9IChwbmdfdWludF8xNiljb21wb25lbnQ7CisgICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVfYWxwaGEgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHJvd1sxIF4gc3dhcF9hbHBoYV0gPSBhbHBoYTsKKworICAgICAgICAgICAgICAgICAgICAgaW5yb3cgKz0gMjsgLyogY29tcG9uZW50cyBhbmQgYWxwaGEgY2hhbm5lbCAqLworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBfX0dOVUNfXworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAidW5leHBlY3RlZCBiaXQgZGVwdGgiKTsKKyNlbmRpZgorICAgfQorCisgICByZXR1cm4gMTsKK30KKworLyogVGhlIGd1dHMgb2YgcG5nX2ltYWdlX2ZpbmlzaF9yZWFkIGFzIGEgcG5nX3NhZmVfZXhlY3V0ZSBjYWxsYmFjay4gKi8KK3N0YXRpYyBpbnQKK3BuZ19pbWFnZV9yZWFkX2RpcmVjdChwbmdfdm9pZHAgYXJndW1lbnQpCit7CisgICBwbmdfaW1hZ2VfcmVhZF9jb250cm9sICpkaXNwbGF5ID0gcG5nX3ZvaWRjYXN0KHBuZ19pbWFnZV9yZWFkX2NvbnRyb2wqLAorICAgICAgYXJndW1lbnQpOworICAgcG5nX2ltYWdlcCBpbWFnZSA9IGRpc3BsYXktPmltYWdlOworICAgcG5nX3N0cnVjdHJwIHBuZ19wdHIgPSBpbWFnZS0+b3BhcXVlLT5wbmdfcHRyOworICAgcG5nX2luZm9ycCBpbmZvX3B0ciA9IGltYWdlLT5vcGFxdWUtPmluZm9fcHRyOworCisgICBwbmdfdWludF8zMiBmb3JtYXQgPSBpbWFnZS0+Zm9ybWF0OworICAgaW50IGxpbmVhciA9IChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfTElORUFSKSAhPSAwOworICAgaW50IGRvX2xvY2FsX2NvbXBvc2UgPSAwOworICAgaW50IGRvX2xvY2FsX2JhY2tncm91bmQgPSAwOyAvKiB0byBhdm9pZCBkb3VibGUgZ2FtbWEgY29ycmVjdGlvbiBidWcgKi8KKyAgIGludCBwYXNzZXMgPSAwOworCisgICAvKiBBZGQgdHJhbnNmb3JtcyB0byBlbnN1cmUgdGhlIGNvcnJlY3Qgb3V0cHV0IGZvcm1hdCBpcyBwcm9kdWNlZCB0aGVuIGNoZWNrCisgICAgKiB0aGF0IHRoZSByZXF1aXJlZCBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGlzIHRoZXJlLiAgQWx3YXlzIGV4cGFuZDsgYWx3YXlzCisgICAgKiBuZWVkIDggYml0cyBtaW5pbXVtLCBubyBwYWxldHRlIGFuZCBleHBhbmRlZCB0Uk5TLgorICAgICovCisgICBwbmdfc2V0X2V4cGFuZChwbmdfcHRyKTsKKworICAgLyogTm93IGNoZWNrIHRoZSBmb3JtYXQgdG8gc2VlIGlmIGl0IHdhcyBtb2RpZmllZC4gKi8KKyAgIHsKKyAgICAgIHBuZ191aW50XzMyIGJhc2VfZm9ybWF0ID0gcG5nX2ltYWdlX2Zvcm1hdChwbmdfcHRyKSAmCisgICAgICAgICB+UE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQIC8qIHJlbW92ZWQgYnkgcG5nX3NldF9leHBhbmQgKi87CisgICAgICBwbmdfdWludF8zMiBjaGFuZ2UgPSBmb3JtYXQgXiBiYXNlX2Zvcm1hdDsKKyAgICAgIHBuZ19maXhlZF9wb2ludCBvdXRwdXRfZ2FtbWE7CisgICAgICBpbnQgbW9kZTsgLyogYWxwaGEgbW9kZSAqLworCisgICAgICAvKiBEbyB0aGlzIGZpcnN0IHNvIHRoYXQgd2UgaGF2ZSBhIHJlY29yZCBpZiByZ2IgdG8gZ3JheSBpcyBoYXBwZW5pbmcuICovCisgICAgICBpZiAoKGNoYW5nZSAmIFBOR19GT1JNQVRfRkxBR19DT0xPUikgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgIC8qIGdyYXk8LT5jb2xvciB0cmFuc2Zvcm1hdGlvbiByZXF1aXJlZC4gKi8KKyAgICAgICAgIGlmICgoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9SKSAhPSAwKQorICAgICAgICAgICAgcG5nX3NldF9ncmF5X3RvX3JnYihwbmdfcHRyKTsKKworICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgLyogbGlicG5nIGNhbid0IGRvIGJvdGggcmdiIHRvIGdyYXkgYW5kCisgICAgICAgICAgICAgKiBiYWNrZ3JvdW5kL3ByZS1tdWx0aXBsaWNhdGlvbiBpZiB0aGVyZSBpcyBhbHNvIHNpZ25pZmljYW50IGdhbW1hCisgICAgICAgICAgICAgKiBjb3JyZWN0aW9uLCBiZWNhdXNlIGJvdGggb3BlcmF0aW9ucyByZXF1aXJlIGxpbmVhciBjb2xvcnMgYW5kCisgICAgICAgICAgICAgKiB0aGUgY29kZSBvbmx5IHN1cHBvcnRzIG9uZSB0cmFuc2Zvcm0gZG9pbmcgdGhlIGdhbW1hIGNvcnJlY3Rpb24uCisgICAgICAgICAgICAgKiBIYW5kbGUgdGhpcyBieSBkb2luZyB0aGUgcHJlLW11bHRpcGxpY2F0aW9uIG9yIGJhY2tncm91bmQKKyAgICAgICAgICAgICAqIG9wZXJhdGlvbiBpbiB0aGlzIGNvZGUsIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBUT0RPOiBmaXggdGhpcyBieSByZXdyaXRpbmcgcG5ncnRyYW4uYyAoISkKKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBGb3IgdGhlIG1vbWVudCAoZ2l2ZW4gdGhhdCBmaXhpbmcgdGhpcyBpbiBwbmdydHJhbi5jIGlzIGFuCisgICAgICAgICAgICAgKiBlbm9ybW91cyBjaGFuZ2UpICdkb19sb2NhbF9iYWNrZ3JvdW5kJyBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQKKyAgICAgICAgICAgICAqIHRoZSBwcm9ibGVtIGV4aXN0cy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKChiYXNlX2Zvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BTFBIQSkgIT0gMCkKKyAgICAgICAgICAgICAgIGRvX2xvY2FsX2JhY2tncm91bmQgPSAxLyptYXliZSovOworCisgICAgICAgICAgICBwbmdfc2V0X3JnYl90b19ncmF5X2ZpeGVkKHBuZ19wdHIsIFBOR19FUlJPUl9BQ1RJT05fTk9ORSwKKyAgICAgICAgICAgICAgIFBOR19SR0JfVE9fR1JBWV9ERUZBVUxULCBQTkdfUkdCX1RPX0dSQVlfREVGQVVMVCk7CisgICAgICAgICB9CisKKyAgICAgICAgIGNoYW5nZSAmPSB+UE5HX0ZPUk1BVF9GTEFHX0NPTE9SOworICAgICAgfQorCisgICAgICAvKiBTZXQgdGhlIGdhbW1hIGFwcHJvcHJpYXRlbHksIGxpbmVhciBmb3IgMTYtYml0IGlucHV0LCBzUkdCIG90aGVyd2lzZS4KKyAgICAgICAqLworICAgICAgeworICAgICAgICAgcG5nX2ZpeGVkX3BvaW50IGlucHV0X2dhbW1hX2RlZmF1bHQ7CisKKyAgICAgICAgIGlmICgoYmFzZV9mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfTElORUFSKSAhPSAwICYmCisgICAgICAgICAgICAgKGltYWdlLT5mbGFncyAmIFBOR19JTUFHRV9GTEFHXzE2QklUX3NSR0IpID09IDApCisgICAgICAgICAgICBpbnB1dF9nYW1tYV9kZWZhdWx0ID0gUE5HX0dBTU1BX0xJTkVBUjsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlucHV0X2dhbW1hX2RlZmF1bHQgPSBQTkdfREVGQVVMVF9zUkdCOworCisgICAgICAgICAvKiBDYWxsIHBuZ19zZXRfYWxwaGFfbW9kZSB0byBzZXQgdGhlIGRlZmF1bHQgZm9yIHRoZSBpbnB1dCBnYW1tYTsgdGhlCisgICAgICAgICAgKiBvdXRwdXQgZ2FtbWEgaXMgc2V0IGJ5IGEgc2Vjb25kIGNhbGwgYmVsb3cuCisgICAgICAgICAgKi8KKyAgICAgICAgIHBuZ19zZXRfYWxwaGFfbW9kZV9maXhlZChwbmdfcHRyLCBQTkdfQUxQSEFfUE5HLCBpbnB1dF9nYW1tYV9kZWZhdWx0KTsKKyAgICAgIH0KKworICAgICAgaWYgKGxpbmVhciAhPSAwKQorICAgICAgeworICAgICAgICAgLyogSWYgdGhlcmUgKmlzKiBhbiBhbHBoYSBjaGFubmVsIGluIHRoZSBpbnB1dCBpdCBtdXN0IGJlIG11bHRpcGxpZWQKKyAgICAgICAgICAqIG91dDsgdXNlIFBOR19BTFBIQV9TVEFOREFSRCwgb3RoZXJ3aXNlIGp1c3QgdXNlIFBOR19BTFBIQV9QTkcuCisgICAgICAgICAgKi8KKyAgICAgICAgIGlmICgoYmFzZV9mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQUxQSEEpICE9IDApCisgICAgICAgICAgICBtb2RlID0gUE5HX0FMUEhBX1NUQU5EQVJEOyAvKiBhc3NvY2lhdGVkIGFscGhhICovCisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1vZGUgPSBQTkdfQUxQSEFfUE5HOworCisgICAgICAgICBvdXRwdXRfZ2FtbWEgPSBQTkdfR0FNTUFfTElORUFSOworICAgICAgfQorCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBtb2RlID0gUE5HX0FMUEhBX1BORzsKKyAgICAgICAgIG91dHB1dF9nYW1tYSA9IFBOR19ERUZBVUxUX3NSR0I7CisgICAgICB9CisKKyAgICAgIC8qIElmICdkb19sb2NhbF9iYWNrZ3JvdW5kJyBpcyBzZXQgY2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiBnYW1tYQorICAgICAgICogY29ycmVjdGlvbjsgdGhpcyBpcyBwYXJ0IG9mIHRoZSB3b3JrLXJvdW5kIGZvciB0aGUgbGlicG5nIGJ1ZworICAgICAgICogZGVzY3JpYmVkIGFib3ZlLgorICAgICAgICoKKyAgICAgICAqIFRPRE86IGZpeCBsaWJwbmcgYW5kIHJlbW92ZSB0aGlzLgorICAgICAgICovCisgICAgICBpZiAoZG9fbG9jYWxfYmFja2dyb3VuZCAhPSAwKQorICAgICAgeworICAgICAgICAgcG5nX2ZpeGVkX3BvaW50IGd0ZXN0OworCisgICAgICAgICAvKiBUaGlzIGlzICdwbmdfZ2FtbWFfdGhyZXNob2xkJyBmcm9tIHBuZ3J0cmFuLmM7IHRoZSB0ZXN0IHVzZWQgZm9yCisgICAgICAgICAgKiBnYW1tYSBjb3JyZWN0aW9uLCB0aGUgc2NyZWVuIGdhbW1hIGhhc24ndCBiZWVuIHNldCBvbiBwbmdfc3RydWN0CisgICAgICAgICAgKiB5ZXQ7IGl0J3Mgc2V0IGJlbG93LiAgcG5nX3N0cnVjdDo6Z2FtbWEsIGhvd2V2ZXIsIGlzIHNldCB0byB0aGUKKyAgICAgICAgICAqIGZpbmFsIHZhbHVlLgorICAgICAgICAgICovCisgICAgICAgICBpZiAocG5nX211bGRpdigmZ3Rlc3QsIG91dHB1dF9nYW1tYSwgcG5nX3B0ci0+Y29sb3JzcGFjZS5nYW1tYSwKKyAgICAgICAgICAgICAgIFBOR19GUF8xKSAhPSAwICYmIHBuZ19nYW1tYV9zaWduaWZpY2FudChndGVzdCkgPT0gMCkKKyAgICAgICAgICAgIGRvX2xvY2FsX2JhY2tncm91bmQgPSAwOworCisgICAgICAgICBlbHNlIGlmIChtb2RlID09IFBOR19BTFBIQV9TVEFOREFSRCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGRvX2xvY2FsX2JhY2tncm91bmQgPSAyLypyZXF1aXJlZCovOworICAgICAgICAgICAgbW9kZSA9IFBOR19BTFBIQV9QTkc7IC8qIHByZXZlbnQgbGlicG5nIGRvaW5nIGl0ICovCisgICAgICAgICB9CisKKyAgICAgICAgIC8qIGVsc2UgbGVhdmUgYXMgMSBmb3IgdGhlIGNoZWNrcyBiZWxvdyAqLworICAgICAgfQorCisgICAgICAvKiBJZiB0aGUgYml0LWRlcHRoIGNoYW5nZXMgdGhlbiBoYW5kbGUgdGhhdCBoZXJlLiAqLworICAgICAgaWYgKChjaGFuZ2UgJiBQTkdfRk9STUFUX0ZMQUdfTElORUFSKSAhPSAwKQorICAgICAgeworICAgICAgICAgaWYgKGxpbmVhciAhPSAwIC8qMTYtYml0IG91dHB1dCovKQorICAgICAgICAgICAgcG5nX3NldF9leHBhbmRfMTYocG5nX3B0cik7CisKKyAgICAgICAgIGVsc2UgLyogOC1iaXQgb3V0cHV0ICovCisgICAgICAgICAgICBwbmdfc2V0X3NjYWxlXzE2KHBuZ19wdHIpOworCisgICAgICAgICBjaGFuZ2UgJj0gflBOR19GT1JNQVRfRkxBR19MSU5FQVI7CisgICAgICB9CisKKyAgICAgIC8qIE5vdyB0aGUgYmFja2dyb3VuZC9hbHBoYSBjaGFubmVsIGNoYW5nZXMuICovCisgICAgICBpZiAoKGNoYW5nZSAmIFBOR19GT1JNQVRfRkxBR19BTFBIQSkgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgIC8qIFJlbW92aW5nIGFuIGFscGhhIGNoYW5uZWwgcmVxdWlyZXMgY29tcG9zaXRpb24gZm9yIHRoZSA4LWJpdAorICAgICAgICAgICogZm9ybWF0czsgZm9yIHRoZSAxNi1iaXQgaXQgaXMgYWxyZWFkeSBkb25lLCBhYm92ZSwgYnkgdGhlCisgICAgICAgICAgKiBwcmUtbXVsdGlwbGljYXRpb24gYW5kIHRoZSBjaGFubmVsIGp1c3QgbmVlZHMgdG8gYmUgc3RyaXBwZWQuCisgICAgICAgICAgKi8KKyAgICAgICAgIGlmICgoYmFzZV9mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQUxQSEEpICE9IDApCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBJZiBSR0ItPmdyYXkgaXMgaGFwcGVuaW5nIHRoZSBhbHBoYSBjaGFubmVsIG11c3QgYmUgbGVmdCBhbmQgdGhlCisgICAgICAgICAgICAgKiBvcGVyYXRpb24gY29tcGxldGVkIGxvY2FsbHkuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVE9ETzogZml4IGxpYnBuZyBhbmQgcmVtb3ZlIHRoaXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChkb19sb2NhbF9iYWNrZ3JvdW5kICE9IDApCisgICAgICAgICAgICAgICBkb19sb2NhbF9iYWNrZ3JvdW5kID0gMi8qcmVxdWlyZWQqLzsKKworICAgICAgICAgICAgLyogMTYtYml0IG91dHB1dDoganVzdCByZW1vdmUgdGhlIGNoYW5uZWwgKi8KKyAgICAgICAgICAgIGVsc2UgaWYgKGxpbmVhciAhPSAwKSAvKiBjb21wb3NlIG9uIGJsYWNrICh3ZWxsLCBwcmUtbXVsdGlwbHkpICovCisgICAgICAgICAgICAgICBwbmdfc2V0X3N0cmlwX2FscGhhKHBuZ19wdHIpOworCisgICAgICAgICAgICAvKiA4LWJpdCBvdXRwdXQ6IGRvIGFuIGFwcHJvcHJpYXRlIGNvbXBvc2UgKi8KKyAgICAgICAgICAgIGVsc2UgaWYgKGRpc3BsYXktPmJhY2tncm91bmQgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19jb2xvcl8xNiBjOworCisgICAgICAgICAgICAgICBjLmluZGV4ID0gMDsgLyp1bnVzZWQqLworICAgICAgICAgICAgICAgYy5yZWQgPSBkaXNwbGF5LT5iYWNrZ3JvdW5kLT5yZWQ7CisgICAgICAgICAgICAgICBjLmdyZWVuID0gZGlzcGxheS0+YmFja2dyb3VuZC0+Z3JlZW47CisgICAgICAgICAgICAgICBjLmJsdWUgPSBkaXNwbGF5LT5iYWNrZ3JvdW5kLT5ibHVlOworICAgICAgICAgICAgICAgYy5ncmF5ID0gZGlzcGxheS0+YmFja2dyb3VuZC0+Z3JlZW47CisKKyAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgYWx3YXlzIGFuIDgtYml0IHNSR0IgdmFsdWUsIHVzaW5nIHRoZSAnZ3JlZW4nIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAqIGZvciBncmF5IGlzIG11Y2ggYmV0dGVyIHRoYW4gY2FsY3VsYXRpbmcgdGhlIGx1bWluYW5jZSBoZXJlOworICAgICAgICAgICAgICAgICogd2UgY2FuIGdldCBvZmYtYnktb25lIGVycm9ycyBpbiB0aGF0IGNhbGN1bGF0aW9uIHJlbGF0aXZlIHRvCisgICAgICAgICAgICAgICAgKiB0aGUgYXBwIGV4cGVjdGF0aW9ucyBhbmQgdGhhdCB3aWxsIHNob3cgdXAgaW4gdHJhbnNwYXJlbnQKKyAgICAgICAgICAgICAgICAqIHBpeGVscy4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgcG5nX3NldF9iYWNrZ3JvdW5kX2ZpeGVkKHBuZ19wdHIsICZjLAorICAgICAgICAgICAgICAgICAgUE5HX0JBQ0tHUk9VTkRfR0FNTUFfU0NSRUVOLCAwLypuZWVkX2V4cGFuZCovLAorICAgICAgICAgICAgICAgICAgMC8qZ2FtbWE6IG5vdCB1c2VkKi8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbHNlIC8qIGNvbXBvc2Ugb24gcm93OiBpbXBsZW1lbnRlZCBiZWxvdy4gKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGRvX2xvY2FsX2NvbXBvc2UgPSAxOworICAgICAgICAgICAgICAgLyogVGhpcyBsZWF2ZXMgdGhlIGFscGhhIGNoYW5uZWwgaW4gdGhlIG91dHB1dCwgc28gaXQgaGFzIHRvIGJlCisgICAgICAgICAgICAgICAgKiByZW1vdmVkIGJ5IHRoZSBjb2RlIGJlbG93LiAgU2V0IHRoZSBlbmNvZGluZyB0byB0aGUgJ09QVElNSVpFJworICAgICAgICAgICAgICAgICogb25lIHNvIHRoZSBjb2RlIG9ubHkgaGFzIHRvIGhhY2sgb24gdGhlIHBpeGVscyB0aGF0IHJlcXVpcmUKKyAgICAgICAgICAgICAgICAqIGNvbXBvc2l0aW9uLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICBtb2RlID0gUE5HX0FMUEhBX09QVElNSVpFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICAgZWxzZSAvKiBvdXRwdXQgbmVlZHMgYW4gYWxwaGEgY2hhbm5lbCAqLworICAgICAgICAgeworICAgICAgICAgICAgLyogVGhpcyBpcyB0cmlja3kgYmVjYXVzZSBpdCBoYXBwZW5zIGJlZm9yZSB0aGUgc3dhcCBvcGVyYXRpb24gaGFzCisgICAgICAgICAgICAgKiBiZWVuIGFjY29tcGxpc2hlZDsgaG93ZXZlciwgdGhlIHN3YXAgZG9lcyAqbm90KiBzd2FwIHRoZSBhZGRlZAorICAgICAgICAgICAgICogYWxwaGEgY2hhbm5lbCAod2VpcmQgQVBJKSwgc28gaXQgbXVzdCBiZSBhZGRlZCBpbiB0aGUgY29ycmVjdAorICAgICAgICAgICAgICogcGxhY2UuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHBuZ191aW50XzMyIGZpbGxlcjsgLyogb3BhcXVlIGZpbGxlciAqLworICAgICAgICAgICAgaW50IHdoZXJlOworCisgICAgICAgICAgICBpZiAobGluZWFyICE9IDApCisgICAgICAgICAgICAgICBmaWxsZXIgPSA2NTUzNTsKKworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgZmlsbGVyID0gMjU1OworCisjICAgICAgICAgICBpZmRlZiBQTkdfRk9STUFUX0FGSVJTVF9TVVBQT1JURUQKKyAgICAgICAgICAgICAgIGlmICgoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FGSVJTVCkgIT0gMCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHdoZXJlID0gUE5HX0ZJTExFUl9CRUZPUkU7CisgICAgICAgICAgICAgICAgICBjaGFuZ2UgJj0gflBOR19GT1JNQVRfRkxBR19BRklSU1Q7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGVsc2UKKyMgICAgICAgICAgIGVuZGlmCisgICAgICAgICAgICAgICB3aGVyZSA9IFBOR19GSUxMRVJfQUZURVI7CisKKyAgICAgICAgICAgIHBuZ19zZXRfYWRkX2FscGhhKHBuZ19wdHIsIGZpbGxlciwgd2hlcmUpOworICAgICAgICAgfQorCisgICAgICAgICAvKiBUaGlzIHN0b3BzIHRoZSAoaXJyZWxldmFudCkgY2FsbCB0byBzd2FwX2FscGhhIGJlbG93LiAqLworICAgICAgICAgY2hhbmdlICY9IH5QTkdfRk9STUFUX0ZMQUdfQUxQSEE7CisgICAgICB9CisKKyAgICAgIC8qIE5vdyBzZXQgdGhlIGFscGhhIG1vZGUgY29ycmVjdGx5OyB0aGlzIGlzIGFsd2F5cyBkb25lLCBldmVuIGlmIHRoZXJlIGlzCisgICAgICAgKiBubyBhbHBoYSBjaGFubmVsIGluIGVpdGhlciB0aGUgaW5wdXQgb3IgdGhlIG91dHB1dCBiZWNhdXNlIGl0IGNvcnJlY3RseQorICAgICAgICogc2V0cyB0aGUgb3V0cHV0IGdhbW1hLgorICAgICAgICovCisgICAgICBwbmdfc2V0X2FscGhhX21vZGVfZml4ZWQocG5nX3B0ciwgbW9kZSwgb3V0cHV0X2dhbW1hKTsKKworIyAgICAgaWZkZWYgUE5HX0ZPUk1BVF9CR1JfU1VQUE9SVEVECisgICAgICAgICBpZiAoKGNoYW5nZSAmIFBOR19GT1JNQVRfRkxBR19CR1IpICE9IDApCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBDaGVjayBvbmx5IHRoZSBvdXRwdXQgZm9ybWF0OyBQTkcgaXMgbmV2ZXIgQkdSOyBkb24ndCBkbyB0aGlzIGlmCisgICAgICAgICAgICAgKiB0aGUgb3V0cHV0IGlzIGdyYXksIGJ1dCBmaXggdXAgdGhlICdmb3JtYXQnIHZhbHVlIGluIHRoYXQgY2FzZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQ09MT1IpICE9IDApCisgICAgICAgICAgICAgICBwbmdfc2V0X2JncihwbmdfcHRyKTsKKworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgZm9ybWF0ICY9IH5QTkdfRk9STUFUX0ZMQUdfQkdSOworCisgICAgICAgICAgICBjaGFuZ2UgJj0gflBOR19GT1JNQVRfRkxBR19CR1I7CisgICAgICAgICB9CisjICAgICBlbmRpZgorCisjICAgICBpZmRlZiBQTkdfRk9STUFUX0FGSVJTVF9TVVBQT1JURUQKKyAgICAgICAgIGlmICgoY2hhbmdlICYgUE5HX0ZPUk1BVF9GTEFHX0FGSVJTVCkgIT0gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE9ubHkgcmVsZXZhbnQgaWYgdGhlcmUgaXMgYW4gYWxwaGEgY2hhbm5lbCAtIGl0J3MgcGFydGljdWxhcmx5CisgICAgICAgICAgICAgKiBpbXBvcnRhbnQgdG8gaGFuZGxlIHRoaXMgY29ycmVjdGx5IGJlY2F1c2UgZG9fbG9jYWxfY29tcG9zZSBtYXkKKyAgICAgICAgICAgICAqIGJlIHNldCBhYm92ZSBhbmQgdGhlbiBsaWJwbmcgd2lsbCBrZWVwIHRoZSBhbHBoYSBjaGFubmVsIGZvciB0aGlzCisgICAgICAgICAgICAgKiBjb2RlIHRvIHJlbW92ZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQUxQSEEpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvKiBEaXNhYmxlIHRoaXMgaWYgZG9pbmcgYSBsb2NhbCBiYWNrZ3JvdW5kLAorICAgICAgICAgICAgICAgICogVE9ETzogcmVtb3ZlIHRoaXMgd2hlbiBsb2NhbCBiYWNrZ3JvdW5kIGlzIG5vIGxvbmdlciByZXF1aXJlZC4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgaWYgKGRvX2xvY2FsX2JhY2tncm91bmQgIT0gMikKKyAgICAgICAgICAgICAgICAgIHBuZ19zZXRfc3dhcF9hbHBoYShwbmdfcHRyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgZm9ybWF0ICY9IH5QTkdfRk9STUFUX0ZMQUdfQUZJUlNUOworCisgICAgICAgICAgICBjaGFuZ2UgJj0gflBOR19GT1JNQVRfRkxBR19BRklSU1Q7CisgICAgICAgICB9CisjICAgICBlbmRpZgorCisgICAgICAvKiBJZiB0aGUgKm91dHB1dCogaXMgMTYtYml0IHRoZW4gd2UgbmVlZCB0byBjaGVjayBmb3IgYSBieXRlLXN3YXAgb24gdGhpcworICAgICAgICogYXJjaGl0ZWN0dXJlLgorICAgICAgICovCisgICAgICBpZiAobGluZWFyICE9IDApCisgICAgICB7CisgICAgICAgICBQTkdfQ09OU1QgcG5nX3VpbnRfMTYgbGUgPSAweDAwMDE7CisKKyAgICAgICAgIGlmICgoKihwbmdfY29uc3RfYnl0ZXApICYgbGUpICE9IDApCisgICAgICAgICAgICBwbmdfc2V0X3N3YXAocG5nX3B0cik7CisgICAgICB9CisKKyAgICAgIC8qIElmIGNoYW5nZSBpcyBub3Qgbm93IDAgc29tZSB0cmFuc2Zvcm1hdGlvbiBpcyBtaXNzaW5nIC0gZXJyb3Igb3V0LiAqLworICAgICAgaWYgKGNoYW5nZSAhPSAwKQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJwbmdfcmVhZF9pbWFnZTogdW5zdXBwb3J0ZWQgdHJhbnNmb3JtYXRpb24iKTsKKyAgIH0KKworICAgUE5HX1NLSVBfQ0hVTktTKHBuZ19wdHIpOworCisgICAvKiBVcGRhdGUgdGhlICdpbmZvJyBzdHJ1Y3R1cmUgYW5kIG1ha2Ugc3VyZSB0aGUgcmVzdWx0IGlzIGFzIHJlcXVpcmVkOyBmaXJzdAorICAgICogbWFrZSBzdXJlIHRvIHR1cm4gb24gdGhlIGludGVybGFjZSBoYW5kbGluZyBpZiBpdCB3aWxsIGJlIHJlcXVpcmVkCisgICAgKiAoYmVjYXVzZSBpdCBjYW4ndCBiZSB0dXJuZWQgb24gKmFmdGVyKiB0aGUgY2FsbCB0byBwbmdfcmVhZF91cGRhdGVfaW5mbyEpCisgICAgKgorICAgICogVE9ETzogcmVtb3ZlIHRoZSBkb19sb2NhbF9iYWNrZ3JvdW5kIGZpeHVwIGJlbG93LgorICAgICovCisgICBpZiAoZG9fbG9jYWxfY29tcG9zZSA9PSAwICYmIGRvX2xvY2FsX2JhY2tncm91bmQgIT0gMikKKyAgICAgIHBhc3NlcyA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOworCisgICBwbmdfcmVhZF91cGRhdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7CisKKyAgIHsKKyAgICAgIHBuZ191aW50XzMyIGluZm9fZm9ybWF0ID0gMDsKKworICAgICAgaWYgKChpbmZvX3B0ci0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKSAhPSAwKQorICAgICAgICAgaW5mb19mb3JtYXQgfD0gUE5HX0ZPUk1BVF9GTEFHX0NPTE9SOworCisgICAgICBpZiAoKGluZm9fcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpICE9IDApCisgICAgICB7CisgICAgICAgICAvKiBkb19sb2NhbF9jb21wb3NlIHJlbW92ZXMgdGhpcyBjaGFubmVsIGJlbG93LiAqLworICAgICAgICAgaWYgKGRvX2xvY2FsX2NvbXBvc2UgPT0gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGRvX2xvY2FsX2JhY2tncm91bmQgZG9lcyB0aGUgc2FtZSBpZiByZXF1aXJlZC4gKi8KKyAgICAgICAgICAgIGlmIChkb19sb2NhbF9iYWNrZ3JvdW5kICE9IDIgfHwKKyAgICAgICAgICAgICAgIChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQUxQSEEpICE9IDApCisgICAgICAgICAgICAgICBpbmZvX2Zvcm1hdCB8PSBQTkdfRk9STUFUX0ZMQUdfQUxQSEE7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGVsc2UgaWYgKGRvX2xvY2FsX2NvbXBvc2UgIT0gMCkgLyogaW50ZXJuYWwgZXJyb3IgKi8KKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAicG5nX2ltYWdlX3JlYWQ6IGFscGhhIGNoYW5uZWwgbG9zdCIpOworCisgICAgICBpZiAoaW5mb19wdHItPmJpdF9kZXB0aCA9PSAxNikKKyAgICAgICAgIGluZm9fZm9ybWF0IHw9IFBOR19GT1JNQVRfRkxBR19MSU5FQVI7CisKKyMgICAgIGlmZGVmIFBOR19GT1JNQVRfQkdSX1NVUFBPUlRFRAorICAgICAgICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQkdSKSAhPSAwKQorICAgICAgICAgICAgaW5mb19mb3JtYXQgfD0gUE5HX0ZPUk1BVF9GTEFHX0JHUjsKKyMgICAgIGVuZGlmCisKKyMgICAgIGlmZGVmIFBOR19GT1JNQVRfQUZJUlNUX1NVUFBPUlRFRAorICAgICAgICAgaWYgKGRvX2xvY2FsX2JhY2tncm91bmQgPT0gMikKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FGSVJTVCkgIT0gMCkKKyAgICAgICAgICAgICAgIGluZm9fZm9ybWF0IHw9IFBOR19GT1JNQVRfRkxBR19BRklSU1Q7CisgICAgICAgICB9CisKKyAgICAgICAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1NXQVBfQUxQSEEpICE9IDAgfHwKKyAgICAgICAgICAgICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0FERF9BTFBIQSkgIT0gMCAmJgorICAgICAgICAgICAgKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfRklMTEVSX0FGVEVSKSA9PSAwKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkb19sb2NhbF9iYWNrZ3JvdW5kID09IDIpCisgICAgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInVuZXhwZWN0ZWQgYWxwaGEgc3dhcCB0cmFuc2Zvcm1hdGlvbiIpOworCisgICAgICAgICAgICBpbmZvX2Zvcm1hdCB8PSBQTkdfRk9STUFUX0ZMQUdfQUZJUlNUOworICAgICAgICAgfQorIyAgICAgZW5kaWYKKworICAgICAgLyogVGhpcyBpcyBhY3R1YWxseSBhbiBpbnRlcm5hbCBlcnJvci4gKi8KKyAgICAgIGlmIChpbmZvX2Zvcm1hdCAhPSBmb3JtYXQpCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInBuZ19yZWFkX2ltYWdlOiBpbnZhbGlkIHRyYW5zZm9ybWF0aW9ucyIpOworICAgfQorCisgICAvKiBOb3cgcmVhZCB0aGUgcm93cy4gIElmIGRvX2xvY2FsX2NvbXBvc2UgaXMgc2V0IHRoZW4gaXQgaXMgbmVjZXNzYXJ5IHRvIHVzZQorICAgICogYSBsb2NhbCByb3cgYnVmZmVyLiAgVGhlIG91dHB1dCB3aWxsIGJlIEdBLCBSR0JBIG9yIEJHUkEgYW5kIG11c3QgYmUKKyAgICAqIGNvbnZlcnRlZCB0byBHLCBSR0Igb3IgQkdSIGFzIGFwcHJvcHJpYXRlLiAgVGhlICdsb2NhbF9yb3cnIG1lbWJlciBvZiB0aGUKKyAgICAqIGRpc3BsYXkgYWN0cyBhcyBhIGZsYWcuCisgICAgKi8KKyAgIHsKKyAgICAgIHBuZ192b2lkcCBmaXJzdF9yb3cgPSBkaXNwbGF5LT5idWZmZXI7CisgICAgICBwdHJkaWZmX3Qgcm93X2J5dGVzID0gZGlzcGxheS0+cm93X3N0cmlkZTsKKworICAgICAgaWYgKGxpbmVhciAhPSAwKQorICAgICAgICAgcm93X2J5dGVzICo9IDI7CisKKyAgICAgIC8qIFRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbiBpcyBkZXNpZ25lZCB0byB3b3JrIGNvcnJlY3RseSB3aGV0aGVyIGl0IGdpdmVzCisgICAgICAgKiBhIHNpZ25lZCBvciBhbiB1bnNpZ25lZCByZXN1bHQuCisgICAgICAgKi8KKyAgICAgIGlmIChyb3dfYnl0ZXMgPCAwKQorICAgICAgeworICAgICAgICAgY2hhciAqcHRyID0gcG5nX3ZvaWRjYXN0KGNoYXIqLCBmaXJzdF9yb3cpOworICAgICAgICAgcHRyICs9IChpbWFnZS0+aGVpZ2h0LTEpICogKC1yb3dfYnl0ZXMpOworICAgICAgICAgZmlyc3Rfcm93ID0gcG5nX3ZvaWRjYXN0KHBuZ192b2lkcCwgcHRyKTsKKyAgICAgIH0KKworICAgICAgZGlzcGxheS0+Zmlyc3Rfcm93ID0gZmlyc3Rfcm93OworICAgICAgZGlzcGxheS0+cm93X2J5dGVzID0gcm93X2J5dGVzOworICAgfQorCisgICBpZiAoZG9fbG9jYWxfY29tcG9zZSAhPSAwKQorICAgeworICAgICAgaW50IHJlc3VsdDsKKyAgICAgIHBuZ192b2lkcCByb3cgPSBwbmdfbWFsbG9jKHBuZ19wdHIsIHBuZ19nZXRfcm93Ynl0ZXMocG5nX3B0ciwgaW5mb19wdHIpKTsKKworICAgICAgZGlzcGxheS0+bG9jYWxfcm93ID0gcm93OworICAgICAgcmVzdWx0ID0gcG5nX3NhZmVfZXhlY3V0ZShpbWFnZSwgcG5nX2ltYWdlX3JlYWRfY29tcG9zaXRlLCBkaXNwbGF5KTsKKyAgICAgIGRpc3BsYXktPmxvY2FsX3JvdyA9IE5VTEw7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCByb3cpOworCisgICAgICByZXR1cm4gcmVzdWx0OworICAgfQorCisgICBlbHNlIGlmIChkb19sb2NhbF9iYWNrZ3JvdW5kID09IDIpCisgICB7CisgICAgICBpbnQgcmVzdWx0OworICAgICAgcG5nX3ZvaWRwIHJvdyA9IHBuZ19tYWxsb2MocG5nX3B0ciwgcG5nX2dldF9yb3dieXRlcyhwbmdfcHRyLCBpbmZvX3B0cikpOworCisgICAgICBkaXNwbGF5LT5sb2NhbF9yb3cgPSByb3c7CisgICAgICByZXN1bHQgPSBwbmdfc2FmZV9leGVjdXRlKGltYWdlLCBwbmdfaW1hZ2VfcmVhZF9iYWNrZ3JvdW5kLCBkaXNwbGF5KTsKKyAgICAgIGRpc3BsYXktPmxvY2FsX3JvdyA9IE5VTEw7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCByb3cpOworCisgICAgICByZXR1cm4gcmVzdWx0OworICAgfQorCisgICBlbHNlCisgICB7CisgICAgICBwbmdfYWxsb2Nfc2l6ZV90IHJvd19ieXRlcyA9IGRpc3BsYXktPnJvd19ieXRlczsKKworICAgICAgd2hpbGUgKC0tcGFzc2VzID49IDApCisgICAgICB7CisgICAgICAgICBwbmdfdWludF8zMiAgICAgIHkgPSBpbWFnZS0+aGVpZ2h0OworICAgICAgICAgcG5nX2J5dGVwICAgICAgICByb3cgPSBwbmdfdm9pZGNhc3QocG5nX2J5dGVwLCBkaXNwbGF5LT5maXJzdF9yb3cpOworCisgICAgICAgICB3aGlsZSAoeS0tID4gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19yZWFkX3JvdyhwbmdfcHRyLCByb3csIE5VTEwpOworICAgICAgICAgICAgcm93ICs9IHJvd19ieXRlczsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIDE7CisgICB9Cit9CisKK2ludCBQTkdBUEkKK3BuZ19pbWFnZV9maW5pc2hfcmVhZChwbmdfaW1hZ2VwIGltYWdlLCBwbmdfY29uc3RfY29sb3JwIGJhY2tncm91bmQsCisgICB2b2lkICpidWZmZXIsIHBuZ19pbnRfMzIgcm93X3N0cmlkZSwgdm9pZCAqY29sb3JtYXApCit7CisgICBpZiAoaW1hZ2UgIT0gTlVMTCAmJiBpbWFnZS0+dmVyc2lvbiA9PSBQTkdfSU1BR0VfVkVSU0lPTikKKyAgIHsKKyAgICAgIHBuZ191aW50XzMyIGNoZWNrOworCisgICAgICBpZiAocm93X3N0cmlkZSA9PSAwKQorICAgICAgICAgcm93X3N0cmlkZSA9IFBOR19JTUFHRV9ST1dfU1RSSURFKCppbWFnZSk7CisKKyAgICAgIGlmIChyb3dfc3RyaWRlIDwgMCkKKyAgICAgICAgIGNoZWNrID0gLXJvd19zdHJpZGU7CisKKyAgICAgIGVsc2UKKyAgICAgICAgIGNoZWNrID0gcm93X3N0cmlkZTsKKworICAgICAgaWYgKGltYWdlLT5vcGFxdWUgIT0gTlVMTCAmJiBidWZmZXIgIT0gTlVMTCAmJgorICAgICAgICAgY2hlY2sgPj0gUE5HX0lNQUdFX1JPV19TVFJJREUoKmltYWdlKSkKKyAgICAgIHsKKyAgICAgICAgIGlmICgoaW1hZ2UtPmZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCkgPT0gMCB8fAorICAgICAgICAgICAgKGltYWdlLT5jb2xvcm1hcF9lbnRyaWVzID4gMCAmJiBjb2xvcm1hcCAhPSBOVUxMKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGludCByZXN1bHQ7CisgICAgICAgICAgICBwbmdfaW1hZ2VfcmVhZF9jb250cm9sIGRpc3BsYXk7CisKKyAgICAgICAgICAgIG1lbXNldCgmZGlzcGxheSwgMCwgKHNpemVvZiBkaXNwbGF5KSk7CisgICAgICAgICAgICBkaXNwbGF5LmltYWdlID0gaW1hZ2U7CisgICAgICAgICAgICBkaXNwbGF5LmJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgICAgIGRpc3BsYXkucm93X3N0cmlkZSA9IHJvd19zdHJpZGU7CisgICAgICAgICAgICBkaXNwbGF5LmNvbG9ybWFwID0gY29sb3JtYXA7CisgICAgICAgICAgICBkaXNwbGF5LmJhY2tncm91bmQgPSBiYWNrZ3JvdW5kOworICAgICAgICAgICAgZGlzcGxheS5sb2NhbF9yb3cgPSBOVUxMOworCisgICAgICAgICAgICAvKiBDaG9vc2UgdGhlIGNvcnJlY3QgJ2VuZCcgcm91dGluZTsgZm9yIHRoZSBjb2xvci1tYXAgY2FzZSBhbGwgdGhlCisgICAgICAgICAgICAgKiBzZXR1cCBoYXMgYWxyZWFkeSBiZWVuIGRvbmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICgoaW1hZ2UtPmZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCkgIT0gMCkKKyAgICAgICAgICAgICAgIHJlc3VsdCA9CisgICAgICAgICAgICAgICAgICBwbmdfc2FmZV9leGVjdXRlKGltYWdlLCBwbmdfaW1hZ2VfcmVhZF9jb2xvcm1hcCwgJmRpc3BsYXkpICYmCisgICAgICAgICAgICAgICAgICBwbmdfc2FmZV9leGVjdXRlKGltYWdlLCBwbmdfaW1hZ2VfcmVhZF9jb2xvcm1hcHBlZCwgJmRpc3BsYXkpOworCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICByZXN1bHQgPQorICAgICAgICAgICAgICAgICAgcG5nX3NhZmVfZXhlY3V0ZShpbWFnZSwgcG5nX2ltYWdlX3JlYWRfZGlyZWN0LCAmZGlzcGxheSk7CisKKyAgICAgICAgICAgIHBuZ19pbWFnZV9mcmVlKGltYWdlKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBwbmdfaW1hZ2VfZXJyb3IoaW1hZ2UsCisgICAgICAgICAgICAgICAicG5nX2ltYWdlX2ZpbmlzaF9yZWFkW2NvbG9yLW1hcF06IG5vIGNvbG9yLW1hcCIpOworICAgICAgfQorCisgICAgICBlbHNlCisgICAgICAgICByZXR1cm4gcG5nX2ltYWdlX2Vycm9yKGltYWdlLAorICAgICAgICAgICAgInBuZ19pbWFnZV9maW5pc2hfcmVhZDogaW52YWxpZCBhcmd1bWVudCIpOworICAgfQorCisgICBlbHNlIGlmIChpbWFnZSAhPSBOVUxMKQorICAgICAgcmV0dXJuIHBuZ19pbWFnZV9lcnJvcihpbWFnZSwKKyAgICAgICAgICJwbmdfaW1hZ2VfZmluaXNoX3JlYWQ6IGRhbWFnZWQgUE5HX0lNQUdFX1ZFUlNJT04iKTsKKworICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBTSU1QTElGSUVEX1JFQUQgKi8KKyNlbmRpZiAvKiBSRUFEICovCmRpZmYgLS1naXQgYS9saWJwbmcvcG5ncmlvLmMgYi9saWJwbmcvcG5ncmlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNkNzJiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9wbmdyaW8uYwpAQCAtMCwwICsxLDE0NSBAQAorCisvKiBwbmdyaW8uYyAtIGZ1bmN0aW9ucyBmb3IgZGF0YSBpbnB1dAorICoKKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS42LjE3IFtNYXJjaCAyNiwgMjAxNV0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDE1IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCisgKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCisgKgorICogVGhpcyBmaWxlIHByb3ZpZGVzIGEgbG9jYXRpb24gZm9yIGFsbCBpbnB1dC4gIFVzZXJzIHdobyBuZWVkCisgKiBzcGVjaWFsIGhhbmRsaW5nIGFyZSBleHBlY3RlZCB0byB3cml0ZSBhIGZ1bmN0aW9uIHRoYXQgaGFzIHRoZSBzYW1lCisgKiBhcmd1bWVudHMgYXMgdGhpcyBhbmQgcGVyZm9ybXMgYSBzaW1pbGFyIGZ1bmN0aW9uLCBidXQgdGhhdCBwb3NzaWJseQorICogaGFzIGEgZGlmZmVyZW50IGlucHV0IG1ldGhvZC4gIE5vdGUgdGhhdCB5b3Ugc2hvdWxkbid0IGNoYW5nZSB0aGlzCisgKiBmdW5jdGlvbiwgYnV0IHJhdGhlciB3cml0ZSBhIHJlcGxhY2VtZW50IGZ1bmN0aW9uIGFuZCB0aGVuIG1ha2UKKyAqIGxpYnBuZyB1c2UgaXQgYXQgcnVuIHRpbWUgd2l0aCBwbmdfc2V0X3JlYWRfZm4oLi4uKS4KKyAqLworCisjaW5jbHVkZSAicG5ncHJpdi5oIgorCisjaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECisKKy8qIFJlYWQgdGhlIGRhdGEgZnJvbSB3aGF0ZXZlciBpbnB1dCB5b3UgYXJlIHVzaW5nLiAgVGhlIGRlZmF1bHQgcm91dGluZQorICogcmVhZHMgZnJvbSBhIGZpbGUgcG9pbnRlci4gIE5vdGUgdGhhdCB0aGlzIHJvdXRpbmUgc29tZXRpbWVzIGdldHMgY2FsbGVkCisgKiB3aXRoIHZlcnkgc21hbGwgbGVuZ3Rocywgc28geW91IHNob3VsZCBpbXBsZW1lbnQgc29tZSBraW5kIG9mIHNpbXBsZQorICogYnVmZmVyaW5nIGlmIHlvdSBhcmUgdXNpbmcgdW5idWZmZXJlZCByZWFkcy4gIFRoaXMgc2hvdWxkIG5ldmVyIGJlIGFza2VkCisgKiB0byByZWFkIG1vcmUgdGhhbiA2NEsgb24gYSAxNi1iaXQgbWFjaGluZS4KKyAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfcmVhZF9kYXRhKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpCit7CisgICBwbmdfZGVidWcxKDQsICJyZWFkaW5nICVkIGJ5dGVzIiwgKGludClsZW5ndGgpOworCisgICBpZiAocG5nX3B0ci0+cmVhZF9kYXRhX2ZuICE9IE5VTEwpCisgICAgICAoKihwbmdfcHRyLT5yZWFkX2RhdGFfZm4pKShwbmdfcHRyLCBkYXRhLCBsZW5ndGgpOworCisgICBlbHNlCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkNhbGwgdG8gTlVMTCByZWFkIGZ1bmN0aW9uIik7CisjaWZkZWYgUE5HX0lOREVYX1NVUFBPUlRFRAorICAgcG5nX3B0ci0+dG90YWxfZGF0YV9yZWFkICs9IGxlbmd0aDsKKyNlbmRpZgorfQorCisjaWZkZWYgUE5HX0lOREVYX1NVUFBPUlRFRAordm9pZCAvKiBQUklWQVRFICovCitwbmdfc2Vla19kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzMyIG9mZnNldCkKK3sKKyAgIGlmIChwbmdfcHRyLT5zZWVrX2RhdGFfZm4gIT0gTlVMTCkKKyAgICAgICgqKHBuZ19wdHItPnNlZWtfZGF0YV9mbikpKHBuZ19wdHIsIG9mZnNldCk7CisgICBlbHNlCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkNhbGwgdG8gTlVMTCBzZWVrIGZ1bmN0aW9uIik7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19TVERJT19TVVBQT1JURUQKKy8qIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgZG9lcyB0aGUgYWN0dWFsIHJlYWRpbmcgb2YgZGF0YS4gIElmIHlvdSBhcmUKKyAqIG5vdCByZWFkaW5nIGZyb20gYSBzdGFuZGFyZCBDIHN0cmVhbSwgeW91IHNob3VsZCBjcmVhdGUgYSByZXBsYWNlbWVudAorICogcmVhZF9kYXRhIGZ1bmN0aW9uIGFuZCB1c2UgaXQgYXQgcnVuIHRpbWUgd2l0aCBwbmdfc2V0X3JlYWRfZm4oKSwgcmF0aGVyCisgKiB0aGFuIGNoYW5naW5nIHRoZSBsaWJyYXJ5LgorICovCit2b2lkIFBOR0NCQVBJCitwbmdfZGVmYXVsdF9yZWFkX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKQoreworICAgcG5nX3NpemVfdCBjaGVjazsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgLyogZnJlYWQoKSByZXR1cm5zIDAgb24gZXJyb3IsIHNvIGl0IGlzIE9LIHRvIHN0b3JlIHRoaXMgaW4gYSBwbmdfc2l6ZV90CisgICAgKiBpbnN0ZWFkIG9mIGFuIGludCwgd2hpY2ggaXMgd2hhdCBmcmVhZCgpIGFjdHVhbGx5IHJldHVybnMuCisgICAgKi8KKyAgIGNoZWNrID0gZnJlYWQoZGF0YSwgMSwgbGVuZ3RoLCBwbmdfdm9pZGNhc3QocG5nX0ZJTEVfcCwgcG5nX3B0ci0+aW9fcHRyKSk7CisKKyAgIGlmIChjaGVjayAhPSBsZW5ndGgpCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlJlYWQgRXJyb3IiKTsKK30KKyNlbmRpZgorCisvKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gc3VwcGx5IGEgbmV3IGlucHV0IGZ1bmN0aW9uCisgKiBmb3IgbGlicG5nIGlmIHN0YW5kYXJkIEMgc3RyZWFtcyBhcmVuJ3QgYmVpbmcgdXNlZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIGl0cyBhcmd1bWVudHM6CisgKgorICogcG5nX3B0ciAgICAgIC0gcG9pbnRlciB0byBhIHBuZyBpbnB1dCBkYXRhIHN0cnVjdHVyZQorICoKKyAqIGlvX3B0ciAgICAgICAtIHBvaW50ZXIgdG8gdXNlciBzdXBwbGllZCBzdHJ1Y3R1cmUgY29udGFpbmluZyBpbmZvIGFib3V0CisgKiAgICAgICAgICAgICAgICB0aGUgaW5wdXQgZnVuY3Rpb25zLiAgTWF5IGJlIE5VTEwuCisgKgorICogcmVhZF9kYXRhX2ZuIC0gcG9pbnRlciB0byBhIG5ldyBpbnB1dCBmdW5jdGlvbiB0aGF0IHRha2VzIGFzIGl0cworICogICAgICAgICAgICAgICAgYXJndW1lbnRzIGEgcG9pbnRlciB0byBhIHBuZ19zdHJ1Y3QsIGEgcG9pbnRlciB0bworICogICAgICAgICAgICAgICAgYSBsb2NhdGlvbiB3aGVyZSBpbnB1dCBkYXRhIGNhbiBiZSBzdG9yZWQsIGFuZCBhIDMyLWJpdAorICogICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRoYXQgaXMgdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSByZWFkLgorICogICAgICAgICAgICAgICAgVG8gZXhpdCBhbmQgb3V0cHV0IGFueSBmYXRhbCBlcnJvciBtZXNzYWdlcyB0aGUgbmV3IHdyaXRlCisgKiAgICAgICAgICAgICAgICBmdW5jdGlvbiBzaG91bGQgY2FsbCBwbmdfZXJyb3IocG5nX3B0ciwgIkVycm9yIG1zZyIpLgorICogICAgICAgICAgICAgICAgTWF5IGJlIE5VTEwsIGluIHdoaWNoIGNhc2UgbGlicG5nJ3MgZGVmYXVsdCBmdW5jdGlvbiB3aWxsCisgKiAgICAgICAgICAgICAgICBiZSB1c2VkLgorICovCit2b2lkIFBOR0FQSQorcG5nX3NldF9yZWFkX2ZuKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfdm9pZHAgaW9fcHRyLAorICAgcG5nX3J3X3B0ciByZWFkX2RhdGFfZm4pCit7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBwbmdfcHRyLT5pb19wdHIgPSBpb19wdHI7CisKKyNpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECisgICBpZiAocmVhZF9kYXRhX2ZuICE9IE5VTEwpCisgICAgICBwbmdfcHRyLT5yZWFkX2RhdGFfZm4gPSByZWFkX2RhdGFfZm47CisKKyAgIGVsc2UKKyAgICAgIHBuZ19wdHItPnJlYWRfZGF0YV9mbiA9IHBuZ19kZWZhdWx0X3JlYWRfZGF0YTsKKyNlbHNlCisgICBwbmdfcHRyLT5yZWFkX2RhdGFfZm4gPSByZWFkX2RhdGFfZm47CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKKyAgIC8qIEl0IGlzIGFuIGVycm9yIHRvIHdyaXRlIHRvIGEgcmVhZCBkZXZpY2UgKi8KKyAgIGlmIChwbmdfcHRyLT53cml0ZV9kYXRhX2ZuICE9IE5VTEwpCisgICB7CisgICAgICBwbmdfcHRyLT53cml0ZV9kYXRhX2ZuID0gTlVMTDsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCisgICAgICAgICAgIkNhbid0IHNldCBib3RoIHJlYWRfZGF0YV9mbiBhbmQgd3JpdGVfZGF0YV9mbiBpbiB0aGUiCisgICAgICAgICAgIiBzYW1lIHN0cnVjdHVyZSIpOworICAgfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVECisgICBwbmdfcHRyLT5vdXRwdXRfZmx1c2hfZm4gPSBOVUxMOworI2VuZGlmCit9CisKKyNpZmRlZiBQTkdfSU5ERVhfU1VQUE9SVEVECit2b2lkIFBOR0FQSQorcG5nX3NldF9zZWVrX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19zZWVrX3B0ciBzZWVrX2RhdGFfZm4pCit7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworICAgcG5nX3B0ci0+c2Vla19kYXRhX2ZuID0gc2Vla19kYXRhX2ZuOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBSRUFEICovCmRpZmYgLS1naXQgYS9saWJwbmcvcG5ncnRyYW4uYyBiL2xpYnBuZy9wbmdydHJhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwOGFkZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvcG5ncnRyYW4uYwpAQCAtMCwwICsxLDUwMDEgQEAKKworLyogcG5ncnRyYW4uYyAtIHRyYW5zZm9ybXMgdGhlIGRhdGEgaW4gYSByb3cgZm9yIFBORyByZWFkZXJzCisgKgorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMTkgW05vdmVtYmVyIDEyLCAyMDE1XQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTUgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKKyAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIG9wdGlvbmFsbHkgY2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uCisgKiBpbiBvcmRlciB0byB0ZWxsIGxpYnBuZyBob3cgdG8gaGFuZGxlIGRhdGEgd2hlbiByZWFkaW5nIGEgUE5HLgorICogVHJhbnNmb3JtYXRpb25zIHRoYXQgYXJlIHVzZWQgaW4gYm90aCByZWFkaW5nIGFuZCB3cml0aW5nIGFyZQorICogaW4gcG5ndHJhbnMuYy4KKyAqLworCisjaW5jbHVkZSAicG5ncHJpdi5oIgorCisjaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECisKKy8qIFNldCB0aGUgYWN0aW9uIG9uIGdldHRpbmcgYSBDUkMgZXJyb3IgZm9yIGFuIGFuY2lsbGFyeSBvciBjcml0aWNhbCBjaHVuay4gKi8KK3ZvaWQgUE5HQVBJCitwbmdfc2V0X2NyY19hY3Rpb24ocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBjcml0X2FjdGlvbiwgaW50IGFuY2lsX2FjdGlvbikKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9jcmNfYWN0aW9uIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIC8qIFRlbGwgbGlicG5nIGhvdyB3ZSByZWFjdCB0byBDUkMgZXJyb3JzIGluIGNyaXRpY2FsIGNodW5rcyAqLworICAgc3dpdGNoIChjcml0X2FjdGlvbikKKyAgIHsKKyAgICAgIGNhc2UgUE5HX0NSQ19OT19DSEFOR0U6ICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVhdmUgc2V0dGluZyBhcyBpcyAqLworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUE5HX0NSQ19XQVJOX1VTRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2Fybi91c2UgZGF0YSAqLworICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX0NSQ19DUklUSUNBTF9NQVNLOworICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfQ1JDX0NSSVRJQ0FMX1VTRTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBOR19DUkNfUVVJRVRfVVNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUXVpZXQvdXNlIGRhdGEgKi8KKyAgICAgICAgIHBuZ19wdHItPmZsYWdzICY9IH5QTkdfRkxBR19DUkNfQ1JJVElDQUxfTUFTSzsKKyAgICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX0NSQ19DUklUSUNBTF9VU0UgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0ZMQUdfQ1JDX0NSSVRJQ0FMX0lHTk9SRTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBOR19DUkNfV0FSTl9ESVNDQVJEOiAgICAvKiBOb3QgYSB2YWxpZCBhY3Rpb24gZm9yIGNyaXRpY2FsIGRhdGEgKi8KKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCisgICAgICAgICAgICAiQ2FuJ3QgZGlzY2FyZCBjcml0aWNhbCBkYXRhIG9uIENSQyBlcnJvciIpOworICAgICAgY2FzZSBQTkdfQ1JDX0VSUk9SX1FVSVQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFcnJvci9xdWl0ICovCisKKyAgICAgIGNhc2UgUE5HX0NSQ19ERUZBVUxUOgorICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHBuZ19wdHItPmZsYWdzICY9IH5QTkdfRkxBR19DUkNfQ1JJVElDQUxfTUFTSzsKKyAgICAgICAgIGJyZWFrOworICAgfQorCisgICAvKiBUZWxsIGxpYnBuZyBob3cgd2UgcmVhY3QgdG8gQ1JDIGVycm9ycyBpbiBhbmNpbGxhcnkgY2h1bmtzICovCisgICBzd2l0Y2ggKGFuY2lsX2FjdGlvbikKKyAgIHsKKyAgICAgIGNhc2UgUE5HX0NSQ19OT19DSEFOR0U6ICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWF2ZSBzZXR0aW5nIGFzIGlzICovCisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBQTkdfQ1JDX1dBUk5fVVNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdhcm4vdXNlIGRhdGEgKi8KKyAgICAgICAgIHBuZ19wdHItPmZsYWdzICY9IH5QTkdfRkxBR19DUkNfQU5DSUxMQVJZX01BU0s7CisgICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19DUkNfQU5DSUxMQVJZX1VTRTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBOR19DUkNfUVVJRVRfVVNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRdWlldC91c2UgZGF0YSAqLworICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX0NSQ19BTkNJTExBUllfTUFTSzsKKyAgICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX0NSQ19BTkNJTExBUllfVVNFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19GTEFHX0NSQ19BTkNJTExBUllfTk9XQVJOOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUE5HX0NSQ19FUlJPUl9RVUlUOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFcnJvci9xdWl0ICovCisgICAgICAgICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9NQVNLOworICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9OT1dBUk47CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBQTkdfQ1JDX1dBUk5fRElTQ0FSRDogICAgICAgICAgICAgICAgICAgICAgLyogV2Fybi9kaXNjYXJkIGRhdGEgKi8KKworICAgICAgY2FzZSBQTkdfQ1JDX0RFRkFVTFQ6CisgICAgICBkZWZhdWx0OgorICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX0NSQ19BTkNJTExBUllfTUFTSzsKKyAgICAgICAgIGJyZWFrOworICAgfQorfQorCisjaWZkZWYgUE5HX1JFQURfVFJBTlNGT1JNU19TVVBQT1JURUQKKy8qIElzIGl0IE9LIHRvIHNldCBhIHRyYW5zZm9ybWF0aW9uIG5vdz8gIE9ubHkgaWYgcG5nX3N0YXJ0X3JlYWRfaW1hZ2Ugb3IKKyAqIHBuZ19yZWFkX3VwZGF0ZV9pbmZvIGhhdmUgbm90IGJlZW4gY2FsbGVkLiAgSXQgaXMgbm90IG5lY2Vzc2FyeSBmb3IgdGhlIElIRFIKKyAqIHRvIGhhdmUgYmVlbiByZWFkIGluIGFsbCBjYXNlczsgdGhlIG5lZWRfSUhEUiBwYXJhbWV0ZXIgYWxsb3dzIGZvciB0aGlzCisgKiBjaGVjayB0b28uCisgKi8KK3N0YXRpYyBpbnQKK3BuZ19ydHJhbl9vayhwbmdfc3RydWN0cnAgcG5nX3B0ciwgaW50IG5lZWRfSUhEUikKK3sKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwpCisgICB7CisjaWZuZGVmIFBOR19JTkRFWF9TVVBQT1JURUQKKyAgICAgIGlmICgocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19ST1dfSU5JVCkgIT0gMCkKKyAgICAgICAgIHBuZ19hcHBfZXJyb3IocG5nX3B0ciwKKyAgICAgICAgICAgICJpbnZhbGlkIGFmdGVyIHBuZ19zdGFydF9yZWFkX2ltYWdlIG9yIHBuZ19yZWFkX3VwZGF0ZV9pbmZvIik7CisKKyAgICAgIGVsc2UgaWYgKG5lZWRfSUhEUiAmJiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpID09IDApCisgICAgICAgICBwbmdfYXBwX2Vycm9yKHBuZ19wdHIsICJpbnZhbGlkIGJlZm9yZSB0aGUgUE5HIGhlYWRlciBoYXMgYmVlbiByZWFkIik7CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIC8qIFR1cm4gb24gZmFpbHVyZSB0byBpbml0aWFsaXplIGNvcnJlY3RseSBmb3IgYWxsIHRyYW5zZm9ybXMuICovCisgICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19ERVRFQ1RfVU5JTklUSUFMSVpFRDsKKworICAgICAgICAgcmV0dXJuIDE7IC8qIE9rICovCisgICAgICB9CisjZWxzZQorICAgICAgcmV0dXJuIDE7CisjZW5kaWYKKyAgIH0KKworICAgcmV0dXJuIDA7IC8qIG5vIHBuZ19lcnJvciBwb3NzaWJsZSEgKi8KK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQKKy8qIEhhbmRsZSBhbHBoYSBhbmQgdFJOUyB2aWEgYSBiYWNrZ3JvdW5kIGNvbG9yICovCit2b2lkIFBOR0ZBUEkKK3BuZ19zZXRfYmFja2dyb3VuZF9maXhlZChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfY29sb3JfMTZwIGJhY2tncm91bmRfY29sb3IsIGludCBiYWNrZ3JvdW5kX2dhbW1hX2NvZGUsCisgICAgaW50IG5lZWRfZXhwYW5kLCBwbmdfZml4ZWRfcG9pbnQgYmFja2dyb3VuZF9nYW1tYSkKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9iYWNrZ3JvdW5kX2ZpeGVkIik7CisKKyAgIGlmIChwbmdfcnRyYW5fb2socG5nX3B0ciwgMCkgPT0gMCB8fCBiYWNrZ3JvdW5kX2NvbG9yID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIGlmIChiYWNrZ3JvdW5kX2dhbW1hX2NvZGUgPT0gUE5HX0JBQ0tHUk9VTkRfR0FNTUFfVU5LTk9XTikKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJBcHBsaWNhdGlvbiBtdXN0IHN1cHBseSBhIGtub3duIGJhY2tncm91bmQgZ2FtbWEiKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19DT01QT1NFIHwgUE5HX1NUUklQX0FMUEhBOworICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICY9IH5QTkdfRU5DT0RFX0FMUEhBOworICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX09QVElNSVpFX0FMUEhBOworCisgICBwbmdfcHRyLT5iYWNrZ3JvdW5kID0gKmJhY2tncm91bmRfY29sb3I7CisgICBwbmdfcHRyLT5iYWNrZ3JvdW5kX2dhbW1hID0gYmFja2dyb3VuZF9nYW1tYTsKKyAgIHBuZ19wdHItPmJhY2tncm91bmRfZ2FtbWFfdHlwZSA9IChwbmdfYnl0ZSkoYmFja2dyb3VuZF9nYW1tYV9jb2RlKTsKKyAgIGlmIChuZWVkX2V4cGFuZCAhPSAwKQorICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19CQUNLR1JPVU5EX0VYUEFORDsKKyAgIGVsc2UKKyAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmPSB+UE5HX0JBQ0tHUk9VTkRfRVhQQU5EOworfQorCisjICBpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECit2b2lkIFBOR0FQSQorcG5nX3NldF9iYWNrZ3JvdW5kKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19jb25zdF9jb2xvcl8xNnAgYmFja2dyb3VuZF9jb2xvciwgaW50IGJhY2tncm91bmRfZ2FtbWFfY29kZSwKKyAgICBpbnQgbmVlZF9leHBhbmQsIGRvdWJsZSBiYWNrZ3JvdW5kX2dhbW1hKQoreworICAgcG5nX3NldF9iYWNrZ3JvdW5kX2ZpeGVkKHBuZ19wdHIsIGJhY2tncm91bmRfY29sb3IsIGJhY2tncm91bmRfZ2FtbWFfY29kZSwKKyAgICAgIG5lZWRfZXhwYW5kLCBwbmdfZml4ZWQocG5nX3B0ciwgYmFja2dyb3VuZF9nYW1tYSwgInBuZ19zZXRfYmFja2dyb3VuZCIpKTsKK30KKyMgIGVuZGlmICAvKiBGTE9BVElOR19QT0lOVCAqLworI2VuZGlmIC8qIFJFQURfQkFDS0dST1VORCAqLworCisvKiBTY2FsZSAxNi1iaXQgZGVwdGggZmlsZXMgdG8gOC1iaXQgZGVwdGguICBJZiBib3RoIG9mIHRoZXNlIGFyZSBzZXQgdGhlbiB0aGUKKyAqIG9uZSB0aGF0IHBuZ3J0cmFuIGRvZXMgZmlyc3QgKHNjYWxlKSBoYXBwZW5zLiAgVGhpcyBpcyBuZWNlc3NhcnkgdG8gYWxsb3cgdGhlCisgKiBUUkFOU0ZPUk0gYW5kIEFQSSBiZWhhdmlvciB0byBiZSBzb21ld2hhdCBjb25zaXN0ZW50LCBhbmQgaXQncyBzaW1wbGVyLgorICovCisjaWZkZWYgUE5HX1JFQURfU0NBTEVfMTZfVE9fOF9TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3NjYWxlXzE2KHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3NjYWxlXzE2Iik7CisKKyAgIGlmIChwbmdfcnRyYW5fb2socG5nX3B0ciwgMCkgPT0gMCkKKyAgICAgIHJldHVybjsKKworICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19TQ0FMRV8xNl9UT184OworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9TVFJJUF8xNl9UT184X1NVUFBPUlRFRAorLyogQ2hvcCAxNi1iaXQgZGVwdGggZmlsZXMgdG8gOC1iaXQgZGVwdGggKi8KK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3N0cmlwXzE2KHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3N0cmlwXzE2Iik7CisKKyAgIGlmIChwbmdfcnRyYW5fb2socG5nX3B0ciwgMCkgPT0gMCkKKyAgICAgIHJldHVybjsKKworICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR18xNl9UT184OworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9TVFJJUF9BTFBIQV9TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3N0cmlwX2FscGhhKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3N0cmlwX2FscGhhIik7CisKKyAgIGlmIChwbmdfcnRyYW5fb2socG5nX3B0ciwgMCkgPT0gMCkKKyAgICAgIHJldHVybjsKKworICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19TVFJJUF9BTFBIQTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9BTFBIQV9NT0RFX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpCitzdGF0aWMgcG5nX2ZpeGVkX3BvaW50Cit0cmFuc2xhdGVfZ2FtbWFfZmxhZ3MocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19maXhlZF9wb2ludCBvdXRwdXRfZ2FtbWEsCisgICBpbnQgaXNfc2NyZWVuKQoreworICAgLyogQ2hlY2sgZm9yIGZsYWcgdmFsdWVzLiAgVGhlIG1haW4gcmVhc29uIGZvciBoYXZpbmcgdGhlIG9sZCBNYWMgdmFsdWUgYXMgYQorICAgICogZmxhZyBpcyB0aGF0IGl0IGlzIHByZXR0eSBuZWFyIGltcG9zc2libGUgdG8gd29yayBvdXQgd2hhdCB0aGUgY29ycmVjdAorICAgICogdmFsdWUgaXMgZnJvbSBBcHBsZSBkb2N1bWVudGF0aW9uIC0gYSB3b3JraW5nIE1hYyBzeXN0ZW0gaXMgbmVlZGVkIHRvCisgICAgKiBkaXNjb3ZlciB0aGUgdmFsdWUhCisgICAgKi8KKyAgIGlmIChvdXRwdXRfZ2FtbWEgPT0gUE5HX0RFRkFVTFRfc1JHQiB8fAorICAgICAgb3V0cHV0X2dhbW1hID09IFBOR19GUF8xIC8gUE5HX0RFRkFVTFRfc1JHQikKKyAgIHsKKyAgICAgIC8qIElmIHRoZXJlIGlzIG5vIHNSR0Igc3VwcG9ydCB0aGlzIGp1c3Qgc2V0cyB0aGUgZ2FtbWEgdG8gdGhlIHN0YW5kYXJkCisgICAgICAgKiBzUkdCIHZhbHVlLiAgKFRoaXMgaXMgYSBzaWRlIGVmZmVjdCBvZiB1c2luZyB0aGlzIGZ1bmN0aW9uISkKKyAgICAgICAqLworIyAgICAgaWZkZWYgUE5HX1JFQURfc1JHQl9TVVBQT1JURUQKKyAgICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX0FTU1VNRV9zUkdCOworIyAgICAgZWxzZQorICAgICAgICAgUE5HX1VOVVNFRChwbmdfcHRyKQorIyAgICAgZW5kaWYKKyAgICAgIGlmIChpc19zY3JlZW4gIT0gMCkKKyAgICAgICAgIG91dHB1dF9nYW1tYSA9IFBOR19HQU1NQV9zUkdCOworICAgICAgZWxzZQorICAgICAgICAgb3V0cHV0X2dhbW1hID0gUE5HX0dBTU1BX3NSR0JfSU5WRVJTRTsKKyAgIH0KKworICAgZWxzZSBpZiAob3V0cHV0X2dhbW1hID09IFBOR19HQU1NQV9NQUNfMTggfHwKKyAgICAgIG91dHB1dF9nYW1tYSA9PSBQTkdfRlBfMSAvIFBOR19HQU1NQV9NQUNfMTgpCisgICB7CisgICAgICBpZiAoaXNfc2NyZWVuICE9IDApCisgICAgICAgICBvdXRwdXRfZ2FtbWEgPSBQTkdfR0FNTUFfTUFDX09MRDsKKyAgICAgIGVsc2UKKyAgICAgICAgIG91dHB1dF9nYW1tYSA9IFBOR19HQU1NQV9NQUNfSU5WRVJTRTsKKyAgIH0KKworICAgcmV0dXJuIG91dHB1dF9nYW1tYTsKK30KKworIyAgaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorc3RhdGljIHBuZ19maXhlZF9wb2ludAorY29udmVydF9nYW1tYV92YWx1ZShwbmdfc3RydWN0cnAgcG5nX3B0ciwgZG91YmxlIG91dHB1dF9nYW1tYSkKK3sKKyAgIC8qIFRoZSBmb2xsb3dpbmcgc2lsZW50bHkgaWdub3JlcyBjYXNlcyB3aGVyZSBmaXhlZCBwb2ludCAodGltZXMgMTAwLDAwMCkKKyAgICAqIGdhbW1hIHZhbHVlcyBhcmUgcGFzc2VkIHRvIHRoZSBmbG9hdGluZyBwb2ludCBBUEkuICBUaGlzIGlzIHNhZmUgYW5kIGl0CisgICAgKiBtZWFucyB0aGUgZml4ZWQgcG9pbnQgY29uc3RhbnRzIHdvcmsganVzdCBmaW5lIHdpdGggdGhlIGZsb2F0aW5nIHBvaW50CisgICAgKiBBUEkuICBUaGUgYWx0ZXJuYXRpdmUgd291bGQganVzdCBsZWFkIHRvIHVuZGV0ZWN0ZWQgZXJyb3JzIGFuZCBzcHVyaW91cworICAgICogYnVnIHJlcG9ydHMuICBOZWdhdGl2ZSB2YWx1ZXMgZmFpbCBpbnNpZGUgdGhlIF9maXhlZCBBUEkgdW5sZXNzIHRoZXkKKyAgICAqIGNvcnJlc3BvbmQgdG8gdGhlIGZsYWcgdmFsdWVzLgorICAgICovCisgICBpZiAob3V0cHV0X2dhbW1hID4gMCAmJiBvdXRwdXRfZ2FtbWEgPCAxMjgpCisgICAgICBvdXRwdXRfZ2FtbWEgKj0gUE5HX0ZQXzE7CisKKyAgIC8qIFRoaXMgcHJlc2VydmVzIC0xIGFuZCAtMiBleGFjdGx5OiAqLworICAgb3V0cHV0X2dhbW1hID0gZmxvb3Iob3V0cHV0X2dhbW1hICsgLjUpOworCisgICBpZiAob3V0cHV0X2dhbW1hID4gUE5HX0ZQX01BWCB8fCBvdXRwdXRfZ2FtbWEgPCBQTkdfRlBfTUlOKQorICAgICAgcG5nX2ZpeGVkX2Vycm9yKHBuZ19wdHIsICJnYW1tYSB2YWx1ZSIpOworCisgICByZXR1cm4gKHBuZ19maXhlZF9wb2ludClvdXRwdXRfZ2FtbWE7Cit9CisjICBlbmRpZgorI2VuZGlmIC8qIFJFQURfQUxQSEFfTU9ERSB8fCBSRUFEX0dBTU1BICovCisKKyNpZmRlZiBQTkdfUkVBRF9BTFBIQV9NT0RFX1NVUFBPUlRFRAordm9pZCBQTkdGQVBJCitwbmdfc2V0X2FscGhhX21vZGVfZml4ZWQocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBtb2RlLAorICAgcG5nX2ZpeGVkX3BvaW50IG91dHB1dF9nYW1tYSkKK3sKKyAgIGludCBjb21wb3NlID0gMDsKKyAgIHBuZ19maXhlZF9wb2ludCBmaWxlX2dhbW1hOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfYWxwaGFfbW9kZSIpOworCisgICBpZiAocG5nX3J0cmFuX29rKHBuZ19wdHIsIDApID09IDApCisgICAgICByZXR1cm47CisKKyAgIG91dHB1dF9nYW1tYSA9IHRyYW5zbGF0ZV9nYW1tYV9mbGFncyhwbmdfcHRyLCBvdXRwdXRfZ2FtbWEsIDEvKnNjcmVlbiovKTsKKworICAgLyogVmFsaWRhdGUgdGhlIHZhbHVlIHRvIGVuc3VyZSBpdCBpcyBpbiBhIHJlYXNvbmFibGUgcmFuZ2UuIFRoZSB2YWx1ZQorICAgICogaXMgZXhwZWN0ZWQgdG8gYmUgMSBvciBncmVhdGVyLCBidXQgdGhpcyByYW5nZSB0ZXN0IGFsbG93cyBmb3Igc29tZQorICAgICogdmlld2luZyBjb3JyZWN0aW9uIHZhbHVlcy4gIFRoZSBpbnRlbnQgaXMgdG8gd2VlZCBvdXQgdXNlcnMgb2YgdGhpcyBBUEkKKyAgICAqIHdobyB1c2UgdGhlIGludmVyc2Ugb2YgdGhlIGdhbW1hIHZhbHVlIGFjY2lkZW50YWxseSEgIFNpbmNlIHNvbWUgb2YgdGhlc2UKKyAgICAqIHZhbHVlcyBhcmUgcmVhc29uYWJsZSB0aGlzIG1heSBoYXZlIHRvIGJlIGNoYW5nZWQuCisgICAgKi8KKyAgIGlmIChvdXRwdXRfZ2FtbWEgPCA3MDAwMCB8fCBvdXRwdXRfZ2FtbWEgPiAzMDAwMDApCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIm91dHB1dCBnYW1tYSBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2UiKTsKKworICAgLyogVGhlIGRlZmF1bHQgZmlsZSBnYW1tYSBpcyB0aGUgaW52ZXJzZSBvZiB0aGUgb3V0cHV0IGdhbW1hOyB0aGUgb3V0cHV0CisgICAgKiBnYW1tYSBtYXkgYmUgY2hhbmdlZCBiZWxvdyBzbyBnZXQgdGhlIGZpbGUgdmFsdWUgZmlyc3Q6CisgICAgKi8KKyAgIGZpbGVfZ2FtbWEgPSBwbmdfcmVjaXByb2NhbChvdXRwdXRfZ2FtbWEpOworCisgICAvKiBUaGVyZSBhcmUgcmVhbGx5IDggcG9zc2liaWxpdGllcyBoZXJlLCBjb21wb3NlZCBvZiBhbnkgY29tYmluYXRpb24KKyAgICAqIG9mOgorICAgICoKKyAgICAqICAgIHByZW11bHRpcGx5IHRoZSBjb2xvciBjaGFubmVscworICAgICogICAgZG8gbm90IGVuY29kZSBub24tb3BhcXVlIHBpeGVscworICAgICogICAgZW5jb2RlIHRoZSBhbHBoYSBhcyB3ZWxsIGFzIHRoZSBjb2xvciBjaGFubmVscworICAgICoKKyAgICAqIFRoZSBkaWZmZXJlbmNlcyBkaXNhcHBlYXIgaWYgdGhlIGlucHV0L291dHB1dCAoJ3NjcmVlbicpIGdhbW1hIGlzIDEuMCwKKyAgICAqIGJlY2F1c2UgdGhlbiB0aGUgZW5jb2RpbmcgaXMgYSBuby1vcCBhbmQgdGhlcmUgaXMgb25seSB0aGUgY2hvaWNlIG9mCisgICAgKiBwcmVtdWx0aXBseWluZyB0aGUgY29sb3IgY2hhbm5lbHMgb3Igbm90LgorICAgICoKKyAgICAqIHBuZ19zZXRfYWxwaGFfbW9kZSBhbmQgcG5nX3NldF9iYWNrZ3JvdW5kIGludGVyYWN0IGJlY2F1c2UgYm90aCB1c2UKKyAgICAqIHBuZ19jb21wb3NlIHRvIGRvIHRoZSB3b3JrLiAgQ2FsbGluZyBib3RoIGlzIG9ubHkgdXNlZnVsIHdoZW4KKyAgICAqIHBuZ19zZXRfYWxwaGFfbW9kZSBpcyB1c2VkIHRvIHNldCB0aGUgZGVmYXVsdCBtb2RlIC0gUE5HX0FMUEhBX1BORyAtIGFsb25nCisgICAgKiB3aXRoIGEgZGVmYXVsdCBnYW1tYSB2YWx1ZS4gIE90aGVyd2lzZSBQTkdfQ09NUE9TRSBtdXN0IG5vdCBiZSBzZXQuCisgICAgKi8KKyAgIHN3aXRjaCAobW9kZSkKKyAgIHsKKyAgICAgIGNhc2UgUE5HX0FMUEhBX1BORzogICAgICAgIC8qIGRlZmF1bHQ6IHBuZyBzdGFuZGFyZCAqLworICAgICAgICAgLyogTm8gY29tcG9zZSwgYnV0IGl0IG1heSBiZSBzZXQgYnkgcG5nX3NldF9iYWNrZ3JvdW5kISAqLworICAgICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICY9IH5QTkdfRU5DT0RFX0FMUEhBOworICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX09QVElNSVpFX0FMUEhBOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUE5HX0FMUEhBX0FTU09DSUFURUQ6IC8qIGNvbG9yIGNoYW5uZWxzIHByZW11bHRpcGxpZWQgKi8KKyAgICAgICAgIGNvbXBvc2UgPSAxOworICAgICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICY9IH5QTkdfRU5DT0RFX0FMUEhBOworICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX09QVElNSVpFX0FMUEhBOworICAgICAgICAgLyogVGhlIG91dHB1dCBpcyBsaW5lYXI6ICovCisgICAgICAgICBvdXRwdXRfZ2FtbWEgPSBQTkdfRlBfMTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBOR19BTFBIQV9PUFRJTUlaRUQ6ICAvKiBhc3NvY2lhdGVkLCBub24tb3BhcXVlIHBpeGVscyBsaW5lYXIgKi8KKyAgICAgICAgIGNvbXBvc2UgPSAxOworICAgICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICY9IH5QTkdfRU5DT0RFX0FMUEhBOworICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfT1BUSU1JWkVfQUxQSEE7CisgICAgICAgICAvKiBvdXRwdXRfZ2FtbWEgcmVjb3JkcyB0aGUgZW5jb2Rpbmcgb2Ygb3BhcXVlIHBpeGVscyEgKi8KKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBOR19BTFBIQV9CUk9LRU46ICAgICAvKiBhc3NvY2lhdGVkLCBub24tbGluZWFyLCBhbHBoYSBlbmNvZGVkICovCisgICAgICAgICBjb21wb3NlID0gMTsKKyAgICAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfRU5DT0RFX0FMUEhBOworICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX09QVElNSVpFX0FMUEhBOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImludmFsaWQgYWxwaGEgbW9kZSIpOworICAgfQorCisgICAvKiBPbmx5IHNldCB0aGUgZGVmYXVsdCBnYW1tYSBpZiB0aGUgZmlsZSBnYW1tYSBoYXMgbm90IGJlZW4gc2V0ICh0aGlzIGhhcworICAgICogdGhlIHNpZGUgZWZmZWN0IHRoYXQgdGhlIGdhbW1hIGluIGEgc2Vjb25kIGNhbGwgdG8gcG5nX3NldF9hbHBoYV9tb2RlIHdpbGwKKyAgICAqIGJlIGlnbm9yZWQuKQorICAgICovCisgICBpZiAocG5nX3B0ci0+Y29sb3JzcGFjZS5nYW1tYSA9PSAwKQorICAgeworICAgICAgcG5nX3B0ci0+Y29sb3JzcGFjZS5nYW1tYSA9IGZpbGVfZ2FtbWE7CisgICAgICBwbmdfcHRyLT5jb2xvcnNwYWNlLmZsYWdzIHw9IFBOR19DT0xPUlNQQUNFX0hBVkVfR0FNTUE7CisgICB9CisKKyAgIC8qIEJ1dCBhbHdheXMgc2V0IHRoZSBvdXRwdXQgZ2FtbWE6ICovCisgICBwbmdfcHRyLT5zY3JlZW5fZ2FtbWEgPSBvdXRwdXRfZ2FtbWE7CisKKyAgIC8qIEZpbmFsbHksIGlmIHByZS1tdWx0aXBseWluZywgc2V0IHRoZSBiYWNrZ3JvdW5kIGZpZWxkcyB0byBhY2hpZXZlIHRoZQorICAgICogZGVzaXJlZCByZXN1bHQuCisgICAgKi8KKyAgIGlmIChjb21wb3NlICE9IDApCisgICB7CisgICAgICAvKiBBbmQgb2J0YWluIGFscGhhIHByZS1tdWx0aXBsaWNhdGlvbiBieSBjb21wb3Npbmcgb24gYmxhY2s6ICovCisgICAgICBtZW1zZXQoJnBuZ19wdHItPmJhY2tncm91bmQsIDAsIChzaXplb2YgcG5nX3B0ci0+YmFja2dyb3VuZCkpOworICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZF9nYW1tYSA9IHBuZ19wdHItPmNvbG9yc3BhY2UuZ2FtbWE7IC8qIGp1c3QgaW4gY2FzZSAqLworICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZF9nYW1tYV90eXBlID0gUE5HX0JBQ0tHUk9VTkRfR0FNTUFfRklMRTsKKyAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmPSB+UE5HX0JBQ0tHUk9VTkRfRVhQQU5EOworCisgICAgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19DT01QT1NFKSAhPSAwKQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsCisgICAgICAgICAgICAiY29uZmxpY3RpbmcgY2FsbHMgdG8gc2V0IGFscGhhIG1vZGUgYW5kIGJhY2tncm91bmQiKTsKKworICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19DT01QT1NFOworICAgfQorfQorCisjICBpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECit2b2lkIFBOR0FQSQorcG5nX3NldF9hbHBoYV9tb2RlKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgbW9kZSwgZG91YmxlIG91dHB1dF9nYW1tYSkKK3sKKyAgIHBuZ19zZXRfYWxwaGFfbW9kZV9maXhlZChwbmdfcHRyLCBtb2RlLCBjb252ZXJ0X2dhbW1hX3ZhbHVlKHBuZ19wdHIsCisgICAgICBvdXRwdXRfZ2FtbWEpKTsKK30KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX1FVQU5USVpFX1NVUFBPUlRFRAorLyogRGl0aGVyIGZpbGUgdG8gOC1iaXQuICBTdXBwbHkgYSBwYWxldHRlLCB0aGUgY3VycmVudCBudW1iZXIKKyAqIG9mIGVsZW1lbnRzIGluIHRoZSBwYWxldHRlLCB0aGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMKKyAqIGFsbG93ZWQsIGFuZCBhIGhpc3RvZ3JhbSBpZiBwb3NzaWJsZS4gIElmIHRoZSBjdXJyZW50IG51bWJlcgorICogb2YgY29sb3JzIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSBudW1iZXIsIHRoZSBwYWxldHRlIHdpbGwgYmUKKyAqIG1vZGlmaWVkIHRvIGZpdCBpbiB0aGUgbWF4aW11bSBudW1iZXIuICAiZnVsbF9xdWFudGl6ZSIgaW5kaWNhdGVzCisgKiB3aGV0aGVyIHdlIG5lZWQgYSBxdWFudGl6aW5nIGN1YmUgc2V0IHVwIGZvciBSR0IgaW1hZ2VzLCBvciBpZiB3ZQorICogc2ltcGx5IGFyZSByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIGNvbG9ycyBpbiBhIHBhbGV0dGVkIGltYWdlLgorICovCisKK3R5cGVkZWYgc3RydWN0IHBuZ19kc29ydF9zdHJ1Y3QKK3sKKyAgIHN0cnVjdCBwbmdfZHNvcnRfc3RydWN0ICogbmV4dDsKKyAgIHBuZ19ieXRlIGxlZnQ7CisgICBwbmdfYnl0ZSByaWdodDsKK30gcG5nX2Rzb3J0OwordHlwZWRlZiBwbmdfZHNvcnQgKiAgIHBuZ19kc29ydHA7Cit0eXBlZGVmIHBuZ19kc29ydCAqICogcG5nX2Rzb3J0cHA7CisKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3F1YW50aXplKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29sb3JwIHBhbGV0dGUsCisgICAgaW50IG51bV9wYWxldHRlLCBpbnQgbWF4aW11bV9jb2xvcnMsIHBuZ19jb25zdF91aW50XzE2cCBoaXN0b2dyYW0sCisgICAgaW50IGZ1bGxfcXVhbnRpemUpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfcXVhbnRpemUiKTsKKworICAgaWYgKHBuZ19ydHJhbl9vayhwbmdfcHRyLCAwKSA9PSAwKQorICAgICAgcmV0dXJuOworCisgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX1FVQU5USVpFOworCisgICBpZiAoZnVsbF9xdWFudGl6ZSA9PSAwKQorICAgeworICAgICAgaW50IGk7CisKKyAgICAgIHBuZ19wdHItPnF1YW50aXplX2luZGV4ID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCisgICAgICAgICAgKHBuZ191aW50XzMyKShudW1fcGFsZXR0ZSAqIChzaXplb2YgKHBuZ19ieXRlKSkpKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFsZXR0ZTsgaSsrKQorICAgICAgICAgcG5nX3B0ci0+cXVhbnRpemVfaW5kZXhbaV0gPSAocG5nX2J5dGUpaTsKKyAgIH0KKworICAgaWYgKG51bV9wYWxldHRlID4gbWF4aW11bV9jb2xvcnMpCisgICB7CisgICAgICBpZiAoaGlzdG9ncmFtICE9IE5VTEwpCisgICAgICB7CisgICAgICAgICAvKiBUaGlzIGlzIGVhc3kgZW5vdWdoLCBqdXN0IHRocm93IG91dCB0aGUgbGVhc3QgdXNlZCBjb2xvcnMuCisgICAgICAgICAgKiBQZXJoYXBzIG5vdCB0aGUgYmVzdCBzb2x1dGlvbiwgYnV0IGdvb2QgZW5vdWdoLgorICAgICAgICAgICovCisKKyAgICAgICAgIGludCBpOworCisgICAgICAgICAvKiBJbml0aWFsaXplIGFuIGFycmF5IHRvIHNvcnQgY29sb3JzICovCisgICAgICAgICBwbmdfcHRyLT5xdWFudGl6ZV9zb3J0ID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCisgICAgICAgICAgICAgKHBuZ191aW50XzMyKShudW1fcGFsZXR0ZSAqIChzaXplb2YgKHBuZ19ieXRlKSkpKTsKKworICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgcXVhbnRpemVfc29ydCBhcnJheSAqLworICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9wYWxldHRlOyBpKyspCisgICAgICAgICAgICBwbmdfcHRyLT5xdWFudGl6ZV9zb3J0W2ldID0gKHBuZ19ieXRlKWk7CisKKyAgICAgICAgIC8qIEZpbmQgdGhlIGxlYXN0IHVzZWQgcGFsZXR0ZSBlbnRyaWVzIGJ5IHN0YXJ0aW5nIGEKKyAgICAgICAgICAqIGJ1YmJsZSBzb3J0LCBhbmQgcnVubmluZyBpdCB1bnRpbCB3ZSBoYXZlIHNvcnRlZAorICAgICAgICAgICogb3V0IGVub3VnaCBjb2xvcnMuICBOb3RlIHRoYXQgd2UgZG9uJ3QgY2FyZSBhYm91dAorICAgICAgICAgICogc29ydGluZyBhbGwgdGhlIGNvbG9ycywganVzdCBmaW5kaW5nIHdoaWNoIGFyZQorICAgICAgICAgICogbGVhc3QgdXNlZC4KKyAgICAgICAgICAqLworCisgICAgICAgICBmb3IgKGkgPSBudW1fcGFsZXR0ZSAtIDE7IGkgPj0gbWF4aW11bV9jb2xvcnM7IGktLSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGludCBkb25lOyAvKiBUbyBzdG9wIGVhcmx5IGlmIHRoZSBsaXN0IGlzIHByZS1zb3J0ZWQgKi8KKyAgICAgICAgICAgIGludCBqOworCisgICAgICAgICAgICBkb25lID0gMTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZiAoaGlzdG9ncmFtW3BuZ19wdHItPnF1YW50aXplX3NvcnRbal1dCisgICAgICAgICAgICAgICAgICAgPCBoaXN0b2dyYW1bcG5nX3B0ci0+cXVhbnRpemVfc29ydFtqICsgMV1dKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcG5nX2J5dGUgdDsKKworICAgICAgICAgICAgICAgICAgdCA9IHBuZ19wdHItPnF1YW50aXplX3NvcnRbal07CisgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5xdWFudGl6ZV9zb3J0W2pdID0gcG5nX3B0ci0+cXVhbnRpemVfc29ydFtqICsgMV07CisgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5xdWFudGl6ZV9zb3J0W2ogKyAxXSA9IHQ7CisgICAgICAgICAgICAgICAgICBkb25lID0gMDsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRvbmUgIT0gMCkKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICAvKiBTd2FwIHRoZSBwYWxldHRlIGFyb3VuZCwgYW5kIHNldCB1cCBhIHRhYmxlLCBpZiBuZWNlc3NhcnkgKi8KKyAgICAgICAgIGlmIChmdWxsX3F1YW50aXplICE9IDApCisgICAgICAgICB7CisgICAgICAgICAgICBpbnQgaiA9IG51bV9wYWxldHRlOworCisgICAgICAgICAgICAvKiBQdXQgYWxsIHRoZSB1c2VmdWwgY29sb3JzIHdpdGhpbiB0aGUgbWF4LCBidXQgZG9uJ3QKKyAgICAgICAgICAgICAqIG1vdmUgdGhlIG90aGVycy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1heGltdW1fY29sb3JzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZiAoKGludClwbmdfcHRyLT5xdWFudGl6ZV9zb3J0W2ldID49IG1heGltdW1fY29sb3JzKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICAgICAgIGotLTsKKyAgICAgICAgICAgICAgICAgIHdoaWxlICgoaW50KXBuZ19wdHItPnF1YW50aXplX3NvcnRbal0gPj0gbWF4aW11bV9jb2xvcnMpOworCisgICAgICAgICAgICAgICAgICBwYWxldHRlW2ldID0gcGFsZXR0ZVtqXTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGludCBqID0gbnVtX3BhbGV0dGU7CisKKyAgICAgICAgICAgIC8qIE1vdmUgYWxsIHRoZSB1c2VkIGNvbG9ycyBpbnNpZGUgdGhlIG1heCBsaW1pdCwgYW5kCisgICAgICAgICAgICAgKiBkZXZlbG9wIGEgdHJhbnNsYXRpb24gdGFibGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtYXhpbXVtX2NvbG9yczsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLyogT25seSBtb3ZlIHRoZSBjb2xvcnMgd2UgbmVlZCB0byAqLworICAgICAgICAgICAgICAgaWYgKChpbnQpcG5nX3B0ci0+cXVhbnRpemVfc29ydFtpXSA+PSBtYXhpbXVtX2NvbG9ycykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBuZ19jb2xvciB0bXBfY29sb3I7CisKKyAgICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgICAgICBqLS07CisgICAgICAgICAgICAgICAgICB3aGlsZSAoKGludClwbmdfcHRyLT5xdWFudGl6ZV9zb3J0W2pdID49IG1heGltdW1fY29sb3JzKTsKKworICAgICAgICAgICAgICAgICAgdG1wX2NvbG9yID0gcGFsZXR0ZVtqXTsKKyAgICAgICAgICAgICAgICAgIHBhbGV0dGVbal0gPSBwYWxldHRlW2ldOworICAgICAgICAgICAgICAgICAgcGFsZXR0ZVtpXSA9IHRtcF9jb2xvcjsKKyAgICAgICAgICAgICAgICAgIC8qIEluZGljYXRlIHdoZXJlIHRoZSBjb2xvciB3ZW50ICovCisgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5xdWFudGl6ZV9pbmRleFtqXSA9IChwbmdfYnl0ZSlpOworICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+cXVhbnRpemVfaW5kZXhbaV0gPSAocG5nX2J5dGUpajsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogRmluZCBjbG9zZXN0IGNvbG9yIGZvciB0aG9zZSBjb2xvcnMgd2UgYXJlIG5vdCB1c2luZyAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9wYWxldHRlOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZiAoKGludClwbmdfcHRyLT5xdWFudGl6ZV9pbmRleFtpXSA+PSBtYXhpbXVtX2NvbG9ycykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGludCBtaW5fZCwgaywgbWluX2ssIGRfaW5kZXg7CisKKyAgICAgICAgICAgICAgICAgIC8qIEZpbmQgdGhlIGNsb3Nlc3QgY29sb3IgdG8gb25lIHdlIHRocmV3IG91dCAqLworICAgICAgICAgICAgICAgICAgZF9pbmRleCA9IHBuZ19wdHItPnF1YW50aXplX2luZGV4W2ldOworICAgICAgICAgICAgICAgICAgbWluX2QgPSBQTkdfQ09MT1JfRElTVChwYWxldHRlW2RfaW5kZXhdLCBwYWxldHRlWzBdKTsKKyAgICAgICAgICAgICAgICAgIGZvciAoayA9IDEsIG1pbl9rID0gMDsgayA8IG1heGltdW1fY29sb3JzOyBrKyspCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBpbnQgZDsKKworICAgICAgICAgICAgICAgICAgICAgZCA9IFBOR19DT0xPUl9ESVNUKHBhbGV0dGVbZF9pbmRleF0sIHBhbGV0dGVba10pOworCisgICAgICAgICAgICAgICAgICAgICBpZiAoZCA8IG1pbl9kKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluX2QgPSBkOworICAgICAgICAgICAgICAgICAgICAgICAgbWluX2sgPSBrOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgLyogUG9pbnQgdG8gY2xvc2VzdCBjb2xvciAqLworICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+cXVhbnRpemVfaW5kZXhbaV0gPSAocG5nX2J5dGUpbWluX2s7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5xdWFudGl6ZV9zb3J0KTsKKyAgICAgICAgIHBuZ19wdHItPnF1YW50aXplX3NvcnQgPSBOVUxMOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgLyogVGhpcyBpcyBtdWNoIGhhcmRlciB0byBkbyBzaW1wbHkgKGFuZCBxdWlja2x5KS4gIFBlcmhhcHMKKyAgICAgICAgICAqIHdlIG5lZWQgdG8gZ28gdGhyb3VnaCBhIG1lZGlhbiBjdXQgcm91dGluZSwgYnV0IHRob3NlCisgICAgICAgICAgKiBkb24ndCBhbHdheXMgYmVoYXZlIHRoZW1zZWx2ZXMgd2l0aCBvbmx5IGEgZmV3IGNvbG9ycworICAgICAgICAgICogYXMgaW5wdXQuICBTbyB3ZSB3aWxsIGp1c3QgZmluZCB0aGUgY2xvc2VzdCB0d28gY29sb3JzLAorICAgICAgICAgICogYW5kIHRocm93IG91dCBvbmUgb2YgdGhlbSAoY2hvc2VuIHNvbWV3aGF0IHJhbmRvbWx5KS4KKyAgICAgICAgICAqIFtXZSBkb24ndCB1bmRlcnN0YW5kIHRoaXMgYXQgYWxsLCBzbyBpZiBzb21lb25lIHdhbnRzIHRvCisgICAgICAgICAgKiAgd29yayBvbiBpbXByb3ZpbmcgaXQsIGJlIG91ciBndWVzdCAtIEFFRCwgR1JQXQorICAgICAgICAgICovCisgICAgICAgICBpbnQgaTsKKyAgICAgICAgIGludCBtYXhfZDsKKyAgICAgICAgIGludCBudW1fbmV3X3BhbGV0dGU7CisgICAgICAgICBwbmdfZHNvcnRwIHQ7CisgICAgICAgICBwbmdfZHNvcnRwcCBoYXNoOworCisgICAgICAgICB0ID0gTlVMTDsKKworICAgICAgICAgLyogSW5pdGlhbGl6ZSBwYWxldHRlIGluZGV4IGFycmF5cyAqLworICAgICAgICAgcG5nX3B0ci0+aW5kZXhfdG9fcGFsZXR0ZSA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLAorICAgICAgICAgICAgIChwbmdfdWludF8zMikobnVtX3BhbGV0dGUgKiAoc2l6ZW9mIChwbmdfYnl0ZSkpKSk7CisgICAgICAgICBwbmdfcHRyLT5wYWxldHRlX3RvX2luZGV4ID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCisgICAgICAgICAgICAgKHBuZ191aW50XzMyKShudW1fcGFsZXR0ZSAqIChzaXplb2YgKHBuZ19ieXRlKSkpKTsKKworICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgc29ydCBhcnJheSAqLworICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9wYWxldHRlOyBpKyspCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfcHRyLT5pbmRleF90b19wYWxldHRlW2ldID0gKHBuZ19ieXRlKWk7CisgICAgICAgICAgICBwbmdfcHRyLT5wYWxldHRlX3RvX2luZGV4W2ldID0gKHBuZ19ieXRlKWk7CisgICAgICAgICB9CisKKyAgICAgICAgIGhhc2ggPSAocG5nX2Rzb3J0cHApcG5nX2NhbGxvYyhwbmdfcHRyLCAocG5nX3VpbnRfMzIpKDc2OSAqCisgICAgICAgICAgICAgKHNpemVvZiAocG5nX2Rzb3J0cCkpKSk7CisKKyAgICAgICAgIG51bV9uZXdfcGFsZXR0ZSA9IG51bV9wYWxldHRlOworCisgICAgICAgICAvKiBJbml0aWFsIHdpbGQgZ3Vlc3MgYXQgaG93IGZhciBhcGFydCB0aGUgZmFydGhlc3QgcGl4ZWwKKyAgICAgICAgICAqIHBhaXIgd2Ugd2lsbCBiZSBlbGltaW5hdGluZyB3aWxsIGJlLiAgTGFyZ2VyCisgICAgICAgICAgKiBudW1iZXJzIG1lYW4gbW9yZSBhcmVhcyB3aWxsIGJlIGFsbG9jYXRlZCwgU21hbGxlcgorICAgICAgICAgICogbnVtYmVycyBydW4gdGhlIHJpc2sgb2Ygbm90IHNhdmluZyBlbm91Z2ggZGF0YSwgYW5kCisgICAgICAgICAgKiBoYXZpbmcgdG8gZG8gdGhpcyBhbGwgb3ZlciBhZ2Fpbi4KKyAgICAgICAgICAqCisgICAgICAgICAgKiBJIGhhdmUgbm90IGRvbmUgZXh0ZW5zaXZlIGNoZWNraW5nIG9uIHRoaXMgbnVtYmVyLgorICAgICAgICAgICovCisgICAgICAgICBtYXhfZCA9IDk2OworCisgICAgICAgICB3aGlsZSAobnVtX25ld19wYWxldHRlID4gbWF4aW11bV9jb2xvcnMpCisgICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX25ld19wYWxldHRlIC0gMTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaW50IGo7CisKKyAgICAgICAgICAgICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgbnVtX25ld19wYWxldHRlOyBqKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpbnQgZDsKKworICAgICAgICAgICAgICAgICAgZCA9IFBOR19DT0xPUl9ESVNUKHBhbGV0dGVbaV0sIHBhbGV0dGVbal0pOworCisgICAgICAgICAgICAgICAgICBpZiAoZCA8PSBtYXhfZCkKKyAgICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAgdCA9IChwbmdfZHNvcnRwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIChwbmdfdWludF8zMikoc2l6ZW9mIChwbmdfZHNvcnQpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgIGlmICh0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgIHQtPm5leHQgPSBoYXNoW2RdOworICAgICAgICAgICAgICAgICAgICAgdC0+bGVmdCA9IChwbmdfYnl0ZSlpOworICAgICAgICAgICAgICAgICAgICAgdC0+cmlnaHQgPSAocG5nX2J5dGUpajsKKyAgICAgICAgICAgICAgICAgICAgIGhhc2hbZF0gPSB0OworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgaWYgKHQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodCAhPSBOVUxMKQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSBtYXhfZDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKGhhc2hbaV0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBuZ19kc29ydHAgcDsKKworICAgICAgICAgICAgICAgICAgZm9yIChwID0gaGFzaFtpXTsgcDsgcCA9IHAtPm5leHQpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBpZiAoKGludClwbmdfcHRyLT5pbmRleF90b19wYWxldHRlW3AtPmxlZnRdCisgICAgICAgICAgICAgICAgICAgICAgICAgPCBudW1fbmV3X3BhbGV0dGUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXBuZ19wdHItPmluZGV4X3RvX3BhbGV0dGVbcC0+cmlnaHRdCisgICAgICAgICAgICAgICAgICAgICAgICAgPCBudW1fbmV3X3BhbGV0dGUpCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaiwgbmV4dF9qOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtX25ld19wYWxldHRlICYgMHgwMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSBwLT5sZWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9qID0gcC0+cmlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBqID0gcC0+cmlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2ogPSBwLT5sZWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBudW1fbmV3X3BhbGV0dGUtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGVbcG5nX3B0ci0+aW5kZXhfdG9fcGFsZXR0ZVtqXV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHBhbGV0dGVbbnVtX25ld19wYWxldHRlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdWxsX3F1YW50aXplID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IG51bV9wYWxldHRlOyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG5nX3B0ci0+cXVhbnRpemVfaW5kZXhba10gPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5pbmRleF90b19wYWxldHRlW2pdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+cXVhbnRpemVfaW5kZXhba10gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmluZGV4X3RvX3BhbGV0dGVbbmV4dF9qXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpbnQpcG5nX3B0ci0+cXVhbnRpemVfaW5kZXhba10gPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fbmV3X3BhbGV0dGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5xdWFudGl6ZV9pbmRleFtrXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+aW5kZXhfdG9fcGFsZXR0ZVtqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+aW5kZXhfdG9fcGFsZXR0ZVtwbmdfcHRyLT5wYWxldHRlX3RvX2luZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW251bV9uZXdfcGFsZXR0ZV1dID0gcG5nX3B0ci0+aW5kZXhfdG9fcGFsZXR0ZVtqXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZV90b19pbmRleFtwbmdfcHRyLT5pbmRleF90b19wYWxldHRlW2pdXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcG5nX3B0ci0+cGFsZXR0ZV90b19pbmRleFtudW1fbmV3X3BhbGV0dGVdOworCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5pbmRleF90b19wYWxldHRlW2pdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG5nX2J5dGUpbnVtX25ld19wYWxldHRlOworCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5wYWxldHRlX3RvX2luZGV4W251bV9uZXdfcGFsZXR0ZV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwbmdfYnl0ZSlqOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgaWYgKG51bV9uZXdfcGFsZXR0ZSA8PSBtYXhpbXVtX2NvbG9ycykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgaWYgKG51bV9uZXdfcGFsZXR0ZSA8PSBtYXhpbXVtX2NvbG9ycykKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzY5OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZiAoaGFzaFtpXSAhPSBOVUxMKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcG5nX2Rzb3J0cCBwID0gaGFzaFtpXTsKKyAgICAgICAgICAgICAgICAgIHdoaWxlIChwKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgdCA9IHAtPm5leHQ7CisgICAgICAgICAgICAgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwKTsKKyAgICAgICAgICAgICAgICAgICAgIHAgPSB0OworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgaGFzaFtpXSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXhfZCArPSA5NjsKKyAgICAgICAgIH0KKyAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGhhc2gpOworICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+cGFsZXR0ZV90b19pbmRleCk7CisgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5pbmRleF90b19wYWxldHRlKTsKKyAgICAgICAgIHBuZ19wdHItPnBhbGV0dGVfdG9faW5kZXggPSBOVUxMOworICAgICAgICAgcG5nX3B0ci0+aW5kZXhfdG9fcGFsZXR0ZSA9IE5VTEw7CisgICAgICB9CisgICAgICBudW1fcGFsZXR0ZSA9IG1heGltdW1fY29sb3JzOworICAgfQorICAgaWYgKHBuZ19wdHItPnBhbGV0dGUgPT0gTlVMTCkKKyAgIHsKKyAgICAgIHBuZ19wdHItPnBhbGV0dGUgPSBwYWxldHRlOworICAgfQorICAgcG5nX3B0ci0+bnVtX3BhbGV0dGUgPSAocG5nX3VpbnRfMTYpbnVtX3BhbGV0dGU7CisKKyAgIGlmIChmdWxsX3F1YW50aXplICE9IDApCisgICB7CisgICAgICBpbnQgaTsKKyAgICAgIHBuZ19ieXRlcCBkaXN0YW5jZTsKKyAgICAgIGludCB0b3RhbF9iaXRzID0gUE5HX1FVQU5USVpFX1JFRF9CSVRTICsgUE5HX1FVQU5USVpFX0dSRUVOX0JJVFMgKworICAgICAgICAgIFBOR19RVUFOVElaRV9CTFVFX0JJVFM7CisgICAgICBpbnQgbnVtX3JlZCA9ICgxIDw8IFBOR19RVUFOVElaRV9SRURfQklUUyk7CisgICAgICBpbnQgbnVtX2dyZWVuID0gKDEgPDwgUE5HX1FVQU5USVpFX0dSRUVOX0JJVFMpOworICAgICAgaW50IG51bV9ibHVlID0gKDEgPDwgUE5HX1FVQU5USVpFX0JMVUVfQklUUyk7CisgICAgICBwbmdfc2l6ZV90IG51bV9lbnRyaWVzID0gKChwbmdfc2l6ZV90KTEgPDwgdG90YWxfYml0cyk7CisKKyAgICAgIHBuZ19wdHItPnBhbGV0dGVfbG9va3VwID0gKHBuZ19ieXRlcClwbmdfY2FsbG9jKHBuZ19wdHIsCisgICAgICAgICAgKHBuZ191aW50XzMyKShudW1fZW50cmllcyAqIChzaXplb2YgKHBuZ19ieXRlKSkpKTsKKworICAgICAgZGlzdGFuY2UgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwgKHBuZ191aW50XzMyKShudW1fZW50cmllcyAqCisgICAgICAgICAgKHNpemVvZiAocG5nX2J5dGUpKSkpOworCisgICAgICBtZW1zZXQoZGlzdGFuY2UsIDB4ZmYsIG51bV9lbnRyaWVzICogKHNpemVvZiAocG5nX2J5dGUpKSk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFsZXR0ZTsgaSsrKQorICAgICAgeworICAgICAgICAgaW50IGlyLCBpZywgaWI7CisgICAgICAgICBpbnQgciA9IChwYWxldHRlW2ldLnJlZCA+PiAoOCAtIFBOR19RVUFOVElaRV9SRURfQklUUykpOworICAgICAgICAgaW50IGcgPSAocGFsZXR0ZVtpXS5ncmVlbiA+PiAoOCAtIFBOR19RVUFOVElaRV9HUkVFTl9CSVRTKSk7CisgICAgICAgICBpbnQgYiA9IChwYWxldHRlW2ldLmJsdWUgPj4gKDggLSBQTkdfUVVBTlRJWkVfQkxVRV9CSVRTKSk7CisKKyAgICAgICAgIGZvciAoaXIgPSAwOyBpciA8IG51bV9yZWQ7IGlyKyspCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBpbnQgZHIgPSBhYnMoaXIgLSByKTsgKi8KKyAgICAgICAgICAgIGludCBkciA9ICgoaXIgPiByKSA/IGlyIC0gciA6IHIgLSBpcik7CisgICAgICAgICAgICBpbnQgaW5kZXhfciA9IChpciA8PCAoUE5HX1FVQU5USVpFX0JMVUVfQklUUyArCisgICAgICAgICAgICAgICAgUE5HX1FVQU5USVpFX0dSRUVOX0JJVFMpKTsKKworICAgICAgICAgICAgZm9yIChpZyA9IDA7IGlnIDwgbnVtX2dyZWVuOyBpZysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLyogaW50IGRnID0gYWJzKGlnIC0gZyk7ICovCisgICAgICAgICAgICAgICBpbnQgZGcgPSAoKGlnID4gZykgPyBpZyAtIGcgOiBnIC0gaWcpOworICAgICAgICAgICAgICAgaW50IGR0ID0gZHIgKyBkZzsKKyAgICAgICAgICAgICAgIGludCBkbSA9ICgoZHIgPiBkZykgPyBkciA6IGRnKTsKKyAgICAgICAgICAgICAgIGludCBpbmRleF9nID0gaW5kZXhfciB8IChpZyA8PCBQTkdfUVVBTlRJWkVfQkxVRV9CSVRTKTsKKworICAgICAgICAgICAgICAgZm9yIChpYiA9IDA7IGliIDwgbnVtX2JsdWU7IGliKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpbnQgZF9pbmRleCA9IGluZGV4X2cgfCBpYjsKKyAgICAgICAgICAgICAgICAgIC8qIGludCBkYiA9IGFicyhpYiAtIGIpOyAqLworICAgICAgICAgICAgICAgICAgaW50IGRiID0gKChpYiA+IGIpID8gaWIgLSBiIDogYiAtIGliKTsKKyAgICAgICAgICAgICAgICAgIGludCBkbWF4ID0gKChkbSA+IGRiKSA/IGRtIDogZGIpOworICAgICAgICAgICAgICAgICAgaW50IGQgPSBkbWF4ICsgZHQgKyBkYjsKKworICAgICAgICAgICAgICAgICAgaWYgKGQgPCAoaW50KWRpc3RhbmNlW2RfaW5kZXhdKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2VbZF9pbmRleF0gPSAocG5nX2J5dGUpZDsKKyAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnBhbGV0dGVfbG9va3VwW2RfaW5kZXhdID0gKHBuZ19ieXRlKWk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGRpc3RhbmNlKTsKKyAgIH0KK30KKyNlbmRpZiAvKiBSRUFEX1FVQU5USVpFICovCisKKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKK3ZvaWQgUE5HRkFQSQorcG5nX3NldF9nYW1tYV9maXhlZChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2ZpeGVkX3BvaW50IHNjcm5fZ2FtbWEsCisgICBwbmdfZml4ZWRfcG9pbnQgZmlsZV9nYW1tYSkKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9nYW1tYV9maXhlZCIpOworCisgICBpZiAocG5nX3J0cmFuX29rKHBuZ19wdHIsIDApID09IDApCisgICAgICByZXR1cm47CisKKyAgIC8qIE5ldyBpbiBsaWJwbmctMS41LjQgLSByZXNlcnZlIHBhcnRpY3VsYXIgbmVnYXRpdmUgdmFsdWVzIGFzIGZsYWdzLiAqLworICAgc2Nybl9nYW1tYSA9IHRyYW5zbGF0ZV9nYW1tYV9mbGFncyhwbmdfcHRyLCBzY3JuX2dhbW1hLCAxLypzY3JlZW4qLyk7CisgICBmaWxlX2dhbW1hID0gdHJhbnNsYXRlX2dhbW1hX2ZsYWdzKHBuZ19wdHIsIGZpbGVfZ2FtbWEsIDAvKmZpbGUqLyk7CisKKyAgIC8qIENoZWNraW5nIHRoZSBnYW1tYSB2YWx1ZXMgZm9yIGJlaW5nID4wIHdhcyBhZGRlZCBpbiAxLjUuNCBhbG9uZyB3aXRoIHRoZQorICAgICogcHJlbXVsdGlwbGllZCBhbHBoYSBzdXBwb3J0OyB0aGlzIGFjdHVhbGx5IGhpZGVzIGFuIHVuZG9jdW1lbnRlZCBmZWF0dXJlCisgICAgKiBvZiB0aGUgcHJldmlvdXMgaW1wbGVtZW50YXRpb24gd2hpY2ggYWxsb3dlZCBnYW1tYSBwcm9jZXNzaW5nIHRvIGJlCisgICAgKiBkaXNhYmxlZCBpbiBiYWNrZ3JvdW5kIGhhbmRsaW5nLiAgVGhlcmUgaXMgbm8gZXZpZGVuY2UgKHNvIGZhcikgdGhhdCB0aGlzCisgICAgKiB3YXMgYmVpbmcgdXNlZDsgaG93ZXZlciwgcG5nX3NldF9iYWNrZ3JvdW5kIGl0c2VsZiBhY2NlcHRlZCBhbmQgbXVzdCBzdGlsbAorICAgICogYWNjZXB0ICcwJyBmb3IgdGhlIGdhbW1hIHZhbHVlIGl0IHRha2VzLCBiZWNhdXNlIGl0IGlzbid0IGFsd2F5cyB1c2VkLgorICAgICoKKyAgICAqIFNpbmNlIHRoaXMgaXMgYW4gQVBJIGNoYW5nZSAoYWxiZWl0IGEgdmVyeSBtaW5vciBvbmUgdGhhdCByZW1vdmVzIGFuCisgICAgKiB1bmRvY3VtZW50ZWQgQVBJIGZlYXR1cmUpIHRoZSBmb2xsb3dpbmcgY2hlY2tzIHdlcmUgb25seSBlbmFibGVkIGluCisgICAgKiBsaWJwbmctMS42LjAuCisgICAgKi8KKyAgIGlmIChmaWxlX2dhbW1hIDw9IDApCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImludmFsaWQgZmlsZSBnYW1tYSBpbiBwbmdfc2V0X2dhbW1hIik7CisKKyAgIGlmIChzY3JuX2dhbW1hIDw9IDApCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImludmFsaWQgc2NyZWVuIGdhbW1hIGluIHBuZ19zZXRfZ2FtbWEiKTsKKworICAgLyogU2V0IHRoZSBnYW1tYSB2YWx1ZXMgdW5jb25kaXRpb25hbGx5IC0gdGhpcyBvdmVycmlkZXMgdGhlIHZhbHVlIGluIHRoZSBQTkcKKyAgICAqIGZpbGUgaWYgYSBnQU1BIGNodW5rIHdhcyBwcmVzZW50LiAgcG5nX3NldF9hbHBoYV9tb2RlIHByb3ZpZGVzIGEKKyAgICAqIGRpZmZlcmVudCwgZWFzaWVyLCB3YXkgdG8gZGVmYXVsdCB0aGUgZmlsZSBnYW1tYS4KKyAgICAqLworICAgcG5nX3B0ci0+Y29sb3JzcGFjZS5nYW1tYSA9IGZpbGVfZ2FtbWE7CisgICBwbmdfcHRyLT5jb2xvcnNwYWNlLmZsYWdzIHw9IFBOR19DT0xPUlNQQUNFX0hBVkVfR0FNTUE7CisgICBwbmdfcHRyLT5zY3JlZW5fZ2FtbWEgPSBzY3JuX2dhbW1hOworfQorCisjICBpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECit2b2lkIFBOR0FQSQorcG5nX3NldF9nYW1tYShwbmdfc3RydWN0cnAgcG5nX3B0ciwgZG91YmxlIHNjcm5fZ2FtbWEsIGRvdWJsZSBmaWxlX2dhbW1hKQoreworICAgcG5nX3NldF9nYW1tYV9maXhlZChwbmdfcHRyLCBjb252ZXJ0X2dhbW1hX3ZhbHVlKHBuZ19wdHIsIHNjcm5fZ2FtbWEpLAorICAgICAgY29udmVydF9nYW1tYV92YWx1ZShwbmdfcHRyLCBmaWxlX2dhbW1hKSk7Cit9CisjICBlbmRpZiAvKiBGTE9BVElOR19QT0lOVCAqLworI2VuZGlmIC8qIFJFQURfR0FNTUEgKi8KKworI2lmZGVmIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQKKy8qIEV4cGFuZCBwYWxldHRlZCBpbWFnZXMgdG8gUkdCLCBleHBhbmQgZ3JheXNjYWxlIGltYWdlcyBvZgorICogbGVzcyB0aGFuIDgtYml0IGRlcHRoIHRvIDgtYml0IGRlcHRoLCBhbmQgZXhwYW5kIHRSTlMgY2h1bmtzCisgKiB0byBhbHBoYSBjaGFubmVscy4KKyAqLwordm9pZCBQTkdBUEkKK3BuZ19zZXRfZXhwYW5kKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2V4cGFuZCIpOworCisgICBpZiAocG5nX3J0cmFuX29rKHBuZ19wdHIsIDApID09IDApCisgICAgICByZXR1cm47CisKKyAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSAoUE5HX0VYUEFORCB8IFBOR19FWFBBTkRfdFJOUyk7Cit9CisKKy8qIEdSUiAxOTk5MDYyNzogIHRoZSBmb2xsb3dpbmcgdGhyZWUgZnVuY3Rpb25zIGN1cnJlbnRseSBhcmUgaWRlbnRpY2FsCisgKiAgdG8gcG5nX3NldF9leHBhbmQoKS4gIEhvd2V2ZXIsIGl0IGlzIGVudGlyZWx5IHJlYXNvbmFibGUgdGhhdCBzb21lb25lCisgKiAgbWlnaHQgd2lzaCB0byBleHBhbmQgYW4gaW5kZXhlZCBpbWFnZSB0byBSR0IgYnV0ICpub3QqIGV4cGFuZCBhIHNpbmdsZSwKKyAqICBmdWxseSB0cmFuc3BhcmVudCBwYWxldHRlIGVudHJ5IHRvIGEgZnVsbCBhbHBoYSBjaGFubmVsLS1wZXJoYXBzIGluc3RlYWQKKyAqICBjb252ZXJ0IHRSTlMgdG8gdGhlIGdyYXlzY2FsZS9SR0IgZm9ybWF0ICgxNi1iaXQgUkdCIHZhbHVlKSwgb3IgcmVwbGFjZQorICogIHRoZSB0cmFuc3BhcmVudCBjb2xvciB3aXRoIGEgcGFydGljdWxhciBSR0IgdmFsdWUsIG9yIGRyb3AgdFJOUyBlbnRpcmVseS4KKyAqICBJT1csIGEgZnV0dXJlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgbWF5IG1ha2UgdGhlIHRyYW5zZm9ybWF0aW9ucyBmbGFnCisgKiAgYSBiaXQgbW9yZSBmaW5lLWdyYWluZWQsIHdpdGggc2VwYXJhdGUgYml0cyBmb3IgZWFjaCBvZiB0aGVzZSB0aHJlZQorICogIGZ1bmN0aW9ucy4KKyAqCisgKiAgTW9yZSB0byB0aGUgcG9pbnQsIHRoZXNlIGZ1bmN0aW9ucyBtYWtlIGl0IG9idmlvdXMgd2hhdCBsaWJwbmcgd2lsbCBiZQorICogIGRvaW5nLCB3aGVyZWFzICJleHBhbmQiIGNhbiAoYW5kIGRvZXMpIG1lYW4gYW55IG51bWJlciBvZiB0aGluZ3MuCisgKgorICogIEdSUCAyMDA2MDMwNzogSW4gbGlicG5nLTEuMi45LCBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCgpIHdhcyBtb2RpZmllZAorICogIHRvIGV4cGFuZCBvbmx5IHRoZSBzYW1wbGUgZGVwdGggYnV0IG5vdCB0byBleHBhbmQgdGhlIHRSTlMgdG8gYWxwaGEKKyAqICBhbmQgaXRzIG5hbWUgd2FzIGNoYW5nZWQgdG8gcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KCkuCisgKi8KKworLyogRXhwYW5kIHBhbGV0dGVkIGltYWdlcyB0byBSR0IuICovCit2b2lkIFBOR0FQSQorcG5nX3NldF9wYWxldHRlX3RvX3JnYihwbmdfc3RydWN0cnAgcG5nX3B0cikKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9wYWxldHRlX3RvX3JnYiIpOworCisgICBpZiAocG5nX3J0cmFuX29rKHBuZ19wdHIsIDApID09IDApCisgICAgICByZXR1cm47CisKKyAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSAoUE5HX0VYUEFORCB8IFBOR19FWFBBTkRfdFJOUyk7Cit9CisKKy8qIEV4cGFuZCBncmF5c2NhbGUgaW1hZ2VzIG9mIGxlc3MgdGhhbiA4LWJpdCBkZXB0aCB0byA4IGJpdHMuICovCit2b2lkIFBOR0FQSQorcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgiKTsKKworICAgaWYgKHBuZ19ydHJhbl9vayhwbmdfcHRyLCAwKSA9PSAwKQorICAgICAgcmV0dXJuOworCisgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX0VYUEFORDsKK30KKworLyogRXhwYW5kIHRSTlMgY2h1bmtzIHRvIGFscGhhIGNoYW5uZWxzLiAqLwordm9pZCBQTkdBUEkKK3BuZ19zZXRfdFJOU190b19hbHBoYShwbmdfc3RydWN0cnAgcG5nX3B0cikKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF90Uk5TX3RvX2FscGhhIik7CisKKyAgIGlmIChwbmdfcnRyYW5fb2socG5nX3B0ciwgMCkgPT0gMCkKKyAgICAgIHJldHVybjsKKworICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IChQTkdfRVhQQU5EIHwgUE5HX0VYUEFORF90Uk5TKTsKK30KKyNlbmRpZiAvKiBSRUFEX0VYUEFORCAqLworCisjaWZkZWYgUE5HX1JFQURfRVhQQU5EXzE2X1NVUFBPUlRFRAorLyogRXhwYW5kIHRvIDE2LWJpdCBjaGFubmVscywgZXhwYW5kIHRoZSB0Uk5TIGNodW5rIHRvbyAoYmVjYXVzZSBvdGhlcndpc2UKKyAqIGl0IG1heSBub3Qgd29yayBjb3JyZWN0bHkuKQorICovCit2b2lkIFBOR0FQSQorcG5nX3NldF9leHBhbmRfMTYocG5nX3N0cnVjdHJwIHBuZ19wdHIpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfZXhwYW5kXzE2Iik7CisKKyAgIGlmIChwbmdfcnRyYW5fb2socG5nX3B0ciwgMCkgPT0gMCkKKyAgICAgIHJldHVybjsKKworICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IChQTkdfRVhQQU5EXzE2IHwgUE5HX0VYUEFORCB8IFBOR19FWFBBTkRfdFJOUyk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0dSQVlfVE9fUkdCX1NVUFBPUlRFRAordm9pZCBQTkdBUEkKK3BuZ19zZXRfZ3JheV90b19yZ2IocG5nX3N0cnVjdHJwIHBuZ19wdHIpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfZ3JheV90b19yZ2IiKTsKKworICAgaWYgKHBuZ19ydHJhbl9vayhwbmdfcHRyLCAwKSA9PSAwKQorICAgICAgcmV0dXJuOworCisgICAvKiBCZWNhdXNlIHJnYiBtdXN0IGJlIDggYml0cyBvciBtb3JlOiAqLworICAgcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KHBuZ19wdHIpOworICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19HUkFZX1RPX1JHQjsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVECit2b2lkIFBOR0ZBUEkKK3BuZ19zZXRfcmdiX3RvX2dyYXlfZml4ZWQocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBlcnJvcl9hY3Rpb24sCisgICAgcG5nX2ZpeGVkX3BvaW50IHJlZCwgcG5nX2ZpeGVkX3BvaW50IGdyZWVuKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3JnYl90b19ncmF5Iik7CisKKyAgIC8qIE5lZWQgdGhlIElIRFIgaGVyZSBiZWNhdXNlIG9mIHRoZSBjaGVjayBvbiBjb2xvcl90eXBlIGJlbG93LiAqLworICAgLyogVE9ETzogZml4IHRoaXMgKi8KKyAgIGlmIChwbmdfcnRyYW5fb2socG5nX3B0ciwgMSkgPT0gMCkKKyAgICAgIHJldHVybjsKKworICAgc3dpdGNoIChlcnJvcl9hY3Rpb24pCisgICB7CisgICAgICBjYXNlIFBOR19FUlJPUl9BQ1RJT05fTk9ORToKKyAgICAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfUkdCX1RPX0dSQVk7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBQTkdfRVJST1JfQUNUSU9OX1dBUk46CisgICAgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX1JHQl9UT19HUkFZX1dBUk47CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBQTkdfRVJST1JfQUNUSU9OX0VSUk9SOgorICAgICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19SR0JfVE9fR1JBWV9FUlI7CisgICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiaW52YWxpZCBlcnJvciBhY3Rpb24gdG8gcmdiX3RvX2dyYXkiKTsKKyAgIH0KKworICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyNpZmRlZiBQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVECisgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX0VYUEFORDsKKyNlbHNlCisgICB7CisgICAgICAvKiBNYWtlIHRoaXMgYW4gZXJyb3IgaW4gMS42IGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBhcHBsaWNhdGlvbiBtYXkgYXNzdW1lCisgICAgICAgKiB0aGF0IGl0IGp1c3Qgd29ya2VkIGFuZCBnZXQgYSBtZW1vcnkgb3ZlcndyaXRlLgorICAgICAgICovCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwKKyAgICAgICAgIkNhbm5vdCBkbyBSR0JfVE9fR1JBWSB3aXRob3V0IEVYUEFORF9TVVBQT1JURUQiKTsKKworICAgICAgLyogcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICY9IH5QTkdfUkdCX1RPX0dSQVk7ICovCisgICB9CisjZW5kaWYKKyAgIHsKKyAgICAgIGlmIChyZWQgPj0gMCAmJiBncmVlbiA+PSAwICYmIHJlZCArIGdyZWVuIDw9IFBOR19GUF8xKQorICAgICAgeworICAgICAgICAgcG5nX3VpbnRfMTYgcmVkX2ludCwgZ3JlZW5faW50OworCisgICAgICAgICAvKiBOT1RFOiB0aGlzIGNhbGN1bGF0aW9uIGRvZXMgbm90IHJvdW5kLCBidXQgdGhpcyBiZWhhdmlvciBpcyByZXRhaW5lZAorICAgICAgICAgICogZm9yIGNvbnNpc3RlbmN5OyB0aGUgaW5hY2N1cmFjeSBpcyB2ZXJ5IHNtYWxsLiAgVGhlIGNvZGUgaGVyZSBhbHdheXMKKyAgICAgICAgICAqIG92ZXJ3cml0ZXMgdGhlIGNvZWZmaWNpZW50cywgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgaGF2ZSBiZWVuCisgICAgICAgICAgKiBkZWZhdWx0ZWQgb3Igc2V0IGFscmVhZHkuCisgICAgICAgICAgKi8KKyAgICAgICAgIHJlZF9pbnQgPSAocG5nX3VpbnRfMTYpKCgocG5nX3VpbnRfMzIpcmVkKjMyNzY4KS8xMDAwMDApOworICAgICAgICAgZ3JlZW5faW50ID0gKHBuZ191aW50XzE2KSgoKHBuZ191aW50XzMyKWdyZWVuKjMyNzY4KS8xMDAwMDApOworCisgICAgICAgICBwbmdfcHRyLT5yZ2JfdG9fZ3JheV9yZWRfY29lZmYgICA9IHJlZF9pbnQ7CisgICAgICAgICBwbmdfcHRyLT5yZ2JfdG9fZ3JheV9ncmVlbl9jb2VmZiA9IGdyZWVuX2ludDsKKyAgICAgICAgIHBuZ19wdHItPnJnYl90b19ncmF5X2NvZWZmaWNpZW50c19zZXQgPSAxOworICAgICAgfQorCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBpZiAocmVkID49IDAgJiYgZ3JlZW4gPj0gMCkKKyAgICAgICAgICAgIHBuZ19hcHBfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAgICAgICAgImlnbm9yaW5nIG91dCBvZiByYW5nZSByZ2JfdG9fZ3JheSBjb2VmZmljaWVudHMiKTsKKworICAgICAgICAgLyogVXNlIHRoZSBkZWZhdWx0cywgZnJvbSB0aGUgY0hSTSBjaHVuayBpZiBzZXQsIGVsc2UgdGhlIGhpc3RvcmljYWwKKyAgICAgICAgICAqIHZhbHVlcyB3aGljaCBhcmUgY2xvc2UgdG8gdGhlIHNSR0IvSERUVi9JVFUtUmVjIDcwOSB2YWx1ZXMuICBTZWUKKyAgICAgICAgICAqIHBuZ19kb19yZ2JfdG9fZ3JheSBmb3IgbW9yZSBkaXNjdXNzaW9uIG9mIHRoZSB2YWx1ZXMuICBJbiB0aGlzIGNhc2UKKyAgICAgICAgICAqIHRoZSBjb2VmZmljaWVudHMgYXJlIG5vdCBtYXJrZWQgYXMgJ3NldCcgYW5kIGFyZSBub3Qgb3ZlcndyaXR0ZW4gaWYKKyAgICAgICAgICAqIHNvbWV0aGluZyBoYXMgYWxyZWFkeSBwcm92aWRlZCBhIGRlZmF1bHQuCisgICAgICAgICAgKi8KKyAgICAgICAgIGlmIChwbmdfcHRyLT5yZ2JfdG9fZ3JheV9yZWRfY29lZmYgPT0gMCAmJgorICAgICAgICAgICAgcG5nX3B0ci0+cmdiX3RvX2dyYXlfZ3JlZW5fY29lZmYgPT0gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19wdHItPnJnYl90b19ncmF5X3JlZF9jb2VmZiAgID0gNjk2ODsKKyAgICAgICAgICAgIHBuZ19wdHItPnJnYl90b19ncmF5X2dyZWVuX2NvZWZmID0gMjM0MzQ7CisgICAgICAgICAgICAvKiBwbmdfcHRyLT5yZ2JfdG9fZ3JheV9ibHVlX2NvZWZmICA9IDIzNjY7ICovCisgICAgICAgICB9CisgICAgICB9CisgICB9Cit9CisKKyNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECisvKiBDb252ZXJ0IGEgUkdCIGltYWdlIHRvIGEgZ3JheXNjYWxlIG9mIHRoZSBzYW1lIHdpZHRoLiAgVGhpcyBhbGxvd3MgdXMsCisgKiBmb3IgZXhhbXBsZSwgdG8gY29udmVydCBhIDI0IGJwcCBSR0IgaW1hZ2UgaW50byBhbiA4IGJwcCBncmF5c2NhbGUgaW1hZ2UuCisgKi8KKwordm9pZCBQTkdBUEkKK3BuZ19zZXRfcmdiX3RvX2dyYXkocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBlcnJvcl9hY3Rpb24sIGRvdWJsZSByZWQsCisgICBkb3VibGUgZ3JlZW4pCit7CisgICBwbmdfc2V0X3JnYl90b19ncmF5X2ZpeGVkKHBuZ19wdHIsIGVycm9yX2FjdGlvbiwKKyAgICAgIHBuZ19maXhlZChwbmdfcHRyLCByZWQsICJyZ2IgdG8gZ3JheSByZWQgY29lZmZpY2llbnQiKSwKKyAgICAgIHBuZ19maXhlZChwbmdfcHRyLCBncmVlbiwgInJnYiB0byBncmF5IGdyZWVuIGNvZWZmaWNpZW50IikpOworfQorI2VuZGlmIC8qIEZMT0FUSU5HIFBPSU5UICovCisKKyNlbmRpZiAvKiBSR0JfVE9fR1JBWSAqLworCisjaWYgZGVmaW5lZChQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpIHx8IFwKKyAgICBkZWZpbmVkKFBOR19XUklURV9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpCit2b2lkIFBOR0FQSQorcG5nX3NldF9yZWFkX3VzZXJfdHJhbnNmb3JtX2ZuKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfdXNlcl90cmFuc2Zvcm1fcHRyCisgICAgcmVhZF91c2VyX3RyYW5zZm9ybV9mbikKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9yZWFkX3VzZXJfdHJhbnNmb3JtX2ZuIik7CisKKyNpZmRlZiBQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQKKyAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfVVNFUl9UUkFOU0ZPUk07CisgICBwbmdfcHRyLT5yZWFkX3VzZXJfdHJhbnNmb3JtX2ZuID0gcmVhZF91c2VyX3RyYW5zZm9ybV9mbjsKKyNlbmRpZgorfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9UUkFOU0ZPUk1TX1NVUFBPUlRFRAorI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAorLyogSW4gdGhlIGNhc2Ugb2YgZ2FtbWEgdHJhbnNmb3JtYXRpb25zIG9ubHkgZG8gdHJhbnNmb3JtYXRpb25zIG9uIGltYWdlcyB3aGVyZQorICogdGhlIFtmaWxlXSBnYW1tYSBhbmQgc2NyZWVuX2dhbW1hIGFyZSBub3QgY2xvc2UgcmVjaXByb2NhbHMsIG90aGVyd2lzZSBpdAorICogc2xvd3MgdGhpbmdzIGRvd24gc2xpZ2h0bHksIGFuZCBhbHNvIG5lZWRsZXNzbHkgaW50cm9kdWNlcyBzbWFsbCBlcnJvcnMuCisgKi8KK3N0YXRpYyBpbnQgLyogUFJJVkFURSAqLworcG5nX2dhbW1hX3RocmVzaG9sZChwbmdfZml4ZWRfcG9pbnQgc2NyZWVuX2dhbW1hLCBwbmdfZml4ZWRfcG9pbnQgZmlsZV9nYW1tYSkKK3sKKyAgIC8qIFBOR19HQU1NQV9USFJFU0hPTEQgaXMgdGhlIHRocmVzaG9sZCBmb3IgcGVyZm9ybWluZyBnYW1tYQorICAgICogY29ycmVjdGlvbiBhcyBhIGRpZmZlcmVuY2Ugb2YgdGhlIG92ZXJhbGwgdHJhbnNmb3JtIGZyb20gMS4wCisgICAgKgorICAgICogV2Ugd2FudCB0byBjb21wYXJlIHRoZSB0aHJlc2hvbGQgd2l0aCBzKmYgLSAxLCBpZiB3ZSBnZXQKKyAgICAqIG92ZXJmbG93IGhlcmUgaXQgaXMgYmVjYXVzZSBvZiB3YWNreSBnYW1tYSB2YWx1ZXMgc28gd2UKKyAgICAqIHR1cm4gb24gcHJvY2Vzc2luZyBhbnl3YXkuCisgICAgKi8KKyAgIHBuZ19maXhlZF9wb2ludCBndGVzdDsKKyAgIHJldHVybiAhcG5nX211bGRpdigmZ3Rlc3QsIHNjcmVlbl9nYW1tYSwgZmlsZV9nYW1tYSwgUE5HX0ZQXzEpIHx8CisgICAgICAgcG5nX2dhbW1hX3NpZ25pZmljYW50KGd0ZXN0KTsKK30KKyNlbmRpZgorCisvKiBJbml0aWFsaXplIGV2ZXJ5dGhpbmcgbmVlZGVkIGZvciB0aGUgcmVhZC4gIFRoaXMgaW5jbHVkZXMgbW9kaWZ5aW5nCisgKiB0aGUgcGFsZXR0ZS4KKyAqLworCisvKiBGb3IgdGhlIG1vbWVudCAncG5nX2luaXRfcGFsZXR0ZV90cmFuc2Zvcm1hdGlvbnMnIGFuZAorICogJ3BuZ19pbml0X3JnYl90cmFuc2Zvcm1hdGlvbnMnIG9ubHkgZG8gc29tZSBmbGFnIGNhbmNlbGluZyBvcHRpbWl6YXRpb25zLgorICogVGhlIGludGVudCBpcyB0aGF0IHRoZXNlIHR3byByb3V0aW5lcyBzaG91bGQgaGF2ZSBwYWxldHRlIG9yIHJnYiBvcGVyYXRpb25zCisgKiBleHRyYWN0ZWQgZnJvbSAncG5nX2luaXRfcmVhZF90cmFuc2Zvcm1hdGlvbnMnLgorICovCitzdGF0aWMgdm9pZCAvKiBQUklWQVRFICovCitwbmdfaW5pdF9wYWxldHRlX3RyYW5zZm9ybWF0aW9ucyhwbmdfc3RydWN0cnAgcG5nX3B0cikKK3sKKyAgIC8qIENhbGxlZCB0byBoYW5kbGUgdGhlIChpbnB1dCkgcGFsZXR0ZSBjYXNlLiAgSW4gcG5nX2RvX3JlYWRfdHJhbnNmb3JtYXRpb25zCisgICAgKiB0aGUgZmlyc3Qgc3RlcCBpcyB0byBleHBhbmQgdGhlIHBhbGV0dGUgaWYgcmVxdWVzdGVkLCBzbyB0aGlzIGNvZGUgbXVzdAorICAgICogdGFrZSBjYXJlIHRvIG9ubHkgbWFrZSBjaGFuZ2VzIHRoYXQgYXJlIGludmFyaWFudCB3aXRoIHJlc3BlY3QgdG8gdGhlCisgICAgKiBwYWxldHRlIGV4cGFuc2lvbiwgb3Igb25seSBkbyB0aGVtIGlmIHRoZXJlIGlzIG5vIGV4cGFuc2lvbi4KKyAgICAqCisgICAgKiBTVFJJUF9BTFBIQSBoYXMgYWxyZWFkeSBiZWVuIGhhbmRsZWQgaW4gdGhlIGNhbGxlciAoYnkgc2V0dGluZyBudW1fdHJhbnMKKyAgICAqIHRvIDAuKQorICAgICovCisgICBpbnQgaW5wdXRfaGFzX2FscGhhID0gMDsKKyAgIGludCBpbnB1dF9oYXNfdHJhbnNwYXJlbmN5ID0gMDsKKworICAgaWYgKHBuZ19wdHItPm51bV90cmFucyA+IDApCisgICB7CisgICAgICBpbnQgaTsKKworICAgICAgLyogSWdub3JlIGlmIGFsbCB0aGUgZW50cmllcyBhcmUgb3BhcXVlICh1bmxpa2VseSEpICovCisgICAgICBmb3IgKGk9MDsgaTxwbmdfcHRyLT5udW1fdHJhbnM7ICsraSkKKyAgICAgIHsKKyAgICAgICAgIGlmIChwbmdfcHRyLT50cmFuc19hbHBoYVtpXSA9PSAyNTUpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgIGVsc2UgaWYgKHBuZ19wdHItPnRyYW5zX2FscGhhW2ldID09IDApCisgICAgICAgICAgICBpbnB1dF9oYXNfdHJhbnNwYXJlbmN5ID0gMTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlucHV0X2hhc190cmFuc3BhcmVuY3kgPSAxOworICAgICAgICAgICAgaW5wdXRfaGFzX2FscGhhID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICAvKiBJZiBubyBhbHBoYSB3ZSBjYW4gb3B0aW1pemUuICovCisgICBpZiAoaW5wdXRfaGFzX2FscGhhID09IDApCisgICB7CisgICAgICAvKiBBbnkgYWxwaGEgbWVhbnMgYmFja2dyb3VuZCBhbmQgYXNzb2NpYXRpdmUgYWxwaGEgcHJvY2Vzc2luZyBpcworICAgICAgICogcmVxdWlyZWQsIGhvd2V2ZXIgaWYgdGhlIGFscGhhIGlzIDAgb3IgMSB0aHJvdWdob3V0IE9QVElNSVpFX0FMUEhBCisgICAgICAgKiBhbmQgRU5DT0RFX0FMUEhBIGFyZSBpcnJlbGV2YW50LgorICAgICAgICovCisgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJj0gflBOR19FTkNPREVfQUxQSEE7CisgICAgICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfT1BUSU1JWkVfQUxQSEE7CisKKyAgICAgIGlmIChpbnB1dF9oYXNfdHJhbnNwYXJlbmN5ID09IDApCisgICAgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJj0gfihQTkdfQ09NUE9TRSB8IFBOR19CQUNLR1JPVU5EX0VYUEFORCk7CisgICB9CisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpCisgICAvKiBwbmdfc2V0X2JhY2tncm91bmQgaGFuZGxpbmcgLSBkZWFscyB3aXRoIHRoZSBjb21wbGV4aXR5IG9mIHdoZXRoZXIgdGhlCisgICAgKiBiYWNrZ3JvdW5kIGNvbG9yIGlzIGluIHRoZSBmaWxlIGZvcm1hdCBvciB0aGUgc2NyZWVuIGZvcm1hdCBpbiB0aGUgY2FzZQorICAgICogd2hlcmUgYW4gJ2V4cGFuZCcgd2lsbCBoYXBwZW4uCisgICAgKi8KKworICAgLyogVGhlIGZvbGxvd2luZyBjb2RlIGNhbm5vdCBiZSBlbnRlcmVkIGluIHRoZSBhbHBoYSBwcmUtbXVsdGlwbGljYXRpb24gY2FzZQorICAgICogYmVjYXVzZSBQTkdfQkFDS0dST1VORF9FWFBBTkQgaXMgY2FuY2VsbGVkIGJlbG93LgorICAgICovCisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19CQUNLR1JPVU5EX0VYUEFORCkgIT0gMCAmJgorICAgICAgIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRVhQQU5EKSAhPSAwKQorICAgeworICAgICAgeworICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgICA9CisgICAgICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZVtwbmdfcHRyLT5iYWNrZ3JvdW5kLmluZGV4XS5yZWQ7CisgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuID0KKyAgICAgICAgICAgICBwbmdfcHRyLT5wYWxldHRlW3BuZ19wdHItPmJhY2tncm91bmQuaW5kZXhdLmdyZWVuOworICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlICA9CisgICAgICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZVtwbmdfcHRyLT5iYWNrZ3JvdW5kLmluZGV4XS5ibHVlOworCisjaWZkZWYgUE5HX1JFQURfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRAorICAgICAgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlZFUlRfQUxQSEEpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRVhQQU5EX3RSTlMpID09IDApCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogSW52ZXJ0IHRoZSBhbHBoYSBjaGFubmVsIChpbiB0Uk5TKSB1bmxlc3MgdGhlIHBpeGVscyBhcmUKKyAgICAgICAgICAgICAgICogZ29pbmcgdG8gYmUgZXhwYW5kZWQsIGluIHdoaWNoIGNhc2UgbGVhdmUgaXQgZm9yIGxhdGVyCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBpbnQgaSwgaXN0b3AgPSBwbmdfcHRyLT5udW1fdHJhbnM7CisKKyAgICAgICAgICAgICAgZm9yIChpPTA7IGk8aXN0b3A7IGkrKykKKyAgICAgICAgICAgICAgICAgcG5nX3B0ci0+dHJhbnNfYWxwaGFbaV0gPSAocG5nX2J5dGUpKDI1NSAtCisgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnRyYW5zX2FscGhhW2ldKTsKKyAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogUkVBRF9JTlZFUlRfQUxQSEEgKi8KKyAgICAgIH0KKyAgIH0gLyogYmFja2dyb3VuZCBleHBhbmQgYW5kICh0aGVyZWZvcmUpIG5vIGFscGhhIGFzc29jaWF0aW9uLiAqLworI2VuZGlmIC8qIFJFQURfRVhQQU5EICYmIFJFQURfQkFDS0dST1VORCAqLworfQorCitzdGF0aWMgdm9pZCAvKiBQUklWQVRFICovCitwbmdfaW5pdF9yZ2JfdHJhbnNmb3JtYXRpb25zKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQoreworICAgLyogQWRkZWQgdG8gbGlicG5nLTEuNS40OiBjaGVjayB0aGUgY29sb3IgdHlwZSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVyZQorICAgICogaXMgYW55IGFscGhhIG9yIHRyYW5zcGFyZW5jeSBpbiB0aGUgaW1hZ2UgYW5kIHNpbXBseSBjYW5jZWwgdGhlCisgICAgKiBiYWNrZ3JvdW5kIGFuZCBhbHBoYSBtb2RlIHN0dWZmIGlmIHRoZXJlIGlzbid0LgorICAgICovCisgICBpbnQgaW5wdXRfaGFzX2FscGhhID0gKHBuZ19wdHItPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkgIT0gMDsKKyAgIGludCBpbnB1dF9oYXNfdHJhbnNwYXJlbmN5ID0gcG5nX3B0ci0+bnVtX3RyYW5zID4gMDsKKworICAgLyogSWYgbm8gYWxwaGEgd2UgY2FuIG9wdGltaXplLiAqLworICAgaWYgKGlucHV0X2hhc19hbHBoYSA9PSAwKQorICAgeworICAgICAgLyogQW55IGFscGhhIG1lYW5zIGJhY2tncm91bmQgYW5kIGFzc29jaWF0aXZlIGFscGhhIHByb2Nlc3NpbmcgaXMKKyAgICAgICAqIHJlcXVpcmVkLCBob3dldmVyIGlmIHRoZSBhbHBoYSBpcyAwIG9yIDEgdGhyb3VnaG91dCBPUFRJTUlaRV9BTFBIQQorICAgICAgICogYW5kIEVOQ09ERV9BTFBIQSBhcmUgaXJyZWxldmFudC4KKyAgICAgICAqLworIyAgICAgaWZkZWYgUE5HX1JFQURfQUxQSEFfTU9ERV9TVVBQT1JURUQKKyAgICAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmPSB+UE5HX0VOQ09ERV9BTFBIQTsKKyAgICAgICAgIHBuZ19wdHItPmZsYWdzICY9IH5QTkdfRkxBR19PUFRJTUlaRV9BTFBIQTsKKyMgICAgIGVuZGlmCisKKyAgICAgIGlmIChpbnB1dF9oYXNfdHJhbnNwYXJlbmN5ID09IDApCisgICAgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJj0gfihQTkdfQ09NUE9TRSB8IFBOR19CQUNLR1JPVU5EX0VYUEFORCk7CisgICB9CisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpCisgICAvKiBwbmdfc2V0X2JhY2tncm91bmQgaGFuZGxpbmcgLSBkZWFscyB3aXRoIHRoZSBjb21wbGV4aXR5IG9mIHdoZXRoZXIgdGhlCisgICAgKiBiYWNrZ3JvdW5kIGNvbG9yIGlzIGluIHRoZSBmaWxlIGZvcm1hdCBvciB0aGUgc2NyZWVuIGZvcm1hdCBpbiB0aGUgY2FzZQorICAgICogd2hlcmUgYW4gJ2V4cGFuZCcgd2lsbCBoYXBwZW4uCisgICAgKi8KKworICAgLyogVGhlIGZvbGxvd2luZyBjb2RlIGNhbm5vdCBiZSBlbnRlcmVkIGluIHRoZSBhbHBoYSBwcmUtbXVsdGlwbGljYXRpb24gY2FzZQorICAgICogYmVjYXVzZSBQTkdfQkFDS0dST1VORF9FWFBBTkQgaXMgY2FuY2VsbGVkIGJlbG93LgorICAgICovCisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19CQUNLR1JPVU5EX0VYUEFORCkgIT0gMCAmJgorICAgICAgIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRVhQQU5EKSAhPSAwICYmCisgICAgICAgKHBuZ19wdHItPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikgPT0gMCkKKyAgICAgICAvKiBpLmUuLCBHUkFZIG9yIEdSQVlfQUxQSEEgKi8KKyAgIHsKKyAgICAgIHsKKyAgICAgICAgIC8qIEV4cGFuZCBiYWNrZ3JvdW5kIGFuZCB0Uk5TIGNodW5rcyAqLworICAgICAgICAgaW50IGdyYXkgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXk7CisgICAgICAgICBpbnQgdHJhbnNfZ3JheSA9IHBuZ19wdHItPnRyYW5zX2NvbG9yLmdyYXk7CisKKyAgICAgICAgIHN3aXRjaCAocG5nX3B0ci0+Yml0X2RlcHRoKQorICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgZ3JheSAqPSAweGZmOworICAgICAgICAgICAgICAgdHJhbnNfZ3JheSAqPSAweGZmOworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgIGdyYXkgKj0gMHg1NTsKKyAgICAgICAgICAgICAgIHRyYW5zX2dyYXkgKj0gMHg1NTsKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICBncmF5ICo9IDB4MTE7CisgICAgICAgICAgICAgICB0cmFuc19ncmF5ICo9IDB4MTE7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKworICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIIChBbHJlYWR5IDggYml0cykgKi8KKworICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgIC8qIEFscmVhZHkgYSBmdWxsIDE2IGJpdHMgKi8KKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCA9IHBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4gPQorICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlID0gKHBuZ191aW50XzE2KWdyYXk7CisKKyAgICAgICAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0VYUEFORF90Uk5TKSA9PSAwKQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX3B0ci0+dHJhbnNfY29sb3IucmVkID0gcG5nX3B0ci0+dHJhbnNfY29sb3IuZ3JlZW4gPQorICAgICAgICAgICAgICAgcG5nX3B0ci0+dHJhbnNfY29sb3IuYmx1ZSA9IChwbmdfdWludF8xNil0cmFuc19ncmF5OworICAgICAgICAgfQorICAgICAgfQorICAgfSAvKiBiYWNrZ3JvdW5kIGV4cGFuZCBhbmQgKHRoZXJlZm9yZSkgbm8gYWxwaGEgYXNzb2NpYXRpb24uICovCisjZW5kaWYgLyogUkVBRF9FWFBBTkQgJiYgUkVBRF9CQUNLR1JPVU5EICovCit9CisKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2luaXRfcmVhZF90cmFuc2Zvcm1hdGlvbnMocG5nX3N0cnVjdHJwIHBuZ19wdHIpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19pbml0X3JlYWRfdHJhbnNmb3JtYXRpb25zIik7CisKKyAgIC8qIFRoaXMgaW50ZXJuYWwgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gcG5nX3JlYWRfc3RhcnRfcm93IGluIHBuZ3J1dGlsLmMKKyAgICAqIGFuZCBpdCBpcyBjYWxsZWQgYmVmb3JlIHRoZSAncm93Ynl0ZXMnIGNhbGN1bGF0aW9uIGlzIGRvbmUsIHNvIHRoZSBjb2RlCisgICAgKiBpbiBoZXJlIGNhbiBjaGFuZ2Ugb3IgdXBkYXRlIHRoZSB0cmFuc2Zvcm1hdGlvbnMgZmxhZ3MuCisgICAgKgorICAgICogRmlyc3QgZG8gdXBkYXRlcyB0aGF0IGRvIG5vdCBkZXBlbmQgb24gdGhlIGRldGFpbHMgb2YgdGhlIFBORyBpbWFnZSBkYXRhCisgICAgKiBiZWluZyBwcm9jZXNzZWQuCisgICAgKi8KKworI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAorICAgLyogUHJpb3IgdG8gMS41LjQgdGhlc2UgdGVzdHMgd2VyZSBwZXJmb3JtZWQgZnJvbSBwbmdfc2V0X2dhbW1hLCAxLjUuNCBhZGRzCisgICAgKiBwbmdfc2V0X2FscGhhX21vZGUgYW5kIHRoaXMgaXMgYW5vdGhlciBzb3VyY2UgZm9yIGEgZGVmYXVsdCBmaWxlIGdhbW1hIHNvCisgICAgKiB0aGUgdGVzdCBuZWVkcyB0byBiZSBwZXJmb3JtZWQgbGF0ZXIgLSBoZXJlLiAgSW4gYWRkaXRpb24gcHJpb3IgdG8gMS41LjQKKyAgICAqIHRoZSB0ZXN0cyB3ZXJlIHJlcGVhdGVkIGZvciB0aGUgUEFMRVRURSBjb2xvciB0eXBlIGhlcmUgLSB0aGlzIGlzIG5vCisgICAgKiBsb25nZXIgbmVjZXNzYXJ5IChhbmQgZG9lc24ndCBzZWVtIHRvIGhhdmUgYmVlbiBuZWNlc3NhcnkgYmVmb3JlLikKKyAgICAqLworICAgeworICAgICAgLyogVGhlIGZvbGxvd2luZyB0ZW1wb3JhcnkgaW5kaWNhdGVzIGlmIG92ZXJhbGwgZ2FtbWEgY29ycmVjdGlvbiBpcworICAgICAgICogcmVxdWlyZWQuCisgICAgICAgKi8KKyAgICAgIGludCBnYW1tYV9jb3JyZWN0aW9uID0gMDsKKworICAgICAgaWYgKHBuZ19wdHItPmNvbG9yc3BhY2UuZ2FtbWEgIT0gMCkgLyogaGFzIGJlZW4gc2V0ICovCisgICAgICB7CisgICAgICAgICBpZiAocG5nX3B0ci0+c2NyZWVuX2dhbW1hICE9IDApIC8qIHNjcmVlbiBzZXQgdG9vICovCisgICAgICAgICAgICBnYW1tYV9jb3JyZWN0aW9uID0gcG5nX2dhbW1hX3RocmVzaG9sZChwbmdfcHRyLT5jb2xvcnNwYWNlLmdhbW1hLAorICAgICAgICAgICAgICAgcG5nX3B0ci0+c2NyZWVuX2dhbW1hKTsKKworICAgICAgICAgZWxzZQorICAgICAgICAgICAgLyogQXNzdW1lIHRoZSBvdXRwdXQgbWF0Y2hlcyB0aGUgaW5wdXQ7IGEgbG9uZyB0aW1lIGRlZmF1bHQgYmVoYXZpb3IKKyAgICAgICAgICAgICAqIG9mIGxpYnBuZywgYWx0aG91Z2ggdGhlIHN0YW5kYXJkIGhhcyBub3RoaW5nIHRvIHNheSBhYm91dCB0aGlzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwbmdfcHRyLT5zY3JlZW5fZ2FtbWEgPSBwbmdfcmVjaXByb2NhbChwbmdfcHRyLT5jb2xvcnNwYWNlLmdhbW1hKTsKKyAgICAgIH0KKworICAgICAgZWxzZSBpZiAocG5nX3B0ci0+c2NyZWVuX2dhbW1hICE9IDApCisgICAgICAgICAvKiBUaGUgY29udmVyc2UgLSBhc3N1bWUgdGhlIGZpbGUgbWF0Y2hlcyB0aGUgc2NyZWVuLCBub3RlIHRoYXQgdGhpcworICAgICAgICAgICogcGVyaGFwcyB1bmRlc2lyZWFibGUgZGVmYXVsdCBjYW4gKGZyb20gMS41LjQpIGJlIGNoYW5nZWQgYnkgY2FsbGluZworICAgICAgICAgICogcG5nX3NldF9hbHBoYV9tb2RlIChldmVuIGlmIHRoZSBhbHBoYSBoYW5kbGluZyBtb2RlIGlzbid0IHJlcXVpcmVkCisgICAgICAgICAgKiBvciBpc24ndCBjaGFuZ2VkIGZyb20gdGhlIGRlZmF1bHQuKQorICAgICAgICAgICovCisgICAgICAgICBwbmdfcHRyLT5jb2xvcnNwYWNlLmdhbW1hID0gcG5nX3JlY2lwcm9jYWwocG5nX3B0ci0+c2NyZWVuX2dhbW1hKTsKKworICAgICAgZWxzZSAvKiBuZWl0aGVyIGFyZSBzZXQgKi8KKyAgICAgICAgIC8qIEp1c3QgaW4gY2FzZSB0aGUgZm9sbG93aW5nIHByZXZlbnRzIGFueSBwcm9jZXNzaW5nIC0gZmlsZSBhbmQgc2NyZWVuCisgICAgICAgICAgKiBhcmUgYm90aCBhc3N1bWVkIHRvIGJlIGxpbmVhciBhbmQgdGhlcmUgaXMgbm8gd2F5IHRvIGludHJvZHVjZSBhCisgICAgICAgICAgKiB0aGlyZCBnYW1tYSB2YWx1ZSBvdGhlciB0aGFuIHBuZ19zZXRfYmFja2dyb3VuZCB3aXRoICdVTklRVUUnLCBhbmQsCisgICAgICAgICAgKiBwcmlvciB0byAxLjUuNAorICAgICAgICAgICovCisgICAgICAgICBwbmdfcHRyLT5zY3JlZW5fZ2FtbWEgPSBwbmdfcHRyLT5jb2xvcnNwYWNlLmdhbW1hID0gUE5HX0ZQXzE7CisKKyAgICAgIC8qIFdlIGhhdmUgYSBnYW1tYSB2YWx1ZSBub3cuICovCisgICAgICBwbmdfcHRyLT5jb2xvcnNwYWNlLmZsYWdzIHw9IFBOR19DT0xPUlNQQUNFX0hBVkVfR0FNTUE7CisKKyAgICAgIC8qIE5vdyB0dXJuIHRoZSBnYW1tYSB0cmFuc2Zvcm1hdGlvbiBvbiBvciBvZmYgYXMgYXBwcm9wcmlhdGUuICBOb3RpY2UKKyAgICAgICAqIHRoYXQgUE5HX0dBTU1BIGp1c3QgcmVmZXJzIHRvIHRoZSBmaWxlLT5zY3JlZW4gY29ycmVjdGlvbi4gIEFscGhhCisgICAgICAgKiBjb21wb3NpdGlvbiBtYXkgaW5kZXBlbmRlbnRseSBjYXVzZSBnYW1tYSBjb3JyZWN0aW9uIGJlY2F1c2UgaXQgbmVlZHMKKyAgICAgICAqIGxpbmVhciBkYXRhIChlLmcuIGlmIHRoZSBmaWxlIGhhcyBhIGdBTUEgY2h1bmsgYnV0IHRoZSBzY3JlZW4gZ2FtbWEKKyAgICAgICAqIGhhc24ndCBiZWVuIHNwZWNpZmllZC4pICBJbiBhbnkgY2FzZSB0aGlzIGZsYWcgbWF5IGdldCB0dXJuZWQgb2ZmIGluCisgICAgICAgKiB0aGUgY29kZSBpbW1lZGlhdGVseSBiZWxvdyBpZiB0aGUgdHJhbnNmb3JtIGNhbiBiZSBoYW5kbGVkIG91dHNpZGUgdGhlCisgICAgICAgKiByb3cgbG9vcC4KKyAgICAgICAqLworICAgICAgaWYgKGdhbW1hX2NvcnJlY3Rpb24gIT0gMCkKKyAgICAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfR0FNTUE7CisKKyAgICAgIGVsc2UKKyAgICAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmPSB+UE5HX0dBTU1BOworICAgfQorI2VuZGlmCisKKyAgIC8qIENlcnRhaW4gdHJhbnNmb3JtYXRpb25zIGhhdmUgdGhlIGVmZmVjdCBvZiBwcmV2ZW50aW5nIG90aGVyCisgICAgKiB0cmFuc2Zvcm1hdGlvbnMgdGhhdCBoYXBwZW4gYWZ0ZXJ3YXJkIGluIHBuZ19kb19yZWFkX3RyYW5zZm9ybWF0aW9uczsKKyAgICAqIHJlc29sdmUgdGhlIGludGVyZGVwZW5kZW5jaWVzIGhlcmUuICBGcm9tIHRoZSBjb2RlIG9mCisgICAgKiBwbmdfZG9fcmVhZF90cmFuc2Zvcm1hdGlvbnMgdGhlIG9yZGVyIGlzOgorICAgICoKKyAgICAqICAxKSBQTkdfRVhQQU5EIChpbmNsdWRpbmcgUE5HX0VYUEFORF90Uk5TKQorICAgICogIDIpIFBOR19TVFJJUF9BTFBIQSAoaWYgbm8gY29tcG9zZSkKKyAgICAqICAzKSBQTkdfUkdCX1RPX0dSQVkKKyAgICAqICA0KSBQTkdfR1JBWV9UT19SR0IgaWZmICFQTkdfQkFDS0dST1VORF9JU19HUkFZCisgICAgKiAgNSkgUE5HX0NPTVBPU0UKKyAgICAqICA2KSBQTkdfR0FNTUEKKyAgICAqICA3KSBQTkdfU1RSSVBfQUxQSEEgKGlmIGNvbXBvc2UpCisgICAgKiAgOCkgUE5HX0VOQ09ERV9BTFBIQQorICAgICogIDkpIFBOR19TQ0FMRV8xNl9UT184CisgICAgKiAxMCkgUE5HXzE2X1RPXzgKKyAgICAqIDExKSBQTkdfUVVBTlRJWkUgKGNvbnZlcnRzIHRvIHBhbGV0dGUpCisgICAgKiAxMikgUE5HX0VYUEFORF8xNgorICAgICogMTMpIFBOR19HUkFZX1RPX1JHQiBpZmYgUE5HX0JBQ0tHUk9VTkRfSVNfR1JBWQorICAgICogMTQpIFBOR19JTlZFUlRfTU9OTworICAgICogMTUpIFBOR19JTlZFUlRfQUxQSEEKKyAgICAqIDE2KSBQTkdfU0hJRlQKKyAgICAqIDE3KSBQTkdfUEFDSworICAgICogMTgpIFBOR19CR1IKKyAgICAqIDE5KSBQTkdfUEFDS1NXQVAKKyAgICAqIDIwKSBQTkdfRklMTEVSIChpbmNsdWRlcyBQTkdfQUREX0FMUEhBKQorICAgICogMjEpIFBOR19TV0FQX0FMUEhBCisgICAgKiAyMikgUE5HX1NXQVBfQllURVMKKyAgICAqIDIzKSBQTkdfVVNFUl9UUkFOU0ZPUk0gW211c3QgYmUgbGFzdF0KKyAgICAqLworI2lmZGVmIFBOR19SRUFEX1NUUklQX0FMUEhBX1NVUFBPUlRFRAorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfU1RSSVBfQUxQSEEpICE9IDAgJiYKKyAgICAgICAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0NPTVBPU0UpID09IDApCisgICB7CisgICAgICAvKiBTdHJpcHBpbmcgdGhlIGFscGhhIGNoYW5uZWwgaGFwcGVucyBpbW1lZGlhdGVseSBhZnRlciB0aGUgJ2V4cGFuZCcKKyAgICAgICAqIHRyYW5zZm9ybWF0aW9ucywgYmVmb3JlIGFsbCBvdGhlciB0cmFuc2Zvcm1hdGlvbiwgc28gaXQgY2FuY2VscyBvdXQKKyAgICAgICAqIHRoZSBhbHBoYSBoYW5kbGluZy4gIEl0IGhhcyB0aGUgc2lkZSBlZmZlY3QgbmVnYXRpbmcgdGhlIGVmZmVjdCBvZgorICAgICAgICogUE5HX0VYUEFORF90Uk5TIHRvbzoKKyAgICAgICAqLworICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICY9IH4oUE5HX0JBQ0tHUk9VTkRfRVhQQU5EIHwgUE5HX0VOQ09ERV9BTFBIQSB8CisgICAgICAgICBQTkdfRVhQQU5EX3RSTlMpOworICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX09QVElNSVpFX0FMUEhBOworCisgICAgICAvKiBLaWxsIHRoZSB0Uk5TIGNodW5rIGl0c2VsZiB0b28uICBQcmlvciB0byAxLjUuNCB0aGlzIGRpZCBub3QgaGFwcGVuCisgICAgICAgKiBzbyB0cmFuc3BhcmVuY3kgaW5mb3JtYXRpb24gd291bGQgcmVtYWluIGp1c3Qgc28gbG9uZyBhcyBpdCB3YXNuJ3QKKyAgICAgICAqIGV4cGFuZGVkLiAgVGhpcyBwcm9kdWNlcyB1bmV4cGVjdGVkIEFQSSBjaGFuZ2VzIGlmIHRoZSBzZXQgb2YgdGhpbmdzCisgICAgICAgKiB0aGF0IGRvIFBOR19FWFBBTkRfdFJOUyBjaGFuZ2VzIChwZXJmZWN0bHkgcG9zc2libGUgZ2l2ZW4gdGhlCisgICAgICAgKiBkb2N1bWVudGF0aW9uIC0gd2hpY2ggc2F5cyBhc2sgZm9yIHdoYXQgeW91IHdhbnQsIGFjY2VwdCB3aGF0IHlvdQorICAgICAgICogZ2V0LikgIFRoaXMgbWFrZXMgdGhlIGJlaGF2aW9yIGNvbnNpc3RlbnQgZnJvbSAxLjUuNDoKKyAgICAgICAqLworICAgICAgcG5nX3B0ci0+bnVtX3RyYW5zID0gMDsKKyAgIH0KKyNlbmRpZiAvKiBTVFJJUF9BTFBIQSBzdXBwb3J0ZWQsIG5vIENPTVBPU0UgKi8KKworI2lmZGVmIFBOR19SRUFEX0FMUEhBX01PREVfU1VQUE9SVEVECisgICAvKiBJZiB0aGUgc2NyZWVuIGdhbW1hIGlzIGFib3V0IDEuMCB0aGVuIHRoZSBPUFRJTUlaRV9BTFBIQSBhbmQgRU5DT0RFX0FMUEhBCisgICAgKiBzZXR0aW5ncyB3aWxsIGhhdmUgbm8gZWZmZWN0LgorICAgICovCisgICBpZiAocG5nX2dhbW1hX3NpZ25pZmljYW50KHBuZ19wdHItPnNjcmVlbl9nYW1tYSkgPT0gMCkKKyAgIHsKKyAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmPSB+UE5HX0VOQ09ERV9BTFBIQTsKKyAgICAgIHBuZ19wdHItPmZsYWdzICY9IH5QTkdfRkxBR19PUFRJTUlaRV9BTFBIQTsKKyAgIH0KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVECisgICAvKiBNYWtlIHN1cmUgdGhlIGNvZWZmaWNpZW50cyBmb3IgdGhlIHJnYiB0byBncmF5IGNvbnZlcnNpb24gYXJlIHNldAorICAgICogYXBwcm9wcmlhdGVseS4KKyAgICAqLworICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUkdCX1RPX0dSQVkpICE9IDApCisgICAgICBwbmdfY29sb3JzcGFjZV9zZXRfcmdiX2NvZWZmaWNpZW50cyhwbmdfcHRyKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfR1JBWV9UT19SR0JfU1VQUE9SVEVECisjaWYgZGVmaW5lZChQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKQorICAgLyogRGV0ZWN0IGdyYXkgYmFja2dyb3VuZCBhbmQgYXR0ZW1wdCB0byBlbmFibGUgb3B0aW1pemF0aW9uIGZvcgorICAgICogZ3JheSAtLT4gUkdCIGNhc2UuCisgICAgKgorICAgICogTm90ZTogIGlmIFBOR19CQUNLR1JPVU5EX0VYUEFORCBpcyBzZXQgYW5kIGNvbG9yX3R5cGUgaXMgZWl0aGVyIFJHQiBvcgorICAgICogUkdCX0FMUEhBIChpbiB3aGljaCBjYXNlIG5lZWRfZXhwYW5kIGlzIHN1cGVyZmx1b3VzIGFueXdheSksIHRoZQorICAgICogYmFja2dyb3VuZCBjb2xvciBtaWdodCBhY3R1YWxseSBiZSBncmF5IHlldCBub3QgYmUgZmxhZ2dlZCBhcyBzdWNoLgorICAgICogVGhpcyBpcyBub3QgYSBwcm9ibGVtIGZvciB0aGUgY3VycmVudCBjb2RlLCB3aGljaCB1c2VzCisgICAgKiBQTkdfQkFDS0dST1VORF9JU19HUkFZIG9ubHkgdG8gZGVjaWRlIHdoZW4gdG8gZG8gdGhlCisgICAgKiBwbmdfZG9fZ3JheV90b19yZ2IoKSB0cmFuc2Zvcm1hdGlvbi4KKyAgICAqCisgICAgKiBUT0RPOiB0aGlzIGNvZGUgbmVlZHMgdG8gYmUgcmV2aXNlZCB0byBhdm9pZCB0aGUgY29tcGxleGl0eSBhbmQKKyAgICAqIGludGVyZGVwZW5kZW5jaWVzLiAgVGhlIGNvbG9yIHR5cGUgb2YgdGhlIGJhY2tncm91bmQgc2hvdWxkIGJlIHJlY29yZGVkIGluCisgICAgKiBwbmdfc2V0X2JhY2tncm91bmQsIGFsb25nIHdpdGggdGhlIGJpdCBkZXB0aCwgdGhlbiB0aGUgY29kZSBoYXMgYSByZWNvcmQKKyAgICAqIG9mIGV4YWN0bHkgd2hhdCBjb2xvciBzcGFjZSB0aGUgYmFja2dyb3VuZCBpcyBjdXJyZW50bHkgaW4uCisgICAgKi8KKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0JBQ0tHUk9VTkRfRVhQQU5EKSAhPSAwKQorICAgeworICAgICAgLyogUE5HX0JBQ0tHUk9VTkRfRVhQQU5EOiB0aGUgYmFja2dyb3VuZCBpcyBpbiB0aGUgZmlsZSBjb2xvciBzcGFjZSwgc28gaWYKKyAgICAgICAqIHRoZSBmaWxlIHdhcyBncmF5c2NhbGUgdGhlIGJhY2tncm91bmQgdmFsdWUgaXMgZ3JheS4KKyAgICAgICAqLworICAgICAgaWYgKChwbmdfcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpID09IDApCisgICAgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19CQUNLR1JPVU5EX0lTX0dSQVk7CisgICB9CisKKyAgIGVsc2UgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQ09NUE9TRSkgIT0gMCkKKyAgIHsKKyAgICAgIC8qIFBOR19DT01QT1NFOiBwbmdfc2V0X2JhY2tncm91bmQgd2FzIGNhbGxlZCB3aXRoIG5lZWRfZXhwYW5kIGZhbHNlLAorICAgICAgICogc28gdGhlIGNvbG9yIGlzIGluIHRoZSBjb2xvciBzcGFjZSBvZiB0aGUgb3V0cHV0IG9yIHBuZ19zZXRfYWxwaGFfbW9kZQorICAgICAgICogd2FzIGNhbGxlZCBhbmQgdGhlIGNvbG9yIGlzIGJsYWNrLiAgSWdub3JlIFJHQl9UT19HUkFZIGJlY2F1c2UgdGhhdAorICAgICAgICogaGFwcGVucyBiZWZvcmUgR1JBWV9UT19SR0IuCisgICAgICAgKi8KKyAgICAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0dSQVlfVE9fUkdCKSAhPSAwKQorICAgICAgeworICAgICAgICAgaWYgKHBuZ19wdHItPmJhY2tncm91bmQucmVkID09IHBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4gJiYKKyAgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCA9PSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUpCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19CQUNLR1JPVU5EX0lTX0dSQVk7CisgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZDsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKyNlbmRpZiAvKiBSRUFEX0VYUEFORCAmJiBSRUFEX0JBQ0tHUk9VTkQgKi8KKyNlbmRpZiAvKiBSRUFEX0dSQVlfVE9fUkdCICovCisKKyAgIC8qIEZvciBpbmRleGVkIFBORyBkYXRhIChQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKSBtYW55IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbnMKKyAgICAqIGNhbiBiZSBwZXJmb3JtZWQgZGlyZWN0bHkgb24gdGhlIHBhbGV0dGUsIGFuZCBzb21lIChzdWNoIGFzIHJnYiB0byBncmF5KQorICAgICogY2FuIGJlIG9wdGltaXplZCBpbnNpZGUgdGhlIHBhbGV0dGUuICBUaGlzIGlzIHBhcnRpY3VsYXJseSB0cnVlIG9mIHRoZQorICAgICogY29tcG9zaXRlIChiYWNrZ3JvdW5kIGFuZCBhbHBoYSkgc3R1ZmYsIHdoaWNoIGNhbiBiZSBwcmV0dHkgbXVjaCBhbGwgZG9uZQorICAgICogaW4gdGhlIHBhbGV0dGUgZXZlbiBpZiB0aGUgcmVzdWx0IGlzIGV4cGFuZGVkIHRvIFJHQiBvciBncmF5IGFmdGVyd2FyZC4KKyAgICAqCisgICAgKiBOT1RFOiB0aGlzIGlzIE5vdCBZZXQgSW1wbGVtZW50ZWQsIHRoZSBjb2RlIGJlaGF2ZXMgYXMgaW4gMS41LjEgYW5kCisgICAgKiBlYXJsaWVyIGFuZCB0aGUgcGFsZXR0ZSBzdHVmZiBpcyBhY3R1YWxseSBoYW5kbGVkIG9uIHRoZSBmaXJzdCByb3cuICBUaGlzCisgICAgKiBsZWFkcyB0byB0aGUgcmVwb3J0ZWQgYnVnIHRoYXQgdGhlIHBhbGV0dGUgcmV0dXJuZWQgYnkgcG5nX2dldF9QTFRFIGlzIG5vdAorICAgICogdXBkYXRlZC4KKyAgICAqLworICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgICAgIHBuZ19pbml0X3BhbGV0dGVfdHJhbnNmb3JtYXRpb25zKHBuZ19wdHIpOworCisgICBlbHNlCisgICAgICBwbmdfaW5pdF9yZ2JfdHJhbnNmb3JtYXRpb25zKHBuZ19wdHIpOworCisjaWYgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkgJiYgXAorICAgZGVmaW5lZChQTkdfUkVBRF9FWFBBTkRfMTZfU1VQUE9SVEVEKQorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRVhQQU5EXzE2KSAhPSAwICYmCisgICAgICAgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19DT01QT1NFKSAhPSAwICYmCisgICAgICAgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19CQUNLR1JPVU5EX0VYUEFORCkgPT0gMCAmJgorICAgICAgIHBuZ19wdHItPmJpdF9kZXB0aCAhPSAxNikKKyAgIHsKKyAgICAgIC8qIFRPRE86IGZpeCB0aGlzLiAgQmVjYXVzZSB0aGUgZXhwYW5kXzE2IG9wZXJhdGlvbiBpcyBhZnRlciB0aGUgY29tcG9zZQorICAgICAgICogaGFuZGxpbmcgdGhlIGJhY2tncm91bmQgY29sb3IgbXVzdCBiZSA4LCBub3QgMTYsIGJpdHMgZGVlcCwgYnV0IHRoZQorICAgICAgICogYXBwbGljYXRpb24gd2lsbCBzdXBwbHkgYSAxNi1iaXQgdmFsdWUgc28gcmVkdWNlIGl0IGhlcmUuCisgICAgICAgKgorICAgICAgICogVGhlIFBOR19CQUNLR1JPVU5EX0VYUEFORCBjb2RlIGFib3ZlIGRvZXMgbm90IGV4cGFuZCB0byAxNiBiaXRzIGF0CisgICAgICAgKiBwcmVzZW50LCBzbyB0aGF0IGNhc2UgaXMgb2sgKHVudGlsIGRvX2V4cGFuZF8xNiBpcyBtb3ZlZC4pCisgICAgICAgKgorICAgICAgICogTk9URTogdGhpcyBkaXNjYXJkcyB0aGUgbG93IDE2IGJpdHMgb2YgdGhlIHVzZXIgc3VwcGxpZWQgYmFja2dyb3VuZAorICAgICAgICogY29sb3IsIGJ1dCB1bnRpbCBleHBhbmRfMTYgd29ya3MgcHJvcGVybHkgdGhlcmUgaXMgbm8gY2hvaWNlIQorICAgICAgICovCisjICAgICBkZWZpbmUgQ0hPUCh4KSAoeCk9KChwbmdfdWludF8xNilQTkdfRElWMjU3KHgpKQorICAgICAgQ0hPUChwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCk7CisgICAgICBDSE9QKHBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4pOworICAgICAgQ0hPUChwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUpOworICAgICAgQ0hPUChwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkpOworIyAgICAgdW5kZWYgQ0hPUAorICAgfQorI2VuZGlmIC8qIFJFQURfQkFDS0dST1VORCAmJiBSRUFEX0VYUEFORF8xNiAqLworCisjaWYgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkgJiYgXAorICAgKGRlZmluZWQoUE5HX1JFQURfU0NBTEVfMTZfVE9fOF9TVVBQT1JURUQpIHx8IFwKKyAgIGRlZmluZWQoUE5HX1JFQURfU1RSSVBfMTZfVE9fOF9TVVBQT1JURUQpKQorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiAoUE5HXzE2X1RPXzh8UE5HX1NDQUxFXzE2X1RPXzgpKSAhPSAwICYmCisgICAgICAgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19DT01QT1NFKSAhPSAwICYmCisgICAgICAgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19CQUNLR1JPVU5EX0VYUEFORCkgPT0gMCAmJgorICAgICAgIHBuZ19wdHItPmJpdF9kZXB0aCA9PSAxNikKKyAgIHsKKyAgICAgIC8qIE9uIHRoZSBvdGhlciBoYW5kLCBpZiBhIDE2LWJpdCBmaWxlIGlzIHRvIGJlIHJlZHVjZWQgdG8gOC1iaXRzIHBlcgorICAgICAgICogY29tcG9uZW50IHRoaXMgd2lsbCBhbHNvIGhhcHBlbiBhZnRlciBQTkdfQ09NUE9TRSBhbmQgc28gdGhlIGJhY2tncm91bmQKKyAgICAgICAqIGNvbG9yIG11c3QgYmUgcHJlLWV4cGFuZGVkIGhlcmUuCisgICAgICAgKgorICAgICAgICogVE9ETzogZml4IHRoaXMgdG9vLgorICAgICAgICovCisgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCA9IChwbmdfdWludF8xNikocG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgKiAyNTcpOworICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbiA9CisgICAgICAgICAocG5nX3VpbnRfMTYpKHBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4gKiAyNTcpOworICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlID0gKHBuZ191aW50XzE2KShwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUgKiAyNTcpOworICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ncmF5ID0gKHBuZ191aW50XzE2KShwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkgKiAyNTcpOworICAgfQorI2VuZGlmCisKKyAgIC8qIE5PVEU6IGJlbG93ICdQTkdfUkVBRF9BTFBIQV9NT0RFX1NVUFBPUlRFRCcgaXMgcHJlc3VtZWQgdG8gYWxzbyBlbmFibGUgdGhlCisgICAgKiBiYWNrZ3JvdW5kIHN1cHBvcnQgKHNlZSB0aGUgY29tbWVudHMgaW4gc2NyaXB0cy9wbmdsaWJjb25mLmRmYSksIHRoaXMKKyAgICAqIGFsbG93cyBwcmUtbXVsdGlwbGljYXRpb24gb2YgdGhlIGFscGhhIGNoYW5uZWwgdG8gYmUgaW1wbGVtZW50ZWQgYXMKKyAgICAqIGNvbXBvc2l0aW5nIG9uIGJsYWNrLiAgVGhpcyBpcyBwcm9iYWJseSBzdWItb3B0aW1hbCBhbmQgaGFzIGJlZW4gZG9uZSBpbgorICAgICogMS41LjQgYmV0YXMgc2ltcGx5IHRvIGVuYWJsZSBleHRlcm5hbCBjcml0aXF1ZSBhbmQgdGVzdGluZyAoaS5lLiB0bworICAgICogaW1wbGVtZW50IHRoZSBuZXcgQVBJIHF1aWNrbHksIHdpdGhvdXQgbG90cyBvZiBpbnRlcm5hbCBjaGFuZ2VzLikKKyAgICAqLworCisjaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECisjICBpZmRlZiBQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRAorICAgICAgLyogSW5jbHVkZXMgQUxQSEFfTU9ERSAqLworICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZF8xID0gcG5nX3B0ci0+YmFja2dyb3VuZDsKKyMgIGVuZGlmCisKKyAgIC8qIFRoaXMgbmVlZHMgdG8gY2hhbmdlIC0gaW4gdGhlIHBhbGV0dGUgaW1hZ2UgY2FzZSBhIHdob2xlIHNldCBvZiB0YWJsZXMgYXJlCisgICAgKiBidWlsdCB3aGVuIGl0IHdvdWxkIGJlIHF1aWNrZXIgdG8ganVzdCBjYWxjdWxhdGUgdGhlIGNvcnJlY3QgdmFsdWUgZm9yCisgICAgKiBlYWNoIHBhbGV0dGUgZW50cnkgZGlyZWN0bHkuICBBbHNvLCB0aGUgdGVzdCBpcyB0b28gdHJpY2t5IC0gd2h5IGNoZWNrCisgICAgKiBQTkdfUkdCX1RPX0dSQVkgaWYgUE5HX0dBTU1BIGlzIG5vdCBzZXQ/ICBUaGUgYW5zd2VyIHNlZW1zIHRvIGJlIHRoYXQKKyAgICAqIFBOR19HQU1NQSBpcyBjYW5jZWxsZWQgZXZlbiBpZiB0aGUgZ2FtbWEgaXMga25vd24/ICBUaGUgdGVzdCBleGNsdWRlcyB0aGUKKyAgICAqIFBOR19DT01QT1NFIGNhc2UsIHNvIGFwcGFyZW50bHkgaWYgdGhlcmUgaXMgbm8gKm92ZXJhbGwqIGdhbW1hIGNvcnJlY3Rpb24KKyAgICAqIHRoZSBnYW1tYSB0YWJsZXMgd2lsbCBub3QgYmUgYnVpbHQgZXZlbiBpZiBjb21wb3NpdGlvbiBpcyByZXF1aXJlZCBvbiBhCisgICAgKiBnYW1tYSBlbmNvZGVkIHZhbHVlLgorICAgICoKKyAgICAqIEluIDEuNS40IHRoaXMgaXMgYWRkcmVzc2VkIGJlbG93IGJ5IGFuIGFkZGl0aW9uYWwgY2hlY2sgb24gdGhlIGluZGl2aWR1YWwKKyAgICAqIGZpbGUgZ2FtbWEgLSBpZiBpdCBpcyBub3QgMS4wIGJvdGggUkdCX1RPX0dSQVkgYW5kIENPTVBPU0UgbmVlZCB0aGUKKyAgICAqIHRhYmxlcy4KKyAgICAqLworICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfR0FNTUEpICE9IDAgfHwKKyAgICAgICAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19SR0JfVE9fR1JBWSkgIT0gMCAmJgorICAgICAgICAocG5nX2dhbW1hX3NpZ25pZmljYW50KHBuZ19wdHItPmNvbG9yc3BhY2UuZ2FtbWEpICE9IDAgfHwKKyAgICAgICAgIHBuZ19nYW1tYV9zaWduaWZpY2FudChwbmdfcHRyLT5zY3JlZW5fZ2FtbWEpICE9IDApKSB8fAorICAgICAgICAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19DT01QT1NFKSAhPSAwICYmCisgICAgICAgICAocG5nX2dhbW1hX3NpZ25pZmljYW50KHBuZ19wdHItPmNvbG9yc3BhY2UuZ2FtbWEpICE9IDAgfHwKKyAgICAgICAgICBwbmdfZ2FtbWFfc2lnbmlmaWNhbnQocG5nX3B0ci0+c2NyZWVuX2dhbW1hKSAhPSAwCisjICBpZmRlZiBQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRAorICAgICAgICAgfHwgKHBuZ19wdHItPmJhY2tncm91bmRfZ2FtbWFfdHlwZSA9PSBQTkdfQkFDS0dST1VORF9HQU1NQV9VTklRVUUgJiYKKyAgICAgICAgICAgcG5nX2dhbW1hX3NpZ25pZmljYW50KHBuZ19wdHItPmJhY2tncm91bmRfZ2FtbWEpICE9IDApCisjICBlbmRpZgorICAgICAgICApKSB8fCAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19FTkNPREVfQUxQSEEpICE9IDAgJiYKKyAgICAgICBwbmdfZ2FtbWFfc2lnbmlmaWNhbnQocG5nX3B0ci0+c2NyZWVuX2dhbW1hKSAhPSAwKSkKKyAgIHsKKyAgICAgIHBuZ19idWlsZF9nYW1tYV90YWJsZShwbmdfcHRyLCBwbmdfcHRyLT5iaXRfZGVwdGgpOworCisjaWZkZWYgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQKKyAgICAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0NPTVBPU0UpICE9IDApCisgICAgICB7CisgICAgICAgICAvKiBJc3N1ZSBhIHdhcm5pbmcgYWJvdXQgdGhpcyBjb21iaW5hdGlvbjogYmVjYXVzZSBSR0JfVE9fR1JBWSBpcworICAgICAgICAgICogb3B0aW1pemVkIHRvIGRvIHRoZSBnYW1tYSB0cmFuc2Zvcm0gaWYgcHJlc2VudCB5ZXQgZG9fYmFja2dyb3VuZCBoYXMKKyAgICAgICAgICAqIHRvIGRvIHRoZSBzYW1lIHRoaW5nIGlmIGJvdGggb3B0aW9ucyBhcmUgc2V0IGEKKyAgICAgICAgICAqIGRvdWJsZS1nYW1tYS1jb3JyZWN0aW9uIGhhcHBlbnMuICBUaGlzIGlzIHRydWUgaW4gYWxsIHZlcnNpb25zIG9mCisgICAgICAgICAgKiBsaWJwbmcgdG8gZGF0ZS4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUkdCX1RPX0dSQVkpICE9IDApCisgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAgICAgICAgImxpYnBuZyBkb2VzIG5vdCBzdXBwb3J0IGdhbW1hK2JhY2tncm91bmQrcmdiX3RvX2dyYXkiKTsKKworICAgICAgICAgaWYgKChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpICE9IDApCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBXZSBkb24ndCBnZXQgdG8gaGVyZSB1bmxlc3MgdGhlcmUgaXMgYSB0Uk5TIGNodW5rIHdpdGggbm9uLW9wYXF1ZQorICAgICAgICAgICAgICogZW50cmllcyAtIHNlZSB0aGUgY2hlY2tpbmcgY29kZSBhdCB0aGUgc3RhcnQgb2YgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcG5nX2NvbG9yIGJhY2ssIGJhY2tfMTsKKyAgICAgICAgICAgIHBuZ19jb2xvcnAgcGFsZXR0ZSA9IHBuZ19wdHItPnBhbGV0dGU7CisgICAgICAgICAgICBpbnQgbnVtX3BhbGV0dGUgPSBwbmdfcHRyLT5udW1fcGFsZXR0ZTsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgaWYgKHBuZ19wdHItPmJhY2tncm91bmRfZ2FtbWFfdHlwZSA9PSBQTkdfQkFDS0dST1VORF9HQU1NQV9GSUxFKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICBiYWNrLnJlZCA9IHBuZ19wdHItPmdhbW1hX3RhYmxlW3BuZ19wdHItPmJhY2tncm91bmQucmVkXTsKKyAgICAgICAgICAgICAgIGJhY2suZ3JlZW4gPSBwbmdfcHRyLT5nYW1tYV90YWJsZVtwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuXTsKKyAgICAgICAgICAgICAgIGJhY2suYmx1ZSA9IHBuZ19wdHItPmdhbW1hX3RhYmxlW3BuZ19wdHItPmJhY2tncm91bmQuYmx1ZV07CisKKyAgICAgICAgICAgICAgIGJhY2tfMS5yZWQgPSBwbmdfcHRyLT5nYW1tYV90b18xW3BuZ19wdHItPmJhY2tncm91bmQucmVkXTsKKyAgICAgICAgICAgICAgIGJhY2tfMS5ncmVlbiA9IHBuZ19wdHItPmdhbW1hX3RvXzFbcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbl07CisgICAgICAgICAgICAgICBiYWNrXzEuYmx1ZSA9IHBuZ19wdHItPmdhbW1hX3RvXzFbcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19maXhlZF9wb2ludCBnLCBnczsKKworICAgICAgICAgICAgICAgc3dpdGNoIChwbmdfcHRyLT5iYWNrZ3JvdW5kX2dhbW1hX3R5cGUpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBjYXNlIFBOR19CQUNLR1JPVU5EX0dBTU1BX1NDUkVFTjoKKyAgICAgICAgICAgICAgICAgICAgIGcgPSAocG5nX3B0ci0+c2NyZWVuX2dhbW1hKTsKKyAgICAgICAgICAgICAgICAgICAgIGdzID0gUE5HX0ZQXzE7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgY2FzZSBQTkdfQkFDS0dST1VORF9HQU1NQV9GSUxFOgorICAgICAgICAgICAgICAgICAgICAgZyA9IHBuZ19yZWNpcHJvY2FsKHBuZ19wdHItPmNvbG9yc3BhY2UuZ2FtbWEpOworICAgICAgICAgICAgICAgICAgICAgZ3MgPSBwbmdfcmVjaXByb2NhbDIocG5nX3B0ci0+Y29sb3JzcGFjZS5nYW1tYSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnNjcmVlbl9nYW1tYSk7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgY2FzZSBQTkdfQkFDS0dST1VORF9HQU1NQV9VTklRVUU6CisgICAgICAgICAgICAgICAgICAgICBnID0gcG5nX3JlY2lwcm9jYWwocG5nX3B0ci0+YmFja2dyb3VuZF9nYW1tYSk7CisgICAgICAgICAgICAgICAgICAgICBncyA9IHBuZ19yZWNpcHJvY2FsMihwbmdfcHRyLT5iYWNrZ3JvdW5kX2dhbW1hLAorICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+c2NyZWVuX2dhbW1hKTsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgIGcgPSBQTkdfRlBfMTsgICAgLyogYmFja18xICovCisgICAgICAgICAgICAgICAgICAgICBncyA9IFBOR19GUF8xOyAgIC8qIGJhY2sgKi8KKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBpZiAocG5nX2dhbW1hX3NpZ25pZmljYW50KGdzKSAhPSAwKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgYmFjay5yZWQgPSBwbmdfZ2FtbWFfOGJpdF9jb3JyZWN0KHBuZ19wdHItPmJhY2tncm91bmQucmVkLAorICAgICAgICAgICAgICAgICAgICAgIGdzKTsKKyAgICAgICAgICAgICAgICAgIGJhY2suZ3JlZW4gPSBwbmdfZ2FtbWFfOGJpdF9jb3JyZWN0KHBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgZ3MpOworICAgICAgICAgICAgICAgICAgYmFjay5ibHVlID0gcG5nX2dhbW1hXzhiaXRfY29ycmVjdChwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUsCisgICAgICAgICAgICAgICAgICAgICAgZ3MpOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBiYWNrLnJlZCAgID0gKHBuZ19ieXRlKXBuZ19wdHItPmJhY2tncm91bmQucmVkOworICAgICAgICAgICAgICAgICAgYmFjay5ncmVlbiA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuOworICAgICAgICAgICAgICAgICAgYmFjay5ibHVlICA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWU7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGlmIChwbmdfZ2FtbWFfc2lnbmlmaWNhbnQoZykgIT0gMCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGJhY2tfMS5yZWQgPSBwbmdfZ2FtbWFfOGJpdF9jb3JyZWN0KHBuZ19wdHItPmJhY2tncm91bmQucmVkLAorICAgICAgICAgICAgICAgICAgICAgZyk7CisgICAgICAgICAgICAgICAgICBiYWNrXzEuZ3JlZW4gPSBwbmdfZ2FtbWFfOGJpdF9jb3JyZWN0KAorICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbiwgZyk7CisgICAgICAgICAgICAgICAgICBiYWNrXzEuYmx1ZSA9IHBuZ19nYW1tYV84Yml0X2NvcnJlY3QocG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlLAorICAgICAgICAgICAgICAgICAgICAgZyk7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGJhY2tfMS5yZWQgICA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZDsKKyAgICAgICAgICAgICAgICAgIGJhY2tfMS5ncmVlbiA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuOworICAgICAgICAgICAgICAgICAgYmFja18xLmJsdWUgID0gKHBuZ19ieXRlKXBuZ19wdHItPmJhY2tncm91bmQuYmx1ZTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9wYWxldHRlOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZiAoaSA8IChpbnQpcG5nX3B0ci0+bnVtX3RyYW5zICYmCisgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+dHJhbnNfYWxwaGFbaV0gIT0gMHhmZikKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmIChwbmdfcHRyLT50cmFuc19hbHBoYVtpXSA9PSAwKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZVtpXSA9IGJhY2s7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBlbHNlIC8qIGlmIChwbmdfcHRyLT50cmFuc19hbHBoYVtpXSAhPSAweGZmKSAqLworICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgcG5nX2J5dGUgdiwgdzsKKworICAgICAgICAgICAgICAgICAgICAgdiA9IHBuZ19wdHItPmdhbW1hX3RvXzFbcGFsZXR0ZVtpXS5yZWRdOworICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZSh3LCB2LCBwbmdfcHRyLT50cmFuc19hbHBoYVtpXSwgYmFja18xLnJlZCk7CisgICAgICAgICAgICAgICAgICAgICBwYWxldHRlW2ldLnJlZCA9IHBuZ19wdHItPmdhbW1hX2Zyb21fMVt3XTsKKworICAgICAgICAgICAgICAgICAgICAgdiA9IHBuZ19wdHItPmdhbW1hX3RvXzFbcGFsZXR0ZVtpXS5ncmVlbl07CisgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlKHcsIHYsIHBuZ19wdHItPnRyYW5zX2FscGhhW2ldLCBiYWNrXzEuZ3JlZW4pOworICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZVtpXS5ncmVlbiA9IHBuZ19wdHItPmdhbW1hX2Zyb21fMVt3XTsKKworICAgICAgICAgICAgICAgICAgICAgdiA9IHBuZ19wdHItPmdhbW1hX3RvXzFbcGFsZXR0ZVtpXS5ibHVlXTsKKyAgICAgICAgICAgICAgICAgICAgIHBuZ19jb21wb3NpdGUodywgdiwgcG5nX3B0ci0+dHJhbnNfYWxwaGFbaV0sIGJhY2tfMS5ibHVlKTsKKyAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGVbaV0uYmx1ZSA9IHBuZ19wdHItPmdhbW1hX2Zyb21fMVt3XTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBhbGV0dGVbaV0ucmVkID0gcG5nX3B0ci0+Z2FtbWFfdGFibGVbcGFsZXR0ZVtpXS5yZWRdOworICAgICAgICAgICAgICAgICAgcGFsZXR0ZVtpXS5ncmVlbiA9IHBuZ19wdHItPmdhbW1hX3RhYmxlW3BhbGV0dGVbaV0uZ3JlZW5dOworICAgICAgICAgICAgICAgICAgcGFsZXR0ZVtpXS5ibHVlID0gcG5nX3B0ci0+Z2FtbWFfdGFibGVbcGFsZXR0ZVtpXS5ibHVlXTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogUHJldmVudCB0aGUgdHJhbnNmb3JtYXRpb25zIGJlaW5nIGRvbmUgYWdhaW4uCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogTk9URTogdGhpcyBpcyBoaWdobHkgZHViaW91czsgaXQgcmVtb3ZlcyB0aGUgdHJhbnNmb3JtYXRpb25zIGluCisgICAgICAgICAgICAgKiBwbGFjZS4gIFRoaXMgc2VlbXMgaW5jb25zaXN0ZW50IHdpdGggdGhlIGdlbmVyYWwgdHJlYXRtZW50IG9mIHRoZQorICAgICAgICAgICAgICogdHJhbnNmb3JtYXRpb25zIGVsc2V3aGVyZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICY9IH4oUE5HX0NPTVBPU0UgfCBQTkdfR0FNTUEpOworICAgICAgICAgfSAvKiBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgKi8KKworICAgICAgICAgLyogaWYgKHBuZ19wdHItPmJhY2tncm91bmRfZ2FtbWFfdHlwZSE9UE5HX0JBQ0tHUk9VTkRfR0FNTUFfVU5LTk9XTikgKi8KKyAgICAgICAgIGVsc2UgLyogY29sb3JfdHlwZSAhPSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFICovCisgICAgICAgICB7CisgICAgICAgICAgICBpbnQgZ3Nfc2lnLCBnX3NpZzsKKyAgICAgICAgICAgIHBuZ19maXhlZF9wb2ludCBnID0gUE5HX0ZQXzE7ICAvKiBDb3JyZWN0aW9uIHRvIGxpbmVhciAqLworICAgICAgICAgICAgcG5nX2ZpeGVkX3BvaW50IGdzID0gUE5HX0ZQXzE7IC8qIENvcnJlY3Rpb24gdG8gc2NyZWVuICovCisKKyAgICAgICAgICAgIHN3aXRjaCAocG5nX3B0ci0+YmFja2dyb3VuZF9nYW1tYV90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgY2FzZSBQTkdfQkFDS0dST1VORF9HQU1NQV9TQ1JFRU46CisgICAgICAgICAgICAgICAgICBnID0gcG5nX3B0ci0+c2NyZWVuX2dhbW1hOworICAgICAgICAgICAgICAgICAgLyogZ3MgPSBQTkdfRlBfMTsgKi8KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICBjYXNlIFBOR19CQUNLR1JPVU5EX0dBTU1BX0ZJTEU6CisgICAgICAgICAgICAgICAgICBnID0gcG5nX3JlY2lwcm9jYWwocG5nX3B0ci0+Y29sb3JzcGFjZS5nYW1tYSk7CisgICAgICAgICAgICAgICAgICBncyA9IHBuZ19yZWNpcHJvY2FsMihwbmdfcHRyLT5jb2xvcnNwYWNlLmdhbW1hLAorICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+c2NyZWVuX2dhbW1hKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICBjYXNlIFBOR19CQUNLR1JPVU5EX0dBTU1BX1VOSVFVRToKKyAgICAgICAgICAgICAgICAgIGcgPSBwbmdfcmVjaXByb2NhbChwbmdfcHRyLT5iYWNrZ3JvdW5kX2dhbW1hKTsKKyAgICAgICAgICAgICAgICAgIGdzID0gcG5nX3JlY2lwcm9jYWwyKHBuZ19wdHItPmJhY2tncm91bmRfZ2FtbWEsCisgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+c2NyZWVuX2dhbW1hKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJpbnZhbGlkIGJhY2tncm91bmQgZ2FtbWEgdHlwZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnX3NpZyA9IHBuZ19nYW1tYV9zaWduaWZpY2FudChnKTsKKyAgICAgICAgICAgIGdzX3NpZyA9IHBuZ19nYW1tYV9zaWduaWZpY2FudChncyk7CisKKyAgICAgICAgICAgIGlmIChnX3NpZyAhPSAwKQorICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZF8xLmdyYXkgPSBwbmdfZ2FtbWFfY29ycmVjdChwbmdfcHRyLAorICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQuZ3JheSwgZyk7CisKKyAgICAgICAgICAgIGlmIChnc19zaWcgIT0gMCkKKyAgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQuZ3JheSA9IHBuZ19nYW1tYV9jb3JyZWN0KHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ncmF5LCBncyk7CisKKyAgICAgICAgICAgIGlmICgocG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgIT0gcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbikgfHwKKyAgICAgICAgICAgICAgICAocG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgIT0gcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlKSB8fAorICAgICAgICAgICAgICAgIChwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCAhPSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLyogUkdCIG9yIFJHQkEgd2l0aCBjb2xvciBiYWNrZ3JvdW5kICovCisgICAgICAgICAgICAgICBpZiAoZ19zaWcgIT0gMCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmRfMS5yZWQgPSBwbmdfZ2FtbWFfY29ycmVjdChwbmdfcHRyLAorICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQucmVkLCBnKTsKKworICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZF8xLmdyZWVuID0gcG5nX2dhbW1hX2NvcnJlY3QocG5nX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuLCBnKTsKKworICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZF8xLmJsdWUgPSBwbmdfZ2FtbWFfY29ycmVjdChwbmdfcHRyLAorICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQuYmx1ZSwgZyk7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGlmIChnc19zaWcgIT0gMCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQucmVkID0gcG5nX2dhbW1hX2NvcnJlY3QocG5nX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCwgZ3MpOworCisgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuID0gcG5nX2dhbW1hX2NvcnJlY3QocG5nX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuLCBncyk7CisKKyAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQuYmx1ZSA9IHBuZ19nYW1tYV9jb3JyZWN0KHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlLCBncyk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8qIEdSQVksIEdSQVkgQUxQSEEsIFJHQiwgb3IgUkdCQSB3aXRoIGdyYXkgYmFja2dyb3VuZCAqLworICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZF8xLnJlZCA9IHBuZ19wdHItPmJhY2tncm91bmRfMS5ncmVlbgorICAgICAgICAgICAgICAgICAgID0gcG5nX3B0ci0+YmFja2dyb3VuZF8xLmJsdWUgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kXzEuZ3JheTsKKworICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuCisgICAgICAgICAgICAgICAgICAgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFRoZSBiYWNrZ3JvdW5kIGlzIG5vdyBpbiBzY3JlZW4gZ2FtbWE6ICovCisgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kX2dhbW1hX3R5cGUgPSBQTkdfQkFDS0dST1VORF9HQU1NQV9TQ1JFRU47CisgICAgICAgICB9IC8qIGNvbG9yX3R5cGUgIT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSAqLworICAgICAgfS8qIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19CQUNLR1JPVU5EICovCisKKyAgICAgIGVsc2UKKyAgICAgIC8qIFRyYW5zZm9ybWF0aW9uIGRvZXMgbm90IGluY2x1ZGUgUE5HX0JBQ0tHUk9VTkQgKi8KKyNlbmRpZiAvKiBSRUFEX0JBQ0tHUk9VTkQgKi8KKyAgICAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUKKyNpZmRlZiBQTkdfUkVBRF9SR0JfVE9fR1JBWV9TVVBQT1JURUQKKyAgICAgICAgIC8qIFJHQl9UT19HUkFZIG5lZWRzIHRvIGhhdmUgbm9uLWdhbW1hLWNvcnJlY3RlZCB2YWx1ZXMhICovCisgICAgICAgICAmJiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19FWFBBTkQpID09IDAgfHwKKyAgICAgICAgIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUkdCX1RPX0dSQVkpID09IDApCisjZW5kaWYKKyAgICAgICAgICkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19jb2xvcnAgcGFsZXR0ZSA9IHBuZ19wdHItPnBhbGV0dGU7CisgICAgICAgICBpbnQgbnVtX3BhbGV0dGUgPSBwbmdfcHRyLT5udW1fcGFsZXR0ZTsKKyAgICAgICAgIGludCBpOworCisgICAgICAgICAvKiBOT1RFOiB0aGVyZSBhcmUgb3RoZXIgdHJhbnNmb3JtYXRpb25zIHRoYXQgc2hvdWxkIHByb2JhYmx5IGJlIGluCisgICAgICAgICAgKiBoZXJlIHRvby4KKyAgICAgICAgICAqLworICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9wYWxldHRlOyBpKyspCisgICAgICAgICB7CisgICAgICAgICAgICBwYWxldHRlW2ldLnJlZCA9IHBuZ19wdHItPmdhbW1hX3RhYmxlW3BhbGV0dGVbaV0ucmVkXTsKKyAgICAgICAgICAgIHBhbGV0dGVbaV0uZ3JlZW4gPSBwbmdfcHRyLT5nYW1tYV90YWJsZVtwYWxldHRlW2ldLmdyZWVuXTsKKyAgICAgICAgICAgIHBhbGV0dGVbaV0uYmx1ZSA9IHBuZ19wdHItPmdhbW1hX3RhYmxlW3BhbGV0dGVbaV0uYmx1ZV07CisgICAgICAgICB9CisKKyAgICAgICAgIC8qIERvbmUgdGhlIGdhbW1hIGNvcnJlY3Rpb24uICovCisgICAgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJj0gflBOR19HQU1NQTsKKyAgICAgIH0gLyogY29sb3JfdHlwZSA9PSBQQUxFVFRFICYmICFQTkdfQkFDS0dST1VORCB0cmFuc2Zvcm1hdGlvbiAqLworICAgfQorI2lmZGVmIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVECisgICBlbHNlCisjZW5kaWYKKyNlbmRpZiAvKiBSRUFEX0dBTU1BICovCisKKyNpZmRlZiBQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRAorICAgLyogTm8gR0FNTUEgdHJhbnNmb3JtYXRpb24gKHNlZSB0aGUgaGFuZ2luZyBlbHNlIDQgbGluZXMgYWJvdmUpICovCisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19DT01QT1NFKSAhPSAwICYmCisgICAgICAgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkpCisgICB7CisgICAgICBpbnQgaTsKKyAgICAgIGludCBpc3RvcCA9IChpbnQpcG5nX3B0ci0+bnVtX3RyYW5zOworICAgICAgcG5nX2NvbG9yIGJhY2s7CisgICAgICBwbmdfY29sb3JwIHBhbGV0dGUgPSBwbmdfcHRyLT5wYWxldHRlOworCisgICAgICBiYWNrLnJlZCAgID0gKHBuZ19ieXRlKXBuZ19wdHItPmJhY2tncm91bmQucmVkOworICAgICAgYmFjay5ncmVlbiA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuOworICAgICAgYmFjay5ibHVlICA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWU7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBpc3RvcDsgaSsrKQorICAgICAgeworICAgICAgICAgaWYgKHBuZ19wdHItPnRyYW5zX2FscGhhW2ldID09IDApCisgICAgICAgICB7CisgICAgICAgICAgICBwYWxldHRlW2ldID0gYmFjazsKKyAgICAgICAgIH0KKworICAgICAgICAgZWxzZSBpZiAocG5nX3B0ci0+dHJhbnNfYWxwaGFbaV0gIT0gMHhmZikKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoZSBwbmdfY29tcG9zaXRlKCkgbWFjcm8gaXMgZGVmaW5lZCBpbiBwbmcuaCAqLworICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZShwYWxldHRlW2ldLnJlZCwgcGFsZXR0ZVtpXS5yZWQsCisgICAgICAgICAgICAgICAgcG5nX3B0ci0+dHJhbnNfYWxwaGFbaV0sIGJhY2sucmVkKTsKKworICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZShwYWxldHRlW2ldLmdyZWVuLCBwYWxldHRlW2ldLmdyZWVuLAorICAgICAgICAgICAgICAgIHBuZ19wdHItPnRyYW5zX2FscGhhW2ldLCBiYWNrLmdyZWVuKTsKKworICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZShwYWxldHRlW2ldLmJsdWUsIHBhbGV0dGVbaV0uYmx1ZSwKKyAgICAgICAgICAgICAgICBwbmdfcHRyLT50cmFuc19hbHBoYVtpXSwgYmFjay5ibHVlKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICY9IH5QTkdfQ09NUE9TRTsKKyAgIH0KKyNlbmRpZiAvKiBSRUFEX0JBQ0tHUk9VTkQgKi8KKworI2lmZGVmIFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRAorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfU0hJRlQpICE9IDAgJiYKKyAgICAgICAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0VYUEFORCkgPT0gMCAmJgorICAgICAgIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpKQorICAgeworICAgICAgaW50IGk7CisgICAgICBpbnQgaXN0b3AgPSBwbmdfcHRyLT5udW1fcGFsZXR0ZTsKKyAgICAgIGludCBzaGlmdCA9IDggLSBwbmdfcHRyLT5zaWdfYml0LnJlZDsKKworICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICY9IH5QTkdfU0hJRlQ7CisKKyAgICAgIC8qIHNpZ25pZmljYW50IGJpdHMgY2FuIGJlIGluIHRoZSByYW5nZSAxIHRvIDcgZm9yIGEgbWVhbmluZnVsIHJlc3VsdCwgaWYKKyAgICAgICAqIHRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYml0cyBpcyAwIHRoZW4gbm8gc2hpZnQgaXMgZG9uZSAodGhpcyBpcyBhbgorICAgICAgICogZXJyb3IgY29uZGl0aW9uIHdoaWNoIGlzIHNpbGVudGx5IGlnbm9yZWQuKQorICAgICAgICovCisgICAgICBpZiAoc2hpZnQgPiAwICYmIHNoaWZ0IDwgOCkKKyAgICAgICAgIGZvciAoaT0wOyBpPGlzdG9wOyArK2kpCisgICAgICAgICB7CisgICAgICAgICAgICBpbnQgY29tcG9uZW50ID0gcG5nX3B0ci0+cGFsZXR0ZVtpXS5yZWQ7CisKKyAgICAgICAgICAgIGNvbXBvbmVudCA+Pj0gc2hpZnQ7CisgICAgICAgICAgICBwbmdfcHRyLT5wYWxldHRlW2ldLnJlZCA9IChwbmdfYnl0ZSljb21wb25lbnQ7CisgICAgICAgICB9CisKKyAgICAgIHNoaWZ0ID0gOCAtIHBuZ19wdHItPnNpZ19iaXQuZ3JlZW47CisgICAgICBpZiAoc2hpZnQgPiAwICYmIHNoaWZ0IDwgOCkKKyAgICAgICAgIGZvciAoaT0wOyBpPGlzdG9wOyArK2kpCisgICAgICAgICB7CisgICAgICAgICAgICBpbnQgY29tcG9uZW50ID0gcG5nX3B0ci0+cGFsZXR0ZVtpXS5ncmVlbjsKKworICAgICAgICAgICAgY29tcG9uZW50ID4+PSBzaGlmdDsKKyAgICAgICAgICAgIHBuZ19wdHItPnBhbGV0dGVbaV0uZ3JlZW4gPSAocG5nX2J5dGUpY29tcG9uZW50OworICAgICAgICAgfQorCisgICAgICBzaGlmdCA9IDggLSBwbmdfcHRyLT5zaWdfYml0LmJsdWU7CisgICAgICBpZiAoc2hpZnQgPiAwICYmIHNoaWZ0IDwgOCkKKyAgICAgICAgIGZvciAoaT0wOyBpPGlzdG9wOyArK2kpCisgICAgICAgICB7CisgICAgICAgICAgICBpbnQgY29tcG9uZW50ID0gcG5nX3B0ci0+cGFsZXR0ZVtpXS5ibHVlOworCisgICAgICAgICAgICBjb21wb25lbnQgPj49IHNoaWZ0OworICAgICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZVtpXS5ibHVlID0gKHBuZ19ieXRlKWNvbXBvbmVudDsKKyAgICAgICAgIH0KKyAgIH0KKyNlbmRpZiAgLyogUkVBRF9TSElGVCAqLworfQorCisvKiBNb2RpZnkgdGhlIGluZm8gc3RydWN0dXJlIHRvIHJlZmxlY3QgdGhlIHRyYW5zZm9ybWF0aW9ucy4gIFRoZQorICogaW5mbyBzaG91bGQgYmUgdXBkYXRlZCBzbyBhIFBORyBmaWxlIGNvdWxkIGJlIHdyaXR0ZW4gd2l0aCBpdCwKKyAqIGFzc3VtaW5nIHRoZSB0cmFuc2Zvcm1hdGlvbnMgcmVzdWx0IGluIHZhbGlkIFBORyBkYXRhLgorICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19yZWFkX3RyYW5zZm9ybV9pbmZvKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfcmVhZF90cmFuc2Zvcm1faW5mbyIpOworCisjaWZkZWYgUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRAorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRVhQQU5EKSAhPSAwKQorICAgeworICAgICAgaWYgKGluZm9fcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCisgICAgICB7CisgICAgICAgICAvKiBUaGlzIGNoZWNrIG11c3QgbWF0Y2ggd2hhdCBhY3R1YWxseSBoYXBwZW5zIGluCisgICAgICAgICAgKiBwbmdfZG9fZXhwYW5kX3BhbGV0dGU7IGlmIGl0IGV2ZXIgY2hlY2tzIHRoZSB0Uk5TIGNodW5rIHRvIHNlZSBpZgorICAgICAgICAgICogaXQgaXMgYWxsIG9wYXF1ZSB3ZSBtdXN0IGRvIHRoZSBzYW1lIChhdCBwcmVzZW50IGl0IGRvZXMgbm90LikKKyAgICAgICAgICAqLworICAgICAgICAgaWYgKHBuZ19wdHItPm51bV90cmFucyA+IDApCisgICAgICAgICAgICBpbmZvX3B0ci0+Y29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQTsKKworICAgICAgICAgZWxzZQorICAgICAgICAgICAgaW5mb19wdHItPmNvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9SR0I7CisKKyAgICAgICAgIGluZm9fcHRyLT5iaXRfZGVwdGggPSA4OworICAgICAgICAgaW5mb19wdHItPm51bV90cmFucyA9IDA7CisKKyAgICAgICAgIGlmIChwbmdfcHRyLT5wYWxldHRlID09IE5VTEwpCisgICAgICAgICAgICBwbmdfZXJyb3IgKHBuZ19wdHIsICJQYWxldHRlIGlzIE5VTEwgaW4gaW5kZXhlZCBpbWFnZSIpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgaWYgKHBuZ19wdHItPm51bV90cmFucyAhPSAwKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRVhQQU5EX3RSTlMpICE9IDApCisgICAgICAgICAgICAgICBpbmZvX3B0ci0+Y29sb3JfdHlwZSB8PSBQTkdfQ09MT1JfTUFTS19BTFBIQTsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmIChpbmZvX3B0ci0+Yml0X2RlcHRoIDwgOCkKKyAgICAgICAgICAgIGluZm9fcHRyLT5iaXRfZGVwdGggPSA4OworCisgICAgICAgICBpbmZvX3B0ci0+bnVtX3RyYW5zID0gMDsKKyAgICAgIH0KKyAgIH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkgfHxcCisgICBkZWZpbmVkKFBOR19SRUFEX0FMUEhBX01PREVfU1VQUE9SVEVEKQorICAgLyogVGhlIGZvbGxvd2luZyBpcyBhbG1vc3QgY2VydGFpbmx5IHdyb25nIHVubGVzcyB0aGUgYmFja2dyb3VuZCB2YWx1ZSBpcyBpbgorICAgICogdGhlIHNjcmVlbiBzcGFjZSEKKyAgICAqLworICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQ09NUE9TRSkgIT0gMCkKKyAgICAgIGluZm9fcHRyLT5iYWNrZ3JvdW5kID0gcG5nX3B0ci0+YmFja2dyb3VuZDsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECisgICAvKiBUaGUgZm9sbG93aW5nIHVzZWQgdG8gYmUgY29uZGl0aW9uYWwgb24gUE5HX0dBTU1BIChwcmlvciB0byAxLjUuNCksCisgICAgKiBob3dldmVyIGl0IHNlZW1zIHRoYXQgdGhlIGNvZGUgaW4gcG5nX2luaXRfcmVhZF90cmFuc2Zvcm1hdGlvbnMsIHdoaWNoIGhhcworICAgICogYmVlbiBjYWxsZWQgYmVmb3JlIHRoaXMgZnJvbSBwbmdfcmVhZF91cGRhdGVfaW5mby0+cG5nX3JlYWRfc3RhcnRfcm93CisgICAgKiBzb21ldGltZXMgZG9lcyB0aGUgZ2FtbWEgdHJhbnNmb3JtIGFuZCBjYW5jZWxzIHRoZSBmbGFnLgorICAgICoKKyAgICAqIFRPRE86IHRoaXMgbG9va3Mgd3Jvbmc7IHRoZSBpbmZvX3B0ciBzaG91bGQgZW5kIHVwIHdpdGggYSBnYW1tYSBlcXVhbCB0bworICAgICogdGhlIHNjcmVlbl9nYW1tYSB2YWx1ZS4gIFRoZSBmb2xsb3dpbmcgcHJvYmFibHkgcmVzdWx0cyBpbiB3ZWlyZG5lc3MgaWYKKyAgICAqIHRoZSBpbmZvX3B0ciBpcyB1c2VkIGJ5IHRoZSBhcHAgYWZ0ZXIgdGhlIHJvd3MgaGF2ZSBiZWVuIHJlYWQuCisgICAgKi8KKyAgIGluZm9fcHRyLT5jb2xvcnNwYWNlLmdhbW1hID0gcG5nX3B0ci0+Y29sb3JzcGFjZS5nYW1tYTsKKyNlbmRpZgorCisgICBpZiAoaW5mb19wdHItPmJpdF9kZXB0aCA9PSAxNikKKyAgIHsKKyMgIGlmZGVmIFBOR19SRUFEXzE2QklUX1NVUFBPUlRFRAorIyAgICAgaWZkZWYgUE5HX1JFQURfU0NBTEVfMTZfVE9fOF9TVVBQT1JURUQKKyAgICAgICAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1NDQUxFXzE2X1RPXzgpICE9IDApCisgICAgICAgICAgICBpbmZvX3B0ci0+Yml0X2RlcHRoID0gODsKKyMgICAgIGVuZGlmCisKKyMgICAgIGlmZGVmIFBOR19SRUFEX1NUUklQXzE2X1RPXzhfU1VQUE9SVEVECisgICAgICAgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR18xNl9UT184KSAhPSAwKQorICAgICAgICAgICAgaW5mb19wdHItPmJpdF9kZXB0aCA9IDg7CisjICAgICBlbmRpZgorCisjICBlbHNlCisgICAgICAvKiBObyAxNi1iaXQgc3VwcG9ydDogZm9yY2UgY2hvcHBpbmcgMTYtYml0IGlucHV0IGRvd24gdG8gOCwgaW4gdGhpcyBjYXNlCisgICAgICAgKiB0aGUgYXBwIHByb2dyYW0gY2FuIGNob3NlIGlmIGJvdGggQVBJcyBhcmUgYXZhaWxhYmxlIGJ5IHNldHRpbmcgdGhlCisgICAgICAgKiBjb3JyZWN0IHNjYWxpbmcgdG8gdXNlLgorICAgICAgICovCisjICAgICBpZmRlZiBQTkdfUkVBRF9TVFJJUF8xNl9UT184X1NVUFBPUlRFRAorICAgICAgICAgLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBwcmV2aW91cyB2ZXJzaW9ucyB1c2UgdGhlIHN0cmlwIG1ldGhvZCBieQorICAgICAgICAgICogZGVmYXVsdC4gIFRoaXMgY29kZSB3b3JrcyBiZWNhdXNlIGlmIFBOR19TQ0FMRV8xNl9UT184IGlzIGFscmVhZHkKKyAgICAgICAgICAqIHNldCB0aGUgY29kZSBiZWxvdyB3aWxsIGRvIHRoYXQgaW4gcHJlZmVyZW5jZSB0byB0aGUgY2hvcC4KKyAgICAgICAgICAqLworICAgICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR18xNl9UT184OworICAgICAgICAgaW5mb19wdHItPmJpdF9kZXB0aCA9IDg7CisjICAgICBlbHNlCisKKyMgICAgICAgIGlmZGVmIFBOR19SRUFEX1NDQUxFXzE2X1RPXzhfU1VQUE9SVEVECisgICAgICAgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX1NDQUxFXzE2X1RPXzg7CisgICAgICAgICAgICBpbmZvX3B0ci0+Yml0X2RlcHRoID0gODsKKyMgICAgICAgIGVsc2UKKworICAgICAgICAgICAgQ09ORklHVVJBVElPTiBFUlJPUjogeW91IG11c3QgZW5hYmxlIGF0IGxlYXN0IG9uZSAxNiB0byA4IG1ldGhvZAorIyAgICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyNlbmRpZiAvKiAhUkVBRF8xNkJJVCAqLworICAgfQorCisjaWZkZWYgUE5HX1JFQURfR1JBWV9UT19SR0JfU1VQUE9SVEVECisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19HUkFZX1RPX1JHQikgIT0gMCkKKyAgICAgIGluZm9fcHRyLT5jb2xvcl90eXBlID0gKHBuZ19ieXRlKShpbmZvX3B0ci0+Y29sb3JfdHlwZSB8CisgICAgICAgICBQTkdfQ09MT1JfTUFTS19DT0xPUik7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX1JHQl9UT19HUkFZX1NVUFBPUlRFRAorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUkdCX1RPX0dSQVkpICE9IDApCisgICAgICBpbmZvX3B0ci0+Y29sb3JfdHlwZSA9IChwbmdfYnl0ZSkoaW5mb19wdHItPmNvbG9yX3R5cGUgJgorICAgICAgICAgflBOR19DT0xPUl9NQVNLX0NPTE9SKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfUVVBTlRJWkVfU1VQUE9SVEVECisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19RVUFOVElaRSkgIT0gMCkKKyAgIHsKKyAgICAgIGlmICgoKGluZm9fcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikgfHwKKyAgICAgICAgICAoaW5mb19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKSkgJiYKKyAgICAgICAgICBwbmdfcHRyLT5wYWxldHRlX2xvb2t1cCAhPSAwICYmIGluZm9fcHRyLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgIHsKKyAgICAgICAgIGluZm9fcHRyLT5jb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURTsKKyAgICAgIH0KKyAgIH0KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfRVhQQU5EXzE2X1NVUFBPUlRFRAorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRVhQQU5EXzE2KSAhPSAwICYmCisgICAgICAgaW5mb19wdHItPmJpdF9kZXB0aCA9PSA4ICYmCisgICAgICAgaW5mb19wdHItPmNvbG9yX3R5cGUgIT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgIHsKKyAgICAgIGluZm9fcHRyLT5iaXRfZGVwdGggPSAxNjsKKyAgIH0KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfUEFDS19TVVBQT1JURUQKKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1BBQ0spICE9IDAgJiYKKyAgICAgICAoaW5mb19wdHItPmJpdF9kZXB0aCA8IDgpKQorICAgICAgaW5mb19wdHItPmJpdF9kZXB0aCA9IDg7CisjZW5kaWYKKworICAgaWYgKGluZm9fcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCisgICAgICBpbmZvX3B0ci0+Y2hhbm5lbHMgPSAxOworCisgICBlbHNlIGlmICgoaW5mb19wdHItPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikgIT0gMCkKKyAgICAgIGluZm9fcHRyLT5jaGFubmVscyA9IDM7CisKKyAgIGVsc2UKKyAgICAgIGluZm9fcHRyLT5jaGFubmVscyA9IDE7CisKKyNpZmRlZiBQTkdfUkVBRF9TVFJJUF9BTFBIQV9TVVBQT1JURUQKKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1NUUklQX0FMUEhBKSAhPSAwKQorICAgeworICAgICAgaW5mb19wdHItPmNvbG9yX3R5cGUgPSAocG5nX2J5dGUpKGluZm9fcHRyLT5jb2xvcl90eXBlICYKKyAgICAgICAgIH5QTkdfQ09MT1JfTUFTS19BTFBIQSk7CisgICAgICBpbmZvX3B0ci0+bnVtX3RyYW5zID0gMDsKKyAgIH0KKyNlbmRpZgorCisgICBpZiAoKGluZm9fcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpICE9IDApCisgICAgICBpbmZvX3B0ci0+Y2hhbm5lbHMrKzsKKworI2lmZGVmIFBOR19SRUFEX0ZJTExFUl9TVVBQT1JURUQKKyAgIC8qIFNUUklQX0FMUEhBIGFuZCBGSUxMRVIgYWxsb3dlZDogIE1BU0tfQUxQSEEgYml0IHN0cmlwcGVkIGFib3ZlICovCisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19GSUxMRVIpICE9IDAgJiYKKyAgICAgICAoaW5mb19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCIHx8CisgICAgICAgaW5mb19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkpCisgICB7CisgICAgICBpbmZvX3B0ci0+Y2hhbm5lbHMrKzsKKyAgICAgIC8qIElmIGFkZGluZyBhIHRydWUgYWxwaGEgY2hhbm5lbCBub3QganVzdCBmaWxsZXIgKi8KKyAgICAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0FERF9BTFBIQSkgIT0gMCkKKyAgICAgICAgIGluZm9fcHRyLT5jb2xvcl90eXBlIHw9IFBOR19DT0xPUl9NQVNLX0FMUEhBOworICAgfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19VU0VSX1RSQU5TRk9STV9QVFJfU1VQUE9SVEVEKSAmJiBcCitkZWZpbmVkKFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkKKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1VTRVJfVFJBTlNGT1JNKSAhPSAwKQorICAgeworICAgICAgaWYgKHBuZ19wdHItPnVzZXJfdHJhbnNmb3JtX2RlcHRoICE9IDApCisgICAgICAgICBpbmZvX3B0ci0+Yml0X2RlcHRoID0gcG5nX3B0ci0+dXNlcl90cmFuc2Zvcm1fZGVwdGg7CisKKyAgICAgIGlmIChwbmdfcHRyLT51c2VyX3RyYW5zZm9ybV9jaGFubmVscyAhPSAwKQorICAgICAgICAgaW5mb19wdHItPmNoYW5uZWxzID0gcG5nX3B0ci0+dXNlcl90cmFuc2Zvcm1fY2hhbm5lbHM7CisgICB9CisjZW5kaWYKKworICAgaW5mb19wdHItPnBpeGVsX2RlcHRoID0gKHBuZ19ieXRlKShpbmZvX3B0ci0+Y2hhbm5lbHMgKgorICAgICAgIGluZm9fcHRyLT5iaXRfZGVwdGgpOworCisgICBpbmZvX3B0ci0+cm93Ynl0ZXMgPSBQTkdfUk9XQllURVMoaW5mb19wdHItPnBpeGVsX2RlcHRoLCBpbmZvX3B0ci0+d2lkdGgpOworCisgICAvKiBBZGRpbmcgaW4gMS41LjQ6IGNhY2hlIHRoZSBhYm92ZSB2YWx1ZSBpbiBwbmdfc3RydWN0IHNvIHRoYXQgd2UgY2FuIGxhdGVyCisgICAgKiBjaGVjayBpbiBwbmdfcm93Ynl0ZXMgdGhhdCB0aGUgdXNlciBidWZmZXIgd29uJ3QgZ2V0IG92ZXJ3cml0dGVuLiAgTm90ZQorICAgICogdGhhdCB0aGUgZmllbGQgaXMgbm90IGFsd2F5cyBzZXQgLSBpZiBwbmdfcmVhZF91cGRhdGVfaW5mbyBpc24ndCBjYWxsZWQKKyAgICAqIHRoZSBhcHBsaWNhdGlvbiBoYXMgdG8gZWl0aGVyIG5vdCBkbyBhbnkgdHJhbnNmb3JtcyBvciBnZXQgdGhlIGNhbGN1bGF0aW9uCisgICAgKiByaWdodCBpdHNlbGYuCisgICAgKi8KKyAgIHBuZ19wdHItPmluZm9fcm93Ynl0ZXMgPSBpbmZvX3B0ci0+cm93Ynl0ZXM7CisKKyNpZm5kZWYgUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCkKKyAgICAgIHJldHVybjsKKyNlbmRpZgorfQorCisjaWZkZWYgUE5HX1JFQURfUEFDS19TVVBQT1JURUQKKy8qIFVucGFjayBwaXhlbHMgb2YgMSwgMiwgb3IgNCBiaXRzIHBlciBwaXhlbCBpbnRvIDEgYnl0ZSBwZXIgcGl4ZWwsCisgKiB3aXRob3V0IGNoYW5naW5nIHRoZSBhY3R1YWwgdmFsdWVzLiAgVGh1cywgaWYgeW91IGhhZCBhIHJvdyB3aXRoCisgKiBhIGJpdCBkZXB0aCBvZiAxLCB5b3Ugd291bGQgZW5kIHVwIHdpdGggYnl0ZXMgdGhhdCBvbmx5IGNvbnRhaW5lZAorICogdGhlIG51bWJlcnMgMCBvciAxLiAgSWYgeW91IHdvdWxkIHJhdGhlciB0aGV5IGNvbnRhaW4gMCBhbmQgMjU1LCB1c2UKKyAqIHBuZ19kb19zaGlmdCgpIGFmdGVyIHRoaXMuCisgKi8KK3N0YXRpYyB2b2lkCitwbmdfZG9fdW5wYWNrKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3cpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kb191bnBhY2siKTsKKworICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPCA4KQorICAgeworICAgICAgcG5nX3VpbnRfMzIgaTsKKyAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aD1yb3dfaW5mby0+d2lkdGg7CisKKyAgICAgIHN3aXRjaCAocm93X2luZm8tPmJpdF9kZXB0aCkKKyAgICAgIHsKKyAgICAgICAgIGNhc2UgMToKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfc2l6ZV90KSgocm93X3dpZHRoIC0gMSkgPj4gMyk7CisgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggLSAxOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgc2hpZnQgPSA3IC0gKGludCkoKHJvd193aWR0aCArIDcpICYgMHgwNyk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpKCgqc3AgPj4gc2hpZnQpICYgMHgwMSk7CisKKyAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSA3KQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc2hpZnQgPSAwOworICAgICAgICAgICAgICAgICAgc3AtLTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgc2hpZnQrKzsKKworICAgICAgICAgICAgICAgZHAtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBjYXNlIDI6CisgICAgICAgICB7CisKKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfc2l6ZV90KSgocm93X3dpZHRoIC0gMSkgPj4gMik7CisgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggLSAxOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgc2hpZnQgPSAoaW50KSgoMyAtICgocm93X3dpZHRoICsgMykgJiAweDAzKSkgPDwgMSk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpKCgqc3AgPj4gc2hpZnQpICYgMHgwMyk7CisKKyAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSA2KQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc2hpZnQgPSAwOworICAgICAgICAgICAgICAgICAgc3AtLTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgc2hpZnQgKz0gMjsKKworICAgICAgICAgICAgICAgZHAtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBjYXNlIDQ6CisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdCkoKHJvd193aWR0aCAtIDEpID4+IDEpOworICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoIC0gMTsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIHNoaWZ0ID0gKGludCkoKDEgLSAoKHJvd193aWR0aCArIDEpICYgMHgwMSkpIDw8IDIpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSgoKnNwID4+IHNoaWZ0KSAmIDB4MGYpOworCisgICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gNCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gMDsKKyAgICAgICAgICAgICAgICAgIHNwLS07CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gNDsKKworICAgICAgICAgICAgICAgZHAtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICByb3dfaW5mby0+Yml0X2RlcHRoID0gODsKKyAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IChwbmdfYnl0ZSkoOCAqIHJvd19pbmZvLT5jaGFubmVscyk7CisgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSByb3dfd2lkdGggKiByb3dfaW5mby0+Y2hhbm5lbHM7CisgICB9Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRAorLyogUmV2ZXJzZSB0aGUgZWZmZWN0cyBvZiBwbmdfZG9fc2hpZnQuICBUaGlzIHJvdXRpbmUgbWVyZWx5IHNoaWZ0cyB0aGUKKyAqIHBpeGVscyBiYWNrIHRvIHRoZWlyIHNpZ25pZmljYW50IGJpdHMgdmFsdWVzLiAgVGh1cywgaWYgeW91IGhhdmUKKyAqIGEgcm93IG9mIGJpdCBkZXB0aCA4LCBidXQgb25seSA1IGFyZSBzaWduaWZpY2FudCwgdGhpcyB3aWxsIHNoaWZ0CisgKiB0aGUgdmFsdWVzIGJhY2sgdG8gMCB0aHJvdWdoIDMxLgorICovCitzdGF0aWMgdm9pZAorcG5nX2RvX3Vuc2hpZnQocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywKKyAgICBwbmdfY29uc3RfY29sb3JfOHAgc2lnX2JpdHMpCit7CisgICBpbnQgY29sb3JfdHlwZTsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fdW5zaGlmdCIpOworCisgICAvKiBUaGUgcGFsZXR0ZSBjYXNlIGhhcyBhbHJlYWR5IGJlZW4gaGFuZGxlZCBpbiB0aGUgX2luaXQgcm91dGluZS4gKi8KKyAgIGNvbG9yX3R5cGUgPSByb3dfaW5mby0+Y29sb3JfdHlwZTsKKworICAgaWYgKGNvbG9yX3R5cGUgIT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgIHsKKyAgICAgIGludCBzaGlmdFs0XTsKKyAgICAgIGludCBjaGFubmVscyA9IDA7CisgICAgICBpbnQgYml0X2RlcHRoID0gcm93X2luZm8tPmJpdF9kZXB0aDsKKworICAgICAgaWYgKChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpICE9IDApCisgICAgICB7CisgICAgICAgICBzaGlmdFtjaGFubmVscysrXSA9IGJpdF9kZXB0aCAtIHNpZ19iaXRzLT5yZWQ7CisgICAgICAgICBzaGlmdFtjaGFubmVscysrXSA9IGJpdF9kZXB0aCAtIHNpZ19iaXRzLT5ncmVlbjsKKyAgICAgICAgIHNoaWZ0W2NoYW5uZWxzKytdID0gYml0X2RlcHRoIC0gc2lnX2JpdHMtPmJsdWU7CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHNoaWZ0W2NoYW5uZWxzKytdID0gYml0X2RlcHRoIC0gc2lnX2JpdHMtPmdyYXk7CisgICAgICB9CisKKyAgICAgIGlmICgoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKSAhPSAwKQorICAgICAgeworICAgICAgICAgc2hpZnRbY2hhbm5lbHMrK10gPSBiaXRfZGVwdGggLSBzaWdfYml0cy0+YWxwaGE7CisgICAgICB9CisKKyAgICAgIHsKKyAgICAgICAgIGludCBjLCBoYXZlX3NoaWZ0OworCisgICAgICAgICBmb3IgKGMgPSBoYXZlX3NoaWZ0ID0gMDsgYyA8IGNoYW5uZWxzOyArK2MpCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBBIHNoaWZ0IG9mIG1vcmUgdGhhbiB0aGUgYml0IGRlcHRoIGlzIGFuIGVycm9yIGNvbmRpdGlvbiBidXQgaXQKKyAgICAgICAgICAgICAqIGdldHMgaWdub3JlZCBoZXJlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoc2hpZnRbY10gPD0gMCB8fCBzaGlmdFtjXSA+PSBiaXRfZGVwdGgpCisgICAgICAgICAgICAgICBzaGlmdFtjXSA9IDA7CisKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIGhhdmVfc2hpZnQgPSAxOworICAgICAgICAgfQorCisgICAgICAgICBpZiAoaGF2ZV9zaGlmdCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBzd2l0Y2ggKGJpdF9kZXB0aCkKKyAgICAgIHsKKyAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAvKiBNdXN0IGJlIDFicHAgZ3JheTogc2hvdWxkIG5vdCBiZSBoZXJlISAqLworICAgICAgICAgICAgLyogTk9UUkVBQ0hFRCAqLworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgIC8qIE11c3QgYmUgMmJwcCBncmF5ICovCisgICAgICAgICAvKiBhc3NlcnQoY2hhbm5lbHMgPT0gMSAmJiBzaGlmdFswXSA9PSAxKSAqLworICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIGJwID0gcm93OworICAgICAgICAgICAgcG5nX2J5dGVwIGJwX2VuZCA9IGJwICsgcm93X2luZm8tPnJvd2J5dGVzOworCisgICAgICAgICAgICB3aGlsZSAoYnAgPCBicF9lbmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpbnQgYiA9ICgqYnAgPj4gMSkgJiAweDU1OworICAgICAgICAgICAgICAgKmJwKysgPSAocG5nX2J5dGUpYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAvKiBNdXN0IGJlIDRicHAgZ3JheSAqLworICAgICAgICAgLyogYXNzZXJ0KGNoYW5uZWxzID09IDEpICovCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgYnAgPSByb3c7CisgICAgICAgICAgICBwbmdfYnl0ZXAgYnBfZW5kID0gYnAgKyByb3dfaW5mby0+cm93Ynl0ZXM7CisgICAgICAgICAgICBpbnQgZ3JheV9zaGlmdCA9IHNoaWZ0WzBdOworICAgICAgICAgICAgaW50IG1hc2sgPSAgMHhmID4+IGdyYXlfc2hpZnQ7CisKKyAgICAgICAgICAgIG1hc2sgfD0gbWFzayA8PCA0OworCisgICAgICAgICAgICB3aGlsZSAoYnAgPCBicF9lbmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpbnQgYiA9ICgqYnAgPj4gZ3JheV9zaGlmdCkgJiBtYXNrOworICAgICAgICAgICAgICAgKmJwKysgPSAocG5nX2J5dGUpYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBjYXNlIDg6CisgICAgICAgICAvKiBTaW5nbGUgYnl0ZSBjb21wb25lbnRzLCBHLCBHQSwgUkdCLCBSR0JBICovCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgYnAgPSByb3c7CisgICAgICAgICAgICBwbmdfYnl0ZXAgYnBfZW5kID0gYnAgKyByb3dfaW5mby0+cm93Ynl0ZXM7CisgICAgICAgICAgICBpbnQgY2hhbm5lbCA9IDA7CisKKyAgICAgICAgICAgIHdoaWxlIChicCA8IGJwX2VuZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGludCBiID0gKmJwID4+IHNoaWZ0W2NoYW5uZWxdOworICAgICAgICAgICAgICAgaWYgKCsrY2hhbm5lbCA+PSBjaGFubmVscykKKyAgICAgICAgICAgICAgICAgIGNoYW5uZWwgPSAwOworICAgICAgICAgICAgICAgKmJwKysgPSAocG5nX2J5dGUpYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisjaWZkZWYgUE5HX1JFQURfMTZCSVRfU1VQUE9SVEVECisgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgLyogRG91YmxlIGJ5dGUgY29tcG9uZW50cywgRywgR0EsIFJHQiwgUkdCQSAqLworICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIGJwID0gcm93OworICAgICAgICAgICAgcG5nX2J5dGVwIGJwX2VuZCA9IGJwICsgcm93X2luZm8tPnJvd2J5dGVzOworICAgICAgICAgICAgaW50IGNoYW5uZWwgPSAwOworCisgICAgICAgICAgICB3aGlsZSAoYnAgPCBicF9lbmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpbnQgdmFsdWUgPSAoYnBbMF0gPDwgOCkgKyBicFsxXTsKKworICAgICAgICAgICAgICAgdmFsdWUgPj49IHNoaWZ0W2NoYW5uZWxdOworICAgICAgICAgICAgICAgaWYgKCsrY2hhbm5lbCA+PSBjaGFubmVscykKKyAgICAgICAgICAgICAgICAgIGNoYW5uZWwgPSAwOworICAgICAgICAgICAgICAgKmJwKysgPSAocG5nX2J5dGUpKHZhbHVlID4+IDgpOworICAgICAgICAgICAgICAgKmJwKysgPSAocG5nX2J5dGUpdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyNlbmRpZgorICAgICAgfQorICAgfQorfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9TQ0FMRV8xNl9UT184X1NVUFBPUlRFRAorLyogU2NhbGUgcm93cyBvZiBiaXQgZGVwdGggMTYgZG93biB0byA4IGFjY3VyYXRlbHkgKi8KK3N0YXRpYyB2b2lkCitwbmdfZG9fc2NhbGVfMTZfdG9fOChwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fc2NhbGVfMTZfdG9fOCIpOworCisgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikKKyAgIHsKKyAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdzsgLyogc291cmNlICovCisgICAgICBwbmdfYnl0ZXAgZHAgPSByb3c7IC8qIGRlc3RpbmF0aW9uICovCisgICAgICBwbmdfYnl0ZXAgZXAgPSBzcCArIHJvd19pbmZvLT5yb3dieXRlczsgLyogZW5kKzEgKi8KKworICAgICAgd2hpbGUgKHNwIDwgZXApCisgICAgICB7CisgICAgICAgICAvKiBUaGUgaW5wdXQgaXMgYW4gYXJyYXkgb2YgMTYtYml0IGNvbXBvbmVudHMsIHRoZXNlIG11c3QgYmUgc2NhbGVkIHRvCisgICAgICAgICAgKiA4IGJpdHMgZWFjaC4gIEZvciBhIDE2LWJpdCB2YWx1ZSBWIHRoZSByZXF1aXJlZCB2YWx1ZSAoZnJvbSB0aGUgUE5HCisgICAgICAgICAgKiBzcGVjaWZpY2F0aW9uKSBpczoKKyAgICAgICAgICAqCisgICAgICAgICAgKiAgICAoViAqIDI1NSkgLyA2NTUzNQorICAgICAgICAgICoKKyAgICAgICAgICAqIFRoaXMgcmVkdWNlcyB0byByb3VuZChWIC8gMjU3KSwgb3IgZmxvb3IoKFYgKyAxMjguNSkvMjU3KQorICAgICAgICAgICoKKyAgICAgICAgICAqIFJlcHJlc2VudCBWIGFzIHRoZSB0d28gYnl0ZSB2YWx1ZSB2aGkudmxvLiAgTWFrZSBhIGd1ZXNzIHRoYXQgdGhlCisgICAgICAgICAgKiByZXN1bHQgaXMgdGhlIHRvcCBieXRlIG9mIFYsIHZoaSwgdGhlbiB0aGUgY29ycmVjdGlvbiB0byB0aGlzIHZhbHVlCisgICAgICAgICAgKiBpczoKKyAgICAgICAgICAqCisgICAgICAgICAgKiAgICBlcnJvciA9IGZsb29yKCgoVi12aGkudmhpKSArIDEyOC41KSAvIDI1NykKKyAgICAgICAgICAqICAgICAgICAgID0gZmxvb3IoKCh2bG8tdmhpKSArIDEyOC41KSAvIDI1NykKKyAgICAgICAgICAqCisgICAgICAgICAgKiBUaGlzIGNhbiBiZSBhcHByb3hpbWF0ZWQgdXNpbmcgaW50ZWdlciBhcml0aG1ldGljIChhbmQgYSBzaWduZWQKKyAgICAgICAgICAqIHNoaWZ0KToKKyAgICAgICAgICAqCisgICAgICAgICAgKiAgICBlcnJvciA9ICh2bG8tdmhpKzEyOCkgPj4gODsKKyAgICAgICAgICAqCisgICAgICAgICAgKiBUaGUgYXBwcm94aW1hdGUgZGlmZmVycyBmcm9tIHRoZSBleGFjdCBhbnN3ZXIgb25seSB3aGVuICh2bG8tdmhpKSBpcworICAgICAgICAgICogMTI4OyBpdCB0aGVuIGdpdmVzIGEgY29ycmVjdGlvbiBvZiArMSB3aGVuIHRoZSBleGFjdCBjb3JyZWN0aW9uIGlzCisgICAgICAgICAgKiAwLiAgVGhpcyBnaXZlcyAxMjggZXJyb3JzLiAgVGhlIGV4YWN0IGFuc3dlciAoY29ycmVjdCBmb3IgYWxsIDE2LWJpdAorICAgICAgICAgICogaW5wdXQgdmFsdWVzKSBpczoKKyAgICAgICAgICAqCisgICAgICAgICAgKiAgICBlcnJvciA9ICh2bG8tdmhpKzEyOCkqNjU1MzUgPj4gMjQ7CisgICAgICAgICAgKgorICAgICAgICAgICogQW4gYWx0ZXJuYXRpdmUgYXJpdGhtZXRpYyBjYWxjdWxhdGlvbiB3aGljaCBhbHNvIGdpdmVzIG5vIGVycm9ycyBpczoKKyAgICAgICAgICAqCisgICAgICAgICAgKiAgICAoViAqIDI1NSArIDMyODk1KSA+PiAxNgorICAgICAgICAgICovCisKKyAgICAgICAgIHBuZ19pbnRfMzIgdG1wID0gKnNwKys7IC8qIG11c3QgYmUgc2lnbmVkISAqLworICAgICAgICAgdG1wICs9ICgoKGludCkqc3ArKyAtIHRtcCArIDEyOCkgKiA2NTUzNSkgPj4gMjQ7CisgICAgICAgICAqZHArKyA9IChwbmdfYnl0ZSl0bXA7CisgICAgICB9CisKKyAgICAgIHJvd19pbmZvLT5iaXRfZGVwdGggPSA4OworICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gKHBuZ19ieXRlKSg4ICogcm93X2luZm8tPmNoYW5uZWxzKTsKKyAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd19pbmZvLT53aWR0aCAqIHJvd19pbmZvLT5jaGFubmVsczsKKyAgIH0KK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfU1RSSVBfMTZfVE9fOF9TVVBQT1JURUQKK3N0YXRpYyB2b2lkCisvKiBTaW1wbHkgZGlzY2FyZCB0aGUgbG93IGJ5dGUuICBUaGlzIHdhcyB0aGUgZGVmYXVsdCBiZWhhdmlvciBwcmlvcgorICogdG8gbGlicG5nLTEuNS40LgorICovCitwbmdfZG9fY2hvcChwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fY2hvcCIpOworCisgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikKKyAgIHsKKyAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdzsgLyogc291cmNlICovCisgICAgICBwbmdfYnl0ZXAgZHAgPSByb3c7IC8qIGRlc3RpbmF0aW9uICovCisgICAgICBwbmdfYnl0ZXAgZXAgPSBzcCArIHJvd19pbmZvLT5yb3dieXRlczsgLyogZW5kKzEgKi8KKworICAgICAgd2hpbGUgKHNwIDwgZXApCisgICAgICB7CisgICAgICAgICAqZHArKyA9ICpzcDsKKyAgICAgICAgIHNwICs9IDI7IC8qIHNraXAgbG93IGJ5dGUgKi8KKyAgICAgIH0KKworICAgICAgcm93X2luZm8tPmJpdF9kZXB0aCA9IDg7CisgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpKDggKiByb3dfaW5mby0+Y2hhbm5lbHMpOworICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X2luZm8tPndpZHRoICogcm93X2luZm8tPmNoYW5uZWxzOworICAgfQorfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9TV0FQX0FMUEhBX1NVUFBPUlRFRAorc3RhdGljIHZvaWQKK3BuZ19kb19yZWFkX3N3YXBfYWxwaGEocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3JlYWRfc3dhcF9hbHBoYSIpOworCisgICB7CisgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7CisgICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQorICAgICAgeworICAgICAgICAgLyogVGhpcyBjb252ZXJ0cyBmcm9tIFJHQkEgdG8gQVJHQiAqLworICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIHJvd19pbmZvLT5yb3dieXRlczsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwOworICAgICAgICAgICAgcG5nX2J5dGUgc2F2ZTsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIGk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNhdmUgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgKigtLWRwKSA9IHNhdmU7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyNpZmRlZiBQTkdfUkVBRF8xNkJJVF9TVVBQT1JURUQKKyAgICAgICAgIC8qIFRoaXMgY29udmVydHMgZnJvbSBSUkdHQkJBQSB0byBBQVJSR0dCQiAqLworICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgcm93X2luZm8tPnJvd2J5dGVzOworICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3A7CisgICAgICAgICAgICBwbmdfYnl0ZSBzYXZlWzJdOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc2F2ZVswXSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICBzYXZlWzFdID0gKigtLXNwKTsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSBzYXZlWzBdOworICAgICAgICAgICAgICAgKigtLWRwKSA9IHNhdmVbMV07CisgICAgICAgICAgICB9CisgICAgICAgICB9CisjZW5kaWYKKyAgICAgIH0KKworICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkKKyAgICAgIHsKKyAgICAgICAgIC8qIFRoaXMgY29udmVydHMgZnJvbSBHQSB0byBBRyAqLworICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIHJvd19pbmZvLT5yb3dieXRlczsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwOworICAgICAgICAgICAgcG5nX2J5dGUgc2F2ZTsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIGk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNhdmUgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICAqKC0tZHApID0gc2F2ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworI2lmZGVmIFBOR19SRUFEXzE2QklUX1NVUFBPUlRFRAorICAgICAgICAgLyogVGhpcyBjb252ZXJ0cyBmcm9tIEdHQUEgdG8gQUFHRyAqLworICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgcm93X2luZm8tPnJvd2J5dGVzOworICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3A7CisgICAgICAgICAgICBwbmdfYnl0ZSBzYXZlWzJdOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc2F2ZVswXSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICBzYXZlWzFdID0gKigtLXNwKTsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICAqKC0tZHApID0gc2F2ZVswXTsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSBzYXZlWzFdOworICAgICAgICAgICAgfQorICAgICAgICAgfQorI2VuZGlmCisgICAgICB9CisgICB9Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQKK3N0YXRpYyB2b2lkCitwbmdfZG9fcmVhZF9pbnZlcnRfYWxwaGEocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykKK3sKKyAgIHBuZ191aW50XzMyIHJvd193aWR0aDsKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3JlYWRfaW52ZXJ0X2FscGhhIik7CisKKyAgIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKKyAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCisgICB7CisgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQorICAgICAgeworICAgICAgICAgLyogVGhpcyBpbnZlcnRzIHRoZSBhbHBoYSBjaGFubmVsIGluIFJHQkEgKi8KKyAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIHJvd19pbmZvLT5yb3dieXRlczsKKyAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwOworICAgICAgICAgcG5nX3VpbnRfMzIgaTsKKworICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgeworICAgICAgICAgICAgKigtLWRwKSA9IChwbmdfYnl0ZSkoMjU1IC0gKigtLXNwKSk7CisKKy8qICAgICAgICAgIFRoaXMgZG9lcyBub3RoaW5nOgorICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKKyAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgV2UgY2FuIHJlcGxhY2UgaXQgd2l0aDoKKyovCisgICAgICAgICAgICBzcC09MzsKKyAgICAgICAgICAgIGRwPXNwOworICAgICAgICAgfQorICAgICAgfQorCisjaWZkZWYgUE5HX1JFQURfMTZCSVRfU1VQUE9SVEVECisgICAgICAvKiBUaGlzIGludmVydHMgdGhlIGFscGhhIGNoYW5uZWwgaW4gUlJHR0JCQUEgKi8KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIHJvd19pbmZvLT5yb3dieXRlczsKKyAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwOworICAgICAgICAgcG5nX3VpbnRfMzIgaTsKKworICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgeworICAgICAgICAgICAgKigtLWRwKSA9IChwbmdfYnl0ZSkoMjU1IC0gKigtLXNwKSk7CisgICAgICAgICAgICAqKC0tZHApID0gKHBuZ19ieXRlKSgyNTUgLSAqKC0tc3ApKTsKKworLyogICAgICAgICAgVGhpcyBkb2VzIG5vdGhpbmc6CisgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKKyAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKKyAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICBXZSBjYW4gcmVwbGFjZSBpdCB3aXRoOgorKi8KKyAgICAgICAgICAgIHNwLT02OworICAgICAgICAgICAgZHA9c3A7CisgICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyAgIH0KKyAgIGVsc2UgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpCisgICB7CisgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQorICAgICAgeworICAgICAgICAgLyogVGhpcyBpbnZlcnRzIHRoZSBhbHBoYSBjaGFubmVsIGluIEdBICovCisgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyByb3dfaW5mby0+cm93Ynl0ZXM7CisgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcDsKKyAgICAgICAgIHBuZ191aW50XzMyIGk7CisKKyAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgIHsKKyAgICAgICAgICAgICooLS1kcCkgPSAocG5nX2J5dGUpKDI1NSAtICooLS1zcCkpOworICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICB9CisgICAgICB9CisKKyNpZmRlZiBQTkdfUkVBRF8xNkJJVF9TVVBQT1JURUQKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIC8qIFRoaXMgaW52ZXJ0cyB0aGUgYWxwaGEgY2hhbm5lbCBpbiBHR0FBICovCisgICAgICAgICBwbmdfYnl0ZXAgc3AgID0gcm93ICsgcm93X2luZm8tPnJvd2J5dGVzOworICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3A7CisgICAgICAgICBwbmdfdWludF8zMiBpOworCisgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICB7CisgICAgICAgICAgICAqKC0tZHApID0gKHBuZ19ieXRlKSgyNTUgLSAqKC0tc3ApKTsKKyAgICAgICAgICAgICooLS1kcCkgPSAocG5nX2J5dGUpKDI1NSAtICooLS1zcCkpOworLyoKKyAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisqLworICAgICAgICAgICAgc3AtPTI7CisgICAgICAgICAgICBkcD1zcDsKKyAgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZgorICAgfQorfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVECisvKiBBZGQgZmlsbGVyIGNoYW5uZWwgaWYgd2UgaGF2ZSBSR0IgY29sb3IgKi8KK3N0YXRpYyB2b2lkCitwbmdfZG9fcmVhZF9maWxsZXIocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywKKyAgICBwbmdfdWludF8zMiBmaWxsZXIsIHBuZ191aW50XzMyIGZsYWdzKQoreworICAgcG5nX3VpbnRfMzIgaTsKKyAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKKworI2lmZGVmIFBOR19SRUFEXzE2QklUX1NVUFBPUlRFRAorICAgcG5nX2J5dGUgaGlfZmlsbGVyID0gKHBuZ19ieXRlKShmaWxsZXI+PjgpOworI2VuZGlmCisgICBwbmdfYnl0ZSBsb19maWxsZXIgPSAocG5nX2J5dGUpZmlsbGVyOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19yZWFkX2ZpbGxlciIpOworCisgICBpZiAoCisgICAgICAgcm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkKKyAgIHsKKyAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCisgICAgICB7CisgICAgICAgICBpZiAoKGZsYWdzICYgUE5HX0ZMQUdfRklMTEVSX0FGVEVSKSAhPSAwKQorICAgICAgICAgeworICAgICAgICAgICAgLyogVGhpcyBjaGFuZ2VzIHRoZSBkYXRhIGZyb20gRyB0byBHWCAqLworICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoOworICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gIHNwICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoOworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgKigtLWRwKSA9IGxvX2ZpbGxlcjsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKigtLWRwKSA9IGxvX2ZpbGxlcjsKKyAgICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDI7CisgICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAxNjsKKyAgICAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aCAqIDI7CisgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoaXMgY2hhbmdlcyB0aGUgZGF0YSBmcm9tIEcgdG8gWEcgKi8KKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aDsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwICArIChwbmdfc2l6ZV90KXJvd193aWR0aDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgKigtLWRwKSA9IGxvX2ZpbGxlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDI7CisgICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAxNjsKKyAgICAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aCAqIDI7CisgICAgICAgICB9CisgICAgICB9CisKKyNpZmRlZiBQTkdfUkVBRF8xNkJJVF9TVVBQT1JURUQKKyAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpCisgICAgICB7CisgICAgICAgICBpZiAoKGZsYWdzICYgUE5HX0ZMQUdfRklMTEVSX0FGVEVSKSAhPSAwKQorICAgICAgICAgeworICAgICAgICAgICAgLyogVGhpcyBjaGFuZ2VzIHRoZSBkYXRhIGZyb20gR0cgdG8gR0dYWCAqLworICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogMjsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwICArIChwbmdfc2l6ZV90KXJvd193aWR0aCAqIDI7CisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAqKC0tZHApID0gbG9fZmlsbGVyOworICAgICAgICAgICAgICAgKigtLWRwKSA9IGhpX2ZpbGxlcjsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqKC0tZHApID0gbG9fZmlsbGVyOworICAgICAgICAgICAgKigtLWRwKSA9IGhpX2ZpbGxlcjsKKyAgICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDI7CisgICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAzMjsKKyAgICAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aCAqIDQ7CisgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoaXMgY2hhbmdlcyB0aGUgZGF0YSBmcm9tIEdHIHRvIFhYR0cgKi8KKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aCAqIDI7CisgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcCAgKyAocG5nX3NpemVfdClyb3dfd2lkdGggKiAyOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSBsb19maWxsZXI7CisgICAgICAgICAgICAgICAqKC0tZHApID0gaGlfZmlsbGVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcm93X2luZm8tPmNoYW5uZWxzID0gMjsKKyAgICAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IDMyOworICAgICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X3dpZHRoICogNDsKKyAgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZgorICAgfSAvKiBDT0xPUl9UWVBFID09IEdSQVkgKi8KKyAgIGVsc2UgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikKKyAgIHsKKyAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCisgICAgICB7CisgICAgICAgICBpZiAoKGZsYWdzICYgUE5HX0ZMQUdfRklMTEVSX0FGVEVSKSAhPSAwKQorICAgICAgICAgeworICAgICAgICAgICAgLyogVGhpcyBjaGFuZ2VzIHRoZSBkYXRhIGZyb20gUkdCIHRvIFJHQlggKi8KKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aCAqIDM7CisgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcCAgKyAocG5nX3NpemVfdClyb3dfd2lkdGg7CisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAqKC0tZHApID0gbG9fZmlsbGVyOworICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKigtLWRwKSA9IGxvX2ZpbGxlcjsKKyAgICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDQ7CisgICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAzMjsKKyAgICAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aCAqIDQ7CisgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoaXMgY2hhbmdlcyB0aGUgZGF0YSBmcm9tIFJHQiB0byBYUkdCICovCisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggKiAzOworICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3AgKyAocG5nX3NpemVfdClyb3dfd2lkdGg7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICAqKC0tZHApID0gbG9fZmlsbGVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcm93X2luZm8tPmNoYW5uZWxzID0gNDsKKyAgICAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IDMyOworICAgICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X3dpZHRoICogNDsKKyAgICAgICAgIH0KKyAgICAgIH0KKworI2lmZGVmIFBOR19SRUFEXzE2QklUX1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikKKyAgICAgIHsKKyAgICAgICAgIGlmICgoZmxhZ3MgJiBQTkdfRkxBR19GSUxMRVJfQUZURVIpICE9IDApCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGlzIGNoYW5nZXMgdGhlIGRhdGEgZnJvbSBSUkdHQkIgdG8gUlJHR0JCWFggKi8KKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aCAqIDY7CisgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcCAgKyAocG5nX3NpemVfdClyb3dfd2lkdGggKiAyOworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgKigtLWRwKSA9IGxvX2ZpbGxlcjsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSBoaV9maWxsZXI7CisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqKC0tZHApID0gbG9fZmlsbGVyOworICAgICAgICAgICAgKigtLWRwKSA9IGhpX2ZpbGxlcjsKKyAgICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDQ7CisgICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSA2NDsKKyAgICAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aCAqIDg7CisgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoaXMgY2hhbmdlcyB0aGUgZGF0YSBmcm9tIFJSR0dCQiB0byBYWFJSR0dCQiAqLworICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogNjsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwICArIChwbmdfc2l6ZV90KXJvd193aWR0aCAqIDI7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICAqKC0tZHApID0gbG9fZmlsbGVyOworICAgICAgICAgICAgICAgKigtLWRwKSA9IGhpX2ZpbGxlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcm93X2luZm8tPmNoYW5uZWxzID0gNDsKKyAgICAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IDY0OworICAgICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X3dpZHRoICogODsKKyAgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZgorICAgfSAvKiBDT0xPUl9UWVBFID09IFJHQiAqLworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9HUkFZX1RPX1JHQl9TVVBQT1JURUQKKy8qIEV4cGFuZCBncmF5c2NhbGUgZmlsZXMgdG8gUkdCLCB3aXRoIG9yIHdpdGhvdXQgYWxwaGEgKi8KK3N0YXRpYyB2b2lkCitwbmdfZG9fZ3JheV90b19yZ2IocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykKK3sKKyAgIHBuZ191aW50XzMyIGk7CisgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX2dyYXlfdG9fcmdiIik7CisKKyAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID49IDggJiYKKyAgICAgICAocm93X2luZm8tPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikgPT0gMCkKKyAgIHsKKyAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQorICAgICAgeworICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoaXMgY2hhbmdlcyBHIHRvIFJHQiAqLworICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoIC0gMTsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwICArIChwbmdfc2l6ZV90KXJvd193aWR0aCAqIDI7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAqKGRwLS0pID0gKnNwOworICAgICAgICAgICAgICAgKihkcC0tKSA9ICpzcDsKKyAgICAgICAgICAgICAgICooZHAtLSkgPSAqKHNwLS0pOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGlzIGNoYW5nZXMgR0cgdG8gUlJHR0JCICovCisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggKiAyIC0gMTsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwICArIChwbmdfc2l6ZV90KXJvd193aWR0aCAqIDQ7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAqKGRwLS0pID0gKnNwOworICAgICAgICAgICAgICAgKihkcC0tKSA9ICooc3AgLSAxKTsKKyAgICAgICAgICAgICAgICooZHAtLSkgPSAqc3A7CisgICAgICAgICAgICAgICAqKGRwLS0pID0gKihzcCAtIDEpOworICAgICAgICAgICAgICAgKihkcC0tKSA9ICooc3AtLSk7CisgICAgICAgICAgICAgICAqKGRwLS0pID0gKihzcC0tKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkKKyAgICAgIHsKKyAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGlzIGNoYW5nZXMgR0EgdG8gUkdCQSAqLworICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogMiAtIDE7CisgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcCAgKyAocG5nX3NpemVfdClyb3dfd2lkdGggKiAyOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgKihkcC0tKSA9ICooc3AtLSk7CisgICAgICAgICAgICAgICAqKGRwLS0pID0gKnNwOworICAgICAgICAgICAgICAgKihkcC0tKSA9ICpzcDsKKyAgICAgICAgICAgICAgICooZHAtLSkgPSAqKHNwLS0pOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGlzIGNoYW5nZXMgR0dBQSB0byBSUkdHQkJBQSAqLworICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogNCAtIDE7CisgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcCAgKyAocG5nX3NpemVfdClyb3dfd2lkdGggKiA0OworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgKihkcC0tKSA9ICooc3AtLSk7CisgICAgICAgICAgICAgICAqKGRwLS0pID0gKihzcC0tKTsKKyAgICAgICAgICAgICAgICooZHAtLSkgPSAqc3A7CisgICAgICAgICAgICAgICAqKGRwLS0pID0gKihzcCAtIDEpOworICAgICAgICAgICAgICAgKihkcC0tKSA9ICpzcDsKKyAgICAgICAgICAgICAgICooZHAtLSkgPSAqKHNwIC0gMSk7CisgICAgICAgICAgICAgICAqKGRwLS0pID0gKihzcC0tKTsKKyAgICAgICAgICAgICAgICooZHAtLSkgPSAqKHNwLS0pOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgICAgcm93X2luZm8tPmNoYW5uZWxzID0gKHBuZ19ieXRlKShyb3dfaW5mby0+Y2hhbm5lbHMgKyAyKTsKKyAgICAgIHJvd19pbmZvLT5jb2xvcl90eXBlIHw9IFBOR19DT0xPUl9NQVNLX0NPTE9SOworICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gKHBuZ19ieXRlKShyb3dfaW5mby0+Y2hhbm5lbHMgKgorICAgICAgICAgIHJvd19pbmZvLT5iaXRfZGVwdGgpOworICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHJvd19pbmZvLT5waXhlbF9kZXB0aCwgcm93X3dpZHRoKTsKKyAgIH0KK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVECisvKiBSZWR1Y2UgUkdCIGZpbGVzIHRvIGdyYXlzY2FsZSwgd2l0aCBvciB3aXRob3V0IGFscGhhCisgKiB1c2luZyB0aGUgZXF1YXRpb24gZ2l2ZW4gaW4gUG95bnRvbidzIENvbG9yRkFRIG9mIDE5OTgtMDEtMDQgYXQKKyAqIDxodHRwOi8vd3d3LmluZm9yYW1wLm5ldC9+cG95bnRvbi8+ICAoVEhJUyBMSU5LIElTIERFQUQgSnVuZSAyMDA4IGJ1dAorICogdmVyc2lvbnMgZGF0ZWQgMTk5OCB0aHJvdWdoIE5vdmVtYmVyIDIwMDIgaGF2ZSBiZWVuIGFyY2hpdmVkIGF0CisgKiBodHRwOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDAwMDgxNjIzMjU1My9odHRwOi8vd3d3LmluZm9yYW1wLm5ldC8KKyAqIH5wb3ludG9uL25vdGVzL2NvbG91cl9hbmRfZ2FtbWEvQ29sb3JGQVEudHh0ICkKKyAqIENoYXJsZXMgUG95bnRvbiBwb3ludG9uIGF0IHBveW50b24uY29tCisgKgorICogICAgIFkgPSAwLjIxMjY3MSAqIFIgKyAwLjcxNTE2MCAqIEcgKyAwLjA3MjE2OSAqIEIKKyAqCisgKiAgd2hpY2ggY2FuIGJlIGV4cHJlc3NlZCB3aXRoIGludGVnZXJzIGFzCisgKgorICogICAgIFkgPSAoNjk2OSAqIFIgKyAyMzQzNCAqIEcgKyAyMzY1ICogQikvMzI3NjgKKyAqCisgKiBQb3ludG9uJ3MgY3VycmVudCBsaW5rIChhcyBvZiBKYW51YXJ5IDIwMDMgdGhyb3VnaCBKdWx5IDIwMTEpOgorICogPGh0dHA6Ly93d3cucG95bnRvbi5jb20vbm90ZXMvY29sb3VyX2FuZF9nYW1tYS8+CisgKiBoYXMgY2hhbmdlZCB0aGUgbnVtYmVycyBzbGlnaHRseToKKyAqCisgKiAgICAgWSA9IDAuMjEyNipSICsgMC43MTUyKkcgKyAwLjA3MjIqQgorICoKKyAqICB3aGljaCBjYW4gYmUgZXhwcmVzc2VkIHdpdGggaW50ZWdlcnMgYXMKKyAqCisgKiAgICAgWSA9ICg2OTY2ICogUiArIDIzNDM2ICogRyArIDIzNjYgKiBCKS8zMjc2OAorICoKKyAqICBIaXN0b3JpY2FsbHksIGhvd2V2ZXIsIGxpYnBuZyB1c2VzIG51bWJlcnMgZGVyaXZlZCBmcm9tIHRoZSBJVFUtUiBSZWMgNzA5CisgKiAgZW5kIHBvaW50IGNocm9tYXRpY2l0aWVzIGFuZCB0aGUgRDY1IHdoaXRlIHBvaW50LiAgRGVwZW5kaW5nIG9uIHRoZQorICogIHByZWNpc2lvbiB1c2VkIGZvciB0aGUgRDY1IHdoaXRlIHBvaW50IHRoaXMgcHJvZHVjZXMgYSB2YXJpZXR5IG9mIGRpZmZlcmVudAorICogIG51bWJlcnMsIGhvd2V2ZXIgaWYgdGhlIGZvdXIgZGVjaW1hbCBwbGFjZSB2YWx1ZSB1c2VkIGluIElUVS1SIFJlYyA3MDkgaXMKKyAqICB1c2VkICgwLjMxMjcsMC4zMjkwKSB0aGUgWSBjYWxjdWxhdGlvbiB3b3VsZCBiZToKKyAqCisgKiAgICAgWSA9ICg2OTY4ICogUiArIDIzNDM1ICogRyArIDIzNjYgKiBCKS8zMjc2OAorICoKKyAqICBXaGlsZSB0aGlzIGlzIGNvcnJlY3QgdGhlIHJvdW5kaW5nIHJlc3VsdHMgaW4gYW4gb3ZlcmZsb3cgZm9yIHdoaXRlLCBiZWNhdXNlCisgKiAgdGhlIHN1bSBvZiB0aGUgcm91bmRlZCBjb2VmZmljaWVudHMgaXMgMzI3NjksIG5vdCAzMjc2OC4gIENvbnNlcXVlbnRseQorICogIGxpYnBuZyB1c2VzLCBpbnN0ZWFkLCB0aGUgY2xvc2VzdCBub24tb3ZlcmZsb3dpbmcgYXBwcm94aW1hdGlvbjoKKyAqCisgKiAgICAgWSA9ICg2OTY4ICogUiArIDIzNDM0ICogRyArIDIzNjYgKiBCKS8zMjc2OAorICoKKyAqICBTdGFydGluZyB3aXRoIGxpYnBuZy0xLjUuNSwgaWYgdGhlIGltYWdlIGJlaW5nIGNvbnZlcnRlZCBoYXMgYSBjSFJNIGNodW5rCisgKiAgKGluY2x1ZGluZyBhbiBzUkdCIGNodW5rKSB0aGVuIHRoZSBjaHJvbWF0aWNpdGllcyBhcmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlCisgKiAgY29lZmZpY2llbnRzLiAgU2VlIHRoZSBjaHVuayBoYW5kbGluZyBpbiBwbmdydXRpbC5jIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqICBJbiBhbGwgY2FzZXMgdGhlIGNhbGN1bGF0aW9uIGlzIHRvIGJlIGRvbmUgaW4gYSBsaW5lYXIgY29sb3JzcGFjZS4gIElmIG5vCisgKiAgZ2FtbWEgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIHRvIGNvcnJlY3QgdGhlIGVuY29kaW5nIG9mIHRoZSBvcmlnaW5hbCBSR0IKKyAqICB2YWx1ZXMgdGhpcyByZXN1bHRzIGluIGFuIGltcGxpY2l0IGFzc3VtcHRpb24gdGhhdCB0aGUgb3JpZ2luYWwgUE5HIFJHQgorICogIHZhbHVlcyB3ZXJlIGxpbmVhci4KKyAqCisgKiAgT3RoZXIgaW50ZWdlciBjb2VmZmljZW50cyBjYW4gYmUgdXNlZCB2aWEgcG5nX3NldF9yZ2JfdG9fZ3JheSgpLiAgQmVjYXVzZQorICogIHRoZSBBUEkgdGFrZXMganVzdCByZWQgYW5kIGdyZWVuIGNvZWZmaWNpZW50cyB0aGUgYmx1ZSBjb2VmZmljaWVudCBpcworICogIGNhbGN1bGF0ZWQgdG8gbWFrZSB0aGUgc3VtIDMyNzY4LiAgVGhpcyB3aWxsIHJlc3VsdCBpbiBkaWZmZXJlbnQgcm91bmRpbmcKKyAqICB0byB0aGF0IHVzZWQgYWJvdmUuCisgKi8KK3N0YXRpYyBpbnQKK3BuZ19kb19yZ2JfdG9fZ3JheShwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykKKworeworICAgaW50IHJnYl9lcnJvciA9IDA7CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3JnYl90b19ncmF5Iik7CisKKyAgIGlmICgocm93X2luZm8tPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19QQUxFVFRFKSA9PSAwICYmCisgICAgICAgKHJvd19pbmZvLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpICE9IDApCisgICB7CisgICAgICBQTkdfQ09OU1QgcG5nX3VpbnRfMzIgcmMgPSBwbmdfcHRyLT5yZ2JfdG9fZ3JheV9yZWRfY29lZmY7CisgICAgICBQTkdfQ09OU1QgcG5nX3VpbnRfMzIgZ2MgPSBwbmdfcHRyLT5yZ2JfdG9fZ3JheV9ncmVlbl9jb2VmZjsKKyAgICAgIFBOR19DT05TVCBwbmdfdWludF8zMiBiYyA9IDMyNzY4IC0gcmMgLSBnYzsKKyAgICAgIFBOR19DT05TVCBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7CisgICAgICBQTkdfQ09OU1QgaW50IGhhdmVfYWxwaGEgPQorICAgICAgICAgKHJvd19pbmZvLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpICE9IDA7CisKKyAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCisgICAgICB7CisjaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECisgICAgICAgICAvKiBOb3RpY2UgdGhhdCBnYW1tYSB0by9mcm9tIDEgYXJlIG5vdCBuZWNlc3NhcmlseSBpbnZlcnNlcyAoaWYKKyAgICAgICAgICAqIHRoZXJlIGlzIGFuIG92ZXJhbGwgZ2FtbWEgY29ycmVjdGlvbikuICBQcmlvciB0byAxLjUuNSB0aGlzIGNvZGUKKyAgICAgICAgICAqIGNoZWNrZWQgdGhlIGxpbmVhcml6ZWQgdmFsdWVzIGZvciBlcXVhbGl0eTsgdGhpcyBkb2Vzbid0IG1hdGNoCisgICAgICAgICAgKiB0aGUgZG9jdW1lbnRhdGlvbiwgdGhlIG9yaWdpbmFsIHZhbHVlcyBtdXN0IGJlIGNoZWNrZWQuCisgICAgICAgICAgKi8KKyAgICAgICAgIGlmIChwbmdfcHRyLT5nYW1tYV9mcm9tXzEgIT0gTlVMTCAmJiBwbmdfcHRyLT5nYW1tYV90b18xICE9IE5VTEwpCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3c7CisgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3c7CisgICAgICAgICAgICBwbmdfdWludF8zMiBpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfYnl0ZSByZWQgICA9ICooc3ArKyk7CisgICAgICAgICAgICAgICBwbmdfYnl0ZSBncmVlbiA9ICooc3ArKyk7CisgICAgICAgICAgICAgICBwbmdfYnl0ZSBibHVlICA9ICooc3ArKyk7CisKKyAgICAgICAgICAgICAgIGlmIChyZWQgIT0gZ3JlZW4gfHwgcmVkICE9IGJsdWUpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICByZWQgPSBwbmdfcHRyLT5nYW1tYV90b18xW3JlZF07CisgICAgICAgICAgICAgICAgICBncmVlbiA9IHBuZ19wdHItPmdhbW1hX3RvXzFbZ3JlZW5dOworICAgICAgICAgICAgICAgICAgYmx1ZSA9IHBuZ19wdHItPmdhbW1hX3RvXzFbYmx1ZV07CisKKyAgICAgICAgICAgICAgICAgIHJnYl9lcnJvciB8PSAxOworICAgICAgICAgICAgICAgICAgKihkcCsrKSA9IHBuZ19wdHItPmdhbW1hX2Zyb21fMVsKKyAgICAgICAgICAgICAgICAgICAgICAocmMqcmVkICsgZ2MqZ3JlZW4gKyBiYypibHVlICsgMTYzODQpPj4xNV07CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIElmIHRoZXJlIGlzIG5vIG92ZXJhbGwgY29ycmVjdGlvbiB0aGUgdGFibGUgd2lsbCBub3QgYmUKKyAgICAgICAgICAgICAgICAgICAqIHNldC4KKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgaWYgKHBuZ19wdHItPmdhbW1hX3RhYmxlICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICByZWQgPSBwbmdfcHRyLT5nYW1tYV90YWJsZVtyZWRdOworCisgICAgICAgICAgICAgICAgICAqKGRwKyspID0gcmVkOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBpZiAoaGF2ZV9hbHBoYSAhPSAwKQorICAgICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdzsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHJvdzsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIGk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19ieXRlIHJlZCAgID0gKihzcCsrKTsKKyAgICAgICAgICAgICAgIHBuZ19ieXRlIGdyZWVuID0gKihzcCsrKTsKKyAgICAgICAgICAgICAgIHBuZ19ieXRlIGJsdWUgID0gKihzcCsrKTsKKworICAgICAgICAgICAgICAgaWYgKHJlZCAhPSBncmVlbiB8fCByZWQgIT0gYmx1ZSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHJnYl9lcnJvciB8PSAxOworICAgICAgICAgICAgICAgICAgLyogTk9URTogdGhpcyBpcyB0aGUgaGlzdG9yaWNhbCBhcHByb2FjaCB3aGljaCBzaW1wbHkKKyAgICAgICAgICAgICAgICAgICAqIHRydW5jYXRlcyB0aGUgcmVzdWx0cy4KKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgKihkcCsrKSA9IChwbmdfYnl0ZSkoKHJjKnJlZCArIGdjKmdyZWVuICsgYmMqYmx1ZSk+PjE1KTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgKihkcCsrKSA9IHJlZDsKKworICAgICAgICAgICAgICAgaWYgKGhhdmVfYWxwaGEgIT0gMCkKKyAgICAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorCisgICAgICBlbHNlIC8qIFJHQiBiaXRfZGVwdGggPT0gMTYgKi8KKyAgICAgIHsKKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKKyAgICAgICAgIGlmIChwbmdfcHRyLT5nYW1tYV8xNl90b18xICE9IE5VTEwgJiYgcG5nX3B0ci0+Z2FtbWFfMTZfZnJvbV8xICE9IE5VTEwpCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3c7CisgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3c7CisgICAgICAgICAgICBwbmdfdWludF8zMiBpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfdWludF8xNiByZWQsIGdyZWVuLCBibHVlLCB3OworICAgICAgICAgICAgICAgcG5nX2J5dGUgaGksbG87CisKKyAgICAgICAgICAgICAgIGhpPSooc3ApKys7IGxvPSooc3ApKys7IHJlZCAgID0gKHBuZ191aW50XzE2KSgoaGkgPDwgOCkgfCAobG8pKTsKKyAgICAgICAgICAgICAgIGhpPSooc3ApKys7IGxvPSooc3ApKys7IGdyZWVuID0gKHBuZ191aW50XzE2KSgoaGkgPDwgOCkgfCAobG8pKTsKKyAgICAgICAgICAgICAgIGhpPSooc3ApKys7IGxvPSooc3ApKys7IGJsdWUgID0gKHBuZ191aW50XzE2KSgoaGkgPDwgOCkgfCAobG8pKTsKKworICAgICAgICAgICAgICAgaWYgKHJlZCA9PSBncmVlbiAmJiByZWQgPT0gYmx1ZSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmIChwbmdfcHRyLT5nYW1tYV8xNl90YWJsZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgdyA9IHBuZ19wdHItPmdhbW1hXzE2X3RhYmxlWyhyZWQgJiAweGZmKQorICAgICAgICAgICAgICAgICAgICAgICAgID4+IHBuZ19wdHItPmdhbW1hX3NoaWZ0XVtyZWQgPj4gOF07CisKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgIHcgPSByZWQ7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IHJlZF8xICAgPSBwbmdfcHRyLT5nYW1tYV8xNl90b18xWyhyZWQgJiAweGZmKQorICAgICAgICAgICAgICAgICAgICAgID4+IHBuZ19wdHItPmdhbW1hX3NoaWZ0XVtyZWQ+PjhdOworICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgZ3JlZW5fMSA9CisgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+Z2FtbWFfMTZfdG9fMVsoZ3JlZW4gJiAweGZmKSA+PgorICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmdhbW1hX3NoaWZ0XVtncmVlbj4+OF07CisgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBibHVlXzEgID0gcG5nX3B0ci0+Z2FtbWFfMTZfdG9fMVsoYmx1ZSAmIDB4ZmYpCisgICAgICAgICAgICAgICAgICAgICAgPj4gcG5nX3B0ci0+Z2FtbWFfc2hpZnRdW2JsdWU+PjhdOworICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgZ3JheTE2ICA9IChwbmdfdWludF8xNikoKHJjKnJlZF8xICsgZ2MqZ3JlZW5fMQorICAgICAgICAgICAgICAgICAgICAgICsgYmMqYmx1ZV8xICsgMTYzODQpPj4xNSk7CisgICAgICAgICAgICAgICAgICB3ID0gcG5nX3B0ci0+Z2FtbWFfMTZfZnJvbV8xWyhncmF5MTYgJiAweGZmKSA+PgorICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmdhbW1hX3NoaWZ0XVtncmF5MTYgPj4gOF07CisgICAgICAgICAgICAgICAgICByZ2JfZXJyb3IgfD0gMTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgKihkcCsrKSA9IChwbmdfYnl0ZSkoKHc+PjgpICYgMHhmZik7CisgICAgICAgICAgICAgICAqKGRwKyspID0gKHBuZ19ieXRlKSh3ICYgMHhmZik7CisKKyAgICAgICAgICAgICAgIGlmIChoYXZlX2FscGhhICE9IDApCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKKyAgICAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3c7CisgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3c7CisgICAgICAgICAgICBwbmdfdWludF8zMiBpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfdWludF8xNiByZWQsIGdyZWVuLCBibHVlLCBncmF5MTY7CisgICAgICAgICAgICAgICBwbmdfYnl0ZSBoaSxsbzsKKworICAgICAgICAgICAgICAgaGk9KihzcCkrKzsgbG89KihzcCkrKzsgcmVkICAgPSAocG5nX3VpbnRfMTYpKChoaSA8PCA4KSB8IChsbykpOworICAgICAgICAgICAgICAgaGk9KihzcCkrKzsgbG89KihzcCkrKzsgZ3JlZW4gPSAocG5nX3VpbnRfMTYpKChoaSA8PCA4KSB8IChsbykpOworICAgICAgICAgICAgICAgaGk9KihzcCkrKzsgbG89KihzcCkrKzsgYmx1ZSAgPSAocG5nX3VpbnRfMTYpKChoaSA8PCA4KSB8IChsbykpOworCisgICAgICAgICAgICAgICBpZiAocmVkICE9IGdyZWVuIHx8IHJlZCAhPSBibHVlKQorICAgICAgICAgICAgICAgICAgcmdiX2Vycm9yIHw9IDE7CisKKyAgICAgICAgICAgICAgIC8qIEZyb20gMS41LjUgaW4gdGhlIDE2LWJpdCBjYXNlIGRvIHRoZSBhY2N1cmF0ZSBjb252ZXJzaW9uIGV2ZW4KKyAgICAgICAgICAgICAgICAqIGluIHRoZSAnZmFzdCcgY2FzZSAtIHRoaXMgaXMgYmVjYXVzZSB0aGlzIGlzIHdoZXJlIHRoZSBjb2RlCisgICAgICAgICAgICAgICAgKiBlbmRzIHVwIHdoZW4gaGFuZGxpbmcgbGluZWFyIDE2LWJpdCBkYXRhLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICBncmF5MTYgID0gKHBuZ191aW50XzE2KSgocmMqcmVkICsgZ2MqZ3JlZW4gKyBiYypibHVlICsgMTYzODQpID4+CisgICAgICAgICAgICAgICAgICAxNSk7CisgICAgICAgICAgICAgICAqKGRwKyspID0gKHBuZ19ieXRlKSgoZ3JheTE2ID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAqKGRwKyspID0gKHBuZ19ieXRlKShncmF5MTYgJiAweGZmKTsKKworICAgICAgICAgICAgICAgaWYgKGhhdmVfYWxwaGEgIT0gMCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOworICAgICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IChwbmdfYnl0ZSkocm93X2luZm8tPmNoYW5uZWxzIC0gMik7CisgICAgICByb3dfaW5mby0+Y29sb3JfdHlwZSA9IChwbmdfYnl0ZSkocm93X2luZm8tPmNvbG9yX3R5cGUgJgorICAgICAgICAgIH5QTkdfQ09MT1JfTUFTS19DT0xPUik7CisgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpKHJvd19pbmZvLT5jaGFubmVscyAqCisgICAgICAgICAgcm93X2luZm8tPmJpdF9kZXB0aCk7CisgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSBQTkdfUk9XQllURVMocm93X2luZm8tPnBpeGVsX2RlcHRoLCByb3dfd2lkdGgpOworICAgfQorICAgcmV0dXJuIHJnYl9lcnJvcjsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkgfHxcCisgICBkZWZpbmVkKFBOR19SRUFEX0FMUEhBX01PREVfU1VQUE9SVEVEKQorLyogUmVwbGFjZSBhbnkgYWxwaGEgb3IgdHJhbnNwYXJlbmN5IHdpdGggdGhlIHN1cHBsaWVkIGJhY2tncm91bmQgY29sb3IuCisgKiAiYmFja2dyb3VuZCIgaXMgYWxyZWFkeSBpbiB0aGUgc2NyZWVuIGdhbW1hLCB3aGlsZSAiYmFja2dyb3VuZF8xIiBpcworICogYXQgYSBnYW1tYSBvZiAxLjAuICBQYWxldHRlZCBmaWxlcyBoYXZlIGFscmVhZHkgYmVlbiB0YWtlbiBjYXJlIG9mLgorICovCitzdGF0aWMgdm9pZAorcG5nX2RvX2NvbXBvc2UocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywgcG5nX3N0cnVjdHJwIHBuZ19wdHIpCit7CisjaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECisgICBwbmdfY29uc3RfYnl0ZXAgZ2FtbWFfdGFibGUgPSBwbmdfcHRyLT5nYW1tYV90YWJsZTsKKyAgIHBuZ19jb25zdF9ieXRlcCBnYW1tYV9mcm9tXzEgPSBwbmdfcHRyLT5nYW1tYV9mcm9tXzE7CisgICBwbmdfY29uc3RfYnl0ZXAgZ2FtbWFfdG9fMSA9IHBuZ19wdHItPmdhbW1hX3RvXzE7CisgICBwbmdfY29uc3RfdWludF8xNnBwIGdhbW1hXzE2ID0gcG5nX3B0ci0+Z2FtbWFfMTZfdGFibGU7CisgICBwbmdfY29uc3RfdWludF8xNnBwIGdhbW1hXzE2X2Zyb21fMSA9IHBuZ19wdHItPmdhbW1hXzE2X2Zyb21fMTsKKyAgIHBuZ19jb25zdF91aW50XzE2cHAgZ2FtbWFfMTZfdG9fMSA9IHBuZ19wdHItPmdhbW1hXzE2X3RvXzE7CisgICBpbnQgZ2FtbWFfc2hpZnQgPSBwbmdfcHRyLT5nYW1tYV9zaGlmdDsKKyAgIGludCBvcHRpbWl6ZSA9IChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX09QVElNSVpFX0FMUEhBKSAhPSAwOworI2VuZGlmCisKKyAgIHBuZ19ieXRlcCBzcDsKKyAgIHBuZ191aW50XzMyIGk7CisgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7CisgICBpbnQgc2hpZnQ7CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX2NvbXBvc2UiKTsKKworICAgeworICAgICAgc3dpdGNoIChyb3dfaW5mby0+Y29sb3JfdHlwZSkKKyAgICAgIHsKKyAgICAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfR1JBWToKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAocm93X2luZm8tPmJpdF9kZXB0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHNwID0gcm93OworICAgICAgICAgICAgICAgICAgc2hpZnQgPSA3OworICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgaWYgKChwbmdfdWludF8xNikoKCpzcCA+PiBzaGlmdCkgJiAweDAxKQorICAgICAgICAgICAgICAgICAgICAgICAgPT0gcG5nX3B0ci0+dHJhbnNfY29sb3IuZ3JheSkKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0bXAgPSAqc3AgJiAoMHg3ZjdmID4+ICg3IC0gc2hpZnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCB8PSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkgPDwgc2hpZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKHRtcCAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gNzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwKys7CisgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0LS07CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgeworI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAorICAgICAgICAgICAgICAgICAgaWYgKGdhbW1hX3RhYmxlICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKKyAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gNjsKKyAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocG5nX3VpbnRfMTYpKCgqc3AgPj4gc2hpZnQpICYgMHgwMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwbmdfcHRyLT50cmFuc19jb2xvci5ncmF5KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRtcCA9ICpzcCAmICgweDNmM2YgPj4gKDYgLSBzaGlmdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wIHw9IHBuZ19wdHItPmJhY2tncm91bmQuZ3JheSA8PCBzaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkodG1wICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwID0gKCpzcCA+PiBzaGlmdCkgJiAweDAzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGcgPSAoZ2FtbWFfdGFibGUgW3AgfCAocCA8PCAyKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHAgPDwgNCkgfCAocCA8PCA2KV0gPj4gNikgJiAweDAzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRtcCA9ICpzcCAmICgweDNmM2YgPj4gKDYgLSBzaGlmdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wIHw9IGcgPDwgc2hpZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKHRtcCAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0IC09IDI7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgc3AgPSByb3c7CisgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDY7CisgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBuZ191aW50XzE2KSgoKnNwID4+IHNoaWZ0KSAmIDB4MDMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gcG5nX3B0ci0+dHJhbnNfY29sb3IuZ3JheSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0bXAgPSAqc3AgJiAoMHgzZjNmID4+ICg2IC0gc2hpZnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCB8PSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkgPDwgc2hpZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKHRtcCAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0IC09IDI7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgeworI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAorICAgICAgICAgICAgICAgICAgaWYgKGdhbW1hX3RhYmxlICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKKyAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gNDsKKyAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocG5nX3VpbnRfMTYpKCgqc3AgPj4gc2hpZnQpICYgMHgwZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwbmdfcHRyLT50cmFuc19jb2xvci5ncmF5KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRtcCA9ICpzcCAmICgweDBmMGYgPj4gKDQgLSBzaGlmdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wIHw9IHBuZ19wdHItPmJhY2tncm91bmQuZ3JheSA8PCBzaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkodG1wICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwID0gKCpzcCA+PiBzaGlmdCkgJiAweDBmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGcgPSAoZ2FtbWFfdGFibGVbcCB8IChwIDw8IDQpXSA+PiA0KSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRtcCA9ICpzcCAmICgweDBmMGYgPj4gKDQgLSBzaGlmdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wIHw9IGcgPDwgc2hpZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKHRtcCAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0IC09IDQ7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgc3AgPSByb3c7CisgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDQ7CisgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBuZ191aW50XzE2KSgoKnNwID4+IHNoaWZ0KSAmIDB4MGYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gcG5nX3B0ci0+dHJhbnNfY29sb3IuZ3JheSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0bXAgPSAqc3AgJiAoMHgwZjBmID4+ICg0IC0gc2hpZnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCB8PSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkgPDwgc2hpZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKHRtcCAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0IC09IDQ7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgeworI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAorICAgICAgICAgICAgICAgICAgaWYgKGdhbW1hX3RhYmxlICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKKyAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKywgc3ArKykKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqc3AgPT0gcG5nX3B0ci0+dHJhbnNfY29sb3IuZ3JheSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IGdhbW1hX3RhYmxlWypzcF07CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHNwID0gcm93OworICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCsrKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpzcCA9PSBwbmdfcHRyLT50cmFuc19jb2xvci5ncmF5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKXBuZ19wdHItPmJhY2tncm91bmQuZ3JheTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgeworI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAorICAgICAgICAgICAgICAgICAgaWYgKGdhbW1hXzE2ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKKyAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKywgc3AgKz0gMikKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IHY7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSAocG5nX3VpbnRfMTYpKCgoKnNwKSA8PCA4KSArICooc3AgKyAxKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ID09IHBuZ19wdHItPnRyYW5zX2NvbG9yLmdyYXkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCYWNrZ3JvdW5kIGlzIGFscmVhZHkgaW4gc2NyZWVuIGdhbW1hICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKChwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkgPj4gOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkocG5nX3B0ci0+YmFja2dyb3VuZC5ncmF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV8xNlsqKHNwICsgMSkgPj4gZ2FtbWFfc2hpZnRdWypzcF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgc3AgPSByb3c7CisgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyssIHNwICs9IDIpCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiB2OworCisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gKHBuZ191aW50XzE2KSgoKCpzcCkgPDwgOCkgKyAqKHNwICsgMSkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodiA9PSBwbmdfcHRyLT50cmFuc19jb2xvci5ncmF5KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgocG5nX3B0ci0+YmFja2dyb3VuZC5ncmF5ID4+IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpKHBuZ19wdHItPmJhY2tncm91bmQuZ3JheQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1JHQjoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCisgICAgICAgICAgICB7CisjaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECisgICAgICAgICAgICAgICBpZiAoZ2FtbWFfdGFibGUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHNwID0gcm93OworICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCArPSAzKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgaWYgKCpzcCA9PSBwbmdfcHRyLT50cmFuc19jb2xvci5yZWQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPT0gcG5nX3B0ci0+dHJhbnNfY29sb3IuZ3JlZW4gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMikgPT0gcG5nX3B0ci0+dHJhbnNfY29sb3IuYmx1ZSkKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDIpID0gKHBuZ19ieXRlKXBuZ19wdHItPmJhY2tncm91bmQuYmx1ZTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gZ2FtbWFfdGFibGVbKnNwXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IGdhbW1hX3RhYmxlWyooc3AgKyAxKV07CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMikgPSBnYW1tYV90YWJsZVsqKHNwICsgMildOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKKyAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKywgc3AgKz0gMykKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIGlmICgqc3AgPT0gcG5nX3B0ci0+dHJhbnNfY29sb3IucmVkICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDEpID09IHBuZ19wdHItPnRyYW5zX2NvbG9yLmdyZWVuICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDIpID09IHBuZ19wdHItPnRyYW5zX2NvbG9yLmJsdWUpCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAyKSA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWU7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIC8qIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KSAqLworICAgICAgICAgICAgeworI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAorICAgICAgICAgICAgICAgaWYgKGdhbW1hXzE2ICE9IE5VTEwpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKKyAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKywgc3AgKz0gNikKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IHIgPSAocG5nX3VpbnRfMTYpKCgoKnNwKSA8PCA4KSArICooc3AgKyAxKSk7CisKKyAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGcgPSAocG5nX3VpbnRfMTYpKCgoKihzcCArIDIpKSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICsgKihzcCArIDMpKTsKKworICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgYiA9IChwbmdfdWludF8xNikoKCgqKHNwICsgNCkpIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgKyAqKHNwICsgNSkpOworCisgICAgICAgICAgICAgICAgICAgICBpZiAociA9PSBwbmdfcHRyLT50cmFuc19jb2xvci5yZWQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICBnID09IHBuZ19wdHItPnRyYW5zX2NvbG9yLmdyZWVuICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgYiA9PSBwbmdfcHRyLT50cmFuc19jb2xvci5ibHVlKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogQmFja2dyb3VuZCBpcyBhbHJlYWR5IGluIHNjcmVlbiBnYW1tYSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgocG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkocG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAyKSA9IChwbmdfYnl0ZSkoKHBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4gPj4gOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAzKSA9IChwbmdfYnl0ZSkocG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDQpID0gKHBuZ19ieXRlKSgocG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlID4+IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgNSkgPSAocG5nX2J5dGUpKHBuZ19wdHItPmJhY2tncm91bmQuYmx1ZSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiB2ID0gZ2FtbWFfMTZbKihzcCArIDEpID4+IGdhbW1hX3NoaWZ0XVsqc3BdOworICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV8xNlsqKHNwICsgMykgPj4gZ2FtbWFfc2hpZnRdWyooc3AgKyAyKV07CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMikgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMykgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGdhbW1hXzE2Wyooc3AgKyA1KSA+PiBnYW1tYV9zaGlmdF1bKihzcCArIDQpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyA0KSA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyA1KSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHNwID0gcm93OworICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCArPSA2KQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgciA9IChwbmdfdWludF8xNikoKCgqc3ApIDw8IDgpICsgKihzcCArIDEpKTsKKworICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgZyA9IChwbmdfdWludF8xNikoKCgqKHNwICsgMikpIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgKyAqKHNwICsgMykpOworCisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBiID0gKHBuZ191aW50XzE2KSgoKCooc3AgKyA0KSkgPDwgOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICArICooc3AgKyA1KSk7CisKKyAgICAgICAgICAgICAgICAgICAgIGlmIChyID09IHBuZ19wdHItPnRyYW5zX2NvbG9yLnJlZCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIGcgPT0gcG5nX3B0ci0+dHJhbnNfY29sb3IuZ3JlZW4gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICBiID09IHBuZ19wdHItPnRyYW5zX2NvbG9yLmJsdWUpCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKChwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKShwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDIpID0gKHBuZ19ieXRlKSgocG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbiA+PiA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDMpID0gKHBuZ19ieXRlKShwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgNCkgPSAocG5nX2J5dGUpKChwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUgPj4gOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyA1KSA9IChwbmdfYnl0ZSkocG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKworICAgICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBOgorICAgICAgICAgeworICAgICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgICAgICAgIHsKKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKKyAgICAgICAgICAgICAgIGlmIChnYW1tYV90b18xICE9IE5VTEwgJiYgZ2FtbWFfZnJvbV8xICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICBnYW1tYV90YWJsZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3AgPSByb3c7CisgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyssIHNwICs9IDIpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBhID0gKihzcCArIDEpOworCisgICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PSAweGZmKQorICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gZ2FtbWFfdGFibGVbKnNwXTsKKworICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogQmFja2dyb3VuZCBpcyBhbHJlYWR5IGluIHNjcmVlbiBnYW1tYSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKXBuZ19wdHItPmJhY2tncm91bmQuZ3JheTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2J5dGUgdiwgdzsKKworICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGdhbW1hX3RvXzFbKnNwXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19jb21wb3NpdGUodywgdiwgYSwgcG5nX3B0ci0+YmFja2dyb3VuZF8xLmdyYXkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGltaXplID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3ID0gZ2FtbWFfZnJvbV8xW3ddOworICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gdzsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3AgPSByb3c7CisgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyssIHNwICs9IDIpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBwbmdfYnl0ZSBhID0gKihzcCArIDEpOworCisgICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKXBuZ19wdHItPmJhY2tncm91bmQuZ3JheTsKKworICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYSA8IDB4ZmYpCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlKCpzcCwgKnNwLCBhLCBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAvKiBpZiAocG5nX3B0ci0+Yml0X2RlcHRoID09IDE2KSAqLworICAgICAgICAgICAgeworI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAorICAgICAgICAgICAgICAgaWYgKGdhbW1hXzE2ICE9IE5VTEwgJiYgZ2FtbWFfMTZfZnJvbV8xICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICBnYW1tYV8xNl90b18xICE9IE5VTEwpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKKyAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKywgc3AgKz0gNCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGEgPSAocG5nX3VpbnRfMTYpKCgoKihzcCArIDIpKSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICsgKihzcCArIDMpKTsKKworICAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT0gKHBuZ191aW50XzE2KTB4ZmZmZikKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IHY7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV8xNlsqKHNwICsgMSkgPj4gZ2FtbWFfc2hpZnRdWypzcF07CisgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogQmFja2dyb3VuZCBpcyBhbHJlYWR5IGluIHNjcmVlbiBnYW1tYSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgocG5nX3B0ci0+YmFja2dyb3VuZC5ncmF5ID4+IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpKHBuZ19wdHItPmJhY2tncm91bmQuZ3JheSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBnLCB2LCB3OworCisgICAgICAgICAgICAgICAgICAgICAgICBnID0gZ2FtbWFfMTZfdG9fMVsqKHNwICsgMSkgPj4gZ2FtbWFfc2hpZnRdWypzcF07CisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlXzE2KHYsIGcsIGEsIHBuZ19wdHItPmJhY2tncm91bmRfMS5ncmF5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpbWl6ZSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdyA9IHY7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3ID0gZ2FtbWFfMTZfZnJvbV8xWyh2ICYgMHhmZikgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYW1tYV9zaGlmdF1bdiA+PiA4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoKHcgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkodyAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKKyAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKywgc3AgKz0gNCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGEgPSAocG5nX3VpbnRfMTYpKCgoKihzcCArIDIpKSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICsgKihzcCArIDMpKTsKKworICAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoKHBuZ19wdHItPmJhY2tncm91bmQuZ3JheSA+PiA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKShwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYSA8IDB4ZmZmZikKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGcsIHY7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGcgPSAocG5nX3VpbnRfMTYpKCgoKnNwKSA8PCA4KSArICooc3AgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlXzE2KHYsIGcsIGEsIHBuZ19wdHItPmJhY2tncm91bmQuZ3JheSk7CisgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQToKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCisgICAgICAgICAgICB7CisjaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECisgICAgICAgICAgICAgICBpZiAoZ2FtbWFfdG9fMSAhPSBOVUxMICYmIGdhbW1hX2Zyb21fMSAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgICAgZ2FtbWFfdGFibGUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHNwID0gcm93OworICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCArPSA0KQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgcG5nX2J5dGUgYSA9ICooc3AgKyAzKTsKKworICAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT0gMHhmZikKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IGdhbW1hX3RhYmxlWypzcF07CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSBnYW1tYV90YWJsZVsqKHNwICsgMSldOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDIpID0gZ2FtbWFfdGFibGVbKihzcCArIDIpXTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogQmFja2dyb3VuZCBpcyBhbHJlYWR5IGluIHNjcmVlbiBnYW1tYSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKXBuZ19wdHItPmJhY2tncm91bmQucmVkOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKXBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW47CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMikgPSAocG5nX2J5dGUpcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlOworICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfYnl0ZSB2LCB3OworCisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfdG9fMVsqc3BdOworICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZSh3LCB2LCBhLCBwbmdfcHRyLT5iYWNrZ3JvdW5kXzEucmVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpbWl6ZSA9PSAwKSB3ID0gZ2FtbWFfZnJvbV8xW3ddOworICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gdzsKKworICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGdhbW1hX3RvXzFbKihzcCArIDEpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19jb21wb3NpdGUodywgdiwgYSwgcG5nX3B0ci0+YmFja2dyb3VuZF8xLmdyZWVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpbWl6ZSA9PSAwKSB3ID0gZ2FtbWFfZnJvbV8xW3ddOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gdzsKKworICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGdhbW1hX3RvXzFbKihzcCArIDIpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19jb21wb3NpdGUodywgdiwgYSwgcG5nX3B0ci0+YmFja2dyb3VuZF8xLmJsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGltaXplID09IDApIHcgPSBnYW1tYV9mcm9tXzFbd107CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMikgPSB3OworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKKyAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKywgc3AgKz0gNCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIGEgPSAqKHNwICsgMyk7CisKKyAgICAgICAgICAgICAgICAgICAgIGlmIChhID09IDApCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAyKSA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWU7CisgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGEgPCAweGZmKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZSgqc3AsICpzcCwgYSwgcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlKCooc3AgKyAxKSwgKihzcCArIDEpLCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4pOworCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlKCooc3AgKyAyKSwgKihzcCArIDIpLCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQuYmx1ZSk7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIC8qIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KSAqLworICAgICAgICAgICAgeworI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAorICAgICAgICAgICAgICAgaWYgKGdhbW1hXzE2ICE9IE5VTEwgJiYgZ2FtbWFfMTZfZnJvbV8xICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICBnYW1tYV8xNl90b18xICE9IE5VTEwpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKKyAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKywgc3AgKz0gOCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGEgPSAocG5nX3VpbnRfMTYpKCgocG5nX3VpbnRfMTYpKCooc3AgKyA2KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCA4KSArIChwbmdfdWludF8xNikoKihzcCArIDcpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgIGlmIChhID09IChwbmdfdWludF8xNikweGZmZmYpCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiB2OworCisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZbKihzcCArIDEpID4+IGdhbW1hX3NoaWZ0XVsqc3BdOworICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV8xNlsqKHNwICsgMykgPj4gZ2FtbWFfc2hpZnRdWyooc3AgKyAyKV07CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMikgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMykgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGdhbW1hXzE2Wyooc3AgKyA1KSA+PiBnYW1tYV9zaGlmdF1bKihzcCArIDQpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyA0KSA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyA1KSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhID09IDApCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBCYWNrZ3JvdW5kIGlzIGFscmVhZHkgaW4gc2NyZWVuIGdhbW1hICovCisgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKChwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKShwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDIpID0gKHBuZ19ieXRlKSgocG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbiA+PiA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDMpID0gKHBuZ19ieXRlKShwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgNCkgPSAocG5nX2J5dGUpKChwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUgPj4gOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyA1KSA9IChwbmdfYnl0ZSkocG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IHYsIHc7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV8xNl90b18xWyooc3AgKyAxKSA+PiBnYW1tYV9zaGlmdF1bKnNwXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19jb21wb3NpdGVfMTYodywgdiwgYSwgcG5nX3B0ci0+YmFja2dyb3VuZF8xLnJlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW1pemUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBnYW1tYV8xNl9mcm9tXzFbKCh3ICYgMHhmZikgPj4gZ2FtbWFfc2hpZnQpXVt3ID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDhdOworICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgodyA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKSh3ICYgMHhmZik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV8xNl90b18xWyooc3AgKyAzKSA+PiBnYW1tYV9zaGlmdF1bKihzcCArIDIpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19jb21wb3NpdGVfMTYodywgdiwgYSwgcG5nX3B0ci0+YmFja2dyb3VuZF8xLmdyZWVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpbWl6ZSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdyA9IGdhbW1hXzE2X2Zyb21fMVsoKHcgJiAweGZmKSA+PiBnYW1tYV9zaGlmdCldW3cgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAyKSA9IChwbmdfYnl0ZSkoKHcgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAzKSA9IChwbmdfYnl0ZSkodyAmIDB4ZmYpOworCisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZfdG9fMVsqKHNwICsgNSkgPj4gZ2FtbWFfc2hpZnRdWyooc3AgKyA0KV07CisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlXzE2KHcsIHYsIGEsIHBuZ19wdHItPmJhY2tncm91bmRfMS5ibHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpbWl6ZSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdyA9IGdhbW1hXzE2X2Zyb21fMVsoKHcgJiAweGZmKSA+PiBnYW1tYV9zaGlmdCldW3cgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyA0KSA9IChwbmdfYnl0ZSkoKHcgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyA1KSA9IChwbmdfYnl0ZSkodyAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHNwID0gcm93OworICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCArPSA4KQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgYSA9IChwbmdfdWludF8xNikoKChwbmdfdWludF8xNikoKihzcCArIDYpKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDgpICsgKHBuZ191aW50XzE2KSgqKHNwICsgNykpKTsKKworICAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoKHBuZ19wdHItPmJhY2tncm91bmQucmVkID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpKHBuZ19wdHItPmJhY2tncm91bmQucmVkICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMikgPSAocG5nX2J5dGUpKChwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuID4+IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMykgPSAocG5nX2J5dGUpKHBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyA0KSA9IChwbmdfYnl0ZSkoKHBuZ19wdHItPmJhY2tncm91bmQuYmx1ZSA+PiA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDUpID0gKHBuZ19ieXRlKShwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYSA8IDB4ZmZmZikKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IHY7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IHIgPSAocG5nX3VpbnRfMTYpKCgoKnNwKSA8PCA4KSArICooc3AgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBnID0gKHBuZ191aW50XzE2KSgoKCooc3AgKyAyKSkgPDwgOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICooc3AgKyAzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBiID0gKHBuZ191aW50XzE2KSgoKCooc3AgKyA0KSkgPDwgOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICooc3AgKyA1KSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19jb21wb3NpdGVfMTYodiwgciwgYSwgcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19jb21wb3NpdGVfMTYodiwgZywgYSwgcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMikgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMykgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZV8xNih2LCBiLCBhLCBwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDQpID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDUpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKworICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgfQorfQorI2VuZGlmIC8qIFJFQURfQkFDS0dST1VORCB8fCBSRUFEX0FMUEhBX01PREUgKi8KKworI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAorLyogR2FtbWEgY29ycmVjdCB0aGUgaW1hZ2UsIGF2b2lkaW5nIHRoZSBhbHBoYSBjaGFubmVsLiAgTWFrZSBzdXJlCisgKiB5b3UgZG8gdGhpcyBhZnRlciB5b3UgZGVhbCB3aXRoIHRoZSB0cmFuc3BhcmVuY3kgaXNzdWUgb24gZ3JheXNjYWxlCisgKiBvciBSR0IgaW1hZ2VzLiBJZiB5b3VyIGJpdCBkZXB0aCBpcyA4LCB1c2UgZ2FtbWFfdGFibGUsIGlmIGl0CisgKiBpcyAxNiwgdXNlIGdhbW1hXzE2X3RhYmxlIGFuZCBnYW1tYV9zaGlmdC4gIEJ1aWxkIHRoZXNlIHdpdGgKKyAqIGJ1aWxkX2dhbW1hX3RhYmxlKCkuCisgKi8KK3N0YXRpYyB2b2lkCitwbmdfZG9fZ2FtbWEocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywgcG5nX3N0cnVjdHJwIHBuZ19wdHIpCit7CisgICBwbmdfY29uc3RfYnl0ZXAgZ2FtbWFfdGFibGUgPSBwbmdfcHRyLT5nYW1tYV90YWJsZTsKKyAgIHBuZ19jb25zdF91aW50XzE2cHAgZ2FtbWFfMTZfdGFibGUgPSBwbmdfcHRyLT5nYW1tYV8xNl90YWJsZTsKKyAgIGludCBnYW1tYV9zaGlmdCA9IHBuZ19wdHItPmdhbW1hX3NoaWZ0OworCisgICBwbmdfYnl0ZXAgc3A7CisgICBwbmdfdWludF8zMiBpOworICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoPXJvd19pbmZvLT53aWR0aDsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fZ2FtbWEiKTsKKworICAgaWYgKCgocm93X2luZm8tPmJpdF9kZXB0aCA8PSA4ICYmIGdhbW1hX3RhYmxlICE9IE5VTEwpIHx8CisgICAgICAgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYgJiYgZ2FtbWFfMTZfdGFibGUgIT0gTlVMTCkpKQorICAgeworICAgICAgc3dpdGNoIChyb3dfaW5mby0+Y29sb3JfdHlwZSkKKyAgICAgIHsKKyAgICAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUkdCOgorICAgICAgICAgeworICAgICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNwID0gcm93OworICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgKnNwID0gZ2FtbWFfdGFibGVbKnNwXTsKKyAgICAgICAgICAgICAgICAgIHNwKys7CisgICAgICAgICAgICAgICAgICAqc3AgPSBnYW1tYV90YWJsZVsqc3BdOworICAgICAgICAgICAgICAgICAgc3ArKzsKKyAgICAgICAgICAgICAgICAgICpzcCA9IGdhbW1hX3RhYmxlWypzcF07CisgICAgICAgICAgICAgICAgICBzcCsrOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbHNlIC8qIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc3AgPSByb3c7CisgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiB2OworCisgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZfdGFibGVbKihzcCArIDEpID4+IGdhbW1hX3NoaWZ0XVsqc3BdOworICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7CisgICAgICAgICAgICAgICAgICBzcCArPSAyOworCisgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZfdGFibGVbKihzcCArIDEpID4+IGdhbW1hX3NoaWZ0XVsqc3BdOworICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7CisgICAgICAgICAgICAgICAgICBzcCArPSAyOworCisgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZfdGFibGVbKihzcCArIDEpID4+IGdhbW1hX3NoaWZ0XVsqc3BdOworICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7CisgICAgICAgICAgICAgICAgICBzcCArPSAyOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisKKyAgICAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBOgorICAgICAgICAgeworICAgICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNwID0gcm93OworICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgKnNwID0gZ2FtbWFfdGFibGVbKnNwXTsKKyAgICAgICAgICAgICAgICAgIHNwKys7CisKKyAgICAgICAgICAgICAgICAgICpzcCA9IGdhbW1hX3RhYmxlWypzcF07CisgICAgICAgICAgICAgICAgICBzcCsrOworCisgICAgICAgICAgICAgICAgICAqc3AgPSBnYW1tYV90YWJsZVsqc3BdOworICAgICAgICAgICAgICAgICAgc3ArKzsKKworICAgICAgICAgICAgICAgICAgc3ArKzsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWxzZSAvKiBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNwID0gcm93OworICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgdiA9IGdhbW1hXzE2X3RhYmxlWyooc3AgKyAxKSA+PiBnYW1tYV9zaGlmdF1bKnNwXTsKKyAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgc3AgKz0gMjsKKworICAgICAgICAgICAgICAgICAgdiA9IGdhbW1hXzE2X3RhYmxlWyooc3AgKyAxKSA+PiBnYW1tYV9zaGlmdF1bKnNwXTsKKyAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgc3AgKz0gMjsKKworICAgICAgICAgICAgICAgICAgdiA9IGdhbW1hXzE2X3RhYmxlWyooc3AgKyAxKSA+PiBnYW1tYV9zaGlmdF1bKnNwXTsKKyAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgc3AgKz0gNDsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEE6CisgICAgICAgICB7CisgICAgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc3AgPSByb3c7CisgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAqc3AgPSBnYW1tYV90YWJsZVsqc3BdOworICAgICAgICAgICAgICAgICAgc3AgKz0gMjsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWxzZSAvKiBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNwID0gcm93OworICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgdiA9IGdhbW1hXzE2X3RhYmxlWyooc3AgKyAxKSA+PiBnYW1tYV9zaGlmdF1bKnNwXTsKKyAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgc3AgKz0gNDsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX0dSQVk6CisgICAgICAgICB7CisgICAgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc3AgPSByb3c7CisgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpICs9IDQpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpbnQgYSA9ICpzcCAmIDB4YzA7CisgICAgICAgICAgICAgICAgICBpbnQgYiA9ICpzcCAmIDB4MzA7CisgICAgICAgICAgICAgICAgICBpbnQgYyA9ICpzcCAmIDB4MGM7CisgICAgICAgICAgICAgICAgICBpbnQgZCA9ICpzcCAmIDB4MDM7CisKKyAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoCisgICAgICAgICAgICAgICAgICAgICAgKCgoKGludClnYW1tYV90YWJsZVthfChhPj4yKXwoYT4+NCl8KGE+PjYpXSkgICApICYgMHhjMCl8CisgICAgICAgICAgICAgICAgICAgICAgKCgoKGludClnYW1tYV90YWJsZVsoYjw8Mil8YnwoYj4+Mil8KGI+PjQpXSk+PjIpICYgMHgzMCl8CisgICAgICAgICAgICAgICAgICAgICAgKCgoKGludClnYW1tYV90YWJsZVsoYzw8NCl8KGM8PDIpfGN8KGM+PjIpXSk+PjQpICYgMHgwYyl8CisgICAgICAgICAgICAgICAgICAgICAgKCgoKGludClnYW1tYV90YWJsZVsoZDw8Nil8KGQ8PDQpfChkPDwyKXxkXSk+PjYpICkpOworICAgICAgICAgICAgICAgICAgc3ArKzsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNwID0gcm93OworICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSArPSAyKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaW50IG1zYiA9ICpzcCAmIDB4ZjA7CisgICAgICAgICAgICAgICAgICBpbnQgbHNiID0gKnNwICYgMHgwZjsKKworICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgoKChpbnQpZ2FtbWFfdGFibGVbbXNiIHwgKG1zYiA+PiA0KV0pICYgMHhmMCkKKyAgICAgICAgICAgICAgICAgICAgICB8ICgoKGludClnYW1tYV90YWJsZVsobHNiIDw8IDQpIHwgbHNiXSkgPj4gNCkpOworICAgICAgICAgICAgICAgICAgc3ArKzsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWxzZSBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc3AgPSByb3c7CisgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAqc3AgPSBnYW1tYV90YWJsZVsqc3BdOworICAgICAgICAgICAgICAgICAgc3ArKzsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWxzZSBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNwID0gcm93OworICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgdiA9IGdhbW1hXzE2X3RhYmxlWyooc3AgKyAxKSA+PiBnYW1tYV9zaGlmdF1bKnNwXTsKKyAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgc3AgKz0gMjsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICB9Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0FMUEhBX01PREVfU1VQUE9SVEVECisvKiBFbmNvZGUgdGhlIGFscGhhIGNoYW5uZWwgdG8gdGhlIG91dHB1dCBnYW1tYSAodGhlIGlucHV0IGNoYW5uZWwgaXMgYWx3YXlzCisgKiBsaW5lYXIuKSAgQ2FsbGVkIG9ubHkgd2l0aCBjb2xvciB0eXBlcyB0aGF0IGhhdmUgYW4gYWxwaGEgY2hhbm5lbC4gIE5lZWRzIHRoZQorICogZnJvbV8xIHRhYmxlcy4KKyAqLworc3RhdGljIHZvaWQKK3BuZ19kb19lbmNvZGVfYWxwaGEocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywgcG5nX3N0cnVjdHJwIHBuZ19wdHIpCit7CisgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX2VuY29kZV9hbHBoYSIpOworCisgICBpZiAoKHJvd19pbmZvLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpICE9IDApCisgICB7CisgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQorICAgICAgeworICAgICAgICAgUE5HX0NPTlNUIHBuZ19ieXRlcCB0YWJsZSA9IHBuZ19wdHItPmdhbW1hX2Zyb21fMTsKKworICAgICAgICAgaWYgKHRhYmxlICE9IE5VTEwpCisgICAgICAgICB7CisgICAgICAgICAgICBQTkdfQ09OU1QgaW50IHN0ZXAgPQorICAgICAgICAgICAgICAgKHJvd19pbmZvLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpID8gNCA6IDI7CisKKyAgICAgICAgICAgIC8qIFRoZSBhbHBoYSBjaGFubmVsIGlzIHRoZSBsYXN0IGNvbXBvbmVudDogKi8KKyAgICAgICAgICAgIHJvdyArPSBzdGVwIC0gMTsKKworICAgICAgICAgICAgZm9yICg7IHJvd193aWR0aCA+IDA7IC0tcm93X3dpZHRoLCByb3cgKz0gc3RlcCkKKyAgICAgICAgICAgICAgICpyb3cgPSB0YWJsZVsqcm93XTsKKworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KQorICAgICAgeworICAgICAgICAgUE5HX0NPTlNUIHBuZ191aW50XzE2cHAgdGFibGUgPSBwbmdfcHRyLT5nYW1tYV8xNl9mcm9tXzE7CisgICAgICAgICBQTkdfQ09OU1QgaW50IGdhbW1hX3NoaWZ0ID0gcG5nX3B0ci0+Z2FtbWFfc2hpZnQ7CisKKyAgICAgICAgIGlmICh0YWJsZSAhPSBOVUxMKQorICAgICAgICAgeworICAgICAgICAgICAgUE5HX0NPTlNUIGludCBzdGVwID0KKyAgICAgICAgICAgICAgIChyb3dfaW5mby0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKSA/IDggOiA0OworCisgICAgICAgICAgICAvKiBUaGUgYWxwaGEgY2hhbm5lbCBpcyB0aGUgbGFzdCBjb21wb25lbnQ6ICovCisgICAgICAgICAgICByb3cgKz0gc3RlcCAtIDI7CisKKyAgICAgICAgICAgIGZvciAoOyByb3dfd2lkdGggPiAwOyAtLXJvd193aWR0aCwgcm93ICs9IHN0ZXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfdWludF8xNiB2OworCisgICAgICAgICAgICAgICB2ID0gdGFibGVbKihyb3cgKyAxKSA+PiBnYW1tYV9zaGlmdF1bKnJvd107CisgICAgICAgICAgICAgICAqcm93ID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgKihyb3cgKyAxKSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIC8qIE9ubHkgZ2V0IHRvIGhlcmUgaWYgY2FsbGVkIHdpdGggYSB3ZWlyZCByb3dfaW5mbzsgbm8gaGFybSBoYXMgYmVlbiBkb25lLAorICAgICogc28ganVzdCBpc3N1ZSBhIHdhcm5pbmcuCisgICAgKi8KKyAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJwbmdfZG9fZW5jb2RlX2FscGhhOiB1bmV4cGVjdGVkIGNhbGwiKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRAorLyogRXhwYW5kcyBhIHBhbGV0dGUgcm93IHRvIGFuIFJHQiBvciBSR0JBIHJvdyBkZXBlbmRpbmcKKyAqIHVwb24gd2hldGhlciB5b3Ugc3VwcGx5IHRyYW5zIGFuZCBudW1fdHJhbnMuCisgKi8KK3N0YXRpYyB2b2lkCitwbmdfZG9fZXhwYW5kX3BhbGV0dGUocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywKKyAgIHBuZ19jb25zdF9jb2xvcnAgcGFsZXR0ZSwgcG5nX2NvbnN0X2J5dGVwIHRyYW5zX2FscGhhLCBpbnQgbnVtX3RyYW5zKQoreworICAgaW50IHNoaWZ0LCB2YWx1ZTsKKyAgIHBuZ19ieXRlcCBzcCwgZHA7CisgICBwbmdfdWludF8zMiBpOworICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoPXJvd19pbmZvLT53aWR0aDsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fZXhwYW5kX3BhbGV0dGUiKTsKKworICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCisgICB7CisgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA8IDgpCisgICAgICB7CisgICAgICAgICBzd2l0Y2ggKHJvd19pbmZvLT5iaXRfZGVwdGgpCisgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzcCA9IHJvdyArIChwbmdfc2l6ZV90KSgocm93X3dpZHRoIC0gMSkgPj4gMyk7CisgICAgICAgICAgICAgICBkcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aCAtIDE7CisgICAgICAgICAgICAgICBzaGlmdCA9IDcgLSAoaW50KSgocm93X3dpZHRoICsgNykgJiAweDA3KTsKKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICgoKnNwID4+IHNoaWZ0KSAmIDB4MDEpCisgICAgICAgICAgICAgICAgICAgICAqZHAgPSAxOworCisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAqZHAgPSAwOworCisgICAgICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gNykKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgIHNwLS07CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgIHNoaWZ0Kys7CisKKyAgICAgICAgICAgICAgICAgIGRwLS07CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc3AgPSByb3cgKyAocG5nX3NpemVfdCkoKHJvd193aWR0aCAtIDEpID4+IDIpOworICAgICAgICAgICAgICAgZHAgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggLSAxOworICAgICAgICAgICAgICAgc2hpZnQgPSAoaW50KSgoMyAtICgocm93X3dpZHRoICsgMykgJiAweDAzKSkgPDwgMSk7CisgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICgqc3AgPj4gc2hpZnQpICYgMHgwMzsKKyAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSl2YWx1ZTsKKyAgICAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSA2KQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgc3AtLTsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgc2hpZnQgKz0gMjsKKworICAgICAgICAgICAgICAgICAgZHAtLTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzcCA9IHJvdyArIChwbmdfc2l6ZV90KSgocm93X3dpZHRoIC0gMSkgPj4gMSk7CisgICAgICAgICAgICAgICBkcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aCAtIDE7CisgICAgICAgICAgICAgICBzaGlmdCA9IChpbnQpKChyb3dfd2lkdGggJiAweDAxKSA8PCAyKTsKKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHZhbHVlID0gKCpzcCA+PiBzaGlmdCkgJiAweDBmOworICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKXZhbHVlOworICAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDQpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICBzcC0tOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICBzaGlmdCArPSA0OworCisgICAgICAgICAgICAgICAgICBkcC0tOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgIHJvd19pbmZvLT5iaXRfZGVwdGggPSA4OworICAgICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gODsKKyAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aDsKKyAgICAgIH0KKworICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgIHsKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChudW1fdHJhbnMgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggLSAxOworICAgICAgICAgICAgICAgZHAgPSByb3cgKyAocG5nX3NpemVfdCkocm93X3dpZHRoIDw8IDIpIC0gMTsKKworICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKChpbnQpKCpzcCkgPj0gbnVtX3RyYW5zKQorICAgICAgICAgICAgICAgICAgICAgKmRwLS0gPSAweGZmOworCisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAqZHAtLSA9IHRyYW5zX2FscGhhWypzcF07CisKKyAgICAgICAgICAgICAgICAgICpkcC0tID0gcGFsZXR0ZVsqc3BdLmJsdWU7CisgICAgICAgICAgICAgICAgICAqZHAtLSA9IHBhbGV0dGVbKnNwXS5ncmVlbjsKKyAgICAgICAgICAgICAgICAgICpkcC0tID0gcGFsZXR0ZVsqc3BdLnJlZDsKKyAgICAgICAgICAgICAgICAgIHNwLS07CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICByb3dfaW5mby0+Yml0X2RlcHRoID0gODsKKyAgICAgICAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IDMyOworICAgICAgICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X3dpZHRoICogNDsKKyAgICAgICAgICAgICAgIHJvd19pbmZvLT5jb2xvcl90eXBlID0gNjsKKyAgICAgICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoIC0gMTsKKyAgICAgICAgICAgICAgIGRwID0gcm93ICsgKHBuZ19zaXplX3QpKHJvd193aWR0aCAqIDMpIC0gMTsKKworICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgKmRwLS0gPSBwYWxldHRlWypzcF0uYmx1ZTsKKyAgICAgICAgICAgICAgICAgICpkcC0tID0gcGFsZXR0ZVsqc3BdLmdyZWVuOworICAgICAgICAgICAgICAgICAgKmRwLS0gPSBwYWxldHRlWypzcF0ucmVkOworICAgICAgICAgICAgICAgICAgc3AtLTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgcm93X2luZm8tPmJpdF9kZXB0aCA9IDg7CisgICAgICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAyNDsKKyAgICAgICAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aCAqIDM7CisgICAgICAgICAgICAgICByb3dfaW5mby0+Y29sb3JfdHlwZSA9IDI7CisgICAgICAgICAgICAgICByb3dfaW5mby0+Y2hhbm5lbHMgPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgfQorfQorCisvKiBJZiB0aGUgYml0IGRlcHRoIDwgOCwgaXQgaXMgZXhwYW5kZWQgdG8gOC4gIEFsc28sIGlmIHRoZSBhbHJlYWR5CisgKiBleHBhbmRlZCB0cmFuc3BhcmVuY3kgdmFsdWUgaXMgc3VwcGxpZWQsIGFuIGFscGhhIGNoYW5uZWwgaXMgYnVpbHQuCisgKi8KK3N0YXRpYyB2b2lkCitwbmdfZG9fZXhwYW5kKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csCisgICAgcG5nX2NvbnN0X2NvbG9yXzE2cCB0cmFuc19jb2xvcikKK3sKKyAgIGludCBzaGlmdCwgdmFsdWU7CisgICBwbmdfYnl0ZXAgc3AsIGRwOworICAgcG5nX3VpbnRfMzIgaTsKKyAgIHBuZ191aW50XzMyIHJvd193aWR0aD1yb3dfaW5mby0+d2lkdGg7CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX2V4cGFuZCIpOworCisgICB7CisgICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkKKyAgICAgIHsKKyAgICAgICAgIHVuc2lnbmVkIGludCBncmF5ID0gdHJhbnNfY29sb3IgIT0gTlVMTCA/IHRyYW5zX2NvbG9yLT5ncmF5IDogMDsKKworICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPCA4KQorICAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChyb3dfaW5mby0+Yml0X2RlcHRoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZ3JheSA9IChncmF5ICYgMHgwMSkgKiAweGZmOworICAgICAgICAgICAgICAgICAgc3AgPSByb3cgKyAocG5nX3NpemVfdCkoKHJvd193aWR0aCAtIDEpID4+IDMpOworICAgICAgICAgICAgICAgICAgZHAgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggLSAxOworICAgICAgICAgICAgICAgICAgc2hpZnQgPSA3IC0gKGludCkoKHJvd193aWR0aCArIDcpICYgMHgwNyk7CisgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBpZiAoKCpzcCA+PiBzaGlmdCkgJiAweDAxKQorICAgICAgICAgICAgICAgICAgICAgICAgKmRwID0gMHhmZjsKKworICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgKmRwID0gMDsKKworICAgICAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDcpCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBzcC0tOworICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCsrOworCisgICAgICAgICAgICAgICAgICAgICBkcC0tOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGdyYXkgPSAoZ3JheSAmIDB4MDMpICogMHg1NTsKKyAgICAgICAgICAgICAgICAgIHNwID0gcm93ICsgKHBuZ19zaXplX3QpKChyb3dfd2lkdGggLSAxKSA+PiAyKTsKKyAgICAgICAgICAgICAgICAgIGRwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoIC0gMTsKKyAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gKGludCkoKDMgLSAoKHJvd193aWR0aCArIDMpICYgMHgwMykpIDw8IDEpOworICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAoKnNwID4+IHNoaWZ0KSAmIDB4MDM7CisgICAgICAgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpKHZhbHVlIHwgKHZhbHVlIDw8IDIpIHwgKHZhbHVlIDw8IDQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA8PCA2KSk7CisgICAgICAgICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gNikKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwLS07CisgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ICs9IDI7CisKKyAgICAgICAgICAgICAgICAgICAgIGRwLS07CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZ3JheSA9IChncmF5ICYgMHgwZikgKiAweDExOworICAgICAgICAgICAgICAgICAgc3AgPSByb3cgKyAocG5nX3NpemVfdCkoKHJvd193aWR0aCAtIDEpID4+IDEpOworICAgICAgICAgICAgICAgICAgZHAgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggLSAxOworICAgICAgICAgICAgICAgICAgc2hpZnQgPSAoaW50KSgoMSAtICgocm93X3dpZHRoICsgMSkgJiAweDAxKSkgPDwgMik7CisgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICgqc3AgPj4gc2hpZnQpICYgMHgwZjsKKyAgICAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSkodmFsdWUgfCAodmFsdWUgPDwgNCkpOworICAgICAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDQpCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBzcC0tOworICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDQ7CisKKyAgICAgICAgICAgICAgICAgICAgIGRwLS07CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByb3dfaW5mby0+Yml0X2RlcHRoID0gODsKKyAgICAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IDg7CisgICAgICAgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSByb3dfd2lkdGg7CisgICAgICAgICB9CisKKyAgICAgICAgIGlmICh0cmFuc19jb2xvciAhPSBOVUxMKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGdyYXkgPSBncmF5ICYgMHhmZjsKKyAgICAgICAgICAgICAgIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoIC0gMTsKKyAgICAgICAgICAgICAgIGRwID0gcm93ICsgKHBuZ19zaXplX3QpKHJvd193aWR0aCA8PCAxKSAtIDE7CisKKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICgoKnNwICYgMHhmZlUpID09IGdyYXkpCisgICAgICAgICAgICAgICAgICAgICAqZHAtLSA9IDA7CisKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICpkcC0tID0gMHhmZjsKKworICAgICAgICAgICAgICAgICAgKmRwLS0gPSAqc3AtLTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWxzZSBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBncmF5X2hpZ2ggPSAoZ3JheSA+PiA4KSAmIDB4ZmY7CisgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZ3JheV9sb3cgPSBncmF5ICYgMHhmZjsKKyAgICAgICAgICAgICAgIHNwID0gcm93ICsgcm93X2luZm8tPnJvd2J5dGVzIC0gMTsKKyAgICAgICAgICAgICAgIGRwID0gcm93ICsgKHJvd19pbmZvLT5yb3dieXRlcyA8PCAxKSAtIDE7CisgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoKCooc3AgLSAxKSAmIDB4ZmZVKSA9PSBncmF5X2hpZ2ggJiYKKyAgICAgICAgICAgICAgICAgICAgICAoKihzcCkgJiAweGZmVSkgPT0gZ3JheV9sb3cpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAqZHAtLSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAqZHAtLSA9IDA7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICpkcC0tID0gMHhmZjsKKyAgICAgICAgICAgICAgICAgICAgICpkcC0tID0gMHhmZjsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgKmRwLS0gPSAqc3AtLTsKKyAgICAgICAgICAgICAgICAgICpkcC0tID0gKnNwLS07CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJvd19pbmZvLT5jb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQTsKKyAgICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDI7CisgICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpKHJvd19pbmZvLT5iaXRfZGVwdGggPDwgMSk7CisgICAgICAgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSBQTkdfUk9XQllURVMocm93X2luZm8tPnBpeGVsX2RlcHRoLAorICAgICAgICAgICAgICAgcm93X3dpZHRoKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiAmJgorICAgICAgICAgIHRyYW5zX2NvbG9yICE9IE5VTEwpCisgICAgICB7CisgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGUgcmVkID0gKHBuZ19ieXRlKSh0cmFuc19jb2xvci0+cmVkICYgMHhmZik7CisgICAgICAgICAgICBwbmdfYnl0ZSBncmVlbiA9IChwbmdfYnl0ZSkodHJhbnNfY29sb3ItPmdyZWVuICYgMHhmZik7CisgICAgICAgICAgICBwbmdfYnl0ZSBibHVlID0gKHBuZ19ieXRlKSh0cmFuc19jb2xvci0+Ymx1ZSAmIDB4ZmYpOworICAgICAgICAgICAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfaW5mby0+cm93Ynl0ZXMgLSAxOworICAgICAgICAgICAgZHAgPSByb3cgKyAocG5nX3NpemVfdCkocm93X3dpZHRoIDw8IDIpIC0gMTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmICgqKHNwIC0gMikgPT0gcmVkICYmICooc3AgLSAxKSA9PSBncmVlbiAmJiAqKHNwKSA9PSBibHVlKQorICAgICAgICAgICAgICAgICAgKmRwLS0gPSAwOworCisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAqZHAtLSA9IDB4ZmY7CisKKyAgICAgICAgICAgICAgICpkcC0tID0gKnNwLS07CisgICAgICAgICAgICAgICAqZHAtLSA9ICpzcC0tOworICAgICAgICAgICAgICAgKmRwLS0gPSAqc3AtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZSByZWRfaGlnaCA9IChwbmdfYnl0ZSkoKHRyYW5zX2NvbG9yLT5yZWQgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgIHBuZ19ieXRlIGdyZWVuX2hpZ2ggPSAocG5nX2J5dGUpKCh0cmFuc19jb2xvci0+Z3JlZW4gPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgIHBuZ19ieXRlIGJsdWVfaGlnaCA9IChwbmdfYnl0ZSkoKHRyYW5zX2NvbG9yLT5ibHVlID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICBwbmdfYnl0ZSByZWRfbG93ID0gKHBuZ19ieXRlKSh0cmFuc19jb2xvci0+cmVkICYgMHhmZik7CisgICAgICAgICAgICBwbmdfYnl0ZSBncmVlbl9sb3cgPSAocG5nX2J5dGUpKHRyYW5zX2NvbG9yLT5ncmVlbiAmIDB4ZmYpOworICAgICAgICAgICAgcG5nX2J5dGUgYmx1ZV9sb3cgPSAocG5nX2J5dGUpKHRyYW5zX2NvbG9yLT5ibHVlICYgMHhmZik7CisgICAgICAgICAgICBzcCA9IHJvdyArIHJvd19pbmZvLT5yb3dieXRlcyAtIDE7CisgICAgICAgICAgICBkcCA9IHJvdyArIChwbmdfc2l6ZV90KShyb3dfd2lkdGggPDwgMykgLSAxOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKCooc3AgLSA1KSA9PSByZWRfaGlnaCAmJgorICAgICAgICAgICAgICAgICAgICooc3AgLSA0KSA9PSByZWRfbG93ICYmCisgICAgICAgICAgICAgICAgICAgKihzcCAtIDMpID09IGdyZWVuX2hpZ2ggJiYKKyAgICAgICAgICAgICAgICAgICAqKHNwIC0gMikgPT0gZ3JlZW5fbG93ICYmCisgICAgICAgICAgICAgICAgICAgKihzcCAtIDEpID09IGJsdWVfaGlnaCAmJgorICAgICAgICAgICAgICAgICAgICooc3AgICAgKSA9PSBibHVlX2xvdykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICpkcC0tID0gMDsKKyAgICAgICAgICAgICAgICAgICpkcC0tID0gMDsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgKmRwLS0gPSAweGZmOworICAgICAgICAgICAgICAgICAgKmRwLS0gPSAweGZmOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAqZHAtLSA9ICpzcC0tOworICAgICAgICAgICAgICAgKmRwLS0gPSAqc3AtLTsKKyAgICAgICAgICAgICAgICpkcC0tID0gKnNwLS07CisgICAgICAgICAgICAgICAqZHAtLSA9ICpzcC0tOworICAgICAgICAgICAgICAgKmRwLS0gPSAqc3AtLTsKKyAgICAgICAgICAgICAgICpkcC0tID0gKnNwLS07CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICByb3dfaW5mby0+Y29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQTsKKyAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDQ7CisgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpKHJvd19pbmZvLT5iaXRfZGVwdGggPDwgMik7CisgICAgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSBQTkdfUk9XQllURVMocm93X2luZm8tPnBpeGVsX2RlcHRoLCByb3dfd2lkdGgpOworICAgICAgfQorICAgfQorfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9FWFBBTkRfMTZfU1VQUE9SVEVECisvKiBJZiB0aGUgYml0IGRlcHRoIGlzIDggYW5kIHRoZSBjb2xvciB0eXBlIGlzIG5vdCBhIHBhbGV0dGUgdHlwZSBleHBhbmQgdGhlCisgKiB3aG9sZSByb3cgdG8gMTYgYml0cy4gIEhhcyBubyBlZmZlY3Qgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgdm9pZAorcG5nX2RvX2V4cGFuZF8xNihwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KQoreworICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCAmJgorICAgICAgcm93X2luZm8tPmNvbG9yX3R5cGUgIT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgIHsKKyAgICAgIC8qIFRoZSByb3cgaGF2ZSBhIHNlcXVlbmNlIG9mIGJ5dGVzIGNvbnRhaW5pbmcgWzAuLjI1NV0gYW5kIHdlIG5lZWQKKyAgICAgICAqIHRvIHR1cm4gaXQgaW50byBhbm90aGVyIHJvdyBjb250YWluaW5nIFswLi42NTUzNV0sIHRvIGRvIHRoaXMgd2UKKyAgICAgICAqIGNhbGN1bGF0ZToKKyAgICAgICAqCisgICAgICAgKiAgKGlucHV0IC8gMjU1KSAqIDY1NTM1CisgICAgICAgKgorICAgICAgICogIFdoaWNoIGhhcHBlbnMgdG8gYmUgZXhhY3RseSBpbnB1dCAqIDI1NyBhbmQgdGhpcyBjYW4gYmUgYWNoaWV2ZWQKKyAgICAgICAqICBzaW1wbHkgYnkgYnl0ZSByZXBsaWNhdGlvbiBpbiBwbGFjZSAoY29weWluZyBiYWNrd2FyZHMpLgorICAgICAgICovCisgICAgICBwbmdfYnl0ZSAqc3AgPSByb3cgKyByb3dfaW5mby0+cm93Ynl0ZXM7IC8qIHNvdXJjZSwgbGFzdCBieXRlICsgMSAqLworICAgICAgcG5nX2J5dGUgKmRwID0gc3AgKyByb3dfaW5mby0+cm93Ynl0ZXM7ICAvKiBkZXN0aW5hdGlvbiwgZW5kICsgMSAqLworICAgICAgd2hpbGUgKGRwID4gc3ApCisgICAgICAgICBkcFstMl0gPSBkcFstMV0gPSAqLS1zcCwgZHAgLT0gMjsKKworICAgICAgcm93X2luZm8tPnJvd2J5dGVzICo9IDI7CisgICAgICByb3dfaW5mby0+Yml0X2RlcHRoID0gMTY7CisgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpKHJvd19pbmZvLT5jaGFubmVscyAqIDE2KTsKKyAgIH0KK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfUVVBTlRJWkVfU1VQUE9SVEVECitzdGF0aWMgdm9pZAorcG5nX2RvX3F1YW50aXplKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csCisgICAgcG5nX2NvbnN0X2J5dGVwIHBhbGV0dGVfbG9va3VwLCBwbmdfY29uc3RfYnl0ZXAgcXVhbnRpemVfbG9va3VwKQoreworICAgcG5nX2J5dGVwIHNwLCBkcDsKKyAgIHBuZ191aW50XzMyIGk7CisgICBwbmdfdWludF8zMiByb3dfd2lkdGg9cm93X2luZm8tPndpZHRoOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19xdWFudGl6ZSIpOworCisgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQorICAgeworICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiAmJiBwYWxldHRlX2xvb2t1cCkKKyAgICAgIHsKKyAgICAgICAgIGludCByLCBnLCBiLCBwOworICAgICAgICAgc3AgPSByb3c7CisgICAgICAgICBkcCA9IHJvdzsKKyAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHIgPSAqc3ArKzsKKyAgICAgICAgICAgIGcgPSAqc3ArKzsKKyAgICAgICAgICAgIGIgPSAqc3ArKzsKKworICAgICAgICAgICAgLyogVGhpcyBsb29rcyByZWFsIG1lc3N5LCBidXQgdGhlIGNvbXBpbGVyIHdpbGwgcmVkdWNlCisgICAgICAgICAgICAgKiBpdCBkb3duIHRvIGEgcmVhc29uYWJsZSBmb3JtdWxhLiAgRm9yIGV4YW1wbGUsIHdpdGgKKyAgICAgICAgICAgICAqIDUgYml0cyBwZXIgY29sb3IsIHdlIGdldDoKKyAgICAgICAgICAgICAqIHAgPSAoKChyID4+IDMpICYgMHgxZikgPDwgMTApIHwKKyAgICAgICAgICAgICAqICAgICgoKGcgPj4gMykgJiAweDFmKSA8PCA1KSB8CisgICAgICAgICAgICAgKiAgICAoKGIgPj4gMykgJiAweDFmKTsKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcCA9ICgoKHIgPj4gKDggLSBQTkdfUVVBTlRJWkVfUkVEX0JJVFMpKSAmCisgICAgICAgICAgICAgICAgKCgxIDw8IFBOR19RVUFOVElaRV9SRURfQklUUykgLSAxKSkgPDwKKyAgICAgICAgICAgICAgICAoUE5HX1FVQU5USVpFX0dSRUVOX0JJVFMgKyBQTkdfUVVBTlRJWkVfQkxVRV9CSVRTKSkgfAorICAgICAgICAgICAgICAgICgoKGcgPj4gKDggLSBQTkdfUVVBTlRJWkVfR1JFRU5fQklUUykpICYKKyAgICAgICAgICAgICAgICAoKDEgPDwgUE5HX1FVQU5USVpFX0dSRUVOX0JJVFMpIC0gMSkpIDw8CisgICAgICAgICAgICAgICAgKFBOR19RVUFOVElaRV9CTFVFX0JJVFMpKSB8CisgICAgICAgICAgICAgICAgKChiID4+ICg4IC0gUE5HX1FVQU5USVpFX0JMVUVfQklUUykpICYKKyAgICAgICAgICAgICAgICAoKDEgPDwgUE5HX1FVQU5USVpFX0JMVUVfQklUUykgLSAxKSk7CisKKyAgICAgICAgICAgICpkcCsrID0gcGFsZXR0ZV9sb29rdXBbcF07CisgICAgICAgICB9CisKKyAgICAgICAgIHJvd19pbmZvLT5jb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURTsKKyAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDE7CisgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSByb3dfaW5mby0+Yml0X2RlcHRoOworICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHJvd19pbmZvLT5waXhlbF9kZXB0aCwgcm93X3dpZHRoKTsKKyAgICAgIH0KKworICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBICYmCisgICAgICAgICBwYWxldHRlX2xvb2t1cCAhPSBOVUxMKQorICAgICAgeworICAgICAgICAgaW50IHIsIGcsIGIsIHA7CisgICAgICAgICBzcCA9IHJvdzsKKyAgICAgICAgIGRwID0gcm93OworICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgeworICAgICAgICAgICAgciA9ICpzcCsrOworICAgICAgICAgICAgZyA9ICpzcCsrOworICAgICAgICAgICAgYiA9ICpzcCsrOworICAgICAgICAgICAgc3ArKzsKKworICAgICAgICAgICAgcCA9ICgoKHIgPj4gKDggLSBQTkdfUVVBTlRJWkVfUkVEX0JJVFMpKSAmCisgICAgICAgICAgICAgICAgKCgxIDw8IFBOR19RVUFOVElaRV9SRURfQklUUykgLSAxKSkgPDwKKyAgICAgICAgICAgICAgICAoUE5HX1FVQU5USVpFX0dSRUVOX0JJVFMgKyBQTkdfUVVBTlRJWkVfQkxVRV9CSVRTKSkgfAorICAgICAgICAgICAgICAgICgoKGcgPj4gKDggLSBQTkdfUVVBTlRJWkVfR1JFRU5fQklUUykpICYKKyAgICAgICAgICAgICAgICAoKDEgPDwgUE5HX1FVQU5USVpFX0dSRUVOX0JJVFMpIC0gMSkpIDw8CisgICAgICAgICAgICAgICAgKFBOR19RVUFOVElaRV9CTFVFX0JJVFMpKSB8CisgICAgICAgICAgICAgICAgKChiID4+ICg4IC0gUE5HX1FVQU5USVpFX0JMVUVfQklUUykpICYKKyAgICAgICAgICAgICAgICAoKDEgPDwgUE5HX1FVQU5USVpFX0JMVUVfQklUUykgLSAxKSk7CisKKyAgICAgICAgICAgICpkcCsrID0gcGFsZXR0ZV9sb29rdXBbcF07CisgICAgICAgICB9CisKKyAgICAgICAgIHJvd19pbmZvLT5jb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURTsKKyAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDE7CisgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSByb3dfaW5mby0+Yml0X2RlcHRoOworICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHJvd19pbmZvLT5waXhlbF9kZXB0aCwgcm93X3dpZHRoKTsKKyAgICAgIH0KKworICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSAmJgorICAgICAgICAgcXVhbnRpemVfbG9va3VwKQorICAgICAgeworICAgICAgICAgc3AgPSByb3c7CisKKyAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKywgc3ArKykKKyAgICAgICAgIHsKKyAgICAgICAgICAgICpzcCA9IHF1YW50aXplX2xvb2t1cFsqc3BdOworICAgICAgICAgfQorICAgICAgfQorICAgfQorfQorI2VuZGlmIC8qIFJFQURfUVVBTlRJWkUgKi8KKworLyogVHJhbnNmb3JtIHRoZSByb3cuICBUaGUgb3JkZXIgb2YgdHJhbnNmb3JtYXRpb25zIGlzIHNpZ25pZmljYW50LAorICogYW5kIGlzIHZlcnkgdG91Y2h5LiAgSWYgeW91IGFkZCBhIHRyYW5zZm9ybWF0aW9uLCB0YWtlIGNhcmUgdG8KKyAqIGRlY2lkZSBob3cgaXQgZml0cyBpbiB3aXRoIHRoZSBvdGhlciB0cmFuc2Zvcm1hdGlvbnMgaGVyZS4KKyAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfZG9fcmVhZF90cmFuc2Zvcm1hdGlvbnMocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19yb3dfaW5mb3Agcm93X2luZm8pCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19yZWFkX3RyYW5zZm9ybWF0aW9ucyIpOworCisgICBpZiAocG5nX3B0ci0+cm93X2J1ZiA9PSBOVUxMKQorICAgeworICAgICAgLyogUHJpb3IgdG8gMS41LjQgdGhpcyBvdXRwdXQgcm93L3Bhc3Mgd2hlcmUgdGhlIE5VTEwgcG9pbnRlciBpcywgYnV0IHRoaXMKKyAgICAgICAqIGVycm9yIGlzIGluY3JlZGlibHkgcmFyZSBhbmQgaW5jcmVkaWJseSBlYXN5IHRvIGRlYnVnIHdpdGhvdXQgdGhpcworICAgICAgICogaW5mb3JtYXRpb24uCisgICAgICAgKi8KKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTlVMTCByb3cgYnVmZmVyIik7CisgICB9CisKKyAgIC8qIFRoZSBmb2xsb3dpbmcgaXMgZGVidWdnaW5nOyBwcmlvciB0byAxLjUuNCB0aGUgY29kZSB3YXMgbmV2ZXIgY29tcGlsZWQgaW47CisgICAgKiBpbiAxLjUuNCBQTkdfRkxBR19ERVRFQ1RfVU5JTklUSUFMSVpFRCB3YXMgYWRkZWQgYW5kIHRoZSBtYWNybworICAgICogUE5HX1dBUk5fVU5JTklUSUFMSVpFRF9ST1cgcmVtb3ZlZC4gIEluIDEuNiB0aGUgbmV3IGZsYWcgaXMgc2V0IG9ubHkgZm9yCisgICAgKiBhbGwgdHJhbnNmb3JtYXRpb25zLCBob3dldmVyIGluIHByYWN0aWNlIHRoZSBST1dfSU5JVCBhbHdheXMgZ2V0cyBkb25lIG9uCisgICAgKiBkZW1hbmQsIGlmIG5lY2Vzc2FyeS4KKyAgICAqLworICAgaWYgKChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0RFVEVDVF9VTklOSVRJQUxJWkVEKSAhPSAwICYmCisgICAgICAgKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfUk9XX0lOSVQpID09IDApCisgICB7CisgICAgICAvKiBBcHBsaWNhdGlvbiBoYXMgZmFpbGVkIHRvIGNhbGwgZWl0aGVyIHBuZ19yZWFkX3N0YXJ0X2ltYWdlKCkgb3IKKyAgICAgICAqIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCkgYWZ0ZXIgc2V0dGluZyB0cmFuc2Zvcm1zIHRoYXQgZXhwYW5kIHBpeGVscy4KKyAgICAgICAqIFRoaXMgY2hlY2sgYWRkZWQgdG8gbGlicG5nLTEuMi4xOSAoYnV0IG5vdCBlbmFibGVkIHVudGlsIDEuNS40KS4KKyAgICAgICAqLworICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJVbmluaXRpYWxpemVkIHJvdyIpOworICAgfQorCisjaWZkZWYgUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRAorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRVhQQU5EKSAhPSAwKQorICAgeworICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCisgICAgICB7CisgICAgICAgICBwbmdfZG9fZXhwYW5kX3BhbGV0dGUocm93X2luZm8sIHBuZ19wdHItPnJvd19idWYgKyAxLAorICAgICAgICAgICAgIHBuZ19wdHItPnBhbGV0dGUsIHBuZ19wdHItPnRyYW5zX2FscGhhLCBwbmdfcHRyLT5udW1fdHJhbnMpOworICAgICAgfQorCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBpZiAocG5nX3B0ci0+bnVtX3RyYW5zICE9IDAgJiYKKyAgICAgICAgICAgICAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0VYUEFORF90Uk5TKSAhPSAwKQorICAgICAgICAgICAgcG5nX2RvX2V4cGFuZChyb3dfaW5mbywgcG5nX3B0ci0+cm93X2J1ZiArIDEsCisgICAgICAgICAgICAgICAgJihwbmdfcHRyLT50cmFuc19jb2xvcikpOworCisgICAgICAgICBlbHNlCisgICAgICAgICAgICBwbmdfZG9fZXhwYW5kKHJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIH0KKyAgIH0KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfU1RSSVBfQUxQSEFfU1VQUE9SVEVECisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19TVFJJUF9BTFBIQSkgIT0gMCAmJgorICAgICAgIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQ09NUE9TRSkgPT0gMCAmJgorICAgICAgIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEgfHwKKyAgICAgICByb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKSkKKyAgICAgIHBuZ19kb19zdHJpcF9jaGFubmVsKHJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwKKyAgICAgICAgIDAgLyogYXRfc3RhcnQgPT0gZmFsc2UsIGJlY2F1c2UgU1dBUF9BTFBIQSBoYXBwZW5zIGxhdGVyICovKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVECisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19SR0JfVE9fR1JBWSkgIT0gMCkKKyAgIHsKKyAgICAgIGludCByZ2JfZXJyb3IgPQorICAgICAgICAgIHBuZ19kb19yZ2JfdG9fZ3JheShwbmdfcHRyLCByb3dfaW5mbywKKyAgICAgICAgICAgICAgcG5nX3B0ci0+cm93X2J1ZiArIDEpOworCisgICAgICBpZiAocmdiX2Vycm9yICE9IDApCisgICAgICB7CisgICAgICAgICBwbmdfcHRyLT5yZ2JfdG9fZ3JheV9zdGF0dXM9MTsKKyAgICAgICAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1JHQl9UT19HUkFZKSA9PQorICAgICAgICAgICAgIFBOR19SR0JfVE9fR1JBWV9XQVJOKQorICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgInBuZ19kb19yZ2JfdG9fZ3JheSBmb3VuZCBub25ncmF5IHBpeGVsIik7CisKKyAgICAgICAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1JHQl9UT19HUkFZKSA9PQorICAgICAgICAgICAgIFBOR19SR0JfVE9fR1JBWV9FUlIpCisgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInBuZ19kb19yZ2JfdG9fZ3JheSBmb3VuZCBub25ncmF5IHBpeGVsIik7CisgICAgICB9CisgICB9CisjZW5kaWYKKworLyogRnJvbSBBbmRyZWFzIERpbGdlciBlLW1haWwgdG8gcG5nLWltcGxlbWVudCwgMjYgTWFyY2ggMTk5ODoKKyAqCisgKiAgIEluIG1vc3QgY2FzZXMsIHRoZSAic2ltcGxlIHRyYW5zcGFyZW5jeSIgc2hvdWxkIGJlIGRvbmUgcHJpb3IgdG8gZG9pbmcKKyAqICAgZ3JheS10by1SR0IsIG9yIHlvdSB3aWxsIGhhdmUgdG8gdGVzdCAzeCBhcyBtYW55IGJ5dGVzIHRvIGNoZWNrIGlmIGEKKyAqICAgcGl4ZWwgaXMgdHJhbnNwYXJlbnQuICBZb3Ugd291bGQgYWxzbyBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQorICogICB0cmFuc3BhcmVuY3kgaW5mb3JtYXRpb24gaXMgdXBncmFkZWQgdG8gUkdCLgorICoKKyAqICAgVG8gc3VtbWFyaXplLCB0aGUgY3VycmVudCBmbG93IGlzOgorICogICAtIEdyYXkgKyBzaW1wbGUgdHJhbnNwYXJlbmN5IC0+IGNvbXBhcmUgMSBvciAyIGdyYXkgYnl0ZXMgYW5kIGNvbXBvc2l0ZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYmFja2dyb3VuZCAiaW4gcGxhY2UiIGlmIHRyYW5zcGFyZW50LAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnQgdG8gUkdCIGlmIG5lY2Vzc2FyeQorICogICAtIEdyYXkgKyBhbHBoYSAtPiBjb21wb3NpdGUgd2l0aCBncmF5IGJhY2tncm91bmQgYW5kIHJlbW92ZSBhbHBoYSBieXRlcywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0IHRvIFJHQiBpZiBuZWNlc3NhcnkKKyAqCisgKiAgIFRvIHN1cHBvcnQgUkdCIGJhY2tncm91bmRzIGZvciBncmF5IGltYWdlcyB3ZSBuZWVkOgorICogICAtIEdyYXkgKyBzaW1wbGUgdHJhbnNwYXJlbmN5IC0+IGNvbnZlcnQgdG8gUkdCICsgc2ltcGxlIHRyYW5zcGFyZW5jeSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlIDMgb3IgNiBieXRlcyBhbmQgY29tcG9zaXRlIHdpdGgKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kICJpbiBwbGFjZSIgaWYgdHJhbnNwYXJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoM3ggY29tcGFyZS9waXhlbCBjb21wYXJlZCB0byBkb2luZworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZSB3aXRoIGdyYXkgYmtncm5kKQorICogICAtIEdyYXkgKyBhbHBoYSAtPiBjb252ZXJ0IHRvIFJHQiArIGFscGhhLCBjb21wb3NpdGUgd2l0aCBiYWNrZ3JvdW5kIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSBhbHBoYSBieXRlcyAoM3ggZmxvYXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zL3BpeGVsIGNvbXBhcmVkIHdpdGggY29tcG9zaXRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gZ3JheSBiYWNrZ3JvdW5kKQorICoKKyAqICBHcmVnJ3MgY2hhbmdlIHdpbGwgZG8gdGhpcy4gIFRoZSByZWFzb24gaXQgd2Fzbid0IGRvbmUgYmVmb3JlIGlzIGZvcgorICogIHBlcmZvcm1hbmNlLCBhcyB0aGlzIGluY3JlYXNlcyB0aGUgcGVyLXBpeGVsIG9wZXJhdGlvbnMuICBJZiB3ZSB3b3VsZCBjaGVjaworICogIGluIGFkdmFuY2UgaWYgdGhlIGJhY2tncm91bmQgd2FzIGdyYXkgb3IgUkdCLCBhbmQgcG9zaXRpb24gdGhlIGdyYXktdG8tUkdCCisgKiAgdHJhbnNmb3JtIGFwcHJvcHJpYXRlbHksIHRoZW4gaXQgd291bGQgc2F2ZSBhIGxvdCBvZiB3b3JrL3RpbWUuCisgKi8KKworI2lmZGVmIFBOR19SRUFEX0dSQVlfVE9fUkdCX1NVUFBPUlRFRAorICAgLyogSWYgZ3JheSAtPiBSR0IsIGRvIHNvIG5vdyBvbmx5IGlmIGJhY2tncm91bmQgaXMgbm9uLWdyYXk7IGVsc2UgZG8gbGF0ZXIKKyAgICAqIGZvciBwZXJmb3JtYW5jZSByZWFzb25zCisgICAgKi8KKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0dSQVlfVE9fUkdCKSAhPSAwICYmCisgICAgICAgKHBuZ19wdHItPm1vZGUgJiBQTkdfQkFDS0dST1VORF9JU19HUkFZKSA9PSAwKQorICAgICAgcG5nX2RvX2dyYXlfdG9fcmdiKHJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpIHx8XAorICAgZGVmaW5lZChQTkdfUkVBRF9BTFBIQV9NT0RFX1NVUFBPUlRFRCkKKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0NPTVBPU0UpICE9IDApCisgICAgICBwbmdfZG9fY29tcG9zZShyb3dfaW5mbywgcG5nX3B0ci0+cm93X2J1ZiArIDEsIHBuZ19wdHIpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0dBTU1BKSAhPSAwICYmCisjaWZkZWYgUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVECisgICAgICAvKiBCZWNhdXNlIFJHQl9UT19HUkFZIGRvZXMgdGhlIGdhbW1hIHRyYW5zZm9ybS4gKi8KKyAgICAgIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUkdCX1RPX0dSQVkpID09IDAgJiYKKyNlbmRpZgorI2lmIGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpIHx8XAorICAgZGVmaW5lZChQTkdfUkVBRF9BTFBIQV9NT0RFX1NVUFBPUlRFRCkKKyAgICAgIC8qIEJlY2F1c2UgUE5HX0NPTVBPU0UgZG9lcyB0aGUgZ2FtbWEgdHJhbnNmb3JtIGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0bworICAgICAgICogZG8gKGlmIHRoZXJlIGlzIGFuIGFscGhhIGNoYW5uZWwgb3IgdHJhbnNwYXJlbmN5LikKKyAgICAgICAqLworICAgICAgICEoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19DT01QT1NFKSAhPSAwICYmCisgICAgICAgKChwbmdfcHRyLT5udW1fdHJhbnMgIT0gMCkgfHwKKyAgICAgICAocG5nX3B0ci0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKSAhPSAwKSkgJiYKKyNlbmRpZgorICAgICAgLyogQmVjYXVzZSBwbmdfaW5pdF9yZWFkX3RyYW5zZm9ybWF0aW9ucyB0cmFuc2Zvcm1zIHRoZSBwYWxldHRlLCB1bmxlc3MKKyAgICAgICAqIFJHQl9UT19HUkFZIHdpbGwgZG8gdGhlIHRyYW5zZm9ybS4KKyAgICAgICAqLworICAgICAgIChwbmdfcHRyLT5jb2xvcl90eXBlICE9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpKQorICAgICAgcG5nX2RvX2dhbW1hKHJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwgcG5nX3B0cik7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX1NUUklQX0FMUEhBX1NVUFBPUlRFRAorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfU1RSSVBfQUxQSEEpICE9IDAgJiYKKyAgICAgICAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0NPTVBPU0UpICE9IDAgJiYKKyAgICAgICAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBIHx8CisgICAgICAgcm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkpCisgICAgICBwbmdfZG9fc3RyaXBfY2hhbm5lbChyb3dfaW5mbywgcG5nX3B0ci0+cm93X2J1ZiArIDEsCisgICAgICAgICAgMCAvKiBhdF9zdGFydCA9PSBmYWxzZSwgYmVjYXVzZSBTV0FQX0FMUEhBIGhhcHBlbnMgbGF0ZXIgKi8pOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9BTFBIQV9NT0RFX1NVUFBPUlRFRAorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRU5DT0RFX0FMUEhBKSAhPSAwICYmCisgICAgICAgKHJvd19pbmZvLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpICE9IDApCisgICAgICBwbmdfZG9fZW5jb2RlX2FscGhhKHJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwgcG5nX3B0cik7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX1NDQUxFXzE2X1RPXzhfU1VQUE9SVEVECisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19TQ0FMRV8xNl9UT184KSAhPSAwKQorICAgICAgcG5nX2RvX3NjYWxlXzE2X3RvXzgocm93X2luZm8sIHBuZ19wdHItPnJvd19idWYgKyAxKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfU1RSSVBfMTZfVE9fOF9TVVBQT1JURUQKKyAgIC8qIFRoZXJlIGlzIG5vIGhhcm0gaW4gZG9pbmcgYm90aCBvZiB0aGVzZSBiZWNhdXNlIG9ubHkgb25lIGhhcyBhbnkgZWZmZWN0LAorICAgICogYnkgcHV0dGluZyB0aGUgJ3NjYWxlJyBvcHRpb24gZmlyc3QgaWYgdGhlIGFwcCBhc2tzIGZvciBzY2FsZSAoZWl0aGVyIGJ5CisgICAgKiBjYWxsaW5nIHRoZSBBUEkgb3IgaW4gYSBUUkFOU0ZPUk0gZmxhZykgdGhpcyBpcyB3aGF0IGhhcHBlbnMuCisgICAgKi8KKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HXzE2X1RPXzgpICE9IDApCisgICAgICBwbmdfZG9fY2hvcChyb3dfaW5mbywgcG5nX3B0ci0+cm93X2J1ZiArIDEpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9RVUFOVElaRV9TVVBQT1JURUQKKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1FVQU5USVpFKSAhPSAwKQorICAgeworICAgICAgcG5nX2RvX3F1YW50aXplKHJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwKKyAgICAgICAgICBwbmdfcHRyLT5wYWxldHRlX2xvb2t1cCwgcG5nX3B0ci0+cXVhbnRpemVfaW5kZXgpOworCisgICAgICBpZiAocm93X2luZm8tPnJvd2J5dGVzID09IDApCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInBuZ19kb19xdWFudGl6ZSByZXR1cm5lZCByb3dieXRlcz0wIik7CisgICB9CisjZW5kaWYgLyogUkVBRF9RVUFOVElaRSAqLworCisjaWZkZWYgUE5HX1JFQURfRVhQQU5EXzE2X1NVUFBPUlRFRAorICAgLyogRG8gdGhlIGV4cGFuc2lvbiBub3csIGFmdGVyIGFsbCB0aGUgYXJpdGhtZXRpYyBoYXMgYmVlbiBkb25lLiAgTm90aWNlCisgICAgKiB0aGF0IHByZXZpb3VzIHRyYW5zZm9ybWF0aW9ucyBjYW4gaGFuZGxlIHRoZSBQTkdfRVhQQU5EXzE2IGZsYWcgaWYgdGhpcworICAgICogaXMgZWZmaWNpZW50IChwYXJ0aWN1bGFybHkgdHJ1ZSBpbiB0aGUgY2FzZSBvZiBnYW1tYSBjb3JyZWN0aW9uLCB3aGVyZQorICAgICogYmV0dGVyIGFjY3VyYWN5IHJlc3VsdHMgZmFzdGVyISkKKyAgICAqLworICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRVhQQU5EXzE2KSAhPSAwKQorICAgICAgcG5nX2RvX2V4cGFuZF8xNihyb3dfaW5mbywgcG5nX3B0ci0+cm93X2J1ZiArIDEpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9HUkFZX1RPX1JHQl9TVVBQT1JURUQKKyAgIC8qIE5PVEU6IG1vdmVkIGhlcmUgaW4gMS41LjQgKGZyb20gbXVjaCBsYXRlciBpbiB0aGlzIGxpc3QuKSAqLworICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfR1JBWV9UT19SR0IpICE9IDAgJiYKKyAgICAgICAocG5nX3B0ci0+bW9kZSAmIFBOR19CQUNLR1JPVU5EX0lTX0dSQVkpICE9IDApCisgICAgICBwbmdfZG9fZ3JheV90b19yZ2Iocm93X2luZm8sIHBuZ19wdHItPnJvd19idWYgKyAxKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfSU5WRVJUX1NVUFBPUlRFRAorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5WRVJUX01PTk8pICE9IDApCisgICAgICBwbmdfZG9faW52ZXJ0KHJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQKKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVkVSVF9BTFBIQSkgIT0gMCkKKyAgICAgIHBuZ19kb19yZWFkX2ludmVydF9hbHBoYShyb3dfaW5mbywgcG5nX3B0ci0+cm93X2J1ZiArIDEpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9TSElGVF9TVVBQT1JURUQKKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1NISUZUKSAhPSAwKQorICAgICAgcG5nX2RvX3Vuc2hpZnQocm93X2luZm8sIHBuZ19wdHItPnJvd19idWYgKyAxLAorICAgICAgICAgICYocG5nX3B0ci0+c2hpZnQpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfUEFDS19TVVBQT1JURUQKKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1BBQ0spICE9IDApCisgICAgICBwbmdfZG9fdW5wYWNrKHJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0NIRUNLX0ZPUl9JTlZBTElEX0lOREVYX1NVUFBPUlRFRAorICAgLyogQWRkZWQgYXQgbGlicG5nLTEuNS4xMCAqLworICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgJiYKKyAgICAgICBwbmdfcHRyLT5udW1fcGFsZXR0ZV9tYXggPj0gMCkKKyAgICAgIHBuZ19kb19jaGVja19wYWxldHRlX2luZGV4ZXMocG5nX3B0ciwgcm93X2luZm8pOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9CR1JfU1VQUE9SVEVECisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19CR1IpICE9IDApCisgICAgICBwbmdfZG9fYmdyKHJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRAorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUEFDS1NXQVApICE9IDApCisgICAgICBwbmdfZG9fcGFja3N3YXAocm93X2luZm8sIHBuZ19wdHItPnJvd19idWYgKyAxKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRAorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRklMTEVSKSAhPSAwKQorICAgICAgcG5nX2RvX3JlYWRfZmlsbGVyKHJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwKKyAgICAgICAgICAocG5nX3VpbnRfMzIpcG5nX3B0ci0+ZmlsbGVyLCBwbmdfcHRyLT5mbGFncyk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX1NXQVBfQUxQSEFfU1VQUE9SVEVECisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19TV0FQX0FMUEhBKSAhPSAwKQorICAgICAgcG5nX2RvX3JlYWRfc3dhcF9hbHBoYShyb3dfaW5mbywgcG5nX3B0ci0+cm93X2J1ZiArIDEpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF8xNkJJVF9TVVBQT1JURUQKKyNpZmRlZiBQTkdfUkVBRF9TV0FQX1NVUFBPUlRFRAorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfU1dBUF9CWVRFUykgIT0gMCkKKyAgICAgIHBuZ19kb19zd2FwKHJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVECisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19VU0VSX1RSQU5TRk9STSkgIT0gMCkKKyAgIHsKKyAgICAgIGlmIChwbmdfcHRyLT5yZWFkX3VzZXJfdHJhbnNmb3JtX2ZuICE9IE5VTEwpCisgICAgICAgICAoKihwbmdfcHRyLT5yZWFkX3VzZXJfdHJhbnNmb3JtX2ZuKSkgLyogVXNlciByZWFkIHRyYW5zZm9ybSBmdW5jdGlvbiAqLworICAgICAgICAgICAgIChwbmdfcHRyLCAgICAgLyogcG5nX3B0ciAqLworICAgICAgICAgICAgIHJvd19pbmZvLCAgICAgLyogcm93X2luZm86ICovCisgICAgICAgICAgICAgICAgLyogIHBuZ191aW50XzMyIHdpZHRoOyAgICAgICB3aWR0aCBvZiByb3cgKi8KKyAgICAgICAgICAgICAgICAvKiAgcG5nX3NpemVfdCByb3dieXRlczsgICAgIG51bWJlciBvZiBieXRlcyBpbiByb3cgKi8KKyAgICAgICAgICAgICAgICAvKiAgcG5nX2J5dGUgY29sb3JfdHlwZTsgICAgIGNvbG9yIHR5cGUgb2YgcGl4ZWxzICovCisgICAgICAgICAgICAgICAgLyogIHBuZ19ieXRlIGJpdF9kZXB0aDsgICAgICBiaXQgZGVwdGggb2Ygc2FtcGxlcyAqLworICAgICAgICAgICAgICAgIC8qICBwbmdfYnl0ZSBjaGFubmVsczsgICAgICAgbnVtYmVyIG9mIGNoYW5uZWxzICgxLTQpICovCisgICAgICAgICAgICAgICAgLyogIHBuZ19ieXRlIHBpeGVsX2RlcHRoOyAgICBiaXRzIHBlciBwaXhlbCAoZGVwdGgqY2hhbm5lbHMpICovCisgICAgICAgICAgICAgcG5nX3B0ci0+cm93X2J1ZiArIDEpOyAgICAvKiBzdGFydCBvZiBwaXhlbCBkYXRhIGZvciByb3cgKi8KKyNpZmRlZiBQTkdfVVNFUl9UUkFOU0ZPUk1fUFRSX1NVUFBPUlRFRAorICAgICAgaWYgKHBuZ19wdHItPnVzZXJfdHJhbnNmb3JtX2RlcHRoICE9IDApCisgICAgICAgICByb3dfaW5mby0+Yml0X2RlcHRoID0gcG5nX3B0ci0+dXNlcl90cmFuc2Zvcm1fZGVwdGg7CisKKyAgICAgIGlmIChwbmdfcHRyLT51c2VyX3RyYW5zZm9ybV9jaGFubmVscyAhPSAwKQorICAgICAgICAgcm93X2luZm8tPmNoYW5uZWxzID0gcG5nX3B0ci0+dXNlcl90cmFuc2Zvcm1fY2hhbm5lbHM7CisjZW5kaWYKKyAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IChwbmdfYnl0ZSkocm93X2luZm8tPmJpdF9kZXB0aCAqCisgICAgICAgICAgcm93X2luZm8tPmNoYW5uZWxzKTsKKworICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHJvd19pbmZvLT5waXhlbF9kZXB0aCwgcm93X2luZm8tPndpZHRoKTsKKyAgIH0KKyNlbmRpZgorfQorCisjZW5kaWYgLyogUkVBRF9UUkFOU0ZPUk1TICovCisjZW5kaWYgLyogUkVBRCAqLwpkaWZmIC0tZ2l0IGEvbGlicG5nL3BuZ3J1dGlsLmMgYi9saWJwbmcvcG5ncnV0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzgyNDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3BuZ3J1dGlsLmMKQEAgLTAsMCArMSw0NjA2IEBACisKKy8qIHBuZ3J1dGlsLmMgLSB1dGlsaXRpZXMgdG8gcmVhZCBhIFBORyBmaWxlCisgKgorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMjAgW0RlY2VtYmVyIDMsIDIwMTVdCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNSBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQorICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisgKiBhbmQgbGljZW5zZSBpbiBwbmcuaAorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0aGF0IGFyZSBvbmx5IGNhbGxlZCBmcm9tIHdpdGhpbgorICogbGlicG5nIGl0c2VsZiBkdXJpbmcgdGhlIGNvdXJzZSBvZiByZWFkaW5nIGFuIGltYWdlLgorICovCisKKyNpbmNsdWRlICJwbmdwcml2LmgiCisKKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKKworcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X3VpbnRfMzEocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9ieXRlcCBidWYpCit7CisgICBwbmdfdWludF8zMiB1dmFsID0gcG5nX2dldF91aW50XzMyKGJ1Zik7CisKKyAgIGlmICh1dmFsID4gUE5HX1VJTlRfMzFfTUFYKQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJQTkcgdW5zaWduZWQgaW50ZWdlciBvdXQgb2YgcmFuZ2UiKTsKKworICAgcmV0dXJuICh1dmFsKTsKK30KKworI2lmIGRlZmluZWQoUE5HX1JFQURfZ0FNQV9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfY0hSTV9TVVBQT1JURUQpCisvKiBUaGUgZm9sbG93aW5nIGlzIGEgdmFyaWF0aW9uIG9uIHRoZSBhYm92ZSBmb3IgdXNlIHdpdGggdGhlIGZpeGVkCisgKiBwb2ludCB2YWx1ZXMgdXNlZCBmb3IgZ0FNQSBhbmQgY0hSTS4gIEluc3RlYWQgb2YgcG5nX2Vycm9yIGl0CisgKiBpc3N1ZXMgYSB3YXJuaW5nIGFuZCByZXR1cm5zICgtMSkgLSBhbiBpbnZhbGlkIHZhbHVlIGJlY2F1c2UgYm90aAorICogZ0FNQSBhbmQgY0hSTSB1c2UgKnVuc2lnbmVkKiBpbnRlZ2VycyBmb3IgZml4ZWQgcG9pbnQgdmFsdWVzLgorICovCisjZGVmaW5lIFBOR19GSVhFRF9FUlJPUiAoLTEpCisKK3N0YXRpYyBwbmdfZml4ZWRfcG9pbnQgLyogUFJJVkFURSAqLworcG5nX2dldF9maXhlZF9wb2ludChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2J5dGVwIGJ1ZikKK3sKKyAgIHBuZ191aW50XzMyIHV2YWwgPSBwbmdfZ2V0X3VpbnRfMzIoYnVmKTsKKworICAgaWYgKHV2YWwgPD0gUE5HX1VJTlRfMzFfTUFYKQorICAgICAgcmV0dXJuIChwbmdfZml4ZWRfcG9pbnQpdXZhbDsgLyoga25vd24gdG8gYmUgaW4gcmFuZ2UgKi8KKworICAgLyogVGhlIGNhbGxlciBjYW4gdHVybiBvZmYgdGhlIHdhcm5pbmcgYnkgcGFzc2luZyBOVUxMLiAqLworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCkKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJQTkcgZml4ZWQgcG9pbnQgaW50ZWdlciBvdXQgb2YgcmFuZ2UiKTsKKworICAgcmV0dXJuIFBOR19GSVhFRF9FUlJPUjsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfSU5UX0ZVTkNUSU9OU19TVVBQT1JURUQKKy8qIE5PVEU6IHRoZSByZWFkIG1hY3JvcyB3aWxsIG9ic2N1cmUgdGhlc2UgZGVmaW5pdGlvbnMsIHNvIHRoYXQgaWYKKyAqIFBOR19VU0VfUkVBRF9NQUNST1MgaXMgc2V0IHRoZSBsaWJyYXJ5IHdpbGwgbm90IHVzZSB0aGVtIGludGVybmFsbHksCisgKiBidXQgdGhlIEFQSXMgd2lsbCBzdGlsbCBiZSBhdmFpbGFibGUgZXh0ZXJuYWxseS4KKyAqCisgKiBUaGUgcGFyZW50aGVzZXMgYXJvdW5kICJQTkdBUEkgZnVuY3Rpb25fbmFtZSIgaW4gdGhlIGZvbGxvd2luZyB0aHJlZQorICogZnVuY3Rpb25zIGFyZSBuZWNlc3NhcnkgYmVjYXVzZSB0aGV5IGFsbG93IHRoZSBtYWNyb3MgdG8gY28tZXhpc3Qgd2l0aAorICogdGhlc2UgKHVudXNlZCBidXQgZXhwb3J0ZWQpIGZ1bmN0aW9ucy4KKyAqLworCisvKiBHcmFiIGFuIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIGZyb20gYSBidWZmZXIgaW4gYmlnLWVuZGlhbiBmb3JtYXQuICovCitwbmdfdWludF8zMiAoUE5HQVBJCitwbmdfZ2V0X3VpbnRfMzIpKHBuZ19jb25zdF9ieXRlcCBidWYpCit7CisgICBwbmdfdWludF8zMiB1dmFsID0KKyAgICAgICAoKHBuZ191aW50XzMyKSgqKGJ1ZiAgICApKSA8PCAyNCkgKworICAgICAgICgocG5nX3VpbnRfMzIpKCooYnVmICsgMSkpIDw8IDE2KSArCisgICAgICAgKChwbmdfdWludF8zMikoKihidWYgKyAyKSkgPDwgIDgpICsKKyAgICAgICAoKHBuZ191aW50XzMyKSgqKGJ1ZiArIDMpKSAgICAgICkgOworCisgICByZXR1cm4gdXZhbDsKK30KKworLyogR3JhYiBhIHNpZ25lZCAzMi1iaXQgaW50ZWdlciBmcm9tIGEgYnVmZmVyIGluIGJpZy1lbmRpYW4gZm9ybWF0LiAgVGhlCisgKiBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgUE5HIGZpbGUgaW4gdHdvJ3MgY29tcGxlbWVudCBmb3JtYXQgYW5kIHRoZXJlCisgKiBpcyBubyBndWFyYW50ZWUgdGhhdCBhICdwbmdfaW50XzMyJyBpcyBleGFjdGx5IDMyIGJpdHMsIHRoZXJlZm9yZQorICogdGhlIGZvbGxvd2luZyBjb2RlIGRvZXMgYSB0d28ncyBjb21wbGVtZW50IHRvIG5hdGl2ZSBjb252ZXJzaW9uLgorICovCitwbmdfaW50XzMyIChQTkdBUEkKK3BuZ19nZXRfaW50XzMyKShwbmdfY29uc3RfYnl0ZXAgYnVmKQoreworICAgcG5nX3VpbnRfMzIgdXZhbCA9IHBuZ19nZXRfdWludF8zMihidWYpOworICAgaWYgKCh1dmFsICYgMHg4MDAwMDAwMCkgPT0gMCkgLyogbm9uLW5lZ2F0aXZlICovCisgICAgICByZXR1cm4gdXZhbDsKKworICAgdXZhbCA9ICh1dmFsIF4gMHhmZmZmZmZmZikgKyAxOyAgLyogMidzIGNvbXBsZW1lbnQ6IC14ID0gfngrMSAqLworICAgaWYgKCh1dmFsICYgMHg4MDAwMDAwMCkgPT0gMCkgLyogbm8gb3ZlcmZsb3cgKi8KKyAgICAgICByZXR1cm4gLShwbmdfaW50XzMyKXV2YWw7CisgICAvKiBUaGUgZm9sbG93aW5nIGhhcyB0byBiZSBzYWZlOyB0aGlzIGZ1bmN0aW9uIG9ubHkgZ2V0cyBjYWxsZWQgb24gUE5HIGRhdGEKKyAgICAqIGFuZCBpZiB3ZSBnZXQgaGVyZSB0aGF0IGRhdGEgaXMgaW52YWxpZC4gIDAgaXMgdGhlIG1vc3Qgc2FmZSB2YWx1ZSBhbmQKKyAgICAqIGlmIG5vdCB0aGVuIGFuIGF0dGFja2VyIHdvdWxkIHN1cmVseSBqdXN0IGdlbmVyYXRlIGEgUE5HIHdpdGggMCBpbnN0ZWFkLgorICAgICovCisgICByZXR1cm4gMDsKK30KKworLyogR3JhYiBhbiB1bnNpZ25lZCAxNi1iaXQgaW50ZWdlciBmcm9tIGEgYnVmZmVyIGluIGJpZy1lbmRpYW4gZm9ybWF0LiAqLworcG5nX3VpbnRfMTYgKFBOR0FQSQorcG5nX2dldF91aW50XzE2KShwbmdfY29uc3RfYnl0ZXAgYnVmKQoreworICAgLyogQU5TSS1DIHJlcXVpcmVzIGFuIGludCB2YWx1ZSB0byBhY2NvbW9kYXRlIGF0IGxlYXN0IDE2IGJpdHMgc28gdGhpcworICAgICogd29ya3MgYW5kIGFsbG93cyB0aGUgY29tcGlsZXIgbm90IHRvIHdvcnJ5IGFib3V0IHBvc3NpYmxlIG5hcnJvd2luZworICAgICogb24gMzItYml0IHN5c3RlbXMuICAoUHJlLUFOU0kgc3lzdGVtcyBkaWQgbm90IG1ha2UgaW50ZWdlcnMgc21hbGxlcgorICAgICogdGhhbiAxNiBiaXRzIGVpdGhlci4pCisgICAgKi8KKyAgIHVuc2lnbmVkIGludCB2YWwgPQorICAgICAgICgodW5zaWduZWQgaW50KSgqYnVmKSA8PCA4KSArCisgICAgICAgKCh1bnNpZ25lZCBpbnQpKCooYnVmICsgMSkpKTsKKworICAgcmV0dXJuIChwbmdfdWludF8xNil2YWw7Cit9CisKKyNlbmRpZiAvKiBSRUFEX0lOVF9GVU5DVElPTlMgKi8KKworLyogUmVhZCBhbmQgY2hlY2sgdGhlIFBORyBmaWxlIHNpZ25hdHVyZSAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfcmVhZF9zaWcocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIpCit7CisgICBwbmdfc2l6ZV90IG51bV9jaGVja2VkLCBudW1fdG9fY2hlY2s7CisKKyAgIC8qIEV4aXQgaWYgdGhlIHVzZXIgYXBwbGljYXRpb24gZG9lcyBub3QgZXhwZWN0IGEgc2lnbmF0dXJlLiAqLworICAgaWYgKHBuZ19wdHItPnNpZ19ieXRlcyA+PSA4KQorICAgICAgcmV0dXJuOworCisgICBudW1fY2hlY2tlZCA9IHBuZ19wdHItPnNpZ19ieXRlczsKKyAgIG51bV90b19jaGVjayA9IDggLSBudW1fY2hlY2tlZDsKKworI2lmZGVmIFBOR19JT19TVEFURV9TVVBQT1JURUQKKyAgIHBuZ19wdHItPmlvX3N0YXRlID0gUE5HX0lPX1JFQURJTkcgfCBQTkdfSU9fU0lHTkFUVVJFOworI2VuZGlmCisKKyAgIC8qIFRoZSBzaWduYXR1cmUgbXVzdCBiZSBzZXJpYWxpemVkIGluIGEgc2luZ2xlIEkvTyBjYWxsLiAqLworICAgcG5nX3JlYWRfZGF0YShwbmdfcHRyLCAmKGluZm9fcHRyLT5zaWduYXR1cmVbbnVtX2NoZWNrZWRdKSwgbnVtX3RvX2NoZWNrKTsKKyAgIHBuZ19wdHItPnNpZ19ieXRlcyA9IDg7CisKKyAgIGlmIChwbmdfc2lnX2NtcChpbmZvX3B0ci0+c2lnbmF0dXJlLCBudW1fY2hlY2tlZCwgbnVtX3RvX2NoZWNrKSAhPSAwKQorICAgeworICAgICAgaWYgKG51bV9jaGVja2VkIDwgNCAmJgorICAgICAgICAgIHBuZ19zaWdfY21wKGluZm9fcHRyLT5zaWduYXR1cmUsIG51bV9jaGVja2VkLCBudW1fdG9fY2hlY2sgLSA0KSkKKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTm90IGEgUE5HIGZpbGUiKTsKKyAgICAgIGVsc2UKKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiUE5HIGZpbGUgY29ycnVwdGVkIGJ5IEFTQ0lJIGNvbnZlcnNpb24iKTsKKyAgIH0KKyAgIGlmIChudW1fY2hlY2tlZCA8IDMpCisgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX1BOR19TSUdOQVRVUkU7Cit9CisKKy8qIFJlYWQgdGhlIGNodW5rIGhlYWRlciAobGVuZ3RoICsgdHlwZSBuYW1lKS4KKyAqIFB1dCB0aGUgdHlwZSBuYW1lIGludG8gcG5nX3B0ci0+Y2h1bmtfbmFtZSwgYW5kIHJldHVybiB0aGUgbGVuZ3RoLgorICovCitwbmdfdWludF8zMiAvKiBQUklWQVRFICovCitwbmdfcmVhZF9jaHVua19oZWFkZXIocG5nX3N0cnVjdHJwIHBuZ19wdHIpCit7CisgICBwbmdfYnl0ZSBidWZbOF07CisgICBwbmdfdWludF8zMiBsZW5ndGg7CisKKyNpZmRlZiBQTkdfSU9fU1RBVEVfU1VQUE9SVEVECisgICBwbmdfcHRyLT5pb19zdGF0ZSA9IFBOR19JT19SRUFESU5HIHwgUE5HX0lPX0NIVU5LX0hEUjsKKyNlbmRpZgorCisgICAvKiBSZWFkIHRoZSBsZW5ndGggYW5kIHRoZSBjaHVuayBuYW1lLgorICAgICogVGhpcyBtdXN0IGJlIHBlcmZvcm1lZCBpbiBhIHNpbmdsZSBJL08gY2FsbC4KKyAgICAqLworICAgcG5nX3JlYWRfZGF0YShwbmdfcHRyLCBidWYsIDgpOworICAgbGVuZ3RoID0gcG5nX2dldF91aW50XzMxKHBuZ19wdHIsIGJ1Zik7CisKKyAgIC8qIFB1dCB0aGUgY2h1bmsgbmFtZSBpbnRvIHBuZ19wdHItPmNodW5rX25hbWUuICovCisgICBwbmdfcHRyLT5jaHVua19uYW1lID0gUE5HX0NIVU5LX0ZST01fU1RSSU5HKGJ1Zis0KTsKKworICAgcG5nX2RlYnVnMigwLCAiUmVhZGluZyAlbHggY2h1bmssIGxlbmd0aCA9ICVsdSIsCisgICAgICAgKHVuc2lnbmVkIGxvbmcpcG5nX3B0ci0+Y2h1bmtfbmFtZSwgKHVuc2lnbmVkIGxvbmcpbGVuZ3RoKTsKKworICAgLyogUmVzZXQgdGhlIGNyYyBhbmQgcnVuIGl0IG92ZXIgdGhlIGNodW5rIG5hbWUuICovCisgICBwbmdfcmVzZXRfY3JjKHBuZ19wdHIpOworICAgcG5nX2NhbGN1bGF0ZV9jcmMocG5nX3B0ciwgYnVmICsgNCwgNCk7CisKKyAgIC8qIENoZWNrIHRvIHNlZSBpZiBjaHVuayBuYW1lIGlzIHZhbGlkLiAqLworICAgcG5nX2NoZWNrX2NodW5rX25hbWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtfbmFtZSk7CisKKyNpZmRlZiBQTkdfSU9fU1RBVEVfU1VQUE9SVEVECisgICBwbmdfcHRyLT5pb19zdGF0ZSA9IFBOR19JT19SRUFESU5HIHwgUE5HX0lPX0NIVU5LX0RBVEE7CisjZW5kaWYKKworICAgcmV0dXJuIGxlbmd0aDsKK30KKworLyogUmVhZCBkYXRhLCBhbmQgKG9wdGlvbmFsbHkpIHJ1biBpdCB0aHJvdWdoIHRoZSBDUkMuICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19jcmNfcmVhZChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2J5dGVwIGJ1ZiwgcG5nX3VpbnRfMzIgbGVuZ3RoKQoreworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgcG5nX3JlYWRfZGF0YShwbmdfcHRyLCBidWYsIGxlbmd0aCk7CisgICBwbmdfY2FsY3VsYXRlX2NyYyhwbmdfcHRyLCBidWYsIGxlbmd0aCk7Cit9CisKKy8qIE9wdGlvbmFsbHkgc2tpcCBkYXRhIGFuZCB0aGVuIGNoZWNrIHRoZSBDUkMuICBEZXBlbmRpbmcgb24gd2hldGhlciB3ZQorICogYXJlIHJlYWRpbmcgYW4gYW5jaWxsYXJ5IG9yIGNyaXRpY2FsIGNodW5rLCBhbmQgaG93IHRoZSBwcm9ncmFtIGhhcyBzZXQKKyAqIHRoaW5ncyB1cCwgd2UgbWF5IGNhbGN1bGF0ZSB0aGUgQ1JDIG9uIHRoZSBkYXRhIGFuZCBwcmludCBhIG1lc3NhZ2UuCisgKiBSZXR1cm5zICcxJyBpZiB0aGVyZSB3YXMgYSBDUkMgZXJyb3IsICcwJyBvdGhlcndpc2UuCisgKi8KK2ludCAvKiBQUklWQVRFICovCitwbmdfY3JjX2ZpbmlzaChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgc2tpcCkKK3sKKyAgIC8qIFRoZSBzaXplIG9mIHRoZSBsb2NhbCBidWZmZXIgZm9yIGluZmxhdGUgaXMgYSBnb29kIGd1ZXNzIGFzIHRvIGEKKyAgICAqIHJlYXNvbmFibGUgc2l6ZSB0byB1c2UgZm9yIGJ1ZmZlcmluZyByZWFkcyBmcm9tIHRoZSBhcHBsaWNhdGlvbi4KKyAgICAqLworICAgd2hpbGUgKHNraXAgPiAwKQorICAgeworICAgICAgcG5nX3VpbnRfMzIgbGVuOworICAgICAgcG5nX2J5dGUgdG1wYnVmW1BOR19JTkZMQVRFX0JVRl9TSVpFXTsKKworICAgICAgbGVuID0gKHNpemVvZiB0bXBidWYpOworICAgICAgaWYgKGxlbiA+IHNraXApCisgICAgICAgICBsZW4gPSBza2lwOworICAgICAgc2tpcCAtPSBsZW47CisKKyAgICAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCB0bXBidWYsIGxlbik7CisgICB9CisKKyAgIGlmIChwbmdfY3JjX2Vycm9yKHBuZ19wdHIpICE9IDApCisgICB7CisgICAgICBpZiAoUE5HX0NIVU5LX0FOQ0lMTEFSWShwbmdfcHRyLT5jaHVua19uYW1lKSAhPSAwID8KKyAgICAgICAgICAocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19DUkNfQU5DSUxMQVJZX05PV0FSTikgPT0gMCA6CisgICAgICAgICAgKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfQ1JDX0NSSVRJQ0FMX1VTRSkgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19jaHVua193YXJuaW5nKHBuZ19wdHIsICJDUkMgZXJyb3IiKTsKKyAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJDUkMgZXJyb3IiKTsKKworICAgICAgcmV0dXJuICgxKTsKKyAgIH0KKworICAgcmV0dXJuICgwKTsKK30KKworI2lmZGVmIFBOR19JTkRFWF9TVVBQT1JURUQKKy8qIElmIHRpbGUgaW5kZXggaXMgdXNlZCB0byBza2lwIG92ZXIgZGF0YSBhbmQgZGVjb2RlIGEgcGFydGlhbCBpbWFnZQorICogdGhlIGNyYyB2YWx1ZSBtYXkgYmUgaW5jb3JyZWN0LgorICogVGhlIGNyYyB3aWxsIG9ubHkgYmUgY2FsY3VsYXRlZCBmb3IgdGhlIHBhcnRpYWwgZGF0YSByZWFkLAorICogbm90IHRoZSBlbnRpcmUgZGF0YSwgd2hpY2ggd2lsbCByZXN1bHQgaW4gYW4gaW5jb3JyZWN0IGNyYyB2YWx1ZS4KKyAqIFRoaXMgZnVuY3Rpb24gdHJlYXRzIGEgcG5nX2NyY19lcnJvciBhcyBhIHdhcm5pbmcsIGFzIG9wcG9zZWQgdG8gdGhlCisgKiBvcmlnaW5hbCBmdW5jdGlvbiBwbmdfY3JjX2ZpbmlzaCwgd2hpY2ggd2lsbCB0cmVhdCBpdCBhcyBhbiBlcnJvci4KKyAqLworaW50IC8qIFBSSVZBVEUgKi8KK3BuZ19vcHRfY3JjX2ZpbmlzaChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgc2tpcCkKK3sKKyAgIHdoaWxlIChza2lwID4gMCkKKyAgIHsKKyAgICAgIHBuZ191aW50XzMyIGxlbjsKKyAgICAgIHBuZ19ieXRlIHRtcGJ1ZltQTkdfSU5GTEFURV9CVUZfU0laRV07CisKKyAgICAgIGxlbiA9IChzaXplb2YgdG1wYnVmKTsKKyAgICAgIGlmIChsZW4gPiBza2lwKQorICAgICAgICAgbGVuID0gc2tpcDsKKyAgICAgIHNraXAgLT0gbGVuOworCisgICAgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgdG1wYnVmLCBsZW4pOworICAgfQorCisgICBpZiAocG5nX2NyY19lcnJvcihwbmdfcHRyKSkKKyAgIHsKKyAgICAgIHBuZ19jaHVua193YXJuaW5nKHBuZ19wdHIsICJDUkMgZXJyb3IiKTsKKyAgICAgIHJldHVybiAoMSk7CisgICB9CisKKyAgIHJldHVybiAoMCk7Cit9CisjZW5kaWYKKworLyogQ29tcGFyZSB0aGUgQ1JDIHN0b3JlZCBpbiB0aGUgUE5HIGZpbGUgd2l0aCB0aGF0IGNhbGN1bGF0ZWQgYnkgbGlicG5nIGZyb20KKyAqIHRoZSBkYXRhIGl0IGhhcyByZWFkIHRodXMgZmFyLgorICovCitpbnQgLyogUFJJVkFURSAqLworcG5nX2NyY19lcnJvcihwbmdfc3RydWN0cnAgcG5nX3B0cikKK3sKKyAgIHBuZ19ieXRlIGNyY19ieXRlc1s0XTsKKyAgIHBuZ191aW50XzMyIGNyYzsKKyAgIGludCBuZWVkX2NyYyA9IDE7CisKKyAgIGlmIChQTkdfQ0hVTktfQU5DSUxMQVJZKHBuZ19wdHItPmNodW5rX25hbWUpICE9IDApCisgICB7CisgICAgICBpZiAoKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9NQVNLKSA9PQorICAgICAgICAgIChQTkdfRkxBR19DUkNfQU5DSUxMQVJZX1VTRSB8IFBOR19GTEFHX0NSQ19BTkNJTExBUllfTk9XQVJOKSkKKyAgICAgICAgIG5lZWRfY3JjID0gMDsKKyAgIH0KKworICAgZWxzZSAvKiBjcml0aWNhbCAqLworICAgeworICAgICAgaWYgKChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0NSQ19DUklUSUNBTF9JR05PUkUpICE9IDApCisgICAgICAgICBuZWVkX2NyYyA9IDA7CisgICB9CisKKyNpZmRlZiBQTkdfSU9fU1RBVEVfU1VQUE9SVEVECisgICBwbmdfcHRyLT5pb19zdGF0ZSA9IFBOR19JT19SRUFESU5HIHwgUE5HX0lPX0NIVU5LX0NSQzsKKyNlbmRpZgorCisgICAvKiBUaGUgY2h1bmsgQ1JDIG11c3QgYmUgc2VyaWFsaXplZCBpbiBhIHNpbmdsZSBJL08gY2FsbC4gKi8KKyAgIHBuZ19yZWFkX2RhdGEocG5nX3B0ciwgY3JjX2J5dGVzLCA0KTsKKworICAgaWYgKG5lZWRfY3JjICE9IDApCisgICB7CisgICAgICBjcmMgPSBwbmdfZ2V0X3VpbnRfMzIoY3JjX2J5dGVzKTsKKyAgICAgIHJldHVybiAoKGludCkoY3JjICE9IHBuZ19wdHItPmNyYykpOworICAgfQorCisgICBlbHNlCisgICAgICByZXR1cm4gKDApOworfQorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9pQ0NQX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfUkVBRF9pVFh0X1NVUFBPUlRFRCkgfHxcCisgICAgZGVmaW5lZChQTkdfUkVBRF9wQ0FMX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfUkVBRF9zQ0FMX1NVUFBPUlRFRCkgfHxcCisgICAgZGVmaW5lZChQTkdfUkVBRF9zUExUX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfUkVBRF90RVh0X1NVUFBPUlRFRCkgfHxcCisgICAgZGVmaW5lZChQTkdfUkVBRF96VFh0X1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRCkKKy8qIE1hbmFnZSB0aGUgcmVhZCBidWZmZXI7IHRoaXMgc2ltcGx5IHJlYWxsb2NhdGVzIHRoZSBidWZmZXIgaWYgaXQgaXMgbm90IHNtYWxsCisgKiBlbm91Z2ggKG9yIGlmIGl0IGlzIG5vdCBhbGxvY2F0ZWQpLiAgVGhlIHJvdXRpbmUgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlCisgKiBidWZmZXI7IGlmIGFuIGVycm9yIG9jY3VycyBhbmQgJ3dhcm4nIGlzIHNldCB0aGUgcm91dGluZSByZXR1cm5zIE5VTEwsIGVsc2UKKyAqIGl0IHdpbGwgY2FsbCBwbmdfZXJyb3IgKHZpYSBwbmdfbWFsbG9jKSBvbiBmYWlsdXJlLiAgKHdhcm4gPT0gMiBtZWFucworICogJ3NpbGVudCcpLgorICovCitzdGF0aWMgcG5nX2J5dGVwCitwbmdfcmVhZF9idWZmZXIocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19hbGxvY19zaXplX3QgbmV3X3NpemUsIGludCB3YXJuKQoreworICAgcG5nX2J5dGVwIGJ1ZmZlciA9IHBuZ19wdHItPnJlYWRfYnVmZmVyOworCisgICBpZiAoYnVmZmVyICE9IE5VTEwgJiYgbmV3X3NpemUgPiBwbmdfcHRyLT5yZWFkX2J1ZmZlcl9zaXplKQorICAgeworICAgICAgcG5nX3B0ci0+cmVhZF9idWZmZXIgPSBOVUxMOworICAgICAgcG5nX3B0ci0+cmVhZF9idWZmZXIgPSBOVUxMOworICAgICAgcG5nX3B0ci0+cmVhZF9idWZmZXJfc2l6ZSA9IDA7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBidWZmZXIpOworICAgICAgYnVmZmVyID0gTlVMTDsKKyAgIH0KKworICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQorICAgeworICAgICAgYnVmZmVyID0gcG5nX3ZvaWRjYXN0KHBuZ19ieXRlcCwgcG5nX21hbGxvY19iYXNlKHBuZ19wdHIsIG5ld19zaXplKSk7CisKKyAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19wdHItPnJlYWRfYnVmZmVyID0gYnVmZmVyOworICAgICAgICAgcG5nX3B0ci0+cmVhZF9idWZmZXJfc2l6ZSA9IG5ld19zaXplOworICAgICAgfQorCisgICAgICBlbHNlIGlmICh3YXJuIDwgMikgLyogZWxzZSBzaWxlbnQgKi8KKyAgICAgIHsKKyAgICAgICAgIGlmICh3YXJuICE9IDApCisgICAgICAgICAgICAgcG5nX2NodW5rX3dhcm5pbmcocG5nX3B0ciwgImluc3VmZmljaWVudCBtZW1vcnkgdG8gcmVhZCBjaHVuayIpOworCisgICAgICAgICBlbHNlCisgICAgICAgICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIHJlYWQgY2h1bmsiKTsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIGJ1ZmZlcjsKK30KKyNlbmRpZiAvKiBSRUFEX2lDQ1B8aVRYdHxwQ0FMfHNDQUx8c1BMVHx0RVh0fHpUWHR8U0VRVUVOVElBTF9SRUFEICovCisKKy8qIHBuZ19pbmZsYXRlX2NsYWltOiBjbGFpbSB0aGUgenN0cmVhbSBmb3Igc29tZSBuZWZhcmlvdXMgcHVycG9zZSB0aGF0IGludm9sdmVzCisgKiBkZWNvbXByZXNzaW9uLiAgUmV0dXJucyBaX09LIG9uIHN1Y2Nlc3MsIGVsc2UgYSB6bGliIGVycm9yIGNvZGUuICBJdCBjaGVja3MKKyAqIHRoZSBvd25lciBidXQsIGluIGZpbmFsIHJlbGVhc2UgYnVpbGRzLCBqdXN0IGlzc3VlcyBhIHdhcm5pbmcgaWYgc29tZSBvdGhlcgorICogY2h1bmsgYXBwYXJlbnRseSBvd25zIHRoZSBzdHJlYW0uICBQcmlvciB0byByZWxlYXNlIGl0IGRvZXMgYSBwbmdfZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQKK3BuZ19pbmZsYXRlX2NsYWltKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfdWludF8zMiBvd25lcikKK3sKKyAgIGlmIChwbmdfcHRyLT56b3duZXIgIT0gMCkKKyAgIHsKKyAgICAgIGNoYXIgbXNnWzY0XTsKKworICAgICAgUE5HX1NUUklOR19GUk9NX0NIVU5LKG1zZywgcG5nX3B0ci0+em93bmVyKTsKKyAgICAgIC8qIFNvIHRoZSBtZXNzYWdlIHRoYXQgcmVzdWx0cyBpcyAiPGNodW5rPiB1c2luZyB6c3RyZWFtIjsgdGhpcyBpcyBhbgorICAgICAgICogaW50ZXJuYWwgZXJyb3IsIGJ1dCBpcyB2ZXJ5IHVzZWZ1bCBmb3IgZGVidWdnaW5nLiAgaTE4biByZXF1aXJlbWVudHMKKyAgICAgICAqIGFyZSBtaW5pbWFsLgorICAgICAgICovCisgICAgICAodm9pZClwbmdfc2FmZWNhdChtc2csIChzaXplb2YgbXNnKSwgNCwgIiB1c2luZyB6c3RyZWFtIik7CisjaWYgUE5HX1JFTEVBU0VfQlVJTEQKKyAgICAgIHBuZ19jaHVua193YXJuaW5nKHBuZ19wdHIsIG1zZyk7CisgICAgICBwbmdfcHRyLT56b3duZXIgPSAwOworI2Vsc2UKKyAgICAgIHBuZ19jaHVua19lcnJvcihwbmdfcHRyLCBtc2cpOworI2VuZGlmCisgICB9CisKKyAgIC8qIEltcGxlbWVudGF0aW9uIG5vdGU6IHVubGlrZSAncG5nX2RlZmxhdGVfY2xhaW0nIHRoaXMgaW50ZXJuYWwgZnVuY3Rpb24KKyAgICAqIGRvZXMgbm90IHRha2UgdGhlIHNpemUgb2YgdGhlIGRhdGEgYXMgYW4gYXJndW1lbnQuICBTb21lIGVmZmljaWVuY3kgY291bGQKKyAgICAqIGJlIGdhaW5lZCBieSB1c2luZyB0aGlzIHdoZW4gaXQgaXMga25vd24gKmlmKiB0aGUgemxpYiBzdHJlYW0gaXRzZWxmIGRvZXMKKyAgICAqIG5vdCByZWNvcmQgdGhlIG51bWJlcjsgaG93ZXZlciwgdGhpcyBpcyBhbiBpbGx1c2lvbjogdGhlIG9yaWdpbmFsIHdyaXRlcgorICAgICogb2YgdGhlIFBORyBtYXkgaGF2ZSBzZWxlY3RlZCBhIGxvd2VyIHdpbmRvdyBzaXplLCBhbmQgd2UgcmVhbGx5IG11c3QKKyAgICAqIGZvbGxvdyB0aGF0IGJlY2F1c2UsIGZvciBzeXN0ZW1zIHdpdGggd2l0aCBsaW1pdGVkIGNhcGFiaWxpdGllcywgd2UKKyAgICAqIHdvdWxkIG90aGVyd2lzZSByZWplY3QgdGhlIGFwcGxpY2F0aW9uJ3MgYXR0ZW1wdHMgdG8gdXNlIGEgc21hbGxlciB3aW5kb3cKKyAgICAqIHNpemUgKHpsaWIgZG9lc24ndCBoYXZlIGFuIGludGVyZmFjZSB0byBzYXkgInRoaXMgb3IgbG93ZXIiISkuCisgICAgKgorICAgICogaW5mbGF0ZVJlc2V0MiB3YXMgYWRkZWQgdG8gemxpYiAxLjIuNDsgYmVmb3JlIHRoaXMgdGhlIHdpbmRvdyBjb3VsZCBub3QgYmUKKyAgICAqIHJlc2V0LCB0aGVyZWZvcmUgaXQgaXMgbmVjZXNzYXJ5IHRvIGFsd2F5cyBhbGxvY2F0ZSB0aGUgbWF4aW11bSB3aW5kb3cKKyAgICAqIHNpemUgd2l0aCBlYXJsaWVyIHpsaWJzIGp1c3QgaW4gY2FzZSBsYXRlciBjb21wcmVzc2VkIGNodW5rcyBuZWVkIGl0LgorICAgICovCisgICB7CisgICAgICBpbnQgcmV0OyAvKiB6bGliIHJldHVybiBjb2RlICovCisjaWYgUE5HX1pMSUJfVkVSTlVNID49IDB4MTI0MAorCisjIGlmIGRlZmluZWQoUE5HX1NFVF9PUFRJT05fU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19NQVhJTVVNX0lORkxBVEVfV0lORE9XKQorICAgICAgaW50IHdpbmRvd19iaXRzOworCisgICAgICBpZiAoKChwbmdfcHRyLT5vcHRpb25zID4+IFBOR19NQVhJTVVNX0lORkxBVEVfV0lORE9XKSAmIDMpID09CisgICAgICAgICAgUE5HX09QVElPTl9PTikKKyAgICAgIHsKKyAgICAgICAgIHdpbmRvd19iaXRzID0gMTU7CisgICAgICAgICBwbmdfcHRyLT56c3RyZWFtX3N0YXJ0ID0gMDsgLyogZml4ZWQgd2luZG93IHNpemUgKi8KKyAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgd2luZG93X2JpdHMgPSAwOworICAgICAgICAgcG5nX3B0ci0+enN0cmVhbV9zdGFydCA9IDE7CisgICAgICB9CisjIGVsc2UKKyMgICBkZWZpbmUgd2luZG93X2JpdHMgMAorIyBlbmRpZgorI2VuZGlmCisKKyAgICAgIC8qIFNldCB0aGlzIGZvciBzYWZldHksIGp1c3QgaW4gY2FzZSB0aGUgcHJldmlvdXMgb3duZXIgbGVmdCBwb2ludGVycyB0bworICAgICAgICogbWVtb3J5IGFsbG9jYXRpb25zLgorICAgICAgICovCisgICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfaW4gPSBOVUxMOworICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA9IDA7CisgICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gTlVMTDsKKyAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gMDsKKworICAgICAgaWYgKChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX1pTVFJFQU1fSU5JVElBTElaRUQpICE9IDApCisgICAgICB7CisjaWYgUE5HX1pMSUJfVkVSTlVNIDwgMHgxMjQwCisgICAgICAgICByZXQgPSBpbmZsYXRlUmVzZXQoJnBuZ19wdHItPnpzdHJlYW0pOworI2Vsc2UKKyAgICAgICAgIHJldCA9IGluZmxhdGVSZXNldDIoJnBuZ19wdHItPnpzdHJlYW0sIHdpbmRvd19iaXRzKTsKKyNlbmRpZgorICAgICAgfQorCisgICAgICBlbHNlCisgICAgICB7CisjaWYgUE5HX1pMSUJfVkVSTlVNIDwgMHgxMjQwCisgICAgICAgICByZXQgPSBpbmZsYXRlSW5pdCgmcG5nX3B0ci0+enN0cmVhbSk7CisjZWxzZQorICAgICAgICAgcmV0ID0gaW5mbGF0ZUluaXQyKCZwbmdfcHRyLT56c3RyZWFtLCB3aW5kb3dfYml0cyk7CisjZW5kaWYKKworICAgICAgICAgaWYgKHJldCA9PSBaX09LKQorICAgICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfWlNUUkVBTV9JTklUSUFMSVpFRDsKKyAgICAgIH0KKworICAgICAgaWYgKHJldCA9PSBaX09LKQorICAgICAgICAgcG5nX3B0ci0+em93bmVyID0gb3duZXI7CisKKyAgICAgIGVsc2UKKyAgICAgICAgIHBuZ196c3RyZWFtX2Vycm9yKHBuZ19wdHIsIHJldCk7CisKKyAgICAgIHJldHVybiByZXQ7CisgICB9CisKKyNpZmRlZiB3aW5kb3dfYml0cworIyB1bmRlZiB3aW5kb3dfYml0cworI2VuZGlmCit9CisKKyNpZiBQTkdfWkxJQl9WRVJOVU0gPj0gMHgxMjQwCisvKiBIYW5kbGUgdGhlIHN0YXJ0IG9mIHRoZSBpbmZsYXRlIHN0cmVhbSBpZiB3ZSBjYWxsZWQgaW5mbGF0ZUluaXQyKHN0cm0sMCk7CisgKiBpbiB0aGlzIGNhc2Ugc29tZSB6bGliIHZlcnNpb25zIHNraXAgdmFsaWRhdGlvbiBvZiB0aGUgQ0lORk8gZmllbGQgYW5kLCBpbgorICogY2VydGFpbiBjaXJjdW1zdGFuY2VzLCBsaWJwbmcgbWF5IGVuZCB1cCBkaXNwbGF5aW5nIGFuIGludmFsaWQgaW1hZ2UsIGluCisgKiBjb250cmFzdCB0byBpbXBsZW1lbnRhdGlvbnMgdGhhdCBjYWxsIHpsaWIgaW4gdGhlIG5vcm1hbCB3YXkgKGUuZy4gbGlicG5nCisgKiAxLjUpLgorICovCitpbnQgLyogUFJJVkFURSAqLworcG5nX3psaWJfaW5mbGF0ZShwbmdfc3RydWN0cnAgcG5nX3B0ciwgaW50IGZsdXNoKQoreworICAgaWYgKHBuZ19wdHItPnpzdHJlYW1fc3RhcnQgJiYgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA+IDApCisgICB7CisgICAgICBpZiAoKCpwbmdfcHRyLT56c3RyZWFtLm5leHRfaW4gPj4gNCkgPiA3KQorICAgICAgeworICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5tc2cgPSAiaW52YWxpZCB3aW5kb3cgc2l6ZSAobGlicG5nKSI7CisgICAgICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOworICAgICAgfQorCisgICAgICBwbmdfcHRyLT56c3RyZWFtX3N0YXJ0ID0gMDsKKyAgIH0KKworICAgcmV0dXJuIGluZmxhdGUoJnBuZ19wdHItPnpzdHJlYW0sIGZsdXNoKTsKK30KKyNlbmRpZiAvKiBabGliID49IDEuMi40ICovCisKKyNpZmRlZiBQTkdfUkVBRF9DT01QUkVTU0VEX1RFWFRfU1VQUE9SVEVECisvKiBwbmdfaW5mbGF0ZSBub3cgcmV0dXJucyB6bGliIGVycm9yIGNvZGVzIGluY2x1ZGluZyBaX09LIGFuZCBaX1NUUkVBTV9FTkQgdG8KKyAqIGFsbG93IHRoZSBjYWxsZXIgdG8gZG8gbXVsdGlwbGUgY2FsbHMgaWYgcmVxdWlyZWQuICBJZiB0aGUgJ2ZpbmlzaCcgZmxhZyBpcworICogc2V0IFpfRklOSVNIIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBmaW5hbCBpbmZsYXRlKCkgY2FsbCBhbmQgWl9TVFJFQU1fRU5EIG11c3QKKyAqIGJlIHJldHVybmVkIG9yIHRoZXJlIGhhcyBiZWVuIGEgcHJvYmxlbSwgb3RoZXJ3aXNlIFpfU1lOQ19GTFVTSCBpcyB1c2VkIGFuZAorICogWl9PSyBvciBaX1NUUkVBTV9FTkQgd2lsbCBiZSByZXR1cm5lZCBvbiBzdWNjZXNzLgorICoKKyAqIFRoZSBpbnB1dCBhbmQgb3V0cHV0IHNpemVzIGFyZSB1cGRhdGVkIHRvIHRoZSBhY3R1YWwgYW1vdW50cyBvZiBkYXRhIGNvbnN1bWVkCisgKiBvciB3cml0dGVuLCBub3QgdGhlIGFtb3VudCBhdmFpbGFibGUgKGFzIGluIGEgel9zdHJlYW0pLiAgVGhlIGRhdGEgcG9pbnRlcnMKKyAqIGFyZSBub3QgY2hhbmdlZCwgc28gdGhlIG5leHQgaW5wdXQgaXMgKGRhdGEraW5wdXRfc2l6ZSkgYW5kIHRoZSBuZXh0CisgKiBhdmFpbGFibGUgb3V0cHV0IGlzIChvdXRwdXQrb3V0cHV0X3NpemUpLgorICovCitzdGF0aWMgaW50CitwbmdfaW5mbGF0ZShwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgb3duZXIsIGludCBmaW5pc2gsCisgICAgLyogSU5QVVQ6ICovIHBuZ19jb25zdF9ieXRlcCBpbnB1dCwgcG5nX3VpbnRfMzJwIGlucHV0X3NpemVfcHRyLAorICAgIC8qIE9VVFBVVDogKi8gcG5nX2J5dGVwIG91dHB1dCwgcG5nX2FsbG9jX3NpemVfdCAqb3V0cHV0X3NpemVfcHRyKQoreworICAgaWYgKHBuZ19wdHItPnpvd25lciA9PSBvd25lcikgLyogRWxzZSBub3QgY2xhaW1lZCAqLworICAgeworICAgICAgaW50IHJldDsKKyAgICAgIHBuZ19hbGxvY19zaXplX3QgYXZhaWxfb3V0ID0gKm91dHB1dF9zaXplX3B0cjsKKyAgICAgIHBuZ191aW50XzMyIGF2YWlsX2luID0gKmlucHV0X3NpemVfcHRyOworCisgICAgICAvKiB6bGliIGNhbid0IG5lY2Vzc2FyaWx5IGhhbmRsZSBtb3JlIHRoYW4gNjU1MzUgYnl0ZXMgYXQgb25jZSAoaS5lLiBpdAorICAgICAgICogY2FuJ3QgZXZlbiBuZWNlc3NhcmlseSBoYW5kbGUgNjU1MzYgYnl0ZXMpIGJlY2F1c2UgdGhlIHR5cGUgdUludCBpcworICAgICAgICogIjE2IGJpdHMgb3IgbW9yZSIuICBDb25zZXF1ZW50bHkgaXQgaXMgbmVjZXNzYXJ5IHRvIGNodW5rIHRoZSBpbnB1dCB0bworICAgICAgICogemxpYi4gIFRoaXMgY29kZSB1c2VzIFpMSUJfSU9fTUFYLCBmcm9tIHBuZ3ByaXYuaCwgYXMgdGhlIG1heGltdW0gKHRoZQorICAgICAgICogbWF4aW11bSB2YWx1ZSB0aGF0IGNhbiBiZSBzdG9yZWQgaW4gYSB1SW50LikgIEl0IGlzIHBvc3NpYmxlIHRvIHNldAorICAgICAgICogWkxJQl9JT19NQVggdG8gYSBsb3dlciB2YWx1ZSBpbiBwbmdwcml2LmggYW5kIHRoaXMgbWF5IHNvbWV0aW1lcyBoYXZlCisgICAgICAgKiBhIHBlcmZvcm1hbmNlIGFkdmFudGFnZSwgYmVjYXVzZSBpdCByZWR1Y2VzIHRoZSBhbW91bnQgb2YgZGF0YSBhY2Nlc3NlZAorICAgICAgICogYXQgZWFjaCBzdGVwIGFuZCB0aGF0IG1heSBnaXZlIHRoZSBPUyBtb3JlIHRpbWUgdG8gcGFnZSBpdCBpbi4KKyAgICAgICAqLworICAgICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X2luID0gUE5HWl9JTlBVVF9DQVNUKGlucHV0KTsKKyAgICAgIC8qIGF2YWlsX2luIGFuZCBhdmFpbF9vdXQgYXJlIHNldCBiZWxvdyBmcm9tICdzaXplJyAqLworICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA9IDA7CisgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9IDA7CisKKyAgICAgIC8qIFJlYWQgZGlyZWN0bHkgaW50byB0aGUgb3V0cHV0IGlmIGl0IGlzIGF2YWlsYWJsZSAodGhpcyBpcyBzZXQgdG8KKyAgICAgICAqIGEgbG9jYWwgYnVmZmVyIGJlbG93IGlmIG91dHB1dCBpcyBOVUxMKS4KKyAgICAgICAqLworICAgICAgaWYgKG91dHB1dCAhPSBOVUxMKQorICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X291dCA9IG91dHB1dDsKKworICAgICAgZG8KKyAgICAgIHsKKyAgICAgICAgIHVJbnQgYXZhaWw7CisgICAgICAgICBCeXRlIGxvY2FsX2J1ZmZlcltQTkdfSU5GTEFURV9CVUZfU0laRV07CisKKyAgICAgICAgIC8qIHpsaWIgSU5QVVQgQlVGRkVSICovCisgICAgICAgICAvKiBUaGUgc2V0dGluZyBvZiAnYXZhaWxfaW4nIHVzZWQgdG8gYmUgb3V0c2lkZSB0aGUgbG9vcDsgYnkgc2V0dGluZyBpdAorICAgICAgICAgICogaW5zaWRlIGl0IGlzIHBvc3NpYmxlIHRvIGNodW5rIHRoZSBpbnB1dCB0byB6bGliIGFuZCBzaW1wbHkgcmVseSBvbgorICAgICAgICAgICogemxpYiB0byBhZHZhbmNlIHRoZSAnbmV4dF9pbicgcG9pbnRlci4gIFRoaXMgYWxsb3dzIGFyYml0cmFyeQorICAgICAgICAgICogYW1vdW50cyBvZiBkYXRhIHRvIGJlIHBhc3NlZCB0aHJvdWdoIHpsaWIgYXQgdGhlIHVuYXZvaWRhYmxlIGNvc3Qgb2YKKyAgICAgICAgICAqIHJlcXVpcmluZyBhIHdpbmRvdyBzYXZlIChtZW1jcHkgb2YgdXAgdG8gMzI3Njggb3V0cHV0IGJ5dGVzKQorICAgICAgICAgICogZXZlcnkgWkxJQl9JT19NQVggaW5wdXQgYnl0ZXMuCisgICAgICAgICAgKi8KKyAgICAgICAgIGF2YWlsX2luICs9IHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW47IC8qIG5vdCBjb25zdW1lZCBsYXN0IHRpbWUgKi8KKworICAgICAgICAgYXZhaWwgPSBaTElCX0lPX01BWDsKKworICAgICAgICAgaWYgKGF2YWlsX2luIDwgYXZhaWwpCisgICAgICAgICAgICBhdmFpbCA9ICh1SW50KWF2YWlsX2luOyAvKiBzYWZlOiA8IHRoYW4gWkxJQl9JT19NQVggKi8KKworICAgICAgICAgYXZhaWxfaW4gLT0gYXZhaWw7CisgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luID0gYXZhaWw7CisKKyAgICAgICAgIC8qIHpsaWIgT1VUUFVUIEJVRkZFUiAqLworICAgICAgICAgYXZhaWxfb3V0ICs9IHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0OyAvKiBub3Qgd3JpdHRlbiBsYXN0IHRpbWUgKi8KKworICAgICAgICAgYXZhaWwgPSBaTElCX0lPX01BWDsgLyogbWF4aW11bSB6bGliIGNhbiBwcm9jZXNzICovCisKKyAgICAgICAgIGlmIChvdXRwdXQgPT0gTlVMTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFJlc2V0IHRoZSBvdXRwdXQgYnVmZmVyIGVhY2ggdGltZSByb3VuZCBpZiBvdXRwdXQgaXMgTlVMTCBhbmQKKyAgICAgICAgICAgICAqIG1ha2UgYXZhaWxhYmxlIHRoZSBmdWxsIGJ1ZmZlciwgdXAgdG8gJ3JlbWFpbmluZ19zcGFjZScKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X291dCA9IGxvY2FsX2J1ZmZlcjsKKyAgICAgICAgICAgIGlmICgoc2l6ZW9mIGxvY2FsX2J1ZmZlcikgPCBhdmFpbCkKKyAgICAgICAgICAgICAgIGF2YWlsID0gKHNpemVvZiBsb2NhbF9idWZmZXIpOworICAgICAgICAgfQorCisgICAgICAgICBpZiAoYXZhaWxfb3V0IDwgYXZhaWwpCisgICAgICAgICAgICBhdmFpbCA9ICh1SW50KWF2YWlsX291dDsgLyogc2FmZTogPCBaTElCX0lPX01BWCAqLworCisgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9IGF2YWlsOworICAgICAgICAgYXZhaWxfb3V0IC09IGF2YWlsOworCisgICAgICAgICAvKiB6bGliIGluZmxhdGUgY2FsbCAqLworICAgICAgICAgLyogSW4gZmFjdCAnYXZhaWxfb3V0JyBtYXkgYmUgMCBhdCB0aGlzIHBvaW50LCB0aGF0IGhhcHBlbnMgYXQgdGhlIGVuZAorICAgICAgICAgICogb2YgdGhlIHJlYWQgd2hlbiB0aGUgZmluYWwgTFogZW5kIGNvZGUgd2FzIG5vdCBwYXNzZWQgYXQgdGhlIGVuZCBvZgorICAgICAgICAgICogdGhlIHByZXZpb3VzIGNodW5rIG9mIGlucHV0IGRhdGEuICBUZWxsIHpsaWIgaWYgd2UgaGF2ZSByZWFjaGVkIHRoZQorICAgICAgICAgICogZW5kIG9mIHRoZSBvdXRwdXQgYnVmZmVyLgorICAgICAgICAgICovCisgICAgICAgICByZXQgPSBQTkdfSU5GTEFURShwbmdfcHRyLCBhdmFpbF9vdXQgPiAwID8gWl9OT19GTFVTSCA6CisgICAgICAgICAgICAgKGZpbmlzaCA/IFpfRklOSVNIIDogWl9TWU5DX0ZMVVNIKSk7CisgICAgICB9IHdoaWxlIChyZXQgPT0gWl9PSyk7CisKKyAgICAgIC8qIEZvciBzYWZldHkga2lsbCB0aGUgbG9jYWwgYnVmZmVyIHBvaW50ZXIgbm93ICovCisgICAgICBpZiAob3V0cHV0ID09IE5VTEwpCisgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gTlVMTDsKKworICAgICAgLyogQ2xhdyBiYWNrIHRoZSAnc2l6ZScgYW5kICdyZW1haW5pbmdfc3BhY2UnIGJ5dGUgY291bnRzLiAqLworICAgICAgYXZhaWxfaW4gKz0gcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbjsKKyAgICAgIGF2YWlsX291dCArPSBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dDsKKworICAgICAgLyogVXBkYXRlIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHNpemVzOyB0aGUgdXBkYXRlZCB2YWx1ZXMgYXJlIHRoZSBhbW91bnQKKyAgICAgICAqIGNvbnN1bWVkIG9yIHdyaXR0ZW4sIGVmZmVjdGl2ZWx5IHRoZSBpbnZlcnNlIG9mIHdoYXQgemxpYiB1c2VzLgorICAgICAgICovCisgICAgICBpZiAoYXZhaWxfb3V0ID4gMCkKKyAgICAgICAgICpvdXRwdXRfc2l6ZV9wdHIgLT0gYXZhaWxfb3V0OworCisgICAgICBpZiAoYXZhaWxfaW4gPiAwKQorICAgICAgICAgKmlucHV0X3NpemVfcHRyIC09IGF2YWlsX2luOworCisgICAgICAvKiBFbnN1cmUgcG5nX3B0ci0+enN0cmVhbS5tc2cgaXMgc2V0IChldmVuIGluIHRoZSBzdWNjZXNzIGNhc2UhKSAqLworICAgICAgcG5nX3pzdHJlYW1fZXJyb3IocG5nX3B0ciwgcmV0KTsKKyAgICAgIHJldHVybiByZXQ7CisgICB9CisKKyAgIGVsc2UKKyAgIHsKKyAgICAgIC8qIFRoaXMgaXMgYSBiYWQgaW50ZXJuYWwgZXJyb3IuICBUaGUgcmVjb3ZlcnkgYXNzaWducyB0byB0aGUgenN0cmVhbSBtc2cKKyAgICAgICAqIHBvaW50ZXIsIHdoaWNoIGlzIG5vdCBvd25lZCBieSB0aGUgY2FsbGVyLCBidXQgdGhpcyBpcyBzYWZlOyBpdCdzIG9ubHkKKyAgICAgICAqIHVzZWQgb24gZXJyb3JzIQorICAgICAgICovCisgICAgICBwbmdfcHRyLT56c3RyZWFtLm1zZyA9IFBOR1pfTVNHX0NBU1QoInpzdHJlYW0gdW5jbGFpbWVkIik7CisgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICB9Cit9CisKKy8qCisgKiBEZWNvbXByZXNzIHRyYWlsaW5nIGRhdGEgaW4gYSBjaHVuay4gIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgcmVhZF9idWZmZXIKKyAqIHBvaW50cyBhdCBhbiBhbGxvY2F0ZWQgYXJlYSBob2xkaW5nIHRoZSBjb250ZW50cyBvZiBhIGNodW5rIHdpdGggYQorICogdHJhaWxpbmcgY29tcHJlc3NlZCBwYXJ0LiAgV2hhdCB3ZSBnZXQgYmFjayBpcyBhbiBhbGxvY2F0ZWQgYXJlYQorICogaG9sZGluZyB0aGUgb3JpZ2luYWwgcHJlZml4IHBhcnQgYW5kIGFuIHVuY29tcHJlc3NlZCB2ZXJzaW9uIG9mIHRoZQorICogdHJhaWxpbmcgcGFydCAodGhlIG1hbGxvYyBhcmVhIHBhc3NlZCBpbiBpcyBmcmVlZCkuCisgKi8KK3N0YXRpYyBpbnQKK3BuZ19kZWNvbXByZXNzX2NodW5rKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgcG5nX3VpbnRfMzIgY2h1bmtsZW5ndGgsIHBuZ191aW50XzMyIHByZWZpeF9zaXplLAorICAgcG5nX2FsbG9jX3NpemVfdCAqbmV3bGVuZ3RoIC8qIG11c3QgYmUgaW5pdGlhbGl6ZWQgdG8gdGhlIG1heGltdW0hICovLAorICAgaW50IHRlcm1pbmF0ZSAvKmFkZCBhICdcMCcgdG8gdGhlIGVuZCBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEqLykKK3sKKyAgIC8qIFRPRE86IGltcGxlbWVudCBkaWZmZXJlbnQgbGltaXRzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgY2h1bmsuCisgICAgKgorICAgICogVGhlIGNhbGxlciBzdXBwbGllcyAqbmV3bGVuZ3RoIHNldCB0byB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlCisgICAgKiB1bmNvbXByZXNzZWQgZGF0YSwgYnV0IHRoaXMgcm91dGluZSBhbGxvY2F0ZXMgc3BhY2UgZm9yIHRoZSBwcmVmaXggYW5kCisgICAgKiBtYXliZSBhICdcMCcgdGVybWluYXRvciB0b28uICBXZSBoYXZlIHRvIGFzc3VtZSB0aGF0ICdwcmVmaXhfc2l6ZScgaXMKKyAgICAqIGxpbWl0ZWQgb25seSBieSB0aGUgbWF4aW11bSBjaHVuayBzaXplLgorICAgICovCisgICBwbmdfYWxsb2Nfc2l6ZV90IGxpbWl0ID0gUE5HX1NJWkVfTUFYOworCisjIGlmZGVmIFBOR19TRVRfVVNFUl9MSU1JVFNfU1VQUE9SVEVECisgICBpZiAocG5nX3B0ci0+dXNlcl9jaHVua19tYWxsb2NfbWF4ID4gMCAmJgorICAgICAgIHBuZ19wdHItPnVzZXJfY2h1bmtfbWFsbG9jX21heCA8IGxpbWl0KQorICAgICAgbGltaXQgPSBwbmdfcHRyLT51c2VyX2NodW5rX21hbGxvY19tYXg7CisjIGVsaWYgUE5HX1VTRVJfQ0hVTktfTUFMTE9DX01BWCA+IDAKKyAgIGlmIChQTkdfVVNFUl9DSFVOS19NQUxMT0NfTUFYIDwgbGltaXQpCisgICAgICBsaW1pdCA9IFBOR19VU0VSX0NIVU5LX01BTExPQ19NQVg7CisjIGVuZGlmCisKKyAgIGlmIChsaW1pdCA+PSBwcmVmaXhfc2l6ZSArICh0ZXJtaW5hdGUgIT0gMCkpCisgICB7CisgICAgICBpbnQgcmV0OworCisgICAgICBsaW1pdCAtPSBwcmVmaXhfc2l6ZSArICh0ZXJtaW5hdGUgIT0gMCk7CisKKyAgICAgIGlmIChsaW1pdCA8ICpuZXdsZW5ndGgpCisgICAgICAgICAqbmV3bGVuZ3RoID0gbGltaXQ7CisKKyAgICAgIC8qIE5vdyB0cnkgdG8gY2xhaW0gdGhlIHN0cmVhbS4gKi8KKyAgICAgIHJldCA9IHBuZ19pbmZsYXRlX2NsYWltKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rX25hbWUpOworCisgICAgICBpZiAocmV0ID09IFpfT0spCisgICAgICB7CisgICAgICAgICBwbmdfdWludF8zMiBsenNpemUgPSBjaHVua2xlbmd0aCAtIHByZWZpeF9zaXplOworCisgICAgICAgICByZXQgPSBwbmdfaW5mbGF0ZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua19uYW1lLCAxLypmaW5pc2gqLywKKyAgICAgICAgICAgIC8qIGlucHV0OiAqLyBwbmdfcHRyLT5yZWFkX2J1ZmZlciArIHByZWZpeF9zaXplLCAmbHpzaXplLAorICAgICAgICAgICAgLyogb3V0cHV0OiAqLyBOVUxMLCBuZXdsZW5ndGgpOworCisgICAgICAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VORCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFVzZSAnaW5mbGF0ZVJlc2V0JyBoZXJlLCBub3QgJ2luZmxhdGVSZXNldDInIGJlY2F1c2UgdGhpcworICAgICAgICAgICAgICogcHJlc2VydmVzIHRoZSBwcmV2aW91c2x5IGRlY2lkZWQgd2luZG93IHNpemUgKG90aGVyd2lzZSBpdCB3b3VsZAorICAgICAgICAgICAgICogYmUgbmVjZXNzYXJ5IHRvIHN0b3JlIHRoZSBwcmV2aW91cyB3aW5kb3cgc2l6ZS4pICBJbiBwcmFjdGljZQorICAgICAgICAgICAgICogdGhpcyBkb2Vzbid0IG1hdHRlciBhbnl3YXksIGJlY2F1c2UgcG5nX2luZmxhdGUgd2lsbCBjYWxsIGluZmxhdGUKKyAgICAgICAgICAgICAqIHdpdGggWl9GSU5JU0ggaW4gYWxtb3N0IGFsbCBjYXNlcywgc28gdGhlIHdpbmRvdyB3aWxsIG5vdCBiZQorICAgICAgICAgICAgICogbWFpbnRhaW5lZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKGluZmxhdGVSZXNldCgmcG5nX3B0ci0+enN0cmVhbSkgPT0gWl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8qIEJlY2F1c2Ugb2YgdGhlIGxpbWl0IGNoZWNrcyBhYm92ZSB3ZSBrbm93IHRoYXQgdGhlIG5ldywKKyAgICAgICAgICAgICAgICAqIGV4cGFuZGVkLCBzaXplIHdpbGwgZml0IGluIGEgc2l6ZV90IChsZXQgYWxvbmUgYW4KKyAgICAgICAgICAgICAgICAqIHBuZ19hbGxvY19zaXplX3QpLiAgVXNlIHBuZ19tYWxsb2NfYmFzZSBoZXJlIHRvIGF2b2lkIGFuCisgICAgICAgICAgICAgICAgKiBleHRyYSBPT00gbWVzc2FnZS4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgcG5nX2FsbG9jX3NpemVfdCBuZXdfc2l6ZSA9ICpuZXdsZW5ndGg7CisgICAgICAgICAgICAgICBwbmdfYWxsb2Nfc2l6ZV90IGJ1ZmZlcl9zaXplID0gcHJlZml4X3NpemUgKyBuZXdfc2l6ZSArCisgICAgICAgICAgICAgICAgICAodGVybWluYXRlICE9IDApOworICAgICAgICAgICAgICAgcG5nX2J5dGVwIHRleHQgPSBwbmdfdm9pZGNhc3QocG5nX2J5dGVwLCBwbmdfbWFsbG9jX2Jhc2UocG5nX3B0ciwKKyAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9zaXplKSk7CisKKyAgICAgICAgICAgICAgIGlmICh0ZXh0ICE9IE5VTEwpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICByZXQgPSBwbmdfaW5mbGF0ZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua19uYW1lLCAxLypmaW5pc2gqLywKKyAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnJlYWRfYnVmZmVyICsgcHJlZml4X3NpemUsICZsenNpemUsCisgICAgICAgICAgICAgICAgICAgICB0ZXh0ICsgcHJlZml4X3NpemUsIG5ld2xlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gWl9TVFJFQU1fRU5EKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld19zaXplID09ICpuZXdsZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVybWluYXRlICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0W3ByZWZpeF9zaXplICsgKm5ld2xlbmd0aF0gPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4X3NpemUgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHRleHQsIHBuZ19wdHItPnJlYWRfYnVmZmVyLCBwcmVmaXhfc2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlcCBvbGRfcHRyID0gcG5nX3B0ci0+cmVhZF9idWZmZXI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnJlYWRfYnVmZmVyID0gdGV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnJlYWRfYnVmZmVyX3NpemUgPSBidWZmZXJfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBvbGRfcHRyOyAvKiBmcmVlZCBiZWxvdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgc2l6ZSBjaGFuZ2VkIG9uIHRoZSBzZWNvbmQgcmVhZCwgdGhlcmUgY2FuIGJlIG5vCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBndWFyYW50ZWUgdGhhdCBhbnl0aGluZyBpcyBjb3JyZWN0IGF0IHRoaXMgcG9pbnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGUgJ21zZycgcG9pbnRlciBoYXMgYmVlbiBzZXQgdG8gInVuZXhwZWN0ZWQgZW5kIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBMWiBzdHJlYW0iLCB3aGljaCBpcyBmaW5lLCBidXQgcmV0dXJuIGFuIGVycm9yIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoYXQgdGhlIGNhbGxlciB3b24ndCBhY2NlcHQuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IFBOR19VTkVYUEVDVEVEX1pMSUJfUkVUVVJOOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXQgPT0gWl9PSykKKyAgICAgICAgICAgICAgICAgICAgIHJldCA9IFBOR19VTkVYUEVDVEVEX1pMSUJfUkVUVVJOOyAvKiBmb3Igc2FmZXR5ICovCisKKyAgICAgICAgICAgICAgICAgIC8qIEZyZWUgdGhlIHRleHQgcG9pbnRlciAodGhpcyBpcyB0aGUgb2xkIHJlYWRfYnVmZmVyIG9uCisgICAgICAgICAgICAgICAgICAgKiBzdWNjZXNzKQorICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCB0ZXh0KTsKKworICAgICAgICAgICAgICAgICAgLyogVGhpcyByZWFsbHkgaXMgdmVyeSBiZW5pZ24sIGJ1dCBpdCdzIHN0aWxsIGFuIGVycm9yIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICAqIHRoZSBleHRyYSBzcGFjZSBtYXkgb3RoZXJ3aXNlIGJlIHVzZWQgYXMgYSBUcm9qYW4gSG9yc2UuCisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gWl9TVFJFQU1fRU5EICYmCisgICAgICAgICAgICAgICAgICAgICBjaHVua2xlbmd0aCAtIHByZWZpeF9zaXplICE9IGx6c2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImV4dHJhIGNvbXByZXNzZWQgZGF0YSIpOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiBPdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgdGhlIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgcmV0ID0gWl9NRU1fRVJST1I7CisgICAgICAgICAgICAgICAgICBwbmdfenN0cmVhbV9lcnJvcihwbmdfcHRyLCBaX01FTV9FUlJPUik7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8qIGluZmxhdGVSZXNldCBmYWlsZWQsIHN0b3JlIHRoZSBlcnJvciBtZXNzYWdlICovCisgICAgICAgICAgICAgICBwbmdfenN0cmVhbV9lcnJvcihwbmdfcHRyLCByZXQpOworCisgICAgICAgICAgICAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VORCkKKyAgICAgICAgICAgICAgICAgIHJldCA9IFBOR19VTkVYUEVDVEVEX1pMSUJfUkVUVVJOOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICBlbHNlIGlmIChyZXQgPT0gWl9PSykKKyAgICAgICAgICAgIHJldCA9IFBOR19VTkVYUEVDVEVEX1pMSUJfUkVUVVJOOworCisgICAgICAgICAvKiBSZWxlYXNlIHRoZSBjbGFpbWVkIHN0cmVhbSAqLworICAgICAgICAgcG5nX3B0ci0+em93bmVyID0gMDsKKyAgICAgIH0KKworICAgICAgZWxzZSAvKiB0aGUgY2xhaW0gZmFpbGVkICovIGlmIChyZXQgPT0gWl9TVFJFQU1fRU5EKSAvKiBpbXBvc3NpYmxlISAqLworICAgICAgICAgcmV0ID0gUE5HX1VORVhQRUNURURfWkxJQl9SRVRVUk47CisKKyAgICAgIHJldHVybiByZXQ7CisgICB9CisKKyAgIGVsc2UKKyAgIHsKKyAgICAgIC8qIEFwcGxpY2F0aW9uL2NvbmZpZ3VyYXRpb24gbGltaXRzIGV4Y2VlZGVkICovCisgICAgICBwbmdfenN0cmVhbV9lcnJvcihwbmdfcHRyLCBaX01FTV9FUlJPUik7CisgICAgICByZXR1cm4gWl9NRU1fRVJST1I7CisgICB9Cit9CisjZW5kaWYgLyogUkVBRF9DT01QUkVTU0VEX1RFWFQgKi8KKworI2lmZGVmIFBOR19SRUFEX2lDQ1BfU1VQUE9SVEVECisvKiBQZXJmb3JtIGEgcGFydGlhbCByZWFkIGFuZCBkZWNvbXByZXNzLCBwcm9kdWNpbmcgJ2F2YWlsX291dCcgYnl0ZXMgYW5kCisgKiByZWFkaW5nIGZyb20gdGhlIGN1cnJlbnQgY2h1bmsgYXMgcmVxdWlyZWQuCisgKi8KK3N0YXRpYyBpbnQKK3BuZ19pbmZsYXRlX3JlYWQocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19ieXRlcCByZWFkX2J1ZmZlciwgdUludCByZWFkX3NpemUsCisgICBwbmdfdWludF8zMnAgY2h1bmtfYnl0ZXMsIHBuZ19ieXRlcCBuZXh0X291dCwgcG5nX2FsbG9jX3NpemVfdCAqb3V0X3NpemUsCisgICBpbnQgZmluaXNoKQoreworICAgaWYgKHBuZ19wdHItPnpvd25lciA9PSBwbmdfcHRyLT5jaHVua19uYW1lKQorICAgeworICAgICAgaW50IHJldDsKKworICAgICAgLyogbmV4dF9pbiBhbmQgYXZhaWxfaW4gbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgYnkgdGhlIGNhbGxlci4gKi8KKyAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBuZXh0X291dDsKKyAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gMDsgLyogc2V0IGluIHRoZSBsb29wICovCisKKyAgICAgIGRvCisgICAgICB7CisgICAgICAgICBpZiAocG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA9PSAwKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKHJlYWRfc2l6ZSA+ICpjaHVua19ieXRlcykKKyAgICAgICAgICAgICAgIHJlYWRfc2l6ZSA9ICh1SW50KSpjaHVua19ieXRlczsKKyAgICAgICAgICAgICpjaHVua19ieXRlcyAtPSByZWFkX3NpemU7CisKKyAgICAgICAgICAgIGlmIChyZWFkX3NpemUgPiAwKQorICAgICAgICAgICAgICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIHJlYWRfYnVmZmVyLCByZWFkX3NpemUpOworCisgICAgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfaW4gPSByZWFkX2J1ZmZlcjsKKyAgICAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPSByZWFkX3NpemU7CisgICAgICAgICB9CisKKyAgICAgICAgIGlmIChwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9PSAwKQorICAgICAgICAgeworICAgICAgICAgICAgdUludCBhdmFpbCA9IFpMSUJfSU9fTUFYOworICAgICAgICAgICAgaWYgKGF2YWlsID4gKm91dF9zaXplKQorICAgICAgICAgICAgICAgYXZhaWwgPSAodUludCkqb3V0X3NpemU7CisgICAgICAgICAgICAqb3V0X3NpemUgLT0gYXZhaWw7CisKKyAgICAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gYXZhaWw7CisgICAgICAgICB9CisKKyAgICAgICAgIC8qIFVzZSBaX1NZTkNfRkxVU0ggd2hlbiB0aGVyZSBpcyBubyBtb3JlIGNodW5rIGRhdGEgdG8gZW5zdXJlIHRoYXQgYWxsCisgICAgICAgICAgKiB0aGUgYXZhaWxhYmxlIG91dHB1dCBpcyBwcm9kdWNlZDsgdGhpcyBhbGxvd3MgcmVhZGluZyBvZiB0cnVuY2F0ZWQKKyAgICAgICAgICAqIHN0cmVhbXMuCisgICAgICAgICAgKi8KKyAgICAgICAgIHJldCA9IFBOR19JTkZMQVRFKHBuZ19wdHIsCisgICAgICAgICAgICAqY2h1bmtfYnl0ZXMgPiAwID8gWl9OT19GTFVTSCA6IChmaW5pc2ggPyBaX0ZJTklTSCA6IFpfU1lOQ19GTFVTSCkpOworICAgICAgfQorICAgICAgd2hpbGUgKHJldCA9PSBaX09LICYmICgqb3V0X3NpemUgPiAwIHx8IHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID4gMCkpOworCisgICAgICAqb3V0X3NpemUgKz0gcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQ7CisgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9IDA7IC8qIFNob3VsZCBub3QgYmUgcmVxdWlyZWQsIGJ1dCBpcyBzYWZlICovCisKKyAgICAgIC8qIEVuc3VyZSB0aGUgZXJyb3IgbWVzc2FnZSBwb2ludGVyIGlzIGFsd2F5cyBzZXQ6ICovCisgICAgICBwbmdfenN0cmVhbV9lcnJvcihwbmdfcHRyLCByZXQpOworICAgICAgcmV0dXJuIHJldDsKKyAgIH0KKworICAgZWxzZQorICAgeworICAgICAgcG5nX3B0ci0+enN0cmVhbS5tc2cgPSBQTkdaX01TR19DQVNUKCJ6c3RyZWFtIHVuY2xhaW1lZCIpOworICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgfQorfQorI2VuZGlmCisKKy8qIFJlYWQgYW5kIGNoZWNrIHRoZSBJREhSIGNodW5rICovCisKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2hhbmRsZV9JSERSKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpCit7CisgICBwbmdfYnl0ZSBidWZbMTNdOworICAgcG5nX3VpbnRfMzIgd2lkdGgsIGhlaWdodDsKKyAgIGludCBiaXRfZGVwdGgsIGNvbG9yX3R5cGUsIGNvbXByZXNzaW9uX3R5cGUsIGZpbHRlcl90eXBlOworICAgaW50IGludGVybGFjZV90eXBlOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfSUhEUiIpOworCisgICBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSAhPSAwKQorICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJvdXQgb2YgcGxhY2UiKTsKKworICAgLyogQ2hlY2sgdGhlIGxlbmd0aCAqLworICAgaWYgKGxlbmd0aCAhPSAxMykKKyAgICAgIHBuZ19jaHVua19lcnJvcihwbmdfcHRyLCAiaW52YWxpZCIpOworCisgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX0lIRFI7CisKKyAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBidWYsIDEzKTsKKyAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApOworCisgICB3aWR0aCA9IHBuZ19nZXRfdWludF8zMShwbmdfcHRyLCBidWYpOworICAgaGVpZ2h0ID0gcG5nX2dldF91aW50XzMxKHBuZ19wdHIsIGJ1ZiArIDQpOworICAgYml0X2RlcHRoID0gYnVmWzhdOworICAgY29sb3JfdHlwZSA9IGJ1Zls5XTsKKyAgIGNvbXByZXNzaW9uX3R5cGUgPSBidWZbMTBdOworICAgZmlsdGVyX3R5cGUgPSBidWZbMTFdOworICAgaW50ZXJsYWNlX3R5cGUgPSBidWZbMTJdOworCisgICAvKiBTZXQgaW50ZXJuYWwgdmFyaWFibGVzICovCisgICBwbmdfcHRyLT53aWR0aCA9IHdpZHRoOworICAgcG5nX3B0ci0+aGVpZ2h0ID0gaGVpZ2h0OworICAgcG5nX3B0ci0+Yml0X2RlcHRoID0gKHBuZ19ieXRlKWJpdF9kZXB0aDsKKyAgIHBuZ19wdHItPmludGVybGFjZWQgPSAocG5nX2J5dGUpaW50ZXJsYWNlX3R5cGU7CisgICBwbmdfcHRyLT5jb2xvcl90eXBlID0gKHBuZ19ieXRlKWNvbG9yX3R5cGU7CisjaWZkZWYgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQKKyAgIHBuZ19wdHItPmZpbHRlcl90eXBlID0gKHBuZ19ieXRlKWZpbHRlcl90eXBlOworI2VuZGlmCisgICBwbmdfcHRyLT5jb21wcmVzc2lvbl90eXBlID0gKHBuZ19ieXRlKWNvbXByZXNzaW9uX3R5cGU7CisKKyAgIC8qIEZpbmQgbnVtYmVyIG9mIGNoYW5uZWxzICovCisgICBzd2l0Y2ggKHBuZ19wdHItPmNvbG9yX3R5cGUpCisgICB7CisgICAgICBkZWZhdWx0OiAvKiBpbnZhbGlkLCBwbmdfc2V0X0lIRFIgY2FsbHMgcG5nX2Vycm9yICovCisgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX0dSQVk6CisgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1BBTEVUVEU6CisgICAgICAgICBwbmdfcHRyLT5jaGFubmVscyA9IDE7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9SR0I6CisgICAgICAgICBwbmdfcHRyLT5jaGFubmVscyA9IDM7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBOgorICAgICAgICAgcG5nX3B0ci0+Y2hhbm5lbHMgPSAyOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBOgorICAgICAgICAgcG5nX3B0ci0+Y2hhbm5lbHMgPSA0OworICAgICAgICAgYnJlYWs7CisgICB9CisKKyAgIC8qIFNldCB1cCBvdGhlciB1c2VmdWwgaW5mbyAqLworICAgcG5nX3B0ci0+cGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpKHBuZ19wdHItPmJpdF9kZXB0aCAqIHBuZ19wdHItPmNoYW5uZWxzKTsKKyAgIHBuZ19wdHItPnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHBuZ19wdHItPnBpeGVsX2RlcHRoLCBwbmdfcHRyLT53aWR0aCk7CisgICBwbmdfZGVidWcxKDMsICJiaXRfZGVwdGggPSAlZCIsIHBuZ19wdHItPmJpdF9kZXB0aCk7CisgICBwbmdfZGVidWcxKDMsICJjaGFubmVscyA9ICVkIiwgcG5nX3B0ci0+Y2hhbm5lbHMpOworICAgcG5nX2RlYnVnMSgzLCAicm93Ynl0ZXMgPSAlbHUiLCAodW5zaWduZWQgbG9uZylwbmdfcHRyLT5yb3dieXRlcyk7CisgICBwbmdfc2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIHdpZHRoLCBoZWlnaHQsIGJpdF9kZXB0aCwKKyAgICAgICBjb2xvcl90eXBlLCBpbnRlcmxhY2VfdHlwZSwgY29tcHJlc3Npb25fdHlwZSwgZmlsdGVyX3R5cGUpOworfQorCisvKiBSZWFkIGFuZCBjaGVjayB0aGUgcGFsZXR0ZSAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfaGFuZGxlX1BMVEUocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKK3sKKyAgIHBuZ19jb2xvciBwYWxldHRlW1BOR19NQVhfUEFMRVRURV9MRU5HVEhdOworICAgaW50IG1heF9wYWxldHRlX2xlbmd0aCwgbnVtLCBpOworI2lmZGVmIFBOR19QT0lOVEVSX0lOREVYSU5HX1NVUFBPUlRFRAorICAgcG5nX2NvbG9ycCBwYWxfcHRyOworI2VuZGlmCisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9QTFRFIik7CisKKyAgIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpID09IDApCisgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgIm1pc3NpbmcgSUhEUiIpOworCisgICAvKiBNb3ZlZCB0byBiZWZvcmUgdGhlICdhZnRlciBJREFUJyBjaGVjayBiZWxvdyBiZWNhdXNlIG90aGVyd2lzZSBkdXBsaWNhdGUKKyAgICAqIFBMVEUgY2h1bmtzIGFyZSBwb3RlbnRpYWxseSBpZ25vcmVkICh0aGUgc3BlYyBzYXlzIHRoZXJlIHNoYWxsIG5vdCBiZSBtb3JlCisgICAgKiB0aGFuIG9uZSBQTFRFLCB0aGUgZXJyb3IgaXMgbm90IHRyZWF0ZWQgYXMgYmVuaWduLCBzbyB0aGlzIGNoZWNrIHRydW1wcworICAgICogdGhlIHJlcXVpcmVtZW50IHRoYXQgUExURSBhcHBlYXJzIGJlZm9yZSBJREFULikKKyAgICAqLworICAgZWxzZSBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9QTFRFKSAhPSAwKQorICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJkdXBsaWNhdGUiKTsKKworICAgZWxzZSBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKSAhPSAwKQorICAgeworICAgICAgLyogVGhpcyBpcyBiZW5pZ24gYmVjYXVzZSB0aGUgbm9uLWJlbmlnbiBlcnJvciBoYXBwZW5lZCBiZWZvcmUsIHdoZW4gYW4KKyAgICAgICAqIElEQVQgd2FzIGVuY291bnRlcmVkIGluIGEgY29sb3ItbWFwcGVkIGltYWdlIHdpdGggbm8gUExURS4KKyAgICAgICAqLworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIm91dCBvZiBwbGFjZSIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX1BMVEU7CisKKyAgIGlmICgocG5nX3B0ci0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKSA9PSAwKQorICAgeworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImlnbm9yZWQgaW4gZ3JheXNjYWxlIFBORyIpOworICAgICAgcmV0dXJuOworICAgfQorCisjaWZuZGVmIFBOR19SRUFEX09QVF9QTFRFX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgIT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgIHsKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICByZXR1cm47CisgICB9CisjZW5kaWYKKworICAgaWYgKGxlbmd0aCA+IDMqUE5HX01BWF9QQUxFVFRFX0xFTkdUSCB8fCBsZW5ndGggJSAzKQorICAgeworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKworICAgICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgIT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgICAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImludmFsaWQiKTsKKworICAgICAgZWxzZQorICAgICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJpbnZhbGlkIik7CisKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgLyogVGhlIGNhc3QgaXMgc2FmZSBiZWNhdXNlICdsZW5ndGgnIGlzIGxlc3MgdGhhbiAzKlBOR19NQVhfUEFMRVRURV9MRU5HVEggKi8KKyAgIG51bSA9IChpbnQpbGVuZ3RoIC8gMzsKKworICAgLyogSWYgdGhlIHBhbGV0dGUgaGFzIDI1NiBvciBmZXdlciBlbnRyaWVzIGJ1dCBpcyB0b28gbGFyZ2UgZm9yIHRoZSBiaXQKKyAgICAqIGRlcHRoLCB3ZSBkb24ndCBpc3N1ZSBhbiBlcnJvciwgdG8gcHJlc2VydmUgdGhlIGJlaGF2aW9yIG9mIHByZXZpb3VzCisgICAgKiBsaWJwbmcgdmVyc2lvbnMuIFdlIHNpbGVudGx5IHRydW5jYXRlIHRoZSB1bnVzZWQgZXh0cmEgcGFsZXR0ZSBlbnRyaWVzCisgICAgKiBoZXJlLgorICAgICovCisgICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQorICAgICAgbWF4X3BhbGV0dGVfbGVuZ3RoID0gKDEgPDwgcG5nX3B0ci0+Yml0X2RlcHRoKTsKKyAgIGVsc2UKKyAgICAgIG1heF9wYWxldHRlX2xlbmd0aCA9IFBOR19NQVhfUEFMRVRURV9MRU5HVEg7CisKKyAgIGlmIChudW0gPiBtYXhfcGFsZXR0ZV9sZW5ndGgpCisgICAgICBudW0gPSBtYXhfcGFsZXR0ZV9sZW5ndGg7CisKKyNpZmRlZiBQTkdfUE9JTlRFUl9JTkRFWElOR19TVVBQT1JURUQKKyAgIGZvciAoaSA9IDAsIHBhbF9wdHIgPSBwYWxldHRlOyBpIDwgbnVtOyBpKyssIHBhbF9wdHIrKykKKyAgIHsKKyAgICAgIHBuZ19ieXRlIGJ1ZlszXTsKKworICAgICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZiwgMyk7CisgICAgICBwYWxfcHRyLT5yZWQgPSBidWZbMF07CisgICAgICBwYWxfcHRyLT5ncmVlbiA9IGJ1ZlsxXTsKKyAgICAgIHBhbF9wdHItPmJsdWUgPSBidWZbMl07CisgICB9CisjZWxzZQorICAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQorICAgeworICAgICAgcG5nX2J5dGUgYnVmWzNdOworCisgICAgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmLCAzKTsKKyAgICAgIC8qIERvbid0IGRlcGVuZCB1cG9uIHBuZ19jb2xvciBiZWluZyBhbnkgb3JkZXIgKi8KKyAgICAgIHBhbGV0dGVbaV0ucmVkID0gYnVmWzBdOworICAgICAgcGFsZXR0ZVtpXS5ncmVlbiA9IGJ1ZlsxXTsKKyAgICAgIHBhbGV0dGVbaV0uYmx1ZSA9IGJ1ZlsyXTsKKyAgIH0KKyNlbmRpZgorCisgICAvKiBJZiB3ZSBhY3R1YWxseSBuZWVkIHRoZSBQTFRFIGNodW5rIChpZSBmb3IgYSBwYWxldHRlZCBpbWFnZSksIHdlIGRvCisgICAgKiB3aGF0ZXZlciB0aGUgbm9ybWFsIENSQyBjb25maWd1cmF0aW9uIHRlbGxzIHVzLiAgSG93ZXZlciwgaWYgd2UKKyAgICAqIGhhdmUgYW4gUkdCIGltYWdlLCB0aGUgUExURSBjYW4gYmUgY29uc2lkZXJlZCBhbmNpbGxhcnksIHNvCisgICAgKiB3ZSB3aWxsIGFjdCBhcyB0aG91Z2ggaXQgaXMuCisgICAgKi8KKyNpZm5kZWYgUE5HX1JFQURfT1BUX1BMVEVfU1VQUE9SVEVECisgICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQorI2VuZGlmCisgICB7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAoaW50KSBsZW5ndGggLSBudW0gKiAzKTsKKyAgIH0KKworI2lmbmRlZiBQTkdfUkVBRF9PUFRfUExURV9TVVBQT1JURUQKKyAgIGVsc2UgaWYgKHBuZ19jcmNfZXJyb3IocG5nX3B0cikgIT0gMCkgIC8qIE9ubHkgaWYgd2UgaGF2ZSBhIENSQyBlcnJvciAqLworICAgeworICAgICAgLyogSWYgd2UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIGRhdGEgZnJvbSBhbiBhbmNpbGxhcnkgY2h1bmssCisgICAgICAgKiB3ZSBoYXZlIHR3byBvcHRpb25zOiBhbiBlcnJvciBhYm9ydCwgb3IgYSB3YXJuaW5nIGFuZCB3ZQorICAgICAgICogaWdub3JlIHRoZSBkYXRhIGluIHRoaXMgY2h1bmsgKHdoaWNoIHNob3VsZCBiZSBPSywgc2luY2UKKyAgICAgICAqIGl0J3MgY29uc2lkZXJlZCBhbmNpbGxhcnkgZm9yIGEgUkdCIG9yIFJHQkEgaW1hZ2UpLgorICAgICAgICoKKyAgICAgICAqIElNUExFTUVOVEFUSU9OIE5PVEU6IHRoaXMgaXMgb25seSBoZXJlIGJlY2F1c2UgcG5nX2NyY19maW5pc2ggdXNlcyB0aGUKKyAgICAgICAqIGNodW5rIHR5cGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gY2hlY2sgdGhlIGFuY2lsbGFyeSBvciB0aGUgY3JpdGljYWwKKyAgICAgICAqIGZsYWdzLgorICAgICAgICovCisgICAgICBpZiAoKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9VU0UpID09IDApCisgICAgICB7CisgICAgICAgICBpZiAoKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9OT1dBUk4pICE9IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBuZ19jaHVua19lcnJvcihwbmdfcHRyLCAiQ1JDIGVycm9yIik7CisgICAgICB9CisKKyAgICAgIC8qIE90aGVyd2lzZSwgd2UgKG9wdGlvbmFsbHkpIGVtaXQgYSB3YXJuaW5nIGFuZCB1c2UgdGhlIGNodW5rLiAqLworICAgICAgZWxzZSBpZiAoKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9OT1dBUk4pID09IDApCisgICAgICAgICBwbmdfY2h1bmtfd2FybmluZyhwbmdfcHRyLCAiQ1JDIGVycm9yIik7CisgICB9CisjZW5kaWYKKworICAgLyogVE9ETzogcG5nX3NldF9QTFRFIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2Ygc2V0dGluZyBwbmdfcHRyLT5wYWxldHRlIHRvIGl0cworICAgICogb3duIGNvcHkgb2YgdGhlIHBhbGV0dGUuICBUaGlzIGhhcyB0aGUgc2lkZSBlZmZlY3QgdGhhdCB3aGVuIHBuZ19zdGFydF9yb3cKKyAgICAqIGlzIGNhbGxlZCAodGhpcyBoYXBwZW5zIGFmdGVyIGFueSBjYWxsIHRvIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKSB0aGUKKyAgICAqIGluZm9fcHRyIHBhbGV0dGUgZ2V0cyBjaGFuZ2VkLiAgVGhpcyBpcyBleHRyZW1lbHkgdW5leHBlY3RlZCBhbmQKKyAgICAqIGNvbmZ1c2luZy4KKyAgICAqCisgICAgKiBGaXggdGhpcyBieSBub3Qgc2hhcmluZyB0aGUgcGFsZXR0ZSBpbiB0aGlzIHdheS4KKyAgICAqLworICAgcG5nX3NldF9QTFRFKHBuZ19wdHIsIGluZm9fcHRyLCBwYWxldHRlLCBudW0pOworCisgICAvKiBUaGUgdGhyZWUgY2h1bmtzLCBiS0dELCBoSVNUIGFuZCB0Uk5TICptdXN0KiBhcHBlYXIgYWZ0ZXIgUExURSBhbmQgYmVmb3JlCisgICAgKiBJREFULiAgUHJpb3IgdG8gMS42LjAgdGhpcyB3YXMgbm90IGNoZWNrZWQ7IGluc3RlYWQgdGhlIGNvZGUgbWVyZWx5CisgICAgKiBjaGVja2VkIHRoZSBhcHBhcmVudCB2YWxpZGl0eSBvZiBhIHRSTlMgY2h1bmsgaW5zZXJ0ZWQgYmVmb3JlIFBMVEUgb24gYQorICAgICogcGFsZXR0ZSBQTkcuICAxLjYuMCBhdHRlbXB0cyB0byByaWdvcm91c2x5IGZvbGxvdyB0aGUgc3RhbmRhcmQgYW5kCisgICAgKiB0aGVyZWZvcmUgZG9lcyBhIGJlbmlnbiBlcnJvciBpZiB0aGUgZXJyb25lb3VzIGNvbmRpdGlvbiBpcyBkZXRlY3RlZCAqYW5kKgorICAgICogY2FuY2VscyB0aGUgdFJOUyBpZiB0aGUgYmVuaWduIGVycm9yIHJldHVybnMuICBUaGUgYWx0ZXJuYXRpdmUgaXMgdG8KKyAgICAqIGFtZW5kIHRoZSBzdGFuZGFyZCBzaW5jZSBpdCB3b3VsZCBiZSByYXRoZXIgaHlwb2NyaXRpY2FsIG9mIHRoZSBzdGFuZGFyZHMKKyAgICAqIG1haW50YWluZXJzIHRvIGlnbm9yZSBpdC4KKyAgICAqLworI2lmZGVmIFBOR19SRUFEX3RSTlNfU1VQUE9SVEVECisgICBpZiAocG5nX3B0ci0+bnVtX3RyYW5zID4gMCB8fAorICAgICAgIChpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT190Uk5TKSAhPSAwKSkKKyAgIHsKKyAgICAgIC8qIENhbmNlbCB0aGlzIGJlY2F1c2Ugb3RoZXJ3aXNlIGl0IHdvdWxkIGJlIHVzZWQgaWYgdGhlIHRyYW5zZm9ybXMKKyAgICAgICAqIHJlcXVpcmUgaXQuICBEb24ndCBjYW5jZWwgdGhlICd2YWxpZCcgZmxhZyBiZWNhdXNlIHRoaXMgd291bGQgcHJldmVudAorICAgICAgICogZGV0ZWN0aW9uIG9mIGR1cGxpY2F0ZSBjaHVua3MuCisgICAgICAgKi8KKyAgICAgIHBuZ19wdHItPm51bV90cmFucyA9IDA7CisKKyAgICAgIGlmIChpbmZvX3B0ciAhPSBOVUxMKQorICAgICAgICAgaW5mb19wdHItPm51bV90cmFucyA9IDA7CisKKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgInRSTlMgbXVzdCBiZSBhZnRlciIpOworICAgfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9oSVNUX1NVUFBPUlRFRAorICAgaWYgKGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2hJU1QpICE9IDApCisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJoSVNUIG11c3QgYmUgYWZ0ZXIiKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfYktHRF9TVVBQT1JURUQKKyAgIGlmIChpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19iS0dEKSAhPSAwKQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiYktHRCBtdXN0IGJlIGFmdGVyIik7CisjZW5kaWYKK30KKwordm9pZCAvKiBQUklWQVRFICovCitwbmdfaGFuZGxlX0lFTkQocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9JRU5EIik7CisKKyAgIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpID09IDAgfHwKKyAgICAgICAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpID09IDApCisgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgIm91dCBvZiBwbGFjZSIpOworCisgICBwbmdfcHRyLT5tb2RlIHw9IChQTkdfQUZURVJfSURBVCB8IFBOR19IQVZFX0lFTkQpOworCisgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworCisgICBpZiAobGVuZ3RoICE9IDApCisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJpbnZhbGlkIik7CisKKyAgIFBOR19VTlVTRUQoaW5mb19wdHIpCit9CisKKyNpZmRlZiBQTkdfUkVBRF9nQU1BX1NVUFBPUlRFRAordm9pZCAvKiBQUklWQVRFICovCitwbmdfaGFuZGxlX2dBTUEocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKK3sKKyAgIHBuZ19maXhlZF9wb2ludCBpZ2FtbWE7CisgICBwbmdfYnl0ZSBidWZbNF07CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9nQU1BIik7CisKKyAgIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpID09IDApCisgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgIm1pc3NpbmcgSUhEUiIpOworCisgICBlbHNlIGlmICgocG5nX3B0ci0+bW9kZSAmIChQTkdfSEFWRV9JREFUfFBOR19IQVZFX1BMVEUpKSAhPSAwKQorICAgeworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIm91dCBvZiBwbGFjZSIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiAobGVuZ3RoICE9IDQpCisgICB7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiaW52YWxpZCIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmLCA0KTsKKworICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApICE9IDApCisgICAgICByZXR1cm47CisKKyAgIGlnYW1tYSA9IHBuZ19nZXRfZml4ZWRfcG9pbnQoTlVMTCwgYnVmKTsKKworICAgcG5nX2NvbG9yc3BhY2Vfc2V0X2dhbW1hKHBuZ19wdHIsICZwbmdfcHRyLT5jb2xvcnNwYWNlLCBpZ2FtbWEpOworICAgcG5nX2NvbG9yc3BhY2Vfc3luYyhwbmdfcHRyLCBpbmZvX3B0cik7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX3NCSVRfU1VQUE9SVEVECit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19oYW5kbGVfc0JJVChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQoreworICAgdW5zaWduZWQgaW50IHRydWVsZW4sIGk7CisgICBwbmdfYnl0ZSBzYW1wbGVfZGVwdGg7CisgICBwbmdfYnl0ZSBidWZbNF07CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9zQklUIik7CisKKyAgIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpID09IDApCisgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgIm1pc3NpbmcgSUhEUiIpOworCisgICBlbHNlIGlmICgocG5nX3B0ci0+bW9kZSAmIChQTkdfSEFWRV9JREFUfFBOR19IQVZFX1BMVEUpKSAhPSAwKQorICAgeworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIm91dCBvZiBwbGFjZSIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiAoaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc0JJVCkgIT0gMCkKKyAgIHsKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJkdXBsaWNhdGUiKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgIHsKKyAgICAgIHRydWVsZW4gPSAzOworICAgICAgc2FtcGxlX2RlcHRoID0gODsKKyAgIH0KKworICAgZWxzZQorICAgeworICAgICAgdHJ1ZWxlbiA9IHBuZ19wdHItPmNoYW5uZWxzOworICAgICAgc2FtcGxlX2RlcHRoID0gcG5nX3B0ci0+Yml0X2RlcHRoOworICAgfQorCisgICBpZiAobGVuZ3RoICE9IHRydWVsZW4gfHwgbGVuZ3RoID4gNCkKKyAgIHsKKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImludmFsaWQiKTsKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGJ1ZlswXSA9IGJ1ZlsxXSA9IGJ1ZlsyXSA9IGJ1ZlszXSA9IHNhbXBsZV9kZXB0aDsKKyAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBidWYsIHRydWVsZW4pOworCisgICBpZiAocG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCkgIT0gMCkKKyAgICAgIHJldHVybjsKKworICAgZm9yIChpPTA7IGk8dHJ1ZWxlbjsgKytpKQorICAgeworICAgICAgaWYgKGJ1ZltpXSA9PSAwIHx8IGJ1ZltpXSA+IHNhbXBsZV9kZXB0aCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImludmFsaWQiKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgIH0KKworICAgaWYgKChwbmdfcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpICE9IDApCisgICB7CisgICAgICBwbmdfcHRyLT5zaWdfYml0LnJlZCA9IGJ1ZlswXTsKKyAgICAgIHBuZ19wdHItPnNpZ19iaXQuZ3JlZW4gPSBidWZbMV07CisgICAgICBwbmdfcHRyLT5zaWdfYml0LmJsdWUgPSBidWZbMl07CisgICAgICBwbmdfcHRyLT5zaWdfYml0LmFscGhhID0gYnVmWzNdOworICAgfQorCisgICBlbHNlCisgICB7CisgICAgICBwbmdfcHRyLT5zaWdfYml0LmdyYXkgPSBidWZbMF07CisgICAgICBwbmdfcHRyLT5zaWdfYml0LnJlZCA9IGJ1ZlswXTsKKyAgICAgIHBuZ19wdHItPnNpZ19iaXQuZ3JlZW4gPSBidWZbMF07CisgICAgICBwbmdfcHRyLT5zaWdfYml0LmJsdWUgPSBidWZbMF07CisgICAgICBwbmdfcHRyLT5zaWdfYml0LmFscGhhID0gYnVmWzFdOworICAgfQorCisgICBwbmdfc2V0X3NCSVQocG5nX3B0ciwgaW5mb19wdHIsICYocG5nX3B0ci0+c2lnX2JpdCkpOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9jSFJNX1NVUFBPUlRFRAordm9pZCAvKiBQUklWQVRFICovCitwbmdfaGFuZGxlX2NIUk0ocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKK3sKKyAgIHBuZ19ieXRlIGJ1ZlszMl07CisgICBwbmdfeHkgeHk7CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9jSFJNIik7CisKKyAgIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpID09IDApCisgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgIm1pc3NpbmcgSUhEUiIpOworCisgICBlbHNlIGlmICgocG5nX3B0ci0+bW9kZSAmIChQTkdfSEFWRV9JREFUfFBOR19IQVZFX1BMVEUpKSAhPSAwKQorICAgeworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIm91dCBvZiBwbGFjZSIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiAobGVuZ3RoICE9IDMyKQorICAgeworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImludmFsaWQiKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZiwgMzIpOworCisgICBpZiAocG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCkgIT0gMCkKKyAgICAgIHJldHVybjsKKworICAgeHkud2hpdGV4ID0gcG5nX2dldF9maXhlZF9wb2ludChOVUxMLCBidWYpOworICAgeHkud2hpdGV5ID0gcG5nX2dldF9maXhlZF9wb2ludChOVUxMLCBidWYgKyA0KTsKKyAgIHh5LnJlZHggICA9IHBuZ19nZXRfZml4ZWRfcG9pbnQoTlVMTCwgYnVmICsgOCk7CisgICB4eS5yZWR5ICAgPSBwbmdfZ2V0X2ZpeGVkX3BvaW50KE5VTEwsIGJ1ZiArIDEyKTsKKyAgIHh5LmdyZWVueCA9IHBuZ19nZXRfZml4ZWRfcG9pbnQoTlVMTCwgYnVmICsgMTYpOworICAgeHkuZ3JlZW55ID0gcG5nX2dldF9maXhlZF9wb2ludChOVUxMLCBidWYgKyAyMCk7CisgICB4eS5ibHVleCAgPSBwbmdfZ2V0X2ZpeGVkX3BvaW50KE5VTEwsIGJ1ZiArIDI0KTsKKyAgIHh5LmJsdWV5ICA9IHBuZ19nZXRfZml4ZWRfcG9pbnQoTlVMTCwgYnVmICsgMjgpOworCisgICBpZiAoeHkud2hpdGV4ID09IFBOR19GSVhFRF9FUlJPUiB8fAorICAgICAgIHh5LndoaXRleSA9PSBQTkdfRklYRURfRVJST1IgfHwKKyAgICAgICB4eS5yZWR4ICAgPT0gUE5HX0ZJWEVEX0VSUk9SIHx8CisgICAgICAgeHkucmVkeSAgID09IFBOR19GSVhFRF9FUlJPUiB8fAorICAgICAgIHh5LmdyZWVueCA9PSBQTkdfRklYRURfRVJST1IgfHwKKyAgICAgICB4eS5ncmVlbnkgPT0gUE5HX0ZJWEVEX0VSUk9SIHx8CisgICAgICAgeHkuYmx1ZXggID09IFBOR19GSVhFRF9FUlJPUiB8fAorICAgICAgIHh5LmJsdWV5ICA9PSBQTkdfRklYRURfRVJST1IpCisgICB7CisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJpbnZhbGlkIHZhbHVlcyIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICAvKiBJZiBhIGNvbG9yc3BhY2UgZXJyb3IgaGFzIGFscmVhZHkgYmVlbiBvdXRwdXQgc2tpcCB0aGlzIGNodW5rICovCisgICBpZiAoKHBuZ19wdHItPmNvbG9yc3BhY2UuZmxhZ3MgJiBQTkdfQ09MT1JTUEFDRV9JTlZBTElEKSAhPSAwKQorICAgICAgcmV0dXJuOworCisgICBpZiAoKHBuZ19wdHItPmNvbG9yc3BhY2UuZmxhZ3MgJiBQTkdfQ09MT1JTUEFDRV9GUk9NX2NIUk0pICE9IDApCisgICB7CisgICAgICBwbmdfcHRyLT5jb2xvcnNwYWNlLmZsYWdzIHw9IFBOR19DT0xPUlNQQUNFX0lOVkFMSUQ7CisgICAgICBwbmdfY29sb3JzcGFjZV9zeW5jKHBuZ19wdHIsIGluZm9fcHRyKTsKKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImR1cGxpY2F0ZSIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBwbmdfcHRyLT5jb2xvcnNwYWNlLmZsYWdzIHw9IFBOR19DT0xPUlNQQUNFX0ZST01fY0hSTTsKKyAgICh2b2lkKXBuZ19jb2xvcnNwYWNlX3NldF9jaHJvbWF0aWNpdGllcyhwbmdfcHRyLCAmcG5nX3B0ci0+Y29sb3JzcGFjZSwgJnh5LAorICAgICAgMS8qcHJlZmVyIGNIUk0gdmFsdWVzKi8pOworICAgcG5nX2NvbG9yc3BhY2Vfc3luYyhwbmdfcHRyLCBpbmZvX3B0cik7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX3NSR0JfU1VQUE9SVEVECit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19oYW5kbGVfc1JHQihwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQoreworICAgcG5nX2J5dGUgaW50ZW50OworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfc1JHQiIpOworCisgICBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSA9PSAwKQorICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJtaXNzaW5nIElIRFIiKTsKKworICAgZWxzZSBpZiAoKHBuZ19wdHItPm1vZGUgJiAoUE5HX0hBVkVfSURBVHxQTkdfSEFWRV9QTFRFKSkgIT0gMCkKKyAgIHsKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJvdXQgb2YgcGxhY2UiKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgaWYgKGxlbmd0aCAhPSAxKQorICAgeworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImludmFsaWQiKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsICZpbnRlbnQsIDEpOworCisgICBpZiAocG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCkgIT0gMCkKKyAgICAgIHJldHVybjsKKworICAgLyogSWYgYSBjb2xvcnNwYWNlIGVycm9yIGhhcyBhbHJlYWR5IGJlZW4gb3V0cHV0IHNraXAgdGhpcyBjaHVuayAqLworICAgaWYgKChwbmdfcHRyLT5jb2xvcnNwYWNlLmZsYWdzICYgUE5HX0NPTE9SU1BBQ0VfSU5WQUxJRCkgIT0gMCkKKyAgICAgIHJldHVybjsKKworICAgLyogT25seSBvbmUgc1JHQiBvciBpQ0NQIGNodW5rIGlzIGFsbG93ZWQsIHVzZSB0aGUgSEFWRV9JTlRFTlQgZmxhZyB0byBkZXRlY3QKKyAgICAqIHRoaXMuCisgICAgKi8KKyAgIGlmICgocG5nX3B0ci0+Y29sb3JzcGFjZS5mbGFncyAmIFBOR19DT0xPUlNQQUNFX0hBVkVfSU5URU5UKSAhPSAwKQorICAgeworICAgICAgcG5nX3B0ci0+Y29sb3JzcGFjZS5mbGFncyB8PSBQTkdfQ09MT1JTUEFDRV9JTlZBTElEOworICAgICAgcG5nX2NvbG9yc3BhY2Vfc3luYyhwbmdfcHRyLCBpbmZvX3B0cik7CisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJ0b28gbWFueSBwcm9maWxlcyIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICAodm9pZClwbmdfY29sb3JzcGFjZV9zZXRfc1JHQihwbmdfcHRyLCAmcG5nX3B0ci0+Y29sb3JzcGFjZSwgaW50ZW50KTsKKyAgIHBuZ19jb2xvcnNwYWNlX3N5bmMocG5nX3B0ciwgaW5mb19wdHIpOworfQorI2VuZGlmIC8qIFJFQURfc1JHQiAqLworCisjaWZkZWYgUE5HX1JFQURfaUNDUF9TVVBQT1JURUQKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2hhbmRsZV9pQ0NQKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpCisvKiBOb3RlOiB0aGlzIGRvZXMgbm90IHByb3Blcmx5IGhhbmRsZSBwcm9maWxlcyB0aGF0IGFyZSA+IDY0SyB1bmRlciBET1MgKi8KK3sKKyAgIHBuZ19jb25zdF9jaGFycCBlcnJtc2cgPSBOVUxMOyAvKiBlcnJvciBtZXNzYWdlIG91dHB1dCwgb3Igbm8gZXJyb3IgKi8KKyAgIGludCBmaW5pc2hlZCA9IDA7IC8qIGNyYyBjaGVja2VkICovCisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9pQ0NQIik7CisKKyAgIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpID09IDApCisgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgIm1pc3NpbmcgSUhEUiIpOworCisgICBlbHNlIGlmICgocG5nX3B0ci0+bW9kZSAmIChQTkdfSEFWRV9JREFUfFBOR19IQVZFX1BMVEUpKSAhPSAwKQorICAgeworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIm91dCBvZiBwbGFjZSIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICAvKiBDb25zaXN0ZW50IHdpdGggYWxsIHRoZSBhYm92ZSBjb2xvcnNwYWNlIGhhbmRsaW5nIGFuIG9idmlvdXNseSAqaW52YWxpZCoKKyAgICAqIGNodW5rIGlzIGp1c3QgaWdub3JlZCwgc28gZG9lcyBub3QgaW52YWxpZGF0ZSB0aGUgY29sb3Igc3BhY2UuICBBbgorICAgICogYWx0ZXJuYXRpdmUgaXMgdG8gc2V0IHRoZSAnaW52YWxpZCcgZmxhZ3MgYXQgdGhlIHN0YXJ0IG9mIHRoaXMgcm91dGluZQorICAgICogYW5kIG9ubHkgY2xlYXIgdGhlbSBpbiB0aGV5IHdlcmUgbm90IHNldCBiZWZvcmUgYW5kIGFsbCB0aGUgdGVzdHMgcGFzcy4KKyAgICAqIFRoZSBtaW5pbXVtICdkZWZsYXRlJyBzdHJlYW0gaXMgYXNzdW1lZCB0byBiZSBqdXN0IHRoZSAyIGJ5dGUgaGVhZGVyIGFuZAorICAgICogNCBieXRlIGNoZWNrc3VtLiAgVGhlIGtleXdvcmQgbXVzdCBiZSBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGFuZCB0aGVyZSBpcworICAgICogYSB0ZXJtaW5hdG9yICgwKSBieXRlIGFuZCB0aGUgY29tcHJlc3Npb24gbWV0aG9kLgorICAgICovCisgICBpZiAobGVuZ3RoIDwgOSkKKyAgIHsKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJ0b28gc2hvcnQiKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgLyogSWYgYSBjb2xvcnNwYWNlIGVycm9yIGhhcyBhbHJlYWR5IGJlZW4gb3V0cHV0IHNraXAgdGhpcyBjaHVuayAqLworICAgaWYgKChwbmdfcHRyLT5jb2xvcnNwYWNlLmZsYWdzICYgUE5HX0NPTE9SU1BBQ0VfSU5WQUxJRCkgIT0gMCkKKyAgIHsKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8qIE9ubHkgb25lIHNSR0Igb3IgaUNDUCBjaHVuayBpcyBhbGxvd2VkLCB1c2UgdGhlIEhBVkVfSU5URU5UIGZsYWcgdG8gZGV0ZWN0CisgICAgKiB0aGlzLgorICAgICovCisgICBpZiAoKHBuZ19wdHItPmNvbG9yc3BhY2UuZmxhZ3MgJiBQTkdfQ09MT1JTUEFDRV9IQVZFX0lOVEVOVCkgPT0gMCkKKyAgIHsKKyAgICAgIHVJbnQgcmVhZF9sZW5ndGgsIGtleXdvcmRfbGVuZ3RoOworICAgICAgY2hhciBrZXl3b3JkWzgxXTsKKworICAgICAgLyogRmluZCB0aGUga2V5d29yZDsgdGhlIGtleXdvcmQgcGx1cyBzZXBhcmF0b3IgYW5kIGNvbXByZXNzaW9uIG1ldGhvZAorICAgICAgICogYnl0ZXMgY2FuIGJlIGF0IG1vc3QgODEgY2hhcmFjdGVycyBsb25nLgorICAgICAgICovCisgICAgICByZWFkX2xlbmd0aCA9IDgxOyAvKiBtYXhpbXVtICovCisgICAgICBpZiAocmVhZF9sZW5ndGggPiBsZW5ndGgpCisgICAgICAgICByZWFkX2xlbmd0aCA9ICh1SW50KWxlbmd0aDsKKworICAgICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIChwbmdfYnl0ZXApa2V5d29yZCwgcmVhZF9sZW5ndGgpOworICAgICAgbGVuZ3RoIC09IHJlYWRfbGVuZ3RoOworCisgICAgICBrZXl3b3JkX2xlbmd0aCA9IDA7CisgICAgICB3aGlsZSAoa2V5d29yZF9sZW5ndGggPCA4MCAmJiBrZXl3b3JkX2xlbmd0aCA8IHJlYWRfbGVuZ3RoICYmCisgICAgICAgICBrZXl3b3JkW2tleXdvcmRfbGVuZ3RoXSAhPSAwKQorICAgICAgICAgKytrZXl3b3JkX2xlbmd0aDsKKworICAgICAgLyogVE9ETzogbWFrZSB0aGUga2V5d29yZCBjaGVja2luZyBjb21tb24gKi8KKyAgICAgIGlmIChrZXl3b3JkX2xlbmd0aCA+PSAxICYmIGtleXdvcmRfbGVuZ3RoIDw9IDc5KQorICAgICAgeworICAgICAgICAgLyogV2Ugb25seSB1bmRlcnN0YW5kICcwJyBjb21wcmVzc2lvbiAtIGRlZmxhdGUgLSBzbyBpZiB3ZSBnZXQgYQorICAgICAgICAgICogZGlmZmVyZW50IHZhbHVlIHdlIGNhbid0IHNhZmVseSBkZWNvZGUgdGhlIGNodW5rLgorICAgICAgICAgICovCisgICAgICAgICBpZiAoa2V5d29yZF9sZW5ndGgrMSA8IHJlYWRfbGVuZ3RoICYmCisgICAgICAgICAgICBrZXl3b3JkW2tleXdvcmRfbGVuZ3RoKzFdID09IFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UpCisgICAgICAgICB7CisgICAgICAgICAgICByZWFkX2xlbmd0aCAtPSBrZXl3b3JkX2xlbmd0aCsyOworCisgICAgICAgICAgICBpZiAocG5nX2luZmxhdGVfY2xhaW0ocG5nX3B0ciwgcG5nX2lDQ1ApID09IFpfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBCeXRlIHByb2ZpbGVfaGVhZGVyWzEzMl07CisgICAgICAgICAgICAgICBCeXRlIGxvY2FsX2J1ZmZlcltQTkdfSU5GTEFURV9CVUZfU0laRV07CisgICAgICAgICAgICAgICBwbmdfYWxsb2Nfc2l6ZV90IHNpemUgPSAoc2l6ZW9mIHByb2ZpbGVfaGVhZGVyKTsKKworICAgICAgICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X2luID0gKEJ5dGVmKilrZXl3b3JkICsgKGtleXdvcmRfbGVuZ3RoKzIpOworICAgICAgICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA9IHJlYWRfbGVuZ3RoOworICAgICAgICAgICAgICAgKHZvaWQpcG5nX2luZmxhdGVfcmVhZChwbmdfcHRyLCBsb2NhbF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAoc2l6ZW9mIGxvY2FsX2J1ZmZlciksICZsZW5ndGgsIHByb2ZpbGVfaGVhZGVyLCAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgIDAvKmZpbmlzaDogZG9uJ3QsIGJlY2F1c2UgdGhlIG91dHB1dCBpcyB0b28gc21hbGwqLyk7CisKKyAgICAgICAgICAgICAgIGlmIChzaXplID09IDApCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiBXZSBoYXZlIHRoZSBJQ0MgcHJvZmlsZSBoZWFkZXI7IGRvIHRoZSBiYXNpYyBoZWFkZXIgY2hlY2tzLgorICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBjb25zdCBwbmdfdWludF8zMiBwcm9maWxlX2xlbmd0aCA9CisgICAgICAgICAgICAgICAgICAgICBwbmdfZ2V0X3VpbnRfMzIocHJvZmlsZV9oZWFkZXIpOworCisgICAgICAgICAgICAgICAgICBpZiAocG5nX2ljY19jaGVja19sZW5ndGgocG5nX3B0ciwgJnBuZ19wdHItPmNvbG9yc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkLCBwcm9maWxlX2xlbmd0aCkgIT0gMCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBsZW5ndGggaXMgYXBwYXJlbnRseSBvaywgc28gd2UgY2FuIGNoZWNrIHRoZSAxMzIKKyAgICAgICAgICAgICAgICAgICAgICAqIGJ5dGUgaGVhZGVyLgorICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICBpZiAocG5nX2ljY19jaGVja19oZWFkZXIocG5nX3B0ciwgJnBuZ19wdHItPmNvbG9yc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkLCBwcm9maWxlX2xlbmd0aCwgcHJvZmlsZV9oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5jb2xvcl90eXBlKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogTm93IHJlYWQgdGhlIHRhZyB0YWJsZTsgYSB2YXJpYWJsZSBzaXplIGJ1ZmZlciBpcworICAgICAgICAgICAgICAgICAgICAgICAgICogbmVlZGVkIGF0IHRoaXMgcG9pbnQsIGFsbG9jYXRlIG9uZSBmb3IgdGhlIHdob2xlCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBwcm9maWxlLiAgVGhlIGhlYWRlciBjaGVjayBoYXMgYWxyZWFkeSB2YWxpZGF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoYXQgbm9uZSBvZiB0aGVzZSBzdHVmZiB3aWxsIG92ZXJmbG93LgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwbmdfdWludF8zMiB0YWdfY291bnQgPSBwbmdfZ2V0X3VpbnRfMzIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlX2hlYWRlcisxMjgpOworICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2J5dGVwIHByb2ZpbGUgPSBwbmdfcmVhZF9idWZmZXIocG5nX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfbGVuZ3RoLCAyLypzaWxlbnQqLyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocHJvZmlsZSwgcHJvZmlsZV9oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mIHByb2ZpbGVfaGVhZGVyKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAxMiAqIHRhZ19jb3VudDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpcG5nX2luZmxhdGVfcmVhZChwbmdfcHRyLCBsb2NhbF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mIGxvY2FsX2J1ZmZlciksICZsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlICsgKHNpemVvZiBwcm9maWxlX2hlYWRlciksICZzaXplLCAwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RpbGwgZXhwZWN0IGEgYnVmZmVyIGVycm9yIGJlY2F1c2Ugd2UgZXhwZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGVyZSB0byBiZSBzb21lIHRhZyBkYXRhIQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBuZ19pY2NfY2hlY2tfdGFnX3RhYmxlKHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG5nX3B0ci0+Y29sb3JzcGFjZSwga2V5d29yZCwgcHJvZmlsZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIHByb2ZpbGUgaGFzIGJlZW4gdmFsaWRhdGVkIGZvciBiYXNpYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2VjdXJpdHkgaXNzdWVzLCBzbyByZWFkIHRoZSB3aG9sZSB0aGluZyBpbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHByb2ZpbGVfbGVuZ3RoIC0gKHNpemVvZiBwcm9maWxlX2hlYWRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTIgKiB0YWdfY291bnQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKXBuZ19pbmZsYXRlX3JlYWQocG5nX3B0ciwgbG9jYWxfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZiBsb2NhbF9idWZmZXIpLCAmbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSArIChzaXplb2YgcHJvZmlsZV9oZWFkZXIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyICogdGFnX2NvdW50LCAmc2l6ZSwgMS8qZmluaXNoKi8pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID4gMCAmJiAhKHBuZ19wdHItPmZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19GTEFHX0JFTklHTl9FUlJPUlNfV0FSTikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJtc2cgPSAiZXh0cmEgY29tcHJlc3NlZCBkYXRhIjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQnV0IG90aGVyd2lzZSBhbGxvdyBleHRyYSBkYXRhOiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGNhbiBiZSBoYW5kbGVkIGNvbXBsZXRlbHksIHNvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBrZWVwIGdvaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY2h1bmtfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4dHJhIGNvbXByZXNzZWQgZGF0YSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSAxOworCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmRlZiBQTkdfc1JHQl9TVVBQT1JURUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGZvciBhIG1hdGNoIGFnYWluc3Qgc1JHQiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2ljY19zZXRfc1JHQihwbmdfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBuZ19wdHItPmNvbG9yc3BhY2UsIHByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLmFkbGVyKTsKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0ZWFsIHRoZSBwcm9maWxlIGZvciBpbmZvX3B0ci4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvX3B0ciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19GUkVFX0lDQ1AsIDApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0ci0+aWNjcF9uYW1lID0gcG5nX3ZvaWRjYXN0KGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX21hbGxvY19iYXNlKHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkX2xlbmd0aCsxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mb19wdHItPmljY3BfbmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGluZm9fcHRyLT5pY2NwX25hbWUsIGtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkX2xlbmd0aCsxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyLT5pY2NwX3Byb2ZsZW4gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9sZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0ci0+aWNjcF9wcm9maWxlID0gcHJvZmlsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnJlYWRfYnVmZmVyID0gTlVMTDsgLypzdGVhbCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0ci0+ZnJlZV9tZSB8PSBQTkdfRlJFRV9JQ0NQOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX2lDQ1A7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmNvbG9yc3BhY2UuZmxhZ3MgfD0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUlNQQUNFX0lOVkFMSUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJtc2cgPSAib3V0IG9mIG1lbW9yeSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsc2UgdGhlIHByb2ZpbGUgcmVtYWlucyBpbiB0aGUgcmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYnVmZmVyIHdoaWNoIGdldHMgcmV1c2VkIGZvciBzdWJzZXF1ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjaHVua3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm9fcHRyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29sb3JzcGFjZV9zeW5jKHBuZ19wdHIsIGluZm9fcHRyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm1zZyA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+em93bmVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJtc2cgPSAidHJ1bmNhdGVkIjsKKworI2lmbmRlZiBfX0NPVkVSSVRZX18KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm1zZyA9IHBuZ19wdHItPnpzdHJlYW0ubXNnOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsc2UgcG5nX2ljY19jaGVja190YWdfdGFibGUgb3V0cHV0IGFuIGVycm9yICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgLyogcHJvZmlsZSB0cnVuY2F0ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm1zZyA9IHBuZ19wdHItPnpzdHJlYW0ubXNnOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJtc2cgPSAib3V0IG9mIG1lbW9yeSI7CisgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgIC8qIGVsc2UgcG5nX2ljY19jaGVja19oZWFkZXIgb3V0cHV0IGFuIGVycm9yICovCisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIC8qIGVsc2UgcG5nX2ljY19jaGVja19sZW5ndGggb3V0cHV0IGFuIGVycm9yICovCisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGVsc2UgLyogcHJvZmlsZSB0cnVuY2F0ZWQgKi8KKyAgICAgICAgICAgICAgICAgIGVycm1zZyA9IHBuZ19wdHItPnpzdHJlYW0ubXNnOworCisgICAgICAgICAgICAgICAvKiBSZWxlYXNlIHRoZSBzdHJlYW0gKi8KKyAgICAgICAgICAgICAgIHBuZ19wdHItPnpvd25lciA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsc2UgLyogcG5nX2luZmxhdGVfY2xhaW0gZmFpbGVkICovCisgICAgICAgICAgICAgICBlcnJtc2cgPSBwbmdfcHRyLT56c3RyZWFtLm1zZzsKKyAgICAgICAgIH0KKworICAgICAgICAgZWxzZQorICAgICAgICAgICAgZXJybXNnID0gImJhZCBjb21wcmVzc2lvbiBtZXRob2QiOyAvKiBvciBtaXNzaW5nICovCisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgICAgIGVycm1zZyA9ICJiYWQga2V5d29yZCI7CisgICB9CisKKyAgIGVsc2UKKyAgICAgIGVycm1zZyA9ICJ0b28gbWFueSBwcm9maWxlcyI7CisKKyAgIC8qIEZhaWx1cmU6IHRoZSByZWFzb24gaXMgaW4gJ2Vycm1zZycgKi8KKyAgIGlmIChmaW5pc2hlZCA9PSAwKQorICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKworICAgcG5nX3B0ci0+Y29sb3JzcGFjZS5mbGFncyB8PSBQTkdfQ09MT1JTUEFDRV9JTlZBTElEOworICAgcG5nX2NvbG9yc3BhY2Vfc3luYyhwbmdfcHRyLCBpbmZvX3B0cik7CisgICBpZiAoZXJybXNnICE9IE5VTEwpIC8qIGVsc2UgYWxyZWFkeSBvdXRwdXQgKi8KKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgZXJybXNnKTsKK30KKyNlbmRpZiAvKiBSRUFEX2lDQ1AgKi8KKworI2lmZGVmIFBOR19SRUFEX3NQTFRfU1VQUE9SVEVECit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19oYW5kbGVfc1BMVChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQorLyogTm90ZTogdGhpcyBkb2VzIG5vdCBwcm9wZXJseSBoYW5kbGUgY2h1bmtzIHRoYXQgYXJlID4gNjRLIHVuZGVyIERPUyAqLworeworICAgcG5nX2J5dGVwIGVudHJ5X3N0YXJ0LCBidWZmZXI7CisgICBwbmdfc1BMVF90IG5ld19wYWxldHRlOworICAgcG5nX3NQTFRfZW50cnlwIHBwOworICAgcG5nX3VpbnRfMzIgZGF0YV9sZW5ndGg7CisgICBpbnQgZW50cnlfc2l6ZSwgaTsKKyAgIHBuZ191aW50XzMyIHNraXAgPSAwOworICAgcG5nX3VpbnRfMzIgZGw7CisgICBwbmdfc2l6ZV90IG1heF9kbDsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX3NQTFQiKTsKKworI2lmZGVmIFBOR19VU0VSX0xJTUlUU19TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT51c2VyX2NodW5rX2NhY2hlX21heCAhPSAwKQorICAgeworICAgICAgaWYgKHBuZ19wdHItPnVzZXJfY2h1bmtfY2FjaGVfbWF4ID09IDEpCisgICAgICB7CisgICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAoLS1wbmdfcHRyLT51c2VyX2NodW5rX2NhY2hlX21heCA9PSAxKQorICAgICAgeworICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk5vIHNwYWNlIGluIGNodW5rIGNhY2hlIGZvciBzUExUIik7CisgICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgfQorI2VuZGlmCisKKyAgIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpID09IDApCisgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgIm1pc3NpbmcgSUhEUiIpOworCisgICBlbHNlIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpICE9IDApCisgICB7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAib3V0IG9mIHBsYWNlIik7CisgICAgICByZXR1cm47CisgICB9CisKKyNpZmRlZiBQTkdfTUFYX01BTExPQ182NEsKKyAgIGlmIChsZW5ndGggPiA2NTUzNVUpCisgICB7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAidG9vIGxhcmdlIHRvIGZpdCBpbiBtZW1vcnkiKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKyNlbmRpZgorCisgICBidWZmZXIgPSBwbmdfcmVhZF9idWZmZXIocG5nX3B0ciwgbGVuZ3RoKzEsIDIvKnNpbGVudCovKTsKKyAgIGlmIChidWZmZXIgPT0gTlVMTCkKKyAgIHsKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJvdXQgb2YgbWVtb3J5Iik7CisgICAgICByZXR1cm47CisgICB9CisKKworICAgLyogV0FSTklORzogdGhpcyBtYXkgYnJlYWsgaWYgc2l6ZV90IGlzIGxlc3MgdGhhbiAzMiBiaXRzOyBpdCBpcyBhc3N1bWVkCisgICAgKiB0aGF0IHRoZSBQTkdfTUFYX01BTExPQ182NEsgdGVzdCBpcyBlbmFibGVkIGluIHRoaXMgY2FzZSwgYnV0IHRoaXMgaXMgYQorICAgICogcG90ZW50aWFsIGJyZWFrYWdlIHBvaW50IGlmIHRoZSB0eXBlcyBpbiBwbmdjb25mLmggYXJlbid0IGV4YWN0bHkgcmlnaHQuCisgICAgKi8KKyAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBidWZmZXIsIGxlbmd0aCk7CisKKyAgIGlmIChwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBza2lwKSAhPSAwKQorICAgICAgcmV0dXJuOworCisgICBidWZmZXJbbGVuZ3RoXSA9IDA7CisKKyAgIGZvciAoZW50cnlfc3RhcnQgPSBidWZmZXI7ICplbnRyeV9zdGFydDsgZW50cnlfc3RhcnQrKykKKyAgICAgIC8qIEVtcHR5IGxvb3AgdG8gZmluZCBlbmQgb2YgbmFtZSAqLyA7CisKKyAgICsrZW50cnlfc3RhcnQ7CisKKyAgIC8qIEEgc2FtcGxlIGRlcHRoIHNob3VsZCBmb2xsb3cgdGhlIHNlcGFyYXRvciwgYW5kIHdlIHNob3VsZCBiZSBvbiBpdCAgKi8KKyAgIGlmIChsZW5ndGggPCAyVSB8fCBlbnRyeV9zdGFydCA+IGJ1ZmZlciArIChsZW5ndGggLSAyVSkpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAibWFsZm9ybWVkIHNQTFQgY2h1bmsiKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgbmV3X3BhbGV0dGUuZGVwdGggPSAqZW50cnlfc3RhcnQrKzsKKyAgIGVudHJ5X3NpemUgPSAobmV3X3BhbGV0dGUuZGVwdGggPT0gOCA/IDYgOiAxMCk7CisgICAvKiBUaGlzIG11c3QgZml0IGluIGEgcG5nX3VpbnRfMzIgYmVjYXVzZSBpdCBpcyBkZXJpdmVkIGZyb20gdGhlIG9yaWdpbmFsCisgICAgKiBjaHVuayBkYXRhIGxlbmd0aC4KKyAgICAqLworICAgZGF0YV9sZW5ndGggPSBsZW5ndGggLSAocG5nX3VpbnRfMzIpKGVudHJ5X3N0YXJ0IC0gYnVmZmVyKTsKKworICAgLyogSW50ZWdyaXR5LWNoZWNrIHRoZSBkYXRhIGxlbmd0aCAqLworICAgaWYgKChkYXRhX2xlbmd0aCAlIGVudHJ5X3NpemUpICE9IDApCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAic1BMVCBjaHVuayBoYXMgYmFkIGxlbmd0aCIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBkbCA9IChwbmdfaW50XzMyKShkYXRhX2xlbmd0aCAvIGVudHJ5X3NpemUpOworICAgbWF4X2RsID0gUE5HX1NJWkVfTUFYIC8gKHNpemVvZiAocG5nX3NQTFRfZW50cnkpKTsKKworICAgaWYgKGRsID4gbWF4X2RsKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgInNQTFQgY2h1bmsgdG9vIGxvbmciKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgbmV3X3BhbGV0dGUubmVudHJpZXMgPSAocG5nX2ludF8zMikoZGF0YV9sZW5ndGggLyBlbnRyeV9zaXplKTsKKworICAgbmV3X3BhbGV0dGUuZW50cmllcyA9IChwbmdfc1BMVF9lbnRyeXApcG5nX21hbGxvY193YXJuKAorICAgICAgIHBuZ19wdHIsIG5ld19wYWxldHRlLm5lbnRyaWVzICogKHNpemVvZiAocG5nX3NQTFRfZW50cnkpKSk7CisKKyAgIGlmIChuZXdfcGFsZXR0ZS5lbnRyaWVzID09IE5VTEwpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAic1BMVCBjaHVuayByZXF1aXJlcyB0b28gbXVjaCBtZW1vcnkiKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworI2lmZGVmIFBOR19QT0lOVEVSX0lOREVYSU5HX1NVUFBPUlRFRAorICAgZm9yIChpID0gMDsgaSA8IG5ld19wYWxldHRlLm5lbnRyaWVzOyBpKyspCisgICB7CisgICAgICBwcCA9IG5ld19wYWxldHRlLmVudHJpZXMgKyBpOworCisgICAgICBpZiAobmV3X3BhbGV0dGUuZGVwdGggPT0gOCkKKyAgICAgIHsKKyAgICAgICAgIHBwLT5yZWQgPSAqZW50cnlfc3RhcnQrKzsKKyAgICAgICAgIHBwLT5ncmVlbiA9ICplbnRyeV9zdGFydCsrOworICAgICAgICAgcHAtPmJsdWUgPSAqZW50cnlfc3RhcnQrKzsKKyAgICAgICAgIHBwLT5hbHBoYSA9ICplbnRyeV9zdGFydCsrOworICAgICAgfQorCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBwcC0+cmVkICAgPSBwbmdfZ2V0X3VpbnRfMTYoZW50cnlfc3RhcnQpOyBlbnRyeV9zdGFydCArPSAyOworICAgICAgICAgcHAtPmdyZWVuID0gcG5nX2dldF91aW50XzE2KGVudHJ5X3N0YXJ0KTsgZW50cnlfc3RhcnQgKz0gMjsKKyAgICAgICAgIHBwLT5ibHVlICA9IHBuZ19nZXRfdWludF8xNihlbnRyeV9zdGFydCk7IGVudHJ5X3N0YXJ0ICs9IDI7CisgICAgICAgICBwcC0+YWxwaGEgPSBwbmdfZ2V0X3VpbnRfMTYoZW50cnlfc3RhcnQpOyBlbnRyeV9zdGFydCArPSAyOworICAgICAgfQorCisgICAgICBwcC0+ZnJlcXVlbmN5ID0gcG5nX2dldF91aW50XzE2KGVudHJ5X3N0YXJ0KTsgZW50cnlfc3RhcnQgKz0gMjsKKyAgIH0KKyNlbHNlCisgICBwcCA9IG5ld19wYWxldHRlLmVudHJpZXM7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBuZXdfcGFsZXR0ZS5uZW50cmllczsgaSsrKQorICAgeworCisgICAgICBpZiAobmV3X3BhbGV0dGUuZGVwdGggPT0gOCkKKyAgICAgIHsKKyAgICAgICAgIHBwW2ldLnJlZCAgID0gKmVudHJ5X3N0YXJ0Kys7CisgICAgICAgICBwcFtpXS5ncmVlbiA9ICplbnRyeV9zdGFydCsrOworICAgICAgICAgcHBbaV0uYmx1ZSAgPSAqZW50cnlfc3RhcnQrKzsKKyAgICAgICAgIHBwW2ldLmFscGhhID0gKmVudHJ5X3N0YXJ0Kys7CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHBwW2ldLnJlZCAgID0gcG5nX2dldF91aW50XzE2KGVudHJ5X3N0YXJ0KTsgZW50cnlfc3RhcnQgKz0gMjsKKyAgICAgICAgIHBwW2ldLmdyZWVuID0gcG5nX2dldF91aW50XzE2KGVudHJ5X3N0YXJ0KTsgZW50cnlfc3RhcnQgKz0gMjsKKyAgICAgICAgIHBwW2ldLmJsdWUgID0gcG5nX2dldF91aW50XzE2KGVudHJ5X3N0YXJ0KTsgZW50cnlfc3RhcnQgKz0gMjsKKyAgICAgICAgIHBwW2ldLmFscGhhID0gcG5nX2dldF91aW50XzE2KGVudHJ5X3N0YXJ0KTsgZW50cnlfc3RhcnQgKz0gMjsKKyAgICAgIH0KKworICAgICAgcHBbaV0uZnJlcXVlbmN5ID0gcG5nX2dldF91aW50XzE2KGVudHJ5X3N0YXJ0KTsgZW50cnlfc3RhcnQgKz0gMjsKKyAgIH0KKyNlbmRpZgorCisgICAvKiBEaXNjYXJkIGFsbCBjaHVuayBkYXRhIGV4Y2VwdCB0aGUgbmFtZSBhbmQgc3Rhc2ggdGhhdCAqLworICAgbmV3X3BhbGV0dGUubmFtZSA9IChwbmdfY2hhcnApYnVmZmVyOworCisgICBwbmdfc2V0X3NQTFQocG5nX3B0ciwgaW5mb19wdHIsICZuZXdfcGFsZXR0ZSwgMSk7CisKKyAgIHBuZ19mcmVlKHBuZ19wdHIsIG5ld19wYWxldHRlLmVudHJpZXMpOworfQorI2VuZGlmIC8qIFJFQURfc1BMVCAqLworCisjaWZkZWYgUE5HX1JFQURfdFJOU19TVVBQT1JURUQKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2hhbmRsZV90Uk5TKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpCit7CisgICBwbmdfYnl0ZSByZWFkYnVmW1BOR19NQVhfUEFMRVRURV9MRU5HVEhdOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfdFJOUyIpOworCisgICBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSA9PSAwKQorICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJtaXNzaW5nIElIRFIiKTsKKworICAgZWxzZSBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKSAhPSAwKQorICAgeworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIm91dCBvZiBwbGFjZSIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBlbHNlIGlmIChpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT190Uk5TKSAhPSAwKQorICAgeworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImR1cGxpY2F0ZSIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQorICAgeworICAgICAgcG5nX2J5dGUgYnVmWzJdOworCisgICAgICBpZiAobGVuZ3RoICE9IDIpCisgICAgICB7CisgICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiaW52YWxpZCIpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmLCAyKTsKKyAgICAgIHBuZ19wdHItPm51bV90cmFucyA9IDE7CisgICAgICBwbmdfcHRyLT50cmFuc19jb2xvci5ncmF5ID0gcG5nX2dldF91aW50XzE2KGJ1Zik7CisgICB9CisKKyAgIGVsc2UgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQorICAgeworICAgICAgcG5nX2J5dGUgYnVmWzZdOworCisgICAgICBpZiAobGVuZ3RoICE9IDYpCisgICAgICB7CisgICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiaW52YWxpZCIpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmLCBsZW5ndGgpOworICAgICAgcG5nX3B0ci0+bnVtX3RyYW5zID0gMTsKKyAgICAgIHBuZ19wdHItPnRyYW5zX2NvbG9yLnJlZCA9IHBuZ19nZXRfdWludF8xNihidWYpOworICAgICAgcG5nX3B0ci0+dHJhbnNfY29sb3IuZ3JlZW4gPSBwbmdfZ2V0X3VpbnRfMTYoYnVmICsgMik7CisgICAgICBwbmdfcHRyLT50cmFuc19jb2xvci5ibHVlID0gcG5nX2dldF91aW50XzE2KGJ1ZiArIDQpOworICAgfQorCisgICBlbHNlIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCisgICB7CisgICAgICBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9QTFRFKSA9PSAwKQorICAgICAgeworICAgICAgICAgLyogVE9ETzogaXMgdGhpcyBhY3R1YWxseSBhbiBlcnJvciBpbiB0aGUgSVNPIHNwZWM/ICovCisgICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAib3V0IG9mIHBsYWNlIik7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmIChsZW5ndGggPiAodW5zaWduZWQgaW50KSBwbmdfcHRyLT5udW1fcGFsZXR0ZSB8fAorICAgICAgICAgbGVuZ3RoID4gKHVuc2lnbmVkIGludCkgUE5HX01BWF9QQUxFVFRFX0xFTkdUSCB8fAorICAgICAgICAgbGVuZ3RoID09IDApCisgICAgICB7CisgICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiaW52YWxpZCIpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgcmVhZGJ1ZiwgbGVuZ3RoKTsKKyAgICAgIHBuZ19wdHItPm51bV90cmFucyA9IChwbmdfdWludF8xNilsZW5ndGg7CisgICB9CisKKyAgIGVsc2UKKyAgIHsKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJpbnZhbGlkIHdpdGggYWxwaGEgY2hhbm5lbCIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiAocG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCkgIT0gMCkKKyAgIHsKKyAgICAgIHBuZ19wdHItPm51bV90cmFucyA9IDA7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8qIFRPRE86IHRoaXMgaXMgYSBob3JyaWJsZSBzaWRlIGVmZmVjdCBpbiB0aGUgcGFsZXR0ZSBjYXNlIGJlY2F1c2UgdGhlCisgICAgKiBwbmdfc3RydWN0IGVuZHMgdXAgd2l0aCBhIHBvaW50ZXIgdG8gdGhlIHRSTlMgYnVmZmVyIG93bmVkIGJ5IHRoZQorICAgICogcG5nX2luZm8uICBGaXggdGhpcy4KKyAgICAqLworICAgcG5nX3NldF90Uk5TKHBuZ19wdHIsIGluZm9fcHRyLCByZWFkYnVmLCBwbmdfcHRyLT5udW1fdHJhbnMsCisgICAgICAgJihwbmdfcHRyLT50cmFuc19jb2xvcikpOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9iS0dEX1NVUFBPUlRFRAordm9pZCAvKiBQUklWQVRFICovCitwbmdfaGFuZGxlX2JLR0QocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKK3sKKyAgIHVuc2lnbmVkIGludCB0cnVlbGVuOworICAgcG5nX2J5dGUgYnVmWzZdOworICAgcG5nX2NvbG9yXzE2IGJhY2tncm91bmQ7CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9iS0dEIik7CisKKyAgIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpID09IDApCisgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgIm1pc3NpbmcgSUhEUiIpOworCisgICBlbHNlIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpICE9IDAgfHwKKyAgICAgICAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFICYmCisgICAgICAgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9QTFRFKSA9PSAwKSkKKyAgIHsKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJvdXQgb2YgcGxhY2UiKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgZWxzZSBpZiAoaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fYktHRCkgIT0gMCkKKyAgIHsKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJkdXBsaWNhdGUiKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgICAgIHRydWVsZW4gPSAxOworCisgICBlbHNlIGlmICgocG5nX3B0ci0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKSAhPSAwKQorICAgICAgdHJ1ZWxlbiA9IDY7CisKKyAgIGVsc2UKKyAgICAgIHRydWVsZW4gPSAyOworCisgICBpZiAobGVuZ3RoICE9IHRydWVsZW4pCisgICB7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiaW52YWxpZCIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmLCB0cnVlbGVuKTsKKworICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApICE9IDApCisgICAgICByZXR1cm47CisKKyAgIC8qIFdlIGNvbnZlcnQgdGhlIGluZGV4IHZhbHVlIGludG8gUkdCIGNvbXBvbmVudHMgc28gdGhhdCB3ZSBjYW4gYWxsb3cKKyAgICAqIGFyYml0cmFyeSBSR0IgdmFsdWVzIGZvciBiYWNrZ3JvdW5kIHdoZW4gd2UgaGF2ZSB0cmFuc3BhcmVuY3ksIGFuZAorICAgICogc28gaXQgaXMgZWFzeSB0byBkZXRlcm1pbmUgdGhlIFJHQiB2YWx1ZXMgb2YgdGhlIGJhY2tncm91bmQgY29sb3IKKyAgICAqIGZyb20gdGhlIGluZm9fcHRyIHN0cnVjdC4KKyAgICAqLworICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgIHsKKyAgICAgIGJhY2tncm91bmQuaW5kZXggPSBidWZbMF07CisKKyAgICAgIGlmIChpbmZvX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyLT5udW1fcGFsZXR0ZSAhPSAwKQorICAgICAgeworICAgICAgICAgaWYgKGJ1ZlswXSA+PSBpbmZvX3B0ci0+bnVtX3BhbGV0dGUpCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJpbnZhbGlkIGluZGV4Iik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICB9CisKKyAgICAgICAgIGJhY2tncm91bmQucmVkID0gKHBuZ191aW50XzE2KXBuZ19wdHItPnBhbGV0dGVbYnVmWzBdXS5yZWQ7CisgICAgICAgICBiYWNrZ3JvdW5kLmdyZWVuID0gKHBuZ191aW50XzE2KXBuZ19wdHItPnBhbGV0dGVbYnVmWzBdXS5ncmVlbjsKKyAgICAgICAgIGJhY2tncm91bmQuYmx1ZSA9IChwbmdfdWludF8xNilwbmdfcHRyLT5wYWxldHRlW2J1ZlswXV0uYmx1ZTsKKyAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgICAgYmFja2dyb3VuZC5yZWQgPSBiYWNrZ3JvdW5kLmdyZWVuID0gYmFja2dyb3VuZC5ibHVlID0gMDsKKworICAgICAgYmFja2dyb3VuZC5ncmF5ID0gMDsKKyAgIH0KKworICAgZWxzZSBpZiAoKHBuZ19wdHItPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikgPT0gMCkgLyogR1JBWSAqLworICAgeworICAgICAgYmFja2dyb3VuZC5pbmRleCA9IDA7CisgICAgICBiYWNrZ3JvdW5kLnJlZCA9CisgICAgICBiYWNrZ3JvdW5kLmdyZWVuID0KKyAgICAgIGJhY2tncm91bmQuYmx1ZSA9CisgICAgICBiYWNrZ3JvdW5kLmdyYXkgPSBwbmdfZ2V0X3VpbnRfMTYoYnVmKTsKKyAgIH0KKworICAgZWxzZQorICAgeworICAgICAgYmFja2dyb3VuZC5pbmRleCA9IDA7CisgICAgICBiYWNrZ3JvdW5kLnJlZCA9IHBuZ19nZXRfdWludF8xNihidWYpOworICAgICAgYmFja2dyb3VuZC5ncmVlbiA9IHBuZ19nZXRfdWludF8xNihidWYgKyAyKTsKKyAgICAgIGJhY2tncm91bmQuYmx1ZSA9IHBuZ19nZXRfdWludF8xNihidWYgKyA0KTsKKyAgICAgIGJhY2tncm91bmQuZ3JheSA9IDA7CisgICB9CisKKyAgIHBuZ19zZXRfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgJmJhY2tncm91bmQpOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9oSVNUX1NVUFBPUlRFRAordm9pZCAvKiBQUklWQVRFICovCitwbmdfaGFuZGxlX2hJU1QocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKK3sKKyAgIHVuc2lnbmVkIGludCBudW0sIGk7CisgICBwbmdfdWludF8xNiByZWFkYnVmW1BOR19NQVhfUEFMRVRURV9MRU5HVEhdOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfaElTVCIpOworCisgICBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSA9PSAwKQorICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJtaXNzaW5nIElIRFIiKTsKKworICAgZWxzZSBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKSAhPSAwIHx8CisgICAgICAgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9QTFRFKSA9PSAwKQorICAgeworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIm91dCBvZiBwbGFjZSIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBlbHNlIGlmIChpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19oSVNUKSAhPSAwKQorICAgeworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImR1cGxpY2F0ZSIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBudW0gPSBsZW5ndGggLyAyIDsKKworICAgaWYgKG51bSAhPSAodW5zaWduZWQgaW50KSBwbmdfcHRyLT5udW1fcGFsZXR0ZSB8fAorICAgICAgIG51bSA+ICh1bnNpZ25lZCBpbnQpIFBOR19NQVhfUEFMRVRURV9MRU5HVEgpCisgICB7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiaW52YWxpZCIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCisgICB7CisgICAgICBwbmdfYnl0ZSBidWZbMl07CisKKyAgICAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBidWYsIDIpOworICAgICAgcmVhZGJ1ZltpXSA9IHBuZ19nZXRfdWludF8xNihidWYpOworICAgfQorCisgICBpZiAocG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCkgIT0gMCkKKyAgICAgIHJldHVybjsKKworICAgcG5nX3NldF9oSVNUKHBuZ19wdHIsIGluZm9fcHRyLCByZWFkYnVmKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfcEhZc19TVVBQT1JURUQKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2hhbmRsZV9wSFlzKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpCit7CisgICBwbmdfYnl0ZSBidWZbOV07CisgICBwbmdfdWludF8zMiByZXNfeCwgcmVzX3k7CisgICBpbnQgdW5pdF90eXBlOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfcEhZcyIpOworCisgICBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSA9PSAwKQorICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJtaXNzaW5nIElIRFIiKTsKKworICAgZWxzZSBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKSAhPSAwKQorICAgeworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIm91dCBvZiBwbGFjZSIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBlbHNlIGlmIChpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19wSFlzKSAhPSAwKQorICAgeworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImR1cGxpY2F0ZSIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiAobGVuZ3RoICE9IDkpCisgICB7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiaW52YWxpZCIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmLCA5KTsKKworICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApICE9IDApCisgICAgICByZXR1cm47CisKKyAgIHJlc194ID0gcG5nX2dldF91aW50XzMyKGJ1Zik7CisgICByZXNfeSA9IHBuZ19nZXRfdWludF8zMihidWYgKyA0KTsKKyAgIHVuaXRfdHlwZSA9IGJ1Zls4XTsKKyAgIHBuZ19zZXRfcEhZcyhwbmdfcHRyLCBpbmZvX3B0ciwgcmVzX3gsIHJlc195LCB1bml0X3R5cGUpOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9vRkZzX1NVUFBPUlRFRAordm9pZCAvKiBQUklWQVRFICovCitwbmdfaGFuZGxlX29GRnMocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKK3sKKyAgIHBuZ19ieXRlIGJ1Zls5XTsKKyAgIHBuZ19pbnRfMzIgb2Zmc2V0X3gsIG9mZnNldF95OworICAgaW50IHVuaXRfdHlwZTsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX29GRnMiKTsKKworICAgaWYgKChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikgPT0gMCkKKyAgICAgIHBuZ19jaHVua19lcnJvcihwbmdfcHRyLCAibWlzc2luZyBJSERSIik7CisKKyAgIGVsc2UgaWYgKChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkgIT0gMCkKKyAgIHsKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJvdXQgb2YgcGxhY2UiKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgZWxzZSBpZiAoaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fb0ZGcykgIT0gMCkKKyAgIHsKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJkdXBsaWNhdGUiKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgaWYgKGxlbmd0aCAhPSA5KQorICAgeworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImludmFsaWQiKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZiwgOSk7CisKKyAgIGlmIChwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKSAhPSAwKQorICAgICAgcmV0dXJuOworCisgICBvZmZzZXRfeCA9IHBuZ19nZXRfaW50XzMyKGJ1Zik7CisgICBvZmZzZXRfeSA9IHBuZ19nZXRfaW50XzMyKGJ1ZiArIDQpOworICAgdW5pdF90eXBlID0gYnVmWzhdOworICAgcG5nX3NldF9vRkZzKHBuZ19wdHIsIGluZm9fcHRyLCBvZmZzZXRfeCwgb2Zmc2V0X3ksIHVuaXRfdHlwZSk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX3BDQUxfU1VQUE9SVEVECisvKiBSZWFkIHRoZSBwQ0FMIGNodW5rIChkZXNjcmliZWQgaW4gdGhlIFBORyBFeHRlbnNpb25zIGRvY3VtZW50KSAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfaGFuZGxlX3BDQUwocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKK3sKKyAgIHBuZ19pbnRfMzIgWDAsIFgxOworICAgcG5nX2J5dGUgdHlwZSwgbnBhcmFtczsKKyAgIHBuZ19ieXRlcCBidWZmZXIsIGJ1ZiwgdW5pdHMsIGVuZHB0cjsKKyAgIHBuZ19jaGFycHAgcGFyYW1zOworICAgaW50IGk7CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9wQ0FMIik7CisKKyAgIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpID09IDApCisgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgIm1pc3NpbmcgSUhEUiIpOworCisgICBlbHNlIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpICE9IDApCisgICB7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAib3V0IG9mIHBsYWNlIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGVsc2UgaWYgKGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3BDQUwpICE9IDApCisgICB7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiZHVwbGljYXRlIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIHBuZ19kZWJ1ZzEoMiwgIkFsbG9jYXRpbmcgYW5kIHJlYWRpbmcgcENBTCBjaHVuayBkYXRhICgldSBieXRlcykiLAorICAgICAgIGxlbmd0aCArIDEpOworCisgICBidWZmZXIgPSBwbmdfcmVhZF9idWZmZXIocG5nX3B0ciwgbGVuZ3RoKzEsIDIvKnNpbGVudCovKTsKKworICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQorICAgeworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIm91dCBvZiBtZW1vcnkiKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZmZlciwgbGVuZ3RoKTsKKworICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApICE9IDApCisgICAgICByZXR1cm47CisKKyAgIGJ1ZmZlcltsZW5ndGhdID0gMDsgLyogTnVsbCB0ZXJtaW5hdGUgdGhlIGxhc3Qgc3RyaW5nICovCisKKyAgIHBuZ19kZWJ1ZygzLCAiRmluZGluZyBlbmQgb2YgcENBTCBwdXJwb3NlIHN0cmluZyIpOworICAgZm9yIChidWYgPSBidWZmZXI7ICpidWY7IGJ1ZisrKQorICAgICAgLyogRW1wdHkgbG9vcCAqLyA7CisKKyAgIGVuZHB0ciA9IGJ1ZmZlciArIGxlbmd0aDsKKworICAgLyogV2UgbmVlZCB0byBoYXZlIGF0IGxlYXN0IDEyIGJ5dGVzIGFmdGVyIHRoZSBwdXJwb3NlIHN0cmluZworICAgICogaW4gb3JkZXIgdG8gZ2V0IHRoZSBwYXJhbWV0ZXIgaW5mb3JtYXRpb24uCisgICAgKi8KKyAgIGlmIChlbmRwdHIgLSBidWYgPD0gMTIpCisgICB7CisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJpbnZhbGlkIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIHBuZ19kZWJ1ZygzLCAiUmVhZGluZyBwQ0FMIFgwLCBYMSwgdHlwZSwgbnBhcmFtcywgYW5kIHVuaXRzIik7CisgICBYMCA9IHBuZ19nZXRfaW50XzMyKChwbmdfYnl0ZXApYnVmKzEpOworICAgWDEgPSBwbmdfZ2V0X2ludF8zMigocG5nX2J5dGVwKWJ1Zis1KTsKKyAgIHR5cGUgPSBidWZbOV07CisgICBucGFyYW1zID0gYnVmWzEwXTsKKyAgIHVuaXRzID0gYnVmICsgMTE7CisKKyAgIHBuZ19kZWJ1ZygzLCAiQ2hlY2tpbmcgcENBTCBlcXVhdGlvbiB0eXBlIGFuZCBudW1iZXIgb2YgcGFyYW1ldGVycyIpOworICAgLyogQ2hlY2sgdGhhdCB3ZSBoYXZlIHRoZSByaWdodCBudW1iZXIgb2YgcGFyYW1ldGVycyBmb3Iga25vd24KKyAgICAqIGVxdWF0aW9uIHR5cGVzLgorICAgICovCisgICBpZiAoKHR5cGUgPT0gUE5HX0VRVUFUSU9OX0xJTkVBUiAmJiBucGFyYW1zICE9IDIpIHx8CisgICAgICAgKHR5cGUgPT0gUE5HX0VRVUFUSU9OX0JBU0VfRSAmJiBucGFyYW1zICE9IDMpIHx8CisgICAgICAgKHR5cGUgPT0gUE5HX0VRVUFUSU9OX0FSQklUUkFSWSAmJiBucGFyYW1zICE9IDMpIHx8CisgICAgICAgKHR5cGUgPT0gUE5HX0VRVUFUSU9OX0hZUEVSQk9MSUMgJiYgbnBhcmFtcyAhPSA0KSkKKyAgIHsKKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImludmFsaWQgcGFyYW1ldGVyIGNvdW50Iik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGVsc2UgaWYgKHR5cGUgPj0gUE5HX0VRVUFUSU9OX0xBU1QpCisgICB7CisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJ1bnJlY29nbml6ZWQgZXF1YXRpb24gdHlwZSIpOworICAgfQorCisgICBmb3IgKGJ1ZiA9IHVuaXRzOyAqYnVmOyBidWYrKykKKyAgICAgIC8qIEVtcHR5IGxvb3AgdG8gbW92ZSBwYXN0IHRoZSB1bml0cyBzdHJpbmcuICovIDsKKworICAgcG5nX2RlYnVnKDMsICJBbGxvY2F0aW5nIHBDQUwgcGFyYW1ldGVycyBhcnJheSIpOworCisgICBwYXJhbXMgPSBwbmdfdm9pZGNhc3QocG5nX2NoYXJwcCwgcG5nX21hbGxvY193YXJuKHBuZ19wdHIsCisgICAgICAgbnBhcmFtcyAqIChzaXplb2YgKHBuZ19jaGFycCkpKSk7CisKKyAgIGlmIChwYXJhbXMgPT0gTlVMTCkKKyAgIHsKKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIm91dCBvZiBtZW1vcnkiKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgLyogR2V0IHBvaW50ZXJzIHRvIHRoZSBzdGFydCBvZiBlYWNoIHBhcmFtZXRlciBzdHJpbmcuICovCisgICBmb3IgKGkgPSAwOyBpIDwgbnBhcmFtczsgaSsrKQorICAgeworICAgICAgYnVmKys7IC8qIFNraXAgdGhlIG51bGwgc3RyaW5nIHRlcm1pbmF0b3IgZnJvbSBwcmV2aW91cyBwYXJhbWV0ZXIuICovCisKKyAgICAgIHBuZ19kZWJ1ZzEoMywgIlJlYWRpbmcgcENBTCBwYXJhbWV0ZXIgJWQiLCBpKTsKKworICAgICAgZm9yIChwYXJhbXNbaV0gPSAocG5nX2NoYXJwKWJ1ZjsgYnVmIDw9IGVuZHB0ciAmJiAqYnVmICE9IDA7IGJ1ZisrKQorICAgICAgICAgLyogRW1wdHkgbG9vcCB0byBtb3ZlIHBhc3QgZWFjaCBwYXJhbWV0ZXIgc3RyaW5nICovIDsKKworICAgICAgLyogTWFrZSBzdXJlIHdlIGhhdmVuJ3QgcnVuIG91dCBvZiBkYXRhIHlldCAqLworICAgICAgaWYgKGJ1ZiA+IGVuZHB0cikKKyAgICAgIHsKKyAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBhcmFtcyk7CisgICAgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJpbnZhbGlkIGRhdGEiKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgIH0KKworICAgcG5nX3NldF9wQ0FMKHBuZ19wdHIsIGluZm9fcHRyLCAocG5nX2NoYXJwKWJ1ZmZlciwgWDAsIFgxLCB0eXBlLCBucGFyYW1zLAorICAgICAgKHBuZ19jaGFycCl1bml0cywgcGFyYW1zKTsKKworICAgcG5nX2ZyZWUocG5nX3B0ciwgcGFyYW1zKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfc0NBTF9TVVBQT1JURUQKKy8qIFJlYWQgdGhlIHNDQUwgY2h1bmsgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2hhbmRsZV9zQ0FMKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpCit7CisgICBwbmdfYnl0ZXAgYnVmZmVyOworICAgcG5nX3NpemVfdCBpOworICAgaW50IHN0YXRlOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfc0NBTCIpOworCisgICBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSA9PSAwKQorICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJtaXNzaW5nIElIRFIiKTsKKworICAgZWxzZSBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKSAhPSAwKQorICAgeworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIm91dCBvZiBwbGFjZSIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBlbHNlIGlmIChpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19zQ0FMKSAhPSAwKQorICAgeworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImR1cGxpY2F0ZSIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICAvKiBOZWVkIHVuaXQgdHlwZSwgd2lkdGgsIFwwLCBoZWlnaHQ6IG1pbmltdW0gNCBieXRlcyAqLworICAgZWxzZSBpZiAobGVuZ3RoIDwgNCkKKyAgIHsKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJpbnZhbGlkIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIHBuZ19kZWJ1ZzEoMiwgIkFsbG9jYXRpbmcgYW5kIHJlYWRpbmcgc0NBTCBjaHVuayBkYXRhICgldSBieXRlcykiLAorICAgICAgbGVuZ3RoICsgMSk7CisKKyAgIGJ1ZmZlciA9IHBuZ19yZWFkX2J1ZmZlcihwbmdfcHRyLCBsZW5ndGgrMSwgMi8qc2lsZW50Ki8pOworCisgICBpZiAoYnVmZmVyID09IE5VTEwpCisgICB7CisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJvdXQgb2YgbWVtb3J5Iik7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmZmVyLCBsZW5ndGgpOworICAgYnVmZmVyW2xlbmd0aF0gPSAwOyAvKiBOdWxsIHRlcm1pbmF0ZSB0aGUgbGFzdCBzdHJpbmcgKi8KKworICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApICE9IDApCisgICAgICByZXR1cm47CisKKyAgIC8qIFZhbGlkYXRlIHRoZSB1bml0LiAqLworICAgaWYgKGJ1ZmZlclswXSAhPSAxICYmIGJ1ZmZlclswXSAhPSAyKQorICAgeworICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiaW52YWxpZCB1bml0Iik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8qIFZhbGlkYXRlIHRoZSBBU0NJSSBudW1iZXJzLCBuZWVkIHR3byBBU0NJSSBudW1iZXJzIHNlcGFyYXRlZCBieQorICAgICogYSAnXDAnIGFuZCB0aGV5IG5lZWQgdG8gZml0IGV4YWN0bHkgaW4gdGhlIGNodW5rIGRhdGEuCisgICAgKi8KKyAgIGkgPSAxOworICAgc3RhdGUgPSAwOworCisgICBpZiAocG5nX2NoZWNrX2ZwX251bWJlcigocG5nX2NvbnN0X2NoYXJwKWJ1ZmZlciwgbGVuZ3RoLCAmc3RhdGUsICZpKSA9PSAwIHx8CisgICAgICAgaSA+PSBsZW5ndGggfHwgYnVmZmVyW2krK10gIT0gMCkKKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImJhZCB3aWR0aCBmb3JtYXQiKTsKKworICAgZWxzZSBpZiAoUE5HX0ZQX0lTX1BPU0lUSVZFKHN0YXRlKSA9PSAwKQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAibm9uLXBvc2l0aXZlIHdpZHRoIik7CisKKyAgIGVsc2UKKyAgIHsKKyAgICAgIHBuZ19zaXplX3QgaGVpZ2h0aSA9IGk7CisKKyAgICAgIHN0YXRlID0gMDsKKyAgICAgIGlmIChwbmdfY2hlY2tfZnBfbnVtYmVyKChwbmdfY29uc3RfY2hhcnApYnVmZmVyLCBsZW5ndGgsCisgICAgICAgICAgJnN0YXRlLCAmaSkgPT0gMCB8fCBpICE9IGxlbmd0aCkKKyAgICAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImJhZCBoZWlnaHQgZm9ybWF0Iik7CisKKyAgICAgIGVsc2UgaWYgKFBOR19GUF9JU19QT1NJVElWRShzdGF0ZSkgPT0gMCkKKyAgICAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIm5vbi1wb3NpdGl2ZSBoZWlnaHQiKTsKKworICAgICAgZWxzZQorICAgICAgICAgLyogVGhpcyBpcyB0aGUgKG9ubHkpIHN1Y2Nlc3MgY2FzZS4gKi8KKyAgICAgICAgIHBuZ19zZXRfc0NBTF9zKHBuZ19wdHIsIGluZm9fcHRyLCBidWZmZXJbMF0sCisgICAgICAgICAgICAocG5nX2NoYXJwKWJ1ZmZlcisxLCAocG5nX2NoYXJwKWJ1ZmZlcitoZWlnaHRpKTsKKyAgIH0KK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfdElNRV9TVVBQT1JURUQKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2hhbmRsZV90SU1FKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpCit7CisgICBwbmdfYnl0ZSBidWZbN107CisgICBwbmdfdGltZSBtb2RfdGltZTsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX3RJTUUiKTsKKworICAgaWYgKChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikgPT0gMCkKKyAgICAgIHBuZ19jaHVua19lcnJvcihwbmdfcHRyLCAibWlzc2luZyBJSERSIik7CisKKyAgIGVsc2UgaWYgKGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3RJTUUpICE9IDApCisgICB7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiZHVwbGljYXRlIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpICE9IDApCisgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19BRlRFUl9JREFUOworCisgICBpZiAobGVuZ3RoICE9IDcpCisgICB7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiaW52YWxpZCIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmLCA3KTsKKworICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApICE9IDApCisgICAgICByZXR1cm47CisKKyAgIG1vZF90aW1lLnNlY29uZCA9IGJ1Zls2XTsKKyAgIG1vZF90aW1lLm1pbnV0ZSA9IGJ1Zls1XTsKKyAgIG1vZF90aW1lLmhvdXIgPSBidWZbNF07CisgICBtb2RfdGltZS5kYXkgPSBidWZbM107CisgICBtb2RfdGltZS5tb250aCA9IGJ1ZlsyXTsKKyAgIG1vZF90aW1lLnllYXIgPSBwbmdfZ2V0X3VpbnRfMTYoYnVmKTsKKworICAgcG5nX3NldF90SU1FKHBuZ19wdHIsIGluZm9fcHRyLCAmbW9kX3RpbWUpOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF90RVh0X1NVUFBPUlRFRAorLyogTm90ZTogdGhpcyBkb2VzIG5vdCBwcm9wZXJseSBoYW5kbGUgY2h1bmtzIHRoYXQgYXJlID4gNjRLIHVuZGVyIERPUyAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfaGFuZGxlX3RFWHQocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKK3sKKyAgIHBuZ190ZXh0ICB0ZXh0X2luZm87CisgICBwbmdfYnl0ZXAgYnVmZmVyOworICAgcG5nX2NoYXJwIGtleTsKKyAgIHBuZ19jaGFycCB0ZXh0OworICAgcG5nX3VpbnRfMzIgc2tpcCA9IDA7CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV90RVh0Iik7CisKKyNpZmRlZiBQTkdfVVNFUl9MSU1JVFNfU1VQUE9SVEVECisgICBpZiAocG5nX3B0ci0+dXNlcl9jaHVua19jYWNoZV9tYXggIT0gMCkKKyAgIHsKKyAgICAgIGlmIChwbmdfcHRyLT51c2VyX2NodW5rX2NhY2hlX21heCA9PSAxKQorICAgICAgeworICAgICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKC0tcG5nX3B0ci0+dXNlcl9jaHVua19jYWNoZV9tYXggPT0gMSkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJubyBzcGFjZSBpbiBjaHVuayBjYWNoZSIpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgfQorI2VuZGlmCisKKyAgIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpID09IDApCisgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgIm1pc3NpbmcgSUhEUiIpOworCisgICBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKSAhPSAwKQorICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfQUZURVJfSURBVDsKKworI2lmZGVmIFBOR19NQVhfTUFMTE9DXzY0SworICAgaWYgKGxlbmd0aCA+IDY1NTM1VSkKKyAgIHsKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJ0b28gbGFyZ2UgdG8gZml0IGluIG1lbW9yeSIpOworICAgICAgcmV0dXJuOworICAgfQorI2VuZGlmCisKKyAgIGJ1ZmZlciA9IHBuZ19yZWFkX2J1ZmZlcihwbmdfcHRyLCBsZW5ndGgrMSwgMS8qd2FybiovKTsKKworICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQorICAgeworICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJvdXQgb2YgbWVtb3J5Iik7CisgICAgIHJldHVybjsKKyAgIH0KKworICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZmZlciwgbGVuZ3RoKTsKKworICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIHNraXApICE9IDApCisgICAgICByZXR1cm47CisKKyAgIGtleSA9IChwbmdfY2hhcnApYnVmZmVyOworICAga2V5W2xlbmd0aF0gPSAwOworCisgICBmb3IgKHRleHQgPSBrZXk7ICp0ZXh0OyB0ZXh0KyspCisgICAgICAvKiBFbXB0eSBsb29wIHRvIGZpbmQgZW5kIG9mIGtleSAqLyA7CisKKyAgIGlmICh0ZXh0ICE9IGtleSArIGxlbmd0aCkKKyAgICAgIHRleHQrKzsKKworICAgdGV4dF9pbmZvLmNvbXByZXNzaW9uID0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORTsKKyAgIHRleHRfaW5mby5rZXkgPSBrZXk7CisgICB0ZXh0X2luZm8ubGFuZyA9IE5VTEw7CisgICB0ZXh0X2luZm8ubGFuZ19rZXkgPSBOVUxMOworICAgdGV4dF9pbmZvLml0eHRfbGVuZ3RoID0gMDsKKyAgIHRleHRfaW5mby50ZXh0ID0gdGV4dDsKKyAgIHRleHRfaW5mby50ZXh0X2xlbmd0aCA9IHN0cmxlbih0ZXh0KTsKKworICAgaWYgKHBuZ19zZXRfdGV4dF8yKHBuZ19wdHIsIGluZm9fcHRyLCAmdGV4dF9pbmZvLCAxKSAhPSAwKQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluc3VmZmljaWVudCBtZW1vcnkgdG8gcHJvY2VzcyB0ZXh0IGNodW5rIik7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX3pUWHRfU1VQUE9SVEVECisvKiBOb3RlOiB0aGlzIGRvZXMgbm90IGNvcnJlY3RseSBoYW5kbGUgY2h1bmtzIHRoYXQgYXJlID4gNjRLIHVuZGVyIERPUyAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfaGFuZGxlX3pUWHQocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKK3sKKyAgIHBuZ19jb25zdF9jaGFycCBlcnJtc2cgPSBOVUxMOworICAgcG5nX2J5dGVwICAgICAgIGJ1ZmZlcjsKKyAgIHBuZ191aW50XzMyICAgICBrZXl3b3JkX2xlbmd0aDsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX3pUWHQiKTsKKworI2lmZGVmIFBOR19VU0VSX0xJTUlUU19TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT51c2VyX2NodW5rX2NhY2hlX21heCAhPSAwKQorICAgeworICAgICAgaWYgKHBuZ19wdHItPnVzZXJfY2h1bmtfY2FjaGVfbWF4ID09IDEpCisgICAgICB7CisgICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAoLS1wbmdfcHRyLT51c2VyX2NodW5rX2NhY2hlX21heCA9PSAxKQorICAgICAgeworICAgICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIm5vIHNwYWNlIGluIGNodW5rIGNhY2hlIik7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisgICB9CisjZW5kaWYKKworICAgaWYgKChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikgPT0gMCkKKyAgICAgIHBuZ19jaHVua19lcnJvcihwbmdfcHRyLCAibWlzc2luZyBJSERSIik7CisKKyAgIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpICE9IDApCisgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19BRlRFUl9JREFUOworCisgICBidWZmZXIgPSBwbmdfcmVhZF9idWZmZXIocG5nX3B0ciwgbGVuZ3RoLCAyLypzaWxlbnQqLyk7CisKKyAgIGlmIChidWZmZXIgPT0gTlVMTCkKKyAgIHsKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJvdXQgb2YgbWVtb3J5Iik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBidWZmZXIsIGxlbmd0aCk7CisKKyAgIGlmIChwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKSAhPSAwKQorICAgICAgcmV0dXJuOworCisgICAvKiBUT0RPOiBhbHNvIGNoZWNrIHRoYXQgdGhlIGtleXdvcmQgY29udGVudHMgbWF0Y2ggdGhlIHNwZWMhICovCisgICBmb3IgKGtleXdvcmRfbGVuZ3RoID0gMDsKKyAgICAgIGtleXdvcmRfbGVuZ3RoIDwgbGVuZ3RoICYmIGJ1ZmZlcltrZXl3b3JkX2xlbmd0aF0gIT0gMDsKKyAgICAgICsra2V5d29yZF9sZW5ndGgpCisgICAgICAvKiBFbXB0eSBsb29wIHRvIGZpbmQgZW5kIG9mIG5hbWUgKi8gOworCisgICBpZiAoa2V5d29yZF9sZW5ndGggPiA3OSB8fCBrZXl3b3JkX2xlbmd0aCA8IDEpCisgICAgICBlcnJtc2cgPSAiYmFkIGtleXdvcmQiOworCisgICAvKiB6VFh0IG11c3QgaGF2ZSBzb21lIExaIGRhdGEgYWZ0ZXIgdGhlIGtleXdvcmQsIGFsdGhvdWdoIGl0IG1heSBleHBhbmQgdG8KKyAgICAqIHplcm8gYnl0ZXM7IHdlIG5lZWQgYSAnXDAnIGF0IHRoZSBlbmQgb2YgdGhlIGtleXdvcmQsIHRoZSBjb21wcmVzc2lvbiB0eXBlCisgICAgKiB0aGVuIHRoZSBMWiBkYXRhOgorICAgICovCisgICBlbHNlIGlmIChrZXl3b3JkX2xlbmd0aCArIDMgPiBsZW5ndGgpCisgICAgICBlcnJtc2cgPSAidHJ1bmNhdGVkIjsKKworICAgZWxzZSBpZiAoYnVmZmVyW2tleXdvcmRfbGVuZ3RoKzFdICE9IFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UpCisgICAgICBlcnJtc2cgPSAidW5rbm93biBjb21wcmVzc2lvbiB0eXBlIjsKKworICAgZWxzZQorICAgeworICAgICAgcG5nX2FsbG9jX3NpemVfdCB1bmNvbXByZXNzZWRfbGVuZ3RoID0gUE5HX1NJWkVfTUFYOworCisgICAgICAvKiBUT0RPOiBhdCBwcmVzZW50IHBuZ19kZWNvbXByZXNzX2NodW5rIGltcG9zZXMgYSBzaW5nbGUgYXBwbGljYXRpb24KKyAgICAgICAqIGxldmVsIG1lbW9yeSBsaW1pdCwgdGhpcyBzaG91bGQgYmUgc3BsaXQgdG8gZGlmZmVyZW50IHZhbHVlcyBmb3IgaUNDUAorICAgICAgICogYW5kIHRleHQgY2h1bmtzLgorICAgICAgICovCisgICAgICBpZiAocG5nX2RlY29tcHJlc3NfY2h1bmsocG5nX3B0ciwgbGVuZ3RoLCBrZXl3b3JkX2xlbmd0aCsyLAorICAgICAgICAgJnVuY29tcHJlc3NlZF9sZW5ndGgsIDEvKnRlcm1pbmF0ZSovKSA9PSBaX1NUUkVBTV9FTkQpCisgICAgICB7CisgICAgICAgICBwbmdfdGV4dCB0ZXh0OworCisgICAgICAgICAvKiBJdCB3b3JrZWQ7IHBuZ19wdHItPnJlYWRfYnVmZmVyIG5vdyBsb29rcyBsaWtlIGEgdEVYdCBjaHVuayBleGNlcHQKKyAgICAgICAgICAqIGZvciB0aGUgZXh0cmEgY29tcHJlc3Npb24gdHlwZSBieXRlIGFuZCB0aGUgZmFjdCB0aGF0IGl0IGlzbid0CisgICAgICAgICAgKiBuZWNlc3NhcmlseSAnXDAnIHRlcm1pbmF0ZWQuCisgICAgICAgICAgKi8KKyAgICAgICAgIGJ1ZmZlciA9IHBuZ19wdHItPnJlYWRfYnVmZmVyOworICAgICAgICAgYnVmZmVyW3VuY29tcHJlc3NlZF9sZW5ndGgrKGtleXdvcmRfbGVuZ3RoKzIpXSA9IDA7CisKKyAgICAgICAgIHRleHQuY29tcHJlc3Npb24gPSBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0OworICAgICAgICAgdGV4dC5rZXkgPSAocG5nX2NoYXJwKWJ1ZmZlcjsKKyAgICAgICAgIHRleHQudGV4dCA9IChwbmdfY2hhcnApKGJ1ZmZlciArIGtleXdvcmRfbGVuZ3RoKzIpOworICAgICAgICAgdGV4dC50ZXh0X2xlbmd0aCA9IHVuY29tcHJlc3NlZF9sZW5ndGg7CisgICAgICAgICB0ZXh0Lml0eHRfbGVuZ3RoID0gMDsKKyAgICAgICAgIHRleHQubGFuZyA9IE5VTEw7CisgICAgICAgICB0ZXh0Lmxhbmdfa2V5ID0gTlVMTDsKKworICAgICAgICAgaWYgKHBuZ19zZXRfdGV4dF8yKHBuZ19wdHIsIGluZm9fcHRyLCAmdGV4dCwgMSkgIT0gMCkKKyAgICAgICAgICAgIGVycm1zZyA9ICJpbnN1ZmZpY2llbnQgbWVtb3J5IjsKKyAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgICAgZXJybXNnID0gcG5nX3B0ci0+enN0cmVhbS5tc2c7CisgICB9CisKKyAgIGlmIChlcnJtc2cgIT0gTlVMTCkKKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgZXJybXNnKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfaVRYdF9TVVBQT1JURUQKKy8qIE5vdGU6IHRoaXMgZG9lcyBub3QgY29ycmVjdGx5IGhhbmRsZSBjaHVua3MgdGhhdCBhcmUgPiA2NEsgdW5kZXIgRE9TICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19oYW5kbGVfaVRYdChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQoreworICAgcG5nX2NvbnN0X2NoYXJwIGVycm1zZyA9IE5VTEw7CisgICBwbmdfYnl0ZXAgYnVmZmVyOworICAgcG5nX3VpbnRfMzIgcHJlZml4X2xlbmd0aDsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX2lUWHQiKTsKKworI2lmZGVmIFBOR19VU0VSX0xJTUlUU19TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT51c2VyX2NodW5rX2NhY2hlX21heCAhPSAwKQorICAgeworICAgICAgaWYgKHBuZ19wdHItPnVzZXJfY2h1bmtfY2FjaGVfbWF4ID09IDEpCisgICAgICB7CisgICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAoLS1wbmdfcHRyLT51c2VyX2NodW5rX2NhY2hlX21heCA9PSAxKQorICAgICAgeworICAgICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIm5vIHNwYWNlIGluIGNodW5rIGNhY2hlIik7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisgICB9CisjZW5kaWYKKworICAgaWYgKChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikgPT0gMCkKKyAgICAgIHBuZ19jaHVua19lcnJvcihwbmdfcHRyLCAibWlzc2luZyBJSERSIik7CisKKyAgIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpICE9IDApCisgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19BRlRFUl9JREFUOworCisgICBidWZmZXIgPSBwbmdfcmVhZF9idWZmZXIocG5nX3B0ciwgbGVuZ3RoKzEsIDEvKndhcm4qLyk7CisKKyAgIGlmIChidWZmZXIgPT0gTlVMTCkKKyAgIHsKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJvdXQgb2YgbWVtb3J5Iik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBidWZmZXIsIGxlbmd0aCk7CisKKyAgIGlmIChwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKSAhPSAwKQorICAgICAgcmV0dXJuOworCisgICAvKiBGaXJzdCB0aGUga2V5d29yZC4gKi8KKyAgIGZvciAocHJlZml4X2xlbmd0aD0wOworICAgICAgcHJlZml4X2xlbmd0aCA8IGxlbmd0aCAmJiBidWZmZXJbcHJlZml4X2xlbmd0aF0gIT0gMDsKKyAgICAgICsrcHJlZml4X2xlbmd0aCkKKyAgICAgIC8qIEVtcHR5IGxvb3AgKi8gOworCisgICAvKiBQZXJmb3JtIGEgYmFzaWMgY2hlY2sgb24gdGhlIGtleXdvcmQgbGVuZ3RoIGhlcmUuICovCisgICBpZiAocHJlZml4X2xlbmd0aCA+IDc5IHx8IHByZWZpeF9sZW5ndGggPCAxKQorICAgICAgZXJybXNnID0gImJhZCBrZXl3b3JkIjsKKworICAgLyogRXhwZWN0IGtleXdvcmQsIGNvbXByZXNzaW9uIGZsYWcsIGNvbXByZXNzaW9uIHR5cGUsIGxhbmd1YWdlLCB0cmFuc2xhdGVkCisgICAgKiBrZXl3b3JkIChib3RoIG1heSBiZSBlbXB0eSBidXQgYXJlIDAgdGVybWluYXRlZCkgdGhlbiB0aGUgdGV4dCwgd2hpY2ggbWF5CisgICAgKiBiZSBlbXB0eS4KKyAgICAqLworICAgZWxzZSBpZiAocHJlZml4X2xlbmd0aCArIDUgPiBsZW5ndGgpCisgICAgICBlcnJtc2cgPSAidHJ1bmNhdGVkIjsKKworICAgZWxzZSBpZiAoYnVmZmVyW3ByZWZpeF9sZW5ndGgrMV0gPT0gMCB8fAorICAgICAgKGJ1ZmZlcltwcmVmaXhfbGVuZ3RoKzFdID09IDEgJiYKKyAgICAgIGJ1ZmZlcltwcmVmaXhfbGVuZ3RoKzJdID09IFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UpKQorICAgeworICAgICAgaW50IGNvbXByZXNzZWQgPSBidWZmZXJbcHJlZml4X2xlbmd0aCsxXSAhPSAwOworICAgICAgcG5nX3VpbnRfMzIgbGFuZ3VhZ2Vfb2Zmc2V0LCB0cmFuc2xhdGVkX2tleXdvcmRfb2Zmc2V0OworICAgICAgcG5nX2FsbG9jX3NpemVfdCB1bmNvbXByZXNzZWRfbGVuZ3RoID0gMDsKKworICAgICAgLyogTm93IHRoZSBsYW5ndWFnZSB0YWcgKi8KKyAgICAgIHByZWZpeF9sZW5ndGggKz0gMzsKKyAgICAgIGxhbmd1YWdlX29mZnNldCA9IHByZWZpeF9sZW5ndGg7CisKKyAgICAgIGZvciAoOyBwcmVmaXhfbGVuZ3RoIDwgbGVuZ3RoICYmIGJ1ZmZlcltwcmVmaXhfbGVuZ3RoXSAhPSAwOworICAgICAgICAgKytwcmVmaXhfbGVuZ3RoKQorICAgICAgICAgLyogRW1wdHkgbG9vcCAqLyA7CisKKyAgICAgIC8qIFdBUk5JTkc6IHRoZSBsZW5ndGggbWF5IGJlIGludmFsaWQgaGVyZSwgdGhpcyBpcyBjaGVja2VkIGJlbG93LiAqLworICAgICAgdHJhbnNsYXRlZF9rZXl3b3JkX29mZnNldCA9ICsrcHJlZml4X2xlbmd0aDsKKworICAgICAgZm9yICg7IHByZWZpeF9sZW5ndGggPCBsZW5ndGggJiYgYnVmZmVyW3ByZWZpeF9sZW5ndGhdICE9IDA7CisgICAgICAgICArK3ByZWZpeF9sZW5ndGgpCisgICAgICAgICAvKiBFbXB0eSBsb29wICovIDsKKworICAgICAgLyogcHJlZml4X2xlbmd0aCBzaG91bGQgbm93IGJlIGF0IHRoZSB0cmFpbGluZyAnXDAnIG9mIHRoZSB0cmFuc2xhdGVkCisgICAgICAgKiBrZXl3b3JkLCBidXQgaXQgbWF5IGFscmVhZHkgYmUgb3ZlciB0aGUgZW5kLiAgTm9uZSBvZiB0aGlzIGFyaXRobWV0aWMKKyAgICAgICAqIGNhbiBvdmVyZmxvdyBiZWNhdXNlIGNodW5rcyBhcmUgYXQgbW9zdCAyXjMxIGJ5dGVzIGxvbmcsIGJ1dCBvbiAxNi1iaXQKKyAgICAgICAqIHN5c3RlbXMgdGhlIGF2YWlsYWJsZSBhbGxvY2F0aW9uIG1heSBvdmVyZmxvdy4KKyAgICAgICAqLworICAgICAgKytwcmVmaXhfbGVuZ3RoOworCisgICAgICBpZiAoY29tcHJlc3NlZCA9PSAwICYmIHByZWZpeF9sZW5ndGggPD0gbGVuZ3RoKQorICAgICAgICAgdW5jb21wcmVzc2VkX2xlbmd0aCA9IGxlbmd0aCAtIHByZWZpeF9sZW5ndGg7CisKKyAgICAgIGVsc2UgaWYgKGNvbXByZXNzZWQgIT0gMCAmJiBwcmVmaXhfbGVuZ3RoIDwgbGVuZ3RoKQorICAgICAgeworICAgICAgICAgdW5jb21wcmVzc2VkX2xlbmd0aCA9IFBOR19TSVpFX01BWDsKKworICAgICAgICAgLyogVE9ETzogYXQgcHJlc2VudCBwbmdfZGVjb21wcmVzc19jaHVuayBpbXBvc2VzIGEgc2luZ2xlIGFwcGxpY2F0aW9uCisgICAgICAgICAgKiBsZXZlbCBtZW1vcnkgbGltaXQsIHRoaXMgc2hvdWxkIGJlIHNwbGl0IHRvIGRpZmZlcmVudCB2YWx1ZXMgZm9yCisgICAgICAgICAgKiBpQ0NQIGFuZCB0ZXh0IGNodW5rcy4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKHBuZ19kZWNvbXByZXNzX2NodW5rKHBuZ19wdHIsIGxlbmd0aCwgcHJlZml4X2xlbmd0aCwKKyAgICAgICAgICAgICZ1bmNvbXByZXNzZWRfbGVuZ3RoLCAxLyp0ZXJtaW5hdGUqLykgPT0gWl9TVFJFQU1fRU5EKQorICAgICAgICAgICAgYnVmZmVyID0gcG5nX3B0ci0+cmVhZF9idWZmZXI7CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVycm1zZyA9IHBuZ19wdHItPnpzdHJlYW0ubXNnOworICAgICAgfQorCisgICAgICBlbHNlCisgICAgICAgICBlcnJtc2cgPSAidHJ1bmNhdGVkIjsKKworICAgICAgaWYgKGVycm1zZyA9PSBOVUxMKQorICAgICAgeworICAgICAgICAgcG5nX3RleHQgdGV4dDsKKworICAgICAgICAgYnVmZmVyW3VuY29tcHJlc3NlZF9sZW5ndGgrcHJlZml4X2xlbmd0aF0gPSAwOworCisgICAgICAgICBpZiAoY29tcHJlc3NlZCA9PSAwKQorICAgICAgICAgICAgdGV4dC5jb21wcmVzc2lvbiA9IFBOR19JVFhUX0NPTVBSRVNTSU9OX05PTkU7CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRleHQuY29tcHJlc3Npb24gPSBQTkdfSVRYVF9DT01QUkVTU0lPTl96VFh0OworCisgICAgICAgICB0ZXh0LmtleSA9IChwbmdfY2hhcnApYnVmZmVyOworICAgICAgICAgdGV4dC5sYW5nID0gKHBuZ19jaGFycClidWZmZXIgKyBsYW5ndWFnZV9vZmZzZXQ7CisgICAgICAgICB0ZXh0Lmxhbmdfa2V5ID0gKHBuZ19jaGFycClidWZmZXIgKyB0cmFuc2xhdGVkX2tleXdvcmRfb2Zmc2V0OworICAgICAgICAgdGV4dC50ZXh0ID0gKHBuZ19jaGFycClidWZmZXIgKyBwcmVmaXhfbGVuZ3RoOworICAgICAgICAgdGV4dC50ZXh0X2xlbmd0aCA9IDA7CisgICAgICAgICB0ZXh0Lml0eHRfbGVuZ3RoID0gdW5jb21wcmVzc2VkX2xlbmd0aDsKKworICAgICAgICAgaWYgKHBuZ19zZXRfdGV4dF8yKHBuZ19wdHIsIGluZm9fcHRyLCAmdGV4dCwgMSkgIT0gMCkKKyAgICAgICAgICAgIGVycm1zZyA9ICJpbnN1ZmZpY2llbnQgbWVtb3J5IjsKKyAgICAgIH0KKyAgIH0KKworICAgZWxzZQorICAgICAgZXJybXNnID0gImJhZCBjb21wcmVzc2lvbiBpbmZvIjsKKworICAgaWYgKGVycm1zZyAhPSBOVUxMKQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCBlcnJtc2cpOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKKy8qIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHBuZ19oYW5kbGVfdW5rbm93bjsgc2V0IHVwIHBuZ19wdHI6OnVua25vd25fY2h1bmsgKi8KK3N0YXRpYyBpbnQKK3BuZ19jYWNoZV91bmtub3duX2NodW5rKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpCit7CisgICBwbmdfYWxsb2Nfc2l6ZV90IGxpbWl0ID0gUE5HX1NJWkVfTUFYOworCisgICBpZiAocG5nX3B0ci0+dW5rbm93bl9jaHVuay5kYXRhICE9IE5VTEwpCisgICB7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT51bmtub3duX2NodW5rLmRhdGEpOworICAgICAgcG5nX3B0ci0+dW5rbm93bl9jaHVuay5kYXRhID0gTlVMTDsKKyAgIH0KKworIyAgaWZkZWYgUE5HX1NFVF9VU0VSX0xJTUlUU19TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT51c2VyX2NodW5rX21hbGxvY19tYXggPiAwICYmCisgICAgICAgcG5nX3B0ci0+dXNlcl9jaHVua19tYWxsb2NfbWF4IDwgbGltaXQpCisgICAgICBsaW1pdCA9IHBuZ19wdHItPnVzZXJfY2h1bmtfbWFsbG9jX21heDsKKworIyAgZWxpZiBQTkdfVVNFUl9DSFVOS19NQUxMT0NfTUFYID4gMAorICAgaWYgKFBOR19VU0VSX0NIVU5LX01BTExPQ19NQVggPCBsaW1pdCkKKyAgICAgIGxpbWl0ID0gUE5HX1VTRVJfQ0hVTktfTUFMTE9DX01BWDsKKyMgIGVuZGlmCisKKyAgIGlmIChsZW5ndGggPD0gbGltaXQpCisgICB7CisgICAgICBQTkdfQ1NUUklOR19GUk9NX0NIVU5LKHBuZ19wdHItPnVua25vd25fY2h1bmsubmFtZSwgcG5nX3B0ci0+Y2h1bmtfbmFtZSk7CisgICAgICAvKiBUaGUgZm9sbG93aW5nIGlzIHNhZmUgYmVjYXVzZSBvZiB0aGUgUE5HX1NJWkVfTUFYIGluaXQgYWJvdmUgKi8KKyAgICAgIHBuZ19wdHItPnVua25vd25fY2h1bmsuc2l6ZSA9IChwbmdfc2l6ZV90KWxlbmd0aC8qU0FGRSovOworICAgICAgLyogJ21vZGUnIGlzIGEgZmxhZyBhcnJheSwgb25seSB0aGUgYm90dG9tIGZvdXIgYml0cyBtYXR0ZXIgaGVyZSAqLworICAgICAgcG5nX3B0ci0+dW5rbm93bl9jaHVuay5sb2NhdGlvbiA9IChwbmdfYnl0ZSlwbmdfcHRyLT5tb2RlLypTQUZFKi87CisKKyAgICAgIGlmIChsZW5ndGggPT0gMCkKKyAgICAgICAgIHBuZ19wdHItPnVua25vd25fY2h1bmsuZGF0YSA9IE5VTEw7CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIC8qIERvIGEgJ3dhcm4nIGhlcmUgLSBpdCBpcyBoYW5kbGVkIGJlbG93LiAqLworICAgICAgICAgcG5nX3B0ci0+dW5rbm93bl9jaHVuay5kYXRhID0gcG5nX3ZvaWRjYXN0KHBuZ19ieXRlcCwKKyAgICAgICAgICAgIHBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCBsZW5ndGgpKTsKKyAgICAgIH0KKyAgIH0KKworICAgaWYgKHBuZ19wdHItPnVua25vd25fY2h1bmsuZGF0YSA9PSBOVUxMICYmIGxlbmd0aCA+IDApCisgICB7CisgICAgICAvKiBUaGlzIGlzIGJlbmlnbiBiZWNhdXNlIHdlIGNsZWFuIHVwIGNvcnJlY3RseSAqLworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgInVua25vd24gY2h1bmsgZXhjZWVkcyBtZW1vcnkgbGltaXRzIik7CisgICAgICByZXR1cm4gMDsKKyAgIH0KKworICAgZWxzZQorICAgeworICAgICAgaWYgKGxlbmd0aCA+IDApCisgICAgICAgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgcG5nX3B0ci0+dW5rbm93bl9jaHVuay5kYXRhLCBsZW5ndGgpOworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCk7CisgICAgICByZXR1cm4gMTsKKyAgIH0KK30KKyNlbmRpZiAvKiBSRUFEX1VOS05PV05fQ0hVTktTICovCisKKy8qIEhhbmRsZSBhbiB1bmtub3duLCBvciBrbm93biBidXQgZGlzYWJsZWQsIGNodW5rICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19oYW5kbGVfdW5rbm93bihwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwKKyAgIHBuZ191aW50XzMyIGxlbmd0aCwgaW50IGtlZXApCit7CisgICBpbnQgaGFuZGxlZCA9IDA7IC8qIHRoZSBjaHVuayB3YXMgaGFuZGxlZCAqLworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfdW5rbm93biIpOworCisjaWZkZWYgUE5HX1JFQURfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECisgICAvKiBOT1RFOiB0aGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIGNvZGUgaW4gbGlicG5nLTEuNC4xMiBleGNlcHQgZm9yIGZpeGluZworICAgICogdGhlIGJ1ZyB3aGljaCBtZWFudCB0aGF0IHNldHRpbmcgYSBub24tZGVmYXVsdCBiZWhhdmlvciBmb3IgYSBzcGVjaWZpYworICAgICogY2h1bmsgd291bGQgYmUgaWdub3JlZCAodGhlIGRlZmF1bHQgd2FzIGFsd2F5cyB1c2VkIHVubGVzcyBhIHVzZXIKKyAgICAqIGNhbGxiYWNrIHdhcyBpbnN0YWxsZWQpLgorICAgICoKKyAgICAqICdrZWVwJyBpcyB0aGUgdmFsdWUgZnJvbSB0aGUgcG5nX2NodW5rX3Vua25vd25faGFuZGxpbmcsIHRoZSBzZXR0aW5nIGZvcgorICAgICogdGhpcyBzcGVjaWZpYyBjaHVua19uYW1lLCBpZiBQTkdfSEFORExFX0FTX1VOS05PV05fU1VQUE9SVEVELCBpZiBub3QgaXQKKyAgICAqIHdpbGwgYWx3YXlzIGJlIFBOR19IQU5ETEVfQ0hVTktfQVNfREVGQVVMVCBhbmQgaXQgbmVlZHMgdG8gYmUgc2V0IGhlcmUuCisgICAgKiBUaGlzIGlzIGp1c3QgYW4gb3B0aW1pemF0aW9uIHRvIGF2b2lkIG11bHRpcGxlIGNhbGxzIHRvIHRoZSBsb29rdXAKKyAgICAqIGZ1bmN0aW9uLgorICAgICovCisjICBpZm5kZWYgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRAorIyAgICAgaWZkZWYgUE5HX1NFVF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKKyAgIGtlZXAgPSBwbmdfY2h1bmtfdW5rbm93bl9oYW5kbGluZyhwbmdfcHRyLCBwbmdfcHRyLT5jaHVua19uYW1lKTsKKyMgICAgIGVuZGlmCisjICBlbmRpZgorCisgICAvKiBPbmUgb2YgdGhlIGZvbGxvd2luZyBtZXRob2RzIHdpbGwgcmVhZCB0aGUgY2h1bmsgb3Igc2tpcCBpdCAoYXQgbGVhc3Qgb25lCisgICAgKiBvZiB0aGVzZSBpcyBhbHdheXMgZGVmaW5lZCBiZWNhdXNlIHRoaXMgaXMgdGhlIG9ubHkgd2F5IHRvIHN3aXRjaCBvbgorICAgICogUE5HX1JFQURfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEKQorICAgICovCisjICBpZmRlZiBQTkdfUkVBRF9VU0VSX0NIVU5LU19TVVBQT1JURUQKKyAgIC8qIFRoZSB1c2VyIGNhbGxiYWNrIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgY2h1bmsga2VlcCB2YWx1ZSwgYnV0IHRoZQorICAgICoga2VlcCB2YWx1ZSBpcyBzdGlsbCByZXF1aXJlZCB0byB2YWxpZGF0ZSBhIHNhdmUgb2YgYSBjcml0aWNhbCBjaHVuay4KKyAgICAqLworICAgaWYgKHBuZ19wdHItPnJlYWRfdXNlcl9jaHVua19mbiAhPSBOVUxMKQorICAgeworICAgICAgaWYgKHBuZ19jYWNoZV91bmtub3duX2NodW5rKHBuZ19wdHIsIGxlbmd0aCkgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgIC8qIENhbGxiYWNrIHRvIHVzZXIgdW5rbm93biBjaHVuayBoYW5kbGVyICovCisgICAgICAgICBpbnQgcmV0ID0gKCoocG5nX3B0ci0+cmVhZF91c2VyX2NodW5rX2ZuKSkocG5nX3B0ciwKKyAgICAgICAgICAgICZwbmdfcHRyLT51bmtub3duX2NodW5rKTsKKworICAgICAgICAgLyogcmV0IGlzOgorICAgICAgICAgICogbmVnYXRpdmU6IEFuIGVycm9yIG9jY3VycmVkOyBwbmdfY2h1bmtfZXJyb3Igd2lsbCBiZSBjYWxsZWQuCisgICAgICAgICAgKiAgICAgemVybzogVGhlIGNodW5rIHdhcyBub3QgaGFuZGxlZCwgdGhlIGNodW5rIHdpbGwgYmUgZGlzY2FyZGVkCisgICAgICAgICAgKiAgICAgICAgICAgdW5sZXNzIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyBoYXMgYmVlbiB1c2VkIHRvIHNldAorICAgICAgICAgICogICAgICAgICAgIGEgJ2tlZXAnIGJlaGF2aW9yIGZvciB0aGlzIHBhcnRpY3VsYXIgY2h1bmssIGluIHdoaWNoCisgICAgICAgICAgKiAgICAgICAgICAgY2FzZSB0aGF0IHdpbGwgYmUgdXNlZC4gIEEgY3JpdGljYWwgY2h1bmsgd2lsbCBjYXVzZSBhbgorICAgICAgICAgICogICAgICAgICAgIGVycm9yIGF0IHRoaXMgcG9pbnQgdW5sZXNzIGl0IGlzIHRvIGJlIHNhdmVkLgorICAgICAgICAgICogcG9zaXRpdmU6IFRoZSBjaHVuayB3YXMgaGFuZGxlZCwgbGlicG5nIHdpbGwgaWdub3JlL2Rpc2NhcmQgaXQuCisgICAgICAgICAgKi8KKyAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJlcnJvciBpbiB1c2VyIGNodW5rIik7CisKKyAgICAgICAgIGVsc2UgaWYgKHJldCA9PSAwKQorICAgICAgICAgeworICAgICAgICAgICAgLyogSWYgdGhlIGtlZXAgdmFsdWUgaXMgJ2RlZmF1bHQnIG9yICduZXZlcicgb3ZlcnJpZGUgaXQsIGJ1dAorICAgICAgICAgICAgICogc3RpbGwgZXJyb3Igb3V0IG9uIGNyaXRpY2FsIGNodW5rcyB1bmxlc3MgdGhlIGtlZXAgdmFsdWUgaXMKKyAgICAgICAgICAgICAqICdhbHdheXMnICBXaGlsZSB0aGlzIGlzIHdlaXJkIGl0IGlzIHRoZSBiZWhhdmlvciBpbiAxLjQuMTIuCisgICAgICAgICAgICAgKiBBIHBvc3NpYmxlIGltcHJvdmVtZW50IHdvdWxkIGJlIHRvIG9iZXkgdGhlIHZhbHVlIHNldCBmb3IgdGhlCisgICAgICAgICAgICAgKiBjaHVuaywgYnV0IHRoaXMgd291bGQgYmUgYW4gQVBJIGNoYW5nZSB0aGF0IHdvdWxkIHByb2JhYmx5CisgICAgICAgICAgICAgKiBkYW1hZ2Ugc29tZSBhcHBsaWNhdGlvbnMuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhlIHBuZ19hcHBfd2FybmluZyBiZWxvdyBjYXRjaGVzIHRoZSBjYXNlIHRoYXQgbWF0dGVycywgd2hlcmUKKyAgICAgICAgICAgICAqIHRoZSBhcHBsaWNhdGlvbiBoYXMgbm90IHNldCBzcGVjaWZpYyBzYXZlIG9yIGlnbm9yZSBmb3IgdGhpcworICAgICAgICAgICAgICogY2h1bmsgb3IgZ2xvYmFsIHNhdmUgb3IgaWdub3JlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoa2VlcCA8IFBOR19IQU5ETEVfQ0hVTktfSUZfU0FGRSkKKyAgICAgICAgICAgIHsKKyMgICAgICAgICAgICAgIGlmZGVmIFBOR19TRVRfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECisgICAgICAgICAgICAgICBpZiAocG5nX3B0ci0+dW5rbm93bl9kZWZhdWx0IDwgUE5HX0hBTkRMRV9DSFVOS19JRl9TQUZFKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcG5nX2NodW5rX3dhcm5pbmcocG5nX3B0ciwgIlNhdmluZyB1bmtub3duIGNodW5rOiIpOworICAgICAgICAgICAgICAgICAgcG5nX2FwcF93YXJuaW5nKHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAiZm9yY2luZyBzYXZlIG9mIGFuIHVuaGFuZGxlZCBjaHVuazsiCisgICAgICAgICAgICAgICAgICAgICAiIHBsZWFzZSBjYWxsIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyIpOworICAgICAgICAgICAgICAgICAgICAgLyogd2l0aCBrZWVwID0gUE5HX0hBTkRMRV9DSFVOS19JRl9TQUZFICovCisgICAgICAgICAgICAgICB9CisjICAgICAgICAgICAgICBlbmRpZgorICAgICAgICAgICAgICAga2VlcCA9IFBOR19IQU5ETEVfQ0hVTktfSUZfU0FGRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICAgZWxzZSAvKiBjaHVuayB3YXMgaGFuZGxlZCAqLworICAgICAgICAgeworICAgICAgICAgICAgaGFuZGxlZCA9IDE7CisgICAgICAgICAgICAvKiBDcml0aWNhbCBjaHVua3MgY2FuIGJlIHNhZmVseSBkaXNjYXJkZWQgYXQgdGhpcyBwb2ludC4gKi8KKyAgICAgICAgICAgIGtlZXAgPSBQTkdfSEFORExFX0NIVU5LX05FVkVSOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBlbHNlCisgICAgICAgICBrZWVwID0gUE5HX0hBTkRMRV9DSFVOS19ORVZFUjsgLyogaW5zdWZmaWNpZW50IG1lbW9yeSAqLworICAgfQorCisgICBlbHNlCisgICAvKiBVc2UgdGhlIFNBVkVfVU5LTk9XTl9DSFVOS1MgY29kZSBvciBza2lwIHRoZSBjaHVuayAqLworIyAgZW5kaWYgLyogUkVBRF9VU0VSX0NIVU5LUyAqLworCisjICBpZmRlZiBQTkdfU0FWRV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKKyAgIHsKKyAgICAgIC8qIGtlZXAgaXMgY3VycmVudGx5IGp1c3QgdGhlIHBlci1jaHVuayBzZXR0aW5nLCBpZiB0aGVyZSB3YXMgbm8KKyAgICAgICAqIHNldHRpbmcgY2hhbmdlIGl0IHRvIHRoZSBnbG9iYWwgZGVmYXVsdCBub3cgKG5vdCB0aGF0IHRoaXMgbWF5CisgICAgICAgKiBzdGlsbCBiZSBBU19ERUZBVUxUKSB0aGVuIG9idGFpbiB0aGUgY2FjaGUgb2YgdGhlIGNodW5rIGlmIHJlcXVpcmVkLAorICAgICAgICogaWYgbm90IHNpbXBseSBza2lwIHRoZSBjaHVuay4KKyAgICAgICAqLworICAgICAgaWYgKGtlZXAgPT0gUE5HX0hBTkRMRV9DSFVOS19BU19ERUZBVUxUKQorICAgICAgICAga2VlcCA9IHBuZ19wdHItPnVua25vd25fZGVmYXVsdDsKKworICAgICAgaWYgKGtlZXAgPT0gUE5HX0hBTkRMRV9DSFVOS19BTFdBWVMgfHwKKyAgICAgICAgIChrZWVwID09IFBOR19IQU5ETEVfQ0hVTktfSUZfU0FGRSAmJgorICAgICAgICAgIFBOR19DSFVOS19BTkNJTExBUlkocG5nX3B0ci0+Y2h1bmtfbmFtZSkpKQorICAgICAgeworICAgICAgICAgaWYgKHBuZ19jYWNoZV91bmtub3duX2NodW5rKHBuZ19wdHIsIGxlbmd0aCkgPT0gMCkKKyAgICAgICAgICAgIGtlZXAgPSBQTkdfSEFORExFX0NIVU5LX05FVkVSOworICAgICAgfQorCisgICAgICBlbHNlCisgICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgfQorIyAgZWxzZQorIyAgICAgaWZuZGVmIFBOR19SRUFEX1VTRVJfQ0hVTktTX1NVUFBPUlRFRAorIyAgICAgICAgZXJyb3Igbm8gbWV0aG9kIHRvIHN1cHBvcnQgUkVBRF9VTktOT1dOX0NIVU5LUworIyAgICAgZW5kaWYKKworICAgeworICAgICAgLyogSWYgaGVyZSB0aGVyZSBpcyBubyByZWFkIGNhbGxiYWNrIHBvaW50ZXIgc2V0IGFuZCBubyBzdXBwb3J0IGlzCisgICAgICAgKiBjb21waWxlZCBpbiB0byBqdXN0IHNhdmUgdGhlIHVua25vd24gY2h1bmtzLCBzbyBzaW1wbHkgc2tpcCB0aGlzCisgICAgICAgKiBjaHVuay4gIElmICdrZWVwJyBpcyBzb21ldGhpbmcgb3RoZXIgdGhhbiBBU19ERUZBVUxUIG9yIE5FVkVSIHRoZW4KKyAgICAgICAqIHRoZSBhcHAgaGFzIGVycm9uZW91c2x5IGFza2VkIGZvciB1bmtub3duIGNodW5rIHNhdmluZyB3aGVuIHRoZXJlCisgICAgICAgKiBpcyBubyBzdXBwb3J0LgorICAgICAgICovCisgICAgICBpZiAoa2VlcCA+IFBOR19IQU5ETEVfQ0hVTktfTkVWRVIpCisgICAgICAgICBwbmdfYXBwX2Vycm9yKHBuZ19wdHIsICJubyB1bmtub3duIGNodW5rIHN1cHBvcnQgYXZhaWxhYmxlIik7CisKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICB9CisjICBlbmRpZgorCisjICBpZmRlZiBQTkdfU1RPUkVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECisgICAvKiBOb3cgc3RvcmUgdGhlIGNodW5rIGluIHRoZSBjaHVuayBsaXN0IGlmIGFwcHJvcHJpYXRlLCBhbmQgaWYgdGhlIGxpbWl0cworICAgICogcGVybWl0IGl0LgorICAgICovCisgICBpZiAoa2VlcCA9PSBQTkdfSEFORExFX0NIVU5LX0FMV0FZUyB8fAorICAgICAgKGtlZXAgPT0gUE5HX0hBTkRMRV9DSFVOS19JRl9TQUZFICYmCisgICAgICAgUE5HX0NIVU5LX0FOQ0lMTEFSWShwbmdfcHRyLT5jaHVua19uYW1lKSkpCisgICB7CisjICAgICBpZmRlZiBQTkdfVVNFUl9MSU1JVFNfU1VQUE9SVEVECisgICAgICBzd2l0Y2ggKHBuZ19wdHItPnVzZXJfY2h1bmtfY2FjaGVfbWF4KQorICAgICAgeworICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgcG5nX3B0ci0+dXNlcl9jaHVua19jYWNoZV9tYXggPSAxOworICAgICAgICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAibm8gc3BhY2UgaW4gY2h1bmsgY2FjaGUiKTsKKyAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLworICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgLyogTk9URTogcHJpb3IgdG8gMS42LjAgdGhpcyBjYXNlIHJlc3VsdGVkIGluIGFuIHVua25vd24gY3JpdGljYWwKKyAgICAgICAgICAgICAqIGNodW5rIGJlaW5nIHNraXBwZWQsIG5vdyB0aGVyZSB3aWxsIGJlIGEgaGFyZCBlcnJvciBiZWxvdy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGRlZmF1bHQ6IC8qIG5vdCBhdCBsaW1pdCAqLworICAgICAgICAgICAgLS0ocG5nX3B0ci0+dXNlcl9jaHVua19jYWNoZV9tYXgpOworICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisgICAgICAgICBjYXNlIDA6IC8qIG5vIGxpbWl0ICovCisjICBlbmRpZiAvKiBVU0VSX0xJTUlUUyAqLworICAgICAgICAgICAgLyogSGVyZSB3aGVuIHRoZSBsaW1pdCBpc24ndCByZWFjaGVkIG9yIHdoZW4gbGltaXRzIGFyZSBjb21waWxlZAorICAgICAgICAgICAgICogb3V0OyBzdG9yZSB0aGUgY2h1bmsuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHBuZ19zZXRfdW5rbm93bl9jaHVua3MocG5nX3B0ciwgaW5mb19wdHIsCisgICAgICAgICAgICAgICAmcG5nX3B0ci0+dW5rbm93bl9jaHVuaywgMSk7CisgICAgICAgICAgICBoYW5kbGVkID0gMTsKKyMgIGlmZGVmIFBOR19VU0VSX0xJTUlUU19TVVBQT1JURUQKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorIyAgZW5kaWYKKyAgIH0KKyMgIGVsc2UgLyogbm8gc3RvcmUgc3VwcG9ydDogdGhlIGNodW5rIG11c3QgYmUgaGFuZGxlZCBieSB0aGUgdXNlciBjYWxsYmFjayAqLworICAgUE5HX1VOVVNFRChpbmZvX3B0cikKKyMgIGVuZGlmCisKKyAgIC8qIFJlZ2FyZGxlc3Mgb2YgdGhlIGVycm9yIGhhbmRsaW5nIGJlbG93IHRoZSBjYWNoZWQgZGF0YSAoaWYgYW55KSBjYW4gYmUKKyAgICAqIGZyZWVkIG5vdy4gIE5vdGljZSB0aGF0IHRoZSBkYXRhIGlzIG5vdCBmcmVlZCBpZiB0aGVyZSBpcyBhIHBuZ19lcnJvciwgYnV0CisgICAgKiBpdCB3aWxsIGJlIGZyZWVkIGJ5IGRlc3Ryb3lfcmVhZF9zdHJ1Y3QuCisgICAgKi8KKyAgIGlmIChwbmdfcHRyLT51bmtub3duX2NodW5rLmRhdGEgIT0gTlVMTCkKKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnVua25vd25fY2h1bmsuZGF0YSk7CisgICBwbmdfcHRyLT51bmtub3duX2NodW5rLmRhdGEgPSBOVUxMOworCisjZWxzZSAvKiAhUE5HX1JFQURfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEICovCisgICAvKiBUaGVyZSBpcyBubyBzdXBwb3J0IHRvIHJlYWQgYW4gdW5rbm93biBjaHVuaywgc28ganVzdCBza2lwIGl0LiAqLworICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgIFBOR19VTlVTRUQoaW5mb19wdHIpCisgICBQTkdfVU5VU0VEKGtlZXApCisjZW5kaWYgLyogIVJFQURfVU5LTk9XTl9DSFVOS1MgKi8KKworICAgLyogQ2hlY2sgZm9yIHVuaGFuZGxlZCBjcml0aWNhbCBjaHVua3MgKi8KKyAgIGlmIChoYW5kbGVkID09IDAgJiYgUE5HX0NIVU5LX0NSSVRJQ0FMKHBuZ19wdHItPmNodW5rX25hbWUpKQorICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJ1bmhhbmRsZWQgY3JpdGljYWwgY2h1bmsiKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gdmVyaWZ5IHRoYXQgYSBjaHVuayBuYW1lIGlzIHZhbGlkLgorICogVGhpcyBmdW5jdGlvbiBjYW4ndCBoYXZlIHRoZSAiY3JpdGljYWwgY2h1bmsgY2hlY2siIGluY29ycG9yYXRlZAorICogaW50byBpdCwgc2luY2UgaW4gdGhlIGZ1dHVyZSB3ZSB3aWxsIG5lZWQgdG8gYmUgYWJsZSB0byBjYWxsIHVzZXIKKyAqIGZ1bmN0aW9ucyB0byBoYW5kbGUgdW5rbm93biBjcml0aWNhbCBjaHVua3MgYWZ0ZXIgd2UgY2hlY2sgdGhhdAorICogdGhlIGNodW5rIG5hbWUgaXRzZWxmIGlzIHZhbGlkLgorICovCisKKy8qIEJpdCBoYWNraW5nOiB0aGUgdGVzdCBmb3IgYW4gaW52YWxpZCBieXRlIGluIHRoZSA0IGJ5dGUgY2h1bmsgbmFtZSBpczoKKyAqCisgKiAoKGMpIDwgNjUgfHwgKGMpID4gMTIyIHx8ICgoYykgPiA5MCAmJiAoYykgPCA5NykpCisgKi8KKwordm9pZCAvKiBQUklWQVRFICovCitwbmdfY2hlY2tfY2h1bmtfbmFtZShwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgY2h1bmtfbmFtZSkKK3sKKyAgIGludCBpOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19jaGVja19jaHVua19uYW1lIik7CisKKyAgIGZvciAoaT0xOyBpPD00OyArK2kpCisgICB7CisgICAgICBpbnQgYyA9IGNodW5rX25hbWUgJiAweGZmOworCisgICAgICBpZiAoYyA8IDY1IHx8IGMgPiAxMjIgfHwgKGMgPiA5MCAmJiBjIDwgOTcpKQorICAgICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJpbnZhbGlkIGNodW5rIHR5cGUiKTsKKworICAgICAgY2h1bmtfbmFtZSA+Pj0gODsKKyAgIH0KK30KKworLyogQ29tYmluZXMgdGhlIHJvdyByZWNlbnRseSByZWFkIGluIHdpdGggdGhlIGV4aXN0aW5nIHBpeGVscyBpbiB0aGUgcm93LiAgVGhpcworICogcm91dGluZSB0YWtlcyBjYXJlIG9mIGFscGhhIGFuZCB0cmFuc3BhcmVuY3kgaWYgcmVxdWVzdGVkLiAgVGhpcyByb3V0aW5lIGFsc28KKyAqIGhhbmRsZXMgdGhlIHR3byBtZXRob2RzIG9mIHByb2dyZXNzaXZlIGRpc3BsYXkgb2YgaW50ZXJsYWNlZCBpbWFnZXMsCisgKiBkZXBlbmRpbmcgb24gdGhlICdkaXNwbGF5JyB2YWx1ZTsgaWYgJ2Rpc3BsYXknIGlzIHRydWUgdGhlbiB0aGUgd2hvbGUgcm93CisgKiAoZHApIGlzIGZpbGxlZCBmcm9tIHRoZSBzdGFydCBieSByZXBsaWNhdGluZyB0aGUgYXZhaWxhYmxlIHBpeGVscy4gIElmCisgKiAnZGlzcGxheScgaXMgZmFsc2Ugb25seSB0aG9zZSBwaXhlbHMgcHJlc2VudCBpbiB0aGUgcGFzcyBhcmUgZmlsbGVkIGluLgorICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19jb21iaW5lX3JvdyhwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2J5dGVwIGRwLCBpbnQgZGlzcGxheSkKK3sKKyAgIHVuc2lnbmVkIGludCBwaXhlbF9kZXB0aCA9IHBuZ19wdHItPnRyYW5zZm9ybWVkX3BpeGVsX2RlcHRoOworICAgcG5nX2NvbnN0X2J5dGVwIHNwID0gcG5nX3B0ci0+cm93X2J1ZiArIDE7CisgICBwbmdfYWxsb2Nfc2l6ZV90IHJvd193aWR0aCA9IHBuZ19wdHItPndpZHRoOworICAgdW5zaWduZWQgaW50IHBhc3MgPSBwbmdfcHRyLT5wYXNzOworICAgcG5nX2J5dGVwIGVuZF9wdHIgPSAwOworICAgcG5nX2J5dGUgZW5kX2J5dGUgPSAwOworICAgdW5zaWduZWQgaW50IGVuZF9tYXNrOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19jb21iaW5lX3JvdyIpOworCisgICAvKiBBZGRlZCBpbiAxLjUuNjogaXQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSB0byBlbnRlciB0aGlzIHJvdXRpbmUgdW50aWwgYXQKKyAgICAqIGxlYXN0IG9uZSByb3cgaGFzIGJlZW4gcmVhZCBmcm9tIHRoZSBQTkcgZGF0YSBhbmQgdHJhbnNmb3JtZWQuCisgICAgKi8KKyAgIGlmIChwaXhlbF9kZXB0aCA9PSAwKQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJpbnRlcm5hbCByb3cgbG9naWMgZXJyb3IiKTsKKworICAgLyogQWRkZWQgaW4gMS41LjQ6IHRoZSBwaXhlbCBkZXB0aCBzaG91bGQgbWF0Y2ggdGhlIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5CisgICAgKiBhbnkgY2FsbCB0byBwbmdfcmVhZF91cGRhdGVfaW5mbyBhdCB0aGlzIHBvaW50LiAgRG8gbm90IGNvbnRpbnVlIGlmIHdlIGdvdAorICAgICogdGhpcyB3cm9uZy4KKyAgICAqLworICAgaWYgKHBuZ19wdHItPmluZm9fcm93Ynl0ZXMgIT0gMCAmJiBwbmdfcHRyLT5pbmZvX3Jvd2J5dGVzICE9CisgICAgICAgICAgUE5HX1JPV0JZVEVTKHBpeGVsX2RlcHRoLCByb3dfd2lkdGgpKQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJpbnRlcm5hbCByb3cgc2l6ZSBjYWxjdWxhdGlvbiBlcnJvciIpOworCisgICAvKiBEb24ndCBleHBlY3QgdGhpcyB0byBldmVyIGhhcHBlbjogKi8KKyAgIGlmIChyb3dfd2lkdGggPT0gMCkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiaW50ZXJuYWwgcm93IHdpZHRoIGVycm9yIik7CisKKyAgIC8qIFByZXNlcnZlIHRoZSBsYXN0IGJ5dGUgaW4gY2FzZXMgd2hlcmUgb25seSBwYXJ0IG9mIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4sCisgICAgKiB0aGUgbXVsdGlwbHkgYmVsb3cgbWF5IG92ZXJmbG93LCB3ZSBkb24ndCBjYXJlIGJlY2F1c2UgQU5TSS1DIGd1YXJhbnRlZXMKKyAgICAqIHdlIGdldCB0aGUgbG93IGJpdHMuCisgICAgKi8KKyAgIGVuZF9tYXNrID0gKHBpeGVsX2RlcHRoICogcm93X3dpZHRoKSAmIDc7CisgICBpZiAoZW5kX21hc2sgIT0gMCkKKyAgIHsKKyAgICAgIC8qIGVuZF9wdHIgPT0gTlVMTCBpcyBhIGZsYWcgdG8gc2F5IGRvIG5vdGhpbmcgKi8KKyAgICAgIGVuZF9wdHIgPSBkcCArIFBOR19ST1dCWVRFUyhwaXhlbF9kZXB0aCwgcm93X3dpZHRoKSAtIDE7CisgICAgICBlbmRfYnl0ZSA9ICplbmRfcHRyOworIyAgICAgaWZkZWYgUE5HX1JFQURfUEFDS1NXQVBfU1VQUE9SVEVECisgICAgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLU1dBUCkgIT0gMCkKKyAgICAgICAgIC8qIGxpdHRsZS1lbmRpYW4gYnl0ZSAqLworICAgICAgICAgZW5kX21hc2sgPSAweGZmIDw8IGVuZF9tYXNrOworCisgICAgICBlbHNlIC8qIGJpZy1lbmRpYW4gYnl0ZSAqLworIyAgICAgZW5kaWYKKyAgICAgIGVuZF9tYXNrID0gMHhmZiA+PiBlbmRfbWFzazsKKyAgICAgIC8qIGVuZF9tYXNrIGlzIG5vdyB0aGUgYml0cyB0byAqa2VlcCogZnJvbSB0aGUgZGVzdGluYXRpb24gcm93ICovCisgICB9CisKKyAgIC8qIEZvciBub24taW50ZXJsYWNlZCBpbWFnZXMgdGhpcyByZWR1Y2VzIHRvIGEgbWVtY3B5KCkuIEEgbWVtY3B5KCkKKyAgICAqIHdpbGwgYWxzbyBoYXBwZW4gaWYgaW50ZXJsYWNpbmcgaXNuJ3Qgc3VwcG9ydGVkIG9yIGlmIHRoZSBhcHBsaWNhdGlvbgorICAgICogZG9lcyBub3QgY2FsbCBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZygpLiAgSW4gdGhlIGxhdHRlciBjYXNlcyB0aGUKKyAgICAqIGNhbGxlciBqdXN0IGdldHMgYSBzZXF1ZW5jZSBvZiB0aGUgdW5leHBhbmRlZCByb3dzIGZyb20gZWFjaCBpbnRlcmxhY2UKKyAgICAqIHBhc3MuCisgICAgKi8KKyNpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT5pbnRlcmxhY2VkICE9IDAgJiYKKyAgICAgICAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVEVSTEFDRSkgIT0gMCAmJgorICAgICAgIHBhc3MgPCA2ICYmIChkaXNwbGF5ID09IDAgfHwKKyAgICAgICAvKiBUaGUgZm9sbG93aW5nIGNvcGllcyBldmVyeXRoaW5nIGZvciAnZGlzcGxheScgb24gcGFzc2VzIDAsIDIgYW5kIDQuICovCisgICAgICAgKGRpc3BsYXkgPT0gMSAmJiAocGFzcyAmIDEpICE9IDApKSkKKyAgIHsKKyAgICAgIC8qIE5hcnJvdyBpbWFnZXMgbWF5IGhhdmUgbm8gYml0cyBpbiBhIHBhc3M7IHRoZSBjYWxsZXIgc2hvdWxkIGhhbmRsZQorICAgICAgICogdGhpcywgYnV0IHRoaXMgdGVzdCBpcyBjaGVhcDoKKyAgICAgICAqLworICAgICAgaWYgKHJvd193aWR0aCA8PSBQTkdfUEFTU19TVEFSVF9DT0wocGFzcykpCisgICAgICAgICByZXR1cm47CisKKyAgICAgIGlmIChwaXhlbF9kZXB0aCA8IDgpCisgICAgICB7CisgICAgICAgICAvKiBGb3IgcGl4ZWwgZGVwdGhzIHVwIHRvIDQgYnBwIHRoZSA4LXBpeGVsIG1hc2sgY2FuIGJlIGV4cGFuZGVkIHRvIGZpdAorICAgICAgICAgICogaW50byAzMiBiaXRzLCB0aGVuIGEgc2luZ2xlIGxvb3Agb3ZlciB0aGUgYnl0ZXMgdXNpbmcgdGhlIGZvdXIgYnl0ZQorICAgICAgICAgICogdmFsdWVzIGluIHRoZSAzMi1iaXQgbWFzayBjYW4gYmUgdXNlZC4gIEZvciB0aGUgJ2Rpc3BsYXknIG9wdGlvbiB0aGUKKyAgICAgICAgICAqIGV4cGFuZGVkIG1hc2sgbWF5IGFsc28gbm90IHJlcXVpcmUgYW55IG1hc2tpbmcgd2l0aGluIGEgYnl0ZS4gIFRvCisgICAgICAgICAgKiBtYWtlIHRoaXMgd29yayB0aGUgUEFDS1NXQVAgb3B0aW9uIG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50IC0gaXQKKyAgICAgICAgICAqIHNpbXBseSByZXF1aXJlcyB0aGUgcGl4ZWxzIHRvIGJlIHJldmVyc2VkIGluIGVhY2ggYnl0ZS4KKyAgICAgICAgICAqCisgICAgICAgICAgKiBUaGUgJ3JlZ3VsYXInIGNhc2UgcmVxdWlyZXMgYSBtYXNrIGZvciBlYWNoIG9mIHRoZSBmaXJzdCA2IHBhc3NlcywKKyAgICAgICAgICAqIHRoZSAnZGlzcGxheScgY2FzZSBkb2VzIGEgY29weSBmb3IgdGhlIGV2ZW4gcGFzc2VzIGluIHRoZSByYW5nZQorICAgICAgICAgICogMC4uNi4gIFRoaXMgaGFzIGFscmVhZHkgYmVlbiBoYW5kbGVkIGluIHRoZSB0ZXN0IGFib3ZlLgorICAgICAgICAgICoKKyAgICAgICAgICAqIFRoZSBtYXNrcyBhcmUgYXJyYW5nZWQgYXMgZm91ciBieXRlcyB3aXRoIHRoZSBmaXJzdCBieXRlIHRvIHVzZSBpbgorICAgICAgICAgICogdGhlIGxvd2VzdCBiaXRzIChsaXR0bGUtZW5kaWFuKSByZWdhcmRsZXNzIG9mIHRoZSBvcmRlciAoUEFDS1NXQVAgb3IKKyAgICAgICAgICAqIG5vdCkgb2YgdGhlIHBpeGVscyBpbiBlYWNoIGJ5dGUuCisgICAgICAgICAgKgorICAgICAgICAgICogTk9URTogdGhlIHdob2xlIG9mIHRoaXMgbG9naWMgZGVwZW5kcyBvbiB0aGUgY2FsbGVyIG9mIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgICAqIG9ubHkgY2FsbGluZyBpdCBvbiByb3dzIGFwcHJvcHJpYXRlIHRvIHRoZSBwYXNzLiAgVGhpcyBmdW5jdGlvbiBvbmx5CisgICAgICAgICAgKiB1bmRlcnN0YW5kcyB0aGUgJ3gnIGxvZ2ljOyB0aGUgJ3knIGxvZ2ljIGlzIGhhbmRsZWQgYnkgdGhlIGNhbGxlci4KKyAgICAgICAgICAqCisgICAgICAgICAgKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgYWxsb3cgZ2VuZXJhdGlvbiBvZiBjb21waWxlIHRpbWUgY29uc3RhbnQgYml0CisgICAgICAgICAgKiBtYXNrcyBmb3IgZWFjaCBwaXhlbCBkZXB0aCBhbmQgZWFjaCBwb3NzaWJpbGl0eSBvZiBzd2FwcGVkIG9yIG5vdAorICAgICAgICAgICogc3dhcHBlZCBieXRlcy4gIFBhc3MgJ3AnIGlzIGluIHRoZSByYW5nZSAwLi42OyAneCcsIGEgcGl4ZWwgaW5kZXgsCisgICAgICAgICAgKiBpcyBpbiB0aGUgcmFuZ2UgMC4uNzsgYW5kIHRoZSByZXN1bHQgaXMgMSBpZiB0aGUgcGl4ZWwgaXMgdG8gYmUKKyAgICAgICAgICAqIGNvcGllZCBpbiB0aGUgcGFzcywgMCBpZiBub3QuICAnUycgaXMgZm9yIHRoZSBzcGFya2xlIG1ldGhvZCwgJ0InCisgICAgICAgICAgKiBmb3IgdGhlIGJsb2NrIG1ldGhvZC4KKyAgICAgICAgICAqCisgICAgICAgICAgKiBXaXRoIHNvbWUgY29tcGlsZXJzIGEgY29tcGlsZSB0aW1lIGV4cHJlc3Npb24gb2YgdGhlIGdlbmVyYWwgZm9ybToKKyAgICAgICAgICAqCisgICAgICAgICAgKiAgICAoc2hpZnQgPj0gMzIpID8gKGEgPj4gKHNoaWZ0LTMyKSkgOiAoYiA+PiBzaGlmdCkKKyAgICAgICAgICAqCisgICAgICAgICAgKiBQcm9kdWNlcyB3YXJuaW5ncyB3aXRoIHZhbHVlcyBvZiAnc2hpZnQnIGluIHRoZSByYW5nZSAzMyB0byA2MworICAgICAgICAgICogYmVjYXVzZSB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSA/OiBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBieQorICAgICAgICAgICogdGhlIGNvbXBpbGVyIGV2ZW4gdGhvdWdoIGl0IGlzbid0IHVzZWQuICBNaWNyb3NvZnQgVmlzdWFsIEMgKHZhcmlvdXMKKyAgICAgICAgICAqIHZlcnNpb25zKSBhbmQgdGhlIEludGVsIEMgY29tcGlsZXIgYXJlIGtub3duIHRvIGRvIHRoaXMuICBUbyBhdm9pZAorICAgICAgICAgICogdGhpcyB0aGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgdXNlZCBpbiAxLjUuNi4gIFRoaXMgaXMgYSB0ZW1wb3JhcnkKKyAgICAgICAgICAqIHNvbHV0aW9uIHRvIGF2b2lkIGRlc3RhYmlsaXppbmcgdGhlIGNvZGUgZHVyaW5nIHRoZSByZWxlYXNlIHByb2Nlc3MuCisgICAgICAgICAgKi8KKyMgICAgICAgIGlmIFBOR19VU0VfQ09NUElMRV9USU1FX01BU0tTCisjICAgICAgICAgICBkZWZpbmUgUE5HX0xTUih4LHMpICgoeCk+PigocykgJiAweDFmKSkKKyMgICAgICAgICAgIGRlZmluZSBQTkdfTFNMKHgscykgKCh4KTw8KChzKSAmIDB4MWYpKQorIyAgICAgICAgZWxzZQorIyAgICAgICAgICAgZGVmaW5lIFBOR19MU1IoeCxzKSAoKHgpPj4ocykpCisjICAgICAgICAgICBkZWZpbmUgUE5HX0xTTCh4LHMpICgoeCk8PChzKSkKKyMgICAgICAgIGVuZGlmCisjICAgICAgICBkZWZpbmUgU19DT1BZKHAseCkgKCgocCk8NCA/IFBOR19MU1IoMHg4MDA4ODgyMiwoMy0ocCkpKjgrKDctKHgpKSkgOlwKKyAgICAgICAgICAgUE5HX0xTUigweGFhNTVmZjAwLCg3LShwKSkqOCsoNy0oeCkpKSkgJiAxKQorIyAgICAgICAgZGVmaW5lIEJfQ09QWShwLHgpICgoKHApPDQgPyBQTkdfTFNSKDB4ZmYwZmZmMzMsKDMtKHApKSo4Kyg3LSh4KSkpIDpcCisgICAgICAgICAgIFBOR19MU1IoMHhmZjU1ZmYwMCwoNy0ocCkpKjgrKDctKHgpKSkpICYgMSkKKworICAgICAgICAgLyogUmV0dXJuIGEgbWFzayBmb3IgcGFzcyAncCcgcGl4ZWwgJ3gnIGF0IGRlcHRoICdkJy4gIFRoZSBtYXNrIGlzCisgICAgICAgICAgKiBsaXR0bGUgZW5kaWFuIC0gdGhlIGZpcnN0IHBpeGVsIGlzIGF0IGJpdCAwIC0gaG93ZXZlciB0aGUgZXh0cmEKKyAgICAgICAgICAqIHBhcmFtZXRlciAncycgY2FuIGJlIHNldCB0byBjYXVzZSB0aGUgbWFzayBwb3NpdGlvbiB0byBiZSBzd2FwcGVkCisgICAgICAgICAgKiB3aXRoaW4gZWFjaCBieXRlLCB0byBtYXRjaCB0aGUgUE5HIGZvcm1hdC4gIFRoaXMgaXMgZG9uZSBieSBYT1Igb2YKKyAgICAgICAgICAqIHRoZSBzaGlmdCB3aXRoIDcsIDYgb3IgNCBmb3IgYml0IGRlcHRocyAxLCAyIGFuZCA0LgorICAgICAgICAgICovCisjICAgICAgICBkZWZpbmUgUElYRUxfTUFTSyhwLHgsZCxzKSBcCisgICAgICAgICAgICAoUE5HX0xTTCgoKFBOR19MU0woMVUsKGQpKSktMSksKCgoeCkqKGQpKV4oKHMpPzgtKGQpOjApKSkpCisKKyAgICAgICAgIC8qIEhlbmNlIGdlbmVyYXRlIHRoZSBhcHByb3ByaWF0ZSAnYmxvY2snIG9yICdzcGFya2xlJyBwaXhlbCBjb3B5IG1hc2suCisgICAgICAgICAgKi8KKyMgICAgICAgIGRlZmluZSBTX01BU0t4KHAseCxkLHMpIChTX0NPUFkocCx4KT9QSVhFTF9NQVNLKHAseCxkLHMpOjApCisjICAgICAgICBkZWZpbmUgQl9NQVNLeChwLHgsZCxzKSAoQl9DT1BZKHAseCk/UElYRUxfTUFTSyhwLHgsZCxzKTowKQorCisgICAgICAgICAvKiBDb21iaW5lIDggb2YgdGhlc2UgdG8gZ2V0IHRoZSBmdWxsIG1hc2suICBGb3IgdGhlIDEtYnBwIGFuZCAyLWJwcAorICAgICAgICAgICogY2FzZXMgdGhlIHJlc3VsdCBuZWVkcyByZXBsaWNhdGluZywgZm9yIHRoZSA0LWJwcCBjYXNlIHRoZSBhYm92ZQorICAgICAgICAgICogZ2VuZXJhdGVzIGEgZnVsbCAzMiBiaXRzLgorICAgICAgICAgICovCisjICAgICAgICBkZWZpbmUgTUFTS19FWFBBTkQobSxkKSAoKG0pKigoZCk9PTE/MHgwMTAxMDEwMTooKGQpPT0yPzB4MDAwMTAwMDE6MSkpKQorCisjICAgICAgICBkZWZpbmUgU19NQVNLKHAsZCxzKSBNQVNLX0VYUEFORChTX01BU0t4KHAsMCxkLHMpICsgU19NQVNLeChwLDEsZCxzKSArXAorICAgICAgICAgICAgU19NQVNLeChwLDIsZCxzKSArIFNfTUFTS3gocCwzLGQscykgKyBTX01BU0t4KHAsNCxkLHMpICtcCisgICAgICAgICAgICBTX01BU0t4KHAsNSxkLHMpICsgU19NQVNLeChwLDYsZCxzKSArIFNfTUFTS3gocCw3LGQscyksIGQpCisKKyMgICAgICAgIGRlZmluZSBCX01BU0socCxkLHMpIE1BU0tfRVhQQU5EKEJfTUFTS3gocCwwLGQscykgKyBCX01BU0t4KHAsMSxkLHMpICtcCisgICAgICAgICAgICBCX01BU0t4KHAsMixkLHMpICsgQl9NQVNLeChwLDMsZCxzKSArIEJfTUFTS3gocCw0LGQscykgK1wKKyAgICAgICAgICAgIEJfTUFTS3gocCw1LGQscykgKyBCX01BU0t4KHAsNixkLHMpICsgQl9NQVNLeChwLDcsZCxzKSwgZCkKKworI2lmIFBOR19VU0VfQ09NUElMRV9USU1FX01BU0tTCisgICAgICAgICAvKiBVdGlsaXR5IG1hY3JvcyB0byBjb25zdHJ1Y3QgYWxsIHRoZSBtYXNrcyBmb3IgYSBkZXB0aC9zd2FwCisgICAgICAgICAgKiBjb21iaW5hdGlvbi4gIFRoZSAncycgcGFyYW1ldGVyIHNheXMgd2hldGhlciB0aGUgZm9ybWF0IGlzIFBORworICAgICAgICAgICogKGJpZyBlbmRpYW4gYnl0ZXMpIG9yIG5vdC4gIE9ubHkgdGhlIHRocmVlIG9kZC1udW1iZXJlZCBwYXNzZXMgYXJlCisgICAgICAgICAgKiByZXF1aXJlZCBmb3IgdGhlIGRpc3BsYXkvYmxvY2sgYWxnb3JpdGhtLgorICAgICAgICAgICovCisjICAgICAgICBkZWZpbmUgU19NQVNLUyhkLHMpIHsgU19NQVNLKDAsZCxzKSwgU19NQVNLKDEsZCxzKSwgU19NQVNLKDIsZCxzKSxcCisgICAgICAgICAgICBTX01BU0soMyxkLHMpLCBTX01BU0soNCxkLHMpLCBTX01BU0soNSxkLHMpIH0KKworIyAgICAgICAgZGVmaW5lIEJfTUFTS1MoZCxzKSB7IEJfTUFTSygxLGQscyksIEJfTUFTSygzLGQscyksIEJfTUFTSyg1LGQscykgfQorCisjICAgICAgICBkZWZpbmUgREVQVEhfSU5ERVgoZCkgKChkKT09MT8wOigoZCk9PTI/MToyKSkKKworICAgICAgICAgLyogSGVuY2UgdGhlIHByZS1jb21waWxlZCBtYXNrcyBpbmRleGVkIGJ5IFBBQ0tTV0FQIChvciBub3QpLCBkZXB0aCBhbmQKKyAgICAgICAgICAqIHRoZW4gcGFzczoKKyAgICAgICAgICAqLworICAgICAgICAgc3RhdGljIFBOR19DT05TVCBwbmdfdWludF8zMiByb3dfbWFza1syLypQQUNLU1dBUCovXVszLypkZXB0aCovXVs2XSA9CisgICAgICAgICB7CisgICAgICAgICAgICAvKiBMaXR0bGUtZW5kaWFuIGJ5dGUgbWFza3MgZm9yIFBBQ0tTV0FQICovCisgICAgICAgICAgICB7IFNfTUFTS1MoMSwwKSwgU19NQVNLUygyLDApLCBTX01BU0tTKDQsMCkgfSwKKyAgICAgICAgICAgIC8qIE5vcm1hbCAoYmlnLWVuZGlhbiBieXRlKSBtYXNrcyAtIFBORyBmb3JtYXQgKi8KKyAgICAgICAgICAgIHsgU19NQVNLUygxLDEpLCBTX01BU0tTKDIsMSksIFNfTUFTS1MoNCwxKSB9CisgICAgICAgICB9OworCisgICAgICAgICAvKiBkaXNwbGF5X21hc2sgaGFzIG9ubHkgdGhyZWUgZW50cmllcyBmb3IgdGhlIG9kZCBwYXNzZXMsIHNvIGluZGV4IGJ5CisgICAgICAgICAgKiBwYXNzPj4xLgorICAgICAgICAgICovCisgICAgICAgICBzdGF0aWMgUE5HX0NPTlNUIHBuZ191aW50XzMyIGRpc3BsYXlfbWFza1syXVszXVszXSA9CisgICAgICAgICB7CisgICAgICAgICAgICAvKiBMaXR0bGUtZW5kaWFuIGJ5dGUgbWFza3MgZm9yIFBBQ0tTV0FQICovCisgICAgICAgICAgICB7IEJfTUFTS1MoMSwwKSwgQl9NQVNLUygyLDApLCBCX01BU0tTKDQsMCkgfSwKKyAgICAgICAgICAgIC8qIE5vcm1hbCAoYmlnLWVuZGlhbiBieXRlKSBtYXNrcyAtIFBORyBmb3JtYXQgKi8KKyAgICAgICAgICAgIHsgQl9NQVNLUygxLDEpLCBCX01BU0tTKDIsMSksIEJfTUFTS1MoNCwxKSB9CisgICAgICAgICB9OworCisjICAgICAgICBkZWZpbmUgTUFTSyhwYXNzLGRlcHRoLGRpc3BsYXkscG5nKVwKKyAgICAgICAgICAgICgoZGlzcGxheSk/ZGlzcGxheV9tYXNrW3BuZ11bREVQVEhfSU5ERVgoZGVwdGgpXVtwYXNzPj4xXTpcCisgICAgICAgICAgICAgICByb3dfbWFza1twbmddW0RFUFRIX0lOREVYKGRlcHRoKV1bcGFzc10pCisKKyNlbHNlIC8qICFQTkdfVVNFX0NPTVBJTEVfVElNRV9NQVNLUyAqLworICAgICAgICAgLyogVGhpcyBpcyB0aGUgcnVudGltZSBhbHRlcm5hdGl2ZTogaXQgc2VlbXMgdW5saWtlbHkgdGhhdCB0aGlzIHdpbGwKKyAgICAgICAgICAqIGV2ZXIgYmUgZWl0aGVyIHNtYWxsZXIgb3IgZmFzdGVyIHRoYW4gdGhlIGNvbXBpbGUgdGltZSBhcHByb2FjaC4KKyAgICAgICAgICAqLworIyAgICAgICAgZGVmaW5lIE1BU0socGFzcyxkZXB0aCxkaXNwbGF5LHBuZylcCisgICAgICAgICAgICAoKGRpc3BsYXkpP0JfTUFTSyhwYXNzLGRlcHRoLHBuZyk6U19NQVNLKHBhc3MsZGVwdGgscG5nKSkKKyNlbmRpZiAvKiAhVVNFX0NPTVBJTEVfVElNRV9NQVNLUyAqLworCisgICAgICAgICAvKiBVc2UgdGhlIGFwcHJvcHJpYXRlIG1hc2sgdG8gY29weSB0aGUgcmVxdWlyZWQgYml0cy4gIEluIHNvbWUgY2FzZXMKKyAgICAgICAgICAqIHRoZSBieXRlIG1hc2sgd2lsbCBiZSAwIG9yIDB4ZmY7IG9wdGltaXplIHRoZXNlIGNhc2VzLiAgcm93X3dpZHRoIGlzCisgICAgICAgICAgKiB0aGUgbnVtYmVyIG9mIHBpeGVscywgYnV0IHRoZSBjb2RlIGNvcGllcyBieXRlcywgc28gaXQgaXMgbmVjZXNzYXJ5CisgICAgICAgICAgKiB0byBzcGVjaWFsIGNhc2UgdGhlIGVuZC4KKyAgICAgICAgICAqLworICAgICAgICAgcG5nX3VpbnRfMzIgcGl4ZWxzX3Blcl9ieXRlID0gOCAvIHBpeGVsX2RlcHRoOworICAgICAgICAgcG5nX3VpbnRfMzIgbWFzazsKKworIyAgICAgICAgaWZkZWYgUE5HX1JFQURfUEFDS1NXQVBfU1VQUE9SVEVECisgICAgICAgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLU1dBUCkgIT0gMCkKKyAgICAgICAgICAgIG1hc2sgPSBNQVNLKHBhc3MsIHBpeGVsX2RlcHRoLCBkaXNwbGF5LCAwKTsKKworICAgICAgICAgZWxzZQorIyAgICAgICAgZW5kaWYKKyAgICAgICAgIG1hc2sgPSBNQVNLKHBhc3MsIHBpeGVsX2RlcHRoLCBkaXNwbGF5LCAxKTsKKworICAgICAgICAgZm9yICg7OykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIG07CisKKyAgICAgICAgICAgIC8qIEl0IGRvZXNuJ3QgbWF0dGVyIGluIHRoZSBmb2xsb3dpbmcgaWYgcG5nX3VpbnRfMzIgaGFzIG1vcmUgdGhhbgorICAgICAgICAgICAgICogMzIgYml0cyBiZWNhdXNlIHRoZSBoaWdoIGJpdHMgYWx3YXlzIG1hdGNoIHRob3NlIGluIG08PDI0OyBpdCBpcywKKyAgICAgICAgICAgICAqIGhvd2V2ZXIsIGVzc2VudGlhbCB0byB1c2UgT1IgaGVyZSwgbm90ICssIGJlY2F1c2Ugb2YgdGhpcy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbSA9IG1hc2s7CisgICAgICAgICAgICBtYXNrID0gKG0gPj4gOCkgfCAobSA8PCAyNCk7IC8qIHJvdGF0ZSByaWdodCB0byBnb29kIGNvbXBpbGVycyAqLworICAgICAgICAgICAgbSAmPSAweGZmOworCisgICAgICAgICAgICBpZiAobSAhPSAwKSAvKiBzb21ldGhpbmcgdG8gY29weSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKG0gIT0gMHhmZikKKyAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSkoKCpkcCAmIH5tKSB8ICgqc3AgJiBtKSk7CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAqZHAgPSAqc3A7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIE5PVEU6IHRoaXMgbWF5IG92ZXJ3cml0ZSB0aGUgbGFzdCBieXRlIHdpdGggZ2FyYmFnZSBpZiB0aGUgaW1hZ2UKKyAgICAgICAgICAgICAqIGlzIG5vdCBhbiBleGFjdCBudW1iZXIgb2YgYnl0ZXMgd2lkZTsgbGlicG5nIGhhcyBhbHdheXMgZG9uZQorICAgICAgICAgICAgICogdGhpcy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHJvd193aWR0aCA8PSBwaXhlbHNfcGVyX2J5dGUpCisgICAgICAgICAgICAgICBicmVhazsgLyogTWF5IG5lZWQgdG8gcmVzdG9yZSBwYXJ0IG9mIHRoZSBsYXN0IGJ5dGUgKi8KKworICAgICAgICAgICAgcm93X3dpZHRoIC09IHBpeGVsc19wZXJfYnl0ZTsKKyAgICAgICAgICAgICsrZHA7CisgICAgICAgICAgICArK3NwOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBlbHNlIC8qIHBpeGVsX2RlcHRoID49IDggKi8KKyAgICAgIHsKKyAgICAgICAgIHVuc2lnbmVkIGludCBieXRlc190b19jb3B5LCBieXRlc190b19qdW1wOworCisgICAgICAgICAvKiBWYWxpZGF0ZSB0aGUgZGVwdGggLSBpdCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCAqLworICAgICAgICAgaWYgKHBpeGVsX2RlcHRoICYgNykKKyAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiaW52YWxpZCB1c2VyIHRyYW5zZm9ybSBwaXhlbCBkZXB0aCIpOworCisgICAgICAgICBwaXhlbF9kZXB0aCA+Pj0gMzsgLyogbm93IGluIGJ5dGVzICovCisgICAgICAgICByb3dfd2lkdGggKj0gcGl4ZWxfZGVwdGg7CisKKyAgICAgICAgIC8qIFJlZ2FyZGxlc3Mgb2YgcGFzcyBudW1iZXIgdGhlIEFkYW0gNyBpbnRlcmxhY2UgYWx3YXlzIHJlc3VsdHMgaW4gYQorICAgICAgICAgICogZml4ZWQgbnVtYmVyIG9mIHBpeGVscyB0byBjb3B5IHRoZW4gdG8gc2tpcC4gIFRoZXJlIG1heSBiZSBhCisgICAgICAgICAgKiBkaWZmZXJlbnQgbnVtYmVyIG9mIHBpeGVscyB0byBza2lwIGF0IHRoZSBzdGFydCB0aG91Z2guCisgICAgICAgICAgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQgPSBQTkdfUEFTU19TVEFSVF9DT0wocGFzcykgKiBwaXhlbF9kZXB0aDsKKworICAgICAgICAgICAgcm93X3dpZHRoIC09IG9mZnNldDsKKyAgICAgICAgICAgIGRwICs9IG9mZnNldDsKKyAgICAgICAgICAgIHNwICs9IG9mZnNldDsKKyAgICAgICAgIH0KKworICAgICAgICAgLyogV29yayBvdXQgdGhlIGJ5dGVzIHRvIGNvcHkuICovCisgICAgICAgICBpZiAoZGlzcGxheSAhPSAwKQorICAgICAgICAgeworICAgICAgICAgICAgLyogV2hlbiBkb2luZyB0aGUgJ2Jsb2NrJyBhbGdvcml0aG0gdGhlIHBpeGVsIGluIHRoZSBwYXNzIGdldHMKKyAgICAgICAgICAgICAqIHJlcGxpY2F0ZWQgdG8gYWRqYWNlbnQgcGl4ZWxzLiAgVGhpcyBpcyB3aHkgdGhlIGV2ZW4gKDAsMiw0LDYpCisgICAgICAgICAgICAgKiBwYXNzZXMgYXJlIHNraXBwZWQgYWJvdmUgLSB0aGUgZW50aXJlIGV4cGFuZGVkIHJvdyBpcyBjb3BpZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGJ5dGVzX3RvX2NvcHkgPSAoMTw8KCg2LXBhc3MpPj4xKSkgKiBwaXhlbF9kZXB0aDsKKworICAgICAgICAgICAgLyogQnV0IGRvbid0IGFsbG93IHRoaXMgbnVtYmVyIHRvIGV4Y2VlZCB0aGUgYWN0dWFsIHJvdyB3aWR0aC4gKi8KKyAgICAgICAgICAgIGlmIChieXRlc190b19jb3B5ID4gcm93X3dpZHRoKQorICAgICAgICAgICAgICAgYnl0ZXNfdG9fY29weSA9ICh1bnNpZ25lZCBpbnQpLypTQUZFKi9yb3dfd2lkdGg7CisgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UgLyogbm9ybWFsIHJvdzsgQWRhbTcgb25seSBldmVyIGdpdmVzIHVzIG9uZSBwaXhlbCB0byBjb3B5LiAqLworICAgICAgICAgICAgYnl0ZXNfdG9fY29weSA9IHBpeGVsX2RlcHRoOworCisgICAgICAgICAvKiBJbiBBZGFtNyB0aGVyZSBpcyBhIGNvbnN0YW50IG9mZnNldCBiZXR3ZWVuIHdoZXJlIHRoZSBwaXhlbHMgZ28uICovCisgICAgICAgICBieXRlc190b19qdW1wID0gUE5HX1BBU1NfQ09MX09GRlNFVChwYXNzKSAqIHBpeGVsX2RlcHRoOworCisgICAgICAgICAvKiBBbmQgc2ltcGx5IGNvcHkgdGhlc2UgYnl0ZXMuICBTb21lIG9wdGltaXphdGlvbiBpcyBwb3NzaWJsZSBoZXJlLAorICAgICAgICAgICogZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiAnYnl0ZXNfdG9fY29weScuICBTcGVjaWFsIGNhc2UgdGhlIGxvdworICAgICAgICAgICogYnl0ZSBjb3VudHMsIHdoaWNoIHdlIGtub3cgdG8gYmUgZnJlcXVlbnQuCisgICAgICAgICAgKgorICAgICAgICAgICogTm90aWNlIHRoYXQgdGhlc2UgY2FzZXMgYWxsICdyZXR1cm4nIHJhdGhlciB0aGFuICdicmVhaycgLSB0aGlzCisgICAgICAgICAgKiBhdm9pZHMgYW4gdW5uZWNlc3NhcnkgdGVzdCBvbiB3aGV0aGVyIHRvIHJlc3RvcmUgdGhlIGxhc3QgYnl0ZQorICAgICAgICAgICogYmVsb3cuCisgICAgICAgICAgKi8KKyAgICAgICAgIHN3aXRjaCAoYnl0ZXNfdG9fY29weSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAqZHAgPSAqc3A7CisKKyAgICAgICAgICAgICAgICAgIGlmIChyb3dfd2lkdGggPD0gYnl0ZXNfdG9fanVtcCkKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgICAgZHAgKz0gYnl0ZXNfdG9fanVtcDsKKyAgICAgICAgICAgICAgICAgIHNwICs9IGJ5dGVzX3RvX2p1bXA7CisgICAgICAgICAgICAgICAgICByb3dfd2lkdGggLT0gYnl0ZXNfdG9fanVtcDsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgLyogVGhlcmUgaXMgYSBwb3NzaWJpbGl0eSBvZiBhIHBhcnRpYWwgY29weSBhdCB0aGUgZW5kIGhlcmU7IHRoaXMKKyAgICAgICAgICAgICAgICAqIHNsb3dzIHRoZSBjb2RlIGRvd24gc29tZXdoYXQuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBkcFswXSA9IHNwWzBdLCBkcFsxXSA9IHNwWzFdOworCisgICAgICAgICAgICAgICAgICBpZiAocm93X3dpZHRoIDw9IGJ5dGVzX3RvX2p1bXApCisgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICAgIHNwICs9IGJ5dGVzX3RvX2p1bXA7CisgICAgICAgICAgICAgICAgICBkcCArPSBieXRlc190b19qdW1wOworICAgICAgICAgICAgICAgICAgcm93X3dpZHRoIC09IGJ5dGVzX3RvX2p1bXA7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB3aGlsZSAocm93X3dpZHRoID4gMSk7CisKKyAgICAgICAgICAgICAgIC8qIEFuZCB0aGVyZSBjYW4gb25seSBiZSBvbmUgYnl0ZSBsZWZ0IGF0IHRoaXMgcG9pbnQ6ICovCisgICAgICAgICAgICAgICAqZHAgPSAqc3A7CisgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgIC8qIFRoaXMgY2FuIG9ubHkgYmUgdGhlIFJHQiBjYXNlLCBzbyBlYWNoIGNvcHkgaXMgZXhhY3RseSBvbmUKKyAgICAgICAgICAgICAgICAqIHBpeGVsIGFuZCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNoZWNrIGZvciBhIHBhcnRpYWwgY29weS4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGRwWzBdID0gc3BbMF0sIGRwWzFdID0gc3BbMV0sIGRwWzJdID0gc3BbMl07CisKKyAgICAgICAgICAgICAgICAgIGlmIChyb3dfd2lkdGggPD0gYnl0ZXNfdG9fanVtcCkKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgICAgc3AgKz0gYnl0ZXNfdG9fanVtcDsKKyAgICAgICAgICAgICAgICAgIGRwICs9IGJ5dGVzX3RvX2p1bXA7CisgICAgICAgICAgICAgICAgICByb3dfd2lkdGggLT0gYnl0ZXNfdG9fanVtcDsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDoKKyNpZiBQTkdfQUxJR05fVFlQRSAhPSBQTkdfQUxJR05fTk9ORQorICAgICAgICAgICAgICAgLyogQ2hlY2sgZm9yIGRvdWJsZSBieXRlIGFsaWdubWVudCBhbmQsIGlmIHBvc3NpYmxlLCB1c2UgYQorICAgICAgICAgICAgICAgICogMTYtYml0IGNvcHkuICBEb24ndCBhdHRlbXB0IHRoaXMgZm9yIG5hcnJvdyBpbWFnZXMgLSBvbmVzIHRoYXQKKyAgICAgICAgICAgICAgICAqIGFyZSBsZXNzIHRoYW4gYW4gaW50ZXJsYWNlIHBhbmVsIHdpZGUuICBEb24ndCBhdHRlbXB0IGl0IGZvcgorICAgICAgICAgICAgICAgICogd2lkZSBieXRlc190b19jb3B5IGVpdGhlciAtIHVzZSB0aGUgbWVtY3B5IHRoZXJlLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICBpZiAoYnl0ZXNfdG9fY29weSA8IDE2IC8qZWxzZSB1c2UgbWVtY3B5Ki8gJiYKKyAgICAgICAgICAgICAgICAgICBwbmdfaXNhbGlnbmVkKGRwLCBwbmdfdWludF8xNikgJiYKKyAgICAgICAgICAgICAgICAgICBwbmdfaXNhbGlnbmVkKHNwLCBwbmdfdWludF8xNikgJiYKKyAgICAgICAgICAgICAgICAgICBieXRlc190b19jb3B5ICUgKHNpemVvZiAocG5nX3VpbnRfMTYpKSA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgYnl0ZXNfdG9fanVtcCAlIChzaXplb2YgKHBuZ191aW50XzE2KSkgPT0gMCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIEV2ZXJ5dGhpbmcgaXMgYWxpZ25lZCBmb3IgcG5nX3VpbnRfMTYgY29waWVzLCBidXQgdHJ5IGZvcgorICAgICAgICAgICAgICAgICAgICogcG5nX3VpbnRfMzIgZmlyc3QuCisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChwbmdfaXNhbGlnbmVkKGRwLCBwbmdfdWludF8zMikgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgIHBuZ19pc2FsaWduZWQoc3AsIHBuZ191aW50XzMyKSAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfdG9fY29weSAlIChzaXplb2YgKHBuZ191aW50XzMyKSkgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3RvX2p1bXAgJSAoc2l6ZW9mIChwbmdfdWludF8zMikpID09IDApCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8zMnAgZHAzMiA9IHBuZ19hbGlnbmNhc3QocG5nX3VpbnRfMzJwLGRwKTsKKyAgICAgICAgICAgICAgICAgICAgIHBuZ19jb25zdF91aW50XzMycCBzcDMyID0gcG5nX2FsaWduY2FzdGNvbnN0KAorICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19jb25zdF91aW50XzMycCwgc3ApOworICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNraXAgPSAoYnl0ZXNfdG9fanVtcC1ieXRlc190b19jb3B5KSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZiAocG5nX3VpbnRfMzIpKTsKKworICAgICAgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjID0gYnl0ZXNfdG9fY29weTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAqZHAzMisrID0gKnNwMzIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgLT0gKHNpemVvZiAocG5nX3VpbnRfMzIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjID4gMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3dfd2lkdGggPD0gYnl0ZXNfdG9fanVtcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgICAgICAgICAgZHAzMiArPSBza2lwOworICAgICAgICAgICAgICAgICAgICAgICAgc3AzMiArPSBza2lwOworICAgICAgICAgICAgICAgICAgICAgICAgcm93X3dpZHRoIC09IGJ5dGVzX3RvX2p1bXA7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYnl0ZXNfdG9fY29weSA8PSByb3dfd2lkdGgpOworCisgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdG8gaGVyZSB3aGVuIHRoZSByb3dfd2lkdGggdHJ1bmNhdGVzIHRoZSBmaW5hbCBjb3B5LgorICAgICAgICAgICAgICAgICAgICAgICogVGhlcmUgd2lsbCBiZSAxLTMgYnl0ZXMgbGVmdCB0byBjb3B5LCBzbyBkb24ndCB0cnkgdGhlCisgICAgICAgICAgICAgICAgICAgICAgKiAxNi1iaXQgbG9vcCBiZWxvdy4KKyAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgZHAgPSAocG5nX2J5dGVwKWRwMzI7CisgICAgICAgICAgICAgICAgICAgICBzcCA9IChwbmdfY29uc3RfYnl0ZXApc3AzMjsKKyAgICAgICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgICAgICAgICAqZHArKyA9ICpzcCsrOworICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKC0tcm93X3dpZHRoID4gMCk7CisgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIC8qIEVsc2UgZG8gaXQgaW4gMTYtYml0IHF1YW50aXRpZXMsIGJ1dCBvbmx5IGlmIHRoZSBzaXplIGlzCisgICAgICAgICAgICAgICAgICAgKiBub3QgdG9vIGxhcmdlLgorICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNnAgZHAxNiA9IHBuZ19hbGlnbmNhc3QocG5nX3VpbnRfMTZwLCBkcCk7CisgICAgICAgICAgICAgICAgICAgICBwbmdfY29uc3RfdWludF8xNnAgc3AxNiA9IHBuZ19hbGlnbmNhc3Rjb25zdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19jb25zdF91aW50XzE2cCwgc3ApOworICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNraXAgPSAoYnl0ZXNfdG9fanVtcC1ieXRlc190b19jb3B5KSAvCisgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mIChwbmdfdWludF8xNikpOworCisgICAgICAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGMgPSBieXRlc190b19jb3B5OworICAgICAgICAgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICpkcDE2KysgPSAqc3AxNisrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgYyAtPSAoc2l6ZW9mIChwbmdfdWludF8xNikpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGMgPiAwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvd193aWR0aCA8PSBieXRlc190b19qdW1wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgICAgICAgICBkcDE2ICs9IHNraXA7CisgICAgICAgICAgICAgICAgICAgICAgICBzcDE2ICs9IHNraXA7CisgICAgICAgICAgICAgICAgICAgICAgICByb3dfd2lkdGggLT0gYnl0ZXNfdG9fanVtcDsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChieXRlc190b19jb3B5IDw9IHJvd193aWR0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiByb3cgLSAxIGJ5dGUgbGVmdCwgYnl0ZXNfdG9fY29weSA+IHJvd193aWR0aDogKi8KKyAgICAgICAgICAgICAgICAgICAgIGRwID0gKHBuZ19ieXRlcClkcDE2OworICAgICAgICAgICAgICAgICAgICAgc3AgPSAocG5nX2NvbnN0X2J5dGVwKXNwMTY7CisgICAgICAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgICAgICAgICAgKmRwKysgPSAqc3ArKzsKKyAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgtLXJvd193aWR0aCA+IDApOworICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIEFMSUdOX1RZUEUgY29kZSAqLworCisgICAgICAgICAgICAgICAvKiBUaGUgdHJ1ZSBkZWZhdWx0IC0gdXNlIGEgbWVtY3B5OiAqLworICAgICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIG1lbWNweShkcCwgc3AsIGJ5dGVzX3RvX2NvcHkpOworCisgICAgICAgICAgICAgICAgICBpZiAocm93X3dpZHRoIDw9IGJ5dGVzX3RvX2p1bXApCisgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICAgIHNwICs9IGJ5dGVzX3RvX2p1bXA7CisgICAgICAgICAgICAgICAgICBkcCArPSBieXRlc190b19qdW1wOworICAgICAgICAgICAgICAgICAgcm93X3dpZHRoIC09IGJ5dGVzX3RvX2p1bXA7CisgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXNfdG9fY29weSA+IHJvd193aWR0aCkKKyAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3RvX2NvcHkgPSAodW5zaWduZWQgaW50KS8qU0FGRSovcm93X3dpZHRoOworICAgICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICAvKiBOT1QgUkVBQ0hFRCovCisgICAgICB9IC8qIHBpeGVsX2RlcHRoID49IDggKi8KKworICAgICAgLyogSGVyZSBpZiBwaXhlbF9kZXB0aCA8IDggdG8gY2hlY2sgJ2VuZF9wdHInIGJlbG93LiAqLworICAgfQorICAgZWxzZQorI2VuZGlmIC8qIFJFQURfSU5URVJMQUNJTkcgKi8KKworICAgLyogSWYgaGVyZSB0aGVuIHRoZSBzd2l0Y2ggYWJvdmUgd2Fzbid0IHVzZWQgc28ganVzdCBtZW1jcHkgdGhlIHdob2xlIHJvdworICAgICogZnJvbSB0aGUgdGVtcG9yYXJ5IHJvdyBidWZmZXIgKG5vdGljZSB0aGF0IHRoaXMgb3ZlcndyaXRlcyB0aGUgZW5kIG9mIHRoZQorICAgICogZGVzdGluYXRpb24gcm93IGlmIGl0IGlzIGEgcGFydGlhbCBieXRlLikKKyAgICAqLworICAgbWVtY3B5KGRwLCBzcCwgUE5HX1JPV0JZVEVTKHBpeGVsX2RlcHRoLCByb3dfd2lkdGgpKTsKKworICAgLyogUmVzdG9yZSB0aGUgb3ZlcndyaXR0ZW4gYml0cyBmcm9tIHRoZSBsYXN0IGJ5dGUgaWYgbmVjZXNzYXJ5LiAqLworICAgaWYgKGVuZF9wdHIgIT0gTlVMTCkKKyAgICAgICplbmRfcHRyID0gKHBuZ19ieXRlKSgoZW5kX2J5dGUgJiBlbmRfbWFzaykgfCAoKmVuZF9wdHIgJiB+ZW5kX21hc2spKTsKK30KKworI2lmZGVmIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAordm9pZCAvKiBQUklWQVRFICovCitwbmdfZG9fcmVhZF9pbnRlcmxhY2UocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywgaW50IHBhc3MsCisgICBwbmdfdWludF8zMiB0cmFuc2Zvcm1hdGlvbnMgLyogQmVjYXVzZSB0aGVzZSBtYXkgYWZmZWN0IHRoZSBieXRlIGxheW91dCAqLykKK3sKKyAgIC8qIEFycmF5cyB0byBmYWNpbGl0YXRlIGVhc3kgaW50ZXJsYWNpbmcgLSB1c2UgcGFzcyAoMCAtIDYpIGFzIGluZGV4ICovCisgICAvKiBPZmZzZXQgdG8gbmV4dCBpbnRlcmxhY2UgYmxvY2sgKi8KKyAgIHN0YXRpYyBQTkdfQ09OU1QgaW50IHBuZ19wYXNzX2luY1s3XSA9IHs4LCA4LCA0LCA0LCAyLCAyLCAxfTsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fcmVhZF9pbnRlcmxhY2UiKTsKKyAgIGlmIChyb3cgIT0gTlVMTCAmJiByb3dfaW5mbyAhPSBOVUxMKQorICAgeworICAgICAgcG5nX3VpbnRfMzIgZmluYWxfd2lkdGg7CisKKyAgICAgIGZpbmFsX3dpZHRoID0gcm93X2luZm8tPndpZHRoICogcG5nX3Bhc3NfaW5jW3Bhc3NdOworCisgICAgICBzd2l0Y2ggKHJvd19pbmZvLT5waXhlbF9kZXB0aCkKKyAgICAgIHsKKyAgICAgICAgIGNhc2UgMToKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfc2l6ZV90KSgocm93X2luZm8tPndpZHRoIC0gMSkgPj4gMyk7CisgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3cgKyAocG5nX3NpemVfdCkoKGZpbmFsX3dpZHRoIC0gMSkgPj4gMyk7CisgICAgICAgICAgICBpbnQgc3NoaWZ0LCBkc2hpZnQ7CisgICAgICAgICAgICBpbnQgc19zdGFydCwgc19lbmQsIHNfaW5jOworICAgICAgICAgICAgaW50IGpzdG9wID0gcG5nX3Bhc3NfaW5jW3Bhc3NdOworICAgICAgICAgICAgcG5nX2J5dGUgdjsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIGk7CisgICAgICAgICAgICBpbnQgajsKKworI2lmZGVmIFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRAorICAgICAgICAgICAgaWYgKCh0cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUEFDS1NXQVApICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3NoaWZ0ID0gKGludCkoKHJvd19pbmZvLT53aWR0aCArIDcpICYgMHgwNyk7CisgICAgICAgICAgICAgICAgZHNoaWZ0ID0gKGludCkoKGZpbmFsX3dpZHRoICsgNykgJiAweDA3KTsKKyAgICAgICAgICAgICAgICBzX3N0YXJ0ID0gNzsKKyAgICAgICAgICAgICAgICBzX2VuZCA9IDA7CisgICAgICAgICAgICAgICAgc19pbmMgPSAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3NoaWZ0ID0gNyAtIChpbnQpKChyb3dfaW5mby0+d2lkdGggKyA3KSAmIDB4MDcpOworICAgICAgICAgICAgICAgIGRzaGlmdCA9IDcgLSAoaW50KSgoZmluYWxfd2lkdGggKyA3KSAmIDB4MDcpOworICAgICAgICAgICAgICAgIHNfc3RhcnQgPSAwOworICAgICAgICAgICAgICAgIHNfZW5kID0gNzsKKyAgICAgICAgICAgICAgICBzX2luYyA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfaW5mby0+d2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHYgPSAocG5nX2J5dGUpKCgqc3AgPj4gc3NoaWZ0KSAmIDB4MDEpOworICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGpzdG9wOyBqKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdG1wID0gKmRwICYgKDB4N2Y3ZiA+PiAoNyAtIGRzaGlmdCkpOworICAgICAgICAgICAgICAgICAgdG1wIHw9IHYgPDwgZHNoaWZ0OworICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSh0bXAgJiAweGZmKTsKKworICAgICAgICAgICAgICAgICAgaWYgKGRzaGlmdCA9PSBzX2VuZCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIGRzaGlmdCA9IHNfc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgICBkcC0tOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICBkc2hpZnQgKz0gc19pbmM7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGlmIChzc2hpZnQgPT0gc19lbmQpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzc2hpZnQgPSBzX3N0YXJ0OworICAgICAgICAgICAgICAgICAgc3AtLTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgc3NoaWZ0ICs9IHNfaW5jOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisKKyAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfdWludF8zMikoKHJvd19pbmZvLT53aWR0aCAtIDEpID4+IDIpOworICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93ICsgKHBuZ191aW50XzMyKSgoZmluYWxfd2lkdGggLSAxKSA+PiAyKTsKKyAgICAgICAgICAgIGludCBzc2hpZnQsIGRzaGlmdDsKKyAgICAgICAgICAgIGludCBzX3N0YXJ0LCBzX2VuZCwgc19pbmM7CisgICAgICAgICAgICBpbnQganN0b3AgPSBwbmdfcGFzc19pbmNbcGFzc107CisgICAgICAgICAgICBwbmdfdWludF8zMiBpOworCisjaWZkZWYgUE5HX1JFQURfUEFDS1NXQVBfU1VQUE9SVEVECisgICAgICAgICAgICBpZiAoKHRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLU1dBUCkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNzaGlmdCA9IChpbnQpKCgocm93X2luZm8tPndpZHRoICsgMykgJiAweDAzKSA8PCAxKTsKKyAgICAgICAgICAgICAgIGRzaGlmdCA9IChpbnQpKCgoZmluYWxfd2lkdGggKyAzKSAmIDB4MDMpIDw8IDEpOworICAgICAgICAgICAgICAgc19zdGFydCA9IDY7CisgICAgICAgICAgICAgICBzX2VuZCA9IDA7CisgICAgICAgICAgICAgICBzX2luYyA9IC0yOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNzaGlmdCA9IChpbnQpKCgzIC0gKChyb3dfaW5mby0+d2lkdGggKyAzKSAmIDB4MDMpKSA8PCAxKTsKKyAgICAgICAgICAgICAgIGRzaGlmdCA9IChpbnQpKCgzIC0gKChmaW5hbF93aWR0aCArIDMpICYgMHgwMykpIDw8IDEpOworICAgICAgICAgICAgICAgc19zdGFydCA9IDA7CisgICAgICAgICAgICAgICBzX2VuZCA9IDY7CisgICAgICAgICAgICAgICBzX2luYyA9IDI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfaW5mby0+d2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19ieXRlIHY7CisgICAgICAgICAgICAgICBpbnQgajsKKworICAgICAgICAgICAgICAgdiA9IChwbmdfYnl0ZSkoKCpzcCA+PiBzc2hpZnQpICYgMHgwMyk7CisgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwganN0b3A7IGorKykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0bXAgPSAqZHAgJiAoMHgzZjNmID4+ICg2IC0gZHNoaWZ0KSk7CisgICAgICAgICAgICAgICAgICB0bXAgfD0gdiA8PCBkc2hpZnQ7CisgICAgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpKHRtcCAmIDB4ZmYpOworCisgICAgICAgICAgICAgICAgICBpZiAoZHNoaWZ0ID09IHNfZW5kKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgZHNoaWZ0ID0gc19zdGFydDsKKyAgICAgICAgICAgICAgICAgICAgIGRwLS07CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgIGRzaGlmdCArPSBzX2luYzsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgaWYgKHNzaGlmdCA9PSBzX2VuZCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHNzaGlmdCA9IHNfc3RhcnQ7CisgICAgICAgICAgICAgICAgICBzcC0tOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBzc2hpZnQgKz0gc19pbmM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKworICAgICAgICAgY2FzZSA0OgorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3QpKChyb3dfaW5mby0+d2lkdGggLSAxKSA+PiAxKTsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHJvdyArIChwbmdfc2l6ZV90KSgoZmluYWxfd2lkdGggLSAxKSA+PiAxKTsKKyAgICAgICAgICAgIGludCBzc2hpZnQsIGRzaGlmdDsKKyAgICAgICAgICAgIGludCBzX3N0YXJ0LCBzX2VuZCwgc19pbmM7CisgICAgICAgICAgICBwbmdfdWludF8zMiBpOworICAgICAgICAgICAgaW50IGpzdG9wID0gcG5nX3Bhc3NfaW5jW3Bhc3NdOworCisjaWZkZWYgUE5HX1JFQURfUEFDS1NXQVBfU1VQUE9SVEVECisgICAgICAgICAgICBpZiAoKHRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLU1dBUCkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNzaGlmdCA9IChpbnQpKCgocm93X2luZm8tPndpZHRoICsgMSkgJiAweDAxKSA8PCAyKTsKKyAgICAgICAgICAgICAgIGRzaGlmdCA9IChpbnQpKCgoZmluYWxfd2lkdGggKyAxKSAmIDB4MDEpIDw8IDIpOworICAgICAgICAgICAgICAgc19zdGFydCA9IDQ7CisgICAgICAgICAgICAgICBzX2VuZCA9IDA7CisgICAgICAgICAgICAgICBzX2luYyA9IC00OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNzaGlmdCA9IChpbnQpKCgxIC0gKChyb3dfaW5mby0+d2lkdGggKyAxKSAmIDB4MDEpKSA8PCAyKTsKKyAgICAgICAgICAgICAgIGRzaGlmdCA9IChpbnQpKCgxIC0gKChmaW5hbF93aWR0aCArIDEpICYgMHgwMSkpIDw8IDIpOworICAgICAgICAgICAgICAgc19zdGFydCA9IDA7CisgICAgICAgICAgICAgICBzX2VuZCA9IDQ7CisgICAgICAgICAgICAgICBzX2luYyA9IDQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfaW5mby0+d2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19ieXRlIHYgPSAocG5nX2J5dGUpKCgqc3AgPj4gc3NoaWZ0KSAmIDB4MGYpOworICAgICAgICAgICAgICAgaW50IGo7CisKKyAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBqc3RvcDsgaisrKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRtcCA9ICpkcCAmICgweGYwZiA+PiAoNCAtIGRzaGlmdCkpOworICAgICAgICAgICAgICAgICAgdG1wIHw9IHYgPDwgZHNoaWZ0OworICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSh0bXAgJiAweGZmKTsKKworICAgICAgICAgICAgICAgICAgaWYgKGRzaGlmdCA9PSBzX2VuZCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIGRzaGlmdCA9IHNfc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgICBkcC0tOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICBkc2hpZnQgKz0gc19pbmM7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGlmIChzc2hpZnQgPT0gc19lbmQpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzc2hpZnQgPSBzX3N0YXJ0OworICAgICAgICAgICAgICAgICAgc3AtLTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgc3NoaWZ0ICs9IHNfaW5jOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisKKyAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfc2l6ZV90IHBpeGVsX2J5dGVzID0gKHJvd19pbmZvLT5waXhlbF9kZXB0aCA+PiAzKTsKKworICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3QpKHJvd19pbmZvLT53aWR0aCAtIDEpCisgICAgICAgICAgICAgICAgKiBwaXhlbF9ieXRlczsKKworICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93ICsgKHBuZ19zaXplX3QpKGZpbmFsX3dpZHRoIC0gMSkgKiBwaXhlbF9ieXRlczsKKworICAgICAgICAgICAgaW50IGpzdG9wID0gcG5nX3Bhc3NfaW5jW3Bhc3NdOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd19pbmZvLT53aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX2J5dGUgdls4XTsgLyogU0FGRTsgcGl4ZWxfZGVwdGggZG9lcyBub3QgZXhjZWVkIDY0ICovCisgICAgICAgICAgICAgICBpbnQgajsKKworICAgICAgICAgICAgICAgbWVtY3B5KHYsIHNwLCBwaXhlbF9ieXRlcyk7CisKKyAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBqc3RvcDsgaisrKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgbWVtY3B5KGRwLCB2LCBwaXhlbF9ieXRlcyk7CisgICAgICAgICAgICAgICAgICBkcCAtPSBwaXhlbF9ieXRlczsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgc3AgLT0gcGl4ZWxfYnl0ZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcm93X2luZm8tPndpZHRoID0gZmluYWxfd2lkdGg7CisgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSBQTkdfUk9XQllURVMocm93X2luZm8tPnBpeGVsX2RlcHRoLCBmaW5hbF93aWR0aCk7CisgICB9CisjaWZuZGVmIFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRAorICAgUE5HX1VOVVNFRCh0cmFuc2Zvcm1hdGlvbnMpICAvKiBTaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmcgKi8KKyNlbmRpZgorfQorI2VuZGlmIC8qIFJFQURfSU5URVJMQUNJTkcgKi8KKworc3RhdGljIHZvaWQKK3BuZ19yZWFkX2ZpbHRlcl9yb3dfc3ViKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csCisgICBwbmdfY29uc3RfYnl0ZXAgcHJldl9yb3cpCit7CisgICBwbmdfc2l6ZV90IGk7CisgICBwbmdfc2l6ZV90IGlzdG9wID0gcm93X2luZm8tPnJvd2J5dGVzOworICAgdW5zaWduZWQgaW50IGJwcCA9IChyb3dfaW5mby0+cGl4ZWxfZGVwdGggKyA3KSA+PiAzOworICAgcG5nX2J5dGVwIHJwID0gcm93ICsgYnBwOworCisgICBQTkdfVU5VU0VEKHByZXZfcm93KQorCisgICBmb3IgKGkgPSBicHA7IGkgPCBpc3RvcDsgaSsrKQorICAgeworICAgICAgKnJwID0gKHBuZ19ieXRlKSgoKGludCkoKnJwKSArIChpbnQpKCoocnAtYnBwKSkpICYgMHhmZik7CisgICAgICBycCsrOworICAgfQorfQorCitzdGF0aWMgdm9pZAorcG5nX3JlYWRfZmlsdGVyX3Jvd191cChwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LAorICAgcG5nX2NvbnN0X2J5dGVwIHByZXZfcm93KQoreworICAgcG5nX3NpemVfdCBpOworICAgcG5nX3NpemVfdCBpc3RvcCA9IHJvd19pbmZvLT5yb3dieXRlczsKKyAgIHBuZ19ieXRlcCBycCA9IHJvdzsKKyAgIHBuZ19jb25zdF9ieXRlcCBwcCA9IHByZXZfcm93OworCisgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrKykKKyAgIHsKKyAgICAgICpycCA9IChwbmdfYnl0ZSkoKChpbnQpKCpycCkgKyAoaW50KSgqcHArKykpICYgMHhmZik7CisgICAgICBycCsrOworICAgfQorfQorCitzdGF0aWMgdm9pZAorcG5nX3JlYWRfZmlsdGVyX3Jvd19hdmcocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywKKyAgIHBuZ19jb25zdF9ieXRlcCBwcmV2X3JvdykKK3sKKyAgIHBuZ19zaXplX3QgaTsKKyAgIHBuZ19ieXRlcCBycCA9IHJvdzsKKyAgIHBuZ19jb25zdF9ieXRlcCBwcCA9IHByZXZfcm93OworICAgdW5zaWduZWQgaW50IGJwcCA9IChyb3dfaW5mby0+cGl4ZWxfZGVwdGggKyA3KSA+PiAzOworICAgcG5nX3NpemVfdCBpc3RvcCA9IHJvd19pbmZvLT5yb3dieXRlcyAtIGJwcDsKKworICAgZm9yIChpID0gMDsgaSA8IGJwcDsgaSsrKQorICAgeworICAgICAgKnJwID0gKHBuZ19ieXRlKSgoKGludCkoKnJwKSArCisgICAgICAgICAoKGludCkoKnBwKyspIC8gMiApKSAmIDB4ZmYpOworCisgICAgICBycCsrOworICAgfQorCisgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrKykKKyAgIHsKKyAgICAgICpycCA9IChwbmdfYnl0ZSkoKChpbnQpKCpycCkgKworICAgICAgICAgKGludCkoKnBwKysgKyAqKHJwLWJwcCkpIC8gMiApICYgMHhmZik7CisKKyAgICAgIHJwKys7CisgICB9Cit9CisKK3N0YXRpYyB2b2lkCitwbmdfcmVhZF9maWx0ZXJfcm93X3BhZXRoXzFieXRlX3BpeGVsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csCisgICBwbmdfY29uc3RfYnl0ZXAgcHJldl9yb3cpCit7CisgICBwbmdfYnl0ZXAgcnBfZW5kID0gcm93ICsgcm93X2luZm8tPnJvd2J5dGVzOworICAgaW50IGEsIGM7CisKKyAgIC8qIEZpcnN0IHBpeGVsL2J5dGUgKi8KKyAgIGMgPSAqcHJldl9yb3crKzsKKyAgIGEgPSAqcm93ICsgYzsKKyAgICpyb3crKyA9IChwbmdfYnl0ZSlhOworCisgICAvKiBSZW1haW5kZXIgKi8KKyAgIHdoaWxlIChyb3cgPCBycF9lbmQpCisgICB7CisgICAgICBpbnQgYiwgcGEsIHBiLCBwYywgcDsKKworICAgICAgYSAmPSAweGZmOyAvKiBGcm9tIHByZXZpb3VzIGl0ZXJhdGlvbiBvciBzdGFydCAqLworICAgICAgYiA9ICpwcmV2X3JvdysrOworCisgICAgICBwID0gYiAtIGM7CisgICAgICBwYyA9IGEgLSBjOworCisjaWZkZWYgUE5HX1VTRV9BQlMKKyAgICAgIHBhID0gYWJzKHApOworICAgICAgcGIgPSBhYnMocGMpOworICAgICAgcGMgPSBhYnMocCArIHBjKTsKKyNlbHNlCisgICAgICBwYSA9IHAgPCAwID8gLXAgOiBwOworICAgICAgcGIgPSBwYyA8IDAgPyAtcGMgOiBwYzsKKyAgICAgIHBjID0gKHAgKyBwYykgPCAwID8gLShwICsgcGMpIDogcCArIHBjOworI2VuZGlmCisKKyAgICAgIC8qIEZpbmQgdGhlIGJlc3QgcHJlZGljdG9yLCB0aGUgbGVhc3Qgb2YgcGEsIHBiLCBwYyBmYXZvcmluZyB0aGUgZWFybGllcgorICAgICAgICogb25lcyBpbiB0aGUgY2FzZSBvZiBhIHRpZS4KKyAgICAgICAqLworICAgICAgaWYgKHBiIDwgcGEpIHBhID0gcGIsIGEgPSBiOworICAgICAgaWYgKHBjIDwgcGEpIGEgPSBjOworCisgICAgICAvKiBDYWxjdWxhdGUgdGhlIGN1cnJlbnQgcGl4ZWwgaW4gYSwgYW5kIG1vdmUgdGhlIHByZXZpb3VzIHJvdyBwaXhlbCB0byBjCisgICAgICAgKiBmb3IgdGhlIG5leHQgdGltZSByb3VuZCB0aGUgbG9vcAorICAgICAgICovCisgICAgICBjID0gYjsKKyAgICAgIGEgKz0gKnJvdzsKKyAgICAgICpyb3crKyA9IChwbmdfYnl0ZSlhOworICAgfQorfQorCitzdGF0aWMgdm9pZAorcG5nX3JlYWRfZmlsdGVyX3Jvd19wYWV0aF9tdWx0aWJ5dGVfcGl4ZWwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywKKyAgIHBuZ19jb25zdF9ieXRlcCBwcmV2X3JvdykKK3sKKyAgIGludCBicHAgPSAocm93X2luZm8tPnBpeGVsX2RlcHRoICsgNykgPj4gMzsKKyAgIHBuZ19ieXRlcCBycF9lbmQgPSByb3cgKyBicHA7CisKKyAgIC8qIFByb2Nlc3MgdGhlIGZpcnN0IHBpeGVsIGluIHRoZSByb3cgY29tcGxldGVseSAodGhpcyBpcyB0aGUgc2FtZSBhcyAndXAnCisgICAgKiBiZWNhdXNlIHRoZXJlIGlzIG9ubHkgb25lIGNhbmRpZGF0ZSBwcmVkaWN0b3IgZm9yIHRoZSBmaXJzdCByb3cpLgorICAgICovCisgICB3aGlsZSAocm93IDwgcnBfZW5kKQorICAgeworICAgICAgaW50IGEgPSAqcm93ICsgKnByZXZfcm93Kys7CisgICAgICAqcm93KysgPSAocG5nX2J5dGUpYTsKKyAgIH0KKworICAgLyogUmVtYWluZGVyICovCisgICBycF9lbmQgKz0gcm93X2luZm8tPnJvd2J5dGVzIC0gYnBwOworCisgICB3aGlsZSAocm93IDwgcnBfZW5kKQorICAgeworICAgICAgaW50IGEsIGIsIGMsIHBhLCBwYiwgcGMsIHA7CisKKyAgICAgIGMgPSAqKHByZXZfcm93IC0gYnBwKTsKKyAgICAgIGEgPSAqKHJvdyAtIGJwcCk7CisgICAgICBiID0gKnByZXZfcm93Kys7CisKKyAgICAgIHAgPSBiIC0gYzsKKyAgICAgIHBjID0gYSAtIGM7CisKKyNpZmRlZiBQTkdfVVNFX0FCUworICAgICAgcGEgPSBhYnMocCk7CisgICAgICBwYiA9IGFicyhwYyk7CisgICAgICBwYyA9IGFicyhwICsgcGMpOworI2Vsc2UKKyAgICAgIHBhID0gcCA8IDAgPyAtcCA6IHA7CisgICAgICBwYiA9IHBjIDwgMCA/IC1wYyA6IHBjOworICAgICAgcGMgPSAocCArIHBjKSA8IDAgPyAtKHAgKyBwYykgOiBwICsgcGM7CisjZW5kaWYKKworICAgICAgaWYgKHBiIDwgcGEpIHBhID0gcGIsIGEgPSBiOworICAgICAgaWYgKHBjIDwgcGEpIGEgPSBjOworCisgICAgICBhICs9ICpyb3c7CisgICAgICAqcm93KysgPSAocG5nX2J5dGUpYTsKKyAgIH0KK30KKworc3RhdGljIHZvaWQKK3BuZ19pbml0X2ZpbHRlcl9mdW5jdGlvbnMocG5nX3N0cnVjdHJwIHBwKQorICAgLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IgZXZlcnkgUE5HIGltYWdlIChleGNlcHQgZm9yIFBORyBpbWFnZXMKKyAgICAqIHRoYXQgb25seSB1c2UgUE5HX0ZJTFRFUl9WQUxVRV9OT05FIGZvciBhbGwgcm93cykgdG8gc2V0IHRoZQorICAgICogaW1wbGVtZW50YXRpb25zIHJlcXVpcmVkIHRvIHJldmVyc2UgdGhlIGZpbHRlcmluZyBvZiBQTkcgcm93cy4gIFJldmVyc2luZworICAgICogdGhlIGZpbHRlciBpcyB0aGUgZmlyc3QgdHJhbnNmb3JtYXRpb24gcGVyZm9ybWVkIG9uIHRoZSByb3cgZGF0YS4gIEl0IGlzCisgICAgKiBwZXJmb3JtZWQgaW4gcGxhY2UsIHRoZXJlZm9yZSBhbiBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgc2VsZWN0ZWQgYmFzZWQgb24KKyAgICAqIHRoZSBpbWFnZSBwaXhlbCBmb3JtYXQuICBJZiB0aGUgaW1wbGVtZW50YXRpb24gZGVwZW5kcyBvbiBpbWFnZSB3aWR0aCB0aGVuCisgICAgKiB0YWtlIGNhcmUgdG8gZW5zdXJlIHRoYXQgaXQgd29ya3MgY29ycmVjdGx5IGlmIHRoZSBpbWFnZSBpcyBpbnRlcmxhY2VkIC0KKyAgICAqIGludGVybGFjaW5nIGNhdXNlcyB0aGUgYWN0dWFsIHJvdyB3aWR0aCB0byB2YXJ5LgorICAgICovCit7CisgICB1bnNpZ25lZCBpbnQgYnBwID0gKHBwLT5waXhlbF9kZXB0aCArIDcpID4+IDM7CisKKyAgIHBwLT5yZWFkX2ZpbHRlcltQTkdfRklMVEVSX1ZBTFVFX1NVQi0xXSA9IHBuZ19yZWFkX2ZpbHRlcl9yb3dfc3ViOworICAgcHAtPnJlYWRfZmlsdGVyW1BOR19GSUxURVJfVkFMVUVfVVAtMV0gPSBwbmdfcmVhZF9maWx0ZXJfcm93X3VwOworICAgcHAtPnJlYWRfZmlsdGVyW1BOR19GSUxURVJfVkFMVUVfQVZHLTFdID0gcG5nX3JlYWRfZmlsdGVyX3Jvd19hdmc7CisgICBpZiAoYnBwID09IDEpCisgICAgICBwcC0+cmVhZF9maWx0ZXJbUE5HX0ZJTFRFUl9WQUxVRV9QQUVUSC0xXSA9CisgICAgICAgICBwbmdfcmVhZF9maWx0ZXJfcm93X3BhZXRoXzFieXRlX3BpeGVsOworICAgZWxzZQorICAgICAgcHAtPnJlYWRfZmlsdGVyW1BOR19GSUxURVJfVkFMVUVfUEFFVEgtMV0gPQorICAgICAgICAgcG5nX3JlYWRfZmlsdGVyX3Jvd19wYWV0aF9tdWx0aWJ5dGVfcGl4ZWw7CisKKyNpZmRlZiBQTkdfRklMVEVSX09QVElNSVpBVElPTlMKKyAgIC8qIFRvIHVzZSB0aGlzIGRlZmluZSBQTkdfRklMVEVSX09QVElNSVpBVElPTlMgYXMgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiB0bworICAgICogY2FsbCB0byBpbnN0YWxsIGhhcmR3YXJlIG9wdGltaXphdGlvbnMgZm9yIHRoZSBhYm92ZSBmdW5jdGlvbnM7IHNpbXBseQorICAgICogcmVwbGFjZSB3aGF0ZXZlciBlbGVtZW50cyBvZiB0aGUgcHAtPnJlYWRfZmlsdGVyW10gYXJyYXkgd2l0aCBhIGhhcmR3YXJlCisgICAgKiBzcGVjaWZpYyAob3IsIGZvciB0aGF0IG1hdHRlciwgZ2VuZXJpYykgb3B0aW1pemF0aW9uLgorICAgICoKKyAgICAqIFRvIHNlZSBhbiBleGFtcGxlIG9mIHRoaXMgZXhhbWluZSB3aGF0IGNvbmZpZ3VyZS5hYyBkb2VzIHdoZW4KKyAgICAqIC0tZW5hYmxlLWFybS1uZW9uIGlzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorICAgICovCisgICBQTkdfRklMVEVSX09QVElNSVpBVElPTlMocHAsIGJwcCk7CisjZW5kaWYKK30KKwordm9pZCAvKiBQUklWQVRFICovCitwbmdfcmVhZF9maWx0ZXJfcm93KHBuZ19zdHJ1Y3RycCBwcCwgcG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywKKyAgIHBuZ19jb25zdF9ieXRlcCBwcmV2X3JvdywgaW50IGZpbHRlcikKK3sKKyAgIC8qIE9QVElNSVpBVElPTjogRE8gTk9UIE1PRElGWSBUSElTIEZVTkNUSU9OLCBpbnN0ZWFkICNkZWZpbmUKKyAgICAqIFBOR19GSUxURVJfT1BUSU1JWkFUSU9OUyB0byBhIGZ1bmN0aW9uIHRoYXQgb3ZlcnJpZGVzIHRoZSBnZW5lcmljCisgICAgKiBpbXBsZW1lbnRhdGlvbnMuICBTZWUgcG5nX2luaXRfZmlsdGVyX2Z1bmN0aW9ucyBhYm92ZS4KKyAgICAqLworICAgaWYgKGZpbHRlciA+IFBOR19GSUxURVJfVkFMVUVfTk9ORSAmJiBmaWx0ZXIgPCBQTkdfRklMVEVSX1ZBTFVFX0xBU1QpCisgICB7CisgICAgICBpZiAocHAtPnJlYWRfZmlsdGVyWzBdID09IE5VTEwpCisgICAgICAgICBwbmdfaW5pdF9maWx0ZXJfZnVuY3Rpb25zKHBwKTsKKworICAgICAgcHAtPnJlYWRfZmlsdGVyW2ZpbHRlci0xXShyb3dfaW5mbywgcm93LCBwcmV2X3Jvdyk7CisgICB9Cit9CisKKyNpZmRlZiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRAordm9pZCAvKiBQUklWQVRFICovCitwbmdfcmVhZF9JREFUX2RhdGEocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19ieXRlcCBvdXRwdXQsCisgICBwbmdfYWxsb2Nfc2l6ZV90IGF2YWlsX291dCkKK3sKKyAgIC8qIExvb3AgcmVhZGluZyBJREFUcyBhbmQgZGVjb21wcmVzc2luZyB0aGUgcmVzdWx0IGludG8gb3V0cHV0W2F2YWlsX291dF0gKi8KKyAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBvdXRwdXQ7CisgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9IDA7IC8qIHNhZmV0eTogc2V0IGJlbG93ICovCisKKyAgIGlmIChvdXRwdXQgPT0gTlVMTCkKKyAgICAgIGF2YWlsX291dCA9IDA7CisKKyAgIGRvCisgICB7CisgICAgICBpbnQgcmV0OworICAgICAgcG5nX2J5dGUgdG1wYnVmW1BOR19JTkZMQVRFX0JVRl9TSVpFXTsKKworICAgICAgaWYgKHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPT0gMCkKKyAgICAgIHsKKyAgICAgICAgIHVJbnQgYXZhaWxfaW47CisgICAgICAgICBwbmdfYnl0ZXAgYnVmZmVyOworCisgICAgICAgICB3aGlsZSAocG5nX3B0ci0+aWRhdF9zaXplID09IDApCisgICAgICAgICB7CisjaWZkZWYgUE5HX0lOREVYX1NVUFBPUlRFRAorICAgICAgICAgICAgaWYgKHBuZ19wdHItPmluZGV4KSB7CisgICAgICAgICAgICAgICBwbmdfb3B0X2NyY19maW5pc2gocG5nX3B0ciwgMCk7CisgICAgICAgICAgICAgICBwbmdfcHRyLT5pbmRleC0+c3RyZWFtX2lkYXRfcG9zaXRpb24gPSBwbmdfcHRyLT50b3RhbF9kYXRhX3JlYWQ7CisgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCk7CisKKyAgICAgICAgICAgIHBuZ19wdHItPmlkYXRfc2l6ZSA9IHBuZ19yZWFkX2NodW5rX2hlYWRlcihwbmdfcHRyKTsKKyAgICAgICAgICAgIC8qIFRoaXMgaXMgYW4gZXJyb3IgZXZlbiBpbiB0aGUgJ2NoZWNrJyBjYXNlIGJlY2F1c2UgdGhlIGNvZGUganVzdAorICAgICAgICAgICAgICogY29uc3VtZWQgYSBub24tSURBVCBoZWFkZXIuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT5jaHVua19uYW1lICE9IHBuZ19JREFUKQorICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJOb3QgZW5vdWdoIGltYWdlIGRhdGEiKTsKKyAgICAgICAgIH0KKworICAgICAgICAgYXZhaWxfaW4gPSBwbmdfcHRyLT5JREFUX3JlYWRfc2l6ZTsKKworICAgICAgICAgaWYgKGF2YWlsX2luID4gcG5nX3B0ci0+aWRhdF9zaXplKQorICAgICAgICAgICAgYXZhaWxfaW4gPSAodUludClwbmdfcHRyLT5pZGF0X3NpemU7CisKKyAgICAgICAgIC8qIEEgUE5HIHdpdGggYSBncmFkdWFsbHkgaW5jcmVhc2luZyBJREFUIHNpemUgd2lsbCBkZWZlYXQgdGhpcyBhdHRlbXB0CisgICAgICAgICAgKiB0byBtaW5pbWl6ZSBtZW1vcnkgdXNhZ2UgYnkgY2F1c2luZyBsb3RzIG9mIHJlLWFsbG9jcywgYnV0CisgICAgICAgICAgKiByZWFsaXN0aWNhbGx5IGRvaW5nIElEQVRfcmVhZF9zaXplIHJlLWFsbG9jcyBpcyBub3QgbGlrZWx5IHRvIGJlIGEKKyAgICAgICAgICAqIGJpZyBwcm9ibGVtLgorICAgICAgICAgICovCisgICAgICAgICBidWZmZXIgPSBwbmdfcmVhZF9idWZmZXIocG5nX3B0ciwgYXZhaWxfaW4sIDAvKmVycm9yKi8pOworCisgICAgICAgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmZmVyLCBhdmFpbF9pbik7CisgICAgICAgICBwbmdfcHRyLT5pZGF0X3NpemUgLT0gYXZhaWxfaW47CisKKyAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9pbiA9IGJ1ZmZlcjsKKyAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPSBhdmFpbF9pbjsKKyAgICAgIH0KKworICAgICAgLyogQW5kIHNldCB1cCB0aGUgb3V0cHV0IHNpZGUuICovCisgICAgICBpZiAob3V0cHV0ICE9IE5VTEwpIC8qIHN0YW5kYXJkIHJlYWQgKi8KKyAgICAgIHsKKyAgICAgICAgIHVJbnQgb3V0ID0gWkxJQl9JT19NQVg7CisKKyAgICAgICAgIGlmIChvdXQgPiBhdmFpbF9vdXQpCisgICAgICAgICAgICBvdXQgPSAodUludClhdmFpbF9vdXQ7CisKKyAgICAgICAgIGF2YWlsX291dCAtPSBvdXQ7CisgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9IG91dDsKKyAgICAgIH0KKworICAgICAgZWxzZSAvKiBhZnRlciBsYXN0IHJvdywgY2hlY2tpbmcgZm9yIGVuZCAqLworICAgICAgeworICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X291dCA9IHRtcGJ1ZjsKKyAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gKHNpemVvZiB0bXBidWYpOworICAgICAgfQorCisgICAgICAvKiBVc2UgTk9fRkxVU0g7IHRoaXMgZ2l2ZXMgemxpYiB0aGUgbWF4aW11bSBvcHBvcnR1bml0eSB0byBvcHRpbWl6ZSB0aGUKKyAgICAgICAqIHByb2Nlc3MuICBJZiB0aGUgTFogc3RyZWFtIGlzIHRydW5jYXRlZCB0aGUgc2VxdWVudGlhbCByZWFkZXIgd2lsbAorICAgICAgICogdGVybWluYWxseSBkYW1hZ2UgdGhlIHN0cmVhbSwgYWJvdmUsIGJ5IHJlYWRpbmcgdGhlIGNodW5rIGhlYWRlciBvZiB0aGUKKyAgICAgICAqIGZvbGxvd2luZyBjaHVuayAoaXQgdGhlbiBleGl0cyB3aXRoIHBuZ19lcnJvcikuCisgICAgICAgKgorICAgICAgICogVE9ETzogZGVhbCBtb3JlIGVsZWdhbnRseSB3aXRoIHRydW5jYXRlZCBJREFUIGxpc3RzLgorICAgICAgICovCisgICAgICByZXQgPSBQTkdfSU5GTEFURShwbmdfcHRyLCBaX05PX0ZMVVNIKTsKKworICAgICAgLyogVGFrZSB0aGUgdW5jb25zdW1lZCBvdXRwdXQgYmFjay4gKi8KKyAgICAgIGlmIChvdXRwdXQgIT0gTlVMTCkKKyAgICAgICAgIGF2YWlsX291dCArPSBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dDsKKworICAgICAgZWxzZSAvKiBhdmFpbF9vdXQgY291bnRzIHRoZSBleHRyYSBieXRlcyAqLworICAgICAgICAgYXZhaWxfb3V0ICs9IChzaXplb2YgdG1wYnVmKSAtIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0OworCisgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9IDA7CisKKyAgICAgIGlmIChyZXQgPT0gWl9TVFJFQU1fRU5EKQorICAgICAgeworICAgICAgICAgLyogRG8gdGhpcyBmb3Igc2FmZXR5OyB3ZSB3b24ndCByZWFkIGFueSBtb3JlIGludG8gdGhpcyByb3cuICovCisgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gTlVMTDsKKworICAgICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfQUZURVJfSURBVDsKKyAgICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX1pTVFJFQU1fRU5ERUQ7CisKKyAgICAgICAgIGlmIChwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luID4gMCB8fCBwbmdfcHRyLT5pZGF0X3NpemUgPiAwKQorICAgICAgICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiRXh0cmEgY29tcHJlc3NlZCBkYXRhIik7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKHJldCAhPSBaX09LKSB7CisjaWZkZWYgUE5HX0lOREVYX1NVUFBPUlRFRAorICAgICAgICBpZiAocG5nX3B0ci0+aW5kZXgpIHsKKyAgICAgICAgICBpZiAocG5nX3B0ci0+cm93X251bWJlciAhPSBwbmdfcHRyLT5oZWlnaHQgLSAxKSB7CisgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgcG5nX3B0ci0+enN0cmVhbS5tc2cgPyBwbmdfcHRyLT56c3RyZWFtLm1zZyA6ICJEZWNvbXByZXNzaW9uIGVycm9yIik7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgeworICAgICAgICAgcG5nX3pzdHJlYW1fZXJyb3IocG5nX3B0ciwgcmV0KTsKKworICAgICAgICAgaWYgKG91dHB1dCAhPSBOVUxMKQorICAgICAgICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsIHBuZ19wdHItPnpzdHJlYW0ubXNnKTsKKworICAgICAgICAgZWxzZSAvKiBjaGVja2luZyAqLworICAgICAgICAgeworICAgICAgICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCBwbmdfcHRyLT56c3RyZWFtLm1zZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgfSB3aGlsZSAoYXZhaWxfb3V0ID4gMCk7CisKKyAgIGlmIChhdmFpbF9vdXQgPiAwKQorICAgeworICAgICAgLyogVGhlIHN0cmVhbSBlbmRlZCBiZWZvcmUgdGhlIGltYWdlOyB0aGlzIGlzIHRoZSBzYW1lIGFzIHRvbyBmZXcgSURBVHMgc28KKyAgICAgICAqIHNob3VsZCBiZSBoYW5kbGVkIHRoZSBzYW1lIHdheS4KKyAgICAgICAqLworICAgICAgaWYgKG91dHB1dCAhPSBOVUxMKQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJOb3QgZW5vdWdoIGltYWdlIGRhdGEiKTsKKworICAgICAgZWxzZSAvKiB0aGUgZGVmbGF0ZSBzdHJlYW0gY29udGFpbmVkIGV4dHJhIGRhdGEgKi8KKyAgICAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIlRvbyBtdWNoIGltYWdlIGRhdGEiKTsKKyAgIH0KK30KKwordm9pZCAvKiBQUklWQVRFICovCitwbmdfcmVhZF9maW5pc2hfSURBVChwbmdfc3RydWN0cnAgcG5nX3B0cikKK3sKKyAgIC8qIFdlIGRvbid0IG5lZWQgYW55IG1vcmUgZGF0YSBhbmQgdGhlIHN0cmVhbSBzaG91bGQgaGF2ZSBlbmRlZCwgaG93ZXZlciB0aGUKKyAgICAqIExaIGVuZCBjb2RlIG1heSBhY3R1YWxseSBub3QgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gIEluIHRoaXMgY2FzZSB3ZSBtdXN0CisgICAgKiByZWFkIGl0IG90aGVyd2lzZSBzdHJheSB1bnJlYWQgSURBVCBkYXRhIG9yLCBtb3JlIGxpa2VseSwgYW4gSURBVCBjaHVuaworICAgICogbWF5IHN0aWxsIHJlbWFpbiB0byBiZSBjb25zdW1lZC4KKyAgICAqLworICAgaWYgKChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX1pTVFJFQU1fRU5ERUQpID09IDApCisgICB7CisgICAgICAvKiBUaGUgTlVMTCBjYXVzZXMgcG5nX3JlYWRfSURBVF9kYXRhIHRvIHN3YWxsb3cgYW55IHJlbWFpbmluZyBieXRlcyBpbgorICAgICAgICogdGhlIGNvbXByZXNzZWQgc3RyZWFtLCBidXQgdGhlIHN0cmVhbSBtYXkgYmUgZGFtYWdlZCB0b28sIHNvIGV2ZW4gYWZ0ZXIKKyAgICAgICAqIHRoaXMgY2FsbCB3ZSBtYXkgbmVlZCB0byB0ZXJtaW5hdGUgdGhlIHpzdHJlYW0gb3duZXJzaGlwLgorICAgICAgICovCisgICAgICBwbmdfcmVhZF9JREFUX2RhdGEocG5nX3B0ciwgTlVMTCwgMCk7CisgICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gTlVMTDsgLyogc2FmZXR5ICovCisKKyAgICAgIC8qIE5vdyBjbGVhciBldmVyeXRoaW5nIG91dCBmb3Igc2FmZXR5OyB0aGUgZm9sbG93aW5nIG1heSBub3QgaGF2ZSBiZWVuCisgICAgICAgKiBkb25lLgorICAgICAgICovCisgICAgICBpZiAoKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfWlNUUkVBTV9FTkRFRCkgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0FGVEVSX0lEQVQ7CisgICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19aU1RSRUFNX0VOREVEOworICAgICAgfQorICAgfQorCisgICAvKiBJZiB0aGUgenN0cmVhbSBoYXMgbm90IGJlZW4gcmVsZWFzZWQgZG8gaXQgbm93ICphbmQqIHRlcm1pbmF0ZSB0aGUgcmVhZGluZworICAgICogb2YgdGhlIGZpbmFsIElEQVQgY2h1bmsuCisgICAgKi8KKyAgIGlmIChwbmdfcHRyLT56b3duZXIgPT0gcG5nX0lEQVQpCisgICB7CisgICAgICAvKiBBbHdheXMgZG8gdGhpczsgdGhlIHBvaW50ZXJzIG90aGVyd2lzZSBwb2ludCBpbnRvIHRoZSByZWFkIGJ1ZmZlci4gKi8KKyAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9pbiA9IE5VTEw7CisgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luID0gMDsKKworICAgICAgLyogTm93IHdlIG5vIGxvbmdlciBvd24gdGhlIHpzdHJlYW0uICovCisgICAgICBwbmdfcHRyLT56b3duZXIgPSAwOworCisgICAgICAvKiBUaGUgc2xpZ2h0bHkgd2VpcmQgc2VtYW50aWNzIG9mIHRoZSBzZXF1ZW50aWFsIElEQVQgcmVhZGluZyBpcyB0aGF0IHdlCisgICAgICAgKiBhcmUgYWx3YXlzIGluIG9yIGF0IHRoZSBlbmQgb2YgYW4gSURBVCBjaHVuaywgc28gd2UgYWx3YXlzIG5lZWQgdG8gZG8gYQorICAgICAgICogY3JjX2ZpbmlzaCBoZXJlLiAgSWYgaWRhdF9zaXplIGlzIG5vbi16ZXJvIHdlIGFsc28gbmVlZCB0byByZWFkIHRoZQorICAgICAgICogc3B1cmlvdXMgYnl0ZXMgYXQgdGhlIGVuZCBvZiB0aGUgY2h1bmsgbm93LgorICAgICAgICovCisjaWZkZWYgUE5HX0lOREVYX1NVUFBPUlRFRAorICAgICAgaWYgKHBuZ19wdHItPmluZGV4KQorICAgICAgeworICAgICAgICAodm9pZClwbmdfb3B0X2NyY19maW5pc2gocG5nX3B0ciwgcG5nX3B0ci0+aWRhdF9zaXplKTsKKyAgICAgICAgcG5nX3B0ci0+aW5kZXgtPnN0cmVhbV9pZGF0X3Bvc2l0aW9uID0gcG5nX3B0ci0+dG90YWxfZGF0YV9yZWFkOworICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisgICAgICAodm9pZClwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBwbmdfcHRyLT5pZGF0X3NpemUpOworICAgfQorfQorCisjaWZkZWYgUE5HX0lOREVYX1NVUFBPUlRFRAordm9pZCAvKiBQUklWQVRFICovCitwbmdfc2V0X2ludGVybGFjZWRfcGFzcyhwbmdfc3RydWN0cCBwbmdfcHRyLCBpbnQgcGFzcykKK3sKKyAgIC8qIEFycmF5cyB0byBmYWNpbGl0YXRlIGVhc3kgaW50ZXJsYWNpbmcgLSB1c2UgcGFzcyAoMCAtIDYpIGFzIGluZGV4ICovCisgICAvKiBTdGFydCBvZiBpbnRlcmxhY2UgYmxvY2sgKi8KKyAgIFBOR19DT05TVCBpbnQgcG5nX3Bhc3Nfc3RhcnRbN10gPSB7MCwgNCwgMCwgMiwgMCwgMSwgMH07CisgICAvKiBPZmZzZXQgdG8gbmV4dCBpbnRlcmxhY2UgYmxvY2sgKi8KKyAgIFBOR19DT05TVCBpbnQgcG5nX3Bhc3NfaW5jWzddID0gezgsIDgsIDQsIDQsIDIsIDIsIDF9OworICAgLyogU3RhcnQgb2YgaW50ZXJsYWNlIGJsb2NrIGluIHRoZSB5IGRpcmVjdGlvbiAqLworICAgUE5HX0NPTlNUIGludCBwbmdfcGFzc195c3RhcnRbN10gPSB7MCwgMCwgNCwgMCwgMiwgMCwgMX07CisgICAvKiBPZmZzZXQgdG8gbmV4dCBpbnRlcmxhY2UgYmxvY2sgaW4gdGhlIHkgZGlyZWN0aW9uICovCisgICBQTkdfQ09OU1QgaW50IHBuZ19wYXNzX3lpbmNbN10gPSB7OCwgOCwgOCwgNCwgNCwgMiwgMn07CisgICBwbmdfcHRyLT5wYXNzID0gcGFzczsKKyAgIHBuZ19wdHItPml3aWR0aCA9IChwbmdfcHRyLT53aWR0aCArCisgICAgICAgICBwbmdfcGFzc19pbmNbcG5nX3B0ci0+cGFzc10gLSAxIC0KKyAgICAgICAgIHBuZ19wYXNzX3N0YXJ0W3BuZ19wdHItPnBhc3NdKSAvCisgICAgICBwbmdfcGFzc19pbmNbcG5nX3B0ci0+cGFzc107Cit9CisjZW5kaWYKKwordm9pZCAvKiBQUklWQVRFICovCitwbmdfcmVhZF9maW5pc2hfcm93KHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQoreworICAgLyogQXJyYXlzIHRvIGZhY2lsaXRhdGUgZWFzeSBpbnRlcmxhY2luZyAtIHVzZSBwYXNzICgwIC0gNikgYXMgaW5kZXggKi8KKworICAgLyogU3RhcnQgb2YgaW50ZXJsYWNlIGJsb2NrICovCisgICBzdGF0aWMgUE5HX0NPTlNUIHBuZ19ieXRlIHBuZ19wYXNzX3N0YXJ0WzddID0gezAsIDQsIDAsIDIsIDAsIDEsIDB9OworCisgICAvKiBPZmZzZXQgdG8gbmV4dCBpbnRlcmxhY2UgYmxvY2sgKi8KKyAgIHN0YXRpYyBQTkdfQ09OU1QgcG5nX2J5dGUgcG5nX3Bhc3NfaW5jWzddID0gezgsIDgsIDQsIDQsIDIsIDIsIDF9OworCisgICAvKiBTdGFydCBvZiBpbnRlcmxhY2UgYmxvY2sgaW4gdGhlIHkgZGlyZWN0aW9uICovCisgICBzdGF0aWMgUE5HX0NPTlNUIHBuZ19ieXRlIHBuZ19wYXNzX3lzdGFydFs3XSA9IHswLCAwLCA0LCAwLCAyLCAwLCAxfTsKKworICAgLyogT2Zmc2V0IHRvIG5leHQgaW50ZXJsYWNlIGJsb2NrIGluIHRoZSB5IGRpcmVjdGlvbiAqLworICAgc3RhdGljIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfcGFzc195aW5jWzddID0gezgsIDgsIDgsIDQsIDQsIDIsIDJ9OworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19yZWFkX2ZpbmlzaF9yb3ciKTsKKyAgIHBuZ19wdHItPnJvd19udW1iZXIrKzsKKyAgIGlmIChwbmdfcHRyLT5yb3dfbnVtYmVyIDwgcG5nX3B0ci0+bnVtX3Jvd3MpCisgICAgICByZXR1cm47CisKKyAgIGlmIChwbmdfcHRyLT5pbnRlcmxhY2VkICE9IDApCisgICB7CisgICAgICBwbmdfcHRyLT5yb3dfbnVtYmVyID0gMDsKKworICAgICAgLyogVE8gRE86IGRvbid0IGRvIHRoaXMgaWYgcHJldl9yb3cgaXNuJ3QgbmVlZGVkIChyZXF1aXJlcworICAgICAgICogcmVhZC1haGVhZCBvZiB0aGUgbmV4dCByb3cncyBmaWx0ZXIgYnl0ZS4KKyAgICAgICAqLworICAgICAgbWVtc2V0KHBuZ19wdHItPnByZXZfcm93LCAwLCBwbmdfcHRyLT5yb3dieXRlcyArIDEpOworCisgICAgICBkbworICAgICAgeworICAgICAgICAgcG5nX3B0ci0+cGFzcysrOworCisgICAgICAgICBpZiAocG5nX3B0ci0+cGFzcyA+PSA3KQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIHBuZ19wdHItPml3aWR0aCA9IChwbmdfcHRyLT53aWR0aCArCisgICAgICAgICAgICBwbmdfcGFzc19pbmNbcG5nX3B0ci0+cGFzc10gLSAxIC0KKyAgICAgICAgICAgIHBuZ19wYXNzX3N0YXJ0W3BuZ19wdHItPnBhc3NdKSAvCisgICAgICAgICAgICBwbmdfcGFzc19pbmNbcG5nX3B0ci0+cGFzc107CisKKyAgICAgICAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVEVSTEFDRSkgPT0gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19wdHItPm51bV9yb3dzID0gKHBuZ19wdHItPmhlaWdodCArCisgICAgICAgICAgICAgICAgcG5nX3Bhc3NfeWluY1twbmdfcHRyLT5wYXNzXSAtIDEgLQorICAgICAgICAgICAgICAgIHBuZ19wYXNzX3lzdGFydFtwbmdfcHRyLT5wYXNzXSkgLworICAgICAgICAgICAgICAgIHBuZ19wYXNzX3lpbmNbcG5nX3B0ci0+cGFzc107CisgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UgIC8qIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5URVJMQUNFKSAqLworICAgICAgICAgICAgYnJlYWs7IC8qIGxpYnBuZyBkZWludGVybGFjaW5nIHNlZXMgZXZlcnkgcm93ICovCisKKyAgICAgIH0gd2hpbGUgKHBuZ19wdHItPm51bV9yb3dzID09IDAgfHwgcG5nX3B0ci0+aXdpZHRoID09IDApOworCisgICAgICBpZiAocG5nX3B0ci0+cGFzcyA8IDcpCisgICAgICAgICByZXR1cm47CisgICB9CisKKyAgIC8qIEhlcmUgYWZ0ZXIgYXQgdGhlIGVuZCBvZiB0aGUgbGFzdCByb3cgb2YgdGhlIGxhc3QgcGFzcy4gKi8KKyAgIHBuZ19yZWFkX2ZpbmlzaF9JREFUKHBuZ19wdHIpOworfQorI2VuZGlmIC8qIFNFUVVFTlRJQUxfUkVBRCAqLworCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19yZWFkX3N0YXJ0X3Jvdyhwbmdfc3RydWN0cnAgcG5nX3B0cikKK3sKKyAgIC8qIEFycmF5cyB0byBmYWNpbGl0YXRlIGVhc3kgaW50ZXJsYWNpbmcgLSB1c2UgcGFzcyAoMCAtIDYpIGFzIGluZGV4ICovCisKKyAgIC8qIFN0YXJ0IG9mIGludGVybGFjZSBibG9jayAqLworICAgc3RhdGljIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfcGFzc19zdGFydFs3XSA9IHswLCA0LCAwLCAyLCAwLCAxLCAwfTsKKworICAgLyogT2Zmc2V0IHRvIG5leHQgaW50ZXJsYWNlIGJsb2NrICovCisgICBzdGF0aWMgUE5HX0NPTlNUIHBuZ19ieXRlIHBuZ19wYXNzX2luY1s3XSA9IHs4LCA4LCA0LCA0LCAyLCAyLCAxfTsKKworICAgLyogU3RhcnQgb2YgaW50ZXJsYWNlIGJsb2NrIGluIHRoZSB5IGRpcmVjdGlvbiAqLworICAgc3RhdGljIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfcGFzc195c3RhcnRbN10gPSB7MCwgMCwgNCwgMCwgMiwgMCwgMX07CisKKyAgIC8qIE9mZnNldCB0byBuZXh0IGludGVybGFjZSBibG9jayBpbiB0aGUgeSBkaXJlY3Rpb24gKi8KKyAgIHN0YXRpYyBQTkdfQ09OU1QgcG5nX2J5dGUgcG5nX3Bhc3NfeWluY1s3XSA9IHs4LCA4LCA4LCA0LCA0LCAyLCAyfTsKKworICAgaW50IG1heF9waXhlbF9kZXB0aDsKKyAgIHBuZ19zaXplX3Qgcm93X2J5dGVzOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19yZWFkX3N0YXJ0X3JvdyIpOworCisjaWZkZWYgUE5HX1JFQURfVFJBTlNGT1JNU19TVVBQT1JURUQKKyAgIHBuZ19pbml0X3JlYWRfdHJhbnNmb3JtYXRpb25zKHBuZ19wdHIpOworI2VuZGlmCisgICBpZiAocG5nX3B0ci0+aW50ZXJsYWNlZCAhPSAwKQorICAgeworICAgICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5URVJMQUNFKSA9PSAwKQorICAgICAgICAgcG5nX3B0ci0+bnVtX3Jvd3MgPSAocG5nX3B0ci0+aGVpZ2h0ICsgcG5nX3Bhc3NfeWluY1swXSAtIDEgLQorICAgICAgICAgICAgIHBuZ19wYXNzX3lzdGFydFswXSkgLyBwbmdfcGFzc195aW5jWzBdOworCisgICAgICBlbHNlCisgICAgICAgICBwbmdfcHRyLT5udW1fcm93cyA9IHBuZ19wdHItPmhlaWdodDsKKworICAgICAgcG5nX3B0ci0+aXdpZHRoID0gKHBuZ19wdHItPndpZHRoICsKKyAgICAgICAgICBwbmdfcGFzc19pbmNbcG5nX3B0ci0+cGFzc10gLSAxIC0KKyAgICAgICAgICBwbmdfcGFzc19zdGFydFtwbmdfcHRyLT5wYXNzXSkgLworICAgICAgICAgIHBuZ19wYXNzX2luY1twbmdfcHRyLT5wYXNzXTsKKyAgIH0KKworICAgZWxzZQorICAgeworICAgICAgcG5nX3B0ci0+bnVtX3Jvd3MgPSBwbmdfcHRyLT5oZWlnaHQ7CisgICAgICBwbmdfcHRyLT5pd2lkdGggPSBwbmdfcHRyLT53aWR0aDsKKyAgIH0KKworICAgbWF4X3BpeGVsX2RlcHRoID0gcG5nX3B0ci0+cGl4ZWxfZGVwdGg7CisKKyAgIC8qIFdBUk5JTkc6ICogcG5nX3JlYWRfdHJhbnNmb3JtX2luZm8gKHBuZ3J0cmFuLmMpIHBlcmZvcm1zIGEgc2ltcGxlciBzZXQgb2YKKyAgICAqIGNhbGN1bGF0aW9ucyB0byBjYWxjdWxhdGUgdGhlIGZpbmFsIHBpeGVsIGRlcHRoLCB0aGVuCisgICAgKiBwbmdfZG9fcmVhZF90cmFuc2Zvcm1zIGFjdHVhbGx5IGRvZXMgdGhlIHRyYW5zZm9ybXMuICBUaGlzIG1lYW5zIHRoYXQgdGhlCisgICAgKiBjb2RlIHdoaWNoIGVmZmVjdGl2ZWx5IGNhbGN1bGF0ZXMgdGhpcyB2YWx1ZSBpcyBhY3R1YWxseSByZXBlYXRlZCBpbiB0aHJlZQorICAgICogc2VwYXJhdGUgcGxhY2VzLiAgVGhleSBtdXN0IGFsbCBtYXRjaC4gIElubm9jZW50IGNoYW5nZXMgdG8gdGhlIG9yZGVyIG9mCisgICAgKiB0cmFuc2Zvcm1hdGlvbnMgY2FuIGFuZCB3aWxsIGJyZWFrIGxpYnBuZyBpbiBhIHdheSB0aGF0IGNhdXNlcyBtZW1vcnkKKyAgICAqIG92ZXJ3cml0ZXMuCisgICAgKgorICAgICogVE9ETzogZml4IHRoaXMuCisgICAgKi8KKyNpZmRlZiBQTkdfUkVBRF9QQUNLX1NVUFBPUlRFRAorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUEFDSykgIT0gMCAmJiBwbmdfcHRyLT5iaXRfZGVwdGggPCA4KQorICAgICAgbWF4X3BpeGVsX2RlcHRoID0gODsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRAorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRVhQQU5EKSAhPSAwKQorICAgeworICAgICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgICAgIHsKKyAgICAgICAgIGlmIChwbmdfcHRyLT5udW1fdHJhbnMgIT0gMCkKKyAgICAgICAgICAgIG1heF9waXhlbF9kZXB0aCA9IDMyOworCisgICAgICAgICBlbHNlCisgICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggPSAyNDsKKyAgICAgIH0KKworICAgICAgZWxzZSBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQorICAgICAgeworICAgICAgICAgaWYgKG1heF9waXhlbF9kZXB0aCA8IDgpCisgICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggPSA4OworCisgICAgICAgICBpZiAocG5nX3B0ci0+bnVtX3RyYW5zICE9IDApCisgICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggKj0gMjsKKyAgICAgIH0KKworICAgICAgZWxzZSBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpCisgICAgICB7CisgICAgICAgICBpZiAocG5nX3B0ci0+bnVtX3RyYW5zICE9IDApCisgICAgICAgICB7CisgICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggKj0gNDsKKyAgICAgICAgICAgIG1heF9waXhlbF9kZXB0aCAvPSAzOworICAgICAgICAgfQorICAgICAgfQorICAgfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9FWFBBTkRfMTZfU1VQUE9SVEVECisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19FWFBBTkRfMTYpICE9IDApCisgICB7CisjICBpZmRlZiBQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVECisgICAgICAvKiBJbiBmYWN0IGl0IGlzIGFuIGVycm9yIGlmIGl0IGlzbid0IHN1cHBvcnRlZCwgYnV0IGNoZWNraW5nIGlzCisgICAgICAgKiB0aGUgc2FmZSB3YXkuCisgICAgICAgKi8KKyAgICAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0VYUEFORCkgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgIGlmIChwbmdfcHRyLT5iaXRfZGVwdGggPCAxNikKKyAgICAgICAgICAgIG1heF9waXhlbF9kZXB0aCAqPSAyOworICAgICAgfQorICAgICAgZWxzZQorIyAgZW5kaWYKKyAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmPSB+UE5HX0VYUEFORF8xNjsKKyAgIH0KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRAorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiAoUE5HX0ZJTExFUikpICE9IDApCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQorICAgICAgeworICAgICAgICAgaWYgKG1heF9waXhlbF9kZXB0aCA8PSA4KQorICAgICAgICAgICAgbWF4X3BpeGVsX2RlcHRoID0gMTY7CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1heF9waXhlbF9kZXB0aCA9IDMyOworICAgICAgfQorCisgICAgICBlbHNlIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiB8fAorICAgICAgICAgcG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQorICAgICAgeworICAgICAgICAgaWYgKG1heF9waXhlbF9kZXB0aCA8PSAzMikKKyAgICAgICAgICAgIG1heF9waXhlbF9kZXB0aCA9IDMyOworCisgICAgICAgICBlbHNlCisgICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggPSA2NDsKKyAgICAgIH0KKyAgIH0KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfR1JBWV9UT19SR0JfU1VQUE9SVEVECisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19HUkFZX1RPX1JHQikgIT0gMCkKKyAgIHsKKyAgICAgIGlmICgKKyNpZmRlZiBQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVECisgICAgICAgICAgKHBuZ19wdHItPm51bV90cmFucyAhPSAwICYmCisgICAgICAgICAgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19FWFBBTkQpICE9IDApIHx8CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVECisgICAgICAgICAgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIChQTkdfRklMTEVSKSkgIT0gMCB8fAorI2VuZGlmCisgICAgICAgICAgcG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQorICAgICAgeworICAgICAgICAgaWYgKG1heF9waXhlbF9kZXB0aCA8PSAxNikKKyAgICAgICAgICAgIG1heF9waXhlbF9kZXB0aCA9IDMyOworCisgICAgICAgICBlbHNlCisgICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggPSA2NDsKKyAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgaWYgKG1heF9waXhlbF9kZXB0aCA8PSA4KQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQorICAgICAgICAgICAgICAgbWF4X3BpeGVsX2RlcHRoID0gMzI7CisKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIG1heF9waXhlbF9kZXB0aCA9IDI0OworICAgICAgICAgfQorCisgICAgICAgICBlbHNlIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkKKyAgICAgICAgICAgIG1heF9waXhlbF9kZXB0aCA9IDY0OworCisgICAgICAgICBlbHNlCisgICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggPSA0ODsKKyAgICAgIH0KKyAgIH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpICYmIFwKK2RlZmluZWQoUE5HX1VTRVJfVFJBTlNGT1JNX1BUUl9TVVBQT1JURUQpCisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19VU0VSX1RSQU5TRk9STSkgIT0gMCkKKyAgIHsKKyAgICAgIGludCB1c2VyX3BpeGVsX2RlcHRoID0gcG5nX3B0ci0+dXNlcl90cmFuc2Zvcm1fZGVwdGggKgorICAgICAgICAgcG5nX3B0ci0+dXNlcl90cmFuc2Zvcm1fY2hhbm5lbHM7CisKKyAgICAgIGlmICh1c2VyX3BpeGVsX2RlcHRoID4gbWF4X3BpeGVsX2RlcHRoKQorICAgICAgICAgbWF4X3BpeGVsX2RlcHRoID0gdXNlcl9waXhlbF9kZXB0aDsKKyAgIH0KKyNlbmRpZgorCisgICAvKiBUaGlzIHZhbHVlIGlzIHN0b3JlZCBpbiBwbmdfc3RydWN0IGFuZCBkb3VibGUgY2hlY2tlZCBpbiB0aGUgcm93IHJlYWQKKyAgICAqIGNvZGUuCisgICAgKi8KKyAgIHBuZ19wdHItPm1heGltdW1fcGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpbWF4X3BpeGVsX2RlcHRoOworICAgcG5nX3B0ci0+dHJhbnNmb3JtZWRfcGl4ZWxfZGVwdGggPSAwOyAvKiBjYWxjdWxhdGVkIG9uIGRlbWFuZCAqLworCisgICAvKiBBbGlnbiB0aGUgd2lkdGggb24gdGhlIG5leHQgbGFyZ2VyIDggcGl4ZWxzLiAgTWFpbmx5IHVzZWQKKyAgICAqIGZvciBpbnRlcmxhY2luZworICAgICovCisgICByb3dfYnl0ZXMgPSAoKHBuZ19wdHItPndpZHRoICsgNykgJiB+KChwbmdfdWludF8zMik3KSk7CisgICAvKiBDYWxjdWxhdGUgdGhlIG1heGltdW0gYnl0ZXMgbmVlZGVkLCBhZGRpbmcgYSBieXRlIGFuZCBhIHBpeGVsCisgICAgKiBmb3Igc2FmZXR5J3Mgc2FrZQorICAgICovCisgICByb3dfYnl0ZXMgPSBQTkdfUk9XQllURVMobWF4X3BpeGVsX2RlcHRoLCByb3dfYnl0ZXMpICsKKyAgICAgICAxICsgKChtYXhfcGl4ZWxfZGVwdGggKyA3KSA+PiAzKTsKKworI2lmZGVmIFBOR19NQVhfTUFMTE9DXzY0SworICAgaWYgKHJvd19ieXRlcyA+IChwbmdfdWludF8zMik2NTUzNkwpCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlRoaXMgaW1hZ2UgcmVxdWlyZXMgYSByb3cgZ3JlYXRlciB0aGFuIDY0S0IiKTsKKyNlbmRpZgorCisgICBpZiAocm93X2J5dGVzICsgNDggPiBwbmdfcHRyLT5vbGRfYmlnX3Jvd19idWZfc2l6ZSkKKyAgIHsKKyAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+YmlnX3Jvd19idWYpOworICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5iaWdfcHJldl9yb3cpOworCisgICAgIGlmIChwbmdfcHRyLT5pbnRlcmxhY2VkICE9IDApCisgICAgICAgIHBuZ19wdHItPmJpZ19yb3dfYnVmID0gKHBuZ19ieXRlcClwbmdfY2FsbG9jKHBuZ19wdHIsCisgICAgICAgICAgICByb3dfYnl0ZXMgKyA0OCk7CisKKyAgICAgZWxzZQorICAgICAgICBwbmdfcHRyLT5iaWdfcm93X2J1ZiA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLCByb3dfYnl0ZXMgKyA0OCk7CisKKyAgICAgcG5nX3B0ci0+YmlnX3ByZXZfcm93ID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsIHJvd19ieXRlcyArIDQ4KTsKKworI2lmZGVmIFBOR19BTElHTkVEX01FTU9SWV9TVVBQT1JURUQKKyAgICAgLyogVXNlIDE2LWJ5dGUgYWxpZ25lZCBtZW1vcnkgZm9yIHJvd19idWYgd2l0aCBhdCBsZWFzdCAxNiBieXRlcworICAgICAgKiBvZiBwYWRkaW5nIGJlZm9yZSBhbmQgYWZ0ZXIgcm93X2J1ZjsgdHJlYXQgcHJldl9yb3cgc2ltaWxhcmx5LgorICAgICAgKiBOT1RFOiB0aGUgYWxpZ25tZW50IGlzIHRvIHRoZSBzdGFydCBvZiB0aGUgcGl4ZWxzLCBvbmUgYmV5b25kIHRoZSBzdGFydAorICAgICAgKiBvZiB0aGUgYnVmZmVyLCBiZWNhdXNlIG9mIHRoZSBmaWx0ZXIgYnl0ZS4gIFByaW9yIHRvIGxpYnBuZyAxLjUuNiB0aGlzCisgICAgICAqIHdhcyBpbmNvcnJlY3Q7IHRoZSBmaWx0ZXIgYnl0ZSB3YXMgYWxpZ25lZCwgd2hpY2ggaGFkIHRoZSBleGFjdAorICAgICAgKiBvcHBvc2l0ZSBlZmZlY3Qgb2YgdGhhdCBpbnRlbmRlZC4KKyAgICAgICovCisgICAgIHsKKyAgICAgICAgcG5nX2J5dGVwIHRlbXAgPSBwbmdfcHRyLT5iaWdfcm93X2J1ZiArIDMyOworICAgICAgICBpbnQgZXh0cmEgPSAoaW50KSgodGVtcCAtIChwbmdfYnl0ZXApMCkgJiAweDBmKTsKKyAgICAgICAgcG5nX3B0ci0+cm93X2J1ZiA9IHRlbXAgLSBleHRyYSAtIDEvKmZpbHRlciBieXRlKi87CisKKyAgICAgICAgdGVtcCA9IHBuZ19wdHItPmJpZ19wcmV2X3JvdyArIDMyOworICAgICAgICBleHRyYSA9IChpbnQpKCh0ZW1wIC0gKHBuZ19ieXRlcCkwKSAmIDB4MGYpOworICAgICAgICBwbmdfcHRyLT5wcmV2X3JvdyA9IHRlbXAgLSBleHRyYSAtIDEvKmZpbHRlciBieXRlKi87CisgICAgIH0KKworI2Vsc2UKKyAgICAgLyogVXNlIDMxIGJ5dGVzIG9mIHBhZGRpbmcgYmVmb3JlIGFuZCAxNyBieXRlcyBhZnRlciByb3dfYnVmLiAqLworICAgICBwbmdfcHRyLT5yb3dfYnVmID0gcG5nX3B0ci0+YmlnX3Jvd19idWYgKyAzMTsKKyAgICAgcG5nX3B0ci0+cHJldl9yb3cgPSBwbmdfcHRyLT5iaWdfcHJldl9yb3cgKyAzMTsKKyNlbmRpZgorICAgICBwbmdfcHRyLT5vbGRfYmlnX3Jvd19idWZfc2l6ZSA9IHJvd19ieXRlcyArIDQ4OworICAgfQorCisjaWZkZWYgUE5HX01BWF9NQUxMT0NfNjRLCisgICBpZiAocG5nX3B0ci0+cm93Ynl0ZXMgPiA2NTUzNSkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiVGhpcyBpbWFnZSByZXF1aXJlcyBhIHJvdyBncmVhdGVyIHRoYW4gNjRLQiIpOworCisjZW5kaWYKKyAgIGlmIChwbmdfcHRyLT5yb3dieXRlcyA+IChQTkdfU0laRV9NQVggLSAxKSkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiUm93IGhhcyB0b28gbWFueSBieXRlcyB0byBhbGxvY2F0ZSBpbiBtZW1vcnkiKTsKKworICAgbWVtc2V0KHBuZ19wdHItPnByZXZfcm93LCAwLCBwbmdfcHRyLT5yb3dieXRlcyArIDEpOworCisgICBwbmdfZGVidWcxKDMsICJ3aWR0aCA9ICV1LCIsIHBuZ19wdHItPndpZHRoKTsKKyAgIHBuZ19kZWJ1ZzEoMywgImhlaWdodCA9ICV1LCIsIHBuZ19wdHItPmhlaWdodCk7CisgICBwbmdfZGVidWcxKDMsICJpd2lkdGggPSAldSwiLCBwbmdfcHRyLT5pd2lkdGgpOworICAgcG5nX2RlYnVnMSgzLCAibnVtX3Jvd3MgPSAldSwiLCBwbmdfcHRyLT5udW1fcm93cyk7CisgICBwbmdfZGVidWcxKDMsICJyb3dieXRlcyA9ICVsdSwiLCAodW5zaWduZWQgbG9uZylwbmdfcHRyLT5yb3dieXRlcyk7CisgICBwbmdfZGVidWcxKDMsICJpcm93Ynl0ZXMgPSAlbHUiLAorICAgICAgICh1bnNpZ25lZCBsb25nKVBOR19ST1dCWVRFUyhwbmdfcHRyLT5waXhlbF9kZXB0aCwgcG5nX3B0ci0+aXdpZHRoKSArIDEpOworCisgICAvKiBUaGUgc2VxdWVudGlhbCByZWFkZXIgbmVlZHMgYSBidWZmZXIgZm9yIElEQVQsIGJ1dCB0aGUgcHJvZ3Jlc3NpdmUgcmVhZGVyCisgICAgKiBkb2VzIG5vdCwgc28gZnJlZSB0aGUgcmVhZCBidWZmZXIgbm93IHJlZ2FyZGxlc3M7IHRoZSBzZXF1ZW50aWFsIHJlYWRlcgorICAgICogcmVhbGxvY2F0ZXMgaXQgb24gZGVtYW5kLgorICAgICovCisgICBpZiAocG5nX3B0ci0+cmVhZF9idWZmZXIgIT0gMCkKKyAgIHsKKyAgICAgIHBuZ19ieXRlcCBidWZmZXIgPSBwbmdfcHRyLT5yZWFkX2J1ZmZlcjsKKworICAgICAgcG5nX3B0ci0+cmVhZF9idWZmZXJfc2l6ZSA9IDA7CisgICAgICBwbmdfcHRyLT5yZWFkX2J1ZmZlciA9IE5VTEw7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBidWZmZXIpOworICAgfQorCisgICAvKiBGaW5hbGx5IGNsYWltIHRoZSB6c3RyZWFtIGZvciB0aGUgaW5mbGF0ZSBvZiB0aGUgSURBVCBkYXRhLCB1c2UgdGhlIGJpdHMKKyAgICAqIHZhbHVlIGZyb20gdGhlIHN0cmVhbSAobm90ZSB0aGF0IHRoaXMgd2lsbCByZXN1bHQgaW4gYSBmYXRhbCBlcnJvciBpZiB0aGUKKyAgICAqIElEQVQgc3RyZWFtIGhhcyBhIGJvZ3VzIGRlZmxhdGUgaGVhZGVyIHdpbmRvd19iaXRzIHZhbHVlLCBidXQgdGhpcyBzaG91bGQKKyAgICAqIG5vdCBiZSBoYXBwZW5pbmcgYW55IGxvbmdlciEpCisgICAgKi8KKyAgIGlmIChwbmdfaW5mbGF0ZV9jbGFpbShwbmdfcHRyLCBwbmdfSURBVCkgIT0gWl9PSykKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCBwbmdfcHRyLT56c3RyZWFtLm1zZyk7CisKKyAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX1JPV19JTklUOworfQorI2VuZGlmIC8qIFJFQUQgKi8KZGlmZiAtLWdpdCBhL2xpYnBuZy9wbmdzZXQuYyBiL2xpYnBuZy9wbmdzZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmQ3OTY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3BuZ3NldC5jCkBAIC0wLDAgKzEsMTY0NyBAQAorCisvKiBwbmdzZXQuYyAtIHN0b3JhZ2Ugb2YgaW1hZ2UgaW5mb3JtYXRpb24gaW50byBpbmZvIHN0cnVjdAorICoKKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS42LjE5IFtOb3ZlbWJlciAxMiwgMjAxNV0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDE1IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCisgKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCisgKgorICogVGhlIGZ1bmN0aW9ucyBoZXJlIGFyZSB1c2VkIGR1cmluZyByZWFkcyB0byBzdG9yZSBkYXRhIGZyb20gdGhlIGZpbGUKKyAqIGludG8gdGhlIGluZm8gc3RydWN0LCBhbmQgZHVyaW5nIHdyaXRlcyB0byBzdG9yZSBhcHBsaWNhdGlvbiBkYXRhCisgKiBpbnRvIHRoZSBpbmZvIHN0cnVjdCBmb3Igd3JpdGluZyBpbnRvIHRoZSBmaWxlLiAgVGhpcyBhYnN0cmFjdHMgdGhlCisgKiBpbmZvIHN0cnVjdCBhbmQgYWxsb3dzIHVzIHRvIGNoYW5nZSB0aGUgc3RydWN0dXJlIGluIHRoZSBmdXR1cmUuCisgKi8KKworI2luY2x1ZGUgInBuZ3ByaXYuaCIKKworI2lmIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TVVBQT1JURUQpCisKKyNpZmRlZiBQTkdfYktHRF9TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X2JLR0QocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsCisgICAgcG5nX2NvbnN0X2NvbG9yXzE2cCBiYWNrZ3JvdW5kKQoreworICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgc3RvcmFnZSBmdW5jdGlvbiIsICJiS0dEIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCB8fCBiYWNrZ3JvdW5kID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIGluZm9fcHRyLT5iYWNrZ3JvdW5kID0gKmJhY2tncm91bmQ7CisgICBpbmZvX3B0ci0+dmFsaWQgfD0gUE5HX0lORk9fYktHRDsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX2NIUk1fU1VQUE9SVEVECit2b2lkIFBOR0ZBUEkKK3BuZ19zZXRfY0hSTV9maXhlZChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwKKyAgICBwbmdfZml4ZWRfcG9pbnQgd2hpdGVfeCwgcG5nX2ZpeGVkX3BvaW50IHdoaXRlX3ksIHBuZ19maXhlZF9wb2ludCByZWRfeCwKKyAgICBwbmdfZml4ZWRfcG9pbnQgcmVkX3ksIHBuZ19maXhlZF9wb2ludCBncmVlbl94LCBwbmdfZml4ZWRfcG9pbnQgZ3JlZW5feSwKKyAgICBwbmdfZml4ZWRfcG9pbnQgYmx1ZV94LCBwbmdfZml4ZWRfcG9pbnQgYmx1ZV95KQoreworICAgcG5nX3h5IHh5OworCisgICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgImNIUk0gZml4ZWQiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICB4eS5yZWR4ID0gcmVkX3g7CisgICB4eS5yZWR5ID0gcmVkX3k7CisgICB4eS5ncmVlbnggPSBncmVlbl94OworICAgeHkuZ3JlZW55ID0gZ3JlZW5feTsKKyAgIHh5LmJsdWV4ID0gYmx1ZV94OworICAgeHkuYmx1ZXkgPSBibHVlX3k7CisgICB4eS53aGl0ZXggPSB3aGl0ZV94OworICAgeHkud2hpdGV5ID0gd2hpdGVfeTsKKworICAgaWYgKHBuZ19jb2xvcnNwYWNlX3NldF9jaHJvbWF0aWNpdGllcyhwbmdfcHRyLCAmaW5mb19wdHItPmNvbG9yc3BhY2UsICZ4eSwKKyAgICAgICAyLyogb3ZlcnJpZGUgd2l0aCBhcHAgdmFsdWVzKi8pICE9IDApCisgICAgICBpbmZvX3B0ci0+Y29sb3JzcGFjZS5mbGFncyB8PSBQTkdfQ09MT1JTUEFDRV9GUk9NX2NIUk07CisKKyAgIHBuZ19jb2xvcnNwYWNlX3N5bmNfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7Cit9CisKK3ZvaWQgUE5HRkFQSQorcG5nX3NldF9jSFJNX1hZWl9maXhlZChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwKKyAgICBwbmdfZml4ZWRfcG9pbnQgaW50X3JlZF9YLCBwbmdfZml4ZWRfcG9pbnQgaW50X3JlZF9ZLAorICAgIHBuZ19maXhlZF9wb2ludCBpbnRfcmVkX1osIHBuZ19maXhlZF9wb2ludCBpbnRfZ3JlZW5fWCwKKyAgICBwbmdfZml4ZWRfcG9pbnQgaW50X2dyZWVuX1ksIHBuZ19maXhlZF9wb2ludCBpbnRfZ3JlZW5fWiwKKyAgICBwbmdfZml4ZWRfcG9pbnQgaW50X2JsdWVfWCwgcG5nX2ZpeGVkX3BvaW50IGludF9ibHVlX1ksCisgICAgcG5nX2ZpeGVkX3BvaW50IGludF9ibHVlX1opCit7CisgICBwbmdfWFlaIFhZWjsKKworICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgc3RvcmFnZSBmdW5jdGlvbiIsICJjSFJNIFhZWiBmaXhlZCIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIFhZWi5yZWRfWCA9IGludF9yZWRfWDsKKyAgIFhZWi5yZWRfWSA9IGludF9yZWRfWTsKKyAgIFhZWi5yZWRfWiA9IGludF9yZWRfWjsKKyAgIFhZWi5ncmVlbl9YID0gaW50X2dyZWVuX1g7CisgICBYWVouZ3JlZW5fWSA9IGludF9ncmVlbl9ZOworICAgWFlaLmdyZWVuX1ogPSBpbnRfZ3JlZW5fWjsKKyAgIFhZWi5ibHVlX1ggPSBpbnRfYmx1ZV9YOworICAgWFlaLmJsdWVfWSA9IGludF9ibHVlX1k7CisgICBYWVouYmx1ZV9aID0gaW50X2JsdWVfWjsKKworICAgaWYgKHBuZ19jb2xvcnNwYWNlX3NldF9lbmRwb2ludHMocG5nX3B0ciwgJmluZm9fcHRyLT5jb2xvcnNwYWNlLAorICAgICAgICZYWVosIDIpICE9IDApCisgICAgICBpbmZvX3B0ci0+Y29sb3JzcGFjZS5mbGFncyB8PSBQTkdfQ09MT1JTUEFDRV9GUk9NX2NIUk07CisKKyAgIHBuZ19jb2xvcnNwYWNlX3N5bmNfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7Cit9CisKKyMgIGlmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X2NIUk0ocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsCisgICAgZG91YmxlIHdoaXRlX3gsIGRvdWJsZSB3aGl0ZV95LCBkb3VibGUgcmVkX3gsIGRvdWJsZSByZWRfeSwKKyAgICBkb3VibGUgZ3JlZW5feCwgZG91YmxlIGdyZWVuX3ksIGRvdWJsZSBibHVlX3gsIGRvdWJsZSBibHVlX3kpCit7CisgICBwbmdfc2V0X2NIUk1fZml4ZWQocG5nX3B0ciwgaW5mb19wdHIsCisgICAgICBwbmdfZml4ZWQocG5nX3B0ciwgd2hpdGVfeCwgImNIUk0gV2hpdGUgWCIpLAorICAgICAgcG5nX2ZpeGVkKHBuZ19wdHIsIHdoaXRlX3ksICJjSFJNIFdoaXRlIFkiKSwKKyAgICAgIHBuZ19maXhlZChwbmdfcHRyLCByZWRfeCwgImNIUk0gUmVkIFgiKSwKKyAgICAgIHBuZ19maXhlZChwbmdfcHRyLCByZWRfeSwgImNIUk0gUmVkIFkiKSwKKyAgICAgIHBuZ19maXhlZChwbmdfcHRyLCBncmVlbl94LCAiY0hSTSBHcmVlbiBYIiksCisgICAgICBwbmdfZml4ZWQocG5nX3B0ciwgZ3JlZW5feSwgImNIUk0gR3JlZW4gWSIpLAorICAgICAgcG5nX2ZpeGVkKHBuZ19wdHIsIGJsdWVfeCwgImNIUk0gQmx1ZSBYIiksCisgICAgICBwbmdfZml4ZWQocG5nX3B0ciwgYmx1ZV95LCAiY0hSTSBCbHVlIFkiKSk7Cit9CisKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X2NIUk1fWFlaKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLCBkb3VibGUgcmVkX1gsCisgICAgZG91YmxlIHJlZF9ZLCBkb3VibGUgcmVkX1osIGRvdWJsZSBncmVlbl9YLCBkb3VibGUgZ3JlZW5fWSwgZG91YmxlIGdyZWVuX1osCisgICAgZG91YmxlIGJsdWVfWCwgZG91YmxlIGJsdWVfWSwgZG91YmxlIGJsdWVfWikKK3sKKyAgIHBuZ19zZXRfY0hSTV9YWVpfZml4ZWQocG5nX3B0ciwgaW5mb19wdHIsCisgICAgICBwbmdfZml4ZWQocG5nX3B0ciwgcmVkX1gsICJjSFJNIFJlZCBYIiksCisgICAgICBwbmdfZml4ZWQocG5nX3B0ciwgcmVkX1ksICJjSFJNIFJlZCBZIiksCisgICAgICBwbmdfZml4ZWQocG5nX3B0ciwgcmVkX1osICJjSFJNIFJlZCBaIiksCisgICAgICBwbmdfZml4ZWQocG5nX3B0ciwgZ3JlZW5fWCwgImNIUk0gR3JlZW4gWCIpLAorICAgICAgcG5nX2ZpeGVkKHBuZ19wdHIsIGdyZWVuX1ksICJjSFJNIEdyZWVuIFkiKSwKKyAgICAgIHBuZ19maXhlZChwbmdfcHRyLCBncmVlbl9aLCAiY0hSTSBHcmVlbiBaIiksCisgICAgICBwbmdfZml4ZWQocG5nX3B0ciwgYmx1ZV9YLCAiY0hSTSBCbHVlIFgiKSwKKyAgICAgIHBuZ19maXhlZChwbmdfcHRyLCBibHVlX1ksICJjSFJNIEJsdWUgWSIpLAorICAgICAgcG5nX2ZpeGVkKHBuZ19wdHIsIGJsdWVfWiwgImNIUk0gQmx1ZSBaIikpOworfQorIyAgZW5kaWYgLyogRkxPQVRJTkdfUE9JTlQgKi8KKworI2VuZGlmIC8qIGNIUk0gKi8KKworI2lmZGVmIFBOR19nQU1BX1NVUFBPUlRFRAordm9pZCBQTkdGQVBJCitwbmdfc2V0X2dBTUFfZml4ZWQocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsCisgICAgcG5nX2ZpeGVkX3BvaW50IGZpbGVfZ2FtbWEpCit7CisgICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgImdBTUEiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBwbmdfY29sb3JzcGFjZV9zZXRfZ2FtbWEocG5nX3B0ciwgJmluZm9fcHRyLT5jb2xvcnNwYWNlLCBmaWxlX2dhbW1hKTsKKyAgIHBuZ19jb2xvcnNwYWNlX3N5bmNfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7Cit9CisKKyMgIGlmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X2dBTUEocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIGRvdWJsZSBmaWxlX2dhbW1hKQoreworICAgcG5nX3NldF9nQU1BX2ZpeGVkKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfZml4ZWQocG5nX3B0ciwgZmlsZV9nYW1tYSwKKyAgICAgICAicG5nX3NldF9nQU1BIikpOworfQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgUE5HX2hJU1RfU1VQUE9SVEVECit2b2lkIFBOR0FQSQorcG5nX3NldF9oSVNUKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLAorICAgIHBuZ19jb25zdF91aW50XzE2cCBoaXN0KQoreworICAgaW50IGk7CisKKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAiaElTVCIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIGlmIChpbmZvX3B0ci0+bnVtX3BhbGV0dGUgPT0gMCB8fCBpbmZvX3B0ci0+bnVtX3BhbGV0dGUKKyAgICAgICA+IFBOR19NQVhfUEFMRVRURV9MRU5HVEgpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAgICJJbnZhbGlkIHBhbGV0dGUgc2l6ZSwgaElTVCBhbGxvY2F0aW9uIHNraXBwZWQiKTsKKworICAgICAgcmV0dXJuOworICAgfQorCisgICBwbmdfZnJlZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfRlJFRV9ISVNULCAwKTsKKworICAgLyogQ2hhbmdlZCBmcm9tIGluZm8tPm51bV9wYWxldHRlIHRvIFBOR19NQVhfUEFMRVRURV9MRU5HVEggaW4KKyAgICAqIHZlcnNpb24gMS4yLjEKKyAgICAqLworICAgaW5mb19wdHItPmhpc3QgPSBwbmdfdm9pZGNhc3QocG5nX3VpbnRfMTZwLCBwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwKKyAgICAgICBQTkdfTUFYX1BBTEVUVEVfTEVOR1RIICogKHNpemVvZiAocG5nX3VpbnRfMTYpKSkpOworCisgICBpZiAoaW5mb19wdHItPmhpc3QgPT0gTlVMTCkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnN1ZmZpY2llbnQgbWVtb3J5IGZvciBoSVNUIGNodW5rIGRhdGEiKTsKKworICAgICAgcmV0dXJuOworICAgfQorCisgICBpbmZvX3B0ci0+ZnJlZV9tZSB8PSBQTkdfRlJFRV9ISVNUOworCisgICBmb3IgKGkgPSAwOyBpIDwgaW5mb19wdHItPm51bV9wYWxldHRlOyBpKyspCisgICAgICBpbmZvX3B0ci0+aGlzdFtpXSA9IGhpc3RbaV07CisKKyAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19oSVNUOworfQorI2VuZGlmCisKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X0lIRFIocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsCisgICAgcG5nX3VpbnRfMzIgd2lkdGgsIHBuZ191aW50XzMyIGhlaWdodCwgaW50IGJpdF9kZXB0aCwKKyAgICBpbnQgY29sb3JfdHlwZSwgaW50IGludGVybGFjZV90eXBlLCBpbnQgY29tcHJlc3Npb25fdHlwZSwKKyAgICBpbnQgZmlsdGVyX3R5cGUpCit7CisgICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgIklIRFIiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBpbmZvX3B0ci0+d2lkdGggPSB3aWR0aDsKKyAgIGluZm9fcHRyLT5oZWlnaHQgPSBoZWlnaHQ7CisgICBpbmZvX3B0ci0+Yml0X2RlcHRoID0gKHBuZ19ieXRlKWJpdF9kZXB0aDsKKyAgIGluZm9fcHRyLT5jb2xvcl90eXBlID0gKHBuZ19ieXRlKWNvbG9yX3R5cGU7CisgICBpbmZvX3B0ci0+Y29tcHJlc3Npb25fdHlwZSA9IChwbmdfYnl0ZSljb21wcmVzc2lvbl90eXBlOworICAgaW5mb19wdHItPmZpbHRlcl90eXBlID0gKHBuZ19ieXRlKWZpbHRlcl90eXBlOworICAgaW5mb19wdHItPmludGVybGFjZV90eXBlID0gKHBuZ19ieXRlKWludGVybGFjZV90eXBlOworCisgICBwbmdfY2hlY2tfSUhEUiAocG5nX3B0ciwgaW5mb19wdHItPndpZHRoLCBpbmZvX3B0ci0+aGVpZ2h0LAorICAgICAgIGluZm9fcHRyLT5iaXRfZGVwdGgsIGluZm9fcHRyLT5jb2xvcl90eXBlLCBpbmZvX3B0ci0+aW50ZXJsYWNlX3R5cGUsCisgICAgICAgaW5mb19wdHItPmNvbXByZXNzaW9uX3R5cGUsIGluZm9fcHRyLT5maWx0ZXJfdHlwZSk7CisKKyAgIGlmIChpbmZvX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQorICAgICAgaW5mb19wdHItPmNoYW5uZWxzID0gMTsKKworICAgZWxzZSBpZiAoKGluZm9fcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpICE9IDApCisgICAgICBpbmZvX3B0ci0+Y2hhbm5lbHMgPSAzOworCisgICBlbHNlCisgICAgICBpbmZvX3B0ci0+Y2hhbm5lbHMgPSAxOworCisgICBpZiAoKGluZm9fcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpICE9IDApCisgICAgICBpbmZvX3B0ci0+Y2hhbm5lbHMrKzsKKworICAgaW5mb19wdHItPnBpeGVsX2RlcHRoID0gKHBuZ19ieXRlKShpbmZvX3B0ci0+Y2hhbm5lbHMgKiBpbmZvX3B0ci0+Yml0X2RlcHRoKTsKKworICAgaW5mb19wdHItPnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKGluZm9fcHRyLT5waXhlbF9kZXB0aCwgd2lkdGgpOworfQorCisjaWZkZWYgUE5HX29GRnNfU1VQUE9SVEVECit2b2lkIFBOR0FQSQorcG5nX3NldF9vRkZzKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLAorICAgIHBuZ19pbnRfMzIgb2Zmc2V0X3gsIHBuZ19pbnRfMzIgb2Zmc2V0X3ksIGludCB1bml0X3R5cGUpCit7CisgICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgIm9GRnMiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBpbmZvX3B0ci0+eF9vZmZzZXQgPSBvZmZzZXRfeDsKKyAgIGluZm9fcHRyLT55X29mZnNldCA9IG9mZnNldF95OworICAgaW5mb19wdHItPm9mZnNldF91bml0X3R5cGUgPSAocG5nX2J5dGUpdW5pdF90eXBlOworICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX29GRnM7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19wQ0FMX1NVUFBPUlRFRAordm9pZCBQTkdBUEkKK3BuZ19zZXRfcENBTChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwKKyAgICBwbmdfY29uc3RfY2hhcnAgcHVycG9zZSwgcG5nX2ludF8zMiBYMCwgcG5nX2ludF8zMiBYMSwgaW50IHR5cGUsCisgICAgaW50IG5wYXJhbXMsIHBuZ19jb25zdF9jaGFycCB1bml0cywgcG5nX2NoYXJwcCBwYXJhbXMpCit7CisgICBwbmdfc2l6ZV90IGxlbmd0aDsKKyAgIGludCBpOworCisgICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgInBDQUwiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMIHx8IHB1cnBvc2UgPT0gTlVMTCB8fCB1bml0cyA9PSBOVUxMCisgICAgICAgfHwgKG5wYXJhbXMgPiAwICYmIHBhcmFtcyA9PSBOVUxMKSkKKyAgICAgIHJldHVybjsKKworICAgbGVuZ3RoID0gc3RybGVuKHB1cnBvc2UpICsgMTsKKyAgIHBuZ19kZWJ1ZzEoMywgImFsbG9jYXRpbmcgcHVycG9zZSBmb3IgaW5mbyAoJWx1IGJ5dGVzKSIsCisgICAgICAgKHVuc2lnbmVkIGxvbmcpbGVuZ3RoKTsKKworICAgLyogVE9ETzogdmFsaWRhdGUgZm9ybWF0IG9mIGNhbGlicmF0aW9uIG5hbWUgYW5kIHVuaXQgbmFtZSAqLworCisgICAvKiBDaGVjayB0aGF0IHRoZSB0eXBlIG1hdGNoZXMgdGhlIHNwZWNpZmljYXRpb24uICovCisgICBpZiAodHlwZSA8IDAgfHwgdHlwZSA+IDMpCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgcENBTCBlcXVhdGlvbiB0eXBlIik7CisKKyAgIGlmIChucGFyYW1zIDwgMCB8fCBucGFyYW1zID4gMjU1KQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbnZhbGlkIHBDQUwgcGFyYW1ldGVyIGNvdW50Iik7CisKKyAgIC8qIFZhbGlkYXRlIHBhcmFtc1tucGFyYW1zXSAqLworICAgZm9yIChpPTA7IGk8bnBhcmFtczsgKytpKQorICAgeworICAgICAgaWYgKHBhcmFtc1tpXSA9PSBOVUxMIHx8CisgICAgICAgICAgIXBuZ19jaGVja19mcF9zdHJpbmcocGFyYW1zW2ldLCBzdHJsZW4ocGFyYW1zW2ldKSkpCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgZm9ybWF0IGZvciBwQ0FMIHBhcmFtZXRlciIpOworICAgfQorCisgICBpbmZvX3B0ci0+cGNhbF9wdXJwb3NlID0gcG5nX3ZvaWRjYXN0KHBuZ19jaGFycCwKKyAgICAgICBwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwgbGVuZ3RoKSk7CisKKyAgIGlmIChpbmZvX3B0ci0+cGNhbF9wdXJwb3NlID09IE5VTEwpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW5zdWZmaWNpZW50IG1lbW9yeSBmb3IgcENBTCBwdXJwb3NlIik7CisKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgbWVtY3B5KGluZm9fcHRyLT5wY2FsX3B1cnBvc2UsIHB1cnBvc2UsIGxlbmd0aCk7CisKKyAgIHBuZ19kZWJ1ZygzLCAic3RvcmluZyBYMCwgWDEsIHR5cGUsIGFuZCBucGFyYW1zIGluIGluZm8iKTsKKyAgIGluZm9fcHRyLT5wY2FsX1gwID0gWDA7CisgICBpbmZvX3B0ci0+cGNhbF9YMSA9IFgxOworICAgaW5mb19wdHItPnBjYWxfdHlwZSA9IChwbmdfYnl0ZSl0eXBlOworICAgaW5mb19wdHItPnBjYWxfbnBhcmFtcyA9IChwbmdfYnl0ZSlucGFyYW1zOworCisgICBsZW5ndGggPSBzdHJsZW4odW5pdHMpICsgMTsKKyAgIHBuZ19kZWJ1ZzEoMywgImFsbG9jYXRpbmcgdW5pdHMgZm9yIGluZm8gKCVsdSBieXRlcykiLAorICAgICAodW5zaWduZWQgbG9uZylsZW5ndGgpOworCisgICBpbmZvX3B0ci0+cGNhbF91bml0cyA9IHBuZ192b2lkY2FzdChwbmdfY2hhcnAsCisgICAgICBwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwgbGVuZ3RoKSk7CisKKyAgIGlmIChpbmZvX3B0ci0+cGNhbF91bml0cyA9PSBOVUxMKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluc3VmZmljaWVudCBtZW1vcnkgZm9yIHBDQUwgdW5pdHMiKTsKKworICAgICAgcmV0dXJuOworICAgfQorCisgICBtZW1jcHkoaW5mb19wdHItPnBjYWxfdW5pdHMsIHVuaXRzLCBsZW5ndGgpOworCisgICBpbmZvX3B0ci0+cGNhbF9wYXJhbXMgPSBwbmdfdm9pZGNhc3QocG5nX2NoYXJwcCwgcG5nX21hbGxvY193YXJuKHBuZ19wdHIsCisgICAgICAgKHBuZ19zaXplX3QpKChucGFyYW1zICsgMSkgKiAoc2l6ZW9mIChwbmdfY2hhcnApKSkpKTsKKworICAgaWYgKGluZm9fcHRyLT5wY2FsX3BhcmFtcyA9PSBOVUxMKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluc3VmZmljaWVudCBtZW1vcnkgZm9yIHBDQUwgcGFyYW1zIik7CisKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgbWVtc2V0KGluZm9fcHRyLT5wY2FsX3BhcmFtcywgMCwgKG5wYXJhbXMgKyAxKSAqIChzaXplb2YgKHBuZ19jaGFycCkpKTsKKworICAgZm9yIChpID0gMDsgaSA8IG5wYXJhbXM7IGkrKykKKyAgIHsKKyAgICAgIGxlbmd0aCA9IHN0cmxlbihwYXJhbXNbaV0pICsgMTsKKyAgICAgIHBuZ19kZWJ1ZzIoMywgImFsbG9jYXRpbmcgcGFyYW1ldGVyICVkIGZvciBpbmZvICglbHUgYnl0ZXMpIiwgaSwKKyAgICAgICAgICAodW5zaWduZWQgbG9uZylsZW5ndGgpOworCisgICAgICBpbmZvX3B0ci0+cGNhbF9wYXJhbXNbaV0gPSAocG5nX2NoYXJwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCBsZW5ndGgpOworCisgICAgICBpZiAoaW5mb19wdHItPnBjYWxfcGFyYW1zW2ldID09IE5VTEwpCisgICAgICB7CisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW5zdWZmaWNpZW50IG1lbW9yeSBmb3IgcENBTCBwYXJhbWV0ZXIiKTsKKworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBtZW1jcHkoaW5mb19wdHItPnBjYWxfcGFyYW1zW2ldLCBwYXJhbXNbaV0sIGxlbmd0aCk7CisgICB9CisKKyAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19wQ0FMOworICAgaW5mb19wdHItPmZyZWVfbWUgfD0gUE5HX0ZSRUVfUENBTDsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX3NDQUxfU1VQUE9SVEVECit2b2lkIFBOR0FQSQorcG5nX3NldF9zQ0FMX3MocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsCisgICAgaW50IHVuaXQsIHBuZ19jb25zdF9jaGFycCBzd2lkdGgsIHBuZ19jb25zdF9jaGFycCBzaGVpZ2h0KQoreworICAgcG5nX3NpemVfdCBsZW5ndGh3ID0gMCwgbGVuZ3RoaCA9IDA7CisKKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAic0NBTCIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIC8qIERvdWJsZSBjaGVjayB0aGUgdW5pdCAoc2hvdWxkIG5ldmVyIGdldCBoZXJlIHdpdGggYW4gaW52YWxpZAorICAgICogdW5pdCB1bmxlc3MgdGhpcyBpcyBhbiBBUEkgY2FsbC4pCisgICAgKi8KKyAgIGlmICh1bml0ICE9IDEgJiYgdW5pdCAhPSAyKQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbnZhbGlkIHNDQUwgdW5pdCIpOworCisgICBpZiAoc3dpZHRoID09IE5VTEwgfHwgKGxlbmd0aHcgPSBzdHJsZW4oc3dpZHRoKSkgPT0gMCB8fAorICAgICAgIHN3aWR0aFswXSA9PSA0NSAvKiAnLScgKi8gfHwgIXBuZ19jaGVja19mcF9zdHJpbmcoc3dpZHRoLCBsZW5ndGh3KSkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW52YWxpZCBzQ0FMIHdpZHRoIik7CisKKyAgIGlmIChzaGVpZ2h0ID09IE5VTEwgfHwgKGxlbmd0aGggPSBzdHJsZW4oc2hlaWdodCkpID09IDAgfHwKKyAgICAgICBzaGVpZ2h0WzBdID09IDQ1IC8qICctJyAqLyB8fCAhcG5nX2NoZWNrX2ZwX3N0cmluZyhzaGVpZ2h0LCBsZW5ndGhoKSkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW52YWxpZCBzQ0FMIGhlaWdodCIpOworCisgICBpbmZvX3B0ci0+c2NhbF91bml0ID0gKHBuZ19ieXRlKXVuaXQ7CisKKyAgICsrbGVuZ3RodzsKKworICAgcG5nX2RlYnVnMSgzLCAiYWxsb2NhdGluZyB1bml0IGZvciBpbmZvICgldSBieXRlcykiLCAodW5zaWduZWQgaW50KWxlbmd0aHcpOworCisgICBpbmZvX3B0ci0+c2NhbF9zX3dpZHRoID0gcG5nX3ZvaWRjYXN0KHBuZ19jaGFycCwKKyAgICAgIHBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCBsZW5ndGh3KSk7CisKKyAgIGlmIChpbmZvX3B0ci0+c2NhbF9zX3dpZHRoID09IE5VTEwpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIHdoaWxlIHByb2Nlc3Npbmcgc0NBTCIpOworCisgICAgICByZXR1cm47CisgICB9CisKKyAgIG1lbWNweShpbmZvX3B0ci0+c2NhbF9zX3dpZHRoLCBzd2lkdGgsIGxlbmd0aHcpOworCisgICArK2xlbmd0aGg7CisKKyAgIHBuZ19kZWJ1ZzEoMywgImFsbG9jYXRpbmcgdW5pdCBmb3IgaW5mbyAoJXUgYnl0ZXMpIiwgKHVuc2lnbmVkIGludClsZW5ndGhoKTsKKworICAgaW5mb19wdHItPnNjYWxfc19oZWlnaHQgPSBwbmdfdm9pZGNhc3QocG5nX2NoYXJwLAorICAgICAgcG5nX21hbGxvY193YXJuKHBuZ19wdHIsIGxlbmd0aGgpKTsKKworICAgaWYgKGluZm9fcHRyLT5zY2FsX3NfaGVpZ2h0ID09IE5VTEwpCisgICB7CisgICAgICBwbmdfZnJlZSAocG5nX3B0ciwgaW5mb19wdHItPnNjYWxfc193aWR0aCk7CisgICAgICBpbmZvX3B0ci0+c2NhbF9zX3dpZHRoID0gTlVMTDsKKworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCB3aGlsZSBwcm9jZXNzaW5nIHNDQUwiKTsKKworICAgICAgcmV0dXJuOworICAgfQorCisgICBtZW1jcHkoaW5mb19wdHItPnNjYWxfc19oZWlnaHQsIHNoZWlnaHQsIGxlbmd0aGgpOworCisgICBpbmZvX3B0ci0+dmFsaWQgfD0gUE5HX0lORk9fc0NBTDsKKyAgIGluZm9fcHRyLT5mcmVlX21lIHw9IFBOR19GUkVFX1NDQUw7Cit9CisKKyMgIGlmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3NDQUwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIGludCB1bml0LAorICAgIGRvdWJsZSB3aWR0aCwgZG91YmxlIGhlaWdodCkKK3sKKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAic0NBTCIpOworCisgICAvKiBDaGVjayB0aGUgYXJndW1lbnRzLiAqLworICAgaWYgKHdpZHRoIDw9IDApCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBzQ0FMIHdpZHRoIGlnbm9yZWQiKTsKKworICAgZWxzZSBpZiAoaGVpZ2h0IDw9IDApCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBzQ0FMIGhlaWdodCBpZ25vcmVkIik7CisKKyAgIGVsc2UKKyAgIHsKKyAgICAgIC8qIENvbnZlcnQgJ3dpZHRoJyBhbmQgJ2hlaWdodCcgdG8gQVNDSUkuICovCisgICAgICBjaGFyIHN3aWR0aFtQTkdfc0NBTF9NQVhfRElHSVRTKzFdOworICAgICAgY2hhciBzaGVpZ2h0W1BOR19zQ0FMX01BWF9ESUdJVFMrMV07CisKKyAgICAgIHBuZ19hc2NpaV9mcm9tX2ZwKHBuZ19wdHIsIHN3aWR0aCwgKHNpemVvZiBzd2lkdGgpLCB3aWR0aCwKKyAgICAgICAgIFBOR19zQ0FMX1BSRUNJU0lPTik7CisgICAgICBwbmdfYXNjaWlfZnJvbV9mcChwbmdfcHRyLCBzaGVpZ2h0LCAoc2l6ZW9mIHNoZWlnaHQpLCBoZWlnaHQsCisgICAgICAgICBQTkdfc0NBTF9QUkVDSVNJT04pOworCisgICAgICBwbmdfc2V0X3NDQUxfcyhwbmdfcHRyLCBpbmZvX3B0ciwgdW5pdCwgc3dpZHRoLCBzaGVpZ2h0KTsKKyAgIH0KK30KKyMgIGVuZGlmCisKKyMgIGlmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3NDQUxfZml4ZWQocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIGludCB1bml0LAorICAgIHBuZ19maXhlZF9wb2ludCB3aWR0aCwgcG5nX2ZpeGVkX3BvaW50IGhlaWdodCkKK3sKKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAic0NBTCIpOworCisgICAvKiBDaGVjayB0aGUgYXJndW1lbnRzLiAqLworICAgaWYgKHdpZHRoIDw9IDApCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBzQ0FMIHdpZHRoIGlnbm9yZWQiKTsKKworICAgZWxzZSBpZiAoaGVpZ2h0IDw9IDApCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBzQ0FMIGhlaWdodCBpZ25vcmVkIik7CisKKyAgIGVsc2UKKyAgIHsKKyAgICAgIC8qIENvbnZlcnQgJ3dpZHRoJyBhbmQgJ2hlaWdodCcgdG8gQVNDSUkuICovCisgICAgICBjaGFyIHN3aWR0aFtQTkdfc0NBTF9NQVhfRElHSVRTKzFdOworICAgICAgY2hhciBzaGVpZ2h0W1BOR19zQ0FMX01BWF9ESUdJVFMrMV07CisKKyAgICAgIHBuZ19hc2NpaV9mcm9tX2ZpeGVkKHBuZ19wdHIsIHN3aWR0aCwgKHNpemVvZiBzd2lkdGgpLCB3aWR0aCk7CisgICAgICBwbmdfYXNjaWlfZnJvbV9maXhlZChwbmdfcHRyLCBzaGVpZ2h0LCAoc2l6ZW9mIHNoZWlnaHQpLCBoZWlnaHQpOworCisgICAgICBwbmdfc2V0X3NDQUxfcyhwbmdfcHRyLCBpbmZvX3B0ciwgdW5pdCwgc3dpZHRoLCBzaGVpZ2h0KTsKKyAgIH0KK30KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFBOR19wSFlzX1NVUFBPUlRFRAordm9pZCBQTkdBUEkKK3BuZ19zZXRfcEhZcyhwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwKKyAgICBwbmdfdWludF8zMiByZXNfeCwgcG5nX3VpbnRfMzIgcmVzX3ksIGludCB1bml0X3R5cGUpCit7CisgICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgInBIWXMiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBpbmZvX3B0ci0+eF9waXhlbHNfcGVyX3VuaXQgPSByZXNfeDsKKyAgIGluZm9fcHRyLT55X3BpeGVsc19wZXJfdW5pdCA9IHJlc195OworICAgaW5mb19wdHItPnBoeXNfdW5pdF90eXBlID0gKHBuZ19ieXRlKXVuaXRfdHlwZTsKKyAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19wSFlzOworfQorI2VuZGlmCisKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X1BMVEUocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsCisgICAgcG5nX2NvbnN0X2NvbG9ycCBwYWxldHRlLCBpbnQgbnVtX3BhbGV0dGUpCit7CisKKyAgIHBuZ191aW50XzMyIG1heF9wYWxldHRlX2xlbmd0aDsKKworICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgc3RvcmFnZSBmdW5jdGlvbiIsICJQTFRFIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgbWF4X3BhbGV0dGVfbGVuZ3RoID0gKGluZm9fcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpID8KKyAgICAgICgxIDw8IGluZm9fcHRyLT5iaXRfZGVwdGgpIDogUE5HX01BWF9QQUxFVFRFX0xFTkdUSDsKKworICAgaWYgKG51bV9wYWxldHRlIDwgMCB8fCBudW1fcGFsZXR0ZSA+IChpbnQpIG1heF9wYWxldHRlX2xlbmd0aCkKKyAgIHsKKyAgICAgIGlmIChpbmZvX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbnZhbGlkIHBhbGV0dGUgbGVuZ3RoIik7CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIHBhbGV0dGUgbGVuZ3RoIik7CisKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgIH0KKworICAgaWYgKChudW1fcGFsZXR0ZSA+IDAgJiYgcGFsZXR0ZSA9PSBOVUxMKSB8fAorICAgICAgKG51bV9wYWxldHRlID09IDAKKyMgICAgICAgIGlmZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVECisgICAgICAgICAgICAmJiAocG5nX3B0ci0+bW5nX2ZlYXR1cmVzX3Blcm1pdHRlZCAmIFBOR19GTEFHX01OR19FTVBUWV9QTFRFKSA9PSAwCisjICAgICAgICBlbmRpZgorICAgICAgKSkKKyAgIHsKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW52YWxpZCBwYWxldHRlIik7CisgICB9CisKKyAgIC8qIEl0IG1heSBub3QgYWN0dWFsbHkgYmUgbmVjZXNzYXJ5IHRvIHNldCBwbmdfcHRyLT5wYWxldHRlIGhlcmU7CisgICAgKiB3ZSBkbyBpdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSB3YXkgdGhlIHBuZ19oYW5kbGVfdFJOUworICAgICogZnVuY3Rpb24gdXNlZCB0byBkbyB0aGUgYWxsb2NhdGlvbi4KKyAgICAqCisgICAgKiAxLjYuMDogdGhlIGFib3ZlIHN0YXRlbWVudCBhcHBlYXJzIHRvIGJlIGluY29ycmVjdDsgc29tZXRoaW5nIGhhcyB0byBzZXQKKyAgICAqIHRoZSBwYWxldHRlIGluc2lkZSBwbmdfc3RydWN0IG9uIHJlYWQuCisgICAgKi8KKyAgIHBuZ19mcmVlX2RhdGEocG5nX3B0ciwgaW5mb19wdHIsIFBOR19GUkVFX1BMVEUsIDApOworCisgICAvKiBDaGFuZ2VkIGluIGxpYnBuZy0xLjIuMSB0byBhbGxvY2F0ZSBQTkdfTUFYX1BBTEVUVEVfTEVOR1RIIGluc3RlYWQKKyAgICAqIG9mIG51bV9wYWxldHRlIGVudHJpZXMsIGluIGNhc2Ugb2YgYW4gaW52YWxpZCBQTkcgZmlsZSBvciBpbmNvcnJlY3QKKyAgICAqIGNhbGwgdG8gcG5nX3NldF9QTFRFKCkgd2l0aCB0b28tbGFyZ2Ugc2FtcGxlIHZhbHVlcy4KKyAgICAqLworICAgcG5nX3B0ci0+cGFsZXR0ZSA9IHBuZ192b2lkY2FzdChwbmdfY29sb3JwLCBwbmdfY2FsbG9jKHBuZ19wdHIsCisgICAgICAgUE5HX01BWF9QQUxFVFRFX0xFTkdUSCAqIChzaXplb2YgKHBuZ19jb2xvcikpKSk7CisKKyAgIGlmIChudW1fcGFsZXR0ZSA+IDApCisgICAgICBtZW1jcHkocG5nX3B0ci0+cGFsZXR0ZSwgcGFsZXR0ZSwgbnVtX3BhbGV0dGUgKiAoc2l6ZW9mIChwbmdfY29sb3IpKSk7CisgICBpbmZvX3B0ci0+cGFsZXR0ZSA9IHBuZ19wdHItPnBhbGV0dGU7CisgICBpbmZvX3B0ci0+bnVtX3BhbGV0dGUgPSBwbmdfcHRyLT5udW1fcGFsZXR0ZSA9IChwbmdfdWludF8xNiludW1fcGFsZXR0ZTsKKworICAgaW5mb19wdHItPmZyZWVfbWUgfD0gUE5HX0ZSRUVfUExURTsKKworICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX1BMVEU7Cit9CisKKyNpZmRlZiBQTkdfc0JJVF9TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3NCSVQocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsCisgICAgcG5nX2NvbnN0X2NvbG9yXzhwIHNpZ19iaXQpCit7CisgICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgInNCSVQiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMIHx8IHNpZ19iaXQgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgaW5mb19wdHItPnNpZ19iaXQgPSAqc2lnX2JpdDsKKyAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19zQklUOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfc1JHQl9TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3NSR0IocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIGludCBzcmdiX2ludGVudCkKK3sKKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAic1JHQiIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgICh2b2lkKXBuZ19jb2xvcnNwYWNlX3NldF9zUkdCKHBuZ19wdHIsICZpbmZvX3B0ci0+Y29sb3JzcGFjZSwgc3JnYl9pbnRlbnQpOworICAgcG5nX2NvbG9yc3BhY2Vfc3luY19pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKK30KKwordm9pZCBQTkdBUEkKK3BuZ19zZXRfc1JHQl9nQU1BX2FuZF9jSFJNKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLAorICAgIGludCBzcmdiX2ludGVudCkKK3sKKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAic1JHQl9nQU1BX2FuZF9jSFJNIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgaWYgKHBuZ19jb2xvcnNwYWNlX3NldF9zUkdCKHBuZ19wdHIsICZpbmZvX3B0ci0+Y29sb3JzcGFjZSwKKyAgICAgICBzcmdiX2ludGVudCkgIT0gMCkKKyAgIHsKKyAgICAgIC8qIFRoaXMgY2F1c2VzIHRoZSBnQU1BIGFuZCBjSFJNIHRvIGJlIHdyaXR0ZW4gdG9vICovCisgICAgICBpbmZvX3B0ci0+Y29sb3JzcGFjZS5mbGFncyB8PQorICAgICAgICAgUE5HX0NPTE9SU1BBQ0VfRlJPTV9nQU1BfFBOR19DT0xPUlNQQUNFX0ZST01fY0hSTTsKKyAgIH0KKworICAgcG5nX2NvbG9yc3BhY2Vfc3luY19pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKK30KKyNlbmRpZiAvKiBzUkdCICovCisKKworI2lmZGVmIFBOR19pQ0NQX1NVUFBPUlRFRAordm9pZCBQTkdBUEkKK3BuZ19zZXRfaUNDUChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwKKyAgICBwbmdfY29uc3RfY2hhcnAgbmFtZSwgaW50IGNvbXByZXNzaW9uX3R5cGUsCisgICAgcG5nX2NvbnN0X2J5dGVwIHByb2ZpbGUsIHBuZ191aW50XzMyIHByb2ZsZW4pCit7CisgICBwbmdfY2hhcnAgbmV3X2ljY3BfbmFtZTsKKyAgIHBuZ19ieXRlcCBuZXdfaWNjcF9wcm9maWxlOworICAgcG5nX3NpemVfdCBsZW5ndGg7CisKKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAiaUNDUCIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMIHx8IHByb2ZpbGUgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgaWYgKGNvbXByZXNzaW9uX3R5cGUgIT0gUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSkKKyAgICAgIHBuZ19hcHBfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgaUNDUCBjb21wcmVzc2lvbiBtZXRob2QiKTsKKworICAgLyogU2V0IHRoZSBjb2xvcnNwYWNlIGZpcnN0IGJlY2F1c2UgdGhpcyB2YWxpZGF0ZXMgdGhlIHByb2ZpbGU7IGRvIG5vdAorICAgICogb3ZlcnJpZGUgcHJldmlvdXNseSBzZXQgYXBwIGNIUk0gb3IgZ0FNQSBoZXJlIChiZWNhdXNlIGxpa2VseSBhcyBub3QgdGhlCisgICAgKiBhcHBsaWNhdGlvbiBrbm93cyBiZXR0ZXIgdGhhbiBsaWJwbmcgd2hhdCB0aGUgY29ycmVjdCB2YWx1ZXMgYXJlLikgIFBhc3MKKyAgICAqIHRoZSBpbmZvX3B0ciBjb2xvcl90eXBlIGZpZWxkIHRvIHBuZ19jb2xvcnNwYWNlX3NldF9JQ0MgYmVjYXVzZSBpbiB0aGUKKyAgICAqIHdyaXRlIGNhc2UgaXQgaGFzIG5vdCB5ZXQgYmVlbiBzdG9yZWQgaW4gcG5nX3B0ci4KKyAgICAqLworICAgeworICAgICAgaW50IHJlc3VsdCA9IHBuZ19jb2xvcnNwYWNlX3NldF9JQ0MocG5nX3B0ciwgJmluZm9fcHRyLT5jb2xvcnNwYWNlLCBuYW1lLAorICAgICAgICAgcHJvZmxlbiwgcHJvZmlsZSwgaW5mb19wdHItPmNvbG9yX3R5cGUpOworCisgICAgICBwbmdfY29sb3JzcGFjZV9zeW5jX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOworCisgICAgICAvKiBEb24ndCBkbyBhbnkgb2YgdGhlIGNvcHlpbmcgaWYgdGhlIHByb2ZpbGUgd2FzIGJhZCwgb3IgaW5jb25zaXN0ZW50LiAqLworICAgICAgaWYgKHJlc3VsdCA9PSAwKQorICAgICAgICAgcmV0dXJuOworCisgICAgICAvKiBCdXQgZG8gd3JpdGUgdGhlIGdBTUEgYW5kIGNIUk0gY2h1bmtzIGZyb20gdGhlIHByb2ZpbGUuICovCisgICAgICBpbmZvX3B0ci0+Y29sb3JzcGFjZS5mbGFncyB8PQorICAgICAgICAgUE5HX0NPTE9SU1BBQ0VfRlJPTV9nQU1BfFBOR19DT0xPUlNQQUNFX0ZST01fY0hSTTsKKyAgIH0KKworICAgbGVuZ3RoID0gc3RybGVuKG5hbWUpKzE7CisgICBuZXdfaWNjcF9uYW1lID0gcG5nX3ZvaWRjYXN0KHBuZ19jaGFycCwgcG5nX21hbGxvY193YXJuKHBuZ19wdHIsIGxlbmd0aCkpOworCisgICBpZiAobmV3X2ljY3BfbmFtZSA9PSBOVUxMKQorICAgeworICAgICAgcG5nX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiSW5zdWZmaWNpZW50IG1lbW9yeSB0byBwcm9jZXNzIGlDQ1AgY2h1bmsiKTsKKworICAgICAgcmV0dXJuOworICAgfQorCisgICBtZW1jcHkobmV3X2ljY3BfbmFtZSwgbmFtZSwgbGVuZ3RoKTsKKyAgIG5ld19pY2NwX3Byb2ZpbGUgPSBwbmdfdm9pZGNhc3QocG5nX2J5dGVwLAorICAgICAgcG5nX21hbGxvY193YXJuKHBuZ19wdHIsIHByb2ZsZW4pKTsKKworICAgaWYgKG5ld19pY2NwX3Byb2ZpbGUgPT0gTlVMTCkKKyAgIHsKKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIG5ld19pY2NwX25hbWUpOworICAgICAgcG5nX2Jlbmlnbl9lcnJvcihwbmdfcHRyLAorICAgICAgICAgICJJbnN1ZmZpY2llbnQgbWVtb3J5IHRvIHByb2Nlc3MgaUNDUCBwcm9maWxlIik7CisKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgbWVtY3B5KG5ld19pY2NwX3Byb2ZpbGUsIHByb2ZpbGUsIHByb2ZsZW4pOworCisgICBwbmdfZnJlZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfRlJFRV9JQ0NQLCAwKTsKKworICAgaW5mb19wdHItPmljY3BfcHJvZmxlbiA9IHByb2ZsZW47CisgICBpbmZvX3B0ci0+aWNjcF9uYW1lID0gbmV3X2ljY3BfbmFtZTsKKyAgIGluZm9fcHRyLT5pY2NwX3Byb2ZpbGUgPSBuZXdfaWNjcF9wcm9maWxlOworICAgaW5mb19wdHItPmZyZWVfbWUgfD0gUE5HX0ZSRUVfSUNDUDsKKyAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19pQ0NQOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfVEVYVF9TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3RleHQocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsCisgICAgcG5nX2NvbnN0X3RleHRwIHRleHRfcHRyLCBpbnQgbnVtX3RleHQpCit7CisgICBpbnQgcmV0OworICAgcmV0ID0gcG5nX3NldF90ZXh0XzIocG5nX3B0ciwgaW5mb19wdHIsIHRleHRfcHRyLCBudW1fdGV4dCk7CisKKyAgIGlmIChyZXQgIT0gMCkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW5zdWZmaWNpZW50IG1lbW9yeSB0byBzdG9yZSB0ZXh0Iik7Cit9CisKK2ludCAvKiBQUklWQVRFICovCitwbmdfc2V0X3RleHRfMihwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwKKyAgICBwbmdfY29uc3RfdGV4dHAgdGV4dF9wdHIsIGludCBudW1fdGV4dCkKK3sKKyAgIGludCBpOworCisgICBwbmdfZGVidWcxKDEsICJpbiAlbHggc3RvcmFnZSBmdW5jdGlvbiIsIHBuZ19wdHIgPT0gTlVMTCA/IDB4YWJhZGNhMTFVIDoKKyAgICAgICh1bnNpZ25lZCBsb25nKXBuZ19wdHItPmNodW5rX25hbWUpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwgfHwgbnVtX3RleHQgPD0gMCB8fCB0ZXh0X3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuKDApOworCisgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBlbm91Z2ggc3BhY2UgaW4gdGhlICJ0ZXh0IiBhcnJheSBpbiBpbmZvX3N0cnVjdAorICAgICogdG8gaG9sZCBhbGwgb2YgdGhlIGluY29taW5nIHRleHRfcHRyIG9iamVjdHMuICBUaGlzIGNvbXBhcmUgY2FuJ3Qgb3ZlcmZsb3cKKyAgICAqIGJlY2F1c2UgbWF4X3RleHQgPj0gbnVtX3RleHQgKGFueXdheSwgc3VidHJhY3Qgb2YgdHdvIHBvc2l0aXZlIGludGVnZXJzCisgICAgKiBjYW4ndCBvdmVyZmxvdyBpbiBhbnkgY2FzZS4pCisgICAgKi8KKyAgIGlmIChudW1fdGV4dCA+IGluZm9fcHRyLT5tYXhfdGV4dCAtIGluZm9fcHRyLT5udW1fdGV4dCkKKyAgIHsKKyAgICAgIGludCBvbGRfbnVtX3RleHQgPSBpbmZvX3B0ci0+bnVtX3RleHQ7CisgICAgICBpbnQgbWF4X3RleHQ7CisgICAgICBwbmdfdGV4dHAgbmV3X3RleHQgPSBOVUxMOworCisgICAgICAvKiBDYWxjdWxhdGUgYW4gYXBwcm9wcmlhdGUgbWF4X3RleHQsIGNoZWNraW5nIGZvciBvdmVyZmxvdy4gKi8KKyAgICAgIG1heF90ZXh0ID0gb2xkX251bV90ZXh0OworICAgICAgaWYgKG51bV90ZXh0IDw9IElOVF9NQVggLSBtYXhfdGV4dCkKKyAgICAgIHsKKyAgICAgICAgIG1heF90ZXh0ICs9IG51bV90ZXh0OworCisgICAgICAgICAvKiBSb3VuZCB1cCB0byBhIG11bHRpcGxlIG9mIDggKi8KKyAgICAgICAgIGlmIChtYXhfdGV4dCA8IElOVF9NQVgtOCkKKyAgICAgICAgICAgIG1heF90ZXh0ID0gKG1heF90ZXh0ICsgOCkgJiB+MHg3OworCisgICAgICAgICBlbHNlCisgICAgICAgICAgICBtYXhfdGV4dCA9IElOVF9NQVg7CisKKyAgICAgICAgIC8qIE5vdyBhbGxvY2F0ZSBhIG5ldyBhcnJheSBhbmQgY29weSB0aGUgb2xkIG1lbWJlcnMgaW47IHRoaXMgZG9lcyBhbGwKKyAgICAgICAgICAqIHRoZSBvdmVyZmxvdyBjaGVja3MuCisgICAgICAgICAgKi8KKyAgICAgICAgIG5ld190ZXh0ID0gcG5nX3ZvaWRjYXN0KHBuZ190ZXh0cCxwbmdfcmVhbGxvY19hcnJheShwbmdfcHRyLAorICAgICAgICAgICAgaW5mb19wdHItPnRleHQsIG9sZF9udW1fdGV4dCwgbWF4X3RleHQtb2xkX251bV90ZXh0LAorICAgICAgICAgICAgc2l6ZW9mICpuZXdfdGV4dCkpOworICAgICAgfQorCisgICAgICBpZiAobmV3X3RleHQgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19jaHVua19yZXBvcnQocG5nX3B0ciwgInRvbyBtYW55IHRleHQgY2h1bmtzIiwKKyAgICAgICAgICAgIFBOR19DSFVOS19XUklURV9FUlJPUik7CisKKyAgICAgICAgIHJldHVybiAxOworICAgICAgfQorCisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+dGV4dCk7CisKKyAgICAgIGluZm9fcHRyLT50ZXh0ID0gbmV3X3RleHQ7CisgICAgICBpbmZvX3B0ci0+ZnJlZV9tZSB8PSBQTkdfRlJFRV9URVhUOworICAgICAgaW5mb19wdHItPm1heF90ZXh0ID0gbWF4X3RleHQ7CisgICAgICAvKiBudW1fdGV4dCBpcyBhZGp1c3RlZCBiZWxvdyBhcyB0aGUgZW50cmllcyBhcmUgY29waWVkIGluICovCisKKyAgICAgIHBuZ19kZWJ1ZzEoMywgImFsbG9jYXRlZCAlZCBlbnRyaWVzIGZvciBpbmZvX3B0ci0+dGV4dCIsIG1heF90ZXh0KTsKKyAgIH0KKworICAgZm9yIChpID0gMDsgaSA8IG51bV90ZXh0OyBpKyspCisgICB7CisgICAgICBzaXplX3QgdGV4dF9sZW5ndGgsIGtleV9sZW47CisgICAgICBzaXplX3QgbGFuZ19sZW4sIGxhbmdfa2V5X2xlbjsKKyAgICAgIHBuZ190ZXh0cCB0ZXh0cCA9ICYoaW5mb19wdHItPnRleHRbaW5mb19wdHItPm51bV90ZXh0XSk7CisKKyAgICAgIGlmICh0ZXh0X3B0cltpXS5rZXkgPT0gTlVMTCkKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgaWYgKHRleHRfcHRyW2ldLmNvbXByZXNzaW9uIDwgUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORSB8fAorICAgICAgICAgIHRleHRfcHRyW2ldLmNvbXByZXNzaW9uID49IFBOR19URVhUX0NPTVBSRVNTSU9OX0xBU1QpCisgICAgICB7CisgICAgICAgICBwbmdfY2h1bmtfcmVwb3J0KHBuZ19wdHIsICJ0ZXh0IGNvbXByZXNzaW9uIG1vZGUgaXMgb3V0IG9mIHJhbmdlIiwKKyAgICAgICAgICAgIFBOR19DSFVOS19XUklURV9FUlJPUik7CisgICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAga2V5X2xlbiA9IHN0cmxlbih0ZXh0X3B0cltpXS5rZXkpOworCisgICAgICBpZiAodGV4dF9wdHJbaV0uY29tcHJlc3Npb24gPD0gMCkKKyAgICAgIHsKKyAgICAgICAgIGxhbmdfbGVuID0gMDsKKyAgICAgICAgIGxhbmdfa2V5X2xlbiA9IDA7CisgICAgICB9CisKKyAgICAgIGVsc2UKKyMgIGlmZGVmIFBOR19pVFh0X1NVUFBPUlRFRAorICAgICAgeworICAgICAgICAgLyogU2V0IGlUWHQgZGF0YSAqLworCisgICAgICAgICBpZiAodGV4dF9wdHJbaV0ubGFuZyAhPSBOVUxMKQorICAgICAgICAgICAgbGFuZ19sZW4gPSBzdHJsZW4odGV4dF9wdHJbaV0ubGFuZyk7CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxhbmdfbGVuID0gMDsKKworICAgICAgICAgaWYgKHRleHRfcHRyW2ldLmxhbmdfa2V5ICE9IE5VTEwpCisgICAgICAgICAgICBsYW5nX2tleV9sZW4gPSBzdHJsZW4odGV4dF9wdHJbaV0ubGFuZ19rZXkpOworCisgICAgICAgICBlbHNlCisgICAgICAgICAgICBsYW5nX2tleV9sZW4gPSAwOworICAgICAgfQorIyAgZWxzZSAvKiBpVFh0ICovCisgICAgICB7CisgICAgICAgICBwbmdfY2h1bmtfcmVwb3J0KHBuZ19wdHIsICJpVFh0IGNodW5rIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgUE5HX0NIVU5LX1dSSVRFX0VSUk9SKTsKKyAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorIyAgZW5kaWYKKworICAgICAgaWYgKHRleHRfcHRyW2ldLnRleHQgPT0gTlVMTCB8fCB0ZXh0X3B0cltpXS50ZXh0WzBdID09ICdcMCcpCisgICAgICB7CisgICAgICAgICB0ZXh0X2xlbmd0aCA9IDA7CisjICBpZmRlZiBQTkdfaVRYdF9TVVBQT1JURUQKKyAgICAgICAgIGlmICh0ZXh0X3B0cltpXS5jb21wcmVzc2lvbiA+IDApCisgICAgICAgICAgICB0ZXh0cC0+Y29tcHJlc3Npb24gPSBQTkdfSVRYVF9DT01QUkVTU0lPTl9OT05FOworCisgICAgICAgICBlbHNlCisjICBlbmRpZgorICAgICAgICAgICAgdGV4dHAtPmNvbXByZXNzaW9uID0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORTsKKyAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgdGV4dF9sZW5ndGggPSBzdHJsZW4odGV4dF9wdHJbaV0udGV4dCk7CisgICAgICAgICB0ZXh0cC0+Y29tcHJlc3Npb24gPSB0ZXh0X3B0cltpXS5jb21wcmVzc2lvbjsKKyAgICAgIH0KKworICAgICAgdGV4dHAtPmtleSA9IHBuZ192b2lkY2FzdChwbmdfY2hhcnAscG5nX21hbGxvY19iYXNlKHBuZ19wdHIsCisgICAgICAgICAga2V5X2xlbiArIHRleHRfbGVuZ3RoICsgbGFuZ19sZW4gKyBsYW5nX2tleV9sZW4gKyA0KSk7CisKKyAgICAgIGlmICh0ZXh0cC0+a2V5ID09IE5VTEwpCisgICAgICB7CisgICAgICAgICBwbmdfY2h1bmtfcmVwb3J0KHBuZ19wdHIsICJ0ZXh0IGNodW5rOiBvdXQgb2YgbWVtb3J5IiwKKyAgICAgICAgICAgICAgIFBOR19DSFVOS19XUklURV9FUlJPUik7CisKKyAgICAgICAgIHJldHVybiAxOworICAgICAgfQorCisgICAgICBwbmdfZGVidWcyKDIsICJBbGxvY2F0ZWQgJWx1IGJ5dGVzIGF0ICVwIGluIHBuZ19zZXRfdGV4dCIsCisgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKHBuZ191aW50XzMyKQorICAgICAgICAgIChrZXlfbGVuICsgbGFuZ19sZW4gKyBsYW5nX2tleV9sZW4gKyB0ZXh0X2xlbmd0aCArIDQpLAorICAgICAgICAgIHRleHRwLT5rZXkpOworCisgICAgICBtZW1jcHkodGV4dHAtPmtleSwgdGV4dF9wdHJbaV0ua2V5LCBrZXlfbGVuKTsKKyAgICAgICoodGV4dHAtPmtleSArIGtleV9sZW4pID0gJ1wwJzsKKworICAgICAgaWYgKHRleHRfcHRyW2ldLmNvbXByZXNzaW9uID4gMCkKKyAgICAgIHsKKyAgICAgICAgIHRleHRwLT5sYW5nID0gdGV4dHAtPmtleSArIGtleV9sZW4gKyAxOworICAgICAgICAgbWVtY3B5KHRleHRwLT5sYW5nLCB0ZXh0X3B0cltpXS5sYW5nLCBsYW5nX2xlbik7CisgICAgICAgICAqKHRleHRwLT5sYW5nICsgbGFuZ19sZW4pID0gJ1wwJzsKKyAgICAgICAgIHRleHRwLT5sYW5nX2tleSA9IHRleHRwLT5sYW5nICsgbGFuZ19sZW4gKyAxOworICAgICAgICAgbWVtY3B5KHRleHRwLT5sYW5nX2tleSwgdGV4dF9wdHJbaV0ubGFuZ19rZXksIGxhbmdfa2V5X2xlbik7CisgICAgICAgICAqKHRleHRwLT5sYW5nX2tleSArIGxhbmdfa2V5X2xlbikgPSAnXDAnOworICAgICAgICAgdGV4dHAtPnRleHQgPSB0ZXh0cC0+bGFuZ19rZXkgKyBsYW5nX2tleV9sZW4gKyAxOworICAgICAgfQorCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICB0ZXh0cC0+bGFuZz1OVUxMOworICAgICAgICAgdGV4dHAtPmxhbmdfa2V5PU5VTEw7CisgICAgICAgICB0ZXh0cC0+dGV4dCA9IHRleHRwLT5rZXkgKyBrZXlfbGVuICsgMTsKKyAgICAgIH0KKworICAgICAgaWYgKHRleHRfbGVuZ3RoICE9IDApCisgICAgICAgICBtZW1jcHkodGV4dHAtPnRleHQsIHRleHRfcHRyW2ldLnRleHQsIHRleHRfbGVuZ3RoKTsKKworICAgICAgKih0ZXh0cC0+dGV4dCArIHRleHRfbGVuZ3RoKSA9ICdcMCc7CisKKyMgIGlmZGVmIFBOR19pVFh0X1NVUFBPUlRFRAorICAgICAgaWYgKHRleHRwLT5jb21wcmVzc2lvbiA+IDApCisgICAgICB7CisgICAgICAgICB0ZXh0cC0+dGV4dF9sZW5ndGggPSAwOworICAgICAgICAgdGV4dHAtPml0eHRfbGVuZ3RoID0gdGV4dF9sZW5ndGg7CisgICAgICB9CisKKyAgICAgIGVsc2UKKyMgIGVuZGlmCisgICAgICB7CisgICAgICAgICB0ZXh0cC0+dGV4dF9sZW5ndGggPSB0ZXh0X2xlbmd0aDsKKyAgICAgICAgIHRleHRwLT5pdHh0X2xlbmd0aCA9IDA7CisgICAgICB9CisKKyAgICAgIGluZm9fcHRyLT5udW1fdGV4dCsrOworICAgICAgcG5nX2RlYnVnMSgzLCAidHJhbnNmZXJyZWQgdGV4dCBjaHVuayAlZCIsIGluZm9fcHRyLT5udW1fdGV4dCk7CisgICB9CisKKyAgIHJldHVybigwKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX3RJTUVfU1VQUE9SVEVECit2b2lkIFBOR0FQSQorcG5nX3NldF90SU1FKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLAorICAgIHBuZ19jb25zdF90aW1lcCBtb2RfdGltZSkKK3sKKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAidElNRSIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwgfHwgbW9kX3RpbWUgPT0gTlVMTCB8fAorICAgICAgIChwbmdfcHRyLT5tb2RlICYgUE5HX1dST1RFX3RJTUUpICE9IDApCisgICAgICByZXR1cm47CisKKyAgIGlmIChtb2RfdGltZS0+bW9udGggPT0gMCAgIHx8IG1vZF90aW1lLT5tb250aCA+IDEyICB8fAorICAgICAgIG1vZF90aW1lLT5kYXkgICA9PSAwICAgfHwgbW9kX3RpbWUtPmRheSAgID4gMzEgIHx8CisgICAgICAgbW9kX3RpbWUtPmhvdXIgID4gMjMgICB8fCBtb2RfdGltZS0+bWludXRlID4gNTkgfHwKKyAgICAgICBtb2RfdGltZS0+c2Vjb25kID4gNjApCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSWdub3JpbmcgaW52YWxpZCB0aW1lIHZhbHVlIik7CisKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgaW5mb19wdHItPm1vZF90aW1lID0gKm1vZF90aW1lOworICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX3RJTUU7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR190Uk5TX1NVUFBPUlRFRAordm9pZCBQTkdBUEkKK3BuZ19zZXRfdFJOUyhwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwKKyAgICBwbmdfY29uc3RfYnl0ZXAgdHJhbnNfYWxwaGEsIGludCBudW1fdHJhbnMsIHBuZ19jb25zdF9jb2xvcl8xNnAgdHJhbnNfY29sb3IpCit7CisgICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgInRSTlMiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQorCisgICAgICByZXR1cm47CisKKyAgIGlmICh0cmFuc19hbHBoYSAhPSBOVUxMKQorICAgeworICAgICAgIC8qIEl0IG1heSBub3QgYWN0dWFsbHkgYmUgbmVjZXNzYXJ5IHRvIHNldCBwbmdfcHRyLT50cmFuc19hbHBoYSBoZXJlOworICAgICAgICAqIHdlIGRvIGl0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIHdheSB0aGUgcG5nX2hhbmRsZV90Uk5TCisgICAgICAgICogZnVuY3Rpb24gdXNlZCB0byBkbyB0aGUgYWxsb2NhdGlvbi4KKyAgICAgICAgKgorICAgICAgICAqIDEuNi4wOiBUaGUgYWJvdmUgc3RhdGVtZW50IGlzIGluY29ycmVjdDsgcG5nX2hhbmRsZV90Uk5TIGVmZmVjdGl2ZWx5CisgICAgICAgICogcmVsaWVzIG9uIHBuZ19zZXRfdFJOUyBzdG9yaW5nIHRoZSBpbmZvcm1hdGlvbiBpbiBwbmdfc3RydWN0CisgICAgICAgICogKG90aGVyd2lzZSBpdCB3b24ndCBiZSB0aGVyZSBmb3IgdGhlIGNvZGUgaW4gcG5ncnRyYW4uYykuCisgICAgICAgICovCisKKyAgICAgICBwbmdfZnJlZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfRlJFRV9UUk5TLCAwKTsKKworICAgICAgIC8qIENoYW5nZWQgZnJvbSBudW1fdHJhbnMgdG8gUE5HX01BWF9QQUxFVFRFX0xFTkdUSCBpbiB2ZXJzaW9uIDEuMi4xICovCisgICAgICAgcG5nX3B0ci0+dHJhbnNfYWxwaGEgPSBpbmZvX3B0ci0+dHJhbnNfYWxwaGEgPSBwbmdfdm9pZGNhc3QocG5nX2J5dGVwLAorICAgICAgICAgcG5nX21hbGxvYyhwbmdfcHRyLCBQTkdfTUFYX1BBTEVUVEVfTEVOR1RIKSk7CisKKyAgICAgICBpZiAobnVtX3RyYW5zID4gMCAmJiBudW1fdHJhbnMgPD0gUE5HX01BWF9QQUxFVFRFX0xFTkdUSCkKKyAgICAgICAgICBtZW1jcHkoaW5mb19wdHItPnRyYW5zX2FscGhhLCB0cmFuc19hbHBoYSwgKHBuZ19zaXplX3QpbnVtX3RyYW5zKTsKKyAgIH0KKworICAgaWYgKHRyYW5zX2NvbG9yICE9IE5VTEwpCisgICB7CisjaWZkZWYgUE5HX1dBUk5JTkdTX1NVUFBPUlRFRAorICAgICAgaWYgKGluZm9fcHRyLT5iaXRfZGVwdGggPCAxNikKKyAgICAgIHsKKyAgICAgICAgIGludCBzYW1wbGVfbWF4ID0gKDEgPDwgaW5mb19wdHItPmJpdF9kZXB0aCkgLSAxOworCisgICAgICAgICBpZiAoKGluZm9fcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgJiYKKyAgICAgICAgICAgICB0cmFuc19jb2xvci0+Z3JheSA+IHNhbXBsZV9tYXgpIHx8CisgICAgICAgICAgICAgKGluZm9fcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiAmJgorICAgICAgICAgICAgICh0cmFuc19jb2xvci0+cmVkID4gc2FtcGxlX21heCB8fAorICAgICAgICAgICAgIHRyYW5zX2NvbG9yLT5ncmVlbiA+IHNhbXBsZV9tYXggfHwKKyAgICAgICAgICAgICB0cmFuc19jb2xvci0+Ymx1ZSA+IHNhbXBsZV9tYXgpKSkKKyAgICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCisgICAgICAgICAgICAgICAidFJOUyBjaHVuayBoYXMgb3V0LW9mLXJhbmdlIHNhbXBsZXMgZm9yIGJpdF9kZXB0aCIpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIGluZm9fcHRyLT50cmFuc19jb2xvciA9ICp0cmFuc19jb2xvcjsKKworICAgICAgaWYgKG51bV90cmFucyA9PSAwKQorICAgICAgICAgbnVtX3RyYW5zID0gMTsKKyAgIH0KKworICAgaW5mb19wdHItPm51bV90cmFucyA9IChwbmdfdWludF8xNiludW1fdHJhbnM7CisKKyAgIGlmIChudW1fdHJhbnMgIT0gMCkKKyAgIHsKKyAgICAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT190Uk5TOworICAgICAgaW5mb19wdHItPmZyZWVfbWUgfD0gUE5HX0ZSRUVfVFJOUzsKKyAgIH0KK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX3NQTFRfU1VQUE9SVEVECit2b2lkIFBOR0FQSQorcG5nX3NldF9zUExUKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ19jb25zdF9zUExUX3RwIGVudHJpZXMsIGludCBuZW50cmllcykKKy8qCisgKiAgZW50cmllcyAgICAgICAgLSBhcnJheSBvZiBwbmdfc1BMVF90IHN0cnVjdHVyZXMKKyAqICAgICAgICAgICAgICAgICAgIHRvIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHBhbGV0dGVzCisgKiAgICAgICAgICAgICAgICAgICBpbiB0aGUgaW5mbyBzdHJ1Y3R1cmUuCisgKgorICogIG5lbnRyaWVzICAgICAgIC0gbnVtYmVyIG9mIHBhbGV0dGUgc3RydWN0dXJlcyB0byBiZQorICogICAgICAgICAgICAgICAgICAgYWRkZWQuCisgKi8KK3sKKyAgIHBuZ19zUExUX3RwIG5wOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwgfHwgbmVudHJpZXMgPD0gMCB8fCBlbnRyaWVzID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIC8qIFVzZSB0aGUgaW50ZXJuYWwgcmVhbGxvYyBmdW5jdGlvbiwgd2hpY2ggY2hlY2tzIGZvciBhbGwgdGhlIHBvc3NpYmxlCisgICAgKiBvdmVyZmxvd3MuICBOb3RpY2UgdGhhdCB0aGUgcGFyYW1ldGVycyBhcmUgKGludCkgYW5kIChzaXplX3QpCisgICAgKi8KKyAgIG5wID0gcG5nX3ZvaWRjYXN0KHBuZ19zUExUX3RwLHBuZ19yZWFsbG9jX2FycmF5KHBuZ19wdHIsCisgICAgICBpbmZvX3B0ci0+c3BsdF9wYWxldHRlcywgaW5mb19wdHItPnNwbHRfcGFsZXR0ZXNfbnVtLCBuZW50cmllcywKKyAgICAgIHNpemVvZiAqbnApKTsKKworICAgaWYgKG5wID09IE5VTEwpCisgICB7CisgICAgICAvKiBPdXQgb2YgbWVtb3J5IG9yIHRvbyBtYW55IGNodW5rcyAqLworICAgICAgcG5nX2NodW5rX3JlcG9ydChwbmdfcHRyLCAidG9vIG1hbnkgc1BMVCBjaHVua3MiLCBQTkdfQ0hVTktfV1JJVEVfRVJST1IpOworCisgICAgICByZXR1cm47CisgICB9CisKKyAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzKTsKKyAgIGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzID0gbnA7CisgICBpbmZvX3B0ci0+ZnJlZV9tZSB8PSBQTkdfRlJFRV9TUExUOworCisgICBucCArPSBpbmZvX3B0ci0+c3BsdF9wYWxldHRlc19udW07CisKKyAgIGRvCisgICB7CisgICAgICBwbmdfc2l6ZV90IGxlbmd0aDsKKworICAgICAgLyogU2tpcCBpbnZhbGlkIGlucHV0IGVudHJpZXMgKi8KKyAgICAgIGlmIChlbnRyaWVzLT5uYW1lID09IE5VTEwgfHwgZW50cmllcy0+ZW50cmllcyA9PSBOVUxMKQorICAgICAgeworICAgICAgICAgLyogcG5nX2hhbmRsZV9zUExUIGRvZXNuJ3QgZG8gdGhpcywgc28gdGhpcyBpcyBhbiBhcHAgZXJyb3IgKi8KKyAgICAgICAgIHBuZ19hcHBfZXJyb3IocG5nX3B0ciwgInBuZ19zZXRfc1BMVDogaW52YWxpZCBzUExUIik7CisgICAgICAgICAvKiBKdXN0IHNraXAgdGhlIGludmFsaWQgZW50cnkgKi8KKyAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBucC0+ZGVwdGggPSBlbnRyaWVzLT5kZXB0aDsKKworICAgICAgLyogSW4gdGhlIGV2ZW50IG9mIG91dC1vZi1tZW1vcnkganVzdCByZXR1cm4gLSB0aGVyZSdzIG5vIHBvaW50IGtlZXBpbmcKKyAgICAgICAqIG9uIHRyeWluZyB0byBhZGQgc1BMVCBjaHVua3MuCisgICAgICAgKi8KKyAgICAgIGxlbmd0aCA9IHN0cmxlbihlbnRyaWVzLT5uYW1lKSArIDE7CisgICAgICBucC0+bmFtZSA9IHBuZ192b2lkY2FzdChwbmdfY2hhcnAsIHBuZ19tYWxsb2NfYmFzZShwbmdfcHRyLCBsZW5ndGgpKTsKKworICAgICAgaWYgKG5wLT5uYW1lID09IE5VTEwpCisgICAgICAgICBicmVhazsKKworICAgICAgbWVtY3B5KG5wLT5uYW1lLCBlbnRyaWVzLT5uYW1lLCBsZW5ndGgpOworCisgICAgICAvKiBJTVBPUlRBTlQ6IHdlIGhhdmUgbWVtb3J5IG5vdyB0aGF0IHdvbid0IGdldCBmcmVlZCBpZiBzb21ldGhpbmcgZWxzZQorICAgICAgICogZ29lcyB3cm9uZzsgdGhpcyBjb2RlIG11c3QgZnJlZSBpdC4gIHBuZ19tYWxsb2NfYXJyYXkgcHJvZHVjZXMgbm8KKyAgICAgICAqIHdhcm5pbmdzOyB1c2UgYSBwbmdfY2h1bmtfcmVwb3J0IChiZWxvdykgaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgICAgICAgKi8KKyAgICAgIG5wLT5lbnRyaWVzID0gcG5nX3ZvaWRjYXN0KHBuZ19zUExUX2VudHJ5cCwgcG5nX21hbGxvY19hcnJheShwbmdfcHRyLAorICAgICAgICAgIGVudHJpZXMtPm5lbnRyaWVzLCBzaXplb2YgKHBuZ19zUExUX2VudHJ5KSkpOworCisgICAgICBpZiAobnAtPmVudHJpZXMgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIG5wLT5uYW1lKTsKKyAgICAgICAgIG5wLT5uYW1lID0gTlVMTDsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBucC0+bmVudHJpZXMgPSBlbnRyaWVzLT5uZW50cmllczsKKyAgICAgIC8qIFRoaXMgbXVsdGlwbHkgY2FuJ3Qgb3ZlcmZsb3cgYmVjYXVzZSBwbmdfbWFsbG9jX2FycmF5IGhhcyBhbHJlYWR5CisgICAgICAgKiBjaGVja2VkIGl0IHdoZW4gZG9pbmcgdGhlIGFsbG9jYXRpb24uCisgICAgICAgKi8KKyAgICAgIG1lbWNweShucC0+ZW50cmllcywgZW50cmllcy0+ZW50cmllcywKKyAgICAgICAgIGVudHJpZXMtPm5lbnRyaWVzICogc2l6ZW9mIChwbmdfc1BMVF9lbnRyeSkpOworCisgICAgICAvKiBOb3RlIHRoYXQgJ2NvbnRpbnVlJyBza2lwcyB0aGUgYWR2YW5jZSBvZiB0aGUgb3V0IHBvaW50ZXIgYW5kIG91dAorICAgICAgICogY291bnQsIHNvIGFuIGludmFsaWQgZW50cnkgaXMgbm90IGFkZGVkLgorICAgICAgICovCisgICAgICBpbmZvX3B0ci0+dmFsaWQgfD0gUE5HX0lORk9fc1BMVDsKKyAgICAgICsrKGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzX251bSk7CisgICAgICArK25wOworICAgfQorICAgd2hpbGUgKCsrZW50cmllcywgLS1uZW50cmllcyk7CisKKyAgIGlmIChuZW50cmllcyA+IDApCisgICAgICBwbmdfY2h1bmtfcmVwb3J0KHBuZ19wdHIsICJzUExUIG91dCBvZiBtZW1vcnkiLCBQTkdfQ0hVTktfV1JJVEVfRVJST1IpOworfQorI2VuZGlmIC8qIHNQTFQgKi8KKworI2lmZGVmIFBOR19TVE9SRV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKK3N0YXRpYyBwbmdfYnl0ZQorY2hlY2tfbG9jYXRpb24ocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIGludCBsb2NhdGlvbikKK3sKKyAgIGxvY2F0aW9uICY9IChQTkdfSEFWRV9JSERSfFBOR19IQVZFX1BMVEV8UE5HX0FGVEVSX0lEQVQpOworCisgICAvKiBOZXcgaW4gMS42LjA7IGNvcHkgdGhlIGxvY2F0aW9uIGFuZCBjaGVjayBpdC4gIFRoaXMgaXMgYW4gQVBJCisgICAgKiBjaGFuZ2U7IHByZXZpb3VzbHkgdGhlIGFwcCBoYWQgdG8gdXNlIHRoZQorICAgICogcG5nX3NldF91bmtub3duX2NodW5rX2xvY2F0aW9uIEFQSSBiZWxvdyBmb3IgZWFjaCBjaHVuay4KKyAgICAqLworICAgaWYgKGxvY2F0aW9uID09IDAgJiYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSVNfUkVBRF9TVFJVQ1QpID09IDApCisgICB7CisgICAgICAvKiBXcml0ZSBzdHJ1Y3QsIHNvIHVua25vd24gY2h1bmtzIGNvbWUgZnJvbSB0aGUgYXBwICovCisgICAgICBwbmdfYXBwX3dhcm5pbmcocG5nX3B0ciwKKyAgICAgICAgICJwbmdfc2V0X3Vua25vd25fY2h1bmtzIG5vdyBleHBlY3RzIGEgdmFsaWQgbG9jYXRpb24iKTsKKyAgICAgIC8qIFVzZSB0aGUgb2xkIGJlaGF2aW9yICovCisgICAgICBsb2NhdGlvbiA9IChwbmdfYnl0ZSkocG5nX3B0ci0+bW9kZSAmCisgICAgICAgICAoUE5HX0hBVkVfSUhEUnxQTkdfSEFWRV9QTFRFfFBOR19BRlRFUl9JREFUKSk7CisgICB9CisKKyAgIC8qIFRoaXMgbmVlZCBub3QgYmUgYW4gaW50ZXJuYWwgZXJyb3IgLSBpZiB0aGUgYXBwIGNhbGxzCisgICAgKiBwbmdfc2V0X3Vua25vd25fY2h1bmtzIG9uIGEgcmVhZCBwb2ludGVyIGl0IG11c3QgZ2V0IHRoZSBsb2NhdGlvbiByaWdodC4KKyAgICAqLworICAgaWYgKGxvY2F0aW9uID09IDApCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImludmFsaWQgbG9jYXRpb24gaW4gcG5nX3NldF91bmtub3duX2NodW5rcyIpOworCisgICAvKiBOb3cgcmVkdWNlIHRoZSBsb2NhdGlvbiB0byB0aGUgdG9wLW1vc3Qgc2V0IGJpdCBieSByZW1vdmluZyBlYWNoIGxlYXN0CisgICAgKiBzaWduaWZpY2FudCBiaXQgaW4gdHVybi4KKyAgICAqLworICAgd2hpbGUgKGxvY2F0aW9uICE9IChsb2NhdGlvbiAmIC1sb2NhdGlvbikpCisgICAgICBsb2NhdGlvbiAmPSB+KGxvY2F0aW9uICYgLWxvY2F0aW9uKTsKKworICAgLyogVGhlIGNhc3QgaXMgc2FmZSBiZWNhdXNlICdsb2NhdGlvbicgaXMgYSBiaXQgbWFzayBhbmQgb25seSB0aGUgbG93IGZvdXIKKyAgICAqIGJpdHMgYXJlIHNpZ25pZmljYW50LgorICAgICovCisgICByZXR1cm4gKHBuZ19ieXRlKWxvY2F0aW9uOworfQorCit2b2lkIFBOR0FQSQorcG5nX3NldF91bmtub3duX2NodW5rcyhwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ19jb25zdF91bmtub3duX2NodW5rcCB1bmtub3ducywgaW50IG51bV91bmtub3ducykKK3sKKyAgIHBuZ191bmtub3duX2NodW5rcCBucDsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMIHx8IG51bV91bmtub3ducyA8PSAwIHx8CisgICAgICAgdW5rbm93bnMgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgLyogQ2hlY2sgZm9yIHRoZSBmYWlsdXJlIGNhc2VzIHdoZXJlIHN1cHBvcnQgaGFzIGJlZW4gZGlzYWJsZWQgYXQgY29tcGlsZQorICAgICogdGltZS4gIFRoaXMgY29kZSBpcyBoYXJkbHkgZXZlciBjb21waWxlZCAtIGl0J3MgaGVyZSBiZWNhdXNlCisgICAgKiBTVE9SRV9VTktOT1dOX0NIVU5LUyBpcyBzZXQgYnkgYm90aCByZWFkIGFuZCB3cml0ZSBjb2RlIChjb21waWxpbmcgaW4gdGhpcworICAgICogY29kZSkgYnV0IG1heSBiZSBtZWFuaW5nbGVzcyBpZiB0aGUgcmVhZCBvciB3cml0ZSBoYW5kbGluZyBvZiB1bmtub3duCisgICAgKiBjaHVua3MgaXMgbm90IGNvbXBpbGVkIGluLgorICAgICovCisjICBpZiAhZGVmaW5lZChQTkdfUkVBRF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQpICYmIFwKKyAgICAgIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKQorICAgICAgaWYgKChwbmdfcHRyLT5tb2RlICYgUE5HX0lTX1JFQURfU1RSVUNUKSAhPSAwKQorICAgICAgeworICAgICAgICAgcG5nX2FwcF9lcnJvcihwbmdfcHRyLCAibm8gdW5rbm93biBjaHVuayBzdXBwb3J0IG9uIHJlYWQiKTsKKworICAgICAgICAgcmV0dXJuOworICAgICAgfQorIyAgZW5kaWYKKyMgIGlmICFkZWZpbmVkKFBOR19XUklURV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQpICYmIFwKKyAgICAgIGRlZmluZWQoUE5HX1dSSVRFX1NVUFBPUlRFRCkKKyAgICAgIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19JU19SRUFEX1NUUlVDVCkgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19hcHBfZXJyb3IocG5nX3B0ciwgIm5vIHVua25vd24gY2h1bmsgc3VwcG9ydCBvbiB3cml0ZSIpOworCisgICAgICAgICByZXR1cm47CisgICAgICB9CisjICBlbmRpZgorCisgICAvKiBQcmlvciB0byAxLjYuMCB0aGlzIGNvZGUgdXNlZCBwbmdfbWFsbG9jX3dhcm47IGhvd2V2ZXIsIHRoaXMgbWVhbnQgdGhhdAorICAgICogdW5rbm93biBjcml0aWNhbCBjaHVua3MgY291bGQgYmUgbG9zdCB3aXRoIGp1c3QgYSB3YXJuaW5nIHJlc3VsdGluZyBpbgorICAgICogdW5kZWZpbmVkIGJlaGF2aW9yLiAgTm93IHBuZ19jaHVua19yZXBvcnQgaXMgdXNlZCB0byBwcm92aWRlIGJlaGF2aW9yCisgICAgKiBhcHByb3ByaWF0ZSB0byByZWFkIG9yIHdyaXRlLgorICAgICovCisgICBucCA9IHBuZ192b2lkY2FzdChwbmdfdW5rbm93bl9jaHVua3AsIHBuZ19yZWFsbG9jX2FycmF5KHBuZ19wdHIsCisgICAgICAgICBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3MsIGluZm9fcHRyLT51bmtub3duX2NodW5rc19udW0sIG51bV91bmtub3ducywKKyAgICAgICAgIHNpemVvZiAqbnApKTsKKworICAgaWYgKG5wID09IE5VTEwpCisgICB7CisgICAgICBwbmdfY2h1bmtfcmVwb3J0KHBuZ19wdHIsICJ0b28gbWFueSB1bmtub3duIGNodW5rcyIsCisgICAgICAgICBQTkdfQ0hVTktfV1JJVEVfRVJST1IpOworCisgICAgICByZXR1cm47CisgICB9CisKKyAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT51bmtub3duX2NodW5rcyk7CisgICBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3MgPSBucDsgLyogc2FmZSBiZWNhdXNlIGl0IGlzIGluaXRpYWxpemVkICovCisgICBpbmZvX3B0ci0+ZnJlZV9tZSB8PSBQTkdfRlJFRV9VTktOOworCisgICBucCArPSBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3NfbnVtOworCisgICAvKiBJbmNyZW1lbnQgdW5rbm93bl9jaHVua3NfbnVtIGVhY2ggdGltZSByb3VuZCB0aGUgbG9vcCB0byBwcm90ZWN0IHRoZQorICAgICoganVzdC1hbGxvY2F0ZWQgY2h1bmsgZGF0YS4KKyAgICAqLworICAgZm9yICg7IG51bV91bmtub3ducyA+IDA7IC0tbnVtX3Vua25vd25zLCArK3Vua25vd25zKQorICAgeworICAgICAgbWVtY3B5KG5wLT5uYW1lLCB1bmtub3ducy0+bmFtZSwgKHNpemVvZiBucC0+bmFtZSkpOworICAgICAgbnAtPm5hbWVbKHNpemVvZiBucC0+bmFtZSktMV0gPSAnXDAnOworICAgICAgbnAtPmxvY2F0aW9uID0gY2hlY2tfbG9jYXRpb24ocG5nX3B0ciwgdW5rbm93bnMtPmxvY2F0aW9uKTsKKworICAgICAgaWYgKHVua25vd25zLT5zaXplID09IDApCisgICAgICB7CisgICAgICAgICBucC0+ZGF0YSA9IE5VTEw7CisgICAgICAgICBucC0+c2l6ZSA9IDA7CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIG5wLT5kYXRhID0gcG5nX3ZvaWRjYXN0KHBuZ19ieXRlcCwKKyAgICAgICAgICAgIHBuZ19tYWxsb2NfYmFzZShwbmdfcHRyLCB1bmtub3ducy0+c2l6ZSkpOworCisgICAgICAgICBpZiAobnAtPmRhdGEgPT0gTlVMTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19jaHVua19yZXBvcnQocG5nX3B0ciwgInVua25vd24gY2h1bms6IG91dCBvZiBtZW1vcnkiLAorICAgICAgICAgICAgICAgUE5HX0NIVU5LX1dSSVRFX0VSUk9SKTsKKyAgICAgICAgICAgIC8qIEJ1dCBqdXN0IHNraXAgc3RvcmluZyB0aGUgdW5rbm93biBjaHVuayAqLworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICB9CisKKyAgICAgICAgIG1lbWNweShucC0+ZGF0YSwgdW5rbm93bnMtPmRhdGEsIHVua25vd25zLT5zaXplKTsKKyAgICAgICAgIG5wLT5zaXplID0gdW5rbm93bnMtPnNpemU7CisgICAgICB9CisKKyAgICAgIC8qIFRoZXNlIGluY3JlbWVudHMgYXJlIHNraXBwZWQgb24gb3V0LW9mLW1lbW9yeSBmb3IgdGhlIGRhdGEgLSB0aGUKKyAgICAgICAqIHVua25vd24gY2h1bmsgZW50cnkgZ2V0cyBvdmVyd3JpdHRlbiBpZiB0aGUgcG5nX2NodW5rX3JlcG9ydCByZXR1cm5zLgorICAgICAgICogVGhpcyBpcyBjb3JyZWN0IGluIHRoZSByZWFkIGNhc2UgKHRoZSBjaHVuayBpcyBqdXN0IGRyb3BwZWQuKQorICAgICAgICovCisgICAgICArK25wOworICAgICAgKysoaW5mb19wdHItPnVua25vd25fY2h1bmtzX251bSk7CisgICB9Cit9CisKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3Vua25vd25fY2h1bmtfbG9jYXRpb24ocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsCisgICAgaW50IGNodW5rLCBpbnQgbG9jYXRpb24pCit7CisgICAvKiBUaGlzIEFQSSBpcyBwcmV0dHkgcG9pbnRsZXNzIGluIDEuNi4wIGJlY2F1c2UgdGhlIGxvY2F0aW9uIGNhbiBiZSBzZXQKKyAgICAqIGJlZm9yZSB0aGUgY2FsbCB0byBwbmdfc2V0X3Vua25vd25fY2h1bmtzLgorICAgICoKKyAgICAqIFRPRE86IGFkZCBhIHBuZ19hcHBfd2FybmluZyBpbiAxLjcKKyAgICAqLworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmIGNodW5rID49IDAgJiYKKyAgICAgIGNodW5rIDwgaW5mb19wdHItPnVua25vd25fY2h1bmtzX251bSkKKyAgIHsKKyAgICAgIGlmICgobG9jYXRpb24gJiAoUE5HX0hBVkVfSUhEUnxQTkdfSEFWRV9QTFRFfFBOR19BRlRFUl9JREFUKSkgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19hcHBfZXJyb3IocG5nX3B0ciwgImludmFsaWQgdW5rbm93biBjaHVuayBsb2NhdGlvbiIpOworICAgICAgICAgLyogRmFrZSBvdXQgdGhlIHByZSAxLjYuMCBiZWhhdmlvcjogKi8KKyAgICAgICAgIGlmICgobG9jYXRpb24gJiBQTkdfSEFWRV9JREFUKSAhPSAwKSAvKiB1bmRvY3VtZW50ZWQhICovCisgICAgICAgICAgICBsb2NhdGlvbiA9IFBOR19BRlRFUl9JREFUOworCisgICAgICAgICBlbHNlCisgICAgICAgICAgICBsb2NhdGlvbiA9IFBOR19IQVZFX0lIRFI7IC8qIGFsc28gdW5kb2N1bWVudGVkICovCisgICAgICB9CisKKyAgICAgIGluZm9fcHRyLT51bmtub3duX2NodW5rc1tjaHVua10ubG9jYXRpb24gPQorICAgICAgICAgY2hlY2tfbG9jYXRpb24ocG5nX3B0ciwgbG9jYXRpb24pOworICAgfQorfQorI2VuZGlmIC8qIFNUT1JFX1VOS05PV05fQ0hVTktTICovCisKKyNpZmRlZiBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRAorcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfcGVybWl0X21uZ19mZWF0dXJlcyAocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ191aW50XzMyIG1uZ19mZWF0dXJlcykKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybiAwOworCisgICBwbmdfcHRyLT5tbmdfZmVhdHVyZXNfcGVybWl0dGVkID0gbW5nX2ZlYXR1cmVzICYgUE5HX0FMTF9NTkdfRkVBVFVSRVM7CisKKyAgIHJldHVybiBwbmdfcHRyLT5tbmdfZmVhdHVyZXNfcGVybWl0dGVkOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfSEFORExFX0FTX1VOS05PV05fU1VQUE9SVEVECitzdGF0aWMgdW5zaWduZWQgaW50CithZGRfb25lX2NodW5rKHBuZ19ieXRlcCBsaXN0LCB1bnNpZ25lZCBpbnQgY291bnQsIHBuZ19jb25zdF9ieXRlcCBhZGQsIGludCBrZWVwKQoreworICAgdW5zaWduZWQgaW50IGk7CisKKyAgIC8qIFV0aWxpdHkgZnVuY3Rpb246IHVwZGF0ZSB0aGUgJ2tlZXAnIHN0YXRlIG9mIGEgY2h1bmsgaWYgaXQgaXMgYWxyZWFkeSBpbgorICAgICogdGhlIGxpc3QsIG90aGVyd2lzZSBhZGQgaXQgdG8gdGhlIGxpc3QuCisgICAgKi8KKyAgIGZvciAoaT0wOyBpPGNvdW50OyArK2ksIGxpc3QgKz0gNSkKKyAgIHsKKyAgICAgIGlmIChtZW1jbXAobGlzdCwgYWRkLCA0KSA9PSAwKQorICAgICAgeworICAgICAgICAgbGlzdFs0XSA9IChwbmdfYnl0ZSlrZWVwOworCisgICAgICAgICByZXR1cm4gY291bnQ7CisgICAgICB9CisgICB9CisKKyAgIGlmIChrZWVwICE9IFBOR19IQU5ETEVfQ0hVTktfQVNfREVGQVVMVCkKKyAgIHsKKyAgICAgICsrY291bnQ7CisgICAgICBtZW1jcHkobGlzdCwgYWRkLCA0KTsKKyAgICAgIGxpc3RbNF0gPSAocG5nX2J5dGUpa2VlcDsKKyAgIH0KKworICAgcmV0dXJuIGNvdW50OworfQorCit2b2lkIFBOR0FQSQorcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQga2VlcCwKKyAgICBwbmdfY29uc3RfYnl0ZXAgY2h1bmtfbGlzdCwgaW50IG51bV9jaHVua3NfaW4pCit7CisgICBwbmdfYnl0ZXAgbmV3X2xpc3Q7CisgICB1bnNpZ25lZCBpbnQgbnVtX2NodW5rcywgb2xkX251bV9jaHVua3M7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIGlmIChrZWVwIDwgMCB8fCBrZWVwID49IFBOR19IQU5ETEVfQ0hVTktfTEFTVCkKKyAgIHsKKyAgICAgIHBuZ19hcHBfZXJyb3IocG5nX3B0ciwgInBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rczogaW52YWxpZCBrZWVwIik7CisKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgaWYgKG51bV9jaHVua3NfaW4gPD0gMCkKKyAgIHsKKyAgICAgIHBuZ19wdHItPnVua25vd25fZGVmYXVsdCA9IGtlZXA7CisKKyAgICAgIC8qICcwJyBtZWFucyBqdXN0IHNldCB0aGUgZmxhZ3MsIHNvIHN0b3AgaGVyZSAqLworICAgICAgaWYgKG51bV9jaHVua3NfaW4gPT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiAobnVtX2NodW5rc19pbiA8IDApCisgICB7CisgICAgICAvKiBJZ25vcmUgYWxsIHVua25vd24gY2h1bmtzIGFuZCBhbGwgY2h1bmtzIHJlY29nbml6ZWQgYnkKKyAgICAgICAqIGxpYnBuZyBleGNlcHQgZm9yIElIRFIsIFBMVEUsIHRSTlMsIElEQVQsIGFuZCBJRU5ECisgICAgICAgKi8KKyAgICAgIHN0YXRpYyBQTkdfQ09OU1QgcG5nX2J5dGUgY2h1bmtzX3RvX2lnbm9yZVtdID0geworICAgICAgICAgOTgsICA3NSwgIDcxLCAgNjgsICdcMCcsICAvKiBiS0dEICovCisgICAgICAgICA5OSwgIDcyLCAgODIsICA3NywgJ1wwJywgIC8qIGNIUk0gKi8KKyAgICAgICAgMTAzLCAgNjUsICA3NywgIDY1LCAnXDAnLCAgLyogZ0FNQSAqLworICAgICAgICAxMDQsICA3MywgIDgzLCAgODQsICdcMCcsICAvKiBoSVNUICovCisgICAgICAgIDEwNSwgIDY3LCAgNjcsICA4MCwgJ1wwJywgIC8qIGlDQ1AgKi8KKyAgICAgICAgMTA1LCAgODQsICA4OCwgMTE2LCAnXDAnLCAgLyogaVRYdCAqLworICAgICAgICAxMTEsICA3MCwgIDcwLCAxMTUsICdcMCcsICAvKiBvRkZzICovCisgICAgICAgIDExMiwgIDY3LCAgNjUsICA3NiwgJ1wwJywgIC8qIHBDQUwgKi8KKyAgICAgICAgMTEyLCAgNzIsICA4OSwgMTE1LCAnXDAnLCAgLyogcEhZcyAqLworICAgICAgICAxMTUsICA2NiwgIDczLCAgODQsICdcMCcsICAvKiBzQklUICovCisgICAgICAgIDExNSwgIDY3LCAgNjUsICA3NiwgJ1wwJywgIC8qIHNDQUwgKi8KKyAgICAgICAgMTE1LCAgODAsICA3NiwgIDg0LCAnXDAnLCAgLyogc1BMVCAqLworICAgICAgICAxMTUsICA4NCwgIDY5LCAgODIsICdcMCcsICAvKiBzVEVSICovCisgICAgICAgIDExNSwgIDgyLCAgNzEsICA2NiwgJ1wwJywgIC8qIHNSR0IgKi8KKyAgICAgICAgMTE2LCAgNjksICA4OCwgMTE2LCAnXDAnLCAgLyogdEVYdCAqLworICAgICAgICAxMTYsICA3MywgIDc3LCAgNjksICdcMCcsICAvKiB0SU1FICovCisgICAgICAgIDEyMiwgIDg0LCAgODgsIDExNiwgJ1wwJyAgIC8qIHpUWHQgKi8KKyAgICAgIH07CisKKyAgICAgIGNodW5rX2xpc3QgPSBjaHVua3NfdG9faWdub3JlOworICAgICAgbnVtX2NodW5rcyA9ICh1bnNpZ25lZCBpbnQpLypTQUZFKi8oc2l6ZW9mIGNodW5rc190b19pZ25vcmUpLzVVOworICAgfQorCisgICBlbHNlIC8qIG51bV9jaHVua3NfaW4gPiAwICovCisgICB7CisgICAgICBpZiAoY2h1bmtfbGlzdCA9PSBOVUxMKQorICAgICAgeworICAgICAgICAgLyogUHJpb3IgdG8gMS42LjAgdGhpcyB3YXMgc2lsZW50bHkgaWdub3JlZCwgbm93IGl0IGlzIGFuIGFwcF9lcnJvcgorICAgICAgICAgICogd2hpY2ggY2FuIGJlIHN3aXRjaGVkIG9mZi4KKyAgICAgICAgICAqLworICAgICAgICAgcG5nX2FwcF9lcnJvcihwbmdfcHRyLCAicG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzOiBubyBjaHVuayBsaXN0Iik7CisKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgbnVtX2NodW5rcyA9IG51bV9jaHVua3NfaW47CisgICB9CisKKyAgIG9sZF9udW1fY2h1bmtzID0gcG5nX3B0ci0+bnVtX2NodW5rX2xpc3Q7CisgICBpZiAocG5nX3B0ci0+Y2h1bmtfbGlzdCA9PSBOVUxMKQorICAgICAgb2xkX251bV9jaHVua3MgPSAwOworCisgICAvKiBTaW5jZSBudW1fY2h1bmtzIGlzIGFsd2F5cyByZXN0cmljdGVkIHRvIFVJTlRfTUFYLzUgdGhpcyBjYW4ndCBvdmVyZmxvdy4KKyAgICAqLworICAgaWYgKG51bV9jaHVua3MgKyBvbGRfbnVtX2NodW5rcyA+IFVJTlRfTUFYLzUpCisgICB7CisgICAgICBwbmdfYXBwX2Vycm9yKHBuZ19wdHIsICJwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3M6IHRvbyBtYW55IGNodW5rcyIpOworCisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8qIElmIHRoZXNlIGNodW5rcyBhcmUgYmVpbmcgcmVzZXQgdG8gdGhlIGRlZmF1bHQgdGhlbiBubyBtb3JlIG1lbW9yeSBpcworICAgICogcmVxdWlyZWQgYmVjYXVzZSBhZGRfb25lX2NodW5rIGFib3ZlIGRvZXNuJ3QgZXh0ZW5kIHRoZSBsaXN0IGlmIHRoZSAna2VlcCcKKyAgICAqIHBhcmFtZXRlciBpcyB0aGUgZGVmYXVsdC4KKyAgICAqLworICAgaWYgKGtlZXAgIT0gMCkKKyAgIHsKKyAgICAgIG5ld19saXN0ID0gcG5nX3ZvaWRjYXN0KHBuZ19ieXRlcCwgcG5nX21hbGxvYyhwbmdfcHRyLAorICAgICAgICAgIDUgKiAobnVtX2NodW5rcyArIG9sZF9udW1fY2h1bmtzKSkpOworCisgICAgICBpZiAob2xkX251bV9jaHVua3MgPiAwKQorICAgICAgICAgbWVtY3B5KG5ld19saXN0LCBwbmdfcHRyLT5jaHVua19saXN0LCA1Km9sZF9udW1fY2h1bmtzKTsKKyAgIH0KKworICAgZWxzZSBpZiAob2xkX251bV9jaHVua3MgPiAwKQorICAgICAgbmV3X2xpc3QgPSBwbmdfcHRyLT5jaHVua19saXN0OworCisgICBlbHNlCisgICAgICBuZXdfbGlzdCA9IE5VTEw7CisKKyAgIC8qIEFkZCB0aGUgbmV3IGNodW5rcyB0b2dldGhlciB3aXRoIGVhY2ggb25lJ3MgaGFuZGxpbmcgY29kZS4gIElmIHRoZSBjaHVuaworICAgICogYWxyZWFkeSBleGlzdHMgdGhlIGNvZGUgaXMgdXBkYXRlZCwgb3RoZXJ3aXNlIHRoZSBjaHVuayBpcyBhZGRlZCB0byB0aGUKKyAgICAqIGVuZC4gIChJbiBsaWJwbmcgMS42LjAgb3JkZXIgbm8gbG9uZ2VyIG1hdHRlcnMgYmVjYXVzZSB0aGlzIGNvZGUgZW5mb3JjZXMKKyAgICAqIHRoZSBlYXJsaWVyIGNvbnZlbnRpb24gdGhhdCB0aGUgbGFzdCBzZXR0aW5nIGlzIHRoZSBvbmUgdGhhdCBpcyB1c2VkLikKKyAgICAqLworICAgaWYgKG5ld19saXN0ICE9IE5VTEwpCisgICB7CisgICAgICBwbmdfY29uc3RfYnl0ZXAgaW5saXN0OworICAgICAgcG5nX2J5dGVwIG91dGxpc3Q7CisgICAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgICAgZm9yIChpPTA7IGk8bnVtX2NodW5rczsgKytpKQorICAgICAgeworICAgICAgICAgb2xkX251bV9jaHVua3MgPSBhZGRfb25lX2NodW5rKG5ld19saXN0LCBvbGRfbnVtX2NodW5rcywKKyAgICAgICAgICAgIGNodW5rX2xpc3QrNSppLCBrZWVwKTsKKyAgICAgIH0KKworICAgICAgLyogTm93IHJlbW92ZSBhbnkgc3B1cmlvdXMgJ2RlZmF1bHQnIGVudHJpZXMuICovCisgICAgICBudW1fY2h1bmtzID0gMDsKKyAgICAgIGZvciAoaT0wLCBpbmxpc3Q9b3V0bGlzdD1uZXdfbGlzdDsgaTxvbGRfbnVtX2NodW5rczsgKytpLCBpbmxpc3QgKz0gNSkKKyAgICAgIHsKKyAgICAgICAgIGlmIChpbmxpc3RbNF0pCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAob3V0bGlzdCAhPSBpbmxpc3QpCisgICAgICAgICAgICAgICBtZW1jcHkob3V0bGlzdCwgaW5saXN0LCA1KTsKKyAgICAgICAgICAgIG91dGxpc3QgKz0gNTsKKyAgICAgICAgICAgICsrbnVtX2NodW5rczsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogVGhpcyBtZWFucyB0aGUgYXBwbGljYXRpb24gaGFzIHJlbW92ZWQgYWxsIHRoZSBzcGVjaWFsaXplZCBoYW5kbGluZy4gKi8KKyAgICAgIGlmIChudW1fY2h1bmtzID09IDApCisgICAgICB7CisgICAgICAgICBpZiAocG5nX3B0ci0+Y2h1bmtfbGlzdCAhPSBuZXdfbGlzdCkKKyAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIG5ld19saXN0KTsKKworICAgICAgICAgbmV3X2xpc3QgPSBOVUxMOworICAgICAgfQorICAgfQorCisgICBlbHNlCisgICAgICBudW1fY2h1bmtzID0gMDsKKworICAgcG5nX3B0ci0+bnVtX2NodW5rX2xpc3QgPSBudW1fY2h1bmtzOworCisgICBpZiAocG5nX3B0ci0+Y2h1bmtfbGlzdCAhPSBuZXdfbGlzdCkKKyAgIHsKKyAgICAgIGlmIChwbmdfcHRyLT5jaHVua19saXN0ICE9IE5VTEwpCisgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua19saXN0KTsKKworICAgICAgcG5nX3B0ci0+Y2h1bmtfbGlzdCA9IG5ld19saXN0OworICAgfQorfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9VU0VSX0NIVU5LU19TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3JlYWRfdXNlcl9jaHVua19mbihwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3ZvaWRwIHVzZXJfY2h1bmtfcHRyLAorICAgIHBuZ191c2VyX2NodW5rX3B0ciByZWFkX3VzZXJfY2h1bmtfZm4pCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfcmVhZF91c2VyX2NodW5rX2ZuIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIHBuZ19wdHItPnJlYWRfdXNlcl9jaHVua19mbiA9IHJlYWRfdXNlcl9jaHVua19mbjsKKyAgIHBuZ19wdHItPnVzZXJfY2h1bmtfcHRyID0gdXNlcl9jaHVua19wdHI7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19JTkZPX0lNQUdFX1NVUFBPUlRFRAordm9pZCBQTkdBUEkKK3BuZ19zZXRfcm93cyhwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwKKyAgICBwbmdfYnl0ZXBwIHJvd19wb2ludGVycykKK3sKKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAicm93cyIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIGlmIChpbmZvX3B0ci0+cm93X3BvaW50ZXJzICE9IE5VTEwgJiYKKyAgICAgICAoaW5mb19wdHItPnJvd19wb2ludGVycyAhPSByb3dfcG9pbnRlcnMpKQorICAgICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0ZSRUVfUk9XUywgMCk7CisKKyAgIGluZm9fcHRyLT5yb3dfcG9pbnRlcnMgPSByb3dfcG9pbnRlcnM7CisKKyAgIGlmIChyb3dfcG9pbnRlcnMgIT0gTlVMTCkKKyAgICAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19JREFUOworfQorI2VuZGlmCisKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X2NvbXByZXNzaW9uX2J1ZmZlcl9zaXplKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfc2l6ZV90IHNpemUpCit7CisgICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgICByZXR1cm47CisKKyAgICBpZiAoc2l6ZSA9PSAwIHx8IHNpemUgPiBQTkdfVUlOVF8zMV9NQVgpCisgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJpbnZhbGlkIGNvbXByZXNzaW9uIGJ1ZmZlciBzaXplIik7CisKKyMgIGlmZGVmIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVECisgICAgICBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSVNfUkVBRF9TVFJVQ1QpICE9IDApCisgICAgICB7CisgICAgICAgICBwbmdfcHRyLT5JREFUX3JlYWRfc2l6ZSA9IChwbmdfdWludF8zMilzaXplOyAvKiBjaGVja2VkIGFib3ZlICovCisgICAgICAgICByZXR1cm47CisgICAgICB9CisjICBlbmRpZgorCisjICBpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECisgICAgICBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSVNfUkVBRF9TVFJVQ1QpID09IDApCisgICAgICB7CisgICAgICAgICBpZiAocG5nX3B0ci0+em93bmVyICE9IDApCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAgICAgICAiQ29tcHJlc3Npb24gYnVmZmVyIHNpemUgY2Fubm90IGJlIGNoYW5nZWQgYmVjYXVzZSBpdCBpcyBpbiB1c2UiKTsKKworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgfQorCisjaWZuZGVmIF9fQ09WRVJJVFlfXworICAgICAgICAgLyogU29tZSBjb21waWxlcnMgY29tcGxhaW4gdGhhdCB0aGlzIGlzIGFsd2F5cyBmYWxzZS4gIEhvd2V2ZXIsIGl0CisgICAgICAgICAgKiBjYW4gYmUgdHJ1ZSB3aGVuIGludGVnZXIgb3ZlcmZsb3cgaGFwcGVucy4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKHNpemUgPiBaTElCX0lPX01BWCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCisgICAgICAgICAgICAgICAiQ29tcHJlc3Npb24gYnVmZmVyIHNpemUgbGltaXRlZCB0byBzeXN0ZW0gbWF4aW11bSIpOworICAgICAgICAgICAgc2l6ZSA9IFpMSUJfSU9fTUFYOyAvKiBtdXN0IGZpdCAqLworICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgIGlmIChzaXplIDwgNikKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIERlZmxhdGUgd2lsbCBwb3RlbnRpYWxseSBnbyBpbnRvIGFuIGluZmluaXRlIGxvb3Agb24gYSBTWU5DX0ZMVVNICisgICAgICAgICAgICAgKiBpZiB0aGlzIGlzIHBlcm1pdHRlZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKKyAgICAgICAgICAgICAgICJDb21wcmVzc2lvbiBidWZmZXIgc2l6ZSBjYW5ub3QgYmUgcmVkdWNlZCBiZWxvdyA2Iik7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYgKHBuZ19wdHItPnpidWZmZXJfc2l6ZSAhPSBzaXplKQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2ZyZWVfYnVmZmVyX2xpc3QocG5nX3B0ciwgJnBuZ19wdHItPnpidWZmZXJfbGlzdCk7CisgICAgICAgICAgICBwbmdfcHRyLT56YnVmZmVyX3NpemUgPSAodUludClzaXplOworICAgICAgICAgfQorICAgICAgfQorIyAgZW5kaWYKK30KKwordm9pZCBQTkdBUEkKK3BuZ19zZXRfaW52YWxpZChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwgaW50IG1hc2spCit7CisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwpCisgICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gfm1hc2s7Cit9CisKKworI2lmZGVmIFBOR19TRVRfVVNFUl9MSU1JVFNfU1VQUE9SVEVECisvKiBUaGlzIGZ1bmN0aW9uIHdhcyBhZGRlZCB0byBsaWJwbmcgMS4yLjYgKi8KK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3VzZXJfbGltaXRzIChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgdXNlcl93aWR0aF9tYXgsCisgICAgcG5nX3VpbnRfMzIgdXNlcl9oZWlnaHRfbWF4KQoreworICAgLyogSW1hZ2VzIHdpdGggZGltZW5zaW9ucyBsYXJnZXIgdGhhbiB0aGVzZSBsaW1pdHMgd2lsbCBiZQorICAgICogcmVqZWN0ZWQgYnkgcG5nX3NldF9JSERSKCkuICBUbyBhY2NlcHQgYW55IFBORyBkYXRhc3RyZWFtCisgICAgKiByZWdhcmRsZXNzIG9mIGRpbWVuc2lvbnMsIHNldCBib3RoIGxpbWl0cyB0byAweDdmZmZmZmZmLgorICAgICovCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBwbmdfcHRyLT51c2VyX3dpZHRoX21heCA9IHVzZXJfd2lkdGhfbWF4OworICAgcG5nX3B0ci0+dXNlcl9oZWlnaHRfbWF4ID0gdXNlcl9oZWlnaHRfbWF4OworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHdhcyBhZGRlZCB0byBsaWJwbmcgMS40LjAgKi8KK3ZvaWQgUE5HQVBJCitwbmdfc2V0X2NodW5rX2NhY2hlX21heCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ191aW50XzMyIHVzZXJfY2h1bmtfY2FjaGVfbWF4KQoreworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCkKKyAgICAgIHBuZ19wdHItPnVzZXJfY2h1bmtfY2FjaGVfbWF4ID0gdXNlcl9jaHVua19jYWNoZV9tYXg7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gd2FzIGFkZGVkIHRvIGxpYnBuZyAxLjQuMSAqLwordm9pZCBQTkdBUEkKK3BuZ19zZXRfY2h1bmtfbWFsbG9jX21heCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2FsbG9jX3NpemVfdCB1c2VyX2NodW5rX21hbGxvY19tYXgpCit7CisgICBpZiAocG5nX3B0ciAhPSBOVUxMKQorICAgICAgcG5nX3B0ci0+dXNlcl9jaHVua19tYWxsb2NfbWF4ID0gdXNlcl9jaHVua19tYWxsb2NfbWF4OworfQorI2VuZGlmIC8qID9TRVRfVVNFUl9MSU1JVFMgKi8KKworCisjaWZkZWYgUE5HX0JFTklHTl9FUlJPUlNfU1VQUE9SVEVECit2b2lkIFBOR0FQSQorcG5nX3NldF9iZW5pZ25fZXJyb3JzKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgYWxsb3dlZCkKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9iZW5pZ25fZXJyb3JzIik7CisKKyAgIC8qIElmIGFsbG93ZWQgaXMgMSwgcG5nX2Jlbmlnbl9lcnJvcigpIGlzIHRyZWF0ZWQgYXMgYSB3YXJuaW5nLgorICAgICoKKyAgICAqIElmIGFsbG93ZWQgaXMgMCwgcG5nX2Jlbmlnbl9lcnJvcigpIGlzIHRyZWF0ZWQgYXMgYW4gZXJyb3IgKHdoaWNoCisgICAgKiBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvciBpZiBwbmdfc2V0X2Jlbmlnbl9lcnJvcnMoKSBpcyBub3QgY2FsbGVkKS4KKyAgICAqLworCisgICBpZiAoYWxsb3dlZCAhPSAwKQorICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfQkVOSUdOX0VSUk9SU19XQVJOIHwKKyAgICAgICAgIFBOR19GTEFHX0FQUF9XQVJOSU5HU19XQVJOIHwgUE5HX0ZMQUdfQVBQX0VSUk9SU19XQVJOOworCisgICBlbHNlCisgICAgICBwbmdfcHRyLT5mbGFncyAmPSB+KFBOR19GTEFHX0JFTklHTl9FUlJPUlNfV0FSTiB8CisgICAgICAgICBQTkdfRkxBR19BUFBfV0FSTklOR1NfV0FSTiB8IFBOR19GTEFHX0FQUF9FUlJPUlNfV0FSTik7Cit9CisjZW5kaWYgLyogQkVOSUdOX0VSUk9SUyAqLworCisjaWZkZWYgUE5HX0NIRUNLX0ZPUl9JTlZBTElEX0lOREVYX1NVUFBPUlRFRAorICAgLyogV2hldGhlciB0byByZXBvcnQgaW52YWxpZCBwYWxldHRlIGluZGV4OyBhZGRlZCBhdCBsaWJuZy0xLjUuMTAuCisgICAgKiBJdCBpcyBwb3NzaWJsZSBmb3IgYW4gaW5kZXhlZCAoY29sb3ItdHlwZT09MykgUE5HIGZpbGUgdG8gY29udGFpbgorICAgICogcGl4ZWxzIHdpdGggaW52YWxpZCAob3V0LW9mLXJhbmdlKSBpbmRleGVzIGlmIHRoZSBQTFRFIGNodW5rIGhhcworICAgICogZmV3ZXIgZW50cmllcyB0aGFuIHRoZSBpbWFnZSdzIGJpdC1kZXB0aCB3b3VsZCBhbGxvdy4gV2UgcmVjb3ZlcgorICAgICogZnJvbSB0aGlzIGdyYWNlZnVsbHkgYnkgZmlsbGluZyBhbnkgaW5jb21wbGV0ZSBwYWxldHRlIHdpdGggemVyb3MKKyAgICAqIChvcGFxdWUgYmxhY2spLiAgQnkgZGVmYXVsdCwgd2hlbiB0aGlzIG9jY3VycyBsaWJwbmcgd2lsbCBpc3N1ZQorICAgICogYSBiZW5pZ24gZXJyb3IuICBUaGlzIEFQSSBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGF0IGJlaGF2aW9yLgorICAgICovCit2b2lkIFBOR0FQSQorcG5nX3NldF9jaGVja19mb3JfaW52YWxpZF9pbmRleChwbmdfc3RydWN0cnAgcG5nX3B0ciwgaW50IGFsbG93ZWQpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfY2hlY2tfZm9yX2ludmFsaWRfaW5kZXgiKTsKKworICAgaWYgKGFsbG93ZWQgPiAwKQorICAgICAgcG5nX3B0ci0+bnVtX3BhbGV0dGVfbWF4ID0gMDsKKworICAgZWxzZQorICAgICAgcG5nX3B0ci0+bnVtX3BhbGV0dGVfbWF4ID0gLTE7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBSRUFEIHx8IFdSSVRFICovCmRpZmYgLS1naXQgYS9saWJwbmcvcG5nc3RydWN0LmggYi9saWJwbmcvcG5nc3RydWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQyZTM4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9wbmdzdHJ1Y3QuaApAQCAtMCwwICsxLDUzNiBAQAorCisvKiBwbmdzdHJ1Y3QuaCAtIGhlYWRlciBmaWxlIGZvciBQTkcgcmVmZXJlbmNlIGxpYnJhcnkKKyAqCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4xOCBbSnVseSAyMywgMjAxNV0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDE1IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCisgKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCisgKi8KKworLyogVGhlIHN0cnVjdHVyZSB0aGF0IGhvbGRzIHRoZSBpbmZvcm1hdGlvbiB0byByZWFkIGFuZCB3cml0ZSBQTkcgZmlsZXMuCisgKiBUaGUgb25seSBwZW9wbGUgd2hvIG5lZWQgdG8gY2FyZSBhYm91dCB3aGF0IGlzIGluc2lkZSBvZiB0aGlzIGFyZSB0aGUKKyAqIHBlb3BsZSB3aG8gd2lsbCBiZSBtb2RpZnlpbmcgdGhlIGxpYnJhcnkgZm9yIHRoZWlyIG93biBzcGVjaWFsIG5lZWRzLgorICogSXQgc2hvdWxkIE5PVCBiZSBhY2Nlc3NlZCBkaXJlY3RseSBieSBhbiBhcHBsaWNhdGlvbi4KKyAqLworCisjaWZuZGVmIFBOR1NUUlVDVF9ICisjZGVmaW5lIFBOR1NUUlVDVF9ICisvKiB6bGliLmggZGVmaW5lcyB0aGUgc3RydWN0dXJlIHpfc3RyZWFtLCBhbiBpbnN0YW5jZSBvZiB3aGljaCBpcyBpbmNsdWRlZAorICogaW4gdGhpcyBzdHJ1Y3R1cmUgYW5kIGlzIHJlcXVpcmVkIGZvciBkZWNvbXByZXNzaW5nIHRoZSBMWiBjb21wcmVzc2VkCisgKiBkYXRhIGluIFBORyBmaWxlcy4KKyAqLworI2lmbmRlZiBaTElCX0NPTlNUCisgICAvKiBXZSBtdXN0IGVuc3VyZSB0aGF0IHpsaWIgdXNlcyAnY29uc3QnIGluIGRlY2xhcmF0aW9ucy4gKi8KKyMgIGRlZmluZSBaTElCX0NPTlNUCisjZW5kaWYKKyNpbmNsdWRlICJ6bGliLmgiCisjaWZkZWYgY29uc3QKKyAgIC8qIHpsaWIuaCBzb21ldGltZXMgI2RlZmluZXMgY29uc3QgdG8gbm90aGluZywgdW5kbyB0aGlzLiAqLworIyAgdW5kZWYgY29uc3QKKyNlbmRpZgorCisvKiB6bGliLmggaGFzIG1lZGlvY3JlIHpfY29uc3QgdXNlIGJlZm9yZSAxLjIuNiwgdGhpcyBzdHVmZiBpcyBmb3IgY29tcGF0aWJpbGl0eQorICogd2l0aCBvbGRlciBidWlsZHMuCisgKi8KKyNpZiBaTElCX1ZFUk5VTSA8IDB4MTI2MAorIyAgZGVmaW5lIFBOR1pfTVNHX0NBU1QocykgcG5nX2NvbnN0Y2FzdChjaGFyKixzKQorIyAgZGVmaW5lIFBOR1pfSU5QVVRfQ0FTVChiKSBwbmdfY29uc3RjYXN0KHBuZ19ieXRlcCxiKQorI2Vsc2UKKyMgIGRlZmluZSBQTkdaX01TR19DQVNUKHMpIChzKQorIyAgZGVmaW5lIFBOR1pfSU5QVVRfQ0FTVChiKSAoYikKKyNlbmRpZgorCisvKiB6bGliLmggZGVjbGFyZXMgYSBtYWdpYyB0eXBlICd1SW50JyB0aGF0IGxpbWl0cyB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCB6bGliCisgKiBjYW4gaGFuZGxlIGF0IG9uY2UuICBUaGlzIHR5cGUgbmVlZCBiZSBubyBsYXJnZXIgdGhhbiAxNiBiaXRzIChzbyBtYXhpbXVtIG9mCisgKiA2NTUzNSksIHRoaXMgZGVmaW5lIGFsbG93cyB1cyB0byBkaXNjb3ZlciBob3cgYmlnIGl0IGlzLCBidXQgbGltaXRlZCBieSB0aGUKKyAqIG1heGltdXVtIGZvciBwbmdfc2l6ZV90LiAgVGhlIHZhbHVlIGNhbiBiZSBvdmVycmlkZW4gaW4gYSBsaWJyYXJ5IGJ1aWxkCisgKiAocG5ndXNyLmgsIG9yIHNldCBpdCBpbiBDUFBGTEFHUykgYW5kIGl0IHdvcmtzIHRvIHNldCBpdCB0byBhIGNvbnNpZGVyYWJseQorICogbG93ZXIgdmFsdWUgKGUuZy4gMjU1IHdvcmtzKS4gIEEgbG93ZXIgdmFsdWUgbWF5IGhlbHAgbWVtb3J5IHVzYWdlIChzbGlnaHRseSkKKyAqIGFuZCBtYXkgZXZlbiBpbXByb3ZlIHBlcmZvcm1hbmNlIG9uIHNvbWUgc3lzdGVtcyAoYW5kIGRlZ3JhZGUgaXQgb24gb3RoZXJzLikKKyAqLworI2lmbmRlZiBaTElCX0lPX01BWAorIyAgZGVmaW5lIFpMSUJfSU9fTUFYICgodUludCktMSkKKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAorLyogVGhlIHR5cGUgb2YgYSBjb21wcmVzc2lvbiBidWZmZXIgbGlzdCB1c2VkIGJ5IHRoZSB3cml0ZSBjb2RlLiAqLwordHlwZWRlZiBzdHJ1Y3QgcG5nX2NvbXByZXNzaW9uX2J1ZmZlcgoreworICAgc3RydWN0IHBuZ19jb21wcmVzc2lvbl9idWZmZXIgKm5leHQ7CisgICBwbmdfYnl0ZSAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0WzFdOyAvKiBhY3R1YWxseSB6YnVmX3NpemUgKi8KK30gcG5nX2NvbXByZXNzaW9uX2J1ZmZlciwgKnBuZ19jb21wcmVzc2lvbl9idWZmZXJwOworCisjZGVmaW5lIFBOR19DT01QUkVTU0lPTl9CVUZGRVJfU0laRShwcClcCisgICAob2Zmc2V0b2YocG5nX2NvbXByZXNzaW9uX2J1ZmZlciwgb3V0cHV0KSArIChwcCktPnpidWZmZXJfc2l6ZSkKKyNlbmRpZgorCisvKiBDb2xvcnNwYWNlIHN1cHBvcnQ7IHN0cnVjdHVyZXMgdXNlZCBpbiBwbmdfc3RydWN0LCBwbmdfaW5mbyBhbmQgaW4gaW50ZXJuYWwKKyAqIGZ1bmN0aW9ucyB0byBob2xkIGFuZCBjb21tdW5pY2F0ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29sb3Igc3BhY2UuCisgKgorICogUE5HX0NPTE9SU1BBQ0VfU1VQUE9SVEVEIGlzIG9ubHkgcmVxdWlyZWQgaWYgdGhlIGFwcGxpY2F0aW9uIHdpbGwgcGVyZm9ybQorICogY29sb3JzcGFjZSBjb3JyZWN0aW9ucywgb3RoZXJ3aXNlIGFsbCB0aGUgY29sb3JzcGFjZSBpbmZvcm1hdGlvbiBjYW4gYmUKKyAqIHNraXBwZWQgYW5kIHRoZSBzaXplIG9mIGxpYnBuZyBjYW4gYmUgcmVkdWNlZCAoc2lnbmlmaWNhbnRseSkgYnkgY29tcGlsaW5nCisgKiBvdXQgdGhlIGNvbG9yc3BhY2Ugc3VwcG9ydC4KKyAqLworI2lmZGVmIFBOR19DT0xPUlNQQUNFX1NVUFBPUlRFRAorLyogVGhlIGNocm9tYXRpY2l0aWVzIG9mIHRoZSByZWQsIGdyZWVuIGFuZCBibHVlIGNvbG9yYW50cyBhbmQgdGhlIGNocm9tYXRpY2l0eQorICogb2YgdGhlIGNvcnJlc3BvbmRpbmcgd2hpdGUgcG9pbnQgKGkuZS4gb2YgcmdiKDEuMCwxLjAsMS4wKSkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBuZ194eQoreworICAgcG5nX2ZpeGVkX3BvaW50IHJlZHgsIHJlZHk7CisgICBwbmdfZml4ZWRfcG9pbnQgZ3JlZW54LCBncmVlbnk7CisgICBwbmdfZml4ZWRfcG9pbnQgYmx1ZXgsIGJsdWV5OworICAgcG5nX2ZpeGVkX3BvaW50IHdoaXRleCwgd2hpdGV5OworfSBwbmdfeHk7CisKKy8qIFRoZSBzYW1lIGRhdGEgYXMgYWJvdmUgYnV0IGVuY29kZWQgYXMgQ0lFIFhZWiB2YWx1ZXMuICBXaGVuIHRoaXMgZGF0YSBjb21lcworICogZnJvbSBjaHJvbWF0aWNpdGllcyB0aGUgc3VtIG9mIHRoZSBZIHZhbHVlcyBpcyBhc3N1bWVkIHRvIGJlIDEuMAorICovCit0eXBlZGVmIHN0cnVjdCBwbmdfWFlaCit7CisgICBwbmdfZml4ZWRfcG9pbnQgcmVkX1gsIHJlZF9ZLCByZWRfWjsKKyAgIHBuZ19maXhlZF9wb2ludCBncmVlbl9YLCBncmVlbl9ZLCBncmVlbl9aOworICAgcG5nX2ZpeGVkX3BvaW50IGJsdWVfWCwgYmx1ZV9ZLCBibHVlX1o7Cit9IHBuZ19YWVo7CisjZW5kaWYgLyogQ09MT1JTUEFDRSAqLworCisjaWYgZGVmaW5lZChQTkdfQ09MT1JTUEFDRV9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX0dBTU1BX1NVUFBPUlRFRCkKKy8qIEEgY29sb3JzcGFjZSBpcyBhbGwgdGhlIGFib3ZlIHBsdXMsIHBvdGVudGlhbGx5LCBwcm9maWxlIGluZm9ybWF0aW9uOworICogaG93ZXZlciBhdCBwcmVzZW50IGxpYnBuZyBkb2VzIG5vdCB1c2UgdGhlIHByb2ZpbGUgaW50ZXJuYWxseSBzbyBpdCBpcyBvbmx5CisgKiBzdG9yZWQgaW4gdGhlIHBuZ19pbmZvIHN0cnVjdCAoaWYgaUNDUCBpcyBzdXBwb3J0ZWQuKSAgVGhlIHJlbmRlcmluZyBpbnRlbnQKKyAqIGlzIHJldGFpbmVkIGhlcmUgYW5kIGlzIGNoZWNrZWQuCisgKgorICogVGhlIGZpbGUgZ2FtbWEgZW5jb2RpbmcgaW5mb3JtYXRpb24gaXMgYWxzbyBzdG9yZWQgaGVyZSBhbmQgZ2FtbWEgY29ycmVjdGlvbgorICogaXMgZG9uZSBieSBsaWJwbmcsIHdoZXJlYXMgY29sb3IgY29ycmVjdGlvbiBtdXN0IGN1cnJlbnRseSBiZSBkb25lIGJ5IHRoZQorICogYXBwbGljYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHBuZ19jb2xvcnNwYWNlCit7CisjaWZkZWYgUE5HX0dBTU1BX1NVUFBPUlRFRAorICAgcG5nX2ZpeGVkX3BvaW50IGdhbW1hOyAgICAgICAgLyogRmlsZSBnYW1tYSAqLworI2VuZGlmCisKKyNpZmRlZiBQTkdfQ09MT1JTUEFDRV9TVVBQT1JURUQKKyAgIHBuZ194eSAgICAgIGVuZF9wb2ludHNfeHk7ICAgIC8qIEVuZCBwb2ludHMgYXMgY2hyb21hdGljaXRpZXMgKi8KKyAgIHBuZ19YWVogICAgIGVuZF9wb2ludHNfWFlaOyAgIC8qIEVuZCBwb2ludHMgYXMgQ0lFIFhZWiBjb2xvcmFudCB2YWx1ZXMgKi8KKyAgIHBuZ191aW50XzE2IHJlbmRlcmluZ19pbnRlbnQ7IC8qIFJlbmRlcmluZyBpbnRlbnQgb2YgYSBwcm9maWxlICovCisjZW5kaWYKKworICAgLyogRmxhZ3MgYXJlIGFsd2F5cyBkZWZpbmVkIHRvIHNpbXBsaWZ5IHRoZSBjb2RlLiAqLworICAgcG5nX3VpbnRfMTYgZmxhZ3M7ICAgICAgICAgICAgLyogQXMgZGVmaW5lZCBiZWxvdyAqLworfSBwbmdfY29sb3JzcGFjZSwgKiBQTkdfUkVTVFJJQ1QgcG5nX2NvbG9yc3BhY2VycDsKKwordHlwZWRlZiBjb25zdCBwbmdfY29sb3JzcGFjZSAqIFBOR19SRVNUUklDVCBwbmdfY29uc3RfY29sb3JzcGFjZXJwOworCisvKiBHZW5lcmFsIGZsYWdzIGZvciB0aGUgJ2ZsYWdzJyBmaWVsZCAqLworI2RlZmluZSBQTkdfQ09MT1JTUEFDRV9IQVZFX0dBTU1BICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgUE5HX0NPTE9SU1BBQ0VfSEFWRV9FTkRQT0lOVFMgICAgICAgMHgwMDAyCisjZGVmaW5lIFBOR19DT0xPUlNQQUNFX0hBVkVfSU5URU5UICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBQTkdfQ09MT1JTUEFDRV9GUk9NX2dBTUEgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgUE5HX0NPTE9SU1BBQ0VfRlJPTV9jSFJNICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFBOR19DT0xPUlNQQUNFX0ZST01fc1JHQiAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBQTkdfQ09MT1JTUEFDRV9FTkRQT0lOVFNfTUFUQ0hfc1JHQiAweDAwNDAKKyNkZWZpbmUgUE5HX0NPTE9SU1BBQ0VfTUFUQ0hFU19zUkdCICAgICAgICAgMHgwMDgwIC8qIGV4YWN0IG1hdGNoIG9uIHByb2ZpbGUgKi8KKyNkZWZpbmUgUE5HX0NPTE9SU1BBQ0VfSU5WQUxJRCAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIFBOR19DT0xPUlNQQUNFX0NBTkNFTChmbGFncykgICAgICAgICgweGZmZmYgXiAoZmxhZ3MpKQorI2VuZGlmIC8qIENPTE9SU1BBQ0UgfHwgR0FNTUEgKi8KKworI2lmZGVmIFBOR19JTkRFWF9TVVBQT1JURUQKKy8qIHBuZ19saW5lX2luZGV4X3N0cnVjdCByZWNvcmRzIGFuIGluZGV4IHBvaW50LCB3aGVyZSB3ZSBpbXBvc2UgYW4gaW5kZXggcG9pbnQKKyAqIHRvIGJlIGxvY2F0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgZm9yIHNpbXBsaWZ5aW5nIHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcG5nX2xpbmVfaW5kZXhfc3RydWN0Cit7CisgICAvLyBzdGF0ZSBvZiB0aGUgbHogZGVjb2RlcgorICAgel9zdHJlYW1wICAgel9zdGF0ZTsKKworICAgLy8gdGhlIElEQVQgaGVhZGVyIHBvc2l0aW9uIG9mIHRoZSBjaHVuaywgd2hpY2ggdGhlIGluZGV4IHBvaW50IGlzIGluCisgICBwbmdfdWludF8zMiAgc3RyZWFtX2lkYXRfcG9zaXRpb247CisKKyAgIC8vIHdlIGludGVuZCB0byByZWNvcmQgdGhlIG9mZnNldCBvZiB0aGUgaW5kZXggcG9pbnQgaW4gdGhlIGNodW5rLAorICAgLy8gYnV0IHdlIHJlY29yZCB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBieXRlcyBpbiB0aGUgY2h1bmsgYWZ0ZXIgdGhlCisgICAvLyBpbmRleCBwb2ludC4gVGhhdCdzIGJlY2F1c2UgUE5HIHByb2Nlc3NlcyBhIGNodW5rIHRoaXMgd2F5LgorICAgcG5nX3VpbnRfMzIgIGJ5dGVzX2xlZnRfaW5faWRhdDsKKworICAgLy8gZGVjb21wcmVzc2VkIGRhdGEgb2YgdGhlIHByZXZpb3VzIHJvdworICAgcG5nX2J5dGVwICAgcHJldl9yb3c7Cit9IHBuZ19saW5lX2luZGV4OwordHlwZWRlZiBwbmdfbGluZV9pbmRleCBGQVIgKiBwbmdfbGluZV9pbmRleHA7CisKK3R5cGVkZWYgc3RydWN0IHBuZ19pbmRleF9zdHJ1Y3QKK3sKKyAgIC8vIEEgdGVtcG9yYXJ5IHZhcmlhYmxlIHVzZWQgd2hlbiB3ZSBidWlsZCB0aGUgaW5kZXguIFRoZSB2YXJpYWJsZSByZWNvcmRzCisgICAvLyB0aGUgSURBVCBoZWFkZXIgcG9zaXRpb24gb2YgdGhlIGxhc3QgY2h1bmsgcmVhZCBpbiBzbyBmYXIuCisgICBwbmdfdWludF8zMiAgc3RyZWFtX2lkYXRfcG9zaXRpb247CisKKyAgIC8vIGxpbmUgaW5kZXggaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBwYXNzZXMKKworICAgLy8gdGhlIG51bWJlciBvZiBpbmRleCBwb2ludHMgaW4gZWFjaCBwYXNzCisgICBwbmdfdWludF8zMiAgc2l6ZVs3XTsKKworICAgLy8gdGhlIGxpbmUgc3BhbiBvZiB0d28gaW5kZXggcG9pbnRzIG9mIGVhY2ggcGFzcworICAgcG5nX3VpbnRfMzIgIHN0ZXBbN107CisKKyAgIC8vIHRoZSBpbmRleCBwb2ludHMgb2YgZWFjaCBwYXNzCisgICBwbmdfbGluZV9pbmRleHAgICpwYXNzX2xpbmVfaW5kZXhbN107Cit9IHBuZ19pbmRleDsKK3R5cGVkZWYgcG5nX2luZGV4IEZBUiAqIHBuZ19pbmRleHA7CisKKyNkZWZpbmUgSU5ERVhfU0FNUExFX1NJWkUgMjU0CisjZW5kaWYKKworc3RydWN0IHBuZ19zdHJ1Y3RfZGVmCit7CisjaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKKyAgIGptcF9idWYgam1wX2J1Zl9sb2NhbDsgICAgIC8qIE5ldyBuYW1lIGluIDEuNi4wIGZvciBqbXBfYnVmIGluIHBuZ19zdHJ1Y3QgKi8KKyAgIHBuZ19sb25nam1wX3B0ciBsb25nam1wX2ZuOy8qIHNldGptcCBub24tbG9jYWwgZ290byBmdW5jdGlvbi4gKi8KKyAgIGptcF9idWYgKmptcF9idWZfcHRyOyAgICAgIC8qIHBhc3NlZCB0byBsb25nam1wX2ZuICovCisgICBzaXplX3Qgam1wX2J1Zl9zaXplOyAgICAgICAvKiBzaXplIG9mIHRoZSBhYm92ZSwgaWYgYWxsb2NhdGVkICovCisjZW5kaWYKKyAgIHBuZ19lcnJvcl9wdHIgZXJyb3JfZm47ICAgIC8qIGZ1bmN0aW9uIGZvciBwcmludGluZyBlcnJvcnMgYW5kIGFib3J0aW5nICovCisjaWZkZWYgUE5HX1dBUk5JTkdTX1NVUFBPUlRFRAorICAgcG5nX2Vycm9yX3B0ciB3YXJuaW5nX2ZuOyAgLyogZnVuY3Rpb24gZm9yIHByaW50aW5nIHdhcm5pbmdzICovCisjZW5kaWYKKyAgIHBuZ192b2lkcCBlcnJvcl9wdHI7ICAgICAgIC8qIHVzZXIgc3VwcGxpZWQgc3RydWN0IGZvciBlcnJvciBmdW5jdGlvbnMgKi8KKyAgIHBuZ19yd19wdHIgd3JpdGVfZGF0YV9mbjsgIC8qIGZ1bmN0aW9uIGZvciB3cml0aW5nIG91dHB1dCBkYXRhICovCisgICBwbmdfcndfcHRyIHJlYWRfZGF0YV9mbjsgICAvKiBmdW5jdGlvbiBmb3IgcmVhZGluZyBpbnB1dCBkYXRhICovCisjaWZkZWYgUE5HX0lOREVYX1NVUFBPUlRFRAorICAgcG5nX3NlZWtfcHRyIHNlZWtfZGF0YV9mbjsgLyogZnVuY3Rpb24gZm9yIHNlZWtpbmcgaW5wdXQgZGF0YSAqLworI2VuZGlmCisgICBwbmdfdm9pZHAgaW9fcHRyOyAgICAgICAgICAvKiBwdHIgdG8gYXBwbGljYXRpb24gc3RydWN0IGZvciBJL08gZnVuY3Rpb25zICovCisKKyNpZmRlZiBQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQKKyAgIHBuZ191c2VyX3RyYW5zZm9ybV9wdHIgcmVhZF91c2VyX3RyYW5zZm9ybV9mbjsgLyogdXNlciByZWFkIHRyYW5zZm9ybSAqLworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVECisgICBwbmdfdXNlcl90cmFuc2Zvcm1fcHRyIHdyaXRlX3VzZXJfdHJhbnNmb3JtX2ZuOyAvKiB1c2VyIHdyaXRlIHRyYW5zZm9ybSAqLworI2VuZGlmCisKKy8qIFRoZXNlIHdlcmUgYWRkZWQgaW4gbGlicG5nLTEuMC4yICovCisjaWZkZWYgUE5HX1VTRVJfVFJBTlNGT1JNX1BUUl9TVVBQT1JURUQKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkgfHwgXAorICAgIGRlZmluZWQoUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkKKyAgIHBuZ192b2lkcCB1c2VyX3RyYW5zZm9ybV9wdHI7IC8qIHVzZXIgc3VwcGxpZWQgc3RydWN0IGZvciB1c2VyIHRyYW5zZm9ybSAqLworICAgcG5nX2J5dGUgdXNlcl90cmFuc2Zvcm1fZGVwdGg7ICAgIC8qIGJpdCBkZXB0aCBvZiB1c2VyIHRyYW5zZm9ybWVkIHBpeGVscyAqLworICAgcG5nX2J5dGUgdXNlcl90cmFuc2Zvcm1fY2hhbm5lbHM7IC8qIGNoYW5uZWxzIGluIHVzZXIgdHJhbnNmb3JtZWQgcGl4ZWxzICovCisjZW5kaWYKKyNlbmRpZgorCisgICBwbmdfdWludF8zMiBtb2RlOyAgICAgICAgICAvKiB0ZWxscyB1cyB3aGVyZSB3ZSBhcmUgaW4gdGhlIFBORyBmaWxlICovCisgICBwbmdfdWludF8zMiBmbGFnczsgICAgICAgICAvKiBmbGFncyBpbmRpY2F0aW5nIHZhcmlvdXMgdGhpbmdzIHRvIGxpYnBuZyAqLworICAgcG5nX3VpbnRfMzIgdHJhbnNmb3JtYXRpb25zOyAvKiB3aGljaCB0cmFuc2Zvcm1hdGlvbnMgdG8gcGVyZm9ybSAqLworCisgICBwbmdfdWludF8zMiB6b3duZXI7ICAgICAgICAvKiBJRCAoY2h1bmsgdHlwZSkgb2YgenN0cmVhbSBvd25lciwgMCBpZiBub25lICovCisgICB6X3N0cmVhbSAgICB6c3RyZWFtOyAgICAgICAvKiBkZWNvbXByZXNzaW9uIHN0cnVjdHVyZSAqLworCisjaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAorICAgcG5nX2NvbXByZXNzaW9uX2J1ZmZlcnAgemJ1ZmZlcl9saXN0OyAvKiBDcmVhdGVkIG9uIGRlbWFuZCBkdXJpbmcgd3JpdGUgKi8KKyAgIHVJbnQgICAgICAgICAgICAgICAgICAgIHpidWZmZXJfc2l6ZTsgLyogc2l6ZSBvZiB0aGUgYWN0dWFsIGJ1ZmZlciAqLworCisgICBpbnQgemxpYl9sZXZlbDsgICAgICAgICAgICAvKiBob2xkcyB6bGliIGNvbXByZXNzaW9uIGxldmVsICovCisgICBpbnQgemxpYl9tZXRob2Q7ICAgICAgICAgICAvKiBob2xkcyB6bGliIGNvbXByZXNzaW9uIG1ldGhvZCAqLworICAgaW50IHpsaWJfd2luZG93X2JpdHM7ICAgICAgLyogaG9sZHMgemxpYiBjb21wcmVzc2lvbiB3aW5kb3cgYml0cyAqLworICAgaW50IHpsaWJfbWVtX2xldmVsOyAgICAgICAgLyogaG9sZHMgemxpYiBjb21wcmVzc2lvbiBtZW1vcnkgbGV2ZWwgKi8KKyAgIGludCB6bGliX3N0cmF0ZWd5OyAgICAgICAgIC8qIGhvbGRzIHpsaWIgY29tcHJlc3Npb24gc3RyYXRlZ3kgKi8KKyNlbmRpZgorLyogQWRkZWQgYXQgbGlicG5nIDEuNS40ICovCisjaWZkZWYgUE5HX1dSSVRFX0NVU1RPTUlaRV9aVFhUX0NPTVBSRVNTSU9OX1NVUFBPUlRFRAorICAgaW50IHpsaWJfdGV4dF9sZXZlbDsgICAgICAgICAgICAvKiBob2xkcyB6bGliIGNvbXByZXNzaW9uIGxldmVsICovCisgICBpbnQgemxpYl90ZXh0X21ldGhvZDsgICAgICAgICAgIC8qIGhvbGRzIHpsaWIgY29tcHJlc3Npb24gbWV0aG9kICovCisgICBpbnQgemxpYl90ZXh0X3dpbmRvd19iaXRzOyAgICAgIC8qIGhvbGRzIHpsaWIgY29tcHJlc3Npb24gd2luZG93IGJpdHMgKi8KKyAgIGludCB6bGliX3RleHRfbWVtX2xldmVsOyAgICAgICAgLyogaG9sZHMgemxpYiBjb21wcmVzc2lvbiBtZW1vcnkgbGV2ZWwgKi8KKyAgIGludCB6bGliX3RleHRfc3RyYXRlZ3k7ICAgICAgICAgLyogaG9sZHMgemxpYiBjb21wcmVzc2lvbiBzdHJhdGVneSAqLworI2VuZGlmCisvKiBFbmQgb2YgbWF0ZXJpYWwgYWRkZWQgYXQgbGlicG5nIDEuNS40ICovCisvKiBBZGRlZCBhdCBsaWJwbmcgMS42LjAgKi8KKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECisgICBpbnQgemxpYl9zZXRfbGV2ZWw7ICAgICAgICAvKiBBY3R1YWwgdmFsdWVzIHNldCBpbnRvIHRoZSB6c3RyZWFtIG9uIHdyaXRlICovCisgICBpbnQgemxpYl9zZXRfbWV0aG9kOworICAgaW50IHpsaWJfc2V0X3dpbmRvd19iaXRzOworICAgaW50IHpsaWJfc2V0X21lbV9sZXZlbDsKKyAgIGludCB6bGliX3NldF9zdHJhdGVneTsKKyNlbmRpZgorCisgICBwbmdfdWludF8zMiB3aWR0aDsgICAgICAgICAvKiB3aWR0aCBvZiBpbWFnZSBpbiBwaXhlbHMgKi8KKyAgIHBuZ191aW50XzMyIGhlaWdodDsgICAgICAgIC8qIGhlaWdodCBvZiBpbWFnZSBpbiBwaXhlbHMgKi8KKyAgIHBuZ191aW50XzMyIG51bV9yb3dzOyAgICAgIC8qIG51bWJlciBvZiByb3dzIGluIGN1cnJlbnQgcGFzcyAqLworICAgcG5nX3VpbnRfMzIgdXNyX3dpZHRoOyAgICAgLyogd2lkdGggb2Ygcm93IGF0IHN0YXJ0IG9mIHdyaXRlICovCisgICBwbmdfc2l6ZV90IHJvd2J5dGVzOyAgICAgICAvKiBzaXplIG9mIHJvdyBpbiBieXRlcyAqLworICAgcG5nX3VpbnRfMzIgaXdpZHRoOyAgICAgICAgLyogd2lkdGggb2YgY3VycmVudCBpbnRlcmxhY2VkIHJvdyBpbiBwaXhlbHMgKi8KKyAgIHBuZ191aW50XzMyIHJvd19udW1iZXI7ICAgIC8qIGN1cnJlbnQgcm93IGluIGludGVybGFjZSBwYXNzICovCisgICBwbmdfdWludF8zMiBjaHVua19uYW1lOyAgICAvKiBQTkdfQ0hVTksoKSBpZCBvZiBjdXJyZW50IGNodW5rICovCisgICBwbmdfYnl0ZXAgcHJldl9yb3c7ICAgICAgICAvKiBidWZmZXIgdG8gc2F2ZSBwcmV2aW91cyAodW5maWx0ZXJlZCkgcm93LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogV2hpbGUgcmVhZGluZyB0aGlzIGlzIGEgcG9pbnRlciBpbnRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBiaWdfcHJldl9yb3c7IHdoaWxlIHdyaXRpbmcgaXQgaXMgc2VwYXJhdGVseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYWxsb2NhdGVkIGlmIG5lZWRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgcG5nX2J5dGVwIHJvd19idWY7ICAgICAgICAgLyogYnVmZmVyIHRvIHNhdmUgY3VycmVudCAodW5maWx0ZXJlZCkgcm93LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogV2hpbGUgcmVhZGluZywgdGhpcyBpcyBhIHBvaW50ZXIgaW50bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmlnX3Jvd19idWY7IHdoaWxlIHdyaXRpbmcgaXQgaXMgc2VwYXJhdGVseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYWxsb2NhdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWZkZWYgUE5HX1dSSVRFX0ZJTFRFUl9TVVBQT1JURUQKKyAgIHBuZ19ieXRlcCB0cnlfcm93OyAgICAvKiBidWZmZXIgdG8gc2F2ZSB0cmlhbCByb3cgd2hlbiBmaWx0ZXJpbmcgKi8KKyAgIHBuZ19ieXRlcCB0c3Rfcm93OyAgICAvKiBidWZmZXIgdG8gc2F2ZSBiZXN0IHRyaWFsIHJvdyB3aGVuIGZpbHRlcmluZyAqLworI2VuZGlmCisgICBwbmdfc2l6ZV90IGluZm9fcm93Ynl0ZXM7ICAvKiBBZGRlZCBpbiAxLjUuNDogY2FjaGUgb2YgdXBkYXRlZCByb3cgYnl0ZXMgKi8KKworICAgcG5nX3VpbnRfMzIgaWRhdF9zaXplOyAgICAgLyogY3VycmVudCBJREFUIHNpemUgZm9yIHJlYWQgKi8KKyAgIHBuZ191aW50XzMyIGNyYzsgICAgICAgICAgIC8qIGN1cnJlbnQgY2h1bmsgQ1JDIHZhbHVlICovCisgICBwbmdfY29sb3JwIHBhbGV0dGU7ICAgICAgICAvKiBwYWxldHRlIGZyb20gdGhlIGlucHV0IGZpbGUgKi8KKyAgIHBuZ191aW50XzE2IG51bV9wYWxldHRlOyAgIC8qIG51bWJlciBvZiBjb2xvciBlbnRyaWVzIGluIHBhbGV0dGUgKi8KKworLyogQWRkZWQgYXQgbGlicG5nLTEuNS4xMCAqLworI2lmZGVmIFBOR19DSEVDS19GT1JfSU5WQUxJRF9JTkRFWF9TVVBQT1JURUQKKyAgIGludCBudW1fcGFsZXR0ZV9tYXg7ICAgICAgIC8qIG1heGltdW0gcGFsZXR0ZSBpbmRleCBmb3VuZCBpbiBJREFUICovCisjZW5kaWYKKworICAgcG5nX3VpbnRfMTYgbnVtX3RyYW5zOyAgICAgLyogbnVtYmVyIG9mIHRyYW5zcGFyZW5jeSB2YWx1ZXMgKi8KKyAgIHBuZ19ieXRlIGNvbXByZXNzaW9uOyAgICAgIC8qIGZpbGUgY29tcHJlc3Npb24gdHlwZSAoYWx3YXlzIDApICovCisgICBwbmdfYnl0ZSBmaWx0ZXI7ICAgICAgICAgICAvKiBmaWxlIGZpbHRlciB0eXBlIChhbHdheXMgMCkgKi8KKyAgIHBuZ19ieXRlIGludGVybGFjZWQ7ICAgICAgIC8qIFBOR19JTlRFUkxBQ0VfTk9ORSwgUE5HX0lOVEVSTEFDRV9BREFNNyAqLworICAgcG5nX2J5dGUgcGFzczsgICAgICAgICAgICAgLyogY3VycmVudCBpbnRlcmxhY2UgcGFzcyAoMCAtIDYpICovCisgICBwbmdfYnl0ZSBkb19maWx0ZXI7ICAgICAgICAvKiByb3cgZmlsdGVyIGZsYWdzIChzZWUgUE5HX0ZJTFRFUl8gYmVsb3cgKSAqLworICAgcG5nX2J5dGUgY29sb3JfdHlwZTsgICAgICAgLyogY29sb3IgdHlwZSBvZiBmaWxlICovCisgICBwbmdfYnl0ZSBiaXRfZGVwdGg7ICAgICAgICAvKiBiaXQgZGVwdGggb2YgZmlsZSAqLworICAgcG5nX2J5dGUgdXNyX2JpdF9kZXB0aDsgICAgLyogYml0IGRlcHRoIG9mIHVzZXJzIHJvdzogd3JpdGUgb25seSAqLworICAgcG5nX2J5dGUgcGl4ZWxfZGVwdGg7ICAgICAgLyogbnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsICovCisgICBwbmdfYnl0ZSBjaGFubmVsczsgICAgICAgICAvKiBudW1iZXIgb2YgY2hhbm5lbHMgaW4gZmlsZSAqLworI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKKyAgIHBuZ19ieXRlIHVzcl9jaGFubmVsczsgICAgIC8qIGNoYW5uZWxzIGF0IHN0YXJ0IG9mIHdyaXRlOiB3cml0ZSBvbmx5ICovCisjZW5kaWYKKyAgIHBuZ19ieXRlIHNpZ19ieXRlczsgICAgICAgIC8qIG1hZ2ljIGJ5dGVzIHJlYWQvd3JpdHRlbiBmcm9tIHN0YXJ0IG9mIGZpbGUgKi8KKyAgIHBuZ19ieXRlIG1heGltdW1fcGl4ZWxfZGVwdGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwaXhlbCBkZXB0aCB1c2VkIGZvciB0aGUgcm93IGJ1ZmZlcnMgKi8KKyAgIHBuZ19ieXRlIHRyYW5zZm9ybWVkX3BpeGVsX2RlcHRoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGl4ZWwgZGVwdGggYWZ0ZXIgcmVhZC93cml0ZSB0cmFuc2Zvcm1zICovCisjaWYgUE5HX1pMSUJfVkVSTlVNID49IDB4MTI0MAorICAgcG5nX2J5dGUgenN0cmVhbV9zdGFydDsgICAgLyogYXQgc3RhcnQgb2YgYW4gaW5wdXQgemxpYiBzdHJlYW0gKi8KKyNlbmRpZiAvKiBabGliID49IDEuMi40ICovCisjaWYgZGVmaW5lZChQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9GSUxMRVJfU1VQUE9SVEVEKQorICAgcG5nX3VpbnRfMTYgZmlsbGVyOyAgICAgICAgICAgLyogZmlsbGVyIGJ5dGVzIGZvciBwaXhlbCBleHBhbnNpb24gKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfYktHRF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpIHx8XAorICAgZGVmaW5lZChQTkdfUkVBRF9BTFBIQV9NT0RFX1NVUFBPUlRFRCkKKyAgIHBuZ19ieXRlIGJhY2tncm91bmRfZ2FtbWFfdHlwZTsKKyAgIHBuZ19maXhlZF9wb2ludCBiYWNrZ3JvdW5kX2dhbW1hOworICAgcG5nX2NvbG9yXzE2IGJhY2tncm91bmQ7ICAgLyogYmFja2dyb3VuZCBjb2xvciBpbiBzY3JlZW4gZ2FtbWEgc3BhY2UgKi8KKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKKyAgIHBuZ19jb2xvcl8xNiBiYWNrZ3JvdW5kXzE7IC8qIGJhY2tncm91bmQgbm9ybWFsaXplZCB0byBnYW1tYSAxLjAgKi8KKyNlbmRpZgorI2VuZGlmIC8qIGJLR0QgKi8KKworI2lmZGVmIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQKKyAgIHBuZ19mbHVzaF9wdHIgb3V0cHV0X2ZsdXNoX2ZuOyAvKiBGdW5jdGlvbiBmb3IgZmx1c2hpbmcgb3V0cHV0ICovCisgICBwbmdfdWludF8zMiBmbHVzaF9kaXN0OyAgICAvKiBob3cgbWFueSByb3dzIGFwYXJ0IHRvIGZsdXNoLCAwIC0gbm8gZmx1c2ggKi8KKyAgIHBuZ191aW50XzMyIGZsdXNoX3Jvd3M7ICAgIC8qIG51bWJlciBvZiByb3dzIHdyaXR0ZW4gc2luY2UgbGFzdCBmbHVzaCAqLworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKKyAgIGludCBnYW1tYV9zaGlmdDsgICAgICAvKiBudW1iZXIgb2YgImluc2lnbmlmaWNhbnQiIGJpdHMgaW4gMTYtYml0IGdhbW1hICovCisgICBwbmdfZml4ZWRfcG9pbnQgc2NyZWVuX2dhbW1hOyAvKiBzY3JlZW4gZ2FtbWEgdmFsdWUgKGRpc3BsYXlfZXhwb25lbnQpICovCisKKyAgIHBuZ19ieXRlcCBnYW1tYV90YWJsZTsgICAgIC8qIGdhbW1hIHRhYmxlIGZvciA4LWJpdCBkZXB0aCBmaWxlcyAqLworICAgcG5nX3VpbnRfMTZwcCBnYW1tYV8xNl90YWJsZTsgLyogZ2FtbWEgdGFibGUgZm9yIDE2LWJpdCBkZXB0aCBmaWxlcyAqLworI2lmIGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpIHx8IFwKKyAgIGRlZmluZWQoUE5HX1JFQURfQUxQSEFfTU9ERV9TVVBQT1JURUQpIHx8IFwKKyAgIGRlZmluZWQoUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVEKQorICAgcG5nX2J5dGVwIGdhbW1hX2Zyb21fMTsgICAgLyogY29udmVydHMgZnJvbSAxLjAgdG8gc2NyZWVuICovCisgICBwbmdfYnl0ZXAgZ2FtbWFfdG9fMTsgICAgICAvKiBjb252ZXJ0cyBmcm9tIGZpbGUgdG8gMS4wICovCisgICBwbmdfdWludF8xNnBwIGdhbW1hXzE2X2Zyb21fMTsgLyogY29udmVydHMgZnJvbSAxLjAgdG8gc2NyZWVuICovCisgICBwbmdfdWludF8xNnBwIGdhbW1hXzE2X3RvXzE7IC8qIGNvbnZlcnRzIGZyb20gZmlsZSB0byAxLjAgKi8KKyNlbmRpZiAvKiBSRUFEX0JBQ0tHUk9VTkQgfHwgUkVBRF9BTFBIQV9NT0RFIHx8IFJHQl9UT19HUkFZICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19zQklUX1NVUFBPUlRFRCkKKyAgIHBuZ19jb2xvcl84IHNpZ19iaXQ7ICAgICAgIC8qIHNpZ25pZmljYW50IGJpdHMgaW4gZWFjaCBhdmFpbGFibGUgY2hhbm5lbCAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU0hJRlRfU1VQUE9SVEVEKQorICAgcG5nX2NvbG9yXzggc2hpZnQ7ICAgICAgICAgLyogc2hpZnQgZm9yIHNpZ25pZmljYW50IGJpdCB0cmFuZm9ybWF0aW9uICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX3RSTlNfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKSBcCisgfHwgZGVmaW5lZChQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKQorICAgcG5nX2J5dGVwIHRyYW5zX2FscGhhOyAgICAgICAgICAgLyogYWxwaGEgdmFsdWVzIGZvciBwYWxldHRlZCBmaWxlcyAqLworICAgcG5nX2NvbG9yXzE2IHRyYW5zX2NvbG9yOyAgLyogdHJhbnNwYXJlbnQgY29sb3IgZm9yIG5vbi1wYWxldHRlZCBmaWxlcyAqLworI2VuZGlmCisKKyAgIHBuZ19yZWFkX3N0YXR1c19wdHIgcmVhZF9yb3dfZm47ICAgLyogY2FsbGVkIGFmdGVyIGVhY2ggcm93IGlzIGRlY29kZWQgKi8KKyAgIHBuZ193cml0ZV9zdGF0dXNfcHRyIHdyaXRlX3Jvd19mbjsgLyogY2FsbGVkIGFmdGVyIGVhY2ggcm93IGlzIGVuY29kZWQgKi8KKyNpZmRlZiBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQKKyAgIHBuZ19wcm9ncmVzc2l2ZV9pbmZvX3B0ciBpbmZvX2ZuOyAvKiBjYWxsZWQgYWZ0ZXIgaGVhZGVyIGRhdGEgZnVsbHkgcmVhZCAqLworICAgcG5nX3Byb2dyZXNzaXZlX3Jvd19wdHIgcm93X2ZuOyAgIC8qIGNhbGxlZCBhZnRlciBhIHByb2cuIHJvdyBpcyBkZWNvZGVkICovCisgICBwbmdfcHJvZ3Jlc3NpdmVfZW5kX3B0ciBlbmRfZm47ICAgLyogY2FsbGVkIGFmdGVyIGltYWdlIGlzIGNvbXBsZXRlICovCisgICBwbmdfYnl0ZXAgc2F2ZV9idWZmZXJfcHRyOyAgICAgICAgLyogY3VycmVudCBsb2NhdGlvbiBpbiBzYXZlX2J1ZmZlciAqLworICAgcG5nX2J5dGVwIHNhdmVfYnVmZmVyOyAgICAgICAgICAgIC8qIGJ1ZmZlciBmb3IgcHJldmlvdXNseSByZWFkIGRhdGEgKi8KKyAgIHBuZ19ieXRlcCBjdXJyZW50X2J1ZmZlcl9wdHI7ICAgICAvKiBjdXJyZW50IGxvY2F0aW9uIGluIGN1cnJlbnRfYnVmZmVyICovCisgICBwbmdfYnl0ZXAgY3VycmVudF9idWZmZXI7ICAgICAgICAgLyogYnVmZmVyIGZvciByZWNlbnRseSB1c2VkIGRhdGEgKi8KKyAgIHBuZ191aW50XzMyIHB1c2hfbGVuZ3RoOyAgICAgICAgICAvKiBzaXplIG9mIGN1cnJlbnQgaW5wdXQgY2h1bmsgKi8KKyAgIHBuZ191aW50XzMyIHNraXBfbGVuZ3RoOyAgICAgICAgICAvKiBieXRlcyB0byBza2lwIGluIGlucHV0IGRhdGEgKi8KKyAgIHBuZ19zaXplX3Qgc2F2ZV9idWZmZXJfc2l6ZTsgICAgICAvKiBhbW91bnQgb2YgZGF0YSBub3cgaW4gc2F2ZV9idWZmZXIgKi8KKyAgIHBuZ19zaXplX3Qgc2F2ZV9idWZmZXJfbWF4OyAgICAgICAvKiB0b3RhbCBzaXplIG9mIHNhdmVfYnVmZmVyICovCisgICBwbmdfc2l6ZV90IGJ1ZmZlcl9zaXplOyAgICAgICAgICAgLyogdG90YWwgYW1vdW50IG9mIGF2YWlsYWJsZSBpbnB1dCBkYXRhICovCisgICBwbmdfc2l6ZV90IGN1cnJlbnRfYnVmZmVyX3NpemU7ICAgLyogYW1vdW50IG9mIGRhdGEgbm93IGluIGN1cnJlbnRfYnVmZmVyICovCisgICBpbnQgcHJvY2Vzc19tb2RlOyAgICAgICAgICAgICAgICAgLyogd2hhdCBwdXNoIGxpYnJhcnkgaXMgY3VycmVudGx5IGRvaW5nICovCisgICBpbnQgY3VyX3BhbGV0dGU7ICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBwdXNoIGxpYnJhcnkgcGFsZXR0ZSBpbmRleCAqLworCisjZW5kaWYgLyogUFJPR1JFU1NJVkVfUkVBRCAqLworCisjaWYgZGVmaW5lZChfX1RVUkJPQ19fKSAmJiAhZGVmaW5lZChfV2luZG93cykgJiYgIWRlZmluZWQoX19GTEFUX18pCisvKiBGb3IgdGhlIEJvcmxhbmQgc3BlY2lhbCA2NEsgc2VnbWVudCBoYW5kbGVyICovCisgICBwbmdfYnl0ZXBwIG9mZnNldF90YWJsZV9wdHI7CisgICBwbmdfYnl0ZXAgb2Zmc2V0X3RhYmxlOworICAgcG5nX3VpbnRfMTYgb2Zmc2V0X3RhYmxlX251bWJlcjsKKyAgIHBuZ191aW50XzE2IG9mZnNldF90YWJsZV9jb3VudDsKKyAgIHBuZ191aW50XzE2IG9mZnNldF90YWJsZV9jb3VudF9mcmVlOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9RVUFOVElaRV9TVVBQT1JURUQKKyAgIHBuZ19ieXRlcCBwYWxldHRlX2xvb2t1cDsgLyogbG9va3VwIHRhYmxlIGZvciBxdWFudGl6aW5nICovCisgICBwbmdfYnl0ZXAgcXVhbnRpemVfaW5kZXg7IC8qIGluZGV4IHRyYW5zbGF0aW9uIGZvciBwYWxldHRlIGZpbGVzICovCisjZW5kaWYKKworLyogT3B0aW9ucyAqLworI2lmZGVmIFBOR19TRVRfT1BUSU9OX1NVUFBPUlRFRAorICAgcG5nX2J5dGUgb3B0aW9uczsgICAgICAgICAgIC8qIE9uL29mZiBzdGF0ZSAodXAgdG8gNCBvcHRpb25zKSAqLworI2VuZGlmCisKKyNpZiBQTkdfTElCUE5HX1ZFUiA8IDEwNzAwCisvKiBUbyBkbzogcmVtb3ZlIHRoaXMgZnJvbSBsaWJwbmctMS43ICovCisjaWZkZWYgUE5HX1RJTUVfUkZDMTEyM19TVVBQT1JURUQKKyAgIGNoYXIgdGltZV9idWZmZXJbMjldOyAvKiBTdHJpbmcgdG8gaG9sZCBSRkMgMTEyMyB0aW1lIHRleHQgKi8KKyNlbmRpZgorI2VuZGlmCisKKy8qIE5ldyBtZW1iZXJzIGFkZGVkIGluIGxpYnBuZy0xLjAuNiAqLworCisgICBwbmdfdWludF8zMiBmcmVlX21lOyAgICAvKiBmbGFncyBpdGVtcyBsaWJwbmcgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgKi8KKworI2lmZGVmIFBOR19VU0VSX0NIVU5LU19TVVBQT1JURUQKKyAgIHBuZ192b2lkcCB1c2VyX2NodW5rX3B0cjsKKyNpZmRlZiBQTkdfUkVBRF9VU0VSX0NIVU5LU19TVVBQT1JURUQKKyAgIHBuZ191c2VyX2NodW5rX3B0ciByZWFkX3VzZXJfY2h1bmtfZm47IC8qIHVzZXIgcmVhZCBjaHVuayBoYW5kbGVyICovCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgUE5HX1NFVF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKKyAgIGludCAgICAgICAgICB1bmtub3duX2RlZmF1bHQ7IC8qIEFzIFBOR19IQU5ETEVfKiAqLworICAgdW5zaWduZWQgaW50IG51bV9jaHVua19saXN0OyAgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGxpc3QgKi8KKyAgIHBuZ19ieXRlcCAgICBjaHVua19saXN0OyAgICAgIC8qIExpc3Qgb2YgcG5nX2J5dGVbNV07IHRoZSB0ZXh0dWFsIGNodW5rIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZvbGxvd2VkIGJ5IGEgUE5HX0hBTkRMRV8qIGJ5dGUgKi8KKyNlbmRpZgorCisvKiBOZXcgbWVtYmVycyBhZGRlZCBpbiBsaWJwbmctMS4wLjMgKi8KKyNpZmRlZiBQTkdfUkVBRF9SR0JfVE9fR1JBWV9TVVBQT1JURUQKKyAgIHBuZ19ieXRlIHJnYl90b19ncmF5X3N0YXR1czsKKyAgIC8qIEFkZGVkIGluIGxpYnBuZyAxLjUuNSB0byByZWNvcmQgc2V0dGluZyBvZiBjb2VmZmljaWVudHM6ICovCisgICBwbmdfYnl0ZSByZ2JfdG9fZ3JheV9jb2VmZmljaWVudHNfc2V0OworICAgLyogVGhlc2Ugd2VyZSBjaGFuZ2VkIGZyb20gcG5nX2J5dGUgaW4gbGlicG5nLTEuMC42ICovCisgICBwbmdfdWludF8xNiByZ2JfdG9fZ3JheV9yZWRfY29lZmY7CisgICBwbmdfdWludF8xNiByZ2JfdG9fZ3JheV9ncmVlbl9jb2VmZjsKKyAgIC8qIGRlbGV0ZWQgaW4gMS41LjU6IHJnYl90b19ncmF5X2JsdWVfY29lZmY7ICovCisjZW5kaWYKKworLyogTmV3IG1lbWJlciBhZGRlZCBpbiBsaWJwbmctMS4wLjQgKHJlbmFtZWQgaW4gMS4wLjkpICovCisjaWYgZGVmaW5lZChQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRCkKKy8qIENoYW5nZWQgZnJvbSBwbmdfYnl0ZSB0byBwbmdfdWludF8zMiBhdCB2ZXJzaW9uIDEuMi4wICovCisgICBwbmdfdWludF8zMiBtbmdfZmVhdHVyZXNfcGVybWl0dGVkOworI2VuZGlmCisKKy8qIE5ldyBtZW1iZXIgYWRkZWQgaW4gbGlicG5nLTEuMC45LCBpZmRlZidlZCBvdXQgaW4gMS4wLjEyLCBlbmFibGVkIGluIDEuMi4wICovCisjaWZkZWYgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQKKyAgIHBuZ19ieXRlIGZpbHRlcl90eXBlOworI2VuZGlmCisKKy8qIE5ldyBtZW1iZXJzIGFkZGVkIGluIGxpYnBuZy0xLjIuMCAqLworCisvKiBOZXcgbWVtYmVycyBhZGRlZCBpbiBsaWJwbmctMS4wLjIgYnV0IGZpcnN0IGVuYWJsZWQgYnkgZGVmYXVsdCBpbiAxLjIuMCAqLworI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKKyAgIHBuZ192b2lkcCBtZW1fcHRyOyAgICAgICAgICAgICAvKiB1c2VyIHN1cHBsaWVkIHN0cnVjdCBmb3IgbWVtIGZ1bmN0aW9ucyAqLworICAgcG5nX21hbGxvY19wdHIgbWFsbG9jX2ZuOyAgICAgIC8qIGZ1bmN0aW9uIGZvciBhbGxvY2F0aW5nIG1lbW9yeSAqLworICAgcG5nX2ZyZWVfcHRyIGZyZWVfZm47ICAgICAgICAgIC8qIGZ1bmN0aW9uIGZvciBmcmVlaW5nIG1lbW9yeSAqLworI2VuZGlmCisKKy8qIE5ldyBtZW1iZXIgYWRkZWQgaW4gbGlicG5nLTEuMC4xMyBhbmQgMS4yLjAgKi8KKyAgIHBuZ19ieXRlcCBiaWdfcm93X2J1ZjsgICAgICAgICAvKiBidWZmZXIgdG8gc2F2ZSBjdXJyZW50ICh1bmZpbHRlcmVkKSByb3cgKi8KKworI2lmZGVmIFBOR19SRUFEX1FVQU5USVpFX1NVUFBPUlRFRAorLyogVGhlIGZvbGxvd2luZyB0aHJlZSBtZW1iZXJzIHdlcmUgYWRkZWQgYXQgdmVyc2lvbiAxLjAuMTQgYW5kIDEuMi40ICovCisgICBwbmdfYnl0ZXAgcXVhbnRpemVfc29ydDsgICAgICAgICAgLyogd29ya2luZyBzb3J0IGFycmF5ICovCisgICBwbmdfYnl0ZXAgaW5kZXhfdG9fcGFsZXR0ZTsgICAgICAgLyogd2hlcmUgdGhlIG9yaWdpbmFsIGluZGV4IGN1cnJlbnRseSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBwYWxldHRlICovCisgICBwbmdfYnl0ZXAgcGFsZXR0ZV90b19pbmRleDsgICAgICAgLyogd2hpY2ggb3JpZ2luYWwgaW5kZXggcG9pbnRzIHRvIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSBjb2xvciAqLworI2VuZGlmCisKKy8qIE5ldyBtZW1iZXJzIGFkZGVkIGluIGxpYnBuZy0xLjAuMTYgYW5kIDEuMi42ICovCisgICBwbmdfYnl0ZSBjb21wcmVzc2lvbl90eXBlOworCisjaWZkZWYgUE5HX1VTRVJfTElNSVRTX1NVUFBPUlRFRAorICAgcG5nX3VpbnRfMzIgdXNlcl93aWR0aF9tYXg7CisgICBwbmdfdWludF8zMiB1c2VyX2hlaWdodF9tYXg7CisKKyAgIC8qIEFkZGVkIGluIGxpYnBuZy0xLjQuMDogVG90YWwgbnVtYmVyIG9mIHNQTFQsIHRleHQsIGFuZCB1bmtub3duCisgICAgKiBjaHVua3MgdGhhdCBjYW4gYmUgc3RvcmVkICgwIG1lYW5zIHVubGltaXRlZCkuCisgICAgKi8KKyAgIHBuZ191aW50XzMyIHVzZXJfY2h1bmtfY2FjaGVfbWF4OworCisgICAvKiBUb3RhbCBtZW1vcnkgdGhhdCBhIHpUWHQsIHNQTFQsIGlUWHQsIGlDQ1AsIG9yIHVua25vd24gY2h1bmsKKyAgICAqIGNhbiBvY2N1cHkgd2hlbiBkZWNvbXByZXNzZWQuICAwIG1lYW5zIHVubGltaXRlZC4KKyAgICAqLworICAgcG5nX2FsbG9jX3NpemVfdCB1c2VyX2NodW5rX21hbGxvY19tYXg7CisjZW5kaWYKKworLyogTmV3IG1lbWJlciBhZGRlZCBpbiBsaWJwbmctMS4wLjI1IGFuZCAxLjIuMTcgKi8KKyNpZmRlZiBQTkdfUkVBRF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKKyAgIC8qIFRlbXBvcmFyeSBzdG9yYWdlIGZvciB1bmtub3duIGNodW5rIHRoYXQgdGhlIGxpYnJhcnkgZG9lc24ndCByZWNvZ25pemUsCisgICAgKiB1c2VkIHdoaWxlIHJlYWRpbmcgdGhlIGNodW5rLgorICAgICovCisgICBwbmdfdW5rbm93bl9jaHVuayB1bmtub3duX2NodW5rOworI2VuZGlmCisKKy8qIE5ldyBtZW1iZXIgYWRkZWQgaW4gbGlicG5nLTEuMi4yNiAqLworICBwbmdfc2l6ZV90IG9sZF9iaWdfcm93X2J1Zl9zaXplOworCisjaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECisvKiBOZXcgbWVtYmVyIGFkZGVkIGluIGxpYnBuZy0xLjIuMzAgKi8KKyAgcG5nX2J5dGVwICAgICAgICByZWFkX2J1ZmZlcjsgICAgICAvKiBidWZmZXIgZm9yIHJlYWRpbmcgY2h1bmsgZGF0YSAqLworICBwbmdfYWxsb2Nfc2l6ZV90IHJlYWRfYnVmZmVyX3NpemU7IC8qIGN1cnJlbnQgc2l6ZSBvZiB0aGUgYnVmZmVyICovCisjZW5kaWYKKyNpZmRlZiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRAorICB1SW50ICAgICAgICAgICAgIElEQVRfcmVhZF9zaXplOyAgIC8qIGxpbWl0IG9uIHJlYWQgYnVmZmVyIHNpemUgZm9yIElEQVQgKi8KKyNlbmRpZgorCisjaWZkZWYgUE5HX0lPX1NUQVRFX1NVUFBPUlRFRAorLyogTmV3IG1lbWJlciBhZGRlZCBpbiBsaWJwbmctMS40LjAgKi8KKyAgIHBuZ191aW50XzMyIGlvX3N0YXRlOworI2VuZGlmCisKKy8qIE5ldyBtZW1iZXIgYWRkZWQgaW4gbGlicG5nLTEuNS42ICovCisgICBwbmdfYnl0ZXAgYmlnX3ByZXZfcm93OworCisvKiBOZXcgbWVtYmVyIGFkZGVkIGluIGxpYnBuZy0xLjUuNyAqLworICAgdm9pZCAoKnJlYWRfZmlsdGVyW1BOR19GSUxURVJfVkFMVUVfTEFTVC0xXSkocG5nX3Jvd19pbmZvcCByb3dfaW5mbywKKyAgICAgIHBuZ19ieXRlcCByb3csIHBuZ19jb25zdF9ieXRlcCBwcmV2X3Jvdyk7CisKKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKKyNpZiBkZWZpbmVkKFBOR19DT0xPUlNQQUNFX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfR0FNTUFfU1VQUE9SVEVEKQorICAgcG5nX2NvbG9yc3BhY2UgICBjb2xvcnNwYWNlOworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFBOR19JTkRFWF9TVVBQT1JURUQKKyAgIHBuZ19pbmRleHAgaW5kZXg7CisgICBwbmdfdWludF8zMiB0b3RhbF9kYXRhX3JlYWQ7CisjZW5kaWYKKworfTsKKyNlbmRpZiAvKiBQTkdTVFJVQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvbGlicG5nL3BuZ3Rlc3QuYyBiL2xpYnBuZy9wbmd0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ1MGU2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9wbmd0ZXN0LmMKQEAgLTAsMCArMSwyMDczIEBACisKKy8qIHBuZ3Rlc3QuYyAtIGEgc2ltcGxlIHRlc3QgcHJvZ3JhbSB0byB0ZXN0IGxpYnBuZworICoKKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS41LjI1IFtEZWNlbWJlciAzLCAyMDE1XQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTUgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKKyAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKyAqCisgKiBUaGlzIHByb2dyYW0gcmVhZHMgaW4gYSBQTkcgaW1hZ2UsIHdyaXRlcyBpdCBvdXQgYWdhaW4sIGFuZCB0aGVuCisgKiBjb21wYXJlcyB0aGUgdHdvIGZpbGVzLiAgSWYgdGhlIGZpbGVzIGFyZSBpZGVudGljYWwsIHRoaXMgc2hvd3MgdGhhdAorICogdGhlIGJhc2ljIGNodW5rIGhhbmRsaW5nLCBmaWx0ZXJpbmcsIGFuZCAoZGUpY29tcHJlc3Npb24gY29kZSBpcyB3b3JraW5nCisgKiBwcm9wZXJseS4gIEl0IGRvZXMgbm90IGN1cnJlbnRseSB0ZXN0IGFsbCBvZiB0aGUgdHJhbnNmb3JtcywgYWx0aG91Z2gKKyAqIGl0IHByb2JhYmx5IHNob3VsZC4KKyAqCisgKiBUaGUgcHJvZ3JhbSB3aWxsIHJlcG9ydCAiRkFJTCIgaW4gY2VydGFpbiBsZWdpdGltYXRlIGNhc2VzOgorICogMSkgd2hlbiB0aGUgY29tcHJlc3Npb24gbGV2ZWwgb3IgZmlsdGVyIHNlbGVjdGlvbiBtZXRob2QgaXMgY2hhbmdlZC4KKyAqIDIpIHdoZW4gdGhlIG1heGltdW0gSURBVCBzaXplIChQTkdfWkJVRl9TSVpFIGluIHBuZ2NvbmYuaCkgaXMgbm90IDgxOTIuCisgKiAzKSB1bmtub3duIHVuc2FmZS10by1jb3B5IGFuY2lsbGFyeSBjaHVua3Mgb3IgdW5rbm93biBjcml0aWNhbCBjaHVua3MKKyAqICAgIGV4aXN0IGluIHRoZSBpbnB1dCBmaWxlLgorICogNCkgb3RoZXJzIG5vdCBsaXN0ZWQgaGVyZS4uLgorICogSW4gdGhlc2UgY2FzZXMsIGl0IGlzIGJlc3QgdG8gY2hlY2sgd2l0aCBhbm90aGVyIHRvb2wgc3VjaCBhcyAicG5nY2hlY2siCisgKiB0byBzZWUgd2hhdCB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdHdvIGZpbGVzIGFyZS4KKyAqCisgKiBJZiBhIGZpbGVuYW1lIGlzIGdpdmVuIG9uIHRoZSBjb21tYW5kLWxpbmUsIHRoZW4gdGhpcyBmaWxlIGlzIHVzZWQKKyAqIGZvciB0aGUgaW5wdXQsIHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0ICJwbmd0ZXN0LnBuZyIuICBUaGlzIGFsbG93cworICogdGVzdGluZyBhIHdpZGUgdmFyaWV0eSBvZiBmaWxlcyBlYXNpbHkuICBZb3UgY2FuIGFsc28gdGVzdCBhIG51bWJlcgorICogb2YgZmlsZXMgYXQgb25jZSBieSB0eXBpbmcgInBuZ3Rlc3QgLW0gZmlsZTEucG5nIGZpbGUyLnBuZyAuLi4iCisgKi8KKworI2RlZmluZSBfUE9TSVhfU09VUkNFIDEKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qIERlZmluZWQgc28gSSBjYW4gd3JpdGUgdG8gYSBmaWxlIG9uIGd1aS93aW5kb3dpbmcgcGxhdGZvcm1zICovCisvKiAgI2RlZmluZSBTVERFUlIgc3RkZXJyICAqLworI2RlZmluZSBTVERFUlIgc3Rkb3V0ICAgLyogRm9yIERPUyAqLworCisjaW5jbHVkZSAicG5nLmgiCisKKy8qIEtub3duIGNodW5rcyB0aGF0IGV4aXN0IGluIHBuZ3Rlc3QucG5nIG11c3QgYmUgc3VwcG9ydGVkIG9yIHBuZ3Rlc3Qgd2lsbCBmYWlsCisgKiBzaW1wbHkgYXMgYSByZXN1bHQgb2YgcmUtb3JkZXJpbmcgdGhlbS4gIFRoaXMgbWF5IGJlIGZpeGVkIGluIDEuNworICoKKyAqIHBuZ3Rlc3QgYWxsb2NhdGVzIGEgc2luZ2xlIHJvdyBidWZmZXIgZm9yIGVhY2ggcm93IGFuZCBvdmVyd3JpdGVzIGl0LAorICogdGhlcmVmb3JlIGlmIHRoZSB3cml0ZSBzaWRlIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgd3JpdGluZyBvZiBpbnRlcmxhY2VkIGltYWdlcworICogbm90aGluZyBjYW4gYmUgZG9uZSBmb3IgYW4gaW50ZXJsYWNlZCBpbWFnZSAoYW5kIHRoZSBjb2RlIGJlbG93IHdpbGwgZmFpbAorICogaG9ycmlibHkgdHJ5aW5nIHRvIHdyaXRlIGV4dHJhIGRhdGEgYWZ0ZXIgd3JpdGluZyBnYXJiYWdlKS4KKyAqLworI2lmIGRlZmluZWQgUE5HX1JFQURfU1VQUE9SVEVEICYmIC8qIGVsc2Ugbm90aGluZyBjYW4gYmUgZG9uZSAqL1wKKyAgIGRlZmluZWQgUE5HX1JFQURfYktHRF9TVVBQT1JURUQgJiZcCisgICBkZWZpbmVkIFBOR19SRUFEX2NIUk1fU1VQUE9SVEVEICYmXAorICAgZGVmaW5lZCBQTkdfUkVBRF9nQU1BX1NVUFBPUlRFRCAmJlwKKyAgIGRlZmluZWQgUE5HX1JFQURfb0ZGc19TVVBQT1JURUQgJiZcCisgICBkZWZpbmVkIFBOR19SRUFEX3BDQUxfU1VQUE9SVEVEICYmXAorICAgZGVmaW5lZCBQTkdfUkVBRF9wSFlzX1NVUFBPUlRFRCAmJlwKKyAgIGRlZmluZWQgUE5HX1JFQURfc0JJVF9TVVBQT1JURUQgJiZcCisgICBkZWZpbmVkIFBOR19SRUFEX3NDQUxfU1VQUE9SVEVEICYmXAorICAgZGVmaW5lZCBQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRCAmJlwKKyAgIGRlZmluZWQgUE5HX1JFQURfc1BMVF9TVVBQT1JURUQgJiZcCisgICBkZWZpbmVkIFBOR19SRUFEX3RFWHRfU1VQUE9SVEVEICYmXAorICAgZGVmaW5lZCBQTkdfUkVBRF90SU1FX1NVUFBPUlRFRCAmJlwKKyAgIGRlZmluZWQgUE5HX1JFQURfelRYdF9TVVBQT1JURUQgJiZcCisgICAoZGVmaW5lZCBQTkdfV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVEIHx8IFBOR19MSUJQTkdfVkVSID49IDEwNzAwKQorCisjaWZkZWYgUE5HX1pMSUJfSEVBREVSCisjICBpbmNsdWRlIFBOR19aTElCX0hFQURFUiAvKiBkZWZpbmVkIGJ5IHBuZ2xpYmNvbmYuaCBmcm9tIDEuNyAqLworI2Vsc2UKKyMgIGluY2x1ZGUgInpsaWIuaCIKKyNlbmRpZgorCisvKiBDb3BpZWQgZnJvbSBwbmdwcml2LmggYnV0IG9ubHkgdXNlZCBpbiBlcnJvciBtZXNzYWdlcyBiZWxvdy4gKi8KKyNpZm5kZWYgUE5HX1pCVUZfU0laRQorIyAgZGVmaW5lIFBOR19aQlVGX1NJWkUgODE5MgorI2VuZGlmCisjZGVmaW5lIEZDTE9TRShmaWxlKSBmY2xvc2UoZmlsZSkKKworI2lmbmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECit0eXBlZGVmIEZJTEUgICAgICAgICAgICAgICAgKiBwbmdfRklMRV9wOworI2VuZGlmCisKKy8qIE1ha2VzIHBuZ3Rlc3QgdmVyYm9zZSBzbyB3ZSBjYW4gZmluZCBwcm9ibGVtcy4gKi8KKyNpZm5kZWYgUE5HX0RFQlVHCisjICBkZWZpbmUgUE5HX0RFQlVHIDAKKyNlbmRpZgorCisjaWYgUE5HX0RFQlVHID4gMQorIyAgZGVmaW5lIHBuZ3Rlc3RfZGVidWcobSkgICAgICAgICgodm9pZClmcHJpbnRmKHN0ZGVyciwgbSAiXG4iKSkKKyMgIGRlZmluZSBwbmd0ZXN0X2RlYnVnMShtLHAxKSAgICAoKHZvaWQpZnByaW50ZihzdGRlcnIsIG0gIlxuIiwgcDEpKQorIyAgZGVmaW5lIHBuZ3Rlc3RfZGVidWcyKG0scDEscDIpICgodm9pZClmcHJpbnRmKHN0ZGVyciwgbSAiXG4iLCBwMSwgcDIpKQorI2Vsc2UKKyMgIGRlZmluZSBwbmd0ZXN0X2RlYnVnKG0pICAgICAgICAoKHZvaWQpMCkKKyMgIGRlZmluZSBwbmd0ZXN0X2RlYnVnMShtLHAxKSAgICAoKHZvaWQpMCkKKyMgIGRlZmluZSBwbmd0ZXN0X2RlYnVnMihtLHAxLHAyKSAoKHZvaWQpMCkKKyNlbmRpZgorCisjaWYgIVBOR19ERUJVRworIyAgZGVmaW5lIFNJTkdMRV9ST1dCVUZfQUxMT0MgIC8qIE1ha2VzIGJ1ZmZlciBvdmVycnVucyBlYXNpZXIgdG8gbmFpbCAqLworI2VuZGlmCisKKyNpZm5kZWYgUE5HX1VOVVNFRAorIyAgZGVmaW5lIFBOR19VTlVTRUQocGFyYW0pICh2b2lkKXBhcmFtOworI2VuZGlmCisKKy8qIFR1cm4gb24gQ1BVIHRpbWluZworI2RlZmluZSBQTkdURVNUX1RJTUlORworKi8KKworI2lmbmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECisjdW5kZWYgUE5HVEVTVF9USU1JTkcKKyNlbmRpZgorCisjaWZkZWYgUE5HVEVTVF9USU1JTkcKK3N0YXRpYyBmbG9hdCB0X3N0YXJ0LCB0X3N0b3AsIHRfZGVjb2RlLCB0X2VuY29kZSwgdF9taXNjOworI2luY2x1ZGUgPHRpbWUuaD4KKyNlbmRpZgorCisjaWZkZWYgUE5HX1RJTUVfUkZDMTEyM19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX3RJTUVfU1RSSU5HX0xFTkdUSCAyOQorc3RhdGljIGludCB0SU1FX2NodW5rX3ByZXNlbnQgPSAwOworc3RhdGljIGNoYXIgdElNRV9zdHJpbmdbUE5HX3RJTUVfU1RSSU5HX0xFTkdUSF0gPSAidElNRSBjaHVuayBpcyBub3QgcHJlc2VudCI7CisKKyNpZiBQTkdfTElCUE5HX1ZFUiA8IDEwNjE5CisjZGVmaW5lIHBuZ19jb252ZXJ0X3RvX3JmYzExMjNfYnVmZmVyKHRzLCB0KSB0SU1FX3RvX3N0cihyZWFkX3B0ciwgdHMsIHQpCisKK3N0YXRpYyBpbnQKK3RJTUVfdG9fc3RyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jaGFycCB0cywgcG5nX2NvbnN0X3RpbWVwIHQpCit7CisgICAgcG5nX2NvbnN0X2NoYXJwIHN0ciA9IHBuZ19jb252ZXJ0X3RvX3JmYzExMjMocG5nX3B0ciwgdCk7CisKKyAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworCisgICAgc3RyY3B5KHRzLCBzdHIpOworICAgIHJldHVybiAxOworfQorI2VuZGlmIC8qIG9sZGVyIGxpYnBuZyAqLworI2VuZGlmCisKK3N0YXRpYyBpbnQgdmVyYm9zZSA9IDA7CitzdGF0aWMgaW50IHN0cmljdCA9IDA7CitzdGF0aWMgaW50IHJlbGF4ZWQgPSAwOworc3RhdGljIGludCB1bnN1cHBvcnRlZF9jaHVua3MgPSAwOyAvKiBjaHVuayB1bnN1cHBvcnRlZCBieSBsaWJwbmcgaW4gaW5wdXQgKi8KK3N0YXRpYyBpbnQgZXJyb3JfY291bnQgPSAwOyAvKiBjb3VudCBjYWxscyB0byBwbmdfZXJyb3IgKi8KK3N0YXRpYyBpbnQgd2FybmluZ19jb3VudCA9IDA7IC8qIGNvdW50IGNhbGxzIHRvIHBuZ193YXJuaW5nICovCisKKy8qIERlZmluZSBwbmdfam1wYnVmKCkgaW4gY2FzZSB3ZSBhcmUgdXNpbmcgYSBwcmUtMS4wLjYgdmVyc2lvbiBvZiBsaWJwbmcgKi8KKyNpZm5kZWYgcG5nX2ptcGJ1ZgorIyAgZGVmaW5lIHBuZ19qbXBidWYocG5nX3B0cikgcG5nX3B0ci0+am1wYnVmCisjZW5kaWYKKworLyogRGVmaW5lcyBmb3IgdW5rbm93biBjaHVuayBoYW5kbGluZyBpZiByZXF1aXJlZC4gKi8KKyNpZm5kZWYgUE5HX0hBTkRMRV9DSFVOS19BTFdBWVMKKyMgIGRlZmluZSBQTkdfSEFORExFX0NIVU5LX0FMV0FZUyAgICAgICAzCisjZW5kaWYKKyNpZm5kZWYgUE5HX0hBTkRMRV9DSFVOS19JRl9TQUZFCisjICBkZWZpbmUgUE5HX0hBTkRMRV9DSFVOS19JRl9TQUZFICAgICAgMgorI2VuZGlmCisKKy8qIFV0aWxpdHkgdG8gc2F2ZSB0eXBpbmcvZXJyb3JzLCB0aGUgYXJndW1lbnQgbXVzdCBiZSBhIG5hbWUgKi8KKyNkZWZpbmUgTUVNWkVSTyh2YXIpICgodm9pZCltZW1zZXQoJnZhciwgMCwgc2l6ZW9mIHZhcikpCisKKy8qIEV4YW1wbGUgb2YgdXNpbmcgcm93IGNhbGxiYWNrcyB0byBtYWtlIGEgc2ltcGxlIHByb2dyZXNzIG1ldGVyICovCitzdGF0aWMgaW50IHN0YXR1c19wYXNzID0gMTsKK3N0YXRpYyBpbnQgc3RhdHVzX2RvdHNfcmVxdWVzdGVkID0gMDsKK3N0YXRpYyBpbnQgc3RhdHVzX2RvdHMgPSAxOworCitzdGF0aWMgdm9pZCBQTkdDQkFQSQorcmVhZF9yb3dfY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgcm93X251bWJlciwgaW50IHBhc3MpCit7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IHJvd19udW1iZXIgPiBQTkdfVUlOVF8zMV9NQVgpCisgICAgICByZXR1cm47CisKKyAgIGlmIChzdGF0dXNfcGFzcyAhPSBwYXNzKQorICAgeworICAgICAgZnByaW50ZihzdGRvdXQsICJcbiBQYXNzICVkOiAiLCBwYXNzKTsKKyAgICAgIHN0YXR1c19wYXNzID0gcGFzczsKKyAgICAgIHN0YXR1c19kb3RzID0gMzE7CisgICB9CisKKyAgIHN0YXR1c19kb3RzLS07CisKKyAgIGlmIChzdGF0dXNfZG90cyA9PSAwKQorICAgeworICAgICAgZnByaW50ZihzdGRvdXQsICJcbiAgICAgICAgICIpOworICAgICAgc3RhdHVzX2RvdHM9MzA7CisgICB9CisKKyAgIGZwcmludGYoc3Rkb3V0LCAiciIpOworfQorCisjaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAorc3RhdGljIHZvaWQgUE5HQ0JBUEkKK3dyaXRlX3Jvd19jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdWludF8zMiByb3dfbnVtYmVyLCBpbnQgcGFzcykKK3sKKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgcm93X251bWJlciA+IFBOR19VSU5UXzMxX01BWCB8fCBwYXNzID4gNykKKyAgICAgIHJldHVybjsKKworICAgZnByaW50ZihzdGRvdXQsICJ3Iik7Cit9CisjZW5kaWYKKworCisjaWZkZWYgUE5HX1JFQURfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVECisvKiBFeGFtcGxlIG9mIHVzaW5nIGEgdXNlciB0cmFuc2Zvcm0gY2FsbGJhY2sgKGRvZXNuJ3QgZG8gYW55dGhpbmcgYXQgcHJlc2VudCkuCisgKi8KK3N0YXRpYyB2b2lkIFBOR0NCQVBJCityZWFkX3VzZXJfY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIGRhdGEpCit7CisgICBQTkdfVU5VU0VEKHBuZ19wdHIpCisgICBQTkdfVU5VU0VEKHJvd19pbmZvKQorICAgUE5HX1VOVVNFRChkYXRhKQorfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVECisvKiBFeGFtcGxlIG9mIHVzaW5nIHVzZXIgdHJhbnNmb3JtIGNhbGxiYWNrICh3ZSBkb24ndCB0cmFuc2Zvcm0gYW55dGhpbmcsCisgKiBidXQgbWVyZWx5IGNvdW50IHRoZSB6ZXJvIHNhbXBsZXMpCisgKi8KKworc3RhdGljIHBuZ191aW50XzMyIHplcm9fc2FtcGxlczsKKworc3RhdGljIHZvaWQgUE5HQ0JBUEkKK2NvdW50X3plcm9fc2FtcGxlcyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgZGF0YSkKK3sKKyAgIHBuZ19ieXRlcCBkcCA9IGRhdGE7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICAvKiBDb250ZW50cyBvZiByb3dfaW5mbzoKKyAgICAqICBwbmdfdWludF8zMiB3aWR0aCAgICAgIHdpZHRoIG9mIHJvdworICAgICogIHBuZ191aW50XzMyIHJvd2J5dGVzICAgbnVtYmVyIG9mIGJ5dGVzIGluIHJvdworICAgICogIHBuZ19ieXRlIGNvbG9yX3R5cGUgICAgY29sb3IgdHlwZSBvZiBwaXhlbHMKKyAgICAqICBwbmdfYnl0ZSBiaXRfZGVwdGggICAgIGJpdCBkZXB0aCBvZiBzYW1wbGVzCisgICAgKiAgcG5nX2J5dGUgY2hhbm5lbHMgICAgICBudW1iZXIgb2YgY2hhbm5lbHMgKDEtNCkKKyAgICAqICBwbmdfYnl0ZSBwaXhlbF9kZXB0aCAgIGJpdHMgcGVyIHBpeGVsIChkZXB0aCpjaGFubmVscykKKyAgICAqLworCisgICAgLyogQ291bnRzIHRoZSBudW1iZXIgb2YgemVybyBzYW1wbGVzIChvciB6ZXJvIHBpeGVscyBpZiBjb2xvcl90eXBlIGlzIDMgKi8KKworICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSAwIHx8IHJvd19pbmZvLT5jb2xvcl90eXBlID09IDMpCisgICAgeworICAgICAgIGludCBwb3MgPSAwOworICAgICAgIHBuZ191aW50XzMyIG4sIG5zdG9wOworCisgICAgICAgZm9yIChuID0gMCwgbnN0b3A9cm93X2luZm8tPndpZHRoOyBuPG5zdG9wOyBuKyspCisgICAgICAgeworICAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDEpCisgICAgICAgICAgeworICAgICAgICAgICAgIGlmICgoKCpkcCA8PCBwb3MrKyApICYgMHg4MCkgPT0gMCkKKyAgICAgICAgICAgICAgICB6ZXJvX3NhbXBsZXMrKzsKKworICAgICAgICAgICAgIGlmIChwb3MgPT0gOCkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG9zID0gMDsKKyAgICAgICAgICAgICAgICBkcCsrOworICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAyKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICBpZiAoKCgqZHAgPDwgKHBvcys9MikpICYgMHhjMCkgPT0gMCkKKyAgICAgICAgICAgICAgICB6ZXJvX3NhbXBsZXMrKzsKKworICAgICAgICAgICAgIGlmIChwb3MgPT0gOCkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG9zID0gMDsKKyAgICAgICAgICAgICAgICBkcCsrOworICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA0KQorICAgICAgICAgIHsKKyAgICAgICAgICAgICBpZiAoKCgqZHAgPDwgKHBvcys9NCkpICYgMHhmMCkgPT0gMCkKKyAgICAgICAgICAgICAgICB6ZXJvX3NhbXBsZXMrKzsKKworICAgICAgICAgICAgIGlmIChwb3MgPT0gOCkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG9zID0gMDsKKyAgICAgICAgICAgICAgICBkcCsrOworICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQorICAgICAgICAgICAgIGlmICgqZHArKyA9PSAwKQorICAgICAgICAgICAgICAgIHplcm9fc2FtcGxlcysrOworCisgICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpCisgICAgICAgICAgeworICAgICAgICAgICAgIGlmICgoKmRwIHwgKihkcCsxKSkgPT0gMCkKKyAgICAgICAgICAgICAgICB6ZXJvX3NhbXBsZXMrKzsKKyAgICAgICAgICAgICBkcCs9MjsKKyAgICAgICAgICB9CisgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIE90aGVyIGNvbG9yIHR5cGVzICovCisgICAgeworICAgICAgIHBuZ191aW50XzMyIG4sIG5zdG9wOworICAgICAgIGludCBjaGFubmVsOworICAgICAgIGludCBjb2xvcl9jaGFubmVscyA9IHJvd19pbmZvLT5jaGFubmVsczsKKyAgICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPiAzKQorICAgICAgICAgIGNvbG9yX2NoYW5uZWxzLS07CisKKyAgICAgICBmb3IgKG4gPSAwLCBuc3RvcD1yb3dfaW5mby0+d2lkdGg7IG48bnN0b3A7IG4rKykKKyAgICAgICB7CisgICAgICAgICAgZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IGNvbG9yX2NoYW5uZWxzOyBjaGFubmVsKyspCisgICAgICAgICAgeworICAgICAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCisgICAgICAgICAgICAgICAgaWYgKCpkcCsrID09IDApCisgICAgICAgICAgICAgICAgICAgemVyb19zYW1wbGVzKys7CisKKyAgICAgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCgqZHAgfCAqKGRwKzEpKSA9PSAwKQorICAgICAgICAgICAgICAgICAgIHplcm9fc2FtcGxlcysrOworCisgICAgICAgICAgICAgICAgZHArPTI7CisgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPiAzKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICBkcCsrOworICAgICAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KQorICAgICAgICAgICAgICAgIGRwKys7CisgICAgICAgICAgfQorICAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYgLyogV1JJVEVfVVNFUl9UUkFOU0ZPUk0gKi8KKworI2lmbmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECisvKiBTVEFSVCBvZiBjb2RlIHRvIHZhbGlkYXRlIHN0ZGlvLWZyZWUgY29tcGlsYXRpb24gKi8KKy8qIFRoZXNlIGNvcGllcyBvZiB0aGUgZGVmYXVsdCByZWFkL3dyaXRlIGZ1bmN0aW9ucyBjb21lIGZyb20gcG5ncmlvLmMgYW5kCisgKiBwbmd3aW8uYy4gIFRoZXkgYWxsb3cgImRvbid0IGluY2x1ZGUgc3RkaW8iIHRlc3Rpbmcgb2YgdGhlIGxpYnJhcnkuCisgKiBUaGlzIGlzIHRoZSBmdW5jdGlvbiB0aGF0IGRvZXMgdGhlIGFjdHVhbCByZWFkaW5nIG9mIGRhdGEuICBJZiB5b3UgYXJlCisgKiBub3QgcmVhZGluZyBmcm9tIGEgc3RhbmRhcmQgQyBzdHJlYW0sIHlvdSBzaG91bGQgY3JlYXRlIGEgcmVwbGFjZW1lbnQKKyAqIHJlYWRfZGF0YSBmdW5jdGlvbiBhbmQgdXNlIGl0IGF0IHJ1biB0aW1lIHdpdGggcG5nX3NldF9yZWFkX2ZuKCksIHJhdGhlcgorICogdGhhbiBjaGFuZ2luZyB0aGUgbGlicmFyeS4KKyAqLworCisjaWZkZWYgUE5HX0lPX1NUQVRFX1NVUFBPUlRFRAordm9pZAorcG5ndGVzdF9jaGVja19pb19zdGF0ZShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfc2l6ZV90IGRhdGFfbGVuZ3RoLAorICAgcG5nX3VpbnRfMzIgaW9fb3ApOwordm9pZAorcG5ndGVzdF9jaGVja19pb19zdGF0ZShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfc2l6ZV90IGRhdGFfbGVuZ3RoLAorICAgcG5nX3VpbnRfMzIgaW9fb3ApCit7CisgICBwbmdfdWludF8zMiBpb19zdGF0ZSA9IHBuZ19nZXRfaW9fc3RhdGUocG5nX3B0cik7CisgICBpbnQgZXJyID0gMDsKKworICAgLyogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgb3BlcmF0aW9uIChyZWFkaW5nIC8gd3JpdGluZykgaXMgYXMgZXhwZWN0ZWQuICovCisgICBpZiAoKGlvX3N0YXRlICYgUE5HX0lPX01BU0tfT1ApICE9IGlvX29wKQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbmNvcnJlY3Qgb3BlcmF0aW9uIGluIEkvTyBzdGF0ZSIpOworCisgICAvKiBDaGVjayBpZiB0aGUgYnVmZmVyIHNpemUgc3BlY2lmaWMgdG8gdGhlIGN1cnJlbnQgbG9jYXRpb24KKyAgICAqIChmaWxlIHNpZ25hdHVyZSAvIGhlYWRlciAvIGRhdGEgLyBjcmMpIGlzIGFzIGV4cGVjdGVkLgorICAgICovCisgICBzd2l0Y2ggKGlvX3N0YXRlICYgUE5HX0lPX01BU0tfTE9DKQorICAgeworICAgY2FzZSBQTkdfSU9fU0lHTkFUVVJFOgorICAgICAgaWYgKGRhdGFfbGVuZ3RoID4gOCkKKyAgICAgICAgIGVyciA9IDE7CisgICAgICBicmVhazsKKyAgIGNhc2UgUE5HX0lPX0NIVU5LX0hEUjoKKyAgICAgIGlmIChkYXRhX2xlbmd0aCAhPSA4KQorICAgICAgICAgZXJyID0gMTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBQTkdfSU9fQ0hVTktfREFUQToKKyAgICAgIGJyZWFrOyAgLyogbm8gcmVzdHJpY3Rpb25zIGhlcmUgKi8KKyAgIGNhc2UgUE5HX0lPX0NIVU5LX0NSQzoKKyAgICAgIGlmIChkYXRhX2xlbmd0aCAhPSA0KQorICAgICAgICAgZXJyID0gMTsKKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIGVyciA9IDE7ICAvKiB1bmluaXRpYWxpemVkICovCisgICB9CisgICBpZiAoZXJyICE9IDApCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkJhZCBJL08gc3RhdGUgb3IgYnVmZmVyIHNpemUiKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBQTkdDQkFQSQorcG5ndGVzdF9yZWFkX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKQoreworICAgcG5nX3NpemVfdCBjaGVjayA9IDA7CisgICBwbmdfdm9pZHAgaW9fcHRyOworCisgICAvKiBmcmVhZCgpIHJldHVybnMgMCBvbiBlcnJvciwgc28gaXQgaXMgT0sgdG8gc3RvcmUgdGhpcyBpbiBhIHBuZ19zaXplX3QKKyAgICAqIGluc3RlYWQgb2YgYW4gaW50LCB3aGljaCBpcyB3aGF0IGZyZWFkKCkgYWN0dWFsbHkgcmV0dXJucy4KKyAgICAqLworICAgaW9fcHRyID0gcG5nX2dldF9pb19wdHIocG5nX3B0cik7CisgICBpZiAoaW9fcHRyICE9IE5VTEwpCisgICB7CisgICAgICBjaGVjayA9IGZyZWFkKGRhdGEsIDEsIGxlbmd0aCwgKHBuZ19GSUxFX3ApaW9fcHRyKTsKKyAgIH0KKworICAgaWYgKGNoZWNrICE9IGxlbmd0aCkKKyAgIHsKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiUmVhZCBFcnJvciIpOworICAgfQorCisjaWZkZWYgUE5HX0lPX1NUQVRFX1NVUFBPUlRFRAorICAgcG5ndGVzdF9jaGVja19pb19zdGF0ZShwbmdfcHRyLCBsZW5ndGgsIFBOR19JT19SRUFESU5HKTsKKyNlbmRpZgorfQorCisjaWZkZWYgUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRAorc3RhdGljIHZvaWQgUE5HQ0JBUEkKK3BuZ3Rlc3RfZmx1c2gocG5nX3N0cnVjdHAgcG5nX3B0cikKK3sKKyAgIC8qIERvIG5vdGhpbmc7IGZmbHVzaCgpIGlzIHNhaWQgdG8gYmUganVzdCBhIHdhc3RlIG9mIGVuZXJneS4gKi8KKyAgIFBOR19VTlVTRUQocG5nX3B0cikgICAvKiBTdGlmbGUgY29tcGlsZXIgd2FybmluZyAqLworfQorI2VuZGlmCisKKy8qIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgZG9lcyB0aGUgYWN0dWFsIHdyaXRpbmcgb2YgZGF0YS4gIElmIHlvdSBhcmUKKyAqIG5vdCB3cml0aW5nIHRvIGEgc3RhbmRhcmQgQyBzdHJlYW0sIHlvdSBzaG91bGQgY3JlYXRlIGEgcmVwbGFjZW1lbnQKKyAqIHdyaXRlX2RhdGEgZnVuY3Rpb24gYW5kIHVzZSBpdCBhdCBydW4gdGltZSB3aXRoIHBuZ19zZXRfd3JpdGVfZm4oKSwgcmF0aGVyCisgKiB0aGFuIGNoYW5naW5nIHRoZSBsaWJyYXJ5LgorICovCitzdGF0aWMgdm9pZCBQTkdDQkFQSQorcG5ndGVzdF93cml0ZV9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCkKK3sKKyAgIHBuZ19zaXplX3QgY2hlY2s7CisKKyAgIGNoZWNrID0gZndyaXRlKGRhdGEsIDEsIGxlbmd0aCwgKHBuZ19GSUxFX3ApcG5nX2dldF9pb19wdHIocG5nX3B0cikpOworCisgICBpZiAoY2hlY2sgIT0gbGVuZ3RoKQorICAgeworICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJXcml0ZSBFcnJvciIpOworICAgfQorCisjaWZkZWYgUE5HX0lPX1NUQVRFX1NVUFBPUlRFRAorICAgcG5ndGVzdF9jaGVja19pb19zdGF0ZShwbmdfcHRyLCBsZW5ndGgsIFBOR19JT19XUklUSU5HKTsKKyNlbmRpZgorfQorI2VuZGlmIC8qICFTVERJTyAqLworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIGEgd2FybmluZywgYnV0IHRoZSBsaWJyYXJ5IHRoaW5rcworICogaXQgY2FuIGNvbnRpbnVlIGFueXdheS4gIFJlcGxhY2VtZW50IGZ1bmN0aW9ucyBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nCisgKiBoZXJlIGlmIHlvdSBkb24ndCB3YW50IHRvLiAgSW4gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiwgcG5nX3B0ciBpcworICogbm90IHVzZWQsIGJ1dCBpdCBpcyBwYXNzZWQgaW4gY2FzZSBpdCBtYXkgYmUgdXNlZnVsLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgUE5HX0NPTlNUIGNoYXIgKmZpbGVfbmFtZTsKK30gIHBuZ3Rlc3RfZXJyb3JfcGFyYW1ldGVyczsKKworc3RhdGljIHZvaWQgUE5HQ0JBUEkKK3BuZ3Rlc3Rfd2FybmluZyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgbWVzc2FnZSkKK3sKKyAgIFBOR19DT05TVCBjaGFyICpuYW1lID0gIlVOS05PV04gKEVSUk9SISkiOworICAgcG5ndGVzdF9lcnJvcl9wYXJhbWV0ZXJzICp0ZXN0ID0KKyAgICAgIChwbmd0ZXN0X2Vycm9yX3BhcmFtZXRlcnMqKXBuZ19nZXRfZXJyb3JfcHRyKHBuZ19wdHIpOworCisgICArK3dhcm5pbmdfY291bnQ7CisKKyAgIGlmICh0ZXN0ICE9IE5VTEwgJiYgdGVzdC0+ZmlsZV9uYW1lICE9IE5VTEwpCisgICAgICBuYW1lID0gdGVzdC0+ZmlsZV9uYW1lOworCisgICBmcHJpbnRmKFNUREVSUiwgIiVzOiBsaWJwbmcgd2FybmluZzogJXNcbiIsIG5hbWUsIG1lc3NhZ2UpOworfQorCisvKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGVycm9yIGhhbmRsaW5nIGZ1bmN0aW9uLiAgTm90ZSB0aGF0IHJlcGxhY2VtZW50cyBmb3IKKyAqIHRoaXMgZnVuY3Rpb24gTVVTVCBOT1QgUkVUVVJOLCBvciB0aGUgcHJvZ3JhbSB3aWxsIGxpa2VseSBjcmFzaC4gIFRoaXMKKyAqIGZ1bmN0aW9uIGlzIHVzZWQgYnkgZGVmYXVsdCwgb3IgaWYgdGhlIHByb2dyYW0gc3VwcGxpZXMgTlVMTCBmb3IgdGhlCisgKiBlcnJvciBmdW5jdGlvbiBwb2ludGVyIGluIHBuZ19zZXRfZXJyb3JfZm4oKS4KKyAqLworc3RhdGljIHZvaWQgUE5HQ0JBUEkKK3BuZ3Rlc3RfZXJyb3IocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIG1lc3NhZ2UpCit7CisgICArK2Vycm9yX2NvdW50OworCisgICBwbmd0ZXN0X3dhcm5pbmcocG5nX3B0ciwgbWVzc2FnZSk7CisgICAvKiBXZSBjYW4gcmV0dXJuIGJlY2F1c2UgcG5nX2Vycm9yIGNhbGxzIHRoZSBkZWZhdWx0IGhhbmRsZXIsIHdoaWNoIGlzCisgICAgKiBhY3R1YWxseSBPSyBpbiB0aGlzIGNhc2UuCisgICAgKi8KK30KKworLyogRU5EIG9mIGNvZGUgdG8gdmFsaWRhdGUgc3RkaW8tZnJlZSBjb21waWxhdGlvbiAqLworCisvKiBTVEFSVCBvZiBjb2RlIHRvIHZhbGlkYXRlIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24gKi8KKyNpZiBkZWZpbmVkKFBOR19VU0VSX01FTV9TVVBQT1JURUQpICYmIFBOR19ERUJVRworCisvKiBBbGxvY2F0ZSBtZW1vcnkuICBGb3IgcmVhc29uYWJsZSBmaWxlcywgc2l6ZSBzaG91bGQgbmV2ZXIgZXhjZWVkCisgKiA2NEsuICBIb3dldmVyLCB6bGliIG1heSBhbGxvY2F0ZSBtb3JlIHRoYW4gNjRLIGlmIHlvdSBkb24ndCB0ZWxsCisgKiBpdCBub3QgdG8uICBTZWUgemNvbmYuaCBhbmQgcG5nLmggZm9yIG1vcmUgaW5mb3JtYXRpb24uICB6bGliIGRvZXMKKyAqIG5lZWQgdG8gYWxsb2NhdGUgZXhhY3RseSA2NEssIHNvIHdoYXRldmVyIHlvdSBjYWxsIGhlcmUgbXVzdAorICogaGF2ZSB0aGUgYWJpbGl0eSB0byBkbyB0aGF0LgorICoKKyAqIFRoaXMgcGllY2Ugb2YgY29kZSBjYW4gYmUgY29tcGlsZWQgdG8gdmFsaWRhdGUgbWF4IDY0SyBhbGxvY2F0aW9ucworICogYnkgc2V0dGluZyBNQVhTRUdfNjRLIGluIHpsaWIgemNvbmYuaCAqb3IqIFBOR19NQVhfTUFMTE9DXzY0Sy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWVtb3J5X2luZm9ybWF0aW9uCit7CisgICBwbmdfYWxsb2Nfc2l6ZV90ICAgICAgICAgIHNpemU7CisgICBwbmdfdm9pZHAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICBzdHJ1Y3QgbWVtb3J5X2luZm9ybWF0aW9uICpuZXh0OworfSBtZW1vcnlfaW5mb3JtYXRpb247Cit0eXBlZGVmIG1lbW9yeV9pbmZvcm1hdGlvbiAqbWVtb3J5X2luZm9wOworCitzdGF0aWMgbWVtb3J5X2luZm9wIHBpbmZvcm1hdGlvbiA9IE5VTEw7CitzdGF0aWMgaW50IGN1cnJlbnRfYWxsb2NhdGlvbiA9IDA7CitzdGF0aWMgaW50IG1heGltdW1fYWxsb2NhdGlvbiA9IDA7CitzdGF0aWMgaW50IHRvdGFsX2FsbG9jYXRpb24gPSAwOworc3RhdGljIGludCBudW1fYWxsb2NhdGlvbnMgPSAwOworCitwbmdfdm9pZHAgUE5HQ0JBUEkgcG5nX2RlYnVnX21hbGxvYyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICAgcG5nX2FsbG9jX3NpemVfdCBzaXplKSk7Cit2b2lkIFBOR0NCQVBJIHBuZ19kZWJ1Z19mcmVlIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3ZvaWRwIHB0cikpOworCitwbmdfdm9pZHAKK1BOR0NCQVBJIHBuZ19kZWJ1Z19tYWxsb2MocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2FsbG9jX3NpemVfdCBzaXplKQoreworCisgICAvKiBwbmdfbWFsbG9jIGhhcyBhbHJlYWR5IHRlc3RlZCBmb3IgTlVMTDsgcG5nX2NyZWF0ZV9zdHJ1Y3QgY2FsbHMKKyAgICAqIHBuZ19kZWJ1Z19tYWxsb2MgZGlyZWN0bHksIHdpdGggcG5nX3B0ciA9PSBOVUxMIHdoaWNoIGlzIE9LCisgICAgKi8KKworICAgaWYgKHNpemUgPT0gMCkKKyAgICAgIHJldHVybiAoTlVMTCk7CisKKyAgIC8qIFRoaXMgY2FsbHMgdGhlIGxpYnJhcnkgYWxsb2NhdG9yIHR3aWNlLCBvbmNlIHRvIGdldCB0aGUgcmVxdWVzdGVkCisgICAgICBidWZmZXIgYW5kIG9uY2UgdG8gZ2V0IGEgbmV3IGZyZWUgbGlzdCBlbnRyeS4gKi8KKyAgIHsKKyAgICAgIC8qIERpc2FibGUgbWFsbG9jX2ZuIGFuZCBmcmVlX2ZuICovCisgICAgICBtZW1vcnlfaW5mb3AgcGluZm87CisgICAgICBwbmdfc2V0X21lbV9mbihwbmdfcHRyLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgIHBpbmZvID0gKG1lbW9yeV9pbmZvcClwbmdfbWFsbG9jKHBuZ19wdHIsCisgICAgICAgICAoc2l6ZW9mICpwaW5mbykpOworICAgICAgcGluZm8tPnNpemUgPSBzaXplOworICAgICAgY3VycmVudF9hbGxvY2F0aW9uICs9IHNpemU7CisgICAgICB0b3RhbF9hbGxvY2F0aW9uICs9IHNpemU7CisgICAgICBudW1fYWxsb2NhdGlvbnMgKys7CisKKyAgICAgIGlmIChjdXJyZW50X2FsbG9jYXRpb24gPiBtYXhpbXVtX2FsbG9jYXRpb24pCisgICAgICAgICBtYXhpbXVtX2FsbG9jYXRpb24gPSBjdXJyZW50X2FsbG9jYXRpb247CisKKyAgICAgIHBpbmZvLT5wb2ludGVyID0gcG5nX21hbGxvYyhwbmdfcHRyLCBzaXplKTsKKyAgICAgIC8qIFJlc3RvcmUgbWFsbG9jX2ZuIGFuZCBmcmVlX2ZuICovCisKKyAgICAgIHBuZ19zZXRfbWVtX2ZuKHBuZ19wdHIsCisgICAgICAgICAgTlVMTCwgcG5nX2RlYnVnX21hbGxvYywgcG5nX2RlYnVnX2ZyZWUpOworCisgICAgICBpZiAoc2l6ZSAhPSAwICYmIHBpbmZvLT5wb2ludGVyID09IE5VTEwpCisgICAgICB7CisgICAgICAgICBjdXJyZW50X2FsbG9jYXRpb24gLT0gc2l6ZTsKKyAgICAgICAgIHRvdGFsX2FsbG9jYXRpb24gLT0gc2l6ZTsKKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLAorICAgICAgICAgICAib3V0IG9mIG1lbW9yeSBpbiBwbmd0ZXN0LT5wbmdfZGVidWdfbWFsbG9jIik7CisgICAgICB9CisKKyAgICAgIHBpbmZvLT5uZXh0ID0gcGluZm9ybWF0aW9uOworICAgICAgcGluZm9ybWF0aW9uID0gcGluZm87CisgICAgICAvKiBNYWtlIHN1cmUgdGhlIGNhbGxlciBpc24ndCBhc3N1bWluZyB6ZXJvZWQgbWVtb3J5LiAqLworICAgICAgbWVtc2V0KHBpbmZvLT5wb2ludGVyLCAweGRkLCBwaW5mby0+c2l6ZSk7CisKKyAgICAgIGlmICh2ZXJib3NlICE9IDApCisgICAgICAgICBwcmludGYoInBuZ19tYWxsb2MgJWx1IGJ5dGVzIGF0ICVwXG4iLCAodW5zaWduZWQgbG9uZylzaXplLAorICAgICAgICAgICAgcGluZm8tPnBvaW50ZXIpOworCisgICAgICByZXR1cm4gKHBuZ192b2lkcCkocGluZm8tPnBvaW50ZXIpOworICAgfQorfQorCisvKiBGcmVlIGEgcG9pbnRlci4gIEl0IGlzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBhdCB0aGUgc2FtZSB0aW1lLiAqLwordm9pZCBQTkdDQkFQSQorcG5nX2RlYnVnX2ZyZWUocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3ZvaWRwIHB0cikKK3sKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICBmcHJpbnRmKFNUREVSUiwgIk5VTEwgcG9pbnRlciB0byBwbmdfZGVidWdfZnJlZS5cbiIpOworCisgICBpZiAocHRyID09IDApCisgICB7CisjaWYgMCAvKiBUaGlzIGhhcHBlbnMgYWxsIHRoZSB0aW1lLiAqLworICAgICAgZnByaW50ZihTVERFUlIsICJXQVJOSU5HOiBmcmVlaW5nIE5VTEwgcG9pbnRlclxuIik7CisjZW5kaWYKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgLyogVW5saW5rIHRoZSBlbGVtZW50IGZyb20gdGhlIGxpc3QuICovCisgICBpZiAocGluZm9ybWF0aW9uICE9IE5VTEwpCisgICB7CisgICAgICBtZW1vcnlfaW5mb3AgKnBwaW5mbyA9ICZwaW5mb3JtYXRpb247CisKKyAgICAgIGZvciAoOzspCisgICAgICB7CisgICAgICAgICBtZW1vcnlfaW5mb3AgcGluZm8gPSAqcHBpbmZvOworCisgICAgICAgICBpZiAocGluZm8tPnBvaW50ZXIgPT0gcHRyKQorICAgICAgICAgeworICAgICAgICAgICAgKnBwaW5mbyA9IHBpbmZvLT5uZXh0OworICAgICAgICAgICAgY3VycmVudF9hbGxvY2F0aW9uIC09IHBpbmZvLT5zaXplOworICAgICAgICAgICAgaWYgKGN1cnJlbnRfYWxsb2NhdGlvbiA8IDApCisgICAgICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIkR1cGxpY2F0ZSBmcmVlIG9mIG1lbW9yeVxuIik7CisgICAgICAgICAgICAvKiBXZSBtdXN0IGZyZWUgdGhlIGxpc3QgZWxlbWVudCB0b28sIGJ1dCBmaXJzdCBraWxsCisgICAgICAgICAgICAgICB0aGUgbWVtb3J5IHRoYXQgaXMgdG8gYmUgZnJlZWQuICovCisgICAgICAgICAgICBtZW1zZXQocHRyLCAweDU1LCBwaW5mby0+c2l6ZSk7CisgICAgICAgICAgICBmcmVlKHBpbmZvKTsKKyAgICAgICAgICAgIHBpbmZvID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBpZiAocGluZm8tPm5leHQgPT0gTlVMTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoU1RERVJSLCAiUG9pbnRlciAlcCBub3QgZm91bmRcbiIsIHB0cik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKworICAgICAgICAgcHBpbmZvID0gJnBpbmZvLT5uZXh0OworICAgICAgfQorICAgfQorCisgICAvKiBGaW5hbGx5IGZyZWUgdGhlIGRhdGEuICovCisgICBpZiAodmVyYm9zZSAhPSAwKQorICAgICAgcHJpbnRmKCJGcmVlaW5nICVwXG4iLCBwdHIpOworCisgICBpZiAocHRyICE9IE5VTEwpCisgICAgICBmcmVlKHB0cik7CisgICBwdHIgPSBOVUxMOworfQorI2VuZGlmIC8qIFVTRVJfTUVNICYmIERFQlVHICovCisvKiBFTkQgb2YgY29kZSB0byB0ZXN0IG1lbW9yeSBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbiAqLworCisKKyNpZmRlZiBQTkdfUkVBRF9VU0VSX0NIVU5LU19TVVBQT1JURUQKKy8qIERlbW9uc3RyYXRpb24gb2YgdXNlciBjaHVuayBzdXBwb3J0IG9mIHRoZSBzVEVSIGFuZCB2cEFnIGNodW5rcyAqLworCisvKiAoc1RFUiBpcyBhIHB1YmxpYyBjaHVuayBub3QgeWV0IGtub3duIGJ5IGxpYnBuZy4gIHZwQWcgaXMgYSBwcml2YXRlCitjaHVuayB1c2VkIGluIEltYWdlTWFnaWNrIHRvIHN0b3JlICJ2aXJ0dWFsIHBhZ2UiIHNpemUpLiAgKi8KKworc3RhdGljIHN0cnVjdCB1c2VyX2NodW5rX2RhdGEKK3sKKyAgIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0cjsKKyAgIHBuZ191aW50XzMyICAgICB2cEFnX3dpZHRoLCB2cEFnX2hlaWdodDsKKyAgIHBuZ19ieXRlICAgICAgICB2cEFnX3VuaXRzOworICAgcG5nX2J5dGUgICAgICAgIHNURVJfbW9kZTsKKyAgIGludCAgICAgICAgICAgICBsb2NhdGlvblsyXTsKK30KK3VzZXJfY2h1bmtfZGF0YTsKKworLyogVXNlZCBmb3IgbG9jYXRpb24gYW5kIG9yZGVyOyB6ZXJvIG1lYW5zIG5vdGhpbmcuICovCisjZGVmaW5lIGhhdmVfc1RFUiAgIDB4MDEKKyNkZWZpbmUgaGF2ZV92cEFnICAgMHgwMgorI2RlZmluZSBiZWZvcmVfUExURSAweDEwCisjZGVmaW5lIGJlZm9yZV9JREFUIDB4MjAKKyNkZWZpbmUgYWZ0ZXJfSURBVCAgMHg0MAorCitzdGF0aWMgdm9pZAoraW5pdF9jYWxsYmFja19pbmZvKHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0cikKK3sKKyAgIE1FTVpFUk8odXNlcl9jaHVua19kYXRhKTsKKyAgIHVzZXJfY2h1bmtfZGF0YS5pbmZvX3B0ciA9IGluZm9fcHRyOworfQorCitzdGF0aWMgaW50CitzZXRfbG9jYXRpb24ocG5nX3N0cnVjdHAgcG5nX3B0ciwgc3RydWN0IHVzZXJfY2h1bmtfZGF0YSAqZGF0YSwgaW50IHdoYXQpCit7CisgICBpbnQgbG9jYXRpb247CisKKyAgIGlmICgoZGF0YS0+bG9jYXRpb25bMF0gJiB3aGF0KSAhPSAwIHx8IChkYXRhLT5sb2NhdGlvblsxXSAmIHdoYXQpICE9IDApCisgICAgICByZXR1cm4gMDsgLyogYWxyZWFkeSBoYXZlIG9uZSBvZiB0aGVzZSAqLworCisgICAvKiBGaW5kIHdoZXJlIHdlIGFyZSAodGhlIGNvZGUgYmVsb3cgemVyb2VzIGluZm9fcHRyIHRvIGluZGljYXRlIHRoYXQgdGhlCisgICAgKiBjaHVua3MgYmVmb3JlIHRoZSBmaXJzdCBJREFUIGhhdmUgYmVlbiByZWFkLikKKyAgICAqLworICAgaWYgKGRhdGEtPmluZm9fcHRyID09IE5VTEwpIC8qIGFmdGVyIElEQVQgKi8KKyAgICAgIGxvY2F0aW9uID0gd2hhdCB8IGFmdGVyX0lEQVQ7CisKKyAgIGVsc2UgaWYgKHBuZ19nZXRfdmFsaWQocG5nX3B0ciwgZGF0YS0+aW5mb19wdHIsIFBOR19JTkZPX1BMVEUpICE9IDApCisgICAgICBsb2NhdGlvbiA9IHdoYXQgfCBiZWZvcmVfSURBVDsKKworICAgZWxzZQorICAgICAgbG9jYXRpb24gPSB3aGF0IHwgYmVmb3JlX1BMVEU7CisKKyAgIGlmIChkYXRhLT5sb2NhdGlvblswXSA9PSAwKQorICAgICAgZGF0YS0+bG9jYXRpb25bMF0gPSBsb2NhdGlvbjsKKworICAgZWxzZQorICAgICAgZGF0YS0+bG9jYXRpb25bMV0gPSBsb2NhdGlvbjsKKworICAgcmV0dXJuIDE7IC8qIGhhbmRsZWQgKi8KK30KKworc3RhdGljIGludCBQTkdDQkFQSQorcmVhZF91c2VyX2NodW5rX2NhbGxiYWNrKHBuZ19zdHJ1Y3QgKnBuZ19wdHIsIHBuZ191bmtub3duX2NodW5rcCBjaHVuaykKK3sKKyAgIHN0cnVjdCB1c2VyX2NodW5rX2RhdGEgKm15X3VzZXJfY2h1bmtfZGF0YSA9CisgICAgICAoc3RydWN0IHVzZXJfY2h1bmtfZGF0YSopcG5nX2dldF91c2VyX2NodW5rX3B0cihwbmdfcHRyKTsKKworICAgaWYgKG15X3VzZXJfY2h1bmtfZGF0YSA9PSBOVUxMKQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJsb3N0IHVzZXIgY2h1bmsgcG9pbnRlciIpOworCisgICAvKiBSZXR1cm4gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgKiAgICByZXR1cm4gKC1uKTsgIGNodW5rIGhhZCBhbiBlcnJvcgorICAgICogICAgcmV0dXJuICgwKTsgIGRpZCBub3QgcmVjb2duaXplCisgICAgKiAgICByZXR1cm4gKG4pOyAgc3VjY2VzcworICAgICoKKyAgICAqIFRoZSB1bmtub3duIGNodW5rIHN0cnVjdHVyZSBjb250YWlucyB0aGUgY2h1bmsgZGF0YToKKyAgICAqIHBuZ19ieXRlIG5hbWVbNV07CisgICAgKiBwbmdfYnl0ZSAqZGF0YTsKKyAgICAqIHBuZ19zaXplX3Qgc2l6ZTsKKyAgICAqCisgICAgKiBOb3RlIHRoYXQgbGlicG5nIGhhcyBhbHJlYWR5IHRha2VuIGNhcmUgb2YgdGhlIENSQyBoYW5kbGluZy4KKyAgICAqLworCisgICBpZiAoY2h1bmstPm5hbWVbMF0gPT0gMTE1ICYmIGNodW5rLT5uYW1lWzFdID09ICA4NCAmJiAgICAgLyogcyAgVCAqLworICAgICAgIGNodW5rLT5uYW1lWzJdID09ICA2OSAmJiBjaHVuay0+bmFtZVszXSA9PSAgODIpICAgICAgIC8qIEUgIFIgKi8KKyAgICAgIHsKKyAgICAgICAgIC8qIEZvdW5kIHNURVIgY2h1bmsgKi8KKyAgICAgICAgIGlmIChjaHVuay0+c2l6ZSAhPSAxKQorICAgICAgICAgICAgcmV0dXJuICgtMSk7IC8qIEVycm9yIHJldHVybiAqLworCisgICAgICAgICBpZiAoY2h1bmstPmRhdGFbMF0gIT0gMCAmJiBjaHVuay0+ZGF0YVswXSAhPSAxKQorICAgICAgICAgICAgcmV0dXJuICgtMSk7ICAvKiBJbnZhbGlkIG1vZGUgKi8KKworICAgICAgICAgaWYgKHNldF9sb2NhdGlvbihwbmdfcHRyLCBteV91c2VyX2NodW5rX2RhdGEsIGhhdmVfc1RFUikgIT0gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIG15X3VzZXJfY2h1bmtfZGF0YS0+c1RFUl9tb2RlPWNodW5rLT5kYXRhWzBdOworICAgICAgICAgICAgcmV0dXJuICgxKTsKKyAgICAgICAgIH0KKworICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuICgwKTsgLyogZHVwbGljYXRlIHNURVIgLSBnaXZlIGl0IHRvIGxpYnBuZyAqLworICAgICAgfQorCisgICBpZiAoY2h1bmstPm5hbWVbMF0gIT0gMTE4IHx8IGNodW5rLT5uYW1lWzFdICE9IDExMiB8fCAgICAvKiB2ICBwICovCisgICAgICAgY2h1bmstPm5hbWVbMl0gIT0gIDY1IHx8IGNodW5rLT5uYW1lWzNdICE9IDEwMykgICAgICAvKiBBICBnICovCisgICAgICByZXR1cm4gKDApOyAvKiBEaWQgbm90IHJlY29nbml6ZSAqLworCisgICAvKiBGb3VuZCBJbWFnZU1hZ2ljayB2cEFnIGNodW5rICovCisKKyAgIGlmIChjaHVuay0+c2l6ZSAhPSA5KQorICAgICAgcmV0dXJuICgtMSk7IC8qIEVycm9yIHJldHVybiAqLworCisgICBpZiAoc2V0X2xvY2F0aW9uKHBuZ19wdHIsIG15X3VzZXJfY2h1bmtfZGF0YSwgaGF2ZV92cEFnKSA9PSAwKQorICAgICAgcmV0dXJuICgwKTsgIC8qIGR1cGxpY2F0ZSB2cEFnICovCisKKyAgIG15X3VzZXJfY2h1bmtfZGF0YS0+dnBBZ193aWR0aCA9IHBuZ19nZXRfdWludF8zMShwbmdfcHRyLCBjaHVuay0+ZGF0YSk7CisgICBteV91c2VyX2NodW5rX2RhdGEtPnZwQWdfaGVpZ2h0ID0gcG5nX2dldF91aW50XzMxKHBuZ19wdHIsIGNodW5rLT5kYXRhICsgNCk7CisgICBteV91c2VyX2NodW5rX2RhdGEtPnZwQWdfdW5pdHMgPSBjaHVuay0+ZGF0YVs4XTsKKworICAgcmV0dXJuICgxKTsKK30KKworI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKK3N0YXRpYyB2b2lkCit3cml0ZV9zVEVSX2NodW5rKHBuZ19zdHJ1Y3RwIHdyaXRlX3B0cikKK3sKKyAgIHBuZ19ieXRlIHNURVJbNV0gPSB7MTE1LCAgODQsICA2OSwgIDgyLCAnXDAnfTsKKworICAgaWYgKHZlcmJvc2UgIT0gMCkKKyAgICAgIGZwcmludGYoU1RERVJSLCAiXG4gc3RlcmVvIG1vZGUgPSAlZFxuIiwgdXNlcl9jaHVua19kYXRhLnNURVJfbW9kZSk7CisKKyAgIHBuZ193cml0ZV9jaHVuayh3cml0ZV9wdHIsIHNURVIsICZ1c2VyX2NodW5rX2RhdGEuc1RFUl9tb2RlLCAxKTsKK30KKworc3RhdGljIHZvaWQKK3dyaXRlX3ZwQWdfY2h1bmsocG5nX3N0cnVjdHAgd3JpdGVfcHRyKQoreworICAgcG5nX2J5dGUgdnBBZ1s1XSA9IHsxMTgsIDExMiwgIDY1LCAxMDMsICdcMCd9OworCisgICBwbmdfYnl0ZSB2cGFnX2NodW5rX2RhdGFbOV07CisKKyAgIGlmICh2ZXJib3NlICE9IDApCisgICAgICBmcHJpbnRmKFNUREVSUiwgIiB2cEFnID0gJWx1IHggJWx1LCB1bml0cyA9ICVkXG4iLAorICAgICAgICAodW5zaWduZWQgbG9uZyl1c2VyX2NodW5rX2RhdGEudnBBZ193aWR0aCwKKyAgICAgICAgKHVuc2lnbmVkIGxvbmcpdXNlcl9jaHVua19kYXRhLnZwQWdfaGVpZ2h0LAorICAgICAgICB1c2VyX2NodW5rX2RhdGEudnBBZ191bml0cyk7CisKKyAgIHBuZ19zYXZlX3VpbnRfMzIodnBhZ19jaHVua19kYXRhLCB1c2VyX2NodW5rX2RhdGEudnBBZ193aWR0aCk7CisgICBwbmdfc2F2ZV91aW50XzMyKHZwYWdfY2h1bmtfZGF0YSArIDQsIHVzZXJfY2h1bmtfZGF0YS52cEFnX2hlaWdodCk7CisgICB2cGFnX2NodW5rX2RhdGFbOF0gPSB1c2VyX2NodW5rX2RhdGEudnBBZ191bml0czsKKyAgIHBuZ193cml0ZV9jaHVuayh3cml0ZV9wdHIsIHZwQWcsIHZwYWdfY2h1bmtfZGF0YSwgOSk7Cit9CisKK3N0YXRpYyB2b2lkCit3cml0ZV9jaHVua3MocG5nX3N0cnVjdHAgd3JpdGVfcHRyLCBpbnQgbG9jYXRpb24pCit7CisgICBpbnQgaTsKKworICAgLyogTm90aWNlIHRoYXQgdGhpcyBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIGNodW5rIG9yZGVyLCBob3dldmVyIGNodW5rcworICAgICogaW50ZXJjZXB0ZWQgYnkgdGhlIGNhbGxiYWNrIHdpbGwgYmUgd3JpdHRlbiAqYWZ0ZXIqIGNodW5rcyBwYXNzZWQgdG8KKyAgICAqIGxpYnBuZy4gIFRoaXMgd2lsbCBhY3R1YWxseSByZXZlcnNlIGEgcGFpciBvZiBzVEVSIGNodW5rcyBvciBhIHBhaXIgb2YKKyAgICAqIHZwQWcgY2h1bmtzLCByZXN1bHRpbmcgaW4gYW4gZXJyb3IgbGF0ZXIuICBUaGlzIGlzIG5vdCB3b3J0aCB3b3JyeWluZworICAgICogYWJvdXQgLSB0aGUgY2h1bmtzIHNob3VsZCBub3QgYmUgZHVwbGljYXRlZCEKKyAgICAqLworICAgZm9yIChpPTA7IGk8MjsgKytpKQorICAgeworICAgICAgaWYgKHVzZXJfY2h1bmtfZGF0YS5sb2NhdGlvbltpXSA9PSAobG9jYXRpb24gfCBoYXZlX3NURVIpKQorICAgICAgICAgd3JpdGVfc1RFUl9jaHVuayh3cml0ZV9wdHIpOworCisgICAgICBlbHNlIGlmICh1c2VyX2NodW5rX2RhdGEubG9jYXRpb25baV0gPT0gKGxvY2F0aW9uIHwgaGF2ZV92cEFnKSkKKyAgICAgICAgIHdyaXRlX3ZwQWdfY2h1bmsod3JpdGVfcHRyKTsKKyAgIH0KK30KKyNlbmRpZiAvKiBXUklURSAqLworI2Vsc2UgLyogIVJFQURfVVNFUl9DSFVOS1MgKi8KKyMgIGRlZmluZSB3cml0ZV9jaHVua3MocHAsbG9jKSAoKHZvaWQpMCkKKyNlbmRpZgorLyogRU5EIG9mIGNvZGUgdG8gZGVtb25zdHJhdGUgdXNlciBjaHVuayBzdXBwb3J0ICovCisKKy8qIFNUQVJUIG9mIGNvZGUgdG8gY2hlY2sgdGhhdCBsaWJwbmcgaGFzIHRoZSByZXF1aXJlZCB0ZXh0IHN1cHBvcnQ7IHRoaXMgb25seQorICogY2hlY2tzIGZvciB0aGUgd3JpdGUgc3VwcG9ydCBiZWNhdXNlIGlmIHJlYWQgc3VwcG9ydCBpcyBtaXNzaW5nIHRoZSBjaHVuaworICogd2lsbCBzaW1wbHkgbm90IGJlIHJlcG9ydGVkIGJhY2sgdG8gcG5ndGVzdC4KKyAqLworI2lmZGVmIFBOR19URVhUX1NVUFBPUlRFRAorc3RhdGljIHZvaWQKK3BuZ3Rlc3RfY2hlY2tfdGV4dF9zdXBwb3J0KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ190ZXh0cCB0ZXh0X3B0ciwKKyAgIGludCBudW1fdGV4dCkKK3sKKyAgIHdoaWxlIChudW1fdGV4dCA+IDApCisgICB7CisgICAgICBzd2l0Y2ggKHRleHRfcHRyWy0tbnVtX3RleHRdLmNvbXByZXNzaW9uKQorICAgICAgeworICAgICAgICAgY2FzZSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdDoKKyMgICAgICAgICAgIGlmbmRlZiBQTkdfV1JJVEVfelRYdF9TVVBQT1JURUQKKyAgICAgICAgICAgICAgICsrdW5zdXBwb3J0ZWRfY2h1bmtzOworICAgICAgICAgICAgICAgLyogSW4gbGlicG5nIDEuNyB0aGlzIG5vdyBkb2VzIGFuIGFwcC1lcnJvciwgc28gc3RvcCBpdDogKi8KKyAgICAgICAgICAgICAgIHRleHRfcHRyW251bV90ZXh0XS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkU7CisjICAgICAgICAgICBlbmRpZgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgUE5HX0lUWFRfQ09NUFJFU1NJT05fTk9ORToKKyAgICAgICAgIGNhc2UgUE5HX0lUWFRfQ09NUFJFU1NJT05felRYdDoKKyMgICAgICAgICAgIGlmbmRlZiBQTkdfV1JJVEVfaVRYdF9TVVBQT1JURUQKKyAgICAgICAgICAgICAgICsrdW5zdXBwb3J0ZWRfY2h1bmtzOworICAgICAgICAgICAgICAgdGV4dF9wdHJbbnVtX3RleHRdLmNvbXByZXNzaW9uID0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORTsKKyMgICAgICAgICAgIGVuZGlmCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8qIFRoaXMgaXMgYW4gZXJyb3IgKi8KKyAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiaW52YWxpZCB0ZXh0IGNodW5rIGNvbXByZXNzaW9uIGZpZWxkIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgIH0KK30KKyNlbmRpZgorLyogRU5EIG9mIGNvZGUgdG8gY2hlY2sgdGhhdCBsaWJwbmcgaGFzIHRoZSByZXF1aXJlZCB0ZXh0IHN1cHBvcnQgKi8KKworLyogVGVzdCBvbmUgZmlsZSAqLworc3RhdGljIGludAordGVzdF9vbmVfZmlsZShQTkdfQ09OU1QgY2hhciAqaW5uYW1lLCBQTkdfQ09OU1QgY2hhciAqb3V0bmFtZSkKK3sKKyAgIHN0YXRpYyBwbmdfRklMRV9wIGZwaW47CisgICBzdGF0aWMgcG5nX0ZJTEVfcCBmcG91dDsgIC8qICJzdGF0aWMiIHByZXZlbnRzIHNldGptcCBjb3JydXB0aW9uICovCisgICBwbmd0ZXN0X2Vycm9yX3BhcmFtZXRlcnMgZXJyb3JfcGFyYW1ldGVyczsKKyAgIHBuZ19zdHJ1Y3RwIHJlYWRfcHRyOworICAgcG5nX2luZm9wIHJlYWRfaW5mb19wdHIsIGVuZF9pbmZvX3B0cjsKKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECisgICBwbmdfc3RydWN0cCB3cml0ZV9wdHI7CisgICBwbmdfaW5mb3Agd3JpdGVfaW5mb19wdHI7CisgICBwbmdfaW5mb3Agd3JpdGVfZW5kX2luZm9fcHRyOworI2lmZGVmIFBOR19XUklURV9GSUxURVJfU1VQUE9SVEVECisgICBpbnQgaW50ZXJsYWNlX3ByZXNlcnZlZCA9IDE7CisjZW5kaWYgLyogV1JJVEVfRklMVEVSICovCisjZWxzZSAvKiAhV1JJVEUgKi8KKyAgIHBuZ19zdHJ1Y3RwIHdyaXRlX3B0ciA9IE5VTEw7CisgICBwbmdfaW5mb3Agd3JpdGVfaW5mb19wdHIgPSBOVUxMOworICAgcG5nX2luZm9wIHdyaXRlX2VuZF9pbmZvX3B0ciA9IE5VTEw7CisjZW5kaWYgLyogIVdSSVRFICovCisgICBwbmdfYnl0ZXAgcm93X2J1ZjsKKyAgIHBuZ191aW50XzMyIHk7CisgICBwbmdfdWludF8zMiB3aWR0aCwgaGVpZ2h0OworICAgdm9sYXRpbGUgaW50IG51bV9wYXNzZXM7CisgICBpbnQgcGFzczsKKyAgIGludCBiaXRfZGVwdGgsIGNvbG9yX3R5cGU7CisKKyAgIHJvd19idWYgPSBOVUxMOworICAgZXJyb3JfcGFyYW1ldGVycy5maWxlX25hbWUgPSBpbm5hbWU7CisKKyAgIGlmICgoZnBpbiA9IGZvcGVuKGlubmFtZSwgInJiIikpID09IE5VTEwpCisgICB7CisgICAgICBmcHJpbnRmKFNUREVSUiwgIkNvdWxkIG5vdCBmaW5kIGlucHV0IGZpbGUgJXNcbiIsIGlubmFtZSk7CisgICAgICByZXR1cm4gKDEpOworICAgfQorCisgICBpZiAoKGZwb3V0ID0gZm9wZW4ob3V0bmFtZSwgIndiIikpID09IE5VTEwpCisgICB7CisgICAgICBmcHJpbnRmKFNUREVSUiwgIkNvdWxkIG5vdCBvcGVuIG91dHB1dCBmaWxlICVzXG4iLCBvdXRuYW1lKTsKKyAgICAgIEZDTE9TRShmcGluKTsKKyAgICAgIHJldHVybiAoMSk7CisgICB9CisKKyAgIHBuZ3Rlc3RfZGVidWcoIkFsbG9jYXRpbmcgcmVhZCBhbmQgd3JpdGUgc3RydWN0dXJlcyIpOworI2lmIGRlZmluZWQoUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCkgJiYgUE5HX0RFQlVHCisgICByZWFkX3B0ciA9CisgICAgICBwbmdfY3JlYXRlX3JlYWRfc3RydWN0XzIoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCBOVUxMLAorICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgcG5nX2RlYnVnX21hbGxvYywgcG5nX2RlYnVnX2ZyZWUpOworI2Vsc2UKKyAgIHJlYWRfcHRyID0KKyAgICAgIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyNlbmRpZgorICAgcG5nX3NldF9lcnJvcl9mbihyZWFkX3B0ciwgJmVycm9yX3BhcmFtZXRlcnMsIHBuZ3Rlc3RfZXJyb3IsCisgICAgICBwbmd0ZXN0X3dhcm5pbmcpOworCisjaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAorI2lmIGRlZmluZWQoUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCkgJiYgUE5HX0RFQlVHCisgICB3cml0ZV9wdHIgPQorICAgICAgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMihQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIE5VTEwsCisgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBwbmdfZGVidWdfbWFsbG9jLCBwbmdfZGVidWdfZnJlZSk7CisjZWxzZQorICAgd3JpdGVfcHRyID0KKyAgICAgIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NUUklORywgTlVMTCwgTlVMTCwgTlVMTCk7CisjZW5kaWYKKyAgIHBuZ19zZXRfZXJyb3JfZm4od3JpdGVfcHRyLCAmZXJyb3JfcGFyYW1ldGVycywgcG5ndGVzdF9lcnJvciwKKyAgICAgIHBuZ3Rlc3Rfd2FybmluZyk7CisjZW5kaWYKKyAgIHBuZ3Rlc3RfZGVidWcoIkFsbG9jYXRpbmcgcmVhZF9pbmZvLCB3cml0ZV9pbmZvIGFuZCBlbmRfaW5mbyBzdHJ1Y3R1cmVzIik7CisgICByZWFkX2luZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChyZWFkX3B0cik7CisgICBlbmRfaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHJlYWRfcHRyKTsKKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECisgICB3cml0ZV9pbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3Qod3JpdGVfcHRyKTsKKyAgIHdyaXRlX2VuZF9pbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3Qod3JpdGVfcHRyKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfVVNFUl9DSFVOS1NfU1VQUE9SVEVECisgICBpbml0X2NhbGxiYWNrX2luZm8ocmVhZF9pbmZvX3B0cik7CisgICBwbmdfc2V0X3JlYWRfdXNlcl9jaHVua19mbihyZWFkX3B0ciwgJnVzZXJfY2h1bmtfZGF0YSwKKyAgICAgcmVhZF91c2VyX2NodW5rX2NhbGxiYWNrKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKKyAgIHBuZ3Rlc3RfZGVidWcoIlNldHRpbmcgam1wYnVmIGZvciByZWFkIHN0cnVjdCIpOworICAgaWYgKHNldGptcChwbmdfam1wYnVmKHJlYWRfcHRyKSkpCisgICB7CisgICAgICBmcHJpbnRmKFNUREVSUiwgIiVzIC0+ICVzOiBsaWJwbmcgcmVhZCBlcnJvclxuIiwgaW5uYW1lLCBvdXRuYW1lKTsKKyAgICAgIHBuZ19mcmVlKHJlYWRfcHRyLCByb3dfYnVmKTsKKyAgICAgIHJvd19idWYgPSBOVUxMOworICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnJlYWRfcHRyLCAmcmVhZF9pbmZvX3B0ciwgJmVuZF9pbmZvX3B0cik7CisjaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAorICAgICAgcG5nX2Rlc3Ryb3lfaW5mb19zdHJ1Y3Qod3JpdGVfcHRyLCAmd3JpdGVfZW5kX2luZm9fcHRyKTsKKyAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmd3JpdGVfcHRyLCAmd3JpdGVfaW5mb19wdHIpOworI2VuZGlmCisgICAgICBGQ0xPU0UoZnBpbik7CisgICAgICBGQ0xPU0UoZnBvdXQpOworICAgICAgcmV0dXJuICgxKTsKKyAgIH0KKworI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKKyAgIHBuZ3Rlc3RfZGVidWcoIlNldHRpbmcgam1wYnVmIGZvciB3cml0ZSBzdHJ1Y3QiKTsKKworICAgaWYgKHNldGptcChwbmdfam1wYnVmKHdyaXRlX3B0cikpKQorICAgeworICAgICAgZnByaW50ZihTVERFUlIsICIlcyAtPiAlczogbGlicG5nIHdyaXRlIGVycm9yXG4iLCBpbm5hbWUsIG91dG5hbWUpOworICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnJlYWRfcHRyLCAmcmVhZF9pbmZvX3B0ciwgJmVuZF9pbmZvX3B0cik7CisgICAgICBwbmdfZGVzdHJveV9pbmZvX3N0cnVjdCh3cml0ZV9wdHIsICZ3cml0ZV9lbmRfaW5mb19wdHIpOworI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKKyAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmd3JpdGVfcHRyLCAmd3JpdGVfaW5mb19wdHIpOworI2VuZGlmCisgICAgICBGQ0xPU0UoZnBpbik7CisgICAgICBGQ0xPU0UoZnBvdXQpOworICAgICAgcmV0dXJuICgxKTsKKyAgIH0KKyNlbmRpZgorI2VuZGlmCisKKyAgIGlmIChzdHJpY3QgIT0gMCkKKyAgIHsKKyAgICAgIC8qIFRyZWF0IHBuZ19iZW5pZ25fZXJyb3IoKSBhcyBlcnJvcnMgb24gcmVhZCAqLworICAgICAgcG5nX3NldF9iZW5pZ25fZXJyb3JzKHJlYWRfcHRyLCAwKTsKKworI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKKyAgICAgIC8qIFRyZWF0IHRoZW0gYXMgZXJyb3JzIG9uIHdyaXRlICovCisgICAgICBwbmdfc2V0X2Jlbmlnbl9lcnJvcnMod3JpdGVfcHRyLCAwKTsKKyNlbmRpZgorCisgICAgICAvKiBpZiBzdHJpY3QgaXMgbm90IHNldCwgdGhlbiBhcHAgd2FybmluZ3MgYW5kIGVycm9ycyBhcmUgdHJlYXRlZCBhcworICAgICAgICogd2FybmluZ3MgaW4gcmVsZWFzZSBidWlsZHMsIGJ1dCBub3QgaW4gdW5zdGFibGUgYnVpbGRzOyB0aGlzIGNhbiBiZQorICAgICAgICogY2hhbmdlZCB3aXRoICctLXJlbGF4ZWQnLgorICAgICAgICovCisgICB9CisKKyAgIGVsc2UgaWYgKHJlbGF4ZWQgIT0gMCkKKyAgIHsKKyAgICAgIC8qIEFsbG93IGFwcGxpY2F0aW9uIChwbmd0ZXN0KSBlcnJvcnMgYW5kIHdhcm5pbmdzIHRvIHBhc3MgKi8KKyAgICAgIHBuZ19zZXRfYmVuaWduX2Vycm9ycyhyZWFkX3B0ciwgMSk7CisKKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECisgICAgICBwbmdfc2V0X2Jlbmlnbl9lcnJvcnMod3JpdGVfcHRyLCAxKTsKKyNlbmRpZgorICAgfQorCisgICBwbmd0ZXN0X2RlYnVnKCJJbml0aWFsaXppbmcgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zIik7CisjaWZkZWYgUE5HX1NURElPX1NVUFBPUlRFRAorICAgcG5nX2luaXRfaW8ocmVhZF9wdHIsIGZwaW4pOworIyAgaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAorICAgcG5nX2luaXRfaW8od3JpdGVfcHRyLCBmcG91dCk7CisjICBlbmRpZgorI2Vsc2UKKyAgIHBuZ19zZXRfcmVhZF9mbihyZWFkX3B0ciwgKHBuZ192b2lkcClmcGluLCBwbmd0ZXN0X3JlYWRfZGF0YSk7CisjICBpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECisgICBwbmdfc2V0X3dyaXRlX2ZuKHdyaXRlX3B0ciwgKHBuZ192b2lkcClmcG91dCwgIHBuZ3Rlc3Rfd3JpdGVfZGF0YSwKKyMgICAgaWZkZWYgUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRAorICAgICAgcG5ndGVzdF9mbHVzaCk7CisjICAgIGVsc2UKKyAgICAgIE5VTEwpOworIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisgICBpZiAoc3RhdHVzX2RvdHNfcmVxdWVzdGVkID09IDEpCisgICB7CisjaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAorICAgICAgcG5nX3NldF93cml0ZV9zdGF0dXNfZm4od3JpdGVfcHRyLCB3cml0ZV9yb3dfY2FsbGJhY2spOworI2VuZGlmCisgICAgICBwbmdfc2V0X3JlYWRfc3RhdHVzX2ZuKHJlYWRfcHRyLCByZWFkX3Jvd19jYWxsYmFjayk7CisgICB9CisKKyAgIGVsc2UKKyAgIHsKKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECisgICAgICBwbmdfc2V0X3dyaXRlX3N0YXR1c19mbih3cml0ZV9wdHIsIE5VTEwpOworI2VuZGlmCisgICAgICBwbmdfc2V0X3JlYWRfc3RhdHVzX2ZuKHJlYWRfcHRyLCBOVUxMKTsKKyAgIH0KKworI2lmZGVmIFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRAorICAgcG5nX3NldF9yZWFkX3VzZXJfdHJhbnNmb3JtX2ZuKHJlYWRfcHRyLCByZWFkX3VzZXJfY2FsbGJhY2spOworI2VuZGlmCisjaWZkZWYgUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRAorICAgemVyb19zYW1wbGVzID0gMDsKKyAgIHBuZ19zZXRfd3JpdGVfdXNlcl90cmFuc2Zvcm1fZm4od3JpdGVfcHRyLCBjb3VudF96ZXJvX3NhbXBsZXMpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfU0VUX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAorICAgLyogUHJlc2VydmUgYWxsIHRoZSB1bmtub3duIGNodW5rcywgaWYgcG9zc2libGUuICBJZiB0aGlzIGlzIGRpc2FibGVkIHRoZW4sCisgICAgKiBldmVuIGlmIHRoZSBwbmdfe2dldCxzZXR9X3Vua25vd25fY2h1bmtzIHN0dWZmIGlzIGVuYWJsZWQsIHdlIGNhbid0IHVzZQorICAgICogbGlicG5nIHRvICpzYXZlKiB0aGUgdW5rbm93biBjaHVua3Mgb24gcmVhZCAoYmVjYXVzZSB3ZSBjYW4ndCBzd2l0Y2ggdGhlCisgICAgKiBzYXZlIG9wdGlvbiBvbiEpCisgICAgKgorICAgICogTm90aWNlIHRoYXQgaWYgU0VUX1VOS05PV05fQ0hVTktTIGlzICpub3QqIHN1cHBvcnRlZCByZWFkIHdpbGwgZGlzY2FyZCBhbGwKKyAgICAqIHVua25vd24gY2h1bmtzIGFuZCB3cml0ZSB3aWxsIHdyaXRlIHRoZW0gYWxsLgorICAgICovCisjaWZkZWYgUE5HX1NBVkVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECisgICBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MocmVhZF9wdHIsIFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTLAorICAgICAgTlVMTCwgMCk7CisjZW5kaWYKKyNpZmRlZiBQTkdfV1JJVEVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECisgICBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3Mod3JpdGVfcHRyLCBQTkdfSEFORExFX0NIVU5LX0FMV0FZUywKKyAgICAgIE5VTEwsIDApOworI2VuZGlmCisjZW5kaWYKKworICAgcG5ndGVzdF9kZWJ1ZygiUmVhZGluZyBpbmZvIHN0cnVjdCIpOworICAgcG5nX3JlYWRfaW5mbyhyZWFkX3B0ciwgcmVhZF9pbmZvX3B0cik7CisKKyNpZmRlZiBQTkdfUkVBRF9VU0VSX0NIVU5LU19TVVBQT1JURUQKKyAgIC8qIFRoaXMgaXMgYSBiaXQgb2YgYSBoYWNrOyB0aGVyZSBpcyBubyBvYnZpb3VzIHdheSBpbiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KKyAgICAqIHRvIGRldGVybWluZSB0aGF0IHRoZSBjaHVua3MgYmVmb3JlIHRoZSBmaXJzdCBJREFUIGhhdmUgYmVlbiByZWFkLCBzbworICAgICogcmVtb3ZlIHRoZSBpbmZvX3B0ciAod2hpY2ggaXMgb25seSB1c2VkIHRvIGRldGVybWluZSBwb3NpdGlvbiByZWxhdGl2ZSB0bworICAgICogUExURSkgaGVyZSB0byBpbmRpY2F0ZSB0aGF0IHdlIGFyZSBhZnRlciB0aGUgSURBVC4KKyAgICAqLworICAgdXNlcl9jaHVua19kYXRhLmluZm9fcHRyID0gTlVMTDsKKyNlbmRpZgorCisgICBwbmd0ZXN0X2RlYnVnKCJUcmFuc2ZlcnJpbmcgaW5mbyBzdHJ1Y3QiKTsKKyAgIHsKKyAgICAgIGludCBpbnRlcmxhY2VfdHlwZSwgY29tcHJlc3Npb25fdHlwZSwgZmlsdGVyX3R5cGU7CisKKyAgICAgIGlmIChwbmdfZ2V0X0lIRFIocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsICZ3aWR0aCwgJmhlaWdodCwgJmJpdF9kZXB0aCwKKyAgICAgICAgICAmY29sb3JfdHlwZSwgJmludGVybGFjZV90eXBlLCAmY29tcHJlc3Npb25fdHlwZSwgJmZpbHRlcl90eXBlKSAhPSAwKQorICAgICAgeworICAgICAgICAgcG5nX3NldF9JSERSKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIHdpZHRoLCBoZWlnaHQsIGJpdF9kZXB0aCwKKyAgICAgICAgICAgIGNvbG9yX3R5cGUsIGludGVybGFjZV90eXBlLCBjb21wcmVzc2lvbl90eXBlLCBmaWx0ZXJfdHlwZSk7CisgICAgICAgICAvKiBudW1fcGFzc2VzIG1heSBub3QgYmUgYXZhaWxhYmxlIGJlbG93IGlmIGludGVybGFjZSBzdXBwb3J0IGlzIG5vdAorICAgICAgICAgICogcHJvdmlkZWQgYnkgbGlicG5nIGZvciBib3RoIHJlYWQgYW5kIHdyaXRlLgorICAgICAgICAgICovCisgICAgICAgICBzd2l0Y2ggKGludGVybGFjZV90eXBlKQorICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBQTkdfSU5URVJMQUNFX05PTkU6CisgICAgICAgICAgICAgICBudW1fcGFzc2VzID0gMTsKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFBOR19JTlRFUkxBQ0VfQURBTTc6CisgICAgICAgICAgICAgICBudW1fcGFzc2VzID0gNzsKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgcG5nX2Vycm9yKHJlYWRfcHRyLCAiaW52YWxpZCBpbnRlcmxhY2UgdHlwZSIpOworICAgICAgICAgICAgICAgLypOT1QgUkVBQ0hFRCovCisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgICAgIHBuZ19lcnJvcihyZWFkX3B0ciwgInBuZ19nZXRfSUhEUiBmYWlsZWQiKTsKKyAgIH0KKyNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECisjaWZkZWYgUE5HX2NIUk1fU1VQUE9SVEVECisgICB7CisgICAgICBwbmdfZml4ZWRfcG9pbnQgd2hpdGVfeCwgd2hpdGVfeSwgcmVkX3gsIHJlZF95LCBncmVlbl94LCBncmVlbl95LCBibHVlX3gsCisgICAgICAgICBibHVlX3k7CisKKyAgICAgIGlmIChwbmdfZ2V0X2NIUk1fZml4ZWQocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsICZ3aGl0ZV94LCAmd2hpdGVfeSwKKyAgICAgICAgICZyZWRfeCwgJnJlZF95LCAmZ3JlZW5feCwgJmdyZWVuX3ksICZibHVlX3gsICZibHVlX3kpICE9IDApCisgICAgICB7CisgICAgICAgICBwbmdfc2V0X2NIUk1fZml4ZWQod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwgd2hpdGVfeCwgd2hpdGVfeSwgcmVkX3gsCisgICAgICAgICAgICByZWRfeSwgZ3JlZW5feCwgZ3JlZW5feSwgYmx1ZV94LCBibHVlX3kpOworICAgICAgfQorICAgfQorI2VuZGlmCisjaWZkZWYgUE5HX2dBTUFfU1VQUE9SVEVECisgICB7CisgICAgICBwbmdfZml4ZWRfcG9pbnQgZ2FtbWE7CisKKyAgICAgIGlmIChwbmdfZ2V0X2dBTUFfZml4ZWQocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsICZnYW1tYSkgIT0gMCkKKyAgICAgICAgIHBuZ19zZXRfZ0FNQV9maXhlZCh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCBnYW1tYSk7CisgICB9CisjZW5kaWYKKyNlbHNlIC8qIFVzZSBmbG9hdGluZyBwb2ludCB2ZXJzaW9ucyAqLworI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKKyNpZmRlZiBQTkdfY0hSTV9TVVBQT1JURUQKKyAgIHsKKyAgICAgIGRvdWJsZSB3aGl0ZV94LCB3aGl0ZV95LCByZWRfeCwgcmVkX3ksIGdyZWVuX3gsIGdyZWVuX3ksIGJsdWVfeCwKKyAgICAgICAgIGJsdWVfeTsKKworICAgICAgaWYgKHBuZ19nZXRfY0hSTShyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwgJndoaXRlX3gsICZ3aGl0ZV95LCAmcmVkX3gsCisgICAgICAgICAmcmVkX3ksICZncmVlbl94LCAmZ3JlZW5feSwgJmJsdWVfeCwgJmJsdWVfeSkgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19zZXRfY0hSTSh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCB3aGl0ZV94LCB3aGl0ZV95LCByZWRfeCwKKyAgICAgICAgICAgIHJlZF95LCBncmVlbl94LCBncmVlbl95LCBibHVlX3gsIGJsdWVfeSk7CisgICAgICB9CisgICB9CisjZW5kaWYKKyNpZmRlZiBQTkdfZ0FNQV9TVVBQT1JURUQKKyAgIHsKKyAgICAgIGRvdWJsZSBnYW1tYTsKKworICAgICAgaWYgKHBuZ19nZXRfZ0FNQShyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwgJmdhbW1hKSAhPSAwKQorICAgICAgICAgcG5nX3NldF9nQU1BKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIGdhbW1hKTsKKyAgIH0KKyNlbmRpZgorI2VuZGlmIC8qIEZsb2F0aW5nIHBvaW50ICovCisjZW5kaWYgLyogRml4ZWQgcG9pbnQgKi8KKyNpZmRlZiBQTkdfaUNDUF9TVVBQT1JURUQKKyAgIHsKKyAgICAgIHBuZ19jaGFycCBuYW1lOworICAgICAgcG5nX2J5dGVwIHByb2ZpbGU7CisgICAgICBwbmdfdWludF8zMiBwcm9mbGVuOworICAgICAgaW50IGNvbXByZXNzaW9uX3R5cGU7CisKKyAgICAgIGlmIChwbmdfZ2V0X2lDQ1AocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsICZuYW1lLCAmY29tcHJlc3Npb25fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAmcHJvZmlsZSwgJnByb2ZsZW4pICE9IDApCisgICAgICB7CisgICAgICAgICBwbmdfc2V0X2lDQ1Aod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwgbmFtZSwgY29tcHJlc3Npb25fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLCBwcm9mbGVuKTsKKyAgICAgIH0KKyAgIH0KKyNlbmRpZgorI2lmZGVmIFBOR19zUkdCX1NVUFBPUlRFRAorICAgeworICAgICAgaW50IGludGVudDsKKworICAgICAgaWYgKHBuZ19nZXRfc1JHQihyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwgJmludGVudCkgIT0gMCkKKyAgICAgICAgIHBuZ19zZXRfc1JHQih3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCBpbnRlbnQpOworICAgfQorI2VuZGlmCisgICB7CisgICAgICBwbmdfY29sb3JwIHBhbGV0dGU7CisgICAgICBpbnQgbnVtX3BhbGV0dGU7CisKKyAgICAgIGlmIChwbmdfZ2V0X1BMVEUocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsICZwYWxldHRlLCAmbnVtX3BhbGV0dGUpICE9IDApCisgICAgICAgICBwbmdfc2V0X1BMVEUod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwgcGFsZXR0ZSwgbnVtX3BhbGV0dGUpOworICAgfQorI2lmZGVmIFBOR19iS0dEX1NVUFBPUlRFRAorICAgeworICAgICAgcG5nX2NvbG9yXzE2cCBiYWNrZ3JvdW5kOworCisgICAgICBpZiAocG5nX2dldF9iS0dEKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAmYmFja2dyb3VuZCkgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19zZXRfYktHRCh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCBiYWNrZ3JvdW5kKTsKKyAgICAgIH0KKyAgIH0KKyNlbmRpZgorI2lmZGVmIFBOR19oSVNUX1NVUFBPUlRFRAorICAgeworICAgICAgcG5nX3VpbnRfMTZwIGhpc3Q7CisKKyAgICAgIGlmIChwbmdfZ2V0X2hJU1QocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsICZoaXN0KSAhPSAwKQorICAgICAgICAgcG5nX3NldF9oSVNUKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIGhpc3QpOworICAgfQorI2VuZGlmCisjaWZkZWYgUE5HX29GRnNfU1VQUE9SVEVECisgICB7CisgICAgICBwbmdfaW50XzMyIG9mZnNldF94LCBvZmZzZXRfeTsKKyAgICAgIGludCB1bml0X3R5cGU7CisKKyAgICAgIGlmIChwbmdfZ2V0X29GRnMocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsICZvZmZzZXRfeCwgJm9mZnNldF95LAorICAgICAgICAgICZ1bml0X3R5cGUpICE9IDApCisgICAgICB7CisgICAgICAgICBwbmdfc2V0X29GRnMod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwgb2Zmc2V0X3gsIG9mZnNldF95LCB1bml0X3R5cGUpOworICAgICAgfQorICAgfQorI2VuZGlmCisjaWZkZWYgUE5HX3BDQUxfU1VQUE9SVEVECisgICB7CisgICAgICBwbmdfY2hhcnAgcHVycG9zZSwgdW5pdHM7CisgICAgICBwbmdfY2hhcnBwIHBhcmFtczsKKyAgICAgIHBuZ19pbnRfMzIgWDAsIFgxOworICAgICAgaW50IHR5cGUsIG5wYXJhbXM7CisKKyAgICAgIGlmIChwbmdfZ2V0X3BDQUwocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsICZwdXJwb3NlLCAmWDAsICZYMSwgJnR5cGUsCisgICAgICAgICAmbnBhcmFtcywgJnVuaXRzLCAmcGFyYW1zKSAhPSAwKQorICAgICAgeworICAgICAgICAgcG5nX3NldF9wQ0FMKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIHB1cnBvc2UsIFgwLCBYMSwgdHlwZSwKKyAgICAgICAgICAgIG5wYXJhbXMsIHVuaXRzLCBwYXJhbXMpOworICAgICAgfQorICAgfQorI2VuZGlmCisjaWZkZWYgUE5HX3BIWXNfU1VQUE9SVEVECisgICB7CisgICAgICBwbmdfdWludF8zMiByZXNfeCwgcmVzX3k7CisgICAgICBpbnQgdW5pdF90eXBlOworCisgICAgICBpZiAocG5nX2dldF9wSFlzKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAmcmVzX3gsICZyZXNfeSwKKyAgICAgICAgICAmdW5pdF90eXBlKSAhPSAwKQorICAgICAgICAgcG5nX3NldF9wSFlzKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIHJlc194LCByZXNfeSwgdW5pdF90eXBlKTsKKyAgIH0KKyNlbmRpZgorI2lmZGVmIFBOR19zQklUX1NVUFBPUlRFRAorICAgeworICAgICAgcG5nX2NvbG9yXzhwIHNpZ19iaXQ7CisKKyAgICAgIGlmIChwbmdfZ2V0X3NCSVQocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsICZzaWdfYml0KSAhPSAwKQorICAgICAgICAgcG5nX3NldF9zQklUKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIHNpZ19iaXQpOworICAgfQorI2VuZGlmCisjaWZkZWYgUE5HX3NDQUxfU1VQUE9SVEVECisjaWYgZGVmaW5lZChQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEKSAmJiBcCisgICBkZWZpbmVkKFBOR19GTE9BVElOR19BUklUSE1FVElDX1NVUFBPUlRFRCkKKyAgIHsKKyAgICAgIGludCB1bml0OworICAgICAgZG91YmxlIHNjYWxfd2lkdGgsIHNjYWxfaGVpZ2h0OworCisgICAgICBpZiAocG5nX2dldF9zQ0FMKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAmdW5pdCwgJnNjYWxfd2lkdGgsCisgICAgICAgICAmc2NhbF9oZWlnaHQpICE9IDApCisgICAgICB7CisgICAgICAgICBwbmdfc2V0X3NDQUwod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwgdW5pdCwgc2NhbF93aWR0aCwgc2NhbF9oZWlnaHQpOworICAgICAgfQorICAgfQorI2Vsc2UKKyNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECisgICB7CisgICAgICBpbnQgdW5pdDsKKyAgICAgIHBuZ19jaGFycCBzY2FsX3dpZHRoLCBzY2FsX2hlaWdodDsKKworICAgICAgaWYgKHBuZ19nZXRfc0NBTF9zKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAmdW5pdCwgJnNjYWxfd2lkdGgsCisgICAgICAgICAgJnNjYWxfaGVpZ2h0KSAhPSAwKQorICAgICAgeworICAgICAgICAgcG5nX3NldF9zQ0FMX3Mod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwgdW5pdCwgc2NhbF93aWR0aCwKKyAgICAgICAgICAgICBzY2FsX2hlaWdodCk7CisgICAgICB9CisgICB9CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBQTkdfc1BMVF9TVVBQT1JURUQKKyAgIHsKKyAgICAgICBwbmdfc1BMVF90cCBlbnRyaWVzOworCisgICAgICAgaW50IG51bV9lbnRyaWVzID0gKGludCkgcG5nX2dldF9zUExUKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAmZW50cmllcyk7CisgICAgICAgaWYgKG51bV9lbnRyaWVzKQorICAgICAgIHsKKyAgICAgICAgICAgcG5nX3NldF9zUExUKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIGVudHJpZXMsIG51bV9lbnRyaWVzKTsKKyAgICAgICB9CisgICB9CisjZW5kaWYKKworI2lmZGVmIFBOR19URVhUX1NVUFBPUlRFRAorICAgeworICAgICAgcG5nX3RleHRwIHRleHRfcHRyOworICAgICAgaW50IG51bV90ZXh0OworCisgICAgICBpZiAocG5nX2dldF90ZXh0KHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAmdGV4dF9wdHIsICZudW1fdGV4dCkgPiAwKQorICAgICAgeworICAgICAgICAgcG5ndGVzdF9kZWJ1ZzEoIkhhbmRsaW5nICVkIGlUWHQvdEVYdC96VFh0IGNodW5rcyIsIG51bV90ZXh0KTsKKworICAgICAgICAgcG5ndGVzdF9jaGVja190ZXh0X3N1cHBvcnQocmVhZF9wdHIsIHRleHRfcHRyLCBudW1fdGV4dCk7CisKKyAgICAgICAgIGlmICh2ZXJib3NlICE9IDApCisgICAgICAgICB7CisgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgZm9yIChpPTA7IGk8bnVtX3RleHQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHByaW50ZigiICAgVGV4dCBjb21wcmVzc2lvblslZF09JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBpLCB0ZXh0X3B0cltpXS5jb21wcmVzc2lvbik7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIHBuZ19zZXRfdGV4dCh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCB0ZXh0X3B0ciwgbnVtX3RleHQpOworICAgICAgfQorICAgfQorI2VuZGlmCisjaWZkZWYgUE5HX3RJTUVfU1VQUE9SVEVECisgICB7CisgICAgICBwbmdfdGltZXAgbW9kX3RpbWU7CisKKyAgICAgIGlmIChwbmdfZ2V0X3RJTUUocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsICZtb2RfdGltZSkgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19zZXRfdElNRSh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCBtb2RfdGltZSk7CisjaWZkZWYgUE5HX1RJTUVfUkZDMTEyM19TVVBQT1JURUQKKyAgICAgICAgIGlmIChwbmdfY29udmVydF90b19yZmMxMTIzX2J1ZmZlcih0SU1FX3N0cmluZywgbW9kX3RpbWUpICE9IDApCisgICAgICAgICAgICB0SU1FX3N0cmluZ1soc2l6ZW9mIHRJTUVfc3RyaW5nKSAtIDFdID0gJ1wwJzsKKworICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgc3RybmNweSh0SU1FX3N0cmluZywgIioqKiBpbnZhbGlkIHRpbWUgKioqIiwgKHNpemVvZiB0SU1FX3N0cmluZykpOworICAgICAgICAgICAgdElNRV9zdHJpbmdbKHNpemVvZiB0SU1FX3N0cmluZykgLSAxXSA9ICdcMCc7CisgICAgICAgICB9CisKKyAgICAgICAgIHRJTUVfY2h1bmtfcHJlc2VudCsrOworI2VuZGlmIC8qIFRJTUVfUkZDMTEyMyAqLworICAgICAgfQorICAgfQorI2VuZGlmCisjaWZkZWYgUE5HX3RSTlNfU1VQUE9SVEVECisgICB7CisgICAgICBwbmdfYnl0ZXAgdHJhbnNfYWxwaGE7CisgICAgICBpbnQgbnVtX3RyYW5zOworICAgICAgcG5nX2NvbG9yXzE2cCB0cmFuc19jb2xvcjsKKworICAgICAgaWYgKHBuZ19nZXRfdFJOUyhyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwgJnRyYW5zX2FscGhhLCAmbnVtX3RyYW5zLAorICAgICAgICAgJnRyYW5zX2NvbG9yKSAhPSAwKQorICAgICAgeworICAgICAgICAgaW50IHNhbXBsZV9tYXggPSAoMSA8PCBiaXRfZGVwdGgpOworICAgICAgICAgLyogbGlicG5nIGRvZXNuJ3QgcmVqZWN0IGEgdFJOUyBjaHVuayB3aXRoIG91dC1vZi1yYW5nZSBzYW1wbGVzICovCisgICAgICAgICBpZiAoISgoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZICYmCisgICAgICAgICAgICAgKGludCl0cmFuc19jb2xvci0+Z3JheSA+IHNhbXBsZV9tYXgpIHx8CisgICAgICAgICAgICAgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCICYmCisgICAgICAgICAgICAgKChpbnQpdHJhbnNfY29sb3ItPnJlZCA+IHNhbXBsZV9tYXggfHwKKyAgICAgICAgICAgICAoaW50KXRyYW5zX2NvbG9yLT5ncmVlbiA+IHNhbXBsZV9tYXggfHwKKyAgICAgICAgICAgICAoaW50KXRyYW5zX2NvbG9yLT5ibHVlID4gc2FtcGxlX21heCkpKSkKKyAgICAgICAgICAgIHBuZ19zZXRfdFJOUyh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCB0cmFuc19hbHBoYSwgbnVtX3RyYW5zLAorICAgICAgICAgICAgICAgdHJhbnNfY29sb3IpOworICAgICAgfQorICAgfQorI2VuZGlmCisjaWZkZWYgUE5HX1dSSVRFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAorICAgeworICAgICAgcG5nX3Vua25vd25fY2h1bmtwIHVua25vd25zOworICAgICAgaW50IG51bV91bmtub3ducyA9IHBuZ19nZXRfdW5rbm93bl9jaHVua3MocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsCisgICAgICAgICAmdW5rbm93bnMpOworCisgICAgICBpZiAobnVtX3Vua25vd25zICE9IDApCisgICAgICB7CisgICAgICAgICBwbmdfc2V0X3Vua25vd25fY2h1bmtzKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIHVua25vd25zLAorICAgICAgICAgICBudW1fdW5rbm93bnMpOworI2lmIFBOR19MSUJQTkdfVkVSIDwgMTA2MDAKKyAgICAgICAgIC8qIENvcHkgdGhlIGxvY2F0aW9ucyBmcm9tIHRoZSByZWFkX2luZm9fcHRyLiAgVGhlIGF1dG9tYXRpY2FsbHkKKyAgICAgICAgICAqIGdlbmVyYXRlZCBsb2NhdGlvbnMgaW4gd3JpdGVfZW5kX2luZm9fcHRyIGFyZSB3cm9uZyBwcmlvciB0byAxLjYuMAorICAgICAgICAgICogYmVjYXVzZSB0aGV5IGFyZSByZXNldCBmcm9tIHRoZSB3cml0ZSBwb2ludGVyIChyZW1vdmVkIGluIDEuNi4wKS4KKyAgICAgICAgICAqLworICAgICAgICAgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3Vua25vd25zOyBpKyspCisgICAgICAgICAgICAgIHBuZ19zZXRfdW5rbm93bl9jaHVua19sb2NhdGlvbih3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCBpLAorICAgICAgICAgICAgICAgIHVua25vd25zW2ldLmxvY2F0aW9uKTsKKyAgICAgICAgIH0KKyNlbmRpZgorICAgICAgfQorICAgfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECisgICBwbmd0ZXN0X2RlYnVnKCJXcml0aW5nIGluZm8gc3RydWN0Iik7CisKKyAgIC8qIFdyaXRlIHRoZSBpbmZvIGluIHR3byBzdGVwcyBzbyB0aGF0IGlmIHdlIHdyaXRlIHRoZSAndW5rbm93bicgY2h1bmtzIGhlcmUKKyAgICAqIHRoZXkgZ28gdG8gdGhlIGNvcnJlY3QgcGxhY2UuCisgICAgKi8KKyAgIHBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIpOworCisgICB3cml0ZV9jaHVua3Mod3JpdGVfcHRyLCBiZWZvcmVfUExURSk7IC8qIGJlZm9yZSBQTFRFICovCisKKyAgIHBuZ193cml0ZV9pbmZvKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIpOworCisgICB3cml0ZV9jaHVua3Mod3JpdGVfcHRyLCBiZWZvcmVfSURBVCk7IC8qIGFmdGVyIFBMVEUgKi8KKyNlbmRpZgorCisjaWZkZWYgU0lOR0xFX1JPV0JVRl9BTExPQworICAgcG5ndGVzdF9kZWJ1ZygiQWxsb2NhdGluZyByb3cgYnVmZmVyLi4uIik7CisgICByb3dfYnVmID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHJlYWRfcHRyLAorICAgICAgcG5nX2dldF9yb3dieXRlcyhyZWFkX3B0ciwgcmVhZF9pbmZvX3B0cikpOworCisgICBwbmd0ZXN0X2RlYnVnMSgiXHQweCUwOGx4IiwgKHVuc2lnbmVkIGxvbmcpcm93X2J1Zik7CisjZW5kaWYgLyogU0lOR0xFX1JPV0JVRl9BTExPQyAqLworICAgcG5ndGVzdF9kZWJ1ZygiV3JpdGluZyByb3cgZGF0YSIpOworCisjaWYgZGVmaW5lZChQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQpICYmXAorICAgZGVmaW5lZChQTkdfV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVEKQorICAgLyogQm90aCBtdXN0IGJlIGRlZmluZWQgZm9yIGxpYnBuZyB0byBiZSBhYmxlIHRvIGhhbmRsZSB0aGUgaW50ZXJsYWNlLAorICAgICogb3RoZXJ3aXNlIGl0IGdldHMgaGFuZGxlZCBiZWxvdyBieSBzaW1wbHkgcmVhZGluZyBhbmQgd3JpdGluZyB0aGUgcGFzc2VzCisgICAgKiBkaXJlY3RseS4KKyAgICAqLworICAgaWYgKHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHJlYWRfcHRyKSAhPSBudW1fcGFzc2VzKQorICAgICAgcG5nX2Vycm9yKHdyaXRlX3B0ciwKKyAgICAgICAgICAgICJwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyhyZWFkKTogd3JvbmcgcGFzcyBjb3VudCAiKTsKKyAgIGlmIChwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyh3cml0ZV9wdHIpICE9IG51bV9wYXNzZXMpCisgICAgICBwbmdfZXJyb3Iod3JpdGVfcHRyLAorICAgICAgICAgICAgInBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHdyaXRlKTogd3JvbmcgcGFzcyBjb3VudCAiKTsKKyNlbHNlIC8qIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nIG5vdCBjYWxsZWQgb24gZWl0aGVyIHJlYWQgb3Igd3JpdGUgKi8KKyMgIGRlZmluZSBjYWxjX3Bhc3NfaGVpZ2h0CisjZW5kaWYgLyogbm90IHVzaW5nIGxpYnBuZyBpbnRlcmxhY2UgaGFuZGxpbmcgKi8KKworI2lmZGVmIFBOR1RFU1RfVElNSU5HCisgICB0X3N0b3AgPSAoZmxvYXQpY2xvY2soKTsKKyAgIHRfbWlzYyArPSAodF9zdG9wIC0gdF9zdGFydCk7CisgICB0X3N0YXJ0ID0gdF9zdG9wOworI2VuZGlmCisgICBmb3IgKHBhc3MgPSAwOyBwYXNzIDwgbnVtX3Bhc3NlczsgcGFzcysrKQorICAgeworIyAgICAgaWZkZWYgY2FsY19wYXNzX2hlaWdodAorICAgICAgICAgcG5nX3VpbnRfMzIgcGFzc19oZWlnaHQ7CisKKyAgICAgICAgIGlmIChudW1fcGFzc2VzID09IDcpIC8qIGludGVybGFjZWQgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChQTkdfUEFTU19DT0xTKHdpZHRoLCBwYXNzKSA+IDApCisgICAgICAgICAgICAgICBwYXNzX2hlaWdodCA9IFBOR19QQVNTX1JPV1MoaGVpZ2h0LCBwYXNzKTsKKworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgcGFzc19oZWlnaHQgPSAwOworICAgICAgICAgfQorCisgICAgICAgICBlbHNlIC8qIG5vdCBpbnRlcmxhY2VkICovCisgICAgICAgICAgICBwYXNzX2hlaWdodCA9IGhlaWdodDsKKyMgICAgIGVsc2UKKyMgICAgICAgIGRlZmluZSBwYXNzX2hlaWdodCBoZWlnaHQKKyMgICAgIGVuZGlmCisKKyAgICAgIHBuZ3Rlc3RfZGVidWcxKCJXcml0aW5nIHJvdyBkYXRhIGZvciBwYXNzICVkIiwgcGFzcyk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgcGFzc19oZWlnaHQ7IHkrKykKKyAgICAgIHsKKyNpZm5kZWYgU0lOR0xFX1JPV0JVRl9BTExPQworICAgICAgICAgcG5ndGVzdF9kZWJ1ZzIoIkFsbG9jYXRpbmcgcm93IGJ1ZmZlciAocGFzcyAlZCwgeSA9ICV1KS4uLiIsIHBhc3MsIHkpOworCisgICAgICAgICByb3dfYnVmID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHJlYWRfcHRyLAorICAgICAgICAgICAgcG5nX2dldF9yb3dieXRlcyhyZWFkX3B0ciwgcmVhZF9pbmZvX3B0cikpOworCisgICAgICAgICBwbmd0ZXN0X2RlYnVnMigiXHQweCUwOGx4ICglbHUgYnl0ZXMpIiwgKHVuc2lnbmVkIGxvbmcpcm93X2J1ZiwKKyAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXBuZ19nZXRfcm93Ynl0ZXMocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIpKTsKKworI2VuZGlmIC8qICFTSU5HTEVfUk9XQlVGX0FMTE9DICovCisgICAgICAgICBwbmdfcmVhZF9yb3dzKHJlYWRfcHRyLCAocG5nX2J5dGVwcCkmcm93X2J1ZiwgTlVMTCwgMSk7CisKKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECisjaWZkZWYgUE5HVEVTVF9USU1JTkcKKyAgICAgICAgIHRfc3RvcCA9IChmbG9hdCljbG9jaygpOworICAgICAgICAgdF9kZWNvZGUgKz0gKHRfc3RvcCAtIHRfc3RhcnQpOworICAgICAgICAgdF9zdGFydCA9IHRfc3RvcDsKKyNlbmRpZgorICAgICAgICAgcG5nX3dyaXRlX3Jvd3Mod3JpdGVfcHRyLCAocG5nX2J5dGVwcCkmcm93X2J1ZiwgMSk7CisjaWZkZWYgUE5HVEVTVF9USU1JTkcKKyAgICAgICAgIHRfc3RvcCA9IChmbG9hdCljbG9jaygpOworICAgICAgICAgdF9lbmNvZGUgKz0gKHRfc3RvcCAtIHRfc3RhcnQpOworICAgICAgICAgdF9zdGFydCA9IHRfc3RvcDsKKyNlbmRpZgorI2VuZGlmIC8qIFdSSVRFICovCisKKyNpZm5kZWYgU0lOR0xFX1JPV0JVRl9BTExPQworICAgICAgICAgcG5ndGVzdF9kZWJ1ZzIoIkZyZWVpbmcgcm93IGJ1ZmZlciAocGFzcyAlZCwgeSA9ICV1KSIsIHBhc3MsIHkpOworICAgICAgICAgcG5nX2ZyZWUocmVhZF9wdHIsIHJvd19idWYpOworICAgICAgICAgcm93X2J1ZiA9IE5VTEw7CisjZW5kaWYgLyogIVNJTkdMRV9ST1dCVUZfQUxMT0MgKi8KKyAgICAgIH0KKyAgIH0KKworI2lmZGVmIFBOR19TVE9SRV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKKyMgIGlmZGVmIFBOR19SRUFEX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAorICAgICAgcG5nX2ZyZWVfZGF0YShyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwgUE5HX0ZSRUVfVU5LTiwgLTEpOworIyAgZW5kaWYKKyMgIGlmZGVmIFBOR19XUklURV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKKyAgICAgIHBuZ19mcmVlX2RhdGEod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwgUE5HX0ZSRUVfVU5LTiwgLTEpOworIyAgZW5kaWYKKyNlbmRpZgorCisgICBwbmd0ZXN0X2RlYnVnKCJSZWFkaW5nIGFuZCB3cml0aW5nIGVuZF9pbmZvIGRhdGEiKTsKKworICAgcG5nX3JlYWRfZW5kKHJlYWRfcHRyLCBlbmRfaW5mb19wdHIpOworI2lmZGVmIFBOR19URVhUX1NVUFBPUlRFRAorICAgeworICAgICAgcG5nX3RleHRwIHRleHRfcHRyOworICAgICAgaW50IG51bV90ZXh0OworCisgICAgICBpZiAocG5nX2dldF90ZXh0KHJlYWRfcHRyLCBlbmRfaW5mb19wdHIsICZ0ZXh0X3B0ciwgJm51bV90ZXh0KSA+IDApCisgICAgICB7CisgICAgICAgICBwbmd0ZXN0X2RlYnVnMSgiSGFuZGxpbmcgJWQgaVRYdC90RVh0L3pUWHQgY2h1bmtzIiwgbnVtX3RleHQpOworCisgICAgICAgICBwbmd0ZXN0X2NoZWNrX3RleHRfc3VwcG9ydChyZWFkX3B0ciwgdGV4dF9wdHIsIG51bV90ZXh0KTsKKworICAgICAgICAgaWYgKHZlcmJvc2UgIT0gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICAgICBmb3IgKGk9MDsgaTxudW1fdGV4dDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcHJpbnRmKCIgICBUZXh0IGNvbXByZXNzaW9uWyVkXT0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGksIHRleHRfcHRyW2ldLmNvbXByZXNzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICAgcG5nX3NldF90ZXh0KHdyaXRlX3B0ciwgd3JpdGVfZW5kX2luZm9fcHRyLCB0ZXh0X3B0ciwgbnVtX3RleHQpOworICAgICAgfQorICAgfQorI2VuZGlmCisjaWZkZWYgUE5HX3RJTUVfU1VQUE9SVEVECisgICB7CisgICAgICBwbmdfdGltZXAgbW9kX3RpbWU7CisKKyAgICAgIGlmIChwbmdfZ2V0X3RJTUUocmVhZF9wdHIsIGVuZF9pbmZvX3B0ciwgJm1vZF90aW1lKSAhPSAwKQorICAgICAgeworICAgICAgICAgcG5nX3NldF90SU1FKHdyaXRlX3B0ciwgd3JpdGVfZW5kX2luZm9fcHRyLCBtb2RfdGltZSk7CisjaWZkZWYgUE5HX1RJTUVfUkZDMTEyM19TVVBQT1JURUQKKyAgICAgICAgIGlmIChwbmdfY29udmVydF90b19yZmMxMTIzX2J1ZmZlcih0SU1FX3N0cmluZywgbW9kX3RpbWUpICE9IDApCisgICAgICAgICAgICB0SU1FX3N0cmluZ1soc2l6ZW9mIHRJTUVfc3RyaW5nKSAtIDFdID0gJ1wwJzsKKworICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgc3RybmNweSh0SU1FX3N0cmluZywgIioqKiBpbnZhbGlkIHRpbWUgKioqIiwgc2l6ZW9mIHRJTUVfc3RyaW5nKTsKKyAgICAgICAgICAgIHRJTUVfc3RyaW5nWyhzaXplb2YgdElNRV9zdHJpbmcpLTFdID0gJ1wwJzsKKyAgICAgICAgIH0KKworICAgICAgICAgdElNRV9jaHVua19wcmVzZW50Kys7CisjZW5kaWYgLyogVElNRV9SRkMxMTIzICovCisgICAgICB9CisgICB9CisjZW5kaWYKKyNpZmRlZiBQTkdfV1JJVEVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECisgICB7CisgICAgICBwbmdfdW5rbm93bl9jaHVua3AgdW5rbm93bnM7CisgICAgICBpbnQgbnVtX3Vua25vd25zID0gcG5nX2dldF91bmtub3duX2NodW5rcyhyZWFkX3B0ciwgZW5kX2luZm9fcHRyLAorICAgICAgICAgJnVua25vd25zKTsKKworICAgICAgaWYgKG51bV91bmtub3ducyAhPSAwKQorICAgICAgeworICAgICAgICAgcG5nX3NldF91bmtub3duX2NodW5rcyh3cml0ZV9wdHIsIHdyaXRlX2VuZF9pbmZvX3B0ciwgdW5rbm93bnMsCisgICAgICAgICAgIG51bV91bmtub3ducyk7CisjaWYgUE5HX0xJQlBOR19WRVIgPCAxMDYwMAorICAgICAgICAgLyogQ29weSB0aGUgbG9jYXRpb25zIGZyb20gdGhlIHJlYWRfaW5mb19wdHIuICBUaGUgYXV0b21hdGljYWxseQorICAgICAgICAgICogZ2VuZXJhdGVkIGxvY2F0aW9ucyBpbiB3cml0ZV9lbmRfaW5mb19wdHIgYXJlIHdyb25nIHByaW9yIHRvIDEuNi4wCisgICAgICAgICAgKiBiZWNhdXNlIHRoZXkgYXJlIHJlc2V0IGZyb20gdGhlIHdyaXRlIHBvaW50ZXIgKHJlbW92ZWQgaW4gMS42LjApLgorICAgICAgICAgICovCisgICAgICAgICB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fdW5rbm93bnM7IGkrKykKKyAgICAgICAgICAgICAgcG5nX3NldF91bmtub3duX2NodW5rX2xvY2F0aW9uKHdyaXRlX3B0ciwgd3JpdGVfZW5kX2luZm9fcHRyLCBpLAorICAgICAgICAgICAgICAgIHVua25vd25zW2ldLmxvY2F0aW9uKTsKKyAgICAgICAgIH0KKyNlbmRpZgorICAgICAgfQorICAgfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECisjaWZkZWYgUE5HX1dSSVRFX0NVU1RPTUlaRV9aVFhUX0NPTVBSRVNTSU9OX1NVUFBPUlRFRAorICAgLyogTm9ybWFsbHkgb25lIHdvdWxkIHVzZSBaX0RFRkFVTFRfU1RSQVRFR1kgZm9yIHRleHQgY29tcHJlc3Npb24uCisgICAgKiBUaGlzIGlzIGhlcmUganVzdCB0byBtYWtlIHBuZ3Rlc3QgcmVwbGljYXRlIHRoZSByZXN1bHRzIGZyb20gbGlicG5nCisgICAgKiB2ZXJzaW9ucyBwcmlvciB0byAxLjUuNCwgYW5kIHRvIHRlc3QgdGhpcyBuZXcgQVBJLgorICAgICovCisgICBwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fc3RyYXRlZ3kod3JpdGVfcHRyLCBaX0ZJTFRFUkVEKTsKKyNlbmRpZgorCisgICAvKiBXaGVuIHRoZSB1bmtub3duIHZwQWcvc1RFUiBjaHVua3MgYXJlIHdyaXR0ZW4gYnkgcG5ndGVzdCB0aGUgb25seSB3YXkgdG8KKyAgICAqIGRvIGl0IGlzIHRvIHdyaXRlIHRoZW0gKmJlZm9yZSogY2FsbGluZyBwbmdfd3JpdGVfZW5kLiAgV2hlbiB1bmtub3duCisgICAgKiBjaHVua3MgYXJlIHdyaXR0ZW4gYnkgbGlicG5nLCBob3dldmVyLCB0aGV5IGFyZSB3cml0dGVuIGp1c3QgYmVmb3JlIElFTkQuCisgICAgKiBUaGVyZSBzZWVtcyB0byBiZSBubyB3YXkgcm91bmQgdGhpcywgaG93ZXZlciB2cEFnL3NURVIgYXJlIG5vdCBleHBlY3RlZAorICAgICogYWZ0ZXIgSURBVC4KKyAgICAqLworICAgd3JpdGVfY2h1bmtzKHdyaXRlX3B0ciwgYWZ0ZXJfSURBVCk7CisKKyAgIHBuZ193cml0ZV9lbmQod3JpdGVfcHRyLCB3cml0ZV9lbmRfaW5mb19wdHIpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfRUFTWV9BQ0NFU1NfU1VQUE9SVEVECisgICBpZiAodmVyYm9zZSAhPSAwKQorICAgeworICAgICAgcG5nX3VpbnRfMzIgaXdpZHRoLCBpaGVpZ2h0OworICAgICAgaXdpZHRoID0gcG5nX2dldF9pbWFnZV93aWR0aCh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyKTsKKyAgICAgIGloZWlnaHQgPSBwbmdfZ2V0X2ltYWdlX2hlaWdodCh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyKTsKKyAgICAgIGZwcmludGYoU1RERVJSLCAiXG4gSW1hZ2Ugd2lkdGggPSAlbHUsIGhlaWdodCA9ICVsdVxuIiwKKyAgICAgICAgICh1bnNpZ25lZCBsb25nKWl3aWR0aCwgKHVuc2lnbmVkIGxvbmcpaWhlaWdodCk7CisgICB9CisjZW5kaWYKKworICAgcG5ndGVzdF9kZWJ1ZygiRGVzdHJveWluZyBkYXRhIHN0cnVjdHMiKTsKKyNpZmRlZiBTSU5HTEVfUk9XQlVGX0FMTE9DCisgICBwbmd0ZXN0X2RlYnVnKCJkZXN0cm95aW5nIHJvd19idWYgZm9yIHJlYWRfcHRyIik7CisgICBwbmdfZnJlZShyZWFkX3B0ciwgcm93X2J1Zik7CisgICByb3dfYnVmID0gTlVMTDsKKyNlbmRpZiAvKiBTSU5HTEVfUk9XQlVGX0FMTE9DICovCisgICBwbmd0ZXN0X2RlYnVnKCJkZXN0cm95aW5nIHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCBlbmRfaW5mb19wdHIiKTsKKyAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZyZWFkX3B0ciwgJnJlYWRfaW5mb19wdHIsICZlbmRfaW5mb19wdHIpOworI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKKyAgIHBuZ3Rlc3RfZGVidWcoImRlc3Ryb3lpbmcgd3JpdGVfZW5kX2luZm9fcHRyIik7CisgICBwbmdfZGVzdHJveV9pbmZvX3N0cnVjdCh3cml0ZV9wdHIsICZ3cml0ZV9lbmRfaW5mb19wdHIpOworICAgcG5ndGVzdF9kZWJ1ZygiZGVzdHJveWluZyB3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyIik7CisgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJndyaXRlX3B0ciwgJndyaXRlX2luZm9fcHRyKTsKKyNlbmRpZgorICAgcG5ndGVzdF9kZWJ1ZygiRGVzdHJ1Y3Rpb24gY29tcGxldGUuIik7CisKKyAgIEZDTE9TRShmcGluKTsKKyAgIEZDTE9TRShmcG91dCk7CisKKyAgIC8qIFN1bW1hcml6ZSBhbnkgd2FybmluZ3Mgb3IgZXJyb3JzIGFuZCBpbiAnc3RyaWN0JyBtb2RlIGZhaWwgdGhlIHRlc3QuCisgICAgKiBVbnN1cHBvcnRlZCBjaHVua3MgY2FuIHJlc3VsdCBpbiB3YXJuaW5ncywgaW4gdGhhdCBjYXNlIGlnbm9yZSB0aGUgc3RyaWN0CisgICAgKiBzZXR0aW5nLCBvdGhlcndpc2UgZmFpbCB0aGUgdGVzdCBvbiB3YXJuaW5ncyBhcyB3ZWxsIGFzIGVycm9ycy4KKyAgICAqLworICAgaWYgKGVycm9yX2NvdW50ID4gMCkKKyAgIHsKKyAgICAgIC8qIFdlIGRvbid0IHJlYWxseSBleHBlY3QgdG8gZ2V0IGhlcmUgYmVjYXVzZSBvZiB0aGUgc2V0am1wIGhhbmRsaW5nCisgICAgICAgKiBhYm92ZSwgYnV0IHRoaXMgaXMgc2FmZS4KKyAgICAgICAqLworICAgICAgZnByaW50ZihTVERFUlIsICJcbiAgJXM6ICVkIGxpYnBuZyBlcnJvcnMgZm91bmQgKCVkIHdhcm5pbmdzKSIsCisgICAgICAgICBpbm5hbWUsIGVycm9yX2NvdW50LCB3YXJuaW5nX2NvdW50KTsKKworICAgICAgaWYgKHN0cmljdCAhPSAwKQorICAgICAgICAgcmV0dXJuICgxKTsKKyAgIH0KKworIyAgaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAorICAgICAgLyogSWYgdGhlcmUgaXMgbm8gd3JpdGUgc3VwcG9ydCBub3RoaW5nIHdhcyB3cml0dGVuISAqLworICAgICAgZWxzZSBpZiAodW5zdXBwb3J0ZWRfY2h1bmtzID4gMCkKKyAgICAgIHsKKyAgICAgICAgIGZwcmludGYoU1RERVJSLCAiXG4gICVzOiB1bnN1cHBvcnRlZCBjaHVua3MgKCVkKSVzIiwKKyAgICAgICAgICAgIGlubmFtZSwgdW5zdXBwb3J0ZWRfY2h1bmtzLCBzdHJpY3QgPyAiOiBJR05PUkVEIC0tc3RyaWN0ISIgOiAiIik7CisgICAgICB9CisjICBlbmRpZgorCisgICBlbHNlIGlmICh3YXJuaW5nX2NvdW50ID4gMCkKKyAgIHsKKyAgICAgIGZwcmludGYoU1RERVJSLCAiXG4gICVzOiAlZCBsaWJwbmcgd2FybmluZ3MgZm91bmQiLAorICAgICAgICAgaW5uYW1lLCB3YXJuaW5nX2NvdW50KTsKKworICAgICAgaWYgKHN0cmljdCAhPSAwKQorICAgICAgICAgcmV0dXJuICgxKTsKKyAgIH0KKworICAgcG5ndGVzdF9kZWJ1ZygiT3BlbmluZyBmaWxlcyBmb3IgY29tcGFyaXNvbiIpOworICAgaWYgKChmcGluID0gZm9wZW4oaW5uYW1lLCAicmIiKSkgPT0gTlVMTCkKKyAgIHsKKyAgICAgIGZwcmludGYoU1RERVJSLCAiQ291bGQgbm90IGZpbmQgZmlsZSAlc1xuIiwgaW5uYW1lKTsKKyAgICAgIHJldHVybiAoMSk7CisgICB9CisKKyAgIGlmICgoZnBvdXQgPSBmb3BlbihvdXRuYW1lLCAicmIiKSkgPT0gTlVMTCkKKyAgIHsKKyAgICAgIGZwcmludGYoU1RERVJSLCAiQ291bGQgbm90IGZpbmQgZmlsZSAlc1xuIiwgb3V0bmFtZSk7CisgICAgICBGQ0xPU0UoZnBpbik7CisgICAgICByZXR1cm4gKDEpOworICAgfQorCisjaWYgZGVmaW5lZCAoUE5HX1dSSVRFX1NVUFBPUlRFRCkgLyogZWxzZSBub3RoaW5nIHdhcyB3cml0dGVuICovICYmXAorICAgIGRlZmluZWQgKFBOR19XUklURV9GSUxURVJfU1VQUE9SVEVEKQorICAgaWYgKGludGVybGFjZV9wcmVzZXJ2ZWQgIT0gMCkgLyogZWxzZSB0aGUgZmlsZXMgd2lsbCBiZSBjaGFuZ2VkICovCisgICB7CisgICAgICBmb3IgKDs7KQorICAgICAgeworICAgICAgICAgc3RhdGljIGludCB3cm90ZV9xdWVzdGlvbiA9IDA7CisgICAgICAgICBwbmdfc2l6ZV90IG51bV9pbiwgbnVtX291dDsKKyAgICAgICAgIGNoYXIgaW5idWZbMjU2XSwgb3V0YnVmWzI1Nl07CisKKyAgICAgICAgIG51bV9pbiA9IGZyZWFkKGluYnVmLCAxLCBzaXplb2YgaW5idWYsIGZwaW4pOworICAgICAgICAgbnVtX291dCA9IGZyZWFkKG91dGJ1ZiwgMSwgc2l6ZW9mIG91dGJ1ZiwgZnBvdXQpOworCisgICAgICAgICBpZiAobnVtX2luICE9IG51bV9vdXQpCisgICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIlxuRmlsZXMgJXMgYW5kICVzIGFyZSBvZiBhIGRpZmZlcmVudCBzaXplXG4iLAorICAgICAgICAgICAgICAgICAgICBpbm5hbWUsIG91dG5hbWUpOworCisgICAgICAgICAgICBpZiAod3JvdGVfcXVlc3Rpb24gPT0gMCAmJiB1bnN1cHBvcnRlZF9jaHVua3MgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGZwcmludGYoU1RERVJSLAorICAgICAgICAgIiAgIFdhcyAlcyB3cml0dGVuIHdpdGggdGhlIHNhbWUgbWF4aW11bSBJREFUIGNodW5rIHNpemUgKCVkIGJ5dGVzKSwiLAorICAgICAgICAgICAgICAgICBpbm5hbWUsIFBOR19aQlVGX1NJWkUpOworICAgICAgICAgICAgICAgZnByaW50ZihTVERFUlIsCisgICAgICAgICAgICAgICAgICJcbiAgIGZpbHRlcmluZyBoZXVyaXN0aWMgKGxpYnBuZyBkZWZhdWx0KSwgY29tcHJlc3Npb24iKTsKKyAgICAgICAgICAgICAgIGZwcmludGYoU1RERVJSLAorICAgICAgICAgICAgICAgICAiIGxldmVsICh6bGliIGRlZmF1bHQpLFxuICAgYW5kIHpsaWIgdmVyc2lvbiAoJXMpP1xuXG4iLAorICAgICAgICAgICAgICAgICBaTElCX1ZFUlNJT04pOworICAgICAgICAgICAgICAgd3JvdGVfcXVlc3Rpb24gPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGQ0xPU0UoZnBpbik7CisgICAgICAgICAgICBGQ0xPU0UoZnBvdXQpOworCisgICAgICAgICAgICBpZiAoc3RyaWN0ICE9IDAgJiYgdW5zdXBwb3J0ZWRfY2h1bmtzID09IDApCisgICAgICAgICAgICAgIHJldHVybiAoMSk7CisKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYgKG51bV9pbiA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGlmIChtZW1jbXAoaW5idWYsIG91dGJ1ZiwgbnVtX2luKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoU1RERVJSLCAiXG5GaWxlcyAlcyBhbmQgJXMgYXJlIGRpZmZlcmVudFxuIiwgaW5uYW1lLAorICAgICAgICAgICAgICAgb3V0bmFtZSk7CisKKyAgICAgICAgICAgIGlmICh3cm90ZV9xdWVzdGlvbiA9PSAwICYmIHVuc3VwcG9ydGVkX2NodW5rcyA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZnByaW50ZihTVERFUlIsCisgICAgICAgICAiICAgV2FzICVzIHdyaXR0ZW4gd2l0aCB0aGUgc2FtZSBtYXhpbXVtIElEQVQgY2h1bmsgc2l6ZSAoJWQgYnl0ZXMpLCIsCisgICAgICAgICAgICAgICAgICAgIGlubmFtZSwgUE5HX1pCVUZfU0laRSk7CisgICAgICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwKKyAgICAgICAgICAgICAgICAgIlxuICAgZmlsdGVyaW5nIGhldXJpc3RpYyAobGlicG5nIGRlZmF1bHQpLCBjb21wcmVzc2lvbiIpOworICAgICAgICAgICAgICAgZnByaW50ZihTVERFUlIsCisgICAgICAgICAgICAgICAgICIgbGV2ZWwgKHpsaWIgZGVmYXVsdCksXG4gICBhbmQgemxpYiB2ZXJzaW9uICglcyk/XG5cbiIsCisgICAgICAgICAgICAgICAgIFpMSUJfVkVSU0lPTik7CisgICAgICAgICAgICAgICB3cm90ZV9xdWVzdGlvbiA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEZDTE9TRShmcGluKTsKKyAgICAgICAgICAgIEZDTE9TRShmcG91dCk7CisKKyAgICAgICAgICAgIC8qIE5PVEU6IHRoZSB1bnN1cHBvcnRlZF9jaHVua3MgZXNjYXBlIGlzIHBlcm1pdHRlZCBoZXJlIGJlY2F1c2UKKyAgICAgICAgICAgICAqIHVuc3VwcG9ydGVkIHRleHQgY2h1bmsgY29tcHJlc3Npb24gd2lsbCByZXN1bHQgaW4gdGhlIGNvbXByZXNzaW9uCisgICAgICAgICAgICAgKiBtb2RlIGJlaW5nIGNoYW5nZWQgKHRvIE5PTkUpIHlldCwgaW4gdGhlIHRlc3QgY2FzZSwgdGhlIHJlc3VsdAorICAgICAgICAgICAgICogY2FuIGJlIGV4YWN0bHkgdGhlIHNhbWUgc2l6ZSEKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHN0cmljdCAhPSAwICYmIHVuc3VwcG9ydGVkX2NodW5rcyA9PSAwKQorICAgICAgICAgICAgICByZXR1cm4gKDEpOworCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisjZW5kaWYgLyogV1JJVEUgJiYgV1JJVEVfRklMVEVSICovCisKKyAgIEZDTE9TRShmcGluKTsKKyAgIEZDTE9TRShmcG91dCk7CisKKyAgIHJldHVybiAoMCk7Cit9CisKKy8qIElucHV0IGFuZCBvdXRwdXQgZmlsZW5hbWVzICovCisjaWZkZWYgUklTQ09TCitzdGF0aWMgUE5HX0NPTlNUIGNoYXIgKmlubmFtZSA9ICJwbmd0ZXN0L3BuZyI7CitzdGF0aWMgUE5HX0NPTlNUIGNoYXIgKm91dG5hbWUgPSAicG5nb3V0L3BuZyI7CisjZWxzZQorc3RhdGljIFBOR19DT05TVCBjaGFyICppbm5hbWUgPSAicG5ndGVzdC5wbmciOworc3RhdGljIFBOR19DT05TVCBjaGFyICpvdXRuYW1lID0gInBuZ291dC5wbmciOworI2VuZGlmCisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgaW50IG11bHRpcGxlID0gMDsKKyAgIGludCBpZXJyb3IgPSAwOworCisgICBwbmdfc3RydWN0cCBkdW1teV9wdHI7CisKKyAgIGZwcmludGYoU1RERVJSLCAiXG4gVGVzdGluZyBsaWJwbmcgdmVyc2lvbiAlc1xuIiwgUE5HX0xJQlBOR19WRVJfU1RSSU5HKTsKKyAgIGZwcmludGYoU1RERVJSLCAiICAgd2l0aCB6bGliICAgdmVyc2lvbiAlc1xuIiwgWkxJQl9WRVJTSU9OKTsKKyAgIGZwcmludGYoU1RERVJSLCAiJXMiLCBwbmdfZ2V0X2NvcHlyaWdodChOVUxMKSk7CisgICAvKiBTaG93IHRoZSB2ZXJzaW9uIG9mIGxpYnBuZyB1c2VkIGluIGJ1aWxkaW5nIHRoZSBsaWJyYXJ5ICovCisgICBmcHJpbnRmKFNUREVSUiwgIiBsaWJyYXJ5ICglbHUpOiVzIiwKKyAgICAgICh1bnNpZ25lZCBsb25nKXBuZ19hY2Nlc3NfdmVyc2lvbl9udW1iZXIoKSwKKyAgICAgIHBuZ19nZXRfaGVhZGVyX3ZlcnNpb24oTlVMTCkpOworCisgICAvKiBTaG93IHRoZSB2ZXJzaW9uIG9mIGxpYnBuZyB1c2VkIGluIGJ1aWxkaW5nIHRoZSBhcHBsaWNhdGlvbiAqLworICAgZnByaW50ZihTVERFUlIsICIgcG5ndGVzdCAoJWx1KTolcyIsICh1bnNpZ25lZCBsb25nKVBOR19MSUJQTkdfVkVSLAorICAgICAgUE5HX0hFQURFUl9WRVJTSU9OX1NUUklORyk7CisKKyAgIC8qIERvIHNvbWUgY29uc2lzdGVuY3kgY2hlY2tpbmcgb24gdGhlIG1lbW9yeSBhbGxvY2F0aW9uIHNldHRpbmdzLCBJJ20KKyAgICAqIG5vdCBzdXJlIHRoaXMgbWF0dGVycywgYnV0IGl0IGlzIG5pY2UgdG8ga25vdywgdGhlIGZpcnN0IG9mIHRoZXNlCisgICAgKiB0ZXN0cyBzaG91bGQgYmUgaW1wb3NzaWJsZSBiZWNhdXNlIG9mIHRoZSB3YXkgdGhlIG1hY3JvcyBhcmUgc2V0CisgICAgKiBpbiBwbmdjb25mLmgKKyAgICAqLworI2lmIGRlZmluZWQoTUFYU0VHXzY0SykgJiYgIWRlZmluZWQoUE5HX01BWF9NQUxMT0NfNjRLKQorICAgICAgZnByaW50ZihTVERFUlIsICIgTk9URTogWmxpYiBjb21waWxlZCBmb3IgbWF4IDY0aywgbGlicG5nIG5vdFxuIik7CisjZW5kaWYKKyAgIC8qIEkgdGhpbmsgdGhlIGZvbGxvd2luZyBjYW4gaGFwcGVuLiAqLworI2lmICFkZWZpbmVkKE1BWFNFR182NEspICYmIGRlZmluZWQoUE5HX01BWF9NQUxMT0NfNjRLKQorICAgICAgZnByaW50ZihTVERFUlIsICIgTk9URTogbGlicG5nIGNvbXBpbGVkIGZvciBtYXggNjRrLCB6bGliIG5vdFxuIik7CisjZW5kaWYKKworICAgaWYgKHN0cmNtcChwbmdfbGlicG5nX3ZlciwgUE5HX0xJQlBOR19WRVJfU1RSSU5HKSkKKyAgIHsKKyAgICAgIGZwcmludGYoU1RERVJSLAorICAgICAgICAgIldhcm5pbmc6IHZlcnNpb25zIGFyZSBkaWZmZXJlbnQgYmV0d2VlbiBwbmcuaCBhbmQgcG5nLmNcbiIpOworICAgICAgZnByaW50ZihTVERFUlIsICIgIHBuZy5oIHZlcnNpb246ICVzXG4iLCBQTkdfTElCUE5HX1ZFUl9TVFJJTkcpOworICAgICAgZnByaW50ZihTVERFUlIsICIgIHBuZy5jIHZlcnNpb246ICVzXG5cbiIsIHBuZ19saWJwbmdfdmVyKTsKKyAgICAgICsraWVycm9yOworICAgfQorCisgICBpZiAoYXJnYyA+IDEpCisgICB7CisgICAgICBpZiAoc3RyY21wKGFyZ3ZbMV0sICItbSIpID09IDApCisgICAgICB7CisgICAgICAgICBtdWx0aXBsZSA9IDE7CisgICAgICAgICBzdGF0dXNfZG90c19yZXF1ZXN0ZWQgPSAwOworICAgICAgfQorCisgICAgICBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIi1tdiIpID09IDAgfHwKKyAgICAgICAgICAgICAgIHN0cmNtcChhcmd2WzFdLCAiLXZtIikgPT0gMCApCisgICAgICB7CisgICAgICAgICBtdWx0aXBsZSA9IDE7CisgICAgICAgICB2ZXJib3NlID0gMTsKKyAgICAgICAgIHN0YXR1c19kb3RzX3JlcXVlc3RlZCA9IDE7CisgICAgICB9CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiLXYiKSA9PSAwKQorICAgICAgeworICAgICAgICAgdmVyYm9zZSA9IDE7CisgICAgICAgICBzdGF0dXNfZG90c19yZXF1ZXN0ZWQgPSAxOworICAgICAgICAgaW5uYW1lID0gYXJndlsyXTsKKyAgICAgIH0KKworICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICItLXN0cmljdCIpID09IDApCisgICAgICB7CisgICAgICAgICBzdGF0dXNfZG90c19yZXF1ZXN0ZWQgPSAwOworICAgICAgICAgdmVyYm9zZSA9IDE7CisgICAgICAgICBpbm5hbWUgPSBhcmd2WzJdOworICAgICAgICAgc3RyaWN0Kys7CisgICAgICAgICByZWxheGVkID0gMDsKKyAgICAgIH0KKworICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICItLXJlbGF4ZWQiKSA9PSAwKQorICAgICAgeworICAgICAgICAgc3RhdHVzX2RvdHNfcmVxdWVzdGVkID0gMDsKKyAgICAgICAgIHZlcmJvc2UgPSAxOworICAgICAgICAgaW5uYW1lID0gYXJndlsyXTsKKyAgICAgICAgIHN0cmljdCA9IDA7CisgICAgICAgICByZWxheGVkKys7CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGlubmFtZSA9IGFyZ3ZbMV07CisgICAgICAgICBzdGF0dXNfZG90c19yZXF1ZXN0ZWQgPSAwOworICAgICAgfQorICAgfQorCisgICBpZiAobXVsdGlwbGUgPT0gMCAmJiBhcmdjID09IDMgKyB2ZXJib3NlKQorICAgICBvdXRuYW1lID0gYXJndlsyICsgdmVyYm9zZV07CisKKyAgIGlmICgobXVsdGlwbGUgPT0gMCAmJiBhcmdjID4gMyArIHZlcmJvc2UpIHx8CisgICAgICAgKG11bHRpcGxlICE9IDAgJiYgYXJnYyA8IDIpKQorICAgeworICAgICBmcHJpbnRmKFNUREVSUiwKKyAgICAgICAidXNhZ2U6ICVzIFtpbmZpbGUucG5nXSBbb3V0ZmlsZS5wbmddXG5cdCVzIC1tIHtpbmZpbGUucG5nfVxuIiwKKyAgICAgICAgYXJndlswXSwgYXJndlswXSk7CisgICAgIGZwcmludGYoU1RERVJSLAorICAgICAgICIgIHJlYWRzL3dyaXRlcyBvbmUgUE5HIGZpbGUgKHdpdGhvdXQgLW0pIG9yIG11bHRpcGxlIGZpbGVzICgtbSlcbiIpOworICAgICBmcHJpbnRmKFNUREVSUiwKKyAgICAgICAiICB3aXRoIC1tICVzIGlzIHVzZWQgYXMgYSB0ZW1wb3JhcnkgZmlsZVxuIiwgb3V0bmFtZSk7CisgICAgIGV4aXQoMSk7CisgICB9CisKKyAgIGlmIChtdWx0aXBsZSAhPSAwKQorICAgeworICAgICAgaW50IGk7CisjaWYgZGVmaW5lZChQTkdfVVNFUl9NRU1fU1VQUE9SVEVEKSAmJiBQTkdfREVCVUcKKyAgICAgIGludCBhbGxvY2F0aW9uX25vdyA9IGN1cnJlbnRfYWxsb2NhdGlvbjsKKyNlbmRpZgorICAgICAgZm9yIChpPTI7IGk8YXJnYzsgKytpKQorICAgICAgeworICAgICAgICAgaW50IGtlcnJvcjsKKyAgICAgICAgIGZwcmludGYoU1RERVJSLCAiXG4gVGVzdGluZyAlczoiLCBhcmd2W2ldKTsKKyNpZiBQTkdfREVCVUcgPiAwCisgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIlxuIik7CisjZW5kaWYKKyAgICAgICAgIGtlcnJvciA9IHRlc3Rfb25lX2ZpbGUoYXJndltpXSwgb3V0bmFtZSk7CisgICAgICAgICBpZiAoa2Vycm9yID09IDApCisgICAgICAgICB7CisjaWZkZWYgUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRAorICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICJcbiBQQVNTICglbHUgemVybyBzYW1wbGVzKVxuIiwKKyAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXplcm9fc2FtcGxlcyk7CisjZWxzZQorICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICIgUEFTU1xuIik7CisjZW5kaWYKKyNpZmRlZiBQTkdfVElNRV9SRkMxMTIzX1NVUFBPUlRFRAorICAgICAgICAgICAgaWYgKHRJTUVfY2h1bmtfcHJlc2VudCAhPSAwKQorICAgICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICIgdElNRSA9ICVzXG4iLCB0SU1FX3N0cmluZyk7CisKKyAgICAgICAgICAgIHRJTUVfY2h1bmtfcHJlc2VudCA9IDA7CisjZW5kaWYgLyogVElNRV9SRkMxMTIzICovCisgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoU1RERVJSLCAiIEZBSUxcbiIpOworICAgICAgICAgICAgaWVycm9yICs9IGtlcnJvcjsKKyAgICAgICAgIH0KKyNpZiBkZWZpbmVkKFBOR19VU0VSX01FTV9TVVBQT1JURUQpICYmIFBOR19ERUJVRworICAgICAgICAgaWYgKGFsbG9jYXRpb25fbm93ICE9IGN1cnJlbnRfYWxsb2NhdGlvbikKKyAgICAgICAgICAgIGZwcmludGYoU1RERVJSLCAiTUVNT1JZIEVSUk9SOiAlZCBieXRlcyBsb3N0XG4iLAorICAgICAgICAgICAgICAgY3VycmVudF9hbGxvY2F0aW9uIC0gYWxsb2NhdGlvbl9ub3cpOworCisgICAgICAgICBpZiAoY3VycmVudF9hbGxvY2F0aW9uICE9IDApCisgICAgICAgICB7CisgICAgICAgICAgICBtZW1vcnlfaW5mb3AgcGluZm8gPSBwaW5mb3JtYXRpb247CisKKyAgICAgICAgICAgIGZwcmludGYoU1RERVJSLCAiTUVNT1JZIEVSUk9SOiAlZCBieXRlcyBzdGlsbCBhbGxvY2F0ZWRcbiIsCisgICAgICAgICAgICAgICBjdXJyZW50X2FsbG9jYXRpb24pOworCisgICAgICAgICAgICB3aGlsZSAocGluZm8gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGZwcmludGYoU1RERVJSLCAiICVsdSBieXRlcyBhdCAlcFxuIiwKKyAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpcGluZm8tPnNpemUsCisgICAgICAgICAgICAgICAgIHBpbmZvLT5wb2ludGVyKTsKKyAgICAgICAgICAgICAgIHBpbmZvID0gcGluZm8tPm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisjZW5kaWYKKyAgICAgIH0KKyNpZiBkZWZpbmVkKFBOR19VU0VSX01FTV9TVVBQT1JURUQpICYmIFBOR19ERUJVRworICAgICAgICAgZnByaW50ZihTVERFUlIsICIgQ3VycmVudCBtZW1vcnkgYWxsb2NhdGlvbjogJTEwZCBieXRlc1xuIiwKKyAgICAgICAgICAgIGN1cnJlbnRfYWxsb2NhdGlvbik7CisgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIiBNYXhpbXVtIG1lbW9yeSBhbGxvY2F0aW9uOiAlMTBkIGJ5dGVzXG4iLAorICAgICAgICAgICAgbWF4aW11bV9hbGxvY2F0aW9uKTsKKyAgICAgICAgIGZwcmludGYoU1RERVJSLCAiIFRvdGFsICAgbWVtb3J5IGFsbG9jYXRpb246ICUxMGQgYnl0ZXNcbiIsCisgICAgICAgICAgICB0b3RhbF9hbGxvY2F0aW9uKTsKKyAgICAgICAgIGZwcmludGYoU1RERVJSLCAiICAgICBOdW1iZXIgb2YgYWxsb2NhdGlvbnM6ICUxMGRcbiIsCisgICAgICAgICAgICBudW1fYWxsb2NhdGlvbnMpOworI2VuZGlmCisgICB9CisKKyAgIGVsc2UKKyAgIHsKKyAgICAgIGludCBpOworICAgICAgZm9yIChpID0gMDsgaTwzOyArK2kpCisgICAgICB7CisgICAgICAgICBpbnQga2Vycm9yOworI2lmIGRlZmluZWQoUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCkgJiYgUE5HX0RFQlVHCisgICAgICAgICBpbnQgYWxsb2NhdGlvbl9ub3cgPSBjdXJyZW50X2FsbG9jYXRpb247CisjZW5kaWYKKyAgICAgICAgIGlmIChpID09IDEpCisgICAgICAgICAgICBzdGF0dXNfZG90c19yZXF1ZXN0ZWQgPSAxOworCisgICAgICAgICBlbHNlIGlmICh2ZXJib3NlID09IDApCisgICAgICAgICAgICBzdGF0dXNfZG90c19yZXF1ZXN0ZWQgPSAwOworCisgICAgICAgICBpZiAoaSA9PSAwIHx8IHZlcmJvc2UgPT0gMSB8fCBpZXJyb3IgIT0gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoU1RERVJSLCAiXG4gVGVzdGluZyAlczoiLCBpbm5hbWUpOworI2lmIFBOR19ERUJVRyA+IDAKKyAgICAgICAgICAgIGZwcmludGYoU1RERVJSLCAiXG4iKTsKKyNlbmRpZgorICAgICAgICAgfQorCisgICAgICAgICBrZXJyb3IgPSB0ZXN0X29uZV9maWxlKGlubmFtZSwgb3V0bmFtZSk7CisKKyAgICAgICAgIGlmIChrZXJyb3IgPT0gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2ZXJib3NlID09IDEgfHwgaSA9PSAyKQorICAgICAgICAgICAgeworI2lmZGVmIFBOR19XUklURV9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQKKyAgICAgICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIlxuIFBBU1MgKCVsdSB6ZXJvIHNhbXBsZXMpXG4iLAorICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXplcm9fc2FtcGxlcyk7CisjZWxzZQorICAgICAgICAgICAgICAgIGZwcmludGYoU1RERVJSLCAiIFBBU1NcbiIpOworI2VuZGlmCisjaWZkZWYgUE5HX1RJTUVfUkZDMTEyM19TVVBQT1JURUQKKyAgICAgICAgICAgICBpZiAodElNRV9jaHVua19wcmVzZW50ICE9IDApCisgICAgICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICIgdElNRSA9ICVzXG4iLCB0SU1FX3N0cmluZyk7CisjZW5kaWYgLyogVElNRV9SRkMxMTIzICovCisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2ZXJib3NlID09IDAgJiYgaSAhPSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICJcbiBUZXN0aW5nICVzOiIsIGlubmFtZSk7CisjaWYgUE5HX0RFQlVHID4gMAorICAgICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICJcbiIpOworI2VuZGlmCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZwcmludGYoU1RERVJSLCAiIEZBSUxcbiIpOworICAgICAgICAgICAgaWVycm9yICs9IGtlcnJvcjsKKyAgICAgICAgIH0KKyNpZiBkZWZpbmVkKFBOR19VU0VSX01FTV9TVVBQT1JURUQpICYmIFBOR19ERUJVRworICAgICAgICAgaWYgKGFsbG9jYXRpb25fbm93ICE9IGN1cnJlbnRfYWxsb2NhdGlvbikKKyAgICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIk1FTU9SWSBFUlJPUjogJWQgYnl0ZXMgbG9zdFxuIiwKKyAgICAgICAgICAgICAgIGN1cnJlbnRfYWxsb2NhdGlvbiAtIGFsbG9jYXRpb25fbm93KTsKKworICAgICAgICAgaWYgKGN1cnJlbnRfYWxsb2NhdGlvbiAhPSAwKQorICAgICAgICAgeworICAgICAgICAgICAgIG1lbW9yeV9pbmZvcCBwaW5mbyA9IHBpbmZvcm1hdGlvbjsKKworICAgICAgICAgICAgIGZwcmludGYoU1RERVJSLCAiTUVNT1JZIEVSUk9SOiAlZCBieXRlcyBzdGlsbCBhbGxvY2F0ZWRcbiIsCisgICAgICAgICAgICAgICAgY3VycmVudF9hbGxvY2F0aW9uKTsKKworICAgICAgICAgICAgIHdoaWxlIChwaW5mbyAhPSBOVUxMKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIiAlbHUgYnl0ZXMgYXQgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpcGluZm8tPnNpemUsIHBpbmZvLT5wb2ludGVyKTsKKyAgICAgICAgICAgICAgICBwaW5mbyA9IHBpbmZvLT5uZXh0OworICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICB9CisjaWYgZGVmaW5lZChQTkdfVVNFUl9NRU1fU1VQUE9SVEVEKSAmJiBQTkdfREVCVUcKKyAgICAgICBmcHJpbnRmKFNUREVSUiwgIiBDdXJyZW50IG1lbW9yeSBhbGxvY2F0aW9uOiAlMTBkIGJ5dGVzXG4iLAorICAgICAgICAgIGN1cnJlbnRfYWxsb2NhdGlvbik7CisgICAgICAgZnByaW50ZihTVERFUlIsICIgTWF4aW11bSBtZW1vcnkgYWxsb2NhdGlvbjogJTEwZCBieXRlc1xuIiwKKyAgICAgICAgICBtYXhpbXVtX2FsbG9jYXRpb24pOworICAgICAgIGZwcmludGYoU1RERVJSLCAiIFRvdGFsICAgbWVtb3J5IGFsbG9jYXRpb246ICUxMGQgYnl0ZXNcbiIsCisgICAgICAgICAgdG90YWxfYWxsb2NhdGlvbik7CisgICAgICAgZnByaW50ZihTVERFUlIsICIgICAgIE51bWJlciBvZiBhbGxvY2F0aW9uczogJTEwZFxuIiwKKyAgICAgICAgICAgIG51bV9hbGxvY2F0aW9ucyk7CisjZW5kaWYKKyAgIH0KKworI2lmZGVmIFBOR1RFU1RfVElNSU5HCisgICB0X3N0b3AgPSAoZmxvYXQpY2xvY2soKTsKKyAgIHRfbWlzYyArPSAodF9zdG9wIC0gdF9zdGFydCk7CisgICB0X3N0YXJ0ID0gdF9zdG9wOworICAgZnByaW50ZihTVERFUlIsICIgQ1BVIHRpbWUgdXNlZCA9ICUuM2Ygc2Vjb25kcyIsCisgICAgICAodF9taXNjK3RfZGVjb2RlK3RfZW5jb2RlKS8oZmxvYXQpQ0xPQ0tTX1BFUl9TRUMpOworICAgZnByaW50ZihTVERFUlIsICIgKGRlY29kaW5nICUuM2YsXG4iLAorICAgICAgdF9kZWNvZGUvKGZsb2F0KUNMT0NLU19QRVJfU0VDKTsKKyAgIGZwcmludGYoU1RERVJSLCAiICAgICAgICBlbmNvZGluZyAlLjNmICwiLAorICAgICAgdF9lbmNvZGUvKGZsb2F0KUNMT0NLU19QRVJfU0VDKTsKKyAgIGZwcmludGYoU1RERVJSLCAiIG90aGVyICUuM2Ygc2Vjb25kcylcblxuIiwKKyAgICAgIHRfbWlzYy8oZmxvYXQpQ0xPQ0tTX1BFUl9TRUMpOworI2VuZGlmCisKKyAgIGlmIChpZXJyb3IgPT0gMCkKKyAgICAgIGZwcmludGYoU1RERVJSLCAiIGxpYnBuZyBwYXNzZXMgdGVzdFxuIik7CisKKyAgIGVsc2UKKyAgICAgIGZwcmludGYoU1RERVJSLCAiIGxpYnBuZyBGQUlMUyB0ZXN0XG4iKTsKKworICAgZHVtbXlfcHRyID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgZnByaW50ZihTVERFUlIsICIgRGVmYXVsdCBsaW1pdHM6XG4iKTsKKyAgIGZwcmludGYoU1RERVJSLCAiICB3aWR0aF9tYXggID0gJWx1XG4iLAorICAgICAgKHVuc2lnbmVkIGxvbmcpIHBuZ19nZXRfdXNlcl93aWR0aF9tYXgoZHVtbXlfcHRyKSk7CisgICBmcHJpbnRmKFNUREVSUiwgIiAgaGVpZ2h0X21heCA9ICVsdVxuIiwKKyAgICAgICh1bnNpZ25lZCBsb25nKSBwbmdfZ2V0X3VzZXJfaGVpZ2h0X21heChkdW1teV9wdHIpKTsKKyAgIGlmIChwbmdfZ2V0X2NodW5rX2NhY2hlX21heChkdW1teV9wdHIpID09IDApCisgICAgICBmcHJpbnRmKFNUREVSUiwgIiAgY2FjaGVfbWF4ICA9IHVubGltaXRlZFxuIik7CisgICBlbHNlCisgICAgICBmcHJpbnRmKFNUREVSUiwgIiAgY2FjaGVfbWF4ICA9ICVsdVxuIiwKKyAgICAgICAgICh1bnNpZ25lZCBsb25nKSBwbmdfZ2V0X2NodW5rX2NhY2hlX21heChkdW1teV9wdHIpKTsKKyAgIGlmIChwbmdfZ2V0X2NodW5rX21hbGxvY19tYXgoZHVtbXlfcHRyKSA9PSAwKQorICAgICAgZnByaW50ZihTVERFUlIsICIgIG1hbGxvY19tYXggPSB1bmxpbWl0ZWRcbiIpOworICAgZWxzZQorICAgICAgZnByaW50ZihTVERFUlIsICIgIG1hbGxvY19tYXggPSAlbHVcbiIsCisgICAgICAgICAodW5zaWduZWQgbG9uZykgcG5nX2dldF9jaHVua19tYWxsb2NfbWF4KGR1bW15X3B0cikpOworICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJmR1bW15X3B0ciwgTlVMTCwgTlVMTCk7CisKKyAgIHJldHVybiAoaW50KShpZXJyb3IgIT0gMCk7Cit9CisjZWxzZQoraW50CittYWluKHZvaWQpCit7CisgICBmcHJpbnRmKFNUREVSUiwKKyAgICAgICIgdGVzdCBpZ25vcmVkIGJlY2F1c2UgbGlicG5nIHdhcyBub3QgYnVpbHQgd2l0aCByZWFkIHN1cHBvcnRcbiIpOworICAgLyogQW5kIHNraXAgdGhpcyB0ZXN0ICovCisgICByZXR1cm4gUE5HX0xJQlBOR19WRVIgPCAxMDYwMCA/IDAgOiA3NzsKK30KKyNlbmRpZgorCisvKiBHZW5lcmF0ZSBhIGNvbXBpbGVyIGVycm9yIGlmIHRoZXJlIGlzIGFuIG9sZCBwbmcuaCBpbiB0aGUgc2VhcmNoIHBhdGguICovCit0eXBlZGVmIHBuZ19saWJwbmdfdmVyc2lvbl8xXzZfMjAgWW91cl9wbmdfaF9pc19ub3RfdmVyc2lvbl8xXzZfMjA7CmRpZmYgLS1naXQgYS9saWJwbmcvcG5ndGVzdC5wbmcgYi9saWJwbmcvcG5ndGVzdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzZmVmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9wbmd0ZXN0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJwbmcvcG5ndHJhbnMuYyBiL2xpYnBuZy9wbmd0cmFucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMGQ5MmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvcG5ndHJhbnMuYwpAQCAtMCwwICsxLDg0OSBAQAorCisvKiBwbmd0cmFucy5jIC0gdHJhbnNmb3JtcyB0aGUgZGF0YSBpbiBhIHJvdyAodXNlZCBieSBib3RoIHJlYWRlcnMgYW5kIHdyaXRlcnMpCisgKgorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMTggW0p1bHkgMjMsIDIwMTVdCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNSBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQorICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisgKiBhbmQgbGljZW5zZSBpbiBwbmcuaAorICovCisKKyNpbmNsdWRlICJwbmdwcml2LmgiCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1VQUE9SVEVEKQorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9CR1JfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9CR1JfU1VQUE9SVEVEKQorLyogVHVybiBvbiBCR1ItdG8tUkdCIG1hcHBpbmcgKi8KK3ZvaWQgUE5HQVBJCitwbmdfc2V0X2Jncihwbmdfc3RydWN0cnAgcG5nX3B0cikKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9iZ3IiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19CR1I7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX1JFQURfU1dBUF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NXQVBfU1VQUE9SVEVEKQorLyogVHVybiBvbiAxNi1iaXQgYnl0ZSBzd2FwcGluZyAqLwordm9pZCBQTkdBUEkKK3BuZ19zZXRfc3dhcChwbmdfc3RydWN0cnAgcG5nX3B0cikKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9zd2FwIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIGlmIChwbmdfcHRyLT5iaXRfZGVwdGggPT0gMTYpCisgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX1NXQVBfQllURVM7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX1JFQURfUEFDS19TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1BBQ0tfU1VQUE9SVEVEKQorLyogVHVybiBvbiBwaXhlbCBwYWNraW5nICovCit2b2lkIFBOR0FQSQorcG5nX3NldF9wYWNraW5nKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3BhY2tpbmciKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgaWYgKHBuZ19wdHItPmJpdF9kZXB0aCA8IDgpCisgICB7CisgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX1BBQ0s7CisjICAgICBpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECisgICAgICAgICBwbmdfcHRyLT51c3JfYml0X2RlcHRoID0gODsKKyMgICAgIGVuZGlmCisgICB9Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX1JFQURfUEFDS1NXQVBfU1VQUE9SVEVEKXx8ZGVmaW5lZChQTkdfV1JJVEVfUEFDS1NXQVBfU1VQUE9SVEVEKQorLyogVHVybiBvbiBwYWNrZWQgcGl4ZWwgc3dhcHBpbmcgKi8KK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3BhY2tzd2FwKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3BhY2tzd2FwIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIGlmIChwbmdfcHRyLT5iaXRfZGVwdGggPCA4KQorICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19QQUNLU1dBUDsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9TSElGVF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NISUZUX1NVUFBPUlRFRCkKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3NoaWZ0KHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfY29sb3JfOHAgdHJ1ZV9iaXRzKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3NoaWZ0Iik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfU0hJRlQ7CisgICBwbmdfcHRyLT5zaGlmdCA9ICp0cnVlX2JpdHM7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVEKSB8fCBcCisgICAgZGVmaW5lZChQTkdfV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVEKQoraW50IFBOR0FQSQorcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3N0cnVjdHJwIHBuZ19wdHIpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfaW50ZXJsYWNlIGhhbmRsaW5nIik7CisKKyAgIGlmIChwbmdfcHRyICE9IDAgJiYgcG5nX3B0ci0+aW50ZXJsYWNlZCAhPSAwKQorICAgeworICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19JTlRFUkxBQ0U7CisgICAgICByZXR1cm4gKDcpOworICAgfQorCisgICByZXR1cm4gKDEpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX0ZJTExFUl9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX0ZJTExFUl9TVVBQT1JURUQpCisvKiBBZGQgYSBmaWxsZXIgYnl0ZSBvbiByZWFkLCBvciByZW1vdmUgYSBmaWxsZXIgb3IgYWxwaGEgYnl0ZSBvbiB3cml0ZS4KKyAqIFRoZSBmaWxsZXIgdHlwZSBoYXMgY2hhbmdlZCBpbiB2MC45NSB0byBhbGxvdyBmdXR1cmUgMi1ieXRlIGZpbGxlcnMKKyAqIGZvciA0OC1iaXQgaW5wdXQgZGF0YSwgYXMgd2VsbCBhcyB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIHNvbWUgY29tcGlsZXJzCisgKiB0aGF0IGRvbid0IGxpa2UgYnl0ZXMgYXMgcGFyYW1ldGVycy4KKyAqLwordm9pZCBQTkdBUEkKK3BuZ19zZXRfZmlsbGVyKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfdWludF8zMiBmaWxsZXIsIGludCBmaWxsZXJfbG9jKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2ZpbGxlciIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICAvKiBJbiBsaWJwbmcgMS42IGl0IGlzIHBvc3NpYmxlIHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgYSByZWFkIG9yIHdyaXRlCisgICAgKiBvcGVyYXRpb24gYW5kIHRoZXJlZm9yZSB0byBkbyBtb3JlIGNoZWNraW5nIGhlcmUgZm9yIGEgdmFsaWQgY2FsbC4KKyAgICAqLworICAgaWYgKChwbmdfcHRyLT5tb2RlICYgUE5HX0lTX1JFQURfU1RSVUNUKSAhPSAwKQorICAgeworIyAgICAgaWZkZWYgUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRAorICAgICAgICAgLyogT24gcmVhZCBwbmdfc2V0X2ZpbGxlciBpcyBhbHdheXMgdmFsaWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIGJhc2UgUE5HCisgICAgICAgICAgKiBmb3JtYXQsIGJlY2F1c2Ugb3RoZXIgdHJhbnNmb3JtYXRpb25zIGNhbiBnaXZlIGEgZm9ybWF0IHdoZXJlIHRoZQorICAgICAgICAgICogZmlsbGVyIGNvZGUgY2FuIGV4ZWN1dGUgKGJhc2ljYWxseSBhbiA4IG9yIDE2LWJpdCBjb21wb25lbnQgUkdCIG9yIEcKKyAgICAgICAgICAqIGZvcm1hdC4pCisgICAgICAgICAgKgorICAgICAgICAgICogTk9URTogdXNyX2NoYW5uZWxzIGlzIG5vdCB1c2VkIGJ5IHRoZSByZWFkIGNvZGUhICAoVGhpcyBoYXMgbGVkIHRvCisgICAgICAgICAgKiBjb25mdXNpb24gaW4gdGhlIHBhc3QuKSAgVGhlIGZpbGxlciBpcyBvbmx5IHVzZWQgaW4gdGhlIHJlYWQgY29kZS4KKyAgICAgICAgICAqLworICAgICAgICAgcG5nX3B0ci0+ZmlsbGVyID0gKHBuZ191aW50XzE2KWZpbGxlcjsKKyMgICAgIGVsc2UKKyAgICAgICAgIHBuZ19hcHBfZXJyb3IocG5nX3B0ciwgInBuZ19zZXRfZmlsbGVyIG5vdCBzdXBwb3J0ZWQgb24gcmVhZCIpOworICAgICAgICAgUE5HX1VOVVNFRChmaWxsZXIpIC8qIG5vdCB1c2VkIGluIHRoZSB3cml0ZSBjYXNlICovCisgICAgICAgICByZXR1cm47CisjICAgICBlbmRpZgorICAgfQorCisgICBlbHNlIC8qIHdyaXRlICovCisgICB7CisjICAgICBpZmRlZiBQTkdfV1JJVEVfRklMTEVSX1NVUFBPUlRFRAorICAgICAgICAgLyogT24gd3JpdGUgdGhlIHVzcl9jaGFubmVscyBwYXJhbWV0ZXIgbXVzdCBiZSBzZXQgY29ycmVjdGx5IGF0IHRoZQorICAgICAgICAgICogc3RhcnQgdG8gcmVjb3JkIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGFwcC1zdXBwbGllZCBkYXRhLgorICAgICAgICAgICovCisgICAgICAgICBzd2l0Y2ggKHBuZ19wdHItPmNvbG9yX3R5cGUpCisgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1JHQjoKKyAgICAgICAgICAgICAgIHBuZ19wdHItPnVzcl9jaGFubmVscyA9IDQ7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkFZOgorICAgICAgICAgICAgICAgaWYgKHBuZ19wdHItPmJpdF9kZXB0aCA+PSA4KQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+dXNyX2NoYW5uZWxzID0gMjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiBUaGVyZSBzaW1wbHkgaXNuJ3QgYW55IGNvZGUgaW4gbGlicG5nIHRvIHN0cmlwIG91dCBiaXRzCisgICAgICAgICAgICAgICAgICAgKiBmcm9tIGJ5dGVzIHdoZW4gdGhlIGNvbXBvbmVudHMgYXJlIGxlc3MgdGhhbiBhIGJ5dGUgaW4KKyAgICAgICAgICAgICAgICAgICAqIHNpemUhCisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIHBuZ19hcHBfZXJyb3IocG5nX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICJwbmdfc2V0X2ZpbGxlciBpcyBpbnZhbGlkIGZvciBsb3cgYml0IGRlcHRoIGdyYXkgb3V0cHV0Iik7CisgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICBwbmdfYXBwX2Vycm9yKHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAicG5nX3NldF9maWxsZXI6IGluYXBwcm9wcmlhdGUgY29sb3IgdHlwZSIpOworICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgfQorIyAgICAgZWxzZQorICAgICAgICAgcG5nX2FwcF9lcnJvcihwbmdfcHRyLCAicG5nX3NldF9maWxsZXIgbm90IHN1cHBvcnRlZCBvbiB3cml0ZSIpOworICAgICAgICAgcmV0dXJuOworIyAgICAgZW5kaWYKKyAgIH0KKworICAgLyogSGVyZSBvbiBzdWNjZXNzIC0gbGlicG5nIHN1cHBvcnRzIHRoZSBvcGVyYXRpb24sIHNldCB0aGUgdHJhbnNmb3JtYXRpb24KKyAgICAqIGFuZCB0aGUgZmxhZyB0byBzYXkgd2hlcmUgdGhlIGZpbGxlciBjaGFubmVsIGlzLgorICAgICovCisgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX0ZJTExFUjsKKworICAgaWYgKGZpbGxlcl9sb2MgPT0gUE5HX0ZJTExFUl9BRlRFUikKKyAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX0ZJTExFUl9BRlRFUjsKKworICAgZWxzZQorICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX0ZJTExFUl9BRlRFUjsKK30KKworLyogQWRkZWQgdG8gbGlicG5nLTEuMi43ICovCit2b2lkIFBOR0FQSQorcG5nX3NldF9hZGRfYWxwaGEocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ191aW50XzMyIGZpbGxlciwgaW50IGZpbGxlcl9sb2MpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfYWRkX2FscGhhIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIHBuZ19zZXRfZmlsbGVyKHBuZ19wdHIsIGZpbGxlciwgZmlsbGVyX2xvYyk7CisgICAvKiBUaGUgYWJvdmUgbWF5IGZhaWwgdG8gZG8gYW55dGhpbmcuICovCisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19GSUxMRVIpICE9IDApCisgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX0FERF9BTFBIQTsKK30KKworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NXQVBfQUxQSEFfU1VQUE9SVEVEKSB8fCBcCisgICAgZGVmaW5lZChQTkdfV1JJVEVfU1dBUF9BTFBIQV9TVVBQT1JURUQpCit2b2lkIFBOR0FQSQorcG5nX3NldF9zd2FwX2FscGhhKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3N3YXBfYWxwaGEiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19TV0FQX0FMUEhBOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQpIHx8IFwKKyAgICBkZWZpbmVkKFBOR19XUklURV9JTlZFUlRfQUxQSEFfU1VQUE9SVEVEKQordm9pZCBQTkdBUEkKK3BuZ19zZXRfaW52ZXJ0X2FscGhhKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2ludmVydF9hbHBoYSIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX0lOVkVSVF9BTFBIQTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9JTlZFUlRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9JTlZFUlRfU1VQUE9SVEVEKQordm9pZCBQTkdBUEkKK3BuZ19zZXRfaW52ZXJ0X21vbm8ocG5nX3N0cnVjdHJwIHBuZ19wdHIpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfaW52ZXJ0X21vbm8iKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19JTlZFUlRfTU9OTzsKK30KKworLyogSW52ZXJ0IG1vbm9jaHJvbWUgZ3JheXNjYWxlIGRhdGEgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2RvX2ludmVydChwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9faW52ZXJ0Iik7CisKKyAgLyogVGhpcyB0ZXN0IHJlbW92ZWQgZnJvbSBsaWJwbmcgdmVyc2lvbiAxLjAuMTMgYW5kIDEuMi4wOgorICAgKiAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDEgJiYKKyAgICovCisgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkKKyAgIHsKKyAgICAgIHBuZ19ieXRlcCBycCA9IHJvdzsKKyAgICAgIHBuZ19zaXplX3QgaTsKKyAgICAgIHBuZ19zaXplX3QgaXN0b3AgPSByb3dfaW5mby0+cm93Ynl0ZXM7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBpc3RvcDsgaSsrKQorICAgICAgeworICAgICAgICAgKnJwID0gKHBuZ19ieXRlKSh+KCpycCkpOworICAgICAgICAgcnArKzsKKyAgICAgIH0KKyAgIH0KKworICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSAmJgorICAgICAgcm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQorICAgeworICAgICAgcG5nX2J5dGVwIHJwID0gcm93OworICAgICAgcG5nX3NpemVfdCBpOworICAgICAgcG5nX3NpemVfdCBpc3RvcCA9IHJvd19pbmZvLT5yb3dieXRlczsKKworICAgICAgZm9yIChpID0gMDsgaSA8IGlzdG9wOyBpICs9IDIpCisgICAgICB7CisgICAgICAgICAqcnAgPSAocG5nX2J5dGUpKH4oKnJwKSk7CisgICAgICAgICBycCArPSAyOworICAgICAgfQorICAgfQorCisjaWZkZWYgUE5HXzE2QklUX1NVUFBPUlRFRAorICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSAmJgorICAgICAgcm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikKKyAgIHsKKyAgICAgIHBuZ19ieXRlcCBycCA9IHJvdzsKKyAgICAgIHBuZ19zaXplX3QgaTsKKyAgICAgIHBuZ19zaXplX3QgaXN0b3AgPSByb3dfaW5mby0+cm93Ynl0ZXM7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBpc3RvcDsgaSArPSA0KQorICAgICAgeworICAgICAgICAgKnJwID0gKHBuZ19ieXRlKSh+KCpycCkpOworICAgICAgICAgKihycCArIDEpID0gKHBuZ19ieXRlKSh+KCoocnAgKyAxKSkpOworICAgICAgICAgcnAgKz0gNDsKKyAgICAgIH0KKyAgIH0KKyNlbmRpZgorfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfMTZCSVRfU1VQUE9SVEVECisjaWYgZGVmaW5lZChQTkdfUkVBRF9TV0FQX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1dBUF9TVVBQT1JURUQpCisvKiBTd2FwcyBieXRlIG9yZGVyIG9uIDE2LWJpdCBkZXB0aCBpbWFnZXMgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2RvX3N3YXAocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3N3YXAiKTsKKworICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpCisgICB7CisgICAgICBwbmdfYnl0ZXAgcnAgPSByb3c7CisgICAgICBwbmdfdWludF8zMiBpOworICAgICAgcG5nX3VpbnRfMzIgaXN0b3A9IHJvd19pbmZvLT53aWR0aCAqIHJvd19pbmZvLT5jaGFubmVsczsKKworICAgICAgZm9yIChpID0gMDsgaSA8IGlzdG9wOyBpKyssIHJwICs9IDIpCisgICAgICB7CisjaWZkZWYgUE5HX0JVSUxUSU5fQlNXQVAxNl9TVVBQT1JURUQKKyAgICAgICAgIC8qIEZlYXR1cmUgYWRkZWQgdG8gbGlicG5nLTEuNi4xMSBmb3IgdGVzdGluZyBwdXJwb3Nlcywgbm90CisgICAgICAgICAgKiBlbmFibGVkIGJ5IGRlZmF1bHQuCisgICAgICAgICAgKi8KKyAgICAgICAgICoocG5nX3VpbnRfMTYqKXJwID0gX19idWlsdGluX2Jzd2FwMTYoKihwbmdfdWludF8xNiopcnApOworI2Vsc2UKKyAgICAgICAgIHBuZ19ieXRlIHQgPSAqcnA7CisgICAgICAgICAqcnAgPSAqKHJwICsgMSk7CisgICAgICAgICAqKHJwICsgMSkgPSB0OworI2VuZGlmCisgICAgICB9CisgICB9Cit9CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQpfHxkZWZpbmVkKFBOR19XUklURV9QQUNLU1dBUF9TVVBQT1JURUQpCitzdGF0aWMgUE5HX0NPTlNUIHBuZ19ieXRlIG9uZWJwcHN3YXB0YWJsZVsyNTZdID0geworICAgMHgwMCwgMHg4MCwgMHg0MCwgMHhDMCwgMHgyMCwgMHhBMCwgMHg2MCwgMHhFMCwKKyAgIDB4MTAsIDB4OTAsIDB4NTAsIDB4RDAsIDB4MzAsIDB4QjAsIDB4NzAsIDB4RjAsCisgICAweDA4LCAweDg4LCAweDQ4LCAweEM4LCAweDI4LCAweEE4LCAweDY4LCAweEU4LAorICAgMHgxOCwgMHg5OCwgMHg1OCwgMHhEOCwgMHgzOCwgMHhCOCwgMHg3OCwgMHhGOCwKKyAgIDB4MDQsIDB4ODQsIDB4NDQsIDB4QzQsIDB4MjQsIDB4QTQsIDB4NjQsIDB4RTQsCisgICAweDE0LCAweDk0LCAweDU0LCAweEQ0LCAweDM0LCAweEI0LCAweDc0LCAweEY0LAorICAgMHgwQywgMHg4QywgMHg0QywgMHhDQywgMHgyQywgMHhBQywgMHg2QywgMHhFQywKKyAgIDB4MUMsIDB4OUMsIDB4NUMsIDB4REMsIDB4M0MsIDB4QkMsIDB4N0MsIDB4RkMsCisgICAweDAyLCAweDgyLCAweDQyLCAweEMyLCAweDIyLCAweEEyLCAweDYyLCAweEUyLAorICAgMHgxMiwgMHg5MiwgMHg1MiwgMHhEMiwgMHgzMiwgMHhCMiwgMHg3MiwgMHhGMiwKKyAgIDB4MEEsIDB4OEEsIDB4NEEsIDB4Q0EsIDB4MkEsIDB4QUEsIDB4NkEsIDB4RUEsCisgICAweDFBLCAweDlBLCAweDVBLCAweERBLCAweDNBLCAweEJBLCAweDdBLCAweEZBLAorICAgMHgwNiwgMHg4NiwgMHg0NiwgMHhDNiwgMHgyNiwgMHhBNiwgMHg2NiwgMHhFNiwKKyAgIDB4MTYsIDB4OTYsIDB4NTYsIDB4RDYsIDB4MzYsIDB4QjYsIDB4NzYsIDB4RjYsCisgICAweDBFLCAweDhFLCAweDRFLCAweENFLCAweDJFLCAweEFFLCAweDZFLCAweEVFLAorICAgMHgxRSwgMHg5RSwgMHg1RSwgMHhERSwgMHgzRSwgMHhCRSwgMHg3RSwgMHhGRSwKKyAgIDB4MDEsIDB4ODEsIDB4NDEsIDB4QzEsIDB4MjEsIDB4QTEsIDB4NjEsIDB4RTEsCisgICAweDExLCAweDkxLCAweDUxLCAweEQxLCAweDMxLCAweEIxLCAweDcxLCAweEYxLAorICAgMHgwOSwgMHg4OSwgMHg0OSwgMHhDOSwgMHgyOSwgMHhBOSwgMHg2OSwgMHhFOSwKKyAgIDB4MTksIDB4OTksIDB4NTksIDB4RDksIDB4MzksIDB4QjksIDB4NzksIDB4RjksCisgICAweDA1LCAweDg1LCAweDQ1LCAweEM1LCAweDI1LCAweEE1LCAweDY1LCAweEU1LAorICAgMHgxNSwgMHg5NSwgMHg1NSwgMHhENSwgMHgzNSwgMHhCNSwgMHg3NSwgMHhGNSwKKyAgIDB4MEQsIDB4OEQsIDB4NEQsIDB4Q0QsIDB4MkQsIDB4QUQsIDB4NkQsIDB4RUQsCisgICAweDFELCAweDlELCAweDVELCAweERELCAweDNELCAweEJELCAweDdELCAweEZELAorICAgMHgwMywgMHg4MywgMHg0MywgMHhDMywgMHgyMywgMHhBMywgMHg2MywgMHhFMywKKyAgIDB4MTMsIDB4OTMsIDB4NTMsIDB4RDMsIDB4MzMsIDB4QjMsIDB4NzMsIDB4RjMsCisgICAweDBCLCAweDhCLCAweDRCLCAweENCLCAweDJCLCAweEFCLCAweDZCLCAweEVCLAorICAgMHgxQiwgMHg5QiwgMHg1QiwgMHhEQiwgMHgzQiwgMHhCQiwgMHg3QiwgMHhGQiwKKyAgIDB4MDcsIDB4ODcsIDB4NDcsIDB4QzcsIDB4MjcsIDB4QTcsIDB4NjcsIDB4RTcsCisgICAweDE3LCAweDk3LCAweDU3LCAweEQ3LCAweDM3LCAweEI3LCAweDc3LCAweEY3LAorICAgMHgwRiwgMHg4RiwgMHg0RiwgMHhDRiwgMHgyRiwgMHhBRiwgMHg2RiwgMHhFRiwKKyAgIDB4MUYsIDB4OUYsIDB4NUYsIDB4REYsIDB4M0YsIDB4QkYsIDB4N0YsIDB4RkYKK307CisKK3N0YXRpYyBQTkdfQ09OU1QgcG5nX2J5dGUgdHdvYnBwc3dhcHRhYmxlWzI1Nl0gPSB7CisgICAweDAwLCAweDQwLCAweDgwLCAweEMwLCAweDEwLCAweDUwLCAweDkwLCAweEQwLAorICAgMHgyMCwgMHg2MCwgMHhBMCwgMHhFMCwgMHgzMCwgMHg3MCwgMHhCMCwgMHhGMCwKKyAgIDB4MDQsIDB4NDQsIDB4ODQsIDB4QzQsIDB4MTQsIDB4NTQsIDB4OTQsIDB4RDQsCisgICAweDI0LCAweDY0LCAweEE0LCAweEU0LCAweDM0LCAweDc0LCAweEI0LCAweEY0LAorICAgMHgwOCwgMHg0OCwgMHg4OCwgMHhDOCwgMHgxOCwgMHg1OCwgMHg5OCwgMHhEOCwKKyAgIDB4MjgsIDB4NjgsIDB4QTgsIDB4RTgsIDB4MzgsIDB4NzgsIDB4QjgsIDB4RjgsCisgICAweDBDLCAweDRDLCAweDhDLCAweENDLCAweDFDLCAweDVDLCAweDlDLCAweERDLAorICAgMHgyQywgMHg2QywgMHhBQywgMHhFQywgMHgzQywgMHg3QywgMHhCQywgMHhGQywKKyAgIDB4MDEsIDB4NDEsIDB4ODEsIDB4QzEsIDB4MTEsIDB4NTEsIDB4OTEsIDB4RDEsCisgICAweDIxLCAweDYxLCAweEExLCAweEUxLCAweDMxLCAweDcxLCAweEIxLCAweEYxLAorICAgMHgwNSwgMHg0NSwgMHg4NSwgMHhDNSwgMHgxNSwgMHg1NSwgMHg5NSwgMHhENSwKKyAgIDB4MjUsIDB4NjUsIDB4QTUsIDB4RTUsIDB4MzUsIDB4NzUsIDB4QjUsIDB4RjUsCisgICAweDA5LCAweDQ5LCAweDg5LCAweEM5LCAweDE5LCAweDU5LCAweDk5LCAweEQ5LAorICAgMHgyOSwgMHg2OSwgMHhBOSwgMHhFOSwgMHgzOSwgMHg3OSwgMHhCOSwgMHhGOSwKKyAgIDB4MEQsIDB4NEQsIDB4OEQsIDB4Q0QsIDB4MUQsIDB4NUQsIDB4OUQsIDB4REQsCisgICAweDJELCAweDZELCAweEFELCAweEVELCAweDNELCAweDdELCAweEJELCAweEZELAorICAgMHgwMiwgMHg0MiwgMHg4MiwgMHhDMiwgMHgxMiwgMHg1MiwgMHg5MiwgMHhEMiwKKyAgIDB4MjIsIDB4NjIsIDB4QTIsIDB4RTIsIDB4MzIsIDB4NzIsIDB4QjIsIDB4RjIsCisgICAweDA2LCAweDQ2LCAweDg2LCAweEM2LCAweDE2LCAweDU2LCAweDk2LCAweEQ2LAorICAgMHgyNiwgMHg2NiwgMHhBNiwgMHhFNiwgMHgzNiwgMHg3NiwgMHhCNiwgMHhGNiwKKyAgIDB4MEEsIDB4NEEsIDB4OEEsIDB4Q0EsIDB4MUEsIDB4NUEsIDB4OUEsIDB4REEsCisgICAweDJBLCAweDZBLCAweEFBLCAweEVBLCAweDNBLCAweDdBLCAweEJBLCAweEZBLAorICAgMHgwRSwgMHg0RSwgMHg4RSwgMHhDRSwgMHgxRSwgMHg1RSwgMHg5RSwgMHhERSwKKyAgIDB4MkUsIDB4NkUsIDB4QUUsIDB4RUUsIDB4M0UsIDB4N0UsIDB4QkUsIDB4RkUsCisgICAweDAzLCAweDQzLCAweDgzLCAweEMzLCAweDEzLCAweDUzLCAweDkzLCAweEQzLAorICAgMHgyMywgMHg2MywgMHhBMywgMHhFMywgMHgzMywgMHg3MywgMHhCMywgMHhGMywKKyAgIDB4MDcsIDB4NDcsIDB4ODcsIDB4QzcsIDB4MTcsIDB4NTcsIDB4OTcsIDB4RDcsCisgICAweDI3LCAweDY3LCAweEE3LCAweEU3LCAweDM3LCAweDc3LCAweEI3LCAweEY3LAorICAgMHgwQiwgMHg0QiwgMHg4QiwgMHhDQiwgMHgxQiwgMHg1QiwgMHg5QiwgMHhEQiwKKyAgIDB4MkIsIDB4NkIsIDB4QUIsIDB4RUIsIDB4M0IsIDB4N0IsIDB4QkIsIDB4RkIsCisgICAweDBGLCAweDRGLCAweDhGLCAweENGLCAweDFGLCAweDVGLCAweDlGLCAweERGLAorICAgMHgyRiwgMHg2RiwgMHhBRiwgMHhFRiwgMHgzRiwgMHg3RiwgMHhCRiwgMHhGRgorfTsKKworc3RhdGljIFBOR19DT05TVCBwbmdfYnl0ZSBmb3VyYnBwc3dhcHRhYmxlWzI1Nl0gPSB7CisgICAweDAwLCAweDEwLCAweDIwLCAweDMwLCAweDQwLCAweDUwLCAweDYwLCAweDcwLAorICAgMHg4MCwgMHg5MCwgMHhBMCwgMHhCMCwgMHhDMCwgMHhEMCwgMHhFMCwgMHhGMCwKKyAgIDB4MDEsIDB4MTEsIDB4MjEsIDB4MzEsIDB4NDEsIDB4NTEsIDB4NjEsIDB4NzEsCisgICAweDgxLCAweDkxLCAweEExLCAweEIxLCAweEMxLCAweEQxLCAweEUxLCAweEYxLAorICAgMHgwMiwgMHgxMiwgMHgyMiwgMHgzMiwgMHg0MiwgMHg1MiwgMHg2MiwgMHg3MiwKKyAgIDB4ODIsIDB4OTIsIDB4QTIsIDB4QjIsIDB4QzIsIDB4RDIsIDB4RTIsIDB4RjIsCisgICAweDAzLCAweDEzLCAweDIzLCAweDMzLCAweDQzLCAweDUzLCAweDYzLCAweDczLAorICAgMHg4MywgMHg5MywgMHhBMywgMHhCMywgMHhDMywgMHhEMywgMHhFMywgMHhGMywKKyAgIDB4MDQsIDB4MTQsIDB4MjQsIDB4MzQsIDB4NDQsIDB4NTQsIDB4NjQsIDB4NzQsCisgICAweDg0LCAweDk0LCAweEE0LCAweEI0LCAweEM0LCAweEQ0LCAweEU0LCAweEY0LAorICAgMHgwNSwgMHgxNSwgMHgyNSwgMHgzNSwgMHg0NSwgMHg1NSwgMHg2NSwgMHg3NSwKKyAgIDB4ODUsIDB4OTUsIDB4QTUsIDB4QjUsIDB4QzUsIDB4RDUsIDB4RTUsIDB4RjUsCisgICAweDA2LCAweDE2LCAweDI2LCAweDM2LCAweDQ2LCAweDU2LCAweDY2LCAweDc2LAorICAgMHg4NiwgMHg5NiwgMHhBNiwgMHhCNiwgMHhDNiwgMHhENiwgMHhFNiwgMHhGNiwKKyAgIDB4MDcsIDB4MTcsIDB4MjcsIDB4MzcsIDB4NDcsIDB4NTcsIDB4NjcsIDB4NzcsCisgICAweDg3LCAweDk3LCAweEE3LCAweEI3LCAweEM3LCAweEQ3LCAweEU3LCAweEY3LAorICAgMHgwOCwgMHgxOCwgMHgyOCwgMHgzOCwgMHg0OCwgMHg1OCwgMHg2OCwgMHg3OCwKKyAgIDB4ODgsIDB4OTgsIDB4QTgsIDB4QjgsIDB4QzgsIDB4RDgsIDB4RTgsIDB4RjgsCisgICAweDA5LCAweDE5LCAweDI5LCAweDM5LCAweDQ5LCAweDU5LCAweDY5LCAweDc5LAorICAgMHg4OSwgMHg5OSwgMHhBOSwgMHhCOSwgMHhDOSwgMHhEOSwgMHhFOSwgMHhGOSwKKyAgIDB4MEEsIDB4MUEsIDB4MkEsIDB4M0EsIDB4NEEsIDB4NUEsIDB4NkEsIDB4N0EsCisgICAweDhBLCAweDlBLCAweEFBLCAweEJBLCAweENBLCAweERBLCAweEVBLCAweEZBLAorICAgMHgwQiwgMHgxQiwgMHgyQiwgMHgzQiwgMHg0QiwgMHg1QiwgMHg2QiwgMHg3QiwKKyAgIDB4OEIsIDB4OUIsIDB4QUIsIDB4QkIsIDB4Q0IsIDB4REIsIDB4RUIsIDB4RkIsCisgICAweDBDLCAweDFDLCAweDJDLCAweDNDLCAweDRDLCAweDVDLCAweDZDLCAweDdDLAorICAgMHg4QywgMHg5QywgMHhBQywgMHhCQywgMHhDQywgMHhEQywgMHhFQywgMHhGQywKKyAgIDB4MEQsIDB4MUQsIDB4MkQsIDB4M0QsIDB4NEQsIDB4NUQsIDB4NkQsIDB4N0QsCisgICAweDhELCAweDlELCAweEFELCAweEJELCAweENELCAweERELCAweEVELCAweEZELAorICAgMHgwRSwgMHgxRSwgMHgyRSwgMHgzRSwgMHg0RSwgMHg1RSwgMHg2RSwgMHg3RSwKKyAgIDB4OEUsIDB4OUUsIDB4QUUsIDB4QkUsIDB4Q0UsIDB4REUsIDB4RUUsIDB4RkUsCisgICAweDBGLCAweDFGLCAweDJGLCAweDNGLCAweDRGLCAweDVGLCAweDZGLCAweDdGLAorICAgMHg4RiwgMHg5RiwgMHhBRiwgMHhCRiwgMHhDRiwgMHhERiwgMHhFRiwgMHhGRgorfTsKKworLyogU3dhcHMgcGl4ZWwgcGFja2luZyBvcmRlciB3aXRoaW4gYnl0ZXMgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2RvX3BhY2tzd2FwKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3cpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19wYWNrc3dhcCIpOworCisgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA8IDgpCisgICB7CisgICAgICBwbmdfYnl0ZXAgcnA7CisgICAgICBwbmdfY29uc3RfYnl0ZXAgZW5kLCB0YWJsZTsKKworICAgICAgZW5kID0gcm93ICsgcm93X2luZm8tPnJvd2J5dGVzOworCisgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxKQorICAgICAgICAgdGFibGUgPSBvbmVicHBzd2FwdGFibGU7CisKKyAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMikKKyAgICAgICAgIHRhYmxlID0gdHdvYnBwc3dhcHRhYmxlOworCisgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDQpCisgICAgICAgICB0YWJsZSA9IGZvdXJicHBzd2FwdGFibGU7CisKKyAgICAgIGVsc2UKKyAgICAgICAgIHJldHVybjsKKworICAgICAgZm9yIChycCA9IHJvdzsgcnAgPCBlbmQ7IHJwKyspCisgICAgICAgICAqcnAgPSB0YWJsZVsqcnBdOworICAgfQorfQorI2VuZGlmIC8qIFBBQ0tTV0FQIHx8IFdSSVRFX1BBQ0tTV0FQICovCisKKyNpZiBkZWZpbmVkKFBOR19XUklURV9GSUxMRVJfU1VQUE9SVEVEKSB8fCBcCisgICAgZGVmaW5lZChQTkdfUkVBRF9TVFJJUF9BTFBIQV9TVVBQT1JURUQpCisvKiBSZW1vdmUgYSBjaGFubmVsIC0gdGhpcyB1c2VkIHRvIGJlICdwbmdfZG9fc3RyaXBfZmlsbGVyJyBidXQgaXQgdXNlZCBhCisgKiBzb21ld2hhdCB3ZWlyZCBjb21iaW5hdGlvbiBvZiBmbGFncyB0byBkZXRlcm1pbmUgd2hhdCB0byBkby4gIEFsbCB0aGUgY2FsbHMKKyAqIHRvIHBuZ19kb19zdHJpcF9maWxsZXIgYXJlIGNoYW5nZWQgaW4gMS41LjIgdG8gY2FsbCB0aGlzIGluc3RlYWQgd2l0aCB0aGUKKyAqIGNvcnJlY3QgYXJndW1lbnRzLgorICoKKyAqIFRoZSByb3V0aW5lIGlzbid0IGdlbmVyYWwgLSB0aGUgY2hhbm5lbCBtdXN0IGJlIHRoZSBjaGFubmVsIGF0IHRoZSBzdGFydCBvcgorICogZW5kIChub3QgaW4gdGhlIG1pZGRsZSkgb2YgZWFjaCBwaXhlbC4KKyAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfZG9fc3RyaXBfY2hhbm5lbChwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LCBpbnQgYXRfc3RhcnQpCit7CisgICBwbmdfYnl0ZXAgc3AgPSByb3c7IC8qIHNvdXJjZSBwb2ludGVyICovCisgICBwbmdfYnl0ZXAgZHAgPSByb3c7IC8qIGRlc3RpbmF0aW9uIHBvaW50ZXIgKi8KKyAgIHBuZ19ieXRlcCBlcCA9IHJvdyArIHJvd19pbmZvLT5yb3dieXRlczsgLyogT25lIGJleW9uZCBlbmQgb2Ygcm93ICovCisKKyAgIC8qIEF0IHRoZSBzdGFydCBzcCB3aWxsIHBvaW50IHRvIHRoZSBmaXJzdCBieXRlIHRvIGNvcHkgYW5kIGRwIHRvIHdoZXJlCisgICAgKiBpdCBpcyBjb3BpZWQgdG8uICBlcCBhbHdheXMgcG9pbnRzIGp1c3QgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHJvdywgc28KKyAgICAqIHRoZSBsb29wIHNpbXBseSBjb3BpZXMgKGNoYW5uZWxzLTEpIGNoYW5uZWxzIHVudGlsIHNwIHJlYWNoZXMgZXAuCisgICAgKgorICAgICogYXRfc3RhcnQ6ICAgICAgICAwIC0tIGNvbnZlcnQgQUcsIFhHLCBBUkdCLCBYUkdCLCBBQUdHLCBYWEdHLCBldGMuCisgICAgKiAgICAgICAgICAgIG5vbnplcm8gLS0gY29udmVydCBHQSwgR1gsIFJHQkEsIFJHQlgsIEdHQUEsIFJSR0dCQlhYLCBldGMuCisgICAgKi8KKworICAgLyogR0EsIEdYLCBYRyBjYXNlcyAqLworICAgaWYgKHJvd19pbmZvLT5jaGFubmVscyA9PSAyKQorICAgeworICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgIHsKKyAgICAgICAgIGlmIChhdF9zdGFydCAhPSAwKSAvKiBTa2lwIGluaXRpYWwgZmlsbGVyICovCisgICAgICAgICAgICArK3NwOworICAgICAgICAgZWxzZSAgICAgICAgICAvKiBTa2lwIGluaXRpYWwgY2hhbm5lbCBhbmQsIGZvciBzcCwgdGhlIGZpbGxlciAqLworICAgICAgICAgICAgc3AgKz0gMiwgKytkcDsKKworICAgICAgICAgLyogRm9yIGEgMSBwaXhlbCB3aWRlIGltYWdlIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAgICAgIHdoaWxlIChzcCA8IGVwKQorICAgICAgICAgICAgKmRwKysgPSAqc3AsIHNwICs9IDI7CisKKyAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IDg7CisgICAgICB9CisKKyAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpCisgICAgICB7CisgICAgICAgICBpZiAoYXRfc3RhcnQgIT0gMCkgLyogU2tpcCBpbml0aWFsIGZpbGxlciAqLworICAgICAgICAgICAgc3AgKz0gMjsKKyAgICAgICAgIGVsc2UgICAgICAgICAgLyogU2tpcCBpbml0aWFsIGNoYW5uZWwgYW5kLCBmb3Igc3AsIHRoZSBmaWxsZXIgKi8KKyAgICAgICAgICAgIHNwICs9IDQsIGRwICs9IDI7CisKKyAgICAgICAgIHdoaWxlIChzcCA8IGVwKQorICAgICAgICAgICAgKmRwKysgPSAqc3ArKywgKmRwKysgPSAqc3AsIHNwICs9IDM7CisKKyAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IDE2OworICAgICAgfQorCisgICAgICBlbHNlCisgICAgICAgICByZXR1cm47IC8qIGJhZCBiaXQgZGVwdGggKi8KKworICAgICAgcm93X2luZm8tPmNoYW5uZWxzID0gMTsKKworICAgICAgLyogRmluYWxseSBmaXggdGhlIGNvbG9yIHR5cGUgaWYgaXQgcmVjb3JkcyBhbiBhbHBoYSBjaGFubmVsICovCisgICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkKKyAgICAgICAgIHJvd19pbmZvLT5jb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfR1JBWTsKKyAgIH0KKworICAgLyogUkdCQSwgUkdCWCwgWFJHQiBjYXNlcyAqLworICAgZWxzZSBpZiAocm93X2luZm8tPmNoYW5uZWxzID09IDQpCisgICB7CisgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQorICAgICAgeworICAgICAgICAgaWYgKGF0X3N0YXJ0ICE9IDApIC8qIFNraXAgaW5pdGlhbCBmaWxsZXIgKi8KKyAgICAgICAgICAgICsrc3A7CisgICAgICAgICBlbHNlICAgICAgICAgIC8qIFNraXAgaW5pdGlhbCBjaGFubmVscyBhbmQsIGZvciBzcCwgdGhlIGZpbGxlciAqLworICAgICAgICAgICAgc3AgKz0gNCwgZHAgKz0gMzsKKworICAgICAgICAgLyogTm90ZSB0aGF0IHRoZSBsb29wIGFkZHMgMyB0byBkcCBhbmQgNCB0byBzcCBlYWNoIHRpbWUuICovCisgICAgICAgICB3aGlsZSAoc3AgPCBlcCkKKyAgICAgICAgICAgICpkcCsrID0gKnNwKyssICpkcCsrID0gKnNwKyssICpkcCsrID0gKnNwLCBzcCArPSAyOworCisgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAyNDsKKyAgICAgIH0KKworICAgICAgZWxzZSBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikKKyAgICAgIHsKKyAgICAgICAgIGlmIChhdF9zdGFydCAhPSAwKSAvKiBTa2lwIGluaXRpYWwgZmlsbGVyICovCisgICAgICAgICAgICBzcCArPSAyOworICAgICAgICAgZWxzZSAgICAgICAgICAvKiBTa2lwIGluaXRpYWwgY2hhbm5lbHMgYW5kLCBmb3Igc3AsIHRoZSBmaWxsZXIgKi8KKyAgICAgICAgICAgIHNwICs9IDgsIGRwICs9IDY7CisKKyAgICAgICAgIHdoaWxlIChzcCA8IGVwKQorICAgICAgICAgeworICAgICAgICAgICAgLyogQ29weSA2IGJ5dGVzLCBza2lwIDIgKi8KKyAgICAgICAgICAgICpkcCsrID0gKnNwKyssICpkcCsrID0gKnNwKys7CisgICAgICAgICAgICAqZHArKyA9ICpzcCsrLCAqZHArKyA9ICpzcCsrOworICAgICAgICAgICAgKmRwKysgPSAqc3ArKywgKmRwKysgPSAqc3AsIHNwICs9IDM7CisgICAgICAgICB9CisKKyAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IDQ4OworICAgICAgfQorCisgICAgICBlbHNlCisgICAgICAgICByZXR1cm47IC8qIGJhZCBiaXQgZGVwdGggKi8KKworICAgICAgcm93X2luZm8tPmNoYW5uZWxzID0gMzsKKworICAgICAgLyogRmluYWxseSBmaXggdGhlIGNvbG9yIHR5cGUgaWYgaXQgcmVjb3JkcyBhbiBhbHBoYSBjaGFubmVsICovCisgICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQorICAgICAgICAgcm93X2luZm8tPmNvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9SR0I7CisgICB9CisKKyAgIGVsc2UKKyAgICAgIHJldHVybjsgLyogVGhlIGZpbGxlciBjaGFubmVsIGhhcyBnb25lIGFscmVhZHkgKi8KKworICAgLyogRml4IHRoZSByb3dieXRlcyB2YWx1ZS4gKi8KKyAgIHJvd19pbmZvLT5yb3dieXRlcyA9IGRwLXJvdzsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9CR1JfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9CR1JfU1VQUE9SVEVEKQorLyogU3dhcHMgcmVkIGFuZCBibHVlIGJ5dGVzIHdpdGhpbiBhIHBpeGVsICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19kb19iZ3IocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX2JnciIpOworCisgICBpZiAoKHJvd19pbmZvLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpICE9IDApCisgICB7CisgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7CisgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQorICAgICAgeworICAgICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBycDsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIGk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDAsIHJwID0gcm93OyBpIDwgcm93X3dpZHRoOyBpKyssIHJwICs9IDMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfYnl0ZSBzYXZlID0gKnJwOworICAgICAgICAgICAgICAgKnJwID0gKihycCArIDIpOworICAgICAgICAgICAgICAgKihycCArIDIpID0gc2F2ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIHJwOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKKworICAgICAgICAgICAgZm9yIChpID0gMCwgcnAgPSByb3c7IGkgPCByb3dfd2lkdGg7IGkrKywgcnAgKz0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19ieXRlIHNhdmUgPSAqcnA7CisgICAgICAgICAgICAgICAqcnAgPSAqKHJwICsgMik7CisgICAgICAgICAgICAgICAqKHJwICsgMikgPSBzYXZlOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorCisjaWZkZWYgUE5HXzE2QklUX1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikKKyAgICAgIHsKKyAgICAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgcnA7CisgICAgICAgICAgICBwbmdfdWludF8zMiBpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwLCBycCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrLCBycCArPSA2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX2J5dGUgc2F2ZSA9ICpycDsKKyAgICAgICAgICAgICAgICpycCA9ICoocnAgKyA0KTsKKyAgICAgICAgICAgICAgICoocnAgKyA0KSA9IHNhdmU7CisgICAgICAgICAgICAgICBzYXZlID0gKihycCArIDEpOworICAgICAgICAgICAgICAgKihycCArIDEpID0gKihycCArIDUpOworICAgICAgICAgICAgICAgKihycCArIDUpID0gc2F2ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIHJwOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKKworICAgICAgICAgICAgZm9yIChpID0gMCwgcnAgPSByb3c7IGkgPCByb3dfd2lkdGg7IGkrKywgcnAgKz0gOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19ieXRlIHNhdmUgPSAqcnA7CisgICAgICAgICAgICAgICAqcnAgPSAqKHJwICsgNCk7CisgICAgICAgICAgICAgICAqKHJwICsgNCkgPSBzYXZlOworICAgICAgICAgICAgICAgc2F2ZSA9ICoocnAgKyAxKTsKKyAgICAgICAgICAgICAgICoocnAgKyAxKSA9ICoocnAgKyA1KTsKKyAgICAgICAgICAgICAgICoocnAgKyA1KSA9IHNhdmU7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyAgIH0KK30KKyNlbmRpZiAvKiBSRUFEX0JHUiB8fCBXUklURV9CR1IgKi8KKworI2lmIGRlZmluZWQoUE5HX1JFQURfQ0hFQ0tfRk9SX0lOVkFMSURfSU5ERVhfU1VQUE9SVEVEKSB8fCBcCisgICAgZGVmaW5lZChQTkdfV1JJVEVfQ0hFQ0tfRk9SX0lOVkFMSURfSU5ERVhfU1VQUE9SVEVEKQorLyogQWRkZWQgYXQgbGlicG5nLTEuNS4xMCAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfZG9fY2hlY2tfcGFsZXR0ZV9pbmRleGVzKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfcm93X2luZm9wIHJvd19pbmZvKQoreworICAgaWYgKHBuZ19wdHItPm51bV9wYWxldHRlIDwgKDEgPDwgcm93X2luZm8tPmJpdF9kZXB0aCkgJiYKKyAgICAgIHBuZ19wdHItPm51bV9wYWxldHRlID4gMCkgLyogbnVtX3BhbGV0dGUgY2FuIGJlIDAgaW4gTU5HIGZpbGVzICovCisgICB7CisgICAgICAvKiBDYWxjdWxhdGlvbnMgbW92ZWQgb3V0c2lkZSBzd2l0Y2ggaW4gYW4gYXR0ZW1wdCB0byBzdG9wIGRpZmZlcmVudAorICAgICAgICogY29tcGlsZXIgd2FybmluZ3MuICAncGFkZGluZycgaXMgaW4gKmJpdHMqIHdpdGhpbiB0aGUgbGFzdCBieXRlLCBpdCBpcworICAgICAgICogYW4gJ2ludCcgYmVjYXVzZSBwaXhlbF9kZXB0aCBiZWNvbWVzIGFuICdpbnQnIGluIHRoZSBleHByZXNzaW9uIGJlbG93LAorICAgICAgICogYW5kIHRoaXMgY2FsY3VsYXRpb24gaXMgdXNlZCBiZWNhdXNlIGl0IGF2b2lkcyB3YXJuaW5ncyB0aGF0IG90aGVyCisgICAgICAgKiBmb3JtcyBwcm9kdWNlZCBvbiBlaXRoZXIgR0NDIG9yIE1TVkMuCisgICAgICAgKi8KKyAgICAgIGludCBwYWRkaW5nID0gKC1yb3dfaW5mby0+cGl4ZWxfZGVwdGggKiByb3dfaW5mby0+d2lkdGgpICYgNzsKKyAgICAgIHBuZ19ieXRlcCBycCA9IHBuZ19wdHItPnJvd19idWYgKyByb3dfaW5mby0+cm93Ynl0ZXM7CisKKyAgICAgIHN3aXRjaCAocm93X2luZm8tPmJpdF9kZXB0aCkKKyAgICAgIHsKKyAgICAgICAgIGNhc2UgMToKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGluIHRoaXMgY2FzZSwgYWxsIGJ5dGVzIG11c3QgYmUgMCBzbyB3ZSBkb24ndCBuZWVkCisgICAgICAgICAgICAgKiB0byB1bnBhY2sgdGhlIHBpeGVscyBleGNlcHQgZm9yIHRoZSByaWdodG1vc3Qgb25lLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBmb3IgKDsgcnAgPiBwbmdfcHRyLT5yb3dfYnVmOyBycC0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoKCpycCA+PiBwYWRkaW5nKSAhPSAwKQorICAgICAgICAgICAgICAgICBwbmdfcHRyLT5udW1fcGFsZXR0ZV9tYXggPSAxOworICAgICAgICAgICAgICBwYWRkaW5nID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisKKyAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoOyBycCA+IHBuZ19wdHItPnJvd19idWY7IHJwLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGludCBpID0gKCgqcnAgPj4gcGFkZGluZykgJiAweDAzKTsKKworICAgICAgICAgICAgICBpZiAoaSA+IHBuZ19wdHItPm51bV9wYWxldHRlX21heCkKKyAgICAgICAgICAgICAgICAgcG5nX3B0ci0+bnVtX3BhbGV0dGVfbWF4ID0gaTsKKworICAgICAgICAgICAgICBpID0gKCgoKnJwID4+IHBhZGRpbmcpID4+IDIpICYgMHgwMyk7CisKKyAgICAgICAgICAgICAgaWYgKGkgPiBwbmdfcHRyLT5udW1fcGFsZXR0ZV9tYXgpCisgICAgICAgICAgICAgICAgIHBuZ19wdHItPm51bV9wYWxldHRlX21heCA9IGk7CisKKyAgICAgICAgICAgICAgaSA9ICgoKCpycCA+PiBwYWRkaW5nKSA+PiA0KSAmIDB4MDMpOworCisgICAgICAgICAgICAgIGlmIChpID4gcG5nX3B0ci0+bnVtX3BhbGV0dGVfbWF4KQorICAgICAgICAgICAgICAgICBwbmdfcHRyLT5udW1fcGFsZXR0ZV9tYXggPSBpOworCisgICAgICAgICAgICAgIGkgPSAoKCgqcnAgPj4gcGFkZGluZykgPj4gNikgJiAweDAzKTsKKworICAgICAgICAgICAgICBpZiAoaSA+IHBuZ19wdHItPm51bV9wYWxldHRlX21heCkKKyAgICAgICAgICAgICAgICAgcG5nX3B0ci0+bnVtX3BhbGV0dGVfbWF4ID0gaTsKKworICAgICAgICAgICAgICBwYWRkaW5nID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisKKyAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoOyBycCA+IHBuZ19wdHItPnJvd19idWY7IHJwLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGludCBpID0gKCgqcnAgPj4gcGFkZGluZykgJiAweDBmKTsKKworICAgICAgICAgICAgICBpZiAoaSA+IHBuZ19wdHItPm51bV9wYWxldHRlX21heCkKKyAgICAgICAgICAgICAgICAgcG5nX3B0ci0+bnVtX3BhbGV0dGVfbWF4ID0gaTsKKworICAgICAgICAgICAgICBpID0gKCgoKnJwID4+IHBhZGRpbmcpID4+IDQpICYgMHgwZik7CisKKyAgICAgICAgICAgICAgaWYgKGkgPiBwbmdfcHRyLT5udW1fcGFsZXR0ZV9tYXgpCisgICAgICAgICAgICAgICAgIHBuZ19wdHItPm51bV9wYWxldHRlX21heCA9IGk7CisKKyAgICAgICAgICAgICAgcGFkZGluZyA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBjYXNlIDg6CisgICAgICAgICB7CisgICAgICAgICAgICBmb3IgKDsgcnAgPiBwbmdfcHRyLT5yb3dfYnVmOyBycC0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKCpycCA+IHBuZ19wdHItPm51bV9wYWxldHRlX21heCkKKyAgICAgICAgICAgICAgICAgIHBuZ19wdHItPm51bV9wYWxldHRlX21heCA9IChpbnQpICpycDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisKKyAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgIH0KK30KKyNlbmRpZiAvKiBDSEVDS19GT1JfSU5WQUxJRF9JTkRFWCAqLworCisjaWYgZGVmaW5lZChQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpIHx8IFwKKyAgICBkZWZpbmVkKFBOR19XUklURV9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpCisjaWZkZWYgUE5HX1VTRVJfVFJBTlNGT1JNX1BUUl9TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3VzZXJfdHJhbnNmb3JtX2luZm8ocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ192b2lkcAorICAgdXNlcl90cmFuc2Zvcm1fcHRyLCBpbnQgdXNlcl90cmFuc2Zvcm1fZGVwdGgsIGludCB1c2VyX3RyYW5zZm9ybV9jaGFubmVscykKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF91c2VyX3RyYW5zZm9ybV9pbmZvIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyNpZmRlZiBQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQKKyAgIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19JU19SRUFEX1NUUlVDVCkgIT0gMCAmJgorICAgICAgKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfUk9XX0lOSVQpICE9IDApCisgICB7CisgICAgICBwbmdfYXBwX2Vycm9yKHBuZ19wdHIsCisgICAgICAgICAgICAiaW5mbyBjaGFuZ2UgYWZ0ZXIgcG5nX3N0YXJ0X3JlYWRfaW1hZ2Ugb3IgcG5nX3JlYWRfdXBkYXRlX2luZm8iKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKyNlbmRpZgorCisgICBwbmdfcHRyLT51c2VyX3RyYW5zZm9ybV9wdHIgPSB1c2VyX3RyYW5zZm9ybV9wdHI7CisgICBwbmdfcHRyLT51c2VyX3RyYW5zZm9ybV9kZXB0aCA9IChwbmdfYnl0ZSl1c2VyX3RyYW5zZm9ybV9kZXB0aDsKKyAgIHBuZ19wdHItPnVzZXJfdHJhbnNmb3JtX2NoYW5uZWxzID0gKHBuZ19ieXRlKXVzZXJfdHJhbnNmb3JtX2NoYW5uZWxzOworfQorI2VuZGlmCisKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHVzZXJfdHJhbnNmb3JtX3B0ciBhc3NvY2lhdGVkIHdpdGgKKyAqIHRoZSB1c2VyIHRyYW5zZm9ybSBmdW5jdGlvbnMuICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGZyZWUgYW55IG1lbW9yeQorICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgcG9pbnRlciBiZWZvcmUgcG5nX3dyaXRlX2Rlc3Ryb3kgYW5kIHBuZ19yZWFkX2Rlc3Ryb3kKKyAqIGFyZSBjYWxsZWQuCisgKi8KKyNpZmRlZiBQTkdfVVNFUl9UUkFOU0ZPUk1fUFRSX1NVUFBPUlRFRAorcG5nX3ZvaWRwIFBOR0FQSQorcG5nX2dldF91c2VyX3RyYW5zZm9ybV9wdHIocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpCit7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuIChOVUxMKTsKKworICAgcmV0dXJuIHBuZ19wdHItPnVzZXJfdHJhbnNmb3JtX3B0cjsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1VTRVJfVFJBTlNGT1JNX0lORk9fU1VQUE9SVEVECitwbmdfdWludF8zMiBQTkdBUEkKK3BuZ19nZXRfY3VycmVudF9yb3dfbnVtYmVyKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyKQoreworICAgLyogU2VlIHRoZSBjb21tZW50cyBpbiBwbmcuaCAtIHRoaXMgaXMgdGhlIHN1Yi1pbWFnZSByb3cgd2hlbiByZWFkaW5nIGFuCisgICAgKiBpbnRlcmxhY2VkIGltYWdlLgorICAgICovCisgICBpZiAocG5nX3B0ciAhPSBOVUxMKQorICAgICAgcmV0dXJuIHBuZ19wdHItPnJvd19udW1iZXI7CisKKyAgIHJldHVybiBQTkdfVUlOVF8zMl9NQVg7IC8qIGhlbHAgdGhlIGFwcCBub3QgdG8gZmFpbCBzaWxlbnRseSAqLworfQorCitwbmdfYnl0ZSBQTkdBUEkKK3BuZ19nZXRfY3VycmVudF9wYXNzX251bWJlcihwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikKK3sKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwpCisgICAgICByZXR1cm4gcG5nX3B0ci0+cGFzczsKKyAgIHJldHVybiA4OyAvKiBpbnZhbGlkICovCit9CisjZW5kaWYgLyogVVNFUl9UUkFOU0ZPUk1fSU5GTyAqLworI2VuZGlmIC8qIFJFQURfVVNFUl9UUkFOU0ZPUk0gfHwgV1JJVEVfVVNFUl9UUkFOU0ZPUk0gKi8KKyNlbmRpZiAvKiBSRUFEIHx8IFdSSVRFICovCmRpZmYgLS1naXQgYS9saWJwbmcvcG5ndXNyLmRmYSBiL2xpYnBuZy9wbmd1c3IuZGZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMDY3YzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvcG5ndXNyLmRmYQpAQCAtMCwwICsxLDE0IEBACisjIHBuZ3Vzci5kZmEKKyMKKyMgQnVpbGQgdGltZSBjb25maWd1cmF0aW9uIG9mIGxpYnBuZworIworIyBFbnRlciBidWlsZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgaW4gdGhpcyBmaWxlCisjCisjIFNlY3VyaXR5IHNldHRpbmdzOiBieSBkZWZhdWx0IHRoZXNlIGxpbWl0cyBhcmUgdW5zZXQsIHlvdSBjYW4gY2hhbmdlIHRoZW0KKyMgaGVyZSBieSBlbnRlcmluZyB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzIGFzICNkZWZpbmVzIHByZWNlZGVkIGJ5ICdAJyAodG8gY2F1c2UsCisjIHRoZW0gdG8gYmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGJ1aWxkIG9mIHBuZ2xpYmNvbmYuaCksIGZvciBleGFtcGxlOgorIworIyBAIyBkZWZpbmUgUE5HX1VTRVJfV0lEVEhfTUFYIDY1NTM1CisjIEAjIGRlZmluZSBQTkdfVVNFUl9IRUlHSFRfTUFYIDY1NTM1CisjIEAjIGRlZmluZSBQTkdfVVNFUl9DSFVOS19DQUNIRV9NQVggMjU2CisjIEAjIGRlZmluZSBQTkdfVVNFUl9DSFVOS19NQUxMT0NfTUFYIDY0MDAwMApkaWZmIC0tZ2l0IGEvbGlicG5nL3BuZ3Vzci5oIGIvbGlicG5nL3BuZ3Vzci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMGQ3ODUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvcG5ndXNyLmgKQEAgLTAsMCArMSw0IEBACisjZGVmaW5lIFBOR19VU0VSX1BSSVZBVEVCVUlMRCAiU2tpYSBidWlsZDsgbm8gTU5HIGZlYXR1cmVzIgorI2RlZmluZSBQTkdfVVNFUl9ETExGTkFNRV9QT1NURklYICJTayIKKyNkZWZpbmUgUE5HX05PX01OR19GRUFUVVJFUworI2RlZmluZSBQTkdfTk9fUkVBRF9HQU1NQQpkaWZmIC0tZ2l0IGEvbGlicG5nL3BuZ3dpby5jIGIvbGlicG5nL3BuZ3dpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNzZlNmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvcG5nd2lvLmMKQEAgLTAsMCArMSwxNjggQEAKKworLyogcG5nd2lvLmMgLSBmdW5jdGlvbnMgZm9yIGRhdGEgb3V0cHV0CisgKgorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMTUgW05vdmVtYmVyIDIwLCAyMDE0XQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKKyAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKyAqCisgKiBUaGlzIGZpbGUgcHJvdmlkZXMgYSBsb2NhdGlvbiBmb3IgYWxsIG91dHB1dC4gIFVzZXJzIHdobyBuZWVkCisgKiBzcGVjaWFsIGhhbmRsaW5nIGFyZSBleHBlY3RlZCB0byB3cml0ZSBmdW5jdGlvbnMgdGhhdCBoYXZlIHRoZSBzYW1lCisgKiBhcmd1bWVudHMgYXMgdGhlc2UgYW5kIHBlcmZvcm0gc2ltaWxhciBmdW5jdGlvbnMsIGJ1dCB0aGF0IHBvc3NpYmx5CisgKiB1c2UgZGlmZmVyZW50IG91dHB1dCBtZXRob2RzLiAgTm90ZSB0aGF0IHlvdSBzaG91bGRuJ3QgY2hhbmdlIHRoZXNlCisgKiBmdW5jdGlvbnMsIGJ1dCByYXRoZXIgd3JpdGUgcmVwbGFjZW1lbnQgZnVuY3Rpb25zIGFuZCB0aGVuIGNoYW5nZQorICogdGhlbSBhdCBydW4gdGltZSB3aXRoIHBuZ19zZXRfd3JpdGVfZm4oLi4uKS4KKyAqLworCisjaW5jbHVkZSAicG5ncHJpdi5oIgorCisjaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAorCisvKiBXcml0ZSB0aGUgZGF0YSB0byB3aGF0ZXZlciBvdXRwdXQgeW91IGFyZSB1c2luZy4gIFRoZSBkZWZhdWx0IHJvdXRpbmUKKyAqIHdyaXRlcyB0byBhIGZpbGUgcG9pbnRlci4gIE5vdGUgdGhhdCB0aGlzIHJvdXRpbmUgc29tZXRpbWVzIGdldHMgY2FsbGVkCisgKiB3aXRoIHZlcnkgc21hbGwgbGVuZ3Rocywgc28geW91IHNob3VsZCBpbXBsZW1lbnQgc29tZSBraW5kIG9mIHNpbXBsZQorICogYnVmZmVyaW5nIGlmIHlvdSBhcmUgdXNpbmcgdW5idWZmZXJlZCB3cml0ZXMuICBUaGlzIHNob3VsZCBuZXZlciBiZSBhc2tlZAorICogdG8gd3JpdGUgbW9yZSB0aGFuIDY0SyBvbiBhIDE2LWJpdCBtYWNoaW5lLgorICovCisKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3dyaXRlX2RhdGEocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCkKK3sKKyAgIC8qIE5PVEU6IHdyaXRlX2RhdGFfZm4gbXVzdCBub3QgY2hhbmdlIHRoZSBidWZmZXIhICovCisgICBpZiAocG5nX3B0ci0+d3JpdGVfZGF0YV9mbiAhPSBOVUxMICkKKyAgICAgICgqKHBuZ19wdHItPndyaXRlX2RhdGFfZm4pKShwbmdfcHRyLCBwbmdfY29uc3RjYXN0KHBuZ19ieXRlcCxkYXRhKSwKKyAgICAgICAgIGxlbmd0aCk7CisKKyAgIGVsc2UKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiQ2FsbCB0byBOVUxMIHdyaXRlIGZ1bmN0aW9uIik7Cit9CisKKyNpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECisvKiBUaGlzIGlzIHRoZSBmdW5jdGlvbiB0aGF0IGRvZXMgdGhlIGFjdHVhbCB3cml0aW5nIG9mIGRhdGEuICBJZiB5b3UgYXJlCisgKiBub3Qgd3JpdGluZyB0byBhIHN0YW5kYXJkIEMgc3RyZWFtLCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIHJlcGxhY2VtZW50CisgKiB3cml0ZV9kYXRhIGZ1bmN0aW9uIGFuZCB1c2UgaXQgYXQgcnVuIHRpbWUgd2l0aCBwbmdfc2V0X3dyaXRlX2ZuKCksIHJhdGhlcgorICogdGhhbiBjaGFuZ2luZyB0aGUgbGlicmFyeS4KKyAqLwordm9pZCBQTkdDQkFQSQorcG5nX2RlZmF1bHRfd3JpdGVfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpCit7CisgICBwbmdfc2l6ZV90IGNoZWNrOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBjaGVjayA9IGZ3cml0ZShkYXRhLCAxLCBsZW5ndGgsIChwbmdfRklMRV9wKShwbmdfcHRyLT5pb19wdHIpKTsKKworICAgaWYgKGNoZWNrICE9IGxlbmd0aCkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiV3JpdGUgRXJyb3IiKTsKK30KKyNlbmRpZgorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBvdXRwdXQgYW55IGRhdGEgcGVuZGluZyB3cml0aW5nIChub3JtYWxseQorICogdG8gZGlzaykuICBBZnRlciBwbmdfZmx1c2ggaXMgY2FsbGVkLCB0aGVyZSBzaG91bGQgYmUgbm8gZGF0YSBwZW5kaW5nCisgKiB3cml0aW5nIGluIGFueSBidWZmZXJzLgorICovCisjaWZkZWYgUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRAordm9pZCAvKiBQUklWQVRFICovCitwbmdfZmx1c2gocG5nX3N0cnVjdHJwIHBuZ19wdHIpCit7CisgICBpZiAocG5nX3B0ci0+b3V0cHV0X2ZsdXNoX2ZuICE9IE5VTEwpCisgICAgICAoKihwbmdfcHRyLT5vdXRwdXRfZmx1c2hfZm4pKShwbmdfcHRyKTsKK30KKworIyAgaWZkZWYgUE5HX1NURElPX1NVUFBPUlRFRAordm9pZCBQTkdDQkFQSQorcG5nX2RlZmF1bHRfZmx1c2gocG5nX3N0cnVjdHAgcG5nX3B0cikKK3sKKyAgIHBuZ19GSUxFX3AgaW9fcHRyOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBpb19wdHIgPSBwbmdfdm9pZGNhc3QocG5nX0ZJTEVfcCwgKHBuZ19wdHItPmlvX3B0cikpOworICAgZmZsdXNoKGlvX3B0cik7Cit9CisjICBlbmRpZgorI2VuZGlmCisKKy8qIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byBzdXBwbHkgbmV3IG91dHB1dCBmdW5jdGlvbnMgZm9yCisgKiBsaWJwbmcgaWYgc3RhbmRhcmQgQyBzdHJlYW1zIGFyZW4ndCBiZWluZyB1c2VkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgYXMgaXRzIGFyZ3VtZW50czoKKyAqIHBuZ19wdHIgICAgICAgLSBwb2ludGVyIHRvIGEgcG5nIG91dHB1dCBkYXRhIHN0cnVjdHVyZQorICogaW9fcHRyICAgICAgICAtIHBvaW50ZXIgdG8gdXNlciBzdXBwbGllZCBzdHJ1Y3R1cmUgY29udGFpbmluZyBpbmZvIGFib3V0CisgKiAgICAgICAgICAgICAgICAgdGhlIG91dHB1dCBmdW5jdGlvbnMuICBNYXkgYmUgTlVMTC4KKyAqIHdyaXRlX2RhdGFfZm4gLSBwb2ludGVyIHRvIGEgbmV3IG91dHB1dCBmdW5jdGlvbiB0aGF0IHRha2VzIGFzIGl0cworICogICAgICAgICAgICAgICAgIGFyZ3VtZW50cyBhIHBvaW50ZXIgdG8gYSBwbmdfc3RydWN0LCBhIHBvaW50ZXIgdG8KKyAqICAgICAgICAgICAgICAgICBkYXRhIHRvIGJlIHdyaXR0ZW4sIGFuZCBhIDMyLWJpdCB1bnNpZ25lZCBpbnQgdGhhdCBpcworICogICAgICAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbi4gIFRoZSBuZXcgd3JpdGUKKyAqICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzaG91bGQgY2FsbCBwbmdfZXJyb3IocG5nX3B0ciwgIkVycm9yIG1zZyIpCisgKiAgICAgICAgICAgICAgICAgdG8gZXhpdCBhbmQgb3V0cHV0IGFueSBmYXRhbCBlcnJvciBtZXNzYWdlcy4gIE1heSBiZQorICogICAgICAgICAgICAgICAgIE5VTEwsIGluIHdoaWNoIGNhc2UgbGlicG5nJ3MgZGVmYXVsdCBmdW5jdGlvbiB3aWxsCisgKiAgICAgICAgICAgICAgICAgYmUgdXNlZC4KKyAqIGZsdXNoX2RhdGFfZm4gLSBwb2ludGVyIHRvIGEgbmV3IGZsdXNoIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYXMgaXRzCisgKiAgICAgICAgICAgICAgICAgYXJndW1lbnRzIGEgcG9pbnRlciB0byBhIHBuZ19zdHJ1Y3QuICBBZnRlciBhIGNhbGwgdG8KKyAqICAgICAgICAgICAgICAgICB0aGUgZmx1c2ggZnVuY3Rpb24sIHRoZXJlIHNob3VsZCBiZSBubyBkYXRhIGluIGFueSBidWZmZXJzCisgKiAgICAgICAgICAgICAgICAgb3IgcGVuZGluZyB0cmFuc21pc3Npb24uICBJZiB0aGUgb3V0cHV0IG1ldGhvZCBkb2Vzbid0IGRvCisgKiAgICAgICAgICAgICAgICAgYW55IGJ1ZmZlcmluZyBvZiBvdXRwdXQsIGEgZnVuY3Rpb24gcHJvdG90eXBlIG11c3Qgc3RpbGwgYmUKKyAqICAgICAgICAgICAgICAgICBzdXBwbGllZCBhbHRob3VnaCBpdCBkb2Vzbid0IGhhdmUgdG8gZG8gYW55dGhpbmcuICBJZgorICogICAgICAgICAgICAgICAgIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQgaXMgbm90IGRlZmluZWQgYXQgbGlicG5nIGNvbXBpbGUKKyAqICAgICAgICAgICAgICAgICB0aW1lLCBvdXRwdXRfZmx1c2hfZm4gd2lsbCBiZSBpZ25vcmVkLCBhbHRob3VnaCBpdCBtdXN0IGJlCisgKiAgICAgICAgICAgICAgICAgc3VwcGxpZWQgZm9yIGNvbXBhdGliaWxpdHkuICBNYXkgYmUgTlVMTCwgaW4gd2hpY2ggY2FzZQorICogICAgICAgICAgICAgICAgIGxpYnBuZydzIGRlZmF1bHQgZnVuY3Rpb24gd2lsbCBiZSB1c2VkLCBpZgorICogICAgICAgICAgICAgICAgIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQgaXMgZGVmaW5lZC4gIFRoaXMgaXMgbm90CisgKiAgICAgICAgICAgICAgICAgYSBnb29kIGlkZWEgaWYgaW9fcHRyIGRvZXMgbm90IHBvaW50IHRvIGEgc3RhbmRhcmQKKyAqICAgICAgICAgICAgICAgICAqRklMRSBzdHJ1Y3R1cmUuCisgKi8KK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3dyaXRlX2ZuKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfdm9pZHAgaW9fcHRyLAorICAgIHBuZ19yd19wdHIgd3JpdGVfZGF0YV9mbiwgcG5nX2ZsdXNoX3B0ciBvdXRwdXRfZmx1c2hfZm4pCit7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBwbmdfcHRyLT5pb19wdHIgPSBpb19wdHI7CisKKyNpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECisgICBpZiAod3JpdGVfZGF0YV9mbiAhPSBOVUxMKQorICAgICAgcG5nX3B0ci0+d3JpdGVfZGF0YV9mbiA9IHdyaXRlX2RhdGFfZm47CisKKyAgIGVsc2UKKyAgICAgIHBuZ19wdHItPndyaXRlX2RhdGFfZm4gPSBwbmdfZGVmYXVsdF93cml0ZV9kYXRhOworI2Vsc2UKKyAgIHBuZ19wdHItPndyaXRlX2RhdGFfZm4gPSB3cml0ZV9kYXRhX2ZuOworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVECisjICBpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECisKKyAgIGlmIChvdXRwdXRfZmx1c2hfZm4gIT0gTlVMTCkKKyAgICAgIHBuZ19wdHItPm91dHB1dF9mbHVzaF9mbiA9IG91dHB1dF9mbHVzaF9mbjsKKworICAgZWxzZQorICAgICAgcG5nX3B0ci0+b3V0cHV0X2ZsdXNoX2ZuID0gcG5nX2RlZmF1bHRfZmx1c2g7CisKKyMgIGVsc2UKKyAgIHBuZ19wdHItPm91dHB1dF9mbHVzaF9mbiA9IG91dHB1dF9mbHVzaF9mbjsKKyMgIGVuZGlmCisjZWxzZQorICAgUE5HX1VOVVNFRChvdXRwdXRfZmx1c2hfZm4pCisjZW5kaWYgLyogV1JJVEVfRkxVU0ggKi8KKworI2lmZGVmIFBOR19SRUFEX1NVUFBPUlRFRAorICAgLyogSXQgaXMgYW4gZXJyb3IgdG8gcmVhZCB3aGlsZSB3cml0aW5nIGEgcG5nIGZpbGUgKi8KKyAgIGlmIChwbmdfcHRyLT5yZWFkX2RhdGFfZm4gIT0gTlVMTCkKKyAgIHsKKyAgICAgIHBuZ19wdHItPnJlYWRfZGF0YV9mbiA9IE5VTEw7CisKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCisgICAgICAgICAgIkNhbid0IHNldCBib3RoIHJlYWRfZGF0YV9mbiBhbmQgd3JpdGVfZGF0YV9mbiBpbiB0aGUiCisgICAgICAgICAgIiBzYW1lIHN0cnVjdHVyZSIpOworICAgfQorI2VuZGlmCit9CisjZW5kaWYgLyogV1JJVEUgKi8KZGlmZiAtLWdpdCBhL2xpYnBuZy9wbmd3cml0ZS5jIGIvbGlicG5nL3BuZ3dyaXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ0ZWU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9wbmd3cml0ZS5jCkBAIC0wLDAgKzEsMjIzMCBAQAorCisvKiBwbmd3cml0ZS5jIC0gZ2VuZXJhbCByb3V0aW5lcyB0byB3cml0ZSBhIFBORyBmaWxlCisgKgorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMTkgW05vdmVtYmVyIDEyLCAyMDE1XQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTUgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKKyAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKyAqLworCisjaW5jbHVkZSAicG5ncHJpdi5oIgorI2lmIGRlZmluZWQoUE5HX1NJTVBMSUZJRURfV1JJVEVfU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19TVERJT19TVVBQT1JURUQpCisjICBpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECisKKyNpZmRlZiBQTkdfV1JJVEVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECisvKiBXcml0ZSBvdXQgYWxsIHRoZSB1bmtub3duIGNodW5rcyBmb3IgdGhlIGN1cnJlbnQgZ2l2ZW4gbG9jYXRpb24gKi8KK3N0YXRpYyB2b2lkCit3cml0ZV91bmtub3duX2NodW5rcyhwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0ciwKKyAgIHVuc2lnbmVkIGludCB3aGVyZSkKK3sKKyAgIGlmIChpbmZvX3B0ci0+dW5rbm93bl9jaHVua3NfbnVtICE9IDApCisgICB7CisgICAgICBwbmdfY29uc3RfdW5rbm93bl9jaHVua3AgdXA7CisKKyAgICAgIHBuZ19kZWJ1Zyg1LCAid3JpdGluZyBleHRyYSBjaHVua3MiKTsKKworICAgICAgZm9yICh1cCA9IGluZm9fcHRyLT51bmtub3duX2NodW5rczsKKyAgICAgICAgICAgdXAgPCBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3MgKyBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3NfbnVtOworICAgICAgICAgICArK3VwKQorICAgICAgICAgaWYgKCh1cC0+bG9jYXRpb24gJiB3aGVyZSkgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgIC8qIElmIHBlci1jaHVuayB1bmtub3duIGNodW5rIGhhbmRsaW5nIGlzIGVuYWJsZWQgdXNlIGl0LCBvdGhlcndpc2UKKyAgICAgICAgICAqIGp1c3Qgd3JpdGUgdGhlIGNodW5rcyB0aGUgYXBwbGljYXRpb24gaGFzIHNldC4KKyAgICAgICAgICAqLworI2lmZGVmIFBOR19TRVRfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECisgICAgICAgICBpbnQga2VlcCA9IHBuZ19oYW5kbGVfYXNfdW5rbm93bihwbmdfcHRyLCB1cC0+bmFtZSk7CisKKyAgICAgICAgIC8qIE5PVEU6IHRoaXMgY29kZSBpcyByYWRpY2FsbHkgZGlmZmVyZW50IGZyb20gdGhlIHJlYWQgc2lkZSBpbiB0aGUKKyAgICAgICAgICAqIG1hdHRlciBvZiBoYW5kbGluZyBhbiBhbmNpbGxhcnkgdW5rbm93biBjaHVuay4gIEluIHRoZSByZWFkIHNpZGUKKyAgICAgICAgICAqIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGRpc2NhcmQgaXQsIGluIHRoZSBjb2RlIGJlbG93IHRoZSBkZWZhdWx0CisgICAgICAgICAgKiBiZWhhdmlvciBpcyB0byB3cml0ZSBpdC4gIENyaXRpY2FsIGNodW5rcyBhcmUsIGhvd2V2ZXIsIG9ubHkKKyAgICAgICAgICAqIHdyaXR0ZW4gaWYgZXhwbGljaXRseSBsaXN0ZWQgb3IgaWYgdGhlIGRlZmF1bHQgaXMgc2V0IHRvIHdyaXRlIGFsbAorICAgICAgICAgICogdW5rbm93biBjaHVua3MuCisgICAgICAgICAgKgorICAgICAgICAgICogVGhlIGRlZmF1bHQgaGFuZGxpbmcgaXMgYWxzbyBzbGlnaHRseSB3ZWlyZCAtIGl0IGlzIG5vdCBwb3NzaWJsZSB0bworICAgICAgICAgICogc3RvcCB0aGUgd3JpdGluZyBvZiBhbGwgdW5zYWZlLXRvLWNvcHkgY2h1bmtzIQorICAgICAgICAgICoKKyAgICAgICAgICAqIFRPRE86IFJFVklFVzogdGhpcyB3b3VsZCBzZWVtIHRvIGJlIGEgYnVnLgorICAgICAgICAgICovCisgICAgICAgICBpZiAoa2VlcCAhPSBQTkdfSEFORExFX0NIVU5LX05FVkVSICYmCisgICAgICAgICAgICAgKCh1cC0+bmFtZVszXSAmIDB4MjApIC8qIHNhZmUtdG8tY29weSBvdmVycmlkZXMgZXZlcnl0aGluZyAqLyB8fAorICAgICAgICAgICAgICBrZWVwID09IFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTIHx8CisgICAgICAgICAgICAgIChrZWVwID09IFBOR19IQU5ETEVfQ0hVTktfQVNfREVGQVVMVCAmJgorICAgICAgICAgICAgICAgcG5nX3B0ci0+dW5rbm93bl9kZWZhdWx0ID09IFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTKSkpCisjZW5kaWYKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRPRE86IHJldmlldywgd2hhdCBpcyB3cm9uZyB3aXRoIGEgemVybyBsZW5ndGggdW5rbm93biBjaHVuaz8gKi8KKyAgICAgICAgICAgIGlmICh1cC0+c2l6ZSA9PSAwKQorICAgICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIldyaXRpbmcgemVyby1sZW5ndGggdW5rbm93biBjaHVuayIpOworCisgICAgICAgICAgICBwbmdfd3JpdGVfY2h1bmsocG5nX3B0ciwgdXAtPm5hbWUsIHVwLT5kYXRhLCB1cC0+c2l6ZSk7CisgICAgICAgICB9CisgICAgICB9CisgICB9Cit9CisjZW5kaWYgLyogV1JJVEVfVU5LTk9XTl9DSFVOS1MgKi8KKworLyogV3JpdGVzIGFsbCB0aGUgUE5HIGluZm9ybWF0aW9uLiAgVGhpcyBpcyB0aGUgc3VnZ2VzdGVkIHdheSB0byB1c2UgdGhlCisgKiBsaWJyYXJ5LiAgSWYgeW91IGhhdmUgYSBuZXcgY2h1bmsgdG8gYWRkLCBtYWtlIGEgZnVuY3Rpb24gdG8gd3JpdGUgaXQsCisgKiBhbmQgcHV0IGl0IGluIHRoZSBjb3JyZWN0IGxvY2F0aW9uIGhlcmUuICBJZiB5b3Ugd2FudCB0aGUgY2h1bmsgd3JpdHRlbgorICogYWZ0ZXIgdGhlIGltYWdlIGRhdGEsIHB1dCBpdCBpbiBwbmdfd3JpdGVfZW5kKCkuICBJIHN0cm9uZ2x5IGVuY291cmFnZQorICogeW91IHRvIHN1cHBseSBhIFBOR19JTkZPXyBmbGFnLCBhbmQgY2hlY2sgaW5mb19wdHItPnZhbGlkIGJlZm9yZSB3cml0aW5nCisgKiB0aGUgY2h1bmssIGFzIHRoYXQgd2lsbCBrZWVwIHRoZSBjb2RlIGZyb20gYnJlYWtpbmcgaWYgeW91IHdhbnQgdG8ganVzdAorICogd3JpdGUgYSBwbGFpbiBQTkcgZmlsZS4gIElmIHlvdSBoYXZlIGxvbmcgY29tbWVudHMsIEkgc3VnZ2VzdCB3cml0aW5nCisgKiB0aGVtIGluIHBuZ193cml0ZV9lbmQoKSwgYW5kIGNvbXByZXNzaW5nIHRoZW0uCisgKi8KK3ZvaWQgUE5HQVBJCitwbmdfd3JpdGVfaW5mb19iZWZvcmVfUExURShwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX2luZm9fYmVmb3JlX1BMVEUiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfV1JPVEVfSU5GT19CRUZPUkVfUExURSkgPT0gMCkKKyAgIHsKKyAgICAgIC8qIFdyaXRlIFBORyBzaWduYXR1cmUgKi8KKyAgICAgIHBuZ193cml0ZV9zaWcocG5nX3B0cik7CisKKyNpZmRlZiBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRAorICAgICAgaWYgKChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfUE5HX1NJR05BVFVSRSkgIT0gMCAmJiBcCisgICAgICAgICAgcG5nX3B0ci0+bW5nX2ZlYXR1cmVzX3Blcm1pdHRlZCAhPSAwKQorICAgICAgeworICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKKyAgICAgICAgICAgICAiTU5HIGZlYXR1cmVzIGFyZSBub3QgYWxsb3dlZCBpbiBhIFBORyBkYXRhc3RyZWFtIik7CisgICAgICAgICBwbmdfcHRyLT5tbmdfZmVhdHVyZXNfcGVybWl0dGVkID0gMDsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvKiBXcml0ZSBJSERSIGluZm9ybWF0aW9uLiAqLworICAgICAgcG5nX3dyaXRlX0lIRFIocG5nX3B0ciwgaW5mb19wdHItPndpZHRoLCBpbmZvX3B0ci0+aGVpZ2h0LAorICAgICAgICAgIGluZm9fcHRyLT5iaXRfZGVwdGgsIGluZm9fcHRyLT5jb2xvcl90eXBlLCBpbmZvX3B0ci0+Y29tcHJlc3Npb25fdHlwZSwKKyAgICAgICAgICBpbmZvX3B0ci0+ZmlsdGVyX3R5cGUsCisjaWZkZWYgUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAorICAgICAgICAgIGluZm9fcHRyLT5pbnRlcmxhY2VfdHlwZQorI2Vsc2UKKyAgICAgICAgICAwCisjZW5kaWYKKyAgICAgICAgICk7CisKKyAgICAgIC8qIFRoZSByZXN0IG9mIHRoZXNlIGNoZWNrIHRvIHNlZSBpZiB0aGUgdmFsaWQgZmllbGQgaGFzIHRoZSBhcHByb3ByaWF0ZQorICAgICAgICogZmxhZyBzZXQsIGFuZCBpZiBpdCBkb2VzLCB3cml0ZXMgdGhlIGNodW5rLgorICAgICAgICoKKyAgICAgICAqIDEuNi4wOiBDT0xPUlNQQUNFIHN1cHBvcnQgY29udHJvbHMgdGhlIHdyaXRpbmcgb2YgdGhlc2UgY2h1bmtzIHRvbywgYW5kCisgICAgICAgKiB0aGUgY2h1bmtzIHdpbGwgYmUgd3JpdHRlbiBpZiB0aGUgV1JJVEUgcm91dGluZSBpcyB0aGVyZSBhbmQKKyAgICAgICAqIGluZm9ybWF0aW9uICogaXMgYXZhaWxhYmxlIGluIHRoZSBDT0xPUlNQQUNFLiAoU2VlCisgICAgICAgKiBwbmdfY29sb3JzcGFjZV9zeW5jX2luZm8gaW4gcG5nLmMgZm9yIHdoZXJlIHRoZSB2YWxpZCBmbGFncyBnZXQgc2V0LikKKyAgICAgICAqCisgICAgICAgKiBVbmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMgdGhlIGNvbG9yc3BhY2UgY2FuIGJlIGludmFsaWRhdGVkIHdpdGhvdXQKKyAgICAgICAqIHN5bmNpbmcgdGhlIGluZm9fc3RydWN0ICd2YWxpZCcgZmxhZ3M7IHRoaXMgaGFwcGVucyBpZiBsaWJwbmcgZGV0ZWN0cworICAgICAgICogYW4gZXJyb3IgYW5kIGNhbGxzIHBuZ19lcnJvciB3aGlsZSB0aGUgY29sb3Igc3BhY2UgaXMgYmVpbmcgc2V0LCB5ZXQKKyAgICAgICAqIHRoZSBhcHBsaWNhdGlvbiBjb250aW51ZXMgd3JpdGluZyB0aGUgUE5HLiAgU28gY2hlY2sgdGhlICdpbnZhbGlkJworICAgICAgICogZmxhZyBoZXJlIHRvby4KKyAgICAgICAqLworI2lmZGVmIFBOR19HQU1NQV9TVVBQT1JURUQKKyMgIGlmZGVmIFBOR19XUklURV9nQU1BX1NVUFBPUlRFRAorICAgICAgaWYgKChpbmZvX3B0ci0+Y29sb3JzcGFjZS5mbGFncyAmIFBOR19DT0xPUlNQQUNFX0lOVkFMSUQpID09IDAgJiYKKyAgICAgICAgICAoaW5mb19wdHItPmNvbG9yc3BhY2UuZmxhZ3MgJiBQTkdfQ09MT1JTUEFDRV9GUk9NX2dBTUEpICE9IDAgJiYKKyAgICAgICAgICAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fZ0FNQSkgIT0gMCkKKyAgICAgICAgIHBuZ193cml0ZV9nQU1BX2ZpeGVkKHBuZ19wdHIsIGluZm9fcHRyLT5jb2xvcnNwYWNlLmdhbW1hKTsKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFBOR19DT0xPUlNQQUNFX1NVUFBPUlRFRAorICAgICAgLyogV3JpdGUgb25seSBvbmUgb2Ygc1JHQiBvciBhbiBJQ0MgcHJvZmlsZS4gIElmIGEgcHJvZmlsZSB3YXMgc3VwcGxpZWQKKyAgICAgICAqIGFuZCBpdCBtYXRjaGVzIG9uZSBvZiB0aGUga25vd24gc1JHQiBvbmVzIGlzc3VlIGEgd2FybmluZy4KKyAgICAgICAqLworIyAgaWZkZWYgUE5HX1dSSVRFX2lDQ1BfU1VQUE9SVEVECisgICAgICAgICBpZiAoKGluZm9fcHRyLT5jb2xvcnNwYWNlLmZsYWdzICYgUE5HX0NPTE9SU1BBQ0VfSU5WQUxJRCkgPT0gMCAmJgorICAgICAgICAgICAgIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19pQ0NQKSAhPSAwKQorICAgICAgICAgeworIyAgICBpZmRlZiBQTkdfV1JJVEVfc1JHQl9TVVBQT1JURUQKKyAgICAgICAgICAgICAgIGlmICgoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc1JHQikgIT0gMCkKKyAgICAgICAgICAgICAgICAgIHBuZ19hcHBfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAgICAgICAgICAgICAgInByb2ZpbGUgbWF0Y2hlcyBzUkdCIGJ1dCB3cml0aW5nIGlDQ1AgaW5zdGVhZCIpOworIyAgICAgZW5kaWYKKworICAgICAgICAgICAgcG5nX3dyaXRlX2lDQ1AocG5nX3B0ciwgaW5mb19wdHItPmljY3BfbmFtZSwKKyAgICAgICAgICAgICAgIGluZm9fcHRyLT5pY2NwX3Byb2ZpbGUpOworICAgICAgICAgfQorIyAgICAgaWZkZWYgUE5HX1dSSVRFX3NSR0JfU1VQUE9SVEVECisgICAgICAgICBlbHNlCisjICAgICBlbmRpZgorIyAgZW5kaWYKKworIyAgaWZkZWYgUE5HX1dSSVRFX3NSR0JfU1VQUE9SVEVECisgICAgICAgICBpZiAoKGluZm9fcHRyLT5jb2xvcnNwYWNlLmZsYWdzICYgUE5HX0NPTE9SU1BBQ0VfSU5WQUxJRCkgPT0gMCAmJgorICAgICAgICAgICAgIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19zUkdCKSAhPSAwKQorICAgICAgICAgICAgcG5nX3dyaXRlX3NSR0IocG5nX3B0ciwgaW5mb19wdHItPmNvbG9yc3BhY2UucmVuZGVyaW5nX2ludGVudCk7CisjICBlbmRpZiAvKiBXUklURV9zUkdCICovCisjZW5kaWYgLyogQ09MT1JTUEFDRSAqLworCisjaWZkZWYgUE5HX1dSSVRFX3NCSVRfU1VQUE9SVEVECisgICAgICAgICBpZiAoKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3NCSVQpICE9IDApCisgICAgICAgICAgICBwbmdfd3JpdGVfc0JJVChwbmdfcHRyLCAmKGluZm9fcHRyLT5zaWdfYml0KSwgaW5mb19wdHItPmNvbG9yX3R5cGUpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfQ09MT1JTUEFDRV9TVVBQT1JURUQKKyMgIGlmZGVmIFBOR19XUklURV9jSFJNX1NVUFBPUlRFRAorICAgICAgICAgaWYgKChpbmZvX3B0ci0+Y29sb3JzcGFjZS5mbGFncyAmIFBOR19DT0xPUlNQQUNFX0lOVkFMSUQpID09IDAgJiYKKyAgICAgICAgICAgICAoaW5mb19wdHItPmNvbG9yc3BhY2UuZmxhZ3MgJiBQTkdfQ09MT1JTUEFDRV9GUk9NX2NIUk0pICE9IDAgJiYKKyAgICAgICAgICAgICAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fY0hSTSkgIT0gMCkKKyAgICAgICAgICAgIHBuZ193cml0ZV9jSFJNX2ZpeGVkKHBuZ19wdHIsICZpbmZvX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX3h5KTsKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKKyAgICAgICAgIHdyaXRlX3Vua25vd25fY2h1bmtzKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfSEFWRV9JSERSKTsKKyNlbmRpZgorCisgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19XUk9URV9JTkZPX0JFRk9SRV9QTFRFOworICAgfQorfQorCit2b2lkIFBOR0FQSQorcG5nX3dyaXRlX2luZm8ocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpCit7CisjaWYgZGVmaW5lZChQTkdfV1JJVEVfVEVYVF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX3NQTFRfU1VQUE9SVEVEKQorICAgaW50IGk7CisjZW5kaWYKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfaW5mbyIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIHBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFKHBuZ19wdHIsIGluZm9fcHRyKTsKKworICAgaWYgKChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19QTFRFKSAhPSAwKQorICAgICAgcG5nX3dyaXRlX1BMVEUocG5nX3B0ciwgaW5mb19wdHItPnBhbGV0dGUsCisgICAgICAgICAgKHBuZ191aW50XzMyKWluZm9fcHRyLT5udW1fcGFsZXR0ZSk7CisKKyAgIGVsc2UgaWYgKGluZm9fcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlZhbGlkIHBhbGV0dGUgcmVxdWlyZWQgZm9yIHBhbGV0dGVkIGltYWdlcyIpOworCisjaWZkZWYgUE5HX1dSSVRFX3RSTlNfU1VQUE9SVEVECisgICBpZiAoKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3RSTlMpICE9MCkKKyAgIHsKKyNpZmRlZiBQTkdfV1JJVEVfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRAorICAgICAgLyogSW52ZXJ0IHRoZSBhbHBoYSBjaGFubmVsIChpbiB0Uk5TKSAqLworICAgICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5WRVJUX0FMUEhBKSAhPSAwICYmCisgICAgICAgICAgaW5mb19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgICAgIHsKKyAgICAgICAgIGludCBqLCBqZW5kOworCisgICAgICAgICBqZW5kID0gaW5mb19wdHItPm51bV90cmFuczsKKyAgICAgICAgIGlmIChqZW5kID4gUE5HX01BWF9QQUxFVFRFX0xFTkdUSCkKKyAgICAgICAgICAgIGplbmQgPSBQTkdfTUFYX1BBTEVUVEVfTEVOR1RIOworCisgICAgICAgICBmb3IgKGogPSAwOyBqPGplbmQ7ICsraikKKyAgICAgICAgICAgIGluZm9fcHRyLT50cmFuc19hbHBoYVtqXSA9CisgICAgICAgICAgICAgICAocG5nX2J5dGUpKDI1NSAtIGluZm9fcHRyLT50cmFuc19hbHBoYVtqXSk7CisgICAgICB9CisjZW5kaWYKKyAgICAgIHBuZ193cml0ZV90Uk5TKHBuZ19wdHIsIGluZm9fcHRyLT50cmFuc19hbHBoYSwgJihpbmZvX3B0ci0+dHJhbnNfY29sb3IpLAorICAgICAgICAgIGluZm9fcHRyLT5udW1fdHJhbnMsIGluZm9fcHRyLT5jb2xvcl90eXBlKTsKKyAgIH0KKyNlbmRpZgorI2lmZGVmIFBOR19XUklURV9iS0dEX1NVUFBPUlRFRAorICAgaWYgKChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19iS0dEKSAhPSAwKQorICAgICAgcG5nX3dyaXRlX2JLR0QocG5nX3B0ciwgJihpbmZvX3B0ci0+YmFja2dyb3VuZCksIGluZm9fcHRyLT5jb2xvcl90eXBlKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX2hJU1RfU1VQUE9SVEVECisgICBpZiAoKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2hJU1QpICE9IDApCisgICAgICBwbmdfd3JpdGVfaElTVChwbmdfcHRyLCBpbmZvX3B0ci0+aGlzdCwgaW5mb19wdHItPm51bV9wYWxldHRlKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX29GRnNfU1VQUE9SVEVECisgICBpZiAoKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX29GRnMpICE9IDApCisgICAgICBwbmdfd3JpdGVfb0ZGcyhwbmdfcHRyLCBpbmZvX3B0ci0+eF9vZmZzZXQsIGluZm9fcHRyLT55X29mZnNldCwKKyAgICAgICAgICBpbmZvX3B0ci0+b2Zmc2V0X3VuaXRfdHlwZSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9wQ0FMX1NVUFBPUlRFRAorICAgaWYgKChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19wQ0FMKSAhPSAwKQorICAgICAgcG5nX3dyaXRlX3BDQUwocG5nX3B0ciwgaW5mb19wdHItPnBjYWxfcHVycG9zZSwgaW5mb19wdHItPnBjYWxfWDAsCisgICAgICAgICAgaW5mb19wdHItPnBjYWxfWDEsIGluZm9fcHRyLT5wY2FsX3R5cGUsIGluZm9fcHRyLT5wY2FsX25wYXJhbXMsCisgICAgICAgICAgaW5mb19wdHItPnBjYWxfdW5pdHMsIGluZm9fcHRyLT5wY2FsX3BhcmFtcyk7CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9zQ0FMX1NVUFBPUlRFRAorICAgaWYgKChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19zQ0FMKSAhPSAwKQorICAgICAgcG5nX3dyaXRlX3NDQUxfcyhwbmdfcHRyLCAoaW50KWluZm9fcHRyLT5zY2FsX3VuaXQsCisgICAgICAgICAgaW5mb19wdHItPnNjYWxfc193aWR0aCwgaW5mb19wdHItPnNjYWxfc19oZWlnaHQpOworI2VuZGlmIC8qIHNDQUwgKi8KKworI2lmZGVmIFBOR19XUklURV9wSFlzX1NVUFBPUlRFRAorICAgaWYgKChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19wSFlzKSAhPSAwKQorICAgICAgcG5nX3dyaXRlX3BIWXMocG5nX3B0ciwgaW5mb19wdHItPnhfcGl4ZWxzX3Blcl91bml0LAorICAgICAgICAgIGluZm9fcHRyLT55X3BpeGVsc19wZXJfdW5pdCwgaW5mb19wdHItPnBoeXNfdW5pdF90eXBlKTsKKyNlbmRpZiAvKiBwSFlzICovCisKKyNpZmRlZiBQTkdfV1JJVEVfdElNRV9TVVBQT1JURUQKKyAgIGlmICgoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fdElNRSkgIT0gMCkKKyAgIHsKKyAgICAgIHBuZ193cml0ZV90SU1FKHBuZ19wdHIsICYoaW5mb19wdHItPm1vZF90aW1lKSk7CisgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19XUk9URV90SU1FOworICAgfQorI2VuZGlmIC8qIHRJTUUgKi8KKworI2lmZGVmIFBOR19XUklURV9zUExUX1NVUFBPUlRFRAorICAgaWYgKChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19zUExUKSAhPSAwKQorICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpaW5mb19wdHItPnNwbHRfcGFsZXR0ZXNfbnVtOyBpKyspCisgICAgICAgICBwbmdfd3JpdGVfc1BMVChwbmdfcHRyLCBpbmZvX3B0ci0+c3BsdF9wYWxldHRlcyArIGkpOworI2VuZGlmIC8qIHNQTFQgKi8KKworI2lmZGVmIFBOR19XUklURV9URVhUX1NVUFBPUlRFRAorICAgLyogQ2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gd3JpdGUgdGV4dCBjaHVua3MgKi8KKyAgIGZvciAoaSA9IDA7IGkgPCBpbmZvX3B0ci0+bnVtX3RleHQ7IGkrKykKKyAgIHsKKyAgICAgIHBuZ19kZWJ1ZzIoMiwgIldyaXRpbmcgaGVhZGVyIHRleHQgY2h1bmsgJWQsIHR5cGUgJWQiLCBpLAorICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uKTsKKyAgICAgIC8qIEFuIGludGVybmF0aW9uYWxpemVkIGNodW5rPyAqLworICAgICAgaWYgKGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uID4gMCkKKyAgICAgIHsKKyNpZmRlZiBQTkdfV1JJVEVfaVRYdF9TVVBQT1JURUQKKyAgICAgICAgIC8qIFdyaXRlIGludGVybmF0aW9uYWwgY2h1bmsgKi8KKyAgICAgICAgIHBuZ193cml0ZV9pVFh0KHBuZ19wdHIsCisgICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0uY29tcHJlc3Npb24sCisgICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0ua2V5LAorICAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmxhbmcsCisgICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0ubGFuZ19rZXksCisgICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0udGV4dCk7CisgICAgICAgICAvKiBNYXJrIHRoaXMgY2h1bmsgYXMgd3JpdHRlbiAqLworICAgICAgICAgaWYgKGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uID09IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUpCisgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkVfV1I7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHRfV1I7CisjZWxzZQorICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVuYWJsZSB0byB3cml0ZSBpbnRlcm5hdGlvbmFsIHRleHQiKTsKKyNlbmRpZgorICAgICAgfQorCisgICAgICAvKiBJZiB3ZSB3YW50IGEgY29tcHJlc3NlZCB0ZXh0IGNodW5rICovCisgICAgICBlbHNlIGlmIChpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiA9PSBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0KQorICAgICAgeworI2lmZGVmIFBOR19XUklURV96VFh0X1NVUFBPUlRFRAorICAgICAgICAgLyogV3JpdGUgY29tcHJlc3NlZCBjaHVuayAqLworICAgICAgICAgcG5nX3dyaXRlX3pUWHQocG5nX3B0ciwgaW5mb19wdHItPnRleHRbaV0ua2V5LAorICAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLnRleHQsIGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uKTsKKyAgICAgICAgIC8qIE1hcmsgdGhpcyBjaHVuayBhcyB3cml0dGVuICovCisgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHRfV1I7CisjZWxzZQorICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVuYWJsZSB0byB3cml0ZSBjb21wcmVzc2VkIHRleHQiKTsKKyNlbmRpZgorICAgICAgfQorCisgICAgICBlbHNlIGlmIChpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiA9PSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FKQorICAgICAgeworI2lmZGVmIFBOR19XUklURV90RVh0X1NVUFBPUlRFRAorICAgICAgICAgLyogV3JpdGUgdW5jb21wcmVzc2VkIGNodW5rICovCisgICAgICAgICBwbmdfd3JpdGVfdEVYdChwbmdfcHRyLCBpbmZvX3B0ci0+dGV4dFtpXS5rZXksCisgICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0udGV4dCwKKyAgICAgICAgICAgICAwKTsKKyAgICAgICAgIC8qIE1hcmsgdGhpcyBjaHVuayBhcyB3cml0dGVuICovCisgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkVfV1I7CisjZWxzZQorICAgICAgICAgLyogQ2FuJ3QgZ2V0IGhlcmUgKi8KKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJVbmFibGUgdG8gd3JpdGUgdW5jb21wcmVzc2VkIHRleHQiKTsKKyNlbmRpZgorICAgICAgfQorICAgfQorI2VuZGlmIC8qIHRFWHQgKi8KKworI2lmZGVmIFBOR19XUklURV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKKyAgIHdyaXRlX3Vua25vd25fY2h1bmtzKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfSEFWRV9QTFRFKTsKKyNlbmRpZgorfQorCisvKiBXcml0ZXMgdGhlIGVuZCBvZiB0aGUgUE5HIGZpbGUuICBJZiB5b3UgZG9uJ3Qgd2FudCB0byB3cml0ZSBjb21tZW50cyBvcgorICogdGltZSBpbmZvcm1hdGlvbiwgeW91IGNhbiBwYXNzIE5VTEwgZm9yIGluZm8uICBJZiB5b3UgYWxyZWFkeSB3cm90ZSB0aGVzZQorICogaW4gcG5nX3dyaXRlX2luZm8oKSwgZG8gbm90IHdyaXRlIHRoZW0gYWdhaW4gaGVyZS4gIElmIHlvdSBoYXZlIGxvbmcKKyAqIGNvbW1lbnRzLCBJIHN1Z2dlc3Qgd3JpdGluZyB0aGVtIGhlcmUsIGFuZCBjb21wcmVzc2luZyB0aGVtLgorICovCit2b2lkIFBOR0FQSQorcG5nX3dyaXRlX2VuZChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0cikKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX2VuZCIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKSA9PSAwKQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJObyBJREFUcyB3cml0dGVuIGludG8gZmlsZSIpOworCisjaWZkZWYgUE5HX1dSSVRFX0NIRUNLX0ZPUl9JTlZBTElEX0lOREVYX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHItPm51bV9wYWxldHRlX21heCA+IHBuZ19wdHItPm51bV9wYWxldHRlKQorICAgICAgcG5nX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiV3JvdGUgcGFsZXR0ZSBpbmRleCBleGNlZWRpbmcgbnVtX3BhbGV0dGUiKTsKKyNlbmRpZgorCisgICAvKiBTZWUgaWYgdXNlciB3YW50cyB1cyB0byB3cml0ZSBpbmZvcm1hdGlvbiBjaHVua3MgKi8KKyAgIGlmIChpbmZvX3B0ciAhPSBOVUxMKQorICAgeworI2lmZGVmIFBOR19XUklURV9URVhUX1NVUFBPUlRFRAorICAgICAgaW50IGk7IC8qIGxvY2FsIGluZGV4IHZhcmlhYmxlICovCisjZW5kaWYKKyNpZmRlZiBQTkdfV1JJVEVfdElNRV9TVVBQT1JURUQKKyAgICAgIC8qIENoZWNrIHRvIHNlZSBpZiB1c2VyIGhhcyBzdXBwbGllZCBhIHRpbWUgY2h1bmsgKi8KKyAgICAgIGlmICgoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fdElNRSkgIT0gMCAmJgorICAgICAgICAgIChwbmdfcHRyLT5tb2RlICYgUE5HX1dST1RFX3RJTUUpID09IDApCisgICAgICAgICBwbmdfd3JpdGVfdElNRShwbmdfcHRyLCAmKGluZm9fcHRyLT5tb2RfdGltZSkpOworCisjZW5kaWYKKyNpZmRlZiBQTkdfV1JJVEVfVEVYVF9TVVBQT1JURUQKKyAgICAgIC8qIExvb3AgdGhyb3VnaCBjb21tZW50IGNodW5rcyAqLworICAgICAgZm9yIChpID0gMDsgaSA8IGluZm9fcHRyLT5udW1fdGV4dDsgaSsrKQorICAgICAgeworICAgICAgICAgcG5nX2RlYnVnMigyLCAiV3JpdGluZyB0cmFpbGVyIHRleHQgY2h1bmsgJWQsIHR5cGUgJWQiLCBpLAorICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0uY29tcHJlc3Npb24pOworICAgICAgICAgLyogQW4gaW50ZXJuYXRpb25hbGl6ZWQgY2h1bms/ICovCisgICAgICAgICBpZiAoaW5mb19wdHItPnRleHRbaV0uY29tcHJlc3Npb24gPiAwKQorICAgICAgICAgeworI2lmZGVmIFBOR19XUklURV9pVFh0X1NVUFBPUlRFRAorICAgICAgICAgICAgLyogV3JpdGUgaW50ZXJuYXRpb25hbCBjaHVuayAqLworICAgICAgICAgICAgcG5nX3dyaXRlX2lUWHQocG5nX3B0ciwKKyAgICAgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiwKKyAgICAgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5rZXksCisgICAgICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0ubGFuZywKKyAgICAgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5sYW5nX2tleSwKKyAgICAgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS50ZXh0KTsKKyAgICAgICAgICAgIC8qIE1hcmsgdGhpcyBjaHVuayBhcyB3cml0dGVuICovCisgICAgICAgICAgICBpZiAoaW5mb19wdHItPnRleHRbaV0uY29tcHJlc3Npb24gPT0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORSkKKyAgICAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uID0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORV9XUjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uID0gUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdF9XUjsKKyNlbHNlCisgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVW5hYmxlIHRvIHdyaXRlIGludGVybmF0aW9uYWwgdGV4dCIpOworI2VuZGlmCisgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UgaWYgKGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uID49IFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQpCisgICAgICAgICB7CisjaWZkZWYgUE5HX1dSSVRFX3pUWHRfU1VQUE9SVEVECisgICAgICAgICAgICAvKiBXcml0ZSBjb21wcmVzc2VkIGNodW5rICovCisgICAgICAgICAgICBwbmdfd3JpdGVfelRYdChwbmdfcHRyLCBpbmZvX3B0ci0+dGV4dFtpXS5rZXksCisgICAgICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0udGV4dCwgaW5mb19wdHItPnRleHRbaV0uY29tcHJlc3Npb24pOworICAgICAgICAgICAgLyogTWFyayB0aGlzIGNodW5rIGFzIHdyaXR0ZW4gKi8KKyAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uID0gUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdF9XUjsKKyNlbHNlCisgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVW5hYmxlIHRvIHdyaXRlIGNvbXByZXNzZWQgdGV4dCIpOworI2VuZGlmCisgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UgaWYgKGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uID09IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUpCisgICAgICAgICB7CisjaWZkZWYgUE5HX1dSSVRFX3RFWHRfU1VQUE9SVEVECisgICAgICAgICAgICAvKiBXcml0ZSB1bmNvbXByZXNzZWQgY2h1bmsgKi8KKyAgICAgICAgICAgIHBuZ193cml0ZV90RVh0KHBuZ19wdHIsIGluZm9fcHRyLT50ZXh0W2ldLmtleSwKKyAgICAgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS50ZXh0LCAwKTsKKyAgICAgICAgICAgIC8qIE1hcmsgdGhpcyBjaHVuayBhcyB3cml0dGVuICovCisgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkVfV1I7CisjZWxzZQorICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVuYWJsZSB0byB3cml0ZSB1bmNvbXByZXNzZWQgdGV4dCIpOworI2VuZGlmCisgICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyNpZmRlZiBQTkdfV1JJVEVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECisgICAgICB3cml0ZV91bmtub3duX2NodW5rcyhwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0FGVEVSX0lEQVQpOworI2VuZGlmCisgICB9CisKKyAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0FGVEVSX0lEQVQ7CisKKyAgIC8qIFdyaXRlIGVuZCBvZiBQTkcgZmlsZSAqLworICAgcG5nX3dyaXRlX0lFTkQocG5nX3B0cik7CisKKyAgIC8qIFRoaXMgZmx1c2gsIGFkZGVkIGluIGxpYnBuZy0xLjAuOCwgcmVtb3ZlZCBmcm9tIGxpYnBuZy0xLjAuOWJldGEwMywKKyAgICAqIGFuZCByZXN0b3JlZCBhZ2FpbiBpbiBsaWJwbmctMS4yLjMwLCBtYXkgY2F1c2Ugc29tZSBhcHBsaWNhdGlvbnMgdGhhdAorICAgICogZG8gbm90IHNldCBwbmdfcHRyLT5vdXRwdXRfZmx1c2hfZm4gdG8gY3Jhc2guICBJZiB5b3VyIGFwcGxpY2F0aW9uCisgICAgKiBleHBlcmllbmNlcyBhIHByb2JsZW0sIHBsZWFzZSB0cnkgYnVpbGRpbmcgbGlicG5nIHdpdGgKKyAgICAqIFBOR19XUklURV9GTFVTSF9BRlRFUl9JRU5EX1NVUFBPUlRFRCBkZWZpbmVkLCBhbmQgcmVwb3J0IHRoZSBldmVudCB0bworICAgICogcG5nLW1uZy1pbXBsZW1lbnQgYXQgbGlzdHMuc2YubmV0IC4KKyAgICAqLworI2lmZGVmIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQKKyMgIGlmZGVmIFBOR19XUklURV9GTFVTSF9BRlRFUl9JRU5EX1NVUFBPUlRFRAorICAgcG5nX2ZsdXNoKHBuZ19wdHIpOworIyAgZW5kaWYKKyNlbmRpZgorfQorCisjaWZkZWYgUE5HX0NPTlZFUlRfdElNRV9TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bShwbmdfdGltZXAgcHRpbWUsIFBOR19DT05TVCBzdHJ1Y3QgdG0gKiB0dGltZSkKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2NvbnZlcnRfZnJvbV9zdHJ1Y3RfdG0iKTsKKworICAgcHRpbWUtPnllYXIgPSAocG5nX3VpbnRfMTYpKDE5MDAgKyB0dGltZS0+dG1feWVhcik7CisgICBwdGltZS0+bW9udGggPSAocG5nX2J5dGUpKHR0aW1lLT50bV9tb24gKyAxKTsKKyAgIHB0aW1lLT5kYXkgPSAocG5nX2J5dGUpdHRpbWUtPnRtX21kYXk7CisgICBwdGltZS0+aG91ciA9IChwbmdfYnl0ZSl0dGltZS0+dG1faG91cjsKKyAgIHB0aW1lLT5taW51dGUgPSAocG5nX2J5dGUpdHRpbWUtPnRtX21pbjsKKyAgIHB0aW1lLT5zZWNvbmQgPSAocG5nX2J5dGUpdHRpbWUtPnRtX3NlYzsKK30KKwordm9pZCBQTkdBUEkKK3BuZ19jb252ZXJ0X2Zyb21fdGltZV90KHBuZ190aW1lcCBwdGltZSwgdGltZV90IHR0aW1lKQoreworICAgc3RydWN0IHRtICp0YnVmOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19jb252ZXJ0X2Zyb21fdGltZV90Iik7CisKKyAgIHRidWYgPSBnbXRpbWUoJnR0aW1lKTsKKyAgIHBuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtKHB0aW1lLCB0YnVmKTsKK30KKyNlbmRpZgorCisvKiBJbml0aWFsaXplIHBuZ19wdHIgc3RydWN0dXJlLCBhbmQgYWxsb2NhdGUgYW55IG1lbW9yeSBuZWVkZWQgKi8KK1BOR19GVU5DVElPTihwbmdfc3RydWN0cCxQTkdBUEkKK3BuZ19jcmVhdGVfd3JpdGVfc3RydWN0LChwbmdfY29uc3RfY2hhcnAgdXNlcl9wbmdfdmVyLCBwbmdfdm9pZHAgZXJyb3JfcHRyLAorICAgIHBuZ19lcnJvcl9wdHIgZXJyb3JfZm4sIHBuZ19lcnJvcl9wdHIgd2Fybl9mbiksUE5HX0FMTE9DQVRFRCkKK3sKKyNpZm5kZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAorICAgcG5nX3N0cnVjdHJwIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3BuZ19zdHJ1Y3QodXNlcl9wbmdfdmVyLCBlcnJvcl9wdHIsCisgICAgICAgZXJyb3JfZm4sIHdhcm5fZm4sIE5VTEwsIE5VTEwsIE5VTEwpOworI2Vsc2UKKyAgIHJldHVybiBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdF8yKHVzZXJfcG5nX3ZlciwgZXJyb3JfcHRyLCBlcnJvcl9mbiwKKyAgICAgICB3YXJuX2ZuLCBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKworLyogQWx0ZXJuYXRlIGluaXRpYWxpemUgcG5nX3B0ciBzdHJ1Y3R1cmUsIGFuZCBhbGxvY2F0ZSBhbnkgbWVtb3J5IG5lZWRlZCAqLworUE5HX0ZVTkNUSU9OKHBuZ19zdHJ1Y3RwLFBOR0FQSQorcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMiwocG5nX2NvbnN0X2NoYXJwIHVzZXJfcG5nX3ZlciwgcG5nX3ZvaWRwIGVycm9yX3B0ciwKKyAgICBwbmdfZXJyb3JfcHRyIGVycm9yX2ZuLCBwbmdfZXJyb3JfcHRyIHdhcm5fZm4sIHBuZ192b2lkcCBtZW1fcHRyLAorICAgIHBuZ19tYWxsb2NfcHRyIG1hbGxvY19mbiwgcG5nX2ZyZWVfcHRyIGZyZWVfZm4pLFBOR19BTExPQ0FURUQpCit7CisgICBwbmdfc3RydWN0cnAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfcG5nX3N0cnVjdCh1c2VyX3BuZ192ZXIsIGVycm9yX3B0ciwKKyAgICAgICBlcnJvcl9mbiwgd2Fybl9mbiwgbWVtX3B0ciwgbWFsbG9jX2ZuLCBmcmVlX2ZuKTsKKyNlbmRpZiAvKiBVU0VSX01FTSAqLworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCkKKyAgIHsKKyAgICAgIC8qIFNldCB0aGUgemxpYiBjb250cm9sIHZhbHVlcyB0byBkZWZhdWx0czsgdGhleSBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUKKyAgICAgICAqIGFwcGxpY2F0aW9uIGFmdGVyIHRoZSBzdHJ1Y3QgaGFzIGJlZW4gY3JlYXRlZC4KKyAgICAgICAqLworICAgICAgcG5nX3B0ci0+emJ1ZmZlcl9zaXplID0gUE5HX1pCVUZfU0laRTsKKworICAgICAgLyogVGhlICd6bGliX3N0cmF0ZWd5JyBzZXR0aW5nIGlzIGlycmVsZXZhbnQgYmVjYXVzZSBwbmdfZGVmYXVsdF9jbGFpbSBpbgorICAgICAgICogcG5nd3V0aWwuYyBkZWZhdWx0cyBpdCBhY2NvcmRpbmcgdG8gd2hldGhlciBvciBub3QgZmlsdGVycyB3aWxsIGJlCisgICAgICAgKiB1c2VkLCBhbmQgaWdub3JlcyB0aGlzIHNldHRpbmcuCisgICAgICAgKi8KKyAgICAgIHBuZ19wdHItPnpsaWJfc3RyYXRlZ3kgPSBQTkdfWl9ERUZBVUxUX1NUUkFURUdZOworICAgICAgcG5nX3B0ci0+emxpYl9sZXZlbCA9IFBOR19aX0RFRkFVTFRfQ09NUFJFU1NJT047CisgICAgICBwbmdfcHRyLT56bGliX21lbV9sZXZlbCA9IDg7CisgICAgICBwbmdfcHRyLT56bGliX3dpbmRvd19iaXRzID0gMTU7CisgICAgICBwbmdfcHRyLT56bGliX21ldGhvZCA9IDg7CisKKyNpZmRlZiBQTkdfV1JJVEVfQ09NUFJFU1NFRF9URVhUX1NVUFBPUlRFRAorICAgICAgcG5nX3B0ci0+emxpYl90ZXh0X3N0cmF0ZWd5ID0gUE5HX1RFWFRfWl9ERUZBVUxUX1NUUkFURUdZOworICAgICAgcG5nX3B0ci0+emxpYl90ZXh0X2xldmVsID0gUE5HX1RFWFRfWl9ERUZBVUxUX0NPTVBSRVNTSU9OOworICAgICAgcG5nX3B0ci0+emxpYl90ZXh0X21lbV9sZXZlbCA9IDg7CisgICAgICBwbmdfcHRyLT56bGliX3RleHRfd2luZG93X2JpdHMgPSAxNTsKKyAgICAgIHBuZ19wdHItPnpsaWJfdGV4dF9tZXRob2QgPSA4OworI2VuZGlmIC8qIFdSSVRFX0NPTVBSRVNTRURfVEVYVCAqLworCisgICAgICAvKiBUaGlzIGlzIGEgaGlnaGx5IGR1YmlvdXMgY29uZmlndXJhdGlvbiBvcHRpb247IGJ5IGRlZmF1bHQgaXQgaXMgb2ZmLAorICAgICAgICogYnV0IGl0IG1heSBiZSBhcHByb3ByaWF0ZSBmb3IgcHJpdmF0ZSBidWlsZHMgdGhhdCBhcmUgdGVzdGluZworICAgICAgICogZXh0ZW5zaW9ucyBub3QgY29uZm9ybWFudCB0byB0aGUgY3VycmVudCBzcGVjaWZpY2F0aW9uLCBvciBvZgorICAgICAgICogYXBwbGljYXRpb25zIHRoYXQgbXVzdCBub3QgZmFpbCB0byB3cml0ZSBhdCBhbGwgY29zdHMhCisgICAgICAgKi8KKyNpZmRlZiBQTkdfQkVOSUdOX1dSSVRFX0VSUk9SU19TVVBQT1JURUQKKyAgICAgIC8qIEluIHN0YWJsZSBidWlsZHMgb25seSB3YXJuIGlmIGFuIGFwcGxpY2F0aW9uIGVycm9yIGNhbiBiZSBjb21wbGV0ZWx5CisgICAgICAgKiBoYW5kbGVkLgorICAgICAgICovCisgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19CRU5JR05fRVJST1JTX1dBUk47CisjZW5kaWYKKworICAgICAgLyogQXBwIHdhcm5pbmdzIGFyZSB3YXJuaW5ncyBpbiByZWxlYXNlIChvciByZWxlYXNlIGNhbmRpZGF0ZSkgYnVpbGRzIGJ1dAorICAgICAgICogYXJlIGVycm9ycyBkdXJpbmcgZGV2ZWxvcG1lbnQuCisgICAgICAgKi8KKyNpZiBQTkdfUkVMRUFTRV9CVUlMRAorICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfQVBQX1dBUk5JTkdTX1dBUk47CisjZW5kaWYKKworICAgICAgLyogVE9ETzogZGVsYXkgdGhpcywgaXQgY2FuIGJlIGRvbmUgaW4gcG5nX2luaXRfaW8oKSAoaWYgdGhlIGFwcCBkb2Vzbid0CisgICAgICAgKiBkbyBpdCBpdHNlbGYpIGF2b2lkaW5nIHNldHRpbmcgdGhlIGRlZmF1bHQgZnVuY3Rpb24gaWYgaXQgaXMgbm90CisgICAgICAgKiByZXF1aXJlZC4KKyAgICAgICAqLworICAgICAgcG5nX3NldF93cml0ZV9mbihwbmdfcHRyLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgIH0KKworICAgcmV0dXJuIHBuZ19wdHI7Cit9CisKKworLyogV3JpdGUgYSBmZXcgcm93cyBvZiBpbWFnZSBkYXRhLiAgSWYgdGhlIGltYWdlIGlzIGludGVybGFjZWQsCisgKiBlaXRoZXIgeW91IHdpbGwgaGF2ZSB0byB3cml0ZSB0aGUgNyBzdWIgaW1hZ2VzLCBvciwgaWYgeW91CisgKiBoYXZlIGNhbGxlZCBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZygpLCB5b3Ugd2lsbCBoYXZlIHRvCisgKiAid3JpdGUiIHRoZSBpbWFnZSBzZXZlbiB0aW1lcy4KKyAqLwordm9pZCBQTkdBUEkKK3BuZ193cml0ZV9yb3dzKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfYnl0ZXBwIHJvdywKKyAgICBwbmdfdWludF8zMiBudW1fcm93cykKK3sKKyAgIHBuZ191aW50XzMyIGk7IC8qIHJvdyBjb3VudGVyICovCisgICBwbmdfYnl0ZXBwIHJwOyAvKiByb3cgcG9pbnRlciAqLworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9yb3dzIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIC8qIExvb3AgdGhyb3VnaCB0aGUgcm93cyAqLworICAgZm9yIChpID0gMCwgcnAgPSByb3c7IGkgPCBudW1fcm93czsgaSsrLCBycCsrKQorICAgeworICAgICAgcG5nX3dyaXRlX3JvdyhwbmdfcHRyLCAqcnApOworICAgfQorfQorCisvKiBXcml0ZSB0aGUgaW1hZ2UuICBZb3Ugb25seSBuZWVkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBvbmNlLCBldmVuCisgKiBpZiB5b3UgYXJlIHdyaXRpbmcgYW4gaW50ZXJsYWNlZCBpbWFnZS4KKyAqLwordm9pZCBQTkdBUEkKK3BuZ193cml0ZV9pbWFnZShwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2J5dGVwcCBpbWFnZSkKK3sKKyAgIHBuZ191aW50XzMyIGk7IC8qIHJvdyBpbmRleCAqLworICAgaW50IHBhc3MsIG51bV9wYXNzOyAvKiBwYXNzIHZhcmlhYmxlcyAqLworICAgcG5nX2J5dGVwcCBycDsgLyogcG9pbnRzIHRvIGN1cnJlbnQgcm93ICovCisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX2ltYWdlIik7CisKKyNpZmRlZiBQTkdfV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVECisgICAvKiBJbml0aWFsaXplIGludGVybGFjZSBoYW5kbGluZy4gIElmIGltYWdlIGlzIG5vdCBpbnRlcmxhY2VkLAorICAgICogdGhpcyB3aWxsIHNldCBwYXNzIHRvIDEKKyAgICAqLworICAgbnVtX3Bhc3MgPSBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyhwbmdfcHRyKTsKKyNlbHNlCisgICBudW1fcGFzcyA9IDE7CisjZW5kaWYKKyAgIC8qIExvb3AgdGhyb3VnaCBwYXNzZXMgKi8KKyAgIGZvciAocGFzcyA9IDA7IHBhc3MgPCBudW1fcGFzczsgcGFzcysrKQorICAgeworICAgICAgLyogTG9vcCB0aHJvdWdoIGltYWdlICovCisgICAgICBmb3IgKGkgPSAwLCBycCA9IGltYWdlOyBpIDwgcG5nX3B0ci0+aGVpZ2h0OyBpKyssIHJwKyspCisgICAgICB7CisgICAgICAgICBwbmdfd3JpdGVfcm93KHBuZ19wdHIsICpycCk7CisgICAgICB9CisgICB9Cit9CisKKyNpZmRlZiBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRAorLyogUGVyZm9ybXMgaW50cmFwaXhlbCBkaWZmZXJlbmNpbmcgICovCitzdGF0aWMgdm9pZAorcG5nX2RvX3dyaXRlX2ludHJhcGl4ZWwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3dyaXRlX2ludHJhcGl4ZWwiKTsKKworICAgaWYgKChyb3dfaW5mby0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKSAhPSAwKQorICAgeworICAgICAgaW50IGJ5dGVzX3Blcl9waXhlbDsKKyAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKKyAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCisgICAgICB7CisgICAgICAgICBwbmdfYnl0ZXAgcnA7CisgICAgICAgICBwbmdfdWludF8zMiBpOworCisgICAgICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQorICAgICAgICAgICAgYnl0ZXNfcGVyX3BpeGVsID0gMzsKKworICAgICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQorICAgICAgICAgICAgYnl0ZXNfcGVyX3BpeGVsID0gNDsKKworICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICBmb3IgKGkgPSAwLCBycCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrLCBycCArPSBieXRlc19wZXJfcGl4ZWwpCisgICAgICAgICB7CisgICAgICAgICAgICAqKHJwKSAgICAgPSAocG5nX2J5dGUpKCpycCAgICAgICAtICoocnAgKyAxKSk7CisgICAgICAgICAgICAqKHJwICsgMikgPSAocG5nX2J5dGUpKCoocnAgKyAyKSAtICoocnAgKyAxKSk7CisgICAgICAgICB9CisgICAgICB9CisKKyNpZmRlZiBQTkdfV1JJVEVfMTZCSVRfU1VQUE9SVEVECisgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KQorICAgICAgeworICAgICAgICAgcG5nX2J5dGVwIHJwOworICAgICAgICAgcG5nX3VpbnRfMzIgaTsKKworICAgICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikKKyAgICAgICAgICAgIGJ5dGVzX3Blcl9waXhlbCA9IDY7CisKKyAgICAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkKKyAgICAgICAgICAgIGJ5dGVzX3Blcl9waXhlbCA9IDg7CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgZm9yIChpID0gMCwgcnAgPSByb3c7IGkgPCByb3dfd2lkdGg7IGkrKywgcnAgKz0gYnl0ZXNfcGVyX3BpeGVsKQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX3VpbnRfMzIgczAgICA9ICgqKHJwICAgICkgPDwgOCkgfCAqKHJwICsgMSk7CisgICAgICAgICAgICBwbmdfdWludF8zMiBzMSAgID0gKCoocnAgKyAyKSA8PCA4KSB8ICoocnAgKyAzKTsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIHMyICAgPSAoKihycCArIDQpIDw8IDgpIHwgKihycCArIDUpOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgcmVkICA9IChwbmdfdWludF8zMikoKHMwIC0gczEpICYgMHhmZmZmTCk7CisgICAgICAgICAgICBwbmdfdWludF8zMiBibHVlID0gKHBuZ191aW50XzMyKSgoczIgLSBzMSkgJiAweGZmZmZMKTsKKyAgICAgICAgICAgICoocnAgICAgKSA9IChwbmdfYnl0ZSkocmVkID4+IDgpOworICAgICAgICAgICAgKihycCArIDEpID0gKHBuZ19ieXRlKXJlZDsKKyAgICAgICAgICAgICoocnAgKyA0KSA9IChwbmdfYnl0ZSkoYmx1ZSA+PiA4KTsKKyAgICAgICAgICAgICoocnAgKyA1KSA9IChwbmdfYnl0ZSlibHVlOworICAgICAgICAgfQorICAgICAgfQorI2VuZGlmIC8qIFdSSVRFXzE2QklUICovCisgICB9Cit9CisjZW5kaWYgLyogTU5HX0ZFQVRVUkVTICovCisKKy8qIENhbGxlZCBieSB1c2VyIHRvIHdyaXRlIGEgcm93IG9mIGltYWdlIGRhdGEgKi8KK3ZvaWQgUE5HQVBJCitwbmdfd3JpdGVfcm93KHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfYnl0ZXAgcm93KQoreworICAgLyogMS41LjY6IG1vdmVkIGZyb20gcG5nX3N0cnVjdCB0byBiZSBhIGxvY2FsIHN0cnVjdHVyZTogKi8KKyAgIHBuZ19yb3dfaW5mbyByb3dfaW5mbzsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgcG5nX2RlYnVnMigxLCAiaW4gcG5nX3dyaXRlX3JvdyAocm93ICV1LCBwYXNzICVkKSIsCisgICAgICBwbmdfcHRyLT5yb3dfbnVtYmVyLCBwbmdfcHRyLT5wYXNzKTsKKworICAgLyogSW5pdGlhbGl6ZSB0cmFuc2Zvcm1hdGlvbnMgYW5kIG90aGVyIHN0dWZmIGlmIGZpcnN0IHRpbWUgKi8KKyAgIGlmIChwbmdfcHRyLT5yb3dfbnVtYmVyID09IDAgJiYgcG5nX3B0ci0+cGFzcyA9PSAwKQorICAgeworICAgICAgLyogTWFrZSBzdXJlIHdlIHdyb3RlIHRoZSBoZWFkZXIgaW5mbyAqLworICAgICAgaWYgKChwbmdfcHRyLT5tb2RlICYgUE5HX1dST1RFX0lORk9fQkVGT1JFX1BMVEUpID09IDApCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwKKyAgICAgICAgICAgICAicG5nX3dyaXRlX2luZm8gd2FzIG5ldmVyIGNhbGxlZCBiZWZvcmUgcG5nX3dyaXRlX3JvdyIpOworCisgICAgICAvKiBDaGVjayBmb3IgdHJhbnNmb3JtcyB0aGF0IGhhdmUgYmVlbiBzZXQgYnV0IHdlcmUgZGVmaW5lZCBvdXQgKi8KKyNpZiAhZGVmaW5lZChQTkdfV1JJVEVfSU5WRVJUX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfUkVBRF9JTlZFUlRfU1VQUE9SVEVEKQorICAgICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5WRVJUX01PTk8pICE9IDApCisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiUE5HX1dSSVRFX0lOVkVSVF9TVVBQT1JURUQgaXMgbm90IGRlZmluZWQiKTsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUE5HX1dSSVRFX0ZJTExFUl9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRCkKKyAgICAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0ZJTExFUikgIT0gMCkKKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJQTkdfV1JJVEVfRklMTEVSX1NVUFBPUlRFRCBpcyBub3QgZGVmaW5lZCIpOworI2VuZGlmCisjaWYgIWRlZmluZWQoUE5HX1dSSVRFX1BBQ0tTV0FQX1NVUFBPUlRFRCkgJiYgXAorICAgIGRlZmluZWQoUE5HX1JFQURfUEFDS1NXQVBfU1VQUE9SVEVEKQorICAgICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUEFDS1NXQVApICE9IDApCisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAgICAgICJQTkdfV1JJVEVfUEFDS1NXQVBfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkIik7CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFBOR19XUklURV9QQUNLX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfUkVBRF9QQUNLX1NVUFBPUlRFRCkKKyAgICAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1BBQ0spICE9IDApCisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiUE5HX1dSSVRFX1BBQ0tfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkIik7CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFBOR19XUklURV9TSElGVF9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX1JFQURfU0hJRlRfU1VQUE9SVEVEKQorICAgICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfU0hJRlQpICE9IDApCisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiUE5HX1dSSVRFX1NISUZUX1NVUFBPUlRFRCBpcyBub3QgZGVmaW5lZCIpOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChQTkdfV1JJVEVfQkdSX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfUkVBRF9CR1JfU1VQUE9SVEVEKQorICAgICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQkdSKSAhPSAwKQorICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlBOR19XUklURV9CR1JfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkIik7CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFBOR19XUklURV9TV0FQX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfUkVBRF9TV0FQX1NVUFBPUlRFRCkKKyAgICAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1NXQVBfQllURVMpICE9IDApCisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiUE5HX1dSSVRFX1NXQVBfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkIik7CisjZW5kaWYKKworICAgICAgcG5nX3dyaXRlX3N0YXJ0X3JvdyhwbmdfcHRyKTsKKyAgIH0KKworI2lmZGVmIFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQKKyAgIC8qIElmIGludGVybGFjZWQgYW5kIG5vdCBpbnRlcmVzdGVkIGluIHJvdywgcmV0dXJuICovCisgICBpZiAocG5nX3B0ci0+aW50ZXJsYWNlZCAhPSAwICYmCisgICAgICAgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlRFUkxBQ0UpICE9IDApCisgICB7CisgICAgICBzd2l0Y2ggKHBuZ19wdHItPnBhc3MpCisgICAgICB7CisgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBpZiAoKHBuZ19wdHItPnJvd19udW1iZXIgJiAweDA3KSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX3dyaXRlX2ZpbmlzaF9yb3cocG5nX3B0cik7CisgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMHgwNykgIT0gMCB8fCBwbmdfcHRyLT53aWR0aCA8IDUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfd3JpdGVfZmluaXNoX3JvdyhwbmdfcHRyKTsKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBpZiAoKHBuZ19wdHItPnJvd19udW1iZXIgJiAweDA3KSAhPSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX3dyaXRlX2ZpbmlzaF9yb3cocG5nX3B0cik7CisgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMHgwMykgIT0gMCB8fCBwbmdfcHRyLT53aWR0aCA8IDMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfd3JpdGVfZmluaXNoX3JvdyhwbmdfcHRyKTsKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBpZiAoKHBuZ19wdHItPnJvd19udW1iZXIgJiAweDAzKSAhPSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX3dyaXRlX2ZpbmlzaF9yb3cocG5nX3B0cik7CisgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMHgwMSkgIT0gMCB8fCBwbmdfcHRyLT53aWR0aCA8IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfd3JpdGVfZmluaXNoX3JvdyhwbmdfcHRyKTsKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBpZiAoKHBuZ19wdHItPnJvd19udW1iZXIgJiAweDAxKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX3dyaXRlX2ZpbmlzaF9yb3cocG5nX3B0cik7CisgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgZGVmYXVsdDogLyogZXJyb3I6IGlnbm9yZSBpdCAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICB9CisjZW5kaWYKKworICAgLyogU2V0IHVwIHJvdyBpbmZvIGZvciB0cmFuc2Zvcm1hdGlvbnMgKi8KKyAgIHJvd19pbmZvLmNvbG9yX3R5cGUgPSBwbmdfcHRyLT5jb2xvcl90eXBlOworICAgcm93X2luZm8ud2lkdGggPSBwbmdfcHRyLT51c3Jfd2lkdGg7CisgICByb3dfaW5mby5jaGFubmVscyA9IHBuZ19wdHItPnVzcl9jaGFubmVsczsKKyAgIHJvd19pbmZvLmJpdF9kZXB0aCA9IHBuZ19wdHItPnVzcl9iaXRfZGVwdGg7CisgICByb3dfaW5mby5waXhlbF9kZXB0aCA9IChwbmdfYnl0ZSkocm93X2luZm8uYml0X2RlcHRoICogcm93X2luZm8uY2hhbm5lbHMpOworICAgcm93X2luZm8ucm93Ynl0ZXMgPSBQTkdfUk9XQllURVMocm93X2luZm8ucGl4ZWxfZGVwdGgsIHJvd19pbmZvLndpZHRoKTsKKworICAgcG5nX2RlYnVnMSgzLCAicm93X2luZm8tPmNvbG9yX3R5cGUgPSAlZCIsIHJvd19pbmZvLmNvbG9yX3R5cGUpOworICAgcG5nX2RlYnVnMSgzLCAicm93X2luZm8tPndpZHRoID0gJXUiLCByb3dfaW5mby53aWR0aCk7CisgICBwbmdfZGVidWcxKDMsICJyb3dfaW5mby0+Y2hhbm5lbHMgPSAlZCIsIHJvd19pbmZvLmNoYW5uZWxzKTsKKyAgIHBuZ19kZWJ1ZzEoMywgInJvd19pbmZvLT5iaXRfZGVwdGggPSAlZCIsIHJvd19pbmZvLmJpdF9kZXB0aCk7CisgICBwbmdfZGVidWcxKDMsICJyb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAlZCIsIHJvd19pbmZvLnBpeGVsX2RlcHRoKTsKKyAgIHBuZ19kZWJ1ZzEoMywgInJvd19pbmZvLT5yb3dieXRlcyA9ICVsdSIsICh1bnNpZ25lZCBsb25nKXJvd19pbmZvLnJvd2J5dGVzKTsKKworICAgLyogQ29weSB1c2VyJ3Mgcm93IGludG8gYnVmZmVyLCBsZWF2aW5nIHJvb20gZm9yIGZpbHRlciBieXRlLiAqLworICAgbWVtY3B5KHBuZ19wdHItPnJvd19idWYgKyAxLCByb3csIHJvd19pbmZvLnJvd2J5dGVzKTsKKworI2lmZGVmIFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQKKyAgIC8qIEhhbmRsZSBpbnRlcmxhY2luZyAqLworICAgaWYgKHBuZ19wdHItPmludGVybGFjZWQgJiYgcG5nX3B0ci0+cGFzcyA8IDYgJiYKKyAgICAgICAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVEVSTEFDRSkgIT0gMCkKKyAgIHsKKyAgICAgIHBuZ19kb193cml0ZV9pbnRlcmxhY2UoJnJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwgcG5nX3B0ci0+cGFzcyk7CisgICAgICAvKiBUaGlzIHNob3VsZCBhbHdheXMgZ2V0IGNhdWdodCBhYm92ZSwgYnV0IHN0aWxsIC4uLiAqLworICAgICAgaWYgKHJvd19pbmZvLndpZHRoID09IDApCisgICAgICB7CisgICAgICAgICBwbmdfd3JpdGVfZmluaXNoX3JvdyhwbmdfcHRyKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgIH0KKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX1RSQU5TRk9STVNfU1VQUE9SVEVECisgICAvKiBIYW5kbGUgb3RoZXIgdHJhbnNmb3JtYXRpb25zICovCisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICE9IDApCisgICAgICBwbmdfZG9fd3JpdGVfdHJhbnNmb3JtYXRpb25zKHBuZ19wdHIsICZyb3dfaW5mbyk7CisjZW5kaWYKKworICAgLyogQXQgdGhpcyBwb2ludCB0aGUgcm93X2luZm8gcGl4ZWwgZGVwdGggbXVzdCBtYXRjaCB0aGUgJ3RyYW5zZm9ybWVkJyBkZXB0aCwKKyAgICAqIHdoaWNoIGlzIGFsc28gdGhlIG91dHB1dCBkZXB0aC4KKyAgICAqLworICAgaWYgKHJvd19pbmZvLnBpeGVsX2RlcHRoICE9IHBuZ19wdHItPnBpeGVsX2RlcHRoIHx8CisgICAgICAgcm93X2luZm8ucGl4ZWxfZGVwdGggIT0gcG5nX3B0ci0+dHJhbnNmb3JtZWRfcGl4ZWxfZGVwdGgpCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImludGVybmFsIHdyaXRlIHRyYW5zZm9ybSBsb2dpYyBlcnJvciIpOworCisjaWZkZWYgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQKKyAgIC8qIFdyaXRlIGZpbHRlcl9tZXRob2QgNjQgKGludHJhcGl4ZWwgZGlmZmVyZW5jaW5nKSBvbmx5IGlmCisgICAgKiAxLiBMaWJwbmcgd2FzIGNvbXBpbGVkIHdpdGggUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQgYW5kCisgICAgKiAyLiBMaWJwbmcgZGlkIG5vdCB3cml0ZSBhIFBORyBzaWduYXR1cmUgKHRoaXMgZmlsdGVyX21ldGhvZCBpcyBvbmx5CisgICAgKiAgICB1c2VkIGluIFBORyBkYXRhc3RyZWFtcyB0aGF0IGFyZSBlbWJlZGRlZCBpbiBNTkcgZGF0YXN0cmVhbXMpIGFuZAorICAgICogMy4gVGhlIGFwcGxpY2F0aW9uIGNhbGxlZCBwbmdfcGVybWl0X21uZ19mZWF0dXJlcyB3aXRoIGEgbWFzayB0aGF0CisgICAgKiAgICBpbmNsdWRlZCBQTkdfRkxBR19NTkdfRklMVEVSXzY0IGFuZAorICAgICogNC4gVGhlIGZpbHRlcl9tZXRob2QgaXMgNjQgYW5kCisgICAgKiA1LiBUaGUgY29sb3JfdHlwZSBpcyBSR0Igb3IgUkdCQQorICAgICovCisgICBpZiAoKHBuZ19wdHItPm1uZ19mZWF0dXJlc19wZXJtaXR0ZWQgJiBQTkdfRkxBR19NTkdfRklMVEVSXzY0KSAhPSAwICYmCisgICAgICAgKHBuZ19wdHItPmZpbHRlcl90eXBlID09IFBOR19JTlRSQVBJWEVMX0RJRkZFUkVOQ0lORykpCisgICB7CisgICAgICAvKiBJbnRyYXBpeGVsIGRpZmZlcmVuY2luZyAqLworICAgICAgcG5nX2RvX3dyaXRlX2ludHJhcGl4ZWwoJnJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7CisgICB9CisjZW5kaWYKKworLyogQWRkZWQgYXQgbGlicG5nLTEuNS4xMCAqLworI2lmZGVmIFBOR19XUklURV9DSEVDS19GT1JfSU5WQUxJRF9JTkRFWF9TVVBQT1JURUQKKyAgIC8qIENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgcGFsZXR0ZSBpbmRleCAqLworICAgaWYgKHJvd19pbmZvLmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSAmJgorICAgICAgIHBuZ19wdHItPm51bV9wYWxldHRlX21heCA+PSAwKQorICAgICAgcG5nX2RvX2NoZWNrX3BhbGV0dGVfaW5kZXhlcyhwbmdfcHRyLCAmcm93X2luZm8pOworI2VuZGlmCisKKyAgIC8qIEZpbmQgYSBmaWx0ZXIgaWYgbmVjZXNzYXJ5LCBmaWx0ZXIgdGhlIHJvdyBhbmQgd3JpdGUgaXQgb3V0LiAqLworICAgcG5nX3dyaXRlX2ZpbmRfZmlsdGVyKHBuZ19wdHIsICZyb3dfaW5mbyk7CisKKyAgIGlmIChwbmdfcHRyLT53cml0ZV9yb3dfZm4gIT0gTlVMTCkKKyAgICAgICgqKHBuZ19wdHItPndyaXRlX3Jvd19mbikpKHBuZ19wdHIsIHBuZ19wdHItPnJvd19udW1iZXIsIHBuZ19wdHItPnBhc3MpOworfQorCisjaWZkZWYgUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRAorLyogU2V0IHRoZSBhdXRvbWF0aWMgZmx1c2ggaW50ZXJ2YWwgb3IgMCB0byB0dXJuIGZsdXNoaW5nIG9mZiAqLwordm9pZCBQTkdBUEkKK3BuZ19zZXRfZmx1c2gocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBucm93cykKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9mbHVzaCIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBwbmdfcHRyLT5mbHVzaF9kaXN0ID0gKG5yb3dzIDwgMCA/IDAgOiBucm93cyk7Cit9CisKKy8qIEZsdXNoIHRoZSBjdXJyZW50IG91dHB1dCBidWZmZXJzIG5vdyAqLwordm9pZCBQTkdBUEkKK3BuZ193cml0ZV9mbHVzaChwbmdfc3RydWN0cnAgcG5nX3B0cikKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX2ZsdXNoIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIC8qIFdlIGhhdmUgYWxyZWFkeSB3cml0dGVuIG91dCBhbGwgb2YgdGhlIGRhdGEgKi8KKyAgIGlmIChwbmdfcHRyLT5yb3dfbnVtYmVyID49IHBuZ19wdHItPm51bV9yb3dzKQorICAgICAgcmV0dXJuOworCisgICBwbmdfY29tcHJlc3NfSURBVChwbmdfcHRyLCBOVUxMLCAwLCBaX1NZTkNfRkxVU0gpOworICAgcG5nX3B0ci0+Zmx1c2hfcm93cyA9IDA7CisgICBwbmdfZmx1c2gocG5nX3B0cik7Cit9CisjZW5kaWYgLyogV1JJVEVfRkxVU0ggKi8KKworLyogRnJlZSBhbnkgbWVtb3J5IHVzZWQgaW4gcG5nX3B0ciBzdHJ1Y3Qgd2l0aG91dCBmcmVlaW5nIHRoZSBzdHJ1Y3QgaXRzZWxmLiAqLworc3RhdGljIHZvaWQKK3BuZ193cml0ZV9kZXN0cm95KHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfZGVzdHJveSIpOworCisgICAvKiBGcmVlIGFueSBtZW1vcnkgemxpYiB1c2VzICovCisgICBpZiAoKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfWlNUUkVBTV9JTklUSUFMSVpFRCkgIT0gMCkKKyAgICAgIGRlZmxhdGVFbmQoJnBuZ19wdHItPnpzdHJlYW0pOworCisgICAvKiBGcmVlIG91ciBtZW1vcnkuICBwbmdfZnJlZSBjaGVja3MgTlVMTCBmb3IgdXMuICovCisgICBwbmdfZnJlZV9idWZmZXJfbGlzdChwbmdfcHRyLCAmcG5nX3B0ci0+emJ1ZmZlcl9saXN0KTsKKyAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnJvd19idWYpOworICAgcG5nX3B0ci0+cm93X2J1ZiA9IE5VTEw7CisjaWZkZWYgUE5HX1dSSVRFX0ZJTFRFUl9TVVBQT1JURUQKKyAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnByZXZfcm93KTsKKyAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnRyeV9yb3cpOworICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+dHN0X3Jvdyk7CisgICBwbmdfcHRyLT5wcmV2X3JvdyA9IE5VTEw7CisgICBwbmdfcHRyLT50cnlfcm93ID0gTlVMTDsKKyAgIHBuZ19wdHItPnRzdF9yb3cgPSBOVUxMOworI2VuZGlmCisKKyNpZmRlZiBQTkdfU0VUX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAorICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtfbGlzdCk7CisgICBwbmdfcHRyLT5jaHVua19saXN0ID0gTlVMTDsKKyNlbmRpZgorCisgICAvKiBUaGUgZXJyb3IgaGFuZGxpbmcgYW5kIG1lbW9yeSBoYW5kbGluZyBpbmZvcm1hdGlvbiBpcyBsZWZ0IGludGFjdCBhdCB0aGlzCisgICAgKiBwb2ludDogdGhlIGptcF9idWYgbWF5IHN0aWxsIGhhdmUgdG8gYmUgZnJlZWQuICBTZWUgcG5nX2Rlc3Ryb3lfcG5nX3N0cnVjdAorICAgICogZm9yIGhvdyB0aGlzIGhhcHBlbnMuCisgICAgKi8KK30KKworLyogRnJlZSBhbGwgbWVtb3J5IHVzZWQgYnkgdGhlIHdyaXRlLgorICogSW4gbGlicG5nIDEuNi4wIHRoaXMgQVBJIGNoYW5nZWQgcXVpZXRseSB0byBubyBsb25nZXIgYWNjZXB0IGEgTlVMTCB2YWx1ZSBmb3IKKyAqICpwbmdfcHRyX3B0ci4gIFByaW9yIHRvIDEuNi4wIGl0IHdvdWxkIGFjY2VwdCBzdWNoIGEgdmFsdWUgYW5kIGl0IHdvdWxkIGZyZWUKKyAqIHRoZSBwYXNzZWQgaW4gaW5mb19zdHJ1Y3RzIGJ1dCBpdCB3b3VsZCBxdWlldGx5IGZhaWwgdG8gZnJlZSBhbnkgb2YgdGhlIGRhdGEKKyAqIGluc2lkZSB0aGVtLiAgSW4gMS42LjAgaXQgcXVpZXRseSBkb2VzIG5vdGhpbmcgKGl0IGhhcyB0byBiZSBxdWlldCBiZWNhdXNlIGl0CisgKiBoYXMgbm8gcG5nX3B0ci4pCisgKi8KK3ZvaWQgUE5HQVBJCitwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QocG5nX3N0cnVjdHBwIHBuZ19wdHJfcHRyLCBwbmdfaW5mb3BwIGluZm9fcHRyX3B0cikKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0Iik7CisKKyAgIGlmIChwbmdfcHRyX3B0ciAhPSBOVUxMKQorICAgeworICAgICAgcG5nX3N0cnVjdHJwIHBuZ19wdHIgPSAqcG5nX3B0cl9wdHI7CisKKyAgICAgIGlmIChwbmdfcHRyICE9IE5VTEwpIC8qIGFkZGVkIGluIGxpYnBuZyAxLjYuMCAqLworICAgICAgeworICAgICAgICAgcG5nX2Rlc3Ryb3lfaW5mb19zdHJ1Y3QocG5nX3B0ciwgaW5mb19wdHJfcHRyKTsKKworICAgICAgICAgKnBuZ19wdHJfcHRyID0gTlVMTDsKKyAgICAgICAgIHBuZ193cml0ZV9kZXN0cm95KHBuZ19wdHIpOworICAgICAgICAgcG5nX2Rlc3Ryb3lfcG5nX3N0cnVjdChwbmdfcHRyKTsKKyAgICAgIH0KKyAgIH0KK30KKworLyogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIHNlbGVjdCBvbmUgb3IgbW9yZSByb3cgZmlsdGVycyB0byB1c2UuICovCit2b2lkIFBOR0FQSQorcG5nX3NldF9maWx0ZXIocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBtZXRob2QsIGludCBmaWx0ZXJzKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2ZpbHRlciIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisjaWZkZWYgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQKKyAgIGlmICgocG5nX3B0ci0+bW5nX2ZlYXR1cmVzX3Blcm1pdHRlZCAmIFBOR19GTEFHX01OR19GSUxURVJfNjQpICE9IDAgJiYKKyAgICAgICAobWV0aG9kID09IFBOR19JTlRSQVBJWEVMX0RJRkZFUkVOQ0lORykpCisgICAgICBtZXRob2QgPSBQTkdfRklMVEVSX1RZUEVfQkFTRTsKKworI2VuZGlmCisgICBpZiAobWV0aG9kID09IFBOR19GSUxURVJfVFlQRV9CQVNFKQorICAgeworICAgICAgc3dpdGNoIChmaWx0ZXJzICYgKFBOR19BTExfRklMVEVSUyB8IDB4MDcpKQorICAgICAgeworI2lmZGVmIFBOR19XUklURV9GSUxURVJfU1VQUE9SVEVECisgICAgICAgICBjYXNlIDU6CisgICAgICAgICBjYXNlIDY6CisgICAgICAgICBjYXNlIDc6IHBuZ19hcHBfZXJyb3IocG5nX3B0ciwgIlVua25vd24gcm93IGZpbHRlciBmb3IgbWV0aG9kIDAiKTsKKyAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLworI2VuZGlmIC8qIFdSSVRFX0ZJTFRFUiAqLworICAgICAgICAgY2FzZSBQTkdfRklMVEVSX1ZBTFVFX05PTkU6CisgICAgICAgICAgICBwbmdfcHRyLT5kb19maWx0ZXIgPSBQTkdfRklMVEVSX05PTkU7IGJyZWFrOworCisjaWZkZWYgUE5HX1dSSVRFX0ZJTFRFUl9TVVBQT1JURUQKKyAgICAgICAgIGNhc2UgUE5HX0ZJTFRFUl9WQUxVRV9TVUI6CisgICAgICAgICAgICBwbmdfcHRyLT5kb19maWx0ZXIgPSBQTkdfRklMVEVSX1NVQjsgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgUE5HX0ZJTFRFUl9WQUxVRV9VUDoKKyAgICAgICAgICAgIHBuZ19wdHItPmRvX2ZpbHRlciA9IFBOR19GSUxURVJfVVA7IGJyZWFrOworCisgICAgICAgICBjYXNlIFBOR19GSUxURVJfVkFMVUVfQVZHOgorICAgICAgICAgICAgcG5nX3B0ci0+ZG9fZmlsdGVyID0gUE5HX0ZJTFRFUl9BVkc7IGJyZWFrOworCisgICAgICAgICBjYXNlIFBOR19GSUxURVJfVkFMVUVfUEFFVEg6CisgICAgICAgICAgICBwbmdfcHRyLT5kb19maWx0ZXIgPSBQTkdfRklMVEVSX1BBRVRIOyBicmVhazsKKworICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHBuZ19wdHItPmRvX2ZpbHRlciA9IChwbmdfYnl0ZSlmaWx0ZXJzOyBicmVhazsKKyNlbHNlCisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcG5nX2FwcF9lcnJvcihwbmdfcHRyLCAiVW5rbm93biByb3cgZmlsdGVyIGZvciBtZXRob2QgMCIpOworI2VuZGlmIC8qIFdSSVRFX0ZJTFRFUiAqLworICAgICAgfQorCisjaWZkZWYgUE5HX1dSSVRFX0ZJTFRFUl9TVVBQT1JURUQKKyAgICAgIC8qIElmIHdlIGhhdmUgYWxsb2NhdGVkIHRoZSByb3dfYnVmLCB0aGlzIG1lYW5zIHdlIGhhdmUgYWxyZWFkeSBzdGFydGVkCisgICAgICAgKiB3aXRoIHRoZSBpbWFnZSBhbmQgd2Ugc2hvdWxkIGhhdmUgYWxsb2NhdGVkIGFsbCBvZiB0aGUgZmlsdGVyIGJ1ZmZlcnMKKyAgICAgICAqIHRoYXQgaGF2ZSBiZWVuIHNlbGVjdGVkLiAgSWYgcHJldl9yb3cgaXNuJ3QgYWxyZWFkeSBhbGxvY2F0ZWQsIHRoZW4KKyAgICAgICAqIGl0IGlzIHRvbyBsYXRlIHRvIHN0YXJ0IHVzaW5nIHRoZSBmaWx0ZXJzIHRoYXQgbmVlZCBpdCwgc2luY2Ugd2UKKyAgICAgICAqIHdpbGwgYmUgbWlzc2luZyB0aGUgZGF0YSBpbiB0aGUgcHJldmlvdXMgcm93LiAgSWYgYW4gYXBwbGljYXRpb24KKyAgICAgICAqIHdhbnRzIHRvIHN0YXJ0IGFuZCBzdG9wIHVzaW5nIHBhcnRpY3VsYXIgZmlsdGVycyBkdXJpbmcgY29tcHJlc3Npb24sCisgICAgICAgKiBpdCBzaG91bGQgc3RhcnQgb3V0IHdpdGggYWxsIG9mIHRoZSBmaWx0ZXJzLCBhbmQgdGhlbiByZW1vdmUgdGhlbQorICAgICAgICogb3IgYWRkIHRoZW0gYmFjayBhZnRlciB0aGUgc3RhcnQgb2YgY29tcHJlc3Npb24uCisgICAgICAgKgorICAgICAgICogTk9URTogdGhpcyBpcyBhIG5hc3R5IGNvbnN0cmFpbnQgb24gdGhlIGNvZGUsIGJlY2F1c2UgaXQgbWVhbnMgdGhhdCB0aGUKKyAgICAgICAqIHByZXZfcm93IGJ1ZmZlciBtdXN0IGJlIG1haW50YWluZWQgZXZlbiBpZiB0aGVyZSBhcmUgY3VycmVudGx5IG5vCisgICAgICAgKiAncHJldl9yb3cnIHJlcXVpcmluZyBmaWx0ZXJzIGFjdGl2ZS4KKyAgICAgICAqLworICAgICAgaWYgKHBuZ19wdHItPnJvd19idWYgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIGludCBudW1fZmlsdGVyczsKKyAgICAgICAgIHBuZ19hbGxvY19zaXplX3QgYnVmX3NpemU7CisKKyAgICAgICAgIC8qIFJlcGVhdCB0aGUgY2hlY2tzIGluIHBuZ193cml0ZV9zdGFydF9yb3c7IDEgcGl4ZWwgaGlnaCBvciB3aWRlCisgICAgICAgICAgKiBpbWFnZXMgY2Fubm90IGJlbmVmaXQgZnJvbSBjZXJ0YWluIGZpbHRlcnMuICBJZiB0aGlzIGlzbid0IGRvbmUgaGVyZQorICAgICAgICAgICogdGhlIGNoZWNrIGJlbG93IHdpbGwgZmlyZSBvbiAxIHBpeGVsIGhpZ2ggaW1hZ2VzLgorICAgICAgICAgICovCisgICAgICAgICBpZiAocG5nX3B0ci0+aGVpZ2h0ID09IDEpCisgICAgICAgICAgICBmaWx0ZXJzICY9IH4oUE5HX0ZJTFRFUl9VUHxQTkdfRklMVEVSX0FWR3xQTkdfRklMVEVSX1BBRVRIKTsKKworICAgICAgICAgaWYgKHBuZ19wdHItPndpZHRoID09IDEpCisgICAgICAgICAgICBmaWx0ZXJzICY9IH4oUE5HX0ZJTFRFUl9TVUJ8UE5HX0ZJTFRFUl9BVkd8UE5HX0ZJTFRFUl9QQUVUSCk7CisKKyAgICAgICAgIGlmICgoZmlsdGVycyAmIChQTkdfRklMVEVSX1VQfFBOR19GSUxURVJfQVZHfFBOR19GSUxURVJfUEFFVEgpKSAhPSAwCisgICAgICAgICAgICAmJiBwbmdfcHRyLT5wcmV2X3JvdyA9PSBOVUxMKQorICAgICAgICAgeworICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgZXJyb3IgY2FzZSwgaG93ZXZlciBpdCBpcyBiZW5pZ24gLSB0aGUgcHJldmlvdXMgcm93CisgICAgICAgICAgICAgKiBpcyBub3QgYXZhaWxhYmxlIHNvIHRoZSBmaWx0ZXIgY2FuJ3QgYmUgdXNlZC4gIEp1c3Qgd2FybiBoZXJlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwbmdfYXBwX3dhcm5pbmcocG5nX3B0ciwKKyAgICAgICAgICAgICAgICJwbmdfc2V0X2ZpbHRlcjogVVAvQVZHL1BBRVRIIGNhbm5vdCBiZSBhZGRlZCBhZnRlciBzdGFydCIpOworICAgICAgICAgICAgZmlsdGVycyAmPSB+KFBOR19GSUxURVJfVVB8UE5HX0ZJTFRFUl9BVkd8UE5HX0ZJTFRFUl9QQUVUSCk7CisgICAgICAgICB9CisKKyAgICAgICAgIG51bV9maWx0ZXJzID0gMDsKKworICAgICAgICAgaWYgKGZpbHRlcnMgJiBQTkdfRklMVEVSX1NVQikKKyAgICAgICAgICAgIG51bV9maWx0ZXJzKys7CisKKyAgICAgICAgIGlmIChmaWx0ZXJzICYgUE5HX0ZJTFRFUl9VUCkKKyAgICAgICAgICAgIG51bV9maWx0ZXJzKys7CisKKyAgICAgICAgIGlmIChmaWx0ZXJzICYgUE5HX0ZJTFRFUl9BVkcpCisgICAgICAgICAgICBudW1fZmlsdGVycysrOworCisgICAgICAgICBpZiAoZmlsdGVycyAmIFBOR19GSUxURVJfUEFFVEgpCisgICAgICAgICAgICBudW1fZmlsdGVycysrOworCisgICAgICAgICAvKiBBbGxvY2F0ZSBuZWVkZWQgcm93IGJ1ZmZlcnMgaWYgdGhleSBoYXZlIG5vdCBhbHJlYWR5IGJlZW4KKyAgICAgICAgICAqIGFsbG9jYXRlZC4KKyAgICAgICAgICAqLworICAgICAgICAgYnVmX3NpemUgPSBQTkdfUk9XQllURVMocG5nX3B0ci0+dXNyX2NoYW5uZWxzICogcG5nX3B0ci0+dXNyX2JpdF9kZXB0aCwKKyAgICAgICAgICAgICBwbmdfcHRyLT53aWR0aCkgKyAxOworCisgICAgICAgICBpZiAocG5nX3B0ci0+dHJ5X3JvdyA9PSBOVUxMKQorICAgICAgICAgICAgcG5nX3B0ci0+dHJ5X3JvdyA9IHBuZ192b2lkY2FzdChwbmdfYnl0ZXAsCisgICAgICAgICAgICAgICBwbmdfbWFsbG9jKHBuZ19wdHIsIGJ1Zl9zaXplKSk7CisKKyAgICAgICAgIGlmIChudW1fZmlsdGVycyA+IDEpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAocG5nX3B0ci0+dHN0X3JvdyA9PSBOVUxMKQorICAgICAgICAgICAgICAgcG5nX3B0ci0+dHN0X3JvdyA9IHBuZ192b2lkY2FzdChwbmdfYnl0ZXAsCisgICAgICAgICAgICAgICAgICBwbmdfbWFsbG9jKHBuZ19wdHIsIGJ1Zl9zaXplKSk7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBwbmdfcHRyLT5kb19maWx0ZXIgPSAocG5nX2J5dGUpZmlsdGVyczsKKyNlbmRpZgorICAgfQorICAgZWxzZQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJVbmtub3duIGN1c3RvbSBmaWx0ZXIgbWV0aG9kIik7Cit9CisKKyNpZmRlZiBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRCAvKiBERVBSRUNBVEVEICovCisvKiBQcm92aWRlIGZsb2F0aW5nIGFuZCBmaXhlZCBwb2ludCBBUElzICovCisjaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAordm9pZCBQTkdBUEkKK3BuZ19zZXRfZmlsdGVyX2hldXJpc3RpY3MocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBoZXVyaXN0aWNfbWV0aG9kLAorICAgIGludCBudW1fd2VpZ2h0cywgcG5nX2NvbnN0X2RvdWJsZXAgZmlsdGVyX3dlaWdodHMsCisgICAgcG5nX2NvbnN0X2RvdWJsZXAgZmlsdGVyX2Nvc3RzKQoreworICAgUE5HX1VOVVNFRChwbmdfcHRyKQorICAgUE5HX1VOVVNFRChoZXVyaXN0aWNfbWV0aG9kKQorICAgUE5HX1VOVVNFRChudW1fd2VpZ2h0cykKKyAgIFBOR19VTlVTRUQoZmlsdGVyX3dlaWdodHMpCisgICBQTkdfVU5VU0VEKGZpbHRlcl9jb3N0cykKK30KKyNlbmRpZiAvKiBGTE9BVElOR19QT0lOVCAqLworCisjaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAordm9pZCBQTkdBUEkKK3BuZ19zZXRfZmlsdGVyX2hldXJpc3RpY3NfZml4ZWQocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBoZXVyaXN0aWNfbWV0aG9kLAorICAgIGludCBudW1fd2VpZ2h0cywgcG5nX2NvbnN0X2ZpeGVkX3BvaW50X3AgZmlsdGVyX3dlaWdodHMsCisgICAgcG5nX2NvbnN0X2ZpeGVkX3BvaW50X3AgZmlsdGVyX2Nvc3RzKQoreworICAgUE5HX1VOVVNFRChwbmdfcHRyKQorICAgUE5HX1VOVVNFRChoZXVyaXN0aWNfbWV0aG9kKQorICAgUE5HX1VOVVNFRChudW1fd2VpZ2h0cykKKyAgIFBOR19VTlVTRUQoZmlsdGVyX3dlaWdodHMpCisgICBQTkdfVU5VU0VEKGZpbHRlcl9jb3N0cykKK30KKyNlbmRpZiAvKiBGSVhFRF9QT0lOVCAqLworI2VuZGlmIC8qIFdSSVRFX1dFSUdIVEVEX0ZJTFRFUiAqLworCisjaWZkZWYgUE5HX1dSSVRFX0NVU1RPTUlaRV9DT01QUkVTU0lPTl9TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgbGV2ZWwpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgcG5nX3B0ci0+emxpYl9sZXZlbCA9IGxldmVsOworfQorCit2b2lkIFBOR0FQSQorcG5nX3NldF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBtZW1fbGV2ZWwpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfY29tcHJlc3Npb25fbWVtX2xldmVsIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIHBuZ19wdHItPnpsaWJfbWVtX2xldmVsID0gbWVtX2xldmVsOworfQorCit2b2lkIFBOR0FQSQorcG5nX3NldF9jb21wcmVzc2lvbl9zdHJhdGVneShwbmdfc3RydWN0cnAgcG5nX3B0ciwgaW50IHN0cmF0ZWd5KQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2NvbXByZXNzaW9uX3N0cmF0ZWd5Iik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIC8qIFRoZSBmbGFnIHNldHRpbmcgaGVyZSBwcmV2ZW50cyB0aGUgbGlicG5nIGR5bmFtaWMgc2VsZWN0aW9uIG9mIHN0cmF0ZWd5LgorICAgICovCisgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19aTElCX0NVU1RPTV9TVFJBVEVHWTsKKyAgIHBuZ19wdHItPnpsaWJfc3RyYXRlZ3kgPSBzdHJhdGVneTsKK30KKworLyogSWYgUE5HX1dSSVRFX09QVElNSVpFX0NNRl9TVVBQT1JURUQgaXMgZGVmaW5lZCwgbGlicG5nIHdpbGwgdXNlIGEKKyAqIHNtYWxsZXIgdmFsdWUgb2Ygd2luZG93X2JpdHMgaWYgaXQgY2FuIGRvIHNvIHNhZmVseS4KKyAqLwordm9pZCBQTkdBUEkKK3BuZ19zZXRfY29tcHJlc3Npb25fd2luZG93X2JpdHMocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCB3aW5kb3dfYml0cykKK3sKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIC8qIFByaW9yIHRvIDEuNi4wIHRoaXMgd291bGQgd2FybiBidXQgdGhlbiBzZXQgdGhlIHdpbmRvd19iaXRzIHZhbHVlLiBUaGlzCisgICAgKiBtZWFudCB0aGF0IG5lZ2F0aXZlIHdpbmRvdyBiaXRzIHZhbHVlcyBjb3VsZCBiZSBzZWxlY3RlZCB0aGF0IHdvdWxkIGNhdXNlCisgICAgKiBsaWJwbmcgdG8gd3JpdGUgYSBub24tc3RhbmRhcmQgUE5HIGZpbGUgd2l0aCByYXcgZGVmbGF0ZSBvciBnemlwCisgICAgKiBjb21wcmVzc2VkIElEQVQgb3IgYW5jaWxsYXJ5IGNodW5rcy4gIFN1Y2ggZmlsZXMgY2FuIGJlIHJlYWQgYW5kIHRoZXJlIGlzCisgICAgKiBubyB3YXJuaW5nIG9uIHJlYWQsIHNvIHRoaXMgc2VlbXMgbGlrZSBhIHZlcnkgYmFkIGlkZWEuCisgICAgKi8KKyAgIGlmICh3aW5kb3dfYml0cyA+IDE1KQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk9ubHkgY29tcHJlc3Npb24gd2luZG93cyA8PSAzMmsgc3VwcG9ydGVkIGJ5IFBORyIpOworICAgICAgd2luZG93X2JpdHMgPSAxNTsKKyAgIH0KKworICAgZWxzZSBpZiAod2luZG93X2JpdHMgPCA4KQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk9ubHkgY29tcHJlc3Npb24gd2luZG93cyA+PSAyNTYgc3VwcG9ydGVkIGJ5IFBORyIpOworICAgICAgd2luZG93X2JpdHMgPSA4OworICAgfQorCisgICBwbmdfcHRyLT56bGliX3dpbmRvd19iaXRzID0gd2luZG93X2JpdHM7Cit9CisKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X2NvbXByZXNzaW9uX21ldGhvZChwbmdfc3RydWN0cnAgcG5nX3B0ciwgaW50IG1ldGhvZCkKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9jb21wcmVzc2lvbl9tZXRob2QiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgLyogVGhpcyB3b3VsZCBwcm9kdWNlIGFuIGludmFsaWQgUE5HIGZpbGUgaWYgaXQgd29ya2VkLCBidXQgaXQgZG9lc24ndCBhbmQKKyAgICAqIGRlZmxhdGUgd2lsbCBmYXVsdCBpdCwgc28gaXQgaXMgaGFybWxlc3MgdG8ganVzdCB3YXJuIGhlcmUuCisgICAgKi8KKyAgIGlmIChtZXRob2QgIT0gOCkKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJPbmx5IGNvbXByZXNzaW9uIG1ldGhvZCA4IGlzIHN1cHBvcnRlZCBieSBQTkciKTsKKworICAgcG5nX3B0ci0+emxpYl9tZXRob2QgPSBtZXRob2Q7Cit9CisjZW5kaWYgLyogV1JJVEVfQ1VTVE9NSVpFX0NPTVBSRVNTSU9OICovCisKKy8qIFRoZSBmb2xsb3dpbmcgd2VyZSBhZGRlZCB0byBsaWJwbmctMS41LjQgKi8KKyNpZmRlZiBQTkdfV1JJVEVfQ1VTVE9NSVpFX1pUWFRfQ09NUFJFU1NJT05fU1VQUE9SVEVECit2b2lkIFBOR0FQSQorcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX2xldmVsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgbGV2ZWwpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9sZXZlbCIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBwbmdfcHRyLT56bGliX3RleHRfbGV2ZWwgPSBsZXZlbDsKK30KKwordm9pZCBQTkdBUEkKK3BuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBtZW1fbGV2ZWwpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgcG5nX3B0ci0+emxpYl90ZXh0X21lbV9sZXZlbCA9IG1lbV9sZXZlbDsKK30KKwordm9pZCBQTkdBUEkKK3BuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9zdHJhdGVneShwbmdfc3RydWN0cnAgcG5nX3B0ciwgaW50IHN0cmF0ZWd5KQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fc3RyYXRlZ3kiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgcG5nX3B0ci0+emxpYl90ZXh0X3N0cmF0ZWd5ID0gc3RyYXRlZ3k7Cit9CisKKy8qIElmIFBOR19XUklURV9PUFRJTUlaRV9DTUZfU1VQUE9SVEVEIGlzIGRlZmluZWQsIGxpYnBuZyB3aWxsIHVzZSBhCisgKiBzbWFsbGVyIHZhbHVlIG9mIHdpbmRvd19iaXRzIGlmIGl0IGNhbiBkbyBzbyBzYWZlbHkuCisgKi8KK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fd2luZG93X2JpdHMocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCB3aW5kb3dfYml0cykKK3sKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIGlmICh3aW5kb3dfYml0cyA+IDE1KQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk9ubHkgY29tcHJlc3Npb24gd2luZG93cyA8PSAzMmsgc3VwcG9ydGVkIGJ5IFBORyIpOworICAgICAgd2luZG93X2JpdHMgPSAxNTsKKyAgIH0KKworICAgZWxzZSBpZiAod2luZG93X2JpdHMgPCA4KQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk9ubHkgY29tcHJlc3Npb24gd2luZG93cyA+PSAyNTYgc3VwcG9ydGVkIGJ5IFBORyIpOworICAgICAgd2luZG93X2JpdHMgPSA4OworICAgfQorCisgICBwbmdfcHRyLT56bGliX3RleHRfd2luZG93X2JpdHMgPSB3aW5kb3dfYml0czsKK30KKwordm9pZCBQTkdBUEkKK3BuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9tZXRob2QocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBtZXRob2QpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9tZXRob2QiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgaWYgKG1ldGhvZCAhPSA4KQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk9ubHkgY29tcHJlc3Npb24gbWV0aG9kIDggaXMgc3VwcG9ydGVkIGJ5IFBORyIpOworCisgICBwbmdfcHRyLT56bGliX3RleHRfbWV0aG9kID0gbWV0aG9kOworfQorI2VuZGlmIC8qIFdSSVRFX0NVU1RPTUlaRV9aVFhUX0NPTVBSRVNTSU9OICovCisvKiBlbmQgb2YgQVBJIGFkZGVkIHRvIGxpYnBuZy0xLjUuNCAqLworCit2b2lkIFBOR0FQSQorcG5nX3NldF93cml0ZV9zdGF0dXNfZm4ocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ193cml0ZV9zdGF0dXNfcHRyIHdyaXRlX3Jvd19mbikKK3sKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIHBuZ19wdHItPndyaXRlX3Jvd19mbiA9IHdyaXRlX3Jvd19mbjsKK30KKworI2lmZGVmIFBOR19XUklURV9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3dyaXRlX3VzZXJfdHJhbnNmb3JtX2ZuKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfdXNlcl90cmFuc2Zvcm1fcHRyCisgICAgd3JpdGVfdXNlcl90cmFuc2Zvcm1fZm4pCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfd3JpdGVfdXNlcl90cmFuc2Zvcm1fZm4iKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19VU0VSX1RSQU5TRk9STTsKKyAgIHBuZ19wdHItPndyaXRlX3VzZXJfdHJhbnNmb3JtX2ZuID0gd3JpdGVfdXNlcl90cmFuc2Zvcm1fZm47Cit9CisjZW5kaWYKKworCisjaWZkZWYgUE5HX0lORk9fSU1BR0VfU1VQUE9SVEVECit2b2lkIFBOR0FQSQorcG5nX3dyaXRlX3BuZyhwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwKKyAgICBpbnQgdHJhbnNmb3Jtcywgdm9pZHAgcGFyYW1zKQoreworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBpZiAoKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX0lEQVQpID09IDApCisgICB7CisgICAgICBwbmdfYXBwX2Vycm9yKHBuZ19wdHIsICJubyByb3dzIGZvciBwbmdfd3JpdGVfaW1hZ2UgdG8gd3JpdGUiKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgLyogV3JpdGUgdGhlIGZpbGUgaGVhZGVyIGluZm9ybWF0aW9uLiAqLworICAgcG5nX3dyaXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOworCisgICAvKiAtLS0tLS0gdGhlc2UgdHJhbnNmb3JtYXRpb25zIGRvbid0IHRvdWNoIHRoZSBpbmZvIHN0cnVjdHVyZSAtLS0tLS0tICovCisKKyAgIC8qIEludmVydCBtb25vY2hyb21lIHBpeGVscyAqLworICAgaWYgKCh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9JTlZFUlRfTU9OTykgIT0gMCkKKyNpZmRlZiBQTkdfV1JJVEVfSU5WRVJUX1NVUFBPUlRFRAorICAgICAgcG5nX3NldF9pbnZlcnRfbW9ubyhwbmdfcHRyKTsKKyNlbHNlCisgICAgICBwbmdfYXBwX2Vycm9yKHBuZ19wdHIsICJQTkdfVFJBTlNGT1JNX0lOVkVSVF9NT05PIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorCisgICAvKiBTaGlmdCB0aGUgcGl4ZWxzIHVwIHRvIGEgbGVnYWwgYml0IGRlcHRoIGFuZCBmaWxsIGluCisgICAgKiBhcyBhcHByb3ByaWF0ZSB0byBjb3JyZWN0bHkgc2NhbGUgdGhlIGltYWdlLgorICAgICovCisgICBpZiAoKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX1NISUZUKSAhPSAwKQorI2lmZGVmIFBOR19XUklURV9TSElGVF9TVVBQT1JURUQKKyAgICAgIGlmICgoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc0JJVCkgIT0gMCkKKyAgICAgICAgIHBuZ19zZXRfc2hpZnQocG5nX3B0ciwgJmluZm9fcHRyLT5zaWdfYml0KTsKKyNlbHNlCisgICAgICBwbmdfYXBwX2Vycm9yKHBuZ19wdHIsICJQTkdfVFJBTlNGT1JNX1NISUZUIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorCisgICAvKiBQYWNrIHBpeGVscyBpbnRvIGJ5dGVzICovCisgICBpZiAoKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX1BBQ0tJTkcpICE9IDApCisjaWZkZWYgUE5HX1dSSVRFX1BBQ0tfU1VQUE9SVEVECisgICAgICBwbmdfc2V0X3BhY2tpbmcocG5nX3B0cik7CisjZWxzZQorICAgICAgcG5nX2FwcF9lcnJvcihwbmdfcHRyLCAiUE5HX1RSQU5TRk9STV9QQUNLSU5HIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorCisgICAvKiBTd2FwIGxvY2F0aW9uIG9mIGFscGhhIGJ5dGVzIGZyb20gQVJHQiB0byBSR0JBICovCisgICBpZiAoKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX1NXQVBfQUxQSEEpICE9IDApCisjaWZkZWYgUE5HX1dSSVRFX1NXQVBfQUxQSEFfU1VQUE9SVEVECisgICAgICBwbmdfc2V0X3N3YXBfYWxwaGEocG5nX3B0cik7CisjZWxzZQorICAgICAgcG5nX2FwcF9lcnJvcihwbmdfcHRyLCAiUE5HX1RSQU5TRk9STV9TV0FQX0FMUEhBIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorCisgICAvKiBSZW1vdmUgYSBmaWxsZXIgKFgpIGZyb20gWFJHQi9SR0JYL0FHL0dBIGludG8gdG8gY29udmVydCBpdCBpbnRvCisgICAgKiBSR0IsIG5vdGUgdGhhdCB0aGUgY29kZSBleHBlY3RzIHRoZSBpbnB1dCBjb2xvciB0eXBlIHRvIGJlIEcgb3IgUkdCOyBubworICAgICogYWxwaGEgY2hhbm5lbC4KKyAgICAqLworICAgaWYgKCh0cmFuc2Zvcm1zICYgKFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSX0FGVEVSfAorICAgICAgIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSX0JFRk9SRSkpICE9IDApCisgICB7CisjaWZkZWYgUE5HX1dSSVRFX0ZJTExFUl9TVVBQT1JURUQKKyAgICAgIGlmICgodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSX0FGVEVSKSAhPSAwKQorICAgICAgeworICAgICAgICAgaWYgKCh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVJfQkVGT1JFKSAhPSAwKQorICAgICAgICAgICAgcG5nX2FwcF9lcnJvcihwbmdfcHRyLAorICAgICAgICAgICAgICAgICJQTkdfVFJBTlNGT1JNX1NUUklQX0ZJTExFUjogQkVGT1JFK0FGVEVSIG5vdCBzdXBwb3J0ZWQiKTsKKworICAgICAgICAgLyogQ29udGludWUgaWYgaWdub3JlZCAtIHRoaXMgaXMgdGhlIHByZS0xLjYuMTAgYmVoYXZpb3IgKi8KKyAgICAgICAgIHBuZ19zZXRfZmlsbGVyKHBuZ19wdHIsIDAsIFBOR19GSUxMRVJfQUZURVIpOworICAgICAgfQorCisgICAgICBlbHNlIGlmICgodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSX0JFRk9SRSkgIT0gMCkKKyAgICAgICAgIHBuZ19zZXRfZmlsbGVyKHBuZ19wdHIsIDAsIFBOR19GSUxMRVJfQkVGT1JFKTsKKyNlbHNlCisgICAgICBwbmdfYXBwX2Vycm9yKHBuZ19wdHIsICJQTkdfVFJBTlNGT1JNX1NUUklQX0ZJTExFUiBub3Qgc3VwcG9ydGVkIik7CisjZW5kaWYKKyAgIH0KKworICAgLyogRmxpcCBCR1IgcGl4ZWxzIHRvIFJHQiAqLworICAgaWYgKCh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9CR1IpICE9IDApCisjaWZkZWYgUE5HX1dSSVRFX0JHUl9TVVBQT1JURUQKKyAgICAgIHBuZ19zZXRfYmdyKHBuZ19wdHIpOworI2Vsc2UKKyAgICAgIHBuZ19hcHBfZXJyb3IocG5nX3B0ciwgIlBOR19UUkFOU0ZPUk1fQkdSIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorCisgICAvKiBTd2FwIGJ5dGVzIG9mIDE2LWJpdCBmaWxlcyB0byBtb3N0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QgKi8KKyAgIGlmICgodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fU1dBUF9FTkRJQU4pICE9IDApCisjaWZkZWYgUE5HX1dSSVRFX1NXQVBfU1VQUE9SVEVECisgICAgICBwbmdfc2V0X3N3YXAocG5nX3B0cik7CisjZWxzZQorICAgICAgcG5nX2FwcF9lcnJvcihwbmdfcHRyLCAiUE5HX1RSQU5TRk9STV9TV0FQX0VORElBTiBub3Qgc3VwcG9ydGVkIik7CisjZW5kaWYKKworICAgLyogU3dhcCBiaXRzIG9mIDEtYml0LCAyLWJpdCwgNC1iaXQgcGFja2VkIHBpeGVsIGZvcm1hdHMgKi8KKyAgIGlmICgodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fUEFDS1NXQVApICE9IDApCisjaWZkZWYgUE5HX1dSSVRFX1BBQ0tTV0FQX1NVUFBPUlRFRAorICAgICAgcG5nX3NldF9wYWNrc3dhcChwbmdfcHRyKTsKKyNlbHNlCisgICAgICBwbmdfYXBwX2Vycm9yKHBuZ19wdHIsICJQTkdfVFJBTlNGT1JNX1BBQ0tTV0FQIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorCisgICAvKiBJbnZlcnQgdGhlIGFscGhhIGNoYW5uZWwgZnJvbSBvcGFjaXR5IHRvIHRyYW5zcGFyZW5jeSAqLworICAgaWYgKCh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9JTlZFUlRfQUxQSEEpICE9IDApCisjaWZkZWYgUE5HX1dSSVRFX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQKKyAgICAgIHBuZ19zZXRfaW52ZXJ0X2FscGhhKHBuZ19wdHIpOworI2Vsc2UKKyAgICAgIHBuZ19hcHBfZXJyb3IocG5nX3B0ciwgIlBOR19UUkFOU0ZPUk1fSU5WRVJUX0FMUEhBIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorCisgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBlbmQgb2YgdHJhbnNmb3JtYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgLyogV3JpdGUgdGhlIGJpdHMgKi8KKyAgIHBuZ193cml0ZV9pbWFnZShwbmdfcHRyLCBpbmZvX3B0ci0+cm93X3BvaW50ZXJzKTsKKworICAgLyogSXQgaXMgUkVRVUlSRUQgdG8gY2FsbCB0aGlzIHRvIGZpbmlzaCB3cml0aW5nIHRoZSByZXN0IG9mIHRoZSBmaWxlICovCisgICBwbmdfd3JpdGVfZW5kKHBuZ19wdHIsIGluZm9fcHRyKTsKKworICAgUE5HX1VOVVNFRChwYXJhbXMpCit9CisjZW5kaWYKKworCisjaWZkZWYgUE5HX1NJTVBMSUZJRURfV1JJVEVfU1VQUE9SVEVECisjIGlmZGVmIFBOR19TVERJT19TVVBQT1JURUQgLyogY3VycmVudGx5IHJlcXVpcmVkIGZvciBwbmdfaW1hZ2Vfd3JpdGVfKiAqLworLyogSW5pdGlhbGl6ZSB0aGUgd3JpdGUgc3RydWN0dXJlIC0gZ2VuZXJhbCBwdXJwb3NlIHV0aWxpdHkuICovCitzdGF0aWMgaW50CitwbmdfaW1hZ2Vfd3JpdGVfaW5pdChwbmdfaW1hZ2VwIGltYWdlKQoreworICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NUUklORywgaW1hZ2UsCisgICAgICAgcG5nX3NhZmVfZXJyb3IsIHBuZ19zYWZlX3dhcm5pbmcpOworCisgICBpZiAocG5nX3B0ciAhPSBOVUxMKQorICAgeworICAgICAgcG5nX2luZm9wIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKKworICAgICAgaWYgKGluZm9fcHRyICE9IE5VTEwpCisgICAgICB7CisgICAgICAgICBwbmdfY29udHJvbHAgY29udHJvbCA9IHBuZ192b2lkY2FzdChwbmdfY29udHJvbHAsCisgICAgICAgICAgICAgcG5nX21hbGxvY193YXJuKHBuZ19wdHIsIChzaXplb2YgKmNvbnRyb2wpKSk7CisKKyAgICAgICAgIGlmIChjb250cm9sICE9IE5VTEwpCisgICAgICAgICB7CisgICAgICAgICAgICBtZW1zZXQoY29udHJvbCwgMCwgKHNpemVvZiAqY29udHJvbCkpOworCisgICAgICAgICAgICBjb250cm9sLT5wbmdfcHRyID0gcG5nX3B0cjsKKyAgICAgICAgICAgIGNvbnRyb2wtPmluZm9fcHRyID0gaW5mb19wdHI7CisgICAgICAgICAgICBjb250cm9sLT5mb3Jfd3JpdGUgPSAxOworCisgICAgICAgICAgICBpbWFnZS0+b3BhcXVlID0gY29udHJvbDsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgfQorCisgICAgICAgICAvKiBFcnJvciBjbGVhbiB1cCAqLworICAgICAgICAgcG5nX2Rlc3Ryb3lfaW5mb19zdHJ1Y3QocG5nX3B0ciwgJmluZm9fcHRyKTsKKyAgICAgIH0KKworICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLCBOVUxMKTsKKyAgIH0KKworICAgcmV0dXJuIHBuZ19pbWFnZV9lcnJvcihpbWFnZSwgInBuZ19pbWFnZV93cml0ZV86IG91dCBvZiBtZW1vcnkiKTsKK30KKworLyogQXJndW1lbnRzIHRvIHBuZ19pbWFnZV93cml0ZV9tYWluOiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIC8qIEFyZ3VtZW50czogKi8KKyAgIHBuZ19pbWFnZXAgICAgICBpbWFnZTsKKyAgIHBuZ19jb25zdF92b2lkcCBidWZmZXI7CisgICBwbmdfaW50XzMyICAgICAgcm93X3N0cmlkZTsKKyAgIHBuZ19jb25zdF92b2lkcCBjb2xvcm1hcDsKKyAgIGludCAgICAgICAgICAgICBjb252ZXJ0X3RvXzhiaXQ7CisgICAvKiBMb2NhbCB2YXJpYWJsZXM6ICovCisgICBwbmdfY29uc3Rfdm9pZHAgZmlyc3Rfcm93OworICAgcHRyZGlmZl90ICAgICAgIHJvd19ieXRlczsKKyAgIHBuZ192b2lkcCAgICAgICBsb2NhbF9yb3c7Cit9IHBuZ19pbWFnZV93cml0ZV9jb250cm9sOworCisvKiBXcml0ZSBwbmdfdWludF8xNiBpbnB1dCB0byBhIDE2LWJpdCBQTkc7IHRoZSBwbmdfcHRyIGhhcyBhbHJlYWR5IGJlZW4gc2V0IHRvCisgKiBkbyBhbnkgbmVjZXNzYXJ5IGJ5dGUgc3dhcHBpbmcuICBUaGUgY29tcG9uZW50IG9yZGVyIGlzIGRlZmluZWQgYnkgdGhlCisgKiBwbmdfaW1hZ2UgZm9ybWF0IHZhbHVlLgorICovCitzdGF0aWMgaW50Citwbmdfd3JpdGVfaW1hZ2VfMTZiaXQocG5nX3ZvaWRwIGFyZ3VtZW50KQoreworICAgcG5nX2ltYWdlX3dyaXRlX2NvbnRyb2wgKmRpc3BsYXkgPSBwbmdfdm9pZGNhc3QocG5nX2ltYWdlX3dyaXRlX2NvbnRyb2wqLAorICAgICAgIGFyZ3VtZW50KTsKKyAgIHBuZ19pbWFnZXAgaW1hZ2UgPSBkaXNwbGF5LT5pbWFnZTsKKyAgIHBuZ19zdHJ1Y3RycCBwbmdfcHRyID0gaW1hZ2UtPm9wYXF1ZS0+cG5nX3B0cjsKKworICAgcG5nX2NvbnN0X3VpbnRfMTZwIGlucHV0X3JvdyA9IHBuZ192b2lkY2FzdChwbmdfY29uc3RfdWludF8xNnAsCisgICAgICAgZGlzcGxheS0+Zmlyc3Rfcm93KTsKKyAgIHBuZ191aW50XzE2cCBvdXRwdXRfcm93ID0gcG5nX3ZvaWRjYXN0KHBuZ191aW50XzE2cCwgZGlzcGxheS0+bG9jYWxfcm93KTsKKyAgIHBuZ191aW50XzE2cCByb3dfZW5kOworICAgY29uc3QgaW50IGNoYW5uZWxzID0gKGltYWdlLT5mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQ09MT1IpICE9IDAgPyAzIDogMTsKKyAgIGludCBhaW5kZXggPSAwOworICAgcG5nX3VpbnRfMzIgeSA9IGltYWdlLT5oZWlnaHQ7CisKKyAgIGlmICgoaW1hZ2UtPmZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BTFBIQSkgIT0gMCkKKyAgIHsKKyMgICBpZmRlZiBQTkdfU0lNUExJRklFRF9XUklURV9BRklSU1RfU1VQUE9SVEVECisgICAgICBpZiAoKGltYWdlLT5mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQUZJUlNUKSAhPSAwKQorICAgICAgeworICAgICAgICAgYWluZGV4ID0gLTE7CisgICAgICAgICArK2lucHV0X3JvdzsgLyogVG8gcG9pbnQgdG8gdGhlIGZpcnN0IGNvbXBvbmVudCAqLworICAgICAgICAgKytvdXRwdXRfcm93OworICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgICAgYWluZGV4ID0gY2hhbm5lbHM7CisjICAgICBlbHNlCisgICAgICAgICBhaW5kZXggPSBjaGFubmVsczsKKyMgICAgIGVuZGlmCisgICB9CisKKyAgIGVsc2UKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAicG5nX3dyaXRlX2ltYWdlOiBpbnRlcm5hbCBjYWxsIGVycm9yIik7CisKKyAgIC8qIFdvcmsgb3V0IHRoZSBvdXRwdXQgcm93IGVuZCBhbmQgY291bnQgb3ZlciB0aGlzLCBub3RlIHRoYXQgdGhlIGluY3JlbWVudAorICAgICogYWJvdmUgdG8gJ3JvdycgbWVhbnMgdGhhdCByb3dfZW5kIGNhbiBhY3R1YWxseSBiZSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUKKyAgICAqIHJvdzsgdGhpcyBpcyBjb3JyZWN0LgorICAgICovCisgICByb3dfZW5kID0gb3V0cHV0X3JvdyArIGltYWdlLT53aWR0aCAqIChjaGFubmVscysxKTsKKworICAgd2hpbGUgKHktLSA+IDApCisgICB7CisgICAgICBwbmdfY29uc3RfdWludF8xNnAgaW5fcHRyID0gaW5wdXRfcm93OworICAgICAgcG5nX3VpbnRfMTZwIG91dF9wdHIgPSBvdXRwdXRfcm93OworCisgICAgICB3aGlsZSAob3V0X3B0ciA8IHJvd19lbmQpCisgICAgICB7CisgICAgICAgICBjb25zdCBwbmdfdWludF8xNiBhbHBoYSA9IGluX3B0clthaW5kZXhdOworICAgICAgICAgcG5nX3VpbnRfMzIgcmVjaXByb2NhbCA9IDA7CisgICAgICAgICBpbnQgYzsKKworICAgICAgICAgb3V0X3B0clthaW5kZXhdID0gYWxwaGE7CisKKyAgICAgICAgIC8qIENhbGN1bGF0ZSBhIHJlY2lwcm9jYWwuICBUaGUgY29ycmVjdCBjYWxjdWxhdGlvbiBpcyBzaW1wbHkKKyAgICAgICAgICAqIGNvbXBvbmVudC9hbHBoYSo2NTUzNSA8PCAxNS4gKEkuZS4gMTUgYml0cyBvZiBwcmVjaXNpb24pOyB0aGlzCisgICAgICAgICAgKiBhbGxvd3MgY29ycmVjdCByb3VuZGluZyBieSBhZGRpbmcgLjUgYmVmb3JlIHRoZSBzaGlmdC4gICdyZWNpcHJvY2FsJworICAgICAgICAgICogaXMgb25seSBpbml0aWFsaXplZCB3aGVuIHJlcXVpcmVkLgorICAgICAgICAgICovCisgICAgICAgICBpZiAoYWxwaGEgPiAwICYmIGFscGhhIDwgNjU1MzUpCisgICAgICAgICAgICByZWNpcHJvY2FsID0gKCgweGZmZmY8PDE1KSsoYWxwaGE+PjEpKS9hbHBoYTsKKworICAgICAgICAgYyA9IGNoYW5uZWxzOworICAgICAgICAgZG8gLyogYWx3YXlzIGF0IGxlYXN0IG9uZSBjaGFubmVsICovCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfdWludF8xNiBjb21wb25lbnQgPSAqaW5fcHRyKys7CisKKyAgICAgICAgICAgIC8qIFRoZSBmb2xsb3dpbmcgZ2l2ZXMgNjU1MzUgZm9yIGFuIGFscGhhIG9mIDAsIHdoaWNoIGlzIGZpbmUsCisgICAgICAgICAgICAgKiBvdGhlcndpc2UgaWYgMC8wIGlzIHJlcHJlc2VudGVkIGFzIHNvbWUgb3RoZXIgdmFsdWUgdGhlcmUgaXMgbW9yZQorICAgICAgICAgICAgICogbGlrZWx5IHRvIGJlIGEgZGlzY29udGludWl0eSB3aGljaCB3aWxsIHByb2JhYmx5IGRhbWFnZQorICAgICAgICAgICAgICogY29tcHJlc3Npb24gd2hlbiBtb3ZpbmcgZnJvbSBhIGZ1bGx5IHRyYW5zcGFyZW50IGFyZWEgdG8gYQorICAgICAgICAgICAgICogbmVhcmx5IHRyYW5zcGFyZW50IG9uZS4gIChUaGUgYXNzdW1wdGlvbiBoZXJlIGlzIHRoYXQgb3BhcXVlCisgICAgICAgICAgICAgKiBhcmVhcyB0ZW5kIG5vdCB0byBiZSAwIGludGVuc2l0eS4pCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChjb21wb25lbnQgPj0gYWxwaGEpCisgICAgICAgICAgICAgICBjb21wb25lbnQgPSA2NTUzNTsKKworICAgICAgICAgICAgLyogY29tcG9uZW50PGFscGhhLCBzbyBjb21wb25lbnQvYWxwaGEgaXMgbGVzcyB0aGFuIG9uZSBhbmQKKyAgICAgICAgICAgICAqIGNvbXBvbmVudCpyZWNpcHJvY2FsIGlzIGxlc3MgdGhhbiAyXjMxLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBlbHNlIGlmIChjb21wb25lbnQgPiAwICYmIGFscGhhIDwgNjU1MzUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfdWludF8zMiBjYWxjID0gY29tcG9uZW50ICogcmVjaXByb2NhbDsKKyAgICAgICAgICAgICAgIGNhbGMgKz0gMTYzODQ7IC8qIHJvdW5kIHRvIG5lYXJlc3QgKi8KKyAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IChwbmdfdWludF8xNikoY2FsYyA+PiAxNSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICpvdXRfcHRyKysgPSBjb21wb25lbnQ7CisgICAgICAgICB9CisgICAgICAgICB3aGlsZSAoLS1jID4gMCk7CisKKyAgICAgICAgIC8qIFNraXAgdG8gbmV4dCBjb21wb25lbnQgKHNraXAgdGhlIGludGVydmVuaW5nIGFscGhhIGNoYW5uZWwpICovCisgICAgICAgICArK2luX3B0cjsKKyAgICAgICAgICsrb3V0X3B0cjsKKyAgICAgIH0KKworICAgICAgcG5nX3dyaXRlX3JvdyhwbmdfcHRyLCBwbmdfdm9pZGNhc3QocG5nX2NvbnN0X2J5dGVwLCBkaXNwbGF5LT5sb2NhbF9yb3cpKTsKKyAgICAgIGlucHV0X3JvdyArPSBkaXNwbGF5LT5yb3dfYnl0ZXMvKHNpemVvZiAocG5nX3VpbnRfMTYpKTsKKyAgIH0KKworICAgcmV0dXJuIDE7Cit9CisKKy8qIEdpdmVuIDE2LWJpdCBpbnB1dCAoMSB0byA0IGNoYW5uZWxzKSB3cml0ZSA4LWJpdCBvdXRwdXQuICBJZiBhbiBhbHBoYSBjaGFubmVsCisgKiBpcyBwcmVzZW50IGl0IG11c3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBjb21wb25lbnRzLCB0aGUgY29tcG9uZW50cyBhcmUgdGhlbgorICogd3JpdHRlbiBpbiBzUkdCIGVuY29kaW5nLiAgTm8gY29tcG9uZW50cyBhcmUgYWRkZWQgb3IgcmVtb3ZlZC4KKyAqCisgKiBDYWxjdWxhdGUgYW4gYWxwaGEgcmVjaXByb2NhbCB0byByZXZlcnNlIHByZS1tdWx0aXBsaWNhdGlvbi4gIEFzIGFib3ZlIHRoZQorICogY2FsY3VsYXRpb24gY2FuIGJlIGRvbmUgdG8gMTUgYml0cyBvZiBhY2N1cmFjeTsgaG93ZXZlciwgdGhlIG91dHB1dCBuZWVkcyB0bworICogYmUgc2NhbGVkIGluIHRoZSByYW5nZSAwLi4yNTUqNjU1MzUsIHNvIGluY2x1ZGUgdGhhdCBzY2FsaW5nIGhlcmUuCisgKi8KKyMgICBkZWZpbmUgVU5QX1JFQ0lQUk9DQUwoYWxwaGEpICgoKCgweGZmZmYqMHhmZik8PDcpKyhhbHBoYT4+MSkpL2FscGhhKQorCitzdGF0aWMgcG5nX2J5dGUKK3BuZ191bnByZW11bHRpcGx5KHBuZ191aW50XzMyIGNvbXBvbmVudCwgcG5nX3VpbnRfMzIgYWxwaGEsCisgICBwbmdfdWludF8zMiByZWNpcHJvY2FsLypmcm9tIHRoZSBhYm92ZSBtYWNybyovKQoreworICAgLyogVGhlIGZvbGxvd2luZyBnaXZlcyAxLjAgZm9yIGFuIGFscGhhIG9mIDAsIHdoaWNoIGlzIGZpbmUsIG90aGVyd2lzZSBpZiAwLzAKKyAgICAqIGlzIHJlcHJlc2VudGVkIGFzIHNvbWUgb3RoZXIgdmFsdWUgdGhlcmUgaXMgbW9yZSBsaWtlbHkgdG8gYmUgYQorICAgICogZGlzY29udGludWl0eSB3aGljaCB3aWxsIHByb2JhYmx5IGRhbWFnZSBjb21wcmVzc2lvbiB3aGVuIG1vdmluZyBmcm9tIGEKKyAgICAqIGZ1bGx5IHRyYW5zcGFyZW50IGFyZWEgdG8gYSBuZWFybHkgdHJhbnNwYXJlbnQgb25lLiAgKFRoZSBhc3N1bXB0aW9uIGhlcmUKKyAgICAqIGlzIHRoYXQgb3BhcXVlIGFyZWFzIHRlbmQgbm90IHRvIGJlIDAgaW50ZW5zaXR5LikKKyAgICAqCisgICAgKiBUaGVyZSBpcyBhIHJvdW5kaW5nIHByb2JsZW0gaGVyZTsgaWYgYWxwaGEgaXMgbGVzcyB0aGFuIDEyOCBpdCB3aWxsIGVuZCB1cAorICAgICogYXMgMCB3aGVuIHNjYWxlZCB0byA4IGJpdHMuICBUbyBhdm9pZCBpbnRyb2R1Y2luZyBzcHVyaW91cyBjb2xvcnMgaW50byB0aGUKKyAgICAqIG91dHB1dCBjaGFuZ2UgZm9yIHRoaXMgdG9vLgorICAgICovCisgICBpZiAoY29tcG9uZW50ID49IGFscGhhIHx8IGFscGhhIDwgMTI4KQorICAgICAgcmV0dXJuIDI1NTsKKworICAgLyogY29tcG9uZW50PGFscGhhLCBzbyBjb21wb25lbnQvYWxwaGEgaXMgbGVzcyB0aGFuIG9uZSBhbmQKKyAgICAqIGNvbXBvbmVudCpyZWNpcHJvY2FsIGlzIGxlc3MgdGhhbiAyXjMxLgorICAgICovCisgICBlbHNlIGlmIChjb21wb25lbnQgPiAwKQorICAgeworICAgICAgLyogVGhlIHRlc3QgaXMgdGhhdCBhbHBoYS8yNTcgKHJvdW5kZWQpIGlzIGxlc3MgdGhhbiAyNTUsIHRoZSBmaXJzdCB2YWx1ZQorICAgICAgICogdGhhdCBiZWNvbWVzIDI1NSBpcyA2NTQwNy4KKyAgICAgICAqIE5PVEU6IHRoaXMgbXVzdCBhZ3JlZSB3aXRoIHRoZSBQTkdfRElWMjU3IG1hY3JvICh3aGljaCBtdXN0LCB0aGVyZWZvcmUsCisgICAgICAgKiBiZSBleGFjdCEpICBbQ291bGQgYWxzbyB0ZXN0IHJlY2lwcm9jYWwgIT0gMF0KKyAgICAgICAqLworICAgICAgaWYgKGFscGhhIDwgNjU0MDcpCisgICAgICB7CisgICAgICAgICBjb21wb25lbnQgKj0gcmVjaXByb2NhbDsKKyAgICAgICAgIGNvbXBvbmVudCArPSA2NDsgLyogcm91bmQgdG8gbmVhcmVzdCAqLworICAgICAgICAgY29tcG9uZW50ID4+PSA3OworICAgICAgfQorCisgICAgICBlbHNlCisgICAgICAgICBjb21wb25lbnQgKj0gMjU1OworCisgICAgICAvKiBDb252ZXJ0IHRoZSBjb21wb25lbnQgdG8gc1JHQi4gKi8KKyAgICAgIHJldHVybiAocG5nX2J5dGUpUE5HX3NSR0JfRlJPTV9MSU5FQVIoY29tcG9uZW50KTsKKyAgIH0KKworICAgZWxzZQorICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3BuZ193cml0ZV9pbWFnZV84Yml0KHBuZ192b2lkcCBhcmd1bWVudCkKK3sKKyAgIHBuZ19pbWFnZV93cml0ZV9jb250cm9sICpkaXNwbGF5ID0gcG5nX3ZvaWRjYXN0KHBuZ19pbWFnZV93cml0ZV9jb250cm9sKiwKKyAgICAgICBhcmd1bWVudCk7CisgICBwbmdfaW1hZ2VwIGltYWdlID0gZGlzcGxheS0+aW1hZ2U7CisgICBwbmdfc3RydWN0cnAgcG5nX3B0ciA9IGltYWdlLT5vcGFxdWUtPnBuZ19wdHI7CisKKyAgIHBuZ19jb25zdF91aW50XzE2cCBpbnB1dF9yb3cgPSBwbmdfdm9pZGNhc3QocG5nX2NvbnN0X3VpbnRfMTZwLAorICAgICAgIGRpc3BsYXktPmZpcnN0X3Jvdyk7CisgICBwbmdfYnl0ZXAgb3V0cHV0X3JvdyA9IHBuZ192b2lkY2FzdChwbmdfYnl0ZXAsIGRpc3BsYXktPmxvY2FsX3Jvdyk7CisgICBwbmdfdWludF8zMiB5ID0gaW1hZ2UtPmhlaWdodDsKKyAgIGNvbnN0IGludCBjaGFubmVscyA9IChpbWFnZS0+Zm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9SKSAhPSAwID8gMyA6IDE7CisKKyAgIGlmICgoaW1hZ2UtPmZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BTFBIQSkgIT0gMCkKKyAgIHsKKyAgICAgIHBuZ19ieXRlcCByb3dfZW5kOworICAgICAgaW50IGFpbmRleDsKKworIyAgIGlmZGVmIFBOR19TSU1QTElGSUVEX1dSSVRFX0FGSVJTVF9TVVBQT1JURUQKKyAgICAgIGlmICgoaW1hZ2UtPmZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BRklSU1QpICE9IDApCisgICAgICB7CisgICAgICAgICBhaW5kZXggPSAtMTsKKyAgICAgICAgICsraW5wdXRfcm93OyAvKiBUbyBwb2ludCB0byB0aGUgZmlyc3QgY29tcG9uZW50ICovCisgICAgICAgICArK291dHB1dF9yb3c7CisgICAgICB9CisKKyAgICAgIGVsc2UKKyMgICBlbmRpZgorICAgICAgYWluZGV4ID0gY2hhbm5lbHM7CisKKyAgICAgIC8qIFVzZSByb3dfZW5kIGluIHBsYWNlIG9mIGEgbG9vcCBjb3VudGVyOiAqLworICAgICAgcm93X2VuZCA9IG91dHB1dF9yb3cgKyBpbWFnZS0+d2lkdGggKiAoY2hhbm5lbHMrMSk7CisKKyAgICAgIHdoaWxlICh5LS0gPiAwKQorICAgICAgeworICAgICAgICAgcG5nX2NvbnN0X3VpbnRfMTZwIGluX3B0ciA9IGlucHV0X3JvdzsKKyAgICAgICAgIHBuZ19ieXRlcCBvdXRfcHRyID0gb3V0cHV0X3JvdzsKKworICAgICAgICAgd2hpbGUgKG91dF9wdHIgPCByb3dfZW5kKQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX3VpbnRfMTYgYWxwaGEgPSBpbl9wdHJbYWluZGV4XTsKKyAgICAgICAgICAgIHBuZ19ieXRlIGFscGhhYnl0ZSA9IChwbmdfYnl0ZSlQTkdfRElWMjU3KGFscGhhKTsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIHJlY2lwcm9jYWwgPSAwOworICAgICAgICAgICAgaW50IGM7CisKKyAgICAgICAgICAgIC8qIFNjYWxlIGFuZCB3cml0ZSB0aGUgYWxwaGEgY2hhbm5lbC4gKi8KKyAgICAgICAgICAgIG91dF9wdHJbYWluZGV4XSA9IGFscGhhYnl0ZTsKKworICAgICAgICAgICAgaWYgKGFscGhhYnl0ZSA+IDAgJiYgYWxwaGFieXRlIDwgMjU1KQorICAgICAgICAgICAgICAgcmVjaXByb2NhbCA9IFVOUF9SRUNJUFJPQ0FMKGFscGhhKTsKKworICAgICAgICAgICAgYyA9IGNoYW5uZWxzOworICAgICAgICAgICAgZG8gLyogYWx3YXlzIGF0IGxlYXN0IG9uZSBjaGFubmVsICovCisgICAgICAgICAgICAgICAqb3V0X3B0cisrID0gcG5nX3VucHJlbXVsdGlwbHkoKmluX3B0cisrLCBhbHBoYSwgcmVjaXByb2NhbCk7CisgICAgICAgICAgICB3aGlsZSAoLS1jID4gMCk7CisKKyAgICAgICAgICAgIC8qIFNraXAgdG8gbmV4dCBjb21wb25lbnQgKHNraXAgdGhlIGludGVydmVuaW5nIGFscGhhIGNoYW5uZWwpICovCisgICAgICAgICAgICArK2luX3B0cjsKKyAgICAgICAgICAgICsrb3V0X3B0cjsKKyAgICAgICAgIH0gLyogd2hpbGUgb3V0X3B0ciA8IHJvd19lbmQgKi8KKworICAgICAgICAgcG5nX3dyaXRlX3JvdyhwbmdfcHRyLCBwbmdfdm9pZGNhc3QocG5nX2NvbnN0X2J5dGVwLAorICAgICAgICAgICAgIGRpc3BsYXktPmxvY2FsX3JvdykpOworICAgICAgICAgaW5wdXRfcm93ICs9IGRpc3BsYXktPnJvd19ieXRlcy8oc2l6ZW9mIChwbmdfdWludF8xNikpOworICAgICAgfSAvKiB3aGlsZSB5ICovCisgICB9CisKKyAgIGVsc2UKKyAgIHsKKyAgICAgIC8qIE5vIGFscGhhIGNoYW5uZWwsIHNvIHRoZSByb3dfZW5kIHJlYWxseSBpcyB0aGUgZW5kIG9mIHRoZSByb3cgYW5kIGl0CisgICAgICAgKiBpcyBzdWZmaWNpZW50IHRvIGxvb3Agb3ZlciB0aGUgY29tcG9uZW50cyBvbmUgYnkgb25lLgorICAgICAgICovCisgICAgICBwbmdfYnl0ZXAgcm93X2VuZCA9IG91dHB1dF9yb3cgKyBpbWFnZS0+d2lkdGggKiBjaGFubmVsczsKKworICAgICAgd2hpbGUgKHktLSA+IDApCisgICAgICB7CisgICAgICAgICBwbmdfY29uc3RfdWludF8xNnAgaW5fcHRyID0gaW5wdXRfcm93OworICAgICAgICAgcG5nX2J5dGVwIG91dF9wdHIgPSBvdXRwdXRfcm93OworCisgICAgICAgICB3aGlsZSAob3V0X3B0ciA8IHJvd19lbmQpCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfdWludF8zMiBjb21wb25lbnQgPSAqaW5fcHRyKys7CisKKyAgICAgICAgICAgIGNvbXBvbmVudCAqPSAyNTU7CisgICAgICAgICAgICAqb3V0X3B0cisrID0gKHBuZ19ieXRlKVBOR19zUkdCX0ZST01fTElORUFSKGNvbXBvbmVudCk7CisgICAgICAgICB9CisKKyAgICAgICAgIHBuZ193cml0ZV9yb3cocG5nX3B0ciwgb3V0cHV0X3Jvdyk7CisgICAgICAgICBpbnB1dF9yb3cgKz0gZGlzcGxheS0+cm93X2J5dGVzLyhzaXplb2YgKHBuZ191aW50XzE2KSk7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorcG5nX2ltYWdlX3NldF9QTFRFKHBuZ19pbWFnZV93cml0ZV9jb250cm9sICpkaXNwbGF5KQoreworICAgY29uc3QgcG5nX2ltYWdlcCBpbWFnZSA9IGRpc3BsYXktPmltYWdlOworICAgY29uc3Qgdm9pZCAqY21hcCA9IGRpc3BsYXktPmNvbG9ybWFwOworICAgY29uc3QgaW50IGVudHJpZXMgPSBpbWFnZS0+Y29sb3JtYXBfZW50cmllcyA+IDI1NiA/IDI1NiA6CisgICAgICAgKGludClpbWFnZS0+Y29sb3JtYXBfZW50cmllczsKKworICAgLyogTk9URTogdGhlIGNhbGxlciBtdXN0IGNoZWNrIGZvciBjbWFwICE9IE5VTEwgYW5kIGVudHJpZXMgIT0gMCAqLworICAgY29uc3QgcG5nX3VpbnRfMzIgZm9ybWF0ID0gaW1hZ2UtPmZvcm1hdDsKKyAgIGNvbnN0IGludCBjaGFubmVscyA9IFBOR19JTUFHRV9TQU1QTEVfQ0hBTk5FTFMoZm9ybWF0KTsKKworIyAgIGlmIGRlZmluZWQoUE5HX0ZPUk1BVF9CR1JfU1VQUE9SVEVEKSAmJlwKKyAgICAgIGRlZmluZWQoUE5HX1NJTVBMSUZJRURfV1JJVEVfQUZJUlNUX1NVUFBPUlRFRCkKKyAgICAgIGNvbnN0IGludCBhZmlyc3QgPSAoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FGSVJTVCkgIT0gMCAmJgorICAgICAgICAgIChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQUxQSEEpICE9IDA7CisjICAgZWxzZQorIyAgICAgZGVmaW5lIGFmaXJzdCAwCisjICAgZW5kaWYKKworIyAgIGlmZGVmIFBOR19GT1JNQVRfQkdSX1NVUFBPUlRFRAorICAgICAgY29uc3QgaW50IGJnciA9IChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQkdSKSAhPSAwID8gMiA6IDA7CisjICAgZWxzZQorIyAgICAgZGVmaW5lIGJnciAwCisjICAgZW5kaWYKKworICAgaW50IGksIG51bV90cmFuczsKKyAgIHBuZ19jb2xvciBwYWxldHRlWzI1Nl07CisgICBwbmdfYnl0ZSB0Uk5TWzI1Nl07CisKKyAgIG1lbXNldCh0Uk5TLCAyNTUsIChzaXplb2YgdFJOUykpOworICAgbWVtc2V0KHBhbGV0dGUsIDAsIChzaXplb2YgcGFsZXR0ZSkpOworCisgICBmb3IgKGk9bnVtX3RyYW5zPTA7IGk8ZW50cmllczsgKytpKQorICAgeworICAgICAgLyogVGhpcyBnZXRzIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIHNSR0Igd2l0aCByZXZlcnNhbCBvZiB0aGUKKyAgICAgICAqIHByZS1tdWx0aXBsaWNhdGlvbiBpZiB0aGUgY29sb3ItbWFwIGhhcyBhbiBhbHBoYSBjaGFubmVsLgorICAgICAgICovCisgICAgICBpZiAoKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19MSU5FQVIpICE9IDApCisgICAgICB7CisgICAgICAgICBwbmdfY29uc3RfdWludF8xNnAgZW50cnkgPSBwbmdfdm9pZGNhc3QocG5nX2NvbnN0X3VpbnRfMTZwLCBjbWFwKTsKKworICAgICAgICAgZW50cnkgKz0gaSAqIGNoYW5uZWxzOworCisgICAgICAgICBpZiAoKGNoYW5uZWxzICYgMSkgIT0gMCkgLyogbm8gYWxwaGEgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjaGFubmVscyA+PSAzKSAvKiBSR0IgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBhbGV0dGVbaV0uYmx1ZSA9IChwbmdfYnl0ZSlQTkdfc1JHQl9GUk9NX0xJTkVBUigyNTUgKgorICAgICAgICAgICAgICAgICAgIGVudHJ5WygyIF4gYmdyKV0pOworICAgICAgICAgICAgICAgcGFsZXR0ZVtpXS5ncmVlbiA9IChwbmdfYnl0ZSlQTkdfc1JHQl9GUk9NX0xJTkVBUigyNTUgKgorICAgICAgICAgICAgICAgICAgIGVudHJ5WzFdKTsKKyAgICAgICAgICAgICAgIHBhbGV0dGVbaV0ucmVkID0gKHBuZ19ieXRlKVBOR19zUkdCX0ZST01fTElORUFSKDI1NSAqCisgICAgICAgICAgICAgICAgICAgZW50cnlbYmdyXSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsc2UgLyogR3JheSAqLworICAgICAgICAgICAgICAgcGFsZXR0ZVtpXS5ibHVlID0gcGFsZXR0ZVtpXS5yZWQgPSBwYWxldHRlW2ldLmdyZWVuID0KKyAgICAgICAgICAgICAgICAgIChwbmdfYnl0ZSlQTkdfc1JHQl9GUk9NX0xJTkVBUigyNTUgKiAqZW50cnkpOworICAgICAgICAgfQorCisgICAgICAgICBlbHNlIC8qIGFscGhhICovCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfdWludF8xNiBhbHBoYSA9IGVudHJ5W2FmaXJzdCA/IDAgOiBjaGFubmVscy0xXTsKKyAgICAgICAgICAgIHBuZ19ieXRlIGFscGhhYnl0ZSA9IChwbmdfYnl0ZSlQTkdfRElWMjU3KGFscGhhKTsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIHJlY2lwcm9jYWwgPSAwOworCisgICAgICAgICAgICAvKiBDYWxjdWxhdGUgYSByZWNpcHJvY2FsLCBhcyBpbiB0aGUgcG5nX3dyaXRlX2ltYWdlXzhiaXQgY29kZSBhYm92ZQorICAgICAgICAgICAgICogdGhpcyBpcyBkZXNpZ25lZCB0byBwcm9kdWNlIGEgdmFsdWUgc2NhbGVkIHRvIDI1NSo2NTUzNSB3aGVuCisgICAgICAgICAgICAgKiBkaXZpZGVkIGJ5IDEyOCAoaS5lLiBhc3IgNykuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChhbHBoYWJ5dGUgPiAwICYmIGFscGhhYnl0ZSA8IDI1NSkKKyAgICAgICAgICAgICAgIHJlY2lwcm9jYWwgPSAoKCgweGZmZmYqMHhmZik8PDcpKyhhbHBoYT4+MSkpL2FscGhhOworCisgICAgICAgICAgICB0Uk5TW2ldID0gYWxwaGFieXRlOworICAgICAgICAgICAgaWYgKGFscGhhYnl0ZSA8IDI1NSkKKyAgICAgICAgICAgICAgIG51bV90cmFucyA9IGkrMTsKKworICAgICAgICAgICAgaWYgKGNoYW5uZWxzID49IDMpIC8qIFJHQiAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcGFsZXR0ZVtpXS5ibHVlID0gcG5nX3VucHJlbXVsdGlwbHkoZW50cnlbYWZpcnN0ICsgKDIgXiBiZ3IpXSwKKyAgICAgICAgICAgICAgICAgIGFscGhhLCByZWNpcHJvY2FsKTsKKyAgICAgICAgICAgICAgIHBhbGV0dGVbaV0uZ3JlZW4gPSBwbmdfdW5wcmVtdWx0aXBseShlbnRyeVthZmlyc3QgKyAxXSwgYWxwaGEsCisgICAgICAgICAgICAgICAgICByZWNpcHJvY2FsKTsKKyAgICAgICAgICAgICAgIHBhbGV0dGVbaV0ucmVkID0gcG5nX3VucHJlbXVsdGlwbHkoZW50cnlbYWZpcnN0ICsgYmdyXSwgYWxwaGEsCisgICAgICAgICAgICAgICAgICByZWNpcHJvY2FsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWxzZSAvKiBncmF5ICovCisgICAgICAgICAgICAgICBwYWxldHRlW2ldLmJsdWUgPSBwYWxldHRlW2ldLnJlZCA9IHBhbGV0dGVbaV0uZ3JlZW4gPQorICAgICAgICAgICAgICAgICAgcG5nX3VucHJlbXVsdGlwbHkoZW50cnlbYWZpcnN0XSwgYWxwaGEsIHJlY2lwcm9jYWwpOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBlbHNlIC8qIENvbG9yLW1hcCBoYXMgc1JHQiB2YWx1ZXMgKi8KKyAgICAgIHsKKyAgICAgICAgIHBuZ19jb25zdF9ieXRlcCBlbnRyeSA9IHBuZ192b2lkY2FzdChwbmdfY29uc3RfYnl0ZXAsIGNtYXApOworCisgICAgICAgICBlbnRyeSArPSBpICogY2hhbm5lbHM7CisKKyAgICAgICAgIHN3aXRjaCAoY2hhbm5lbHMpCisgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICB0Uk5TW2ldID0gZW50cnlbYWZpcnN0ID8gMCA6IDNdOworICAgICAgICAgICAgICAgaWYgKHRSTlNbaV0gPCAyNTUpCisgICAgICAgICAgICAgICAgICBudW1fdHJhbnMgPSBpKzE7CisgICAgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgIHBhbGV0dGVbaV0uYmx1ZSA9IGVudHJ5W2FmaXJzdCArICgyIF4gYmdyKV07CisgICAgICAgICAgICAgICBwYWxldHRlW2ldLmdyZWVuID0gZW50cnlbYWZpcnN0ICsgMV07CisgICAgICAgICAgICAgICBwYWxldHRlW2ldLnJlZCA9IGVudHJ5W2FmaXJzdCArIGJncl07CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgdFJOU1tpXSA9IGVudHJ5WzEgXiBhZmlyc3RdOworICAgICAgICAgICAgICAgaWYgKHRSTlNbaV0gPCAyNTUpCisgICAgICAgICAgICAgICAgICBudW1fdHJhbnMgPSBpKzE7CisgICAgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgIHBhbGV0dGVbaV0uYmx1ZSA9IHBhbGV0dGVbaV0ucmVkID0gcGFsZXR0ZVtpXS5ncmVlbiA9CisgICAgICAgICAgICAgICAgICBlbnRyeVthZmlyc3RdOworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworIyAgIGlmZGVmIGFmaXJzdAorIyAgICAgdW5kZWYgYWZpcnN0CisjICAgZW5kaWYKKyMgICBpZmRlZiBiZ3IKKyMgICAgIHVuZGVmIGJncgorIyAgIGVuZGlmCisKKyAgIHBuZ19zZXRfUExURShpbWFnZS0+b3BhcXVlLT5wbmdfcHRyLCBpbWFnZS0+b3BhcXVlLT5pbmZvX3B0ciwgcGFsZXR0ZSwKKyAgICAgIGVudHJpZXMpOworCisgICBpZiAobnVtX3RyYW5zID4gMCkKKyAgICAgIHBuZ19zZXRfdFJOUyhpbWFnZS0+b3BhcXVlLT5wbmdfcHRyLCBpbWFnZS0+b3BhcXVlLT5pbmZvX3B0ciwgdFJOUywKKyAgICAgICAgIG51bV90cmFucywgTlVMTCk7CisKKyAgIGltYWdlLT5jb2xvcm1hcF9lbnRyaWVzID0gZW50cmllczsKK30KKworc3RhdGljIGludAorcG5nX2ltYWdlX3dyaXRlX21haW4ocG5nX3ZvaWRwIGFyZ3VtZW50KQoreworICAgcG5nX2ltYWdlX3dyaXRlX2NvbnRyb2wgKmRpc3BsYXkgPSBwbmdfdm9pZGNhc3QocG5nX2ltYWdlX3dyaXRlX2NvbnRyb2wqLAorICAgICAgYXJndW1lbnQpOworICAgcG5nX2ltYWdlcCBpbWFnZSA9IGRpc3BsYXktPmltYWdlOworICAgcG5nX3N0cnVjdHJwIHBuZ19wdHIgPSBpbWFnZS0+b3BhcXVlLT5wbmdfcHRyOworICAgcG5nX2luZm9ycCBpbmZvX3B0ciA9IGltYWdlLT5vcGFxdWUtPmluZm9fcHRyOworICAgcG5nX3VpbnRfMzIgZm9ybWF0ID0gaW1hZ2UtPmZvcm1hdDsKKworICAgLyogVGhlIGZvbGxvd2luZyBmb3VyIGludHMgYXJlIGFjdHVhbGx5IGJvb2xlYW5zICovCisgICBpbnQgY29sb3JtYXAgPSAoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQKTsKKyAgIGludCBsaW5lYXIgPSAhY29sb3JtYXAgJiYgKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19MSU5FQVIpOyAvKiBpbnB1dCAqLworICAgaW50IGFscGhhID0gIWNvbG9ybWFwICYmIChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQUxQSEEpOworICAgaW50IHdyaXRlXzE2Yml0ID0gbGluZWFyICYmICFjb2xvcm1hcCAmJiAoZGlzcGxheS0+Y29udmVydF90b184Yml0ID09IDApOworCisjICAgaWZkZWYgUE5HX0JFTklHTl9FUlJPUlNfU1VQUE9SVEVECisgICAgICAvKiBNYWtlIHN1cmUgd2UgZXJyb3Igb3V0IG9uIGFueSBiYWQgc2l0dWF0aW9uICovCisgICAgICBwbmdfc2V0X2Jlbmlnbl9lcnJvcnMocG5nX3B0ciwgMC8qZXJyb3IqLyk7CisjICAgZW5kaWYKKworICAgLyogRGVmYXVsdCB0aGUgJ3Jvd19zdHJpZGUnIHBhcmFtZXRlciBpZiByZXF1aXJlZC4gKi8KKyAgIGlmIChkaXNwbGF5LT5yb3dfc3RyaWRlID09IDApCisgICAgICBkaXNwbGF5LT5yb3dfc3RyaWRlID0gUE5HX0lNQUdFX1JPV19TVFJJREUoKmltYWdlKTsKKworICAgLyogU2V0IHRoZSByZXF1aXJlZCB0cmFuc2Zvcm1zIHRoZW4gd3JpdGUgdGhlIHJvd3MgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuICovCisgICBpZiAoKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCkgIT0gMCkKKyAgIHsKKyAgICAgIGlmIChkaXNwbGF5LT5jb2xvcm1hcCAhPSBOVUxMICYmIGltYWdlLT5jb2xvcm1hcF9lbnRyaWVzID4gMCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ191aW50XzMyIGVudHJpZXMgPSBpbWFnZS0+Y29sb3JtYXBfZW50cmllczsKKworICAgICAgICAgcG5nX3NldF9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCBpbWFnZS0+d2lkdGgsIGltYWdlLT5oZWlnaHQsCisgICAgICAgICAgICBlbnRyaWVzID4gMTYgPyA4IDogKGVudHJpZXMgPiA0ID8gNCA6IChlbnRyaWVzID4gMiA/IDIgOiAxKSksCisgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFLCBQTkdfSU5URVJMQUNFX05PTkUsCisgICAgICAgICAgICBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFLCBQTkdfRklMVEVSX1RZUEVfQkFTRSk7CisKKyAgICAgICAgIHBuZ19pbWFnZV9zZXRfUExURShkaXNwbGF5KTsKKyAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgICAgcG5nX2Vycm9yKGltYWdlLT5vcGFxdWUtPnBuZ19wdHIsCisgICAgICAgICAgICAibm8gY29sb3ItbWFwIGZvciBjb2xvci1tYXBwZWQgaW1hZ2UiKTsKKyAgIH0KKworICAgZWxzZQorICAgICAgcG5nX3NldF9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCBpbWFnZS0+d2lkdGgsIGltYWdlLT5oZWlnaHQsCisgICAgICAgICB3cml0ZV8xNmJpdCA/IDE2IDogOCwKKyAgICAgICAgICgoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9SKSA/IFBOR19DT0xPUl9NQVNLX0NPTE9SIDogMCkgKworICAgICAgICAgKChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQUxQSEEpID8gUE5HX0NPTE9SX01BU0tfQUxQSEEgOiAwKSwKKyAgICAgICAgIFBOR19JTlRFUkxBQ0VfTk9ORSwgUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSwgUE5HX0ZJTFRFUl9UWVBFX0JBU0UpOworCisgICAvKiBDb3VudGVyLWludHVpdGl2ZWx5IHRoZSBkYXRhIHRyYW5zZm9ybWF0aW9ucyBtdXN0IGJlIGNhbGxlZCAqYWZ0ZXIqCisgICAgKiBwbmdfd3JpdGVfaW5mbywgbm90IGJlZm9yZSBhcyBpbiB0aGUgcmVhZCBjb2RlLCBidXQgdGhlICdzZXQnIGZ1bmN0aW9ucworICAgICogbXVzdCBzdGlsbCBiZSBjYWxsZWQgYmVmb3JlLiAgSnVzdCBzZXQgdGhlIGNvbG9yIHNwYWNlIGluZm9ybWF0aW9uLCBuZXZlcgorICAgICogd3JpdGUgYW4gaW50ZXJsYWNlZCBpbWFnZS4KKyAgICAqLworCisgICBpZiAod3JpdGVfMTZiaXQgIT0gMCkKKyAgIHsKKyAgICAgIC8qIFRoZSBnYW1tYSBoZXJlIGlzIDEuMCAobGluZWFyKSBhbmQgdGhlIGNIUk0gY2h1bmsgbWF0Y2hlcyBzUkdCLiAqLworICAgICAgcG5nX3NldF9nQU1BX2ZpeGVkKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfR0FNTUFfTElORUFSKTsKKworICAgICAgaWYgKChpbWFnZS0+ZmxhZ3MgJiBQTkdfSU1BR0VfRkxBR19DT0xPUlNQQUNFX05PVF9zUkdCKSA9PSAwKQorICAgICAgICAgcG5nX3NldF9jSFJNX2ZpeGVkKHBuZ19wdHIsIGluZm9fcHRyLAorICAgICAgICAgICAgLyogY29sb3IgICAgICB4ICAgICAgIHkgKi8KKyAgICAgICAgICAgIC8qIHdoaXRlICovIDMxMjcwLCAzMjkwMCwKKyAgICAgICAgICAgIC8qIHJlZCAgICovIDY0MDAwLCAzMzAwMCwKKyAgICAgICAgICAgIC8qIGdyZWVuICovIDMwMDAwLCA2MDAwMCwKKyAgICAgICAgICAgIC8qIGJsdWUgICovIDE1MDAwLCAgNjAwMAorICAgICAgICAgKTsKKyAgIH0KKworICAgZWxzZSBpZiAoKGltYWdlLT5mbGFncyAmIFBOR19JTUFHRV9GTEFHX0NPTE9SU1BBQ0VfTk9UX3NSR0IpID09IDApCisgICAgICBwbmdfc2V0X3NSR0IocG5nX3B0ciwgaW5mb19wdHIsIFBOR19zUkdCX0lOVEVOVF9QRVJDRVBUVUFMKTsKKworICAgLyogRWxzZSB3cml0aW5nIGFuIDgtYml0IGZpbGUgYW5kIHRoZSAqY29sb3JzKiBhcmVuJ3Qgc1JHQiwgYnV0IHRoZSA4LWJpdAorICAgICogc3BhY2UgbXVzdCBzdGlsbCBiZSBnYW1tYSBlbmNvZGVkLgorICAgICovCisgICBlbHNlCisgICAgICBwbmdfc2V0X2dBTUFfZml4ZWQocG5nX3B0ciwgaW5mb19wdHIsIFBOR19HQU1NQV9zUkdCX0lOVkVSU0UpOworCisgICAvKiBXcml0ZSB0aGUgZmlsZSBoZWFkZXIuICovCisgICBwbmdfd3JpdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7CisKKyAgIC8qIE5vdyBzZXQgdXAgdGhlIGRhdGEgdHJhbnNmb3JtYXRpb25zICgqYWZ0ZXIqIHRoZSBoZWFkZXIgaXMgd3JpdHRlbiksCisgICAgKiByZW1vdmUgdGhlIGhhbmRsZWQgdHJhbnNmb3JtYXRpb25zIGZyb20gdGhlICdmb3JtYXQnIGZsYWdzIGZvciBjaGVja2luZy4KKyAgICAqCisgICAgKiBGaXJzdCBjaGVjayBmb3IgYSBsaXR0bGUgZW5kaWFuIHN5c3RlbSBpZiB3cml0aW5nIDE2LWJpdCBmaWxlcy4KKyAgICAqLworICAgaWYgKHdyaXRlXzE2Yml0ICE9IDApCisgICB7CisgICAgICBQTkdfQ09OU1QgcG5nX3VpbnRfMTYgbGUgPSAweDAwMDE7CisKKyAgICAgIGlmICgoKihwbmdfY29uc3RfYnl0ZXApICYgbGUpICE9IDApCisgICAgICAgICBwbmdfc2V0X3N3YXAocG5nX3B0cik7CisgICB9CisKKyMgICBpZmRlZiBQTkdfU0lNUExJRklFRF9XUklURV9CR1JfU1VQUE9SVEVECisgICAgICBpZiAoKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19CR1IpICE9IDApCisgICAgICB7CisgICAgICAgICBpZiAoY29sb3JtYXAgPT0gMCAmJiAoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9SKSAhPSAwKQorICAgICAgICAgICAgcG5nX3NldF9iZ3IocG5nX3B0cik7CisgICAgICAgICBmb3JtYXQgJj0gflBOR19GT1JNQVRfRkxBR19CR1I7CisgICAgICB9CisjICAgZW5kaWYKKworIyAgIGlmZGVmIFBOR19TSU1QTElGSUVEX1dSSVRFX0FGSVJTVF9TVVBQT1JURUQKKyAgICAgIGlmICgoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FGSVJTVCkgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgIGlmIChjb2xvcm1hcCA9PSAwICYmIChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQUxQSEEpICE9IDApCisgICAgICAgICAgICBwbmdfc2V0X3N3YXBfYWxwaGEocG5nX3B0cik7CisgICAgICAgICBmb3JtYXQgJj0gflBOR19GT1JNQVRfRkxBR19BRklSU1Q7CisgICAgICB9CisjICAgZW5kaWYKKworICAgLyogSWYgdGhlcmUgYXJlIDE2IG9yIGZld2VyIGNvbG9yLW1hcCBlbnRyaWVzIHdlIHdyb3RlIGEgbG93ZXIgYml0IGRlcHRoCisgICAgKiBhYm92ZSwgYnV0IHRoZSBhcHBsaWNhdGlvbiBkYXRhIGlzIHN0aWxsIGJ5dGUgcGFja2VkLgorICAgICovCisgICBpZiAoY29sb3JtYXAgIT0gMCAmJiBpbWFnZS0+Y29sb3JtYXBfZW50cmllcyA8PSAxNikKKyAgICAgIHBuZ19zZXRfcGFja2luZyhwbmdfcHRyKTsKKworICAgLyogVGhhdCBzaG91bGQgaGF2ZSBoYW5kbGVkIGFsbCAoYm90aCkgdGhlIHRyYW5zZm9ybXMuICovCisgICBpZiAoKGZvcm1hdCAmIH4ocG5nX3VpbnRfMzIpKFBOR19GT1JNQVRfRkxBR19DT0xPUiB8IFBOR19GT1JNQVRfRkxBR19MSU5FQVIgfAorICAgICAgICAgUE5HX0ZPUk1BVF9GTEFHX0FMUEhBIHwgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQKSkgIT0gMCkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAicG5nX3dyaXRlX2ltYWdlOiB1bnN1cHBvcnRlZCB0cmFuc2Zvcm1hdGlvbiIpOworCisgICB7CisgICAgICBwbmdfY29uc3RfYnl0ZXAgcm93ID0gcG5nX3ZvaWRjYXN0KHBuZ19jb25zdF9ieXRlcCwgZGlzcGxheS0+YnVmZmVyKTsKKyAgICAgIHB0cmRpZmZfdCByb3dfYnl0ZXMgPSBkaXNwbGF5LT5yb3dfc3RyaWRlOworCisgICAgICBpZiAobGluZWFyICE9IDApCisgICAgICAgICByb3dfYnl0ZXMgKj0gKHNpemVvZiAocG5nX3VpbnRfMTYpKTsKKworICAgICAgaWYgKHJvd19ieXRlcyA8IDApCisgICAgICAgICByb3cgKz0gKGltYWdlLT5oZWlnaHQtMSkgKiAoLXJvd19ieXRlcyk7CisKKyAgICAgIGRpc3BsYXktPmZpcnN0X3JvdyA9IHJvdzsKKyAgICAgIGRpc3BsYXktPnJvd19ieXRlcyA9IHJvd19ieXRlczsKKyAgIH0KKworICAgLyogQXBwbHkgJ2Zhc3QnIG9wdGlvbnMgaWYgdGhlIGZsYWcgaXMgc2V0LiAqLworICAgaWYgKChpbWFnZS0+ZmxhZ3MgJiBQTkdfSU1BR0VfRkxBR19GQVNUKSAhPSAwKQorICAgeworICAgICAgcG5nX3NldF9maWx0ZXIocG5nX3B0ciwgUE5HX0ZJTFRFUl9UWVBFX0JBU0UsIFBOR19OT19GSUxURVJTKTsKKyAgICAgIC8qIE5PVEU6IGRldGVybWluZWQgYnkgZXhwZXJpbWVudCB1c2luZyBwbmdzdGVzdCwgdGhpcyByZWZsZWN0cyBzb21lCisgICAgICAgKiBiYWxhbmNlIGJldHdlZW4gdGhlIHRpbWUgdG8gd3JpdGUgdGhlIGltYWdlIG9uY2UgYW5kIHRoZSB0aW1lIHRvIHJlYWQKKyAgICAgICAqIGl0IGFib3V0IDUwIHRpbWVzLiAgVGhlIHNwZWVkLXVwIGluIHBuZ3N0ZXN0IHdhcyBhYm91dCAxMC0yMCUgb2YgdGhlCisgICAgICAgKiB0b3RhbCAodXNlcikgdGltZSBvbiBhIGhlYXZpbHkgbG9hZGVkIHN5c3RlbS4KKyAgICAgICAqLworIyAgIGlmZGVmIFBOR19XUklURV9DVVNUT01JWkVfQ09NUFJFU1NJT05fU1VQUE9SVEVECisgICAgICBwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsKHBuZ19wdHIsIDMpOworIyAgIGVuZGlmCisgICB9CisKKyAgIC8qIENoZWNrIGZvciB0aGUgY2FzZXMgdGhhdCBjdXJyZW50bHkgcmVxdWlyZSBhIHByZS10cmFuc2Zvcm0gb24gdGhlIHJvdworICAgICogYmVmb3JlIGl0IGlzIHdyaXR0ZW4uICBUaGlzIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBpbnB1dCBpcyAxNi1iaXQgYW5kCisgICAgKiBlaXRoZXIgdGhlcmUgaXMgYW4gYWxwaGEgY2hhbm5lbCBvciBpdCBpcyBjb252ZXJ0ZWQgdG8gOC1iaXQuCisgICAgKi8KKyAgIGlmICgobGluZWFyICE9IDAgJiYgYWxwaGEgIT0gMCApIHx8CisgICAgICAgKGNvbG9ybWFwID09IDAgJiYgZGlzcGxheS0+Y29udmVydF90b184Yml0ICE9IDApKQorICAgeworICAgICAgcG5nX2J5dGVwIHJvdyA9IHBuZ192b2lkY2FzdChwbmdfYnl0ZXAsIHBuZ19tYWxsb2MocG5nX3B0ciwKKyAgICAgICAgIHBuZ19nZXRfcm93Ynl0ZXMocG5nX3B0ciwgaW5mb19wdHIpKSk7CisgICAgICBpbnQgcmVzdWx0OworCisgICAgICBkaXNwbGF5LT5sb2NhbF9yb3cgPSByb3c7CisgICAgICBpZiAod3JpdGVfMTZiaXQgIT0gMCkKKyAgICAgICAgIHJlc3VsdCA9IHBuZ19zYWZlX2V4ZWN1dGUoaW1hZ2UsIHBuZ193cml0ZV9pbWFnZV8xNmJpdCwgZGlzcGxheSk7CisgICAgICBlbHNlCisgICAgICAgICByZXN1bHQgPSBwbmdfc2FmZV9leGVjdXRlKGltYWdlLCBwbmdfd3JpdGVfaW1hZ2VfOGJpdCwgZGlzcGxheSk7CisgICAgICBkaXNwbGF5LT5sb2NhbF9yb3cgPSBOVUxMOworCisgICAgICBwbmdfZnJlZShwbmdfcHRyLCByb3cpOworCisgICAgICAvKiBTa2lwIHRoZSAnd3JpdGVfZW5kJyBvbiBlcnJvcjogKi8KKyAgICAgIGlmIChyZXN1bHQgPT0gMCkKKyAgICAgICAgIHJldHVybiAwOworICAgfQorCisgICAvKiBPdGhlcndpc2UgdGhpcyBpcyB0aGUgY2FzZSB3aGVyZSB0aGUgaW5wdXQgaXMgaW4gYSBmb3JtYXQgY3VycmVudGx5CisgICAgKiBzdXBwb3J0ZWQgYnkgdGhlIHJlc3Qgb2YgdGhlIGxpYnBuZyB3cml0ZSBjb2RlOyBjYWxsIGl0IGRpcmVjdGx5LgorICAgICovCisgICBlbHNlCisgICB7CisgICAgICBwbmdfY29uc3RfYnl0ZXAgcm93ID0gcG5nX3ZvaWRjYXN0KHBuZ19jb25zdF9ieXRlcCwgZGlzcGxheS0+Zmlyc3Rfcm93KTsKKyAgICAgIHB0cmRpZmZfdCByb3dfYnl0ZXMgPSBkaXNwbGF5LT5yb3dfYnl0ZXM7CisgICAgICBwbmdfdWludF8zMiB5ID0gaW1hZ2UtPmhlaWdodDsKKworICAgICAgd2hpbGUgKHktLSA+IDApCisgICAgICB7CisgICAgICAgICBwbmdfd3JpdGVfcm93KHBuZ19wdHIsIHJvdyk7CisgICAgICAgICByb3cgKz0gcm93X2J5dGVzOworICAgICAgfQorICAgfQorCisgICBwbmdfd3JpdGVfZW5kKHBuZ19wdHIsIGluZm9fcHRyKTsKKyAgIHJldHVybiAxOworfQorCitpbnQgUE5HQVBJCitwbmdfaW1hZ2Vfd3JpdGVfdG9fc3RkaW8ocG5nX2ltYWdlcCBpbWFnZSwgRklMRSAqZmlsZSwgaW50IGNvbnZlcnRfdG9fOGJpdCwKKyAgIGNvbnN0IHZvaWQgKmJ1ZmZlciwgcG5nX2ludF8zMiByb3dfc3RyaWRlLCBjb25zdCB2b2lkICpjb2xvcm1hcCkKK3sKKyAgIC8qIFdyaXRlIHRoZSBpbWFnZSB0byB0aGUgZ2l2ZW4gKEZJTEUqKS4gKi8KKyAgIGlmIChpbWFnZSAhPSBOVUxMICYmIGltYWdlLT52ZXJzaW9uID09IFBOR19JTUFHRV9WRVJTSU9OKQorICAgeworICAgICAgaWYgKGZpbGUgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIGlmIChwbmdfaW1hZ2Vfd3JpdGVfaW5pdChpbWFnZSkgIT0gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19pbWFnZV93cml0ZV9jb250cm9sIGRpc3BsYXk7CisgICAgICAgICAgICBpbnQgcmVzdWx0OworCisgICAgICAgICAgICAvKiBUaGlzIGlzIHNsaWdodGx5IGV2aWwsIGJ1dCBwbmdfaW5pdF9pbyBkb2Vzbid0IGRvIGFueXRoaW5nIG90aGVyCisgICAgICAgICAgICAgKiB0aGFuIHRoaXMgYW5kIHdlIGhhdmVuJ3QgY2hhbmdlZCB0aGUgc3RhbmRhcmQgSU8gZnVuY3Rpb25zIHNvCisgICAgICAgICAgICAgKiB0aGlzIHNhdmVzIGEgJ3NhZmUnIGZ1bmN0aW9uLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbWFnZS0+b3BhcXVlLT5wbmdfcHRyLT5pb19wdHIgPSBmaWxlOworCisgICAgICAgICAgICBtZW1zZXQoJmRpc3BsYXksIDAsIChzaXplb2YgZGlzcGxheSkpOworICAgICAgICAgICAgZGlzcGxheS5pbWFnZSA9IGltYWdlOworICAgICAgICAgICAgZGlzcGxheS5idWZmZXIgPSBidWZmZXI7CisgICAgICAgICAgICBkaXNwbGF5LnJvd19zdHJpZGUgPSByb3dfc3RyaWRlOworICAgICAgICAgICAgZGlzcGxheS5jb2xvcm1hcCA9IGNvbG9ybWFwOworICAgICAgICAgICAgZGlzcGxheS5jb252ZXJ0X3RvXzhiaXQgPSBjb252ZXJ0X3RvXzhiaXQ7CisKKyAgICAgICAgICAgIHJlc3VsdCA9IHBuZ19zYWZlX2V4ZWN1dGUoaW1hZ2UsIHBuZ19pbWFnZV93cml0ZV9tYWluLCAmZGlzcGxheSk7CisgICAgICAgICAgICBwbmdfaW1hZ2VfZnJlZShpbWFnZSk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgfQorCisgICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgICAgcmV0dXJuIHBuZ19pbWFnZV9lcnJvcihpbWFnZSwKKyAgICAgICAgICAgICJwbmdfaW1hZ2Vfd3JpdGVfdG9fc3RkaW86IGludmFsaWQgYXJndW1lbnQiKTsKKyAgIH0KKworICAgZWxzZSBpZiAoaW1hZ2UgIT0gTlVMTCkKKyAgICAgIHJldHVybiBwbmdfaW1hZ2VfZXJyb3IoaW1hZ2UsCisgICAgICAgICAicG5nX2ltYWdlX3dyaXRlX3RvX3N0ZGlvOiBpbmNvcnJlY3QgUE5HX0lNQUdFX1ZFUlNJT04iKTsKKworICAgZWxzZQorICAgICAgcmV0dXJuIDA7Cit9CisKK2ludCBQTkdBUEkKK3BuZ19pbWFnZV93cml0ZV90b19maWxlKHBuZ19pbWFnZXAgaW1hZ2UsIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwKKyAgIGludCBjb252ZXJ0X3RvXzhiaXQsIGNvbnN0IHZvaWQgKmJ1ZmZlciwgcG5nX2ludF8zMiByb3dfc3RyaWRlLAorICAgY29uc3Qgdm9pZCAqY29sb3JtYXApCit7CisgICAvKiBXcml0ZSB0aGUgaW1hZ2UgdG8gdGhlIG5hbWVkIGZpbGUuICovCisgICBpZiAoaW1hZ2UgIT0gTlVMTCAmJiBpbWFnZS0+dmVyc2lvbiA9PSBQTkdfSU1BR0VfVkVSU0lPTikKKyAgIHsKKyAgICAgIGlmIChmaWxlX25hbWUgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIEZJTEUgKmZwID0gZm9wZW4oZmlsZV9uYW1lLCAid2IiKTsKKworICAgICAgICAgaWYgKGZwICE9IE5VTEwpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAocG5nX2ltYWdlX3dyaXRlX3RvX3N0ZGlvKGltYWdlLCBmcCwgY29udmVydF90b184Yml0LCBidWZmZXIsCisgICAgICAgICAgICAgICByb3dfc3RyaWRlLCBjb2xvcm1hcCkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGludCBlcnJvcjsgLyogZnJvbSBmZmx1c2gvZmNsb3NlICovCisKKyAgICAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgZmlsZSBpcyBmbHVzaGVkIGNvcnJlY3RseS4gKi8KKyAgICAgICAgICAgICAgIGlmIChmZmx1c2goZnApID09IDAgJiYgZmVycm9yKGZwKSA9PSAwKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKGZjbG9zZShmcCkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgICAgICAgICAgICBlcnJvciA9IGVycm5vOyAvKiBmcm9tIGZjbG9zZSAqLworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBlcnJvciA9IGVycm5vOyAvKiBmcm9tIGZmbHVzaCBvciBmZXJyb3IgKi8KKyAgICAgICAgICAgICAgICAgICh2b2lkKWZjbG9zZShmcCk7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICh2b2lkKXJlbW92ZShmaWxlX25hbWUpOworICAgICAgICAgICAgICAgLyogVGhlIGltYWdlIGhhcyBhbHJlYWR5IGJlZW4gY2xlYW5lZCB1cDsgdGhpcyBpcyBqdXN0IHVzZWQgdG8KKyAgICAgICAgICAgICAgICAqIHNldCB0aGUgZXJyb3IgKGJlY2F1c2UgdGhlIG9yaWdpbmFsIHdyaXRlIHN1Y2NlZWRlZCkuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIHJldHVybiBwbmdfaW1hZ2VfZXJyb3IoaW1hZ2UsIHN0cmVycm9yKGVycm9yKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8qIENsZWFuIHVwOiBqdXN0IHRoZSBvcGVuZWQgZmlsZS4gKi8KKyAgICAgICAgICAgICAgICh2b2lkKWZjbG9zZShmcCk7CisgICAgICAgICAgICAgICAodm9pZClyZW1vdmUoZmlsZV9uYW1lKTsKKyAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gcG5nX2ltYWdlX2Vycm9yKGltYWdlLCBzdHJlcnJvcihlcnJubykpOworICAgICAgfQorCisgICAgICBlbHNlCisgICAgICAgICByZXR1cm4gcG5nX2ltYWdlX2Vycm9yKGltYWdlLAorICAgICAgICAgICAgInBuZ19pbWFnZV93cml0ZV90b19maWxlOiBpbnZhbGlkIGFyZ3VtZW50Iik7CisgICB9CisKKyAgIGVsc2UgaWYgKGltYWdlICE9IE5VTEwpCisgICAgICByZXR1cm4gcG5nX2ltYWdlX2Vycm9yKGltYWdlLAorICAgICAgICAgInBuZ19pbWFnZV93cml0ZV90b19maWxlOiBpbmNvcnJlY3QgUE5HX0lNQUdFX1ZFUlNJT04iKTsKKworICAgZWxzZQorICAgICAgcmV0dXJuIDA7Cit9CisjIGVuZGlmIC8qIFNURElPICovCisjZW5kaWYgLyogU0lNUExJRklFRF9XUklURSAqLworI2VuZGlmIC8qIFdSSVRFICovCmRpZmYgLS1naXQgYS9saWJwbmcvcG5nd3RyYW4uYyBiL2xpYnBuZy9wbmd3dHJhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYzk0OTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvcG5nd3RyYW4uYwpAQCAtMCwwICsxLDU3NiBAQAorCisvKiBwbmd3dHJhbi5jIC0gdHJhbnNmb3JtcyB0aGUgZGF0YSBpbiBhIHJvdyBmb3IgUE5HIHdyaXRlcnMKKyAqCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4xOCBbSnVseSAyMywgMjAxNV0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDE1IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCisgKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCisgKi8KKworI2luY2x1ZGUgInBuZ3ByaXYuaCIKKworI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKKyNpZmRlZiBQTkdfV1JJVEVfVFJBTlNGT1JNU19TVVBQT1JURUQKKworI2lmZGVmIFBOR19XUklURV9QQUNLX1NVUFBPUlRFRAorLyogUGFjayBwaXhlbHMgaW50byBieXRlcy4gIFBhc3MgdGhlIHRydWUgYml0IGRlcHRoIGluIGJpdF9kZXB0aC4gIFRoZQorICogcm93X2luZm8gYml0IGRlcHRoIHNob3VsZCBiZSA4IChvbmUgcGl4ZWwgcGVyIGJ5dGUpLiAgVGhlIGNoYW5uZWxzCisgKiBzaG91bGQgYmUgMSAodGhpcyBvbmx5IGhhcHBlbnMgb24gZ3JheXNjYWxlIGFuZCBwYWxldHRlZCBpbWFnZXMpLgorICovCitzdGF0aWMgdm9pZAorcG5nX2RvX3BhY2socG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywgcG5nX3VpbnRfMzIgYml0X2RlcHRoKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fcGFjayIpOworCisgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4ICYmCisgICAgICByb3dfaW5mby0+Y2hhbm5lbHMgPT0gMSkKKyAgIHsKKyAgICAgIHN3aXRjaCAoKGludCliaXRfZGVwdGgpCisgICAgICB7CisgICAgICAgICBjYXNlIDE6CisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AsIGRwOworICAgICAgICAgICAgaW50IG1hc2ssIHY7CisgICAgICAgICAgICBwbmdfdWludF8zMiBpOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOworCisgICAgICAgICAgICBzcCA9IHJvdzsKKyAgICAgICAgICAgIGRwID0gcm93OworICAgICAgICAgICAgbWFzayA9IDB4ODA7CisgICAgICAgICAgICB2ID0gMDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKCpzcCAhPSAwKQorICAgICAgICAgICAgICAgICAgdiB8PSBtYXNrOworCisgICAgICAgICAgICAgICBzcCsrOworCisgICAgICAgICAgICAgICBpZiAobWFzayA+IDEpCisgICAgICAgICAgICAgICAgICBtYXNrID4+PSAxOworCisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBtYXNrID0gMHg4MDsKKyAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSl2OworICAgICAgICAgICAgICAgICAgZHArKzsKKyAgICAgICAgICAgICAgICAgIHYgPSAwOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobWFzayAhPSAweDgwKQorICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKXY7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBjYXNlIDI6CisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AsIGRwOworICAgICAgICAgICAgdW5zaWduZWQgaW50IHNoaWZ0OworICAgICAgICAgICAgaW50IHY7CisgICAgICAgICAgICBwbmdfdWludF8zMiBpOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOworCisgICAgICAgICAgICBzcCA9IHJvdzsKKyAgICAgICAgICAgIGRwID0gcm93OworICAgICAgICAgICAgc2hpZnQgPSA2OworICAgICAgICAgICAgdiA9IDA7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19ieXRlIHZhbHVlOworCisgICAgICAgICAgICAgICB2YWx1ZSA9IChwbmdfYnl0ZSkoKnNwICYgMHgwMyk7CisgICAgICAgICAgICAgICB2IHw9ICh2YWx1ZSA8PCBzaGlmdCk7CisKKyAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSAwKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc2hpZnQgPSA2OworICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKXY7CisgICAgICAgICAgICAgICAgICBkcCsrOworICAgICAgICAgICAgICAgICAgdiA9IDA7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHNoaWZ0IC09IDI7CisKKyAgICAgICAgICAgICAgIHNwKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzaGlmdCAhPSA2KQorICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKXY7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBjYXNlIDQ6CisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AsIGRwOworICAgICAgICAgICAgdW5zaWduZWQgaW50IHNoaWZ0OworICAgICAgICAgICAgaW50IHY7CisgICAgICAgICAgICBwbmdfdWludF8zMiBpOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOworCisgICAgICAgICAgICBzcCA9IHJvdzsKKyAgICAgICAgICAgIGRwID0gcm93OworICAgICAgICAgICAgc2hpZnQgPSA0OworICAgICAgICAgICAgdiA9IDA7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19ieXRlIHZhbHVlOworCisgICAgICAgICAgICAgICB2YWx1ZSA9IChwbmdfYnl0ZSkoKnNwICYgMHgwZik7CisgICAgICAgICAgICAgICB2IHw9ICh2YWx1ZSA8PCBzaGlmdCk7CisKKyAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSAwKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc2hpZnQgPSA0OworICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKXY7CisgICAgICAgICAgICAgICAgICBkcCsrOworICAgICAgICAgICAgICAgICAgdiA9IDA7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHNoaWZ0IC09IDQ7CisKKyAgICAgICAgICAgICAgIHNwKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzaGlmdCAhPSA0KQorICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKXY7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHJvd19pbmZvLT5iaXRfZGVwdGggPSAocG5nX2J5dGUpYml0X2RlcHRoOworICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gKHBuZ19ieXRlKShiaXRfZGVwdGggKiByb3dfaW5mby0+Y2hhbm5lbHMpOworICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHJvd19pbmZvLT5waXhlbF9kZXB0aCwKKyAgICAgICAgICByb3dfaW5mby0+d2lkdGgpOworICAgfQorfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfU0hJRlRfU1VQUE9SVEVECisvKiBTaGlmdCBwaXhlbCB2YWx1ZXMgdG8gdGFrZSBhZHZhbnRhZ2Ugb2Ygd2hvbGUgcmFuZ2UuICBQYXNzIHRoZQorICogdHJ1ZSBudW1iZXIgb2YgYml0cyBpbiBiaXRfZGVwdGguICBUaGUgcm93IHNob3VsZCBiZSBwYWNrZWQKKyAqIGFjY29yZGluZyB0byByb3dfaW5mby0+Yml0X2RlcHRoLiAgVGh1cywgaWYgeW91IGhhZCBhIHJvdyBvZgorICogYml0IGRlcHRoIDQsIGJ1dCB0aGUgcGl4ZWxzIG9ubHkgaGFkIHZhbHVlcyBmcm9tIDAgdG8gNywgeW91CisgKiB3b3VsZCBwYXNzIDMgYXMgYml0X2RlcHRoLCBhbmQgdGhpcyByb3V0aW5lIHdvdWxkIHRyYW5zbGF0ZSB0aGUKKyAqIGRhdGEgdG8gMCB0byAxNS4KKyAqLworc3RhdGljIHZvaWQKK3BuZ19kb19zaGlmdChwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LAorICAgIHBuZ19jb25zdF9jb2xvcl84cCBiaXRfZGVwdGgpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19zaGlmdCIpOworCisgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgIT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgIHsKKyAgICAgIGludCBzaGlmdF9zdGFydFs0XSwgc2hpZnRfZGVjWzRdOworICAgICAgaW50IGNoYW5uZWxzID0gMDsKKworICAgICAgaWYgKChyb3dfaW5mby0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKSAhPSAwKQorICAgICAgeworICAgICAgICAgc2hpZnRfc3RhcnRbY2hhbm5lbHNdID0gcm93X2luZm8tPmJpdF9kZXB0aCAtIGJpdF9kZXB0aC0+cmVkOworICAgICAgICAgc2hpZnRfZGVjW2NoYW5uZWxzXSA9IGJpdF9kZXB0aC0+cmVkOworICAgICAgICAgY2hhbm5lbHMrKzsKKworICAgICAgICAgc2hpZnRfc3RhcnRbY2hhbm5lbHNdID0gcm93X2luZm8tPmJpdF9kZXB0aCAtIGJpdF9kZXB0aC0+Z3JlZW47CisgICAgICAgICBzaGlmdF9kZWNbY2hhbm5lbHNdID0gYml0X2RlcHRoLT5ncmVlbjsKKyAgICAgICAgIGNoYW5uZWxzKys7CisKKyAgICAgICAgIHNoaWZ0X3N0YXJ0W2NoYW5uZWxzXSA9IHJvd19pbmZvLT5iaXRfZGVwdGggLSBiaXRfZGVwdGgtPmJsdWU7CisgICAgICAgICBzaGlmdF9kZWNbY2hhbm5lbHNdID0gYml0X2RlcHRoLT5ibHVlOworICAgICAgICAgY2hhbm5lbHMrKzsKKyAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgc2hpZnRfc3RhcnRbY2hhbm5lbHNdID0gcm93X2luZm8tPmJpdF9kZXB0aCAtIGJpdF9kZXB0aC0+Z3JheTsKKyAgICAgICAgIHNoaWZ0X2RlY1tjaGFubmVsc10gPSBiaXRfZGVwdGgtPmdyYXk7CisgICAgICAgICBjaGFubmVscysrOworICAgICAgfQorCisgICAgICBpZiAoKHJvd19pbmZvLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpICE9IDApCisgICAgICB7CisgICAgICAgICBzaGlmdF9zdGFydFtjaGFubmVsc10gPSByb3dfaW5mby0+Yml0X2RlcHRoIC0gYml0X2RlcHRoLT5hbHBoYTsKKyAgICAgICAgIHNoaWZ0X2RlY1tjaGFubmVsc10gPSBiaXRfZGVwdGgtPmFscGhhOworICAgICAgICAgY2hhbm5lbHMrKzsKKyAgICAgIH0KKworICAgICAgLyogV2l0aCBsb3cgcm93IGRlcHRocywgY291bGQgb25seSBiZSBncmF5c2NhbGUsIHNvIG9uZSBjaGFubmVsICovCisgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA8IDgpCisgICAgICB7CisgICAgICAgICBwbmdfYnl0ZXAgYnAgPSByb3c7CisgICAgICAgICBwbmdfc2l6ZV90IGk7CisgICAgICAgICB1bnNpZ25lZCBpbnQgbWFzazsKKyAgICAgICAgIHBuZ19zaXplX3Qgcm93X2J5dGVzID0gcm93X2luZm8tPnJvd2J5dGVzOworCisgICAgICAgICBpZiAoYml0X2RlcHRoLT5ncmF5ID09IDEgJiYgcm93X2luZm8tPmJpdF9kZXB0aCA9PSAyKQorICAgICAgICAgICAgbWFzayA9IDB4NTU7CisKKyAgICAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gNCAmJiBiaXRfZGVwdGgtPmdyYXkgPT0gMykKKyAgICAgICAgICAgIG1hc2sgPSAweDExOworCisgICAgICAgICBlbHNlCisgICAgICAgICAgICBtYXNrID0gMHhmZjsKKworICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd19ieXRlczsgaSsrLCBicCsrKQorICAgICAgICAgeworICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdiwgb3V0OworCisgICAgICAgICAgICB2ID0gKmJwOworICAgICAgICAgICAgb3V0ID0gMDsKKworICAgICAgICAgICAgZm9yIChqID0gc2hpZnRfc3RhcnRbMF07IGogPiAtc2hpZnRfZGVjWzBdOyBqIC09IHNoaWZ0X2RlY1swXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmIChqID4gMCkKKyAgICAgICAgICAgICAgICAgIG91dCB8PSB2IDw8IGo7CisKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIG91dCB8PSAodiA+PiAoLWopKSAmIG1hc2s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICpicCA9IChwbmdfYnl0ZSkob3V0ICYgMHhmZik7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19ieXRlcCBicCA9IHJvdzsKKyAgICAgICAgIHBuZ191aW50XzMyIGk7CisgICAgICAgICBwbmdfdWludF8zMiBpc3RvcCA9IGNoYW5uZWxzICogcm93X2luZm8tPndpZHRoOworCisgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrKywgYnArKykKKyAgICAgICAgIHsKKworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGMgPSBpJWNoYW5uZWxzOworICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdiwgb3V0OworCisgICAgICAgICAgICB2ID0gKmJwOworICAgICAgICAgICAgb3V0ID0gMDsKKworICAgICAgICAgICAgZm9yIChqID0gc2hpZnRfc3RhcnRbY107IGogPiAtc2hpZnRfZGVjW2NdOyBqIC09IHNoaWZ0X2RlY1tjXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmIChqID4gMCkKKyAgICAgICAgICAgICAgICAgIG91dCB8PSB2IDw8IGo7CisKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIG91dCB8PSB2ID4+ICgtaik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICpicCA9IChwbmdfYnl0ZSkob3V0ICYgMHhmZik7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHBuZ19ieXRlcCBicDsKKyAgICAgICAgIHBuZ191aW50XzMyIGk7CisgICAgICAgICBwbmdfdWludF8zMiBpc3RvcCA9IGNoYW5uZWxzICogcm93X2luZm8tPndpZHRoOworCisgICAgICAgICBmb3IgKGJwID0gcm93LCBpID0gMDsgaSA8IGlzdG9wOyBpKyspCisgICAgICAgICB7CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgYyA9IGklY2hhbm5lbHM7CisgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWx1ZSwgdjsKKworICAgICAgICAgICAgdiA9IHBuZ19nZXRfdWludF8xNihicCk7CisgICAgICAgICAgICB2YWx1ZSA9IDA7CisKKyAgICAgICAgICAgIGZvciAoaiA9IHNoaWZ0X3N0YXJ0W2NdOyBqID4gLXNoaWZ0X2RlY1tjXTsgaiAtPSBzaGlmdF9kZWNbY10pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZiAoaiA+IDApCisgICAgICAgICAgICAgICAgICB2YWx1ZSB8PSB2IDw8IGo7CisKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHZhbHVlIHw9IHYgPj4gKC1qKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpicCsrID0gKHBuZ19ieXRlKSgodmFsdWUgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICpicCsrID0gKHBuZ19ieXRlKSh2YWx1ZSAmIDB4ZmYpOworICAgICAgICAgfQorICAgICAgfQorICAgfQorfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfU1dBUF9BTFBIQV9TVVBQT1JURUQKK3N0YXRpYyB2b2lkCitwbmdfZG9fd3JpdGVfc3dhcF9hbHBoYShwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fd3JpdGVfc3dhcF9hbHBoYSIpOworCisgICB7CisgICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQorICAgICAgeworICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoaXMgY29udmVydHMgZnJvbSBBUkdCIHRvIFJHQkEgKi8KKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCwgZHA7CisgICAgICAgICAgICBwbmdfdWludF8zMiBpOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOworCisgICAgICAgICAgICBmb3IgKGkgPSAwLCBzcCA9IGRwID0gcm93OyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfYnl0ZSBzYXZlID0gKihzcCsrKTsKKyAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOworICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7CisgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKKyAgICAgICAgICAgICAgICooZHArKykgPSBzYXZlOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisjaWZkZWYgUE5HX1dSSVRFXzE2QklUX1NVUFBPUlRFRAorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgLyogVGhpcyBjb252ZXJ0cyBmcm9tIEFBUlJHR0JCIHRvIFJSR0dCQkFBICovCisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AsIGRwOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKKworICAgICAgICAgICAgZm9yIChpID0gMCwgc3AgPSBkcCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX2J5dGUgc2F2ZVsyXTsKKyAgICAgICAgICAgICAgIHNhdmVbMF0gPSAqKHNwKyspOworICAgICAgICAgICAgICAgc2F2ZVsxXSA9ICooc3ArKyk7CisgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKKyAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOworICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7CisgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKKyAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOworICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7CisgICAgICAgICAgICAgICAqKGRwKyspID0gc2F2ZVswXTsKKyAgICAgICAgICAgICAgICooZHArKykgPSBzYXZlWzFdOworICAgICAgICAgICAgfQorICAgICAgICAgfQorI2VuZGlmIC8qIFdSSVRFXzE2QklUICovCisgICAgICB9CisKKyAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpCisgICAgICB7CisgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQorICAgICAgICAgeworICAgICAgICAgICAgLyogVGhpcyBjb252ZXJ0cyBmcm9tIEFHIHRvIEdBICovCisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AsIGRwOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKKworICAgICAgICAgICAgZm9yIChpID0gMCwgc3AgPSBkcCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX2J5dGUgc2F2ZSA9ICooc3ArKyk7CisgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKKyAgICAgICAgICAgICAgICooZHArKykgPSBzYXZlOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisjaWZkZWYgUE5HX1dSSVRFXzE2QklUX1NVUFBPUlRFRAorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgLyogVGhpcyBjb252ZXJ0cyBmcm9tIEFBR0cgdG8gR0dBQSAqLworICAgICAgICAgICAgcG5nX2J5dGVwIHNwLCBkcDsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIGk7CisgICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDAsIHNwID0gZHAgPSByb3c7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19ieXRlIHNhdmVbMl07CisgICAgICAgICAgICAgICBzYXZlWzBdID0gKihzcCsrKTsKKyAgICAgICAgICAgICAgIHNhdmVbMV0gPSAqKHNwKyspOworICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7CisgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKKyAgICAgICAgICAgICAgICooZHArKykgPSBzYXZlWzBdOworICAgICAgICAgICAgICAgKihkcCsrKSA9IHNhdmVbMV07CisgICAgICAgICAgICB9CisgICAgICAgICB9CisjZW5kaWYgLyogV1JJVEVfMTZCSVQgKi8KKyAgICAgIH0KKyAgIH0KK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQKK3N0YXRpYyB2b2lkCitwbmdfZG9fd3JpdGVfaW52ZXJ0X2FscGhhKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3cpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kb193cml0ZV9pbnZlcnRfYWxwaGEiKTsKKworICAgeworICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkKKyAgICAgIHsKKyAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGlzIGludmVydHMgdGhlIGFscGhhIGNoYW5uZWwgaW4gUkdCQSAqLworICAgICAgICAgICAgcG5nX2J5dGVwIHNwLCBkcDsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIGk7CisgICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDAsIHNwID0gZHAgPSByb3c7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8qIERvZXMgbm90aGluZworICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7CisgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKKyAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOworICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIHNwKz0zOyBkcCA9IHNwOworICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSgyNTUgLSAqKHNwKyspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworI2lmZGVmIFBOR19XUklURV8xNkJJVF9TVVBQT1JURUQKKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoaXMgaW52ZXJ0cyB0aGUgYWxwaGEgY2hhbm5lbCBpbiBSUkdHQkJBQSAqLworICAgICAgICAgICAgcG5nX2J5dGVwIHNwLCBkcDsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIGk7CisgICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDAsIHNwID0gZHAgPSByb3c7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8qIERvZXMgbm90aGluZworICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7CisgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKKyAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOworICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7CisgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKKyAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOworICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIHNwKz02OyBkcCA9IHNwOworICAgICAgICAgICAgICAgKihkcCsrKSA9IChwbmdfYnl0ZSkoMjU1IC0gKihzcCsrKSk7CisgICAgICAgICAgICAgICAqZHAgICAgID0gKHBuZ19ieXRlKSgyNTUgLSAqKHNwKyspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyNlbmRpZiAvKiBXUklURV8xNkJJVCAqLworICAgICAgfQorCisgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQorICAgICAgeworICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoaXMgaW52ZXJ0cyB0aGUgYWxwaGEgY2hhbm5lbCBpbiBHQSAqLworICAgICAgICAgICAgcG5nX2J5dGVwIHNwLCBkcDsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIGk7CisgICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDAsIHNwID0gZHAgPSByb3c7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOworICAgICAgICAgICAgICAgKihkcCsrKSA9IChwbmdfYnl0ZSkoMjU1IC0gKihzcCsrKSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyNpZmRlZiBQTkdfV1JJVEVfMTZCSVRfU1VQUE9SVEVECisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGlzIGludmVydHMgdGhlIGFscGhhIGNoYW5uZWwgaW4gR0dBQSAqLworICAgICAgICAgICAgcG5nX2J5dGVwIHNwLCBkcDsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIGk7CisgICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDAsIHNwID0gZHAgPSByb3c7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8qIERvZXMgbm90aGluZworICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7CisgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICBzcCs9MjsgZHAgPSBzcDsKKyAgICAgICAgICAgICAgICooZHArKykgPSAocG5nX2J5dGUpKDI1NSAtICooc3ArKykpOworICAgICAgICAgICAgICAgKmRwICAgICA9IChwbmdfYnl0ZSkoMjU1IC0gKihzcCsrKSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisjZW5kaWYgLyogV1JJVEVfMTZCSVQgKi8KKyAgICAgIH0KKyAgIH0KK30KKyNlbmRpZgorCisvKiBUcmFuc2Zvcm0gdGhlIGRhdGEgYWNjb3JkaW5nIHRvIHRoZSB1c2VyJ3Mgd2lzaGVzLiAgVGhlIG9yZGVyIG9mCisgKiB0cmFuc2Zvcm1hdGlvbnMgaXMgc2lnbmlmaWNhbnQuCisgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2RvX3dyaXRlX3RyYW5zZm9ybWF0aW9ucyhwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3Jvd19pbmZvcCByb3dfaW5mbykKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3dyaXRlX3RyYW5zZm9ybWF0aW9ucyIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisjaWZkZWYgUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRAorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfVVNFUl9UUkFOU0ZPUk0pICE9IDApCisgICAgICBpZiAocG5nX3B0ci0+d3JpdGVfdXNlcl90cmFuc2Zvcm1fZm4gIT0gTlVMTCkKKyAgICAgICAgICgqKHBuZ19wdHItPndyaXRlX3VzZXJfdHJhbnNmb3JtX2ZuKSkgLyogVXNlciB3cml0ZSB0cmFuc2Zvcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAqLworICAgICAgICAgICAgIChwbmdfcHRyLCAgLyogcG5nX3B0ciAqLworICAgICAgICAgICAgIHJvd19pbmZvLCAgLyogcm93X2luZm86ICovCisgICAgICAgICAgICAgICAgLyogIHBuZ191aW50XzMyIHdpZHRoOyAgICAgICB3aWR0aCBvZiByb3cgKi8KKyAgICAgICAgICAgICAgICAvKiAgcG5nX3NpemVfdCByb3dieXRlczsgICAgIG51bWJlciBvZiBieXRlcyBpbiByb3cgKi8KKyAgICAgICAgICAgICAgICAvKiAgcG5nX2J5dGUgY29sb3JfdHlwZTsgICAgIGNvbG9yIHR5cGUgb2YgcGl4ZWxzICovCisgICAgICAgICAgICAgICAgLyogIHBuZ19ieXRlIGJpdF9kZXB0aDsgICAgICBiaXQgZGVwdGggb2Ygc2FtcGxlcyAqLworICAgICAgICAgICAgICAgIC8qICBwbmdfYnl0ZSBjaGFubmVsczsgICAgICAgbnVtYmVyIG9mIGNoYW5uZWxzICgxLTQpICovCisgICAgICAgICAgICAgICAgLyogIHBuZ19ieXRlIHBpeGVsX2RlcHRoOyAgICBiaXRzIHBlciBwaXhlbCAoZGVwdGgqY2hhbm5lbHMpICovCisgICAgICAgICAgICAgcG5nX3B0ci0+cm93X2J1ZiArIDEpOyAgICAgIC8qIHN0YXJ0IG9mIHBpeGVsIGRhdGEgZm9yIHJvdyAqLworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfRklMTEVSX1NVUFBPUlRFRAorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRklMTEVSKSAhPSAwKQorICAgICAgcG5nX2RvX3N0cmlwX2NoYW5uZWwocm93X2luZm8sIHBuZ19wdHItPnJvd19idWYgKyAxLAorICAgICAgICAgIShwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0ZJTExFUl9BRlRFUikpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfUEFDS1NXQVBfU1VQUE9SVEVECisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLU1dBUCkgIT0gMCkKKyAgICAgIHBuZ19kb19wYWNrc3dhcChyb3dfaW5mbywgcG5nX3B0ci0+cm93X2J1ZiArIDEpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfUEFDS19TVVBQT1JURUQKKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1BBQ0spICE9IDApCisgICAgICBwbmdfZG9fcGFjayhyb3dfaW5mbywgcG5nX3B0ci0+cm93X2J1ZiArIDEsCisgICAgICAgICAgKHBuZ191aW50XzMyKXBuZ19wdHItPmJpdF9kZXB0aCk7CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9TV0FQX1NVUFBPUlRFRAorIyAgaWZkZWYgUE5HXzE2QklUX1NVUFBPUlRFRAorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfU1dBUF9CWVRFUykgIT0gMCkKKyAgICAgIHBuZ19kb19zd2FwKHJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7CisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfU0hJRlRfU1VQUE9SVEVECisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19TSElGVCkgIT0gMCkKKyAgICAgIHBuZ19kb19zaGlmdChyb3dfaW5mbywgcG5nX3B0ci0+cm93X2J1ZiArIDEsCisgICAgICAgICAgJihwbmdfcHRyLT5zaGlmdCkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfU1dBUF9BTFBIQV9TVVBQT1JURUQKKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1NXQVBfQUxQSEEpICE9IDApCisgICAgICBwbmdfZG9fd3JpdGVfc3dhcF9hbHBoYShyb3dfaW5mbywgcG5nX3B0ci0+cm93X2J1ZiArIDEpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRAorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5WRVJUX0FMUEhBKSAhPSAwKQorICAgICAgcG5nX2RvX3dyaXRlX2ludmVydF9hbHBoYShyb3dfaW5mbywgcG5nX3B0ci0+cm93X2J1ZiArIDEpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfQkdSX1NVUFBPUlRFRAorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQkdSKSAhPSAwKQorICAgICAgcG5nX2RvX2Jncihyb3dfaW5mbywgcG5nX3B0ci0+cm93X2J1ZiArIDEpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfSU5WRVJUX1NVUFBPUlRFRAorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5WRVJUX01PTk8pICE9IDApCisgICAgICBwbmdfZG9faW52ZXJ0KHJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7CisjZW5kaWYKK30KKyNlbmRpZiAvKiBXUklURV9UUkFOU0ZPUk1TICovCisjZW5kaWYgLyogV1JJVEUgKi8KZGlmZiAtLWdpdCBhL2xpYnBuZy9wbmd3dXRpbC5jIGIvbGlicG5nL3BuZ3d1dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVlMTAyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9wbmd3dXRpbC5jCkBAIC0wLDAgKzEsMjcwOSBAQAorCisvKiBwbmd3dXRpbC5jIC0gdXRpbGl0aWVzIHRvIHdyaXRlIGEgUE5HIGZpbGUKKyAqCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4xOSBbTm92ZW1iZXIgMTIsIDIwMTVdCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNSBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQorICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisgKiBhbmQgbGljZW5zZSBpbiBwbmcuaAorICovCisKKyNpbmNsdWRlICJwbmdwcml2LmgiCisKKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECisKKyNpZmRlZiBQTkdfV1JJVEVfSU5UX0ZVTkNUSU9OU19TVVBQT1JURUQKKy8qIFBsYWNlIGEgMzItYml0IG51bWJlciBpbnRvIGEgYnVmZmVyIGluIFBORyBieXRlIG9yZGVyLiAgV2Ugd29yaworICogd2l0aCB1bnNpZ25lZCBudW1iZXJzIGZvciBjb252ZW5pZW5jZSwgYWx0aG91Z2ggb25lIHN1cHBvcnRlZAorICogYW5jaWxsYXJ5IGNodW5rIHVzZXMgc2lnbmVkICh0d28ncyBjb21wbGVtZW50KSBudW1iZXJzLgorICovCit2b2lkIFBOR0FQSQorcG5nX3NhdmVfdWludF8zMihwbmdfYnl0ZXAgYnVmLCBwbmdfdWludF8zMiBpKQoreworICAgYnVmWzBdID0gKHBuZ19ieXRlKShpID4+IDI0KTsKKyAgIGJ1ZlsxXSA9IChwbmdfYnl0ZSkoaSA+PiAxNik7CisgICBidWZbMl0gPSAocG5nX2J5dGUpKGkgPj4gOCk7CisgICBidWZbM10gPSAocG5nX2J5dGUpKGkgICAgICk7Cit9CisKKy8qIFBsYWNlIGEgMTYtYml0IG51bWJlciBpbnRvIGEgYnVmZmVyIGluIFBORyBieXRlIG9yZGVyLgorICogVGhlIHBhcmFtZXRlciBpcyBkZWNsYXJlZCB1bnNpZ25lZCBpbnQsIG5vdCBwbmdfdWludF8xNiwKKyAqIGp1c3QgdG8gYXZvaWQgcG90ZW50aWFsIHByb2JsZW1zIG9uIHByZS1BTlNJIEMgY29tcGlsZXJzLgorICovCit2b2lkIFBOR0FQSQorcG5nX3NhdmVfdWludF8xNihwbmdfYnl0ZXAgYnVmLCB1bnNpZ25lZCBpbnQgaSkKK3sKKyAgIGJ1ZlswXSA9IChwbmdfYnl0ZSkoaSA+PiA4KTsKKyAgIGJ1ZlsxXSA9IChwbmdfYnl0ZSkoaSAgICAgKTsKK30KKyNlbmRpZgorCisvKiBTaW1wbGUgZnVuY3Rpb24gdG8gd3JpdGUgdGhlIHNpZ25hdHVyZS4gIElmIHdlIGhhdmUgYWxyZWFkeSB3cml0dGVuCisgKiB0aGUgbWFnaWMgYnl0ZXMgb2YgdGhlIHNpZ25hdHVyZSwgb3IgbW9yZSBsaWtlbHksIHRoZSBQTkcgc3RyZWFtIGlzCisgKiBiZWluZyBlbWJlZGRlZCBpbnRvIGFub3RoZXIgc3RyZWFtIGFuZCBkb2Vzbid0IG5lZWQgaXRzIG93biBzaWduYXR1cmUsCisgKiB3ZSBzaG91bGQgY2FsbCBwbmdfc2V0X3NpZ19ieXRlcygpIHRvIHRlbGwgbGlicG5nIGhvdyBtYW55IG9mIHRoZQorICogYnl0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbi4KKyAqLwordm9pZCBQTkdBUEkKK3BuZ193cml0ZV9zaWcocG5nX3N0cnVjdHJwIHBuZ19wdHIpCit7CisgICBwbmdfYnl0ZSBwbmdfc2lnbmF0dXJlWzhdID0gezEzNywgODAsIDc4LCA3MSwgMTMsIDEwLCAyNiwgMTB9OworCisjaWZkZWYgUE5HX0lPX1NUQVRFX1NVUFBPUlRFRAorICAgLyogSW5mb3JtIHRoZSBJL08gY2FsbGJhY2sgdGhhdCB0aGUgc2lnbmF0dXJlIGlzIGJlaW5nIHdyaXR0ZW4gKi8KKyAgIHBuZ19wdHItPmlvX3N0YXRlID0gUE5HX0lPX1dSSVRJTkcgfCBQTkdfSU9fU0lHTkFUVVJFOworI2VuZGlmCisKKyAgIC8qIFdyaXRlIHRoZSByZXN0IG9mIHRoZSA4IGJ5dGUgc2lnbmF0dXJlICovCisgICBwbmdfd3JpdGVfZGF0YShwbmdfcHRyLCAmcG5nX3NpZ25hdHVyZVtwbmdfcHRyLT5zaWdfYnl0ZXNdLAorICAgICAgKHBuZ19zaXplX3QpKDggLSBwbmdfcHRyLT5zaWdfYnl0ZXMpKTsKKworICAgaWYgKHBuZ19wdHItPnNpZ19ieXRlcyA8IDMpCisgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX1BOR19TSUdOQVRVUkU7Cit9CisKKy8qIFdyaXRlIHRoZSBzdGFydCBvZiBhIFBORyBjaHVuay4gIFRoZSB0eXBlIGlzIHRoZSBjaHVuayB0eXBlLgorICogVGhlIHRvdGFsX2xlbmd0aCBpcyB0aGUgc3VtIG9mIHRoZSBsZW5ndGhzIG9mIGFsbCB0aGUgZGF0YSB5b3Ugd2lsbCBiZQorICogcGFzc2luZyBpbiBwbmdfd3JpdGVfY2h1bmtfZGF0YSgpLgorICovCitzdGF0aWMgdm9pZAorcG5nX3dyaXRlX2NodW5rX2hlYWRlcihwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgY2h1bmtfbmFtZSwKKyAgICBwbmdfdWludF8zMiBsZW5ndGgpCit7CisgICBwbmdfYnl0ZSBidWZbOF07CisKKyNpZiBkZWZpbmVkKFBOR19ERUJVRykgJiYgKFBOR19ERUJVRyA+IDApCisgICBQTkdfQ1NUUklOR19GUk9NX0NIVU5LKGJ1ZiwgY2h1bmtfbmFtZSk7CisgICBwbmdfZGVidWcyKDAsICJXcml0aW5nICVzIGNodW5rLCBsZW5ndGggPSAlbHUiLCBidWYsICh1bnNpZ25lZCBsb25nKWxlbmd0aCk7CisjZW5kaWYKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworI2lmZGVmIFBOR19JT19TVEFURV9TVVBQT1JURUQKKyAgIC8qIEluZm9ybSB0aGUgSS9PIGNhbGxiYWNrIHRoYXQgdGhlIGNodW5rIGhlYWRlciBpcyBiZWluZyB3cml0dGVuLgorICAgICogUE5HX0lPX0NIVU5LX0hEUiByZXF1aXJlcyBhIHNpbmdsZSBJL08gY2FsbC4KKyAgICAqLworICAgcG5nX3B0ci0+aW9fc3RhdGUgPSBQTkdfSU9fV1JJVElORyB8IFBOR19JT19DSFVOS19IRFI7CisjZW5kaWYKKworICAgLyogV3JpdGUgdGhlIGxlbmd0aCBhbmQgdGhlIGNodW5rIG5hbWUgKi8KKyAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmLCBsZW5ndGgpOworICAgcG5nX3NhdmVfdWludF8zMihidWYgKyA0LCBjaHVua19uYW1lKTsKKyAgIHBuZ193cml0ZV9kYXRhKHBuZ19wdHIsIGJ1ZiwgOCk7CisKKyAgIC8qIFB1dCB0aGUgY2h1bmsgbmFtZSBpbnRvIHBuZ19wdHItPmNodW5rX25hbWUgKi8KKyAgIHBuZ19wdHItPmNodW5rX25hbWUgPSBjaHVua19uYW1lOworCisgICAvKiBSZXNldCB0aGUgY3JjIGFuZCBydW4gaXQgb3ZlciB0aGUgY2h1bmsgbmFtZSAqLworICAgcG5nX3Jlc2V0X2NyYyhwbmdfcHRyKTsKKworICAgcG5nX2NhbGN1bGF0ZV9jcmMocG5nX3B0ciwgYnVmICsgNCwgNCk7CisKKyNpZmRlZiBQTkdfSU9fU1RBVEVfU1VQUE9SVEVECisgICAvKiBJbmZvcm0gdGhlIEkvTyBjYWxsYmFjayB0aGF0IGNodW5rIGRhdGEgd2lsbCAocG9zc2libHkpIGJlIHdyaXR0ZW4uCisgICAgKiBQTkdfSU9fQ0hVTktfREFUQSBkb2VzIE5PVCByZXF1aXJlIGEgc3BlY2lmaWMgbnVtYmVyIG9mIEkvTyBjYWxscy4KKyAgICAqLworICAgcG5nX3B0ci0+aW9fc3RhdGUgPSBQTkdfSU9fV1JJVElORyB8IFBOR19JT19DSFVOS19EQVRBOworI2VuZGlmCit9CisKK3ZvaWQgUE5HQVBJCitwbmdfd3JpdGVfY2h1bmtfc3RhcnQocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9ieXRlcCBjaHVua19zdHJpbmcsCisgICAgcG5nX3VpbnRfMzIgbGVuZ3RoKQoreworICAgcG5nX3dyaXRlX2NodW5rX2hlYWRlcihwbmdfcHRyLCBQTkdfQ0hVTktfRlJPTV9TVFJJTkcoY2h1bmtfc3RyaW5nKSwgbGVuZ3RoKTsKK30KKworLyogV3JpdGUgdGhlIGRhdGEgb2YgYSBQTkcgY2h1bmsgc3RhcnRlZCB3aXRoIHBuZ193cml0ZV9jaHVua19oZWFkZXIoKS4KKyAqIE5vdGUgdGhhdCBtdWx0aXBsZSBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIGFyZSBhbGxvd2VkLCBhbmQgdGhhdCB0aGUKKyAqIHN1bSBvZiB0aGUgbGVuZ3RocyBmcm9tIHRoZXNlIGNhbGxzICptdXN0KiBhZGQgdXAgdG8gdGhlIHRvdGFsX2xlbmd0aAorICogZ2l2ZW4gdG8gcG5nX3dyaXRlX2NodW5rX2hlYWRlcigpLgorICovCit2b2lkIFBOR0FQSQorcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9ieXRlcCBkYXRhLAorICAgIHBuZ19zaXplX3QgbGVuZ3RoKQoreworICAgLyogV3JpdGUgdGhlIGRhdGEsIGFuZCBydW4gdGhlIENSQyBvdmVyIGl0ICovCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBpZiAoZGF0YSAhPSBOVUxMICYmIGxlbmd0aCA+IDApCisgICB7CisgICAgICBwbmdfd3JpdGVfZGF0YShwbmdfcHRyLCBkYXRhLCBsZW5ndGgpOworCisgICAgICAvKiBVcGRhdGUgdGhlIENSQyBhZnRlciB3cml0aW5nIHRoZSBkYXRhLAorICAgICAgICogaW4gY2FzZSB0aGUgdXNlciBJL08gcm91dGluZSBhbHRlcnMgaXQuCisgICAgICAgKi8KKyAgICAgIHBuZ19jYWxjdWxhdGVfY3JjKHBuZ19wdHIsIGRhdGEsIGxlbmd0aCk7CisgICB9Cit9CisKKy8qIEZpbmlzaCBhIGNodW5rIHN0YXJ0ZWQgd2l0aCBwbmdfd3JpdGVfY2h1bmtfaGVhZGVyKCkuICovCit2b2lkIFBOR0FQSQorcG5nX3dyaXRlX2NodW5rX2VuZChwbmdfc3RydWN0cnAgcG5nX3B0cikKK3sKKyAgIHBuZ19ieXRlIGJ1Zls0XTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkgcmV0dXJuOworCisjaWZkZWYgUE5HX0lPX1NUQVRFX1NVUFBPUlRFRAorICAgLyogSW5mb3JtIHRoZSBJL08gY2FsbGJhY2sgdGhhdCB0aGUgY2h1bmsgQ1JDIGlzIGJlaW5nIHdyaXR0ZW4uCisgICAgKiBQTkdfSU9fQ0hVTktfQ1JDIHJlcXVpcmVzIGEgc2luZ2xlIEkvTyBmdW5jdGlvbiBjYWxsLgorICAgICovCisgICBwbmdfcHRyLT5pb19zdGF0ZSA9IFBOR19JT19XUklUSU5HIHwgUE5HX0lPX0NIVU5LX0NSQzsKKyNlbmRpZgorCisgICAvKiBXcml0ZSB0aGUgY3JjIGluIGEgc2luZ2xlIG9wZXJhdGlvbiAqLworICAgcG5nX3NhdmVfdWludF8zMihidWYsIHBuZ19wdHItPmNyYyk7CisKKyAgIHBuZ193cml0ZV9kYXRhKHBuZ19wdHIsIGJ1ZiwgKHBuZ19zaXplX3QpNCk7Cit9CisKKy8qIFdyaXRlIGEgUE5HIGNodW5rIGFsbCBhdCBvbmNlLiAgVGhlIHR5cGUgaXMgYW4gYXJyYXkgb2YgQVNDSUkgY2hhcmFjdGVycworICogcmVwcmVzZW50aW5nIHRoZSBjaHVuayBuYW1lLiAgVGhlIGFycmF5IG11c3QgYmUgYXQgbGVhc3QgNCBieXRlcyBpbgorICogbGVuZ3RoLCBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBudWxsIHRlcm1pbmF0ZWQuICBUbyBiZSBzYWZlLCBwYXNzIHRoZQorICogcHJlLWRlZmluZWQgY2h1bmsgbmFtZXMgaGVyZSwgYW5kIGlmIHlvdSBuZWVkIGEgbmV3IG9uZSwgZGVmaW5lIGl0CisgKiB3aGVyZSB0aGUgb3RoZXJzIGFyZSBkZWZpbmVkLiAgVGhlIGxlbmd0aCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhLgorICogQWxsIHRoZSBkYXRhIG11c3QgYmUgcHJlc2VudC4gIElmIHRoYXQgaXMgbm90IHBvc3NpYmxlLCB1c2UgdGhlCisgKiBwbmdfd3JpdGVfY2h1bmtfc3RhcnQoKSwgcG5nX3dyaXRlX2NodW5rX2RhdGEoKSwgYW5kIHBuZ193cml0ZV9jaHVua19lbmQoKQorICogZnVuY3Rpb25zIGluc3RlYWQuCisgKi8KK3N0YXRpYyB2b2lkCitwbmdfd3JpdGVfY29tcGxldGVfY2h1bmsocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ191aW50XzMyIGNodW5rX25hbWUsCisgICBwbmdfY29uc3RfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpCit7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICAvKiBPbiA2NC1iaXQgYXJjaGl0ZWN0dXJlcyAnbGVuZ3RoJyBtYXkgbm90IGZpdCBpbiBhIHBuZ191aW50XzMyLiAqLworICAgaWYgKGxlbmd0aCA+IFBOR19VSU5UXzMxX01BWCkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAibGVuZ3RoIGV4Y2VlZHMgUE5HIG1heGltdW0iKTsKKworICAgcG5nX3dyaXRlX2NodW5rX2hlYWRlcihwbmdfcHRyLCBjaHVua19uYW1lLCAocG5nX3VpbnRfMzIpbGVuZ3RoKTsKKyAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIGRhdGEsIGxlbmd0aCk7CisgICBwbmdfd3JpdGVfY2h1bmtfZW5kKHBuZ19wdHIpOworfQorCisvKiBUaGlzIGlzIHRoZSBBUEkgdGhhdCBjYWxscyB0aGUgaW50ZXJuYWwgZnVuY3Rpb24gYWJvdmUuICovCit2b2lkIFBOR0FQSQorcG5nX3dyaXRlX2NodW5rKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfYnl0ZXAgY2h1bmtfc3RyaW5nLAorICAgcG5nX2NvbnN0X2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKQoreworICAgcG5nX3dyaXRlX2NvbXBsZXRlX2NodW5rKHBuZ19wdHIsIFBOR19DSFVOS19GUk9NX1NUUklORyhjaHVua19zdHJpbmcpLCBkYXRhLAorICAgICAgbGVuZ3RoKTsKK30KKworLyogVGhpcyBpcyB1c2VkIGJlbG93IHRvIGZpbmQgdGhlIHNpemUgb2YgYW4gaW1hZ2UgdG8gcGFzcyB0byBwbmdfZGVmbGF0ZV9jbGFpbSwKKyAqIHNvIGl0IG9ubHkgbmVlZHMgdG8gYmUgYWNjdXJhdGUgaWYgdGhlIHNpemUgaXMgbGVzcyB0aGFuIDE2Mzg0IGJ5dGVzICh0aGUKKyAqIHBvaW50IGF0IHdoaWNoIGEgbG93ZXIgTFogd2luZG93IHNpemUgY2FuIGJlIHVzZWQuKQorICovCitzdGF0aWMgcG5nX2FsbG9jX3NpemVfdAorcG5nX2ltYWdlX3NpemUocG5nX3N0cnVjdHJwIHBuZ19wdHIpCit7CisgICAvKiBPbmx5IHJldHVybiBzaXplcyB1cCB0byB0aGUgbWF4aW11bSBvZiBhIHBuZ191aW50XzMyOyBkbyB0aGlzIGJ5IGxpbWl0aW5nCisgICAgKiB0aGUgd2lkdGggYW5kIGhlaWdodCB1c2VkIHRvIDE1IGJpdHMuCisgICAgKi8KKyAgIHBuZ191aW50XzMyIGggPSBwbmdfcHRyLT5oZWlnaHQ7CisKKyAgIGlmIChwbmdfcHRyLT5yb3dieXRlcyA8IDMyNzY4ICYmIGggPCAzMjc2OCkKKyAgIHsKKyAgICAgIGlmIChwbmdfcHRyLT5pbnRlcmxhY2VkICE9IDApCisgICAgICB7CisgICAgICAgICAvKiBJbnRlcmxhY2luZyBtYWtlcyB0aGUgaW1hZ2UgbGFyZ2VyIGJlY2F1c2Ugb2YgdGhlIHJlcGxpY2F0aW9uIG9mCisgICAgICAgICAgKiBib3RoIHRoZSBmaWx0ZXIgYnl0ZSBhbmQgdGhlIHBhZGRpbmcgdG8gYSBieXRlIGJvdW5kYXJ5LgorICAgICAgICAgICovCisgICAgICAgICBwbmdfdWludF8zMiB3ID0gcG5nX3B0ci0+d2lkdGg7CisgICAgICAgICB1bnNpZ25lZCBpbnQgcGQgPSBwbmdfcHRyLT5waXhlbF9kZXB0aDsKKyAgICAgICAgIHBuZ19hbGxvY19zaXplX3QgY2JfYmFzZTsKKyAgICAgICAgIGludCBwYXNzOworCisgICAgICAgICBmb3IgKGNiX2Jhc2U9MCwgcGFzcz0wOyBwYXNzPD02OyArK3Bhc3MpCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfdWludF8zMiBwdyA9IFBOR19QQVNTX0NPTFModywgcGFzcyk7CisKKyAgICAgICAgICAgIGlmIChwdyA+IDApCisgICAgICAgICAgICAgICBjYl9iYXNlICs9IChQTkdfUk9XQllURVMocGQsIHB3KSsxKSAqIFBOR19QQVNTX1JPV1MoaCwgcGFzcyk7CisgICAgICAgICB9CisKKyAgICAgICAgIHJldHVybiBjYl9iYXNlOworICAgICAgfQorCisgICAgICBlbHNlCisgICAgICAgICByZXR1cm4gKHBuZ19wdHItPnJvd2J5dGVzKzEpICogaDsKKyAgIH0KKworICAgZWxzZQorICAgICAgcmV0dXJuIDB4ZmZmZmZmZmZVOworfQorCisjaWZkZWYgUE5HX1dSSVRFX09QVElNSVpFX0NNRl9TVVBQT1JURUQKKyAgIC8qIFRoaXMgaXMgdGhlIGNvZGUgdG8gaGFjayB0aGUgZmlyc3QgdHdvIGJ5dGVzIG9mIHRoZSBkZWZsYXRlIHN0cmVhbSAodGhlCisgICAgKiBkZWZsYXRlIGhlYWRlcikgdG8gY29ycmVjdCB0aGUgd2luZG93Qml0cyB2YWx1ZSB0byBtYXRjaCB0aGUgYWN0dWFsIGRhdGEKKyAgICAqIHNpemUuICBOb3RlIHRoYXQgdGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgKnVuY29tcHJlc3NlZCogc2l6ZSBidXQgdGhlCisgICAgKiBmaXJzdCBhcmd1bWVudCBpcyB0aGUgKmNvbXByZXNzZWQqIGRhdGEgKGFuZCBpdCBtdXN0IGJlIGRlZmxhdGUKKyAgICAqIGNvbXByZXNzZWQuKQorICAgICovCitzdGF0aWMgdm9pZAorb3B0aW1pemVfY21mKHBuZ19ieXRlcCBkYXRhLCBwbmdfYWxsb2Nfc2l6ZV90IGRhdGFfc2l6ZSkKK3sKKyAgIC8qIE9wdGltaXplIHRoZSBDTUYgZmllbGQgaW4gdGhlIHpsaWIgc3RyZWFtLiAgVGhlIHJlc3VsdGFudCB6bGliIHN0cmVhbSBpcworICAgICogc3RpbGwgY29tcGxpYW50IHRvIHRoZSBzdHJlYW0gc3BlY2lmaWNhdGlvbi4KKyAgICAqLworICAgaWYgKGRhdGFfc2l6ZSA8PSAxNjM4NCkgLyogZWxzZSB3aW5kb3dCaXRzIG11c3QgYmUgMTUgKi8KKyAgIHsKKyAgICAgIHVuc2lnbmVkIGludCB6X2NtZiA9IGRhdGFbMF07ICAvKiB6bGliIGNvbXByZXNzaW9uIG1ldGhvZCBhbmQgZmxhZ3MgKi8KKworICAgICAgaWYgKCh6X2NtZiAmIDB4MGYpID09IDggJiYgKHpfY21mICYgMHhmMCkgPD0gMHg3MCkKKyAgICAgIHsKKyAgICAgICAgIHVuc2lnbmVkIGludCB6X2NpbmZvOworICAgICAgICAgdW5zaWduZWQgaW50IGhhbGZfel93aW5kb3dfc2l6ZTsKKworICAgICAgICAgel9jaW5mbyA9IHpfY21mID4+IDQ7CisgICAgICAgICBoYWxmX3pfd2luZG93X3NpemUgPSAxVSA8PCAoel9jaW5mbyArIDcpOworCisgICAgICAgICBpZiAoZGF0YV9zaXplIDw9IGhhbGZfel93aW5kb3dfc2l6ZSkgLyogZWxzZSBubyBjaGFuZ2UgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB0bXA7CisKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBoYWxmX3pfd2luZG93X3NpemUgPj49IDE7CisgICAgICAgICAgICAgICAtLXpfY2luZm87CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoel9jaW5mbyA+IDAgJiYgZGF0YV9zaXplIDw9IGhhbGZfel93aW5kb3dfc2l6ZSk7CisKKyAgICAgICAgICAgIHpfY21mID0gKHpfY21mICYgMHgwZikgfCAoel9jaW5mbyA8PCA0KTsKKworICAgICAgICAgICAgZGF0YVswXSA9IChwbmdfYnl0ZSl6X2NtZjsKKyAgICAgICAgICAgIHRtcCA9IGRhdGFbMV0gJiAweGUwOworICAgICAgICAgICAgdG1wICs9IDB4MWYgLSAoKHpfY21mIDw8IDgpICsgdG1wKSAlIDB4MWY7CisgICAgICAgICAgICBkYXRhWzFdID0gKHBuZ19ieXRlKXRtcDsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KK30KKyNlbmRpZiAvKiBXUklURV9PUFRJTUlaRV9DTUYgKi8KKworLyogSW5pdGlhbGl6ZSB0aGUgY29tcHJlc3NvciBmb3IgdGhlIGFwcHJvcHJpYXRlIHR5cGUgb2YgY29tcHJlc3Npb24uICovCitzdGF0aWMgaW50CitwbmdfZGVmbGF0ZV9jbGFpbShwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgb3duZXIsCisgICBwbmdfYWxsb2Nfc2l6ZV90IGRhdGFfc2l6ZSkKK3sKKyAgIGlmIChwbmdfcHRyLT56b3duZXIgIT0gMCkKKyAgIHsKKyNpZiBkZWZpbmVkKFBOR19XQVJOSU5HU19TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX0VSUk9SX1RFWFRfU1VQUE9SVEVEKQorICAgICAgY2hhciBtc2dbNjRdOworCisgICAgICBQTkdfU1RSSU5HX0ZST01fQ0hVTksobXNnLCBvd25lcik7CisgICAgICBtc2dbNF0gPSAnOic7CisgICAgICBtc2dbNV0gPSAnICc7CisgICAgICBQTkdfU1RSSU5HX0ZST01fQ0hVTksobXNnKzYsIHBuZ19wdHItPnpvd25lcik7CisgICAgICAvKiBTbyB0aGUgbWVzc2FnZSB0aGF0IHJlc3VsdHMgaXMgIjxjaHVuaz4gdXNpbmcgenN0cmVhbSI7IHRoaXMgaXMgYW4KKyAgICAgICAqIGludGVybmFsIGVycm9yLCBidXQgaXMgdmVyeSB1c2VmdWwgZm9yIGRlYnVnZ2luZy4gIGkxOG4gcmVxdWlyZW1lbnRzCisgICAgICAgKiBhcmUgbWluaW1hbC4KKyAgICAgICAqLworICAgICAgKHZvaWQpcG5nX3NhZmVjYXQobXNnLCAoc2l6ZW9mIG1zZyksIDEwLCAiIHVzaW5nIHpzdHJlYW0iKTsKKyNlbmRpZgorI2lmIFBOR19SRUxFQVNFX0JVSUxECisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCBtc2cpOworCisgICAgICAgICAvKiBBdHRlbXB0IHNhbmUgZXJyb3IgcmVjb3ZlcnkgKi8KKyAgICAgICAgIGlmIChwbmdfcHRyLT56b3duZXIgPT0gcG5nX0lEQVQpIC8qIGRvbid0IHN0ZWFsIGZyb20gSURBVCAqLworICAgICAgICAgeworICAgICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5tc2cgPSBQTkdaX01TR19DQVNUKCJpbiB1c2UgYnkgSURBVCIpOworICAgICAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgICAgICAgfQorCisgICAgICAgICBwbmdfcHRyLT56b3duZXIgPSAwOworI2Vsc2UKKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCBtc2cpOworI2VuZGlmCisgICB9CisKKyAgIHsKKyAgICAgIGludCBsZXZlbCA9IHBuZ19wdHItPnpsaWJfbGV2ZWw7CisgICAgICBpbnQgbWV0aG9kID0gcG5nX3B0ci0+emxpYl9tZXRob2Q7CisgICAgICBpbnQgd2luZG93Qml0cyA9IHBuZ19wdHItPnpsaWJfd2luZG93X2JpdHM7CisgICAgICBpbnQgbWVtTGV2ZWwgPSBwbmdfcHRyLT56bGliX21lbV9sZXZlbDsKKyAgICAgIGludCBzdHJhdGVneTsgLyogc2V0IGJlbG93ICovCisgICAgICBpbnQgcmV0OyAvKiB6bGliIHJldHVybiBjb2RlICovCisKKyAgICAgIGlmIChvd25lciA9PSBwbmdfSURBVCkKKyAgICAgIHsKKyAgICAgICAgIGlmICgocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19aTElCX0NVU1RPTV9TVFJBVEVHWSkgIT0gMCkKKyAgICAgICAgICAgIHN0cmF0ZWd5ID0gcG5nX3B0ci0+emxpYl9zdHJhdGVneTsKKworICAgICAgICAgZWxzZSBpZiAocG5nX3B0ci0+ZG9fZmlsdGVyICE9IFBOR19GSUxURVJfTk9ORSkKKyAgICAgICAgICAgIHN0cmF0ZWd5ID0gUE5HX1pfREVGQVVMVF9TVFJBVEVHWTsKKworICAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RyYXRlZ3kgPSBQTkdfWl9ERUZBVUxUX05PRklMVEVSX1NUUkFURUdZOworICAgICAgfQorCisgICAgICBlbHNlCisgICAgICB7CisjaWZkZWYgUE5HX1dSSVRFX0NVU1RPTUlaRV9aVFhUX0NPTVBSRVNTSU9OX1NVUFBPUlRFRAorICAgICAgICAgICAgbGV2ZWwgPSBwbmdfcHRyLT56bGliX3RleHRfbGV2ZWw7CisgICAgICAgICAgICBtZXRob2QgPSBwbmdfcHRyLT56bGliX3RleHRfbWV0aG9kOworICAgICAgICAgICAgd2luZG93Qml0cyA9IHBuZ19wdHItPnpsaWJfdGV4dF93aW5kb3dfYml0czsKKyAgICAgICAgICAgIG1lbUxldmVsID0gcG5nX3B0ci0+emxpYl90ZXh0X21lbV9sZXZlbDsKKyAgICAgICAgICAgIHN0cmF0ZWd5ID0gcG5nX3B0ci0+emxpYl90ZXh0X3N0cmF0ZWd5OworI2Vsc2UKKyAgICAgICAgICAgIC8qIElmIGN1c3RvbWl6YXRpb24gaXMgbm90IHN1cHBvcnRlZCB0aGUgdmFsdWVzIGFsbCBjb21lIGZyb20gdGhlCisgICAgICAgICAgICAgKiBJREFUIHZhbHVlcyBleGNlcHQgZm9yIHRoZSBzdHJhdGVneSwgd2hpY2ggaXMgZml4ZWQgdG8gdGhlCisgICAgICAgICAgICAgKiBkZWZhdWx0LiAgKFRoaXMgaXMgdGhlIHByZS0xLjYuMCBiZWhhdmlvciB0b28sIGFsdGhvdWdoIGl0IHdhcworICAgICAgICAgICAgICogaW1wbGVtZW50ZWQgaW4gYSB2ZXJ5IGRpZmZlcmVudCB3YXkuKQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzdHJhdGVneSA9IFpfREVGQVVMVF9TVFJBVEVHWTsKKyNlbmRpZgorICAgICAgfQorCisgICAgICAvKiBBZGp1c3QgJ3dpbmRvd0JpdHMnIGRvd24gaWYgbGFyZ2VyIHRoYW4gJ2RhdGFfc2l6ZSc7IHRvIHN0b3AgdGhpcworICAgICAgICogaGFwcGVuaW5nIGp1c3QgcGFzcyAzMjc2OCBhcyB0aGUgZGF0YV9zaXplIHBhcmFtZXRlci4gIE5vdGljZSB0aGF0IHpsaWIKKyAgICAgICAqIHJlcXVpcmVzIGFuIGV4dHJhIDI2MiBieXRlcyBpbiB0aGUgd2luZG93IGluIGFkZGl0aW9uIHRvIHRoZSBkYXRhIHRvIGJlCisgICAgICAgKiBhYmxlIHRvIHNlZSB0aGUgd2hvbGUgb2YgdGhlIGRhdGEsIHNvIGlmIGRhdGFfc2l6ZSsyNjIgdGFrZXMgdXMgdG8gdGhlCisgICAgICAgKiBuZXh0IHdpbmRvd0JpdHMgc2l6ZSB3ZSBuZWVkIHRvIGZpeCB1cCB0aGUgdmFsdWUgbGF0ZXIuICAoQmVjYXVzZSBldmVuCisgICAgICAgKiB0aG91Z2ggZGVmbGF0ZSBuZWVkcyB0aGUgZXh0cmEgd2luZG93LCBpbmZsYXRlIGRvZXMgbm90ISkKKyAgICAgICAqLworICAgICAgaWYgKGRhdGFfc2l6ZSA8PSAxNjM4NCkKKyAgICAgIHsKKyAgICAgICAgIC8qIElNUExFTUVOVEFUSU9OIE5PVEU6IHRoaXMgJ2hhbGZfd2luZG93X3NpemUnIHN0dWZmIGlzIG9ubHkgaGVyZSB0bworICAgICAgICAgICogd29yayByb3VuZCBhIE1pY3Jvc29mdCBWaXN1YWwgQyBtaXNiZWhhdmlvciB3aGljaCwgY29udHJhcnkgdG8gQy05MCwKKyAgICAgICAgICAqIHdpZGVucyB0aGUgcmVzdWx0IG9mIHRoZSBmb2xsb3dpbmcgc2hpZnQgdG8gNjQtYml0cyBpZiAoYW5kLAorICAgICAgICAgICogYXBwYXJlbnRseSwgb25seSBpZikgaXQgaXMgdXNlZCBpbiBhIHRlc3QuCisgICAgICAgICAgKi8KKyAgICAgICAgIHVuc2lnbmVkIGludCBoYWxmX3dpbmRvd19zaXplID0gMVUgPDwgKHdpbmRvd0JpdHMtMSk7CisKKyAgICAgICAgIHdoaWxlIChkYXRhX3NpemUgKyAyNjIgPD0gaGFsZl93aW5kb3dfc2l6ZSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGhhbGZfd2luZG93X3NpemUgPj49IDE7CisgICAgICAgICAgICAtLXdpbmRvd0JpdHM7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIENoZWNrIGFnYWluc3QgdGhlIHByZXZpb3VzIGluaXRpYWxpemVkIHZhbHVlcywgaWYgYW55LiAqLworICAgICAgaWYgKChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX1pTVFJFQU1fSU5JVElBTElaRUQpICE9IDAgJiYKKyAgICAgICAgIChwbmdfcHRyLT56bGliX3NldF9sZXZlbCAhPSBsZXZlbCB8fAorICAgICAgICAgcG5nX3B0ci0+emxpYl9zZXRfbWV0aG9kICE9IG1ldGhvZCB8fAorICAgICAgICAgcG5nX3B0ci0+emxpYl9zZXRfd2luZG93X2JpdHMgIT0gd2luZG93Qml0cyB8fAorICAgICAgICAgcG5nX3B0ci0+emxpYl9zZXRfbWVtX2xldmVsICE9IG1lbUxldmVsIHx8CisgICAgICAgICBwbmdfcHRyLT56bGliX3NldF9zdHJhdGVneSAhPSBzdHJhdGVneSkpCisgICAgICB7CisgICAgICAgICBpZiAoZGVmbGF0ZUVuZCgmcG5nX3B0ci0+enN0cmVhbSkgIT0gWl9PSykKKyAgICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJkZWZsYXRlRW5kIGZhaWxlZCAoaWdub3JlZCkiKTsKKworICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX1pTVFJFQU1fSU5JVElBTElaRUQ7CisgICAgICB9CisKKyAgICAgIC8qIEZvciBzYWZldHkgY2xlYXIgb3V0IHRoZSBpbnB1dCBhbmQgb3V0cHV0IHBvaW50ZXJzIChjdXJyZW50bHkgemxpYgorICAgICAgICogZG9lc24ndCB1c2UgdGhlbSBvbiBJbml0LCBidXQgaXQgbWlnaHQgaW4gdGhlIGZ1dHVyZSkuCisgICAgICAgKi8KKyAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9pbiA9IE5VTEw7CisgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luID0gMDsKKyAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBOVUxMOworICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPSAwOworCisgICAgICAvKiBOb3cgaW5pdGlhbGl6ZSBpZiByZXF1aXJlZCwgc2V0dGluZyB0aGUgbmV3IHBhcmFtZXRlcnMsIG90aGVyd2lzZSBqdXN0CisgICAgICAgKiB0byBhIHNpbXBsZSByZXNldCB0byB0aGUgcHJldmlvdXMgcGFyYW1ldGVycy4KKyAgICAgICAqLworICAgICAgaWYgKChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX1pTVFJFQU1fSU5JVElBTElaRUQpICE9IDApCisgICAgICAgICByZXQgPSBkZWZsYXRlUmVzZXQoJnBuZ19wdHItPnpzdHJlYW0pOworCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICByZXQgPSBkZWZsYXRlSW5pdDIoJnBuZ19wdHItPnpzdHJlYW0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsCisgICAgICAgICAgICBtZW1MZXZlbCwgc3RyYXRlZ3kpOworCisgICAgICAgICBpZiAocmV0ID09IFpfT0spCisgICAgICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19aU1RSRUFNX0lOSVRJQUxJWkVEOworICAgICAgfQorCisgICAgICAvKiBUaGUgcmV0dXJuIGNvZGUgaXMgZnJvbSBlaXRoZXIgZGVmbGF0ZVJlc2V0IG9yIGRlZmxhdGVJbml0MjsgdGhleSBoYXZlCisgICAgICAgKiBwcmV0dHkgbXVjaCB0aGUgc2FtZSBzZXQgb2YgZXJyb3IgY29kZXMuCisgICAgICAgKi8KKyAgICAgIGlmIChyZXQgPT0gWl9PSykKKyAgICAgICAgIHBuZ19wdHItPnpvd25lciA9IG93bmVyOworCisgICAgICBlbHNlCisgICAgICAgICBwbmdfenN0cmVhbV9lcnJvcihwbmdfcHRyLCByZXQpOworCisgICAgICByZXR1cm4gcmV0OworICAgfQorfQorCisvKiBDbGVhbiB1cCAob3IgdHJpbSkgYSBsaW5rZWQgbGlzdCBvZiBjb21wcmVzc2lvbiBidWZmZXJzLiAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfZnJlZV9idWZmZXJfbGlzdChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbXByZXNzaW9uX2J1ZmZlcnAgKmxpc3RwKQoreworICAgcG5nX2NvbXByZXNzaW9uX2J1ZmZlcnAgbGlzdCA9ICpsaXN0cDsKKworICAgaWYgKGxpc3QgIT0gTlVMTCkKKyAgIHsKKyAgICAgICpsaXN0cCA9IE5VTEw7CisKKyAgICAgIGRvCisgICAgICB7CisgICAgICAgICBwbmdfY29tcHJlc3Npb25fYnVmZmVycCBuZXh0ID0gbGlzdC0+bmV4dDsKKworICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgbGlzdCk7CisgICAgICAgICBsaXN0ID0gbmV4dDsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChsaXN0ICE9IE5VTEwpOworICAgfQorfQorCisjaWZkZWYgUE5HX1dSSVRFX0NPTVBSRVNTRURfVEVYVF9TVVBQT1JURUQKKy8qIFRoaXMgcGFpciBvZiBmdW5jdGlvbnMgZW5jYXBzdWxhdGVzIHRoZSBvcGVyYXRpb24gb2YgKGEpIGNvbXByZXNzaW5nIGEKKyAqIHRleHQgc3RyaW5nLCBhbmQgKGIpIGlzc3VpbmcgaXQgbGF0ZXIgYXMgYSBzZXJpZXMgb2YgY2h1bmsgZGF0YSB3cml0ZXMuCisgKiBUaGUgY29tcHJlc3Npb25fc3RhdGUgc3RydWN0dXJlIGlzIHNoYXJlZCBjb250ZXh0IGZvciB0aGVzZSBmdW5jdGlvbnMKKyAqIHNldCB1cCBieSB0aGUgY2FsbGVyIHRvIGFsbG93IGFjY2VzcyB0byB0aGUgcmVsZXZhbnQgbG9jYWwgdmFyaWFibGVzLgorICoKKyAqIGNvbXByZXNzaW9uX2J1ZmZlciAobmV3IGluIDEuNi4wKSBpcyBqdXN0IGEgbGlua2VkIGxpc3Qgb2YgemJ1ZmZlcl9zaXplCisgKiB0ZW1wb3JhcnkgYnVmZmVycy4gIEZyb20gMS42LjAgaXQgaXMgcmV0YWluZWQgaW4gcG5nX3N0cnVjdCBzbyB0aGF0IGl0IHdpbGwKKyAqIGJlIGNvcnJlY3RseSBmcmVlZCBpbiB0aGUgZXZlbnQgb2YgYSB3cml0ZSBlcnJvciAocHJldmlvdXMgaW1wbGVtZW50YXRpb25zCisgKiBqdXN0IGxlYWtlZCBtZW1vcnkuKQorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgcG5nX2NvbnN0X2J5dGVwICAgICAgaW5wdXQ7ICAgICAgICAvKiBUaGUgdW5jb21wcmVzc2VkIGlucHV0IGRhdGEgKi8KKyAgIHBuZ19hbGxvY19zaXplX3QgICAgIGlucHV0X2xlbjsgICAgLyogSXRzIGxlbmd0aCAqLworICAgcG5nX3VpbnRfMzIgICAgICAgICAgb3V0cHV0X2xlbjsgICAvKiBGaW5hbCBjb21wcmVzc2VkIGxlbmd0aCAqLworICAgcG5nX2J5dGUgICAgICAgICAgICAgb3V0cHV0WzEwMjRdOyAvKiBGaXJzdCBibG9jayBvZiBvdXRwdXQgKi8KK30gY29tcHJlc3Npb25fc3RhdGU7CisKK3N0YXRpYyB2b2lkCitwbmdfdGV4dF9jb21wcmVzc19pbml0KGNvbXByZXNzaW9uX3N0YXRlICpjb21wLCBwbmdfY29uc3RfYnl0ZXAgaW5wdXQsCisgICBwbmdfYWxsb2Nfc2l6ZV90IGlucHV0X2xlbikKK3sKKyAgIGNvbXAtPmlucHV0ID0gaW5wdXQ7CisgICBjb21wLT5pbnB1dF9sZW4gPSBpbnB1dF9sZW47CisgICBjb21wLT5vdXRwdXRfbGVuID0gMDsKK30KKworLyogQ29tcHJlc3MgdGhlIGRhdGEgaW4gdGhlIGNvbXByZXNzaW9uIHN0YXRlIGlucHV0ICovCitzdGF0aWMgaW50CitwbmdfdGV4dF9jb21wcmVzcyhwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgY2h1bmtfbmFtZSwKKyAgIGNvbXByZXNzaW9uX3N0YXRlICpjb21wLCBwbmdfdWludF8zMiBwcmVmaXhfbGVuKQoreworICAgaW50IHJldDsKKworICAgLyogVG8gZmluZCB0aGUgbGVuZ3RoIG9mIHRoZSBvdXRwdXQgaXQgaXMgbmVjZXNzYXJ5IHRvIGZpcnN0IGNvbXByZXNzIHRoZQorICAgICogaW5wdXQuIFRoZSByZXN1bHQgaXMgYnVmZmVyZWQgcmF0aGVyIHRoYW4gdXNpbmcgdGhlIHR3by1wYXNzIGFsZ29yaXRobQorICAgICogdGhhdCBpcyB1c2VkIG9uIHRoZSBpbmZsYXRlIHNpZGU7IGRlZmxhdGUgaXMgYXNzdW1lZCB0byBiZSBzbG93ZXIgYW5kIGEKKyAgICAqIFBORyB3cml0ZXIgaXMgYXNzdW1lZCB0byBoYXZlIG1vcmUgbWVtb3J5IGF2YWlsYWJsZSB0aGFuIGEgUE5HIHJlYWRlci4KKyAgICAqCisgICAgKiBJTVBMRU1FTlRBVElPTiBOT1RFOiB0aGUgemxpYiBBUEkgZGVmbGF0ZUJvdW5kKCkgY2FuIGJlIHVzZWQgdG8gZmluZCBhbgorICAgICogdXBwZXIgbGltaXQgb24gdGhlIG91dHB1dCBzaXplLCBidXQgaXQgaXMgYWx3YXlzIGJpZ2dlciB0aGFuIHRoZSBpbnB1dAorICAgICogc2l6ZSBzbyBpdCBpcyBsaWtlbHkgdG8gYmUgbW9yZSBlZmZpY2llbnQgdG8gdXNlIHRoaXMgbGlua2VkLWxpc3QKKyAgICAqIGFwcHJvYWNoLgorICAgICovCisgICByZXQgPSBwbmdfZGVmbGF0ZV9jbGFpbShwbmdfcHRyLCBjaHVua19uYW1lLCBjb21wLT5pbnB1dF9sZW4pOworCisgICBpZiAocmV0ICE9IFpfT0spCisgICAgICByZXR1cm4gcmV0OworCisgICAvKiBTZXQgdXAgdGhlIGNvbXByZXNzaW9uIGJ1ZmZlcnMsIHdlIG5lZWQgYSBsb29wIGhlcmUgdG8gYXZvaWQgb3ZlcmZsb3dpbmcgYQorICAgICogdUludC4gIFVzZSBaTElCX0lPX01BWCB0byBsaW1pdCB0aGUgaW5wdXQuICBUaGUgb3V0cHV0IGlzIGFsd2F5cyBsaW1pdGVkCisgICAgKiBieSB0aGUgb3V0cHV0IGJ1ZmZlciBzaXplLCBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIHRoYXQuICBTaW5jZSB0aGlzCisgICAgKiBpcyBBTlNJLUMgd2Uga25vdyB0aGF0IGFuICdpbnQnLCBoZW5jZSBhIHVJbnQsIGlzIGFsd2F5cyBhdCBsZWFzdCAxNiBiaXRzCisgICAgKiBpbiBzaXplLgorICAgICovCisgICB7CisgICAgICBwbmdfY29tcHJlc3Npb25fYnVmZmVycCAqZW5kID0gJnBuZ19wdHItPnpidWZmZXJfbGlzdDsKKyAgICAgIHBuZ19hbGxvY19zaXplX3QgaW5wdXRfbGVuID0gY29tcC0+aW5wdXRfbGVuOyAvKiBtYXkgYmUgemVybyEgKi8KKyAgICAgIHBuZ191aW50XzMyIG91dHB1dF9sZW47CisKKyAgICAgIC8qIHpsaWIgdXBkYXRlcyB0aGVzZSBmb3IgdXM6ICovCisgICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfaW4gPSBQTkdaX0lOUFVUX0NBU1QoY29tcC0+aW5wdXQpOworICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA9IDA7IC8qIFNldCBiZWxvdyAqLworICAgICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X291dCA9IGNvbXAtPm91dHB1dDsKKyAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gKHNpemVvZiBjb21wLT5vdXRwdXQpOworCisgICAgICBvdXRwdXRfbGVuID0gcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQ7CisKKyAgICAgIGRvCisgICAgICB7CisgICAgICAgICB1SW50IGF2YWlsX2luID0gWkxJQl9JT19NQVg7CisKKyAgICAgICAgIGlmIChhdmFpbF9pbiA+IGlucHV0X2xlbikKKyAgICAgICAgICAgIGF2YWlsX2luID0gKHVJbnQpaW5wdXRfbGVuOworCisgICAgICAgICBpbnB1dF9sZW4gLT0gYXZhaWxfaW47CisKKyAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPSBhdmFpbF9pbjsKKworICAgICAgICAgaWYgKHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID09IDApCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfY29tcHJlc3Npb25fYnVmZmVyICpuZXh0OworCisgICAgICAgICAgICAvKiBDaHVuayBkYXRhIGlzIGxpbWl0ZWQgdG8gMl4zMSBieXRlcyBpbiBsZW5ndGgsIHNvIHRoZSBwcmVmaXgKKyAgICAgICAgICAgICAqIGxlbmd0aCBtdXN0IGJlIGNvdW50ZWQgaGVyZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKG91dHB1dF9sZW4gKyBwcmVmaXhfbGVuID4gUE5HX1VJTlRfMzFfTUFYKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcmV0ID0gWl9NRU1fRVJST1I7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogTmVlZCBhIG5ldyAobWFsbG9jJ2VkKSBidWZmZXIsIGJ1dCB0aGVyZSBtYXkgYmUgb25lIHByZXNlbnQKKyAgICAgICAgICAgICAqIGFscmVhZHkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG5leHQgPSAqZW5kOworICAgICAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIG5leHQgPSBwbmdfdm9pZGNhc3QocG5nX2NvbXByZXNzaW9uX2J1ZmZlcnAsIHBuZ19tYWxsb2NfYmFzZQorICAgICAgICAgICAgICAgICAgKHBuZ19wdHIsIFBOR19DT01QUkVTU0lPTl9CVUZGRVJfU0laRShwbmdfcHRyKSkpOworCisgICAgICAgICAgICAgICBpZiAobmV4dCA9PSBOVUxMKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcmV0ID0gWl9NRU1fRVJST1I7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgLyogTGluayBpbiB0aGlzIGJ1ZmZlciAoc28gdGhhdCBpdCB3aWxsIGJlIGZyZWVkIGxhdGVyKSAqLworICAgICAgICAgICAgICAgbmV4dC0+bmV4dCA9IE5VTEw7CisgICAgICAgICAgICAgICAqZW5kID0gbmV4dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X291dCA9IG5leHQtPm91dHB1dDsKKyAgICAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gcG5nX3B0ci0+emJ1ZmZlcl9zaXplOworICAgICAgICAgICAgb3V0cHV0X2xlbiArPSBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dDsKKworICAgICAgICAgICAgLyogTW92ZSAnZW5kJyB0byB0aGUgbmV4dCBidWZmZXIgcG9pbnRlci4gKi8KKyAgICAgICAgICAgIGVuZCA9ICZuZXh0LT5uZXh0OworICAgICAgICAgfQorCisgICAgICAgICAvKiBDb21wcmVzcyB0aGUgZGF0YSAqLworICAgICAgICAgcmV0ID0gZGVmbGF0ZSgmcG5nX3B0ci0+enN0cmVhbSwKKyAgICAgICAgICAgIGlucHV0X2xlbiA+IDAgPyBaX05PX0ZMVVNIIDogWl9GSU5JU0gpOworCisgICAgICAgICAvKiBDbGF3IGJhY2sgaW5wdXQgZGF0YSB0aGF0IHdhcyBub3QgY29uc3VtZWQgKGJlY2F1c2UgYXZhaWxfaW4gaXMKKyAgICAgICAgICAqIHJlc2V0IGFib3ZlIGV2ZXJ5IHRpbWUgcm91bmQgdGhlIGxvb3ApLgorICAgICAgICAgICovCisgICAgICAgICBpbnB1dF9sZW4gKz0gcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbjsKKyAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPSAwOyAvKiBzYWZldHkgKi8KKyAgICAgIH0KKyAgICAgIHdoaWxlIChyZXQgPT0gWl9PSyk7CisKKyAgICAgIC8qIFRoZXJlIG1heSBiZSBzb21lIHNwYWNlIGxlZnQgaW4gdGhlIGxhc3Qgb3V0cHV0IGJ1ZmZlci4gVGhpcyBuZWVkcyB0bworICAgICAgICogYmUgc3VidHJhY3RlZCBmcm9tIG91dHB1dF9sZW4uCisgICAgICAgKi8KKyAgICAgIG91dHB1dF9sZW4gLT0gcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQ7CisgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9IDA7IC8qIHNhZmV0eSAqLworICAgICAgY29tcC0+b3V0cHV0X2xlbiA9IG91dHB1dF9sZW47CisKKyAgICAgIC8qIE5vdyBkb3VibGUgY2hlY2sgdGhlIG91dHB1dCBsZW5ndGgsIHB1dCBpbiBhIGN1c3RvbSBtZXNzYWdlIGlmIGl0IGlzCisgICAgICAgKiB0b28gbG9uZy4gIE90aGVyd2lzZSBlbnN1cmUgdGhlIHpfc3RyZWFtOjptc2cgcG9pbnRlciBpcyBzZXQgdG8KKyAgICAgICAqIHNvbWV0aGluZy4KKyAgICAgICAqLworICAgICAgaWYgKG91dHB1dF9sZW4gKyBwcmVmaXhfbGVuID49IFBOR19VSU5UXzMxX01BWCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0ubXNnID0gUE5HWl9NU0dfQ0FTVCgiY29tcHJlc3NlZCBkYXRhIHRvbyBsb25nIik7CisgICAgICAgICByZXQgPSBaX01FTV9FUlJPUjsKKyAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgICAgcG5nX3pzdHJlYW1fZXJyb3IocG5nX3B0ciwgcmV0KTsKKworICAgICAgLyogUmVzZXQgemxpYiBmb3IgYW5vdGhlciB6VFh0L2lUWHQgb3IgaW1hZ2UgZGF0YSAqLworICAgICAgcG5nX3B0ci0+em93bmVyID0gMDsKKworICAgICAgLyogVGhlIG9ubHkgc3VjY2VzcyBjYXNlIGlzIFpfU1RSRUFNX0VORCwgaW5wdXRfbGVuIG11c3QgYmUgMDsgaWYgbm90IHRoaXMKKyAgICAgICAqIGlzIGFuIGludGVybmFsIGVycm9yLgorICAgICAgICovCisgICAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VORCAmJiBpbnB1dF9sZW4gPT0gMCkKKyAgICAgIHsKKyNpZmRlZiBQTkdfV1JJVEVfT1BUSU1JWkVfQ01GX1NVUFBPUlRFRAorICAgICAgICAgLyogRml4IHVwIHRoZSBkZWZsYXRlIGhlYWRlciwgaWYgcmVxdWlyZWQgKi8KKyAgICAgICAgIG9wdGltaXplX2NtZihjb21wLT5vdXRwdXQsIGNvbXAtPmlucHV0X2xlbik7CisjZW5kaWYKKyAgICAgICAgIC8qIEJ1dCBaX09LIGlzIHJldHVybmVkLCBub3QgWl9TVFJFQU1fRU5EOyB0aGlzIGFsbG93cyB0aGUgY2xhaW0KKyAgICAgICAgICAqIGZ1bmN0aW9uIGFib3ZlIHRvIHJldHVybiBaX1NUUkVBTV9FTkQgb24gYW4gZXJyb3IgKHRob3VnaCBpdCBuZXZlcgorICAgICAgICAgICogZG9lcyBpbiB0aGUgY3VycmVudCB2ZXJzaW9ucyBvZiB6bGliLikKKyAgICAgICAgICAqLworICAgICAgICAgcmV0dXJuIFpfT0s7CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgICAgIHJldHVybiByZXQ7CisgICB9Cit9CisKKy8qIFNoaXAgdGhlIGNvbXByZXNzZWQgdGV4dCBvdXQgdmlhIGNodW5rIHdyaXRlcyAqLworc3RhdGljIHZvaWQKK3BuZ193cml0ZV9jb21wcmVzc2VkX2RhdGFfb3V0KHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBjb21wcmVzc2lvbl9zdGF0ZSAqY29tcCkKK3sKKyAgIHBuZ191aW50XzMyIG91dHB1dF9sZW4gPSBjb21wLT5vdXRwdXRfbGVuOworICAgcG5nX2NvbnN0X2J5dGVwIG91dHB1dCA9IGNvbXAtPm91dHB1dDsKKyAgIHBuZ191aW50XzMyIGF2YWlsID0gKHNpemVvZiBjb21wLT5vdXRwdXQpOworICAgcG5nX2NvbXByZXNzaW9uX2J1ZmZlciAqbmV4dCA9IHBuZ19wdHItPnpidWZmZXJfbGlzdDsKKworICAgZm9yICg7OykKKyAgIHsKKyAgICAgIGlmIChhdmFpbCA+IG91dHB1dF9sZW4pCisgICAgICAgICBhdmFpbCA9IG91dHB1dF9sZW47CisKKyAgICAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIG91dHB1dCwgYXZhaWwpOworCisgICAgICBvdXRwdXRfbGVuIC09IGF2YWlsOworCisgICAgICBpZiAob3V0cHV0X2xlbiA9PSAwIHx8IG5leHQgPT0gTlVMTCkKKyAgICAgICAgIGJyZWFrOworCisgICAgICBhdmFpbCA9IHBuZ19wdHItPnpidWZmZXJfc2l6ZTsKKyAgICAgIG91dHB1dCA9IG5leHQtPm91dHB1dDsKKyAgICAgIG5leHQgPSBuZXh0LT5uZXh0OworICAgfQorCisgICAvKiBUaGlzIGlzIGFuIGludGVybmFsIGVycm9yOyAnbmV4dCcgbXVzdCBoYXZlIGJlZW4gTlVMTCEgKi8KKyAgIGlmIChvdXRwdXRfbGVuID4gMCkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiZXJyb3Igd3JpdGluZyBhbmNpbGxhcnkgY2h1bmtlZCBjb21wcmVzc2VkIGRhdGEiKTsKK30KKyNlbmRpZiAvKiBXUklURV9DT01QUkVTU0VEX1RFWFQgKi8KKworI2lmIGRlZmluZWQoUE5HX1dSSVRFX1RFWFRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9wQ0FMX1NVUFBPUlRFRCkgfHwgXAorICAgIGRlZmluZWQoUE5HX1dSSVRFX2lDQ1BfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9zUExUX1NVUFBPUlRFRCkKKy8qIENoZWNrIHRoYXQgdGhlIHRFWHQgb3IgelRYdCBrZXl3b3JkIGlzIHZhbGlkIHBlciBQTkcgMS4wIHNwZWNpZmljYXRpb24sCisgKiBhbmQgaWYgaW52YWxpZCwgY29ycmVjdCB0aGUga2V5d29yZCByYXRoZXIgdGhhbiBkaXNjYXJkaW5nIHRoZSBlbnRpcmUKKyAqIGNodW5rLiAgVGhlIFBORyAxLjAgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyBrZXl3b3JkcyAxLTc5IGNoYXJhY3RlcnMgaW4KKyAqIGxlbmd0aCwgZm9yYmlkcyBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UsIG11bHRpcGxlIGludGVybmFsIHNwYWNlcywKKyAqIGFuZCB0aGUgbm9uLWJyZWFrIHNwYWNlICgweDgwKSBmcm9tIElTTyA4ODU5LTEuICBSZXR1cm5zIGtleXdvcmQgbGVuZ3RoLgorICoKKyAqIFRoZSAnbmV3X2tleScgYnVmZmVyIG11c3QgYmUgODAgY2hhcmFjdGVycyBpbiBzaXplIChmb3IgdGhlIGtleXdvcmQgcGx1cyBhCisgKiB0cmFpbGluZyAnXDAnKS4gIElmIHRoaXMgcm91dGluZSByZXR1cm5zIDAgdGhlbiB0aGVyZSB3YXMgbm8ga2V5d29yZCwgb3IgYQorICogdmFsaWQgb25lIGNvdWxkIG5vdCBiZSBnZW5lcmF0ZWQsIGFuZCB0aGUgY2FsbGVyIG11c3QgcG5nX2Vycm9yLgorICovCitzdGF0aWMgcG5nX3VpbnRfMzIKK3BuZ19jaGVja19rZXl3b3JkKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAga2V5LCBwbmdfYnl0ZXAgbmV3X2tleSkKK3sKKyAgIHBuZ19jb25zdF9jaGFycCBvcmlnX2tleSA9IGtleTsKKyAgIHBuZ191aW50XzMyIGtleV9sZW4gPSAwOworICAgaW50IGJhZF9jaGFyYWN0ZXIgPSAwOworICAgaW50IHNwYWNlID0gMTsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfY2hlY2tfa2V5d29yZCIpOworCisgICBpZiAoa2V5ID09IE5VTEwpCisgICB7CisgICAgICAqbmV3X2tleSA9IDA7CisgICAgICByZXR1cm4gMDsKKyAgIH0KKworICAgd2hpbGUgKCprZXkgJiYga2V5X2xlbiA8IDc5KQorICAgeworICAgICAgcG5nX2J5dGUgY2ggPSAocG5nX2J5dGUpKmtleSsrOworCisgICAgICBpZiAoKGNoID4gMzIgJiYgY2ggPD0gMTI2KSB8fCAoY2ggPj0gMTYxIC8qJiYgY2ggPD0gMjU1Ki8pKQorICAgICAgICAgKm5ld19rZXkrKyA9IGNoLCArK2tleV9sZW4sIHNwYWNlID0gMDsKKworICAgICAgZWxzZSBpZiAoc3BhY2UgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgIC8qIEEgc3BhY2Ugb3IgYW4gaW52YWxpZCBjaGFyYWN0ZXIgd2hlbiBvbmUgd2Fzbid0IHNlZW4gaW1tZWRpYXRlbHkKKyAgICAgICAgICAqIGJlZm9yZTsgb3V0cHV0IGp1c3QgYSBzcGFjZS4KKyAgICAgICAgICAqLworICAgICAgICAgKm5ld19rZXkrKyA9IDMyLCArK2tleV9sZW4sIHNwYWNlID0gMTsKKworICAgICAgICAgLyogSWYgdGhlIGNoYXJhY3RlciB3YXMgbm90IGEgc3BhY2UgdGhlbiBpdCBpcyBpbnZhbGlkLiAqLworICAgICAgICAgaWYgKGNoICE9IDMyKQorICAgICAgICAgICAgYmFkX2NoYXJhY3RlciA9IGNoOworICAgICAgfQorCisgICAgICBlbHNlIGlmIChiYWRfY2hhcmFjdGVyID09IDApCisgICAgICAgICBiYWRfY2hhcmFjdGVyID0gY2g7IC8qIGp1c3Qgc2tpcCBpdCwgcmVjb3JkIHRoZSBmaXJzdCBlcnJvciAqLworICAgfQorCisgICBpZiAoa2V5X2xlbiA+IDAgJiYgc3BhY2UgIT0gMCkgLyogdHJhaWxpbmcgc3BhY2UgKi8KKyAgIHsKKyAgICAgIC0ta2V5X2xlbiwgLS1uZXdfa2V5OworICAgICAgaWYgKGJhZF9jaGFyYWN0ZXIgPT0gMCkKKyAgICAgICAgIGJhZF9jaGFyYWN0ZXIgPSAzMjsKKyAgIH0KKworICAgLyogVGVybWluYXRlIHRoZSBrZXl3b3JkICovCisgICAqbmV3X2tleSA9IDA7CisKKyAgIGlmIChrZXlfbGVuID09IDApCisgICAgICByZXR1cm4gMDsKKworI2lmZGVmIFBOR19XQVJOSU5HU19TVVBQT1JURUQKKyAgIC8qIFRyeSB0byBvbmx5IG91dHB1dCBvbmUgd2FybmluZyBwZXIga2V5d29yZDogKi8KKyAgIGlmICgqa2V5ICE9IDApIC8qIGtleXdvcmQgdG9vIGxvbmcgKi8KKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJrZXl3b3JkIHRydW5jYXRlZCIpOworCisgICBlbHNlIGlmIChiYWRfY2hhcmFjdGVyICE9IDApCisgICB7CisgICAgICBQTkdfV0FSTklOR19QQVJBTUVURVJTKHApCisKKyAgICAgIHBuZ193YXJuaW5nX3BhcmFtZXRlcihwLCAxLCBvcmlnX2tleSk7CisgICAgICBwbmdfd2FybmluZ19wYXJhbWV0ZXJfc2lnbmVkKHAsIDIsIFBOR19OVU1CRVJfRk9STUFUXzAyeCwgYmFkX2NoYXJhY3Rlcik7CisKKyAgICAgIHBuZ19mb3JtYXR0ZWRfd2FybmluZyhwbmdfcHRyLCBwLCAia2V5d29yZCBcIkAxXCI6IGJhZCBjaGFyYWN0ZXIgJzB4QDInIik7CisgICB9CisjZW5kaWYgLyogV0FSTklOR1MgKi8KKworICAgcmV0dXJuIGtleV9sZW47Cit9CisjZW5kaWYgLyogV1JJVEVfVEVYVCB8fCBXUklURV9wQ0FMIHx8IFdSSVRFX2lDQ1AgfHwgV1JJVEVfc1BMVCAqLworCisvKiBXcml0ZSB0aGUgSUhEUiBjaHVuaywgYW5kIHVwZGF0ZSB0aGUgcG5nX3N0cnVjdCB3aXRoIHRoZSBuZWNlc3NhcnkKKyAqIGluZm9ybWF0aW9uLiAgTm90ZSB0aGF0IHRoZSByZXN0IG9mIHRoaXMgY29kZSBkZXBlbmRzIHVwb24gdGhpcworICogaW5mb3JtYXRpb24gYmVpbmcgY29ycmVjdC4KKyAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfd3JpdGVfSUhEUihwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgd2lkdGgsIHBuZ191aW50XzMyIGhlaWdodCwKKyAgICBpbnQgYml0X2RlcHRoLCBpbnQgY29sb3JfdHlwZSwgaW50IGNvbXByZXNzaW9uX3R5cGUsIGludCBmaWx0ZXJfdHlwZSwKKyAgICBpbnQgaW50ZXJsYWNlX3R5cGUpCit7CisgICBwbmdfYnl0ZSBidWZbMTNdOyAvKiBCdWZmZXIgdG8gc3RvcmUgdGhlIElIRFIgaW5mbyAqLworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9JSERSIik7CisKKyAgIC8qIENoZWNrIHRoYXQgd2UgaGF2ZSB2YWxpZCBpbnB1dCBkYXRhIGZyb20gdGhlIGFwcGxpY2F0aW9uIGluZm8gKi8KKyAgIHN3aXRjaCAoY29sb3JfdHlwZSkKKyAgIHsKKyAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfR1JBWToKKyAgICAgICAgIHN3aXRjaCAoYml0X2RlcHRoKQorICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgY2FzZSA4OgorI2lmZGVmIFBOR19XUklURV8xNkJJVF9TVVBQT1JURUQKKyAgICAgICAgICAgIGNhc2UgMTY6CisjZW5kaWYKKyAgICAgICAgICAgICAgIHBuZ19wdHItPmNoYW5uZWxzID0gMTsgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwKKyAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBiaXQgZGVwdGggZm9yIGdyYXlzY2FsZSBpbWFnZSIpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUkdCOgorI2lmZGVmIFBOR19XUklURV8xNkJJVF9TVVBQT1JURUQKKyAgICAgICAgIGlmIChiaXRfZGVwdGggIT0gOCAmJiBiaXRfZGVwdGggIT0gMTYpCisjZWxzZQorICAgICAgICAgaWYgKGJpdF9kZXB0aCAhPSA4KQorI2VuZGlmCisgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgYml0IGRlcHRoIGZvciBSR0IgaW1hZ2UiKTsKKworICAgICAgICAgcG5nX3B0ci0+Y2hhbm5lbHMgPSAzOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUEFMRVRURToKKyAgICAgICAgIHN3aXRjaCAoYml0X2RlcHRoKQorICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgcG5nX3B0ci0+Y2hhbm5lbHMgPSAxOworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgYml0IGRlcHRoIGZvciBwYWxldHRlZCBpbWFnZSIpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQToKKyAgICAgICAgIGlmIChiaXRfZGVwdGggIT0gOCAmJiBiaXRfZGVwdGggIT0gMTYpCisgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgYml0IGRlcHRoIGZvciBncmF5c2NhbGUrYWxwaGEgaW1hZ2UiKTsKKworICAgICAgICAgcG5nX3B0ci0+Y2hhbm5lbHMgPSAyOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBOgorI2lmZGVmIFBOR19XUklURV8xNkJJVF9TVVBQT1JURUQKKyAgICAgICAgIGlmIChiaXRfZGVwdGggIT0gOCAmJiBiaXRfZGVwdGggIT0gMTYpCisjZWxzZQorICAgICAgICAgaWYgKGJpdF9kZXB0aCAhPSA4KQorI2VuZGlmCisgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgYml0IGRlcHRoIGZvciBSR0JBIGltYWdlIik7CisKKyAgICAgICAgIHBuZ19wdHItPmNoYW5uZWxzID0gNDsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbnZhbGlkIGltYWdlIGNvbG9yIHR5cGUgc3BlY2lmaWVkIik7CisgICB9CisKKyAgIGlmIChjb21wcmVzc2lvbl90eXBlICE9IFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBjb21wcmVzc2lvbiB0eXBlIHNwZWNpZmllZCIpOworICAgICAgY29tcHJlc3Npb25fdHlwZSA9IFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0U7CisgICB9CisKKyAgIC8qIFdyaXRlIGZpbHRlcl9tZXRob2QgNjQgKGludHJhcGl4ZWwgZGlmZmVyZW5jaW5nKSBvbmx5IGlmCisgICAgKiAxLiBMaWJwbmcgd2FzIGNvbXBpbGVkIHdpdGggUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQgYW5kCisgICAgKiAyLiBMaWJwbmcgZGlkIG5vdCB3cml0ZSBhIFBORyBzaWduYXR1cmUgKHRoaXMgZmlsdGVyX21ldGhvZCBpcyBvbmx5CisgICAgKiAgICB1c2VkIGluIFBORyBkYXRhc3RyZWFtcyB0aGF0IGFyZSBlbWJlZGRlZCBpbiBNTkcgZGF0YXN0cmVhbXMpIGFuZAorICAgICogMy4gVGhlIGFwcGxpY2F0aW9uIGNhbGxlZCBwbmdfcGVybWl0X21uZ19mZWF0dXJlcyB3aXRoIGEgbWFzayB0aGF0CisgICAgKiAgICBpbmNsdWRlZCBQTkdfRkxBR19NTkdfRklMVEVSXzY0IGFuZAorICAgICogNC4gVGhlIGZpbHRlcl9tZXRob2QgaXMgNjQgYW5kCisgICAgKiA1LiBUaGUgY29sb3JfdHlwZSBpcyBSR0Igb3IgUkdCQQorICAgICovCisgICBpZiAoCisjaWZkZWYgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQKKyAgICAgICAhKChwbmdfcHRyLT5tbmdfZmVhdHVyZXNfcGVybWl0dGVkICYgUE5HX0ZMQUdfTU5HX0ZJTFRFUl82NCkgIT0gMCAmJgorICAgICAgICgocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX1BOR19TSUdOQVRVUkUpID09IDApICYmCisgICAgICAgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCIHx8CisgICAgICAgIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKSAmJgorICAgICAgIChmaWx0ZXJfdHlwZSA9PSBQTkdfSU5UUkFQSVhFTF9ESUZGRVJFTkNJTkcpKSAmJgorI2VuZGlmCisgICAgICAgZmlsdGVyX3R5cGUgIT0gUE5HX0ZJTFRFUl9UWVBFX0JBU0UpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBmaWx0ZXIgdHlwZSBzcGVjaWZpZWQiKTsKKyAgICAgIGZpbHRlcl90eXBlID0gUE5HX0ZJTFRFUl9UWVBFX0JBU0U7CisgICB9CisKKyNpZmRlZiBQTkdfV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVECisgICBpZiAoaW50ZXJsYWNlX3R5cGUgIT0gUE5HX0lOVEVSTEFDRV9OT05FICYmCisgICAgICAgaW50ZXJsYWNlX3R5cGUgIT0gUE5HX0lOVEVSTEFDRV9BREFNNykKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGludGVybGFjZSB0eXBlIHNwZWNpZmllZCIpOworICAgICAgaW50ZXJsYWNlX3R5cGUgPSBQTkdfSU5URVJMQUNFX0FEQU03OworICAgfQorI2Vsc2UKKyAgIGludGVybGFjZV90eXBlPVBOR19JTlRFUkxBQ0VfTk9ORTsKKyNlbmRpZgorCisgICAvKiBTYXZlIHRoZSByZWxldmFudCBpbmZvcm1hdGlvbiAqLworICAgcG5nX3B0ci0+Yml0X2RlcHRoID0gKHBuZ19ieXRlKWJpdF9kZXB0aDsKKyAgIHBuZ19wdHItPmNvbG9yX3R5cGUgPSAocG5nX2J5dGUpY29sb3JfdHlwZTsKKyAgIHBuZ19wdHItPmludGVybGFjZWQgPSAocG5nX2J5dGUpaW50ZXJsYWNlX3R5cGU7CisjaWZkZWYgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQKKyAgIHBuZ19wdHItPmZpbHRlcl90eXBlID0gKHBuZ19ieXRlKWZpbHRlcl90eXBlOworI2VuZGlmCisgICBwbmdfcHRyLT5jb21wcmVzc2lvbl90eXBlID0gKHBuZ19ieXRlKWNvbXByZXNzaW9uX3R5cGU7CisgICBwbmdfcHRyLT53aWR0aCA9IHdpZHRoOworICAgcG5nX3B0ci0+aGVpZ2h0ID0gaGVpZ2h0OworCisgICBwbmdfcHRyLT5waXhlbF9kZXB0aCA9IChwbmdfYnl0ZSkoYml0X2RlcHRoICogcG5nX3B0ci0+Y2hhbm5lbHMpOworICAgcG5nX3B0ci0+cm93Ynl0ZXMgPSBQTkdfUk9XQllURVMocG5nX3B0ci0+cGl4ZWxfZGVwdGgsIHdpZHRoKTsKKyAgIC8qIFNldCB0aGUgdXNyIGluZm8sIHNvIGFueSB0cmFuc2Zvcm1hdGlvbnMgY2FuIG1vZGlmeSBpdCAqLworICAgcG5nX3B0ci0+dXNyX3dpZHRoID0gcG5nX3B0ci0+d2lkdGg7CisgICBwbmdfcHRyLT51c3JfYml0X2RlcHRoID0gcG5nX3B0ci0+Yml0X2RlcHRoOworICAgcG5nX3B0ci0+dXNyX2NoYW5uZWxzID0gcG5nX3B0ci0+Y2hhbm5lbHM7CisKKyAgIC8qIFBhY2sgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiBpbnRvIHRoZSBidWZmZXIgKi8KKyAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmLCB3aWR0aCk7CisgICBwbmdfc2F2ZV91aW50XzMyKGJ1ZiArIDQsIGhlaWdodCk7CisgICBidWZbOF0gPSAocG5nX2J5dGUpYml0X2RlcHRoOworICAgYnVmWzldID0gKHBuZ19ieXRlKWNvbG9yX3R5cGU7CisgICBidWZbMTBdID0gKHBuZ19ieXRlKWNvbXByZXNzaW9uX3R5cGU7CisgICBidWZbMTFdID0gKHBuZ19ieXRlKWZpbHRlcl90eXBlOworICAgYnVmWzEyXSA9IChwbmdfYnl0ZSlpbnRlcmxhY2VfdHlwZTsKKworICAgLyogV3JpdGUgdGhlIGNodW5rICovCisgICBwbmdfd3JpdGVfY29tcGxldGVfY2h1bmsocG5nX3B0ciwgcG5nX0lIRFIsIGJ1ZiwgKHBuZ19zaXplX3QpMTMpOworCisgICBpZiAoKHBuZ19wdHItPmRvX2ZpbHRlcikgPT0gUE5HX05PX0ZJTFRFUlMpCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFIHx8CisgICAgICAgICAgcG5nX3B0ci0+Yml0X2RlcHRoIDwgOCkKKyAgICAgICAgIHBuZ19wdHItPmRvX2ZpbHRlciA9IFBOR19GSUxURVJfTk9ORTsKKworICAgICAgZWxzZQorICAgICAgICAgcG5nX3B0ci0+ZG9fZmlsdGVyID0gUE5HX0FMTF9GSUxURVJTOworICAgfQorCisgICBwbmdfcHRyLT5tb2RlID0gUE5HX0hBVkVfSUhEUjsgLyogbm90IFJFQURZX0ZPUl9aVFhUICovCit9CisKKy8qIFdyaXRlIHRoZSBwYWxldHRlLiAgV2UgYXJlIGNhcmVmdWwgbm90IHRvIHRydXN0IHBuZ19jb2xvciB0byBiZSBpbiB0aGUKKyAqIGNvcnJlY3Qgb3JkZXIgZm9yIFBORywgc28gcGVvcGxlIGNhbiByZWRlZmluZSBpdCB0byBhbnkgY29udmVuaWVudAorICogc3RydWN0dXJlLgorICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ193cml0ZV9QTFRFKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfY29sb3JwIHBhbGV0dGUsCisgICAgcG5nX3VpbnRfMzIgbnVtX3BhbCkKK3sKKyAgIHBuZ191aW50XzMyIG1heF9wYWxldHRlX2xlbmd0aCwgaTsKKyAgIHBuZ19jb25zdF9jb2xvcnAgcGFsX3B0cjsKKyAgIHBuZ19ieXRlIGJ1ZlszXTsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfUExURSIpOworCisgICBtYXhfcGFsZXR0ZV9sZW5ndGggPSAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKSA/CisgICAgICAoMSA8PCBwbmdfcHRyLT5iaXRfZGVwdGgpIDogUE5HX01BWF9QQUxFVFRFX0xFTkdUSDsKKworICAgaWYgKCgKKyNpZmRlZiBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRAorICAgICAgIChwbmdfcHRyLT5tbmdfZmVhdHVyZXNfcGVybWl0dGVkICYgUE5HX0ZMQUdfTU5HX0VNUFRZX1BMVEUpID09IDAgJiYKKyNlbmRpZgorICAgICAgIG51bV9wYWwgPT0gMCkgfHwgbnVtX3BhbCA+IG1heF9wYWxldHRlX2xlbmd0aCkKKyAgIHsKKyAgICAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCisgICAgICB7CisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgbnVtYmVyIG9mIGNvbG9ycyBpbiBwYWxldHRlIik7CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIG51bWJlciBvZiBjb2xvcnMgaW4gcGFsZXR0ZSIpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgfQorCisgICBpZiAoKHBuZ19wdHItPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikgPT0gMCkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCisgICAgICAgICAgIklnbm9yaW5nIHJlcXVlc3QgdG8gd3JpdGUgYSBQTFRFIGNodW5rIGluIGdyYXlzY2FsZSBQTkciKTsKKworICAgICAgcmV0dXJuOworICAgfQorCisgICBwbmdfcHRyLT5udW1fcGFsZXR0ZSA9IChwbmdfdWludF8xNiludW1fcGFsOworICAgcG5nX2RlYnVnMSgzLCAibnVtX3BhbGV0dGUgPSAlZCIsIHBuZ19wdHItPm51bV9wYWxldHRlKTsKKworICAgcG5nX3dyaXRlX2NodW5rX2hlYWRlcihwbmdfcHRyLCBwbmdfUExURSwgKHBuZ191aW50XzMyKShudW1fcGFsICogMykpOworI2lmZGVmIFBOR19QT0lOVEVSX0lOREVYSU5HX1NVUFBPUlRFRAorCisgICBmb3IgKGkgPSAwLCBwYWxfcHRyID0gcGFsZXR0ZTsgaSA8IG51bV9wYWw7IGkrKywgcGFsX3B0cisrKQorICAgeworICAgICAgYnVmWzBdID0gcGFsX3B0ci0+cmVkOworICAgICAgYnVmWzFdID0gcGFsX3B0ci0+Z3JlZW47CisgICAgICBidWZbMl0gPSBwYWxfcHRyLT5ibHVlOworICAgICAgcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3B0ciwgYnVmLCAocG5nX3NpemVfdCkzKTsKKyAgIH0KKworI2Vsc2UKKyAgIC8qIFRoaXMgaXMgYSBsaXR0bGUgc2xvd2VyIGJ1dCBzb21lIGJ1Z2d5IGNvbXBpbGVycyBuZWVkIHRvIGRvIHRoaXMKKyAgICAqIGluc3RlYWQKKyAgICAqLworICAgcGFsX3B0cj1wYWxldHRlOworCisgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhbDsgaSsrKQorICAgeworICAgICAgYnVmWzBdID0gcGFsX3B0cltpXS5yZWQ7CisgICAgICBidWZbMV0gPSBwYWxfcHRyW2ldLmdyZWVuOworICAgICAgYnVmWzJdID0gcGFsX3B0cltpXS5ibHVlOworICAgICAgcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3B0ciwgYnVmLCAocG5nX3NpemVfdCkzKTsKKyAgIH0KKworI2VuZGlmCisgICBwbmdfd3JpdGVfY2h1bmtfZW5kKHBuZ19wdHIpOworICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfSEFWRV9QTFRFOworfQorCisvKiBUaGlzIGlzIHNpbWlsYXIgdG8gcG5nX3RleHRfY29tcHJlc3MsIGFib3ZlLCBleGNlcHQgdGhhdCBpdCBkb2VzIG5vdCByZXF1aXJlCisgKiBhbGwgb2YgdGhlIGRhdGEgYXQgb25jZSBhbmQsIGluc3RlYWQgb2YgYnVmZmVyaW5nIHRoZSBjb21wcmVzc2VkIHJlc3VsdCwKKyAqIHdyaXRlcyBpdCBhcyBJREFUIGNodW5rcy4gIFVubGlrZSBwbmdfdGV4dF9jb21wcmVzcyBpdCAqY2FuKiBwbmdfZXJyb3Igb3V0CisgKiBiZWNhdXNlIGl0IGNhbGxzIHRoZSB3cml0ZSBpbnRlcmZhY2UuICBBcyBhIHJlc3VsdCBpdCBkb2VzIGl0cyBvd24gZXJyb3IKKyAqIHJlcG9ydGluZyBhbmQgZG9lcyBub3QgcmV0dXJuIGFuIGVycm9yIGNvZGUuICBJbiB0aGUgZXZlbnQgb2YgZXJyb3IgaXQgd2lsbAorICoganVzdCBjYWxsIHBuZ19lcnJvci4gIFRoZSBpbnB1dCBkYXRhIGxlbmd0aCBtYXkgZXhjZWVkIDMyLWJpdHMuICBUaGUgJ2ZsdXNoJworICogcGFyYW1ldGVyIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhhdCB0byBkZWZsYXRlLCB3aXRoIHRoZSBmb2xsb3dpbmcKKyAqIG1lYW5pbmdzOgorICoKKyAqIFpfTk9fRkxVU0g6IG5vcm1hbCBpbmNyZW1lbnRhbCBvdXRwdXQgb2YgY29tcHJlc3NlZCBkYXRhCisgKiBaX1NZTkNfRkxVU0g6IGRvIGEgU1lOQ19GTFVTSCwgdXNlZCBieSBwbmdfd3JpdGVfZmx1c2gKKyAqIFpfRklOSVNIOiB0aGlzIGlzIHRoZSBlbmQgb2YgdGhlIGlucHV0LCBkbyBhIFpfRklOSVNIIGFuZCBjbGVhbiB1cAorICoKKyAqIFRoZSByb3V0aW5lIG1hbmFnZXMgdGhlIGFjcXVpcmUgYW5kIHJlbGVhc2Ugb2YgdGhlIHBuZ19wdHItPnpzdHJlYW0gYnkKKyAqIGNoZWNraW5nIGFuZCAoYXQgdGhlIGVuZCkgY2xlYXJpbmcgcG5nX3B0ci0+em93bmVyOyBpdCBkb2VzIHNvbWUgc2FuaXR5CisgKiBjaGVja3Mgb24gdGhlICdtb2RlJyBmbGFncyB3aGlsZSBkb2luZyB0aGlzLgorICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19jb21wcmVzc19JREFUKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfYnl0ZXAgaW5wdXQsCisgICBwbmdfYWxsb2Nfc2l6ZV90IGlucHV0X2xlbiwgaW50IGZsdXNoKQoreworICAgaWYgKHBuZ19wdHItPnpvd25lciAhPSBwbmdfSURBVCkKKyAgIHsKKyAgICAgIC8qIEZpcnN0IHRpbWUuICAgRW5zdXJlIHdlIGhhdmUgYSB0ZW1wb3JhcnkgYnVmZmVyIGZvciBjb21wcmVzc2lvbiBhbmQKKyAgICAgICAqIHRyaW0gdGhlIGJ1ZmZlciBsaXN0IGlmIGl0IGhhcyBtb3JlIHRoYW4gb25lIGVudHJ5IHRvIGZyZWUgbWVtb3J5LgorICAgICAgICogSWYgJ1dSSVRFX0NPTVBSRVNTRURfVEVYVCcgaXMgbm90IHNldCB0aGUgbGlzdCB3aWxsIG5ldmVyIGhhdmUgYmVlbgorICAgICAgICogY3JlYXRlZCBhdCB0aGlzIHBvaW50LCBidXQgdGhlIGNoZWNrIGhlcmUgaXMgcXVpY2sgYW5kIHNhZmUuCisgICAgICAgKi8KKyAgICAgIGlmIChwbmdfcHRyLT56YnVmZmVyX2xpc3QgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19wdHItPnpidWZmZXJfbGlzdCA9IHBuZ192b2lkY2FzdChwbmdfY29tcHJlc3Npb25fYnVmZmVycCwKKyAgICAgICAgICAgIHBuZ19tYWxsb2MocG5nX3B0ciwgUE5HX0NPTVBSRVNTSU9OX0JVRkZFUl9TSVpFKHBuZ19wdHIpKSk7CisgICAgICAgICBwbmdfcHRyLT56YnVmZmVyX2xpc3QtPm5leHQgPSBOVUxMOworICAgICAgfQorCisgICAgICBlbHNlCisgICAgICAgICBwbmdfZnJlZV9idWZmZXJfbGlzdChwbmdfcHRyLCAmcG5nX3B0ci0+emJ1ZmZlcl9saXN0LT5uZXh0KTsKKworICAgICAgLyogSXQgaXMgYSB0ZXJtaW5hbCBlcnJvciBpZiB3ZSBjYW4ndCBjbGFpbSB0aGUgenN0cmVhbS4gKi8KKyAgICAgIGlmIChwbmdfZGVmbGF0ZV9jbGFpbShwbmdfcHRyLCBwbmdfSURBVCwgcG5nX2ltYWdlX3NpemUocG5nX3B0cikpICE9IFpfT0spCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgcG5nX3B0ci0+enN0cmVhbS5tc2cpOworCisgICAgICAvKiBUaGUgb3V0cHV0IHN0YXRlIGlzIG1haW50YWluZWQgaW4gcG5nX3B0ci0+enN0cmVhbSwgc28gaXQgbXVzdCBiZQorICAgICAgICogaW5pdGlhbGl6ZWQgaGVyZSBhZnRlciB0aGUgY2xhaW0uCisgICAgICAgKi8KKyAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBwbmdfcHRyLT56YnVmZmVyX2xpc3QtPm91dHB1dDsKKyAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gcG5nX3B0ci0+emJ1ZmZlcl9zaXplOworICAgfQorCisgICAvKiBOb3cgbG9vcCByZWFkaW5nIGFuZCB3cml0aW5nIHVudGlsIGFsbCB0aGUgaW5wdXQgaXMgY29uc3VtZWQgb3IgYW4gZXJyb3IKKyAgICAqIHRlcm1pbmF0ZXMgdGhlIG9wZXJhdGlvbi4gIFRoZSBfb3V0IHZhbHVlcyBhcmUgbWFpbnRhaW5lZCBhY3Jvc3MgY2FsbHMgdG8KKyAgICAqIHRoaXMgZnVuY3Rpb24sIGJ1dCB0aGUgaW5wdXQgbXVzdCBiZSByZXNldCBlYWNoIHRpbWUuCisgICAgKi8KKyAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9pbiA9IFBOR1pfSU5QVVRfQ0FTVChpbnB1dCk7CisgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luID0gMDsgLyogc2V0IGJlbG93ICovCisgICBmb3IgKDs7KQorICAgeworICAgICAgaW50IHJldDsKKworICAgICAgLyogSU5QVVQ6IGZyb20gdGhlIHJvdyBkYXRhICovCisgICAgICB1SW50IGF2YWlsID0gWkxJQl9JT19NQVg7CisKKyAgICAgIGlmIChhdmFpbCA+IGlucHV0X2xlbikKKyAgICAgICAgIGF2YWlsID0gKHVJbnQpaW5wdXRfbGVuOyAvKiBzYWZlIGJlY2F1c2Ugb2YgdGhlIGNoZWNrICovCisKKyAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPSBhdmFpbDsKKyAgICAgIGlucHV0X2xlbiAtPSBhdmFpbDsKKworICAgICAgcmV0ID0gZGVmbGF0ZSgmcG5nX3B0ci0+enN0cmVhbSwgaW5wdXRfbGVuID4gMCA/IFpfTk9fRkxVU0ggOiBmbHVzaCk7CisKKyAgICAgIC8qIEluY2x1ZGUgYXMteWV0IHVuY29uc3VtZWQgaW5wdXQgKi8KKyAgICAgIGlucHV0X2xlbiArPSBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luOworICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA9IDA7CisKKyAgICAgIC8qIE9VVFBVVDogd3JpdGUgY29tcGxldGUgSURBVCBjaHVua3Mgd2hlbiBhdmFpbF9vdXQgZHJvcHMgdG8gemVyby4gTm90ZQorICAgICAgICogdGhhdCB0aGVzZSB0d28genN0cmVhbSBmaWVsZHMgYXJlIHByZXNlcnZlZCBhY3Jvc3MgdGhlIGNhbGxzLCB0aGVyZWZvcmUKKyAgICAgICAqIHRoZXJlIGlzIG5vIG5lZWQgdG8gc2V0IHRoZXNlIHVwIG9uIGVudHJ5IHRvIHRoZSBsb29wLgorICAgICAgICovCisgICAgICBpZiAocG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19ieXRlcCBkYXRhID0gcG5nX3B0ci0+emJ1ZmZlcl9saXN0LT5vdXRwdXQ7CisgICAgICAgICB1SW50IHNpemUgPSBwbmdfcHRyLT56YnVmZmVyX3NpemU7CisKKyAgICAgICAgIC8qIFdyaXRlIGFuIElEQVQgY29udGFpbmluZyB0aGUgZGF0YSB0aGVuIHJlc2V0IHRoZSBidWZmZXIuICBUaGUKKyAgICAgICAgICAqIGZpcnN0IElEQVQgbWF5IG5lZWQgZGVmbGF0ZSBoZWFkZXIgb3B0aW1pemF0aW9uLgorICAgICAgICAgICovCisjaWZkZWYgUE5HX1dSSVRFX09QVElNSVpFX0NNRl9TVVBQT1JURUQKKyAgICAgICAgICAgIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpID09IDAgJiYKKyAgICAgICAgICAgICAgICBwbmdfcHRyLT5jb21wcmVzc2lvbl90eXBlID09IFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UpCisgICAgICAgICAgICAgICBvcHRpbWl6ZV9jbWYoZGF0YSwgcG5nX2ltYWdlX3NpemUocG5nX3B0cikpOworI2VuZGlmCisKKyAgICAgICAgIHBuZ193cml0ZV9jb21wbGV0ZV9jaHVuayhwbmdfcHRyLCBwbmdfSURBVCwgZGF0YSwgc2l6ZSk7CisgICAgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX0lEQVQ7CisKKyAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBkYXRhOworICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPSBzaXplOworCisgICAgICAgICAvKiBGb3IgU1lOQ19GTFVTSCBvciBGSU5JU0ggaXQgaXMgZXNzZW50aWFsIHRvIGtlZXAgY2FsbGluZyB6bGliIHdpdGgKKyAgICAgICAgICAqIHRoZSBzYW1lIGZsdXNoIHBhcmFtZXRlciB1bnRpbCBpdCBoYXMgZmluaXNoZWQgb3V0cHV0LCBmb3IgTk9fRkxVU0gKKyAgICAgICAgICAqIGl0IGRvZXNuJ3QgbWF0dGVyLgorICAgICAgICAgICovCisgICAgICAgICBpZiAocmV0ID09IFpfT0sgJiYgZmx1c2ggIT0gWl9OT19GTFVTSCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvKiBUaGUgb3JkZXIgb2YgdGhlc2UgY2hlY2tzIGRvZXNuJ3QgbWF0dGVyIG11Y2g7IGl0IGp1c3QgYWZmZWN0cyB3aGljaAorICAgICAgICogcG9zc2libGUgZXJyb3IgbWlnaHQgYmUgZGV0ZWN0ZWQgaWYgbXVsdGlwbGUgdGhpbmdzIGdvIHdyb25nIGF0IG9uY2UuCisgICAgICAgKi8KKyAgICAgIGlmIChyZXQgPT0gWl9PSykgLyogbW9zdCBsaWtlbHkgcmV0dXJuIGNvZGUhICovCisgICAgICB7CisgICAgICAgICAvKiBJZiBhbGwgdGhlIGlucHV0IGhhcyBiZWVuIGNvbnN1bWVkIHRoZW4ganVzdCByZXR1cm4uICBJZiBaX0ZJTklTSAorICAgICAgICAgICogd2FzIHVzZWQgYXMgdGhlIGZsdXNoIHBhcmFtZXRlciBzb21ldGhpbmcgaGFzIGdvbmUgd3JvbmcgaWYgd2UgZ2V0CisgICAgICAgICAgKiBoZXJlLgorICAgICAgICAgICovCisgICAgICAgICBpZiAoaW5wdXRfbGVuID09IDApCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmx1c2ggPT0gWl9GSU5JU0gpCisgICAgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlpfT0sgb24gWl9GSU5JU0ggd2l0aCBvdXRwdXQgc3BhY2UiKTsKKworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBlbHNlIGlmIChyZXQgPT0gWl9TVFJFQU1fRU5EICYmIGZsdXNoID09IFpfRklOSVNIKQorICAgICAgeworICAgICAgICAgLyogVGhpcyBpcyB0aGUgZW5kIG9mIHRoZSBJREFUIGRhdGE7IGFueSBwZW5kaW5nIG91dHB1dCBtdXN0IGJlCisgICAgICAgICAgKiBmbHVzaGVkLiAgRm9yIHNtYWxsIFBORyBmaWxlcyB3ZSBtYXkgc3RpbGwgYmUgYXQgdGhlIGJlZ2lubmluZy4KKyAgICAgICAgICAqLworICAgICAgICAgcG5nX2J5dGVwIGRhdGEgPSBwbmdfcHRyLT56YnVmZmVyX2xpc3QtPm91dHB1dDsKKyAgICAgICAgIHVJbnQgc2l6ZSA9IHBuZ19wdHItPnpidWZmZXJfc2l6ZSAtIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0OworCisjaWZkZWYgUE5HX1dSSVRFX09QVElNSVpFX0NNRl9TVVBQT1JURUQKKyAgICAgICAgIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpID09IDAgJiYKKyAgICAgICAgICAgICBwbmdfcHRyLT5jb21wcmVzc2lvbl90eXBlID09IFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UpCisgICAgICAgICAgICBvcHRpbWl6ZV9jbWYoZGF0YSwgcG5nX2ltYWdlX3NpemUocG5nX3B0cikpOworI2VuZGlmCisKKyAgICAgICAgIHBuZ193cml0ZV9jb21wbGV0ZV9jaHVuayhwbmdfcHRyLCBwbmdfSURBVCwgZGF0YSwgc2l6ZSk7CisgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9IDA7CisgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gTlVMTDsKKyAgICAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfSURBVCB8IFBOR19BRlRFUl9JREFUOworCisgICAgICAgICBwbmdfcHRyLT56b3duZXIgPSAwOyAvKiBSZWxlYXNlIHRoZSBzdHJlYW0gKi8KKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgLyogVGhpcyBpcyBhbiBlcnJvciBjb25kaXRpb24uICovCisgICAgICAgICBwbmdfenN0cmVhbV9lcnJvcihwbmdfcHRyLCByZXQpOworICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsIHBuZ19wdHItPnpzdHJlYW0ubXNnKTsKKyAgICAgIH0KKyAgIH0KK30KKworLyogV3JpdGUgYW4gSUVORCBjaHVuayAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfd3JpdGVfSUVORChwbmdfc3RydWN0cnAgcG5nX3B0cikKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX0lFTkQiKTsKKworICAgcG5nX3dyaXRlX2NvbXBsZXRlX2NodW5rKHBuZ19wdHIsIHBuZ19JRU5ELCBOVUxMLCAocG5nX3NpemVfdCkwKTsKKyAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfSUVORDsKK30KKworI2lmZGVmIFBOR19XUklURV9nQU1BX1NVUFBPUlRFRAorLyogV3JpdGUgYSBnQU1BIGNodW5rICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ193cml0ZV9nQU1BX2ZpeGVkKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfZml4ZWRfcG9pbnQgZmlsZV9nYW1tYSkKK3sKKyAgIHBuZ19ieXRlIGJ1Zls0XTsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfZ0FNQSIpOworCisgICAvKiBmaWxlX2dhbW1hIGlzIHNhdmVkIGluIDEvMTAwLDAwMHRocyAqLworICAgcG5nX3NhdmVfdWludF8zMihidWYsIChwbmdfdWludF8zMilmaWxlX2dhbW1hKTsKKyAgIHBuZ193cml0ZV9jb21wbGV0ZV9jaHVuayhwbmdfcHRyLCBwbmdfZ0FNQSwgYnVmLCAocG5nX3NpemVfdCk0KTsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX3NSR0JfU1VQUE9SVEVECisvKiBXcml0ZSBhIHNSR0IgY2h1bmsgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3dyaXRlX3NSR0IocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBzcmdiX2ludGVudCkKK3sKKyAgIHBuZ19ieXRlIGJ1ZlsxXTsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfc1JHQiIpOworCisgICBpZiAoc3JnYl9pbnRlbnQgPj0gUE5HX3NSR0JfSU5URU5UX0xBU1QpCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAgICJJbnZhbGlkIHNSR0IgcmVuZGVyaW5nIGludGVudCBzcGVjaWZpZWQiKTsKKworICAgYnVmWzBdPShwbmdfYnl0ZSlzcmdiX2ludGVudDsKKyAgIHBuZ193cml0ZV9jb21wbGV0ZV9jaHVuayhwbmdfcHRyLCBwbmdfc1JHQiwgYnVmLCAocG5nX3NpemVfdCkxKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX2lDQ1BfU1VQUE9SVEVECisvKiBXcml0ZSBhbiBpQ0NQIGNodW5rICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ193cml0ZV9pQ0NQKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgbmFtZSwKKyAgICBwbmdfY29uc3RfYnl0ZXAgcHJvZmlsZSkKK3sKKyAgIHBuZ191aW50XzMyIG5hbWVfbGVuOworICAgcG5nX3VpbnRfMzIgcHJvZmlsZV9sZW47CisgICBwbmdfYnl0ZSBuZXdfbmFtZVs4MV07IC8qIDEgYnl0ZSBmb3IgdGhlIGNvbXByZXNzaW9uIGJ5dGUgKi8KKyAgIGNvbXByZXNzaW9uX3N0YXRlIGNvbXA7CisgICBwbmdfdWludF8zMiB0ZW1wOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9pQ0NQIik7CisKKyAgIC8qIFRoZXNlIGFyZSBhbGwgaW50ZXJuYWwgcHJvYmxlbXM6IHRoZSBwcm9maWxlIHNob3VsZCBoYXZlIGJlZW4gY2hlY2tlZAorICAgICogYmVmb3JlIHdoZW4gaXQgd2FzIHN0b3JlZC4KKyAgICAqLworICAgaWYgKHByb2ZpbGUgPT0gTlVMTCkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTm8gcHJvZmlsZSBmb3IgaUNDUCBjaHVuayIpOyAvKiBpbnRlcm5hbCBlcnJvciAqLworCisgICBwcm9maWxlX2xlbiA9IHBuZ19nZXRfdWludF8zMihwcm9maWxlKTsKKworICAgaWYgKHByb2ZpbGVfbGVuIDwgMTMyKQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJQ0MgcHJvZmlsZSB0b28gc2hvcnQiKTsKKworICAgdGVtcCA9IChwbmdfdWludF8zMikgKCoocHJvZmlsZSs4KSk7CisgICBpZiAodGVtcCA+IDMgJiYgKHByb2ZpbGVfbGVuICYgMHgwMykpCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIklDQyBwcm9maWxlIGxlbmd0aCBpbnZhbGlkIChub3QgYSBtdWx0aXBsZSBvZiA0KSIpOworCisgICB7CisgICAgICBwbmdfdWludF8zMiBlbWJlZGRlZF9wcm9maWxlX2xlbiA9IHBuZ19nZXRfdWludF8zMihwcm9maWxlKTsKKworICAgICAgaWYgKHByb2ZpbGVfbGVuICE9IGVtYmVkZGVkX3Byb2ZpbGVfbGVuKQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJQcm9maWxlIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCBwcm9maWxlIik7CisgICB9CisKKyAgIG5hbWVfbGVuID0gcG5nX2NoZWNrX2tleXdvcmQocG5nX3B0ciwgbmFtZSwgbmV3X25hbWUpOworCisgICBpZiAobmFtZV9sZW4gPT0gMCkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiaUNDUDogaW52YWxpZCBrZXl3b3JkIik7CisKKyAgIG5ld19uYW1lWysrbmFtZV9sZW5dID0gUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRTsKKworICAgLyogTWFrZSBzdXJlIHdlIGluY2x1ZGUgdGhlIE5VTEwgYWZ0ZXIgdGhlIG5hbWUgYW5kIHRoZSBjb21wcmVzc2lvbiB0eXBlICovCisgICArK25hbWVfbGVuOworCisgICBwbmdfdGV4dF9jb21wcmVzc19pbml0KCZjb21wLCBwcm9maWxlLCBwcm9maWxlX2xlbik7CisKKyAgIC8qIEFsbG93IGZvciBrZXl3b3JkIHRlcm1pbmF0b3IgYW5kIGNvbXByZXNzaW9uIGJ5dGUgKi8KKyAgIGlmIChwbmdfdGV4dF9jb21wcmVzcyhwbmdfcHRyLCBwbmdfaUNDUCwgJmNvbXAsIG5hbWVfbGVuKSAhPSBaX09LKQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsIHBuZ19wdHItPnpzdHJlYW0ubXNnKTsKKworICAgcG5nX3dyaXRlX2NodW5rX2hlYWRlcihwbmdfcHRyLCBwbmdfaUNDUCwgbmFtZV9sZW4gKyBjb21wLm91dHB1dF9sZW4pOworCisgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCBuZXdfbmFtZSwgbmFtZV9sZW4pOworCisgICBwbmdfd3JpdGVfY29tcHJlc3NlZF9kYXRhX291dChwbmdfcHRyLCAmY29tcCk7CisKKyAgIHBuZ193cml0ZV9jaHVua19lbmQocG5nX3B0cik7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9zUExUX1NVUFBPUlRFRAorLyogV3JpdGUgYSBzUExUIGNodW5rICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ193cml0ZV9zUExUKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3Rfc1BMVF90cCBzcGFsZXR0ZSkKK3sKKyAgIHBuZ191aW50XzMyIG5hbWVfbGVuOworICAgcG5nX2J5dGUgbmV3X25hbWVbODBdOworICAgcG5nX2J5dGUgZW50cnlidWZbMTBdOworICAgcG5nX3NpemVfdCBlbnRyeV9zaXplID0gKHNwYWxldHRlLT5kZXB0aCA9PSA4ID8gNiA6IDEwKTsKKyAgIHBuZ19zaXplX3QgcGFsZXR0ZV9zaXplID0gZW50cnlfc2l6ZSAqIHNwYWxldHRlLT5uZW50cmllczsKKyAgIHBuZ19zUExUX2VudHJ5cCBlcDsKKyNpZm5kZWYgUE5HX1BPSU5URVJfSU5ERVhJTkdfU1VQUE9SVEVECisgICBpbnQgaTsKKyNlbmRpZgorCisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9zUExUIik7CisKKyAgIG5hbWVfbGVuID0gcG5nX2NoZWNrX2tleXdvcmQocG5nX3B0ciwgc3BhbGV0dGUtPm5hbWUsIG5ld19uYW1lKTsKKworICAgaWYgKG5hbWVfbGVuID09IDApCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInNQTFQ6IGludmFsaWQga2V5d29yZCIpOworCisgICAvKiBNYWtlIHN1cmUgd2UgaW5jbHVkZSB0aGUgTlVMTCBhZnRlciB0aGUgbmFtZSAqLworICAgcG5nX3dyaXRlX2NodW5rX2hlYWRlcihwbmdfcHRyLCBwbmdfc1BMVCwKKyAgICAgICAocG5nX3VpbnRfMzIpKG5hbWVfbGVuICsgMiArIHBhbGV0dGVfc2l6ZSkpOworCisgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCAocG5nX2J5dGVwKW5ld19uYW1lLAorICAgICAgIChwbmdfc2l6ZV90KShuYW1lX2xlbiArIDEpKTsKKworICAgcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3B0ciwgJnNwYWxldHRlLT5kZXB0aCwgKHBuZ19zaXplX3QpMSk7CisKKyAgIC8qIExvb3AgdGhyb3VnaCBlYWNoIHBhbGV0dGUgZW50cnksIHdyaXRpbmcgYXBwcm9wcmlhdGVseSAqLworI2lmZGVmIFBOR19QT0lOVEVSX0lOREVYSU5HX1NVUFBPUlRFRAorICAgZm9yIChlcCA9IHNwYWxldHRlLT5lbnRyaWVzOyBlcDxzcGFsZXR0ZS0+ZW50cmllcyArIHNwYWxldHRlLT5uZW50cmllczsgZXArKykKKyAgIHsKKyAgICAgIGlmIChzcGFsZXR0ZS0+ZGVwdGggPT0gOCkKKyAgICAgIHsKKyAgICAgICAgIGVudHJ5YnVmWzBdID0gKHBuZ19ieXRlKWVwLT5yZWQ7CisgICAgICAgICBlbnRyeWJ1ZlsxXSA9IChwbmdfYnl0ZSllcC0+Z3JlZW47CisgICAgICAgICBlbnRyeWJ1ZlsyXSA9IChwbmdfYnl0ZSllcC0+Ymx1ZTsKKyAgICAgICAgIGVudHJ5YnVmWzNdID0gKHBuZ19ieXRlKWVwLT5hbHBoYTsKKyAgICAgICAgIHBuZ19zYXZlX3VpbnRfMTYoZW50cnlidWYgKyA0LCBlcC0+ZnJlcXVlbmN5KTsKKyAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgcG5nX3NhdmVfdWludF8xNihlbnRyeWJ1ZiArIDAsIGVwLT5yZWQpOworICAgICAgICAgcG5nX3NhdmVfdWludF8xNihlbnRyeWJ1ZiArIDIsIGVwLT5ncmVlbik7CisgICAgICAgICBwbmdfc2F2ZV91aW50XzE2KGVudHJ5YnVmICsgNCwgZXAtPmJsdWUpOworICAgICAgICAgcG5nX3NhdmVfdWludF8xNihlbnRyeWJ1ZiArIDYsIGVwLT5hbHBoYSk7CisgICAgICAgICBwbmdfc2F2ZV91aW50XzE2KGVudHJ5YnVmICsgOCwgZXAtPmZyZXF1ZW5jeSk7CisgICAgICB9CisKKyAgICAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIGVudHJ5YnVmLCBlbnRyeV9zaXplKTsKKyAgIH0KKyNlbHNlCisgICBlcD1zcGFsZXR0ZS0+ZW50cmllczsKKyAgIGZvciAoaSA9IDA7IGk+c3BhbGV0dGUtPm5lbnRyaWVzOyBpKyspCisgICB7CisgICAgICBpZiAoc3BhbGV0dGUtPmRlcHRoID09IDgpCisgICAgICB7CisgICAgICAgICBlbnRyeWJ1ZlswXSA9IChwbmdfYnl0ZSllcFtpXS5yZWQ7CisgICAgICAgICBlbnRyeWJ1ZlsxXSA9IChwbmdfYnl0ZSllcFtpXS5ncmVlbjsKKyAgICAgICAgIGVudHJ5YnVmWzJdID0gKHBuZ19ieXRlKWVwW2ldLmJsdWU7CisgICAgICAgICBlbnRyeWJ1ZlszXSA9IChwbmdfYnl0ZSllcFtpXS5hbHBoYTsKKyAgICAgICAgIHBuZ19zYXZlX3VpbnRfMTYoZW50cnlidWYgKyA0LCBlcFtpXS5mcmVxdWVuY3kpOworICAgICAgfQorCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBwbmdfc2F2ZV91aW50XzE2KGVudHJ5YnVmICsgMCwgZXBbaV0ucmVkKTsKKyAgICAgICAgIHBuZ19zYXZlX3VpbnRfMTYoZW50cnlidWYgKyAyLCBlcFtpXS5ncmVlbik7CisgICAgICAgICBwbmdfc2F2ZV91aW50XzE2KGVudHJ5YnVmICsgNCwgZXBbaV0uYmx1ZSk7CisgICAgICAgICBwbmdfc2F2ZV91aW50XzE2KGVudHJ5YnVmICsgNiwgZXBbaV0uYWxwaGEpOworICAgICAgICAgcG5nX3NhdmVfdWludF8xNihlbnRyeWJ1ZiArIDgsIGVwW2ldLmZyZXF1ZW5jeSk7CisgICAgICB9CisKKyAgICAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIGVudHJ5YnVmLCBlbnRyeV9zaXplKTsKKyAgIH0KKyNlbmRpZgorCisgICBwbmdfd3JpdGVfY2h1bmtfZW5kKHBuZ19wdHIpOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfc0JJVF9TVVBQT1JURUQKKy8qIFdyaXRlIHRoZSBzQklUIGNodW5rICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ193cml0ZV9zQklUKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfY29sb3JfOHAgc2JpdCwgaW50IGNvbG9yX3R5cGUpCit7CisgICBwbmdfYnl0ZSBidWZbNF07CisgICBwbmdfc2l6ZV90IHNpemU7CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX3NCSVQiKTsKKworICAgLyogTWFrZSBzdXJlIHdlIGRvbid0IGRlcGVuZCB1cG9uIHRoZSBvcmRlciBvZiBQTkdfQ09MT1JfOCAqLworICAgaWYgKChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpICE9IDApCisgICB7CisgICAgICBwbmdfYnl0ZSBtYXhiaXRzOworCisgICAgICBtYXhiaXRzID0gKHBuZ19ieXRlKShjb2xvcl90eXBlPT1QTkdfQ09MT1JfVFlQRV9QQUxFVFRFID8gOCA6CisgICAgICAgICAgcG5nX3B0ci0+dXNyX2JpdF9kZXB0aCk7CisKKyAgICAgIGlmIChzYml0LT5yZWQgPT0gMCB8fCBzYml0LT5yZWQgPiBtYXhiaXRzIHx8CisgICAgICAgICAgc2JpdC0+Z3JlZW4gPT0gMCB8fCBzYml0LT5ncmVlbiA+IG1heGJpdHMgfHwKKyAgICAgICAgICBzYml0LT5ibHVlID09IDAgfHwgc2JpdC0+Ymx1ZSA+IG1heGJpdHMpCisgICAgICB7CisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBzQklUIGRlcHRoIHNwZWNpZmllZCIpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBidWZbMF0gPSBzYml0LT5yZWQ7CisgICAgICBidWZbMV0gPSBzYml0LT5ncmVlbjsKKyAgICAgIGJ1ZlsyXSA9IHNiaXQtPmJsdWU7CisgICAgICBzaXplID0gMzsKKyAgIH0KKworICAgZWxzZQorICAgeworICAgICAgaWYgKHNiaXQtPmdyYXkgPT0gMCB8fCBzYml0LT5ncmF5ID4gcG5nX3B0ci0+dXNyX2JpdF9kZXB0aCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIHNCSVQgZGVwdGggc3BlY2lmaWVkIik7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGJ1ZlswXSA9IHNiaXQtPmdyYXk7CisgICAgICBzaXplID0gMTsKKyAgIH0KKworICAgaWYgKChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpICE9IDApCisgICB7CisgICAgICBpZiAoc2JpdC0+YWxwaGEgPT0gMCB8fCBzYml0LT5hbHBoYSA+IHBuZ19wdHItPnVzcl9iaXRfZGVwdGgpCisgICAgICB7CisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBzQklUIGRlcHRoIHNwZWNpZmllZCIpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBidWZbc2l6ZSsrXSA9IHNiaXQtPmFscGhhOworICAgfQorCisgICBwbmdfd3JpdGVfY29tcGxldGVfY2h1bmsocG5nX3B0ciwgcG5nX3NCSVQsIGJ1Ziwgc2l6ZSk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9jSFJNX1NVUFBPUlRFRAorLyogV3JpdGUgdGhlIGNIUk0gY2h1bmsgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3dyaXRlX2NIUk1fZml4ZWQocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGNvbnN0IHBuZ194eSAqeHkpCit7CisgICBwbmdfYnl0ZSBidWZbMzJdOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9jSFJNIik7CisKKyAgIC8qIEVhY2ggdmFsdWUgaXMgc2F2ZWQgaW4gMS8xMDAsMDAwdGhzICovCisgICBwbmdfc2F2ZV9pbnRfMzIoYnVmLCAgICAgIHh5LT53aGl0ZXgpOworICAgcG5nX3NhdmVfaW50XzMyKGJ1ZiArICA0LCB4eS0+d2hpdGV5KTsKKworICAgcG5nX3NhdmVfaW50XzMyKGJ1ZiArICA4LCB4eS0+cmVkeCk7CisgICBwbmdfc2F2ZV9pbnRfMzIoYnVmICsgMTIsIHh5LT5yZWR5KTsKKworICAgcG5nX3NhdmVfaW50XzMyKGJ1ZiArIDE2LCB4eS0+Z3JlZW54KTsKKyAgIHBuZ19zYXZlX2ludF8zMihidWYgKyAyMCwgeHktPmdyZWVueSk7CisKKyAgIHBuZ19zYXZlX2ludF8zMihidWYgKyAyNCwgeHktPmJsdWV4KTsKKyAgIHBuZ19zYXZlX2ludF8zMihidWYgKyAyOCwgeHktPmJsdWV5KTsKKworICAgcG5nX3dyaXRlX2NvbXBsZXRlX2NodW5rKHBuZ19wdHIsIHBuZ19jSFJNLCBidWYsIDMyKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX3RSTlNfU1VQUE9SVEVECisvKiBXcml0ZSB0aGUgdFJOUyBjaHVuayAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfd3JpdGVfdFJOUyhwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2J5dGVwIHRyYW5zX2FscGhhLAorICAgIHBuZ19jb25zdF9jb2xvcl8xNnAgdHJhbiwgaW50IG51bV90cmFucywgaW50IGNvbG9yX3R5cGUpCit7CisgICBwbmdfYnl0ZSBidWZbNl07CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX3RSTlMiKTsKKworICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgIHsKKyAgICAgIGlmIChudW1fdHJhbnMgPD0gMCB8fCBudW1fdHJhbnMgPiAoaW50KXBuZ19wdHItPm51bV9wYWxldHRlKQorICAgICAgeworICAgICAgICAgcG5nX2FwcF93YXJuaW5nKHBuZ19wdHIsCisgICAgICAgICAgICAgIkludmFsaWQgbnVtYmVyIG9mIHRyYW5zcGFyZW50IGNvbG9ycyBzcGVjaWZpZWQiKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgLyogV3JpdGUgdGhlIGNodW5rIG91dCBhcyBpdCBpcyAqLworICAgICAgcG5nX3dyaXRlX2NvbXBsZXRlX2NodW5rKHBuZ19wdHIsIHBuZ190Uk5TLCB0cmFuc19hbHBoYSwKKyAgICAgICAgIChwbmdfc2l6ZV90KW51bV90cmFucyk7CisgICB9CisKKyAgIGVsc2UgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkKKyAgIHsKKyAgICAgIC8qIE9uZSAxNi1iaXQgdmFsdWUgKi8KKyAgICAgIGlmICh0cmFuLT5ncmF5ID49ICgxIDw8IHBuZ19wdHItPmJpdF9kZXB0aCkpCisgICAgICB7CisgICAgICAgICBwbmdfYXBwX3dhcm5pbmcocG5nX3B0ciwKKyAgICAgICAgICAgICAiSWdub3JpbmcgYXR0ZW1wdCB0byB3cml0ZSB0Uk5TIGNodW5rIG91dC1vZi1yYW5nZSBmb3IgYml0X2RlcHRoIik7CisKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgcG5nX3NhdmVfdWludF8xNihidWYsIHRyYW4tPmdyYXkpOworICAgICAgcG5nX3dyaXRlX2NvbXBsZXRlX2NodW5rKHBuZ19wdHIsIHBuZ190Uk5TLCBidWYsIChwbmdfc2l6ZV90KTIpOworICAgfQorCisgICBlbHNlIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikKKyAgIHsKKyAgICAgIC8qIFRocmVlIDE2LWJpdCB2YWx1ZXMgKi8KKyAgICAgIHBuZ19zYXZlX3VpbnRfMTYoYnVmLCB0cmFuLT5yZWQpOworICAgICAgcG5nX3NhdmVfdWludF8xNihidWYgKyAyLCB0cmFuLT5ncmVlbik7CisgICAgICBwbmdfc2F2ZV91aW50XzE2KGJ1ZiArIDQsIHRyYW4tPmJsdWUpOworI2lmZGVmIFBOR19XUklURV8xNkJJVF9TVVBQT1JURUQKKyAgICAgIGlmIChwbmdfcHRyLT5iaXRfZGVwdGggPT0gOCAmJiAoYnVmWzBdIHwgYnVmWzJdIHwgYnVmWzRdKSAhPSAwKQorI2Vsc2UKKyAgICAgIGlmICgoYnVmWzBdIHwgYnVmWzJdIHwgYnVmWzRdKSAhPSAwKQorI2VuZGlmCisgICAgICB7CisgICAgICAgICBwbmdfYXBwX3dhcm5pbmcocG5nX3B0ciwKKyAgICAgICAgICAgIklnbm9yaW5nIGF0dGVtcHQgdG8gd3JpdGUgMTYtYml0IHRSTlMgY2h1bmsgd2hlbiBiaXRfZGVwdGggaXMgOCIpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBwbmdfd3JpdGVfY29tcGxldGVfY2h1bmsocG5nX3B0ciwgcG5nX3RSTlMsIGJ1ZiwgKHBuZ19zaXplX3QpNik7CisgICB9CisKKyAgIGVsc2UKKyAgIHsKKyAgICAgIHBuZ19hcHBfd2FybmluZyhwbmdfcHRyLCAiQ2FuJ3Qgd3JpdGUgdFJOUyB3aXRoIGFuIGFscGhhIGNoYW5uZWwiKTsKKyAgIH0KK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX2JLR0RfU1VQUE9SVEVECisvKiBXcml0ZSB0aGUgYmFja2dyb3VuZCBjaHVuayAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfd3JpdGVfYktHRChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2NvbG9yXzE2cCBiYWNrLCBpbnQgY29sb3JfdHlwZSkKK3sKKyAgIHBuZ19ieXRlIGJ1Zls2XTsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfYktHRCIpOworCisgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQorICAgeworICAgICAgaWYgKAorI2lmZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVECisgICAgICAgICAgKHBuZ19wdHItPm51bV9wYWxldHRlICE9IDAgfHwKKyAgICAgICAgICAocG5nX3B0ci0+bW5nX2ZlYXR1cmVzX3Blcm1pdHRlZCAmIFBOR19GTEFHX01OR19FTVBUWV9QTFRFKSA9PSAwKSAmJgorI2VuZGlmCisgICAgICAgICBiYWNrLT5pbmRleCA+PSBwbmdfcHRyLT5udW1fcGFsZXR0ZSkKKyAgICAgIHsKKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGJhY2tncm91bmQgcGFsZXR0ZSBpbmRleCIpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBidWZbMF0gPSBiYWNrLT5pbmRleDsKKyAgICAgIHBuZ193cml0ZV9jb21wbGV0ZV9jaHVuayhwbmdfcHRyLCBwbmdfYktHRCwgYnVmLCAocG5nX3NpemVfdCkxKTsKKyAgIH0KKworICAgZWxzZSBpZiAoKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikgIT0gMCkKKyAgIHsKKyAgICAgIHBuZ19zYXZlX3VpbnRfMTYoYnVmLCBiYWNrLT5yZWQpOworICAgICAgcG5nX3NhdmVfdWludF8xNihidWYgKyAyLCBiYWNrLT5ncmVlbik7CisgICAgICBwbmdfc2F2ZV91aW50XzE2KGJ1ZiArIDQsIGJhY2stPmJsdWUpOworI2lmZGVmIFBOR19XUklURV8xNkJJVF9TVVBQT1JURUQKKyAgICAgIGlmIChwbmdfcHRyLT5iaXRfZGVwdGggPT0gOCAmJiAoYnVmWzBdIHwgYnVmWzJdIHwgYnVmWzRdKSAhPSAwKQorI2Vsc2UKKyAgICAgIGlmICgoYnVmWzBdIHwgYnVmWzJdIHwgYnVmWzRdKSAhPSAwKQorI2VuZGlmCisgICAgICB7CisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAgICAgICJJZ25vcmluZyBhdHRlbXB0IHRvIHdyaXRlIDE2LWJpdCBiS0dEIGNodW5rIHdoZW4gYml0X2RlcHRoIGlzIDgiKTsKKworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBwbmdfd3JpdGVfY29tcGxldGVfY2h1bmsocG5nX3B0ciwgcG5nX2JLR0QsIGJ1ZiwgKHBuZ19zaXplX3QpNik7CisgICB9CisKKyAgIGVsc2UKKyAgIHsKKyAgICAgIGlmIChiYWNrLT5ncmF5ID49ICgxIDw8IHBuZ19wdHItPmJpdF9kZXB0aCkpCisgICAgICB7CisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAgICAgICJJZ25vcmluZyBhdHRlbXB0IHRvIHdyaXRlIGJLR0QgY2h1bmsgb3V0LW9mLXJhbmdlIGZvciBiaXRfZGVwdGgiKTsKKworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBwbmdfc2F2ZV91aW50XzE2KGJ1ZiwgYmFjay0+Z3JheSk7CisgICAgICBwbmdfd3JpdGVfY29tcGxldGVfY2h1bmsocG5nX3B0ciwgcG5nX2JLR0QsIGJ1ZiwgKHBuZ19zaXplX3QpMik7CisgICB9Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9oSVNUX1NVUFBPUlRFRAorLyogV3JpdGUgdGhlIGhpc3RvZ3JhbSAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfd3JpdGVfaElTVChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X3VpbnRfMTZwIGhpc3QsIGludCBudW1faGlzdCkKK3sKKyAgIGludCBpOworICAgcG5nX2J5dGUgYnVmWzNdOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9oSVNUIik7CisKKyAgIGlmIChudW1faGlzdCA+IChpbnQpcG5nX3B0ci0+bnVtX3BhbGV0dGUpCisgICB7CisgICAgICBwbmdfZGVidWcyKDMsICJudW1faGlzdCA9ICVkLCBudW1fcGFsZXR0ZSA9ICVkIiwgbnVtX2hpc3QsCisgICAgICAgICAgcG5nX3B0ci0+bnVtX3BhbGV0dGUpOworCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBudW1iZXIgb2YgaGlzdG9ncmFtIGVudHJpZXMgc3BlY2lmaWVkIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIHBuZ193cml0ZV9jaHVua19oZWFkZXIocG5nX3B0ciwgcG5nX2hJU1QsIChwbmdfdWludF8zMikobnVtX2hpc3QgKiAyKSk7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBudW1faGlzdDsgaSsrKQorICAgeworICAgICAgcG5nX3NhdmVfdWludF8xNihidWYsIGhpc3RbaV0pOworICAgICAgcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3B0ciwgYnVmLCAocG5nX3NpemVfdCkyKTsKKyAgIH0KKworICAgcG5nX3dyaXRlX2NodW5rX2VuZChwbmdfcHRyKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX3RFWHRfU1VQUE9SVEVECisvKiBXcml0ZSBhIHRFWHQgY2h1bmsgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3dyaXRlX3RFWHQocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBrZXksIHBuZ19jb25zdF9jaGFycCB0ZXh0LAorICAgIHBuZ19zaXplX3QgdGV4dF9sZW4pCit7CisgICBwbmdfdWludF8zMiBrZXlfbGVuOworICAgcG5nX2J5dGUgbmV3X2tleVs4MF07CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX3RFWHQiKTsKKworICAga2V5X2xlbiA9IHBuZ19jaGVja19rZXl3b3JkKHBuZ19wdHIsIGtleSwgbmV3X2tleSk7CisKKyAgIGlmIChrZXlfbGVuID09IDApCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInRFWHQ6IGludmFsaWQga2V5d29yZCIpOworCisgICBpZiAodGV4dCA9PSBOVUxMIHx8ICp0ZXh0ID09ICdcMCcpCisgICAgICB0ZXh0X2xlbiA9IDA7CisKKyAgIGVsc2UKKyAgICAgIHRleHRfbGVuID0gc3RybGVuKHRleHQpOworCisgICBpZiAodGV4dF9sZW4gPiBQTkdfVUlOVF8zMV9NQVggLSAoa2V5X2xlbisxKSkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAidEVYdDogdGV4dCB0b28gbG9uZyIpOworCisgICAvKiBNYWtlIHN1cmUgd2UgaW5jbHVkZSB0aGUgMCBhZnRlciB0aGUga2V5ICovCisgICBwbmdfd3JpdGVfY2h1bmtfaGVhZGVyKHBuZ19wdHIsIHBuZ190RVh0LAorICAgICAgIChwbmdfdWludF8zMikvKmNoZWNrZWQgYWJvdmUqLyhrZXlfbGVuICsgdGV4dF9sZW4gKyAxKSk7CisgICAvKgorICAgICogV2UgbGVhdmUgaXQgdG8gdGhlIGFwcGxpY2F0aW9uIHRvIG1lZXQgUE5HLTEuMCByZXF1aXJlbWVudHMgb24gdGhlCisgICAgKiBjb250ZW50cyBvZiB0aGUgdGV4dC4gIFBORy0xLjAgdGhyb3VnaCBQTkctMS4yIGRpc2NvdXJhZ2UgdGhlIHVzZSBvZgorICAgICogYW55IG5vbi1MYXRpbi0xIGNoYXJhY3RlcnMgZXhjZXB0IGZvciBORVdMSU5FLiAgSVNPIFBORyB3aWxsIGZvcmJpZCB0aGVtLgorICAgICogVGhlIE5VTCBjaGFyYWN0ZXIgaXMgZm9yYmlkZGVuIGJ5IFBORy0xLjAgdGhyb3VnaCBQTkctMS4yIGFuZCBJU08gUE5HLgorICAgICovCisgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCBuZXdfa2V5LCBrZXlfbGVuICsgMSk7CisKKyAgIGlmICh0ZXh0X2xlbiAhPSAwKQorICAgICAgcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3B0ciwgKHBuZ19jb25zdF9ieXRlcCl0ZXh0LCB0ZXh0X2xlbik7CisKKyAgIHBuZ193cml0ZV9jaHVua19lbmQocG5nX3B0cik7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV96VFh0X1NVUFBPUlRFRAorLyogV3JpdGUgYSBjb21wcmVzc2VkIHRleHQgY2h1bmsgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3dyaXRlX3pUWHQocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBrZXksIHBuZ19jb25zdF9jaGFycCB0ZXh0LAorICAgIGludCBjb21wcmVzc2lvbikKK3sKKyAgIHBuZ191aW50XzMyIGtleV9sZW47CisgICBwbmdfYnl0ZSBuZXdfa2V5WzgxXTsKKyAgIGNvbXByZXNzaW9uX3N0YXRlIGNvbXA7CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX3pUWHQiKTsKKworICAgaWYgKGNvbXByZXNzaW9uID09IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUpCisgICB7CisgICAgICBwbmdfd3JpdGVfdEVYdChwbmdfcHRyLCBrZXksIHRleHQsIDApOworICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiAoY29tcHJlc3Npb24gIT0gUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdCkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAielRYdDogaW52YWxpZCBjb21wcmVzc2lvbiB0eXBlIik7CisKKyAgIGtleV9sZW4gPSBwbmdfY2hlY2tfa2V5d29yZChwbmdfcHRyLCBrZXksIG5ld19rZXkpOworCisgICBpZiAoa2V5X2xlbiA9PSAwKQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJ6VFh0OiBpbnZhbGlkIGtleXdvcmQiKTsKKworICAgLyogQWRkIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgYW5kIDEgZm9yIHRoZSBrZXl3b3JkIHNlcGFyYXRvci4gKi8KKyAgIG5ld19rZXlbKytrZXlfbGVuXSA9IFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0U7CisgICArK2tleV9sZW47CisKKyAgIC8qIENvbXB1dGUgdGhlIGNvbXByZXNzZWQgZGF0YTsgZG8gaXQgbm93IGZvciB0aGUgbGVuZ3RoICovCisgICBwbmdfdGV4dF9jb21wcmVzc19pbml0KCZjb21wLCAocG5nX2NvbnN0X2J5dGVwKXRleHQsCisgICAgICB0ZXh0ID09IE5VTEwgPyAwIDogc3RybGVuKHRleHQpKTsKKworICAgaWYgKHBuZ190ZXh0X2NvbXByZXNzKHBuZ19wdHIsIHBuZ196VFh0LCAmY29tcCwga2V5X2xlbikgIT0gWl9PSykKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCBwbmdfcHRyLT56c3RyZWFtLm1zZyk7CisKKyAgIC8qIFdyaXRlIHN0YXJ0IG9mIGNodW5rICovCisgICBwbmdfd3JpdGVfY2h1bmtfaGVhZGVyKHBuZ19wdHIsIHBuZ196VFh0LCBrZXlfbGVuICsgY29tcC5vdXRwdXRfbGVuKTsKKworICAgLyogV3JpdGUga2V5ICovCisgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCBuZXdfa2V5LCBrZXlfbGVuKTsKKworICAgLyogV3JpdGUgdGhlIGNvbXByZXNzZWQgZGF0YSAqLworICAgcG5nX3dyaXRlX2NvbXByZXNzZWRfZGF0YV9vdXQocG5nX3B0ciwgJmNvbXApOworCisgICAvKiBDbG9zZSB0aGUgY2h1bmsgKi8KKyAgIHBuZ193cml0ZV9jaHVua19lbmQocG5nX3B0cik7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9pVFh0X1NVUFBPUlRFRAorLyogV3JpdGUgYW4gaVRYdCBjaHVuayAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfd3JpdGVfaVRYdChwbmdfc3RydWN0cnAgcG5nX3B0ciwgaW50IGNvbXByZXNzaW9uLCBwbmdfY29uc3RfY2hhcnAga2V5LAorICAgIHBuZ19jb25zdF9jaGFycCBsYW5nLCBwbmdfY29uc3RfY2hhcnAgbGFuZ19rZXksIHBuZ19jb25zdF9jaGFycCB0ZXh0KQoreworICAgcG5nX3VpbnRfMzIga2V5X2xlbiwgcHJlZml4X2xlbjsKKyAgIHBuZ19zaXplX3QgbGFuZ19sZW4sIGxhbmdfa2V5X2xlbjsKKyAgIHBuZ19ieXRlIG5ld19rZXlbODJdOworICAgY29tcHJlc3Npb25fc3RhdGUgY29tcDsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfaVRYdCIpOworCisgICBrZXlfbGVuID0gcG5nX2NoZWNrX2tleXdvcmQocG5nX3B0ciwga2V5LCBuZXdfa2V5KTsKKworICAgaWYgKGtleV9sZW4gPT0gMCkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiaVRYdDogaW52YWxpZCBrZXl3b3JkIik7CisKKyAgIC8qIFNldCB0aGUgY29tcHJlc3Npb24gZmxhZyAqLworICAgc3dpdGNoIChjb21wcmVzc2lvbikKKyAgIHsKKyAgICAgIGNhc2UgUE5HX0lUWFRfQ09NUFJFU1NJT05fTk9ORToKKyAgICAgIGNhc2UgUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORToKKyAgICAgICAgIGNvbXByZXNzaW9uID0gbmV3X2tleVsrK2tleV9sZW5dID0gMDsgLyogbm8gY29tcHJlc3Npb24gKi8KKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQ6CisgICAgICBjYXNlIFBOR19JVFhUX0NPTVBSRVNTSU9OX3pUWHQ6CisgICAgICAgICBjb21wcmVzc2lvbiA9IG5ld19rZXlbKytrZXlfbGVuXSA9IDE7IC8qIGNvbXByZXNzZWQgKi8KKyAgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJpVFh0OiBpbnZhbGlkIGNvbXByZXNzaW9uIik7CisgICB9CisKKyAgIG5ld19rZXlbKytrZXlfbGVuXSA9IFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0U7CisgICArK2tleV9sZW47IC8qIGZvciB0aGUga2V5d29kIHNlcGFyYXRvciAqLworCisgICAvKiBXZSBsZWF2ZSBpdCB0byB0aGUgYXBwbGljYXRpb24gdG8gbWVldCBQTkctMS4wIHJlcXVpcmVtZW50cyBvbiB0aGUKKyAgICAqIGNvbnRlbnRzIG9mIHRoZSB0ZXh0LiAgUE5HLTEuMCB0aHJvdWdoIFBORy0xLjIgZGlzY291cmFnZSB0aGUgdXNlIG9mCisgICAgKiBhbnkgbm9uLUxhdGluLTEgY2hhcmFjdGVycyBleGNlcHQgZm9yIE5FV0xJTkUuICBJU08gUE5HLCBob3dldmVyLAorICAgICogc3BlY2lmaWVzIHRoYXQgdGhlIHRleHQgaXMgVVRGLTggYW5kIHRoaXMgcmVhbGx5IGRvZXNuJ3QgcmVxdWlyZSBhbnkKKyAgICAqIGNoZWNraW5nLgorICAgICoKKyAgICAqIFRoZSBOVUwgY2hhcmFjdGVyIGlzIGZvcmJpZGRlbiBieSBQTkctMS4wIHRocm91Z2ggUE5HLTEuMiBhbmQgSVNPIFBORy4KKyAgICAqCisgICAgKiBUT0RPOiB2YWxpZGF0ZSB0aGUgbGFuZ3VhZ2UgdGFnIGNvcnJlY3RseSAoc2VlIHRoZSBzcGVjLikKKyAgICAqLworICAgaWYgKGxhbmcgPT0gTlVMTCkgbGFuZyA9ICIiOyAvKiBlbXB0eSBsYW5ndWFnZSBpcyB2YWxpZCAqLworICAgbGFuZ19sZW4gPSBzdHJsZW4obGFuZykrMTsKKyAgIGlmIChsYW5nX2tleSA9PSBOVUxMKSBsYW5nX2tleSA9ICIiOyAvKiBtYXkgYmUgZW1wdHkgKi8KKyAgIGxhbmdfa2V5X2xlbiA9IHN0cmxlbihsYW5nX2tleSkrMTsKKyAgIGlmICh0ZXh0ID09IE5VTEwpIHRleHQgPSAiIjsgLyogbWF5IGJlIGVtcHR5ICovCisKKyAgIHByZWZpeF9sZW4gPSBrZXlfbGVuOworICAgaWYgKGxhbmdfbGVuID4gUE5HX1VJTlRfMzFfTUFYLXByZWZpeF9sZW4pCisgICAgICBwcmVmaXhfbGVuID0gUE5HX1VJTlRfMzFfTUFYOworICAgZWxzZQorICAgICAgcHJlZml4X2xlbiA9IChwbmdfdWludF8zMikocHJlZml4X2xlbiArIGxhbmdfbGVuKTsKKworICAgaWYgKGxhbmdfa2V5X2xlbiA+IFBOR19VSU5UXzMxX01BWC1wcmVmaXhfbGVuKQorICAgICAgcHJlZml4X2xlbiA9IFBOR19VSU5UXzMxX01BWDsKKyAgIGVsc2UKKyAgICAgIHByZWZpeF9sZW4gPSAocG5nX3VpbnRfMzIpKHByZWZpeF9sZW4gKyBsYW5nX2tleV9sZW4pOworCisgICBwbmdfdGV4dF9jb21wcmVzc19pbml0KCZjb21wLCAocG5nX2NvbnN0X2J5dGVwKXRleHQsIHN0cmxlbih0ZXh0KSk7CisKKyAgIGlmIChjb21wcmVzc2lvbiAhPSAwKQorICAgeworICAgICAgaWYgKHBuZ190ZXh0X2NvbXByZXNzKHBuZ19wdHIsIHBuZ19pVFh0LCAmY29tcCwgcHJlZml4X2xlbikgIT0gWl9PSykKKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCBwbmdfcHRyLT56c3RyZWFtLm1zZyk7CisgICB9CisKKyAgIGVsc2UKKyAgIHsKKyAgICAgIGlmIChjb21wLmlucHV0X2xlbiA+IFBOR19VSU5UXzMxX01BWC1wcmVmaXhfbGVuKQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJpVFh0OiB1bmNvbXByZXNzZWQgdGV4dCB0b28gbG9uZyIpOworCisgICAgICAvKiBTbyB0aGUgc3RyaW5nIHdpbGwgZml0IGluIGEgY2h1bms6ICovCisgICAgICBjb21wLm91dHB1dF9sZW4gPSAocG5nX3VpbnRfMzIpLypTQUZFKi9jb21wLmlucHV0X2xlbjsKKyAgIH0KKworICAgcG5nX3dyaXRlX2NodW5rX2hlYWRlcihwbmdfcHRyLCBwbmdfaVRYdCwgY29tcC5vdXRwdXRfbGVuICsgcHJlZml4X2xlbik7CisKKyAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIG5ld19rZXksIGtleV9sZW4pOworCisgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCAocG5nX2NvbnN0X2J5dGVwKWxhbmcsIGxhbmdfbGVuKTsKKworICAgcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3B0ciwgKHBuZ19jb25zdF9ieXRlcClsYW5nX2tleSwgbGFuZ19rZXlfbGVuKTsKKworICAgaWYgKGNvbXByZXNzaW9uICE9IDApCisgICAgICBwbmdfd3JpdGVfY29tcHJlc3NlZF9kYXRhX291dChwbmdfcHRyLCAmY29tcCk7CisKKyAgIGVsc2UKKyAgICAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIChwbmdfY29uc3RfYnl0ZXApdGV4dCwgY29tcC5vdXRwdXRfbGVuKTsKKworICAgcG5nX3dyaXRlX2NodW5rX2VuZChwbmdfcHRyKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX29GRnNfU1VQUE9SVEVECisvKiBXcml0ZSB0aGUgb0ZGcyBjaHVuayAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfd3JpdGVfb0ZGcyhwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2ludF8zMiB4X29mZnNldCwgcG5nX2ludF8zMiB5X29mZnNldCwKKyAgICBpbnQgdW5pdF90eXBlKQoreworICAgcG5nX2J5dGUgYnVmWzldOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9vRkZzIik7CisKKyAgIGlmICh1bml0X3R5cGUgPj0gUE5HX09GRlNFVF9MQVNUKQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVucmVjb2duaXplZCB1bml0IHR5cGUgZm9yIG9GRnMgY2h1bmsiKTsKKworICAgcG5nX3NhdmVfaW50XzMyKGJ1ZiwgeF9vZmZzZXQpOworICAgcG5nX3NhdmVfaW50XzMyKGJ1ZiArIDQsIHlfb2Zmc2V0KTsKKyAgIGJ1Zls4XSA9IChwbmdfYnl0ZSl1bml0X3R5cGU7CisKKyAgIHBuZ193cml0ZV9jb21wbGV0ZV9jaHVuayhwbmdfcHRyLCBwbmdfb0ZGcywgYnVmLCAocG5nX3NpemVfdCk5KTsKK30KKyNlbmRpZgorI2lmZGVmIFBOR19XUklURV9wQ0FMX1NVUFBPUlRFRAorLyogV3JpdGUgdGhlIHBDQUwgY2h1bmsgKGRlc2NyaWJlZCBpbiB0aGUgUE5HIGV4dGVuc2lvbnMgZG9jdW1lbnQpICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ193cml0ZV9wQ0FMKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY2hhcnAgcHVycG9zZSwgcG5nX2ludF8zMiBYMCwKKyAgICBwbmdfaW50XzMyIFgxLCBpbnQgdHlwZSwgaW50IG5wYXJhbXMsIHBuZ19jb25zdF9jaGFycCB1bml0cywKKyAgICBwbmdfY2hhcnBwIHBhcmFtcykKK3sKKyAgIHBuZ191aW50XzMyIHB1cnBvc2VfbGVuOworICAgcG5nX3NpemVfdCB1bml0c19sZW4sIHRvdGFsX2xlbjsKKyAgIHBuZ19zaXplX3RwIHBhcmFtc19sZW47CisgICBwbmdfYnl0ZSBidWZbMTBdOworICAgcG5nX2J5dGUgbmV3X3B1cnBvc2VbODBdOworICAgaW50IGk7CisKKyAgIHBuZ19kZWJ1ZzEoMSwgImluIHBuZ193cml0ZV9wQ0FMICglZCBwYXJhbWV0ZXJzKSIsIG5wYXJhbXMpOworCisgICBpZiAodHlwZSA+PSBQTkdfRVFVQVRJT05fTEFTVCkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiVW5yZWNvZ25pemVkIGVxdWF0aW9uIHR5cGUgZm9yIHBDQUwgY2h1bmsiKTsKKworICAgcHVycG9zZV9sZW4gPSBwbmdfY2hlY2tfa2V5d29yZChwbmdfcHRyLCBwdXJwb3NlLCBuZXdfcHVycG9zZSk7CisKKyAgIGlmIChwdXJwb3NlX2xlbiA9PSAwKQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJwQ0FMOiBpbnZhbGlkIGtleXdvcmQiKTsKKworICAgKytwdXJwb3NlX2xlbjsgLyogdGVybWluYXRvciAqLworCisgICBwbmdfZGVidWcxKDMsICJwQ0FMIHB1cnBvc2UgbGVuZ3RoID0gJWQiLCAoaW50KXB1cnBvc2VfbGVuKTsKKyAgIHVuaXRzX2xlbiA9IHN0cmxlbih1bml0cykgKyAobnBhcmFtcyA9PSAwID8gMCA6IDEpOworICAgcG5nX2RlYnVnMSgzLCAicENBTCB1bml0cyBsZW5ndGggPSAlZCIsIChpbnQpdW5pdHNfbGVuKTsKKyAgIHRvdGFsX2xlbiA9IHB1cnBvc2VfbGVuICsgdW5pdHNfbGVuICsgMTA7CisKKyAgIHBhcmFtc19sZW4gPSAocG5nX3NpemVfdHApcG5nX21hbGxvYyhwbmdfcHRyLAorICAgICAgIChwbmdfYWxsb2Nfc2l6ZV90KShucGFyYW1zICogKHNpemVvZiAocG5nX3NpemVfdCkpKSk7CisKKyAgIC8qIEZpbmQgdGhlIGxlbmd0aCBvZiBlYWNoIHBhcmFtZXRlciwgbWFraW5nIHN1cmUgd2UgZG9uJ3QgY291bnQgdGhlCisgICAgKiBudWxsIHRlcm1pbmF0b3IgZm9yIHRoZSBsYXN0IHBhcmFtZXRlci4KKyAgICAqLworICAgZm9yIChpID0gMDsgaSA8IG5wYXJhbXM7IGkrKykKKyAgIHsKKyAgICAgIHBhcmFtc19sZW5baV0gPSBzdHJsZW4ocGFyYW1zW2ldKSArIChpID09IG5wYXJhbXMgLSAxID8gMCA6IDEpOworICAgICAgcG5nX2RlYnVnMigzLCAicENBTCBwYXJhbWV0ZXIgJWQgbGVuZ3RoID0gJWx1IiwgaSwKKyAgICAgICAgICAodW5zaWduZWQgbG9uZylwYXJhbXNfbGVuW2ldKTsKKyAgICAgIHRvdGFsX2xlbiArPSBwYXJhbXNfbGVuW2ldOworICAgfQorCisgICBwbmdfZGVidWcxKDMsICJwQ0FMIHRvdGFsIGxlbmd0aCA9ICVkIiwgKGludCl0b3RhbF9sZW4pOworICAgcG5nX3dyaXRlX2NodW5rX2hlYWRlcihwbmdfcHRyLCBwbmdfcENBTCwgKHBuZ191aW50XzMyKXRvdGFsX2xlbik7CisgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCBuZXdfcHVycG9zZSwgcHVycG9zZV9sZW4pOworICAgcG5nX3NhdmVfaW50XzMyKGJ1ZiwgWDApOworICAgcG5nX3NhdmVfaW50XzMyKGJ1ZiArIDQsIFgxKTsKKyAgIGJ1Zls4XSA9IChwbmdfYnl0ZSl0eXBlOworICAgYnVmWzldID0gKHBuZ19ieXRlKW5wYXJhbXM7CisgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCBidWYsIChwbmdfc2l6ZV90KTEwKTsKKyAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIChwbmdfY29uc3RfYnl0ZXApdW5pdHMsIChwbmdfc2l6ZV90KXVuaXRzX2xlbik7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBucGFyYW1zOyBpKyspCisgICB7CisgICAgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCAocG5nX2NvbnN0X2J5dGVwKXBhcmFtc1tpXSwgcGFyYW1zX2xlbltpXSk7CisgICB9CisKKyAgIHBuZ19mcmVlKHBuZ19wdHIsIHBhcmFtc19sZW4pOworICAgcG5nX3dyaXRlX2NodW5rX2VuZChwbmdfcHRyKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX3NDQUxfU1VQUE9SVEVECisvKiBXcml0ZSB0aGUgc0NBTCBjaHVuayAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfd3JpdGVfc0NBTF9zKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgdW5pdCwgcG5nX2NvbnN0X2NoYXJwIHdpZHRoLAorICAgIHBuZ19jb25zdF9jaGFycCBoZWlnaHQpCit7CisgICBwbmdfYnl0ZSBidWZbNjRdOworICAgcG5nX3NpemVfdCB3bGVuLCBobGVuLCB0b3RhbF9sZW47CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX3NDQUxfcyIpOworCisgICB3bGVuID0gc3RybGVuKHdpZHRoKTsKKyAgIGhsZW4gPSBzdHJsZW4oaGVpZ2h0KTsKKyAgIHRvdGFsX2xlbiA9IHdsZW4gKyBobGVuICsgMjsKKworICAgaWYgKHRvdGFsX2xlbiA+IDY0KQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkNhbid0IHdyaXRlIHNDQUwgKGJ1ZmZlciB0b28gc21hbGwpIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGJ1ZlswXSA9IChwbmdfYnl0ZSl1bml0OworICAgbWVtY3B5KGJ1ZiArIDEsIHdpZHRoLCB3bGVuICsgMSk7ICAgICAgLyogQXBwZW5kIHRoZSAnXDAnIGhlcmUgKi8KKyAgIG1lbWNweShidWYgKyB3bGVuICsgMiwgaGVpZ2h0LCBobGVuKTsgIC8qIERvIE5PVCBhcHBlbmQgdGhlICdcMCcgaGVyZSAqLworCisgICBwbmdfZGVidWcxKDMsICJzQ0FMIHRvdGFsIGxlbmd0aCA9ICV1IiwgKHVuc2lnbmVkIGludCl0b3RhbF9sZW4pOworICAgcG5nX3dyaXRlX2NvbXBsZXRlX2NodW5rKHBuZ19wdHIsIHBuZ19zQ0FMLCBidWYsIHRvdGFsX2xlbik7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9wSFlzX1NVUFBPUlRFRAorLyogV3JpdGUgdGhlIHBIWXMgY2h1bmsgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3dyaXRlX3BIWXMocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ191aW50XzMyIHhfcGl4ZWxzX3Blcl91bml0LAorICAgIHBuZ191aW50XzMyIHlfcGl4ZWxzX3Blcl91bml0LAorICAgIGludCB1bml0X3R5cGUpCit7CisgICBwbmdfYnl0ZSBidWZbOV07CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX3BIWXMiKTsKKworICAgaWYgKHVuaXRfdHlwZSA+PSBQTkdfUkVTT0xVVElPTl9MQVNUKQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVucmVjb2duaXplZCB1bml0IHR5cGUgZm9yIHBIWXMgY2h1bmsiKTsKKworICAgcG5nX3NhdmVfdWludF8zMihidWYsIHhfcGl4ZWxzX3Blcl91bml0KTsKKyAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmICsgNCwgeV9waXhlbHNfcGVyX3VuaXQpOworICAgYnVmWzhdID0gKHBuZ19ieXRlKXVuaXRfdHlwZTsKKworICAgcG5nX3dyaXRlX2NvbXBsZXRlX2NodW5rKHBuZ19wdHIsIHBuZ19wSFlzLCBidWYsIChwbmdfc2l6ZV90KTkpOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfdElNRV9TVVBQT1JURUQKKy8qIFdyaXRlIHRoZSB0SU1FIGNodW5rLiAgVXNlIGVpdGhlciBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSgpCisgKiBvciBwbmdfY29udmVydF9mcm9tX3RpbWVfdCgpLCBvciBmaWxsIGluIHRoZSBzdHJ1Y3R1cmUgeW91cnNlbGYuCisgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3dyaXRlX3RJTUUocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF90aW1lcCBtb2RfdGltZSkKK3sKKyAgIHBuZ19ieXRlIGJ1Zls3XTsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfdElNRSIpOworCisgICBpZiAobW9kX3RpbWUtPm1vbnRoICA+IDEyIHx8IG1vZF90aW1lLT5tb250aCAgPCAxIHx8CisgICAgICAgbW9kX3RpbWUtPmRheSAgICA+IDMxIHx8IG1vZF90aW1lLT5kYXkgICAgPCAxIHx8CisgICAgICAgbW9kX3RpbWUtPmhvdXIgICA+IDIzIHx8IG1vZF90aW1lLT5zZWNvbmQgPiA2MCkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIHRpbWUgc3BlY2lmaWVkIGZvciB0SU1FIGNodW5rIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIHBuZ19zYXZlX3VpbnRfMTYoYnVmLCBtb2RfdGltZS0+eWVhcik7CisgICBidWZbMl0gPSBtb2RfdGltZS0+bW9udGg7CisgICBidWZbM10gPSBtb2RfdGltZS0+ZGF5OworICAgYnVmWzRdID0gbW9kX3RpbWUtPmhvdXI7CisgICBidWZbNV0gPSBtb2RfdGltZS0+bWludXRlOworICAgYnVmWzZdID0gbW9kX3RpbWUtPnNlY29uZDsKKworICAgcG5nX3dyaXRlX2NvbXBsZXRlX2NodW5rKHBuZ19wdHIsIHBuZ190SU1FLCBidWYsIChwbmdfc2l6ZV90KTcpOworfQorI2VuZGlmCisKKy8qIEluaXRpYWxpemVzIHRoZSByb3cgd3JpdGluZyBjYXBhYmlsaXR5IG9mIGxpYnBuZyAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfd3JpdGVfc3RhcnRfcm93KHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQoreworI2lmZGVmIFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQKKyAgIC8qIEFycmF5cyB0byBmYWNpbGl0YXRlIGVhc3kgaW50ZXJsYWNpbmcgLSB1c2UgcGFzcyAoMCAtIDYpIGFzIGluZGV4ICovCisKKyAgIC8qIFN0YXJ0IG9mIGludGVybGFjZSBibG9jayAqLworICAgc3RhdGljIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfcGFzc19zdGFydFs3XSA9IHswLCA0LCAwLCAyLCAwLCAxLCAwfTsKKworICAgLyogT2Zmc2V0IHRvIG5leHQgaW50ZXJsYWNlIGJsb2NrICovCisgICBzdGF0aWMgUE5HX0NPTlNUIHBuZ19ieXRlIHBuZ19wYXNzX2luY1s3XSA9IHs4LCA4LCA0LCA0LCAyLCAyLCAxfTsKKworICAgLyogU3RhcnQgb2YgaW50ZXJsYWNlIGJsb2NrIGluIHRoZSB5IGRpcmVjdGlvbiAqLworICAgc3RhdGljIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfcGFzc195c3RhcnRbN10gPSB7MCwgMCwgNCwgMCwgMiwgMCwgMX07CisKKyAgIC8qIE9mZnNldCB0byBuZXh0IGludGVybGFjZSBibG9jayBpbiB0aGUgeSBkaXJlY3Rpb24gKi8KKyAgIHN0YXRpYyBQTkdfQ09OU1QgcG5nX2J5dGUgcG5nX3Bhc3NfeWluY1s3XSA9IHs4LCA4LCA4LCA0LCA0LCAyLCAyfTsKKyNlbmRpZgorCisgICBwbmdfYWxsb2Nfc2l6ZV90IGJ1Zl9zaXplOworICAgaW50IHVzcl9waXhlbF9kZXB0aDsKKworI2lmZGVmIFBOR19XUklURV9GSUxURVJfU1VQUE9SVEVECisgICBwbmdfYnl0ZSBmaWx0ZXJzOworI2VuZGlmCisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX3N0YXJ0X3JvdyIpOworCisgICB1c3JfcGl4ZWxfZGVwdGggPSBwbmdfcHRyLT51c3JfY2hhbm5lbHMgKiBwbmdfcHRyLT51c3JfYml0X2RlcHRoOworICAgYnVmX3NpemUgPSBQTkdfUk9XQllURVModXNyX3BpeGVsX2RlcHRoLCBwbmdfcHRyLT53aWR0aCkgKyAxOworCisgICAvKiAxLjUuNjogYWRkZWQgdG8gYWxsb3cgY2hlY2tpbmcgaW4gdGhlIHJvdyB3cml0ZSBjb2RlLiAqLworICAgcG5nX3B0ci0+dHJhbnNmb3JtZWRfcGl4ZWxfZGVwdGggPSBwbmdfcHRyLT5waXhlbF9kZXB0aDsKKyAgIHBuZ19wdHItPm1heGltdW1fcGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpdXNyX3BpeGVsX2RlcHRoOworCisgICAvKiBTZXQgdXAgcm93IGJ1ZmZlciAqLworICAgcG5nX3B0ci0+cm93X2J1ZiA9IHBuZ192b2lkY2FzdChwbmdfYnl0ZXAsIHBuZ19tYWxsb2MocG5nX3B0ciwgYnVmX3NpemUpKTsKKworICAgcG5nX3B0ci0+cm93X2J1ZlswXSA9IFBOR19GSUxURVJfVkFMVUVfTk9ORTsKKworI2lmZGVmIFBOR19XUklURV9GSUxURVJfU1VQUE9SVEVECisgICBmaWx0ZXJzID0gcG5nX3B0ci0+ZG9fZmlsdGVyOworCisgICBpZiAocG5nX3B0ci0+aGVpZ2h0ID09IDEpCisgICAgICBmaWx0ZXJzICY9IDB4ZmYgJiB+KFBOR19GSUxURVJfVVB8UE5HX0ZJTFRFUl9BVkd8UE5HX0ZJTFRFUl9QQUVUSCk7CisKKyAgIGlmIChwbmdfcHRyLT53aWR0aCA9PSAxKQorICAgICAgZmlsdGVycyAmPSAweGZmICYgfihQTkdfRklMVEVSX1NVQnxQTkdfRklMVEVSX0FWR3xQTkdfRklMVEVSX1BBRVRIKTsKKworICAgaWYgKGZpbHRlcnMgPT0gMCkKKyAgICAgIGZpbHRlcnMgPSBQTkdfRklMVEVSX05PTkU7CisKKyAgIHBuZ19wdHItPmRvX2ZpbHRlciA9IGZpbHRlcnM7CisKKyAgIGlmICgoKGZpbHRlcnMgJiAoUE5HX0ZJTFRFUl9TVUIgfCBQTkdfRklMVEVSX1VQIHwgUE5HX0ZJTFRFUl9BVkcgfAorICAgICAgIFBOR19GSUxURVJfUEFFVEgpKSAhPSAwKSAmJiBwbmdfcHRyLT50cnlfcm93ID09IE5VTEwpCisgICB7CisgICAgICBpbnQgbnVtX2ZpbHRlcnMgPSAwOworCisgICAgICBwbmdfcHRyLT50cnlfcm93ID0gcG5nX3ZvaWRjYXN0KHBuZ19ieXRlcCwgcG5nX21hbGxvYyhwbmdfcHRyLCBidWZfc2l6ZSkpOworCisgICAgICBpZiAoZmlsdGVycyAmIFBOR19GSUxURVJfU1VCKQorICAgICAgICAgbnVtX2ZpbHRlcnMrKzsKKworICAgICAgaWYgKGZpbHRlcnMgJiBQTkdfRklMVEVSX1VQKQorICAgICAgICAgbnVtX2ZpbHRlcnMrKzsKKworICAgICAgaWYgKGZpbHRlcnMgJiBQTkdfRklMVEVSX0FWRykKKyAgICAgICAgIG51bV9maWx0ZXJzKys7CisKKyAgICAgIGlmIChmaWx0ZXJzICYgUE5HX0ZJTFRFUl9QQUVUSCkKKyAgICAgICAgIG51bV9maWx0ZXJzKys7CisKKyAgICAgIGlmIChudW1fZmlsdGVycyA+IDEpCisgICAgICAgICBwbmdfcHRyLT50c3Rfcm93ID0gcG5nX3ZvaWRjYXN0KHBuZ19ieXRlcCwgcG5nX21hbGxvYyhwbmdfcHRyLAorICAgICAgICAgICAgIGJ1Zl9zaXplKSk7CisgICB9CisKKyAgIC8qIFdlIG9ubHkgbmVlZCB0byBrZWVwIHRoZSBwcmV2aW91cyByb3cgaWYgd2UgYXJlIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nCisgICAgKiBmaWx0ZXJzLgorICAgICovCisgICBpZiAoKGZpbHRlcnMgJiAoUE5HX0ZJTFRFUl9BVkcgfCBQTkdfRklMVEVSX1VQIHwgUE5HX0ZJTFRFUl9QQUVUSCkpICE9IDApCisgICAgICBwbmdfcHRyLT5wcmV2X3JvdyA9IHBuZ192b2lkY2FzdChwbmdfYnl0ZXAsCisgICAgICAgICBwbmdfY2FsbG9jKHBuZ19wdHIsIGJ1Zl9zaXplKSk7CisjZW5kaWYgLyogV1JJVEVfRklMVEVSICovCisKKyNpZmRlZiBQTkdfV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVECisgICAvKiBJZiBpbnRlcmxhY2VkLCB3ZSBuZWVkIHRvIHNldCB1cCB3aWR0aCBhbmQgaGVpZ2h0IG9mIHBhc3MgKi8KKyAgIGlmIChwbmdfcHRyLT5pbnRlcmxhY2VkICE9IDApCisgICB7CisgICAgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlRFUkxBQ0UpID09IDApCisgICAgICB7CisgICAgICAgICBwbmdfcHRyLT5udW1fcm93cyA9IChwbmdfcHRyLT5oZWlnaHQgKyBwbmdfcGFzc195aW5jWzBdIC0gMSAtCisgICAgICAgICAgICAgcG5nX3Bhc3NfeXN0YXJ0WzBdKSAvIHBuZ19wYXNzX3lpbmNbMF07CisKKyAgICAgICAgIHBuZ19wdHItPnVzcl93aWR0aCA9IChwbmdfcHRyLT53aWR0aCArIHBuZ19wYXNzX2luY1swXSAtIDEgLQorICAgICAgICAgICAgIHBuZ19wYXNzX3N0YXJ0WzBdKSAvIHBuZ19wYXNzX2luY1swXTsKKyAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgcG5nX3B0ci0+bnVtX3Jvd3MgPSBwbmdfcHRyLT5oZWlnaHQ7CisgICAgICAgICBwbmdfcHRyLT51c3Jfd2lkdGggPSBwbmdfcHRyLT53aWR0aDsKKyAgICAgIH0KKyAgIH0KKworICAgZWxzZQorI2VuZGlmCisgICB7CisgICAgICBwbmdfcHRyLT5udW1fcm93cyA9IHBuZ19wdHItPmhlaWdodDsKKyAgICAgIHBuZ19wdHItPnVzcl93aWR0aCA9IHBuZ19wdHItPndpZHRoOworICAgfQorfQorCisvKiBJbnRlcm5hbCB1c2Ugb25seS4gIENhbGxlZCB3aGVuIGZpbmlzaGVkIHByb2Nlc3NpbmcgYSByb3cgb2YgZGF0YS4gKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3dyaXRlX2ZpbmlzaF9yb3cocG5nX3N0cnVjdHJwIHBuZ19wdHIpCit7CisjaWZkZWYgUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAorICAgLyogQXJyYXlzIHRvIGZhY2lsaXRhdGUgZWFzeSBpbnRlcmxhY2luZyAtIHVzZSBwYXNzICgwIC0gNikgYXMgaW5kZXggKi8KKworICAgLyogU3RhcnQgb2YgaW50ZXJsYWNlIGJsb2NrICovCisgICBzdGF0aWMgUE5HX0NPTlNUIHBuZ19ieXRlIHBuZ19wYXNzX3N0YXJ0WzddID0gezAsIDQsIDAsIDIsIDAsIDEsIDB9OworCisgICAvKiBPZmZzZXQgdG8gbmV4dCBpbnRlcmxhY2UgYmxvY2sgKi8KKyAgIHN0YXRpYyBQTkdfQ09OU1QgcG5nX2J5dGUgcG5nX3Bhc3NfaW5jWzddID0gezgsIDgsIDQsIDQsIDIsIDIsIDF9OworCisgICAvKiBTdGFydCBvZiBpbnRlcmxhY2UgYmxvY2sgaW4gdGhlIHkgZGlyZWN0aW9uICovCisgICBzdGF0aWMgUE5HX0NPTlNUIHBuZ19ieXRlIHBuZ19wYXNzX3lzdGFydFs3XSA9IHswLCAwLCA0LCAwLCAyLCAwLCAxfTsKKworICAgLyogT2Zmc2V0IHRvIG5leHQgaW50ZXJsYWNlIGJsb2NrIGluIHRoZSB5IGRpcmVjdGlvbiAqLworICAgc3RhdGljIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfcGFzc195aW5jWzddID0gezgsIDgsIDgsIDQsIDQsIDIsIDJ9OworI2VuZGlmCisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX2ZpbmlzaF9yb3ciKTsKKworICAgLyogTmV4dCByb3cgKi8KKyAgIHBuZ19wdHItPnJvd19udW1iZXIrKzsKKworICAgLyogU2VlIGlmIHdlIGFyZSBkb25lICovCisgICBpZiAocG5nX3B0ci0+cm93X251bWJlciA8IHBuZ19wdHItPm51bV9yb3dzKQorICAgICAgcmV0dXJuOworCisjaWZkZWYgUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAorICAgLyogSWYgaW50ZXJsYWNlZCwgZ28gdG8gbmV4dCBwYXNzICovCisgICBpZiAocG5nX3B0ci0+aW50ZXJsYWNlZCAhPSAwKQorICAgeworICAgICAgcG5nX3B0ci0+cm93X251bWJlciA9IDA7CisgICAgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlRFUkxBQ0UpICE9IDApCisgICAgICB7CisgICAgICAgICBwbmdfcHRyLT5wYXNzKys7CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIC8qIExvb3AgdW50aWwgd2UgZmluZCBhIG5vbi16ZXJvIHdpZHRoIG9yIGhlaWdodCBwYXNzICovCisgICAgICAgICBkbworICAgICAgICAgeworICAgICAgICAgICAgcG5nX3B0ci0+cGFzcysrOworCisgICAgICAgICAgICBpZiAocG5nX3B0ci0+cGFzcyA+PSA3KQorICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIHBuZ19wdHItPnVzcl93aWR0aCA9IChwbmdfcHRyLT53aWR0aCArCisgICAgICAgICAgICAgICAgcG5nX3Bhc3NfaW5jW3BuZ19wdHItPnBhc3NdIC0gMSAtCisgICAgICAgICAgICAgICAgcG5nX3Bhc3Nfc3RhcnRbcG5nX3B0ci0+cGFzc10pIC8KKyAgICAgICAgICAgICAgICBwbmdfcGFzc19pbmNbcG5nX3B0ci0+cGFzc107CisKKyAgICAgICAgICAgIHBuZ19wdHItPm51bV9yb3dzID0gKHBuZ19wdHItPmhlaWdodCArCisgICAgICAgICAgICAgICAgcG5nX3Bhc3NfeWluY1twbmdfcHRyLT5wYXNzXSAtIDEgLQorICAgICAgICAgICAgICAgIHBuZ19wYXNzX3lzdGFydFtwbmdfcHRyLT5wYXNzXSkgLworICAgICAgICAgICAgICAgIHBuZ19wYXNzX3lpbmNbcG5nX3B0ci0+cGFzc107CisKKyAgICAgICAgICAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVEVSTEFDRSkgIT0gMCkKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICB9IHdoaWxlIChwbmdfcHRyLT51c3Jfd2lkdGggPT0gMCB8fCBwbmdfcHRyLT5udW1fcm93cyA9PSAwKTsKKworICAgICAgfQorCisgICAgICAvKiBSZXNldCB0aGUgcm93IGFib3ZlIHRoZSBpbWFnZSBmb3IgdGhlIG5leHQgcGFzcyAqLworICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPCA3KQorICAgICAgeworICAgICAgICAgaWYgKHBuZ19wdHItPnByZXZfcm93ICE9IE5VTEwpCisgICAgICAgICAgICBtZW1zZXQocG5nX3B0ci0+cHJldl9yb3csIDAsCisgICAgICAgICAgICAgICAgKHBuZ19zaXplX3QpKFBOR19ST1dCWVRFUyhwbmdfcHRyLT51c3JfY2hhbm5lbHMqCisgICAgICAgICAgICAgICAgcG5nX3B0ci0+dXNyX2JpdF9kZXB0aCwgcG5nX3B0ci0+d2lkdGgpKSArIDEpOworCisgICAgICAgICByZXR1cm47CisgICAgICB9CisgICB9CisjZW5kaWYKKworICAgLyogSWYgd2UgZ2V0IGhlcmUsIHdlJ3ZlIGp1c3Qgd3JpdHRlbiB0aGUgbGFzdCByb3csIHNvIHdlIG5lZWQKKyAgICAgIHRvIGZsdXNoIHRoZSBjb21wcmVzc29yICovCisgICBwbmdfY29tcHJlc3NfSURBVChwbmdfcHRyLCBOVUxMLCAwLCBaX0ZJTklTSCk7Cit9CisKKyNpZmRlZiBQTkdfV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVECisvKiBQaWNrIG91dCB0aGUgY29ycmVjdCBwaXhlbHMgZm9yIHRoZSBpbnRlcmxhY2UgcGFzcy4KKyAqIFRoZSBiYXNpYyBpZGVhIGhlcmUgaXMgdG8gZ28gdGhyb3VnaCB0aGUgcm93IHdpdGggYSBzb3VyY2UKKyAqIHBvaW50ZXIgYW5kIGEgZGVzdGluYXRpb24gcG9pbnRlciAoc3AgYW5kIGRwKSwgYW5kIGNvcHkgdGhlCisgKiBjb3JyZWN0IHBpeGVscyBmb3IgdGhlIHBhc3MuICBBcyB0aGUgcm93IGdldHMgY29tcGFjdGVkLAorICogc3Agd2lsbCBhbHdheXMgYmUgPj0gZHAsIHNvIHdlIHNob3VsZCBuZXZlciBvdmVyd3JpdGUgYW55dGhpbmcuCisgKiBTZWUgdGhlIGRlZmF1bHQ6IGNhc2UgZm9yIHRoZSBlYXNpZXN0IGNvZGUgdG8gdW5kZXJzdGFuZC4KKyAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfZG9fd3JpdGVfaW50ZXJsYWNlKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csIGludCBwYXNzKQoreworICAgLyogQXJyYXlzIHRvIGZhY2lsaXRhdGUgZWFzeSBpbnRlcmxhY2luZyAtIHVzZSBwYXNzICgwIC0gNikgYXMgaW5kZXggKi8KKworICAgLyogU3RhcnQgb2YgaW50ZXJsYWNlIGJsb2NrICovCisgICBzdGF0aWMgUE5HX0NPTlNUIHBuZ19ieXRlIHBuZ19wYXNzX3N0YXJ0WzddID0gezAsIDQsIDAsIDIsIDAsIDEsIDB9OworCisgICAvKiBPZmZzZXQgdG8gbmV4dCBpbnRlcmxhY2UgYmxvY2sgKi8KKyAgIHN0YXRpYyBQTkdfQ09OU1QgcG5nX2J5dGUgIHBuZ19wYXNzX2luY1s3XSA9IHs4LCA4LCA0LCA0LCAyLCAyLCAxfTsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fd3JpdGVfaW50ZXJsYWNlIik7CisKKyAgIC8qIFdlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcgb24gdGhlIGxhc3QgcGFzcyAoNikgKi8KKyAgIGlmIChwYXNzIDwgNikKKyAgIHsKKyAgICAgIC8qIEVhY2ggcGl4ZWwgZGVwdGggaXMgaGFuZGxlZCBzZXBhcmF0ZWx5ICovCisgICAgICBzd2l0Y2ggKHJvd19pbmZvLT5waXhlbF9kZXB0aCkKKyAgICAgIHsKKyAgICAgICAgIGNhc2UgMToKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcDsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcDsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBzaGlmdDsKKyAgICAgICAgICAgIGludCBkOworICAgICAgICAgICAgaW50IHZhbHVlOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKKworICAgICAgICAgICAgZHAgPSByb3c7CisgICAgICAgICAgICBkID0gMDsKKyAgICAgICAgICAgIHNoaWZ0ID0gNzsKKworICAgICAgICAgICAgZm9yIChpID0gcG5nX3Bhc3Nfc3RhcnRbcGFzc107IGkgPCByb3dfd2lkdGg7CisgICAgICAgICAgICAgICBpICs9IHBuZ19wYXNzX2luY1twYXNzXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNwID0gcm93ICsgKHBuZ19zaXplX3QpKGkgPj4gMyk7CisgICAgICAgICAgICAgICB2YWx1ZSA9IChpbnQpKCpzcCA+PiAoNyAtIChpbnQpKGkgJiAweDA3KSkpICYgMHgwMTsKKyAgICAgICAgICAgICAgIGQgfD0gKHZhbHVlIDw8IHNoaWZ0KTsKKworICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDApCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzaGlmdCA9IDc7CisgICAgICAgICAgICAgICAgICAqZHArKyA9IChwbmdfYnl0ZSlkOworICAgICAgICAgICAgICAgICAgZCA9IDA7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHNoaWZ0LS07CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaGlmdCAhPSA3KQorICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKWQ7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBjYXNlIDI6CisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgc3A7CisgICAgICAgICAgICBwbmdfYnl0ZXAgZHA7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2hpZnQ7CisgICAgICAgICAgICBpbnQgZDsKKyAgICAgICAgICAgIGludCB2YWx1ZTsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIGk7CisgICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7CisKKyAgICAgICAgICAgIGRwID0gcm93OworICAgICAgICAgICAgc2hpZnQgPSA2OworICAgICAgICAgICAgZCA9IDA7CisKKyAgICAgICAgICAgIGZvciAoaSA9IHBuZ19wYXNzX3N0YXJ0W3Bhc3NdOyBpIDwgcm93X3dpZHRoOworICAgICAgICAgICAgICAgaSArPSBwbmdfcGFzc19pbmNbcGFzc10pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzcCA9IHJvdyArIChwbmdfc2l6ZV90KShpID4+IDIpOworICAgICAgICAgICAgICAgdmFsdWUgPSAoKnNwID4+ICgoMyAtIChpbnQpKGkgJiAweDAzKSkgPDwgMSkpICYgMHgwMzsKKyAgICAgICAgICAgICAgIGQgfD0gKHZhbHVlIDw8IHNoaWZ0KTsKKworICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDApCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzaGlmdCA9IDY7CisgICAgICAgICAgICAgICAgICAqZHArKyA9IChwbmdfYnl0ZSlkOworICAgICAgICAgICAgICAgICAgZCA9IDA7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHNoaWZ0IC09IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2hpZnQgIT0gNikKKyAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSlkOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKworICAgICAgICAgY2FzZSA0OgorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIHNwOworICAgICAgICAgICAgcG5nX2J5dGVwIGRwOworICAgICAgICAgICAgdW5zaWduZWQgaW50IHNoaWZ0OworICAgICAgICAgICAgaW50IGQ7CisgICAgICAgICAgICBpbnQgdmFsdWU7CisgICAgICAgICAgICBwbmdfdWludF8zMiBpOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOworCisgICAgICAgICAgICBkcCA9IHJvdzsKKyAgICAgICAgICAgIHNoaWZ0ID0gNDsKKyAgICAgICAgICAgIGQgPSAwOworICAgICAgICAgICAgZm9yIChpID0gcG5nX3Bhc3Nfc3RhcnRbcGFzc107IGkgPCByb3dfd2lkdGg7CisgICAgICAgICAgICAgICAgaSArPSBwbmdfcGFzc19pbmNbcGFzc10pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzcCA9IHJvdyArIChwbmdfc2l6ZV90KShpID4+IDEpOworICAgICAgICAgICAgICAgdmFsdWUgPSAoKnNwID4+ICgoMSAtIChpbnQpKGkgJiAweDAxKSkgPDwgMikpICYgMHgwZjsKKyAgICAgICAgICAgICAgIGQgfD0gKHZhbHVlIDw8IHNoaWZ0KTsKKworICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDApCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzaGlmdCA9IDQ7CisgICAgICAgICAgICAgICAgICAqZHArKyA9IChwbmdfYnl0ZSlkOworICAgICAgICAgICAgICAgICAgZCA9IDA7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHNoaWZ0IC09IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2hpZnQgIT0gNCkKKyAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSlkOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKworICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcDsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcDsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIGk7CisgICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7CisgICAgICAgICAgICBwbmdfc2l6ZV90IHBpeGVsX2J5dGVzOworCisgICAgICAgICAgICAvKiBTdGFydCBhdCB0aGUgYmVnaW5uaW5nICovCisgICAgICAgICAgICBkcCA9IHJvdzsKKworICAgICAgICAgICAgLyogRmluZCBvdXQgaG93IG1hbnkgYnl0ZXMgZWFjaCBwaXhlbCB0YWtlcyB1cCAqLworICAgICAgICAgICAgcGl4ZWxfYnl0ZXMgPSAocm93X2luZm8tPnBpeGVsX2RlcHRoID4+IDMpOworCisgICAgICAgICAgICAvKiBMb29wIHRocm91Z2ggdGhlIHJvdywgb25seSBsb29raW5nIGF0IHRoZSBwaXhlbHMgdGhhdCBtYXR0ZXIgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IHBuZ19wYXNzX3N0YXJ0W3Bhc3NdOyBpIDwgcm93X3dpZHRoOworICAgICAgICAgICAgICAgaSArPSBwbmdfcGFzc19pbmNbcGFzc10pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvKiBGaW5kIG91dCB3aGVyZSB0aGUgb3JpZ2luYWwgcGl4ZWwgaXMgKi8KKyAgICAgICAgICAgICAgIHNwID0gcm93ICsgKHBuZ19zaXplX3QpaSAqIHBpeGVsX2J5dGVzOworCisgICAgICAgICAgICAgICAvKiBNb3ZlIHRoZSBwaXhlbCAqLworICAgICAgICAgICAgICAgaWYgKGRwICE9IHNwKQorICAgICAgICAgICAgICAgICAgbWVtY3B5KGRwLCBzcCwgcGl4ZWxfYnl0ZXMpOworCisgICAgICAgICAgICAgICAvKiBOZXh0IHBpeGVsICovCisgICAgICAgICAgICAgICBkcCArPSBwaXhlbF9ieXRlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgfQorICAgICAgLyogU2V0IG5ldyByb3cgd2lkdGggKi8KKyAgICAgIHJvd19pbmZvLT53aWR0aCA9IChyb3dfaW5mby0+d2lkdGggKworICAgICAgICAgIHBuZ19wYXNzX2luY1twYXNzXSAtIDEgLQorICAgICAgICAgIHBuZ19wYXNzX3N0YXJ0W3Bhc3NdKSAvCisgICAgICAgICAgcG5nX3Bhc3NfaW5jW3Bhc3NdOworCisgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSBQTkdfUk9XQllURVMocm93X2luZm8tPnBpeGVsX2RlcHRoLAorICAgICAgICAgIHJvd19pbmZvLT53aWR0aCk7CisgICB9Cit9CisjZW5kaWYKKworCisvKiBUaGlzIGZpbHRlcnMgdGhlIHJvdywgY2hvb3NlcyB3aGljaCBmaWx0ZXIgdG8gdXNlLCBpZiBpdCBoYXMgbm90IGFscmVhZHkKKyAqIGJlZW4gc3BlY2lmaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbiwgYW5kIHRoZW4gd3JpdGVzIHRoZSByb3cgb3V0IHdpdGggdGhlCisgKiBjaG9zZW4gZmlsdGVyLgorICovCitzdGF0aWMgdm9pZCAvKiBQUklWQVRFICovCitwbmdfd3JpdGVfZmlsdGVyZWRfcm93KHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfYnl0ZXAgZmlsdGVyZWRfcm93LAorICAgcG5nX3NpemVfdCByb3dfYnl0ZXMpOworCisjaWZkZWYgUE5HX1dSSVRFX0ZJTFRFUl9TVVBQT1JURUQKK3N0YXRpYyBwbmdfc2l6ZV90IC8qIFBSSVZBVEUgKi8KK3BuZ19zZXR1cF9zdWJfcm93KHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBjb25zdCBwbmdfdWludF8zMiBicHAsCisgICAgY29uc3QgcG5nX3NpemVfdCByb3dfYnl0ZXMsIGNvbnN0IHBuZ19zaXplX3QgbG1pbnMpCit7CisgICBwbmdfYnl0ZXAgcnAsIGRwLCBscDsKKyAgIHBuZ19zaXplX3QgaTsKKyAgIHBuZ19zaXplX3Qgc3VtID0gMDsKKyAgIGludCB2OworCisgICBwbmdfcHRyLT50cnlfcm93WzBdID0gUE5HX0ZJTFRFUl9WQUxVRV9TVUI7CisKKyAgIGZvciAoaSA9IDAsIHJwID0gcG5nX3B0ci0+cm93X2J1ZiArIDEsIGRwID0gcG5nX3B0ci0+dHJ5X3JvdyArIDE7IGkgPCBicHA7CisgICAgICAgIGkrKywgcnArKywgZHArKykKKyAgIHsKKyAgICAgIHYgPSAqZHAgPSAqcnA7CisgICAgICBzdW0gKz0gKHYgPCAxMjgpID8gdiA6IDI1NiAtIHY7CisgICB9CisKKyAgIGZvciAobHAgPSBwbmdfcHRyLT5yb3dfYnVmICsgMTsgaSA8IHJvd19ieXRlczsKKyAgICAgIGkrKywgcnArKywgbHArKywgZHArKykKKyAgIHsKKyAgICAgIHYgPSAqZHAgPSAocG5nX2J5dGUpKCgoaW50KSpycCAtIChpbnQpKmxwKSAmIDB4ZmYpOworICAgICAgc3VtICs9ICh2IDwgMTI4KSA/IHYgOiAyNTYgLSB2OworCisgICAgICBpZiAoc3VtID4gbG1pbnMpICAvKiBXZSBhcmUgYWxyZWFkeSB3b3JzZSwgZG9uJ3QgY29udGludWUuICovCisgICAgICAgIGJyZWFrOworICAgfQorCisgICByZXR1cm4gKHN1bSk7Cit9CisKK3N0YXRpYyBwbmdfc2l6ZV90IC8qIFBSSVZBVEUgKi8KK3BuZ19zZXR1cF91cF9yb3cocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGNvbnN0IHBuZ19zaXplX3Qgcm93X2J5dGVzLAorICAgIGNvbnN0IHBuZ19zaXplX3QgbG1pbnMpCit7CisgICBwbmdfYnl0ZXAgcnAsIGRwLCBwcDsKKyAgIHBuZ19zaXplX3QgaTsKKyAgIHBuZ19zaXplX3Qgc3VtID0gMDsKKyAgIGludCB2OworCisgICBwbmdfcHRyLT50cnlfcm93WzBdID0gUE5HX0ZJTFRFUl9WQUxVRV9VUDsKKworICAgZm9yIChpID0gMCwgcnAgPSBwbmdfcHRyLT5yb3dfYnVmICsgMSwgZHAgPSBwbmdfcHRyLT50cnlfcm93ICsgMSwKKyAgICAgICBwcCA9IHBuZ19wdHItPnByZXZfcm93ICsgMTsgaSA8IHJvd19ieXRlczsKKyAgICAgICBpKyssIHJwKyssIHBwKyssIGRwKyspCisgICB7CisgICAgICB2ID0gKmRwID0gKHBuZ19ieXRlKSgoKGludCkqcnAgLSAoaW50KSpwcCkgJiAweGZmKTsKKyAgICAgIHN1bSArPSAodiA8IDEyOCkgPyB2IDogMjU2IC0gdjsKKworICAgICAgaWYgKHN1bSA+IGxtaW5zKSAgLyogV2UgYXJlIGFscmVhZHkgd29yc2UsIGRvbid0IGNvbnRpbnVlLiAqLworICAgICAgICBicmVhazsKKyAgIH0KKworICAgcmV0dXJuIChzdW0pOworfQorCitzdGF0aWMgcG5nX3NpemVfdCAvKiBQUklWQVRFICovCitwbmdfc2V0dXBfYXZnX3Jvdyhwbmdfc3RydWN0cnAgcG5nX3B0ciwgY29uc3QgcG5nX3VpbnRfMzIgYnBwLAorICAgICAgY29uc3QgcG5nX3NpemVfdCByb3dfYnl0ZXMsIGNvbnN0IHBuZ19zaXplX3QgbG1pbnMpCit7CisgICBwbmdfYnl0ZXAgcnAsIGRwLCBwcCwgbHA7CisgICBwbmdfdWludF8zMiBpOworICAgcG5nX3NpemVfdCBzdW0gPSAwOworICAgaW50IHY7CisKKyAgIHBuZ19wdHItPnRyeV9yb3dbMF0gPSBQTkdfRklMVEVSX1ZBTFVFX0FWRzsKKworICAgZm9yIChpID0gMCwgcnAgPSBwbmdfcHRyLT5yb3dfYnVmICsgMSwgZHAgPSBwbmdfcHRyLT50cnlfcm93ICsgMSwKKyAgICAgICAgcHAgPSBwbmdfcHRyLT5wcmV2X3JvdyArIDE7IGkgPCBicHA7IGkrKykKKyAgIHsKKyAgICAgIHYgPSAqZHArKyA9IChwbmdfYnl0ZSkoKChpbnQpKnJwKysgLSAoKGludCkqcHArKyAvIDIpKSAmIDB4ZmYpOworCisgICAgICBzdW0gKz0gKHYgPCAxMjgpID8gdiA6IDI1NiAtIHY7CisgICB9CisKKyAgIGZvciAobHAgPSBwbmdfcHRyLT5yb3dfYnVmICsgMTsgaSA8IHJvd19ieXRlczsgaSsrKQorICAgeworICAgICAgdiA9ICpkcCsrID0gKHBuZ19ieXRlKSgoKGludCkqcnArKyAtICgoKGludCkqcHArKyArIChpbnQpKmxwKyspIC8gMikpCisgICAgICAgICAgJiAweGZmKTsKKworICAgICAgc3VtICs9ICh2IDwgMTI4KSA/IHYgOiAyNTYgLSB2OworCisgICAgICBpZiAoc3VtID4gbG1pbnMpICAvKiBXZSBhcmUgYWxyZWFkeSB3b3JzZSwgZG9uJ3QgY29udGludWUuICovCisgICAgICAgIGJyZWFrOworICAgfQorCisgICByZXR1cm4gKHN1bSk7Cit9CisKK3N0YXRpYyBwbmdfc2l6ZV90IC8qIFBSSVZBVEUgKi8KK3BuZ19zZXR1cF9wYWV0aF9yb3cocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGNvbnN0IHBuZ191aW50XzMyIGJwcCwKKyAgICBjb25zdCBwbmdfc2l6ZV90IHJvd19ieXRlcywgY29uc3QgcG5nX3NpemVfdCBsbWlucykKK3sKKyAgIHBuZ19ieXRlcCBycCwgZHAsIHBwLCBjcCwgbHA7CisgICBwbmdfc2l6ZV90IGk7CisgICBwbmdfc2l6ZV90IHN1bSA9IDA7CisgICBpbnQgdjsKKworICAgcG5nX3B0ci0+dHJ5X3Jvd1swXSA9IFBOR19GSUxURVJfVkFMVUVfUEFFVEg7CisKKyAgIGZvciAoaSA9IDAsIHJwID0gcG5nX3B0ci0+cm93X2J1ZiArIDEsIGRwID0gcG5nX3B0ci0+dHJ5X3JvdyArIDEsCisgICAgICAgcHAgPSBwbmdfcHRyLT5wcmV2X3JvdyArIDE7IGkgPCBicHA7IGkrKykKKyAgIHsKKyAgICAgIHYgPSAqZHArKyA9IChwbmdfYnl0ZSkoKChpbnQpKnJwKysgLSAoaW50KSpwcCsrKSAmIDB4ZmYpOworCisgICAgICBzdW0gKz0gKHYgPCAxMjgpID8gdiA6IDI1NiAtIHY7CisgICB9CisKKyAgIGZvciAobHAgPSBwbmdfcHRyLT5yb3dfYnVmICsgMSwgY3AgPSBwbmdfcHRyLT5wcmV2X3JvdyArIDE7IGkgPCByb3dfYnl0ZXM7CisgICAgICAgIGkrKykKKyAgIHsKKyAgICAgIGludCBhLCBiLCBjLCBwYSwgcGIsIHBjLCBwOworCisgICAgICBiID0gKnBwKys7CisgICAgICBjID0gKmNwKys7CisgICAgICBhID0gKmxwKys7CisKKyAgICAgIHAgPSBiIC0gYzsKKyAgICAgIHBjID0gYSAtIGM7CisKKyNpZmRlZiBQTkdfVVNFX0FCUworICAgICAgcGEgPSBhYnMocCk7CisgICAgICBwYiA9IGFicyhwYyk7CisgICAgICBwYyA9IGFicyhwICsgcGMpOworI2Vsc2UKKyAgICAgIHBhID0gcCA8IDAgPyAtcCA6IHA7CisgICAgICBwYiA9IHBjIDwgMCA/IC1wYyA6IHBjOworICAgICAgcGMgPSAocCArIHBjKSA8IDAgPyAtKHAgKyBwYykgOiBwICsgcGM7CisjZW5kaWYKKworICAgICAgcCA9IChwYSA8PSBwYiAmJiBwYSA8PXBjKSA/IGEgOiAocGIgPD0gcGMpID8gYiA6IGM7CisKKyAgICAgIHYgPSAqZHArKyA9IChwbmdfYnl0ZSkoKChpbnQpKnJwKysgLSBwKSAmIDB4ZmYpOworCisgICAgICBzdW0gKz0gKHYgPCAxMjgpID8gdiA6IDI1NiAtIHY7CisKKyAgICAgIGlmIChzdW0gPiBsbWlucykgIC8qIFdlIGFyZSBhbHJlYWR5IHdvcnNlLCBkb24ndCBjb250aW51ZS4gKi8KKyAgICAgICAgYnJlYWs7CisgICB9CisKKyAgIHJldHVybiAoc3VtKTsKK30KKyNlbmRpZiAvKiBXUklURV9GSUxURVIgKi8KKwordm9pZCAvKiBQUklWQVRFICovCitwbmdfd3JpdGVfZmluZF9maWx0ZXIocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19yb3dfaW5mb3Agcm93X2luZm8pCit7CisjaWZuZGVmIFBOR19XUklURV9GSUxURVJfU1VQUE9SVEVECisgICBwbmdfd3JpdGVfZmlsdGVyZWRfcm93KHBuZ19wdHIsIHBuZ19wdHItPnJvd19idWYsIHJvd19pbmZvLT5yb3dieXRlcysxKTsKKyNlbHNlCisgICBwbmdfYnl0ZSBmaWx0ZXJfdG9fZG8gPSBwbmdfcHRyLT5kb19maWx0ZXI7CisgICBwbmdfYnl0ZXAgcm93X2J1ZjsKKyAgIHBuZ19ieXRlcCBiZXN0X3JvdzsKKyAgIHBuZ191aW50XzMyIGJwcDsKKyAgIHBuZ19zaXplX3QgbWluczsKKyAgIHBuZ19zaXplX3Qgcm93X2J5dGVzID0gcm93X2luZm8tPnJvd2J5dGVzOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9maW5kX2ZpbHRlciIpOworCisgICAvKiBGaW5kIG91dCBob3cgbWFueSBieXRlcyBvZmZzZXQgZWFjaCBwaXhlbCBpcyAqLworICAgYnBwID0gKHJvd19pbmZvLT5waXhlbF9kZXB0aCArIDcpID4+IDM7CisKKyAgIHJvd19idWYgPSBwbmdfcHRyLT5yb3dfYnVmOworICAgbWlucyA9IFBOR19TSVpFX01BWCAtIDI1Ni8qIHNvIHdlIGNhbiBkZXRlY3QgcG90ZW50aWFsIG92ZXJmbG93IG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bm5pbmcgc3VtICovOworCisgICAvKiBUaGUgcHJlZGljdGlvbiBtZXRob2Qgd2UgdXNlIGlzIHRvIGZpbmQgd2hpY2ggbWV0aG9kIHByb3ZpZGVzIHRoZQorICAgICogc21hbGxlc3QgdmFsdWUgd2hlbiBzdW1taW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZXMgb2YgdGhlIGRpc3RhbmNlcworICAgICogZnJvbSB6ZXJvLCB1c2luZyBhbnl0aGluZyA+PSAxMjggYXMgbmVnYXRpdmUgbnVtYmVycy4gIFRoaXMgaXMga25vd24KKyAgICAqIGFzIHRoZSAibWluaW11bSBzdW0gb2YgYWJzb2x1dGUgZGlmZmVyZW5jZXMiIGhldXJpc3RpYy4gIE90aGVyCisgICAgKiBoZXVyaXN0aWNzIGFyZSB0aGUgIndlaWdodGVkIG1pbmltdW0gc3VtIG9mIGFic29sdXRlIGRpZmZlcmVuY2VzIgorICAgICogKGV4cGVyaW1lbnRhbCBhbmQgY2FuIGluIHRoZW9yeSBpbXByb3ZlIGNvbXByZXNzaW9uKSwgYW5kIHRoZSAiemxpYgorICAgICogcHJlZGljdGl2ZSIgbWV0aG9kIChub3QgaW1wbGVtZW50ZWQgeWV0KSwgd2hpY2ggZG9lcyB0ZXN0IGNvbXByZXNzaW9ucworICAgICogb2YgbGluZXMgdXNpbmcgZGlmZmVyZW50IGZpbHRlciBtZXRob2RzLCBhbmQgdGhlbiBjaG9vc2VzIHRoZQorICAgICogKHNlcmllcyBvZikgZmlsdGVyKHMpIHRoYXQgZ2l2ZSBtaW5pbXVtIGNvbXByZXNzZWQgZGF0YSBzaXplIChWRVJZCisgICAgKiBjb21wdXRhdGlvbmFsbHkgZXhwZW5zaXZlKS4KKyAgICAqCisgICAgKiBHUlIgOTgwNTI1OiAgY29uc2lkZXIgYWxzbworICAgICoKKyAgICAqICAgKDEpIG1pbmltdW0gc3VtIG9mIGFic29sdXRlIGRpZmZlcmVuY2VzIGZyb20gcnVubmluZyBhdmVyYWdlIChpLmUuLAorICAgICogICAgICAga2VlcCBydW5uaW5nIHN1bSBvZiBub24tYWJzb2x1dGUgZGlmZmVyZW5jZXMgJiBjb3VudCBvZiBieXRlcykKKyAgICAqICAgICAgIFt0cmFjayBkaXNwZXJzaW9uLCB0b28/ICByZXN0YXJ0IGF2ZXJhZ2UgaWYgZGlzcGVyc2lvbiB0b28gbGFyZ2U/XQorICAgICoKKyAgICAqICAoMWIpIG1pbmltdW0gc3VtIG9mIGFic29sdXRlIGRpZmZlcmVuY2VzIGZyb20gc2xpZGluZyBhdmVyYWdlLCBwcm9iYWJseQorICAgICogICAgICAgd2l0aCB3aW5kb3cgc2l6ZSA8PSBkZWZsYXRlIHdpbmRvdyAodXN1YWxseSAzMkspCisgICAgKgorICAgICogICAoMikgbWluaW11bSBzdW0gb2Ygc3F1YXJlZCBkaWZmZXJlbmNlcyBmcm9tIHplcm8gb3IgcnVubmluZyBhdmVyYWdlCisgICAgKiAgICAgICAoaS5lLiwgfiByb290LW1lYW4tc3F1YXJlIGFwcHJvYWNoKQorICAgICovCisKKworICAgLyogV2UgZG9uJ3QgbmVlZCB0byB0ZXN0IHRoZSAnbm8gZmlsdGVyJyBjYXNlIGlmIHRoaXMgaXMgdGhlIG9ubHkgZmlsdGVyCisgICAgKiB0aGF0IGhhcyBiZWVuIGNob3NlbiwgYXMgaXQgZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyB0byB0aGUgZGF0YS4KKyAgICAqLworICAgYmVzdF9yb3cgPSBwbmdfcHRyLT5yb3dfYnVmOworCisKKyAgIGlmICgoZmlsdGVyX3RvX2RvICYgUE5HX0ZJTFRFUl9OT05FKSAhPSAwICYmIGZpbHRlcl90b19kbyAhPSBQTkdfRklMVEVSX05PTkUpCisgICB7CisgICAgICBwbmdfYnl0ZXAgcnA7CisgICAgICBwbmdfc2l6ZV90IHN1bSA9IDA7CisgICAgICBwbmdfc2l6ZV90IGk7CisgICAgICBpbnQgdjsKKworICAgICAgaWYgKFBOR19TSVpFX01BWC8xMjggPD0gcm93X2J5dGVzKQorICAgICAgeworICAgICAgICAgZm9yIChpID0gMCwgcnAgPSByb3dfYnVmICsgMTsgaSA8IHJvd19ieXRlczsgaSsrLCBycCsrKQorICAgICAgICAgeworICAgICAgICAgICAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCisgICAgICAgICAgICBpZiAoc3VtID4gUE5HX1NJWkVfTUFYLzEyOCAtIDI1NikKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB2ID0gKnJwOworICAgICAgICAgICAgc3VtICs9ICh2IDwgMTI4KSA/IHYgOiAyNTYgLSB2OworICAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSAvKiBPdmVyZmxvdyBpcyBub3QgcG9zc2libGUgKi8KKyAgICAgIHsKKyAgICAgICAgIGZvciAoaSA9IDAsIHJwID0gcm93X2J1ZiArIDE7IGkgPCByb3dfYnl0ZXM7IGkrKywgcnArKykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHYgPSAqcnA7CisgICAgICAgICAgICBzdW0gKz0gKHYgPCAxMjgpID8gdiA6IDI1NiAtIHY7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIG1pbnMgPSBzdW07CisgICB9CisKKyAgIC8qIFN1YiBmaWx0ZXIgKi8KKyAgIGlmIChmaWx0ZXJfdG9fZG8gPT0gUE5HX0ZJTFRFUl9TVUIpCisgICAvKiBJdCdzIHRoZSBvbmx5IGZpbHRlciBzbyBubyB0ZXN0aW5nIGlzIG5lZWRlZCAqLworICAgeworICAgICAgKHZvaWQpIHBuZ19zZXR1cF9zdWJfcm93KHBuZ19wdHIsIGJwcCwgcm93X2J5dGVzLCBtaW5zKTsKKyAgICAgIGJlc3Rfcm93ID0gcG5nX3B0ci0+dHJ5X3JvdzsKKyAgIH0KKworICAgZWxzZSBpZiAoKGZpbHRlcl90b19kbyAmIFBOR19GSUxURVJfU1VCKSAhPSAwKQorICAgeworICAgICAgcG5nX3NpemVfdCBzdW07CisgICAgICBwbmdfc2l6ZV90IGxtaW5zID0gbWluczsKKworICAgICAgc3VtID0gcG5nX3NldHVwX3N1Yl9yb3cocG5nX3B0ciwgYnBwLCByb3dfYnl0ZXMsIGxtaW5zKTsKKworICAgICAgaWYgKHN1bSA8IG1pbnMpCisgICAgICB7CisgICAgICAgICBtaW5zID0gc3VtOworICAgICAgICAgYmVzdF9yb3cgPSBwbmdfcHRyLT50cnlfcm93OworICAgICAgICAgaWYgKHBuZ19wdHItPnRzdF9yb3cgIT0gTlVMTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19wdHItPnRyeV9yb3cgPSBwbmdfcHRyLT50c3Rfcm93OworICAgICAgICAgICAgcG5nX3B0ci0+dHN0X3JvdyA9IGJlc3Rfcm93OworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICAvKiBVcCBmaWx0ZXIgKi8KKyAgIGlmIChmaWx0ZXJfdG9fZG8gPT0gUE5HX0ZJTFRFUl9VUCkKKyAgIHsKKyAgICAgICh2b2lkKSBwbmdfc2V0dXBfdXBfcm93KHBuZ19wdHIsIHJvd19ieXRlcywgbWlucyk7CisgICAgICBiZXN0X3JvdyA9IHBuZ19wdHItPnRyeV9yb3c7CisgICB9CisKKyAgIGVsc2UgaWYgKChmaWx0ZXJfdG9fZG8gJiBQTkdfRklMVEVSX1VQKSAhPSAwKQorICAgeworICAgICAgcG5nX3NpemVfdCBzdW07CisgICAgICBwbmdfc2l6ZV90IGxtaW5zID0gbWluczsKKworICAgICAgc3VtID0gcG5nX3NldHVwX3VwX3JvdyhwbmdfcHRyLCByb3dfYnl0ZXMsIGxtaW5zKTsKKworICAgICAgaWYgKHN1bSA8IG1pbnMpCisgICAgICB7CisgICAgICAgICBtaW5zID0gc3VtOworICAgICAgICAgYmVzdF9yb3cgPSBwbmdfcHRyLT50cnlfcm93OworICAgICAgICAgaWYgKHBuZ19wdHItPnRzdF9yb3cgIT0gTlVMTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19wdHItPnRyeV9yb3cgPSBwbmdfcHRyLT50c3Rfcm93OworICAgICAgICAgICAgcG5nX3B0ci0+dHN0X3JvdyA9IGJlc3Rfcm93OworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICAvKiBBdmcgZmlsdGVyICovCisgICBpZiAoZmlsdGVyX3RvX2RvID09IFBOR19GSUxURVJfQVZHKQorICAgeworICAgICAgKHZvaWQpIHBuZ19zZXR1cF9hdmdfcm93KHBuZ19wdHIsIGJwcCwgcm93X2J5dGVzLCBtaW5zKTsKKyAgICAgIGJlc3Rfcm93ID0gcG5nX3B0ci0+dHJ5X3JvdzsKKyAgIH0KKworICAgZWxzZSBpZiAoKGZpbHRlcl90b19kbyAmIFBOR19GSUxURVJfQVZHKSAhPSAwKQorICAgeworICAgICAgcG5nX3NpemVfdCBzdW07CisgICAgICBwbmdfc2l6ZV90IGxtaW5zID0gbWluczsKKworICAgICAgc3VtPSBwbmdfc2V0dXBfYXZnX3JvdyhwbmdfcHRyLCBicHAsIHJvd19ieXRlcywgbG1pbnMpOworCisgICAgICBpZiAoc3VtIDwgbWlucykKKyAgICAgIHsKKyAgICAgICAgIG1pbnMgPSBzdW07CisgICAgICAgICBiZXN0X3JvdyA9IHBuZ19wdHItPnRyeV9yb3c7CisgICAgICAgICBpZiAocG5nX3B0ci0+dHN0X3JvdyAhPSBOVUxMKQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX3B0ci0+dHJ5X3JvdyA9IHBuZ19wdHItPnRzdF9yb3c7CisgICAgICAgICAgICBwbmdfcHRyLT50c3Rfcm93ID0gYmVzdF9yb3c7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIC8qIFBhZXRoIGZpbHRlciAqLworICAgaWYgKChmaWx0ZXJfdG9fZG8gPT0gUE5HX0ZJTFRFUl9QQUVUSCkgIT0gMCkKKyAgIHsKKyAgICAgICh2b2lkKSBwbmdfc2V0dXBfcGFldGhfcm93KHBuZ19wdHIsIGJwcCwgcm93X2J5dGVzLCBtaW5zKTsKKyAgICAgIGJlc3Rfcm93ID0gcG5nX3B0ci0+dHJ5X3JvdzsKKyAgIH0KKworICAgZWxzZSBpZiAoKGZpbHRlcl90b19kbyAmIFBOR19GSUxURVJfUEFFVEgpICE9IDApCisgICB7CisgICAgICBwbmdfc2l6ZV90IHN1bTsKKyAgICAgIHBuZ19zaXplX3QgbG1pbnMgPSBtaW5zOworCisgICAgICBzdW0gPSBwbmdfc2V0dXBfcGFldGhfcm93KHBuZ19wdHIsIGJwcCwgcm93X2J5dGVzLCBsbWlucyk7CisKKyAgICAgIGlmIChzdW0gPCBtaW5zKQorICAgICAgeworICAgICAgICAgYmVzdF9yb3cgPSBwbmdfcHRyLT50cnlfcm93OworICAgICAgICAgaWYgKHBuZ19wdHItPnRzdF9yb3cgIT0gTlVMTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19wdHItPnRyeV9yb3cgPSBwbmdfcHRyLT50c3Rfcm93OworICAgICAgICAgICAgcG5nX3B0ci0+dHN0X3JvdyA9IGJlc3Rfcm93OworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICAvKiBEbyB0aGUgYWN0dWFsIHdyaXRpbmcgb2YgdGhlIGZpbHRlcmVkIHJvdyBkYXRhIGZyb20gdGhlIGNob3NlbiBmaWx0ZXIuICovCisgICBwbmdfd3JpdGVfZmlsdGVyZWRfcm93KHBuZ19wdHIsIGJlc3Rfcm93LCByb3dfaW5mby0+cm93Ynl0ZXMrMSk7CisKKyNlbmRpZiAvKiBXUklURV9GSUxURVIgKi8KK30KKworCisvKiBEbyB0aGUgYWN0dWFsIHdyaXRpbmcgb2YgYSBwcmV2aW91c2x5IGZpbHRlcmVkIHJvdy4gKi8KK3N0YXRpYyB2b2lkCitwbmdfd3JpdGVfZmlsdGVyZWRfcm93KHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfYnl0ZXAgZmlsdGVyZWRfcm93LAorICAgcG5nX3NpemVfdCBmdWxsX3Jvd19sZW5ndGgvKmluY2x1ZGVzIGZpbHRlciBieXRlKi8pCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9maWx0ZXJlZF9yb3ciKTsKKworICAgcG5nX2RlYnVnMSgyLCAiZmlsdGVyID0gJWQiLCBmaWx0ZXJlZF9yb3dbMF0pOworCisgICBwbmdfY29tcHJlc3NfSURBVChwbmdfcHRyLCBmaWx0ZXJlZF9yb3csIGZ1bGxfcm93X2xlbmd0aCwgWl9OT19GTFVTSCk7CisKKyNpZmRlZiBQTkdfV1JJVEVfRklMVEVSX1NVUFBPUlRFRAorICAgLyogU3dhcCB0aGUgY3VycmVudCBhbmQgcHJldmlvdXMgcm93cyAqLworICAgaWYgKHBuZ19wdHItPnByZXZfcm93ICE9IE5VTEwpCisgICB7CisgICAgICBwbmdfYnl0ZXAgdHB0cjsKKworICAgICAgdHB0ciA9IHBuZ19wdHItPnByZXZfcm93OworICAgICAgcG5nX3B0ci0+cHJldl9yb3cgPSBwbmdfcHRyLT5yb3dfYnVmOworICAgICAgcG5nX3B0ci0+cm93X2J1ZiA9IHRwdHI7CisgICB9CisjZW5kaWYgLyogV1JJVEVfRklMVEVSICovCisKKyAgIC8qIEZpbmlzaCByb3cgLSB1cGRhdGVzIGNvdW50ZXJzIGFuZCBmbHVzaGVzIHpsaWIgaWYgbGFzdCByb3cgKi8KKyAgIHBuZ193cml0ZV9maW5pc2hfcm93KHBuZ19wdHIpOworCisjaWZkZWYgUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRAorICAgcG5nX3B0ci0+Zmx1c2hfcm93cysrOworCisgICBpZiAocG5nX3B0ci0+Zmx1c2hfZGlzdCA+IDAgJiYKKyAgICAgICBwbmdfcHRyLT5mbHVzaF9yb3dzID49IHBuZ19wdHItPmZsdXNoX2Rpc3QpCisgICB7CisgICAgICBwbmdfd3JpdGVfZmx1c2gocG5nX3B0cik7CisgICB9CisjZW5kaWYgLyogV1JJVEVfRkxVU0ggKi8KK30KKyNlbmRpZiAvKiBXUklURSAqLwpkaWZmIC0tZ2l0IGEvbGlicG5nL3Byb2plY3RzL293YXRjb20vbGlicG5nLnRndCBiL2xpYnBuZy9wcm9qZWN0cy9vd2F0Y29tL2xpYnBuZy50Z3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE5NjIyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9wcm9qZWN0cy9vd2F0Y29tL2xpYnBuZy50Z3QKQEAgLTAsMCArMSwzODMgQEAKKzQwDQordGFyZ2V0SWRlbnQNCiswDQorTVByb2plY3QNCisxDQorTUNvbXBvbmVudA0KKzANCisyDQorV1N0cmluZw0KKzMNCitMSUINCiszDQorV1N0cmluZw0KKzUNCituXzJzbg0KKzENCiswDQorMA0KKzQNCitNQ29tbWFuZA0KKzANCis1DQorTUNvbW1hbmQNCiswDQorNg0KK01JdGVtDQorMTANCitsaWJwbmcubGliDQorNw0KK1dTdHJpbmcNCiszDQorTElCDQorOA0KK1dWTGlzdA0KKzANCis5DQorV1ZMaXN0DQorMQ0KKzEwDQorQWN0aW9uU3RhdGVzDQorMTENCitXU3RyaW5nDQorNQ0KKyZNYWtlDQorMTINCitXVkxpc3QNCiswDQorLTENCisxDQorMQ0KKzANCisxMw0KK1dQaWNrTGlzdA0KKzE2DQorMTQNCitNSXRlbQ0KKzMNCisqLmMNCisxNQ0KK1dTdHJpbmcNCis0DQorQ09CSg0KKzE2DQorV1ZMaXN0DQorMg0KKzE3DQorTVZTdGF0ZQ0KKzE4DQorV1N0cmluZw0KKzMNCitXQ0MNCisxOQ0KK1dTdHJpbmcNCisyNQ0KK24/Pz8/SW5jbHVkZSBkaXJlY3RvcmllczoNCisxDQorMjANCitXU3RyaW5nDQorMzkNCisiJCglemxpYik7JCgld2F0Y29tKS9oOyQoJXdhdGNvbSkvaC9udCINCiswDQorMjENCitNVlN0YXRlDQorMjINCitXU3RyaW5nDQorMw0KK1dDQw0KKzIzDQorV1N0cmluZw0KKzI1DQorbj8/Pz9JbmNsdWRlIGRpcmVjdG9yaWVzOg0KKzANCisyNA0KK1dTdHJpbmcNCiszOQ0KKyIkKCV6bGliKTskKCV3YXRjb20pL2g7JCgld2F0Y29tKS9oL250Ig0KKzANCisyNQ0KK1dWTGlzdA0KKzENCisyNg0KK0FjdGlvblN0YXRlcw0KKzI3DQorV1N0cmluZw0KKzUNCismTWFrZQ0KKzI4DQorV1ZMaXN0DQorMA0KKy0xDQorMQ0KKzENCiswDQorMjkNCitNSXRlbQ0KKzExDQorLi5cLi5ccG5nLmMNCiszMA0KK1dTdHJpbmcNCis0DQorQ09CSg0KKzMxDQorV1ZMaXN0DQorMA0KKzMyDQorV1ZMaXN0DQorMA0KKzE0DQorMQ0KKzENCiswDQorMzMNCitNSXRlbQ0KKzE2DQorLi5cLi5ccG5nZXJyb3IuYw0KKzM0DQorV1N0cmluZw0KKzQNCitDT0JKDQorMzUNCitXVkxpc3QNCiswDQorMzYNCitXVkxpc3QNCiswDQorMTQNCisxDQorMQ0KKzANCiszNw0KK01JdGVtDQorMTQNCisuLlwuLlxwbmdnZXQuYw0KKzM4DQorV1N0cmluZw0KKzQNCitDT0JKDQorMzkNCitXVkxpc3QNCiswDQorNDANCitXVkxpc3QNCiswDQorMTQNCisxDQorMQ0KKzANCis0MQ0KK01JdGVtDQorMTQNCisuLlwuLlxwbmdtZW0uYw0KKzQyDQorV1N0cmluZw0KKzQNCitDT0JKDQorNDMNCitXVkxpc3QNCiswDQorNDQNCitXVkxpc3QNCiswDQorMTQNCisxDQorMQ0KKzANCis0NQ0KK01JdGVtDQorMTYNCisuLlwuLlxwbmdwcmVhZC5jDQorNDYNCitXU3RyaW5nDQorNA0KK0NPQkoNCis0Nw0KK1dWTGlzdA0KKzANCis0OA0KK1dWTGlzdA0KKzANCisxNA0KKzENCisxDQorMA0KKzQ5DQorTUl0ZW0NCisxNQ0KKy4uXC4uXHBuZ3JlYWQuYw0KKzUwDQorV1N0cmluZw0KKzQNCitDT0JKDQorNTENCitXVkxpc3QNCiswDQorNTINCitXVkxpc3QNCiswDQorMTQNCisxDQorMQ0KKzANCis1Mw0KK01JdGVtDQorMTQNCisuLlwuLlxwbmdyaW8uYw0KKzU0DQorV1N0cmluZw0KKzQNCitDT0JKDQorNTUNCitXVkxpc3QNCiswDQorNTYNCitXVkxpc3QNCiswDQorMTQNCisxDQorMQ0KKzANCis1Nw0KK01JdGVtDQorMTYNCisuLlwuLlxwbmdydHJhbi5jDQorNTgNCitXU3RyaW5nDQorNA0KK0NPQkoNCis1OQ0KK1dWTGlzdA0KKzANCis2MA0KK1dWTGlzdA0KKzANCisxNA0KKzENCisxDQorMA0KKzYxDQorTUl0ZW0NCisxNg0KKy4uXC4uXHBuZ3J1dGlsLmMNCis2Mg0KK1dTdHJpbmcNCis0DQorQ09CSg0KKzYzDQorV1ZMaXN0DQorMA0KKzY0DQorV1ZMaXN0DQorMA0KKzE0DQorMQ0KKzENCiswDQorNjUNCitNSXRlbQ0KKzE0DQorLi5cLi5ccG5nc2V0LmMNCis2Ng0KK1dTdHJpbmcNCis0DQorQ09CSg0KKzY3DQorV1ZMaXN0DQorMA0KKzY4DQorV1ZMaXN0DQorMA0KKzE0DQorMQ0KKzENCiswDQorNjkNCitNSXRlbQ0KKzE2DQorLi5cLi5ccG5ndHJhbnMuYw0KKzcwDQorV1N0cmluZw0KKzQNCitDT0JKDQorNzENCitXVkxpc3QNCiswDQorNzINCitXVkxpc3QNCiswDQorMTQNCisxDQorMQ0KKzANCis3Mw0KK01JdGVtDQorMTQNCisuLlwuLlxwbmd3aW8uYw0KKzc0DQorV1N0cmluZw0KKzQNCitDT0JKDQorNzUNCitXVkxpc3QNCiswDQorNzYNCitXVkxpc3QNCiswDQorMTQNCisxDQorMQ0KKzANCis3Nw0KK01JdGVtDQorMTYNCisuLlwuLlxwbmd3cml0ZS5jDQorNzgNCitXU3RyaW5nDQorNA0KK0NPQkoNCis3OQ0KK1dWTGlzdA0KKzANCis4MA0KK1dWTGlzdA0KKzANCisxNA0KKzENCisxDQorMA0KKzgxDQorTUl0ZW0NCisxNg0KKy4uXC4uXHBuZ3d0cmFuLmMNCis4Mg0KK1dTdHJpbmcNCis0DQorQ09CSg0KKzgzDQorV1ZMaXN0DQorMA0KKzg0DQorV1ZMaXN0DQorMA0KKzE0DQorMQ0KKzENCiswDQorODUNCitNSXRlbQ0KKzE2DQorLi5cLi5ccG5nd3V0aWwuYw0KKzg2DQorV1N0cmluZw0KKzQNCitDT0JKDQorODcNCitXVkxpc3QNCiswDQorODgNCitXVkxpc3QNCiswDQorMTQNCisxDQorMQ0KKzANCmRpZmYgLS1naXQgYS9saWJwbmcvcHJvamVjdHMvb3dhdGNvbS9saWJwbmcud3BqIGIvbGlicG5nL3Byb2plY3RzL293YXRjb20vbGlicG5nLndwagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzBkOTVmCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3Byb2plY3RzL293YXRjb20vbGlicG5nLndwagpAQCAtMCwwICsxLDExMiBAQAorNDANCitwcm9qZWN0SWRlbnQNCiswDQorVnBlTWFpbg0KKzENCitXUmVjdA0KKzI1Ng0KKzANCis4OTYwDQorOTI5NA0KKzINCitNUHJvamVjdA0KKzMNCitNQ29tbWFuZA0KKzMyMg0KKyMgTG9jYXRpb25zIG9mIHpsaWIgYW5kIChpZiByZXF1aXJlZCkgYXdrIChjaGFuZ2UgYXMgcmVxdWlyZWQ6KQ0KK3NldCB6bGliPS4uXC4uXC4uXHpsaWINCitzZXQgYXdrPQ0KKyMNCitAaWYgbm90IGV4aXN0IHBuZ2NvbmZpZy5kZmEgJChNQUtFKSAkKF9fTUFLRU9QVFNfXykgLWYgcG5nY29uZmlnLm1hayBkZWZhdWx0cw0KK0BpZiBleGlzdCBjb25maWcuaW5mIHR5cGUgY29uZmlnLmluZg0KK0BlY2hvIENoZWNraW5nIGZvciB0aGUgbGlicG5nIGNvbmZpZ3VyYXRpb24gZmlsZSBwbmdsaWJjb25mLmgNCiskKE1BS0UpICQoX19NQUtFT1BUU19fKSAtZiBwbmdjb25maWcubWFrDQorNA0KK01Db21tYW5kDQorMTkNCitAdHlwZSBwbmdjb25maWcuaW5mDQorNA0KKzUNCitXRmlsZU5hbWUNCisxMA0KK2xpYnBuZy50Z3QNCis2DQorV0ZpbGVOYW1lDQorMTENCitwbmd0ZXN0LnRndA0KKzcNCitXRmlsZU5hbWUNCisxMg0KK3BuZ3ZhbGlkLnRndA0KKzgNCitXRmlsZU5hbWUNCisxMg0KK3BuZ3N0ZXN0LnRndA0KKzkNCitXVkxpc3QNCis0DQorMTANCitWQ29tcG9uZW50DQorMTENCitXUmVjdA0KKzANCiswDQorNTYzOA0KKzQxNzQNCiswDQorMA0KKzEyDQorV0ZpbGVOYW1lDQorMTANCitsaWJwbmcudGd0DQorMA0KKzANCisxMw0KK1ZDb21wb25lbnQNCisxNA0KK1dSZWN0DQorMTI4MA0KKzE1NTANCis1NjM4DQorNDE3NA0KKzANCiswDQorMTUNCitXRmlsZU5hbWUNCisxMQ0KK3BuZ3Rlc3QudGd0DQorMA0KKzENCisxNg0KK1ZDb21wb25lbnQNCisxNw0KK1dSZWN0DQorNTI0DQorNDk3DQorNTYzOA0KKzQxNzQNCiswDQorMA0KKzE4DQorV0ZpbGVOYW1lDQorMTINCitwbmd2YWxpZC50Z3QNCiswDQorMQ0KKzE5DQorVkNvbXBvbmVudA0KKzIwDQorV1JlY3QNCisyMDU0DQorMjcwMQ0KKzU2NzQNCis0MjMyDQorMA0KKzANCisyMQ0KK1dGaWxlTmFtZQ0KKzEyDQorcG5nc3Rlc3QudGd0DQorMA0KKzENCisxOQ0KZGlmZiAtLWdpdCBhL2xpYnBuZy9wcm9qZWN0cy9vd2F0Y29tL3BuZ2NvbmZpZy5tYWsgYi9saWJwbmcvcHJvamVjdHMvb3dhdGNvbS9wbmdjb25maWcubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NGEzZmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvcHJvamVjdHMvb3dhdGNvbS9wbmdjb25maWcubWFrCkBAIC0wLDAgKzEsMTYwIEBACisjIFRoaXMgaXMgYW4gT3BlbldhdGNvbSBtYWtlIGZpbGUgd2hpY2ggYnVpbGRzIHBuZ2xpYmNvbmYuaCAtIHRoZSBsaWJwbmcNCisjIGNvbmZpZ3VyYXRpb24gaGVhZGVyLiAgWW91IGNhbiBpZ25vcmUgdGhpcyBmaWxlIGlmIHlvdSBkb24ndCBuZWVkIHRvDQorIyBjb25maWd1cmUgbGlicG5nOyBhIGRlZmF1bHQgY29uZmlndXJhdGlvbiB3aWxsIGJlIGJ1aWx0Lg0KKyMNCisjIEZvciBtb3JlIGluZm9ybWF0aW9uIGJ1aWxkIGxpYnBuZy53cGogdW5kZXIgdGhlIElERSBhbmQgdGhlbiByZWFkIHRoZQ0KKyMgZ2VuZXJhdGVkIGZpbGVzOg0KKyMNCisjICAgIGNvbmZpZy5pbmY6IEJhc2ljIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIGEgc3RhbmRhcmQgYnVpbGQuDQorIyAgICBwbmdjb25maWcuZGZhOiBBZHZhbmNlZCBjb25maWd1cmF0aW9uIGZvciBub24tc3RhbmRhcmQgbGlicG5nIGJ1aWxkcy4NCisjDQorREVMRVRFPXJtIC1mDQorRUNITz1lY2hvDQorQ09QWT1jb3B5DQorIw0KKyMgSWYgeW91ciBjb25maWd1cmF0aW9uIG5lZWRzIHRvIHRlc3QgY29tcGlsZXIgZmxhZ3Mgd2hlbiBidWlsZGluZw0KKyMgcG5nbGliY29uZi5oIHlvdSBtYXkgbmVlZCB0byBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG9uIHRoZSB3bWFrZSBjb21tYW5kDQorIyBsaW5lOg0KK0NGTEFHUz0NCitDQz13Y2wzODYNCitDUFA9JChDQykgLXB3MA0KKyMNCisjIFJlYWQgYXdrIGZyb20gdGhlIGVudmlyb25tZW50IGlmIHNldCwgZWxzZSBpdCBjYW4gYmUgc2V0IG9uIHRoZSBjb21tYW5kDQorIyBsaW5lICh0aGUgZGVmYXVsdCBhcHByb2FjaCBpcyB0byBzZXQgdGhlICVhd2slIGVudmlyb25tZW50IHZhcmlhYmxlIGluIHRoZQ0KKyMgSURFIGxpYnBuZy53cGogJ2JlZm9yZScgcnVsZSAtIHRoaXMgc2V0dGluZyBpcyBsb2NhbC4pDQorIWlmZGVmICVhd2sNCitBV0s9JCglYXdrKQ0KKyFlbmRpZg0KKyMNCisjIHBuZ2xpYmNvbmYuaCBtdXN0IGV4aXN0IGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LCB0aGlzIGlzIHRoZSBmaW5hbCBydWxlDQorIyB3aGljaCBjb3BpZXMgdGhlIGxvY2FsIGJ1aWx0IHZlcnNpb24gKGFuZCB0aGlzIGlzIHRoZSBkZWZhdWx0IHRhcmdldCBmb3INCisjIHRoaXMgbWFrZWZpbGUuKQ0KKy4uXC4uXHBuZ2xpYmNvbmYuaDogcG5nbGliY29uZi5oDQorICQoQ09QWSkgcG5nbGliY29uZi5oICRADQorDQorIWlmZGVmIEFXSw0KKyMgQ1BQRkxBR1Mgc2hvdWxkIGNvbnRhaW4gdGhlIG9wdGlvbnMgdG8gY29udHJvbCB0aGUgcmVzdWx0LA0KKyMgYnV0IERFRlMgYW5kIENGTEFHUyBhcmUgYWxzbyBzdXBwb3J0ZWQgaGVyZSwgb3ZlcnJpZGUNCisjIGFzIGFwcHJvcHJpYXRlDQorREZORkxBR1MgPSAkKERFRlMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKQ0KKw0KK3BuZ2xpYmNvbmYuaDogcG5nbGliY29uZi5kZm4NCisgJChERUxFVEUpICRAIGRmbi5jIGRmbjEub3V0IGRmbjIub3V0DQorICQoRUNITykgJCNpbmNsdWRlICJwbmdsaWJjb25mLmRmbiIgPmRmbi5jDQorICQoQ1BQKSAkKERGTkZMQUdTKSBkZm4uYyA+ZGZuMS5vdXQNCisgJChBV0spIC1mIDw8IGRmbjEub3V0ID5kZm4yLm91dA0KKy9eLipQTkdfREVGTl9NQUdJQy0uKi1QTkdfREVGTl9FTkQuKiQkL3sNCisgc3ViKC9eLipQTkdfREVGTl9NQUdJQy0vLCAiIikNCisgc3ViKC8gKi1QTkdfREVGTl9FTkQuKiQkLywgIiIpDQorIGdzdWIoLyAqQEBAICovLCAiIikNCisgcHJpbnQNCit9DQorPDwNCisgJChDT1BZKSBkZm4yLm91dCAkQA0KKyBAdHlwZSA8PCA+cG5nY29uZmlnLmluZg0KK1RoaXMgaXMgYSBsb2NhbGx5IGNvbmZpZ3VyYWJsZSBidWlsZCBvZiBsaWJwbmcubGliOyBmb3IgY29uZmlndXJhdGlvbg0KK2luc3RydWN0aW9ucyBjb25zdWx0IGFuZCBlZGl0IHByb2plY3RzL29wZW53YXRjb20vcG5nY29uZmlnLmRmYQ0KKzw8DQorICQoREVMRVRFKSBkZm4uYyBkZm4xLm91dCBkZm4yLm91dA0KKw0KK3BuZ2xpYmNvbmYuZGZuOiAuLlwuLlxzY3JpcHRzXHBuZ2xpYmNvbmYuZGZhIC4uXC4uXHNjcmlwdHNcb3B0aW9ucy5hd2sgcG5nY29uZmlnLmRmYSAuLlwuLlxwbmdjb25mLmgNCisgJChERUxFVEUpICRAIGRmbjEub3V0IGRmbjIub3V0DQorICQoQVdLKSAtZiAuLlwuLlxzY3JpcHRzXG9wdGlvbnMuYXdrIG91dD1kZm4xLm91dCB2ZXJzaW9uPXNlYXJjaCAuLlwuLlxwbmdjb25mLmggLi5cLi5cc2NyaXB0c1xwbmdsaWJjb25mLmRmYSBwbmdjb25maWcuZGZhICQoREZBX1hUUkEpIDE+JjINCisgJChBV0spIC1mIC4uXC4uXHNjcmlwdHNcb3B0aW9ucy5hd2sgb3V0PWRmbjIub3V0IGRmbjEub3V0IDE+JjINCisgJChDT1BZKSBkZm4yLm91dCAkQA0KKyAkKERFTEVURSkgZGZuMS5vdXQgZGZuMi5vdXQNCisNCishZWxzZQ0KKyMgVGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgdXNlZCB0byBjb3B5IHNjcmlwdHNccG5nbGliY29uZi5oLnByZWJ1aWx0IGFuZCBtYWtlDQorIyB0aGUgcmVxdWlyZWQgY2hhbmdlIHRvIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24uDQorIw0KKyMgQnkgZGVmYXVsdCBsaWJwbmcgaXMgYnVpbHQgdG8gdXNlIHRoZSBfX2NkZWNsIGNhbGxpbmcgY29udmVudGlvbiBvbg0KKyMgV2luZG93cy4gIFRoaXMgZ2l2ZXMgY29tcGF0aWJpbGl0eSB3aXRoIE1TVkMgYW5kIEdDQy4gIFVuZm9ydHVuYXRlbHkgaXQNCisjIGRvZXMgbm90IHdvcmsgd2l0aCBPcGVuV2F0Y29tIGJlY2F1c2UgT3BlbldhdGNvbSBpbXBsZW1lbnRzIGxvbmdqbXAgdXNpbmcNCisjIHRoZSBfX3dhdGNhbGwgY29udmVudGlvbiAoY29tcGFyZWQgd2l0aCBib3RoIE1TVkMgYW5kIEdDQyB3aGljaCB1c2UgX19jZGVjbA0KKyMgZm9yIGxpYnJhcnkgZnVuY3Rpb25zLikNCisjDQorIyBUaHVzIHRoZSBkZWZhdWx0IG11c3QgYmUgY2hhbmdlZCB0byBidWlsZCBvbiBPcGVuV2F0Y29tIGFuZCwgb25jZSBjaGFuZ2VkLA0KKyMgdGhlIHJlc3VsdCB3aWxsIG5vdCBiZSBjb21wYXRpYmxlIHdpdGggYXBwbGljYXRpb25zIGJ1aWx0IHVzaW5nIG90aGVyDQorIyBjb21waWxlcnMgKGluIGZhY3QgYXR0ZW1wdHMgdG8gYnVpbGQgd2lsbCBmYWlsIGF0IGNvbXBpbGUgdGltZS4pDQorIw0KK3BuZ2xpYmNvbmYuaDogLi5cLi5cc2NyaXB0c1xwbmdsaWJjb25mLmgucHJlYnVpbHQgLmV4aXN0c29ubHkNCisgQCQoRUNITykgLg0KKyBAJChFQ0hPKSAuDQorIEAkKEVDSE8pICQkKEFXSykgTk9UIEFWQUlMQUJMRTogQ09QWUlORyBzY3JpcHRzXHBuZ2xpYmNvbmYuaC5wcmVidWlsdA0KKyBAJChFQ0hPKSAuDQorIEAkKEVDSE8pIC4NCisgdmkgLXEgLWsgIjoxLCQkcy9QTkdfQVBJX1JVTEUgMCQkL1BOR19BUElfUlVMRSAyL1xuOnchICRAXG46cSFcbiIgLi5cLi5cc2NyaXB0c1xwbmdsaWJjb25mLmgucHJlYnVpbHQNCisgQCQoRUNITykgLg0KKyBAJChFQ0hPKSAuDQorIEAkKEVDSE8pIFlPVSBIQVZFIEEgREVGQVVMVCBDT05GSUdVUkFUSU9OIEJFQ0FVU0UgWU9VIERPIE5PVCBIQVZFIEFXSyENCisgQCQoRUNITykgLg0KKyBAJChFQ0hPKSAuDQorIEB0eXBlIDw8ID5wbmdjb25maWcuaW5mDQorVGhpcyBpcyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIGxpYnBuZy5saWIsIGlmIHlvdSB3aXNoIHRvDQorY2hhbmdlIHRoZSBjb25maWd1cmF0aW9uIHBsZWFzZSBjb25zdWx0IHRoZSBpbnN0cnVjdGlvbnMgaW4NCitwcm9qZWN0cy9vd2F0Y29tL3BuZ2NvbmZpZy5kZmEuDQorPDwNCisNCishZW5kaWYNCisNCisjIE1ha2UgdGhlIGRlZmF1bHQgZmlsZXMNCitkZWZhdWx0czogLnN5bWJvbGljDQorIEAkKENPUFkpIDw8IGNvbmZpZy5pbmYNCiskIyBUaGUgbGlicG5nIHByb2plY3QgaXMgaW5jb21wbGV0ZWx5IGNvbmZpZ3VyZWQuICBUbyBjb21wbGV0ZSBjb25maWd1cmF0aW9uDQorJCMgcGxlYXNlIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6DQorJCMNCiskIyAgIDEpIEVkaXQgdGhlICdiZWZvcmUnIHJ1bGUgb2YgbGlicG5nLndwaiAoZnJvbSB0aGUgSURFKSB0byBkZWZpbmUgdGhlDQorJCMgICAgICBsb2NhdGlvbnMgb2YgdGhlIHpsaWIgaW5jbHVkZSBmaWxlIHpsaWIuaCBhbmQgdGhlIGJ1aWx0IHpsaWIgbGlicmFyeSwNCiskIyAgICAgIHpsaWIubGliLg0KKyQjDQorJCMgICAyKSBJZiB5b3Ugd2FudCB0byBjaGFuZ2UgbGlicG5nIHRvIGEgbm9uLXN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gYWxzbw0KKyQjICAgICAgY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mICdhd2snIGluIHRoZSBiZWZvcmUgcnVsZSB0byB0aGUgbmFtZSBvZiB5b3VyDQorJCMgICAgICBhd2sgY29tbWFuZC4gIEZvciBtb3JlIGluc3RydWN0aW9ucyBvbiBjb25maWd1cmF0aW9uIHJlYWQNCiskIyAgICAgIHBuZ2NvbmZpZy5kZmEuDQorJCMNCiskIyAgIDMpIERlbGV0ZSB0aGlzIGZpbGUgKGNvbmZpZy5pbmYpLg0KKzw8DQorIEAkKENPUFkpIDw8IHBuZ2NvbmZpZy5kZmENCiskIyBwbmdjb25maWcuZGZhOiB0aGlzIGZpbGUgY29udGFpbnMgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBsaWJwbmcuDQorJCMgSWYgZW10cHkgdGhlIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBidWlsdC4gIEZvciB0aGlzIGZpbGUgdG8gYmUNCiskIyB1c2VkIGEgd29ya2luZyB2ZXJzaW9uIG9mIHRoZSBwcm9ncmFtICdhd2snIGlzIHJlcXVpcmVkIGFuZCB0aGUgcHJvZ3JhbQ0KKyQjIG11c3QgYmUgaWRlbnRpZmllZCBpbiB0aGUgJ2JlZm9yZScgcnVsZSBvZiB0aGUgcHJvamVjdC4NCiskIw0KKyQjIElmIHlvdSBkb24ndCBhbHJlYWR5IGhhdmUgJ2F3aycsIG9yIHRoZSB2ZXJzaW9uIG9mIGF3ayB5b3UgaGF2ZSBzZWVtcyBub3QNCiskIyB0byB3b3JrLCBkb3dubG9hZCBCcmlhbiBLZXJuaWdoYW4ncyBhd2sgKEJyaWFuIEtlcm5pZ2hhbiBpcyB0aGUgYXV0aG9yIG9mDQorJCMgYXdrLikgIFlvdSBjYW4gZmluZCBzb3VyY2UgY29kZSBhbmQgYSBidWlsdCBleGVjdXRhYmxlIChjYWxsZWQgYXdrOTUuZXhlKQ0KKyQjIGhlcmU6DQorJCMNCiskIyAgICAgaHR0cDovL3d3dy5jcy5wcmluY2V0b24uZWR1L35id2svYnRsLm1pcnJvci8NCiskIw0KKyQjIFRoZSBleGVjdXRhYmxlIHdvcmtzIGp1c3QgZmluZS4NCiskIw0KKyQjIElmIGJ1aWxkIGlzc3VlcyBlcnJvcnMgYWZ0ZXIgYSBjaGFuZ2UgdG8gcG5nY29uZmlnLmRmYSB5b3UgaGF2ZSBlbnRlcmVkDQorJCMgaW5jb25zaXN0ZW50IGZlYXR1cmUgcmVxdWVzdHMsIG9yIGV2ZW4gbWFsZm9ybWVkIHJlcXVlc3RzLCBpbg0KKyQjIHBuZ2NvbmZpZy5kZmEuICBUaGUgZXJyb3IgbWVzc2FnZXMgZnJvbSBhd2sgc2hvdWxkIGJlIGNvbXByZWhlbnNpYmxlLCBidXQNCiskIyBpZiBub3Qgc2ltcGx5IGdvIGJhY2sgdG8gdGhlIHN0YXJ0IChub3RoaW5nIGJ1dCBjb21tZW50cyBpbiB0aGlzIGZpbGUpIGFuZA0KKyQjIGVudGVyIGNvbmZpZ3VyYXRpb24gbGluZXMgb25lIGJ5IG9uZSB1bnRpbCBvbmUgcHJvZHVjZXMgYW4gZXJyb3IuICAoT3IsIG9mDQorJCMgY291cnNlLCBkbyB0aGUgc3RhbmRhcmQgYmluYXJ5IGNob3AuKQ0KKyQjDQorJCMgWW91IG5lZWQgdG8gcmVidWlsZCBldmVyeXRoaW5nIGFmdGVyIGEgY2hhbmdlIHRvIHBuZ2xpYmNvbmYuZGZhIC0gaS5lLiB5b3UNCiskIyBtdXN0IGRvIEFjdGlvbnMvTWFyayBBbGwgVGFyZ2V0cyBmb3IgUmVtYWtlLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBjb21waWxlcg0KKyQjIGdlbmVyYXRlZCBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIChhcyBvZiBPcGVuV2F0Y29tIDEuOSkgZG9lcyBub3QgcmVjb3JkIHRoZQ0KKyQjIGRlcGVuZGVuY3kgb24gcG5nbGliY29uZi5oIGNvcnJlY3RseS4NCiskIw0KKyQjIElmIGF3ayBpc24ndCBzZXQgdGhlbiB0aGlzIGZpbGUgaXMgYnlwYXNzZWQuICBJZiB5b3UganVzdCB3YW50IHRoZSBzdGFuZGFyZA0KKyQjIGNvbmZpZ3VyYXRpb24gaXQgaXMgYXV0b21hdGljYWxseSBwcm9kdWNlZCBmcm9tIHRoZSBkaXN0cmlidXRlZCB2ZXJzaW9uDQorJCMgKHNjcmlwdHNccG5nbGliY29uZi5oLnByZWJ1aWx0KSBieSBlZGl0dGluZyBQTkdfQVBJX1JVTEUgdG8gMiAodG8gZm9yY2UgdXNlDQorJCMgb2YgdGhlIE9wZW5XYXRjb20gbGlicmFyeSBjYWxsaW5nIGNvbnZlbnRpb24uKQ0KKyQjDQorPDwNCisNCitjbGVhbjo6IC5zeW1ib2xpYw0KKyAkKERFTEVURSkgLi5cLi5ccG5nbGliY29uZi5oIHBuZ2xpYmNvbmYuKiBkZm4uYyAqLm91dCBwbmdjb25maWcuaW5mDQorICQoREVMRVRFKSAqLm9iaiAqLm1iciAqLnN5bSAqLmVyciAqLnBjaCBsaWJwbmcubWsNCisgJChERUxFVEUpIGxpYnBuZy5saWIgbGlicG5nLmxiciBsaWJwbmcubGIxIGxpYnBuZy5jYnIgbGlicG5nLm1rMQ0KKyAkKERFTEVURSkgcG5ndGVzdC5leGUgcG5ndGVzdC5tYXAgcG5ndGVzdC5sazEgcG5ndGVzdC5tazENCisgJChERUxFVEUpIHBuZ3ZhbGlkLmV4ZSBwbmd2YWxpZC5tYXAgcG5ndmFsaWQubGsxIHBuZ3ZhbGlkLm1rMQ0KKw0KK2Rpc3RjbGVhbjo6IGNsZWFuIC5zeW1ib2xpYw0KKyAkKERFTEVURSkgemxpYi5pbmYgYXdrLmluZiBjb25maWcuaW5mIHBuZ2NvbmZpZy5kZmENCmRpZmYgLS1naXQgYS9saWJwbmcvcHJvamVjdHMvb3dhdGNvbS9wbmdzdGVzdC50Z3QgYi9saWJwbmcvcHJvamVjdHMvb3dhdGNvbS9wbmdzdGVzdC50Z3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVkMDI0NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9wcm9qZWN0cy9vd2F0Y29tL3BuZ3N0ZXN0LnRndApAQCAtMCwwICsxLDIxOSBAQAorNDANCit0YXJnZXRJZGVudA0KKzANCitNUHJvamVjdA0KKzENCitNQ29tcG9uZW50DQorMA0KKzINCitXU3RyaW5nDQorNA0KK05FWEUNCiszDQorV1N0cmluZw0KKzUNCituYzJlbg0KKzENCiswDQorMA0KKzQNCitNQ29tbWFuZA0KKzANCis1DQorTUNvbW1hbmQNCisxMTE4DQorcG5nc3Rlc3QgLS1zdHJpY3QgLS1sb2cgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwMS5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwMi5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwNC5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwOC5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcxNi5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMmMwOC5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMmMxNi5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwMS5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwMi5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwNC5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwOC5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuNGEwOC5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuNGExNi5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuNmEwOC5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuNmExNi5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJibjBnMDQucG5nIC4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4wZzAxLnBuZyAuLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YmJuMGcwMi5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJibjJjMTYucG5nIC4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4zcDA4LnBuZyAuLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YmduMmMxNi5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJnbjNwMDgucG5nIC4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRicm4yYzA4LnBuZyAuLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YnduMGcxNi5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJ3bjNwMDgucG5nIC4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRieW4zcDA4LnBuZyAuLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0cDBuMGcwOC5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdHAwbjJjMDgucG5nIC4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRwMG4zcDA4LnBuZyAuLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0cDFuM3AwOC5wbmcNCis2DQorTUl0ZW0NCisxMg0KK3BuZ3N0ZXN0LmV4ZQ0KKzcNCitXU3RyaW5nDQorNA0KK05FWEUNCis4DQorV1ZMaXN0DQorNg0KKzkNCitNVlN0YXRlDQorMTANCitXU3RyaW5nDQorNw0KK1dJTkxJTksNCisxMQ0KK1dTdHJpbmcNCisxMQ0KKz8/Pz8/U3RhY2s6DQorMQ0KKzEyDQorV1N0cmluZw0KKzQNCis3NjhrDQorMA0KKzEzDQorTVZTdGF0ZQ0KKzE0DQorV1N0cmluZw0KKzcNCitXSU5MSU5LDQorMTUNCitXU3RyaW5nDQorMjgNCis/Pz8/P0xpYnJhcnkgZGlyZWN0b3JpZXMoOyk6DQorMQ0KKzE2DQorV1N0cmluZw0KKzgNCiskKCV6bGliKQ0KKzANCisxNw0KK01WU3RhdGUNCisxOA0KK1dTdHJpbmcNCis3DQorV0lOTElOSw0KKzE5DQorV1N0cmluZw0KKzE4DQorPz8/Pz9MaWJyYXJpZXMoLCk6DQorMQ0KKzIwDQorV1N0cmluZw0KKzE5DQorbGlicG5nLmxpYiB6bGliLmxpYg0KKzANCisyMQ0KK01WU3RhdGUNCisyMg0KK1dTdHJpbmcNCis3DQorV0lOTElOSw0KKzIzDQorV1N0cmluZw0KKzExDQorPz8/Pz9TdGFjazoNCiswDQorMjQNCitXU3RyaW5nDQorNA0KKzc2OGsNCiswDQorMjUNCitNVlN0YXRlDQorMjYNCitXU3RyaW5nDQorNw0KK1dJTkxJTksNCisyNw0KK1dTdHJpbmcNCisyOA0KKz8/Pz8/TGlicmFyeSBkaXJlY3Rvcmllcyg7KToNCiswDQorMjgNCitXU3RyaW5nDQorOA0KKyQoJXpsaWIpDQorMA0KKzI5DQorTVZTdGF0ZQ0KKzMwDQorV1N0cmluZw0KKzcNCitXSU5MSU5LDQorMzENCitXU3RyaW5nDQorMTgNCis/Pz8/P0xpYnJhcmllcygsKToNCiswDQorMzINCitXU3RyaW5nDQorMTkNCitsaWJwbmcubGliIHpsaWIubGliDQorMA0KKzMzDQorV1ZMaXN0DQorMQ0KKzM0DQorQWN0aW9uU3RhdGVzDQorMzUNCitXU3RyaW5nDQorNA0KKyZSdW4NCiszNg0KK1dWTGlzdA0KKzANCistMQ0KKzENCisxDQorMA0KKzM3DQorV1BpY2tMaXN0DQorMg0KKzM4DQorTUl0ZW0NCiszDQorKi5jDQorMzkNCitXU3RyaW5nDQorNA0KK0NPQkoNCis0MA0KK1dWTGlzdA0KKzINCis0MQ0KK01WU3RhdGUNCis0Mg0KK1dTdHJpbmcNCiszDQorV0NDDQorNDMNCitXU3RyaW5nDQorMjUNCituPz8/P0luY2x1ZGUgZGlyZWN0b3JpZXM6DQorMQ0KKzQ0DQorV1N0cmluZw0KKzM5DQorIiQoJXpsaWIpOyQoJXdhdGNvbSkvaDskKCV3YXRjb20pL2gvbnQiDQorMA0KKzQ1DQorTVZTdGF0ZQ0KKzQ2DQorV1N0cmluZw0KKzMNCitXQ0MNCis0Nw0KK1dTdHJpbmcNCisyNQ0KK24/Pz8/SW5jbHVkZSBkaXJlY3RvcmllczoNCiswDQorNDgNCitXU3RyaW5nDQorMzkNCisiJCglemxpYik7JCgld2F0Y29tKS9oOyQoJXdhdGNvbSkvaC9udCINCiswDQorNDkNCitXVkxpc3QNCiswDQorLTENCisxDQorMQ0KKzANCis1MA0KK01JdGVtDQorMzMNCisuLlwuLlxjb250cmliXGxpYnRlc3RzXHBuZ3N0ZXN0LmMNCis1MQ0KK1dTdHJpbmcNCis0DQorQ09CSg0KKzUyDQorV1ZMaXN0DQorMA0KKzUzDQorV1ZMaXN0DQorMA0KKzM4DQorMQ0KKzENCiswDQpkaWZmIC0tZ2l0IGEvbGlicG5nL3Byb2plY3RzL293YXRjb20vcG5ndGVzdC50Z3QgYi9saWJwbmcvcHJvamVjdHMvb3dhdGNvbS9wbmd0ZXN0LnRndApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTFmMWE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3Byb2plY3RzL293YXRjb20vcG5ndGVzdC50Z3QKQEAgLTAsMCArMSwxNzkgQEAKKzQwDQordGFyZ2V0SWRlbnQNCiswDQorTVByb2plY3QNCisxDQorTUNvbXBvbmVudA0KKzANCisyDQorV1N0cmluZw0KKzQNCitORVhFDQorMw0KK1dTdHJpbmcNCis1DQorbmMyZW4NCisxDQorMA0KKzANCis0DQorTUNvbW1hbmQNCiswDQorNQ0KK01Db21tYW5kDQorMzQNCitjZCAuLlwuLg0KK3Byb2plY3RzXG93YXRjb21ccG5ndGVzdA0KKzYNCitNSXRlbQ0KKzExDQorcG5ndGVzdC5leGUNCis3DQorV1N0cmluZw0KKzQNCitORVhFDQorOA0KK1dWTGlzdA0KKzQNCis5DQorTVZTdGF0ZQ0KKzEwDQorV1N0cmluZw0KKzcNCitXSU5MSU5LDQorMTENCitXU3RyaW5nDQorMjgNCis/Pz8/P0xpYnJhcnkgZGlyZWN0b3JpZXMoOyk6DQorMQ0KKzEyDQorV1N0cmluZw0KKzgNCiskKCV6bGliKQ0KKzANCisxMw0KK01WU3RhdGUNCisxNA0KK1dTdHJpbmcNCis3DQorV0lOTElOSw0KKzE1DQorV1N0cmluZw0KKzE4DQorPz8/Pz9MaWJyYXJpZXMoLCk6DQorMQ0KKzE2DQorV1N0cmluZw0KKzE5DQorbGlicG5nLmxpYiB6bGliLmxpYg0KKzANCisxNw0KK01WU3RhdGUNCisxOA0KK1dTdHJpbmcNCis3DQorV0lOTElOSw0KKzE5DQorV1N0cmluZw0KKzI4DQorPz8/Pz9MaWJyYXJ5IGRpcmVjdG9yaWVzKDspOg0KKzANCisyMA0KK1dTdHJpbmcNCis4DQorJCglemxpYikNCiswDQorMjENCitNVlN0YXRlDQorMjINCitXU3RyaW5nDQorNw0KK1dJTkxJTksNCisyMw0KK1dTdHJpbmcNCisxOA0KKz8/Pz8/TGlicmFyaWVzKCwpOg0KKzANCisyNA0KK1dTdHJpbmcNCisxOQ0KK2xpYnBuZy5saWIgemxpYi5saWINCiswDQorMjUNCitXVkxpc3QNCiswDQorLTENCisxDQorMQ0KKzANCisyNg0KK1dQaWNrTGlzdA0KKzINCisyNw0KK01JdGVtDQorMw0KKyouYw0KKzI4DQorV1N0cmluZw0KKzQNCitDT0JKDQorMjkNCitXVkxpc3QNCisyDQorMzANCitNVlN0YXRlDQorMzENCitXU3RyaW5nDQorMw0KK1dDQw0KKzMyDQorV1N0cmluZw0KKzI1DQorbj8/Pz9JbmNsdWRlIGRpcmVjdG9yaWVzOg0KKzENCiszMw0KK1dTdHJpbmcNCiszOQ0KKyIkKCV6bGliKTskKCV3YXRjb20pL2g7JCgld2F0Y29tKS9oL250Ig0KKzANCiszNA0KK01WU3RhdGUNCiszNQ0KK1dTdHJpbmcNCiszDQorV0NDDQorMzYNCitXU3RyaW5nDQorMjUNCituPz8/P0luY2x1ZGUgZGlyZWN0b3JpZXM6DQorMA0KKzM3DQorV1N0cmluZw0KKzM5DQorIiQoJXpsaWIpOyQoJXdhdGNvbSkvaDskKCV3YXRjb20pL2gvbnQiDQorMA0KKzM4DQorV1ZMaXN0DQorMA0KKy0xDQorMQ0KKzENCiswDQorMzkNCitNSXRlbQ0KKzE1DQorLi5cLi5ccG5ndGVzdC5jDQorNDANCitXU3RyaW5nDQorNA0KK0NPQkoNCis0MQ0KK1dWTGlzdA0KKzANCis0Mg0KK1dWTGlzdA0KKzANCisyNw0KKzENCisxDQorMA0KZGlmZiAtLWdpdCBhL2xpYnBuZy9wcm9qZWN0cy9vd2F0Y29tL3BuZ3ZhbGlkLnRndCBiL2xpYnBuZy9wcm9qZWN0cy9vd2F0Y29tL3BuZ3ZhbGlkLnRndApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTc4ZTc1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3Byb2plY3RzL293YXRjb20vcG5ndmFsaWQudGd0CkBAIC0wLDAgKzEsMjEwIEBACis0MA0KK3RhcmdldElkZW50DQorMA0KK01Qcm9qZWN0DQorMQ0KK01Db21wb25lbnQNCiswDQorMg0KK1dTdHJpbmcNCis0DQorTkVYRQ0KKzMNCitXU3RyaW5nDQorNQ0KK25jMmVuDQorMQ0KKzANCiswDQorNA0KK01Db21tYW5kDQorMA0KKzUNCitNQ29tbWFuZA0KKzgNCitwbmd2YWxpZA0KKzYNCitNSXRlbQ0KKzEyDQorcG5ndmFsaWQuZXhlDQorNw0KK1dTdHJpbmcNCis0DQorTkVYRQ0KKzgNCitXVkxpc3QNCis2DQorOQ0KK01WU3RhdGUNCisxMA0KK1dTdHJpbmcNCis3DQorV0lOTElOSw0KKzExDQorV1N0cmluZw0KKzExDQorPz8/Pz9TdGFjazoNCisxDQorMTINCitXU3RyaW5nDQorNA0KKzc2OGsNCiswDQorMTMNCitNVlN0YXRlDQorMTQNCitXU3RyaW5nDQorNw0KK1dJTkxJTksNCisxNQ0KK1dTdHJpbmcNCisyOA0KKz8/Pz8/TGlicmFyeSBkaXJlY3Rvcmllcyg7KToNCisxDQorMTYNCitXU3RyaW5nDQorOA0KKyQoJXpsaWIpDQorMA0KKzE3DQorTVZTdGF0ZQ0KKzE4DQorV1N0cmluZw0KKzcNCitXSU5MSU5LDQorMTkNCitXU3RyaW5nDQorMTgNCis/Pz8/P0xpYnJhcmllcygsKToNCisxDQorMjANCitXU3RyaW5nDQorMTkNCitsaWJwbmcubGliIHpsaWIubGliDQorMA0KKzIxDQorTVZTdGF0ZQ0KKzIyDQorV1N0cmluZw0KKzcNCitXSU5MSU5LDQorMjMNCitXU3RyaW5nDQorMTENCis/Pz8/P1N0YWNrOg0KKzANCisyNA0KK1dTdHJpbmcNCis0DQorNzY4aw0KKzANCisyNQ0KK01WU3RhdGUNCisyNg0KK1dTdHJpbmcNCis3DQorV0lOTElOSw0KKzI3DQorV1N0cmluZw0KKzI4DQorPz8/Pz9MaWJyYXJ5IGRpcmVjdG9yaWVzKDspOg0KKzANCisyOA0KK1dTdHJpbmcNCis4DQorJCglemxpYikNCiswDQorMjkNCitNVlN0YXRlDQorMzANCitXU3RyaW5nDQorNw0KK1dJTkxJTksNCiszMQ0KK1dTdHJpbmcNCisxOA0KKz8/Pz8/TGlicmFyaWVzKCwpOg0KKzANCiszMg0KK1dTdHJpbmcNCisxOQ0KK2xpYnBuZy5saWIgemxpYi5saWINCiswDQorMzMNCitXVkxpc3QNCiswDQorLTENCisxDQorMQ0KKzANCiszNA0KK1dQaWNrTGlzdA0KKzINCiszNQ0KK01JdGVtDQorMw0KKyouYw0KKzM2DQorV1N0cmluZw0KKzQNCitDT0JKDQorMzcNCitXVkxpc3QNCisyDQorMzgNCitNVlN0YXRlDQorMzkNCitXU3RyaW5nDQorMw0KK1dDQw0KKzQwDQorV1N0cmluZw0KKzI1DQorbj8/Pz9JbmNsdWRlIGRpcmVjdG9yaWVzOg0KKzENCis0MQ0KK1dTdHJpbmcNCiszOQ0KKyIkKCV6bGliKTskKCV3YXRjb20pL2g7JCgld2F0Y29tKS9oL250Ig0KKzANCis0Mg0KK01WU3RhdGUNCis0Mw0KK1dTdHJpbmcNCiszDQorV0NDDQorNDQNCitXU3RyaW5nDQorMjUNCituPz8/P0luY2x1ZGUgZGlyZWN0b3JpZXM6DQorMA0KKzQ1DQorV1N0cmluZw0KKzM5DQorIiQoJXpsaWIpOyQoJXdhdGNvbSkvaDskKCV3YXRjb20pL2gvbnQiDQorMA0KKzQ2DQorV1ZMaXN0DQorMA0KKy0xDQorMQ0KKzENCiswDQorNDcNCitNSXRlbQ0KKzMzDQorLi5cLi5cY29udHJpYlxsaWJ0ZXN0c1xwbmd2YWxpZC5jDQorNDgNCitXU3RyaW5nDQorNA0KK0NPQkoNCis0OQ0KK1dWTGlzdA0KKzANCis1MA0KK1dWTGlzdA0KKzANCiszNQ0KKzENCisxDQorMA0KZGlmZiAtLWdpdCBhL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvUFJKMDA0MS5tYWsgYi9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1BSSjAwNDEubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YTY4YjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1BSSjAwNDEubWFrCkBAIC0wLDAgKzEsMjEgQEAKKyMgUHJldmVudCAiQ2Fubm90IGZpbmQgbWlzc2luZyBkZXBlbmRlbmN5Li4uIiB3YXJuaW5ncyB3aGlsZSBjb21waWxpbmcKKyMgcG5nd2luLnJjIChQUkowMDQxKS4KKworYWxsOiAkKEludERpcilcYWxsb2MuaCBcCisJICQoSW50RGlyKVxmcC5oIFwKKwkgJChJbnREaXIpXG02ODg4MS5oIFwKKwkgJChJbnREaXIpXG1lbS5oIFwKKwkgJChJbnREaXIpXHBuZ3Vzci5oIFwKKwkgJChJbnREaXIpXHN0cmluZ3MuaCBcCisJICQoSW50RGlyKVx1bmlzdGQuaCBcCisJICQoSW50RGlyKVx1bml4aW8uaAorCiskKEludERpcilcYWxsb2MuaCBcCiskKEludERpcilcZnAuaCBcCiskKEludERpcilcbTY4ODgxLmggXAorJChJbnREaXIpXG1lbS5oIFwKKyQoSW50RGlyKVxwbmd1c3IuaCBcCiskKEludERpcilcc3RyaW5ncy5oIFwKKyQoSW50RGlyKVx1bmlzdGQuaCBcCiskKEludERpcilcdW5peGlvLmg6CisJQCFlY2hvLj4kQApkaWZmIC0tZ2l0IGEvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9SRUFETUUudHh0IGIvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NTY1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1JFQURNRS50eHQKQEAgLTAsMCArMSw1OCBAQAorTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA3LjEwIGZvciBsaWJwbmcuCisKK0NvcHlyaWdodCAoQykgMjAwNCBTaW1vbi1QaWVycmUgQ2FkaWV1eC4KKworVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KK0ZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwbmcuaAorCitOT1RFOiBUaGlzIHByb2plY3Qgd2lsbCBiZSByZW1vdmVkIGZyb20gbGlicG5nLTEuNS4wLiAgSXQgaGFzCitiZWVuIHJlcGxhY2VkIHdpdGggdGhlICJ2c3R1ZGlvIiBwcm9qZWN0LgorCitBc3N1bXB0aW9uczoKKyogVGhlIGxpYnBuZyBzb3VyY2UgZmlsZXMgYXJlIGluIC4uXC4uCisqIFRoZSB6bGliIHNvdXJjZSBmaWxlcyBhcmUgaW4gLi5cLi5cLi5cemxpYgorKiBUaGUgemxpYiBwcm9qZWN0IGZpbGUgaXMgaW4gLiAvKiBXYXJuaW5nOiBUaGlzIGlzIHVudGlsIHRoZSB6bGliIHByb2plY3QKKyAgZmlsZXMgZ2V0IGludGVyZ3JhdGVkIGludG8gdGhlIG5leHQgemxpYiByZWxlYXNlLiBUaGUgZmluYWwgemxpYiBwcm9qZWN0CisgIGRpcmVjdG9yeSB3aWxsIHRoZW4gYmUgLi5cLi5cLi5cemxpYlxwcm9qZWN0c1x2aXN1YWxjNzEuICovCisKK1RvIHVzZToKKworMSkgT24gdGhlIG1haW4gbWVudSwgc2VsZWN0ICJGaWxlIHwgT3BlbiBTb2x1dGlvbiIuCisgICBPcGVuICJsaWJwbmcuc2xuIi4KKworMikgRGlzcGxheSB0aGUgU29sdXRpb24gRXhwbG9yZXIgdmlldyAoQ3RybCtBbHQrTCkKKworMykgU2V0IG9uZSBvZiB0aGUgcHJvamVjdCBhcyB0aGUgU3RhcnRVcCBwcm9qZWN0LiBJZiB5b3UganVzdCB3YW50IHRvIGJ1aWxkIHRoZQorICAgYmluYXJpZXMgc2V0ICJsaWJwbmciIGFzIHRoZSBzdGFydHVwIHByb2plY3QgKFNlbGVjdCAibGlicG5nIiB0cmVlIHZpZXcKKyAgIGl0ZW0gKyBQcm9qZWN0IHwgU2V0IGFzIFN0YXJ0VXAgcHJvamVjdCkuIElmIHlvdSB3YW50IHRvIGJ1aWxkIGFuZCB0ZXN0IHRoZQorICAgYmluYXJpZXMgc2V0IGl0IHRvICJwbmd0ZXN0IiAoU2VsZWN0ICJwbmd0ZXN0IiB0cmVlIHZpZXcgaXRlbSArCisgICBQcm9qZWN0IHwgU2V0IGFzIFN0YXJ0VXAgcHJvamVjdCkKKworNCkgU2VsZWN0ICJCdWlsZCB8IENvbmZpZ3VyYXRpb24gTWFuYWdlci4uLiIuCisgICBDaG9vc2UgdGhlIGNvbmZpZ3VyYXRpb24geW91IHdpc2ggdG8gYnVpbGQuCisKKzUpIFNlbGVjdCAiQnVpbGQgfCBDbGVhbiBTb2x1dGlvbiIuCisKKzYpIFNlbGVjdCAiQnVpbGQgfCBCdWlsZCBTb2x1dGlvbiAoQ3RybC1TaGlmdC1CKSIKKworVGhpcyBwcm9qZWN0IGJ1aWxkcyB0aGUgbGlicG5nIGJpbmFyaWVzIGFzIGZvbGxvd3M6CisKKyogV2luMzJfRExMX1JlbGVhc2VcbGlicG5nMTYuZGxsICAgICAgRExMIGJ1aWxkCisqIFdpbjMyX0RMTF9EZWJ1Z1xsaWJwbmcxNmQuZGxsICAgICAgIERMTCBidWlsZCAoZGVidWcgdmVyc2lvbikKKyogV2luMzJfRExMX1ZCXGxpYnBuZzE2dmIuZGxsICAgICAgICAgRExMIGJ1aWxkIGZvciBWaXN1YWwgQmFzaWMsIHVzaW5nIHN0ZGNhbGwKKyogV2luMzJfTElCX1JlbGVhc2VcbGlicG5nLmxpYiAgICAgICAgc3RhdGljIGJ1aWxkCisqIFdpbjMyX0xJQl9EZWJ1Z1xsaWJwbmdkLmxpYiAgICAgICAgIHN0YXRpYyBidWlsZCAoZGVidWcgdmVyc2lvbikKKworTm90ZXM6CisKK0lmIHlvdSBjaGFuZ2UgYW55dGhpbmcgaW4gdGhlIHNvdXJjZSBmaWxlcywgb3Igc2VsZWN0IGRpZmZlcmVudCBjb21waWxlcgorc2V0dGluZ3MsIHBsZWFzZSBjaGFuZ2UgdGhlIERMTCBuYW1lIHRvIHNvbWV0aGluZyBkaWZmZXJlbnQgdGhhbiBhbnkgb2YKK3RoZSBhYm92ZSBuYW1lcy4gQWxzbywgbWFrZSBzdXJlIHRoYXQgaW4geW91ciAicG5ndXNyLmgiIHlvdSBkZWZpbmUKK1BOR19VU0VSX1BSSVZBVEVCVUlMRCBhbmQgUE5HX1VTRVJfRExMRk5BTUVfUE9TVEZJWCBhY2NvcmRpbmcgdG8gdGhlCitpbnN0cnVjdGlvbnMgcHJvdmlkZWQgaW4gInBuZ2NvbmYuaCIuCisKK0FsbCBETExzIGJ1aWx0IGJ5IHRoaXMgcHJvamVjdCB1c2UgdGhlIE1pY3Jvc29mdCBkeW5hbWljIEMgcnVudGltZSBsaWJyYXJ5CitNU1ZDUjcxLkRMTCAoTVNWQ1I3MUQuRExMIGZvciBkZWJ1ZyB2ZXJzaW9ucykuICBJZiB5b3UgZGlzdHJpYnV0ZSBhbnkgb2YgdGhlCithYm92ZSBtZW50aW9uZWQgbGlicmFyaWVzIHlvdSBtYXkgaGF2ZSB0byBpbmNsdWRlIHRoaXMgRExMIGluIHlvdXIgcGFja2FnZS4KK0ZvciBhIGxpc3Qgb2YgZmlsZXMgdGhhdCBhcmUgcmVkaXN0cmlidXRhYmxlIGluIFZpc3VhbCBTdHVkaW8gc2VlCiskKFZDSU5TVEFMTERJUilccmVkaXN0LnR4dC4KZGlmZiAtLWdpdCBhL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvUkVBRE1FX3psaWIudHh0IGIvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9SRUFETUVfemxpYi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFkMTFjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvUkVBRE1FX3psaWIudHh0CkBAIC0wLDAgKzEsNDQgQEAKKy8qIFdBUk5JTkc6IFRoaXMgZmlsZSB3YXMgcHV0IGluIHRoZSBMaWJQTkcgZGlzdHJpYnV0aW9uIGZvciBjb252ZW5pZW5jZSBvbmx5LgorICAgICAgICAgICAgSXQgaXMgZXhwZWN0ZWQgdG8gYmUgcGFydCBvZiB0aGUgbmV4dCB6bGliIHJlbGVhc2UgdW5kZXIKKyAgICAgICAgICAgICJwcm9qZWN0c1x2aXN1YWxjNzFcUkVBRE1FLnR4dC4iICovCisKK01pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSwgRm9ybWF0IFZlcnNpb24gNy4xMCBmb3IgemxpYi4KKworQ29weXJpZ2h0IChDKSAyMDA0IFNpbW9uLVBpZXJyZSBDYWRpZXV4LgorQ29weXJpZ2h0IChDKSAyMDA0IENvc21pbiBUcnV0YS4KKworVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KK0ZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmguCisKK05PVEU6IFRoaXMgcHJvamVjdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSBsaWJwbmctMS41LjAuICBJdCBoYXMKK2JlZW4gcmVwbGFjZWQgd2l0aCB0aGUgInZzdHVkaW8iIHByb2plY3QuCisKK1RvIHVzZToKKworMSkgT24gdGhlIG1haW4gbWVudSwgc2VsZWN0ICJGaWxlIHwgT3BlbiBTb2x1dGlvbiIuCisgICBPcGVuICJ6bGliLnNsbiIuCisKKzIpIERpc3BsYXkgdGhlIFNvbHV0aW9uIEV4cGxvcmVyIHZpZXcgKEN0cmwrQWx0K0wpCisKKzMpIFNldCBvbmUgb2YgdGhlIHByb2plY3QgYXMgdGhlIFN0YXJ0VXAgcHJvamVjdC4gSWYgeW91IGp1c3Qgd2FudCB0byBidWlsZCB0aGUKKyAgIGJpbmFyaWVzIHNldCAiemxpYiIgYXMgdGhlIHN0YXJ0dXAgcHJvamVjdCAoU2VsZWN0ICJ6bGliIiB0cmVlIHZpZXcgaXRlbSArCisgICBQcm9qZWN0IHwgU2V0IGFzIFN0YXJ0VXAgcHJvamVjdCkuIElmIHlvdSB3YW50IHRvIGJ1aWxkIGFuZCB0ZXN0IHRoZQorICAgYmluYXJpZXMgc2V0IGl0IHRvICJleGFtcGxlIiAoU2VsZWN0ICJleGFtcGxlIiB0cmVlIHZpZXcgaXRlbSArIFByb2plY3QgfAorICAgU2V0IGFzIFN0YXJ0VXAgcHJvamVjdCksIElmIHlvdSB3YW50IHRvIGJ1aWxkIHRoZSBtaW5pZ3ppcCB1dGlsaXR5IHNldCBpdCB0bworICAgIm1pbmlnemlwIiAoU2VsZWN0ICJtaW5pZ3ppcCIgdHJlZSB2aWV3IGl0ZW0gKyBQcm9qZWN0IHwgU2V0IGFzIFN0YXJ0VXAKKyAgIHByb2plY3QKKworNCkgU2VsZWN0ICJCdWlsZCB8IENvbmZpZ3VyYXRpb24gTWFuYWdlci4uLiIuCisgICBDaG9vc2UgdGhlIGNvbmZpZ3VyYXRpb24geW91IHdpc2ggdG8gYnVpbGQuCisKKzUpIFNlbGVjdCAiQnVpbGQgfCBDbGVhbiBTb2x1dGlvbiIuCisKKzYpIFNlbGVjdCAiQnVpbGQgfCBCdWlsZCBTb2x1dGlvbiAoQ3RybC1TaGlmdC1CKSIKKworVGhpcyBwcm9qZWN0IGJ1aWxkcyB0aGUgemxpYiBiaW5hcmllcyBhcyBmb2xsb3dzOgorCisqIFdpbjMyX0RMTF9SZWxlYXNlXHpsaWIxLmRsbCAgICAgICBETEwgYnVpbGQKKyogV2luMzJfRExMX0RlYnVnXHpsaWIxZC5kbGwgICAgICAgIERMTCBidWlsZCAoZGVidWcgdmVyc2lvbikKKyogV2luMzJfTElCX1JlbGVhc2VcemxpYi5saWIgICAgICAgIHN0YXRpYyBidWlsZAorKiBXaW4zMl9MSUJfRGVidWdcemxpYmQubGliICAgICAgICAgc3RhdGljIGJ1aWxkIChkZWJ1ZyB2ZXJzaW9uKQorCmRpZmYgLS1naXQgYS9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL2xpYnBuZy5zbG4gYi9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL2xpYnBuZy5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWViMTAxZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvbGlicG5nLnNsbgpAQCAtMCwwICsxLDYwIEBACitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiA4LjAwCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImxpYnBuZyIsICJsaWJwbmcudmNwcm9qIiwgInswMDA4OTYwRS1FMERELTQxQTYtODI2NS0wMEIzMUREQjRDMjF9IgorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QKKwkJezJENEY4MTA1LTdEMjEtNDU0Qy05OTMyLUI0N0NBQjcxQTVDMH0gPSB7MkQ0RjgxMDUtN0QyMS00NTRDLTk5MzItQjQ3Q0FCNzFBNUMwfQorCUVuZFByb2plY3RTZWN0aW9uCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gInBuZ3Rlc3QiLCAicG5ndGVzdC52Y3Byb2oiLCAie0ZEMUMyRjg2LTlFRUYtNDdCRC05NUE0LTUzMDkxN0UxN0ZEQX0iCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdAorCQl7MDAwODk2MEUtRTBERC00MUE2LTgyNjUtMDBCMzFEREI0QzIxfSA9IHswMDA4OTYwRS1FMERELTQxQTYtODI2NS0wMEIzMUREQjRDMjF9CisJRW5kUHJvamVjdFNlY3Rpb24KK0VuZFByb2plY3QKK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiemxpYiIsICJ6bGliLnZjcHJvaiIsICJ7MkQ0RjgxMDUtN0QyMS00NTRDLTk5MzItQjQ3Q0FCNzFBNUMwfSIKKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0CisJRW5kUHJvamVjdFNlY3Rpb24KK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uKSA9IHByZVNvbHV0aW9uCisJCURMTCBEZWJ1ZyA9IERMTCBEZWJ1ZworCQlETEwgUmVsZWFzZSA9IERMTCBSZWxlYXNlCisJCURMTCBWQiA9IERMTCBWQgorCQlMSUIgRGVidWcgPSBMSUIgRGVidWcKKwkJTElCIFJlbGVhc2UgPSBMSUIgUmVsZWFzZQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uKSA9IHBvc3RTb2x1dGlvbgorCQl7MDAwODk2MEUtRTBERC00MUE2LTgyNjUtMDBCMzFEREI0QzIxfS5ETEwgRGVidWcuQWN0aXZlQ2ZnID0gRExMIERlYnVnfFdpbjMyCisJCXswMDA4OTYwRS1FMERELTQxQTYtODI2NS0wMEIzMUREQjRDMjF9LkRMTCBEZWJ1Zy5CdWlsZC4wID0gRExMIERlYnVnfFdpbjMyCisJCXswMDA4OTYwRS1FMERELTQxQTYtODI2NS0wMEIzMUREQjRDMjF9LkRMTCBSZWxlYXNlLkFjdGl2ZUNmZyA9IERMTCBSZWxlYXNlfFdpbjMyCisJCXswMDA4OTYwRS1FMERELTQxQTYtODI2NS0wMEIzMUREQjRDMjF9LkRMTCBSZWxlYXNlLkJ1aWxkLjAgPSBETEwgUmVsZWFzZXxXaW4zMgorCQl7MDAwODk2MEUtRTBERC00MUE2LTgyNjUtMDBCMzFEREI0QzIxfS5ETEwgVkIuQWN0aXZlQ2ZnID0gRExMIFZCfFdpbjMyCisJCXswMDA4OTYwRS1FMERELTQxQTYtODI2NS0wMEIzMUREQjRDMjF9LkRMTCBWQi5CdWlsZC4wID0gRExMIFZCfFdpbjMyCisJCXswMDA4OTYwRS1FMERELTQxQTYtODI2NS0wMEIzMUREQjRDMjF9LkxJQiBEZWJ1Zy5BY3RpdmVDZmcgPSBMSUIgRGVidWd8V2luMzIKKwkJezAwMDg5NjBFLUUwREQtNDFBNi04MjY1LTAwQjMxRERCNEMyMX0uTElCIERlYnVnLkJ1aWxkLjAgPSBMSUIgRGVidWd8V2luMzIKKwkJezAwMDg5NjBFLUUwREQtNDFBNi04MjY1LTAwQjMxRERCNEMyMX0uTElCIFJlbGVhc2UuQWN0aXZlQ2ZnID0gTElCIFJlbGVhc2V8V2luMzIKKwkJezAwMDg5NjBFLUUwREQtNDFBNi04MjY1LTAwQjMxRERCNEMyMX0uTElCIFJlbGVhc2UuQnVpbGQuMCA9IExJQiBSZWxlYXNlfFdpbjMyCisJCXtGRDFDMkY4Ni05RUVGLTQ3QkQtOTVBNC01MzA5MTdFMTdGREF9LkRMTCBEZWJ1Zy5BY3RpdmVDZmcgPSBETEwgRGVidWd8V2luMzIKKwkJe0ZEMUMyRjg2LTlFRUYtNDdCRC05NUE0LTUzMDkxN0UxN0ZEQX0uRExMIERlYnVnLkJ1aWxkLjAgPSBETEwgRGVidWd8V2luMzIKKwkJe0ZEMUMyRjg2LTlFRUYtNDdCRC05NUE0LTUzMDkxN0UxN0ZEQX0uRExMIFJlbGVhc2UuQWN0aXZlQ2ZnID0gRExMIFJlbGVhc2V8V2luMzIKKwkJe0ZEMUMyRjg2LTlFRUYtNDdCRC05NUE0LTUzMDkxN0UxN0ZEQX0uRExMIFJlbGVhc2UuQnVpbGQuMCA9IERMTCBSZWxlYXNlfFdpbjMyCisJCXtGRDFDMkY4Ni05RUVGLTQ3QkQtOTVBNC01MzA5MTdFMTdGREF9LkRMTCBWQi5BY3RpdmVDZmcgPSBETEwgVkJ8V2luMzIKKwkJe0ZEMUMyRjg2LTlFRUYtNDdCRC05NUE0LTUzMDkxN0UxN0ZEQX0uRExMIFZCLkJ1aWxkLjAgPSBETEwgVkJ8V2luMzIKKwkJe0ZEMUMyRjg2LTlFRUYtNDdCRC05NUE0LTUzMDkxN0UxN0ZEQX0uTElCIERlYnVnLkFjdGl2ZUNmZyA9IExJQiBEZWJ1Z3xXaW4zMgorCQl7RkQxQzJGODYtOUVFRi00N0JELTk1QTQtNTMwOTE3RTE3RkRBfS5MSUIgRGVidWcuQnVpbGQuMCA9IExJQiBEZWJ1Z3xXaW4zMgorCQl7RkQxQzJGODYtOUVFRi00N0JELTk1QTQtNTMwOTE3RTE3RkRBfS5MSUIgUmVsZWFzZS5BY3RpdmVDZmcgPSBMSUIgUmVsZWFzZXxXaW4zMgorCQl7RkQxQzJGODYtOUVFRi00N0JELTk1QTQtNTMwOTE3RTE3RkRBfS5MSUIgUmVsZWFzZS5CdWlsZC4wID0gTElCIFJlbGVhc2V8V2luMzIKKwkJezJENEY4MTA1LTdEMjEtNDU0Qy05OTMyLUI0N0NBQjcxQTVDMH0uRExMIERlYnVnLkFjdGl2ZUNmZyA9IERMTCBEZWJ1Z3xXaW4zMgorCQl7MkQ0RjgxMDUtN0QyMS00NTRDLTk5MzItQjQ3Q0FCNzFBNUMwfS5ETEwgRGVidWcuQnVpbGQuMCA9IERMTCBEZWJ1Z3xXaW4zMgorCQl7MkQ0RjgxMDUtN0QyMS00NTRDLTk5MzItQjQ3Q0FCNzFBNUMwfS5ETEwgUmVsZWFzZS5BY3RpdmVDZmcgPSBETEwgUmVsZWFzZXxXaW4zMgorCQl7MkQ0RjgxMDUtN0QyMS00NTRDLTk5MzItQjQ3Q0FCNzFBNUMwfS5ETEwgUmVsZWFzZS5CdWlsZC4wID0gRExMIFJlbGVhc2V8V2luMzIKKwkJezJENEY4MTA1LTdEMjEtNDU0Qy05OTMyLUI0N0NBQjcxQTVDMH0uRExMIFZCLkFjdGl2ZUNmZyA9IERMTCBSZWxlYXNlfFdpbjMyCisJCXsyRDRGODEwNS03RDIxLTQ1NEMtOTkzMi1CNDdDQUI3MUE1QzB9LkRMTCBWQi5CdWlsZC4wID0gRExMIFJlbGVhc2V8V2luMzIKKwkJezJENEY4MTA1LTdEMjEtNDU0Qy05OTMyLUI0N0NBQjcxQTVDMH0uTElCIERlYnVnLkFjdGl2ZUNmZyA9IExJQiBEZWJ1Z3xXaW4zMgorCQl7MkQ0RjgxMDUtN0QyMS00NTRDLTk5MzItQjQ3Q0FCNzFBNUMwfS5MSUIgRGVidWcuQnVpbGQuMCA9IExJQiBEZWJ1Z3xXaW4zMgorCQl7MkQ0RjgxMDUtN0QyMS00NTRDLTk5MzItQjQ3Q0FCNzFBNUMwfS5MSUIgUmVsZWFzZS5BY3RpdmVDZmcgPSBMSUIgUmVsZWFzZXxXaW4zMgorCQl7MkQ0RjgxMDUtN0QyMS00NTRDLTk5MzItQjQ3Q0FCNzFBNUMwfS5MSUIgUmVsZWFzZS5CdWlsZC4wID0gTElCIFJlbGVhc2V8V2luMzIKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihFeHRlbnNpYmlsaXR5R2xvYmFscykgPSBwb3N0U29sdXRpb24KKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihFeHRlbnNpYmlsaXR5QWRkSW5zKSA9IHBvc3RTb2x1dGlvbgorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9saWJwbmcudmNwcm9qIGIvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9saWJwbmcudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwOGVjNGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL2xpYnBuZy52Y3Byb2oKQEAgLTAsMCArMSw0MTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/PgorPFZpc3VhbFN0dWRpb1Byb2plY3QKKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIKKwlWZXJzaW9uPSI3LjEwIgorCU5hbWU9ImxpYnBuZyIKKwlSb290TmFtZXNwYWNlPSJsaWJwbmciPgorCTxQbGF0Zm9ybXM+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0iV2luMzIiLz4KKwk8L1BsYXRmb3Jtcz4KKwk8Q29uZmlndXJhdGlvbnM+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJETEwgUmVsZWFzZXxXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iLlxXaW4zMl9ETExfUmVsZWFzZSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxXaW4zMl9ETExfUmVsZWFzZSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIj4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLjsuLlwuLlwuLlx6bGliIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7UE5HX0JVSUxEX0RMTDtaTElCX0RMTDtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyIKKwkJCQlTdHJpbmdQb29saW5nPSJUUlVFIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIgorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJUUlVFIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIzIgorCQkJCVByZWNvbXBpbGVkSGVhZGVyVGhyb3VnaD0icG5ncHJpdi5oIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlDb21waWxlQXM9IjAiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9saWJwbmcxNi5kbGwiCisJCQkJTGlua0luY3JlbWVudGFsPSIxIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCQlDb21tYW5kTGluZT0iY29weSAuLlwuLlxzY3JpcHRzXHBuZ2xpYmNvbmYuaC5wcmVidWlsdCAuLlwuLlxwbmdsaWJjb25mLmgiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uOy4uXC4uXC4uXHpsaWI7JChJbnREaXIpIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRExMIERlYnVnfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXFdpbjMyX0RMTF9EZWJ1ZyIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxXaW4zMl9ETExfRGVidWciCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiI+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIwIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uOy4uXC4uXC4uXHpsaWIiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztERUJVRztQTkdfREVCVUc9MTtQTkdfQlVJTERfRExMO1pMSUJfRExMO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTIgorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMyIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMyIKKwkJCQlQcmVjb21waWxlZEhlYWRlclRocm91Z2g9InBuZ3ByaXYuaCIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIKKwkJCQlDb21waWxlQXM9IjAiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9saWJwbmcxNmQuZGxsIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkJQ29tbWFuZExpbmU9ImNvcHkgLi5cLi5cc2NyaXB0c1xwbmdsaWJjb25mLmgucHJlYnVpbHQgLi5cLi5ccG5nbGliY29uZi5oIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUcsUE5HX0RFQlVHPTEiCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLjsuLlwuLlwuLlx6bGliOyQoSW50RGlyKSIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IkRMTCBWQnxXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iLlxXaW4zMl9ETExfVkIiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cV2luMzJfRExMX1ZCIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uOy4uXC4uXC4uXHpsaWIiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztQTkdfQlVJTERfRExMO1pMSUJfRExMO1BOR0FQST1fX3N0ZGNhbGw7UE5HX05PX01PRFVMRURFRjtQTkdfTElCUE5HX1NQRUNJQUxCVUlMRDtQTkdfVVNFUl9QUklWQVRFQlVJTEQ7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1MiCisJCQkJU3RyaW5nUG9vbGluZz0iVFJVRSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0iVFJVRSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMyIKKwkJCQlQcmVjb21waWxlZEhlYWRlclRocm91Z2g9InBuZ3ByaXYuaCIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJQ29tcGlsZUFzPSIwIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvbGlicG5nMTZ2Yi5kbGwiCisJCQkJTGlua0luY3JlbWVudGFsPSIxIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCQlDb21tYW5kTGluZT0iY29weSAuLlwuLlxzY3JpcHRzXHBuZ2xpYmNvbmYuaC5wcmVidWlsdCAuLlwuLlxwbmdsaWJjb25mLmgiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9kIFBOR19OT19QRURBTlRJQ19XQVJOSU5HUyAvZCBQTkdfTElCUE5HX0RMTEZOQU1FX1BPU1RGSVg9JnF1b3Q7JnF1b3Q7JnF1b3Q7JnF1b3Q7VkImcXVvdDsmcXVvdDsmcXVvdDsmcXVvdDsgL2QgUE5HX0xJQlBOR19TUEVDSUFMQlVJTEQ9JnF1b3Q7JnF1b3Q7JnF1b3Q7JnF1b3Q7X19zdGRjYWxsIGNhbGxpbmcgY29udmVudGlvbiB1c2VkIGZvciBleHBvcnRlZCBmdW5jdGlvbnMmcXVvdDsmcXVvdDsmcXVvdDsmcXVvdDsiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uOy4uXC4uXC4uXHpsaWI7JChJbnREaXIpIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iTElCIFJlbGVhc2V8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cV2luMzJfTElCX1JlbGVhc2UiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cV2luMzJfTElCX1JlbGVhc2UiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCI+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi47Li5cLi5cLi5cemxpYiIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTIgorCQkJCVN0cmluZ1Bvb2xpbmc9IlRSVUUiCisJCQkJUnVudGltZUxpYnJhcnk9IjAiCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9IlRSVUUiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjMiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJUaHJvdWdoPSJwbmdwcml2LmgiCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCUNvbXBpbGVBcz0iMCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL2xpYnBuZy5saWIiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJCUNvbW1hbmRMaW5lPSJjb3B5IC4uXC4uXHNjcmlwdHNccG5nbGliY29uZi5oLnByZWJ1aWx0IC4uXC4uXHBuZ2xpYmNvbmYuaCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJMSUIgRGVidWd8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cV2luMzJfTElCX0RlYnVnIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXFdpbjMyX0xJQl9EZWJ1ZyIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ij4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjAiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi47Li5cLi5cLi5cemxpYiIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO0RFQlVHO1BOR19ERUJVRz0xO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTIgorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMyIKKwkJCQlQcmVjb21waWxlZEhlYWRlclRocm91Z2g9InBuZ3ByaXYuaCIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIKKwkJCQlDb21waWxlQXM9IjAiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIgorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9saWJwbmdkLmxpYiIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkJQ29tbWFuZExpbmU9ImNvcHkgLi5cLi5cc2NyaXB0c1xwbmdsaWJjb25mLmgucHJlYnVpbHQgLi5cLi5ccG5nbGliY29uZi5oIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwk8L0NvbmZpZ3VyYXRpb25zPgorCTxSZWZlcmVuY2VzPgorCTwvUmVmZXJlbmNlcz4KKwk8RmlsZXM+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyIKKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCI+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5ccG5nLmMiPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJETEwgUmVsZWFzZXxXaW4zMiI+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJETEwgRGVidWd8V2luMzIiPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIi8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRExMIFZCfFdpbjMyIj4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkxJQiBSZWxlYXNlfFdpbjMyIj4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkxJQiBEZWJ1Z3xXaW4zMiI+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHBuZ2Vycm9yLmMiPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJETEwgUmVsZWFzZXxXaW4zMiI+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjEiLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJETEwgRGVidWd8V2luMzIiPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIxIi8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRExMIFZCfFdpbjMyIj4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMSIvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkxJQiBSZWxlYXNlfFdpbjMyIj4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMSIvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkxJQiBEZWJ1Z3xXaW4zMiI+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjEiLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHBuZ2dldC5jIj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxwbmdtZW0uYyI+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5ccG5ncHJlYWQuYyI+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5ccG5ncmVhZC5jIj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxwbmdyaW8uYyI+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5ccG5ncnRyYW4uYyI+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5ccG5ncnV0aWwuYyI+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5ccG5nc2V0LmMiPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHBuZ3RyYW5zLmMiPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHBuZ3dpby5jIj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxwbmd3cml0ZS5jIj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxwbmd3dHJhbi5jIj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxwbmd3dXRpbC5jIj4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IkhlYWRlciBGaWxlcyIKKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubCI+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5ccG5nLmgiPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHBuZ2NvbmYuaCI+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5ccG5ncHJpdi5oIj4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IlJlc291cmNlIEZpbGVzIgorCQkJRmlsdGVyPSJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNjcmlwdHNccG5nd2luLnJjIj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iTElCIFJlbGVhc2V8V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJUUlVFIj4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJMSUIgRGVidWd8V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJUUlVFIj4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQk8L0ZpbHRlcj4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLlxQUkowMDQxLm1hayI+CisJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQlOYW1lPSJETEwgUmVsZWFzZXxXaW4zMiI+CisJCQkJPFRvb2wKKwkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJCURlc2NyaXB0aW9uPSJDcmVhdGUgZHVtbXkgaW5jbHVkZSBmaWxlcyB0byBwcmV2ZW50ICZxdW90O0Nhbm5vdCBmaW5kIG1pc3NpbmcgZGVwZW5kZW5jeS4uLiZxdW90OyB3YXJuaW5ncy4iCisJCQkJCUNvbW1hbmRMaW5lPSJubWFrZSAtZiBQUkowMDQxLm1hayBJbnREaXI9JChJbnREaXIpIgorCQkJCQlPdXRwdXRzPSIkKEludERpcilcYWxsb2MuaDskKEludERpcilcZnAuaDskKEludERpcilcbTY4ODgxLmg7JChJbnREaXIpXG1lbS5oOyQoSW50RGlyKVxwbmd1c3IuaDskKEludERpcilcc3RyaW5ncy5oOyQoSW50RGlyKVx1bmlzdGQuaDskKEludERpcilcdW5peGlvLmgiLz4KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQlOYW1lPSJETEwgRGVidWd8V2luMzIiPgorCQkJCTxUb29sCisJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQlEZXNjcmlwdGlvbj0iQ3JlYXRlIGR1bW15IGluY2x1ZGUgZmlsZXMgdG8gcHJldmVudCAmcXVvdDtDYW5ub3QgZmluZCBtaXNzaW5nIGRlcGVuZGVuY3kuLi4mcXVvdDsgd2FybmluZ3MuIgorCQkJCQlDb21tYW5kTGluZT0ibm1ha2UgLWYgUFJKMDA0MS5tYWsgSW50RGlyPSQoSW50RGlyKSIKKwkJCQkJT3V0cHV0cz0iJChJbnREaXIpXGFsbG9jLmg7JChJbnREaXIpXGZwLmg7JChJbnREaXIpXG02ODg4MS5oOyQoSW50RGlyKVxtZW0uaDskKEludERpcilccG5ndXNyLmg7JChJbnREaXIpXHN0cmluZ3MuaDskKEludERpcilcdW5pc3RkLmg7JChJbnREaXIpXHVuaXhpby5oIi8+CisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJTmFtZT0iRExMIFZCfFdpbjMyIj4KKwkJCQk8VG9vbAorCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkJRGVzY3JpcHRpb249IkNyZWF0ZSBkdW1teSBpbmNsdWRlIGZpbGVzIHRvIHByZXZlbnQgJnF1b3Q7Q2Fubm90IGZpbmQgbWlzc2luZyBkZXBlbmRlbmN5Li4uJnF1b3Q7IHdhcm5pbmdzLiIKKwkJCQkJQ29tbWFuZExpbmU9Im5tYWtlIC1mIFBSSjAwNDEubWFrIEludERpcj0kKEludERpcikiCisJCQkJCU91dHB1dHM9IiQoSW50RGlyKVxhbGxvYy5oOyQoSW50RGlyKVxmcC5oOyQoSW50RGlyKVxtNjg4ODEuaDskKEludERpcilcbWVtLmg7JChJbnREaXIpXHBuZ3Vzci5oOyQoSW50RGlyKVxzdHJpbmdzLmg7JChJbnREaXIpXHVuaXN0ZC5oOyQoSW50RGlyKVx1bml4aW8uaCIvPgorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSJSRUFETUUudHh0Ij4KKwkJPC9GaWxlPgorCTwvRmlsZXM+CisJPEdsb2JhbHM+CisJPC9HbG9iYWxzPgorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9wbmd0ZXN0LnZjcHJvaiBiL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvcG5ndGVzdC52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I0OGYxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvcG5ndGVzdC52Y3Byb2oKQEAgLTAsMCArMSwyNjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/PgorPFZpc3VhbFN0dWRpb1Byb2plY3QKKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIKKwlWZXJzaW9uPSI3LjEwIgorCU5hbWU9InBuZ3Rlc3QiCisJUm9vdE5hbWVzcGFjZT0icG5ndGVzdCI+CisJPFBsYXRmb3Jtcz4KKwkJPFBsYXRmb3JtCisJCQlOYW1lPSJXaW4zMiIvPgorCTwvUGxhdGZvcm1zPgorCTxDb25maWd1cmF0aW9ucz4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IkRMTCBSZWxlYXNlfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXFdpbjMyX0RMTF9SZWxlYXNlXFRlc3QiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cV2luMzJfRExMX1JlbGVhc2VcVGVzdCIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIj4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlxzY3JpcHRzOy4uXC4uXC4uXHpsaWIiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztQTkdfRExMO1BOR19OT19TVERJTztfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyIKKwkJCQlTdHJpbmdQb29saW5nPSJUUlVFIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIgorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJUUlVFIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlDb21waWxlQXM9IjAiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJRGVzY3JpcHRpb249IlRlc3RpbmcuLi4iCisJCQkJQ29tbWFuZExpbmU9InNldCBwYXRoPSQoT3V0RGlyKVwuLjskKE91dERpcilcLi5cWkxpYgorJChUYXJnZXRQYXRoKSAuLlwuLlxwbmd0ZXN0LnBuZyAkKEludERpcilccG5nb3V0LnBuZyIKKwkJCQlPdXRwdXRzPSIkKEludERpcilccG5nb3V0LnBuZyIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL3BuZ3Rlc3QuZXhlIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSIKKwkJCQlTdWJTeXN0ZW09IjEiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRExMIERlYnVnfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXFdpbjMyX0RMTF9EZWJ1Z1xUZXN0IgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXFdpbjMyX0RMTF9EZWJ1Z1xUZXN0IgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlxzY3JpcHRzOy4uXC4uXC4uXHpsaWIiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztQTkdfRExMO1BOR19OT19TVERJTztfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyIKKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiCisJCQkJUnVudGltZUxpYnJhcnk9IjMiCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiCisJCQkJQ29tcGlsZUFzPSIwIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCURlc2NyaXB0aW9uPSJUZXN0aW5nLi4uIgorCQkJCUNvbW1hbmRMaW5lPSJzZXQgcGF0aD0kKE91dERpcilcLi47JChPdXREaXIpXC4uXFpMaWIKKyQoVGFyZ2V0UGF0aCkgLi5cLi5ccG5ndGVzdC5wbmcgJChJbnREaXIpXHBuZ291dC5wbmciCisJCQkJT3V0cHV0cz0iJChJbnREaXIpXHBuZ291dC5wbmciLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9wbmd0ZXN0LmV4ZSIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiCisJCQkJU3ViU3lzdGVtPSIxIgorCQkJCVRhcmdldE1hY2hpbmU9IjEiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRExMIFZCfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXFdpbjMyX0RMTF9WQlxUZXN0IgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXFdpbjMyX0RMTF9WQlxUZXN0IgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXHNjcmlwdHM7Li5cLi5cLi5cemxpYiIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO1BOR19ETEw7UE5HX05PX1NURElPO1BOR0FQST1fX3N0ZGNhbGw7UE5HX1VTRVJfUFJJVkFURUJVSUxEO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTIgorCQkJCVN0cmluZ1Bvb2xpbmc9IlRSVUUiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9IlRSVUUiCisJCQkJV2FybmluZ0xldmVsPSIyIgorCQkJCUNhbGxpbmdDb252ZW50aW9uPSIyIgorCQkJCUNvbXBpbGVBcz0iMCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQlEZXNjcmlwdGlvbj0iVGVzdGluZy4uLiIKKwkJCQlDb21tYW5kTGluZT0ic2V0IHBhdGg9JChPdXREaXIpXC4uOyQoT3V0RGlyKVwuLlwuLlxXaW4zMl9ETExfUmVsZWFzZVxaTGliCiskKFRhcmdldFBhdGgpIC4uXC4uXHBuZ3Rlc3QucG5nICQoSW50RGlyKVxwbmdvdXQucG5nIgorCQkJCU91dHB1dHM9IiQoSW50RGlyKVxwbmdvdXQucG5nIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvcG5ndGVzdC5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIxIgorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9IiQoSW50RGlyKVxsaWJwbmcxNmIubGliIgorCQkJCVN1YlN5c3RlbT0iMSIKKwkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IkxJQiBSZWxlYXNlfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXFdpbjMyX0xJQl9SZWxlYXNlXFRlc3QiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cV2luMzJfTElCX1JlbGVhc2VcVGVzdCIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIj4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlxzY3JpcHRzOy4uXC4uXC4uXHpsaWIiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyIKKwkJCQlTdHJpbmdQb29saW5nPSJUUlVFIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIgorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJUUlVFIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlDb21waWxlQXM9IjAiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJRGVzY3JpcHRpb249IlRlc3RpbmcuLi4iCisJCQkJQ29tbWFuZExpbmU9InNldCBwYXRoPSQoT3V0RGlyKVwuLjskKE91dERpcilcLi5cWkxpYgorJChUYXJnZXRQYXRoKSAuLlwuLlxwbmd0ZXN0LnBuZyAkKEludERpcilccG5nb3V0LnBuZyIKKwkJCQlPdXRwdXRzPSIkKEludERpcilccG5nb3V0LnBuZyIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL3BuZ3Rlc3QuZXhlIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSIKKwkJCQlTdWJTeXN0ZW09IjEiCisJCQkJVGFyZ2V0TWFjaGluZT0iMSIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJMSUIgRGVidWd8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cV2luMzJfTElCX0RlYnVnXFRlc3QiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cV2luMzJfTElCX0RlYnVnXFRlc3QiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSI+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIwIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXHNjcmlwdHM7Li5cLi5cLi5cemxpYiIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTIgorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMSIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIKKwkJCQlDb21waWxlQXM9IjAiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJRGVzY3JpcHRpb249IlRlc3RpbmcuLi4iCisJCQkJQ29tbWFuZExpbmU9InNldCBwYXRoPSQoT3V0RGlyKVwuLjskKE91dERpcilcLi5cWkxpYgorJChUYXJnZXRQYXRoKSAuLlwuLlxwbmd0ZXN0LnBuZyAkKEludERpcilccG5nb3V0LnBuZyIKKwkJCQlPdXRwdXRzPSIkKEludERpcilccG5nb3V0LnBuZyIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL3BuZ3Rlc3QuZXhlIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSIKKwkJCQlTdWJTeXN0ZW09IjEiCisJCQkJVGFyZ2V0TWFjaGluZT0iMSIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJPC9Db25maWd1cmF0aW9ucz4KKwk8UmVmZXJlbmNlcz4KKwk8L1JlZmVyZW5jZXM+CisJPEZpbGVzPgorCQk8RmlsdGVyCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiCisJCQlGaWx0ZXI9ImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHBuZ3Rlc3QuYyI+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCTwvRmlsZXM+CisJPEdsb2JhbHM+CisJPC9HbG9iYWxzPgorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS96bGliLnZjcHJvaiBiL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvemxpYi52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIyMTg0OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvemxpYi52Y3Byb2oKQEAgLTAsMCArMSwzOTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/PgorPFZpc3VhbFN0dWRpb1Byb2plY3QKKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIKKwlWZXJzaW9uPSI3LjEwIgorCU5hbWU9InpsaWIiPgorCTxQbGF0Zm9ybXM+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0iV2luMzIiLz4KKwk8L1BsYXRmb3Jtcz4KKwk8Q29uZmlndXJhdGlvbnM+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJETEwgUmVsZWFzZXxXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iLlxXaW4zMl9ETExfUmVsZWFzZVxaTGliIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXFdpbjMyX0RMTF9SZWxlYXNlXFpMaWIiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiI+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5cemxpYiIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUyIKKwkJCQlTdHJpbmdQb29saW5nPSJUUlVFIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIgorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJUUlVFIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlDb21waWxlQXM9IjEiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKVx6bGliMS5kbGwiCisJCQkJTGlua0luY3JlbWVudGFsPSIxIgorCQkJCU1vZHVsZURlZmluaXRpb25GaWxlPSIuLlwuLlwuLlx6bGliXHdpbjMyXHpsaWIuZGVmIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIgorCQkJCUN1bHR1cmU9IjEwMzMiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJETEwgRGVidWd8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cV2luMzJfRExMX0RlYnVnXFpMaWIiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cV2luMzJfRExMX0RlYnVnXFpMaWIiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiI+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIwIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXHpsaWIiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztfQ1JUX05PTlNURENfTk9fV0FSTklOR1MiCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0IgorCQkJCUNvbXBpbGVBcz0iMSIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpXHpsaWIxZC5kbGwiCisJCQkJTW9kdWxlRGVmaW5pdGlvbkZpbGU9Ii4uXC4uXC4uXHpsaWJcd2luMzJcemxpYi5kZWYiCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJUUlVFIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIgorCQkJCUN1bHR1cmU9IjEwMzMiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJMSUIgUmVsZWFzZXxXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iLlxXaW4zMl9MSUJfUmVsZWFzZVxaTGliIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXFdpbjMyX0xJQl9SZWxlYXNlXFpMaWIiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCI+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5cemxpYiIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUyIKKwkJCQlTdHJpbmdQb29saW5nPSJUUlVFIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIgorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJUUlVFIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlDb21waWxlQXM9IjEiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIgorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKVx6bGliLmxpYiIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iTElCIERlYnVnfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXFdpbjMyX0xJQl9EZWJ1Z1xaTGliIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXFdpbjMyX0xJQl9EZWJ1Z1xaTGliIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlx6bGliIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTIgorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMSIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIKKwkJCQlDb21waWxlQXM9IjEiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIgorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKVx6bGliZC5saWIiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwk8L0NvbmZpZ3VyYXRpb25zPgorCTxSZWZlcmVuY2VzPgorCTwvUmVmZXJlbmNlcz4KKwk8RmlsZXM+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyIKKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCI+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cemxpYlxhZGxlcjMyLmMiPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHpsaWJcY29tcHJlc3MuYyI+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cemxpYlxjcmMzMi5jIj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlx6bGliXGRlZmxhdGUuYyI+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cemxpYlxnemxpYi5jIj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlx6bGliXGd6Y2xvc2UuYyI+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cemxpYlxnenJlYWQuYyI+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cemxpYlxnendyaXRlLmMiPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHpsaWJcaW5mYmFjay5jIj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlx6bGliXGluZmZhc3QuYyI+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cemxpYlxpbmZsYXRlLmMiPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHpsaWJcaW5mdHJlZXMuYyI+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cemxpYlx0cmVlcy5jIj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlx6bGliXHVuY29tcHIuYyI+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cemxpYlx3aW4zMlx6bGliLmRlZiI+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkxJQiBSZWxlYXNlfFdpbjMyIgorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0iVFJVRSI+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkxJQiBEZWJ1Z3xXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9IlRSVUUiPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHpsaWJcenV0aWwuYyI+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCQk8RmlsdGVyCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmwiPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHpsaWJcY3JjMzIuaCI+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cemxpYlxkZWZsYXRlLmgiPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHpsaWJcaW5mZmFzdC5oIj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlx6bGliXGluZmZpeGVkLmgiPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHpsaWJcaW5mbGF0ZS5oIj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlx6bGliXGluZnRyZWVzLmgiPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHpsaWJcdHJlZXMuaCI+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cemxpYlx6Y29uZi5oIj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlx6bGliXHpsaWIuaCI+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cemxpYlx6dXRpbC5oIj4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IlJlc291cmNlIEZpbGVzIgorCQkJRmlsdGVyPSJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHpsaWJcd2luMzJcemxpYjEucmMiPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJMSUIgUmVsZWFzZXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9IlRSVUUiPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkxJQiBEZWJ1Z3xXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9IlRSVUUiPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCQk8RmlsdGVyCisJCQlOYW1lPSJBc3NlbWJsZXIgRmlsZXMgKFVuc3VwcG9ydGVkKSIKKwkJCUZpbHRlcj0iYXNtO29iajtjO2NwcDtjeHg7aDtocHA7aHh4Ij4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlx6bGliXGNvbnRyaWJcbWFzbXg4Nlxndm1hdDMyLmFzbSI+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRMTCBSZWxlYXNlfFdpbjMyIgorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0iVFJVRSI+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRMTCBEZWJ1Z3xXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9IlRSVUUiPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJMSUIgUmVsZWFzZXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9IlRSVUUiPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJMSUIgRGVidWd8V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJUUlVFIj4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlx6bGliXGNvbnRyaWJcbWFzbXg4Nlxndm1hdDMyYy5jIj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRExMIFJlbGVhc2V8V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJUUlVFIj4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJETEwgRGVidWd8V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJUUlVFIj4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJMSUIgUmVsZWFzZXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9IlRSVUUiPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkxJQiBEZWJ1Z3xXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9IlRSVUUiPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cemxpYlxjb250cmliXG1hc214ODZcaW5mZmFzMzIuYXNtIj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRExMIFJlbGVhc2V8V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJUUlVFIj4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRExMIERlYnVnfFdpbjMyIgorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0iVFJVRSI+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkxJQiBSZWxlYXNlfFdpbjMyIgorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0iVFJVRSI+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkxJQiBEZWJ1Z3xXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9IlRSVUUiPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQk8L0ZpbHRlcj4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iUkVBRE1FLnR4dCI+CisJCTwvRmlsZT4KKwk8L0ZpbGVzPgorCTxHbG9iYWxzPgorCTwvR2xvYmFscz4KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYnBuZy9wcm9qZWN0cy92c3R1ZGlvL1dBUk5JTkcgYi9saWJwbmcvcHJvamVjdHMvdnN0dWRpby9XQVJOSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMDAyYzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvcHJvamVjdHMvdnN0dWRpby9XQVJOSU5HCkBAIC0wLDAgKzEsMjcgQEAKK1dBUk5JTkcKKz09PT09PT0KK0xpYnBuZyAxLjYgZG9lcyBub3QgdXNlIHRoZSBkZWZhdWx0IHJ1bi10aW1lIGxpYnJhcnkgd2hlbiBidWlsZGluZyBzdGF0aWMKK2xpYnJhcnkgYnVpbGRzIG9mIGxpYnBuZzsgaW5zdGVhZCBvZiB0aGUgc2hhcmVkIERMTCBydW50aW1lIGl0IHVzZXMgYSBzdGF0aWMKK3J1bnRpbWUuICBJZiB5b3UgbmVlZCB0byBjaGFuZ2UgdGhpcyBtYWtlIHN1cmUgdG8gY2hhbmdlIHRoZSBzZXR0aW5nIG9uIGFsbCB0aGUKK3JlbGV2YW50IHByb2plY3RzOgorCitsaWJwbmcKK3psaWIKK2FsbCB0aGUgdGVzdCBwcm9ncmFtcworCitUaGUgcnVudGltZSBsaWJyYXJ5IHNldHRpbmdzIGZvciBlYWNoIGJ1aWxkIGFyZSBhcyBmb2xsb3dzOgorCisgICAgICAgICAgIFJlbGVhc2UgICAgICAgIERlYnVnCitETEwgICAgICAgICAvTUQgICAgICAgICAgICAvTURkCitMaWJyYXJ5ICAgICAvTVQgICAgICAgICAgICAvTVRkCisKK05PVElDRSB0aGF0IGxpYnBuZyAxLjUgZXJyb25lb3VzbHkgdXNlZCAvTUQgZm9yIERlYnVnIERMTCBidWlsZHM7IGlmIHlvdSB1c2VkCit0aGUgZGVidWcgYnVpbGRzIGluIHlvdXIgYXBwIGFuZCB5b3UgY2hhbmdlZCB5b3VyIGFwcCB0byB1c2UgL01EIHlvdSB3aWxsIG5lZWQKK3RvIGNoYW5nZSBpdCB0byAvTURkIGZvciBsaWJwbmcgMS42LgorCitUaGUgVmlzdWFsIFN0dWRpbyAyMDEwIGRlZmF1bHRzIGZvciBhIFdpbjMyIERMTCBvciBTdGF0aWMgTGlicmFyeSBwcm9qZWN0IGFyZQorYXMgZm9sbG93czoKKworICAgICAgICAgICAgICAgICBSZWxlYXNlICAgICBEZWJ1ZworRExMICAgICAgICAgICAgICAgL01EICAgICAgICAgL01EZAorU3RhdGljIExpYnJhcnkgICAgL01EICAgICAgICAgL01EZApkaWZmIC0tZ2l0IGEvbGlicG5nL3Byb2plY3RzL3ZzdHVkaW8vbGlicG5nL2xpYnBuZy52Y3hwcm9qIGIvbGlicG5nL3Byb2plY3RzL3ZzdHVkaW8vbGlicG5nL2xpYnBuZy52Y3hwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlN2ZjM2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvcHJvamVjdHMvdnN0dWRpby9saWJwbmcvbGlicG5nLnZjeHByb2oKQEAgLTAsMCArMSwyMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWcgTGlicmFyeXxXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZyBMaWJyYXJ5PC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZSBMaWJyYXJ5fFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2UgTGlicmFyeTwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICA8L0l0ZW1Hcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPgorICAgIDxQcm9qZWN0R3VpZD57RDY5NzMwNzYtOTMxNy00RUYyLUEwQjgtQjdBMThBQzA3MTNFfTwvUHJvamVjdEd1aWQ+CisgICAgPEtleXdvcmQ+V2luMzJQcm9qPC9LZXl3b3JkPgorICAgIDxSb290TmFtZXNwYWNlPmxpYnBuZzwvUm9vdE5hbWVzcGFjZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoU29sdXRpb25EaXIpXHpsaWIucHJvcHMiIC8+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLkRlZmF1bHQucHJvcHMiIC8+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkR5bmFtaWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTGlicmFyeXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkR5bmFtaWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBMaWJyYXJ5fFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblNldHRpbmdzIj4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTGlicmFyeXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIExpYnJhcnl8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIiAvPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgorICAgIDxDdXN0b21CdWlsZEJlZm9yZVRhcmdldHM+CisgICAgPC9DdXN0b21CdWlsZEJlZm9yZVRhcmdldHM+CisgICAgPFRhcmdldE5hbWU+JChQcm9qZWN0TmFtZSkxNjwvVGFyZ2V0TmFtZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIExpYnJhcnl8V2luMzInIj4KKyAgICA8TGlua0luY3JlbWVudGFsPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+CisgICAgPEN1c3RvbUJ1aWxkQmVmb3JlVGFyZ2V0cyAvPgorICAgIDxUYXJnZXROYW1lPiQoUHJvamVjdE5hbWUpMTY8L1RhcmdldE5hbWU+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgorICAgIDxDdXN0b21CdWlsZEJlZm9yZVRhcmdldHM+CisgICAgPC9DdXN0b21CdWlsZEJlZm9yZVRhcmdldHM+CisgICAgPFRhcmdldE5hbWU+JChQcm9qZWN0TmFtZSkxNjwvVGFyZ2V0TmFtZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTGlicmFyeXxXaW4zMiciPgorICAgIDxMaW5rSW5jcmVtZW50YWw+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4KKyAgICA8Q3VzdG9tQnVpbGRCZWZvcmVUYXJnZXRzIC8+CisgICAgPFRhcmdldE5hbWU+JChQcm9qZWN0TmFtZSkxNjwvVGFyZ2V0TmFtZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Vc2U8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDQ8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxNaW5pbWFsUmVidWlsZD5mYWxzZTwvTWluaW1hbFJlYnVpbGQ+CisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+CisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfREVCVUc7X1dJTkRPV1M7X1VTUkRMTDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KKyAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+CisgICAgICA8VHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT5mYWxzZTwvVHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlckZpbGU+cG5ncHJpdi5oPC9QcmVjb21waWxlZEhlYWRlckZpbGU+CisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+CisgICAgICA8Q29tcGlsZUFzPkNvbXBpbGVBc0M8L0NvbXBpbGVBcz4KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+CisgICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDk5Njs0MTI3PC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoWkxpYlNyY0Rpcik7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4KKyAgICAgIDxUcmVhdFdhcm5pbmdBc0Vycm9yPnRydWU8L1RyZWF0V2FybmluZ0FzRXJyb3I+CisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz56bGliLmxpYjwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4KKyAgICAgIDxWZXJzaW9uPjE2PC9WZXJzaW9uPgorICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+JChPdXREaXIpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgorICAgIDwvTGluaz4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIExpYnJhcnl8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPlVzZTwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsNDwvV2FybmluZ0xldmVsPgorICAgICAgPE1pbmltYWxSZWJ1aWxkPmZhbHNlPC9NaW5pbWFsUmVidWlsZD4KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19ERUJVRztfV0lORE9XUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KKyAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+CisgICAgICA8VHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT5mYWxzZTwvVHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlckZpbGU+cG5ncHJpdi5oPC9QcmVjb21waWxlZEhlYWRlckZpbGU+CisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+CisgICAgICA8Q29tcGlsZUFzPkNvbXBpbGVBc0M8L0NvbXBpbGVBcz4KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+CisgICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDk5Njs0MTI3PC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoWkxpYlNyY0Rpcik7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4KKyAgICAgIDxUcmVhdFdhcm5pbmdBc0Vycm9yPnRydWU8L1RyZWF0V2FybmluZ0FzRXJyb3I+CisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsNDwvV2FybmluZ0xldmVsPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPlVzZTwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+CisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtOREVCVUc7X1dJTkRPV1M7X1VTUkRMTDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPgorICAgICAgPFRyZWF0V0NoYXJfdEFzQnVpbHRJblR5cGU+ZmFsc2U8L1RyZWF0V0NoYXJfdEFzQnVpbHRJblR5cGU+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXJGaWxlPnBuZ3ByaXYuaDwvUHJlY29tcGlsZWRIZWFkZXJGaWxlPgorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPgorICAgICAgPENvbXBpbGVBcz5Db21waWxlQXNDPC9Db21waWxlQXM+CisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPgorICAgICAgPE1pbmltYWxSZWJ1aWxkPmZhbHNlPC9NaW5pbWFsUmVidWlsZD4KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40OTk2OzQxMjc8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPgorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChaTGliU3JjRGlyKTslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPgorICAgICAgPFRyZWF0V2FybmluZ0FzRXJyb3I+dHJ1ZTwvVHJlYXRXYXJuaW5nQXNFcnJvcj4KKyAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+CisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPnpsaWIubGliPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPgorICAgICAgPFZlcnNpb24+MTY8L1ZlcnNpb24+CisgICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4kKE91dERpcik8L0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBMaWJyYXJ5fFdpbjMyJyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWw0PC9XYXJuaW5nTGV2ZWw+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+VXNlPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfV0lORE9XUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPgorICAgICAgPFRyZWF0V0NoYXJfdEFzQnVpbHRJblR5cGU+ZmFsc2U8L1RyZWF0V0NoYXJfdEFzQnVpbHRJblR5cGU+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXJGaWxlPnBuZ3ByaXYuaDwvUHJlY29tcGlsZWRIZWFkZXJGaWxlPgorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPgorICAgICAgPENvbXBpbGVBcz5Db21waWxlQXNDPC9Db21waWxlQXM+CisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPgorICAgICAgPE1pbmltYWxSZWJ1aWxkPmZhbHNlPC9NaW5pbWFsUmVidWlsZD4KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40OTk2OzQxMjc8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPgorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChaTGliU3JjRGlyKTslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPgorICAgICAgPFRyZWF0V2FybmluZ0FzRXJyb3I+dHJ1ZTwvVHJlYXRXYXJuaW5nQXNFcnJvcj4KKyAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPgorICAgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgorICAgIDwvTGluaz4KKyAgICA8TGliPgorICAgICAgPExpbmtUaW1lQ29kZUdlbmVyYXRpb24+dHJ1ZTwvTGlua1RpbWVDb2RlR2VuZXJhdGlvbj4KKyAgICA8L0xpYj4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5ccG5nLmMiPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5DcmVhdGU8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTGlicmFyeXxXaW4zMiciPkNyZWF0ZTwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+Q3JlYXRlPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTGlicmFyeXxXaW4zMiciPkNyZWF0ZTwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxwbmdlcnJvci5jIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5ccG5nZ2V0LmMiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxwbmdtZW0uYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHBuZ3ByZWFkLmMiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxwbmdyZWFkLmMiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxwbmdyaW8uYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHBuZ3J0cmFuLmMiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxwbmdydXRpbC5jIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5ccG5nc2V0LmMiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxwbmd0cmFucy5jIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5ccG5nd2lvLmMiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxwbmd3cml0ZS5jIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5ccG5nd3RyYW4uYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHBuZ3d1dGlsLmMiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxSZXNvdXJjZUNvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cc2NyaXB0c1xwbmd3aW4ucmMiPgorICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTGlicmFyeXxXaW4zMiciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPgorICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBMaWJyYXJ5fFdpbjMyJyI+dHJ1ZTwvRXhjbHVkZWRGcm9tQnVpbGQ+CisgICAgPC9SZXNvdXJjZUNvbXBpbGU+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPgorICA8L0ltcG9ydEdyb3VwPgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGlicG5nL3Byb2plY3RzL3ZzdHVkaW8vcG5nbGliY29uZi9wbmdsaWJjb25mLnZjeHByb2ogYi9saWJwbmcvcHJvamVjdHMvdnN0dWRpby9wbmdsaWJjb25mL3BuZ2xpYmNvbmYudmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmEyMzJjCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3Byb2plY3RzL3ZzdHVkaW8vcG5nbGliY29uZi9wbmdsaWJjb25mLnZjeHByb2oKQEAgLTAsMCArMSw2MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgIDwvSXRlbUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+CisgICAgPFByb2plY3RHdWlkPntFQjMzNTY2RS1EQTdGLTREMjgtOTA3Ny04OEMwQjdDNzdFMzV9PC9Qcm9qZWN0R3VpZD4KKyAgICA8Um9vdE5hbWVzcGFjZT5wbmdsaWJjb25mPC9Sb290TmFtZXNwYWNlPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLkRlZmF1bHQucHJvcHMiIC8+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz5mYWxzZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoU29sdXRpb25EaXIpXHpsaWIucHJvcHMiIC8+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblNldHRpbmdzIj4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPEN1c3RvbUJ1aWxkQmVmb3JlVGFyZ2V0cz5CdWlsZDwvQ3VzdG9tQnVpbGRCZWZvcmVUYXJnZXRzPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+CisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4KKyAgICA8L0xpbms+CisgICAgPEN1c3RvbUJ1aWxkU3RlcD4KKyAgICAgIDxDb21tYW5kPmNvcHkgLi5cLi5cLi5cc2NyaXB0c1xwbmdsaWJjb25mLmgucHJlYnVpbHQgLi5cLi5cLi5ccG5nbGliY29uZi5oPC9Db21tYW5kPgorICAgIDwvQ3VzdG9tQnVpbGRTdGVwPgorICAgIDxDdXN0b21CdWlsZFN0ZXA+CisgICAgICA8TWVzc2FnZT5HZW5lcmF0aW5nIHBuZ2xpYmNvbmYuaDwvTWVzc2FnZT4KKyAgICA8L0N1c3RvbUJ1aWxkU3RlcD4KKyAgICA8Q3VzdG9tQnVpbGRTdGVwPgorICAgICAgPE91dHB1dHM+Li5cLi5cLi5ccG5nbGliY29uZi5oPC9PdXRwdXRzPgorICAgIDwvQ3VzdG9tQnVpbGRTdGVwPgorICAgIDxDdXN0b21CdWlsZFN0ZXA+CisgICAgICA8SW5wdXRzPi4uXC4uXC4uXHNjcmlwdHNccG5nbGliY29uZi5oLnByZWJ1aWx0PC9JbnB1dHM+CisgICAgPC9DdXN0b21CdWlsZFN0ZXA+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+CisgIDwvSW1wb3J0R3JvdXA+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWJwbmcvcHJvamVjdHMvdnN0dWRpby9wbmdzdGVzdC9wbmdzdGVzdC52Y3hwcm9qIGIvbGlicG5nL3Byb2plY3RzL3ZzdHVkaW8vcG5nc3Rlc3QvcG5nc3Rlc3QudmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDI5ODBkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3Byb2plY3RzL3ZzdHVkaW8vcG5nc3Rlc3QvcG5nc3Rlc3QudmN4cHJvagpAQCAtMCwwICsxLDIxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1ZyBMaWJyYXJ5fFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnIExpYnJhcnk8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlIExpYnJhcnl8V2luMzIiPgorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZSBMaWJyYXJ5PC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgIDwvSXRlbUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+CisgICAgPFByb2plY3RHdWlkPnsyNzdBQzU3Ri0zMTNCLTREMDYtQjExOS1BM0NEQjY3MkQyRkZ9PC9Qcm9qZWN0R3VpZD4KKyAgICA8S2V5d29yZD5XaW4zMlByb2o8L0tleXdvcmQ+CisgICAgPFJvb3ROYW1lc3BhY2U+cG5nc3Rlc3Q8L1Jvb3ROYW1lc3BhY2U+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFNvbHV0aW9uRGlyKVx6bGliLnByb3BzIiAvPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBMaWJyYXJ5fFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIExpYnJhcnl8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8Q2hhcmFjdGVyU2V0PlVuaWNvZGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIExpYnJhcnl8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBMaWJyYXJ5fFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgorICAgIDxMaW5rSW5jcmVtZW50YWw+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4KKyAgICA8Q3VzdG9tQnVpbGRBZnRlclRhcmdldHMgLz4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIExpYnJhcnl8V2luMzInIj4KKyAgICA8TGlua0luY3JlbWVudGFsPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+CisgICAgPEN1c3RvbUJ1aWxkQWZ0ZXJUYXJnZXRzIC8+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgorICAgIDxDdXN0b21CdWlsZEFmdGVyVGFyZ2V0cyAvPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBMaWJyYXJ5fFdpbjMyJyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgorICAgIDxDdXN0b21CdWlsZEFmdGVyVGFyZ2V0cyAvPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWw0PC9XYXJuaW5nTGV2ZWw+CisgICAgICA8TWluaW1hbFJlYnVpbGQ+ZmFsc2U8L01pbmltYWxSZWJ1aWxkPgorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PgorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19DT05TT0xFO1BOR19VU0VfRExMOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoWkxpYlNyY0Rpcik7Li5cLi5cLi5cc2NyaXB0czslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPgorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQ5OTY7NDEyNzwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+CisgICAgICA8Q29tcGlsZUFzTWFuYWdlZD5mYWxzZTwvQ29tcGlsZUFzTWFuYWdlZD4KKyAgICAgIDxUcmVhdFdhcm5pbmdBc0Vycm9yPnRydWU8L1RyZWF0V2FybmluZ0FzRXJyb3I+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+CisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+ZmFsc2U8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPgorICAgICAgPEZsb2F0aW5nUG9pbnRFeGNlcHRpb25zPmZhbHNlPC9GbG9hdGluZ1BvaW50RXhjZXB0aW9ucz4KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWdETEw8L1J1bnRpbWVMaWJyYXJ5PgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPmxpYnBuZzE2LmxpYjwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4KKyAgICAgIDxBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPiQoT3V0RGlyKTwvQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4KKyAgICA8L0xpbms+CisgICAgPEN1c3RvbUJ1aWxkU3RlcD4KKyAgICAgIDxNZXNzYWdlPkV4ZWN1dGluZyBsaWJwbmcgc2ltcGxpZmllZCBBUEkgdGVzdCBwcm9ncmFtPC9NZXNzYWdlPgorICAgICAgPENvbW1hbmQ+IiQoT3V0RGlyKXBuZ3N0ZXN0LmV4ZSIgLS1zdHJpY3QgLS1sb2cgLS10b3VjaCAiJChJbnREaXIpcG5nc3Rlc3Qub3V0IiAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzAxLnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzAyLnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzA0LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzE2LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24yYzA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24yYzE2LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDAxLnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDAyLnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDA0LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc240YTA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc240YTE2LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc242YTA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc242YTE2LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YmJuMGcwMS5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJibjBnMDIucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4wZzA0LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YmJuMmMxNi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJibjNwMDgucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRiZ24yYzE2LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YmduM3AwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJybjJjMDgucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRid24wZzE2LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YnduM3AwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJ5bjNwMDgucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRwMG4wZzA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0cDBuMmMwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdHAwbjNwMDgucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRwMW4zcDA4LnBuZzwvQ29tbWFuZD4KKyAgICAgIDxPdXRwdXRzPiQoSW50RGlyKXBuZ3N0ZXN0Lm91dDwvT3V0cHV0cz4KKyAgICAgIDxJbnB1dHM+JChPdXREaXIpcG5nc3Rlc3QuZXhlPC9JbnB1dHM+CisgICAgPC9DdXN0b21CdWlsZFN0ZXA+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBMaWJyYXJ5fFdpbjMyJyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsNDwvV2FybmluZ0xldmVsPgorICAgICAgPE1pbmltYWxSZWJ1aWxkPmZhbHNlPC9NaW5pbWFsUmVidWlsZD4KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPgorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoWkxpYlNyY0Rpcik7Li5cLi5cLi5cc2NyaXB0czslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPgorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQ5OTY7NDEyNzwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+CisgICAgICA8Q29tcGlsZUFzTWFuYWdlZD5mYWxzZTwvQ29tcGlsZUFzTWFuYWdlZD4KKyAgICAgIDxUcmVhdFdhcm5pbmdBc0Vycm9yPnRydWU8L1RyZWF0V2FybmluZ0FzRXJyb3I+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+CisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+ZmFsc2U8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPgorICAgICAgPEZsb2F0aW5nUG9pbnRFeGNlcHRpb25zPmZhbHNlPC9GbG9hdGluZ1BvaW50RXhjZXB0aW9ucz4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz5saWJwbmcxNi5saWI7emxpYi5saWI8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+CisgICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4kKE91dERpcik8L0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+CisgICAgPC9MaW5rPgorICAgIDxDdXN0b21CdWlsZFN0ZXA+CisgICAgICA8TWVzc2FnZT5FeGVjdXRpbmcgbGlicG5nIHNpbXBsaWZpZWQgQVBJIHRlc3QgcHJvZ3JhbTwvTWVzc2FnZT4KKyAgICAgIDxDb21tYW5kPiIkKE91dERpcilwbmdzdGVzdC5leGUiIC0tc3RyaWN0IC0tbG9nIC0tdG91Y2ggIiQoSW50RGlyKXBuZ3N0ZXN0Lm91dCIgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwMS5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwMi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwNC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcxNi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMmMwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMmMxNi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwMS5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwMi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwNC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuNGEwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuNGExNi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuNmEwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuNmExNi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJibjBnMDEucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4wZzAyLnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YmJuMGcwNC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJibjJjMTYucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4zcDA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YmduMmMxNi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJnbjNwMDgucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRicm4yYzA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YnduMGcxNi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJ3bjNwMDgucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRieW4zcDA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0cDBuMGcwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdHAwbjJjMDgucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRwMG4zcDA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0cDFuM3AwOC5wbmc8L0NvbW1hbmQ+CisgICAgICA8T3V0cHV0cz4kKEludERpcilwbmdzdGVzdC5vdXQ8L091dHB1dHM+CisgICAgICA8SW5wdXRzPiQoT3V0RGlyKXBuZ3N0ZXN0LmV4ZTwvSW5wdXRzPgorICAgIDwvQ3VzdG9tQnVpbGRTdGVwPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsNDwvV2FybmluZ0xldmVsPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4KKyAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPgorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPmZhbHNlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfQ09OU09MRTtQTkdfVVNFX0RMTDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4kKFpMaWJTcmNEaXIpOy4uXC4uXC4uXHNjcmlwdHM7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40OTk2OzQxMjc8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPgorICAgICAgPENvbXBpbGVBc01hbmFnZWQ+ZmFsc2U8L0NvbXBpbGVBc01hbmFnZWQ+CisgICAgICA8VHJlYXRXYXJuaW5nQXNFcnJvcj50cnVlPC9UcmVhdFdhcm5pbmdBc0Vycm9yPgorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4KKyAgICAgIDxNaW5pbWFsUmVidWlsZD5mYWxzZTwvTWluaW1hbFJlYnVpbGQ+CisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+CisgICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KKyAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+bGlicG5nMTYubGliPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPgorICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+JChPdXREaXIpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgorICAgICAgPExpbmtUaW1lQ29kZUdlbmVyYXRpb24+VXNlTGlua1RpbWVDb2RlR2VuZXJhdGlvbjwvTGlua1RpbWVDb2RlR2VuZXJhdGlvbj4KKyAgICA8L0xpbms+CisgICAgPEN1c3RvbUJ1aWxkU3RlcD4KKyAgICAgIDxNZXNzYWdlPkV4ZWN1dGluZyBsaWJwbmcgc2ltcGxpZmllZCBBUEkgdGVzdCBwcm9ncmFtPC9NZXNzYWdlPgorICAgICAgPENvbW1hbmQ+IiQoT3V0RGlyKXBuZ3N0ZXN0LmV4ZSIgLS1zdHJpY3QgLS1sb2cgLS10b3VjaCAiJChJbnREaXIpcG5nc3Rlc3Qub3V0IiAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzAxLnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzAyLnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzA0LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzE2LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24yYzA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24yYzE2LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDAxLnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDAyLnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDA0LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc240YTA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc240YTE2LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc242YTA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc242YTE2LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YmJuMGcwMS5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJibjBnMDIucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4wZzA0LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YmJuMmMxNi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJibjNwMDgucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRiZ24yYzE2LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YmduM3AwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJybjJjMDgucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRid24wZzE2LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YnduM3AwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJ5bjNwMDgucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRwMG4wZzA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0cDBuMmMwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdHAwbjNwMDgucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRwMW4zcDA4LnBuZzwvQ29tbWFuZD4KKyAgICAgIDxPdXRwdXRzPiQoSW50RGlyKXBuZ3N0ZXN0Lm91dDwvT3V0cHV0cz4KKyAgICAgIDxJbnB1dHM+JChPdXREaXIpcG5nc3Rlc3QuZXhlPC9JbnB1dHM+CisgICAgPC9DdXN0b21CdWlsZFN0ZXA+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIExpYnJhcnl8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDQ8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+CisgICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz5mYWxzZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtOREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChaTGliU3JjRGlyKTsuLlwuLlwuLlxzY3JpcHRzOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+CisgICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDk5Njs0MTI3PC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4KKyAgICAgIDxDb21waWxlQXNNYW5hZ2VkPmZhbHNlPC9Db21waWxlQXNNYW5hZ2VkPgorICAgICAgPFRyZWF0V2FybmluZ0FzRXJyb3I+dHJ1ZTwvVHJlYXRXYXJuaW5nQXNFcnJvcj4KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+CisgICAgICA8TWluaW1hbFJlYnVpbGQ+ZmFsc2U8L01pbmltYWxSZWJ1aWxkPgorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPgorICAgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+CisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+CisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPmxpYnBuZzE2LmxpYjt6bGliLmxpYjwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4KKyAgICAgIDxBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPiQoT3V0RGlyKTwvQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4KKyAgICAgIDxMaW5rVGltZUNvZGVHZW5lcmF0aW9uPlVzZUxpbmtUaW1lQ29kZUdlbmVyYXRpb248L0xpbmtUaW1lQ29kZUdlbmVyYXRpb24+CisgICAgPC9MaW5rPgorICAgIDxDdXN0b21CdWlsZFN0ZXA+CisgICAgICA8TWVzc2FnZT5FeGVjdXRpbmcgbGlicG5nIHNpbXBsaWZpZWQgQVBJIHRlc3QgcHJvZ3JhbTwvTWVzc2FnZT4KKyAgICAgIDxDb21tYW5kPiIkKE91dERpcilwbmdzdGVzdC5leGUiIC0tc3RyaWN0IC0tbG9nIC0tdG91Y2ggIiQoSW50RGlyKXBuZ3N0ZXN0Lm91dCIgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwMS5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwMi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwNC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcxNi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMmMwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMmMxNi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwMS5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwMi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwNC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuNGEwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuNGExNi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuNmEwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuNmExNi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJibjBnMDEucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4wZzAyLnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YmJuMGcwNC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJibjJjMTYucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4zcDA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YmduMmMxNi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJnbjNwMDgucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRicm4yYzA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YnduMGcxNi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJ3bjNwMDgucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRieW4zcDA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0cDBuMGcwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdHAwbjJjMDgucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRwMG4zcDA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0cDFuM3AwOC5wbmc8L0NvbW1hbmQ+CisgICAgICA8T3V0cHV0cz4kKEludERpcilwbmdzdGVzdC5vdXQ8L091dHB1dHM+CisgICAgICA8SW5wdXRzPiQoT3V0RGlyKXBuZ3N0ZXN0LmV4ZTwvSW5wdXRzPgorICAgIDwvQ3VzdG9tQnVpbGRTdGVwPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxjb250cmliXGxpYnRlc3RzXHBuZ3N0ZXN0LmMiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPgorICA8L0ltcG9ydEdyb3VwPgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGlicG5nL3Byb2plY3RzL3ZzdHVkaW8vcG5ndGVzdC9wbmd0ZXN0LnZjeHByb2ogYi9saWJwbmcvcHJvamVjdHMvdnN0dWRpby9wbmd0ZXN0L3BuZ3Rlc3QudmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjkyNjZmCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3Byb2plY3RzL3ZzdHVkaW8vcG5ndGVzdC9wbmd0ZXN0LnZjeHByb2oKQEAgLTAsMCArMSwyMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWcgTGlicmFyeXxXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZyBMaWJyYXJ5PC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZSBMaWJyYXJ5fFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2UgTGlicmFyeTwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICA8L0l0ZW1Hcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPgorICAgIDxQcm9qZWN0R3VpZD57MjI4QkE5NjUtNTBENS00MkIyLThCQ0YtQUZDQzIyN0UzQzFEfTwvUHJvamVjdEd1aWQ+CisgICAgPEtleXdvcmQ+V2luMzJQcm9qPC9LZXl3b3JkPgorICAgIDxSb290TmFtZXNwYWNlPnBuZ3Rlc3Q8L1Jvb3ROYW1lc3BhY2U+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFNvbHV0aW9uRGlyKVx6bGliLnByb3BzIiAvPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBMaWJyYXJ5fFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIExpYnJhcnl8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8Q2hhcmFjdGVyU2V0PlVuaWNvZGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIExpYnJhcnl8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBMaWJyYXJ5fFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgorICAgIDxMaW5rSW5jcmVtZW50YWw+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4KKyAgICA8Q3VzdG9tQnVpbGRBZnRlclRhcmdldHMgLz4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIExpYnJhcnl8V2luMzInIj4KKyAgICA8TGlua0luY3JlbWVudGFsPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+CisgICAgPEN1c3RvbUJ1aWxkQWZ0ZXJUYXJnZXRzIC8+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgorICAgIDxDdXN0b21CdWlsZEFmdGVyVGFyZ2V0cyAvPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBMaWJyYXJ5fFdpbjMyJyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgorICAgIDxDdXN0b21CdWlsZEFmdGVyVGFyZ2V0cyAvPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWw0PC9XYXJuaW5nTGV2ZWw+CisgICAgICA8TWluaW1hbFJlYnVpbGQ+ZmFsc2U8L01pbmltYWxSZWJ1aWxkPgorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PgorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoWkxpYlNyY0Rpcik7Li5cLi5cLi5cc2NyaXB0czslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPgorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQ5OTY8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPgorICAgICAgPENvbXBpbGVBc01hbmFnZWQ+ZmFsc2U8L0NvbXBpbGVBc01hbmFnZWQ+CisgICAgICA8VHJlYXRXYXJuaW5nQXNFcnJvcj50cnVlPC9UcmVhdFdhcm5pbmdBc0Vycm9yPgorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+CisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPgorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPmZhbHNlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KKyAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj50cnVlPC9Ccm93c2VJbmZvcm1hdGlvbj4KKyAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+CisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz5saWJwbmcxNi5saWI8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+CisgICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4kKE91dERpcik8L0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+CisgICAgPC9MaW5rPgorICAgIDxDdXN0b21CdWlsZFN0ZXA+CisgICAgICA8TWVzc2FnZT5FeGVjdXRpbmcgUE5HIHRlc3QgcHJvZ3JhbTwvTWVzc2FnZT4KKyAgICAgIDxDb21tYW5kPiIkKE91dERpcilwbmd0ZXN0LmV4ZSIgLi5cLi5cLi5ccG5ndGVzdC5wbmcgIiQoSW50RGlyKXBuZ291dC5wbmciPC9Db21tYW5kPgorICAgICAgPE91dHB1dHM+JChJbnREaXIpcG5nb3V0LnBuZzwvT3V0cHV0cz4KKyAgICAgIDxJbnB1dHM+Li5cLi5cLi5ccG5ndGVzdC5wbmc7JChPdXREaXIpcG5ndGVzdC5leGU8L0lucHV0cz4KKyAgICA8L0N1c3RvbUJ1aWxkU3RlcD4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIExpYnJhcnl8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWw0PC9XYXJuaW5nTGV2ZWw+CisgICAgICA8TWluaW1hbFJlYnVpbGQ+ZmFsc2U8L01pbmltYWxSZWJ1aWxkPgorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PgorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+CisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChaTGliU3JjRGlyKTsuLlwuLlwuLlxzY3JpcHRzOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+CisgICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDk5NjwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+CisgICAgICA8Q29tcGlsZUFzTWFuYWdlZD5mYWxzZTwvQ29tcGlsZUFzTWFuYWdlZD4KKyAgICAgIDxUcmVhdFdhcm5pbmdBc0Vycm9yPnRydWU8L1RyZWF0V2FybmluZ0FzRXJyb3I+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+CisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+ZmFsc2U8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPgorICAgICAgPEZsb2F0aW5nUG9pbnRFeGNlcHRpb25zPmZhbHNlPC9GbG9hdGluZ1BvaW50RXhjZXB0aW9ucz4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz5saWJwbmcxNi5saWI7emxpYi5saWI8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+CisgICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4kKE91dERpcik8L0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+CisgICAgPC9MaW5rPgorICAgIDxDdXN0b21CdWlsZFN0ZXA+CisgICAgICA8TWVzc2FnZT5FeGVjdXRpbmcgUE5HIHRlc3QgcHJvZ3JhbTwvTWVzc2FnZT4KKyAgICAgIDxDb21tYW5kPiIkKE91dERpcilwbmd0ZXN0LmV4ZSIgLi5cLi5cLi5ccG5ndGVzdC5wbmcgIiQoSW50RGlyKXBuZ291dC5wbmciPC9Db21tYW5kPgorICAgICAgPE91dHB1dHM+JChJbnREaXIpcG5nb3V0LnBuZzwvT3V0cHV0cz4KKyAgICAgIDxJbnB1dHM+Li5cLi5cLi5ccG5ndGVzdC5wbmc7JChPdXREaXIpcG5ndGVzdC5leGU8L0lucHV0cz4KKyAgICA8L0N1c3RvbUJ1aWxkU3RlcD4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDQ8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+CisgICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz5mYWxzZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtOREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChaTGliU3JjRGlyKTsuLlwuLlwuLlxzY3JpcHRzOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+CisgICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDk5NjwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+CisgICAgICA8Q29tcGlsZUFzTWFuYWdlZD5mYWxzZTwvQ29tcGlsZUFzTWFuYWdlZD4KKyAgICAgIDxUcmVhdFdhcm5pbmdBc0Vycm9yPnRydWU8L1RyZWF0V2FybmluZ0FzRXJyb3I+CisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPgorICAgICAgPE1pbmltYWxSZWJ1aWxkPmZhbHNlPC9NaW5pbWFsUmVidWlsZD4KKyAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj50cnVlPC9Ccm93c2VJbmZvcm1hdGlvbj4KKyAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPgorICAgICAgPEZsb2F0aW5nUG9pbnRFeGNlcHRpb25zPmZhbHNlPC9GbG9hdGluZ1BvaW50RXhjZXB0aW9ucz4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPgorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+CisgICAgICA8TGlua1RpbWVDb2RlR2VuZXJhdGlvbj5Vc2VMaW5rVGltZUNvZGVHZW5lcmF0aW9uPC9MaW5rVGltZUNvZGVHZW5lcmF0aW9uPgorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+bGlicG5nMTYubGliPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPgorICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+JChPdXREaXIpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgorICAgIDwvTGluaz4KKyAgICA8Q3VzdG9tQnVpbGRTdGVwPgorICAgICAgPE1lc3NhZ2U+RXhlY3V0aW5nIFBORyB0ZXN0IHByb2dyYW08L01lc3NhZ2U+CisgICAgICA8Q29tbWFuZD4iJChPdXREaXIpcG5ndGVzdC5leGUiIC4uXC4uXC4uXHBuZ3Rlc3QucG5nICIkKEludERpcilwbmdvdXQucG5nIjwvQ29tbWFuZD4KKyAgICAgIDxPdXRwdXRzPiQoSW50RGlyKXBuZ291dC5wbmc8L091dHB1dHM+CisgICAgICA8SW5wdXRzPi4uXC4uXC4uXHBuZ3Rlc3QucG5nOyQoT3V0RGlyKXBuZ3Rlc3QuZXhlPC9JbnB1dHM+CisgICAgPC9DdXN0b21CdWlsZFN0ZXA+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIExpYnJhcnl8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDQ8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+CisgICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz5mYWxzZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtOREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChaTGliU3JjRGlyKTsuLlwuLlwuLlxzY3JpcHRzOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+CisgICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDk5NjwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+CisgICAgICA8Q29tcGlsZUFzTWFuYWdlZD5mYWxzZTwvQ29tcGlsZUFzTWFuYWdlZD4KKyAgICAgIDxUcmVhdFdhcm5pbmdBc0Vycm9yPnRydWU8L1RyZWF0V2FybmluZ0FzRXJyb3I+CisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPgorICAgICAgPE1pbmltYWxSZWJ1aWxkPmZhbHNlPC9NaW5pbWFsUmVidWlsZD4KKyAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj50cnVlPC9Ccm93c2VJbmZvcm1hdGlvbj4KKyAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPgorICAgICAgPEZsb2F0aW5nUG9pbnRFeGNlcHRpb25zPmZhbHNlPC9GbG9hdGluZ1BvaW50RXhjZXB0aW9ucz4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPgorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+CisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz5saWJwbmcxNi5saWI7emxpYi5saWI8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+CisgICAgICA8TGlua1RpbWVDb2RlR2VuZXJhdGlvbj5Vc2VMaW5rVGltZUNvZGVHZW5lcmF0aW9uPC9MaW5rVGltZUNvZGVHZW5lcmF0aW9uPgorICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+JChPdXREaXIpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgorICAgIDwvTGluaz4KKyAgICA8Q3VzdG9tQnVpbGRTdGVwPgorICAgICAgPE1lc3NhZ2U+RXhlY3V0aW5nIFBORyB0ZXN0IHByb2dyYW08L01lc3NhZ2U+CisgICAgICA8Q29tbWFuZD4kKE91dERpcilwbmd0ZXN0LmV4ZSAuLlwuLlwuLlxwbmd0ZXN0LnBuZyAkKEludERpcilwbmdvdXQucG5nPC9Db21tYW5kPgorICAgICAgPENvbW1hbmQ+IiQoT3V0RGlyKXBuZ3Rlc3QuZXhlIiAuLlwuLlwuLlxwbmd0ZXN0LnBuZyAiJChJbnREaXIpcG5nb3V0LnBuZyI8L0NvbW1hbmQ+CisgICAgICA8T3V0cHV0cz4kKEludERpcilwbmdvdXQucG5nPC9PdXRwdXRzPgorICAgICAgPElucHV0cz4uLlwuLlwuLlxwbmd0ZXN0LnBuZzskKE91dERpcilwbmd0ZXN0LmV4ZTwvSW5wdXRzPgorICAgIDwvQ3VzdG9tQnVpbGRTdGVwPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxwbmd0ZXN0LmMiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPgorICA8L0ltcG9ydEdyb3VwPgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGlicG5nL3Byb2plY3RzL3ZzdHVkaW8vcG5ndW5rbm93bi9wbmd1bmtub3duLnZjeHByb2ogYi9saWJwbmcvcHJvamVjdHMvdnN0dWRpby9wbmd1bmtub3duL3BuZ3Vua25vd24udmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzBjYzdhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3Byb2plY3RzL3ZzdHVkaW8vcG5ndW5rbm93bi9wbmd1bmtub3duLnZjeHByb2oKQEAgLTAsMCArMSwyMTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWcgTGlicmFyeXxXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZyBMaWJyYXJ5PC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZSBMaWJyYXJ5fFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2UgTGlicmFyeTwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICA8L0l0ZW1Hcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPgorICAgIDxQcm9qZWN0R3VpZD57QzVEMzE1NkMtOEM4Qy00OTM2LUIzNUYtMkI4MjlCQTM2RkVDfTwvUHJvamVjdEd1aWQ+CisgICAgPEtleXdvcmQ+V2luMzJQcm9qPC9LZXl3b3JkPgorICAgIDxSb290TmFtZXNwYWNlPnBuZ3Vua25vd248L1Jvb3ROYW1lc3BhY2U+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFNvbHV0aW9uRGlyKVx6bGliLnByb3BzIiAvPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBMaWJyYXJ5fFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIExpYnJhcnl8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8Q2hhcmFjdGVyU2V0PlVuaWNvZGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIExpYnJhcnl8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBMaWJyYXJ5fFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgorICAgIDxMaW5rSW5jcmVtZW50YWw+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4KKyAgICA8Q3VzdG9tQnVpbGRBZnRlclRhcmdldHMgLz4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIExpYnJhcnl8V2luMzInIj4KKyAgICA8TGlua0luY3JlbWVudGFsPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+CisgICAgPEN1c3RvbUJ1aWxkQWZ0ZXJUYXJnZXRzIC8+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgorICAgIDxDdXN0b21CdWlsZEFmdGVyVGFyZ2V0cyAvPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBMaWJyYXJ5fFdpbjMyJyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgorICAgIDxDdXN0b21CdWlsZEFmdGVyVGFyZ2V0cyAvPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWw0PC9XYXJuaW5nTGV2ZWw+CisgICAgICA8TWluaW1hbFJlYnVpbGQ+ZmFsc2U8L01pbmltYWxSZWJ1aWxkPgorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PgorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19DT05TT0xFO1BOR19VU0VfRExMOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoWkxpYlNyY0Rpcik7Li5cLi5cLi5cc2NyaXB0czslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPgorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQ5OTY7NDEyNzwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+CisgICAgICA8Q29tcGlsZUFzTWFuYWdlZD5mYWxzZTwvQ29tcGlsZUFzTWFuYWdlZD4KKyAgICAgIDxUcmVhdFdhcm5pbmdBc0Vycm9yPnRydWU8L1RyZWF0V2FybmluZ0FzRXJyb3I+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+CisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+ZmFsc2U8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPgorICAgICAgPEZsb2F0aW5nUG9pbnRFeGNlcHRpb25zPmZhbHNlPC9GbG9hdGluZ1BvaW50RXhjZXB0aW9ucz4KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWdETEw8L1J1bnRpbWVMaWJyYXJ5PgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPmxpYnBuZzE2LmxpYjwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4KKyAgICAgIDxBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPiQoT3V0RGlyKTwvQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4KKyAgICA8L0xpbms+CisgICAgPEN1c3RvbUJ1aWxkU3RlcD4KKyAgICAgIDxNZXNzYWdlPkV4ZWN1dGluZyBQTkcgdmFsaWRhdGlvbiBwcm9ncmFtPC9NZXNzYWdlPgorICAgICAgPENvbW1hbmQ+IiQoT3V0RGlyKXBuZ3Vua25vd24uZXhlIiAtLXN0cmljdCAtLWRlZmF1bHQgLS10b3VjaCAiJChJbnREaXIpcG5ndW5rbm93bi5vdXQiIC4uLy4uLy4uL3BuZ3Rlc3QucG5nPC9Db21tYW5kPgorICAgICAgPE91dHB1dHM+JChJbnREaXIpcG5ndW5rbm93bi5vdXQ8L091dHB1dHM+CisgICAgICA8SW5wdXRzPiQoT3V0RGlyKXBuZ3Vua25vd24uZXhlPC9JbnB1dHM+CisgICAgPC9DdXN0b21CdWlsZFN0ZXA+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBMaWJyYXJ5fFdpbjMyJyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsNDwvV2FybmluZ0xldmVsPgorICAgICAgPE1pbmltYWxSZWJ1aWxkPmZhbHNlPC9NaW5pbWFsUmVidWlsZD4KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPgorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoWkxpYlNyY0Rpcik7Li5cLi5cLi5cc2NyaXB0czslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPgorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQ5OTY7NDEyNzwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+CisgICAgICA8Q29tcGlsZUFzTWFuYWdlZD5mYWxzZTwvQ29tcGlsZUFzTWFuYWdlZD4KKyAgICAgIDxUcmVhdFdhcm5pbmdBc0Vycm9yPnRydWU8L1RyZWF0V2FybmluZ0FzRXJyb3I+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+CisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+ZmFsc2U8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPgorICAgICAgPEZsb2F0aW5nUG9pbnRFeGNlcHRpb25zPmZhbHNlPC9GbG9hdGluZ1BvaW50RXhjZXB0aW9ucz4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz5saWJwbmcxNi5saWI7emxpYi5saWI8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+CisgICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4kKE91dERpcik8L0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+CisgICAgPC9MaW5rPgorICAgIDxDdXN0b21CdWlsZFN0ZXA+CisgICAgICA8TWVzc2FnZT5FeGVjdXRpbmcgUE5HIHZhbGlkYXRpb24gcHJvZ3JhbTwvTWVzc2FnZT4KKyAgICAgIDxDb21tYW5kPiIkKE91dERpcilwbmd1bmtub3duLmV4ZSIgLS1zdHJpY3QgLS1kZWZhdWx0IC0tdG91Y2ggIiQoSW50RGlyKXBuZ3Vua25vd24ub3V0IiAuLi8uLi8uLi9wbmd0ZXN0LnBuZzwvQ29tbWFuZD4KKyAgICAgIDxPdXRwdXRzPiQoSW50RGlyKXBuZ3Vua25vd24ub3V0PC9PdXRwdXRzPgorICAgICAgPElucHV0cz4kKE91dERpcilwbmd1bmtub3duLmV4ZTwvSW5wdXRzPgorICAgIDwvQ3VzdG9tQnVpbGRTdGVwPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsNDwvV2FybmluZ0xldmVsPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4KKyAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPgorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPmZhbHNlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfQ09OU09MRTtQTkdfVVNFX0RMTDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4kKFpMaWJTcmNEaXIpOy4uXC4uXC4uXHNjcmlwdHM7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40OTk2OzQxMjc8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPgorICAgICAgPENvbXBpbGVBc01hbmFnZWQ+ZmFsc2U8L0NvbXBpbGVBc01hbmFnZWQ+CisgICAgICA8VHJlYXRXYXJuaW5nQXNFcnJvcj50cnVlPC9UcmVhdFdhcm5pbmdBc0Vycm9yPgorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4KKyAgICAgIDxNaW5pbWFsUmVidWlsZD5mYWxzZTwvTWluaW1hbFJlYnVpbGQ+CisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+CisgICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KKyAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+bGlicG5nMTYubGliPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPgorICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+JChPdXREaXIpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgorICAgICAgPExpbmtUaW1lQ29kZUdlbmVyYXRpb24+VXNlTGlua1RpbWVDb2RlR2VuZXJhdGlvbjwvTGlua1RpbWVDb2RlR2VuZXJhdGlvbj4KKyAgICA8L0xpbms+CisgICAgPEN1c3RvbUJ1aWxkU3RlcD4KKyAgICAgIDxNZXNzYWdlPkV4ZWN1dGluZyBQTkcgdmFsaWRhdGlvbiBwcm9ncmFtPC9NZXNzYWdlPgorICAgICAgPENvbW1hbmQ+IiQoT3V0RGlyKXBuZ3Vua25vd24uZXhlIiAtLXN0cmljdCAtLWRlZmF1bHQgLS10b3VjaCAiJChJbnREaXIpcG5ndW5rbm93bi5vdXQiIC4uLy4uLy4uL3BuZ3Rlc3QucG5nPC9Db21tYW5kPgorICAgICAgPE91dHB1dHM+JChJbnREaXIpcG5ndW5rbm93bi5vdXQ8L091dHB1dHM+CisgICAgICA8SW5wdXRzPiQoT3V0RGlyKXBuZ3Vua25vd24uZXhlPC9JbnB1dHM+CisgICAgPC9DdXN0b21CdWlsZFN0ZXA+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIExpYnJhcnl8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDQ8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+CisgICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz5mYWxzZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtOREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChaTGliU3JjRGlyKTsuLlwuLlwuLlxzY3JpcHRzOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+CisgICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDk5Njs0MTI3PC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4KKyAgICAgIDxDb21waWxlQXNNYW5hZ2VkPmZhbHNlPC9Db21waWxlQXNNYW5hZ2VkPgorICAgICAgPFRyZWF0V2FybmluZ0FzRXJyb3I+dHJ1ZTwvVHJlYXRXYXJuaW5nQXNFcnJvcj4KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+CisgICAgICA8TWluaW1hbFJlYnVpbGQ+ZmFsc2U8L01pbmltYWxSZWJ1aWxkPgorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPgorICAgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+CisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+CisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPmxpYnBuZzE2LmxpYjt6bGliLmxpYjwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4KKyAgICAgIDxBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPiQoT3V0RGlyKTwvQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4KKyAgICAgIDxMaW5rVGltZUNvZGVHZW5lcmF0aW9uPlVzZUxpbmtUaW1lQ29kZUdlbmVyYXRpb248L0xpbmtUaW1lQ29kZUdlbmVyYXRpb24+CisgICAgPC9MaW5rPgorICAgIDxDdXN0b21CdWlsZFN0ZXA+CisgICAgICA8TWVzc2FnZT5FeGVjdXRpbmcgUE5HIHZhbGlkYXRpb24gcHJvZ3JhbTwvTWVzc2FnZT4KKyAgICAgIDxDb21tYW5kPiIkKE91dERpcilwbmd1bmtub3duLmV4ZSIgLS1zdHJpY3QgLS1kZWZhdWx0IC0tdG91Y2ggIiQoSW50RGlyKXBuZ3Vua25vd24ub3V0IiAuLi8uLi8uLi9wbmd0ZXN0LnBuZzwvQ29tbWFuZD4KKyAgICAgIDxPdXRwdXRzPiQoSW50RGlyKXBuZ3Vua25vd24ub3V0PC9PdXRwdXRzPgorICAgICAgPElucHV0cz4kKE91dERpcilwbmd1bmtub3duLmV4ZTwvSW5wdXRzPgorICAgIDwvQ3VzdG9tQnVpbGRTdGVwPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxjb250cmliXGxpYnRlc3RzXHBuZ3Vua25vd24uYyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+CisgIDwvSW1wb3J0R3JvdXA+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWJwbmcvcHJvamVjdHMvdnN0dWRpby9wbmd2YWxpZC9wbmd2YWxpZC52Y3hwcm9qIGIvbGlicG5nL3Byb2plY3RzL3ZzdHVkaW8vcG5ndmFsaWQvcG5ndmFsaWQudmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2NmMjQxCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3Byb2plY3RzL3ZzdHVkaW8vcG5ndmFsaWQvcG5ndmFsaWQudmN4cHJvagpAQCAtMCwwICsxLDIxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1ZyBMaWJyYXJ5fFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnIExpYnJhcnk8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlIExpYnJhcnl8V2luMzIiPgorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZSBMaWJyYXJ5PC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgIDwvSXRlbUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+CisgICAgPFByb2plY3RHdWlkPns5QjM2QjZGRS03RkMwLTQzNEYtQTcxRi1CQkVGODA5OUYxRDh9PC9Qcm9qZWN0R3VpZD4KKyAgICA8S2V5d29yZD5XaW4zMlByb2o8L0tleXdvcmQ+CisgICAgPFJvb3ROYW1lc3BhY2U+cG5ndmFsaWQ8L1Jvb3ROYW1lc3BhY2U+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFNvbHV0aW9uRGlyKVx6bGliLnByb3BzIiAvPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBMaWJyYXJ5fFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIExpYnJhcnl8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8Q2hhcmFjdGVyU2V0PlVuaWNvZGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIExpYnJhcnl8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBMaWJyYXJ5fFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgorICAgIDxMaW5rSW5jcmVtZW50YWw+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4KKyAgICA8Q3VzdG9tQnVpbGRBZnRlclRhcmdldHMgLz4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIExpYnJhcnl8V2luMzInIj4KKyAgICA8TGlua0luY3JlbWVudGFsPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+CisgICAgPEN1c3RvbUJ1aWxkQWZ0ZXJUYXJnZXRzIC8+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgorICAgIDxDdXN0b21CdWlsZEFmdGVyVGFyZ2V0cyAvPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBMaWJyYXJ5fFdpbjMyJyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgorICAgIDxDdXN0b21CdWlsZEFmdGVyVGFyZ2V0cyAvPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWw0PC9XYXJuaW5nTGV2ZWw+CisgICAgICA8TWluaW1hbFJlYnVpbGQ+ZmFsc2U8L01pbmltYWxSZWJ1aWxkPgorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PgorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19DT05TT0xFO1BOR19VU0VfRExMOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoWkxpYlNyY0Rpcik7Li5cLi5cLi5cc2NyaXB0czslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPgorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQ5OTY7NDEyNzwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+CisgICAgICA8Q29tcGlsZUFzTWFuYWdlZD5mYWxzZTwvQ29tcGlsZUFzTWFuYWdlZD4KKyAgICAgIDxUcmVhdFdhcm5pbmdBc0Vycm9yPnRydWU8L1RyZWF0V2FybmluZ0FzRXJyb3I+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+CisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+ZmFsc2U8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPgorICAgICAgPEZsb2F0aW5nUG9pbnRFeGNlcHRpb25zPmZhbHNlPC9GbG9hdGluZ1BvaW50RXhjZXB0aW9ucz4KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWdETEw8L1J1bnRpbWVMaWJyYXJ5PgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPmxpYnBuZzE2LmxpYjt6bGliLmxpYjwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4KKyAgICAgIDxBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPiQoT3V0RGlyKTwvQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4KKyAgICA8L0xpbms+CisgICAgPEN1c3RvbUJ1aWxkU3RlcD4KKyAgICAgIDxNZXNzYWdlPkV4ZWN1dGluZyBQTkcgdmFsaWRhdGlvbiBwcm9ncmFtPC9NZXNzYWdlPgorICAgICAgPENvbW1hbmQ+IiQoT3V0RGlyKXBuZ3ZhbGlkLmV4ZSIgLS10b3VjaCAiJChJbnREaXIpcG5ndmFsaWQub3V0IjwvQ29tbWFuZD4KKyAgICAgIDxPdXRwdXRzPiQoSW50RGlyKXBuZ3ZhbGlkLm91dDwvT3V0cHV0cz4KKyAgICAgIDxJbnB1dHM+JChPdXREaXIpcG5ndmFsaWQuZXhlPC9JbnB1dHM+CisgICAgPC9DdXN0b21CdWlsZFN0ZXA+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBMaWJyYXJ5fFdpbjMyJyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsNDwvV2FybmluZ0xldmVsPgorICAgICAgPE1pbmltYWxSZWJ1aWxkPmZhbHNlPC9NaW5pbWFsUmVidWlsZD4KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPgorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoWkxpYlNyY0Rpcik7Li5cLi5cLi5cc2NyaXB0czslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPgorICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQ5OTY7NDEyNzwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+CisgICAgICA8Q29tcGlsZUFzTWFuYWdlZD5mYWxzZTwvQ29tcGlsZUFzTWFuYWdlZD4KKyAgICAgIDxUcmVhdFdhcm5pbmdBc0Vycm9yPnRydWU8L1RyZWF0V2FybmluZ0FzRXJyb3I+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+CisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+ZmFsc2U8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPgorICAgICAgPEZsb2F0aW5nUG9pbnRFeGNlcHRpb25zPmZhbHNlPC9GbG9hdGluZ1BvaW50RXhjZXB0aW9ucz4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz5saWJwbmcxNi5saWI7emxpYi5saWI8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+CisgICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4kKE91dERpcik8L0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+CisgICAgPC9MaW5rPgorICAgIDxDdXN0b21CdWlsZFN0ZXA+CisgICAgICA8TWVzc2FnZT5FeGVjdXRpbmcgUE5HIHZhbGlkYXRpb24gcHJvZ3JhbTwvTWVzc2FnZT4KKyAgICAgIDxDb21tYW5kPiIkKE91dERpcilwbmd2YWxpZC5leGUiIC0tdG91Y2ggIiQoSW50RGlyKXBuZ3ZhbGlkLm91dCI8L0NvbW1hbmQ+CisgICAgICA8T3V0cHV0cz4kKEludERpcilwbmd2YWxpZC5vdXQ8L091dHB1dHM+CisgICAgICA8SW5wdXRzPiQoT3V0RGlyKXBuZ3ZhbGlkLmV4ZTwvSW5wdXRzPgorICAgIDwvQ3VzdG9tQnVpbGRTdGVwPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsNDwvV2FybmluZ0xldmVsPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4KKyAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPgorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPmZhbHNlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfQ09OU09MRTtQTkdfVVNFX0RMTDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4kKFpMaWJTcmNEaXIpOy4uXC4uXC4uXHNjcmlwdHM7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4KKyAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40OTk2OzQxMjc8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPgorICAgICAgPENvbXBpbGVBc01hbmFnZWQ+ZmFsc2U8L0NvbXBpbGVBc01hbmFnZWQ+CisgICAgICA8VHJlYXRXYXJuaW5nQXNFcnJvcj50cnVlPC9UcmVhdFdhcm5pbmdBc0Vycm9yPgorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4KKyAgICAgIDxNaW5pbWFsUmVidWlsZD5mYWxzZTwvTWluaW1hbFJlYnVpbGQ+CisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+CisgICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KKyAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+bGlicG5nMTYubGliO3psaWIubGliPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPgorICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+JChPdXREaXIpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgorICAgICAgPExpbmtUaW1lQ29kZUdlbmVyYXRpb24+VXNlTGlua1RpbWVDb2RlR2VuZXJhdGlvbjwvTGlua1RpbWVDb2RlR2VuZXJhdGlvbj4KKyAgICA8L0xpbms+CisgICAgPEN1c3RvbUJ1aWxkU3RlcD4KKyAgICAgIDxNZXNzYWdlPkV4ZWN1dGluZyBQTkcgdmFsaWRhdGlvbiBwcm9ncmFtPC9NZXNzYWdlPgorICAgICAgPENvbW1hbmQ+IiQoT3V0RGlyKXBuZ3ZhbGlkLmV4ZSIgLS10b3VjaCAiJChJbnREaXIpcG5ndmFsaWQub3V0IjwvQ29tbWFuZD4KKyAgICAgIDxPdXRwdXRzPiQoSW50RGlyKXBuZ3ZhbGlkLm91dDwvT3V0cHV0cz4KKyAgICAgIDxJbnB1dHM+JChPdXREaXIpcG5ndmFsaWQuZXhlPC9JbnB1dHM+CisgICAgPC9DdXN0b21CdWlsZFN0ZXA+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIExpYnJhcnl8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDQ8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+CisgICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz5mYWxzZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtOREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChaTGliU3JjRGlyKTsuLlwuLlwuLlxzY3JpcHRzOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+CisgICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDk5Njs0MTI3PC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4KKyAgICAgIDxDb21waWxlQXNNYW5hZ2VkPmZhbHNlPC9Db21waWxlQXNNYW5hZ2VkPgorICAgICAgPFRyZWF0V2FybmluZ0FzRXJyb3I+dHJ1ZTwvVHJlYXRXYXJuaW5nQXNFcnJvcj4KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+CisgICAgICA8TWluaW1hbFJlYnVpbGQ+ZmFsc2U8L01pbmltYWxSZWJ1aWxkPgorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPgorICAgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+CisgICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+CisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPmxpYnBuZzE2LmxpYjt6bGliLmxpYjwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4KKyAgICAgIDxBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPiQoT3V0RGlyKTwvQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4KKyAgICAgIDxMaW5rVGltZUNvZGVHZW5lcmF0aW9uPlVzZUxpbmtUaW1lQ29kZUdlbmVyYXRpb248L0xpbmtUaW1lQ29kZUdlbmVyYXRpb24+CisgICAgPC9MaW5rPgorICAgIDxDdXN0b21CdWlsZFN0ZXA+CisgICAgICA8TWVzc2FnZT5FeGVjdXRpbmcgUE5HIHZhbGlkYXRpb24gcHJvZ3JhbTwvTWVzc2FnZT4KKyAgICAgIDxDb21tYW5kPiIkKE91dERpcilwbmd2YWxpZC5leGUiIC0tdG91Y2ggIiQoSW50RGlyKXBuZ3ZhbGlkLm91dCI8L0NvbW1hbmQ+CisgICAgICA8T3V0cHV0cz4kKEludERpcilwbmd2YWxpZC5vdXQ8L091dHB1dHM+CisgICAgICA8SW5wdXRzPiQoT3V0RGlyKXBuZ3ZhbGlkLmV4ZTwvSW5wdXRzPgorICAgIDwvQ3VzdG9tQnVpbGRTdGVwPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxjb250cmliXGxpYnRlc3RzXHBuZ3ZhbGlkLmMiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPgorICA8L0ltcG9ydEdyb3VwPgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGlicG5nL3Byb2plY3RzL3ZzdHVkaW8vcmVhZG1lLnR4dCBiL2xpYnBuZy9wcm9qZWN0cy92c3R1ZGlvL3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg2NjQ2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9wcm9qZWN0cy92c3R1ZGlvL3JlYWRtZS50eHQKQEAgLTAsMCArMSw2NSBAQAorCitWaXN1YWxTdHVkaW8gaW5zdHJ1Y3Rpb25zCisKK2xpYnBuZyB2ZXJzaW9uIDEuNi4yMCAtIERlY2VtYmVyIDMsIDIwMTUKKworQ29weXJpZ2h0IChjKSAxOTk4LTIwMTAgR2xlbm4gUmFuZGVycy1QZWhyc29uCisKK1RoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCitGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCithbmQgbGljZW5zZSBpbiBwbmcuaAorCitUaGlzIGRpcmVjdG9yeSAgY29udGFpbnMgc3VwcG9ydCBmb3IgYnVpbGRpbmcgbGlicG5nIHVuZGVyIE1pY3JvU29mdAorVmlzdWFsU3R1ZGlvIDIwMTAuICBJdCBtYXkgYWxzbyB3b3JrIHVuZGVyIGxhdGVyIHZlcnNpb25zIG9mIFZpc3VhbFN0dWRpby4KK1lvdSBzaG91bGQgYmUgZmFtaWxpYXIgd2l0aCBWaXN1YWxTdHVkaW8gYmVmb3JlIHVzaW5nIHRoaXMgZGlyZWN0b3J5LgorCitJbml0aWFsIHByZXBhcmF0aW9ucworPT09PT09PT09PT09PT09PT09PT0KK1lvdSBtdXN0IGVudGVyIHNvbWUgaW5mb3JtYXRpb24gaW4gemxpYi5wcm9wcyBiZWZvcmUgYXR0ZW1wdGluZyB0byBidWlsZAord2l0aCB0aGlzICdzb2x1dGlvbicuICBQbGVhc2UgcmVhZCBhbmQgZWRpdCB6bGliLnByb3BzIGZpcnN0LiAgWW91IHdpbGwKK3Byb2JhYmx5IG5vdCBiZSBmYW1pbGlhciB3aXRoIHRoZSBjb250ZW50cyBvZiB6bGliLnByb3BzIC0gZG8gbm90IHdvcnJ5LAoraXQgaXMgbW9zdGx5IGhhcm1sZXNzLgorCitUaGlzIGlzIGFsbCB5b3UgbmVlZCB0byBkbyB0byBidWlsZCB0aGUgJ3JlbGVhc2UnIGFuZCAncmVsZWFzZSBsaWJyYXJ5JworY29uZmlndXJhdGlvbnMuCisKK0RlYnVnZ2luZworPT09PT09PT09CitUaGUgcmVsZWFzZSBjb25maWd1cmF0aW9ucyBkZWZhdWx0IHRvIC9PeCBvcHRpbWl6YXRpb24uICBGdWxsIGRlYnVnZ2luZworaW5mb3JtYXRpb24gaXMgcHJvZHVjZWQgKGluIHRoZSAucGRiKSwgYnV0IGlmIHlvdSBlbmNvdW50ZXIgYSBwcm9ibGVtIHRoZQorb3B0aW1pemF0aW9uIG1heSBtYWtlIGl0IGRpZmZpY3VsdCB0byBkZWJ1Zy4gIFNpbXBseSByZWJ1aWxkIHdpdGggYSBsb3dlcgorb3B0aW1pemF0aW9uIGxldmVsIChlLmcuIC9PZC4pCisKK0xpbmtpbmcgeW91ciBhcHBsaWNhdGlvbgorPT09PT09PT09PT09PT09PT09PT09PT09CitOb3JtYWxseSB5b3Ugc2hvdWxkIGxpbmsgYWdhaW5zdCB0aGUgJ3JlbGVhc2UnIGNvbmZpZ3VyYXRpb24uICBUaGlzIGJ1aWxkcyBhCitETEwgZm9yIGxpYnBuZyB3aXRoIHRoZSBkZWZhdWx0IHJ1bnRpbWUgb3B0aW9ucyB1c2VkIGJ5IFZpc3VhbCBTdHVkaW8gMjAxMC4KK0luIHBhcnRpY3VsYXIgdGhlIHJ1bnRpbWUgbGlicmFyeSBpcyB0aGUgIk11bHRpVGhyZWFkZWQgRExMIiB2ZXJzaW9uLgorSWYgeW91IHVzZSBWaXN1YWwgU3R1ZGlvIGRlZmF1bHRzIHRvIGJ1aWxkIHlvdXIgYXBwbGljYXRpb24geW91IHdpbGwgaGF2ZSBubworcHJvYmxlbXMuCisKK0lmIHlvdSBkb24ndCB1c2UgdGhlIFZpc3VhbCBTdHVkaW8gZGVmYXVsdHMgeW91ciBhcHBsaWNhdGlvbiBtdXN0IHN0aWxsIGJlIGJ1aWx0Cit3aXRoIHRoZSBkZWZhdWx0IHJ1bnRpbWUgb3B0aW9uICgvTUQpLiAgSWYsIGZvciBzb21lIHJlYXNvbiwgaXQgaXMgbm90IHRoZW4geW91cgorYXBwbGljYXRpb24gd2lsbCBjcmFzaCBpbnNpZGUgbGlicG5nMTYuZGxsIGFzIHNvb24gYXMgbGlicG5nIHRyaWVzIHRvIHJlYWQKK2Zyb20gYSBmaWxlIGhhbmRsZSB5b3UgcGFzcyBpbi4KKworSWYgeW91IGRvIG5vdCB3YW50IHRvIHVzZSB0aGUgRExMLCBmb3IgZXhhbXBsZSBmb3IgYSB2ZXJ5IHNtYWxsIGFwcGxpY2F0aW9uLAordGhlICdyZWxlYXNlIGxpYnJhcnknIGNvbmZpZ3VyYXRpb24gbWF5IGJlIG1vcmUgYXBwcm9wcmlhdGUuICBUaGlzIGlzIGJ1aWx0Cit3aXRoIGEgbm9uLXN0YW5kYXJkIHJ1bnRpbWUgbGlicmFyeSAtIHRoZSAiTXVsdGlUaHJlYWRlZCIgdmVyc2lvbi4gIFdoZW4geW91CitidWlsZCB5b3VyIGFwcGxpY2F0aW9uIGl0IG11c3QgYmUgY29tcGlsZWQgd2l0aCB0aGlzIG9wdGlvbiAoL01UKSwgb3RoZXJ3aXNlCitpdCB3aWxsIG5vdCBidWlsZCAoaWYgeW91IGFyZSBsdWNreSkgb3IgY3Jhc2ggKGlmIHlvdSBhcmUgbm90LikKKworU3RvcCByZWFkaW5nIGhlcmUKKz09PT09PT09PT09PT09PT09CitZb3UgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gYnVpbGQgYSB3b3JraW5nIGFwcGxpY2F0aW9uLgorCitEZWJ1ZyB2ZXJzaW9ucyBoYXZlIGxpbWl0ZWQgc3VwcG9ydAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1RoaXMgc29sdXRpb24gaW5jbHVkZXMgbGltaXRlZCBzdXBwb3J0IGZvciBkZWJ1ZyB2ZXJzaW9ucyBvZiBsaWJwbmcuICBZb3UKK2RvIG5vdCBuZWVkIHRoZXNlIHVubGVzcyB5b3VyIG93biBzb2x1dGlvbiBpdHNlbGYgdXNlcyBkZWJ1ZyBidWlsZHMgKGl0IGlzCitmYXIgbW9yZSBlZmZlY3RpdmUgdG8gZGVidWcgb24gdGhlIHJlbGVhc2UgYnVpbGRzLCB0aGVyZSBpcyBubyBwb2ludCBidWlsZGluZworYSBzcGVjaWFsIGRlYnVnIGJ1aWxkIHVubGVzcyB5b3UgaGF2ZSBoZWFwIGNvcnJ1cHRpb24gcHJvYmxlbXMgdGhhdCB5b3UgY2FuJ3QKK3RyYWNrIGRvd24uKQorCitUaGUgZGVidWcgYnVpbGQgb2YgbGlicG5nIGlzIG1pbmltYWxseSBzdXBwb3J0ZWQuICBTdXBwb3J0IGZvciBkZWJ1ZyBidWlsZHMgb2YKK3psaWIgaXMgYWxzbyBtaW5pbWFsLiAgWW91IHJlYWxseSBkb24ndCB3YW50IHRvIGRvIHRoaXMuCmRpZmYgLS1naXQgYS9saWJwbmcvcHJvamVjdHMvdnN0dWRpby92c3R1ZGlvLnNsbiBiL2xpYnBuZy9wcm9qZWN0cy92c3R1ZGlvL3ZzdHVkaW8uc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMGIxYmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvcHJvamVjdHMvdnN0dWRpby92c3R1ZGlvLnNsbgpAQCAtMCwwICsxLDEwOSBAQAorTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTEuMDAKKyMgVmlzdWFsIFN0dWRpbyAyMDEwCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gInpsaWIiLCAiemxpYlx6bGliLnZjeHByb2oiLCAiezYwRjg5OTU1LTkxQzYtM0EzNi04MDAwLTEzQzU5MkZFQzJERn0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gInBuZ2xpYmNvbmYiLCAicG5nbGliY29uZlxwbmdsaWJjb25mLnZjeHByb2oiLCAie0VCMzM1NjZFLURBN0YtNEQyOC05MDc3LTg4QzBCN0M3N0UzNX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImxpYnBuZyIsICJsaWJwbmdcbGlicG5nLnZjeHByb2oiLCAie0Q2OTczMDc2LTkzMTctNEVGMi1BMEI4LUI3QTE4QUMwNzEzRX0iCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdAorCQl7NjBGODk5NTUtOTFDNi0zQTM2LTgwMDAtMTNDNTkyRkVDMkRGfSA9IHs2MEY4OTk1NS05MUM2LTNBMzYtODAwMC0xM0M1OTJGRUMyREZ9CisJCXtFQjMzNTY2RS1EQTdGLTREMjgtOTA3Ny04OEMwQjdDNzdFMzV9ID0ge0VCMzM1NjZFLURBN0YtNEQyOC05MDc3LTg4QzBCN0M3N0UzNX0KKwlFbmRQcm9qZWN0U2VjdGlvbgorRW5kUHJvamVjdAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJwbmd0ZXN0IiwgInBuZ3Rlc3RccG5ndGVzdC52Y3hwcm9qIiwgInsyMjhCQTk2NS01MEQ1LTQyQjItOEJDRi1BRkNDMjI3RTNDMUR9IgorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QKKwkJezYwRjg5OTU1LTkxQzYtM0EzNi04MDAwLTEzQzU5MkZFQzJERn0gPSB7NjBGODk5NTUtOTFDNi0zQTM2LTgwMDAtMTNDNTkyRkVDMkRGfQorCQl7RUIzMzU2NkUtREE3Ri00RDI4LTkwNzctODhDMEI3Qzc3RTM1fSA9IHtFQjMzNTY2RS1EQTdGLTREMjgtOTA3Ny04OEMwQjdDNzdFMzV9CisJCXtENjk3MzA3Ni05MzE3LTRFRjItQTBCOC1CN0ExOEFDMDcxM0V9ID0ge0Q2OTczMDc2LTkzMTctNEVGMi1BMEI4LUI3QTE4QUMwNzEzRX0KKwlFbmRQcm9qZWN0U2VjdGlvbgorRW5kUHJvamVjdAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJwbmd2YWxpZCIsICJwbmd2YWxpZFxwbmd2YWxpZC52Y3hwcm9qIiwgIns5QjM2QjZGRS03RkMwLTQzNEYtQTcxRi1CQkVGODA5OUYxRDh9IgorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QKKwkJezYwRjg5OTU1LTkxQzYtM0EzNi04MDAwLTEzQzU5MkZFQzJERn0gPSB7NjBGODk5NTUtOTFDNi0zQTM2LTgwMDAtMTNDNTkyRkVDMkRGfQorCQl7RUIzMzU2NkUtREE3Ri00RDI4LTkwNzctODhDMEI3Qzc3RTM1fSA9IHtFQjMzNTY2RS1EQTdGLTREMjgtOTA3Ny04OEMwQjdDNzdFMzV9CisJCXtENjk3MzA3Ni05MzE3LTRFRjItQTBCOC1CN0ExOEFDMDcxM0V9ID0ge0Q2OTczMDc2LTkzMTctNEVGMi1BMEI4LUI3QTE4QUMwNzEzRX0KKwlFbmRQcm9qZWN0U2VjdGlvbgorRW5kUHJvamVjdAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJwbmdzdGVzdCIsICJwbmdzdGVzdFxwbmdzdGVzdC52Y3hwcm9qIiwgInsyNzdBQzU3Ri0zMTNCLTREMDYtQjExOS1BM0NEQjY3MkQyRkZ9IgorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QKKwkJezYwRjg5OTU1LTkxQzYtM0EzNi04MDAwLTEzQzU5MkZFQzJERn0gPSB7NjBGODk5NTUtOTFDNi0zQTM2LTgwMDAtMTNDNTkyRkVDMkRGfQorCQl7RUIzMzU2NkUtREE3Ri00RDI4LTkwNzctODhDMEI3Qzc3RTM1fSA9IHtFQjMzNTY2RS1EQTdGLTREMjgtOTA3Ny04OEMwQjdDNzdFMzV9CisJCXtENjk3MzA3Ni05MzE3LTRFRjItQTBCOC1CN0ExOEFDMDcxM0V9ID0ge0Q2OTczMDc2LTkzMTctNEVGMi1BMEI4LUI3QTE4QUMwNzEzRX0KKwlFbmRQcm9qZWN0U2VjdGlvbgorRW5kUHJvamVjdAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJwbmd1bmtub3duIiwgInBuZ3Vua25vd25ccG5ndW5rbm93bi52Y3hwcm9qIiwgIntDNUQzMTU2Qy04QzhDLTQ5MzYtQjM1Ri0yQjgyOUJBMzZGRUN9IgorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QKKwkJezYwRjg5OTU1LTkxQzYtM0EzNi04MDAwLTEzQzU5MkZFQzJERn0gPSB7NjBGODk5NTUtOTFDNi0zQTM2LTgwMDAtMTNDNTkyRkVDMkRGfQorCQl7RUIzMzU2NkUtREE3Ri00RDI4LTkwNzctODhDMEI3Qzc3RTM1fSA9IHtFQjMzNTY2RS1EQTdGLTREMjgtOTA3Ny04OEMwQjdDNzdFMzV9CisJCXtENjk3MzA3Ni05MzE3LTRFRjItQTBCOC1CN0ExOEFDMDcxM0V9ID0ge0Q2OTczMDc2LTkzMTctNEVGMi1BMEI4LUI3QTE4QUMwNzEzRX0KKwlFbmRQcm9qZWN0U2VjdGlvbgorRW5kUHJvamVjdAorR2xvYmFsCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKwkJRGVidWcgTGlicmFyeXxXaW4zMiA9IERlYnVnIExpYnJhcnl8V2luMzIKKwkJRGVidWd8V2luMzIgPSBEZWJ1Z3xXaW4zMgorCQlSZWxlYXNlIExpYnJhcnl8V2luMzIgPSBSZWxlYXNlIExpYnJhcnl8V2luMzIKKwkJUmVsZWFzZXxXaW4zMiA9IFJlbGVhc2V8V2luMzIKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKwkJe0Q2OTczMDc2LTkzMTctNEVGMi1BMEI4LUI3QTE4QUMwNzEzRX0uRGVidWcgTGlicmFyeXxXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1ZyBMaWJyYXJ5fFdpbjMyCisJCXtENjk3MzA3Ni05MzE3LTRFRjItQTBCOC1CN0ExOEFDMDcxM0V9LkRlYnVnIExpYnJhcnl8V2luMzIuQnVpbGQuMCA9IERlYnVnIExpYnJhcnl8V2luMzIKKwkJe0Q2OTczMDc2LTkzMTctNEVGMi1BMEI4LUI3QTE4QUMwNzEzRX0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJe0Q2OTczMDc2LTkzMTctNEVGMi1BMEI4LUI3QTE4QUMwNzEzRX0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXtENjk3MzA3Ni05MzE3LTRFRjItQTBCOC1CN0ExOEFDMDcxM0V9LlJlbGVhc2UgTGlicmFyeXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlIExpYnJhcnl8V2luMzIKKwkJe0Q2OTczMDc2LTkzMTctNEVGMi1BMEI4LUI3QTE4QUMwNzEzRX0uUmVsZWFzZSBMaWJyYXJ5fFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlIExpYnJhcnl8V2luMzIKKwkJe0Q2OTczMDc2LTkzMTctNEVGMi1BMEI4LUI3QTE4QUMwNzEzRX0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXtENjk3MzA3Ni05MzE3LTRFRjItQTBCOC1CN0ExOEFDMDcxM0V9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJezIyOEJBOTY1LTUwRDUtNDJCMi04QkNGLUFGQ0MyMjdFM0MxRH0uRGVidWcgTGlicmFyeXxXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1ZyBMaWJyYXJ5fFdpbjMyCisJCXsyMjhCQTk2NS01MEQ1LTQyQjItOEJDRi1BRkNDMjI3RTNDMUR9LkRlYnVnIExpYnJhcnl8V2luMzIuQnVpbGQuMCA9IERlYnVnIExpYnJhcnl8V2luMzIKKwkJezIyOEJBOTY1LTUwRDUtNDJCMi04QkNGLUFGQ0MyMjdFM0MxRH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJezIyOEJBOTY1LTUwRDUtNDJCMi04QkNGLUFGQ0MyMjdFM0MxRH0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXsyMjhCQTk2NS01MEQ1LTQyQjItOEJDRi1BRkNDMjI3RTNDMUR9LlJlbGVhc2UgTGlicmFyeXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlIExpYnJhcnl8V2luMzIKKwkJezIyOEJBOTY1LTUwRDUtNDJCMi04QkNGLUFGQ0MyMjdFM0MxRH0uUmVsZWFzZSBMaWJyYXJ5fFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlIExpYnJhcnl8V2luMzIKKwkJezIyOEJBOTY1LTUwRDUtNDJCMi04QkNGLUFGQ0MyMjdFM0MxRH0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXsyMjhCQTk2NS01MEQ1LTQyQjItOEJDRi1BRkNDMjI3RTNDMUR9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJezYwRjg5OTU1LTkxQzYtM0EzNi04MDAwLTEzQzU5MkZFQzJERn0uRGVidWcgTGlicmFyeXxXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1ZyBMaWJyYXJ5fFdpbjMyCisJCXs2MEY4OTk1NS05MUM2LTNBMzYtODAwMC0xM0M1OTJGRUMyREZ9LkRlYnVnIExpYnJhcnl8V2luMzIuQnVpbGQuMCA9IERlYnVnIExpYnJhcnl8V2luMzIKKwkJezYwRjg5OTU1LTkxQzYtM0EzNi04MDAwLTEzQzU5MkZFQzJERn0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJezYwRjg5OTU1LTkxQzYtM0EzNi04MDAwLTEzQzU5MkZFQzJERn0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXs2MEY4OTk1NS05MUM2LTNBMzYtODAwMC0xM0M1OTJGRUMyREZ9LlJlbGVhc2UgTGlicmFyeXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlIExpYnJhcnl8V2luMzIKKwkJezYwRjg5OTU1LTkxQzYtM0EzNi04MDAwLTEzQzU5MkZFQzJERn0uUmVsZWFzZSBMaWJyYXJ5fFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlIExpYnJhcnl8V2luMzIKKwkJezYwRjg5OTU1LTkxQzYtM0EzNi04MDAwLTEzQzU5MkZFQzJERn0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXs2MEY4OTk1NS05MUM2LTNBMzYtODAwMC0xM0M1OTJGRUMyREZ9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJezlCMzZCNkZFLTdGQzAtNDM0Ri1BNzFGLUJCRUY4MDk5RjFEOH0uRGVidWcgTGlicmFyeXxXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1ZyBMaWJyYXJ5fFdpbjMyCisJCXs5QjM2QjZGRS03RkMwLTQzNEYtQTcxRi1CQkVGODA5OUYxRDh9LkRlYnVnIExpYnJhcnl8V2luMzIuQnVpbGQuMCA9IERlYnVnIExpYnJhcnl8V2luMzIKKwkJezlCMzZCNkZFLTdGQzAtNDM0Ri1BNzFGLUJCRUY4MDk5RjFEOH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJezlCMzZCNkZFLTdGQzAtNDM0Ri1BNzFGLUJCRUY4MDk5RjFEOH0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXs5QjM2QjZGRS03RkMwLTQzNEYtQTcxRi1CQkVGODA5OUYxRDh9LlJlbGVhc2UgTGlicmFyeXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlIExpYnJhcnl8V2luMzIKKwkJezlCMzZCNkZFLTdGQzAtNDM0Ri1BNzFGLUJCRUY4MDk5RjFEOH0uUmVsZWFzZSBMaWJyYXJ5fFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlIExpYnJhcnl8V2luMzIKKwkJezlCMzZCNkZFLTdGQzAtNDM0Ri1BNzFGLUJCRUY4MDk5RjFEOH0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXs5QjM2QjZGRS03RkMwLTQzNEYtQTcxRi1CQkVGODA5OUYxRDh9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJe0VCMzM1NjZFLURBN0YtNEQyOC05MDc3LTg4QzBCN0M3N0UzNX0uRGVidWcgTGlicmFyeXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXtFQjMzNTY2RS1EQTdGLTREMjgtOTA3Ny04OEMwQjdDNzdFMzV9LkRlYnVnIExpYnJhcnl8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJe0VCMzM1NjZFLURBN0YtNEQyOC05MDc3LTg4QzBCN0M3N0UzNX0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7RUIzMzU2NkUtREE3Ri00RDI4LTkwNzctODhDMEI3Qzc3RTM1fS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMgorCQl7RUIzMzU2NkUtREE3Ri00RDI4LTkwNzctODhDMEI3Qzc3RTM1fS5SZWxlYXNlIExpYnJhcnl8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7RUIzMzU2NkUtREE3Ri00RDI4LTkwNzctODhDMEI3Qzc3RTM1fS5SZWxlYXNlIExpYnJhcnl8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJe0VCMzM1NjZFLURBN0YtNEQyOC05MDc3LTg4QzBCN0M3N0UzNX0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXtFQjMzNTY2RS1EQTdGLTREMjgtOTA3Ny04OEMwQjdDNzdFMzV9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJezI3N0FDNTdGLTMxM0ItNEQwNi1CMTE5LUEzQ0RCNjcyRDJGRn0uRGVidWcgTGlicmFyeXxXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1ZyBMaWJyYXJ5fFdpbjMyCisJCXsyNzdBQzU3Ri0zMTNCLTREMDYtQjExOS1BM0NEQjY3MkQyRkZ9LkRlYnVnIExpYnJhcnl8V2luMzIuQnVpbGQuMCA9IERlYnVnIExpYnJhcnl8V2luMzIKKwkJezI3N0FDNTdGLTMxM0ItNEQwNi1CMTE5LUEzQ0RCNjcyRDJGRn0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJezI3N0FDNTdGLTMxM0ItNEQwNi1CMTE5LUEzQ0RCNjcyRDJGRn0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXsyNzdBQzU3Ri0zMTNCLTREMDYtQjExOS1BM0NEQjY3MkQyRkZ9LlJlbGVhc2UgTGlicmFyeXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlIExpYnJhcnl8V2luMzIKKwkJezI3N0FDNTdGLTMxM0ItNEQwNi1CMTE5LUEzQ0RCNjcyRDJGRn0uUmVsZWFzZSBMaWJyYXJ5fFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlIExpYnJhcnl8V2luMzIKKwkJezI3N0FDNTdGLTMxM0ItNEQwNi1CMTE5LUEzQ0RCNjcyRDJGRn0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXsyNzdBQzU3Ri0zMTNCLTREMDYtQjExOS1BM0NEQjY3MkQyRkZ9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJe0M1RDMxNTZDLThDOEMtNDkzNi1CMzVGLTJCODI5QkEzNkZFQ30uRGVidWcgTGlicmFyeXxXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1ZyBMaWJyYXJ5fFdpbjMyCisJCXtDNUQzMTU2Qy04QzhDLTQ5MzYtQjM1Ri0yQjgyOUJBMzZGRUN9LkRlYnVnIExpYnJhcnl8V2luMzIuQnVpbGQuMCA9IERlYnVnIExpYnJhcnl8V2luMzIKKwkJe0M1RDMxNTZDLThDOEMtNDkzNi1CMzVGLTJCODI5QkEzNkZFQ30uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJe0M1RDMxNTZDLThDOEMtNDkzNi1CMzVGLTJCODI5QkEzNkZFQ30uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXtDNUQzMTU2Qy04QzhDLTQ5MzYtQjM1Ri0yQjgyOUJBMzZGRUN9LlJlbGVhc2UgTGlicmFyeXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlIExpYnJhcnl8V2luMzIKKwkJe0M1RDMxNTZDLThDOEMtNDkzNi1CMzVGLTJCODI5QkEzNkZFQ30uUmVsZWFzZSBMaWJyYXJ5fFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlIExpYnJhcnl8V2luMzIKKwkJe0M1RDMxNTZDLThDOEMtNDkzNi1CMzVGLTJCODI5QkEzNkZFQ30uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXtDNUQzMTU2Qy04QzhDLTQ5MzYtQjM1Ri0yQjgyOUJBMzZGRUN9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFCisJRW5kR2xvYmFsU2VjdGlvbgorRW5kR2xvYmFsCmRpZmYgLS1naXQgYS9saWJwbmcvcHJvamVjdHMvdnN0dWRpby96bGliLnByb3BzIGIvbGlicG5nL3Byb2plY3RzL3ZzdHVkaW8vemxpYi5wcm9wcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmFmMzU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3Byb2plY3RzL3ZzdHVkaW8vemxpYi5wcm9wcwpAQCAtMCwwICsxLDQ1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogemxpYi5wcm9wcyAtIGxvY2F0aW9uIG9mIHpsaWIgc291cmNlCisgKgorICogbGlicG5nIHZlcnNpb24gMS42LjIwIC0gRGVjZW1iZXIgMywgMjAxNQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDExIEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisgKiBhbmQgbGljZW5zZSBpbiBwbmcuaAorCisgKiBZb3UgbXVzdCBlZGl0IHRoaXMgZmlsZSB0byByZWNvcmQgdGhlIGxvY2F0aW9uIG9mIHRoZSB6bGliCisgKiBzb3VyY2UgY29kZS4KKyAtLT4KKworPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiCisgICB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPgorICAgIDwhLS0gUGxhY2UgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBzb3VyY2Ugb2YgemxpYiB1c2VkIGZvcgorCSBkZWJ1Z2dpbmcgaW4gdGhpcyBwcm9wZXJ0eS4KKworICAgICAgICAgVGhlIGRpcmVjdG9yeSBuZWVkIG9ubHkgY29udGFpbiB0aGUgJy5jJyBhbmQgJy5oJyBmaWxlcyBmcm9tIHRoZQorCSBzb3VyY2UuCisKKwkgSWYgeW91IHVzZSBhIHJlbGF0aXZlIGRpcmVjdG9yeSBuYW1lIChhcyBiZWxvdykgdGhlbiBpdCBtdXN0IGJlCisJIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IGRpcmVjdG9yaWVzOyB0aGVzZSBhcmUgb25lIGxldmVsIGRlZXBlciB0aGFuCisJIHRoZSBkaXJlY3RvcmllcyBjb250YWluaW5nIHRoaXMgZmlsZS4KKworCSBJZiB0aGUgdmVyc2lvbiBvZiB6bGliIHlvdSB1c2UgZG9lcyBub3QgbWF0Y2ggdGhhdCB1c2VkIHdoZW4gdGhlCisJIGRpc3RyaWJ1dGlvbiB3YXMgYnVpbHQgeW91IHdpbGwgZ2V0IHdhcm5pbmdzIGZyb20gcG5ndGVzdCB0aGF0IHRoZSB6bGliCisJIHZlcnNpb25zIGRvIG5vdCBtYXRjaC4gIFRoZSB6bGliIHZlcnNpb24gdXNlZCBpbiB0aGlzIGJ1aWxkIGlzIHJlY29yZGVkCisJIGJlbG93OgorICAgICAtLT4KKyAgICA8WkxpYlNyY0Rpcj4uLlwuLlwuLlwuLlx6bGliLTEuMi44PC9aTGliU3JjRGlyPgorCisgICAgPCEtLSBUaGUgZm9sbG93aW5nIGxpbmUgYWxsb3dzIGNvbXBpbGF0aW9uIGZvciBhbiBBUk0gdGFyZ2V0IHdpdGggVmlzdWFsCisgICAgICAgICBTdHVkaW8gMjAxMi4gIE5vdGljZSB0aGF0IHRoaXMgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgVmlzdWFsIFN0dWRpbworICAgICAgICAgMjAxMiBJREUgYW5kIHRoYXQgdGhlIHByb2dyYW1zIHRoYXQgcmVzdWx0IGNhbm5vdCBiZSBydW4gdW5sZXNzIHRoZXkKKyAgICAgICAgIHNpZ25lZCBieSBNaWNyb3NvZnQuICBUaGlzIGlzIHRoZXJlZm9yZSB1bnRlc3RlZDsgb25seSBNaWNyb3NvZnQgY2FuCisgICAgICAgICB0ZXN0IGl0OgorICAgICAtLT4KKyAgICA8V2luZG93c1NES0Rlc2t0b3BBUk1TdXBwb3J0PnRydWU8L1dpbmRvd3NTREtEZXNrdG9wQVJNU3VwcG9ydD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGlicG5nL3Byb2plY3RzL3ZzdHVkaW8vemxpYi96bGliLnZjeHByb2ogYi9saWJwbmcvcHJvamVjdHMvdnN0dWRpby96bGliL3psaWIudmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTViOTRhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3Byb2plY3RzL3ZzdHVkaW8vemxpYi96bGliLnZjeHByb2oKQEAgLTAsMCArMSwxNjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWcgTGlicmFyeXxXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZyBMaWJyYXJ5PC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZSBMaWJyYXJ5fFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2UgTGlicmFyeTwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoWkxpYlNyY0RpcilcYWRsZXIzMi5jIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChaTGliU3JjRGlyKVxjb21wcmVzcy5jIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChaTGliU3JjRGlyKVxjcmMzMi5jIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChaTGliU3JjRGlyKVxkZWZsYXRlLmMiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFpMaWJTcmNEaXIpXGluZmJhY2suYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoWkxpYlNyY0RpcilcaW5mZmFzdC5jIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChaTGliU3JjRGlyKVxpbmZsYXRlLmMiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFpMaWJTcmNEaXIpXGluZnRyZWVzLmMiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFpMaWJTcmNEaXIpXHRyZWVzLmMiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFpMaWJTcmNEaXIpXHVuY29tcHIuYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoWkxpYlNyY0RpcilcenV0aWwuYyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJHbG9iYWxzIj4KKyAgICA8UHJvamVjdEd1aWQ+ezYwRjg5OTU1LTkxQzYtM0EzNi04MDAwLTEzQzU5MkZFQzJERn08L1Byb2plY3RHdWlkPgorICAgIDxLZXl3b3JkPldpbjMyUHJvajwvS2V5d29yZD4KKyAgICA8Um9vdE5hbWVzcGFjZT56bGliPC9Sb290TmFtZXNwYWNlPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChTb2x1dGlvbkRpcilcemxpYi5wcm9wcyIgLz4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAuRGVmYXVsdC5wcm9wcyIgLz4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBMaWJyYXJ5fFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTGlicmFyeXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblNldHRpbmdzIj4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTGlicmFyeXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTGlicmFyeXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBMaWJyYXJ5fFdpbjMyJyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD50cnVlPC9MaW5rSW5jcmVtZW50YWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgorICAgIDxMaW5rSW5jcmVtZW50YWw+dHJ1ZTwvTGlua0luY3JlbWVudGFsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBMaWJyYXJ5fFdpbjMyJyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD50cnVlPC9MaW5rSW5jcmVtZW50YWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD50cnVlPC9MaW5rSW5jcmVtZW50YWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD50cnVlPC9MaW5rSW5jcmVtZW50YWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBMaWJyYXJ5fFdpbjMyJyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfREVCVUc7X1dJTkRPV1M7Wl9TT0xPOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWc8L1J1bnRpbWVMaWJyYXJ5PgorICAgICAgPFdhcm5pbmdMZXZlbD5UdXJuT2ZmQWxsV2FybmluZ3M8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj50cnVlPC9Ccm93c2VJbmZvcm1hdGlvbj4KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYODY8L1RhcmdldE1hY2hpbmU+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgorICAgIDwvTGluaz4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfREVCVUc7X1dJTkRPV1M7Wl9TT0xPOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+VHVybk9mZkFsbFdhcm5pbmdzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+CisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+CisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYODY8L1RhcmdldE1hY2hpbmU+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgorICAgIDwvTGluaz4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTGlicmFyeXxXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PgorICAgICAgPE9wdGltaXphdGlvbj5GdWxsPC9PcHRpbWl6YXRpb24+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPgorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+CisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+CisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CisgICAgICA8VHJlYXRXYXJuaW5nQXNFcnJvcj50cnVlPC9UcmVhdFdhcm5pbmdBc0Vycm9yPgorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5PgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfV0lORE9XUztaX1NPTE87JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg4NjwvVGFyZ2V0TWFjaGluZT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+CisgICAgPC9MaW5rPgorICAgIDxMaWI+CisgICAgICA8TGlua1RpbWVDb2RlR2VuZXJhdGlvbj50cnVlPC9MaW5rVGltZUNvZGVHZW5lcmF0aW9uPgorICAgIDwvTGliPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PgorICAgICAgPE9wdGltaXphdGlvbj5GdWxsPC9PcHRpbWl6YXRpb24+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPgorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+CisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+CisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CisgICAgICA8VHJlYXRXYXJuaW5nQXNFcnJvcj50cnVlPC9UcmVhdFdhcm5pbmdBc0Vycm9yPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfV0lORE9XUztaX1NPTE87JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg4NjwvVGFyZ2V0TWFjaGluZT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+CisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPgorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+CisgICAgPC9MaW5rPgorICAgIDxMaWI+CisgICAgICA8TGlua1RpbWVDb2RlR2VuZXJhdGlvbj50cnVlPC9MaW5rVGltZUNvZGVHZW5lcmF0aW9uPgorICAgIDwvTGliPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+CisgIDwvSW1wb3J0R3JvdXA+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWJwbmcvc2NyaXB0cy9SRUFETUUudHh0IGIvbGlicG5nL3NjcmlwdHMvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODI0NWYwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3NjcmlwdHMvUkVBRE1FLnR4dApAQCAtMCwwICsxLDg0IEBACisKK01ha2VmaWxlcyBmb3IgIGxpYnBuZyB2ZXJzaW9uIDEuNi4yMCAtIERlY2VtYmVyIDMsIDIwMTUKKworcG5nbGliY29uZi5oLnByZWJ1aWx0ICAgICAgID0+ICBTdG9yZXMgY29uZmlndXJhdGlvbiBzZXR0aW5ncworIG1ha2VmaWxlLmxpbnV4ICAgID0+ICBMaW51eC9FTEYgbWFrZWZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgKGdjYywgY3JlYXRlcyBsaWJwbmcxNi5zby4xNi4xLjYuMjApCisgbWFrZWZpbGUuZ2NjICAgICAgPT4gIEdlbmVyaWMgbWFrZWZpbGUgKGdjYywgY3JlYXRlcyBzdGF0aWMgbGlicG5nLmEpCisgbWFrZWZpbGUua25yICAgICAgPT4gIEFyY2hhaWMgVU5JWCBNYWtlZmlsZSB0aGF0IGNvbnZlcnRzIGZpbGVzIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgYW5zaTJrbnIgKFJlcXVpcmVzIGFuc2kya25yLmMgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICBmdHA6Ly9mdHAuY3Mud2lzYy5lZHUvZ2hvc3QpCisgbWFrZWZpbGUuYWNvcm4gICAgPT4gIEFjb3JuIG1ha2VmaWxlCisgbWFrZWZpbGUuYWl4ICAgICAgPT4gIEFJWC9nY2MgbWFrZWZpbGUKKyBtYWtlZmlsZS5hbWlnYSAgICA9PiAgQW1pZ2EgbWFrZWZpbGUKKyBtYWtlZmlsZS5hdGFyaSAgICA9PiAgQXRhcmkgbWFrZWZpbGUKKyBtYWtlZmlsZS5iYzMyICAgICA9PiAgMzItYml0IEJvcmxhbmQgQysrIChhbGwgbW9kdWxlcyBjb21waWxlZCBpbiBDIG1vZGUpCisgbWFrZWZpbGUuYmVvcyAgICAgPT4gIGJlb3MgbWFrZWZpbGUKKyBtYWtlZmlsZS5ib3IgICAgICA9PiAgQm9ybGFuZCBtYWtlZmlsZSAodXNlcyBiY2MpCisgbWFrZWZpbGUuY2VnY2MgICAgPT4gIG1pbmdlMzJjZSBmb3IgV2luZG93cyBDRSBtYWtlZmlsZQorIG1ha2VmaWxlLmRhcndpbiAgID0+ICBEYXJ3aW4gbWFrZWZpbGUsIGNhbiB1c2Ugb24gTWFjb3NYCisgbWFrZWZpbGUuZGVjICAgICAgPT4gIERFQyBBbHBoYSBVTklYIG1ha2VmaWxlCisgbWFrZWZpbGUuZGoyICAgICAgPT4gIERKR1BQIDIgbWFrZWZpbGUKKyBtYWtlZmlsZS5mcmVlYnNkICA9PiAgRnJlZUJTRCBtYWtlZmlsZQorIG1ha2VmaWxlLmdjYyAgICAgID0+ICBHZW5lcmljIGdjYyBtYWtlZmlsZQorIG1ha2VmaWxlLmhwZ2NjICAgID0+ICBIUFVYIG1ha2VmaWxlIHVzaW5nIGdjYworIG1ha2VmaWxlLmhwdXggICAgID0+ICBIUFVYICgxMC4yMCBhbmQgMTEuMDApIG1ha2VmaWxlCisgbWFrZWZpbGUuaHA2NCAgICAgPT4gIEhQVVggKDEwLjIwIGFuZCAxMS4wMCkgbWFrZWZpbGUsIDY0LWJpdAorIG1ha2VmaWxlLmlibWMgICAgID0+ICBJQk0gQy9DKysgdmVyc2lvbiAzLnggZm9yIFdpbjMyIGFuZCBPUy8yIChzdGF0aWMpCisgbWFrZWZpbGUuaW50ZWwgICAgPT4gIEludGVsIEMvQysrIHZlcnNpb24gNC4wIGFuZCBsYXRlcgorIG1ha2VmaWxlLm1pcHMgICAgID0+ICBNSVBTIG1ha2VmaWxlCisgbWFrZWZpbGUubXNjICAgICAgPT4gIE1pY3Jvc29mdCBDIG1ha2VmaWxlCisgbWFrZWZpbGUubmV0YnNkICAgPT4gIE5ldEJTRC9jYyBtYWtlZmlsZSwgbWFrZXMgbGlicG5nLnNvLgorIG1ha2VmaWxlLm9wZW5ic2QgID0+ICBPcGVuQlNEIG1ha2VmaWxlCisgbWFrZWZpbGUub3MyICAgICAgPT4gIE9TLzIgTWFrZWZpbGUgKGdjYyBhbmQgZW14LCByZXF1aXJlcyBsaWJwbmcuZGVmKQorIG1ha2VmaWxlLnNjbyAgICAgID0+ICBGb3IgU0NPIE9TcjUgIEVMRiBhbmQgVW5peHdhcmUgNyB3aXRoIE5hdGl2ZSBjYworIG1ha2VmaWxlLnNnZ2NjICAgID0+ICBTaWxpY29uIEdyYXBoaWNzIChnY2MsCisgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZXMgbGlicG5nMTYuc28uMTYuMS42LjIwKQorIG1ha2VmaWxlLnNnaSAgICAgID0+ICBTaWxpY29uIEdyYXBoaWNzIElSSVggbWFrZWZpbGUgKGNjLCBjcmVhdGVzIHN0YXRpYyBsaWIpCisgbWFrZWZpbGUuc29sYXJpcyAgPT4gIFNvbGFyaXMgMi5YIG1ha2VmaWxlIChnY2MsCisgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZXMgbGlicG5nMTYuc28uMTYuMS42LjIwKQorIG1ha2VmaWxlLnNvOSAgICAgID0+ICBTb2xhcmlzIDkgbWFrZWZpbGUgKGdjYywKKyAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlcyBsaWJwbmcxNi5zby4xNi4xLjYuMjApCisgbWFrZWZpbGUuc3RkICAgICAgPT4gIEdlbmVyaWMgVU5JWCBtYWtlZmlsZSAoY2MsIGNyZWF0ZXMgc3RhdGljIGxpYnBuZy5hKQorIG1ha2VmaWxlLnN1bm9zICAgID0+ICBTdW4gbWFrZWZpbGUKKyBtYWtlZmlsZS4zMnN1bnUgICA9PiAgU3VuIFVsdHJhIDMyLWJpdCBtYWtlZmlsZQorIG1ha2VmaWxlLjY0c3VudSAgID0+ICBTdW4gVWx0cmEgNjQtYml0IG1ha2VmaWxlCisgbWFrZWZpbGUudGMzICAgICAgPT4gIFR1cmJvIEMgMy4wIG1ha2VmaWxlCisgbWFrZWZpbGUudmN3aW4zMiAgPT4gIG1ha2VmaWxlIGZvciBNaWNyb3NvZnQgVmlzdWFsIEMrKyA0LjAgYW5kIGxhdGVyCisgbWFrZXZtcy5jb20gICAgICAgPT4gIFZNUyBidWlsZCBzY3JpcHQKKyBzbWFrZWZpbGUucHBjICAgICA9PiAgQU1JR0Egc21ha2VmaWxlIGZvciBTQVMgQyBWNi41OC83LjAwIFBQQyBjb21waWxlcgorICAgICAgICAgICAgICAgICAgICAgICAoUmVxdWlyZXMgU0NPUFRJT05TLCBjb3BpZWQgZnJvbSBzY3JpcHRzL1NDT1BUSU9OUy5wcGMpCisKK090aGVyIHN1cHBvcnRpbmcgc2NyaXB0czoKKyBSRUFETUUudHh0ICAgICAgICA9PiAgVGhpcyBmaWxlCisgZGVzY3JpcC5tbXMgICAgICAgPT4gIFZNUyBtYWtlZmlsZSBmb3IgTU1TIG9yIE1NSworIGxpYnBuZy1jb25maWctYm9keS5pbiA9PiB1c2VkIGJ5IHNldmVyYWwgbWFrZWZpbGVzIHRvIGNyZWF0ZSBsaWJwbmctY29uZmlnCisgbGlicG5nLWNvbmZpZy1oZWFkLmluID0+IHVzZWQgYnkgc2V2ZXJhbCBtYWtlZmlsZXMgdG8gY3JlYXRlIGxpYnBuZy1jb25maWcKKyBsaWJwbmcucGMuaW4gICAgICA9PiAgVXNlZCBieSBzZXZlcmFsIG1ha2VmaWxlcyB0byBjcmVhdGUgbGlicG5nLnBjCisgcG5nd2luLnJjICAgICAgICAgPT4gIFVzZWQgYnkgdGhlIHZpc3VhbGM3MSBwcm9qZWN0LgorIHBuZ3dpbi5kZWYgICAgICAgID0+ICBVc2VkIGJ5IG1ha2VmaWxlLm9zMgorIHBuZ3dpbi5kZm4gICAgICAgID0+ICBVc2VkIHRvIG1haW50YWluIHBuZ3dpbi5kZWYKKyBTQ09QVElPTlMucHBjICAgICA9PiAgVXNlZCB3aXRoIHNtYWtlZmlsZS5wcGMKKworIGNoZWNrc3ltLmF3ayAgICAgICA9PiAgVXNlZCBmb3IgbWFpbnRhaW5pbmcgcG5nbGliY29uZi5oCisgZGVmLmRmbiAgICAgICAgICAgID0+ICBVc2VkIGZvciBtYWludGFpbmluZyBwbmdsaWJjb25mLmgKKyBvcHRpb25zLmF3ayAgICAgICAgPT4gIFVzZWQgZm9yIG1haW50YWluaW5nIHBuZ2xpYmNvbmYuaAorIHBuZ2xpYmNvbmYuZGZhICAgICA9PiAgVXNlZCBmb3IgbWFpbnRhaW5pbmcgcG5nbGliY29uZi5oCisgcG5nbGliY29uZi5tYWsgICAgID0+ICBVc2VkIGZvciBtYWludGFpbmluZyBwbmdsaWJjb25mLmgKKyBzeW0uZGZuICAgICAgICAgICAgPT4gIFVzZWQgZm9yIHN5bWJvbCB2ZXJzaW9uaW5nCisgc3ltYm9scy5kZWYgICAgICAgID0+ICBVc2VkIGZvciBzeW1ib2wgdmVyc2lvbmluZworIHN5bWJvbHMuZGZuICAgICAgICA9PiAgVXNlZCBmb3Igc3ltYm9sIHZlcnNpb25pbmcKKyB2ZXJzLmRmbiAgICAgICAgICAgPT4gIFVzZWQgZm9yIHN5bWJvbCB2ZXJzaW9uaW5nCisKKyBsaWJ0b29sLm00ICAgICAgICA9PiAgVXNlZCBieSBhdXRvY29uZiB0b29scworIGx0b3B0aW9ucy5tNCAgICAgID0+ICBVc2VkIGJ5IGF1dG9jb25mIHRvb2xzCisgbHRzdWdhci5tNCAgICAgICAgPT4gIFVzZWQgYnkgYXV0b2NvbmYgdG9vbHMKKyBsdHZlcnNpb24ubTQgICAgICA9PiAgVXNlZCBieSBhdXRvY29uZiB0b29scworIGx0fm9ic29sZXRlLm00ICAgID0+ICBVc2VkIGJ5IGF1dG9jb25mIHRvb2xzCisKKyBpbnRwcmVmaXguZGZuICAgICA9PiAgVXNlZCBieSBhdXRvY29uZiB0b29scworIG1hY3JvLmxzdCAgICAgICAgID0+ICBVc2VkIGJ5IGF1dG9jb25mIHRvb2xzCisgcHJlZml4LmRmbiAgICAgICAgPT4gIFVzZWQgYnkgYXV0b2NvbmYgdG9vbHMKKworCitGdXJ0aGVyIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBjb21tZW50cyBpbiB0aGUgaW5kaXZpZHVhbCBtYWtlZmlsZXMuCmRpZmYgLS1naXQgYS9saWJwbmcvc2NyaXB0cy9TQ09QVElPTlMucHBjIGIvbGlicG5nL3NjcmlwdHMvU0NPUFRJT05TLnBwYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzM1MDNlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3NjcmlwdHMvU0NPUFRJT05TLnBwYwpAQCAtMCwwICsxLDcgQEAKK09QVElNSVpFCitPUFRQRUVQCitPUFRUSU1FCitPUFRTQ0hFRAorQVVUT1JFR0lTVEVSCitQQVJNUz1SRUdJU1RFUlMKK0lOQ0xVREVESVI9aGxwOnBwYy9pbmNsdWRlCmRpZmYgLS1naXQgYS9saWJwbmcvc2NyaXB0cy9jaGVja3N5bS5hd2sgYi9saWJwbmcvc2NyaXB0cy9jaGVja3N5bS5hd2sKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmUzYWY1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9zY3JpcHRzL2NoZWNrc3ltLmF3awpAQCAtMCwwICsxLDE3MyBAQAorIyEvYmluL2F3ayAtZgorIyBDaGVjayBhIGxpc3Qgb2Ygc3ltYm9scyBhZ2FpbnN0IHRoZSBtYXN0ZXIgZGVmaW5pdGlvbgorIyAob2ZmaWNpYWwpIGxpc3QuICBBcmd1bWVudHM6CisjCisjIGF3ayAtZiBjaGVja3N5bS5hd2sgb2ZmaWNpYWwtZGVmIGxpc3QtdG8tY2hlY2sKKyMKKyMgT3V0cHV0IGlzIGEgZmlsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgY2FsbGVkICdzeW1ib2xzLm5ldycsCisjIHRoZSB2YWx1ZSBvZiB0aGUgYXdrIHZhcmlhYmxlICJvZiIgKHdoaWNoIGNhbiBiZSBjaGFuZ2VkIG9uIHRoZQorIyBjb21tYW5kIGxpbmUgaWYgcmVxdWlyZWQuKSAgc3Rkb3V0IGhvbGRzIGVycm9yIG1lc3NhZ2VzLiAgRXJyb3IKKyMgY29kZSBpbmRpY2F0ZXMgc3VjY2VzcyBvciBmYWlsdXJlLgorIworIyBOT1RFOiB0aGlzIGlzIGEgcHVyZSwgb2xkIGZhc2hpb25lZCwgYXdrIHNjcmlwdC4gIEl0IHdpbGwKKyMgd29yayB3aXRoIGFueSBhd2sKKworQkVHSU57CisgICBlcnI9MAorICAgbWFzdGVyPSIiICAgICAgICAjIG1hc3RlciBmaWxlCisgICBvZmZpY2lhbFsxXSA9ICIiICMgZGVmaW5lZCBzeW1ib2xzIGZyb20gbWFzdGVyIGZpbGUKKyAgIHN5bWJvbFsxXSA9ICIiICAgIyBkZWZpbmVkIHN5bWJvbHMgZnJvbSBwbmcuaAorICAgcmVtb3ZlZFsxXSA9ICIiICAjIHJlbW92ZWQgc3ltYm9scyBmcm9tIHBuZy5oCisgICBsYXN0byA9IDAgICAgICAgICMgbGFzdCBvcmRpbmFsIHZhbHVlIGZyb20gcG5nLmgKKyAgIG1hc3Rlcm8gPSAwICAgICAgIyBoaWdoZXN0IG9yZGluYWwgaW4gbWFzdGVyIGZpbGUKKyAgIHN5bWJvbG8gPSAwICAgICAgIyBoaWdoZXN0IG9yZGluYWwgaW4gcG5nLmgKKyAgIG1pc3NpbmcgPSAiZXJyb3IiIyBsb2cgYW4gZXJyb3Igb24gbWlzc2luZyBzeW1ib2xzCisgICBvZj0ic3ltYm9scy5uZXciICMgZGVmYXVsdCB0byBhIGZpeGVkIG5hbWUKK30KKworIyBSZWFkIGV4aXN0aW5nIGRlZmluaXRpb25zIGZyb20gdGhlIG1hc3RlciBmaWxlICh0aGUgZmlyc3QKKyMgZmlsZSBvbiB0aGUgY29tbWFuZCBsaW5lLikgIFRoaXMgbXVzdCBiZSBhIGRlZiBmaWxlIGFuZCBpdAorIyBoYXMgZGVmaW5pdGlvbiBsaW5lcyAob3RoZXJzIGFyZSBpZ25vcmVkKSBvZiB0aGUgZm9ybToKKyMKKyMgICBzeW1ib2wgQG9yZGluYWwKKyMKK21hc3RlciA9PSAiIiB7CisgICBtYXN0ZXIgPSBGSUxFTkFNRQorfQorRklMRU5BTUU9PW1hc3RlciAmJiBORj09MiAmJiAkMn4vXkAvICYmICQxIX4vXjsvIHsKKyAgIG89MCtzdWJzdHIoJDIsMikKKyAgIGlmIChvID4gMCkgeworICAgICAgaWYgKG9mZmljaWFsW29dID09ICIiKSB7CisgICAgICAgICBvZmZpY2lhbFtvXSA9ICQxCisgICAgICAgICBpZiAobyA+IG1hc3Rlcm8pIG1hc3Rlcm8gPSBvCisgICAgICAgICBuZXh0CisgICAgICB9IGVsc2UKKyAgICAgICAgIHByaW50IG1hc3RlciAiOiBkdXBsaWNhdGVkIHN5bWJvbDoiLCBvZmZpY2lhbFtvXSAiOiIsICQwCisgICB9IGVsc2UKKyAgICAgIHByaW50IG1hc3RlciAiOiBiYWQgZXhwb3J0IGxpbmUgZm9ybWF0OiIsICQwCisgICBlcnIgPSAxCit9CitGSUxFTkFNRT09bWFzdGVyICYmICQxPT0iO21pc3NpbmciICYmIE5GPT0yeworICAgIyBUaGlzIGFsbG93cyB0aGUgbWFzdGVyIGZpbGUgdG8gY29udHJvbCBob3cgbWlzc2luZyBzeW1ib2xzCisgICAjIGFyZSBoYW5kbGVkOyBzeW1ib2xzIHRoYXQgYXJlbid0IGluIGVpdGhlciB0aGUgbWFzdGVyIG9yCisgICAjIHRoZSBuZXcgZmlsZS4gIFZhbGlkIHZhbHVlcyBhcmUgJ2lnbm9yZScsICd3YXJuaW5nJyBhbmQKKyAgICMgJ2Vycm9yJworICAgbWlzc2luZyA9ICQyCit9CitGSUxFTkFNRT09bWFzdGVyIHsKKyAgIG5leHQKK30KKworIyBSZWFkIG5ldyBkZWZpbml0aW9ucywgdGhlc2UgYXJlIGZyZWUgZm9ybSBidXQgdGhlIGxpbmVzIG11c3QKKyMganVzdCBiZSBzeW1ib2wgZGVmaW5pdGlvbnMuICBMaW5lcyB3aWxsIGJlIGNvbW1lbnRlZCBvdXQgZm9yCisjICdyZW1vdmVkJyBzeW1ib2xzLCBpbnRyb2R1Y2VkIGluIHBuZy5oIHVzaW5nIFBOR19SRU1PVkVEIHJhdGhlcgorIyB0aGFuIFBOR19FWFBPUlQuICBVc2Ugc3ltYm9scy5kZm4gb3IgcG5nd2luLmRmbiB0byBnZW5lcmF0ZSB0aGUKKyMgaW5wdXQgZmlsZS4KKyMKKyMgIHN5bWJvbCBAb3JkaW5hbCAgICMgdHdvIGZpZWxkcywgZXhwb3J0ZWQgc3ltYm9sCisjICA7IHN5bWJvbCBAb3JkaW5hbCAjIHRocmVlIGZpZWxkcywgcmVtb3ZlZCBzeW1ib2wKKyMgIDsgQG9yZGluYWwgICAgICAgICMgdHdvIGZpZWxkcywgdGhlIGxhc3Qgb3JkaW5hbAorTkY9PTIgJiYgJDEgPT0gIjsiICYmICQyIH4gL15AWzEtOV1bMC05XSokLyB7ICMgbGFzdCBvcmRpbmFsCisgICBvPTArc3Vic3RyKCQyLDIpCisgICBpZiAobGFzdG8gPT0gMCB8fCBsYXN0byA9PSBvKQorICAgICAgbGFzdG89bworICAgZWxzZSB7CisgICAgICBwcmludCAicG5nLmg6IGR1cGxpY2F0ZWQgbGFzdCBvcmRpbmFsOiIsIGxhc3RvLCBvCisgICAgICBlcnIgPSAxCisgICB9CisgICBuZXh0Cit9CitORj09MyAmJiAkMSA9PSAiOyIgJiYgJDMgfiAvXkBbMS05XVswLTldKiQvIHsgIyByZW1vdmVkIHN5bWJvbAorICAgbz0wK3N1YnN0cigkMywyKQorICAgaWYgKHJlbW92ZWRbb10gPT0gIiIgfHwgcmVtb3ZlZFtvXSA9PSAkMikgeworICAgICAgcmVtb3ZlZFtvXSA9ICQyCisgICAgICBpZiAobyA+IHN5bWJvbG8pIHN5bWJvbG8gPSBvCisgICB9IGVsc2UgeworICAgICAgcHJpbnQgInBuZy5oOiBkdXBsaWNhdGVkIHJlbW92ZWQgc3ltYm9sIiwgbyAiOiAnIiByZW1vdmVkW29dICInICE9ICciICQyICInIgorICAgICAgZXJyID0gMQorICAgfQorICAgbmV4dAorfQorTkY9PTIgJiYgJDIgfiAvXkBbMS05XVswLTldKiQvIHsgIyBleHBvcnRlZCBzeW1ib2wKKyAgIG89MCtzdWJzdHIoJDIsMikKKyAgIGlmIChzeW1ib2xbb10gPT0gIiIgfHwgc3ltYm9sW29dID09ICQxKSB7CisgICAgICBzeW1ib2xbb10gPSAkMQorICAgICAgaWYgKG8gPiBzeW1ib2xvKSBzeW1ib2xvID0gbworICAgfSBlbHNlIHsKKyAgICAgIHByaW50ICJwbmcuaDogZHVwbGljYXRlZCBzeW1ib2wiLCBvICI6ICciIHN5bWJvbFtvXSAiJyAhPSAnIiAkMSAiJyIKKyAgICAgIGVyciA9IDEKKyAgIH0KK30KK3sKKyAgIG5leHQgIyBza2lwIGFsbCBvdGhlciBsaW5lcworfQorCisjIEF0IHRoZSBlbmQgY2hlY2sgZm9yIHN5bWJvbHMgbWFya2VkIGFzIGJvdGggZHVwbGljYXRlZCBhbmQgcmVtb3ZlZAorRU5EeworICAgaWYgKHN5bWJvbG8gPiBsYXN0bykgeworICAgICAgcHJpbnQgImhpZ2hlc3Qgc3ltYm9sIG9yZGluYWwgaW4gcG5nLmgsIiwgc3ltYm9sbyAiLCBleGNlZWRzIGxhc3Qgb3JkaW5hbCBmcm9tIHBuZy5oIiwgbGFzdG8KKyAgICAgIGVyciA9IDEKKyAgIH0KKyAgIGlmIChtYXN0ZXJvID4gbGFzdG8pIHsKKyAgICAgIHByaW50ICJoaWdoZXN0IHN5bWJvbCBvcmRpbmFsIGluIiwgbWFzdGVyICIsIiwgbWFzdGVybyAiLCBleGNlZWRzIGxhc3Qgb3JkaW5hbCBmcm9tIHBuZy5oIiwgbGFzdG8KKyAgICAgIGVyciA9IDEKKyAgIH0KKyAgIHVuZXhwb3J0ZWQ9MAorICAgIyBBZGQgYSBzdGFuZGFyZCBoZWFkZXIgdG8gc3ltYm9scy5uZXc6CisgICBwcmludCAiO1ZlcnNpb24gSU5TRVJULVZFUlNJT04tSEVSRSIgPm9mCisgICBwcmludCAiOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiA+b2YKKyAgIHByaW50ICI7IExJQlBORyBzeW1ib2wgbGlzdCBhcyBhIFdpbjMyIERFRiBmaWxlIiA+b2YKKyAgIHByaW50ICI7IENvbnRhaW5zIGFsbCB0aGUgc3ltYm9scyB0aGF0IGNhbiBiZSBleHBvcnRlZCBmcm9tIGxpYnBuZyIgPm9mCisgICBwcmludCAiOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiA+b2YKKyAgIHByaW50ICJMSUJSQVJZIiA+b2YKKyAgIHByaW50ICIiID5vZgorICAgcHJpbnQgIkVYUE9SVFMiID5vZgorCisgICBmb3IgKG89MTsgbzw9bGFzdG87ICsrbykgeworICAgICAgaWYgKHN5bWJvbFtvXSA9PSAiIiAmJiByZW1vdmVkW29dID09ICIiKSB7CisgICAgICAgICBpZiAodW5leHBvcnRlZCA9PSAwKSB1bmV4cG9ydGVkID0gbworICAgICAgICAgaWYgKG9mZmljaWFsW29dID09ICIiKSB7CisgICAgICAgICAgICAjIG1pc3NpbmcgaW4gZXhwb3J0IGxpc3QgdG9vLCBzbyBvaworICAgICAgICAgICAgaWYgKG8gPCBsYXN0bykgY29udGludWUKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICh1bmV4cG9ydGVkICE9IDApIHsKKyAgICAgICAgICMgU3ltYm9scyBpbiB0aGUgLmRlZiBidXQgbm90IGluIHRoZSBuZXcgZmlsZSBhcmUgZXJyb3JzLCBidXQKKyAgICAgICAgICMgdGhlICd1bmV4cG9ydGVkJyBzeW1ib2xzIGFyZW4ndCBpbiBlaXRoZXIuICBCeSBkZWZhdWx0IHRoaXMKKyAgICAgICAgICMgaXMgYW4gZXJyb3IgdG9vIChzZWUgdGhlIHNldHRpbmcgb2YgJ21pc3NpbmcnIGF0IHRoZSBzdGFydCksCisgICAgICAgICAjIGJ1dCB0aGlzIGNhbiBiZSByZXNldCBvbiB0aGUgY29tbWFuZCBsaW5lIG9yIGJ5IHN0dWZmIGluIHRoZQorICAgICAgICAgIyBmaWxlIC0gc2VlIHRoZSBjb21tZW50cyBhYm92ZS4KKyAgICAgICAgIGlmIChtaXNzaW5nICE9ICJpZ25vcmUiKSB7CisgICAgICAgICAgICBpZiAoby0xID4gdW5leHBvcnRlZCkKKyAgICAgICAgICAgICAgIHByaW50ICJwbmcuaDoiLCBtaXNzaW5nICI6IG1pc3Npbmcgc3ltYm9sczoiLCB1bmV4cG9ydGVkICItIiBvLTEKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHByaW50ICJwbmcuaDoiLCBtaXNzaW5nICI6IG1pc3Npbmcgc3ltYm9sOiIsIHVuZXhwb3J0ZWQKKyAgICAgICAgICAgIGlmIChtaXNzaW5nICE9ICJ3YXJuaW5nIikKKyAgICAgICAgICAgICAgIGVyciA9IDEKKyAgICAgICAgIH0KKyAgICAgICAgIHVuZXhwb3J0ZWQgPSAwCisgICAgICB9CisgICAgICBpZiAoc3ltYm9sW29dICE9ICIiICYmIHJlbW92ZWRbb10gIT0gIiIpIHsKKyAgICAgICAgIHByaW50ICJwbmcuaDogc3ltYm9sIiwgbywgImJvdGggZXhwb3J0ZWQgYXMgJyIgc3ltYm9sW29dICInIGFuZCByZW1vdmVkIGFzICciIHJlbW92ZWRbb10gIiciCisgICAgICAgICBlcnIgPSAxCisgICAgICB9IGVsc2UgaWYgKHN5bWJvbFtvXSAhPSBvZmZpY2lhbFtvXSkgeworICAgICAgICAgIyBlaXRoZXIgdGhlIHN5bWJvbCBpcyBtaXNzaW5nIHNvbWV3aGVyZSBvciBpdCBjaGFuZ2VkCisgICAgICAgICBlcnIgPSAxCisgICAgICAgICBpZiAoc3ltYm9sW29dID09ICIiKQorICAgICAgICAgICAgcHJpbnQgInBuZy5oOiBzeW1ib2wiLCBvLCAiaXMgZXhwb3J0ZWQgYXMgJyIgb2ZmaWNpYWxbb10gIicgaW4iLCBtYXN0ZXIKKyAgICAgICAgIGVsc2UgaWYgKG9mZmljaWFsW29dID09ICIiKQorICAgICAgICAgICAgcHJpbnQgInBuZy5oOiBleHBvcnRlZCBzeW1ib2wiLCBvLCAiJyIgc3ltYm9sW29dICInIG5vdCBwcmVzZW50IGluIiwgbWFzdGVyCisgICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludCAicG5nLmg6IGV4cG9ydGVkIHN5bWJvbCIsIG8sICInIiBzeW1ib2xbb10gIicgZXhpc3RzIGFzICciIG9mZmljaWFsW29dICInIGluIiwgbWFzdGVyCisgICAgICB9CisKKyAgICAgICMgRmluYWxseSBnZW5lcmF0ZSBzeW1ib2xzLm5ldworICAgICAgaWYgKHN5bWJvbFtvXSAhPSAiIikKKyAgICAgICAgIHByaW50ICIgIiBzeW1ib2xbb10sICJAIiBvID4gb2YKKyAgIH0KKworICAgaWYgKGVyciAhPSAwKSB7CisgICAgICBwcmludCAiKioqIEEgbmV3IGxpc3QgaXMgaW4iLCBvZiwgIioqKiIKKyAgICAgIGV4aXQgMQorICAgfQorfQpkaWZmIC0tZ2l0IGEvbGlicG5nL3NjcmlwdHMvZGVmLmMgYi9saWJwbmcvc2NyaXB0cy9kZWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2U0MjRkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3NjcmlwdHMvZGVmLmMKQEAgLTAsMCArMSwyOSBAQAorLyogZGVmLmMgLSBkZWZpbmUgZm9ybWF0IG9mIGxpYnBuZy5kZWYKKyAqCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIHZlcnNpb24gMS42LjE2IFtEZWNlbWJlciAyMiwgMjAxNF0KKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE0IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisgKiBhbmQgbGljZW5zZSBpbiBwbmcuaAorICovCisKKy8qIFdyaXRlIHRoZSBleHBvcnQgZmlsZSBoZWFkZXI6ICovCitQTkdfREZOICI7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCitQTkdfREZOICI7IExJQlBORyBtb2R1bGUgZGVmaW5pdGlvbiBmaWxlIGZvciBPUy8yIgorUE5HX0RGTiAiOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorUE5HX0RGTiAiIgorUE5HX0RGTiAiOyBJZiB5b3UgZ2l2ZSB0aGUgbGlicmFyeSBhbiBleHBsaWNpdCBuYW1lIG9uZSBvciBvdGhlciBmaWxlcyIKK1BOR19ERk4gIjsgbWF5IG5lZWQgbW9kaWZ5aW5nIHRvIHN1cHBvcnQgdGhlIG5ldyBuYW1lIG9uIG9uZSBvciBtb3JlIgorUE5HX0RGTiAiOyBzeXN0ZW1zLiIKK1BOR19ERk4gIkxJQlJBUlkiCitQTkdfREZOICJPUzIgREVTQ1JJUFRJT04gIlBORyBpbWFnZSBjb21wcmVzc2lvbiBsaWJyYXJ5IiIKK1BOR19ERk4gIk9TMiBDT0RFIFBSRUxPQUQgTU9WRUFCTEUgRElTQ0FSREFCTEUiCitQTkdfREZOICIiCitQTkdfREZOICJFWFBPUlRTIgorUE5HX0RGTiAiO1ZlcnNpb24gMS42LjIwIgorCisjZGVmaW5lIFBOR19FWFBPUlRBKG9yZGluYWwsIHR5cGUsIG5hbWUsIGFyZ3MsIGF0dHJpYnV0ZXMpXAorICAgICAgICBQTkdfREZOICJAIiBTWU1CT0xfUFJFRklYICJAQCIgbmFtZSAiQCIKKworI2luY2x1ZGUgIi4uL3BuZy5oIgpkaWZmIC0tZ2l0IGEvbGlicG5nL3NjcmlwdHMvZGVzY3JpcC5tbXMgYi9saWJwbmcvc2NyaXB0cy9kZXNjcmlwLm1tcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjNjNDI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3NjcmlwdHMvZGVzY3JpcC5tbXMKQEAgLTAsMCArMSw1MiBAQAorCitjY19kZWZzID0gL2luYz0kKFpMSUJTUkMpCitjX2RlYiA9CisKKy5pZmRlZiBfX0RFQ0NfXworcHJlZiA9IC9wcmVmaXg9YWxsCisuZW5kaWYKKworCisKK09CSlMgPSBwbmcub2JqLCBwbmdzZXQub2JqLCBwbmdnZXQub2JqLCBwbmdydXRpbC5vYmosIHBuZ3RyYW5zLm9iaixcCisJcG5nd3V0aWwub2JqLCBwbmdyZWFkLm9iaiwgcG5nbWVtLm9iaiwgcG5nd3JpdGUub2JqLCBwbmdydHJhbi5vYmosXAorCXBuZ3d0cmFuLm9iaiwgcG5ncmlvLm9iaiwgcG5nd2lvLm9iaiwgcG5nZXJyb3Iub2JqLCBwbmdwcmVhZC5vYmoKKworCitDRkxBR1M9ICQoQ19ERUIpICQoQ0NfREVGUykgJChQUkVGKQorCithbGwgOiBwbmd0ZXN0LmV4ZSBsaWJwbmcub2xiCisJCUAgd3JpdGUgc3lzJG91dHB1dCAiIHBuZ3Rlc3QgYXZhaWxhYmxlIgorCitsaWJwbmcub2xiIDogbGlicG5nLm9sYigkKE9CSlMpKQorCUAgd3JpdGUgc3lzJG91dHB1dCAiIExpYnBuZyBhdmFpbGFibGUiCisKKworcG5ndGVzdC5leGUgOiBwbmd0ZXN0Lm9iaiBsaWJwbmcub2xiCisgICAgICAgICAgICAgIGxpbmsgcG5ndGVzdCxsaWJwbmcub2xiL2xpYiwkKFpMSUJTUkMpbGliei5vbGIvbGliCisKK3Rlc3QgOiBwbmd0ZXN0LmV4ZQorICAgcnVuIHBuZ3Rlc3QKKworY2xlYW4gOgorCWRlbGV0ZSAqLm9iajsqLCouZXhlOworCisKKyMgT3RoZXIgZGVwZW5kZW5jaWVzLgorcG5nLm9iaiA6IHBuZy5oLCBwbmdjb25mLmgsIHBuZ2xpYmNvbmYuaCwgcG5ncHJpdi5oLCBwbmdzdHJ1Y3QuaCxwbmdpbmZvLmgsIHBuZ2RlYnVnLmgKK3BuZ3ByZWFkLm9iaiA6IHBuZy5oLCBwbmdjb25mLmgsIHBuZ2xpYmNvbmYuaCwgcG5ncHJpdi5oLCBwbmdzdHJ1Y3QuaCxwbmdpbmZvLmgsIHBuZ2RlYnVnLmgKK3BuZ3NldC5vYmogOiBwbmcuaCwgcG5nY29uZi5oLCBwbmdsaWJjb25mLmgsIHBuZ3ByaXYuaCwgcG5nc3RydWN0LmgscG5naW5mby5oLCBwbmdkZWJ1Zy5oCitwbmdnZXQub2JqIDogcG5nLmgsIHBuZ2NvbmYuaCwgcG5nbGliY29uZi5oLCBwbmdwcml2LmgsIHBuZ3N0cnVjdC5oLHBuZ2luZm8uaCwgcG5nZGVidWcuaAorcG5ncmVhZC5vYmogOiBwbmcuaCwgcG5nY29uZi5oLCBwbmdsaWJjb25mLmgsIHBuZ3ByaXYuaCwgcG5nc3RydWN0LmgscG5naW5mby5oLCBwbmdkZWJ1Zy5oCitwbmdydHJhbi5vYmogOiBwbmcuaCwgcG5nY29uZi5oLCBwbmdsaWJjb25mLmgsIHBuZ3ByaXYuaCwgcG5nc3RydWN0LmgscG5naW5mby5oLCBwbmdkZWJ1Zy5oCitwbmdydXRpbC5vYmogOiBwbmcuaCwgcG5nY29uZi5oLCBwbmdsaWJjb25mLmgsIHBuZ3ByaXYuaCwgcG5nc3RydWN0LmgscG5naW5mby5oLCBwbmdkZWJ1Zy5oCitwbmdlcnJvci5vYmogOiBwbmcuaCwgcG5nY29uZi5oLCBwbmdsaWJjb25mLmgsIHBuZ3ByaXYuaCwgcG5nc3RydWN0LmgscG5naW5mby5oLCBwbmdkZWJ1Zy5oCitwbmdtZW0ub2JqIDogcG5nLmgsIHBuZ2NvbmYuaCwgcG5nbGliY29uZi5oLCBwbmdwcml2LmgsIHBuZ3N0cnVjdC5oLHBuZ2luZm8uaCwgcG5nZGVidWcuaAorcG5ncmlvLm9iaiA6IHBuZy5oLCBwbmdjb25mLmgsIHBuZ2xpYmNvbmYuaCwgcG5ncHJpdi5oLCBwbmdzdHJ1Y3QuaCxwbmdpbmZvLmgsIHBuZ2RlYnVnLmgKK3BuZ3dpby5vYmogOiBwbmcuaCwgcG5nY29uZi5oLCBwbmdsaWJjb25mLmgsIHBuZ3ByaXYuaCwgcG5nc3RydWN0LmgscG5naW5mby5oLCBwbmdkZWJ1Zy5oCitwbmd0cmFucy5vYmogOiBwbmcuaCwgcG5nY29uZi5oLCBwbmdsaWJjb25mLmgsIHBuZ3ByaXYuaCwgcG5nc3RydWN0LmgscG5naW5mby5oLCBwbmdkZWJ1Zy5oCitwbmd3cml0ZS5vYmogOiBwbmcuaCwgcG5nY29uZi5oLCBwbmdsaWJjb25mLmgsIHBuZ3ByaXYuaCwgcG5nc3RydWN0LmgscG5naW5mby5oLCBwbmdkZWJ1Zy5oCitwbmd3dHJhbi5vYmogOiBwbmcuaCwgcG5nY29uZi5oLCBwbmdsaWJjb25mLmgsIHBuZ3ByaXYuaCwgcG5nc3RydWN0LmgscG5naW5mby5oLCBwbmdkZWJ1Zy5oCitwbmd3dXRpbC5vYmogOiBwbmcuaCwgcG5nY29uZi5oLCBwbmdsaWJjb25mLmgsIHBuZ3ByaXYuaCwgcG5nc3RydWN0LmgscG5naW5mby5oLCBwbmdkZWJ1Zy5oCisKK3BuZ3Rlc3Qub2JqIDogcG5nLmgsIHBuZ2NvbmYuaCwgcG5nbGliY29uZi5oCmRpZmYgLS1naXQgYS9saWJwbmcvc2NyaXB0cy9kZm4uYXdrIGIvbGlicG5nL3NjcmlwdHMvZGZuLmF3awpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNDZiOWRiCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3NjcmlwdHMvZGZuLmF3awpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJwbmcvc2NyaXB0cy9pbnRwcmVmaXguYyBiL2xpYnBuZy9zY3JpcHRzL2ludHByZWZpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NGY4ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvc2NyaXB0cy9pbnRwcmVmaXguYwpAQCAtMCwwICsxLDIyIEBACisKKy8qIGludHByZWZpeC5jIC0gZ2VuZXJhdGUgYW4gdW5wcmVmaXhlZCBpbnRlcm5hbCBzeW1ib2wgbGlzdAorICoKKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgdmVyc2lvbiAxLjYuMTYgW0RlY2VtYmVyIDIyLCAyMDE0XQorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCisgKi8KKworI2RlZmluZSBQTkdfSU5URVJOQUxfREFUQSh0eXBlLCBuYW1lLCBhcnJheSlcCisgICAgICAgIFBOR19ERk4gIkAiIG5hbWUgIkAiCisKKyNkZWZpbmUgUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHR5cGUsIG5hbWUsIGFyZ3MsIGF0dHJpYnV0ZXMpXAorICAgICAgICBQTkdfREZOICJAIiBuYW1lICJAIgorCisjZGVmaW5lIFBOR19JTlRFUk5BTF9DQUxMQkFDSyh0eXBlLCBuYW1lLCBhcmdzLCBhdHRyaWJ1dGVzKVwKKyAgICAgICAgUE5HX0RGTiAiQCIgbmFtZSAiQCIKKworI2RlZmluZSBQTkdQUkVGSVhfSCAvKiBzZWxmIGdlbmVyYXRpb24gKi8KKyNpbmNsdWRlICIuLi9wbmdwcml2LmgiCmRpZmYgLS1naXQgYS9saWJwbmcvc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gYi9saWJwbmcvc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ2NjQzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9zY3JpcHRzL2xpYnBuZy1jb25maWctYm9keS5pbgpAQCAtMCwwICsxLDk2IEBACisKK3VzYWdlKCkKK3sKKyAgICBjYXQgPDxFT0YKK1VzYWdlOiBsaWJwbmctY29uZmlnIFtPUFRJT05dIC4uLgorCitLbm93biB2YWx1ZXMgZm9yIE9QVElPTiBhcmU6CisKKyAgLS1wcmVmaXggICAgICAgIHByaW50IGxpYnBuZyBwcmVmaXgKKyAgLS1saWJkaXIgICAgICAgIHByaW50IHBhdGggdG8gZGlyZWN0b3J5IGNvbnRhaW5pbmcgbGlicmFyeQorICAtLWxpYnMgICAgICAgICAgcHJpbnQgbGlicmFyeSBsaW5raW5nIGluZm9ybWF0aW9uCisgIC0tY2NvcHRzICAgICAgICBwcmludCBjb21waWxlciBvcHRpb25zCisgIC0tY3BwZmxhZ3MgICAgICBwcmludCBwcmUtcHJvY2Vzc29yIGZsYWdzCisgIC0tY2ZsYWdzICAgICAgICBwcmludCBwcmVwcm9jZXNzb3IgZmxhZ3MsIElfb3B0cywgYW5kIGNvbXBpbGVyIG9wdGlvbnMKKyAgLS1JX29wdHMgICAgICAgIHByaW50ICItSSIgaW5jbHVkZSBvcHRpb25zCisgIC0tTF9vcHRzICAgICAgICBwcmludCBsaW5rZXIgIi1MIiBmbGFncyBmb3IgZHluYW1pYyBsaW5raW5nCisgIC0tUl9vcHRzICAgICAgICBwcmludCBkeW5hbWljIGxpbmtlciAiLVIiIG9yICItcnBhdGgiIGZsYWdzCisgIC0tbGRvcHRzICAgICAgICBwcmludCBsaW5rZXIgb3B0aW9ucworICAtLWxkZmxhZ3MgICAgICAgcHJpbnQgbGlua2VyIGZsYWdzIChsZG9wdHMsIExfb3B0cywgUl9vcHRzLCBhbmQgbGlicykKKyAgLS1zdGF0aWMgICAgICAgIHJldmlzZSBzdWJzZXF1ZW50IG91dHB1dHMgZm9yIHN0YXRpYyBsaW5raW5nCisgIC0taGVscCAgICAgICAgICBwcmludCB0aGlzIGhlbHAgYW5kIGV4aXQKKyAgLS12ZXJzaW9uICAgICAgIHByaW50IHZlcnNpb24gaW5mb3JtYXRpb24KK0VPRgorCisgICAgZXhpdCAkMQorfQorCitpZiB0ZXN0ICQjIC1lcSAwOyB0aGVuCisgICAgdXNhZ2UgMQorZmkKKword2hpbGUgdGVzdCAkIyAtZ3QgMDsgZG8KKyAgICBjYXNlICIkMSIgaW4KKworICAgIC0tcHJlZml4KQorICAgICAgICBlY2hvICR7cHJlZml4fQorICAgICAgICA7OworCisgICAgLS12ZXJzaW9uKQorICAgICAgICBlY2hvICR7dmVyc2lvbn0KKyAgICAgICAgZXhpdCAwCisgICAgICAgIDs7CisKKyAgICAtLWhlbHApCisgICAgICAgIHVzYWdlIDAKKyAgICAgICAgOzsKKworICAgIC0tY2NvcHRzKQorICAgICAgICBlY2hvICR7Y2NvcHRzfQorICAgICAgICA7OworCisgICAgLS1jcHBmbGFncykKKyAgICAgICAgZWNobyAke2NwcGZsYWdzfQorICAgICAgICA7OworCisgICAgLS1jZmxhZ3MpCisgICAgICAgIGVjaG8gJHtJX29wdHN9ICR7Y3BwZmxhZ3N9ICR7Y2NvcHRzfQorICAgICAgICA7OworCisgICAgLS1saWJkaXIpCisgICAgICAgIGVjaG8gJHtsaWJkaXJ9CisgICAgICAgIDs7CisKKyAgICAtLWxpYnMpCisgICAgICAgIGVjaG8gJHtsaWJzfQorICAgICAgICA7OworCisgICAgLS1JX29wdHMpCisgICAgICAgIGVjaG8gJHtJX29wdHN9CisgICAgICAgIDs7CisKKyAgICAtLUxfb3B0cykKKyAgICAgICAgZWNobyAke0xfb3B0c30KKyAgICAgICAgOzsKKworICAgIC0tUl9vcHRzKQorICAgICAgICBlY2hvICR7Ul9vcHRzfQorICAgICAgICA7OworCisgICAgLS1sZGZsYWdzKQorICAgICAgICBlY2hvICR7bGRmbGFnc30gJHtMX29wdHN9ICR7Ul9vcHRzfSAke2xpYnN9CisgICAgICAgIDs7CisKKyAgICAtLXN0YXRpYykKKyAgICAgICAgUl9vcHRzPSIiCisgICAgICAgIDs7CisKKyAgICAqKQorICAgICAgICB1c2FnZQorICAgICAgICBleGl0IDEKKyAgICAgICAgOzsKKyAgICBlc2FjCisgICAgc2hpZnQKK2RvbmUKKworZXhpdCAwCmRpZmYgLS1naXQgYS9saWJwbmcvc2NyaXB0cy9saWJwbmctY29uZmlnLWhlYWQuaW4gYi9saWJwbmcvc2NyaXB0cy9saWJwbmctY29uZmlnLWhlYWQuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUyNTczMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9zY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbgpAQCAtMCwwICsxLDI0IEBACisjISAvYmluL3NoCisKKyMgbGlicG5nLWNvbmZpZworIyBwcm92aWRlcyBjb25maWd1cmF0aW9uIGluZm8gZm9yIGxpYnBuZy4KKworIyBDb3B5cmlnaHQgKEMpIDIwMDIgR2xlbm4gUmFuZGVycy1QZWhyc29uCisKKyMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorIyBhbmQgbGljZW5zZSBpbiBwbmcuaAorCisjIE1vZGVsZWQgYWZ0ZXIgbGlieG1sLWNvbmZpZy4KKwordmVyc2lvbj0xLjYuMjAKK3ByZWZpeD0iIgorbGliZGlyPSIiCitsaWJzPSIiCitJX29wdHM9IiIKK0xfb3B0cz0iIgorUl9vcHRzPSIiCitjcHBmbGFncz0iIgorY2NvcHRzPSIiCitsZG9wdHM9IiIKKwpkaWZmIC0tZ2l0IGEvbGlicG5nL3NjcmlwdHMvbGlicG5nLnBjLmluIGIvbGlicG5nL3NjcmlwdHMvbGlicG5nLnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZjdhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvc2NyaXB0cy9saWJwbmcucGMuaW4KQEAgLTAsMCArMSwxMCBAQAorcHJlZml4PUBwcmVmaXhACitleGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACitsaWJkaXI9QGxpYmRpckAKK2luY2x1ZGVkaXI9QGluY2x1ZGVkaXJAL2xpYnBuZzE2CisKK05hbWU6IGxpYnBuZworRGVzY3JpcHRpb246IExvYWRzIGFuZCBzYXZlcyBQTkcgZmlsZXMKK1ZlcnNpb246IDEuNi4yMAorTGliczogLUwke2xpYmRpcn0gLWxwbmcxNgorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL2xpYnBuZy9zY3JpcHRzL21hY3JvLmxzdCBiL2xpYnBuZy9zY3JpcHRzL21hY3JvLmxzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzEyNGI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3NjcmlwdHMvbWFjcm8ubHN0CkBAIC0wLDAgKzEsMyBAQAorZ2V0X3VpbnRfMzIoYnVmKQorZ2V0X3VpbnRfMTYoYnVmKQorZ2V0X2ludF8zMihidWYpCmRpZmYgLS1naXQgYS9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS4zMnN1bnUgYi9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS4zMnN1bnUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q0YjdjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLjMyc3VudQpAQCAtMCwwICsxLDI0NCBAQAorIyBtYWtlZmlsZSBmb3IgbGlicG5nIG9uIFNvbGFyaXMgMi54IHdpdGggY2MKKyMgQ29udHJpYnV0ZWQgYnkgV2lsbGlhbSBMLiBTZWJvaywgYmFzZWQgb24gbWFrZWZpbGUubGludXgKKyMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA2LCAyMDEwLTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCisjIENvcHlyaWdodCAoQykgMTk5OCBHcmVnIFJvZWxvZnMKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyCisKKyMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorIyBhbmQgbGljZW5zZSBpbiBwbmcuaAorCisjIExpYnJhcnkgbmFtZToKK0xJQk5BTUU9bGlicG5nMTYKK1BOR01BSiA9IDE2CisKKyMgU2hhcmVkIGxpYnJhcnkgbmFtZXM6CitMSUJTTz0kKExJQk5BTUUpLnNvCitMSUJTT01BSj0kKExJQk5BTUUpLnNvLiQoUE5HTUFKKQorTElCU09SRUw9JChMSUJTT01BSikuJChSRUxFQVNFKQorT0xEU089bGlicG5nLnNvCisKKyMgVXRpbGl0aWVzOgorQ0M9Y2MKK0FSX1JDPWFyIHJjCitNS0RJUl9QPW1rZGlyIC1wCitMTl9TRj1sbiAtZiAtcworUkFOTElCPWVjaG8KK1JNX0Y9L2Jpbi9ybSAtZgorCitTVU5fQ0NfRkxBR1M9LWZhc3QgLXh0YXJnZXQ9dWx0cmEKK1NVTl9MRF9GTEFHUz0tZmFzdCAteHRhcmdldD11bHRyYQorCisjIHdoZXJlIG1ha2UgaW5zdGFsbCBwdXRzIGxpYnBuZy5hLCBsaWJwbmcxNi5zbyBhbmQgbGlicG5nMTYvcG5nLmgKK3ByZWZpeD0vYQorZXhlY19wcmVmaXg9JChwcmVmaXgpCisKKyMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZAorIyBDaGFuZ2luZyB0aGVzZSB0byAuLi96bGliIHBvc2VzIGEgc2VjdXJpdHkgcmlzay4gIElmIHlvdSB3YW50CisjIHRvIGhhdmUgemxpYiBpbiBhbiBhZGphY2VudCBkaXJlY3RvcnksIHNwZWNpZnkgdGhlIGZ1bGwgcGF0aCBpbnN0ZWFkIG9mICIuLiIuCisjWkxJQkxJQj0uLi96bGliCisjWkxJQklOQz0uLi96bGliCisKK1pMSUJMSUI9L3Vzci9saWIKK1pMSUJJTkM9L3Vzci9pbmNsdWRlCisKK1dBUk5NT1JFPS1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdzaGFkb3cgXAorCS1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVd0cmFkaXRpb25hbCAtV2Nhc3QtYWxpZ24gXAorCS1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgIy1XY29udmVyc2lvbgorQ1BQRkxBR1M9LUkkKFpMSUJJTkMpICMgLURQTkdfREVCVUc9NQorQ0ZMQUdTPSQoU1VOX0NDX0ZMQUdTKSAjICQoV0FSTk1PUkUpIC1nCitMREZMQUdTPSQoU1VOX0xEX0ZMQUdTKSAtTCQoWkxJQkxJQikgLVIkKFpMSUJMSUIpIGxpYnBuZy5hIC1seiAtbG0KKworSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQorTElCUEFUSD0kKGV4ZWNfcHJlZml4KS9saWIKK01BTlBBVEg9JChwcmVmaXgpL21hbgorQklOUEFUSD0kKGV4ZWNfcHJlZml4KS9iaW4KKworIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAorIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgorIworIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZworIworIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCisjIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKKyMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgorREVTVERJUj0KKworREI9JChERVNURElSKSQoQklOUEFUSCkKK0RJPSQoREVTVERJUikkKElOQ1BBVEgpCitETD0kKERFU1RESVIpJChMSUJQQVRIKQorRE09JChERVNURElSKSQoTUFOUEFUSCkKKworT0JKUyA9IHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKKwlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKKwlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubworCitPQkpTRExMID0gJChPQkpTOi5vPS5waWMubykKKworLlNVRkZJWEVTOiAgICAgIC5jIC5vIC5waWMubworCisuYy5vOgorCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtbyAkQCAkPAorCisuYy5waWMubzoKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgLUtQSUMgLW8gJEAgJCouYworCithbGw6IGxpYnBuZy5hICQoTElCU08pIHBuZ3Rlc3QgbGlicG5nLnBjIGxpYnBuZy1jb25maWcKKworaW5jbHVkZSBzY3JpcHRzL3BuZ2xpYmNvbmYubWFrCitERUxFVEUgPSAkKFJNX0YpCitERk5GTEFHUyA9ICQoREVGUykgJChDUFBGTEFHUykKKworbGlicG5nLmE6ICQoT0JKUykKKwkkKEFSX1JDKSAkQCAkKE9CSlMpCisJJChSQU5MSUIpICRACisKK2xpYnBuZy5wYzoKKwljYXQgc2NyaXB0cy9saWJwbmcucGMuaW4gfCBzZWQgLWUgcyFAcHJlZml4QCEkKHByZWZpeCkhIFwKKwktZSBzIUBleGVjX3ByZWZpeEAhJChleGVjX3ByZWZpeCkhIFwKKwktZSBzIUBsaWJkaXJAISQoTElCUEFUSCkhIFwKKwktZSBzIUBpbmNsdWRlZGlyQCEkKElOQ1BBVEgpISBcCisJLWUgcyEtbHBuZzE2IS1scG5nMTZcIC1selwgLWxtISA+IGxpYnBuZy5wYworCitsaWJwbmctY29uZmlnOgorCSggY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1oZWFkLmluOyBcCisJZWNobyBwcmVmaXg9XCIkKHByZWZpeClcIjsgXAorCWVjaG8gbGliZGlyPVwiJChMSUJQQVRIKVwiOyBcCisJZWNobyBJX29wdHM9XCItSSQoSU5DUEFUSCkvJChMSUJOQU1FKVwiOyBcCisJZWNobyBMX29wdHM9XCItTCQoTElCUEFUSClcIjsgXAorCWVjaG8gUl9vcHRzPVwiLVIkKExJQlBBVEgpXCI7IFwKKwllY2hvIGNjb3B0cz1cIi1mYXN0IC14dGFyZ2V0PXVsdHJhXCI7IFwKKwllY2hvIGxkb3B0cz1cIi1mYXN0IC14dGFyZ2V0PXVsdHJhXCI7IFwKKwllY2hvIGxpYnM9XCItbHBuZzE2IC1seiAtbG1cIjsgXAorCWNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctYm9keS5pbiApID4gbGlicG5nLWNvbmZpZworCWNobW9kICt4IGxpYnBuZy1jb25maWcKKworJChMSUJTTyk6ICQoTElCU09NQUopCisJJChMTl9TRikgJChMSUJTT01BSikgJChMSUJTTykKKworJChMSUJTT01BSik6ICQoT0JKU0RMTCkKKwlAY2FzZSAiYHR5cGUgbGRgIiBpbiAqdWNiKikgXAorCWVjaG87IFwKKwllY2hvICcjIyBXQVJOSU5HOic7IFwKKwllY2hvICcjIyBUaGUgY29tbWFuZHMgIkNDIiBhbmQgIkxEIiBtdXN0IE5PVCByZWZlciB0byAvdXNyL3VjYi9jYyc7IFwKKwllY2hvICcjIyBhbmQgL3Vzci91Y2IvbGQuICBJZiB0aGV5IGRvLCB5b3UgbmVlZCB0byBhZGp1c3QgeW91ciBQQVRIJzsgXAorCWVjaG8gJyMjIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHB1dCAvdXNyL2Njcy9iaW4gYWhlYWQgb2YgL3Vzci91Y2IuJzsgXAorCWVjaG8gJyMjIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBMRF9MSUJSQVJZX1BBVEggc2hvdWxkIG5vdCBiZSBzZXQnOyBcCisJZWNobyAnIyMgYXQgYWxsLiAgSWYgaXQgaXMsIHRoaW5ncyBhcmUgbGlrZWx5IHRvIGJyZWFrIGJlY2F1c2Ugb2YnOyBcCisJZWNobyAnIyMgdGhlIGxpYnVjYiBkZXBlbmRlbmN5IHRoYXQgaXMgY3JlYXRlZC4nOyBcCisJZWNobzsgXAorCTs7IFwKKwllc2FjCisJJChMRCkgLUcgLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKSAtaCAkKExJQlNPTUFKKSBcCisJIC1vICQoTElCU09NQUopICQoT0JKU0RMTCkKKworcG5ndGVzdDogcG5ndGVzdC5vICQoTElCU08pCisJJChDQykgLW8gcG5ndGVzdCAkKENGTEFHUykgcG5ndGVzdC5vICQoTERGTEFHUykKKwordGVzdDogcG5ndGVzdAorCS4vcG5ndGVzdAorCitpbnN0YWxsLWhlYWRlcnM6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKKwktQGlmIFsgISAtZCAkKERJKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCisJLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSkvJChMSUJOQU1FKTsgZmkKKwljcCBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oICQoREkpLyQoTElCTkFNRSkKKwljaG1vZCA2NDQgJChESSkvJChMSUJOQU1FKS9wbmcuaCAkKERJKS8kKExJQk5BTUUpL3BuZ2NvbmYuaCAkKERJKS8kKExJQk5BTUUpL3BuZ2xpYmNvbmYuaAorCS1AJChSTV9GKSAkKERJKS9wbmcuaCAkKERJKS9wbmdjb25mLmggJChESSkvcG5nbGliY29uZi5oCisJLUAkKFJNX0YpICQoREkpL2xpYnBuZworCShjZCAkKERJKTsgJChMTl9TRikgJChMSUJOQU1FKSBsaWJwbmc7ICQoTE5fU0YpICQoTElCTkFNRSkvKiAuKQorCitpbnN0YWxsLXN0YXRpYzogaW5zdGFsbC1oZWFkZXJzIGxpYnBuZy5hCisJLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQorCWNwIGxpYnBuZy5hICQoREwpLyQoTElCTkFNRSkuYQorCWNobW9kIDY0NCAkKERMKS8kKExJQk5BTUUpLmEKKwktQCQoUk1fRikgJChETCkvbGlicG5nLmEKKwkoY2QgJChETCk7ICQoTE5fU0YpICQoTElCTkFNRSkuYSBsaWJwbmcuYSkKKworaW5zdGFsbC1zaGFyZWQ6IGluc3RhbGwtaGVhZGVycyAkKExJQlNPTUFKKSBsaWJwbmcucGMKKwktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCisJLUAkKFJNX0YpICQoREwpLyQoTElCU08pCisJLUAkKFJNX0YpICQoREwpLyQoTElCU09SRUwpCisJLUAkKFJNX0YpICQoREwpLyQoT0xEU08pCisJY3AgJChMSUJTT01BSikgJChETCkvJChMSUJTT1JFTCkKKwljaG1vZCA3NTUgJChETCkvJChMSUJTT1JFTCkKKwkoY2QgJChETCk7IFwKKwkkKExOX1NGKSAkKExJQlNPUkVMKSAkKExJQlNPKTsgXAorCSQoTE5fU0YpICQoTElCU08pICQoT0xEU08pKQorCS1AaWYgWyAhIC1kICQoREwpL3BrZ2NvbmZpZyBdOyB0aGVuICQoTUtESVJfUCkgJChETCkvcGtnY29uZmlnOyBmaQorCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYworCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvbGlicG5nLnBjCisJY3AgbGlicG5nLnBjICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCisJY2htb2QgNjQ0ICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCisJKGNkICQoREwpL3BrZ2NvbmZpZzsgJChMTl9TRikgJChMSUJOQU1FKS5wYyBsaWJwbmcucGMpCisKK2luc3RhbGwtbWFuOiBsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41CisJLUBpZiBbICEgLWQgJChETSkgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pOyBmaQorCS1AaWYgWyAhIC1kICQoRE0pL21hbjMgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjM7IGZpCisJLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5nLjMKKwktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmdwZi4zCisJY3AgbGlicG5nLjMgJChETSkvbWFuMworCWNwIGxpYnBuZ3BmLjMgJChETSkvbWFuMworCS1AaWYgWyAhIC1kICQoRE0pL21hbjUgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjU7IGZpCisJLUAkKFJNX0YpICQoRE0pL21hbjUvcG5nLjUKKwljcCBwbmcuNSAkKERNKS9tYW41CisKK2luc3RhbGwtY29uZmlnOiBsaWJwbmctY29uZmlnCisJLUBpZiBbICEgLWQgJChEQikgXTsgdGhlbiAkKE1LRElSX1ApICQoREIpOyBmaQorCS1AJChSTV9GKSAkKERCKS9saWJwbmctY29uZmlnCisJLUAkKFJNX0YpICQoREIpLyQoTElCTkFNRSktY29uZmlnCisJY3AgbGlicG5nLWNvbmZpZyAkKERCKS8kKExJQk5BTUUpLWNvbmZpZworCWNobW9kIDc1NSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZworCShjZCAkKERCKTsgJChMTl9TRikgJChMSUJOQU1FKS1jb25maWcgbGlicG5nLWNvbmZpZykKKworaW5zdGFsbDogaW5zdGFsbC1zdGF0aWMgaW5zdGFsbC1zaGFyZWQgaW5zdGFsbC1tYW4gaW5zdGFsbC1jb25maWcKKworIyBJZiB5b3UgaW5zdGFsbGVkIGluICQoREVTVERJUiksIHRlc3QtaW5zdGFsbGVkIHdvbid0IHdvcmsgdW50aWwgeW91CisjIG1vdmUgdGhlIGxpYnJhcnkgdG8gaXRzIGZpbmFsIGxvY2F0aW9uLiAgVXNlIHRlc3QtZGQgdG8gdGVzdCBpdAorIyBiZWZvcmUgdGhlbi4KKwordGVzdC1kZDoKKwllY2hvCisJZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5IGluICQoREwpLgorCSQoQ0MpICQoU1VOX0NDX0ZMQUdTKSAtSSQoREkpICQoQ1BQRkxBR1MpIFwKKwkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKKwkgICAtbyBwbmd0ZXN0ZCAtTCQoREwpIC1SJChETCkgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYCBcCisJICAgJChTVU5fTERfRkxBR1MpIC1MJChaTElCTElCKSAtUiQoWkxJQkxJQikKKwkuL3BuZ3Rlc3RkIHBuZ3Rlc3QucG5nCisKK3Rlc3QtaW5zdGFsbGVkOgorCWVjaG8KKwllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkuCisJJChDQykgJChTVU5fQ0NfRkxBR1MpICQoQ1BQRkxBR1MpIFwKKwkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKKwkgICAtbyBwbmd0ZXN0aSBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgIFwKKwkgICAkKFNVTl9MRF9GTEFHUykgLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKQorCS4vcG5ndGVzdGkgcG5ndGVzdC5wbmcKKworY2xlYW46CisJJChSTV9GKSAqLm8gbGlicG5nLmEgcG5ndGVzdCBwbmd0ZXN0aSBwbmdvdXQucG5nIFwKKwlsaWJwbmctY29uZmlnICQoTElCU08pICQoTElCU09NQUopKiBcCisJbGlicG5nLnBjCisKK0RPQ1MgPSBBTk5PVU5DRSBDSEFOR0VTIElOU1RBTEwgS05PV05CVUcgTElDRU5TRSBSRUFETUUgVE9ETyBZMktJTkZPCit3cml0ZWxvY2s6CisJY2htb2QgYS13ICouW2NoMzVdICQoRE9DUykgc2NyaXB0cy8qCisKKyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KKworcG5nLm8gcG5nLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nZXJyb3IubyBwbmdlcnJvci5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3Jpby5vIHBuZ3Jpby5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3dpby5vIHBuZ3dpby5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ21lbS5vIHBuZ21lbS5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3NldC5vIHBuZ3NldC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ2dldC5vIHBuZ2dldC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3JlYWQubyBwbmdyZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncnRyYW4ubyBwbmdydHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3J1dGlsLm8gcG5ncnV0aWwucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd0cmFucy5vIHBuZ3RyYW5zLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd3JpdGUubyBwbmd3cml0ZS5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3d0cmFuLm8gcG5nd3RyYW4ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3dXRpbC5vIHBuZ3d1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncHJlYWQubyBwbmdwcmVhZC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKworcG5ndGVzdC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCmRpZmYgLS1naXQgYS9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS42NHN1bnUgYi9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS42NHN1bnUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQxZmNlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLjY0c3VudQpAQCAtMCwwICsxLDI0NCBAQAorIyBtYWtlZmlsZSBmb3IgbGlicG5nIG9uIFNvbGFyaXMgMi54IHdpdGggY2MKKyMgQ29udHJpYnV0ZWQgYnkgV2lsbGlhbSBMLiBTZWJvaywgYmFzZWQgb24gbWFrZWZpbGUubGludXgKKyMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA2LCAyMDEwLTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCisjIENvcHlyaWdodCAoQykgMTk5OCBHcmVnIFJvZWxvZnMKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyCisKKyMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorIyBhbmQgbGljZW5zZSBpbiBwbmcuaAorCisjIExpYnJhcnkgbmFtZToKK0xJQk5BTUU9bGlicG5nMTYKK1BOR01BSiA9IDE2CisKKyMgU2hhcmVkIGxpYnJhcnkgbmFtZXM6CitMSUJTTz0kKExJQk5BTUUpLnNvCitMSUJTT01BSj0kKExJQk5BTUUpLnNvLiQoUE5HTUFKKQorTElCU09SRUw9JChMSUJTT01BSikuJChSRUxFQVNFKQorT0xEU089bGlicG5nLnNvCisKKyMgVXRpbGl0aWVzOgorQ0M9Y2MKK0FSX1JDPWFyIHJjCitNS0RJUl9QPW1rZGlyIC1wCitMTl9TRj1sbiAtZiAtcworUkFOTElCPWVjaG8KK1JNX0Y9L2Jpbi9ybSAtZgorCitTVU5fQ0NfRkxBR1M9LWZhc3QgLXh0YXJnZXQ9dWx0cmEgLXhhcmNoPXY5CitTVU5fTERfRkxBR1M9LWZhc3QgLXh0YXJnZXQ9dWx0cmEgLXhhcmNoPXY5CisKKyMgd2hlcmUgbWFrZSBpbnN0YWxsIHB1dHMgbGlicG5nLmEsIGxpYnBuZzE2LnNvIGFuZCBsaWJwbmcxNi9wbmcuaAorcHJlZml4PS9hCitleGVjX3ByZWZpeD0kKHByZWZpeCkKKworIyBXaGVyZSB0aGUgemxpYiBsaWJyYXJ5IGFuZCBpbmNsdWRlIGZpbGVzIGFyZSBsb2NhdGVkCisjIENoYW5naW5nIHRoZXNlIHRvIC4uL3psaWIgcG9zZXMgYSBzZWN1cml0eSByaXNrLiAgSWYgeW91IHdhbnQKKyMgdG8gaGF2ZSB6bGliIGluIGFuIGFkamFjZW50IGRpcmVjdG9yeSwgc3BlY2lmeSB0aGUgZnVsbCBwYXRoIGluc3RlYWQgb2YgIi4uIi4KKyNaTElCTElCPS4uL3psaWIKKyNaTElCSU5DPS4uL3psaWIKKworWkxJQkxJQj0vdXNyL2xpYgorWkxJQklOQz0vdXNyL2luY2x1ZGUKKworV0FSTk1PUkU9LVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCAtV3NoYWRvdyBcCisJLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV3RyYWRpdGlvbmFsIC1XY2FzdC1hbGlnbiBcCisJLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyAjLVdjb252ZXJzaW9uCitDUFBGTEFHUz0tSSQoWkxJQklOQykgIyAtRFBOR19ERUJVRz01CitDRkxBR1M9ICQoU1VOX0NDX0ZMQUdTKSAjICQoV0FSTk1PUkUpIC1nCitMREZMQUdTPS1MLiAtUi4gJChTVU5fTERfRkxBR1MpIC1MJChaTElCTElCKSAtUiQoWkxJQkxJQikgLWxwbmcxNiAtbHogLWxtCisKK0lOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKK0xJQlBBVEg9JChleGVjX3ByZWZpeCkvbGliCitNQU5QQVRIPSQocHJlZml4KS9tYW4KK0JJTlBBVEg9JChleGVjX3ByZWZpeCkvYmluCisKKyMgb3ZlcnJpZGUgREVTVERJUj0gb24gdGhlIG1ha2UgaW5zdGFsbCBjb21tYW5kIGxpbmUgdG8gZWFzaWx5IHN1cHBvcnQKKyMgaW5zdGFsbGluZyBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uLiAgRXhhbXBsZToKKyMKKyMgICAgbWFrZSBpbnN0YWxsIERFU1RESVI9L3RtcC9idWlsZC9saWJwbmcKKyMKKyMgSWYgeW91J3JlIGdvaW5nIHRvIGluc3RhbGwgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbgorIyB2aWEgREVTVERJUiwgJChERVNURElSKSQocHJlZml4KSBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlCisjIHlvdSBleGVjdXRlIG1ha2UgaW5zdGFsbC4KK0RFU1RESVI9CisKK0RCPSQoREVTVERJUikkKEJJTlBBVEgpCitEST0kKERFU1RESVIpJChJTkNQQVRIKQorREw9JChERVNURElSKSQoTElCUEFUSCkKK0RNPSQoREVTVERJUikkKE1BTlBBVEgpCisKK09CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCisJcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCisJcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KKworT0JKU0RMTCA9ICQoT0JKUzoubz0ucGljLm8pCisKKy5TVUZGSVhFUzogICAgICAuYyAubyAucGljLm8KKworLmMubzoKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgLW8gJEAgJDwKKworLmMucGljLm86CisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1LUElDIC1vICRAICQqLmMKKworYWxsOiBsaWJwbmcuYSAkKExJQlNPKSBwbmd0ZXN0IGxpYnBuZy5wYyBsaWJwbmctY29uZmlnCisKK2luY2x1ZGUgc2NyaXB0cy9wbmdsaWJjb25mLm1haworREVMRVRFID0gJChSTV9GKQorREZORkxBR1MgPSAkKERFRlMpICQoQ1BQRkxBR1MpCisKK2xpYnBuZy5hOiAkKE9CSlMpCisJJChBUl9SQykgJEAgJChPQkpTKQorCSQoUkFOTElCKSAkQAorCitsaWJwbmcucGM6CisJY2F0IHNjcmlwdHMvbGlicG5nLnBjLmluIHwgc2VkIC1lIHMhQHByZWZpeEAhJChwcmVmaXgpISBcCisJLWUgcyFAZXhlY19wcmVmaXhAISQoZXhlY19wcmVmaXgpISBcCisJLWUgcyFAbGliZGlyQCEkKExJQlBBVEgpISBcCisJLWUgcyFAaW5jbHVkZWRpckAhJChJTkNQQVRIKSEgXAorCS1lIHMhLWxwbmcxNiEtbHBuZzE2XCAtbHpcIC1sbSEgPiBsaWJwbmcucGMKKworbGlicG5nLWNvbmZpZzoKKwkoIGNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbjsgXAorCWVjaG8gcHJlZml4PVwiJChwcmVmaXgpXCI7IFwKKwllY2hvIGxpYmRpcj1cIiQoTElCUEFUSClcIjsgXAorCWVjaG8gSV9vcHRzPVwiLUkkKElOQ1BBVEgpLyQoTElCTkFNRSlcIjsgXAorCWVjaG8gTF9vcHRzPVwiLUwkKExJQlBBVEgpXCI7IFwKKwllY2hvIFJfb3B0cz1cIi1SJChMSUJQQVRIKVwiOyBcCisJZWNobyBjY29wdHM9XCItZmFzdCAteHRhcmdldD11bHRyYSAteGFyY2g9djlcIjsgXAorCWVjaG8gbGRvcHRzPVwiLWZhc3QgLXh0YXJnZXQ9dWx0cmEgLXhhcmNoPXY5XCI7IFwKKwllY2hvIGxpYnM9XCItbHBuZzE2IC1seiAtbG1cIjsgXAorCWNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctYm9keS5pbiApID4gbGlicG5nLWNvbmZpZworCWNobW9kICt4IGxpYnBuZy1jb25maWcKKworJChMSUJTTyk6ICQoTElCU09NQUopCisJJChMTl9TRikgJChMSUJTT01BSikgJChMSUJTTykKKworJChMSUJTT01BSik6ICQoT0JKU0RMTCkKKwlAY2FzZSAiYHR5cGUgbGRgIiBpbiAqdWNiKikgXAorCWVjaG87IFwKKwllY2hvICcjIyBXQVJOSU5HOic7IFwKKwllY2hvICcjIyBUaGUgY29tbWFuZHMgIkNDIiBhbmQgIkxEIiBtdXN0IE5PVCByZWZlciB0byAvdXNyL3VjYi9jYyc7IFwKKwllY2hvICcjIyBhbmQgL3Vzci91Y2IvbGQuICBJZiB0aGV5IGRvLCB5b3UgbmVlZCB0byBhZGp1c3QgeW91ciBQQVRIJzsgXAorCWVjaG8gJyMjIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHB1dCAvdXNyL2Njcy9iaW4gYWhlYWQgb2YgL3Vzci91Y2IuJzsgXAorCWVjaG8gJyMjIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBMRF9MSUJSQVJZX1BBVEggc2hvdWxkIG5vdCBiZSBzZXQnOyBcCisJZWNobyAnIyMgYXQgYWxsLiAgSWYgaXQgaXMsIHRoaW5ncyBhcmUgbGlrZWx5IHRvIGJyZWFrIGJlY2F1c2Ugb2YnOyBcCisJZWNobyAnIyMgdGhlIGxpYnVjYiBkZXBlbmRlbmN5IHRoYXQgaXMgY3JlYXRlZC4nOyBcCisJZWNobzsgXAorCTs7IFwKKwllc2FjCisJJChMRCkgLUcgLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKSAtaCAkKExJQlNPTUFKKSBcCisJIC1vICQoTElCU09NQUopICQoT0JKU0RMTCkKKworcG5ndGVzdDogcG5ndGVzdC5vICQoTElCU08pCisJJChDQykgLW8gcG5ndGVzdCAkKENGTEFHUykgcG5ndGVzdC5vICQoTERGTEFHUykKKwordGVzdDogcG5ndGVzdAorCS4vcG5ndGVzdAorCitpbnN0YWxsLWhlYWRlcnM6IHBuZy5oIHBuZ2NvbmYuaAorCS1AaWYgWyAhIC1kICQoREkpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKTsgZmkKKwktQGlmIFsgISAtZCAkKERJKS8kKExJQk5BTUUpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKS8kKExJQk5BTUUpOyBmaQorCWNwIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggJChESSkvJChMSUJOQU1FKQorCWNobW9kIDY0NCAkKERJKS8kKExJQk5BTUUpL3BuZy5oICQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oICQoREkpLyQoTElCTkFNRSkvcG5nbGliY29uZi5oCisJLUAkKFJNX0YpICQoREkpL3BuZy5oICQoREkpL3BuZ2NvbmYuaCAkKERJKS9wbmdsaWJjb25mLmgKKwktQCQoUk1fRikgJChESSkvbGlicG5nCisJKGNkICQoREkpOyAkKExOX1NGKSAkKExJQk5BTUUpIGxpYnBuZzsgJChMTl9TRikgJChMSUJOQU1FKS8qIC4pCisKK2luc3RhbGwtc3RhdGljOiBpbnN0YWxsLWhlYWRlcnMgbGlicG5nLmEKKwktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCisJY3AgbGlicG5nLmEgJChETCkvJChMSUJOQU1FKS5hCisJY2htb2QgNjQ0ICQoREwpLyQoTElCTkFNRSkuYQorCS1AJChSTV9GKSAkKERMKS9saWJwbmcuYQorCShjZCAkKERMKTsgJChMTl9TRikgJChMSUJOQU1FKS5hIGxpYnBuZy5hKQorCitpbnN0YWxsLXNoYXJlZDogaW5zdGFsbC1oZWFkZXJzICQoTElCU09NQUopIGxpYnBuZy5wYworCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKKwktQCQoUk1fRikgJChETCkvJChMSUJTTykKKwktQCQoUk1fRikgJChETCkvJChMSUJTT1JFTCkKKwktQCQoUk1fRikgJChETCkvJChPTERTTykKKwljcCAkKExJQlNPTUFKKSAkKERMKS8kKExJQlNPUkVMKQorCWNobW9kIDc1NSAkKERMKS8kKExJQlNPUkVMKQorCShjZCAkKERMKTsgXAorCSQoTE5fU0YpICQoTElCU09SRUwpICQoTElCU08pOyBcCisJJChMTl9TRikgJChMSUJTTykgJChPTERTTykpCisJLUBpZiBbICEgLWQgJChETCkvcGtnY29uZmlnIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKS9wa2djb25maWc7IGZpCisJLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCisJLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy9saWJwbmcucGMKKwljcCBsaWJwbmcucGMgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKKwljaG1vZCA2NDQgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKKwkoY2QgJChETCkvcGtnY29uZmlnOyAkKExOX1NGKSAkKExJQk5BTUUpLnBjIGxpYnBuZy5wYykKKworaW5zdGFsbC1tYW46IGxpYnBuZy4zIGxpYnBuZ3BmLjMgcG5nLjUKKwktQGlmIFsgISAtZCAkKERNKSBdOyB0aGVuICQoTUtESVJfUCkgJChETSk7IGZpCisJLUBpZiBbICEgLWQgJChETSkvbWFuMyBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuMzsgZmkKKwktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmcuMworCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZ3BmLjMKKwljcCBsaWJwbmcuMyAkKERNKS9tYW4zCisJY3AgbGlicG5ncGYuMyAkKERNKS9tYW4zCisJLUBpZiBbICEgLWQgJChETSkvbWFuNSBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuNTsgZmkKKwktQCQoUk1fRikgJChETSkvbWFuNS9wbmcuNQorCWNwIHBuZy41ICQoRE0pL21hbjUKKworaW5zdGFsbC1jb25maWc6IGxpYnBuZy1jb25maWcKKwktQGlmIFsgISAtZCAkKERCKSBdOyB0aGVuICQoTUtESVJfUCkgJChEQik7IGZpCisJLUAkKFJNX0YpICQoREIpL2xpYnBuZy1jb25maWcKKwktQCQoUk1fRikgJChEQikvJChMSUJOQU1FKS1jb25maWcKKwljcCBsaWJwbmctY29uZmlnICQoREIpLyQoTElCTkFNRSktY29uZmlnCisJY2htb2QgNzU1ICQoREIpLyQoTElCTkFNRSktY29uZmlnCisJKGNkICQoREIpOyAkKExOX1NGKSAkKExJQk5BTUUpLWNvbmZpZyBsaWJwbmctY29uZmlnKQorCitpbnN0YWxsOiBpbnN0YWxsLXN0YXRpYyBpbnN0YWxsLXNoYXJlZCBpbnN0YWxsLW1hbiBpbnN0YWxsLWNvbmZpZworCisjIElmIHlvdSBpbnN0YWxsZWQgaW4gJChERVNURElSKSwgdGVzdC1pbnN0YWxsZWQgd29uJ3Qgd29yayB1bnRpbCB5b3UKKyMgbW92ZSB0aGUgbGlicmFyeSB0byBpdHMgZmluYWwgbG9jYXRpb24uICBVc2UgdGVzdC1kZCB0byB0ZXN0IGl0CisjIGJlZm9yZSB0aGVuLgorCit0ZXN0LWRkOgorCWVjaG8KKwllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkgaW4gJChETCkuCisJJChDQykgJChTVU5fQ0NfRkxBR1MpIC1JJChESSkgJChDUFBGTEFHUykgXAorCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAorCSAgIC1vIHBuZ3Rlc3RkIC1MJChETCkgLVIkKERMKSBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgIFwKKwkgICAkKFNVTl9MRF9GTEFHUykgLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKQorCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKKwordGVzdC1pbnN0YWxsZWQ6CisJZWNobworCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeS4KKwkkKENDKSAkKFNVTl9DQ19GTEFHUykgJChDUFBGTEFHUykgXAorCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAorCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AgXAorCSAgICQoU1VOX0xEX0ZMQUdTKSAtTCQoWkxJQkxJQikgLVIkKFpMSUJMSUIpCisJLi9wbmd0ZXN0aSBwbmd0ZXN0LnBuZworCitjbGVhbjoKKwkkKFJNX0YpICoubyBsaWJwbmcuYSBwbmd0ZXN0IHBuZ3Rlc3RpIHBuZ291dC5wbmcgXAorCWxpYnBuZy1jb25maWcgJChMSUJTTykgJChMSUJTT01BSikqIFwKKwlsaWJwbmcucGMKKworRE9DUyA9IEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8KK3dyaXRlbG9jazoKKwljaG1vZCBhLXcgKi5bY2gzNV0gJChET0NTKSBzY3JpcHRzLyoKKworIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgorCitwbmcubyBwbmcucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdlcnJvci5vIHBuZ2Vycm9yLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncmlvLm8gcG5ncmlvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd2lvLm8gcG5nd2lvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nbWVtLm8gcG5nbWVtLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nc2V0Lm8gcG5nc2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nZ2V0Lm8gcG5nZ2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncmVhZC5vIHBuZ3JlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdydHJhbi5vIHBuZ3J0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncnV0aWwubyBwbmdydXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3RyYW5zLm8gcG5ndHJhbnMucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3cml0ZS5vIHBuZ3dyaXRlLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd3RyYW4ubyBwbmd3dHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3d1dGlsLm8gcG5nd3V0aWwucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdwcmVhZC5vIHBuZ3ByZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorCitwbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKZGlmZiAtLWdpdCBhL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmFjb3JuIGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuYWNvcm4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBiOGZiNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmFjb3JuCkBAIC0wLDAgKzEsNTcgQEAKKyMgUHJvamVjdDogICBsaWJwbmcKKworCisjIFRvb2xmbGFnczoKK0NDZmxhZ3MgPSAtYyAtZGVwZW5kICFEZXBlbmQgLUlDOixabGliOiAtZyAtdGhyb3diYWNrICAtRFJJU0NPUyAgLWZuYWgKK0MrK2ZsYWdzID0gLWMgLWRlcGVuZCAhRGVwZW5kIC1JQzogLXRocm93YmFjaworTGlua2ZsYWdzID0gLWFpZiAtYysrIC1vICRACitPYmpBc21mbGFncyA9IC10aHJvd2JhY2sgLU5vQ2FjaGUgLWRlcGVuZCAhRGVwZW5kCitDTUhHZmxhZ3MgPQorTGliRmlsZWZsYWdzID0gLWMgLWwgLW8gJEAKK1NxdWVlemVmbGFncyA9IC1vICRACisKKyMgRmluYWwgdGFyZ2V0czoKK0AubGlicG5nLWxpYjogICBALm8ucG5nIEAuby5wbmdlcnJvciBALm8ucG5ncmlvIEAuby5wbmd3aW8gQC5vLnBuZ21lbSBcCisJQC5vLnBuZ3ByZWFkIEAuby5wbmdzZXQgQC5vLnBuZ2dldCBALm8ucG5ncmVhZCBALm8ucG5ncnRyYW4gXAorCUAuby5wbmdydXRpbCBALm8ucG5ndHJhbnMgQC5vLnBuZ3dyaXRlIEAuby5wbmd3dHJhbiBALm8ucG5nd3V0aWwKKwlMaWJGaWxlICQoTGliRmlsZWZsYWdzKSBALm8ucG5nIEAuby5wbmdlcnJvciBALm8ucG5ncmlvIEAuby5wbmdydHJhbiBcCisJQC5vLnBuZ21lbSBALm8ucG5ncHJlYWQgQC5vLnBuZ3NldCBALm8ucG5nZ2V0IEAuby5wbmdyZWFkIEAuby5wbmd3aW8gXAorCUAuby5wbmdydXRpbCBALm8ucG5ndHJhbnMgIEAuby5wbmd3cml0ZSBALm8ucG5nd3RyYW4gQC5vLnBuZ3d1dGlsCitALm1tLWxpYnBuZy1saWI6ICAgQC5tbS5wbmcgQC5tbS5wbmdlcnJvciBALm1tLnBuZ3JpbyBALm1tLnBuZ3dpbyBALm1tLnBuZ21lbSBcCisJQC5tbS5wbmdwcmVhZCBALm1tLnBuZ3NldCBALm1tLnBuZ2dldCBALm1tLnBuZ3JlYWQgQC5tbS5wbmdydHJhbiBcCisJQC5tbS5wbmdydXRpbCBALm1tLnBuZ3RyYW5zIEAubW0ucG5nd3JpdGUgQC5tbS5wbmd3dHJhbiBALm1tLnBuZ3d1dGlsCisJTGliRmlsZSAkKExpYkZpbGVmbGFncykgQC5tbS5wbmcgQC5tbS5wbmdlcnJvciBALm1tLnBuZ3JpbyBcCisJQC5tbS5wbmd3aW8gQC5tbS5wbmdtZW0gQC5tbS5wbmdwcmVhZCBALm1tLnBuZ3NldCBALm1tLnBuZ2dldCBcCisJQC5tbS5wbmdyZWFkIEAubW0ucG5ncnRyYW4gQC5tbS5wbmdydXRpbCBALm1tLnBuZ3RyYW5zIEAubW0ucG5nd3JpdGUgXAorCUAubW0ucG5nd3RyYW4gQC5tbS5wbmd3dXRpbAorCisKKyMgVXNlci1lZGl0YWJsZSBkZXBlbmRlbmNpZXM6CisjIChDKSBDb3B5cmlnaHQgMTk5NyBUb20gVGFubmVyCitUZXN0OiBALnBuZ3Rlc3QKKwk8UHJlZml4JERpcj4ucG5ndGVzdAorCUByZW1vdmUgPFByZWZpeCREaXI+LnBuZ3Rlc3QKKworI0l0IHdvdWxkIGJlIG5pY2UgaWYgeW91IGNvdWxkIHN0b3AgIm1ha2UiIGxpc3RpbmcgZnJvbSBoZXJlIG9uIQorQC5wbmd0ZXN0OiAgIEAuby5wbmd0ZXN0IEAubGlicG5nLWxpYiBDOm8uU3R1YnMgWmxpYjp6bGliX2xpYgorCUxpbmsgJChMaW5rZmxhZ3MpIEAuby5wbmd0ZXN0IEAubGlicG5nLWxpYiBDOm8uU3R1YnMgWmxpYjp6bGliX2xpYgorCisuU1VGRklYRVM6IC5vIC5tbSAuYworCisuYy5tbToKKwlNZW1DaGVjay5DQyBjYyAkKGNjZmxhZ3MpIC1vICRAIExpYlBuZzokPAorLmMubzoKKwljYyAkKGNjZmxhZ3MpIC1vICRAICQ8CisKKyMgU2VlIHNjcmlwdHMubWFrLmxpYnBuZ2NvbmYgZm9yIGhvdyB0byBnZW5lcmF0ZSB0aGlzOgorQC5oLmxpYnBuZ2NvbmY6IEAuc2NyaXB0cy5oLmxpYnBuZ2NvbmYKKwljb3B5IEAuc2NyaXB0cy5oLmxpYnBuZ2NvbmYgJEAKKworIyBTdGF0aWMgZGVwZW5kZW5jaWVzOgorQC5vLnBuZyBALm8ucG5nZXJyb3IgQC5vLnBuZ3JpbyBALm8ucG5nd2lvIEAuby5wbmdtZW0gXAorQC5vLnBuZ3ByZWFkIEAuby5wbmdzZXQgQC5vLnBuZ2dldCBALm8ucG5ncmVhZCBALm8ucG5ncnRyYW4gXAorQC5vLnBuZ3J1dGlsIEAuby5wbmd0cmFucyBALm8ucG5nd3JpdGUgQC5vLnBuZ3d0cmFuIEAuby5wbmd3dXRpbCBcCitALm8ucG5ndGVzdDogQC5oLmxpYnBuZ2NvbmYKKworCisjIER5bmFtaWMgZGVwZW5kZW5jaWVzOgpkaWZmIC0tZ2l0IGEvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuYWl4IGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuYWl4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNjJkNTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5haXgKQEAgLTAsMCArMSwxMTYgQEAKKyMgbWFrZWZpbGUgZm9yIGxpYnBuZyB1c2luZyBnY2MgKGdlbmVyaWMsIHN0YXRpYyBsaWJyYXJ5KQorIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDYtMjAwOSwgMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyMgQ29weXJpZ2h0IChDKSAyMDAwIENvc21pbiBUcnV0YQorIyBDb3B5cmlnaHQgKEMpIDIwMDAgTWFyYyBPLiBHbG9vciAoQUlYIHN1cHBvcnQgYWRkZWQsIGZyb20gbWFrZWZpbGUuZ2NjKQorIyBDb3B5cmlnaHQgKEMpIDE5OTUgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuCisjCisjIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisjIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKworIyBMb2NhdGlvbiBvZiB0aGUgemxpYiBsaWJyYXJ5IGFuZCBpbmNsdWRlIGZpbGVzCitaTElCSU5DID0gLi4vemxpYgorWkxJQkxJQiA9IC4uL3psaWIKKworIyBDb21waWxlciwgbGlua2VyLCBsaWIgYW5kIG90aGVyIHRvb2xzCitDQyA9IGdjYworTEQgPSAkKENDKQorQVJfUkMgPSBhciByY3MKK01LRElSX1AgPSBta2RpciAtcAorUkFOTElCID0gcmFubGliCitSTV9GID0gcm0gLWYKK0xOX1NGID0gbG4gLWYgLXMKKworTElCTkFNRSA9IGxpYnBuZzE2CitQTkdNQUogPSAxNgorCitwcmVmaXg9L3Vzci9sb2NhbAorSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQorTElCUEFUSD0kKHByZWZpeCkvbGliCisKKyMgb3ZlcnJpZGUgREVTVERJUj0gb24gdGhlIG1ha2UgaW5zdGFsbCBjb21tYW5kIGxpbmUgdG8gZWFzaWx5IHN1cHBvcnQKKyMgaW5zdGFsbGluZyBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uLiAgRXhhbXBsZToKKyMKKyMgICAgbWFrZSBpbnN0YWxsIERFU1RESVI9L3RtcC9idWlsZC9saWJwbmcKKyMKKyMgSWYgeW91J3JlIGdvaW5nIHRvIGluc3RhbGwgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbgorIyB2aWEgREVTVERJUiwgJChERVNURElSKSQocHJlZml4KSBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlCisjIHlvdSBleGVjdXRlIG1ha2UgaW5zdGFsbC4KK0RFU1RESVI9CisKK0RJPSQoREVTVERJUikkKElOQ1BBVEgpCitETD0kKERFU1RESVIpJChMSUJQQVRIKQorCitXQVJOTU9SRSA9CitDUFBGTEFHUyA9IC1JJChaTElCSU5DKSAjIC1EUE5HX0RFQlVHPTUKK0NGTEFHUyA9IC1XIC1XYWxsIC1PMiAjICQoV0FSTk1PUkUpIC1nCitMREZMQUdTID0gLUwuIC1MJChaTElCTElCKSAtbHBuZzE2IC1seiAtbG0KKworIyBWYXJpYWJsZXMKK09CSlMgPSAgcG5nLm8gcG5nZXJyb3IubyBwbmdnZXQubyBwbmdtZW0ubyBwbmdwcmVhZC5vIFwKKwlwbmdyZWFkLm8gcG5ncmlvLm8gcG5ncnRyYW4ubyBwbmdydXRpbC5vIHBuZ3NldC5vIFwKKwlwbmd0cmFucy5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5nd3RyYW4ubyBwbmd3dXRpbC5vCisKKyMgVGFyZ2V0cworLmMubzoKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgLW8gJEAgJDwKKworYWxsOiAkKExJQk5BTUUpLmEgcG5ndGVzdCQoRSkKKworaW5jbHVkZSBzY3JpcHRzL3BuZ2xpYmNvbmYubWFrCitSRU1PVkUgPSAkKFJNX0YpCitERk5GTEFHUyA9ICQoREVGUykgJChDUFBGTEFHUykKKworJChMSUJOQU1FKS5hOiAkKE9CSlMpCisJJChBUl9SQykgJEAgJChPQkpTKQorCSQoUkFOTElCKSAkQAorCit0ZXN0OiBwbmd0ZXN0JChFKQorCS4vcG5ndGVzdCQoRSkKKworcG5ndGVzdCQoRSk6IHBuZ3Rlc3QubyAkKExJQk5BTUUpLmEKKwkkKExEKSAtbyAkQCBwbmd0ZXN0Lm8gJChMREZMQUdTKQorCitpbnN0YWxsOiAkKExJQk5BTUUpLmEKKwktQGlmIFsgISAtZCAkKERJKSAgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpOyBmaQorCS1AaWYgWyAhIC1kICQoREkpLyQoTElCTkFNRSkgIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKS8kKExJQk5BTUUpOyBmaQorCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKKwktQCQoUk1fRikgJChESSkvJChMSUJOQU1FKS9wbmcuaAorCS1AJChSTV9GKSAkKERJKS8kKExJQk5BTUUpL3BuZ2NvbmYuaAorCS1AJChSTV9GKSAkKERJKS8kKExJQk5BTUUpL3BuZ2xpYmNvbmYuaAorCS1AJChSTV9GKSAkKERJKS9wbmcuaAorCS1AJChSTV9GKSAkKERJKS9wbmdjb25mLmgKKwktQCQoUk1fRikgJChESSkvcG5nbGliY29uZi5oCisJY3AgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCAkKERJKS8kKExJQk5BTUUpCisJY2htb2QgNjQ0ICQoREkpLyQoTElCTkFNRSkvcG5nLmggXAorCSQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oIFwKKwkkKERJKS8kKExJQk5BTUUpL3BuZ2xpYmNvbmYuaAorCS1AJChSTV9GKSAtciAkKERJKS9saWJwbmcKKwkoY2QgJChESSk7ICQoTE5fU0YpICQoTElCTkFNRSkgbGlicG5nOyAkKExOX1NGKSAkKExJQk5BTUUpLyogLikKKwktQCQoUk1fRikgJChETCkvJChMSUJOQU1FKS5hCisJLUAkKFJNX0YpICQoREwpL2xpYnBuZy5hCisJY3AgJChMSUJOQU1FKS5hICQoREwpLyQoTElCTkFNRSkuYQorCWNobW9kIDY0NCAkKERMKS8kKExJQk5BTUUpLmEKKwkoY2QgJChETCk7ICQoTE5fU0YpICQoTElCTkFNRSkuYSBsaWJwbmcuYSkKKwkoY2QgJChESSk7ICQoTE5fU0YpIGxpYnBuZy8qIC47KQorCitjbGVhbjoKKwkkKFJNX0YpICoubyAkKExJQk5BTUUpLmEgcG5ndGVzdCBwbmdvdXQucG5nIHBuZ2xpYmNvbmYuaAorCitwbmcubzogICAgICBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nZXJyb3IubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ2dldC5vOiAgIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdtZW0ubzogICBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncHJlYWQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3JlYWQubzogIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdyaW8ubzogICBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncnRyYW4ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3J1dGlsLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdzZXQubzogICBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ndHJhbnMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3dpby5vOiAgIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3cml0ZS5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd3RyYW4ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3d1dGlsLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisKK3BuZ3Rlc3QubzogIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKZGlmZiAtLWdpdCBhL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmFtaWdhIGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuYW1pZ2EKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZhNGJkNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmFtaWdhCkBAIC0wLDAgKzEsNTggQEAKKyMgQ29tbW9kb3JlIEFtaWdhIE1ha2VmaWxlCisjIG1ha2VmaWxlIGZvciBsaWJwbmcgYW5kIFNBUyBDIFY2LjV4IGNvbXBpbGVyCisjIENvcHlyaWdodCAoQykgMTk5NS0yMDAwIFdvbGYgRmF1c3QKKyMKKyMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorIyBhbmQgbGljZW5zZSBpbiBwbmcuaAorIworIyBMb2NhdGlvbi9wYXRoIG9mIHpsaWIgaW5jbHVkZSBmaWxlcworWkxJQj0vemxpYgorI2NvbXBpbGVyCitDQz1zYworI2NvbXBpbGVyIGZsYWdzCisjIFdBUk5JTkc6IGEgYnVnIGluIFY2LjUxIGNhdXNlcyBiYWQgY29kZSB3aXRoIE9QVEdPCisjICAgICAgICAgIFNvIHVzZSBWNi41NSBvciBzZXQgTk9PUFRHTyEhISEhISEhIQorQ0ZMQUdTPSBOT1NUS0NISyBQQVJNUz1SRUcgT1BUSU1JWkUgT1BUR08gT1BUUEVFUCBPUFRJTkxPQ0FMIE9QVElOTFwKKwlPUFRMT09QIE9QVFJERVA9NCBPUFRERVA9NCBPUFRDT01QPTQgSU5DTFVERURJUj0kKFpMSUIpIFwKKwlERUZJTkU9UE5HX0lOVEVSTkFMCisjbGlua2VyIGZsYWdzCitMREZMQUdTPSBTRCBORCBCQVRDSAorI2xpbmsgbGlicworTERMSUJTPSBsaWJwbmcubGliIGxpYmd6LmxpYiBMSUI6c2NtLmxpYiBMSUI6c2MubGliIExpYjphbWlnYS5saWIKKyMgbGlua2VyCitMTj0gc2xpbmsKKyMgZmlsZSBkZWxldGlvbiBjb21tYW5kCitSTT0gZGVsZXRlIHF1aWV0CisjIGxpYnJhcnkgKC5saWIpIGZpbGUgY3JlYXRpb24gY29tbWFuZAorQVI9IG9tbAorIyBtYWtlIGRpcmVjdG9yeSBjb21tYW5kCitNS0RJUj0gbWFrZWRpcgorCisjIFByZS1idWlsdCBjb25maWd1cmF0aW9uCisjIFNlZSBzY3JpcHRzL3BuZ2xpYmNvbmYubWFrIGZvciBtb3JlIG9wdGlvbnMKK1BOR0xJQkNPTkZfSF9QUkVCVUlMVCA9IHNjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0CisKK09CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCisJcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCisJcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KKworYWxsOiBsaWJwbmcubGliIHBuZ3Rlc3QKKworbGlicG5nLmxpYjogJChPQkpTKQorLSQoUk0pIGxpYnBuZy5saWIKKyQoQVIpIGxpYnBuZy5saWIgciAkKE9CSlMpCisKKyQoT0JKUyk6IHBuZ3ByaXYuaCBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ2luZm8uaCBwbmdzdHJ1Y3QuaCBwbmdkZWJ1Zy5oCisKK3BuZ2xpYmNvbmYuaDogJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpCitDT1BZICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKSBUTyBwbmdsaWJjb25mLmgKKworcG5ndGVzdDogcG5ndGVzdC5vIGxpYnBuZy5saWIKKyQoTE4pIDxXSVRIIDwKKyQoTERGTEFHUykKK1RPIHBuZ3Rlc3QKK0ZST00gTElCOmMubyBwbmd0ZXN0Lm8KK0xJQiAkKExETElCUykKKzwKKwpkaWZmIC0tZ2l0IGEvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuYXRhcmkgYi9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5hdGFyaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWRiZDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuYXRhcmkKQEAgLTAsMCArMSw3MSBAQAorIyBtYWtlZmlsZSBmb3IgbGlicG5nCisjIENvcHlyaWdodCAoQykgMjAwMiwgMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyMgQ29weXJpZ2h0IChDKSAxOTk1IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgorIworIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisjIGFuZCBsaWNlbnNlIGluIHBuZy5oCisjCisjIE1vZGlmaWVkIGZvciBMQzU2L0FUQVJJIGFzc3VtZXMgbGliei5saWIgaXMgaW4gc2FtZSBkaXIgYW5kIHVzZXMgZGVmYXVsdAorIyBydWxlcyBmb3IgbGlicmFyeSBtYW5hZ2VtZW50CisjCitDUFBGTEFHUyA9IC1JLi5cemxpYgorQ0ZMQUdTID0gLU8KK0xCUiA9IHBuZy5saWIKK0xERkxBR1MgPSAtTC4gLUwuLlx6bGliIC1scG5nIC1seiAtbG0KKworIyB3aGVyZSBtYWtlIGluc3RhbGwgcHV0cyBsaWJwbmcuYSBhbmQgcG5nLmgKK3ByZWZpeD0vdXNyL2xvY2FsCitJTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCitMSUJQQVRIPSQocHJlZml4KS9saWIKKworIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAorIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgorIworIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZworIworIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCisjIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKKyMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgorREVTVERJUj0KKworIyBQcmUtYnVpbHQgY29uZmlndXJhdGlvbgorIyBTZWUgc2NyaXB0cy9wbmdsaWJjb25mLm1hayBmb3IgbW9yZSBvcHRpb25zCitQTkdMSUJDT05GX0hfUFJFQlVJTFQgPSBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdAorCitPQkpTID0gJChMQlIpKHBuZy5vKSAkKExCUikocG5nc2V0Lm8pICQoTEJSKShwbmdnZXQubykgJChMQlIpKHBuZ3J1dGlsLm8pXAorCSQoTEJSKShwbmd0cmFucy5vKSAkKExCUikocG5nd3V0aWwubylcCisJJChMQlIpKHBuZ3JlYWQubykgJChMQlIpKHBuZ2Vycm9yLm8pICQoTEJSKShwbmd3cml0ZS5vKVwKKwkkKExCUikocG5ncnRyYW4ubykgJChMQlIpKHBuZ3d0cmFuLm8pXAorCSQoTEJSKShwbmdtZW0ubykgJChMQlIpKHBuZ3Jpby5vKSAkKExCUikocG5nd2lvLm8pICQoTEJSKShwbmdwcmVhZC5vKQorCithbGw6ICQoTEJSKSBwbmd0ZXN0LnR0cAorCisuYy5vOgorCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkPAorCiskKExCUik6ICQoT0JKUykKKworJChPQkpTKTogcG5ncHJpdi5oIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5naW5mby5oIHBuZ3N0cnVjdC5oIHBuZ2RlYnVnLmgKKworcG5nbGliY29uZi5oOiAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkKKwljcCAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkgJEAKKworcG5ndGVzdC50dHA6IHBuZ3Rlc3QubyAkKExCUikKKwkkKENDKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyRAIHBuZ3Rlc3QubworCitpbnN0YWxsOiBsaWJwbmcuYQorCS1AbWtkaXIgJChERVNURElSKSQoSU5DUEFUSCkKKwktQG1rZGlyICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZworCS1AbWtkaXIgJChERVNURElSKSQoTElCUEFUSCkKKwktQHJtIC1mICQoREVTVERJUikkKElOQ1BBVEgpL3BuZy5oCisJLUBybSAtZiAkKERFU1RESVIpJChJTkNQQVRIKS9wbmdjb25mLmgKKwktQHJtIC1mICQoREVTVERJUikkKElOQ1BBVEgpL3BuZ2xpYmNvbmYuaAorCWNwIHBuZy5oICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZworCWNwIHBuZ2NvbmYuaCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcKKwljcCBwbmdsaWJjb25mLmggJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nCisJY2htb2QgNjQ0ICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZy9wbmcuaAorCWNobW9kIDY0NCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcvcG5nY29uZi5oCisJY2htb2QgNjQ0ICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZy9wbmdsaWJjb25mLmgKKwkoY2QgJChERVNURElSKSQoSU5DUEFUSCk7IGxuIC1mIC1zICQoTElCTkFNRSkgbGlicG5nOyBcCisJbG4gLWYgLXMgJChMSUJOQU1FKS8qIC4pCmRpZmYgLS1naXQgYS9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5iYzMyIGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuYmMzMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGJjNGNiCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuYmMzMgpAQCAtMCwwICsxLDE1OCBAQAorIyBNYWtlZmlsZSBmb3IgbGlicG5nCisjIDMyLWJpdCBCb3JsYW5kIEMrKyAoTm90ZTogQWxsIG1vZHVsZXMgYXJlIGNvbXBpbGVkIGluIEMgbW9kZSkKKyMgVG8gYnVpbGQgdGhlIGxpYnJhcnksIGRvOgorIyAgICAgICAibWFrZSAtZm1ha2VmaWxlLmJjMzIiCisjCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tIDMyLWJpdCBCb3JsYW5kIEMrKyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIyMgQWJzb2x1dGVseSBuZWNlc3NhcnkgZm9yIHRoaXMgbWFrZWZpbGUgdG8gd29yaworLkFVVE9ERVBFTkQKKworIyMgV2hlcmUgemxpYi5oLCB6Y29uZi5oIGFuZCB6bGliLmxpYiBhcmUKK1pMSUJfRElSPS4uXHpsaWIKKworIyMgQ29tcGlsZXIsIGxpbmtlciwgbGlicmFyaWFuIGFuZCBvdGhlciB0b29scworQ0M9YmNjMzIKK0xEPWJjYzMyCitMSUI9dGxpYgorQ1A9Y29weQorCisjIC0zID0gMzg2LCAtNCA9IDQ4NiwgLTUgPSBQZW50aXVtIGV0Yy4KKyFpZm5kZWYgVEFSR0VUX0NQVQorI1RBUkdFVF9DUFU9LTYKKyFlbmRpZgorCisjIFVzZSB0aGlzIGlmIHlvdSBkb24ndCB3YW50IEJvcmxhbmQncyBmYW5jeSBleGNlcHRpb24gaGFuZGxpbmcKKyMgKENhdXRpb246IGRvZXNuJ3Qgd29yayB3aXRoIENCdWlsZGVyWCkKKyNOT0VITElCPW5vZWgzMi5saWIKKworIWlmZGVmIERFQlVHCitDREVCVUc9LXYKK0xERUJVRz0tdgorIWVsc2UKK0NERUJVRz0KK0xERUJVRz0KKyFlbmRpZgorCisjIFNUQUNLT0ZMT1c9MQorIWlmZGVmIFNUQUNLT0ZMT1cKK0NERUJVRz0kKENERUJVRykgLU4KK0xERUJVRz0kKExERUJVRykgLU4KKyFlbmRpZgorCisjIC1PMiBvcHRpbWl6ZSBmb3Igc3BlZWQKKyMgLWQgIG1lcmdlIGR1cGxpY2F0ZSBzdHJpbmdzCisjIC1rLSB0dXJuIG9mZiBzdGFuZGFyZCBzdGFjayBmcmFtZQorIyAtdyAgZGlzcGxheSBhbGwgd2FybmluZ3MKK0NQUEZMQUdTPS1JJChaTElCX0RJUikKK0NGTEFHUz0tTzIgLWQgLWstIC13ICQoVEFSR0VUX0NQVSkgJChDREVCVUcpCisKKyMgLU0gIGdlbmVyYXRlIG1hcCBmaWxlCitMREZMQUdTPS1MJChaTElCX0RJUikgLU0gJChMREVCVUcpCisKKyMgUHJlLWJ1aWx0IGNvbmZpZ3VyYXRpb24KKyMgU2VlIHNjcmlwdHNccG5nbGliY29uZi5tYWsgZm9yIG1vcmUgb3B0aW9ucworIWlmbmRlZiBQTkdMSUJDT05GX0hfUFJFQlVJTFQKK1BOR0xJQkNPTkZfSF9QUkVCVUlMVCA9IHNjcmlwdHNccG5nbGliY29uZi5oLnByZWJ1aWx0CishZW5kaWYKKworIyMgVmFyaWFibGVzCitPQkpTID0gXAorCXBuZy5vYmogXAorCXBuZ2Vycm9yLm9iaiBcCisJcG5nZ2V0Lm9iaiBcCisJcG5nbWVtLm9iaiBcCisJcG5ncHJlYWQub2JqIFwKKwlwbmdyZWFkLm9iaiBcCisJcG5ncmlvLm9iaiBcCisJcG5ncnRyYW4ub2JqIFwKKwlwbmdydXRpbC5vYmogXAorCXBuZ3NldC5vYmogXAorCXBuZ3RyYW5zLm9iaiBcCisJcG5nd2lvLm9iaiBcCisJcG5nd3JpdGUub2JqIFwKKwlwbmd3dHJhbi5vYmogXAorCXBuZ3d1dGlsLm9iagorCitMSUJPQkpTID0gXAorCStwbmcub2JqIFwKKwkrcG5nZXJyb3Iub2JqIFwKKwkrcG5nZ2V0Lm9iaiBcCisJK3BuZ21lbS5vYmogXAorCStwbmdwcmVhZC5vYmogXAorCStwbmdyZWFkLm9iaiBcCisJK3BuZ3Jpby5vYmogXAorCStwbmdydHJhbi5vYmogXAorCStwbmdydXRpbC5vYmogXAorCStwbmdzZXQub2JqIFwKKwkrcG5ndHJhbnMub2JqIFwKKwkrcG5nd2lvLm9iaiBcCisJK3BuZ3dyaXRlLm9iaiBcCisJK3BuZ3d0cmFuLm9iaiBcCisJK3BuZ3d1dGlsLm9iagorCitMSUJOQU1FPWxpYnBuZy5saWIKKworIyMgSW1wbGljaXQgcnVsZXMKKyMgQnJhY2VzIGxldCBtYWtlICJiYXRjaCIgY2FsbHMgdG8gdGhlIGNvbXBpbGVyLAorIyAyIGNhbGxzIGluc3RlYWQgb2YgMTI7IHNwYWNlIGlzIGltcG9ydGFudC4KKy5jLm9iajoKKwkkKENDKSAkKENQUEZMQUdTKSAkKENGTEFHUykgLWMgeyQqLmMgfQorCisuYy5leGU6CisJJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoTERGTEFHUykgJCouYyBcCisJICAkKExJQk5BTUUpIHpsaWIubGliICQoTk9FSExJQikKKworLm9iai5leGU6CisJJChMRCkgJChMREZMQUdTKSAkKi5vYmogJChMSUJOQU1FKSB6bGliLmxpYiAkKE5PRUhMSUIpCisKKyMjIE1ham9yIHRhcmdldHMKK2FsbDogbGlicG5nIHBuZ3Rlc3QKKworbGlicG5nOiAkKExJQk5BTUUpCisKK3BuZ3Rlc3Q6IHBuZ3Rlc3QuZXhlCisKK3Rlc3Q6IHBuZ3Rlc3QuZXhlCisJcG5ndGVzdAorCisjIyBNaW5vciBUYXJnZXRzCisKK3BuZ2xpYmNvbmYuaDogJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpCisJJChDUCkgJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpICRACisKK3BuZy5vYmo6IHBuZy5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdlcnJvci5vYmo6IHBuZ2Vycm9yLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ2dldC5vYmo6IHBuZ2dldC5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdtZW0ub2JqOiBwbmdtZW0uYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncHJlYWQub2JqOiBwbmdwcmVhZC5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdyZWFkLm9iajogcG5ncmVhZC5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdyaW8ub2JqOiBwbmdyaW8uYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncnRyYW4ub2JqOiBwbmdydHJhbi5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdydXRpbC5vYmo6IHBuZ3J1dGlsLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3NldC5vYmo6IHBuZ3NldC5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd0cmFucy5vYmo6IHBuZ3RyYW5zLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3dpby5vYmo6IHBuZ3dpby5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3cml0ZS5vYmo6IHBuZ3dyaXRlLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3d0cmFuLm9iajogcG5nd3RyYW4uYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd3V0aWwub2JqOiBwbmd3dXRpbC5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd0ZXN0Lm9iajogcG5ndGVzdC5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKKworJChMSUJOQU1FKTogJChPQkpTKQorCS1kZWwgJChMSUJOQU1FKQorCSQoTElCKSAkKExJQk5BTUUpIEAmJnwKKyQoTElCT0JKUyksIGxpYnBuZworfAorCisjIENsZWFudXAKK2NsZWFuOgorCS1kZWwgcG5nbGliY29uZi5oCisJLWRlbCAqLm9iagorCS1kZWwgJChMSUJOQU1FKQorCS1kZWwgcG5ndGVzdC5leGUKKwktZGVsICoubHN0CisJLWRlbCAqLm1hcAorCS1kZWwgKi50ZHMKKwktZGVsIHBuZ291dC5wbmcKKworIyBFbmQgb2YgbWFrZWZpbGUgZm9yIGxpYnBuZwpkaWZmIC0tZ2l0IGEvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuYmVvcyBiL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmJlb3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEzNDZmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmJlb3MKQEAgLTAsMCArMSwyMjIgQEAKKyMgbWFrZWZpbGUgZm9yIGxpYnBuZyBvbiBCZU9TIHg4NiBFTEYgd2l0aCBnY2MKKyMgbW9kaWZpZWQgZnJvbSBtYWtlZmlsZS5saW51eCBieSBTYW5kZXIgU3Rva3MKKyMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA2LCAyMDA4LCAyMDEwLTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCisjIENvcHlyaWdodCAoQykgMTk5OSBHcmVnIFJvZWxvZnMKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyCisjCisjIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisjIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKworIyBMaWJyYXJ5IG5hbWU6CitMSUJOQU1FPWxpYnBuZzE2CitQTkdNQUogPSAxNgorCisjIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgorTElCU089JChMSUJOQU1FKS5zbworTElCU09NQUo9JChMSUJOQU1FKS5zby4kKFBOR01BSikKK0xJQlNPUkVMPSQoTElCU09NQUopLiQoUkVMRUFTRSkKK09MRFNPPWxpYnBuZy5zbworCisjIFV0aWxpdGllczoKK0NDPWdjYworQVJfUkM9YXIgcmMKK01LRElSX1A9bWtkaXIgLXAKK0xOX1NGPWxuIC1zZgorUkFOTElCPXJhbmxpYgorQ1A9Y3AKK1JNX0Y9L2Jpbi9ybSAtZgorCisjIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKK1pMSUJMSUI9L3Vzci9sb2NhbC9saWIKK1pMSUJJTkM9L3Vzci9sb2NhbC9pbmNsdWRlCisKK0FMSUdOPQorIyBGb3IgaTM4NjoKKyMgQUxJR049LW1hbGlnbi1sb29wcz0yIC1tYWxpZ24tZnVuY3Rpb25zPTIKKworV0FSTk1PUkU9LVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCAtV3NoYWRvdyBcCisJLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV3RyYWRpdGlvbmFsIC1XY2FzdC1hbGlnbiBcCisJLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyAjLVdjb252ZXJzaW9uCisKKyMgT24gQmVPUywgLU8xIGlzIGFjdHVhbGx5IGJldHRlciB0aGFuIC1PMy4gIFRoaXMgaXMgYSBrbm93biBidWcgYnV0IGl0J3MKKyMgc3RpbGwgaGVyZSBpbiBSNC41CitDUFBGTEFHUz0tSSQoWkxJQklOQykgIyAtRFBOR19ERUJVRz01CitDRkxBR1M9LVcgLVdhbGwgLU8xIC1mdW5yb2xsLWxvb3BzICQoQUxJR04pICMgJChXQVJOTU9SRSkgLWcKKyMgTERGTEFHUz0tTC4gLVdsLC1ycGF0aCwuIC1MJChaTElCTElCKSAtV2wsLXJwYXRoLCQoWkxJQkxJQikgLWxwbmcgLWx6CitMREZMQUdTPS1MLiAtV2wsLXNvbmFtZT0kKExJQlNPTUFKKSAtTCQoWkxJQkxJQikgLWx6CisKKyMgd2hlcmUgbWFrZSBpbnN0YWxsIHB1dHMgbGlicG5nLmEsIGxpYnBuZzE2LnNvKiwgYW5kIHBuZy5oCitwcmVmaXg9L3Vzci9sb2NhbAorZXhlY19wcmVmaXg9JChwcmVmaXgpCitJTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCitMSUJQQVRIPSQoZXhlY19wcmVmaXgpL2xpYgorTUFOUEFUSD0kKHByZWZpeCkvbWFuCitCSU5QQVRIPSQoZXhlY19wcmVmaXgpL2JpbgorCisjIG92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0CisjIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6CisjCisjICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCisjCisjIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KKyMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQorIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCitERVNURElSPQorCitEQj0kKERFU1RESVIpJChCSU5QQVRIKQorREk9JChERVNURElSKSQoSU5DUEFUSCkKK0RMPSQoREVTVERJUikkKExJQlBBVEgpCitETT0kKERFU1RESVIpJChNQU5QQVRIKQorCisjIFByZS1idWlsdCBjb25maWd1cmF0aW9uCisjIFNlZSBzY3JpcHRzL3BuZ2xpYmNvbmYubWFrIGZvciBtb3JlIG9wdGlvbnMKK1BOR0xJQkNPTkZfSF9QUkVCVUlMVCA9IHNjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0CisKK09CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCisJcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCisJcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KKworT0JKU0RMTCA9ICQoT0JKUykKKworLlNVRkZJWEVTOiAgICAgIC5jIC5vCisKKy5jLm86CisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1vICRAICQ8CisKK2FsbDogbGlicG5nLmEgJChMSUJTTykgcG5ndGVzdCBsaWJwbmcucGMgbGlicG5nLWNvbmZpZworCitwbmdsaWJjb25mLmg6ICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKQorCSQoQ1ApICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKSAkQAorCitsaWJwbmcuYTogJChPQkpTKQorCSQoQVJfUkMpICRAICQoT0JKUykKKwkkKFJBTkxJQikgJEAKKworbGlicG5nLnBjOgorCWNhdCBzY3JpcHRzL2xpYnBuZy5wYy5pbiB8IHNlZCAtZSBzIUBwcmVmaXhAISQocHJlZml4KSEgXAorCS1lIHMhQGV4ZWNfcHJlZml4QCEkKGV4ZWNfcHJlZml4KSEgXAorCS1lIHMhQGxpYmRpckAhJChMSUJQQVRIKSEgXAorCS1lIHMhQGluY2x1ZGVkaXJAISQoSU5DUEFUSCkhIFwKKwktZSBzIS1scG5nMTYhLWxwbmcxNlwgLWx6XCAtbG0hID4gbGlicG5nLnBjCisKK2xpYnBuZy1jb25maWc6CisJKCBjYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWhlYWQuaW47IFwKKwllY2hvIHByZWZpeD1cIiQocHJlZml4KVwiOyBcCisJZWNobyBJX29wdHM9XCItSSQoSU5DUEFUSCkvJChMSUJOQU1FKVwiOyBcCisJZWNobyBsaWJzPVwiLWxwbmcxNiAtbHogXCI7IFwKKwljYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gKSA+IGxpYnBuZy1jb25maWcKKwljaG1vZCAreCBsaWJwbmctY29uZmlnCisKKyQoTElCU08pOiAkKExJQlNPTUFKKQorCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pCisJY3AgJChMSUJTTykqIC9ib290L2hvbWUvY29uZmlnL2xpYgorCiskKExJQlNPTUFKKTogJChPQkpTRExMKQorCSQoQ0MpIC1ub3N0YXJ0IC1XbCwtc29uYW1lLCQoTElCU09NQUopIC1vIFwKKwkkKExJQlNPTUFKKSAkKE9CSlNETEwpICQoTERGTEFHUykKKworcG5ndGVzdDogcG5ndGVzdC5vICQoTElCU08pCisJJChDQykgLUwkKFpMSUJMSUIpIC1MLiAtbHogLWxwbmcxNiAtbyBwbmd0ZXN0IHBuZ3Rlc3QubworCit0ZXN0OiBwbmd0ZXN0CisJLi9wbmd0ZXN0CisKK2luc3RhbGwtaGVhZGVyczogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaAorCS1AaWYgWyAhIC1kICQoREkpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKTsgZmkKKwktQGlmIFsgISAtZCAkKERJKS8kKExJQk5BTUUpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKS8kKExJQk5BTUUpOyBmaQorCWNwIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggJChESSkvJChMSUJOQU1FKQorCWNobW9kIDY0NCAkKERJKS8kKExJQk5BTUUpL3BuZy5oICQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oICQoREkpLyQoTElCTkFNRSkvcG5nbGliY29uZi5oCisJLUAkKFJNX0YpICQoREkpL3BuZy5oICQoREkpL3BuZ2NvbmYuaCAkKERJKS9wbmdsaWJjb25mLmgKKwktQCQoUk1fRikgJChESSkvbGlicG5nCisJKGNkICQoREkpOyAkKExOX1NGKSAkKExJQk5BTUUpIGxpYnBuZzsgJChMTl9TRikgJChMSUJOQU1FKS8qIC4pCisKK2luc3RhbGwtc3RhdGljOiBpbnN0YWxsLWhlYWRlcnMgbGlicG5nLmEKKwktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCisJY3AgbGlicG5nLmEgJChETCkvJChMSUJOQU1FKS5hCisJY2htb2QgNjQ0ICQoREwpLyQoTElCTkFNRSkuYQorCS1AJChSTV9GKSAkKERMKS9saWJwbmcuYQorCShjZCAkKERMKTsgJChMTl9TRikgJChMSUJOQU1FKS5hIGxpYnBuZy5hKQorCitpbnN0YWxsLXNoYXJlZDogaW5zdGFsbC1oZWFkZXJzICQoTElCU09NQUopIGxpYnBuZy5wYworCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKKwktQCQoUk1fRikgJChETCkvJChMSUJTTykKKwktQCQoUk1fRikgJChETCkvJChMSUJTT1JFTCkKKwktQCQoUk1fRikgJChETCkvJChPTERTTykKKwljcCAkKExJQlNPTUFKKSAkKERMKS8kKExJQlNPUkVMKQorCWNobW9kIDc1NSAkKERMKS8kKExJQlNPUkVMKQorCShjZCAkKERMKTsgXAorCSQoTE5fU0YpICQoTElCU09SRUwpICQoTElCU08pOyBcCisJJChMTl9TRikgJChMSUJTTykgJChPTERTTykpCisJLUBpZiBbICEgLWQgJChETCkvcGtnY29uZmlnIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKS9wa2djb25maWc7IGZpCisJLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCisJLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy9saWJwbmcucGMKKwljcCBsaWJwbmcucGMgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKKwljaG1vZCA2NDQgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKKwkoY2QgJChETCkvcGtnY29uZmlnOyAkKExOX1NGKSAkKExJQk5BTUUpLnBjIGxpYnBuZy5wYykKKworaW5zdGFsbC1tYW46IGxpYnBuZy4zIGxpYnBuZ3BmLjMgcG5nLjUKKwktQGlmIFsgISAtZCAkKERNKSBdOyB0aGVuICQoTUtESVJfUCkgJChETSk7IGZpCisJLUBpZiBbICEgLWQgJChETSkvbWFuMyBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuMzsgZmkKKwktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmcuMworCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZ3BmLjMKKwljcCBsaWJwbmcuMyAkKERNKS9tYW4zCisJY3AgbGlicG5ncGYuMyAkKERNKS9tYW4zCisJLUBpZiBbICEgLWQgJChETSkvbWFuNSBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuNTsgZmkKKwktQCQoUk1fRikgJChETSkvbWFuNS9wbmcuNQorCWNwIHBuZy41ICQoRE0pL21hbjUKKworaW5zdGFsbC1jb25maWc6IGxpYnBuZy1jb25maWcKKwktQGlmIFsgISAtZCAkKERCKSBdOyB0aGVuICQoTUtESVJfUCkgJChEQik7IGZpCisJLUAkKFJNX0YpICQoREIpL2xpYnBuZy1jb25maWcKKwktQCQoUk1fRikgJChEQikvJChMSUJOQU1FKS1jb25maWcKKwljcCBsaWJwbmctY29uZmlnICQoREIpLyQoTElCTkFNRSktY29uZmlnCisJY2htb2QgNzU1ICQoREIpLyQoTElCTkFNRSktY29uZmlnCisJKGNkICQoREIpOyAkKExOX1NGKSAkKExJQk5BTUUpLWNvbmZpZyBsaWJwbmctY29uZmlnKQorCitpbnN0YWxsOiBpbnN0YWxsLXN0YXRpYyBpbnN0YWxsLXNoYXJlZCBpbnN0YWxsLW1hbiBpbnN0YWxsLWNvbmZpZworCisjIElmIHlvdSBpbnN0YWxsZWQgaW4gJChERVNURElSKSwgdGVzdC1pbnN0YWxsZWQgd29uJ3Qgd29yayB1bnRpbCB5b3UKKyMgbW92ZSB0aGUgbGlicmFyeSB0byBpdHMgZmluYWwgbG9jYXRpb24uICBVc2UgdGVzdC1kZCB0byB0ZXN0IGl0CisjIGJlZm9yZSB0aGVuLgorCit0ZXN0LWRkOgorCWVjaG8KKwllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkgaW4gJChETCkuCisJJChDQykgLUkkKERJKSAkKENQUEZMQUdTKSAkKENGTEFHUykgXAorCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAorCSAgIC1MJChETCkgLUwkKFpMSUJMSUIpIC1XbCwtcnBhdGggJChaTElCTElCKTokKERMKSBcCisJICAgLW8gcG5ndGVzdGQgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAorCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKKwordGVzdC1pbnN0YWxsZWQ6CisJJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpIFwKKwkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKKwkgICAtTCQoWkxJQkxJQikgLVdsLC1ycGF0aCwkKFpMSUJMSUIpIFwKKwkgICAtbyBwbmd0ZXN0aSBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgCisJLi9wbmd0ZXN0aSBwbmd0ZXN0LnBuZworCitjbGVhbjoKKwkkKFJNX0YpICoubyBsaWJwbmcuYSBwbmd0ZXN0IHBuZ291dC5wbmcgbGlicG5nLWNvbmZpZyBcCisJJChMSUJTTykgJChMSUJTT01BSikqIHBuZ3Rlc3RpIFwKKwlwbmdsaWJjb25mLmggbGlicG5nLnBjCisKKyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KKworcG5nLm8gcG5nLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nZXJyb3IubyBwbmdlcnJvci5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3Jpby5vIHBuZ3Jpby5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3dpby5vIHBuZ3dpby5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ21lbS5vIHBuZ21lbS5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3NldC5vIHBuZ3NldC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ2dldC5vIHBuZ2dldC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3JlYWQubyBwbmdyZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncnRyYW4ubyBwbmdydHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3J1dGlsLm8gcG5ncnV0aWwucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd0cmFucy5vIHBuZ3RyYW5zLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd3JpdGUubyBwbmd3cml0ZS5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3d0cmFuLm8gcG5nd3RyYW4ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3dXRpbC5vIHBuZ3d1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncHJlYWQubyBwbmdwcmVhZC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKworcG5ndGVzdC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCmRpZmYgLS1naXQgYS9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5ib3IgYi9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5ib3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY5Mzc3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmJvcgpAQCAtMCwwICsxLDE3MCBAQAorIyBNYWtlZmlsZSBmb3IgbGlicG5nCisjIDE2LWJpdCBCb3JsYW5kIEMrKyAoTm90ZTogQWxsIG1vZHVsZXMgYXJlIGNvbXBpbGVkIGluIEMgbW9kZSkKKyMgVG8gYnVpbGQgdGhlIGxpYnJhcnksIGRvOgorIyAgICAgICAibWFrZSAtZm1ha2VmaWxlLmJvciAtRE1PREVMPWMiCisjIG9yOiAgICJtYWtlIC1mbWFrZWZpbGUuYm9yIC1ETU9ERUw9bCIKKyMKKyMgLS0tLS0tLS0tLS0tIEJvcmxhbmQgQysrIC0tLS0tLS0tLS0tLQorCisjIyMgQWJzb2x1dGVseSBuZWNlc3NhcnkgZm9yIHRoaXMgbWFrZWZpbGUgdG8gd29yaworLkFVVE9ERVBFTkQKKworIyMgV2hlcmUgemxpYi5oLCB6Y29uZi5oIGFuZCB6bGliX01PREVMLmxpYiBhcmUKK1pMSUJfRElSPS4uXHpsaWIKKworIyMgQ29tcGlsZXIsIGxpbmtlciwgbGlicmFyaWFuIGFuZCBvdGhlciB0b29scworQ0M9YmNjCitMRD1iY2MKK0xJQj10bGliCitDUD1jb3B5CisKKyFpZm5kZWYgTU9ERUwKK01PREVMPWwKKyFlbmRpZgorCitNT0RFTF9BUkc9LW0kKE1PREVMKQorCisjVEFSR0VUX0NQVT0zCisjIDIgPSAyODYsIDMgPSAzODYsIGV0Yy4KKyFpZm5kZWYgVEFSR0VUX0NQVQorVEFSR0VUX0NQVT0yCishZW5kaWYKKworIyBVc2UgdGhpcyBpZiB5b3UgZG9uJ3Qgd2FudCBCb3JsYW5kJ3MgZmFuY3kgZXhjZXB0aW9uIGhhbmRsaW5nCisjIChmb3IgQm9ybGFuZCBDKysgNC4wIG9yIGxhdGVyKQorI05PRUhMSUI9bm9laCQoTU9ERUwpLmxpYgorCishaWZkZWYgREVCVUcKK0NERUJVRz0tdgorTERFQlVHPS12CishZWxzZQorQ0RFQlVHPQorTERFQlVHPQorIWVuZGlmCisKKyMgU1RBQ0tPRkxPVz0xCishaWZkZWYgU1RBQ0tPRkxPVworQ0RFQlVHPSQoQ0RFQlVHKSAtTgorTERFQlVHPSQoTERFQlVHKSAtTgorIWVuZGlmCisKKyMgLVgtIHR1cm4gb24gZGVwZW5kZW5jeSBnZW5lcmF0aW9uIGluIHRoZSBvYmplY3QgZmlsZQorIyAtdyAgc2V0IGFsbCB3YXJuaW5ncyBvbgorIyAtTzIgb3B0aW1pemUgZm9yIHNwZWVkCisjIC1aICBnbG9iYWwgb3B0aW1pemF0aW9uCitDUFBGTEFHUz0tSSQoWkxJQl9ESVIpCitDRkxBR1M9LU8yIC1aIC1YLSAtdyAtJChUQVJHRVRfQ1BVKSAkKE1PREVMX0FSRykgJChDREVCVUcpCisKKyMgLU0gIGdlbmVyYXRlIG1hcCBmaWxlCitMREZMQUdTPS1NIC1MJChaTElCX0RJUikgJChNT0RFTF9BUkcpICQoTERFQlVHKQorCisjIFByZS1idWlsdCBjb25maWd1cmF0aW9uCisjIFNlZSBzY3JpcHRzXHBuZ2xpYmNvbmYubWFrIGZvciBtb3JlIG9wdGlvbnMKKyFpZm5kZWYgUE5HTElCQ09ORl9IX1BSRUJVSUxUCitQTkdMSUJDT05GX0hfUFJFQlVJTFQgPSBzY3JpcHRzXHBuZ2xpYmNvbmYuaC5wcmVidWlsdAorIWVuZGlmCisKKyMjIFZhcmlhYmxlcworCitPQkpTID0gXAorCXBuZy5vYmogXAorCXBuZ2Vycm9yLm9iaiBcCisJcG5nZ2V0Lm9iaiBcCisJcG5nbWVtLm9iaiBcCisJcG5ncHJlYWQub2JqIFwKKwlwbmdyZWFkLm9iaiBcCisJcG5ncmlvLm9iaiBcCisJcG5ncnRyYW4ub2JqIFwKKwlwbmdydXRpbC5vYmogXAorCXBuZ3NldC5vYmogXAorCXBuZ3RyYW5zLm9iaiBcCisJcG5nd2lvLm9iaiBcCisJcG5nd3JpdGUub2JqIFwKKwlwbmd3dHJhbi5vYmogXAorCXBuZ3d1dGlsLm9iagorCitMSUJPQkpTID0gXAorCStwbmcub2JqIFwKKwkrcG5nZXJyb3Iub2JqIFwKKwkrcG5nZ2V0Lm9iaiBcCisJK3BuZ21lbS5vYmogXAorCStwbmdwcmVhZC5vYmogXAorCStwbmdyZWFkLm9iaiBcCisJK3BuZ3Jpby5vYmogXAorCStwbmdydHJhbi5vYmogXAorCStwbmdydXRpbC5vYmogXAorCStwbmdzZXQub2JqIFwKKwkrcG5ndHJhbnMub2JqIFwKKwkrcG5nd2lvLm9iaiBcCisJK3BuZ3dyaXRlLm9iaiBcCisJK3BuZ3d0cmFuLm9iaiBcCisJK3BuZ3d1dGlsLm9iagorCitMSUJOQU1FPWxpYnBuZyQoTU9ERUwpLmxpYgorCisjIyBJbXBsaWNpdCBydWxlcworCisjIEJyYWNlcyBsZXQgbWFrZSAiYmF0Y2giIGNhbGxzIHRvIHRoZSBjb21waWxlciwKKyMgMiBjYWxscyBpbnN0ZWFkIG9mIDEyOyBzcGFjZSBpcyBpbXBvcnRhbnQuCisuYy5vYmo6CisJJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpIC1jIHskKi5jIH0KKworLmMuZXhlOgorCSQoQ0MpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKExERkxBR1MpICQqLmMgXAorCSAgJChMSUJOQU1FKSB6bGliXyQoTU9ERUwpLmxpYiAkKE5PRUhMSUIpCisKKyMjIE1ham9yIHRhcmdldHMKKworYWxsOiBsaWJwbmcgcG5ndGVzdAorCisjIHRyeSAhaW5jbHVkZSBzY3JpcHRzXHBuZ2xpYmNvbmYubWFrIGZvciBtb3JlIG9wdGlvbnMKK3BuZ2xpYmNvbmYuaDogJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpCisJJChDUCkgJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpICRACisKK2xpYnBuZzogJChMSUJOQU1FKQorCitwbmd0ZXN0OiBwbmd0ZXN0JChNT0RFTCkuZXhlCisKK3Rlc3Q6IHBuZ3Rlc3QkKE1PREVMKS5leGUKKwlwbmd0ZXN0JChNT0RFTCkKKworIyMgTWlub3IgVGFyZ2V0cworCitwbmcub2JqOiBwbmcuYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nZXJyb3Iub2JqOiBwbmdlcnJvci5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdnZXQub2JqOiBwbmdnZXQuYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nbWVtLm9iajogcG5nbWVtLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3ByZWFkLm9iajogcG5ncHJlYWQuYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncmVhZC5vYmo6IHBuZ3JlYWQuYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncmlvLm9iajogcG5ncmlvLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3J0cmFuLm9iajogcG5ncnRyYW4uYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncnV0aWwub2JqOiBwbmdydXRpbC5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdzZXQub2JqOiBwbmdzZXQuYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ndHJhbnMub2JqOiBwbmd0cmFucy5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3aW8ub2JqOiBwbmd3aW8uYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd3JpdGUub2JqOiBwbmd3cml0ZS5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3dHJhbi5vYmo6IHBuZ3d0cmFuLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3d1dGlsLm9iajogcG5nd3V0aWwuYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorCiskKExJQk5BTUUpOiAkKE9CSlMpCisJLWRlbCAkKExJQk5BTUUpCisJJChMSUIpICQoTElCTkFNRSkgQCYmfAorJChMSUJPQkpTKSwgbGlicG5nJChNT0RFTCkKK3wKKworcG5ndGVzdCQoTU9ERUwpLm9iajogcG5ndGVzdC5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKKwkkKENDKSAkKENGTEFHUykgLW9wbmd0ZXN0JChNT0RFTCkgLWMgcG5ndGVzdC5jCisKK3BuZ3Rlc3QkKE1PREVMKS5leGU6IHBuZ3Rlc3QkKE1PREVMKS5vYmoKKwkkKExEKSAkKExERkxBR1MpIHBuZ3Rlc3QkKE1PREVMKS5vYmogJChMSUJOQU1FKSB6bGliXyQoTU9ERUwpLmxpYiAkKE5PRUhMSUIpCisKKyMgQ2xlYW4gdXAgYW55dGhpbmcgZWxzZSB5b3Ugd2FudAorY2xlYW46CisJLWRlbCBwbmdsaWJjb25mLmgKKwktZGVsICoub2JqCisJLWRlbCAqLmV4ZQorCS1kZWwgKi5saWIKKwktZGVsICoubHN0CisJLWRlbCAqLm1hcAorCisjIEVuZCBvZiBtYWtlZmlsZSBmb3IgbGlicG5nCmRpZmYgLS1naXQgYS9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5jZWdjYyBiL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmNlZ2NjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZWVhNzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5jZWdjYwpAQCAtMCwwICsxLDExNiBAQAorIyBNYWtlZmlsZSBmb3IgY3JlYXRpbmcgV2luZG93cyBDRSByZWxlYXNlIGFyY2hpdmVzLCB3aXRoIHRoZQorIyBtaW5ndzMyY2UgY29tcGlsZXIuCisKKyMgTGFzdCB1cGRhdGVkOiAyMi1KdWwtMjAwOAorCisjIENvcHlyaWdodCAoQykgMjAwOCBWaW5jZW50IFRvcnJpCisKKyMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorIyBhbmQgbGljZW5zZSBpbiBwbmcuaAorCisjIFRvIGdldCBzb21lIGhlbHAsIHR5cGUKKyMKKyMgbWFrZSBoZWxwCisjCisjIFRvIGNyZWF0ZSB0aGUgYXJjaGl2ZXMKKyMKKyMgbWFrZQorIworIyBUbyByZW1vdmUgZXZlcnl0aGluZywgdHlwZToKKyMKKyMgbWFrZSBjbGVhbgorCitWRVJNQUogPSAxCitWRVJNSU4gPSA2CitWRVJNSUMgPSAyMAorVkVSID0gJChWRVJNQUopLiQoVkVSTUlOKS4kKFZFUk1JQykKK05BTUUgPSBsaWJwbmcKK1BBQ0tBR0UgPSAkKE5BTUUpLSQoVkVSKQorCitCSU4gPSBsaWJwbmcxNi0wLmRsbAorTElCID0gbGlicG5nMTYuYSBsaWJwbmcxNi5kbGwuYSBsaWJwbmcuYSBsaWJwbmcuZGxsLmEKK0lOQ0xVREUgPSBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorUEMgPSBsaWJwbmcxNi5wYyBsaWJwbmcucGMKKworTUFOSUZFU1RWRVJCSU4gPSAiTGlicG5nLSQoVkVSKTogQmluYXJ5IGZpbGVzIgorTUFOSUZFU1RWRVJERVYgPSAiTGlicG5nLSQoVkVSKTogRGV2ZWxvcGVyIGZpbGVzIgorTUFOSUZFU1RWRVJERVNDID0gIkxpYnBuZzogdGhlIG9mZmljaWFsIFBORyByZWZlcmVuY2UgbGlicmFyeSIKKworYWxsOiAkKE5BTUUpCisKKyQoTkFNRSk6IHJlbW92ZS1vbGQgY29weS1zcmMgY29tcGlsYXRpb24gY29weSBtYW5pZmVzdCBhcmNoaXZlCisJQGVjaG8gIiAqIFJlbW92YWwgb2YgdGhlIGRpcmVjdG9yaWVzIgorCUBybSAtcmYgJChQQUNLQUdFKS8gJChQQUNLQUdFKS1iaW4vICQoUEFDS0FHRSktZGV2LworCityZW1vdmUtb2xkOgorCUBlY2hvICIgKiBSZW1vdmFsIG9mIHRoZSBvbGQgZmlsZXMiCisJQHJtIC1yZiAkKFBBQ0tBR0UpLWJpbioKKwlAcm0gLXJmICQoUEFDS0FHRSktZGV2KgorCitjb3B5LXNyYzoKKwlAZWNobyAiICogQ29weSBvZiBzb3VyY2UgZmlsZXMiCisJQGNwIC1SIC4uL3NyYy8kKFBBQ0tBR0UpIC4KKwlAZWNobyAiICogQ3JlYXRpb24gb2YgZGlyZWN0b3JpZXMgYW5kIGZpbGVzIgorCUBta2RpciAtcCAkKFBBQ0tBR0UpLWJpbi9iaW4KKwlAbWtkaXIgLXAgJChQQUNLQUdFKS1iaW4vbWFuaWZlc3QKKwlAbWtkaXIgLXAgJChQQUNLQUdFKS1kZXYvbGliL3BrZ2NvbmZpZworCUBta2RpciAtcCAkKFBBQ0tBR0UpLWRldi9pbmNsdWRlLyQoTkFNRSkkKFZFUk1BSikkKFZFUk1JTikKKwlAbWtkaXIgLXAgJChQQUNLQUdFKS1kZXYvbWFuaWZlc3QKKwlAdG91Y2ggJChQQUNLQUdFKS1iaW4vbWFuaWZlc3QvJChQQUNLQUdFKS1iaW4ubWZ0CisJQHRvdWNoICQoUEFDS0FHRSktYmluL21hbmlmZXN0LyQoUEFDS0FHRSktYmluLnZlcgorCUB0b3VjaCAkKFBBQ0tBR0UpLWRldi9tYW5pZmVzdC8kKFBBQ0tBR0UpLWRldi5tZnQKKwlAdG91Y2ggJChQQUNLQUdFKS1kZXYvbWFuaWZlc3QvJChQQUNLQUdFKS1kZXYudmVyCisKK2NvbXBpbGF0aW9uOgorCUBlY2hvICIgKiBDb21waWxhdGlvbiBvZiAkKFBBQ0tBR0UpIgorCWNkICQoUEFDS0FHRSkgJiYgQ1BQRkxBR1M9IiQoQ1BQRkxBR1MpIC1EUE5HX0NPTlNPTEVfSU9fU1VQUE9SVEVEIC1EX1dJTjMyX1dDRT0weDA0MjAiIFwKKwkJQ0ZMQUdTPSIkKENGTEFHUykgLW1tcy1iaXRmaWVsZHMgLU8zIC1waXBlIC1mb21pdC1mcmFtZS1wb2ludGVyIiBcCisJCUxERkxBR1M9IiQoTERGTEFHUykgLVdsLC0tZW5hYmxlLWF1dG8taW1wb3J0IC1XbCwtcyIgXAorCQkuL2NvbmZpZ3VyZSAtLXByZWZpeD0vb3B0L3dpbmNlIC0taG9zdD1hcm0tbWluZ3czMmNlICYmIG1ha2UKKworY29weToKKwlAZWNobyAiICogQ29weSBvZiBiaW5hcnkgYW5kIGRldmVsb3BtZW50IGZpbGVzIgorCUBmb3IgaSBpbiAkKEJJTik7IGRvIFwKKwkgIGNwICQoUEFDS0FHRSkvLmxpYnMvJCRpICQoUEFDS0FHRSktYmluL2JpbjsgXAorCWRvbmUKKwlAZm9yIGkgaW4gJChMSUIpOyBkbyBcCisJICBjcCAkKFBBQ0tBR0UpLy5saWJzLyQkaSAkKFBBQ0tBR0UpLWRldi9saWI7IFwKKwlkb25lCisJQGZvciBpIGluICQoSU5DTFVERSk7IGRvIFwKKwkgIGNwICQoUEFDS0FHRSkvJCRpICQoUEFDS0FHRSktZGV2L2luY2x1ZGUvJChOQU1FKSQoVkVSTUFKKSQoVkVSTUlOKTsgXAorCWRvbmUKKwlAZm9yIGkgaW4gJChQQyk7IGRvIFwKKwkgIGNwICQoUEFDS0FHRSkvJCRpICQoUEFDS0FHRSktZGV2L2xpYi9wa2djb25maWc7IFwKKwlkb25lCisKK21hbmlmZXN0OgorCUBlY2hvICIgKiBDcmVhdGlvbiBvZiB0aGUgbWFuaWZlc3QiCisJQGNkICQoUEFDS0FHRSktYmluICYmIGZpbmQgKiA+PiBtYW5pZmVzdC8kKFBBQ0tBR0UpLWJpbi5tZnQKKwlAY2QgJChQQUNLQUdFKS1iaW4gJiYgXAorCSAgZWNobyAkKE1BTklGRVNUVkVSQklOKSA+PiBtYW5pZmVzdC8kKFBBQ0tBR0UpLWJpbi52ZXIgJiYgXAorCSAgZWNobyAkKE1BTklGRVNUVkVSREVTQykgPj4gbWFuaWZlc3QvJChQQUNLQUdFKS1iaW4udmVyCisJQGNkICQoUEFDS0FHRSktZGV2ICYmIGZpbmQgKiA+PiBtYW5pZmVzdC8kKFBBQ0tBR0UpLWRldi5tZnQKKwlAY2QgJChQQUNLQUdFKS1kZXYgJiYgXAorCSAgZWNobyAkKE1BTklGRVNUVkVSREVWKSA+PiBtYW5pZmVzdC8kKFBBQ0tBR0UpLWRldi52ZXIgJiYgXAorCSAgZWNobyAkKE1BTklGRVNUVkVSREVTQykgPj4gbWFuaWZlc3QvJChQQUNLQUdFKS1kZXYudmVyCisKK2FyY2hpdmU6CisJQGVjaG8gIiAqIENyZWF0aW9uIG9mIHRoZSBhcmNoaXZlcyIKKwlAdGFyIGNmICQoUEFDS0FHRSktYmluLnRhciAkKFBBQ0tBR0UpLWJpbgorCUBiemlwMiAtOSAkKFBBQ0tBR0UpLWJpbi50YXIKKwlAdGFyIGNmICQoUEFDS0FHRSktZGV2LnRhciAkKFBBQ0tBR0UpLWRldgorCUBiemlwMiAtOSAkKFBBQ0tBR0UpLWRldi50YXIKKworY2xlYW46CisJQGVjaG8gIiAqIENsZWFuaW5nIgorCUBybSAtcmYgJChQQUNLQUdFKSoKKworaGVscDoKKwlAZWNobworCUBlY2hvICJUbyBjcmVhdGUgdGhlIGFyY2hpdmVzLCB0eXBlOiIKKwlAZWNobyAiIG1ha2UiCisJQGVjaG8KKwlAZWNobyAiVG8gcmVtb3ZlIGV2ZXJ5dGhpbmcsIHR5cGU6IgorCUBlY2hvICIgbWFrZSBjbGVhbiIKKwlAZWNobwpkaWZmIC0tZ2l0IGEvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuZGFyd2luIGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuZGFyd2luCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlM2Y5MmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5kYXJ3aW4KQEAgLTAsMCArMSwyMjUgQEAKKyMgbWFrZWZpbGUgZm9yIGxpYnBuZyBvbiBEYXJ3aW4gLyBNYWMgT1MgWAorIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDQsIDIwMDYsIDIwMDgsIDIwMTAtMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyMgQ29weXJpZ2h0IChDKSAyMDAxIENocmlzdG9waCBQZmlzdGVyZXIKKyMgZGVyaXZlZCBmcm9tIG1ha2VmaWxlLmxpbnV4OgorIyAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEdyZWcgUm9lbG9mcworIyAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyCisjCisjIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisjIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKworIyB3aGVyZSAibWFrZSBpbnN0YWxsIiBwdXRzIGxpYnBuZy5hLCBsaWJwbmcxNi5keWxpYiwgcG5nLmgsIHBuZ2NvbmYuaCwKKyMgYW5kIHBuZ2xpYmNvbmYuaAorcHJlZml4PS91c3IvbG9jYWwKK2V4ZWNfcHJlZml4PSQocHJlZml4KQorCisjIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKK1pMSUJMSUI9L3Vzci9saWIKK1pMSUJJTkM9L3Vzci9pbmNsdWRlCisKKyMgTGlicmFyeSBuYW1lOgorTElCTkFNRSA9IGxpYnBuZzE2CitQTkdNQUogPSAxNgorCisjIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgorTElCU089JChMSUJOQU1FKS5keWxpYgorTElCU09NQUo9JChMSUJOQU1FKS4kKFBOR01BSikuZHlsaWIKK0xJQlNPUkVMPSQoTElCTkFNRSkuJChQTkdNQUopLiQoUkVMRUFTRSkuZHlsaWIKK09MRFNPPWxpYnBuZy5keWxpYgorCisjIFV0aWxpdGllczoKK0NDPWNjCitBUl9SQz1hciByYworTUtESVJfUD1ta2RpciAtcAorTE5fU0Y9bG4gLXNmCitSQU5MSUI9cmFubGliCitDUD1jcAorUk1fRj0vYmluL3JtIC1mCisKK0NQUEZMQUdTPS1JJChaTElCSU5DKQorIyBDRkxBR1M9LVcgLVdhbGwgLU8zIC1mdW5yb2xsLWxvb3BzCitDRkxBR1M9LVcgLVdhbGwgLU8gLWZ1bnJvbGwtbG9vcHMKK0xERkxBR1M9LUwuIC1MJChaTElCTElCKSAtbHBuZzE2IC1segorCitJTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCitMSUJQQVRIPSQoZXhlY19wcmVmaXgpL2xpYgorTUFOUEFUSD0kKHByZWZpeCkvbWFuCitCSU5QQVRIPSQoZXhlY19wcmVmaXgpL2JpbgorCisjIG92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0CisjIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6CisjCisjICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCisjCisjIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KKyMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQorIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCitERVNURElSPQorCitEQj0kKERFU1RESVIpJChCSU5QQVRIKQorREk9JChERVNURElSKSQoSU5DUEFUSCkKK0RMPSQoREVTVERJUikkKExJQlBBVEgpCitETT0kKERFU1RESVIpJChNQU5QQVRIKQorCisjIFByZS1idWlsdCBjb25maWd1cmF0aW9uCisjIFNlZSBzY3JpcHRzL3BuZ2xpYmNvbmYubWFrIGZvciBtb3JlIG9wdGlvbnMKK1BOR0xJQkNPTkZfSF9QUkVCVUlMVCA9IHNjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0CisKK09CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCisJcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCisJcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KKworT0JKU0RMTCA9ICQoT0JKUzoubz0ucGljLm8pCisKKy5TVUZGSVhFUzogICAgICAuYyAubyAucGljLm8KKworLmMubzoKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgLW8gJEAgJDwKKworLmMucGljLm86CisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1mbm8tY29tbW9uIC1vICRAICQqLmMKKworYWxsOiBsaWJwbmcuYSAkKExJQlNPKSBwbmd0ZXN0IGxpYnBuZy5wYyBsaWJwbmctY29uZmlnCisKK3BuZ2xpYmNvbmYuaDogJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpCisJJChDUCkgJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpICRACisKK2xpYnBuZy5hOiAkKE9CSlMpCisJJChBUl9SQykgJEAgJChPQkpTKQorCSQoUkFOTElCKSAkQAorCitsaWJwbmcucGM6CisJY2F0IHNjcmlwdHMvbGlicG5nLnBjLmluIHwgc2VkIC1lIHMhQHByZWZpeEAhJChwcmVmaXgpISBcCisJLWUgcyFAZXhlY19wcmVmaXhAISQoZXhlY19wcmVmaXgpISBcCisJLWUgcyFAbGliZGlyQCEkKExJQlBBVEgpISBcCisJLWUgcyFAaW5jbHVkZWRpckAhJChJTkNQQVRIKSEgXAorCS1lIHMhLWxwbmcxNiEtbHBuZzE2XCAtbHohID4gbGlicG5nLnBjCisKK2xpYnBuZy1jb25maWc6CisJKCBjYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWhlYWQuaW47IFwKKwllY2hvIHByZWZpeD1cIiQocHJlZml4KVwiOyBcCisJZWNobyBJX29wdHM9XCItSSQoSU5DUEFUSCkvJChMSUJOQU1FKVwiOyBcCisJZWNobyBMX29wdHM9XCItTCQoTElCUEFUSClcIjsgXAorCWVjaG8gbGlicz1cIi1scG5nMTYgLWx6XCI7IFwKKwljYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gKSA+IGxpYnBuZy1jb25maWcKKwljaG1vZCAreCBsaWJwbmctY29uZmlnCisKKyQoTElCU08pOiAkKExJQlNPTUFKKQorCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pCisKKyQoTElCU09NQUopOiAkKE9CSlNETEwpCisJJChDQykgLWR5bmFtaWNsaWIgXAorCSAtaW5zdGFsbF9uYW1lICQoTElCUEFUSCkvJChMSUJTT01BSikgXAorCSAtY3VycmVudF92ZXJzaW9uIDE2IC1jb21wYXRpYmlsaXR5X3ZlcnNpb24gMTYgXAorCSAtbyAkKExJQlNPTUFKKSBcCisJICQoT0JKU0RMTCkgLUwkKFpMSUJMSUIpIC1segorCitwbmd0ZXN0OiBwbmd0ZXN0Lm8gJChMSUJTTykKKwkkKENDKSAtbyBwbmd0ZXN0ICQoQ0ZMQUdTKSBwbmd0ZXN0Lm8gJChMREZMQUdTKQorCit0ZXN0OiBwbmd0ZXN0CisJLi9wbmd0ZXN0CisKK2luc3RhbGwtaGVhZGVyczogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaAorCS1AaWYgWyAhIC1kICQoREkpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKTsgZmkKKwktQGlmIFsgISAtZCAkKERJKS8kKExJQk5BTUUpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKS8kKExJQk5BTUUpOyBmaQorCWNwIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggJChESSkvJChMSUJOQU1FKQorCWNobW9kIDY0NCAkKERJKS8kKExJQk5BTUUpL3BuZy5oICQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oICQoREkpLyQoTElCTkFNRSkvcG5nbGliY29uZi5oCisJLUAkKFJNX0YpICQoREkpL3BuZy5oICQoREkpL3BuZ2NvbmYuaCAkKERJKS9wbmdsaWJjb25mLmgKKwktQCQoUk1fRikgJChESSkvbGlicG5nCisJKGNkICQoREkpOyAkKExOX1NGKSAkKExJQk5BTUUpIGxpYnBuZzsgJChMTl9TRikgJChMSUJOQU1FKS8qIC4pCisKK2luc3RhbGwtc3RhdGljOiBpbnN0YWxsLWhlYWRlcnMgbGlicG5nLmEKKwktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCisJY3AgbGlicG5nLmEgJChETCkvJChMSUJOQU1FKS5hCisJY2htb2QgNjQ0ICQoREwpLyQoTElCTkFNRSkuYQorCSQoUkFOTElCKSAkKERMKS8kKExJQk5BTUUpLmEKKwktQCQoUk1fRikgJChETCkvbGlicG5nLmEKKwkoY2QgJChETCk7ICQoTE5fU0YpICQoTElCTkFNRSkuYSBsaWJwbmcuYSkKKworaW5zdGFsbC1zaGFyZWQ6IGluc3RhbGwtaGVhZGVycyAkKExJQlNPTUFKKSBsaWJwbmcucGMKKwktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCisJLUAkKFJNX0YpICQoREwpLyQoTElCU08pCisJLUAkKFJNX0YpICQoREwpLyQoTElCU09NQUopCisJLUAkKFJNX0YpICQoREwpLyQoT0xEU08pCisJY3AgJChMSUJTT01BSikgJChETCkKKwljaG1vZCA3NTUgJChETCkvJChMSUJTT01BSikKKwkoY2QgJChETCk7IFwKKwkkKExOX1NGKSAkKExJQlNPUkVMKSAkKExJQlNPKTsgXAorCSQoTE5fU0YpICQoTElCU08pICQoT0xEU08pKQorCS1AaWYgWyAhIC1kICQoREwpL3BrZ2NvbmZpZyBdOyB0aGVuICQoTUtESVJfUCkgJChETCkvcGtnY29uZmlnOyBmaQorCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYworCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvbGlicG5nLnBjCisJY3AgbGlicG5nLnBjICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCisJY2htb2QgNjQ0ICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCisJKGNkICQoREwpL3BrZ2NvbmZpZzsgJChMTl9TRikgJChMSUJOQU1FKS5wYyBsaWJwbmcucGMpCisKK2luc3RhbGwtbWFuOiBsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41CisJLUBpZiBbICEgLWQgJChETSkgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pOyBmaQorCS1AaWYgWyAhIC1kICQoRE0pL21hbjMgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjM7IGZpCisJLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5nLjMKKwktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmdwZi4zCisJY3AgbGlicG5nLjMgJChETSkvbWFuMworCWNwIGxpYnBuZ3BmLjMgJChETSkvbWFuMworCS1AaWYgWyAhIC1kICQoRE0pL21hbjUgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjU7IGZpCisJLUAkKFJNX0YpICQoRE0pL21hbjUvcG5nLjUKKwljcCBwbmcuNSAkKERNKS9tYW41CisKK2luc3RhbGwtY29uZmlnOiBsaWJwbmctY29uZmlnCisJLUBpZiBbICEgLWQgJChEQikgXTsgdGhlbiAkKE1LRElSX1ApICQoREIpOyBmaQorCS1AJChSTV9GKSAkKERCKS9saWJwbmctY29uZmlnCisJLUAkKFJNX0YpICQoREIpLyQoTElCTkFNRSktY29uZmlnCisJY3AgbGlicG5nLWNvbmZpZyAkKERCKS8kKExJQk5BTUUpLWNvbmZpZworCWNobW9kIDc1NSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZworCShjZCAkKERCKTsgJChMTl9TRikgJChMSUJOQU1FKS1jb25maWcgbGlicG5nLWNvbmZpZykKKworaW5zdGFsbDogaW5zdGFsbC1zdGF0aWMgaW5zdGFsbC1zaGFyZWQgaW5zdGFsbC1tYW4gaW5zdGFsbC1jb25maWcKKworIyBJZiB5b3UgaW5zdGFsbGVkIGluICQoREVTVERJUiksIHRlc3QtaW5zdGFsbGVkIHdvbid0IHdvcmsgdW50aWwgeW91CisjIG1vdmUgdGhlIGxpYnJhcnkgdG8gaXRzIGZpbmFsIGxvY2F0aW9uLiAgVXNlIHRlc3QtZGQgdG8gdGVzdCBpdAorIyBiZWZvcmUgdGhlbi4KKwordGVzdC1kZDoKKwllY2hvCisJZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5IGluICQoREwpLgorCSQoQ0MpIC1JJChESSkgJChDUFBGTEFHUykgXAorCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAorCSAgIC1MJChETCkgLUwkKFpMSUJMSUIpIFwKKwkgICAtbyBwbmd0ZXN0ZCBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgCisJLi9wbmd0ZXN0ZCBwbmd0ZXN0LnBuZworCit0ZXN0LWluc3RhbGxlZDoKKwkkKENDKSAkKENQUEZMQUdTKSAkKENGTEFHUykgXAorCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAorCSAgIC1MJChaTElCTElCKSBcCisJICAgLW8gcG5ndGVzdGkgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAorCS4vcG5ndGVzdGkgcG5ndGVzdC5wbmcKKworY2xlYW46CisJJChSTV9GKSAqLm8gbGlicG5nLmEgcG5ndGVzdCBwbmdvdXQucG5nIGxpYnBuZy1jb25maWcgXAorCWxpYnBuZy5wYyAkKExJQk5BTUUpLipkeWxpYiBwbmd0ZXN0aSBwbmdsaWJjb25mLmgKKworRE9DUyA9IEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8KK3dyaXRlbG9jazoKKwljaG1vZCBhLXcgKi5bY2gzNV0gJChET0NTKSBzY3JpcHRzLyoKKworIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgorCitwbmcubyBwbmcucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdlcnJvci5vIHBuZ2Vycm9yLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncmlvLm8gcG5ncmlvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd2lvLm8gcG5nd2lvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nbWVtLm8gcG5nbWVtLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nc2V0Lm8gcG5nc2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nZ2V0Lm8gcG5nZ2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncmVhZC5vIHBuZ3JlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdydHJhbi5vIHBuZ3J0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncnV0aWwubyBwbmdydXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3RyYW5zLm8gcG5ndHJhbnMucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3cml0ZS5vIHBuZ3dyaXRlLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd3RyYW4ubyBwbmd3dHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3d1dGlsLm8gcG5nd3V0aWwucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdwcmVhZC5vIHBuZ3ByZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorCitwbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKZGlmZiAtLWdpdCBhL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmRlYyBiL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmRlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTY2YTAyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuZGVjCkBAIC0wLDAgKzEsMjEwIEBACisjIG1ha2VmaWxlIGZvciBsaWJwbmcgb24gREVDIEFscGhhIFVuaXgKKyMgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIsIDIwMDYsIDIwMTAtMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyMgQ29weXJpZ2h0IChDKSAxOTk1IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgorIworIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisjIGFuZCBsaWNlbnNlIGluIHBuZy5oCisKKyMgTGlicmFyeSBuYW1lOgorUE5HTUFKID0gMTYKK0xJQk5BTUUgPSBsaWJwbmcxNgorCisjIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgorTElCU089JChMSUJOQU1FKS5zbworTElCU09NQUo9JChMSUJOQU1FKS5zby4kKFBOR01BSikKK0xJQlNPUkVMPSQoTElCU09NQUopLiQoUkVMRUFTRSkKK09MRFNPPWxpYnBuZy5zbworCisjIFV0aWxpdGllczoKK0FSX1JDPWFyIHJjCitDQz1jYworTUtESVJfUD1ta2RpcgorTE5fU0Y9bG4gLWYgLXMKK1JBTkxJQj1yYW5saWIKK0NQPWNwCitSTV9GPS9iaW4vcm0gLWYKKworIyB3aGVyZSBtYWtlIGluc3RhbGwgcHV0cyBsaWJwbmcuYSBhbmQgcG5nLmgKK3ByZWZpeD0vdXNyL2xvY2FsCitleGVjX3ByZWZpeD0kKHByZWZpeCkKK0lOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKK0xJQlBBVEg9JChleGVjX3ByZWZpeCkvbGliCitNQU5QQVRIPSQocHJlZml4KS9tYW4KK0JJTlBBVEg9JChleGVjX3ByZWZpeCkvYmluCisKKyMgb3ZlcnJpZGUgREVTVERJUj0gb24gdGhlIG1ha2UgaW5zdGFsbCBjb21tYW5kIGxpbmUgdG8gZWFzaWx5IHN1cHBvcnQKKyMgaW5zdGFsbGluZyBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uLiAgRXhhbXBsZToKKyMKKyMgICAgbWFrZSBpbnN0YWxsIERFU1RESVI9L3RtcC9idWlsZC9saWJwbmcKKyMKKyMgSWYgeW91J3JlIGdvaW5nIHRvIGluc3RhbGwgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbgorIyB2aWEgREVTVERJUiwgJChERVNURElSKSQocHJlZml4KSBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlCisjIHlvdSBleGVjdXRlIG1ha2UgaW5zdGFsbC4KK0RFU1RESVI9CisKK0RCPSQoREVTVERJUikkKEJJTlBBVEgpCitEST0kKERFU1RESVIpJChJTkNQQVRIKQorREw9JChERVNURElSKSQoTElCUEFUSCkKK0RNPSQoREVTVERJUikkKE1BTlBBVEgpCisKKyMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZAorI1pMSUJMSUI9L3Vzci9sb2NhbC9saWIKKyNaTElCSU5DPS91c3IvbG9jYWwvaW5jbHVkZQorWkxJQkxJQj0uLi96bGliCitaTElCSU5DPS4uL3psaWIKKworQ1BQRkxBR1M9LUkkKFpMSUJJTkMpICMgLURQTkdfREVCVUc9NQorQ0ZMQUdTPS1zdGQgLXcxIC1PICMgLWcKK0xERkxBR1M9LUwkKFpMSUJMSUIpIC1ycGF0aCAkKFpMSUJMSUIpIGxpYnBuZy5hIC1seiAtbG0KKworIyBQcmUtYnVpbHQgY29uZmlndXJhdGlvbgorIyBTZWUgc2NyaXB0cy9wbmdsaWJjb25mLm1hayBmb3IgbW9yZSBvcHRpb25zCitQTkdMSUJDT05GX0hfUFJFQlVJTFQgPSBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdAorCitPQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAorCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAorCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCisKKy5jLm86CisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1vICRAICQ8CisKK2FsbDogJChMSUJTTykgbGlicG5nLmEgcG5ndGVzdCBsaWJwbmcucGMgbGlicG5nLWNvbmZpZworCitwbmdsaWJjb25mLmg6ICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKQorCSQoQ1ApICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKSAkQAorCitsaWJwbmcuYTogJChPQkpTKQorCSQoQVJfUkMpICRAICAkKE9CSlMpCisJJChSQU5MSUIpICRACisKK2xpYnBuZy5wYzoKKwljYXQgc2NyaXB0cy9saWJwbmcucGMuaW4gfCBzZWQgLWUgcyFAcHJlZml4QCEkKHByZWZpeCkhIFwKKwktZSBzIUBleGVjX3ByZWZpeEAhJChleGVjX3ByZWZpeCkhIFwKKwktZSBzIUBsaWJkaXJAISQoTElCUEFUSCkhIFwKKwktZSBzIUBpbmNsdWRlZGlyQCEkKElOQ1BBVEgpISBcCisJLWUgcyEtbHBuZzE2IS1scG5nMTZcIC1selwgLWxtISA+IGxpYnBuZy5wYworCitsaWJwbmctY29uZmlnOgorCSggY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1oZWFkLmluOyBcCisJZWNobyBwcmVmaXg9XCIkKHByZWZpeClcIjsgXAorCWVjaG8gSV9vcHRzPVwiLUkkKElOQ1BBVEgpLyQoTElCTkFNRSlcIjsgXAorCWVjaG8gY2NvcHRzPVwiLXN0ZFwiOyBcCisJZWNobyBMX29wdHM9XCItTCQoTElCUEFUSClcIjsgXAorCWVjaG8gbGlicz1cIi1scG5nMTYgLWx6IC1sbVwiOyBcCisJY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1ib2R5LmluICkgPiBsaWJwbmctY29uZmlnCisJY2htb2QgK3ggbGlicG5nLWNvbmZpZworCiskKExJQlNPKTogJChMSUJTT01BSikKKwkkKExOX1NGKSAkKExJQlNPTUFKKSAkKExJQlNPKQorCiskKExJQlNPTUFKKTogJChPQkpTKQorCSQoQ0MpIC1zaGFyZWQgLW8gJEAgJChPQkpTKSAtTCQoWkxJQkxJQikgXAorCS1zb25hbWUgJChMSUJTT01BSikKKworcG5ndGVzdDogcG5ndGVzdC5vIGxpYnBuZy5hCisJJChDQykgLW8gcG5ndGVzdCAkKENGTEFHUykgcG5ndGVzdC5vICQoTERGTEFHUykKKwordGVzdDogcG5ndGVzdAorCS4vcG5ndGVzdAorCitpbnN0YWxsLWhlYWRlcnM6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKKwktQGlmIFsgISAtZCAkKERJKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCisJLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSkvJChMSUJOQU1FKTsgZmkKKwljcCBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oICQoREkpLyQoTElCTkFNRSkKKwljaG1vZCA2NDQgJChESSkvJChMSUJOQU1FKS9wbmcuaCAkKERJKS8kKExJQk5BTUUpL3BuZ2NvbmYuaCAkKERJKS8kKExJQk5BTUUpL3BuZ2xpYmNvbmYuaAorCS1AL2Jpbi9ybSAtZiAkKERJKS9wbmcuaCAkKERJKS9wbmdjb25mLmggJChESSkvcG5nbGliY29uZi5oCisJLUAvYmluL3JtIC1mICQoREkpL2xpYnBuZworCShjZCAkKERJKTsgJChMTl9TRikoTElCTkFNRSkgbGlicG5nOyAkKExOX1NGKShMSUJOQU1FKS8qIC4pCisKK2luc3RhbGwtc3RhdGljOiBpbnN0YWxsLWhlYWRlcnMgbGlicG5nLmEKKwktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCisJY3AgbGlicG5nLmEgJChETCkvJChMSUJOQU1FKS5hCisJY2htb2QgNjQ0ICQoREwpLyQoTElCTkFNRSkuYQorCS1AL2Jpbi9ybSAtZiAkKERMKS9saWJwbmcuYQorCShjZCAkKERMKTsgJChMTl9TRikoTElCTkFNRSkuYSBsaWJwbmcuYSkKKworaW5zdGFsbC1zaGFyZWQ6IGluc3RhbGwtaGVhZGVycyAkKExJQlNPTUFKKSBsaWJwbmcucGMKKwktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCisJLUAkKFJNX0YpICQoREwpLyQoTElCU08pCisJLUAkKFJNX0YpICQoREwpLyQoTElCU09SRUwpCisJLUAkKFJNX0YpICQoREwpLyQoT0xEU08pCisJY3AgJChMSUJTT01BSikgJChETCkvJChMSUJTT1JFTCkKKwljaG1vZCA3NTUgJChETCkvJChMSUJTT1JFTCkKKwkoY2QgJChETCk7IFwKKwkkKExOX1NGKSAkKExJQlNPUkVMKSAkKExJQlNPKTsgXAorCSQoTE5fU0YpICQoTElCU08pICQoT0xEU08pKQorCS1AaWYgWyAhIC1kICQoREwpL3BrZ2NvbmZpZyBdOyB0aGVuICQoTUtESVJfUCkgJChETCkvcGtnY29uZmlnOyBmaQorCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYworCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvbGlicG5nLnBjCisJY3AgbGlicG5nLnBjICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCisJY2htb2QgNjQ0ICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCisJKGNkICQoREwpL3BrZ2NvbmZpZzsgJChMTl9TRikgJChMSUJOQU1FKS5wYyBsaWJwbmcucGMpCisKK2luc3RhbGwtbWFuOiBsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41CisJLUBpZiBbICEgLWQgJChETSkgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pOyBmaQorCS1AaWYgWyAhIC1kICQoRE0pL21hbjMgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjM7IGZpCisJLUAvYmluL3JtIC1mICQoRE0pL21hbjMvbGlicG5nLjMKKwktQC9iaW4vcm0gLWYgJChETSkvbWFuMy9saWJwbmdwZi4zCisJY3AgbGlicG5nLjMgJChETSkvbWFuMworCWNwIGxpYnBuZ3BmLjMgJChETSkvbWFuMworCS1AaWYgWyAhIC1kICQoRE0pL21hbjUgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjU7IGZpCisJLUAvYmluL3JtIC1mICQoRE0pL21hbjUvcG5nLjUKKwljcCBwbmcuNSAkKERNKS9tYW41CisKK2luc3RhbGwtY29uZmlnOiBsaWJwbmctY29uZmlnCisJLUBpZiBbICEgLWQgJChEQikgXTsgdGhlbiAkKE1LRElSX1ApICQoREIpOyBmaQorCS1AL2Jpbi9ybSAtZiAkKERCKS9saWJwbmctY29uZmlnCisJLUAvYmluL3JtIC1mICQoREIpLyQoTElCTkFNRSktY29uZmlnCisJY3AgbGlicG5nLWNvbmZpZyAkKERCKS8kKExJQk5BTUUpLWNvbmZpZworCWNobW9kIDc1NSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZworCShjZCAkKERCKTsgJChMTl9TRikoTElCTkFNRSktY29uZmlnIGxpYnBuZy1jb25maWcpCisKK2luc3RhbGw6IGluc3RhbGwtc3RhdGljIGluc3RhbGwtc2hhcmVkIGluc3RhbGwtbWFuIGluc3RhbGwtY29uZmlnCisKKyMgSWYgeW91IGluc3RhbGxlZCBpbiAkKERFU1RESVIpLCB0ZXN0LWluc3RhbGxlZCB3b24ndCB3b3JrIHVudGlsIHlvdQorIyBtb3ZlIHRoZSBsaWJyYXJ5IHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4gIFVzZSB0ZXN0LWRkIHRvIHRlc3QgaXQKKyMgYmVmb3JlIHRoZW4uCisKK3Rlc3QtZGQ6CisJZWNobworCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeSBpbiAkKERMKS4KKwkkKENDKSAtdzEgLUkkKERJKSAkKENQUEZMQUdTKSBcCisJICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCisJICAgLUwkKERMKSAtTCQoWkxJQkxJQikgIC1SJChaTElCTElCKSAtUiQoREwpIFwKKwkgICAtbyBwbmd0ZXN0ZCBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgCisJLi9wbmd0ZXN0ZCBwbmd0ZXN0LnBuZworCit0ZXN0LWluc3RhbGxlZDoKKwllY2hvCisJZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5LgorCSQoQ0MpIC13MSAkKENQUEZMQUdTKSBcCisJICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCisJICAgLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKSBcCisJICAgLW8gcG5ndGVzdGkgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAorCS4vcG5ndGVzdGkgcG5ndGVzdC5wbmcKKworY2xlYW46CisJJChSTV9GKSAqLm8gbGlicG5nLmEgcG5ndGVzdCBwbmd0ZXN0aSBwbmdvdXQucG5nIFwKKwlsaWJwbmctY29uZmlnICQoTElCU08pICQoTElCU09NQUopKiBcCisJbGlicG5nLnBjIHBuZ2xpYmNvbmYuaAorCisjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCisKK3BuZy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nZXJyb3IubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3Jpby5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd2lvLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdtZW0ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3NldC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nZ2V0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdyZWFkLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdydHJhbi5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncnV0aWwubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3RyYW5zLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3cml0ZS5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd3RyYW4ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3d1dGlsLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdwcmVhZC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorCitwbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKZGlmZiAtLWdpdCBhL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmRqMiBiL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmRqMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTljNDMyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuZGoyCkBAIC0wLDAgKzEsNzIgQEAKKyMgREpHUFAgKERPUyBnY2MpIG1ha2VmaWxlIGZvciBsaWJwbmcKKyMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA2LCAyMDA5LTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCisjIENvcHlyaWdodCAoQykgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KKyMKKyMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorIyBhbmQgbGljZW5zZSBpbiBwbmcuaAorCisjIHdoZXJlIG1ha2UgaW5zdGFsbCB3aWxsIHB1dCBsaWJwbmcuYSBhbmQgcG5nLmgKKyNwcmVmaXg9L3Vzci9sb2NhbAorcHJlZml4PS4KK0lOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKK0xJQlBBVEg9JChwcmVmaXgpL2xpYgorCitDQz1nY2MKK0NQUEZMQUdTPS1JLi4vemxpYiAtRFBOR19OT19TTlBSSU5URgorQ0ZMQUdTPS1PCitMREZMQUdTPS1MLiAtTC4uL3psaWIvIC1scG5nIC1seiAtbG0KKworUkFOTElCPXJhbmxpYgorCitDUD1jcAorUk1fRj1ybSAtZgorCisjIFByZS1idWlsdCBjb25maWd1cmF0aW9uCisjIFNlZSBzY3JpcHRzL3BuZ2xpYmNvbmYubWFrIGZvciBtb3JlIG9wdGlvbnMKK1BOR0xJQkNPTkZfSF9QUkVCVUlMVCA9IHNjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0CisKK09CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCisJcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBwbmd3dHJhbi5vIFwKKwlwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KKworLmMubzoKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgLW8gJEAgJDwKKworYWxsOiBsaWJwbmcuYSBwbmd0ZXN0CisKK3BuZ2xpYmNvbmYuaDogJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpCisJJChDUCkgJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpICRACisKK2xpYnBuZy5hOiAkKE9CSlMpCisJYXIgcmMgJEAgICQoT0JKUykKKwkkKFJBTkxJQikgJEAKKworcG5ndGVzdDogcG5ndGVzdC5vIGxpYnBuZy5hCisJJChDQykgLW8gcG5ndGVzdCAkKENGTEFHUykgcG5ndGVzdC5vICQoTERGTEFHUykKKwljb2ZmMmV4ZSBwbmd0ZXN0CisKK3Rlc3Q6IHBuZ3Rlc3QKKwkuL3BuZ3Rlc3QKK2NsZWFuOgorCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5nb3V0LnBuZyBwbmdsaWJjb25mLmgKKworIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgorCitwbmcubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ2Vycm9yLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdyaW8ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3dpby5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nbWVtLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdzZXQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ2dldC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncmVhZC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncHJlYWQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3J0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdydXRpbC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ndHJhbnMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3dyaXRlLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3dHJhbi5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd3V0aWwubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKworcG5ndGVzdC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCmRpZmYgLS1naXQgYS9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5mcmVlYnNkIGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuZnJlZWJzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWQxYTVhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuZnJlZWJzZApAQCAtMCwwICsxLDY5IEBACisjIG1ha2VmaWxlIGZvciBsaWJwbmcgdW5kZXIgRnJlZUJTRAorIyBDb3B5cmlnaHQgKEMpIDIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uIGFuZCBBbmRyZXkgQS4gQ2hlcm5vdgorIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDcsIDIwMDkgR2xlbm4gUmFuZGVycy1QZWhyc29uIGFuZCBBbmRyZXkgQS4gQ2hlcm5vdgorIworIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisjIGFuZCBsaWNlbnNlIGluIHBuZy5oCisKK1BSRUZJWD89ICAgICAgICAvdXNyL2xvY2FsCitTSExJQl9WRVI/PSAgICAgMTYKKworTElCPQkJcG5nCitTSExJQl9NQUpPUj0JJHtTSExJQl9WRVJ9CitTSExJQl9NSU5PUj0JMAorTk9fUFJPRklMRT0JWUVTCitOT19PQko9CQlZRVMKKworIyB3aGVyZSBtYWtlIGluc3RhbGwgcHV0cyBsaWJwbmcuYSBhbmQgcG5nLmgKK0RFU1RESVI9CSR7UFJFRklYfQorTElCRElSPQkJL2xpYgorSU5DUz0JCXBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitJTkNTRElSPQkvaW5jbHVkZS9saWJwbmcKK0lOQ0RJUj0JCSR7SU5DU0RJUn0JCSMgZm9yIDQueCBic2QubGliLm1rCitNQU49CQlsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41CitNQU5ESVI9CQkvbWFuL21hbgorU1lNTElOS1M9ICAgICAgIGxpYnBuZy9wbmcuaCAke0lOQ1NESVJ9Ly4uL3BuZy5oIFwKKwkJbGlicG5nL3BuZ2NvbmYuaCAke0lOQ1NESVJ9Ly4uL3BuZ2NvbmYuaCBcCisJCWxpYnBuZy9wbmdsaWJjb25mLmggJHtJTkNTRElSfS8uLi9wbmdsaWJjb25mLmgKKworIyB3aGVyZSBtYWtlIGluc3RhbGwgZmluZHMgbGliei5hIGFuZCB6bGliLmgKK1pMSUJMSUI9CS91c3IvbGliCitaTElCSU5DPQkvdXNyL2luY2x1ZGUKKworTERBREQrPQkJLWxtIC1segorI0xEQUREKz0JLWxtIC1seiAtbHNzcF9ub25zaGFyZWQgICAjIGZvciBPU1ZFUlNJT04gPCA4MDAwMDAgPworCitEUEFERCs9CQkke0xJQk19ICR7TElCWn0KKworQ1BQRkxBR1MrPQktSS4gLUkke1pMSUJJTkN9CitDRkxBR1MrPQktVyAtV2FsbAorCisjIFByZS1idWlsdCBjb25maWd1cmF0aW9uCisjIFNlZSBzY3JpcHRzL3BuZ2xpYmNvbmYubWFrIGZvciBtb3JlIG9wdGlvbnMKK1BOR0xJQkNPTkZfSF9QUkVCVUlMVD0gc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQKKworU1JDUz0JcG5nLmMgcG5nc2V0LmMgcG5nZ2V0LmMgcG5ncnV0aWwuYyBwbmd0cmFucy5jIHBuZ3d1dGlsLmMgXAorCXBuZ3JlYWQuYyBwbmdyaW8uYyBwbmd3aW8uYyBwbmd3cml0ZS5jIHBuZ3J0cmFuLmMgXAorCXBuZ3d0cmFuLmMgcG5nbWVtLmMgcG5nZXJyb3IuYyBwbmdwcmVhZC5jCisKKy5jLm86CisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1vICRAICQ8CisKK3BuZ3Rlc3Q6IHBuZ3Rlc3QubyBsaWJwbmcuYQorCSR7Q0N9ICR7Q0ZMQUdTfSAtTC4gLXN0YXRpYyAtbyBwbmd0ZXN0IHBuZ3Rlc3QubyAtTCR7WkxJQkxJQn0gXAorCS1scG5nICR7TERBRER9CisKK0NMRUFORklMRVM9IHBuZ3Rlc3QgcG5ndGVzdC5vIHBuZ291dC5wbmcKKwordGVzdDogcG5ndGVzdAorCS4vcG5ndGVzdAorCitwbmdsaWJjb25mLmg6ICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKQorCWNwICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKSAkQAorCitET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTword3JpdGVsb2NrOgorCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgorCisuaW5jbHVkZSA8YnNkLmxpYi5taz4KZGlmZiAtLWdpdCBhL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmdjYyBiL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmdjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTkyZDE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuZ2NjCkBAIC0wLDAgKzEsODcgQEAKKyMgbWFrZWZpbGUgZm9yIGxpYnBuZyB1c2luZyBnY2MgKGdlbmVyaWMsIHN0YXRpYyBsaWJyYXJ5KQorIyBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCisjIENvcHlyaWdodCAoQykgMjAwMCBDb3NtaW4gVHJ1dGEKKyMgQ29weXJpZ2h0IChDKSAxOTk1IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgorIworIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisjIGFuZCBsaWNlbnNlIGluIHBuZy5oCisKKyMgTG9jYXRpb24gb2YgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcworWkxJQklOQyA9IC4uL3psaWIKK1pMSUJMSUIgPSAuLi96bGliCisKKyMgQ29tcGlsZXIsIGxpbmtlciwgbGliIGFuZCBvdGhlciB0b29scworQ0MgPSBnY2MKK0xEID0gJChDQykKK0FSX1JDID0gYXIgcmNzCitSQU5MSUIgPSByYW5saWIKK0NQID0gY3AKK1JNX0YgPSBybSAtZgorCitXQVJOTU9SRSA9IC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdzaGFkb3cgXAorCS1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVd0cmFkaXRpb25hbCAtV2Nhc3QtYWxpZ24gXAorCS1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgIyAtV2NvbnZlcnNpb24KK0NQUEZMQUdTID0gLUkkKFpMSUJJTkMpICMgLURQTkdfREVCVUc9NQorQ0ZMQUdTID0gLVcgLVdhbGwgLU8yICMgJChXQVJOTU9SRSkgLWcKK0xERkxBR1MgPQorTElCUyA9IC1seiAtbG0KKworIyBGaWxlIGV4dGVuc2lvbnMKK0VYRUVYVCA9CisKKyMgUHJlLWJ1aWx0IGNvbmZpZ3VyYXRpb24KKyMgU2VlIHNjcmlwdHMvcG5nbGliY29uZi5tYWsgZm9yIG1vcmUgb3B0aW9ucworUE5HTElCQ09ORl9IX1BSRUJVSUxUID0gc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQKKworIyBWYXJpYWJsZXMKK09CSlMgPSAgcG5nLm8gcG5nZXJyb3IubyBwbmdnZXQubyBwbmdtZW0ubyBwbmdwcmVhZC5vIFwKKwlwbmdyZWFkLm8gcG5ncmlvLm8gcG5ncnRyYW4ubyBwbmdydXRpbC5vIHBuZ3NldC5vIFwKKwlwbmd0cmFucy5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5nd3RyYW4ubyBwbmd3dXRpbC5vCisKKyMgVGFyZ2V0cworYWxsOiBzdGF0aWMKKworcG5nbGliY29uZi5oOiAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkKKwkkKENQKSAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkgJEAKKworLmMubzoKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgLW8gJEAgJDwKKworc3RhdGljOiBsaWJwbmcuYSBwbmd0ZXN0JChFWEVFWFQpCisKK3NoYXJlZDoKKwlAZWNobyBUaGlzIGlzIGEgZ2VuZXJpYyBtYWtlZmlsZSB0aGF0IGNhbm5vdCBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcy4KKwlAZWNobyBQbGVhc2UgdXNlIGEgY29uZmlndXJhdGlvbiB0aGF0IGlzIHNwZWNpZmljIHRvIHlvdXIgcGxhdGZvcm0uCisJQGZhbHNlCisKK2xpYnBuZy5hOiAkKE9CSlMpCisJJChBUl9SQykgJEAgJChPQkpTKQorCSQoUkFOTElCKSAkQAorCit0ZXN0OiBwbmd0ZXN0JChFWEVFWFQpCisJLi9wbmd0ZXN0JChFWEVFWFQpCisKK3BuZ3Rlc3QkKEVYRUVYVCk6IHBuZ3Rlc3QubyBsaWJwbmcuYQorCSQoTEQpICQoTERGTEFHUykgLUwkKFpMSUJMSUIpIC1vICRAIHBuZ3Rlc3QubyBsaWJwbmcuYSAkKExJQlMpCisKK2NsZWFuOgorCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QkKEVYRUVYVCkgcG5nb3V0LnBuZyBwbmdsaWJjb25mLmgKKworcG5nLm86ICAgICAgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ2Vycm9yLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdnZXQubzogICBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nbWVtLm86ICAgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3ByZWFkLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdyZWFkLm86ICBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncmlvLm86ICAgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3J0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdydXRpbC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nc2V0Lm86ICAgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3RyYW5zLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3aW8ubzogICBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd3JpdGUubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3d0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3dXRpbC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorCitwbmd0ZXN0Lm86ICBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCmRpZmYgLS1naXQgYS9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5ocDY0IGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuaHA2NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTQ4YmU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuaHA2NApAQCAtMCwwICsxLDIzMSBAQAorIyBtYWtlZmlsZSBmb3IgbGlicG5nLCBIUFVYICgxMC4yMCBhbmQgMTEuMDApIHVzaW5nIHRoZSBBTlNJL0MgcHJvZHVjdC4KKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDIsIDIwMDYsIDIwMDksIDIwMTAtMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyMgQ29weXJpZ2h0IChDKSAxOTk1IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MgorIyBjb250cmlidXRlZCBieSBKaW0gUmljZSBhbmQgdXBkYXRlZCBieSBDaHJpcyBTY2hsZWljaGVyLCBIZXdsZXR0IFBhY2thcmQKKyMKKyMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorIyBhbmQgbGljZW5zZSBpbiBwbmcuaAorCisjIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKK1pMSUJMSUI9L29wdC96bGliL2xpYgorWkxJQklOQz0vb3B0L3psaWIvaW5jbHVkZQorCisjIE5vdGUgdGhhdCBpZiB5b3UgcGxhbiB0byBidWlsZCBhIGxpYnBuZyBzaGFyZWQgbGlicmFyeSwgemxpYiBtdXN0IGFsc28KKyMgYmUgYSBzaGFyZWQgbGlicmFyeSwgd2hpY2ggemxpYidzIGNvbmZpZ3VyZSBkb2VzIG5vdCBkby4gIEFmdGVyIHJ1bm5pbmcKKyMgemxpYidzIGNvbmZpZ3VyZSwgZWRpdCB0aGUgYXBwcm9wcmlhdGUgbGluZXMgb2YgbWFrZWZpbGUgdG8gcmVhZDoKKyMgICBDRkxBR1M9LU8xIC1ESEFWRV9VTklTVEQgLURVU0VfTUFQIC1mUElDIFwKKyMgICBMRFNIQVJFRD1sZCAtYgorIyAgIFNIQVJFRExJQj1saWJ6LnNsCisKKyMgTGlicmFyeSBuYW1lOgorTElCTkFNRSA9IGxpYnBuZzE2CitQTkdNQUogPSAxNgorCisjIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgorTElCU089JChMSUJOQU1FKS5zbAorTElCU09NQUo9JChMSUJOQU1FKS5zbC4kKFBOR01BSikKK0xJQlNPUkVMPSQoTElCU09NQUopLiQoUkVMRUFTRSkKK09MRFNPPWxpYnBuZy5zbAorCisjIFV0aWxpdGllczoKK0FSX1JDPWFyIHJjCitDQz1jYworTUtESVJfUD1ta2RpciAtcAorTE5fU0Y9bG4gLXNmCitSQU5MSUI9cmFubGliCitDUD1jcAorUk1fRj0vYmluL3JtIC1mCisKK0NQUEZMQUdTPS1JJChaTElCSU5DKSBcCisgICAgICAgIC1EX0xBUkdFRklMRV9TT1VSQ0UgLURfRklMRV9PRkZTRVRfQklUUz02NCAtREhBVkVfVU5JU1REX0ggLURVU0VfTU1BUAorQ0ZMQUdTPS1PIC1BZSAtV2wsK3Zub2NvbXBhdHdhcm5pbmdzICtERDY0ICtaCisjIENhdXRpb246IGJlIHN1cmUgeW91IGhhdmUgYnVpbHQgemxpYiB3aXRoIHRoZSBzYW1lIENGTEFHUy4KK0NDRkxBR1M9LU8gLUFlIC1XbCwrdm5vY29tcGF0d2FybmluZ3MgK0RENjQgK1oKKworTERGTEFHUz0tTC4gLUwkKFpMSUJMSUIpIC1scG5nIC1seiAtbG0KKworIyB3aGVyZSBtYWtlIGluc3RhbGwgcHV0cyBsaWJwbmcuYSwgbGlicG5nMTYuc2wsIGFuZCBwbmcuaAorcHJlZml4PS9vcHQvbGlicG5nCitleGVjX3ByZWZpeD0kKHByZWZpeCkKK0lOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKK0xJQlBBVEg9JChleGVjX3ByZWZpeCkvbGliCitNQU5QQVRIPSQocHJlZml4KS9tYW4KK0JJTlBBVEg9JChleGVjX3ByZWZpeCkvYmluCisKKyMgb3ZlcnJpZGUgREVTVERJUj0gb24gdGhlIG1ha2UgaW5zdGFsbCBjb21tYW5kIGxpbmUgdG8gZWFzaWx5IHN1cHBvcnQKKyMgaW5zdGFsbGluZyBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uLiAgRXhhbXBsZToKKyMKKyMgICAgbWFrZSBpbnN0YWxsIERFU1RESVI9L3RtcC9idWlsZC9saWJwbmcKKyMKKyMgSWYgeW91J3JlIGdvaW5nIHRvIGluc3RhbGwgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbgorIyB2aWEgREVTVERJUiwgJChERVNURElSKSQocHJlZml4KSBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlCisjIHlvdSBleGVjdXRlIG1ha2UgaW5zdGFsbC4KK0RFU1RESVI9CisKK0RCPSQoREVTVERJUikkKEJJTlBBVEgpCitEST0kKERFU1RESVIpJChJTkNQQVRIKQorREw9JChERVNURElSKSQoTElCUEFUSCkKK0RNPSQoREVTVERJUikkKE1BTlBBVEgpCisKKyMgUHJlLWJ1aWx0IGNvbmZpZ3VyYXRpb24KKyMgU2VlIHNjcmlwdHMvcG5nbGliY29uZi5tYWsgZm9yIG1vcmUgb3B0aW9ucworUE5HTElCQ09ORl9IX1BSRUJVSUxUID0gc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQKKworT0JKUyA9IHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKKwlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKKwlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubworCitPQkpTRExMID0gJChPQkpTOi5vPS5waWMubykKKworLlNVRkZJWEVTOgkuYyAubyAucGljLm8KKworLmMubzoKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgLW8gJEAgJDwKKworLmMucGljLm86CisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICt6IC1vICRAICQqLmMKKworYWxsOiBsaWJwbmcuYSAkKExJQlNPKSBwbmd0ZXN0IGxpYnBuZy5wYyBsaWJwbmctY29uZmlnCisKK3BuZ2xpYmNvbmYuaDogJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpCisJJChDUCkgJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpICRACisKK2xpYnBuZy5hOiAkKE9CSlMpCisJJChBUl9SQykgJEAgJChPQkpTKQorCSQoUkFOTElCKSAkQAorCitsaWJwbmcucGM6CisJY2F0IHNjcmlwdHMvbGlicG5nLnBjLmluIHwgc2VkIC1lIHMhQHByZWZpeEAhJChwcmVmaXgpISBcCisJLWUgcyFAZXhlY19wcmVmaXhAISQoZXhlY19wcmVmaXgpISBcCisJLWUgcyFAbGliZGlyQCEkKExJQlBBVEgpISBcCisJLWUgcyFAaW5jbHVkZWRpckAhJChJTkNQQVRIKSEgXAorCS1lIHMhLWxwbmcxNiEtbHBuZzE2XCAtbHpcIC1sbSEgPiBsaWJwbmcucGMKKworbGlicG5nLWNvbmZpZzoKKwkoIGNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbjsgXAorCWVjaG8gcHJlZml4PVwiJChwcmVmaXgpXCI7IFwKKwllY2hvIElfb3B0cz1cIi1JJChJTkNQQVRIKS8kKExJQk5BTUUpXCI7IFwKKwllY2hvIGNjb3B0cz1cIi1PIC1BZSAtV2wsK3Zub2NvbXBhdHdhcm5pbmdzICtERDY0ICtaXCI7IFwKKwllY2hvIExfb3B0cz1cIi1MJChMSUJQQVRIKVwiOyBcCisJZWNobyBsaWJzPVwiLWxwbmcxNiAtbHogLWxtXCI7IFwKKwljYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gKSA+IGxpYnBuZy1jb25maWcKKwljaG1vZCAreCBsaWJwbmctY29uZmlnCisKKyQoTElCU08pOiAkKExJQlNPTUFKKQorCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pCisKKyQoTElCU09NQUopOiAkKE9CSlNETEwpCisJJChMRCkgLWIgK3MgXAorCStoICQoTElCU09NQUopIC1vICQoTElCU09NQUopICQoT0JKU0RMTCkKKworcG5ndGVzdDogcG5ndGVzdC5vIGxpYnBuZy5hCisJJChDQykgLW8gcG5ndGVzdCAkKENDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCisKK3Rlc3Q6IHBuZ3Rlc3QKKwkuL3BuZ3Rlc3QKKworaW5zdGFsbC1oZWFkZXJzOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCisJLUBpZiBbICEgLWQgJChESSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpOyBmaQorCS1AaWYgWyAhIC1kICQoREkpLyQoTElCTkFNRSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpLyQoTElCTkFNRSk7IGZpCisJY3AgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCAkKERJKS8kKExJQk5BTUUpCisJY2htb2QgNjQ0ICQoREkpLyQoTElCTkFNRSkvcG5nLmggJChESSkvJChMSUJOQU1FKS9wbmdjb25mLmggJChESSkvJChMSUJOQU1FKS9wbmdsaWJjb25mLmgKKwktQCQoUk1fRikgJChESSkvcG5nLmggJChESSkvcG5nY29uZi5oICQoREkpL3BuZ2xpYmNvbmYuaAorCS1AJChSTV9GKSAkKERJKS9saWJwbmcKKwkoY2QgJChESSk7ICQoTE5fU0YpICQoTElCTkFNRSkgbGlicG5nOyAkKExOX1NGKSAkKExJQk5BTUUpLyogLikKKworaW5zdGFsbC1zdGF0aWM6IGluc3RhbGwtaGVhZGVycyBsaWJwbmcuYQorCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKKwljcCBsaWJwbmcuYSAkKERMKS8kKExJQk5BTUUpLmEKKwljaG1vZCA2NDQgJChETCkvJChMSUJOQU1FKS5hCisJLUAkKFJNX0YpICQoREwpL2xpYnBuZy5hCisJKGNkICQoREwpOyAkKExOX1NGKSAkKExJQk5BTUUpLmEgbGlicG5nLmEpCisKK2luc3RhbGwtc2hhcmVkOiBpbnN0YWxsLWhlYWRlcnMgJChMSUJTT01BSikgbGlicG5nLnBjCisJLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQorCS1AJChSTV9GKSAkKERMKS8kKExJQlNPKQorCS1AJChSTV9GKSAkKERMKS8kKExJQlNPUkVMKQorCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPKQorCWNwICQoTElCU09NQUopICQoREwpLyQoTElCU09SRUwpCisJY2htb2QgNzU1ICQoREwpLyQoTElCU09SRUwpCisJKGNkICQoREwpOyBcCisJJChMTl9TRikgJChMSUJTT1JFTCkgJChMSUJTTyk7IFwKKwkkKExOX1NGKSAkKExJQlNPKSAkKE9MRFNPKSkKKwktQGlmIFsgISAtZCAkKERMKS9wa2djb25maWcgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpL3BrZ2NvbmZpZzsgZmkKKwktQCQoUk1fRikgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKKwktQCQoUk1fRikgJChETCkvcGtnY29uZmlnL2xpYnBuZy5wYworCWNwIGxpYnBuZy5wYyAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYworCWNobW9kIDY0NCAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYworCShjZCAkKERMKS9wa2djb25maWc7ICQoTE5fU0YpICQoTElCTkFNRSkucGMgbGlicG5nLnBjKQorCitpbnN0YWxsLW1hbjogbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQorCS1AaWYgWyAhIC1kICQoRE0pIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKTsgZmkKKwktQGlmIFsgISAtZCAkKERNKS9tYW4zIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW4zOyBmaQorCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZy4zCisJLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5ncGYuMworCWNwIGxpYnBuZy4zICQoRE0pL21hbjMKKwljcCBsaWJwbmdwZi4zICQoRE0pL21hbjMKKwktQGlmIFsgISAtZCAkKERNKS9tYW41IF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW41OyBmaQorCS1AJChSTV9GKSAkKERNKS9tYW41L3BuZy41CisJY3AgcG5nLjUgJChETSkvbWFuNQorCitpbnN0YWxsLWNvbmZpZzogbGlicG5nLWNvbmZpZworCS1AaWYgWyAhIC1kICQoREIpIF07IHRoZW4gJChNS0RJUl9QKSAkKERCKTsgZmkKKwktQCQoUk1fRikgJChEQikvbGlicG5nLWNvbmZpZworCS1AJChSTV9GKSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZworCWNwIGxpYnBuZy1jb25maWcgJChEQikvJChMSUJOQU1FKS1jb25maWcKKwljaG1vZCA3NTUgJChEQikvJChMSUJOQU1FKS1jb25maWcKKwkoY2QgJChEQik7ICQoTE5fU0YpICQoTElCTkFNRSktY29uZmlnIGxpYnBuZy1jb25maWcpCisKK2luc3RhbGw6IGluc3RhbGwtc3RhdGljIGluc3RhbGwtc2hhcmVkIGluc3RhbGwtbWFuIGluc3RhbGwtY29uZmlnCisKKyMgSWYgeW91IGluc3RhbGxlZCBpbiAkKERFU1RESVIpLCB0ZXN0LWluc3RhbGxlZCB3b24ndCB3b3JrIHVudGlsIHlvdQorIyBtb3ZlIHRoZSBsaWJyYXJ5IHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4gIFVzZSB0ZXN0LWRkIHRvIHRlc3QgaXQKKyMgYmVmb3JlIHRoZW4uCisKK3Rlc3QtZGQ6CisJZWNobworCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeSBpbiAkKERMKS4KKwkkKENDKSAtSSQoREkpICQoQ1BQRkxBR1MpICQoQ0NGTEFHUykgXAorCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAorCSAgIC1MJChETCkgLUwkKFpMSUJMSUIpIFwKKwkgICAtbyBwbmd0ZXN0ZCBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgCisJLi9wbmd0ZXN0ZCBwbmd0ZXN0LnBuZworCit0ZXN0LWluc3RhbGxlZDoKKwllY2hvCisJZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5LgorCSQoQ0MpICQoQ1BQRkxBR1MpICQoQ0NGTEFHUykgXAorCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAorCSAgIC1MJChaTElCTElCKSBcCisJICAgLW8gcG5ndGVzdGkgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAorCS4vcG5ndGVzdGkgcG5ndGVzdC5wbmcKKworY2xlYW46CisJJChSTV9GKSAqLm8gbGlicG5nLmEgcG5ndGVzdCBwbmd0ZXN0aSBwbmdvdXQucG5nIFwKKwlsaWJwbmctY29uZmlnICQoTElCU08pICQoTElCU09NQUopKiBcCisJbGlicG5nLnBjIHBuZ2xpYmNvbmYuaAorCitET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTword3JpdGVsb2NrOgorCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgorCisjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCisKK3BuZy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nZXJyb3IubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3Jpby5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd2lvLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdtZW0ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3NldC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nZ2V0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdyZWFkLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdydHJhbi5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncnV0aWwubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3RyYW5zLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3cml0ZS5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd3RyYW4ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3d1dGlsLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdwcmVhZC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorCitwbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKZGlmZiAtLWdpdCBhL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmhwZ2NjIGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuaHBnY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM4NzkxYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmhwZ2NjCkBAIC0wLDAgKzEsMjM0IEBACisjIG1ha2VmaWxlIGZvciBsaWJwbmcgb24gSFAtVVggdXNpbmcgR0NDIHdpdGggdGhlIEhQIEFOU0kvQyBsaW5rZXIuCisjIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNi0yMDA4LCAyMDEwLTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCisjIENvcHlyaWdodCAoQykgMjAwMSwgTGF1cmVudCBmYWlsbGllCisjIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBHcmVnIFJvZWxvZnMKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyCisjCisjIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisjIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKworIyBMaWJyYXJ5IG5hbWU6CitMSUJOQU1FID0gbGlicG5nMTYKK1BOR01BSiA9IDE2CisKKyMgU2hhcmVkIGxpYnJhcnkgbmFtZXM6CitMSUJTTz0kKExJQk5BTUUpLnNsCitMSUJTT01BSj0kKExJQk5BTUUpLnNsLiQoUE5HTUFKKQorTElCU09SRUw9JChMSUJTT01BSikuJChSRUxFQVNFKQorT0xEU089bGlicG5nLnNsCisKKyMgVXRpbGl0aWVzOgorQ0M9Z2NjCitMRD1sZAorQVJfUkM9YXIgcmMKK01LRElSX1A9bWtkaXIgLXAKK0xOX1NGPWxuIC1zZgorUkFOTElCPXJhbmxpYgorQ1A9Y3AKK1JNX0Y9L2Jpbi9ybSAtZgorCisjIHdoZXJlICJtYWtlIGluc3RhbGwiIHB1dHMgbGlicG5nLmEsICQoT0xEU08pKiwgcG5nLmgsIHBuZ2NvbmYuaAorIyBhbmQgcG5nbGliY29uZi5oCitwcmVmaXg9L3Vzci9sb2NhbAorZXhlY19wcmVmaXg9JChwcmVmaXgpCisKKyMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZAorWkxJQkxJQj0vb3B0L3psaWIvbGliCitaTElCSU5DPS9vcHQvemxpYi9pbmNsdWRlCisKKyMgTm90ZSB0aGF0IGlmIHlvdSBwbGFuIHRvIGJ1aWxkIGEgbGlicG5nIHNoYXJlZCBsaWJyYXJ5LCB6bGliIG11c3QgYWxzbworIyBiZSBhIHNoYXJlZCBsaWJyYXJ5LCB3aGljaCB6bGliJ3MgY29uZmlndXJlIGRvZXMgbm90IGRvLiAgQWZ0ZXIgcnVubmluZworIyB6bGliJ3MgY29uZmlndXJlLCBlZGl0IHRoZSBhcHByb3ByaWF0ZSBsaW5lcyBvZiBtYWtlZmlsZSB0byByZWFkOgorIyAgIENGTEFHUz0tTzEgLURIQVZFX1VOSVNURCAtRFVTRV9NQVAgLWZQSUMgXAorIyAgIExEU0hBUkVEPWxkIC1iCisjICAgU0hBUkVETElCPWxpYnouc2wKKworQUxJR049CisjIGZvciBpMzg2OgorI0FMSUdOPS1tYWxpZ24tbG9vcHM9MiAtbWFsaWduLWZ1bmN0aW9ucz0yCisKK1dBUk5NT1JFPS1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdzaGFkb3cgXAorCS1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVd0cmFkaXRpb25hbCAtV2Nhc3QtYWxpZ24gXAorCS1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgIy1XY29udmVyc2lvbgorCisjIGZvciBwZ2NjIHZlcnNpb24gMi45NS4xLCAtTzMgaXMgYnVnZ3k7IGRvbid0IHVzZSBpdC4KKworQ1BQRkxBR1M9LUkkKFpMSUJJTkMpICMgLURQTkdfREVCVUc9NQorQ0ZMQUdTPS1XIC1XYWxsIC1PMyAtZnVucm9sbC1sb29wcyAkKEFMSUdOKSAjICQoV0FSTk1PUkUpIC1nCisjTERGTEFHUz0tTC4gLVdsLC1ycGF0aCwuIC1MJChaTElCTElCKSAtV2wsLXJwYXRoLCQoWkxJQkxJQikgLWxwbmcxNiAtbHogLWxtCitMREZMQUdTPS1MLiAtTCQoWkxJQkxJQikgLWxwbmcxNiAtbHogLWxtCisKK0lOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKK0xJQlBBVEg9JChleGVjX3ByZWZpeCkvbGliCitNQU5QQVRIPSQocHJlZml4KS9tYW4KK0JJTlBBVEg9JChleGVjX3ByZWZpeCkvYmluCisKKyMgb3ZlcnJpZGUgREVTVERJUj0gb24gdGhlIG1ha2UgaW5zdGFsbCBjb21tYW5kIGxpbmUgdG8gZWFzaWx5IHN1cHBvcnQKKyMgaW5zdGFsbGluZyBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uLiAgRXhhbXBsZToKKyMKKyMgICAgbWFrZSBpbnN0YWxsIERFU1RESVI9L3RtcC9idWlsZC9saWJwbmcKKyMKKyMgSWYgeW91J3JlIGdvaW5nIHRvIGluc3RhbGwgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbgorIyB2aWEgREVTVERJUiwgJChERVNURElSKSQocHJlZml4KSBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlCisjIHlvdSBleGVjdXRlIG1ha2UgaW5zdGFsbC4KK0RFU1RESVI9CisKK0RCPSQoREVTVERJUikkKEJJTlBBVEgpCitEST0kKERFU1RESVIpJChJTkNQQVRIKQorREw9JChERVNURElSKSQoTElCUEFUSCkKK0RNPSQoREVTVERJUikkKE1BTlBBVEgpCisKK09CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCisJcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCisJcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KKworT0JKU0RMTCA9ICQoT0JKUzoubz0ucGljLm8pCisKKy5TVUZGSVhFUzogICAgICAuYyAubyAucGljLm8KKworLmMubzoKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgLW8gJEAgJDwKKworLmMucGljLm86CisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1mUElDIC1vICRAICQqLmMKKworYWxsOiBsaWJwbmcuYSAkKExJQlNPKSBwbmd0ZXN0IGxpYnBuZy5wYyBsaWJwbmctY29uZmlnCisKK2xpYnBuZy5hOiAkKE9CSlMpCisJJChBUl9SQykgJEAgJChPQkpTKQorCSQoUkFOTElCKSAkQAorCitsaWJwbmcucGM6CisJY2F0IHNjcmlwdHMvbGlicG5nLnBjLmluIHwgc2VkIC1lIHMhQHByZWZpeEAhJChwcmVmaXgpISBcCisJLWUgcyFAZXhlY19wcmVmaXhAISQoZXhlY19wcmVmaXgpISBcCisJLWUgcyFAbGliZGlyQCEkKExJQlBBVEgpISBcCisJLWUgcyFAaW5jbHVkZWRpckAhJChJTkNQQVRIKSEgXAorCS1lIHMhLWxwbmcxNiEtbHBuZzE2XCAtbHpcIC1sbSEgPiBsaWJwbmcucGMKKworbGlicG5nLWNvbmZpZzoKKwkoIGNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbjsgXAorCWVjaG8gcHJlZml4PVwiJChwcmVmaXgpXCI7IFwKKwllY2hvIElfb3B0cz1cIi1JJChJTkNQQVRIKS8kKExJQk5BTUUpXCI7IFwKKwllY2hvIGxpYnM9XCItbHBuZzE2IC1seiAtbG1cIjsgXAorCWNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctYm9keS5pbiApID4gbGlicG5nLWNvbmZpZworCWNobW9kICt4IGxpYnBuZy1jb25maWcKKworJChMSUJTTyk6ICQoTElCU09NQUopCisJJChMTl9TRikgJChMSUJTT01BSikgJChMSUJTTykKKworJChMSUJTT01BSik6ICQoT0JKU0RMTCkKKwkkKExEKSAtYiArcyBcCisJK2ggJChMSUJTT01BSikgLW8gJChMSUJTT01BSikgJChPQkpTRExMKQorCitwbmd0ZXN0OiBwbmd0ZXN0Lm8gJChMSUJTTykKKwkkKENDKSAtbyBwbmd0ZXN0ICQoQ0ZMQUdTKSBwbmd0ZXN0Lm8gJChMREZMQUdTKQorCit0ZXN0OiBwbmd0ZXN0CisJLi9wbmd0ZXN0CisKKworaW5zdGFsbC1oZWFkZXJzOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCisJLUBpZiBbICEgLWQgJChESSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpOyBmaQorCS1AaWYgWyAhIC1kICQoREkpLyQoTElCTkFNRSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpLyQoTElCTkFNRSk7IGZpCisJY3AgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCAkKERJKS8kKExJQk5BTUUpCisJY2htb2QgNjQ0ICQoREkpLyQoTElCTkFNRSkvcG5nLmggJChESSkvJChMSUJOQU1FKS9wbmdjb25mLmggJChESSkvJChMSUJOQU1FKS9wbmdsaWJjb25mLmgKKwktQCQoUk1fRikgJChESSkvcG5nLmggJChESSkvcG5nY29uZi5oICQoREkpL3BuZ2xpYmNvbmYuaAorCS1AJChSTV9GKSAkKERJKS9saWJwbmcKKwkoY2QgJChESSk7ICQoTE5fU0YpICQoTElCTkFNRSkgbGlicG5nOyAkKExOX1NGKSAkKExJQk5BTUUpLyogLikKKworaW5zdGFsbC1zdGF0aWM6IGluc3RhbGwtaGVhZGVycyBsaWJwbmcuYQorCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKKwljcCBsaWJwbmcuYSAkKERMKS8kKExJQk5BTUUpLmEKKwljaG1vZCA2NDQgJChETCkvJChMSUJOQU1FKS5hCisJLUAkKFJNX0YpICQoREwpL2xpYnBuZy5hCisJKGNkICQoREwpOyAkKExOX1NGKSAkKExJQk5BTUUpLmEgbGlicG5nLmEpCisKK2luc3RhbGwtc2hhcmVkOiBpbnN0YWxsLWhlYWRlcnMgJChMSUJTT01BSikgbGlicG5nLnBjCisJLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQorCS1AJChSTV9GKSAkKERMKS8kKExJQlNPKQorCS1AJChSTV9GKSAkKERMKS8kKExJQlNPUkVMKQorCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPKQorCWNwICQoTElCU09NQUopICQoREwpLyQoTElCU09SRUwpCisJY2htb2QgNzU1ICQoREwpLyQoTElCU09SRUwpCisJKGNkICQoREwpOyBcCisJJChMTl9TRikgJChMSUJTT1JFTCkgJChMSUJTTyk7IFwKKwkkKExOX1NGKSAkKExJQlNPKSAkKE9MRFNPKSkKKwktQGlmIFsgISAtZCAkKERMKS9wa2djb25maWcgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpL3BrZ2NvbmZpZzsgZmkKKwktQCQoUk1fRikgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKKwktQCQoUk1fRikgJChETCkvcGtnY29uZmlnL2xpYnBuZy5wYworCWNwIGxpYnBuZy5wYyAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYworCWNobW9kIDY0NCAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYworCShjZCAkKERMKS9wa2djb25maWc7ICQoTE5fU0YpICQoTElCTkFNRSkucGMgbGlicG5nLnBjKQorCitpbnN0YWxsLW1hbjogbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQorCS1AaWYgWyAhIC1kICQoRE0pIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKTsgZmkKKwktQGlmIFsgISAtZCAkKERNKS9tYW4zIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW4zOyBmaQorCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZy4zCisJLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5ncGYuMworCWNwIGxpYnBuZy4zICQoRE0pL21hbjMKKwljcCBsaWJwbmdwZi4zICQoRE0pL21hbjMKKwktQGlmIFsgISAtZCAkKERNKS9tYW41IF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW41OyBmaQorCS1AJChSTV9GKSAkKERNKS9tYW41L3BuZy41CisJY3AgcG5nLjUgJChETSkvbWFuNQorCitpbnN0YWxsLWNvbmZpZzogbGlicG5nLWNvbmZpZworCS1AaWYgWyAhIC1kICQoREIpIF07IHRoZW4gJChNS0RJUl9QKSAkKERCKTsgZmkKKwktQCQoUk1fRikgJChEQikvbGlicG5nLWNvbmZpZworCS1AJChSTV9GKSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZworCWNwIGxpYnBuZy1jb25maWcgJChEQikvJChMSUJOQU1FKS1jb25maWcKKwljaG1vZCA3NTUgJChEQikvJChMSUJOQU1FKS1jb25maWcKKwkoY2QgJChEQik7ICQoTE5fU0YpICQoTElCTkFNRSktY29uZmlnIGxpYnBuZy1jb25maWcpCisKK2luc3RhbGw6IGluc3RhbGwtc3RhdGljIGluc3RhbGwtc2hhcmVkIGluc3RhbGwtbWFuIGluc3RhbGwtY29uZmlnCisKKyMgSWYgeW91IGluc3RhbGxlZCBpbiAkKERFU1RESVIpLCB0ZXN0LWluc3RhbGxlZCB3b24ndCB3b3JrIHVudGlsIHlvdQorIyBtb3ZlIHRoZSBsaWJyYXJ5IHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4gIFVzZSB0ZXN0LWRkIHRvIHRlc3QgaXQKKyMgYmVmb3JlIHRoZW4uCisKK3Rlc3QtZGQ6CisJZWNobworCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeSBpbiAkKERMKS4KKwkkKENDKSAtSSQoREkpICQoQ1BQRkxBR1MpIFwKKwkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKKwkgICAtTCQoREwpIC1MJChaTElCTElCKSAtV2wsLXJwYXRoLCQoREwpIC1XbCwtcnBhdGgsJChaTElCTElCKSBcCisJICAgLW8gcG5ndGVzdGQgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAorCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKKwordGVzdC1pbnN0YWxsZWQ6CisJZWNobworCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeS4KKwkkKENDKSAkKENQUEZMQUdTKSBcCisJICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCisJICAgLUwkKFpMSUJMSUIpIC1XbCwtcnBhdGgsJChaTElCTElCKSBcCisJICAgLW8gcG5ndGVzdGkgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAorCS4vcG5ndGVzdGkgcG5ndGVzdC5wbmcKKworY2xlYW46CisJJChSTV9GKSAqLm8gbGlicG5nLmEgcG5ndGVzdCBwbmd0ZXN0aSBwbmdvdXQucG5nIFwKKwlsaWJwbmctY29uZmlnICQoTElCU08pICQoTElCU09NQUopKiBcCisJbGlicG5nLnBjIHBuZ2xpYmNvbmYuaAorCitET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTword3JpdGVsb2NrOgorCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgorCisjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCisKK3BuZy5vIHBuZy5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ2Vycm9yLm8gcG5nZXJyb3IucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdyaW8ubyBwbmdyaW8ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3aW8ubyBwbmd3aW8ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdtZW0ubyBwbmdtZW0ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdzZXQubyBwbmdzZXQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdnZXQubyBwbmdnZXQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdyZWFkLm8gcG5ncmVhZC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3J0cmFuLm8gcG5ncnRyYW4ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdydXRpbC5vIHBuZ3J1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ndHJhbnMubyBwbmd0cmFucy5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3dyaXRlLm8gcG5nd3JpdGUucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3dHJhbi5vIHBuZ3d0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd3V0aWwubyBwbmd3dXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3ByZWFkLm8gcG5ncHJlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisKK3BuZ3Rlc3QubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaApkaWZmIC0tZ2l0IGEvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuaHB1eCBiL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmhwdXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA3NjEyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmhwdXgKQEAgLTAsMCArMSwyMjkgQEAKKyMgbWFrZWZpbGUgZm9yIGxpYnBuZywgSFBVWCAoMTAuMjAgYW5kIDExLjAwKSB1c2luZyB0aGUgQU5TSS9DIHByb2R1Y3QuCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDAyLCAyMDA2LCAyMDEwLTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCisjIENvcHlyaWdodCAoQykgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIKKyMgY29udHJpYnV0ZWQgYnkgSmltIFJpY2UgYW5kIHVwZGF0ZWQgYnkgQ2hyaXMgU2NobGVpY2hlciwgSGV3bGV0dCBQYWNrYXJkCisjCisjIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisjIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKworIyBXaGVyZSB0aGUgemxpYiBsaWJyYXJ5IGFuZCBpbmNsdWRlIGZpbGVzIGFyZSBsb2NhdGVkCitaTElCTElCPS9vcHQvemxpYi9saWIKK1pMSUJJTkM9L29wdC96bGliL2luY2x1ZGUKKworIyBOb3RlIHRoYXQgaWYgeW91IHBsYW4gdG8gYnVpbGQgYSBsaWJwbmcgc2hhcmVkIGxpYnJhcnksIHpsaWIgbXVzdCBhbHNvCisjIGJlIGEgc2hhcmVkIGxpYnJhcnksIHdoaWNoIHpsaWIncyBjb25maWd1cmUgZG9lcyBub3QgZG8uICBBZnRlciBydW5uaW5nCisjIHpsaWIncyBjb25maWd1cmUsIGVkaXQgdGhlIGFwcHJvcHJpYXRlIGxpbmVzIG9mIG1ha2VmaWxlIHRvIHJlYWQ6CisjICAgQ1BQRkxBR1M9LURIQVZFX1VOSVNURCAtRFVTRV9NQVAKKyMgICBDRkxBR1M9LU8xIC1mUElDCisjICAgTERTSEFSRUQ9bGQgLWIKKyMgICBTSEFSRURMSUI9bGliei5zbAorCisjIExpYnJhcnkgbmFtZToKK0xJQk5BTUUgPSBsaWJwbmcxNgorUE5HTUFKID0gMTYKKworIyBTaGFyZWQgbGlicmFyeSBuYW1lczoKK0xJQlNPPSQoTElCTkFNRSkuc2wKK0xJQlNPTUFKPSQoTElCTkFNRSkuc2wuJChQTkdNQUopCitMSUJTT1JFTD0kKExJQlNPTUFKKS4kKFJFTEVBU0UpCitPTERTTz1saWJwbmcuc2wKKworIyBVdGlsaXRpZXM6CitBUl9SQz1hciByYworQ0M9Y2MKK01LRElSX1A9bWtkaXIgLXAKK0xOX1NGPWxuIC1zZgorUkFOTElCPXJhbmxpYgorUk1fRj0vYmluL3JtIC1mCisKKyMgd2hlcmUgbWFrZSBpbnN0YWxsIHB1dHMgbGlicG5nLmEsIGxpYnBuZzE2LnNsLCBhbmQgcG5nLmgKK3ByZWZpeD0vb3B0L2xpYnBuZworZXhlY19wcmVmaXg9JChwcmVmaXgpCitJTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCitMSUJQQVRIPSQoZXhlY19wcmVmaXgpL2xpYgorTUFOUEFUSD0kKHByZWZpeCkvbWFuCitCSU5QQVRIPSQoZXhlY19wcmVmaXgpL2JpbgorCitDUFBGTEFHUz0tSSQoWkxJQklOQykKK0NGTEFHUz0tTyAtQWUgK0RBMS4xICtEUzIuMAorIyBDYXV0aW9uOiBiZSBzdXJlIHlvdSBoYXZlIGJ1aWx0IHpsaWIgd2l0aCB0aGUgc2FtZSBDRkxBR1MuCitDQ0ZMQUdTPS1PIC1BZSArREExLjEgK0RTMi4wCitMREZMQUdTPS1MLiAtTCQoWkxJQkxJQikgLWxwbmcgLWx6IC1sbQorCisjIG92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0CisjIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6CisjCisjICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCisjCisjIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KKyMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQorIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCitERVNURElSPQorCitEQj0kKERFU1RESVIpJChCSU5QQVRIKQorREk9JChERVNURElSKSQoSU5DUEFUSCkKK0RMPSQoREVTVERJUikkKExJQlBBVEgpCitETT0kKERFU1RESVIpJChNQU5QQVRIKQorCisjIFByZS1idWlsdCBjb25maWd1cmF0aW9uCisjIFNlZSBzY3JpcHRzL3BuZ2xpYmNvbmYubWFrIGZvciBtb3JlIG9wdGlvbnMKK1BOR0xJQkNPTkZfSF9QUkVCVUlMVCA9IHNjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0CisKK09CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCisJcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCisJcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KKworT0JKU0RMTCA9ICQoT0JKUzoubz0ucGljLm8pCisKKy5TVUZGSVhFUzoJLmMgLm8gLnBpYy5vCisKKy5jLm86CisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1vICRAICQ8CisKKy5jLnBpYy5vOgorCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAreiAtbyAkQCAkKi5jCisKK2FsbDogbGlicG5nLmEgJChMSUJTTykgcG5ndGVzdCBsaWJwbmcucGMgbGlicG5nLWNvbmZpZworCitwbmdsaWJjb25mLmg6ICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKQorCSQoQ1ApICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKSAkQAorCitsaWJwbmcuYTogJChPQkpTKQorCSQoQVJfUkMpICRAICQoT0JKUykKKwkkKFJBTkxJQikgJEAKKworbGlicG5nLnBjOgorCWNhdCBzY3JpcHRzL2xpYnBuZy5wYy5pbiB8IHNlZCAtZSBzIUBwcmVmaXhAISQocHJlZml4KSEgXAorCS1lIHMhQGV4ZWNfcHJlZml4QCEkKGV4ZWNfcHJlZml4KSEgXAorCS1lIHMhQGxpYmRpckAhJChMSUJQQVRIKSEgXAorCS1lIHMhQGluY2x1ZGVkaXJAISQoSU5DUEFUSCkhIFwKKwktZSBzIS1scG5nMTYhLWxwbmcxNlwgLWx6XCAtbG0hID4gbGlicG5nLnBjCisKK2xpYnBuZy1jb25maWc6CisJKCBjYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWhlYWQuaW47IFwKKwllY2hvIHByZWZpeD1cIiQocHJlZml4KVwiOyBcCisJZWNobyBJX29wdHM9XCItSSQoSU5DUEFUSCkvJChMSUJOQU1FKVwiOyBcCisJZWNobyBjY29wdHM9XCItTyAtQWUgK0RBMS4xICtEUzIuMFwiOyBcCisJZWNobyBMX29wdHM9XCItTCQoTElCUEFUSClcIjsgXAorCWVjaG8gbGlicz1cIi1scG5nMTYgLWx6IC1sbVwiOyBcCisJY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1ib2R5LmluICkgPiBsaWJwbmctY29uZmlnCisJY2htb2QgK3ggbGlicG5nLWNvbmZpZworCiskKExJQlNPKTogJChMSUJTT01BSikKKwkkKExOX1NGKSAkKExJQlNPTUFKKSAkKExJQlNPKQorCiskKExJQlNPTUFKKTogJChPQkpTRExMKQorCSQoTEQpIC1iICtzIFwKKwkraCAkKExJQlNPTUFKKSAtbyAkKExJQlNPTUFKKSAkKE9CSlNETEwpCisKK3BuZ3Rlc3Q6IHBuZ3Rlc3QubyBsaWJwbmcuYQorCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDQ0ZMQUdTKSBwbmd0ZXN0Lm8gJChMREZMQUdTKQorCit0ZXN0OiBwbmd0ZXN0CisJLi9wbmd0ZXN0CisKK2luc3RhbGwtaGVhZGVyczogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaAorCS1AaWYgWyAhIC1kICQoREkpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKTsgZmkKKwktQGlmIFsgISAtZCAkKERJKS8kKExJQk5BTUUpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKS8kKExJQk5BTUUpOyBmaQorCWNwIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggJChESSkvJChMSUJOQU1FKQorCWNobW9kIDY0NCAkKERJKS8kKExJQk5BTUUpL3BuZy5oICQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oICQoREkpLyQoTElCTkFNRSkvcG5nbGliY29uZi5oCisJLUAkKFJNX0YpICQoREkpL3BuZy5oICQoREkpL3BuZ2NvbmYuaCAkKERJKS9wbmdsaWJjb25mLmgKKwktQCQoUk1fRikgJChESSkvbGlicG5nCisJKGNkICQoREkpOyAkKExOX1NGKSAkKExJQk5BTUUpIGxpYnBuZzsgJChMTl9TRikgJChMSUJOQU1FKS8qIC4pCisKK2luc3RhbGwtc3RhdGljOiBpbnN0YWxsLWhlYWRlcnMgbGlicG5nLmEKKwktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCisJY3AgbGlicG5nLmEgJChETCkvJChMSUJOQU1FKS5hCisJY2htb2QgNjQ0ICQoREwpLyQoTElCTkFNRSkuYQorCS1AJChSTV9GKSAkKERMKS9saWJwbmcuYQorCShjZCAkKERMKTsgJChMTl9TRikgJChMSUJOQU1FKS5hIGxpYnBuZy5hKQorCitpbnN0YWxsLXNoYXJlZDogaW5zdGFsbC1oZWFkZXJzICQoTElCU09NQUopIGxpYnBuZy5wYworCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKKwktQCQoUk1fRikgJChETCkvJChMSUJTTykKKwktQCQoUk1fRikgJChETCkvJChMSUJTT1JFTCkKKwktQCQoUk1fRikgJChETCkvJChPTERTTykKKwljcCAkKExJQlNPTUFKKSAkKERMKS8kKExJQlNPUkVMKQorCWNobW9kIDc1NSAkKERMKS8kKExJQlNPUkVMKQorCShjZCAkKERMKTsgXAorCSQoTE5fU0YpICQoTElCU09SRUwpICQoTElCU08pOyBcCisJJChMTl9TRikgJChMSUJTTykgJChPTERTTykpCisJLUBpZiBbICEgLWQgJChETCkvcGtnY29uZmlnIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKS9wa2djb25maWc7IGZpCisJLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCisJLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy9saWJwbmcucGMKKwljcCBsaWJwbmcucGMgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKKwljaG1vZCA2NDQgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKKwkoY2QgJChETCkvcGtnY29uZmlnOyAkKExOX1NGKSAkKExJQk5BTUUpLnBjIGxpYnBuZy5wYykKKworaW5zdGFsbC1tYW46IGxpYnBuZy4zIGxpYnBuZ3BmLjMgcG5nLjUKKwktQGlmIFsgISAtZCAkKERNKSBdOyB0aGVuICQoTUtESVJfUCkgJChETSk7IGZpCisJLUBpZiBbICEgLWQgJChETSkvbWFuMyBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuMzsgZmkKKwktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmcuMworCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZ3BmLjMKKwljcCBsaWJwbmcuMyAkKERNKS9tYW4zCisJY3AgbGlicG5ncGYuMyAkKERNKS9tYW4zCisJLUBpZiBbICEgLWQgJChETSkvbWFuNSBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuNTsgZmkKKwktQCQoUk1fRikgJChETSkvbWFuNS9wbmcuNQorCWNwIHBuZy41ICQoRE0pL21hbjUKKworaW5zdGFsbC1jb25maWc6IGxpYnBuZy1jb25maWcKKwktQGlmIFsgISAtZCAkKERCKSBdOyB0aGVuICQoTUtESVJfUCkgJChEQik7IGZpCisJLUAkKFJNX0YpICQoREIpL2xpYnBuZy1jb25maWcKKwktQCQoUk1fRikgJChEQikvJChMSUJOQU1FKS1jb25maWcKKwljcCBsaWJwbmctY29uZmlnICQoREIpLyQoTElCTkFNRSktY29uZmlnCisJY2htb2QgNzU1ICQoREIpLyQoTElCTkFNRSktY29uZmlnCisJKGNkICQoREIpOyAkKExOX1NGKSAkKExJQk5BTUUpLWNvbmZpZyBsaWJwbmctY29uZmlnKQorCitpbnN0YWxsOiBpbnN0YWxsLXN0YXRpYyBpbnN0YWxsLXNoYXJlZCBpbnN0YWxsLW1hbiBpbnN0YWxsLWNvbmZpZworCisjIElmIHlvdSBpbnN0YWxsZWQgaW4gJChERVNURElSKSwgdGVzdC1pbnN0YWxsZWQgd29uJ3Qgd29yayB1bnRpbCB5b3UKKyMgbW92ZSB0aGUgbGlicmFyeSB0byBpdHMgZmluYWwgbG9jYXRpb24uICBVc2UgdGVzdC1kZCB0byB0ZXN0IGl0CisjIGJlZm9yZSB0aGVuLgorCit0ZXN0LWRkOgorCWVjaG8KKwllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkgaW4gJChETCkuCisJJChDQykgLUkkKERJKSAkKENQUEZMQUdTKSAkKENDRkxBR1MpIFwKKwkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKKwkgICAtTCQoREwpIC1MJChaTElCTElCKSBcCisJICAgLW8gcG5ndGVzdGQgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAorCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKKwordGVzdC1pbnN0YWxsZWQ6CisJZWNobworCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeS4KKwkkKENDKSAkKENQUEZMQUdTKSAkKENDRkxBR1MpIFwKKwkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKKwkgICAtTCQoWkxJQkxJQikgXAorCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKKwkuL3BuZ3Rlc3RpIHBuZ3Rlc3QucG5nCisKK2NsZWFuOgorCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5ndGVzdGkgcG5nb3V0LnBuZyBcCisJbGlicG5nLWNvbmZpZyAkKExJQlNPKSAkKExJQlNPTUFKKSogXAorCWxpYnBuZy5wYyBwbmdsaWJjb25mLmgKKworRE9DUyA9IEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8KK3dyaXRlbG9jazoKKwljaG1vZCBhLXcgKi5bY2gzNV0gJChET0NTKSBzY3JpcHRzLyoKKworIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgorCitwbmcubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ2Vycm9yLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdyaW8ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3dpby5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nbWVtLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdzZXQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ2dldC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncmVhZC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncnRyYW4ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3J1dGlsLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd0cmFucy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd3JpdGUubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3d0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3dXRpbC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncHJlYWQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKworcG5ndGVzdC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCmRpZmYgLS1naXQgYS9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5pYm1jIGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuaWJtYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWIxMTk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuaWJtYwpAQCAtMCwwICsxLDkwIEBACisjIE1ha2VmaWxlIGZvciBsaWJwbmcgKHN0YXRpYykKKyMgSUJNIEMgdmVyc2lvbiAzLnggZm9yIFdpbjMyIGFuZCBPUy8yCisjIENvcHlyaWdodCAoQykgMjAwNiwgMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyMgQ29weXJpZ2h0IChDKSAyMDAwIENvc21pbiBUcnV0YQorIworIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisjIGFuZCBsaWNlbnNlIGluIHBuZy5oCisjCisjIE5vdGVzOgorIyAgIERlcml2ZWQgZnJvbSBtYWtlZmlsZS5zdGQKKyMgICBBbGwgbW9kdWxlcyBhcmUgY29tcGlsZWQgaW4gQyBtb2RlCisjICAgVGVzdGVkIHVuZGVyIFdpbjMyLCBleHBlY3RlZCB0byB3b3JrIHVuZGVyIE9TLzIKKyMgICBDYW4gYmUgZWFzaWx5IGFkYXB0ZWQgZm9yIElCTSBWaXN1YWxBZ2UvQysrIGZvciBBSVgKKworIyBMb2NhdGlvbiBvZiB0aGUgemxpYiBsaWJyYXJ5IGFuZCBpbmNsdWRlIGZpbGVzCitaTElCSU5DID0gLi4vemxpYgorWkxJQkxJQiA9IC4uL3psaWIKKworIyBDb21waWxlciwgbGlua2VyLCBsaWIgYW5kIG90aGVyIHRvb2xzCitDQyA9IGljYworTEQgPSBpbGluaworQVIgPSBpbGliCitDUCA9IGNvcHkKK1JNID0gZGVsCisKK0NQUEZMQUdTID0gLUkkKFpMSUJJTkMpCitDRkxBR1MgPSAtTWMgLU8yIC1XMworTERGTEFHUyA9CisKKyMgUHJlLWJ1aWx0IGNvbmZpZ3VyYXRpb24KKyMgU2VlIHNjcmlwdHMvcG5nbGliY29uZi5tYWsgZm9yIG1vcmUgb3B0aW9ucworUE5HTElCQ09ORl9IX1BSRUJVSUxUID0gc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQKKworIyBGaWxlIGV4dGVuc2lvbnMKK089Lm9iagorQT0ubGliCitFPS5leGUKKworIyBWYXJpYWJsZXMKK09CSlMgPSBwbmckKE8pIHBuZ2Vycm9yJChPKSBwbmdnZXQkKE8pIHBuZ21lbSQoTykgcG5ncHJlYWQkKE8pIFwKKwlwbmdyZWFkJChPKSBwbmdyaW8kKE8pIHBuZ3J0cmFuJChPKSBwbmdydXRpbCQoTykgcG5nc2V0JChPKSBcCisJcG5ndHJhbnMkKE8pIHBuZ3dpbyQoTykgcG5nd3JpdGUkKE8pIHBuZ3d0cmFuJChPKSBwbmd3dXRpbCQoTykKKworTElCUyA9IGxpYnBuZyQoQSkgJChaTElCTElCKS96bGliJChBKQorCisjIFRhcmdldHMKKy5jJChPKToKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJDwKKworYWxsOiBsaWJwbmckKEEpIHBuZ3Rlc3QkKEUpCisKK3BuZ2xpYmNvbmYuaDogJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpCisJJChDUCkgJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpICRACisKK2xpYnBuZyQoQSk6ICQoT0JKUykKKwkkKEFSKSAtb3V0OiRAICQoT0JKUykKKwordGVzdDogcG5ndGVzdCQoRSkKKwlwbmd0ZXN0JChFKQorCitwbmd0ZXN0OiBwbmd0ZXN0JChFKQorCitwbmd0ZXN0JChFKTogcG5ndGVzdCQoTykgbGlicG5nJChBKQorCSQoTEQpICQoTERGTEFHUykgcG5ndGVzdCQoTykgJChMSUJTKQorCitjbGVhbjoKKwkkKFJNKSAqJChPKQorCSQoUk0pIGxpYnBuZyQoQSkKKwkkKFJNKSBwbmdsaWJjb25mLmgKKwkkKFJNKSBwbmd0ZXN0JChFKQorCSQoUk0pIHBuZ291dC5wbmcKKworcG5nJChPKTogICAgICBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nZXJyb3IkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nZ2V0JChPKTogICBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nbWVtJChPKTogICBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncHJlYWQkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncmVhZCQoTyk6ICBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncmlvJChPKTogICBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncnRyYW4kKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncnV0aWwkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nc2V0JChPKTogICBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ndHJhbnMkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd2lvJChPKTogICBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd3JpdGUkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd3RyYW4kKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd3V0aWwkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorCitwbmd0ZXN0JChPKTogIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKZGlmZiAtLWdpdCBhL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmludGVsIGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuaW50ZWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE4NzI2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmludGVsCkBAIC0wLDAgKzEsMTE1IEBACisjIE1ha2VmaWxlIGZvciBsaWJwbmcKKyMgTWljcm9zb2Z0IFZpc3VhbCBDKysgd2l0aCBJbnRlbCBDL0MrKyBDb21waWxlciA0LjAgYW5kIGxhdGVyCisKKyMgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDE0IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDAsIFBhd2VsIE1yb2NoZW4sIGJhc2VkIG9uIG1ha2VmaWxlLm1zYyB3aGljaCBpcworIyBjb3B5cmlnaHQgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KKyMKKyMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorIyBhbmQgbGljZW5zZSBpbiBwbmcuaAorIworIyBUbyB1c2UsIGRvICJubWFrZSAvZiBzY3JpcHRzXG1ha2VmaWxlLmludGVsIgorIworIyAtLS0tLS0tLS0tLS0tLS0tLS0tIEludGVsIEMvQysrIENvbXBpbGVyIDQuMCBhbmQgbGF0ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKK1pMSUJMSUI9Li5cemxpYgorWkxJQklOQz0uLlx6bGliCisKKyMgVGFyZ2V0IENQVQorQ1BVPTYJCSMgUGVudGl1bSBJSQorI0NQVT01CQkjIFBlbnRpdW0KKworIyBDYWxsaW5nIGNvbnZlbnRpb24KK0NBTExJTkc9cgkjIF9fZmFzdGNhbGwKKyNDQUxMSU5HPXoJIyBfX3N0ZGNhbGwKKyNDQUxMSU5HPWQJIyBfX2NkZWNsCisKKyMgVW5jb21tZW50IG5leHQgdG8gcHV0IGVycm9yIG1lc3NhZ2VzIGluIGEgZmlsZQorI0VSUkZJTEU9Pj5wbmdlcnJzCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ0M9aWNsIC1jCitDUFBGTEFHUz0tSSQoWkxJQklOQykKK0NGTEFHUz0tTzIgLUckKENQVSkkKENBTExJTkcpIC1RaXAgLVF1bnJvbGw0IC1ub2xvZ28KK0xEPWxpbmsKK0xERkxBR1M9L1NVQlNZU1RFTTpDT05TT0xFIC9OT0xPR08KK0NQPWNwCisKKyMgUHJlLWJ1aWx0IGNvbmZpZ3VyYXRpb24KKyMgU2VlIHNjcmlwdHNccG5nbGliY29uZi5tYWsgZm9yIG1vcmUgb3B0aW9ucworUE5HTElCQ09ORl9IX1BSRUJVSUxUID0gc2NyaXB0c1xwbmdsaWJjb25mLmgucHJlYnVpbHQKKworTz0ub2JqCisKK09CSlM9cG5nJChPKSBwbmdzZXQkKE8pIHBuZ2dldCQoTykgcG5ncnV0aWwkKE8pIHBuZ3RyYW5zJChPKSBwbmd3dXRpbCQoTykgXAorcG5nbWVtJChPKSBwbmdwcmVhZCQoTykgcG5ncmVhZCQoTykgcG5nZXJyb3IkKE8pIHBuZ3dyaXRlJChPKSBcCitwbmdydHJhbiQoTykgcG5nd3RyYW4kKE8pIHBuZ3JpbyQoTykgcG5nd2lvJChPKQorCithbGw6IHRlc3QKKworcG5nbGliY29uZi5oOiAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkKKwkkKENQKSAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkgJEAKKworcG5nJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKwkkKENDKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCisKK3BuZ3NldCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQorCitwbmdnZXQkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorCSQoQ0MpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKKworcG5ncmVhZCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQorCitwbmdwcmVhZCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQorCitwbmdydHJhbiQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQorCitwbmdydXRpbCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQorCitwbmdlcnJvciQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQorCitwbmdtZW0kKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorCSQoQ0MpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKKworcG5ncmlvJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKwkkKENDKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCisKK3BuZ3dpbyQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQorCitwbmd0cmFucyQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQorCitwbmd3cml0ZSQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQorCitwbmd3dHJhbiQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQorCitwbmd3dXRpbCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQorCitsaWJwbmcubGliOiAkKE9CSlMpCisJaWYgZXhpc3QgbGlicG5nLmxpYiBkZWwgbGlicG5nLmxpYgorCWxpYiAvTk9MT0dPIC9PVVQ6bGlicG5nLmxpYiAkKE9CSlMpCisKK3BuZ3Rlc3QuZXhlOiBwbmd0ZXN0Lm9iaiBsaWJwbmcubGliCisJJChMRCkgJChMREZMQUdTKSAvT1VUOnBuZ3Rlc3QuZXhlIHBuZ3Rlc3Qub2JqIGxpYnBuZy5saWIgJChaTElCTElCKVx6bGliLmxpYgorCitwbmd0ZXN0JChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaAorCSQoQ0MpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKKwordGVzdDogcG5ndGVzdC5leGUKKwlwbmd0ZXN0LmV4ZQorCisKKyMgRW5kIG9mIG1ha2VmaWxlIGZvciBsaWJwbmcKZGlmZiAtLWdpdCBhL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmtuciBiL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmtucgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGRlMDY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUua25yCkBAIC0wLDAgKzEsMTE2IEBACisjIG1ha2VmaWxlIGZvciBsaWJwbmcKKyMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA2LCAyMDA5LCAyMDE0IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorIyBDb3B5cmlnaHQgKEMpIDE5OTUgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuCisjCisjIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisjIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKyMKKyMgVGhpcyBtYWtlZmlsZSByZXF1aXJlcyB0aGUgZmlsZSBhbnNpMmtuci5jLCB3aGljaCB5b3UgY2FuIGdldAorIyBmcm9tIHRoZSBHaG9zdHNjcmlwdCBmdHAgc2l0ZSBhdCBmdHA6Ly9mdHAuY3Mud2lzYy5lZHUvZ2hvc3QvCisjIElmIHlvdSBoYXZlIGxpYmpwZWcsIHlvdSBwcm9iYWJseSBhbHJlYWR5IGhhdmUgYW5zaTJrbnIuYyBpbiB0aGUganBlZworIyBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCisjIHdoZXJlIG1ha2UgaW5zdGFsbCBwdXRzIGxpYnBuZy5hIGFuZCBwbmcuaAorcHJlZml4PS91c3IvbG9jYWwKK0lOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKK0xJQlBBVEg9JChwcmVmaXgpL2xpYgorCisjIG92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0CisjIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6CisjCisjICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCisjCisjIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KKyMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQorIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCitERVNURElSPQorCitDQyA9IGNjCitDUFBGTEFHUyA9IC1JLi4vemxpYgorQ0ZMQUdTID0gLU8KK0xERkxBR1MgPSAtTC4gLUwuLi96bGliLyAtbHBuZyAtbHogLWxtCisjIGZsYWdzIGZvciBhbnNpMmtucgorQU5TSTJLTlJGTEFHUz0KKworUkFOTElCID0gcmFubGliCisjUkFOTElCID0gZWNobworCitDUCA9IGNwCitSTV9GID0gcm0gLWYKKworIyBQcmUtYnVpbHQgY29uZmlndXJhdGlvbgorIyBTZWUgc2NyaXB0cy9wbmdsaWJjb25mLm1hayBmb3IgbW9yZSBvcHRpb25zCitQTkdMSUJDT05GX0hfUFJFQlVJTFQgPSBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdAorCitPQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAorCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAorCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCisKK2FsbDogYW5zaTJrbnIgbGlicG5nLmEgcG5ndGVzdAorCitwbmdsaWJjb25mLmg6ICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKQorCSQoQ1ApICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKSAkQAorCisjIGdlbmVyYWwgcnVsZSB0byBhbGxvdyBhbnNpMmtuciB0byB3b3JrCisuYy5vOgorCS4vYW5zaTJrbnIgJCouYyBUJCouYworCSQoQ0MpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtYyBUJCouYworCXJtIC1mIFQkKi5jICQqLm8KKwltdiBUJCoubyAkKi5vCisKK2Fuc2kya25yOiBhbnNpMmtuci5jCisJJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoQU5TSTJLTlJGTEFHUykgLW8gYW5zaTJrbnIgYW5zaTJrbnIuYworCitsaWJwbmcuYTogYW5zaTJrbnIgJChPQkpTKQorCWFyIHJjICRAICAkKE9CSlMpCisJJChSQU5MSUIpICRACisKK3BuZ3Rlc3Q6IHBuZ3Rlc3QubyBsaWJwbmcuYQorCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCisKK3Rlc3Q6IHBuZ3Rlc3QKKwkuL3BuZ3Rlc3QKKworaW5zdGFsbDogbGlicG5nLmEgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaAorCS1AbWtkaXIgJChERVNURElSKSQoSU5DUEFUSCkKKwktQG1rZGlyICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZworCS1AbWtkaXIgJChERVNURElSKSQoTElCUEFUSCkKKwktQHJtIC1mICQoREVTVERJUikkKElOQ1BBVEgpL3BuZy5oCisJLUBybSAtZiAkKERFU1RESVIpJChJTkNQQVRIKS9wbmdjb25mLmgKKwljcCBwbmcuaCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcKKwljcCBwbmdjb25mLmggJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nCisJY3AgcG5nbGliY29uZi5oICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZworCWNobW9kIDY0NCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcvcG5nLmgKKwljaG1vZCA2NDQgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nL3BuZ2NvbmYuaAorCWNobW9kIDY0NCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcvcG5nbGliY29uZi5oCisJKGNkICQoREVTVERJUikkKElOQ1BBVEgpOyBsbiAtZiAtcyBsaWJwbmcvKiAuKQorCWNwIGxpYnBuZy5hICQoREVTVERJUikkKExJQlBBVEgpCisJY2htb2QgNjQ0ICQoREVTVERJUikkKExJQlBBVEgpL2xpYnBuZy5hCisKK2NsZWFuOgorCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5nb3V0LnBuZyBhbnNpMmtuciBwbmdsaWJjb25mLmgKKworRE9DUyA9IEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8KK3dyaXRlbG9jazoKKwljaG1vZCBhLXcgKi5bY2gzNV0gJChET0NTKSBzY3JpcHRzLyoKKworIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgorCitwbmcubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ2Vycm9yLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdyaW8ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3dpby5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nbWVtLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdzZXQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ2dldC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncmVhZC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncHJlYWQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3J0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdydXRpbC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ndHJhbnMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3dyaXRlLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3dHJhbi5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd3V0aWwubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKworcG5ndGVzdC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCmRpZmYgLS1naXQgYS9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5saW51eCBiL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmxpbnV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZGRhODUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5saW51eApAQCAtMCwwICsxLDI0NyBAQAorIyBtYWtlZmlsZSBmb3IgbGlicG5nLmEgYW5kIGxpYnBuZzE2LnNvIG9uIExpbnV4IEVMRiB3aXRoIGdjYworIyBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDIsIDIwMDYsIDIwMDgsIDIwMTAtMjAxNCBHcmVnIFJvZWxvZnMgYW5kCisjIEdsZW5uIFJhbmRlcnMtUGVocnNvbgorIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIKKyMKKyMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorIyBhbmQgbGljZW5zZSBpbiBwbmcuaAorCisjIExpYnJhcnkgbmFtZToKK0xJQk5BTUUgPSBsaWJwbmcxNgorUE5HTUFKID0gMTYKK1JFTEVBU0UgPSAyMAorCisjIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgorTElCU089JChMSUJOQU1FKS5zbworTElCU09NQUo9JChMSUJOQU1FKS5zby4kKFBOR01BSikKK0xJQlNPUkVMPSQoTElCU09NQUopLiQoUkVMRUFTRSkKK09MRFNPPWxpYnBuZy5zbworCisjIFV0aWxpdGllczoKK0FSX1JDPWFyIHJjCitDQz1nY2MKK01LRElSX1A9bWtkaXIgLXAKK0xOX1NGPWxuIC1zZgorUkFOTElCPXJhbmxpYgorQ1A9Y3AKK1JNX0Y9L2Jpbi9ybSAtZgorCisjIHdoZXJlICJtYWtlIGluc3RhbGwiIHB1dHMgbGlicG5nMTYuYSwgbGlicG5nMTYuc28qLAorIyBsaWJwbmcxNi9wbmcuaCwgbGlicG5nMTYvcG5nY29uZi5oLCBhbmQgbGlicG5nMTYvcG5nbGliY29uZi5oCisjIFByZWZpeCBtdXN0IGJlIGEgZnVsbCBwYXRobmFtZS4KK3ByZWZpeD0vdXNyL2xvY2FsCitleGVjX3ByZWZpeD0kKHByZWZpeCkKKworIyBXaGVyZSB0aGUgemxpYiBsaWJyYXJ5IGFuZCBpbmNsdWRlIGZpbGVzIGFyZSBsb2NhdGVkLgorI1pMSUJMSUI9L3Vzci9sb2NhbC9saWIKKyNaTElCSU5DPS91c3IvbG9jYWwvaW5jbHVkZQorWkxJQkxJQj0uLi96bGliCitaTElCSU5DPS4uL3psaWIKKworQUxJR049CisjIGZvciBpMzg2OgorI0FMSUdOPS1tYWxpZ24tbG9vcHM9MiAtbWFsaWduLWZ1bmN0aW9ucz0yCisKK1dBUk5NT1JFPS1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdzaGFkb3cgXAorCS1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVd0cmFkaXRpb25hbCAtV2Nhc3QtYWxpZ24gXAorCS1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgIy1XY29udmVyc2lvbgorCisjIGZvciBwZ2NjIHZlcnNpb24gMi45NS4xLCAtTzMgaXMgYnVnZ3k7IGRvbid0IHVzZSBpdC4KKworQ1BQRkxBR1M9LUkkKFpMSUJJTkMpICMgLURQTkdfREVCVUc9NQorQ0ZMQUdTPSAtVyAtV2FsbCAtTzMgLWZ1bnJvbGwtbG9vcHMgXAorCSQoQUxJR04pICMgJChXQVJOTU9SRSkgLWcgLURQTkdfREVCVUc9NQorCitMREZMQUdTPS1MLiAtV2wsLXJwYXRoLC4gLUwkKFpMSUJMSUIpIC1XbCwtcnBhdGgsJChaTElCTElCKSAtbHBuZzE2IC1seiAtbG0KK0xERkxBR1NfQT0tTCQoWkxJQkxJQikgLVdsLC1ycGF0aCwkKFpMSUJMSUIpIGxpYnBuZy5hIC1seiAtbG0KKworSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQorTElCUEFUSD0kKGV4ZWNfcHJlZml4KS9saWIKK01BTlBBVEg9JChwcmVmaXgpL21hbgorQklOUEFUSD0kKGV4ZWNfcHJlZml4KS9iaW4KKworIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAorIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgorIworIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZworIworIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCisjIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKKyMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgorREVTVERJUj0KKworREI9JChERVNURElSKSQoQklOUEFUSCkKK0RJPSQoREVTVERJUikkKElOQ1BBVEgpCitETD0kKERFU1RESVIpJChMSUJQQVRIKQorRE09JChERVNURElSKSQoTUFOUEFUSCkKKworIyBQcmUtYnVpbHQgY29uZmlndXJhdGlvbgorIyBTZWUgc2NyaXB0cy9wbmdsaWJjb25mLm1hayBmb3IgbW9yZSBvcHRpb25zCitQTkdMSUJDT05GX0hfUFJFQlVJTFQgPSBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdAorCitPQkpTID0gIHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKKwlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKKwlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubworCitPQkpTRExMID0gJChPQkpTOi5vPS5waWMubykKKworLlNVRkZJWEVTOiAgICAgIC5jIC5vIC5waWMubworCisuYy5vOgorCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtbyAkQCAkPAorCisuYy5waWMubzoKKwkkKENDKSAtYyAkKENGTEFHUykgLWZQSUMgLW8gJEAgJCouYworCithbGw6IGxpYnBuZy5hICQoTElCU08pIHBuZ3Rlc3QgcG5ndGVzdC1zdGF0aWMgbGlicG5nLnBjIGxpYnBuZy1jb25maWcKKworcG5nbGliY29uZi5oOiAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkKKwkkKENQKSAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkgJEAKKworbGlicG5nLmE6ICQoT0JKUykKKwkkKEFSX1JDKSAkQCAkKE9CSlMpCisJJChSQU5MSUIpICRACisKK2xpYnBuZy5wYzoKKwljYXQgc2NyaXB0cy9saWJwbmcucGMuaW4gfCBzZWQgLWUgcyFAcHJlZml4QCEkKHByZWZpeCkhIFwKKwktZSBzIUBleGVjX3ByZWZpeEAhJChleGVjX3ByZWZpeCkhIFwKKwktZSBzIUBsaWJkaXJAISQoTElCUEFUSCkhIFwKKwktZSBzIUBpbmNsdWRlZGlyQCEkKElOQ1BBVEgpISBcCisJLWUgcyEtbHBuZzE2IS1scG5nMTZcIC1selwgLWxtISA+IGxpYnBuZy5wYworCitsaWJwbmctY29uZmlnOgorCSggY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1oZWFkLmluOyBcCisJZWNobyBwcmVmaXg9XCIkKHByZWZpeClcIjsgXAorCWVjaG8gSV9vcHRzPVwiLUkkKElOQ1BBVEgpLyQoTElCTkFNRSlcIjsgXAorCWVjaG8gTF9vcHRzPVwiLUwkKExJQlBBVEgpXCI7IFwKKwllY2hvIFJfb3B0cz1cIi1XbCwtcnBhdGgsJChMSUJQQVRIKVwiOyBcCisJZWNobyBsaWJzPVwiLWxwbmcxNiAtbHogLWxtXCI7IFwKKwljYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gKSA+IGxpYnBuZy1jb25maWcKKwljaG1vZCAreCBsaWJwbmctY29uZmlnCisKKyQoTElCU08pOiAkKExJQlNPTUFKKQorCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pCisKKyQoTElCU09NQUopOiAkKE9CSlNETEwpCisJJChDQykgLXNoYXJlZCAtV2wsLXNvbmFtZSwkKExJQlNPTUFKKSAtbyAkKExJQlNPTUFKKSAkKE9CSlNETEwpCisKK3BuZ3Rlc3Q6IHBuZ3Rlc3QubyAkKExJQlNPKQorCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCisKK3BuZ3Rlc3Qtc3RhdGljOiBwbmd0ZXN0Lm8gbGlicG5nLmEKKwkkKENDKSAtbyBwbmd0ZXN0LXN0YXRpYyAkKENGTEFHUykgcG5ndGVzdC5vICQoTERGTEFHU19BKQorCit0ZXN0OiBwbmd0ZXN0IHBuZ3Rlc3Qtc3RhdGljCisJQGVjaG8gIiIKKwlAZWNobyAiICAgUnVubmluZyBwbmd0ZXN0IGR5bmFtaWNhbGx5IGxpbmtlZCB3aXRoICQoTElCU08pOiIKKwlAZWNobyAiIgorCS4vcG5ndGVzdAorCUBlY2hvICIiCisJQGVjaG8gIiAgIFJ1bm5pbmcgcG5ndGVzdCBzdGF0aWNhbGx5IGxpbmtlZCB3aXRoIGxpYnBuZy5hOiIKKwlAZWNobyAiIgorCS4vcG5ndGVzdC1zdGF0aWMKKworaW5zdGFsbC1oZWFkZXJzOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCisJLUBpZiBbICEgLWQgJChESSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpOyBmaQorCS1AaWYgWyAhIC1kICQoREkpLyQoTElCTkFNRSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpLyQoTElCTkFNRSk7IGZpCisJY3AgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCAkKERJKS8kKExJQk5BTUUpCisJY2htb2QgNjQ0ICQoREkpLyQoTElCTkFNRSkvcG5nLmggJChESSkvJChMSUJOQU1FKS9wbmdjb25mLmggJChESSkvJChMSUJOQU1FKS9wbmdsaWJjb25mLmgKKwktQCQoUk1fRikgJChESSkvcG5nLmggJChESSkvcG5nY29uZi5oICQoREkpL3BuZ2xpYmNvbmYuaAorCS1AJChSTV9GKSAkKERJKS9saWJwbmcKKwkoY2QgJChESSk7ICQoTE5fU0YpICQoTElCTkFNRSkgbGlicG5nOyAkKExOX1NGKSAkKExJQk5BTUUpLyogLikKKworaW5zdGFsbC1zdGF0aWM6IGluc3RhbGwtaGVhZGVycyBsaWJwbmcuYQorCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKKwljcCBsaWJwbmcuYSAkKERMKS8kKExJQk5BTUUpLmEKKwljaG1vZCA2NDQgJChETCkvJChMSUJOQU1FKS5hCisJLUAkKFJNX0YpICQoREwpL2xpYnBuZy5hCisJKGNkICQoREwpOyAkKExOX1NGKSAkKExJQk5BTUUpLmEgbGlicG5nLmEpCisKK2luc3RhbGwtc2hhcmVkOiBpbnN0YWxsLWhlYWRlcnMgJChMSUJTT01BSikgbGlicG5nLnBjCisJLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQorCS1AJChSTV9GKSAkKERMKS8kKExJQlNPKQorCS1AJChSTV9GKSAkKERMKS8kKExJQlNPUkVMKQorCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPKQorCWNwICQoTElCU09NQUopICQoREwpLyQoTElCU09SRUwpCisJY2htb2QgNzU1ICQoREwpLyQoTElCU09SRUwpCisJKGNkICQoREwpOyBcCisJJChMTl9TRikgJChMSUJTT1JFTCkgJChMSUJTTyk7IFwKKwkkKExOX1NGKSAkKExJQlNPKSAkKE9MRFNPKSkKKworCS1AaWYgWyAhIC1kICQoREwpL3BrZ2NvbmZpZyBdOyB0aGVuICQoTUtESVJfUCkgJChETCkvcGtnY29uZmlnOyBmaQorCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYworCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvbGlicG5nLnBjCisJY3AgbGlicG5nLnBjICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCisJY2htb2QgNjQ0ICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCisJKGNkICQoREwpL3BrZ2NvbmZpZzsgJChMTl9TRikgJChMSUJOQU1FKS5wYyBsaWJwbmcucGMpCisKK2luc3RhbGwtbWFuOiBsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41CisJLUBpZiBbICEgLWQgJChETSkgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pOyBmaQorCS1AaWYgWyAhIC1kICQoRE0pL21hbjMgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjM7IGZpCisJLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5nLjMKKwktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmdwZi4zCisJY3AgbGlicG5nLjMgJChETSkvbWFuMworCWNwIGxpYnBuZ3BmLjMgJChETSkvbWFuMworCS1AaWYgWyAhIC1kICQoRE0pL21hbjUgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjU7IGZpCisJLUAkKFJNX0YpICQoRE0pL21hbjUvcG5nLjUKKwljcCBwbmcuNSAkKERNKS9tYW41CisKK2luc3RhbGwtY29uZmlnOiBsaWJwbmctY29uZmlnCisJLUBpZiBbICEgLWQgJChEQikgXTsgdGhlbiAkKE1LRElSX1ApICQoREIpOyBmaQorCS1AJChSTV9GKSAkKERCKS9saWJwbmctY29uZmlnCisJLUAkKFJNX0YpICQoREIpLyQoTElCTkFNRSktY29uZmlnCisJY3AgbGlicG5nLWNvbmZpZyAkKERCKS8kKExJQk5BTUUpLWNvbmZpZworCWNobW9kIDc1NSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZworCShjZCAkKERCKTsgJChMTl9TRikgJChMSUJOQU1FKS1jb25maWcgbGlicG5nLWNvbmZpZykKKworaW5zdGFsbDogaW5zdGFsbC1zdGF0aWMgaW5zdGFsbC1zaGFyZWQgaW5zdGFsbC1tYW4gaW5zdGFsbC1jb25maWcKKworIyBJZiB5b3UgaW5zdGFsbGVkIGluICQoREVTVERJUiksIHRlc3QtaW5zdGFsbGVkIHdvbid0IHdvcmsgdW50aWwgeW91CisjIG1vdmUgdGhlIGxpYnJhcnkgdG8gaXRzIGZpbmFsIGxvY2F0aW9uLiAgVXNlIHRlc3QtZGQgdG8gdGVzdCBpdAorIyBiZWZvcmUgdGhlbi4KKwordGVzdC1kZDoKKwllY2hvCisJZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5IGluICQoREwpLgorCSQoQ0MpIC1JJChESSkgJChDUFBGTEFHUykgXAorCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAorCSAgIC1MJChETCkgLUwkKFpMSUJMSUIpIC1XbCwgLXJwYXRoLCQoREwpIC1XbCwtcnBhdGgsJChaTElCTElCKSBcCisJICAgLW8gcG5ndGVzdGQgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAorCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKKwordGVzdC1pbnN0YWxsZWQ6CisJJChDQykgJChDUFBGTEFHUykgXAorCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAorCSAgIC1MJChaTElCTElCKSAtV2wsLXJwYXRoLCQoWkxJQkxJQikgXAorCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKKwkuL3BuZ3Rlc3RpIHBuZ3Rlc3QucG5nCisKK2NsZWFuOgorCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5nb3V0LnBuZyBsaWJwbmctY29uZmlnIFwKKwkkKExJQlNPKSAkKExJQlNPTUFKKSogcG5ndGVzdC1zdGF0aWMgcG5ndGVzdGkgXAorCWxpYnBuZy5wYyBwbmdsaWJjb25mLmgKKworRE9DUyA9IEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8KK3dyaXRlbG9jazoKKwljaG1vZCBhLXcgKi5bY2gzNV0gJChET0NTKSBzY3JpcHRzLyoKKworIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgorCitwbmcubyBwbmcucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdlcnJvci5vIHBuZ2Vycm9yLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncmlvLm8gcG5ncmlvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd2lvLm8gcG5nd2lvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nbWVtLm8gcG5nbWVtLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nc2V0Lm8gcG5nc2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nZ2V0Lm8gcG5nZ2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncmVhZC5vIHBuZ3JlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdydHJhbi5vIHBuZ3J0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncnV0aWwubyBwbmdydXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3RyYW5zLm8gcG5ndHJhbnMucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3cml0ZS5vIHBuZ3dyaXRlLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd3RyYW4ubyBwbmd3dHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3d1dGlsLm8gcG5nd3V0aWwucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdwcmVhZC5vIHBuZ3ByZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorCitwbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKZGlmZiAtLWdpdCBhL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLm1pcHMgYi9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5taXBzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MzM2MDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5taXBzCkBAIC0wLDAgKzEsMTAzIEBACisjIG1ha2VmaWxlIGZvciBsaWJwbmcKKyMgQ29weXJpZ2h0IChDKSAxOTk4LTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCisjIENvcHlyaWdodCAoQykgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KKyMKKyMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorIyBhbmQgbGljZW5zZSBpbiBwbmcuaAorCisjIHdoZXJlIG1ha2UgaW5zdGFsbCBwdXRzIGxpYnBuZy5hIGFuZCBwbmcuaAorcHJlZml4PS91c3IvbG9jYWwKK0lOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKK0xJQlBBVEg9JChwcmVmaXgpL2xpYgorCisjIG92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0CisjIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6CisjCisjICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCisjCisjIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KKyMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQorIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCitERVNURElSPQorCitDQz1jYworQ1BQRkxBR1M9LUkuLi96bGliIC1EU1lTViAtRG1pcHMKK0NGTEFHUz0tTyAtc3lzdHlwZSBzeXN2IC13CisjQ0ZMQUdTPS1PCitMREZMQUdTPS1MLiAtTC4uL3psaWIvIC1scG5nIC1seiAtbG0KKworI1JBTkxJQj1yYW5saWIKK1JBTkxJQj1lY2hvCisKK0NQPWNwCisKKyMgUHJlLWJ1aWx0IGNvbmZpZ3VyYXRpb24KKyMgU2VlIHNjcmlwdHMvcG5nbGliY29uZi5tYWsgZm9yIG1vcmUgb3B0aW9ucworUE5HTElCQ09ORl9IX1BSRUJVSUxUID0gc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQKKworT0JKUyA9IHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKKwlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKKwlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubworCisuYy5vOgorCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtbyAkQCAkPAorCithbGw6IGxpYnBuZy5hIHBuZ3Rlc3QKKworcG5nbGliY29uZi5oOiAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkKKwkkKENQKSAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkgJEAKKworbGlicG5nLmE6ICQoT0JKUykKKwlhciByYyAkQCAgJChPQkpTKQorCSQoUkFOTElCKSAkQAorCitwbmd0ZXN0OiBwbmd0ZXN0Lm8gbGlicG5nLmEKKwkkKENDKSAtbyBwbmd0ZXN0ICQoQ0ZMQUdTKSBwbmd0ZXN0Lm8gJChMREZMQUdTKQorCit0ZXN0OiBwbmd0ZXN0CisJLi9wbmd0ZXN0CisKK2luc3RhbGw6IGxpYnBuZy5hCisJLUBta2RpciAkKERFU1RESVIpJChJTkNQQVRIKQorCS1AbWtkaXIgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nCisJLUBta2RpciAkKERFU1RESVIpJChMSUJQQVRIKQorCS1Acm0gLWYgJChERVNURElSKSQoSU5DUEFUSCkvcG5nLmgKKwktQHJtIC1mICQoREVTVERJUikkKElOQ1BBVEgpL3BuZ2NvbmYuaAorCS1Acm0gLWYgJChERVNURElSKSQoSU5DUEFUSCkvcG5nbGliY29uZi5oCisJY3AgcG5nLmggJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nCisJY3AgcG5nY29uZi5oICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZworCWNwIHBuZ2xpYmNvbmYuaCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcKKwljaG1vZCA2NDQgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nL3BuZy5oCisJY2htb2QgNjQ0ICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZy9wbmdjb25mLmgKKwljaG1vZCA2NDQgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nL3BuZ2xpYmNvbmYuaAorCShjZCAkKERFU1RESVIpJChJTkNQQVRIKTsgbG4gLWYgLXMgbGlicG5nLyogLikKKwljcCBsaWJwbmcuYSAkKERFU1RESVIpJChMSUJQQVRIKQorCWNobW9kIDY0NCAkKERFU1RESVIpJChMSUJQQVRIKS9saWJwbmcuYQorCitjbGVhbjoKKwlybSAtZiAqLm8gbGlicG5nLmEgcG5ndGVzdCBwbmdvdXQucG5nIHBuZ2xpYmNvbmYuaAorCitET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTword3JpdGVsb2NrOgorCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgorCisjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCisKK3BuZy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nZXJyb3IubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3Jpby5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd2lvLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdtZW0ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3NldC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nZ2V0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdyZWFkLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdwcmVhZC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncnRyYW4ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3J1dGlsLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd0cmFucy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd3JpdGUubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3d0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3dXRpbC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorCitwbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKZGlmZiAtLWdpdCBhL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLm1zYyBiL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLm1zYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzlkNjJlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUubXNjCkBAIC0wLDAgKzEsMTAwIEBACisjIG1ha2VmaWxlIGZvciBsaWJwbmcKKyMgQ29weXJpZ2h0IChDKSAxOTk1IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgorIyBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDksIDIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCisjCisjIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisjIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKyMKKyMgQXNzdW1lcyB0aGF0IHpsaWIubGliLCB6Y29uZi5oLCBhbmQgemxpYi5oIGhhdmUgYmVlbiBjb3BpZWQgdG8gLi5cemxpYgorCisjIC0tLS0tLS0tIE1pY3Jvc29mdCBDIDUuMSBhbmQgbGF0ZXIsIGRvZXMgbm90IHVzZSBhc3NlbWJsZXIgY29kZSAtLS0tLS0tLQorTU9ERUw9TAorQ1BQRkxBR1M9LUkuLlx6bGliCitDRkxBR1M9LU9haXQgLUdzIC1ub2xvZ28gLVczIC1BJChNT0RFTCkKKyMtT3ggZ2VuZXJhdGVzIGJhZCBjb2RlIHdpdGggTVNDIDUuMQorQ0M9Y2wKK0xEPWxpbmsKK0xERkxBR1M9L2Uvc3Q6MHgxNTAwL25vZQorQ1A9Y29weQorTz0ub2JqCisKKyMgUHJlLWJ1aWx0IGNvbmZpZ3VyYXRpb24KKyMgU2VlIHNjcmlwdHNccG5nbGliY29uZi5tYWsgZm9yIG1vcmUgb3B0aW9ucworUE5HTElCQ09ORl9IX1BSRUJVSUxUID0gc2NyaXB0c1xwbmdsaWJjb25mLmgucHJlYnVpbHQKKworI3VuY29tbWVudCBuZXh0IHRvIHB1dCBlcnJvciBtZXNzYWdlcyBpbiBhIGZpbGUKK0VSUkZJTEU9ID4+IHBuZ2VycnMKKworIyB2YXJpYWJsZXMKK09CSlMxID0gcG5nJChPKSBwbmdzZXQkKE8pIHBuZ2dldCQoTykgcG5ncnV0aWwkKE8pIHBuZ3RyYW5zJChPKSBwbmd3dXRpbCQoTykKK09CSlMyID0gcG5nbWVtJChPKSBwbmdwcmVhZCQoTykgcG5ncmVhZCQoTykgcG5nZXJyb3IkKE8pIHBuZ3dyaXRlJChPKQorT0JKUzMgPSBwbmdydHJhbiQoTykgcG5nd3RyYW4kKE8pIHBuZ3JpbyQoTykgcG5nd2lvJChPKQorCithbGw6IGxpYnBuZy5saWIKKworcG5nbGliY29uZi5oOiAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkKKwkkKENQKSAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkgJEAKKworcG5nJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCisKK3BuZ3NldCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQorCitwbmdnZXQkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKKworcG5ncmVhZCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQorCitwbmdwcmVhZCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQorCitwbmdydHJhbiQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQorCitwbmdydXRpbCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQorCitwbmdlcnJvciQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQorCitwbmdtZW0kKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKKworcG5ncmlvJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCisKK3BuZ3dpbyQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQorCitwbmd0cmFucyQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQorCitwbmd3cml0ZSQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQorCitwbmd3dHJhbiQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQorCitwbmd3dXRpbCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQorCitsaWJwbmcubGliOiAkKE9CSlMxKSAkKE9CSlMyKSAkKE9CSlMzKQorCWRlbCBsaWJwbmcubGliCisJbGliIGxpYnBuZyAkKE9CSlMxKTsKKwlsaWIgbGlicG5nICQoT0JKUzIpOworCWxpYiBsaWJwbmcgJChPQkpTMyk7CisKK3BuZ3Rlc3QkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQorCitwbmd0ZXN0LmV4ZTogcG5ndGVzdC5vYmogbGlicG5nLmxpYgorCSQoTEQpICQoTERGTEFHUykgcG5ndGVzdC5vYmosLCxsaWJwbmcubGliIC4uXHpsaWJcemxpYi5saWIgOworCit0ZXN0OiBwbmd0ZXN0LmV4ZQorCXBuZ3Rlc3QKKworIyBFbmQgb2YgbWFrZWZpbGUgZm9yIGxpYnBuZworCmRpZmYgLS1naXQgYS9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5tc3lzIGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUubXN5cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWE3NDI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUubXN5cwpAQCAtMCwwICsxLDIwMSBAQAorIyBtYWtlZmlsZSBmb3IgbGlicG5nIHVzaW5nIE1TWVMvZ2NjIChzaGFyZWQsIHN0YXRpYyBsaWJyYXJ5KQorIyBDb3B5cmlnaHQgKEMpIDIwMTIgR2xlbm4gUmFuZGVycy1QZWhyc29uIGFuZCBDaHJpc3RvcGhlciBNLiBXaGVlbGVyCisjCisjIFBvcnRpb25zIHRha2VuIGZyb20gbWFrZWZpbGUubGludXg6CisjIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMiwgMjAwNiwgMjAwOCwgMjAxMC0yMDE0IEdyZWcgUm9lbG9mcyBhbmQKKyMgR2xlbm4gUmFuZGVycy1QZWhyc29uCisjIENvcHlyaWdodCAoQykgMjAwMCBDb3NtaW4gVHJ1dGEKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyCisjIENvcHlyaWdodCAoQykgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KKyMKKyMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorIyBhbmQgbGljZW5zZSBpbiBwbmcuaAorIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjCitwcmVmaXg9L3Vzci9sb2NhbAorZXhlY19wcmVmaXg9JChwcmVmaXgpCisKKyMgTGlicmFyeSBuYW1lOgorTElCTkFNRSA9IGxpYnBuZzE2CitQTkdNQUogPSAxNgorUkVMRUFTRSA9IDIwCisKKyMgU2hhcmVkIGxpYnJhcnkgbmFtZXM6CitMSUJTTz0kKExJQk5BTUUpLmRsbAorTElCU09NQUo9JChMSUJOQU1FKS5kbGwuJChQTkdNQUopCitMSUJTT1JFTD0kKFBOR01BSikuJChSRUxFQVNFKQorT0xEU089bGlicG5nLmRsbAorCisjIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQuCisjWkxJQkxJQj0uLi96bGliCisjWkxJQklOQz0uLi96bGliCitaTElCTElCPS91c3IvbG9jYWwvbGliCitaTElCSU5DPS91c3IvbG9jYWwvaW5jbHVkZQorCisjIENvbXBpbGVyLCBsaW5rZXIsIGxpYiBhbmQgb3RoZXIgdG9vbHMKK0NDID0gZ2NjCitMRCA9ICQoQ0MpCitBUl9SQyA9IGFyIHJjcworUkFOTElCID0gcmFubGliCitDUCA9IGNwCitSTV9GID0gcm0gLXJmCitNS0RJUl9QPW1rZGlyIC1wCitMTl9TRj1sbiAtc2YKKworI0FSQ0ggPSAtbWFyY2g9cGVudGl1bTMKKyNBUkNIID0gLW1hcmNoPWk2ODYKK0FSQ0ggPQorQ1BQRkxBR1MgPSAjIC1EUE5HX0RFQlVHPTUKK0NGTEFHUyA9IC1XIC1XYWxsIC1PMiAkKEFSQ0gpICMgLWcKK0xERkxBR1MgPQorTElCUyA9IC1seiAtbG0KKworIyBGaWxlIGV4dGVuc2lvbnMKK0VYRUVYVD0uZXhlCisKK0lOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKK0xJQlBBVEg9JChleGVjX3ByZWZpeCkvbGliCitNQU5QQVRIPSQocHJlZml4KS9tYW4KK0JJTlBBVEg9JChleGVjX3ByZWZpeCkvYmluCisKKyMgb3ZlcnJpZGUgREVTVERJUj0gb24gdGhlIG1ha2UgaW5zdGFsbCBjb21tYW5kIGxpbmUgdG8gZWFzaWx5IHN1cHBvcnQKKyMgaW5zdGFsbGluZyBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uLiAgRXhhbXBsZToKKyMKKyMgICAgbWFrZSBpbnN0YWxsIERFU1RESVI9L3RtcC9idWlsZC9saWJwbmcKKyMKKyMgSWYgeW91J3JlIGdvaW5nIHRvIGluc3RhbGwgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbgorIyB2aWEgREVTVERJUiwgJChERVNURElSKSQocHJlZml4KSBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlCisjIHlvdSBleGVjdXRlIG1ha2UgaW5zdGFsbC4KKworREVTVERJUj0KKworREI9JChERVNURElSKSQoQklOUEFUSCkKK0RJPSQoREVTVERJUikkKElOQ1BBVEgpCitETD0kKERFU1RESVIpJChMSUJQQVRIKQorRE09JChERVNURElSKSQoTUFOUEFUSCkKKworIyBQcmUtYnVpbHQgY29uZmlndXJhdGlvbgorIyBTZWUgc2NyaXB0cy9wbmdsaWJjb25mLm1hayBmb3IgbW9yZSBvcHRpb25zCitQTkdMSUJDT05GX0hfUFJFQlVJTFQgPSBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdAorCisjIFZhcmlhYmxlcworT0JKUyA9ICBwbmcubyBwbmdlcnJvci5vIHBuZ2dldC5vIHBuZ21lbS5vIHBuZ3ByZWFkLm8gXAorCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmdydHJhbi5vIHBuZ3J1dGlsLm8gcG5nc2V0Lm8gXAorCXBuZ3RyYW5zLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmd3dHJhbi5vIHBuZ3d1dGlsLm8KKworIyBUYXJnZXRzCithbGw6IHN0YXRpYyBzaGFyZWQKKworcG5nbGliY29uZi5oOiAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkKKwkkKENQKSAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkgJEAKKworLmMubzoKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJDwKKworc3RhdGljOiBsaWJwbmcuYSBwbmd0ZXN0JChFWEVFWFQpCisKK3NoYXJlZDogJChMSUJTT01BSikKKwkkKENDKSAtc2hhcmVkIC1XbCwtc29uYW1lLCQoTElCU09NQUopIC1vICQoTElCU08pCisKKyQoTElCU08pOiAkKExJQlNPTUFKKQorCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pCisKKyQoTElCU09NQUopOgorCSQoQ0MpIC1zaGFyZWQgLVdsLC1zb25hbWUsJChMSUJTT01BSikgLW8gJChMSUJTT01BSikKKworbGlicG5nLmE6ICQoT0JKUykKKwkkKEFSX1JDKSAkQCAkKE9CSlMpCisJJChSQU5MSUIpICRACisKK2luc3RhbGwtaGVhZGVyczogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaAorCS1AaWYgWyAhIC1kICQoREkpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKTsgZmkKKwktQGlmIFsgISAtZCAkKERJKS8kKExJQk5BTUUpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKS8kKExJQk5BTUUpOyBmaQorCWNwIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggJChESSkvJChMSUJOQU1FKQorCS1AJChSTV9GKSAkKERJKS9wbmcuaCAkKERJKS9wbmdjb25mLmggJChESSkvcG5nbGliY29uZi5oCisJLUAkKFJNX0YpICQoREkpL2xpYnBuZworCShjZCAkKERJKTsgJChMTl9TRikgJChMSUJOQU1FKSBsaWJwbmc7ICQoTE5fU0YpICQoTElCTkFNRSkvKiAuKQorCitpbnN0YWxsLXN0YXRpYzogaW5zdGFsbC1oZWFkZXJzIGxpYnBuZy5hCisJLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQorCWNwIGxpYnBuZy5hICQoREwpLyQoTElCTkFNRSkuYQorCS1AJChSTV9GKSAkKERMKS9saWJwbmcuYQorCShjZCAkKERMKTsgJChMTl9TRikgJChMSUJOQU1FKS5hIGxpYnBuZy5hKQorCitsaWJwbmcucGM6CisJY2F0IHNjcmlwdHMvbGlicG5nLnBjLmluIHwgc2VkIC1lIHMhQHByZWZpeEAhJChwcmVmaXgpISBcCisJLWUgcyFAZXhlY19wcmVmaXhAISQoZXhlY19wcmVmaXgpISBcCisJLWUgcyFAbGliZGlyQCEkKExJQlBBVEgpISBcCisJLWUgcyFAaW5jbHVkZWRpckAhJChJTkNQQVRIKSEgXAorCS1lIHMhLWxwbmcxNiEtbHBuZzE2XCAtbHpcIC1sbSEgPiBsaWJwbmcucGMKKworbGlicG5nLWNvbmZpZzoKKwkoIGNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbjsgXAorCWVjaG8gcHJlZml4PVwiJChwcmVmaXgpXCI7IFwKKwllY2hvIElfb3B0cz1cIi1JJChJTkNQQVRIKS8kKExJQk5BTUUpXCI7IFwKKwllY2hvIExfb3B0cz1cIi1MJChMSUJQQVRIKVwiOyBcCisJZWNobyBSX29wdHM9XCItV2wsLXJwYXRoLCQoTElCUEFUSClcIjsgXAorCWVjaG8gbGlicz1cIi1scG5nMTYgLWx6IC1sbVwiOyBcCisJY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1ib2R5LmluICkgPiBsaWJwbmctY29uZmlnCisKK2luc3RhbGwtc2hhcmVkOiBpbnN0YWxsLWhlYWRlcnMgJChMSUJTT01BSikgbGlicG5nLnBjCisJLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQorCS1AJChSTV9GKSAkKERMKS8kKExJQlNPKQorCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPKQorCWNwICQoTElCU08pICQoREwpLyQoTElCU09SRUwpCisJKGNkICQoREwpOyBcCisJJChMTl9TRikgJChMSUJTT1JFTCkgJChMSUJTTyk7IFwKKwkkKExOX1NGKSAkKExJQlNPKSAkKE9MRFNPKSkKKworCS1AaWYgWyAhIC1kICQoREwpL3BrZ2NvbmZpZyBdOyB0aGVuICQoTUtESVJfUCkgJChETCkvcGtnY29uZmlnOyBmaQorCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYworCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvbGlicG5nLnBjCisJY3AgbGlicG5nLnBjICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCisJKGNkICQoREwpL3BrZ2NvbmZpZzsgJChMTl9TRikgJChMSUJOQU1FKS5wYyBsaWJwbmcucGMpCisKK2luc3RhbGwtbWFuOiBsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41CisJLUBpZiBbICEgLWQgJChETSkgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pOyBmaQorCS1AaWYgWyAhIC1kICQoRE0pL21hbjMgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjM7IGZpCisJLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5nLjMKKwktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmdwZi4zCisJY3AgbGlicG5nLjMgJChETSkvbWFuMworCWNwIGxpYnBuZ3BmLjMgJChETSkvbWFuMworCS1AaWYgWyAhIC1kICQoRE0pL21hbjUgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjU7IGZpCisJLUAkKFJNX0YpICQoRE0pL21hbjUvcG5nLjUKKwljcCBwbmcuNSAkKERNKS9tYW41CisKK2luc3RhbGwtY29uZmlnOiBsaWJwbmctY29uZmlnCisJLUBpZiBbICEgLWQgJChEQikgXTsgdGhlbiAkKE1LRElSX1ApICQoREIpOyBmaQorCS1AJChSTV9GKSAkKERCKS9saWJwbmctY29uZmlnCisJLUAkKFJNX0YpICQoREIpLyQoTElCTkFNRSktY29uZmlnCisJY3AgbGlicG5nLWNvbmZpZyAkKERCKS8kKExJQk5BTUUpLWNvbmZpZworCShjZCAkKERCKTsgJChMTl9TRikgJChMSUJOQU1FKS1jb25maWcgbGlicG5nLWNvbmZpZykKKworaW5zdGFsbDogaW5zdGFsbC1zdGF0aWMgaW5zdGFsbC1zaGFyZWQgaW5zdGFsbC1tYW4gaW5zdGFsbC1jb25maWcKKwordGVzdDogcG5ndGVzdCQoRVhFRVhUKQorCS4vcG5ndGVzdCQoRVhFRVhUKQorCitwbmd0ZXN0JChFWEVFWFQpOiBwbmd0ZXN0Lm8gbGlicG5nLmEKKwkkKExEKSAkKExERkxBR1MpIC1MJChaTElCTElCKSAtbyAkQCBwbmd0ZXN0Lm8gbGlicG5nLmEgJChMSUJTKQorCitjbGVhbjoKKwkkKFJNX0YpICoubyBsaWJwbmcuYSBwbmd0ZXN0JChFWEVFWFQpIHBuZ291dC5wbmcgcG5nbGliY29uZi5oICQoTElCU08pIFwKKwkkKExJQlNPTUFKKSBsaWJwbmctY29uZmlnCisKK3BuZy5vOiAgICAgIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdlcnJvci5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nZ2V0Lm86ICAgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ21lbS5vOiAgIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdwcmVhZC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncmVhZC5vOiAgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3Jpby5vOiAgIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdydHJhbi5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncnV0aWwubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3NldC5vOiAgIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd0cmFucy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd2lvLm86ICAgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3dyaXRlLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3dHJhbi5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd3V0aWwubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKworcG5ndGVzdC5vOiAgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaApkaWZmIC0tZ2l0IGEvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUubmUxMmJzZCBiL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLm5lMTJic2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThmNGJkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLm5lMTJic2QKQEAgLTAsMCArMSw1NiBAQAorIyBtYWtlZmlsZSBmb3IgbGlicG5nIGZvciBOZXRCU0QgZm9yIHRoZSBzdGFuZGFyZAorIyBtYWtlIG9iaiAmJiBtYWtlIGRlcGVuZCAmJiBtYWtlICYmIG1ha2UgdGVzdAorIyBtYWtlIGluY2x1ZGVzICYmIG1ha2UgaW5zdGFsbAorIyBDb3B5cmlnaHQgKEMpIDIwMDIgUGF0cmljayBSLkwuIFdlbGNoZQorIyBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDksIDIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCisjCisjIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisjIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKworIyBZb3Ugc2hvdWxkIGFsc28gcnVuIG1ha2VmaWxlLm5ldGJzZAorCitMT0NBTEJBU0U/PS91c3IvbG9jYWwKK0xJQkRJUj0JJHtMT0NBTEJBU0V9L2xpYgorTUFORElSPSAke0xPQ0FMQkFTRX0vbWFuCitJTkNTRElSPSR7TE9DQUxCQVNFfS9pbmNsdWRlL2xpYnBuZzE2CisKK0xJQj0JcG5nMTYKK1NITElCX01BSk9SPQkwCitTSExJQl9NSU5PUj0JMS42LjIwCitTUkNTPQlwbmcuYyBwbmdzZXQuYyBwbmdnZXQuYyBwbmdydXRpbC5jIHBuZ3RyYW5zLmMgcG5nd3V0aWwuYyBcCisJcG5ncmVhZC5jIHBuZ3Jpby5jIHBuZ3dpby5jIHBuZ3dyaXRlLmMgcG5ncnRyYW4uYyBcCisJcG5nd3RyYW4uYyBwbmdtZW0uYyBwbmdlcnJvci5jIHBuZ3ByZWFkLmMKK0lOQ1M9CXBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKK01BTj0JbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQorCitDUFBGTEFHUys9LUkkey5DVVJESVJ9CisKKyMgUHJlLWJ1aWx0IGNvbmZpZ3VyYXRpb24KKyMgU2VlIHNjcmlwdHMvcG5nbGliY29uZi5tYWsgZm9yIG1vcmUgb3B0aW9ucworUE5HTElCQ09ORl9IX1BSRUJVSUxUPSBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdAorCisjIFdlIHNob3VsZCBiZSBhYmxlIHRvIGRvIHNvbWV0aGluZyBsaWtlIHRoaXMgaW5zdGVhZCBvZiB0aGUgbWFudWFsCisjIHVuY29tbWVudGluZywgYnV0IGl0IGNvcmUgZHVtcHMgZm9yIG1lIGF0IHRoZSBtb21lbnQ6CisjIC5pZiAke01BQ0hJTkVfQVJDSH0gPT0gImkzODYiCisjICAgTUtMSU5UPSBubworIyAuZW5kaWYKKworQ0xFQU5GSUxFUys9cG5ndGVzdC5vIHBuZ3Rlc3QgcG5nbGliY29uZi5oCisKKy5jLm86CisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1vICRAICQ8CisKK3BuZ2xpYmNvbmYuaDogJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpCisJY3AgJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpICRACisKK3BuZ3Rlc3QubzoJcG5ndGVzdC5jCisJJHtDQ30gLWMgJHtDUFBGTEFHU30gJHtDRkxBR1N9ICR7LkFMTFNSQ30gLW8gJHsuVEFSR0VUfQorCitwbmd0ZXN0Oglwbmd0ZXN0Lm8gbGlicG5nLmEKKwkke0NDfSAke0xERkxBR1N9ICR7LkFMTFNSQ30gLW8key5UQVJHRVR9IC1seiAtbG0KKwordGVzdDoJcG5ndGVzdAorCWNkICR7LkNVUkRJUn0gJiYgJHsuT0JKRElSfS9wbmd0ZXN0CisKKy5pbmNsdWRlIDxic2QubGliLm1rPgpkaWZmIC0tZ2l0IGEvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUubmV0YnNkIGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUubmV0YnNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNzI5MGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5uZXRic2QKQEAgLTAsMCArMSw1NiBAQAorIyBtYWtlZmlsZSBmb3IgbGlicG5nIGZvciBOZXRCU0QgZm9yIHRoZSBzdGFuZGFyZAorIyBtYWtlIG9iaiAmJiBtYWtlIGRlcGVuZCAmJiBtYWtlICYmIG1ha2UgdGVzdAorIyBtYWtlIGluY2x1ZGVzICYmIG1ha2UgaW5zdGFsbAorIyBDb3B5cmlnaHQgKEMpIDIwMDIgUGF0cmljayBSLkwuIFdlbGNoZQorIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSwgMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyMKKyMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorIyBhbmQgbGljZW5zZSBpbiBwbmcuaAorCisjIFlvdSBzaG91bGQgYWxzbyBydW4gbWFrZWZpbGUubmUxNmJzZAorCitMT0NBTEJBU0U/PS91c3IvbG9jYWwKK0xJQkRJUj0JJHtMT0NBTEJBU0V9L2xpYgorTUFORElSPSAke0xPQ0FMQkFTRX0vbWFuCitJTkNTRElSPSR7TE9DQUxCQVNFfS9pbmNsdWRlCisKK0xJQj0JcG5nCitTSExJQl9NQUpPUj0JMTYKK1NITElCX01JTk9SPQkxLjYuMjAKK1NSQ1M9CXBuZy5jIHBuZ3NldC5jIHBuZ2dldC5jIHBuZ3J1dGlsLmMgcG5ndHJhbnMuYyBwbmd3dXRpbC5jIFwKKwlwbmdyZWFkLmMgcG5ncmlvLmMgcG5nd2lvLmMgcG5nd3JpdGUuYyBwbmdydHJhbi5jIFwKKwlwbmd3dHJhbi5jIHBuZ21lbS5jIHBuZ2Vycm9yLmMgcG5ncHJlYWQuYworSU5DUz0JcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaAorTUFOPQlsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41CisKK0NQUEZMQUdTKz0tSSR7LkNVUkRJUn0KKworIyBQcmUtYnVpbHQgY29uZmlndXJhdGlvbgorIyBTZWUgc2NyaXB0cy9wbmdsaWJjb25mLm1hayBmb3IgbW9yZSBvcHRpb25zCitQTkdMSUJDT05GX0hfUFJFQlVJTFQ9IHNjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0CisKKyMgV2Ugc2hvdWxkIGJlIGFibGUgdG8gZG8gc29tZXRoaW5nIGxpa2UgdGhpcyBpbnN0ZWFkIG9mIHRoZSBtYW51YWwKKyMgdW5jb21tZW50aW5nLCBidXQgaXQgY29yZSBkdW1wcyBmb3IgbWUgYXQgdGhlIG1vbWVudDoKKyMgLmlmICR7TUFDSElORV9BUkNIfSA9PSAiaTM4NiIKKyMgICBNS0xJTlQ9IG5vCisjIC5lbmRpZgorCitDTEVBTkZJTEVTKz1wbmd0ZXN0Lm8gcG5ndGVzdCBwbmdsaWJjb25mLmgKKworLmMubzoKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgLW8gJEAgJDwKKworcG5nbGliY29uZi5oOiAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkKKwljcCAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkgJEAKKworcG5ndGVzdC5vOglwbmd0ZXN0LmMKKwkke0NDfSAtYyAke0NQUEZMQUdTfSAke0NGTEFHU30gJHsuQUxMU1JDfSAtbyAkey5UQVJHRVR9CisKK3BuZ3Rlc3Q6CXBuZ3Rlc3QubyBsaWJwbmcuYQorCSR7Q0N9ICR7TERGTEFHU30gJHsuQUxMU1JDfSAtbyR7LlRBUkdFVH0gLWx6IC1sbQorCit0ZXN0Oglwbmd0ZXN0CisJY2QgJHsuQ1VSRElSfSAmJiAkey5PQkpESVJ9L3BuZ3Rlc3QKKworLmluY2x1ZGUgPGJzZC5saWIubWs+CmRpZmYgLS1naXQgYS9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5vcGVuYnNkIGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUub3BlbmJzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjViZTgxCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUub3BlbmJzZApAQCAtMCwwICsxLDg4IEBACisjIG1ha2VmaWxlIGZvciBsaWJwbmcKKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDksIDIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCisjIENvcHlyaWdodCAoQykgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KKyMKKyMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorIyBhbmQgbGljZW5zZSBpbiBwbmcuaAorCitQUkVGSVg/PSAvdXNyL2xvY2FsCitMSUJESVI9CSR7UFJFRklYfS9saWIKK01BTkRJUj0gJHtQUkVGSVh9L21hbi9jYXQKKworU0hMSUJfTUFKT1I9CTE2CitTSExJQl9NSU5PUj0JMS42LjIwCisKK0xJQj0JcG5nCitTUkNTPQlwbmcuYyBwbmdlcnJvci5jIHBuZ2dldC5jIHBuZ21lbS5jIHBuZ3ByZWFkLmMgXAorCXBuZ3JlYWQuYyBwbmdyaW8uYyBwbmdydHJhbi5jIHBuZ3J1dGlsLmMgcG5nc2V0LmMgcG5ndHJhbnMuYyBcCisJcG5nd2lvLmMgcG5nd3JpdGUuYyBwbmd3dHJhbi5jIHBuZ3d1dGlsLmMKKworSERSUz0JcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaAorCitDRkxBR1MrPSAtVyAtV2FsbAorQ1BQRkxBR1MrPSAtSSR7LkNVUkRJUn0KKworTk9QUk9GSUxFPSBZZXMKKworQ0xFQU5GSUxFUys9IHBuZ3Rlc3QubyBwbmd0ZXN0IHBuZ2xpYmNvbmYuaAorCitNQU49CWxpYnBuZy4zIGxpYnBuZ3BmLjMgcG5nLjUKK0RPQ1M9CUFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8gXAorCWxpYnBuZy1tYW51YWwudHh0CisKKyMgUHJlLWJ1aWx0IGNvbmZpZ3VyYXRpb24KKyMgU2VlIHNjcmlwdHMvcG5nbGliY29uZi5tYWsgZm9yIG1vcmUgb3B0aW9ucworUE5HTElCQ09ORl9IX1BSRUJVSUxUPSBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdAorCisuYy5vOgorCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtbyAkQCAkPAorCitwbmdsaWJjb25mLmg6ICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKQorCWNwICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKSAkQAorCitwbmd0ZXN0Lm86CXBuZ3Rlc3QuYworCSR7Q0N9ICR7Q1BQRkxBR1N9ICR7Q0ZMQUdTfSAtYyAkey5BTExTUkN9IC1vICR7LlRBUkdFVH0KKworcG5ndGVzdDoJcG5ndGVzdC5vCisJJHtDQ30gJHtMREZMQUdTfSAkey5BTExTUkN9IC1vICR7LlRBUkdFVH0gLUwkey5PQkpESVJ9IC1scG5nIC1seiAtbG0KKwordGVzdDoJcG5ndGVzdAorCWNkICR7Lk9CSkRJUn0gJiYgZW52IFwKKwkJTERfTElCUkFSWV9QQVRIPSIkey5PQkpESVJ9IiAkey5PQkpESVJ9L3BuZ3Rlc3QKKworYmVmb3JlaW5zdGFsbDoKKwlpZiBbICEgLWQgJHtERVNURElSfSR7UFJFRklYfS9pbmNsdWRlL2xpYnBuZyBdOyB0aGVuIFwKKwkgICR7SU5TVEFMTH0gLWQgLW8gcm9vdCAtZyB3aGVlbCAke0RFU1RESVJ9JHtQUkVGSVh9L2luY2x1ZGU7IFwKKwlmaQorCWlmIFsgISAtZCAke0RFU1RESVJ9JHtMSUJESVJ9IF07IHRoZW4gXAorCSAgJHtJTlNUQUxMfSAtZCAtbyByb290IC1nIHdoZWVsICR7REVTVERJUn0ke0xJQkRJUn07IFwKKwlmaQorCWlmIFsgISAtZCAke0RFU1RESVJ9JHtMSUJESVJ9L2RlYnVnIF07IHRoZW4gXAorCSAgJHtJTlNUQUxMfSAtZCAtbyByb290IC1nIHdoZWVsICR7REVTVERJUn0ke0xJQkRJUn0vZGVidWc7IFwKKwlmaQorCWlmIFsgISAtZCAke0RFU1RESVJ9JHtNQU5ESVJ9MyBdOyB0aGVuIFwKKwkgICR7SU5TVEFMTH0gLWQgLW8gcm9vdCAtZyB3aGVlbCAke0RFU1RESVJ9JHtNQU5ESVJ9MzsgXAorCWZpCisJaWYgWyAhIC1kICR7REVTVERJUn0ke01BTkRJUn01IF07IHRoZW4gXAorCSAgJHtJTlNUQUxMfSAtZCAtbyByb290IC1nIHdoZWVsICR7REVTVERJUn0ke01BTkRJUn01OyBcCisJZmkKKwlpZiBbICEgLWQgJHtERVNURElSfSR7UFJFRklYfS9zaGFyZS9kb2MvcG5nIF07IHRoZW4gXAorCSAgJHtJTlNUQUxMfSAtZCAtbyByb290IC1nIHdoZWVsICR7REVTVERJUn0ke1BSRUZJWH0vc2hhcmUvZG9jL3BuZzsgXAorCWZpCisKK2FmdGVyaW5zdGFsbDoKKwlAcm0gLWYgJHtERVNURElSfSR7TElCRElSfS9saWJwbmdfcGljLmEKKwlAcm0gLWYgJHtERVNURElSfSR7TElCRElSfS9kZWJ1Zy9saWJwbmcuYQorCUBybSAtZiAke0RFU1RESVJ9JHtQUkVGSVh9L2luY2x1ZGUvcG5nLmgKKwlAcm0gLWYgJHtERVNURElSfSR7UFJFRklYfS9pbmNsdWRlL3BuZ2NvbmYuaAorCUBybSAtZiAke0RFU1RESVJ9JHtQUkVGSVh9L2luY2x1ZGUvcG5nbGliY29uZi5oCisJQHJtZGlyICR7REVTVERJUn0ke0xJQkRJUn0vZGVidWcgMj4vZGV2L251bGwgfHwgdHJ1ZQorCSR7SU5TVEFMTH0gJHtJTlNUQUxMX0NPUFl9IC1vICR7U0hBUkVPV059IC1nICR7U0hBUkVHUlB9IFwKKwkJLW0gJHtOT05CSU5NT0RFfSAke0hEUlN9ICR7REVTVERJUn0ke1BSRUZJWH0vaW5jbHVkZQorCSR7SU5TVEFMTH0gJHtJTlNUQUxMX0NPUFl9IC1vICR7U0hBUkVPV059IC1nICR7U0hBUkVHUlB9IFwKKwkJLW0gJHtOT05CSU5NT0RFfSAke0hEUlN9ICR7REVTVERJUn0ke1BSRUZJWH0vaW5jbHVkZQorCSR7SU5TVEFMTH0gJHtJTlNUQUxMX0NPUFl9IC1vICR7U0hBUkVPV059IC1nICR7U0hBUkVHUlB9IFwKKwkJLW0gJHtOT05CSU5NT0RFfSAke0RPQ1N9ICR7REVTVERJUn0ke1BSRUZJWH0vc2hhcmUvZG9jL3BuZworCisuaW5jbHVkZSA8YnNkLmxpYi5taz4KZGlmZiAtLWdpdCBhL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnNjbyBiL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnNjbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWM3YzQwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuc2NvCkBAIC0wLDAgKzEsMjI2IEBACisjIG1ha2VmaWxlIGZvciBTQ08gT1NyNSAgRUxGIGFuZCBVbml4d2FyZSA3IHdpdGggTmF0aXZlIGNjCisjIENvbnRyaWJ1dGVkIGJ5IE1pa2UgSG9wa2lyayAoaG9wc0BzY28uY29tKSBtb2RpZmllZCBmcm9tIE1ha2VmaWxlLmxueAorIyAgIGZvcmNlIEVMRiBidWlsZCBkeW5hbWljIGxpbmtpbmcsIFNPTkFNRSBzZXR0aW5nIGluIGxpYiBhbmQgUlBBVEggaW4gYXBwCisjIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNiwgMjAxMC0yMDE0IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorIyBDb3B5cmlnaHQgKEMpIDE5OTggR3JlZyBSb2Vsb2ZzCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcgorIworIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisjIGFuZCBsaWNlbnNlIGluIHBuZy5oCisKKyMgTGlicmFyeSBuYW1lOgorTElCTkFNRSA9IGxpYnBuZzE2CitQTkdNQUogPSAxNgorCisjIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgorTElCU089JChMSUJOQU1FKS5zbworTElCU09NQUo9JChMSUJOQU1FKS5zby4kKFBOR01BSikKK0xJQlNPUkVMPSQoTElCU09NQUopLiQoUkVMRUFTRSkKK09MRFNPPWxpYnBuZy5zbworCisjIFV0aWxpdGllczoKK0NDPWNjCitBUl9SQz1hciByYworTUtESVJfUD1ta2RpcgorTE5fU0Y9bG4gLWYgLXMKK1JBTkxJQj1lY2hvCitDUD1jcAorUk1fRj0vYmluL3JtIC1mCisKKyMgd2hlcmUgbWFrZSBpbnN0YWxsIHB1dHMgbGlicG5nLmEsICQoT0xEU08pKiwgYW5kIHBuZy5oCitwcmVmaXg9L3Vzci9sb2NhbAorZXhlY19wcmVmaXg9JChwcmVmaXgpCisKKyMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZAorI1pMSUJMSUI9L3Vzci9sb2NhbC9saWIKKyNaTElCSU5DPS91c3IvbG9jYWwvaW5jbHVkZQorWkxJQkxJQj0uLi96bGliCitaTElCSU5DPS4uL3psaWIKKworQ1BQRkxBR1M9LUkkKFpMSUJJTkMpCitDRkxBR1M9IC1keSAtYmVsZiAtTzMKK0xERkxBR1M9LUwuIC1MJChaTElCTElCKSAtbHBuZzE2IC1seiAtbG0KKworSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQorTElCUEFUSD0kKGV4ZWNfcHJlZml4KS9saWIKK01BTlBBVEg9JChwcmVmaXgpL21hbgorQklOUEFUSD0kKGV4ZWNfcHJlZml4KS9iaW4KKworIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAorIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgorIworIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZworIworIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCisjIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKKyMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgorREVTVERJUj0KKworREI9JChERVNURElSKSQoQklOUEFUSCkKK0RJPSQoREVTVERJUikkKElOQ1BBVEgpCitETD0kKERFU1RESVIpJChMSUJQQVRIKQorRE09JChERVNURElSKSQoTUFOUEFUSCkKKworIyBQcmUtYnVpbHQgY29uZmlndXJhdGlvbgorIyBTZWUgc2NyaXB0cy9wbmdsaWJjb25mLm1hayBmb3IgbW9yZSBvcHRpb25zCitQTkdMSUJDT05GX0hfUFJFQlVJTFQgPSBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdAorCitPQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAorCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAorCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCisKK09CSlNETEwgPSAkKE9CSlM6Lm89LnBpYy5vKQorCisuU1VGRklYRVM6ICAgICAgLmMgLm8gLnBpYy5vCisKKy5jLm86CisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1vICRAICQ8CisKKy5jLnBpYy5vOgorCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtS1BJQyAtbyAkQCAkKi5jCisKK2FsbDogbGlicG5nLmEgJChMSUJTTykgcG5ndGVzdCBsaWJwbmcucGMgbGlicG5nLWNvbmZpZworCitwbmdsaWJjb25mLmg6ICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKQorCSQoQ1ApICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKSAkQAorCitsaWJwbmcuYTogJChPQkpTKQorCSQoQVJfUkMpICRAICQoT0JKUykKKwkkKFJBTkxJQikgJEAKKworbGlicG5nLnBjOgorCWNhdCBzY3JpcHRzL2xpYnBuZy5wYy5pbiB8IHNlZCAtZSBzIUBwcmVmaXhAISQocHJlZml4KSEgXAorCS1lIHMhQGV4ZWNfcHJlZml4QCEkKGV4ZWNfcHJlZml4KSEgXAorCS1lIHMhQGxpYmRpckAhJChMSUJQQVRIKSEgXAorCS1lIHMhQGluY2x1ZGVkaXJAISQoSU5DUEFUSCkhIFwKKwktZSBzIS1scG5nMTYhLWxwbmcxNlwgLWx6XCAtbG0hID4gbGlicG5nLnBjCisKK2xpYnBuZy1jb25maWc6CisJKCBjYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWhlYWQuaW47IFwKKwllY2hvIHByZWZpeD1cIiQocHJlZml4KVwiOyBcCisJZWNobyBJX29wdHM9XCItSSQoSU5DUEFUSCkvJChMSUJOQU1FKVwiOyBcCisJZWNobyBjY29wdHM9XCItYmVsZlwiOyBcCisJZWNobyBMX29wdHM9XCItTCQoTElCUEFUSClcIjsgXAorCWVjaG8gbGlicz1cIi1scG5nMTYgLWx6IC1sbVwiOyBcCisJY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1ib2R5LmluICkgPiBsaWJwbmctY29uZmlnCisJY2htb2QgK3ggbGlicG5nLWNvbmZpZworCiskKExJQlNPKTogJChMSUJTT01BSikKKwkkKExOX1NGKSAkKExJQlNPTUFKKSAkKExJQlNPKQorCiskKExJQlNPTUFKKTogJChPQkpTRExMKQorCSQoQ0MpIC1HICAtV2wsLWgsJChMSUJTT01BSikgLW8gJChMSUJTT01BSikgXAorCSAkKE9CSlNETEwpCisKK3BuZ3Rlc3Q6IHBuZ3Rlc3QubyAkKExJQlNPKQorCUxEX1JVTl9QQVRIPS46JChaTElCTElCKSAkKENDKSAtbyBwbmd0ZXN0ICQoQ0ZMQUdTKSBwbmd0ZXN0Lm8gJChMREZMQUdTKQorCit0ZXN0OiBwbmd0ZXN0CisJLi9wbmd0ZXN0CisKK2luc3RhbGwtaGVhZGVyczogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaAorCS1AaWYgWyAhIC1kICQoREkpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKTsgZmkKKwktQGlmIFsgISAtZCAkKERJKS8kKExJQk5BTUUpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKS8kKExJQk5BTUUpOyBmaQorCS1AJChSTV9GKSAkKERJKS9wbmcuaAorCS1AJChSTV9GKSAkKERJKS9wbmdjb25mLmgKKwktQCQoUk1fRikgJChESSkvcG5nbGliY29uZi5oCisJY3AgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCAkKERJKS8kKExJQk5BTUUpCisJY2htb2QgNjQ0ICQoREkpLyQoTElCTkFNRSkvcG5nLmggJChESSkvJChMSUJOQU1FKS9wbmdjb25mLmggJChESSkvJChMSUJOQU1FKS9wbmdsaWJjb25mLmgKKwktQCQoUk1fRikgJChESSkvcG5nLmggJChESSkvcG5nY29uZi5oICQoREkpL3BuZ2xpYmNvbmYuaAorCS1AJChSTV9GKSAkKERJKS9saWJwbmcKKwkoY2QgJChESSk7ICQoTE5fU0YpICQoTElCTkFNRSkgbGlicG5nOyAkKExOX1NGKSAkKExJQk5BTUUpLyogLikKKworaW5zdGFsbC1zdGF0aWM6IGluc3RhbGwtaGVhZGVycyBsaWJwbmcuYQorCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKKwljcCBsaWJwbmcuYSAkKERMKS8kKExJQk5BTUUpLmEKKwljaG1vZCA2NDQgJChETCkvJChMSUJOQU1FKS5hCisJLUAkKFJNX0YpICQoREwpL2xpYnBuZy5hCisJKGNkICQoREwpOyAkKExOX1NGKSAkKExJQk5BTUUpLmEgbGlicG5nLmEpCisKK2luc3RhbGwtc2hhcmVkOiBpbnN0YWxsLWhlYWRlcnMgJChMSUJTT01BSikgbGlicG5nLnBjCisJLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQorCS1AJChSTV9GKSAkKERMKS8kKExJQlNPKQorCS1AJChSTV9GKSAkKERMKS8kKExJQlNPUkVMKQorCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPKQorCWNwICQoTElCU09NQUopICQoREwpLyQoTElCU09SRUwpCisJY2htb2QgNzU1ICQoREwpLyQoTElCU09SRUwpCisJKGNkICQoREwpOyBcCisJJChMTl9TRikgJChMSUJTT1JFTCkgJChMSUJTTyk7IFwKKwkkKExOX1NGKSAkKExJQlNPKSAkKE9MRFNPKSkKKwktQGlmIFsgISAtZCAkKERMKS9wa2djb25maWcgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpL3BrZ2NvbmZpZzsgZmkKKwktQCQoUk1fRikgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKKwktQCQoUk1fRikgJChETCkvcGtnY29uZmlnL2xpYnBuZy5wYworCWNwIGxpYnBuZy5wYyAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYworCWNobW9kIDY0NCAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYworCShjZCAkKERMKS9wa2djb25maWc7ICQoTE5fU0YpICQoTElCTkFNRSkucGMgbGlicG5nLnBjKQorCitpbnN0YWxsLW1hbjogbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQorCS1AaWYgWyAhIC1kICQoRE0pIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKTsgZmkKKwktQGlmIFsgISAtZCAkKERNKS9tYW4zIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW4zOyBmaQorCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZy4zCisJLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5ncGYuMworCWNwIGxpYnBuZy4zICQoRE0pL21hbjMKKwljcCBsaWJwbmdwZi4zICQoRE0pL21hbjMKKwktQGlmIFsgISAtZCAkKERNKS9tYW41IF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW41OyBmaQorCS1AJChSTV9GKSAkKERNKS9tYW41L3BuZy41CisJY3AgcG5nLjUgJChETSkvbWFuNQorCitpbnN0YWxsLWNvbmZpZzogbGlicG5nLWNvbmZpZworCS1AaWYgWyAhIC1kICQoREIpIF07IHRoZW4gJChNS0RJUl9QKSAkKERCKTsgZmkKKwktQCQoUk1fRikgJChEQikvbGlicG5nLWNvbmZpZworCS1AJChSTV9GKSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZworCWNwIGxpYnBuZy1jb25maWcgJChEQikvJChMSUJOQU1FKS1jb25maWcKKwljaG1vZCA3NTUgJChEQikvJChMSUJOQU1FKS1jb25maWcKKwkoY2QgJChEQik7ICQoTE5fU0YpICQoTElCTkFNRSktY29uZmlnIGxpYnBuZy1jb25maWcpCisKK2luc3RhbGw6IGluc3RhbGwtc3RhdGljIGluc3RhbGwtc2hhcmVkIGluc3RhbGwtbWFuIGluc3RhbGwtY29uZmlnCisKKyMgSWYgeW91IGluc3RhbGxlZCBpbiAkKERFU1RESVIpLCB0ZXN0LWluc3RhbGxlZCB3b24ndCB3b3JrIHVudGlsIHlvdQorIyBtb3ZlIHRoZSBsaWJyYXJ5IHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4gIFVzZSB0ZXN0LWRkIHRvIHRlc3QgaXQKKyMgYmVmb3JlIHRoZW4uCisKK3Rlc3QtZGQ6CisJZWNobworCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeSBpbiAkKERMKS4KKwkkKENDKSAtSSQoREkpICQoQ1BQRkxBR1MpIFwKKwkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKKwkgICAtTCQoREwpIC1MJChaTElCTElCKSBcCisJICAgLW8gcG5ndGVzdGQgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAorCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKKwordGVzdC1pbnN0YWxsZWQ6CisJJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpIFwKKwkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKKwkgICAtTCQoWkxJQkxJQikgXAorCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKKwkuL3BuZ3Rlc3RpIHBuZ3Rlc3QucG5nCisKK2NsZWFuOgorCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5nb3V0LnBuZyBsaWJwbmctY29uZmlnIFwKKwkkKExJQlNPKSAkKExJQlNPTUFKKSogcG5ndGVzdC1zdGF0aWMgcG5ndGVzdGkgXAorCXBuZ2xpYmNvbmYuaCBsaWJwbmcucGMKKworRE9DUyA9IEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8KK3dyaXRlbG9jazoKKwljaG1vZCBhLXcgKi5bY2gzNV0gJChET0NTKSBzY3JpcHRzLyoKKworIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgorCitwbmcubyBwbmcucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdlcnJvci5vIHBuZ2Vycm9yLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncmlvLm8gcG5ncmlvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd2lvLm8gcG5nd2lvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nbWVtLm8gcG5nbWVtLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nc2V0Lm8gcG5nc2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nZ2V0Lm8gcG5nZ2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncmVhZC5vIHBuZ3JlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdydHJhbi5vIHBuZ3J0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncnV0aWwubyBwbmdydXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3RyYW5zLm8gcG5ndHJhbnMucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3cml0ZS5vIHBuZ3dyaXRlLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd3RyYW4ubyBwbmd3dHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3d1dGlsLm8gcG5nd3V0aWwucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdwcmVhZC5vIHBuZ3ByZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorCitwbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKZGlmZiAtLWdpdCBhL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnNnZ2NjIGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuc2dnY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBkMDUxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnNnZ2NjCkBAIC0wLDAgKzEsMjM2IEBACisjIG1ha2VmaWxlIGZvciBsaWJwbmcuYSBhbmQgbGlicG5nMTYuc28sIFNHSSBJUklYIHdpdGggJ2NjJworIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiwgMjAwNiwgMjAxMC0yMDE0IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorIyBDb3B5cmlnaHQgKEMpIDE5OTUgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuCisjCisjIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisjIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKworIyBMaWJyYXJ5IG5hbWU6CitMSUJOQU1FPWxpYnBuZzE2CitQTkdNQUogPSAxNgorCisjIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgorTElCU089JChMSUJOQU1FKS5zbworTElCU09NQUo9JChMSUJOQU1FKS5zby4kKFBOR01BSikKK0xJQlNPUkVMPSQoTElCU09NQUopLiQoUkVMRUFTRSkKK09MRFNPPWxpYnBuZy5zbworCisjIFV0aWxpdGllczoKK0FSX1JDPWFyIHJjCitDQz1nY2MKK01LRElSX1A9bWtkaXIgLXAKK0xOX1NGPWxuIC1zZgorUkFOTElCPWVjaG8KK0NQPWNwCitSTV9GPS9iaW4vcm0gLWYKKworIyBXaGVyZSBtYWtlIGluc3RhbGwgcHV0cyBsaWJwbmcuYSwgbGlicG5nMTYuc28sIGFuZCBsaWJwbmcxNi9wbmcuaAorIyBQcmVmaXggbXVzdCBiZSBhIGZ1bGwgcGF0aG5hbWUuCisKK3ByZWZpeD0vdXNyL2xvY2FsCitleGVjX3ByZWZpeD0kKHByZWZpeCkKKworIyBXaGVyZSB0aGUgemxpYiBsaWJyYXJ5IGFuZCBpbmNsdWRlIGZpbGVzIGFyZSBsb2NhdGVkCisjWkxJQkxJQj0vdXNyL2xvY2FsL2xpYjMyCisjWkxJQklOQz0vdXNyL2xvY2FsL2luY2x1ZGUKKyNaTElCTElCPS91c3IvbG9jYWwvbGliCisjWkxJQklOQz0vdXNyL2xvY2FsL2luY2x1ZGUKK1pMSUJMSUI9Li4vemxpYgorWkxJQklOQz0uLi96bGliCisKKyMgQUJJIGNhbiBiZSBibGFuayB0byB1c2UgZGVmYXVsdCBmb3IgeW91ciBzeXN0ZW0sIC0zMiwgLW8zMiwgLW4zMiwgb3IgLTY0CisjIFNlZSAibWFuIGFiaSIuICB6bGliIG11c3QgYmUgYnVpbHQgd2l0aCB0aGUgc2FtZSBBQkkuCitBQkk9CisKK1dBUk5NT1JFPQorQ1BQRkxBR1M9LUkkKFpMSUJJTkMpICMgLURQTkdfREVCVUc9NQorQ0ZMQUdTPSQoQUJJKSAtTyAkKFdBUk5NT1JFKSAtZlBJQyAtbWFiaT1uMzIgIyAtZworTERGTEFHUz0kKEFCSSkgLUwuIC1MJChaTElCTElCKSAtbHBuZyAtbHogLWxtCitMRFNIQVJFRD1jYyAkKEFCSSkgLXNoYXJlZCAtc29uYW1lICQoTElCU09NQUopIFwKKwktc2V0X3ZlcnNpb24gc2dpJChQTkdNQUopLjAKKyMgU2VlICJtYW4gZHNvIiBmb3IgaW5mbyBhYm91dCBzaGFyZWQgb2JqZWN0cworCitJTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCitMSUJQQVRIPSQoZXhlY19wcmVmaXgpL2xpYgorI0xJQlBBVEg9JChleGVjX3ByZWZpeCkvbGliMzIKK01BTlBBVEg9JChwcmVmaXgpL21hbgorQklOUEFUSD0kKGV4ZWNfcHJlZml4KS9iaW4KKworIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAorIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgorIworIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZworIworIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCisjIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKKyMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgorREVTVERJUj0KKworREI9JChERVNURElSKSQoQklOUEFUSCkKK0RJPSQoREVTVERJUikkKElOQ1BBVEgpCitETD0kKERFU1RESVIpJChMSUJQQVRIKQorRE09JChERVNURElSKSQoTUFOUEFUSCkKKworIyBQcmUtYnVpbHQgY29uZmlndXJhdGlvbgorIyBTZWUgc2NyaXB0cy9wbmdsaWJjb25mLm1hayBmb3IgbW9yZSBvcHRpb25zCitQTkdMSUJDT05GX0hfUFJFQlVJTFQgPSBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdAorCitPQkpTID0gIHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKKwlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKKwlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubworCisuYy5vOgorCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtbyAkQCAkPAorCithbGw6IGxpYnBuZy5hIHBuZ3Rlc3Qgc2hhcmVkIGxpYnBuZy5wYyBsaWJwbmctY29uZmlnCisKK3BuZ2xpYmNvbmYuaDogJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpCisJJChDUCkgJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpICRACisKK2xpYnBuZy5hOiAkKE9CSlMpCisJJChBUl9SQykgJEAgJChPQkpTKQorCSQoUkFOTElCKSAkQAorCitzaGFyZWQ6ICQoTElCU09NQUopCisKK2xpYnBuZy5wYzoKKwljYXQgc2NyaXB0cy9saWJwbmcucGMuaW4gfCBzZWQgLWUgcyFAcHJlZml4QCEkKHByZWZpeCkhIFwKKwktZSBzIUBleGVjX3ByZWZpeEAhJChleGVjX3ByZWZpeCkhIFwKKwktZSBzIUBsaWJkaXJAISQoTElCUEFUSCkhIFwKKwktZSBzIUBpbmNsdWRlZGlyQCEkKElOQ1BBVEgpISBcCisJLWUgcyEtbHBuZzE2IS1scG5nMTZcIC1selwgLWxtISA+IGxpYnBuZy5wYworCitsaWJwbmctY29uZmlnOgorCSggY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1oZWFkLmluOyBcCisJZWNobyBwcmVmaXg9XCIkKHByZWZpeClcIjsgXAorCWVjaG8gSV9vcHRzPVwiLUkkKElOQ1BBVEgpLyQoTElCTkFNRSlcIjsgXAorCWVjaG8gY2NvcHRzPVwiJChBQkkpXCI7IFwKKwllY2hvIGNwcGZsYWdzPVwiXCI7IFwKKwllY2hvIGxkb3B0cz1cIiQoQUJJKVwiOyBcCisJZWNobyBMX29wdHM9XCItTCQoTElCUEFUSClcIjsgXAorCWVjaG8gbGliZGlyPVwiJChMSUJQQVRIKVwiOyBcCisJZWNobyBsaWJzPVwiLWxwbmcxNiAtbHogLWxtXCI7IFwKKwljYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gKSA+IGxpYnBuZy1jb25maWcKKwljaG1vZCAreCBsaWJwbmctY29uZmlnCisKKyQoTElCU08pOiAkKExJQlNPTUFKKQorCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pCisKKyQoTElCU09NQUopOiAkKE9CSlMpCisJJChMRFNIQVJFRCkgLW8gJEAgJChPQkpTKQorCSQoUk1fRikgJChMSUJTTykgJChMSUJTT01BSikKKworcG5ndGVzdDogcG5ndGVzdC5vIGxpYnBuZy5hCisJJChDQykgLW8gcG5ndGVzdCAkKENGTEFHUykgcG5ndGVzdC5vICQoTERGTEFHUykKKwordGVzdDogcG5ndGVzdAorCWVjaG8KKwllY2hvIFRlc3RpbmcgbG9jYWwgc3RhdGljIGxpYnJhcnkuCisJLi9wbmd0ZXN0CisKK2luc3RhbGwtaGVhZGVyczogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaAorCS1AaWYgWyAhIC1kICQoREkpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKTsgZmkKKwktQGlmIFsgISAtZCAkKERJKS8kKExJQk5BTUUpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKS8kKExJQk5BTUUpOyBmaQorCWNwIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggJChESSkvJChMSUJOQU1FKQorCWNobW9kIDY0NCAkKERJKS8kKExJQk5BTUUpL3BuZy5oICQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oICQoREkpLyQoTElCTkFNRSkvcG5nbGliY29uZi5oCisJLUAkKFJNX0YpICQoREkpL3BuZy5oICQoREkpL3BuZ2NvbmYuaCAkKERJKS9wbmdsaWJjb25mLmgKKwktQCQoUk1fRikgJChESSkvbGlicG5nCisJKGNkICQoREkpOyAkKExOX1NGKSAkKExJQk5BTUUpIGxpYnBuZzsgJChMTl9TRikgJChMSUJOQU1FKS8qIC4pCisKK2luc3RhbGwtc3RhdGljOiBpbnN0YWxsLWhlYWRlcnMgbGlicG5nLmEKKwktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCisJY3AgbGlicG5nLmEgJChETCkvJChMSUJOQU1FKS5hCisJY2htb2QgNjQ0ICQoREwpLyQoTElCTkFNRSkuYQorCS1AJChSTV9GKSAkKERMKS9saWJwbmcuYQorCShjZCAkKERMKTsgJChMTl9TRikgJChMSUJOQU1FKS5hIGxpYnBuZy5hKQorCitpbnN0YWxsLXNoYXJlZDogaW5zdGFsbC1oZWFkZXJzICQoTElCU09NQUopIGxpYnBuZy5wYworCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKKwktQCQoUk1fRikgJChETCkvJChMSUJTTykKKwktQCQoUk1fRikgJChETCkvJChMSUJTT1JFTCkKKwktQCQoUk1fRikgJChETCkvJChPTERTTykKKwljcCAkKExJQlNPTUFKKSAkKERMKS8kKExJQlNPUkVMKQorCWNobW9kIDc1NSAkKERMKS8kKExJQlNPUkVMKQorCShjZCAkKERMKTsgXAorCSQoTE5fU0YpICQoTElCU09SRUwpICQoTElCU08pOyBcCisJJChMTl9TRikgJChMSUJTTykgJChPTERTTykpCisJLUBpZiBbICEgLWQgJChETCkvcGtnY29uZmlnIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKS9wa2djb25maWc7IGZpCisJLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCisJLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy9saWJwbmcucGMKKwljcCBsaWJwbmcucGMgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKKwljaG1vZCA2NDQgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKKwkoY2QgJChETCkvcGtnY29uZmlnOyAkKExOX1NGKSAkKExJQk5BTUUpLnBjIGxpYnBuZy5wYykKKworaW5zdGFsbC1tYW46IGxpYnBuZy4zIGxpYnBuZ3BmLjMgcG5nLjUKKwktQGlmIFsgISAtZCAkKERNKSBdOyB0aGVuICQoTUtESVJfUCkgJChETSk7IGZpCisJLUBpZiBbICEgLWQgJChETSkvbWFuMyBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuMzsgZmkKKwktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmcuMworCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZ3BmLjMKKwljcCBsaWJwbmcuMyAkKERNKS9tYW4zCisJY3AgbGlicG5ncGYuMyAkKERNKS9tYW4zCisJLUBpZiBbICEgLWQgJChETSkvbWFuNSBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuNTsgZmkKKwktQCQoUk1fRikgJChETSkvbWFuNS9wbmcuNQorCWNwIHBuZy41ICQoRE0pL21hbjUKKworaW5zdGFsbC1jb25maWc6IGxpYnBuZy1jb25maWcKKwktQGlmIFsgISAtZCAkKERCKSBdOyB0aGVuICQoTUtESVJfUCkgJChEQik7IGZpCisJLUAkKFJNX0YpICQoREIpL2xpYnBuZy1jb25maWcKKwktQCQoUk1fRikgJChEQikvJChMSUJOQU1FKS1jb25maWcKKwljcCBsaWJwbmctY29uZmlnICQoREIpLyQoTElCTkFNRSktY29uZmlnCisJY2htb2QgNzU1ICQoREIpLyQoTElCTkFNRSktY29uZmlnCisJKGNkICQoREIpOyAkKExOX1NGKSAkKExJQk5BTUUpLWNvbmZpZyBsaWJwbmctY29uZmlnKQorCitpbnN0YWxsOiBpbnN0YWxsLXN0YXRpYyBpbnN0YWxsLXNoYXJlZCBpbnN0YWxsLW1hbiBpbnN0YWxsLWNvbmZpZworCisjIElmIHlvdSBpbnN0YWxsZWQgaW4gJChERVNURElSKSwgdGVzdC1pbnN0YWxsZWQgd29uJ3Qgd29yayB1bnRpbCB5b3UKKyMgbW92ZSB0aGUgbGlicmFyeSB0byBpdHMgZmluYWwgbG9jYXRpb24uICBVc2UgdGVzdC1kZCB0byB0ZXN0IGl0CisjIGJlZm9yZSB0aGVuLgorCit0ZXN0LWRkOgorCWVjaG8KKwllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkgaW4gJChETCkuCisJJChDQykgLUkkKERJKSAkKENQUEZMQUdTKSBcCisJICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCisJICAgLUwkKERMKSAtTCQoWkxJQkxJQikgXAorCSAgIC1ycGF0aCAkKFpMSUJMSUIpOiQoREwpIFwKKwkgICAtbyBwbmd0ZXN0ZCBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgCisJLi9wbmd0ZXN0ZCBwbmd0ZXN0LnBuZworCit0ZXN0LWluc3RhbGxlZDoKKwllY2hvCisJZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5LgorCSQoQ0MpICQoQ1BQRkxBR1MpIFwKKwkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKKwkgICAtTCQoWkxJQkxJQikgXAorCSAgIC1ycGF0aCAkKFpMSUJMSUIpOmAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGliZGlyYCBcCisJICAgLW8gcG5ndGVzdGkgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAorCS4vcG5ndGVzdGkgcG5ndGVzdC5wbmcKKworY2xlYW46CisJJChSTV9GKSBsaWJwbmcuYSBwbmd0ZXN0IHBuZ3Rlc3RpIHBuZ291dC5wbmcgbGlicG5nLnBjIFwKKwlzb19sb2NhdGlvbnMgbGlicG5nLWNvbmZpZyAkKExJQlNPKSAkKExJQlNPTUFKKSogcG5nbGliY29uZi5oCisKK0RPQ1MgPSBBTk5PVU5DRSBDSEFOR0VTIElOU1RBTEwgS05PV05CVUcgTElDRU5TRSBSRUFETUUgVE9ETyBZMktJTkZPCit3cml0ZWxvY2s6CisJY2htb2QgYS13ICouW2NoMzVdICQoRE9DUykgc2NyaXB0cy8qCisKKyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KKworcG5nLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdlcnJvci5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncmlvLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3aW8ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ21lbS5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nc2V0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdnZXQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3JlYWQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3J0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdydXRpbC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ndHJhbnMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3dyaXRlLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3dHJhbi5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd3V0aWwubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3ByZWFkLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisKK3BuZ3Rlc3QubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaApkaWZmIC0tZ2l0IGEvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuc2dpIGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuc2dpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZjA5MDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5zZ2kKQEAgLTAsMCArMSwyMzcgQEAKKyMgbWFrZWZpbGUgZm9yIGxpYnBuZy5hIGFuZCBsaWJwbmcxNi5zbywgU0dJIElSSVggd2l0aCAnY2MnCisjIENvcHlyaWdodCAoQykgMjAwMS0yMDAyLCAyMDA2LCAyMDA3LCAyMDEwLTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCisjIENvcHlyaWdodCAoQykgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KKyMKKyMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorIyBhbmQgbGljZW5zZSBpbiBwbmcuaAorCisjIExpYnJhcnkgbmFtZToKK0xJQk5BTUU9bGlicG5nMTYKK1BOR01BSiA9IDE2CisKKyMgU2hhcmVkIGxpYnJhcnkgbmFtZXM6CitMSUJTTz0kKExJQk5BTUUpLnNvCitMSUJTT01BSj0kKExJQk5BTUUpLnNvLiQoUE5HTUFKKQorTElCU09SRUw9JChMSUJTT01BSikuJChSRUxFQVNFKQorT0xEU089bGlicG5nLnNvCisKKyMgVXRpbGl0aWVzOgorQVJfUkM9YXIgcmMKK0NDPWNjCitNS0RJUl9QPW1rZGlyIC1wCitMTl9TRj1sbiAtc2YKK1JBTkxJQj1lY2hvCitDUD1jcAorUk1fRj0vYmluL3JtIC1mCisKKyMgV2hlcmUgbWFrZSBpbnN0YWxsIHB1dHMgbGlicG5nLmEsIGxpYnBuZzE2LnNvLCBhbmQgbGlicG5nMTYvcG5nLmgKKyMgUHJlZml4IG11c3QgYmUgYSBmdWxsIHBhdGhuYW1lLgorCitwcmVmaXg9L3Vzci9sb2NhbAorZXhlY19wcmVmaXg9JChwcmVmaXgpCisKKyMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZAorI1pMSUJMSUI9L3Vzci9sb2NhbC9saWIzMgorI1pMSUJJTkM9L3Vzci9sb2NhbC9pbmNsdWRlCisjWkxJQkxJQj0vdXNyL2xvY2FsL2xpYgorI1pMSUJJTkM9L3Vzci9sb2NhbC9pbmNsdWRlCitaTElCTElCPS4uL3psaWIKK1pMSUJJTkM9Li4vemxpYgorCisjIEFCSSBjYW4gYmUgYmxhbmsgdG8gdXNlIGRlZmF1bHQgZm9yIHlvdXIgc3lzdGVtLCAtMzIsIC1vMzIsIC1uMzIsIG9yIC02NAorIyBTZWUgIm1hbiBhYmkiLiAgemxpYiBtdXN0IGJlIGJ1aWx0IHdpdGggdGhlIHNhbWUgQUJJLgorQUJJPQorCitXQVJOTU9SRT0tZnVsbHdhcm4KKyMgTm90ZTogLUtQSUMgaXMgdGhlIGRlZmF1bHQgYW55aG93CitDUFBGTEFHUz0tSSQoWkxJQklOQykgIyAtRFBOR19ERUJVRz01CisjQ0ZMQUdTPSAkKEFCSSkgLU8gJChXQVJOTU9SRSkgLUtQSUMgIyAtZworQ0ZMQUdTPSQoQUJJKSAtTyAkKFdBUk5NT1JFKQorTERGTEFHU19BPSQoQUJJKSAtTC4gLUwkKFpMSUJMSUIpIC1scG5nMTYgLWx6IC1sbQorTERGTEFHUz0kKEFCSSkgLUwuIC1MJChaTElCTElCKSAtbHBuZyAtbHogLWxtCitMRFNIQVJFRD1jYyAkKEFCSSkgLXNoYXJlZCAtc29uYW1lICQoTElCU09NQUopIFwKKwktc2V0X3ZlcnNpb24gc2dpJChQTkdNQUopLjAKKyMgU2VlICJtYW4gZHNvIiBmb3IgaW5mbyBhYm91dCBzaGFyZWQgb2JqZWN0cworCitJTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCitMSUJQQVRIPSQoZXhlY19wcmVmaXgpL2xpYgorI0xJQlBBVEg9JChleGVjX3ByZWZpeCkvbGliMzIKK01BTlBBVEg9JChwcmVmaXgpL21hbgorQklOUEFUSD0kKGV4ZWNfcHJlZml4KS9iaW4KKworIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAorIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgorIworIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZworIworIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCisjIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKKyMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgorREVTVERJUj0KKworREI9JChERVNURElSKSQoQklOUEFUSCkKK0RJPSQoREVTVERJUikkKElOQ1BBVEgpCitETD0kKERFU1RESVIpJChMSUJQQVRIKQorRE09JChERVNURElSKSQoTUFOUEFUSCkKKworIyBQcmUtYnVpbHQgY29uZmlndXJhdGlvbgorIyBTZWUgc2NyaXB0cy9wbmdsaWJjb25mLm1hayBmb3IgbW9yZSBvcHRpb25zCitQTkdMSUJDT05GX0hfUFJFQlVJTFQgPSBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdAorCitPQkpTID0gIHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKKwlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKKwlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubworCisuYy5vOgorCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtbyAkQCAkPAorCithbGw6IGxpYnBuZy5hIHBuZ3Rlc3Qgc2hhcmVkIGxpYnBuZy5wYyBsaWJwbmctY29uZmlnCisKK3BuZ2xpYmNvbmYuaDogJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpCisJJChDUCkgJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpICRACisKK2xpYnBuZy5hOiAkKE9CSlMpCisJJChBUl9SQykgJEAgJChPQkpTKQorCSQoUkFOTElCKSAkQAorCitsaWJwbmcucGM6CisJY2F0IHNjcmlwdHMvbGlicG5nLnBjLmluIHwgc2VkIC1lIHMhQHByZWZpeEAhJChwcmVmaXgpISBcCisJLWUgcyFAZXhlY19wcmVmaXhAISQoZXhlY19wcmVmaXgpISBcCisJLWUgcyFAbGliZGlyQCEkKExJQlBBVEgpISBcCisJLWUgcyFAaW5jbHVkZWRpckAhJChJTkNQQVRIKSEgXAorCS1lIHMhLWxwbmcxNiEtbHBuZzE2XCAtbHpcIC1sbSEgPiBsaWJwbmcucGMKKworbGlicG5nLWNvbmZpZzoKKwkoIGNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbjsgXAorCWVjaG8gcHJlZml4PVwiJChwcmVmaXgpXCI7IFwKKwllY2hvIElfb3B0cz1cIi1JJChJTkNQQVRIKS8kKExJQk5BTUUpXCI7IFwKKwllY2hvIGNjb3B0cz1cIiQoQUJJKVwiOyBcCisJZWNobyBsZG9wdHM9XCIkKEFCSSlcIjsgXAorCWVjaG8gTF9vcHRzPVwiLUwkKExJQlBBVEgpXCI7IFwKKwllY2hvIGxpYmRpcj1cIiQoTElCUEFUSClcIjsgXAorCWVjaG8gbGlicz1cIi1scG5nMTYgLWx6IC1sbVwiOyBcCisJY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1ib2R5LmluICkgPiBsaWJwbmctY29uZmlnCisJY2htb2QgK3ggbGlicG5nLWNvbmZpZworCiskKExJQlNPKTogJChMSUJTT01BSikKKwkkKExOX1NGKSAkKExJQlNPTUFKKSAkKExJQlNPKQorCiskKExJQlNPTUFKKTogJChPQkpTKQorCSQoTERTSEFSRUQpIC1vICRAICQoT0JKUykKKwkkKFJNX0YpICQoTElCU08pICQoTElCU09NQUopCisKK3BuZ3Rlc3Q6IHBuZ3Rlc3QubyBsaWJwbmcuYQorCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCisKK3Rlc3Q6IHBuZ3Rlc3QKKwllY2hvCisJZWNobyBUZXN0aW5nIGxvY2FsIHN0YXRpYyBsaWJyYXJ5LgorCS4vcG5ndGVzdAorCitpbnN0YWxsLWhlYWRlcnM6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKKwktQGlmIFsgISAtZCAkKERJKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCisJLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSkvJChMSUJOQU1FKTsgZmkKKwljcCBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oICQoREkpLyQoTElCTkFNRSkKKwljaG1vZCA2NDQgJChESSkvJChMSUJOQU1FKS9wbmcuaCAkKERJKS8kKExJQk5BTUUpL3BuZ2NvbmYuaCAkKERJKS8kKExJQk5BTUUpL3BuZ2xpYmNvbmYuaAorCS1AJChSTV9GKSAkKERJKS9wbmcuaCAkKERJKS9wbmdjb25mLmggJChESSkvcG5nbGliY29uZi5oCisJLUAkKFJNX0YpICQoREkpL2xpYnBuZworCShjZCAkKERJKTsgJChMTl9TRikgJChMSUJOQU1FKSBsaWJwbmc7ICQoTE5fU0YpICQoTElCTkFNRSkvKiAuKQorCitpbnN0YWxsLXN0YXRpYzogaW5zdGFsbC1oZWFkZXJzIGxpYnBuZy5hCisJLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQorCWNwIGxpYnBuZy5hICQoREwpLyQoTElCTkFNRSkuYQorCWNobW9kIDY0NCAkKERMKS8kKExJQk5BTUUpLmEKKwktQCQoUk1fRikgJChETCkvbGlicG5nLmEKKwkoY2QgJChETCk7ICQoTE5fU0YpICQoTElCTkFNRSkuYSBsaWJwbmcuYSkKKworaW5zdGFsbC1zaGFyZWQ6IGluc3RhbGwtaGVhZGVycyAkKExJQlNPTUFKKSBsaWJwbmcucGMKKwktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCisJLUAkKFJNX0YpICQoREwpLyQoTElCU08pCisJLUAkKFJNX0YpICQoREwpLyQoTElCU09SRUwpCisJLUAkKFJNX0YpICQoREwpLyQoT0xEU08pCisJY3AgJChMSUJTT01BSikgJChETCkvJChMSUJTT1JFTCkKKwljaG1vZCA3NTUgJChETCkvJChMSUJTT1JFTCkKKwkoY2QgJChETCk7IFwKKwkkKExOX1NGKSAkKExJQlNPUkVMKSAkKExJQlNPKTsgXAorCSQoTE5fU0YpICQoTElCU08pICQoT0xEU08pKQorCS1AaWYgWyAhIC1kICQoREwpL3BrZ2NvbmZpZyBdOyB0aGVuICQoTUtESVJfUCkgJChETCkvcGtnY29uZmlnOyBmaQorCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYworCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvbGlicG5nLnBjCisJY3AgbGlicG5nLnBjICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCisJY2htb2QgNjQ0ICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCisJKGNkICQoREwpL3BrZ2NvbmZpZzsgJChMTl9TRikgJChMSUJOQU1FKS5wYyBsaWJwbmcucGMpCisKK2luc3RhbGwtbWFuOiBsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41CisJLUBpZiBbICEgLWQgJChETSkgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pOyBmaQorCS1AaWYgWyAhIC1kICQoRE0pL21hbjMgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjM7IGZpCisJLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5nLjMKKwktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmdwZi4zCisJY3AgbGlicG5nLjMgJChETSkvbWFuMworCWNwIGxpYnBuZ3BmLjMgJChETSkvbWFuMworCS1AaWYgWyAhIC1kICQoRE0pL21hbjUgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjU7IGZpCisJLUAkKFJNX0YpICQoRE0pL21hbjUvcG5nLjUKKwljcCBwbmcuNSAkKERNKS9tYW41CisKK2luc3RhbGwtY29uZmlnOiBsaWJwbmctY29uZmlnCisJLUBpZiBbICEgLWQgJChEQikgXTsgdGhlbiAkKE1LRElSX1ApICQoREIpOyBmaQorCS1AJChSTV9GKSAkKERCKS9saWJwbmctY29uZmlnCisJLUAkKFJNX0YpICQoREIpLyQoTElCTkFNRSktY29uZmlnCisJY3AgbGlicG5nLWNvbmZpZyAkKERCKS8kKExJQk5BTUUpLWNvbmZpZworCWNobW9kIDc1NSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZworCShjZCAkKERCKTsgJChMTl9TRikgJChMSUJOQU1FKS1jb25maWcgbGlicG5nLWNvbmZpZykKKworaW5zdGFsbDogaW5zdGFsbC1zdGF0aWMgaW5zdGFsbC1zaGFyZWQgaW5zdGFsbC1tYW4gaW5zdGFsbC1jb25maWcKKworIyBJZiB5b3UgaW5zdGFsbGVkIGluICQoREVTVERJUiksIHRlc3QtaW5zdGFsbGVkIHdvbid0IHdvcmsgdW50aWwgeW91CisjIG1vdmUgdGhlIGxpYnJhcnkgdG8gaXRzIGZpbmFsIGxvY2F0aW9uLiAgVXNlIHRlc3QtZGQgdG8gdGVzdCBpdAorIyBiZWZvcmUgdGhlbi4KKwordGVzdC1kZDoKKwllY2hvCisJZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5IGluICQoREwpLgorCSQoQ0MpIC1JJChESSkgJChDUFBGTEFHUykgXAorCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAorCSAgIC1MJChETCkgLUwkKFpMSUJMSUIpIFwKKwkgICAtcnBhdGggJChaTElCTElCKTokKERMKSBcCisJICAgLW8gcG5ndGVzdGQgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAorCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKKwordGVzdC1pbnN0YWxsZWQ6CisJZWNobworCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeS4KKwkkKENDKSAkKENQUEZMQUdTKSBcCisJICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCisJICAgLUwkKFpMSUJMSUIpIFwKKwkgICAtcnBhdGggJChaTElCTElCKTpgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxpYmRpcmAgXAorCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKKwkuL3BuZ3Rlc3RpIHBuZ3Rlc3QucG5nCisKK2NsZWFuOgorCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5ndGVzdGkgcG5nb3V0LnBuZyBsaWJwbmcucGMgbGlicG5nLWNvbmZpZyBcCisJJChMSUJTTykgJChMSUJTT01BSikqIFwKKwlzb19sb2NhdGlvbnMgcG5nbGliY29uZi5oCisKK0RPQ1MgPSBBTk5PVU5DRSBDSEFOR0VTIElOU1RBTEwgS05PV05CVUcgTElDRU5TRSBSRUFETUUgVE9ETyBZMktJTkZPCit3cml0ZWxvY2s6CisJY2htb2QgYS13ICouW2NoMzVdICQoRE9DUykgc2NyaXB0cy8qCisKKyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KKworcG5nLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdlcnJvci5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncmlvLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3aW8ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ21lbS5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nc2V0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdnZXQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3JlYWQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3J0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdydXRpbC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ndHJhbnMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3dyaXRlLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3dHJhbi5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd3V0aWwubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3ByZWFkLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisKK3BuZ3Rlc3QubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaApkaWZmIC0tZ2l0IGEvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuc285IGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuc285Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhOTMwOGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5zbzkKQEAgLTAsMCArMSwyNDcgQEAKKyMgbWFrZWZpbGUgZm9yIGxpYnBuZyBvbiBTb2xhcmlzIDkgKGJldGEpIHdpdGggRm9ydGUgY2MKKyMgVXBkYXRlZCBieSBDaGFkIFNjaHJvY2sgZm9yIFNvbGFyaXMgOQorIyBDb250cmlidXRlZCBieSBXaWxsaWFtIEwuIFNlYm9rLCBiYXNlZCBvbiBtYWtlZmlsZS5saW51eAorIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDYsIDIwMDgsIDIwMTAtMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyMgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDEgR3JlZyBSb2Vsb2ZzCisjIENvcHlyaWdodCAoQykgMTk5Ni0xOTk3IEFuZHJlYXMgRGlsZ2VyCisjCisjIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisjIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKworIyBMaWJyYXJ5IG5hbWU6CitQTkdNQUogPSAxNgorTElCTkFNRSA9IGxpYnBuZzE2CisKKyMgU2hhcmVkIGxpYnJhcnkgbmFtZXM6CitMSUJTTz0kKExJQk5BTUUpLnNvCitMSUJTT01BSj0kKExJQk5BTUUpLnNvLiQoUE5HTUFKKQorTElCU09SRUw9JChMSUJTT01BSikuJChSRUxFQVNFKQorT0xEU089bGlicG5nLnNvCisKKyMgVXRpbGl0aWVzOgorIyBnY2MgMi45NSBkb2Vzbid0IHdvcmsuCitDQz1jYworQVJfUkM9YXIgcmMKK01LRElSX1A9bWtkaXIgLXAKK0xOX1NGPWxuIC1mIC1zCitSQU5MSUI9ZWNobworQ1A9Y3AKK1JNX0Y9L2Jpbi9ybSAtZgorCisjIFdoZXJlIG1ha2UgaW5zdGFsbCBwdXRzIGxpYnBuZy5hLCAkKE9MRFNPKSosIGFuZCBwbmcuaAorcHJlZml4PS91c3IvbG9jYWwKK2V4ZWNfcHJlZml4PSQocHJlZml4KQorCisjIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKKyMgQ2hhbmdpbmcgdGhlc2UgdG8gLi4vemxpYiBwb3NlcyBhIHNlY3VyaXR5IHJpc2suICBJZiB5b3Ugd2FudAorIyB0byBoYXZlIHpsaWIgaW4gYW4gYWRqYWNlbnQgZGlyZWN0b3J5LCBzcGVjaWZ5IHRoZSBmdWxsIHBhdGggaW5zdGVhZCBvZiAiLi4iLgorI1pMSUJMSUI9Li4vemxpYgorI1pMSUJJTkM9Li4vemxpYgorI1pMSUJMSUI9L3Vzci9sb2NhbC9saWIKKyNaTElCSU5DPS91c3IvbG9jYWwvaW5jbHVkZQorI1VzZSB0aGUgcHJlaW5zdGFsbGVkIHpsaWIgdGhhdCBjb21lcyB3aXRoIFNvbGFyaXMgOToKK1pMSUJMSUI9L3Vzci9saWIKK1pMSUJJTkM9L3Vzci9pbmNsdWRlCisKKyNXQVJOTU9SRT0tV3dyaXRlLXN0cmluZ3MgLVdwb2ludGVyLWFyaXRoIC1Xc2hhZG93IFwKKwktV21pc3NpbmctZGVjbGFyYXRpb25zIC1XdHJhZGl0aW9uYWwgLVdjYXN0LWFsaWduIFwKKwktV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzICMtV2NvbnZlcnNpb24KK0NQUEZMQUdTPS1JJChaTElCSU5DKSAjIC1EUE5HX0RFQlVHPTUKKyNDRkxBR1M9LVcgLVdhbGwgLU8zICQoV0FSTk1PUkUpIC1nCitDRkxBR1M9LU8zCitMREZMQUdTPS1MLiAtUi4gLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKSAtbHBuZzE2IC1seiAtbG0KKworSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQorTElCUEFUSD0kKGV4ZWNfcHJlZml4KS9saWIKK01BTlBBVEg9JChwcmVmaXgpL21hbgorQklOUEFUSD0kKGV4ZWNfcHJlZml4KS9iaW4KKworIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAorIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgorIworIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZworIworIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCisjIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKKyMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgorREVTVERJUj0KKworREI9JChERVNURElSKSQoQklOUEFUSCkKK0RJPSQoREVTVERJUikkKElOQ1BBVEgpCitETD0kKERFU1RESVIpJChMSUJQQVRIKQorRE09JChERVNURElSKSQoTUFOUEFUSCkKKworIyBQcmUtYnVpbHQgY29uZmlndXJhdGlvbgorIyBTZWUgc2NyaXB0cy9wbmdsaWJjb25mLm1hayBmb3IgbW9yZSBvcHRpb25zCitQTkdMSUJDT05GX0hfUFJFQlVJTFQgPSBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdAorCitPQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAorCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAorCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCisKK09CSlNETEwgPSAkKE9CSlM6Lm89LnBpYy5vKQorCisuU1VGRklYRVM6ICAgICAgLmMgLm8gLnBpYy5vCisKKy5jLm86CisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1vICRAICQ8CisKKy5jLnBpYy5vOgorCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtS1BJQyAtbyAkQCAkKi5jCisKK2FsbDogbGlicG5nLmEgJChMSUJTTykgcG5ndGVzdCBsaWJwbmcucGMgbGlicG5nLWNvbmZpZworCitwbmdsaWJjb25mLmg6ICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKQorCSQoQ1ApICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKSAkQAorCitsaWJwbmcuYTogJChPQkpTKQorCSQoQVJfUkMpICRAICQoT0JKUykKKwkkKFJBTkxJQikgJEAKKworbGlicG5nLnBjOgorCWNhdCBzY3JpcHRzL2xpYnBuZy5wYy5pbiB8IHNlZCAtZSBzIUBwcmVmaXhAISQocHJlZml4KSEgXAorCS1lIHMhQGV4ZWNfcHJlZml4QCEkKGV4ZWNfcHJlZml4KSEgXAorCS1lIHMhQGxpYmRpckAhJChMSUJQQVRIKSEgXAorCS1lIHMhQGluY2x1ZGVkaXJAISQoSU5DUEFUSCkhIFwKKwktZSBzIS1scG5nMTYhLWxwbmcxNlwgLWx6XCAtbG0hID4gbGlicG5nLnBjCisKK2xpYnBuZy1jb25maWc6CisJKCBjYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWhlYWQuaW47IFwKKwllY2hvIHByZWZpeD1cIiQocHJlZml4KVwiOyBcCisJZWNobyBJX29wdHM9XCItSSQoSU5DUEFUSCkvJChMSUJOQU1FKVwiOyBcCisJZWNobyBMX29wdHM9XCItTCQoTElCUEFUSClcIjsgXAorCWVjaG8gUl9vcHRzPVwiLVIkKExJQlBBVEgpXCI7IFwKKwllY2hvIGxpYnM9XCItbHBuZzE2IC1seiAtbG1cIjsgXAorCWNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctYm9keS5pbiApID4gbGlicG5nLWNvbmZpZworCWNobW9kICt4IGxpYnBuZy1jb25maWcKKworJChMSUJTTyk6ICQoTElCU09NQUopCisJJChMTl9TRikgJChMSUJTT01BSikgJChMSUJTTykKKworJChMSUJTT01BSik6ICQoT0JKU0RMTCkKKwlAY2FzZSAiYHR5cGUgbGRgIiBpbiAqdWNiKikgXAorCWVjaG87IFwKKwllY2hvICcjIyBXQVJOSU5HOic7IFwKKwllY2hvICcjIyBUaGUgY29tbWFuZHMgIkNDIiBhbmQgIkxEIiBtdXN0IE5PVCByZWZlciB0byAvdXNyL3VjYi9jYyc7IFwKKwllY2hvICcjIyBhbmQgL3Vzci91Y2IvbGQuICBJZiB0aGV5IGRvLCB5b3UgbmVlZCB0byBhZGp1c3QgeW91ciBQQVRIJzsgXAorCWVjaG8gJyMjIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHB1dCAvdXNyL2Njcy9iaW4gYWhlYWQgb2YgL3Vzci91Y2IuJzsgXAorCWVjaG8gJyMjIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBMRF9MSUJSQVJZX1BBVEggc2hvdWxkIG5vdCBiZSBzZXQnOyBcCisJZWNobyAnIyMgYXQgYWxsLiAgSWYgaXQgaXMsIHRoaW5ncyBhcmUgbGlrZWx5IHRvIGJyZWFrIGJlY2F1c2Ugb2YnOyBcCisJZWNobyAnIyMgdGhlIGxpYnVjYiBkZXBlbmRlbmN5IHRoYXQgaXMgY3JlYXRlZC4nOyBcCisJZWNobzsgXAorCTs7IFwKKwllc2FjCisJJChMRCkgLUcgLWggJChMSUJTT01BSikgXAorCSAtbyAkKExJQlNPTUFKKSAkKE9CSlNETEwpCisKK3BuZ3Rlc3Q6IHBuZ3Rlc3QubyAkKExJQlNPKQorCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCisKK3Rlc3Q6IHBuZ3Rlc3QKKwkuL3BuZ3Rlc3QKKworaW5zdGFsbC1oZWFkZXJzOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCisJLUBpZiBbICEgLWQgJChESSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpOyBmaQorCS1AaWYgWyAhIC1kICQoREkpLyQoTElCTkFNRSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpLyQoTElCTkFNRSk7IGZpCisJY3AgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCAkKERJKS8kKExJQk5BTUUpCisJY2htb2QgNjQ0ICQoREkpLyQoTElCTkFNRSkvcG5nLmggJChESSkvJChMSUJOQU1FKS9wbmdjb25mLmggJChESSkvJChMSUJOQU1FKS9wbmdsaWJjb25mLmgKKwktQCQoUk1fRikgJChESSkvcG5nLmggJChESSkvcG5nY29uZi5oICQoREkpL3BuZ2xpYmNvbmYuaAorCS1AJChSTV9GKSAkKERJKS9saWJwbmcKKwkoY2QgJChESSk7ICQoTE5fU0YpICQoTElCTkFNRSkgbGlicG5nOyAkKExOX1NGKSAkKExJQk5BTUUpLyogLikKKworaW5zdGFsbC1zdGF0aWM6IGluc3RhbGwtaGVhZGVycyBsaWJwbmcuYQorCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKKwljcCBsaWJwbmcuYSAkKERMKS8kKExJQk5BTUUpLmEKKwljaG1vZCA2NDQgJChETCkvJChMSUJOQU1FKS5hCisJLUAkKFJNX0YpICQoREwpL2xpYnBuZy5hCisJKGNkICQoREwpOyAkKExOX1NGKSAkKExJQk5BTUUpLmEgbGlicG5nLmEpCisKK2luc3RhbGwtc2hhcmVkOiBpbnN0YWxsLWhlYWRlcnMgJChMSUJTT01BSikgbGlicG5nLnBjCisJLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQorCS1AJChSTV9GKSAkKERMKS8kKExJQlNPKQorCS1AJChSTV9GKSAkKERMKS8kKExJQlNPUkVMKQorCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPKQorCWNwICQoTElCU09NQUopICQoREwpLyQoTElCU09SRUwpCisJY2htb2QgNzU1ICQoREwpLyQoTElCU09SRUwpCisJKGNkICQoREwpOyBcCisJJChMTl9TRikgJChMSUJTT1JFTCkgJChMSUJTTyk7IFwKKwkkKExOX1NGKSAkKExJQlNPKSAkKE9MRFNPKSkKKwktQGlmIFsgISAtZCAkKERMKS9wa2djb25maWcgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpL3BrZ2NvbmZpZzsgZmkKKwktQCQoUk1fRikgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKKwktQCQoUk1fRikgJChETCkvcGtnY29uZmlnL2xpYnBuZy5wYworCWNwIGxpYnBuZy5wYyAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYworCWNobW9kIDY0NCAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYworCShjZCAkKERMKS9wa2djb25maWc7ICQoTE5fU0YpICQoTElCTkFNRSkucGMgbGlicG5nLnBjKQorCitpbnN0YWxsLW1hbjogbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQorCS1AaWYgWyAhIC1kICQoRE0pIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKTsgZmkKKwktQGlmIFsgISAtZCAkKERNKS9tYW4zIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW4zOyBmaQorCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZy4zCisJLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5ncGYuMworCWNwIGxpYnBuZy4zICQoRE0pL21hbjMKKwljcCBsaWJwbmdwZi4zICQoRE0pL21hbjMKKwktQGlmIFsgISAtZCAkKERNKS9tYW41IF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW41OyBmaQorCS1AJChSTV9GKSAkKERNKS9tYW41L3BuZy41CisJY3AgcG5nLjUgJChETSkvbWFuNQorCitpbnN0YWxsLWNvbmZpZzogbGlicG5nLWNvbmZpZworCS1AaWYgWyAhIC1kICQoREIpIF07IHRoZW4gJChNS0RJUl9QKSAkKERCKTsgZmkKKwktQCQoUk1fRikgJChEQikvbGlicG5nLWNvbmZpZworCS1AJChSTV9GKSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZworCWNwIGxpYnBuZy1jb25maWcgJChEQikvJChMSUJOQU1FKS1jb25maWcKKwljaG1vZCA3NTUgJChEQikvJChMSUJOQU1FKS1jb25maWcKKwkoY2QgJChEQik7ICQoTE5fU0YpICQoTElCTkFNRSktY29uZmlnIGxpYnBuZy1jb25maWcpCisKK2luc3RhbGw6IGluc3RhbGwtc3RhdGljIGluc3RhbGwtc2hhcmVkIGluc3RhbGwtbWFuIGluc3RhbGwtY29uZmlnCisKKyMgSWYgeW91IGluc3RhbGxlZCBpbiAkKERFU1RESVIpLCB0ZXN0LWluc3RhbGxlZCB3b24ndCB3b3JrIHVudGlsIHlvdQorIyBtb3ZlIHRoZSBsaWJyYXJ5IHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4gIFVzZSB0ZXN0LWRkIHRvIHRlc3QgaXQKKyMgYmVmb3JlIHRoZW4uCisKK3Rlc3QtZGQ6CisJZWNobworCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeSBpbiAkKERMKS4KKwkkKENDKSAtSSQoREkpICQoQ1BQRkxBR1MpIFwKKwkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKKwkgICAtbyBwbmd0ZXN0ZCBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgIFwKKwkgICAtTCQoREwpIC1MJChaTElCTElCKSAgLVIkKFpMSUJMSUIpIC1SJChETCkKKwkuL3BuZ3Rlc3RkIHBuZ3Rlc3QucG5nCisKK3Rlc3QtaW5zdGFsbGVkOgorCWVjaG8KKwllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkuCisJJChDQykgJChDUFBGTEFHUykgXAorCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAorCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AgXAorCSAgIC1MJChaTElCTElCKSAtUiQoWkxJQkxJQikKKwkuL3BuZ3Rlc3RpIHBuZ3Rlc3QucG5nCisKK2NsZWFuOgorCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5ndGVzdGkgcG5nb3V0LnBuZyBcCisJbGlicG5nLWNvbmZpZyAkKExJQlNPKSAkKExJQlNPTUFKKSogXAorCWxpYnBuZy5wYyBwbmdsaWJjb25mLmgKKworRE9DUyA9IEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8KK3dyaXRlbG9jazoKKwljaG1vZCBhLXcgKi5bY2gzNV0gJChET0NTKSBzY3JpcHRzLyoKKworIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgorCitwbmcubyBwbmcucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdlcnJvci5vIHBuZ2Vycm9yLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncmlvLm8gcG5ncmlvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd2lvLm8gcG5nd2lvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nbWVtLm8gcG5nbWVtLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nc2V0Lm8gcG5nc2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nZ2V0Lm8gcG5nZ2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncmVhZC5vIHBuZ3JlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdydHJhbi5vIHBuZ3J0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncnV0aWwubyBwbmdydXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3RyYW5zLm8gcG5ndHJhbnMucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3cml0ZS5vIHBuZ3dyaXRlLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd3RyYW4ubyBwbmd3dHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3d1dGlsLm8gcG5nd3V0aWwucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdwcmVhZC5vIHBuZ3ByZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorCitwbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKZGlmZiAtLWdpdCBhL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnNvbGFyaXMgYi9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5zb2xhcmlzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNDUwZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5zb2xhcmlzCkBAIC0wLDAgKzEsMjQ0IEBACisjIG1ha2VmaWxlIGZvciBsaWJwbmcgb24gU29sYXJpcyAyLnggd2l0aCBnY2MKKyMgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA2LTIwMDgsIDIwMTAtMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyMgQ29udHJpYnV0ZWQgYnkgV2lsbGlhbSBMLiBTZWJvaywgYmFzZWQgb24gbWFrZWZpbGUubGludXgKKyMgQ29weXJpZ2h0IChDKSAxOTk4IEdyZWcgUm9lbG9mcworIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIKKyMKKyMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorIyBhbmQgbGljZW5zZSBpbiBwbmcuaAorCisjIExpYnJhcnkgbmFtZToKK0xJQk5BTUUgPSBsaWJwbmcxNgorUE5HTUFKID0gMTYKKworIyBTaGFyZWQgbGlicmFyeSBuYW1lczoKK0xJQlNPPSQoTElCTkFNRSkuc28KK0xJQlNPTUFKPSQoTElCTkFNRSkuc28uJChQTkdNQUopCitMSUJTT1JFTD0kKExJQlNPTUFKKS4kKFJFTEVBU0UpCitPTERTTz1saWJwbmcuc28KKworIyBVdGlsaXRpZXM6CitBUl9SQz1hciByYworQ0M9Z2NjCitNS0RJUl9QPW1rZGlyIC1wCitMTl9TRj1sbiAtZiAtcworUkFOTElCPWVjaG8KK0NQPWNwCitSTV9GPS9iaW4vcm0gLWYKKworIyBXaGVyZSBtYWtlIGluc3RhbGwgcHV0cyBsaWJwbmcuYSwgbGlicG5nMTYuc28qLCBhbmQgcG5nLmgKK3ByZWZpeD0vdXNyL2xvY2FsCitleGVjX3ByZWZpeD0kKHByZWZpeCkKKworIyBXaGVyZSB0aGUgemxpYiBsaWJyYXJ5IGFuZCBpbmNsdWRlIGZpbGVzIGFyZSBsb2NhdGVkCisjIENoYW5naW5nIHRoZXNlIHRvIC4uL3psaWIgcG9zZXMgYSBzZWN1cml0eSByaXNrLiAgSWYgeW91IHdhbnQKKyMgdG8gaGF2ZSB6bGliIGluIGFuIGFkamFjZW50IGRpcmVjdG9yeSwgc3BlY2lmeSB0aGUgZnVsbCBwYXRoIGluc3RlYWQgb2YgIi4uIi4KKyNaTElCTElCPS4uL3psaWIKKyNaTElCSU5DPS4uL3psaWIKKworWkxJQkxJQj0vdXNyL2xvY2FsL2xpYgorWkxJQklOQz0vdXNyL2xvY2FsL2luY2x1ZGUKKworV0FSTk1PUkU9LVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCAtV3NoYWRvdyBcCisJLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV3RyYWRpdGlvbmFsIC1XY2FzdC1hbGlnbiBcCisJLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyAjLVdjb252ZXJzaW9uCitDUFBGTEFHUz0tSSQoWkxJQklOQykgIyAtRFBOR19ERUJVRz01CitDRkxBR1M9IC1XIC1XYWxsIC1PIFwKKwkjICQoV0FSTk1PUkUpIC1nIC1EUE5HX0RFQlVHPTUKK0xERkxBR1M9LUwuIC1SLiAtTCQoWkxJQkxJQikgLVIkKFpMSUJMSUIpIC1scG5nMTYgLWx6IC1sbQorCitJTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCitMSUJQQVRIPSQoZXhlY19wcmVmaXgpL2xpYgorTUFOUEFUSD0kKHByZWZpeCkvbWFuCitCSU5QQVRIPSQoZXhlY19wcmVmaXgpL2JpbgorCisjIG92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0CisjIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6CisjCisjICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCisjCisjIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KKyMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQorIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCitERVNURElSPQorCitEQj0kKERFU1RESVIpJChCSU5QQVRIKQorREk9JChERVNURElSKSQoSU5DUEFUSCkKK0RMPSQoREVTVERJUikkKExJQlBBVEgpCitETT0kKERFU1RESVIpJChNQU5QQVRIKQorCisjIFByZS1idWlsdCBjb25maWd1cmF0aW9uCisjIFNlZSBzY3JpcHRzL3BuZ2xpYmNvbmYubWFrIGZvciBtb3JlIG9wdGlvbnMKK1BOR0xJQkNPTkZfSF9QUkVCVUlMVCA9IHNjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0CisKK09CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCisJcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCisJcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KKworT0JKU0RMTCA9ICQoT0JKUzoubz0ucGljLm8pCisKKy5TVUZGSVhFUzogICAgICAuYyAubyAucGljLm8KKworLmMubzoKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgLW8gJEAgJDwKKworLmMucGljLm86CisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1mUElDIC1vICRAICQqLmMKKworYWxsOiBsaWJwbmcuYSAkKExJQlNPKSBwbmd0ZXN0IGxpYnBuZy5wYyBsaWJwbmctY29uZmlnCisKK3BuZ2xpYmNvbmYuaDogJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpCisJJChDUCkgJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpICRACisKK2xpYnBuZy5hOiAkKE9CSlMpCisJJChBUl9SQykgJEAgJChPQkpTKQorCSQoUkFOTElCKSAkQAorCitsaWJwbmcucGM6CisJY2F0IHNjcmlwdHMvbGlicG5nLnBjLmluIHwgc2VkIC1lIHMhQHByZWZpeEAhJChwcmVmaXgpISBcCisJLWUgcyFAZXhlY19wcmVmaXhAISQoZXhlY19wcmVmaXgpISBcCisJLWUgcyFAbGliZGlyQCEkKExJQlBBVEgpISBcCisJLWUgcyFAaW5jbHVkZWRpckAhJChJTkNQQVRIKSEgXAorCS1lIHMhLWxwbmcxNiEtbHBuZzE2XCAtbHpcIC1sbSEgPiBsaWJwbmcucGMKKworbGlicG5nLWNvbmZpZzoKKwkoIGNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbjsgXAorCWVjaG8gcHJlZml4PVwiJChwcmVmaXgpXCI7IFwKKwllY2hvIElfb3B0cz1cIi1JJChJTkNQQVRIKS8kKExJQk5BTUUpXCI7IFwKKwllY2hvIGNwcGZsYWdzPVwiXCI7IFwKKwllY2hvIExfb3B0cz1cIi1MJChMSUJQQVRIKVwiOyBcCisJZWNobyBSX29wdHM9XCItUiQoTElCUEFUSClcIjsgXAorCWVjaG8gbGlicz1cIi1scG5nMTYgLWx6IC1sbVwiOyBcCisJY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1ib2R5LmluICkgPiBsaWJwbmctY29uZmlnCisJY2htb2QgK3ggbGlicG5nLWNvbmZpZworCiskKExJQlNPKTogJChMSUJTT01BSikKKwkkKExOX1NGKSAkKExJQlNPTUFKKSAkKExJQlNPKQorCiskKExJQlNPTUFKKTogJChPQkpTRExMKQorCUBjYXNlICJgdHlwZSBsZGAiIGluICp1Y2IqKSBcCisJZWNobzsgXAorCWVjaG8gJyMjIFdBUk5JTkc6JzsgXAorCWVjaG8gJyMjIFRoZSBjb21tYW5kcyAiQ0MiIGFuZCAiTEQiIG11c3QgTk9UIHJlZmVyIHRvIC91c3IvdWNiL2NjJzsgXAorCWVjaG8gJyMjIGFuZCAvdXNyL3VjYi9sZC4gIElmIHRoZXkgZG8sIHlvdSBuZWVkIHRvIGFkanVzdCB5b3VyIFBBVEgnOyBcCisJZWNobyAnIyMgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gcHV0IC91c3IvY2NzL2JpbiBhaGVhZCBvZiAvdXNyL3VjYi4nOyBcCisJZWNobyAnIyMgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIExEX0xJQlJBUllfUEFUSCBzaG91bGQgbm90IGJlIHNldCc7IFwKKwllY2hvICcjIyBhdCBhbGwuICBJZiBpdCBpcywgdGhpbmdzIGFyZSBsaWtlbHkgdG8gYnJlYWsgYmVjYXVzZSBvZic7IFwKKwllY2hvICcjIyB0aGUgbGlidWNiIGRlcGVuZGVuY3kgdGhhdCBpcyBjcmVhdGVkLic7IFwKKwllY2hvOyBcCisJOzsgXAorCWVzYWMKKwkkKExEKSAtRyAtaCAkKExJQlNPTUFKKSBcCisJIC1vICQoTElCU09NQUopICQoT0JKU0RMTCkKKworcG5ndGVzdDogcG5ndGVzdC5vICQoTElCU08pCisJJChDQykgLW8gcG5ndGVzdCAkKENGTEFHUykgcG5ndGVzdC5vICQoTERGTEFHUykKKwordGVzdDogcG5ndGVzdAorCS4vcG5ndGVzdAorCitpbnN0YWxsLWhlYWRlcnM6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKKwktQGlmIFsgISAtZCAkKERJKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCisJLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSkvJChMSUJOQU1FKTsgZmkKKwljcCBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oICQoREkpLyQoTElCTkFNRSkKKwljaG1vZCA2NDQgJChESSkvJChMSUJOQU1FKS9wbmcuaCAkKERJKS8kKExJQk5BTUUpL3BuZ2NvbmYuaCAkKERJKS8kKExJQk5BTUUpL3BuZ2xpYmNvbmYuaAorCS1AJChSTV9GKSAkKERJKS9wbmcuaCAkKERJKS9wbmdjb25mLmggJChESSkvcG5nbGliY29uZi5oCisJLUAkKFJNX0YpICQoREkpL2xpYnBuZworCShjZCAkKERJKTsgJChMTl9TRikgJChMSUJOQU1FKSBsaWJwbmc7ICQoTE5fU0YpICQoTElCTkFNRSkvKiAuKQorCitpbnN0YWxsLXN0YXRpYzogaW5zdGFsbC1oZWFkZXJzIGxpYnBuZy5hCisJLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQorCWNwIGxpYnBuZy5hICQoREwpLyQoTElCTkFNRSkuYQorCWNobW9kIDY0NCAkKERMKS8kKExJQk5BTUUpLmEKKwktQCQoUk1fRikgJChETCkvbGlicG5nLmEKKwkoY2QgJChETCk7ICQoTE5fU0YpICQoTElCTkFNRSkuYSBsaWJwbmcuYSkKKworaW5zdGFsbC1zaGFyZWQ6IGluc3RhbGwtaGVhZGVycyAkKExJQlNPTUFKKSBsaWJwbmcucGMKKwktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCisJLUAkKFJNX0YpICQoREwpLyQoTElCU08pCisJLUAkKFJNX0YpICQoREwpLyQoTElCU09SRUwpCisJLUAkKFJNX0YpICQoREwpLyQoT0xEU08pCisJY3AgJChMSUJTT01BSikgJChETCkvJChMSUJTT1JFTCkKKwljaG1vZCA3NTUgJChETCkvJChMSUJTT1JFTCkKKwkoY2QgJChETCk7IFwKKwkkKExOX1NGKSAkKExJQlNPUkVMKSAkKExJQlNPKTsgXAorCSQoTE5fU0YpICQoTElCU08pICQoT0xEU08pKQorCS1AaWYgWyAhIC1kICQoREwpL3BrZ2NvbmZpZyBdOyB0aGVuICQoTUtESVJfUCkgJChETCkvcGtnY29uZmlnOyBmaQorCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYworCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvbGlicG5nLnBjCisJY3AgbGlicG5nLnBjICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCisJY2htb2QgNjQ0ICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCisJKGNkICQoREwpL3BrZ2NvbmZpZzsgJChMTl9TRikgJChMSUJOQU1FKS5wYyBsaWJwbmcucGMpCisKK2luc3RhbGwtbWFuOiBsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41CisJLUBpZiBbICEgLWQgJChETSkgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pOyBmaQorCS1AaWYgWyAhIC1kICQoRE0pL21hbjMgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjM7IGZpCisJLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5nLjMKKwktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmdwZi4zCisJY3AgbGlicG5nLjMgJChETSkvbWFuMworCWNwIGxpYnBuZ3BmLjMgJChETSkvbWFuMworCS1AaWYgWyAhIC1kICQoRE0pL21hbjUgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjU7IGZpCisJLUAkKFJNX0YpICQoRE0pL21hbjUvcG5nLjUKKwljcCBwbmcuNSAkKERNKS9tYW41CisKK2luc3RhbGwtY29uZmlnOiBsaWJwbmctY29uZmlnCisJLUBpZiBbICEgLWQgJChEQikgXTsgdGhlbiAkKE1LRElSX1ApICQoREIpOyBmaQorCS1AJChSTV9GKSAkKERCKS9saWJwbmctY29uZmlnCisJLUAkKFJNX0YpICQoREIpLyQoTElCTkFNRSktY29uZmlnCisJY3AgbGlicG5nLWNvbmZpZyAkKERCKS8kKExJQk5BTUUpLWNvbmZpZworCWNobW9kIDc1NSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZworCShjZCAkKERCKTsgJChMTl9TRikgJChMSUJOQU1FKS1jb25maWcgbGlicG5nLWNvbmZpZykKKworaW5zdGFsbDogaW5zdGFsbC1zdGF0aWMgaW5zdGFsbC1zaGFyZWQgaW5zdGFsbC1tYW4gaW5zdGFsbC1jb25maWcKKworIyBJZiB5b3UgaW5zdGFsbGVkIGluICQoREVTVERJUiksIHRlc3QtaW5zdGFsbGVkIHdvbid0IHdvcmsgdW50aWwgeW91CisjIG1vdmUgdGhlIGxpYnJhcnkgdG8gaXRzIGZpbmFsIGxvY2F0aW9uLiAgVXNlIHRlc3QtZGQgdG8gdGVzdCBpdAorIyBiZWZvcmUgdGhlbi4KKwordGVzdC1kZDoKKwllY2hvCisJZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5IGluICQoREwpLgorCSQoQ0MpIC1JJChESSkgJChDUFBGTEFHUykgXAorCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAorCSAgIC1vIHBuZ3Rlc3RkIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AgXAorCSAgIC1MJChETCkgLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKSAtUiQoREwpCisJLi9wbmd0ZXN0ZCBwbmd0ZXN0LnBuZworCit0ZXN0LWluc3RhbGxlZDoKKwllY2hvCisJZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5LgorCSQoQ0MpICQoQ1BQRkxBR1MpIFwKKwkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKKwkgICAtbyBwbmd0ZXN0aSBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgIFwKKwkgICAtTCQoWkxJQkxJQikgLVIkKFpMSUJMSUIpCisJLi9wbmd0ZXN0aSBwbmd0ZXN0LnBuZworCitjbGVhbjoKKwkkKFJNX0YpICoubyBsaWJwbmcuYSBwbmd0ZXN0IHBuZ3Rlc3RpIHBuZ291dC5wbmcgXAorCWxpYnBuZy1jb25maWcgJChMSUJTTykgJChMSUJTT01BSikqIFwKKwlsaWJwbmcucGMgcG5nbGliY29uZi5oCisKK0RPQ1MgPSBBTk5PVU5DRSBDSEFOR0VTIElOU1RBTEwgS05PV05CVUcgTElDRU5TRSBSRUFETUUgVE9ETyBZMktJTkZPCit3cml0ZWxvY2s6CisJY2htb2QgYS13ICouW2NoMzVdICQoRE9DUykgc2NyaXB0cy8qCisKKyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KKworcG5nLm8gcG5nLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nZXJyb3IubyBwbmdlcnJvci5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3Jpby5vIHBuZ3Jpby5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3dpby5vIHBuZ3dpby5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ21lbS5vIHBuZ21lbS5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3NldC5vIHBuZ3NldC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ2dldC5vIHBuZ2dldC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3JlYWQubyBwbmdyZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncnRyYW4ubyBwbmdydHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3J1dGlsLm8gcG5ncnV0aWwucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd0cmFucy5vIHBuZ3RyYW5zLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd3JpdGUubyBwbmd3cml0ZS5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3d0cmFuLm8gcG5nd3RyYW4ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3dXRpbC5vIHBuZ3d1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncHJlYWQubyBwbmdwcmVhZC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKworcG5ndGVzdC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCmRpZmYgLS1naXQgYS9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5zb2xhcmlzLXg4NiBiL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnNvbGFyaXMteDg2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZDI0MzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5zb2xhcmlzLXg4NgpAQCAtMCwwICsxLDI0MyBAQAorIyBtYWtlZmlsZSBmb3IgbGlicG5nIG9uIFNvbGFyaXMgMi54IHdpdGggZ2NjCisjIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNi0yMDA4LCAyMDEwLTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCisjIENvbnRyaWJ1dGVkIGJ5IFdpbGxpYW0gTC4gU2Vib2ssIGJhc2VkIG9uIG1ha2VmaWxlLmxpbnV4CisjIENvcHlyaWdodCAoQykgMTk5OCBHcmVnIFJvZWxvZnMKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyCisKKyMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorIyBhbmQgbGljZW5zZSBpbiBwbmcuaAorCisjIExpYnJhcnkgbmFtZToKK0xJQk5BTUUgPSBsaWJwbmcxNgorUE5HTUFKID0gMTYKKworIyBTaGFyZWQgbGlicmFyeSBuYW1lczoKK0xJQlNPPSQoTElCTkFNRSkuc28KK0xJQlNPTUFKPSQoTElCTkFNRSkuc28uJChQTkdNQUopCitMSUJTT1JFTD0kKExJQlNPTUFKKS4kKFJFTEVBU0UpCitPTERTTz1saWJwbmcuc28KKworIyBVdGlsaXRpZXM6CitBUl9SQz1hciByYworQ0M9Z2NjCitNS0RJUl9QPW1rZGlyIC1wCitMTl9TRj1sbiAtZiAtcworUkFOTElCPWVjaG8KK0NQPWNwCitSTV9GPS9iaW4vcm0gLWYKKworIyBXaGVyZSBtYWtlIGluc3RhbGwgcHV0cyBsaWJwbmcuYSwgbGlicG5nMTYuc28qLCBhbmQgcG5nLmgKK3ByZWZpeD0vdXNyL2xvY2FsCitleGVjX3ByZWZpeD0kKHByZWZpeCkKKworIyBXaGVyZSB0aGUgemxpYiBsaWJyYXJ5IGFuZCBpbmNsdWRlIGZpbGVzIGFyZSBsb2NhdGVkCisjIENoYW5naW5nIHRoZXNlIHRvIC4uL3psaWIgcG9zZXMgYSBzZWN1cml0eSByaXNrLiAgSWYgeW91IHdhbnQKKyMgdG8gaGF2ZSB6bGliIGluIGFuIGFkamFjZW50IGRpcmVjdG9yeSwgc3BlY2lmeSB0aGUgZnVsbCBwYXRoIGluc3RlYWQgb2YgIi4uIi4KKyNaTElCTElCPS4uL3psaWIKKyNaTElCSU5DPS4uL3psaWIKKworWkxJQkxJQj0vdXNyL2xvY2FsL2xpYgorWkxJQklOQz0vdXNyL2xvY2FsL2luY2x1ZGUKKworV0FSTk1PUkU9LVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCAtV3NoYWRvdyBcCisJLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV3RyYWRpdGlvbmFsIC1XY2FzdC1hbGlnbiBcCisJLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyAjLVdjb252ZXJzaW9uCitDUFBGTEFHUz0tSSQoWkxJQklOQykgIyAtRFBOR19ERUJVRz01CitDRkxBR1M9LVcgLVdhbGwgLU8gIyAkKFdBUk5NT1JFKSAtZworTERGTEFHUz0tTC4gLVIuIC1MJChaTElCTElCKSAtUiQoWkxJQkxJQikgLWxwbmcxNiAtbHogLWxtCisKK0lOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKK0xJQlBBVEg9JChleGVjX3ByZWZpeCkvbGliCitNQU5QQVRIPSQocHJlZml4KS9tYW4KK0JJTlBBVEg9JChleGVjX3ByZWZpeCkvYmluCisKKyMgb3ZlcnJpZGUgREVTVERJUj0gb24gdGhlIG1ha2UgaW5zdGFsbCBjb21tYW5kIGxpbmUgdG8gZWFzaWx5IHN1cHBvcnQKKyMgaW5zdGFsbGluZyBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uLiAgRXhhbXBsZToKKyMKKyMgICAgbWFrZSBpbnN0YWxsIERFU1RESVI9L3RtcC9idWlsZC9saWJwbmcKKyMKKyMgSWYgeW91J3JlIGdvaW5nIHRvIGluc3RhbGwgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbgorIyB2aWEgREVTVERJUiwgJChERVNURElSKSQocHJlZml4KSBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlCisjIHlvdSBleGVjdXRlIG1ha2UgaW5zdGFsbC4KK0RFU1RESVI9CisKK0RCPSQoREVTVERJUikkKEJJTlBBVEgpCitEST0kKERFU1RESVIpJChJTkNQQVRIKQorREw9JChERVNURElSKSQoTElCUEFUSCkKK0RNPSQoREVTVERJUikkKE1BTlBBVEgpCisKKyMgUHJlLWJ1aWx0IGNvbmZpZ3VyYXRpb24KKyMgU2VlIHNjcmlwdHMvcG5nbGliY29uZi5tYWsgZm9yIG1vcmUgb3B0aW9ucworUE5HTElCQ09ORl9IX1BSRUJVSUxUID0gc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQKKworT0JKUyA9IHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKKwlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKKwlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubworCitPQkpTRExMID0gJChPQkpTOi5vPS5waWMubykKKworLlNVRkZJWEVTOiAgICAgIC5jIC5vIC5waWMubworCisuYy5vOgorCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtbyAkQCAkPAorCisuYy5waWMubzoKKwkkKENDKSAtYyAkKENGTEFHUykgLWZQSUMgLW8gJEAgJCouYworCithbGw6IGxpYnBuZy5hICQoTElCU08pIHBuZ3Rlc3QgbGlicG5nLnBjIGxpYnBuZy1jb25maWcKKworcG5nbGliY29uZi5oOiAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkKKwkkKENQKSAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkgJEAKKworbGlicG5nLmE6ICQoT0JKUykKKwkkKEFSX1JDKSAkQCAkKE9CSlMpCisJJChSQU5MSUIpICRACisKK2xpYnBuZy5wYzoKKwljYXQgc2NyaXB0cy9saWJwbmcucGMuaW4gfCBzZWQgLWUgcyFAcHJlZml4QCEkKHByZWZpeCkhIFwKKwktZSBzIUBleGVjX3ByZWZpeEAhJChleGVjX3ByZWZpeCkhIFwKKwktZSBzIUBsaWJkaXJAISQoTElCUEFUSCkhIFwKKwktZSBzIUBpbmNsdWRlZGlyQCEkKElOQ1BBVEgpISBcCisJLWUgcyEtbHBuZzE2IS1scG5nMTZcIC1selwgLWxtISA+IGxpYnBuZy5wYworCitsaWJwbmctY29uZmlnOgorCSggY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1oZWFkLmluOyBcCisJZWNobyBwcmVmaXg9XCIkKHByZWZpeClcIjsgXAorCWVjaG8gSV9vcHRzPVwiLUkkKElOQ1BBVEgpLyQoTElCTkFNRSlcIjsgXAorCWVjaG8gY3BwZmxhZ3M9XCIiOyBcCisJZWNobyBMX29wdHM9XCItTCQoTElCUEFUSClcIjsgXAorCWVjaG8gUl9vcHRzPVwiLVIkKExJQlBBVEgpXCI7IFwKKwllY2hvIGxpYnM9XCItbHBuZzE2IC1seiAtbG1cIjsgXAorCWNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctYm9keS5pbiApID4gbGlicG5nLWNvbmZpZworCWNobW9kICt4IGxpYnBuZy1jb25maWcKKworJChMSUJTTyk6ICQoTElCU09NQUopCisJJChMTl9TRikgJChMSUJTT01BSikgJChMSUJTTykKKworJChMSUJTT01BSik6ICQoT0JKU0RMTCkKKwlAY2FzZSAiYHR5cGUgbGRgIiBpbiAqdWNiKikgXAorCWVjaG87IFwKKwllY2hvICcjIyBXQVJOSU5HOic7IFwKKwllY2hvICcjIyBUaGUgY29tbWFuZHMgIkNDIiBhbmQgIkxEIiBtdXN0IE5PVCByZWZlciB0byAvdXNyL3VjYi9jYyc7IFwKKwllY2hvICcjIyBhbmQgL3Vzci91Y2IvbGQuICBJZiB0aGV5IGRvLCB5b3UgbmVlZCB0byBhZGp1c3QgeW91ciBQQVRIJzsgXAorCWVjaG8gJyMjIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHB1dCAvdXNyL2Njcy9iaW4gYWhlYWQgb2YgL3Vzci91Y2IuJzsgXAorCWVjaG8gJyMjIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBMRF9MSUJSQVJZX1BBVEggc2hvdWxkIG5vdCBiZSBzZXQnOyBcCisJZWNobyAnIyMgYXQgYWxsLiAgSWYgaXQgaXMsIHRoaW5ncyBhcmUgbGlrZWx5IHRvIGJyZWFrIGJlY2F1c2Ugb2YnOyBcCisJZWNobyAnIyMgdGhlIGxpYnVjYiBkZXBlbmRlbmN5IHRoYXQgaXMgY3JlYXRlZC4nOyBcCisJZWNobzsgXAorCTs7IFwKKwllc2FjCisJJChMRCkgLUcgLWggJChMSUJTT01BSikgXAorCSAtbyAkKExJQlNPTUFKKSAkKE9CSlNETEwpCisKK3BuZ3Rlc3Q6IHBuZ3Rlc3QubyAkKExJQlNPKQorCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCisKK3Rlc3Q6IHBuZ3Rlc3QKKwkuL3BuZ3Rlc3QKKworaW5zdGFsbC1oZWFkZXJzOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCisJLUBpZiBbICEgLWQgJChESSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpOyBmaQorCS1AaWYgWyAhIC1kICQoREkpLyQoTElCTkFNRSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpLyQoTElCTkFNRSk7IGZpCisJY3AgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCAkKERJKS8kKExJQk5BTUUpCisJY2htb2QgNjQ0ICQoREkpLyQoTElCTkFNRSkvcG5nLmggJChESSkvJChMSUJOQU1FKS9wbmdjb25mLmggJChESSkvJChMSUJOQU1FKS9wbmdsaWJjb25mLmgKKwktQCQoUk1fRikgJChESSkvcG5nLmggJChESSkvcG5nY29uZi5oICQoREkpL3BuZ2xpYmNvbmYuaAorCS1AJChSTV9GKSAkKERJKS9saWJwbmcKKwkoY2QgJChESSk7ICQoTE5fU0YpICQoTElCTkFNRSkgbGlicG5nOyAkKExOX1NGKSAkKExJQk5BTUUpLyogLikKKworaW5zdGFsbC1zdGF0aWM6IGluc3RhbGwtaGVhZGVycyBsaWJwbmcuYQorCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKKwljcCBsaWJwbmcuYSAkKERMKS8kKExJQk5BTUUpLmEKKwljaG1vZCA2NDQgJChETCkvJChMSUJOQU1FKS5hCisJLUAkKFJNX0YpICQoREwpL2xpYnBuZy5hCisJKGNkICQoREwpOyAkKExOX1NGKSAkKExJQk5BTUUpLmEgbGlicG5nLmEpCisKK2luc3RhbGwtc2hhcmVkOiBpbnN0YWxsLWhlYWRlcnMgJChMSUJTT01BSikgbGlicG5nLnBjCisJLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQorCS1AJChSTV9GKSAkKERMKS8kKExJQlNPKQorCS1AJChSTV9GKSAkKERMKS8kKExJQlNPUkVMKQorCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPKQorCWNwICQoTElCU09NQUopICQoREwpLyQoTElCU09SRUwpCisJY2htb2QgNzU1ICQoREwpLyQoTElCU09SRUwpCisJKGNkICQoREwpOyBcCisJJChMTl9TRikgJChMSUJTT1JFTCkgJChMSUJTTyk7IFwKKwkkKExOX1NGKSAkKExJQlNPKSAkKE9MRFNPKSkKKwktQGlmIFsgISAtZCAkKERMKS9wa2djb25maWcgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpL3BrZ2NvbmZpZzsgZmkKKwktQCQoUk1fRikgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKKwktQCQoUk1fRikgJChETCkvcGtnY29uZmlnL2xpYnBuZy5wYworCWNwIGxpYnBuZy5wYyAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYworCWNobW9kIDY0NCAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYworCShjZCAkKERMKS9wa2djb25maWc7ICQoTE5fU0YpICQoTElCTkFNRSkucGMgbGlicG5nLnBjKQorCitpbnN0YWxsLW1hbjogbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQorCS1AaWYgWyAhIC1kICQoRE0pIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKTsgZmkKKwktQGlmIFsgISAtZCAkKERNKS9tYW4zIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW4zOyBmaQorCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZy4zCisJLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5ncGYuMworCWNwIGxpYnBuZy4zICQoRE0pL21hbjMKKwljcCBsaWJwbmdwZi4zICQoRE0pL21hbjMKKwktQGlmIFsgISAtZCAkKERNKS9tYW41IF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW41OyBmaQorCS1AJChSTV9GKSAkKERNKS9tYW41L3BuZy41CisJY3AgcG5nLjUgJChETSkvbWFuNQorCitpbnN0YWxsLWNvbmZpZzogbGlicG5nLWNvbmZpZworCS1AaWYgWyAhIC1kICQoREIpIF07IHRoZW4gJChNS0RJUl9QKSAkKERCKTsgZmkKKwktQCQoUk1fRikgJChEQikvbGlicG5nLWNvbmZpZworCS1AJChSTV9GKSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZworCWNwIGxpYnBuZy1jb25maWcgJChEQikvJChMSUJOQU1FKS1jb25maWcKKwljaG1vZCA3NTUgJChEQikvJChMSUJOQU1FKS1jb25maWcKKwkoY2QgJChEQik7ICQoTE5fU0YpICQoTElCTkFNRSktY29uZmlnIGxpYnBuZy1jb25maWcpCisKK2luc3RhbGw6IGluc3RhbGwtc3RhdGljIGluc3RhbGwtc2hhcmVkIGluc3RhbGwtbWFuIGluc3RhbGwtY29uZmlnCisKKyMgSWYgeW91IGluc3RhbGxlZCBpbiAkKERFU1RESVIpLCB0ZXN0LWluc3RhbGxlZCB3b24ndCB3b3JrIHVudGlsIHlvdQorIyBtb3ZlIHRoZSBsaWJyYXJ5IHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4gIFVzZSB0ZXN0LWRkIHRvIHRlc3QgaXQKKyMgYmVmb3JlIHRoZW4uCisKK3Rlc3QtZGQ6CisJZWNobworCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeSBpbiAkKERMKS4KKwkkKENDKSAtSSQoREkpICQoQ1BQRkxBR1MpIFwKKwkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKKwkgICAtbyBwbmd0ZXN0ZCBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgIFwKKwkgICAtTCQoREwpIC1MJChaTElCTElCKSAtUiQoWkxJQkxJQikgLVIkKERMKQorCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKKwordGVzdC1pbnN0YWxsZWQ6CisJZWNobworCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeS4KKwkkKENDKSAkKENQUEZMQUdTKSBcCisJICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCisJICAgLW8gcG5ndGVzdGkgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYCBcCisJICAgLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKQorCS4vcG5ndGVzdGkgcG5ndGVzdC5wbmcKKworY2xlYW46CisJJChSTV9GKSAqLm8gbGlicG5nLmEgcG5ndGVzdCBwbmd0ZXN0aSBwbmdvdXQucG5nIFwKKwlsaWJwbmctY29uZmlnICQoTElCU08pICQoTElCU09NQUopKiBcCisJbGlicG5nLnBjIHBuZ2xpYmNvbmYuaAorCitET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTword3JpdGVsb2NrOgorCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgorCisjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCisKK3BuZy5vIHBuZy5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ2Vycm9yLm8gcG5nZXJyb3IucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdyaW8ubyBwbmdyaW8ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3aW8ubyBwbmd3aW8ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdtZW0ubyBwbmdtZW0ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdzZXQubyBwbmdzZXQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdnZXQubyBwbmdnZXQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdyZWFkLm8gcG5ncmVhZC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3J0cmFuLm8gcG5ncnRyYW4ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdydXRpbC5vIHBuZ3J1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ndHJhbnMubyBwbmd0cmFucy5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3dyaXRlLm8gcG5nd3JpdGUucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3dHJhbi5vIHBuZ3d0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd3V0aWwubyBwbmd3dXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3ByZWFkLm8gcG5ncHJlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisKK3BuZ3Rlc3QubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaApkaWZmIC0tZ2l0IGEvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuc3RkIGIvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuc3RkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNmE4NjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5zdGQKQEAgLTAsMCArMSwxMzQgQEAKKyMgbWFrZWZpbGUgZm9yIGxpYnBuZworIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDYsIDIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCisjIENvcHlyaWdodCAoQykgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KKyMKKyMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorIyBhbmQgbGljZW5zZSBpbiBwbmcuaAorCisjIHdoZXJlIG1ha2UgaW5zdGFsbCBwdXRzIGxpYnBuZy5hIGFuZCBwbmcuaAorcHJlZml4PS91c3IvbG9jYWwKK0lOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKK0xJQlBBVEg9JChwcmVmaXgpL2xpYgorCisjIG92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0CisjIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6CisjCisjICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCisjCisjIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KKyMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQorIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCitERVNURElSPQorCisjIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKKyNaTElCTElCPS91c3IvbG9jYWwvbGliCisjWkxJQklOQz0vdXNyL2xvY2FsL2luY2x1ZGUKK1pMSUJMSUI9Li4vemxpYgorWkxJQklOQz0uLi96bGliCisKK0NDID0gY2MKK0FSX1JDID0gYXIgcmMKK01LRElSX1AgPSBta2RpcgorTE5fU0YgPSBsbiAtc2YKK1JBTkxJQiA9IHJhbmxpYgorQ1AgPSBjcAorUk1fRiA9IHJtIC1mCitBV0sgPSBhd2sKK1NFRCA9IHNlZAorQ1BQID0gJChDQykgLUUKK0VDSE8gPSBlY2hvCisKK0RGTkZMQUdTID0gIyBERk5GTEFHUyBjb250YWlucyAtRCBvcHRpb25zIHRvIHVzZSBpbiB0aGUgbGlicG5nIGJ1aWxkCitERkFfRVhUUkEgPSAjIGV4dHJhIGZpbGVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29udHJvbCBjb25maWd1cmF0aW9uCitDUFBGTEFHUyA9IC1JJChaTElCSU5DKSAjIC1EUE5HX0RFQlVHPTUKK0NGTEFHUyA9IC1PICMgLWcKK0xERkxBR1MgPSAtTC4gLUwkKFpMSUJMSUIpIC1scG5nIC1seiAtbG0KKworIyBQcmUtYnVpbHQgY29uZmlndXJhdGlvbgorIyBTZWUgc2NyaXB0cy9wbmdsaWJjb25mLm1hayBmb3IgbW9yZSBvcHRpb25zCitQTkdMSUJDT05GX0hfUFJFQlVJTFQgPSBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdAorCitPQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAorCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAorCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCisKKy5jLm86CisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1vICRAICQ8CisKK2FsbDogbGlicG5nLmEgcG5ndGVzdAorCisjIFRoZSBzdGFuZGFyZCBwbmdsaWJjb25mLmggZXhpc3RzIGFzIHNjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0LAorIyBjb3B5IHRoaXMgaWYgdGhlIGZvbGxvd2luZyBkb2Vzbid0IHdvcmsuCitwbmdsaWJjb25mLmg6IHBuZ2xpYmNvbmYuZGZuCisJJChSTV9GKSAkQCBwbmdsaWJjb25mLmMgcG5nbGliY29uZi5vdXQgcG5nbGliY29uZi50bXAKKwkkKEVDSE8pICcjaW5jbHVkZSAicG5nbGliY29uZi5kZm4iJyA+cG5nbGliY29uZi5jCisJJChFQ0hPKSAiSWYgJyQoQ0MpIC1FJyBjcmFzaGVzIHRyeSAvbGliL2NwcCAoZS5nLiBDUFA9Jy9saWIvY3BwJykiID4mMgorCSQoQ1BQKSAkKERGTkZMQUdTKSBwbmdsaWJjb25mLmMgPnBuZ2xpYmNvbmYub3V0CisJJChBV0spIC1mICJzY3JpcHRzL2Rmbi5hd2siIG91dD0icG5nbGliY29uZi50bXAiIHBuZ2xpYmNvbmYub3V0IDE+JjIKKwltdiBwbmdsaWJjb25mLnRtcCAkQAorCitwbmdsaWJjb25mLmRmbjogc2NyaXB0cy9wbmdsaWJjb25mLmRmYSBzY3JpcHRzL29wdGlvbnMuYXdrIHBuZ2NvbmYuaCBwbmd1c3IuZGZhICQoREZBX1hUUkEpCisJJChSTV9GKSAkQCBwbmdsaWJjb25mLnByZSBwbmdsaWJjb25mLnRtcAorCSQoRUNITykgIkNhbGxpbmcgJChBV0spIGZyb20gc2NyaXB0cy9wbmdsaWJjb25mLm1hayIgPiYyCisJJChFQ0hPKSAiSWYgJ2F3aycgY3Jhc2hlcyB0cnkgYSBiZXR0ZXIgYXdrIChlLmcuIEFXSz0nbmF3aycpIiA+JjIKKwkkKEFXSykgLWYgc2NyaXB0cy9vcHRpb25zLmF3ayBvdXQ9InBuZ2xpYmNvbmYucHJlIlwKKwkgICAgdmVyc2lvbj1zZWFyY2ggcG5nY29uZi5oIHNjcmlwdHMvcG5nbGliY29uZi5kZmFcCisJICAgIHBuZ3Vzci5kZmEgJChERkFfWFRSQSkgMT4mMgorCSQoQVdLKSAtZiBzY3JpcHRzL29wdGlvbnMuYXdrIG91dD0icG5nbGliY29uZi50bXAiIHBuZ2xpYmNvbmYucHJlIDE+JjIKKwltdiBwbmdsaWJjb25mLnRtcCAkQAorCitsaWJwbmcuYTogJChPQkpTKQorCSQoQVJfUkMpICRAICAkKE9CSlMpCisJJChSQU5MSUIpICRACisKK3BuZ3Rlc3Q6IHBuZ3Rlc3QubyBsaWJwbmcuYQorCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCisKK3Rlc3Q6IHBuZ3Rlc3QKKwkuL3BuZ3Rlc3QKKworaW5zdGFsbDogbGlicG5nLmEgcG5nbGliY29uZi5oCisJLUAkKE1LRElSX1ApICQoREVTVERJUikkKElOQ1BBVEgpCisJLUAkKE1LRElSX1ApICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZworCS1AJChNS0RJUl9QKSAkKERFU1RESVIpJChMSUJQQVRIKQorCS1AJChSTV9GKSAkKERFU1RESVIpJChJTkNQQVRIKS9wbmcuaAorCS1AJChSTV9GKSAkKERFU1RESVIpJChJTkNQQVRIKS9wbmdjb25mLmgKKwktQCQoUk1fRikgJChERVNURElSKSQoSU5DUEFUSCkvcG5nbGliY29uZi5oCisJY3AgcG5nLmggJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nCisJY3AgcG5nY29uZi5oICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZworCWNwIHBuZ2xpYmNvbmYuaCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcKKwljaG1vZCA2NDQgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nL3BuZy5oCisJY2htb2QgNjQ0ICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZy9wbmdjb25mLmgKKwljaG1vZCA2NDQgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nL3BuZ2xpYmNvbmYuaAorCShjZCAkKERFU1RESVIpJChJTkNQQVRIKTsgbG4gLWYgLXMgbGlicG5nLyogLikKKwljcCBsaWJwbmcuYSAkKERFU1RESVIpJChMSUJQQVRIKQorCWNobW9kIDY0NCAkKERFU1RESVIpJChMSUJQQVRIKS9saWJwbmcuYQorCitjbGVhbjoKKwkkKFJNX0YpICoubyBsaWJwbmcuYSBwbmd0ZXN0IHBuZ291dC5wbmcgcG5nbGliY29uZi5oIHBuZ2xpYmNvbmYuYyBcCisJcG5nbGliY29uZi5vdXQKKworRE9DUyA9IEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8KK3dyaXRlbG9jazoKKwljaG1vZCBhLXcgKi5bY2gzNV0gJChET0NTKSBzY3JpcHRzLyoKKworIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgorCitwbmcubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ2Vycm9yLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdyaW8ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3dpby5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nbWVtLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdzZXQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ2dldC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncmVhZC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncnRyYW4ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3J1dGlsLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd0cmFucy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd3JpdGUubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3d0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3dXRpbC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncHJlYWQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKworcG5ndGVzdC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCmRpZmYgLS1naXQgYS9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5zdW5vcyBiL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnN1bm9zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZTMwOGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5zdW5vcwpAQCAtMCwwICsxLDExNSBAQAorIyBtYWtlZmlsZSBmb3IgbGlicG5nCisjIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNiwgMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyMgQ29weXJpZ2h0IChDKSAxOTk1IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgorIworIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisjIGFuZCBsaWNlbnNlIGluIHBuZy5oCisKKyMgd2hlcmUgbWFrZSBpbnN0YWxsIHB1dHMgbGlicG5nLmEgYW5kIHBuZy5oCitwcmVmaXg9L3Vzci9sb2NhbAorSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQorTElCUEFUSD0kKHByZWZpeCkvbGliCisKKyMgb3ZlcnJpZGUgREVTVERJUj0gb24gdGhlIG1ha2UgaW5zdGFsbCBjb21tYW5kIGxpbmUgdG8gZWFzaWx5IHN1cHBvcnQKKyMgaW5zdGFsbGluZyBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uLiAgRXhhbXBsZToKKyMKKyMgICAgbWFrZSBpbnN0YWxsIERFU1RESVI9L3RtcC9idWlsZC9saWJwbmcKKyMKKyMgSWYgeW91J3JlIGdvaW5nIHRvIGluc3RhbGwgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbgorIyB2aWEgREVTVERJUiwgJChERVNURElSKSQocHJlZml4KSBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlCisjIHlvdSBleGVjdXRlIG1ha2UgaW5zdGFsbC4KK0RFU1RESVI9CisKKyMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZAorI1pMSUJMSUI9L3Vzci9sb2NhbC9saWIKKyNaTElCSU5DPS91c3IvbG9jYWwvaW5jbHVkZQorWkxJQkxJQj0uLi96bGliCitaTElCSU5DPS4uL3psaWIKKworCitXQVJOTU9SRT0tV3dyaXRlLXN0cmluZ3MgLVdwb2ludGVyLWFyaXRoIC1Xc2hhZG93IC1XY29udmVyc2lvbiBcCisJLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV3RyYWRpdGlvbmFsIC1XY2FzdC1hbGlnbiBcCisJLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcworCitDQz1nY2MKK0FSX1JDPWFyIHJjCitNS0RJUl9QPW1rZGlyIC1wCitMTl9TRj1sbiAtZiAtcworUkFOTElCPXJhbmxpYgorQ1A9Y3AKK1JNX0Y9L2Jpbi9ybSAtZgorCitDUFBGTEFHUz0tSSQoWkxJQklOQykgIyAtRFBOR19ERUJVRz01CitDRkxBR1M9LU8gIyAkKFdBUk5NT1JFKQorTERGTEFHUz0tTC4gLUwkKFpMSUJMSUIpIC1scG5nIC1seiAtbG0KKworIyBQcmUtYnVpbHQgY29uZmlndXJhdGlvbgorIyBTZWUgc2NyaXB0cy9wbmdsaWJjb25mLm1hayBmb3IgbW9yZSBvcHRpb25zCitQTkdMSUJDT05GX0hfUFJFQlVJTFQgPSBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdAorCitPQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAorCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAorCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCisKKy5jLm86CisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1vICRAICQ8CisKK2FsbDogbGlicG5nLmEgcG5ndGVzdAorCitwbmdsaWJjb25mLmg6ICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKQorCSQoQ1ApICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKSAkQAorCitsaWJwbmcuYTogJChPQkpTKQorCSQoQVJfUkMpICRAICAkKE9CSlMpCisJJChSQU5MSUIpICRACisKK3BuZ3Rlc3Q6IHBuZ3Rlc3QubyBsaWJwbmcuYQorCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCisKK3Rlc3Q6IHBuZ3Rlc3QKKwkuL3BuZ3Rlc3QKKworaW5zdGFsbDogbGlicG5nLmEKKwktQCQoTUtESVJfUCkgJChERVNURElSKSQoSU5DUEFUSCkKKwktQCQoTUtESVJfUCkgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nCisJLUAkKE1LRElSX1ApICQoREVTVERJUikkKExJQlBBVEgpCisJLUAkKFJNX0YpICQoREVTVERJUikkKElOQ1BBVEgpL3BuZy5oCisJLUAkKFJNX0YpICQoREVTVERJUikkKElOQ1BBVEgpL3BuZ2NvbmYuaAorCS1AJChSTV9GKSAkKERFU1RESVIpJChJTkNQQVRIKS9wbmdsaWJjb25mLmgKKwljcCBwbmcuaCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcKKwljcCBwbmdjb25mLmggJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nCisJY3AgcG5nbGliY29uZi5oICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZworCWNobW9kIDY0NCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcvcG5nLmgKKwljaG1vZCA2NDQgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nL3BuZ2NvbmYuaAorCWNobW9kIDY0NCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcvcG5nbGliY29uZi5oCisJKGNkICQoREVTVERJUikkKElOQ1BBVEgpOyAkKExOX1NGKSBsaWJwbmcvKiAuKQorCWNwIGxpYnBuZy5hICQoREVTVERJUikkKExJQlBBVEgpCisJY2htb2QgNjQ0ICQoREVTVERJUikkKExJQlBBVEgpL2xpYnBuZy5hCisKK2NsZWFuOgorCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5nb3V0LnBuZyBwbmdsaWJjb25mLmgKKworRE9DUyA9IEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8KK3dyaXRlbG9jazoKKwljaG1vZCBhLXcgKi5bY2gzNV0gJChET0NTKSBzY3JpcHRzLyoKKworIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgorCitwbmcubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ2Vycm9yLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdyaW8ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3dpby5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nbWVtLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmdzZXQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ2dldC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncmVhZC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncnRyYW4ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3J1dGlsLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd0cmFucy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5nd3JpdGUubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKK3BuZ3d0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCitwbmd3dXRpbC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorcG5ncHJlYWQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKworcG5ndGVzdC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCmRpZmYgLS1naXQgYS9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS50YzMgYi9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS50YzMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQwMTUwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnRjMwpAQCAtMCwwICsxLDEwMCBAQAorIyBNYWtlZmlsZSBmb3IgbGlicG5nCisjIFR1cmJvQy9DKysgKE5vdGU6IEFsbCBtb2R1bGVzIGFyZSBjb21waWxlZCBpbiBDIG1vZGUpCisKKyMgVG8gdXNlLCBkbyAibWFrZSAtZm1ha2VmaWxlLnRjMyIKKworIyAtLS0tLSBUdXJibyBDKysgMy4wIC0tLS0tCisKK01PREVMPWwKK0NQUEZMQUdTPS1JLi5cemxpYgorQ0ZMQUdTPS1PMiAtWiAtbSQoTU9ERUwpCitDQz10Y2MKK0xEPXRjYworTElCPXRsaWIKK0xERkxBR1M9LW0kKE1PREVMKSAtTC4uXHpsaWIKK0NQPWNvcHkKKworIyBQcmUtYnVpbHQgY29uZmlndXJhdGlvbgorIyBTZWUgc2NyaXB0c1xwbmdsaWJjb25mLm1hayBmb3IgbW9yZSBvcHRpb25zCishaWZuZGVmIFBOR0xJQkNPTkZfSF9QUkVCVUlMVAorUE5HTElCQ09ORl9IX1BSRUJVSUxUID0gc2NyaXB0c1xwbmdsaWJjb25mLmgucHJlYnVpbHQKKyFlbmRpZgorCitPPS5vYmoKK0U9LmV4ZQorCisjIHZhcmlhYmxlcworT0JKUzEgPSBwbmckKE8pIHBuZ3NldCQoTykgcG5nZ2V0JChPKSBwbmdydXRpbCQoTykgcG5ndHJhbnMkKE8pIHBuZ3d1dGlsJChPKQorT0JKUzIgPSBwbmdtZW0kKE8pIHBuZ3ByZWFkJChPKSBwbmdyZWFkJChPKSBwbmdlcnJvciQoTykgcG5nd3JpdGUkKE8pCitPQkpTMyA9IHBuZ3J0cmFuJChPKSBwbmd3dHJhbiQoTykgcG5ncmlvJChPKSBwbmd3aW8kKE8pCitPQkpTTDEgPSArcG5nJChPKSArcG5nc2V0JChPKSArcG5nZ2V0JChPKSArcG5ncnV0aWwkKE8pICtwbmd0cmFucyQoTykKK09CSlNMMiA9ICtwbmd3dXRpbCQoTykgK3BuZ21lbSQoTykgK3BuZ3ByZWFkJChPKSArcG5ncmVhZCQoTykgK3BuZ2Vycm9yJChPKQorT0JKU0wzID0gK3BuZ3dyaXRlJChPKSArcG5ncnRyYW4kKE8pICtwbmd3dHJhbiQoTykgK3BuZ3JpbyQoTykgK3BuZ3dpbyQoTykKKworYWxsOiBsaWJwbmckKE1PREVMKS5saWIgcG5ndGVzdCQoRSkKKworcG5nbGliY29uZi5oOiAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkKKwkkKENQKSAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkgJEAKKworcG5ndGVzdDogcG5ndGVzdCQoRSkKKwordGVzdDogcG5ndGVzdCQoRSkKKwlwbmd0ZXN0JChFKQorCitwbmckKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorCQkgICQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jCisKK3BuZ3NldCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJCSAgJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMKKworcG5nZ2V0JChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKwkJICAkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYworCitwbmdyZWFkJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKwkJICAkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYworCitwbmdwcmVhZCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJCSAgJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMKKworcG5ncnRyYW4kKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorCQkgICQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jCisKK3BuZ3J1dGlsJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKwkJICAkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYworCitwbmdlcnJvciQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMKKworcG5nbWVtJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYworCitwbmdyaW8kKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jCisKK3BuZ3dpbyQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMKKworcG5ndGVzdCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYworCitwbmd0cmFucyQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMKKworcG5nd3JpdGUkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jCisKK3BuZ3d0cmFuJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYworCitwbmd3dXRpbCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMKKworbGlicG5nJChNT0RFTCkubGliOiAkKE9CSlMxKSAkKE9CSlMyKSAkKE9CSlMzKQorCSQoTElCKSBsaWJwbmckKE1PREVMKSArJChPQkpTTDEpCisJJChMSUIpIGxpYnBuZyQoTU9ERUwpICskKE9CSlNMMikKKwkkKExJQikgbGlicG5nJChNT0RFTCkgKyQoT0JKU0wzKQorCitwbmd0ZXN0JChFKTogcG5ndGVzdCQoTykgbGlicG5nJChNT0RFTCkubGliCisJJChMRCkgJChMREZMQUdTKSBwbmd0ZXN0Lm9iaiBsaWJwbmckKE1PREVMKS5saWIgemxpYl8kKE1PREVMKS5saWIKKworIyBFbmQgb2YgbWFrZWZpbGUgZm9yIGxpYnBuZwpkaWZmIC0tZ2l0IGEvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUudmN3aW4zMiBiL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnZjd2luMzIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJkMTQzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnZjd2luMzIKQEAgLTAsMCArMSwxMTMgQEAKKyMgbWFrZWZpbGUgZm9yIGxpYnBuZworIyBDb3B5cmlnaHQgKEMpIDE5OTggVGltIFdlZ25lcgorIyBDb3B5cmlnaHQgKEMpIDIwMDYsMjAwOSwyMDExLDIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCisjCisjIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisjIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKyMKKyMgQXNzdW1lcyB0aGF0IHpsaWIubGliLCB6Y29uZi5oLCBhbmQgemxpYi5oIGhhdmUgYmVlbiBjb3BpZWQgdG8gLi5cemxpYgorIyBUbyB1c2UsIGRvICJubWFrZSAvZiBzY3JpcHRzXG1ha2VmaWxlLnZjd2luMzIiCisKKyMgLS0tLS0tLS0gTWljcm9zb2Z0IFZpc3VhbCBDKysgMi4wIGFuZCBsYXRlciAtLS0tLS0tLQorCisjIENvbXBpbGVyLCBsaW5rZXIsIGxpYnJhcmlhbiBhbmQgb3RoZXIgdG9vbHMKK0NDID0gY2wKK0xEID0gbGluaworQVIgPSBsaWIKK0NQUEZMQUdTID0gLUkuLlx6bGliCitDRkxBR1MgID0gLW5vbG9nbyAtRF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSAtRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTIC1NRCAtTzIgLVczCitMREZMQUdTID0gLW5vbG9nbworQVJGTEFHUyA9IC1ub2xvZ28KK0NQID0gY29weQorUk0gPSBkZWwKKworIyBQcmUtYnVpbHQgY29uZmlndXJhdGlvbgorIyBTZWUgc2NyaXB0c1xwbmdsaWJjb25mLm1hayBmb3IgbW9yZSBvcHRpb25zCitQTkdMSUJDT05GX0hfUFJFQlVJTFQgPSBzY3JpcHRzXHBuZ2xpYmNvbmYuaC5wcmVidWlsdAorCisjIEZpbGUgZXh0ZW5zaW9ucworTz0ub2JqCisKKyN1bmNvbW1lbnQgbmV4dCB0byBwdXQgZXJyb3IgbWVzc2FnZXMgaW4gYSBmaWxlCisjRVJSRklMRT0gPj4gcG5nZXJycy5sb2cKKworIyBWYXJpYWJsZXMKK09CSlMxID0gcG5nJChPKSBwbmdlcnJvciQoTykgcG5nZ2V0JChPKSBwbmdtZW0kKE8pIHBuZ3ByZWFkJChPKQorT0JKUzIgPSBwbmdyZWFkJChPKSBwbmdyaW8kKE8pIHBuZ3J0cmFuJChPKSBwbmdydXRpbCQoTykgcG5nc2V0JChPKQorT0JKUzMgPSBwbmd0cmFucyQoTykgcG5nd2lvJChPKSBwbmd3cml0ZSQoTykgcG5nd3RyYW4kKE8pIHBuZ3d1dGlsJChPKQorT0JKUyAgPSAkKE9CSlMxKSAkKE9CSlMyKSAkKE9CSlMzKQorCisjIFRhcmdldHMKK2FsbDogbGlicG5nLmxpYgorCitwbmdsaWJjb25mLmg6ICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKQorCSQoQ1ApICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKSAkQAorCitwbmckKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKKworcG5nc2V0JChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCisKK3BuZ2dldCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQorCitwbmdyZWFkJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCisKK3BuZ3ByZWFkJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCisKK3BuZ3J0cmFuJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCisKK3BuZ3J1dGlsJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCisKK3BuZ2Vycm9yJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCisKK3BuZ21lbSQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQorCitwbmdyaW8kKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKKworcG5nd2lvJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCisKK3BuZ3RyYW5zJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCisKK3BuZ3dyaXRlJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCisKK3BuZ3d0cmFuJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCisKK3BuZ3d1dGlsJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKKwkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCisKK2xpYnBuZy5saWI6ICQoT0JKUykKKwktJChSTSkgJEAKKwkkKEFSKSAkKEFSRkxBR1MpIC1vdXQ6JEAgJChPQkpTKSAkKEVSUkZJTEUpCisKK3BuZ3Rlc3QkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCisJJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQorCitwbmd0ZXN0LmV4ZTogcG5ndGVzdCQoTykgbGlicG5nLmxpYgorCSQoTEQpICQoTERGTEFHUykgLW91dDokQCBwbmd0ZXN0JChPKSBsaWJwbmcubGliIC4uXHpsaWJcemxpYi5saWIgJChFUlJGSUxFKQorCit0ZXN0OiBwbmd0ZXN0LmV4ZQorCXBuZ3Rlc3QKKworY2xlYW46CisJLSQoUk0pICokKE8pCisJLSQoUk0pIGxpYnBuZy5saWIKKwktJChSTSkgcG5nbGliY29uZi5oCisJLSQoUk0pIHBuZ3Rlc3QuZXhlCisJLSQoUk0pIHBuZ291dC5wbmcKKworIyBFbmQgb2YgbWFrZWZpbGUgZm9yIGxpYnBuZworCmRpZmYgLS1naXQgYS9saWJwbmcvc2NyaXB0cy9tYWtldm1zLmNvbSBiL2xpYnBuZy9zY3JpcHRzL21ha2V2bXMuY29tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YzMyNjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvc2NyaXB0cy9tYWtldm1zLmNvbQpAQCAtMCwwICsxLDE0MiBAQAorJCEgbWFrZSBsaWJwbmcgdW5kZXIgVk1TCiskIQorJCEKKyQhIENoZWNrIGZvciBNTUsvTU1TCiskIQorJCEgVGhpcyBwcm9jZWR1cmUgYWNjZXB0cyBvbmUgcGFyYW1ldGVyIChjb250cmliKSwgd2hpY2ggY2F1c2VzIGl0IHRvIGJ1aWxkCiskISB0aGUgcHJvZ3JhbXMgZnJvbSB0aGUgY29udHJpYiBkaXJlY3RvcnkgaW5zdGVhZCBvZiBsaWJwbmcuCiskIQorJCBwMSA9IGYkZWRpdChwMSwiVVBDQVNFIikKKyQgaWYgcDEgLmVxcy4gIkNPTlRSSUIiCiskIHRoZW4KKyQgICBzZXQgZGVmIFsuY29udHJpYi5ncmVnYm9va10KKyQgICBAbWFrZXZtcworJCAgIHNldCBkZWYgWy0ucG5nbWludXNdCiskICAgQG1ha2V2bXMKKyQgICBzZXQgZGVmIFstLV0KKyQgICBleGl0CiskIGVuZGlmCiskIE1ha2UgPSAiIgorJCBJZiBGJFNlYXJjaCAoIlN5cyRTeXN0ZW06TU1TLkVYRSIpIC5uZXMuICIiIFRoZW4gTWFrZSA9ICJNTVMiCiskIElmIEYkVHlwZSAoTU1LKSAuZXFzLiAiU1RSSU5HIiBUaGVuIE1ha2UgPSAiTU1LIgorJCEKKyQhIExvb2sgZm9yIHRoZSBjb21waWxlciB1c2VkCiskIQorJCB6bGlic3JjID0gIlstLnpsaWJdIgorJCBjY29wdD0iL2luY2x1ZGU9Jyd6bGlic3JjJyIKKyQgaWYgZiRnZXRzeWkoIkhXX01PREVMIikuZ2UuMTAyNAorJCB0aGVuCiskICBjY29wdCA9ICIvcHJlZml4PWFsbCIrY2NvcHQKKyQgIGNvbXAgID0gIl9fZGVjY19fPTEiCiskICBpZiBmJHRybmxubSgiU1lTIikuZXFzLiIiIHRoZW4gZGVmaW5lIHN5cyBzeXMkbGlicmFyeToKKyQgZWxzZQorJCAgaWYgZiRzZWFyY2goIlNZUyRTWVNURU06REVDQyRDT01QSUxFUi5FWEUiKS5lcXMuIiIKKyQgICB0aGVuCiskICAgIGlmIGYkdHJubG5tKCJTWVMiKS5lcXMuIiIgdGhlbiBkZWZpbmUgc3lzIHN5cyRsaWJyYXJ5OgorJCAgICBpZiBmJHNlYXJjaCgiU1lTJFNZU1RFTTpWQVhDLkVYRSIpLmVxcy4iIgorJCAgICAgdGhlbgorJCAgICAgIGNvbXAgID0gIl9fZ2NjX189MSIKKyQgICAgICBDQyA6PT0gR0NDCiskICAgICBlbHNlCiskICAgICAgY29tcCA9ICJfX3ZheGNfXz0xIgorJCAgICAgZW5kaWYKKyQgICBlbHNlCiskICAgIGlmIGYkdHJubG5tKCJTWVMiKS5lcXMuIiIgdGhlbiBkZWZpbmUgc3lzIGRlY2MkbGlicmFyeV9pbmNsdWRlOgorJCAgICBjY29wdCA9ICIvZGVjYy9wcmVmaXg9YWxsIitjY29wdAorJCAgICBjb21wICA9ICJfX2RlY2NfXz0xIgorJCAgZW5kaWYKKyQgZW5kaWYKKyQhCiskISBCdWlsZCB0aGUgdGhpbmcgcGxhaW4gb3Igd2l0aCBtbXMvbW1rCiskIQorJCB3cml0ZSBzeXMkb3V0cHV0ICJDb21waWxpbmcgTGlicG5nIHNvdXJjZXMgLi4uIgorJCBpZiBtYWtlLmVxcy4iIgorJCAgdGhlbgorJCAgIGRlbGUgcG5ndGVzdC5vYmo7KgorJCAgIENBTEwgTUFLRSBwbmcuT0JKICJjYyAnJ0NDT1BUJyBwbmciIC0KKwlwbmcuYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorJCAgIENBTEwgTUFLRSBwbmdzZXQuT0JKICJjYyAnJ0NDT1BUJyBwbmdzZXQiIC0KKwlwbmdzZXQuYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorJCAgIENBTEwgTUFLRSBwbmdnZXQuT0JKICJjYyAnJ0NDT1BUJyBwbmdnZXQiIC0KKwlwbmdnZXQuYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorJCAgIENBTEwgTUFLRSBwbmdyZWFkLk9CSiAiY2MgJydDQ09QVCcgcG5ncmVhZCIgLQorCXBuZ3JlYWQuYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorJCAgIENBTEwgTUFLRSBwbmdwcmVhZC5PQkogImNjICcnQ0NPUFQnIHBuZ3ByZWFkIiAtCisJcG5ncHJlYWQuYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorJCAgIENBTEwgTUFLRSBwbmdydHJhbi5PQkogImNjICcnQ0NPUFQnIHBuZ3J0cmFuIiAtCisJcG5ncnRyYW4uYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorJCAgIENBTEwgTUFLRSBwbmdydXRpbC5PQkogImNjICcnQ0NPUFQnIHBuZ3J1dGlsIiAtCisJcG5ncnV0aWwuYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorJCAgIENBTEwgTUFLRSBwbmdlcnJvci5PQkogImNjICcnQ0NPUFQnIHBuZ2Vycm9yIiAtCisJcG5nZXJyb3IuYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorJCAgIENBTEwgTUFLRSBwbmdtZW0uT0JKICJjYyAnJ0NDT1BUJyBwbmdtZW0iIC0KKwlwbmdtZW0uYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorJCAgIENBTEwgTUFLRSBwbmdyaW8uT0JKICJjYyAnJ0NDT1BUJyBwbmdyaW8iIC0KKwlwbmdyaW8uYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorJCAgIENBTEwgTUFLRSBwbmd3aW8uT0JKICJjYyAnJ0NDT1BUJyBwbmd3aW8iIC0KKwlwbmd3aW8uYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorJCAgIENBTEwgTUFLRSBwbmd0cmFucy5PQkogImNjICcnQ0NPUFQnIHBuZ3RyYW5zIiAtCisJcG5ndHJhbnMuYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorJCAgIENBTEwgTUFLRSBwbmd3cml0ZS5PQkogImNjICcnQ0NPUFQnIHBuZ3dyaXRlIiAtCisJcG5nd3JpdGUuYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorJCAgIENBTEwgTUFLRSBwbmd3dHJhbi5PQkogImNjICcnQ0NPUFQnIHBuZ3d0cmFuIiAtCisJcG5nd3RyYW4uYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorJCAgIENBTEwgTUFLRSBwbmd3dXRpbC5PQkogImNjICcnQ0NPUFQnIHBuZ3d1dGlsIiAtCisJcG5nd3V0aWwuYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAorJCAgIHdyaXRlIHN5cyRvdXRwdXQgIkJ1aWxkaW5nIExpYnBuZyAuLi4iCiskICAgQ0FMTCBNQUtFIGxpYnBuZy5PTEIgImxpYi9jcmVhIGxpYnBuZy5vbGIgKi5vYmoiICouT0JKCiskICAgd3JpdGUgc3lzJG91dHB1dCAiQnVpbGRpbmcgcG5ndGVzdC4uLiIKKyQgICBDQUxMIE1BS0UgcG5ndGVzdC5PQkogImNjICcnQ0NPUFQnIHBuZ3Rlc3QiIC0KKwlwbmd0ZXN0LmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaAorJCAgIGNhbGwgbWFrZSBwbmd0ZXN0LmV4ZSAtCisJIkxJTksgcG5ndGVzdCxsaWJwbmcub2xiL2xpYiwnJ3psaWJzcmMnbGliei5vbGIvbGliIiAtCisJcG5ndGVzdC5vYmogbGlicG5nLm9sYgorJCAgIHdyaXRlIHN5cyRvdXRwdXQgIlRlc3RpbmcgTGlicG5nLi4uIgorJCAgIHJ1biBwbmd0ZXN0CiskICBlbHNlCiskICAgaWYgZiRzZWFyY2goIkRFU0NSSVAuTU1TIikgLmVxcy4gIiIgdGhlbiBjb3B5L25vbG9nIFsuU0NSSVBUU11ERVNDUklQLk1NUyBbXQorJCAgICdtYWtlJy9tYWNybz0oJ2NvbXAnLHpsaWJzcmM9J3psaWJzcmMnKQorJCAgZW5kaWYKKyQgd3JpdGUgc3lzJG91dHB1dCAiTGlicG5nIGJ1aWxkIGNvbXBsZXRlZCIKKyQgZXhpdAorJCEKKyQhCiskTUFLRTogU1VCUk9VVElORSAgICFTVUJST1VUSU5FIFRPIENIRUNLIERFUEVOREVOQ0lFUworJCBWID0gJ0YkVmVyaWZ5KDApCiskISBQMSA9IFdoYXQgd2UgYXJlIHRyeWluZyB0byBtYWtlCiskISBQMiA9IENvbW1hbmQgdG8gbWFrZSBpdAorJCEgUDMgLSBQOCAgV2hhdCBpdCBkZXBlbmRzIG9uCiskCiskIElmIEYkU2VhcmNoKFAxKSAuRXFzLiAiIiBUaGVuIEdvdG8gTWFrZWl0CiskIFRpbWUgPSBGJEN2VGltZShGJEZpbGUoUDEsIlJEVCIpKQorJGFyZz0zCiskTG9vcDoKKyQgICAgICAgQXJndW1lbnQgPSBQJ2FyZworJCAgICAgICBJZiBBcmd1bWVudCAuRXFzLiAiIiBUaGVuIEdvdG8gRXhpdAorJCAgICAgICBFbD0wCiskTG9vcDI6CiskICAgICAgIEZpbGUgPSBGJEVsZW1lbnQoRWwsIiAiLEFyZ3VtZW50KQorJCAgICAgICBJZiBGaWxlIC5FcXMuICIgIiBUaGVuIEdvdG8gRW5kbAorJCAgICAgICBBRmlsZSA9ICIiCiskTG9vcDM6CiskICAgICAgIE9GaWxlID0gQUZpbGUKKyQgICAgICAgQUZpbGUgPSBGJFNlYXJjaChGaWxlKQorJCAgICAgICBJZiBBRmlsZSAuRXFzLiAiIiAuT3IuIEFGaWxlIC5FcXMuIE9GaWxlIFRoZW4gR290byBOZXh0RWwKKyQgICAgICAgSWYgRiRDdlRpbWUoRiRGaWxlKEFGaWxlLCJSRFQiKSkgLkdlcy4gVGltZSBUaGVuIEdvdG8gTWFrZWl0CiskICAgICAgIEdvdG8gTG9vcDMKKyROZXh0RUw6CiskICAgICAgIEVsID0gRWwgKyAxCiskICAgICAgIEdvdG8gTG9vcDIKKyRFbmRMOgorJCBhcmc9YXJnKzEKKyQgSWYgYXJnIC5MZS4gOCBUaGVuIEdvdG8gTG9vcAorJCBHb3RvIEV4aXQKKyQKKyRNYWtlaXQ6CiskIFZWPUYkVkVSSUZZKDApCiskIHdyaXRlIHN5cyRvdXRwdXQgUDIKKyQgJ1AyCiskIFZWPSdGJFZlcmlmeShWVikKKyRFeGl0OgorJCBJZiBWIFRoZW4gU2V0IFZlcmlmeQorJEVORFNVQlJPVVRJTkUKZGlmZiAtLWdpdCBhL2xpYnBuZy9zY3JpcHRzL29wdGlvbnMuYXdrIGIvbGlicG5nL3NjcmlwdHMvb3B0aW9ucy5hd2sKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODFiODJmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9zY3JpcHRzL29wdGlvbnMuYXdrCkBAIC0wLDAgKzEsODk4IEBACisjIS9iaW4vYXdrIC1mCisjIHNjcmlwdHMvb3B0aW9ucy5hd2sgLSBsaWJyYXJ5IGJ1aWxkIGNvbmZpZ3VyYXRpb24gY29udHJvbAorIworIyBsYXN0IGNoYW5nZWQgaW4gbGlicG5nIHZlcnNpb24gMS42LjExIC0gSnVuZSA1LCAyMDE0CisjCisjIENvcHlyaWdodCAoYykgMTk5OC0yMDE0IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorIworIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisjIGFuZCBsaWNlbnNlIGluIHBuZy5oCisKKyMgVGhlIG91dHB1dCBvZiB0aGlzIHNjcmlwdCBpcyB3cml0dGVuIHRvIHRoZSBmaWxlIGdpdmVuIGJ5CisjIHRoZSB2YXJpYWJsZSAnb3V0Jy4gIFRoZSBzY3JpcHQgaXMgcnVuIHR3aWNlLCBvbmNlIHdpdGgKKyMgYW4gaW50ZXJtZWRpYXRlIG91dHB1dCBmaWxlLCAnb3B0aW9ucy50bXAnIHRoZW4gYWdhaW4gb24KKyMgdGhhdCBmaWxlIHRvIHByb2R1Y2UgdGhlIGZpbmFsIG91dHB1dDoKKyMKKyMgIGF3ayAtZiBzY3JpcHRzL29wdGlvbnMuYXdrIG91dD1vcHRpb25zLnRtcCBzY3JpcHRzL29wdGlvbnMuZGZhIDE+JjIKKyMgIGF3ayAtZiBzY3JpcHRzL29wdGlvbnMuYXdrIG91dD1vcHRpb25zLmRmbiBvcHRpb25zLnRtcCAxPiYyCisjCisjIFNvbWUgb3B0aW9ucyBtYXkgYmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmU6CisjCisjICBkZWI9MSAgICAgICAgICAgIENhdXNlcyBkZWJ1Z2dpbmcgdG8gYmUgb3V0cHV0CisjICBsb2d1bnN1cHBvcnRlZD0xIENhdXNlcyBhbGwgb3B0aW9ucyB0byBiZSByZWNvcmRlZCBpbiB0aGUgb3V0cHV0CisjICBldmVyeXRoaW5nPW9mZiAgIENhdXNlcyBhbGwgb3B0aW9ucyB0byBiZSBkaXNhYmxlZCBieSBkZWZhdWx0CisjICBldmVyeXRoaW5nPW9uICAgIENhdXNlcyBhbGwgb3B0aW9ucyB0byBiZSBlbmFibGVkIGJ5IGRlZmF1bHQKKyMKKyMgSWYgYXdrIGZhaWxzIG9uIHlvdXIgcGxhdGZvcm0sIHRyeSBuYXdrIGluc3RlYWQuCisjCisjIFRoZXNlIG9wdGlvbnMgbWF5IGFsc28gYmUgc3BlY2lmaWVkIGluIHRoZSBvcmlnaW5hbCBpbnB1dCBmaWxlIChhbmQKKyMgYXJlIGNvcGllZCB0byB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUpLgorCitCRUdJTnsKKyAgIG91dD0iIiAgICAgICAgICAgICAgICAgICAgICAgIyBpbnRlcm1lZGlhdGUsIHByZXByb2Nlc3NlZCwgZmlsZQorICAgcHJlPS0xICAgICAgICAgICAgICAgICAgICAgICAjIHByZXByb2Nlc3MgKGZpcnN0IGxpbmUpCisgICB2ZXJzaW9uPSJsaWJwbmcgdmVyc2lvbiB1bmtub3duIiAjIHZlcnNpb24gaW5mb3JtYXRpb24KKyAgIHZlcnNpb25fZmlsZT0iIiAgICAgICAgICAgICAgIyB3aGVyZSB0byBmaW5kIHRoZSB2ZXJzaW9uCisgICBlcnI9MCAgICAgICAgICAgICAgICAgICAgICAgICMgaW4tbGluZSBleGl0IHNldHMgdGhpcworICAgIyBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIHByZXZlbnQgdGhlIEMgcHJlcHJvY2Vzc29yIG5vdGljaW5nIHRoZSBsaW5lcworICAgIyB0aGF0IHdpbGwgYmUgaW4gdGhlIGZpbmFsIG91dHB1dCBmaWxlLiAgU29tZSBDIHByZXByb2Nlc3NvcnMgdG9rZW5pc2UKKyAgICMgdGhlIGxpbmVzLCBmb3IgZXhhbXBsZSBieSBpbnNlcnRpbmcgc3BhY2VzIGFyb3VuZCBvcGVyYXRvcnMsIGFuZCBhbGwKKyAgICMgQyBwcmVwcm9jZXNzb3JzIG5vdGljZSBsaW5lcyB0aGF0IHN0YXJ0IHdpdGggJyMnLCBtb3N0IHJlbW92ZSBjb21tZW50cy4KKyAgICMgVGhlIHRlY2huaXF1ZSBhZG9wdGVkIGhlcmUgaXMgdG8gbWFrZSB0aGUgZmluYWwgb3V0cHV0IGxpbmVzIGludG8KKyAgICMgQyBzdHJpbmdzIChlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzKSwgcHJlY2VlZGVkIGJ5IFBOR19ERk4uICBBcyBhCisgICAjIGNvbnNlcXVlbmNlIHRoZSBvdXRwdXQgY2Fubm90IGNvbnRhaW4gYSAncmF3JyBkb3VibGUgcXVvdGUgLSBpbnN0ZWFkIHB1dAorICAgIyBAJyBpbiwgdGhpcyB3aWxsIGJlIHJlcGxhY2VkIGJ5IGEgc2luZ2xlICIgYWZ0ZXJ3YXJkLiAgU2VlIHRoZSBwYXJzZXIKKyAgICMgc2NyaXB0IGRmbi5hd2sgZm9yIG1vcmUgY2FwYWJpbGl0aWVzIChub3QgcmVxdWlyZWQgaGVyZSkuICBOb3RlIHRoYXQgaWYKKyAgICMgeW91IG5lZWQgYSAiIGluIGEgJ3NldHRpbmcnIGluIHBuZ2xpYmNvbmYuZGZhIGl0IG11c3QgYWxzbyBiZSBAJyEKKyAgIGRxPSJAJyIgICAgICAgICAgICAgICAgICAgICAgIyBGb3IgYSBzaW5nbGUgZG91YmxlIHF1b3RlCisgICBzdGFydD0iIFBOR19ERk4gXCIiICAgICAgICAgICMgU3RhcnQgc3R1ZmYgdG8gb3V0cHV0IChjYW4ndCBjb250YWluIGEgIiEpCisgICBlbmQ9IlwiICIgICAgICAgICAgICAgICAgICAgICMgRW5kIHN0dWZmIHRvIG91dHB1dAorICAgc3Vicz0iQFwiICIgICAgICAgICAgICAgICAgICAjIFN1YnN0aXR1dGUgc3RhcnQgKHN1YnN0aXR1dGUgYSBDIG1hY3JvKQorICAgc3ViZT0iIFwiQCIgICAgICAgICAgICAgICAgICAjIFN1YnN0aXR1dGUgZW5kCisgICBjb21tZW50PXN0YXJ0ICIvKiIgICAgICAgICAgICMgQ29tbWVudCBzdGFydAorICAgY2VuZD0iKi8iIGVuZCAgICAgICAgICAgICAgICAjIENvbW1lbnQgZW5kCisgICBkZWY9c3RhcnQgIiNkZWZpbmUgUE5HXyIgICAgICMgQXJiaXRyYXJ5IGRlZmluZQorICAgc3VwPSJfU1VQUE9SVEVEIiBlbmQgICAgICAgICAjIGVuZCBzdXBwb3J0ZWQgb3B0aW9uCisgICB1bmQ9Y29tbWVudCAiI3VuZGVmIFBOR18iICAgICMgVW5zdXBwb3J0ZWQgb3B0aW9uCisgICB1bmU9Il9TVVBQT1JURUQiIGNlbmQgICAgICAgICMgZW5kIHVuc3VwcG9ydGVkIG9wdGlvbgorICAgZXJyb3I9c3RhcnQgIkVSUk9SOiIgICAgICAgICAjIGVycm9yIG1lc3NhZ2UsIHRlcm1pbmF0ZSB3aXRoICdlbmQnCisKKyAgICMgVmFyaWFibGVzCisgICBkZWI9MCAgICAgICAgICAgICAgICAgICAgICAgICMgZGVidWcgLSBzZXQgb24gY29tbWFuZCBsaW5lCisgICBldmVyeXRoaW5nPSIiICAgICAgICAgICAgICAgICMgZG8gbm90IG92ZXJyaWRlIGRlZmF1bHRzCisgICBsb2d1bnN1cHBvcnRlZD0wICAgICAgICAgICAgICMgd3JpdGUgdW5zdXBwb3J0ZWQgb3B0aW9ucyB0b28KKworICAgIyBQcmVjcmVhdGUgYXJyYXlzCisgICAjIGZvciBlYWNoIG9wdGlvbjoKKyAgIG9wdGlvblsiIl0gPSAiIiAgICAjIGxpc3Qgb2YgYWxsIG9wdGlvbnM6IGRlZmF1bHQgZW5hYmxlZC9kaXNhYmxlZAorICAgZG9uZVsiIl0gPSAxICAgICAgICMgbWFya3Mgb3B0aW9uIGFzIGhhdmluZyBiZWVuIG91dHB1dAorICAgcmVxdWlyZXNbIiJdID0gIiIgICMgcmVxdWlyZXMgYnkgb3B0aW9uCisgICBpZmZzWyIiXSA9ICIiICAgICAgIyBpZiBieSBvcHRpb24KKyAgIGVuYWJsZWRieVsiIl0gPSAiIiAjIG9wdGlvbnMgdGhhdCBlbmFibGUgaXQgYnkgb3B0aW9uCisgICBzZXRzWyIiXSA9ICIiICAgICAgIyBzZXR0aW5ncyBzZXQgYnkgZWFjaCBvcHRpb24KKyAgIHNldHZhbFsiIl0gPSAiIiAgICAjIHZhbHVlIHRvIHNldCAoaW5kZXhlZDogJ29wdGlvbiBzZXRzW29wdGlvbl0nKQorICAgIyBmb3IgZWFjaCBzZXR0aW5nOgorICAgc2V0dGluZ1siIl0gPSAiIiAgICMgcmVxdWlyZXMgYnkgc2V0dGluZworICAgZGVmYXVsdHNbIiJdID0gIiIgICMgdXNlZCBmb3IgYSBkZWZhdWx0ZWQgdmFsdWUKKyAgIGRvbmVzZXRbIiJdID0gMSAgICAjIG1hcmtzIHNldHRpbmcgYXMgaGF2aW5nIGJlZW4gb3V0cHV0CisgICByWyIiXSA9ICIiICAgICAgICAgIyBUZW1wb3JhcnkgYXJyYXkKKworICAgIyBGb3IgZGVjb3JhdGluZyB0aGUgb3V0cHV0IGZpbGUKKyAgIHByb3RlY3QgPSAiIgorfQorCisjIFRoZSBvdXRwdXQgZmlsZSBtdXN0IGJlIHNwZWNpZmllZCBiZWZvcmUgYW55IGlucHV0Ogorb3V0ID09ICIiIHsKKyAgIHByaW50ICJvdXQ9b3V0cHV0LmZpbGUgbXVzdCBiZSBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lIgorICAgZXJyID0gMQorICAgZXhpdCAxCit9CisKKyMgVGhlIHZlcnkgZmlyc3QgbGluZSBpbmRpY2F0ZXMgd2hldGhlciB3ZSBhcmUgcmVhZGluZyBwcmUtcHJvY2Vzc2VkCisjIGlucHV0IG9yIG5vdCwgdGhpcyBtdXN0IGNvbWUgKmZpcnN0KiBiZWNhdXNlICdQUkVQUk9DRVNTRUQnIG5lZWRzCisjIHRvIGJlIHRoZSB2ZXJ5IGZpcnN0IGxpbmUgaW4gdGhlIHRlbXBvcmFyeSBmaWxlLgorcHJlID09IC0xeworICAgaWYgKCQwID09ICJQUkVQUk9DRVNTRUQiKSB7CisgICAgICBwcmUgPSAwCisgICAgICBuZXh0CisgICB9IGVsc2UgeworICAgICAgcHJlID0gMQorICAgICAgcHJpbnQgIlBSRVBST0NFU1NFRCIgPm91dAorICAgICAgIyBBbmQgZmFsbCB0aHJvdWdoIHRvIGNvbnRpbnVlIHByb2Nlc3NpbmcKKyAgIH0KK30KKworIyBXaGlsZSBwcmUtcHJvY2Vzc2luZyBpZiB2ZXJzaW9uIGlzIHNldCB0byAic2VhcmNoIiBsb29rIGZvciBhIHZlcnNpb24gc3RyaW5nCisjIGluIHRoZSBmb2xsb3dpbmcgZmlsZS4KK3ByZSAmJiB2ZXJzaW9uID09ICJzZWFyY2giICYmIHZlcnNpb25fZmlsZSA9PSAiInsKKyAgIHZlcnNpb25fZmlsZSA9IEZJTEVOQU1FCit9CisKK3ByZSAmJiB2ZXJzaW9uID09ICJzZWFyY2giICYmIHZlcnNpb25fZmlsZSAhPSBGSUxFTkFNRXsKKyAgIHByaW50ICJ2ZXJzaW9uIHN0cmluZyBub3QgZm91bmQgaW4iLCB2ZXJzaW9uX2ZpbGUKKyAgIGVyciA9IDEKKyAgIGV4aXQgMQorfQorCitwcmUgJiYgdmVyc2lvbiA9PSAic2VhcmNoIiAmJiAkMCB+IC9eIFwqIGxpYnBuZyB2ZXJzaW9uL3sKKyAgIHZlcnNpb24gPSBzdWJzdHIoJDAsIDQpCisgICBwcmludCAidmVyc2lvbiA9IiwgdmVyc2lvbiA+b3V0CisgICBuZXh0Cit9CisKK3ByZSAmJiBGSUxFTkFNRSA9PSB2ZXJzaW9uX2ZpbGV7CisgICBuZXh0Cit9CisKKyMgdmFyaWFibGU9dmFsdWUKKyMgICBTZXRzIHRoZSBnaXZlbiB2YXJpYWJsZSB0byB0aGUgZ2l2ZW4gdmFsdWUgKHRoZSBzeW50YXggaXMgZmFpcmx5CisjICAgZnJlZSBmb3JtLCBleGNlcHQgZm9yIGRlYiAoeW91IGFyZSBleHBlY3RlZCB0byB1bmRlcnN0YW5kIGhvdyB0bworIyAgIHNldCB0aGUgZGVidWcgdmFyaWFibGUuLi4pCisjCisjICAgVGhpcyBoYXBwZW5zIGJlZm9yZSB0aGUgY2hlY2sgb24gJ3ByZScgYmVsb3cgc2tpcHMgbW9zdCBvZiB0aGUKKyMgICByZXN0IG9mIHRoZSBhY3Rpb25zLCBzbyB0aGUgdmFyaWFibGUgc2V0dGluZ3MgaGFwcGVuIGR1cmluZworIyAgIHByZXByb2Nlc3NpbmcgYnV0IGFyZSByZWNvcmRlZCBpbiB0aGUgRU5EIGFjdGlvbiB0b28uICBUaGlzCisjICAgYWxsb3dzIHRoZW0gdG8gYmUgc2V0IG9uIHRoZSBjb21tYW5kIGxpbmUgdG9vLgorJDAgfiAvXlsgCV0qdmVyc2lvblsgCV0qPS97CisgICBzdWIoL15bICBdKnZlcnNpb25bICBdKj1bICBdKi8sICIiKQorICAgdmVyc2lvbiA9ICQwCisgICBuZXh0Cit9CiskMCB+IC9eWyAJXSpldmVyeXRoaW5nWyAJPV0qb2ZmWyAJXSokL3sKKyAgIGV2ZXJ5dGhpbmcgPSAib2ZmIgorICAgbmV4dAorfQorJDAgfiAvXlsgCV0qZXZlcnl0aGluZ1sgCT1dKm9uWyAJXSokL3sKKyAgIGV2ZXJ5dGhpbmcgPSAib24iCisgICBuZXh0Cit9CiskMCB+IC9eWyAJXSpsb2d1bnN1cHBvcnRlZFsgCT1dKjBbIAldKiQveworICAgbG9ndW5zdXBwb3J0ZWQgPSAwCisgICBuZXh0Cit9CiskMCB+IC9eWyAJXSpsb2d1bnN1cHBvcnRlZFsgCT1dKjFbIAldKiQveworICAgbG9ndW5zdXBwb3J0ZWQgPSAxCisgICBuZXh0Cit9CiskMSA9PSAiZGViIiAmJiAkMiA9PSAiPSIgJiYgTkYgPT0gM3sKKyAgIGRlYiA9ICQzCisgICBuZXh0Cit9CisKKyMgUHJlcHJvY2Vzc2luZyAtIHRoaXMganVzdCBjb3BpZXMgdGhlIGlucHV0IGZpbGUgd2l0aCBsaW5lcworIyB0aGF0IG5lZWQgcHJlcHJvY2Vzc2luZyAoanVzdCBjaHVuayBhdCBwcmVzZW50KSBleHBhbmRlZAorIyBUaGUgYmFyZSAicHJlIiBpbnN0ZWFkIG9mICJwcmUgIT0gMCIgY3Jhc2hlcyB1bmRlciBTdW5vcyBhd2sKK3ByZSAmJiAkMSAhPSAiY2h1bmsieworICAgcHJpbnQgPm91dAorICAgbmV4dAorfQorCisjIFRoZSBmaXJzdCBjaGFyYWN0ZXJzIG9mIHRoZSBsaW5lIGRldGVybWluZSBob3cgaXQgaXMgcHJvY2Vzc2VkLAorIyBsZWFkaW5nIHNwYWNlcyBhcmUgaWdub3JlZC4gIEluIGdlbmVyYWwgdG9rZW5zIHRoYXQgYXJlIG5vdAorIyBrZXl3b3JkcyBhcmUgdGhlIG5hbWVzIG9mIG9wdGlvbnMuICBBbiBvcHRpb24gJ25hbWUnIGlzCisjIGNvbnRyb2xsZWQgYnkgdGhlIGRlZmluaXRpb24gb2YgdGhlIGNvcnJlc3BvbmRpbmcgbWFjcm9zOgorIworIyAgIFBOR19uYW1lX1NVUFBPUlRFRCAgICBUaGUgb3B0aW9uIGlzIHR1cm5lZCBvbgorIyAgIFBOR19OT19uYW1lCisjICAgUE5HX05PX25hbWVfU1VQUE9SVEVEIElmIHRoZSBmaXJzdCBtYWNybyBpcyBub3QgZGVmaW5lZAorIyAgICAgICAgICAgICAgICAgICAgICAgICBlaXRoZXIgb2YgdGhlc2Ugd2lsbCB0dXJuIHRoZSBvcHRpb24gb2ZmCisjCisjIElmIG5vbmUgb2YgdGhlc2UgbWFjcm9zIGFyZSBkZWZpbmVkIHRoZSBvcHRpb24gaXMgdHVybmVkIG9uLCB1bmxlc3MKKyMgdGhlIGtleXdvcmQgJ29mZicgaXMgZ2l2ZW4gaW4gYSBsaW5lIHJlbGF0aW5nIHRvIHRoZSBvcHRpb24uICBUaGUKKyMga2V5d29yZCAnb24nIGNhbiBhbHNvIGJlIGdpdmVuLCBidXQgaXQgd2lsbCBiZSBpZ25vcmVkIChzaW5jZSBpdCBpcworIyB0aGUgZGVmYXVsdC4pCisjCisjIEluIHRoZSBzeW50YXggYmVsb3cgYSAnbmFtZScgaXMgaW5kaWNhdGVkIGJ5ICJOQU1FIiwgb3RoZXIgbWFjcm8KKyMgdmFsdWVzIGFyZSBpbmRpY2F0ZWQgYnkgIk1BQ1JPIiwgYXMgd2l0aCAiTkFNRSIgdGhlIGxlYWRpbmcgIlBOR18iCisjIGlzIG9taXR0ZWQsIGJ1dCBpbiB0aGlzIGNhc2UgdGhlICJOT18iIHByZWZpeCBhbmQgdGhlICJfU1VQUE9SVEVEIgorIyBzdWZmaXggYXJlIG5ldmVyIHVzZWQuCisjCisjIEVhY2ggbGluZSBpcyBpbnRyb2R1Y2VkIGJ5IGEga2V5d29yZCAtIHRoZSBmaXJzdCBub24tc3BhY2UgY2hhcmFjdGVycworIyBvbiB0aGUgbGluZS4gIEEgbGluZSBzdGFydGluZyB3aXRoIGEgJyMnIGlzIGEgY29tbWVudCAtIGl0IGlzIHRvdGFsbHkKKyMgaWdub3JlZC4gIEtleXdvcmRzIGFyZSBhcyBmb2xsb3dzLCBhIE5BTUUsIGlzIHNpbXBseSBhIG1hY3JvIG5hbWUKKyMgd2l0aG91dCB0aGUgbGVhZGluZyBQTkdfLCBQTkdfTk9fIG9yIHRoZSB0cmFpbGluZyBfU1VQUE9SVEVELgorCiskMSB+IC9eIy8gfHwgJDAgfiAvXlsgCV0qJC97CisgICBuZXh0Cit9CisKKyMgY29tIDxjb21tZW50PgorIyAgIFRoZSB3aG9sZSBsaW5lIGlzIHBsYWNlZCBpbiB0aGUgb3V0cHV0IGZpbGUgYXMgYSBjb21tZW50IHdpdGgKKyMgICB0aGUgcHJlY2VkaW5nICdjb20nIHJlbW92ZWQKKyQxID09ICJjb20ieworICAgaWYgKE5GID4gMSkgeworICAgICAgIyBzdWIoL15bIAldKmNvbVsgCV0qLywgIiIpCisgICAgICAkMSA9ICIiCisgICAgICBwcmludCBjb21tZW50ICQwLCBjZW5kID5vdXQKKyAgIH0gZWxzZQorICAgICAgcHJpbnQgc3RhcnQgZW5kID5vdXQKKyAgIG5leHQKK30KKworIyB2ZXJzaW9uCisjICAgSW5zZXJ0cyBhIHZlcnNpb24gY29tbWVudAorJDEgPT0gInZlcnNpb24iICYmIE5GID09IDF7CisgICBpZiAodmVyc2lvbiA9PSAiIikgeworICAgICAgcHJpbnQgIkVSUk9SOiBubyB2ZXJzaW9uIHN0cmluZyBzZXQiCisgICAgICBlcnIgPSAxICMgcHJldmVudCBFTkR7fSBydW5uaW5nCisgICAgICBleGl0IDEKKyAgIH0KKworICAgcHJpbnQgY29tbWVudCwgdmVyc2lvbiwgY2VuZCA+b3V0CisgICBuZXh0Cit9CisKKyMgZmlsZSBvdXRwdXQgaW5wdXQgcHJvdGVjdAorIyAgIEluZm9ybWF0aW9uYWw6IHRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBpbnB1dCBmaWxlICh3aXRob3V0CisjICAgbWFrZSBnZW5lcmF0ZWQgbG9jYWwgZGlyZWN0b3JpZXMpLCB0aGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUKKyMgICBvdXRwdXQgZmlsZSBhbmQsIGlmIHJlcXVpcmVkLCBhIG5hbWUgdG8gdXNlIGluIGEgcHJvdGVjdGlvbgorIyAgIG1hY3JvIGZvciB0aGUgY29udGVudHMuCiskMSA9PSAiZmlsZSIgJiYgTkYgPj0gMnsKKyAgIHByaW50IGNvbW1lbnQsICQyLCBjZW5kID5vdXQKKyAgIHByaW50IGNvbW1lbnQsICJNYWNoaW5lIGdlbmVyYXRlZCBmaWxlOiBETyBOT1QgRURJVCIsIGNlbmQgPm91dAorICAgaWYgKE5GID49IDMpCisgICAgICBwcmludCBjb21tZW50LCAiRGVyaXZlZCBmcm9tOiIsICQzLCBjZW5kID5vdXQKKyAgIHByb3RlY3QgPSAkNAorICAgaWYgKHByb3RlY3QgIT0gIiIpIHsKKyAgICAgIHByaW50IHN0YXJ0ICIjaWZuZGVmIiwgcHJvdGVjdCBlbmQgPm91dAorICAgICAgcHJpbnQgc3RhcnQgIiNkZWZpbmUiLCBwcm90ZWN0IGVuZCA+b3V0CisgICB9CisgICBuZXh0Cit9CisKKyMgb3B0aW9uIE5BTUUgKCAocmVxdWlyZXN8ZW5hYmxlc3xpZikgTkFNRSogfCBvbiB8IG9mZiB8IGRpc2FibGVkIHwKKyMgICAgICAgICAgICAgICAgc2V0cyBTRVRUSU5HIFZBTFVFKyApKgorIyAgICAgCisjICAgRGVjbGFyZXMgYW4gb3B0aW9uICdOQU1FJyBhbmQgZGVzY3JpYmVzIGl0cyBkZWZhdWx0IHNldHRpbmcgKGRpc2FibGVkKQorIyAgIGFuZCBpdHMgcmVsYXRpb25zaGlwIHRvIG90aGVyIG9wdGlvbnMuICBUaGUgb3B0aW9uIGlzIGRpc2FibGVkCisjICAgdW5sZXNzICphbGwqIHRoZSBvcHRpb25zIGxpc3RlZCBhZnRlciAncmVxdWlyZXMnIGFyZSBzZXQgYW5kIGF0CisjICAgbGVhc3Qgb25lIG9mIHRoZSBvcHRpb25zIGxpc3RlZCBhZnRlciAnaWYnIGlzIHNldC4gIElmIHRoZQorIyAgIG9wdGlvbiBpcyBzZXQgdGhlbiBpdCB0dXJucyBvbiBhbGwgdGhlIG9wdGlvbnMgbGlzdGVkIGFmdGVyICdlbmFibGVzJy4KKyMKKyMgICBOb3RlIHRoYXQgImVuYWJsZXMiIHRha2VzIHByaW9yaXR5IG92ZXIgdGhlIHJlcXVpcmVkL2lmL2Rpc2FibGVkL29mZgorIyAgIHNldHRpbmcgb2YgdGhlIHRhcmdldCBvcHRpb24uCisjCisjICAgVGhlIGRlZmluaXRpb24gZmlsZSBtYXkgbGlzdCBhbiBvcHRpb24gYXMgJ2Rpc2FibGVkJzogb2ZmIGJ5IGRlZmF1bHQsCisjICAgb3RoZXJ3aXNlIHRoZSBvcHRpb24gaXMgZW5hYmxlZDogb24gYnkgZGVmYXVsdC4gIEEgbGF0ZXIgKGFuZCBpdCBtdXN0CisjICAgYmUgbGF0ZXIpIGVudHJ5IG1heSB0dXJuIGFuIG9wdGlvbiBvbiBvciBvZmYgZXhwbGljaXRseS4KKworJDEgPT0gIm9wdGlvbiIgJiYgTkYgPj0gMnsKKyAgIG9wdCA9ICQyCisgICBzdWIoLywkLywiIixvcHQpCisgICBvbm9mZiA9IG9wdGlvbltvcHRdICAjIHJlY29yZHMgY3VycmVudCAoYW5kIHRoZSBkZWZhdWx0IGlzICIiLCBlbmFibGVkKQorICAga2V5ID0gIiIKKyAgIGlzdGFydCA9IDMKKyAgIGRvIHsKKyAgICAgIGlmIChpc3RhcnQgPT0gMSkgeyAgICAgIyBjb250aW51YXRpb24gbGluZQorICAgICAgICAgdmFsID0gZ2V0bGluZQorCisgICAgICAgICBpZiAodmFsICE9IDEpIHsgIyBlcnJvciByZWFkaW5nIGl0CisgICAgICAgICAgICBpZiAodmFsID09IDApCisgICAgICAgICAgICAgICBwcmludCAib3B0aW9uIiwgb3B0ICI6IEVSUk9SOiBtaXNzaW5nIGNvbnRpbnVhdGlvbiBsaW5lIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgcHJpbnQgIm9wdGlvbiIsIG9wdCAiOiBFUlJPUjogZXJyb3IgcmVhZGluZyBjb250aW51YXRpb24gbGluZSIKKworICAgICAgICAgICAgIyBUaGlzIGlzIGEgaGFyZCBlcnJvcgorICAgICAgICAgICAgZXJyID0gMSAjIHByZXZlbnQgRU5Ee30gcnVubmluZworICAgICAgICAgICAgZXhpdCAxCisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGZvciAoaT1pc3RhcnQ7IGk8PU5GOyArK2kpIHsKKyAgICAgICAgIHZhbD0kKGkpCisgICAgICAgICBzdWIoLywkLywiIix2YWwpCisgICAgICAgICBpZiAodmFsID09ICJvbiIgfHwgdmFsID09ICJvZmYiIHx8IHZhbCA9PSAiZGlzYWJsZWQiIHx8IHZhbCA9PSJlbmFibGVkIikgeworICAgICAgICAgICAga2V5ID0gIiIKKyAgICAgICAgICAgIGlmIChvbm9mZiAhPSB2YWwpIHsKKyAgICAgICAgICAgICAgICMgb24gb3Igb2ZmIGNhbiB6YXAgZGlzYWJsZWQgb3IgZW5hYmxlZDoKKyAgICAgICAgICAgICAgIGlmIChvbm9mZiA9PSAiIiB8fCAob25vZmYgPT0gImRpc2FibGVkIiB8fCBvbm9mZiA9PSAiZW5hYmxlZCIpICYmCisgICAgICAgICAgICAgICAgICAgKHZhbCA9PSAib24iIHx8IHZhbCA9PSAib2ZmIikpIHsKKyAgICAgICAgICAgICAgICAgICMgSXQncyBlYXN5IHRvIG1pcy1zcGVsbCB0aGUgb3B0aW9uIHdoZW4gdHVybmluZyBpdAorICAgICAgICAgICAgICAgICAgIyBvbiBvciBvZmYsIHNvIHdhcm4gYWJvdXQgaXQgaGVyZToKKyAgICAgICAgICAgICAgICAgIGlmIChvbm9mZiA9PSAiIiAmJiAodmFsID09ICJvbiIgfHwgdmFsID09ICJvZmYiKSkgeworICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIm9wdGlvbiIsIG9wdCAiOiBFUlJPUjogdHVybmluZyB1bnJlY29nbml6ZWQgb3B0aW9uIiwgdmFsCisgICAgICAgICAgICAgICAgICAgICAjIEZvciB0aGUgbW9tZW50IGVycm9yIG91dCAtIGl0IGlzIHNhZmVyCisgICAgICAgICAgICAgICAgICAgICBlcnIgPSAxICMgcHJldmVudCBFTkR7fSBydW5uaW5nCisgICAgICAgICAgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIG9ub2ZmID0gdmFsCisgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgIyBQcmludCBhIG1lc3NhZ2UsIG90aGVyd2lzZSB0aGUgZXJyb3IKKyAgICAgICAgICAgICAgICAgICMgYmVsb3cgaXMgaW5jb21wcmVoZW5zaWJsZQorICAgICAgICAgICAgICAgICAgcHJpbnQgIm9wdGlvbiIsIG9wdCAiOiBjdXJyZW50bHkiLCBvbm9mZiAiOiBhdHRlbXB0IHRvIHR1cm4iLCB2YWwKKyAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICB9IGVsc2UgaWYgKHZhbCA9PSAicmVxdWlyZXMiIHx8IHZhbCA9PSAiaWYiIHx8IHZhbCA9PSAiZW5hYmxlcyIgfHwgdmFsID09InNldHMiKSB7CisgICAgICAgICAgICBrZXkgPSB2YWwKKyAgICAgICAgIH0gZWxzZSBpZiAoa2V5ID09ICJyZXF1aXJlcyIpIHsKKyAgICAgICAgICAgIHJlcXVpcmVzW29wdF0gPSByZXF1aXJlc1tvcHRdICIgIiB2YWwKKyAgICAgICAgIH0gZWxzZSBpZiAoa2V5ID09ICJpZiIpIHsKKyAgICAgICAgICAgIGlmZnNbb3B0XSA9IGlmZnNbb3B0XSAiICIgdmFsCisgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PSAiZW5hYmxlcyIpIHsKKyAgICAgICAgICAgIGVuYWJsZWRieVt2YWxdID0gZW5hYmxlZGJ5W3ZhbF0gIiAiIG9wdAorICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT0gInNldHMiKSB7CisgICAgICAgICAgICBzZXRzW29wdF0gPSBzZXRzW29wdF0gIiAiIHZhbAorICAgICAgICAgICAga2V5ID0gInNldHZhbCIKKyAgICAgICAgICAgIHNldCA9IHZhbAorICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT0gInNldHZhbCIpIHsKKyAgICAgICAgICAgIHNldHZhbFtvcHQgIiAiIHNldF0gPSBzZXR2YWxbb3B0ICIgIiBzZXRdICIgIiB2YWwKKyAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgYnJlYWsgIyBiYWQgbGluZSBmb3JtYXQKKyAgICAgIH0KKworICAgICAgaXN0YXJ0ID0gMQorICAgfSB3aGlsZSAoaSA+IE5GICYmICQwIH4gLywkLykKKworICAgaWYgKGkgPiBORikgeworICAgICAgIyBTZXQgdGhlIG9wdGlvbiwgZGVmYXVsdGluZyB0byAnZW5hYmxlZCcKKyAgICAgIGlmIChvbm9mZiA9PSAiIikgb25vZmYgPSAiZW5hYmxlZCIKKyAgICAgIG9wdGlvbltvcHRdID0gb25vZmYKKyAgICAgIG5leHQKKyAgIH0KKyAgICMgRWxzZSBmYWxsIHRocm91Z2ggdG8gdGhlIGVycm9yIGhhbmRsZXIKK30KKworIyBjaHVuayBOQU1FIFtyZXF1aXJlcyBPUFRdIFtlbmFibGVzIExJU1RdIFtvbnxvZmZ8ZGlzYWJsZWRdCisjICAgRXhwYW5kcyB0byB0aGUgJ29wdGlvbicgc2V0dGluZ3MgYXBwcm9wcmlhdGUgdG8gdGhlIHJlYWRpbmcgYW5kCisjICAgd3JpdGluZyBvZiBhbiBhbmNpbGxpYXJ5IFBORyBjaHVuayAnTkFNRSc6CisjCisjICAgb3B0aW9uIFJFQURfTkFNRSByZXF1aXJlcyBSRUFEX0FOQ0lMTEFSWV9DSFVOS1MgW1JFQURfT1BUXQorIyAgIG9wdGlvbiBSRUFEX05BTUUgZW5hYmxlcyBOQU1FIExJU1QKKyMgICBbb3B0aW9uIFJFQURfTkFNRSBvZmZdCisjICAgb3B0aW9uIFdSSVRFX05BTUUgcmVxdWlyZXMgV1JJVEVfQU5DSUxMQVJZX0NIVU5LUyBbV1JJVEVfT1BUXQorIyAgIG9wdGlvbiBXUklURV9OQU1FIGVuYWJsZXMgTkFNRSBMSVNUCisjICAgW29wdGlvbiBXUklURV9OQU1FIG9mZl0KKworcHJlICE9IDAgJiYgJDEgPT0gImNodW5rIiAmJiBORiA+PSAyeworICAgIyAnY2h1bmsnIGlzIGhhbmRsZWQgb24gdGhlIGZpcnN0IHBhc3MgYnkgd3JpdGluZyBhcHByb3ByaWF0ZQorICAgIyAnb3B0aW9uJyBsaW5lcyBpbnRvIHRoZSBpbnRlcm1lZGlhdGUgZmlsZS4KKyAgIG9wdCA9ICQyCisgICBzdWIoLywkLywiIixvcHQpCisgICBvbm9mZiA9ICIiCisgICByZXFyZWFkID0gIiIKKyAgIHJlcXdyaXRlID0gIiIKKyAgIGVuYWJsZXMgPSAiIgorICAgcmVxID0gMAorICAgaXN0YXJ0ID0gMworICAgZG8geworICAgICAgaWYgKGlzdGFydCA9PSAxKSB7ICAgICAjIGNvbnRpbnVhdGlvbiBsaW5lCisgICAgICAgICB2YWwgPSBnZXRsaW5lCisKKyAgICAgICAgIGlmICh2YWwgIT0gMSkgeyAjIGVycm9yIHJlYWRpbmcgaXQKKyAgICAgICAgICAgIGlmICh2YWwgPT0gMCkKKyAgICAgICAgICAgICAgIHByaW50ICJjaHVuayIsIG9wdCAiOiBFUlJPUjogbWlzc2luZyBjb250aW51YXRpb24gbGluZSIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHByaW50ICJjaHVuayIsIG9wdCAiOiBFUlJPUjogZXJyb3IgcmVhZGluZyBjb250aW51YXRpb24gbGluZSIKKworICAgICAgICAgICAgIyBUaGlzIGlzIGEgaGFyZCBlcnJvcgorICAgICAgICAgICAgZXJyID0gMSAjIHByZXZlbnQgRU5Ee30gcnVubmluZworICAgICAgICAgICAgZXhpdCAxCisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgICMgcmVhZCB0aGUga2V5d29yZHMvYWRkaXRpb25hbCBPUFRTCisgICAgICBmb3IgKGk9aXN0YXJ0OyBpPD1ORjsgKytpKSB7CisgICAgICAgICB2YWwgPSAkKGkpCisgICAgICAgICBzdWIoLywkLywiIix2YWwpCisgICAgICAgICBpZiAodmFsID09ICJvbiIgfHwgdmFsID09ICJvZmYiIHx8IHZhbCA9PSAiZGlzYWJsZWQiKSB7CisgICAgICAgICAgICBpZiAob25vZmYgIT0gdmFsKSB7CisgICAgICAgICAgICAgICBpZiAob25vZmYgPT0gIiIpCisgICAgICAgICAgICAgICAgICBvbm9mZiA9IHZhbAorICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgYnJlYWsgIyBvbi9vZmYgY29uZmxpY3QKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcSA9IDAKKyAgICAgICAgIH0gZWxzZSBpZiAodmFsID09ICJyZXF1aXJlcyIpCisgICAgICAgICAgICByZXEgPSAxCisgICAgICAgICBlbHNlIGlmICh2YWwgPT0gImVuYWJsZXMiKQorICAgICAgICAgICAgcmVxID0gMgorICAgICAgICAgZWxzZSBpZiAocmVxID09IDEpeworICAgICAgICAgICAgcmVxcmVhZCA9IHJlcXJlYWQgIiBSRUFEXyIgdmFsCisgICAgICAgICAgICByZXF3cml0ZSA9IHJlcXdyaXRlICIgV1JJVEVfIiB2YWwKKyAgICAgICAgIH0gZWxzZSBpZiAocmVxID09IDIpCisgICAgICAgICAgICBlbmFibGVzID0gZW5hYmxlcyAiICIgdmFsCisgICAgICAgICBlbHNlCisgICAgICAgICAgICBicmVhayAjIGJhZCBsaW5lOiBoYW5kbGVkIGJlbG93CisgICAgICB9CisKKyAgICAgIGlzdGFydCA9IDEKKyAgIH0gd2hpbGUgKGkgPiBORiAmJiAkMCB+IC8sJC8pCisKKyAgIGlmIChpID4gTkYpIHsKKyAgICAgICMgT3V0cHV0IG5ldyAnb3B0aW9uJyBsaW5lcyB0byB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgKG91dCkKKyAgICAgIHByaW50ICJvcHRpb24gUkVBRF8iIG9wdCwgInJlcXVpcmVzIFJFQURfQU5DSUxMQVJZX0NIVU5LUyIgcmVxcmVhZCwgImVuYWJsZXMiLCBvcHQgZW5hYmxlcyAsIG9ub2ZmID5vdXQKKyAgICAgIHByaW50ICJvcHRpb24gV1JJVEVfIiBvcHQsICJyZXF1aXJlcyBXUklURV9BTkNJTExBUllfQ0hVTktTIiByZXF3cml0ZSwgImVuYWJsZXMiLCBvcHQgZW5hYmxlcywgb25vZmYgPm91dAorICAgICAgbmV4dAorICAgfQorICAgIyBFbHNlIGhpdCB0aGUgZXJyb3IgaGFuZGxlciBiZWxvdyAtIGJhZCBsaW5lIGZvcm1hdCEKK30KKworIyBzZXR0aW5nIE1BQ1JPICggcmVxdWlyZXMgTUFDUk8qICkqIFsgZGVmYXVsdCBWQUxVRSBdCisjICAgQmVoYXZlcyBpbiBhIHNpbWlsYXIgd2F5IHRvICdvcHRpb24nIHdpdGhvdXQgbG9va2luZyBmb3IgTk9fIG9yCisjICAgX1NVUFBPUlRFRDsgdGhlIG1hY3JvIGlzIGVuYWJsZWQgaWYgaXQgaXMgZGVmaW5lZCBzbyBsb25nIGFzIGFsbAorIyAgIHRoZSAncmVxdWlyZXMnIG1hY3JvcyBhcmUgYWxzbyBkZWZpbmVkLiAgVGhlIGRlZmluaXRpb25zIG1heSBiZQorIyAgIGVtcHR5LCBhbiBlcnJvciB3aWxsIGJlIGlzc3VlZCBpZiB0aGUgJ3JlcXVpcmVzJyBtYWNyb3MgYXJlCisjICAgKm5vdCogZGVmaW5lZC4gIElmIGdpdmVuIHRoZSAnZGVmYXVsdCcgdmFsdWUgaXMgdXNlZCBpZiB0aGUKKyMgICBtYWNybyBpcyBub3QgZGVmaW5lZC4gIFRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgcmUtdG9rZW5pc2VkLgorIyAgIChCVFc6IHRoaXMgaXMgc29tZXdoYXQgcmVzdHJpY3RpdmUsIGl0IG1haW5seSBleGlzdHMgZm9yIHRoZQorIyAgIHN1cHBvcnQgb2Ygbm9uLXN0YW5kYXJkIGNvbmZpZ3VyYXRpb25zIGFuZCBudW1lcmljIHBhcmFtZXRlcnMsCisjICAgc2VlIHRoZSB1c2VzIGluIHNjcmlwdHMvb3B0aW9ucy5kYXQKKworJDEgPT0gInNldHRpbmciICYmIChORiA9PSAyIHx8IE5GID49IDMgJiYgKCQzID09ICJyZXF1aXJlcyIgfHwgJDMgPT0gImRlZmF1bHQiKSl7CisgICByZXFzID0gIiIKKyAgIGRlZmx0ID0gIiIKKyAgIGlzZGVmID0gMAorICAga2V5ID0gIiIKKyAgIGZvciAoaT0zOyBpPD1ORjsgKytpKQorICAgICAgaWYgKCQoaSkgPT0gInJlcXVpcmVzIiB8fCAkKGkpID09ICJkZWZhdWx0IikgeworICAgICAgICAga2V5ID0gJChpKQorICAgICAgICAgaWYgKGtleSA9PSAiZGVmYXVsdCIpIGlzZGVmID0gMQorICAgICAgfSBlbHNlIGlmIChrZXkgPT0gInJlcXVpcmVzIikKKyAgICAgICAgIHJlcXMgPSByZXFzICIgIiAkKGkpCisgICAgICBlbHNlIGlmIChrZXkgPT0gImRlZmF1bHQiKQorICAgICAgICAgZGVmbHQgPSBkZWZsdCAiICIgJChpKQorICAgICAgZWxzZQorICAgICAgICAgYnJlYWsgIyBGb3JtYXQgZXJyb3IsIGhhbmRsZWQgYmVsb3cKKworICAgc2V0dGluZ1skMl0gPSByZXFzCisgICAjIE5PVEU6IHRoaXMgb3ZlcndyaXRlcyBhIHByZXZpb3VzIHZhbHVlIHNpbGVudGx5CisgICBpZiAoaXNkZWYgJiYgZGVmbHQgPT0gIiIpCisgICAgICBkZWZsdCA9ICIgIiAjIGFzIGEgZmxhZyB0byBmb3JjZSBvdXRwdXQKKyAgIGRlZmF1bHRzWyQyXSA9IGRlZmx0CisgICBuZXh0Cit9CisKKyMgVGhlIG9yZGVyIG9mIHRoZSBkZXBlbmRlbmN5IGxpbmVzIChvcHRpb24sIGNodW5rLCBzZXR0aW5nKSBpcyBpcnJlbGV2YW50CisjIC0gdGhlICdlbmFibGVzJywgJ3JlcXVpcmVzJyBhbmQgJ2lmJyBzZXR0aW5ncyB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lCisjIHRoZSBjb3JyZWN0IG9yZGVyIGluIHRoZSBvdXRwdXQgYW5kIHRoZSBmaW5hbCB2YWx1ZXMgaW4gcG5nbGliY29uZi5oIGFyZQorIyBub3Qgb3JkZXIgZGVwZW5kZW50LiAgJ3JlcXVpcmVzJyBhbmQgJ2lmJyBlbnRyaWVzIHRha2UgcHJlY2VkZW5jZSBvdmVyCisjICdlbmFibGVzJyBmcm9tIG90aGVyIG9wdGlvbnM7IGlmIGFuIG9wdGlvbiByZXF1aXJlcyBhbm90aGVyIG9wdGlvbiBpdAorIyB3b24ndCBiZSBzZXQgcmVnYXJkbGVzcyBvZiBhbnkgb3B0aW9ucyB0aGF0IGVuYWJsZSBpdCB1bmxlc3MgdGhlIG90aGVyCisjIG9wdGlvbiBpcyBhbHNvIGVuYWJsZWQuCisjCisjIFNpbWlsYXJseSAnZW5hYmxlcycgdHJ1bXBzIGEgTk9fIGRlZmluaXRpb24gaW4gQ0ZMQUdTIG9yIHBuZ3Vzci5oCisjCisjIEZvciBzaW1wbGljaXR5IGN5Y2xlcyBpbiB0aGUgZGVmaW5pdGlvbnMgYXJlIHJlZ2FyZGVkIGFzIGVycm9ycywKKyMgZXZlbiBpZiB0aGV5IGFyZSBub3QgYW1iaWd1b3VzLgorIyBBIGdpdmVuIE5BTUUgY2FuIGJlIHNwZWNpZmllZCBpbiBhcyBtYW55ICdvcHRpb24nIGxpbmVzIGFzIHJlcXVpcmVkLCB0aGUKKyMgZGVmaW5pdGlvbnMgYXJlIGFkZGl0aXZlLgorCisjIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBlcXVpdmFsZW50IG1hY3JvcyBtYXkgYmUgbGlzdGVkIHRodXM6CisjCisjID0gW05PX11OQU1FIE1BQ1JPCisjICAgTWFrZXMgLURNQUNSTyBlcXVpdmFsZW50IHRvIC1EUE5HX05PX05BTUUgb3IgLURQTkdfTkFNRV9TVVBQT1JURUQKKyMgICBhcyBhcHByb3ByaWF0ZS4KKyMKKyMgVGhlIGRlZmluaXRpb24gaXMgaW5qZWN0ZWQgaW50byB0aGUgQyBjb21waWxlciBpbnB1dCB3aGVuIGVuY291bnRlcmVkCisjIGluIHRoZSBzZWNvbmQgcGFzcyAoc28gYWxsIHRoZXNlIGRlZmluaXRpb25zIGFwcGVhciAqYWZ0ZXIqIHRoZSBACisjIGxpbmVzISkKKyMKKyMgJ05BTUUnIGlzIGFzIGFib3ZlLCBidXQgJ01BQ1JPJyBpcyB0aGUgZnVsbCB0ZXh0IG9mIHRoZSBlcXVpdmFsZW50CisjIG9sZCwgZGVwcmVjYXRlZCwgbWFjcm8uCisKKyQxID09ICI9IiAmJiBORiA9PSAzeworICAgcHJpbnQgIiNpZmRlZiBQTkdfIiAkMyA+b3V0CisgICBpZiAoJDIgfiAvXk5PXy8pCisgICAgICBwcmludCAiIyAgIGRlZmluZSBQTkdfIiAkMiA+b3V0CisgICBlbHNlCisgICAgICBwcmludCAiIyAgIGRlZmluZSBQTkdfIiAkMiAiX1NVUFBPUlRFRCIgPm91dAorICAgcHJpbnQgIiNlbmRpZiIgPm91dAorICAgbmV4dAorfQorCisjIExpbmVzIG1heSBiZSBpbmplY3RlZCBpbnRvIHRoZSBDIGNvbXBpbGVyIGlucHV0IGJ5IHByZWNlZGluZyB0aGVtCisjIHdpdGggYW4gIkAiIGNoYXJhY3Rlci4gIFRoZSBsaW5lIGlzIGNvcGllZCB3aXRoIGp1c3QgdGhlIGxlYWRpbmcKKyMgQCByZW1vdmVkLgorCiskMSB+IC9eQC97CisgICAjIHN1YigvXlsgCV0qQC8sICIiKQorICAgJDEgPSBzdWJzdHIoJDEsIDIpCisgICBwcmludCA+b3V0CisgICBuZXh0Cit9CisKKyMgQ2hlY2sgZm9yIHVucmVjb2duaXplZCBsaW5lcywgYmVjYXVzZSBvZiB0aGUgcHJlcHJvY2Vzc2luZyBjaHVuaworIyBmb3JtYXQgZXJyb3JzIHdpbGwgYmUgZGV0ZWN0ZWQgb24gdGhlIGZpcnN0IHBhc3MgaW5kZXBlbmRlbnQgb2YKKyMgYW55IG90aGVyIGZvcm1hdCBlcnJvcnMuCit7CisgICBwcmludCAib3B0aW9ucy5hd2s6IGJhZCBsaW5lICgiIE5SICIpOiIsICQwCisgICBlcnIgPSAxICMgcHJldmVudCBFTkR7fSBydW5uaW5nCisgICBleGl0IDEKK30KKworIyBGb3IgY2hlY2tpbmcgcHVycG9zZXMgbmFtZXMgdGhhdCBzdGFydCB3aXRoICJva18iIG9yICJmYWlsXyIgYXJlCisjIG5vdCBvdXRwdXQgdG8gcG5nbGliY29uZi5oIGFuZCBtdXN0IGJlIGVpdGhlciBlbmFibGVkIG9yIGRpc2FibGVkCisjIHJlc3BlY3RpdmVseSBmb3IgdGhlIGJ1aWxkIHRvIHN1Y2NlZWQuICBUaGlzIGFsbG93cyBpbnRlcmRlcGVuZGVuY2llcworIyBiZXR3ZWVuIG9wdGlvbnMgb2YgdGhlIGZvcm0gImF0IGxlYXN0IG9uZSBvZiIgb3IgImF0IG1vc3Qgb25lIG9mIgorIyB0byBiZSBjaGVja2VkLiAgRm9yIGV4YW1wbGU6CisjCisjIG9wdGlvbiBGTE9BVElOR19QT0lOVCBlbmFibGVzIG9rX21hdGgKKyMgb3B0aW9uIEZJWEVEX1BPSU5UIGVuYWJsZXMgb2tfbWF0aAorIyAgIFRoaXMgZW5zdXJlcyB0aGF0IGF0IGxlYXN0IG9uZSBvZiBGTE9BVElOR19QT0lOVCBhbmQgRklYRURfUE9JTlQKKyMgICBtdXN0IGJlIHNldCBmb3IgdGhlIGJ1aWxkIHRvIHN1Y2NlZWQuCisjCisjIG9wdGlvbiBmYWlsX21hdGggcmVxdWlyZXMgRkxPQVRJTkdfUE9JTlQgRklYRURfUE9JTlQKKyMgICBUaGlzIG1lYW5zIHRoZSBidWlsZCB3aWxsIGZhaWwgaWYgKmJvdGgqIEZMT0FUSU5HX1BPSU5UIGFuZAorIyAgIEZJWEVEX1BPSU5UIGFyZSBzZXQgKHRoaXMgaXMgYW4gZXhhbXBsZTsgaW4gZmFjdCBib3RoIGFyZSBhbGxvd2VkLikKKyMKKyMgSWYgYWxsIHRoZXNlIG9wdGlvbnMgd2VyZSBnaXZlbiB0aGUgYnVpbGQgd291bGQgcmVxdWlyZSBleGFjdGx5IG9uZQorIyBvZiB0aGUgbmFtZXMgdG8gYmUgZW5hYmxlZC4KKworRU5EeworICAgIyBFTkR7fSBnZXRzIHJ1biBvbiBhbiBleGl0IChhIHRyYWRpdGlvbmFsIGF3ayBmZWF0dXJlKQorICAgaWYgKGVycikgZXhpdCAxCisKKyAgIGlmIChwcmUpIHsKKyAgICAgICMgUmVjb3JkIHRoZSBmaW5hbCB2YWx1ZSBvZiB0aGUgdmFyaWFibGVzCisgICAgICBwcmludCAiZGViID0iLCBkZWIgPm91dAorICAgICAgaWYgKGV2ZXJ5dGhpbmcgIT0gIiIpIHsKKyAgICAgICAgIHByaW50ICJldmVyeXRoaW5nID0iLCBldmVyeXRoaW5nID5vdXQKKyAgICAgIH0KKyAgICAgIHByaW50ICJsb2d1bnN1cHBvcnRlZCA9IiwgbG9ndW5zdXBwb3J0ZWQgPm91dAorICAgICAgZXhpdCAwCisgICB9CisKKyAgICMgRG8gdGhlIG9wdGlvbnMgZmlyc3QgKGFsbG93aW5nIG9wdGlvbnMgdG8gc2V0IHNldHRpbmdzKS4gIFRoZSBkZXBlbmRlbmN5CisgICAjIHRyZWUgaXMgdGh1czoKKyAgICMKKyAgICMgICBuYW1lICAgICA+ICAgICBuYW1lCisgICAjICAgbmFtZSByZXF1aXJlcyAgbmFtZQorICAgIyAgIG5hbWUgaWYgICAgICAgIG5hbWUKKyAgICMgICBuYW1lIGVuYWJsZWRieSBuYW1lCisgICAjCisgICAjIEZpcnN0IGJ1aWxkIGEgbGlzdCAndHJlZScgYnkgb3B0aW9uIG9mIGFsbCB0aGUgdGhpbmdzIG9uIHdoaWNoCisgICAjIGl0IGRlcGVuZHMuCisgICBwcmludCAiIiA+b3V0CisgICBwcmludCAiLyogT1BUSU9OUyAqLyIgPm91dAorICAgcHJpbnQgY29tbWVudCwgIm9wdGlvbnMiLCBjZW5kID5vdXQKKyAgIGZvciAob3B0IGluIGVuYWJsZWRieSkgdHJlZVtvcHRdID0gMSAgIyBtYXkgbm90IGJlIGV4cGxpY2l0IG9wdGlvbnMKKyAgIGZvciAob3B0IGluIG9wdGlvbikgaWYgKG9wdCAhPSAiIikgeworICAgICAgbyA9IG9wdGlvbltvcHRdCisgICAgICAjIG9wdGlvbiBzaG91bGQgYWx3YXlzIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcworICAgICAgaWYgKG8gIT0gIm9uIiAmJiBvICE9ICJvZmYiICYmIG8gIT0gImRpc2FibGVkIiAmJiBvICE9ICJlbmFibGVkIikgeworICAgICAgICAgcHJpbnQgImludGVybmFsIG9wdGlvbiBlcnJvciAoIiBvICIpIgorICAgICAgICAgZXhpdCAxCisgICAgICB9CisgICAgICB0cmVlW29wdF0gPSAiIiAgICMgc28gdW5saXN0ZWQgb3B0aW9ucyBtYXJrZWQKKyAgIH0KKyAgIGZvciAob3B0IGluIHRyZWUpIGlmIChvcHQgIT0gIiIpIHsKKyAgICAgIGlmICh0cmVlW29wdF0gPT0gMSkgeworICAgICAgICAgdHJlZVtvcHRdID0gIiIKKyAgICAgICAgIGlmIChvcHRpb25bb3B0XSAhPSAiIikgeworICAgICAgICAgICAgcHJpbnQgImludGVybmFsIGVycm9yICgxKSIKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICAgfQorICAgICAgICAgIyBNYWNyb3Mgb25seSBsaXN0ZWQgaW4gJ2VuYWJsZXMnIHJlbWFpbiBvZmYgdW5sZXNzCisgICAgICAgICAjIG9uZSBvZiB0aGUgZW5hYmxpbmcgbWFjcm9zIGlzIG9uLgorICAgICAgICAgb3B0aW9uW29wdF0gPSAiZGlzYWJsZWQiCisgICAgICB9CisKKyAgICAgIHNwbGl0KCIiLCBsaXN0KSAjIGNsZWFyICdsaXN0JworICAgICAgIyBOb3cgYWRkIGV2ZXJ5IHJlcXVpcmVzLCBpZmZzIG9yIGVuYWJsZWRieSBlbnRyeSB0byAnbGlzdCcKKyAgICAgICMgc28gdGhhdCB3ZSBjYW4gYWRkIGEgdW5pcXVlIGxpc3Qgb2YgcmVxdWlyZW1lbnRzIHRvIHRyZWVbaV0KKyAgICAgIHNwbGl0KHJlcXVpcmVzW29wdF0gaWZmc1tvcHRdIGVuYWJsZWRieVtvcHRdLCByKQorICAgICAgZm9yIChpIGluIHIpIGxpc3RbcltpXV0gPSAxCisgICAgICBmb3IgKGkgaW4gbGlzdCkgdHJlZVtvcHRdID0gdHJlZVtvcHRdICIgIiBpCisgICB9CisKKyAgICMgcHJpbnQgdGhlIHRyZWUgZm9yIGV4dHJlbWUgZGVidWdnaW5nCisgICBpZiAoZGViID4gMikgZm9yIChpIGluIHRyZWUpIGlmIChpICE9ICIiKSBwcmludCBpLCAiZGVwZW5kcy1vbiIgdHJlZVtpXQorCisgICAjIE9rLCBub3cgY2hlY2sgYWxsIG9wdGlvbnMgbWFya2VkIGV4cGxpY2l0bHkgJ29uJyBvciAnb2ZmJzoKKyAgICMKKyAgICMgSWYgYW4gb3B0aW9uW29wdF0gaXMgJ29uJyB0aGVuIHR1cm4gb24gYWxsIHJlcXVpcmVzW29wdF0KKyAgICMgSWYgYW4gb3B0aW9uW29wdF0gaXMgJ29mZicgdGhlbiB0dXJuIG9mZiBhbGwgZW5hYmxlZGJ5W29wdF0KKyAgICMKKyAgICMgRXJyb3Igb3V0IGlmIHdlIGhhdmUgdG8gdHVybiAnb24nIHRvIGFuICdvZmYnIG9wdGlvbiBvciB2aWNlIHZlcnNhLgorICAgbnBlbmRpbmcgPSAwCisgICBmb3IgKG9wdCBpbiBvcHRpb24pIGlmIChvcHQgIT0gIiIpIHsKKyAgICAgIGlmIChvcHRpb25bb3B0XSA9PSAib24iIHx8IG9wdGlvbltvcHRdID09ICJvZmYiKSB7CisgICAgICAgICBwZW5kaW5nWysrbnBlbmRpbmddID0gb3B0CisgICAgICB9CisgICB9CisKKyAgIGVyciA9IDAgIyBzZXQgb24gZXJyb3IKKyAgIHdoaWxlIChucGVuZGluZyA+IDApIHsKKyAgICAgIG9wdCA9IHBlbmRpbmdbbnBlbmRpbmctLV0KKyAgICAgIGlmIChvcHRpb25bb3B0XSA9PSAib24iKSB7CisgICAgICAgICBucmVxcyA9IHNwbGl0KHJlcXVpcmVzW29wdF0sIHIpCisgICAgICAgICBmb3IgKGo9MTsgajw9bnJlcXM7ICsraikgeworICAgICAgICAgICAgaWYgKG9wdGlvbltyW2pdXSA9PSAib2ZmIikgeworICAgICAgICAgICAgICAgcHJpbnQgIm9wdGlvbiIsIG9wdCwgInR1cm5lZCBvbiwgYnV0IHJlcXVpcmVtZW50IiwgcltqXSwgImlzIHR1cm5lZCBvZmYiCisgICAgICAgICAgICAgICBlcnIgPSAxCisgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbltyW2pdXSAhPSAib24iKSB7CisgICAgICAgICAgICAgICBvcHRpb25bcltqXV0gPSAib24iCisgICAgICAgICAgICAgICBwZW5kaW5nWysrbnBlbmRpbmddID0gcltqXQorICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgIGlmIChvcHRpb25bb3B0XSAhPSAib2ZmIikgeworICAgICAgICAgICAgcHJpbnQgImludGVybmFsIGVycm9yICgyKSIKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICAgfQorICAgICAgICAgbnJlcXMgPSBzcGxpdChlbmFibGVkYnlbb3B0XSwgcikKKyAgICAgICAgIGZvciAoaj0xOyBqPD1ucmVxczsgKytqKSB7CisgICAgICAgICAgICBpZiAob3B0aW9uW3Jbal1dID09ICJvbiIpIHsKKyAgICAgICAgICAgICAgIHByaW50ICJvcHRpb24iLCBvcHQsICJ0dXJuZWQgb2ZmLCBidXQgZW5hYmxlZCBieSIsIHJbal0sICJ3aGljaCBpcyB0dXJuZWQgb24iCisgICAgICAgICAgICAgICBlcnIgPSAxCisgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbltyW2pdXSAhPSAib2ZmIikgeworICAgICAgICAgICAgICAgb3B0aW9uW3Jbal1dID0gIm9mZiIKKyAgICAgICAgICAgICAgIHBlbmRpbmdbKytucGVuZGluZ10gPSByW2pdCisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICB9CisgICBpZiAoZXJyKSBleGl0IDEKKworICAgIyBTb3J0IG9wdGlvbnM6CisgICBwcmludCAiUE5HX0RGTl9TVEFSVF9TT1JUIDIiID5vdXQKKworICAgIyBvcHRpb25baV0gaXMgbm93IHRoZSBjb21wbGV0ZSBsaXN0IG9mIGFsbCB0aGUgdG9rZW5zIHdlIG1heQorICAgIyBuZWVkIHRvIG91dHB1dCwgZ28gdGhyb3VnaCBpdCBhcyBhYm92ZSwgZGVwdGggZmlyc3QuCisgICBmaW5pc2hlZCA9IDAKKyAgIHdoaWxlICghZmluaXNoZWQpIHsKKyAgICAgIGZpbmlzaGVkID0gMQorICAgICAgbW92ZW1lbnQgPSAwICMgZG9uZSBub3RoaW5nCisgICAgICBmb3IgKGkgaW4gb3B0aW9uKSBpZiAoIWRvbmVbaV0pIHsKKyAgICAgICAgIG5yZXFzID0gc3BsaXQodHJlZVtpXSwgcikKKyAgICAgICAgIGlmIChucmVxcyA+IDApIHsKKyAgICAgICAgICAgIGZvciAoaj0xOyBqPD1ucmVxczsgKytqKSBpZiAoIWRvbmVbcltqXV0pIHsKKyAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoajw9bnJlcXMpIHsKKyAgICAgICAgICAgICAgIGZpbmlzaGVkID0gMAorICAgICAgICAgICAgICAgY29udGludWUgICMgbmV4dCBvcHRpb24KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICAgIyBBbGwgdGhlIHJlcXVpcmVtZW50cyBoYXZlIGJlZW4gcHJvY2Vzc2VkLCBvdXRwdXQKKyAgICAgICAgICMgdGhpcyBvcHRpb24uICBBbiBvcHRpb24gaXMgX1NVUFBPUlRFRCBpZjoKKyAgICAgICAgICMKKyAgICAgICAgICMgYWxsICdyZXF1aXJlcycgYXJlIF9TVVBQT1JURUQgQU5ECisgICAgICAgICAjIGF0IGxlYXN0IG9uZSBvZiB0aGUgJ2lmJyBvcHRpb25zIGFyZSBfU1VQUE9SVEVEIEFORAorICAgICAgICAgIyBFSVRIRVI6CisgICAgICAgICAjICAgVGhlIG5hbWUgaXMgX1NVUFBPUlRFRCAob24gdGhlIGNvbW1hbmQgbGluZSkKKyAgICAgICAgICMgT1I6CisgICAgICAgICAjICAgYW4gJ2VuYWJsZWRieScgaXMgX1NVUFBPUlRFRAorICAgICAgICAgIyBPUjoKKyAgICAgICAgICMgICBOT19uYW1lIGlzIG5vdCBkZWZpbmVkIEFORAorICAgICAgICAgIyAgIHRoZSBvcHRpb24gaXMgbm90IGRpc2FibGVkOyBhbiBvcHRpb24gaXMgZGlzYWJsZWQgaWY6CisgICAgICAgICAjICAgIG9wdGlvbiA9PSBvZmYKKyAgICAgICAgICMgICAgb3B0aW9uID09IGRpc2FibGVkICYmIGV2ZXJ5dGhpbmcgIT0gb24KKyAgICAgICAgICMgICAgb3B0aW9uID09ICIiICYmIGV2ZXJ5dGhpbmcgPT0gb2ZmCisgICAgICAgICBpZiAoZGViKSBwcmludCAib3B0aW9uIiwgaQorICAgICAgICAgcHJpbnQgIiIgPm91dAorICAgICAgICAgcHJpbnQgIi8qIG9wdGlvbjoiLCBpLCBvcHRpb25baV0gPm91dAorICAgICAgICAgcHJpbnQgIiAqICAgcmVxdWlyZXM6ICAiIHJlcXVpcmVzW2ldID5vdXQKKyAgICAgICAgIHByaW50ICIgKiAgIGlmOiAgICAgICAgIiBpZmZzW2ldID5vdXQKKyAgICAgICAgIHByaW50ICIgKiAgIGVuYWJsZWQtYnk6IiBlbmFibGVkYnlbaV0gPm91dAorICAgICAgICAgcHJpbnQgIiAqICAgc2V0czogICAgICAiIHNldHNbaV0sICIqLyIgPm91dAorICAgICAgICAgcHJpbnQgIiN1bmRlZiBQTkdfb24iID5vdXQKKyAgICAgICAgIHByaW50ICIjZGVmaW5lIFBOR19vbiAxIiA+b3V0CisKKyAgICAgICAgICMgcmVxdWlyZXMKKyAgICAgICAgIG5yZXFzID0gc3BsaXQocmVxdWlyZXNbaV0sIHIpCisgICAgICAgICBmb3IgKGo9MTsgajw9bnJlcXM7ICsraikgeworICAgICAgICAgICAgcHJpbnQgIiNpZm5kZWYgUE5HXyIgcltqXSAiX1NVUFBPUlRFRCIgPm91dAorICAgICAgICAgICAgcHJpbnQgIiMgICB1bmRlZiBQTkdfb24gLyohIiByW2pdICIqLyIgPm91dAorICAgICAgICAgICAgIyBUaGlzIGVycm9yIGFwcGVhcnMgaW4gdGhlIGZpbmFsIG91dHB1dCBpZiBzb21ldGhpbmcKKyAgICAgICAgICAgICMgd2FzIHN3aXRjaGVkICdvbicgYnV0IHRoZSBwcm9jZXNzaW5nIGFib3ZlIHRvIGZvcmNlCisgICAgICAgICAgICAjIHRoZSByZXF1aXJlcyBkaWQgbm90IHdvcmsKKyAgICAgICAgICAgIGlmIChvcHRpb25baV0gPT0gIm9uIikgeworICAgICAgICAgICAgICAgcHJpbnQgZXJyb3IsIGksICJyZXF1aXJlcyIsIHJbal0gZW5kID5vdXQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ICIjZW5kaWYiID5vdXQKKyAgICAgICAgIH0KKworICAgICAgICAgIyBpZgorICAgICAgICAgaGF2ZV9pZnMgPSAwCisgICAgICAgICBucmVxcyA9IHNwbGl0KGlmZnNbaV0sIHIpCisgICAgICAgICBwcmludCAiI3VuZGVmIFBOR19ub19pZiIgPm91dAorICAgICAgICAgaWYgKG5yZXFzID4gMCkgeworICAgICAgICAgICAgaGF2ZV9pZnMgPSAxCisgICAgICAgICAgICBwcmludCAiLyogaWYiIGlmZnNbaV0sICIqLyIgPm91dAorICAgICAgICAgICAgcHJpbnQgIiNkZWZpbmUgUE5HX25vX2lmIDEiID5vdXQKKyAgICAgICAgICAgIGZvciAoaj0xOyBqPD1ucmVxczsgKytqKSB7CisgICAgICAgICAgICAgICBwcmludCAiI2lmZGVmIFBOR18iIHJbal0gIl9TVVBQT1JURUQiID5vdXQKKyAgICAgICAgICAgICAgIHByaW50ICIjICAgdW5kZWYgUE5HX25vX2lmIC8qIiByW2pdICIqLyIgPm91dAorICAgICAgICAgICAgICAgcHJpbnQgIiNlbmRpZiIgPm91dAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnQgIiNpZmRlZiBQTkdfbm9faWYgLyptaXNzaW5nIGlmKi8iID5vdXQKKyAgICAgICAgICAgIHByaW50ICIjICAgdW5kZWYgUE5HX29uIiA+b3V0CisgICAgICAgICAgICAjIFRoZXJlIGlzIG5vIGNoZWNraW5nIGFib3ZlIGZvciB0aGlzLCBiZWNhdXNlIHdlCisgICAgICAgICAgICAjIGRvbid0IGtub3cgd2hpY2ggJ2lmJyB0byBjaG9vc2UsIHNvIHdoaW5lIGFib3V0CisgICAgICAgICAgICAjIGl0IGhlcmU6CisgICAgICAgICAgICBpZiAob3B0aW9uW2ldID09ICJvbiIpIHsKKyAgICAgICAgICAgICAgIHByaW50IGVycm9yLCBpLCAibmVlZHMgb25lIG9mOiIsIGlmZnNbaV0gZW5kID5vdXQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ICIjZW5kaWYiID5vdXQKKyAgICAgICAgIH0KKworICAgICAgICAgcHJpbnQgIiNpZmRlZiBQTkdfb24gLypyZXF1aXJlcywgaWYqLyIgPm91dAorICAgICAgICAgIyBlbmFibGVzCisgICAgICAgICBwcmludCAiIyAgIHVuZGVmIFBOR19ub3RfZW5hYmxlZCIgPm91dAorICAgICAgICAgcHJpbnQgIiMgICBkZWZpbmUgUE5HX25vdF9lbmFibGVkIDEiID5vdXQKKyAgICAgICAgIHByaW50ICIgICAvKiBlbmFibGVkIGJ5IiBlbmFibGVkYnlbaV0sICIqLyIgPm91dAorICAgICAgICAgbnJlcXMgPSBzcGxpdChlbmFibGVkYnlbaV0sIHIpCisgICAgICAgICBmb3IgKGo9MTsgajw9bnJlcXM7ICsraikgeworICAgICAgICAgICAgcHJpbnQgIiNpZmRlZiBQTkdfIiByW2pdICJfU1VQUE9SVEVEIiA+b3V0CisgICAgICAgICAgICBwcmludCAiIyAgIHVuZGVmIFBOR19ub3RfZW5hYmxlZCAvKiIgcltqXSAiKi8iID5vdXQKKyAgICAgICAgICAgICMgT29wcywgcHJvYmFibHkgbm90IGludGVuZGVkIChzaG91bGQgYmUgZmFjdG9yZWQKKyAgICAgICAgICAgICMgb3V0IGJ5IHRoZSBjaGVja3MgYWJvdmUpLgorICAgICAgICAgICAgaWYgKG9wdGlvbltpXSA9PSAib2ZmIikgeworICAgICAgICAgICAgICAgcHJpbnQgZXJyb3IsIGksICJlbmFibGVkIGJ5OiIsIHJbal0gZW5kID5vdXQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ICIjZW5kaWYiID5vdXQKKyAgICAgICAgIH0KKworICAgICAgICAgcHJpbnQgIiMgICBpZm5kZWYgUE5HXyIgaSAiX1NVUFBPUlRFRCAvKiFjb21tYW5kIGxpbmUqLyIgPm91dAorICAgICAgICAgcHJpbnQgIiMgICAgaWZkZWYgUE5HX25vdF9lbmFibGVkIC8qIWVuYWJsZWQqLyIgPm91dAorICAgICAgICAgIyAnaGF2ZV9pZnMnIGhlcmUgbWVhbnMgdGhhdCBldmVyeXRoaW5nID0gIm9mZiIgc3RpbGwgYWxsb3dzIGFuICdpZicgb24KKyAgICAgICAgICMgYW4gb3RoZXJ3aXNlIGVuYWJsZWQgb3B0aW9uIHRvIHR1cm4gaXQgb247IG90aGVyd2lzZSB0aGUgJ2lmJworICAgICAgICAgIyBoYW5kbGluZyBpcyBlZmZlY3RpdmVseSBkaXNhYmxlZCBieSAnZXZlcnl0aGluZyA9IG9mZicKKyAgICAgICAgIGlmIChvcHRpb25baV0gPT0gIm9mZiIgfHwgb3B0aW9uW2ldID09ICJkaXNhYmxlZCIgJiYgZXZlcnl0aGluZyAhPSAib24iIHx8IG9wdGlvbltpXSA9PSAiZW5hYmxlZCIgJiYgZXZlcnl0aGluZyA9PSAib2ZmIiAmJiAhaGF2ZV9pZnMpIHsKKyAgICAgICAgICAgIHByaW50ICIjICAgICAgdW5kZWYgUE5HX29uIC8qZGVmYXVsdCBvZmYqLyIgPm91dAorICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ICIjICAgICAgaWZkZWYgUE5HX05PXyIgaSA+b3V0CisgICAgICAgICAgICBwcmludCAiIyAgICAgICB1bmRlZiBQTkdfb24gLyp0dXJuZWQgb2ZmKi8iID5vdXQKKyAgICAgICAgICAgIHByaW50ICIjICAgICAgZW5kaWYiID5vdXQKKyAgICAgICAgICAgIHByaW50ICIjICAgICAgaWZkZWYgUE5HX05PXyIgaSAiX1NVUFBPUlRFRCIgPm91dAorICAgICAgICAgICAgcHJpbnQgIiMgICAgICAgdW5kZWYgUE5HX29uIC8qdHVybmVkIG9mZiovIiA+b3V0CisgICAgICAgICAgICBwcmludCAiIyAgICAgIGVuZGlmIiA+b3V0CisgICAgICAgICB9CisgICAgICAgICBwcmludCAiIyAgICBlbmRpZiAvKiFlbmFibGVkKi8iID5vdXQKKyAgICAgICAgIHByaW50ICIjICAgIGlmZGVmIFBOR19vbiIgPm91dAorICAgICAgICAgIyBUaGUgX1NVUFBPUlRFRCBtYWNybyBtdXN0IGJlIGRlZmluZWQgc28gdGhhdCBkZXBlbmRlbnQKKyAgICAgICAgICMgb3B0aW9ucyBvdXRwdXQgbGF0ZXIgd29yay4KKyAgICAgICAgIHByaW50ICIjICAgICAgZGVmaW5lIFBOR18iIGkgIl9TVVBQT1JURUQiID5vdXQKKyAgICAgICAgIHByaW50ICIjICAgIGVuZGlmIiA+b3V0CisgICAgICAgICBwcmludCAiIyAgIGVuZGlmIC8qIWNvbW1hbmQgbGluZSovIiA+b3V0CisgICAgICAgICAjIElmIFBOR19vbiBpcyBzdGlsbCBzZXQgdGhlIG9wdGlvbiBzaG91bGQgYmUgZGVmaW5lZCBpbgorICAgICAgICAgIyBwbmdsaWJjb25mLmgKKyAgICAgICAgIHByaW50ICIjICAgaWZkZWYgUE5HX29uIiA+b3V0CisgICAgICAgICBpZiAoaSB+IC9eZmFpbF8vKSB7CisgICAgICAgICAgICBwcmludCBlcnJvciwgaSwgImlzIG9uOiBlbmFibGVkIGJ5OiIgaWZmc1tpXSBlbmFibGVkYnlbaV0gIiwgcmVxdWlyZXMiIHJlcXVpcmVzW2ldIGVuZCA+b3V0CisgICAgICAgICB9IGVsc2UgaWYgKGkgIX4gL15va18vKSB7CisgICAgICAgICAgICBwcmludCBkZWYgaSBzdXAgPm91dAorICAgICAgICAgICAgIyBTdXBwb3J0ZWQgb3B0aW9uLCBzZXQgcmVxdWlyZWQgc2V0dGluZ3MKKyAgICAgICAgICAgIG5yZXFzID0gc3BsaXQoc2V0c1tpXSwgcikKKyAgICAgICAgICAgIGZvciAoaj0xOyBqPD1ucmVxczsgKytqKSB7CisgICAgICAgICAgICAgICBwcmludCAiIyAgICBpZmRlZiBQTkdfc2V0XyIgcltqXSA+b3V0CisgICAgICAgICAgICAgICAjIFNvbWUgb3RoZXIgb3B0aW9uIGhhcyBhbHJlYWR5IHNldCBhIHZhbHVlOgorICAgICAgICAgICAgICAgcHJpbnQgZXJyb3IsIGksICJzZXRzIiwgcltqXSAiOiBkdXBsaWNhdGUgc2V0dGluZyIgZW5kID5vdXQKKyAgICAgICAgICAgICAgIHByaW50IGVycm9yLCAiICAgcHJldmlvdXMgdmFsdWU6ICIgZW5kICJQTkdfc2V0XyIgcltqXSA+b3V0CisgICAgICAgICAgICAgICBwcmludCAiIyAgICBlbHNlIiA+b3V0CisgICAgICAgICAgICAgICAjIEVsc2Ugc2V0IHRoZSBkZWZhdWx0OiBub3RlIHRoYXQgdGhpcyB3b24ndCBhY2NlcHQgYXJiaXRyYXJ5CisgICAgICAgICAgICAgICAjIHZhbHVlcywgdGhlIHNldHZhbCBzdHJpbmcgbXVzdCBiZSBhY2NlcHRhYmxlIHRvIGFsbCB0aGUgQworICAgICAgICAgICAgICAgIyBjb21waWxlcnMgd2UgdXNlLiAgVGhhdCBtZWFucyBpdCBtdXN0IGJlIFZFUlkgc2ltcGxlOyBhIG51bWJlciwKKyAgICAgICAgICAgICAgICMgYSBuYW1lIG9yIGEgc3RyaW5nLgorICAgICAgICAgICAgICAgcHJpbnQgIiMgICAgIGRlZmluZSBQTkdfc2V0XyIgcltqXSwgc2V0dmFsW2kgIiAiIHJbal1dID5vdXQKKyAgICAgICAgICAgICAgIHByaW50ICIjICAgIGVuZGlmIiA+b3V0CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBwcmludCAiIyAgIGVuZGlmIC8qIGRlZmluaXRpb24gKi8iID5vdXQKKyAgICAgICAgIHByaW50ICIjZW5kaWYgLypyZXF1aXJlcywgaWYqLyIgPm91dAorICAgICAgICAgaWYgKGxvZ3Vuc3VwcG9ydGVkIHx8IGkgfiAvXm9rXy8pIHsKKyAgICAgICAgICAgIHByaW50ICIjaWZuZGVmICBQTkdfb24iID5vdXQKKyAgICAgICAgICAgIGlmIChsb2d1bnN1cHBvcnRlZCkgeworICAgICAgICAgICAgICAgcHJpbnQgdW5kIGkgdW5lID5vdXQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpIH4gL15va18vKSB7CisgICAgICAgICAgICAgICBwcmludCBlcnJvciwgaSwgIm5vdCBlbmFibGVkOiByZXF1aXJlczoiIHJlcXVpcmVzW2ldICIsIGVuYWJsZWQgYnk6IiBpZmZzW2ldIGVuYWJsZWRieVtpXSBlbmQgPm91dAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnQgIiNlbmRpZiIgPm91dAorICAgICAgICAgfQorCisgICAgICAgICBkb25lW2ldID0gMQorICAgICAgICAgKyttb3ZlbWVudAorICAgICAgfQorCisgICAgICBpZiAoIWZpbmlzaGVkICYmICFtb3ZlbWVudCkgeworICAgICAgICAgcHJpbnQgIm9wdGlvbjogbG9vcCBvciBtaXNzaW5nIG9wdGlvbiBpbiBkZXBlbmRlbmN5IHRyZWUsIGNhbm5vdCBwcm9jZXNzOiIKKyAgICAgICAgIGZvciAoaSBpbiBvcHRpb24pIGlmICghZG9uZVtpXSkgeworICAgICAgICAgICAgcHJpbnQgIiAgb3B0aW9uIiwgaSwgImRlcGVuZHMgb24iIHRyZWVbaV0sICJuZWVkczoiCisgICAgICAgICAgICBucmVxcyA9IHNwbGl0KHRyZWVbaV0sIHIpCisgICAgICAgICAgICBpZiAobnJlcXMgPiAwKSBmb3IgKGo9MTsgajw9bnJlcXM7ICsraikgaWYgKCFkb25lW3Jbal1dKSB7CisgICAgICAgICAgICAgICBwcmludCAiICAgIiByW2pdCisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBleGl0IDEKKyAgICAgIH0KKyAgIH0KKyAgIHByaW50ICJQTkdfREZOX0VORF9TT1JUIiA+b3V0CisgICBwcmludCBjb21tZW50LCAiZW5kIG9mIG9wdGlvbnMiLCBjZW5kID5vdXQKKworICAgIyBEbyB0aGUgJ3NldHRpbmcnIHZhbHVlcyBzZWNvbmQsIHRoZSBhbGdvcml0aG0gdGhlIHN0YW5kYXJkCisgICAjIHRyZWUgd2FsayAoTygxKSkgZG9uZSBpbiBhbiBPKDIpIHdoaWxlL2ZvciBsb29wOyBpbnRlcmF0aW9ucworICAgIyBzZXR0aW5ncyB4IGRlcHRoLCBvdXRwdXRpbmcgdGhlIGRlZXBlc3QgcmVxdWlyZWQgbWFjcm9zCisgICAjIGZpcnN0LgorICAgcHJpbnQgIiIgPm91dAorICAgcHJpbnQgIi8qIFNFVFRJTkdTICovIiA+b3V0CisgICBwcmludCBjb21tZW50LCAic2V0dGluZ3MiLCBjZW5kID5vdXQKKyAgICMgU29ydCAoaW4gZGZuLmF3aykgb24gZmllbGQgMiwgdGhlIHNldHRpbmcgbmFtZQorICAgcHJpbnQgIlBOR19ERk5fU1RBUlRfU09SVCAyIiA+b3V0CisgICBmaW5pc2hlZCA9IDAKKyAgIHdoaWxlICghZmluaXNoZWQpIHsKKyAgICAgIGZpbmlzaGVkID0gMQorICAgICAgbW92ZW1lbnQgPSAwICMgZG9uZSBub3RoaW5nCisgICAgICBmb3IgKGkgaW4gc2V0dGluZykgaWYgKCFkb25lc2V0W2ldKSB7CisgICAgICAgICBucmVxcyA9IHNwbGl0KHNldHRpbmdbaV0sIHIpCisgICAgICAgICBpZiAobnJlcXMgPiAwKSB7CisgICAgICAgICAgICAjIEJ5IGRlZmF1bHQgYXNzdW1lIHRoZSByZXF1aXJlcyB2YWx1ZXMgYXJlIG9wdGlvbnMsIGJ1dCBpZiB0aGVyZQorICAgICAgICAgICAgIyBpcyBubyBvcHRpb24gd2l0aCB0aGF0IG5hbWUgY2hlY2sgZm9yIGEgc2V0dGluZworICAgICAgICAgICAgZm9yIChqPTE7IGo8PW5yZXFzOyArK2opIGlmIChvcHRpb25bcltqXV0gPT0gIiIgJiYgIWRvbmVzZXRbcltqXV0pIHsKKyAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoajw9bnJlcXMpIHsKKyAgICAgICAgICAgICAgIGZpbmlzaGVkID0gMAorICAgICAgICAgICAgICAgY29udGludWUgIyB0cnkgYSBkaWZmZXJlbnQgc2V0dGluZworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICAjIEFsbCB0aGUgcmVxdWlyZW1lbnRzIGhhdmUgYmVlbiBwcm9jZXNzZWQsIG91dHB1dAorICAgICAgICAgIyB0aGlzIHNldHRpbmcuCisgICAgICAgICBpZiAoZGViKSBwcmludCAic2V0dGluZyIsIGkKKyAgICAgICAgIGRlZmx0ID0gZGVmYXVsdHNbaV0KKyAgICAgICAgICMgUmVtb3ZlIGFueSBzcHVyaW91cyB0cmFpbGluZyBzcGFjZXMKKyAgICAgICAgIHN1YigvICokLywiIixkZWZsdCkKKyAgICAgICAgICMgQSBsZWFkaW5nIEAgbWVhbnMgbGVhdmUgaXQgdW5xdW90ZWQgc28gdGhlIHByZXByb2Nlc3NvcgorICAgICAgICAgIyBjYW4gc3Vic3RpdHV0ZSB0aGUgYnVpbGQgdGltZSB2YWx1ZQorICAgICAgICAgaWYgKGRlZmx0IH4gL14gQC8pCisgICAgICAgICAgICBkZWZsdCA9ICIgIiBzdWJzIHN1YnN0cihkZWZsdCwgMykgc3ViZQorICAgICAgICAgcHJpbnQgIiIgPm91dAorICAgICAgICAgcHJpbnQgIi8qIHNldHRpbmc6ICIsIGkgPm91dAorICAgICAgICAgcHJpbnQgIiAqICAgcmVxdWlyZXM6IiBzZXR0aW5nW2ldID5vdXQKKyAgICAgICAgIHByaW50ICIgKiAgIGRlZmF1bHQ6ICIsIGRlZmF1bHRzW2ldIGRlZmx0LCAiKi8iID5vdXQKKyAgICAgICAgIGZvciAoaj0xOyBqPD1ucmVxczsgKytqKSB7CisgICAgICAgICAgICBpZiAob3B0aW9uW3Jbal1dICE9ICIiKQorICAgICAgICAgICAgICAgcHJpbnQgIiNpZm5kZWYgUE5HXyIgcltqXSAiX1NVUFBPUlRFRCIgPm91dAorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgcHJpbnQgIiNpZm5kZWYgUE5HXyIgcltqXSA+b3V0CisgICAgICAgICAgICBwcmludCBlcnJvciwgaSwgInJlcXVpcmVzIiwgcltqXSBlbmQgPm91dAorICAgICAgICAgICAgcHJpbnQgIiMgZW5kaWYiID5vdXQKKyAgICAgICAgIH0KKyAgICAgICAgICMgVGhlIHByZWNlZGVuY2UgaXM6CisgICAgICAgICAjCisgICAgICAgICAjICAxKSBFeHRlcm5hbCBkZWZpbml0aW9uOyB0cnVtcHM6CisgICAgICAgICAjICAyKSBPcHRpb24gJ3NldHMnIHZhbHVlOyB0cnVtcHM6CisgICAgICAgICAjICAzKSBTZXR0aW5nICdkZWZhdWx0JworICAgICAgICAgIworICAgICAgICAgcHJpbnQgIiNpZmRlZiBQTkdfIiBpID5vdXQKKyAgICAgICAgICMgUE5HXzxpPiBpcyBkZWZpbmVkLCBzbyBzdWJzdGl0dXRlIHRoZSB2YWx1ZToKKyAgICAgICAgIHByaW50IGRlZiBpLCBzdWJzICJQTkdfIiBpIHN1YmUgZW5kID5vdXQKKyAgICAgICAgIHByaW50ICIjZWxzZSAvKiB1c2UgZGVmYXVsdCAqLyIgPm91dAorICAgICAgICAgcHJpbnQgIiMgaWZkZWYgUE5HX3NldF8iIGkgPm91dAorICAgICAgICAgIyBWYWx1ZSBmcm9tIGFuIG9wdGlvbiAnc2V0cycgYXJndW1lbnQKKyAgICAgICAgIHByaW50IGRlZiBpLCBzdWJzICJQTkdfc2V0XyIgaSBzdWJlIGVuZCA+b3V0CisgICAgICAgICAjIFRoaXMgaXMgc28gdGhhdCBzdWJzZXF1ZW50IHRlc3RzIG9uIHRoZSBzZXR0aW5nIHdvcms6CisgICAgICAgICBwcmludCAiIyAgZGVmaW5lIFBOR18iIGksICIxIiA+b3V0CisgICAgICAgICBpZiAoZGVmYXVsdHNbaV0gIT0gIiIpIHsKKyAgICAgICAgICAgIHByaW50ICIjIGVsc2UgLypkZWZhdWx0Ki8iID5vdXQKKyAgICAgICAgICAgIHByaW50IGRlZiBpIGRlZmx0IGVuZCA+b3V0CisgICAgICAgICAgICBwcmludCAiIyAgZGVmaW5lIFBOR18iIGksICIxIiA+b3V0CisgICAgICAgICB9CisgICAgICAgICBwcmludCAiIyBlbmRpZiAvKiBkZWZhdWx0cyAqLyIgPm91dAorICAgICAgICAgcHJpbnQgIiNlbmRpZiAvKiBzZXR0aW5nIiwgaSwgIiovIiA+b3V0CisKKyAgICAgICAgIGRvbmVzZXRbaV0gPSAxCisgICAgICAgICArK21vdmVtZW50CisgICAgICB9CisKKyAgICAgIGlmICghZmluaXNoZWQgJiYgIW1vdmVtZW50KSB7CisgICAgICAgICBwcmludCAic2V0dGluZzogbG9vcCBvciBtaXNzaW5nIHNldHRpbmcgaW4gJ3JlcXVpcmVzJywgY2Fubm90IHByb2Nlc3M6IgorICAgICAgICAgZm9yIChpIGluIHNldHRpbmcpIGlmICghZG9uZXNldFtpXSkgeworICAgICAgICAgICAgcHJpbnQgIiAgc2V0dGluZyIsIGksICJyZXF1aXJlcyIgc2V0dGluZ1tpXQorICAgICAgICAgfQorICAgICAgICAgZXhpdCAxCisgICAgICB9CisgICB9CisgICBwcmludCAiUE5HX0RGTl9FTkRfU09SVCIgPm91dAorICAgcHJpbnQgY29tbWVudCwgImVuZCBvZiBzZXR0aW5ncyIsIGNlbmQgPm91dAorCisgICAjIFJlZ3VsYXIgZW5kIC0gZXZlcnl0aGluZyBsb29rcyBvaworICAgaWYgKHByb3RlY3QgIT0gIiIpIHsKKyAgICAgIHByaW50IHN0YXJ0ICIjZW5kaWYiLCAiLyoiLCBwcm90ZWN0LCAiKi8iIGVuZCA+b3V0CisgICB9Cit9CmRpZmYgLS1naXQgYS9saWJwbmcvc2NyaXB0cy9wbmdsaWJjb25mLmRmYSBiL2xpYnBuZy9zY3JpcHRzL3BuZ2xpYmNvbmYuZGZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYjdiNDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvc2NyaXB0cy9wbmdsaWJjb25mLmRmYQpAQCAtMCwwICsxLDg4NyBAQAorIyBzY3JpcHRzL3BuZ2xpYmNvbmYuZGZhIC0gbGlicmFyeSBidWlsZCBjb25maWd1cmF0aW9uIGNvbnRyb2wKKyMKK0AvKi0gcG5nbGliY29uZi5kZm4gaW50ZXJtZWRpYXRlIGZpbGUKK0AgKiAgZ2VuZXJhdGVkIGZyb20gc2NyaXB0cy9wbmdsaWJjb25mLmRmYQorQCAqLworIworY29tIHBuZ2xpYmNvbmYuaCAtIGxpYnJhcnkgYnVpbGQgY29uZmlndXJhdGlvbgorY29tCit2ZXJzaW9uCitjb20KK2NvbSBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KK2NvbQorY29tIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCitjb20gRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorY29tIGFuZCBsaWNlbnNlIGluIHBuZy5oCitjb20KKworZmlsZSBwbmdsaWJjb25mLmggc2NyaXB0cy9wbmdsaWJjb25mLmRmYSBQTkdMQ09ORl9ICisKKyMgVGhpcyBmaWxlIGlzIHByZXByb2Nlc3NlZCBieSBzY3JpcHRzL29wdGlvbnMuYXdrIGFuZCB0aGUKKyMgQyBjb21waWxlciB0byBnZW5lcmF0ZSAncG5nbGliY29uZi5oJyAtIGEgbGlzdCBvZiBhbGwgdGhlCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gIFRoZSBmaWxlIGxpc3RzIHRoZSB2YXJpb3VzIG9wdGlvbnMKKyMgdGhhdCBjYW4gKm9ubHkqIGJlIHNwZWNpZmllZCBkdXJpbmcgdGhlIGxpYnBuZyBidWlsZDsKKyMgcG5nbGliY29uZi5oIGZyZWV6ZXMgdGhlIGRlZmluaXRpb25zIHNlbGVjdGVkIGZvciB0aGUgc3BlY2lmaWMKKyMgYnVpbGQuCisjCisjIFRoZSBzeW50YXggaXMgZGV0YWlsZWQgaW4gc2NyaXB0cy9vcHRpb25zLmF3azsgdGhpcyBpcyBhIHN1bW1hcnkKKyMgb25seToKKyMKKyMgc2V0dGluZyA8bmFtZT4gW3JlcXVpcmVzIC4uLl0gW2RlZmF1bHRdCisjICAgICNkZWZpbmUgUE5HXzxuYW1lPiA8dmFsdWU+ICAvKiB2YWx1ZSBjb21lcyBmcm9tIGN1cnJlbnQgc2V0dGluZyAqLworIyBvcHRpb24gPG5hbWU+IFtyZXF1aXJlcyAuLi5dIFtpZiAuLi5dIFtlbmFibGVzIC4uLl0gW2Rpc2FibGVkXQorIyAgICAjZGVmaW5lIFBOR188bmFtZT5fU1VQUE9SVEVEIGlmIHRoZSByZXF1aXJlbWVudHMgYXJlIG1ldCBhbmQKKyMgICAgZW5hYmxlIHRoZSBvdGhlciBvcHRpb25zIGxpc3RlZAorIyBjaHVuayA8bmFtZT4gW3JlcXVpcmVzIC4uLl0gW2VuYWJsZXMgLi4uXSBbZGlzYWJsZWRdCisjICAgIEVuYWJsZSBjaHVuayBwcm9jZXNzaW5nIGZvciB0aGUgZ2l2ZW4gYW5jaWxsYXJ5IGNodW5rOyBhbnkKKyMgICAgJ3JlcXVpcmVzIHNvbWV0aGluZycgZXhwYW5kcyB0byBSRUFEX3NvbWV0aGluZyBmb3IgcmVhZCBhbmQKKyMgICAgV1JJVEVfc29tZXRoaW5nIGZvciB3cml0ZSwgYnV0IHRoZSBlbmFibGVzIGxpc3QgbWVtYmVycyBhcmUKKyMgICAgdXNlZCBhcyBnaXZlbiAoZS5nLiBlbmFibGVzIEdBTU1BIGp1c3QgZXhwYW5kcyB0byB0aGF0IG9uIHRoZQorIyAgICBjb3JyZXNwb25kIFJFQURfbmFtZSBhbmQgV1JJVEVfbmFtZSBsaW5lcy4pCisjCisjICIsIiBtYXkgYmUgdXNlZCB0byBzZXBhcmF0ZSBvcHRpb25zIG9uIGFuICdvcHRpb24nIGxpbmUgYW5kIGlzIGlnbm9yZWQ7IGl0CisjIGRvZXNuJ3QgY2hhbmdlIHRoZSBtZWFuaW5nIG9mIHRoZSBsaW5lLiAgKE5PVCBzZXR0aW5nLCB3aGVyZSAiLCIgYmVjb21lcworIyBwYXJ0IG9mIHRoZSBzZXR0aW5nISkgIEEgY29tbWEgYXQgdGhlIGVuZCBvZiBhbiBvcHRpb24gbGluZSBjYXVzZXMgYQorIyBjb250aW51YXRpb24gKHRoZSBuZXh0IGxpbmUgaXMgaW5jbHVkZWQgaW4gdGhlIG9wdGlvbiB0b28uKQorIworIyBOb3RlIHRoYXQgdGhlICdvbicgYW5kICdvZmYnIGtleXdvcmRzLCB3aGlsZSB2YWxpZCBvbiBib3RoIG9wdGlvbgorIyBhbmQgY2h1bmssIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGlzIGZpbGUgYmVjYXVzZSB0aGV5IGZvcmNlIHRoZQorIyByZWxldmFudCBvcHRpb25zIG9uIG9yIG9mZi4KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgZm9sbG93aW5nIHNldHRpbmcsIG9wdGlvbiBhbmQgY2h1bmsgdmFsdWVzIGNhbiBhbGwgYmUgY2hhbmdlZAorIyB3aGlsZSBidWlsZGluZyBsaWJwbmc6CisjCisjIHNldHRpbmc6IGNoYW5nZSAnc2V0dGluZycgbGluZXMgdG8gZmluZSB0dW5lIGxpYnJhcnkgcGVyZm9ybWFuY2U7CisjICAgY2hhbmdlcyB0byB0aGUgc2V0dGluZ3MgZG9uJ3QgYWZmZWN0IHRoZSBsaWJwbmcgQVBJIGZ1bmN0aW9uYWxseQorIworIyBvcHRpb246IGNoYW5nZSAnb3B0aW9uJyBsaW5lcyB0byByZW1vdmUgb3IgYWRkIGNhcGFiaWxpdGllcyBmcm9tCisjICAgb3IgdG8gdGhlIGxpYnJhcnk7IG9wdGlvbnMgY2hhbmdlIHRoZSBsaWJyYXJ5IEFQSQorIworIyBjaHVuazogY2hhbmdlICdjaHVuaycgbGluZXMgdG8gcmVtb3ZlIGNhcGFiaWxpdGllcyB0byBwcm9jZXNzCisjICAgb3B0aW9uYWwgKCdhbmNpbGxhcnknKSBjaHVua3MuICBUaGlzIGRvZXMgbm90IHByZXZlbnQgUE5HCisjICAgZGVjb2RpbmcgYnV0IGRvZXMgY2hhbmdlIHRoZSBsaWJwbmcgQVBJIGJlY2F1c2Ugc29tZSBjaHVua3MKKyMgICB3aWxsIGJlIGlnbm9yZWQuCisjCisjIFRoZXJlIGFyZSB0aHJlZSB3YXlzIG9mIGRpc2FibGluZyBmZWF0dXJlcywgaW4gbm8gcGFydGljdWxhciBvcmRlcjoKKyMKKyMgMSkgQ3JlYXRlICdwbmd1c3IuaCcsIGVudGVyIHRoZSByZXF1aXJlZCBwcml2YXRlIGJ1aWxkIGluZm9ybWF0aW9uCisjIGRldGFpbGVkIGJlbG93IGFuZCAjZGVmaW5lIFBOR19OT188b3B0aW9uPiBmb3IgZWFjaCBvcHRpb24geW91CisjIGRvbid0IHdhbnQgaW4gdGhhdCBmaWxlIGluIHRoYXQgZmlsZS4gIFlvdSBjYW4gYWxzbyB0dXJuIG9uIG9wdGlvbnMKKyMgdXNpbmcgUE5HXzxvcHRpb24+X1NVUFBPUlRFRC4gIFdoZW4geW91IGhhdmUgZmluaXNoZWQgcmVydW4KKyMgY29uZmlndXJlIGFuZCByZWJ1aWxkIHBuZ2xpYmNvbmYuaCBmaWxlIHdpdGggLURQTkdfVVNFUl9DT05GSUc6CisjCisjICBtYWtlIGNsZWFuCisjICBDUFBGTEFHUz0nLURQTkdfVVNFUl9DT05GSUcnIC4vY29uZmlndXJlCisjICBtYWtlIHBuZ2xpYmNvbmYuaAorIworIyBwbmd1c3IuaCBpcyBvbmx5IHVzZWQgZHVyaW5nIHRoZSBjcmVhdGlvbiBvZiBwbmdsaWJjb25mLmgsIGJ1dCBpdAorIyBpcyBzYWZlciB0byBlbnN1cmUgdGhhdCAtRFBOR19VU0VSX0NPTkZJRyBpcyBzcGVjaWZpZWQgdGhyb3VnaG91dAorIyB0aGUgYnVpbGQgYnkgY2hhbmdpbmcgdGhlIENQUEZMQUdTIHBhc3NlZCB0byB0aGUgaW5pdGlhbCAuL2NvbmZpZ3VyZQorIworIyAyKSBBZGQgZGVmaW5pdGlvbnMgb2YgdGhlIHNldHRpbmdzIHlvdSB3YW50IHRvIGNoYW5nZSB0bworIyBDUFBGTEFHUzsgZm9yIGV4YW1wbGU6CisjCisjICAgLURQTkdfREVGQVVMVF9SRUFEX01BQ1JPUz0wCisjCisjIChUaGlzIHdvdWxkIGNoYW5nZSB0aGUgZGVmYXVsdCB0byAqbm90KiB1c2UgcmVhZCBtYWNyb3MuKSAgQmUKKyMgdmVyeSBjYXJlZnVsIHRvIGNoYW5nZSBvbmx5IHNldHRpbmdzIHRoYXQgZG9uJ3QgYWx0ZXIgdGhlIEFQSQorIyBiZWNhdXNlIHRoaXMgYXBwcm9hY2ggYnlwYXNzZXMgdGhlIHByaXZhdGUgYnVpbGQgY2hlY2tpbmcuICBZb3UKKyMgY2FuIGFsc28gY2hhbmdlIHNldHRpbmdzIGZyb20gcG5ncHJpdi5oIChyZWFkIHBuZ3ByaXYuaCkgc2FmZWx5CisjIHdpdGhvdXQgQVBJIGNoYW5nZXMuICBEbyB0aGF0IGluIHRoZSBzYW1lIHdheS4KKyMKKyMgMykgV3JpdGUgYSBuZXcgJy5kZmEnIGZpbGUgKHNheSAncG5ndXNyLmRmYScpIGFuZCBpbiB0aGlzIGZpbGUKKyMgcHJvdmlkZSBvdmVycmlkZSB2YWx1ZXMgZm9yIHNldHRpbmcgZW50cmllcyBhbmQgdHVybiBvcHRpb24gb3IKKyMgY2h1bmsgdmFsdWVzIGV4cGxpY2l0bHkgJ29uJyBvciAnb2ZmJzoKKyMKKyMgICAgc2V0dGluZyBGT08gZGVmYXVsdCBWQUxVRQorIyAgICBvcHRpb24gQkFSIFtvbnxvZmZdCisjCisjIFRoZW4gYWRkIHRoaXMgZmlsZSB0byB0aGUgb3B0aW9ucy5hd2sgY29tbWFuZCBsaW5lICh0aGUgKmZpcnN0KgorIyBvbmUpIGFmdGVyIHRoaXMgZmlsZS4gIFRoZSBtYWtlIG1hY3JvIERGQV9YVFJBIGlzIHByb3ZpZGVkIHRvIG1ha2UKKyMgdGhpcyBlYXNpZXIgKHNldCBpdCBsaWtlIENQUEZMQUdTIHByaW9yIHRvIHJ1bm5pbmcgLi9jb25maWd1cmUpLgorIyBMb29rIGF0IHRoZSBidWlsZHMgYmVsb3cgY29udHJpYi9wbmdtaW5pbSBmb3Igc29tZSBleHRyZW1lIGV4YW1wbGVzCisjIG9mIGhvdyB0aGlzIGNhbiBiZSB1c2VkLgorIworIyBEb24ndCBlZGl0IHRoaXMgZmlsZSB1bmxlc3MgeW91IGFyZSBjb250cmlidXRpbmcgYSBwYXRjaCB0bworIyBsaWJwbmcgYW5kIG5lZWQgbmV3IG9yIG1vZGlmaWVkIG9wdGlvbnMvc2V0dGluZ3MuCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBmb2xsb3dpbmcgY2F1c2VzIGNvbW1lbnRlZCBvdXQgI3VuZGVmIGxpbmVzIHRvIGJlIHdyaXR0ZW4gdG8KKyMgcG5nbGliY29uZi5oOyB0aGlzIGNhbiBiZSBzdG9wcGVkIGJ5IGxvZ3Vuc3VwcG9ydGVkPTAgaW4gYSBsYXRlcgorIyBmaWxlIG9yIG9uIHRoZSBjb21tYW5kIGxpbmUgKGFmdGVyIHBuZ2xpYmNvbmYuZGZhKQorCitsb2d1bnN1cHBvcnRlZCA9IDEKKworIyBUaGUgZm9sbG93aW5nIGFsbG93cyB0aGUgb3V0cHV0IGZyb20gY29uZmlndXJlIHRvIG1vZGlmeSB0aGUgY29udGVudHMgb2YKKyMgcG5nbGliY29uZi5oCisKK0AjaWZkZWYgSEFWRV9DT05GSUdfSAorQCMgIGluY2x1ZGUgImNvbmZpZy5oIgorQCNlbmRpZgorCisjIFBOR19VU0VSX0NPTkZJRyBoYXMgdG8gYmUgZGVmaW5lZCBvbiB0aGUgY29tcGlsZXIgY29tbWFuZCBsaW5lCisjIHRvIGNhdXNlIHBuZ3Vzci5oIHRvIGJlIHJlYWQgd2hpbGUgY29uc3RydWN0aW5nIHBuZ2xpYmNvbmYuaAorIworIyBJZiB5b3UgY3JlYXRlIGEgcHJpdmF0ZSBETEwgeW91IG5lZWQgdG8gZGVmaW5lIHRoZSBmb2xsb3dpbmcKKyMgbWFjcm9zIGluIHRoZSBmaWxlICdwbmd1c3IuaCcgYW5kIHNldCAtRFBOR19VU0VSX0NPTkZJRyBmb3IKKyMgY29tcGlsYXRpb24gKGkuZS4gaW4gQ1BQRkxBR1MuKQorIyAjZGVmaW5lIFBOR19VU0VSX1BSSVZBVEVCVUlMRCBcCisjICAgICA8RGVzY3JpYmVzIGJ5IHdob20gYW5kIHdoeSB0aGlzIHZlcnNpb24gb2YgdGhlIERMTCB3YXMgYnVpbHQ+CisjICBlLmcuICNkZWZpbmUgUE5HX1VTRVJfUFJJVkFURUJVSUxEICJCdWlsZCBieSBNeUNvbXBhbnkgZm9yIHh5eiByZWFzb25zLiIKKyMgI2RlZmluZSBQTkdfVVNFUl9ETExGTkFNRV9QT1NURklYIDx0d28tbGV0dGVyIHBvc3RmaXggdGhhdCBzZXJ2ZSB0bworIyAgICAgICAgZGlzdGluZ3Vpc2ggeW91ciBETEwgZnJvbSB0aG9zZSBvZiB0aGUgb2ZmaWNpYWwgcmVsZWFzZS4gVGhlc2UKKyMgICAgICAgIGNvcnJlc3BvbmQgdG8gdGhlIHRyYWlsaW5nIGxldHRlcnMgdGhhdCBjb21lIGFmdGVyIHRoZSB2ZXJzaW9uCisjICAgICAgICBudW1iZXIgYW5kIG11c3QgbWF0Y2ggeW91ciBwcml2YXRlIERMTCBuYW1lPgorIyAgZS5nLiAvLyBwcml2YXRlIERMTCAibGlicG5nMTNneC5kbGwiCisjICAgICAgICNkZWZpbmUgUE5HX1VTRVJfRExMRk5BTUVfUE9TVEZJWCAiZ3giCisjCisjIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSBhbHNvIGF0IHlvdXIgZGlzcG9zYWwgaWYgeW91IHdhbnQgdG8gY29tcGxldGUgdGhlCisjIERMTCBWRVJTSU9OSU5GTyBzdHJ1Y3R1cmUuCisjIC0gUE5HX1VTRVJfVkVSU0lPTklORk9fQ09NTUVOVFMKKyMgLSBQTkdfVVNFUl9WRVJTSU9OSU5GT19DT01QQU5ZTkFNRQorIyAtIFBOR19VU0VSX1ZFUlNJT05JTkZPX0xFR0FMVFJBREVNQVJLUworCisjIEl0IGlzIG5lY2Vzc2FyeSB0byBpbmNsdWRlIGNvbmZpZ3VyZXMgZGVmaW5pdGlvbnMgaGVyZSBzbyB0aGF0IEFDX0RFRklORQorIyBpbiBjb25maWd1cmUuYWMgd29ya3MgaW4gYSBjb21wcmVoZW5zaWJsZSB3YXkKK0AjaWYgZGVmaW5lZChIQVZFX0NPTkZJR19IKSAmJiAhZGVmaW5lZChQTkdfTk9fQ09ORklHX0gpCitAIyAgaW5jbHVkZSAiY29uZmlnLmgiCitAI2VuZGlmCisKK0AjaWZkZWYgUE5HX1VTRVJfQ09ORklHCitAIyAgaW5jbHVkZSAicG5ndXNyLmgiCitAI2VuZGlmCisKKyMgVGhpcyBpcyBhIHNwZWNpYWwgZml4dXAgZm9yIHRoZSBXYXRjb20gQyBjb21waWxlciBvbiBXaW5kb3dzLCB3aGljaCBoYXMKKyMgbXVsdGlwbGUgcHJvY2VkdXJlIGNhbGwgc3RhbmRhcmRzLiAgVW5sZXNzIFBOR19BUElfUlVMRSBpcyBzZXQgZXhwbGljaXRseQorIyAoaS5lLiBpZiBpdCBpcyBub3QgZGVmaW5lZCBhdCB0aGlzIHBvaW50KSBpdCB3aWxsIGJlIGZvcmNlZCB0byAnMicgaGVyZSB3aGVuCisjIHVzaW5nIFdhdGNvbS4gIFRoaXMgaW5kaWNhdGVzIHRvIHRoZSBvdGhlciBoZWFkZXIgZmlsZXMgdGhhdCBXYXRjb20gYmVoYXZpb3VyCisjIGlzIHJlcXVpcmVkIHdoZXJlIGFwcHJvcHJpYXRlLgorCitAI2lmZGVmIF9fV0FUQ09NQ19fCitAIyAgaWZuZGVmIFBOR19BUElfUlVMRQorQCMgICAgIGRlZmluZSBQTkdfQVBJX1JVTEUgMiAvKiBVc2UgV2F0Y29tIGNhbGxpbmcgY29udmVudGlvbnMgKi8KK0AjICBlbmRpZgorQCNlbmRpZgorCisjIElOIERFVkVMT1BNRU5UCisjIFRoZXNlIGFyZSBjdXJyZW50bHkgZXhwZXJpbWVudGFsIGZlYXR1cmVzOyBkZWZpbmUgdGhlbSBpZiB5b3Ugd2FudCAoTk9URToKKyMgZXhwZXJpbWVudGFsIG9wdGlvbnMgbXVzdCBiZSBkaXNhYmxlZCBiZWZvcmUgdGhleSBhcmUgZGVmaW5lZCBpbiB0aGlzIGZpbGUhKQorCisjIE5PTkUKKworIyBOb3RlIHRoYXQgUE5HX1VTRVJfQ09ORklHIG9ubHkgaGFzIGFuIGVmZmVjdCB3aGVuIGJ1aWxkaW5nCisjIHBuZ2xpYmNvbmYuaAorCitzZXR0aW5nIFVTRVJfQ09ORklHCitzZXR0aW5nIFVTRVJfUFJJVkFURUJVSUxECitzZXR0aW5nIFVTRVJfRExMRk5BTUVfUE9TVEZJWAorc2V0dGluZyBVU0VSX1ZFUlNJT05JTkZPX0NPTU1FTlRTCitzZXR0aW5nIFVTRVJfVkVSU0lPTklORk9fQ09NUEFOWU5BTUUKK3NldHRpbmcgVVNFUl9WRVJTSU9OSU5GT19MRUdBTFRSQURFTUFSS1MKKworIyBSZWNvcmQgdGhlICdBUEkgcnVsZScgdXNlZCB0byBzZWxlY3QgY2FsbGluZyBjb252ZW50aW9ucyBvbgorIyB0aG9zZSBzeXN0ZW1zIHRoYXQgc3VwcG9ydCBzdWNoIHRoaW5ncyAoc2VlIGFsbCB0aGUgY29tbWVudHMgaW4KKyMgcG5nY29uZi5oKQorIyBDaGFuZ2luZyB0aGlzIHNldHRpbmcgaGFzIGEgZnVuZGFtZW50YWwgYWZmZWN0IG9uIHRoZSBQTkcgQUJJLAorIyBkbyBub3QgcmVsZWFzZSBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhpcyBjaGFuZ2VkLgorCitzZXR0aW5nIEFQSV9SVUxFIGRlZmF1bHQgMAorCisjIFRoaXMgYWxsb3dzIGEgcHJlZml4IHRvIGJlIGFkZGVkIHRvIHRoZSBmcm9udCBvZiBldmVyeSBBUEkgZnVuY3RvbiBuYW1lIChhbmQKKyMgdGhlcmVmb3JlIGV2ZXJ5IHN5bWJvbCkgYnkgcmVkZWZpbmluZyBhbGwgdGhlIGZ1bmN0aW9uIG5hbWVzIHdpdGggdGhlIHByZWZpeAorIyBhdCB0aGUgZW5kIG9mIHBuZ2xpYmNvbmYuaC4gIEl0IGFsc28gdHVybnMgb24gc2ltaWxhciBpbnRlcm5hbCBzeW1ib2wgcmVuYW1pbmcKKyMgYnkgY2F1c2luZyBhIHNpbWlsYXIgYnVpbGQtdGltZSBvbmx5IGZpbGUsIHBuZ3ByZWZpeC5oLCB0byBiZSBnZW5lcmF0ZWQuCisKK3NldHRpbmcgUFJFRklYCisKKyMgSW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udHJvbCBvZiB0aGUgb3B0aW1pemF0aW9ucywgZW5hYmxlZCBieSB0aG9zZQorIyBoYXJkd2FyZSBvciBzb2Z0d2FyZSBvcHRpb25zIHRoYXQgbmVlZCBpdCAodHlwaWNhbGx5IHdoZW4gcnVuLXRpbWUgY2hvaWNlcworIyBtdXN0IGJlIG1hZGUgYnkgdGhlIHVzZXIpCitvcHRpb24gU0VUX09QVElPTiBkaXNhYmxlZAorCisjIFRoZXNlIG9wdGlvbnMgYXJlIHNwZWNpZmljIHRvIHRoZSBBUk0gTkVPTiBoYXJkd2FyZSBvcHRpbWl6YXRpb25zLiAgQXQgcHJlc2VudAorIyB0aGVzZSBvcHRpbWl6YXRpb25zIGRlcGVuZCBvbiBHQ0Mgc3BlY2lmaWMgcHJlLXByb2Nlc3Npbmcgb2YgYW4gYXNzZW1ibGVyICguUykKKyMgZmlsZSBzbyB0aGV5IHByb2JhYmx5IHdvbid0IHdvcmsgd2l0aCBvdGhlciBjb21waWxlcnMuCisjCisjIEFSTV9ORU9OX09QVDogdW5zZXQ6IGNoZWNrIGF0IGNvbXBpbGUgdGltZSAoX19BUk1fTkVPTl9fIG11c3QgYmUgZGVmaW5lZCBieQorIyAgICAgICAgICAgICAgICAgICAgICB0aGUgY29tcGlsZXIsIHR5cGljYWxseSBhcyBhIHJlc3VsdCBvZiBzcGVjaWZ5aW5nCisjICAgICAgICAgICAgICAgICAgICAgIENDPSJnY2MgLW1mcHU9bmVvbiIuKQorIyAgICAgICAgICAgICAgICAgICAwOiBkaXNhYmxlIChldmVuIGlmIHRoZSBDUFUgaGFzIGEgTkVPTiBGUFUuKQorIyAgICAgICAgICAgICAgICAgICAxOiBjaGVjayBhdCBydW4gdGltZSAodmlhIEFSTV9ORU9OX3tBUEksQ0hFQ0t9KQorIyAgICAgICAgICAgICAgICAgICAyOiBzd2l0Y2ggb24gdW5jb25kaXRpb25hbGx5IChpbmFkdmlzYWJsZSAtIGluc3RlYWQgcGFzcworIyAgICAgICAgICAgICAgICAgICAgICAtbWZwdT1uZW9uIHRvIEdDQyBpbiBDQykKKyMgICAgICAgICAgIFdoZW4gYnVpbGRpbmcgbGlicG5nIGF2b2lkIHVzaW5nIGFueSBzZXR0aW5nIG90aGVyIHRoYW4gJzAnOyAnMScgaXMKKyMgICAgICAgICAgIHNldCBhdXRvbWF0aWNhbGx5IHdoZW4gZWl0aGVyICdBUEknIG9yICdDSEVDSycgYXJlIGNvbmZpZ3VyZWQgaW4sCisjICAgICAgICAgICAnMicgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgYXMgLW1mcHU9bmVvbiB3aWxsIGFjaGlldmUgdGhlIHNhbWUKKyMgICAgICAgICAgIGVmZmVjdCBhcyB3ZWxsIGFzIGFwcGx5aW5nIE5FT04gb3B0aW1pemF0aW9ucyB0byB0aGUgcmVzdCBvZiB0aGUKKyMgICAgICAgICAgIGxpYnBuZyBjb2RlLgorIyAgICAgICAgICAgTk9URTogYW55IHNldHRpbmcgb3RoZXIgdGhhbiAnMCcgcmVxdWlyZXMgQUxJR05FRF9NRU1PUlkKKyMgQVJNX05FT05fQVBJOiAgIChQTkdfQVJNX05FT04gPT0gMSkgYWxsb3cgdGhlIG9wdGltaXphdGlvbiB0byBiZSBzd2l0Y2hlZCBvbgorIyAgICAgICAgICAgICAgICAgd2l0aCBwbmdfc2V0X29wdGlvbgorIyBBUk1fTkVPTl9DSEVDSzogKFBOR19BUk1fTkVPTiA9PSAxKSBjb21waWxlIGEgcnVuLXRpbWUgY2hlY2sgdG8gc2VlIGlmIE5lb24KKyMgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMgYXJlIHN1cHBvcnRlZC4gVGhpcyBpcyBwb29ybHkgc3VwcG9ydGVkIGFuZAorIyAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZCAtIHVzZSB0aGUgcG5nX3NldF9vcHRpb24gQVBJLgorc2V0dGluZyBBUk1fTkVPTl9PUFQKK29wdGlvbiBBUk1fTkVPTl9BUEkgZGlzYWJsZWQgcmVxdWlyZXMgQUxJR05FRF9NRU1PUlkgZW5hYmxlcyBTRVRfT1BUSU9OLAorICAgc2V0cyBBUk1fTkVPTl9PUFQgMQorb3B0aW9uIEFSTV9ORU9OX0NIRUNLIGRpc2FibGVkIHJlcXVpcmVzIEFMSUdORURfTUVNT1JZLAorICAgc2V0cyBBUk1fTkVPTl9PUFQgMQorCisjIFRoZXNlIHNldHRpbmdzIGNvbmZpZ3VyZSB0aGUgZGVmYXVsdCBjb21wcmVzc2lvbiBsZXZlbCAoMC05KSBhbmQgJ3N0cmF0ZWd5JzsKKyMgc3RyYXRlZ3kgaXMgYXMgZGVmaW5lZCBieSB0aGUgaW1wbGVtZW50b3JzIG9mIHpsaWIuIEl0IGRlc2NyaWJlcyB0aGUgaW5wdXQKKyMgZGF0YSBhbmQgbW9kaWZpZXMgdGhlIHpsaWIgcGFyYW1ldGVycyBpbiBhbiBhdHRlbXB0IHRvIG9wdGltaXplIHRoZSBiYWxhbmNlCisjIGJldHdlZW4gc2VhcmNoIGFuZCBodWZmbWFuIGVuY29kaW5nIGluIHRoZSB6bGliIGFsZ29yaXRobXMuICBUaGUgZGVmYXVsdHMgYXJlCisjIHRoZSB6bGliLmggZGVmYXVsdHMgLSB0aGUgYXBwYXJlbnRseSByZWN1cnNpdmUgZGVmaW5pdGlvbiBkb2VzIG5vdCBhcmlzZQorIyBiZWNhdXNlIHRoZSBuYW1lIG9mIHRoZSBzZXR0aW5nIGlzIHByZWZpeGVkIGJ5IFBOR18KKyMKKyMgVGhlIFRFWFQgdmFsdWVzIGFyZSB0aGUgZGVmYXVsdHMgd2hlbiB3cml0aW5nIGNvbXByZXNzZWQgdGV4dCAoYWxsIGZvcm1zKQorCisjIEluY2x1ZGUgdGhlIHpsaWIgaGVhZGVyIHNvIHRoYXQgdGhlIGRlZmF1bHRzIGJlbG93IGFyZSBrbm93bgorQCMgIGluY2x1ZGUgPHpsaWIuaD4KKworIyBUaGUgJ0AnIGhlcmUgbWVhbnMgdG8gc3Vic3RpdHV0ZSB0aGUgdmFsdWUgd2hlbiBwbmdsaWJjb25mLmggaXMgYnVpbHQKK3NldHRpbmcgWl9ERUZBVUxUX0NPTVBSRVNTSU9OIGRlZmF1bHQgQFpfREVGQVVMVF9DT01QUkVTU0lPTgorIyBUT0RPOiB3aHkgYXJlbid0IHRoZXNlIFpfUkxFOyB6bGliLmggc2F5cyB0aGF0IFpfUkxFLCBzcGVjaWZpY2FsbHksIGlzCisjIGFwcHJvcHJpYXRlIGZvciBQTkcgaW1hZ2VzLCBtYXliZSBpdCBkb2Vzbid0IGV4aXN0IGluIGFsbCB2ZXJzaW9ucz8KK3NldHRpbmcgWl9ERUZBVUxUX1NUUkFURUdZIGRlZmF1bHQgQFpfRklMVEVSRUQKK3NldHRpbmcgWl9ERUZBVUxUX05PRklMVEVSX1NUUkFURUdZIGRlZmF1bHQgQFpfREVGQVVMVF9TVFJBVEVHWQorc2V0dGluZyBaTElCX1ZFUk5VTSBkZWZhdWx0IEBaTElCX1ZFUk5VTQorCisjIExpbmthZ2Ugb2Y6CisjCisjICBBUEk6ICAgICAgbGlicG5nIEFQSSBmdW5jdGlvbnMKKyMgIENBTExCQUNLOiBpbnRlcm5hbCBub24tZmlsZS1sb2NhbCBjYWxsYmFja3MKKyMgIEZVTkNUSU9OOiBpbnRlcm5hbCBub24tZmlsZS1sb2NhbCBmdW5jdGlvbnMKKyMgIERBVEE6ICAgICBpbnRlcm5hbCBub24tZmlsZS1sb2NhbCAoY29uc3QpIGRhdGEKK3NldHRpbmcgTElOS0FHRV9BUEkgZGVmYXVsdCBleHRlcm4KK3NldHRpbmcgTElOS0FHRV9DQUxMQkFDSyBkZWZhdWx0IGV4dGVybgorc2V0dGluZyBMSU5LQUdFX0ZVTkNUSU9OIGRlZmF1bHQgZXh0ZXJuCitzZXR0aW5nIExJTktBR0VfREFUQSBkZWZhdWx0IGV4dGVybgorCitzZXR0aW5nIFRFWFRfWl9ERUZBVUxUX0NPTVBSRVNTSU9OIGRlZmF1bHQgQFpfREVGQVVMVF9DT01QUkVTU0lPTgorc2V0dGluZyBURVhUX1pfREVGQVVMVF9TVFJBVEVHWSBkZWZhdWx0IEBaX0RFRkFVTFRfU1RSQVRFR1kKKworIyBEZWZhdWx0IHRvIHVzaW5nIHRoZSByZWFkIG1hY3JvcworCitzZXR0aW5nIERFRkFVTFRfUkVBRF9NQUNST1MgZGVmYXVsdCAxCisKKyMgVGhlIGFsdGVybmF0aXZlIGlzIHRvIGNhbGwgZnVuY3Rpb25zIHRvIHJlYWQgUE5HIHZhbHVlcywgaWYKKyMgdGhlIGZ1bmN0aW9ucyBhcmUgdHVybmVkICpvZmYqIHRoZSByZWFkIG1hY3JvcyBtdXN0IGFsd2F5cworIyBiZSBlbmFibGVkLCBzbyB0dXJuaW5nIHRoaXMgb2ZmIHdpbGwgYWN0dWFsbHkgZm9yY2UgdGhlCisjIFVTRV9SRUFEX01BQ1JPUyBvcHRpb24gb24gKHNlZSBwbmdjb25mLmgpCisKK29wdGlvbiBSRUFEX0lOVF9GVU5DVElPTlMgcmVxdWlyZXMgUkVBRAorCisjIFRoZSBzYW1lIGZvciB3cml0ZSwgYnV0IHRoZXNlIGNhbiBvbmx5IGJlIHN3aXRjaGVkIG9mZiBpZgorIyBubyB3cml0aW5nIGlzIHJlcXVpcmVkIGF0IGFsbCAtIGhlbmNlIHRoZSB1c2Ugb2YgYW4gJ2VuYWJsZXMnCisjIG5vdCBhICdyZXF1aXJlcycgYmVsb3c6CisKK29wdGlvbiBXUklURV9JTlRfRlVOQ1RJT05TIGRpc2FibGVkCitvcHRpb24gV1JJVEUgZW5hYmxlcyBXUklURV9JTlRfRlVOQ1RJT05TCisKKyMgRXJyb3IgY29udHJvbHMKKyMKKyMgV0FSTklOR1M6IG5vcm1hbGx5IG9uLCBpZiBvZmYgbm8gd2FybmluZ3MgYXJlIGdlbmVyYXRlZAorIyBFUlJPUl9URVhUOiBub3JtYWxseSBvbiwgaWYgb2ZmIGVycm9ycyBoYXBwZW4gYnV0IHRoZXJlIGlzIG5vIG1lc3NhZ2UKKyMgRVJST1JfTlVNQkVSUzogdW5pbXBsZW1lbnRlZCBmZWF0dXJlLCB0aGVyZWZvcmUgZGlzYWJsZWQKKyMgQkVOSUdOX0VSUk9SUzogc3VwcG9ydCBmb3IganVzdCBpc3N1aW5nIHdhcm5pbmdzIGZvciByZWNvdmVyYWJsZSBlcnJvcnMKKyMKKyMgQkVOSUdOX1JFQURfRVJST1JTOgorIyAgICAgQnkgZGVmYXVsdCByZWNvdmVyYWJsZSBlcnJvcnMgb24gcmVhZCBzaG91bGQganVzdCBnZW5lcmF0ZSB3YXJuaW5ncywKKyMgICAgIGdlbmVyYWxseSBzYWZlIGJ1dCBQTkcgZmlsZXMgdGhhdCBkb24ndCBjb25mb3JtIHRvIHRoZSBzcGVjaWZpY2F0aW9uIHdpbGwKKyMgICAgIGJlIGFjY2VwdGVkIGlmIGEgbWVhbmluZ2Z1bCByZXN1bHQgY2FuIGJlIHByb2R1Y2VkLgorIworIyBCRU5JR05fV1JJVEVfRVJST1JTOgorIyAgICAgQnkgZGVmYXVsdCByZWNvdmVyYWJsZSBlcnJvcnMgb24gd3JpdGUgc2hvdWxkIGp1c3QgZ2VuZXJhdGUgd2FybmluZ3MsCisjICAgICBub3QgZ2VuZXJhbGx5IHNhZmUgYmVjYXVzZSB0aGlzIGFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gd3JpdGUgaW52YWxpZAorIyAgICAgUE5HIGZpbGVzLiAgQXBwbGljYXRpb25zIHNob3VsZCBlbmFibGUgdGhpcyB0aGVtc2VsdmVzOyBpdCdzIHVzZWZ1bAorIyAgICAgYmVjYXVzZSBpdCBtZWFucyB0aGF0IGEgZmFpbHVyZSB0byB3cml0ZSBhbiBhbmNpbGxpYXJ5IGNodW5rIGNhbiBvZnRlbiBiZQorIyAgICAgaWdub3JlZC4KKworb3B0aW9uIFdBUk5JTkdTCitvcHRpb24gRVJST1JfVEVYVAorb3B0aW9uIEVSUk9SX05VTUJFUlMgZGlzYWJsZWQKKworb3B0aW9uIEJFTklHTl9FUlJPUlMKK29wdGlvbiBCRU5JR05fV1JJVEVfRVJST1JTIHJlcXVpcmVzIEJFTklHTl9FUlJPUlMgZGlzYWJsZWQKK29wdGlvbiBCRU5JR05fUkVBRF9FUlJPUlMgcmVxdWlyZXMgQkVOSUdOX0VSUk9SUworCisKKyMgR2VuZXJpYyBvcHRpb25zIC0gYWZmZWN0IGJvdGggcmVhZCBhbmQgd3JpdGUuCisKK29wdGlvbiBNTkdfRkVBVFVSRVMKKworIyBBcml0aG1ldGljIG9wdGlvbnMsIHRoZSBmaXJzdCBpcyB0aGUgYmlnIHN3aXRjaCB0aGF0IGNob29zZXMgYmV0d2VlbiBpbnRlcm5hbAorIyBmbG9hdGluZyBhbmQgZml4ZWQgcG9pbnQgYXJpdGhtZXRpYyBpbXBsZW1lbnRhdGlvbnMgLSBpdCBkb2VzIG5vdCBhZmZlY3QgYW55CisjIEFQSXMuICBUaGUgc2Vjb25kIHR3byAodGhlIF9QT0lOVCBzZXR0aW5ncykgc3dpdGNoIG9mZiBpbmRpdmlkdWFsIEFQSXMuCisjCisjIFByaW9yIHRvIGxpYnBuZyAxLjYuOCBvbmUgb2YgdGhlIEFQSSAoX1BPSU5UKSB2YXJpYW50cyBoYWQgdG8gYmUgc2VsZWN0ZWQuICBBdAorIyAxLjYuOCB0aGlzIHJlc3RyaWN0aW9uIGhhcyBiZWVuIHJlbW92ZWQ7IHRoZSBzaW1wbGlmaWVkIEFQSSBjYW4gYmUgdXNlZAorIyB3aXRob3V0IGVuYWJsaW5nIGFueSBvZiB0aGUgbG93IGxldmVsIGZpeGVkL2Zsb2F0aW5nIEFQSXMuCisKK29wdGlvbiBGTE9BVElOR19BUklUSE1FVElDCitvcHRpb24gRkxPQVRJTkdfUE9JTlQKK29wdGlvbiBGSVhFRF9QT0lOVAorCisjIFRoaXMgcHJvdGVjdHMgdXMgYWdhaW5zdCBjb21waWxlcnMgdGhhdCBydW4gb24gYSB3aW5kb3dpbmcgc3lzdGVtCisjIGFuZCB0aHVzIGRvbid0IGhhdmUgb3Igd291bGQgcmF0aGVyIHVzIG5vdCB1c2UgdGhlIHN0ZGlvIHR5cGVzOgorIyBzdGRpbiwgc3Rkb3V0LCBhbmQgc3RkZXJyLiAgVGhlIG9ubHkgb25lIGN1cnJlbnRseSB1c2VkIGlzIHN0ZGVycgorIyBpbiBwbmdfZXJyb3IoKSBhbmQgcG5nX3dhcm5pbmcoKS4gICNkZWZpbmluZyBQTkdfTk9fQ09OU09MRV9JTyB3aWxsCisjIHByZXZlbnQgdGhlc2UgZnJvbSBiZWluZyBjb21waWxlZCBhbmQgdXNlZC4gI2RlZmluaW5nIFBOR19OT19TVERJTworIyB3aWxsIGFsc28gcHJldmVudCB0aGVzZSwgcGx1cyB3aWxsIHByZXZlbnQgdGhlIGVudGlyZSBzZXQgb2Ygc3RkaW8KKyMgbWFjcm9zIGFuZCBmdW5jdGlvbnMgKEZJTEUgKiwgcHJpbnRmLCBldGMuKSBmcm9tIGJlaW5nIGNvbXBpbGVkIGFuZCB1c2VkLAorIyB1bmxlc3MgKFBOR19ERUJVRyA+IDApIGhhcyBiZWVuICNkZWZpbmVkLgorCitvcHRpb24gU1RESU8KK29wdGlvbiBDT05TT0xFX0lPIHJlcXVpcmVzIFNURElPCisKKyMgTm90ZTogcHJpb3IgdG8gMS41LjAgdGhpcyBvcHRpb24gY291bGQgbm90IGJlIGRpc2FibGVkIGlmIFNURElPCisjIHdhcyBlbmFibGVkLiAgUHJpb3IgdG8gMS41LjMgdGhpcyBvcHRpb24gcmVxdWlyZWQgU1RESU8KKworb3B0aW9uIFRJTUVfUkZDMTEyMworCisjIFBOR19TRVRKTVBfTk9UX1NVUFBPUlRFRCBpcyBhbiBvbGQgZXF1aXZhbGVudCBmb3IgTk9fU0VUSk1QCisKK29wdGlvbiBTRVRKTVAKKz0gTk9fU0VUSk1QIFNFVEpNUF9OT1RfU1VQUE9SVEVECisKKyMgSWYgdGhpcyBpcyBkaXNhYmxlZCBpdCBpcyBub3QgcG9zc2libGUgZm9yIGFwcHMgdG8gZ2V0IHRoZQorIyB2YWx1ZXMgZnJvbSB0aGUgJ2luZm8nIHN0cnVjdHVyZSwgdGhpcyBlZmZlY3RpdmVseSByZW1vdmVzCisjIHF1aXRlIGEgbG90IG9mIHRoZSBSRUFEIEFQSS4KKworb3B0aW9uIEVBU1lfQUNDRVNTCisKKyMgQWRkZWQgYXQgbGlicG5nLTEuMi4wCisKK29wdGlvbiBVU0VSX01FTQorCisjIEFkZGVkIGF0IGxpYnBuZy0xLjQuMAorCitvcHRpb24gSU9fU1RBVEUKKworIyBMaWJwbmcgbGltaXRzOiBsaW1pdCB0aGUgc2l6ZSBvZiBpbWFnZXMgYW5kIGRhdGEgb24gcmVhZC4KKyMKKyMgSWYgdGhpcyBvcHRpb24gaXMgZGlzYWJsZWQgYWxsIHRoZSBsaW1pdCBjaGVja2luZyBjb2RlIHdpbGwgYmUgZGlzYWJsZWQ6CisKK29wdGlvbiBVU0VSX0xJTUlUUyByZXF1aXJlcyBSRUFECisKKyMgVGhlIGRlZmF1bHQgc2V0dGluZ3MgZ2l2ZW4gYmVsb3cgZm9yIHRoZSBsaW1pdHMgbWVhbiB0aGF0IGxpYnBuZyB3aWxsCisjIGxpbWl0IHRoZSBzaXplIG9mIGltYWdlcyBvciB0aGUgc2l6ZSBvZiBkYXRhIGluIGFuY2lsbGlhcnkgY2h1bmtzIHRvIGxlc3MKKyMgdGhhbiB0aGUgc3BlY2lmaWNhdGlvbiBvciBpbXBsZW1lbnRhdGlvbiBsaW1pdHMuIFNldHRpbmdzIGhhdmUgdGhlCisjIGZvbGxvd2luZyBpbnRlcnByZXRhdGlvbnM6CisjCisjIFVTRVJfV0lEVEhfTUFYOiBtYXhpbXVtIHdpZHRoIG9mIGFuIGltYWdlIHRoYXQgd2lsbCBiZSByZWFkCisjIFVTRVJfSEVJR0hUX01BWDogbWF4aW11bSBoZWlnaHQKKyMgVVNFUl9DSFVOS19NQUxMT0NfTUFYOiBtYXhpbXVtIGluLW1lbW9yeSAoZGVjb21wcmVzc2VkKSBzaXplIG9mIGEgc2luZ2xlIGNodW5rCisjIFVTRVJfQ0hVTktfQ0FDSEVfTUFYOiBtYXhpbXVtIG51bWJlciBvZiBjaHVua3MgdG8gYmUgY2FjaGVkCisjCisjIE9ubHkgY2h1bmtzIHRoYXQgYXJlIHZhcmlhYmxlIGluIG51bWJlciBhcmUgY291bnRlZCB0b3dhcmRzIHRoZQorCisjIFVzZSAweDdmZmZmZmZmIGZvciB1bmxpbWl0ZWQKK3NldHRpbmcgVVNFUl9XSURUSF9NQVggZGVmYXVsdCAgICAgICAgMTAwMDAwMAorc2V0dGluZyBVU0VSX0hFSUdIVF9NQVggZGVmYXVsdCAgICAgICAxMDAwMDAwCisKKyMgVXNlIDAgZm9yIHVubGltaXRlZAorc2V0dGluZyBVU0VSX0NIVU5LX0NBQ0hFX01BWCBkZWZhdWx0ICAgICAxMDAwCitzZXR0aW5nIFVTRVJfQ0hVTktfTUFMTE9DX01BWCBkZWZhdWx0IDgwMDAwMDAKKworIyBJZiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkIEFQSXMgdG8gc2V0IHRoZSBhYm92ZSBsaW1pdHMgYXQgcnVuIHRpbWUgYXJlIGFkZGVkOworIyB3aXRob3V0IHRoaXMgdGhlIGhhcmR3aXJlZCAoY29tcGlsZSB0aW1lKSBsaW1pdHMgd2lsbCBiZSB1c2VkLgorb3B0aW9uIFNFVF9VU0VSX0xJTUlUUyByZXF1aXJlcyBVU0VSX0xJTUlUUworCisjIEFsbCBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnMgcmVsYXRlIHRvIGNvZGUgY2FwYWJpbGl0aWVzIGZvcgorIyBwcm9jZXNzaW5nIGltYWdlIGRhdGEgYmVmb3JlIGNyZWF0aW5nIGEgUE5HIG9yIGFmdGVyIHJlYWRpbmcgb25lLgorIyBZb3UgY2FuIHJlbW92ZSB0aGVzZSBjYXBhYmlsaXRpZXMgc2FmZWx5IGFuZCBzdGlsbCBiZSBQTkcKKyMgY29uZm9ybWFudCwgaG93ZXZlciB0aGUgbGlicmFyeSB0aGF0IHJlc3VsdHMgaXMgc3RpbGwgbm9uLXN0YW5kYXJkLgorIyBTZWUgdGhlIGNvbW1lbnRzIGFib3ZlIGFib3V0IGhvdyB0byBjaGFuZ2Ugb3B0aW9ucyBhbmQgc2V0dGluZ3MuCisKKyMgUkVBRCBvcHRpb25zCisjCisjIFdBUk5JTkc6IGluIGxpYnBuZyAxLjUgbWFpbnRhaW5lZCBjb25maWd1cmF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBlYXJsaWVyCisjIHZlcnNpb25zLiAgSW4gc29tZSBjYXNlcyB0dXJuaW5nIG9mZiBhbiBvcHRpb24gdHVybmVkIG9mZiBvdGhlciBvcHRpb25zLCBpbgorIyBvdGhlcnMgaXQgd2FzIGluZWZmZWN0aXZlIHVubGVzcyBkZXBlbmRlbnQgb3B0aW9ucyB3ZXJlIGFsc28gdHVybmVkIG9mZi4KKyMgTGlicG5nIDEuNiBjaGFuZ2VzIHRoaXM6IGluIGdlbmVyYWwgaWYgeW91IHR1cm4gb2ZmIGFuIG9wdGlvbiB0aGF0IGFmZmVjdHMKKyMgQVBJcyBpdCBzdGF5cyBvZmYgYW5kIHNpbXBseSBkaXNhYmxlcyBBUElzIHRoYXQgZGVwZW5kIG9uIGl0LgorIworIyBBcyBhIHJlc3VsdCBpZiB5b3Ugc2ltcGx5IHBvcnQgdGhlIGxpYnBuZyAxLjUgY29uZmlndXJhdGlvbiB0byBsaWJwbmcgMS42IHlvdQorIyB3aWxsIHByb2JhYmx5IHNlZSBidWlsZCBmYWlsdXJlcyBkdWUgdG8gbWlzc2luZyBBUElzLiAgRml4aW5nIHRoZXNlIGZhaWx1cmVzCisjIHJlcXVpcmVzIHNvbWUsIHBlcmhhcHMgY29uc2lkZXJhYmxlLCBrbm93bGVkZ2Ugb2Ygd2hhdCB5b3VyIGxpYnBuZyB1c2luZworIyBhcHBsaWNhdGlvbnMgYXJlIGRvaW5nLCBmb3J0dW5hdGVseSB0aGVyZSBpcyBubyBncmVhdCByZWFzb24gZm9yIHlvdSB0byBtb3ZlCisjIHRvIGxpYnBuZyAxLjY7IHRoZSBuZXcgaW50ZXJmYWNlcyBpbiAxLjYgd2lsbCB0YWtlIHNldmVyYWwgeWVhcnMgdG8gYmVjb21lCisjIHBvcHVsYXIuCisKK29wdGlvbiBSRUFEIGVuYWJsZXMgUkVBRF9JTlRFUkxBQ0lORyBTRVRfT1BUSU9OCisKKyMgRGlzYWJsaW5nIFJFQURfMTZCSVQgZG9lcyBub3QgZGlzYWJsZSByZWFkaW5nIDE2LWJpdCBQTkcgZmlsZXMsIGJ1dCBpdAorIyBmb3JjZXMgdGhlbSB0byBiZSBjaG9wcGVkIGRvd24gdG8gOC1iaXQsIGFuZCBkaXNhYmxlcyBhbnkgMTYtYml0CisjIHByb2Nlc3NpbmcgYWZ0ZXIgdGhhdCBoYXMgaGFwcGVuZWQuICBZb3UgbmVlZCB0byBiZSBzdXJlIHRvIGVuYWJsZQorIyBSRUFEX1NDQUxFXzE2X1RPXzggb3IgUkVBRF9TVFJJUF8xNl9UT184IHdoZW4geW91IGRpc2FibGUgUkVBRF8xNkJJVCBmb3IKKyMgdGhpcyB0byB3b3JrIHByb3Blcmx5LiAgWW91IHNob3VsZCBkaXNhYmxlIHRoZSBvdGhlciBvcHRpb24gaWYgeW91IG5lZWQgdG8KKyMgZW5zdXJlIGEgcGFydGljdWxhciBjb252ZXJzaW9uIChvdGhlcndpc2UgdGhlIGFwcCBjYW4gY2hvc2UuKQorCitvcHRpb24gUkVBRF8xNkJJVCByZXF1aXJlcyBSRUFEIGVuYWJsZXMgMTZCSVQKKworb3B0aW9uIFJFQURfUVVBTlRJWkUgcmVxdWlyZXMgUkVBRAorCitvcHRpb24gUkVBRF9UUkFOU0ZPUk1TIHJlcXVpcmVzIFJFQUQKKz0gTk9fUkVBRF9UUkFOU0ZPUk1TIFJFQURfVFJBTlNGT1JNU19OT1RfU1VQUE9SVEVECisKKyMgUmVhZCBnYW1tYSBoYW5kbGluZy4gIEdhbW1hIHByb2Nlc3NpbmcgaXMgYSBjb3JlIHBhcnQgb2YgbGlicG5nIGFuZCBtYW55IG9mCisjIHRoZSBjYXBhYmlsaXRpZXMgYXJlIGRlcGVuZGVudCBvbiBsaWJwbmcgcGVyZm9ybWluZyBnYW1tYSBjb3JyZWN0aW9uLgorIworIyBJbiBsaWJwbmcgMS42IGRpc2FibGluZyBnYW1tYSBwcm9jZXNzaW5nIChzZXR0aW5nIFBOR19OT19SRUFEX0dBTU1BKQorIyBjb25zaXN0ZW50bHkgZGlzYWJsZXMgdGhvc2UgcGFydHMgb2YgdGhlIEFQSSB0aGF0IGRlcGVuZCBvbiBpdC4gIFByaW9yIHRvCisjIDEuNi4wIHRoaXMgd2FzIG5vdCB0cnVlOyB0aGUgcmVzdWx0cyB3ZXJlIHVucHJlZGljdGFibGUgYW5kIHZhcmllZCBiZXR3ZWVuCisjIHJlbGVhc2VzLgorIworIyBJZiB5b3UgZGlzYWJsZSBnYW1tYSBwcm9jZXNzaW5nIGFuZCB5b3VyIHByb2dyYW0gbm8gbG9uZ2VyIGNvbXBpbGVzIHlvdSBuZWVkCisjIHRvIGFzayB3aGV0aGVyIHlvdSByZWFsbHkgbmVlZCB0aGUgQVBJcyB0aGF0IGFyZSBtaXNzaW5nLiAgSWYgeW91IGRvIHRoZW4geW91CisjIGFsbW9zdCBjZXJ0YWlubHkgbmVlZCB0aGUgZ2FtbWEgcHJvY2Vzc2luZy4KKyMKKyMgSWYgeW91IGhhbmRsZSBnYW1tYSBpc3N1ZXMgb3V0c2lkZSBsaWJwbmcgdGhlbiB5b3UgZG8gbm90IG5lZWQgdGhlIGxpYnBuZworIyBnYW1tYSBwcm9jZXNzaW5nOyBhbmQgaXQgaXMgYW4gZW5vcm1vdXMgd2FzdGUgb2Ygc3BhY2UuICBZb3UganVzdCBuZWVkIHRvCisjIHJlbW92ZSB0aGUgdXNlIG9mIGxpYnBuZyBBUElzIHRoYXQgZGVwZW5kIG9uIGl0Lgorb3B0aW9uIFJFQURfR0FNTUEgcmVxdWlyZXMgUkVBRF9UUkFOU0ZPUk1TLCBSRUFEX2dBTUEsIFJFQURfc1JHQgorCitvcHRpb24gUkVBRF9BTFBIQV9NT0RFIHJlcXVpcmVzIFJFQURfVFJBTlNGT1JNUywgUkVBRF9HQU1NQQorb3B0aW9uIFJFQURfQkFDS0dST1VORCByZXF1aXJlcyBSRUFEX1RSQU5TRk9STVMsIFJFQURfU1RSSVBfQUxQSEEsIFJFQURfR0FNTUEKK29wdGlvbiBSRUFEX0JHUiByZXF1aXJlcyBSRUFEX1RSQU5TRk9STVMKK29wdGlvbiBSRUFEX0VYUEFORF8xNiByZXF1aXJlcyBSRUFEX1RSQU5TRk9STVMsIFJFQURfMTZCSVQsIFJFQURfRVhQQU5ECitvcHRpb24gUkVBRF9FWFBBTkQgcmVxdWlyZXMgUkVBRF9UUkFOU0ZPUk1TCitvcHRpb24gUkVBRF9GSUxMRVIgcmVxdWlyZXMgUkVBRF9UUkFOU0ZPUk1TCitvcHRpb24gUkVBRF9HUkFZX1RPX1JHQiByZXF1aXJlcyBSRUFEX1RSQU5TRk9STVMKK29wdGlvbiBSRUFEX0lOVkVSVF9BTFBIQSByZXF1aXJlcyBSRUFEX1RSQU5TRk9STVMKK29wdGlvbiBSRUFEX0lOVkVSVCByZXF1aXJlcyBSRUFEX1RSQU5TRk9STVMKK29wdGlvbiBSRUFEX1BBQ0sgcmVxdWlyZXMgUkVBRF9UUkFOU0ZPUk1TCitvcHRpb24gUkVBRF9QQUNLU1dBUCByZXF1aXJlcyBSRUFEX1RSQU5TRk9STVMKK29wdGlvbiBSRUFEX1JHQl9UT19HUkFZIHJlcXVpcmVzIFJFQURfVFJBTlNGT1JNUywgUkVBRF9HQU1NQSBlbmFibGVzIENPTE9SU1BBQ0UKK29wdGlvbiBSRUFEX1NDQUxFXzE2X1RPXzggcmVxdWlyZXMgUkVBRF9UUkFOU0ZPUk1TCitvcHRpb24gUkVBRF9TSElGVCByZXF1aXJlcyBSRUFEX1RSQU5TRk9STVMKK29wdGlvbiBSRUFEX1NUUklQXzE2X1RPXzggcmVxdWlyZXMgUkVBRF9UUkFOU0ZPUk1TCitvcHRpb24gUkVBRF9TVFJJUF9BTFBIQSByZXF1aXJlcyBSRUFEX1RSQU5TRk9STVMKK29wdGlvbiBSRUFEX1NXQVBfQUxQSEEgcmVxdWlyZXMgUkVBRF9UUkFOU0ZPUk1TCitvcHRpb24gUkVBRF9TV0FQIHJlcXVpcmVzIFJFQURfVFJBTlNGT1JNUywgUkVBRF8xNkJJVAorb3B0aW9uIFJFQURfVVNFUl9UUkFOU0ZPUk0gcmVxdWlyZXMgUkVBRF9UUkFOU0ZPUk1TCisKK29wdGlvbiBQUk9HUkVTU0lWRV9SRUFEIHJlcXVpcmVzIFJFQUQKK29wdGlvbiBTRVFVRU5USUFMX1JFQUQgcmVxdWlyZXMgUkVBRAorCisjIFlvdSBjYW4gZGVmaW5lIFBOR19OT19QUk9HUkVTU0lWRV9SRUFEIGlmIHlvdSBkb24ndCBkbyBwcm9ncmVzc2l2ZSByZWFkaW5nLgorIyBUaGlzIGlzIG5vdCB0YWxraW5nIGFib3V0IGludGVybGFjaW5nIGNhcGFiaWxpdHkhICBZb3UnbGwgc3RpbGwgaGF2ZQorIyBpbnRlcmxhY2luZyB1bmxlc3MgeW91IHR1cm4gb2ZmIHRoZSBmb2xsb3dpbmcgd2hpY2ggaXMgcmVxdWlyZWQKKyMgZm9yIFBORy1jb21wbGlhbnQgZGVjb2RlcnMuICAoSW4gb3RoZXIgd29yZHMsIGRvIG5vdCBkbyB0aGlzIC0gaW4KKyMgZmFjdCBpdCBjYW4ndCBiZSBkaXNhYmxlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUhKQorI29wdGlvbiBSRUFEX0lOVEVSTEFDSU5HIHJlcXVpcmVzIFJFQUQKKworb3B0aW9uIFJFQURfQ09NUE9TSVRFX05PRElWIHJlcXVpcmVzIFJFQUQKKz0gTk9fUkVBRF9DT01QT1NJVEVfTk9ESVYgTk9fUkVBRF9DT01QT1NJVEVEX05PRElWCisKKyMgSW5jaCBjb252ZXJzaW9ucworCitvcHRpb24gSU5DSF9DT05WRVJTSU9OUworPSBJTkNIX0NPTlZFUlNJT05TIElOQ0hfQ09OVkVSU0lPTlMKKworIyBBUEkgdG8gYnVpbGQgYSBncmF5c2NhbGUgcGFsZXR0ZQorIyBOT1RFOiB0aGlzIGlzIG5vdCB1c2VkIGludGVybmFsbHkgYnkgbGlicG5nIGF0IHByZXNlbnQuCisKK29wdGlvbiBCVUlMRF9HUkFZU0NBTEVfUEFMRVRURQorCisjIFdSSVRFIG9wdGlvbnMKKworb3B0aW9uIFdSSVRFCisKKyMgRGlzYWJsaW5nIFdSSVRFXzE2QklUIHByZXZlbnRzIDE2LWJpdCBQTkcgZmlsZXMgZnJvbSBiZWluZworIyBnZW5lcmF0ZWQuCitvcHRpb24gV1JJVEVfMTZCSVQgcmVxdWlyZXMgV1JJVEUgZW5hYmxlcyAxNkJJVAorCitvcHRpb24gV1JJVEVfVFJBTlNGT1JNUyByZXF1aXJlcyBXUklURQorPSBOT19XUklURV9UUkFOU0ZPUk1TIFdSSVRFX1RSQU5TRk9STVNfTk9UX1NVUFBPUlRFRAorCitvcHRpb24gV1JJVEVfU0hJRlQgcmVxdWlyZXMgV1JJVEVfVFJBTlNGT1JNUworb3B0aW9uIFdSSVRFX1BBQ0sgcmVxdWlyZXMgV1JJVEVfVFJBTlNGT1JNUworb3B0aW9uIFdSSVRFX0JHUiByZXF1aXJlcyBXUklURV9UUkFOU0ZPUk1TCitvcHRpb24gV1JJVEVfU1dBUCByZXF1aXJlcyBXUklURV9UUkFOU0ZPUk1TLCBXUklURV8xNkJJVAorb3B0aW9uIFdSSVRFX1BBQ0tTV0FQIHJlcXVpcmVzIFdSSVRFX1RSQU5TRk9STVMKK29wdGlvbiBXUklURV9JTlZFUlQgcmVxdWlyZXMgV1JJVEVfVFJBTlNGT1JNUworb3B0aW9uIFdSSVRFX0ZJTExFUiByZXF1aXJlcyBXUklURV9UUkFOU0ZPUk1TCitvcHRpb24gV1JJVEVfU1dBUF9BTFBIQSByZXF1aXJlcyBXUklURV9UUkFOU0ZPUk1TCitvcHRpb24gV1JJVEVfSU5WRVJUX0FMUEhBIHJlcXVpcmVzIFdSSVRFX1RSQU5TRk9STVMKK29wdGlvbiBXUklURV9VU0VSX1RSQU5TRk9STSByZXF1aXJlcyBXUklURV9UUkFOU0ZPUk1TCisKKyMgVGhpcyBpcyBub3QgcmVxdWlyZWQgZm9yIFBORy1jb21wbGlhbnQgZW5jb2RlcnMsIGJ1dCBjYW4gY2F1c2UKKyMgdHJvdWJsZSBpZiBsZWZ0IHVuZGVmaW5lZAorCitvcHRpb24gV1JJVEVfSU5URVJMQUNJTkcgcmVxdWlyZXMgV1JJVEUKKworIyBEZXByZWNhdGVkLCB3aWxsIGJlIHJlbW92ZWQuCitvcHRpb24gV1JJVEVfV0VJR0hURURfRklMVEVSIHJlcXVpcmVzIFdSSVRFCisKK29wdGlvbiBXUklURV9GTFVTSCByZXF1aXJlcyBXUklURQorCisjIE5vdGU6IHRoZXNlIGNhbiBiZSB0dXJuZWQgb2ZmIGV4cGxpY2l0bHkgaWYgbm90IHJlcXVpcmVkIGJ5IHRoZQorIyBhcHBzIGltcGxlbWVudGluZyB0aGUgdXNlciB0cmFuc2Zvcm1zCitvcHRpb24gVVNFUl9UUkFOU0ZPUk1fUFRSIGlmIFJFQURfVVNFUl9UUkFOU0ZPUk0sIFdSSVRFX1VTRVJfVFJBTlNGT1JNCitvcHRpb24gVVNFUl9UUkFOU0ZPUk1fSU5GTyBpZiBSRUFEX1VTRVJfVFJBTlNGT1JNLCBXUklURV9VU0VSX1RSQU5TRk9STQorCisjIFRoaXMgZW5hYmxlcyBBUEkgdG8gc2V0IGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgZm9yIGNvbXByZXNzaW5nCisjIG5vbi1JREFUIGNodW5rcyAoelRYdCwgaVRYdCwgaUNDUCwgYW5kIHVua25vd24gY2h1bmtzKS4gIFRoaXMgZmVhdHVyZQorIyB3YXMgYWRkZWQgYXQgbGlicG5nLTEuNS4zLgorb3B0aW9uIFdSSVRFX0NVU1RPTUlaRV9aVFhUX0NPTVBSRVNTSU9OIHJlcXVpcmVzIFdSSVRFCitvcHRpb24gV1JJVEVfQ1VTVE9NSVpFX0NPTVBSRVNTSU9OIHJlcXVpcmVzIFdSSVRFCisKKyMgQW55IGNodW5rcyB5b3UgYXJlIG5vdCBpbnRlcmVzdGVkIGluLCB5b3UgY2FuIHVuZGVmIGhlcmUuICBUaGUKKyMgb25lcyB0aGF0IGFsbG9jYXRlIG1lbW9yeSBtYXkgYmUgZXhwZWNpYWxseSBpbXBvcnRhbnQgKGhJU1QsCisjIHRFWHQsIHpUWHQsIHRSTlMsIHBDQUwpLiAgT3RoZXJzIHdpbGwganVzdCBzYXZlIHRpbWUgYW5kIG1ha2UgcG5nX2luZm8KKyMgYSBiaXQgc21hbGxlci4KKworIyBUaGUgc2l6ZSBvZiB0aGUgcG5nX3RleHQgc3RydWN0dXJlIGNoYW5nZWQgaW4gbGlicG5nLTEuMC42IHdoZW4KKyMgaVRYdCBzdXBwb3J0IHdhcyBhZGRlZC4gIGlUWHQgc3VwcG9ydCB3YXMgdHVybmVkIG9mZiBieSBkZWZhdWx0IHRocm91Z2gKKyMgbGlicG5nLTEuMi54LCB0byBzdXBwb3J0IG9sZCBhcHBzIHRoYXQgbWFsbG9jIHRoZSBwbmdfdGV4dCBzdHJ1Y3R1cmUKKyMgaW5zdGVhZCBvZiBjYWxsaW5nIHBuZ19zZXRfdGV4dCgpIGFuZCBsZXR0aW5nIGxpYnBuZyBtYWxsb2MgaXQuICBJdAorIyB3YXMgdHVybmVkIG9uIGJ5IGRlZmF1bHQgaW4gbGlicG5nLTEuNC4wLgorCitvcHRpb24gUkVBRF9BTkNJTExBUllfQ0hVTktTIHJlcXVpcmVzIFJFQUQKKyMgUE5HX1JFQURfQU5DSUxMQVJZX0NIVU5LU19OT1RfU1VQUE9SVEVEIGlzIGRlcHJlY2F0ZWQuCis9IE5PX1JFQURfQU5DSUxMQVJZX0NIVU5LUyBSRUFEX0FOQ0lMTEFSWV9DSFVOS1NfTk9UX1NVUFBPUlRFRAorCitvcHRpb24gV1JJVEVfQU5DSUxMQVJZX0NIVU5LUyByZXF1aXJlcyBXUklURQorIyBQTkdfV1JJVEVfQU5DSUxMQVJZX0NIVU5LU19OT1RfU1VQUE9SVEVEIGlzIGRlcHJlY2F0ZWQuCis9IE5PX1dSSVRFX0FOQ0lMTEFSWV9DSFVOS1MgV1JJVEVfQU5DSUxMQVJZX0NIVU5LU19OT1RfU1VQUE9SVEVECisKKyMgVGhlc2Ugb3B0aW9ucyBkaXNhYmxlICphbGwqIHRoZSB0ZXh0IGNodW5rcyBpZiB0dXJuZWQgb2ZmCisKK29wdGlvbiBSRUFEX1RFWFQgcmVxdWlyZXMgUkVBRF9BTkNJTExBUllfQ0hVTktTIGVuYWJsZXMgVEVYVAorb3B0aW9uIFdSSVRFX1RFWFQgcmVxdWlyZXMgV1JJVEVfQU5DSUxMQVJZX0NIVU5LUyBlbmFibGVzIFRFWFQKKworIyBNb3ZlZCB0byBwbmdsaWJjb25mLmggYXQgbGlicG5nLTEuNS4wCisjIEZlYXR1cmUgc3VwcG9ydDogaW4gMS40IHRoaXMgd2FzIGluIHBuZ2NvbmYuaCwgYnV0IHRoZSBmb2xsb3dpbmcKKyMgZmVhdHVyZXMgaGF2ZSBubyBhZmZlY3Qgb24gdGhlIGxpYnBuZyBBUEkuICBBZGQgbGlicmFyeQorIyBvbmx5IGZlYXR1cmVzIHRvIHRoZSBlbmQgb2YgdGhpcyBsaXN0LiAgQWRkIGZlYXR1cmVzIHRoYXQKKyMgYWZmZWN0IHRoZSBBUEkgYWJvdmUuICAoTm90ZTogdGhlIGxpc3Qgb2YgY2h1bmtzIGZvbGxvd3MKKyMgdGhlIGxpYnJhcnktb25seSBzZXR0aW5ncy4pCisjCisjIEJVSUxEIFRJTUUgT05MWSBPUFRJT05TCisjICAgVGhlc2Ugb3B0aW9ucyBkbyBub3QgYWZmZWN0IHRoZSBBUEkgYnV0IHJhdGhlciBhbHRlciBob3cgdGhlCisjICAgQVBJIGlzIGltcGxlbWVudGVkLCB0aGV5IGdldCByZWNvcmRlZCBpbiBwbmdsaWJjb25mLmgsIGJ1dAorIyAgIGNhbid0IGJlIGNoYW5nZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorCisjIENvbG9yc3BhY2Ugc3VwcG9ydCAoZW5hYmxlZCBhcyByZXF1aXJlZCk7IGp1c3QgdGhlIHN1cHBvcnQgZm9yIGNvbG9yYW50CisjIGluZm9ybWF0aW9uLiAgR2FtbWEgc3VwcG9ydCwgbGlrZXdpc2UsIGlzIGp1c3Qgc3VwcG9ydCBmb3IgdGhlIGdhbW1hCisjIGluZm9ybWF0aW9uLCBSRUFEX0dBTU1BIGlzIHJlcXVpcmVkIGZvciBnYW1tYSB0cmFuc2Zvcm1hdGlvbnMgKHNvIGl0CisjIGlzIHBvc3NpYmxlIHRvIHJlYWQgUE5HIGdhbW1hIHdpdGhvdXQgZW5hYmxpbmcgYWxsIHRoZSBsaWJwbmcgdHJhbnNmb3JtCisjIGNvZGUgLSBkbyB0aGlzIGZvciBhcHBsaWNhdGlvbnMgdGhhdCBkbyB0aGVpciBvd24gZ2FtbWEgcHJvY2Vzc2luZykKKyMKKyMgQXMgb2YgMS42LjAgQ09MT1JTUEFDRSBpcyBvbmx5IHVzZWZ1bCBpZiB0aGUgYXBwbGljYXRpb24gcHJvY2Vzc2VzIHRoZQorIyBpbmZvcm1hdGlvbjsgdGhpcyBpcyBiZWNhdXNlIHRoZSBsaWJyYXJ5IGRvZXMgbm90IGRvIGFueSBjb2xvcnNwYWNlCisjIHByb2Nlc3NpbmcsIGl0IGp1c3QgdmFsaWRhdGVzIHRoZSBkYXRhIGluIHRoZSBQTkcgZmlsZS4KKworb3B0aW9uIEdBTU1BIGRpc2FibGVkCitvcHRpb24gQ09MT1JTUEFDRSBlbmFibGVzIEdBTU1BIGRpc2FibGVkCisKKyMgV2hlbiBhbiBJQ0MgcHJvZmlsZSBpcyByZWFkLCBvciBwbmdfc2V0LCBpdCB3aWxsIGJlIGNoZWNrZWQgZm9yIGEgbWF0Y2gKKyMgYWdhaW5zdCBrbm93biBzUkdCIHByb2ZpbGVzIGlmIHRoZSBzUkdCIGhhbmRsaW5nIGlzIGVuYWJsZWQuICBUaGUKKyMgUE5HX3NSR0JfUFJPRklMRV9DSEVDS1Mgc2V0dGluZyBjb250cm9scyBob3cgbXVjaCB3b3JrIGlzIGRvbmUgZHVyaW5nIHRoZQorIyBjaGVjazoKKyMKKyMgLTE6IERvbid0IGRvIGFueSBzUkdCIHByb2ZpbGUgY2hlY2tpbmcuCisjCisjICAwOiBKdXN0IHZhbGlkYXRlIHRoZSBwcm9maWxlIE1ENSBzaWduYXR1cmUgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIHVzZQorIyAgICAgdGhlIGNoZWNrcyBpbiBvcHRpb24gMS4KKyMKKyMgIDE6IEFkZGl0aW9uYWxseSBjaGVjayB0aGUgbGVuZ3RoLCBpbnRlbnQgYW5kIGFkbGVyMzIgY2hlY2tzdW0gb2YgdGhlCisjICAgICBhY3R1YWwgZGF0YS4gICBJZiBlbmFibGVkIHRoaXMgd2lsbCByZWplY3Qga25vd24gcHJvZmlsZXMgdGhhdCBoYXZlCisjICAgICBoYWQgdGhlIHJlbmRlcmluZyBpbnRlbnQgaW4gdGhlIGhlYWRlciBjaGFuZ2VkIGFzIHdlbGwgYXMgb3RoZXIgZWRpdHMKKyMgICAgIGRvbmUgd2l0aG91dCB1cGRhdGluZyB0aGUgY2hlY2tzdW0uICBTZWUgdGhlIGRpc2N1c3Npb24gYmVsb3cuCisjCisjICAyOiBBZGRpdGlvbmFsbHkgY2hlY2tzdW0gYWxsIHRoZSBkYXRhIHVzaW5nIHRoZSBldGhlcm5ldCBDUkMzMiBhbGdvcml0aG0uCisjICAgICBUaGlzIG1ha2VzIGl0IG1vcmUgZGlmZmljdWx0IHRvIGZha2UgcHJvZmlsZXMgYW5kIG1ha2VzIGl0IGxlc3MgbGlrZWx5CisjICAgICB0byBnZXQgYSBmYWxzZSBwb3NpdGl2ZSBvbiBwcm9maWxlcyB3aXRoIG5vIHNpZ25hdHVyZSwgYnV0IGlzIHByb2JhYmx5CisjICAgICBqdXN0IGEgd2FzdGUgb2YgdGltZSBzaW5jZSBhbGwgY3VycmVudGx5IGFwcHJvdmVkIElDQyBzUkdCIHByb2ZpbGVzIGhhdmUKKyMgICAgIGEgc2VjdXJlIE1ENSBzaWduYXR1cmUuCisjCisjIFRoZSByZW5kZXJpbmcgaW50ZW50LiAgQW4gSUNDIHByb2ZpbGUgc3RvcmVzIGFuIGludGVuZGVkIHJlbmRlcmluZyBpbnRlbnQsCisjIGJ1dCBkb2VzIG5vdCBpbmNsdWRlIHRoZSB2YWx1ZSBpbiB0aGUgc2lnbmF0dXJlLiAgVGhlIGludGVudCBpcyBkb2N1bWVudGVkCisjIGFzIHRoZSBpbnRlbnQgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIGNvbWJpbmluZyB0d28gcHJvZmlsZXMuICBUaGUgc1JHQgorIyBwcm9maWxlIGlzIGludGVuZGVkLCBob3dldmVyLCB0byBiZSB1c2VkIHdpdGggYW55IG9mIHRoZSBmb3VyIGRlZmluZWQgaW50ZW50cy4KKyMgRm9yIHRoaXMgcmVhc29uIHRoZSBzUkdCIGNodW5rIGluY2x1ZGVzIGFuICdpbnRlbnQnIHRvIGJlIHVzZWQgd2hlbiBkaXNwbGF5aW5nCisjIHRoZSBpbWFnZSAoaW50ZW50IGlzIHJlYWxseSBhIHByb3BlcnR5IG9mIHRoZSBpbWFnZSBub3QgdGhlIHByb2ZpbGUuKQorIworIyBVbmZvcnR1bmF0ZWx5IHRoZSBpQ0NQIGNodW5rIGRvZXMgbm90LiAgSXQgbWF5IHRoZXJlZm9yZSBiZSB0aGF0IHNvbWUKKyMgYXBwbGljYXRpb25zIG1vZGlmeSB0aGUgaW50ZW50IGluIHByb2ZpbGVzIChpbmNsdWRpbmcgc1JHQiBwcm9maWxlcykgdG8gd29yaworIyByb3VuZCB0aGlzIHByb2JsZW0uICBTZWxlY3RpbmcgYW4gb3B0aW9uIG90aGVyIHRoYW4gb3B0aW9uICcwJyB3aWxsIGNhdXNlIHN1Y2gKKyMgbW9kaWZpZWQgcHJvZmlsZXMgdG8gYmUgcmVqZWN0ZWQuCisjCisjIFNlY3VyaXR5LiAgVGhlIHVzZSBvZiBBZGxlcjMyIGFuZCBDUkMzMiBjaGVja3N1bXMgZG9lcyBub3QgaGVscCBzaWduaWZpY2FudGx5CisjIHdpdGggYW55IHNlY3VyaXR5IGlzc3Vlcy4gIEl0IGlzIHJlbGF0aXZlbHkgZWFzeSB0byBwcm9kdWNlIGFyYml0cmFyeSBwcm9maWxlcworIyB3aXRoIHRoZSByZXF1aXJlZCBjaGVja3N1bXMgb24gY3VycmVudCBjb21wdXRlciBzeXN0ZW1zLiAgTmV2ZXJ0aGVsZXNzCisjIHNlY3VyaXR5IGRvZXMgbm90IHNlZW0gdG8gYmUgYW4gaXNzdWUgYmVjYXVzZSB0aGUgb25seSBjb25zZXF1ZW5jZSBvZiBhIGZhbHNlCisjIHBvc2l0aXZlIGlzIGEgZmFsc2UgYXNzZXJ0aW9uIHRoYXQgdGhlIHByb2ZpbGUgaXMgYW4gc1JHQiBwcm9maWxlLiAgVGhpcyBtaWdodAorIyBiZSB1c2VkIHRvIGhpZGUgZGF0YSBmcm9tIGxpYnBuZyB1c2luZyBhcHBsaWNhdGlvbnMsIGJ1dCBpdCBkb2Vzbid0IHNlZW0KKyMgcG9zc2libGUgdG8gZGFtYWdlIHRoZW0uCisKK3NldHRpbmcgc1JHQl9QUk9GSUxFX0NIRUNLUyBkZWZhdWx0IDIKKworIyBBcnRpZmljaWFsbHkgYWxpZ24gbWVtb3J5IC0gdGhlIGNvZGUgdHlwaWNhbGx5IGFsaWducyB0byA4IGJ5dGUKKyMgYm91bmRhcmllcyBpZiB0aGlzIGlzIHN3aXRjaGVkIG9uLCBpdCdzIGEgc21hbGwgd2FzdGUgb2Ygc3BhY2UKKyMgYnV0IGNhbiBoZWxwIChpbiB0aGVvcnkpIG9uIHNvbWUgYXJjaGl0ZWN0dXJlcy4gIE9ubHkgYWZmZWN0cworIyBpbnRlcm5hbCBzdHJ1Y3R1cmVzLiAgQWRkZWQgYXQgbGlicG5nIDEuNC4wCisKK29wdGlvbiBBTElHTkVEX01FTU9SWQorCisjIEJ1Z2d5IGNvbXBpbGVycyAoZS5nLiwgZ2NjIDIuNy4yLjIpIG5lZWQgUE5HX05PX1BPSU5URVJfSU5ERVhJTkcKKyMgU2VlIHBuZ1t3cl11dGlsLmMsIG5vcm1hbGx5IHRoaXMgc2hvdWxkIGFsd2F5cyBiZSAqb24qCisKK29wdGlvbiBQT0lOVEVSX0lOREVYSU5HCisKKyMgT3RoZXIgZGVmaW5lcyBmb3IgdGhpbmdzIGxpa2UgbWVtb3J5IGFuZCB0aGUgbGlrZSBjYW4gZ28gaGVyZS4KKworIyBCVUlMRCBUSU1FIFNFVFRJTkdTCisjIExpa2UgYnVpbGQgdGltZSBvcHRpb25zIHRoZXNlIGRvIG5vdCBhZmZlY3QgdGhlIEFQSSwgYnV0IHRoZXkKKyMgbWF5IGJlIHVzZWZ1bCB0byBhcHBsaWNhdGlvbnMgYmVjYXVzZSB0aGV5IHJlY29yZCBkZXRhaWxzIG9mCisjIGhvdyB0aGUgQVBJIHdpbGwgYmVoYXZlIHBhcnRpY3VsYXJseSB3aXRoIHJlZ2FyZCB0byBvdmVyYWxsCisjIGFjY3VyYWN5LgorCisjIFRoaXMgY29udHJvbHMgaG93IGZpbmUgdGhlIHF1YW50aXppbmcgZ2V0cy4gIEFzIHRoaXMgYWxsb2NhdGVzCisjIGEgbGFyZ2lzaCBjaHVuayBvZiBtZW1vcnkgKDMySyksIHRob3NlIHdobyBhcmUgbm90IGFzIGNvbmNlcm5lZAorIyB3aXRoIHF1YW50aXppbmcgcXVhbGl0eSBjYW4gZGVjcmVhc2Ugc29tZSBvciBhbGwgb2YgdGhlc2UuCisKK3NldHRpbmcgUVVBTlRJWkVfUkVEX0JJVFMgZGVmYXVsdCA1CitzZXR0aW5nIFFVQU5USVpFX0dSRUVOX0JJVFMgZGVmYXVsdCA1CitzZXR0aW5nIFFVQU5USVpFX0JMVUVfQklUUyBkZWZhdWx0IDUKKworIyBUaGlzIGNvbnRyb2xzIGhvdyBmaW5lIHRoZSBnYW1tYSBjb3JyZWN0aW9uIGJlY29tZXMgd2hlbiB5b3UKKyMgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiA4IGJpdHMgYW55d2F5LiAgSW5jcmVhc2luZyB0aGlzIHZhbHVlCisjIHJlc3VsdHMgaW4gbW9yZSBtZW1vcnkgYmVpbmcgdXNlZCwgYW5kIG1vcmUgcG93KCkgZnVuY3Rpb25zCisjIGJlaW5nIGNhbGxlZCB0byBmaWxsIGluIHRoZSBnYW1tYSB0YWJsZXMuICBEb24ndCBzZXQgdGhpcyB2YWx1ZQorIyBsZXNzIHRoYW4gOCwgYW5kIGV2ZW4gdGhhdCBtYXkgbm90IHdvcmsgKEkgaGF2ZW4ndCB0ZXN0ZWQgaXQpLgorCitzZXR0aW5nIE1BWF9HQU1NQV84IGRlZmF1bHQgMTEKKworIyBUaGlzIGNvbnRyb2xzIGhvdyBtdWNoIGEgZGlmZmVyZW5jZSBpbiBnYW1tYSB3ZSBjYW4gdG9sZXJhdGUgYmVmb3JlCisjIHdlIGFjdHVhbGx5IHN0YXJ0IGRvaW5nIGdhbW1hIGNvbnZlcnNpb24sIGl0J3MgYSBmaXhlZCBwb2ludCB2YWx1ZSwKKyMgc28gdGhlIGRlZmF1bHQgYmVsb3cgaXMgMC4wNSwgbWVhbmluZyBsaWJwbmcgaWdub3JlcyBjb3JyZWN0aW9ucyBpbgorIyB0aGUgcmFuZ2UgMC45NSB0byAxLjA1CisKK3NldHRpbmcgR0FNTUFfVEhSRVNIT0xEX0ZJWEVEIGRlZmF1bHQgNTAwMAorCisjIFByZWNpc2lvbiB0byB1c2Ugd2hlbiBjb252ZXJ0aW5nIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUgdG8gYSBQTkcKKyMgZXh0ZW5zaW9uIGZvcm1hdCBzdHJpbmcgaW4gYW4gc0NBTCBjaHVuayAob25seSByZWxldmFudCBpZiB0aGUKKyMgZmxvYXRpbmcgcG9pbnQgQVBJIGlzIGVuYWJsZWQpCisKK3NldHRpbmcgc0NBTF9QUkVDSVNJT04gZGVmYXVsdCA1CisKKyMgVGhpcyBpcyB0aGUgc2l6ZSBvZiB0aGUgY29tcHJlc3Npb24gYnVmZmVyLCBhbmQgdGh1cyB0aGUgc2l6ZSBvZgorIyBhbiBJREFUIGNodW5rLiAgTWFrZSB0aGlzIHdoYXRldmVyIHNpemUgeW91IGZlZWwgaXMgYmVzdCBmb3IgeW91cgorIyBtYWNoaW5lLiAgT25lIG9mIHRoZXNlIHdpbGwgYmUgYWxsb2NhdGVkIHBlciBwbmdfc3RydWN0LiAgV2hlbiB0aGlzCisjIGlzIGZ1bGwsIGl0IHdyaXRlcyB0aGUgZGF0YSB0byB0aGUgZGlzaywgYW5kIGRvZXMgc29tZSBvdGhlcgorIyBjYWxjdWxhdGlvbnMuICBNYWtpbmcgdGhpcyBhbiBleHRyZW1lbHkgc21hbGwgc2l6ZSBtYXkgc2xvdworIyB0aGUgbGlicmFyeSBkb3duLCBidXQgeW91IG1heSB3YW50IHRvIGV4cGVyaW1lbnQgdG8gZGV0ZXJtaW5lCisjIHdoZXJlIGl0IGJlY29tZXMgc2lnbmlmaWNhbnQsIGlmIHlvdSBhcmUgY29uY2VybmVkIHdpdGggbWVtb3J5CisjIHVzYWdlLiAgTm90ZSB0aGF0IHpsaWIgYWxsb2NhdGVzIGF0IGxlYXN0IDMyS2IgYWxzby4gIEZvciByZWFkZXJzLAorIyB0aGlzIGRlc2NyaWJlcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGF2YWlsYWJsZSB0byByZWFkIHRoZSBkYXRhIGluLgorIyBVbmxlc3MgdGhpcyBnZXRzIHNtYWxsZXIgdGhhbiB0aGUgc2l6ZSBvZiBhIHJvdyAoY29tcHJlc3NlZCksCisjIGl0IHNob3VsZCBub3QgbWFrZSBtdWNoIGRpZmZlcmVuY2UgaG93IGJpZyB0aGlzIGlzLgorCitzZXR0aW5nIFpCVUZfU0laRSBkZWZhdWx0IDgxOTIKKworIyBUaGlzIGlzIHRoZSBzaXplIG9mIHRoZSBkZWNvbXByZXNzaW9uIGJ1ZmZlciB1c2VkIHdoZW4gY291bnRpbmcgb3IgY2hlY2tpbmcKKyMgdGhlIGRlY29tcHJlc3NlZCBzaXplIG9mIGFuIExaIHN0cmVhbSBmcm9tIGEgY29tcHJlc3NlZCBhbmNpbGxpYXJ5IGNodW5rOyB0aGUKKyMgZGVjb21wcmVzc2VkIGRhdGEgaXMgbmV2ZXIgdXNlZCBzbyBhIGRpZmZlcmVudCBzaXplIG1heSBiZSBvcHRpbWFsLiAgVGhpcyBzaXplCisjIHdhcyBkZXRlcm1pbmVkIHVzaW5nIGNvbnRyaWIvbGlidGVzdHMvdGltZXBuZy5jIHdpdGggY29tcHJlc3NlZCB6VFh0IGRhdGEKKyMgYXJvdW5kIDExTUJ5dGUgaW4gc2l6ZS4gIFNsaWdodCBzcGVlZCBpbXByb3ZlbWVudHMgKHVwIHRvIGFib3V0IDE0JSBpbgorIyB0aW1lcG5nKSBjYW4gYmUgYWNoaWV2ZWQgYnkgdmVyeSBsYXJnZSBpbmNyZWFzZXMgKHRvIDMya2J5dGUpIG9uIHJlZ3VsYXIgZGF0YSwKKyMgYnV0IGhpZ2hseSBjb21wcmVzc2libGUgZGF0YSBzaG93cyBvbmx5IGFyb3VuZCAyJSBpbXByb3ZlbWVudC4gICBUaGUgc2l6ZSBpcworIyBjaG9zZW4gdG8gbWluaW1pemUgdGhlIGVmZmVjdHMgb2YgRG9TIGF0dGFja3MgYmFzZWQgb24gdXNpbmcgdmVyeSBsYXJnZQorIyBhbW91bnRzIG9mIGhpZ2hseSBjb21wcmVzc2libGUgZGF0YS4KKworc2V0dGluZyBJTkZMQVRFX0JVRl9TSVpFIGRlZmF1bHQgMTAyNAorCisjIFRoaXMgaXMgdGhlIG1heGltdW0gYW1vdW50IG9mIElEQVQgZGF0YSB0aGF0IHRoZSBzZXF1ZW50aWFsIHJlYWRlciB3aWxsCisjIHByb2Nlc3MgYXQgb25lIHRpbWUuICBUaGUgc2V0dGluZyBkb2VzIG5vdCBhZmZlY3QgdGhlIHNpemUgb2YgSURBVCBjaHVua3MKKyMgcmVhZCwganVzdCB0aGUgYW1vdW50IHJlYWQgYXQgb25jZS4gIE5laXRoZXIgZG9lcyBpdCBhZmZlY3QgdGhlIHByb2dyZXNzaXZlCisjIHJlYWRlciwgd2hpY2ggcHJvY2Vzc2VzIGp1c3QgdGhlIGFtb3VudCBvZiBkYXRhIHRoZSBhcHBsaWNhdGlvbiBnaXZlcyBpdC4KKyMgVGhlIHNlcXVlbnRpYWwgcmVhZGVyIGlzIGN1cnJlbnRseSB1bmFibGUgdG8gcHJvY2VzcyBtb3JlIHRoYW4gb25lIElEQVQgYXQKKyMgb25jZSAtIGl0IGhhcyB0byByZWFkIGFuZCBwcm9jZXNzIGVhY2ggb25lIGluIHR1cm4uICBUaGVyZSBpcyBubyBwb2ludCBzZXR0aW5nCisjIHRoaXMgdG8gYSB2YWx1ZSBsYXJnZXIgdGhhbiB0aGUgSURBVCBjaHVua3MgdHlwaWNhbGx5IGVuY291bnRlcmVkIChpdCB3b3VsZAorIyBqdXN0IHdhc3RlIG1lbW9yeSkgYnV0IHRoZXJlIG1heSBiZSBzb21lIHBvaW50IGluIHJlZHVjaW5nIGl0IGJlbG93IHRoZSB2YWx1ZQorIyBvZiBaQlVGX1NJWkUgKHRoZSBzaXplIG9mIElEQVQgY2h1bmtzIHdyaXR0ZW4gYnkgbGlicG5nLikKKworc2V0dGluZyBJREFUX1JFQURfU0laRSBkZWZhdWx0IFBOR19aQlVGX1NJWkUKKworIyBBbmNpbGxhcnkgY2h1bmtzCitjaHVuayBiS0dECitjaHVuayBjSFJNIGVuYWJsZXMgQ09MT1JTUEFDRQorY2h1bmsgZ0FNQSBlbmFibGVzIEdBTU1BCitjaHVuayBoSVNUCitjaHVuayBpQ0NQIGVuYWJsZXMgQ09MT1JTUEFDRSwgR0FNTUEKK2NodW5rIGlUWHQgZW5hYmxlcyBURVhUCitjaHVuayBvRkZzCitjaHVuayBwQ0FMCitjaHVuayBwSFlzCitjaHVuayBzQklUCitjaHVuayBzQ0FMCitjaHVuayBzUExUCitjaHVuayBzUkdCIGVuYWJsZXMgQ09MT1JTUEFDRSwgR0FNTUEsIFNFVF9PUFRJT04KK2NodW5rIHRFWHQgcmVxdWlyZXMgVEVYVAorY2h1bmsgdElNRQorY2h1bmsgdFJOUworY2h1bmsgelRYdCBlbmFibGVzIFRFWFQKKworIyBUaGlzIG9ubHkgYWZmZWN0cyBzdXBwb3J0IG9mIHRoZSBvcHRpb25hbCBQTFRFIGNodW5rIGluIFJHQiBhbmQgUkdCQQorIyBpbWFnZXMuICBOb3RpY2UgdGhhdCBSRUFEX0FOQ0lMTEFSWV9DSFVOS1MgdGhlcmVmb3JlIGRpc2FibGVzIHBhcnQKKyMgb2YgdGhlIHJlZ3VsYXIgY2h1bmsgcmVhZGluZyB0b28uCisKK29wdGlvbiBSRUFEX09QVF9QTFRFIHJlcXVpcmVzIFJFQURfQU5DSUxMQVJZX0NIVU5LUworCisjIFVua25vd24gY2h1bmsgaGFuZGxpbmcKKyMKKyMgJ1VOS05PV05fQ0hVTktTJyBpcyBhIGdsb2JhbCBvcHRpb24gdG8gZGlzYWJsZSBhbGwgdW5rbm93biBjaHVuayBoYW5kbGluZyBvbgorIyByZWFkIG9yIHdyaXRlOyBldmVyeXRoaW5nIGVsc2UgYmVsb3cgcmVxdWlyZXMgaXQgKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpLgorb3B0aW9uIFVOS05PV05fQ0hVTktTCisKKyMgVGhlcmUgYXJlIHRocmVlIG1haW4gb3B0aW9ucyB0byBjb250cm9sIHRoZSBhYmlsaXR5IHRvIHJlYWQgYW5kIHdyaXRlIHVua25vd24KKyMgY2h1bmtzLiAgSWYgZWl0aGVyIHJlYWQgb3B0aW9uIGlzIHR1cm5lZCBvbiB0aGVuIHVua25vd24gY2h1bmtzIHdpbGwgYmUgcmVhZCwKKyMgb3RoZXJ3aXNlIHRoZXkgYXJlIHNraXBwZWQuICBJZiB0aGUgd3JpdGUgb3B0aW9uIGlzIHR1cm5lZCBvbiB1bmtub3duIGNodW5rcworIyBzZXQgYnkgcG5nX3NldF91bmtub3duX2NodW5rcyB3aWxsIGJlIHdyaXR0ZW4gb3RoZXJ3aXNlIGl0IGlzIGFuIGVycm9yIHRvIGNhbGwKKyMgdGhhdCBBUEkgb24gYSB3cml0ZSBzdHJ1Y3QuCitvcHRpb24gV1JJVEVfVU5LTk9XTl9DSFVOS1MgcmVxdWlyZXMgV1JJVEUgcmVxdWlyZXMgVU5LTk9XTl9DSFVOS1MKK29wdGlvbiBXUklURV9VTktOT1dOX0NIVU5LUyBlbmFibGVzIFNUT1JFX1VOS05PV05fQ0hVTktTCisKKyMgVGhlIGZpcnN0IHdheSB0byByZWFkIHVzZXIgY2h1bmtzIGlzIHRvIGhhdmUgbGlicG5nIHNhdmUgdGhlbSBmb3IgYSBsYXRlciBjYWxsCisjIHRvIHBuZ19nZXRfdW5rbm93bl9jaHVua3MsIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGNhbGwKKyMgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzIHRvIGNhdXNlIHRoaXMgdG8gYWN0dWFsbHkgaGFwcGVuIChzZWUgcG5nLmgpCitvcHRpb24gU0FWRV9VTktOT1dOX0NIVU5LUyByZXF1aXJlcyBSRUFEIHJlcXVpcmVzIFNFVF9VTktOT1dOX0NIVU5LUworb3B0aW9uIFNBVkVfVU5LTk9XTl9DSFVOS1MgZW5hYmxlcyBSRUFEX1VOS05PV05fQ0hVTktTLCBTVE9SRV9VTktOT1dOX0NIVU5LUworCisjIFRoZSBzZWNvbmQgYXBwcm9hY2ggaXMgdG8gdXNlIGFuIGFwcGxpY2F0aW9uIHByb3ZpZGVkIGNhbGxiYWNrIHRvIHByb2Nlc3MgdGhlCisjIGNodW5rcywgdGhlIGNhbGxiYWNrIGNhbiBlaXRoZXIgaGFuZGxlIHRoZSBjaHVuayBlbnRpcmVseSBpdHNlbGYgb3IgcmVxdWVzdAorIyB0aGF0IGxpYnBuZyBzdG9yZSB0aGUgY2h1bmsgZm9yIGxhdGVyIHJldHJpZXZhbCB2aWEgcG5nX2dldF91bmtub3duX2NodW5rcy4KKyMKKyMgTk9URTogSWYgU1RPUkVfVU5LTk9XTl9DSFVOS1MgaXMgbm90IGVuYWJsZWQgKHdoaWNoIGlzIHRoZSBkZWZhdWx0IGlmCisjIGJvdGggU0FWRV9VTktOT1dOX0NIVU5LUyBhbmQgV1JJVEVfVU5LTk9XTl9DSFVOS1MgYXJlIGRpc2FibGVkKSB0aGVuIGEKKyMgMCByZXN1bHQgZnJvbSB0aGUgY2FsbGJhY2sgd2lsbCBiZSBpZ25vcmVkIGJlY2F1c2Ugbm8gc3VwcG9ydCBmb3Igc2F2aW5nCisjIHVua25vd24gY2h1bmtzIGhhcyBiZWVuIGNvbXBpbGVkIGluLiAgVGhlIG5vcm1hbCBzeW1wdG9tIGlzIHRoYXQgeW91ciBhcHAKKyMgZmFpbHMgdG8gY29tcGlsZSBiZWNhdXNlIHBuZ19nZXRfdW5rbm93bl9jaHVua3MgaXMgbm8gbG9uZ2VyIGRlZmluZWQgaW4gcG5nLmguCisjIElmIHlvdSBlbmNvdW50ZXIgdGhpcyBpc3N1ZSBzaW1wbHkgZW5hYmxlIFNUT1JFX1VOS05PV05fQ0hVTktTIGluIHlvdXIgYnVpbGQuCisjCisjIE5vdGUgdGhhdCB0aGVyZSBpcyBubyAnV1JJVEVfVVNFUl9DSFVOS1MnIHNvIHRoZSBVU0VSX0NIVU5LUyBvcHRpb24gaXMgYWx3YXlzCisjIHRoZSBzYW1lIGFzIFJFQURfVVNFUl9DSFVOS1MgYXQgcHJlc2VudAorb3B0aW9uIFJFQURfVVNFUl9DSFVOS1MgcmVxdWlyZXMgUkVBRCwgVU5LTk9XTl9DSFVOS1MKK29wdGlvbiBSRUFEX1VTRVJfQ0hVTktTIGVuYWJsZXMgUkVBRF9VTktOT1dOX0NIVU5LUywgVVNFUl9DSFVOS1MKKworIyBUd28gZnVydGhlciBvcHRpb25zIGFyZSBwcm92aWRlZCB0byBhbGxvdyBkZXRhaWxlZCBjb250cm9sIG9mIHRoZSBoYW5kbGluZy4KKyMgVGhlIGZpcnN0IGVuYWJsZXMgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzOyB0aGlzIGFsbG93cyB0aGUgZGVmYXVsdCB0byBiZQorIyBjaGFuZ2VkIGZyb20gZGlzY2FyZGluZyB1bmtub3duIGNodW5rcyBhbmQgYWxsb3dzIHBlci1jaHVuayBjb250cm9sLiAgVGhpcyBpcworIyByZXF1aXJlZCB0byB1c2UgdGhlIFNBVkVfVU5LTk9XTl9DSFVOS1Mgb3B0aW9uLiAgSWYgZW5hYmxlZCB0aGlzIG9wdGlvbiBhbHNvCisjIGFwcGxpZXMgdG8gd3JpdGUgKHNlZSBwbmcuaCksIG90aGVyd2lzZSB0aGUgd3JpdGUgQVBJIHNpbXBseSB3cml0ZXMgYWxsIHRoZQorIyBjaHVua3MgaXQgaXMgZ2l2ZW4uCisjCisjIFRoZSBzZWNvbmQgb3B0aW9uIGV4dGVuZHMgdGhlIHVua25vd24gaGFuZGxpbmcgdG8gYWxsb3cga25vd24gY2h1bmtzIHRvIGJlCisjIGhhbmRsZWQgYXMgdGhvdWdoIHRoZXkgd2VyZSB1bmtub3duLiAgVGhpcyBvcHRpb24gZG9lc24ndCBjaGFuZ2UgYW55IEFQSXMsIGl0CisjIG1lcmVseSB0dXJucyBvbiB0aGUgY29kZSB0byBjaGVjayBrbm93biBhcyB3ZWxsIGFzIHVua25vd24gY2h1bmtzLgorIworIyBUaGlzIG9wdGlvbiBubyBsb25nZXIgYWZmZWN0cyB0aGUgd3JpdGUgY29kZS4gIEl0IGNhbiBiZSBzYWZlbHkgZGlzYWJsZWQgYW5kCisjIHdpbGwgcHJldmVudCBhcHBsaWNhdGlvbnMgc3RvcHBpbmcgbGlicG5nIHJlYWRpbmcga25vd24gY2h1bmtzLgorb3B0aW9uIFNFVF9VTktOT1dOX0NIVU5LUyByZXF1aXJlcyBVTktOT1dOX0NIVU5LUworb3B0aW9uIEhBTkRMRV9BU19VTktOT1dOIHJlcXVpcmVzIFNFVF9VTktOT1dOX0NIVU5LUworCisjIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBhYm92ZSBhbmQgc2hvdWxkIG5vdCBiZSB0dXJuZWQgb24KKyMgZXhwbGljaXRseS4KK29wdGlvbiBSRUFEX1VOS05PV05fQ0hVTktTIHJlcXVpcmVzIFVOS05PV05fQ0hVTktTIGRpc2FibGVkCitvcHRpb24gU1RPUkVfVU5LTk9XTl9DSFVOS1MgcmVxdWlyZXMgVU5LTk9XTl9DSFVOS1MgZGlzYWJsZWQKKworb3B0aW9uIENPTlZFUlRfdElNRSByZXF1aXJlcyBXUklURV9BTkNJTExBUllfQ0hVTktTCisjIFRoZSAidG0iIHN0cnVjdHVyZSBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3NDRQorCitAI2lmZGVmIF9XSU4zMl9XQ0UKK0AjICAgZGVmaW5lIFBOR19OT19DT05WRVJUX3RJTUUKK0AjZW5kaWYKKworb3B0aW9uIFdSSVRFX0ZJTFRFUiByZXF1aXJlcyBXUklURQorCitvcHRpb24gU0FWRV9JTlRfMzIgZGlzYWJsZWQKKyMgcG5nX3NhdmVfaW50XzMyIGlzIHJlcXVpcmVkIGludGVybmFsbHkgZm9yIHdyaXRpbmcgdGhlIGFuY2lsbGFyeSBjaHVua3Mgb0ZGcworIyBhbmQgcENBTCBhbmQgZm9yIGJvdGggcmVhZGluZyBhbmQgd3JpdGluZyBpQ0NQIChmb3IgdGhlIGdlbmVyYXRpb24vY2hlY2tpbmcgb2YKKyMgdGhlIGNvcnJlc3BvbmRpbmcgY0hSTS9nQU1BIGNodW5rcykgaWYgZnVsbCBJQ0MgaXMgc3VwcG9ydGVkLgorCisjIGFkZGVkIGF0IGxpYnBuZy0xLjUuNAorCitvcHRpb24gV1JJVEVfT1BUSU1JWkVfQ01GIHJlcXVpcmVzIFdSSVRFCisKK29wdGlvbiBSRUFEX0NPTVBSRVNTRURfVEVYVCBkaXNhYmxlZAorb3B0aW9uIFJFQURfaUNDUCBlbmFibGVzIFJFQURfQ09NUFJFU1NFRF9URVhUCitvcHRpb24gUkVBRF9pVFh0IGVuYWJsZXMgUkVBRF9DT01QUkVTU0VEX1RFWFQKK29wdGlvbiBSRUFEX3pUWHQgZW5hYmxlcyBSRUFEX0NPTVBSRVNTRURfVEVYVAorCitvcHRpb24gV1JJVEVfb0ZGcyBlbmFibGVzIFNBVkVfSU5UXzMyCitvcHRpb24gV1JJVEVfcENBTCBlbmFibGVzIFNBVkVfSU5UXzMyCitvcHRpb24gV1JJVEVfY0hSTSBlbmFibGVzIFNBVkVfSU5UXzMyCisKK29wdGlvbiBXUklURV9DT01QUkVTU0VEX1RFWFQgZGlzYWJsZWQKK29wdGlvbiBXUklURV9pQ0NQIGVuYWJsZXMgV1JJVEVfQ09NUFJFU1NFRF9URVhUCitvcHRpb24gV1JJVEVfaVRYdCBlbmFibGVzIFdSSVRFX0NPTVBSRVNTRURfVEVYVAorb3B0aW9uIFdSSVRFX3pUWHQgZW5hYmxlcyBXUklURV9DT01QUkVTU0VEX1RFWFQKKworIyBUdXJuIHRoaXMgb2ZmIHRvIGRpc2FibGUgcG5nX3JlYWRfcG5nKCkgYW5kIHBuZ193cml0ZV9wbmcoKSBhbmQKKyMgbGVhdmUgdGhlIHJvd19wb2ludGVycyBtZW1iZXIgb3V0IG9mIHRoZSBpbmZvIHN0cnVjdHVyZS4KKworb3B0aW9uIElORk9fSU1BR0UKKworIyBhZGRlZCBhdCBsaWJwbmctMS41LjEwCisjIFR1cm4gdGhpcyBvZmYgdG8gZGlzYWJsZSB3YXJuaW5nIGFib3V0IGludmFsaWQgcGFsZXR0ZSBpbmRleCBhbmQKKyMgbGVhdmUgdGhlIG51bV9wYWxldHRlX21heCBtZW1iZXIgb3V0IG9mIHRoZSBwbmcgc3RydWN0dXJlLgorCitvcHRpb24gQ0hFQ0tfRk9SX0lOVkFMSURfSU5ERVggZW5hYmxlcyBSRUFEX0NIRUNLX0ZPUl9JTlZBTElEX0lOREVYCitvcHRpb24gQ0hFQ0tfRk9SX0lOVkFMSURfSU5ERVggZW5hYmxlcyBXUklURV9DSEVDS19GT1JfSU5WQUxJRF9JTkRFWAorb3B0aW9uIFJFQURfQ0hFQ0tfRk9SX0lOVkFMSURfSU5ERVggcmVxdWlyZXMgUkVBRCwgQ0hFQ0tfRk9SX0lOVkFMSURfSU5ERVgKK29wdGlvbiBXUklURV9DSEVDS19GT1JfSU5WQUxJRF9JTkRFWCByZXF1aXJlcyBXUklURSwgQ0hFQ0tfRk9SX0lOVkFMSURfSU5ERVgKKworIyBhZGRlZCBhdCBsaWJwbmctMS41LjE1CitvcHRpb24gR0VUX1BBTEVUVEVfTUFYIGVuYWJsZXMgUkVBRF9HRVRfUEFMRVRURV9NQVggV1JJVEVfR0VUX1BBTEVUVEVfTUFYCitvcHRpb24gUkVBRF9HRVRfUEFMRVRURV9NQVggcmVxdWlyZXMgUkVBRF9DSEVDS19GT1JfSU5WQUxJRF9JTkRFWCBkaXNhYmxlZAorb3B0aW9uIFdSSVRFX0dFVF9QQUxFVFRFX01BWCByZXF1aXJlcyBXUklURV9DSEVDS19GT1JfSU5WQUxJRF9JTkRFWCBkaXNhYmxlZAorCisjIFNpbXBsaWZpZWQgQVBJIG9wdGlvbnMgKGFkZGVkIGF0IGxpYnBuZy0xLjYuMCkKKyMgIEluIGxpYnBuZyAxLjYuOCB0aGUgaGFuZGxpbmcgb2YgdGhlc2Ugb3B0aW9ucyB3YXMgY2hhbmdlZCB0byB1c2VkICdyZXF1aXJlcycKKyMgIHRocm91Z2hvdXQsIHNvIHRoYXQgZGlzYWJsaW5nIHNvbWUgb2YgdGhlIGxvdyBsZXZlbCBzdXBwb3J0IGFsd2F5cyBkaXNhYmxlcworIyAgdGhlIGJhc2Ugc2ltcGxpZmllZCByZWFkL3dyaXRlIEFQSS4gIFRoaXMgbXVjaCBzaW1wbGlmaWVzIHRoZSBoYW5kbGluZyBhbmQKKyMgIG1ha2VzICdldmVyeXRoaW5nID0gb2ZmJyB3b3JrIGluIGEgbW9yZSBpbnR1aXRpdmUgd2F5LiAgSXQgZWxpbWluYXRlcyBhCisjICBwcmV2aW91c2x5IHJlcG9ydGVkIGZlYXR1cmUgdGhhdCBBUElzIHByZXZpb3VzbHkgZW5hYmxlZCBieSB0aGUgc2ltcGxpZmllZAorIyAgQVBJIGNvdWxkbid0IGJlIHR1cm5lZCBvZmYgd2l0aG91dCBleHBsaWNpdGx5IHR1cm5pbmcgb2ZmIHRoZSBzaW1wbGlmaWVkCisjICBBUElzLgorIworIyBSZWFkOgorb3B0aW9uIFNJTVBMSUZJRURfUkVBRCwKKyAgIHJlcXVpcmVzIFNFUVVFTlRJQUxfUkVBRCwgUkVBRF9UUkFOU0ZPUk1TLCBTRVRKTVAsIEJFTklHTl9FUlJPUlMsCisgICAgICBSRUFEX0VYUEFORCwgUkVBRF8xNkJJVCwgUkVBRF9FWFBBTkRfMTYsIFJFQURfU0NBTEVfMTZfVE9fOCwKKyAgICAgIFJFQURfUkdCX1RPX0dSQVksIFJFQURfQUxQSEFfTU9ERSwgUkVBRF9CQUNLR1JPVU5ELCBSRUFEX1NUUklQX0FMUEhBLAorICAgICAgUkVBRF9GSUxMRVIsIFJFQURfU1dBUCwgUkVBRF9QQUNLLCBSRUFEX0dSQVlfVE9fUkdCLCBSRUFEX0dBTU1BLAorICAgICAgUkVBRF90Uk5TLCBSRUFEX2JLR0QsIFJFQURfZ0FNQSwgUkVBRF9jSFJNLCBSRUFEX3NSR0IsIFJFQURfc0JJVAorCisjIEFGSVJTVCBhbmQgQkdSIHJlYWQgb3B0aW9uczoKKyMgIFByaW9yIHRvIGxpYnBuZyAxLjYuOCB0aGVzZSB3ZXJlIGRpc2FibGVkIGJ1dCBzd2l0Y2hlZCBvbiBpZiB0aGUgbG93IGxldmVsCisjICBsaWJwbmcgcm91dGluZXMgdGhhdCBkbyB0aGUgc3dhcHMgd2VyZSBlbmFibGVkLiAgVGhpcyB3b3JrZWQgYnV0IHdhcworIyAgY29uZnVzaW5nLiAgSW4gbGlicG5nIDEuNi44IHRoZSBvcHRpb25zIHdlcmUgY2hhbmdlZCB0byBzaW1wbGUgJ3JlcXVpcmVzJworIyAgYW5kIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuICBUaGlzIHNob3VsZCB3b3JrIHRoZSBzYW1lIHdheSBpbiBwcmFjdGljZS4KK29wdGlvbiBTSU1QTElGSUVEX1JFQURfQUZJUlNUIGVuYWJsZXMgRk9STUFUX0FGSVJTVCwKKyAgIHJlcXVpcmVzIFNJTVBMSUZJRURfUkVBRCBSRUFEX1NXQVBfQUxQSEEKKworb3B0aW9uIFNJTVBMSUZJRURfUkVBRF9CR1IgZW5hYmxlcyBGT1JNQVRfQkdSLAorICAgcmVxdWlyZXMgU0lNUExJRklFRF9SRUFEIFJFQURfQkdSCisKKyMgV3JpdGU6CitvcHRpb24gU0lNUExJRklFRF9XUklURSwKKyAgIHJlcXVpcmVzIFdSSVRFIFNURElPLCBTRVRKTVAsIFdSSVRFX1NXQVAsIFdSSVRFX1BBQ0ssCisgICAgICBXUklURV90Uk5TLCBXUklURV9nQU1BLCBXUklURV9zUkdCLCBXUklURV9jSFJNCisKK29wdGlvbiBTSU1QTElGSUVEX1dSSVRFX0FGSVJTVCBlbmFibGVzIEZPUk1BVF9BRklSU1QsCisgICByZXF1aXJlcyBTSU1QTElGSUVEX1dSSVRFIFdSSVRFX1NXQVBfQUxQSEEKKworb3B0aW9uIFNJTVBMSUZJRURfV1JJVEVfQkdSIGVuYWJsZXMgRk9STUFUX0JHUiwKKyAgIHJlcXVpcmVzIFNJTVBMSUZJRURfV1JJVEUgV1JJVEVfQkdSCisKKyMgRm9ybWF0czoKK29wdGlvbiBGT1JNQVRfQUZJUlNUIGRpc2FibGVkCitvcHRpb24gRk9STUFUX0JHUiBkaXNhYmxlZApkaWZmIC0tZ2l0IGEvbGlicG5nL3NjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0IGIvbGlicG5nL3NjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZjQyMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQKQEAgLTAsMCArMSwyMTQgQEAKKy8qIGxpYnBuZyAxLjYuMjAgU1RBTkRBUkQgQVBJIERFRklOSVRJT04gKi8KKworLyogcG5nbGliY29uZi5oIC0gbGlicmFyeSBidWlsZCBjb25maWd1cmF0aW9uICovCisKKy8qIExpYnBuZyB2ZXJzaW9uIDEuNi4yMCAtIERlY2VtYmVyIDMsIDIwMTUgKi8KKworLyogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTUgR2xlbm4gUmFuZGVycy1QZWhyc29uICovCisKKy8qIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuICovCisvKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyICovCisvKiBhbmQgbGljZW5zZSBpbiBwbmcuaCAqLworCisvKiBwbmdsaWJjb25mLmggKi8KKy8qIE1hY2hpbmUgZ2VuZXJhdGVkIGZpbGU6IERPIE5PVCBFRElUICovCisvKiBEZXJpdmVkIGZyb206IHNjcmlwdHMvcG5nbGliY29uZi5kZmEgKi8KKyNpZm5kZWYgUE5HTENPTkZfSAorI2RlZmluZSBQTkdMQ09ORl9ICisvKiBvcHRpb25zICovCisjZGVmaW5lIFBOR18xNkJJVF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX0FMSUdORURfTUVNT1JZX1NVUFBPUlRFRAorLyojdW5kZWYgUE5HX0FSTV9ORU9OX0FQSV9TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX0FSTV9ORU9OX0NIRUNLX1NVUFBPUlRFRCovCisjZGVmaW5lIFBOR19CRU5JR05fRVJST1JTX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfQkVOSUdOX1JFQURfRVJST1JTX1NVUFBPUlRFRAorLyojdW5kZWYgUE5HX0JFTklHTl9XUklURV9FUlJPUlNfU1VQUE9SVEVEKi8KKyNkZWZpbmUgUE5HX0JVSUxEX0dSQVlTQ0FMRV9QQUxFVFRFX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfQ0hFQ0tfRk9SX0lOVkFMSURfSU5ERVhfU1VQUE9SVEVECisjZGVmaW5lIFBOR19DT0xPUlNQQUNFX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfQ09OU09MRV9JT19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX0NPTlZFUlRfdElNRV9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX0VBU1lfQUNDRVNTX1NVUFBPUlRFRAorLyojdW5kZWYgUE5HX0VSUk9SX05VTUJFUlNfU1VQUE9SVEVEKi8KKyNkZWZpbmUgUE5HX0VSUk9SX1RFWFRfU1VQUE9SVEVECisjZGVmaW5lIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX0ZMT0FUSU5HX0FSSVRITUVUSUNfU1VQUE9SVEVECisjZGVmaW5lIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX0ZPUk1BVF9BRklSU1RfU1VQUE9SVEVECisjZGVmaW5lIFBOR19GT1JNQVRfQkdSX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfR0FNTUFfU1VQUE9SVEVECisjZGVmaW5lIFBOR19HRVRfUEFMRVRURV9NQVhfU1VQUE9SVEVECisjZGVmaW5lIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX0lOQ0hfQ09OVkVSU0lPTlNfU1VQUE9SVEVECisjZGVmaW5lIFBOR19JTkZPX0lNQUdFX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfSU9fU1RBVEVfU1VQUE9SVEVECisjZGVmaW5lIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVECisjZGVmaW5lIFBOR19QT0lOVEVSX0lOREVYSU5HX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfMTZCSVRfU1VQUE9SVEVECisjZGVmaW5lIFBOR19SRUFEX0FMUEhBX01PREVfU1VQUE9SVEVECisjZGVmaW5lIFBOR19SRUFEX0FOQ0lMTEFSWV9DSFVOS1NfU1VQUE9SVEVECisjZGVmaW5lIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVECisjZGVmaW5lIFBOR19SRUFEX0JHUl9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfQ0hFQ0tfRk9SX0lOVkFMSURfSU5ERVhfU1VQUE9SVEVECisjZGVmaW5lIFBOR19SRUFEX0NPTVBPU0lURV9OT0RJVl9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfQ09NUFJFU1NFRF9URVhUX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9FWFBBTkRfMTZfU1VQUE9SVEVECisjZGVmaW5lIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfR0VUX1BBTEVUVEVfTUFYX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9HUkFZX1RPX1JHQl9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVECisjZGVmaW5lIFBOR19SRUFEX0lOVF9GVU5DVElPTlNfU1VQUE9SVEVECisjZGVmaW5lIFBOR19SRUFEX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfSU5WRVJUX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9PUFRfUExURV9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfUEFDS1NXQVBfU1VQUE9SVEVECisjZGVmaW5lIFBOR19SRUFEX1BBQ0tfU1VQUE9SVEVECisjZGVmaW5lIFBOR19SRUFEX1FVQU5USVpFX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9SR0JfVE9fR1JBWV9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfU0NBTEVfMTZfVE9fOF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfU0hJRlRfU1VQUE9SVEVECisjZGVmaW5lIFBOR19SRUFEX1NUUklQXzE2X1RPXzhfU1VQUE9SVEVECisjZGVmaW5lIFBOR19SRUFEX1NUUklQX0FMUEhBX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfU1dBUF9BTFBIQV9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfU1dBUF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfVEVYVF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfVFJBTlNGT1JNU19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECisjZGVmaW5lIFBOR19SRUFEX1VTRVJfQ0hVTktTX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfYktHRF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfY0hSTV9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfZ0FNQV9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfaElTVF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfaUNDUF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfaVRYdF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfb0ZGc19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfcENBTF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfcEhZc19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfc0JJVF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfc0NBTF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfc1BMVF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfc1JHQl9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfdEVYdF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfdElNRV9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfdFJOU19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfelRYdF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1NBVkVfSU5UXzMyX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfU0FWRV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1NFVEpNUF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1NFVF9PUFRJT05fU1VQUE9SVEVECisjZGVmaW5lIFBOR19TRVRfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECisjZGVmaW5lIFBOR19TRVRfVVNFUl9MSU1JVFNfU1VQUE9SVEVECisjZGVmaW5lIFBOR19TSU1QTElGSUVEX1JFQURfQUZJUlNUX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfU0lNUExJRklFRF9SRUFEX0JHUl9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1NJTVBMSUZJRURfUkVBRF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1NJTVBMSUZJRURfV1JJVEVfQUZJUlNUX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfU0lNUExJRklFRF9XUklURV9CR1JfU1VQUE9SVEVECisjZGVmaW5lIFBOR19TSU1QTElGSUVEX1dSSVRFX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfU1RESU9fU1VQUE9SVEVECisjZGVmaW5lIFBOR19TVE9SRV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1RFWFRfU1VQUE9SVEVECisjZGVmaW5lIFBOR19USU1FX1JGQzExMjNfU1VQUE9SVEVECisjZGVmaW5lIFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1VTRVJfQ0hVTktTX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfVVNFUl9MSU1JVFNfU1VQUE9SVEVECisjZGVmaW5lIFBOR19VU0VSX01FTV9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1VTRVJfVFJBTlNGT1JNX0lORk9fU1VQUE9SVEVECisjZGVmaW5lIFBOR19VU0VSX1RSQU5TRk9STV9QVFJfU1VQUE9SVEVECisjZGVmaW5lIFBOR19XQVJOSU5HU19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFXzE2QklUX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfV1JJVEVfQU5DSUxMQVJZX0NIVU5LU19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX0JHUl9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX0NIRUNLX0ZPUl9JTlZBTElEX0lOREVYX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfV1JJVEVfQ09NUFJFU1NFRF9URVhUX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfV1JJVEVfQ1VTVE9NSVpFX0NPTVBSRVNTSU9OX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfV1JJVEVfQ1VTVE9NSVpFX1pUWFRfQ09NUFJFU1NJT05fU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV9GSUxMRVJfU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV9GSUxURVJfU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX0dFVF9QQUxFVFRFX01BWF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfV1JJVEVfSU5UX0ZVTkNUSU9OU19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX0lOVkVSVF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX09QVElNSVpFX0NNRl9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX1BBQ0tTV0FQX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfV1JJVEVfUEFDS19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX1NISUZUX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfV1JJVEVfU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV9TV0FQX0FMUEhBX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfV1JJVEVfU1dBUF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX1RFWFRfU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV9UUkFOU0ZPUk1TX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfV1JJVEVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX1dFSUdIVEVEX0ZJTFRFUl9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX2JLR0RfU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV9jSFJNX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfV1JJVEVfZ0FNQV9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX2hJU1RfU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV9pQ0NQX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfV1JJVEVfaVRYdF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX29GRnNfU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV9wQ0FMX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfV1JJVEVfcEhZc19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX3NCSVRfU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV9zQ0FMX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfV1JJVEVfc1BMVF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX3NSR0JfU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV90RVh0X1NVUFBPUlRFRAorI2RlZmluZSBQTkdfV1JJVEVfdElNRV9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1dSSVRFX3RSTlNfU1VQUE9SVEVECisjZGVmaW5lIFBOR19XUklURV96VFh0X1NVUFBPUlRFRAorI2RlZmluZSBQTkdfYktHRF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX2NIUk1fU1VQUE9SVEVECisjZGVmaW5lIFBOR19nQU1BX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfaElTVF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX2lDQ1BfU1VQUE9SVEVECisjZGVmaW5lIFBOR19pVFh0X1NVUFBPUlRFRAorI2RlZmluZSBQTkdfb0ZGc19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX3BDQUxfU1VQUE9SVEVECisjZGVmaW5lIFBOR19wSFlzX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfc0JJVF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX3NDQUxfU1VQUE9SVEVECisjZGVmaW5lIFBOR19zUExUX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfc1JHQl9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX3RFWHRfU1VQUE9SVEVECisjZGVmaW5lIFBOR190SU1FX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfdFJOU19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX3pUWHRfU1VQUE9SVEVECisvKiBlbmQgb2Ygb3B0aW9ucyAqLworLyogc2V0dGluZ3MgKi8KKyNkZWZpbmUgUE5HX0FQSV9SVUxFIDAKKyNkZWZpbmUgUE5HX0RFRkFVTFRfUkVBRF9NQUNST1MgMQorI2RlZmluZSBQTkdfR0FNTUFfVEhSRVNIT0xEX0ZJWEVEIDUwMDAKKyNkZWZpbmUgUE5HX0lEQVRfUkVBRF9TSVpFIFBOR19aQlVGX1NJWkUKKyNkZWZpbmUgUE5HX0lORkxBVEVfQlVGX1NJWkUgMTAyNAorI2RlZmluZSBQTkdfTElOS0FHRV9BUEkgZXh0ZXJuCisjZGVmaW5lIFBOR19MSU5LQUdFX0NBTExCQUNLIGV4dGVybgorI2RlZmluZSBQTkdfTElOS0FHRV9EQVRBIGV4dGVybgorI2RlZmluZSBQTkdfTElOS0FHRV9GVU5DVElPTiBleHRlcm4KKyNkZWZpbmUgUE5HX01BWF9HQU1NQV84IDExCisjZGVmaW5lIFBOR19RVUFOVElaRV9CTFVFX0JJVFMgNQorI2RlZmluZSBQTkdfUVVBTlRJWkVfR1JFRU5fQklUUyA1CisjZGVmaW5lIFBOR19RVUFOVElaRV9SRURfQklUUyA1CisjZGVmaW5lIFBOR19URVhUX1pfREVGQVVMVF9DT01QUkVTU0lPTiAoLTEpCisjZGVmaW5lIFBOR19URVhUX1pfREVGQVVMVF9TVFJBVEVHWSAwCisjZGVmaW5lIFBOR19VU0VSX0NIVU5LX0NBQ0hFX01BWCAxMDAwCisjZGVmaW5lIFBOR19VU0VSX0NIVU5LX01BTExPQ19NQVggODAwMDAwMAorI2RlZmluZSBQTkdfVVNFUl9IRUlHSFRfTUFYIDEwMDAwMDAKKyNkZWZpbmUgUE5HX1VTRVJfV0lEVEhfTUFYIDEwMDAwMDAKKyNkZWZpbmUgUE5HX1pCVUZfU0laRSA4MTkyCisjZGVmaW5lIFBOR19aTElCX1ZFUk5VTSAwIC8qIHVua25vd24gKi8KKyNkZWZpbmUgUE5HX1pfREVGQVVMVF9DT01QUkVTU0lPTiAoLTEpCisjZGVmaW5lIFBOR19aX0RFRkFVTFRfTk9GSUxURVJfU1RSQVRFR1kgMAorI2RlZmluZSBQTkdfWl9ERUZBVUxUX1NUUkFURUdZIDEKKyNkZWZpbmUgUE5HX3NDQUxfUFJFQ0lTSU9OIDUKKyNkZWZpbmUgUE5HX3NSR0JfUFJPRklMRV9DSEVDS1MgMgorLyogZW5kIG9mIHNldHRpbmdzICovCisjZW5kaWYgLyogUE5HTENPTkZfSCAqLwpkaWZmIC0tZ2l0IGEvbGlicG5nL3NjcmlwdHMvcG5nbGliY29uZi5tYWsgYi9saWJwbmcvc2NyaXB0cy9wbmdsaWJjb25mLm1hawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMTI1Y2EyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3NjcmlwdHMvcG5nbGliY29uZi5tYWsKQEAgLTAsMCArMSw1NSBAQAorIyEvdXNyL2Jpbi9tYWtlIC1mCisjIHBuZ2xpYmNvbmYubWFrIC0gc3RhbmRhcmQgbWFrZSBsaW5lcyBmb3IgcG5nbGliY29uZi5oCisjCisjIFRoZXNlIGxpbmVzIGFyZSBjb3BpZWQgZnJvbSBNYWtlZmlsZS5hbSwgdGhleSBpbGx1c3RyYXRlCisjIGhvdyB0byBhdXRvbWF0ZSB0aGUgYnVpbGQgb2YgcG5nbGliY29uZi5oIGZyb20gc2NyaXB0cy9wbmdsaWJjb25mLmRmYQorIyBnaXZlbiBqdXN0ICdhd2snLCBhIEMgcHJlcHJvY2Vzc29yIGFuZCBzdGFuZGFyZCBjb21tYW5kIGxpbmUgdXRpbGl0aWVzCisKKyMgT3ZlcnJpZGUgYXMgYXBwcm9wcmlhdGUsIHRoZXNlIGRlZmluaXRpb25zIGNhbiBiZSBvdmVycmlkZGVuIG9uCisjIHRoZSBtYWtlIGNvbW1hbmQgbGluZSAoQVdLPSduYXdrJyBmb3IgZXhhbXBsZSkuCitBV0sgPSBnYXdrCitBV0sgPSBtYXdrCitBV0sgPSBuYXdrCitBV0sgPSBvbmUtdHJ1ZS1hd2sKK0FXSyA9IGF3ayAgIyBDcmFzaGVzIG9uIFN1bk9TIDUuMTAgLSB1c2UgJ25hd2snCitDUFAgPSAkKENDKSAtRSAjIE9uIFNVTiBPUyA1LjEwIGlmIHRoaXMgY2F1c2VzIHByb2JsZW1zIHVzZSAvbGliL2NwcAorCitNT1ZFID0gbXYKK0RFTEVURSA9IHJtIC1mCitFQ0hPID0gZWNobworREZBX1hUUkEgPSAjIFB1dCB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZSBoZXJlLCBzZWUgc2NyaXB0cy9wbmdsaWJjb25mLmRmYS4gIEVnOgorIyBERkFfWFRSQSA9IHBuZ3Vzci5kZmEKKworIyBDUFBGTEFHUyBzaG91bGQgY29udGFpbiB0aGUgb3B0aW9ucyB0byBjb250cm9sIHRoZSByZXN1bHQsCisjIGJ1dCBERUZTIGFuZCBDRkxBR1MgYXJlIGFsc28gc3VwcG9ydGVkIGhlcmUsIG92ZXJyaWRlCisjIGFzIGFwcHJvcHJpYXRlCitERk5GTEFHUyA9ICQoREVGUykgJChDUFBGTEFHUykgJChDRkxBR1MpCisKKyMgc3JjZGlyIGlzIGEgZGVmYWN0byBzdGFuZGFyZCBmb3IgdGhlIGxvY2F0aW9uIG9mIHRoZSBzb3VyY2UKK3NyY2RpciA9IC4KKworIyBUaGUgc3RhbmRhcmQgcG5nbGliY29uZi5oIGV4aXN0cyBhcyBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdCwKKyMgY29weSB0aGlzIGlmIHRoZSBmb2xsb3dpbmcgZG9lc24ndCB3b3JrLgorcG5nbGliY29uZi5oOiBwbmdsaWJjb25mLmRmbgorCSQoREVMRVRFKSAkQCBwbmdsaWJjb25mLmMgcG5nbGliY29uZi5vdXQgcG5nbGliY29uZi50bXAKKwkkKEVDSE8pICcjaW5jbHVkZSAicG5nbGliY29uZi5kZm4iJyA+cG5nbGliY29uZi5jCisJJChFQ0hPKSAiSWYgJyQoQ0MpIC1FJyBjcmFzaGVzIHRyeSAvbGliL2NwcCAoZS5nLiBDUFA9Jy9saWIvY3BwJykiID4mMgorCSQoQ1BQKSAkKERGTkZMQUdTKSBwbmdsaWJjb25mLmMgPnBuZ2xpYmNvbmYub3V0CisJJChBV0spIC1mICIkKHNyY2Rpcikvc2NyaXB0cy9kZm4uYXdrIiBvdXQ9InBuZ2xpYmNvbmYudG1wIiBwbmdsaWJjb25mLm91dCAxPiYyCisJJChNT1ZFKSBwbmdsaWJjb25mLnRtcCAkQAorCitwbmdsaWJjb25mLmRmbjogJChzcmNkaXIpL3NjcmlwdHMvcG5nbGliY29uZi5kZmEgJChzcmNkaXIpL3NjcmlwdHMvb3B0aW9ucy5hd2sgJChzcmNkaXIpL3BuZ2NvbmYuaCAkKHNyY2RpcikvcG5ndXNyLmRmYSAkKERGQV9YVFJBKQorCSQoREVMRVRFKSAkQCBwbmdsaWJjb25mLnByZSBwbmdsaWJjb25mLnRtcAorCSQoRUNITykgIkNhbGxpbmcgJChBV0spIGZyb20gc2NyaXB0cy9wbmdsaWJjb25mLm1hayIgPiYyCisJJChFQ0hPKSAiSWYgJ2F3aycgY3Jhc2hlcyB0cnkgYSBiZXR0ZXIgYXdrIChlLmcuIEFXSz0nbmF3aycpIiA+JjIKKwkkKEFXSykgLWYgJChzcmNkaXIpL3NjcmlwdHMvb3B0aW9ucy5hd2sgb3V0PSJwbmdsaWJjb25mLnByZSJcCisJICAgIHZlcnNpb249c2VhcmNoICQoc3JjZGlyKS9wbmdjb25mLmggJChzcmNkaXIpL3NjcmlwdHMvcG5nbGliY29uZi5kZmFcCisJICAgICQoc3JjZGlyKS9wbmd1c3IuZGZhICQoREZBX1hUUkEpIDE+JjIKKwkkKEFXSykgLWYgJChzcmNkaXIpL3NjcmlwdHMvb3B0aW9ucy5hd2sgb3V0PSJwbmdsaWJjb25mLnRtcCIgcG5nbGliY29uZi5wcmUgMT4mMgorCSQoTU9WRSkgcG5nbGliY29uZi50bXAgJEAKKworY2xlYW4tcG5nbGliY29uZjoKKwkkKERFTEVURSkgcG5nbGliY29uZi5oIHBuZ2xpYmNvbmYuYyBwbmdsaWJjb25mLm91dCBwbmdsaWJjb25mLnByZSBcCisJcG5nbGliY29uZi5kZm4KKworY2xlYW46IGNsZWFuLXBuZ2xpYmNvbmYKZGlmZiAtLWdpdCBhL2xpYnBuZy9zY3JpcHRzL3BuZ3dpbi5yYyBiL2xpYnBuZy9zY3JpcHRzL3BuZ3dpbi5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzM1Y2JiCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3NjcmlwdHMvcG5nd2luLnJjCkBAIC0wLDAgKzEsMTEyIEBACisjZGVmaW5lIFBOR19WRVJTSU9OX0lORk9fT05MWQorCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgIi4uL3BuZy5oIgorCisjZGVmaW5lIF9RVU9URSh4KSAjIHgKKyNkZWZpbmUgUVVPVEUoeCkgX1FVT1RFKHgpCisKKyNkZWZpbmUgUE5HX0xJQlBOR19ETExGTkFNRSAiTElCUE5HIgorCisvKiBTdXBwb3J0IGRlcHJlY2F0ZWQgUFJJVkFURUJVSUxEIG1hY3JvICovCisjaWYgZGVmaW5lZChQUklWQVRFQlVJTEQpICYmICFkZWZpbmVkKFBOR19VU0VSX1BSSVZBVEVCVUlMRCkKKyMgIGRlZmluZSBQTkdfVVNFUl9QUklWQVRFQlVJTEQgUFJJVkFURUJVSUxECisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX1VTRVJfRExMRk5BTUVfUE9TVEZJWCkgJiYgIWRlZmluZWQoUE5HX1VTRVJfUFJJVkFURUJVSUxEKQorIyAgZXJyb3IgIlBOR19VU0VSX1BSSVZBVEVCVUlMRCBtdXN0IGJlIGRlZmluZWQgYXMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGVcCisgY3VzdG9tIGNoYW5nZXMgbWFkZSB0byB0aGUgbGlicmFyeS4iCisjZW5kaWYKKworLyogUHJpb3JpdGl6ZSBQTkdfVVNFUl94IG92ZXIgUE5HX0xJQlBOR194ICovCisjaWZkZWYgUE5HX1VTRVJfRExMRk5BTUVfUE9TVEZJWAorIyAgdW5kZWYgUE5HX0xJQlBOR19ETExGTkFNRV9QT1NURklYCisjICBkZWZpbmUgUE5HX0xJQlBOR19ETExGTkFNRV9QT1NURklYIFBOR19VU0VSX0RMTEZOQU1FX1BPU1RGSVgKKyNlbmRpZgorCisjaWZkZWYgUE5HX1VTRVJfVkVSU0lPTklORk9fQ09NTUVOVFMKKyMgIHVuZGVmIFBOR19MSUJQTkdfVkVSU0lPTklORk9fQ09NTUVOVFMKKyMgIGRlZmluZSBQTkdfTElCUE5HX1ZFUlNJT05JTkZPX0NPTU1FTlRTIFBOR19VU0VSX1ZFUlNJT05JTkZPX0NPTU1FTlRTCisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX0RFQlVHKSAmJiAoUE5HX0RFQlVHID4gMCkKKyMgIGRlZmluZSBWU19ERUJVRyBWU19GRl9ERUJVRworIyAgaWZuZGVmIFBOR19MSUJQTkdfRExMRk5BTUVfUE9TVEZJWAorIyAgICBkZWZpbmUgUE5HX0xJQlBOR19ETExGTkFNRV9QT1NURklYICJEIgorIyAgZW5kaWYgLyogUE5HX0xJQlBOR19ETExGTkFNRV9QT1NURklYICovCisjICBpZm5kZWYgUE5HX0xJQlBOR19WRVJTSU9OSU5GT19DT01NRU5UUworIyAgICBkZWZpbmUgUE5HX0xJQlBOR19WRVJTSU9OSU5GT19DT01NRU5UUyAiUE5HX0RFQlVHPSIgUVVPVEUoUE5HX0RFQlVHKQorIyAgZW5kaWYgLyogUE5HX0xJQlBOR19WRVJTSU9OSU5GT19DT01NRU5UUyAqLworI2Vsc2UKKyMgIGRlZmluZSBWU19ERUJVRyAwCisjICBpZm5kZWYgUE5HX0xJQlBOR19ETExGTkFNRV9QT1NURklYCisjICAgICBkZWZpbmUgUE5HX0xJQlBOR19ETExGTkFNRV9QT1NURklYCisjICBlbmRpZiAvKiBQTkdfTElCUE5HX0RMTEZOQU1FX1BPU1RGSVggKi8KKyNlbmRpZiAvKiBkZWZpbmVkKERFQlVHKS4uLiAqLworCisjaWZkZWYgUE5HX1VTRVJfUFJJVkFURUJVSUxECisjICBkZWZpbmUgVlNfUFJJVkFURUJVSUxEIFZTX0ZGX1BSSVZBVEVCVUlMRAorI2Vsc2UKKyMgIGRlZmluZSBWU19QUklWQVRFQlVJTEQgMAorI2VuZGlmIC8qIFBOR19VU0VSX1BSSVZBVEVCVUlMRCAqLworCisjaWZkZWYgUE5HX0xJQlBOR19TUEVDSUFMQlVJTEQKKyMgIGRlZmluZSBWU19TUEVDSUFMQlVJTEQgVlNfRkZfU1BFQ0lBTEJVSUxECisjZWxzZQorIyAgZGVmaW5lIFZTX1NQRUNJQUxCVUlMRCAwCisjZW5kaWYgLyogUE5HX0xJQlBOR19CVUlMRF9TUEVDSUFMICovCisKKyNpZiAoKFBOR19MSUJQTkdfQlVJTERfQkFTRV9UWVBFICYgUE5HX0xJQlBOR19SRUxFQVNFX1NUQVRVU19NQVNLKSAhPVwKKyAgICAgIFBOR19MSUJQTkdfQlVJTERfU1RBQkxFKQorIyAgZGVmaW5lIFZTX1BSRVJFTEVBU0UgVlNfRkZfUFJFUkVMRUFTRQorIyAgZGVmaW5lIFZTX1BBVENIRUQgMAorI2Vsc2UKKyMgIGRlZmluZSBWU19QUkVSRUxFQVNFIDAKKyMgIGlmIChQTkdfTElCUE5HX0JVSUxEX0JBU0VfVFlQRSAmIFBOR19MSUJQTkdfQlVJTERfUEFUQ0hFRCkKKyMgICAgZGVmaW5lIFZTX1BBVENIRUQgVlNfRkZfUEFUQ0hFRAorIyAgZWxzZQorIyAgICBkZWZpbmUgVlNfUEFUQ0hFRCAwCisjICBlbmRpZgorI2VuZGlmCisKK1ZTX1ZFUlNJT05fSU5GTyBWRVJTSU9OSU5GTworRklMRVZFUlNJT04gUE5HX0xJQlBOR19WRVJfTUFKT1IsIFBOR19MSUJQTkdfVkVSX01JTk9SLCBQTkdfTElCUE5HX1ZFUl9SRUxFQVNFLCBQTkdfTElCUE5HX1ZFUl9CVUlMRAorUFJPRFVDVFZFUlNJT04gUE5HX0xJQlBOR19WRVJfTUFKT1IsIFBOR19MSUJQTkdfVkVSX01JTk9SLCBQTkdfTElCUE5HX1ZFUl9SRUxFQVNFLCBQTkdfTElCUE5HX1ZFUl9CVUlMRAorRklMRUZMQUdTTUFTSyBWU19GRklfRklMRUZMQUdTTUFTSworRklMRUZMQUdTIFZTX0RFQlVHIHwgVlNfUFJJVkFURUJVSUxEIHwgVlNfU1BFQ0lBTEJVSUxEIHwgVlNfUFJFUkVMRUFTRSB8IFZTX1BBVENIRUQKK0ZJTEVPUyBWT1NfX1dJTkRPV1MzMgorRklMRVRZUEUgVkZUX0RMTAorRklMRVNVQlRZUEUgVkZUMl9VTktOT1dOCitCRUdJTgorICBCTE9DSyAiU3RyaW5nRmlsZUluZm8iCisgIEJFR0lOIEJMT0NLICIwNDA5MDRFNCIgLyogTGFuZ3VhZ2UgdHlwZSA9IFUuUyBFbmdsaXNoKDB4MDQwOSkgYW5kIENoYXJhY3RlciBTZXQgPSBXaW5kb3dzLCBNdWx0aWxpbmd1YWwoMHgwNEU0KSAqLworICAgIEJFR0lOCisjaWZkZWYgUE5HX0xJQlBOR19WRVJTSU9OSU5GT19DT01NRU5UUworICAgICAgVkFMVUUgIkNvbW1lbnRzIiwgUE5HX0xJQlBOR19WRVJTSU9OSU5GT19DT01NRU5UUyAiXDAwMCIKKyNlbmRpZiAvKiBQTkdfTElCUE5HX1ZFUlNJT05JTkZPX0NPTU1FTlRTICovCisjaWZkZWYgUE5HX1VTRVJfVkVSU0lPTklORk9fQ09NUEFOWU5BTUUKKyAgICAgIFZBTFVFICJDb21wYW55TmFtZSIsIFBOR19VU0VSX1ZFUlNJT05JTkZPX0NPTVBBTllOQU1FICJcMDAwIgorI2VuZGlmIC8qIFBOR19VU0VSX1ZFUlNJT05JTkZPX0NPTVBBTllOQU1FICovCisgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgIlBORyBpbWFnZSBjb21wcmVzc2lvbiBsaWJyYXJ5XDAwMCIKKyAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsIFBOR19MSUJQTkdfVkVSX1NUUklORyAiXDAwMCIKKyAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLCBQTkdfTElCUE5HX0RMTEZOQU1FIFFVT1RFKFBOR19MSUJQTkdfVkVSX0RMTE5VTSkgUE5HX0xJQlBOR19ETExGTkFNRV9QT1NURklYICIgKFdpbmRvd3MgMzIgYml0KVwwMDAiCisgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiXDI1MSAxOTk4LTIwMDkgR2xlbm4gUmFuZGVycy1QZWhyc29uIGV0IGFsLlwwMDAiCisjaWZkZWYgUE5HX1VTRVJfVkVSU0lPTklORk9fTEVHQUxUUkFERU1BUktTCisgICAgICBWQUxVRSAiTGVnYWxUcmFkZW1hcmtzIiwgUE5HX1VTRVJfVkVSU0lPTklORk9fTEVHQUxUUkFERU1BUktTICJcMDAwIgorI2VuZGlmIC8qIFBOR19VU0VSX1ZFUlNJT05JTkZPX0xFR0FMVFJBREVNQVJLUyAqLworICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCBQTkdfTElCUE5HX0RMTEZOQU1FIFFVT1RFKFBOR19MSUJQTkdfVkVSX0RMTE5VTSkgUE5HX0xJQlBOR19ETExGTkFNRV9QT1NURklYICIuRExMXDAwMCIKKyNpZmRlZiBQTkdfVVNFUl9QUklWQVRFQlVJTEQKKyAgICAgIFZBTFVFICJQcml2YXRlQnVpbGQiLCBQTkdfVVNFUl9QUklWQVRFQlVJTEQgIlwwMDAiCisjZW5kaWYgLyogUE5HX1VTRVJfUFJJVkFURUJVSUxEICovCisgICAgICBWQUxVRSAiUHJvZHVjdE5hbWUiLCAiTGliUE5HXDAwMCIKKyAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsICIxXDAwMCIKKyNpZmRlZiBQTkdfTElCUE5HX1NQRUNJQUxCVUlMRAorICAgICAgVkFMVUUgIlNwZWNpYWxCdWlsZCIsIFBOR19MSUJQTkdfU1BFQ0lBTEJVSUxEICJcMDAwIgorI2VuZGlmIC8qIFBOR19MSUJQTkdfU1BFQ0lBTEJVSUxEICovCisgICAgRU5ECisgIEVORAorICBCTE9DSyAiVmFyRmlsZUluZm8iCisgIEJFR0lOCisgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMHgwNDA5LCAweDA0RTQKKyAgRU5ECitFTkQKZGlmZiAtLWdpdCBhL2xpYnBuZy9zY3JpcHRzL3ByZWZpeC5jIGIvbGlicG5nL3NjcmlwdHMvcHJlZml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI2MDRhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9zY3JpcHRzL3ByZWZpeC5jCkBAIC0wLDAgKzEsMjQgQEAKKworLyogcHJlZml4LmMgLSBnZW5lcmF0ZSBhbiB1bnByZWZpeGVkIHN5bWJvbCBsaXN0CisgKgorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyB2ZXJzaW9uIDEuNi4xNiBbRGVjZW1iZXIgMjIsIDIwMTRdCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKyAqLworCisjZGVmaW5lIFBOR19FWFBPUlRBKG9yZGluYWwsIHR5cGUsIG5hbWUsIGFyZ3MsIGF0dHJpYnV0ZXMpXAorICAgICAgICBQTkdfREZOICJAIiBuYW1lICJAIgorCisvKiBUaGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiAqYmVmb3JlKiB0aGUgYWRkaXRpb25hbCBvZiBzeW1ib2wgcmVuYW1lcywKKyAqIHRoZSBsaXN0IGlzIHRoZSBDIG5hbWUgbGlzdDsgbm8gc3ltYm9sIHByZWZpeC4KKyAqLworI2luY2x1ZGUgInBuZ2xpYmNvbmYub3V0IgorCitQTkdfREZOX1NUQVJUX1NPUlQgMQorCisjaW5jbHVkZSAiLi4vcG5nLmgiCisKK1BOR19ERk5fRU5EX1NPUlQKZGlmZiAtLWdpdCBhL2xpYnBuZy9zY3JpcHRzL3NtYWtlZmlsZS5wcGMgYi9saWJwbmcvc2NyaXB0cy9zbWFrZWZpbGUucHBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNzM4MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvc2NyaXB0cy9zbWFrZWZpbGUucHBjCkBAIC0wLDAgKzEsMzQgQEAKKyMgQW1pZ2EgcG93ZXJVUCAoVE0pIE1ha2VmaWxlCisjIG1ha2VmaWxlIGZvciBsaWJwbmcgYW5kIFNBUyBDIFY2LjU4LzcuMDAgUFBDIGNvbXBpbGVyCisjIENvcHlyaWdodCAoQykgMTk5OCBieSBBbmRyZWFzIFIuIEtsZWluZXJ0CisjCisjIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisjIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKworQ0MgICAgICAgPSBzY3BwYworQ0ZMQUdTICAgPSBOT1NUS0NISyBOT1NJTlQgT1BUSU1JWkUgT1BUR08gT1BUUEVFUCBPUFRJTkxPQ0FMIE9QVElOTCBJRElSIC96bGliIFwKKyAgICAgICAgICAgT1BUTE9PUCBPUFRSREVQPTggT1BUREVQPTggT1BUQ09NUD04CitMSUJOQU1FICA9IGxpYnBuZy5hCitBUiAgICAgICA9IHBwYy1hbWlnYW9zLWFyCitBUl9GTEFHUyA9IGNyCitSQU5MSUIgICA9IHBwYy1hbWlnYW9zLXJhbmxpYgorTERGTEFHUyAgPSAtciAtbworTERMSUJTICAgPSAgLi4vemxpYi9saWJ6aXAuYSBMSUI6c2NwcGMuYQorTE4gICAgICAgPSBwcGMtYW1pZ2Fvcy1sZAorUk0gICAgICAgPSBkZWxldGUgcXVpZXQKK01LRElSICAgID0gbWFrZWRpcgorCitPQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gcG5ncmVhZC5vIFwKKyAgICAgICBwbmdlcnJvci5vIHBuZ3ByZWFkLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIHBuZ3d0cmFuLm8gcG5ncmlvLm8gXAorICAgICAgIHBuZ3dpby5vIHBuZ21lbS5vCisKK2FsbDogJChMSUJOQU1FKSBwbmd0ZXN0CisKKyQoTElCTkFNRSk6ICQoT0JKUykKKyAgICAgICAgICAgICQoQVIpICQoQVJfRkxBR1MpICRAICQoT0JKUykKKyAgICAgICAgICAgICQoUkFOTElCKSAkQAorCitwbmd0ZXN0OiBwbmd0ZXN0Lm8gJChMSUJOQU1FKQorICAgICAgICAkKExOKSAkKExERkxBR1MpIHBuZ3Rlc3QgTElCOmNfcHBjLm8gcG5ndGVzdC5vICQoTElCTkFNRSkgJChMRExJQlMpIFwKK0xJQjplbmQubwpkaWZmIC0tZ2l0IGEvbGlicG5nL3NjcmlwdHMvc3ltLmMgYi9saWJwbmcvc2NyaXB0cy9zeW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTllNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3NjcmlwdHMvc3ltLmMKQEAgLTAsMCArMSwxNSBAQAorCisvKiBzeW0uYyAtIGRlZmluZSBmb3JtYXQgb2YgbGlicG5nLnN5bQorICoKKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgdmVyc2lvbiAxLjYuMTYgW0RlY2VtYmVyIDIyLCAyMDE0XQorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCisgKi8KKworI2RlZmluZSBQTkdfRVhQT1JUQShvcmRpbmFsLCB0eXBlLCBuYW1lLCBhcmdzLCBhdHRyaWJ1dGVzKVwKKyAgICAgICAgUE5HX0RGTiAiQCIgU1lNQk9MX1BSRUZJWCAiQEAiIG5hbWUgIkAiCisKKyNpbmNsdWRlICIuLi9wbmcuaCIKZGlmZiAtLWdpdCBhL2xpYnBuZy9zY3JpcHRzL3N5bWJvbHMuYyBiL2xpYnBuZy9zY3JpcHRzL3N5bWJvbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGI4NDFkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3NjcmlwdHMvc3ltYm9scy5jCkBAIC0wLDAgKzEsNTggQEAKKworLyogc3ltYm9scy5jIC0gZmluZCBhbGwgZXhwb3J0ZWQgc3ltYm9scworICoKKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgdmVyc2lvbiAxLjYuMTYgW0RlY2VtYmVyIDIyLCAyMDE0XQorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCisgKi8KKworLyogTk9URTogbWFraW5nICdzeW1ib2xzLmNoaycgY2hlY2tzIGJvdGggdGhhdCB0aGUgZXhwb3J0ZWQKKyAqIHN5bWJvbHMgaW4gdGhlIGxpYnJhcnkgZG9uJ3QgY2hhbmdlIGFuZCAoaW1wbGljaXRseSkgdGhhdAorICogc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQgaXMgYXMgZXhwZWN0ZWQuCisgKiBJZiBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdCBpcyByZW1hZGUgdXNpbmcKKyAqIHNjcmlwdHMvcG5nbGliY29uZi5kZmEgdGhlbiB0aGlzIGNoZWNrcyB0aGUgLmRmYSBmaWxlIHRvby4KKyAqLworCisjZGVmaW5lIFBOR19FWFBPUlRBKG9yZGluYWwsIHR5cGUsIG5hbWUsIGFyZ3MsIGF0dHJpYnV0ZXMpXAorICAgICAgICBQTkdfREZOICJAIiBuYW1lICJAIEBAIiBvcmRpbmFsICJAIgorI2RlZmluZSBQTkdfUkVNT1ZFRChvcmRpbmFsLCB0eXBlLCBuYW1lLCBhcmdzLCBhdHRyaWJ1dGVzKVwKKyAgICAgICAgUE5HX0RGTiAiOyBAIiBuYW1lICJAIEBAIiBvcmRpbmFsICJAIgorI2RlZmluZSBQTkdfRVhQT1JUX0xBU1RfT1JESU5BTChvcmRpbmFsKVwKKyAgICAgICAgUE5HX0RGTiAiOyBAQCIgb3JkaW5hbCAiQCIKKworLyogUmVhZCB0aGUgZGVmYXVsdHMsIGJ1dCB1c2Ugc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQ7IHRoZSAnc3RhbmRhcmQnCisgKiBoZWFkZXIgZmlsZS4KKyAqLworI2luY2x1ZGUgInBuZ2xpYmNvbmYuaC5wcmVidWlsdCIKKyNpbmNsdWRlICIuLi9wbmcuaCIKKworLyogU29tZSB0aGluZ3MgYXJlIHR1cm5lZCBvZmYgYnkgZGVmYXVsdC4gIFR1cm4gdGhlc2UgdGhpbmdzCisgKiBvbiBoZXJlIChieSBoYW5kKSB0byBnZXQgdGhlIEFQSXMgdGhleSBleHBvc2UgYW5kIHZhbGlkYXRlCisgKiB0aGF0IG5vIGhhcm0gaXMgZG9uZS4gIFRoaXMgbGlzdCBpcyB0aGUgc2V0IG9mIG9wdGlvbnMKKyAqIGRlZmF1bHRlZCB0byAnb2ZmJyBpbiBzY3JpcHRzL3BuZ2xpYmNvbmYuZGZhCisgKgorICogTWFpbnRlbmFuY2U6IGlmIHNjcmlwdHMvcG5nbGliY29uZi5kZmEgb3B0aW9ucyBhcmUgY2hhbmdlZAorICogZnJvbSwgb3IgdG8sICdkaXNhYmxlZCcgdGhpcyBuZWVkcyB1cGRhdGluZyEKKyAqLworI2RlZmluZSBQTkdfQkVOSUdOX0VSUk9SU19TVVBQT1JURUQKKyNkZWZpbmUgUE5HX0VSUk9SX05VTUJFUlNfU1VQUE9SVEVECisjZGVmaW5lIFBOR19SRUFEX0JJR19FTkRJQU5fU1VQUE9SVEVEICAvKiBzaG91bGQgZG8gbm90aGluZyEgKi8KKyNkZWZpbmUgUE5HX0lOQ0hfQ09OVkVSU0lPTlNfU1VQUE9SVEVECisjZGVmaW5lIFBOR19SRUFEXzE2X1RPXzhfQUNDVVJBVEVfU0NBTEVfU1VQUE9SVEVECisjZGVmaW5lIFBOR19TRVRfT1BUSU9OX1NVUFBPUlRFRAorCisjdW5kZWYgUE5HX0gKKyNpbmNsdWRlICIuLi9wbmcuaCIKKworLyogRmluYWxseSB0aGVyZSBhcmUgYSBjb3VwbGUgb2YgcGxhY2VzIHdoZXJlIG9wdGlvbiBzdXBwb3J0CisgKiBhY3R1YWxseSBjaGFuZ2VzIHRoZSBBUElzIHJldmVhbGVkIHVzaW5nIGEgI2lmLyNlbHNlLyNlbmRpZgorICogdGVzdCBpbiBwbmcuaCwgdGVzdCB0aGVzZSBoZXJlLgorICovCisjdW5kZWYgIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQgLyogRXhwb3NlcyAnZml4ZWQnIEFQSXMgKi8KKyN1bmRlZiAgUE5HX0VSUk9SX1RFWFRfU1VQUE9SVEVEICAgICAvKiBFeHBvc2VzIHVuc3VwcG9ydGVkIEFQSXMgKi8KKworI3VuZGVmIFBOR19ICisjaW5jbHVkZSAiLi4vcG5nLmgiCmRpZmYgLS1naXQgYS9saWJwbmcvc2NyaXB0cy9zeW1ib2xzLmRlZiBiL2xpYnBuZy9zY3JpcHRzL3N5bWJvbHMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YjgwNmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvc2NyaXB0cy9zeW1ib2xzLmRlZgpAQCAtMCwwICsxLDI1MSBAQAorO1ZlcnNpb24gMS42LjIwCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgTElCUE5HIHN5bWJvbCBsaXN0IGFzIGEgV2luMzIgREVGIGZpbGUKKzsgQ29udGFpbnMgYWxsIHRoZSBzeW1ib2xzIHRoYXQgY2FuIGJlIGV4cG9ydGVkIGZyb20gbGlicG5nCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xJQlJBUlkKKworRVhQT1JUUworIHBuZ19hY2Nlc3NfdmVyc2lvbl9udW1iZXIgQDEKKyBwbmdfc2V0X3NpZ19ieXRlcyBAMgorIHBuZ19zaWdfY21wIEAzCisgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCBANAorIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0IEA1CisgcG5nX2dldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZSBANgorIHBuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUgQDcKKyBwbmdfc2V0X2xvbmdqbXBfZm4gQDgKKyBwbmdfbG9uZ2ptcCBAOQorIHBuZ19yZXNldF96c3RyZWFtIEAxMAorIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3RfMiBAMTEKKyBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdF8yIEAxMgorIHBuZ193cml0ZV9zaWcgQDEzCisgcG5nX3dyaXRlX2NodW5rIEAxNAorIHBuZ193cml0ZV9jaHVua19zdGFydCBAMTUKKyBwbmdfd3JpdGVfY2h1bmtfZGF0YSBAMTYKKyBwbmdfd3JpdGVfY2h1bmtfZW5kIEAxNworIHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QgQDE4CisgcG5nX2luZm9faW5pdF8zIEAxOQorIHBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFIEAyMAorIHBuZ193cml0ZV9pbmZvIEAyMQorIHBuZ19yZWFkX2luZm8gQDIyCisgcG5nX2NvbnZlcnRfdG9fcmZjMTEyMyBAMjMKKyBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSBAMjQKKyBwbmdfY29udmVydF9mcm9tX3RpbWVfdCBAMjUKKyBwbmdfc2V0X2V4cGFuZCBAMjYKKyBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzggQDI3CisgcG5nX3NldF9wYWxldHRlX3RvX3JnYiBAMjgKKyBwbmdfc2V0X3RSTlNfdG9fYWxwaGEgQDI5CisgcG5nX3NldF9iZ3IgQDMwCisgcG5nX3NldF9ncmF5X3RvX3JnYiBAMzEKKyBwbmdfc2V0X3JnYl90b19ncmF5IEAzMgorIHBuZ19zZXRfcmdiX3RvX2dyYXlfZml4ZWQgQDMzCisgcG5nX2dldF9yZ2JfdG9fZ3JheV9zdGF0dXMgQDM0CisgcG5nX2J1aWxkX2dyYXlzY2FsZV9wYWxldHRlIEAzNQorIHBuZ19zZXRfc3RyaXBfYWxwaGEgQDM2CisgcG5nX3NldF9zd2FwX2FscGhhIEAzNworIHBuZ19zZXRfaW52ZXJ0X2FscGhhIEAzOAorIHBuZ19zZXRfZmlsbGVyIEAzOQorIHBuZ19zZXRfYWRkX2FscGhhIEA0MAorIHBuZ19zZXRfc3dhcCBANDEKKyBwbmdfc2V0X3BhY2tpbmcgQDQyCisgcG5nX3NldF9wYWNrc3dhcCBANDMKKyBwbmdfc2V0X3NoaWZ0IEA0NAorIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nIEA0NQorIHBuZ19zZXRfaW52ZXJ0X21vbm8gQDQ2CisgcG5nX3NldF9iYWNrZ3JvdW5kIEA0NworIHBuZ19zZXRfc3RyaXBfMTYgQDQ4CisgcG5nX3NldF9xdWFudGl6ZSBANDkKKyBwbmdfc2V0X2dhbW1hIEA1MAorIHBuZ19zZXRfZmx1c2ggQDUxCisgcG5nX3dyaXRlX2ZsdXNoIEA1MgorIHBuZ19zdGFydF9yZWFkX2ltYWdlIEA1MworIHBuZ19yZWFkX3VwZGF0ZV9pbmZvIEA1NAorIHBuZ19yZWFkX3Jvd3MgQDU1CisgcG5nX3JlYWRfcm93IEA1NgorIHBuZ19yZWFkX2ltYWdlIEA1NworIHBuZ193cml0ZV9yb3cgQDU4CisgcG5nX3dyaXRlX3Jvd3MgQDU5CisgcG5nX3dyaXRlX2ltYWdlIEA2MAorIHBuZ193cml0ZV9lbmQgQDYxCisgcG5nX3JlYWRfZW5kIEA2MgorIHBuZ19kZXN0cm95X2luZm9fc3RydWN0IEA2MworIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0IEA2NAorIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCBANjUKKyBwbmdfc2V0X2NyY19hY3Rpb24gQDY2CisgcG5nX3NldF9maWx0ZXIgQDY3CisgcG5nX3NldF9maWx0ZXJfaGV1cmlzdGljcyBANjgKKyBwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsIEA2OQorIHBuZ19zZXRfY29tcHJlc3Npb25fbWVtX2xldmVsIEA3MAorIHBuZ19zZXRfY29tcHJlc3Npb25fc3RyYXRlZ3kgQDcxCisgcG5nX3NldF9jb21wcmVzc2lvbl93aW5kb3dfYml0cyBANzIKKyBwbmdfc2V0X2NvbXByZXNzaW9uX21ldGhvZCBANzMKKyBwbmdfaW5pdF9pbyBANzQKKyBwbmdfc2V0X2Vycm9yX2ZuIEA3NQorIHBuZ19nZXRfZXJyb3JfcHRyIEA3NgorIHBuZ19zZXRfd3JpdGVfZm4gQDc3CisgcG5nX3NldF9yZWFkX2ZuIEA3OAorIHBuZ19nZXRfaW9fcHRyIEA3OQorIHBuZ19zZXRfcmVhZF9zdGF0dXNfZm4gQDgwCisgcG5nX3NldF93cml0ZV9zdGF0dXNfZm4gQDgxCisgcG5nX3NldF9tZW1fZm4gQDgyCisgcG5nX2dldF9tZW1fcHRyIEA4MworIHBuZ19zZXRfcmVhZF91c2VyX3RyYW5zZm9ybV9mbiBAODQKKyBwbmdfc2V0X3dyaXRlX3VzZXJfdHJhbnNmb3JtX2ZuIEA4NQorIHBuZ19zZXRfdXNlcl90cmFuc2Zvcm1faW5mbyBAODYKKyBwbmdfZ2V0X3VzZXJfdHJhbnNmb3JtX3B0ciBAODcKKyBwbmdfc2V0X3JlYWRfdXNlcl9jaHVua19mbiBAODgKKyBwbmdfZ2V0X3VzZXJfY2h1bmtfcHRyIEA4OQorIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbiBAOTAKKyBwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0ciBAOTEKKyBwbmdfcHJvY2Vzc19kYXRhIEA5MgorIHBuZ19wcm9ncmVzc2l2ZV9jb21iaW5lX3JvdyBAOTMKKyBwbmdfbWFsbG9jIEA5NAorIHBuZ19jYWxsb2MgQDk1CisgcG5nX21hbGxvY193YXJuIEA5NgorIHBuZ19mcmVlIEA5NworIHBuZ19mcmVlX2RhdGEgQDk4CisgcG5nX2RhdGFfZnJlZXIgQDk5CisgcG5nX21hbGxvY19kZWZhdWx0IEAxMDAKKyBwbmdfZnJlZV9kZWZhdWx0IEAxMDEKKyBwbmdfZXJyb3IgQDEwMgorIHBuZ19jaHVua19lcnJvciBAMTAzCisgcG5nX2VyciBAMTA0CisgcG5nX3dhcm5pbmcgQDEwNQorIHBuZ19jaHVua193YXJuaW5nIEAxMDYKKyBwbmdfYmVuaWduX2Vycm9yIEAxMDcKKyBwbmdfY2h1bmtfYmVuaWduX2Vycm9yIEAxMDgKKyBwbmdfc2V0X2Jlbmlnbl9lcnJvcnMgQDEwOQorIHBuZ19nZXRfdmFsaWQgQDExMAorIHBuZ19nZXRfcm93Ynl0ZXMgQDExMQorIHBuZ19nZXRfcm93cyBAMTEyCisgcG5nX3NldF9yb3dzIEAxMTMKKyBwbmdfZ2V0X2NoYW5uZWxzIEAxMTQKKyBwbmdfZ2V0X2ltYWdlX3dpZHRoIEAxMTUKKyBwbmdfZ2V0X2ltYWdlX2hlaWdodCBAMTE2CisgcG5nX2dldF9iaXRfZGVwdGggQDExNworIHBuZ19nZXRfY29sb3JfdHlwZSBAMTE4CisgcG5nX2dldF9maWx0ZXJfdHlwZSBAMTE5CisgcG5nX2dldF9pbnRlcmxhY2VfdHlwZSBAMTIwCisgcG5nX2dldF9jb21wcmVzc2lvbl90eXBlIEAxMjEKKyBwbmdfZ2V0X3BpeGVsc19wZXJfbWV0ZXIgQDEyMgorIHBuZ19nZXRfeF9waXhlbHNfcGVyX21ldGVyIEAxMjMKKyBwbmdfZ2V0X3lfcGl4ZWxzX3Blcl9tZXRlciBAMTI0CisgcG5nX2dldF9waXhlbF9hc3BlY3RfcmF0aW8gQDEyNQorIHBuZ19nZXRfeF9vZmZzZXRfcGl4ZWxzIEAxMjYKKyBwbmdfZ2V0X3lfb2Zmc2V0X3BpeGVscyBAMTI3CisgcG5nX2dldF94X29mZnNldF9taWNyb25zIEAxMjgKKyBwbmdfZ2V0X3lfb2Zmc2V0X21pY3JvbnMgQDEyOQorIHBuZ19nZXRfc2lnbmF0dXJlIEAxMzAKKyBwbmdfZ2V0X2JLR0QgQDEzMQorIHBuZ19zZXRfYktHRCBAMTMyCisgcG5nX2dldF9jSFJNIEAxMzMKKyBwbmdfZ2V0X2NIUk1fZml4ZWQgQDEzNAorIHBuZ19zZXRfY0hSTSBAMTM1CisgcG5nX3NldF9jSFJNX2ZpeGVkIEAxMzYKKyBwbmdfZ2V0X2dBTUEgQDEzNworIHBuZ19nZXRfZ0FNQV9maXhlZCBAMTM4CisgcG5nX3NldF9nQU1BIEAxMzkKKyBwbmdfc2V0X2dBTUFfZml4ZWQgQDE0MAorIHBuZ19nZXRfaElTVCBAMTQxCisgcG5nX3NldF9oSVNUIEAxNDIKKyBwbmdfZ2V0X0lIRFIgQDE0MworIHBuZ19zZXRfSUhEUiBAMTQ0CisgcG5nX2dldF9vRkZzIEAxNDUKKyBwbmdfc2V0X29GRnMgQDE0NgorIHBuZ19nZXRfcENBTCBAMTQ3CisgcG5nX3NldF9wQ0FMIEAxNDgKKyBwbmdfZ2V0X3BIWXMgQDE0OQorIHBuZ19zZXRfcEhZcyBAMTUwCisgcG5nX2dldF9QTFRFIEAxNTEKKyBwbmdfc2V0X1BMVEUgQDE1MgorIHBuZ19nZXRfc0JJVCBAMTUzCisgcG5nX3NldF9zQklUIEAxNTQKKyBwbmdfZ2V0X3NSR0IgQDE1NQorIHBuZ19zZXRfc1JHQiBAMTU2CisgcG5nX3NldF9zUkdCX2dBTUFfYW5kX2NIUk0gQDE1NworIHBuZ19nZXRfaUNDUCBAMTU4CisgcG5nX3NldF9pQ0NQIEAxNTkKKyBwbmdfZ2V0X3NQTFQgQDE2MAorIHBuZ19zZXRfc1BMVCBAMTYxCisgcG5nX2dldF90ZXh0IEAxNjIKKyBwbmdfc2V0X3RleHQgQDE2MworIHBuZ19nZXRfdElNRSBAMTY0CisgcG5nX3NldF90SU1FIEAxNjUKKyBwbmdfZ2V0X3RSTlMgQDE2NgorIHBuZ19zZXRfdFJOUyBAMTY3CisgcG5nX2dldF9zQ0FMIEAxNjgKKyBwbmdfZ2V0X3NDQUxfcyBAMTY5CisgcG5nX3NldF9zQ0FMIEAxNzAKKyBwbmdfc2V0X3NDQUxfcyBAMTcxCisgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzIEAxNzIKKyBwbmdfaGFuZGxlX2FzX3Vua25vd24gQDE3MworIHBuZ19zZXRfdW5rbm93bl9jaHVua3MgQDE3NAorIHBuZ19zZXRfdW5rbm93bl9jaHVua19sb2NhdGlvbiBAMTc1CisgcG5nX2dldF91bmtub3duX2NodW5rcyBAMTc2CisgcG5nX3NldF9pbnZhbGlkIEAxNzcKKyBwbmdfcmVhZF9wbmcgQDE3OAorIHBuZ193cml0ZV9wbmcgQDE3OQorIHBuZ19nZXRfY29weXJpZ2h0IEAxODAKKyBwbmdfZ2V0X2hlYWRlcl92ZXIgQDE4MQorIHBuZ19nZXRfaGVhZGVyX3ZlcnNpb24gQDE4MgorIHBuZ19nZXRfbGlicG5nX3ZlciBAMTgzCisgcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMgQDE4NAorIHBuZ19zZXRfc3RyaXBfZXJyb3JfbnVtYmVycyBAMTg1CisgcG5nX3NldF91c2VyX2xpbWl0cyBAMTg2CisgcG5nX2dldF91c2VyX3dpZHRoX21heCBAMTg3CisgcG5nX2dldF91c2VyX2hlaWdodF9tYXggQDE4OAorIHBuZ19zZXRfY2h1bmtfY2FjaGVfbWF4IEAxODkKKyBwbmdfZ2V0X2NodW5rX2NhY2hlX21heCBAMTkwCisgcG5nX3NldF9jaHVua19tYWxsb2NfbWF4IEAxOTEKKyBwbmdfZ2V0X2NodW5rX21hbGxvY19tYXggQDE5MgorIHBuZ19nZXRfcGl4ZWxzX3Blcl9pbmNoIEAxOTMKKyBwbmdfZ2V0X3hfcGl4ZWxzX3Blcl9pbmNoIEAxOTQKKyBwbmdfZ2V0X3lfcGl4ZWxzX3Blcl9pbmNoIEAxOTUKKyBwbmdfZ2V0X3hfb2Zmc2V0X2luY2hlcyBAMTk2CisgcG5nX2dldF95X29mZnNldF9pbmNoZXMgQDE5NworIHBuZ19nZXRfcEhZc19kcGkgQDE5OAorIHBuZ19nZXRfaW9fc3RhdGUgQDE5OQorIHBuZ19nZXRfdWludF8zMiBAMjAxCisgcG5nX2dldF91aW50XzE2IEAyMDIKKyBwbmdfZ2V0X2ludF8zMiBAMjAzCisgcG5nX2dldF91aW50XzMxIEAyMDQKKyBwbmdfc2F2ZV91aW50XzMyIEAyMDUKKyBwbmdfc2F2ZV9pbnRfMzIgQDIwNgorIHBuZ19zYXZlX3VpbnRfMTYgQDIwNworIHBuZ19zZXRfZ2FtbWFfZml4ZWQgQDIwOAorIHBuZ19zZXRfZmlsdGVyX2hldXJpc3RpY3NfZml4ZWQgQDIwOQorIHBuZ19nZXRfcGl4ZWxfYXNwZWN0X3JhdGlvX2ZpeGVkIEAyMTAKKyBwbmdfZ2V0X3hfb2Zmc2V0X2luY2hlc19maXhlZCBAMjExCisgcG5nX2dldF95X29mZnNldF9pbmNoZXNfZml4ZWQgQDIxMgorIHBuZ19zZXRfc0NBTF9maXhlZCBAMjEzCisgcG5nX2dldF9zQ0FMX2ZpeGVkIEAyMTQKKyBwbmdfc2V0X2JhY2tncm91bmRfZml4ZWQgQDIxNQorIHBuZ19nZXRfaW9fY2h1bmtfdHlwZSBAMjE2CisgcG5nX2dldF9jdXJyZW50X3Jvd19udW1iZXIgQDIxNworIHBuZ19nZXRfY3VycmVudF9wYXNzX251bWJlciBAMjE4CisgcG5nX3Byb2Nlc3NfZGF0YV9wYXVzZSBAMjE5CisgcG5nX3Byb2Nlc3NfZGF0YV9za2lwIEAyMjAKKyBwbmdfc2V0X2V4cGFuZF8xNiBAMjIxCisgcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX2xldmVsIEAyMjIKKyBwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fbWVtX2xldmVsIEAyMjMKKyBwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fc3RyYXRlZ3kgQDIyNAorIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl93aW5kb3dfYml0cyBAMjI1CisgcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX21ldGhvZCBAMjI2CisgcG5nX3NldF9hbHBoYV9tb2RlIEAyMjcKKyBwbmdfc2V0X2FscGhhX21vZGVfZml4ZWQgQDIyOAorIHBuZ19zZXRfc2NhbGVfMTYgQDIyOQorIHBuZ19nZXRfY0hSTV9YWVogQDIzMAorIHBuZ19nZXRfY0hSTV9YWVpfZml4ZWQgQDIzMQorIHBuZ19zZXRfY0hSTV9YWVogQDIzMgorIHBuZ19zZXRfY0hSTV9YWVpfZml4ZWQgQDIzMworIHBuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fZmlsZSBAMjM0CisgcG5nX2ltYWdlX2JlZ2luX3JlYWRfZnJvbV9zdGRpbyBAMjM1CisgcG5nX2ltYWdlX2JlZ2luX3JlYWRfZnJvbV9tZW1vcnkgQDIzNgorIHBuZ19pbWFnZV9maW5pc2hfcmVhZCBAMjM3CisgcG5nX2ltYWdlX2ZyZWUgQDIzOAorIHBuZ19pbWFnZV93cml0ZV90b19maWxlIEAyMzkKKyBwbmdfaW1hZ2Vfd3JpdGVfdG9fc3RkaW8gQDI0MAorIHBuZ19jb252ZXJ0X3RvX3JmYzExMjNfYnVmZmVyIEAyNDEKKyBwbmdfc2V0X2NoZWNrX2Zvcl9pbnZhbGlkX2luZGV4IEAyNDIKKyBwbmdfZ2V0X3BhbGV0dGVfbWF4IEAyNDMKKyBwbmdfc2V0X29wdGlvbiBAMjQ0CmRpZmYgLS1naXQgYS9saWJwbmcvc2NyaXB0cy92ZXJzLmMgYi9saWJwbmcvc2NyaXB0cy92ZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU3MzE5NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy9zY3JpcHRzL3ZlcnMuYwpAQCAtMCwwICsxLDE5IEBACisKKy8qIHZlcnMuYyAtIGRlZmluZSBmb3JtYXQgb2YgbGlicG5nLnZlcnMKKyAqCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIHZlcnNpb24gMS42LjE2IFtEZWNlbWJlciAyMiwgMjAxNF0KKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE0IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisgKiBhbmQgbGljZW5zZSBpbiBwbmcuaAorICovCisKKyNkZWZpbmUgUE5HX0VYUE9SVEEob3JkaW5hbCwgdHlwZSwgbmFtZSwgYXJncywgYXR0cmlidXRlcylcCisgICAgICAgIFBOR19ERk4gIiBAIiBTWU1CT0xfUFJFRklYICJAQCIgbmFtZSAiQDsiCisKK1BOR19ERk4gIkAiIFBOR0xJQl9MSUJOQU1FICJAIHtnbG9iYWw6IgorCisjaW5jbHVkZSAiLi4vcG5nLmgiCisKK1BOR19ERk4gImxvY2FsOiAqOyB9OyIKZGlmZiAtLWdpdCBhL2xpYnBuZy90ZXN0cy9wbmdpbWFnZS1mdWxsIGIvbGlicG5nL3Rlc3RzL3BuZ2ltYWdlLWZ1bGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTE5OGVkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy90ZXN0cy9wbmdpbWFnZS1mdWxsCkBAIC0wLDAgKzEsMiBAQAorIyEvYmluL3NoCitleGVjIC4vcG5naW1hZ2UgLS1leGhhdXN0aXZlIC0tbGlzdC1jb21ib3MgLS1sb2cgIiR7c3JjZGlyfS9jb250cmliL3BuZ3N1aXRlLyIqLnBuZwpkaWZmIC0tZ2l0IGEvbGlicG5nL3Rlc3RzL3BuZ2ltYWdlLXF1aWNrIGIvbGlicG5nL3Rlc3RzL3BuZ2ltYWdlLXF1aWNrCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMyOGRjMjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvdGVzdHMvcG5naW1hZ2UtcXVpY2sKQEAgLTAsMCArMSwyIEBACisjIS9iaW4vc2gKK2V4ZWMgLi9wbmdpbWFnZSAtLWxpc3QtY29tYm9zIC0tbG9nICIke3NyY2Rpcn0vY29udHJpYi9wbmdzdWl0ZS8iKi5wbmcKZGlmZiAtLWdpdCBhL2xpYnBuZy90ZXN0cy9wbmdzdGVzdCBiL2xpYnBuZy90ZXN0cy9wbmdzdGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNTVlZDA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3Rlc3RzL3BuZ3N0ZXN0CkBAIC0wLDAgKzEsNTIgQEAKKyMhL2Jpbi9zaAorIworIyBVc2FnZToKKyMKKyMgIHRlc3RzL3BuZ3N0ZXN0IGdhbW1hIGFscGhhCisjCisjIFJ1biAuL3BuZ3N0ZXN0IG9uIHRoZSBQTkcgZmlsZXMgaW4gJHNyY2Rpci9jb250cmliL3Rlc3RwbmdzIHdoaWNoIGhhdmUgdGhlCisjIGdpdmVuIGdhbW1hIGFuZCBvcGFjaXR5OgorIworIyAgZ2FtbWE6IG9uZSBvZjsgbGluZWFyLCAxLjgsIHNSR0IsIG5vbmUuCisjICBhbHBoYTogb25lIG9mOyBvcGFxdWUsIHRSTlMsIGFscGhhLCBub25lLiAgJ25vbmUnIGlzIGVxdWl2YWxlbnQgdG8gIWFscGhhCisjCisjIE5PVEU6IHRoZSB0ZW1wb3JhcnkgZmlsZXMgcG5nc3Rlc3QgZ2VuZXJhdGVzIGhhdmUgdGhlIGJhc2UgbmFtZSBnYW1tYS1hbHBoYSB0bworIyBhdm9pZCBpc3N1ZXMgd2l0aCBtYWtlIC1qCisjCitnYW1tYT0iJDEiCitzaGlmdAorYWxwaGE9IiQxIgorc2hpZnQKK2V4ZWMgLi9wbmdzdGVzdCAtLXRtcGZpbGUgIiR7Z2FtbWF9LSR7YWxwaGF9LSIgLS1sb2cgJHsxKyIkQCJ9ICQoCisgICBmb3IgZiBpbiAiJHtzcmNkaXJ9L2NvbnRyaWIvdGVzdHBuZ3MvIioucG5nCisgICBkbworICAgICAgZz0KKyAgICAgIGNhc2UgIiRmIiBpbgorICAgICAgICAgKi1saW5lYXJbLi1dKikKKyAgICAgICAgICAgIHRlc3QgIiRnYW1tYSIgPSAibGluZWFyIiAmJiBnPSIkZiI7OworCisgICAgICAgICAqLXNSR0JbLi1dKikKKyAgICAgICAgICAgIHRlc3QgIiRnYW1tYSIgPSAic1JHQiIgJiYgZz0iJGYiOzsKKworICAgICAgICAgKi0xLjhbLi1dKikKKyAgICAgICAgICAgIHRlc3QgIiRnYW1tYSIgPSAiMS44IiAmJiBnPSIkZiI7OworCisgICAgICAgICAqKQorICAgICAgICAgICAgdGVzdCAiJGdhbW1hIiA9ICJub25lIiAmJiBnPSIkZiI7OworICAgICAgZXNhYworCisgICAgICBjYXNlICIkZyIgaW4KKyAgICAgICAgICIiKQorICAgICAgICAgICAgOjs7CisKKyAgICAgICAgICotYWxwaGFbLS5dKikKKyAgICAgICAgICAgIHRlc3QgIiRhbHBoYSIgPSAiYWxwaGEiICYmIGVjaG8gIiRnIjs7CisKKyAgICAgICAgICotdFJOU1stLl0qKQorICAgICAgICAgICAgdGVzdCAiJGFscGhhIiA9ICJ0Uk5TIiAtbyAiJGFscGhhIiA9ICJub25lIiAmJiBlY2hvICIkZyI7OworCisgICAgICAgICAqKQorICAgICAgICAgICAgdGVzdCAiJGFscGhhIiA9ICJvcGFxdWUiIC1vICIkYWxwaGEiID0gIm5vbmUiICYmIGVjaG8gIiRnIjs7CisgICAgICBlc2FjCisgICBkb25lCispCmRpZmYgLS1naXQgYS9saWJwbmcvdGVzdHMvcG5nc3Rlc3QtMS44IGIvbGlicG5nL3Rlc3RzL3BuZ3N0ZXN0LTEuOApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMmVjMjFiCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3Rlc3RzL3BuZ3N0ZXN0LTEuOApAQCAtMCwwICsxLDIgQEAKKyMhL2Jpbi9zaAorZXhlYyAiJHtzcmNkaXJ9L3Rlc3RzL3BuZ3N0ZXN0IiAxLjggbm9uZQpkaWZmIC0tZ2l0IGEvbGlicG5nL3Rlc3RzL3BuZ3N0ZXN0LTEuOC1hbHBoYSBiL2xpYnBuZy90ZXN0cy9wbmdzdGVzdC0xLjgtYWxwaGEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDAwNTk2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy90ZXN0cy9wbmdzdGVzdC0xLjgtYWxwaGEKQEAgLTAsMCArMSwyIEBACisjIS9iaW4vc2gKK2V4ZWMgIiR7c3JjZGlyfS90ZXN0cy9wbmdzdGVzdCIgMS44IGFscGhhCmRpZmYgLS1naXQgYS9saWJwbmcvdGVzdHMvcG5nc3Rlc3QtbGluZWFyIGIvbGlicG5nL3Rlc3RzL3BuZ3N0ZXN0LWxpbmVhcgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YTViM2ZlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3Rlc3RzL3BuZ3N0ZXN0LWxpbmVhcgpAQCAtMCwwICsxLDIgQEAKKyMhL2Jpbi9zaAorZXhlYyAiJHtzcmNkaXJ9L3Rlc3RzL3BuZ3N0ZXN0IiBsaW5lYXIgbm9uZQpkaWZmIC0tZ2l0IGEvbGlicG5nL3Rlc3RzL3BuZ3N0ZXN0LWxpbmVhci1hbHBoYSBiL2xpYnBuZy90ZXN0cy9wbmdzdGVzdC1saW5lYXItYWxwaGEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDExNDIxMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy90ZXN0cy9wbmdzdGVzdC1saW5lYXItYWxwaGEKQEAgLTAsMCArMSwyIEBACisjIS9iaW4vc2gKK2V4ZWMgIiR7c3JjZGlyfS90ZXN0cy9wbmdzdGVzdCIgbGluZWFyIGFscGhhCmRpZmYgLS1naXQgYS9saWJwbmcvdGVzdHMvcG5nc3Rlc3Qtbm9uZSBiL2xpYnBuZy90ZXN0cy9wbmdzdGVzdC1ub25lCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA5YWQ3NDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvdGVzdHMvcG5nc3Rlc3Qtbm9uZQpAQCAtMCwwICsxLDIgQEAKKyMhL2Jpbi9zaAorZXhlYyAiJHtzcmNkaXJ9L3Rlc3RzL3BuZ3N0ZXN0IiBub25lIG5vbmUKZGlmZiAtLWdpdCBhL2xpYnBuZy90ZXN0cy9wbmdzdGVzdC1ub25lLWFscGhhIGIvbGlicG5nL3Rlc3RzL3BuZ3N0ZXN0LW5vbmUtYWxwaGEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWY2MDgzZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy90ZXN0cy9wbmdzdGVzdC1ub25lLWFscGhhCkBAIC0wLDAgKzEsMiBAQAorIyEvYmluL3NoCitleGVjICIke3NyY2Rpcn0vdGVzdHMvcG5nc3Rlc3QiIG5vbmUgYWxwaGEKZGlmZiAtLWdpdCBhL2xpYnBuZy90ZXN0cy9wbmdzdGVzdC1zUkdCIGIvbGlicG5nL3Rlc3RzL3BuZ3N0ZXN0LXNSR0IKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDg0NjA4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy90ZXN0cy9wbmdzdGVzdC1zUkdCCkBAIC0wLDAgKzEsMiBAQAorIyEvYmluL3NoCitleGVjICIke3NyY2Rpcn0vdGVzdHMvcG5nc3Rlc3QiIHNSR0Igbm9uZQpkaWZmIC0tZ2l0IGEvbGlicG5nL3Rlc3RzL3BuZ3N0ZXN0LXNSR0ItYWxwaGEgYi9saWJwbmcvdGVzdHMvcG5nc3Rlc3Qtc1JHQi1hbHBoYQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMWU1N2QzCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3Rlc3RzL3BuZ3N0ZXN0LXNSR0ItYWxwaGEKQEAgLTAsMCArMSwyIEBACisjIS9iaW4vc2gKK2V4ZWMgIiR7c3JjZGlyfS90ZXN0cy9wbmdzdGVzdCIgc1JHQiBhbHBoYQpkaWZmIC0tZ2l0IGEvbGlicG5nL3Rlc3RzL3BuZ3Rlc3QgYi9saWJwbmcvdGVzdHMvcG5ndGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MTM5NzNiCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3Rlc3RzL3BuZ3Rlc3QKQEAgLTAsMCArMSwyIEBACisjIS9iaW4vc2gKK2V4ZWMgLi9wbmd0ZXN0IC0tc3RyaWN0ICR7c3JjZGlyfS9wbmd0ZXN0LnBuZwpkaWZmIC0tZ2l0IGEvbGlicG5nL3Rlc3RzL3BuZ3Vua25vd24tSURBVCBiL2xpYnBuZy90ZXN0cy9wbmd1bmtub3duLUlEQVQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGU3MjgxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy90ZXN0cy9wbmd1bmtub3duLUlEQVQKQEAgLTAsMCArMSwyIEBACisjIS9iaW4vc2gKK2V4ZWMgLi9wbmd1bmtub3duIC0tc3RyaWN0IGRlZmF1bHQ9ZGlzY2FyZCBJREFUPXNhdmUgIiR7c3JjZGlyfS9wbmd0ZXN0LnBuZyIKZGlmZiAtLWdpdCBhL2xpYnBuZy90ZXN0cy9wbmd1bmtub3duLWRpc2NhcmQgYi9saWJwbmcvdGVzdHMvcG5ndW5rbm93bi1kaXNjYXJkCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM5NmRhYjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvdGVzdHMvcG5ndW5rbm93bi1kaXNjYXJkCkBAIC0wLDAgKzEsMiBAQAorIyEvYmluL3NoCitleGVjIC4vcG5ndW5rbm93biAtLXN0cmljdCBkZWZhdWx0PWRpc2NhcmQgIiR7c3JjZGlyfS9wbmd0ZXN0LnBuZyIKZGlmZiAtLWdpdCBhL2xpYnBuZy90ZXN0cy9wbmd1bmtub3duLWlmLXNhZmUgYi9saWJwbmcvdGVzdHMvcG5ndW5rbm93bi1pZi1zYWZlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMxYTQ5NTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvdGVzdHMvcG5ndW5rbm93bi1pZi1zYWZlCkBAIC0wLDAgKzEsMiBAQAorIyEvYmluL3NoCitleGVjIC4vcG5ndW5rbm93biAtLXN0cmljdCBkZWZhdWx0PWlmLXNhZmUgIiR7c3JjZGlyfS9wbmd0ZXN0LnBuZyIKZGlmZiAtLWdpdCBhL2xpYnBuZy90ZXN0cy9wbmd1bmtub3duLXNBUEkgYi9saWJwbmcvdGVzdHMvcG5ndW5rbm93bi1zQVBJCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQzMTdiMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvdGVzdHMvcG5ndW5rbm93bi1zQVBJCkBAIC0wLDAgKzEsMiBAQAorIyEvYmluL3NoCitleGVjIC4vcG5ndW5rbm93biAtLXN0cmljdCBiS0dEPXNhdmUgY0hSTT1zYXZlIGdBTUE9c2F2ZSBhbGw9ZGlzY2FyZCBpQ0NQPXNhdmUgc0JJVD1zYXZlIHNSR0I9c2F2ZSAiJHtzcmNkaXJ9L3BuZ3Rlc3QucG5nIgpkaWZmIC0tZ2l0IGEvbGlicG5nL3Rlc3RzL3BuZ3Vua25vd24tc1RFUiBiL2xpYnBuZy90ZXN0cy9wbmd1bmtub3duLXNURVIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTljNWVjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy90ZXN0cy9wbmd1bmtub3duLXNURVIKQEAgLTAsMCArMSwyIEBACisjIS9iaW4vc2gKK2V4ZWMgLi9wbmd1bmtub3duIC0tc3RyaWN0IHNURVI9aWYtc2FmZSAiJHtzcmNkaXJ9L3BuZ3Rlc3QucG5nIgpkaWZmIC0tZ2l0IGEvbGlicG5nL3Rlc3RzL3BuZ3Vua25vd24tc2F2ZSBiL2xpYnBuZy90ZXN0cy9wbmd1bmtub3duLXNhdmUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjE0MTJjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy90ZXN0cy9wbmd1bmtub3duLXNhdmUKQEAgLTAsMCArMSwyIEBACisjIS9iaW4vc2gKK2V4ZWMgLi9wbmd1bmtub3duIC0tc3RyaWN0IGRlZmF1bHQ9c2F2ZSAiJHtzcmNkaXJ9L3BuZ3Rlc3QucG5nIgpkaWZmIC0tZ2l0IGEvbGlicG5nL3Rlc3RzL3BuZ3Vua25vd24tdnBBZyBiL2xpYnBuZy90ZXN0cy9wbmd1bmtub3duLXZwQWcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDRmMDdiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy90ZXN0cy9wbmd1bmtub3duLXZwQWcKQEAgLTAsMCArMSwyIEBACisjIS9iaW4vc2gKK2V4ZWMgLi9wbmd1bmtub3duIC0tc3RyaWN0IHZwQWc9aWYtc2FmZSAiJHtzcmNkaXJ9L3BuZ3Rlc3QucG5nIgpkaWZmIC0tZ2l0IGEvbGlicG5nL3Rlc3RzL3BuZ3ZhbGlkLWdhbW1hLTE2LXRvLTggYi9saWJwbmcvdGVzdHMvcG5ndmFsaWQtZ2FtbWEtMTYtdG8tOApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNzQ5NDVkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3Rlc3RzL3BuZ3ZhbGlkLWdhbW1hLTE2LXRvLTgKQEAgLTAsMCArMSwyIEBACisjIS9iaW4vc2gKK2V4ZWMgLi9wbmd2YWxpZCAtLXN0cmljdCAtLWdhbW1hLTE2LXRvLTgKZGlmZiAtLWdpdCBhL2xpYnBuZy90ZXN0cy9wbmd2YWxpZC1nYW1tYS1hbHBoYS1tb2RlIGIvbGlicG5nL3Rlc3RzL3BuZ3ZhbGlkLWdhbW1hLWFscGhhLW1vZGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjE2ZThhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy90ZXN0cy9wbmd2YWxpZC1nYW1tYS1hbHBoYS1tb2RlCkBAIC0wLDAgKzEsMiBAQAorIyEvYmluL3NoCitleGVjIC4vcG5ndmFsaWQgLS1zdHJpY3QgLS1nYW1tYS1hbHBoYS1tb2RlCmRpZmYgLS1naXQgYS9saWJwbmcvdGVzdHMvcG5ndmFsaWQtZ2FtbWEtYmFja2dyb3VuZCBiL2xpYnBuZy90ZXN0cy9wbmd2YWxpZC1nYW1tYS1iYWNrZ3JvdW5kCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNkYmY1OGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvdGVzdHMvcG5ndmFsaWQtZ2FtbWEtYmFja2dyb3VuZApAQCAtMCwwICsxLDIgQEAKKyMhL2Jpbi9zaAorZXhlYyAuL3BuZ3ZhbGlkIC0tc3RyaWN0IC0tZ2FtbWEtYmFja2dyb3VuZApkaWZmIC0tZ2l0IGEvbGlicG5nL3Rlc3RzL3BuZ3ZhbGlkLWdhbW1hLWV4cGFuZDE2LWFscGhhLW1vZGUgYi9saWJwbmcvdGVzdHMvcG5ndmFsaWQtZ2FtbWEtZXhwYW5kMTYtYWxwaGEtbW9kZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZmExMGJkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3Rlc3RzL3BuZ3ZhbGlkLWdhbW1hLWV4cGFuZDE2LWFscGhhLW1vZGUKQEAgLTAsMCArMSwyIEBACisjIS9iaW4vc2gKK2V4ZWMgLi9wbmd2YWxpZCAtLXN0cmljdCAtLWdhbW1hLWFscGhhLW1vZGUgLS1leHBhbmQxNgpkaWZmIC0tZ2l0IGEvbGlicG5nL3Rlc3RzL3BuZ3ZhbGlkLWdhbW1hLWV4cGFuZDE2LWJhY2tncm91bmQgYi9saWJwbmcvdGVzdHMvcG5ndmFsaWQtZ2FtbWEtZXhwYW5kMTYtYmFja2dyb3VuZApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZDlhOTE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3Rlc3RzL3BuZ3ZhbGlkLWdhbW1hLWV4cGFuZDE2LWJhY2tncm91bmQKQEAgLTAsMCArMSwyIEBACisjIS9iaW4vc2gKK2V4ZWMgLi9wbmd2YWxpZCAtLXN0cmljdCAtLWdhbW1hLWJhY2tncm91bmQgLS1leHBhbmQxNgpkaWZmIC0tZ2l0IGEvbGlicG5nL3Rlc3RzL3BuZ3ZhbGlkLWdhbW1hLWV4cGFuZDE2LXRyYW5zZm9ybSBiL2xpYnBuZy90ZXN0cy9wbmd2YWxpZC1nYW1tYS1leHBhbmQxNi10cmFuc2Zvcm0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWZkMWYyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy90ZXN0cy9wbmd2YWxpZC1nYW1tYS1leHBhbmQxNi10cmFuc2Zvcm0KQEAgLTAsMCArMSwyIEBACisjIS9iaW4vc2gKK2V4ZWMgLi9wbmd2YWxpZCAtLXN0cmljdCAtLWdhbW1hLXRyYW5zZm9ybSAtLWV4cGFuZDE2CmRpZmYgLS1naXQgYS9saWJwbmcvdGVzdHMvcG5ndmFsaWQtZ2FtbWEtc2JpdCBiL2xpYnBuZy90ZXN0cy9wbmd2YWxpZC1nYW1tYS1zYml0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZjYTA4ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvdGVzdHMvcG5ndmFsaWQtZ2FtbWEtc2JpdApAQCAtMCwwICsxLDIgQEAKKyMhL2Jpbi9zaAorZXhlYyAuL3BuZ3ZhbGlkIC0tc3RyaWN0IC0tZ2FtbWEtc2JpdApkaWZmIC0tZ2l0IGEvbGlicG5nL3Rlc3RzL3BuZ3ZhbGlkLWdhbW1hLXRocmVzaG9sZCBiL2xpYnBuZy90ZXN0cy9wbmd2YWxpZC1nYW1tYS10aHJlc2hvbGQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2ZlNGVkZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy90ZXN0cy9wbmd2YWxpZC1nYW1tYS10aHJlc2hvbGQKQEAgLTAsMCArMSwyIEBACisjIS9iaW4vc2gKK2V4ZWMgLi9wbmd2YWxpZCAtLXN0cmljdCAtLWdhbW1hLXRocmVzaG9sZApkaWZmIC0tZ2l0IGEvbGlicG5nL3Rlc3RzL3BuZ3ZhbGlkLWdhbW1hLXRyYW5zZm9ybSBiL2xpYnBuZy90ZXN0cy9wbmd2YWxpZC1nYW1tYS10cmFuc2Zvcm0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2ZhNjJjNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy90ZXN0cy9wbmd2YWxpZC1nYW1tYS10cmFuc2Zvcm0KQEAgLTAsMCArMSwyIEBACisjIS9iaW4vc2gKK2V4ZWMgLi9wbmd2YWxpZCAtLXN0cmljdCAtLWdhbW1hLXRyYW5zZm9ybQpkaWZmIC0tZ2l0IGEvbGlicG5nL3Rlc3RzL3BuZ3ZhbGlkLXByb2dyZXNzaXZlLWludGVybGFjZS1zdGFuZGFyZCBiL2xpYnBuZy90ZXN0cy9wbmd2YWxpZC1wcm9ncmVzc2l2ZS1pbnRlcmxhY2Utc3RhbmRhcmQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYThjZGY5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy90ZXN0cy9wbmd2YWxpZC1wcm9ncmVzc2l2ZS1pbnRlcmxhY2Utc3RhbmRhcmQKQEAgLTAsMCArMSwyIEBACisjIS9iaW4vc2gKK2V4ZWMgLi9wbmd2YWxpZCAtLXN0cmljdCAtLXN0YW5kYXJkIC0tcHJvZ3Jlc3NpdmUtcmVhZCAtLWludGVybGFjZQpkaWZmIC0tZ2l0IGEvbGlicG5nL3Rlc3RzL3BuZ3ZhbGlkLXByb2dyZXNzaXZlLXNpemUgYi9saWJwbmcvdGVzdHMvcG5ndmFsaWQtcHJvZ3Jlc3NpdmUtc2l6ZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NjhkNmRjCi0tLSAvZGV2L251bGwKKysrIGIvbGlicG5nL3Rlc3RzL3BuZ3ZhbGlkLXByb2dyZXNzaXZlLXNpemUKQEAgLTAsMCArMSwyIEBACisjIS9iaW4vc2gKK2V4ZWMgLi9wbmd2YWxpZCAtLXN0cmljdCAtLXNpemUgLS1wcm9ncmVzc2l2ZS1yZWFkCmRpZmYgLS1naXQgYS9saWJwbmcvdGVzdHMvcG5ndmFsaWQtcHJvZ3Jlc3NpdmUtc3RhbmRhcmQgYi9saWJwbmcvdGVzdHMvcG5ndmFsaWQtcHJvZ3Jlc3NpdmUtc3RhbmRhcmQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmY3ZTVjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy90ZXN0cy9wbmd2YWxpZC1wcm9ncmVzc2l2ZS1zdGFuZGFyZApAQCAtMCwwICsxLDIgQEAKKyMhL2Jpbi9zaAorZXhlYyAuL3BuZ3ZhbGlkIC0tc3RyaWN0IC0tc3RhbmRhcmQgLS1wcm9ncmVzc2l2ZS1yZWFkCmRpZmYgLS1naXQgYS9saWJwbmcvdGVzdHMvcG5ndmFsaWQtc3RhbmRhcmQgYi9saWJwbmcvdGVzdHMvcG5ndmFsaWQtc3RhbmRhcmQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTg5Yjg4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBuZy90ZXN0cy9wbmd2YWxpZC1zdGFuZGFyZApAQCAtMCwwICsxLDIgQEAKKyMhL2Jpbi9zaAorZXhlYyAuL3BuZ3ZhbGlkIC0tc3RyaWN0IC0tc3RhbmRhcmQKZGlmZiAtLWdpdCBhL2xpYnBuZy90ZXN0cy9wbmd2YWxpZC10cmFuc2Zvcm0gYi9saWJwbmcvdGVzdHMvcG5ndmFsaWQtdHJhbnNmb3JtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM3NTM2YWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwbmcvdGVzdHMvcG5ndmFsaWQtdHJhbnNmb3JtCkBAIC0wLDAgKzEsMiBAQAorIyEvYmluL3NoCitleGVjIC4vcG5ndmFsaWQgLS1zdHJpY3QgLS10cmFuc2Zvcm0K